desmume-0.9.11/0000755000000000000000000000000012467663413011753 5ustar rootrootdesmume-0.9.11/README.MAC0000755000000000000000000003571612467662066013254 0ustar rootroot DeSmuME _________________________________________ Copyright (C) 2006 yopyop Copyright (C) 2006-2015 DeSmuME team Last Updated: March 28, 2015 Contents: 1) System Requirements ..................................................... 15 2) Quick Start Guide for Using DeSmuME for OS X ............................ 36 3) Additional Documentation ............................................... 201 4) Contact Information .................................................... 231 5) License ................................................................ 333 1) System Requirements ________________________________________________________ DeSmuME is a very demanding app, especially for CPU usage. Before you begin, make sure that your Mac meets the listed system requirements. If your Mac meets only the minimum requirements, then you should expect to run most simple 2D-only games with some frameskip, but you will be unable to run complex 2D games or any 3D-heavy games. However, if your Mac meets the recommended requirements, then you should expect to run almost every game, including very complex 3D-heavy games, with minimal to no frameskip. Operating System: OS X v10.5 (Leopard) or later CPU: Can run on any PowerPC G4, G5, or Intel processor 2.1 GHz Intel Core 2 Duo (minimum) 3.0 GHz Intel Core 2 Duo or faster (recommended) RAM: 512 MB (minimum) 2 GB (recommended) 2) Quick Start Guide for Using DeSmuME for OS X _______________________________ Installing DeSmuME is as easy as copying DeSmuME.app to your Applications folder (or other folder of your choice). Double-click the app to start DeSmuME. Note that DeSmuME for OS X may have a different feature set than DeSmuME for Windows and DeSmuME for Linux. As of this writing, some features that are present in DeSmuME for Windows are not present in DeSmuME for OS X. The rest of this section will be a guide to help you quickly get started using DeSmuME for OS X. Loading a ROM and Starting the Emulator: Simply double-click the desired ROM from the Finder to play the game. By default, DeSmuME will load the ROM and start emulation. Also, there are additional ROM loading options that you can change in DeSmuME > Preferences if you need them. Using the NDS Controller: Each NDS controller button can be mapped to a button of your choice on your keyboard, gamepad, or joystick. You can view the mappings by clicking on Input in DeSmuME > Preferences. To change a mapping, click on the NDS control that you want to change, then press the button on your input device to map it. By default, the NDS controller is mapped to the following keys on your keyboard: Up - Up Arrow Down - Down Arrow Left - Left Arrow Right - Right Arrow A Button - X B Button - Z X Button - S Y Button - A L Trigger - Q R Trigger - W Start - Return Select - Tab Lid - Delete (Backspace) Microphone (Internal Noise Samples) - ` (Accent) The NDS can support a variety of SLOT-2 devices. Some devices, such as the Guitar Grip, EasyPiano, and Taito Paddle have inputs, which are mapped to your keyboard using these defaults: Guitar Grip: Green - E Red - R Yellow - T Blue - Y EasyPiano: C - C C# - F D - V D# - G E - B F - N F# - J G - M G# - K A - , (Comma) A# - L B - . (Period) High C - / (Forward Slash) Paddle: Paddle Adjust -5 - O Paddle Adjust +5 - P In addition, the following emulator functions are mapped to your keyboard by default: Execute/Pause - Forward Delete Reset - Page Down Rotate Display Left - [ (Left Bracket) Rotate Display Right - ] (Right Bracket) Set Speed to Half - - (Dash) Set Speed to Double - = (Equal) Using the NDS Touch Pad: Touch pad input is emulated using the left mouse button by default. Simply click in the touch pad area of the NDS display window to use the NDS touch pad. Using the NDS Microphone: Some games make use of the NDS microphone. DeSmuME emulates the NDS microphone by using the default input device selected in your System Preferences. You can choose Emulation > Show Microphone Settings to view the input device that DeSmuME is currently using, as well as setting its gain. DeSmuME will track the input level on the meter as the NDS reads the microphone. The meter reflects the input level as seen by the NDS. Note that some games ignore the microphone, and therefore will not register on the meter. If you need to view the input level from the host machine's perspective, you can view the host's input level in your System Preferences. Finally, you can generate audio samples in software by using one of DeSmuME's audio generators, and send those audio samples to the NDS. This is what the Microphone command in your Input Preferences does. As long as the Microphone command is engaged, the host input device will be ignored. When you disengage the Microphone command, DeSmuME will automatically return to reading the host input device. The microphone icon serves to indicate the current status of the NDS microphone, and will change color for each status: Black - The microphone is inactive. Dark Green - The microphone is active. However, the input level is too low to be meaningful, or the game is ignoring the microphone. Bright Green - The microphone is active and the game is reading a meaningful input level. Bright Red - The microphone is active and the game is reading a clipped input level. Depending on the situation, this may or may not be desirable. Use the gain slider to influence the input level if needed. Gray - The host input device is being temporarily ignored because a Microphone command is currently engaged. Rotating the NDS Display: Some games require that the NDS display be at a certain rotation in order to look correct. Rotation options can be found by choosing View > Display Rotation. You can also use the toolbar buttons Rotate Left and Rotate Right to rotate the display by 90 degrees counterclockwise or clockwise, respectively. Finally, you can assign inputs to Rotate Left and Rotate Right in your Input Preferences. Freezing and Restoring the Emulation State: Save states are a powerful feature that allows you to freeze the emulation state and restore it later. However, note that save states are only a temporary means of saving -- more permanent saves must be done using the in-game save (or ROM save). - To freeze the emulation state, choose File > Save State File. - To restore the emulation state, choose File > Open State File. You can also freeze/restore emulation states without having to manage the Open/Save dialogs. There are ten available save state "slots" that you can use to quickly freeze/restore the emulation state. - To quick freeze the emulation state, choose File > Save State Slot > Slot #. The default hotkey for this is (Shift-#). - To quick restore the emulation state, choose File > Load State Slot > Slot #. The default hotkey for this is (#). Improving Emulation Performance: There are many settings you can change in order to improve DeSmuME's emulation performance. All of the settings listed below affect performance the most. Use the settings as shown for the best possible performance. All of these settings may be found in DeSmuME > Preferences. - WARNING: Changing any Emulation setting may cause emulation glitches in certain ROMs. Do not change these settings unless you are willing to accept reduced ROM compatibility. Display: Video Output: Use Vertical Sync - Off Video Filter - None 3D Rendering: 3D Rendering Engine - SoftRasterizer Rendering Threads - Automatic Emulation: Advanced Bus Level Timing - Off (May cause glitches) Rigourous 3D Rendering Timing - On (May cause graphical glitches) 3D Rendering Engine - Dynamic Recompiler (May reduce ROM compatibility) Dynamic Recompiler Block Size - 100 (May cause glitches) Use External BIOS Images - Off (May reduce ROM compatibility) 3) Additional Documentation ___________________________________________________ The quick start guide in this Read Me is by no means a complete reference to everything that DeSmuME can do! If you need any additional information about DeSmuME, then you can reference our online Wiki pages for up-to-date information. * Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page This is the main Wiki page that contains all of our official documentation. * FAQ: http://wiki.desmume.org/index.php?title=Faq The Frequently Asked Questions (FAQ) page has a lot of useful general information about DeSmuME. Do note that some of the information may be platform specific, and may not directly apply to the OS X version of DeSmuME. * DeSmuME Manual for OS X: http://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Macintosh_port This page contains complete and detailed information about how to operate DeSmuME for OS X. * DeSmuME Build Instructions for OS X: http://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source_on_OS_X This page contains complete and detailed instructions about how to make your own build of DeSmuME for OS X directly from the source code. 4) Contact Information ________________________________________________________ Thank you for you interest in DeSmuME! If you want to tell us how useful DeSmuME is in your life, your love (or hate) of certain NDS games, your passion for NDS homebrew development, or anything else related to DeSmuME or NDS emulation, then there are various ways for you to contact us! However, keep in mind that there are a few of rules that you need to follow: - Do not ask us to provide ROMs, BIOS files, or any other copyrighted stuff. We don't want to have to deal with any legal issues that could get us in trouble, or worse, completely shut down. - When contacting us, please use the appropriate means to do it. For example, if you simply want to tell us how much you love or hate us, then use the comments on the official webpage. Another example: If you want to post on the forum, be sure to keep the topic focused on DeSmuME; questions that ask for things like us providing you the latest Pokemon cheats are not DeSmuME related, and we will instead refer you to a Pokemon cheaters forum. Finally, our developer chat channel is intended for furthering the development work of DeSmuME; questions about how to use DeSmuME should not come here, but instead go to the Support forum. In short, use the appropriate contact method. That's why the different methods exist! * Official Website: http://desmume.org Our official website has the latest news on DeSmuME releases, and also has a lot of other useful information about DeSmuME. You can comment on different posts telling us how you feel about DeSmuME. Is DeSmuME the best thing in your life? Is it making you cry? Or is it a bunch of blah? Let us know here! * Public Forum: http://forums.desmume.org If you have a question about DeSmuME, then this is the place to ask it. But before you ask it, be aware that your question may have already been answered before, so try the following things first: - Read the manual and the FAQ. A lot of questions people have are usually already answered in our documentation. - Do a forum search about your question. If you still need to ask a question, choose Help > Submit a Support Request in the DeSmuME application. Follow the onscreen instructions on the Support Request Form. * Live Developer Chat Channel: irc://irc.freenode.net/desmume We have a live developer chatline on Freenode IRC at #desmume. This channel is meant for discussing the development of DeSmuME, and shows the real work that goes on behind the scenes. If you are interested in doing any sort of software programming, software testing, documentation, or graphics work, then please join our chat channel! We would love for you to join us! * Bug Reports: If you believe that you have found a bug, you may submit a bug report by choosing Help > Submit a Bug Report in the DeSmuME application. Follow the onscreen instructions on the Bug Report Form. When you click Go To Bug Report Webpage, you will be taken to our bug tracker on SourceForge. Do note that you will need a SourceForge account in order to submit a bug report. Bug submissions are very welcome and encouraged. However, when you submit a bug to us, you MUST provide the following information, or else your bug submission may be rejected: - DeSmuME app version - Your operating system and OS version - Your Mac model identifier - The name of the running ROM when the bug was observed (or "None", if no ROM was running) - The serial code of the running ROM when the bug was observed (or "None", if no ROM was running) - A description of the exact behavior you observed - A description of the behavior you expected All of this information will be prepared for you if you use the Bug Report Form from Help > Submit a Bug Report. When you write your description, make sure that they are as detailed as possible. The better your descriptions are, the faster we can test and fix bugs. For example, if you observed a bug in the game Golden Sun: Dark Dawn, then the bug report could look something like this: App Version: v0.9.11 Operating System: OS X v10.10.2 (14C1510) Mac Model Identifier: iMac11,2 ROM Name: GOLDENSUN_DD ROM Serial: NTR-BO5E-USA Observed Behavior: I tried to load a save state using the File > Load State > Slot 3 menu option, but the game froze. If I reset, I can get the game working again. Expected Behavior: The game should continue running from the point where I made the save state. We will try to get your bug tested as soon as possible, but any fixes may take longer, depending on the complexity of the bug. Also, some bugs may require us to ask you for certain files, such as your ROM saves, save states, or console logs. For the above example, we would probably ask you for your save states to help us track down the bug. 5) License ____________________________________________________________________ This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . * See the GNU General Public License details in COPYING. desmume-0.9.11/ChangeLog0000755000000000000000000011751612467662066013546 0ustar rootroot0.9.10 -> 0.9.11 (r4908-r5146) In this version, we have focused on the Cocoa frontend, but there have been some good core fixes over so long. Notably, the save-related issues resulting in the advice "dont use 0.9.10" have been resolved. General/Core: bug: fix large numbers of games not being able to save anymore bug: fix some missing sound effects due to wrong volumes in some boot scenarios and other things bug: fix freezes due to tiny looping sounds bug: fix many big endian issues bug: fix some apparently rarely-used CPU instructions, no known consequences bug: fix (block) reading of some GPU registers bug: fix action replay code type 0xE bug: fix reading of last 4 bytes of rom bug: large improvements to stability of GDB stub bug: support w-buffer support in OpenGL renderers bug: fix unpredictable crashes in some 3d scenes from w=0 enh: better loading of roms (bad patches) with wrong size info in header enh: warn user sometimes when 'stream rom from disk' will create malfunctions enh: add xBRZ filters enh: add "TXT Hack" for software rasterizer to improve text rendering in some games Windows: bug: fix 5x filters enh: support import of action replay save files (.dss) enh: add antialiasing option for OpenGL renderers enh: don't malfunction if saveram is unavailable or read-only Cocoa: bug: 16-bit to 32-bit color space conversions no longer darken video or images bug: fix intermittent issues with loading user defaults on app startup bug: fix rendering inaccuracies of the video preview in the app display preferences bug: fix various UI font rendering and text alignment issues on OS X Yosemite bug: fix crackly sound from N-sync and Z-sync methods enh: make N-sync method the default sound sync method since it has much lower latency than P-sync method enh: add support for gdbstub (Tools > Show GDB Stub Control) (only available on custom builds using the dev+ build target) enh: optimize input handling to use less CPU enh: add support for App Nap when the app is in an idle state (only supported on OS X Mavericks and later) enh: add Execution Control panel (Emulation > Show Execution Control), now with frame advance and frame jump controls enh: auto frame skip is now smoother enh: further improve execution timing accuracy enh: improve overall video performance enh: render video through a 3-stage filtering pipeline, (Video Source)-->(Pixel Scaler)-->(Video Output) enh: add the following video source filters - Deposterize enh: add the following video output filters - Bicubic B-Spline, Bicubic Mitchell-Netravali, Lanczos2, Lanczos3 enh: add ability to run all existing pixel scalers on either the CPU or the GPU enh: add ability to toggle the main and touch display positions (View > Toggle All Displays) enh: add preliminary support for replay playback and recording enh: add support for turbo and autohold enh: add support for the entire suite of slot-2 devices (Emulation > Show SLOT-2 Manager) enh: add support for using the host machine's audio input device for emulating the NDS microphone (Emulation > Show Microphone Settings) enh: change the sine wave tone generator's range from 100Hz-5000Hz to 40Hz-4000Hz enh: reorganize the menu options to more logical locations enh: greatly improve the File Migration Assistant (now renamed Game Data Migration Assistant) and ROM Info panel with a more modern and space efficient look and feel enh: miscellaneous user interface improvements Linux: bug: fix screen gap bug bug: workaround for std::bad_alloc exceptions compiler bugs enh: add experimental AV recording enh: generally improve main loop throttling and skipping enh: massive improvements to HUD and menu layout enh: add window sizing options and sound interpolation options enh: add Lid button; disallow U+D, L+R; manual option saving 0.9.9 -> 0.9.10 (r4623-r4908) In this version, we have focused on trying to clean up some complexities in the user experience and emulator internals. Pretty unglamorous stuff, but some games are newly compatible. General/Core: enh: break savestate back-compatibility bug: improve save size autodetection for some games bug: cpu: fix many basic jit cpu bugs bug: 3d: tweak softrasterizer edge marking bug: 3d: fix stale 4x4 texture palettes bug: fix some GPU sprite blending scenarios bug: fix bios HLE BitUnPack, UnCompHuffman enh: modular slot-1 device system, emulate GC bus more faithfully enh: support NAND slot-1 device enh: auto-detect appropriate slot-1 and slot-2 device enh: many revisions to firmware boot process for more authenticity. iQue and FlashME versions function, .dfc rewritten. enh: support streaming NDS file from disk (like an ISO, to avoid long initial load time) enh: run .dsv directly on disk, to save long flushing times. should speed backup operations. enh: spu synch mode and method on commandline Windows: bug: fixes to advanscene DB import bug: save opengl display method filter option bug: general bugfixes to various screen layout modes enh: add option to stop non-integer scaling during fullscreen or maximize enh: improvements to save import dialog enh: improved memory viewer tool enh: operate better when run, against our advice, from a zipfile enh: add slot-1 Nitro Filesystem viewer tool Cocoa: bug: fix slot1-R4 path saving bug: fix bug with mic samples < 16khz bug: fix bugs and enhancements in multi display windows bug: fix handling of some joystick analog inputs enh: save display windows configuration and emulation speed on app exit 0.9.8 -> 0.9.9 (r4228-r4623) Yes, it's been a while since the last release, but we haven't been completely idle. There's a brand new jit cpu core which yields some impressive speedups! General/Core: !!!: add optional arm cpu jit (functioning on x86 and x64 hosts only) bug: we're not going to list 70% of the emulation fixes, as is traditional. bug: savestate reliability fixes related to halt states, gxstat, firmware bug: lua: fix readbyterange, gdscreenshot functions bug: commandline slot-1 handling straightened out enh: fixes and additions to resize filter options Graphics: enh: opengl 3d driver compatibility improvements bug: fix giant regression from 0.9.7 that left garbage from previous frames on the screen in some games bug: 3d: fix some single poly pixels bug: 3d: fix some polygon and texture coloring bugs on big-endian systems Windows: bug: fix some full screen stretching bugs enh: add xaudio2 output driver enh: add opengl display method (as opposed to directdraw), with controllable bilinear filter enh: upgrade archive handling system, lzma2 supported enh: reorganize main menu quite a bit enh: add rotation hotkeys, and hotkey to control mouse cursor visibility enh: memory viewer improvements and fixes enh: improve interface for rom eject to prevent accidents and improve usefulness (hide in slot-1 config screen) Cocoa: bug: fix missing display when running on OS X v10.8 Mountain Lion bug: fix possible sound crash when using Dual SPU Synch/Asynch bug: fix File menu items being disabled after the file migration sheet is used bug: fix window resizing issues bug: fix text rendering in About box enh: show the icon and name of the loaded ROM enh: add Support Request and Bug Report forms to the Help menu enh: add more detailed info to the About box enh: add OpenGL as a 3D rendering option enh: add support for MSAA when using OpenGL as the 3D rendering engine enh: add V-Sync option enh: add Display Orientation, Display Order, and Display Separation options for Combo Display mode enh: add HQ4xS filter enh: completely revamp the user interface for Input Preferences enh: many emulator commands may now be mapped enh: add ability to map an input to user-defined touch screen coordinates enh: add support for saving and applying input profiles enh: add support for using an audio file for the microphone input enh: add sine wave tone generator for microphone input enh: add support for multiple display windows (File > New Display Window) enh: add support for SLOT-1 devices (Emulation > Show SLOT-1 Manager) enh: overall performance and stability improvements enh: miscellaneous user interface improvements 0.9.7 -> 0.9.8 (r3812-r4228) Yes, it's been a while since the last release, but we haven't been completely idle. There's a brand new top shelf Cocoa frontend to make life far more pleasant for OSX users, and a host of compatibility fixes. General/Core: bug: fix more IPC FIFO errors bug: import more save files correctly bug: don't autopatch already-patched roms bug: fix bugs in piano and guitar grip bug: fix ARM7's VRAMSTAT register bug: fix memory leaks on compact flash emulation bug: fix reading of rom from low header area bug: spu: fix some poppy interpolation audio quality issues bug: improve timing of dma operations by running through normal mem cycle accounting; fixes an annoying number of games and graphical glitches bug: fix opcode MRC and fake bios CRC16 enh: jitter some related register and irq events to simulate pipeline effects and stimulate some race conditions to other outcomes enh: fake (deterministic) some tiny jitter from human's hand holding stylus; some games were accidentally depending on this enh: support nocash-style prints from arm enh: add lua apis for accessing vram enh: platforms other than windows receive threading optimizations enh: provide diagnostics when system powers off (useful for homebrewers returning from main()) enh: clarify handling of different console types within the family (ds,dslite,debug) enh: vfat support for slot-1 devices enh: emulate temperature register enh: add paddle emulation Graphics: bug: fix occasional crash from uninitialized blending table bug: fix some 2d alpha blending cases resulting in white screens bug: fix VRAM_I B_OBJ mirroring and fix sprites rendering across the end of vram bug: fix rotoscaled sprites wrapping around screen bug: dont fix rotscaled bitmap sprites with alpha==0 bug: opengl: fix degradation of toon rendering during loadstate bug: opengl: alpha blending fixes bug: many refinements to opengl renderer bug: opengl: support rear-plane/ClearImage emulation (fixes many graphics) bug: rasterizer: fix some rare alpha blending cases bug: fix bug in environment mapping introduced after 0.9.6 bug: fix totally glitched out 3d graphics with several improvements involving matrix stack bug: fix memory overflows in epx filter bug: prevent backdrop from blending with ??? enh: opengl: better depth buffering emulation enh: better support for line segment "polys" by detection and special rendering logic enh: opengl: support quad primitives directly enh: add hq4x filter Windows: bug: fix a long-standing loadstate crash bug: fix lag frame accounting bug: fix glitches in cheat entry menu bug: stop compact flash emulation from accidentally scanning c:\ sometimes enh: add support for game database for improved save type detection enh: hotkey for limit framerate toggle enh: remove stop and reset toolbar buttons which were accidentally getting used enh: additional complexification to desmume's behaviour run from a console prompt. whether it's better is uncertain. enh: add support for cheats databases enh: improvements to ram search tool enh: preliminary support for varying stylus pressure enh: add [Display] Show Console=1 to ini file enh: more graceful cheat parsing and add some hotkeys enh: add 5x window size enh: add big endian and 20.12 toggle to memview and ramwatch enh: improve FPS throttle feedback and granularity enh: add lua menu API enh: hud font switching enh: add optional file association for .nds to path config dialog Cocoa: enh: Big update to cocoa frontend. Pretty much entirely new. (rogerman) Linux: bug: gtk: glitches in rom and recent rom loading bug: glade: normalize savestate slot to hotkey mapping enh: support soundtouch for use by metaspu enh: gtk: add SPU mode selection (Tobias Jakobi) enh: cli: better fps limiting (Thomas Jones) Wx: bug: some small fixes here and there (Jan Bücken) enh: lot of code cleanup (Jan Bücken) 0.9.6 -> 0.9.7 (r3493-r3812) General/Core: bug: fix a ton of old, broken cpu opcodes and CP15 logic bug: return Z1 and Z2 from TSC (fixes some touch logic) bug: gba slot save type detection improved bug: handle unusual rom headers more correctly bug: dont confuse motion pack commands with save memory commands bug: make cheat system a little less flaky and add AR 1.54 support bug: fix nondeterministic backup memory behaviour while rerecording bug: correct emulation of register accesses of wrong size and during powerdown bug: rewrite --cflash-path emulation bug: rewrite IPC/GX FIFO, IRQ flag generation, and wait-for-IRQ logics bug: rewrite RTC calendar handling; now supports years > 2038 enh: auto-DLDI patching for homebrew enh: --gbaslot-rom=self mounts self.nds in slot2 enh: more realistic exception handling enh: piano controller emulation enh: modular slot-1 system for exact emulation of homebrew cards Graphics: bug: edge marking colors were wrong bug: handle some "invalid" vram configurations correctly bug: convert half of geometry engine to fixed point bug: fix sprite blend+fadein/fadeout bug: improve rasterizer shadows bug: fix main memory display DMA bug: fix some raster fx timing bugs enh: add a hack for improving some non-stencil shadows Windows: bug: misc fixes and improvements to gpu viewer tools bug: sub screen layer display toggling fixed bug: fixes and improvements to ram watch, ram search, cheats list bug: fix start-paused commandline bug: fix memory leaks when sound disabled bug: improve load average calculators and add arm7 load average enh: background input support enh: add vsync option enh: support more knobs on joysticks enh: import cheats from R4 database enh: add xinput rumble for 360 pads Linux/OSX: bug: crash less in recent roms list enh: Add horizontal screen layout and swap screen ability to gtk frontend (noodlebox) enh: Big improvement to joystick support, support complex configurations and multiple devices (noodlebox) 0.9.5 -> 0.9.6 (r3075-r3493) Users of gtk, cli and gtk-glade frontends please note that now we have a common directory in ~/.config/desmume for config file, saves and savestates. The old .desmume.ini will be moved automatically with the name config but you have to move your saves manually. Some save files may be invalidated due to use of broken crc logic. Back up your DSV files before using this version of the emulator or else the game might wipe it. General/Core: bug: emulate keypad interrupt bug: spu overhaul, add capture support bug: fix dma address reloading bug: fix rom close memory corruption bug: fix div and sqrt busy flag bug bug: fix vectest bug: fix lid savestate desync bug: fix texcache memory GB explosion when games use tons of tiny 3d sprites bug: fix huge rerecording movie file handle leak bug: fix EXXXXXXX cheat codes and some add/edit/save/load bugs bug: add 8MBit - 512MBit flash emulation bug: fix firmware booted-from-card flag bug: fix some failures to wake bug: fix some rtc calendar logic bug: op_bkpt emulation bug: correctly emulate POWCNT1 and POWCNT2 and SPI power device bug: corrections to bootup stack configuration bug: protect bios from being overwritten bug: initialize save data to 0xFF instead of 0x00 bug: handle relocated irq vectors bug: support patched firmwares bug: handle 8bit auxspidata, 32bit BLDY, 32bit div regs bug: fix some divide by zero cases bug: don't print \n in ideas debug message bug: don't let games read off end of cart and crash emulator bug: fix SWI 0x0E crc16 ; some save files using wrong crc may be invalidated bug: fix many big endian bugs bug: fix CPSR.I idle wakeup bug: fix loadstate crashes, mostly when sound is enabled enh: support devkitpro argv enh: add gbaslot-rom commandline enh: add no$gba debug message enh: add rtc start to dsm header Graphics: bug: fix a mistakenly rendered OBJ window and 3d blend effects bug: fixes to matrix stacks, fixing lots of garbled geometry bug: fix fog density registers bug: fix hblank dma to run also on scanline 262 bug: fix w/z depth flags for broken GUIs in dual screen 3d games bug: fixes to poly sorting bug: block 8bit vram writes enh: improve accuracy of opengl shaders Windows: bug: fix 16bpp display bug: more fixes to multi-gamepads bug: cheat windows robustification bug: fix that sticky pause state when resetting and loading roms bug: dont crash when no sound device is available bug: change F10 to be save slot 0 bug: fix --start-paused enh: try not to screensave while using gamepad enh: add EPX and EPX1.5X resize filters enh: add a japanese translation which will soon be stale like the others enh: add fancy ctrl+printscreen with emulator info on it enh: add "lockdown" window mode to keep window safe from fast stylus action enh: add alt+enter fullscreen command enh: add card eject command enh: add ddraw software mode forcer enh: improve oam viewer enh: default 3d to rasterizer so we dont have to suggest it 1000 times a day enh: add dump-all-memory tool enh: add reload rom menu/hotkey Linux/OSX: bug: fix building for nosse2 systems bug: fix --num-cores bug: fix occasional touchscreen failures bug: fix crash starting dsm record enh: add --nojoy=1 to fix laptops with accelerometers enh: add simple auto frameskip mode in the gtk frontend enh: add gui for configuring joystick in the gtk frontend enh: make the cli frontend read the ini config file too enh: additional OpenAL microphone backend (ncalexan) enh: common place for config and saves (Jan Steffens) enh: libagg is now optional if you don't need the hud 0.9.4 -> 0.9.5 (r2437-r3075) 0.9.5 introduces an entirely rewritten main emulation loop This totally changes the timing, and totally breaks old savestates. The OSX build is now based on the GTK port which is more up-to-date. Assorted Highlights: * synchronous SPU mode to fix streaming sounds * win32: lua engine, path configuration, 7z dearchiving support General/Core: bug: rewrite main emulation loop and cycle accounting, fixes a lot of timings bug: add more detailed timing emulation, removes much bogus lag bug: rewrite DMA,gxfifo,gxstat; fix many games and no more alternate flush mode bug: fix cflash directory support for non-windows and sector-writing bug: fix freeze in cart irq bug: correctly emulate dma to/from tcm bug: fix in thumb LSR carryflag bug: fix thumb BX PC switch to arm state bug: fix adpcm looping, remove adpcm caching (no longer necessary) bug: fixes to swi 3,4,5,8,0x10 bug: fixes to exmemstat and ipc sync registers bug: support new backup commands bug: improve bootup bios/firmware emulation steps enh: gbaslot: add guitar grip, gbagame flash support, expansion memory pak enh: add more powerful antigrain-based drawing library and rewrite OSD system enh: ideas-style debugging prints enh: most optimizations now SSE instead of SSE2 enh: more improvements to frameskipping and frame advance/speed controls Graphics: bug: fix backdrop blending with garbage bug: fix 256B granularity sprite addressing for sub gpu bug: fix obj blending, bmp obj rendering, and some obj window cases bug: fix 128-wide captures bug: fix 16color BG line buffer overflow bug: fix color overflow in capture blending bug: fix disp fifo capture bug: fix simultaneous vram display and capture via same bank bug: fix 3d overflow acknowledge registers bug: fix 32bit toon table writes bug: change 3d cores to use 18bit color bug: fix boxtest (addition overflow!), move clipper to main graphics engine bug: fix failure in some cases of polygon clipping bug: fix disp3dcnt emulations bug: fixes to poly sorting bug: fix ogl renderer wireframe support bug: swrast: fix backface culling of nonconvex polys bug: swrast: add clear image and scroll emulation bug: swrast: add fog emulation bug: swrast: fixes to shadow rendering bug: swrast: preliminary edge marking, works decent enh: swrast: multicore optimization for a few fps speedup Windows: bug: fix support for multiple gamepads and gamepad hotkeys bug: fix mic noise code and load wav instead of raw; effective in more cases bug: fix for several sticky and broken hotkeys, and f10 hotkeys bug: fixes in ram search, add DTCM and ITCM searching, ... bug: fix sound settings vol slider bug: recover from missing window -32000 problem bug: don't turn on mic unless mic input is enabled enh: x64 build type now supported enh: side-by-side and single screen view modes, many fixes to window resizing enh: choose any gap size by dragging bottom window edge (must be enabled) enh: choose a gap color enh: import/export no$GBA savefiles directly enh: multicore optimization for filters, rotation, OSD enh: soundview can now mute channels enh: new ioregview enh: common commandline system, many arguments shared with linux enh: improve map view tool to support more modes enh: add "FORCE AS CURRENT" recovery tool for mis-sized savefiles enh: add some kind of very small savestate rewinding buffer enh: autoframeskip works better enh: add Italian translation enh: added 2x resizing filters (hq2x, hq2xs, lq2x, lq2xs, 2xsai, supereagle) (scanlines, nearest2x, bilinear) Linux: enh: alsa microphone support enh: hud and osd notification for gtk and cli frontends enh: add support for the SSE optimizations 0.9.2 -> 0.9.4 (r1844->r2352->r2437) 0.9.3 was skipped due to emu news sites sneaking it out of our staging area and releasing it prematurely while it still had bugs. I was going to curse them individually, but then I decided that they would just like the publicity. Highlights: * New save autodetection and save file format * Full rerecording support General/Core: bug: fix many 64 bit and endian issues bug: fix mic input, which was nearly useless before bug: fix failures of large dmas bug: fix in ipc sync which broke devkitpro touch bug: screenshots now exclude hud and rotation bug: rewritten vram mapping (fixes corrupted or missing BG) enh: add universal commandline system (same commandline options on every port) enh: cheats: added Action Replay code parser enh: more reliable and useful frameskipping enh: SPU: speedup: add adpcm caching enh: SPU: speedup: interpolation is now optional enh: print svn build number so we can identify people's svn builds from screenshots Graphics: bug: add polygon y-sorting (fixes 3d guis) bug: fix texcoordgen mode 3; fixes some ortho sprites and some entirely broken games bug: display capture fixes bug: fix a number of OBJ modes bug: fixes to affine BG modes bug: better emulate some translucent OBJ bug: more correct handling of color effect windows and backdrop colors bug: fix matrix stack overrun which crashed emulator bug: swrast: add clear depth image emulation and other fixes to depth buffering bug: swrast: fix some toon and highlight cases bug: fix bug in matrix stack, fixes some broken models enh: add alternate flush mode HACK 3d config toggle, fixes some entirely broken 3d games Windows: bug: more robust cheats engine and dialog enh: more solid avi and wav recording enh: improved tools: memory viewer enh: added tools: spu viewer, ram watch, ram search enh: change build configuration system enh: speedup: add gpu core disabling to hide useless screens enh: add background pause feature (for when emulator loses focus) enh: add missing autohold for L and R enh: add chinese translation Gtk frontend: enh: switch all of menu/toolbar system to GtkAction + GtkUIManager enh: remove the gtglext 3d code enh: improve/speedup screen resize and final presentation logic in gtk frontend enh: minimal rerecording hookups Cli frontend: enh: hooked the frameskip (szigor) enh: misc usability improvements: auto pause switch for pausing when focus is lost and exit on escape pressing (szigor) enh: hook the fake noise mic; use m to toggle 0.9.1 -> 0.9.2 General/Core: bug: fix error in SBCS/RSCS flags; fixes many odd behaviors and crashes [zeromus] bug: add support for sleep mode and power registers [luigi__] bug: important fixes to RTC so correct time is actually told [luigi__] bug: fix card reads below 0x8000; fixes some game freezes [normatt] bug: fix 4 mbit save type; fix non-autodetect savefile dumping [zeromus, matusz] enh: add sram to GBA game addon emulation for importing savefiles [zeromus] enh: many improvements and feature hookups in linux ports [matusz, luigi__] Graphics: bug: fix specular texture mapping mode [luigi__] bug: repairs to some capture modes and vram mapping [zeromus, CrazyMax] bug: viewports finally correctly handled [zeromus] enh: add software rasterizer. quirky, but on par with opengl [zeromus] Windows: bug: mitigate bad frameskipper; default to old frameskipping mode [zeromus] bug: fixes with recent roms and zipfile loading [zeromus] bug: fix window position memory [zeromus] enh: bios and firmware may now be used and booted [luigi__] enh: many display, OSD, and input enhancements [luigi__] enh: brand new hotkey and controls binding system [zeromus] enh: configurable screen separation [luigi__] enh: fast forward key [pa__] enh: improvements to mic [luigi__] enh: faster updates in debug tools, up to once per frame [pa__] Mac OS X Port: enh: added Italian translation thanks to Paolo Bernini [jeff] enh: resurrection of GDB stub [sigmaris] 0.9 -> 0.9.1 General/Core: enh: GBA slot emulation [CrazyMax] - Rumble support (windows only) - GBA game enh: Mic support (windows only?) [luigi__] enh: Preliminary cheats system [CrazyMax] enh: Savestates invalidated, as more variables have been added. bug: Added PSG white noise [luigi__] bug: fix arm/thumb ROR [zeromus] bug: [ 2550645 ] Super Princess Peach: crash when starting a puzzle [zeromus] bug: win32: fix spu wav file writer (regression from 0.8) [zeromus,luigi__] bug: Much work on FIFOs, still not finished [CrazyMax] bug: Many fixes to dma [zeromus, CrazyMax] bug: bios WaitForVblank and WaitForInterrupt fixed [luigi__] Graphics: bug: Added sprite blending [luigi__] bug: more correct mosaic effects, still imperfect [zeromus] bug: Many fixes to tile rendering; all graphics tests now pass [luigi__] bug: fix crashes in some affine BG [zeromus] bug: Implement some pos test function [luigi__] bug: fix texture mapping across texture and palette banks and to unmapped banks [zeromus] bug: fix texture handling for texels with MSB set (fixes some texture corruption) [zeromus] bug: fix texture coordinate generation, including environment mapping [zeromus] bug: texture cache invalidates when palettes change, prevents some texture corruption [zeromus] bug: fix display capturing from 2d+3d source when display mode is display-vram [zeromus] bug: [ 2488334 ].1 fixes to layer compositing [luigi__] bug: [ 2488334 ].3 fix bug in support for hdma affine bg parameters [zeromus] bug: Improvements to 3d h-scrolling [luigi__] bug: Fix some errors in rendering 512 tall BG [zeromus,CrazyMax] (still not fully resolved) bug: Add optional fragment shading pipeline (more precision) [luigi__] bug: Fix bug where some sprites got cut of on x=255 [zeromus] bug: Implement GXSTAT register [CrazyMax] Windows: bug: resizing and rotating work in vista [luigi__] enh: 0 frameskip now lets emulator run at excess speed [zeromus] Mac OS X Port: bug: left key setting no longer gets confused with the right key [jeff] enh: more keys can be mapped 0.8 -> 0.9 There have been so many changes that this list can hardly be considered complete. For this release, we have formatted the list into a high level overview of big changes and bad bugs relative to the previous release. Hopefully what you're interested in. This list does not include items which are solely performance boosts, for let us just say that virtually every system has been speeded up. * The savestate system is totally changed and incompatible with old savestates. * The 3d system should be considered rewritten. General/Core: enh: Convert to c++ enh: Add functions for a lid open/close. Holding key (default "Backspace" in Windows port) while game is freeze/non freeze. [CrazyMax] enh: Add secure area decryption from ndstool [zeromus] enh: Change savestate code to support loosely bound chunks and more easily other parts of the emu (GE, GPU). The savestate format is changed, but from now on it is in principle more resilient (though it will continue to break as we tinker with the internals) [zeromus] enh: Added SSE2 optimizations for matrices. Since we now make an SSE2 build, more optimizations can be made. [CrazyMax] enh: Add a preliminary GUI hud system [CrazyMax,zeromus] CPU/MMU: bug: Many fixes in IPC and GE FIFOs. Fixes freezes in NSMB, dsracing, and others. [CrazyMax,luigi__,shash] bug: Fix ARM instructions SBC and RSC (likewise SBC in thumb) [normatt] bug: Fixed Thumb LDMIA (fixes ingame Dead'n'Furious) [shash] bug: Fix repeating DMA (fixes NSMB parallax BG) [zeromus] bug: Proper handling for unaligned CPU accesses [luigi__] bug: Proper handling for undefined instruction exceptions [Salva Peiró] bug: correctly return vram control register values (fixes homebrew 3d games) [zeromus] enh: Remove 16MB of WRAM at 0x01****** from arm9. Mapped to unused instead. Nobody knows what this was. [zeromus] enh: Changed instruction execution to 16 at a time blocks (tested and stable) [shash] Hardware: bug: Newer and better sqrt and div emulation; makes SM64DS playable [luigi__,shash,zeromus] bug: Add preliminary RTC implementations [CrazyMax] enh: Add cosine interpolation in the SPU (conditionally compiled) [zeromus,luigi__] enh: Experimental: always one silent non-mixing SPU core at 44.1khz synched with emu, for more precision. The audible core runs with the host, causing music to slow down but not tear or pitch bend. [zeromus] Graphics: - Overhaul 3d: . Move entire GE to core emu. . Move OpenGL renderer to emu core for optional use by platforms, removing ogl_collector. Now every platform shares the same 3d code. . Reorganize 3d code to defer rendering to after 3d vblank. Eliminates tearing, and texturing artifacts. [zeromus] . Add optional fragment shading pipeline (more precision) [luigi__] . Move lighting model to software instead of using opengl's fixed function model [zeromus] . Render shadow volumes; toon shading and highlight table [zeromus, luigi__] . Added texture caching! big speed up. [CrazyMax] bug: Many assorted tweaks and improvements to 3d and 2d precision [zeromus,CrazyMax,luigi__] bug: Fixes to GE: command unpacking, projection and pos-vector mode matrix handling, mult and load commands [zeromus] bug: Fix a bug in texture transformation mode 1 [zeromus] bug: Fixed GPU rendering bugs in sprites and BG [CrazyMax] bug: Fixes to texture conversion [CrazyMax,zeromus] bug: Fixes in capture display (no blinking in many games with dual 3D) [CrazyMax] bug: Fixes in master brightness (this fixes some games with black screens) [CrazyMax] bug: Fixes in screen, backdrop, and sprite blending [luigi__] bug: Changed clear depths and how depth initial values are calculated (fixes SM64DS skybox, Castlevania) [shash,lugi__] bug: Add 3d layer h-scrolling [zeromus] bug: Added transparency and fixed material alpha support and alpha testing on the 3D core [shash] bug: Rewrite VRAM mapping control and rendering (more accurate) [CrazyMax,luigi__] bug: convert colors to opengl better to prevent alpha=31 polys from being ever so slightly transparent [zeromus] enh: Add MMU->GPU signal for when vram mappings change to function as a texture cache invalidate signal [zeromus] enh: Make matrix 4x4 multiply routines use W-coordinate; carry w coord through pipeline [zeromus] Mac OS X port: bug: Fixed: Filenames and paths with unicode characters now work. [Jeff] bug: Fixed: Load state from file button works again. [Jeff] enh: Save State panel now pauses emulation while the file selection box is open. [Jeff] bug: Fixed: Frozen video output (and/or messed 3d emulation) after loading a state. [Jeff] bug: Added option to load the most recent file upon launching the program. [Jeff] enh: Added French translation (thanks to Pierre Rudloff). [Jeff] enh: Added basic key mapping configuration to application preferences (thanks to Julio GorgŽ). [Jeff] enh: Added keyboard shortcuts for Execute, Pause and Reset command (thanks to Julio GorgŽ). [Jeff] enh: Default key mappings are no longer case sensitive. [Jeff] enh: Added ability to limit speed. [Jeff] enh: Fixed: Video output should work on software-only 3D renderers. [Jeff] Windows port: bug: Fix a race condition in NDS_3D_Reset and NDS_glInit [zeromus] bug: Fix the buggy auto frameskip logic which made the emu slow to a crawl. Now it runs fast! [zeromus] bug: Fix resizing, rotate & aspect ration of main window. [CrazyMax,_zeromus] bug: Remove multithreading from user interface after finding several synchronization issues [zeromus] enh: recent roms menu [luigi_] enh: Changed graphics render core to DirectDraw (work faster) [CrazyMax] enh: Add an arm9 cpu load average calculator similar to no$. but I dont think it works right. [zeromus] enh: Rewrite all debug tools (autoupdate works now) [CrazyMax] enh: Rewrite input core & replace config input dialog [CrazyMax] enh: Add AVI output [zeromus] enh: Add pause toggle and frame advance hotkeys [adelikat] enh: Add frame counter display and hud messages framework [adelikat] enh: Main window remembers position, size, and a few other emu preferences [adelikat] enh: Removed directx sdk dependency for easier building. [zeromus] enh: Savestate doesnt unpause emu if it is already paused [adelikat] 0.7.3 -> 0.8 Cocoa: - Save State As function now works. [Jeff B] - Recent Items menu now works. [Jeff B] - Opening NDS files from Finder now works. [Jeff B] - Added screenshot feature. [Jeff B] - Added preferences. [Jeff B] - Many more strings are translatable now. [Jeff B] - Default screen color is black (better represents being "off" and easier on eyes at night). [Jeff B] - Added sound. [Jeff B] - Now is a universal binary. [Jeff B] - Leopard resolution icon added. [Jeff B] - Added a Japanese translation. [Jeff B] - Added an optional status bar (resize handle no longer overlaps screen). [Jeff B] - New ROM Info and About DeSmuME windows have been added. [Jeff B] - Fixed several bugs in window resizing. [Jeff B] - Added FAT image support for homebrew games (thanks to TypeError). [Jeff B] - Key config can be changed on the command line. Save/load hotkeys changed (so expose doesn't override). [Jeff B] - Key bindings may work better on non-US keyboards now (needs testing). [Jeff B] general: - Encapsulate GDB debug stub to avoid certain problems [shash] - Fixed CPU LD*/ST* bugs [shash] - Fixed New SMB mini-games freeze [shash] - Fixed possible segfault in ROMReader on ia64 and amd64. [evilynux] - Fixed a crash bug with 2D background corrupting memory [shash] - Flag check optimization [carlo_bramini] - Applied some endian fixes in GPU (thanks to Phazz) [Jeff B] gtk-glade: - Added DeSmuME version in about dialog. [evilynux] - Updated website url in about dialog. [evilynux] - Added Brazilian Portuguese translation by Dreampeppers99. [evilynux] - Better desktop menu entry following FreeDesktop specifications. [evilynux] gtk: - Updated website url in about dialog. [evilynux] - Better desktop menu entry following FreeDesktop specifications. [evilynux] windows port: - Added an "about" box [shash] - DirectInput control interface with joystick support [CrazyMax] - Matrix and Light viewer [Acid Burn] 0.7.2 -> 0.7.3 gtk-glade: - Full localization using intltool/gettext. [evilynux] general: - Added a README.TRANSLATION documenting the localization process. [evilynux] MacOS X: - Initial version of the Mac interface added. [Jeff B] 0.7.1 -> 0.7.2 spu: - big endian fixes. [cyberwarriorx] gpu: - big endian fixes. [marcus_c] gtk-glade: - opengl improvements. [masscat] general: - Added support for setting NDS firmware language value. [masscat] - Function added for setting firmware language. [masscat] - Mac/msys compilation fixes. [cyberwarriorx] - Fix compilation when pkg-config macros are not available [evilynux] 0.7.0 -> 0.7.1 general: - Added GDB debugger stub [masscat] - Added new/different GBAMP CFlash image reader/writer [masscat] gpu: - Major speedup to the 2D core [shash] gtk-glade: - Added command line options. [masscat] - Added FPS limiter [masscat] cli: - Added command line options. [masscat] - Added FPS limiter [masscat] - Added option to use OpenGl to render window (allows resizing). [masscat] windows port: - Added command line options. [masscat] - Added multiple language support [cyberwarriorx] - Added Danish language translation [thomas-2007] 0.6.0 -> 0.7.0 general: - Added support for *.duc files [cyberwarriorx] gpu: - Added support for sprite rotation/scaling [shash] - Added support for the 3D core (openGL and null plugins) [shash] windows port: - A bunch of fixes [Dmitry Krutskih] - Fixed a bug in sound that was causing it to still not work for some people [cyberwarriorx] gtk: - Added 3D emulation - Added command line options. - Added option to use OpenGL to render window (allows resizing). gtk-glade: - Added 3D emulation 0.5.0 -> 0.6.0 general: - Added zipped (based on zziplib) and gzipped (based on zlib) rom support. arm: - Added relocation interrupt vector. - Added region access right checks. - Enabled LDC/STC instructions. - Fixed powersave (cp15) IRQ wait. - Fixed MOV instructions gpu: - Added special color effects. - Added windowing feature. - Fixed transparent direct color backgrounds. - Fixed disabled sprites showing. - Fixed 8/32 bit access to gpu registers. - Fixed missing backgrounds - Support for master brightness wifi: - Added RF chip interface. - Added BB chip interface. windows port: - Fixed address calculation in disassembler. - Added Force Maintain Ratio option for window stretching linux port (cli, gtk and gtk-glade): all: - Added joystick support. - Fixed X and Y buttons. gtk-glade: - Added joystick configuration. - Improved I/O registers viewer tool. - Added save and load states support. 0.3.3 -> 0.5.0 arm: - Fixed MSR with immediate value opcode. - Fixed LSR_0 thumb opcode (C flag is correctly set now). - Fixed LDR*/STR* opcodes. - Fixed unaligned memory access on THUMB Core. - Added relocating SWI routines. bios: - Added decompression functions. - Added GetPitchTable function. - Added GetVolumeTable function. - Added GetCRC16 function. - Added experimental SoundBias function. - Added GetSineTable function. cart: - Added CompactFlash/FAT emulation. - Added Get ROM chip ID Cartridge command. gpu: - Added framebuffer emulation. - Fixed a bug in GPU (xfin could be greater than LG causing a segfault). - Added support for Display Mode 0(Display Off). - Added the basic framework for Display Mode 3(Display from Main RAM). spu: - Added sound emulation. - Added sound core system. - Added WAV write core. - Added dummy core. - Added Direct Sound core. linux port: - Added GTK+ GUI. - Added command line interface. - Added stylus and arm9 keypad support in CLI version. - Added FPS display. - Added basic frameskip. windows port: - Fixed a bug when displaying a ROM's information. - Added key configuration. - Removed the debug key. - Added new experimental auto frameskip/frame limit code. - Added sound settings dialog. - Added a few menu options for accessing the website, forums, and for submitting bugs. general: - Rewrote code in C. - Fixed warnings. - Used defines and typedef's to make things more portable and easier to read. - Added autotools stuff. - Changes to logging system. - Added screenshot function. - Translated most french to english. - Added savestate support. - Added firmware reading support(needs work). - Added Backup Memory support with autodetection. - Fixed some endianess issues. - Fixed things so Visual C++ can compile code. - Added bsd support. - Reworked ROM loading so you can load a different rom without any problems. - Finished NDS_Reset. Now the emulation can be reset even while running. desmume-0.9.11/compile0000755000000000000000000001624512467662066013344 0ustar rootroot#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: desmume-0.9.11/aclocal.m40000644000000000000000000020663012467662232013620 0ustar rootroot# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) # nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright Âİ 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR desmume-0.9.11/configure.ac0000755000000000000000000002660712467662066014262 0ustar rootrootdnl --- Package name is first argument to AC_INIT dnl --- Release version is second argument to AC_INIT AC_INIT(desmume, [svn]) dnl -- find host architecture for some os specific libraries AC_CANONICAL_HOST case $host in *linux*) desmume_arch=linux;; *mingw*) desmume_arch=windows;; *darwin*) desmume_arch=linux;; *bsd*) desmume_arch=linux;; esac AC_SUBST(desmume_arch) AM_INIT_AUTOMAKE([1.10 subdir-objects tar-pax]) dnl -- make sure we have a c++ compiler AC_PROG_CXX dnl -- use ranlib for libraries AC_PROG_RANLIB dnl -- check for endianess AC_C_BIGENDIAN dnl -- since svn 1.7 theres only a single .svn folder in the root dir of the checkout dnl -- depending on what was checked out that might be .svn or ../.svn REVISION=0 SVN=`which svn 2>/dev/null` if ( test -d .svn || test -d ../.svn ; ) && test "x${SVN}" != "x" -a -x "${SVN}" ; then REVISION=`$SVN info|grep 'Last Changed Rev'|cut -d' ' -f4` echo "$REVISION" fi AC_DEFINE_UNQUOTED([SVN_REV], [$REVISION], [subversion revision number]) AC_DEFINE_UNQUOTED([SVN_REV_STR], ["$REVISION"], [subversion revision number string]) dnl - Check for intltool/gettext macros IT_PROG_INTLTOOL dnl - Check for zlib AC_CHECK_LIB(z, gzopen, [], [AC_MSG_ERROR([zlib was not found, we can't go further. Please install it or specify the location where it's installed.])]) dnl - Check for zziplib AC_CHECK_LIB(zzip, zzip_open, [ LIBS="-lzzip $LIBS" AC_DEFINE([HAVE_LIBZZIP]) AC_MSG_CHECKING([[whether zzip use void * as second parameter]]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ void * v; zzip_read(NULL, v, 0);]])], AC_MSG_RESULT(yes), AC_DEFINE([ZZIP_OLD_READ]) AC_MSG_RESULT(no)) ]) dnl - Check for SDL AC_PATH_PROGS(SDLCONFIG, [sdl-config sdl11-config]) if test ! "x$SDLCONFIG" = "x" ; then SDL_CFLAGS=`$SDLCONFIG --cflags` SDL_LIBS=`$SDLCONFIG --libs` AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) else AC_MSG_ERROR([sdl is required to build desmume]) fi dnl - Check for the OpenGL includes AC_CHECK_HEADERS([GL/gl.h], [AC_CHECK_HEADERS([GL/glu.h], [have_gl_h=yes LIBS="$LIBS -lGL -lGLU"], [have_gl_h=no])], [have_gl_h=no]) if test "have_gl_h" = "no" ; then AC_MSG_WARN([Building without GL support because of missing headers.]) fi AM_CONDITIONAL([HAVE_GL], [test "${have_gl_h}" = "yes"]) dnl - if --enable-osmesa is used, check for it AC_ARG_ENABLE([osmesa], [AC_HELP_STRING([--enable-osmesa], [use off-screen mesa])], [osmesa=$enableval], [osmesa=no]) dnl - GLX is the default renderer AC_ARG_ENABLE([glx], [AC_HELP_STRING([--enable-glx], [use hw accelerated rendering])], [glx=$enableval], [glx=yes]) if test "x$osmesa" = "xyes" ; then AC_CHECK_LIB(dl, main) AC_CHECK_LIB([GL], main) AC_CHECK_LIB(OSMesa, main,[ useosmesa=yes AC_DEFINE(HAVE_LIBOSMESA) OSMESA_LIBS="-lOSMesa" AC_SUBST(OSMESA_LIBS) ]) else if test "x$glx" = "xyes" ; then AC_CHECK_LIB(dl, main) AC_CHECK_LIB([GL], main) AC_CHECK_HEADERS([GL/glx.h], [ useglx=yes AC_DEFINE(HAVE_GL_GLX) GLX_LIBS="-lX11" AC_SUBST(GLX_LIBS) ]) fi fi AM_CONDITIONAL([HAVE_LIBOSMESA], [test "${useosmesa}" = "yes"]) AM_CONDITIONAL([HAVE_GL_GLX], [test "${useglx}" = "yes"]) dnl - make the usage of libagg for HUD rendering configurable AC_ARG_ENABLE([hud], [AC_HELP_STRING([--enable-hud], [Enable HUD rendering, requires libagg])], [libagg=yes]) HAVE_OPENAL=no dnl - openal support AC_ARG_ENABLE(openal, [AC_HELP_STRING(--enable-openal, enable experimental OpenAL microphone input)], [openal=yes]) if test "x$openal" = "xyes" ; then AC_CHECK_LIB([openal], [main],[ HAVE_OPENAL=yes LIBS="$LIBS -lopenal" ]) fi AM_CONDITIONAL([HAVE_OPENAL], [test "${HAVE_OPENAL}" = "yes"]) dnl - Check for GTK and/or libglade FOUND_GLIB=no HAVE_ALSA=no GLIB_VER=2.8 GTK_VER=2.14 PKG_CHECK_MODULES(GLIB, glib-2.0 >= $GLIB_VER, FOUND_GLIB=yes, FOUND_GLIB=no) PKG_CHECK_MODULES(GTK, gtk+-2.0 >= $GTK_VER, HAVE_GTK=yes, HAVE_GTK=no) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) PKG_CHECK_MODULES(GTHREAD, "gthread-2.0", HAVE_GTHREAD=yes, HAVE_GTHREAD=no) AC_SUBST(GTHREAD_CFLAGS) AC_SUBST(GTHREAD_LIBS) AC_ARG_ENABLE([glade], [AC_HELP_STRING([--enable-glade], [enable glade frontend])], [glade=$enableval], [glade=no]) if test "x$glade" = "xyes" ; then PKG_CHECK_MODULES(LIBGLADE, "libglade-2.0", HAVE_LIBGLADE=yes, HAVE_LIBGLADE=no) AC_SUBST(LIBGLADE_CFLAGS) AC_SUBST(LIBGLADE_LIBS) dnl uninstalled glade ui dir AC_DEFINE_UNQUOTED(GLADEUI_UNINSTALLED_DIR,"`pwd`/src/gtk-glade/glade/",[path to glade ui dir]) AC_SUBST(GLADEUI_UNINSTALLED_DIR) PKG_CHECK_MODULES(GTKGLEXT, "gtkglext-1.0", AC_DEFINE([GTKGLEXT_AVAILABLE], [1]) []) AC_SUBST(GTKGLEXT_CFLAGS) AC_SUBST(GTKGLEXT_LIBS) fi AC_PATH_PROG(UPDATEDESKTOP, [update-desktop-database]) # Need check for both lua and lua5.1 to run on debian, see mysql bug #29945 PKG_CHECK_MODULES(LUA, lua >= 5.1, HAVE_LUA=yes, HAVE_LUA=no) PKG_CHECK_MODULES(LUA, lua5.1 >= 5.1, HAVE_LUA=yes, HAVE_LUA=no) AC_SUBST(LUA_CFLAGS) AC_SUBST(LUA_LIBS) dnl -- force lua disabled AM_CONDITIONAL([HAVE_LUA], [test "${HAVE_LUA}x" = "yes"]) if test ! "x$HAVE_OPENAL" = "xyes" ; then PKG_CHECK_MODULES(ALSA, alsa >= 1.0, HAVE_ALSA=yes, HAVE_ALSA=no) AC_SUBST(ALSA_CFLAGS) AC_SUBST(ALSA_LIBS) fi AM_CONDITIONAL([HAVE_ALSA], [test "${HAVE_ALSA}" = "yes"]) PKG_CHECK_MODULES(LIBAGG, libagg >= 2.5.0, FOUND_LIBAGG=yes, FOUND_LIBAGG=no) AM_CONDITIONAL([HAVE_LIBAGG], [test "x$libagg" = "xyes" -a "${FOUND_LIBAGG}" = "yes"]) if test "x$libagg" = "xyes" ; then if test "x$FOUND_LIBAGG" = "xyes" ; then AC_SUBST(LIBAGG_CFLAGS) AC_SUBST(LIBAGG_LIBS) AC_DEFINE([HAVE_LIBAGG]) else AC_MSG_ERROR([HUD rendering enabled, but libagg not found]) fi fi PKG_CHECK_MODULES(LIBSOUNDTOUCH, soundtouch >= 1.5.0, HAVE_LIBSOUNDTOUCH=yes, HAVE_LIBSOUNDTOUCH=no) AC_SUBST(LIBSOUNDTOUCH_CFLAGS) AC_SUBST(LIBSOUNDTOUCH_LIBS) AM_CONDITIONAL([HAVE_LIBSOUNDTOUCH], [test "${HAVE_LIBSOUNDTOUCH}" = "yes"]) if test "x$HAVE_LIBSOUNDTOUCH" = "xyes"; then AC_DEFINE([HAVE_LIBSOUNDTOUCH]) else AC_MSG_WARN([SoundTouch library not found, pcsx2 resampler will be disabled]) fi if test "x$HAVE_ALSA" = "xno"; then if test "x$HAVE_OPENAL" = "xno"; then AC_DEFINE([FAKE_MIC]) fi fi dnl - Determine which UIs to build and if po/ should be included PO_DIR="po" PO_MAKEFILE="po/Makefile.in" UI_DIR="cli $UI_DIR" if test "x$HAVE_GTK" = "xyes"; then UI_DIR="gtk $UI_DIR" fi if test "x$HAVE_LIBGLADE" = "xyes"; then UI_DIR="gtk-glade $UI_DIR" dnl -- localization for gtk-glade UI GETTEXT_PACKAGE=desmume AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Define to the gettext package name]) AC_SUBST(GETTEXT_PACKAGE) ALL_LINGUAS="fr nb pt_BR sv zh_CN zh_TW" AM_GLIB_GNU_GETTEXT fi dnl - jit support case $host_cpu in x86|x86_64|i386|i486|i586|i686) HAVE_JIT=yes AC_DEFINE(HAVE_JIT) ;; esac AM_CONDITIONAL([HAVE_JIT], [test "x$HAVE_JIT" = "xyes"]) dnl - wifi support AC_ARG_ENABLE(wifi, [AC_HELP_STRING(--enable-wifi, enable experimental wifi comm support)], [ AC_CHECK_LIB(pcap, main,[ AC_DEFINE(EXPERIMENTAL_WIFI_COMM) LIBS="$LIBS -lpcap"], [AC_MSG_WARN([pcap library not found, wifi will not work])]) ]) dnl Set compiler library flags per host architecture case $host in *mingw*) LIBS="$LIBS -ldxguid -ldxerr8 -ldsound -lopengl32 -lws2_32 -mwindows" UI_DIR="windows" ;; *darwin*) dnl - openal is required on mac os x and we are not able to figure out if it's installed or not AC_DEFINE(HAVE_OPENAL) LIBS="$LIBS -framework OpenGL -framework OpenAL" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers" AC_SUBST(CPPFLAGS) dnl - extra hackery needed for X includes AC_PATH_XTRA ;; esac # Detect the host platform and architecture and feed them to the compiler as # defines AS_CASE([$host], [*linux*], [AC_DEFINE(HOST_LINUX)], [*bsd*] , [AC_DEFINE(HOST_BSD)], [*mingw*], [AC_DEFINE(HOST_WINDOWS)], [*darwin*],[AC_DEFINE(HOST_DARWIN)], [AC_DEFINE(HOST_UNK)] ) AS_CASE([$host_cpu], [x86_64], [AC_DEFINE(HOST_64)], [amd64], [AC_DEFINE(HOST_64)], [AC_DEFINE(HOST_32)] ) AC_SUBST(UI_DIR) AC_SUBST(PO_DIR) dnl - Gdb stub AC_ARG_ENABLE(gdb-stub, [AC_HELP_STRING(--enable-gdb-stub, enable gdb stub)], [ AC_DEFINE(GDB_STUB) wantgdbstub=yes ]) AM_CONDITIONAL([HAVE_GDB_STUB], [test "${wantgdbstub}" = "yes"]) dnl - Compiler warnings # for developer use, enable lots of compile warnings, # but don't require this generally, because some system's # header files (BSD) can't handle it # # NB: must add -Werror after AC_PROG_CC, etc., so do this last AC_ARG_ENABLE(hardcore, [AC_HELP_STRING(--enable-hardcore, turn on -W -Wall -Werror)], [case "${enableval}" in yes) ENABLE_HARDCORE=1 ;; no) ENABLE_HARDCORE=0 ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-hardcore) ;; esac], [ENABLE_HARDCORE=0]) if test "x[$]ENABLE_HARDCORE" = "x1"; then AC_MSG_WARN(enable hardcore compile warnings) if test "x$CXX" = "x"; then dnl - only valid for C with newer gcc's CPPFLAGS="[$]CPPFLAGS -Wmissing-prototypes" fi dnl - -Wshadow CPPFLAGS="[$]CPPFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -Wno-missing-field-initializers -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-unused-parameter -Wmissing-declarations -Wundef -Wmissing-noreturn -Wredundant-decls -Wformat-nonliteral -Wformat-security -Winit-self -Wno-reorder" fi dnl - Enable debug mode AC_ARG_ENABLE(debug, AC_HELP_STRING(--enable-debug, enable debug information), AC_DEFINE(DEBUG)) AC_ARG_ENABLE(gpu-debug, AC_HELP_STRING(--enable-gpu-debug, enable gpu debug information), AC_DEFINE(GPUDEBUG)) AC_ARG_ENABLE(div-debug, AC_HELP_STRING(--enable-div-debug, enable div debug information), AC_DEFINE(DIVDEBUG)) AC_ARG_ENABLE(sqrt-debug, AC_HELP_STRING(--enable-sqrt-debug, enable sqrt debug information), AC_DEFINE(SQRTDEBUG)) AC_ARG_ENABLE(dma-debug, AC_HELP_STRING(--enable-dma-debug, enable dma debug information), AC_DEFINE(DMADEBUG)) dnl - Enable memory profiling (disabled) dnl - AC_ARG_ENABLE(memory-profiling, dnl - AC_HELP_STRING(--enable-memory-profiling, enable memory profiling information), dnl - AC_DEFINE(PROFILE_MEMORY_ACCESS)) dnl -- set maintainer mode AM_MAINTAINER_MODE AC_SUBST(USE_MAINTAINER_MODE) dnl --- Finally, output all the makefiles AC_CONFIG_FILES([Makefile ${PO_MAKEFILE} src/Makefile src/cli/Makefile src/cli/doc/Makefile src/gtk/Makefile src/gtk/doc/Makefile src/gtk-glade/Makefile src/gtk-glade/doc/Makefile src/gdbstub/Makefile autopackage/default.apspec ]) AC_OUTPUT desmume-0.9.11/config.sub0000755000000000000000000010532712467662234013746 0ustar rootroot#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-04-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: desmume-0.9.11/NEWS0000755000000000000000000000000012467662066012446 0ustar rootrootdesmume-0.9.11/INSTALL0000644000000000000000000003660012467662234013011 0ustar rootrootInstallation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. desmume-0.9.11/src/0000755000000000000000000000000012467663414012543 5ustar rootrootdesmume-0.9.11/src/ctrlssdl.h0000755000000000000000000000527212467662066014561 0ustar rootroot/* Copyright (C) 2007 Pascal Giard Copyright (C) 2007-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef CTRLSSDL_H #define CTRLSSDL_H #ifdef HAVE_GL_GL_H #include #endif #include #include #include #include #include "MMU.h" #include "types.h" #define ADD_KEY(keypad,key) ( (keypad) |= (key) ) #define RM_KEY(keypad,key) ( (keypad) &= ~(key) ) #define KEYMASK_(k) (1 << (k)) #define JOY_AXIS 0 #define JOY_HAT 1 #define JOY_BUTTON 2 #define JOY_HAT_RIGHT 0 #define JOY_HAT_LEFT 1 #define JOY_HAT_UP 2 #define JOY_HAT_DOWN 3 #define NB_KEYS 15 #define KEY_NONE 0 #define KEY_A 1 #define KEY_B 2 #define KEY_SELECT 3 #define KEY_START 4 #define KEY_RIGHT 5 #define KEY_LEFT 6 #define KEY_UP 7 #define KEY_DOWN 8 #define KEY_R 9 #define KEY_L 10 #define KEY_X 11 #define KEY_Y 12 #define KEY_DEBUG 13 #define KEY_BOOST 14 #define KEY_LID 15 /* Keypad key names */ extern const char *key_names[NB_KEYS]; /* Current keyboard configuration */ extern u16 keyboard_cfg[NB_KEYS]; /* Current joypad configuration */ extern u16 joypad_cfg[NB_KEYS]; /* Number of detected joypads */ extern u16 nbr_joy; #ifndef GTK_UI struct mouse_status { signed long x; signed long y; BOOL click; BOOL down; }; extern mouse_status mouse; #endif // !GTK_UI struct ctrls_event_config { unsigned short keypad; float nds_screen_size_ratio; int auto_pause; int focused; int sdl_quit; int boost; int fake_mic; #ifdef HAVE_GL_GL_H GLuint *screen_texture; void (*resize_cb)(u16 width, u16 height, GLuint *screen_texture); #else void *screen_texture; void (*resize_cb)(u16 width, u16 height, void *screen_texture); #endif }; void load_default_config(const u16 kbCfg[]); BOOL init_joy( void); void uninit_joy( void); u16 get_joy_key(int index); u16 get_set_joy_key(int index); void update_keypad(u16 keys); u16 get_keypad( void); u16 lookup_key (u16 keyval); u16 lookup_joy_key (u16 keyval); void process_ctrls_event( SDL_Event& event, struct ctrls_event_config *cfg); void process_joystick_events( u16 *keypad); #endif /* CTRLSSDL_H */ desmume-0.9.11/src/OGLRender.h0000755000000000000000000006005112467662066014504 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef OGLRENDER_H #define OGLRENDER_H #include #include #include #include "render3D.h" #include "types.h" #ifndef OGLRENDER_3_2_H #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include #include #include #define OGLEXT(procPtr, func) procPtr func = NULL; #define INITOGLEXT(procPtr, func) func = (procPtr)wglGetProcAddress(#func); #define EXTERNOGLEXT(procPtr, func) extern procPtr func; #elif defined(__APPLE__) #include #include // Ignore dynamic linking on Apple OS #define OGLEXT(procPtr, func) #define INITOGLEXT(procPtr, func) #define EXTERNOGLEXT(procPtr, func) // We're not exactly committing to OpenGL 3.2 Core Profile just yet, so redefine APPLE // extensions as a temporary measure. #if defined(GL_APPLE_vertex_array_object) && !defined(GL_ARB_vertex_array_object) #define glGenVertexArrays(n, ids) glGenVertexArraysAPPLE(n, ids) #define glBindVertexArray(id) glBindVertexArrayAPPLE(id) #define glDeleteVertexArrays(n, ids) glDeleteVertexArraysAPPLE(n, ids) #endif #else #include #include #include /* This is a workaround needed to compile against nvidia GL headers */ #ifndef GL_ALPHA_BLEND_EQUATION_ATI #undef GL_VERSION_1_3 #endif #define OGLEXT(procPtr, func) procPtr func = NULL; #define INITOGLEXT(procPtr, func) func = (procPtr)glXGetProcAddress((const GLubyte *) #func); #define EXTERNOGLEXT(procPtr, func) extern procPtr func; #endif // Check minimum OpenGL header version #if !defined(GL_VERSION_2_1) #if defined(GL_VERSION_2_0) #warning Using OpenGL v2.0 headers with v2.1 overrides. Some features will be disabled. #if !defined(GL_ARB_framebuffer_object) // Overrides for GL_EXT_framebuffer_blit #if !defined(GL_EXT_framebuffer_blit) #define GL_READ_FRAMEBUFFER_EXT GL_FRAMEBUFFER_EXT #define GL_DRAW_FRAMEBUFFER_EXT GL_FRAMEBUFFER_EXT #define glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter) #endif // Overrides for GL_EXT_framebuffer_multisample #if !defined(GL_EXT_framebuffer_multisample) #define GL_MAX_SAMPLES_EXT 0 #define glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height) #endif // Overrides for GL_ARB_pixel_buffer_object #if !defined(GL_PIXEL_PACK_BUFFER) && defined(GL_PIXEL_PACK_BUFFER_ARB) #define GL_PIXEL_PACK_BUFFER GL_PIXEL_PACK_BUFFER_ARB #endif #endif #else #error OpenGL requires v2.1 headers or later. #endif #endif // Textures #if !defined(GLX_H) EXTERNOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 EXTERNOGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB) #endif // Blending EXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 EXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 EXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT) EXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT) // Shaders EXTERNOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 EXTERNOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 EXTERNOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 EXTERNOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 EXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 // Generic vertex attributes EXTERNOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO EXTERNOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) EXTERNOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) EXTERNOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // VBO and PBO EXTERNOGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB) EXTERNOGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB) EXTERNOGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB) EXTERNOGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB) EXTERNOGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB) EXTERNOGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB) EXTERNOGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB) EXTERNOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 EXTERNOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO EXTERNOGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT) EXTERNOGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT) EXTERNOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT) EXTERNOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT) EXTERNOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT) EXTERNOGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT) EXTERNOGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT) // Multisampled FBO EXTERNOGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT) EXTERNOGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT) EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT) EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT) EXTERNOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT) #else // OGLRENDER_3_2_H // Basic Functions EXTERNOGLEXT(PFNGLGETSTRINGIPROC, glGetStringi) // Core in v3.0 // Textures #if !defined(GLX_H) EXTERNOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 #endif // Blending EXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 EXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 // Shaders EXTERNOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 EXTERNOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 EXTERNOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 EXTERNOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 EXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 // Generic vertex attributes EXTERNOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation) // Core in v3.0 EXTERNOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO EXTERNOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) // Core in v3.0 EXTERNOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) // Core in v3.0 EXTERNOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // Core in v3.0 // VBO and PBO EXTERNOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 EXTERNOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO EXTERNOGLEXT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) // Core in v3.0 EXTERNOGLEXT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) // Core in v3.0 EXTERNOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus) // Core in v3.0 EXTERNOGLEXT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) // Core in v3.0 EXTERNOGLEXT(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 // Multisampled FBO EXTERNOGLEXT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) // Core in v3.0 EXTERNOGLEXT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage) // Core in v3.0 EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) // Core in v3.0 EXTERNOGLEXT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers) // Core in v3.0 #endif // OGLRENDER_3_2_H // Define the minimum required OpenGL version for the driver to support #define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR 1 #define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR 2 #define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION 0 #define OGLRENDER_MAX_MULTISAMPLES 16 #define OGLRENDER_VERT_INDEX_BUFFER_COUNT 131072 enum OGLVertexAttributeID { OGLVertexAttributeID_Position = 0, OGLVertexAttributeID_TexCoord0 = 8, OGLVertexAttributeID_Color = 3, }; enum OGLTextureUnitID { // Main textures will always be on texture unit 0. OGLTextureUnitID_ToonTable = 1, OGLTextureUnitID_ClearImage }; enum OGLErrorCode { OGLERROR_NOERR = RENDER3DERROR_NOERR, OGLERROR_FEATURE_UNSUPPORTED, OGLERROR_VBO_UNSUPPORTED, OGLERROR_PBO_UNSUPPORTED, OGLERROR_SHADER_UNSUPPORTED, OGLERROR_VAO_UNSUPPORTED, OGLERROR_FBO_UNSUPPORTED, OGLERROR_MULTISAMPLED_FBO_UNSUPPORTED, OGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR, OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR, OGLERROR_SHADER_CREATE_ERROR, OGLERROR_FBO_CREATE_ERROR }; struct OGLRenderRef { // OpenGL Feature Support GLint stateTexMirroredRepeat; // VBO GLuint vboVertexID; GLuint iboIndexID; // PBO GLuint pboRenderDataID[2]; // FBO GLuint texClearImageColorID; GLuint texClearImageDepthStencilID; GLuint rboFragColorID; GLuint rboFragDepthStencilID; GLuint rboMSFragColorID; GLuint rboMSFragDepthStencilID; GLuint fboClearImageID; GLuint fboMSIntermediateRenderID; GLuint fboRenderID; GLuint selectedRenderingFBO; // Shader states GLuint vertexShaderID; GLuint fragmentShaderID; GLuint shaderProgram; GLint uniformTexScale; GLint uniformStateToonShadingMode; GLint uniformStateEnableAlphaTest; GLint uniformStateUseWDepth; GLint uniformStateAlphaTestRef; GLint uniformPolyMode; GLint uniformPolyAlpha; GLint uniformPolyID; GLint uniformPolyEnableTexture; GLuint texToonTableID; // VAO GLuint vaoMainStatesID; // Textures std::queue freeTextureIDs; // Client-side Buffers GLfloat *color4fBuffer; CACHE_ALIGN GLushort vertIndexBuffer[OGLRENDER_VERT_INDEX_BUFFER_COUNT]; }; struct GFX3D_State; struct VERTLIST; struct POLYLIST; struct INDEXLIST; struct POLY; class TexCacheItem; class OpenGLRenderer; extern GPU3DInterface gpu3Dgl; extern GPU3DInterface gpu3DglOld; extern GPU3DInterface gpu3Dgl_3_2; //This is called by OGLRender whenever it initializes. //Platforms, please be sure to set this up. //return true if you successfully init. extern bool (*oglrender_init)(); //This is called by OGLRender before it uses opengl. //return true if youre OK with using opengl extern bool (*oglrender_beginOpenGL)(); //This is called by OGLRender after it is done using opengl. extern void (*oglrender_endOpenGL)(); // These functions need to be assigned by ports that support using an // OpenGL 3.2 Core Profile context. The OGLRender_3_2.cpp file includes // the corresponding functions to assign to each function pointer. // // If any of these functions are unassigned, then one of the legacy OpenGL // renderers will be used instead. extern void (*OGLLoadEntryPoints_3_2_Func)(); extern void (*OGLCreateRenderer_3_2_Func)(OpenGLRenderer **rendererPtr); FORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix); FORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix); bool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor, unsigned int checkVersionRevision); class OpenGLRenderer : public Render3D { private: // Driver's OpenGL Version unsigned int versionMajor; unsigned int versionMinor; unsigned int versionRevision; protected: // OpenGL-specific References OGLRenderRef *ref; // OpenGL Feature Support bool isVBOSupported; bool isPBOSupported; bool isFBOSupported; bool isMultisampledFBOSupported; bool isShaderSupported; bool isVAOSupported; // Textures TexCacheItem *currTexture; CACHE_ALIGN u32 GPU_screen3D[2][GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT * sizeof(u32)]; bool gpuScreen3DHasNewData[2]; size_t doubleBufferIndex; u8 clearImageStencilValue; // OpenGL-specific methods virtual Render3DError CreateVBOs() = 0; virtual void DestroyVBOs() = 0; virtual Render3DError CreatePBOs() = 0; virtual void DestroyPBOs() = 0; virtual Render3DError CreateFBOs() = 0; virtual void DestroyFBOs() = 0; virtual Render3DError CreateMultisampledFBO() = 0; virtual void DestroyMultisampledFBO() = 0; virtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram) = 0; virtual void DestroyShaders() = 0; virtual Render3DError CreateVAOs() = 0; virtual void DestroyVAOs() = 0; virtual Render3DError InitTextures() = 0; virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet) = 0; virtual Render3DError InitTables() = 0; virtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram) = 0; virtual Render3DError SetupShaderIO() = 0; virtual Render3DError CreateToonTable() = 0; virtual Render3DError DestroyToonTable() = 0; virtual Render3DError UploadToonTable(const u16 *toonTableBuffer) = 0; virtual Render3DError UploadClearImage(const u16 *clearImageColor16Buffer, const u32 *clearImageDepthStencilBuffer) = 0; virtual void GetExtensionSet(std::set *oglExtensionSet) = 0; virtual Render3DError ExpandFreeTextures() = 0; virtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, size_t *outIndexCount) = 0; virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount) = 0; virtual Render3DError DisableVertexAttributes() = 0; virtual Render3DError SelectRenderingFramebuffer() = 0; virtual Render3DError DownsampleFBO() = 0; virtual Render3DError ReadBackPixels() = 0; // Base rendering methods virtual Render3DError BeginRender(const GFX3D_State *renderState) = 0; virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0; virtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0; virtual Render3DError PostRender() = 0; virtual Render3DError EndRender(const u64 frameCount) = 0; virtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthStencilBuffer) = 0; virtual Render3DError UpdateToonTable(const u16 *toonTableBuffer) = 0; virtual Render3DError ClearUsingImage() const = 0; virtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const = 0; virtual Render3DError SetupPolygon(const POLY *thePoly) = 0; virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing) = 0; virtual Render3DError SetupViewport(const u32 viewportValue) = 0; public: OpenGLRenderer(); virtual ~OpenGLRenderer() {}; virtual Render3DError InitExtensions() = 0; virtual Render3DError Reset() = 0; virtual Render3DError RenderFinish() = 0; virtual Render3DError DeleteTexture(const TexCacheItem *item) = 0; bool IsExtensionPresent(const std::set *oglExtensionSet, const std::string extensionName) const; bool ValidateShaderCompile(GLuint theShader) const; bool ValidateShaderProgramLink(GLuint theProgram) const; void GetVersion(unsigned int *major, unsigned int *minor, unsigned int *revision) const; void SetVersion(unsigned int major, unsigned int minor, unsigned int revision); void ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer); }; class OpenGLRenderer_1_2 : public OpenGLRenderer { protected: // OpenGL-specific methods virtual Render3DError CreateVBOs(); virtual void DestroyVBOs(); virtual Render3DError CreatePBOs(); virtual void DestroyPBOs(); virtual Render3DError CreateFBOs(); virtual void DestroyFBOs(); virtual Render3DError CreateMultisampledFBO(); virtual void DestroyMultisampledFBO(); virtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram); virtual void DestroyShaders(); virtual Render3DError CreateVAOs(); virtual void DestroyVAOs(); virtual Render3DError InitTextures(); virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet); virtual Render3DError InitTables(); virtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram); virtual Render3DError SetupShaderIO(); virtual Render3DError CreateToonTable(); virtual Render3DError DestroyToonTable(); virtual Render3DError UploadToonTable(const u16 *toonTableBuffer); virtual Render3DError UploadClearImage(const u16 *clearImageColor16Buffer, const u32 *clearImageDepthStencilBuffer); virtual void GetExtensionSet(std::set *oglExtensionSet); virtual Render3DError ExpandFreeTextures(); virtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, size_t *outIndexCount); virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount); virtual Render3DError DisableVertexAttributes(); virtual Render3DError SelectRenderingFramebuffer(); virtual Render3DError DownsampleFBO(); virtual Render3DError ReadBackPixels(); // Base rendering methods virtual Render3DError BeginRender(const GFX3D_State *renderState); virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError PostRender(); virtual Render3DError EndRender(const u64 frameCount); virtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthStencilBuffer); virtual Render3DError UpdateToonTable(const u16 *toonTableBuffer); virtual Render3DError ClearUsingImage() const; virtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const; virtual Render3DError SetupPolygon(const POLY *thePoly); virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing); virtual Render3DError SetupViewport(const u32 viewportValue); public: OpenGLRenderer_1_2(); ~OpenGLRenderer_1_2(); virtual Render3DError InitExtensions(); virtual Render3DError Reset(); virtual Render3DError RenderFinish(); virtual Render3DError DeleteTexture(const TexCacheItem *item); }; class OpenGLRenderer_1_3 : public OpenGLRenderer_1_2 { protected: virtual Render3DError UploadToonTable(const u16 *toonTableBuffer); virtual Render3DError UploadClearImage(const u16 *clearImageColor16Buffer, const u32 *clearImageDepthStencilBuffer); }; class OpenGLRenderer_1_4 : public OpenGLRenderer_1_3 { protected: virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet); }; class OpenGLRenderer_1_5 : public OpenGLRenderer_1_4 { protected: virtual Render3DError CreateVBOs(); virtual void DestroyVBOs(); virtual Render3DError CreatePBOs(); virtual void DestroyPBOs(); virtual Render3DError CreateVAOs(); virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount); virtual Render3DError DisableVertexAttributes(); virtual Render3DError ReadBackPixels(); public: ~OpenGLRenderer_1_5(); virtual Render3DError RenderFinish(); }; class OpenGLRenderer_2_0 : public OpenGLRenderer_1_5 { protected: virtual Render3DError InitExtensions(); virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet); virtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, size_t *outIndexCount); virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount); virtual Render3DError DisableVertexAttributes(); virtual Render3DError BeginRender(const GFX3D_State *renderState); virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError SetupPolygon(const POLY *thePoly); virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing); }; class OpenGLRenderer_2_1 : public OpenGLRenderer_2_0 { protected: virtual Render3DError ReadBackPixels(); public: virtual Render3DError RenderFinish(); }; #endif desmume-0.9.11/src/fs.h0000755000000000000000000000215412467662066013333 0ustar rootroot/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2007-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef FS_H #define FS_H #include "types.h" #define FS_IS_DIR 1 #define FS_ERR_UNKNOWN -1 #define FS_ERR_NO_MORE_FILES 1 extern const char FS_SEPARATOR; typedef struct { char cFileName[256]; char cAlternateFileName[14]; u32 flags; u32 fileSize; } FsEntry; void * FsReadFirst(const char * path, FsEntry * entry); int FsReadNext(void * search, FsEntry * entry); void FsClose(void * search); int FsError(void); #endif desmume-0.9.11/src/mic_openal.cpp0000755000000000000000000000674412467662066015375 0ustar rootroot/* Copyright (C) 2009-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef WIN32 #include #include #include "types.h" #include "mic.h" #include "readwrite.h" #include "emufile.h" #include "debug.h" #define MIC_BUFSIZE 512 BOOL Mic_Inited = FALSE; u8 Mic_Buffer[2][2*MIC_BUFSIZE]; u16 Mic_BufPos; u8 Mic_PlayBuf; u8 Mic_WriteBuf; int MicButtonPressed; ALCdevice *alDevice; ALCdevice *alCaptureDevice; ALCcontext *alContext; BOOL Mic_Init() { ALenum err; const char *szDefaultCaptureDevice; if (!(alDevice = alcOpenDevice(0))) { INFO("Failed to Initialize Open AL\n"); return FALSE; } if( !(alContext = alcCreateContext(alDevice, 0))) { INFO("Failed to create OpenAL context\n"); return FALSE; } if( !alcMakeContextCurrent(alContext)) { INFO("Failed to make OpenAL context current\n"); return FALSE; } alDistanceModel(AL_INVERSE_DISTANCE); szDefaultCaptureDevice = alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER); LOG("Default OpenAL Capture Device is '%s'\n\n", szDefaultCaptureDevice); alCaptureDevice = alcCaptureOpenDevice(szDefaultCaptureDevice, 16000, AL_FORMAT_STEREO8, MIC_BUFSIZE); err = alGetError(); if (err != AL_NO_ERROR) { INFO("Failed to alCaptureOpenDevice, ALenum %i\n", err); return 0; } alcCaptureStart(alCaptureDevice); Mic_Inited = TRUE; Mic_Reset(); return TRUE; } void Mic_Reset() { if (!Mic_Inited) return; memset(Mic_Buffer, 0, MIC_BUFSIZE*2*2); Mic_BufPos = 0; Mic_PlayBuf = 1; Mic_WriteBuf = 0; } void Mic_DeInit() { if (!Mic_Inited) return; Mic_Inited = FALSE; if (alDevice) { if (alCaptureDevice) { alcCaptureStop(alCaptureDevice); alcCaptureCloseDevice(alCaptureDevice); } if (alContext) { alcMakeContextCurrent(0); alcDestroyContext(alContext); } alcCloseDevice(alDevice); } } static void alReadSound() { ALenum err; int num; alcGetIntegerv(alCaptureDevice, ALC_CAPTURE_SAMPLES, 1, &num); if (num < MIC_BUFSIZE-1) { LOG("not enough microphone data waiting! (%i samples)\n", num); } else { LOG("%i samples waiting\n", num); } if (num > MIC_BUFSIZE) num = MIC_BUFSIZE; alcCaptureSamples(alCaptureDevice, Mic_Buffer[Mic_WriteBuf], num); err = alGetError(); if (err != AL_NO_ERROR) { INFO("Failed to alcCaptureSamples, ALenum %i\n", err); return; } } u8 Mic_ReadSample() { static u8 stats_max; static u8 stats_min; u8 ret; if (Mic_BufPos >= MIC_BUFSIZE) { alReadSound(); Mic_BufPos = 0; Mic_PlayBuf ^= 1; Mic_WriteBuf ^= 1; } ret = Mic_Buffer[Mic_PlayBuf][Mic_BufPos >> 1]; if (ret > stats_max) stats_max = ret; if (ret < stats_min) stats_min = ret; Mic_BufPos += 2; return ret; } void mic_savestate(EMUFILE* os) { write32le(-1,os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return TRUE; } #endif desmume-0.9.11/src/FIFO.cpp0000755000000000000000000002147412467662066014007 0ustar rootroot/* Copyright 2006 yopyop Copyright 2007 shash Copyright 2007-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "FIFO.h" #include #include "armcpu.h" #include "debug.h" #include "mem.h" #include "MMU.h" #include "registers.h" #include "NDSSystem.h" #include "gfx3d.h" // ========================================================= IPC FIFO IPC_FIFO ipc_fifo[2]; void IPC_FIFOinit(u8 proc) { memset(&ipc_fifo[proc], 0, sizeof(IPC_FIFO)); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, 0x00000101); } void IPC_FIFOsend(u8 proc, u32 val) { u16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184); if (!(cnt_l & IPCFIFOCNT_FIFOENABLE)) return; // FIFO disabled u8 proc_remote = proc ^ 1; if (ipc_fifo[proc].size > 15) { cnt_l |= IPCFIFOCNT_FIFOERROR; T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); return; } u16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc_remote][0x40], 0x184); //LOG("IPC%s send FIFO 0x%08X size %03i (l 0x%X, tail %02i) (r 0x%X, tail %02i)\n", // proc?"7":"9", val, ipc_fifo[proc].size, cnt_l, ipc_fifo[proc].tail, cnt_r, ipc_fifo[proc^1].tail); cnt_l &= 0xBFFC; // clear send empty bit & full cnt_r &= 0xBCFF; // set recv empty bit & full ipc_fifo[proc].buf[ipc_fifo[proc].tail] = val; ipc_fifo[proc].tail++; ipc_fifo[proc].size++; if (ipc_fifo[proc].tail > 15) ipc_fifo[proc].tail = 0; if (ipc_fifo[proc].size > 15) { cnt_l |= IPCFIFOCNT_SENDFULL; // set send full bit cnt_r |= IPCFIFOCNT_RECVFULL; // set recv full bit } T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r); if(cnt_r&IPCFIFOCNT_RECVIRQEN) NDS_makeIrq(proc_remote, IRQ_BIT_IPCFIFO_RECVNONEMPTY); NDS_Reschedule(); } u32 IPC_FIFOrecv(u8 proc) { u16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184); if (!(cnt_l & IPCFIFOCNT_FIFOENABLE)) return (0); // FIFO disabled u8 proc_remote = proc ^ 1; u32 val = 0; if ( ipc_fifo[proc_remote].size == 0 ) // remote FIFO error { cnt_l |= IPCFIFOCNT_FIFOERROR; T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); return (0); } u16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc_remote][0x40], 0x184); cnt_l &= 0xBCFF; // clear send full bit & empty cnt_r &= 0xBFFC; // set recv full bit & empty val = ipc_fifo[proc_remote].buf[ipc_fifo[proc_remote].head]; ipc_fifo[proc_remote].head++; ipc_fifo[proc_remote].size--; if (ipc_fifo[proc_remote].head > 15) ipc_fifo[proc_remote].head = 0; //LOG("IPC%s recv FIFO 0x%08X size %03i (l 0x%X, tail %02i) (r 0x%X, tail %02i)\n", // proc?"7":"9", val, ipc_fifo[proc].size, cnt_l, ipc_fifo[proc].tail, cnt_r, ipc_fifo[proc^1].tail); if ( ipc_fifo[proc_remote].size == 0 ) // FIFO empty { cnt_l |= IPCFIFOCNT_RECVEMPTY; cnt_r |= IPCFIFOCNT_SENDEMPTY; if(cnt_r&IPCFIFOCNT_SENDIRQEN) NDS_makeIrq(proc_remote, IRQ_BIT_IPCFIFO_SENDEMPTY); } T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r); NDS_Reschedule(); return (val); } void IPC_FIFOcnt(u8 proc, u16 val) { u16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184); u16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc^1][0x40], 0x184); if (val & IPCFIFOCNT_FIFOERROR) { //at least SPP uses this, maybe every retail game cnt_l &= ~IPCFIFOCNT_FIFOERROR; } if (val & IPCFIFOCNT_SENDCLEAR) { ipc_fifo[proc].head = 0; ipc_fifo[proc].tail = 0; ipc_fifo[proc].size = 0; cnt_l |= IPCFIFOCNT_SENDEMPTY; cnt_r |= IPCFIFOCNT_RECVEMPTY; cnt_l &= ~IPCFIFOCNT_SENDFULL; cnt_r &= ~IPCFIFOCNT_RECVFULL; } cnt_l &= ~IPCFIFOCNT_WRITEABLE; cnt_l |= val & IPCFIFOCNT_WRITEABLE; //IPCFIFOCNT_SENDIRQEN may have been set (and/or the fifo may have been cleared) so we may need to trigger this irq //(this approach is used by libnds fifo system on occasion in fifoInternalSend, and began happening frequently for value32 with r4326) if(cnt_l&IPCFIFOCNT_SENDIRQEN) if(cnt_l & IPCFIFOCNT_SENDEMPTY) NDS_makeIrq(proc, IRQ_BIT_IPCFIFO_SENDEMPTY); //IPCFIFOCNT_RECVIRQEN may have been set so we may need to trigger this irq if(cnt_l&IPCFIFOCNT_RECVIRQEN) if(!(cnt_l & IPCFIFOCNT_RECVEMPTY)) NDS_makeIrq(proc, IRQ_BIT_IPCFIFO_RECVNONEMPTY); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc^1][0x40], 0x184, cnt_r); NDS_Reschedule(); } // ========================================================= GFX FIFO GFX_PIPE gxPIPE; GFX_FIFO gxFIFO; void GFX_PIPEclear() { gxPIPE.head = 0; gxPIPE.tail = 0; gxPIPE.size = 0; gxFIFO.matrix_stack_op_size = 0; } void GFX_FIFOclear() { gxFIFO.head = 0; gxFIFO.tail = 0; gxFIFO.size = 0; gxFIFO.matrix_stack_op_size = 0; } static void GXF_FIFO_handleEvents() { bool low = gxFIFO.size <= 127; bool lowchange = MMU_new.gxstat.fifo_low ^ low; MMU_new.gxstat.fifo_low = low; if(low) triggerDma(EDMAMode_GXFifo); bool empty = gxFIFO.size == 0; bool emptychange = MMU_new.gxstat.fifo_empty ^ empty; MMU_new.gxstat.fifo_empty = empty; MMU_new.gxstat.sb = gxFIFO.matrix_stack_op_size != 0; if(emptychange||lowchange) NDS_Reschedule(); } static bool IsMatrixStackCommand(u8 cmd) { return cmd == 0x11 || cmd == 0x12; } void GFX_FIFOsend(u8 cmd, u32 param) { //INFO("gxFIFO: send 0x%02X = 0x%08X (size %03i/0x%02X) gxstat 0x%08X\n", cmd, param, gxFIFO.size, gxFIFO.size, gxstat); //printf("fifo recv: %02X: %08X upto:%d\n",cmd,param,gxFIFO.size+1); //TODO - WOAH ! NOT HANDLING A TOO-BIG FIFO RIGHT NOW! //if (gxFIFO.size > 255) //{ // GXF_FIFO_handleEvents(); // //NEED TO HANDLE THIS!!!!!!!!!!!!!!!!!!!!!!!!!! // //gxstat |= 0x08000000; // busy // NDS_RescheduleGXFIFO(1); // //INFO("ERROR: gxFIFO is full (cmd 0x%02X = 0x%08X) (prev cmd 0x%02X = 0x%08X)\n", cmd, param, gxFIFO.cmd[255], gxFIFO.param[255]); // return; //} gxFIFO.cmd[gxFIFO.tail] = cmd; gxFIFO.param[gxFIFO.tail] = param; gxFIFO.tail++; gxFIFO.size++; if (gxFIFO.tail > HACK_GXIFO_SIZE-1) gxFIFO.tail = 0; //if a matrix op is entering the pipeline, do accounting for it //(this is tested by wild west, which will jam a few ops in the fifo and then wait for the matrix stack to be //un-busy so it can read back the current matrix stack position). //it is definitely only pushes and pops which set this flag. //seems like it would be less work in the HW to make a counter than do cmps on all the command bytes, so maybe we're even doing it right. if(IsMatrixStackCommand(cmd)) gxFIFO.matrix_stack_op_size++; if(gxFIFO.size>=HACK_GXIFO_SIZE) { printf("--FIFO FULL-- : %d\n",gxFIFO.size); } //gxstat |= 0x08000000; // set busy flag GXF_FIFO_handleEvents(); NDS_RescheduleGXFIFO(1); } // this function used ONLY in gxFIFO BOOL GFX_PIPErecv(u8 *cmd, u32 *param) { //gxstat &= 0xF7FFFFFF; // clear busy flag if (gxFIFO.size == 0) { GXF_FIFO_handleEvents(); return FALSE; } *cmd = gxFIFO.cmd[gxFIFO.head]; *param = gxFIFO.param[gxFIFO.head]; //see the associated increment in another function if(IsMatrixStackCommand(*cmd)) { gxFIFO.matrix_stack_op_size--; if(gxFIFO.matrix_stack_op_size>0x10000000) printf("bad news disaster in matrix_stack_op_size\n"); } gxFIFO.head++; gxFIFO.size--; if (gxFIFO.head > HACK_GXIFO_SIZE-1) gxFIFO.head = 0; GXF_FIFO_handleEvents(); return (TRUE); } void GFX_FIFOcnt(u32 val) { ////INFO("gxFIFO: write cnt 0x%08X (prev 0x%08X) FIFO size %03i PIPE size %03i\n", val, gxstat, gxFIFO.size, gxPIPE.size); if (val & (1<<29)) // clear? (only in homebrew?) { GFX_PIPEclear(); GFX_FIFOclear(); return; } //zeromus says: what happened to clear stack? //if (val & (1<<15)) // projection stack pointer reset //{ // gfx3d_ClearStack(); // val &= 0xFFFF5FFF; // clear reset (bit15) & stack level (bit13) //} T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600, val); } // ========================================================= DISP FIFO DISP_FIFO disp_fifo; void DISP_FIFOinit() { memset(&disp_fifo, 0, sizeof(DISP_FIFO)); } void DISP_FIFOsend(u32 val) { //INFO("DISP_FIFO send value 0x%08X (head 0x%06X, tail 0x%06X)\n", val, disp_fifo.head, disp_fifo.tail); disp_fifo.buf[disp_fifo.tail] = val; disp_fifo.tail++; if (disp_fifo.tail > 0x5FFF) disp_fifo.tail = 0; } u32 DISP_FIFOrecv() { //if (disp_fifo.tail == disp_fifo.head) return (0); // FIFO is empty u32 val = disp_fifo.buf[disp_fifo.head]; disp_fifo.head++; if (disp_fifo.head > 0x5FFF) disp_fifo.head = 0; return (val); } desmume-0.9.11/src/metaspu/0000755000000000000000000000000012467663413014220 5ustar rootrootdesmume-0.9.11/src/metaspu/SndOut.cpp0000755000000000000000000002336712467662066016161 0ustar rootroot/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 * Developed and maintained by the Pcsx2 Development Team. * * Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * * SPU2-X is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * SPU2-X is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SPU2-X. If not, see . */ //#include "Global.h" #include "SndOut.h" #include #include //---------------- int SndOutLatencyMS = 160; bool timeStretchDisabled = false; //---------------- StereoOut32 StereoOut32::Empty( 0, 0 ); StereoOut32::StereoOut32( const StereoOut16& src ) : Left( src.Left ), Right( src.Right ) { } StereoOut32::StereoOut32( const StereoOutFloat& src ) : Left( (s32)(src.Left * 2147483647.0f) ), Right( (s32)(src.Right * 2147483647.0f) ) { } StereoOut16 StereoOut32::DownSample() const { return StereoOut16( Left >> SndOutVolumeShift, Right >> SndOutVolumeShift ); } StereoOut32 StereoOut16::UpSample() const { return StereoOut32( Left << SndOutVolumeShift, Right << SndOutVolumeShift ); } //class NullOutModule: public SndOutModule //{ //public: // s32 Init() { return 0; } // void Close() { } // s32 Test() const { return 0; } // void Configure(uptr parent) { } // bool Is51Out() const { return false; } // int GetEmptySampleCount() const { return 0; } // // const wchar_t* GetIdent() const // { // return L"nullout"; // } // // const wchar_t* GetLongName() const // { // return L"No Sound (Emulate SPU2 only)"; // } // // void ReadSettings() // { // } // // void WriteSettings() const // { // } // //} NullOut; // //SndOutModule* mods[]= //{ // &NullOut, //#ifdef _MSC_VER // XAudio2Out, // DSoundOut, // WaveOut, //#endif // NULL // signals the end of our list //}; // //int FindOutputModuleById( const wchar_t* omodid ) //{ // int modcnt = 0; // while( mods[modcnt] != NULL ) // { // if( wcscmp( mods[modcnt]->GetIdent(), omodid ) == 0 ) // break; // ++modcnt; // } // return modcnt; //} StereoOut32 *SndBuffer::m_buffer; s32 SndBuffer::m_size; s32 SndBuffer::m_rpos; s32 SndBuffer::m_wpos; s32 SndBuffer::m_data; bool SndBuffer::m_underrun_freeze; StereoOut32* SndBuffer::sndTempBuffer = NULL; StereoOut16* SndBuffer::sndTempBuffer16 = NULL; int SndBuffer::sndTempProgress = 0; static int GetAlignedBufferSize( int comp ) { return (comp + SndOutPacketSize-1) & ~(SndOutPacketSize-1); } // Returns TRUE if there is data to be output, or false if no data // is available to be copied. bool SndBuffer::CheckUnderrunStatus( int& nSamples, int& quietSampleCount ) { quietSampleCount = 0; if( m_underrun_freeze ) { int toFill = (int)(m_size * ( timeStretchDisabled ? 0.50f : 0.1f ) ); toFill = GetAlignedBufferSize( toFill ); // toFill is now aligned to a SndOutPacket if( m_data < toFill ) { quietSampleCount = nSamples; return false; } m_underrun_freeze = false; //TODO //if( MsgOverruns() ) printf(" * SPU2 > Underrun compensation (%d packets buffered)\n", toFill / SndOutPacketSize ); lastPct = 0.0; // normalize timestretcher } else if( m_data < nSamples ) { nSamples = m_data; quietSampleCount = SndOutPacketSize - m_data; m_underrun_freeze = true; if( !timeStretchDisabled ) timeStretchUnderrun(); return nSamples != 0; } return true; } void SndBuffer::_InitFail() { // If a failure occurs, just initialize the NoSound driver. This'll allow // the game to emulate properly (hopefully), albeit without sound. //OutputModule = FindOutputModuleById( NullOut.GetIdent() ); //mods[OutputModule]->Init(); } void SndBuffer::_WriteSamples(StereoOut32 *bData, int nSamples) { int free = m_size-m_data; m_predictData = 0; assert( m_data <= m_size ); // Problem: // If the SPU2 gets out of sync with the SndOut device, the writepos of the // circular buffer will overtake the readpos, leading to a prolonged period // of hopscotching read/write accesses (ie, lots of staticy crap sound for // several seconds). // // Compromise: // When an overrun occurs, we adapt by discarding a portion of the buffer. // The older portion of the buffer is discarded rather than incoming data, // so that the overall audio synchronization is better. if( free < nSamples ) { // Buffer overrun! // Dump samples from the read portion of the buffer instead of dropping // the newly written stuff. s32 comp; if( !timeStretchDisabled ) { comp = timeStretchOverrun(); } else { // Toss half the buffer plus whatever's being written anew: comp = GetAlignedBufferSize( (m_size + nSamples ) / 2 ); if( comp > (m_size-SndOutPacketSize) ) comp = m_size-SndOutPacketSize; } m_data -= comp; m_rpos = (m_rpos+comp) % m_size; //TODO //if( MsgOverruns() ) printf(" * SPU2 > Overrun Compensation (%d packets tossed)\n", comp / SndOutPacketSize ); lastPct = 0.0; // normalize the timestretcher } // copy in two phases, since there's a chance the packet // wraps around the buffer (it'd be nice to deal in packets only, but // the timestretcher and DSP options require flexibility). const int endPos = m_wpos + nSamples; const int secondCopyLen = endPos - m_size; StereoOut32* wposbuffer = &m_buffer[m_wpos]; m_data += nSamples; if( secondCopyLen > 0 ) { nSamples -= secondCopyLen; memcpy( m_buffer, &bData[nSamples], secondCopyLen * sizeof( *bData ) ); m_wpos = secondCopyLen; } else m_wpos += nSamples; memcpy( wposbuffer, bData, nSamples * sizeof( *bData ) ); } void SndBuffer::Init() { //if( mods[OutputModule] == NULL ) //{ // _InitFail(); // return; //} // initialize sound buffer // Buffer actually attempts to run ~50%, so allocate near double what // the requested latency is: m_rpos = 0; m_wpos = 0; m_data = 0; try { const float latencyMS = SndOutLatencyMS * (timeStretchDisabled ? 1.5f : 2.0f ); m_size = GetAlignedBufferSize( (int)(latencyMS * SampleRate / 1000.0f ) ); m_buffer = new StereoOut32[m_size]; m_underrun_freeze = false; sndTempBuffer = new StereoOut32[SndOutPacketSize]; sndTempBuffer16 = new StereoOut16[SndOutPacketSize]; } catch( std::bad_alloc& ) { // out of memory exception (most likely) printf( "Out of memory error occurred while initializing SPU2." ); _InitFail(); return; } // clear buffers! // Fixes loopy sounds on emu resets. memset( sndTempBuffer, 0, sizeof(StereoOut32) * SndOutPacketSize ); memset( sndTempBuffer16, 0, sizeof(StereoOut16) * SndOutPacketSize ); sndTempProgress = 0; soundtouchInit(); // initializes the timestretching // some crap //spdif_set51(mods[OutputModule]->Is51Out()); // initialize module //if( mods[OutputModule]->Init() == -1 ) _InitFail(); } void SndBuffer::Cleanup() { //mods[OutputModule]->Close(); soundtouchCleanup(); //safe_delete_array( m_buffer ); //safe_delete_array( sndTempBuffer ); //safe_delete_array( sndTempBuffer16 ); delete[] m_buffer; delete[] sndTempBuffer; delete[] sndTempBuffer16; } int SndBuffer::m_dsp_progress = 0; int SndBuffer::m_timestretch_progress = 0; int SndBuffer::ssFreeze = 0; void SndBuffer::ClearContents() { SndBuffer::soundtouchClearContents(); SndBuffer::ssFreeze = 30; //Delays sound output for about half a second. } void SndBuffer::Write( const StereoOut32& Sample ) { // Log final output to wavefile. //WaveDump::WriteCore( 1, CoreSrc_External, Sample.DownSample() ); //RecordWrite( Sample.DownSample() ); //if(mods[OutputModule] == &NullOut) // null output doesn't need buffering or stretching! :p // return; sndTempBuffer[sndTempProgress++] = Sample; // If we haven't accumulated a full packet yet, do nothing more: if(sndTempProgress < SndOutPacketSize) return; sndTempProgress = 0; //Don't play anything directly after loading a savestate, avoids static killing your speakers. // if ( ssFreeze > 0 ) // { // ssFreeze--; // return; // } //#ifndef __LINUX__ // else if( dspPluginEnabled ) // { // // Convert in, send to winamp DSP, and convert out. // // for( int i=0; i= SndOutPacketSize ) // { // for( int i=0; i 0 ) // { // memcpy( &sndTempBuffer16[ei], sndTempBuffer16, // sizeof(sndTempBuffer16[0]) * m_dsp_progress // ); // } // } //#endif // else { if( !timeStretchDisabled ) timeStretchWrite(); else _WriteSamples(sndTempBuffer, SndOutPacketSize); } } s32 SndBuffer::Test() { //if( mods[OutputModule] == NULL ) // return -1; //return mods[OutputModule]->Test(); return 0; } desmume-0.9.11/src/metaspu/Timestretcher.cpp0000755000000000000000000002602712467662066017563 0ustar rootroot/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 * Developed and maintained by the Pcsx2 Development Team. * * Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * * SPU2-X is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * SPU2-X is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SPU2-X. If not, see . */ //#include "Global.h" #include #include #include "types.h" #include "SndOut.h" //#include "SoundTouch/WavFile.h" #ifdef HAVE_LIBSOUNDTOUCH #include #else #include "SoundTouch/SoundTouch.h" #endif #ifdef _WINDOWS #include "win32/Dialogs.h" #endif static soundtouch::SoundTouch* pSoundTouch = NULL; static int ts_stats_stretchblocks = 0; static int ts_stats_normalblocks = 0; static int ts_stats_logcounter = 0; // data prediction amount, used to "commit" data that hasn't // finished timestretch processing. s32 SndBuffer::m_predictData; // records last buffer status (fill %, range -100 to 100, with 0 being 50% full) float SndBuffer::lastPct; float SndBuffer::lastEmergencyAdj; float SndBuffer::cTempo = 1; float SndBuffer::eTempo = 1; int SndBuffer::freezeTempo = 0; void SndBuffer::PredictDataWrite( int samples ) { m_predictData += samples; } // Calculate the buffer status percentage. // Returns range from -1.0 to 1.0 // 1.0 = buffer overflow! // 0.0 = buffer nominal (50% full) // -1.0 = buffer underflow! float SndBuffer::GetStatusPct() { // Get the buffer status of the output driver too, so that we can // obtain a more accurate overall buffer status. int drvempty = 0; //int drvempty = mods[OutputModule]->GetEmptySampleCount(); // / 2; //TODO //ConLog( "Data %d >>> driver: %d predict: %d\n", data, drvempty, predictData ); float result = (float)(m_data + m_predictData - drvempty) - (m_size/2); result /= (m_size/2); return result; } void SndBuffer::UpdateTempoChange() { if( --freezeTempo > 0 ) { return; } float statusPct = GetStatusPct(); float pctChange = statusPct - lastPct; float tempoChange; float emergencyAdj = 0; float newcee = cTempo; // workspace var. for cTempo // IMPORTANT! // If you plan to tweak these values, make sure you're using a release build // OUTSIDE THE DEBUGGER to test it! The Visual Studio debugger can really cause // erratic behavior in the audio buffers, and makes the timestretcher seem a // lot more inconsistent than it really is. // We have two factors. // * Distance from nominal buffer status (50% full) // * The change from previous update to this update. // Prediction based on the buffer change: // (linear seems to work better here) tempoChange = pctChange * 0.75f; if( statusPct * tempoChange < 0.0f ) { // only apply tempo change if it is in synch with the buffer status. // In other words, if the buffer is high (over 0%), and is decreasing, // ignore it. It'll just muck things up. tempoChange = 0; } // Sudden spikes in framerate can cause the nominal buffer status // to go critical, in which case we have to enact an emergency // stretch. The following cubic formulas do that. Values near // the extremeites give much larger results than those near 0. // And the value is added only this time, and does not accumulate. // (otherwise a large value like this would cause problems down the road) // Constants: // Weight - weights the statusPct's "emergency" consideration. // higher values here will make the buffer perform more drastic // compensations at the outer edges of the buffer (at -75 or +75% // or beyond, for example). // Range - scales the adjustment to the given range (more or less). // The actual range is dependent on the weight used, so if you increase // Weight you'll usually want to decrease Range somewhat to compensate. // Prediction based on the buffer fill status: const float statusWeight = 2.99f; const float statusRange = 0.068f; // "non-emergency" deadzone: In this area stretching will be strongly discouraged. // Note: due tot he nature of timestretch latency, it's always a wee bit harder to // cope with low fps (underruns) than it is high fps (overruns). So to help out a // little, the low-end portions of this check are less forgiving than the high-sides. if( cTempo < 0.965f || cTempo > 1.060f || pctChange < -0.38f || pctChange > 0.54f || statusPct < -0.32f || statusPct > 0.39f || eTempo < 0.89f || eTempo > 1.19f ) { emergencyAdj = ( pow( statusPct*statusWeight, 3.0f ) * statusRange); } // Smooth things out by factoring our previous adjustment into this one. // It helps make the system 'feel' a little smarter by giving it at least // one packet worth of history to help work off of: emergencyAdj = (emergencyAdj * 0.75f) + (lastEmergencyAdj * 0.25f ); lastEmergencyAdj = emergencyAdj; lastPct = statusPct; // Accumulate a fraction of the tempo change into the tempo itself. // This helps the system run "smarter" to games that run consistently // fast or slow by altering the base tempo to something closer to the // game's active speed. In tests most games normalize within 2 seconds // at 100ms latency, which is pretty good (larger buffers normalize even // quicker). newcee += newcee * (tempoChange+emergencyAdj) * 0.03f; // Apply tempoChange as a scale of cTempo. That way the effect is proportional // to the current tempo. (otherwise tempos rate of change at the extremes would // be too drastic) float newTempo = newcee + ( emergencyAdj * cTempo ); // ... and as a final optimization, only stretch if the new tempo is outside // a nominal threshold. Keep this threshold check small, because it could // cause some serious side effects otherwise. (enlarging the cTempo check above // is usually better/safer) if( newTempo < 0.970f || newTempo > 1.045f ) { cTempo = (float)newcee; if( newTempo < 0.10f ) newTempo = 0.10f; else if( newTempo > 10.0f ) newTempo = 10.0f; if( cTempo < 0.15f ) cTempo = 0.15f; else if( cTempo > 7.5f ) cTempo = 7.5f; pSoundTouch->setTempo( eTempo = (float)newTempo ); ts_stats_stretchblocks++; /*ConLog(" * SPU2: [Nominal %d%%] [Emergency: %d%%] (baseTempo: %d%% ) (newTempo: %d%%) (buffer: %d%%)\n", //(relation < 0.0) ? "Normalize" : "", (int)(tempoChange * 100.0 * 0.03), (int)(emergencyAdj * 100.0), (int)(cTempo * 100.0), (int)(newTempo * 100.0), (int)(statusPct * 100.0) );*/ } else { // Nominal operation -- turn off stretching. // note: eTempo 'slides' toward 1.0 for smoother audio and better // protection against spikes. if( cTempo != 1.0f ) { cTempo = 1.0f; eTempo = ( 1.0f + eTempo ) * 0.5f; pSoundTouch->setTempo( eTempo ); } else { if( eTempo != cTempo ) pSoundTouch->setTempo( eTempo=cTempo ); ts_stats_normalblocks++; } } } void SndBuffer::timeStretchUnderrun() { // timeStretcher failed it's job. We need to slow down the audio some. cTempo -= (cTempo * 0.12f); eTempo -= (eTempo * 0.30f); if( eTempo < 0.1f ) eTempo = 0.1f; pSoundTouch->setTempo( eTempo ); } s32 SndBuffer::timeStretchOverrun() { // If we overran it means the timestretcher failed. We need to speed // up audio playback. cTempo += cTempo * 0.12f; eTempo += eTempo * 0.40f; if( eTempo > 7.5f ) eTempo = 7.5f; pSoundTouch->setTempo( eTempo ); // Throw out just a little bit (two packets worth) to help // give the TS some room to work: return SndOutPacketSize*2; } static void CvtPacketToFloat( StereoOut32* srcdest ) { StereoOutFloat* dest = (StereoOutFloat*)srcdest; const StereoOut32* src = (StereoOut32*)srcdest; for( uint i=0; iputSamples( (float*)sndTempBuffer, SndOutPacketSize ); int tempProgress; while( tempProgress = pSoundTouch->receiveSamples( (float*)sndTempBuffer, SndOutPacketSize), tempProgress != 0 ) { // Hint: It's assumed that pSoundTouch will return chunks of 128 bytes (it always does as // long as the SSE optimizations are enabled), which means we can do our own SSE opts here. CvtPacketToInt( sndTempBuffer, tempProgress ); _WriteSamples( sndTempBuffer, tempProgress ); progress = true; } UpdateTempoChange(); //TODO //if( MsgOverruns() ) { if( progress ) { if( ++ts_stats_logcounter > 300 ) { ts_stats_logcounter = 0; printf( " * SPU2 > Timestretch Stats > %d%% of packets stretched.\n", ( ts_stats_stretchblocks * 100 ) / ( ts_stats_normalblocks + ts_stats_stretchblocks ) ); ts_stats_normalblocks = 0; ts_stats_stretchblocks = 0; } } } } void SndBuffer::soundtouchInit() { pSoundTouch = new soundtouch::SoundTouch(); pSoundTouch->setSampleRate(SampleRate); pSoundTouch->setChannels(2); pSoundTouch->setSetting( SETTING_USE_QUICKSEEK, 0 ); pSoundTouch->setSetting( SETTING_USE_AA_FILTER, 0 ); #ifdef _WINDOWS SoundtouchCfg::ApplySettings( *pSoundTouch ); #endif pSoundTouch->setTempo(1); // some timestretch management vars: cTempo = 1.0; eTempo = 1.0; lastPct = 0; lastEmergencyAdj = 0; // just freeze tempo changes for a while at startup. // the driver buffers are bogus anyway. freezeTempo = 16; m_predictData = 0; } // reset timestretch management vars, and delay updates a bit: void SndBuffer::soundtouchClearContents() { if( pSoundTouch == NULL ) return; pSoundTouch->clear(); pSoundTouch->setTempo(1); cTempo = 1.0; eTempo = 1.0; lastPct = 0; lastEmergencyAdj = 0; freezeTempo = 16; m_predictData = 0; } void SndBuffer::soundtouchCleanup() { //safe_delete( pSoundTouch ); delete pSoundTouch; } desmume-0.9.11/src/metaspu/metaspu.cpp0000755000000000000000000003424312467662066016416 0ustar rootroot/* Copyright 2009-2015 DeSmuME team This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "metaspu.h" #include #include #include //for pcsx2 method #if defined(_MSC_VER) || defined(HAVE_LIBSOUNDTOUCH) || defined(DESMUME_COCOA) || defined(DESMUME_QT) #include "SndOut.h" #endif template inline T _abs(T val) { if(val<0) return -val; else return val; } template inline T moveValueTowards(T val, T target, T incr) { incr = _abs(incr); T delta = _abs(target-val); if(valtarget) val -= incr; T newDelta = _abs(target-val); if(newDelta >= delta) val = target; return val; } class ZeromusSynchronizer : public ISynchronizingAudioBuffer { public: ZeromusSynchronizer() : mixqueue_go(false) , #ifdef NDEBUG adjustobuf(200,1000) #else adjustobuf(22000,44000) #endif { } bool mixqueue_go; virtual void enqueue_samples(s16* buf, int samples_provided) { for(int i=0;i 200) mixqueue_go = true; } else { for(int i=0;i buffer; int size; s16 curr[2]; std::queue statsHistory; void enqueue(s16 left, s16 right) { buffer.push(left); buffer.push(right); size++; } s64 rollingTotalSize; u32 kAverageSize; void addStatistic() { statsHistory.push(size); rollingTotalSize += size; if(statsHistory.size()>kAverageSize) { rollingTotalSize -= statsHistory.front(); statsHistory.pop(); float averageSize = (float)(rollingTotalSize / kAverageSize); //static int ctr=0; ctr++; if((ctr&127)==0) printf("avg size: %f curr size: %d rate: %f\n",averageSize,size,rate); { float targetRate; if(averageSize < targetLatency) { targetRate = 1.0f - (targetLatency-averageSize)/kAverageSize; } else if(averageSize > targetLatency) { targetRate = 1.0f + (averageSize-targetLatency)/kAverageSize; } else targetRate = 1.0f; //rate = moveValueTowards(rate,targetRate,0.001f); rate = targetRate; } } } void dequeue(s16& left, s16& right) { left = right = 0; addStatistic(); if(size==0) { return; } cursor += rate; while(cursor>1.0f) { cursor -= 1.0f; if(size>0) { curr[0] = buffer.front(); buffer.pop(); curr[1] = buffer.front(); buffer.pop(); size--; } } left = curr[0]; right = curr[1]; } } adjustobuf; }; class NitsujaSynchronizer : public ISynchronizingAudioBuffer { private: struct ssamp { s16 l, r; ssamp() {} ssamp(s16 ll, s16 rr) : l(ll), r(rr) {} }; std::vector sampleQueue; // returns values going between 0 and y-1 in a saw wave pattern, based on x static FORCEINLINE int pingpong(int x, int y) { x %= 2*y; if(x >= y) x = 2*y - x - 1; return x; // in case we want to switch to odd buffer sizes for more sharpness //x %= 2*(y-1); //if(x >= y) // x = 2*(y-1) - x; //return x; } static FORCEINLINE ssamp crossfade (ssamp lhs, ssamp rhs, int cur, int start, int end) { if(cur <= start) return lhs; if(cur >= end) return rhs; // in case we want sine wave interpolation instead of linear here //float ang = 3.14159f * (float)(cur - start) / (float)(end - start); //cur = start + (int)((1-cosf(ang))*0.5f * (end - start)); int inNum = cur - start; int outNum = end - cur; int denom = end - start; int lrv = ((int)lhs.l * outNum + (int)rhs.l * inNum) / denom; int rrv = ((int)lhs.r * outNum + (int)rhs.r * inNum) / denom; return ssamp(lrv,rrv); } static FORCEINLINE void emit_sample(s16*& outbuf, ssamp sample) { *outbuf++ = sample.l; *outbuf++ = sample.r; } static FORCEINLINE void emit_samples(s16*& outbuf, const ssamp* samplebuf, int samples) { for(int i=0;i 0x200 && audiosize > 0) // is there any work to do? { // are we going at normal speed? // or more precisely, are the input and output queues/buffers of similar size? if(queued > 900 || audiosize > queued * 2) { // not normal speed. we have to resample it somehow in this case. if(audiosize <= queued) { // fast forward speed // this is the easy case, just crossfade it and it sounds ok for(int i = 0; i < audiosize; i++) { int j = i + queued - audiosize; ssamp outsamp = crossfade(sampleQueue[i],sampleQueue[j], i,0,audiosize); emit_sample(buf,outsamp); } } else { // slow motion speed // here we take a very different approach, // instead of crossfading it, we select a single sample from the queue // and make sure that the index we use to select a sample is constantly moving // and that it starts at the first sample in the queue and ends on the last one. // // hopefully the index doesn't move discontinuously or we'll get slight crackling // (there might still be a minor bug here that causes this occasionally) // // here's a diagram of how the index we sample from moves: // // queued (this axis represents the index we sample from. the top means the end of the queue) // ^ // | --> audiosize (this axis represents the output index we write to, right meaning forward in output time/position) // | A C C end // A A B C C C // A A A B C C C // A A A B C C // A A C // start // // yes, this means we are spending some stretches of time playing the sound backwards, // but the stretches are short enough that this doesn't sound weird. // this lets us avoid most crackling problems due to the endpoints matching up. // first calculate a shorter-than-full window // that has minimal slope at the endpoints // (to further reduce crackling, especially in sine waves) int beststart = 0, extraAtEnd = 0; { int bestend = queued; static const int worstdiff = 99999999; int beststartdiff = worstdiff; int bestenddiff = worstdiff; for(int i = 0; i < 128; i+=2) { int diff = abs(sampleQueue[i].l - sampleQueue[i+1].l) + abs(sampleQueue[i].r - sampleQueue[i+1].r); if(diff < beststartdiff) { beststartdiff = diff; beststart = i; } } for(int i = queued-3; i > queued-3-128; i-=2) { int diff = abs(sampleQueue[i].l - sampleQueue[i+1].l) + abs(sampleQueue[i].r - sampleQueue[i+1].r); if(diff < bestenddiff) { bestenddiff = diff; bestend = i+1; } } extraAtEnd = queued - bestend; queued = bestend - beststart; int oksize = queued; while(oksize + queued*2 + beststart + extraAtEnd <= samples_requested) oksize += queued*2; audiosize = oksize; for(int x = 0; x < beststart; x++) { emit_sample(buf,sampleQueue[x]); } sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + beststart); } int midpointX = audiosize >> 1; int midpointY = queued >> 1; // all we need to do here is calculate the X position of the leftmost "B" in the above diagram. // TODO: we should calculate it with a simple equation like // midpointXOffset = min(something,somethingElse); // but it's a little difficult to work it out exactly // so here's a stupid search for the value for now: int prevA = 999999; int midpointXOffset = queued/2; while(true) { int a = abs(pingpong(midpointX - midpointXOffset, queued) - midpointY) - midpointXOffset; if(((a > 0) != (prevA > 0) || (a < 0) != (prevA < 0)) && prevA != 999999) { if((a + prevA)&1) // there's some sort of off-by-one problem with this search since we're moving diagonally... midpointXOffset++; // but this fixes it most of the time... break; // found it } prevA = a; midpointXOffset--; if(midpointXOffset < 0) { midpointXOffset = 0; break; // failed to find it. the two sides probably meet exactly in the center. } } int leftMidpointX = midpointX - midpointXOffset; int rightMidpointX = midpointX + midpointXOffset; int leftMidpointY = pingpong(leftMidpointX, queued); int rightMidpointY = (queued-1) - pingpong((int)audiosize-1 - rightMidpointX + queued*2, queued); // output the left almost-half of the sound (section "A") for(int x = 0; x < leftMidpointX; x++) { int i = pingpong(x, queued); emit_sample(buf,sampleQueue[i]); } // output the middle stretch (section "B") int y = leftMidpointY; int dyMidLeft = (leftMidpointY < midpointY) ? 1 : -1; int dyMidRight = (rightMidpointY > midpointY) ? 1 : -1; for(int x = leftMidpointX; x < midpointX; x++, y+=dyMidLeft) emit_sample(buf,sampleQueue[y]); for(int x = midpointX; x < rightMidpointX; x++, y+=dyMidRight) emit_sample(buf,sampleQueue[y]); // output the end of the queued sound (section "C") for(int x = rightMidpointX; x < audiosize; x++) { int i = (queued-1) - pingpong((int)audiosize-1 - x + queued*2, queued); emit_sample(buf,sampleQueue[i]); } for(int x = 0; x < extraAtEnd; x++) { int i = queued + x; emit_sample(buf,sampleQueue[i]); } queued += extraAtEnd; audiosize += beststart + extraAtEnd; } //end else sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + queued); return audiosize; } else { // normal speed // just output the samples straightforwardly. // // at almost-full speeds (like 50/60 FPS) // what will happen is that we rapidly fluctuate between entering this branch // and entering the "slow motion speed" branch above. // but that's ok! because all of these branches sound similar enough that we can get away with it. // so the two cases actually complement each other. if(audiosize >= queued) { emit_samples(buf,&sampleQueue[0],queued); sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + queued); return queued; } else { emit_samples(buf,&sampleQueue[0],audiosize); sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin()+audiosize); return audiosize; } } //end normal speed } //end if there is any work to do else { return 0; } } //output_samples private: }; //NitsujaSynchronizer #if defined(_MSC_VER) || defined(HAVE_LIBSOUNDTOUCH) || defined(DESMUME_COCOA) || defined(DESMUME_QT) class PCSX2Synchronizer : public ISynchronizingAudioBuffer { public: std::queue readySamples; PCSX2Synchronizer() { SndBuffer::Init(); } virtual void enqueue_samples(s16* buf, int samples_provided) { for(int i=0;i. */ //------------------------- //this file contains the METASPU system //which is designed to handle the task of audio synchronization //and is designed to be as portable between multiple emulators //------------------------- #ifndef _METASPU_H_ #define _METASPU_H_ #include #include "types.h" template< typename T > static FORCEINLINE void Clampify( T& src, T min, T max ) { src = std::min( std::max( src, min ), max ); } template< typename T > static FORCEINLINE T GetClamped( T src, T min, T max ) { return std::min( std::max( src, min ), max ); } class ISynchronizingAudioBuffer { public: virtual void enqueue_samples(s16* buf, int samples_provided) = 0; //returns the number of samples actually supplied, which may not match the number requested virtual int output_samples(s16* buf, int samples_requested) = 0; }; enum ESynchMode { ESynchMode_DualSynchAsynch, ESynchMode_Synchronous }; enum ESynchMethod { ESynchMethod_N, //nitsuja's ESynchMethod_Z, //zero's ESynchMethod_P, //PCSX2 spu2-x }; ISynchronizingAudioBuffer* metaspu_construct(ESynchMethod method); #endif desmume-0.9.11/src/metaspu/SndOut.h0000755000000000000000000003505312467662066015621 0ustar rootroot/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 * Developed and maintained by the Pcsx2 Development Team. * * Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * * SPU2-X is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * SPU2-X is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SPU2-X. If not, see . */ #pragma once #include #include "types.h" struct StereoOut16; struct StereoOut32; struct StereoOutFloat; struct StereoOut32 { static StereoOut32 Empty; s32 Left; s32 Right; StereoOut32() : Left( 0 ), Right( 0 ) { } StereoOut32( s32 left, s32 right ) : Left( left ), Right( right ) { } StereoOut32( const StereoOut16& src ); explicit StereoOut32( const StereoOutFloat& src ); StereoOut16 DownSample() const; StereoOut32 operator+( const StereoOut32& right ) const { return StereoOut32( Left + right.Left, Right + right.Right ); } StereoOut32 operator/( int src ) const { return StereoOut32( Left / src, Right / src ); } }; // Number of stereo samples per SndOut block. // All drivers must work in units of this size when communicating with // SndOut. static const int SndOutPacketSize = 512; // Overall master volume shift. // Converts the mixer's 32 bit value into a 16 bit value. //static const int SndOutVolumeShift = 13; //edit - zeromus 23-oct-2009 //this is hardcoded differently for metaspu static const int SndOutVolumeShift = 0; // Samplerate of the SPU2. For accurate playback we need to match this // exactly. Trying to scale samplerates and maintain SPU2's Ts timing accuracy // is too problematic. :) //this is hardcoded differently for metaspu //edit - zeromus 23-oct-2009 ////static const int SampleRate = 48000; //static const int SampleRate = 44100; //edit - nitsuja: make it use the global sample rate define #include "../SPU.h" static const int SampleRate = DESMUME_SAMPLE_RATE; extern int FindOutputModuleById( const wchar_t* omodid ); struct StereoOut16 { s16 Left; s16 Right; StereoOut16() : Left( 0 ), Right( 0 ) { } StereoOut16( const StereoOut32& src ) : Left( (s16)src.Left ), Right( (s16)src.Right ) { } StereoOut16( s16 left, s16 right ) : Left( left ), Right( right ) { } StereoOut32 UpSample() const; void ResampleFrom( const StereoOut32& src ) { // Use StereoOut32's built in conversion *this = src.DownSample(); } }; struct StereoOutFloat { float Left; float Right; StereoOutFloat() : Left( 0 ), Right( 0 ) { } explicit StereoOutFloat( const StereoOut32& src ) : Left( src.Left / 2147483647.0f ), Right( src.Right / 2147483647.0f ) { } explicit StereoOutFloat( s32 left, s32 right ) : Left( left / 2147483647.0f ), Right( right / 2147483647.0f ) { } StereoOutFloat( float left, float right ) : Left( left ), Right( right ) { } }; //struct Stereo21Out16 //{ // s16 Left; // s16 Right; // s16 LFE; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // } //}; // //struct StereoQuadOut16 //{ // s16 Left; // s16 Right; // s16 LeftBack; // s16 RightBack; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // } //}; // //struct Stereo41Out16 //{ // s16 Left; // s16 Right; // s16 LFE; // s16 LeftBack; // s16 RightBack; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // } //}; // //struct Stereo51Out16 //{ // s16 Left; // s16 Right; // s16 Center; // s16 LFE; // s16 LeftBack; // s16 RightBack; // // // Implementation Note: Center and Subwoofer/LFE --> // // This method is simple and sounds nice. It relies on the speaker/soundcard // // systems do to their own low pass / crossover. Manual lowpass is wasted effort // // and can't match solid state results anyway. // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // LFE = Center; // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // } //}; // //struct Stereo51Out16DplII //{ // s16 Left; // s16 Right; // s16 Center; // s16 LFE; // s16 LeftBack; // s16 RightBack; // // void ResampleFrom( const StereoOut32& src ) // { // static const u8 sLogTable[256] = { // 0x00,0x3C,0x60,0x78,0x8C,0x9C,0xA8,0xB4,0xBE,0xC8,0xD0,0xD8,0xDE,0xE4,0xEA,0xF0, // 0xF6,0xFA,0xFE,0x04,0x08,0x0C,0x10,0x14,0x16,0x1A,0x1E,0x20,0x24,0x26,0x2A,0x2C, // 0x2E,0x32,0x34,0x36,0x38,0x3A,0x3E,0x40,0x42,0x44,0x46,0x48,0x4A,0x4C,0x4E,0x50, // 0x50,0x52,0x54,0x56,0x58,0x5A,0x5A,0x5C,0x5E,0x60,0x60,0x62,0x64,0x66,0x66,0x68, // 0x6A,0x6A,0x6C,0x6E,0x6E,0x70,0x70,0x72,0x74,0x74,0x76,0x76,0x78,0x7A,0x7A,0x7C, // 0x7C,0x7E,0x7E,0x80,0x80,0x82,0x82,0x84,0x84,0x86,0x86,0x88,0x88,0x8A,0x8A,0x8C, // 0x8C,0x8C,0x8E,0x8E,0x90,0x90,0x92,0x92,0x92,0x94,0x94,0x96,0x96,0x96,0x98,0x98, // 0x9A,0x9A,0x9A,0x9C,0x9C,0x9C,0x9E,0x9E,0xA0,0xA0,0xA0,0xA2,0xA2,0xA2,0xA4,0xA4, // 0xA4,0xA6,0xA6,0xA6,0xA8,0xA8,0xA8,0xAA,0xAA,0xAA,0xAC,0xAC,0xAC,0xAC,0xAE,0xAE, // 0xAE,0xB0,0xB0,0xB0,0xB2,0xB2,0xB2,0xB2,0xB4,0xB4,0xB4,0xB6,0xB6,0xB6,0xB6,0xB8, // 0xB8,0xB8,0xB8,0xBA,0xBA,0xBA,0xBC,0xBC,0xBC,0xBC,0xBE,0xBE,0xBE,0xBE,0xC0,0xC0, // 0xC0,0xC0,0xC2,0xC2,0xC2,0xC2,0xC2,0xC4,0xC4,0xC4,0xC4,0xC6,0xC6,0xC6,0xC6,0xC8, // 0xC8,0xC8,0xC8,0xC8,0xCA,0xCA,0xCA,0xCA,0xCC,0xCC,0xCC,0xCC,0xCC,0xCE,0xCE,0xCE, // 0xCE,0xCE,0xD0,0xD0,0xD0,0xD0,0xD0,0xD2,0xD2,0xD2,0xD2,0xD2,0xD4,0xD4,0xD4,0xD4, // 0xD4,0xD6,0xD6,0xD6,0xD6,0xD6,0xD8,0xD8,0xD8,0xD8,0xD8,0xD8,0xDA,0xDA,0xDA,0xDA, // 0xDA,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xE0,0xE0,0xE0, // }; // // static s32 Gfl=0,Gfr=0; // static s32 LMax=0,RMax=0; // // static s32 LAccum; // static s32 RAccum; // static s32 ANum; // // s32 ValL = src.Left >> (SndOutVolumeShift-8); // s32 ValR = src.Right >> (SndOutVolumeShift-8); // // s32 XL = abs(ValL>>8); // s32 XR = abs(ValR>>8); // // if(XL>LMax) LMax = XL; // if(XR>RMax) RMax = XR; // // ANum++; // if(ANum>=128) // { // ANum=0; // LAccum = 1+((LAccum * 224 + LMax * 31)>>8); // RAccum = 1+((RAccum * 224 + RMax * 31)>>8); // // LMax = 0; // RMax = 0; // // s32 Tfl=(RAccum)*255/(LAccum); // s32 Tfr=(LAccum)*255/(RAccum); // // int gMax = std::max(Tfl,Tfr); // Tfl = Tfl*255/gMax; // Tfr = Tfr*255/gMax; // // if(Tfl>255) Tfl=255; // if(Tfr>255) Tfr=255; // if(Tfl<1) Tfl=1; // if(Tfr<1) Tfr=1; // // Gfl = (Gfl * 200 + Tfl * 56)>>8; // Gfr = (Gfr * 200 + Tfr * 56)>>8; // // } // // s32 L,R,C,SUB,SL,SR; // // C=(ValL+ValR)>>1; //16.8 // // ValL-=C;//16.8 // ValR-=C;//16.8 // // L=ValL>>8; //16.0 // R=ValR>>8; //16.0 // C=C>>8; //16.0 // SUB = C; // // { // s32 Cfl = 1+sLogTable[Gfl]; // s32 Cfr = 1+sLogTable[Gfr]; // // s32 VL=(ValL>>4) * Cfl; //16.12 // s32 VR=(ValR>>4) * Cfr; // // //s32 SC = (VL-VR)>>15; // // SL = (((VR/148 - VL/209)>>4)*Cfr)>>8; // SR = (((VR/209 - VL/148)>>4)*Cfl)>>8; // // } // // // Random-ish values to get it to compile // int GainL = 200; // int GainR = 200; // int GainC = 180; // int GainSL = 230; // int GainSR = 230; // int GainLFE = 200; // int AddCLR = 55; // // int AddCX = (C * AddCLR)>>8; // // Left = (((L * GainL ))>>8) + AddCX; // Right = (((R * GainR ))>>8) + AddCX; // Center = (((C * GainC ))>>8); // LFE = (((SUB * GainLFE))>>8); // LeftBack = (((SL * GainSL ))>>8); // RightBack = (((SR * GainSR ))>>8); // } //}; // //struct Stereo71Out16 //{ // s16 Left; // s16 Right; // s16 Center; // s16 LFE; // s16 LeftBack; // s16 RightBack; // s16 LeftSide; // s16 RightSide; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // LFE = Center; // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // // LeftSide = src.Left >> (SndOutVolumeShift+1); // RightSide = src.Right >> (SndOutVolumeShift+1); // } //}; // //struct Stereo21Out32 //{ // s32 Left; // s32 Right; // s32 LFE; //}; // //struct Stereo41Out32 //{ // s32 Left; // s32 Right; // s32 LFE; // s32 LeftBack; // s32 RightBack; //}; // //struct Stereo51Out32 //{ // s32 Left; // s32 Right; // s32 Center; // s32 LFE; // s32 LeftBack; // s32 RightBack; //}; // Developer Note: This is a static class only (all static members). class SndBuffer { private: static bool m_underrun_freeze; static s32 m_predictData; static float lastPct; static StereoOut32* sndTempBuffer; static StereoOut16* sndTempBuffer16; static int sndTempProgress; static int m_dsp_progress; static int m_timestretch_progress; static int m_timestretch_writepos; static StereoOut32 *m_buffer; static s32 m_size; static s32 m_rpos; static s32 m_wpos; static s32 m_data; static float lastEmergencyAdj; static float cTempo; static float eTempo; static int freezeTempo; static int ssFreeze; static void _InitFail(); static void _WriteSamples(StereoOut32* bData, int nSamples); static bool CheckUnderrunStatus( int& nSamples, int& quietSampleCount ); static void soundtouchInit(); static void soundtouchClearContents(); static void soundtouchCleanup(); static void timeStretchWrite(); static void timeStretchUnderrun(); static s32 timeStretchOverrun(); static void PredictDataWrite( int samples ); static float GetStatusPct(); static void UpdateTempoChange(); public: static void Init(); static void Cleanup(); static void Write( const StereoOut32& Sample ); static s32 Test(); static void ClearContents(); // Note: When using with 32 bit output buffers, the user of this function is responsible // for shifting the values to where they need to be manually. The fixed point depth of // the sample output is determined by the SndOutVolumeShift, which is the number of bits // to shift right to get a 16 bit result. template< typename T > static void ReadSamples( T* bData ) { int nSamples = SndOutPacketSize; // Problem: // If the SPU2 gets even the least bit out of sync with the SndOut device, // the readpos of the circular buffer will overtake the writepos, // leading to a prolonged period of hopscotching read/write accesses (ie, // lots of staticy crap sound for several seconds). // // Fix: // If the read position overtakes the write position, abort the // transfer immediately and force the SndOut driver to wait until // the read buffer has filled up again before proceeding. // This will cause one brief hiccup that can never exceed the user's // set buffer length in duration. int quietSamples; if( CheckUnderrunStatus( nSamples, quietSamples ) ) { assert( nSamples <= SndOutPacketSize ); // [Air] [TODO]: This loop is probably a candidate for SSE2 optimization. const int endPos = m_rpos + nSamples; const int secondCopyLen = endPos - m_size; const StereoOut32* rposbuffer = &m_buffer[m_rpos]; m_data -= nSamples; if( secondCopyLen > 0 ) { nSamples -= secondCopyLen; for( int i=0; i. */ #include #include "types.h" #if defined(HOST_WINDOWS) #define WIN32_LEAN_AND_MEAN #include #include #define mkdir _mkdir #ifndef DESMUME_QT #include "windows/winutil.h" #include "windows/resource.h" #endif #elif !defined(DESMUME_COCOA) #include #endif /* HOST_WINDOWS */ #include "time.h" #include "utils/xstring.h" #ifdef HOST_WINDOWS #define FILE_EXT_DELIMITER_CHAR '.' #define DIRECTORY_DELIMITER_CHAR '\\' #define ALL_DIRECTORY_DELIMITER_STRING "/\\" #else #define FILE_EXT_DELIMITER_CHAR '.' #define DIRECTORY_DELIMITER_CHAR '/' #define ALL_DIRECTORY_DELIMITER_STRING "/" #endif #ifdef HOST_WINDOWS void FCEUD_MakePathDirs(const char *fname); #endif class Path { public: static bool IsPathRooted (const std::string &path); static std::string GetFileDirectoryPath(std::string filePath); static std::string GetFileNameFromPath(std::string filePath); static std::string ScrubInvalid(std::string str); static std::string GetFileNameWithoutExt(std::string fileName); static std::string GetFileNameFromPathWithoutExt(std::string filePath); static std::string GetFileExt(std::string fileName); }; class PathInfo { public: std::string path; std::string RomName; std::string RomDirectory; #define MAX_FORMAT 20 #define SECTION "PathSettings" #define ROMKEY "Roms" #define BATTERYKEY "Battery" #define STATEKEY "States" #define SCREENSHOTKEY "Screenshots" #define AVIKEY "AviFiles" #define CHEATKEY "Cheats" #define R4FORMATKEY "R4format" #define SOUNDKEY "SoundSamples" #define FIRMWAREKEY "Firmware" #define FORMATKEY "format" #define DEFAULTFORMATKEY "defaultFormat" #define NEEDSSAVINGKEY "needsSaving" #define LASTVISITKEY "lastVisit" #define LUAKEY "Lua" #define SLOT1DKEY "Slot1D" char screenshotFormat[MAX_FORMAT]; bool savelastromvisit; enum KnownPath { FIRSTKNOWNPATH = 0, ROMS = 0, BATTERY, STATES, SCREENSHOTS, AVI_FILES, CHEATS, SOUNDS, FIRMWARE, MODULE, SLOT1D, MAXKNOWNPATH = MODULE }; char pathToRoms[MAX_PATH]; char pathToBattery[MAX_PATH]; char pathToStates[MAX_PATH]; char pathToScreenshots[MAX_PATH]; char pathToAviFiles[MAX_PATH]; char pathToCheats[MAX_PATH]; char pathToSounds[MAX_PATH]; char pathToFirmware[MAX_PATH]; char pathToModule[MAX_PATH]; char pathToLua[MAX_PATH]; char pathToSlot1D[MAX_PATH]; void init(const char *filename) { path = std::string(filename); //extract the internal part of the logical rom name std::vector parts = tokenize_str(filename,"|"); SetRomName(parts[parts.size()-1].c_str()); LoadModulePath(); #if !defined(WIN32) && !defined(DESMUME_COCOA) ReadPathSettings(); #endif } void LoadModulePath() { #if defined(HOST_WINDOWS) char *p; ZeroMemory(pathToModule, sizeof(pathToModule)); GetModuleFileName(NULL, pathToModule, sizeof(pathToModule)); p = pathToModule + lstrlen(pathToModule); while (p >= pathToModule && *p != DIRECTORY_DELIMITER_CHAR) p--; if (++p >= pathToModule) *p = 0; #ifndef DESMUME_QT extern char* _hack_alternateModulePath; if(_hack_alternateModulePath) { strcpy(pathToModule,_hack_alternateModulePath); } #endif #elif defined(DESMUME_COCOA) std::string pathStr = Path::GetFileDirectoryPath(path); strncpy(pathToModule, pathStr.c_str(), MAX_PATH); #else char *cwd = g_build_filename(g_get_user_config_dir(), "desmume", NULL); g_mkdir_with_parents(cwd, 0755); strncpy(pathToModule, cwd, MAX_PATH); g_free(cwd); #endif } enum Action { GET, SET }; void GetDefaultPath(char *pathToDefault, const char *key, int maxCount) { #ifdef HOST_WINDOWS std::string temp = (std::string)"." + DIRECTORY_DELIMITER_CHAR + pathToDefault; strncpy(pathToDefault, temp.c_str(), maxCount); #else strncpy(pathToDefault, pathToModule, maxCount); #endif } void ReadKey(char *pathToRead, const char *key) { #ifdef HOST_WINDOWS GetPrivateProfileString(SECTION, key, key, pathToRead, MAX_PATH, IniName); if(strcmp(pathToRead, key) == 0) { //since the variables are all intialized in this file they all use MAX_PATH GetDefaultPath(pathToRead, key, MAX_PATH); } #else //since the variables are all intialized in this file they all use MAX_PATH GetDefaultPath(pathToRead, key, MAX_PATH); #endif } void ReadPathSettings() { if( ( strcmp(pathToModule, "") == 0) || !pathToModule) LoadModulePath(); ReadKey(pathToRoms, ROMKEY); ReadKey(pathToBattery, BATTERYKEY); ReadKey(pathToStates, STATEKEY); ReadKey(pathToScreenshots, SCREENSHOTKEY); ReadKey(pathToAviFiles, AVIKEY); ReadKey(pathToCheats, CHEATKEY); ReadKey(pathToSounds, SOUNDKEY); ReadKey(pathToFirmware, FIRMWAREKEY); ReadKey(pathToLua, LUAKEY); ReadKey(pathToSlot1D, SLOT1DKEY); #ifdef HOST_WINDOWS GetPrivateProfileString(SECTION, FORMATKEY, "%f_%s_%r", screenshotFormat, MAX_FORMAT, IniName); savelastromvisit = GetPrivateProfileBool(SECTION, LASTVISITKEY, true, IniName); currentimageformat = (ImageFormat)GetPrivateProfileInt(SECTION, DEFAULTFORMATKEY, PNG, IniName); r4Format = (R4Format)GetPrivateProfileInt(SECTION, R4FORMATKEY, R4_CHEAT_DAT, IniName); if ((r4Format != R4_CHEAT_DAT) && (r4Format != R4_USRCHEAT_DAT)) { r4Format = R4_USRCHEAT_DAT; WritePrivateProfileInt(SECTION, R4FORMATKEY, r4Format, IniName); } #endif /* needsSaving = GetPrivateProfileInt(SECTION, NEEDSSAVINGKEY, TRUE, IniName); if(needsSaving) { needsSaving = FALSE; WritePathSettings(); }*/ } void SwitchPath(Action action, KnownPath path, char *buffer) { char *pathToCopy = 0; switch(path) { case ROMS: pathToCopy = pathToRoms; break; case BATTERY: pathToCopy = pathToBattery; break; case STATES: pathToCopy = pathToStates; break; case SCREENSHOTS: pathToCopy = pathToScreenshots; break; case AVI_FILES: pathToCopy = pathToAviFiles; break; case CHEATS: pathToCopy = pathToCheats; break; case SOUNDS: pathToCopy = pathToSounds; break; case FIRMWARE: pathToCopy = pathToFirmware; break; case MODULE: pathToCopy = pathToModule; break; case SLOT1D: pathToCopy = pathToSlot1D; break; } if(action == GET) { std::string thePath = pathToCopy; std::string relativePath = (std::string)"." + DIRECTORY_DELIMITER_CHAR; int len = (int)thePath.size()-1; if(len == -1) thePath = relativePath; else if(thePath[len] != DIRECTORY_DELIMITER_CHAR) thePath += DIRECTORY_DELIMITER_CHAR; if(!Path::IsPathRooted(thePath)) { thePath = (std::string)pathToModule + thePath; } strncpy(buffer, thePath.c_str(), MAX_PATH); #ifdef HOST_WINDOWS FCEUD_MakePathDirs(buffer); #endif } else if(action == SET) { int len = strlen(buffer)-1; if(buffer[len] == DIRECTORY_DELIMITER_CHAR) buffer[len] = '\0'; strncpy(pathToCopy, buffer, MAX_PATH); } } std::string getpath(KnownPath path) { char temp[MAX_PATH]; SwitchPath(GET, path, temp); return temp; } void getpath(KnownPath path, char *buffer) { SwitchPath(GET, path, buffer); } void setpath(KnownPath path, char *buffer) { SwitchPath(SET, path, buffer); } void getfilename(char *buffer, int maxCount) { strcpy(buffer,noextension().c_str()); } void getpathnoext(KnownPath path, char *buffer) { getpath(path, buffer); strcat(buffer, GetRomNameWithoutExtension().c_str()); } std::string extension() { return Path::GetFileExt(path); } std::string noextension() { std::string romNameWithPath = Path::GetFileDirectoryPath(path) + DIRECTORY_DELIMITER_CHAR + Path::GetFileNameWithoutExt(RomName); return romNameWithPath; } void formatname(char *output) { // Except 't' for tick and 'r' for random. const char* strftimeArgs = "AbBcCdDeFgGhHIjmMnpRStTuUVwWxXyYzZ%"; std::string file; time_t now = time(NULL); tm *time_struct = localtime(&now); srand((unsigned)now); for (char* p = screenshotFormat, *end = p + sizeof(screenshotFormat); p < end; p++) { if (*p != '%') { file.append(1, *p); } else { p++; if (*p == 'f') { file.append(GetRomNameWithoutExtension()); } else if (*p == 'r') { file.append(stditoa(rand())); } else if (*p == 't') { file.append(stditoa(clock() >> 5)); } else if (strchr(strftimeArgs, *p)) { char tmp[MAX_PATH]; char format[] = { '%', *p, NULL }; strftime(tmp, MAX_PATH, format, time_struct); file.append(tmp); } } } #ifdef WIN32 // Replace invalid file name character. { const char* invalids = "\\/:*?\"<>|"; size_t pos = 0; while ((pos = file.find_first_of(invalids, pos)) != std::string::npos) { file[pos] = '-'; } } #endif strncpy(output, file.c_str(), MAX_PATH); } enum R4Format { R4_CHEAT_DAT = 0, R4_USRCHEAT_DAT = 1 }; R4Format r4Format; enum ImageFormat { PNG = 0, BMP = 1 }; ImageFormat currentimageformat; ImageFormat imageformat() { return currentimageformat; } void SetRomName(const char *filename) { std::string romPath = filename; RomName = Path::GetFileNameFromPath(romPath); RomName = Path::ScrubInvalid(RomName); RomDirectory = Path::GetFileDirectoryPath(romPath); } const char *GetRomName() { return RomName.c_str(); } std::string GetRomNameWithoutExtension() { if (RomName.c_str() == NULL) return ""; return Path::GetFileNameWithoutExt(RomName); } bool isdsgba(std::string fileName) { size_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR); if (i != std::string::npos) { fileName = fileName.substr(i - 2); } if(fileName == "ds.gba") { return true; } return false; } }; extern PathInfo path; desmume-0.9.11/src/firmware.h0000755000000000000000000000752212467662066014543 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _FIRMWARE_H_ #define _FIRMWARE_H_ #include #include "types.h" #define NDS_FW_SIZE_V1 (256 * 1024) /* size of fw memory on nds v1 */ #define NDS_FW_SIZE_V2 (512 * 1024) /* size of fw memory on nds v2 */ // the count of bytes (user settings) copied from the firmware into memory (for easy access) during the firmware boot process #define NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT 0x70 //extension of the firmware user settings file #define FW_CONFIG_FILE_EXT "dfc" struct NDS_fw_config_data; class CFIRMWARE { private: u8 *tmp_data9; u8 *tmp_data7; u32 size9, size7; u32 userDataAddr; u16 getBootCodeCRC16(); u32 decrypt(const u8 *in, u8* &out); u32 decompress(const u8 *in, u8* &out); bool successLoad; public: CFIRMWARE(): size9(0), size7(0), ARM9bootAddr(0), ARM7bootAddr(0), patched(0), userDataAddr(0x3FE00), successLoad(false) {}; bool load(); bool unpack(); bool loadSettings(); bool saveSettings(); static std::string GetExternalFilePath(); u32 getID() { return header.fw_identifier; } bool loaded() { return successLoad; } void *getTouchCalibrate(); struct HEADER { u16 part3_rom_gui9_addr; // 000h u16 part4_rom_wifi7_addr; // 002h u16 part34_gui_wifi_crc16; // 004h u16 part12_boot_crc16; // 006h u32 fw_identifier; // 008h u16 part1_rom_boot9_addr; // 00Ch u16 part1_ram_boot9_addr; // 00Eh u16 part2_rom_boot7_addr; // 010h u16 part2_ram_boot7_addr; // 012h u16 shift_amounts; // 014h u16 part5_data_gfx_addr; // 016h u8 fw_timestamp[5]; // 018h u8 console_type; // 01Dh u16 unused1; // 01Eh u16 user_settings_offset; // 020h u16 unknown1; // 022h u16 unknown2; // 024h u16 part5_crc16; // 026h u16 unused2; // 028h - FFh filled } header; u32 ARM9bootAddr; u32 ARM7bootAddr; bool patched; }; int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data); int NDS_CreateDummyFirmware(NDS_fw_config_data *user_settings); void NDS_FillDefaultFirmwareConfigData(NDS_fw_config_data *fw_config); void NDS_PatchFirmwareMAC(); struct fw_memory_chip { u8 com; //persistent command actually handled u32 addr; //current address for reading/writing u8 addr_shift; //shift for address (since addresses are transfered by 3 bytes units) u8 addr_size; //size of addr when writing/reading BOOL write_enable; //is write enabled ? u8 *data; //memory data u32 size; //memory size BOOL writeable_buffer; //is "data" writeable ? int type; //type of Memory char *filename; FILE *fp; // needs only for firmware bool isFirmware; char userfile[MAX_PATH]; }; void fw_reset_com(fw_memory_chip *mc); u8 fw_transfer(fw_memory_chip *mc, u8 data); void mc_init(fw_memory_chip *mc, int type); /* reset and init values for memory struct */ u8 *mc_alloc(fw_memory_chip *mc, u32 size); /* alloc mc memory */ void mc_realloc(fw_memory_chip *mc, int type, u32 size); /* realloc mc memory */ void mc_load_file(fw_memory_chip *mc, const char* filename); /* load save file and setup fp */ void mc_free(fw_memory_chip *mc); /* delete mc memory */ #endif desmume-0.9.11/src/texcache.cpp0000755000000000000000000005277712467662066015062 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include #include "texcache.h" #include "bits.h" #include "common.h" #include "debug.h" #include "gfx3d.h" #include "MMU.h" #include "NDSSystem.h" using std::min; using std::max; //only dump this from ogl renderer. for now, softrasterizer creates things in an incompatible pixel format //#define DEBUG_DUMP_TEXTURE #define CONVERT(color,alpha) ((TEXFORMAT == TexFormat_32bpp)?(RGB15TO32(color,alpha)):RGB15TO6665(color,alpha)) //This class represents a number of regions of memory which should be viewed as contiguous class MemSpan { public: static const int MAXSIZE = 17; //max size for textures: 1024*1024*2 bytes / 128*1024 banks + 1 for wraparound MemSpan() : numItems(0), size(0) {} int numItems; struct Item { u32 start; u32 len; u8* ptr; u32 ofs; //offset within the memspan } items[MAXSIZE]; int size; //this MemSpan shall be considered the first argument to a standard memcmp //the length shall be as specified in this MemSpan, unless you specify otherwise int memcmp(void* buf2, int size=-1) { if(size==-1) size = this->size; size = min(this->size,size); for(int i=0;isize; size = min(this->size,size); u8* bufptr = (u8*)buf; int done = 0; for(int i=0;isize; size = min(this->size,size); u16* bufptr = (u16*)buf; int done = 0; for(int i=0;i>17)&3; //slots will wrap around curr.len = min(len,0x20000-curr.start); curr.ofs = currofs; len -= curr.len; ofs += curr.len; currofs += curr.len; u8* ptr = MMU.texInfo.textureSlotAddr[slot]; //TODO - dont alert if the masterbrightnesses are max or min if(ptr == MMU.blank_memory) { PROGINFO("Tried to reference unmapped texture memory: slot %d\n",slot); } curr.ptr = ptr + curr.start; } return ret; } //creates a MemSpan in texture palette memory static MemSpan MemSpan_TexPalette(u32 ofs, u32 len, bool silent) { MemSpan ret; ret.size = len; u32 currofs = 0; while(len) { MemSpan::Item &curr = ret.items[ret.numItems++]; curr.start = ofs&0x3FFF; u32 slot = (ofs>>14)&7; //this masks to 8 slots, but there are really only 6 if(slot>5 && !silent) { PROGINFO("Texture palette overruns texture memory. Wrapping at palette slot 0.\n"); slot -= 5; } curr.len = min(len,0x4000-curr.start); curr.ofs = currofs; len -= curr.len; ofs += curr.len; //if(len != 0) //here is an actual test case of bank spanning currofs += curr.len; u8* ptr = MMU.texInfo.texPalSlot[slot]; //TODO - dont alert if the masterbrightnesses are max or min if(ptr == MMU.blank_memory && !silent) { PROGINFO("Tried to reference unmapped texture palette memory: 16k slot #%d\n",slot); } curr.ptr = ptr + curr.start; } return ret; } #if defined (DEBUG_DUMP_TEXTURE) && defined (WIN32) #define DO_DEBUG_DUMP_TEXTURE static void DebugDumpTexture(TexCacheItem* item) { static int ctr=0; char fname[100]; sprintf(fname,"c:\\dump\\%d.bmp", ctr); ctr++; NDS_WriteBMP_32bppBuffer(item->sizeX,item->sizeY,item->decoded,fname); } #endif class TexCache { public: TexCache() : cache_size(0) { memset(paletteDump,0,sizeof(paletteDump)); } TTexCacheItemMultimap index; //this ought to be enough for anyone //static const u32 kMaxCacheSize = 64*1024*1024; //changed by zeromus on 15-dec. I couldnt find any games that were getting anywhere NEAR 64 static const u32 kMaxCacheSize = 16*1024*1024; //metal slug burns through sprites so fast, it can test it pretty quickly though //this is not really precise, it is off by a constant factor u32 cache_size; void list_remove(TexCacheItem* item) { index.erase(item->iterator); cache_size -= item->decode_len; } void list_push_front(TexCacheItem* item) { item->iterator = index.insert(std::make_pair(item->texformat,item)); cache_size += item->decode_len; } template TexCacheItem* scan(u32 format, u32 texpal) { //for each texformat, number of palette entries static const int palSizes[] = {0, 32, 4, 16, 256, 0, 8, 0}; //for each texformat, multiplier from numtexels to numbytes (fixed point 30.2) static const int texSizes[] = {0, 4, 1, 2, 4, 1, 4, 8}; //used to hold a copy of the palette specified for this texture u16 pal[256]; u32 textureMode = (unsigned short)((format>>26)&0x07); u32 sizeX=(8 << ((format>>20)&0x07)); u32 sizeY=(8 << ((format>>23)&0x07)); u32 imageSize = sizeX*sizeY; u8 *adr; u32 paletteAddress; switch (textureMode) { case TEXMODE_I2: paletteAddress = texpal<<3; break; case TEXMODE_A3I5: //a3i5 case TEXMODE_I4: //i4 case TEXMODE_I8: //i8 case TEXMODE_A5I3: //a5i3 case TEXMODE_16BPP: //16bpp case TEXMODE_4X4: //4x4 default: paletteAddress = texpal<<4; break; } //analyze the texture memory mapping and the specifications of this texture int palSize = palSizes[textureMode]; int texSize = (imageSize*texSizes[textureMode])>>2; //shifted because the texSizes multiplier is fixed point MemSpan ms = MemSpan_TexMem((format&0xFFFF)<<3,texSize); MemSpan mspal = MemSpan_TexPalette(paletteAddress,palSize*2,false); //determine the location for 4x4 index data u32 indexBase; if((format & 0xc000) == 0x8000) indexBase = 0x30000; else indexBase = 0x20000; u32 indexOffset = (format&0x3FFF)<<2; int indexSize = 0; MemSpan msIndex; if(textureMode == TEXMODE_4X4) { indexSize = imageSize>>3; msIndex = MemSpan_TexMem(indexOffset+indexBase,indexSize); } //dump the palette to a temp buffer, so that we don't have to worry about memory mapping. //this isnt such a problem with texture memory, because we read sequentially from it. //however, we read randomly from palette memory, so the mapping is more costly. #ifdef WORDS_BIGENDIAN mspal.dump16(pal); #else mspal.dump(pal); #endif //TODO - as a special optimization, keep the last item returned and check it first for(std::pair iters = index.equal_range(format); iters.first != iters.second; ++iters.first) { TexCacheItem* curr = iters.first->second; //conditions where we reject matches: //when the teximage or texpal params dont match //(this is our key for identifying textures in the cache) //NEW: due to using format as a key we dont need to check this anymore //if(curr->texformat != format) continue; if(curr->texpal != texpal) continue; //we're being asked for a different format than what we had cached. //TODO - this could be done at the entire cache level instead of checking repeatedly if(curr->cacheFormat != TEXFORMAT) goto REJECT; //if the texture is assumed invalid, reject it if(curr->assumedInvalid) goto REJECT; //the texture matches params, but isnt suspected invalid. accept it. if(!curr->suspectedInvalid) return curr; //we suspect the texture may be invalid. we need to do a byte-for-byte comparison to re-establish that it is valid: //when the palettes dont match: //note that we are considering 4x4 textures to have a palette size of 0. //they really have a potentially HUGE palette, too big for us to handle like a normal palette, //so they go through a different system if(mspal.size != 0 && memcmp(curr->dump.palette,pal,mspal.size)) goto REJECT; //when the texture data doesn't match if(ms.memcmp(&curr->dump.texture[0],curr->dump.textureSize)) goto REJECT; //if the texture is 4x4 then the index data must match if(textureMode == TEXMODE_4X4) { if(msIndex.memcmp(curr->dump.texture + curr->dump.textureSize,curr->dump.indexSize)) goto REJECT; } //we found a match. just return it //REMINDER to make it primary/newest when we have smarter code //list_remove(curr); //list_push_front(curr); curr->suspectedInvalid = false; return curr; REJECT: //we found a cached item for the current address, but the data is stale. //for a variety of complicated reasons, we need to throw it out right this instant. list_remove(curr); delete curr; break; } //item was not found. recruit an existing one (the oldest), or create a new one //evict(); //reduce the size of the cache if necessary //TODO - as a peculiarity of the texcache, eviction must happen after the entire 3d frame runs //to support separate cache and read passes TexCacheItem* newitem = new TexCacheItem(); newitem->suspectedInvalid = false; newitem->texformat = format; newitem->cacheFormat = TEXFORMAT; newitem->texpal = texpal; newitem->sizeX=sizeX; newitem->sizeY=sizeY; newitem->invSizeX=1.0f/((float)(sizeX)); newitem->invSizeY=1.0f/((float)(sizeY)); newitem->decode_len = sizeX*sizeY*4; newitem->mode = textureMode; newitem->decoded = new u8[newitem->decode_len]; list_push_front(newitem); //printf("allocating: up to %d with %d items\n",cache_size,index.size()); u32 *dwdst = (u32*)newitem->decoded; //dump palette data for cache keying if(palSize) { memcpy(newitem->dump.palette, pal, palSize*2); } //dump texture and 4x4 index data for cache keying const int texsize = newitem->dump.textureSize = ms.size; const int indexsize = newitem->dump.indexSize = msIndex.size; newitem->dump.texture = new u8[texsize+indexsize]; ms.dump(&newitem->dump.texture[0],newitem->dump.maxTextureSize); //dump texture if(textureMode == TEXMODE_4X4) msIndex.dump(newitem->dump.texture+newitem->dump.textureSize,newitem->dump.indexSize); //dump 4x4 //============================================================================ //Texture conversion //============================================================================ const u8 opaqueColor = (TEXFORMAT == TexFormat_32bpp) ? 0xFF : 0x1F; const u8 palZeroTransparent = ( 1 - ((format>>29) & 1) ) * opaqueColor; switch (newitem->mode) { case TEXMODE_A3I5: { for(int j=0;j>5; if(TEXFORMAT == TexFormat_15bpp) *dwdst++ = RGB15TO6665(c,material_3bit_to_5bit[alpha]); else *dwdst++ = RGB15TO32(c,material_3bit_to_8bit[alpha]); adr++; } } break; } case TEXMODE_I2: { for(int j=0;j>2)&0x3; c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); bits = ((*adr)>>4)&0x3; c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); bits = ((*adr)>>6)&0x3; c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); adr++; } } break; } case TEXMODE_I4: { for(int j=0;j>4); c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); adr++; } } break; } case TEXMODE_I8: { for(int j=0;j>14)&0x7] + ((paletteAddress + (offset)*2)&0x3FFF) ) ) u16* slot1; u32* map = (u32*)ms.items[0].ptr; u32 limit = ms.items[0].len<<2; u32 d = 0; if ( (format & 0xc000) == 0x8000) // texel are in slot 2 slot1=(u16*)&MMU.texInfo.textureSlotAddr[1][((format & 0x3FFF)<<2)+0x010000]; else slot1=(u16*)&MMU.texInfo.textureSlotAddr[1][(format & 0x3FFF)<<2]; u16 yTmpSize = (sizeY>>2); u16 xTmpSize = (sizeX>>2); //this is flagged whenever a 4x4 overruns its slot. //i am guessing we just generate black in that case bool dead = false; for (int y = 0; y < yTmpSize; y ++) { u32 tmpPos[4]={(y<<2)*sizeX,((y<<2)+1)*sizeX, ((y<<2)+2)*sizeX,((y<<2)+3)*sizeX}; for (int x = 0; x < xTmpSize; x ++, d++) { if(d >= limit) dead = true; if(dead) { for (int sy = 0; sy < 4; sy++) { u32 currentPos = (x<<2) + tmpPos[sy]; dwdst[currentPos] = dwdst[currentPos+1] = dwdst[currentPos+2] = dwdst[currentPos+3] = 0; } continue; } u32 currBlock = LE_TO_LOCAL_32(map[d]); u16 pal1 = LE_TO_LOCAL_16(slot1[d]); u16 pal1offset = (pal1 & 0x3FFF)<<1; u8 mode = pal1>>14; u32 tmp_col[4]; tmp_col[0] = RGB15TO32( PAL4X4(pal1offset), 0xFF ); tmp_col[1] = RGB15TO32( PAL4X4(pal1offset+1), 0xFF ); switch (mode) { case 0: tmp_col[2] = RGB15TO32( PAL4X4(pal1offset+2), 0xFF ); tmp_col[3] = RGB15TO32(0x7FFF, 0x00); break; case 1: #ifdef LOCAL_BE tmp_col[2] = ( (((tmp_col[0] & 0xFF000000) >> 1)+((tmp_col[1] & 0xFF000000) >> 1)) & 0xFF000000 ) | ( (((tmp_col[0] & 0x00FF0000) + (tmp_col[1] & 0x00FF0000)) >> 1) & 0x00FF0000 ) | ( (((tmp_col[0] & 0x0000FF00) + (tmp_col[1] & 0x0000FF00)) >> 1) & 0x0000FF00 ) | 0x000000FF; tmp_col[3] = 0xFFFFFF00; #else tmp_col[2] = ( (((tmp_col[0] & 0x00FF00FF) + (tmp_col[1] & 0x00FF00FF)) >> 1) & 0x00FF00FF ) | ( (((tmp_col[0] & 0x0000FF00) + (tmp_col[1] & 0x0000FF00)) >> 1) & 0x0000FF00 ) | 0xFF000000; tmp_col[3] = 0x00FFFFFF; #endif break; case 2: tmp_col[2] = RGB15TO32( PAL4X4(pal1offset+2), 0xFF ); tmp_col[3] = RGB15TO32( PAL4X4(pal1offset+3), 0xFF ); break; case 3: { #ifdef LOCAL_BE const u32 r0 = (tmp_col[0]>>24) & 0x000000FF; const u32 r1 = (tmp_col[1]>>24) & 0x000000FF; const u32 g0 = (tmp_col[0]>>16) & 0x000000FF; const u32 g1 = (tmp_col[1]>>16) & 0x000000FF; const u32 b0 = (tmp_col[0]>> 8) & 0x000000FF; const u32 b1 = (tmp_col[1]>> 8) & 0x000000FF; #else const u32 r0 = tmp_col[0] & 0x000000FF; const u32 r1 = tmp_col[1] & 0x000000FF; const u32 g0 = (tmp_col[0]>> 8) & 0x000000FF; const u32 g1 = (tmp_col[1]>> 8) & 0x000000FF; const u32 b0 = (tmp_col[0]>>16) & 0x000000FF; const u32 b1 = (tmp_col[1]>>16) & 0x000000FF; #endif const u16 tmp1 = ( (r0*5 + r1*3)>>6) | ( ((g0*5 + g1*3)>>6) << 5 ) | ( ((b0*5 + b1*3)>>6) << 10 ); const u16 tmp2 = ( (r0*3 + r1*5)>>6) | ( ((g0*3 + g1*5)>>6) << 5 ) | ( ((b0*3 + b1*5)>>6) << 10 ); tmp_col[2] = RGB15TO32(tmp1, 0xFF); tmp_col[3] = RGB15TO32(tmp2, 0xFF); break; } } if(TEXFORMAT==TexFormat_15bpp) { for (size_t i = 0; i < 4; i++) { #ifdef LOCAL_BE const u32 a = (tmp_col[i] >> 3) & 0x0000001F; tmp_col[i] >>= 2; tmp_col[i] &= 0x3F3F3F00; tmp_col[i] |= a; #else const u32 a = (tmp_col[i] >> 3) & 0x1F000000; tmp_col[i] >>= 2; tmp_col[i] &= 0x003F3F3F; tmp_col[i] |= a; #endif } } //TODO - this could be more precise for 32bpp mode (run it through the color separation table) //set all 16 texels for (size_t sy = 0; sy < 4; sy++) { // Texture offset u32 currentPos = (x<<2) + tmpPos[sy]; u8 currRow = (u8)((currBlock>>(sy<<3))&0xFF); dwdst[currentPos ] = tmp_col[ currRow &3]; dwdst[currentPos+1] = tmp_col[(currRow>>2)&3]; dwdst[currentPos+2] = tmp_col[(currRow>>4)&3]; dwdst[currentPos+3] = tmp_col[(currRow>>6)&3]; } } } break; } case TEXMODE_A5I3: { for(int j=0;j>3); if(TEXFORMAT == TexFormat_15bpp) *dwdst++ = RGB15TO6665(c,alpha); else *dwdst++ = RGB15TO32(c,material_5bit_to_8bit[alpha]); adr++; } } break; } case TEXMODE_16BPP: { for(int j=0;j>1; for(int x = 0; x < len; ++x) { u16 c = map[x]; int alpha = ((c&0x8000)?opaqueColor:0); *dwdst++ = CONVERT(c&0x7FFF,alpha); } } break; } } //switch(texture format) #ifdef DO_DEBUG_DUMP_TEXTURE DebugDumpTexture(newitem); #endif return newitem; } //scan() static const int PALETTE_DUMP_SIZE = (64+16+16)*1024; u8 paletteDump[PALETTE_DUMP_SIZE]; void invalidate() { //check whether the palette memory changed //TODO - we should handle this instead by setting dirty flags in the vram memory mapping and noting whether palette memory was dirty. //but this will work for now MemSpan mspal = MemSpan_TexPalette(0,PALETTE_DUMP_SIZE,true); bool paletteDirty = mspal.memcmp(paletteDump); if(paletteDirty) { mspal.dump(paletteDump); } for(TTexCacheItemMultimap::iterator it(index.begin()); it != index.end(); ++it) { it->second->suspectedInvalid = true; //when the palette changes, we assume all 4x4 textures are dirty. //this is because each 4x4 item doesnt carry along with it a copy of the entire palette, for verification //instead, we just use the one paletteDump for verifying of all 4x4 textures; and if paletteDirty is set, verification has failed if(it->second->getTextureMode() == TEXMODE_4X4 && paletteDirty) { it->second->assumedInvalid = true; } } } void evict(u32 target = kMaxCacheSize) { //debug print //printf("%d %d/%d\n",index.size(),cache_size/1024,target/1024); //dont do anything unless we're over the target if(cache_size target) { if(index.size()==0) break; //just in case.. doesnt seem possible, cache_size wouldve been 0 TexCacheItem* item = index.begin()->second; list_remove(item); //printf("evicting! totalsize:%d\n",cache_size); delete item; } } } texCache; void TexCache_Reset() { texCache.evict(0); } void TexCache_Invalidate() { //note that this gets called whether texdata or texpalette gets reconfigured. texCache.invalidate(); } TexCacheItem* TexCache_SetTexture(TexCache_TexFormat TEXFORMAT, u32 format, u32 texpal) { switch(TEXFORMAT) { case TexFormat_32bpp: return texCache.scan(format,texpal); case TexFormat_15bpp: return texCache.scan(format,texpal); default: assert(false); return NULL; } } //call this periodically to keep the tex cache clean void TexCache_EvictFrame() { texCache.evict(); } desmume-0.9.11/src/mem.h0000755000000000000000000001136012467662066013500 0ustar rootroot/* Copyright (C) 2005 Theo Berkau Copyright (C) 2005-2006 Guillaume Duhamel Copyright (C) 2008-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef MEM_H #define MEM_H #include #include #include "types.h" //this was originally declared in MMU.h but we suffered some organizational problems and had to remove it enum MMU_ACCESS_TYPE { MMU_AT_CODE, //used for cpu prefetches MMU_AT_DATA, //used for cpu read/write MMU_AT_GPU, //used for gpu read/write MMU_AT_DMA, //used for dma read/write (blocks access to TCM) MMU_AT_DEBUG, //used for emulator debugging functions (bypasses some debug handling) }; static INLINE u8 T1ReadByte(u8* const mem, const u32 addr) { return mem[addr]; } static INLINE u16 T1ReadWord_guaranteedAligned(void* const mem, const u32 addr) { assert((addr&1)==0); #ifdef WORDS_BIGENDIAN return (((u8*)mem)[addr + 1] << 8) | ((u8*)mem)[addr]; #else return *(u16*)((u8*)mem + addr); #endif } static INLINE u16 T1ReadWord(void* const mem, const u32 addr) { #ifdef WORDS_BIGENDIAN return (((u8*)mem)[addr + 1] << 8) | ((u8*)mem)[addr]; #else return *((u16 *) ((u8*)mem + addr)); #endif } static INLINE u32 T1ReadLong_guaranteedAligned(u8* const mem, const u32 addr) { assert((addr&3)==0); #ifdef WORDS_BIGENDIAN return (mem[addr + 3] << 24 | mem[addr + 2] << 16 | mem[addr + 1] << 8 | mem[addr]); #else return *(u32*)(mem + addr); #endif } static INLINE u32 T1ReadLong(u8* const mem, u32 addr) { addr &= ~3; #ifdef WORDS_BIGENDIAN return (mem[addr + 3] << 24 | mem[addr + 2] << 16 | mem[addr + 1] << 8 | mem[addr]); #else return *(u32*)(mem + addr); #endif } static INLINE u64 T1ReadQuad(u8* const mem, const u32 addr) { #ifdef WORDS_BIGENDIAN return (u64(mem[addr + 7]) << 56 | u64(mem[addr + 6]) << 48 | u64(mem[addr + 5]) << 40 | u64(mem[addr + 4]) << 32 | u64(mem[addr + 3]) << 24 | u64(mem[addr + 2]) << 16 | u64(mem[addr + 1]) << 8 | u64(mem[addr ])); #else return *((u64 *) (mem + addr)); #endif } static INLINE void T1WriteByte(u8* const mem, const u32 addr, const u8 val) { mem[addr] = val; } static INLINE void T1WriteWord(u8* const mem, const u32 addr, const u16 val) { #ifdef WORDS_BIGENDIAN mem[addr + 1] = val >> 8; mem[addr] = val & 0xFF; #else *((u16 *) (mem + addr)) = val; #endif } static INLINE void T1WriteLong(u8* const mem, const u32 addr, const u32 val) { #ifdef WORDS_BIGENDIAN mem[addr + 3] = val >> 24; mem[addr + 2] = (val >> 16) & 0xFF; mem[addr + 1] = (val >> 8) & 0xFF; mem[addr] = val & 0xFF; #else *((u32 *) (mem + addr)) = val; #endif } static INLINE void T1WriteQuad(u8* const mem, const u32 addr, const u64 val) { #ifdef WORDS_BIGENDIAN mem[addr + 7] = (val >> 56); mem[addr + 6] = (val >> 48) & 0xFF; mem[addr + 5] = (val >> 40) & 0xFF; mem[addr + 4] = (val >> 32) & 0xFF; mem[addr + 3] = (val >> 24) & 0xFF; mem[addr + 2] = (val >> 16) & 0xFF; mem[addr + 1] = (val >> 8) & 0xFF; mem[addr] = val & 0xFF; #else *((u64 *) (mem + addr)) = val; #endif } //static INLINE u8 T2ReadByte(u8* const mem, const u32 addr) //{ //#ifdef WORDS_BIGENDIAN // return mem[addr ^ 1]; //#else // return mem[addr]; //#endif //} // static INLINE u16 HostReadWord(u8* const mem, const u32 addr) { return *((u16 *) (mem + addr)); } // //static INLINE u32 T2ReadLong(u8* const mem, const u32 addr) //{ //#ifdef WORDS_BIGENDIAN // return *((u16 *) (mem + addr + 2)) << 16 | *((u16 *) (mem + addr)); //#else // return *((u32 *) (mem + addr)); //#endif //} // //static INLINE void T2WriteByte(u8* const mem, const u32 addr, const u8 val) //{ //#ifdef WORDS_BIGENDIAN // mem[addr ^ 1] = val; //#else // mem[addr] = val; //#endif //} static INLINE void HostWriteWord(u8* const mem, const u32 addr, const u16 val) { *((u16 *) (mem + addr)) = val; } static INLINE void HostWriteLong(u8* const mem, const u32 addr, const u32 val) { *((u32 *) (mem + addr)) = val; } static INLINE void HostWriteTwoWords(u8* const mem, const u32 addr, const u32 val) { #ifdef WORDS_BIGENDIAN *((u16 *) (mem + addr + 2)) = val >> 16; *((u16 *) (mem + addr)) = val & 0xFFFF; #else *((u32 *) (mem + addr)) = val; #endif } #endif desmume-0.9.11/src/utils/0000755000000000000000000000000012467663413013702 5ustar rootrootdesmume-0.9.11/src/utils/AsmJit/0000755000000000000000000000000012467663413015071 5ustar rootrootdesmume-0.9.11/src/utils/AsmJit/core.h0000755000000000000000000000152212467662066016200 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_H #define _ASMJIT_CORE_H // [Dependencies - AsmJit] #include "core/build.h" #include "core/assembler.h" #include "core/assert.h" #include "core/buffer.h" #include "core/compiler.h" #include "core/compilercontext.h" #include "core/compilerfunc.h" #include "core/compileritem.h" #include "core/cpuinfo.h" #include "core/defs.h" #include "core/func.h" #include "core/intutil.h" #include "core/lock.h" #include "core/logger.h" #include "core/memorymanager.h" #include "core/memorymarker.h" #include "core/operand.h" #include "core/podvector.h" #include "core/stringbuilder.h" #include "core/stringutil.h" #include "core/virtualmemory.h" #include "core/zonememory.h" // [Guard] #endif // _ASMJIT_CORE_H desmume-0.9.11/src/utils/AsmJit/AsmJit.h0000755000000000000000000003140212467662066016437 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_ASMJIT_H #define _ASMJIT_ASMJIT_H //! @mainpage //! //! @brief AsmJit is a complete x86/x64 JIT Assembler for C++ language. //! //! It supports FPU, MMX, 3dNow, SSE, SSE2, SSE3 and SSE4 intrinsics, powerful //! compiler that helps to write portable functions for 32-bit (x86) and 64-bit //! (x64) architectures. AsmJit can be used to create functions at runtime that //! can be called from existing (but also generated) C/C++ code. //! //! AsmJit is a cross-platform library that supports various compilers and //! operating systems. Currently only limitation is x86 (32-bit) or x64 (64-bit) //! processor. Currently tested operating systems are Windows (32-bit and 64-bit), //! Linux (32-bit and 64-bit) and MacOSX (32-bit and 64-bit). //! //! @section AsmJit_Main_Introduction Introduction //! //! AsmJit library contains two main classes for code generation with different //! goals. First main code generation class is called @c AsmJit::Assembler and //! contains low level API that can be used to generate JIT binary code. It //! directly emits binary stream that represents encoded x86/x64 assembler //! opcodes. Together with operands and labels it can be used to generate //! complete code. For details look to @ref AsmJit_Core and @ref AsmJit_Compiler //! sections. //! //! There is also class named @c AsmJit::Compiler that allows to develop //! cross-platform assembler code without worring about function calling //! conventions and registers allocation. It can be also used to write 32-bit //! and 64-bit portable code. Compiler is recommended class to use for code //! generation. //! //! Everything in AsmJit library is in @c AsmJit namespace. //! //! @section AsmJit_Main_CodeGeneration Code Generation //! //! - @ref AsmJit_Core "Assembler core" - Operands, intrinsics and low-level assembler. //! - @ref AsmJit_Compiler "Compiler" - High level code generation. //! - @ref AsmJit_CpuInfo "Cpu Information" - Get information about host processor. //! - @ref AsmJit_Logging "Logging" - Logging and error handling. //! - @ref AsmJit_MemoryManagement "Memory Management" - Virtual memory management. //! //! @section AsmJit_Main_Configuration Configuration, Definitions and Utilities //! //! - @ref AsmJit_Config "Configuration" - Macros used to configure AsmJit. //! //! @section AsmJit_Main_HomePage AsmJit Homepage //! //! - http://code.google.com/p/asmjit/ //! //! @section AsmJit_Main_ResourcesX86 External X86/X64 Assembler Resources //! - http://www.agner.org/optimize/ //! - http://www.mark.masmcode.com/ (Assembler Tips) //! - http://avisynth.org/mediawiki/Filter_SDK/Assembler_optimizing (Optimizing) //! - http://www.ragestorm.net/distorm/ (Disassembling) //! //! @section AsmJit_Main_Terminology Terminology //! //! - Non-volatile (preserved) register - Register that can't be changed //! by callee (callee must save and restore it if it want to use it inside). //! //! - Volatile (non-preserved) register - The opossite. Register that can //! be freely used by callee. The caller must free all registers before calling //! other function. //! @defgroup AsmJit_Core Assembler core (operands, intrinsics and low-level assembler). //! //! Contains classes related to @c AsmJit::Assembler that're directly used //! to generate machine code stream. It's one of oldest and fastest method //! to generate machine code using AsmJit library. //! //! - See @c AsmJit::Assembler class for low level code generation //! documentation. //! - See @c AsmJit::Operand for AsmJit operand's overview. //! //! @section AsmJit_Core_Registers Registers //! //! There are static objects that represents X86 and X64 registers. They can //! be used directly (like @c eax, @c mm, @c xmm, ...) or created through //! these functions: //! //! - @c AsmJit::mk_gpb() - make general purpose byte register //! - @c AsmJit::mk_gpw() - make general purpose word register //! - @c AsmJit::mk_gpd() - make general purpose dword register //! - @c AsmJit::mk_gpq() - make general purpose qword register //! - @c AsmJit::mk_mm() - make mmx register //! - @c AsmJit::mk_xmm() - make sse register //! - @c AsmJit::st() - make x87 register //! //! @section AsmJit_Core_Addressing Addressing //! //! X86 and x64 architectures contains several addressing modes and most ones //! are possible with AsmJit library. Memory represents are represented by //! @c AsmJit::Mem class. These functions are used to make operands that //! represents memory addresses: //! //! - @c AsmJit::ptr() //! - @c AsmJit::byte_ptr() //! - @c AsmJit::word_ptr() //! - @c AsmJit::dword_ptr() //! - @c AsmJit::qword_ptr() //! - @c AsmJit::tword_ptr() //! - @c AsmJit::dqword_ptr() //! - @c AsmJit::mmword_ptr() //! - @c AsmJit::xmmword_ptr() //! - @c AsmJit::sysint_ptr() //! //! Most useful function to make pointer should be @c AsmJit::ptr(). It creates //! pointer to the target with unspecified size. Unspecified size works in all //! intrinsics where are used registers (this means that size is specified by //! register operand or by instruction itself). For example @c AsmJit::ptr() //! can't be used with @c AsmJit::Assembler::inc() instruction. In this case //! size must be specified and it's also reason to make difference between //! pointer sizes. //! //! Supported are simple address forms (register + displacement) and complex //! address forms (register + (register << shift) + displacement). //! //! @section AsmJit_Core_Immediates Immediates //! //! Immediate values are constants thats passed directly after instruction //! opcode. To create such value use @c AsmJit::imm() or @c AsmJit::uimm() //! methods to create signed or unsigned immediate value. //! //! @sa @c AsmJit::Compiler. //! @defgroup AsmJit_Compiler Compiler (high-level code generation). //! //! Contains classes related to @c AsmJit::Compiler that can be used //! to generate code using high-level constructs. //! //! - See @c Compiler class for high level code generation //! documentation - calling conventions, function declaration //! and variables management. //! @defgroup AsmJit_Config Configuration. //! //! Contains macros that can be redefined to fit into any project. //! @defgroup AsmJit_CpuInfo CPU information. //! //! X86 or x64 cpuid instruction allows to get information about processor //! vendor and it's features. It's always used to detect features like MMX, //! SSE and other newer ones. //! //! AsmJit library supports low level cpuid call implemented internally as //! C++ function using inline assembler or intrinsics and also higher level //! CPU features detection. The low level function (also used by higher level //! one) is @c AsmJit::cpuid(). //! //! AsmJit library also contains higher level function @c AsmJit::getCpuInfo() //! that returns features detected by the library. The detection process is //! done only once and it's cached for all next calls. @c AsmJit::CpuInfo //! structure not contains only information through @c AsmJit::cpuid(), but //! there is also small multiplatform code to detect number of processors //! (or cores) through operating system API. //! //! It's recommended to use @c AsmJit::cpuInfo to detect and check for //! host processor features. //! //! Example how to use AsmJit::cpuid(): //! //! @code //! // All functions and structures are in AsmJit namesapce. //! using namespace AsmJit; //! //! // Here will be retrieved result of cpuid call. //! CpuId out; //! //! // Use cpuid function to do the job. //! cpuid(0 /* eax */, &out /* eax, ebx, ecx, edx */); //! //! // Id eax argument to cpuid is 0, ebx, ecx and edx registers //! // are filled with cpu vendor. //! char vendor[13]; //! memcpy(i->vendor, &out.ebx, 4); //! memcpy(i->vendor + 4, &out.edx, 4); //! memcpy(i->vendor + 8, &out.ecx, 4); //! vendor[12] = '\0'; //! //! // Print vendor //! puts(vendor); //! @endcode //! //! If you want to use AsmJit::cpuid() function instead of higher level //! @c AsmJit::getCpuInfo(), please read processor manuals provided by Intel, //! AMD or other manufacturers for cpuid instruction details. //! //! Example of using @c AsmJit::getCpuInfo(): //! //! @code //! // All functions and structures are in AsmJit namesapce. //! using namespace AsmJit; //! //! // Call to cpuInfo return CpuInfo structure that shouldn't be modified. //! // Make it const by default. //! const CpuInfo *i = getCpuInfo(); //! //! // Now you are able to get specific features. //! //! // Processor has SSE2 //! if (i->features & kX86FeatureSse2) //! { //! // your code... //! } //! // Processor has MMX //! else if (i->features & kX86Feature_MMX) //! { //! // your code... //! } //! // Processor is old, no SSE2 or MMX support. //! else //! { //! // your code... //! } //! @endcode //! //! Better example is in AsmJit/Test/testcpu.cpp file. //! //! @sa AsmJit::cpuid, @c AsmJit::cpuInfo. //! @defgroup AsmJit_Logging Logging and error handling. //! //! Contains classes related to loging assembler output. Currently logging //! is implemented in @c AsmJit::Logger class.You can override //! @c AsmJit::Logger::log() to log messages into your stream. There is also //! @c FILE based logger implemented in @c AsmJit::FileLogger class. //! //! To log your assembler output to FILE stream use this code: //! //! @code //! // Create assembler //! Assembler a; //! //! // Create and set file based logger //! FileLogger logger(stderr); //! a.setLogger(&logger); //! @endcode //! //! You can see that logging goes through @c Assembler. If you are using //! @c Compiler and you want to log messages in correct assembler order, //! you should look at @ref Compiler::comment() method. It allows you to //! insert text message into items stream so the @c Compiler is able to //! send messages to @ref Assembler in correct order. //! //! @sa @c AsmJit::Logger, @c AsmJit::FileLogger. //! @defgroup AsmJit_MemoryManagement Virtual memory management. //! //! Using @c AsmJit::Assembler or @c AsmJit::Compiler to generate machine //! code is not final step. Each generated code needs to run in memory //! that is not protected against code execution. To alloc this code it's //! needed to use operating system functions provided to enable execution //! code in specified memory block or to allocate memory that is not //! protected. The solution is always to use @c See AsmJit::Assembler::make() //! and @c AsmJit::Compiler::make() functions that can allocate memory and //! relocate code for you. But AsmJit also contains classes for manual memory //! management thats internally used by AsmJit but can be used by programmers //! too. //! //! Memory management contains low level and high level classes related to //! allocating and freeing virtual memory. Low level class is //! @c AsmJit::VirtualMemory that can allocate and free full pages of //! virtual memory provided by operating system. Higher level class is //! @c AsmJit::MemoryManager that is able to manage complete allocation and //! free mechanism. It internally uses larger chunks of memory to make //! allocation fast and effective. //! //! Using @c AsmJit::VirtualMemory::alloc() is cross-platform way how to //! allocate this kind of memory without worrying about operating system //! and it's API. Each memory block that is no longer needed should be //! freed by @c AsmJit::VirtualMemory::free() method. If you want better //! comfort and malloc()/free() interface, look at the //! @c AsmJit::MemoryManager class. //! //! @sa @c AsmJit::VirtualMemory, @ AsmJit::MemoryManager. //! @addtogroup AsmJit_Config //! @{ //! @def ASMJIT_WINDOWS //! @brief Macro that is declared if AsmJit is compiled for Windows. //! @def ASMJIT_POSIX //! @brief Macro that is declared if AsmJit is compiled for unix like //! operating system. //! @def ASMJIT_API //! @brief Attribute that's added to classes that can be exported if AsmJit //! is compiled as a dll library. //! @def ASMJIT_MALLOC //! @brief Function to call to allocate dynamic memory. //! @def ASMJIT_REALLOC //! @brief Function to call to reallocate dynamic memory. //! @def ASMJIT_FREE //! @brief Function to call to free dynamic memory. //! @def ASMJIT_ASSERT //! @brief Assertion macro. Default implementation calls //! @c AsmJit::assertionFailure() function. //! @} //! @namespace AsmJit //! @brief Main AsmJit library namespace. //! //! There are not other namespaces used in AsmJit library. // ---------------------------------------------------------------------------- // [Dependencies - Core] // ---------------------------------------------------------------------------- #include "core.h" // ---------------------------------------------------------------------------- // [Dependencies - X86 / X64] // ---------------------------------------------------------------------------- #if defined(ASMJIT_X86) || defined(ASMJIT_X64) #include "x86.h" #endif // ASMJIT_X86 || ASMJIT_X64 // [Guard] #endif // _ASMJIT_ASMJIT_H desmume-0.9.11/src/utils/AsmJit/Config.h0000755000000000000000000000431712467662066016462 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CONFIG_H #define _ASMJIT_CONFIG_H // This file is designed to be modifyable. Platform specific changes should // be applied to this file so it's guaranteed that never versions of AsmJit // library will never overwrite generated config files. // // So modify this file by your build system or by hand. // ============================================================================ // [AsmJit - OS] // ============================================================================ // Provides definitions about your operating system. It's detected by default, // so override it if you have problems with automatic detection. // // #define ASMJIT_WINDOWS // #define ASMJIT_POSIX // ============================================================================ // [AsmJit - Architecture] // ============================================================================ // Provides definitions about your cpu architecture. It's detected by default, // so override it if you have problems with automatic detection. // #define ASMJIT_X86 // #define ASMJIT_X64 // ============================================================================ // [AsmJit - API] // ============================================================================ // If you are embedding AsmJit library into your project (statically), undef // ASMJIT_API macro. #define ASMJIT_API // ============================================================================ // [AsmJit - Memory Management] // ============================================================================ // #define ASMJIT_MALLOC ::malloc // #define ASMJIT_REALLOC ::realloc // #define ASMJIT_FREE ::free // ============================================================================ // [AsmJit - Debug] // ============================================================================ // Turn debug on/off (to bypass autodetection) // #define ASMJIT_DEBUG // #define ASMJIT_NO_DEBUG // Setup custom assertion code. // #define ASMJIT_ASSERT(exp) do { if (!(exp)) ::AsmJit::assertionFailure(__FILE__, __LINE__, #exp); } while(0) // [Guard] #endif // _ASMJIT_CONFIG_H desmume-0.9.11/src/utils/AsmJit/x86/0000755000000000000000000000000012467663413015516 5ustar rootrootdesmume-0.9.11/src/utils/AsmJit/x86/x86util.h0000755000000000000000000000735012467662066017225 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86UTIL_H #define _ASMJIT_X86_X86UTIL_H // [Dependencies - AsmJit] #include "../x86/x86defs.h" #include "../x86/x86operand.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86Util] // ============================================================================ //! @brief Map condition code to "jcc" group of instructions. ASMJIT_VAR const uint32_t _x86UtilJccFromCond[20]; //! @brief Map condition code to "cmovcc" group of instructions. ASMJIT_VAR const uint32_t _x86UtilMovccFromCond[20]; //! @brief Map condition code to "setcc" group of instructions. ASMJIT_VAR const uint32_t _x86UtilSetccFromCond[20]; //! @brief Map condition code to reversed condition code. ASMJIT_VAR const uint32_t _x86UtilReversedCond[20]; struct X86Util { // -------------------------------------------------------------------------- // [Condition Codes] // -------------------------------------------------------------------------- //! @brief Get the equivalent of negated condition code. static inline uint32_t getNegatedCond(uint32_t cond) { return static_cast(cond ^ static_cast(cond < kX86CondNone)); } //! @brief Corresponds to transposing the operands of a comparison. static inline uint32_t getReversedCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilReversedCond)); return _x86UtilReversedCond[cond]; } //! @brief Translate condition code @a cc to jcc instruction code. //! @sa @c kX86InstCode, @c kX86InstJ. static inline uint32_t getJccInstFromCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilJccFromCond)); return _x86UtilJccFromCond[cond]; } //! @brief Translate condition code @a cc to cmovcc instruction code. //! @sa @c kX86InstCode, @c kX86InstCMov. static inline uint32_t getCMovccInstFromCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilMovccFromCond)); return _x86UtilMovccFromCond[cond]; } //! @brief Translate condition code @a cc to setcc instruction code. //! @sa @c kX86InstCode, @c kX86InstSet. static inline uint32_t getSetccInstFromCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilSetccFromCond)); return _x86UtilSetccFromCond[cond]; } // -------------------------------------------------------------------------- // [Variables] // -------------------------------------------------------------------------- static inline uint32_t getVarClassFromVarType(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return x86VarInfo[varType].getClass(); } static inline uint32_t getVarSizeFromVarType(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return x86VarInfo[varType].getSize(); } static inline uint32_t getRegCodeFromVarType(uint32_t varType, uint32_t regIndex) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return x86VarInfo[varType].getCode() | regIndex; } static inline bool isVarTypeInt(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return (x86VarInfo[varType].getClass() & kX86VarClassGp) != 0; } static inline bool isVarTypeFloat(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return (x86VarInfo[varType].getFlags() & (kX86VarFlagSP | kX86VarFlagDP)) != 0; } }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86UTIL_H desmume-0.9.11/src/utils/AsmJit/x86/x86compilerfunc.cpp0000755000000000000000000025007612467662066021276 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86cpuinfo.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86Assembler - Logging] // ============================================================================ // Defined in AsmJit/X86/X86Assembler.cpp. char* X86Assembler_dumpRegister(char* buf, uint32_t type, uint32_t index); char* X86Assembler_dumpOperand(char* buf, const Operand* op, uint32_t memRegType, uint32_t loggerFlags); // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Construction / Destructioin] // ============================================================================ X86CompilerFuncDecl::X86CompilerFuncDecl(X86Compiler* x86Compiler) : CompilerFuncDecl(x86Compiler), _gpModifiedAndPreserved(0), _mmModifiedAndPreserved(0), _xmmModifiedAndPreserved(0), _movDqInstCode(kInstNone), _pePushPopStackSize(0), _peMovStackSize(0), _peAdjustStackSize(0), _memStackSize(0), _memStackSize16(0) { _decl = &_x86Decl; // Just clear to safe defaults. _funcHints |= IntUtil::maskFromIndex(kX86FuncHintPushPop); // Stack is always aligned to 16-bytes when using 64-bit OS. if (CompilerUtil::isStack16ByteAligned()) _funcHints |= IntUtil::maskFromIndex(kX86FuncHintAssume16ByteAlignment); _entryLabel = x86Compiler->newLabel(); _exitLabel = x86Compiler->newLabel(); _entryTarget = x86Compiler->_getTarget(_entryLabel.getId()); _exitTarget = x86Compiler->_getTarget(_exitLabel.getId()); _end = Compiler_newItem(x86Compiler, this); } X86CompilerFuncDecl::~X86CompilerFuncDecl() { } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Interface] // ============================================================================ void X86CompilerFuncDecl::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset++; _prepareVariables(this); } CompilerItem* X86CompilerFuncDecl::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _allocVariables(x86Context); return translated(); } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Misc] // ============================================================================ int X86CompilerFuncDecl::getMaxSize() const { // NOP. return 0; } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Prototype] // ============================================================================ void X86CompilerFuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { _x86Decl.setPrototype(convention, returnType, arguments, argumentsCount); } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Helpers] // ============================================================================ void X86CompilerFuncDecl::_createVariables() { X86Compiler* x86Compiler = getCompiler(); uint32_t i, count = _x86Decl.getArgumentsCount(); if (count == 0) return; _vars = reinterpret_cast(x86Compiler->getZoneMemory().alloc(count * sizeof(void*))); if (_vars == NULL) { x86Compiler->setError(kErrorNoHeapMemory); return; } char argNameStorage[64]; char* argName = NULL; bool debug = x86Compiler->getLogger() != NULL; if (debug) argName = argNameStorage; for (i = 0; i < count; i++) { FuncArg& arg = _x86Decl.getArgument(i); if (debug) snprintf(argName, ASMJIT_ARRAY_SIZE(argNameStorage), "arg_%u", i); uint32_t size = X86Util::getVarSizeFromVarType(arg.getVarType()); X86CompilerVar* cv = x86Compiler->_newVar(argName, arg.getVarType(), size); if (arg.getRegIndex() != kRegIndexInvalid) { cv->_isRegArgument = true; cv->regIndex = arg.getRegIndex(); } if (arg.getStackOffset() != kFuncStackInvalid) { cv->_isMemArgument = true; cv->homeMemoryOffset = arg.getStackOffset(); } _vars[i] = cv; } } void X86CompilerFuncDecl::_prepareVariables(CompilerItem* first) { uint32_t count = _x86Decl.getArgumentsCount(); if (count == 0) return; for (uint32_t i = 0; i < count; i++) { X86CompilerVar* cv = getVar(i); // This is where variable scope starts. cv->firstItem = first; // If this will not be changed then it will be deallocated immediately. cv->lastItem = first; } } void X86CompilerFuncDecl::_allocVariables(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); uint32_t count = getDecl()->getArgumentsCount(); if (count == 0) return; for (uint32_t i = 0; i < count; i++) { X86CompilerVar* cv = getVar(i); if (cv->firstItem != NULL || cv->isArgument()) { // Variable is used. if (cv->regIndex != kRegIndexInvalid) { cv->state = kVarStateReg; // If variable is in register -> mark it as changed so it will not be // lost by first spill. cv->changed = true; x86Context._allocatedVariable(cv); } else if (cv->isMemArgument()) { cv->state = kVarStateMem; } } else { // Variable is not used. cv->regIndex = kRegIndexInvalid; } } } void X86CompilerFuncDecl::_preparePrologEpilog(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); const X86CpuInfo* cpuInfo = X86CpuInfo::getGlobal(); clearFuncFlag( kX86FuncFlagPushPop | kX86FuncFlagEmitEmms | kX86FuncFlagEmitSFence | kX86FuncFlagEmitLFence | kX86FuncFlagAssume16ByteAlignment | kX86FuncFlagPerform16ByteAlignment); uint32_t accessibleMemoryBelowStack = 0; if (getDecl()->getConvention() == kX86FuncConvX64U) accessibleMemoryBelowStack = 128; if (getHint(kX86FuncHintAssume16ByteAlignment )) setFuncFlag(kX86FuncFlagAssume16ByteAlignment); if (getHint(kX86FuncHintPerform16ByteAlignment)) setFuncFlag(kX86FuncFlagPerform16ByteAlignment); if (getHint(kFuncHintNaked) != 0) setFuncFlag(kFuncFlagIsNaked); if (isCaller() && (x86Context._memBytesTotal > 0 || isAssumed16ByteAlignment())) setFuncFlag(kX86FuncFlagIsEspAdjusted); if (x86Context._memBytesTotal > accessibleMemoryBelowStack) setFuncFlag(kX86FuncFlagIsEspAdjusted); if (getHint(kX86FuncHintPushPop) != 0) setFuncFlag(kX86FuncFlagPushPop); if (getHint(kX86FuncHintEmms) != 0) setFuncFlag(kX86FuncFlagEmitEmms); if (getHint(kX86FuncHintSFence) != 0) setFuncFlag(kX86FuncFlagEmitSFence); if (getHint(kX86FuncHintLFence) != 0) setFuncFlag(kX86FuncFlagEmitLFence); // Updated to respect comment from issue #47, align also when using MMX code. if (!isAssumed16ByteAlignment() && !isNaked() && (x86Context._mem16BlocksCount + (x86Context._mem8BlocksCount > 0))) { // Have to align stack to 16-bytes. setFuncFlag(kX86FuncFlagIsEspAdjusted | kX86FuncFlagPerform16ByteAlignment); } _gpModifiedAndPreserved = x86Context._modifiedGpRegisters & _x86Decl.getGpPreservedMask() & (~IntUtil::maskFromIndex(kX86RegIndexEsp)); _mmModifiedAndPreserved = x86Context._modifiedMmRegisters & _x86Decl.getMmPreservedMask(); _xmmModifiedAndPreserved = x86Context._modifiedXmmRegisters & _x86Decl.getXmmPreservedMask(); _movDqInstCode = (isAssumed16ByteAlignment() | isPerformed16ByteAlignment()) ? kX86InstMovDQA : kX86InstMovDQU; // Prolog & Epilog stack size. { int32_t memGpSize = IntUtil::bitCount(_gpModifiedAndPreserved) * sizeof(intptr_t); int32_t memMmSize = IntUtil::bitCount(_mmModifiedAndPreserved) * 8; int32_t memXmmSize = IntUtil::bitCount(_xmmModifiedAndPreserved) * 16; if (hasFuncFlag(kX86FuncFlagPushPop)) { _pePushPopStackSize = memGpSize; _peMovStackSize = memXmmSize + IntUtil::align(memMmSize, 16); } else { _pePushPopStackSize = 0; _peMovStackSize = memXmmSize + IntUtil::align(memMmSize + memGpSize, 16); } } if (isPerformed16ByteAlignment()) { _peAdjustStackSize += IntUtil::delta(_pePushPopStackSize, 16); } else { int32_t v = 16 - sizeof(uintptr_t); if (!isNaked()) v -= sizeof(uintptr_t); v -= _pePushPopStackSize & 15; if (v < 0) v += 16; _peAdjustStackSize = v; //_peAdjustStackSize += IntUtil::delta(_pePushPopStackSize + v, 16); } // Memory stack size. _memStackSize = x86Context._memBytesTotal; _memStackSize16 = IntUtil::align(_memStackSize, 16); if (isNaked()) { x86Context._argumentsBaseReg = kX86RegIndexEsp; x86Context._argumentsBaseOffset = hasFuncFlag(kX86FuncFlagIsEspAdjusted) ? (_funcCallStackSize + _memStackSize16 + _peMovStackSize + _pePushPopStackSize + _peAdjustStackSize) : (_pePushPopStackSize); } else { x86Context._argumentsBaseReg = kX86RegIndexEbp; x86Context._argumentsBaseOffset = sizeof(sysint_t); } x86Context._variablesBaseReg = kX86RegIndexEsp; x86Context._variablesBaseOffset = _funcCallStackSize; if (!hasFuncFlag(kX86FuncFlagIsEspAdjusted)) x86Context._variablesBaseOffset = -_memStackSize16 - _peMovStackSize - _peAdjustStackSize; } void X86CompilerFuncDecl::_dumpFunction(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); Logger* logger = x86Compiler->getLogger(); ASMJIT_ASSERT(logger != NULL); uint32_t i; char _buf[1024]; char* p; // Log function prototype. { uint32_t argumentsCount = _x86Decl.getArgumentsCount(); bool first = true; logger->logString("; Function Prototype:\n"); logger->logString(";\n"); for (i = 0; i < argumentsCount; i++) { const FuncArg& a = _x86Decl.getArgument(i); X86CompilerVar* cv = getVar(i); if (first) { logger->logString("; IDX| Type | Sz | Home |\n"); logger->logString("; ---+----------+----+----------------+\n"); } char* memHome = memHome = _buf; if (a.hasRegIndex()) { Reg regOp(a.getRegIndex() | kX86RegTypeGpz, 0); X86Assembler_dumpOperand(memHome, ®Op, kX86RegTypeGpz, 0)[0] = '\0'; } else { Mem memOp; memOp._mem.base = kX86RegIndexEsp; memOp._mem.displacement = a.getStackOffset(); X86Assembler_dumpOperand(memHome, &memOp, kX86RegTypeGpz, 0)[0] = '\0'; } logger->logFormat("; %-3u| %-9s| %-3u| %-15s|\n", // Argument index. i, // Argument type. cv->getType() < kX86VarTypeCount ? x86VarInfo[cv->getType()].getName() : "invalid", // Argument size. cv->getSize(), // Argument memory home. memHome ); first = false; } logger->logString(";\n"); } // Log variables. { uint32_t variablesCount = (uint32_t)x86Compiler->_vars.getLength(); bool first = true; logger->logString("; Variables:\n"); logger->logString(";\n"); for (i = 0; i < variablesCount; i++) { X86CompilerVar* cv = static_cast(x86Compiler->_vars[i]); // If this variable is not related to this function then skip it. if (cv->funcScope != this) continue; // Get some information about variable type. const X86VarInfo& vinfo = x86VarInfo[cv->getType()]; if (first) { logger->logString("; ID | Type | Sz | Home | Register Access | Memory Access |\n"); logger->logString("; ---+----------+----+----------------+-------------------+-------------------+\n"); } char* memHome = (char*)"[None]"; if (cv->homeMemoryData != NULL) { VarMemBlock* memBlock = reinterpret_cast(cv->homeMemoryData); memHome = _buf; Mem memOp; if (cv->isMemArgument()) { const FuncArg& a = _x86Decl.getArgument(i); memOp._mem.base = x86Context._argumentsBaseReg; memOp._mem.displacement += x86Context._argumentsBaseOffset; memOp._mem.displacement += a.getStackOffset(); } else { memOp._mem.base = x86Context._variablesBaseReg; memOp._mem.displacement += x86Context._variablesBaseOffset; memOp._mem.displacement += memBlock->offset; } X86Assembler_dumpOperand(memHome, &memOp, kX86RegTypeGpz, 0)[0] = '\0'; } logger->logFormat("; %-3u| %-9s| %-3u| %-15s| r=%-4uw=%-4ux=%-4u| r=%-4uw=%-4ux=%-4u|\n", // Variable id. (uint)(i & kOperandIdValueMask), // Variable type. cv->getType() < kX86VarTypeCount ? vinfo.getName() : "invalid", // Variable size. cv->getSize(), // Variable memory home. memHome, // Register access count. (unsigned int)cv->regReadCount, (unsigned int)cv->regWriteCount, (unsigned int)cv->regRwCount, // Memory access count. (unsigned int)cv->memReadCount, (unsigned int)cv->memWriteCount, (unsigned int)cv->memRwCount ); first = false; } logger->logString(";\n"); } // Log modified registers. { p = _buf; uint32_t r; uint32_t modifiedRegisters = 0; for (r = 0; r < 3; r++) { bool first = true; uint32_t regs; uint32_t type; switch (r) { case 0: regs = x86Context._modifiedGpRegisters; type = kX86RegTypeGpz; p = StringUtil::copy(p, "; GP : "); break; case 1: regs = x86Context._modifiedMmRegisters; type = kX86RegTypeMm; p = StringUtil::copy(p, "; MM : "); break; case 2: regs = x86Context._modifiedXmmRegisters; type = kX86RegTypeXmm; p = StringUtil::copy(p, "; XMM: "); break; default: ASMJIT_ASSERT(0); } for (i = 0; i < kX86RegNumBase; i++) { if ((regs & IntUtil::maskFromIndex(i)) != 0) { if (!first) { *p++ = ','; *p++ = ' '; } p = X86Assembler_dumpRegister(p, type, i); first = false; modifiedRegisters++; } } *p++ = '\n'; } *p = '\0'; logger->logFormat("; Modified registers (%u):\n", (unsigned int)modifiedRegisters); logger->logString(_buf); } logger->logString("\n"); } void X86CompilerFuncDecl::_emitProlog(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // -------------------------------------------------------------------------- // [Init] // -------------------------------------------------------------------------- uint32_t i, mask; uint32_t preservedGP = _gpModifiedAndPreserved; uint32_t preservedMM = _mmModifiedAndPreserved; uint32_t preservedXMM = _xmmModifiedAndPreserved; int32_t stackOffset = _getRequiredStackOffset(); int32_t stackPos; // -------------------------------------------------------------------------- // [Prolog] // -------------------------------------------------------------------------- if (x86Compiler->getLogger()) x86Compiler->comment("Prolog"); // Emit standard prolog entry code (but don't do it if function is set to be // naked). // // Also see the _prologEpilogStackAdjust variable. If function is naked (so // prolog and epilog will not contain "push ebp" and "mov ebp, esp", we need // to adjust stack by 8 bytes in 64-bit mode (this will give us that stack // will remain aligned to 16 bytes). if (!isNaked()) { x86Compiler->emit(kX86InstPush, zbp); x86Compiler->emit(kX86InstMov, zbp, zsp); } // Align manually stack-pointer to 16-bytes. if (isPerformed16ByteAlignment()) { ASMJIT_ASSERT(!isNaked()); x86Compiler->emit(kX86InstAnd, zsp, imm(-16)); } // -------------------------------------------------------------------------- // [Save Gp - Push/Pop] // -------------------------------------------------------------------------- if (preservedGP != 0 && hasFuncFlag(kX86FuncFlagPushPop)) { for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (preservedGP & mask) x86Compiler->emit(kX86InstPush, gpz(i)); } } // -------------------------------------------------------------------------- // [Adjust Scack] // -------------------------------------------------------------------------- if (isEspAdjusted()) { stackPos = _memStackSize16 + _funcCallStackSize; if (stackOffset != 0) x86Compiler->emit(kX86InstSub, zsp, imm(stackOffset)); } else { stackPos = -(_peMovStackSize + _peAdjustStackSize); //if (_pePushPop) stackPos += IntUtil::bitCount(preservedGP) * sizeof(sysint_t); } // -------------------------------------------------------------------------- // [Save Xmm - MovDqa/MovDqu] // -------------------------------------------------------------------------- if (preservedXMM != 0) { for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (preservedXMM & mask) { x86Compiler->emit(_movDqInstCode, dqword_ptr(zsp, stackPos), xmm(i)); stackPos += 16; } } } // -------------------------------------------------------------------------- // [Save Mm - MovQ] // -------------------------------------------------------------------------- if (preservedMM != 0) { for (i = 0, mask = 1; i < 8; i++, mask <<= 1) { if (preservedMM & mask) { x86Compiler->emit(kX86InstMovQ, qword_ptr(zsp, stackPos), mm(i)); stackPos += 8; } } } // -------------------------------------------------------------------------- // [Save Gp - Mov] // -------------------------------------------------------------------------- if (preservedGP != 0 && !hasFuncFlag(kX86FuncFlagPushPop)) { for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (preservedGP & mask) { x86Compiler->emit(kX86InstMov, sysint_ptr(zsp, stackPos), gpz(i)); stackPos += sizeof(sysint_t); } } } // -------------------------------------------------------------------------- // [...] // -------------------------------------------------------------------------- if (x86Compiler->getLogger()) x86Compiler->comment("Body"); } void X86CompilerFuncDecl::_emitEpilog(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); const X86CpuInfo* cpuInfo = X86CpuInfo::getGlobal(); // -------------------------------------------------------------------------- // [Init] // -------------------------------------------------------------------------- uint32_t i, mask; uint32_t preservedGP = _gpModifiedAndPreserved; uint32_t preservedMM = _mmModifiedAndPreserved; uint32_t preservedXMM = _xmmModifiedAndPreserved; int32_t stackOffset = _getRequiredStackOffset(); int32_t stackPos; if (isEspAdjusted()) stackPos = _memStackSize16 + _funcCallStackSize; else stackPos = -(_peMovStackSize + _peAdjustStackSize); // -------------------------------------------------------------------------- // [Epilog] // -------------------------------------------------------------------------- if (x86Compiler->getLogger()) x86Compiler->comment("Epilog"); // -------------------------------------------------------------------------- // [Restore Xmm - MovDqa/ModDqu] // -------------------------------------------------------------------------- if (preservedXMM != 0) { for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (preservedXMM & mask) { x86Compiler->emit(_movDqInstCode, xmm(i), dqword_ptr(zsp, stackPos)); stackPos += 16; } } } // -------------------------------------------------------------------------- // [Restore Mm - MovQ] // -------------------------------------------------------------------------- if (preservedMM != 0) { for (i = 0, mask = 1; i < 8; i++, mask <<= 1) { if (preservedMM & mask) { x86Compiler->emit(kX86InstMovQ, mm(i), qword_ptr(zsp, stackPos)); stackPos += 8; } } } // -------------------------------------------------------------------------- // [Restore Gp - Mov] // -------------------------------------------------------------------------- if (preservedGP != 0 && !hasFuncFlag(kX86FuncFlagPushPop)) { for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (preservedGP & mask) { x86Compiler->emit(kX86InstMov, gpz(i), sysint_ptr(zsp, stackPos)); stackPos += sizeof(sysint_t); } } } // -------------------------------------------------------------------------- // [Adjust Stack] // -------------------------------------------------------------------------- if (isEspAdjusted() && stackOffset != 0) x86Compiler->emit(kX86InstAdd, zsp, imm(stackOffset)); // -------------------------------------------------------------------------- // [Restore Gp - Push/Pop] // -------------------------------------------------------------------------- if (preservedGP != 0 && hasFuncFlag(kX86FuncFlagPushPop)) { for (i = kX86RegNumGp - 1, mask = 1 << i; (int32_t)i >= 0; i--, mask >>= 1) { if (preservedGP & mask) x86Compiler->emit(kX86InstPop, gpz(i)); } } // -------------------------------------------------------------------------- // [Emms] // -------------------------------------------------------------------------- if (hasFuncFlag(kX86FuncFlagEmitEmms)) x86Compiler->emit(kX86InstEmms); // -------------------------------------------------------------------------- // [MFence/SFence/LFence] // -------------------------------------------------------------------------- if (hasFuncFlag(kX86FuncFlagEmitSFence) & hasFuncFlag(kX86FuncFlagEmitLFence)) x86Compiler->emit(kX86InstMFence); else if (hasFuncFlag(kX86FuncFlagEmitSFence)) x86Compiler->emit(kX86InstSFence); else if (hasFuncFlag(kX86FuncFlagEmitLFence)) x86Compiler->emit(kX86InstLFence); // -------------------------------------------------------------------------- // [Epilog] // -------------------------------------------------------------------------- // Emit standard epilog leave code (if needed). if (!isNaked()) { // AMD seems to prefer LEAVE instead of MOV/POP sequence. if (cpuInfo->getVendorId() == kCpuAmd) { x86Compiler->emit(kX86InstLeave); } else { x86Compiler->emit(kX86InstMov, zsp, zbp); x86Compiler->emit(kX86InstPop, zbp); } } // Emit return. if (_x86Decl.getCalleePopsStack()) x86Compiler->emit(kX86InstRet, imm((int16_t)_x86Decl.getArgumentsStackSize())); else x86Compiler->emit(kX86InstRet); } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Function-Call] // ============================================================================ void X86CompilerFuncDecl::reserveStackForFunctionCall(int32_t size) { size = IntUtil::align(size, 16); if (size > _funcCallStackSize) _funcCallStackSize = size; setFuncFlag(kFuncFlagIsCaller); } // ============================================================================ // [AsmJit::X86CompilerFuncEnd - Construction / Destruction] // ============================================================================ X86CompilerFuncEnd::X86CompilerFuncEnd(X86Compiler* x86Compiler, X86CompilerFuncDecl* func) : CompilerFuncEnd(x86Compiler, func) { } X86CompilerFuncEnd::~X86CompilerFuncEnd() { } // ============================================================================ // [AsmJit::X86CompilerFuncEnd - Interface] // ============================================================================ void X86CompilerFuncEnd::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset++; } CompilerItem* X86CompilerFuncEnd::translate(CompilerContext& cc) { _isTranslated = true; return NULL; } // ============================================================================ // [AsmJit::X86CompilerFuncRet - Construction / Destruction] // ============================================================================ X86CompilerFuncRet::X86CompilerFuncRet(X86Compiler* x86Compiler, X86CompilerFuncDecl* func, const Operand* first, const Operand* second) : CompilerFuncRet(x86Compiler, func, first, second) { /* // TODO:? // Check whether the return value is compatible. uint32_t retValType = function->_x86Decl.getReturnType(); bool valid = false; switch (retValType) { case kX86VarTypeGpd: case kX86VarTypeGpq: if ((_ret[0].isVar() && (reinterpret_cast(_ret[0]).isGpVar())) || (_ret[0].isImm())) { valid = true; } break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: if ((_ret[0].isVar() && (reinterpret_cast(_ret[0]).isX87Var() || reinterpret_cast(_ret[0]).isXmmVar() )) ) { valid = true; } break; case kX86VarTypeMm: break; case kVarTypeInvalid: if (_ret[0].isNone() && _ret[1].isNone()) { valid = true; } break; default: break; } // Incompatible return value. if (!valid) { c->setError(kErrorIncompatibleReturnType); } */ } X86CompilerFuncRet::~X86CompilerFuncRet() { } // ============================================================================ // [AsmJit::X86CompilerFuncRet - Interface] // ============================================================================ void X86CompilerFuncRet::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); uint32_t retValType = getFunc()->_x86Decl.getReturnType(); _offset = x86Context._currentOffset; if (retValType != kVarTypeInvalid) { uint32_t i; for (i = 0; i < 2; i++) { Operand& o = _ret[i]; if (o.isVar()) { ASMJIT_ASSERT(o.getId() != kInvalidValue); X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); // First item (begin of variable scope). if (cv->firstItem == NULL) cv->firstItem = this; // Last item (end of variable scope). cv->lastItem = this; if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; cv->regReadCount++; if (X86Util::isVarTypeInt(cv->getType()) && X86Util::isVarTypeInt(retValType)) { x86Context._newRegisterHomeIndex(cv, (i == 0) ? kX86RegIndexEax : kX86RegIndexEdx); } } } } x86Context._currentOffset++; } CompilerItem* X86CompilerFuncRet::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); // Check whether the return value is compatible. uint32_t retValType = getFunc()->getDecl()->getReturnType(); uint32_t i; switch (retValType) { case kX86VarTypeGpd: case kX86VarTypeGpq: for (i = 0; i < 2; i++) { uint32_t dstIndex = (i == 0) ? kX86RegIndexEax : kX86RegIndexEdx; uint32_t srcIndex; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isGpVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srcIndex = cv->regIndex; if (srcIndex == kRegIndexInvalid) x86Compiler->emit(kX86InstMov, gpz(dstIndex), x86Context._getVarMem(cv)); else if (dstIndex != srcIndex) x86Compiler->emit(kX86InstMov, gpz(dstIndex), gpz(srcIndex)); } } else if (_ret[i].isImm()) { x86Compiler->emit(kX86InstMov, gpz(dstIndex), _ret[i]); } } break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // There is case that we need to return two values (Unix-ABI specific): // - FLD #2 //- FLD #1 i = 2; do { i--; uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; if (srci != kRegIndexInvalid) x86Context.saveXmmVar(cv); switch (cv->getType()) { case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstFLd, _BaseVarMem(reinterpret_cast(_ret[i]), 4)); break; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstFLd, _BaseVarMem(reinterpret_cast(_ret[i]), 8)); break; } } } } while (i != 0); break; case kX86VarTypeMm: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isGpVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = _ret[i].isRegType(kX86RegTypeGpq) ? kX86InstMovQ : kX86InstMovD; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv)); else #if defined(ASMJIT_X86) x86Compiler->emit(inst, mm(dsti), gpd(srci)); #else x86Compiler->emit(inst, mm(dsti), _ret[i].isRegType(kX86RegTypeGpq) ? gpq(srci) : gpd(srci)); #endif } else if (reinterpret_cast(_ret[i]).isMmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = kX86InstMovQ; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(inst, mm(dsti), mm(srci)); } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = kX86InstMovQ; if (reinterpret_cast(_ret[i]).getVarType() == kX86VarTypeXmmSS) inst = kX86InstMovD; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(inst, mm(dsti), xmm(srci)); } } } break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isGpVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = _ret[i].isRegType(kX86RegTypeGpq) ? kX86InstMovQ : kX86InstMovD; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, xmm(dsti), x86Context._getVarMem(cv)); else #if defined(ASMJIT_X86) x86Compiler->emit(inst, xmm(dsti), gpd(srci)); #else x86Compiler->emit(inst, xmm(dsti), _ret[i].isRegType(kX86RegTypeGpq) ? gpq(srci) : gpd(srci)); #endif } else if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isMmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovQ, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstMovQ, xmm(dsti), mm(srci)); } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci)); } } } break; case kX86VarTypeXmmSS: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; switch (cv->getType()) { case kX86VarTypeXmm: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovSS, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstMovSS, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstCvtSD2SS, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstCvtSD2SS, xmm(dsti), xmm(srci)); break; } } } } break; case kX86VarTypeXmmSD: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; switch (cv->getType()) { case kX86VarTypeXmm: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstCvtSS2SD, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstCvtSS2SD, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovSD, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstMovSD, xmm(dsti), xmm(srci)); break; } } } } break; case kInvalidValue: default: break; } if (mustEmitJump()) { x86Context._isUnreachable = 1; } for (i = 0; i < 2; i++) { if (_ret[i].isVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); x86Context._unuseVarOnEndOfScope(this, cv); } } return translated(); } void X86CompilerFuncRet::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); if (mustEmitJump()) x86Asm.jmp(getFunc()->getExitLabel()); } // ============================================================================ // [AsmJit::X86CompilerFuncRet - Misc] // ============================================================================ int X86CompilerFuncRet::getMaxSize() const { return mustEmitJump() ? 15 : 0; } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Construction / Destruction] // ============================================================================ X86CompilerFuncCall::X86CompilerFuncCall(X86Compiler* x86Compiler, X86CompilerFuncDecl* caller, const Operand* target) : CompilerFuncCall(x86Compiler, caller, target), _gpParams(0), _mmParams(0), _xmmParams(0), _variablesCount(0), _variables(NULL) { } X86CompilerFuncCall::~X86CompilerFuncCall() { memset(_argumentToVarRecord, 0, sizeof(VarCallRecord*) * kFuncArgsMax); } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Interface] // ============================================================================ void X86CompilerFuncCall::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // Prepare is similar to X86CompilerInst::prepare(). We collect unique variables // and update statistics, but we don't use standard alloc/free register calls. // // The calling function is also unique in variable allocator point of view, // because we need to alloc some variables that may be destroyed be the // callee (okay, may not, but this is not guaranteed). _offset = x86Context._currentOffset; // Tell EFunction that another function will be called inside. It needs this // information to reserve stack for the call and to mark esp adjustable. getCaller()->reserveStackForFunctionCall(static_cast(_x86Decl.getArgumentsStackSize())); uint32_t i; uint32_t argumentsCount = _x86Decl.getArgumentsCount(); uint32_t operandsCount = argumentsCount; uint32_t variablesCount = 0; // Create registers used as arguments mask. for (i = 0; i < argumentsCount; i++) { const FuncArg& fArg = _x86Decl.getArguments()[i]; if (fArg.hasRegIndex()) { switch (fArg.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: _gpParams |= IntUtil::maskFromIndex(fArg.getRegIndex()); break; case kX86VarTypeMm: _mmParams |= IntUtil::maskFromIndex(fArg.getRegIndex()); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: _xmmParams |= IntUtil::maskFromIndex(fArg.getRegIndex()); break; default: ASMJIT_ASSERT(0); } } else { x86Context.getFunc()->setFuncFlag(kX86FuncFlagIsEspAdjusted); } } // Call address. operandsCount++; // The first and the second return value. if (!_ret[0].isNone()) operandsCount++; if (!_ret[1].isNone()) operandsCount++; #define __GET_VARIABLE(__vardata__) \ { \ X86CompilerVar* _candidate = __vardata__; \ \ for (var = cur; ;) \ { \ if (var == _variables) \ { \ var = cur++; \ var->vdata = _candidate; \ break; \ } \ \ var--; \ \ if (var->vdata == _candidate) \ { \ break; \ } \ } \ \ ASMJIT_ASSERT(var != NULL); \ } for (i = 0; i < operandsCount; i++) { Operand& o = (i < argumentsCount) ? (_args[i]) : (i == argumentsCount ? _target : _ret[i - argumentsCount - 1]); if (o.isVar()) { ASMJIT_ASSERT(o.getId() != kInvalidValue); X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; variablesCount++; } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); x86Context._markMemoryUsed(cv); if (!x86Context._isActive(cv)) x86Context._addActive(cv); continue; } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.base); ASMJIT_ASSERT(cv != NULL); if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; variablesCount++; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.index); ASMJIT_ASSERT(cv != NULL); if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; variablesCount++; } } } // Traverse all active variables and set their funcCall pointer to this // call. This information can be used to choose between the preserved-first // and preserved-last register allocation. if (x86Context._active) { X86CompilerVar* first = static_cast(x86Context._active); X86CompilerVar* active = first; do { if (active->funcCall == NULL) active->funcCall = this; active = active->nextActive; } while (active != first); } if (!variablesCount) { x86Context._currentOffset++; return; } _variables = reinterpret_cast(x86Compiler->getZoneMemory().alloc(sizeof(VarCallRecord) * variablesCount)); if (!_variables) { x86Compiler->setError(kErrorNoHeapMemory); x86Context._currentOffset++; return; } _variablesCount = variablesCount; memset(_variables, 0, sizeof(VarCallRecord) * variablesCount); VarCallRecord* cur = _variables; VarCallRecord* var = NULL; for (i = 0; i < operandsCount; i++) { Operand& o = (i < argumentsCount) ? (_args[i]) : (i == argumentsCount ? _target : _ret[i - argumentsCount - 1]); if (o.isVar()) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); __GET_VARIABLE(cv) _argumentToVarRecord[i] = var; if (i < argumentsCount) { const FuncArg& fArg = _x86Decl.getArgument(i); if (fArg.hasRegIndex()) { x86Context._newRegisterHomeIndex(cv, fArg.getRegIndex()); switch (fArg.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: var->flags |= VarCallRecord::kFlagInGp; var->inCount++; break; case kX86VarTypeMm: var->flags |= VarCallRecord::kFlagInMm; var->inCount++; break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: var->flags |= VarCallRecord::kFlagInXmm; var->inCount++; break; default: ASMJIT_ASSERT(0); } } else { var->inCount++; } cv->regReadCount++; } else if (i == argumentsCount) { uint32_t mask = (~_x86Decl.getGpPreservedMask()) & (~_x86Decl.getGpArgumentsMask()) & (IntUtil::maskUpToIndex(kX86RegNumGp)); x86Context._newRegisterHomeIndex(cv, IntUtil::findFirstBit(mask)); x86Context._newRegisterHomeMask(cv, mask); var->flags |= VarCallRecord::kFlagCallReg; cv->regReadCount++; } else { switch (cv->getType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutEax; else var->flags |= VarCallRecord::kFlagOutEdx; break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: #if defined(ASMJIT_X86) if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutSt0; else var->flags |= VarCallRecord::kFlagOutSt1; #else if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutXmm0; else var->flags |= VarCallRecord::kFlagOutXmm1; #endif break; case kX86VarTypeMm: var->flags |= VarCallRecord::kFlagOutMm0; break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutXmm0; else var->flags |= VarCallRecord::kFlagOutXmm1; break; case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: #if defined(ASMJIT_X86) if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutSt0; else var->flags |= VarCallRecord::kFlagOutSt1; #else if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutXmm0; else var->flags |= VarCallRecord::kFlagOutXmm1; #endif break; default: ASMJIT_ASSERT(0); } cv->regWriteCount++; } } else if (o.isMem()) { ASMJIT_ASSERT(i == argumentsCount); if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); cv->memReadCount++; } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(reinterpret_cast(o).getBase()); ASMJIT_ASSERT(cv != NULL); cv->regReadCount++; __GET_VARIABLE(cv) var->flags |= VarCallRecord::kFlagCallReg | VarCallRecord::kFlagCallMem; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(reinterpret_cast(o).getIndex()); ASMJIT_ASSERT(cv != NULL); cv->regReadCount++; __GET_VARIABLE(cv) var->flags |= VarCallRecord::kFlagCallReg | VarCallRecord::kFlagCallMem; } } } // Traverse all variables and update firstItem / lastItem. This // function is called from iterator that scans items using forward // direction so we can use this knowledge to optimize the process. // // Same code is in X86CompilerInst::prepare(). for (i = 0; i < _variablesCount; i++) { X86CompilerVar* v = _variables[i].vdata; // First item (begin of variable scope). if (v->firstItem == NULL) v->firstItem = this; // Last item (end of variable scope). v->lastItem = this; } x86Context._currentOffset++; #undef __GET_VARIABLE } CompilerItem* X86CompilerFuncCall::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); uint32_t i; uint32_t preserved, mask; uint32_t temporaryGpReg; uint32_t temporaryXmmReg; uint32_t offset = x86Context._currentOffset; // Constants. const FuncArg* targs = _x86Decl.getArguments(); uint32_t argumentsCount = _x86Decl.getArgumentsCount(); uint32_t variablesCount = _variablesCount; // Processed arguments kFuncArgsMax. uint8_t processed[kFuncArgsMax] = { 0 }; x86Compiler->comment("Call"); // These variables are used by the instruction so we set current offset // to their work offsets -> The getSpillCandidate() method never returns // the variable used by this instruction. for (i = 0; i < variablesCount; i++) { _variables[i].vdata->workOffset = offset; // Init back-reference to VarCallRecord. _variables[i].vdata->tPtr = &_variables[i]; } // -------------------------------------------------------------------------- // STEP 1: // // Spill variables which are not used by the function call and have to // be destroyed. These registers may be used by callee. // -------------------------------------------------------------------------- preserved = _x86Decl.getGpPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { X86CompilerVar* cv = x86Context._x86State.gp[i]; if (cv && cv->workOffset != offset && (preserved & mask) == 0) x86Context.spillGpVar(cv); } preserved = _x86Decl.getMmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { X86CompilerVar* cv = x86Context._x86State.mm[i]; if (cv && cv->workOffset != offset && (preserved & mask) == 0) x86Context.spillMmVar(cv); } preserved = _x86Decl.getXmmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { X86CompilerVar* cv = x86Context._x86State.xmm[i]; if (cv && cv->workOffset != offset && (preserved & mask) == 0) x86Context.spillXmmVar(cv); } // -------------------------------------------------------------------------- // STEP 2: // // Move all arguments to the stack which all already in registers. // -------------------------------------------------------------------------- for (i = 0; i < argumentsCount; i++) { if (processed[i]) continue; const FuncArg& argType = targs[i]; if (argType.hasRegIndex()) continue; Operand& operand = _args[i]; if (operand.isVar()) { VarCallRecord* rec = _argumentToVarRecord[i]; X86CompilerVar* cv = x86Compiler->_getVar(operand.getId()); if (cv->regIndex != kRegIndexInvalid) { _moveAllocatedVariableToStack(cc, cv, argType); rec->inDone++; processed[i] = true; } } } // -------------------------------------------------------------------------- // STEP 3: // // Spill all non-preserved variables we moved to stack in STEP #2. // -------------------------------------------------------------------------- for (i = 0; i < argumentsCount; i++) { VarCallRecord* rec = _argumentToVarRecord[i]; if (!rec || processed[i]) continue; if (rec->inDone >= rec->inCount) { X86CompilerVar* cv = rec->vdata; if (cv->regIndex == kRegIndexInvalid) continue; if (rec->outCount) { // Variable will be rewritten by function return value, it's not needed // to spill it. It will be allocated again by X86CompilerFuncCall. x86Context.unuseVar(rec->vdata, kVarStateUnused); } else { switch (cv->getType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: if ((_x86Decl.getGpPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0) x86Context.spillGpVar(cv); break; case kX86VarTypeMm: if ((_x86Decl.getMmPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0) x86Context.spillMmVar(cv); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: if ((_x86Decl.getXmmPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0) x86Context.spillXmmVar(cv); break; } } } } // -------------------------------------------------------------------------- // STEP 4: // // Get temporary register that we can use to pass input function arguments. // Now it's safe to do, because the non-needed variables should be spilled. // -------------------------------------------------------------------------- temporaryGpReg = _findTemporaryGpRegister(cc); temporaryXmmReg = _findTemporaryXmmRegister(cc); // If failed to get temporary register then we need just to pick one. if (temporaryGpReg == kRegIndexInvalid) { // TODO. } if (temporaryXmmReg == kRegIndexInvalid) { // TODO. } // -------------------------------------------------------------------------- // STEP 5: // // Move all remaining arguments to the stack (we can use temporary register). // or allocate it to the primary register. Also move immediates. // -------------------------------------------------------------------------- for (i = 0; i < argumentsCount; i++) { if (processed[i]) continue; const FuncArg& argType = targs[i]; if (argType.hasRegIndex()) continue; Operand& operand = _args[i]; if (operand.isVar()) { VarCallRecord* rec = _argumentToVarRecord[i]; X86CompilerVar* cv = x86Compiler->_getVar(operand.getId()); _moveSpilledVariableToStack(cc, cv, argType, temporaryGpReg, temporaryXmmReg); rec->inDone++; processed[i] = true; } else if (operand.isImm()) { // TODO. } } // -------------------------------------------------------------------------- // STEP 6: // // Allocate arguments to registers. // -------------------------------------------------------------------------- bool didWork; do { didWork = false; for (i = 0; i < argumentsCount; i++) { if (processed[i]) continue; VarCallRecord* rsrc = _argumentToVarRecord[i]; Operand& osrc = _args[i]; ASMJIT_ASSERT(osrc.isVar()); X86CompilerVar* vsrc = x86Compiler->_getVar(osrc.getId()); const FuncArg& srcArgType = targs[i]; X86CompilerVar* vdst = _getOverlappingVariable(cc, srcArgType); if (vsrc == vdst) { rsrc->inDone++; processed[i] = true; didWork = true; continue; } else if (vdst != NULL) { VarCallRecord* rdst = reinterpret_cast(vdst->tPtr); if (rdst == NULL) { x86Context.spillVar(vdst); vdst = NULL; } else if (rdst->inDone >= rdst->inCount && (rdst->flags & VarCallRecord::kFlagCallReg) == 0) { // Safe to spill. if (rdst->outCount || vdst->lastItem == this) x86Context.unuseVar(vdst, kVarStateUnused); else x86Context.spillVar(vdst); vdst = NULL; } else { uint32_t x = _x86Decl.findArgumentByRegCode(X86Util::getRegCodeFromVarType(vsrc->getType(), vsrc->regIndex)); bool doSpill = true; if ((vdst->getClass() & kX86VarClassGp) != 0) { // Try to emit mov to register which is possible for call() operand. if (x == kInvalidValue && (rdst->flags & VarCallRecord::kFlagCallReg) != 0) { uint32_t rIndex; uint32_t rBit; // The mask which contains registers which are not-preserved // (these that might be clobbered by the callee) and which are // not used to pass function arguments. Each register contained // in this mask is ideal to be used by call() instruction. uint32_t possibleMask = (~_x86Decl.getGpPreservedMask()) & (~_x86Decl.getGpArgumentsMask()) & (IntUtil::maskUpToIndex(kX86RegNumGp)); if (possibleMask != 0) { for (rIndex = 0, rBit = 1; rIndex < kX86RegNumGp; rIndex++, rBit <<= 1) { if ((possibleMask & rBit) != 0) { if (x86Context._x86State.gp[rIndex] == NULL) { // This is the best possible solution, the register is // free. We do not need to continue with this loop, the // rIndex will be used by the call(). break; } else { // Wait until the register is freed or try to find another. doSpill = false; didWork = true; } } } } else { // Try to find a register which is free and which is not used // to pass a function argument. possibleMask = _x86Decl.getGpPreservedMask(); for (rIndex = 0, rBit = 1; rIndex < kX86RegNumGp; rIndex++, rBit <<= 1) { if ((possibleMask & rBit) != 0) { // Found one. if (x86Context._x86State.gp[rIndex] == NULL) break; } } } if (rIndex < kX86RegNumGp) { if (temporaryGpReg == vsrc->regIndex) temporaryGpReg = rIndex; x86Compiler->emit(kX86InstMov, gpz(rIndex), gpz(vsrc->regIndex)); x86Context._x86State.gp[vsrc->regIndex] = NULL; x86Context._x86State.gp[rIndex] = vsrc; vsrc->regIndex = rIndex; x86Context._allocatedGpRegister(rIndex); doSpill = false; didWork = true; } } // Emit xchg instead of spill/alloc if possible. else if (x != kInvalidValue) { const FuncArg& dstArgType = targs[x]; if (X86Util::getVarClassFromVarType(dstArgType.getVarType()) == X86Util::getVarClassFromVarType(srcArgType.getVarType())) { uint32_t dstIndex = vdst->regIndex; uint32_t srcIndex = vsrc->regIndex; if (srcIndex == dstArgType.getRegIndex()) { #if defined(ASMJIT_X64) if (vdst->getType() != kX86VarTypeGpd || vsrc->getType() != kX86VarTypeGpd) x86Compiler->emit(kX86InstXchg, gpq(dstIndex), gpq(srcIndex)); else #endif x86Compiler->emit(kX86InstXchg, gpd(dstIndex), gpd(srcIndex)); x86Context._x86State.gp[srcIndex] = vdst; x86Context._x86State.gp[dstIndex] = vsrc; vdst->regIndex = srcIndex; vsrc->regIndex = dstIndex; rdst->inDone++; rsrc->inDone++; processed[i] = true; processed[x] = true; doSpill = false; } } } } if (doSpill) { x86Context.spillVar(vdst); vdst = NULL; } } } if (vdst == NULL) { VarCallRecord* rec = reinterpret_cast(vsrc->tPtr); _moveSrcVariableToRegister(cc, vsrc, srcArgType); switch (srcArgType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: x86Context._markGpRegisterModified(srcArgType.getRegIndex()); break; case kX86VarTypeMm: x86Context._markMmRegisterModified(srcArgType.getRegIndex()); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: x86Context._markMmRegisterModified(srcArgType.getRegIndex()); break; } rec->inDone++; processed[i] = true; } } } while (didWork); // -------------------------------------------------------------------------- // STEP 7: // // Allocate operand used by CALL instruction. // -------------------------------------------------------------------------- for (i = 0; i < variablesCount; i++) { VarCallRecord& r = _variables[i]; if ((r.flags & VarCallRecord::kFlagCallReg) && (r.vdata->regIndex == kRegIndexInvalid)) { // If the register is not allocated and the call form is 'call reg' then // it's possible to keep it in memory. if ((r.flags & VarCallRecord::kFlagCallMem) == 0) { _target = r.vdata->asGpVar().m(); break; } if (temporaryGpReg == kRegIndexInvalid) temporaryGpReg = _findTemporaryGpRegister(cc); x86Context.allocGpVar(r.vdata, IntUtil::maskFromIndex(temporaryGpReg), kVarAllocRegister | kVarAllocRead); } } x86Context.translateOperands(&_target, 1); // -------------------------------------------------------------------------- // STEP 8: // // Spill all preserved variables. // -------------------------------------------------------------------------- preserved = _x86Decl.getGpPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { X86CompilerVar* vdata = x86Context._x86State.gp[i]; if (vdata && (preserved & mask) == 0) { VarCallRecord* rec = reinterpret_cast(vdata->tPtr); if (rec && (rec->outCount || rec->flags & VarCallRecord::kFlagUnuseAfterUse || vdata->lastItem == this)) x86Context.unuseVar(vdata, kVarStateUnused); else x86Context.spillGpVar(vdata); } } preserved = _x86Decl.getMmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { X86CompilerVar* vdata = x86Context._x86State.mm[i]; if (vdata && (preserved & mask) == 0) { VarCallRecord* rec = reinterpret_cast(vdata->tPtr); if (rec && (rec->outCount || vdata->lastItem == this)) x86Context.unuseVar(vdata, kVarStateUnused); else x86Context.spillMmVar(vdata); } } preserved = _x86Decl.getXmmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { X86CompilerVar* vdata = x86Context._x86State.xmm[i]; if (vdata && (preserved & mask) == 0) { VarCallRecord* rec = reinterpret_cast(vdata->tPtr); if (rec && (rec->outCount || vdata->lastItem == this)) x86Context.unuseVar(vdata, kVarStateUnused); else x86Context.spillXmmVar(vdata); } } // -------------------------------------------------------------------------- // STEP 9: // // Emit CALL instruction. // -------------------------------------------------------------------------- x86Compiler->emit(kX86InstCall, _target); // Restore the stack offset. if (_x86Decl.getCalleePopsStack()) { int32_t s = static_cast(_x86Decl.getArgumentsStackSize()); if (s != 0) x86Compiler->emit(kX86InstSub, zsp, imm(s)); } // -------------------------------------------------------------------------- // STEP 10: // // Prepare others for return value(s) and cleanup. // -------------------------------------------------------------------------- // Clear temp data, see AsmJit::X86CompilerVar::temp why it's needed. for (i = 0; i < variablesCount; i++) { VarCallRecord* rec = &_variables[i]; X86CompilerVar* vdata = rec->vdata; if (rec->flags & (VarCallRecord::kFlagOutEax | VarCallRecord::kFlagOutEdx)) { if (vdata->getClass() & kX86VarClassGp) { x86Context.allocGpVar(vdata, IntUtil::maskFromIndex((rec->flags & VarCallRecord::kFlagOutEax) != 0 ? kX86RegIndexEax : kX86RegIndexEdx), kVarAllocRegister | kVarAllocWrite); vdata->changed = true; } } if (rec->flags & (VarCallRecord::kFlagOutMm0)) { if (vdata->getClass() & kX86VarClassMm) { x86Context.allocMmVar(vdata, IntUtil::maskFromIndex(kX86RegIndexMm0), kVarAllocRegister | kVarAllocWrite); vdata->changed = true; } } if (rec->flags & (VarCallRecord::kFlagOutXmm0 | VarCallRecord::kFlagOutXmm1)) { if (vdata->getClass() & kX86VarClassXmm) { x86Context.allocXmmVar(vdata, IntUtil::maskFromIndex((rec->flags & VarCallRecord::kFlagOutXmm0) != 0 ? kX86RegIndexXmm0 : kX86RegIndexXmm1), kVarAllocRegister | kVarAllocWrite); vdata->changed = true; } } if (rec->flags & (VarCallRecord::kFlagOutSt0 | VarCallRecord::kFlagOutSt1)) { if (vdata->getClass() & kX86VarClassXmm) { Mem mem(x86Context._getVarMem(vdata)); x86Context.unuseVar(vdata, kVarStateMem); switch (vdata->getType()) { case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: { mem.setSize(4); x86Compiler->emit(kX86InstFStP, mem); break; } case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: { mem.setSize(8); x86Compiler->emit(kX86InstFStP, mem); break; } default: { x86Compiler->comment("*** WARNING: Can't convert float return value to untyped XMM\n"); break; } } } } // Cleanup. vdata->tPtr = NULL; } for (i = 0; i < variablesCount; i++) { x86Context._unuseVarOnEndOfScope(this, &_variables[i]); } return translated(); } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Misc] // ============================================================================ int X86CompilerFuncCall::getMaxSize() const { // TODO: Instruction max size. return 15; } bool X86CompilerFuncCall::_tryUnuseVar(CompilerVar* _v) { X86CompilerVar* cv = static_cast(_v); for (uint32_t i = 0; i < _variablesCount; i++) { if (_variables[i].vdata == cv) { _variables[i].flags |= VarCallRecord::kFlagUnuseAfterUse; return true; } } return false; } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Helpers] // ============================================================================ uint32_t X86CompilerFuncCall::_findTemporaryGpRegister(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); uint32_t i; uint32_t mask; uint32_t passedGP = _x86Decl.getGpArgumentsMask(); uint32_t candidate = kRegIndexInvalid; // Find all registers used to pass function arguments. We shouldn't use these // if possible. for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (x86Context._x86State.gp[i] == NULL) { // If this register is used to pass arguments to function, we will mark // it and use it only if there is no other one. if ((passedGP & mask) != 0) candidate = i; else return i; } } return candidate; } uint32_t X86CompilerFuncCall::_findTemporaryXmmRegister(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); uint32_t i; uint32_t mask; uint32_t passedXMM = _x86Decl.getXmmArgumentsMask(); uint32_t candidate = kRegIndexInvalid; // Find all registers used to pass function arguments. We shouldn't use these // if possible. for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (x86Context._x86State.xmm[i] == NULL) { // If this register is used to pass arguments to function, we will mark // it and use it only if there is no other one. if ((passedXMM & mask) != 0) candidate = i; else return i; } } return candidate; } X86CompilerVar* X86CompilerFuncCall::_getOverlappingVariable(CompilerContext& cc, const FuncArg& argType) const { X86CompilerContext& x86Context = static_cast(cc); ASMJIT_ASSERT(argType.getVarType() != kVarTypeInvalid); switch (argType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: return x86Context._x86State.gp[argType.getRegIndex()]; case kX86VarTypeMm: return x86Context._x86State.mm[argType.getRegIndex()]; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: return x86Context._x86State.xmm[argType.getRegIndex()]; } return NULL; } void X86CompilerFuncCall::_moveAllocatedVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); ASMJIT_ASSERT(!argType.hasRegIndex()); ASMJIT_ASSERT(vdata->regIndex != kRegIndexInvalid); uint32_t src = vdata->regIndex; Mem dst = ptr(zsp, -(int)sizeof(uintptr_t) + argType.getStackOffset()); switch (vdata->getType()) { case kX86VarTypeGpd: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, dst, gpd(src)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: case kX86VarTypeMm: x86Compiler->emit(kX86InstMov, dst, gpq(src)); return; #endif // ASMJIT_X64 } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, dst, gpd(src)); return; case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, dst, gpq(src)); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, dst, gpq(src)); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (argType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeX87SS: case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovD, dst, mm(src)); return; case kX86VarTypeGpq: case kX86VarTypeMm: case kX86VarTypeX87SD: case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovQ, dst, mm(src)); return; } break; // We allow incompatible types here, because the called can convert them // to correct format before function is called. case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (argType.getVarType()) { case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQU, dst, xmm(src)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovUPS, dst, xmm(src)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovUPD, dst, xmm(src)); return; } break; case kX86VarTypeXmmSS: switch (argType.getVarType()) { case kX86VarTypeX87SS: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSS, dst, xmm(src)); return; } break; case kX86VarTypeXmmSD: switch (argType.getVarType()) { case kX86VarTypeX87SD: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, dst, xmm(src)); return; } break; } x86Compiler->setError(kErrorIncompatibleArgumentType); } void X86CompilerFuncCall::_moveSpilledVariableToStack(CompilerContext& cc, X86CompilerVar* cv, const FuncArg& argType, uint32_t temporaryGpReg, uint32_t temporaryXmmReg) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); ASMJIT_ASSERT(!argType.hasRegIndex()); ASMJIT_ASSERT(cv->regIndex == kRegIndexInvalid); Mem src = x86Context._getVarMem(cv); Mem dst = ptr(zsp, -(int)sizeof(sysint_t) + argType.getStackOffset()); switch (cv->getType()) { case kX86VarTypeGpd: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: case kX86VarTypeMm: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpq(temporaryGpReg)); return; #endif // ASMJIT_X64 } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg)); return; case kX86VarTypeGpq: case kX86VarTypeMm: x86Compiler->emit(kX86InstMov, gpq(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpq(temporaryGpReg)); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (argType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeX87SS: case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg)); return; case kX86VarTypeGpq: case kX86VarTypeMm: case kX86VarTypeX87SD: case kX86VarTypeXmmSD: // TODO return; } break; // We allow incompatible types here, because the caller can convert them // to correct format before function is called. case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (argType.getVarType()) { case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQU, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovDQU, dst, xmm(temporaryXmmReg)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovUPS, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovUPS, dst, xmm(temporaryXmmReg)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovUPD, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovUPD, dst, xmm(temporaryXmmReg)); return; } break; case kX86VarTypeXmmSS: switch (argType.getVarType()) { case kX86VarTypeX87SS: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSS, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovSS, dst, xmm(temporaryXmmReg)); return; } break; case kX86VarTypeXmmSD: switch (argType.getVarType()) { case kX86VarTypeX87SD: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovSD, dst, xmm(temporaryXmmReg)); return; } break; } x86Compiler->setError(kErrorIncompatibleArgumentType); } void X86CompilerFuncCall::_moveSrcVariableToRegister(CompilerContext& cc, X86CompilerVar* cv, const FuncArg& argType) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); uint32_t dst = argType.getRegIndex(); uint32_t src = cv->regIndex; if (src != kRegIndexInvalid) { switch (argType.getVarType()) { case kX86VarTypeGpd: switch (cv->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 x86Compiler->emit(kX86InstMov, gpd(dst), gpd(src)); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovD, gpd(dst), mm(src)); return; } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(dst), gpd(src)); return; case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(dst), gpq(src)); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, gpq(dst), mm(src)); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, gpd(dst), gpd(src)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, gpq(dst), gpq(src)); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(dst), mm(src)); return; } break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, xmm(dst), gpd(src)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, xmm(dst), gpq(src)); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src)); return; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src)); return; } break; case kX86VarTypeXmmSS: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src)); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovSS, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstCvtSD2SS, xmm(dst), xmm(src)); return; } break; case kX86VarTypeXmmSD: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src)); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstCvtSS2SD, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, xmm(dst), xmm(src)); return; } break; } } else { Mem mem = x86Context._getVarMem(cv); switch (argType.getVarType()) { case kX86VarTypeGpd: switch (cv->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 x86Compiler->emit(kX86InstMov, gpd(dst), mem); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovD, gpd(dst), mem); return; } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(dst), mem); return; case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(dst), mem); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, gpq(dst), mem); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, gpd(dst), mem); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, gpq(dst), mem); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(dst), mem); return; } break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, xmm(dst), mem); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem); return; } break; case kX86VarTypeXmmSS: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovSS, xmm(dst), mem); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstCvtSD2SS, xmm(dst), mem); return; } break; case kX86VarTypeXmmSD: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstCvtSS2SD, xmm(dst), mem); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, xmm(dst), mem); return; } break; } } x86Compiler->setError(kErrorIncompatibleArgumentType); } // Prototype & Arguments Management. void X86CompilerFuncCall::setPrototype(uint32_t callingConvention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { _x86Decl.setPrototype(callingConvention, returnType, arguments, argumentsCount); _args = reinterpret_cast( getCompiler()->getZoneMemory().alloc(sizeof(Operand) * argumentsCount)); memset(_args, 0, sizeof(Operand) * argumentsCount); } bool X86CompilerFuncCall::setArgument(uint32_t i, const Var& var) { ASMJIT_ASSERT(i < _x86Decl.getArgumentsCount()); if (i >= _x86Decl.getArgumentsCount()) return false; _args[i] = var; return true; } bool X86CompilerFuncCall::setArgument(uint32_t i, const Imm& imm) { ASMJIT_ASSERT(i < _x86Decl.getArgumentsCount()); if (i >= _x86Decl.getArgumentsCount()) return false; _args[i] = imm; return true; } bool X86CompilerFuncCall::setReturn(const Operand& first, const Operand& second) { _ret[0] = first; _ret[1] = second; return true; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86operand.h0000755000000000000000000021737512467662066017712 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86OPERAND_H #define _ASMJIT_X86_X86OPERAND_H // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/operand.h" #include "../x86/x86defs.h" namespace AsmJit { // ============================================================================ // [Forward Declarations] // ============================================================================ struct GpReg; struct GpVar; struct Mem; struct MmReg; struct MmVar; struct Var; struct X87Reg; struct X87Var; struct XmmReg; struct XmmVar; struct SegmentReg; //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::MmData] // ============================================================================ //! @brief Structure used for MMX specific data (64-bit). //! //! This structure can be used to load / store data from / to MMX register. union MmData { // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Set all eight signed 8-bit integers. inline void setSB( int8_t x0, int8_t x1, int8_t x2, int8_t x3, int8_t x4, int8_t x5, int8_t x6, int8_t x7) { sb[0] = x0; sb[1] = x1; sb[2] = x2; sb[3] = x3; sb[4] = x4; sb[5] = x5; sb[6] = x6; sb[7] = x7; } //! @brief Set all eight unsigned 8-bit integers. inline void setUB( uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7) { ub[0] = x0; ub[1] = x1; ub[2] = x2; ub[3] = x3; ub[4] = x4; ub[5] = x5; ub[6] = x6; ub[7] = x7; } //! @brief Set all four signed 16-bit integers. inline void setSW( int16_t x0, int16_t x1, int16_t x2, int16_t x3) { sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3; } //! @brief Set all four unsigned 16-bit integers. inline void setUW( uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3) { uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3; } //! @brief Set all two signed 32-bit integers. inline void setSD( int32_t x0, int32_t x1) { sd[0] = x0; sd[1] = x1; } //! @brief Set all two unsigned 32-bit integers. inline void setUD( uint32_t x0, uint32_t x1) { ud[0] = x0; ud[1] = x1; } //! @brief Set signed 64-bit integer. inline void setSQ( int64_t x0) { sq[0] = x0; } //! @brief Set unsigned 64-bit integer. inline void setUQ( uint64_t x0) { uq[0] = x0; } //! @brief Set all two SP-FP values. inline void setSF( float x0, float x1) { sf[0] = x0; sf[1] = x1; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Array of eight signed 8-bit integers. int8_t sb[8]; //! @brief Array of eight unsigned 8-bit integers. uint8_t ub[8]; //! @brief Array of four signed 16-bit integers. int16_t sw[4]; //! @brief Array of four unsigned 16-bit integers. uint16_t uw[4]; //! @brief Array of two signed 32-bit integers. int32_t sd[2]; //! @brief Array of two unsigned 32-bit integers. uint32_t ud[2]; //! @brief Array of one signed 64-bit integer. int64_t sq[1]; //! @brief Array of one unsigned 64-bit integer. uint64_t uq[1]; //! @brief Array of two SP-FP values. float sf[2]; }; // ============================================================================ // [AsmJit::XmmData] // ============================================================================ //! @brief Structure used for SSE specific data (128-bit). //! //! This structure can be used to load / store data from / to SSE register. //! //! @note Always align SSE data to 16-bytes. union XmmData { // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Set all sixteen signed 8-bit integers. inline void setSB( int8_t x0, int8_t x1, int8_t x2 , int8_t x3 , int8_t x4 , int8_t x5 , int8_t x6 , int8_t x7 , int8_t x8, int8_t x9, int8_t x10, int8_t x11, int8_t x12, int8_t x13, int8_t x14, int8_t x15) { sb[0] = x0; sb[1] = x1; sb[ 2] = x2 ; sb[3 ] = x3 ; sb[4 ] = x4 ; sb[5 ] = x5 ; sb[6 ] = x6 ; sb[7 ] = x7 ; sb[8] = x8; sb[9] = x9; sb[10] = x10; sb[11] = x11; sb[12] = x12; sb[13] = x13; sb[14] = x14; sb[15] = x15; } //! @brief Set all sixteen unsigned 8-bit integers. inline void setUB( uint8_t x0, uint8_t x1, uint8_t x2 , uint8_t x3 , uint8_t x4 , uint8_t x5 , uint8_t x6 , uint8_t x7 , uint8_t x8, uint8_t x9, uint8_t x10, uint8_t x11, uint8_t x12, uint8_t x13, uint8_t x14, uint8_t x15) { ub[0] = x0; ub[1] = x1; ub[ 2] = x2 ; ub[3 ] = x3 ; ub[4 ] = x4 ; ub[5 ] = x5 ; ub[6 ] = x6 ; ub[7 ] = x7 ; ub[8] = x8; ub[9] = x9; ub[10] = x10; ub[11] = x11; ub[12] = x12; ub[13] = x13; ub[14] = x14; ub[15] = x15; } //! @brief Set all eight signed 16-bit integers. inline void setSW( int16_t x0, int16_t x1, int16_t x2, int16_t x3, int16_t x4, int16_t x5, int16_t x6, int16_t x7) { sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3; sw[4] = x4; sw[5] = x5; sw[6] = x6; sw[7] = x7; } //! @brief Set all eight unsigned 16-bit integers. inline void setUW( uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3, uint16_t x4, uint16_t x5, uint16_t x6, uint16_t x7) { uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3; uw[4] = x4; uw[5] = x5; uw[6] = x6; uw[7] = x7; } //! @brief Set all four signed 32-bit integers. inline void setSD( int32_t x0, int32_t x1, int32_t x2, int32_t x3) { sd[0] = x0; sd[1] = x1; sd[2] = x2; sd[3] = x3; } //! @brief Set all four unsigned 32-bit integers. inline void setUD( uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3) { ud[0] = x0; ud[1] = x1; ud[2] = x2; ud[3] = x3; } //! @brief Set all two signed 64-bit integers. inline void setSQ( int64_t x0, int64_t x1) { sq[0] = x0; sq[1] = x1; } //! @brief Set all two unsigned 64-bit integers. inline void setUQ( uint64_t x0, uint64_t x1) { uq[0] = x0; uq[1] = x1; } //! @brief Set all four SP-FP floats. inline void setSF( float x0, float x1, float x2, float x3) { sf[0] = x0; sf[1] = x1; sf[2] = x2; sf[3] = x3; } //! @brief Set all two DP-FP floats. inline void setDF( double x0, double x1) { df[0] = x0; df[1] = x1; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Array of sixteen signed 8-bit integers. int8_t sb[16]; //! @brief Array of sixteen unsigned 8-bit integers. uint8_t ub[16]; //! @brief Array of eight signed 16-bit integers. int16_t sw[8]; //! @brief Array of eight unsigned 16-bit integers. uint16_t uw[8]; //! @brief Array of four signed 32-bit integers. int32_t sd[4]; //! @brief Array of four unsigned 32-bit integers. uint32_t ud[4]; //! @brief Array of two signed 64-bit integers. int64_t sq[2]; //! @brief Array of two unsigned 64-bit integers. uint64_t uq[2]; //! @brief Array of four 32-bit single precision floating points. float sf[4]; //! @brief Array of two 64-bit double precision floating points. double df[2]; }; // ============================================================================ // [AsmJit::GpReg] // ============================================================================ //! @brief General purpose register. //! //! This class is for all general purpose registers (64, 32, 16 and 8-bit). struct GpReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized general purpose register. inline GpReg() : Reg(kInvalidValue, 0) {} //! @brief Create a reference to @a other general purpose register. inline GpReg(const GpReg& other) : Reg(other) {} #if !defined(ASMJIT_NODOC) inline GpReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline GpReg(const _Initialize&, uint32_t code) : Reg(code, static_cast(1U << ((code & kRegTypeMask) >> 12))) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline GpReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline GpReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [GpReg Specific] // -------------------------------------------------------------------------- //! @brief Get whether the general purpose register is BYTE (8-bit) type. inline bool isGpb() const { return (_reg.code & kRegTypeMask) <= kX86RegTypeGpbHi; } //! @brief Get whether the general purpose register is LO-BYTE (8-bit) type. inline bool isGpbLo() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpbLo; } //! @brief Get whether the general purpose register is HI-BYTE (8-bit) type. inline bool isGpbHi() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpbHi; } //! @brief Get whether the general purpose register is WORD (16-bit) type. inline bool isGpw() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpw; } //! @brief Get whether the general purpose register is DWORD (32-bit) type. //! //! This is default type for 32-bit platforms. inline bool isGpd() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpd; } //! @brief Get whether the general purpose register is QWORD (64-bit) type. //! //! This is default type for 64-bit platforms. inline bool isGpq() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpq; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline GpReg& operator=(const GpReg& other) { _copy(other); return *this; } inline bool operator==(const GpReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const GpReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::X87Reg] // ============================================================================ //! @brief 80-bit x87 floating point register. //! //! To create instance of x87 register, use @c st() function. struct X87Reg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized x87 register. inline X87Reg() : Reg(kInvalidValue, 10) {} //! @brief Create a reference to @a other x87 register. inline X87Reg(const X87Reg& other) : Reg(other) {} #if !defined(ASMJIT_NODOC) inline X87Reg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline X87Reg(const _Initialize&, uint32_t code) : Reg(code | kX86RegTypeX87, 10) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline X87Reg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline X87Reg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline X87Reg& operator=(const X87Reg& other) { _copy(other); return *this; } inline bool operator==(const X87Reg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const X87Reg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::MmReg] // ============================================================================ //! @brief 64-bit MMX register. struct MmReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized MM register. inline MmReg() : Reg(kInvalidValue, 8) {} //! @brief Create a reference to @a other MM register. inline MmReg(const MmReg& other) : Reg(other) {} #if !defined(ASMJIT_NODOC) inline MmReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline MmReg(const _Initialize&, uint32_t code) : Reg(code, 8) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline MmReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline MmReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline MmReg& operator=(const MmReg& other) { _copy(other); return *this; } inline bool operator==(const MmReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const MmReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::XmmReg] // ============================================================================ //! @brief 128-bit SSE register. struct XmmReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized XMM register. inline XmmReg() : Reg(kInvalidValue, 16) {} //! @brief Create a reference to @a other XMM register. inline XmmReg(const _Initialize&, uint32_t code) : Reg(code, 16) {} #if !defined(ASMJIT_NODOC) inline XmmReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline XmmReg(const XmmReg& other) : Reg(other) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline XmmReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline XmmReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline XmmReg& operator=(const XmmReg& other) { _copy(other); return *this; } inline bool operator==(const XmmReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const XmmReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::SegmentReg] // ============================================================================ //! @brief Segment register. struct SegmentReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized segment register. inline SegmentReg() : Reg(kInvalidValue, 2) {} //! @brief Create a reference to @a other segment register. inline SegmentReg(const _Initialize&, uint32_t code) : Reg(code, 2) {} #if !defined(ASMJIT_NODOC) inline SegmentReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline SegmentReg(const SegmentReg& other) : Reg(other) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline SegmentReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline SegmentReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline SegmentReg& operator=(const SegmentReg& other) { _copy(other); return *this; } inline bool operator==(const SegmentReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const SegmentReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::Registers - no_reg] // ============================================================================ //! @brief No register, can be used only in @c Mem operand. ASMJIT_VAR const GpReg no_reg; // ============================================================================ // [AsmJit::Registers - 8-bit] // ============================================================================ //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg al; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg cl; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg dl; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg bl; #if defined(ASMJIT_X64) //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg spl; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg bpl; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg sil; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg dil; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r8b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r9b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r10b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r11b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r12b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r13b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r14b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r15b; #endif // ASMJIT_X64 //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg ah; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg ch; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg dh; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg bh; // ============================================================================ // [AsmJit::Registers - 16-bit] // ============================================================================ //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg ax; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg cx; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg dx; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg bx; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg sp; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg bp; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg si; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg di; #if defined(ASMJIT_X64) //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r8w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r9w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r10w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r11w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r12w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r13w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r14w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r15w; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 32-bit] // ============================================================================ //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg eax; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg ecx; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg edx; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg ebx; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg esp; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg ebp; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg esi; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg edi; #if defined(ASMJIT_X64) //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r8d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r9d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r10d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r11d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r12d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r13d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r14d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r15d; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 64-bit] // ============================================================================ #if defined(ASMJIT_X64) //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rax; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rcx; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rdx; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rbx; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rsp; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rbp; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rsi; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rdi; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r8; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r9; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r10; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r11; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r12; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r13; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r14; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r15; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Native (AsmJit extension)] // ============================================================================ //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zax; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zcx; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zdx; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zbx; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zsp; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zbp; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zsi; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zdi; // ============================================================================ // [AsmJit::Registers - MM] // ============================================================================ //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm0; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm1; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm2; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm3; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm4; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm5; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm6; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm7; // ============================================================================ // [AsmJit::Registers - XMM] // ============================================================================ //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm0; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm1; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm2; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm3; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm4; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm5; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm6; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm7; #if defined(ASMJIT_X64) //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm8; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm9; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm10; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm11; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm12; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm13; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm14; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm15; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Segment] // ============================================================================ //! @brief CS segment register. ASMJIT_VAR const SegmentReg cs; //! @brief SS segment register. ASMJIT_VAR const SegmentReg ss; //! @brief DS segment register. ASMJIT_VAR const SegmentReg ds; //! @brief ES segment register. ASMJIT_VAR const SegmentReg es; //! @brief FS segment register. ASMJIT_VAR const SegmentReg fs; //! @brief GS segment register. ASMJIT_VAR const SegmentReg gs; // ============================================================================ // [AsmJit::Registers - Register From Index] // ============================================================================ //! @brief Get general purpose register of byte size. static inline GpReg gpb_lo(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpbLo)); } //! @brief Get general purpose register of byte size. static inline GpReg gpb_hi(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpbHi)); } //! @brief Get general purpose register of word size. static inline GpReg gpw(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpw)); } //! @brief Get general purpose register of dword size. static inline GpReg gpd(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpd)); } #if defined(ASMJIT_X64) //! @brief Get general purpose register of qword size (64-bit only). static inline GpReg gpq(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpq)); } #endif //! @brief Get general purpose dword/qword register (depending to architecture). static inline GpReg gpz(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpz)); } //! @brief Get MMX (MM) register . static inline MmReg mm(uint32_t index) { return MmReg(_Initialize(), static_cast(index | kX86RegTypeMm)); } //! @brief Get SSE (XMM) register. static inline XmmReg xmm(uint32_t index) { return XmmReg(_Initialize(), static_cast(index | kX86RegTypeXmm)); } //! @brief Get x87 register with index @a i. static inline X87Reg st(uint32_t i) { ASMJIT_ASSERT(i < 8); return X87Reg(_Initialize(), static_cast(i)); } // ============================================================================ // [AsmJit::Mem] // ============================================================================ //! @brief Memory operand. struct Mem : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline Mem() : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = 0; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; _mem.sizePrefix = 0; _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = kInvalidValue; _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = 0; } inline Mem(const Label& label, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemLabel; _mem.segment = kX86SegNone; _mem.sizePrefix = 0; _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = reinterpret_cast(label)._base.id; _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpReg& base, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = base.getSize() != 4; #else _mem.sizePrefix = base.getSize() != 8; #endif _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = base.getRegCode() & kRegIndexMask; _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpVar& base, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = (reinterpret_cast(base)._var.size) != 4; #else _mem.sizePrefix = (reinterpret_cast(base)._var.size) != 8; #endif _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = reinterpret_cast(base).getId(); _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpReg& base, const GpReg& index, uint32_t shift, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { ASMJIT_ASSERT(shift <= 3); _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = (base.getSize() | index.getSize()) != 4; #else _mem.sizePrefix = (base.getSize() | index.getSize()) != 8; #endif _mem.shift = (uint8_t)shift; _mem.id = kInvalidValue; _mem.base = base.getRegIndex(); _mem.index = index.getRegIndex(); _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpVar& base, const GpVar& index, uint32_t shift, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { ASMJIT_ASSERT(shift <= 3); _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = (reinterpret_cast(base )._var.size | reinterpret_cast(index)._var.size ) != 4; #else _mem.sizePrefix = (reinterpret_cast(base )._var.size | reinterpret_cast(index)._var.size ) != 8; #endif _mem.shift = (uint8_t)shift; _mem.id = kInvalidValue; _mem.base = reinterpret_cast(base).getId(); _mem.index = reinterpret_cast(index).getId(); _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const Mem& other) : Operand(other) { } inline Mem(const _DontInitialize& dontInitialize) : Operand(dontInitialize) { } // -------------------------------------------------------------------------- // [Mem Specific] // -------------------------------------------------------------------------- //! @brief Get type of memory operand, see @c kOperandMemType. inline uint32_t getMemType() const { return _mem.type; } //! @brief Get memory operand segment, see @c kX86Seg. inline uint32_t getSegment() const { return _mem.segment; } //! @brief Set memory operand segment, see @c kX86Seg. inline Mem& setSegment(uint32_t seg) { _mem.segment = static_cast(seg); return *this; } //! @brief Set memory operand segment, see @c kX86Seg. inline Mem& setSegment(const SegmentReg& seg) { _mem.segment = static_cast(seg.getRegIndex()); return *this; } //! @brief Get whether the memory operand has segment override prefix. inline bool hasSegment() const { return _mem.segment >= kX86SegCount; } //! @brief Get whether the memory operand has base register. inline bool hasBase() const { return _mem.base != kInvalidValue; } //! @brief Get whether the memory operand has index. inline bool hasIndex() const { return _mem.index != kInvalidValue; } //! @brief Get whether the memory operand has shift used. inline bool hasShift() const { return _mem.shift != 0; } //! @brief Get memory operand base register or @c kInvalidValue. inline uint32_t getBase() const { return _mem.base; } //! @brief Get memory operand index register or @c kInvalidValue. inline uint32_t getIndex() const { return _mem.index; } //! @brief Get memory operand index scale (0, 1, 2 or 3). inline uint32_t getShift() const { return _mem.shift; } //! @brief Get whether to use size-override prefix. //! //! @note This is useful only for MOV and LEA type of instructions. inline bool getSizePrefix() const { return _mem.sizePrefix; } //! @brief Set whether to use size-override prefix. inline Mem& setSizePrefix(bool b) { _mem.sizePrefix = b; return *this; } //! @brief Get absolute target address. //! //! @note You should always check if operand contains address by @c getMemType(). inline void* getTarget() const { return _mem.target; } //! @brief Set absolute target address. inline Mem& setTarget(void* target) { _mem.target = target; return *this; } //! @brief Set memory operand size. inline Mem& setSize(uint32_t size) { _mem.size = size; return *this; } //! @brief Get memory operand relative displacement. inline sysint_t getDisplacement() const { return _mem.displacement; } //! @brief Set memory operand relative displacement. inline Mem& setDisplacement(sysint_t displacement) { _mem.displacement = displacement; return *this; } //! @brief Adjust memory operand relative displacement by @a displacement. inline Mem& adjust(sysint_t displacement) { _mem.displacement += displacement; return *this; } //! @brief Get new memory operand adjusted by @a displacement. inline Mem adjusted(sysint_t displacement) const { Mem result(*this); result.adjust(displacement); return result; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Mem& operator=(const Mem& other) { _copy(other); return *this; } inline bool operator==(const Mem& other) const { return _bin.u32[0] == other._bin.u32[0] && _bin.u32[1] == other._bin.u32[1] && _bin.u32[2] == other._bin.u32[2] && _bin.u32[3] == other._bin.u32[3] && _bin.uptr[0] == other._bin.uptr[0] && _bin.uptr[1] == other._bin.uptr[1]; } inline bool operator!=(const Mem& other) const { return !(*this == other); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::Var] // ============================================================================ ASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size); ASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size, sysint_t disp); ASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size, const GpVar& index, uint32_t shift, sysint_t disp); //! @brief Base class for all variables. struct Var : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Var(const _DontInitialize& dontInitialize) : Operand(dontInitialize) { } #endif // ASMJIT_NODOC inline Var() : Operand(_DontInitialize()) { _var.op = kOperandVar; _var.size = 0; _var.regCode = kInvalidValue; _var.varType = kInvalidValue; _var.id = kInvalidValue; } inline Var(const Var& other) : Operand(other) { } // -------------------------------------------------------------------------- // [Type] // -------------------------------------------------------------------------- inline uint32_t getVarType() const { return _var.varType; } inline bool isGpVar() const { return _var.varType <= kX86VarTypeGpq; } inline bool isX87Var() const { return _var.varType >= kX86VarTypeX87 && _var.varType <= kX86VarTypeX87SD; } inline bool isMmVar() const { return _var.varType == kX86VarTypeMm; } inline bool isXmmVar() const { return _var.varType >= kX86VarTypeXmm && _var.varType <= kX86VarTypeXmmPD; } // -------------------------------------------------------------------------- // [Memory Cast] // -------------------------------------------------------------------------- //! @brief Cast this variable to memory operand. //! //! @note Size of operand depends on native variable type, you can use other //! variants if you want specific one. inline Mem m() const { return _BaseVarMem(*this, kInvalidValue); } //! @overload. inline Mem m(sysint_t disp) const { return _BaseVarMem(*this, kInvalidValue, disp); } //! @overload. inline Mem m(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, kInvalidValue, index, shift, disp); } //! @brief Cast this variable to 8-bit memory operand. inline Mem m8() const { return _BaseVarMem(*this, 1); } //! @overload. inline Mem m8(sysint_t disp) const { return _BaseVarMem(*this, 1, disp); } //! @overload. inline Mem m8(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 1, index, shift, disp); } //! @brief Cast this variable to 16-bit memory operand. inline Mem m16() const { return _BaseVarMem(*this, 2); } //! @overload. inline Mem m16(sysint_t disp) const { return _BaseVarMem(*this, 2, disp); } //! @overload. inline Mem m16(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 2, index, shift, disp); } //! @brief Cast this variable to 32-bit memory operand. inline Mem m32() const { return _BaseVarMem(*this, 4); } //! @overload. inline Mem m32(sysint_t disp) const { return _BaseVarMem(*this, 4, disp); } //! @overload. inline Mem m32(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 4, index, shift, disp); } //! @brief Cast this variable to 64-bit memory operand. inline Mem m64() const { return _BaseVarMem(*this, 8); } //! @overload. inline Mem m64(sysint_t disp) const { return _BaseVarMem(*this, 8, disp); } //! @overload. inline Mem m64(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 8, index, shift, disp); } //! @brief Cast this variable to 80-bit memory operand (long double). inline Mem m80() const { return _BaseVarMem(*this, 10); } //! @overload. inline Mem m80(sysint_t disp) const { return _BaseVarMem(*this, 10, disp); } //! @overload. inline Mem m80(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 10, index, shift, disp); } //! @brief Cast this variable to 128-bit memory operand. inline Mem m128() const { return _BaseVarMem(*this, 16); } //! @overload. inline Mem m128(sysint_t disp) const { return _BaseVarMem(*this, 16, disp); } //! @overload. inline Mem m128(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 16, index, shift, disp); } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Var& operator=(const Var& other) { _copy(other); return *this; } inline bool operator==(const Var& other) const { return _base.id == other._base.id && _var.regCode == other._var.regCode; } inline bool operator!=(const Var& other) const { return _base.id != other._base.id || _var.regCode != other._var.regCode; } #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Private] // -------------------------------------------------------------------------- protected: inline Var(const Var& other, uint32_t regCode, uint32_t size) : Operand(_DontInitialize()) { _var.op = kOperandVar; _var.size = (uint8_t)size; _var.id = other._base.id; _var.regCode = regCode; _var.varType = other._var.varType; } }; // ============================================================================ // [AsmJit::X87Var] // ============================================================================ //! @brief X87 Variable operand. struct X87Var : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline X87Var(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } inline X87Var() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = 12; _var.id = kInvalidValue; _var.regCode = kX86RegTypeX87; _var.varType = kX86VarTypeX87; } inline X87Var(const X87Var& other) : Var(other) {} // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline X87Var& operator=(const X87Var& other) { _copy(other); return *this; } inline bool operator==(const X87Var& other) const { return _base.id == other._base.id; } inline bool operator!=(const X87Var& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::GpVar] // ============================================================================ //! @brief GP variable operand. struct GpVar : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new uninitialized @c GpVar instance (internal constructor). inline GpVar(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } //! @brief Create new uninitialized @c GpVar instance. inline GpVar() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = sizeof(sysint_t); _var.id = kInvalidValue; _var.regCode = kX86RegTypeGpz; _var.varType = kX86VarTypeGpz; } //! @brief Create new @c GpVar instance using @a other. //! //! Note this will not create a different variable, use @c Compiler::newGpVar() //! if you want to do so. This is only copy-constructor that allows to store //! the same variable in different places. inline GpVar(const GpVar& other) : Var(other) {} // -------------------------------------------------------------------------- // [GpVar Specific] // -------------------------------------------------------------------------- //! @brief Get whether this variable is general purpose BYTE register. inline bool isGpb() const { return (_var.regCode & kRegTypeMask) <= kX86RegTypeGpbHi; } //! @brief Get whether this variable is general purpose BYTE.LO register. inline bool isGpbLo() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpbLo; } //! @brief Get whether this variable is general purpose BYTE.HI register. inline bool isGpbHi() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpbHi; } //! @brief Get whether this variable is general purpose WORD register. inline bool isGpw() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpw; } //! @brief Get whether this variable is general purpose DWORD register. inline bool isGpd() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpd; } //! @brief Get whether this variable is general purpose QWORD (only 64-bit) register. inline bool isGpq() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpq; } // -------------------------------------------------------------------------- // [GpVar Cast] // -------------------------------------------------------------------------- //! @brief Cast this variable to 8-bit (LO) part of variable inline GpVar r8() const { return GpVar(*this, kX86RegTypeGpbLo, 1); } //! @brief Cast this variable to 8-bit (LO) part of variable inline GpVar r8Lo() const { return GpVar(*this, kX86RegTypeGpbLo, 1); } //! @brief Cast this variable to 8-bit (HI) part of variable inline GpVar r8Hi() const { return GpVar(*this, kX86RegTypeGpbHi, 1); } //! @brief Cast this variable to 16-bit part of variable inline GpVar r16() const { return GpVar(*this, kX86RegTypeGpw, 2); } //! @brief Cast this variable to 32-bit part of variable inline GpVar r32() const { return GpVar(*this, kX86RegTypeGpd, 4); } #if defined(ASMJIT_X64) //! @brief Cast this variable to 64-bit part of variable inline GpVar r64() const { return GpVar(*this, kX86RegTypeGpq, 8); } #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline GpVar& operator=(const GpVar& other) { _copy(other); return *this; } inline bool operator==(const GpVar& other) const { return _base.id == other._base.id && _var.regCode == other._var.regCode; } inline bool operator!=(const GpVar& other) const { return _base.id != other._base.id || _var.regCode != other._var.regCode; } #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Private] // -------------------------------------------------------------------------- protected: inline GpVar(const GpVar& other, uint32_t regCode, uint32_t size) : Var(other, regCode, size) { } }; // ============================================================================ // [AsmJit::MmVar] // ============================================================================ //! @brief MM variable operand. struct MmVar : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new uninitialized @c MmVar instance (internal constructor). inline MmVar(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } //! @brief Create new uninitialized @c MmVar instance. inline MmVar() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = 8; _var.id = kInvalidValue; _var.regCode = kX86RegTypeMm; _var.varType = kX86VarTypeMm; } //! @brief Create new @c MmVar instance using @a other. //! //! Note this will not create a different variable, use @c Compiler::newMmVar() //! if you want to do so. This is only copy-constructor that allows to store //! the same variable in different places. inline MmVar(const MmVar& other) : Var(other) {} // -------------------------------------------------------------------------- // [MmVar Cast] // -------------------------------------------------------------------------- // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline MmVar& operator=(const MmVar& other) { _copy(other); return *this; } inline bool operator==(const MmVar& other) const { return _base.id == other._base.id; } inline bool operator!=(const MmVar& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::XmmVar] // ============================================================================ //! @brief XMM Variable operand. struct XmmVar : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline XmmVar(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } inline XmmVar() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = 16; _var.id = kInvalidValue; _var.regCode = kX86RegTypeXmm; _var.varType = kX86VarTypeXmm; } inline XmmVar(const XmmVar& other) : Var(other) {} // -------------------------------------------------------------------------- // [XmmVar Access] // -------------------------------------------------------------------------- // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline XmmVar& operator=(const XmmVar& other) { _copy(other); return *this; } inline bool operator==(const XmmVar& other) const { return _base.id == other._base.id; } inline bool operator!=(const XmmVar& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::Mem - [label + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const Label& label, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - [label + index << shift + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - segment[target + displacement] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr_abs(void* target, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeQWord); } //! @brief Create a tword pointer operand (used for 80-bit floating points). static inline Mem tword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - segment[target + index << shift + displacement] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - ptr[base + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpReg& base, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpVar& base, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - ptr[base + (index << shift) + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Macros] // ============================================================================ //! @brief Create Shuffle Constant for MMX/SSE shuffle instrutions. //! @param z First component position, number at interval [0, 3] inclusive. //! @param x Second component position, number at interval [0, 3] inclusive. //! @param y Third component position, number at interval [0, 3] inclusive. //! @param w Fourth component position, number at interval [0, 3] inclusive. //! //! Shuffle constants can be used to make immediate value for these intrinsics: //! - @ref X86Assembler::pshufw() //! - @ref X86Assembler::pshufd() //! - @ref X86Assembler::pshufhw() //! - @ref X86Assembler::pshuflw() //! - @ref X86Assembler::shufps() static inline uint8_t mm_shuffle(uint8_t z, uint8_t y, uint8_t x, uint8_t w) { return (z << 6) | (y << 4) | (x << 2) | w; } //! @} } // AsmJit namespace // [Guard] #endif // _ASMJIT_X86_X86OPERAND_H desmume-0.9.11/src/utils/AsmJit/x86/x86defs.h0000755000000000000000000022313712467662066017174 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86DEFS_H #define _ASMJIT_X86_X86DEFS_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::kX86Feature] // ============================================================================ //! @brief X86 CPU features. enum kX86Feature { //! @brief Cpu has RDTSC instruction. kX86FeatureRdtsc = 1U << 0, //! @brief Cpu has RDTSCP instruction. kX86FeatureRdtscP = 1U << 1, //! @brief Cpu has CMOV instruction (conditional move) kX86FeatureCMov = 1U << 2, //! @brief Cpu has CMPXCHG8B instruction kX86FeatureCmpXchg8B = 1U << 3, //! @brief Cpu has CMPXCHG16B instruction (64-bit processors) kX86FeatureCmpXchg16B = 1U << 4, //! @brief Cpu has CLFUSH instruction kX86FeatureClFlush = 1U << 5, //! @brief Cpu has PREFETCH instruction kX86FeaturePrefetch = 1U << 6, //! @brief Cpu supports LAHF and SAHF instrictions. kX86FeatureLahfSahf = 1U << 7, //! @brief Cpu supports FXSAVE and FXRSTOR instructions. kX86FeatureFXSR = 1U << 8, //! @brief Cpu supports FXSAVE and FXRSTOR instruction optimizations (FFXSR). kX86FeatureFFXSR = 1U << 9, //! @brief Cpu has MMX. kX86FeatureMmx = 1U << 10, //! @brief Cpu has extended MMX. kX86FeatureMmxExt = 1U << 11, //! @brief Cpu has 3dNow! kX86Feature3dNow = 1U << 12, //! @brief Cpu has enchanced 3dNow! kX86Feature3dNowExt = 1U << 13, //! @brief Cpu has SSE. kX86FeatureSse = 1U << 14, //! @brief Cpu has SSE2. kX86FeatureSse2 = 1U << 15, //! @brief Cpu has SSE3. kX86FeatureSse3 = 1U << 16, //! @brief Cpu has Supplemental SSE3 (SSSE3). kX86FeatureSsse3 = 1U << 17, //! @brief Cpu has SSE4.A. kX86FeatureSse4A = 1U << 18, //! @brief Cpu has SSE4.1. kX86FeatureSse41 = 1U << 19, //! @brief Cpu has SSE4.2. kX86FeatureSse42 = 1U << 20, //! @brief Cpu has AVX. kX86FeatureAvx = 1U << 22, //! @brief Cpu has Misaligned SSE (MSSE). kX86FeatureMSse = 1U << 23, //! @brief Cpu supports MONITOR and MWAIT instructions. kX86FeatureMonitorMWait = 1U << 24, //! @brief Cpu supports MOVBE instruction. kX86FeatureMovBE = 1U << 25, //! @brief Cpu supports POPCNT instruction. kX86FeaturePopCnt = 1U << 26, //! @brief Cpu supports LZCNT instruction. kX86FeatureLzCnt = 1U << 27, //! @brief Cpu supports PCLMULDQ set of instructions. kX86FeaturePclMulDQ = 1U << 28, //! @brief Cpu supports multithreading. kX86FeatureMultiThreading = 1U << 29, //! @brief Cpu supports execute disable bit (execute protection). kX86FeatureExecuteDisableBit = 1U << 30, //! @brief 64-bit CPU. kX86Feature64Bit = 1U << 31 }; // ============================================================================ // [AsmJit::kX86Bug] // ============================================================================ //! @brief X86 CPU bugs. enum kX86Bug { //! @brief Whether the processor contains bug seen in some //! AMD-Opteron processors. kX86BugAmdLockMB = 1U << 0 }; // ============================================================================ // [AsmJit::kX86Property] // ============================================================================ //! @brief @ref X86Assembler and @ref X86Compiler properties. enum kX86Property { //! @brief Optimize align for current processor. //! //! Default: @c true. kX86PropertyOptimizedAlign = 0, //! @brief Emit hints added to jcc() instructions. //! //! Default: @c true. kX86PropertyJumpHints = 1 }; // ============================================================================ // [AsmJit::kX86Seg] // ============================================================================ //! @brief X86 segment codes. enum kX86Seg { // DO NOT MODIFY INDEX CODES - They are used by _emitSegmentPrefix() and // by logger in the following order: //! @brief ES segment. kX86SegEs = 0, //! @brief CS segment. kX86SegCs = 1, //! @brief SS segment. kX86SegSs = 2, //! @brief DS segment. kX86SegDs = 3, //! @brief FS segment. kX86SegFs = 4, //! @brief GS segment. kX86SegGs = 5, //! @brief Count of segments. kX86SegCount = 6, //! @brief No segment override prefix. kX86SegNone = 0xF }; // ============================================================================ // [AsmJit::kX86RegNum] // ============================================================================ //! @brief X86 registers count. //! //! Count of general purpose registers and XMM registers depends on current //! mode. If application is compiled for 32-bit platform then this number is 8, //! 64-bit platforms have 8 extra general purpose and XMM registers (16 total). enum kX86RegNum { //! @var kX86RegNumBase //! //! Count of general purpose registers and XMM registers depends on current //! bit-mode. If application is compiled for 32-bit platform then this number //! is 8, 64-bit platforms have 8 extra general purpose and XMM registers (16 //! total). #if defined(ASMJIT_X86) kX86RegNumBase = 8, #else kX86RegNumBase = 16, #endif // ASMJIT //! @brief Count of general purpose registers. //! //! 8 in 32-bit mode and 16 in 64-bit mode. kX86RegNumGp = kX86RegNumBase, //! @brief Count of FPU stack registers (always 8). kX86RegNumX87 = 8, //! @brief Count of MM registers (always 8). kX86RegNumMm = 8, //! @brief Count of XMM registers. //! //! 8 in 32-bit mode and 16 in 64-bit mode. kX86RegNumXmm = kX86RegNumBase, //! @brief Count of YMM registers. //! //! 8 in 32-bit mode and 16 in 64-bit mode. kX86RegNumYmm = kX86RegNumBase, //! @brief Count of segment registers, including no segment (AsmJit specific). //! //! @note There are 6 segment registers, but AsmJit uses 0 as no segment, and //! 1...6 as segment registers, this means that there are 7 segment registers //! in AsmJit API, but only 6 can be used through @c Assembler or @c Compiler //! API. kX86RegNumSeg = 7 }; //! @brief X86 register types. enum kX86RegType { // First byte contains register type (mask 0xFF00), Second byte contains // register index code. // -------------------------------------------------------------------------- // [GP Register Types] // -------------------------------------------------------------------------- //! @brief 8-bit general purpose register type (LO). kX86RegTypeGpbLo = 0x0100, //! @brief 8-bit general purpose register type (HI, only AH, BH, CH, DH). kX86RegTypeGpbHi = 0x0200, //! @brief 16-bit general purpose register type. kX86RegTypeGpw = 0x1000, //! @brief 32-bit general purpose register type. kX86RegTypeGpd = 0x2000, //! @brief 64-bit general purpose register type. kX86RegTypeGpq = 0x3000, //! @var kX86RegTypeGpz //! @brief 32-bit or 64-bit general purpose register type. #if defined(ASMJIT_X86) kX86RegTypeGpz = kX86RegTypeGpd, #else kX86RegTypeGpz = kX86RegTypeGpq, #endif //! @brief X87 (FPU) register type. kX86RegTypeX87 = 0x5000, //! @brief 64-bit MM register type. kX86RegTypeMm = 0x6000, //! @brief 128-bit XMM register type. kX86RegTypeXmm = 0x7000, //! @brief 256-bit YMM register type. kX86RegTypeYmm = 0x8000, //! @brief 16-bit segment register type. kX86RegTypeSeg = 0xD000 }; // ============================================================================ // [AsmJit::kX86RegIndex] // ============================================================================ //! @brief X86 register indices. //! //! These codes are real, don't miss with @c REG enum! and don't use these //! values if you are not writing AsmJit code. enum kX86RegIndex { //! @brief ID for AX/EAX/RAX registers. kX86RegIndexEax = 0, //! @brief ID for CX/ECX/RCX registers. kX86RegIndexEcx = 1, //! @brief ID for DX/EDX/RDX registers. kX86RegIndexEdx = 2, //! @brief ID for BX/EBX/RBX registers. kX86RegIndexEbx = 3, //! @brief ID for SP/ESP/RSP registers. kX86RegIndexEsp = 4, //! @brief ID for BP/EBP/RBP registers. kX86RegIndexEbp = 5, //! @brief ID for SI/ESI/RSI registers. kX86RegIndexEsi = 6, //! @brief ID for DI/EDI/RDI registers. kX86RegIndexEdi = 7, //! @brief ID for AX/EAX/RAX registers. kX86RegIndexRax = 0, //! @brief ID for CX/ECX/RCX registers. kX86RegIndexRcx = 1, //! @brief ID for DX/EDX/RDX registers. kX86RegIndexRdx = 2, //! @brief ID for BX/EBX/RBX registers. kX86RegIndexRbx = 3, //! @brief ID for SP/ESP/RSP registers. kX86RegIndexRsp = 4, //! @brief ID for BP/EBP/RBP registers. kX86RegIndexRbp = 5, //! @brief ID for SI/ESI/RSI registers. kX86RegIndexRsi = 6, //! @brief ID for DI/EDI/RDI registers. kX86RegIndexRdi = 7, //! @brief ID for r8 register (additional register introduced by 64-bit architecture). kX86RegIndexR8 = 8, //! @brief ID for R9 register (additional register introduced by 64-bit architecture). kX86RegIndexR9 = 9, //! @brief ID for R10 register (additional register introduced by 64-bit architecture). kX86RegIndexR10 = 10, //! @brief ID for R11 register (additional register introduced by 64-bit architecture). kX86RegIndexR11 = 11, //! @brief ID for R12 register (additional register introduced by 64-bit architecture). kX86RegIndexR12 = 12, //! @brief ID for R13 register (additional register introduced by 64-bit architecture). kX86RegIndexR13 = 13, //! @brief ID for R14 register (additional register introduced by 64-bit architecture). kX86RegIndexR14 = 14, //! @brief ID for R15 register (additional register introduced by 64-bit architecture). kX86RegIndexR15 = 15, //! @brief ID for mm0 register. kX86RegIndexMm0 = 0, //! @brief ID for mm1 register. kX86RegIndexMm1 = 1, //! @brief ID for mm2 register. kX86RegIndexMm2 = 2, //! @brief ID for mm3 register. kX86RegIndexMm3 = 3, //! @brief ID for mm4 register. kX86RegIndexMm4 = 4, //! @brief ID for mm5 register. kX86RegIndexMm5 = 5, //! @brief ID for mm6 register. kX86RegIndexMm6 = 6, //! @brief ID for mm7 register. kX86RegIndexMm7 = 7, //! @brief ID for xmm0 register. kX86RegIndexXmm0 = 0, //! @brief ID for xmm1 register. kX86RegIndexXmm1 = 1, //! @brief ID for xmm2 register. kX86RegIndexXmm2 = 2, //! @brief ID for xmm3 register. kX86RegIndexXmm3 = 3, //! @brief ID for xmm4 register. kX86RegIndexXmm4 = 4, //! @brief ID for xmm5 register. kX86RegIndexXmm5 = 5, //! @brief ID for xmm6 register. kX86RegIndexXmm6 = 6, //! @brief ID for xmm7 register. kX86RegIndexXmm7 = 7, //! @brief ID for xmm8 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm8 = 8, //! @brief ID for xmm9 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm9 = 9, //! @brief ID for xmm10 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm10 = 10, //! @brief ID for xmm11 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm11 = 11, //! @brief ID for xmm12 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm12 = 12, //! @brief ID for xmm13 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm13 = 13, //! @brief ID for xmm14 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm14 = 14, //! @brief ID for xmm15 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm15 = 15, //! @brief ID for ES segment register. kX86RegIndexEs = 0, //! @brief ID for CS segment register. kX86RegIndexCs = 1, //! @brief ID for SS segment register. kX86RegIndexSs = 2, //! @brief ID for DS segment register. kX86RegIndexDs = 3, //! @brief ID for FS segment register. kX86RegIndexFs = 4, //! @brief ID for GS segment register. kX86RegIndexGs = 5 }; // ============================================================================ // [AsmJit::kX86RegCode] // ============================================================================ //! @brief X86 pseudo (not real X86) register codes used for generating opcodes. //! //! From this register code can be generated real x86 register ID, type of //! register and size of register. enum kX86RegCode { // -------------------------------------------------------------------------- // [8-bit Registers] // -------------------------------------------------------------------------- kX86RegAl = kX86RegTypeGpbLo, kX86RegCl, kX86RegDl, kX86RegBl, #if defined(ASMJIT_X64) kX86RegSpl, kX86RegBpl, kX86RegSil, kX86RegDil, #endif // ASMJIT_X64 #if defined(ASMJIT_X64) kX86RegR8b, kX86RegR9b, kX86RegR10b, kX86RegR11b, kX86RegR12b, kX86RegR13b, kX86RegR14b, kX86RegR15b, #endif // ASMJIT_X64 kX86RegAh = kX86RegTypeGpbHi, kX86RegCh, kX86RegDh, kX86RegBh, // -------------------------------------------------------------------------- // [16-bit Registers] // -------------------------------------------------------------------------- kX86RegAx = kX86RegTypeGpw, kX86RegCx, kX86RegDx, kX86RegBx, kX86RegSp, kX86RegBp, kX86RegSi, kX86RegDi, #if defined(ASMJIT_X64) kX86RegR8w, kX86RegR9w, kX86RegR10w, kX86RegR11w, kX86RegR12w, kX86RegR13w, kX86RegR14w, kX86RegR15w, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [32-bit Registers] // -------------------------------------------------------------------------- kX86RegEax = kX86RegTypeGpd, kX86RegEcx, kX86RegEdx, kX86RegEbx, kX86RegEsp, kX86RegEbp, kX86RegEsi, kX86RegEdi, #if defined(ASMJIT_X64) kX86RegR8d, kX86RegR9d, kX86RegR10d, kX86RegR11d, kX86RegR12d, kX86RegR13d, kX86RegR14d, kX86RegR15d, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [64-bit Registers] // -------------------------------------------------------------------------- #if defined(ASMJIT_X64) kX86RegRax = kX86RegTypeGpq, kX86RegRcx, kX86RegRdx, kX86RegRbx, kX86RegRsp, kX86RegRbp, kX86RegRsi, kX86RegRdi, kX86RegR8, kX86RegR9, kX86RegR10, kX86RegR11, kX86RegR12, kX86RegR13, kX86RegR14, kX86RegR15, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [MM Registers] // -------------------------------------------------------------------------- kX86RegMm0 = kX86RegTypeMm, kX86RegMm1, kX86RegMm2, kX86RegMm3, kX86RegMm4, kX86RegMm5, kX86RegMm6, kX86RegMm7, // -------------------------------------------------------------------------- // [XMM Registers] // -------------------------------------------------------------------------- kX86RegXmm0 = kX86RegTypeXmm, kX86RegXmm1, kX86RegXmm2, kX86RegXmm3, kX86RegXmm4, kX86RegXmm5, kX86RegXmm6, kX86RegXmm7, #if defined(ASMJIT_X64) kX86RegXmm8, kX86RegXmm9, kX86RegXmm10, kX86RegXmm11, kX86RegXmm12, kX86RegXmm13, kX86RegXmm14, kX86RegXmm15, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [Native registers (depends on 32-bit or 64-bit mode)] // -------------------------------------------------------------------------- kX86RegZax = kX86RegTypeGpz, kX86RegZcx, kX86RegZdx, kX86RegZbx, kX86RegZsp, kX86RegZbp, kX86RegZsi, kX86RegZdi, // -------------------------------------------------------------------------- // [Segment registers] // -------------------------------------------------------------------------- //! @brief ES segment register. kX86RegEs = kX86RegTypeSeg, //! @brief CS segment register. kX86RegCs, //! @brief SS segment register. kX86RegSs, //! @brief DS segment register. kX86RegDs, //! @brief FS segment register. kX86RegFs, //! @brief GS segment register. kX86RegGs }; // ============================================================================ // [AsmJit::kX86Cond] // ============================================================================ //! @brief X86 Condition codes. enum kX86Cond { // Condition codes from processor manuals. kX86CondA = 0x07, kX86CondAE = 0x03, kX86CondB = 0x02, kX86CondBE = 0x06, kX86CondC = 0x02, kX86CondE = 0x04, kX86CondG = 0x0F, kX86CondGE = 0x0D, kX86CondL = 0x0C, kX86CondLE = 0x0E, kX86CondNA = 0x06, kX86CondNAE = 0x02, kX86CondNB = 0x03, kX86CondNBE = 0x07, kX86CondNC = 0x03, kX86CondNE = 0x05, kX86CondNG = 0x0E, kX86CondNGE = 0x0C, kX86CondNL = 0x0D, kX86CondNLE = 0x0F, kX86CondNO = 0x01, kX86CondNP = 0x0B, kX86CondNS = 0x09, kX86CondNZ = 0x05, kX86CondO = 0x00, kX86CondP = 0x0A, kX86CondPE = 0x0A, kX86CondPO = 0x0B, kX86CondS = 0x08, kX86CondZ = 0x04, // Simplified condition codes. kX86CondOverflow = 0x00, kX86CondNotOverflow = 0x01, kX86CondBelow = 0x02, kX86CondAboveEqual = 0x03, kX86CondEqual = 0x04, kX86CondNotEqual = 0x05, kX86CondBelowEqual = 0x06, kX86CondAbove = 0x07, kX86CondSign = 0x08, kX86CondNotSign = 0x09, kX86CondParityEven = 0x0A, kX86CondParityOdd = 0x0B, kX86CondLess = 0x0C, kX86CondGreaterEqual = 0x0D, kX86CondLessEqual = 0x0E, kX86CondGreater = 0x0F, // Aliases. kX86CondZero = 0x04, kX86CondNotZero = 0x05, kX86CondNegative = 0x08, kX86CondPositive = 0x09, // X87 floating point only. kX86CondFpuUnordered = 0x10, kX86CondFpuNotUnordered = 0x11, //! @brief No condition code. kX86CondNone = 0x12 }; // ============================================================================ // [AsmJit::kX86CondPrefix] // ============================================================================ //! @brief X86 condition hint prefix code, see @ref kCondHint. enum kX86CondPrefix { //! @brief Condition is likely to be taken. kX86CondPrefixLikely = 0x3E, //! @brief Condition is unlikely to be taken. kX86CondPrefixUnlikely = 0x2E }; // ============================================================================ // [AsmJit::kX86PrefetchHint] // ============================================================================ //! @brief X86 Prefetch hints. enum kX86PrefetchHint { //! @brief Prefetch using NT hint. kX86PrefetchNta = 0, //! @brief Prefetch to L0 cache. kX86PrefetchT0 = 1, //! @brief Prefetch to L1 cache. kX86PrefetchT1 = 2, //! @brief Prefetch to L2 cache. kX86PrefetchT2 = 3 }; // ============================================================================ // [AsmJit::kX86FPSW] // ============================================================================ //! @brief X86 FPU status-word. enum kX86FPSW { kX86FPSW_Invalid = 0x0001, kX86FPSW_Denormalized = 0x0002, kX86FPSW_DivByZero = 0x0004, kX86FPSW_Overflow = 0x0008, kX86FPSW_Underflow = 0x0010, kX86FPSW_Precision = 0x0020, kX86FPSW_StackFault = 0x0040, kX86FPSW_Interrupt = 0x0080, kX86FPSW_C0 = 0x0100, kX86FPSW_C1 = 0x0200, kX86FPSW_C2 = 0x0400, kX86FPSW_Top = 0x3800, kX86FPSW_C3 = 0x4000, kX86FPSW_Busy = 0x8000 }; // ============================================================================ // [AsmJit::kX86FPCW] // ============================================================================ //! @brief X86 FPU control-word. enum kX86FPCW { // -------------------------------------------------------------------------- // [Exception-Mask] // -------------------------------------------------------------------------- kX86FPCW_EM_Mask = 0x003F, // Bits 0-5. kX86FPCW_EM_Invalid = 0x0001, kX86FPCW_EM_Denormal = 0x0002, kX86FPCW_EM_DivByZero = 0x0004, kX86FPCW_EM_Overflow = 0x0008, kX86FPCW_EM_Underflow = 0x0010, kX86FPCW_EM_Inexact = 0x0020, // -------------------------------------------------------------------------- // [Precision-Control] // -------------------------------------------------------------------------- kX86FPCW_PC_Mask = 0x0300, // Bits 8-9. kX86FPCW_PC_Float = 0x0000, kX86FPCW_PC_Reserved = 0x0100, kX86FPCW_PC_Double = 0x0200, kX86FPCW_PC_Extended = 0x0300, // -------------------------------------------------------------------------- // [Rounding-Control] // -------------------------------------------------------------------------- kX86FPCW_RC_Mask = 0x0C00, // Bits 10-11. kX86FPCW_RC_Nearest = 0x0000, kX86FPCW_RC_Down = 0x0400, kX86FPCW_RC_Up = 0x0800, kX86FPCW_RC_Truncate = 0x0C00, // -------------------------------------------------------------------------- // [Infinity-Control] // -------------------------------------------------------------------------- kX86FPCW_IC_Mask = 0x1000, // Bit 12. kX86FPCW_IC_Projective = 0x0000, kX86FPCW_IC_Affine = 0x1000 }; // ============================================================================ // [AsmJit::kX86EmitOption] // ============================================================================ //! @brief Emit options, mainly for internal purposes. enum kX86EmitOption { //! @brief Force REX prefix to be emitted. //! //! This option should be used carefully, because there are unencodable //! combinations. If you want to access ah, bh, ch or dh registers then you //! can't emit REX prefix and it will cause an illegal instruction error. kX86EmitOptionRex = 0x1, //! @brief Tell @c Assembler or @c Compiler to emit and validate lock prefix. //! //! If this option is used and instruction doesn't support LOCK prefix then //! invalid instruction error is generated. kX86EmitOptionLock = 0x2, //! @brief Emit short/near jump or conditional jump instead of far one to //! some bytes. //! //! @note This option could be dangerous in case that the short jump is not //! possible (displacement can't fit into signed 8-bit integer). AsmJit can //! automatically generate back short jumps, but always generates long forward //! jumps, because the information about the code size between the instruction //! and target is not known. kX86EmitOptionShortJump = 0x4, //! @brief Emit full immediate instead of BYTE in all cases. //! //! @note AsmJit is able to emit both forms of immediate value. In case that //! the instruction supports short form and immediate can fit into a signed //! 8-bit integer short for is preferred, but if for any reason the full form //! is required it can be overridden by using this option. kX86EmitOptionFullImmediate = 0x8 }; // ============================================================================ // [AsmJit::kX86InstCode] // ============================================================================ //! @brief X86 instruction codes. //! //! Note that these instruction codes are AsmJit specific. Each instruction is //! unique ID into AsmJit instruction table. Instruction codes are used together //! with AsmJit::Assembler and you can also use instruction codes to serialize //! instructions by @ref Assembler::_emitInstruction() or //! @ref Compiler::_emitInstruction() enum kX86InstCode { kX86InstAdc = 1, // X86/X64 kX86InstAdd, // X86/X64 kX86InstAddPD, // SSE2 kX86InstAddPS, // SSE kX86InstAddSD, // SSE2 kX86InstAddSS, // SSE kX86InstAddSubPD, // SSE3 kX86InstAddSubPS, // SSE3 kX86InstAmdPrefetch, // 3dNow! kX86InstAmdPrefetchW, // 3dNow! kX86InstAnd, // X86/X64 kX86InstAndnPD, // SSE2 kX86InstAndnPS, // SSE kX86InstAndPD, // SSE2 kX86InstAndPS, // SSE kX86InstBlendPD, // SSE4.1 kX86InstBlendPS, // SSE4.1 kX86InstBlendVPD, // SSE4.1 kX86InstBlendVPS, // SSE4.1 kX86InstBsf, // X86/X64 kX86InstBsr, // X86/X64 kX86InstBSwap, // X86/X64 (i486) kX86InstBt, // X86/X64 kX86InstBtc, // X86/X64 kX86InstBtr, // X86/X64 kX86InstBts, // X86/X64 kX86InstCall, // X86/X64 kX86InstCbw, // X86/X64 kX86InstCdq, // X86/X64 kX86InstCdqe, // X64 only kX86InstClc, // X86/X64 kX86InstCld, // X86/X64 kX86InstClFlush, // SSE2 kX86InstCmc, // X86/X64 kX86InstCMov, // Begin (cmovcc) (i586) kX86InstCMovA=kX86InstCMov,//X86/X64 (cmovcc) (i586) kX86InstCMovAE, // X86/X64 (cmovcc) (i586) kX86InstCMovB, // X86/X64 (cmovcc) (i586) kX86InstCMovBE, // X86/X64 (cmovcc) (i586) kX86InstCMovC, // X86/X64 (cmovcc) (i586) kX86InstCMovE, // X86/X64 (cmovcc) (i586) kX86InstCMovG, // X86/X64 (cmovcc) (i586) kX86InstCMovGE, // X86/X64 (cmovcc) (i586) kX86InstCMovL, // X86/X64 (cmovcc) (i586) kX86InstCMovLE, // X86/X64 (cmovcc) (i586) kX86InstCMovNA, // X86/X64 (cmovcc) (i586) kX86InstCMovNAE, // X86/X64 (cmovcc) (i586) kX86InstCMovNB, // X86/X64 (cmovcc) (i586) kX86InstCMovNBE, // X86/X64 (cmovcc) (i586) kX86InstCMovNC, // X86/X64 (cmovcc) (i586) kX86InstCMovNE, // X86/X64 (cmovcc) (i586) kX86InstCMovNG, // X86/X64 (cmovcc) (i586) kX86InstCMovNGE, // X86/X64 (cmovcc) (i586) kX86InstCMovNL, // X86/X64 (cmovcc) (i586) kX86InstCMovNLE, // X86/X64 (cmovcc) (i586) kX86InstCMovNO, // X86/X64 (cmovcc) (i586) kX86InstCMovNP, // X86/X64 (cmovcc) (i586) kX86InstCMovNS, // X86/X64 (cmovcc) (i586) kX86InstCMovNZ, // X86/X64 (cmovcc) (i586) kX86InstCMovO, // X86/X64 (cmovcc) (i586) kX86InstCMovP, // X86/X64 (cmovcc) (i586) kX86InstCMovPE, // X86/X64 (cmovcc) (i586) kX86InstCMovPO, // X86/X64 (cmovcc) (i586) kX86InstCMovS, // X86/X64 (cmovcc) (i586) kX86InstCMovZ, // X86/X64 (cmovcc) (i586) kX86InstCmp, // X86/X64 kX86InstCmpPD, // SSE2 kX86InstCmpPS, // SSE kX86InstCmpSD, // SSE2 kX86InstCmpSS, // SSE kX86InstCmpXCHG, // X86/X64 (i486) kX86InstCmpXCHG16B, // X64 only kX86InstCmpXCHG8B, // X86/X64 (i586) kX86InstComISD, // SSE2 kX86InstComISS, // SSE kX86InstCpuId, // X86/X64 (i486) kX86InstCqo, // X64 only kX86InstCrc32, // SSE4.2 kX86InstCvtDQ2PD, // SSE2 kX86InstCvtDQ2PS, // SSE2 kX86InstCvtPD2DQ, // SSE2 kX86InstCvtPD2PI, // SSE2 kX86InstCvtPD2PS, // SSE2 kX86InstCvtPI2PD, // SSE2 kX86InstCvtPI2PS, // SSE kX86InstCvtPS2DQ, // SSE2 kX86InstCvtPS2PD, // SSE2 kX86InstCvtPS2PI, // SSE kX86InstCvtSD2SI, // SSE2 kX86InstCvtSD2SS, // SSE2 kX86InstCvtSI2SD, // SSE2 kX86InstCvtSI2SS, // SSE kX86InstCvtSS2SD, // SSE2 kX86InstCvtSS2SI, // SSE kX86InstCvttPD2DQ, // SSE2 kX86InstCvttPD2PI, // SSE2 kX86InstCvttPS2DQ, // SSE2 kX86InstCvttPS2PI, // SSE kX86InstCvttSD2SI, // SSE2 kX86InstCvttSS2SI, // SSE kX86InstCwd, // X86/X64 kX86InstCwde, // X86/X64 kX86InstDaa, // X86 only kX86InstDas, // X86 only kX86InstDec, // X86/X64 kX86InstDiv, // X86/X64 kX86InstDivPD, // SSE2 kX86InstDivPS, // SSE kX86InstDivSD, // SSE2 kX86InstDivSS, // SSE kX86InstDpPD, // SSE4.1 kX86InstDpPS, // SSE4.1 kX86InstEmms, // MMX kX86InstEnter, // X86/X64 kX86InstExtractPS, // SSE4.1 kX86InstF2XM1, // X87 kX86InstFAbs, // X87 kX86InstFAdd, // X87 kX86InstFAddP, // X87 kX86InstFBLd, // X87 kX86InstFBStP, // X87 kX86InstFCHS, // X87 kX86InstFClex, // X87 kX86InstFCMovB, // X87 kX86InstFCMovBE, // X87 kX86InstFCMovE, // X87 kX86InstFCMovNB, // X87 kX86InstFCMovNBE, // X87 kX86InstFCMovNE, // X87 kX86InstFCMovNU, // X87 kX86InstFCMovU, // X87 kX86InstFCom, // X87 kX86InstFComI, // X87 kX86InstFComIP, // X87 kX86InstFComP, // X87 kX86InstFComPP, // X87 kX86InstFCos, // X87 kX86InstFDecStP, // X87 kX86InstFDiv, // X87 kX86InstFDivP, // X87 kX86InstFDivR, // X87 kX86InstFDivRP, // X87 kX86InstFEmms, // 3dNow! kX86InstFFree, // X87 kX86InstFIAdd, // X87 kX86InstFICom, // X87 kX86InstFIComP, // X87 kX86InstFIDiv, // X87 kX86InstFIDivR, // X87 kX86InstFILd, // X87 kX86InstFIMul, // X87 kX86InstFIncStP, // X87 kX86InstFInit, // X87 kX86InstFISt, // X87 kX86InstFIStP, // X87 kX86InstFISttP, // SSE3 kX86InstFISub, // X87 kX86InstFISubR, // X87 kX86InstFLd, // X87 kX86InstFLd1, // X87 kX86InstFLdCw, // X87 kX86InstFLdEnv, // X87 kX86InstFLdL2E, // X87 kX86InstFLdL2T, // X87 kX86InstFLdLg2, // X87 kX86InstFLdLn2, // X87 kX86InstFLdPi, // X87 kX86InstFLdZ, // X87 kX86InstFMul, // X87 kX86InstFMulP, // X87 kX86InstFNClex, // X87 kX86InstFNInit, // X87 kX86InstFNop, // X87 kX86InstFNSave, // X87 kX86InstFNStCw, // X87 kX86InstFNStEnv, // X87 kX86InstFNStSw, // X87 kX86InstFPAtan, // X87 kX86InstFPRem, // X87 kX86InstFPRem1, // X87 kX86InstFPTan, // X87 kX86InstFRndInt, // X87 kX86InstFRstor, // X87 kX86InstFSave, // X87 kX86InstFScale, // X87 kX86InstFSin, // X87 kX86InstFSinCos, // X87 kX86InstFSqrt, // X87 kX86InstFSt, // X87 kX86InstFStCw, // X87 kX86InstFStEnv, // X87 kX86InstFStP, // X87 kX86InstFStSw, // X87 kX86InstFSub, // X87 kX86InstFSubP, // X87 kX86InstFSubR, // X87 kX86InstFSubRP, // X87 kX86InstFTst, // X87 kX86InstFUCom, // X87 kX86InstFUComI, // X87 kX86InstFUComIP, // X87 kX86InstFUComP, // X87 kX86InstFUComPP, // X87 kX86InstFWait, // X87 kX86InstFXam, // X87 kX86InstFXch, // X87 kX86InstFXRstor, // X87 kX86InstFXSave, // X87 kX86InstFXtract, // X87 kX86InstFYL2X, // X87 kX86InstFYL2XP1, // X87 kX86InstHAddPD, // SSE3 kX86InstHAddPS, // SSE3 kX86InstHSubPD, // SSE3 kX86InstHSubPS, // SSE3 kX86InstIDiv, // X86/X64 kX86InstIMul, // X86/X64 kX86InstInc, // X86/X64 kX86InstInt3, // X86/X64 kX86InstJ, // Begin (jcc) kX86InstJA = kX86InstJ, // X86/X64 (jcc) kX86InstJAE, // X86/X64 (jcc) kX86InstJB, // X86/X64 (jcc) kX86InstJBE, // X86/X64 (jcc) kX86InstJC, // X86/X64 (jcc) kX86InstJE, // X86/X64 (jcc) kX86InstJG, // X86/X64 (jcc) kX86InstJGE, // X86/X64 (jcc) kX86InstJL, // X86/X64 (jcc) kX86InstJLE, // X86/X64 (jcc) kX86InstJNA, // X86/X64 (jcc) kX86InstJNAE, // X86/X64 (jcc) kX86InstJNB, // X86/X64 (jcc) kX86InstJNBE, // X86/X64 (jcc) kX86InstJNC, // X86/X64 (jcc) kX86InstJNE, // X86/X64 (jcc) kX86InstJNG, // X86/X64 (jcc) kX86InstJNGE, // X86/X64 (jcc) kX86InstJNL, // X86/X64 (jcc) kX86InstJNLE, // X86/X64 (jcc) kX86InstJNO, // X86/X64 (jcc) kX86InstJNP, // X86/X64 (jcc) kX86InstJNS, // X86/X64 (jcc) kX86InstJNZ, // X86/X64 (jcc) kX86InstJO, // X86/X64 (jcc) kX86InstJP, // X86/X64 (jcc) kX86InstJPE, // X86/X64 (jcc) kX86InstJPO, // X86/X64 (jcc) kX86InstJS, // X86/X64 (jcc) kX86InstJZ, // X86/X64 (jcc) kX86InstJmp, // X86/X64 (jmp) kX86InstLdDQU, // SSE3 kX86InstLdMXCSR, // SSE kX86InstLahf, // X86/X64 (CPUID NEEDED) kX86InstLea, // X86/X64 kX86InstLeave, // X86/X64 kX86InstLFence, // SSE2 kX86InstMaskMovDQU, // SSE2 kX86InstMaskMovQ, // MMX-Ext kX86InstMaxPD, // SSE2 kX86InstMaxPS, // SSE kX86InstMaxSD, // SSE2 kX86InstMaxSS, // SSE kX86InstMFence, // SSE2 kX86InstMinPD, // SSE2 kX86InstMinPS, // SSE kX86InstMinSD, // SSE2 kX86InstMinSS, // SSE kX86InstMonitor, // SSE3 kX86InstMov, // X86/X64 kX86InstMovAPD, // SSE2 kX86InstMovAPS, // SSE kX86InstMovBE, // SSE3 - Intel-Atom kX86InstMovD, // MMX/SSE2 kX86InstMovDDup, // SSE3 kX86InstMovDQ2Q, // SSE2 kX86InstMovDQA, // SSE2 kX86InstMovDQU, // SSE2 kX86InstMovHLPS, // SSE kX86InstMovHPD, // SSE2 kX86InstMovHPS, // SSE kX86InstMovLHPS, // SSE kX86InstMovLPD, // SSE2 kX86InstMovLPS, // SSE kX86InstMovMskPD, // SSE2 kX86InstMovMskPS, // SSE2 kX86InstMovNTDQ, // SSE2 kX86InstMovNTDQA, // SSE4.1 kX86InstMovNTI, // SSE2 kX86InstMovNTPD, // SSE2 kX86InstMovNTPS, // SSE kX86InstMovNTQ, // MMX-Ext kX86InstMovQ, // MMX/SSE/SSE2 kX86InstMovQ2DQ, // SSE2 kX86InstMovSD, // SSE2 kX86InstMovSHDup, // SSE3 kX86InstMovSLDup, // SSE3 kX86InstMovSS, // SSE kX86InstMovSX, // X86/X64 kX86InstMovSXD, // X86/X64 kX86InstMovUPD, // SSE2 kX86InstMovUPS, // SSE kX86InstMovZX, // X86/X64 kX86InstMovPtr, // X86/X64 kX86InstMPSADBW, // SSE4.1 kX86InstMul, // X86/X64 kX86InstMulPD, // SSE2 kX86InstMulPS, // SSE kX86InstMulSD, // SSE2 kX86InstMulSS, // SSE kX86InstMWait, // SSE3 kX86InstNeg, // X86/X64 kX86InstNop, // X86/X64 kX86InstNot, // X86/X64 kX86InstOr, // X86/X64 kX86InstOrPD, // SSE2 kX86InstOrPS, // SSE kX86InstPAbsB, // SSSE3 kX86InstPAbsD, // SSSE3 kX86InstPAbsW, // SSSE3 kX86InstPackSSDW, // MMX/SSE2 kX86InstPackSSWB, // MMX/SSE2 kX86InstPackUSDW, // SSE4.1 kX86InstPackUSWB, // MMX/SSE2 kX86InstPAddB, // MMX/SSE2 kX86InstPAddD, // MMX/SSE2 kX86InstPAddQ, // SSE2 kX86InstPAddSB, // MMX/SSE2 kX86InstPAddSW, // MMX/SSE2 kX86InstPAddUSB, // MMX/SSE2 kX86InstPAddUSW, // MMX/SSE2 kX86InstPAddW, // MMX/SSE2 kX86InstPAlignR, // SSSE3 kX86InstPAnd, // MMX/SSE2 kX86InstPAndN, // MMX/SSE2 kX86InstPause, // SSE2. kX86InstPAvgB, // MMX-Ext kX86InstPAvgW, // MMX-Ext kX86InstPBlendVB, // SSE4.1 kX86InstPBlendW, // SSE4.1 kX86InstPCmpEqB, // MMX/SSE2 kX86InstPCmpEqD, // MMX/SSE2 kX86InstPCmpEqQ, // SSE4.1 kX86InstPCmpEqW, // MMX/SSE2 kX86InstPCmpEStrI, // SSE4.2 kX86InstPCmpEStrM, // SSE4.2 kX86InstPCmpGtB, // MMX/SSE2 kX86InstPCmpGtD, // MMX/SSE2 kX86InstPCmpGtQ, // SSE4.2 kX86InstPCmpGtW, // MMX/SSE2 kX86InstPCmpIStrI, // SSE4.2 kX86InstPCmpIStrM, // SSE4.2 kX86InstPExtrB, // SSE4.1 kX86InstPExtrD, // SSE4.1 kX86InstPExtrQ, // SSE4.1 kX86InstPExtrW, // MMX-Ext/SSE2 kX86InstPF2ID, // 3dNow! kX86InstPF2IW, // Enhanced 3dNow! kX86InstPFAcc, // 3dNow! kX86InstPFAdd, // 3dNow! kX86InstPFCmpEQ, // 3dNow! kX86InstPFCmpGE, // 3dNow! kX86InstPFCmpGT, // 3dNow! kX86InstPFMax, // 3dNow! kX86InstPFMin, // 3dNow! kX86InstPFMul, // 3dNow! kX86InstPFNAcc, // Enhanced 3dNow! kX86InstPFPNAcc, // Enhanced 3dNow! kX86InstPFRcp, // 3dNow! kX86InstPFRcpIt1, // 3dNow! kX86InstPFRcpIt2, // 3dNow! kX86InstPFRSqIt1, // 3dNow! kX86InstPFRSqrt, // 3dNow! kX86InstPFSub, // 3dNow! kX86InstPFSubR, // 3dNow! kX86InstPHAddD, // SSSE3 kX86InstPHAddSW, // SSSE3 kX86InstPHAddW, // SSSE3 kX86InstPHMinPOSUW, // SSE4.1 kX86InstPHSubD, // SSSE3 kX86InstPHSubSW, // SSSE3 kX86InstPHSubW, // SSSE3 kX86InstPI2FD, // 3dNow! kX86InstPI2FW, // Enhanced 3dNow! kX86InstPInsRB, // SSE4.1 kX86InstPInsRD, // SSE4.1 kX86InstPInsRQ, // SSE4.1 kX86InstPInsRW, // MMX-Ext kX86InstPMAddUBSW, // SSSE3 kX86InstPMAddWD, // MMX/SSE2 kX86InstPMaxSB, // SSE4.1 kX86InstPMaxSD, // SSE4.1 kX86InstPMaxSW, // MMX-Ext kX86InstPMaxUB, // MMX-Ext kX86InstPMaxUD, // SSE4.1 kX86InstPMaxUW, // SSE4.1 kX86InstPMinSB, // SSE4.1 kX86InstPMinSD, // SSE4.1 kX86InstPMinSW, // MMX-Ext kX86InstPMinUB, // MMX-Ext kX86InstPMinUD, // SSE4.1 kX86InstPMinUW, // SSE4.1 kX86InstPMovMskB, // MMX-Ext kX86InstPMovSXBD, // SSE4.1 kX86InstPMovSXBQ, // SSE4.1 kX86InstPMovSXBW, // SSE4.1 kX86InstPMovSXDQ, // SSE4.1 kX86InstPMovSXWD, // SSE4.1 kX86InstPMovSXWQ, // SSE4.1 kX86InstPMovZXBD, // SSE4.1 kX86InstPMovZXBQ, // SSE4.1 kX86InstPMovZXBW, // SSE4.1 kX86InstPMovZXDQ, // SSE4.1 kX86InstPMovZXWD, // SSE4.1 kX86InstPMovZXWQ, // SSE4.1 kX86InstPMulDQ, // SSE4.1 kX86InstPMulHRSW, // SSSE3 kX86InstPMulHUW, // MMX-Ext kX86InstPMulHW, // MMX/SSE2 kX86InstPMulLD, // SSE4.1 kX86InstPMulLW, // MMX/SSE2 kX86InstPMulUDQ, // SSE2 kX86InstPop, // X86/X64 kX86InstPopAD, // X86 only kX86InstPopCnt, // SSE4.2 kX86InstPopFD, // X86 only kX86InstPopFQ, // X64 only kX86InstPOr, // MMX/SSE2 kX86InstPrefetch, // MMX-Ext kX86InstPSADBW, // MMX-Ext kX86InstPShufB, // SSSE3 kX86InstPShufD, // SSE2 kX86InstPShufW, // MMX-Ext kX86InstPShufHW, // SSE2 kX86InstPShufLW, // SSE2 kX86InstPSignB, // SSSE3 kX86InstPSignD, // SSSE3 kX86InstPSignW, // SSSE3 kX86InstPSllD, // MMX/SSE2 kX86InstPSllDQ, // SSE2 kX86InstPSllQ, // MMX/SSE2 kX86InstPSllW, // MMX/SSE2 kX86InstPSraD, // MMX/SSE2 kX86InstPSraW, // MMX/SSE2 kX86InstPSrlD, // MMX/SSE2 kX86InstPSrlDQ, // SSE2 kX86InstPSrlQ, // MMX/SSE2 kX86InstPSrlW, // MMX/SSE2 kX86InstPSubB, // MMX/SSE2 kX86InstPSubD, // MMX/SSE2 kX86InstPSubQ, // SSE2 kX86InstPSubSB, // MMX/SSE2 kX86InstPSubSW, // MMX/SSE2 kX86InstPSubUSB, // MMX/SSE2 kX86InstPSubUSW, // MMX/SSE2 kX86InstPSubW, // MMX/SSE2 kX86InstPSwapD, // Enhanced 3dNow! kX86InstPTest, // SSE4.1 kX86InstPunpckHBW, // MMX/SSE2 kX86InstPunpckHDQ, // MMX/SSE2 kX86InstPunpckHQDQ, // SSE2 kX86InstPunpckHWD, // MMX/SSE2 kX86InstPunpckLBW, // MMX/SSE2 kX86InstPunpckLDQ, // MMX/SSE2 kX86InstPunpckLQDQ, // SSE2 kX86InstPunpckLWD, // MMX/SSE2 kX86InstPush, // X86/X64 kX86InstPushAD, // X86 only kX86InstPushFD, // X86 only kX86InstPushFQ, // X64 only kX86InstPXor, // MMX/SSE2 kX86InstRcl, // X86/X64 kX86InstRcpPS, // SSE kX86InstRcpSS, // SSE kX86InstRcr, // X86/X64 kX86InstRdtsc, // X86/X64 kX86InstRdtscP, // X86/X64 kX86InstRepLodSB, // X86/X64 (REP) kX86InstRepLodSD, // X86/X64 (REP) kX86InstRepLodSQ, // X64 only (REP) kX86InstRepLodSW, // X86/X64 (REP) kX86InstRepMovSB, // X86/X64 (REP) kX86InstRepMovSD, // X86/X64 (REP) kX86InstRepMovSQ, // X64 only (REP) kX86InstRepMovSW, // X86/X64 (REP) kX86InstRepStoSB, // X86/X64 (REP) kX86InstRepStoSD, // X86/X64 (REP) kX86InstRepStoSQ, // X64 only (REP) kX86InstRepStoSW, // X86/X64 (REP) kX86InstRepECmpSB, // X86/X64 (REP) kX86InstRepECmpSD, // X86/X64 (REP) kX86InstRepECmpSQ, // X64 only (REP) kX86InstRepECmpSW, // X86/X64 (REP) kX86InstRepEScaSB, // X86/X64 (REP) kX86InstRepEScaSD, // X86/X64 (REP) kX86InstRepEScaSQ, // X64 only (REP) kX86InstRepEScaSW, // X86/X64 (REP) kX86InstRepNECmpSB, // X86/X64 (REP) kX86InstRepNECmpSD, // X86/X64 (REP) kX86InstRepNECmpSQ, // X64 only (REP) kX86InstRepNECmpSW, // X86/X64 (REP) kX86InstRepNEScaSB, // X86/X64 (REP) kX86InstRepNEScaSD, // X86/X64 (REP) kX86InstRepNEScaSQ, // X64 only (REP) kX86InstRepNEScaSW, // X86/X64 (REP) kX86InstRet, // X86/X64 kX86InstRol, // X86/X64 kX86InstRor, // X86/X64 kX86InstRoundPD, // SSE4.1 kX86InstRoundPS, // SSE4.1 kX86InstRoundSD, // SSE4.1 kX86InstRoundSS, // SSE4.1 kX86InstRSqrtPS, // SSE kX86InstRSqrtSS, // SSE kX86InstSahf, // X86/X64 (CPUID NEEDED) kX86InstSal, // X86/X64 kX86InstSar, // X86/X64 kX86InstSbb, // X86/X64 kX86InstSet, // Begin (setcc) kX86InstSetA=kX86InstSet,// X86/X64 (setcc) kX86InstSetAE, // X86/X64 (setcc) kX86InstSetB, // X86/X64 (setcc) kX86InstSetBE, // X86/X64 (setcc) kX86InstSetC, // X86/X64 (setcc) kX86InstSetE, // X86/X64 (setcc) kX86InstSetG, // X86/X64 (setcc) kX86InstSetGE, // X86/X64 (setcc) kX86InstSetL, // X86/X64 (setcc) kX86InstSetLE, // X86/X64 (setcc) kX86InstSetNA, // X86/X64 (setcc) kX86InstSetNAE, // X86/X64 (setcc) kX86InstSetNB, // X86/X64 (setcc) kX86InstSetNBE, // X86/X64 (setcc) kX86InstSetNC, // X86/X64 (setcc) kX86InstSetNE, // X86/X64 (setcc) kX86InstSetNG, // X86/X64 (setcc) kX86InstSetNGE, // X86/X64 (setcc) kX86InstSetNL, // X86/X64 (setcc) kX86InstSetNLE, // X86/X64 (setcc) kX86InstSetNO, // X86/X64 (setcc) kX86InstSetNP, // X86/X64 (setcc) kX86InstSetNS, // X86/X64 (setcc) kX86InstSetNZ, // X86/X64 (setcc) kX86InstSetO, // X86/X64 (setcc) kX86InstSetP, // X86/X64 (setcc) kX86InstSetPE, // X86/X64 (setcc) kX86InstSetPO, // X86/X64 (setcc) kX86InstSetS, // X86/X64 (setcc) kX86InstSetZ, // X86/X64 (setcc) kX86InstSFence, // MMX-Ext/SSE kX86InstShl, // X86/X64 kX86InstShld, // X86/X64 kX86InstShr, // X86/X64 kX86InstShrd, // X86/X64 kX86InstShufPD, // SSE2 kX86InstShufPS, // SSE kX86InstSqrtPD, // SSE2 kX86InstSqrtPS, // SSE kX86InstSqrtSD, // SSE2 kX86InstSqrtSS, // SSE kX86InstStc, // X86/X64 kX86InstStd, // X86/X64 kX86InstStMXCSR, // SSE kX86InstSub, // X86/X64 kX86InstSubPD, // SSE2 kX86InstSubPS, // SSE kX86InstSubSD, // SSE2 kX86InstSubSS, // SSE kX86InstTest, // X86/X64 kX86InstUComISD, // SSE2 kX86InstUComISS, // SSE kX86InstUd2, // X86/X64 kX86InstUnpckHPD, // SSE2 kX86InstUnpckHPS, // SSE kX86InstUnpckLPD, // SSE2 kX86InstUnpckLPS, // SSE kX86InstXadd, // X86/X64 (i486) kX86InstXchg, // X86/X64 (i386) kX86InstXor, // X86/X64 kX86InstXorPD, // SSE2 kX86InstXorPS, // SSE _kX86InstCount, _kX86InstJBegin = kX86InstJ, _kX86InstJEnd = kX86InstJmp }; // ============================================================================ // [AsmJit::kX86InstGroup] // ============================================================================ //! @brief X86 instruction groups. //! //! This should be only used by assembler, because it's @c AsmJit::Assembler //! specific grouping. Each group represents one 'case' in the Assembler's //! main emit method. enum kX86InstGroup { // Group categories. kX86InstGroupNone, kX86InstGroupEmit, kX86InstGroupArith, kX86InstGroupBSwap, kX86InstGroupBTest, kX86InstGroupCall, kX86InstGroupCrc32, kX86InstGroupEnter, kX86InstGroupIMul, kX86InstGroupIncDec, kX86InstGroupJcc, kX86InstGroupJmp, kX86InstGroupLea, kX86InstGroupMem, kX86InstGroupMov, kX86InstGroupMovPtr, kX86InstGroupMovSxMovZx, kX86InstGroupMovSxD, kX86InstGroupPush, kX86InstGroupPop, kX86InstGroupRegRm, kX86InstGroupRm, kX86InstGroupRmByte, kX86InstGroupRmReg, kX86InstGroupRep, kX86InstGroupRet, kX86InstGroupRot, kX86InstGroupShldShrd, kX86InstGroupTest, kX86InstGroupXchg, // Group for x87 FP instructions in format mem or st(i), st(i) (fadd, fsub, fdiv, ...) kX86InstGroupX87StM, // Group for x87 FP instructions in format st(i), st(i) kX86InstGroupX87StI, // Group for fld/fst/fstp instruction, internally uses @ref kX86InstGroupX87StM group. kX86InstGroupX87FldFst, // Group for x87 FP instructions that uses Word, DWord, QWord or TWord memory pointer. kX86InstGroupX87Mem, // Group for x87 FSTSW/FNSTSW instructions kX86InstGroupX87Status, // Group for movbe instruction kX86InstGroupMovBE, // Group for MMX/SSE instructions in format (X)MM|Reg|Mem <- (X)MM|Reg|Mem, // 0x66 prefix must be set manually in opcodes. // - Primary opcode is used for instructions in (X)MM <- (X)MM/Mem format, // - Secondary opcode is used for instructions in (X)MM/Mem <- (X)MM format. kX86InstGroupMmuMov, kX86InstGroupMmuMovD, kX86InstGroupMmuMovQ, // Group for pextrd, pextrq and pextrw instructions (it's special instruction // not similar to others) kX86InstGroupMmuExtract, // Group for prefetch instruction kX86InstGroupMmuPrefetch, // Group for MMX/SSE instructions in format (X)MM|Reg <- (X)MM|Reg|Mem|Imm, // 0x66 prefix is added for MMX instructions that used by SSE2 registers. // - Primary opcode is used for instructions in (X)MM|Reg <- (X)MM|Reg|Mem format, // - Secondary opcode is iused for instructions in (X)MM|Reg <- Imm format. kX86InstGroupMmuRmI, kX86InstGroupMmuRmImm8, // Group for 3dNow instructions kX86InstGroupMmuRm3dNow }; // ============================================================================ // [AsmJit::kX86InstFlags] // ============================================================================ //! @brief X86 instruction type flags. enum kX86InstFlags { //! @brief No flags. kX86InstFlagNone = 0x00, //! @brief Instruction is jump, conditional jump, call or ret. kX86InstFlagJump = 0x01, //! @brief Instruction will overwrite first operand - o[0]. kX86InstFlagMov = 0x02, //! @brief Instruction is X87 FPU. kX86InstFlagFpu = 0x04, //! @brief Instruction can be prepended using LOCK prefix //! (usable for multithreaded applications). kX86InstFlagLockable = 0x08, //! @brief Instruction is special, this is for @c Compiler. kX86InstFlagSpecial = 0x10, //! @brief Instruction always performs memory access. //! //! This flag is always combined with @c kX86InstFlagSpecial and signalizes //! that there is an implicit address which is accessed (usually EDI/RDI or //! ESI/EDI). kX86InstFlagSpecialMem = 0x20 }; // ============================================================================ // [AsmJit::kX86InstOp] // ============================================================================ //! @brief X86 instruction operand flags. enum kX86InstOp { // X86, MM, XMM kX86InstOpGb = 0x0001, kX86InstOpGw = 0x0002, kX86InstOpGd = 0x0004, kX86InstOpGq = 0x0008, kX86InstOpMm = 0x0010, kX86InstOpXmm = 0x0020, kX86InstOpMem = 0x0040, kX86InstOpImm = 0x0080, kX86InstOpGbMem = kX86InstOpGb | kX86InstOpMem, kX86InstOpGwMem = kX86InstOpGw | kX86InstOpMem, kX86InstOpGdMem = kX86InstOpGd | kX86InstOpMem, kX86InstOpGqMem = kX86InstOpGq | kX86InstOpMem, kX86InstOpGqdwb = kX86InstOpGq | kX86InstOpGd | kX86InstOpGw | kX86InstOpGb, kX86InstOpGqdw = kX86InstOpGq | kX86InstOpGd | kX86InstOpGw, kX86InstOpGqd = kX86InstOpGq | kX86InstOpGd, kX86InstOpGwb = kX86InstOpGw | kX86InstOpGb, kX86InstOpGqdwbMem = kX86InstOpGqdwb | kX86InstOpMem, kX86InstOpGqdwMem = kX86InstOpGqdw | kX86InstOpMem, kX86InstOpGqdMem = kX86InstOpGqd | kX86InstOpMem, kX86InstOpGwbMem = kX86InstOpGwb | kX86InstOpMem, // MMX/XMM. kX86InstOpMmMem = kX86InstOpMm | kX86InstOpMem, kX86InstOpXmmMem = kX86InstOpXmm | kX86InstOpMem, kX86InstOpMmXmm = kX86InstOpMm | kX86InstOpXmm, kX86InstOpMmXmmMem = kX86InstOpMmXmm | kX86InstOpMem, // X87. kX86InstOpStM2 = kX86InstOpMem | 0x0100, kX86InstOpStM4 = kX86InstOpMem | 0x0200, kX86InstOpStM8 = kX86InstOpMem | 0x0400, kX86InstOpStM10 = kX86InstOpMem | 0x0800, kX86InstOpStM2_4 = kX86InstOpStM2 | kX86InstOpStM4, kX86InstOpStM2_4_8 = kX86InstOpStM2_4 | kX86InstOpStM8, kX86InstOpStM4_8 = kX86InstOpStM4 | kX86InstOpStM8, kX86InstOpStM4_8_10 = kX86InstOpStM4_8 | kX86InstOpStM10, // Don't emit REX prefix. kX86InstOpNoRex = 0x2000 }; // ============================================================================ // [AsmJit::x86InstName] // ============================================================================ //! @internal //! //! @brief X86 instruction names. ASMJIT_VAR const char x86InstName[]; // ============================================================================ // [AsmJit::X86InstInfo] // ============================================================================ //! @brief X86 instruction information. struct X86InstInfo { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get instruction code, see @ref kX86InstCode. inline uint32_t getCode() const { return _code; } //! @brief Get instruction name string (null terminated string). inline const char* getName() const { return x86InstName + static_cast(_nameIndex); } //! @brief Get instruction name index (index to @ref x86InstName array). inline uint32_t getNameIndex() const { return _nameIndex; } //! @brief Get instruction group, see @ref kX86InstGroup. inline uint32_t getGroup() const { return _group; } //! @brief Get instruction flags, see @ref kX86InstFlags. inline uint32_t getFlags() const { return _group; } //! @brief Get whether the instruction is conditional or standard jump. inline bool isJump() const { return (_flags & kX86InstFlagJump) != 0; } //! @brief Get whether the instruction is MOV type. inline bool isMov() const { return (_flags & kX86InstFlagMov) != 0; } //! @brief Get whether the instruction is X87 FPU type. inline bool isFpu() const { return (_flags & kX86InstFlagFpu) != 0; } //! @brief Get whether the instruction can be prefixed by LOCK prefix. inline bool isLockable() const { return (_flags & kX86InstFlagLockable) != 0; } //! @brief Get whether the instruction is special type (this is used by //! @c Compiler to manage additional variables or functionality). inline bool isSpecial() const { return (_flags & kX86InstFlagSpecial) != 0; } //! @brief Get whether the instruction is special type and it performs //! memory access. inline bool isSpecialMem() const { return (_flags & kX86InstFlagSpecialMem) != 0; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Instruction code. uint16_t _code; //! @brief Instruction name index in x86InstName[] array. uint16_t _nameIndex; //! @brief Instruction group, used also by @c Compiler. uint8_t _group; //! @brief Instruction type flags. uint8_t _flags; //! @brief First and second operand flags (some groups depends on these settings, used also by @c Compiler). uint16_t _opFlags[2]; //! @brief If instruction has only memory operand, this is register opcode. uint16_t _opCodeR; //! @brief Primary and secondary opcodes. uint32_t _opCode[2]; }; // ============================================================================ // [AsmJit::x86InstInfo] // ============================================================================ ASMJIT_VAR const X86InstInfo x86InstInfo[]; // ============================================================================ // [AsmJit::kX86FuncConv] // ============================================================================ //! @brief X86 function calling conventions. //! //! Calling convention is scheme how function arguments are passed into //! function and how functions returns values. In assembler programming //! it's needed to always comply with function calling conventions, because //! even small inconsistency can cause undefined behavior or crash. //! //! List of calling conventions for 32-bit x86 mode: //! - @c kX86FuncConvCDecl - Calling convention for C runtime. //! - @c kX86FuncConvStdCall - Calling convention for WinAPI functions. //! - @c kX86FuncConvMsThisCall - Calling convention for C++ members under //! Windows (produced by MSVC and all MSVC compatible compilers). //! - @c kX86FuncConvMsFastCall - Fastest calling convention that can be used //! by MSVC compiler. //! - @c kX86FuncConv_BORNANDFASTCALL - Borland fastcall convention. //! - @c kX86FuncConvGccFastCall - GCC fastcall convention (2 register arguments). //! - @c kX86FuncConvGccRegParm1 - GCC regparm(1) convention. //! - @c kX86FuncConvGccRegParm2 - GCC regparm(2) convention. //! - @c kX86FuncConvGccRegParm3 - GCC regparm(3) convention. //! //! List of calling conventions for 64-bit x86 mode (x64): //! - @c kX86FuncConvX64W - Windows 64-bit calling convention (WIN64 ABI). //! - @c kX86FuncConvX64U - Unix 64-bit calling convention (AMD64 ABI). //! //! There is also @c kX86FuncConvDefault that is defined to fit best to your //! compiler. //! //! These types are used together with @c AsmJit::Compiler::newFunc() //! method. enum kX86FuncConv { // -------------------------------------------------------------------------- // [X64] // -------------------------------------------------------------------------- //! @brief X64 calling convention for Windows platform (WIN64 ABI). //! //! For first four arguments are used these registers: //! - 1. 32/64-bit integer or floating point argument - rcx/xmm0 //! - 2. 32/64-bit integer or floating point argument - rdx/xmm1 //! - 3. 32/64-bit integer or floating point argument - r8/xmm2 //! - 4. 32/64-bit integer or floating point argument - r9/xmm3 //! //! Note first four arguments here means arguments at positions from 1 to 4 //! (included). For example if second argument is not passed by register then //! rdx/xmm1 register is unused. //! //! All other arguments are pushed on the stack in right-to-left direction. //! Stack is aligned by 16 bytes. There is 32-byte shadow space on the stack //! that can be used to save up to four 64-bit registers (probably designed to //! be used to save first four arguments passed in registers). //! //! Arguments direction: //! - Right to Left (except for first 4 parameters that's in registers) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - RAX register. //! - Floating points - XMM0 register. //! //! Stack is always aligned by 16 bytes. //! //! More information about this calling convention can be found on MSDN: //! http://msdn.microsoft.com/en-us/library/9b372w95.aspx . kX86FuncConvX64W = 1, //! @brief X64 calling convention for Unix platforms (AMD64 ABI). //! //! First six 32 or 64-bit integer arguments are passed in rdi, rsi, rdx, //! rcx, r8, r9 registers. First eight floating point or XMM arguments //! are passed in xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7 registers. //! This means that in registers can be transferred up to 14 arguments total. //! //! There is also RED ZONE below the stack pointer that can be used for //! temporary storage. The red zone is the space from [rsp-128] to [rsp-8]. //! //! Arguments direction: //! - Right to Left (Except for arguments passed in registers). //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - RAX register. //! - Floating points - XMM0 register. //! //! Stack is always aligned by 16 bytes. kX86FuncConvX64U = 2, // -------------------------------------------------------------------------- // [X86] // -------------------------------------------------------------------------- //! @brief Cdecl calling convention (used by C runtime). //! //! Compatible across MSVC and GCC. //! //! Arguments direction: //! - Right to Left //! //! Stack is cleaned by: //! - Caller. kX86FuncConvCDecl = 3, //! @brief Stdcall calling convention (used by WinAPI). //! //! Compatible across MSVC and GCC. //! //! Arguments direction: //! - Right to Left //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvStdCall = 4, //! @brief MSVC specific calling convention used by MSVC/Intel compilers //! for struct/class methods. //! //! This is MSVC (and Intel) only calling convention used in Windows //! world for C++ class methods. Implicit 'this' pointer is stored in //! ECX register instead of storing it on the stack. //! //! Arguments direction: //! - Right to Left (except this pointer in ECX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! C++ class methods that have variable count of arguments uses different //! calling convention called cdecl. //! //! @note This calling convention is always used by MSVC for class methods, //! it's implicit and there is no way how to override it. kX86FuncConvMsThisCall = 5, //! @brief MSVC specific fastcall. //! //! Two first parameters (evaluated from left-to-right) are in ECX:EDX //! registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first two integer arguments in ECX:EDX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! @note This calling convention differs to GCC one in stack cleaning //! mechanism. kX86FuncConvMsFastCall = 6, //! @brief Borland specific fastcall with 2 parameters in registers. //! //! Two first parameters (evaluated from left-to-right) are in ECX:EDX //! registers, all others on the stack in left-to-right order. //! //! Arguments direction: //! - Left to Right (except to first two integer arguments in ECX:EDX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! @note Arguments on the stack are in left-to-right order that differs //! to other fastcall conventions used in different compilers. kX86FuncConvBorlandFastCall = 7, //! @brief GCC specific fastcall convention. //! //! Two first parameters (evaluated from left-to-right) are in ECX:EDX //! registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first two integer arguments in ECX:EDX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! @note This calling convention should be compatible to //! @c kX86FuncConvMsFastCall. kX86FuncConvGccFastCall = 8, //! @brief GCC specific regparm(1) convention. //! //! The first parameter (evaluated from left-to-right) is in EAX register, //! all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first one integer argument in EAX) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvGccRegParm1 = 9, //! @brief GCC specific regparm(2) convention. //! //! Two first parameters (evaluated from left-to-right) are in EAX:EDX //! registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first two integer arguments in EAX:EDX) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvGccRegParm2 = 10, //! @brief GCC specific fastcall with 3 parameters in registers. //! //! Three first parameters (evaluated from left-to-right) are in //! EAX:EDX:ECX registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first three integer arguments in EAX:EDX:ECX) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvGccRegParm3 = 11, // -------------------------------------------------------------------------- // [Detect] // -------------------------------------------------------------------------- //! @def kX86FuncConvDefault //! @brief Default calling convention for current platform / operating system. //! @def kX86FuncConvCompatFastCall //! @brief Compatibility for __fastcall calling convention. //! //! @note This enumeration is always set to a value which is compatible to //! current compilers __fastcall calling convention. In 64-bit mode the value //! is compatible to @ref kX86FuncConvX64W or @ref kX86FuncConvX64U. //! @def kX86FuncConvCompatStdCall //! @brief Compatibility for __stdcall calling convention. //! //! @note This enumeration is always set to a value which is compatible to //! current compilers __stdcall calling convention. In 64-bit mode the value //! is compatible to @ref kX86FuncConvX64W or @ref kX86FuncConvX64U. //! @def kX86FuncConvCompatCDecl //! @brief Default C calling convention based on current compiler's settings. #if defined(ASMJIT_X86) kX86FuncConvDefault = kX86FuncConvCDecl, # if defined(_MSC_VER) kX86FuncConvCompatFastCall = kX86FuncConvMsFastCall, # elif defined(__GNUC__) kX86FuncConvCompatFastCall = kX86FuncConvGccFastCall, # elif defined(__BORLANDC__) kX86FuncConvCompatFastCall = kX86FuncConvBorlandFastCall, # else # error "AsmJit::kX86FuncConvCompatFastCall not supported." # endif kX86FuncConvCompatStdCall = kX86FuncConvStdCall, kX86FuncConvCompatCDecl = kX86FuncConvCDecl #else # if defined(ASMJIT_WINDOWS) kX86FuncConvDefault = kX86FuncConvX64W, # else kX86FuncConvDefault = kX86FuncConvX64U, # endif kX86FuncConvCompatFastCall = kX86FuncConvDefault, kX86FuncConvCompatStdCall = kX86FuncConvDefault, kX86FuncConvCompatCDecl = kX86FuncConvDefault #endif // ASMJIT_X86 }; // ============================================================================ // [AsmJit::kX86FuncHint] // ============================================================================ //! @brief X86 function hints. enum kX86FuncHint { //! @brief Use push/pop sequences instead of mov sequences in function prolog //! and epilog. kX86FuncHintPushPop = 8, //! @brief Add emms instruction to the function epilog. kX86FuncHintEmms = 9, //! @brief Add sfence instruction to the function epilog. kX86FuncHintSFence = 10, //! @brief Add lfence instruction to the function epilog. kX86FuncHintLFence = 11, //! @brief Assume that stack is aligned to 16-bytes. kX86FuncHintAssume16ByteAlignment = 12, //! @brief Perform 16-byte stack alignmend by function. kX86FuncHintPerform16ByteAlignment = 13 }; // ============================================================================ // [AsmJit::kX86FuncFlags] // ============================================================================ //! @brief X86 function flags. enum kX86FuncFlags { //! @brief Whether to emit prolog / epilog sequence using push & pop //! instructions (the default). kX86FuncFlagPushPop = (1U << 8), //! @brief Whether to emit EMMS instruction in epilog (auto-detected). kX86FuncFlagEmitEmms = (1U << 9), //! @brief Whether to emit SFence instruction in epilog (auto-detected). //! //! @note @ref kX86FuncFlagEmitSFence and @ref kX86FuncFlagEmitLFence //! combination will result in emitting mfence. kX86FuncFlagEmitSFence = (1U << 10), //! @brief Whether to emit LFence instruction in epilog (auto-detected). //! //! @note @ref kX86FuncFlagEmitSFence and @ref kX86FuncFlagEmitLFence //! combination will result in emitting mfence. kX86FuncFlagEmitLFence = (1U << 11), //! @brief Whether the function stack is aligned by 16-bytes by OS. //! //! This is always true for 64-bit mode and for linux. kX86FuncFlagAssume16ByteAlignment = (1U << 12), //! @brief Whether the function stack (for variables) is aligned manually //! by function to 16-bytes. //! //! This makes sense only if @ref kX86FuncFlagAssume16ByteAlignment is //! false and MOVDQA instruction or other SSE/SSE2 instructions are used to //! work with variables stored on the stack. //! //! Value is determined automatically by these factors, expectations are: //! //! 1. There is 16-byte wide variable which address was used (alloc, spill, //! op). //! 2. Function can't be naked. kX86FuncFlagPerform16ByteAlignment = (1U << 13), //! @brief Whether the ESP register is adjusted by the stack size needed //! to save registers and function variables. //! //! Esp is adjusted by 'sub' instruction in prolog and by add function in //! epilog (only if function is not naked). kX86FuncFlagIsEspAdjusted = (1U << 14) }; // ============================================================================ // [AsmJit::kX86CompilerInst] // ============================================================================ //! @brief Instruction flags used by @ref X86CompilerInst item. enum kX86CompilerInstFlag { //! @brief Whether the instruction is special. kX86CompilerInstFlagIsSpecial = (1U << 0), //! @brief Whether the instruction is FPU. kX86CompilerInstFlagIsFpu = (1U << 1), //! @brief Whether the one of the operands is GPB.Lo register. kX86CompilerInstFlagIsGpbLoUsed = (1U << 2), //! @brief Whether the one of the operands is GPB.Hi register. kX86CompilerInstFlagIsGpbHiUsed = (1U << 3), //! @brief Whether the jmp/jcc is likely to be taken. kX86CompilerInstFlagIsTaken = (1U << 7) }; // ============================================================================ // [AsmJit::kX86VarClass] // ============================================================================ //! @brief X86 variable class. enum kX86VarClass { //! @brief No class (used internally). kX86VarClassNone = 0, //! @brief General purpose register. kX86VarClassGp = 1, //! @brief X87 floating point. kX86VarClassX87 = 2, //! @brief MMX register. kX86VarClassMm = 3, //! @brief XMM register. kX86VarClassXmm = 4, //! @brief Count of X86 variable classes. kX86VarClassCount = 5 }; // ============================================================================ // [AsmJit::kX86VarFlags] // ============================================================================ //! @brief X86 variable class. enum kX86VarFlags { //! @brief Variable contains single-precision floating-point(s). kX86VarFlagSP = 0x10, //! @brief Variable contains double-precision floating-point(s). kX86VarFlagDP = 0x20, //! @brief Variable is packed (for example float4x, double2x, ...). kX86VarFlagPacked = 0x40 }; // ============================================================================ // [AsmJit::kX86VarType] // ============================================================================ //! @brief X86 variable type. enum kX86VarType { // -------------------------------------------------------------------------- // [Platform Dependent] // -------------------------------------------------------------------------- //! @brief Variable is 32-bit general purpose register. kX86VarTypeGpd = 0, //! @brief Variable is 64-bit general purpose register. kX86VarTypeGpq = 1, //! @var kX86VarTypeGpz //! @brief Variable is system wide general purpose register (32-bit or 64-bit). #if defined(ASMJIT_X86) kX86VarTypeGpz = kX86VarTypeGpd, #else kX86VarTypeGpz = kX86VarTypeGpq, #endif //! @brief Variable is X87 (FPU). kX86VarTypeX87 = 2, //! @brief Variable is X87 (FPU) SP-FP number (float). kX86VarTypeX87SS = 3, //! @brief Variable is X87 (FPU) DP-FP number (double). kX86VarTypeX87SD = 4, //! @brief Variable is MM register / memory location. kX86VarTypeMm = 5, //! @brief Variable is XMM register / memory location. kX86VarTypeXmm = 6, //! @brief Variable is SSE scalar SP-FP number. kX86VarTypeXmmSS = 7, //! @brief Variable is SSE packed SP-FP number (4 floats). kX86VarTypeXmmPS = 8, //! @brief Variable is SSE2 scalar DP-FP number. kX86VarTypeXmmSD = 9, //! @brief Variable is SSE2 packed DP-FP number (2 doubles). kX86VarTypeXmmPD = 10, //! @brief Count of variable types. kX86VarTypeCount = 11, // -------------------------------------------------------------------------- // [Platform Independent] // -------------------------------------------------------------------------- //! @brief Variable is 32-bit integer. kX86VarTypeInt32 = kX86VarTypeGpd, //! @brief Variable is 64-bit integer. kX86VarTypeInt64 = kX86VarTypeGpq, //! @brief Variable is system dependent integer / pointer. kX86VarTypeIntPtr = kX86VarTypeGpz, #if defined(ASMJIT_X86) kX86VarTypeFloat = kX86VarTypeX87SS, kX86VarTypeDouble = kX86VarTypeX87SD #else kX86VarTypeFloat = kX86VarTypeXmmSS, kX86VarTypeDouble = kX86VarTypeXmmSD #endif }; // ============================================================================ // [AsmJit::X86VarInfo] // ============================================================================ //! @brief X86 variable information. struct X86VarInfo { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get register code base, see @ref kX86RegCode. inline uint32_t getCode() const { return _code; } //! @brief Get register size in bytes. inline uint32_t getSize() const { return _size; } //! @brief Get variable class, see @ref kX86VarClass. inline uint32_t getClass() const { return _class; } //! @brief Get variable flags, see @ref kX86VarFlags. inline uint32_t getFlags() const { return _flags; } //! @brief Get variable type name. inline const char* getName() const { return _name; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Register code base, see @ref kX86RegCode. uint32_t _code; //! @brief Register size in bytes. uint16_t _size; //! @brief Variable class, see @ref kX86VarClass. uint8_t _class; //! @brief Variable flags, see @ref kX86VarFlags. uint8_t _flags; //! @brief Variable type name. char _name[8]; }; // ============================================================================ // [AsmJit::x86VarInfo] // ============================================================================ ASMJIT_VAR const X86VarInfo x86VarInfo[]; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86DEFS_H desmume-0.9.11/src/utils/AsmJit/x86/x86func.h0000755000000000000000000002235212467662066017202 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86FUNC_H #define _ASMJIT_X86_X86FUNC_H // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/func.h" #include "../x86/x86defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::TypeId] // ============================================================================ ASMJIT_DECLARE_TYPE_CORE(kX86VarTypeIntPtr); ASMJIT_DECLARE_TYPE_ID(void, kVarTypeInvalid); ASMJIT_DECLARE_TYPE_ID(Void, kVarTypeInvalid); ASMJIT_DECLARE_TYPE_ID(int8_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(uint8_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(int16_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(uint16_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(int32_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(uint32_t, kX86VarTypeGpd); #if defined(ASMJIT_X64) ASMJIT_DECLARE_TYPE_ID(int64_t, kX86VarTypeGpq); ASMJIT_DECLARE_TYPE_ID(uint64_t, kX86VarTypeGpq); #endif // ASMJIT_X64 ASMJIT_DECLARE_TYPE_ID(float, kX86VarTypeFloat); ASMJIT_DECLARE_TYPE_ID(double, kX86VarTypeDouble); // ============================================================================ // [AsmJit::X86FuncDecl] // ============================================================================ //! @brief X86 function, including calling convention, arguments and their //! register indices or stack positions. struct X86FuncDecl : public FuncDecl { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref FunctionX86 instance. inline X86FuncDecl() { reset(); } // -------------------------------------------------------------------------- // [Accessors - Core] // -------------------------------------------------------------------------- //! @brief Get stack size needed for function arguments passed on the stack. inline uint32_t getArgumentsStackSize() const { return _argumentsStackSize; } //! @brief Get bit-mask of GP registers used to pass function arguments. inline uint32_t getGpArgumentsMask() const { return _gpArgumentsMask; } //! @brief Get bit-mask of MM registers used to pass function arguments. inline uint32_t getMmArgumentsMask() const { return _mmArgumentsMask; } //! @brief Get bit-mask of XMM registers used to pass function arguments. inline uint32_t getXmmArgumentsMask() const { return _xmmArgumentsMask; } // -------------------------------------------------------------------------- // [Accessors - Convention] // -------------------------------------------------------------------------- //! @brief Get function calling convention, see @c kX86FuncConv. inline uint32_t getConvention() const { return _convention; } //! @brief Get whether the callee pops the stack. inline uint32_t getCalleePopsStack() const { return _calleePopsStack; } //! @brief Get direction of arguments passed on the stack. //! //! Direction should be always @c kFuncArgsRTL. //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline uint32_t getArgumentsDirection() const { return _argumentsDirection; } //! @brief Get registers used to pass first integer parameters by current //! calling convention. //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline const uint8_t* getGpList() const { return _gpList; } //! @brief Get registers used to pass first SP-FP or DP-FPparameters by //! current calling convention. //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline const uint8_t* getXmmList() const { return _xmmList; } //! @brief Get bit-mask of GP registers which might be used for arguments. inline uint32_t getGpListMask() const { return _gpListMask; } //! @brief Get bit-mask of MM registers which might be used for arguments. inline uint32_t getMmListMask() const { return _mmListMask; } //! @brief Get bit-mask of XMM registers which might be used for arguments. inline uint32_t getXmmListMask() const { return _xmmListMask; } //! @brief Get bit-mask of general purpose registers that's preserved //! (non-volatile). //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline uint32_t getGpPreservedMask() const { return _gpPreservedMask; } //! @brief Get bit-mask of MM registers that's preserved (non-volatile). //! //! @note No standardized calling function is not preserving MM registers. //! This member is here for extension writers who need for some reason custom //! calling convention that can be called through code generated by AsmJit //! (or other runtime code generator). inline uint32_t getMmPreservedMask() const { return _mmPreservedMask; } //! @brief Get bit-mask of XMM registers that's preserved (non-volatile). //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline uint32_t getXmmPreservedMask() const { return _xmmPreservedMask; } // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Find argument ID by the register code. ASMJIT_API uint32_t findArgumentByRegCode(uint32_t regCode) const; // -------------------------------------------------------------------------- // [SetPrototype] // -------------------------------------------------------------------------- //! @brief Set function prototype. //! //! This will set function calling convention and setup arguments variables. //! //! @note This function will allocate variables, it can be called only once. ASMJIT_API void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); // -------------------------------------------------------------------------- // [Reset] // -------------------------------------------------------------------------- ASMJIT_API void reset(); // -------------------------------------------------------------------------- // [Members - Core] // -------------------------------------------------------------------------- //! @brief Count of bytes consumed by arguments on the stack. uint16_t _argumentsStackSize; //! @brief Bitmask for GP registers used as passed function arguments. uint16_t _gpArgumentsMask; //! @brief Bitmask for MM registers used as passed function arguments. uint16_t _mmArgumentsMask; //! @brief Bitmask for XMM registers used as passed function arguments. uint16_t _xmmArgumentsMask; // -------------------------------------------------------------------------- // [Membes - Convention] // // This section doesn't depend on function arguments or return type. It // depends only on function calling convention and it's filled according to // that value. // -------------------------------------------------------------------------- //! @brief Calling convention. uint8_t _convention; //! @brief Whether a callee pops stack. uint8_t _calleePopsStack; //! @brief Direction for arguments passed on the stack, see @c kFuncArgsDirection. uint8_t _argumentsDirection; //! @brief Reserved for future use #1 (alignment). uint8_t _reserved1; //! @brief List of register IDs used for GP arguments (order is important). //! //! @note All registers in _gpList are also specified in @ref _gpListMask. //! Unused fields are filled by @ref kRegIndexInvalid. uint8_t _gpList[16]; //! @brief List of register IDs used for XMM arguments (order is important). //! //! @note All registers in _gpList are also specified in @ref _xmmListMask. //! Unused fields are filled by @ref kRegIndexInvalid. uint8_t _xmmList[16]; //! @brief Bitmask for GP registers which might be used by arguments. //! //! @note All registers in _gpListMask are also specified in @ref _gpList. uint16_t _gpListMask; //! @brief Bitmask for MM registers which might be used by arguments. uint16_t _mmListMask; //! @brief Bitmask for XMM registers which might be used by arguments. //! //! @note All registers in _xmmListMask are also specified in @ref _xmmList. uint16_t _xmmListMask; //! @brief Bitmask for GP registers preserved across the function call. //! //! @note Preserved register mask is complement to @ref _gpListMask. uint16_t _gpPreservedMask; //! @brief Bitmask for MM registers preserved across the function call. //! //! @note Preserved register mask is complement to @ref _mmListMask. uint16_t _mmPreservedMask; //! @brief Bitmask for XMM registers preserved across the function call. //! //! @note Preserved register mask is complement to @ref _xmmListMask. uint16_t _xmmPreservedMask; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86FUNC_H desmume-0.9.11/src/utils/AsmJit/x86/x86assembler.cpp0000755000000000000000000025110412467662066020556 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/context.h" #include "../core/cpuinfo.h" #include "../core/defs.h" #include "../core/intutil.h" #include "../core/logger.h" #include "../core/memorymanager.h" #include "../core/memorymarker.h" #include "../core/stringutil.h" #include "../x86/x86assembler.h" #include "../x86/x86cpuinfo.h" #include "../x86/x86defs.h" #include "../x86/x86operand.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [Constants] // ============================================================================ enum { kMaxCommentLength = 80 }; // ============================================================================ // [AsmJit::X64TrampolineWriter] // ============================================================================ #if defined(ASMJIT_X64) //! @brief Class used to determine size of trampoline and as trampoline writer. struct X64TrampolineWriter { // Size of trampoline enum { kSizeJmp = 6, kSizeAddr = 8, kSizeTotal = kSizeJmp + kSizeAddr }; // Write trampoline into code at address @a code that will jump to @a target. static void writeTrampoline(uint8_t* code, uint64_t target) { code[0] = 0xFF; // Jmp OpCode. code[1] = 0x25; // ModM (RIP addressing). ((uint32_t*)(code + 2))[0] = 0; // Offset (zero). ((uint64_t*)(code + kSizeJmp))[0] = (uint64_t)target; // Absolute address. } }; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::X86Assembler - Construction / Destruction] // ============================================================================ X86Assembler::X86Assembler(Context* context) : Assembler(context) { _properties = IntUtil::maskFromIndex(kX86PropertyOptimizedAlign); } X86Assembler::~X86Assembler() { } // ============================================================================ // [AsmJit::X86Assembler - Buffer - Setters (X86-Extensions)] // ============================================================================ void X86Assembler::setVarAt(size_t pos, sysint_t i, uint8_t isUnsigned, uint32_t size) { if (size == 1 && !isUnsigned) setByteAt (pos, (int8_t )i); else if (size == 1 && isUnsigned) setByteAt (pos, (uint8_t )i); else if (size == 2 && !isUnsigned) setWordAt (pos, (int16_t )i); else if (size == 2 && isUnsigned) setWordAt (pos, (uint16_t)i); else if (size == 4 && !isUnsigned) setDWordAt(pos, (int32_t )i); else if (size == 4 && isUnsigned) setDWordAt(pos, (uint32_t)i); #if defined(ASMJIT_X64) else if (size == 8 && !isUnsigned) setQWordAt(pos, (int64_t )i); else if (size == 8 && isUnsigned) setQWordAt(pos, (uint64_t)i); #endif // ASMJIT_X64 else ASMJIT_ASSERT(0); } // ============================================================================ // [AsmJit::X86Assembler - Emit] // ============================================================================ void X86Assembler::_emitModM( uint8_t opReg, const Mem& mem, sysint_t immSize) { ASMJIT_ASSERT(mem.getType() == kOperandMem); uint8_t baseReg = mem.getBase() & 0x7; uint8_t indexReg = mem.getIndex() & 0x7; sysint_t disp = mem.getDisplacement(); uint32_t shift = mem.getShift(); if (mem.getMemType() == kOperandMemNative) { // [base + displacemnt] if (!mem.hasIndex()) { // ESP/RSP/R12 == 4 if (baseReg == 4) { uint8_t mod = 0; if (disp) mod = IntUtil::isInt8(disp) ? 1 : 2; _emitMod(mod, opReg, 4); _emitSib(0, 4, 4); if (disp) { if (IntUtil::isInt8(disp)) _emitByte((int8_t)disp); else _emitInt32((int32_t)disp); } } // EBP/RBP/R13 == 5 else if (baseReg != 5 && disp == 0) { _emitMod(0, opReg, baseReg); } else if (IntUtil::isInt8(disp)) { _emitMod(1, opReg, baseReg); _emitByte((int8_t)disp); } else { _emitMod(2, opReg, baseReg); _emitInt32((int32_t)disp); } } // [base + index * scale + displacemnt] else { // ASMJIT_ASSERT(indexReg != RID_ESP); // EBP/RBP/R13 == 5 if (baseReg != 5 && disp == 0) { _emitMod(0, opReg, 4); _emitSib(shift, indexReg, baseReg); } else if (IntUtil::isInt8(disp)) { _emitMod(1, opReg, 4); _emitSib(shift, indexReg, baseReg); _emitByte((int8_t)disp); } else { _emitMod(2, opReg, 4); _emitSib(shift, indexReg, baseReg); _emitInt32((int32_t)disp); } } } // Address | 32-bit mode | 64-bit mode // ------------------------------+-------------+--------------- // [displacement] | ABSOLUTE | RELATIVE (RIP) // [index * scale + displacemnt] | ABSOLUTE | ABSOLUTE (ZERO EXTENDED) else { // - In 32-bit mode the absolute addressing model is used. // - In 64-bit mode the relative addressing model is used together with // the absolute addressing. Main problem is that if instruction // contains SIB then relative addressing (RIP) is not possible. #if defined(ASMJIT_X86) if (mem.hasIndex()) { // ASMJIT_ASSERT(mem.getMemIndex() != 4); // ESP/RSP == 4 _emitMod(0, opReg, 4); _emitSib(shift, indexReg, 5); } else { _emitMod(0, opReg, 5); } // X86 uses absolute addressing model, all relative addresses will be // relocated to absolute ones. if (mem.getMemType() == kOperandMemLabel) { LabelData& l_data = _labels[mem._mem.base & kOperandIdValueMask]; RelocData r_data; uint32_t relocId = _relocData.getLength(); // Relative addressing will be relocated to absolute address. r_data.type = kRelocRelToAbs; r_data.size = 4; r_data.offset = getOffset(); r_data.destination = disp; if (l_data.offset != -1) { // Bound label. r_data.destination += l_data.offset; // Add a dummy DWORD. _emitInt32(0); } else { // Non-bound label. _emitDisplacement(l_data, -4 - immSize, 4)->relocId = relocId; } _relocData.append(r_data); } else { // Absolute address _emitInt32( (int32_t)((uint8_t*)mem._mem.target + disp) ); } #else // X64 uses relative addressing model if (mem.getMemType() == kOperandMemLabel) { LabelData& l_data = _labels[mem._mem.base & kOperandIdValueMask]; if (mem.hasIndex()) { // Indexing is not possible. setError(kErrorIllegalAddressing); return; } // Relative address (RIP +/- displacement). _emitMod(0, opReg, 5); disp -= (4 + immSize); if (l_data.offset != -1) { // Bound label. disp += getOffset() - l_data.offset; // Displacement is known. _emitInt32((int32_t)disp); } else { // Non-bound label. _emitDisplacement(l_data, disp, 4); } } else { // Absolute address (truncated to 32-bits), this kind of address requires // SIB byte (4). _emitMod(0, opReg, 4); if (mem.hasIndex()) { // ASMJIT_ASSERT(mem.getMemIndex() != 4); // ESP/RSP == 4 _emitSib(shift, indexReg, 5); } else { _emitSib(0, 4, 5); } // Truncate to 32-bits. sysuint_t target = (sysuint_t)((uint8_t*)mem._mem.target + disp); if (target > (sysuint_t)0xFFFFFFFF) { if (_logger) { _logger->logString("*** ASSEMBER WARNING - Absolute address truncated to 32-bits.\n"); } target &= 0xFFFFFFFF; } _emitInt32( (int32_t)((uint32_t)target) ); } #endif // ASMJIT_X64 } } void X86Assembler::_emitModRM( uint8_t opReg, const Operand& op, sysint_t immSize) { ASMJIT_ASSERT(op.getType() == kOperandReg || op.getType() == kOperandMem); if (op.getType() == kOperandReg) _emitModR(opReg, reinterpret_cast(op).getRegCode()); else _emitModM(opReg, reinterpret_cast(op), immSize); } void X86Assembler::_emitSegmentPrefix(const Operand& rm) { static const uint8_t segmentCode[6] = { 0x26, // ES 0x2E, // SS 0x36, // SS 0x3E, // DS 0x64, // FS 0x65 // GS }; if (!rm.isMem()) return; uint32_t seg = reinterpret_cast(rm).getSegment(); if (seg >= kX86RegNumSeg) return; _emitByte(segmentCode[seg]); } void X86Assembler::_emitX86Inl( uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t reg, bool forceRexPrefix) { // 16-bit prefix. if (i16bit) _emitByte(0x66); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexR(rexw, 0, reg, forceRexPrefix); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)(opCode & 0x000000FF) + (reg & 0x7)); } void X86Assembler::_emitX86RM( uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t o, const Operand& op, sysint_t immSize, bool forceRexPrefix) { // 16-bit prefix. if (i16bit) _emitByte(0x66); // Segment prefix. _emitSegmentPrefix(op); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexRM(rexw, o, op, forceRexPrefix); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)(opCode & 0x000000FF)); // Mod R/M. _emitModRM(o, op, immSize); } void X86Assembler::_emitFpu(uint32_t opCode) { _emitOpCode(opCode); } void X86Assembler::_emitFpuSTI(uint32_t opCode, uint32_t sti) { // Illegal stack offset. ASMJIT_ASSERT(0 <= sti && sti < 8); _emitOpCode(opCode + sti); } void X86Assembler::_emitFpuMEM(uint32_t opCode, uint8_t opReg, const Mem& mem) { // Segment prefix. _emitSegmentPrefix(mem); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexRM(0, opReg, mem, false); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)((opCode & 0x000000FF))); _emitModM(opReg, mem, 0); } void X86Assembler::_emitMmu(uint32_t opCode, uint8_t rexw, uint8_t opReg, const Operand& src, sysint_t immSize) { // Segment prefix. _emitSegmentPrefix(src); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexRM(rexw, opReg, src, false); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); // No checking, MMX/SSE instructions have always two opcodes or more. _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)((opCode & 0x000000FF))); if (src.isReg()) _emitModR(opReg, reinterpret_cast(src).getRegCode()); else _emitModM(opReg, reinterpret_cast(src), immSize); } X86Assembler::LabelLink* X86Assembler::_emitDisplacement( LabelData& l_data, sysint_t inlinedDisplacement, int size) { ASMJIT_ASSERT(l_data.offset == -1); ASMJIT_ASSERT(size == 1 || size == 4); // Chain with label. LabelLink* link = _newLabelLink(); link->prev = l_data.links; link->offset = getOffset(); link->displacement = inlinedDisplacement; l_data.links = link; // Emit label size as dummy data. if (size == 1) _emitByte(0x01); else // if (size == 4) _emitDWord(0x04040404); return link; } void X86Assembler::_emitJmpOrCallReloc(uint32_t instruction, void* target) { RelocData rd; rd.type = kRelocTrampoline; #if defined(ASMJIT_X64) // If we are compiling in 64-bit mode, we can use trampoline if relative jump // is not possible. _trampolineSize += X64TrampolineWriter::kSizeTotal; #endif // ARCHITECTURE_SPECIFIC rd.size = 4; rd.offset = getOffset(); rd.address = target; _relocData.append(rd); // Emit dummy 32-bit integer (will be overwritten by relocCode()). _emitInt32(0); } //! @internal //! //! @brief Get whether the extended register (additional eight registers //! introduced by 64-bit mode) is used. static inline bool X86Assembler_isExtRegisterUsed(const Operand& op) { // Hacky, but correct. // - If operand type is register then extended register is register with // index 8 and greater (8 to 15 inclusive). // - If operand type is memory operand then we need to take care about // label (in _mem.base) and kInvalidValue, we just decrement the value // by 8 and check if it's at interval 0 to 7 inclusive (if it's there // then it's extended register. return (op.isReg() && (op._reg.code & kRegIndexMask) >= 8U) || (op.isMem() && ((((uint32_t)op._mem.base - 8U) < 8U) || (((uint32_t)op._mem.index - 8U) < 8U) )); } // Logging helpers. static const char* AssemblerX86_operandSize[] = { NULL, "byte ptr ", "word ptr ", NULL, "dword ptr ", NULL, NULL, NULL, "qword ptr ", NULL, "tword ptr ", NULL, NULL, NULL, NULL, NULL, "dqword ptr " }; static const char X86Assembler_segmentName[] = "es:\0" "cs:\0" "ss:\0" "ds:\0" "fs:\0" "gs:\0" "\0\0\0\0"; static char* X86Assembler_dumpInstructionName(char* buf, uint32_t code) { ASMJIT_ASSERT(code < _kX86InstCount); return StringUtil::copy(buf, x86InstInfo[code].getName()); } char* X86Assembler_dumpRegister(char* buf, uint32_t type, uint32_t index) { // NE == Not-Encodable. const char reg8l[] = "al\0\0" "cl\0\0" "dl\0\0" "bl\0\0" "spl\0" "bpl\0" "sil\0" "dil\0" ; const char reg8h[] = "ah\0\0" "ch\0\0" "dh\0\0" "bh\0\0" "NE\0\0" "NE\0\0" "NE\0\0" "NE\0\0"; const char reg16[] = "ax\0\0" "cx\0\0" "dx\0\0" "bx\0\0" "sp\0\0" "bp\0\0" "si\0\0" "di\0\0"; switch (type) { case kX86RegTypeGpbLo: if (index < 8) return StringUtil::copy(buf, ®8l[index*4]); *buf++ = 'r'; goto _EmitID; case kX86RegTypeGpbHi: if (index < 4) return StringUtil::copy(buf, ®8h[index*4]); _EmitNE: return StringUtil::copy(buf, "NE"); case kX86RegTypeGpw: if (index < 8) return StringUtil::copy(buf, ®16[index*4]); *buf++ = 'r'; buf = StringUtil::utoa(buf, index); *buf++ = 'w'; return buf; case kX86RegTypeGpd: if (index < 8) { *buf++ = 'e'; return StringUtil::copy(buf, ®16[index*4]); } *buf++ = 'r'; buf = StringUtil::utoa(buf, index); *buf++ = 'd'; return buf; case kX86RegTypeGpq: *buf++ = 'r'; if (index < 8) return StringUtil::copy(buf, ®16[index*4]); _EmitID: return StringUtil::utoa(buf, index); case kX86RegTypeX87: *buf++ = 's'; *buf++ = 't'; goto _EmitID; case kX86RegTypeMm: *buf++ = 'm'; *buf++ = 'm'; goto _EmitID; case kX86RegTypeXmm: *buf++ = 'x'; *buf++ = 'm'; *buf++ = 'm'; goto _EmitID; case kX86RegTypeYmm: *buf++ = 'y'; *buf++ = 'm'; *buf++ = 'm'; goto _EmitID; case kX86RegTypeSeg: if (index < kX86RegNumSeg) return StringUtil::copy(buf, &X86Assembler_segmentName[index*4], 2); goto _EmitNE; default: return buf; } } char* X86Assembler_dumpOperand(char* buf, const Operand* op, uint32_t memRegType, uint32_t loggerFlags) { if (op->isReg()) { const Reg& reg = reinterpret_cast(*op); return X86Assembler_dumpRegister(buf, reg.getRegType(), reg.getRegIndex()); } else if (op->isMem()) { const Mem& mem = reinterpret_cast(*op); uint32_t seg = mem.getSegment(); bool isAbsolute = false; if (op->getSize() <= 16) buf = StringUtil::copy(buf, AssemblerX86_operandSize[op->getSize()]); if (seg < kX86RegNumSeg) buf = StringUtil::copy(buf, &X86Assembler_segmentName[seg * 4]); *buf++ = '['; switch (mem.getMemType()) { case kOperandMemNative: { // [base + index << shift + displacement] buf = X86Assembler_dumpRegister(buf, memRegType, mem.getBase()); break; } case kOperandMemLabel: { // [label + index << shift + displacement] buf += sprintf(buf, "L.%u", mem.getBase() & kOperandIdValueMask); break; } case kOperandMemAbsolute: { // [absolute] isAbsolute = true; buf = StringUtil::utoa(buf, (sysuint_t)mem.getTarget() + mem.getDisplacement(), 16); break; } } if (mem.hasIndex()) { buf = StringUtil::copy(buf, " + "); buf = X86Assembler_dumpRegister(buf, memRegType, mem.getIndex()); if (mem.getShift()) { buf = StringUtil::copy(buf, " * "); *buf++ = "1248"[mem.getShift() & 3]; } } if (mem.getDisplacement() && !isAbsolute) { sysint_t d = mem.getDisplacement(); uint32_t base = 10; char sign = '+'; if (d < 0) { d = -d; sign = '-'; } buf[0] = ' '; buf[1] = sign; buf[2] = ' '; buf += 3; if ((loggerFlags & kLoggerOutputHexDisplacement) != 0 && d > 9) { buf[0] = '0'; buf[1] = 'x'; buf += 2; base = 16; } buf = StringUtil::utoa(buf, static_cast(d), base); } *buf++ = ']'; return buf; } else if (op->isImm()) { const Imm& i = reinterpret_cast(*op); sysuint_t value = i.getUValue(); uint32_t base = 10; if ((loggerFlags & kLoggerOutputHexImmediate) && value > 9) base = 16; if (i.isUnsigned() || base == 16) { return StringUtil::utoa(buf, value, base); } else { return StringUtil::itoa(buf, static_cast(value), base); } } else if (op->isLabel()) { return buf + sprintf(buf, "L.%u", op->getId() & kOperandIdValueMask); } else { return StringUtil::copy(buf, "None"); } } static char* X86Assembler_dumpInstruction(char* buf, uint32_t code, uint32_t emitOptions, const Operand* o0, const Operand* o1, const Operand* o2, uint32_t memRegType, uint32_t loggerFlags) { // Rex, lock, and short prefix. if (emitOptions & kX86EmitOptionRex) buf = StringUtil::copy(buf, "rex ", 4); if (emitOptions & kX86EmitOptionLock) buf = StringUtil::copy(buf, "lock ", 5); if (emitOptions & kX86EmitOptionShortJump) buf = StringUtil::copy(buf, "short ", 6); // Dump instruction name. buf = X86Assembler_dumpInstructionName(buf, code); // Dump operands. if (!o0->isNone()) { *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o0, memRegType, loggerFlags); } if (!o1->isNone()) { *buf++ = ','; *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o1, memRegType, loggerFlags); } if (!o2->isNone()) { *buf++ = ','; *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o2, memRegType, loggerFlags); } return buf; } static char* X86Assembler_dumpComment(char* buf, size_t len, const uint8_t* binaryData, size_t binaryLen, const char* comment) { size_t currentLength = len; size_t commentLength = comment ? strnlen(comment, kMaxCommentLength) : 0; if (binaryLen || commentLength) { size_t align = 32; char sep = ';'; for (size_t i = (binaryLen == 0); i < 2; i++) { char* bufBegin = buf; // Append align. if (currentLength < align) { buf = StringUtil::fill(buf, ' ', align - currentLength); } // Append separator. if (sep) { *buf++ = sep; *buf++ = ' '; } // Append binary data or comment. if (i == 0) { buf = StringUtil::hex(buf, binaryData, binaryLen); if (commentLength == 0) break; } else { buf = StringUtil::copy(buf, comment, commentLength); } currentLength += (size_t)(buf - bufBegin); align += 18; sep = '|'; } } *buf++ = '\n'; return buf; } static const _OpReg _patchedHiRegs[4] = { // Operand |Size|Reserved0|Reserved1| OperandId | RegisterCode | // ----------+----+---------+---------+--------------+-----------------------+ { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 4 }, { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 5 }, { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 6 }, { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 7 } }; void X86Assembler::_emitInstruction(uint32_t code) { _emitInstruction(code, &noOperand, &noOperand, &noOperand); } void X86Assembler::_emitInstruction(uint32_t code, const Operand* o0) { _emitInstruction(code, o0, &noOperand, &noOperand); } void X86Assembler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1) { _emitInstruction(code, o0, o1, &noOperand); } void X86Assembler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2) { ASMJIT_ASSERT(o0 != NULL); ASMJIT_ASSERT(o1 != NULL); ASMJIT_ASSERT(o2 != NULL); const Operand* _loggerOperands[3]; uint32_t bLoHiUsed = 0; #if defined(ASMJIT_X86) uint32_t forceRexPrefix = false; #else uint32_t forceRexPrefix = _emitOptions & kX86EmitOptionRex; #endif uint32_t memRegType = kX86RegTypeGpz; #if defined(ASMJIT_DEBUG) bool assertIllegal = false; #endif // ASMJIT_DEBUG const Imm* immOperand = NULL; uint32_t immSize; #define _FINISHED() \ goto _End #define _FINISHED_IMMEDIATE(_Operand_, _Size_) \ do { \ immOperand = reinterpret_cast(_Operand_); \ immSize = (_Size_); \ goto _EmitImmediate; \ } while (0) // Convert operands to kOperandNone if needed. if (o0->isReg()) bLoHiUsed |= o0->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi); if (o1->isReg()) bLoHiUsed |= o1->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi); if (o2->isReg()) bLoHiUsed |= o2->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi); size_t beginOffset = getOffset(); const X86InstInfo* id = &x86InstInfo[code]; if (code >= _kX86InstCount) { setError(kErrorUnknownInstruction); goto _Cleanup; } // Check if register operand is BPL, SPL, SIL, DIL and do action that depends // to current mode: // - 64-bit: - Force REX prefix. // // Check if register operand is AH, BH, CH or DH and do action that depends // to current mode: // - 32-bit: - Patch operand index (index += 4), because we are using // different index what is used in opcode. // - 64-bit: - Check whether there is REX prefix and raise error if it is. // - Do the same as in 32-bit mode - patch register index. // // NOTE: This is a hit hacky, but I added this to older code-base and I have // no energy to rewrite it. Maybe in future all of this can be cleaned up! if (bLoHiUsed | forceRexPrefix) { _loggerOperands[0] = o0; _loggerOperands[1] = o1; _loggerOperands[2] = o2; #if defined(ASMJIT_X64) // Check if there is register that makes this instruction un-encodable. forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o0); forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o1); forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o2); if (o0->isRegType(kX86RegTypeGpbLo) && (o0->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true; else if (o1->isRegType(kX86RegTypeGpbLo) && (o1->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true; else if (o2->isRegType(kX86RegTypeGpbLo) && (o2->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true; if ((bLoHiUsed & kX86RegTypeGpbHi) != 0 && forceRexPrefix) { goto _IllegalInstruction; } #endif // ASMJIT_X64 // Patch GPB.HI operand index. if ((bLoHiUsed & kX86RegTypeGpbHi) != 0) { if (o0->isRegType(kX86RegTypeGpbHi)) o0 = reinterpret_cast(&_patchedHiRegs[o0->_reg.code & kRegIndexMask]); if (o1->isRegType(kX86RegTypeGpbHi)) o1 = reinterpret_cast(&_patchedHiRegs[o1->_reg.code & kRegIndexMask]); if (o2->isRegType(kX86RegTypeGpbHi)) o2 = reinterpret_cast(&_patchedHiRegs[o2->_reg.code & kRegIndexMask]); } } // Check for buffer space (and grow if needed). if (!canEmit()) goto _Cleanup; if (_emitOptions & kX86EmitOptionLock) { if (!id->isLockable()) goto _IllegalInstruction; _emitByte(0xF0); } switch (id->getGroup()) { case kX86InstGroupNone: { _FINISHED(); } case kX86InstGroupEmit: { _emitOpCode(id->_opCode[0]); _FINISHED(); } case kX86InstGroupArith: { uint32_t opCode = id->_opCode[0]; uint8_t opReg = (uint8_t)id->_opCodeR; // Mem <- Reg if (o0->isMem() && o1->isReg()) { _emitX86RM(opCode + (o1->getSize() != 1), o1->getSize() == 2, o1->getSize() == 8, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } // Reg <- Reg|Mem if (o0->isReg() && o1->isRegMem()) { _emitX86RM(opCode + 2 + (o0->getSize() != 1), o0->getSize() == 2, o0->getSize() == 8, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0, forceRexPrefix); _FINISHED(); } // Alternate Form - AL, AX, EAX, RAX. if (o0->isRegIndex(0) && o1->isImm()) { if (o0->getSize() == 1 || !IntUtil::isInt8(static_cast(o1)->getValue())) { if (o0->getSize() == 2) _emitByte(0x66); // 16-bit. else if (o0->getSize() == 8) _emitByte(0x48); // REX.W. _emitByte((opReg << 3) | (0x04 + (o0->getSize() != 1))); _FINISHED_IMMEDIATE(o1, IntUtil::_min(o0->getSize(), 4)); } } if (o0->isRegMem() && o1->isImm()) { const Imm& imm = reinterpret_cast(*o1); immSize = IntUtil::isInt8(imm.getValue()) ? 1 : IntUtil::_min(o0->getSize(), 4); _emitX86RM(id->_opCode[1] + (o0->getSize() != 1 ? (immSize != 1 ? 1 : 3) : 0), o0->getSize() == 2, o0->getSize() == 8, opReg, reinterpret_cast(*o0), immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, immSize); } break; } case kX86InstGroupBSwap: { if (o0->isReg()) { const GpReg& dst = reinterpret_cast(*o0); #if defined(ASMJIT_X64) _emitRexR(dst.getRegType() == kX86RegTypeGpq, 1, dst.getRegCode(), forceRexPrefix); #endif // ASMJIT_X64 _emitByte(0x0F); _emitModR(1, dst.getRegCode()); _FINISHED(); } break; } case kX86InstGroupBTest: { if (o0->isRegMem() && o1->isReg()) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src = reinterpret_cast(*o1); _emitX86RM(id->_opCode[0], src.isRegType(kX86RegTypeGpw), src.isRegType(kX86RegTypeGpq), src.getRegCode(), dst, 0, forceRexPrefix); _FINISHED(); } if (o0->isRegMem() && o1->isImm()) { const Operand& dst = reinterpret_cast(*o0); const Imm& src = reinterpret_cast(*o1); _emitX86RM(id->_opCode[1], dst.getSize() == 2, dst.getSize() == 8, (uint8_t)id->_opCodeR, dst, 1, forceRexPrefix); _FINISHED_IMMEDIATE(o1, 1); } break; } case kX86InstGroupCall: { if (o0->isRegTypeMem(kX86RegTypeGpz)) { const Operand& dst = reinterpret_cast(*o0); _emitX86RM(0xFF, 0, 0, 2, dst, 0, forceRexPrefix); _FINISHED(); } if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); _emitByte(0xE8); _emitJmpOrCallReloc(kX86InstGroupCall, (void*)imm.getValue()); _FINISHED(); } if (o0->isLabel()) { LabelData& l_data = _labels[reinterpret_cast(o0)->getId() & kOperandIdValueMask]; if (l_data.offset != -1) { // Bound label. static const sysint_t rel32_size = 5; sysint_t offs = l_data.offset - getOffset(); ASMJIT_ASSERT(offs <= 0); _emitByte(0xE8); _emitInt32((int32_t)(offs - rel32_size)); } else { // Non-bound label. _emitByte(0xE8); _emitDisplacement(l_data, -4, 4); } _FINISHED(); } break; } case kX86InstGroupCrc32: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); ASMJIT_ASSERT(dst.getRegType() == kX86RegTypeGpd || dst.getRegType() == kX86RegTypeGpq); _emitX86RM(id->_opCode[0] + (src.getSize() != 1), src.getSize() == 2, dst.getRegType() == 8, dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupEnter: { if (o0->isImm() && o1->isImm()) { _emitByte(0xC8); _emitWord((uint16_t)(uintptr_t)reinterpret_cast(*o2).getValue()); _emitByte((uint8_t )(uintptr_t)reinterpret_cast(*o1).getValue()); _FINISHED(); } break; } case kX86InstGroupIMul: { // 1 operand if (o0->isRegMem() && o1->isNone() && o2->isNone()) { const Operand& src = reinterpret_cast(*o0); _emitX86RM(0xF6 + (src.getSize() != 1), src.getSize() == 2, src.getSize() == 8, 5, src, 0, forceRexPrefix); _FINISHED(); } // 2 operands else if (o0->isReg() && !o1->isNone() && o2->isNone()) { const GpReg& dst = reinterpret_cast(*o0); ASMJIT_ASSERT(!dst.isRegType(kX86RegTypeGpw)); if (o1->isRegMem()) { const Operand& src = reinterpret_cast(*o1); _emitX86RM(0x0FAF, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } else if (o1->isImm()) { const Imm& imm = reinterpret_cast(*o1); if (IntUtil::isInt8(imm.getValue())) { _emitX86RM(0x6B, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), dst, 1, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, 1); } else { immSize = dst.isRegType(kX86RegTypeGpw) ? 2 : 4; _emitX86RM(0x69, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), dst, immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, immSize); } } } // 3 operands else if (o0->isReg() && o1->isRegMem() && o2->isImm()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); const Imm& imm = reinterpret_cast(*o2); if (IntUtil::isInt8(imm.getValue())) { _emitX86RM(0x6B, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 1, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, 1); } else { immSize = dst.isRegType(kX86RegTypeGpw) ? 2 : 4; _emitX86RM(0x69, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, immSize); } } break; } case kX86InstGroupIncDec: { if (o0->isRegMem()) { const Operand& dst = reinterpret_cast(*o0); // INC [r16|r32] in 64-bit mode is not encodable. #if defined(ASMJIT_X86) if ((dst.isReg()) && (dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpd))) { _emitX86Inl(id->_opCode[0], dst.isRegType(kX86RegTypeGpw), 0, reinterpret_cast(dst).getRegCode(), false); _FINISHED(); } #endif // ASMJIT_X86 _emitX86RM(id->_opCode[1] + (dst.getSize() != 1), dst.getSize() == 2, dst.getSize() == 8, (uint8_t)id->_opCodeR, dst, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupJcc: { if (o0->isLabel()) { LabelData& l_data = _labels[reinterpret_cast(o0)->getId() & kOperandIdValueMask]; uint32_t hint = (uint32_t)(o1->isImm() ? reinterpret_cast(*o1).getValue() : 0); bool isShortJump = (_emitOptions & kX86EmitOptionShortJump) != 0; // Emit jump hint if configured for that. if ((hint & (kCondHintLikely | kCondHintUnlikely)) && (_properties & (1 << kX86PropertyJumpHints))) { if (hint & kCondHintLikely) _emitByte(kX86CondPrefixLikely); else if (hint & kCondHintUnlikely) _emitByte(kX86CondPrefixUnlikely); } if (l_data.offset != -1) { // Bound label. static const sysint_t rel8_size = 2; static const sysint_t rel32_size = 6; sysint_t offs = l_data.offset - getOffset(); ASMJIT_ASSERT(offs <= 0); if (IntUtil::isInt8(offs - rel8_size)) { _emitByte(0x70 | (uint8_t)id->_opCode[0]); _emitByte((uint8_t)(int8_t)(offs - rel8_size)); // Change the emit options so logger can log instruction correctly. _emitOptions |= kX86EmitOptionShortJump; } else { if (isShortJump && _logger) { _logger->logString("*** ASSEMBLER WARNING: Emitting long conditional jump, but short jump instruction forced!\n"); _emitOptions &= ~kX86EmitOptionShortJump; } _emitByte(0x0F); _emitByte(0x80 | (uint8_t)id->_opCode[0]); _emitInt32((int32_t)(offs - rel32_size)); } } else { // Non-bound label. if (isShortJump) { _emitByte(0x70 | (uint8_t)id->_opCode[0]); _emitDisplacement(l_data, -1, 1); } else { _emitByte(0x0F); _emitByte(0x80 | (uint8_t)id->_opCode[0]); _emitDisplacement(l_data, -4, 4); } } _FINISHED(); } break; } case kX86InstGroupJmp: { if (o0->isRegMem()) { const Operand& dst = reinterpret_cast(*o0); _emitX86RM(0xFF, 0, 0, 4, dst, 0, forceRexPrefix); _FINISHED(); } if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); _emitByte(0xE9); _emitJmpOrCallReloc(kX86InstGroupJmp, (void*)imm.getValue()); _FINISHED(); } if (o0->isLabel()) { LabelData& l_data = _labels[reinterpret_cast(o0)->getId() & kOperandIdValueMask]; bool isShortJump = (_emitOptions & kX86EmitOptionShortJump) != 0; if (l_data.offset != -1) { // Bound label. const sysint_t rel8_size = 2; const sysint_t rel32_size = 5; sysint_t offs = l_data.offset - getOffset(); if (IntUtil::isInt8(offs - rel8_size)) { _emitByte(0xEB); _emitByte((uint8_t)(int8_t)(offs - rel8_size)); // Change the emit options so logger can log instruction correctly. _emitOptions |= kX86EmitOptionShortJump; } else { if (isShortJump) { if (_logger) { _logger->logString("*** ASSEMBLER WARNING: Emitting long jump, but short jump instruction forced!\n"); _emitOptions &= ~kX86EmitOptionShortJump; } } _emitByte(0xE9); _emitInt32((int32_t)(offs - rel32_size)); } } else { // Non-bound label. if (isShortJump) { _emitByte(0xEB); _emitDisplacement(l_data, -1, 1); } else { _emitByte(0xE9); _emitDisplacement(l_data, -4, 4); } } _FINISHED(); } break; } case kX86InstGroupLea: { if (o0->isReg() && o1->isMem()) { const GpReg& dst = reinterpret_cast(*o0); const Mem& src = reinterpret_cast(*o1); // Size override prefix support. if (src.getSizePrefix()) { _emitByte(0x67); #if defined(ASMJIT_X86) memRegType = kX86RegTypeGpw; #else memRegType = kX86RegTypeGpd; #endif } _emitX86RM(0x8D, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupMem: { if (o0->isMem()) { _emitX86RM(id->_opCode[0], 0, (uint8_t)id->_opCode[1], (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupMov: { const Operand& dst = *o0; const Operand& src = *o1; switch (dst.getType() << 4 | src.getType()) { // Reg <- Reg/Mem case (kOperandReg << 4) | kOperandReg: { // Reg <- Sreg if (src.isRegType(kX86RegTypeSeg)) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq) ); _emitX86RM(0x8C, dst.getSize() == 2, dst.getSize() == 8, reinterpret_cast(src).getRegCode(), reinterpret_cast(dst), 0, forceRexPrefix); _FINISHED(); } // Sreg <- Reg/Mem if (dst.isRegType(kX86RegTypeSeg)) { ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpw ) || src.isRegType(kX86RegTypeGpd ) || src.isRegType(kX86RegTypeGpq ) ); _Emit_Mov_Sreg_RM: _emitX86RM(0x8E, src.getSize() == 2, src.getSize() == 8, reinterpret_cast(dst).getRegCode(), reinterpret_cast(src), 0, forceRexPrefix); _FINISHED(); } ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpbLo) || src.isRegType(kX86RegTypeGpbHi) || src.isRegType(kX86RegTypeGpw ) || src.isRegType(kX86RegTypeGpd ) || src.isRegType(kX86RegTypeGpq ) ); // ... fall through ... } case (kOperandReg << 4) | kOperandMem: { // Sreg <- Mem if (dst.isRegType(kX86RegTypeSeg)) { goto _Emit_Mov_Sreg_RM; } ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpbLo) || dst.isRegType(kX86RegTypeGpbHi) || dst.isRegType(kX86RegTypeGpw ) || dst.isRegType(kX86RegTypeGpd ) || dst.isRegType(kX86RegTypeGpq ) ); _emitX86RM(0x0000008A + (dst.getSize() != 1), dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), reinterpret_cast(dst).getRegCode(), reinterpret_cast(src), 0, forceRexPrefix); _FINISHED(); } // Reg <- Imm case (kOperandReg << 4) | kOperandImm: { const GpReg& dst = reinterpret_cast(*o0); const Imm& src = reinterpret_cast(*o1); // In 64-bit mode the immediate can be 64-bits long if the // destination operand type is register (otherwise 32-bits). immSize = dst.getSize(); #if defined(ASMJIT_X64) // Optimize instruction size by using 32-bit immediate if value can // fit into it. if (immSize == 8 && IntUtil::isInt32(src.getValue())) { _emitX86RM(0xC7, 0, // 16BIT 1, // REX.W 0, // O dst, 0, forceRexPrefix); immSize = 4; } else { #endif // ASMJIT_X64 _emitX86Inl((dst.getSize() == 1 ? 0xB0 : 0xB8), dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), forceRexPrefix); #if defined(ASMJIT_X64) } #endif // ASMJIT_X64 _FINISHED_IMMEDIATE(&src, immSize); } // Mem <- Reg/Sreg case (kOperandMem << 4) | kOperandReg: { if (src.isRegType(kX86RegTypeSeg)) { // Mem <- Sreg _emitX86RM(0x8C, dst.getSize() == 2, dst.getSize() == 8, reinterpret_cast(src).getRegCode(), reinterpret_cast(dst), 0, forceRexPrefix); _FINISHED(); } else { // Mem <- Reg ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpbLo) || src.isRegType(kX86RegTypeGpbHi) || src.isRegType(kX86RegTypeGpw ) || src.isRegType(kX86RegTypeGpd ) || src.isRegType(kX86RegTypeGpq ) ); _emitX86RM(0x88 + (src.getSize() != 1), src.isRegType(kX86RegTypeGpw), src.isRegType(kX86RegTypeGpq), reinterpret_cast(src).getRegCode(), reinterpret_cast(dst), 0, forceRexPrefix); _FINISHED(); } } // Mem <- Imm case (kOperandMem << 4) | kOperandImm: { immSize = IntUtil::_min(dst.getSize(), 4); _emitX86RM(0xC6 + (dst.getSize() != 1), dst.getSize() == 2, dst.getSize() == 8, 0, reinterpret_cast(dst), immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&src, immSize); } } break; } case kX86InstGroupMovPtr: { if ((o0->isReg() && o1->isImm()) || (o0->isImm() && o1->isReg())) { bool reverse = o1->getType() == kOperandReg; uint8_t opCode = !reverse ? 0xA0 : 0xA2; const GpReg& reg = reinterpret_cast(!reverse ? *o0 : *o1); const Imm& imm = reinterpret_cast(!reverse ? *o1 : *o0); if (reg.getRegIndex() != 0) goto _IllegalInstruction; if (reg.isRegType(kX86RegTypeGpw)) _emitByte(0x66); #if defined(ASMJIT_X64) _emitRexR(reg.getSize() == 8, 0, 0, forceRexPrefix); #endif // ASMJIT_X64 _emitByte(opCode + (reg.getSize() != 1)); _FINISHED_IMMEDIATE(&imm, sizeof(sysint_t)); } break; } case kX86InstGroupMovSxMovZx: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); if (dst.getSize() == 1) goto _IllegalInstruction; if (src.getSize() != 1 && src.getSize() != 2) goto _IllegalInstruction; if (src.getSize() == 2 && dst.getSize() == 2) goto _IllegalInstruction; _emitX86RM(id->_opCode[0] + (src.getSize() != 1), dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } #if defined(ASMJIT_X64) case kX86InstGroupMovSxD: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); _emitX86RM(0x00000063, 0, 1, dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } #endif // ASMJIT_X64 case kX86InstGroupPush: { if (o0->isRegType(kX86RegTypeSeg)) { static const uint32_t opcodeList[] = { 0x06, // ES. 0x0E, // CS. 0x16, // SS. 0x1E, // DS. 0x0FA0, // FS. 0x0FA8 // GS. }; unsigned int segment = reinterpret_cast(o0)->getRegIndex(); ASMJIT_ASSERT(segment < kX86SegCount); unsigned int opcode = opcodeList[segment]; if (opcode > 0xFF) _emitByte(opcode >> 8); _emitByte(opcode & 0xFF); _FINISHED(); } // This section is only for immediates, memory/register operands are handled in kX86InstGroupPop. if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); if (IntUtil::isInt8(imm.getValue())) { _emitByte(0x6A); _FINISHED_IMMEDIATE(&imm, 1); } else { _emitByte(0x68); _FINISHED_IMMEDIATE(&imm, 4); } } // ... goto kX86InstGroupPop ... } case kX86InstGroupPop: { if (o0->isRegType(kX86RegTypeSeg)) { static const uint32_t opcodeList[] = { 0x07, // ES. 0, // CS. 0x17, // SS. 0x1F, // DS. 0x0FA1, // FS. 0x0FA9 // GS. }; unsigned int segment = reinterpret_cast(o0)->getRegIndex(); ASMJIT_ASSERT(segment < kX86SegCount); unsigned int opcode = opcodeList[segment]; ASMJIT_ASSERT(opcode != 0); if (opcode > 0xFF) _emitByte(opcode >> 8); _emitByte(opcode & 0xFF); _FINISHED(); } if (o0->isReg()) { ASMJIT_ASSERT(o0->isRegType(kX86RegTypeGpw) || o0->isRegType(kX86RegTypeGpz)); _emitX86Inl(id->_opCode[0], o0->isRegType(kX86RegTypeGpw), 0, reinterpret_cast(*o0).getRegCode(), forceRexPrefix); _FINISHED(); } if (o0->isMem()) { _emitX86RM(id->_opCode[1], o0->getSize() == 2, 0, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRegRm: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); ASMJIT_ASSERT(dst.getSize() != 1); _emitX86RM(id->_opCode[0], dst.getRegType() == kX86RegTypeGpw, dst.getRegType() == kX86RegTypeGpq, dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRm: { if (o0->isRegMem()) { const Operand& op = reinterpret_cast(*o0); _emitX86RM(id->_opCode[0] + (op.getSize() != 1), op.getSize() == 2, op.getSize() == 8, (uint8_t)id->_opCodeR, op, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRmByte: { if (o0->isRegMem()) { const Operand& op = reinterpret_cast(*o0); // Only BYTE register or BYTE/TYPELESS memory location can be used. ASMJIT_ASSERT(op.getSize() <= 1); _emitX86RM(id->_opCode[0], false, false, 0, op, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRmReg: { if (o0->isRegMem() && o1->isReg()) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src = reinterpret_cast(*o1); _emitX86RM(id->_opCode[0] + (src.getSize() != 1), src.getRegType() == kX86RegTypeGpw, src.getRegType() == kX86RegTypeGpq, src.getRegCode(), dst, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRep: { uint32_t opCode = id->_opCode[0]; uint32_t opSize = id->_opCode[1]; // Emit REP prefix (1 BYTE). _emitByte(opCode >> 24); if (opSize != 1) opCode++; // D, Q and W form. if (opSize == 2) _emitByte(0x66); // 16-bit prefix. #if defined(ASMJIT_X64) else if (opSize == 8) _emitByte(0x48); // REX.W prefix. #endif // ASMJIT_X64 // Emit opcode (1 BYTE). _emitByte(opCode & 0xFF); _FINISHED(); } case kX86InstGroupRet: { if (o0->isNone()) { _emitByte(0xC3); _FINISHED(); } else if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); ASMJIT_ASSERT(IntUtil::isUInt16(imm.getValue())); if (imm.getValue() == 0) { _emitByte(0xC3); _FINISHED(); } else { _emitByte(0xC2); _FINISHED_IMMEDIATE(&imm, 2); } } break; } case kX86InstGroupRot: { if (o0->isRegMem() && (o1->isRegCode(kX86RegCl) || o1->isImm())) { // generate opcode. For these operations is base 0xC0 or 0xD0. bool useImm8 = o1->isImm() && reinterpret_cast(*o1).getValue() != 1; uint32_t opCode = useImm8 ? 0xC0 : 0xD0; // size and operand type modifies the opcode if (o0->getSize() != 1) opCode |= 0x01; if (o1->getType() == kOperandReg) opCode |= 0x02; _emitX86RM(opCode, o0->getSize() == 2, o0->getSize() == 8, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), useImm8 ? 1 : 0, forceRexPrefix); if (useImm8) _FINISHED_IMMEDIATE(o1, 1); else _FINISHED(); } break; } case kX86InstGroupShldShrd: { if (o0->isRegMem() && o1->isReg() && (o2->isImm() || (o2->isReg() && o2->isRegCode(kX86RegCl)))) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src1 = reinterpret_cast(*o1); const Operand& src2 = reinterpret_cast(*o2); ASMJIT_ASSERT(dst.getSize() == src1.getSize()); _emitX86RM(id->_opCode[0] + src2.isReg(), src1.isRegType(kX86RegTypeGpw), src1.isRegType(kX86RegTypeGpq), src1.getRegCode(), dst, src2.isImm() ? 1 : 0, forceRexPrefix); if (src2.isImm()) _FINISHED_IMMEDIATE(&src2, 1); else _FINISHED(); } break; } case kX86InstGroupTest: { if (o0->isRegMem() && o1->isReg()) { ASMJIT_ASSERT(o0->getSize() == o1->getSize()); _emitX86RM(0x84 + (o1->getSize() != 1), o1->getSize() == 2, o1->getSize() == 8, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } // Alternate Form - AL, AX, EAX, RAX. if (o0->isRegIndex(0) && o1->isImm()) { immSize = IntUtil::_min(o0->getSize(), 4); if (o0->getSize() == 2) _emitByte(0x66); // 16-bit. #if defined(ASMJIT_X64) _emitRexRM(o0->getSize() == 8, 0, reinterpret_cast(*o0), forceRexPrefix); #endif // ASMJIT_X64 _emitByte(0xA8 + (o0->getSize() != 1)); _FINISHED_IMMEDIATE(o1, immSize); } if (o0->isRegMem() && o1->isImm()) { immSize = IntUtil::_min(o0->getSize(), 4); if (o0->getSize() == 2) _emitByte(0x66); // 16-bit. _emitSegmentPrefix(reinterpret_cast(*o0)); // Segment prefix. #if defined(ASMJIT_X64) _emitRexRM(o0->getSize() == 8, 0, reinterpret_cast(*o0), forceRexPrefix); #endif // ASMJIT_X64 _emitByte(0xF6 + (o0->getSize() != 1)); _emitModRM(0, reinterpret_cast(*o0), immSize); _FINISHED_IMMEDIATE(o1, immSize); } break; } case kX86InstGroupXchg: { if (o0->isRegMem() && o1->isReg()) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src = reinterpret_cast(*o1); if (src.isRegType(kX86RegTypeGpw)) _emitByte(0x66); // 16-bit. _emitSegmentPrefix(dst); // segment prefix #if defined(ASMJIT_X64) _emitRexRM(src.isRegType(kX86RegTypeGpq), src.getRegCode(), dst, forceRexPrefix); #endif // ASMJIT_X64 // Special opcode for index 0 registers (AX, EAX, RAX vs register). if ((dst.getType() == kOperandReg && dst.getSize() > 1) && (reinterpret_cast(dst).getRegCode() == 0 || reinterpret_cast(src).getRegCode() == 0 )) { uint8_t index = reinterpret_cast(dst).getRegCode() | src.getRegCode(); _emitByte(0x90 + index); _FINISHED(); } _emitByte(0x86 + (src.getSize() != 1)); _emitModRM(src.getRegCode(), dst, 0); _FINISHED(); } break; } case kX86InstGroupMovBE: { if (o0->isReg() && o1->isMem()) { _emitX86RM(0x000F38F0, o0->isRegType(kX86RegTypeGpw), o0->isRegType(kX86RegTypeGpq), reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0, forceRexPrefix); _FINISHED(); } if (o0->isMem() && o1->isReg()) { _emitX86RM(0x000F38F1, o1->isRegType(kX86RegTypeGpw), o1->isRegType(kX86RegTypeGpq), reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupX87StM: { if (o0->isRegType(kX86RegTypeX87)) { uint8_t i1 = reinterpret_cast(*o0).getRegIndex(); uint8_t i2 = 0; if (code != kX86InstFCom && code != kX86InstFComP) { if (!o1->isRegType(kX86RegTypeX87)) goto _IllegalInstruction; i2 = reinterpret_cast(*o1).getRegIndex(); } else if (i1 != 0 && i2 != 0) { goto _IllegalInstruction; } _emitByte(i1 == 0 ? ((id->_opCode[0] & 0xFF000000) >> 24) : ((id->_opCode[0] & 0x00FF0000) >> 16)); _emitByte(i1 == 0 ? ((id->_opCode[0] & 0x0000FF00) >> 8) + i2 : ((id->_opCode[0] & 0x000000FF) ) + i1); _FINISHED(); } if (o0->isMem() && (o0->getSize() == 4 || o0->getSize() == 8) && o1->isNone()) { const Mem& m = reinterpret_cast(*o0); // Segment prefix. _emitSegmentPrefix(m); _emitByte(o0->getSize() == 4 ? ((id->_opCode[0] & 0xFF000000) >> 24) : ((id->_opCode[0] & 0x00FF0000) >> 16)); _emitModM((uint8_t)id->_opCodeR, m, 0); _FINISHED(); } break; } case kX86InstGroupX87StI: { if (o0->isRegType(kX86RegTypeX87)) { uint8_t i = reinterpret_cast(*o0).getRegIndex(); _emitByte((uint8_t)((id->_opCode[0] & 0x0000FF00) >> 8)); _emitByte((uint8_t)((id->_opCode[0] & 0x000000FF) + i)); _FINISHED(); } break; } case kX86InstGroupX87Status: { if (o0->isReg() && reinterpret_cast(*o0).getRegType() <= kX86RegTypeGpq && reinterpret_cast(*o0).getRegIndex() == 0) { _emitOpCode(id->_opCode[1]); _FINISHED(); } if (o0->isMem()) { _emitX86RM(id->_opCode[0], 0, 0, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupX87FldFst: { if (o0->isRegType(kX86RegTypeX87)) { _emitByte((uint8_t)((id->_opCode[1] & 0xFF000000) >> 24)); _emitByte((uint8_t)((id->_opCode[1] & 0x00FF0000) >> 16) + reinterpret_cast(*o0).getRegIndex()); _FINISHED(); } // ... fall through to kX86InstGroupX87Mem ... } case kX86InstGroupX87Mem: { if (!o0->isMem()) goto _IllegalInstruction; const Mem& m = reinterpret_cast(*o0); uint8_t opCode = 0x00, mod = 0; if (o0->getSize() == 2 && (id->_opFlags[0] & kX86InstOpStM2)) { opCode = (uint8_t)((id->_opCode[0] & 0xFF000000) >> 24); mod = (uint8_t)id->_opCodeR; } if (o0->getSize() == 4 && (id->_opFlags[0] & kX86InstOpStM4)) { opCode = (uint8_t)((id->_opCode[0] & 0x00FF0000) >> 16); mod = (uint8_t)id->_opCodeR; } if (o0->getSize() == 8 && (id->_opFlags[0] & kX86InstOpStM8)) { opCode = (uint8_t)((id->_opCode[0] & 0x0000FF00) >> 8); mod = (uint8_t)((id->_opCode[0] & 0x000000FF) ); } if (opCode) { _emitSegmentPrefix(m); _emitByte(opCode); _emitModM(mod, m, 0); _FINISHED(); } break; } case kX86InstGroupMmuMov: { ASMJIT_ASSERT(id->_opFlags[0] != 0); ASMJIT_ASSERT(id->_opFlags[1] != 0); // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm if ((o0->isMem() && (id->_opFlags[0] & kX86InstOpMem) == 0) || (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) || (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) || (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) || (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) || (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) || (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) || (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) || (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) || (o1->isMem() && (id->_opFlags[1] & kX86InstOpMem) == 0) ) { goto _IllegalInstruction; } // Illegal. if (o0->isMem() && o1->isMem()) goto _IllegalInstruction; uint8_t rexw = ((id->_opFlags[0] | id->_opFlags[1]) & kX86InstOpNoRex) ? 0 : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq); // (X)MM|Reg <- (X)MM|Reg if (o0->isReg() && o1->isReg()) { _emitMmu(id->_opCode[0], rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // (X)MM|Reg <- Mem if (o0->isReg() && o1->isMem()) { _emitMmu(id->_opCode[0], rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // Mem <- (X)MM|Reg if (o0->isMem() && o1->isReg()) { _emitMmu(id->_opCode[1], rexw, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } break; } case kX86InstGroupMmuMovD: { if ((o0->isRegType(kX86RegTypeMm) || o0->isRegType(kX86RegTypeXmm)) && (o1->isRegType(kX86RegTypeGpd) || o1->isMem())) { _emitMmu(o0->isRegType(kX86RegTypeXmm) ? 0x66000F6E : 0x00000F6E, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if ((o0->isRegType(kX86RegTypeGpd) || o0->isMem()) && (o1->isRegType(kX86RegTypeMm) || o1->isRegType(kX86RegTypeXmm))) { _emitMmu(o1->isRegType(kX86RegTypeXmm) ? 0x66000F7E : 0x00000F7E, 0, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } break; } case kX86InstGroupMmuMovQ: { if (o0->isRegType(kX86RegTypeMm) && o1->isRegType(kX86RegTypeMm)) { _emitMmu(0x00000F6F, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isRegType(kX86RegTypeXmm) && o1->isRegType(kX86RegTypeXmm)) { _emitMmu(0xF3000F7E, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // Convenience - movdq2q if (o0->isRegType(kX86RegTypeMm) && o1->isRegType(kX86RegTypeXmm)) { _emitMmu(0xF2000FD6, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // Convenience - movq2dq if (o0->isRegType(kX86RegTypeXmm) && o1->isRegType(kX86RegTypeMm)) { _emitMmu(0xF3000FD6, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isRegType(kX86RegTypeMm) && o1->isMem()) { _emitMmu(0x00000F6F, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isRegType(kX86RegTypeXmm) && o1->isMem()) { _emitMmu(0xF3000F7E, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isMem() && o1->isRegType(kX86RegTypeMm)) { _emitMmu(0x00000F7F, 0, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } if (o0->isMem() && o1->isRegType(kX86RegTypeXmm)) { _emitMmu(0x66000FD6, 0, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } #if defined(ASMJIT_X64) if ((o0->isRegType(kX86RegTypeMm) || o0->isRegType(kX86RegTypeXmm)) && (o1->isRegType(kX86RegTypeGpq) || o1->isMem())) { _emitMmu(o0->isRegType(kX86RegTypeXmm) ? 0x66000F6E : 0x00000F6E, 1, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if ((o0->isRegType(kX86RegTypeGpq) || o0->isMem()) && (o1->isRegType(kX86RegTypeMm) || o1->isRegType(kX86RegTypeXmm))) { _emitMmu(o1->isRegType(kX86RegTypeXmm) ? 0x66000F7E : 0x00000F7E, 1, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } #endif // ASMJIT_X64 break; } case kX86InstGroupMmuExtract: { if (!(o0->isRegMem() && (o1->isRegType(kX86RegTypeXmm) || (code == kX86InstPExtrW && o1->isRegType(kX86RegTypeMm))) && o2->isImm())) { goto _IllegalInstruction; } uint32_t opCode = id->_opCode[0]; uint8_t isGpdGpq = o0->isRegType(kX86RegTypeGpd) | o0->isRegType(kX86RegTypeGpq); if (code == kX86InstPExtrB && (o0->getSize() != 0 && o0->getSize() != 1) && !isGpdGpq) goto _IllegalInstruction; if (code == kX86InstPExtrW && (o0->getSize() != 0 && o0->getSize() != 2) && !isGpdGpq) goto _IllegalInstruction; if (code == kX86InstPExtrD && (o0->getSize() != 0 && o0->getSize() != 4) && !isGpdGpq) goto _IllegalInstruction; if (code == kX86InstPExtrQ && (o0->getSize() != 0 && o0->getSize() != 8) && !isGpdGpq) goto _IllegalInstruction; if (o1->isRegType(kX86RegTypeXmm)) opCode |= 0x66000000; if (o0->isReg()) { _emitMmu(opCode, id->_opCodeR | (uint8_t)o0->isRegType(kX86RegTypeGpq), reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 1); _FINISHED_IMMEDIATE(o2, 1); } if (o0->isMem()) { _emitMmu(opCode, (uint8_t)id->_opCodeR, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 1); _FINISHED_IMMEDIATE(o2, 1); } break; } case kX86InstGroupMmuPrefetch: { if (o0->isMem() && o1->isImm()) { const Mem& mem = reinterpret_cast(*o0); const Imm& hint = reinterpret_cast(*o1); _emitMmu(0x00000F18, 0, (uint8_t)hint.getValue(), mem, 0); _FINISHED(); } break; } case kX86InstGroupMmuRmI: { ASMJIT_ASSERT(id->_opFlags[0] != 0); ASMJIT_ASSERT(id->_opFlags[1] != 0); // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm if (!o0->isReg() || (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) || (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) || (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) || (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) || (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) || (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) || (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) || (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) || (o1->isMem() && (id->_opFlags[1] & kX86InstOpMem) == 0) || (o1->isImm() && (id->_opFlags[1] & kX86InstOpImm) == 0)) { goto _IllegalInstruction; } uint32_t prefix = ((id->_opFlags[0] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o0->isRegType(kX86RegTypeXmm)) || ((id->_opFlags[1] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o1->isRegType(kX86RegTypeXmm)) ? 0x66000000 : 0x00000000; uint8_t rexw = ((id->_opFlags[0] | id->_opFlags[1]) & kX86InstOpNoRex) ? 0 : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq); // (X)MM <- (X)MM (opcode0) if (o1->isReg()) { if ((id->_opFlags[1] & (kX86InstOpMmXmm | kX86InstOpGqd)) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // (X)MM <- Mem (opcode0) if (o1->isMem()) { if ((id->_opFlags[1] & kX86InstOpMem) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // (X)MM <- Imm (opcode1+opcodeR) if (o1->isImm()) { if ((id->_opFlags[1] & kX86InstOpImm) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[1] | prefix, rexw, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 1); _FINISHED_IMMEDIATE(o1, 1); } break; } case kX86InstGroupMmuRmImm8: { ASMJIT_ASSERT(id->_opFlags[0] != 0); ASMJIT_ASSERT(id->_opFlags[1] != 0); // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm if (!o0->isReg() || (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) || (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) || (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) || (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) || (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) || (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) || (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) || (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) || (o1->isMem() && (id->_opFlags[1] & kX86InstOpMem) == 0) || !o2->isImm()) { goto _IllegalInstruction; } uint32_t prefix = ((id->_opFlags[0] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o0->isRegType(kX86RegTypeXmm)) || ((id->_opFlags[1] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o1->isRegType(kX86RegTypeXmm)) ? 0x66000000 : 0x00000000; uint8_t rexw = ((id->_opFlags[0]|id->_opFlags[1]) & kX86InstOpNoRex) ? 0 : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq); // (X)MM <- (X)MM (opcode0) if (o1->isReg()) { if ((id->_opFlags[1] & (kX86InstOpMmXmm | kX86InstOpGqd)) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 1); _FINISHED_IMMEDIATE(o2, 1); } // (X)MM <- Mem (opcode0) if (o1->isMem()) { if ((id->_opFlags[1] & kX86InstOpMem) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 1); _FINISHED_IMMEDIATE(o2, 1); } break; } case kX86InstGroupMmuRm3dNow: { if (o0->isRegType(kX86RegTypeMm) && (o1->isRegType(kX86RegTypeMm) || o1->isMem())) { _emitMmu(id->_opCode[0], 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 1); _emitByte((uint8_t)id->_opCode[1]); _FINISHED(); } break; } } _IllegalInstruction: // Set an error. If we run in release mode assertion will be not used, so we // must inform about invalid state. setError(kErrorIllegalInstruction); #if defined(ASMJIT_DEBUG) assertIllegal = true; #endif // ASMJIT_DEBUG goto _End; _EmitImmediate: { sysint_t value = immOperand->getValue(); switch (immSize) { case 1: _emitByte ((uint8_t )(sysuint_t)value); break; case 2: _emitWord ((uint16_t)(sysuint_t)value); break; case 4: _emitDWord((uint32_t)(sysuint_t)value); break; #if defined(ASMJIT_X64) case 8: _emitQWord((uint64_t)(sysuint_t)value); break; #endif // ASMJIT_X64 default: ASMJIT_ASSERT(0); } } _End: if (_logger #if defined(ASMJIT_DEBUG) || assertIllegal #endif // ASMJIT_DEBUG ) { char bufStorage[512]; char* buf = bufStorage; // Detect truncated operand. Imm immTemporary(0); uint32_t loggerFlags = 0; // Use the original operands, because BYTE some of them were replaced. if (bLoHiUsed) { o0 = _loggerOperands[0]; o1 = _loggerOperands[1]; o2 = _loggerOperands[2]; } if (immOperand) { sysint_t value = immOperand->getValue(); bool isUnsigned = immOperand->isUnsigned(); switch (immSize) { case 1: if ( isUnsigned && !IntUtil::isUInt8 (value)) { immTemporary.setValue((uint8_t)(sysuint_t)value, true ); break; } if (!isUnsigned && !IntUtil::isInt8 (value)) { immTemporary.setValue((uint8_t)(sysuint_t)value, false); break; } break; case 2: if ( isUnsigned && !IntUtil::isUInt16(value)) { immTemporary.setValue((uint16_t)(sysuint_t)value, true ); break; } if (!isUnsigned && !IntUtil::isInt16 (value)) { immTemporary.setValue((uint16_t)(sysuint_t)value, false); break; } break; case 4: if ( isUnsigned && !IntUtil::isUInt32(value)) { immTemporary.setValue((uint32_t)(sysuint_t)value, true ); break; } if (!isUnsigned && !IntUtil::isInt32 (value)) { immTemporary.setValue((uint32_t)(sysuint_t)value, false); break; } break; } if (immTemporary.getValue() != 0) { if (o0 == immOperand) o0 = &immTemporary; if (o1 == immOperand) o1 = &immTemporary; if (o2 == immOperand) o2 = &immTemporary; } } if (_logger) { buf = StringUtil::copy(buf, _logger->getInstructionPrefix()); loggerFlags = _logger->getFlags(); } buf = X86Assembler_dumpInstruction(buf, code, _emitOptions, o0, o1, o2, memRegType, loggerFlags); if ((loggerFlags & kLoggerOutputBinary) != 0) buf = X86Assembler_dumpComment(buf, (size_t)(buf - bufStorage), getCode() + beginOffset, getOffset() - beginOffset, _inlineComment); else buf = X86Assembler_dumpComment(buf, (size_t)(buf - bufStorage), NULL, 0, _inlineComment); // We don't need to NULL terminate the resulting string. #if defined(ASMJIT_DEBUG) if (_logger) #endif // ASMJIT_DEBUG _logger->logString(bufStorage, (size_t)(buf - bufStorage)); #if defined(ASMJIT_DEBUG) if (assertIllegal) { // Here we need to NULL terminate. buf[0] = '\0'; // Raise an assertion failure, because this situation shouldn't happen. assertionFailure(__FILE__, __LINE__, bufStorage); } #endif // ASMJIT_DEBUG } _Cleanup: _inlineComment = NULL; _emitOptions = 0; } void X86Assembler::_emitJcc(uint32_t code, const Label* label, uint32_t hint) { if (hint == kCondHintNone) { _emitInstruction(code, label); } else { Imm imm(hint); _emitInstruction(code, label, &imm); } } // ============================================================================ // [AsmJit::Assembler - Relocation helpers] // ============================================================================ size_t X86Assembler::relocCode(void* _dst, sysuint_t addressBase) const { // Copy code to virtual memory (this is a given _dst pointer). uint8_t* dst = reinterpret_cast(_dst); size_t coff = _buffer.getOffset(); size_t csize = getCodeSize(); // We are copying the exact size of the generated code. Extra code for trampolines // is generated on-the-fly by relocator (this code doesn't exist at the moment). memcpy(dst, _buffer.getData(), coff); #if defined(ASMJIT_X64) // Trampoline pointer. uint8_t* tramp = dst + coff; #endif // ASMJIT_X64 // Relocate all recorded locations. size_t i; size_t len = _relocData.getLength(); for (i = 0; i < len; i++) { const RelocData& r = _relocData[i]; sysint_t val; #if defined(ASMJIT_X64) // Whether to use trampoline, can be only used if relocation type is // kRelocAbsToRel. bool useTrampoline = false; #endif // ASMJIT_X64 // Be sure that reloc data structure is correct. ASMJIT_ASSERT((size_t)(r.offset + r.size) <= csize); switch (r.type) { case kRelocAbsToAbs: val = (sysint_t)(r.address); break; case kRelocRelToAbs: val = (sysint_t)(addressBase + r.destination); break; case kRelocAbsToRel: case kRelocTrampoline: val = (sysint_t)( (sysuint_t)r.address - (addressBase + (sysuint_t)r.offset + 4) ); #if defined(ASMJIT_X64) if (r.type == kRelocTrampoline && !IntUtil::isInt32(val)) { val = (sysint_t)( (sysuint_t)tramp - ((sysuint_t)_dst + (sysuint_t)r.offset + 4) ); useTrampoline = true; } #endif // ASMJIT_X64 break; default: ASMJIT_ASSERT(0); } switch (r.size) { case 4: *reinterpret_cast(dst + r.offset) = static_cast(val); break; case 8: *reinterpret_cast(dst + r.offset) = static_cast(val); break; default: ASMJIT_ASSERT(0); } #if defined(ASMJIT_X64) if (useTrampoline) { if (getLogger()) { getLogger()->logFormat("; Trampoline from %p -> %p\n", (int8_t*)addressBase + r.offset, r.address); } X64TrampolineWriter::writeTrampoline(tramp, (uint64_t)r.address); tramp += X64TrampolineWriter::kSizeTotal; } #endif // ASMJIT_X64 } #if defined(ASMJIT_X64) return (size_t)(tramp - dst); #else return (size_t)(coff); #endif // ASMJIT_X64 } // ============================================================================ // [AsmJit::Assembler - EmbedLabel] // ============================================================================ void X86Assembler::embedLabel(const Label& label) { ASMJIT_ASSERT(label.getId() != kInvalidValue); if (!canEmit()) return; LabelData& l_data = _labels[label.getId() & kOperandIdValueMask]; RelocData r_data; if (_logger) { _logger->logFormat(sizeof(sysint_t) == 4 ? ".dd L.%u\n" : ".dq L.%u\n", (uint32_t)label.getId() & kOperandIdValueMask); } r_data.type = kRelocRelToAbs; r_data.size = sizeof(sysint_t); r_data.offset = getOffset(); r_data.destination = 0; if (l_data.offset != -1) { // Bound label. r_data.destination = l_data.offset; } else { // Non-bound label. Need to chain. LabelLink* link = _newLabelLink(); link->prev = (LabelLink*)l_data.links; link->offset = getOffset(); link->displacement = 0; link->relocId = _relocData.getLength(); l_data.links = link; } _relocData.append(r_data); // Emit dummy intptr_t (4 or 8 bytes that depends on address size). _emitIntPtrT(0); } // ============================================================================ // [AsmJit::Assembler - Align] // ============================================================================ void X86Assembler::align(uint32_t m) { if (!canEmit()) return; if (_logger) _logger->logFormat("%s.align %u\n", _logger->getInstructionPrefix(), (uint)m); if (!m) return; if (m > 64) { ASMJIT_ASSERT(0); return; } sysint_t i = m - (getOffset() % m); if (i == m) return; if (_properties & (1 << kX86PropertyOptimizedAlign)) { const X86CpuInfo* ci = X86CpuInfo::getGlobal(); // NOPs optimized for Intel: // Intel 64 and IA-32 Architectures Software Developer's Manual // - Volume 2B // - Instruction Set Reference N-Z // - NOP // NOPs optimized for AMD: // Software Optimization Guide for AMD Family 10h Processors (Quad-Core) // - 4.13 - Code Padding with Operand-Size Override and Multibyte NOP // Intel and AMD. static const uint8_t nop1[] = { 0x90 }; static const uint8_t nop2[] = { 0x66, 0x90 }; static const uint8_t nop3[] = { 0x0F, 0x1F, 0x00 }; static const uint8_t nop4[] = { 0x0F, 0x1F, 0x40, 0x00 }; static const uint8_t nop5[] = { 0x0F, 0x1F, 0x44, 0x00, 0x00 }; static const uint8_t nop6[] = { 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00 }; static const uint8_t nop7[] = { 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t nop8[] = { 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t nop9[] = { 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; // AMD. static const uint8_t nop10[] = { 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t nop11[] = { 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t* p; sysint_t n; if (ci->getVendorId() == kCpuIntel && ((ci->getFamily() & 0x0F) == 6 || (ci->getFamily() & 0x0F) == 15)) { do { switch (i) { case 1: p = nop1; n = 1; break; case 2: p = nop2; n = 2; break; case 3: p = nop3; n = 3; break; case 4: p = nop4; n = 4; break; case 5: p = nop5; n = 5; break; case 6: p = nop6; n = 6; break; case 7: p = nop7; n = 7; break; case 8: p = nop8; n = 8; break; default: p = nop9; n = 9; break; } i -= n; do { _emitByte(*p++); } while(--n); } while (i); return; } if (ci->getVendorId() == kCpuAmd && ci->getFamily() >= 0x0F) { do { switch (i) { case 1: p = nop1 ; n = 1; break; case 2: p = nop2 ; n = 2; break; case 3: p = nop3 ; n = 3; break; case 4: p = nop4 ; n = 4; break; case 5: p = nop5 ; n = 5; break; case 6: p = nop6 ; n = 6; break; case 7: p = nop7 ; n = 7; break; case 8: p = nop8 ; n = 8; break; case 9: p = nop9 ; n = 9; break; case 10: p = nop10; n = 10; break; default: p = nop11; n = 11; break; } i -= n; do { _emitByte(*p++); } while(--n); } while (i); return; } #if defined(ASMJIT_X86) // Legacy NOPs, 0x90 with 0x66 prefix. do { switch (i) { default: _emitByte(0x66); i--; case 3: _emitByte(0x66); i--; case 2: _emitByte(0x66); i--; case 1: _emitByte(0x90); i--; } } while(i); #endif } // Legacy NOPs, only 0x90. In 64-bit mode, we can't use 0x66 prefix. do { _emitByte(0x90); } while(--i); } // ============================================================================ // [AsmJit::Assembler - Label] // ============================================================================ Label X86Assembler::newLabel() { Label label; label._base.id = (uint32_t)_labels.getLength() | kOperandIdTypeLabel; LabelData l_data; l_data.offset = -1; l_data.links = NULL; _labels.append(l_data); return label; } void X86Assembler::registerLabels(size_t count) { // Duplicated newLabel() code, but we are not creating Label instances. LabelData l_data; l_data.offset = -1; l_data.links = NULL; for (size_t i = 0; i < count; i++) _labels.append(l_data); } void X86Assembler::bind(const Label& label) { // Only labels created by newLabel() can be used by Assembler. ASMJIT_ASSERT(label.getId() != kInvalidValue); // Never go out of bounds. ASMJIT_ASSERT((label.getId() & kOperandIdValueMask) < _labels.getLength()); // Get label data based on label id. LabelData& l_data = _labels[label.getId() & kOperandIdValueMask]; // Label can be bound only once. ASMJIT_ASSERT(l_data.offset == -1); // Log. if (_logger) _logger->logFormat("L.%u:\n", (uint32_t)label.getId() & kOperandIdValueMask); sysint_t pos = getOffset(); LabelLink* link = l_data.links; LabelLink* prev = NULL; while (link) { sysint_t offset = link->offset; if (link->relocId != -1) { // If linked label points to RelocData then instead of writing relative // displacement to assembler stream, we will write it to RelocData. _relocData[link->relocId].destination += pos; } else { // Not using relocId, this means that we overwriting real displacement // in assembler stream. int32_t patchedValue = (int32_t)(pos - offset + link->displacement); uint32_t size = getByteAt(offset); // Only these size specifiers are allowed. ASMJIT_ASSERT(size == 1 || size == 4); if (size == 4) { setInt32At(offset, patchedValue); } else // if (size == 1) { if (IntUtil::isInt8(patchedValue)) { setByteAt(offset, (uint8_t)(int8_t)patchedValue); } else { // Fatal error. setError(kErrorIllegalShortJump); } } } prev = link->prev; link = prev; } // Chain unused links. link = l_data.links; if (link) { if (prev == NULL) prev = link; prev->prev = _unusedLinks; _unusedLinks = link; } // Unlink label if it was linked. l_data.offset = pos; l_data.links = NULL; } // ============================================================================ // [AsmJit::Assembler - Make] // ============================================================================ void* X86Assembler::make() { // Do nothing on error state or when no instruction was emitted. if (_error || getCodeSize() == 0) return NULL; void* p; _error = _context->generate(&p, this); return p; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86operand.cpp0000755000000000000000000002675312467662066020243 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86defs.h" #include "../x86/x86operand.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Registers - no_reg] // ============================================================================ const GpReg no_reg(_Initialize(), kInvalidValue); // ============================================================================ // [AsmJit::Registers - 8-bit] // ============================================================================ const GpReg al(_Initialize(), kX86RegAl); const GpReg cl(_Initialize(), kX86RegCl); const GpReg dl(_Initialize(), kX86RegDl); const GpReg bl(_Initialize(), kX86RegBl); #if defined(ASMJIT_X64) const GpReg spl(_Initialize(), kX86RegSpl); const GpReg bpl(_Initialize(), kX86RegBpl); const GpReg sil(_Initialize(), kX86RegSil); const GpReg dil(_Initialize(), kX86RegDil); const GpReg r8b(_Initialize(), kX86RegR8b); const GpReg r9b(_Initialize(), kX86RegR9b); const GpReg r10b(_Initialize(), kX86RegR10b); const GpReg r11b(_Initialize(), kX86RegR11b); const GpReg r12b(_Initialize(), kX86RegR12b); const GpReg r13b(_Initialize(), kX86RegR13b); const GpReg r14b(_Initialize(), kX86RegR14b); const GpReg r15b(_Initialize(), kX86RegR15b); #endif // ASMJIT_X64 const GpReg ah(_Initialize(), kX86RegAh); const GpReg ch(_Initialize(), kX86RegCh); const GpReg dh(_Initialize(), kX86RegDh); const GpReg bh(_Initialize(), kX86RegBh); // ============================================================================ // [AsmJit::Registers - 16-bit] // ============================================================================ const GpReg ax(_Initialize(), kX86RegAx); const GpReg cx(_Initialize(), kX86RegCx); const GpReg dx(_Initialize(), kX86RegDx); const GpReg bx(_Initialize(), kX86RegBx); const GpReg sp(_Initialize(), kX86RegSp); const GpReg bp(_Initialize(), kX86RegBp); const GpReg si(_Initialize(), kX86RegSi); const GpReg di(_Initialize(), kX86RegDi); #if defined(ASMJIT_X64) const GpReg r8w(_Initialize(), kX86RegR8w); const GpReg r9w(_Initialize(), kX86RegR9w); const GpReg r10w(_Initialize(), kX86RegR10w); const GpReg r11w(_Initialize(), kX86RegR11w); const GpReg r12w(_Initialize(), kX86RegR12w); const GpReg r13w(_Initialize(), kX86RegR13w); const GpReg r14w(_Initialize(), kX86RegR14w); const GpReg r15w(_Initialize(), kX86RegR15w); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 32-bit] // ============================================================================ const GpReg eax(_Initialize(), kX86RegEax); const GpReg ecx(_Initialize(), kX86RegEcx); const GpReg edx(_Initialize(), kX86RegEdx); const GpReg ebx(_Initialize(), kX86RegEbx); const GpReg esp(_Initialize(), kX86RegEsp); const GpReg ebp(_Initialize(), kX86RegEbp); const GpReg esi(_Initialize(), kX86RegEsi); const GpReg edi(_Initialize(), kX86RegEdi); #if defined(ASMJIT_X64) const GpReg r8d(_Initialize(), kX86RegR8d); const GpReg r9d(_Initialize(), kX86RegR9d); const GpReg r10d(_Initialize(), kX86RegR10d); const GpReg r11d(_Initialize(), kX86RegR11d); const GpReg r12d(_Initialize(), kX86RegR12d); const GpReg r13d(_Initialize(), kX86RegR13d); const GpReg r14d(_Initialize(), kX86RegR14d); const GpReg r15d(_Initialize(), kX86RegR15d); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 64-bit] // ============================================================================ #if defined(ASMJIT_X64) const GpReg rax(_Initialize(), kX86RegRax); const GpReg rcx(_Initialize(), kX86RegRcx); const GpReg rdx(_Initialize(), kX86RegRdx); const GpReg rbx(_Initialize(), kX86RegRbx); const GpReg rsp(_Initialize(), kX86RegRsp); const GpReg rbp(_Initialize(), kX86RegRbp); const GpReg rsi(_Initialize(), kX86RegRsi); const GpReg rdi(_Initialize(), kX86RegRdi); const GpReg r8(_Initialize(), kX86RegR8); const GpReg r9(_Initialize(), kX86RegR9); const GpReg r10(_Initialize(), kX86RegR10); const GpReg r11(_Initialize(), kX86RegR11); const GpReg r12(_Initialize(), kX86RegR12); const GpReg r13(_Initialize(), kX86RegR13); const GpReg r14(_Initialize(), kX86RegR14); const GpReg r15(_Initialize(), kX86RegR15); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Native (AsmJit extension)] // ============================================================================ const GpReg zax(_Initialize(), kX86RegZax); const GpReg zcx(_Initialize(), kX86RegZcx); const GpReg zdx(_Initialize(), kX86RegZdx); const GpReg zbx(_Initialize(), kX86RegZbx); const GpReg zsp(_Initialize(), kX86RegZsp); const GpReg zbp(_Initialize(), kX86RegZbp); const GpReg zsi(_Initialize(), kX86RegZsi); const GpReg zdi(_Initialize(), kX86RegZdi); // ============================================================================ // [AsmJit::Registers - MM] // ============================================================================ const MmReg mm0(_Initialize(), kX86RegMm0); const MmReg mm1(_Initialize(), kX86RegMm1); const MmReg mm2(_Initialize(), kX86RegMm2); const MmReg mm3(_Initialize(), kX86RegMm3); const MmReg mm4(_Initialize(), kX86RegMm4); const MmReg mm5(_Initialize(), kX86RegMm5); const MmReg mm6(_Initialize(), kX86RegMm6); const MmReg mm7(_Initialize(), kX86RegMm7); // ============================================================================ // [AsmJit::Registers - XMM] // ============================================================================ const XmmReg xmm0(_Initialize(), kX86RegXmm0); const XmmReg xmm1(_Initialize(), kX86RegXmm1); const XmmReg xmm2(_Initialize(), kX86RegXmm2); const XmmReg xmm3(_Initialize(), kX86RegXmm3); const XmmReg xmm4(_Initialize(), kX86RegXmm4); const XmmReg xmm5(_Initialize(), kX86RegXmm5); const XmmReg xmm6(_Initialize(), kX86RegXmm6); const XmmReg xmm7(_Initialize(), kX86RegXmm7); #if defined(ASMJIT_X64) const XmmReg xmm8(_Initialize(), kX86RegXmm8); const XmmReg xmm9(_Initialize(), kX86RegXmm9); const XmmReg xmm10(_Initialize(), kX86RegXmm10); const XmmReg xmm11(_Initialize(), kX86RegXmm11); const XmmReg xmm12(_Initialize(), kX86RegXmm12); const XmmReg xmm13(_Initialize(), kX86RegXmm13); const XmmReg xmm14(_Initialize(), kX86RegXmm14); const XmmReg xmm15(_Initialize(), kX86RegXmm15); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Segment] // ============================================================================ const SegmentReg cs(_Initialize(), kX86RegCs); const SegmentReg ss(_Initialize(), kX86RegSs); const SegmentReg ds(_Initialize(), kX86RegDs); const SegmentReg es(_Initialize(), kX86RegEs); const SegmentReg fs(_Initialize(), kX86RegFs); const SegmentReg gs(_Initialize(), kX86RegGs); // ============================================================================ // [AsmJit::Var] // ============================================================================ Mem _BaseVarMem(const Var& var, uint32_t size) { Mem m; //(_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = static_cast(size == kInvalidValue ? var.getSize() : size); m._mem.type = kOperandMemNative; m._mem.segment = kX86SegNone; m._mem.sizePrefix = 0; m._mem.shift = 0; m._mem.id = var.getId(); m._mem.base = kInvalidValue; m._mem.index = kInvalidValue; m._mem.target = NULL; m._mem.displacement = 0; return m; } Mem _BaseVarMem(const Var& var, uint32_t size, sysint_t disp) { Mem m; //(_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = static_cast(size == kInvalidValue ? var.getSize() : size); m._mem.type = kOperandMemNative; m._mem.segment = kX86SegNone; m._mem.sizePrefix = 0; m._mem.shift = 0; m._mem.id = var.getId(); m._mem.base = kInvalidValue; m._mem.index = kInvalidValue; m._mem.target = NULL; m._mem.displacement = disp; return m; } Mem _BaseVarMem(const Var& var, uint32_t size, const GpVar& index, uint32_t shift, sysint_t disp) { Mem m; //(_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = static_cast(size == kInvalidValue ? var.getSize() : size); m._mem.type = kOperandMemNative; m._mem.segment = kX86SegNone; m._mem.sizePrefix = 0; m._mem.shift = shift; m._mem.id = var.getId(); m._mem.base = kInvalidValue; m._mem.index = index.getId(); m._mem.target = NULL; m._mem.displacement = disp; return m; } // ============================================================================ // [AsmJit::Mem - ptr[]] // ============================================================================ Mem ptr(const Label& label, sysint_t disp, uint32_t size) { return Mem(label, disp, size); } Mem ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m(label, disp, size); m._mem.index = index.getRegIndex(); m._mem.shift = shift; return m; } Mem ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m(label, disp, size); m._mem.index = index.getId(); m._mem.shift = shift; return m; } // ============================================================================ // [AsmJit::Mem - ptr[] - Absolute Addressing] // ============================================================================ ASMJIT_API Mem ptr_abs(void* target, sysint_t disp, uint32_t size) { Mem m; m._mem.size = size; m._mem.type = kOperandMemAbsolute; m._mem.segment = kX86SegNone; m._mem.target = target; m._mem.displacement = disp; return m; } ASMJIT_API Mem ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m;// (_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = size; m._mem.type = kOperandMemAbsolute; m._mem.segment = kX86SegNone; #if defined(ASMJIT_X86) m._mem.sizePrefix = index.getSize() != 4; #else m._mem.sizePrefix = index.getSize() != 8; #endif m._mem.shift = shift; m._mem.id = kInvalidValue; m._mem.base = kInvalidValue; m._mem.index = index.getRegIndex(); m._mem.target = target; m._mem.displacement = disp; return m; } ASMJIT_API Mem ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m;// (_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = size; m._mem.type = kOperandMemAbsolute; m._mem.segment = kX86SegNone; #if defined(ASMJIT_X86) m._mem.sizePrefix = index.getSize() != 4; #else m._mem.sizePrefix = index.getSize() != 8; #endif m._mem.shift = shift; m._mem.id = kInvalidValue; m._mem.base = kInvalidValue; m._mem.index = index.getId(); m._mem.target = target; m._mem.displacement = disp; return m; } // ============================================================================ // [AsmJit::Mem - ptr[base + displacement]] // ============================================================================ Mem ptr(const GpReg& base, sysint_t disp, uint32_t size) { return Mem(base, disp, size); } Mem ptr(const GpReg& base, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) { return Mem(base, index, shift, disp, size); } Mem ptr(const GpVar& base, sysint_t disp, uint32_t size) { return Mem(base, disp, size); } Mem ptr(const GpVar& base, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) { return Mem(base, index, shift, disp, size); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86func.cpp0000755000000000000000000004744612467662066017550 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86defs.h" #include "../x86/x86func.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86FuncDecl - Accessors] // ============================================================================ uint32_t X86FuncDecl::findArgumentByRegCode(uint32_t regCode) const { uint32_t type = regCode & kRegTypeMask; uint32_t idx = regCode & kRegIndexMask; uint32_t clazz; switch (type) { case kX86RegTypeGpd: case kX86RegTypeGpq: clazz = kX86VarClassGp; break; case kX86RegTypeX87: clazz = kX86VarClassX87; break; case kX86RegTypeMm: clazz = kX86VarClassMm; break; case kX86RegTypeXmm: clazz = kX86VarClassXmm; break; default: return kInvalidValue; } for (uint32_t i = 0; i < _argumentsCount; i++) { const FuncArg& arg = _arguments[i]; if (arg.getRegIndex() == idx && (X86Util::getVarClassFromVarType(arg.getVarType()) & clazz) != 0) return i; } return kInvalidValue; } // ============================================================================ // [AsmJit::X86FuncDecl - SetPrototype - InitCallingConvention] // ============================================================================ static void X86FuncDecl_initCallingConvention(X86FuncDecl* self, uint32_t convention) { uint32_t i; // -------------------------------------------------------------------------- // [Inir] // -------------------------------------------------------------------------- self->_convention = convention; self->_calleePopsStack = false; self->_argumentsDirection = kFuncArgsRTL; for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_gpList); i++) self->_gpList[i] = kRegIndexInvalid; for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_xmmList); i++) self->_xmmList[i] = kRegIndexInvalid; self->_gpListMask = 0x0; self->_mmListMask = 0x0; self->_xmmListMask = 0x0; self->_gpPreservedMask = 0x0; self->_mmPreservedMask = 0x0; self->_xmmPreservedMask = 0x0; // -------------------------------------------------------------------------- // [X86 Calling Conventions] // -------------------------------------------------------------------------- #if defined(ASMJIT_X86) self->_gpPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEsp) | IntUtil::maskFromIndex(kX86RegIndexEbp) | IntUtil::maskFromIndex(kX86RegIndexEsi) | IntUtil::maskFromIndex(kX86RegIndexEdi)); self->_xmmPreservedMask = 0; switch (convention) { // ------------------------------------------------------------------------ // [CDecl] // ------------------------------------------------------------------------ case kX86FuncConvCDecl: break; // ------------------------------------------------------------------------ // [StdCall] // ------------------------------------------------------------------------ case kX86FuncConvStdCall: self->_calleePopsStack = true; break; // ------------------------------------------------------------------------ // [MS-ThisCall] // ------------------------------------------------------------------------ case kX86FuncConvMsThisCall: self->_calleePopsStack = true; self->_gpList[0] = kX86RegIndexEcx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEcx)); break; // ------------------------------------------------------------------------ // [MS-FastCall] // ------------------------------------------------------------------------ case kX86FuncConvMsFastCall: self->_calleePopsStack = true; self->_gpList[0] = kX86RegIndexEcx; self->_gpList[1] = kX86RegIndexEdx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx)); break; // ------------------------------------------------------------------------ // [Borland-FastCall] // ------------------------------------------------------------------------ case kX86FuncConvBorlandFastCall: self->_calleePopsStack = true; self->_argumentsDirection = kFuncArgsLTR; self->_gpList[0] = kX86RegIndexEax; self->_gpList[1] = kX86RegIndexEdx; self->_gpList[2] = kX86RegIndexEcx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEcx)); break; // ------------------------------------------------------------------------ // [Gcc-FastCall] // ------------------------------------------------------------------------ case kX86FuncConvGccFastCall: self->_calleePopsStack = true; self->_gpList[0] = kX86RegIndexEcx; self->_gpList[1] = kX86RegIndexEdx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx)); break; // ------------------------------------------------------------------------ // [Gcc-Regparm(1)] // ------------------------------------------------------------------------ case kX86FuncConvGccRegParm1: self->_calleePopsStack = false; self->_gpList[0] = kX86RegIndexEax; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax)); break; // ------------------------------------------------------------------------ // [Gcc-Regparm(2)] // ------------------------------------------------------------------------ case kX86FuncConvGccRegParm2: self->_calleePopsStack = false; self->_gpList[0] = kX86RegIndexEax; self->_gpList[1] = kX86RegIndexEdx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx)); break; // ------------------------------------------------------------------------ // [Gcc-Regparm(3)] // ------------------------------------------------------------------------ case kX86FuncConvGccRegParm3: self->_calleePopsStack = false; self->_gpList[0] = kX86RegIndexEax; self->_gpList[1] = kX86RegIndexEdx; self->_gpList[2] = kX86RegIndexEcx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEcx)); break; // ------------------------------------------------------------------------ // [Illegal] // ------------------------------------------------------------------------ default: // Illegal calling convention. ASMJIT_ASSERT(0); } #endif // ASMJIT_X86 // -------------------------------------------------------------------------- // [X64 Calling Conventions] // -------------------------------------------------------------------------- #if defined(ASMJIT_X64) switch (convention) { // ------------------------------------------------------------------------ // [X64-Windows] // ------------------------------------------------------------------------ case kX86FuncConvX64W: self->_gpList[0] = kX86RegIndexRcx; self->_gpList[1] = kX86RegIndexRdx; self->_gpList[2] = kX86RegIndexR8; self->_gpList[3] = kX86RegIndexR9; self->_xmmList[0] = kX86RegIndexXmm0; self->_xmmList[1] = kX86RegIndexXmm1; self->_xmmList[2] = kX86RegIndexXmm2; self->_xmmList[3] = kX86RegIndexXmm3; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRcx ) | IntUtil::maskFromIndex(kX86RegIndexRdx ) | IntUtil::maskFromIndex(kX86RegIndexR8 ) | IntUtil::maskFromIndex(kX86RegIndexR9 )); self->_xmmListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexXmm0 ) | IntUtil::maskFromIndex(kX86RegIndexXmm1 ) | IntUtil::maskFromIndex(kX86RegIndexXmm2 ) | IntUtil::maskFromIndex(kX86RegIndexXmm3 )); self->_gpPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRbx ) | IntUtil::maskFromIndex(kX86RegIndexRsp ) | IntUtil::maskFromIndex(kX86RegIndexRbp ) | IntUtil::maskFromIndex(kX86RegIndexRsi ) | IntUtil::maskFromIndex(kX86RegIndexRdi ) | IntUtil::maskFromIndex(kX86RegIndexR12 ) | IntUtil::maskFromIndex(kX86RegIndexR13 ) | IntUtil::maskFromIndex(kX86RegIndexR14 ) | IntUtil::maskFromIndex(kX86RegIndexR15 )); self->_xmmPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexXmm6 ) | IntUtil::maskFromIndex(kX86RegIndexXmm7 ) | IntUtil::maskFromIndex(kX86RegIndexXmm8 ) | IntUtil::maskFromIndex(kX86RegIndexXmm9 ) | IntUtil::maskFromIndex(kX86RegIndexXmm10) | IntUtil::maskFromIndex(kX86RegIndexXmm11) | IntUtil::maskFromIndex(kX86RegIndexXmm12) | IntUtil::maskFromIndex(kX86RegIndexXmm13) | IntUtil::maskFromIndex(kX86RegIndexXmm14) | IntUtil::maskFromIndex(kX86RegIndexXmm15)); break; // ------------------------------------------------------------------------ // [X64-Unix] // ------------------------------------------------------------------------ case kX86FuncConvX64U: self->_gpList[0] = kX86RegIndexRdi; self->_gpList[1] = kX86RegIndexRsi; self->_gpList[2] = kX86RegIndexRdx; self->_gpList[3] = kX86RegIndexRcx; self->_gpList[4] = kX86RegIndexR8; self->_gpList[5] = kX86RegIndexR9; self->_xmmList[0] = kX86RegIndexXmm0; self->_xmmList[1] = kX86RegIndexXmm1; self->_xmmList[2] = kX86RegIndexXmm2; self->_xmmList[3] = kX86RegIndexXmm3; self->_xmmList[4] = kX86RegIndexXmm4; self->_xmmList[5] = kX86RegIndexXmm5; self->_xmmList[6] = kX86RegIndexXmm6; self->_xmmList[7] = kX86RegIndexXmm7; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRdi ) | IntUtil::maskFromIndex(kX86RegIndexRsi ) | IntUtil::maskFromIndex(kX86RegIndexRdx ) | IntUtil::maskFromIndex(kX86RegIndexRcx ) | IntUtil::maskFromIndex(kX86RegIndexR8 ) | IntUtil::maskFromIndex(kX86RegIndexR9 )); self->_xmmListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexXmm0 ) | IntUtil::maskFromIndex(kX86RegIndexXmm1 ) | IntUtil::maskFromIndex(kX86RegIndexXmm2 ) | IntUtil::maskFromIndex(kX86RegIndexXmm3 ) | IntUtil::maskFromIndex(kX86RegIndexXmm4 ) | IntUtil::maskFromIndex(kX86RegIndexXmm5 ) | IntUtil::maskFromIndex(kX86RegIndexXmm6 ) | IntUtil::maskFromIndex(kX86RegIndexXmm7 )); self->_gpPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRbx ) | IntUtil::maskFromIndex(kX86RegIndexRsp ) | IntUtil::maskFromIndex(kX86RegIndexRbp ) | IntUtil::maskFromIndex(kX86RegIndexR12 ) | IntUtil::maskFromIndex(kX86RegIndexR13 ) | IntUtil::maskFromIndex(kX86RegIndexR14 ) | IntUtil::maskFromIndex(kX86RegIndexR15 )); break; // ------------------------------------------------------------------------ // [Illegal] // ------------------------------------------------------------------------ default: // Illegal calling convention. ASMJIT_ASSERT(0); } #endif // ASMJIT_X64 } // ============================================================================ // [AsmJit::X86FuncDecl - SetPrototype - InitDefinition] // ============================================================================ static void X86FuncDecl_initDefinition(X86FuncDecl* self, uint32_t returnType, const uint32_t* argumentsData, uint32_t argumentsCount) { ASMJIT_ASSERT(argumentsCount <= kFuncArgsMax); // -------------------------------------------------------------------------- // [Init] // -------------------------------------------------------------------------- int32_t i = 0; int32_t gpPos = 0; int32_t xmmPos = 0; int32_t stackOffset = 0; self->_returnType = returnType; self->_argumentsCount = static_cast(argumentsCount); while (i < static_cast(argumentsCount)) { FuncArg& arg = self->_arguments[i]; arg._varType = static_cast(argumentsData[i]); arg._regIndex = kRegIndexInvalid; arg._stackOffset = kFuncStackInvalid; i++; } while (i < kFuncArgsMax) { FuncArg& arg = self->_arguments[i]; arg.reset(); i++; } self->_argumentsStackSize = 0; self->_gpArgumentsMask = 0x0; self->_mmArgumentsMask = 0x0; self->_xmmArgumentsMask = 0x0; if (self->_argumentsCount == 0) return; // -------------------------------------------------------------------------- // [X86 Calling Conventions (32-bit)] // -------------------------------------------------------------------------- #if defined(ASMJIT_X86) // Register arguments (Integer), always left-to-right. for (i = 0; i != argumentsCount; i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeInt(varType) && gpPos < 16 && self->_gpList[gpPos] != kRegIndexInvalid) { arg._regIndex = self->_gpList[gpPos++]; self->_gpArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Stack arguments. int32_t iStart = static_cast(argumentsCount - 1); int32_t iEnd = -1; int32_t iStep = -1; if (self->_argumentsDirection == kFuncArgsLTR) { iStart = 0; iEnd = static_cast(argumentsCount); iStep = 1; } for (i = iStart; i != iEnd; i += iStep) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (arg.hasRegIndex()) continue; if (X86Util::isVarTypeInt(varType)) { stackOffset -= 4; arg._stackOffset = static_cast(stackOffset); } else if (X86Util::isVarTypeFloat(varType)) { int32_t size = static_cast(x86VarInfo[varType].getSize()); stackOffset -= size; arg._stackOffset = static_cast(stackOffset); } } #endif // ASMJIT_X86 // -------------------------------------------------------------------------- // [X64 Calling Conventions (64-bit)] // -------------------------------------------------------------------------- #if defined(ASMJIT_X64) // Windows 64-bit specific. if (self->_convention == kX86FuncConvX64W) { int32_t max = argumentsCount < 4 ? argumentsCount : 4; // Register arguments (Integer / FP), always left-to-right. for (i = 0; i != max; i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeInt(varType)) { arg._regIndex = self->_gpList[i]; self->_gpArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } else if (X86Util::isVarTypeFloat(varType)) { arg._regIndex = self->_xmmList[i]; self->_xmmArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Stack arguments (always right-to-left). for (i = argumentsCount - 1; i != -1; i--) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (arg.isAssigned()) continue; if (X86Util::isVarTypeInt(varType)) { stackOffset -= 8; // Always 8 bytes. arg._stackOffset = stackOffset; } else if (X86Util::isVarTypeFloat(varType)) { int32_t size = static_cast(x86VarInfo[varType].getSize()); stackOffset -= size; arg._stackOffset = stackOffset; } } // 32 bytes shadow space (X64W calling convention specific). stackOffset -= 4 * 8; } // Linux/Unix 64-bit (AMD64 calling convention). else { // Register arguments (Integer), always left-to-right. for (i = 0; i != static_cast(argumentsCount); i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeInt(varType) && gpPos < 32 && self->_gpList[gpPos] != kRegIndexInvalid) { arg._regIndex = self->_gpList[gpPos++]; self->_gpArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Register arguments (FP), always left-to-right. for (i = 0; i != static_cast(argumentsCount); i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeFloat(varType)) { arg._regIndex = self->_xmmList[xmmPos++]; self->_xmmArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Stack arguments. for (i = argumentsCount - 1; i != -1; i--) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (arg.isAssigned()) continue; if (X86Util::isVarTypeInt(varType)) { stackOffset -= 8; arg._stackOffset = static_cast(stackOffset); } else if (X86Util::isVarTypeFloat(varType)) { int32_t size = (int32_t)x86VarInfo[varType].getSize(); stackOffset -= size; arg._stackOffset = static_cast(stackOffset); } } } #endif // ASMJIT_X64 // Modify stack offset (all function parameters will be in positive stack // offset that is never zero). for (i = 0; i < (int32_t)argumentsCount; i++) { FuncArg& arg = self->_arguments[i]; if (!arg.hasRegIndex()) { arg._stackOffset += static_cast(static_cast(sizeof(uintptr_t)) - stackOffset); } } self->_argumentsStackSize = (uint32_t)(-stackOffset); } void X86FuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { // Limit maximum function arguments to kFuncArgsMax. if (argumentsCount > kFuncArgsMax) argumentsCount = kFuncArgsMax; X86FuncDecl_initCallingConvention(this, convention); X86FuncDecl_initDefinition(this, returnType, arguments, argumentsCount); } // ============================================================================ // [AsmJit::X86FuncDecl - Reset] // ============================================================================ void X86FuncDecl::reset() { uint32_t i; // -------------------------------------------------------------------------- // [Core] // -------------------------------------------------------------------------- _returnType = kVarTypeInvalid; _argumentsCount = 0; _reserved0[0] = 0; _reserved0[1] = 0; for (i = 0; i < ASMJIT_ARRAY_SIZE(_arguments); i++) _arguments[i].reset(); _argumentsStackSize = 0; _gpArgumentsMask = 0x0; _mmArgumentsMask = 0x0; _xmmArgumentsMask = 0x0; // -------------------------------------------------------------------------- // [Convention] // -------------------------------------------------------------------------- _convention = kFuncConvNone; _calleePopsStack = false; _argumentsDirection = kFuncArgsRTL; _reserved1 = 0; for (i = 0; i < ASMJIT_ARRAY_SIZE(_gpList); i++) _gpList[i] = kRegIndexInvalid; for (i = 0; i < ASMJIT_ARRAY_SIZE(_xmmList); i++) _xmmList[i] = kRegIndexInvalid; _gpListMask = 0x0; _mmListMask = 0x0; _xmmListMask = 0x0; _gpPreservedMask = 0x0; _mmPreservedMask = 0x0; _xmmPreservedMask = 0x0; } } // AsmJit namespace // [Api-Begin] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86assembler.h0000755000000000000000000073646212467662066020242 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86ASSEMBLER_H #define _ASMJIT_X86_X86ASSEMBLER_H // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../x86/x86defs.h" #include "../x86/x86operand.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86Assembler] // ============================================================================ //! @brief X86Assembler - low level x86/x64 code generation. //! //! @ref X86Assembler is the main class in AsmJit for generating low level //! x86/x64 binary stream. It creates internal buffer where opcodes are stored //! and contains methods that mimics x86/x64 assembler instructions. Code //! generation should be safe, because basic type-checks are done by the C++ //! compiler. It's nearly impossible to create invalid instruction (for example //! mov [eax], [eax] that will not be detected at compile time by //! C++ compiler. //! //! Each call to assembler intrinsics directly emits instruction to internal //! binary stream. Instruction emitting also contains runtime checks so it //! should be impossible to create an instruction that is not valid (except //! there is bug in AsmJit). //! //! @ref X86Assembler contains internal buffer where all emitted instructions //! are stored. Look at @ref Buffer for an implementation. To generate and //! allocate memory for function use @ref X86Assembler::make() method that will //! allocate memory using the provided memory manager (see @ref MemoryManager) //! and relocates the output code to the provided address. If you want to create //! your function manually, you should look at @ref VirtualMemory interface and //! use @ref X86Assembler::relocCode() method to relocate emitted code into //! provided memory location. You can also take the emitted buffer by @ref //! X86Assembler::take() to do something else with it. If you take buffer, you //! must free it manually by using @ref ASMJIT_FREE() macro. //! //! @section AsmJit_Assembler_CodeGeneration Code Generation //! //! To generate code is only needed to create instance of @c AsmJit::Assembler //! and to use intrinsics. See example how to do that: //! //! @code //! // Use AsmJit namespace. //! using namespace AsmJit; //! //! // Create Assembler instance. //! Assembler a; //! //! // Prolog. //! a.push(ebp); //! a.mov(ebp, esp); //! //! // Mov 1024 to EAX, EAX is also return value. //! a.mov(eax, imm(1024)); //! //! // Epilog. //! a.mov(esp, ebp); //! a.pop(ebp); //! //! // Return. //! a.ret(); //! @endcode //! //! You can see that syntax is very close to Intel one. Only difference is that //! you are calling functions that emits the binary code for you. All registers //! are in @c AsmJit namespace, so it's very comfortable to use it (look at //! first line). There is also used method @c AsmJit::imm() to create an //! immediate value. Use @c AsmJit::uimm() to create unsigned immediate value. //! //! There is also possibility to use memory addresses and immediates. To build //! memory address use @c ptr(), @c byte_ptr(), @c word_ptr(), @c dword_ptr() //! or other friend methods. In most cases you needs only @c ptr() method, but //! there are instructions where you must specify address size, //! //! for example (a is @c AsmJit::Assembler instance): //! //! @code //! a.mov(ptr(eax), imm(0)); // mov ptr [eax], 0 //! a.mov(ptr(eax), edx); // mov ptr [eax], edx //! @endcode //! //! But it's also possible to create complex addresses: //! //! @code //! // eax + ecx*x addresses //! a.mov(ptr(eax, ecx, kScaleNone), imm(0)); // mov ptr [eax + ecx], 0 //! a.mov(ptr(eax, ecx, kScale2Times), imm(0)); // mov ptr [eax + ecx * 2], 0 //! a.mov(ptr(eax, ecx, kScale4Times), imm(0)); // mov ptr [eax + ecx * 4], 0 //! a.mov(ptr(eax, ecx, kScale8Times), imm(0)); // mov ptr [eax + ecx * 8], 0 //! // eax + ecx*x + disp addresses //! a.mov(ptr(eax, ecx, kScaleNone, 4), imm(0)); // mov ptr [eax + ecx + 4], 0 //! a.mov(ptr(eax, ecx, kScale2Times, 8), imm(0)); // mov ptr [eax + ecx * 2 + 8], 0 //! a.mov(ptr(eax, ecx, kScale4Times, 12), imm(0)); // mov ptr [eax + ecx * 4 + 12], 0 //! a.mov(ptr(eax, ecx, kScale8Times, 16), imm(0)); // mov ptr [eax + ecx * 8 + 16], 0 //! @endcode //! //! All addresses shown are using @c AsmJit::ptr() to make memory operand. //! Some assembler instructions (single operand ones) needs to specify memory //! operand size. For example calling a.inc(ptr(eax)) can't be //! used. @c AsmJit::Assembler::inc(), @c AsmJit::Assembler::dec() and similar //! instructions can't be serialized without specifying how bytes they are //! operating on. See next code how assembler works: //! //! @code //! // [byte] address //! a.inc(byte_ptr(eax)); // inc byte ptr [eax] //! a.dec(byte_ptr(eax)); // dec byte ptr [eax] //! // [word] address //! a.inc(word_ptr(eax)); // inc word ptr [eax] //! a.dec(word_ptr(eax)); // dec word ptr [eax] //! // [dword] address //! a.inc(dword_ptr(eax)); // inc dword ptr [eax] //! a.dec(dword_ptr(eax)); // dec dword ptr [eax] //! @endcode //! //! @section AsmJit_Assembler_CallingJitCode Calling JIT Code //! //! While you are over from emitting instructions, you can make your function //! using @c AsmJit::Assembler::make() method. This method will use memory //! manager to allocate virtual memory and relocates generated code to it. For //! memory allocation is used global memory manager by default and memory is //! freeable, but of course this default behavior can be overridden specifying //! your memory manager and allocation type. If you want to do with code //! something else you can always override make() method and do what you want. //! //! You can get size of generated code by @c getCodeSize() or @c getOffset() //! methods. These methods returns you code size (or more precisely current code //! offset) in bytes. Use takeCode() to take internal buffer (all pointers in //! @c AsmJit::Assembler instance will be zeroed and current buffer returned) //! to use it. If you don't take it, @c AsmJit::Assembler destructor will //! free it automatically. To alloc and run code manually don't use //! @c malloc()'ed memory, but instead use @c AsmJit::VirtualMemory::alloc() //! to get memory for executing (specify @c canExecute to @c true) or //! @c AsmJit::MemoryManager that provides more effective and comfortable way //! to allocate virtual memory. //! //! See next example how to allocate memory where you can execute code created //! by @c AsmJit::Assembler: //! //! @code //! using namespace AsmJit; //! //! Assembler a; //! //! // ... your code generation //! //! // your function prototype //! typedef void (*MyFn)(); //! //! // make your function //! MyFn fn = asmjit_cast(a.make()); //! //! // call your function //! fn(); //! //! // If you don't need your function again, free it. //! MemoryManager::getGlobal()->free(fn); //! @endcode //! //! There is also low level alternative how to allocate virtual memory and //! relocate code to it: //! //! @code //! using namespace AsmJit; //! //! Assembler a; //! // Your code generation ... //! //! // Your function prototype. //! typedef void (*MyFn)(); //! //! // Alloc memory for your function. //! MyFn fn = asmjit_cast( //! MemoryManager::getGlobal()->alloc(a.getCodeSize()); //! //! // Relocate the code (will make the function). //! a.relocCode(fn); //! //! // Call the generated function. //! fn(); //! //! // If you don't need your function anymore, it should be freed. //! MemoryManager::getGlobal()->free(fn); //! @endcode //! //! @c note This was very primitive example how to call generated code. //! In real production code you will never alloc and free code for one run, //! you will usually use generated code many times. //! //! @section AsmJit_Assembler_Labels Labels //! //! While generating assembler code, you will usually need to create complex //! code with labels. Labels are fully supported and you can call @c jmp or //! @c je (and similar) instructions to initialized or yet uninitialized label. //! Each label expects to be bound into offset. To bind label to specific //! offset, use @c bind() method. //! //! See next example that contains complete code that creates simple memory //! copy function (in DWORD entities). //! //! @code //! // Example: Usage of Label (32-bit code). //! // //! // Create simple DWORD memory copy function: //! // ASMJIT_STDCALL void copy32(uint32_t* dst, const uint32_t* src, size_t count); //! using namespace AsmJit; //! //! // Assembler instance. //! Assembler a; //! //! // Constants. //! const int arg_offset = 8; // Arguments offset (STDCALL EBP). //! const int arg_size = 12; // Arguments size. //! //! // Labels. //! Label L_Loop = a.newLabel(); //! //! // Prolog. //! a.push(ebp); //! a.mov(ebp, esp); //! a.push(esi); //! a.push(edi); //! //! // Fetch arguments //! a.mov(esi, dword_ptr(ebp, arg_offset + 0)); // Get dst. //! a.mov(edi, dword_ptr(ebp, arg_offset + 4)); // Get src. //! a.mov(ecx, dword_ptr(ebp, arg_offset + 8)); // Get count. //! //! // Bind L_Loop label to here. //! a.bind(L_Loop); //! //! Copy 4 bytes. //! a.mov(eax, dword_ptr(esi)); //! a.mov(dword_ptr(edi), eax); //! //! // Increment pointers. //! a.add(esi, 4); //! a.add(edi, 4); //! //! // Repeat loop until (--ecx != 0). //! a.dec(ecx); //! a.jz(L_Loop); //! //! // Epilog. //! a.pop(edi); //! a.pop(esi); //! a.mov(esp, ebp); //! a.pop(ebp); //! //! // Return: STDCALL convention is to pop stack in called function. //! a.ret(arg_size); //! @endcode //! //! If you need more abstraction for generating assembler code and you want //! to hide calling conventions between 32-bit and 64-bit operating systems, //! look at @c Compiler class that is designed for higher level code //! generation. //! //! @section AsmJit_Assembler_AdvancedCodeGeneration Advanced Code Generation //! //! This section describes some advanced generation features of @c Assembler //! class which can be simply overlooked. The first thing that is very likely //! needed is generic register support. In previous example the named registers //! were used. AsmJit contains functions which can convert register index into //! operand and back. //! //! Let's define function which can be used to generate some abstract code: //! //! @code //! // Simple function that generates dword copy. //! void genCopyDWord( //! Assembler& a, //! const GpReg& dst, const GpReg& src, const GpReg& tmp) //! { //! a.mov(tmp, dword_ptr(src)); //! a.mov(dword_ptr(dst), tmp); //! } //! @endcode //! //! This function can be called like genCopyDWord(a, edi, esi, ebx) //! or by using existing @ref GpReg instances. This abstraction allows to join //! more code sections together without rewriting each to use specific registers. //! You need to take care only about implicit registers which may be used by //! several instructions (like mul, imul, div, idiv, shifting, etc...). //! //! Next, more advanced, but often needed technique is that you can build your //! own registers allocator. X86 architecture contains 8 general purpose registers, //! 8 MMX (MM) registers and 8 SSE (XMM) registers. The X64 (AMD64) architecture //! extends count of general purpose registers and SSE2 registers to 16. Use the //! @c kX86RegNumBase constant to get count of GP or XMM registers or @c kX86RegNumGp, //! @c kX86RegNumMm and @c kX86RegNumXmm constants individually. //! //! To build register from index (value from 0 inclusive to kRegNumXXX //! exclusive) use @ref gpd(), @ref gpq() or @ref gpz() functions. To create //! a 8 or 16-bit register use @ref gpw(), @ref gpb_lo() or @ref gpb_hi(). //! To create other registers there are similar methods like @ref mm(), @ref xmm() //! and @ref st(). //! //! So our function call to genCopyDWord can be also used like this: //! //! @code //! genCopyDWord(a, gpd(kX86RegIndexEdi), gpd(kX86RegIndexEsi), gpd(kX86RegIndexEbx)); //! @endcode //! //! kX86RegIndexXXX are constants defined by @ref kX86RegIndex enum. You can use your //! own register allocator (or register slot manager) to alloc / free registers //! so kX86RegIndexXXX values can be replaced by your variables (0 to kRegNumXXX-1). //! //! @sa @ref X86Compiler. struct X86Assembler : public Assembler { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API X86Assembler(Context* context = JitContext::getGlobal()); ASMJIT_API virtual ~X86Assembler(); // -------------------------------------------------------------------------- // [Buffer - Setters (X86-Extensions)] // -------------------------------------------------------------------------- //! @brief Set custom variable @a i at position @a pos. //! //! @note This function is used to patch existing code. ASMJIT_API void setVarAt(size_t pos, sysint_t i, uint8_t isUnsigned, uint32_t size); // -------------------------------------------------------------------------- // [Emit] // // These functions are not protected against buffer overrun. Each place of // code which calls these functions ensures that there is some space using // canEmit() method. Emitters are internally protected in AsmJit::Buffer, // but only in debug builds. // -------------------------------------------------------------------------- //! @brief Emit single @a opCode without operands. inline void _emitOpCode(uint32_t opCode) { // Instruction prefix. if (opCode & 0xFF000000) _emitByte(static_cast((opCode >> 24) & 0xFF)); // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte(static_cast((opCode >> 16) & 0xFF)); if (opCode & 0x0000FF00) _emitByte(static_cast((opCode >> 8) & 0xFF)); // Last opcode is always emitted (can be also 0x00). _emitByte(static_cast(opCode & 0xFF)); } //! @brief Emit MODR/M byte. inline void _emitMod(uint8_t m, uint8_t o, uint8_t r) { _emitByte(((m & 0x03) << 6) | ((o & 0x07) << 3) | (r & 0x07)); } //! @brief Emit SIB byte. inline void _emitSib(uint8_t s, uint8_t i, uint8_t b) { _emitByte(((s & 0x03) << 6) | ((i & 0x07) << 3) | (b & 0x07)); } //! @brief Emit REX prefix (64-bit mode only). inline void _emitRexR(uint8_t w, uint8_t opReg, uint8_t regCode, bool forceRexPrefix) { #if defined(ASMJIT_X64) uint32_t rex; // w - Default operand size(0=Default, 1=64-bit). // r - Register field (1=high bit extension of the ModR/M REG field). // x - Index field not used in RexR // b - Base field (1=high bit extension of the ModR/M or SIB Base field). rex = (static_cast(forceRexPrefix != 0)) << 6; // Rex prefix code. rex += (static_cast(w ) ) << 3; // Rex.W (w << 3). rex += (static_cast(opReg ) & 0x08 ) >> 1; // Rex.R (r << 2). rex += (static_cast(regCode) & 0x08 ) >> 3; // Rex.B (b << 0). if (rex) _emitByte(static_cast(rex | 0x40)); #else ASMJIT_UNUSED(w); ASMJIT_UNUSED(opReg); ASMJIT_UNUSED(regCode); ASMJIT_UNUSED(forceRexPrefix); #endif // ASMJIT_X64 } //! @brief Emit REX prefix (64-bit mode only). inline void _emitRexRM(uint8_t w, uint8_t opReg, const Operand& rm, bool forceRexPrefix) { #if defined(ASMJIT_X64) uint32_t rex; // w - Default operand size(0=Default, 1=64-bit). // r - Register field (1=high bit extension of the ModR/M REG field). // x - Index field (1=high bit extension of the SIB Index field). // b - Base field (1=high bit extension of the ModR/M or SIB Base field). rex = (static_cast(forceRexPrefix != 0)) << 6; // Rex prefix code. rex += (static_cast(w ) ) << 3; // Rex.W (w << 3). rex += (static_cast(opReg ) & 0x08 ) >> 1; // Rex.R (r << 2). uint32_t b = 0; uint32_t x = 0; if (rm.isReg()) { b = (static_cast(rm).getRegCode() & 0x08) != 0; } else if (rm.isMem()) { b = ((static_cast(rm).getBase() & 0x8) != 0) & (static_cast(rm).getBase() != kInvalidValue); x = ((static_cast(rm).getIndex() & 0x8) != 0) & (static_cast(rm).getIndex() != kInvalidValue); } rex += static_cast(x) << 1; // Rex.R (x << 1). rex += static_cast(b) ; // Rex.B (b << 0). if (rex) _emitByte(static_cast(rex | 0x40)); #else ASMJIT_UNUSED(w); ASMJIT_UNUSED(opReg); ASMJIT_UNUSED(rm); #endif // ASMJIT_X64 } //! @brief Emit Register / Register - calls _emitMod(3, opReg, r) inline void _emitModR(uint8_t opReg, uint8_t r) { _emitMod(3, opReg, r); } //! @brief Emit Register / Register - calls _emitMod(3, opReg, r.code()) inline void _emitModR(uint8_t opReg, const Reg& r) { _emitMod(3, opReg, r.getRegCode()); } //! @brief Emit register / memory address combination to buffer. //! //! This method can hangle addresses from simple to complex ones with //! index and displacement. ASMJIT_API void _emitModM(uint8_t opReg, const Mem& mem, sysint_t immSize); //! @brief Emit Reg<-Reg or Reg<-Reg|Mem ModRM (can be followed by SIB //! and displacement) to buffer. //! //! This function internally calls @c _emitModM() or _emitModR() that depends //! to @a op type. //! //! @note @a opReg is usually real register ID (see @c R) but some instructions //! have specific format and in that cases @a opReg is part of opcode. ASMJIT_API void _emitModRM(uint8_t opReg, const Operand& op, sysint_t immSize); //! @brief Emit CS (code segmend) prefix. //! //! Behavior of this function is to emit code prefix only if memory operand //! address uses code segment. Code segment is used through memory operand //! with attached @c AsmJit::Label. ASMJIT_API void _emitSegmentPrefix(const Operand& rm); //! @brief Emit instruction where register is inlined to opcode. ASMJIT_API void _emitX86Inl(uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t reg, bool forceRexPrefix); //! @brief Emit instruction with reg/memory operand. ASMJIT_API void _emitX86RM(uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t o, const Operand& op, sysint_t immSize, bool forceRexPrefix); //! @brief Emit FPU instruction with no operands. ASMJIT_API void _emitFpu(uint32_t opCode); //! @brief Emit FPU instruction with one operand @a sti (index of FPU register). ASMJIT_API void _emitFpuSTI(uint32_t opCode, uint32_t sti); //! @brief Emit FPU instruction with one operand @a opReg and memory operand @a mem. ASMJIT_API void _emitFpuMEM(uint32_t opCode, uint8_t opReg, const Mem& mem); //! @brief Emit MMX/SSE instruction. ASMJIT_API void _emitMmu(uint32_t opCode, uint8_t rexw, uint8_t opReg, const Operand& src, sysint_t immSize); //! @brief Emit displacement. ASMJIT_API LabelLink* _emitDisplacement(LabelData& l_data, sysint_t inlinedDisplacement, int size); //! @brief Emit relative relocation to absolute pointer @a target. It's needed //! to add what instruction is emitting this, because in x64 mode the relative //! displacement can be impossible to calculate and in this case the trampoline //! is used. ASMJIT_API void _emitJmpOrCallReloc(uint32_t instruction, void* target); // Helpers to decrease binary code size. These four emit methods are just // helpers thats used by assembler. They call emitX86() adding NULLs // to first, second and third operand, if needed. //! @brief Emit X86/FPU or MM/XMM instruction. ASMJIT_API void _emitInstruction(uint32_t code); //! @brief Emit X86/FPU or MM/XMM instruction. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0); //! @brief Emit X86/FPU or MM/XMM instruction. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1); //! @brief Emit X86/FPU or MM/XMM instruction. //! //! Operands @a o1, @a o2 or @a o3 can be @c NULL if they are not used. //! //! Hint: Use @c emitX86() helpers to emit instructions. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2); //! @brief Private method for emitting jcc. ASMJIT_API void _emitJcc(uint32_t code, const Label* label, uint32_t hint); //! @brief Private method for emitting short jcc. inline void _emitShortJcc(uint32_t code, const Label* label, uint32_t hint) { _emitOptions |= kX86EmitOptionShortJump; _emitJcc(code, label, hint); } // -------------------------------------------------------------------------- // [EmbedLabel] // -------------------------------------------------------------------------- //! @brief Embed absolute label pointer (4 or 8 bytes). ASMJIT_API void embedLabel(const Label& label); // -------------------------------------------------------------------------- // [Align] // -------------------------------------------------------------------------- //! @brief Align target buffer to @a m bytes. //! //! Typical usage of this is to align labels at start of the inner loops. //! //! Inserts @c nop() instructions or CPU optimized NOPs. ASMJIT_API void align(uint32_t m); // -------------------------------------------------------------------------- // [Label] // -------------------------------------------------------------------------- //! @brief Create and return new label. ASMJIT_API Label newLabel(); //! @brief Register labels (used by @c Compiler). ASMJIT_API void registerLabels(size_t count); //! @brief Bind label to the current offset. //! //! @note Label can be bound only once! ASMJIT_API void bind(const Label& label); // -------------------------------------------------------------------------- // [Reloc] // -------------------------------------------------------------------------- ASMJIT_API virtual size_t relocCode(void* dst, sysuint_t addressBase) const; // -------------------------------------------------------------------------- // [Make] // -------------------------------------------------------------------------- ASMJIT_API virtual void* make(); // -------------------------------------------------------------------------- // [Embed] // -------------------------------------------------------------------------- //! @brief Add 8-bit integer data to the instuction stream. inline void db(uint8_t x) { embed(&x, 1); } //! @brief Add 16-bit integer data to the instuction stream. inline void dw(uint16_t x) { embed(&x, 2); } //! @brief Add 32-bit integer data to the instuction stream. inline void dd(uint32_t x) { embed(&x, 4); } //! @brief Add 64-bit integer data to the instuction stream. inline void dq(uint64_t x) { embed(&x, 8); } //! @brief Add 8-bit integer data to the instuction stream. inline void dint8(int8_t x) { embed(&x, sizeof(int8_t)); } //! @brief Add 8-bit integer data to the instuction stream. inline void duint8(uint8_t x) { embed(&x, sizeof(uint8_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void dint16(int16_t x) { embed(&x, sizeof(int16_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void duint16(uint16_t x) { embed(&x, sizeof(uint16_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void dint32(int32_t x) { embed(&x, sizeof(int32_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void duint32(uint32_t x) { embed(&x, sizeof(uint32_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void dint64(int64_t x) { embed(&x, sizeof(int64_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void duint64(uint64_t x) { embed(&x, sizeof(uint64_t)); } //! @brief Add system-integer data to the instuction stream. inline void dintptr(intptr_t x) { embed(&x, sizeof(intptr_t)); } //! @brief Add system-integer data to the instuction stream. inline void duintptr(uintptr_t x) { embed(&x, sizeof(uintptr_t)); } //! @brief Add float data to the instuction stream. inline void dfloat(float x) { embed(&x, sizeof(float)); } //! @brief Add double data to the instuction stream. inline void ddouble(double x) { embed(&x, sizeof(double)); } //! @brief Add pointer data to the instuction stream. inline void dptr(void* x) { embed(&x, sizeof(void*)); } //! @brief Add MM data to the instuction stream. inline void dmm(const MmData& x) { embed(&x, sizeof(MmData)); } //! @brief Add XMM data to the instuction stream. inline void dxmm(const XmmData& x) { embed(&x, sizeof(XmmData)); } //! @brief Add data to the instuction stream. inline void data(const void* data, size_t size) { embed(data, size); } //! @brief Add data in a given structure instance to the instuction stream. template inline void dstruct(const T& x) { embed(&x, sizeof(T)); } // -------------------------------------------------------------------------- // [X86 Instructions] // -------------------------------------------------------------------------- //! @brief Add with Carry. inline void adc(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add. inline void add(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Logical And. inline void and_(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Byte swap (32-bit or 64-bit registers only) (i486). inline void bswap(const GpReg& dst) { ASMJIT_ASSERT(dst.getRegType() == kX86RegTypeGpd || dst.getRegType() == kX86RegTypeGpq); _emitInstruction(kX86InstBSwap, &dst); } //! @brief Bit test. inline void bt(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Call Procedure. inline void call(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpz)); _emitInstruction(kX86InstCall, &dst); } //! @brief Call Procedure. inline void call(const Mem& dst) { _emitInstruction(kX86InstCall, &dst); } //! @brief Call Procedure. inline void call(const Imm& dst) { _emitInstruction(kX86InstCall, &dst); } //! @brief Call Procedure. //! @overload inline void call(void* dst) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstCall, &imm); } //! @brief Call Procedure. inline void call(const Label& label) { _emitInstruction(kX86InstCall, &label); } //! @brief Convert Byte to Word (Sign Extend). //! //! AX <- Sign Extend AL inline void cbw() { _emitInstruction(kX86InstCbw); } //! @brief Convert Word to DWord (Sign Extend). //! //! DX:AX <- Sign Extend AX inline void cwd() { _emitInstruction(kX86InstCwd); } //! @brief Convert Word to DWord (Sign Extend). //! //! EAX <- Sign Extend AX inline void cwde() { _emitInstruction(kX86InstCwde); } //! @brief Convert DWord to QWord (Sign Extend). //! //! EDX:EAX <- Sign Extend EAX inline void cdq() { _emitInstruction(kX86InstCdq); } #if defined(ASMJIT_X64) //! @brief Convert DWord to QWord (Sign Extend). //! //! RAX <- Sign Extend EAX inline void cdqe() { _emitInstruction(kX86InstCdqe); } #endif // ASMJIT_X64 //! @brief Clear Carry flag //! //! This instruction clears the CF flag in the EFLAGS register. inline void clc() { _emitInstruction(kX86InstClc); } //! @brief Clear Direction flag //! //! This instruction clears the DF flag in the EFLAGS register. inline void cld() { _emitInstruction(kX86InstCld); } //! @brief Complement Carry Flag. //! //! This instruction complements the CF flag in the EFLAGS register. //! (CF = NOT CF) inline void cmc() { _emitInstruction(kX86InstCmc); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpReg& dst, const GpReg& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpReg& dst, const Mem& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCmpXCHG, &dst, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstCmpXCHG, &dst, &src); } //! @brief Compares the 64-bit value in EDX:EAX with the memory operand (Pentium). //! //! If the values are equal, then this instruction stores the 64-bit value //! in ECX:EBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 64-bit memory operand into the EDX:EAX //! registers and clears the zero flag. inline void cmpxchg8b(const Mem& dst) { _emitInstruction(kX86InstCmpXCHG8B, &dst); } #if defined(ASMJIT_X64) //! @brief Compares the 128-bit value in RDX:RAX with the memory operand (X64). //! //! If the values are equal, then this instruction stores the 128-bit value //! in RCX:RBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 128-bit memory operand into the RDX:RAX //! registers and clears the zero flag. inline void cmpxchg16b(const Mem& dst) { _emitInstruction(kX86InstCmpXCHG16B, &dst); } #endif // ASMJIT_X64 //! @brief CPU Identification (i486). inline void cpuid() { _emitInstruction(kX86InstCpuId); } #if defined(ASMJIT_X64) //! @brief Convert QWord to DQWord (Sign Extend). //! //! RDX:RAX <- Sign Extend RAX inline void cqo() { _emitInstruction(kX86InstCqo); } #endif // ASMJIT_X64 #if defined(ASMJIT_X86) //! @brief Decimal adjust AL after addition //! //! This instruction adjusts the sum of two packed BCD values to create //! a packed BCD result. //! //! @note This instruction is only available in 32-bit mode. inline void daa() { _emitInstruction(kX86InstDaa); } #endif // ASMJIT_X86 #if defined(ASMJIT_X86) //! @brief Decimal adjust AL after subtraction //! //! This instruction adjusts the result of the subtraction of two packed //! BCD values to create a packed BCD result. //! //! @note This instruction is only available in 32-bit mode. inline void das() { _emitInstruction(kX86InstDas); } #endif // ASMJIT_X86 //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const GpReg& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const Mem& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Unsigned divide. //! //! This instruction divides (unsigned) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void div(const GpReg& src) { _emitInstruction(kX86InstDiv, &src); } //! @brief Unsigned divide. //! @overload inline void div(const Mem& src) { _emitInstruction(kX86InstDiv, &src); } //! @brief Make Stack Frame for Procedure Parameters. inline void enter(const Imm& imm16, const Imm& imm8) { _emitInstruction(kX86InstEnter, &imm16, &imm8); } //! @brief Signed divide. //! //! This instruction divides (signed) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void idiv(const GpReg& src) { _emitInstruction(kX86InstIDiv, &src); } //! @brief Signed divide. //! @overload inline void idiv(const Mem& src) { _emitInstruction(kX86InstIDiv, &src); } //! @brief Signed multiply. //! //! Source operand (in a general-purpose register or memory location) //! is multiplied by the value in the AL, AX, or EAX register (depending //! on the operand size) and the product is stored in the AX, DX:AX, or //! EDX:EAX registers, respectively. inline void imul(const GpReg& src) { _emitInstruction(kX86InstIMul, &src); } //! @overload inline void imul(const Mem& src) { _emitInstruction(kX86InstIMul, &src); } //! @brief Signed multiply. //! //! Destination operand (the first operand) is multiplied by the source //! operand (second operand). The destination operand is a general-purpose //! register and the source operand is an immediate value, a general-purpose //! register, or a memory location. The product is then stored in the //! destination operand location. inline void imul(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! //! source operand (which can be a general-purpose register or a memory //! location) is multiplied by the second source operand (an immediate //! value). The product is then stored in the destination operand //! (a general-purpose register). inline void imul(const GpReg& dst, const GpReg& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @overload inline void imul(const GpReg& dst, const Mem& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const GpReg& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const Mem& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Interrupt 3 - trap to debugger. inline void int3() { _emitInstruction(kX86InstInt3); } //! @brief Jump to label @a label if condition @a cc is met. //! //! This instruction checks the state of one or more of the status flags in //! the EFLAGS register (CF, OF, PF, SF, and ZF) and, if the flags are in the //! specified state (condition), performs a jump to the target instruction //! specified by the destination operand. A condition code (cc) is associated //! with each instruction to indicate the condition being tested for. If the //! condition is not satisfied, the jump is not performed and execution //! continues with the instruction following the Jcc instruction. inline void j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(X86Util::getJccInstFromCond(cc), &label, hint); } //! @brief Jump to label @a label if condition is met. inline void ja (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jae (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJAE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJBE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void je (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jg (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jge (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJGE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jle (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJLE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jna (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNAE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNBE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jne (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jng (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNGE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNLE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jno (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jns (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNZ , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void js (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJZ , &label, hint); } //! @brief Short jump to label @a label if condition @a cc is met. //! @sa j() inline void short_j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone) { _emitOptions |= kX86EmitOptionShortJump; j(cc, label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_ja (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJA , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jae (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJAE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jb (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJB , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJBE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jc (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJC , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_je (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jg (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJG , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jge (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJGE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jl (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJL , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jle (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJLE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jna (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNA , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNAE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNB , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNBE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNC , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jne (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jng (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNG , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNGE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNL , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNLE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jno (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNO , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNP , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jns (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNS , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNZ , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jo (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJO , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jp (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJP , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJPE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJPO , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_js (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJS , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jz (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJZ , &label, hint); } //! @brief Jump. //! @overload inline void jmp(const GpReg& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Mem& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Imm& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(void* dst) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstJmp, &imm); } //! @brief Jump. //! //! This instruction transfers program control to a different point //! in the instruction stream without recording return information. //! The destination (target) operand specifies the label of the //! instruction being jumped to. inline void jmp(const Label& label) { _emitInstruction(kX86InstJmp, &label); } //! @brief Short jump. //! @sa jmp() inline void short_jmp(const Label& label) { _emitOptions |= kX86EmitOptionShortJump; _emitInstruction(kX86InstJmp, &label); } //! @brief Load Effective Address //! //! This instruction computes the effective address of the second //! operand (the source operand) and stores it in the first operand //! (destination operand). The source operand is a memory address //! (offset part) specified with one of the processors addressing modes. //! The destination operand is a general-purpose register. inline void lea(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstLea, &dst, &src); } //! @brief High Level Procedure Exit. inline void leave() { _emitInstruction(kX86InstLeave); } //! @brief Move. //! //! This instruction copies the second operand (source operand) to the first //! operand (destination operand). The source operand can be an immediate //! value, general-purpose register, segment register, or memory location. //! The destination register can be a general-purpose register, segment //! register, or memory location. Both operands must be the same size, which //! can be a byte, a word, or a DWORD. //! //! @note To move MMX or SSE registers to/from GP registers or memory, use //! corresponding functions: @c movd(), @c movq(), etc. Passing MMX or SSE //! registers to @c mov() is illegal. inline void mov(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const GpReg& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const Mem& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const GpReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move byte, word, dword or qword from absolute address @a src to //! AL, AX, EAX or RAX register. inline void mov_ptr(const GpReg& dst, void* src) { ASMJIT_ASSERT(dst.getRegIndex() == 0); Imm imm((sysint_t)src); _emitInstruction(kX86InstMovPtr, &dst, &imm); } //! @brief Move byte, word, dword or qword from AL, AX, EAX or RAX register //! to absolute address @a dst. inline void mov_ptr(void* dst, const GpReg& src) { ASMJIT_ASSERT(src.getRegIndex() == 0); Imm imm((sysint_t)dst); _emitInstruction(kX86InstMovPtr, &imm, &src); } //! @brief Move with Sign-Extension. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and sign //! extends the value to 16, 32 or 64-bits. //! //! @sa movsxd(). void movsx(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } //! @brief Move with Sign-Extension. //! @overload void movsx(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move DWord to QWord with sign-extension. inline void movsxd(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } //! @brief Move DWord to QWord with sign-extension. //! @overload inline void movsxd(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move with Zero-Extend. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and zero //! extends the value to 16 or 32-bits. The size of the converted value //! depends on the operand-size attribute. inline void movzx(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Move with Zero-Extend. //! @brief Overload inline void movzx(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Unsigned multiply. //! //! Source operand (in a general-purpose register or memory location) //! is multiplied by the value in the AL, AX, or EAX register (depending //! on the operand size) and the product is stored in the AX, DX:AX, or //! EDX:EAX registers, respectively. inline void mul(const GpReg& src) { _emitInstruction(kX86InstMul, &src); } //! @brief Unsigned multiply. //! @overload inline void mul(const Mem& src) { _emitInstruction(kX86InstMul, &src); } //! @brief Two's Complement Negation. inline void neg(const GpReg& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief Two's Complement Negation. inline void neg(const Mem& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief No Operation. //! //! This instruction performs no operation. This instruction is a one-byte //! instruction that takes up space in the instruction stream but does not //! affect the machine context, except the EIP register. The NOP instruction //! is an alias mnemonic for the XCHG (E)AX, (E)AX instruction. inline void nop() { _emitInstruction(kX86InstNop); } //! @brief One's Complement Negation. inline void not_(const GpReg& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief One's Complement Negation. inline void not_(const Mem& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief Logical Inclusive OR. inline void or_(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Pop a Value from the Stack. //! //! This instruction loads the value from the top of the stack to the location //! specified with the destination operand and then increments the stack pointer. //! The destination operand can be a general purpose register, memory location, //! or segment register. inline void pop(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpz)); _emitInstruction(kX86InstPop, &dst); } //! @brief Pop a Segment Register from the Stack. //! //! @note There is no instruction to pop a cs segment register. inline void pop(const SegmentReg& dst) { ASMJIT_ASSERT(dst.getRegIndex() != kX86SegCs); _emitInstruction(kX86InstPop, &dst); } inline void pop(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPop, &dst); } #if defined(ASMJIT_X86) //! @brief Pop All General-Purpose Registers. //! //! Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX. inline void popad() { _emitInstruction(kX86InstPopAD); } #endif // ASMJIT_X86 //! @brief Pop Stack into EFLAGS Register (32-bit or 64-bit). inline void popf() { #if defined(ASMJIT_X86) popfd(); #else popfq(); #endif } #if defined(ASMJIT_X86) //! @brief Pop Stack into EFLAGS Register (32-bit). inline void popfd() { _emitInstruction(kX86InstPopFD); } #else //! @brief Pop Stack into EFLAGS Register (64-bit). inline void popfq() { _emitInstruction(kX86InstPopFQ); } #endif //! @brief Push WORD/DWORD/QWORD Onto the Stack. //! //! @note 32-bit architecture pushed DWORD while 64-bit //! pushes QWORD. 64-bit mode not provides instruction to //! push 32-bit register/memory. inline void push(const GpReg& src) { ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpw) || src.isRegType(kX86RegTypeGpz)); _emitInstruction(kX86InstPush, &src); } //! @brief Push Segment Register Onto the Stack. inline void push(const SegmentReg& src) { _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Imm& src) { _emitInstruction(kX86InstPush, &src); } #if defined(ASMJIT_X86) //! @brief Push All General-Purpose Registers. //! //! Push EAX, ECX, EDX, EBX, original ESP, EBP, ESI, and EDI. inline void pushad() { _emitInstruction(kX86InstPushAD); } #endif // ASMJIT_X86 //! @brief Push EFLAGS Register (32-bit or 64-bit) onto the Stack. inline void pushf() { #if defined(ASMJIT_X86) pushfd(); #else pushfq(); #endif } #if defined(ASMJIT_X86) //! @brief Push EFLAGS Register (32-bit) onto the Stack. inline void pushfd() { _emitInstruction(kX86InstPushFD); } #else //! @brief Push EFLAGS Register (64-bit) onto the Stack. inline void pushfq() { _emitInstruction(kX86InstPushFQ); } #endif // ASMJIT_X86 //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Read Time-Stamp Counter (Pentium). inline void rdtsc() { _emitInstruction(kX86InstRdtsc); } //! @brief Read Time-Stamp Counter and Processor ID (New). inline void rdtscp() { _emitInstruction(kX86InstRdtscP); } //! @brief Load ECX/RCX BYTEs from DS:[ESI/RSI] to AL. inline void rep_lodsb() { _emitInstruction(kX86InstRepLodSB); } //! @brief Load ECX/RCX DWORDs from DS:[ESI/RSI] to EAX. inline void rep_lodsd() { _emitInstruction(kX86InstRepLodSD); } #if defined(ASMJIT_X64) //! @brief Load ECX/RCX QWORDs from DS:[ESI/RSI] to RAX. inline void rep_lodsq() { _emitInstruction(kX86InstRepLodSQ); } #endif // ASMJIT_X64 //! @brief Load ECX/RCX WORDs from DS:[ESI/RSI] to AX. inline void rep_lodsw() { _emitInstruction(kX86InstRepLodSW); } //! @brief Move ECX/RCX BYTEs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsb() { _emitInstruction(kX86InstRepMovSB); } //! @brief Move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsd() { _emitInstruction(kX86InstRepMovSD); } #if defined(ASMJIT_X64) //! @brief Move ECX/RCX QWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsq() { _emitInstruction(kX86InstRepMovSQ); } #endif // ASMJIT_X64 //! @brief Move ECX/RCX WORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsw() { _emitInstruction(kX86InstRepMovSW); } //! @brief Fill ECX/RCX BYTEs at ES:[EDI/RDI] with AL. inline void rep_stosb() { _emitInstruction(kX86InstRepStoSB); } //! @brief Fill ECX/RCX DWORDs at ES:[EDI/RDI] with EAX. inline void rep_stosd() { _emitInstruction(kX86InstRepStoSD); } #if defined(ASMJIT_X64) //! @brief Fill ECX/RCX QWORDs at ES:[EDI/RDI] with RAX. inline void rep_stosq() { _emitInstruction(kX86InstRepStoSQ); } #endif // ASMJIT_X64 //! @brief Fill ECX/RCX WORDs at ES:[EDI/RDI] with AX. inline void rep_stosw() { _emitInstruction(kX86InstRepStoSW); } //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsb() { _emitInstruction(kX86InstRepECmpSB); } //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsd() { _emitInstruction(kX86InstRepECmpSD); } #if defined(ASMJIT_X64) //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsq() { _emitInstruction(kX86InstRepECmpSQ); } #endif // ASMJIT_X64 //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsw() { _emitInstruction(kX86InstRepECmpSW); } //! @brief Find non-AL BYTE starting at ES:[EDI/RDI]. inline void repe_scasb() { _emitInstruction(kX86InstRepEScaSB); } //! @brief Find non-EAX DWORD starting at ES:[EDI/RDI]. inline void repe_scasd() { _emitInstruction(kX86InstRepEScaSD); } #if defined(ASMJIT_X64) //! @brief Find non-RAX QWORD starting at ES:[EDI/RDI]. inline void repe_scasq() { _emitInstruction(kX86InstRepEScaSQ); } #endif // ASMJIT_X64 //! @brief Find non-AX WORD starting at ES:[EDI/RDI]. inline void repe_scasw() { _emitInstruction(kX86InstRepEScaSW); } //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsb() { _emitInstruction(kX86InstRepNECmpSB); } //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsd() { _emitInstruction(kX86InstRepNECmpSD); } #if defined(ASMJIT_X64) //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsq() { _emitInstruction(kX86InstRepNECmpSQ); } #endif // ASMJIT_X64 //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsw() { _emitInstruction(kX86InstRepNECmpSW); } //! @brief Find AL, starting at ES:[EDI/RDI]. inline void repne_scasb() { _emitInstruction(kX86InstRepNEScaSB); } //! @brief Find EAX, starting at ES:[EDI/RDI]. inline void repne_scasd() { _emitInstruction(kX86InstRepNEScaSD); } #if defined(ASMJIT_X64) //! @brief Find RAX, starting at ES:[EDI/RDI]. inline void repne_scasq() { _emitInstruction(kX86InstRepNEScaSQ); } #endif // ASMJIT_X64 //! @brief Find AX, starting at ES:[EDI/RDI]. inline void repne_scasw() { _emitInstruction(kX86InstRepNEScaSW); } //! @brief Return from Procedure. inline void ret() { _emitInstruction(kX86InstRet); } //! @brief Return from Procedure. inline void ret(const Imm& imm16) { _emitInstruction(kX86InstRet, &imm16); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } #if defined(ASMJIT_X86) //! @brief Store AH into Flags. inline void sahf() { _emitInstruction(kX86InstSahf); } #endif // ASMJIT_X86 //! @brief Integer subtraction with borrow. inline void sbb(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void seta (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void seta (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void setae (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setae (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setb (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setbe (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setbe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setc (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void setc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void sete (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void sete (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void setg (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setg (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setge (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setge (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setl (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setle (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setle (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setna (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setna (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setnae(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnae(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnb (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnbe(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnbe(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnc (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setnc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setne (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setne (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setng (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setng (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setnge(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnge(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnl (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnle(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setnle(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setno (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setno (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setnp (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setnp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setns (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setns (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setnz (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void setnz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void seto (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void seto (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void setp (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setpe (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpo (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void setpo (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void sets (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void sets (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void setz (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Set Byte on Condition. inline void setz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const GpReg& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const GpReg& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const Mem& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const Mem& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const GpReg& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const GpReg& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const Mem& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const Mem& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Set Carry Flag to 1. inline void stc() { _emitInstruction(kX86InstStc); } //! @brief Set Direction Flag to 1. inline void std() { _emitInstruction(kX86InstStd); } //! @brief Subtract. inline void sub(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Logical Compare. inline void test(const GpReg& op1, const GpReg& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const GpReg& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const GpReg& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Undefined instruction - Raise invalid opcode exception. inline void ud2() { _emitInstruction(kX86InstUd2); } //! @brief Exchange and Add. inline void xadd(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange and Add. inline void xadd(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstXchg, &src, &dst); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } // -------------------------------------------------------------------------- // [X87 Instructions (FPU)] // -------------------------------------------------------------------------- //! @brief Compute 2^x - 1 (FPU). inline void f2xm1() { _emitInstruction(kX86InstF2XM1); } //! @brief Absolute Value of st(0) (FPU). inline void fabs() { _emitInstruction(kX86InstFAbs); } //! @brief Add @a src to @a dst and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fadd(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFAdd, &dst, &src); } //! @brief Add @a src to st(0) and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fadd(const Mem& src) { _emitInstruction(kX86InstFAdd, &src); } //! @brief Add st(0) to @a dst and POP register stack (FPU). inline void faddp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFAddP, &dst); } //! @brief Load Binary Coded Decimal (FPU). inline void fbld(const Mem& src) { _emitInstruction(kX86InstFBLd, &src); } //! @brief Store BCD Integer and Pop (FPU). inline void fbstp(const Mem& dst) { _emitInstruction(kX86InstFBStP, &dst); } //! @brief Change st(0) Sign (FPU). inline void fchs() { _emitInstruction(kX86InstFCHS); } //! @brief Clear Exceptions (FPU). //! //! Clear floating-point exception flags after checking for pending unmasked //! floating-point exceptions. //! //! Clears the floating-point exception flags (PE, UE, OE, ZE, DE, and IE), //! the exception summary status flag (ES), the stack fault flag (SF), and //! the busy flag (B) in the FPU status word. The FCLEX instruction checks //! for and handles any pending unmasked floating-point exceptions before //! clearing the exception flags. inline void fclex() { _emitInstruction(kX86InstFClex); } //! @brief FP Conditional Move (FPU). inline void fcmovb(const X87Reg& src) { _emitInstruction(kX86InstFCMovB, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovbe(const X87Reg& src) { _emitInstruction(kX86InstFCMovBE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmove(const X87Reg& src) { _emitInstruction(kX86InstFCMovE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovnb(const X87Reg& src) { _emitInstruction(kX86InstFCMovNB, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovnbe(const X87Reg& src) { _emitInstruction(kX86InstFCMovNBE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovne(const X87Reg& src) { _emitInstruction(kX86InstFCMovNE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovnu(const X87Reg& src) { _emitInstruction(kX86InstFCMovNU, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovu(const X87Reg& src) { _emitInstruction(kX86InstFCMovU, &src); } //! @brief Compare st(0) with @a reg (FPU). inline void fcom(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFCom, ®); } //! @brief Compare st(0) with 4-byte or 8-byte FP at @a src (FPU). inline void fcom(const Mem& src) { _emitInstruction(kX86InstFCom, &src); } //! @brief Compare st(0) with @a reg and pop the stack (FPU). inline void fcomp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFComP, ®); } //! @brief Compare st(0) with 4-byte or 8-byte FP at @a adr and pop the //! stack (FPU). inline void fcomp(const Mem& mem) { _emitInstruction(kX86InstFComP, &mem); } //! @brief Compare st(0) with st(1) and pop register stack twice (FPU). inline void fcompp() { _emitInstruction(kX86InstFComPP); } //! @brief Compare st(0) and @a reg and Set EFLAGS (FPU). inline void fcomi(const X87Reg& reg) { _emitInstruction(kX86InstFComI, ®); } //! @brief Compare st(0) and @a reg and Set EFLAGS and pop the stack (FPU). inline void fcomip(const X87Reg& reg) { _emitInstruction(kX86InstFComIP, ®); } //! @brief Cosine (FPU). //! //! This instruction calculates the cosine of the source operand in //! register st(0) and stores the result in st(0). inline void fcos() { _emitInstruction(kX86InstFCos); } //! @brief Decrement Stack-Top Pointer (FPU). //! //! Subtracts one from the TOP field of the FPU status word (decrements //! the top-ofstack pointer). If the TOP field contains a 0, it is set //! to 7. The effect of this instruction is to rotate the stack by one //! position. The contents of the FPU data registers and tag register //! are not affected. inline void fdecstp() { _emitInstruction(kX86InstFDecStP); } //! @brief Divide @a dst by @a src (FPU). //! //! @note One of @a dst or @a src register must be st(0). inline void fdiv(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFDiv, &dst, &src); } //! @brief Divide st(0) by 32-bit or 64-bit FP value (FPU). inline void fdiv(const Mem& src) { _emitInstruction(kX86InstFDiv, &src); } //! @brief Divide @a reg by st(0) (FPU). inline void fdivp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFDivP, ®); } //! @brief Reverse Divide @a dst by @a src (FPU). //! //! @note One of @a dst or @a src register must be st(0). inline void fdivr(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFDivR, &dst, &src); } //! @brief Reverse Divide st(0) by 32-bit or 64-bit FP value (FPU). inline void fdivr(const Mem& src) { _emitInstruction(kX86InstFDivR, &src); } //! @brief Reverse Divide @a reg by st(0) (FPU). inline void fdivrp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFDivRP, ®); } //! @brief Free Floating-Point Register (FPU). //! //! Sets the tag in the FPU tag register associated with register @a reg //! to empty (11B). The contents of @a reg and the FPU stack-top pointer //! (TOP) are not affected. inline void ffree(const X87Reg& reg) { _emitInstruction(kX86InstFFree, ®); } //! @brief Add 16-bit or 32-bit integer to st(0) (FPU). inline void fiadd(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIAdd, &src); } //! @brief Compare st(0) with 16-bit or 32-bit Integer (FPU). inline void ficom(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFICom, &src); } //! @brief Compare st(0) with 16-bit or 32-bit Integer and pop the stack (FPU). inline void ficomp(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIComP, &src); } //! @brief Divide st(0) by 32-bit or 16-bit integer (@a src) (FPU). inline void fidiv(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIDiv, &src); } //! @brief Reverse Divide st(0) by 32-bit or 16-bit integer (@a src) (FPU). inline void fidivr(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIDivR, &src); } //! @brief Load 16-bit, 32-bit or 64-bit Integer and push it to the stack (FPU). //! //! Converts the signed-integer source operand into double extended-precision //! floating point format and pushes the value onto the FPU register stack. //! The source operand can be a word, doubleword, or quadword integer. It is //! loaded without rounding errors. The sign of the source operand is //! preserved. inline void fild(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4 || src.getSize() == 8); _emitInstruction(kX86InstFILd, &src); } //! @brief Multiply st(0) by 16-bit or 32-bit integer and store it //! to st(0) (FPU). inline void fimul(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIMul, &src); } //! @brief Increment Stack-Top Pointer (FPU). //! //! Adds one to the TOP field of the FPU status word (increments the //! top-of-stack pointer). If the TOP field contains a 7, it is set to 0. //! The effect of this instruction is to rotate the stack by one position. //! The contents of the FPU data registers and tag register are not affected. //! This operation is not equivalent to popping the stack, because the tag //! for the previous top-of-stack register is not marked empty. inline void fincstp() { _emitInstruction(kX86InstFIncStP); } //! @brief Initialize Floating-Point Unit (FPU). //! //! Initialize FPU after checking for pending unmasked floating-point //! exceptions. inline void finit() { _emitInstruction(kX86InstFInit); } //! @brief Subtract 16-bit or 32-bit integer from st(0) and store result to //! st(0) (FPU). inline void fisub(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFISub, &src); } //! @brief Reverse Subtract 16-bit or 32-bit integer from st(0) and //! store result to st(0) (FPU). inline void fisubr(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFISubR, &src); } //! @brief Initialize Floating-Point Unit (FPU). //! //! Initialize FPU without checking for pending unmasked floating-point //! exceptions. inline void fninit() { _emitInstruction(kX86InstFNInit); } //! @brief Store st(0) as 16-bit or 32-bit Integer to @a dst (FPU). inline void fist(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == 4); _emitInstruction(kX86InstFISt, &dst); } //! @brief Store st(0) as 16-bit, 32-bit or 64-bit Integer to @a dst and pop //! stack (FPU). inline void fistp(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == 4 || dst.getSize() == 8); _emitInstruction(kX86InstFIStP, &dst); } //! @brief Push 32-bit, 64-bit or 80-bit Floating Point Value onto the FPU //! register stack (FPU). inline void fld(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8 || src.getSize() == 10); _emitInstruction(kX86InstFLd, &src); } //! @brief Push @a reg onto the FPU register stack (FPU). inline void fld(const X87Reg& reg) { _emitInstruction(kX86InstFLd, ®); } //! @brief Push +1.0 onto the FPU register stack (FPU). inline void fld1() { _emitInstruction(kX86InstFLd1); } //! @brief Push log2(10) onto the FPU register stack (FPU). inline void fldl2t() { _emitInstruction(kX86InstFLdL2T); } //! @brief Push log2(e) onto the FPU register stack (FPU). inline void fldl2e() { _emitInstruction(kX86InstFLdL2E); } //! @brief Push pi onto the FPU register stack (FPU). inline void fldpi() { _emitInstruction(kX86InstFLdPi); } //! @brief Push log10(2) onto the FPU register stack (FPU). inline void fldlg2() { _emitInstruction(kX86InstFLdLg2); } //! @brief Push ln(2) onto the FPU register stack (FPU). inline void fldln2() { _emitInstruction(kX86InstFLdLn2); } //! @brief Push +0.0 onto the FPU register stack (FPU). inline void fldz() { _emitInstruction(kX86InstFLdZ); } //! @brief Load x87 FPU Control Word (2 bytes) (FPU). inline void fldcw(const Mem& src) { _emitInstruction(kX86InstFLdCw, &src); } //! @brief Load x87 FPU Environment (14 or 28 bytes) (FPU). inline void fldenv(const Mem& src) { _emitInstruction(kX86InstFLdEnv, &src); } //! @brief Multiply @a dst by @a src and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fmul(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFMul, &dst, &src); } //! @brief Multiply st(0) by @a src and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fmul(const Mem& src) { _emitInstruction(kX86InstFMul, &src); } //! @brief Multiply st(0) by @a dst and POP register stack (FPU). inline void fmulp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFMulP, &dst); } //! @brief Clear Exceptions (FPU). //! //! Clear floating-point exception flags without checking for pending //! unmasked floating-point exceptions. //! //! Clears the floating-point exception flags (PE, UE, OE, ZE, DE, and IE), //! the exception summary status flag (ES), the stack fault flag (SF), and //! the busy flag (B) in the FPU status word. The FCLEX instruction does //! not checks for and handles any pending unmasked floating-point exceptions //! before clearing the exception flags. inline void fnclex() { _emitInstruction(kX86InstFNClex); } //! @brief No Operation (FPU). inline void fnop() { _emitInstruction(kX86InstFNop); } //! @brief Save FPU State (FPU). //! //! Store FPU environment to m94byte or m108byte without //! checking for pending unmasked FP exceptions. //! Then re-initialize the FPU. inline void fnsave(const Mem& dst) { _emitInstruction(kX86InstFNSave, &dst); } //! @brief Store x87 FPU Environment (FPU). //! //! Store FPU environment to @a dst (14 or 28 Bytes) without checking for //! pending unmasked floating-point exceptions. Then mask all floating //! point exceptions. inline void fnstenv(const Mem& dst) { _emitInstruction(kX86InstFNStEnv, &dst); } //! @brief Store x87 FPU Control Word (FPU). //! //! Store FPU control word to @a dst (2 Bytes) without checking for pending //! unmasked floating-point exceptions. inline void fnstcw(const Mem& dst) { _emitInstruction(kX86InstFNStCw, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fnstsw(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegCode(kX86RegAx)); _emitInstruction(kX86InstFNStSw, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fnstsw(const Mem& dst) { _emitInstruction(kX86InstFNStSw, &dst); } //! @brief Partial Arctangent (FPU). //! //! Replace st(1) with arctan(st(1)/st(0)) and pop the register stack. inline void fpatan() { _emitInstruction(kX86InstFPAtan); } //! @brief Partial Remainder (FPU). //! //! Replace st(0) with the remainder obtained from dividing st(0) by st(1). inline void fprem() { _emitInstruction(kX86InstFPRem); } //! @brief Partial Remainder (FPU). //! //! Replace st(0) with the IEEE remainder obtained from dividing st(0) by //! st(1). inline void fprem1() { _emitInstruction(kX86InstFPRem1); } //! @brief Partial Tangent (FPU). //! //! Replace st(0) with its tangent and push 1 onto the FPU stack. inline void fptan() { _emitInstruction(kX86InstFPTan); } //! @brief Round to Integer (FPU). //! //! Rount st(0) to an Integer. inline void frndint() { _emitInstruction(kX86InstFRndInt); } //! @brief Restore FPU State (FPU). //! //! Load FPU state from src (94 or 108 bytes). inline void frstor(const Mem& src) { _emitInstruction(kX86InstFRstor, &src); } //! @brief Save FPU State (FPU). //! //! Store FPU state to 94 or 108-bytes after checking for //! pending unmasked FP exceptions. Then reinitialize //! the FPU. inline void fsave(const Mem& dst) { _emitInstruction(kX86InstFSave, &dst); } //! @brief Scale (FPU). //! //! Scale st(0) by st(1). inline void fscale() { _emitInstruction(kX86InstFScale); } //! @brief Sine (FPU). //! //! This instruction calculates the sine of the source operand in //! register st(0) and stores the result in st(0). inline void fsin() { _emitInstruction(kX86InstFSin); } //! @brief Sine and Cosine (FPU). //! //! Compute the sine and cosine of st(0); replace st(0) with //! the sine, and push the cosine onto the register stack. inline void fsincos() { _emitInstruction(kX86InstFSinCos); } //! @brief Square Root (FPU). //! //! Calculates square root of st(0) and stores the result in st(0). inline void fsqrt() { _emitInstruction(kX86InstFSqrt); } //! @brief Store Floating Point Value (FPU). //! //! Store st(0) as 32-bit or 64-bit floating point value to @a dst. inline void fst(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 4 || dst.getSize() == 8); _emitInstruction(kX86InstFSt, &dst); } //! @brief Store Floating Point Value (FPU). //! //! Store st(0) to @a reg. inline void fst(const X87Reg& reg) { _emitInstruction(kX86InstFSt, ®); } //! @brief Store Floating Point Value and Pop Register Stack (FPU). //! //! Store st(0) as 32-bit or 64-bit floating point value to @a dst //! and pop register stack. inline void fstp(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 4 || dst.getSize() == 8 || dst.getSize() == 10); _emitInstruction(kX86InstFStP, &dst); } //! @brief Store Floating Point Value and Pop Register Stack (FPU). //! //! Store st(0) to @a reg and pop register stack. inline void fstp(const X87Reg& reg) { _emitInstruction(kX86InstFStP, ®); } //! @brief Store x87 FPU Control Word (FPU). //! //! Store FPU control word to @a dst (2 Bytes) after checking for pending //! unmasked floating-point exceptions. inline void fstcw(const Mem& dst) { _emitInstruction(kX86InstFStCw, &dst); } //! @brief Store x87 FPU Environment (FPU). //! //! Store FPU environment to @a dst (14 or 28 Bytes) after checking for //! pending unmasked floating-point exceptions. Then mask all floating //! point exceptions. inline void fstenv(const Mem& dst) { _emitInstruction(kX86InstFStEnv, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fstsw(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegCode(kX86RegAx)); _emitInstruction(kX86InstFStSw, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fstsw(const Mem& dst) { _emitInstruction(kX86InstFStSw, &dst); } //! @brief Subtract @a src from @a dst and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fsub(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFSub, &dst, &src); } //! @brief Subtract @a src from st(0) and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fsub(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8); _emitInstruction(kX86InstFSub, &src); } //! @brief Subtract st(0) from @a dst and POP register stack (FPU). inline void fsubp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFSubP, &dst); } //! @brief Reverse Subtract @a src from @a dst and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fsubr(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFSubR, &dst, &src); } //! @brief Reverse Subtract @a src from st(0) and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fsubr(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8); _emitInstruction(kX86InstFSubR, &src); } //! @brief Reverse Subtract st(0) from @a dst and POP register stack (FPU). inline void fsubrp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFSubRP, &dst); } //! @brief Floating point test - Compare st(0) with 0.0. (FPU). inline void ftst() { _emitInstruction(kX86InstFTst); } //! @brief Unordered Compare st(0) with @a reg (FPU). inline void fucom(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFUCom, ®); } //! @brief Unordered Compare st(0) and @a reg, check for ordered values //! and Set EFLAGS (FPU). inline void fucomi(const X87Reg& reg) { _emitInstruction(kX86InstFUComI, ®); } //! @brief UnorderedCompare st(0) and @a reg, Check for ordered values //! and Set EFLAGS and pop the stack (FPU). inline void fucomip(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFUComIP, ®); } //! @brief Unordered Compare st(0) with @a reg and pop register stack (FPU). inline void fucomp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFUComP, ®); } //! @brief Unordered compare st(0) with st(1) and pop register stack twice //! (FPU). inline void fucompp() { _emitInstruction(kX86InstFUComPP); } inline void fwait() { _emitInstruction(kX86InstFWait); } //! @brief Examine st(0) (FPU). //! //! Examines the contents of the ST(0) register and sets the condition code //! flags C0, C2, and C3 in the FPU status word to indicate the class of //! value or number in the register. inline void fxam() { _emitInstruction(kX86InstFXam); } //! @brief Exchange Register Contents (FPU). //! //! Exchange content of st(0) with @a reg. inline void fxch(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFXch, ®); } //! @brief Restore FP And MMX(tm) State And Streaming SIMD Extension State //! (FPU, MMX, SSE). //! //! Load FP and MMX(tm) technology and Streaming SIMD Extension state from //! src (512 bytes). inline void fxrstor(const Mem& src) { _emitInstruction(kX86InstFXRstor, &src); } //! @brief Store FP and MMX(tm) State and Streaming SIMD Extension State //! (FPU, MMX, SSE). //! //! Store FP and MMX(tm) technology state and Streaming SIMD Extension state //! to dst (512 bytes). inline void fxsave(const Mem& dst) { _emitInstruction(kX86InstFXSave, &dst); } //! @brief Extract Exponent and Significand (FPU). //! //! Separate value in st(0) into exponent and significand, store exponent //! in st(0), and push the significand onto the register stack. inline void fxtract() { _emitInstruction(kX86InstFXtract); } //! @brief Compute y * log2(x). //! //! Replace st(1) with (st(1) * log2st(0)) and pop the register stack. inline void fyl2x() { _emitInstruction(kX86InstFYL2X); } //! @brief Compute y * log_2(x+1). //! //! Replace st(1) with (st(1) * (log2st(0) + 1.0)) and pop the register stack. inline void fyl2xp1() { _emitInstruction(kX86InstFYL2XP1); } // -------------------------------------------------------------------------- // [MMX] // -------------------------------------------------------------------------- //! @brief Empty MMX state. inline void emms() { _emitInstruction(kX86InstEmms); } //! @brief Move DWord (MMX). inline void movd(const Mem& dst, const MmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const GpReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const Mem& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const GpReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Move QWord (MMX). inline void movq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const MmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } // ------------------------------------------------------------------------- // [3dNow] // ------------------------------------------------------------------------- //! @brief Faster EMMS (3dNow!). //! //! @note Use only for early AMD processors where is only 3dNow! or SSE. If //! CPU contains SSE2, it's better to use @c emms() ( @c femms() is mapped //! to @c emms() ). inline void femms() { _emitInstruction(kX86InstFEmms); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE] // -------------------------------------------------------------------------- //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmReg& dst, const MmReg& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Load Streaming SIMD Extension Control/Status (SSE). inline void ldmxcsr(const Mem& src) { _emitInstruction(kX86InstLdMXCSR, &src); } //! @brief Byte Mask Write (SSE). //! //! @note The default memory location is specified by DS:EDI. inline void maskmovq(const MmReg& data, const MmReg& mask) { _emitInstruction(kX86InstMaskMovQ, &data, &mask); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move DWord. inline void movd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move QWord (SSE). inline void movq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move 64 Bits Non Temporal (SSE). inline void movntq(const Mem& dst, const MmReg& src) { _emitInstruction(kX86InstMovNTQ, &dst, &src); } //! @brief High to Low Packed SP-FP (SSE). inline void movhlps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovHLPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move Low to High Packed SP-FP (SSE). inline void movlhps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovLHPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Aligned Four Packed SP-FP Non Temporal (SSE). inline void movntps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovNTPS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Extract Word (SSE). inline void pextrw(const GpReg& dst, const MmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask To Integer (SSE). inline void pmovmskb(const GpReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmReg& dst, const MmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Prefetch (SSE). inline void prefetch(const Mem& mem, const Imm& hint) { _emitInstruction(kX86InstPrefetch, &mem, &hint); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store fence (SSE). inline void sfence() { _emitInstruction(kX86InstSFence); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store Streaming SIMD Extension Control/Status (SSE). inline void stmxcsr(const Mem& dst) { _emitInstruction(kX86InstStMXCSR, &dst); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } // -------------------------------------------------------------------------- // [SSE2] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Flush Cache Line (SSE2). inline void clflush(const Mem& mem) { _emitInstruction(kX86InstClFlush, &mem); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmReg& dst, const MmReg& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Load Fence (SSE2). inline void lfence() { _emitInstruction(kX86InstLFence); } //! @brief Store Selected Bytes of Double Quadword (SSE2). //! //! @note Target is DS:EDI. inline void maskmovdqu(const XmmReg& src, const XmmReg& mask) { _emitInstruction(kX86InstMaskMovDQU, &src, &mask); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Memory Fence (SSE2). inline void mfence() { _emitInstruction(kX86InstMFence); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Extract Packed SP-FP Sign Mask (SSE2). inline void movmskps(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovMskPS, &dst, &src); } //! @brief Extract Packed DP-FP Sign Mask (SSE2). inline void movmskpd(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovMskPD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Quadword from XMM to MMX Technology Register (SSE2). inline void movdq2q(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQ2Q, &dst, &src); } //! @brief Move Quadword from MMX Technology to XMM Register (SSE2). inline void movq2dq(const XmmReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ2DQ, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Store Double Quadword Using Non-Temporal Hint (SSE2). inline void movntdq(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovNTDQ, &dst, &src); } //! @brief Store Store DWORD Using Non-Temporal Hint (SSE2). inline void movnti(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstMovNTI, &dst, &src); } //! @brief Store Packed Double-Precision FP Values Using Non-Temporal Hint (SSE2). inline void movntpd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovNTPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Spin Loop Hint (SSE2). inline void pause() { _emitInstruction(kX86InstPause); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask (SSE2). inline void pmovmskb(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslldq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllDQ, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief DQWord Shift Right Logical (MMX). inline void psrldq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlDQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE3] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } //! @brief Store Integer with Truncation (SSE3). inline void fisttp(const Mem& dst) { _emitInstruction(kX86InstFISttP, &dst); } //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Load Unaligned Integer 128 Bits (SSE3). inline void lddqu(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstLdDQU, &dst, &src); } //! @brief Set Up Monitor Address (SSE3). inline void monitor() { _emitInstruction(kX86InstMonitor); } //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } //! @brief Monitor Wait (SSE3). inline void mwait() { _emitInstruction(kX86InstMWait); } // -------------------------------------------------------------------------- // [SSSE3] // -------------------------------------------------------------------------- //! @brief Packed SIGN (SSSE3). inline void psignb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmReg& dst, const MmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.1] // -------------------------------------------------------------------------- //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Load Double Quadword Non-Temporal Aligned Hint (SSE4.1). inline void movntdqa(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovNTDQA, &dst, &src); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Extract Word (SSE4.1). inline void pextrw(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Extract Word (SSE4.1). inline void pextrw(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmReg& op1, const XmmReg& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmReg& op1, const Mem& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.2] // -------------------------------------------------------------------------- //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq)); _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq)); _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(!dst.isGpb()); ASMJIT_ASSERT(src.getRegType() == dst.getRegType()); _emitInstruction(kX86InstPopCnt, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstPopCnt, &dst, &src); } // ------------------------------------------------------------------------- // [AMD only] // ------------------------------------------------------------------------- //! @brief Prefetch (3dNow - Amd). //! //! Loads the entire 64-byte aligned memory sequence containing the //! specified memory address into the L1 data cache. The position of //! the specified memory address within the 64-byte cache line is //! irrelevant. If a cache hit occurs, or if a memory fault is detected, //! no bus cycle is initiated and the instruction is treated as a NOP. inline void amd_prefetch(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetch, &mem); } //! @brief Prefetch and set cache to modified (3dNow - Amd). //! //! The PREFETCHW instruction loads the prefetched line and sets the //! cache-line state to Modified, in anticipation of subsequent data //! writes to the line. The PREFETCH instruction, by contrast, typically //! sets the cache-line state to Exclusive (depending on the hardware //! implementation). inline void amd_prefetchw(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetchW, &mem); } // ------------------------------------------------------------------------- // [Intel only] // ------------------------------------------------------------------------- //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const Mem& dst, const GpReg& src) { ASMJIT_ASSERT(!src.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } // ------------------------------------------------------------------------- // [Emit Options] // ------------------------------------------------------------------------- //! @brief Assert LOCK# Signal Prefix. //! //! This instruction causes the processor's LOCK# signal to be asserted //! during execution of the accompanying instruction (turns the //! instruction into an atomic instruction). In a multiprocessor environment, //! the LOCK# signal insures that the processor has exclusive use of any shared //! memory while the signal is asserted. //! //! The LOCK prefix can be prepended only to the following instructions and //! to those forms of the instructions that use a memory operand: ADD, ADC, //! AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, //! and XCHG. An undefined opcode exception will be generated if the LOCK //! prefix is used with any other instruction. The XCHG instruction always //! asserts the LOCK# signal regardless of the presence or absence of the LOCK //! prefix. //! //! @sa @c kX86EmitOptionLock. inline void lock() { _emitOptions |= kX86EmitOptionLock; } //! @brief Force REX prefix to be emitted. //! //! This option should be used carefully, because there are unencodable //! combinations. If you want to access ah, bh, ch or dh registers then you //! can't emit REX prefix and it will cause an illegal instruction error. //! //! @note REX prefix is only valid for X64/AMD64 platform. //! //! @sa @c kX86EmitOptionRex. inline void rex() { _emitOptions |= kX86EmitOptionRex; } }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86ASSEMBLER_H desmume-0.9.11/src/utils/AsmJit/x86/x86compiler.h0000755000000000000000000076301012467662066020064 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILER_H #define _ASMJIT_X86_X86COMPILER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/compiler.h" #include "../core/compilercontext.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../x86/x86assembler.h" #include "../x86/x86defs.h" #include "../x86/x86func.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" //! @internal //! //! @brief Mark methods not supported by @ref Compiler. These methods are //! usually used only in function prologs/epilogs or to manage stack. #define ASMJIT_NOT_SUPPORTED_BY_COMPILER 0 namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [Forward Declarations] // ============================================================================ struct X86Compiler; struct X86CompilerAlign; struct X86CompilerContext; struct X86CompilerFuncCall; struct X86CompilerFuncDecl; struct X86CompilerFuncEnd; struct X86CompilerInst; struct X86CompilerJmpInst; struct X86CompilerState; struct X86CompilerTarget; struct X86CompilerVar; // ============================================================================ // [AsmJit::X86CompilerVar] // ============================================================================ //! @brief @ref X86Compiler variable. struct X86CompilerVar : public CompilerVar { // -------------------------------------------------------------------------- // [AsVar] // -------------------------------------------------------------------------- inline GpVar asGpVar() const { GpVar var; var._var.id = _id; var._var.size = _size; var._var.regCode = x86VarInfo[_type].getCode(); var._var.varType = _type; return var; } inline MmVar asMmVar() const { MmVar var; var._var.id = _id; var._var.size = _size; var._var.regCode = x86VarInfo[_type].getCode(); var._var.varType = _type; return var; } inline XmmVar asXmmVar() const { XmmVar var; var._var.id = _id; var._var.size = _size; var._var.regCode = x86VarInfo[_type].getCode(); var._var.varType = _type; return var; } // -------------------------------------------------------------------------- // [Members - Scope] // -------------------------------------------------------------------------- //! @brief The first item where the variable is accessed. //! @note If this member is @c NULL then variable isn't used. CompilerItem* firstItem; //! @brief The last item where the variable is accessed. CompilerItem* lastItem; //! @brief Scope (NULL if variable is global). X86CompilerFuncDecl* funcScope; //! @brief The first call which is after the @c firstItem. X86CompilerFuncCall* funcCall; // -------------------------------------------------------------------------- // [Members - Home] // -------------------------------------------------------------------------- //! @brief Home register index or @c kRegIndexInvalid (used by register allocator). uint32_t homeRegisterIndex; //! @brief Preferred registers mask. uint32_t prefRegisterMask; //! @brief Home memory address offset. int32_t homeMemoryOffset; //! @brief Used by @c CompilerContext, do not touch (initially NULL). void* homeMemoryData; // -------------------------------------------------------------------------- // [Members - Actual] // -------------------------------------------------------------------------- //! @brief Actual register index (connected with actual @c X86CompilerState). uint32_t regIndex; //! @brief Actual working offset. This member is set before register allocator //! is called. If workOffset is same as CompilerContext::_currentOffset then //! this variable is probably used in next instruction and can't be spilled. uint32_t workOffset; //! @brief Next active variable in circular double-linked list. X86CompilerVar* nextActive; //! @brief Previous active variable in circular double-linked list. X86CompilerVar* prevActive; // -------------------------------------------------------------------------- // [Members - Flags] // -------------------------------------------------------------------------- //! @brief Variable state (connected with actual @c X86CompilerState). uint8_t state; //! @brief Whether variable was changed (connected with actual @c X86CompilerState). uint8_t changed; //! @brief Save on unuse (at end of the variable scope). uint8_t saveOnUnuse; // -------------------------------------------------------------------------- // [Members - Statistics] // -------------------------------------------------------------------------- //! @brief Register read access statistics. uint32_t regReadCount; //! @brief Register write access statistics. uint32_t regWriteCount; //! @brief Register read/write access statistics (related to a single instruction). uint32_t regRwCount; //! @brief Register GpbLo access statistics. uint32_t regGpbLoCount; //! @brief Register GpbHi access statistics. uint32_t regGpbHiCount; //! @brief Memory read statistics. uint32_t memReadCount; //! @brief Memory write statistics. uint32_t memWriteCount; //! @brief Memory read+write statistics. uint32_t memRwCount; // -------------------------------------------------------------------------- // [Members - Temporary] // -------------------------------------------------------------------------- //! @brief Temporary data that can be used in prepare/translate stage. //! //! Initial value is NULL and it's expected that after use it's set back to //! NULL. //! //! The temporary data is designed to be used by algorithms that need to //! set some state into variables, do something and then clean-up. See //! state switch and function call for details. union { void* tPtr; intptr_t tInt; }; }; // ============================================================================ // [AsmJit::X86CompilerState] // ============================================================================ //! @brief @ref X86Compiler state. struct X86CompilerState : CompilerState { enum { //! @brief Base for Gp registers. kStateRegGpBase = 0, //! @brief Base for Mm registers. kStateRegMmBase = 16, //! @brief Base for Xmm registers. kStateRegXmmBase = 24, //! @brief Count of all registers in @ref X86CompilerState. kStateRegCount = 16 + 8 + 16 }; // -------------------------------------------------------------------------- // [Clear] // -------------------------------------------------------------------------- inline void clear() { memset(this, 0, sizeof(*this)); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- union { //! @brief All allocated variables in one array. X86CompilerVar* regs[kStateRegCount]; struct { //! @brief Allocated GP registers. X86CompilerVar* gp[16]; //! @brief Allocated MM registers. X86CompilerVar* mm[8]; //! @brief Allocated XMM registers. X86CompilerVar* xmm[16]; }; }; //! @brief Used GP registers bit-mask. uint32_t usedGP; //! @brief Used MM registers bit-mask. uint32_t usedMM; //! @brief Used XMM registers bit-mask. uint32_t usedXMM; //! @brief Changed GP registers bit-mask. uint32_t changedGP; //! @brief Changed MM registers bit-mask. uint32_t changedMM; //! @brief Changed XMM registers bit-mask. uint32_t changedXMM; //! @brief Count of variables in @c memVarsData. uint32_t memVarsCount; //! @brief Variables stored in memory (@c kVarStateMem). //! //! When saving / restoring state it's important to keep registers which are //! still in memory. Register is always unused when it is going out-of-scope. //! All variables which are not here are unused (@c kVarStateUnused). X86CompilerVar* memVarsData[1]; }; // ============================================================================ // [AsmJit::VarMemBlock] // ============================================================================ struct VarMemBlock { int32_t offset; uint32_t size; VarMemBlock* nextUsed; VarMemBlock* nextFree; }; // ============================================================================ // [AsmJit::VarAllocRecord] // ============================================================================ //! @brief Variable alloc record (for each instruction that uses variables). //! //! Variable record contains pointer to variable data and register allocation //! flags. These flags are important to determine the best alloc instruction. struct VarAllocRecord { //! @brief Variable data (the structure owned by @c Compiler). X86CompilerVar* vdata; //! @brief Variable alloc flags, see @c kVarAllocFlags. uint32_t vflags; //! @brief Register mask (default is 0). uint32_t regMask; }; // ============================================================================ // [AsmJit::VarCallRecord] // ============================================================================ //! @brief Variable call-fn record (for each callable that uses variables). //! //! This record contains variables that are used to call a function (using //! @c X86CompilerFuncCall item). Each variable contains the registers where //! it must be and registers where the value will be returned. struct VarCallRecord { //! @brief Variable data (the structure owned by @c Compiler). X86CompilerVar* vdata; uint32_t flags; uint8_t inCount; uint8_t inDone; uint8_t outCount; uint8_t outDone; enum FLAGS { kFlagInGp = 0x0001, kFlagInMm = 0x0002, kFlagInXmm = 0x0004, kFlagInStack = 0x0008, kFlagOutEax = 0x0010, kFlagOutEdx = 0x0020, kFlagOutSt0 = 0x0040, kFlagOutSt1 = 0x0080, kFlagOutMm0 = 0x0100, kFlagOutXmm0 = 0x0400, kFlagOutXmm1 = 0x0800, kFlagInMemPtr = 0x1000, kFlagCallReg = 0x2000, kFlagCallMem = 0x4000, kFlagUnuseAfterUse = 0x8000 }; }; // ============================================================================ // [AsmJit::VarHintRecord] // ============================================================================ struct VarHintRecord { X86CompilerVar* vdata; uint32_t hint; }; // ============================================================================ // [AsmJit::ForwardJumpData] // ============================================================================ struct ForwardJumpData { X86CompilerJmpInst* inst; X86CompilerState* state; ForwardJumpData* next; }; // ============================================================================ // [AsmJit::CompilerUtil] // ============================================================================ //! @brief Static class that contains utility methods. struct CompilerUtil { ASMJIT_API static bool isStack16ByteAligned(); }; // ============================================================================ // [AsmJit::X86Compiler] // ============================================================================ //! @brief Compiler - high level code generation. //! //! This class is used to store instruction stream and allows to modify //! it on the fly. It uses different concept than @c AsmJit::Assembler class //! and in fact @c AsmJit::Assembler is only used as a backend. Compiler never //! emits machine code and each instruction you use is stored to instruction //! array instead. This allows to modify instruction stream later and for //! example to reorder instructions to make better performance. //! //! Using @c AsmJit::Compiler moves code generation to higher level. Higher //! level constructs allows to write more abstract and extensible code that //! is not possible with pure @c AsmJit::Assembler class. Because //! @c AsmJit::Compiler needs to create many objects and lifetime of these //! objects is small (same as @c AsmJit::Compiler lifetime itself) it uses //! very fast memory management model. This model allows to create object //! instances in nearly zero time (compared to @c malloc() or @c new() //! operators) so overhead by creating machine code by @c AsmJit::Compiler //! is minimized. //! //! @section AsmJit_Compiler_TheStory The Story //! //! Before telling you how Compiler works I'd like to write a story. I'd like //! to cover reasons why this class was created and why I'm recommending to use //! it. When I released the first version of AsmJit (0.1) it was a toy. The //! first function I wrote was function which is still available as testjit and //! which simply returns 1024. The reason why function works for both 32-bit/ //! 64-bit mode and for Windows/Unix specific calling conventions is luck, no //! arguments usage and no registers usage except returning value in EAX/RAX. //! //! Then I started a project called BlitJit which was targetted to generating //! JIT code for computer graphics. After writing some lines I decided that I //! can't join pieces of code together without abstraction, should be //! pixels source pointer in ESI/RSI or EDI/RDI or it's completelly //! irrellevant? What about destination pointer and SSE2 register for reading //! input pixels? The simple answer might be "just pick some one and use it". //! //! Another reason for abstraction is function calling-conventions. It's really //! not easy to write assembler code for 32-bit and 64-bit platform supporting //! three calling conventions (32-bit is similar between Windows and Unix, but //! 64-bit calling conventions are different). //! //! At this time I realized that I can't write code which uses named registers, //! I need to abstract it. In most cases you don't need specific register, you //! need to emit instruction that does something with 'virtual' register(s), //! memory, immediate or label. //! //! The first version of AsmJit with Compiler was 0.5 (or 0.6?, can't remember). //! There was support for 32-bit and 64-bit mode, function calling conventions, //! but when emitting instructions the developer needed to decide which //! registers are changed, which are only read or completely overwritten. This //! model helped a lot when generating code, especially when joining more //! code-sections together, but there was also small possibility for mistakes. //! Simply the first version of Compiler was great improvement over low-level //! Assembler class, but the API design wasn't perfect. //! //! The second version of Compiler, completelly rewritten and based on //! different goals, is part of AsmJit starting at version 1.0. This version //! was designed after the first one and it contains serious improvements over //! the old one. The first improvement is that you just use instructions with //! virtual registers - called variables. When using compiler there is no way //! to use native registers, there are variables instead. AsmJit is smarter //! than before and it knows which register is needed only for read (r), //! read/write (w) or overwrite (x). Supported are also instructions which //! are using some registers in implicit way (these registers are not part of //! instruction definition in string form). For example to use CPUID instruction //! you must give it four variables which will be automatically allocated to //! input/output registers (EAX, EBX, ECX, EDX). //! //! Another improvement is algorithm used by a register allocator. In first //! version the registers were allocated when creating instruction stream. In //! new version registers are allocated after calling @c Compiler::make(). This //! means that register allocator has information about scope of all variables //! and their usage statistics. The algorithm to allocate registers is very //! simple and it's always called as a 'linear scan register allocator'. When //! you get out of registers the all possible variables are scored and the worst //! is spilled. Of course algorithm ignores the variables used for current //! instruction. //! //! In addition, because registers are allocated after the code stream is //! generated, the state switches between jumps are handled by Compiler too. //! You don't need to worry about jumps, compiler always do this dirty work //! for you. //! //! The nearly last thing I'd like to present is calling other functions from //! the generated code. AsmJit uses a @c FunctionPrototype class to hold //! the function parameters, their position in stack (or register index) and //! function return value. This class is used internally, but it can be //! used to create your own function calling-convention. All standard function //! calling conventions are implemented. //! //! Please enjoy the new version of Compiler, it was created for writing a //! low-level code using high-level API, leaving developer to concentrate to //! real problems and not to solving a register puzzle. //! //! @section AsmJit_Compiler_CodeGeneration Code Generation //! //! First that is needed to know about compiler is that compiler never emits //! machine code. It's used as a middleware between @c AsmJit::Assembler and //! your code. There is also convenience method @c make() that allows to //! generate machine code directly without creating @c AsmJit::Assembler //! instance. //! //! Comparison of generating machine code through @c Assembler and directly //! by @c Compiler: //! //! @code //! // Assembler instance is low level code generation class that emits //! // machine code. //! X86Assembler a; //! //! // Compiler instance is high level code generation class that stores all //! // instructions in internal representation. //! X86Compiler c; //! //! // ... put your code here ... //! //! // Final step - generate code. AsmJit::Compiler::serialize() will serialize //! // all instructions into Assembler and this ensures generating real machine //! // code. //! c.serialize(a); //! //! // Your function //! void* fn = a.make(); //! @endcode //! //! Example how to generate machine code using only @c Compiler (preferred): //! //! @code //! // Compiler instance is enough. //! X86Compiler c; //! //! // ... put your code here ... //! //! // Your function //! void* fn = c.make(); //! @endcode //! //! You can see that there is @c AsmJit::Compiler::serialize() function that //! emits instructions into @c AsmJit::Assembler(). This layered architecture //! means that each class is used for something different and there is no code //! duplication. For convenience there is also @c AsmJit::Compiler::make() //! method that can create your function using @c AsmJit::Assembler, but //! internally (this is preffered bahavior when using @c AsmJit::Compiler). //! //! The @c make() method allocates memory using @c Context instance passed //! into the @c X86Compiler constructor. If code generator is used to create JIT //! function then virtual memory allocated by @c MemoryManager is used. To get //! global memory manager use @c MemoryManager::getGlobal(). //! //! @code //! // Compiler instance is enough. //! X86Compiler c; //! //! // ... put your code using Compiler instance ... //! //! // Your function //! void* fn = c.make(); //! //! // Free it if you don't want it anymore //! // (using global memory manager instance) //! MemoryManager::getGlobal()->free(fn); //! @endcode //! //! @section AsmJit_Compiler_Functions Functions //! //! To build functions with @c Compiler, see @c AsmJit::Compiler::newFunc() //! method. //! //! @section AsmJit_Compiler_Variables Variables //! //! Compiler is able to manage variables and function arguments. Internally //! there is no difference between function argument and variable declared //! inside. To get function argument you use @c getGpArg() method and to declare //! variable use @c newGpVar(), @c newMmVar() and @c newXmmVar() methods. The @c newXXX() //! methods accept also parameter describing the variable type. For example //! the @c newGpVar() method always creates variable which size matches the target //! architecture size (for 32-bit target the 32-bit variable is created, for //! 64-bit target the variable size is 64-bit). To override this behavior the //! variable type must be specified. //! //! @code //! // Compiler and function declaration - void f(int*); //! X86Compiler c; //! c.newFunc(kX86FuncConvDefault, BuildFunction1()); //! //! // Get argument variable (it's pointer). //! GpVar a1(c.getGpArg(0)); //! //! // Create your variables. //! GpVar x1(c.newGpVar(kX86VarTypeGpd)); //! GpVar x2(c.newGpVar(kX86VarTypeGpd)); //! //! // Init your variables. //! c.mov(x1, 1); //! c.mov(x2, 2); //! //! // ... your code ... //! c.add(x1, x2); //! // ... your code ... //! //! // Store result to a given pointer in first argument //! c.mov(dword_ptr(a1), x1); //! //! // End of function body. //! c.endFunc(); //! //! // Make the function. //! typedef void (*MyFn)(int*); //! MyFn fn = asmjit_cast(c.make()); //! @endcode //! //! This code snipped needs to be explained. You can see that there are more //! variable types that can be used by @c Compiler. Most useful variables can //! be allocated using general purpose registers (@c GpVar), MMX registers //! (@c MmVar) or SSE registers (@c XmmVar). //! //! X86/X64 variable types: //! //! - @c kX86VarTypeGpd - 32-bit general purpose register (EAX, EBX, ...). //! - @c kX86VarTypeGpq - 64-bit general purpose register (RAX, RBX, ...). //! - @c kX86VarTypeGpz - 32-bit or 64-bit general purpose register, depends //! to target architecture. Mapped to @c kX86VarTypeGpd or @c kX86VarTypeGpq. //! //! - @c kX86VarTypeX87 - 80-bit floating point stack register st(0 to 7). //! - @c kX86VarTypeX87SS - 32-bit floating point stack register st(0 to 7). //! - @c kX86VarTypeX87SD - 64-bit floating point stack register st(0 to 7). //! //! - @c VARIALBE_TYPE_MM - 64-bit MMX register. //! //! - @c kX86VarTypeXmm - 128-bit SSE register. //! - @c kX86VarTypeXmmSS - 128-bit SSE register which contains //! scalar 32-bit single precision floating point. //! - @c kX86VarTypeXmmSD - 128-bit SSE register which contains //! scalar 64-bit double precision floating point. //! - @c kX86VarTypeXmmPS - 128-bit SSE register which contains //! 4 packed 32-bit single precision floating points. //! - @c kX86VarTypeXmmPD - 128-bit SSE register which contains //! 2 packed 64-bit double precision floating points. //! //! Unified variable types: //! //! - @c kX86VarTypeInt32 - 32-bit general purpose register. //! - @c kX86VarTypeInt64 - 64-bit general purpose register. //! - @c kX86VarTypeIntPtr - 32-bit or 64-bit general purpose register / pointer. //! //! - @c kX86VarTypeFloat - 32-bit single precision floating point. //! - @c kX86VarTypeDouble - 64-bit double precision floating point. //! //! Variable states: //! //! - @c kVarStateUnused - State that is assigned to newly created //! variables or to not used variables (dereferenced to zero). //! - @c kVarStateReg - State that means that variable is currently //! allocated in register. //! - @c kVarStateMem - State that means that variable is currently //! only in memory location. //! //! When you create new variable, initial state is always @c kVarStateUnused, //! allocating it to register or spilling to memory changes this state to //! @c kVarStateReg or @c kVarStateMem, respectively. //! During variable lifetime it's usual that its state is changed multiple //! times. To generate better code, you can control allocating and spilling //! by using up to four types of methods that allows it (see next list). //! //! Explicit variable allocating / spilling methods: //! //! - @c Compiler::alloc() - Explicit method to alloc variable into //! register. You can use this before loops or code blocks. //! //! - @c Compiler::spill() - Explicit method to spill variable. If variable //! is in register and you call this method, it's moved to its home memory //! location. If variable is not in register no operation is performed. //! //! - @c Compiler::unuse() - Unuse variable (you can use this to end the //! variable scope or sub-scope). //! //! Please see AsmJit tutorials (testcompiler.cpp and testvariables.cpp) for //! more complete examples. //! //! @section AsmJit_Compiler_MemoryManagement Memory Management //! //! @c Compiler Memory management follows these rules: //! - Everything created by @c Compiler is always freed by @c Compiler. //! - To get decent performance, compiler always uses larger memory buffer //! for objects to allocate and when compiler instance is destroyed, this //! buffer is freed. Destructors of active objects are called when //! destroying compiler instance. Destructors of abadonded compiler //! objects are called immediately after abadonding them. //! - This type of memory management is called 'zone memory management'. //! //! This means that you can't use any @c Compiler object after destructing it, //! it also means that each object like @c Label, @c Var and others are created //! and managed by @c Compiler itself. These objects contain ID which is used //! internally by Compiler to store additional information about these objects. //! //! @section AsmJit_Compiler_StateManagement Control-Flow and State Management. //! //! The @c Compiler automatically manages state of the variables when using //! control flow instructions like jumps, conditional jumps and calls. There //! is minimal heuristics for choosing the method how state is saved or restored. //! //! Generally the state can be changed only when using jump or conditional jump //! instruction. When using non-conditional jump then state change is embedded //! into the instruction stream before the jump. When using conditional jump //! the @c Compiler decides whether to restore state before the jump or whether //! to use another block where state is restored. The last case is that no-code //! have to be emitted and there is no state change (this is of course ideal). //! //! Choosing whether to embed 'restore-state' section before conditional jump //! is quite simple. If jump is likely to be 'taken' then code is embedded, if //! jump is unlikely to be taken then the small code section for state-switch //! will be generated instead. //! //! Next example is the situation where the extended code block is used to //! do state-change: //! //! @code //! X86Compiler c; //! //! c.newFunc(kX86FuncConvDefault, FuncBuilder0()); //! c.getFunc()->setHint(kFuncHintNaked, true); //! //! // Labels. //! Label L0 = c.newLabel(); //! //! // Variables. //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! // Cleanup. After these two lines, the var0 and var1 will be always stored //! // in registers. Our example is very small, but in larger code the var0 can //! // be spilled by xor(var1, var1). //! c.xor_(var0, var0); //! c.xor_(var1, var1); //! c.cmp(var0, var1); //! // State: //! // var0 - register. //! // var1 - register. //! //! // We manually spill these variables. //! c.spill(var0); //! c.spill(var1); //! // State: //! // var0 - memory. //! // var1 - memory. //! //! // Conditional jump to L0. It will be always taken, but compiler thinks that //! // it is unlikely taken so it will embed state change code somewhere. //! c.je(L0); //! //! // Do something. The variables var0 and var1 will be allocated again. //! c.add(var0, 1); //! c.add(var1, 2); //! // State: //! // var0 - register. //! // var1 - register. //! //! // Bind label here, the state is not changed. //! c.bind(L0); //! // State: //! // var0 - register. //! // var1 - register. //! //! // We need to use var0 and var1, because if compiler detects that variables //! // are out of scope then it optimizes the state-change. //! c.sub(var0, var1); //! // State: //! // var0 - register. //! // var1 - register. //! //! c.endFunc(); //! @endcode //! //! The output: //! //! @verbatim //! xor eax, eax ; xor var_0, var_0 //! xor ecx, ecx ; xor var_1, var_1 //! cmp eax, ecx ; cmp var_0, var_1 //! mov [esp - 24], eax ; spill var_0 //! mov [esp - 28], ecx ; spill var_1 //! je L0_Switch //! mov eax, [esp - 24] ; alloc var_0 //! add eax, 1 ; add var_0, 1 //! mov ecx, [esp - 28] ; alloc var_1 //! add ecx, 2 ; add var_1, 2 //! L0: //! sub eax, ecx ; sub var_0, var_1 //! ret //! //! ; state-switch begin //! L0_Switch0: //! mov eax, [esp - 24] ; alloc var_0 //! mov ecx, [esp - 28] ; alloc var_1 //! jmp short L0 //! ; state-switch end //! @endverbatim //! //! You can see that the state-switch section was generated (see L0_Switch0). //! The compiler is unable to restore state immediately when emitting the //! forward jump (the code is generated from first to last instruction and //! the target state is simply not known at this time). //! //! To tell @c Compiler that you want to embed state-switch code before jump //! it's needed to create backward jump (where also processor expects that it //! will be taken). To demonstrate the possibility to embed state-switch before //! jump we use slightly modified code: //! //! @code //! X86Compiler c; //! //! c.newFunc(kX86FuncConvDefault, FuncBuilder0()); //! c.getFunc()->setHint(kFuncHintNaked, true); //! //! // Labels. //! Label L0 = c.newLabel(); //! //! // Variables. //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! // Cleanup. After these two lines, the var0 and var1 will be always stored //! // in registers. Our example is very small, but in larger code the var0 can //! // be spilled by xor(var1, var1). //! c.xor_(var0, var0); //! c.xor_(var1, var1); //! // State: //! // var0 - register. //! // var1 - register. //! //! // We manually spill these variables. //! c.spill(var0); //! c.spill(var1); //! // State: //! // var0 - memory. //! // var1 - memory. //! //! // Bind our label here. //! c.bind(L0); //! //! // Do something, the variables will be allocated again. //! c.add(var0, 1); //! c.add(var1, 2); //! // State: //! // var0 - register. //! // var1 - register. //! //! // Backward conditional jump to L0. The default behavior is that it is taken //! // so state-change code will be embedded here. //! c.je(L0); //! //! c.endFunc(); //! @endcode //! //! The output: //! //! @verbatim //! xor ecx, ecx ; xor var_0, var_0 //! xor edx, edx ; xor var_1, var_1 //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! L.2: //! mov ecx, [esp - 24] ; alloc var_0 //! add ecx, 1 ; add var_0, 1 //! mov edx, [esp - 28] ; alloc var_1 //! add edx, 2 ; add var_1, 2 //! //! ; state-switch begin //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! ; state-switch end //! //! je short L.2 //! ret //! @endverbatim //! //! Please notice where the state-switch section is located. The @c Compiler //! decided that jump is likely to be taken so the state change is embedded //! before the conditional jump. To change this behavior into the previous //! case it's needed to add a hint (@c kCondHintLikely or @c kCondHintUnlikely). //! //! Replacing the c.je(L0) by c.je(L0, kCondHintUnlikely) //! will generate code like this: //! //! @verbatim //! xor ecx, ecx ; xor var_0, var_0 //! xor edx, edx ; xor var_1, var_1 //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! L0: //! mov ecx, [esp - 24] ; alloc var_0 //! add ecx, 1 ; add var_0, a //! mov edx, [esp - 28] ; alloc var_1 //! add edx, 2 ; add var_1, 2 //! je L0_Switch, 2 //! ret //! //! ; state-switch begin //! L0_Switch: //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! jmp short L0 //! ; state-switch end //! @endverbatim //! //! This section provided information about how state-change works. The //! behavior is deterministic and it can be overridden. //! //! @section AsmJit_Compiler_AdvancedCodeGeneration Advanced Code Generation //! //! This section describes advanced method of code generation available to //! @c Compiler (but also to @c Assembler). When emitting code to instruction //! stream the methods like @c mov(), @c add(), @c sub() can be called directly //! (advantage is static-type control performed also by C++ compiler) or //! indirectly using @c emit() method. The @c emit() method needs only //! instruction code and operands. //! //! Example of code generating by standard type-safe API: //! //! @code //! X86Compiler c; //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! ... //! //! c.mov(var0, imm(0)); //! c.add(var0, var1); //! c.sub(var0, var1); //! @endcode //! //! The code above can be rewritten as: //! //! @code //! X86Compiler c; //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! ... //! //! c.emit(kX86InstMov, var0, imm(0)); //! c.emit(kX86InstAdd, var0, var1); //! c.emit(kX86InstSub, var0, var1); //! @endcode //! //! The advantage of first snippet is very friendly API and type-safe control //! that is controlled by the C++ compiler. The advantage of second snippet is //! availability to replace or generate instruction code in different places. //! See the next example how the @c emit() method can be used to generate //! abstract code. //! //! Use case: //! //! @code //! bool emitArithmetic(Compiler& c, XmmVar& var0, XmmVar& var1, const char* op) //! { //! uint code = kInstNone; //! //! if (strcmp(op, "ADD") == 0) //! code = kX86InstAddSS; //! else if (strcmp(op, "SUBTRACT") == 0) //! code = kX86InstSubSS; //! else if (strcmp(op, "MULTIPLY") == 0) //! code = kX86InstMulSS; //! else if (strcmp(op, "DIVIDE") == 0) //! code = kX86InstDivSS; //! else //! // Invalid parameter? //! return false; //! //! c.emit(code, var0, var1); //! } //! @endcode //! //! Other use cases are waiting for you! Be sure that instruction you are //! emitting is correct and encodable, because if not, Assembler will set //! error code to @c kErrorUnknownInstruction. //! //! @section AsmJit_Compiler_CompilerDetails Compiler Details //! //! This section is here for people interested in the compiling process. There //! are few steps that must be done for each compiled function (or your code). //! //! When your @c Compiler instance is ready, you can create function and add //! compiler-items using intrinsics or higher level methods implemented by the //! @c AsmJit::Compiler. When you are done (all instructions serialized) you //! should call @c AsmJit::Compiler::make() method which will analyze your code, //! allocate registers and memory for local variables and serialize all items //! to @c AsmJit::Assembler instance. Next steps shows what's done internally //! before code is serialized into @c AsmJit::Assembler //! (implemented in @c AsmJit::Compiler::serialize() method). //! //! 1. Compiler try to match function and end-function items (these items //! define function body and blocks). //! //! 2. For all items inside the function-body the virtual functions //! are called in this order: //! - CompilerItem::prepare() //! - CompilerItem::translate() //! - CompilerItem::emit() //! - CompilerItem::post() //! //! There is some extra work when emitting function prolog / epilog and //! register allocator. //! //! 3. Emit jump tables data. //! //! When everything here ends, @c AsmJit::Assembler contains binary stream //! that needs only relocation to be callable by C/C++ code. //! //! @section AsmJit_Compiler_Differences Summary of Differences between @c Assembler and @c Compiler //! //! - Instructions are not translated to machine code immediately, they are //! stored as emmitables, see @c AsmJit::CompilerItem. //! - Contains function builder and ability to call other functions. //! - Contains register allocator and variable management. //! - Contains a lot of helper methods to simplify the code generation not //! available/possible in @c AsmJit::Assembler. //! - Ability to pre-process or post-process the code which is being generated. struct X86Compiler : public Compiler { // Special X86 instructions: // - cpuid, // - cbw, cwd, cwde, cdq, cdqe, cqo // - cmpxchg // - cmpxchg8b, cmpxchg16b, // - daa, das, // - imul, mul, idiv, div, // - mov_ptr // - lahf, sahf // - maskmovq, maskmovdqu // - enter, leave // - ret // - monitor, mwait // - pop, popad, popfd, popfq, // - push, pushad, pushfd, pushfq // - rcl, rcr, rol, ror, sal, sar, shl, shr // - shld, shrd // - rdtsc. rdtscp // - lodsb, lodsd, lodsq, lodsw // - movsb, movsd, movsq, movsw // - stosb, stosd, stosq, stosw // - cmpsb, cmpsd, cmpsq, cmpsw // - scasb, scasd, scasq, scasw // // Special X87 instructions: // - fisttp // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @ref X86Compiler instance. ASMJIT_API X86Compiler(Context* context = JitContext::getGlobal()); //! @brief Destroy the @ref X86Compiler instance. ASMJIT_API ~X86Compiler(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get current function as @ref X86CompilerFuncDecl. //! //! This method can be called within @c newFunc() and @c endFunc() //! block to get current function you are working with. It's recommended //! to store @c AsmJit::Function pointer returned by @c newFunc<> method, //! because this allows you in future implement function sections outside of //! function itself (yeah, this is possible!). inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Function Builder] // -------------------------------------------------------------------------- //! @brief Create a new function. //! //! @param cconv Calling convention to use (see @c kX86FuncConv enum) //! @param params Function arguments prototype. //! //! This method is usually used as a first step when generating functions //! by @c Compiler. First parameter @a cconv specifies function calling //! convention to use. Second parameter @a params specifies function //! arguments. To create function arguments are used templates //! @c BuildFunction0<>, @c BuildFunction1<...>, @c BuildFunction2<...>, //! etc... //! //! Templates with BuildFunction prefix are used to generate argument IDs //! based on real C++ types. See next example how to generate function with //! two 32-bit integer arguments. //! //! @code //! // Building function using AsmJit::Compiler example. //! //! // Compiler instance //! X86Compiler c; //! //! // Begin of function (also emits function @c Prolog) //! c.newFunc( //! // Default calling convention (32-bit cdecl or 64-bit for host OS) //! kX86FuncConvDefault, //! // Using function builder to generate arguments list //! BuildFunction2()); //! //! // End of function (also emits function @c Epilog) //! c.endFunc(); //! @endcode //! //! You can see that building functions is really easy. Previous code snipped //! will generate code for function with two 32-bit integer arguments. You //! can access arguments by @c AsmJit::Function::argument() method. Arguments //! are indexed from 0 (like everything in C). //! //! @code //! // Accessing function arguments through AsmJit::Function example. //! //! // Compiler instance //! X86Compiler c; //! //! // Begin of function (also emits function @c Prolog) //! c.newFunc( //! // Default calling convention (32-bit cdecl or 64-bit for host OS) //! kX86FuncConvDefault, //! // Using function builder to generate arguments list //! BuildFunction2()); //! //! // Arguments are like other variables, you need to reference them by //! // variable operands: //! GpVar a0 = c.getGpArg(0); //! GpVar a1 = c.getGpArg(1); //! //! // Use them. //! c.add(a0, a1); //! //! // End of function (emits function epilog and return) //! c.endFunc(); //! @endcode //! //! Arguments are like variables. How to manipulate with variables is //! documented in @c AsmJit::Compiler, variables section. //! //! @note To get current function use @c currentFunction() method or save //! pointer to @c AsmJit::Function returned by @c AsmJit::Compiler::newFunc<> //! method. Recommended is to save the pointer. //! //! @sa @c BuildFunction0, @c BuildFunction1, @c BuildFunction2, ... inline X86CompilerFuncDecl* newFunc(uint32_t convention, const FuncPrototype& func) { return newFunc_(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); } //! @brief Create a new function (low level version). //! //! @param cconv Function calling convention (see @c AsmJit::kX86FuncConv). //! @param args Function arguments (see @c AsmJit::kX86VarType). //! @param count Arguments count. //! //! This method is internally called from @c newFunc() method and //! contains arguments thats used internally by @c AsmJit::Compiler. //! //! @note To get current function use @c currentFunction() method. ASMJIT_API X86CompilerFuncDecl* newFunc_(uint32_t convenion, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); //! @brief End of current function scope and all variables. ASMJIT_API X86CompilerFuncDecl* endFunc(); // -------------------------------------------------------------------------- // [Emit] // -------------------------------------------------------------------------- //! @brief Emit instruction with no operand. ASMJIT_API void _emitInstruction(uint32_t code); //! @brief Emit instruction with one operand. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0); //! @brief Emit instruction with two operands. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1); //! @brief Emit instruction with three operands. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2); //! @brief Emit instruction with four operands (Special instructions). ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3); //! @brief Emit instruction with five operands (Special instructions). ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3, const Operand* o4); //! @brief Private method for emitting jcc. ASMJIT_API void _emitJcc(uint32_t code, const Label* label, uint32_t hint); //! @brief Private method for emitting function call. ASMJIT_API X86CompilerFuncCall* _emitCall(const Operand* o0); //! @brief Private method for returning a value from the function. ASMJIT_API void _emitReturn(const Operand* first, const Operand* second); // -------------------------------------------------------------------------- // [Align] // -------------------------------------------------------------------------- //! @brief Align target buffer to @a m bytes. //! //! Typical usage of this is to align labels at start of the inner loops. //! //! Inserts @c nop() instructions or CPU optimized NOPs. ASMJIT_API void align(uint32_t m); // -------------------------------------------------------------------------- // [Label] // -------------------------------------------------------------------------- //! @brief Create and return new label. ASMJIT_API Label newLabel(); //! @brief Bind label to the current offset. //! //! @note Label can be bound only once! ASMJIT_API void bind(const Label& label); // -------------------------------------------------------------------------- // [Variables] // -------------------------------------------------------------------------- //! @brief Get compiler variable at @a id. inline X86CompilerVar* _getVar(uint32_t id) const { ASMJIT_ASSERT(id != kInvalidValue); return reinterpret_cast(_vars[id & kOperandIdValueMask]); } //! @internal //! //! @brief Create a new variable data. ASMJIT_API X86CompilerVar* _newVar(const char* name, uint32_t type, uint32_t size); //! @brief Create a new general-purpose variable. ASMJIT_API GpVar newGpVar(uint32_t varType = kX86VarTypeGpz, const char* name = NULL); //! @brief Get argument as general-purpose variable. ASMJIT_API GpVar getGpArg(uint32_t argIndex); //! @brief Create a new MM variable. ASMJIT_API MmVar newMmVar(uint32_t varType = kX86VarTypeMm, const char* name = NULL); //! @brief Get argument as MM variable. ASMJIT_API MmVar getMmArg(uint32_t argIndex); //! @brief Create a new XMM variable. ASMJIT_API XmmVar newXmmVar(uint32_t varType = kX86VarTypeXmm, const char* name = NULL); //! @brief Get argument as XMM variable. ASMJIT_API XmmVar getXmmArg(uint32_t argIndex); //! @internal //! //! @brief Serialize variable hint. ASMJIT_API void _vhint(Var& var, uint32_t hintId, uint32_t hintValue); //! @brief Alloc variable @a var. ASMJIT_API void alloc(Var& var); //! @brief Alloc variable @a var using @a regIndex as a register index. ASMJIT_API void alloc(Var& var, uint32_t regIndex); //! @brief Alloc variable @a var using @a reg as a demanded register. ASMJIT_API void alloc(Var& var, const Reg& reg); //! @brief Spill variable @a var. ASMJIT_API void spill(Var& var); //! @brief Save variable @a var if modified. ASMJIT_API void save(Var& var); //! @brief Unuse variable @a var. ASMJIT_API void unuse(Var& var); //! @brief Get memory home of variable @a var. ASMJIT_API void getMemoryHome(Var& var, GpVar* home, int* displacement = NULL); //! @brief Set memory home of variable @a var. //! //! Default memory home location is on stack (ESP/RSP), but when needed the //! bebahior can be changed by this method. //! //! It is an error to chaining memory home locations. For example the given //! code is invalid: //! //! @code //! X86Compiler c; //! //! ... //! GpVar v0 = c.newGpVar(); //! GpVar v1 = c.newGpVar(); //! GpVar v2 = c.newGpVar(); //! GpVar v3 = c.newGpVar(); //! //! c.setMemoryHome(v1, v0, 0); // Allowed, [v0] is memory home for v1. //! c.setMemoryHome(v2, v0, 4); // Allowed, [v0+4] is memory home for v2. //! c.setMemoryHome(v3, v2); // CHAINING, NOT ALLOWED! //! @endcode ASMJIT_API void setMemoryHome(Var& var, const GpVar& home, int displacement = 0); //! @brief Get priority of variable @a var. ASMJIT_API uint32_t getPriority(Var& var) const; //! @brief Set priority of variable @a var to @a priority. ASMJIT_API void setPriority(Var& var, uint32_t priority); //! @brief Get save-on-unuse @a var property. ASMJIT_API bool getSaveOnUnuse(Var& var) const; //! @brief Set save-on-unuse @a var property to @a value. ASMJIT_API void setSaveOnUnuse(Var& var, bool value); //! @brief Rename variable @a var to @a name. //! //! @note Only new name will appear in the logger. ASMJIT_API void rename(Var& var, const char* name); // -------------------------------------------------------------------------- // [State] // -------------------------------------------------------------------------- //! @internal //! //! @brief Create a new @ref X86CompilerState. ASMJIT_API X86CompilerState* _newState(uint32_t memVarsCount); // -------------------------------------------------------------------------- // [Make] // -------------------------------------------------------------------------- //! @brief Make is convenience method to make currently serialized code and //! return pointer to generated function. //! //! What you need is only to cast this pointer to your function type and call //! it. Note that if there was an error and calling @c getError() method doesn't //! return @c kErrorOk (zero) then this function always returns @c NULL and //! error value remains the same. ASMJIT_API virtual void* make(); //! @brief Method that will emit everything to @c Assembler instance @a a. ASMJIT_API virtual void serialize(Assembler& a); // -------------------------------------------------------------------------- // [Data] // -------------------------------------------------------------------------- //! @brief Get target from label @a id. inline X86CompilerTarget* _getTarget(uint32_t id) { ASMJIT_ASSERT((id & kOperandIdTypeMask) == kOperandIdTypeLabel); return reinterpret_cast(_targets[id & kOperandIdValueMask]); } // -------------------------------------------------------------------------- // [Embed] // -------------------------------------------------------------------------- //! @brief Add 8-bit integer data to the instuction stream. inline void db(uint8_t x) { embed(&x, 1); } //! @brief Add 16-bit integer data to the instuction stream. inline void dw(uint16_t x) { embed(&x, 2); } //! @brief Add 32-bit integer data to the instuction stream. inline void dd(uint32_t x) { embed(&x, 4); } //! @brief Add 64-bit integer data to the instuction stream. inline void dq(uint64_t x) { embed(&x, 8); } //! @brief Add 8-bit integer data to the instuction stream. inline void dint8(int8_t x) { embed(&x, sizeof(int8_t)); } //! @brief Add 8-bit integer data to the instuction stream. inline void duint8(uint8_t x) { embed(&x, sizeof(uint8_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void dint16(int16_t x) { embed(&x, sizeof(int16_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void duint16(uint16_t x) { embed(&x, sizeof(uint16_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void dint32(int32_t x) { embed(&x, sizeof(int32_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void duint32(uint32_t x) { embed(&x, sizeof(uint32_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void dint64(int64_t x) { embed(&x, sizeof(int64_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void duint64(uint64_t x) { embed(&x, sizeof(uint64_t)); } //! @brief Add system-integer data to the instuction stream. inline void dintptr(intptr_t x) { embed(&x, sizeof(intptr_t)); } //! @brief Add system-integer data to the instuction stream. inline void duintptr(uintptr_t x) { embed(&x, sizeof(uintptr_t)); } //! @brief Add float data to the instuction stream. inline void dfloat(float x) { embed(&x, sizeof(float)); } //! @brief Add double data to the instuction stream. inline void ddouble(double x) { embed(&x, sizeof(double)); } //! @brief Add pointer data to the instuction stream. inline void dptr(void* x) { embed(&x, sizeof(void*)); } //! @brief Add MM data to the instuction stream. inline void dmm(const MmData& x) { embed(&x, sizeof(MmData)); } //! @brief Add XMM data to the instuction stream. inline void dxmm(const XmmData& x) { embed(&x, sizeof(XmmData)); } //! @brief Add data to the instuction stream. inline void data(const void* data, size_t size) { embed(data, size); } //! @brief Add data in a given structure instance to the instuction stream. template inline void dstruct(const T& x) { embed(&x, sizeof(T)); } // -------------------------------------------------------------------------- // [Custom Instructions] // -------------------------------------------------------------------------- // These emitters are used by custom compiler code (register alloc / spill, // prolog / epilog generator, ...). inline void emit(uint32_t code) { _emitInstruction(code); } inline void emit(uint32_t code, const Operand& o0) { _emitInstruction(code, &o0); } inline void emit(uint32_t code, const Operand& o0, const Operand& o1) { _emitInstruction(code, &o0, &o1); } inline void emit(uint32_t code, const Operand& o0, const Operand& o1, const Operand& o2) { _emitInstruction(code, &o0, &o1, &o2); } // -------------------------------------------------------------------------- // [X86 Instructions] // -------------------------------------------------------------------------- //! @brief Add with Carry. inline void adc(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add. inline void add(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Logical And. inline void and_(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpVar& dst, const GpVar& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpVar& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpVar& dst, const GpVar& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpVar& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Byte swap (32-bit or 64-bit registers only) (i486). inline void bswap(const GpVar& dst) { // ASMJIT_ASSERT(dst.getRegType() == kX86RegGPD || dst.getRegType() == kX86RegGPQ); _emitInstruction(kX86InstBSwap, &dst); } //! @brief Bit test. inline void bt(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const GpVar& dst) { return _emitCall(&dst); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const Mem& dst) { return _emitCall(&dst); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const Imm& dst) { return _emitCall(&dst); } //! @brief Call Procedure. //! @overload inline X86CompilerFuncCall* call(void* dst) { Imm imm((sysint_t)dst); return _emitCall(&imm); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const Label& label) { return _emitCall(&label); } //! @brief Convert Byte to Word (Sign Extend). inline void cbw(const GpVar& dst) { _emitInstruction(kX86InstCbw, &dst); } //! @brief Convert Word to DWord (Sign Extend). inline void cwd(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCwd, &dst, &src); } //! @brief Convert Word to DWord (Sign Extend). inline void cwde(const GpVar& dst) { _emitInstruction(kX86InstCwde, &dst); } //! @brief Convert Word to DWord (Sign Extend). inline void cdq(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCdq, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Convert DWord to QWord (Sign Extend). inline void cdqe(const GpVar& dst) { _emitInstruction(kX86InstCdqe, &dst); } #endif // ASMJIT_X64 #if defined(ASMJIT_X64) //! @brief Convert QWord to DQWord (Sign Extend). inline void cqo(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCqo, &dst, &src); } #endif // ASMJIT_X64 //! @brief Clear Carry flag //! //! This instruction clears the CF flag in the EFLAGS register. inline void clc() { _emitInstruction(kX86InstClc); } //! @brief Clear Direction flag //! //! This instruction clears the DF flag in the EFLAGS register. inline void cld() { _emitInstruction(kX86InstCld); } //! @brief Complement Carry Flag. //! //! This instruction complements the CF flag in the EFLAGS register. //! (CF = NOT CF) inline void cmc() { _emitInstruction(kX86InstCmc); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpVar& dst, const GpVar& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpVar& dst, const Mem& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const GpVar cmp_1_eax, const GpVar& cmp_2, const GpVar& src) { ASMJIT_ASSERT(cmp_1_eax.getId() != src.getId()); _emitInstruction(kX86InstCmpXCHG, &cmp_1_eax, &cmp_2, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const GpVar cmp_1_eax, const Mem& cmp_2, const GpVar& src) { ASMJIT_ASSERT(cmp_1_eax.getId() != src.getId()); _emitInstruction(kX86InstCmpXCHG, &cmp_1_eax, &cmp_2, &src); } //! @brief Compares the 64-bit value in EDX:EAX with the memory operand (Pentium). //! //! If the values are equal, then this instruction stores the 64-bit value //! in ECX:EBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 64-bit memory operand into the EDX:EAX //! registers and clears the zero flag. inline void cmpxchg8b( const GpVar& cmp_edx, const GpVar& cmp_eax, const GpVar& cmp_ecx, const GpVar& cmp_ebx, const Mem& dst) { ASMJIT_ASSERT(cmp_edx.getId() != cmp_eax.getId() && cmp_eax.getId() != cmp_ecx.getId() && cmp_ecx.getId() != cmp_ebx.getId()); _emitInstruction(kX86InstCmpXCHG8B, &cmp_edx, &cmp_eax, &cmp_ecx, &cmp_ebx, &dst); } #if defined(ASMJIT_X64) //! @brief Compares the 128-bit value in RDX:RAX with the memory operand (X64). //! //! If the values are equal, then this instruction stores the 128-bit value //! in RCX:RBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 128-bit memory operand into the RDX:RAX //! registers and clears the zero flag. inline void cmpxchg16b( const GpVar& cmp_edx, const GpVar& cmp_eax, const GpVar& cmp_ecx, const GpVar& cmp_ebx, const Mem& dst) { ASMJIT_ASSERT(cmp_edx.getId() != cmp_eax.getId() && cmp_eax.getId() != cmp_ecx.getId() && cmp_ecx.getId() != cmp_ebx.getId()); _emitInstruction(kX86InstCmpXCHG16B, &cmp_edx, &cmp_eax, &cmp_ecx, &cmp_ebx, &dst); } #endif // ASMJIT_X64 //! @brief CPU Identification (i486). inline void cpuid( const GpVar& inout_eax, const GpVar& out_ebx, const GpVar& out_ecx, const GpVar& out_edx) { // Destination variables must be different. ASMJIT_ASSERT(inout_eax.getId() != out_ebx.getId() && out_ebx.getId() != out_ecx.getId() && out_ecx.getId() != out_edx.getId()); _emitInstruction(kX86InstCpuId, &inout_eax, &out_ebx, &out_ecx, &out_edx); } #if defined(ASMJIT_X86) inline void daa(const GpVar& dst) { _emitInstruction(kX86InstDaa, &dst); } #endif // ASMJIT_X86 #if defined(ASMJIT_X86) inline void das(const GpVar& dst) { _emitInstruction(kX86InstDas, &dst); } #endif // ASMJIT_X86 //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const GpVar& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const Mem& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Unsigned divide. //! //! This instruction divides (unsigned) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void div(const GpVar& dst_rem, const GpVar& dst_quot, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstDiv, &dst_rem, &dst_quot, &src); } //! @brief Unsigned divide. //! @overload inline void div(const GpVar& dst_rem, const GpVar& dst_quot, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstDiv, &dst_rem, &dst_quot, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Make Stack Frame for Procedure Parameters. inline void enter(const Imm& imm16, const Imm& imm8) { _emitInstruction(kX86InstEnter, &imm16, &imm8); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Signed divide. //! //! This instruction divides (signed) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void idiv(const GpVar& dst_rem, const GpVar& dst_quot, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstIDiv, &dst_rem, &dst_quot, &src); } //! @brief Signed divide. //! @overload inline void idiv(const GpVar& dst_rem, const GpVar& dst_quot, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstIDiv, &dst_rem, &dst_quot, &src); } //! @brief Signed multiply. //! //! [dst_lo:dst_hi] = dst_hi * src. inline void imul(const GpVar& dst_hi, const GpVar& dst_lo, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstIMul, &dst_hi, &dst_lo, &src); } //! @overload inline void imul(const GpVar& dst_hi, const GpVar& dst_lo, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstIMul, &dst_hi, &dst_lo, &src); } //! @brief Signed multiply. //! //! Destination operand (the first operand) is multiplied by the source //! operand (second operand). The destination operand is a general-purpose //! register and the source operand is an immediate value, a general-purpose //! register, or a memory location. The product is then stored in the //! destination operand location. inline void imul(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! //! source operand (which can be a general-purpose register or a memory //! location) is multiplied by the second source operand (an immediate //! value). The product is then stored in the destination operand //! (a general-purpose register). inline void imul(const GpVar& dst, const GpVar& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @overload inline void imul(const GpVar& dst, const Mem& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const GpVar& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const Mem& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Interrupt 3 - trap to debugger. inline void int3() { _emitInstruction(kX86InstInt3); } //! @brief Jump to label @a label if condition @a cc is met. //! //! This instruction checks the state of one or more of the status flags in //! the EFLAGS register (CF, OF, PF, SF, and ZF) and, if the flags are in the //! specified state (condition), performs a jump to the target instruction //! specified by the destination operand. A condition code (cc) is associated //! with each instruction to indicate the condition being tested for. If the //! condition is not satisfied, the jump is not performed and execution //! continues with the instruction following the Jcc instruction. inline void j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(X86Util::getJccInstFromCond(cc), &label, hint); } //! @brief Jump to label @a label if condition is met. inline void ja (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jae (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJAE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJBE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void je (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jg (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jge (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJGE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jle (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJLE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jna (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNAE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNBE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jne (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jng (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNGE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNLE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jno (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jns (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNZ , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void js (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJZ , &label, hint); } //! @brief Jump. //! @overload inline void jmp(const GpVar& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Mem& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Imm& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(void* dst) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstJmp, &imm); } //! @brief Jump. //! //! This instruction transfers program control to a different point //! in the instruction stream without recording return information. //! The destination (target) operand specifies the label of the //! instruction being jumped to. inline void jmp(const Label& label) { _emitInstruction(kX86InstJmp, &label); } //! @brief Load Effective Address //! //! This instruction computes the effective address of the second //! operand (the source operand) and stores it in the first operand //! (destination operand). The source operand is a memory address //! (offset part) specified with one of the processors addressing modes. //! The destination operand is a general-purpose register. inline void lea(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstLea, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief High Level Procedure Exit. inline void leave() { _emitInstruction(kX86InstLeave); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Move. //! //! This instruction copies the second operand (source operand) to the first //! operand (destination operand). The source operand can be an immediate //! value, general-purpose register, segment register, or memory location. //! The destination register can be a general-purpose register, segment //! register, or memory location. Both operands must be the same size, which //! can be a byte, a word, or a DWORD. //! //! @note To move MMX or SSE registers to/from GP registers or memory, use //! corresponding functions: @c movd(), @c movq(), etc. Passing MMX or SSE //! registers to @c mov() is illegal. inline void mov(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const GpVar& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const Mem& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const GpVar& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move byte, word, dword or qword from absolute address @a src to //! AL, AX, EAX or RAX register. inline void mov_ptr(const GpVar& dst, void* src) { Imm imm((sysint_t)src); _emitInstruction(kX86InstMovPtr, &dst, &imm); } //! @brief Move byte, word, dword or qword from AL, AX, EAX or RAX register //! to absolute address @a dst. inline void mov_ptr(void* dst, const GpVar& src) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstMovPtr, &imm, &src); } //! @brief Move with Sign-Extension. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and sign //! extends the value to 16, 32 or 64-bits. //! //! @sa movsxd(). void movsx(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } //! @brief Move with Sign-Extension. //! @overload void movsx(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move DWord to QWord with sign-extension. inline void movsxd(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } //! @brief Move DWord to QWord with sign-extension. //! @overload inline void movsxd(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move with Zero-Extend. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and zero //! extends the value to 16 or 32-bits. The size of the converted value //! depends on the operand-size attribute. inline void movzx(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Move with Zero-Extend. //! @brief Overload inline void movzx(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Unsigned multiply. //! //! Source operand (in a general-purpose register or memory location) //! is multiplied by the value in the AL, AX, or EAX register (depending //! on the operand size) and the product is stored in the AX, DX:AX, or //! EDX:EAX registers, respectively. inline void mul(const GpVar& dst_hi, const GpVar& dst_lo, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstMul, &dst_hi, &dst_lo, &src); } //! @brief Unsigned multiply. //! @overload inline void mul(const GpVar& dst_hi, const GpVar& dst_lo, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstMul, &dst_hi, &dst_lo, &src); } //! @brief Two's Complement Negation. inline void neg(const GpVar& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief Two's Complement Negation. inline void neg(const Mem& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief No Operation. //! //! This instruction performs no operation. This instruction is a one-byte //! instruction that takes up space in the instruction stream but does not //! affect the machine context, except the EIP register. The NOP instruction //! is an alias mnemonic for the XCHG (E)AX, (E)AX instruction. inline void nop() { _emitInstruction(kX86InstNop); } //! @brief One's Complement Negation. inline void not_(const GpVar& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief One's Complement Negation. inline void not_(const Mem& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief Logical Inclusive OR. inline void or_(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Pop a Value from the Stack. //! //! This instruction loads the value from the top of the stack to the location //! specified with the destination operand and then increments the stack pointer. //! The destination operand can be a general purpose register, memory location, //! or segment register. inline void pop(const GpVar& dst) { _emitInstruction(kX86InstPop, &dst); } inline void pop(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPop, &dst); } #if defined(ASMJIT_X86) //! @brief Pop All General-Purpose Registers. //! //! Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX. inline void popad() { _emitInstruction(kX86InstPopAD); } #endif // ASMJIT_X86 //! @brief Pop Stack into EFLAGS Register (32-bit or 64-bit). inline void popf() { #if defined(ASMJIT_X86) popfd(); #else popfq(); #endif } #if defined(ASMJIT_X86) //! @brief Pop Stack into EFLAGS Register (32-bit). inline void popfd() { _emitInstruction(kX86InstPopFD); } #else //! @brief Pop Stack into EFLAGS Register (64-bit). inline void popfq() { _emitInstruction(kX86InstPopFQ); } #endif //! @brief Push WORD/DWORD/QWORD Onto the Stack. //! //! @note 32-bit architecture pushed DWORD while 64-bit //! pushes QWORD. 64-bit mode not provides instruction to //! push 32-bit register/memory. inline void push(const GpVar& src) { _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Imm& src) { _emitInstruction(kX86InstPush, &src); } #if defined(ASMJIT_X86) //! @brief Push All General-Purpose Registers. //! //! Push EAX, ECX, EDX, EBX, original ESP, EBP, ESI, and EDI. inline void pushad() { _emitInstruction(kX86InstPushAD); } #endif // ASMJIT_X86 //! @brief Push EFLAGS Register (32-bit or 64-bit) onto the Stack. inline void pushf() { #if defined(ASMJIT_X86) pushfd(); #else pushfq(); #endif } #if defined(ASMJIT_X86) //! @brief Push EFLAGS Register (32-bit) onto the Stack. inline void pushfd() { _emitInstruction(kX86InstPushFD); } #else //! @brief Push EFLAGS Register (64-bit) onto the Stack. inline void pushfq() { _emitInstruction(kX86InstPushFQ); } #endif // ASMJIT_X86 //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Read Time-Stamp Counter (Pentium). inline void rdtsc(const GpVar& dst_edx, const GpVar& dst_eax) { // Destination registers must be different. ASMJIT_ASSERT(dst_edx.getId() != dst_eax.getId()); _emitInstruction(kX86InstRdtsc, &dst_edx, &dst_eax); } //! @brief Read Time-Stamp Counter and Processor ID (New). inline void rdtscp(const GpVar& dst_edx, const GpVar& dst_eax, const GpVar& dst_ecx) { // Destination registers must be different. ASMJIT_ASSERT(dst_edx.getId() != dst_eax.getId() && dst_eax.getId() != dst_ecx.getId()); _emitInstruction(kX86InstRdtscP, &dst_edx, &dst_eax, &dst_ecx); } //! @brief Load ECX/RCX BYTEs from DS:[ESI/RSI] to AL. inline void rep_lodsb(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSB, &dst_val, &src_addr, &cnt_ecx); } //! @brief Load ECX/RCX DWORDs from DS:[ESI/RSI] to EAX. inline void rep_lodsd(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSD, &dst_val, &src_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Load ECX/RCX QWORDs from DS:[ESI/RSI] to RAX. inline void rep_lodsq(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSQ, &dst_val, &src_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Load ECX/RCX WORDs from DS:[ESI/RSI] to AX. inline void rep_lodsw(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSW, &dst_val, &src_addr, &cnt_ecx); } //! @brief Move ECX/RCX BYTEs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsb(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSB, &dst_addr, &src_addr, &cnt_ecx); } //! @brief Move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsd(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSD, &dst_addr, &src_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Move ECX/RCX QWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsq(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSQ, &dst_addr, &src_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Move ECX/RCX WORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsw(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSW, &dst_addr, &src_addr, &cnt_ecx); } //! @brief Fill ECX/RCX BYTEs at ES:[EDI/RDI] with AL. inline void rep_stosb(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSB, &dst_addr, &src_val, &cnt_ecx); } //! @brief Fill ECX/RCX DWORDs at ES:[EDI/RDI] with EAX. inline void rep_stosd(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSD, &dst_addr, &src_val, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Fill ECX/RCX QWORDs at ES:[EDI/RDI] with RAX. inline void rep_stosq(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSQ, &dst_addr, &src_val, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Fill ECX/RCX WORDs at ES:[EDI/RDI] with AX. inline void rep_stosw(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSW, &dst_addr, &src_val, &cnt_ecx); } //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsb(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSB, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsd(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSD, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsq(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSQ, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsw(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSW, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Find non-AL BYTE starting at ES:[EDI/RDI]. inline void repe_scasb(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AL, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSB, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Find non-EAX DWORD starting at ES:[EDI/RDI]. inline void repe_scasd(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=EAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSD, &cmp1_addr, &cmp2_val, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Find non-RAX QWORD starting at ES:[EDI/RDI]. inline void repe_scasq(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=RAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSQ, &cmp1_addr, &cmp2_val, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Find non-AX WORD starting at ES:[EDI/RDI]. inline void repe_scasw(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSW, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Find matching BYTEs in [RDI] and [RSI]. inline void repne_cmpsb(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSB, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Find matching DWORDs in [RDI] and [RSI]. inline void repne_cmpsd(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSD, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Find matching QWORDs in [RDI] and [RSI]. inline void repne_cmpsq(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSQ, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Find matching WORDs in [RDI] and [RSI]. inline void repne_cmpsw(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSW, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Find AL, starting at ES:[EDI/RDI]. inline void repne_scasb(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AL, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSB, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Find EAX, starting at ES:[EDI/RDI]. inline void repne_scasd(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=EAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSD, &cmp1_addr, &cmp2_val, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Find RAX, starting at ES:[EDI/RDI]. inline void repne_scasq(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=RAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSQ, &cmp1_addr, &cmp2_val, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Find AX, starting at ES:[EDI/RDI]. inline void repne_scasw(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSW, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Return from Procedure. inline void ret() { _emitReturn(NULL, NULL); } //! @brief Return from Procedure. inline void ret(const GpVar& first) { _emitReturn(&first, NULL); } //! @brief Return from Procedure. inline void ret(const GpVar& first, const GpVar& second) { _emitReturn(&first, &second); } //! @brief Return from Procedure. inline void ret(const XmmVar& first) { _emitReturn(&first, NULL); } //! @brief Return from Procedure. inline void ret(const XmmVar& first, const XmmVar& second) { _emitReturn(&first, &second); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } #if defined(ASMJIT_X86) //! @brief Store @a var (allocated to AH/AX/EAX/RAX) into Flags. inline void sahf(const GpVar& var) { _emitInstruction(kX86InstSahf, &var); } #endif // ASMJIT_X86 //! @brief Integer subtraction with borrow. inline void sbb(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void seta (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void seta (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void setae (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setae (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setb (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setbe (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setbe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setc (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void setc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void sete (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void sete (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void setg (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setg (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setge (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setge (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setl (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setle (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setle (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setna (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setna (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setnae(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnae(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnb (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnbe(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnbe(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnc (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setnc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setne (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setne (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setng (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setng (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setnge(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnge(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnl (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnle(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setnle(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setno (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setno (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setnp (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setnp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setns (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setns (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setnz (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void setnz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void seto (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void seto (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void setp (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setpe (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpo (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void setpo (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void sets (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void sets (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void setz (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Set Byte on Condition. inline void setz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const GpVar& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const GpVar& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const Mem& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const Mem& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const GpVar& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const GpVar& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const Mem& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const Mem& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Set Carry Flag to 1. inline void stc() { _emitInstruction(kX86InstStc); } //! @brief Set Direction Flag to 1. inline void std() { _emitInstruction(kX86InstStd); } //! @brief Subtract. inline void sub(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Logical Compare. inline void test(const GpVar& op1, const GpVar& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const GpVar& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const GpVar& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Undefined instruction - Raise invalid opcode exception. inline void ud2() { _emitInstruction(kX86InstUd2); } //! @brief Exchange and Add. inline void xadd(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange and Add. inline void xadd(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstXchg, &src, &dst); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } // -------------------------------------------------------------------------- // [MMX] // -------------------------------------------------------------------------- //! @brief Empty MMX state. inline void emms() { _emitInstruction(kX86InstEmms); } //! @brief Move DWord (MMX). inline void movd(const Mem& dst, const MmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const GpVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const Mem& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const GpVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Move QWord (MMX). inline void movq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const MmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src);} //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } // -------------------------------------------------------------------------- // [3dNow] // -------------------------------------------------------------------------- //! @brief Faster EMMS (3dNow!). //! //! @note Use only for early AMD processors where is only 3dNow! or SSE. If //! CPU contains SSE2, it's better to use @c emms() ( @c femms() is mapped //! to @c emms() ). inline void femms() { _emitInstruction(kX86InstFEmms); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE] // -------------------------------------------------------------------------- //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmVar& dst, const MmVar& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Load Streaming SIMD Extension Control/Status (SSE). inline void ldmxcsr(const Mem& src) { _emitInstruction(kX86InstLdMXCSR, &src); } //! @brief Byte Mask Write (SSE). //! //! @note The default memory location is specified by DS:EDI. inline void maskmovq(const GpVar& dst_ptr, const MmVar& data, const MmVar& mask) { _emitInstruction(kX86InstMaskMovQ, &dst_ptr, &data, &mask); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move DWord. inline void movd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move QWord (SSE). inline void movq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move 64 Bits Non Temporal (SSE). inline void movntq(const Mem& dst, const MmVar& src) { _emitInstruction(kX86InstMovNTQ, &dst, &src); } //! @brief High to Low Packed SP-FP (SSE). inline void movhlps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovHLPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move Low to High Packed SP-FP (SSE). inline void movlhps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovLHPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Aligned Four Packed SP-FP Non Temporal (SSE). inline void movntps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovNTPS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Extract Word (SSE). inline void pextrw(const GpVar& dst, const MmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask To Integer (SSE). inline void pmovmskb(const GpVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmVar& dst, const MmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Prefetch (SSE). inline void prefetch(const Mem& mem, const Imm& hint) { _emitInstruction(kX86InstPrefetch, &mem, &hint); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store fence (SSE). inline void sfence() { _emitInstruction(kX86InstSFence); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store Streaming SIMD Extension Control/Status (SSE). inline void stmxcsr(const Mem& dst) { _emitInstruction(kX86InstStMXCSR, &dst); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } // -------------------------------------------------------------------------- // [SSE2] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Flush Cache Line (SSE2). inline void clflush(const Mem& mem) { _emitInstruction(kX86InstClFlush, &mem); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmVar& dst, const MmVar& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Load Fence (SSE2). inline void lfence() { _emitInstruction(kX86InstLFence); } //! @brief Store Selected Bytes of Double Quadword (SSE2). //! //! @note Target is DS:EDI. inline void maskmovdqu(const GpVar& dst_ptr, const XmmVar& src, const XmmVar& mask) { _emitInstruction(kX86InstMaskMovDQU, &dst_ptr, &src, &mask); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Memory Fence (SSE2). inline void mfence() { _emitInstruction(kX86InstMFence); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Extract Packed SP-FP Sign Mask (SSE2). inline void movmskps(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovMskPS, &dst, &src); } //! @brief Extract Packed DP-FP Sign Mask (SSE2). inline void movmskpd(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovMskPD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Quadword from XMM to MMX Technology Register (SSE2). inline void movdq2q(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQ2Q, &dst, &src); } //! @brief Move Quadword from MMX Technology to XMM Register (SSE2). inline void movq2dq(const XmmVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ2DQ, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Store Double Quadword Using Non-Temporal Hint (SSE2). inline void movntdq(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovNTDQ, &dst, &src); } //! @brief Store Store DWORD Using Non-Temporal Hint (SSE2). inline void movnti(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstMovNTI, &dst, &src); } //! @brief Store Packed Double-Precision FP Values Using Non-Temporal Hint (SSE2). inline void movntpd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovNTPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Spin Loop Hint (SSE2). inline void pause() { _emitInstruction(kX86InstPause); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Extract Word (SSE2). inline void pextrw(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Extract Word (SSE2). inline void pextrw(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask (SSE2). inline void pmovmskb(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslldq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllDQ, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief DQWord Shift Right Logical (MMX). inline void psrldq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlDQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE3] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER // TODO: NOT IMPLEMENTED BY THE COMPILER. //! @brief Store Integer with Truncation (SSE3). inline void fisttp(const Mem& dst) { _emitInstruction(kX86InstFISttP, &dst); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Load Unaligned Integer 128 Bits (SSE3). inline void lddqu(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstLdDQU, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Set Up Monitor Address (SSE3). inline void monitor() { _emitInstruction(kX86InstMonitor); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Monitor Wait (SSE3). inline void mwait() { _emitInstruction(kX86InstMWait); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER // -------------------------------------------------------------------------- // [SSSE3] // -------------------------------------------------------------------------- //! @brief Packed SIGN (SSSE3). inline void psignb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmVar& dst, const MmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.1] // -------------------------------------------------------------------------- //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Load Double Quadword Non-Temporal Aligned Hint (SSE4.1). inline void movntdqa(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovNTDQA, &dst, &src); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmVar& op1, const XmmVar& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmVar& op1, const Mem& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.2] // -------------------------------------------------------------------------- //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstPopCnt, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstPopCnt, &dst, &src); } // -------------------------------------------------------------------------- // [AMD only] // -------------------------------------------------------------------------- //! @brief Prefetch (3dNow - Amd). //! //! Loads the entire 64-byte aligned memory sequence containing the //! specified memory address into the L1 data cache. The position of //! the specified memory address within the 64-byte cache line is //! irrelevant. If a cache hit occurs, or if a memory fault is detected, //! no bus cycle is initiated and the instruction is treated as a NOP. inline void amd_prefetch(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetch, &mem); } //! @brief Prefetch and set cache to modified (3dNow - Amd). //! //! The PREFETCHW instruction loads the prefetched line and sets the //! cache-line state to Modified, in anticipation of subsequent data //! writes to the line. The PREFETCH instruction, by contrast, typically //! sets the cache-line state to Exclusive (depending on the hardware //! implementation). inline void amd_prefetchw(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetchW, &mem); } // -------------------------------------------------------------------------- // [Intel only] // -------------------------------------------------------------------------- //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const GpVar& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const Mem& dst, const GpVar& src) { ASMJIT_ASSERT(!src.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } // ------------------------------------------------------------------------- // [Emit Options] // ------------------------------------------------------------------------- //! @brief Assert LOCK# Signal Prefix. //! //! This instruction causes the processor's LOCK# signal to be asserted //! during execution of the accompanying instruction (turns the //! instruction into an atomic instruction). In a multiprocessor environment, //! the LOCK# signal insures that the processor has exclusive use of any shared //! memory while the signal is asserted. //! //! The LOCK prefix can be prepended only to the following instructions and //! to those forms of the instructions that use a memory operand: ADD, ADC, //! AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, //! and XCHG. An undefined opcode exception will be generated if the LOCK //! prefix is used with any other instruction. The XCHG instruction always //! asserts the LOCK# signal regardless of the presence or absence of the LOCK //! prefix. inline void lock() { _emitOptions |= kX86EmitOptionLock; } //! @brief Force REX prefix to be emitted. //! //! This option should be used carefully, because there are unencodable //! combinations. If you want to access ah, bh, ch or dh registers then you //! can't emit REX prefix and it will cause an illegal instruction error. //! //! @note REX prefix is only valid for X64/AMD64 platform. //! //! @sa @c kX86EmitOptionRex. inline void rex() { _emitOptions |= kX86EmitOptionRex; } }; //! @} } // AsmJit namespace #undef ASMJIT_NOT_SUPPORTED_BY_COMPILER // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILER_H desmume-0.9.11/src/utils/AsmJit/x86/x86compileritem.h0000755000000000000000000002411712467662066020741 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILERITEM_H #define _ASMJIT_X86_X86COMPILERITEM_H // [Dependencies - AsmJit] #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CompilerAlign] // ============================================================================ //! @brief Compiler align item. struct X86CompilerAlign : public CompilerAlign { ASMJIT_NO_COPY(X86CompilerAlign) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerAlign instance. ASMJIT_API X86CompilerAlign(X86Compiler* x86Compiler, uint32_t size = 0); //! @brief Destroy the @ref CompilerAlign instance. ASMJIT_API virtual ~X86CompilerAlign(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void emit(Assembler& a); }; // ============================================================================ // [AsmJit::X86CompilerHint] // ============================================================================ //! @brief @ref X86Compiler variable hint item. struct X86CompilerHint : public CompilerHint { ASMJIT_NO_COPY(X86CompilerHint) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerHint instance. ASMJIT_API X86CompilerHint(X86Compiler* compiler, X86CompilerVar* var, uint32_t hintId, uint32_t hintValue); //! @brief Destroy the @ref X86CompilerHint instance. ASMJIT_API virtual ~X86CompilerHint(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get variable as @ref X86CompilerVar. inline X86CompilerVar* getVar() const { return reinterpret_cast(_var); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::X86CompilerTarget] // ============================================================================ //! @brief X86Compiler target item. struct X86CompilerTarget : public CompilerTarget { ASMJIT_NO_COPY(X86CompilerTarget) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerTarget instance. ASMJIT_API X86CompilerTarget(X86Compiler* x86Compiler, const Label& target); //! @brief Destroy the @ref X86CompilerTarget instance. ASMJIT_API virtual ~X86CompilerTarget(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get state as @ref X86CompilerState. inline X86CompilerState* getState() const { return reinterpret_cast(_state); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); }; // ============================================================================ // [AsmJit::X86CompilerInst] // ============================================================================ //! @brief @ref X86Compiler instruction item. struct X86CompilerInst : public CompilerInst { ASMJIT_NO_COPY(X86CompilerInst) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerInst instance. ASMJIT_API X86CompilerInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount); //! @brief Destroy the @ref X86CompilerInst instance. ASMJIT_API virtual ~X86CompilerInst(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get whether the instruction is special. inline bool isSpecial() const { return (_instFlags & kX86CompilerInstFlagIsSpecial) != 0; } //! @brief Get whether the instruction is FPU. inline bool isFpu() const { return (_instFlags & kX86CompilerInstFlagIsFpu) != 0; } //! @brief Get whether the instruction is used with GpbLo register. inline bool isGpbLoUsed() const { return (_instFlags & kX86CompilerInstFlagIsGpbLoUsed) != 0; } //! @brief Get whether the instruction is used with GpbHi register. inline bool isGpbHiUsed() const { return (_instFlags & kX86CompilerInstFlagIsGpbHiUsed) != 0; } //! @brief Get memory operand. inline Mem* getMemOp() { return _memOp; } //! @brief Set memory operand. inline void setMemOp(Mem* memOp) { _memOp = memOp; } //! @brief Get operands array (3 operands total). inline VarAllocRecord* getVars() { return _vars; } //! @brief Get operands array (3 operands total). inline const VarAllocRecord* getVars() const { return _vars; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Memory operand or NULL. Mem* _memOp; //! @brief Variables (extracted from operands). VarAllocRecord* _vars; }; // ============================================================================ // [AsmJit::X86CompilerJmpInst] // ============================================================================ //! @brief @ref X86Compiler "jmp" instruction item. struct X86CompilerJmpInst : public X86CompilerInst { ASMJIT_NO_COPY(X86CompilerJmpInst) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API X86CompilerJmpInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount); ASMJIT_API virtual ~X86CompilerJmpInst(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- inline X86CompilerJmpInst* getJumpNext() const { return _jumpNext; } inline bool isTaken() const { return (_instFlags & kX86CompilerInstFlagIsTaken) != 0; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [DoJump] // -------------------------------------------------------------------------- ASMJIT_API void doJump(CompilerContext& cc); // -------------------------------------------------------------------------- // [Jump] // -------------------------------------------------------------------------- ASMJIT_API virtual CompilerTarget* getJumpTarget() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Jump target. X86CompilerTarget* _jumpTarget; //! @brief Next jump to the same target in a single linked list. X86CompilerJmpInst *_jumpNext; //! @brief State associated with the jump. X86CompilerState* _state; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILERITEM_H desmume-0.9.11/src/utils/AsmJit/x86/x86compilercontext.cpp0000755000000000000000000013717212467662066022030 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerContext - Construction / Destruction] // ============================================================================ X86CompilerContext::X86CompilerContext(X86Compiler* x86Compiler) : CompilerContext(x86Compiler) { _state = &_x86State; _clear(); _emitComments = x86Compiler->getLogger() != NULL; } X86CompilerContext::~X86CompilerContext() { } // ============================================================================ // [AsmJit::CompilerContext - Clear] // ============================================================================ void X86CompilerContext::_clear() { _zoneMemory.clear(); _func = NULL; _start = NULL; _stop = NULL; _x86State.clear(); _active = NULL; _forwardJumps = NULL; _currentOffset = 0; _isUnreachable = 0; _modifiedGpRegisters = 0; _modifiedMmRegisters = 0; _modifiedXmmRegisters = 0; _allocableEBP = false; _adjustESP = 0; _argumentsBaseReg = kRegIndexInvalid; // Used by patcher. _argumentsBaseOffset = 0; // Used by patcher. _argumentsActualDisp = 0; // Used by translate(). _variablesBaseReg = kRegIndexInvalid; // Used by patcher. _variablesBaseOffset = 0; // Used by patcher. _variablesActualDisp = 0; // Used by translate() _memUsed = NULL; _memFree = NULL; _mem4BlocksCount = 0; _mem8BlocksCount = 0; _mem16BlocksCount = 0; _memBytesTotal = 0; _backCode.clear(); _backPos = 0; } // ============================================================================ // [AsmJit::CompilerContext - Construction / Destruction] // ============================================================================ void X86CompilerContext::allocVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 allocGpVar(var, regMask, vflags); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: allocMmVar(var, regMask, vflags); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: allocXmmVar(var, regMask, vflags); break; } _postAlloc(var, vflags); } void X86CompilerContext::saveVar(X86CompilerVar* var) { switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 saveGpVar(var); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: saveMmVar(var); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: saveXmmVar(var); break; } } void X86CompilerContext::spillVar(X86CompilerVar* var) { switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 spillGpVar(var); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: spillMmVar(var); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: spillXmmVar(var); break; } } void X86CompilerContext::unuseVar(X86CompilerVar* var, uint32_t toState) { ASMJIT_ASSERT(toState != kVarStateReg); if (var->state == kVarStateReg) { uint32_t regIndex = var->regIndex; switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 _x86State.gp[regIndex] = NULL; _freedGpRegister(regIndex); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: _x86State.mm[regIndex] = NULL; _freedMmRegister(regIndex); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: _x86State.xmm[regIndex] = NULL; _freedXmmRegister(regIndex); break; } } var->state = toState; var->changed = false; var->regIndex = kRegIndexInvalid; } void X86CompilerContext::allocGpVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { uint32_t fullMask = IntUtil::maskUpToIndex(kX86RegNumGp) & ~IntUtil::maskFromIndex(kX86RegIndexEsp); if (!_allocableEBP) fullMask &= ~IntUtil::maskFromIndex(kX86RegIndexEbp); // Fix the regMask (0 or full bit-array means that any register may be used). if (regMask == 0) regMask = 0xFFFFFFFF; regMask &= fullMask; // Working variables. uint32_t i; uint32_t mask; // Last register code (aka home). uint32_t home = var->homeRegisterIndex; // New register code. uint32_t idx = kRegIndexInvalid; // Preserved GP variables. uint32_t preservedGP = var->funcScope->getDecl()->getGpPreservedMask(); // Spill candidate. X86CompilerVar* spillCandidate = NULL; // Whether to alloc the non-preserved variables first. bool nonPreservedFirst = true; if (getFunc()->isCaller()) nonPreservedFirst = (var->funcCall == NULL) || (var->funcCall->getOffset() >= var->lastItem->getOffset()); // -------------------------------------------------------------------------- // [Already Allocated] // -------------------------------------------------------------------------- // Go away if variable is already allocated. if (var->state == kVarStateReg) { uint32_t oldIndex = var->regIndex; // Already allocated in the right register. if (IntUtil::maskFromIndex(oldIndex) & regMask) return; // Try to find unallocated register first. mask = regMask & ~_x86State.usedGP; if (mask != 0) { idx = IntUtil::findFirstBit((nonPreservedFirst && (mask & ~preservedGP) != 0) ? mask & ~preservedGP : mask); } // Then find the allocated and exchange later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedGP); } ASMJIT_ASSERT(idx != kRegIndexInvalid); X86CompilerVar* other = _x86State.gp[idx]; emitExchangeVar(var, idx, vflags, other); _x86State.gp[oldIndex] = other; _x86State.gp[idx ] = var; if (other) other->regIndex = oldIndex; else _freedGpRegister(oldIndex); // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; _allocatedGpRegister(idx); return; } // -------------------------------------------------------------------------- // [Find Unused GP] // -------------------------------------------------------------------------- // Home register code. if ((idx == kRegIndexInvalid) && (home != kRegIndexInvalid) && (regMask & IntUtil::maskFromIndex(home)) != 0 && (_x86State.usedGP & IntUtil::maskFromIndex(home)) == 0) { idx = home; goto _Alloc; } // We start from 1, because EAX/RAX register is sometimes explicitly // needed. So we trying to prevent reallocation in near future. if (idx == kRegIndexInvalid) { for (i = 1, mask = (1 << i); i < kX86RegNumGp; i++, mask <<= 1) { if ((regMask & mask) != 0 && (_x86State.usedGP & mask) == 0) { // Convenience to alloc non-preserved first or non-preserved last. if (nonPreservedFirst) { if (idx != kRegIndexInvalid && (preservedGP & mask) != 0) continue; idx = i; // If current register is preserved, we should try to find different // one that is not. This can save one push / pop in prolog / epilog. if ((preservedGP & mask) == 0) break; } else { if (idx != kRegIndexInvalid && (preservedGP & mask) == 0) continue; idx = i; // The opposite. if ((preservedGP & mask) != 0) break; } } } } // If not found, try EAX/RAX. if ((idx == kRegIndexInvalid) && (regMask & IntUtil::maskFromIndex(kX86RegIndexEax)) != 0 && (_x86State.usedGP & IntUtil::maskFromIndex(kX86RegIndexEax)) == 0) { idx = kX86RegIndexEax; goto _Alloc; } // If regMask contains restricted registers which may be used then everything // is handled inside this block. if ((idx == kRegIndexInvalid) && (regMask != fullMask)) { // Try to find unallocated register first. mask = regMask & ~_x86State.usedGP; if (mask != 0) { idx = IntUtil::findFirstBit((nonPreservedFirst && (mask & ~preservedGP) != 0) ? (mask & ~preservedGP) : mask); ASMJIT_ASSERT(idx != kRegIndexInvalid); } // Then find the allocated and spill later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedGP); ASMJIT_ASSERT(idx != kRegIndexInvalid); // Spill register we need. spillCandidate = _x86State.gp[idx]; // Jump to spill part of allocation. goto L_Spill; } } // -------------------------------------------------------------------------- // [Spill] // -------------------------------------------------------------------------- // If register is still not found, spill other variable. if (idx == kRegIndexInvalid) { if (spillCandidate == NULL) { spillCandidate = _getSpillCandidateGP(); } // Spill candidate not found? if (spillCandidate == NULL) { _compiler->setError(kErrorNoRegisters); return; } L_Spill: // Prevented variables can't be spilled. _getSpillCandidate() never returns // prevented variables, but when jumping to L_Spill it could happen. if (spillCandidate->workOffset == _currentOffset) { _compiler->setError(kErrorOverlappedRegisters); return; } idx = spillCandidate->regIndex; spillGpVar(spillCandidate); } // -------------------------------------------------------------------------- // [Alloc] // -------------------------------------------------------------------------- _Alloc: if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0) { emitLoadVar(var, idx); } // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; // Update CompilerState. _allocatedVariable(var); } void X86CompilerContext::saveGpVar(X86CompilerVar* var) { // Can't save variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; emitSaveVar(var, idx); // Update X86CompilerVar. var->changed = false; } void X86CompilerContext::spillGpVar(X86CompilerVar* var) { // Can't spill variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; if (var->changed) emitSaveVar(var, idx); // Update X86CompilerVar. var->regIndex = kRegIndexInvalid; var->state = kVarStateMem; var->changed = false; // Update CompilerState. _x86State.gp[idx] = NULL; _freedGpRegister(idx); } void X86CompilerContext::allocMmVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { // Fix the regMask (0 or full bit-array means that any register may be used). if (regMask == 0) regMask = IntUtil::maskUpToIndex(kX86RegNumMm); regMask &= IntUtil::maskUpToIndex(kX86RegNumMm); // Working variables. uint32_t i; uint32_t mask; // Last register code (aka home). uint32_t home = var->homeRegisterIndex; // New register code. uint32_t idx = kRegIndexInvalid; // Preserved MM variables. // // NOTE: Currently MM variables are not preserved and there is no calling // convention known to me that does that. But on the other side it's possible // to write such calling convention. uint32_t preservedMM = var->funcScope->getDecl()->getMmPreservedMask(); // Spill candidate. X86CompilerVar* spillCandidate = NULL; // Whether to alloc non-preserved first or last. bool nonPreservedFirst = true; if (this->getFunc()->isCaller()) { nonPreservedFirst = var->funcCall == NULL || var->funcCall->getOffset() >= var->lastItem->getOffset(); } // -------------------------------------------------------------------------- // [Already Allocated] // -------------------------------------------------------------------------- // Go away if variable is already allocated. if (var->state == kVarStateReg) { uint32_t oldIndex = var->regIndex; // Already allocated in the right register. if (IntUtil::maskFromIndex(oldIndex) & regMask) return; // Try to find unallocated register first. mask = regMask & ~_x86State.usedMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedMM) != 0) ? mask & ~preservedMM : mask); } // Then find the allocated and exchange later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedMM); } ASMJIT_ASSERT(idx != kRegIndexInvalid); X86CompilerVar* other = _x86State.mm[idx]; if (other) spillMmVar(other); emitMoveVar(var, idx, vflags); _freedMmRegister(oldIndex); _x86State.mm[idx] = var; // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; _allocatedMmRegister(idx); return; } // -------------------------------------------------------------------------- // [Find Unused MM] // -------------------------------------------------------------------------- // If regMask contains restricted registers which may be used then everything // is handled in this block. if (regMask != IntUtil::maskUpToIndex(kX86RegNumMm)) { // Try to find unallocated register first. mask = regMask & ~_x86State.usedMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedMM) != 0) ? mask & ~preservedMM : mask); ASMJIT_ASSERT(idx != kRegIndexInvalid); } // Then find the allocated and spill later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedMM); ASMJIT_ASSERT(idx != kRegIndexInvalid); // Spill register we need. spillCandidate = _x86State.mm[idx]; // Jump to spill part of allocation. goto L_Spill; } } // Home register code. if (idx == kRegIndexInvalid && home != kRegIndexInvalid) { if ((_x86State.usedMM & (1U << home)) == 0) idx = home; } if (idx == kRegIndexInvalid) { for (i = 0, mask = (1 << i); i < kX86RegNumMm; i++, mask <<= 1) { if ((_x86State.usedMM & mask) == 0) { // Convenience to alloc non-preserved first or non-preserved last. if (nonPreservedFirst) { if (idx != kRegIndexInvalid && (preservedMM & mask) != 0) continue; idx = i; // If current register is preserved, we should try to find different // one that is not. This can save one push / pop in prolog / epilog. if ((preservedMM & mask) == 0) break; } else { if (idx != kRegIndexInvalid && (preservedMM & mask) == 0) continue; idx = i; // The opposite. if ((preservedMM & mask) != 0) break; } } } } // -------------------------------------------------------------------------- // [Spill] // -------------------------------------------------------------------------- // If register is still not found, spill other variable. if (idx == kRegIndexInvalid) { if (spillCandidate == NULL) spillCandidate = _getSpillCandidateMM(); // Spill candidate not found? if (spillCandidate == NULL) { _compiler->setError(kErrorNoRegisters); return; } L_Spill: // Prevented variables can't be spilled. _getSpillCandidate() never returns // prevented variables, but when jumping to L_spill it can happen. if (spillCandidate->workOffset == _currentOffset) { _compiler->setError(kErrorOverlappedRegisters); return; } idx = spillCandidate->regIndex; spillMmVar(spillCandidate); } // -------------------------------------------------------------------------- // [Alloc] // -------------------------------------------------------------------------- if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0) { emitLoadVar(var, idx); } // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; // Update CompilerState. _allocatedVariable(var); } void X86CompilerContext::saveMmVar(X86CompilerVar* var) { // Can't save variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; emitSaveVar(var, idx); // Update X86CompilerVar. var->changed = false; } void X86CompilerContext::spillMmVar(X86CompilerVar* var) { // Can't spill variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; if (var->changed) emitSaveVar(var, idx); // Update X86CompilerVar. var->regIndex = kRegIndexInvalid; var->state = kVarStateMem; var->changed = false; // Update CompilerState. _x86State.mm[idx] = NULL; _freedMmRegister(idx); } void X86CompilerContext::allocXmmVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { // Fix the regMask (0 or full bit-array means that any register may be used). if (regMask == 0) regMask = IntUtil::maskUpToIndex(kX86RegNumXmm); regMask &= IntUtil::maskUpToIndex(kX86RegNumXmm); // Working variables. uint32_t i; uint32_t mask; // Last register code (aka home). uint32_t home = var->homeRegisterIndex; // New register code. uint32_t idx = kRegIndexInvalid; // Preserved XMM variables. uint32_t preservedXMM = var->funcScope->getDecl()->getXmmPreservedMask(); // Spill candidate. X86CompilerVar* spillCandidate = NULL; // Whether to alloc non-preserved first or last. bool nonPreservedFirst = true; if (this->getFunc()->isCaller()) nonPreservedFirst = (var->funcCall == NULL) || (var->funcCall->getOffset() >= var->lastItem->getOffset()); // -------------------------------------------------------------------------- // [Already Allocated] // -------------------------------------------------------------------------- // Go away if variable is already allocated. if (var->state == kVarStateReg) { uint32_t oldIndex = var->regIndex; // Already allocated in the right register. if (IntUtil::maskFromIndex(oldIndex) & regMask) return; // Try to find unallocated register first. mask = regMask & ~_x86State.usedXMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedXMM) != 0) ? mask & ~preservedXMM : mask); } // Then find the allocated and exchange later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedXMM); } ASMJIT_ASSERT(idx != kRegIndexInvalid); X86CompilerVar* other = _x86State.xmm[idx]; if (other) spillXmmVar(other); emitMoveVar(var, idx, vflags); _freedXmmRegister(oldIndex); _x86State.xmm[idx] = var; // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; _allocatedXmmRegister(idx); return; } // -------------------------------------------------------------------------- // [Find Unused XMM] // -------------------------------------------------------------------------- // If regMask contains restricted registers which may be used then everything // is handled in this block. if (regMask != IntUtil::maskUpToIndex(kX86RegNumXmm)) { // Try to find unallocated register first. mask = regMask & ~_x86State.usedXMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedXMM) != 0) ? mask & ~preservedXMM : mask); ASMJIT_ASSERT(idx != kRegIndexInvalid); } // Then find the allocated and spill later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedXMM); ASMJIT_ASSERT(idx != kRegIndexInvalid); // Spill register we need. spillCandidate = _x86State.xmm[idx]; // Jump to spill part of allocation. goto L_Spill; } } // Home register code. if (idx == kRegIndexInvalid && home != kRegIndexInvalid) { if ((_x86State.usedXMM & (1U << home)) == 0) idx = home; } if (idx == kRegIndexInvalid) { for (i = 0, mask = (1 << i); i < kX86RegNumXmm; i++, mask <<= 1) { if ((_x86State.usedXMM & mask) == 0) { // Convenience to alloc non-preserved first or non-preserved last. if (nonPreservedFirst) { if (idx != kRegIndexInvalid && (preservedXMM & mask) != 0) continue; idx = i; // If current register is preserved, we should try to find different // one that is not. This can save one push / pop in prolog / epilog. if ((preservedXMM & mask) == 0) break; } else { if (idx != kRegIndexInvalid && (preservedXMM & mask) == 0) continue; idx = i; // The opposite. if ((preservedXMM & mask) != 0) break; } } } } // -------------------------------------------------------------------------- // [Spill] // -------------------------------------------------------------------------- // If register is still not found, spill other variable. if (idx == kRegIndexInvalid) { if (spillCandidate == NULL) spillCandidate = _getSpillCandidateXMM(); // Spill candidate not found? if (spillCandidate == NULL) { _compiler->setError(kErrorNoRegisters); return; } L_Spill: // Prevented variables can't be spilled. _getSpillCandidate() never returns // prevented variables, but when jumping to L_spill it can happen. if (spillCandidate->workOffset == _currentOffset) { _compiler->setError(kErrorOverlappedRegisters); return; } idx = spillCandidate->regIndex; spillXmmVar(spillCandidate); } // -------------------------------------------------------------------------- // [Alloc] // -------------------------------------------------------------------------- if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0) { emitLoadVar(var, idx); } // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; // Update CompilerState. _allocatedVariable(var); } void X86CompilerContext::saveXmmVar(X86CompilerVar* var) { // Can't save variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; emitSaveVar(var, idx); // Update X86CompilerVar. var->changed = false; } void X86CompilerContext::spillXmmVar(X86CompilerVar* var) { // Can't spill variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; if (var->changed) emitSaveVar(var, idx); // Update CompilerVar. var->regIndex = kRegIndexInvalid; var->state = kVarStateMem; var->changed = false; // Update CompilerState. _x86State.xmm[idx] = NULL; _freedXmmRegister(idx); } void X86CompilerContext::emitLoadVar(X86CompilerVar* var, uint32_t regIndex) { X86Compiler* x86Compiler = getCompiler(); Mem m = _getVarMem(var); switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(regIndex), m); if (_emitComments) goto _AddComment; break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(regIndex), m); if (_emitComments) goto _AddComment; break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovSS, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovSD, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovAPS, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovAPD, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; } return; _AddComment: x86Compiler->getCurrentItem()->formatComment("Alloc %s", var->getName()); } void X86CompilerContext::emitSaveVar(X86CompilerVar* var, uint32_t regIndex) { // Caller must ensure that variable is allocated. ASMJIT_ASSERT(regIndex != kRegIndexInvalid); X86Compiler* x86Compiler = getCompiler(); Mem m = _getVarMem(var); switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, m, gpd(regIndex)); if (_emitComments) goto _AddComment; break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, m, gpq(regIndex)); if (_emitComments) goto _AddComment; break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, m, mm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovSS, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovSD, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovAPS, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovAPD, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; } return; _AddComment: x86Compiler->getCurrentItem()->formatComment("Spill %s", var->getName()); } void X86CompilerContext::emitMoveVar(X86CompilerVar* var, uint32_t regIndex, uint32_t vflags) { // Caller must ensure that the given variable is allocated. ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); X86Compiler* x86Compiler = getCompiler(); if ((vflags & kVarAllocRead) == 0) return; switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(regIndex), gpd(var->regIndex)); break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(regIndex), gpq(var->regIndex)); break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(regIndex), mm(var->regIndex)); break; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovSS, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovSD, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovAPS, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovAPD, xmm(regIndex), xmm(var->regIndex)); break; } } void X86CompilerContext::emitExchangeVar(X86CompilerVar* var, uint32_t regIndex, uint32_t vflags, X86CompilerVar* other) { // Caller must ensure that the given variable is allocated. ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); X86Compiler* x86Compiler = getCompiler(); // If other is not valid then we can just emit MOV (or other similar instruction). if (other == NULL) { emitMoveVar(var, regIndex, vflags); return; } // If we need to alloc for write-only operation then we can move other // variable away instead of exchanging them. if ((vflags & kVarAllocRead) == 0) { emitMoveVar(other, var->regIndex, kVarAllocRead); return; } switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstXchg, gpd(regIndex), gpd(var->regIndex)); break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstXchg, gpq(regIndex), gpq(var->regIndex)); break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; // NOTE: MM and XMM registers shoudln't be exchanged using this way, it's // correct, but instead of using one instruction we need three. case kX86VarTypeMm: { MmReg a = mm(regIndex); MmReg b = mm(var->regIndex); x86Compiler->emit(kX86InstPXor, a, b); x86Compiler->emit(kX86InstPXor, b, a); x86Compiler->emit(kX86InstPXor, a, b); break; } case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: { XmmReg a = xmm(regIndex); XmmReg b = xmm(var->regIndex); x86Compiler->emit(kX86InstXorPS, a, b); x86Compiler->emit(kX86InstXorPS, b, a); x86Compiler->emit(kX86InstXorPS, a, b); break; } case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: { XmmReg a = xmm(regIndex); XmmReg b = xmm(var->regIndex); x86Compiler->emit(kX86InstXorPD, a, b); x86Compiler->emit(kX86InstXorPD, b, a); x86Compiler->emit(kX86InstXorPD, a, b); break; } case kX86VarTypeXmm: { XmmReg a = xmm(regIndex); XmmReg b = xmm(var->regIndex); x86Compiler->emit(kX86InstPXor, a, b); x86Compiler->emit(kX86InstPXor, b, a); x86Compiler->emit(kX86InstPXor, a, b); break; } } } void X86CompilerContext::_postAlloc(X86CompilerVar* var, uint32_t vflags) { if (vflags & kVarAllocWrite) var->changed = true; } void X86CompilerContext::_markMemoryUsed(X86CompilerVar* var) { if (var->homeMemoryData != NULL) return; VarMemBlock* mem = _allocMemBlock(var->getSize()); if (!mem) return; var->homeMemoryData = mem; } Mem X86CompilerContext::_getVarMem(X86CompilerVar* var) { Mem m; m._mem.id = var->getId(); if (!var->isMemArgument()) m._mem.displacement = _adjustESP; _markMemoryUsed(var); return m; } static int32_t getSpillScore(X86CompilerVar* var, uint32_t currentOffset) { int32_t score = 0; ASMJIT_ASSERT(var->lastItem != NULL); uint32_t lastOffset = var->lastItem->getOffset(); if (lastOffset >= currentOffset) score += (int32_t)(lastOffset - currentOffset); // Each write access decreases probability of spill. score -= static_cast(var->regWriteCount) + static_cast(var->regRwCount); // Each read-only access increases probability of spill. score += static_cast(var->regReadCount); // Each memory access increases probability of spill. score += static_cast(var->memWriteCount) + static_cast(var->memRwCount); score += static_cast(var->memReadCount); return score; } X86CompilerVar* X86CompilerContext::_getSpillCandidateGP() { return _getSpillCandidateGeneric(_x86State.gp, kX86RegNumGp); } X86CompilerVar* X86CompilerContext::_getSpillCandidateMM() { return _getSpillCandidateGeneric(_x86State.mm, kX86RegNumMm); } X86CompilerVar* X86CompilerContext::_getSpillCandidateXMM() { return _getSpillCandidateGeneric(_x86State.xmm, kX86RegNumXmm); } X86CompilerVar* X86CompilerContext::_getSpillCandidateGeneric(X86CompilerVar** varArray, uint32_t count) { uint32_t i; X86CompilerVar* candidate = NULL; uint32_t candidatePriority = 0; int32_t candidateScore = 0; uint32_t currentOffset = _compiler->getCurrentItem()->getOffset(); for (i = 0; i < count; i++) { // Get variable. X86CompilerVar* cv = varArray[i]; // Never spill variables needed for next instruction. if (cv == NULL || cv->workOffset == _currentOffset) continue; uint32_t variablePriority = cv->getPriority(); int32_t variableScore = getSpillScore(cv, currentOffset); if ((candidate == NULL) || (variablePriority > candidatePriority) || (variablePriority == candidatePriority && variableScore > candidateScore)) { candidate = cv; candidatePriority = variablePriority; candidateScore = variableScore; } } return candidate; } void X86CompilerContext::_addActive(X86CompilerVar* var) { // Never call with variable that is already in active list. ASMJIT_ASSERT(var->nextActive == NULL); ASMJIT_ASSERT(var->prevActive == NULL); if (_active == NULL) { var->nextActive = var; var->prevActive = var; _active = var; } else { X86CompilerVar* vlast = static_cast(_active)->prevActive; vlast->nextActive = var; static_cast(_active)->prevActive = var; var->nextActive = static_cast(_active); var->prevActive = vlast; } } void X86CompilerContext::_freeActive(X86CompilerVar* var) { X86CompilerVar* next = var->nextActive; X86CompilerVar* prev = var->prevActive; if (prev == next) { _active = NULL; } else { if (_active == var) _active = next; prev->nextActive = next; next->prevActive = prev; } var->nextActive = NULL; var->prevActive = NULL; } void X86CompilerContext::_freeAllActive() { if (_active == NULL) return; X86CompilerVar* cur = static_cast(_active); for (;;) { X86CompilerVar* next = cur->nextActive; cur->nextActive = NULL; cur->prevActive = NULL; if (next == _active) break; } _active = NULL; } void X86CompilerContext::_allocatedVariable(X86CompilerVar* var) { uint32_t idx = var->regIndex; switch (var->getType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: _x86State.gp[idx] = var; _allocatedGpRegister(idx); break; case kX86VarTypeMm: _x86State.mm[idx] = var; _allocatedMmRegister(idx); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: _x86State.xmm[idx] = var; _allocatedXmmRegister(idx); break; default: ASMJIT_ASSERT(0); break; } } void X86CompilerContext::translateOperands(Operand* operands, uint32_t count) { X86Compiler* x86Compiler = getCompiler(); uint32_t i; // Translate variables to registers. for (i = 0; i < count; i++) { Operand& o = operands[i]; if (o.isVar()) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); o._reg.op = kOperandReg; o._reg.code |= cv->regIndex; } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { // Memory access. We just increment here actual displacement. X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); o._mem.displacement += cv->isMemArgument() ? _argumentsActualDisp : _variablesActualDisp; // NOTE: This is not enough, variable position will be patched later // by X86CompilerContext::_patchMemoryOperands(). } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.base); ASMJIT_ASSERT(cv != NULL); o._mem.base = cv->regIndex; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.index); ASMJIT_ASSERT(cv != NULL); o._mem.index = cv->regIndex; } } } } void X86CompilerContext::addBackwardCode(X86CompilerJmpInst* from) { _backCode.append(from); } void X86CompilerContext::addForwardJump(X86CompilerJmpInst* inst) { ForwardJumpData* j = reinterpret_cast(_zoneMemory.alloc(sizeof(ForwardJumpData))); if (j == NULL) { _compiler->setError(kErrorNoHeapMemory); return; } j->inst = inst; j->state = _saveState(); j->next = _forwardJumps; _forwardJumps = j; } X86CompilerState* X86CompilerContext::_saveState() { X86Compiler* x86Compiler = getCompiler(); // Get count of variables stored in memory. uint32_t memVarsCount = 0; X86CompilerVar* cur = static_cast(_active); if (cur) { do { if (cur->state == kVarStateMem) memVarsCount++; cur = cur->nextActive; } while (cur != _active); } // Alloc X86CompilerState structure (using zone allocator) and copy current // state into it. X86CompilerState* state = x86Compiler->_newState(memVarsCount); memcpy(state, &_x86State, sizeof(X86CompilerState)); // Clear changed flags. state->changedGP = 0; state->changedMM = 0; state->changedXMM = 0; uint i; uint mask; // Save variables stored in REGISTERs and CHANGE flag. for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (state->gp[i] && state->gp[i]->changed) state->changedGP |= mask; } for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { if (state->mm[i] && state->mm[i]->changed) state->changedMM |= mask; } for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (state->xmm[i] && state->xmm[i]->changed) state->changedXMM |= mask; } // Save variables stored in MEMORY. state->memVarsCount = memVarsCount; memVarsCount = 0; cur = static_cast(_active); if (cur) { do { if (cur->state == kVarStateMem) state->memVarsData[memVarsCount++] = cur; cur = cur->nextActive; } while (cur != _active); } // Finished. return state; } void X86CompilerContext::_assignState(X86CompilerState* state) { Compiler* compiler = getCompiler(); memcpy(&_x86State, state, sizeof(X86CompilerState)); _x86State.memVarsCount = 0; uint i, mask; X86CompilerVar* cv; // Unuse all variables first. cv = static_cast(_active); if (cv) { do { cv->state = kVarStateUnused; cv = cv->nextActive; } while (cv != _active); } // Assign variables stored in memory which are not unused. for (i = 0; i < state->memVarsCount; i++) { state->memVarsData[i]->state = kVarStateMem; } // Assign allocated variables. for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if ((cv = _x86State.gp[i]) != NULL) { cv->state = kVarStateReg; cv->regIndex = i; cv->changed = (_x86State.changedGP & mask) != 0; } } for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { if ((cv = _x86State.mm[i]) != NULL) { cv->state = kVarStateReg; cv->regIndex = i; cv->changed = (_x86State.changedMM & mask) != 0; } } for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if ((cv = _x86State.xmm[i]) != NULL) { cv->state = kVarStateReg; cv->regIndex = i; cv->changed = (_x86State.changedXMM & mask) != 0; } } } void X86CompilerContext::_restoreState(X86CompilerState* state, uint32_t targetOffset) { X86CompilerState* fromState = &_x86State; X86CompilerState* toState = state; // No change, rare... if (fromState == toState) return; uint base; uint i; // -------------------------------------------------------------------------- // Set target state to all variables. cv->tInt is target state in this func. // -------------------------------------------------------------------------- { // UNUSED. X86CompilerVar* cv = static_cast(_active); if (cv) { do { cv->tInt = kVarStateUnused; cv = cv->nextActive; } while (cv != _active); } // MEMORY. for (i = 0; i < toState->memVarsCount; i++) { toState->memVarsData[i]->tInt = kVarStateMem; } // REGISTER. for (i = 0; i < X86CompilerState::kStateRegCount; i++) { if ((cv = toState->regs[i]) != NULL) cv->tInt = kVarStateReg; } } // -------------------------------------------------------------------------- // [GP-Registers Switch] // -------------------------------------------------------------------------- // TODO. #if 0 for (i = 0; i < kX86RegNumGp; i++) { X86CompilerVar* fromVar = fromState->gp[i]; X86CompilerVar* toVar = toState->gp[i]; if (fromVar != toVar) { if (fromVar != NULL) { if (toVar != NULL) { if (fromState->gp[to } else { // It is possible that variable that was saved in state currently not // exists (tInt is target scope!). if (fromVar->tInt == kVarStateUnused) { unuseVar(fromVar, kVarStateUnused); } else { spillVar(fromVar); } } } } else if (fromVar != NULL) { uint32_t mask = IntUtil::maskFromIndex(i); // Variables are the same, we just need to compare changed flags. if ((fromState->changedGP & mask) && !(toState->changedGP & mask)) saveVar(fromVar); } } #endif // Spill. for (base = 0, i = 0; i < X86CompilerState::kStateRegCount; i++) { // Change the base offset (from base offset so the register index can be calculated). if (i == X86CompilerState::kStateRegMmBase || i == X86CompilerState::kStateRegXmmBase) base = i; uint32_t regIndex = i - base; X86CompilerVar* fromVar = fromState->regs[i]; X86CompilerVar* toVar = toState->regs[i]; if (fromVar != toVar) { // Spill the register. if (fromVar != NULL) { // It is possible that variable that was saved in state currently not // exists (tInt is target scope!). if (fromVar->tInt == kVarStateUnused) unuseVar(fromVar, kVarStateUnused); else spillVar(fromVar); } } else if (fromVar != NULL) { // Variables are the same, we just need to compare changed flags. uint32_t mask = IntUtil::maskFromIndex(regIndex); if ((fromState->changedGP & mask) && !(toState->changedGP & mask)) saveVar(fromVar); } } // Alloc. for (base = 0, i = 0; i < X86CompilerState::kStateRegCount; i++) { // Change the base offset (from base offset so the register index can be calculated). if (i == X86CompilerState::kStateRegMmBase || i == X86CompilerState::kStateRegXmmBase) base = i; X86CompilerVar* fromVar = fromState->regs[i]; X86CompilerVar* toVar = toState->regs[i]; if (fromVar != toVar) { // Alloc register. uint32_t regIndex = i - base; if (toVar != NULL) allocVar(toVar, IntUtil::maskFromIndex(regIndex), kVarAllocRead); } // TODO: //if (toVar) //{ // toVar->changed = to->changed; //} } // -------------------------------------------------------------------------- // Update used masks. // -------------------------------------------------------------------------- _x86State.usedGP = state->usedGP; _x86State.usedMM = state->usedMM; _x86State.usedXMM = state->usedXMM; // -------------------------------------------------------------------------- // Update changed masks and cleanup. // -------------------------------------------------------------------------- { X86CompilerVar* cv = static_cast(_active); if (cv) { do { if (cv->tInt != kVarStateReg) { cv->state = (int)cv->tInt; cv->changed = false; } cv->tInt = 0; cv = cv->nextActive; } while (cv != _active); } } } VarMemBlock* X86CompilerContext::_allocMemBlock(uint32_t size) { ASMJIT_ASSERT(size != 0); // First try to find mem blocks. VarMemBlock* mem = _memFree; VarMemBlock* prev = NULL; while (mem) { VarMemBlock* next = mem->nextFree; if (mem->size == size) { if (prev) prev->nextFree = next; else _memFree = next; mem->nextFree = NULL; return mem; } prev = mem; mem = next; } // Never mind, create new. mem = reinterpret_cast(_zoneMemory.alloc(sizeof(VarMemBlock))); if (mem == NULL) { _compiler->setError(kErrorNoHeapMemory); return NULL; } mem->offset = 0; mem->size = size; mem->nextUsed = _memUsed; mem->nextFree = NULL; _memUsed = mem; switch (size) { case 16: _mem16BlocksCount++; break; case 8: _mem8BlocksCount++; break; case 4: _mem4BlocksCount++; break; } return mem; } void X86CompilerContext::_freeMemBlock(VarMemBlock* mem) { // Add mem to free blocks. mem->nextFree = _memFree; _memFree = mem; } void X86CompilerContext::_allocMemoryOperands() { VarMemBlock* mem; // Variables are allocated in this order: // 1. 16-byte variables. // 2. 8-byte variables. // 3. 4-byte variables. // 4. All others. uint32_t start16 = 0; uint32_t start8 = start16 + _mem16BlocksCount * 16; uint32_t start4 = start8 + _mem8BlocksCount * 8; uint32_t startX = IntUtil::align(start4 + _mem4BlocksCount * 4, 16); for (mem = _memUsed; mem; mem = mem->nextUsed) { uint32_t size = mem->size; uint32_t offset; switch (size) { case 16: offset = start16; start16 += 16; break; case 8: offset = start8; start8 += 8; break; case 4: offset = start4; start4 += 4; break; default: // Align to 16 bytes if size is 16 or more. if (size >= 16) { size = IntUtil::align(size, 16); startX = IntUtil::align(startX, 16); } offset = startX; startX += size; break; } mem->offset = (int32_t)offset; _memBytesTotal += size; } } void X86CompilerContext::_patchMemoryOperands(CompilerItem* start, CompilerItem* stop) { CompilerItem* cur; for (cur = start;; cur = cur->getNext()) { if (cur->getType() == kCompilerItemInst) { Mem* mem = reinterpret_cast(cur)->_memOp; if (mem && (mem->_mem.id & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = getCompiler()->_getVar(mem->_mem.id); ASMJIT_ASSERT(cv != NULL); if (cv->isMemArgument()) { mem->_mem.base = _argumentsBaseReg; mem->_mem.displacement += cv->homeMemoryOffset; mem->_mem.displacement += _argumentsBaseOffset; } else { VarMemBlock* mb = reinterpret_cast(cv->homeMemoryData); ASMJIT_ASSERT(mb != NULL); mem->_mem.base = _variablesBaseReg; mem->_mem.displacement += mb->offset; mem->_mem.displacement += _variablesBaseOffset; } } } if (cur == stop) break; } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86util.cpp0000755000000000000000000000550012467662066017553 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::_x86UtilJccFromCond] // ============================================================================ const uint32_t _x86UtilJccFromCond[20] = { kX86InstJO, kX86InstJNO, kX86InstJB, kX86InstJAE, kX86InstJE, kX86InstJNE, kX86InstJBE, kX86InstJA, kX86InstJS, kX86InstJNS, kX86InstJPE, kX86InstJPO, kX86InstJL, kX86InstJGE, kX86InstJLE, kX86InstJG, kInstNone, kInstNone, kInstNone, kInstNone }; // ============================================================================ // [AsmJit::_x86UtilMovccFromCond] // ============================================================================ const uint32_t _x86UtilMovccFromCond[20] = { kX86InstCMovO, kX86InstCMovNO, kX86InstCMovB, kX86InstCMovAE, kX86InstCMovE, kX86InstCMovNE, kX86InstCMovBE, kX86InstCMovA, kX86InstCMovS, kX86InstCMovNS, kX86InstCMovPE, kX86InstCMovPO, kX86InstCMovL, kX86InstCMovGE, kX86InstCMovLE, kX86InstCMovG, kInstNone, kInstNone, kInstNone, kInstNone }; // ============================================================================ // [AsmJit::_x86UtilSetccFromCond] // ============================================================================ const uint32_t _x86UtilSetccFromCond[20] = { kX86InstSetO, kX86InstSetNO, kX86InstSetB, kX86InstSetAE, kX86InstSetE, kX86InstSetNE, kX86InstSetBE, kX86InstSetA, kX86InstSetS, kX86InstSetNS, kX86InstSetPE, kX86InstSetPO, kX86InstSetL, kX86InstSetGE, kX86InstSetLE, kX86InstSetG, kInstNone, kInstNone, kInstNone, kInstNone }; // ============================================================================ // [AsmJit::_x86UtilReversedCond] // ============================================================================ const uint32_t _x86UtilReversedCond[20] = { /* x86CondO -> */ kX86CondO, /* x86CondNO -> */ kX86CondNO, /* x86CondB -> */ kX86CondA, /* x86CondAE -> */ kX86CondBE, /* x86CondE -> */ kX86CondE, /* x86CondNE -> */ kX86CondNE, /* x86CondBE -> */ kX86CondAE, /* x86CondA -> */ kX86CondB, /* x86CondS -> */ kX86CondS, /* x86CondNS -> */ kX86CondNS, /* x86CondPE -> */ kX86CondPE, /* x86CondPO -> */ kX86CondPO, /* x86CondL -> */ kX86CondG, /* x86CondGE -> */ kX86CondLE, /* x86CondLE -> */ kX86CondGE, /* x86CondG -> */ kX86CondL, /* kX86CondFpuUnordered -> */ kX86CondFpuUnordered, /* kX86CondFpuNotUnordered -> */ kX86CondFpuNotUnordered, 0x12, 0x13 }; } // AsmJit namespace #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86defs.cpp0000755000000000000000000035373212467662066017534 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::x86InstName] // ============================================================================ // Following {DATA SECTION} is auto-generated by generate-defs.py tool using // X86InstInfo data. // // ${X86_INST_DATA:BEGIN} const char x86InstName[] = "\0" "adc\0" "add\0" "addpd\0" "addps\0" "addsd\0" "addss\0" "addsubpd\0" "addsubps\0" "amd_prefetch\0" "amd_prefetchw\0" "and\0" "andnpd\0" "andnps\0" "andpd\0" "andps\0" "blendpd\0" "blendps\0" "blendvpd\0" "blendvps\0" "bsf\0" "bsr\0" "bswap\0" "bt\0" "btc\0" "btr\0" "bts\0" "call\0" "cbw\0" "cdq\0" "cdqe\0" "clc\0" "cld\0" "clflush\0" "cmc\0" "cmova\0" "cmovae\0" "cmovb\0" "cmovbe\0" "cmovc\0" "cmove\0" "cmovg\0" "cmovge\0" "cmovl\0" "cmovle\0" "cmovna\0" "cmovnae\0" "cmovnb\0" "cmovnbe\0" "cmovnc\0" "cmovne\0" "cmovng\0" "cmovnge\0" "cmovnl\0" "cmovnle\0" "cmovno\0" "cmovnp\0" "cmovns\0" "cmovnz\0" "cmovo\0" "cmovp\0" "cmovpe\0" "cmovpo\0" "cmovs\0" "cmovz\0" "cmp\0" "cmppd\0" "cmpps\0" "cmpsd\0" "cmpss\0" "cmpxchg\0" "cmpxchg16b\0" "cmpxchg8b\0" "comisd\0" "comiss\0" "cpuid\0" "cqo\0" "crc32\0" "cvtdq2pd\0" "cvtdq2ps\0" "cvtpd2dq\0" "cvtpd2pi\0" "cvtpd2ps\0" "cvtpi2pd\0" "cvtpi2ps\0" "cvtps2dq\0" "cvtps2pd\0" "cvtps2pi\0" "cvtsd2si\0" "cvtsd2ss\0" "cvtsi2sd\0" "cvtsi2ss\0" "cvtss2sd\0" "cvtss2si\0" "cvttpd2dq\0" "cvttpd2pi\0" "cvttps2dq\0" "cvttps2pi\0" "cvttsd2si\0" "cvttss2si\0" "cwd\0" "cwde\0" "daa\0" "das\0" "dec\0" "div\0" "divpd\0" "divps\0" "divsd\0" "divss\0" "dppd\0" "dpps\0" "emms\0" "enter\0" "extractps\0" "f2xm1\0" "fabs\0" "fadd\0" "faddp\0" "fbld\0" "fbstp\0" "fchs\0" "fclex\0" "fcmovb\0" "fcmovbe\0" "fcmove\0" "fcmovnb\0" "fcmovnbe\0" "fcmovne\0" "fcmovnu\0" "fcmovu\0" "fcom\0" "fcomi\0" "fcomip\0" "fcomp\0" "fcompp\0" "fcos\0" "fdecstp\0" "fdiv\0" "fdivp\0" "fdivr\0" "fdivrp\0" "femms\0" "ffree\0" "fiadd\0" "ficom\0" "ficomp\0" "fidiv\0" "fidivr\0" "fild\0" "fimul\0" "fincstp\0" "finit\0" "fist\0" "fistp\0" "fisttp\0" "fisub\0" "fisubr\0" "fld\0" "fld1\0" "fldcw\0" "fldenv\0" "fldl2e\0" "fldl2t\0" "fldlg2\0" "fldln2\0" "fldpi\0" "fldz\0" "fmul\0" "fmulp\0" "fnclex\0" "fninit\0" "fnop\0" "fnsave\0" "fnstcw\0" "fnstenv\0" "fnstsw\0" "fpatan\0" "fprem\0" "fprem1\0" "fptan\0" "frndint\0" "frstor\0" "fsave\0" "fscale\0" "fsin\0" "fsincos\0" "fsqrt\0" "fst\0" "fstcw\0" "fstenv\0" "fstp\0" "fstsw\0" "fsub\0" "fsubp\0" "fsubr\0" "fsubrp\0" "ftst\0" "fucom\0" "fucomi\0" "fucomip\0" "fucomp\0" "fucompp\0" "fwait\0" "fxam\0" "fxch\0" "fxrstor\0" "fxsave\0" "fxtract\0" "fyl2x\0" "fyl2xp1\0" "haddpd\0" "haddps\0" "hsubpd\0" "hsubps\0" "idiv\0" "imul\0" "inc\0" "int3\0" "ja\0" "jae\0" "jb\0" "jbe\0" "jc\0" "je\0" "jg\0" "jge\0" "jl\0" "jle\0" "jna\0" "jnae\0" "jnb\0" "jnbe\0" "jnc\0" "jne\0" "jng\0" "jnge\0" "jnl\0" "jnle\0" "jno\0" "jnp\0" "jns\0" "jnz\0" "jo\0" "jp\0" "jpe\0" "jpo\0" "js\0" "jz\0" "jmp\0" "lddqu\0" "ldmxcsr\0" "lahf\0" "lea\0" "leave\0" "lfence\0" "maskmovdqu\0" "maskmovq\0" "maxpd\0" "maxps\0" "maxsd\0" "maxss\0" "mfence\0" "minpd\0" "minps\0" "minsd\0" "minss\0" "monitor\0" "mov\0" "movapd\0" "movaps\0" "movbe\0" "movd\0" "movddup\0" "movdq2q\0" "movdqa\0" "movdqu\0" "movhlps\0" "movhpd\0" "movhps\0" "movlhps\0" "movlpd\0" "movlps\0" "movmskpd\0" "movmskps\0" "movntdq\0" "movntdqa\0" "movnti\0" "movntpd\0" "movntps\0" "movntq\0" "movq\0" "movq2dq\0" "movsd\0" "movshdup\0" "movsldup\0" "movss\0" "movsx\0" "movsxd\0" "movupd\0" "movups\0" "movzx\0" "mov_ptr\0" "mpsadbw\0" "mul\0" "mulpd\0" "mulps\0" "mulsd\0" "mulss\0" "mwait\0" "neg\0" "nop\0" "not\0" "or\0" "orpd\0" "orps\0" "pabsb\0" "pabsd\0" "pabsw\0" "packssdw\0" "packsswb\0" "packusdw\0" "packuswb\0" "paddb\0" "paddd\0" "paddq\0" "paddsb\0" "paddsw\0" "paddusb\0" "paddusw\0" "paddw\0" "palignr\0" "pand\0" "pandn\0" "pause\0" "pavgb\0" "pavgw\0" "pblendvb\0" "pblendw\0" "pcmpeqb\0" "pcmpeqd\0" "pcmpeqq\0" "pcmpeqw\0" "pcmpestri\0" "pcmpestrm\0" "pcmpgtb\0" "pcmpgtd\0" "pcmpgtq\0" "pcmpgtw\0" "pcmpistri\0" "pcmpistrm\0" "pextrb\0" "pextrd\0" "pextrq\0" "pextrw\0" "pf2id\0" "pf2iw\0" "pfacc\0" "pfadd\0" "pfcmpeq\0" "pfcmpge\0" "pfcmpgt\0" "pfmax\0" "pfmin\0" "pfmul\0" "pfnacc\0" "pfpnacc\0" "pfrcp\0" "pfrcpit1\0" "pfrcpit2\0" "pfrsqit1\0" "pfrsqrt\0" "pfsub\0" "pfsubr\0" "phaddd\0" "phaddsw\0" "phaddw\0" "phminposuw\0" "phsubd\0" "phsubsw\0" "phsubw\0" "pi2fd\0" "pi2fw\0" "pinsrb\0" "pinsrd\0" "pinsrq\0" "pinsrw\0" "pmaddubsw\0" "pmaddwd\0" "pmaxsb\0" "pmaxsd\0" "pmaxsw\0" "pmaxub\0" "pmaxud\0" "pmaxuw\0" "pminsb\0" "pminsd\0" "pminsw\0" "pminub\0" "pminud\0" "pminuw\0" "pmovmskb\0" "pmovsxbd\0" "pmovsxbq\0" "pmovsxbw\0" "pmovsxdq\0" "pmovsxwd\0" "pmovsxwq\0" "pmovzxbd\0" "pmovzxbq\0" "pmovzxbw\0" "pmovzxdq\0" "pmovzxwd\0" "pmovzxwq\0" "pmuldq\0" "pmulhrsw\0" "pmulhuw\0" "pmulhw\0" "pmulld\0" "pmullw\0" "pmuludq\0" "pop\0" "popad\0" "popcnt\0" "popfd\0" "popfq\0" "por\0" "prefetch\0" "psadbw\0" "pshufb\0" "pshufd\0" "pshufw\0" "pshufhw\0" "pshuflw\0" "psignb\0" "psignd\0" "psignw\0" "pslld\0" "pslldq\0" "psllq\0" "psllw\0" "psrad\0" "psraw\0" "psrld\0" "psrldq\0" "psrlq\0" "psrlw\0" "psubb\0" "psubd\0" "psubq\0" "psubsb\0" "psubsw\0" "psubusb\0" "psubusw\0" "psubw\0" "pswapd\0" "ptest\0" "punpckhbw\0" "punpckhdq\0" "punpckhqdq\0" "punpckhwd\0" "punpcklbw\0" "punpckldq\0" "punpcklqdq\0" "punpcklwd\0" "push\0" "pushad\0" "pushfd\0" "pushfq\0" "pxor\0" "rcl\0" "rcpps\0" "rcpss\0" "rcr\0" "rdtsc\0" "rdtscp\0" "rep lodsb\0" "rep lodsd\0" "rep lodsq\0" "rep lodsw\0" "rep movsb\0" "rep movsd\0" "rep movsq\0" "rep movsw\0" "rep stosb\0" "rep stosd\0" "rep stosq\0" "rep stosw\0" "repe cmpsb\0" "repe cmpsd\0" "repe cmpsq\0" "repe cmpsw\0" "repe scasb\0" "repe scasd\0" "repe scasq\0" "repe scasw\0" "repne cmpsb\0" "repne cmpsd\0" "repne cmpsq\0" "repne cmpsw\0" "repne scasb\0" "repne scasd\0" "repne scasq\0" "repne scasw\0" "ret\0" "rol\0" "ror\0" "roundpd\0" "roundps\0" "roundsd\0" "roundss\0" "rsqrtps\0" "rsqrtss\0" "sahf\0" "sal\0" "sar\0" "sbb\0" "seta\0" "setae\0" "setb\0" "setbe\0" "setc\0" "sete\0" "setg\0" "setge\0" "setl\0" "setle\0" "setna\0" "setnae\0" "setnb\0" "setnbe\0" "setnc\0" "setne\0" "setng\0" "setnge\0" "setnl\0" "setnle\0" "setno\0" "setnp\0" "setns\0" "setnz\0" "seto\0" "setp\0" "setpe\0" "setpo\0" "sets\0" "setz\0" "sfence\0" "shl\0" "shld\0" "shr\0" "shrd\0" "shufpd\0" "shufps\0" "sqrtpd\0" "sqrtps\0" "sqrtsd\0" "sqrtss\0" "stc\0" "std\0" "stmxcsr\0" "sub\0" "subpd\0" "subps\0" "subsd\0" "subss\0" "test\0" "ucomisd\0" "ucomiss\0" "ud2\0" "unpckhpd\0" "unpckhps\0" "unpcklpd\0" "unpcklps\0" "xadd\0" "xchg\0" "xor\0" "xorpd\0" "xorps\0" ; #define INDEX_kInstNone 0 #define INDEX_kX86InstAdc 1 #define INDEX_kX86InstAdd 5 #define INDEX_kX86InstAddPD 9 #define INDEX_kX86InstAddPS 15 #define INDEX_kX86InstAddSD 21 #define INDEX_kX86InstAddSS 27 #define INDEX_kX86InstAddSubPD 33 #define INDEX_kX86InstAddSubPS 42 #define INDEX_kX86InstAmdPrefetch 51 #define INDEX_kX86InstAmdPrefetchW 64 #define INDEX_kX86InstAnd 78 #define INDEX_kX86InstAndnPD 82 #define INDEX_kX86InstAndnPS 89 #define INDEX_kX86InstAndPD 96 #define INDEX_kX86InstAndPS 102 #define INDEX_kX86InstBlendPD 108 #define INDEX_kX86InstBlendPS 116 #define INDEX_kX86InstBlendVPD 124 #define INDEX_kX86InstBlendVPS 133 #define INDEX_kX86InstBsf 142 #define INDEX_kX86InstBsr 146 #define INDEX_kX86InstBSwap 150 #define INDEX_kX86InstBt 156 #define INDEX_kX86InstBtc 159 #define INDEX_kX86InstBtr 163 #define INDEX_kX86InstBts 167 #define INDEX_kX86InstCall 171 #define INDEX_kX86InstCbw 176 #define INDEX_kX86InstCdq 180 #define INDEX_kX86InstCdqe 184 #define INDEX_kX86InstClc 189 #define INDEX_kX86InstCld 193 #define INDEX_kX86InstClFlush 197 #define INDEX_kX86InstCmc 205 #define INDEX_kX86InstCMovA 209 #define INDEX_kX86InstCMovAE 215 #define INDEX_kX86InstCMovB 222 #define INDEX_kX86InstCMovBE 228 #define INDEX_kX86InstCMovC 235 #define INDEX_kX86InstCMovE 241 #define INDEX_kX86InstCMovG 247 #define INDEX_kX86InstCMovGE 253 #define INDEX_kX86InstCMovL 260 #define INDEX_kX86InstCMovLE 266 #define INDEX_kX86InstCMovNA 273 #define INDEX_kX86InstCMovNAE 280 #define INDEX_kX86InstCMovNB 288 #define INDEX_kX86InstCMovNBE 295 #define INDEX_kX86InstCMovNC 303 #define INDEX_kX86InstCMovNE 310 #define INDEX_kX86InstCMovNG 317 #define INDEX_kX86InstCMovNGE 324 #define INDEX_kX86InstCMovNL 332 #define INDEX_kX86InstCMovNLE 339 #define INDEX_kX86InstCMovNO 347 #define INDEX_kX86InstCMovNP 354 #define INDEX_kX86InstCMovNS 361 #define INDEX_kX86InstCMovNZ 368 #define INDEX_kX86InstCMovO 375 #define INDEX_kX86InstCMovP 381 #define INDEX_kX86InstCMovPE 387 #define INDEX_kX86InstCMovPO 394 #define INDEX_kX86InstCMovS 401 #define INDEX_kX86InstCMovZ 407 #define INDEX_kX86InstCmp 413 #define INDEX_kX86InstCmpPD 417 #define INDEX_kX86InstCmpPS 423 #define INDEX_kX86InstCmpSD 429 #define INDEX_kX86InstCmpSS 435 #define INDEX_kX86InstCmpXCHG 441 #define INDEX_kX86InstCmpXCHG16B 449 #define INDEX_kX86InstCmpXCHG8B 460 #define INDEX_kX86InstComISD 470 #define INDEX_kX86InstComISS 477 #define INDEX_kX86InstCpuId 484 #define INDEX_kX86InstCqo 490 #define INDEX_kX86InstCrc32 494 #define INDEX_kX86InstCvtDQ2PD 500 #define INDEX_kX86InstCvtDQ2PS 509 #define INDEX_kX86InstCvtPD2DQ 518 #define INDEX_kX86InstCvtPD2PI 527 #define INDEX_kX86InstCvtPD2PS 536 #define INDEX_kX86InstCvtPI2PD 545 #define INDEX_kX86InstCvtPI2PS 554 #define INDEX_kX86InstCvtPS2DQ 563 #define INDEX_kX86InstCvtPS2PD 572 #define INDEX_kX86InstCvtPS2PI 581 #define INDEX_kX86InstCvtSD2SI 590 #define INDEX_kX86InstCvtSD2SS 599 #define INDEX_kX86InstCvtSI2SD 608 #define INDEX_kX86InstCvtSI2SS 617 #define INDEX_kX86InstCvtSS2SD 626 #define INDEX_kX86InstCvtSS2SI 635 #define INDEX_kX86InstCvttPD2DQ 644 #define INDEX_kX86InstCvttPD2PI 654 #define INDEX_kX86InstCvttPS2DQ 664 #define INDEX_kX86InstCvttPS2PI 674 #define INDEX_kX86InstCvttSD2SI 684 #define INDEX_kX86InstCvttSS2SI 694 #define INDEX_kX86InstCwd 704 #define INDEX_kX86InstCwde 708 #define INDEX_kX86InstDaa 713 #define INDEX_kX86InstDas 717 #define INDEX_kX86InstDec 721 #define INDEX_kX86InstDiv 725 #define INDEX_kX86InstDivPD 729 #define INDEX_kX86InstDivPS 735 #define INDEX_kX86InstDivSD 741 #define INDEX_kX86InstDivSS 747 #define INDEX_kX86InstDpPD 753 #define INDEX_kX86InstDpPS 758 #define INDEX_kX86InstEmms 763 #define INDEX_kX86InstEnter 768 #define INDEX_kX86InstExtractPS 774 #define INDEX_kX86InstF2XM1 784 #define INDEX_kX86InstFAbs 790 #define INDEX_kX86InstFAdd 795 #define INDEX_kX86InstFAddP 800 #define INDEX_kX86InstFBLd 806 #define INDEX_kX86InstFBStP 811 #define INDEX_kX86InstFCHS 817 #define INDEX_kX86InstFClex 822 #define INDEX_kX86InstFCMovB 828 #define INDEX_kX86InstFCMovBE 835 #define INDEX_kX86InstFCMovE 843 #define INDEX_kX86InstFCMovNB 850 #define INDEX_kX86InstFCMovNBE 858 #define INDEX_kX86InstFCMovNE 867 #define INDEX_kX86InstFCMovNU 875 #define INDEX_kX86InstFCMovU 883 #define INDEX_kX86InstFCom 890 #define INDEX_kX86InstFComI 895 #define INDEX_kX86InstFComIP 901 #define INDEX_kX86InstFComP 908 #define INDEX_kX86InstFComPP 914 #define INDEX_kX86InstFCos 921 #define INDEX_kX86InstFDecStP 926 #define INDEX_kX86InstFDiv 934 #define INDEX_kX86InstFDivP 939 #define INDEX_kX86InstFDivR 945 #define INDEX_kX86InstFDivRP 951 #define INDEX_kX86InstFEmms 958 #define INDEX_kX86InstFFree 964 #define INDEX_kX86InstFIAdd 970 #define INDEX_kX86InstFICom 976 #define INDEX_kX86InstFIComP 982 #define INDEX_kX86InstFIDiv 989 #define INDEX_kX86InstFIDivR 995 #define INDEX_kX86InstFILd 1002 #define INDEX_kX86InstFIMul 1007 #define INDEX_kX86InstFIncStP 1013 #define INDEX_kX86InstFInit 1021 #define INDEX_kX86InstFISt 1027 #define INDEX_kX86InstFIStP 1032 #define INDEX_kX86InstFISttP 1038 #define INDEX_kX86InstFISub 1045 #define INDEX_kX86InstFISubR 1051 #define INDEX_kX86InstFLd 1058 #define INDEX_kX86InstFLd1 1062 #define INDEX_kX86InstFLdCw 1067 #define INDEX_kX86InstFLdEnv 1073 #define INDEX_kX86InstFLdL2E 1080 #define INDEX_kX86InstFLdL2T 1087 #define INDEX_kX86InstFLdLg2 1094 #define INDEX_kX86InstFLdLn2 1101 #define INDEX_kX86InstFLdPi 1108 #define INDEX_kX86InstFLdZ 1114 #define INDEX_kX86InstFMul 1119 #define INDEX_kX86InstFMulP 1124 #define INDEX_kX86InstFNClex 1130 #define INDEX_kX86InstFNInit 1137 #define INDEX_kX86InstFNop 1144 #define INDEX_kX86InstFNSave 1149 #define INDEX_kX86InstFNStCw 1156 #define INDEX_kX86InstFNStEnv 1163 #define INDEX_kX86InstFNStSw 1171 #define INDEX_kX86InstFPAtan 1178 #define INDEX_kX86InstFPRem 1185 #define INDEX_kX86InstFPRem1 1191 #define INDEX_kX86InstFPTan 1198 #define INDEX_kX86InstFRndInt 1204 #define INDEX_kX86InstFRstor 1212 #define INDEX_kX86InstFSave 1219 #define INDEX_kX86InstFScale 1225 #define INDEX_kX86InstFSin 1232 #define INDEX_kX86InstFSinCos 1237 #define INDEX_kX86InstFSqrt 1245 #define INDEX_kX86InstFSt 1251 #define INDEX_kX86InstFStCw 1255 #define INDEX_kX86InstFStEnv 1261 #define INDEX_kX86InstFStP 1268 #define INDEX_kX86InstFStSw 1273 #define INDEX_kX86InstFSub 1279 #define INDEX_kX86InstFSubP 1284 #define INDEX_kX86InstFSubR 1290 #define INDEX_kX86InstFSubRP 1296 #define INDEX_kX86InstFTst 1303 #define INDEX_kX86InstFUCom 1308 #define INDEX_kX86InstFUComI 1314 #define INDEX_kX86InstFUComIP 1321 #define INDEX_kX86InstFUComP 1329 #define INDEX_kX86InstFUComPP 1336 #define INDEX_kX86InstFWait 1344 #define INDEX_kX86InstFXam 1350 #define INDEX_kX86InstFXch 1355 #define INDEX_kX86InstFXRstor 1360 #define INDEX_kX86InstFXSave 1368 #define INDEX_kX86InstFXtract 1375 #define INDEX_kX86InstFYL2X 1383 #define INDEX_kX86InstFYL2XP1 1389 #define INDEX_kX86InstHAddPD 1397 #define INDEX_kX86InstHAddPS 1404 #define INDEX_kX86InstHSubPD 1411 #define INDEX_kX86InstHSubPS 1418 #define INDEX_kX86InstIDiv 1425 #define INDEX_kX86InstIMul 1430 #define INDEX_kX86InstInc 1435 #define INDEX_kX86InstInt3 1439 #define INDEX_kX86InstJA 1444 #define INDEX_kX86InstJAE 1447 #define INDEX_kX86InstJB 1451 #define INDEX_kX86InstJBE 1454 #define INDEX_kX86InstJC 1458 #define INDEX_kX86InstJE 1461 #define INDEX_kX86InstJG 1464 #define INDEX_kX86InstJGE 1467 #define INDEX_kX86InstJL 1471 #define INDEX_kX86InstJLE 1474 #define INDEX_kX86InstJNA 1478 #define INDEX_kX86InstJNAE 1482 #define INDEX_kX86InstJNB 1487 #define INDEX_kX86InstJNBE 1491 #define INDEX_kX86InstJNC 1496 #define INDEX_kX86InstJNE 1500 #define INDEX_kX86InstJNG 1504 #define INDEX_kX86InstJNGE 1508 #define INDEX_kX86InstJNL 1513 #define INDEX_kX86InstJNLE 1517 #define INDEX_kX86InstJNO 1522 #define INDEX_kX86InstJNP 1526 #define INDEX_kX86InstJNS 1530 #define INDEX_kX86InstJNZ 1534 #define INDEX_kX86InstJO 1538 #define INDEX_kX86InstJP 1541 #define INDEX_kX86InstJPE 1544 #define INDEX_kX86InstJPO 1548 #define INDEX_kX86InstJS 1552 #define INDEX_kX86InstJZ 1555 #define INDEX_kX86InstJmp 1558 #define INDEX_kX86InstLdDQU 1562 #define INDEX_kX86InstLdMXCSR 1568 #define INDEX_kX86InstLahf 1576 #define INDEX_kX86InstLea 1581 #define INDEX_kX86InstLeave 1585 #define INDEX_kX86InstLFence 1591 #define INDEX_kX86InstMaskMovDQU 1598 #define INDEX_kX86InstMaskMovQ 1609 #define INDEX_kX86InstMaxPD 1618 #define INDEX_kX86InstMaxPS 1624 #define INDEX_kX86InstMaxSD 1630 #define INDEX_kX86InstMaxSS 1636 #define INDEX_kX86InstMFence 1642 #define INDEX_kX86InstMinPD 1649 #define INDEX_kX86InstMinPS 1655 #define INDEX_kX86InstMinSD 1661 #define INDEX_kX86InstMinSS 1667 #define INDEX_kX86InstMonitor 1673 #define INDEX_kX86InstMov 1681 #define INDEX_kX86InstMovAPD 1685 #define INDEX_kX86InstMovAPS 1692 #define INDEX_kX86InstMovBE 1699 #define INDEX_kX86InstMovD 1705 #define INDEX_kX86InstMovDDup 1710 #define INDEX_kX86InstMovDQ2Q 1718 #define INDEX_kX86InstMovDQA 1726 #define INDEX_kX86InstMovDQU 1733 #define INDEX_kX86InstMovHLPS 1740 #define INDEX_kX86InstMovHPD 1748 #define INDEX_kX86InstMovHPS 1755 #define INDEX_kX86InstMovLHPS 1762 #define INDEX_kX86InstMovLPD 1770 #define INDEX_kX86InstMovLPS 1777 #define INDEX_kX86InstMovMskPD 1784 #define INDEX_kX86InstMovMskPS 1793 #define INDEX_kX86InstMovNTDQ 1802 #define INDEX_kX86InstMovNTDQA 1810 #define INDEX_kX86InstMovNTI 1819 #define INDEX_kX86InstMovNTPD 1826 #define INDEX_kX86InstMovNTPS 1834 #define INDEX_kX86InstMovNTQ 1842 #define INDEX_kX86InstMovQ 1849 #define INDEX_kX86InstMovQ2DQ 1854 #define INDEX_kX86InstMovSD 1862 #define INDEX_kX86InstMovSHDup 1868 #define INDEX_kX86InstMovSLDup 1877 #define INDEX_kX86InstMovSS 1886 #define INDEX_kX86InstMovSX 1892 #define INDEX_kX86InstMovSXD 1898 #define INDEX_kX86InstMovUPD 1905 #define INDEX_kX86InstMovUPS 1912 #define INDEX_kX86InstMovZX 1919 #define INDEX_kX86InstMovPtr 1925 #define INDEX_kX86InstMPSADBW 1933 #define INDEX_kX86InstMul 1941 #define INDEX_kX86InstMulPD 1945 #define INDEX_kX86InstMulPS 1951 #define INDEX_kX86InstMulSD 1957 #define INDEX_kX86InstMulSS 1963 #define INDEX_kX86InstMWait 1969 #define INDEX_kX86InstNeg 1975 #define INDEX_kX86InstNop 1979 #define INDEX_kX86InstNot 1983 #define INDEX_kX86InstOr 1987 #define INDEX_kX86InstOrPD 1990 #define INDEX_kX86InstOrPS 1995 #define INDEX_kX86InstPAbsB 2000 #define INDEX_kX86InstPAbsD 2006 #define INDEX_kX86InstPAbsW 2012 #define INDEX_kX86InstPackSSDW 2018 #define INDEX_kX86InstPackSSWB 2027 #define INDEX_kX86InstPackUSDW 2036 #define INDEX_kX86InstPackUSWB 2045 #define INDEX_kX86InstPAddB 2054 #define INDEX_kX86InstPAddD 2060 #define INDEX_kX86InstPAddQ 2066 #define INDEX_kX86InstPAddSB 2072 #define INDEX_kX86InstPAddSW 2079 #define INDEX_kX86InstPAddUSB 2086 #define INDEX_kX86InstPAddUSW 2094 #define INDEX_kX86InstPAddW 2102 #define INDEX_kX86InstPAlignR 2108 #define INDEX_kX86InstPAnd 2116 #define INDEX_kX86InstPAndN 2121 #define INDEX_kX86InstPause 2127 #define INDEX_kX86InstPAvgB 2133 #define INDEX_kX86InstPAvgW 2139 #define INDEX_kX86InstPBlendVB 2145 #define INDEX_kX86InstPBlendW 2154 #define INDEX_kX86InstPCmpEqB 2162 #define INDEX_kX86InstPCmpEqD 2170 #define INDEX_kX86InstPCmpEqQ 2178 #define INDEX_kX86InstPCmpEqW 2186 #define INDEX_kX86InstPCmpEStrI 2194 #define INDEX_kX86InstPCmpEStrM 2204 #define INDEX_kX86InstPCmpGtB 2214 #define INDEX_kX86InstPCmpGtD 2222 #define INDEX_kX86InstPCmpGtQ 2230 #define INDEX_kX86InstPCmpGtW 2238 #define INDEX_kX86InstPCmpIStrI 2246 #define INDEX_kX86InstPCmpIStrM 2256 #define INDEX_kX86InstPExtrB 2266 #define INDEX_kX86InstPExtrD 2273 #define INDEX_kX86InstPExtrQ 2280 #define INDEX_kX86InstPExtrW 2287 #define INDEX_kX86InstPF2ID 2294 #define INDEX_kX86InstPF2IW 2300 #define INDEX_kX86InstPFAcc 2306 #define INDEX_kX86InstPFAdd 2312 #define INDEX_kX86InstPFCmpEQ 2318 #define INDEX_kX86InstPFCmpGE 2326 #define INDEX_kX86InstPFCmpGT 2334 #define INDEX_kX86InstPFMax 2342 #define INDEX_kX86InstPFMin 2348 #define INDEX_kX86InstPFMul 2354 #define INDEX_kX86InstPFNAcc 2360 #define INDEX_kX86InstPFPNAcc 2367 #define INDEX_kX86InstPFRcp 2375 #define INDEX_kX86InstPFRcpIt1 2381 #define INDEX_kX86InstPFRcpIt2 2390 #define INDEX_kX86InstPFRSqIt1 2399 #define INDEX_kX86InstPFRSqrt 2408 #define INDEX_kX86InstPFSub 2416 #define INDEX_kX86InstPFSubR 2422 #define INDEX_kX86InstPHAddD 2429 #define INDEX_kX86InstPHAddSW 2436 #define INDEX_kX86InstPHAddW 2444 #define INDEX_kX86InstPHMinPOSUW 2451 #define INDEX_kX86InstPHSubD 2462 #define INDEX_kX86InstPHSubSW 2469 #define INDEX_kX86InstPHSubW 2477 #define INDEX_kX86InstPI2FD 2484 #define INDEX_kX86InstPI2FW 2490 #define INDEX_kX86InstPInsRB 2496 #define INDEX_kX86InstPInsRD 2503 #define INDEX_kX86InstPInsRQ 2510 #define INDEX_kX86InstPInsRW 2517 #define INDEX_kX86InstPMAddUBSW 2524 #define INDEX_kX86InstPMAddWD 2534 #define INDEX_kX86InstPMaxSB 2542 #define INDEX_kX86InstPMaxSD 2549 #define INDEX_kX86InstPMaxSW 2556 #define INDEX_kX86InstPMaxUB 2563 #define INDEX_kX86InstPMaxUD 2570 #define INDEX_kX86InstPMaxUW 2577 #define INDEX_kX86InstPMinSB 2584 #define INDEX_kX86InstPMinSD 2591 #define INDEX_kX86InstPMinSW 2598 #define INDEX_kX86InstPMinUB 2605 #define INDEX_kX86InstPMinUD 2612 #define INDEX_kX86InstPMinUW 2619 #define INDEX_kX86InstPMovMskB 2626 #define INDEX_kX86InstPMovSXBD 2635 #define INDEX_kX86InstPMovSXBQ 2644 #define INDEX_kX86InstPMovSXBW 2653 #define INDEX_kX86InstPMovSXDQ 2662 #define INDEX_kX86InstPMovSXWD 2671 #define INDEX_kX86InstPMovSXWQ 2680 #define INDEX_kX86InstPMovZXBD 2689 #define INDEX_kX86InstPMovZXBQ 2698 #define INDEX_kX86InstPMovZXBW 2707 #define INDEX_kX86InstPMovZXDQ 2716 #define INDEX_kX86InstPMovZXWD 2725 #define INDEX_kX86InstPMovZXWQ 2734 #define INDEX_kX86InstPMulDQ 2743 #define INDEX_kX86InstPMulHRSW 2750 #define INDEX_kX86InstPMulHUW 2759 #define INDEX_kX86InstPMulHW 2767 #define INDEX_kX86InstPMulLD 2774 #define INDEX_kX86InstPMulLW 2781 #define INDEX_kX86InstPMulUDQ 2788 #define INDEX_kX86InstPop 2796 #define INDEX_kX86InstPopAD 2800 #define INDEX_kX86InstPopCnt 2806 #define INDEX_kX86InstPopFD 2813 #define INDEX_kX86InstPopFQ 2819 #define INDEX_kX86InstPOr 2825 #define INDEX_kX86InstPrefetch 2829 #define INDEX_kX86InstPSADBW 2838 #define INDEX_kX86InstPShufB 2845 #define INDEX_kX86InstPShufD 2852 #define INDEX_kX86InstPShufW 2859 #define INDEX_kX86InstPShufHW 2866 #define INDEX_kX86InstPShufLW 2874 #define INDEX_kX86InstPSignB 2882 #define INDEX_kX86InstPSignD 2889 #define INDEX_kX86InstPSignW 2896 #define INDEX_kX86InstPSllD 2903 #define INDEX_kX86InstPSllDQ 2909 #define INDEX_kX86InstPSllQ 2916 #define INDEX_kX86InstPSllW 2922 #define INDEX_kX86InstPSraD 2928 #define INDEX_kX86InstPSraW 2934 #define INDEX_kX86InstPSrlD 2940 #define INDEX_kX86InstPSrlDQ 2946 #define INDEX_kX86InstPSrlQ 2953 #define INDEX_kX86InstPSrlW 2959 #define INDEX_kX86InstPSubB 2965 #define INDEX_kX86InstPSubD 2971 #define INDEX_kX86InstPSubQ 2977 #define INDEX_kX86InstPSubSB 2983 #define INDEX_kX86InstPSubSW 2990 #define INDEX_kX86InstPSubUSB 2997 #define INDEX_kX86InstPSubUSW 3005 #define INDEX_kX86InstPSubW 3013 #define INDEX_kX86InstPSwapD 3019 #define INDEX_kX86InstPTest 3026 #define INDEX_kX86InstPunpckHBW 3032 #define INDEX_kX86InstPunpckHDQ 3042 #define INDEX_kX86InstPunpckHQDQ 3052 #define INDEX_kX86InstPunpckHWD 3063 #define INDEX_kX86InstPunpckLBW 3073 #define INDEX_kX86InstPunpckLDQ 3083 #define INDEX_kX86InstPunpckLQDQ 3093 #define INDEX_kX86InstPunpckLWD 3104 #define INDEX_kX86InstPush 3114 #define INDEX_kX86InstPushAD 3119 #define INDEX_kX86InstPushFD 3126 #define INDEX_kX86InstPushFQ 3133 #define INDEX_kX86InstPXor 3140 #define INDEX_kX86InstRcl 3145 #define INDEX_kX86InstRcpPS 3149 #define INDEX_kX86InstRcpSS 3155 #define INDEX_kX86InstRcr 3161 #define INDEX_kX86InstRdtsc 3165 #define INDEX_kX86InstRdtscP 3171 #define INDEX_kX86InstRepLodSB 3178 #define INDEX_kX86InstRepLodSD 3188 #define INDEX_kX86InstRepLodSQ 3198 #define INDEX_kX86InstRepLodSW 3208 #define INDEX_kX86InstRepMovSB 3218 #define INDEX_kX86InstRepMovSD 3228 #define INDEX_kX86InstRepMovSQ 3238 #define INDEX_kX86InstRepMovSW 3248 #define INDEX_kX86InstRepStoSB 3258 #define INDEX_kX86InstRepStoSD 3268 #define INDEX_kX86InstRepStoSQ 3278 #define INDEX_kX86InstRepStoSW 3288 #define INDEX_kX86InstRepECmpSB 3298 #define INDEX_kX86InstRepECmpSD 3309 #define INDEX_kX86InstRepECmpSQ 3320 #define INDEX_kX86InstRepECmpSW 3331 #define INDEX_kX86InstRepEScaSB 3342 #define INDEX_kX86InstRepEScaSD 3353 #define INDEX_kX86InstRepEScaSQ 3364 #define INDEX_kX86InstRepEScaSW 3375 #define INDEX_kX86InstRepNECmpSB 3386 #define INDEX_kX86InstRepNECmpSD 3398 #define INDEX_kX86InstRepNECmpSQ 3410 #define INDEX_kX86InstRepNECmpSW 3422 #define INDEX_kX86InstRepNEScaSB 3434 #define INDEX_kX86InstRepNEScaSD 3446 #define INDEX_kX86InstRepNEScaSQ 3458 #define INDEX_kX86InstRepNEScaSW 3470 #define INDEX_kX86InstRet 3482 #define INDEX_kX86InstRol 3486 #define INDEX_kX86InstRor 3490 #define INDEX_kX86InstRoundPD 3494 #define INDEX_kX86InstRoundPS 3502 #define INDEX_kX86InstRoundSD 3510 #define INDEX_kX86InstRoundSS 3518 #define INDEX_kX86InstRSqrtPS 3526 #define INDEX_kX86InstRSqrtSS 3534 #define INDEX_kX86InstSahf 3542 #define INDEX_kX86InstSal 3547 #define INDEX_kX86InstSar 3551 #define INDEX_kX86InstSbb 3555 #define INDEX_kX86InstSetA 3559 #define INDEX_kX86InstSetAE 3564 #define INDEX_kX86InstSetB 3570 #define INDEX_kX86InstSetBE 3575 #define INDEX_kX86InstSetC 3581 #define INDEX_kX86InstSetE 3586 #define INDEX_kX86InstSetG 3591 #define INDEX_kX86InstSetGE 3596 #define INDEX_kX86InstSetL 3602 #define INDEX_kX86InstSetLE 3607 #define INDEX_kX86InstSetNA 3613 #define INDEX_kX86InstSetNAE 3619 #define INDEX_kX86InstSetNB 3626 #define INDEX_kX86InstSetNBE 3632 #define INDEX_kX86InstSetNC 3639 #define INDEX_kX86InstSetNE 3645 #define INDEX_kX86InstSetNG 3651 #define INDEX_kX86InstSetNGE 3657 #define INDEX_kX86InstSetNL 3664 #define INDEX_kX86InstSetNLE 3670 #define INDEX_kX86InstSetNO 3677 #define INDEX_kX86InstSetNP 3683 #define INDEX_kX86InstSetNS 3689 #define INDEX_kX86InstSetNZ 3695 #define INDEX_kX86InstSetO 3701 #define INDEX_kX86InstSetP 3706 #define INDEX_kX86InstSetPE 3711 #define INDEX_kX86InstSetPO 3717 #define INDEX_kX86InstSetS 3723 #define INDEX_kX86InstSetZ 3728 #define INDEX_kX86InstSFence 3733 #define INDEX_kX86InstShl 3740 #define INDEX_kX86InstShld 3744 #define INDEX_kX86InstShr 3749 #define INDEX_kX86InstShrd 3753 #define INDEX_kX86InstShufPD 3758 #define INDEX_kX86InstShufPS 3765 #define INDEX_kX86InstSqrtPD 3772 #define INDEX_kX86InstSqrtPS 3779 #define INDEX_kX86InstSqrtSD 3786 #define INDEX_kX86InstSqrtSS 3793 #define INDEX_kX86InstStc 3800 #define INDEX_kX86InstStd 3804 #define INDEX_kX86InstStMXCSR 3808 #define INDEX_kX86InstSub 3816 #define INDEX_kX86InstSubPD 3820 #define INDEX_kX86InstSubPS 3826 #define INDEX_kX86InstSubSD 3832 #define INDEX_kX86InstSubSS 3838 #define INDEX_kX86InstTest 3844 #define INDEX_kX86InstUComISD 3849 #define INDEX_kX86InstUComISS 3857 #define INDEX_kX86InstUd2 3865 #define INDEX_kX86InstUnpckHPD 3869 #define INDEX_kX86InstUnpckHPS 3878 #define INDEX_kX86InstUnpckLPD 3887 #define INDEX_kX86InstUnpckLPS 3896 #define INDEX_kX86InstXadd 3905 #define INDEX_kX86InstXchg 3910 #define INDEX_kX86InstXor 3915 #define INDEX_kX86InstXorPD 3919 #define INDEX_kX86InstXorPS 3925 // ${X86_INST_DATA:END} // ============================================================================ // [AsmJit::x86InstInfo] // ============================================================================ #define INST(_Code_, _Name_, _Group_, _Flags_, _OpFlags0_, _OpFlags1_, _OpReg_, _OpCode0_, _OpCode1_) \ { _Code_, INDEX_##_Code_, _Group_, _Flags_, { _OpFlags0_, _OpFlags1_ }, _OpReg_, { _OpCode0_, _OpCode1_ } } #define G(_Group_) kX86InstGroup##_Group_ #define F(_Flags_) kX86InstFlag##_Flags_ #define O(_Op_) kX86InstOp##_Op_ const X86InstInfo x86InstInfo[] = { // Instruction code | Instruction name | Instruction group| Instruction flags| Operand flags[0] | Operand flags[1] | r| opCode[0] | opcode[1] INST(kInstNone , "" , G(None) , F(None) , 0 , 0 , 0, 0 , 0), INST(kX86InstAdc , "adc" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 2, 0x00000010, 0x00000080), INST(kX86InstAdd , "add" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0x00000000, 0x00000080), INST(kX86InstAddPD , "addpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F58, 0), INST(kX86InstAddPS , "addps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F58, 0), INST(kX86InstAddSD , "addsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F58, 0), INST(kX86InstAddSS , "addss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F58, 0), INST(kX86InstAddSubPD , "addsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FD0, 0), INST(kX86InstAddSubPS , "addsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FD0, 0), INST(kX86InstAmdPrefetch , "amd_prefetch" , G(Mem) , F(None) , O(Mem) , 0 , 0, 0x00000F0D, 0), INST(kX86InstAmdPrefetchW , "amd_prefetchw" , G(Mem) , F(None) , O(Mem) , 0 , 1, 0x00000F0D, 0), INST(kX86InstAnd , "and" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 4, 0x00000020, 0x00000080), INST(kX86InstAndnPD , "andnpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F55, 0), INST(kX86InstAndnPS , "andnps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F55, 0), INST(kX86InstAndPD , "andpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F54, 0), INST(kX86InstAndPS , "andps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F54, 0), INST(kX86InstBlendPD , "blendpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0D, 0), INST(kX86InstBlendPS , "blendps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0C, 0), INST(kX86InstBlendVPD , "blendvpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3815, 0), INST(kX86InstBlendVPS , "blendvps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3814, 0), INST(kX86InstBsf , "bsf" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBC, 0), INST(kX86InstBsr , "bsr" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBD, 0), INST(kX86InstBSwap , "bswap" , G(BSwap) , F(None) , O(Gqd) , 0 , 0, 0 , 0), INST(kX86InstBt , "bt" , G(BTest) , F(None) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 4, 0x00000FA3, 0x00000FBA), INST(kX86InstBtc , "btc" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 7, 0x00000FBB, 0x00000FBA), INST(kX86InstBtr , "btr" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 6, 0x00000FB3, 0x00000FBA), INST(kX86InstBts , "bts" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 5, 0x00000FAB, 0x00000FBA), INST(kX86InstCall , "call" , G(Call) , F(Jump) , O(Gqd) |O(Mem) , 0 , 0, 0 , 0), INST(kX86InstCbw , "cbw" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000098, 0), INST(kX86InstCdq , "cdq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000099, 0), INST(kX86InstCdqe , "cdqe" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000098, 0), INST(kX86InstClc , "clc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F8, 0), INST(kX86InstCld , "cld" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FC, 0), INST(kX86InstClFlush , "clflush" , G(Mem) , F(None) , O(Mem) , 0 , 7, 0x00000FAE, 0), INST(kX86InstCmc , "cmc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F5, 0), INST(kX86InstCMovA , "cmova" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), INST(kX86InstCMovAE , "cmovae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), INST(kX86InstCMovB , "cmovb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), INST(kX86InstCMovBE , "cmovbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), INST(kX86InstCMovC , "cmovc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), INST(kX86InstCMovE , "cmove" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), INST(kX86InstCMovG , "cmovg" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), INST(kX86InstCMovGE , "cmovge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), INST(kX86InstCMovL , "cmovl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), INST(kX86InstCMovLE , "cmovle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), INST(kX86InstCMovNA , "cmovna" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), INST(kX86InstCMovNAE , "cmovnae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), INST(kX86InstCMovNB , "cmovnb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), INST(kX86InstCMovNBE , "cmovnbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), INST(kX86InstCMovNC , "cmovnc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), INST(kX86InstCMovNE , "cmovne" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), INST(kX86InstCMovNG , "cmovng" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), INST(kX86InstCMovNGE , "cmovnge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), INST(kX86InstCMovNL , "cmovnl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), INST(kX86InstCMovNLE , "cmovnle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), INST(kX86InstCMovNO , "cmovno" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F41, 0), INST(kX86InstCMovNP , "cmovnp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), INST(kX86InstCMovNS , "cmovns" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F49, 0), INST(kX86InstCMovNZ , "cmovnz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), INST(kX86InstCMovO , "cmovo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F40, 0), INST(kX86InstCMovP , "cmovp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), INST(kX86InstCMovPE , "cmovpe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), INST(kX86InstCMovPO , "cmovpo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), INST(kX86InstCMovS , "cmovs" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F48, 0), INST(kX86InstCMovZ , "cmovz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), INST(kX86InstCmp , "cmp" , G(Arith) , F(None) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 7, 0x00000038, 0x00000080), INST(kX86InstCmpPD , "cmppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC2, 0), INST(kX86InstCmpPS , "cmpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC2, 0), INST(kX86InstCmpSD , "cmpsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FC2, 0), INST(kX86InstCmpSS , "cmpss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000FC2, 0), INST(kX86InstCmpXCHG , "cmpxchg" , G(RmReg) , F(Special)|F(Lockable), 0 , 0 , 0, 0x00000FB0, 0), INST(kX86InstCmpXCHG16B , "cmpxchg16b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 1 /* RexW */), INST(kX86InstCmpXCHG8B , "cmpxchg8b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 0), INST(kX86InstComISD , "comisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2F, 0), INST(kX86InstComISS , "comiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2F, 0), INST(kX86InstCpuId , "cpuid" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000FA2, 0), INST(kX86InstCqo , "cqo" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000099, 0), // TODO, set RexW bit instead? INST(kX86InstCrc32 , "crc32" , G(Crc32) , F(None) , O(Gqd) , O(GqdwbMem) , 0, 0xF20F38F0, 0), INST(kX86InstCvtDQ2PD , "cvtdq2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000FE6, 0), INST(kX86InstCvtDQ2PS , "cvtdq2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5B, 0), INST(kX86InstCvtPD2DQ , "cvtpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000FE6, 0), INST(kX86InstCvtPD2PI , "cvtpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2D, 0), INST(kX86InstCvtPD2PS , "cvtpd2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5A, 0), INST(kX86InstCvtPI2PD , "cvtpi2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(MmMem) , 0, 0x66000F2A, 0), INST(kX86InstCvtPI2PS , "cvtpi2ps" , G(MmuRmI) , F(None) , O(Xmm) , O(MmMem) , 0, 0x00000F2A, 0), INST(kX86InstCvtPS2DQ , "cvtps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5B, 0), INST(kX86InstCvtPS2PD , "cvtps2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5A, 0), INST(kX86InstCvtPS2PI , "cvtps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2D, 0), INST(kX86InstCvtSD2SI , "cvtsd2si" , G(MmuRmI) , F(Mov) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2D, 0), INST(kX86InstCvtSD2SS , "cvtsd2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5A, 0), INST(kX86InstCvtSI2SD , "cvtsi2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF2000F2A, 0), INST(kX86InstCvtSI2SS , "cvtsi2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF3000F2A, 0), INST(kX86InstCvtSS2SD , "cvtss2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5A, 0), INST(kX86InstCvtSS2SI , "cvtss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2D, 0), INST(kX86InstCvttPD2DQ , "cvttpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000FE6, 0), INST(kX86InstCvttPD2PI , "cvttpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2C, 0), INST(kX86InstCvttPS2DQ , "cvttps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5B, 0), INST(kX86InstCvttPS2PI , "cvttps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2C, 0), INST(kX86InstCvttSD2SI , "cvttsd2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2C, 0), INST(kX86InstCvttSS2SI , "cvttss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2C, 0), INST(kX86InstCwd , "cwd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000099, 0), INST(kX86InstCwde , "cwde" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000098, 0), INST(kX86InstDaa , "daa" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000027, 0), INST(kX86InstDas , "das" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000002F, 0), INST(kX86InstDec , "dec" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 1, 0x00000048, 0x000000FE), INST(kX86InstDiv , "div" , G(Rm) , F(Special) , 0 , 0 , 6, 0x000000F6, 0), INST(kX86InstDivPD , "divpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5E, 0), INST(kX86InstDivPS , "divps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5E, 0), INST(kX86InstDivSD , "divsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5E, 0), INST(kX86InstDivSS , "divss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5E, 0), INST(kX86InstDpPD , "dppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A41, 0), INST(kX86InstDpPS , "dpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A40, 0), INST(kX86InstEmms , "emms" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F77, 0), INST(kX86InstEnter , "enter" , G(Enter) , F(Special) , 0 , 0 , 0, 0x000000C8, 0), INST(kX86InstExtractPS , "extractps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A17, 0), INST(kX86InstF2XM1 , "f2xm1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F0, 0), INST(kX86InstFAbs , "fabs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E1, 0), INST(kX86InstFAdd , "fadd" , G(X87StM) , F(Fpu) , 0 , 0 , 0, 0xD8DCC0C0, 0), INST(kX86InstFAddP , "faddp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC0, 0), INST(kX86InstFBLd , "fbld" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DF, 0), INST(kX86InstFBStP , "fbstp" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DF, 0), INST(kX86InstFCHS , "fchs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E0, 0), INST(kX86InstFClex , "fclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE2, 0), INST(kX86InstFCMovB , "fcmovb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC0, 0), INST(kX86InstFCMovBE , "fcmovbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD0, 0), INST(kX86InstFCMovE , "fcmove" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC8, 0), INST(kX86InstFCMovNB , "fcmovnb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC0, 0), INST(kX86InstFCMovNBE , "fcmovnbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD0, 0), INST(kX86InstFCMovNE , "fcmovne" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC8, 0), INST(kX86InstFCMovNU , "fcmovnu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD8, 0), INST(kX86InstFCMovU , "fcmovu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD8, 0), INST(kX86InstFCom , "fcom" , G(X87StM) , F(Fpu) , 0 , 0 , 2, 0xD8DCD0D0, 0), INST(kX86InstFComI , "fcomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBF0, 0), INST(kX86InstFComIP , "fcomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFF0, 0), INST(kX86InstFComP , "fcomp" , G(X87StM) , F(Fpu) , 0 , 0 , 3, 0xD8DCD8D8, 0), INST(kX86InstFComPP , "fcompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DED9, 0), INST(kX86InstFCos , "fcos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FF, 0), INST(kX86InstFDecStP , "fdecstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F6, 0), INST(kX86InstFDiv , "fdiv" , G(X87StM) , F(Fpu) , 0 , 0 , 6, 0xD8DCF0F8, 0), INST(kX86InstFDivP , "fdivp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF8, 0), INST(kX86InstFDivR , "fdivr" , G(X87StM) , F(Fpu) , 0 , 0 , 7, 0xD8DCF8F0, 0), INST(kX86InstFDivRP , "fdivrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF0, 0), INST(kX86InstFEmms , "femms" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x00000F0E, 0), INST(kX86InstFFree , "ffree" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDC0, 0), INST(kX86InstFIAdd , "fiadd" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 0, 0xDEDA0000, 0), INST(kX86InstFICom , "ficom" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDEDA0000, 0), INST(kX86InstFIComP , "ficomp" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 3, 0xDEDA0000, 0), INST(kX86InstFIDiv , "fidiv" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 6, 0xDEDA0000, 0), INST(kX86InstFIDivR , "fidivr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 7, 0xDEDA0000, 0), INST(kX86InstFILd , "fild" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 0, 0xDFDBDF05, 0), INST(kX86InstFIMul , "fimul" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 1, 0xDEDA0000, 0), INST(kX86InstFIncStP , "fincstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F7, 0), INST(kX86InstFInit , "finit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE3, 0), INST(kX86InstFISt , "fist" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDFDB0000, 0), INST(kX86InstFIStP , "fistp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 3, 0xDFDBDF07, 0), INST(kX86InstFISttP , "fisttp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 1, 0xDFDBDD01, 0), INST(kX86InstFISub , "fisub" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 4, 0xDEDA0000, 0), INST(kX86InstFISubR , "fisubr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 5, 0xDEDA0000, 0), INST(kX86InstFLd , "fld" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 0, 0x00D9DD00, 0xD9C0DB05), INST(kX86InstFLd1 , "fld1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E8, 0), INST(kX86InstFLdCw , "fldcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 5, 0x000000D9, 0), INST(kX86InstFLdEnv , "fldenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000D9, 0), INST(kX86InstFLdL2E , "fldl2e" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EA, 0), INST(kX86InstFLdL2T , "fldl2t" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E9, 0), INST(kX86InstFLdLg2 , "fldlg2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EC, 0), INST(kX86InstFLdLn2 , "fldln2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9ED, 0), INST(kX86InstFLdPi , "fldpi" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EB, 0), INST(kX86InstFLdZ , "fldz" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EE, 0), INST(kX86InstFMul , "fmul" , G(X87StM) , F(Fpu) , 0 , 0 , 1, 0xD8DCC8C8, 0), INST(kX86InstFMulP , "fmulp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC8, 0), INST(kX86InstFNClex , "fnclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE2, 0), INST(kX86InstFNInit , "fninit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE3, 0), INST(kX86InstFNop , "fnop" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9D0, 0), INST(kX86InstFNSave , "fnsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DD, 0), INST(kX86InstFNStCw , "fnstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x000000D9, 0), INST(kX86InstFNStEnv , "fnstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000D9, 0), INST(kX86InstFNStSw , "fnstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x000000DD, 0x0000DFE0), INST(kX86InstFPAtan , "fpatan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F3, 0), INST(kX86InstFPRem , "fprem" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F8, 0), INST(kX86InstFPRem1 , "fprem1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F5, 0), INST(kX86InstFPTan , "fptan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F2, 0), INST(kX86InstFRndInt , "frndint" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FC, 0), INST(kX86InstFRstor , "frstor" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DD, 0), INST(kX86InstFSave , "fsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000DD, 0), INST(kX86InstFScale , "fscale" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FD, 0), INST(kX86InstFSin , "fsin" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FE, 0), INST(kX86InstFSinCos , "fsincos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FB, 0), INST(kX86InstFSqrt , "fsqrt" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FA, 0), INST(kX86InstFSt , "fst" , G(X87FldFst) , F(Fpu) , O(StM4_8) , 0 , 2, 0x00D9DD02, 0xDDD00000), INST(kX86InstFStCw , "fstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000D9, 0), INST(kX86InstFStEnv , "fstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000D9, 0), INST(kX86InstFStP , "fstp" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 3, 0x00D9DD03, 0xDDD8DB07), INST(kX86InstFStSw , "fstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000DD, 0x9B00DFE0), INST(kX86InstFSub , "fsub" , G(X87StM) , F(Fpu) , 0 , 0 , 4, 0xD8DCE0E8, 0), INST(kX86InstFSubP , "fsubp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE8, 0), INST(kX86InstFSubR , "fsubr" , G(X87StM) , F(Fpu) , 0 , 0 , 5, 0xD8DCE8E0, 0), INST(kX86InstFSubRP , "fsubrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE0, 0), INST(kX86InstFTst , "ftst" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E4, 0), INST(kX86InstFUCom , "fucom" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE0, 0), INST(kX86InstFUComI , "fucomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBE8, 0), INST(kX86InstFUComIP , "fucomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFE8, 0), INST(kX86InstFUComP , "fucomp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE8, 0), INST(kX86InstFUComPP , "fucompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DAE9, 0), INST(kX86InstFWait , "fwait" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x000000DB, 0), INST(kX86InstFXam , "fxam" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E5, 0), INST(kX86InstFXch , "fxch" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000D9C8, 0), INST(kX86InstFXRstor , "fxrstor" , G(Mem) , F(Fpu) , 0 , 0 , 1, 0x00000FAE, 0), INST(kX86InstFXSave , "fxsave" , G(Mem) , F(Fpu) , 0 , 0 , 0, 0x00000FAE, 0), INST(kX86InstFXtract , "fxtract" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F4, 0), INST(kX86InstFYL2X , "fyl2x" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F1, 0), INST(kX86InstFYL2XP1 , "fyl2xp1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F9, 0), INST(kX86InstHAddPD , "haddpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7C, 0), INST(kX86InstHAddPS , "haddps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7C, 0), INST(kX86InstHSubPD , "hsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7D, 0), INST(kX86InstHSubPS , "hsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7D, 0), INST(kX86InstIDiv , "idiv" , G(Rm) , F(Special) , 0 , 0 , 7, 0x000000F6, 0), INST(kX86InstIMul , "imul" , G(IMul) , F(Special) , 0 , 0 , 0, 0 , 0), INST(kX86InstInc , "inc" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 0, 0x00000040, 0x000000FE), INST(kX86InstInt3 , "int3" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000CC, 0), INST(kX86InstJA , "ja" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), INST(kX86InstJAE , "jae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), INST(kX86InstJB , "jb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), INST(kX86InstJBE , "jbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), INST(kX86InstJC , "jc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), INST(kX86InstJE , "je" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), INST(kX86InstJG , "jg" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), INST(kX86InstJGE , "jge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), INST(kX86InstJL , "jl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), INST(kX86InstJLE , "jle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), INST(kX86InstJNA , "jna" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), INST(kX86InstJNAE , "jnae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), INST(kX86InstJNB , "jnb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), INST(kX86InstJNBE , "jnbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), INST(kX86InstJNC , "jnc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), INST(kX86InstJNE , "jne" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), INST(kX86InstJNG , "jng" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), INST(kX86InstJNGE , "jnge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), INST(kX86InstJNL , "jnl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), INST(kX86InstJNLE , "jnle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), INST(kX86InstJNO , "jno" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x1 , 0), INST(kX86InstJNP , "jnp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), INST(kX86InstJNS , "jns" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x9 , 0), INST(kX86InstJNZ , "jnz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), INST(kX86InstJO , "jo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x0 , 0), INST(kX86InstJP , "jp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), INST(kX86InstJPE , "jpe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), INST(kX86InstJPO , "jpo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), INST(kX86InstJS , "js" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x8 , 0), INST(kX86InstJZ , "jz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), INST(kX86InstJmp , "jmp" , G(Jmp) , F(Jump) , 0 , 0 , 0, 0 , 0), INST(kX86InstLdDQU , "lddqu" , G(MmuRmI) , F(None) , O(Xmm) , O(Mem) , 0, 0xF2000FF0, 0), INST(kX86InstLdMXCSR , "ldmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 2, 0x00000FAE, 0), INST(kX86InstLahf , "lahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009F, 0), INST(kX86InstLea , "lea" , G(Lea) , F(None) , O(Gqd) , O(Mem) , 0, 0 , 0), INST(kX86InstLeave , "leave" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000000C9, 0), INST(kX86InstLFence , "lfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEE8, 0), INST(kX86InstMaskMovDQU , "maskmovdqu" , G(MmuRmI) , F(Special) , O(Xmm) , O(Xmm) , 0, 0x66000F57, 0), INST(kX86InstMaskMovQ , "maskmovq" , G(MmuRmI) , F(Special) , O(Mm) , O(Mm) , 0, 0x00000FF7, 0), INST(kX86InstMaxPD , "maxpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5F, 0), INST(kX86InstMaxPS , "maxps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5F, 0), INST(kX86InstMaxSD , "maxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5F, 0), INST(kX86InstMaxSS , "maxss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5F, 0), INST(kX86InstMFence , "mfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF0, 0), INST(kX86InstMinPD , "minpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5D, 0), INST(kX86InstMinPS , "minps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5D, 0), INST(kX86InstMinSD , "minsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5D, 0), INST(kX86InstMinSS , "minss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5D, 0), INST(kX86InstMonitor , "monitor" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C8, 0), INST(kX86InstMov , "mov" , G(Mov) , F(Mov) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0 , 0), INST(kX86InstMovAPD , "movapd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F28, 0x66000F29), INST(kX86InstMovAPS , "movaps" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F28, 0x00000F29), INST(kX86InstMovBE , "movbe" , G(MovBE) , F(Mov) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Mem) , 0, 0x000F38F0, 0x000F38F1), INST(kX86InstMovD , "movd" , G(MmuMovD) , F(Mov) , O(Gd)|O(MmXmmMem) , O(Gd)|O(MmXmmMem) , 0, 0 , 0), INST(kX86InstMovDDup , "movddup" , G(MmuMov) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F12, 0), INST(kX86InstMovDQ2Q , "movdq2q" , G(MmuMov) , F(Mov) , O(Mm) , O(Xmm) , 0, 0xF2000FD6, 0), INST(kX86InstMovDQA , "movdqa" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F6F, 0x66000F7F), INST(kX86InstMovDQU , "movdqu" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F6F, 0xF3000F7F), INST(kX86InstMovHLPS , "movhlps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F12, 0), INST(kX86InstMovHPD , "movhpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F16, 0x66000F17), INST(kX86InstMovHPS , "movhps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F16, 0x00000F17), INST(kX86InstMovLHPS , "movlhps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F16, 0), INST(kX86InstMovLPD , "movlpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F12, 0x66000F13), INST(kX86InstMovLPS , "movlps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F12, 0x00000F13), INST(kX86InstMovMskPD , "movmskpd" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x66000F50, 0), INST(kX86InstMovMskPS , "movmskps" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x00000F50, 0), INST(kX86InstMovNTDQ , "movntdq" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000FE7), INST(kX86InstMovNTDQA , "movntdqa" , G(MmuMov) , F(Mov) , O(Xmm) , O(Mem) , 0, 0x660F382A, 0), INST(kX86InstMovNTI , "movnti" , G(MmuMov) , F(Mov) , O(Mem) , O(Gqd) , 0, 0 , 0x00000FC3), INST(kX86InstMovNTPD , "movntpd" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000F2B), INST(kX86InstMovNTPS , "movntps" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x00000F2B), INST(kX86InstMovNTQ , "movntq" , G(MmuMov) , F(None) , O(Mem) , O(Mm) , 0, 0 , 0x00000FE7), INST(kX86InstMovQ , "movq" , G(MmuMovQ) , F(Mov) , O(Gq)|O(MmXmmMem) , O(Gq)|O(MmXmmMem) , 0, 0 , 0), INST(kX86InstMovQ2DQ , "movq2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(Mm) , 0, 0xF3000FD6, 0), INST(kX86InstMovSD , "movsd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF2000F10, 0xF2000F11), INST(kX86InstMovSHDup , "movshdup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F16, 0), INST(kX86InstMovSLDup , "movsldup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F12, 0), INST(kX86InstMovSS , "movss" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F10, 0xF3000F11), INST(kX86InstMovSX , "movsx" , G(MovSxMovZx) , F(None) , O(Gqdw) , O(GwbMem) , 0, 0x00000FBE, 0), INST(kX86InstMovSXD , "movsxd" , G(MovSxD) , F(None) , O(Gq) , O(GdMem) , 0, 0 , 0), INST(kX86InstMovUPD , "movupd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F10, 0x66000F11), INST(kX86InstMovUPS , "movups" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F10, 0x00000F11), INST(kX86InstMovZX , "movzx" , G(MovSxMovZx) , F(Mov) , O(Gqdw) , O(GwbMem) , 0, 0x00000FB6, 0), INST(kX86InstMovPtr , "mov_ptr" , G(MovPtr) , F(Mov)|F(Special), O(Gqdwb) , O(Imm) , 0, 0 , 0), INST(kX86InstMPSADBW , "mpsadbw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A42, 0), INST(kX86InstMul , "mul" , G(Rm) , F(Special) , 0 , 0 , 4, 0x000000F6, 0), INST(kX86InstMulPD , "mulpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F59, 0), INST(kX86InstMulPS , "mulps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F59, 0), INST(kX86InstMulSD , "mulsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F59, 0), INST(kX86InstMulSS , "mulss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F59, 0), INST(kX86InstMWait , "mwait" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C9, 0), INST(kX86InstNeg , "neg" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 3, 0x000000F6, 0), INST(kX86InstNop , "nop" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000090, 0), INST(kX86InstNot , "not" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 2, 0x000000F6, 0), INST(kX86InstOr , "or" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 1, 0x00000008, 0x00000080), INST(kX86InstOrPD , "orpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F56, 0), INST(kX86InstOrPS , "orps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F56, 0), INST(kX86InstPAbsB , "pabsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381C, 0), INST(kX86InstPAbsD , "pabsd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381E, 0), INST(kX86InstPAbsW , "pabsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381D, 0), INST(kX86InstPackSSDW , "packssdw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6B, 0), INST(kX86InstPackSSWB , "packsswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F63, 0), INST(kX86InstPackUSDW , "packusdw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F382B, 0), INST(kX86InstPackUSWB , "packuswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F67, 0), INST(kX86InstPAddB , "paddb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFC, 0), INST(kX86InstPAddD , "paddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFE, 0), INST(kX86InstPAddQ , "paddq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD4, 0), INST(kX86InstPAddSB , "paddsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEC, 0), INST(kX86InstPAddSW , "paddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FED, 0), INST(kX86InstPAddUSB , "paddusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDC, 0), INST(kX86InstPAddUSW , "paddusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDD, 0), INST(kX86InstPAddW , "paddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFD, 0), INST(kX86InstPAlignR , "palignr" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3A0F, 0), INST(kX86InstPAnd , "pand" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDB, 0), INST(kX86InstPAndN , "pandn" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDF, 0), INST(kX86InstPause , "pause" , G(Emit) , F(None) , 0 , 0 , 0, 0xF3000090, 0), INST(kX86InstPAvgB , "pavgb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE0, 0), INST(kX86InstPAvgW , "pavgw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE3, 0), INST(kX86InstPBlendVB , "pblendvb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3810, 0), INST(kX86InstPBlendW , "pblendw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0E, 0), INST(kX86InstPCmpEqB , "pcmpeqb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F74, 0), INST(kX86InstPCmpEqD , "pcmpeqd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F76, 0), INST(kX86InstPCmpEqQ , "pcmpeqq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3829, 0), INST(kX86InstPCmpEqW , "pcmpeqw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F75, 0), INST(kX86InstPCmpEStrI , "pcmpestri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A61, 0), INST(kX86InstPCmpEStrM , "pcmpestrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A60, 0), INST(kX86InstPCmpGtB , "pcmpgtb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F64, 0), INST(kX86InstPCmpGtD , "pcmpgtd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F66, 0), INST(kX86InstPCmpGtQ , "pcmpgtq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3837, 0), INST(kX86InstPCmpGtW , "pcmpgtw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F65, 0), INST(kX86InstPCmpIStrI , "pcmpistri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A63, 0), INST(kX86InstPCmpIStrM , "pcmpistrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A62, 0), INST(kX86InstPExtrB , "pextrb" , G(MmuExtract) , F(None) , O(Gd)|O(Gb)|O(Mem) , O(Xmm) , 0, 0x000F3A14, 0), INST(kX86InstPExtrD , "pextrd" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(Xmm) , 0, 0x000F3A16, 0), INST(kX86InstPExtrQ , "pextrq" , G(MmuExtract) , F(None) , O(Gqd) |O(Mem) , O(Xmm) , 1, 0x000F3A16, 0), INST(kX86InstPExtrW , "pextrw" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(MmXmm) , 0, 0x000F3A15, 0), INST(kX86InstPF2ID , "pf2id" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1D), INST(kX86InstPF2IW , "pf2iw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1C), INST(kX86InstPFAcc , "pfacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAE), INST(kX86InstPFAdd , "pfadd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9E), INST(kX86InstPFCmpEQ , "pfcmpeq" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB0), INST(kX86InstPFCmpGE , "pfcmpge" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x90), INST(kX86InstPFCmpGT , "pfcmpgt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA0), INST(kX86InstPFMax , "pfmax" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA4), INST(kX86InstPFMin , "pfmin" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x94), INST(kX86InstPFMul , "pfmul" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB4), INST(kX86InstPFNAcc , "pfnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8A), INST(kX86InstPFPNAcc , "pfpnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8E), INST(kX86InstPFRcp , "pfrcp" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x96), INST(kX86InstPFRcpIt1 , "pfrcpit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA6), INST(kX86InstPFRcpIt2 , "pfrcpit2" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB6), INST(kX86InstPFRSqIt1 , "pfrsqit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA7), INST(kX86InstPFRSqrt , "pfrsqrt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x97), INST(kX86InstPFSub , "pfsub" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9A), INST(kX86InstPFSubR , "pfsubr" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAA), INST(kX86InstPHAddD , "phaddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3802, 0), INST(kX86InstPHAddSW , "phaddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3803, 0), INST(kX86InstPHAddW , "phaddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3801, 0), INST(kX86InstPHMinPOSUW , "phminposuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3841, 0), INST(kX86InstPHSubD , "phsubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3806, 0), INST(kX86InstPHSubSW , "phsubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3807, 0), INST(kX86InstPHSubW , "phsubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3805, 0), INST(kX86InstPI2FD , "pi2fd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0D), INST(kX86InstPI2FW , "pi2fw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0C), INST(kX86InstPInsRB , "pinsrb" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A20, 0), INST(kX86InstPInsRD , "pinsrd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A22, 0), INST(kX86InstPInsRQ , "pinsrq" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gq) | O(Mem) , 0, 0x660F3A22, 0), INST(kX86InstPInsRW , "pinsrw" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(Gd) | O(Mem) , 0, 0x00000FC4, 0), INST(kX86InstPMAddUBSW , "pmaddubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3804, 0), INST(kX86InstPMAddWD , "pmaddwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF5, 0), INST(kX86InstPMaxSB , "pmaxsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383C, 0), INST(kX86InstPMaxSD , "pmaxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383D, 0), INST(kX86InstPMaxSW , "pmaxsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEE, 0), INST(kX86InstPMaxUB , "pmaxub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDE, 0), INST(kX86InstPMaxUD , "pmaxud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383F, 0), INST(kX86InstPMaxUW , "pmaxuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383E, 0), INST(kX86InstPMinSB , "pminsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3838, 0), INST(kX86InstPMinSD , "pminsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3839, 0), INST(kX86InstPMinSW , "pminsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEA, 0), INST(kX86InstPMinUB , "pminub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDA, 0), INST(kX86InstPMinUD , "pminud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383B, 0), INST(kX86InstPMinUW , "pminuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383A, 0), INST(kX86InstPMovMskB , "pmovmskb" , G(MmuRmI) , F(Mov) , O(Gqd) , O(MmXmm) , 0, 0x00000FD7, 0), INST(kX86InstPMovSXBD , "pmovsxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3821, 0), INST(kX86InstPMovSXBQ , "pmovsxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3822, 0), INST(kX86InstPMovSXBW , "pmovsxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3820, 0), INST(kX86InstPMovSXDQ , "pmovsxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3825, 0), INST(kX86InstPMovSXWD , "pmovsxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3823, 0), INST(kX86InstPMovSXWQ , "pmovsxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3824, 0), INST(kX86InstPMovZXBD , "pmovzxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3831, 0), INST(kX86InstPMovZXBQ , "pmovzxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3832, 0), INST(kX86InstPMovZXBW , "pmovzxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3830, 0), INST(kX86InstPMovZXDQ , "pmovzxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3835, 0), INST(kX86InstPMovZXWD , "pmovzxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3833, 0), INST(kX86InstPMovZXWQ , "pmovzxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3834, 0), INST(kX86InstPMulDQ , "pmuldq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3828, 0), INST(kX86InstPMulHRSW , "pmulhrsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380B, 0), INST(kX86InstPMulHUW , "pmulhuw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE4, 0), INST(kX86InstPMulHW , "pmulhw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE5, 0), INST(kX86InstPMulLD , "pmulld" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3840, 0), INST(kX86InstPMulLW , "pmullw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD5, 0), INST(kX86InstPMulUDQ , "pmuludq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF4, 0), INST(kX86InstPop , "pop" , G(Pop) , F(Special) , 0 , 0 , 0, 0x00000058, 0x0000008F), INST(kX86InstPopAD , "popad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000061, 0), INST(kX86InstPopCnt , "popcnt" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0xF3000FB8, 0), INST(kX86InstPopFD , "popfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), INST(kX86InstPopFQ , "popfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), INST(kX86InstPOr , "por" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEB, 0), INST(kX86InstPrefetch , "prefetch" , G(MmuPrefetch) , F(None) , O(Mem) , O(Imm) , 0, 0 , 0), INST(kX86InstPSADBW , "psadbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF6, 0), INST(kX86InstPShufB , "pshufb" , G(MmuRmI) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3800, 0), INST(kX86InstPShufD , "pshufd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F70, 0), INST(kX86InstPShufW , "pshufw" , G(MmuRmImm8) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F70, 0), INST(kX86InstPShufHW , "pshufhw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F70, 0), INST(kX86InstPShufLW , "pshuflw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F70, 0), INST(kX86InstPSignB , "psignb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3808, 0), INST(kX86InstPSignD , "psignd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380A, 0), INST(kX86InstPSignW , "psignw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3809, 0), INST(kX86InstPSllD , "pslld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF2, 0x00000F72), INST(kX86InstPSllDQ , "pslldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 7, 0 , 0x66000F73), INST(kX86InstPSllQ , "psllq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF3, 0x00000F73), INST(kX86InstPSllW , "psllw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF1, 0x00000F71), INST(kX86InstPSraD , "psrad" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE2, 0x00000F72), INST(kX86InstPSraW , "psraw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE1, 0x00000F71), INST(kX86InstPSrlD , "psrld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD2, 0x00000F72), INST(kX86InstPSrlDQ , "psrldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 3, 0 , 0x66000F73), INST(kX86InstPSrlQ , "psrlq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD3, 0x00000F73), INST(kX86InstPSrlW , "psrlw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD1, 0x00000F71), INST(kX86InstPSubB , "psubb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF8, 0), INST(kX86InstPSubD , "psubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFA, 0), INST(kX86InstPSubQ , "psubq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFB, 0), INST(kX86InstPSubSB , "psubsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE8, 0), INST(kX86InstPSubSW , "psubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE9, 0), INST(kX86InstPSubUSB , "psubusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD8, 0), INST(kX86InstPSubUSW , "psubusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD9, 0), INST(kX86InstPSubW , "psubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF9, 0), INST(kX86InstPSwapD , "pswapd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xBB), INST(kX86InstPTest , "ptest" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3817, 0), INST(kX86InstPunpckHBW , "punpckhbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F68, 0), INST(kX86InstPunpckHDQ , "punpckhdq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6A, 0), INST(kX86InstPunpckHQDQ , "punpckhqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6D, 0), INST(kX86InstPunpckHWD , "punpckhwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F69, 0), INST(kX86InstPunpckLBW , "punpcklbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F60, 0), INST(kX86InstPunpckLDQ , "punpckldq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F62, 0), INST(kX86InstPunpckLQDQ , "punpcklqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6C, 0), INST(kX86InstPunpckLWD , "punpcklwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F61, 0), INST(kX86InstPush , "push" , G(Push) , F(Special) , 0 , 0 , 6, 0x00000050, 0x000000FF), INST(kX86InstPushAD , "pushad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000060, 0), INST(kX86InstPushFD , "pushfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), INST(kX86InstPushFQ , "pushfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), INST(kX86InstPXor , "pxor" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEF, 0), INST(kX86InstRcl , "rcl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 2, 0 , 0), INST(kX86InstRcpPS , "rcpps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F53, 0), INST(kX86InstRcpSS , "rcpss" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F53, 0), INST(kX86InstRcr , "rcr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 3, 0 , 0), INST(kX86InstRdtsc , "rdtsc" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000F31, 0), INST(kX86InstRdtscP , "rdtscp" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01F9, 0), INST(kX86InstRepLodSB , "rep lodsb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 1 /* Size of mem */), INST(kX86InstRepLodSD , "rep lodsd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 4 /* Size of mem */), INST(kX86InstRepLodSQ , "rep lodsq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 8 /* Size of mem */), INST(kX86InstRepLodSW , "rep lodsw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 2 /* Size of mem */), INST(kX86InstRepMovSB , "rep movsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 1 /* Size of mem */), INST(kX86InstRepMovSD , "rep movsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 4 /* Size of mem */), INST(kX86InstRepMovSQ , "rep movsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 8 /* Size of mem */), INST(kX86InstRepMovSW , "rep movsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 2 /* Size of mem */), INST(kX86InstRepStoSB , "rep stosb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 1 /* Size of mem */), INST(kX86InstRepStoSD , "rep stosd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 4 /* Size of mem */), INST(kX86InstRepStoSQ , "rep stosq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 8 /* Size of mem */), INST(kX86InstRepStoSW , "rep stosw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 2 /* Size of mem */), INST(kX86InstRepECmpSB , "repe cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 1 /* Size of mem */), INST(kX86InstRepECmpSD , "repe cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 4 /* Size of mem */), INST(kX86InstRepECmpSQ , "repe cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 8 /* Size of mem */), INST(kX86InstRepECmpSW , "repe cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 2 /* Size of mem */), INST(kX86InstRepEScaSB , "repe scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 1 /* Size of mem */), INST(kX86InstRepEScaSD , "repe scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 4 /* Size of mem */), INST(kX86InstRepEScaSQ , "repe scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 8 /* Size of mem */), INST(kX86InstRepEScaSW , "repe scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 2 /* Size of mem */), INST(kX86InstRepNECmpSB , "repne cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 1 /* Size of mem */), INST(kX86InstRepNECmpSD , "repne cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 4 /* Size of mem */), INST(kX86InstRepNECmpSQ , "repne cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 8 /* Size of mem */), INST(kX86InstRepNECmpSW , "repne cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 2 /* Size of mem */), INST(kX86InstRepNEScaSB , "repne scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 1 /* Size of mem */), INST(kX86InstRepNEScaSD , "repne scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 4 /* Size of mem */), INST(kX86InstRepNEScaSQ , "repne scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 8 /* Size of mem */), INST(kX86InstRepNEScaSW , "repne scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 2 /* Size of mem */), INST(kX86InstRet , "ret" , G(Ret) , F(Special) , 0 , 0 , 0, 0 , 0), INST(kX86InstRol , "rol" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 0, 0 , 0), INST(kX86InstRor , "ror" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 1, 0 , 0), INST(kX86InstRoundPD , "roundpd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A09, 0), INST(kX86InstRoundPS , "roundps" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A08, 0), INST(kX86InstRoundSD , "roundsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0B, 0), INST(kX86InstRoundSS , "roundss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0A, 0), INST(kX86InstRSqrtPS , "rsqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F52, 0), INST(kX86InstRSqrtSS , "rsqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F52, 0), INST(kX86InstSahf , "sahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009E, 0), INST(kX86InstSal , "sal" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), INST(kX86InstSar , "sar" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 7, 0 , 0), INST(kX86InstSbb , "sbb" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 3, 0x00000018, 0x00000080), INST(kX86InstSetA , "seta" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), INST(kX86InstSetAE , "setae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), INST(kX86InstSetB , "setb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), INST(kX86InstSetBE , "setbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), INST(kX86InstSetC , "setc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), INST(kX86InstSetE , "sete" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), INST(kX86InstSetG , "setg" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), INST(kX86InstSetGE , "setge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), INST(kX86InstSetL , "setl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), INST(kX86InstSetLE , "setle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), INST(kX86InstSetNA , "setna" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), INST(kX86InstSetNAE , "setnae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), INST(kX86InstSetNB , "setnb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), INST(kX86InstSetNBE , "setnbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), INST(kX86InstSetNC , "setnc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), INST(kX86InstSetNE , "setne" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), INST(kX86InstSetNG , "setng" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), INST(kX86InstSetNGE , "setnge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), INST(kX86InstSetNL , "setnl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), INST(kX86InstSetNLE , "setnle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), INST(kX86InstSetNO , "setno" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F91, 0), INST(kX86InstSetNP , "setnp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), INST(kX86InstSetNS , "setns" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F99, 0), INST(kX86InstSetNZ , "setnz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), INST(kX86InstSetO , "seto" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F90, 0), INST(kX86InstSetP , "setp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), INST(kX86InstSetPE , "setpe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), INST(kX86InstSetPO , "setpo" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), INST(kX86InstSetS , "sets" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F98, 0), INST(kX86InstSetZ , "setz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), INST(kX86InstSFence , "sfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF8, 0), INST(kX86InstShl , "shl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), INST(kX86InstShld , "shld" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gb) , 0, 0x00000FA4, 0), INST(kX86InstShr , "shr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 5, 0 , 0), INST(kX86InstShrd , "shrd" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FAC, 0), INST(kX86InstShufPD , "shufpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC6, 0), INST(kX86InstShufPS , "shufps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC6, 0), INST(kX86InstSqrtPD , "sqrtpd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F51, 0), INST(kX86InstSqrtPS , "sqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F51, 0), INST(kX86InstSqrtSD , "sqrtsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F51, 0), INST(kX86InstSqrtSS , "sqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F51, 0), INST(kX86InstStc , "stc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F9, 0), INST(kX86InstStd , "std" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FD, 0), INST(kX86InstStMXCSR , "stmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 3, 0x00000FAE, 0), INST(kX86InstSub , "sub" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 5, 0x00000028, 0x00000080), INST(kX86InstSubPD , "subpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5C, 0), INST(kX86InstSubPS , "subps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5C, 0), INST(kX86InstSubSD , "subsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5C, 0), INST(kX86InstSubSS , "subss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5C, 0), INST(kX86InstTest , "test" , G(Test) , F(None) , O(GqdwbMem) , O(Gqdwb)|O(Imm) , 0, 0 , 0), INST(kX86InstUComISD , "ucomisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2E, 0), INST(kX86InstUComISS , "ucomiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2E, 0), INST(kX86InstUd2 , "ud2" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F0B, 0), INST(kX86InstUnpckHPD , "unpckhpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F15, 0), INST(kX86InstUnpckHPS , "unpckhps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F15, 0), INST(kX86InstUnpckLPD , "unpcklpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F14, 0), INST(kX86InstUnpckLPS , "unpcklps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F14, 0), INST(kX86InstXadd , "xadd" , G(RmReg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FC0, 0), INST(kX86InstXchg , "xchg" , G(Xchg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0 , 0), INST(kX86InstXor , "xor" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 6, 0x00000030, 0x00000080), INST(kX86InstXorPD , "xorpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F57, 0), INST(kX86InstXorPS , "xorps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F57, 0) }; #undef G #undef F #undef O #undef INST // ============================================================================ // [AsmJit::x86VarInfo] // ============================================================================ #define C(_Class_) kX86VarClass##_Class_ #define F(_Flag_) kX86VarFlag##_Flag_ const X86VarInfo x86VarInfo[] = { /* 0 */ { kX86RegTypeGpd , 4 , C(Gp) , 0 , "Gpd" }, /* 1 */ { kX86RegTypeGpq , 8 , C(Gp) , 0 , "Gpq" }, /* 2 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87" }, /* 3 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87.SS" }, /* 4 */ { kX86RegTypeX87 , 8 , C(X87), F(DP) , "X87.SD" }, /* 5 */ { kX86RegTypeMm , 8 , C(Mm) , 0 , "Mm" }, /* 6 */ { kX86RegTypeXmm , 16, C(Xmm), 0 , "Xmm" }, /* 7 */ { kX86RegTypeXmm , 4 , C(Xmm), F(SP) , "Xmm.SS" }, /* 8 */ { kX86RegTypeXmm , 8 , C(Xmm), F(DP) , "Xmm.SD" }, /* 9 */ { kX86RegTypeXmm , 16, C(Xmm), F(SP) | F(Packed), "Xmm.PS" }, /* 10 */ { kX86RegTypeXmm , 16, C(Xmm), F(DP) | F(Packed), "Xmm.PD" } }; #undef F #undef C } // AsmJit namespace #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86cpuinfo.h0000755000000000000000000000767712467662066017727 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86CPUINFO_H #define _ASMJIT_X86_X86CPUINFO_H // [Dependencies - AsmJit] #include "../core/cpuinfo.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CpuId] // ============================================================================ //! @brief X86 CpuId output. union X86CpuId { //! @brief EAX/EBX/ECX/EDX output. uint32_t i[4]; struct { //! @brief EAX output. uint32_t eax; //! @brief EBX output. uint32_t ebx; //! @brief ECX output. uint32_t ecx; //! @brief EDX output. uint32_t edx; }; }; // ============================================================================ // [AsmJit::X86CpuInfo] // ============================================================================ struct X86CpuInfo : public CpuInfo { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline X86CpuInfo(uint32_t size = sizeof(X86CpuInfo)) : CpuInfo(size) { } // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get processor type. inline uint32_t getProcessorType() const { return _processorType; } //! @brief Get brand index. inline uint32_t getBrandIndex() const { return _brandIndex; } //! @brief Get flush cache line size. inline uint32_t getFlushCacheLineSize() const { return _flushCacheLineSize; } //! @brief Get maximum logical processors count. inline uint32_t getMaxLogicalProcessors() const { return _maxLogicalProcessors; } //! @brief Get APIC physical ID. inline uint32_t getApicPhysicalId() const { return _apicPhysicalId; } // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- //! @brief Get global instance of @ref X86CpuInfo. static inline const X86CpuInfo* getGlobal() { return static_cast(CpuInfo::getGlobal()); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Processor type. uint32_t _processorType; //! @brief Brand index. uint32_t _brandIndex; //! @brief Flush cache line size in bytes. uint32_t _flushCacheLineSize; //! @brief Maximum number of addressable IDs for logical processors. uint32_t _maxLogicalProcessors; //! @brief Initial APIC ID. uint32_t _apicPhysicalId; }; // ============================================================================ // [AsmJit::x86CpuId] // ============================================================================ #if defined(ASMJIT_X86) || defined(ASMJIT_X64) //! @brief Calls CPUID instruction with eax == @a in and stores output to @a out. //! //! @c cpuid() function has one input parameter that is passed to cpuid through //! eax register and results in four output values representing result of cpuid //! instruction (eax, ebx, ecx and edx registers). ASMJIT_API void x86CpuId(uint32_t in, X86CpuId* out); // ============================================================================ // [AsmJit::x86CpuDetect] // ============================================================================ //! @brief Detect CPU features to CpuInfo structure @a out. //! //! @sa @c CpuInfo. ASMJIT_API void x86CpuDetect(X86CpuInfo* out); #endif // ASMJIT_X86 || ASMJIT_X64 //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86CPUINFO_H desmume-0.9.11/src/utils/AsmJit/x86/x86compilercontext.h0000755000000000000000000002654612467662066021477 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILERCONTEXT_H #define _ASMJIT_X86_X86COMPILERCONTEXT_H // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/podvector.h" #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CompilerContext] // ============================================================================ //! @internal //! //! @brief Compiler context is used by @ref X86Compiler. //! //! X86Compiler context is used during compilation and normally developer doesn't //! need access to it. The context is user per function (it's reset after each //! function is generated). struct X86CompilerContext : public CompilerContext { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerContext instance. ASMJIT_API X86CompilerContext(X86Compiler* x86Compiler); //! @brief Destroy the @ref X86CompilerContext instance. ASMJIT_API ~X86CompilerContext(); // -------------------------------------------------------------------------- // [Accessor] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get function as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Clear] // -------------------------------------------------------------------------- //! @brief Clear context, preparing it for next function generation. ASMJIT_API void _clear(); // -------------------------------------------------------------------------- // [Register Allocator] // -------------------------------------------------------------------------- //! @brief Allocate variable //! //! Calls @c allocGpVar, @c allocMmVar or @c allocXmmVar methods. ASMJIT_API void allocVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable. //! //! Calls @c saveGpVar, @c saveMmVar or @c saveXmmVar methods. ASMJIT_API void saveVar(X86CompilerVar* cv); //! @brief Spill variable. //! //! Calls @c spillGpVar, @c spillMmVar or @c spillXmmVar methods. ASMJIT_API void spillVar(X86CompilerVar* cv); //! @brief Unuse variable (didn't spill, just forget about it). ASMJIT_API void unuseVar(X86CompilerVar* cv, uint32_t toState); //! @brief Helper method that is called for each variable per item. inline void _unuseVarOnEndOfScope(CompilerItem* item, X86CompilerVar* cv) { if (cv->lastItem == item) unuseVar(cv, kVarStateUnused); } //! @overload inline void _unuseVarOnEndOfScope(CompilerItem* item, VarAllocRecord* rec) { X86CompilerVar* cv = rec->vdata; if (cv->lastItem == item || (rec->vflags & kVarAllocUnuseAfterUse)) unuseVar(cv, kVarStateUnused); } //! @overload inline void _unuseVarOnEndOfScope(CompilerItem* item, VarCallRecord* rec) { X86CompilerVar* v = rec->vdata; if (v->lastItem == item || (rec->flags & VarCallRecord::kFlagUnuseAfterUse)) unuseVar(v, kVarStateUnused); } //! @brief Allocate variable (GP). ASMJIT_API void allocGpVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable (GP). ASMJIT_API void saveGpVar(X86CompilerVar* cv); //! @brief Spill variable (GP). ASMJIT_API void spillGpVar(X86CompilerVar* cv); //! @brief Allocate variable (MM). ASMJIT_API void allocMmVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable (MM). ASMJIT_API void saveMmVar(X86CompilerVar* cv); //! @brief Spill variable (MM). ASMJIT_API void spillMmVar(X86CompilerVar* cv); //! @brief Allocate variable (XMM). ASMJIT_API void allocXmmVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable (XMM). ASMJIT_API void saveXmmVar(X86CompilerVar* cv); //! @brief Spill variable (XMM). ASMJIT_API void spillXmmVar(X86CompilerVar* cv); //! @brief Emit load variable instruction(s). ASMJIT_API void emitLoadVar(X86CompilerVar* cv, uint32_t regIndex); //! @brief Emit save variable instruction(s). ASMJIT_API void emitSaveVar(X86CompilerVar* cv, uint32_t regIndex); //! @brief Emit move variable instruction(s). ASMJIT_API void emitMoveVar(X86CompilerVar* cv, uint32_t regIndex, uint32_t vflags); //! @brief Emit exchange variable instruction(s). ASMJIT_API void emitExchangeVar(X86CompilerVar* cv, uint32_t regIndex, uint32_t vflags, X86CompilerVar* other); //! @brief Called each time a variable is alloceted. ASMJIT_API void _postAlloc(X86CompilerVar* cv, uint32_t vflags); //! @brief Marks variable home memory as used (must be called at least once //! for each variable that uses function local memory - stack). ASMJIT_API void _markMemoryUsed(X86CompilerVar* cv); ASMJIT_API Mem _getVarMem(X86CompilerVar* cv); ASMJIT_API X86CompilerVar* _getSpillCandidateGP(); ASMJIT_API X86CompilerVar* _getSpillCandidateMM(); ASMJIT_API X86CompilerVar* _getSpillCandidateXMM(); ASMJIT_API X86CompilerVar* _getSpillCandidateGeneric(X86CompilerVar** varArray, uint32_t count); inline bool _isActive(X86CompilerVar* cv) { return cv->nextActive != NULL; } ASMJIT_API void _addActive(X86CompilerVar* cv); ASMJIT_API void _freeActive(X86CompilerVar* cv); ASMJIT_API void _freeAllActive(); ASMJIT_API void _allocatedVariable(X86CompilerVar* cv); inline void _allocatedGpRegister(uint32_t index) { _x86State.usedGP |= IntUtil::maskFromIndex(index); _modifiedGpRegisters |= IntUtil::maskFromIndex(index); } inline void _allocatedMmRegister(uint32_t index) { _x86State.usedMM |= IntUtil::maskFromIndex(index); _modifiedMmRegisters |= IntUtil::maskFromIndex(index); } inline void _allocatedXmmRegister(uint32_t index) { _x86State.usedXMM |= IntUtil::maskFromIndex(index); _modifiedXmmRegisters |= IntUtil::maskFromIndex(index); } inline void _freedGpRegister(uint32_t index) { _x86State.usedGP &= ~IntUtil::maskFromIndex(index); } inline void _freedMmRegister(uint32_t index) { _x86State.usedMM &= ~IntUtil::maskFromIndex(index); } inline void _freedXmmRegister(uint32_t index) { _x86State.usedXMM &= ~IntUtil::maskFromIndex(index); } inline void _markGpRegisterModified(uint32_t index) { _modifiedGpRegisters |= IntUtil::maskFromIndex(index); } inline void _markMmRegisterModified(uint32_t index) { _modifiedMmRegisters |= IntUtil::maskFromIndex(index); } inline void _markXmmRegisterModified(uint32_t index) { _modifiedXmmRegisters |= IntUtil::maskFromIndex(index); } // TODO: Find code which uses this and improve. inline void _newRegisterHomeIndex(X86CompilerVar* cv, uint32_t idx) { if (cv->homeRegisterIndex == kRegIndexInvalid) cv->homeRegisterIndex = idx; cv->prefRegisterMask |= (1U << idx); } // TODO: Find code which uses this and improve. inline void _newRegisterHomeMask(X86CompilerVar* cv, uint32_t mask) { cv->prefRegisterMask |= mask; } // -------------------------------------------------------------------------- // [Operand Patcher] // -------------------------------------------------------------------------- ASMJIT_API void translateOperands(Operand* operands, uint32_t count); // -------------------------------------------------------------------------- // [Backward Code] // -------------------------------------------------------------------------- ASMJIT_API void addBackwardCode(X86CompilerJmpInst* from); // -------------------------------------------------------------------------- // [Forward Jump] // -------------------------------------------------------------------------- ASMJIT_API void addForwardJump(X86CompilerJmpInst* inst); // -------------------------------------------------------------------------- // [State] // -------------------------------------------------------------------------- ASMJIT_API X86CompilerState* _saveState(); ASMJIT_API void _assignState(X86CompilerState* state); ASMJIT_API void _restoreState(X86CompilerState* state, uint32_t targetOffset = kInvalidValue); // -------------------------------------------------------------------------- // [Memory Allocator] // -------------------------------------------------------------------------- ASMJIT_API VarMemBlock* _allocMemBlock(uint32_t size); ASMJIT_API void _freeMemBlock(VarMemBlock* mem); ASMJIT_API void _allocMemoryOperands(); ASMJIT_API void _patchMemoryOperands(CompilerItem* start, CompilerItem* stop); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief X86 specific compiler state (linked with @ref _state). X86CompilerState _x86State; //! @brief Forward jumps (single linked list). ForwardJumpData* _forwardJumps; //! @brief Global modified GP registers mask (per function). uint32_t _modifiedGpRegisters; //! @brief Global modified MM registers mask (per function). uint32_t _modifiedMmRegisters; //! @brief Global modified XMM registers mask (per function). uint32_t _modifiedXmmRegisters; //! @brief Whether the EBP/RBP register can be used by register allocator. uint32_t _allocableEBP; //! @brief ESP adjust constant (changed during PUSH/POP or when using //! stack. int _adjustESP; //! @brief Function arguments base pointer (register). uint32_t _argumentsBaseReg; //! @brief Function arguments base offset. int32_t _argumentsBaseOffset; //! @brief Function arguments displacement. int32_t _argumentsActualDisp; //! @brief Function variables base pointer (register). uint32_t _variablesBaseReg; //! @brief Function variables base offset. int32_t _variablesBaseOffset; //! @brief Function variables displacement. int32_t _variablesActualDisp; //! @brief Used memory blocks (for variables, here is each created mem block //! that can be also in _memFree list). VarMemBlock* _memUsed; //! @brief Free memory blocks (freed, prepared for another allocation). VarMemBlock* _memFree; //! @brief Count of 4-byte memory blocks used by the function. uint32_t _mem4BlocksCount; //! @brief Count of 8-byte memory blocks used by the function. uint32_t _mem8BlocksCount; //! @brief Count of 16-byte memory blocks used by the function. uint32_t _mem16BlocksCount; //! @brief Count of total bytes of stack memory used by the function. uint32_t _memBytesTotal; //! @brief List of items which need to be translated. These items are filled //! by @c addBackwardCode(). PodVector _backCode; //! @brief Backward code position (starts at 0). sysuint_t _backPos; //! @brief Whether to emit comments. bool _emitComments; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILERCONTEXT_H desmume-0.9.11/src/utils/AsmJit/x86/x86cpuinfo.cpp0000755000000000000000000002335012467662066020244 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86cpuinfo.h" #include "../x86/x86defs.h" // 2009-02-05: Thanks to Mike Tajmajer for VC7.1 compiler support. It shouldn't // affect x64 compilation, because x64 compiler starts with VS2005 (VC8.0). #if defined(_MSC_VER) # if _MSC_VER >= 1400 # include # endif // _MSC_VER >= 1400 (>= VS2005) #endif // _MSC_VER // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86CpuVendor] // ============================================================================ struct X86CpuVendor { uint32_t id; char text[12]; }; static const X86CpuVendor x86CpuVendor[] = { { kCpuIntel , { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' } }, { kCpuAmd , { 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' } }, { kCpuAmd , { 'A', 'M', 'D', 'i', 's', 'b', 'e', 't', 't', 'e', 'r', '!' } }, { kCpuNSM , { 'G', 'e', 'o', 'd', 'e', ' ', 'b', 'y', ' ', 'N', 'S', 'C' } }, { kCpuNSM , { 'C', 'y', 'r', 'i', 'x', 'I', 'n', 's', 't', 'e', 'a', 'd' } }, { kCpuTransmeta, { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'T', 'M', 'x', '8', '6' } }, { kCpuTransmeta, { 'T', 'r', 'a', 'n', 's', 'm', 'e', 't', 'a', 'C', 'P', 'U' } }, { kCpuVia , { 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 } }, { kCpuVia , { 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' } } }; static inline bool x86CpuVendorEq(const X86CpuVendor& info, const char* vendorString) { const uint32_t* a = reinterpret_cast(info.text); const uint32_t* b = reinterpret_cast(vendorString); return (a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]) ; } // ============================================================================ // [AsmJit::x86CpuSimplifyBrandString] // ============================================================================ static inline void x86CpuSimplifyBrandString(char* s) { // Always clear the current character in the buffer. This ensures that there // is no garbage after the string NULL terminator. char* d = s; char prev = 0; char curr = s[0]; s[0] = '\0'; for (;;) { if (curr == 0) break; if (curr == ' ') { if (prev == '@') goto _Skip; if (s[1] == ' ' || s[1] == '@') goto _Skip; } d[0] = curr; d++; prev = curr; _Skip: curr = *++s; s[0] = '\0'; } d[0] = '\0'; } // ============================================================================ // [AsmJit::x86CpuId] // ============================================================================ // This is messy, I know. cpuid is implemented as intrinsic in VS2005, but // we should support other compilers as well. Main problem is that MS compilers // in 64-bit mode not allows to use inline assembler, so we need intrinsic and // we need also asm version. // x86CpuId() and detectCpuInfo() for x86 and x64 platforms begins here. #if defined(ASMJIT_X86) || defined(ASMJIT_X64) void x86CpuId(uint32_t in, X86CpuId* out) { #if defined(_MSC_VER) // 2009-02-05: Thanks to Mike Tajmajer for supporting VC7.1 compiler. // ASMJIT_X64 is here only for readibility, only VS2005 can compile 64-bit code. # if _MSC_VER >= 1400 || defined(ASMJIT_X64) // Done by intrinsics. __cpuid(reinterpret_cast(out->i), in); # else // _MSC_VER < 1400 uint32_t cpuid_in = in; uint32_t* cpuid_out = out->i; __asm { mov eax, cpuid_in mov edi, cpuid_out cpuid mov dword ptr[edi + 0], eax mov dword ptr[edi + 4], ebx mov dword ptr[edi + 8], ecx mov dword ptr[edi + 12], edx } # endif // _MSC_VER < 1400 #elif defined(__GNUC__) // Note, need to preserve ebx/rbx register! # if defined(ASMJIT_X86) # define __myCpuId(a, b, c, d, inp) \ asm ("mov %%ebx, %%edi\n" \ "cpuid\n" \ "xchg %%edi, %%ebx\n" \ : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) # else # define __myCpuId(a, b, c, d, inp) \ asm ("mov %%rbx, %%rdi\n" \ "cpuid\n" \ "xchg %%rdi, %%rbx\n" \ : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) # endif __myCpuId(out->eax, out->ebx, out->ecx, out->edx, in); #endif // Compiler #ifdef. } // ============================================================================ // [AsmJit::x86CpuDetect] // ============================================================================ void x86CpuDetect(X86CpuInfo* out) { uint32_t i; X86CpuId regs; // Clear everything except the '_size' member. memset(reinterpret_cast(out) + sizeof(uint32_t), 0, sizeof(CpuInfo) - sizeof(uint32_t)); // Fill safe defaults. memcpy(out->_vendorString, "Unknown", 8); out->_numberOfProcessors = CpuInfo::detectNumberOfProcessors(); // Get vendor string/id. x86CpuId(0, ®s); memcpy(out->_vendorString, ®s.ebx, 4); memcpy(out->_vendorString + 4, ®s.edx, 4); memcpy(out->_vendorString + 8, ®s.ecx, 4); for (i = 0; i < 3; i++) { if (x86CpuVendorEq(x86CpuVendor[i], out->_vendorString)) { out->_vendorId = x86CpuVendor[i].id; break; } } // Get feature flags in ecx/edx, and family/model in eax. x86CpuId(1, ®s); // Fill family and model fields. out->_family = (regs.eax >> 8) & 0x0F; out->_model = (regs.eax >> 4) & 0x0F; out->_stepping = (regs.eax ) & 0x0F; // Use extended family and model fields. if (out->_family == 0x0F) { out->_family += ((regs.eax >> 20) & 0xFF); out->_model += ((regs.eax >> 16) & 0x0F) << 4; } out->_processorType = ((regs.eax >> 12) & 0x03); out->_brandIndex = ((regs.ebx ) & 0xFF); out->_flushCacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8; out->_maxLogicalProcessors = ((regs.ebx >> 16) & 0xFF); out->_apicPhysicalId = ((regs.ebx >> 24) & 0xFF); if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureSse3; if (regs.ecx & 0x00000002U) out->_features |= kX86FeaturePclMulDQ; if (regs.ecx & 0x00000008U) out->_features |= kX86FeatureMonitorMWait; if (regs.ecx & 0x00000200U) out->_features |= kX86FeatureSsse3; if (regs.ecx & 0x00002000U) out->_features |= kX86FeatureCmpXchg16B; if (regs.ecx & 0x00080000U) out->_features |= kX86FeatureSse41; if (regs.ecx & 0x00100000U) out->_features |= kX86FeatureSse42; if (regs.ecx & 0x00400000U) out->_features |= kX86FeatureMovBE; if (regs.ecx & 0x00800000U) out->_features |= kX86FeaturePopCnt; if (regs.ecx & 0x10000000U) out->_features |= kX86FeatureAvx; if (regs.edx & 0x00000010U) out->_features |= kX86FeatureRdtsc; if (regs.edx & 0x00000100U) out->_features |= kX86FeatureCmpXchg8B; if (regs.edx & 0x00008000U) out->_features |= kX86FeatureCMov; if (regs.edx & 0x00800000U) out->_features |= kX86FeatureMmx; if (regs.edx & 0x01000000U) out->_features |= kX86FeatureFXSR; if (regs.edx & 0x02000000U) out->_features |= kX86FeatureSse | kX86FeatureMmxExt; if (regs.edx & 0x04000000U) out->_features |= kX86FeatureSse | kX86FeatureSse2; if (regs.edx & 0x10000000U) out->_features |= kX86FeatureMultiThreading; if (out->_vendorId == kCpuAmd && (regs.edx & 0x10000000U)) { // AMD sets Multithreading to ON if it has more cores. if (out->_numberOfProcessors == 1) out->_numberOfProcessors = 2; } // This comment comes from V8 and I think that its important: // // Opteron Rev E has i bug in which on very rare occasions i locked // instruction doesn't act as i read-acquire barrier if followed by i // non-locked read-modify-write instruction. Rev F has this bug in // pre-release versions, but not in versions released to customers, // so we test only for Rev E, which is family 15, model 32..63 inclusive. if (out->_vendorId == kCpuAmd && out->_family == 15 && out->_model >= 32 && out->_model <= 63) { out->_bugs |= kX86BugAmdLockMB; } // Calling cpuid with 0x80000000 as the in argument // gets the number of valid extended IDs. x86CpuId(0x80000000, ®s); uint32_t exIds = regs.eax; if (exIds > 0x80000004) exIds = 0x80000004; uint32_t* brand = reinterpret_cast(out->_brandString); for (i = 0x80000001; i <= exIds; i++) { x86CpuId(i, ®s); switch (i) { case 0x80000001: if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureLahfSahf; if (regs.ecx & 0x00000020U) out->_features |= kX86FeatureLzCnt; if (regs.ecx & 0x00000040U) out->_features |= kX86FeatureSse4A; if (regs.ecx & 0x00000080U) out->_features |= kX86FeatureMSse; if (regs.ecx & 0x00000100U) out->_features |= kX86FeaturePrefetch; if (regs.edx & 0x00100000U) out->_features |= kX86FeatureExecuteDisableBit; if (regs.edx & 0x00200000U) out->_features |= kX86FeatureFFXSR; if (regs.edx & 0x00400000U) out->_features |= kX86FeatureMmxExt; if (regs.edx & 0x08000000U) out->_features |= kX86FeatureRdtscP; if (regs.edx & 0x20000000U) out->_features |= kX86Feature64Bit; if (regs.edx & 0x40000000U) out->_features |= kX86Feature3dNowExt | kX86FeatureMmxExt; if (regs.edx & 0x80000000U) out->_features |= kX86Feature3dNow; break; case 0x80000002: case 0x80000003: case 0x80000004: *brand++ = regs.eax; *brand++ = regs.ebx; *brand++ = regs.ecx; *brand++ = regs.edx; break; default: // Additional features can be detected in the future. break; } } // Simplify the brand string (remove unnecessary spaces to make it printable). x86CpuSimplifyBrandString(out->_brandString); } #endif } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86compilerfunc.h0000755000000000000000000003407212467662066020737 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILERFUNC_H #define _ASMJIT_X86_X86COMPILERFUNC_H // [Dependencies - AsmJit] #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compileritem.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CompilerFuncDecl] // ============================================================================ //! @brief @ref X86Compiler specific function declaration item. struct X86CompilerFuncDecl : public CompilerFuncDecl { ASMJIT_NO_COPY(X86CompilerFuncDecl) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncDecl instance. ASMJIT_API X86CompilerFuncDecl(X86Compiler* x86Compiler); //! @brief Destroy the @ref X86CompilerFuncDecl instance. ASMJIT_API virtual ~X86CompilerFuncDecl(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get function end item as @ref X86CompilerFuncEnd. inline X86CompilerFuncEnd* getEnd() const { return reinterpret_cast(_end); } //! @brief Get function declaration as @ref X86FuncDecl. inline X86FuncDecl* getDecl() const { return reinterpret_cast(_decl); } //! @brief Get function arguments as variables as @ref X86CompilerVar. inline X86CompilerVar** getVars() const { return reinterpret_cast(_vars); } //! @brief Get function argument at @a index. inline X86CompilerVar* getVar(uint32_t index) const { ASMJIT_ASSERT(index < _x86Decl.getArgumentsCount()); return reinterpret_cast(_vars)[index]; } //! @brief Get whether it's assumed that stack is aligned to 16 bytes. inline bool isAssumed16ByteAlignment() const { return hasFuncFlag(kX86FuncFlagAssume16ByteAlignment); } //! @brief Get whether it's required to align stack to 16 bytes by function. inline bool isPerformed16ByteAlignment() const { return hasFuncFlag(kX86FuncFlagPerform16ByteAlignment); } //! @brief Get whether the ESP is adjusted. inline bool isEspAdjusted() const { return hasFuncFlag(kX86FuncFlagIsEspAdjusted); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- ASMJIT_API virtual void setPrototype( uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); // -------------------------------------------------------------------------- // [Helpers] // -------------------------------------------------------------------------- //! @internal //! //! @brief Get required stack offset needed to subtract/add Esp/Rsp in //! prolog/epilog. inline int32_t _getRequiredStackOffset() const { return _funcCallStackSize + _memStackSize16 + _peMovStackSize + _peAdjustStackSize; } //! @brief Create variables from FunctionPrototype declaration. This is just //! parsing what FunctionPrototype generated for current function calling //! convention and arguments. ASMJIT_API void _createVariables(); //! @brief Prepare variables (ids, names, scope, registers). ASMJIT_API void _prepareVariables(CompilerItem* first); //! @brief Allocate variables (setting correct state, changing masks, etc). ASMJIT_API void _allocVariables(CompilerContext& cc); ASMJIT_API void _preparePrologEpilog(CompilerContext& cc); ASMJIT_API void _dumpFunction(CompilerContext& cc); ASMJIT_API void _emitProlog(CompilerContext& cc); ASMJIT_API void _emitEpilog(CompilerContext& cc); // -------------------------------------------------------------------------- // [Function-Call] // -------------------------------------------------------------------------- //! @brief Reserve stack for calling other function and mark function as //! callee. ASMJIT_API void reserveStackForFunctionCall(int32_t size); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief X86 function decl. X86FuncDecl _x86Decl; //! @brief Modified and preserved GP registers mask. uint32_t _gpModifiedAndPreserved; //! @brief Modified and preserved MM registers mask. uint32_t _mmModifiedAndPreserved; //! @brief Modified and preserved XMM registers mask. uint32_t _xmmModifiedAndPreserved; //! @brief Id of MovDQWord instruction (@c kX86InstMovDQA or @c kX86InstMovDQU). //! //! The value is based on stack alignment. If it's guaranteed that stack //! is aligned to 16-bytes then @c kX86InstMovDQA instruction is used, otherwise //! the @c kX86InstMovDQU instruction is used for 16-byte mov. uint32_t _movDqInstCode; //! @brief Prolog / epilog stack size for PUSH/POP sequences. int32_t _pePushPopStackSize; //! @brief Prolog / epilog stack size for MOV sequences. int32_t _peMovStackSize; //! @brief Prolog / epilog stack adjust size (to make it 16-byte aligned). int32_t _peAdjustStackSize; //! @brief Memory stack size (for all variables and temporary memory). int32_t _memStackSize; //! @brief Like @c _memStackSize, but aligned to 16-bytes. int32_t _memStackSize16; }; // ============================================================================ // [AsmJit::X86CompilerFuncEnd] // ============================================================================ //! @brief @ref X86Compiler function end item. struct X86CompilerFuncEnd : public CompilerFuncEnd { ASMJIT_NO_COPY(X86CompilerFuncEnd) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncEnd instance. ASMJIT_API X86CompilerFuncEnd(X86Compiler* x86Compiler, X86CompilerFuncDecl* func); //! @brief Destroy the @ref X86CompilerFuncEnd instance. ASMJIT_API virtual ~X86CompilerFuncEnd(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get related function as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); }; // ============================================================================ // [AsmJit::X86CompilerFuncRet] // ============================================================================ //! @brief Function return. struct X86CompilerFuncRet : public CompilerFuncRet { ASMJIT_NO_COPY(X86CompilerFuncRet) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncRet instance. ASMJIT_API X86CompilerFuncRet(X86Compiler* c, X86CompilerFuncDecl* func, const Operand* first, const Operand* second); //! @brief Destroy the @ref X86CompilerFuncRet instance. ASMJIT_API virtual ~X86CompilerFuncRet(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @Brief Get related function as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::X86CompilerFuncCall] // ============================================================================ //! @brief Compiler function call item. struct X86CompilerFuncCall : public CompilerFuncCall { ASMJIT_NO_COPY(X86CompilerFuncCall) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncCall instance. ASMJIT_API X86CompilerFuncCall(X86Compiler* x86Compiler, X86CompilerFuncDecl* caller, const Operand* target); //! @brief Destroy the @ref X86CompilerFuncCall instance. ASMJIT_API virtual ~X86CompilerFuncCall(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get caller as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getCaller() const { return reinterpret_cast(_caller); } //! @brief Get function prototype. inline const X86FuncDecl* getDecl() const { return reinterpret_cast(_decl); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v); // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- ASMJIT_API virtual void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); //! @brief Set function prototype. inline void setPrototype(uint32_t convention, const FuncPrototype& func) { setPrototype(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); } //! @brief Set return value. ASMJIT_API bool setReturn(const Operand& first, const Operand& second = Operand()); //! @brief Set function argument @a i to @a var. ASMJIT_API bool setArgument(uint32_t i, const Var& var); //! @brief Set function argument @a i to @a imm. ASMJIT_API bool setArgument(uint32_t i, const Imm& imm); // -------------------------------------------------------------------------- // [Internal] // -------------------------------------------------------------------------- ASMJIT_API uint32_t _findTemporaryGpRegister(CompilerContext& cc); ASMJIT_API uint32_t _findTemporaryXmmRegister(CompilerContext& cc); ASMJIT_API X86CompilerVar* _getOverlappingVariable(CompilerContext& cc, const FuncArg& argType) const; ASMJIT_API void _moveAllocatedVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType); ASMJIT_API void _moveSpilledVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType, uint32_t temporaryGpReg, uint32_t temporaryXmmReg); ASMJIT_API void _moveSrcVariableToRegister(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief X86 declaration. X86FuncDecl _x86Decl; //! @brief Mask of GP registers used as function arguments. uint32_t _gpParams; //! @brief Mask of MM registers used as function arguments. uint32_t _mmParams; //! @brief Mask of XMM registers used as function arguments. uint32_t _xmmParams; //! @brief Variables count. uint32_t _variablesCount; //! @brief Variables (extracted from operands). VarCallRecord* _variables; //! @brief Argument index to @c VarCallRecord. VarCallRecord* _argumentToVarRecord[kFuncArgsMax]; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILERFUNC_H desmume-0.9.11/src/utils/AsmJit/x86/x86compiler.cpp0000755000000000000000000005227112467662066020417 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerUtil] // ============================================================================ bool CompilerUtil::isStack16ByteAligned() { // Stack is always aligned to 16-bytes when using 64-bit OS. bool result = (sizeof(uintptr_t) == 8); // Modern Linux, APPLE and UNIX guarantees stack alignment to 16 bytes by // default. I'm really not sure about all UNIX operating systems, because // 16-byte alignment is an addition to an older specification. #if (defined(__linux__) || \ defined(__linux) || \ defined(linux) || \ defined(__unix__) || \ defined(__FreeBSD__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) || \ defined(__DARWIN__) || \ defined(__APPLE__) ) result = true; #endif // __linux__ return result; } // ============================================================================ // [AsmJit::X86Compiler - Construction / Destruction] // ============================================================================ X86Compiler::X86Compiler(Context* context) : Compiler(context) { _properties |= IntUtil::maskFromIndex(kX86PropertyOptimizedAlign); } X86Compiler::~X86Compiler() { } // ============================================================================ // [AsmJit::Compiler - Function Builder] // ============================================================================ X86CompilerFuncDecl* X86Compiler::newFunc_(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { ASMJIT_ASSERT(_func == NULL); X86CompilerFuncDecl* func = Compiler_newItem(this); _func = func; _varNameId = 0; func->setPrototype(convention, returnType, arguments, argumentsCount); addItem(func); bind(func->_entryLabel); func->_createVariables(); return func; } X86CompilerFuncDecl* X86Compiler::endFunc() { X86CompilerFuncDecl* func = getFunc(); ASMJIT_ASSERT(func != NULL); bind(func->_exitLabel); addItem(func->_end); func->setFuncFlag(kFuncFlagIsFinished); _func = NULL; return func; } // ============================================================================ // [AsmJit::Compiler - EmitInstruction] // ============================================================================ static inline X86CompilerInst* X86Compiler_newInstruction(X86Compiler* self, uint32_t code, Operand* opData, uint32_t opCount) { if (code >= _kX86InstJBegin && code <= _kX86InstJEnd) { void* p = self->_zoneMemory.alloc(sizeof(X86CompilerJmpInst)); return new(p) X86CompilerJmpInst(self, code, opData, opCount); } else { void* p = self->_zoneMemory.alloc(sizeof(X86CompilerInst) + opCount * sizeof(Operand)); return new(p) X86CompilerInst(self, code, opData, opCount); } } void X86Compiler::_emitInstruction(uint32_t code) { X86CompilerInst* inst = X86Compiler_newInstruction(this, code, NULL, 0); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(1 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 1); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(2 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 2); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(3 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; operands[2] = *o2; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 3); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(4 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; operands[2] = *o2; operands[3] = *o3; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 4); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3, const Operand* o4) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(5 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; operands[2] = *o2; operands[3] = *o3; operands[4] = *o4; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 5); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitJcc(uint32_t code, const Label* label, uint32_t hint) { if (hint == kCondHintNone) { _emitInstruction(code, label); } else { Imm imm(hint); _emitInstruction(code, label, &imm); } } X86CompilerFuncCall* X86Compiler::_emitCall(const Operand* o0) { X86CompilerFuncDecl* func = getFunc(); if (func == NULL) { setError(kErrorNoFunction); return NULL; } X86CompilerFuncCall* call = Compiler_newItem(this, func, o0); if (call == NULL) { setError(kErrorNoHeapMemory); return NULL; } addItem(call); return call; } void X86Compiler::_emitReturn(const Operand* first, const Operand* second) { X86CompilerFuncDecl* func = getFunc(); if (func == NULL) { setError(kErrorNoFunction); return; } X86CompilerFuncRet* ret = Compiler_newItem(this, func, first, second); if (ret == NULL) { setError(kErrorNoHeapMemory); return; } addItem(ret); } // ============================================================================ // [AsmJit::Compiler - Align] // ============================================================================ void X86Compiler::align(uint32_t m) { addItem(Compiler_newItem(this, m)); } // ============================================================================ // [AsmJit::Compiler - Label] // ============================================================================ Label X86Compiler::newLabel() { Label label; label._base.id = static_cast(_targets.getLength()) | kOperandIdTypeLabel; CompilerTarget* target = Compiler_newItem(this, label); _targets.append(target); return label; } void X86Compiler::bind(const Label& label) { uint32_t id = label.getId() & kOperandIdValueMask; ASMJIT_ASSERT(id != kInvalidValue); ASMJIT_ASSERT(id < _targets.getLength()); addItem(_targets[id]); } // ============================================================================ // [AsmJit::Compiler - Variables] // ============================================================================ X86CompilerVar* X86Compiler::_newVar(const char* name, uint32_t type, uint32_t size) { X86CompilerVar* var = reinterpret_cast(_zoneMemory.alloc(sizeof(X86CompilerVar))); if (var == NULL) return NULL; char nameBuffer[32]; if (name == NULL) { sprintf(nameBuffer, "var_%d", _varNameId); name = nameBuffer; _varNameId++; } var->_name = _zoneMemory.sdup(name); var->_id = static_cast(_vars.getLength()) | kOperandIdTypeVar; var->_type = static_cast(type); var->_class = x86VarInfo[type].getClass(); var->_priority = 10; var->_isRegArgument = false; var->_isMemArgument = false; var->_isCalculated = false; var->_unused = 0; var->_size = size; var->firstItem = NULL; var->lastItem = NULL; var->funcScope = getFunc(); var->funcCall = NULL; var->homeRegisterIndex = kRegIndexInvalid; var->prefRegisterMask = 0; var->homeMemoryOffset = 0; var->homeMemoryData = NULL; var->regIndex = kRegIndexInvalid; var->workOffset = kInvalidValue; var->nextActive = NULL; var->prevActive = NULL; var->state = kVarStateUnused; var->changed = false; var->saveOnUnuse = false; var->regReadCount = 0; var->regWriteCount = 0; var->regRwCount = 0; var->regGpbLoCount = 0; var->regGpbHiCount = 0; var->memReadCount = 0; var->memWriteCount = 0; var->memRwCount = 0; var->tPtr = NULL; _vars.append(var); return var; } GpVar X86Compiler::newGpVar(uint32_t varType, const char* name) { ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassGp) != 0); #if defined(ASMJIT_X86) if (x86VarInfo[varType].getSize() > 4) { varType = kX86VarTypeGpd; if (_logger) _logger->logString("*** COMPILER WARNING: QWORD variable translated to DWORD, FIX YOUR CODE! ***\n"); } #endif // ASMJIT_X86 X86CompilerVar* var = _newVar(name, varType, x86VarInfo[varType].getSize()); return var->asGpVar(); } GpVar X86Compiler::getGpArg(uint32_t argIndex) { X86CompilerFuncDecl* func = getFunc(); GpVar var; if (func != NULL) { X86FuncDecl* decl = func->getDecl(); if (argIndex < decl->getArgumentsCount()) { X86CompilerVar* cv = func->getVar(argIndex); var._var.id = cv->getId(); var._var.size = cv->getSize(); var._var.regCode = x86VarInfo[cv->getType()].getCode(); var._var.varType = cv->getType(); } } return var; } MmVar X86Compiler::newMmVar(uint32_t varType, const char* name) { ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassMm) != 0); X86CompilerVar* var = _newVar(name, varType, 8); return var->asMmVar(); } MmVar X86Compiler::getMmArg(uint32_t argIndex) { X86CompilerFuncDecl* func = getFunc(); MmVar var; if (func != NULL) { const X86FuncDecl* decl = func->getDecl(); if (argIndex < decl->getArgumentsCount()) { X86CompilerVar* cv = func->getVar(argIndex); var._var.id = cv->getId(); var._var.size = cv->getSize(); var._var.regCode = x86VarInfo[cv->getType()].getCode(); var._var.varType = cv->getType(); } } return var; } XmmVar X86Compiler::newXmmVar(uint32_t varType, const char* name) { ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassXmm) != 0); X86CompilerVar* var = _newVar(name, varType, 16); return var->asXmmVar(); } XmmVar X86Compiler::getXmmArg(uint32_t argIndex) { X86CompilerFuncDecl* func = getFunc(); XmmVar var; if (func != NULL) { const X86FuncDecl* decl = func->getDecl(); if (argIndex < decl->getArgumentsCount()) { X86CompilerVar* cv = func->getVar(argIndex); var._var.id = cv->getId(); var._var.size = cv->getSize(); var._var.regCode = x86VarInfo[cv->getType()].getCode(); var._var.varType = cv->getType(); } } return var; } void X86Compiler::_vhint(Var& var, uint32_t hintId, uint32_t hintValue) { if (var.getId() == kInvalidValue) return; X86CompilerVar* cv = _getVar(var.getId()); ASMJIT_ASSERT(cv != NULL); X86CompilerHint* item = Compiler_newItem(this, cv, hintId, hintValue); addItem(item); } void X86Compiler::alloc(Var& var) { _vhint(var, kVarHintAlloc, kInvalidValue); } void X86Compiler::alloc(Var& var, uint32_t regIndex) { if (regIndex > 31) return; _vhint(var, kVarHintAlloc, IntUtil::maskFromIndex(regIndex)); } void X86Compiler::alloc(Var& var, const Reg& reg) { _vhint(var, kVarHintAlloc, IntUtil::maskFromIndex(reg.getRegIndex())); } void X86Compiler::save(Var& var) { _vhint(var, kVarHintSave, kInvalidValue); } void X86Compiler::spill(Var& var) { _vhint(var, kVarHintSpill, kInvalidValue); } void X86Compiler::unuse(Var& var) { _vhint(var, kVarHintUnuse, kInvalidValue); } uint32_t X86Compiler::getPriority(Var& var) const { if (var.getId() == kInvalidValue) return kInvalidValue; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); return vdata->getPriority(); } void X86Compiler::setPriority(Var& var, uint32_t priority) { if (var.getId() == kInvalidValue) return; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); if (priority > 100) priority = 100; vdata->_priority = static_cast(priority); } bool X86Compiler::getSaveOnUnuse(Var& var) const { if (var.getId() == kInvalidValue) return false; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); return (bool)vdata->saveOnUnuse; } void X86Compiler::setSaveOnUnuse(Var& var, bool value) { if (var.getId() == kInvalidValue) return; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); vdata->saveOnUnuse = value; } void X86Compiler::rename(Var& var, const char* name) { if (var.getId() == kInvalidValue) return; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); vdata->_name = _zoneMemory.sdup(name); } // ============================================================================ // [AsmJit::Compiler - State] // ============================================================================ X86CompilerState* X86Compiler::_newState(uint32_t memVarsCount) { X86CompilerState* state = reinterpret_cast(_zoneMemory.alloc( sizeof(X86CompilerState) + memVarsCount * sizeof(void*))); return state; } // ============================================================================ // [AsmJit::Compiler - Make] // ============================================================================ void* X86Compiler::make() { X86Assembler x86Asm(_context); x86Asm._properties = _properties; x86Asm.setLogger(_logger); serialize(x86Asm); if (this->getError()) return NULL; if (x86Asm.getError()) { setError(x86Asm.getError()); return NULL; } void* result = x86Asm.make(); if (_logger) { _logger->logFormat("*** COMPILER SUCCESS - Wrote %u bytes, code: %u, trampolines: %u.\n\n", (unsigned int)x86Asm.getCodeSize(), (unsigned int)x86Asm.getOffset(), (unsigned int)x86Asm.getTrampolineSize()); } return result; } void X86Compiler::serialize(Assembler& a) { X86CompilerContext x86Context(this); X86Assembler& x86Asm = static_cast(a); CompilerItem* start = _first; CompilerItem* stop = NULL; // Register all labels. x86Asm.registerLabels(_targets.getLength()); // Make code. for (;;) { _cc = NULL; // ------------------------------------------------------------------------ // [Find Function] // ------------------------------------------------------------------------ for (;;) { if (start == NULL) return; if (start->getType() == kCompilerItemFuncDecl) break; start->emit(x86Asm); start = start->getNext(); } // ------------------------------------------------------------------------ // [Setup CompilerContext] // ------------------------------------------------------------------------ stop = static_cast(start)->getEnd(); x86Context._func = static_cast(start); x86Context._start = start; x86Context._stop = stop; x86Context._extraBlock = stop->getPrev(); // Detect whether the function generation was finished. if (!x86Context._func->isFinished() || x86Context._func->getEnd()->getPrev() == NULL) { setError(kErrorIncompleteFunction); return; } // ------------------------------------------------------------------------ // Step 1: // - Assign/increment offset of each item. // - Extract variables from instructions. // - Prepare variables for register allocator: // - Update read(r) / write(w) / read/write(x) statistics. // - Update register / memory usage statistics. // - Find scope (first / last item) of variables. // ------------------------------------------------------------------------ CompilerItem* cur; for (cur = start; ; cur = cur->getNext()) { cur->prepare(x86Context); if (cur == stop) break; } // We set compiler context also to Compiler so newly emitted instructions // can call CompilerItem::prepare() on itself. _cc = &x86Context; // ------------------------------------------------------------------------ // Step 2: // - Translate special instructions (imul, cmpxchg8b, ...). // - Alloc registers. // - Translate forward jumps. // - Alloc memory operands (variables related). // - Emit function prolog. // - Emit function epilog. // - Patch memory operands (variables related). // - Dump function prototype and variable statistics (if enabled). // ------------------------------------------------------------------------ // Translate special instructions and run alloc registers. cur = start; do { do { // Assign current offset of each item back to CompilerContext. x86Context._currentOffset = cur->_offset; // Assign previous item to compiler so each variable spill/alloc will // be emitted before. _current = cur->getPrev(); cur = cur->translate(x86Context); } while (cur); x86Context._isUnreachable = true; size_t len = x86Context._backCode.getLength(); while (x86Context._backPos < len) { cur = x86Context._backCode[x86Context._backPos++]->getNext(); if (!cur->isTranslated()) break; cur = NULL; } } while (cur); // Translate forward jumps. { ForwardJumpData* j = x86Context._forwardJumps; while (j != NULL) { x86Context._assignState(j->state); _current = j->inst->getPrev(); j->inst->doJump(x86Context); j = j->next; } } // Alloc memory operands (variables related). x86Context._allocMemoryOperands(); // Emit function prolog / epilog. x86Context.getFunc()->_preparePrologEpilog(x86Context); _current = x86Context._func->getEntryTarget(); x86Context.getFunc()->_emitProlog(x86Context); _current = x86Context._func->getExitTarget(); x86Context.getFunc()->_emitEpilog(x86Context); // Patch memory operands (variables related). _current = _last; x86Context._patchMemoryOperands(start, stop); // Dump function prototype and variable statistics (if enabled). if (_logger) x86Context.getFunc()->_dumpFunction(x86Context); // ------------------------------------------------------------------------ // Hack: need to register labels that was created by the Step 2. // ------------------------------------------------------------------------ if (x86Asm._labels.getLength() < _targets.getLength()) x86Asm.registerLabels(_targets.getLength() - x86Asm._labels.getLength()); CompilerItem* extraBlock = x86Context._extraBlock; // ------------------------------------------------------------------------ // Step 3: // - Emit instructions to Assembler stream. // ------------------------------------------------------------------------ for (cur = start; ; cur = cur->getNext()) { cur->emit(x86Asm); if (cur == extraBlock) break; } // ------------------------------------------------------------------------ // Step 4: // - Emit everything else (post action). // ------------------------------------------------------------------------ for (cur = start; ; cur = cur->getNext()) { cur->post(x86Asm); if (cur == extraBlock) break; } start = extraBlock->getNext(); x86Context._clear(); } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86/x86compileritem.cpp0000755000000000000000000015127012467662066021275 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86CompilerAlign - Construction / Destruction] // ============================================================================ X86CompilerAlign::X86CompilerAlign(X86Compiler* x86Compiler, uint32_t size) : CompilerAlign(x86Compiler, size) { } X86CompilerAlign::~X86CompilerAlign() { } // ============================================================================ // [AsmJit::X86CompilerAlign - Interface] // ============================================================================ void X86CompilerAlign::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); x86Asm.align(_size); } // ============================================================================ // [AsmJit::X86CompilerTarget - Construction / Destruction] // ============================================================================ X86CompilerTarget::X86CompilerTarget(X86Compiler* c, const Label& label) : CompilerTarget(c, label) { } X86CompilerTarget::~X86CompilerTarget() { } // ============================================================================ // [AsmJit::X86CompilerTarget - Interface] // ============================================================================ static X86CompilerTarget* X86CompilerTarget_removeUnreachableItems(X86CompilerTarget* target) { CompilerItem* prev = target->getPrev(); CompilerItem* item = target->getNext(); ASMJIT_ASSERT(prev != NULL); ASMJIT_ASSERT(item != NULL); for (;;) { CompilerItem* next = item->getNext(); ASMJIT_ASSERT(next != NULL); if (item->getType() == kCompilerItemTarget) break; item->_prev = NULL; item->_next = NULL; item->_isUnreachable = true; item = next; } target->_prev = NULL; target->_next = NULL; target->_isTranslated = true; prev->_next = item; item->_prev = prev; return static_cast(item); } void X86CompilerTarget::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset++; } CompilerItem* X86CompilerTarget::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); // If this X86CompilerTarget was already translated, it's needed to change // the current state and return NULL to tell CompilerContext to process next // untranslated item. if (_isTranslated) { x86Context._restoreState(getState()); return NULL; } if (x86Context._isUnreachable) { // If the context has "isUnreachable" flag set and there is no state then // it means that this code will be never called. This is a problem, because // we are unable to assign a state to current location so we can't allocate // registers for variables used inside. So instead of doing anything wrong // we remove the unreachable code. if (_state == NULL) return X86CompilerTarget_removeUnreachableItems(this); // Assign state to the compiler context. x86Context._isUnreachable = 0; x86Context._assignState(getState()); } else { _state = x86Context._saveState(); } return translated(); } void X86CompilerTarget::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); x86Asm.bind(_label); } // ============================================================================ // [AsmJit::X86CompilerHint - Construction / Destruction] // ============================================================================ X86CompilerHint::X86CompilerHint(X86Compiler* compiler, X86CompilerVar* var, uint32_t hintId, uint32_t hintValue) : CompilerHint(compiler, var, hintId, hintValue) { } X86CompilerHint::~X86CompilerHint() { } // ============================================================================ // [AsmJit::X86CompilerHint - Interface] // ============================================================================ void X86CompilerHint::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86CompilerVar* var = getVar(); _offset = x86Context._currentOffset; // First item (begin of variable scope). if (var->firstItem == NULL) var->firstItem = this; // Last item (end of variable scope). CompilerItem* oldLast = var->lastItem; var->lastItem = this; switch (_hintId) { case kVarHintAlloc: case kVarHintSpill: case kVarHintSave: if (!x86Context._isActive(var)) x86Context._addActive(var); break; case kVarHintSaveAndUnuse: if (!x86Context._isActive(var)) x86Context._addActive(var); break; case kVarHintUnuse: if (oldLast) oldLast->_tryUnuseVar(var); break; } } CompilerItem* X86CompilerHint::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86CompilerVar* var = getVar(); switch (_hintId) { case kVarHintAlloc: x86Context.allocVar(var, _hintValue, kVarAllocRead); break; case kVarHintSpill: if (var->state == kVarStateReg) x86Context.spillVar(var); break; case kVarHintSave: case kVarHintSaveAndUnuse: if (var->state == kVarStateReg && var->changed) { x86Context.emitSaveVar(var, var->regIndex); var->changed = false; } if (_hintId == kVarHintSaveAndUnuse) goto _Unuse; break; case kVarHintUnuse: _Unuse: x86Context.unuseVar(var, kVarStateUnused); goto _End; } x86Context._unuseVarOnEndOfScope(this, var); _End: return translated(); } // ============================================================================ // [AsmJit::X86CompilerHint - Misc] // ============================================================================ int X86CompilerHint::getMaxSize() const { // Compiler hint is NOP, but it can generate other items which can do // something - in such more items are added into the stream so we don't need // to worry about this. return 0; } // ============================================================================ // [AsmJit::X86CompilerInst - Construction / Destruction] // ============================================================================ X86CompilerInst::X86CompilerInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) : CompilerInst(x86Compiler, code, opData, opCount) { uint32_t i; _memOp = NULL; _vars = NULL; _variablesCount = 0; for (i = 0; i < opCount; i++) { if (_operands[i].isMem()) { _memOp = reinterpret_cast(&_operands[i]); break; } } const X86InstInfo* info = &x86InstInfo[_code]; if (info->isSpecial()) setInstFlag(kX86CompilerInstFlagIsSpecial); if (info->isFpu()) setInstFlag(kX86CompilerInstFlagIsFpu); if (isSpecial()) { // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} switch (_code) { case kX86InstCpuId: // Special... break; case kX86InstCbw: case kX86InstCdq: case kX86InstCdqe: case kX86InstCwd: case kX86InstCwde: case kX86InstCqo: // Special... break; case kX86InstCmpXCHG: case kX86InstCmpXCHG8B: #if defined(ASMJIT_X64) case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 // Special... break; #if defined(ASMJIT_X86) case kX86InstDaa: case kX86InstDas: // Special... break; #endif // ASMJIT_X86 case kX86InstIMul: switch (_operandsCount) { case 2: // IMUL dst, src is not special instruction. clearInstFlag(kX86CompilerInstFlagIsSpecial); break; case 3: // Only IMUL dst_hi, dst_lo, reg/mem is special, all others don't. if (!(_operands[0].isVar() && _operands[1].isVar() && _operands[2].isVarMem())) clearInstFlag(kX86CompilerInstFlagIsSpecial); break; } break; case kX86InstMul: case kX86InstIDiv: case kX86InstDiv: // Special... break; case kX86InstMovPtr: // Special... break; case kX86InstLahf: case kX86InstSahf: // Special... break; case kX86InstMaskMovQ: case kX86InstMaskMovDQU: // Special... break; case kX86InstEnter: case kX86InstLeave: // Special... break; case kX86InstRet: // Special... break; case kX86InstMonitor: case kX86InstMWait: // Special... break; case kX86InstPop: case kX86InstPopAD: case kX86InstPopFD: case kX86InstPopFQ: // Special... break; case kX86InstPush: case kX86InstPushAD: case kX86InstPushFD: case kX86InstPushFQ: // Special... break; case kX86InstRcl: case kX86InstRcr: case kX86InstRol: case kX86InstRor: case kX86InstSal: case kX86InstSar: case kX86InstShl: case kX86InstShr: // Rot instruction is special only if last operand is variable (register). if (!_operands[1].isVar()) clearInstFlag(kX86CompilerInstFlagIsSpecial); break; case kX86InstShld: case kX86InstShrd: // Shld/Shrd instruction is special only if last operand is variable (register). if (!_operands[2].isVar()) clearInstFlag(kX86CompilerInstFlagIsSpecial); break; case kX86InstRdtsc: case kX86InstRdtscP: // Special... break; case kX86InstRepLodSB: case kX86InstRepLodSD: case kX86InstRepLodSQ: case kX86InstRepLodSW: case kX86InstRepMovSB: case kX86InstRepMovSD: case kX86InstRepMovSQ: case kX86InstRepMovSW: case kX86InstRepStoSB: case kX86InstRepStoSD: case kX86InstRepStoSQ: case kX86InstRepStoSW: case kX86InstRepECmpSB: case kX86InstRepECmpSD: case kX86InstRepECmpSQ: case kX86InstRepECmpSW: case kX86InstRepEScaSB: case kX86InstRepEScaSD: case kX86InstRepEScaSQ: case kX86InstRepEScaSW: case kX86InstRepNECmpSB: case kX86InstRepNECmpSD: case kX86InstRepNECmpSQ: case kX86InstRepNECmpSW: case kX86InstRepNEScaSB: case kX86InstRepNEScaSD: case kX86InstRepNEScaSQ: case kX86InstRepNEScaSW: // Special... break; default: ASMJIT_ASSERT(0); } // ${SPECIAL_INSTRUCTION_HANDLING_END} } } X86CompilerInst::~X86CompilerInst() { } // ============================================================================ // [AsmJit::X86CompilerInst - Interface] // ============================================================================ void X86CompilerInst::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); #define __GET_VARIABLE(__vardata__) \ { \ X86CompilerVar* _candidate = __vardata__; \ \ for (var = cur; ;) \ { \ if (var == _vars) \ { \ var = cur++; \ var->vdata = _candidate; \ var->vflags = 0; \ var->regMask = 0xFFFFFFFF; \ break; \ } \ \ var--; \ \ if (var->vdata == _candidate) \ { \ break; \ } \ } \ \ ASMJIT_ASSERT(var != NULL); \ } _offset = x86Context._currentOffset; const X86InstInfo* id = &x86InstInfo[_code]; uint32_t i, len = _operandsCount; uint32_t variablesCount = 0; for (i = 0; i < len; i++) { Operand& o = _operands[i]; if (o.isVar()) { ASMJIT_ASSERT(o.getId() != kInvalidValue); X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); if (reinterpret_cast(&o)->isGpVar()) { if (reinterpret_cast(&o)->isGpbLo()) { setInstFlag(kX86CompilerInstFlagIsGpbLoUsed); vdata->regGpbLoCount++; }; if (reinterpret_cast(&o)->isGpbHi()) { setInstFlag(kX86CompilerInstFlagIsGpbHiUsed); vdata->regGpbHiCount++; }; } if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); x86Context._markMemoryUsed(vdata); if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.base); ASMJIT_ASSERT(vdata != NULL); if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.index); ASMJIT_ASSERT(vdata != NULL); if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } } } if (!variablesCount) { x86Context._currentOffset++; return; } _vars = reinterpret_cast(x86Compiler->getZoneMemory().alloc(sizeof(VarAllocRecord) * variablesCount)); if (_vars == NULL) { x86Compiler->setError(kErrorNoHeapMemory); x86Context._currentOffset++; return; } _variablesCount = variablesCount; VarAllocRecord* cur = _vars; VarAllocRecord* var = NULL; bool _isGpbUsed = hasInstFlag(kX86CompilerInstFlagIsGpbLoUsed) | hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed) ; uint32_t gpRestrictMask = IntUtil::maskUpToIndex(kX86RegNumGp); #if defined(ASMJIT_X64) if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) { gpRestrictMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEbp) | IntUtil::maskFromIndex(kX86RegIndexEsi) | IntUtil::maskFromIndex(kX86RegIndexEdi) ; } #endif // ASMJIT_X64 for (i = 0; i < len; i++) { Operand& o = _operands[i]; if (o.isVar()) { X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) var->vflags |= kVarAllocRegister; if (_isGpbUsed) { #if defined(ASMJIT_X86) if (reinterpret_cast(&o)->isGpb()) { var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx) ; } #else // Restrict all BYTE registers to RAX/RBX/RCX/RDX if HI BYTE register // is used (REX prefix makes HI BYTE addressing unencodable). if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) { if (reinterpret_cast(&o)->isGpb()) { var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx) ; } } #endif // ASMJIT_X86/X64 } if (isSpecial()) { // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} switch (_code) { case kX86InstCpuId: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; case 3: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCbw: case kX86InstCdqe: case kX86InstCwde: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCdq: case kX86InstCwd: case kX86InstCqo: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCmpXCHG: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCmpXCHG8B: #if defined(ASMJIT_X64) case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; case 3: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; #if defined(ASMJIT_X86) case kX86InstDaa: case kX86InstDas: ASMJIT_ASSERT(i == 0); vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; #endif // ASMJIT_X86 case kX86InstIMul: case kX86InstMul: case kX86InstIDiv: case kX86InstDiv: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; default: ASMJIT_ASSERT(0); } break; case kX86InstMovPtr: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstLahf: ASMJIT_ASSERT(i == 0); vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case kX86InstSahf: ASMJIT_ASSERT(i == 0); vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case kX86InstMaskMovQ: case kX86InstMaskMovDQU: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; } break; case kX86InstEnter: case kX86InstLeave: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRet: // TODO: SPECIAL INSTRUCTION. break; case kX86InstMonitor: case kX86InstMWait: // TODO: MONITOR/MWAIT (COMPILER). break; case kX86InstPop: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPopAD: case kX86InstPopFD: case kX86InstPopFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPush: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPushAD: case kX86InstPushFD: case kX86InstPushFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRcl: case kX86InstRcr: case kX86InstRol: case kX86InstRor: case kX86InstSal: case kX86InstSar: case kX86InstShl: case kX86InstShr: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstShld: case kX86InstShrd: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRdtsc: case kX86InstRdtscP: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: ASMJIT_ASSERT(_code == kX86InstRdtscP); vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepLodSB: case kX86InstRepLodSD: case kX86InstRepLodSQ: case kX86InstRepLodSW: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepMovSB: case kX86InstRepMovSD: case kX86InstRepMovSQ: case kX86InstRepMovSW: case kX86InstRepECmpSB: case kX86InstRepECmpSD: case kX86InstRepECmpSQ: case kX86InstRepECmpSW: case kX86InstRepNECmpSB: case kX86InstRepNECmpSD: case kX86InstRepNECmpSQ: case kX86InstRepNECmpSW: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepStoSB: case kX86InstRepStoSD: case kX86InstRepStoSQ: case kX86InstRepStoSW: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepEScaSB: case kX86InstRepEScaSD: case kX86InstRepEScaSQ: case kX86InstRepEScaSW: case kX86InstRepNEScaSB: case kX86InstRepNEScaSD: case kX86InstRepNEScaSQ: case kX86InstRepNEScaSW: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; default: ASMJIT_ASSERT(0); } // ${SPECIAL_INSTRUCTION_HANDLING_END} } else { if (i == 0) { // CMP/TEST instruction. if (id->getCode() == kX86InstCmp || id->getCode() == kX86InstTest) { // Read-only case. vdata->regReadCount++; var->vflags |= kVarAllocRead; } // CVTTSD2SI/CVTTSS2SI instructions. else if (id->getCode() == kX86InstCvttSD2SI || id->getCode() == kX86InstCvttSS2SI) { // In 32-bit mode the whole destination is replaced. In 64-bit mode // we need to check whether the destination operand size is 64-bits. #if defined(ASMJIT_X64) if (_operands[0].isRegType(kX86RegTypeGpq)) { #endif // ASMJIT_X64 // Write-only case. vdata->regWriteCount++; var->vflags |= kVarAllocWrite; #if defined(ASMJIT_X64) } else { // Read/Write. vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; } #endif // ASMJIT_X64 } // MOV/MOVSS/MOVSD instructions. // // If instruction is MOV (source replaces the destination) or // MOVSS/MOVSD and source operand is memory location then register // allocator should know that previous destination value is lost // (write only operation). else if ((id->isMov()) || ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD) /* && _operands[1].isMem() */) || (id->getCode() == kX86InstIMul && _operandsCount == 3 && !isSpecial())) { // Write-only case. vdata->regWriteCount++; var->vflags |= kVarAllocWrite; } else if (id->getCode() == kX86InstLea) { // Write. vdata->regWriteCount++; var->vflags |= kVarAllocWrite; } else { // Read/Write. vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; } } else { // Second, third, ... operands are read-only. vdata->regReadCount++; var->vflags |= kVarAllocRead; } if (!_memOp && i < 2 && (id->_opFlags[i] & kX86InstOpMem) != 0) { var->vflags |= kVarAllocMem; } } // If variable must be in specific register we could add some hint to allocator. if (var->vflags & kVarAllocSpecial) { vdata->prefRegisterMask |= var->regMask; x86Context._newRegisterHomeIndex(vdata, IntUtil::findFirstBit(var->regMask)); } } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) if (i == 0) { // If variable is MOV instruction type (source replaces the destination) // or variable is MOVSS/MOVSD instruction then register allocator should // know that previous destination value is lost (write only operation). if (id->isMov() || ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD))) { // Write only case. vdata->memWriteCount++; } else { vdata->memRwCount++; } } else { vdata->memReadCount++; } } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast(o).getBase()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) vdata->regReadCount++; var->vflags |= kVarAllocRegister | kVarAllocRead; var->regMask &= gpRestrictMask; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast(o).getIndex()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) vdata->regReadCount++; var->vflags |= kVarAllocRegister | kVarAllocRead; var->regMask &= gpRestrictMask; } } } // Traverse all variables and update firstItem / lastItem. This // function is called from iterator that scans items using forward // direction so we can use this knowledge to optimize the process. // // Similar to X86CompilerFuncCall::prepare(). for (i = 0; i < _variablesCount; i++) { X86CompilerVar* v = _vars[i].vdata; // Update GP register allocator restrictions. if (X86Util::isVarTypeInt(v->getType())) { if (_vars[i].regMask == 0xFFFFFFFF) _vars[i].regMask &= gpRestrictMask; } // Update first/last item (begin of variable scope). if (v->firstItem == NULL) v->firstItem = this; v->lastItem = this; } // There are some instructions that can be used to clear or to set all bits // in a register: // // - andn reg, reg ; Set all bits in reg to 0. // - xor/pxor reg, reg ; Set all bits in reg to 0. // - sub/psub reg, reg ; Set all bits in reg to 0. // - pcmpgt reg, reg ; Set all bits in reg to 0. // - pcmpeq reg, reg ; Set all bits in reg to 1. // // There are also combinations which do nothing: // // - and reg, reg ; Nop. // - or reg, reg ; Nop. // - xchg reg, reg ; Nop. if (_variablesCount == 1 && _operandsCount > 1 && _operands[0].isVar() && _operands[1].isVar() && !_memOp) { switch (_code) { // ---------------------------------------------------------------------- // [Zeros/Ones] // ---------------------------------------------------------------------- // ANDN Instructions. case kX86InstPAndN: // XOR Instructions. case kX86InstXor: case kX86InstXorPD: case kX86InstXorPS: case kX86InstPXor: // SUB Instructions. case kX86InstSub: case kX86InstPSubB: case kX86InstPSubW: case kX86InstPSubD: case kX86InstPSubQ: case kX86InstPSubSB: case kX86InstPSubSW: case kX86InstPSubUSB: case kX86InstPSubUSW: // PCMPEQ Instructions. case kX86InstPCmpEqB: case kX86InstPCmpEqW: case kX86InstPCmpEqD: case kX86InstPCmpEqQ: // PCMPGT Instructions. case kX86InstPCmpGtB: case kX86InstPCmpGtW: case kX86InstPCmpGtD: case kX86InstPCmpGtQ: // Clear the read flag. This prevents variable alloc/spill. _vars[0].vflags = kVarAllocWrite; _vars[0].vdata->regReadCount--; break; // ---------------------------------------------------------------------- // [Nop] // ---------------------------------------------------------------------- // AND Instructions. case kX86InstAnd: case kX86InstAndPD: case kX86InstAndPS: case kX86InstPAnd: // OR Instructions. case kX86InstOr: case kX86InstOrPD: case kX86InstOrPS: case kX86InstPOr: // XCHG Instruction. case kX86InstXchg: // Clear the write flag. _vars[0].vflags = kVarAllocRead; _vars[0].vdata->regWriteCount--; break; } } x86Context._currentOffset++; #undef __GET_VARIABLE } CompilerItem* X86CompilerInst::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); uint32_t i; uint32_t variablesCount = _variablesCount; if (variablesCount > 0) { // These variables are used by the instruction and we set current offset // to their work offsets -> getSpillCandidate never return the variable // used this instruction. for (i = 0; i < variablesCount; i++) { _vars[i].vdata->workOffset = x86Context._currentOffset; } // Alloc variables used by the instruction (special first). for (i = 0; i < variablesCount; i++) { VarAllocRecord& r = _vars[i]; // Alloc variables with specific register first. if ((r.vflags & kVarAllocSpecial) != 0) x86Context.allocVar(r.vdata, r.regMask, r.vflags); } for (i = 0; i < variablesCount; i++) { VarAllocRecord& r = _vars[i]; // Alloc variables without specific register last. if ((r.vflags & kVarAllocSpecial) == 0) x86Context.allocVar(r.vdata, r.regMask, r.vflags); } x86Context.translateOperands(_operands, _operandsCount); } if (_memOp && (_memOp->getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(_memOp->getId()); ASMJIT_ASSERT(cv != NULL); switch (cv->state) { case kVarStateUnused: cv->state = kVarStateMem; break; case kVarStateReg: cv->changed = false; x86Context.unuseVar(cv, kVarStateMem); break; } } for (i = 0; i < variablesCount; i++) { x86Context._unuseVarOnEndOfScope(this, &_vars[i]); } return translated(); } void X86CompilerInst::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); x86Asm._inlineComment = _comment; x86Asm._emitOptions = _emitOptions; if (isSpecial()) { // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} switch (_code) { case kX86InstCpuId: x86Asm._emitInstruction(_code); return; case kX86InstCbw: case kX86InstCdq: case kX86InstCdqe: case kX86InstCwd: case kX86InstCwde: case kX86InstCqo: x86Asm._emitInstruction(_code); return; case kX86InstCmpXCHG: x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]); return; case kX86InstCmpXCHG8B: #if defined(ASMJIT_X64) case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 x86Asm._emitInstruction(_code, &_operands[4]); return; #if defined(ASMJIT_X86) case kX86InstDaa: case kX86InstDas: x86Asm._emitInstruction(_code); return; #endif // ASMJIT_X86 case kX86InstIMul: case kX86InstMul: case kX86InstIDiv: case kX86InstDiv: // INST dst_lo (implicit), dst_hi (implicit), src (explicit) ASMJIT_ASSERT(_operandsCount == 3); x86Asm._emitInstruction(_code, &_operands[2]); return; case kX86InstMovPtr: break; case kX86InstLahf: case kX86InstSahf: x86Asm._emitInstruction(_code); return; case kX86InstMaskMovQ: case kX86InstMaskMovDQU: x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]); return; case kX86InstEnter: case kX86InstLeave: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRet: // TODO: SPECIAL INSTRUCTION. break; case kX86InstMonitor: case kX86InstMWait: // TODO: MONITOR/MWAIT (COMPILER). break; case kX86InstPop: case kX86InstPopAD: case kX86InstPopFD: case kX86InstPopFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPush: case kX86InstPushAD: case kX86InstPushFD: case kX86InstPushFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRcl: case kX86InstRcr: case kX86InstRol: case kX86InstRor: case kX86InstSal: case kX86InstSar: case kX86InstShl: case kX86InstShr: x86Asm._emitInstruction(_code, &_operands[0], &cl); return; case kX86InstShld: case kX86InstShrd: x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &cl); return; case kX86InstRdtsc: case kX86InstRdtscP: x86Asm._emitInstruction(_code); return; case kX86InstRepLodSB: case kX86InstRepLodSD: case kX86InstRepLodSQ: case kX86InstRepLodSW: case kX86InstRepMovSB: case kX86InstRepMovSD: case kX86InstRepMovSQ: case kX86InstRepMovSW: case kX86InstRepStoSB: case kX86InstRepStoSD: case kX86InstRepStoSQ: case kX86InstRepStoSW: case kX86InstRepECmpSB: case kX86InstRepECmpSD: case kX86InstRepECmpSQ: case kX86InstRepECmpSW: case kX86InstRepEScaSB: case kX86InstRepEScaSD: case kX86InstRepEScaSQ: case kX86InstRepEScaSW: case kX86InstRepNECmpSB: case kX86InstRepNECmpSD: case kX86InstRepNECmpSQ: case kX86InstRepNECmpSW: case kX86InstRepNEScaSB: case kX86InstRepNEScaSD: case kX86InstRepNEScaSQ: case kX86InstRepNEScaSW: x86Asm._emitInstruction(_code); return; default: ASMJIT_ASSERT(0); } // ${SPECIAL_INSTRUCTION_HANDLING_END} } switch (_operandsCount) { case 0: x86Asm._emitInstruction(_code); break; case 1: x86Asm._emitInstruction(_code, &_operands[0]); break; case 2: x86Asm._emitInstruction(_code, &_operands[0], &_operands[1]); break; case 3: x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &_operands[2]); break; default: ASMJIT_ASSERT(0); break; } } // ============================================================================ // [AsmJit::X86CompilerInst - Misc] // ============================================================================ int X86CompilerInst::getMaxSize() const { // TODO: Instruction max size. return 15; } bool X86CompilerInst::_tryUnuseVar(CompilerVar* _v) { X86CompilerVar* cv = static_cast(_v); for (uint32_t i = 0; i < _variablesCount; i++) { if (_vars[i].vdata == cv) { _vars[i].vflags |= kVarAllocUnuseAfterUse; return true; } } return false; } // ============================================================================ // [AsmJit::X86CompilerJmpInst - Construction / Destruction] // ============================================================================ X86CompilerJmpInst::X86CompilerJmpInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) : X86CompilerInst(x86Compiler, code, opData, opCount) { _jumpTarget = x86Compiler->_getTarget(_operands[0].getId()); _jumpTarget->_jumpsCount++; _jumpNext = static_cast(_jumpTarget->_from); _jumpTarget->_from = this; // The 'jmp' is always taken, conditional jump can contain hint, we detect it. if (getCode() == kX86InstJmp) setInstFlag(kX86CompilerInstFlagIsTaken); else if (opCount > 1 && opData[1].isImm() && reinterpret_cast(&opData[1])->getValue() == kCondHintLikely) setInstFlag(kX86CompilerInstFlagIsTaken); } X86CompilerJmpInst::~X86CompilerJmpInst() { } // ============================================================================ // [AsmJit::X86CompilerJmpInst - Interface] // ============================================================================ void X86CompilerJmpInst::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset; // Update _isTaken to true if this is conditional backward jump. This behavior // can be overridden by using kCondHintUnlikely when using the instruction. if (getCode() != kX86InstJmp && _operandsCount == 1 && _jumpTarget->getOffset() < getOffset()) { setInstFlag(kX86CompilerInstFlagIsTaken); } // Now patch all variables where jump location is in the active range. if (_jumpTarget->getOffset() != kInvalidValue && x86Context._active) { X86CompilerVar* first = static_cast(x86Context._active); X86CompilerVar* var = first; uint32_t jumpOffset = _jumpTarget->getOffset(); do { if (var->firstItem) { ASMJIT_ASSERT(var->lastItem != NULL); uint32_t start = var->firstItem->getOffset(); uint32_t end = var->lastItem->getOffset(); if (jumpOffset >= start && jumpOffset <= end) var->lastItem = this; } var = var->nextActive; } while (var != first); } x86Context._currentOffset++; } CompilerItem* X86CompilerJmpInst::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // Translate using X86CompilerInst. CompilerItem* ret = X86CompilerInst::translate(cc); // We jump with item if its kX86InstJUMP (not based on condiiton) and it // points into yet unknown location. if (_code == kX86InstJmp && !_jumpTarget->isTranslated()) { x86Context.addBackwardCode(this); ret = _jumpTarget; } else { _state = x86Context._saveState(); if (_jumpTarget->isTranslated()) { doJump(cc); } else { // State is not known, so we need to call doJump() later. Compiler will // do it for us. x86Context.addForwardJump(this); _jumpTarget->_state = _state; } // Mark next code as unreachable, cleared by a next label (CompilerTarget). if (_code == kX86InstJmp) x86Context._isUnreachable = 1; } // Need to traverse over all active variables and unuse them if their scope ends // here. if (x86Context._active) { X86CompilerVar* first = static_cast(x86Context._active); X86CompilerVar* var = first; do { x86Context._unuseVarOnEndOfScope(this, var); var = var->nextActive; } while (var != first); } return ret; } void X86CompilerJmpInst::emit(Assembler& a) { static const uint MAXIMUM_SHORT_JMP_SIZE = 127; // Try to minimize size of jump using SHORT jump (8-bit displacement) by // traversing into the target and calculating the maximum code size. We // end when code size reaches MAXIMUM_SHORT_JMP_SIZE. if (!(_emitOptions & kX86EmitOptionShortJump) && getJumpTarget()->getOffset() > getOffset()) { // Calculate the code size. uint codeSize = 0; CompilerItem* cur = this->getNext(); CompilerItem* target = getJumpTarget(); while (cur) { if (cur == target) { // Target found, we can tell assembler to generate short form of jump. _emitOptions |= kX86EmitOptionShortJump; goto _End; } int s = cur->getMaxSize(); if (s == -1) break; codeSize += (uint)s; if (codeSize > MAXIMUM_SHORT_JMP_SIZE) break; cur = cur->getNext(); } } _End: X86CompilerInst::emit(a); } // ============================================================================ // [AsmJit::X86CompilerJmpInst - DoJump] // ============================================================================ void X86CompilerJmpInst::doJump(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // The state have to be already known. The doJump() method is called by // translate() or by Compiler in case that it's forward jump. ASMJIT_ASSERT(_jumpTarget->getState()); if (getCode() == kX86InstJmp || (isTaken() && _jumpTarget->getOffset() < getOffset())) { // Instruction type is JMP or conditional jump that should be taken (likely). // We can set state here instead of jumping out, setting state and jumping // to _jumpTarget. // // NOTE: We can't use this technique if instruction is forward conditional // jump. The reason is that when generating code we can't change state here, // because the next instruction depends on it. x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset()); } else { // Instruction type is JMP or conditional jump that should be not normally // taken. If we need add code that will switch between different states we // add it after the end of function body (after epilog, using 'ExtraBlock'). CompilerItem* ext = x86Context.getExtraBlock(); CompilerItem* old = x86Compiler->setCurrentItem(ext); x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset()); if (x86Compiler->getCurrentItem() != ext) { // Add the jump to the target. x86Compiler->jmp(_jumpTarget->_label); ext = x86Compiler->getCurrentItem(); // The x86Context._restoreState() method emitted some instructions so we need to // patch the jump. Label L = x86Compiler->newLabel(); x86Compiler->setCurrentItem(x86Context.getExtraBlock()); x86Compiler->bind(L); // Finally, patch the jump target. ASMJIT_ASSERT(_operandsCount > 0); _operands[0] = L; // Operand part (Label). _jumpTarget = x86Compiler->_getTarget(L.getId()); // Compiler part (CompilerTarget). } x86Context.setExtraBlock(ext); x86Compiler->setCurrentItem(old); // Assign state back. x86Context._assignState(static_cast(_state)); } } // ============================================================================ // [AsmJit::X86CompilerJmpInst - GetJumpTarget] // ============================================================================ CompilerTarget* X86CompilerJmpInst::getJumpTarget() const { return _jumpTarget; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/x86.h0000755000000000000000000000104312467662066015673 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_H #define _ASMJIT_X86_H // [Dependencies - AsmJit] #include "core.h" #include "x86/x86assembler.h" #include "x86/x86compiler.h" #include "x86/x86compilercontext.h" #include "x86/x86compilerfunc.h" #include "x86/x86compileritem.h" #include "x86/x86cpuinfo.h" #include "x86/x86defs.h" #include "x86/x86func.h" #include "x86/x86operand.h" #include "x86/x86util.h" // [Guard] #endif // _ASMJIT_X86_H desmume-0.9.11/src/utils/AsmJit/core/0000755000000000000000000000000012467663413016021 5ustar rootrootdesmume-0.9.11/src/utils/AsmJit/core/assert.cpp0000755000000000000000000000127512467662066020041 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" // [Api-Begin] #include "../core/apibegin.h" // helpers namespace AsmJit { // ============================================================================ // [AsmJit::Assert] // ============================================================================ void assertionFailure(const char* file, int line, const char* exp) { fprintf(stderr, "*** ASSERTION FAILURE at %s (line %d)\n" "*** %s\n", file, line, exp); exit(1); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/cpuinfo.h0000755000000000000000000000665312467662066017655 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_CPUINFO_H #define _ASMJIT_CORE_CPUINFO_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::CpuInfo] // ============================================================================ //! @brief Informations about host cpu. struct CpuInfo { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline CpuInfo(uint32_t size = sizeof(CpuInfo)) : _size(size) { } // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get CPU vendor string. inline const char* getVendorString() const { return _vendorString; } //! @brief Get CPU brand string. inline const char* getBrandString() const { return _brandString; } //! @brief Get CPU vendor ID. inline uint32_t getVendorId() const { return _vendorId; } //! @brief Get CPU family ID. inline uint32_t getFamily() const { return _family; } //! @brief Get CPU model ID. inline uint32_t getModel() const { return _model; } //! @brief Get CPU stepping. inline uint32_t getStepping() const { return _stepping; } //! @brief Get CPU count. inline uint32_t getNumberOfProcessors() const { return _numberOfProcessors; } //! @brief Get CPU features. inline uint32_t getFeatures() const { return _features; } //! @brief Get CPU bugs. inline uint32_t getBugs() const { return _bugs; } //! @brief Get whether CPU has feature @a feature. inline bool hasFeature(uint32_t feature) { return (_features & feature) != 0; } //! @brief Get whether CPU has bug @a bug. inline bool hasBug(uint32_t bug) { return (_bugs & bug) != 0; } // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- //! @brief Detect number of processors. ASMJIT_API static uint32_t detectNumberOfProcessors(); //! @brief Get global instance of @ref CpuInfo. ASMJIT_API static const CpuInfo* getGlobal(); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Size of CpuInfo structure (in bytes). uint32_t _size; //! @brief Cpu short vendor string. char _vendorString[16]; //! @brief Cpu long vendor string (brand). char _brandString[64]; //! @brief Cpu vendor id (see @c AsmJit::CpuInfo::VendorId enum). uint32_t _vendorId; //! @brief Cpu family ID. uint32_t _family; //! @brief Cpu model ID. uint32_t _model; //! @brief Cpu stepping. uint32_t _stepping; //! @brief Number of processors or cores. uint32_t _numberOfProcessors; //! @brief Cpu features bitfield, see @c AsmJit::CpuInfo::Feature enum). uint32_t _features; //! @brief Cpu bugs bitfield, see @c AsmJit::CpuInfo::Bug enum). uint32_t _bugs; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_CPUINFO_H desmume-0.9.11/src/utils/AsmJit/core/logger.h0000755000000000000000000002055312467662066017464 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_LOGGER_H #define _ASMJIT_CORE_LOGGER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/defs.h" #include "../core/stringbuilder.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Logging //! @{ // ============================================================================ // [AsmJit::Logger] // ============================================================================ //! @brief Abstract logging class. //! //! This class can be inherited and reimplemented to fit into your logging //! subsystem. When reimplementing use @c AsmJit::Logger::log() method to //! log into your stream. //! //! This class also contain @c _enabled member that can be used to enable //! or disable logging. struct Logger { ASMJIT_NO_COPY(Logger) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create logger. ASMJIT_API Logger(); //! @brief Destroy logger. ASMJIT_API virtual ~Logger(); // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- //! @brief Abstract method to log output. //! //! Default implementation that is in @c AsmJit::Logger is to do nothing. //! It's virtual to fit to your logging system. virtual void logString(const char* buf, size_t len = kInvalidSize) = 0; //! @brief Log formatter message (like sprintf) sending output to @c logString() method. ASMJIT_API virtual void logFormat(const char* fmt, ...); // -------------------------------------------------------------------------- // [Flags] // -------------------------------------------------------------------------- //! @brief Get logger flags (used internally by Assembler/Compiler). inline uint32_t getFlags() const { return _flags; } // -------------------------------------------------------------------------- // [Enabled] // -------------------------------------------------------------------------- //! @brief Return @c true if logging is enabled. inline bool isEnabled() const { return (_flags & kLoggerIsEnabled) != 0; } //! @brief Set logging to enabled or disabled. ASMJIT_API virtual void setEnabled(bool enabled); // -------------------------------------------------------------------------- // [Used] // -------------------------------------------------------------------------- //! @brief Get whether the logger should be used. inline bool isUsed() const { return (_flags & kLoggerIsUsed) != 0; } // -------------------------------------------------------------------------- // [LogBinary] // -------------------------------------------------------------------------- //! @brief Get whether logging of binary output is enabled. inline bool getLogBinary() const { return (_flags & kLoggerOutputBinary) != 0; } //! @brief Enable or disable binary output logging. ASMJIT_API void setLogBinary(bool value); // -------------------------------------------------------------------------- // [HexImmediate] // -------------------------------------------------------------------------- inline bool getHexImmediate() const { return (_flags & kLoggerOutputHexImmediate) != 0; } ASMJIT_API void setHexImmediate(bool value); // -------------------------------------------------------------------------- // [HexDisplacement] // -------------------------------------------------------------------------- inline bool getHexDisplacement() const { return (_flags & kLoggerOutputHexDisplacement) != 0; } ASMJIT_API void setHexDisplacement(bool value); // -------------------------------------------------------------------------- // [InstructionPrefix] // -------------------------------------------------------------------------- //! @brief Get instruction prefix. inline const char* getInstructionPrefix() const { return _instructionPrefix; } //! @brief Set instruction prefix. ASMJIT_API void setInstructionPrefix(const char* prefix); //! @brief Reset instruction prefix. inline void resetInstructionPrefix() { setInstructionPrefix(NULL); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Flags, see @ref kLoggerFlag. uint32_t _flags; //! @brief Instrictions and macro-instructions prefix. char _instructionPrefix[12]; }; // ============================================================================ // [AsmJit::FileLogger] // ============================================================================ //! @brief Logger that can log to standard C @c FILE* stream. struct FileLogger : public Logger { ASMJIT_NO_COPY(FileLogger) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @c FileLogger. //! @param stream FILE stream where logging will be sent (can be @c NULL //! to disable logging). ASMJIT_API FileLogger(FILE* stream = NULL); //! @brief Destroy the @ref FileLogger. ASMJIT_API virtual ~FileLogger(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get @c FILE* stream. //! //! @note Return value can be @c NULL. inline FILE* getStream() const { return _stream; } //! @brief Set @c FILE* stream. //! //! @param stream @c FILE stream where to log output (can be @c NULL to //! disable logging). ASMJIT_API void setStream(FILE* stream); // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- ASMJIT_API virtual void logString(const char* buf, size_t len = kInvalidSize); // -------------------------------------------------------------------------- // [Enabled] // -------------------------------------------------------------------------- ASMJIT_API virtual void setEnabled(bool enabled); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief C file stream. FILE* _stream; }; // ============================================================================ // [AsmJit::StringLogger] // ============================================================================ //! @brief String logger. struct StringLogger : public Logger { ASMJIT_NO_COPY(StringLogger) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new @ref StringLogger. ASMJIT_API StringLogger(); //! @brief Destroy the @ref StringLogger. ASMJIT_API virtual ~StringLogger(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get char* pointer which represents the serialized //! string. //! //! The pointer is owned by @ref StringLogger, it can't be modified or freed. inline const char* getString() const { return _stringBuilder.getData(); } //! @brief Clear the serialized string. inline void clearString() { _stringBuilder.clear(); } // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- ASMJIT_API virtual void logString(const char* buf, size_t len = kInvalidSize); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Output. StringBuilder _stringBuilder; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_LOGGER_H desmume-0.9.11/src/utils/AsmJit/core/operand.h0000755000000000000000000004226312467662066017637 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_OPERAND_H #define _ASMJIT_CORE_OPERAND_H // [Dependencies - AsmJit] #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::_OperandData] // ============================================================================ //! @internal //! //! @brief Base operand data. struct _OpBase { //! @brief Type of operand, see @c kOperandType. uint8_t op; //! @brief Size of operand (register, address, immediate, or variable). uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand ID (private variable for @c Assembler and @c Compiler classes). //! //! @note Uninitialized operand has always zero id. uint32_t id; }; //! @internal //! //! @brief Label operand data. struct _OpLabel { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandLabel). uint8_t op; //! @brief Size of label, currently not used. uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand ID. uint32_t id; }; //! @internal //! //! @brief Register operand data. struct _OpReg { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandReg). uint8_t op; //! @brief Size of register. uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand id. uint32_t id; //! @brief Register/Variable code, see @c REG. uint32_t code; }; //! @internal //! //! @brief Variable operand data. struct _OpVar { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandVar). uint8_t op; //! @brief Size of variable (0 if don't known). uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand ID. uint32_t id; //! @brief Type (and later also code) of register, see @c kX86RegType, @c kX86RegCode. //! //! @note Register code and variable code are two different things. In most //! cases regCode is very related to varType, but general purpose registers //! are divided to 64-bit, 32-bit, 16-bit and 8-bit entities so the regCode //! can be used to access these, varType remains unchanged from the //! initialization state. Variable type describes mainly variable type and //! home memory size. uint32_t regCode; //! @brief Type of variable. See @c kX86VarType enum. uint32_t varType; }; //! @internal //! //! @brief Memory operand data. struct _OpMem { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandMem). uint8_t op; //! @brief Size of pointer. uint8_t size; //! @brief Memory operand type, see @c kOperandMemType. uint8_t type; //! @brief Segment override prefix, see @c kX86Seg. uint8_t segment : 4; //! @brief Emit MOV/LEA instruction using 16-bit/32-bit form of base/index //! registers. uint8_t sizePrefix : 1; //! @brief Index register shift/scale (0 to 3 inclusive, see @c kScale). uint8_t shift : 3; //! @brief Operand ID. uint32_t id; //! @brief Base register index, variable or label id. uint32_t base; //! @brief Index register index or variable id. uint32_t index; //! @brief Target (for 32-bit, absolute address). void* target; //! @brief Displacement. sysint_t displacement; }; //! @internal //! //! @brief Immediate operand data. struct _OpImm { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandImm).. uint8_t op; //! @brief Size of immediate (or 0 to autodetect). uint8_t size; //! @brief @c true if immediate is unsigned. uint8_t isUnsigned; //! @brief Not used. uint8_t reserved; //! @brief Operand ID. uint32_t id; //! @brief Immediate value. sysint_t value; }; //! @internal //! //! @brief Binary operand data. struct _OpBin { //! @brief First four 32-bit integers. uint32_t u32[4]; //! @brief Second two 32-bit or 64-bit integers. uintptr_t uptr[2]; }; // ============================================================================ // [AsmJit::Operand] // ============================================================================ //! @brief Operand can contain register, memory location, immediate, or label. struct Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create an uninitialized operand. inline Operand() { memset(this, 0, sizeof(Operand)); _base.id = kInvalidValue; } //! @brief Create a reference to @a other operand. inline Operand(const Operand& other) { _init(other); } #if !defined(ASMJIT_NODOC) inline Operand(const _DontInitialize&) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Init & Copy] // -------------------------------------------------------------------------- //! @internal //! //! @brief Initialize operand to @a other (used by constructors). inline void _init(const Operand& other) { memcpy(this, &other, sizeof(Operand)); } //! @internal //! //! @brief Initialize operand to @a other (used by assign operators). inline void _copy(const Operand& other) { memcpy(this, &other, sizeof(Operand)); } // -------------------------------------------------------------------------- // [Data] // -------------------------------------------------------------------------- template inline T& getData() { return reinterpret_cast(_base); } template inline const T& getData() const { return reinterpret_cast(_base); } // -------------------------------------------------------------------------- // [Type] // -------------------------------------------------------------------------- //! @brief Get type of the operand, see @c kOperandType. inline uint32_t getType() const { return _base.op; } //! @brief Get whether the operand is none (@c kOperandNone). inline bool isNone() const { return (_base.op == kOperandNone); } //! @brief Get whether the operand is any (general purpose, mmx or sse) register (@c kOperandReg). inline bool isReg() const { return (_base.op == kOperandReg); } //! @brief Get whether the operand is memory address (@c kOperandMem). inline bool isMem() const { return (_base.op == kOperandMem); } //! @brief Get whether the operand is immediate (@c kOperandImm). inline bool isImm() const { return (_base.op == kOperandImm); } //! @brief Get whether the operand is label (@c kOperandLabel). inline bool isLabel() const { return (_base.op == kOperandLabel); } //! @brief Get whether the operand is variable (@c kOperandVar). inline bool isVar() const { return (_base.op == kOperandVar); } //! @brief Get whether the operand is variable or memory. inline bool isVarMem() const { return ((_base.op & (kOperandVar | kOperandMem)) != 0); } //! @brief Get whether the operand is register and type of register is @a regType. inline bool isRegType(uint32_t regType) const { return (_base.op == kOperandReg) & ((_reg.code & kRegTypeMask) == regType); } //! @brief Get whether the operand is register and code of register is @a regCode. inline bool isRegCode(uint32_t regCode) const { return (_base.op == kOperandReg) & (_reg.code == regCode); } //! @brief Get whether the operand is register and index of register is @a regIndex. inline bool isRegIndex(uint32_t regIndex) const { return (_base.op == kOperandReg) & ((_reg.code & kRegIndexMask) == (regIndex & kRegIndexMask)); } //! @brief Get whether the operand is any register or memory. inline bool isRegMem() const { return ((_base.op & (kOperandReg | kOperandMem)) != 0); } //! @brief Get whether the operand is register of @a regType type or memory. inline bool isRegTypeMem(uint32_t regType) const { return ((_base.op == kOperandReg) & ((_reg.code & kRegTypeMask) == regType)) | (_base.op == kOperandMem); } // -------------------------------------------------------------------------- // [Size] // -------------------------------------------------------------------------- //! @brief Get size of the operand in bytes. inline uint32_t getSize() const { return _base.size; } // -------------------------------------------------------------------------- // [Id] // -------------------------------------------------------------------------- //! @brief Return operand Id (Operand Id's are used internally by //! @c Assembler and @c Compiler classes). //! //! @note There is no way how to change or remove operand id. If you don't //! need the operand just assign different operand to this one. inline uint32_t getId() const { return _base.id; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- union { //! @brief Base operand data. _OpBase _base; //! @brief Label operand data. _OpLabel _lbl; //! @brief Register operand data. _OpReg _reg; //! @brief Variable operand data. _OpVar _var; //! @brief Memory operand data. _OpMem _mem; //! @brief Immediate operand data. _OpImm _imm; //! @brief Binary data. _OpBin _bin; }; }; ASMJIT_VAR const Operand noOperand; // ============================================================================ // [AsmJit::Reg] // ============================================================================ //! @brief Base class for all register operands. struct Reg : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new base register. inline Reg(uint32_t code, uint32_t size) : Operand(_DontInitialize()) { _reg.op = kOperandReg; _reg.size = (uint8_t)size; _reg.id = kInvalidValue; _reg.code = code; } //! @brief Create a new reference to @a other. inline Reg(const Reg& other) : Operand(other) {} #if !defined(ASMJIT_NODOC) inline Reg(const _DontInitialize& dontInitialize) : Operand(dontInitialize) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Get register code, see @c REG. inline uint32_t getRegCode() const { return (uint32_t)(_reg.code); } //! @brief Get register type, see @c REG. inline uint32_t getRegType() const { return (uint32_t)(_reg.code & kRegTypeMask); } //! @brief Get register index (value from 0 to 7/15). inline uint32_t getRegIndex() const { return (uint32_t)(_reg.code & kRegIndexMask); } //! @brief Get whether register code is equal to @a code. inline bool isRegCode(uint32_t code) const { return _reg.code == code; } //! @brief Get whether register code is equal to @a type. inline bool isRegType(uint32_t type) const { return (uint32_t)(_reg.code & kRegTypeMask) == type; } //! @brief Get whether register index is equal to @a index. inline bool isRegIndex(uint32_t index) const { return (uint32_t)(_reg.code & kRegIndexMask) == index; } //! @brief Set register code to @a code. inline Reg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline Reg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- inline Reg& operator=(const Reg& other) { _copy(other); return *this; } inline bool operator==(const Reg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const Reg& other) const { return getRegCode() != other.getRegCode(); } }; // ============================================================================ // [AsmJit::Imm] // ============================================================================ //! @brief Immediate operand. //! //! Immediate operand is part of instruction (it's inlined after it). //! //! To create immediate operand, use @c imm() and @c uimm() constructors //! or constructors provided by @c Immediate class itself. struct Imm : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new immediate value (initial value is 0). Imm() : Operand(_DontInitialize()) { _imm.op = kOperandImm; _imm.size = 0; _imm.isUnsigned = false; _imm.reserved = 0; _imm.id = kInvalidValue; _imm.value = 0; } //! @brief Create a new signed immediate value, assigning the value to @a i. Imm(sysint_t i) : Operand(_DontInitialize()) { _imm.op = kOperandImm; _imm.size = 0; _imm.isUnsigned = false; _imm.reserved = 0; _imm.id = kInvalidValue; _imm.value = i; } //! @brief Create a new signed or unsigned immediate value, assigning the value to @a i. Imm(sysint_t i, bool isUnsigned) : Operand(_DontInitialize()) { _imm.op = kOperandImm; _imm.size = 0; _imm.isUnsigned = isUnsigned; _imm.reserved = 0; _imm.id = kInvalidValue; _imm.value = i; } //! @brief Create a new immediate value from @a other. inline Imm(const Imm& other) : Operand(other) { } // -------------------------------------------------------------------------- // [Immediate Specific] // -------------------------------------------------------------------------- //! @brief Get whether an immediate is unsigned value. inline bool isUnsigned() const { return _imm.isUnsigned != 0; } //! @brief Get signed immediate value. inline sysint_t getValue() const { return _imm.value; } //! @brief Get unsigned immediate value. inline sysuint_t getUValue() const { return static_cast(_imm.value); } //! @brief Set immediate value as signed type to @a val. inline Imm& setValue(sysint_t val, bool isUnsigned = false) { _imm.value = val; _imm.isUnsigned = isUnsigned; return *this; } //! @brief Set immediate value as unsigned type to @a val. inline Imm& setUValue(sysuint_t val) { _imm.value = (sysint_t)val; _imm.isUnsigned = true; return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- //! @brief Assign a signed value @a val to the immediate operand. inline Imm& operator=(sysint_t val) { setValue(val); return *this; } //! @brief Assign @a other to the immediate operand. inline Imm& operator=(const Imm& other) { _copy(other); return *this; } }; //! @brief Create signed immediate value operand. ASMJIT_API Imm imm(sysint_t i); //! @brief Create unsigned immediate value operand. ASMJIT_API Imm uimm(sysuint_t i); // ============================================================================ // [AsmJit::Label] // ============================================================================ //! @brief Label (jump target or data location). //! //! Label represents locations typically used as jump targets, but may be also //! used as position where are stored constants or static variables. If you //! want to use @c Label you need first to associate it with @c Assembler or //! @c Compiler instance. To create new label use @c Assembler::newLabel() or //! @c Compiler::newLabel(). //! //! Example of using labels: //! //! @code //! // Create Assembler or Compiler instance. //! X86Assembler a; //! //! // Create Label instance. //! Label L_1(a); //! //! // ... your code ... //! //! // Using label, see @c AsmJit::Assembler or @c AsmJit::Compiler. //! a.jump(L_1); //! //! // ... your code ... //! //! // Bind label to current position, see @c AsmJit::Assembler::bind() or //! // @c AsmJit::Compiler::bind(). //! a.bind(L_1); //! @endcode struct Label : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new, unassociated label. inline Label() : Operand(_DontInitialize()) { _lbl.op = kOperandLabel; _lbl.size = 0; _lbl.id = kInvalidValue; } //! @brief Create reference to another label. inline Label(const Label& other) : Operand(other) {} //! @brief Destroy the label. inline ~Label() {} // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Label& operator=(const Label& other) { _copy(other); return *this; } inline bool operator==(const Label& other) const { return _base.id == other._base.id; } inline bool operator!=(const Label& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; //! @} } // AsmJit namespace // [Guard] #endif // _ASMJIT_CORE_OPERAND_H desmume-0.9.11/src/utils/AsmJit/core/memorymanager.cpp0000755000000000000000000007330212467662066021403 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/lock.h" #include "../core/memorymanager.h" #include "../core/virtualmemory.h" // [Api-Begin] #include "../core/apibegin.h" // This file contains implementation of virtual memory management for AsmJit // library. The initial concept is to keep this implementation simple but // efficient. There are several goals I decided to write implementation myself. // // Goals: // - We need usually to allocate blocks of 64 bytes long and more. // - Alignment of allocated blocks is large - 32 bytes or 64 bytes. // - Keep memory manager information outside allocated virtual memory pages // (these pages allows execution of code). // - Keep implementation small. // // I think that implementation is not small and probably not too much readable, // so there is small know how. // // - Implementation is based on bit arrays and binary trees. Bit arrays // contains information about allocated and unused blocks of memory. Each // block size describes MemNode::density member. Count of blocks are // stored in MemNode::blocks member. For example if density is 64 and // count of blocks is 20, memory node contains 64*20 bytes of memory and // smallest possible allocation (and also alignment) is 64 bytes. So density // describes also memory alignment. Binary trees are used to enable fast // lookup into all addresses allocated by memory manager instance. This is // used mainly in MemoryManagerPrivate::free(). // // Bit array looks like this (empty = unused, X = used) - Size of block 64 // ------------------------------------------------------------------------- // | |X|X| | | | | |X|X|X|X|X|X| | | | | | | | | | | | |X| | | | |X|X|X| | | // ------------------------------------------------------------------------- // Bits array shows that there are 12 allocated blocks of 64 bytes, so total // allocated size is 768 bytes. Maximum count of continuous blocks is 12 // (see largest gap). namespace AsmJit { // ============================================================================ // [Bits Manipulation] // ============================================================================ #define BITS_PER_ENTITY (sizeof(size_t) * 8) static void _SetBit(size_t* buf, size_t index) { size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index buf += i; *buf |= (size_t)1 << j; } static void _ClearBit(size_t* buf, size_t index) { size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index buf += i; *buf &= ~((size_t)1 << j); } static void _SetBits(size_t* buf, size_t index, size_t len) { if (len == 0) return; size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index // How many bytes process in the first group. size_t c = BITS_PER_ENTITY - j; if (c > len) c = len; // Offset. buf += i; *buf++ |= ((~(size_t)0) >> (BITS_PER_ENTITY - c)) << j; len -= c; while (len >= BITS_PER_ENTITY) { *buf++ = ~(size_t)0; len -= BITS_PER_ENTITY; } if (len) { *buf |= ((~(size_t)0) >> (BITS_PER_ENTITY - len)); } } static void _ClearBits(size_t* buf, size_t index, size_t len) { if (len == 0) return; size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index // How many bytes process in the first group. size_t c = BITS_PER_ENTITY - j; if (c > len) c = len; // Offset. buf += i; *buf++ &= ~(((~(size_t)0) >> (BITS_PER_ENTITY - c)) << j); len -= c; while (len >= BITS_PER_ENTITY) { *buf++ = 0; len -= BITS_PER_ENTITY; } if (len) { *buf &= (~(size_t)0) << len; } } // ============================================================================ // [AsmJit::MemNode] // ============================================================================ #define M_DIV(x, y) ((x) / (y)) #define M_MOD(x, y) ((x) % (y)) template struct RbNode { // -------------------------------------------------------------------------- // [Node red-black tree tree, key is mem pointer]. // -------------------------------------------------------------------------- // Implementation is based on article by Julienne Walker (Public Domain), // including C code and original comments. Thanks for the excellent article. // Left[0] and right[1] nodes. T* node[2]; // Whether the node is RED. uint32_t red; // -------------------------------------------------------------------------- // [Chunk Memory] // -------------------------------------------------------------------------- // Virtual memory address. uint8_t* mem; }; // Get whether the node is red (NULL or node with red flag). template inline bool isRed(RbNode* node) { return node != NULL && node->red; } struct MemNode : public RbNode { // -------------------------------------------------------------------------- // [Node double-linked list] // -------------------------------------------------------------------------- MemNode* prev; // Prev node in list. MemNode* next; // Next node in list. // -------------------------------------------------------------------------- // [Chunk Data] // -------------------------------------------------------------------------- size_t size; // How many bytes contain this node. size_t blocks; // How many blocks are here. size_t density; // Minimum count of allocated bytes in this node (also alignment). size_t used; // How many bytes are used in this node. size_t largestBlock; // Contains largest block that can be allocated. size_t* baUsed; // Contains bits about used blocks. // (0 = unused, 1 = used). size_t* baCont; // Contains bits about continuous blocks. // (0 = stop, 1 = continue). // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- // Get available space. inline size_t getAvailable() const { return size - used; } inline void fillData(MemNode* other) { mem = other->mem; size = other->size; blocks = other->blocks; density = other->density; used = other->used; largestBlock = other->largestBlock; baUsed = other->baUsed; baCont = other->baCont; } }; // ============================================================================ // [AsmJit::M_Permanent] // ============================================================================ //! @brief Permanent node. struct PermanentNode { uint8_t* mem; // Base pointer (virtual memory address). size_t size; // Count of bytes allocated. size_t used; // Count of bytes used. PermanentNode* prev; // Pointer to prev chunk or NULL. // Get available space. inline size_t getAvailable() const { return size - used; } }; // ============================================================================ // [AsmJit::MemoryManagerPrivate] // ============================================================================ struct MemoryManagerPrivate { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- #if !defined(ASMJIT_WINDOWS) MemoryManagerPrivate(); #else MemoryManagerPrivate(HANDLE hProcess); #endif // ASMJIT_WINDOWS ~MemoryManagerPrivate(); // -------------------------------------------------------------------------- // [Allocation] // -------------------------------------------------------------------------- MemNode* createNode(size_t size, size_t density); void* allocPermanent(size_t vsize); void* allocFreeable(size_t vsize); bool free(void* address); bool shrink(void* address, size_t used); void freeAll(bool keepVirtualMemory); // Helpers to avoid ifdefs in the code. inline uint8_t* allocVirtualMemory(size_t size, size_t* vsize) { #if !defined(ASMJIT_WINDOWS) return (uint8_t*)VirtualMemory::alloc(size, vsize, true); #else return (uint8_t*)VirtualMemory::allocProcessMemory(_hProcess, size, vsize, true); #endif } inline void freeVirtualMemory(void* vmem, size_t vsize) { #if !defined(ASMJIT_WINDOWS) VirtualMemory::free(vmem, vsize); #else VirtualMemory::freeProcessMemory(_hProcess, vmem, vsize); #endif } // -------------------------------------------------------------------------- // [NodeList RB-Tree] // -------------------------------------------------------------------------- bool checkTree(); void insertNode(MemNode* node); MemNode* removeNode(MemNode* node); MemNode* findPtr(uint8_t* mem); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- #if defined(ASMJIT_WINDOWS) HANDLE _hProcess; // Process where to allocate memory. #endif // ASMJIT_WINDOWS Lock _lock; // Lock for thread safety. size_t _newChunkSize; // Default node size. size_t _newChunkDensity; // Default node density. size_t _allocated; // How many bytes are allocated. size_t _used; // How many bytes are used. // Memory nodes list. MemNode* _first; MemNode* _last; MemNode* _optimal; // Memory nodes tree. MemNode* _root; // Permanent memory. PermanentNode* _permanent; // Whether to keep virtual memory after destroy. bool _keepVirtualMemory; }; // ============================================================================ // [AsmJit::MemoryManagerPrivate - Construction / Destruction] // ============================================================================ #if !defined(ASMJIT_WINDOWS) MemoryManagerPrivate::MemoryManagerPrivate() : #else MemoryManagerPrivate::MemoryManagerPrivate(HANDLE hProcess) : _hProcess(hProcess), #endif _newChunkSize(65536), _newChunkDensity(64), _allocated(0), _used(0), _root(NULL), _first(NULL), _last(NULL), _optimal(NULL), _permanent(NULL), _keepVirtualMemory(false) { } MemoryManagerPrivate::~MemoryManagerPrivate() { // Freeable memory cleanup - Also frees the virtual memory if configured to. freeAll(_keepVirtualMemory); // Permanent memory cleanup - Never frees the virtual memory. PermanentNode* node = _permanent; while (node) { PermanentNode* prev = node->prev; ASMJIT_FREE(node); node = prev; } } // ============================================================================ // [AsmJit::MemoryManagerPrivate - Allocation] // ============================================================================ // Allocates virtual memory node and MemNode structure. // // Returns MemNode* on success, otherwise NULL. MemNode* MemoryManagerPrivate::createNode(size_t size, size_t density) { size_t vsize; uint8_t* vmem = allocVirtualMemory(size, &vsize); // Out of memory. if (vmem == NULL) return NULL; size_t blocks = (vsize / density); size_t bsize = (((blocks + 7) >> 3) + sizeof(size_t) - 1) & ~(size_t)(sizeof(size_t) - 1); MemNode* node = reinterpret_cast(ASMJIT_MALLOC(sizeof(MemNode))); uint8_t* data = reinterpret_cast(ASMJIT_MALLOC(bsize * 2)); // Out of memory. if (node == NULL || data == NULL) { freeVirtualMemory(vmem, vsize); if (node) ASMJIT_FREE(node); if (data) ASMJIT_FREE(data); return NULL; } // Initialize RbNode data. node->node[0] = NULL; node->node[1] = NULL; node->red = 1; node->mem = vmem; // Initialize MemNode data. node->prev = NULL; node->next = NULL; node->size = vsize; node->blocks = blocks; node->density = density; node->used = 0; node->largestBlock = vsize; memset(data, 0, bsize * 2); node->baUsed = reinterpret_cast(data); node->baCont = reinterpret_cast(data + bsize); return node; } void* MemoryManagerPrivate::allocPermanent(size_t vsize) { static const size_t permanentAlignment = 32; static const size_t permanentNodeSize = 32768; size_t over = vsize % permanentAlignment; if (over) over = permanentAlignment - over; size_t alignedSize = vsize + over; AutoLock locked(_lock); PermanentNode* node = _permanent; // Try to find space in allocated chunks. while (node && alignedSize > node->getAvailable()) node = node->prev; // Or allocate new node. if (node == NULL) { size_t nodeSize = permanentNodeSize; if (vsize > nodeSize) nodeSize = vsize; node = (PermanentNode*)ASMJIT_MALLOC(sizeof(PermanentNode)); // Out of memory. if (node == NULL) return NULL; node->mem = allocVirtualMemory(nodeSize, &node->size); // Out of memory. if (node->mem == NULL) { ASMJIT_FREE(node); return NULL; } node->used = 0; node->prev = _permanent; _permanent = node; } // Finally, copy function code to our space we reserved for. uint8_t* result = node->mem + node->used; // Update Statistics. node->used += alignedSize; _used += alignedSize; // Code can be null to only reserve space for code. return (void*)result; } void* MemoryManagerPrivate::allocFreeable(size_t vsize) { size_t i; // Current index. size_t need; // How many we need to be freed. size_t minVSize; // Align to 32 bytes (our default alignment). vsize = (vsize + 31) & ~(size_t)31; if (vsize == 0) return NULL; AutoLock locked(_lock); MemNode* node = _optimal; minVSize = _newChunkSize; // Try to find memory block in existing nodes. while (node) { // Skip this node? if ((node->getAvailable() < vsize) || (node->largestBlock < vsize && node->largestBlock != 0)) { MemNode* next = node->next; if (node->getAvailable() < minVSize && node == _optimal && next) _optimal = next; node = next; continue; } size_t* up = node->baUsed; // Current ubits address. size_t ubits; // Current ubits[0] value. size_t bit; // Current bit mask. size_t blocks = node->blocks; // Count of blocks in node. size_t cont = 0; // How many bits are currently freed in find loop. size_t maxCont = 0; // Largest continuous block (bits count). size_t j; need = M_DIV((vsize + node->density - 1), node->density); i = 0; // Try to find node that is large enough. while (i < blocks) { ubits = *up++; // Fast skip used blocks. if (ubits == ~(size_t)0) { if (cont > maxCont) maxCont = cont; cont = 0; i += BITS_PER_ENTITY; continue; } size_t max = BITS_PER_ENTITY; if (i + max > blocks) max = blocks - i; for (j = 0, bit = 1; j < max; bit <<= 1) { j++; if ((ubits & bit) == 0) { if (++cont == need) { i += j; i -= cont; goto _Found; } continue; } if (cont > maxCont) maxCont = cont; cont = 0; } i += BITS_PER_ENTITY; } // Because we traversed entire node, we can set largest node size that // will be used to cache next traversing.. node->largestBlock = maxCont * node->density; node = node->next; } // If we are here, we failed to find existing memory block and we must // allocate new. { size_t chunkSize = _newChunkSize; if (chunkSize < vsize) chunkSize = vsize; node = createNode(chunkSize, _newChunkDensity); if (node == NULL) return NULL; // Update binary tree. insertNode(node); ASMJIT_ASSERT(checkTree()); // Alloc first node at start. i = 0; need = (vsize + node->density - 1) / node->density; // Update statistics. _allocated += node->size; } _Found: // Update bits. _SetBits(node->baUsed, i, need); _SetBits(node->baCont, i, need - 1); // Update statistics. { size_t u = need * node->density; node->used += u; node->largestBlock = 0; _used += u; } // And return pointer to allocated memory. uint8_t* result = node->mem + i * node->density; ASMJIT_ASSERT(result >= node->mem && result <= node->mem + node->size - vsize); return result; } bool MemoryManagerPrivate::free(void* address) { if (address == NULL) return true; AutoLock locked(_lock); MemNode* node = findPtr((uint8_t*)address); if (node == NULL) return false; size_t offset = (size_t)((uint8_t*)address - (uint8_t*)node->mem); size_t bitpos = M_DIV(offset, node->density); size_t i = (bitpos / BITS_PER_ENTITY); size_t* up = node->baUsed + i; // Current ubits address. size_t* cp = node->baCont + i; // Current cbits address. size_t ubits = *up; // Current ubits[0] value. size_t cbits = *cp; // Current cbits[0] value. size_t bit = (size_t)1 << (bitpos % BITS_PER_ENTITY); size_t cont = 0; bool stop; for (;;) { stop = (cbits & bit) == 0; ubits &= ~bit; cbits &= ~bit; bit <<= 1; cont++; if (stop || bit == 0) { *up = ubits; *cp = cbits; if (stop) break; ubits = *++up; cbits = *++cp; bit = 1; } } // If the freed block is fully allocated node then it's needed to // update 'optimal' pointer in memory manager. if (node->used == node->size) { MemNode* cur = _optimal; do { cur = cur->prev; if (cur == node) { _optimal = node; break; } } while (cur); } // Statistics. cont *= node->density; if (node->largestBlock < cont) node->largestBlock = cont; node->used -= cont; _used -= cont; // If page is empty, we can free it. if (node->used == 0) { // Free memory associated with node (this memory is not accessed // anymore so it's safe). freeVirtualMemory(node->mem, node->size); ASMJIT_FREE(node->baUsed); node->baUsed = NULL; node->baCont = NULL; // Statistics. _allocated -= node->size; // Remove node. This function can return different node than // passed into, but data is copied into previous node if needed. ASMJIT_FREE(removeNode(node)); ASMJIT_ASSERT(checkTree()); } return true; } bool MemoryManagerPrivate::shrink(void* address, size_t used) { if (address == NULL) return false; if (used == 0) return free(address); AutoLock locked(_lock); MemNode* node = findPtr((uint8_t*)address); if (node == NULL) return false; size_t offset = (size_t)((uint8_t*)address - (uint8_t*)node->mem); size_t bitpos = M_DIV(offset, node->density); size_t i = (bitpos / BITS_PER_ENTITY); size_t* up = node->baUsed + i; // Current ubits address. size_t* cp = node->baCont + i; // Current cbits address. size_t ubits = *up; // Current ubits[0] value. size_t cbits = *cp; // Current cbits[0] value. size_t bit = (size_t)1 << (bitpos % BITS_PER_ENTITY); size_t cont = 0; size_t usedBlocks = (used + node->density - 1) / node->density; bool stop; // Find the first block we can mark as free. for (;;) { stop = (cbits & bit) == 0; if (stop) return true; if (++cont == usedBlocks) break; bit <<= 1; if (bit == 0) { ubits = *++up; cbits = *++cp; bit = 1; } } // Free the tail blocks. cont = ~(size_t)0; goto _EnterFreeLoop; for (;;) { stop = (cbits & bit) == 0; ubits &= ~bit; _EnterFreeLoop: cbits &= ~bit; bit <<= 1; cont++; if (stop || bit == 0) { *up = ubits; *cp = cbits; if (stop) break; ubits = *++up; cbits = *++cp; bit = 1; } } // Statistics. cont *= node->density; if (node->largestBlock < cont) node->largestBlock = cont; node->used -= cont; _used -= cont; return true; } void MemoryManagerPrivate::freeAll(bool keepVirtualMemory) { MemNode* node = _first; while (node) { MemNode* next = node->next; if (!keepVirtualMemory) freeVirtualMemory(node->mem, node->size); ASMJIT_FREE(node->baUsed); ASMJIT_FREE(node); node = next; } _allocated = 0; _used = 0; _root = NULL; _first = NULL; _last = NULL; _optimal = NULL; } // ============================================================================ // [AsmJit::MemoryManagerPrivate - NodeList RB-Tree] // ============================================================================ static int rbAssert(MemNode* root) { if (root == NULL) return 1; MemNode* ln = root->node[0]; MemNode* rn = root->node[1]; // Red violation. ASMJIT_ASSERT( !(isRed(root) && (isRed(ln) || isRed(rn))) ); int lh = rbAssert(ln); int rh = rbAssert(rn); // Invalid btree. ASMJIT_ASSERT(ln == NULL || ln->mem < root->mem); ASMJIT_ASSERT(rn == NULL || rn->mem > root->mem); // Black violation. ASMJIT_ASSERT( !(lh != 0 && rh != 0 && lh != rh) ); // Only count black links. if (lh != 0 && rh != 0) return isRed(root) ? lh : lh + 1; else return 0; } static inline MemNode* rbRotateSingle(MemNode* root, int dir) { MemNode* save = root->node[!dir]; root->node[!dir] = save->node[dir]; save->node[dir] = root; root->red = 1; save->red = 0; return save; } static inline MemNode* rbRotateDouble(MemNode* root, int dir) { root->node[!dir] = rbRotateSingle(root->node[!dir], !dir); return rbRotateSingle(root, dir); } bool MemoryManagerPrivate::checkTree() { return rbAssert(_root) > 0; } void MemoryManagerPrivate::insertNode(MemNode* node) { if (_root == NULL) { // Empty tree case. _root = node; } else { // False tree root. RbNode head = {0}; // Grandparent & parent. MemNode* g = NULL; MemNode* t = reinterpret_cast(&head); // Iterator & parent. MemNode* p = NULL; MemNode* q = t->node[1] = _root; int dir = 0, last; // Search down the tree. for (;;) { if (q == NULL) { // Insert new node at the bottom. q = node; p->node[dir] = node; } else if (isRed(q->node[0]) && isRed(q->node[1])) { // Color flip. q->red = 1; q->node[0]->red = 0; q->node[1]->red = 0; } // Fix red violation. if (isRed(q) && isRed(p)) { int dir2 = t->node[1] == g; t->node[dir2] = (q == p->node[last]) ? rbRotateSingle(g, !last) : rbRotateDouble(g, !last); } // Stop if found. if (q == node) break; last = dir; dir = q->mem < node->mem; // Update helpers. if (g != NULL) t = g; g = p; p = q; q = q->node[dir]; } // Update root. _root = head.node[1]; } // Make root black. _root->red = 0; // Link with others. node->prev = _last; if (_first == NULL) { _first = node; _last = node; _optimal = node; } else { node->prev = _last; _last->next = node; _last = node; } } MemNode* MemoryManagerPrivate::removeNode(MemNode* node) { // False tree root. RbNode head = {0}; // Helpers. MemNode* q = reinterpret_cast(&head); MemNode* p = NULL; MemNode* g = NULL; // Found item. MemNode* f = NULL; int dir = 1; // Set up. q->node[1] = _root; // Search and push a red down. while (q->node[dir] != NULL) { int last = dir; // Update helpers. g = p; p = q; q = q->node[dir]; dir = q->mem < node->mem; // Save found node. if (q == node) f = q; // Push the red node down. if (!isRed(q) && !isRed(q->node[dir])) { if (isRed(q->node[!dir])) { p = p->node[last] = rbRotateSingle(q, dir); } else if (!isRed(q->node[!dir])) { MemNode* s = p->node[!last]; if (s != NULL) { if (!isRed(s->node[!last]) && !isRed(s->node[last])) { // Color flip. p->red = 0; s->red = 1; q->red = 1; } else { int dir2 = g->node[1] == p; if (isRed(s->node[last])) g->node[dir2] = rbRotateDouble(p, last); else if (isRed(s->node[!last])) g->node[dir2] = rbRotateSingle(p, last); // Ensure correct coloring. q->red = g->node[dir2]->red = 1; g->node[dir2]->node[0]->red = 0; g->node[dir2]->node[1]->red = 0; } } } } } // Replace and remove. ASMJIT_ASSERT(f != NULL); ASMJIT_ASSERT(f != reinterpret_cast(&head)); ASMJIT_ASSERT(q != reinterpret_cast(&head)); if (f != q) f->fillData(q); p->node[p->node[1] == q] = q->node[q->node[0] == NULL]; // Update root and make it black. if ((_root = head.node[1]) != NULL) _root->red = 0; // Unlink. MemNode* next = q->next; MemNode* prev = q->prev; if (prev) { prev->next = next; } else { _first = next; } if (next) { next->prev = prev; } else { _last = prev; } if (_optimal == q) { _optimal = prev ? prev : next; } return q; } MemNode* MemoryManagerPrivate::findPtr(uint8_t* mem) { MemNode* cur = _root; while (cur) { uint8_t* curMem = cur->mem; if (mem < curMem) { // Go left. cur = cur->node[0]; continue; } else { uint8_t* curEnd = curMem + cur->size; if (mem >= curEnd) { // Go right. cur = cur->node[1]; continue; } else { // Match. break; } } } return cur; } // ============================================================================ // [AsmJit::MemoryManager] // ============================================================================ MemoryManager::MemoryManager() { } MemoryManager::~MemoryManager() { } MemoryManager* MemoryManager::getGlobal() { static VirtualMemoryManager memmgr; return &memmgr; } // ============================================================================ // [AsmJit::VirtualMemoryManager] // ============================================================================ #if !defined(ASMJIT_WINDOWS) VirtualMemoryManager::VirtualMemoryManager() { MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(); _d = (void*)d; } #else VirtualMemoryManager::VirtualMemoryManager() { MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(GetCurrentProcess()); _d = (void*)d; } VirtualMemoryManager::VirtualMemoryManager(HANDLE hProcess) { MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(hProcess); _d = (void*)d; } #endif // ASMJIT_WINDOWS VirtualMemoryManager::~VirtualMemoryManager() { MemoryManagerPrivate* d = reinterpret_cast(_d); delete d; } void* VirtualMemoryManager::alloc(size_t size, uint32_t type) { MemoryManagerPrivate* d = reinterpret_cast(_d); if (type == kMemAllocPermanent) return d->allocPermanent(size); else return d->allocFreeable(size); } bool VirtualMemoryManager::free(void* address) { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->free(address); } bool VirtualMemoryManager::shrink(void* address, size_t used) { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->shrink(address, used); } void VirtualMemoryManager::freeAll() { MemoryManagerPrivate* d = reinterpret_cast(_d); // Calling MemoryManager::freeAll() will never keep allocated memory. return d->freeAll(false); } size_t VirtualMemoryManager::getUsedBytes() { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->_used; } size_t VirtualMemoryManager::getAllocatedBytes() { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->_allocated; } bool VirtualMemoryManager::getKeepVirtualMemory() const { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->_keepVirtualMemory; } void VirtualMemoryManager::setKeepVirtualMemory(bool keepVirtualMemory) { MemoryManagerPrivate* d = reinterpret_cast(_d); d->_keepVirtualMemory = keepVirtualMemory; } // ============================================================================ // [AsmJit::VirtualMemoryManager - Debug] // ============================================================================ #if defined(ASMJIT_MEMORY_MANAGER_DUMP) struct GraphVizContext { GraphVizContext(); ~GraphVizContext(); bool openFile(const char* fileName); void closeFile(); void dumpNode(MemNode* node); void connect(MemNode* node, MemNode* other, const char* dst); FILE* file; }; GraphVizContext::GraphVizContext() : file(NULL) { } GraphVizContext::~GraphVizContext() { closeFile(); } bool GraphVizContext::openFile(const char* fileName) { file = fopen(fileName, "w"); return file != NULL; } void GraphVizContext::closeFile() { if (file) { fclose(file); file = NULL; } } void GraphVizContext::dumpNode(MemNode* node) { fprintf(file, " NODE_%p [shape=record, style=filled, color=%s, label=\"|Mem: %p, Used: %d/%d|\"];\n", node, node->red ? "red" : "gray", node->mem, node->used, node->size); if (node->node[0]) connect(node, node->node[0], "L"); if (node->node[1]) connect(node, node->node[1], "R"); } void GraphVizContext::connect(MemNode* node, MemNode* other, const char* dst) { dumpNode(other); fprintf(file, " NODE_%p:%s -> NODE_%p:C", node, dst, other); if (other->red) fprintf(file, " [style=bold, color=red]"); fprintf(file, ";\n"); } void VirtualMemoryManager::dump(const char* fileName) { MemoryManagerPrivate* d = reinterpret_cast(_d); GraphVizContext ctx; if (!ctx.openFile(fileName)) return; fprintf(ctx.file, "digraph {\n"); if (d->_root) ctx.dumpNode(d->_root); fprintf(ctx.file, "}\n"); } #endif // ASMJIT_MEMORY_MANAGER_DUMP } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/stringbuilder.cpp0000755000000000000000000002166612467662066021423 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/intutil.h" #include "../core/stringbuilder.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // Should be placed in read-only memory. static const char StringBuilder_empty[4] = { 0 }; // ============================================================================ // [AsmJit::StringBuilder - Construction / Destruction] // ============================================================================ StringBuilder::StringBuilder() : _data(const_cast(StringBuilder_empty)), _length(0), _capacity(0), _canFree(false) { } StringBuilder::~StringBuilder() { if (_canFree) ASMJIT_FREE(_data); } // ============================================================================ // [AsmJit::StringBuilder - Prepare / Reserve] // ============================================================================ char* StringBuilder::prepare(uint32_t op, size_t len) { // -------------------------------------------------------------------------- // [Set] // -------------------------------------------------------------------------- if (op == kStringBuilderOpSet) { // We don't care here, but we can't return a NULL pointer since it indicates // failure in memory allocation. if (len == 0) { if (_data != StringBuilder_empty) _data[0] = 0; _length = 0; return _data; } if (_capacity < len) { if (len >= IntUtil::maxValue() - sizeof(uintptr_t) * 2) return NULL; size_t to = IntUtil::align(len, sizeof(uintptr_t)); if (to < 256 - sizeof(uintptr_t)) to = 256 - sizeof(uintptr_t); char* newData = static_cast(ASMJIT_MALLOC(to + sizeof(uintptr_t))); if (newData == NULL) { clear(); return NULL; } if (_canFree) ASMJIT_FREE(_data); _data = newData; _capacity = to + sizeof(uintptr_t) - 1; _canFree = true; } _data[len] = 0; _length = len; ASMJIT_ASSERT(_length <= _capacity); return _data; } // -------------------------------------------------------------------------- // [Append] // -------------------------------------------------------------------------- else { // We don't care here, but we can't return a NULL pointer since it indicates // failure in memory allocation. if (len == 0) return _data + _length; // Overflow. if (IntUtil::maxValue() - sizeof(uintptr_t) * 2 - _length < len) return NULL; size_t after = _length + len; if (_capacity < after) { size_t to = _capacity; if (to < 256) to = 256; while (to < 1024 * 1024 && to < after) { to *= 2; } if (to < after) { to = after; if (to < (IntUtil::maxValue() - 1024 * 32)) to = IntUtil::align(to, 1024 * 32); } to = IntUtil::align(to, sizeof(uintptr_t)); char* newData = static_cast(ASMJIT_MALLOC(to + sizeof(uintptr_t))); if (newData == NULL) return NULL; ::memcpy(newData, _data, _length); if (_canFree) ASMJIT_FREE(_data); _data = newData; _capacity = to + sizeof(uintptr_t) - 1; _canFree = true; } char* ret = _data + _length; _data[after] = 0; _length = after; ASMJIT_ASSERT(_length <= _capacity); return ret; } } bool StringBuilder::reserve(size_t to) { if (_capacity >= to) return true; if (to >= IntUtil::maxValue() - sizeof(uintptr_t) * 2) return false; to = IntUtil::align(to, sizeof(uintptr_t)); char* newData = static_cast(ASMJIT_MALLOC(to + sizeof(uintptr_t))); if (newData == NULL) return false; ::memcpy(newData, _data, _length + 1); if (_canFree) ASMJIT_FREE(_data); _data = newData; _capacity = to + sizeof(uintptr_t) - 1; _canFree = true; return true; } // ============================================================================ // [AsmJit::StringBuilder - Clear] // ============================================================================ void StringBuilder::clear() { if (_data != StringBuilder_empty) _data[0] = 0; _length = 0; } // ============================================================================ // [AsmJit::StringBuilder - Methods] // ============================================================================ bool StringBuilder::_opString(uint32_t op, const char* str, size_t len) { if (len == kInvalidSize) len = ::strlen(str); char* p = prepare(op, len); if (p == NULL) return false; ::memcpy(p, str, len); return true; } bool StringBuilder::_opChars(uint32_t op, char c, size_t len) { char* p = prepare(op, len); if (p == NULL) return false; ::memset(p, c, len); return true; } static const char StringBuilder_numbers[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; bool StringBuilder::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, uint32_t flags) { if (base < 2 || base > 36) base = 10; char buf[128]; char* p = buf + ASMJIT_ARRAY_SIZE(buf); uint64_t orig = i; char sign = '\0'; // -------------------------------------------------------------------------- // [Sign] // -------------------------------------------------------------------------- if ((flags & kStringBuilderNumSigned) != 0 && static_cast(i) < 0) { i = static_cast(-static_cast(i)); sign = '-'; } else if ((flags & kStringBuilderNumShowSign) != 0) { sign = '+'; } else if ((flags & kStringBuilderNumShowSpace) != 0) { sign = ' '; } // -------------------------------------------------------------------------- // [Number] // -------------------------------------------------------------------------- do { uint64_t d = i / base; uint64_t r = i % base; *--p = StringBuilder_numbers[r]; i = d; } while (i); size_t numberLength = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p); // -------------------------------------------------------------------------- // [Alternate Form] // -------------------------------------------------------------------------- if ((flags & kStringBuilderNumAlternate) != 0) { if (base == 8) { if (orig != 0) *--p = '0'; } if (base == 16) { *--p = 'x'; *--p = '0'; } } // -------------------------------------------------------------------------- // [Width] // -------------------------------------------------------------------------- if (sign != 0) *--p = sign; if (width > 256) width = 256; if (width <= numberLength) width = 0; else width -= numberLength; // -------------------------------------------------------------------------- // Write] // -------------------------------------------------------------------------- size_t prefixLength = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p) - numberLength; char* data = prepare(op, prefixLength + width + numberLength); if (data == NULL) return false; ::memcpy(data, p, prefixLength); data += prefixLength; ::memset(data, '0', width); data += width; ::memcpy(data, p + prefixLength, numberLength); return true; } bool StringBuilder::_opHex(uint32_t op, const void* data, size_t len) { if (len >= IntUtil::maxValue() / 2) return false; char* dst = prepare(op, len); if (dst == NULL) return false; const char* src = static_cast(data); for (size_t i = 0; i < len; i++, dst += 2, src += 1) { dst[0] = StringBuilder_numbers[(src[0] >> 4) & 0xF]; dst[1] = StringBuilder_numbers[(src[0] ) & 0xF]; } return true; } bool StringBuilder::_opVFormat(uint32_t op, const char* fmt, va_list ap) { char buf[1024]; vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap); buf[ASMJIT_ARRAY_SIZE(buf) - 1] = '\0'; return _opString(op, buf); } bool StringBuilder::setFormat(const char* fmt, ...) { bool result; va_list ap; va_start(ap, fmt); result = _opVFormat(kStringBuilderOpSet, fmt, ap); va_end(ap); return result; } bool StringBuilder::appendFormat(const char* fmt, ...) { bool result; va_list ap; va_start(ap, fmt); result = _opVFormat(kStringBuilderOpAppend, fmt, ap); va_end(ap); return result; } bool StringBuilder::eq(const char* str, size_t len) const { const char* aData = _data; const char* bData = str; size_t aLength = _length; size_t bLength = len; if (bLength == kInvalidSize) { size_t i; for (i = 0; i < aLength; i++) { if (aData[i] != bData[i] || bData[i] == 0) return false; } return bData[i] == 0; } else { if (aLength != bLength) return false; return ::memcmp(aData, bData, aLength) == 0; } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/stringutil.h0000755000000000000000000000213012467662066020400 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_STRINGUTIL_H #define _ASMJIT_CORE_STRINGUTIL_H // [Dependencies - AsmJit] #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::StringUtil] // ============================================================================ //! @brief String utilities. struct StringUtil { ASMJIT_API static char* copy(char* dst, const char* src, size_t len = kInvalidSize); ASMJIT_API static char* fill(char* dst, const int c, size_t len); ASMJIT_API static char* hex(char* dst, const uint8_t* src, size_t len); ASMJIT_API static char* utoa(char* dst, uintptr_t i, size_t base = 10); ASMJIT_API static char* itoa(char* dst, intptr_t i, size_t base = 10); static inline void memset32(uint32_t* p, uint32_t c, size_t len) { for (size_t i = 0; i < len; i++) p[i] = c; } }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_STRINGUTIL_H desmume-0.9.11/src/utils/AsmJit/core/cpuinfo.cpp0000755000000000000000000000414212467662066020177 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/cpuinfo.h" #if defined(ASMJIT_X86) || defined(ASMJIT_X64) #include "../x86/x86cpuinfo.h" #else // ? #endif // ASMJIT_X86 || ASMJIT_X64 // [Dependencies - Windows] #if defined(ASMJIT_WINDOWS) # include #endif // ASMJIT_WINDOWS // [Dependencies - Posix] #if defined(ASMJIT_POSIX) # include # include # include # include #endif // ASMJIT_POSIX // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CpuInfo - DetectNumberOfProcessors] // ============================================================================ uint32_t CpuInfo::detectNumberOfProcessors() { #if defined(ASMJIT_WINDOWS) SYSTEM_INFO info; ::GetSystemInfo(&info); return info.dwNumberOfProcessors; #elif defined(ASMJIT_POSIX) && defined(_SC_NPROCESSORS_ONLN) // It seems that sysconf returns the number of "logical" processors on both // mac and linux. So we get the number of "online logical" processors. long res = ::sysconf(_SC_NPROCESSORS_ONLN); if (res == -1) return 1; return static_cast(res); #else return 1; #endif } // ============================================================================ // [AsmJit::CpuInfo - GetGlobal] // ============================================================================ #if defined(ASMJIT_X86) || defined(ASMJIT_X64) struct InitializedCpuInfo : public X86CpuInfo { inline InitializedCpuInfo() : X86CpuInfo() { x86CpuDetect(this); } }; #else #error "AsmJit::CpuInfo - Unsupported CPU or compiler." #endif // ASMJIT_X86 || ASMJIT_X64 const CpuInfo* CpuInfo::getGlobal() { #if defined(ASMJIT_X86) || defined(ASMJIT_X64) static InitializedCpuInfo cpuInfo; #else #error "AsmJit::CpuInfo - Unsupported CPU or compiler." #endif // ASMJIT_X86 || ASMJIT_X64 return &cpuInfo; } } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/buffer.cpp0000755000000000000000000000316412467662066020010 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/buffer.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Buffer] // ============================================================================ void Buffer::emitData(const void* ptr, size_t len) { size_t max = getCapacity() - getOffset(); if (max < len && !realloc(getOffset() + len)) { return; } memcpy(_cur, ptr, len); _cur += len; } bool Buffer::realloc(size_t to) { if (getCapacity() < to) { size_t len = getOffset(); uint8_t *newdata; if (_data != NULL) newdata = (uint8_t*)ASMJIT_REALLOC(_data, to); else newdata = (uint8_t*)ASMJIT_MALLOC(to); if (newdata == NULL) return false; _data = newdata; _cur = newdata + len; _max = newdata + to; _max -= (to >= kBufferGrow) ? kBufferGrow : to; _capacity = to; } return true; } bool Buffer::grow() { size_t to = _capacity; if (to < 512) to = 1024; else if (to > 65536) to += 65536; else to <<= 1; return realloc(to); } void Buffer::reset() { if (_data == NULL) return; ASMJIT_FREE(_data); _data = NULL; _cur = NULL; _max = NULL; _capacity = 0; } uint8_t* Buffer::take() { uint8_t* data = _data; _data = NULL; _cur = NULL; _max = NULL; _capacity = 0; return data; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/operand.cpp0000755000000000000000000000163612467662066020171 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/operand.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Operand] // ============================================================================ const Operand noOperand; // ============================================================================ // [AsmJit::Imm] // ============================================================================ //! @brief Create signed immediate value operand. Imm imm(sysint_t i) { return Imm(i, false); } //! @brief Create unsigned immediate value operand. Imm uimm(sysuint_t i) { return Imm((sysint_t)i, true); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/defs.cpp0000755000000000000000000000212012467662066017447 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::getErrorString] // ============================================================================ const char* getErrorString(uint32_t error) { static const char* errorMessage[] = { "No error", "No heap memory", "No virtual memory", "Unknown instruction", "Illegal instruction", "Illegal addressing", "Illegal short jump", "No function defined", "Incomplete function", "Not enough registers", "Registers overlap", "Incompatible argument", "Incompatible return value", "Unknown error" }; // Saturate error code to be able to use errorMessage[]. if (error > kErrorCount) error = kErrorCount; return errorMessage[error]; } } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/func.cpp0000755000000000000000000000047212467662066017471 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/func.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/func.h0000755000000000000000000003640212467662066017140 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_FUNC_H #define _ASMJIT_CORE_FUNC_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [Forward Declaration] // ============================================================================ template struct TypeId; // ============================================================================ // [AsmJit::TypeId] // ============================================================================ #if defined(ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION) #define ASMJIT_DECLARE_TYPE_CORE(_PtrId_) \ template \ struct TypeId \ { \ enum \ { \ Id = static_cast(::AsmJit::kVarTypeInvalid) \ }; \ }; \ \ template \ struct TypeId { enum { Id = _PtrId_ }; } #else // Code without partial template specialization is a bit complex. We need to // determine whether the size of the return value of this function is equal // to sizeof(char) or sizeof(void*). Any sizeof() can be used to distinguish // between these two, but these are commonly used in other libraries as well. template char TypeId_NoPtiHelper(T*(*)()); // And specialization. void* TypeId_NoPtiHelper(...); #define ASMJIT_DECLARE_TYPE_CORE(_PtrId_) \ template \ struct TypeId \ { \ enum \ { \ Id = (sizeof( ::AsmJit::TypeId_NoPtiHelper((T(*)())0) ) == sizeof(char) \ ? static_cast(_PtrId_) \ : static_cast(::AsmJit::kVarTypeInvalid)) \ }; \ } #endif // ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION //! @brief Declare C/C++ type-id mapped to @c AsmJit::kX86VarType. #define ASMJIT_DECLARE_TYPE_ID(_T_, _Id_) \ template<> \ struct TypeId<_T_> { enum { Id = _Id_ }; } // ============================================================================ // [AsmJit::FuncArg] // ============================================================================ //! @brief Function argument translated from @ref FuncPrototype. struct FuncArg { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- inline uint32_t getVarType() const { return _varType; } inline uint32_t getRegIndex() const { return _regIndex; } inline bool hasRegIndex() const { return _regIndex != kRegIndexInvalid; } inline int32_t getStackOffset() const { return static_cast(_stackOffset); } inline bool hasStackOffset() const { return _stackOffset != kFuncStackInvalid; } //! @brief Get whether the argument is assigned, for private use only. inline bool isAssigned() const { return (_regIndex != kRegIndexInvalid) | (_stackOffset != kFuncStackInvalid); } // -------------------------------------------------------------------------- // [Reset] // -------------------------------------------------------------------------- //! @brief Reset the function argument to "unassigned state". inline void reset() { _packed = 0xFFFFFFFF; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- union { struct { //! @brief Variable type, see @c kVarType. uint8_t _varType; //! @brief Register index is argument is passed through register. uint8_t _regIndex; //! @brief Stack offset if argument is passed through stack. int16_t _stackOffset; }; //! @brief All members packed into single 32-bit integer. uint32_t _packed; }; }; // ============================================================================ // [AsmJit::FuncPrototype] // ============================================================================ //! @brief Function prototype. //! //! Function prototype contains information about function return type, count //! of arguments and their types. Function definition is low level structure //! which doesn't contain platform or calling convention specific information. struct FuncPrototype { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get function return value. inline uint32_t getReturnType() const { return _returnType; } //! @brief Get count of function arguments. inline uint32_t getArgumentsCount() const { return _argumentsCount; } //! @brief Get argument at index @a id. inline uint32_t getArgument(uint32_t id) const { ASMJIT_ASSERT(id < _argumentsCount); return _arguments[id]; } //! @brief Get function arguments' IDs. inline const uint32_t* getArguments() const { return _arguments; } //! @brief Set function definition - return type and arguments. inline void _setPrototype(uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { _returnType = returnType; _arguments = arguments; _argumentsCount = argumentsCount; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- uint32_t _returnType; uint32_t _argumentsCount; const uint32_t* _arguments; }; // ============================================================================ // [AsmJit::FuncDecl] // ============================================================================ //! @brief Function declaration. struct FuncDecl { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get function return value or @ref kInvalidValue if it's void. inline uint32_t getReturnType() const { return _returnType; } //! @brief Get count of function arguments. inline uint32_t getArgumentsCount() const { return _argumentsCount; } //! @brief Get function arguments array. inline FuncArg* getArguments() { return _arguments; } //! @brief Get function arguments array (const). inline const FuncArg* getArguments() const { return _arguments; } //! @brief Get function argument at index @a index. inline FuncArg& getArgument(size_t index) { ASMJIT_ASSERT(index < static_cast(_argumentsCount)); return _arguments[index]; } //! @brief Get function argument at index @a index. inline const FuncArg& getArgument(size_t index) const { ASMJIT_ASSERT(index < static_cast(_argumentsCount)); return _arguments[index]; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Function return type. uint8_t _returnType; //! @brief Count of arguments (in @c _argumentsList). uint8_t _argumentsCount; //! @brief Reserved for future use (alignment). uint8_t _reserved0[2]; //! @brief Function arguments array. FuncArg _arguments[kFuncArgsMax]; }; // ============================================================================ // [AsmJit::FuncBuilderX] // ============================================================================ //! @brief Custom function builder for up to 32 function arguments. struct FuncBuilderX : public FuncPrototype { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline FuncBuilderX() { _setPrototype(kVarTypeInvalid, _argumentsData, 0); } // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- template inline void setReturnTypeT() { setReturnTypeRaw(TypeId::Id); } template inline void setArgumentT(uint32_t id) { setArgumentRaw(id, TypeId::Id); } template inline void addArgumentT() { addArgumentRaw(TypeId::Id); } inline void setReturnTypeRaw(uint32_t returnType) { _returnType = returnType; } inline void setArgumentRaw(uint32_t id, uint32_t type) { ASMJIT_ASSERT(id < _argumentsCount); _argumentsData[id] = type; } inline void addArgumentRaw(uint32_t type) { ASMJIT_ASSERT(_argumentsCount < kFuncArgsMax); _argumentsData[_argumentsCount++] = type; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- uint32_t _argumentsData[kFuncArgsMax]; }; //! @brief Class used to build function without arguments. template struct FuncBuilder0 : public FuncPrototype { inline FuncBuilder0() { _setPrototype(TypeId::Id, NULL, 0); } }; //! @brief Class used to build function with 1 argument. template struct FuncBuilder1 : public FuncPrototype { inline FuncBuilder1() { static const uint32_t arguments[] = { TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 2 arguments. template struct FuncBuilder2 : public FuncPrototype { inline FuncBuilder2() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 3 arguments. template struct FuncBuilder3 : public FuncPrototype { inline FuncBuilder3() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 4 arguments. template struct FuncBuilder4 : public FuncPrototype { inline FuncBuilder4() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 5 arguments. template struct FuncBuilder5 : public FuncPrototype { inline FuncBuilder5() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 6 arguments. template struct FuncBuilder6 : public FuncPrototype { inline FuncBuilder6() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 7 arguments. template struct FuncBuilder7 : public FuncPrototype { inline FuncBuilder7() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 8 arguments. template struct FuncBuilder8 : public FuncPrototype { inline FuncBuilder8() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 9 arguments. template struct FuncBuilder9 : public FuncPrototype { inline FuncBuilder9() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 10 arguments. template struct FuncBuilder10 : public FuncPrototype { inline FuncBuilder10() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_FUNC_H desmume-0.9.11/src/utils/AsmJit/core/virtualmemory.cpp0000755000000000000000000000717112467662066021460 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/virtualmemory.h" // [Dependencies - Windows] #if defined(ASMJIT_WINDOWS) # include #endif // ASMJIT_WINDOWS // [Dependencies - Posix] #if defined(ASMJIT_POSIX) # include # include # include #endif // ASMJIT_POSIX // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::VirtualMemory - Windows] // ============================================================================ #if defined(ASMJIT_WINDOWS) struct VirtualMemoryLocal { VirtualMemoryLocal() { SYSTEM_INFO info; GetSystemInfo(&info); alignment = info.dwAllocationGranularity; pageSize = IntUtil::roundUpToPowerOf2(info.dwPageSize); } size_t alignment; size_t pageSize; }; static VirtualMemoryLocal& vm() { static VirtualMemoryLocal vm; return vm; }; void* VirtualMemory::alloc(size_t length, size_t* allocated, bool canExecute) { return allocProcessMemory(GetCurrentProcess(), length, allocated, canExecute); } void VirtualMemory::free(void* addr, size_t length) { return freeProcessMemory(GetCurrentProcess(), addr, length); } void* VirtualMemory::allocProcessMemory(HANDLE hProcess, size_t length, size_t* allocated, bool canExecute) { // VirtualAlloc rounds allocated size to page size automatically. size_t msize = IntUtil::roundUp(length, vm().pageSize); // Windows XP SP2 / Vista allow Data Excution Prevention (DEP). WORD protect = canExecute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; LPVOID mbase = VirtualAllocEx(hProcess, NULL, msize, MEM_COMMIT | MEM_RESERVE, protect); if (mbase == NULL) return NULL; ASMJIT_ASSERT(IntUtil::isAligned(reinterpret_cast(mbase), vm().alignment)); if (allocated != NULL) *allocated = msize; return mbase; } void VirtualMemory::freeProcessMemory(HANDLE hProcess, void* addr, size_t /* length */) { VirtualFreeEx(hProcess, addr, 0, MEM_RELEASE); } size_t VirtualMemory::getAlignment() { return vm().alignment; } size_t VirtualMemory::getPageSize() { return vm().pageSize; } #endif // ASMJIT_WINDOWS // ============================================================================ // [AsmJit::VirtualMemory - Posix] // ============================================================================ #if defined(ASMJIT_POSIX) // MacOS uses MAP_ANON instead of MAP_ANONYMOUS. #if !defined(MAP_ANONYMOUS) # define MAP_ANONYMOUS MAP_ANON #endif // MAP_ANONYMOUS struct VirtualMemoryLocal { VirtualMemoryLocal() { alignment = pageSize = ::getpagesize(); } size_t alignment; size_t pageSize; }; static VirtualMemoryLocal& vm() { static VirtualMemoryLocal vm; return vm; } void* VirtualMemory::alloc(size_t length, size_t* allocated, bool canExecute) { size_t msize = IntUtil::roundUp(length, vm().pageSize); int protection = PROT_READ | PROT_WRITE | (canExecute ? PROT_EXEC : 0); void* mbase = ::mmap(NULL, msize, protection, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mbase == MAP_FAILED) return NULL; if (allocated != NULL) *allocated = msize; return mbase; } void VirtualMemory::free(void* addr, size_t length) { munmap(addr, length); } size_t VirtualMemory::getAlignment() { return vm().alignment; } size_t VirtualMemory::getPageSize() { return vm().pageSize; } #endif // ASMJIT_POSIX } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/intutil.h0000755000000000000000000001620212467662066017671 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_INTUTIL_H #define _ASMJIT_CORE_INTUTIL_H // [Dependencies - AsmJit] #include "../core/assert.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::I32FPUnion] // ============================================================================ //! @internal //! //! @brief used to cast from float to 32-bit integer and vica versa. union I32FPUnion { //! @brief 32-bit signed integer value. int32_t i; //! @brief 32-bit SP-FP value. float f; }; // ============================================================================ // [AsmJit::I64FPUnion] // ============================================================================ //! @internal //! //! @brief used to cast from double to 64-bit integer and vica versa. union I64FPUnion { //! @brief 64-bit signed integer value. int64_t i; //! @brief 64-bit DP-FP value. double f; }; // ============================================================================ // [AsmJit::IntUtil] // ============================================================================ namespace IntUtil { // -------------------------------------------------------------------------- // [Min/Max] // -------------------------------------------------------------------------- // NOTE: Because some environments declare min() and max() as macros, we // decided to use different name so we never collide. template static inline T _min(const T& a, const T& b) { return a < b ? a : b; } template static inline T _max(const T& a, const T& b) { return a > b ? a : b; } // -------------------------------------------------------------------------- // [Limits] // -------------------------------------------------------------------------- template static inline T maxValue() { return ~T(0); } // -------------------------------------------------------------------------- // [IsInt / IsUInt] // -------------------------------------------------------------------------- //! @brief Returns @c true if a given integer @a x is signed 8-bit integer static inline bool isInt8(intptr_t x) { return x >= -128 && x <= 127; } //! @brief Returns @c true if a given integer @a x is unsigned 8-bit integer static inline bool isUInt8(intptr_t x) { return x >= 0 && x <= 255; } //! @brief Returns @c true if a given integer @a x is signed 16-bit integer static inline bool isInt16(intptr_t x) { return x >= -32768 && x <= 32767; } //! @brief Returns @c true if a given integer @a x is unsigned 16-bit integer static inline bool isUInt16(intptr_t x) { return x >= 0 && x <= 65535; } //! @brief Returns @c true if a given integer @a x is signed 16-bit integer static inline bool isInt32(intptr_t x) { #if defined(ASMJIT_X86) return true; #else return x >= ASMJIT_INT64_C(-2147483648) && x <= ASMJIT_INT64_C(2147483647); #endif } //! @brief Returns @c true if a given integer @a x is unsigned 16-bit integer static inline bool isUInt32(intptr_t x) { #if defined(ASMJIT_X86) return x >= 0; #else return x >= 0 && x <= ASMJIT_INT64_C(4294967295); #endif } // -------------------------------------------------------------------------- // [Masking] // -------------------------------------------------------------------------- static inline uint32_t maskFromIndex(uint32_t x) { ASMJIT_ASSERT(x < 32); return (1U << x); } static inline uint32_t maskUpToIndex(uint32_t x) { if (x >= 32) return 0xFFFFFFFF; else return (1U << x) - 1; } // -------------------------------------------------------------------------- // [Bits] // -------------------------------------------------------------------------- // From http://graphics.stanford.edu/~seander/bithacks.html . static inline uint32_t bitCount(uint32_t x) { x = x - ((x >> 1) & 0x55555555U); x = (x & 0x33333333U) + ((x >> 2) & 0x33333333U); return (((x + (x >> 4)) & 0x0F0F0F0FU) * 0x01010101U) >> 24; } static inline uint32_t findFirstBit(uint32_t mask) { for (uint32_t i = 0; i < sizeof(uint32_t) * 8; i++, mask >>= 1) { if (mask & 0x1) return i; } // kInvalidValue. return 0xFFFFFFFF; } // -------------------------------------------------------------------------- // [Alignment] // -------------------------------------------------------------------------- template static inline bool isAligned(T base, T alignment) { return (base % alignment) == 0; } //! @brief Align @a base to @a alignment. template static inline T align(T base, T alignment) { return (base + (alignment - 1)) & ~(alignment - 1); } //! @brief Get delta required to align @a base to @a alignment. template static inline T delta(T base, T alignment) { return align(base, alignment) - base; } // -------------------------------------------------------------------------- // [Round] // -------------------------------------------------------------------------- template static inline T roundUp(T base, T alignment) { T over = base % alignment; return base + (over > 0 ? alignment - over : 0); } template static inline T roundUpToPowerOf2(T base) { // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr., // figure 3-3, page 48, where the function is called clp2. base -= 1; // I'm trying to make this portable and MSVC strikes me the warning C4293: // "Shift count negative or too big, undefined behavior" // Fixing... #if defined(_MSC_VER) # pragma warning(push) # pragma warning(disable: 4293) #endif // _MSC_VER base = base | (base >> 1); base = base | (base >> 2); base = base | (base >> 4); if (sizeof(T) >= 2) base = base | (base >> 8); if (sizeof(T) >= 4) base = base | (base >> 16); if (sizeof(T) >= 8) base = base | (base >> 32); #if defined(_MSC_VER) # pragma warning(pop) #endif // _MSC_VER return base + 1; } // -------------------------------------------------------------------------- // [Cast] // -------------------------------------------------------------------------- //! @brief Binary cast from 32-bit integer to SP-FP value (@c float). static inline float int32AsFloat(int32_t i) { I32FPUnion u; u.i = i; return u.f; } //! @brief Binary cast SP-FP value (@c float) to 32-bit integer. static inline int32_t floatAsInt32(float f) { I32FPUnion u; u.f = f; return u.i; } //! @brief Binary cast from 64-bit integer to DP-FP value (@c double). static inline double int64AsDouble(int64_t i) { I64FPUnion u; u.i = i; return u.f; } //! @brief Binary cast from DP-FP value (@c double) to 64-bit integer. static inline int64_t doubleAsInt64(double f) { I64FPUnion u; u.f = f; return u.i; } }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_INTUTIL_H desmume-0.9.11/src/utils/AsmJit/core/compileritem.h0000755000000000000000000004453012467662066020677 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILERITEM_H #define _ASMJIT_CORE_COMPILERITEM_H // [Dependencies - AsmJit] #include "../core/compiler.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerItem] // ============================================================================ //! @brief Compiler item. //! //! @ref CompilerItem represents items generated by compiler by calling its //! methods to build functions, instruction stream, bind labels, etc... Each //! item contains its type information and virtual methods which are called at //! various compilation steps. struct CompilerItem { ASMJIT_NO_COPY(CompilerItem) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new @ref CompilerItem. //! //! @note Always use @ref Compiler to create an item! ASMJIT_API CompilerItem(Compiler* compiler, uint32_t type); //! @brief Destroy @ref CompilerItem. //! //! @note @ref Compiler keeps links into all items so it can destroy them //! when code generation finished or in the case that @ref Compiler was //! destroyed early (for example if an error happened). Never destroy items //! manually! ASMJIT_API virtual ~CompilerItem(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get associated compiler instance. inline Compiler* getCompiler() const { return _compiler; } //! @brief Get previous item in the compiler stream. inline CompilerItem* getPrev() const { return _prev; } //! @brief Get next item in the compiler stream. inline CompilerItem* getNext() const { return _next; } //! @brief Get comment string. inline const char* getComment() const { return _comment; } //! @brief Get type of item, see @ref kCompilerItem. inline uint32_t getType() const { return _type; } //! @brief Get whether the item was translated. inline bool isTranslated() const { return _isTranslated; } //! @brief Get whether the item is unreachable. inline bool isUnreachable() const { return _isUnreachable; } //! @brief Get the item offset in the compiler stream. //! //! The offset is not byte offset, each item increments offset by 1 and this //! value is then used by register allocator. The offset is set by compiler //! by the register allocator, don't use it in your code. inline uint32_t getOffset() const { return _offset; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- //! @brief Step 1. Extract item variables, update statistics, ... ASMJIT_API virtual void prepare(CompilerContext& cc); //! @brief Step 2. Translate instruction, alloc variables, ... ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); //! @brief Step 3. Emit to @c Assembler. ASMJIT_API virtual void emit(Assembler& a); //! @brief Step 4. Last post step (verify, add data, etc). ASMJIT_API virtual void post(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- //! @brief Get maximum size of of this when serialized into @ref Assembler //! item in bytes. ASMJIT_API virtual int getMaxSize() const; //! @brief Try to unuse the variable @a. //! //! Returns @c true only if the variable will be unused by the instruction, //! otherwise @c false is returned. ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v); // -------------------------------------------------------------------------- // [Comment] // -------------------------------------------------------------------------- //! @brief Set comment string to @a str. ASMJIT_API void setComment(const char* str); //! @brief Format comment string using @a fmt string and variable argument list. ASMJIT_API void formatComment(const char* fmt, ...); // -------------------------------------------------------------------------- // [Protected] // -------------------------------------------------------------------------- protected: //! @brief Mark item as translated and return next. inline CompilerItem* translated() { ASMJIT_ASSERT(_isTranslated == false); _isTranslated = true; return _next; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- public: //! @brief Compiler which owns this item. Compiler* _compiler; //! @brief Previous item. CompilerItem* _prev; //! @brief Next item. CompilerItem* _next; //! @brief Inline comment string, initially set to NULL. const char* _comment; //! @brief Type of the item, see @ref kCompilerItem. uint32_t _type : 8; //! @brief Whether the item was translated, see @c translate(). uint32_t _isTranslated : 1; //! @brief Whether the item is unreachable. uint32_t _isUnreachable : 1; //! @brief Reserved for future use. uint32_t _reserved : 22; //! @brief Stream offset (not byte-offset). uint32_t _offset; }; // ============================================================================ // [AsmJit::CompilerMark] // ============================================================================ //! @brief Compiler mark item. //! //! This item does nothing and it's only used by @ref Compiler to mark some //! specific location in the compiler stream. struct CompilerMark : public CompilerItem { ASMJIT_NO_COPY(CompilerMark) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerMark instance. ASMJIT_API CompilerMark(Compiler* compiler); //! @brief Destroy the @ref CompilerMark instance. ASMJIT_API virtual ~CompilerMark(); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::CompilerComment] // ============================================================================ //! @brief Compiler comment item. //! //! Comments allows to comment your assembler stream for better debugging //! and visualization. Comments are usually ignored in release builds unless //! the logger is present. struct CompilerComment : public CompilerItem { ASMJIT_NO_COPY(CompilerComment) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerComment instance. ASMJIT_API CompilerComment(Compiler* compiler, const char* comment = NULL); //! @brief Destroy the @ref CompilerComment instance. ASMJIT_API virtual ~CompilerComment(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::CompilerEmbed] // ============================================================================ //! @brief Compiler embed item. //! //! Embed item is used to embed data into final assembler stream. The data is //! considered to be RAW, there is no analysis. struct CompilerEmbed : public CompilerItem { ASMJIT_NO_COPY(CompilerEmbed) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerEmbed instance. ASMJIT_API CompilerEmbed(Compiler* compiler, const void* data, size_t length); //! @brief Destroy the @ref CompilerEmbed instance. ASMJIT_API virtual ~CompilerEmbed(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get pointer to embedded data. uint8_t* getData() const { return const_cast(_data); } //! @brief Get length of embedded data. size_t getLength() const { return _length; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Data length. size_t _length; //! @brief Data buffer (that will be embedded to the assembler stream). uint8_t _data[sizeof(void*)]; }; // ============================================================================ // [AsmJit::CompilerAlign] // ============================================================================ //! @brief Compiler align item. struct CompilerAlign : public CompilerItem { ASMJIT_NO_COPY(CompilerAlign) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerAlign instance. ASMJIT_API CompilerAlign(Compiler* compiler, uint32_t size = 0); //! @brief Destroy the @ref CompilerAlign instance. ASMJIT_API virtual ~CompilerAlign(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get align size in bytes. inline uint32_t getSize() const { return _size; } //! @brief Set align size in bytes to @a size. inline void setSize(uint32_t size) { _size = size; } // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Align size. uint32_t _size; }; // ============================================================================ // [AsmJit::CompilerHint] // ============================================================================ //! @brief Compiler variable hint item. struct CompilerHint : public CompilerItem { ASMJIT_NO_COPY(CompilerHint) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerHint instance. ASMJIT_API CompilerHint(Compiler* compiler, CompilerVar* var, uint32_t hintId, uint32_t hintValue); //! @brief Destroy the @ref CompilerHint instance. ASMJIT_API virtual ~CompilerHint(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get variable. inline CompilerVar* getVar() const { return _var; } //! @brief Get hint it (see @ref kVarHint). inline uint32_t getHintId() const { return _hintId; } //! @brief Set hint it (see @ref kVarHint). inline void setHintId(uint32_t hintId) { _hintId = hintId; } //! @brief Get hint value. inline uint32_t getHintValue() const { return _hintValue; } //! @brief Set hint value. inline void setHintValue(uint32_t hintValue) { _hintValue = hintValue; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Variable. CompilerVar* _var; //! @brief Variable hint id. uint32_t _hintId; //! @brief Variable hint value. uint32_t _hintValue; }; // ============================================================================ // [AsmJit::CompilerTarget] // ============================================================================ //! @brief Compiler target item. struct CompilerTarget : public CompilerItem { ASMJIT_NO_COPY(CompilerTarget) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerTarget instance. ASMJIT_API CompilerTarget(Compiler* compiler, const Label& target); //! @brief Destroy the @ref CompilerTarget instance. ASMJIT_API virtual ~CompilerTarget(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Return label bound to this target. inline const Label& getLabel() const { return _label; } //! @brief Get first jmp instruction. inline CompilerInst* getFrom() const { return _from; } //! @brief Get register allocator state for this target. inline CompilerState* getState() const { return _state; } //! @brief Get number of jumps to this target. inline uint32_t getJumpsCount() const { return _jumpsCount; } // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Label. Label _label; //! @brief First jump instruction that points to this target (label). CompilerInst* _from; //! @brief State at this location. CompilerState* _state; //! @brief Count of jumps here. uint32_t _jumpsCount; }; // ============================================================================ // [AsmJit::CompilerInst] // ============================================================================ //! @brief Compiler instruction item. struct CompilerInst : public CompilerItem { ASMJIT_NO_COPY(CompilerInst) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerInst instance. ASMJIT_API CompilerInst(Compiler* compiler, uint32_t code, Operand* opData, uint32_t opCount); //! @brief Destroy the @ref CompilerInst instance. ASMJIT_API virtual ~CompilerInst(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get instruction code, see @c kInstCode. inline uint32_t getCode() const { return _code; } //! @brief Set instruction code to @a code. //! //! Please do not modify instruction code if you are not know what you are //! doing. Incorrect instruction code or operands can raise assertion() at //! runtime. inline void setCode(uint32_t code) { _code = code; } //! @brief Get emit options (compiler specific). inline uint32_t getEmitOptions() const { return _emitOptions; } //! @brief Get instruction flags (compiler specific). inline uint32_t getInstFlags() const { return _instFlags; } //! @brief Get whether the instruction has flag @a flag. inline bool hasInstFlag(uint8_t flag) const { return (_instFlags & flag) != 0; } //! @brief Set instruction @a flag. inline void setInstFlag(uint8_t flag) { _instFlags |= flag; } //! @brief Clear instruction @a flag. inline void clearInstFlag(uint8_t flag) { _instFlags &= ~flag; } //! @brief Get count of operands in operands array. inline uint32_t getOperandsCount() const { return _operandsCount; } //! @brief Get count of variables in variables array. inline uint32_t getVariablesCount() const { return _variablesCount; } //! @brief Get operands array (3 operands total). inline Operand* getOperands() { return _operands; } //! @brief Get operands array (3 operands total). inline const Operand* getOperands() const { return _operands; } // -------------------------------------------------------------------------- // [GetJumpTarget] // -------------------------------------------------------------------------- //! @brief Get possible jump target. //! //! If this instruction is conditional or normal jump then return value is //! the label location (@ref CompilerTarget), otherwise the return value is //! @c NULL. ASMJIT_API virtual CompilerTarget* getJumpTarget() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Instruction code, see @c kInstCode. uint32_t _code; //! @brief Emit options. uint8_t _emitOptions; //! @brief Instruction flags. uint8_t _instFlags; //! @brief Operands count. uint8_t _operandsCount; //! @brief Variables count. uint8_t _variablesCount; //! @brief Operands. Operand* _operands; }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILERITEM_H desmume-0.9.11/src/utils/AsmJit/core/compilercontext.h0000755000000000000000000000474212467662066021426 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILERCONTEXT_H #define _ASMJIT_CORE_COMPILERCONTEXT_H // [Dependencies - AsmJit] #include "../core/compiler.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/zonememory.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerContext] // ============================================================================ struct CompilerContext { ASMJIT_NO_COPY(CompilerContext) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API CompilerContext(Compiler* compiler); ASMJIT_API virtual ~CompilerContext(); // -------------------------------------------------------------------------- // [Accessor] // -------------------------------------------------------------------------- inline Compiler* getCompiler() const { return _compiler; } inline CompilerFuncDecl* getFunc() const { return _func; } inline CompilerItem* getExtraBlock() const { return _extraBlock; } inline void setExtraBlock(CompilerItem* item) { _extraBlock = item; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief ZoneMemory manager. ZoneMemory _zoneMemory; //! @brief Compiler. Compiler* _compiler; //! @brief Function. CompilerFuncDecl* _func; //! @brief Start of the current active scope. CompilerItem* _start; //! @brief End of the current active scope. CompilerItem* _stop; //! @brief Item that is used to insert some code after the function body. CompilerItem* _extraBlock; //! @brief Current state (used by register allocator). CompilerState* _state; //! @brief Link to circular double-linked list containing all active variables //! of the current state. CompilerVar* _active; //! @brief Current offset, used in prepare() stage. Each item should increment it. uint32_t _currentOffset; //! @brief Whether current code is unreachable. uint32_t _isUnreachable; }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILERCONTEXT_H desmume-0.9.11/src/utils/AsmJit/core/buffer.h0000755000000000000000000002220512467662066017452 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_BUFFER_H #define _ASMJIT_CORE_BUFFER_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [Forward Declarations] // ============================================================================ struct Buffer; // ============================================================================ // [AsmJit::Buffer] // ============================================================================ //! @brief Buffer used to store instruction stream in AsmJit. //! //! This class can be dangerous, if you don't know how it works. Assembler //! instruction stream is usually constructed by multiple calls of emit //! functions that emits bytes, words, dwords or qwords. But to decrease //! AsmJit library size and improve performance, we are not checking for //! buffer overflow for each emit operation, but only once in highler level //! emit instruction. //! //! So, if you want to use this class, you need to do buffer checking yourself //! by using @c ensureSpace() method. It's designed to grow buffer if needed. //! Threshold for growing is named @c growThreshold() and it means count of //! bytes for emitting single operation. Default size is set to 16 bytes, //! because x86 and x64 instruction can't be larger (so it's space to hold 1 //! instruction). //! //! Example using Buffer: //! //! @code //! // Buffer instance, growThreshold == 16 //! // (no memory allocated in constructor). //! AsmJit::Buffer buf(16); //! //! // Begin of emit stream, ensure space can fail on out of memory error. //! if (buf.ensureSpace()) //! { //! // here, you can emit up to 16 (growThreshold) bytes //! buf.emitByte(0x00); //! buf.emitByte(0x01); //! buf.emitByte(0x02); //! buf.emitByte(0x03); //! ... //! } //! @endcode struct Buffer { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline Buffer() : _data(NULL), _cur(NULL), _max(NULL), _capacity(0) { } inline ~Buffer() { if (_data) ASMJIT_FREE(_data); } //! @brief Get start of buffer. inline uint8_t* getData() const { return _data; } //! @brief Get current pointer in code buffer. inline uint8_t* getCur() const { return _cur; } //! @brief Get maximum pointer in code buffer for growing. inline uint8_t* getMax() const { return _max; } //! @brief Get current offset in buffer. inline size_t getOffset() const { return (size_t)(_cur - _data); } //! @brief Get capacity of buffer. inline size_t getCapacity() const { return _capacity; } //! @brief Ensure space for next instruction inline bool ensureSpace() { return (_cur >= _max) ? grow() : true; } //! @brief Sets offset to @a o and returns previous offset. //! //! This method can be used to truncate buffer or it's used to //! overwrite specific position in buffer by Assembler. inline size_t toOffset(size_t offset) { ASMJIT_ASSERT(offset < _capacity); size_t prev = (size_t)(_cur - _data); _cur = _data + offset; return prev; } //! @brief Reallocate buffer. //! //! It's only used for growing, buffer is never reallocated to smaller //! number than current capacity() is. ASMJIT_API bool realloc(size_t to); //! @brief Used to grow the buffer. //! //! It will typically realloc to twice size of capacity(), but if capacity() //! is large, it will use smaller steps. ASMJIT_API bool grow(); //! @brief Clear everything, but not deallocate buffer. inline void clear() { _cur = _data; } //! @brief Free buffer and NULL all pointers. ASMJIT_API void reset(); //! @brief Take ownership of the buffer data and purge @c Buffer instance. ASMJIT_API uint8_t* take(); // -------------------------------------------------------------------------- // [Emit] // -------------------------------------------------------------------------- //! @brief Emit Byte. inline void emitByte(uint8_t x) { ASMJIT_ASSERT(getOffset() + 1 <= _capacity); *_cur++ = x; } //! @brief Emit Word (2 bytes). inline void emitWord(uint16_t x) { ASMJIT_ASSERT(getOffset() + 2 <= _capacity); *(uint16_t *)_cur = x; _cur += 2; } //! @brief Emit DWord (4 bytes). inline void emitDWord(uint32_t x) { ASMJIT_ASSERT(getOffset() + 4 <= _capacity); *(uint32_t *)_cur = x; _cur += 4; } //! @brief Emit QWord (8 bytes). inline void emitQWord(uint64_t x) { ASMJIT_ASSERT(getOffset() + 8 <= _capacity); *(uint64_t *)_cur = x; _cur += 8; } //! @brief Emit intptr_t (4 or 8 bytes). inline void emitIntPtrT(intptr_t x) { ASMJIT_ASSERT(getOffset() + sizeof(intptr_t) <= _capacity); *(intptr_t *)_cur = x; _cur += sizeof(intptr_t); } //! @brief Emit uintptr_t (4 or 8 bytes). inline void emitUIntPtrT(uintptr_t x) { ASMJIT_ASSERT(getOffset() + sizeof(uintptr_t) <= _capacity); *(uintptr_t *)_cur = x; _cur += sizeof(uintptr_t); } //! @brief Emit size_t (4 or 8 bytes). inline void emitSizeT(size_t x) { ASMJIT_ASSERT(getOffset() + sizeof(size_t) <= _capacity); *(size_t *)_cur = x; _cur += sizeof(size_t); } //! @brief Emit custom data. ASMJIT_API void emitData(const void* ptr, size_t len); // -------------------------------------------------------------------------- // [Get / Set] // -------------------------------------------------------------------------- //! @brief Set byte at position @a pos. inline uint8_t getByteAt(size_t pos) const { ASMJIT_ASSERT(pos + 1 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set word at position @a pos. inline uint16_t getWordAt(size_t pos) const { ASMJIT_ASSERT(pos + 2 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set dword at position @a pos. inline uint32_t getDWordAt(size_t pos) const { ASMJIT_ASSERT(pos + 4 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set qword at position @a pos. inline uint64_t getQWordAt(size_t pos) const { ASMJIT_ASSERT(pos + 8 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set intptr_t at position @a pos. inline intptr_t getIntPtrTAt(size_t pos) const { ASMJIT_ASSERT(pos + sizeof(intptr_t) <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set uintptr_t at position @a pos. inline uintptr_t getUIntPtrTAt(size_t pos) const { ASMJIT_ASSERT(pos + sizeof(uintptr_t) <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set size_t at position @a pos. inline uintptr_t getSizeTAt(size_t pos) const { ASMJIT_ASSERT(pos + sizeof(size_t) <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set byte at position @a pos. inline void setByteAt(size_t pos, uint8_t x) { ASMJIT_ASSERT(pos + 1 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set word at position @a pos. inline void setWordAt(size_t pos, uint16_t x) { ASMJIT_ASSERT(pos + 2 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set dword at position @a pos. inline void setDWordAt(size_t pos, uint32_t x) { ASMJIT_ASSERT(pos + 4 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set qword at position @a pos. inline void setQWordAt(size_t pos, uint64_t x) { ASMJIT_ASSERT(pos + 8 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set intptr_t at position @a pos. inline void setIntPtrTAt(size_t pos, intptr_t x) { ASMJIT_ASSERT(pos + sizeof(intptr_t) <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set uintptr_t at position @a pos. inline void setUIntPtrTAt(size_t pos, uintptr_t x) { ASMJIT_ASSERT(pos + sizeof(uintptr_t) <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set size_t at position @a pos. inline void setSizeTAt(size_t pos, size_t x) { ASMJIT_ASSERT(pos + sizeof(size_t) <= _capacity); *reinterpret_cast(_data + pos) = x; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- // All members are public, because they can be accessed and modified by // Assembler/Compiler directly. //! @brief Beginning position of buffer. uint8_t* _data; //! @brief Current position in buffer. uint8_t* _cur; //! @brief Maximum position in buffer for realloc. uint8_t* _max; //! @brief Buffer capacity (in bytes). size_t _capacity; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" #endif // _ASMJIT_CORE_BUFFER_H desmume-0.9.11/src/utils/AsmJit/core/zonememory.cpp0000755000000000000000000000424612467662066020745 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/intutil.h" #include "../core/zonememory.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::ZoneMemory] // ============================================================================ ZoneMemory::ZoneMemory(size_t chunkSize) { _chunks = NULL; _total = 0; _chunkSize = chunkSize; } ZoneMemory::~ZoneMemory() { reset(); } void* ZoneMemory::alloc(size_t size) { ZoneChunk* cur = _chunks; // Align to 4 or 8 bytes. size = IntUtil::align(size, sizeof(size_t)); if (cur == NULL || cur->getRemainingBytes() < size) { size_t chSize = _chunkSize; if (chSize < size) chSize = size; cur = (ZoneChunk*)ASMJIT_MALLOC(sizeof(ZoneChunk) - sizeof(void*) + chSize); if (cur == NULL) return NULL; cur->prev = _chunks; cur->pos = 0; cur->size = chSize; _chunks = cur; } uint8_t* p = cur->data + cur->pos; cur->pos += size; _total += size; ASMJIT_ASSERT(cur->pos <= cur->size); return (void*)p; } char* ZoneMemory::sdup(const char* str) { if (str == NULL) return NULL; size_t len = strlen(str); if (len == 0) return NULL; // Include NULL terminator and limit string length. if (++len > 256) len = 256; char* m = reinterpret_cast(alloc(IntUtil::align(len, 16))); if (m == NULL) return NULL; memcpy(m, str, len); m[len - 1] = '\0'; return m; } void ZoneMemory::clear() { ZoneChunk* cur = _chunks; if (cur == NULL) return; cur = cur->prev; while (cur != NULL) { ZoneChunk* prev = cur->prev; ASMJIT_FREE(cur); cur = prev; } _chunks->pos = 0; _chunks->prev = NULL; _total = 0; } void ZoneMemory::reset() { ZoneChunk* cur = _chunks; _chunks = NULL; _total = 0; while (cur != NULL) { ZoneChunk* prev = cur->prev; ASMJIT_FREE(cur); cur = prev; } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/memorymarker.h0000755000000000000000000000242712467662066020717 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_MEMORYMARKER_H #define _ASMJIT_CORE_MEMORYMARKER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_MemoryManagement //! @{ // ============================================================================ // [AsmJit::MemoryMarker] // ============================================================================ //! @brief Virtual memory marker interface. struct MemoryMarker { ASMJIT_NO_COPY(MemoryMarker) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API MemoryMarker(); ASMJIT_API virtual ~MemoryMarker(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- virtual void mark(const void* ptr, size_t size) = 0; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_MEMORYMARKER_H desmume-0.9.11/src/utils/AsmJit/core/memorymanager.h0000755000000000000000000001430112467662066021042 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_MEMORYMANAGER_H #define _ASMJIT_CORE_MEMORYMANAGER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" // [Debug] // #define ASMJIT_MEMORY_MANAGER_DUMP namespace AsmJit { //! @addtogroup AsmJit_MemoryManagement //! @{ // ============================================================================ // [AsmJit::MemoryManager] // ============================================================================ //! @brief Virtual memory manager interface. //! //! This class is pure virtual. You can get default virtual memory manager using //! @c getGlobal() method. If you want to create more memory managers with same //! functionality as global memory manager use @c VirtualMemoryManager class. struct MemoryManager { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create memory manager instance. ASMJIT_API MemoryManager(); //! @brief Destroy memory manager instance, this means also to free all memory //! blocks. ASMJIT_API virtual ~MemoryManager(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- //! @brief Allocate a @a size bytes of virtual memory. //! //! Note that if you are implementing your own virtual memory manager then you //! can quitly ignore type of allocation. This is mainly for AsmJit to memory //! manager that allocated memory will be never freed. virtual void* alloc(size_t size, uint32_t type = kMemAllocFreeable) = 0; //! @brief Free previously allocated memory at a given @a address. virtual bool free(void* address) = 0; //! @brief Free some tail memory. virtual bool shrink(void* address, size_t used) = 0; //! @brief Free all allocated memory. virtual void freeAll() = 0; //! @brief Get how many bytes are currently used. virtual size_t getUsedBytes() = 0; //! @brief Get how many bytes are currently allocated. virtual size_t getAllocatedBytes() = 0; // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- //! @brief Get global memory manager instance. //! //! Global instance is instance of @c VirtualMemoryManager class. Global memory //! manager is used by default by @ref Assembler::make() and @ref Compiler::make() //! methods. ASMJIT_API static MemoryManager* getGlobal(); }; // ============================================================================ // [AsmJit::VirtualMemoryManager] // ============================================================================ //! @brief Reference implementation of memory manager that uses //! @ref AsmJit::VirtualMemory class to allocate chunks of virtual memory //! and bit arrays to manage it. struct VirtualMemoryManager : public MemoryManager { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @c VirtualMemoryManager instance. ASMJIT_API VirtualMemoryManager(); #if defined(ASMJIT_WINDOWS) //! @brief Create a @c VirtualMemoryManager instance for process @a hProcess. //! //! This is specialized version of constructor available only for windows and //! usable to alloc/free memory of different process. ASMJIT_API VirtualMemoryManager(HANDLE hProcess); #endif // ASMJIT_WINDOWS //! @brief Destroy the @c VirtualMemoryManager instance, this means also to //! free all blocks. ASMJIT_API virtual ~VirtualMemoryManager(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void* alloc(size_t size, uint32_t type = kMemAllocFreeable); ASMJIT_API virtual bool free(void* address); ASMJIT_API virtual bool shrink(void* address, size_t used); ASMJIT_API virtual void freeAll(); ASMJIT_API virtual size_t getUsedBytes(); ASMJIT_API virtual size_t getAllocatedBytes(); // -------------------------------------------------------------------------- // [Virtual Memory Manager Specific] // -------------------------------------------------------------------------- //! @brief Get whether to keep allocated memory after memory manager is //! destroyed. //! //! @sa @c setKeepVirtualMemory(). ASMJIT_API bool getKeepVirtualMemory() const; //! @brief Set whether to keep allocated memory after memory manager is //! destroyed. //! //! This method is usable when patching code of remote process. You need to //! allocate process memory, store generated assembler into it and patch the //! method you want to redirect (into your code). This method affects only //! VirtualMemoryManager destructor. After destruction all internal //! structures are freed, only the process virtual memory remains. //! //! @note Memory allocated with kMemAllocPermanent is always kept. //! //! @sa @c getKeepVirtualMemory(). ASMJIT_API void setKeepVirtualMemory(bool keepVirtualMemory); // -------------------------------------------------------------------------- // [Debug] // -------------------------------------------------------------------------- #if defined(ASMJIT_MEMORY_MANAGER_DUMP) //! @brief Dump memory manager tree into file. //! //! Generated output is using DOT language (from graphviz package). ASMJIT_API void dump(const char* fileName); #endif // ASMJIT_MEMORY_MANAGER_DUMP // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Pointer to private data hidden from the public API. void* _d; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_MEMORYMANAGER_H desmume-0.9.11/src/utils/AsmJit/core/assert.h0000755000000000000000000000301212467662066017475 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_ASSERT_H #define _ASMJIT_CORE_ASSERT_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Assert] // ============================================================================ //! @brief Called in debug build on assertion failure. //! @param file Source file name where it happened. //! @param line Line in the source file. //! @param exp Expression what failed. //! //! If you have problems with assertions simply put a breakpoint into //! AsmJit::assertionFailure() method (AsmJit/Core/Assert.cpp file) and examine //! call stack. ASMJIT_API void assertionFailure(const char* file, int line, const char* exp); // ============================================================================ // [ASMJIT_ASSERT] // ============================================================================ #if defined(ASMJIT_DEBUG) #if !defined(ASMJIT_ASSERT) #define ASMJIT_ASSERT(exp) \ do { \ if (!(exp)) ::AsmJit::assertionFailure(__FILE__, __LINE__, #exp); \ } while(0) #endif #else #if !defined(ASMJIT_ASSERT) #define ASMJIT_ASSERT(exp) ASMJIT_NOP() #endif #endif // DEBUG //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_ASSERT_H desmume-0.9.11/src/utils/AsmJit/core/zonememory.h0000755000000000000000000001104312467662066020403 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_ZONEMEMORY_H #define _ASMJIT_CORE_ZONEMEMORY_H // [Dependencies - AsmJit] #include "../core/build.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::ZoneChunk] // ============================================================================ //! @internal //! //! @brief One allocated chunk of memory. struct ZoneChunk { // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Get count of remaining (unused) bytes in chunk. inline size_t getRemainingBytes() const { return size - pos; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Link to previous chunk. ZoneChunk* prev; //! @brief Position in this chunk. size_t pos; //! @brief Size of this chunk (in bytes). size_t size; //! @brief Data. uint8_t data[sizeof(void*)]; }; // ============================================================================ // [AsmJit::ZoneMemory] // ============================================================================ //! @brief Memory allocator designed to fast alloc memory that will be freed //! in one step. //! //! @note This is hackery for performance. Concept is that objects created //! by @c ZoneMemory are freed all at once. This means that lifetime of //! these objects are the same as the zone object itself. struct ZoneMemory { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new instance of @c ZoneMemory. //! @param chunkSize Default size for one zone chunk. ASMJIT_API ZoneMemory(size_t chunkSize); //! @brief Destroy @ref ZoneMemory instance. ASMJIT_API ~ZoneMemory(); // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Allocate @c size bytes of memory and return pointer to it. //! //! Pointer allocated by this way will be valid until @c ZoneMemory object //! is destroyed. To create class by this way use placement @c new and //! @c delete operators: //! //! @code //! // Example of allocating simple class //! //! // Your class //! class Object //! { //! // members... //! }; //! //! // Your function //! void f() //! { //! // We are using AsmJit namespace //! using namespace AsmJit //! //! // Create zone object with chunk size of 65536 bytes. //! ZoneMemory zone(65536); //! //! // Create your objects using zone object allocating, for example: //! Object* obj = new(zone.alloc(sizeof(YourClass))) Object(); //! //! // ... lifetime of your objects ... //! //! // Destroy your objects: //! obj->~Object(); //! //! // ZoneMemory destructor will free all memory allocated through it, //! // alternative is to call @c zone.reset(). //! } //! @endcode ASMJIT_API void* alloc(size_t size); //! @brief Helper to duplicate string. ASMJIT_API char* sdup(const char* str); //! @brief Free all allocated memory except first block that remains for reuse. //! //! Note that this method will invalidate all instances using this memory //! allocated by this zone instance. ASMJIT_API void clear(); //! @brief Free all allocated memory at once. //! //! Note that this method will invalidate all instances using this memory //! allocated by this zone instance. ASMJIT_API void reset(); //! @brief Get total size of allocated objects - by @c alloc(). inline size_t getTotal() const { return _total; } //! @brief Get (default) chunk size. inline size_t getChunkSize() const { return _chunkSize; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Last allocated chunk of memory. ZoneChunk* _chunks; //! @brief Total size of allocated objects - by @c alloc() method. size_t _total; //! @brief One chunk size. size_t _chunkSize; }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_ZONEMEMORY_H desmume-0.9.11/src/utils/AsmJit/core/compiler.h0000755000000000000000000002705312467662066020021 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILER_H #define _ASMJIT_CORE_COMPILER_H // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/context.h" #include "../core/func.h" #include "../core/operand.h" #include "../core/podvector.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [Forward Declarations] // ============================================================================ struct Compiler; struct CompilerAlign; struct CompilerComment; struct CompilerContext; struct CompilerEmbed; struct CompilerFuncCall; struct CompilerFuncDecl; struct CompilerFuncEnd; struct CompilerInst; struct CompilerItem; struct CompilerMark; struct CompilerState; struct CompilerTarget; struct CompilerVar; // ============================================================================ // [AsmJit::CompilerState] // ============================================================================ //! @brief Compiler state base. struct CompilerState { }; // ============================================================================ // [AsmJit::CompilerVar] // ============================================================================ //! @brief Compiler variable base. struct CompilerVar { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get variable name. inline const char* getName() const { return _name; } //! @brief Get variable id. inline uint32_t getId() const { return _id; } //! @brief Get variable type. inline uint32_t getType() const { return _type; } //! @brief Get variable class. inline uint32_t getClass() const { return _class; } //! @brief Get variable priority. inline uint32_t getPriority() const { return _priority; } //! @brief Get variable size. inline uint32_t getSize() const { return _size; } //! @brief Get whether the variable is a function argument. inline bool isArgument() const { return static_cast(_isRegArgument | _isMemArgument); } //! @brief Get whether the variable is a function argument passed through register. inline bool isRegArgument() const { return static_cast(_isRegArgument); } //! @brief Get whether the variable is a function argument passed through memory. inline bool isMemArgument() const { return static_cast(_isMemArgument); } //! @brief Get variable content can be calculated by a simple instruction. inline bool isCalculated() const { return static_cast(_isCalculated); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Variable name. const char* _name; //! @brief Variable id. uint32_t _id; //! @brief Variable type. uint8_t _type; //! @brief Variable class. uint8_t _class; //! @brief Variable priority. uint8_t _priority; //! @brief Whether the variable is a function argument passed through register. uint8_t _isRegArgument : 1; //! @brief Whether the variable is a function argument passed through memory. uint8_t _isMemArgument : 1; //! @brief Whether variable content can be calculated by a simple instruction. //! //! This is used mainly by MMX and SSE2 code. This flag indicates that //! register allocator should never reserve memory for this variable, because //! the content can be generated by a single instruction (for example PXOR). uint8_t _isCalculated : 1; //! @internal. uint8_t _unused : 5; //! @brief Variable size. uint32_t _size; }; // ============================================================================ // [AsmJit::Compiler] // ============================================================================ //! @brief Compiler. //! //! @sa @ref Assembler. struct Compiler { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref Compiler instance. ASMJIT_API Compiler(Context* context); //! @brief Destroy the @ref Compiler instance. ASMJIT_API virtual ~Compiler(); // -------------------------------------------------------------------------- // [Context] // -------------------------------------------------------------------------- //! @brief Get code generator. inline Context* getContext() const { return _context; } // -------------------------------------------------------------------------- // [Memory Management] // -------------------------------------------------------------------------- //! @brief Get zone memory manager. inline ZoneMemory& getZoneMemory() { return _zoneMemory; } //! @brief Get link memory manager. inline ZoneMemory& getLinkMemory() { return _linkMemory; } // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- //! @brief Get logger. inline Logger* getLogger() const { return _logger; } //! @brief Set logger to @a logger. ASMJIT_API virtual void setLogger(Logger* logger); // -------------------------------------------------------------------------- // [Error Handling] // -------------------------------------------------------------------------- //! @brief Get error code. inline uint32_t getError() const { return _error; } //! @brief Set error code. //! //! This method is virtual, because higher classes can use it to catch all //! errors. ASMJIT_API virtual void setError(uint32_t error); // -------------------------------------------------------------------------- // [Properties] // -------------------------------------------------------------------------- //! @brief Get compiler property. ASMJIT_API virtual uint32_t getProperty(uint32_t propertyId); //! @brief Set compiler property. ASMJIT_API virtual void setProperty(uint32_t propertyId, uint32_t value); // -------------------------------------------------------------------------- // [Clear / Reset] // -------------------------------------------------------------------------- //! @brief Clear everything, but not deallocate buffers. //! //! @note This method will destroy your code. ASMJIT_API void clear(); //! @brief Free internal buffer, all emitters and NULL all pointers. //! //! @note This method will destroy your code. ASMJIT_API void reset(); //! @brief Called by clear() and reset() to clear all data related to derived //! class implementation. ASMJIT_API virtual void _purge(); // -------------------------------------------------------------------------- // [Item Management] // -------------------------------------------------------------------------- //! @brief Get first item. inline CompilerItem* getFirstItem() const { return _first; } //! @brief Get last item. inline CompilerItem* getLastItem() const { return _last; } //! @brief Get current item. //! //! @note If this method returns @c NULL it means that nothing has been //! emitted yet. inline CompilerItem* getCurrentItem() const { return _current; } //! @brief Get current function. inline CompilerFuncDecl* getFunc() const { return _func; } //! @brief Set current item to @a item and return the previous current one. ASMJIT_API CompilerItem* setCurrentItem(CompilerItem* item); //! @brief Add item after current item to @a item and set current item to //! @a item. ASMJIT_API void addItem(CompilerItem* item); //! @brief Add item after @a ref. ASMJIT_API void addItemAfter(CompilerItem* item, CompilerItem* ref); //! @brief Remove item @a item. ASMJIT_API void removeItem(CompilerItem* item); // -------------------------------------------------------------------------- // [Comment] // -------------------------------------------------------------------------- //! @brief Emit a single comment line. //! //! @note Comment is not directly sent to logger, but instead it's stored as //! @ref CompilerComment item emitted when @c serialize() method is called. ASMJIT_API void comment(const char* fmt, ...); // -------------------------------------------------------------------------- // [Embed] // -------------------------------------------------------------------------- //! @brief Embed data. ASMJIT_API void embed(const void* data, size_t len); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief ZoneMemory allocator, used to allocate compiler items. ZoneMemory _zoneMemory; //! @brief ZoneMemory allocator, used to alloc small data structures like //! linked lists. ZoneMemory _linkMemory; //! @brief Context. Context* _context; //! @brief Logger. Logger* _logger; //! @brief Error code. uint32_t _error; //! @brief Properties. uint32_t _properties; //! @brief Contains options for next emitted instruction, clear after each emit. uint32_t _emitOptions; //! @brief Whether compiler was finished the job (register allocator, etc...). uint32_t _finished; //! @brief First item. CompilerItem* _first; //! @brief Last item. CompilerItem* _last; //! @brief Current item. CompilerItem* _current; //! @brief Current function. CompilerFuncDecl* _func; //! @brief Targets. PodVector _targets; //! @brief Variables. PodVector _vars; //! @brief Compiler context instance, only available after prepare(). CompilerContext* _cc; //! @brief Variable name id (used to generate unique names per function). int _varNameId; }; // ============================================================================ // [AsmJit::Compiler - Helpers] // ============================================================================ template inline T* Compiler_newItem(Compiler* self) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self); } template inline T* Compiler_newItem(Compiler* self, P1 p1) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2, p3); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3, P4 p4) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2, p3, p4); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2, p3, p4, p5); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILER_H desmume-0.9.11/src/utils/AsmJit/core/apiend.h0000755000000000000000000000052412467662066017441 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [MSVC] #if defined(_MSC_VER) // Pop disabled warnings by ApiBegin.h #pragma warning(pop) // Rename symbols back. #undef vsnprintf #undef snprintf #endif // _MSC_VER // [GNUC] #if defined(__GNUC__) #endif // __GNUC__ desmume-0.9.11/src/utils/AsmJit/core/compiler.cpp0000755000000000000000000001353012467662066020347 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/compiler.h" #include "../core/compilercontext.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/cpuinfo.h" #include "../core/intutil.h" #include "../core/logger.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Compiler - Construction / Destruction] // ============================================================================ Compiler::Compiler(Context* context) : _zoneMemory(16384 - sizeof(ZoneChunk) - 32), _linkMemory(1024 - 32), _context(context != NULL ? context : static_cast(JitContext::getGlobal())), _logger(NULL), _error(0), _properties(0), _emitOptions(0), _finished(false), _first(NULL), _last(NULL), _current(NULL), _func(NULL), _cc(NULL), _varNameId(0) { } Compiler::~Compiler() { reset(); } // ============================================================================ // [AsmJit::Compiler - Logging] // ============================================================================ void Compiler::setLogger(Logger* logger) { _logger = logger; } // ============================================================================ // [AsmJit::Compiler - Error Handling] // ============================================================================ void Compiler::setError(uint32_t error) { _error = error; if (_error == kErrorOk) return; if (_logger) _logger->logFormat("*** COMPILER ERROR: %s (%u).\n", getErrorString(error), (unsigned int)error); } // ============================================================================ // [AsmJit::Compiler - Properties] // ============================================================================ uint32_t Compiler::getProperty(uint32_t propertyId) { if (propertyId > 31) return 0; return (_properties & IntUtil::maskFromIndex(propertyId)) != 0; } void Compiler::setProperty(uint32_t propertyId, uint32_t value) { if (propertyId > 31) return; if (value) _properties |= IntUtil::maskFromIndex(propertyId); else _properties &= ~IntUtil::maskFromIndex(propertyId); } // ============================================================================ // [AsmJit::Compiler - Clear / Reset] // ============================================================================ void Compiler::clear() { _purge(); if (_error != kErrorOk) setError(kErrorOk); } void Compiler::reset() { _purge(); _zoneMemory.reset(); _linkMemory.reset(); _targets.reset(); _vars.reset(); if (_error != kErrorOk) setError(kErrorOk); } void Compiler::_purge() { _zoneMemory.clear(); _linkMemory.clear(); _emitOptions = 0; _finished = false; _first = NULL; _last = NULL; _current = NULL; _func = NULL; _targets.clear(); _vars.clear(); _cc = NULL; _varNameId = 0; } // ============================================================================ // [AsmJit::Compiler - Item Management] // ============================================================================ CompilerItem* Compiler::setCurrentItem(CompilerItem* item) { CompilerItem* old = _current; _current = item; return old; } void Compiler::addItem(CompilerItem* item) { ASMJIT_ASSERT(item != NULL); ASMJIT_ASSERT(item->_prev == NULL); ASMJIT_ASSERT(item->_next == NULL); if (_current == NULL) { if (_first == NULL) { _first = item; _last = item; } else { item->_next = _first; _first->_prev = item; _first = item; } } else { CompilerItem* prev = _current; CompilerItem* next = _current->_next; item->_prev = prev; item->_next = next; prev->_next = item; if (next) next->_prev = item; else _last = item; } _current = item; } void Compiler::addItemAfter(CompilerItem* item, CompilerItem* ref) { ASMJIT_ASSERT(item != NULL); ASMJIT_ASSERT(item->_prev == NULL); ASMJIT_ASSERT(item->_next == NULL); ASMJIT_ASSERT(ref != NULL); CompilerItem* prev = ref; CompilerItem* next = ref->_next; item->_prev = prev; item->_next = next; prev->_next = item; if (next) next->_prev = item; else _last = item; } void Compiler::removeItem(CompilerItem* item) { CompilerItem* prev = item->_prev; CompilerItem* next = item->_next; if (_first == item) { _first = next; } else { prev->_next = next; } if (_last == item) { _last = prev; } else { next->_prev = prev; } item->_prev = NULL; item->_next = NULL; if (_current == item) _current = prev; } // ============================================================================ // [AsmJit::Compiler - Comment] // ============================================================================ void Compiler::comment(const char* fmt, ...) { char buf[128]; char* p = buf; if (fmt) { *p++ = ';'; *p++ = ' '; va_list ap; va_start(ap, fmt); p += vsnprintf(p, 100, fmt, ap); va_end(ap); } *p++ = '\n'; *p = '\0'; CompilerComment* item = Compiler_newItem(this, buf); addItem(item); } // ============================================================================ // [AsmJit::Compiler - Embed] // ============================================================================ void Compiler::embed(const void* data, size_t len) { // Align length to 16 bytes. size_t alignedSize = IntUtil::align(len, sizeof(uintptr_t)); void* p = _zoneMemory.alloc(sizeof(CompilerEmbed) - sizeof(void*) + alignedSize); if (p == NULL) return; CompilerEmbed* item = new(p) CompilerEmbed(this, data, len); addItem(item); } } // AsmJit namespace // [Api-Begin] #include "../core/apibegin.h" desmume-0.9.11/src/utils/AsmJit/core/compilerfunc.h0000755000000000000000000002701712467662066020675 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILERFUNC_H #define _ASMJIT_CORE_COMPILERFUNC_H // [Dependencies - AsmJit] #include "../core/compiler.h" #include "../core/compileritem.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerFuncDecl] // ============================================================================ //! @brief Compiler function declaration item. //! //! Functions are base blocks for generating assembler output. Each generated //! assembler stream needs standard entry and leave sequences thats compatible //! with the operating system conventions (ABI). //! //! Function class can be used to generate function prolog) and epilog sequences //! that are compatible with the demanded calling convention and to allocate and //! manage variables that can be allocated/spilled during compilation time. //! //! @note To create a function use @c Compiler::newFunc() method, do not //! create any form of compiler function items using new operator. //! //! @sa @ref CompilerState, @ref CompilerVar. struct CompilerFuncDecl : public CompilerItem { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @c CompilerFuncDecl instance. //! //! @note Always use @c AsmJit::Compiler::newFunc() to create @c Function //! instance. ASMJIT_API CompilerFuncDecl(Compiler* compiler); //! @brief Destroy the @c CompilerFuncDecl instance. ASMJIT_API virtual ~CompilerFuncDecl(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get function entry label. //! //! Entry label can be used to call this function from another code that's //! being generated. inline const Label& getEntryLabel() const { return _entryLabel; } //! @brief Get function exit label. //! //! Use exit label to jump to function epilog. inline const Label& getExitLabel() const { return _exitLabel; } //! @brief Get function entry target. inline CompilerTarget* getEntryTarget() const { return _entryTarget; } //! @brief Get function exit target. inline CompilerTarget* getExitTarget() const { return _exitTarget; } //! @brief Get function end item. inline CompilerFuncEnd* getEnd() const { return _end; } //! @brief Get function declaration. inline FuncDecl* getDecl() const { return _decl; } //! @brief Get function arguments as variables. inline CompilerVar** getVars() const { return _vars; } //! @brief Get function argument at @a index. inline CompilerVar* getVar(uint32_t index) const { ASMJIT_ASSERT(index < _decl->getArgumentsCount()); return _vars[index]; } //! @brief Get function hints. inline uint32_t getFuncHints() const { return _funcHints; } //! @brief Get function flags. inline uint32_t getFuncFlags() const { return _funcFlags; } //! @brief Get whether the _funcFlags has @a flag inline bool hasFuncFlag(uint32_t flag) const { return (_funcFlags & flag) != 0; } //! @brief Set function @a flag. inline void setFuncFlag(uint32_t flag) { _funcFlags |= flag; } //! @brief Clear function @a flag. inline void clearFuncFlag(uint32_t flag) { _funcFlags &= ~flag; } //! @brief Get whether the function is also a caller. inline bool isCaller() const { return hasFuncFlag(kFuncFlagIsCaller); } //! @brief Get whether the function is finished. inline bool isFinished() const { return hasFuncFlag(kFuncFlagIsFinished); } //! @brief Get whether the function is naked. inline bool isNaked() const { return hasFuncFlag(kFuncFlagIsNaked); } //! @brief Get stack size needed to call other functions. inline int32_t getFuncCallStackSize() const { return _funcCallStackSize; } // -------------------------------------------------------------------------- // [Hints] // -------------------------------------------------------------------------- //! @brief Set function hint. ASMJIT_API virtual void setHint(uint32_t hint, uint32_t value); //! @brief Get function hint. ASMJIT_API virtual uint32_t getHint(uint32_t hint) const; // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- virtual void setPrototype( uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) = 0; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Function entry label. Label _entryLabel; //! @brief Function exit label. Label _exitLabel; //! @brief Function entry target. CompilerTarget* _entryTarget; //! @brief Function exit target. CompilerTarget* _exitTarget; //! @brief Function end item. CompilerFuncEnd* _end; //! @brief Function declaration. FuncDecl* _decl; //! @brief Function arguments as compiler variables. CompilerVar** _vars; //! @brief Function hints; uint32_t _funcHints; //! @brief Function flags. uint32_t _funcFlags; //! @brief Stack size needed to call other functions. int32_t _funcCallStackSize; }; // ============================================================================ // [AsmJit::CompilerFuncEnd] // ============================================================================ //! @brief Compiler function end item. //! //! This item does nothing; it's only used by @ref Compiler to mark specific //! location in the code. The @c CompilerFuncEnd is similar to @c CompilerMark, //! except that it overrides @c translate() to return @c NULL. struct CompilerFuncEnd : public CompilerItem { ASMJIT_NO_COPY(CompilerFuncEnd) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerMark instance. ASMJIT_API CompilerFuncEnd(Compiler* compiler, CompilerFuncDecl* func); //! @brief Destroy the @ref CompilerMark instance. ASMJIT_API virtual ~CompilerFuncEnd(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get related function. inline CompilerFuncDecl* getFunc() const { return _func; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Related function. CompilerFuncDecl* _func; }; // ============================================================================ // [AsmJit::CompilerFuncRet] // ============================================================================ //! @brief Compiler return from function item. struct CompilerFuncRet : public CompilerItem { ASMJIT_NO_COPY(CompilerFuncRet) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerFuncRet instance. ASMJIT_API CompilerFuncRet(Compiler* compiler, CompilerFuncDecl* func, const Operand* first, const Operand* second); //! @brief Destroy the @ref CompilerFuncRet instance. ASMJIT_API virtual ~CompilerFuncRet(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @Brief Get the related function. inline CompilerFuncDecl* getFunc() const { return _func; } //! @brief Get the first return operand. inline Operand& getFirst() { return _ret[0]; } //! @overload inline const Operand& getFirst() const { return _ret[0]; } //! @brief Get the second return operand. inline Operand& getSecond() { return _ret[1]; } //! @overload inline const Operand& getSecond() const { return _ret[1]; } // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- //! @brief Get whether jump to epilog has to be emitted. ASMJIT_API bool mustEmitJump() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Related function. CompilerFuncDecl* _func; //! @brief Return operand(s). Operand _ret[2]; }; // ============================================================================ // [AsmJit::CompilerFuncCall] // ============================================================================ //! @brief Compiler function call item. struct CompilerFuncCall : public CompilerItem { ASMJIT_NO_COPY(CompilerFuncCall) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerFuncCall instance. ASMJIT_API CompilerFuncCall(Compiler* compiler, CompilerFuncDecl* caller, const Operand* target); //! @brief Destroy the @ref CompilerFuncCall instance. ASMJIT_API virtual ~CompilerFuncCall(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get caller. inline CompilerFuncDecl* getCaller() const { return _caller; } //! @brief Get function declaration. inline FuncDecl* getDecl() const { return _decl; } //! @brief Get target operand. inline Operand& getTarget() { return _target; } //! @overload inline const Operand& getTarget() const { return _target; } // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- virtual void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) = 0; //! @brief Set function prototype. inline void setPrototype(uint32_t convention, const FuncPrototype& func) { setPrototype(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Caller (the function which does the call). CompilerFuncDecl* _caller; //! @brief Function declaration. FuncDecl* _decl; //! @brief Operand (address of function, register, label, ...). Operand _target; //! @brief Return operands. Operand _ret[2]; //! @brief Arguments operands. Operand* _args; }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILERFUNC_H desmume-0.9.11/src/utils/AsmJit/core/build.h0000755000000000000000000002221512467662066017301 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_BUILD_H #define _ASMJIT_CORE_BUILD_H // [Include] #include "../Config.h" #if defined(ASMJIT_EXPORTS) # if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) # define _CRT_SECURE_NO_WARNINGS # endif // _MSC_VER #endif // ASMJIT_EXPORTS // Here should be optional include files that's needed fo successfuly // use macros defined here. Remember, AsmJit uses only AsmJit namespace // and all macros are used within it. #include #include #include #include // ============================================================================ // [AsmJit - OS] // ============================================================================ #if defined(WINDOWS) || defined(_WINDOWS) || defined(__WINDOWS__) || defined(_WIN32) || defined(_WIN64) # define ASMJIT_WINDOWS #elif defined(__linux__) || defined(__unix__) || \ defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || \ defined(__DragonFly__) || defined(__BSD__) || defined(__FREEBSD__) || \ defined(__APPLE__) # define ASMJIT_POSIX #else # warning "AsmJit - Can't match operating system, using ASMJIT_POSIX" # define ASMJIT_POSIX #endif // ============================================================================ // [AsmJit - Architecture] // ============================================================================ // define it only if it's not defined. In some systems we can // use -D command in compiler to bypass this autodetection. #if !defined(ASMJIT_X86) && !defined(ASMJIT_X64) # if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || \ defined(_M_X64) || defined(_WIN64) # define ASMJIT_X64 // x86-64 # else // _M_IX86, __INTEL__, __i386__ # define ASMJIT_X86 # endif #endif // ============================================================================ // [AsmJit - API] // ============================================================================ // Make AsmJit as shared library by default. #if !defined(ASMJIT_API) # if defined(ASMJIT_WINDOWS) # if defined(__GNUC__) # if defined(ASMJIT_EXPORTS) # define ASMJIT_API __attribute__((dllexport)) # else # define ASMJIT_API __attribute__((dllimport)) # endif // ASMJIT_EXPORTS # else # if defined(ASMJIT_EXPORTS) # define ASMJIT_API __declspec(dllexport) # else # define ASMJIT_API __declspec(dllimport) # endif // ASMJIT_EXPORTS # endif // __GNUC__ # else # if defined(__GNUC__) # if __GNUC__ >= 4 # define ASMJIT_API __attribute__((visibility("default"))) # define ASMJIT_VAR extern ASMJIT_API # endif // __GNUC__ >= 4 # endif // __GNUC__ # endif #endif // ASMJIT_API #if !defined(ASMJIT_VAR) # if defined(ASMJIT_API) # define ASMJIT_VAR extern ASMJIT_API # else # define ASMJIT_VAR # endif // ASMJIT_API #endif // !ASMJIT_VAR // [AsmJit - Memory Management] #if !defined(ASMJIT_MALLOC) # define ASMJIT_MALLOC ::malloc #endif // ASMJIT_MALLOC #if !defined(ASMJIT_REALLOC) # define ASMJIT_REALLOC ::realloc #endif // ASMJIT_REALLOC #if !defined(ASMJIT_FREE) # define ASMJIT_FREE ::free #endif // ASMJIT_FREE // ============================================================================ // [AsmJit - Calling Conventions] // ============================================================================ #if defined(ASMJIT_X86) # if defined(__GNUC__) # define ASMJIT_REGPARM_1 __attribute__((regparm(1))) # define ASMJIT_REGPARM_2 __attribute__((regparm(2))) # define ASMJIT_REGPARM_3 __attribute__((regparm(3))) # define ASMJIT_FASTCALL __attribute__((fastcall)) # define ASMJIT_STDCALL __attribute__((stdcall)) # define ASMJIT_CDECL __attribute__((cdecl)) # else # define ASMJIT_FASTCALL __fastcall # define ASMJIT_STDCALL __stdcall # define ASMJIT_CDECL __cdecl # endif #else # define ASMJIT_FASTCALL # define ASMJIT_STDCALL # define ASMJIT_CDECL #endif // ASMJIT_X86 #if !defined(ASMJIT_UNUSED) # define ASMJIT_UNUSED(var) ((void)var) #endif // ASMJIT_UNUSED #if !defined(ASMJIT_NOP) # define ASMJIT_NOP() ((void)0) #endif // ASMJIT_NOP // [AsmJit - C++ Compiler Support] #define ASMJIT_TYPE_TO_TYPE(_Type_) _Type_ #define ASMJIT_HAS_STANDARD_DEFINE_OPTIONS #define ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION // Support for VC6 #if defined(_MSC_VER) && (_MSC_VER < 1400) namespace AsmJit { template struct _Type2Type { typedef T Type; }; } #undef ASMJIT_TYPE_TO_TYPE #define ASMJIT_TYPE_TO_TYPE(_Type_) ::AsmJit::_Type2Type<_Type_>::Type #undef ASMJIT_HAS_STANDARD_DEFINE_OPTIONS #undef ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION #endif // ============================================================================ // [AsmJit - Types] // ============================================================================ #if defined(__MINGW32__) || defined(__MINGW64__) # include #endif // __MINGW32__ || __MINGW64__ #if defined(_MSC_VER) && (_MSC_VER < 1600) # if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; # else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; # endif // _MSC_VER #else # include # include #endif typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; #if defined(ASMJIT_X86) typedef int32_t sysint_t; typedef uint32_t sysuint_t; #else typedef int64_t sysint_t; typedef uint64_t sysuint_t; #endif #if defined(_MSC_VER) # define ASMJIT_INT64_C(num) num##i64 # define ASMJIT_UINT64_C(num) num##ui64 #else # define ASMJIT_INT64_C(num) num##LL # define ASMJIT_UINT64_C(num) num##ULL #endif // ============================================================================ // [AsmJit - C++ Macros] // ============================================================================ #define ASMJIT_ARRAY_SIZE(A) (sizeof(A) / sizeof(*A)) #define ASMJIT_NO_COPY(__type__) \ private: \ inline __type__(const __type__& other); \ inline __type__& operator=(const __type__& other); \ public: // ============================================================================ // [AsmJit - Debug] // ============================================================================ // If ASMJIT_DEBUG and ASMJIT_NO_DEBUG is not defined then ASMJIT_DEBUG will be // detected using the compiler specific macros. This enables to set the build // type using IDE. #if !defined(ASMJIT_DEBUG) && !defined(ASMJIT_NO_DEBUG) #if defined(_DEBUG) #define ASMJIT_DEBUG #endif // _DEBUG #endif // !ASMJIT_DEBUG && !ASMJIT_NO_DEBUG // ============================================================================ // [AsmJit - Initialize/DontInitialize] // ============================================================================ // TODO: This should be moved to AsmJit namespace! // Skip documenting this. #if !defined(ASMJIT_NODOC) struct _Initialize {}; struct _DontInitialize {}; #endif // !ASMJIT_NODOC // ============================================================================ // [AsmJit - Void] // ============================================================================ // TODO: This should be moved to AsmJit namespace! //! @brief Void type which can be used in @ref FunctionDeclaration templates. struct Void {}; // ============================================================================ // [asmjit_cast<>] // ============================================================================ //! @brief Cast used to cast pointer to function. It's like reinterpret_cast<>, //! but uses internally C style cast to work with MinGW. //! //! If you are using single compiler and @c reinterpret_cast<> works for you, //! there is no reason to use @c asmjit_cast<>. If you are writing //! cross-platform software with various compiler support, consider using //! @c asmjit_cast<> instead of @c reinterpret_cast<>. template static inline T asmjit_cast(Z* p) { return (T)p; } // ============================================================================ // [AsmJit - OS Support] // ============================================================================ #if defined(ASMJIT_WINDOWS) #include #endif // ASMJIT_WINDOWS #if defined(__APPLE__) #include #ifndef MAC_OS_X_VERSION_10_7 // In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here. static size_t strnlen(const char *s, size_t n) { const char *p = (const char *)memchr(s, 0, n); return(p ? p-s : n); } #endif #endif // __APPLE__ // [Guard] #endif // _ASMJIT_CORE_BUILD_H desmume-0.9.11/src/utils/AsmJit/core/apibegin.h0000755000000000000000000000207712467662066017764 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [MSVC] #if defined(_MSC_VER) // Disable some warnings we know about #pragma warning(push) #pragma warning(disable: 4127) // conditional expression is constant #pragma warning(disable: 4251) // struct needs to have dll-interface to be used // by clients of struct ... #pragma warning(disable: 4275) // non dll-interface struct ... used as base for // dll-interface struct #pragma warning(disable: 4355) // this used in base member initializer list #pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' // Rename symbols. #define vsnprintf _vsnprintf #define snprintf _snprintf #endif // _MSC_VER // [GNUC] #if defined(__GNUC__) // GCC warnings fix: I can't understand why GCC has no interface to push/pop // specific warnings. // # if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 402001 // # pragma GCC diagnostic ignored "-w" // # endif #endif // __GNUC__ desmume-0.9.11/src/utils/AsmJit/core/context.cpp0000755000000000000000000000444112467662066020222 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/context.h" #include "../core/defs.h" #include "../core/memorymanager.h" #include "../core/memorymarker.h" namespace AsmJit { // ============================================================================ // [AsmJit::Context - Construction / Destruction] // ============================================================================ Context::Context() {} Context::~Context() {} // ============================================================================ // [AsmJit::JitContext - Construction / Destruction] // ============================================================================ JitContext::JitContext() : _memoryManager(NULL), _memoryMarker(NULL), _allocType(kMemAllocFreeable) { } JitContext::~JitContext() { } // ============================================================================ // [AsmJit::JitContext - Generate] // ============================================================================ uint32_t JitContext::generate(void** dest, Assembler* assembler) { // Disallow empty code generation. size_t codeSize = assembler->getCodeSize(); if (codeSize == 0) { *dest = NULL; return kErrorNoFunction; } // Switch to global memory manager if not provided. MemoryManager* memmgr = getMemoryManager(); if (memmgr == NULL) memmgr = MemoryManager::getGlobal(); void* p = memmgr->alloc(codeSize, getAllocType()); if (p == NULL) { *dest = NULL; return kErrorNoVirtualMemory; } // Relocate the code. size_t relocatedSize = assembler->relocCode(p); // Return unused memory to MemoryManager. if (relocatedSize < codeSize) memmgr->shrink(p, relocatedSize); // Mark memory if MemoryMarker provided. if (_memoryMarker) _memoryMarker->mark(p, relocatedSize); // Return the code. *dest = p; return kErrorOk; } // ============================================================================ // [AsmJit::JitContext - GetGlobal] // ============================================================================ JitContext* JitContext::getGlobal() { static JitContext global; return &global; } } // AsmJit namespace desmume-0.9.11/src/utils/AsmJit/core/logger.cpp0000755000000000000000000001174212467662066020017 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/logger.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Logger - Construction / Destruction] // ============================================================================ Logger::Logger() : _flags(kLoggerIsEnabled | kLoggerIsUsed) { memset(_instructionPrefix, 0, ASMJIT_ARRAY_SIZE(_instructionPrefix)); } Logger::~Logger() { } // ============================================================================ // [AsmJit::Logger - Logging] // ============================================================================ void Logger::logFormat(const char* fmt, ...) { char buf[1024]; size_t len; va_list ap; va_start(ap, fmt); len = vsnprintf(buf, 1023, fmt, ap); va_end(ap); logString(buf, len); } // ============================================================================ // [AsmJit::Logger - Enabled] // ============================================================================ void Logger::setEnabled(bool enabled) { if (enabled) _flags |= kLoggerIsEnabled | kLoggerIsUsed; else _flags &= ~(kLoggerIsEnabled | kLoggerIsUsed); } // ============================================================================ // [AsmJit::Logger - LogBinary] // ============================================================================ void Logger::setLogBinary(bool value) { if (value) _flags |= kLoggerOutputBinary; else _flags &= ~kLoggerOutputBinary; } // ============================================================================ // [AsmJit::Logger - HexImmediate] // ============================================================================ void Logger::setHexImmediate(bool value) { if (value) _flags |= kLoggerOutputHexImmediate; else _flags &= ~kLoggerOutputHexImmediate; } // ============================================================================ // [AsmJit::Logger - HexDisplacement] // ============================================================================ void Logger::setHexDisplacement(bool value) { if (value) _flags |= kLoggerOutputHexDisplacement; else _flags &= ~kLoggerOutputHexDisplacement; } // ============================================================================ // [AsmJit::Logger - InstructionPrefix] // ============================================================================ void Logger::setInstructionPrefix(const char* prefix) { memset(_instructionPrefix, 0, ASMJIT_ARRAY_SIZE(_instructionPrefix)); if (!prefix) return; size_t length = strnlen(prefix, ASMJIT_ARRAY_SIZE(_instructionPrefix) - 1); memcpy(_instructionPrefix, prefix, length); } // ============================================================================ // [AsmJit::FileLogger - Construction / Destruction] // ============================================================================ FileLogger::FileLogger(FILE* stream) : _stream(NULL) { setStream(stream); } FileLogger::~FileLogger() { } // ============================================================================ // [AsmJit::FileLogger - Accessors] // ============================================================================ //! @brief Set file stream. void FileLogger::setStream(FILE* stream) { _stream = stream; if (isEnabled() && _stream != NULL) _flags |= kLoggerIsUsed; else _flags &= ~kLoggerIsUsed; } // ============================================================================ // [AsmJit::FileLogger - Logging] // ============================================================================ void FileLogger::logString(const char* buf, size_t len) { if (!isUsed()) return; if (len == kInvalidSize) len = strlen(buf); fwrite(buf, 1, len, _stream); } // ============================================================================ // [AsmJit::FileLogger - Enabled] // ============================================================================ void FileLogger::setEnabled(bool enabled) { if (enabled) _flags |= kLoggerIsEnabled | (_stream != NULL ? kLoggerIsUsed : 0); else _flags &= ~(kLoggerIsEnabled | kLoggerIsUsed); } // ============================================================================ // [AsmJit::StringLogger - Construction / Destruction] // ============================================================================ StringLogger::StringLogger() { } StringLogger::~StringLogger() { } // ============================================================================ // [AsmJit::StringLogger - Logging] // ============================================================================ void StringLogger::logString(const char* buf, size_t len) { if (!isUsed()) return; _stringBuilder.appendString(buf, len); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/assembler.h0000755000000000000000000004240512467662066020162 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_ASSEMBLER_H #define _ASMJIT_CORE_ASSEMBLER_H // [Dependencies - AsmJit] #include "../core/buffer.h" #include "../core/context.h" #include "../core/defs.h" #include "../core/logger.h" #include "../core/podvector.h" #include "../core/zonememory.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Assembler] // ============================================================================ //! @brief Base class for @ref Assembler. //! //! This class implements core setialization API only. The platform specific //! methods and intrinsics is implemented by derived classes. //! //! @sa @c Assembler. struct Assembler { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Creates Assembler instance. ASMJIT_API Assembler(Context* context); //! @brief Destroys Assembler instance ASMJIT_API virtual ~Assembler(); // -------------------------------------------------------------------------- // [LabelLink] // -------------------------------------------------------------------------- //! @brief Data structure used to link linked-labels. struct LabelLink { //! @brief Previous link. LabelLink* prev; //! @brief Offset. sysint_t offset; //! @brief Inlined displacement. sysint_t displacement; //! @brief RelocId if link must be absolute when relocated. sysint_t relocId; }; // -------------------------------------------------------------------------- // [LabelData] // -------------------------------------------------------------------------- //! @brief Label data. struct LabelData { //! @brief Label offset. sysint_t offset; //! @brief Label links chain. LabelLink* links; }; // -------------------------------------------------------------------------- // [RelocData] // -------------------------------------------------------------------------- // X86 architecture uses 32-bit absolute addressing model by memory operands, // but 64-bit mode uses relative addressing model (RIP + displacement). In // code we are always using relative addressing model for referencing labels // and embedded data. In 32-bit mode we must patch all references to absolute // address before we can call generated function. We are patching only memory // operands. //! @brief Code relocation data (relative vs absolute addresses). struct RelocData { //! @brief Type of relocation. uint32_t type; //! @brief Size of relocation (4 or 8 bytes). uint32_t size; //! @brief Offset from code begin address. sysint_t offset; //! @brief Relative displacement or absolute address. union { //! @brief Relative displacement from code begin address (not to @c offset). sysint_t destination; //! @brief Absolute address where to jump; void* address; }; }; // -------------------------------------------------------------------------- // [Context] // -------------------------------------------------------------------------- //! @brief Get code generator. inline Context* getContext() const { return _context; } // -------------------------------------------------------------------------- // [Memory Management] // -------------------------------------------------------------------------- //! @brief Get zone memory manager. inline ZoneMemory* getZoneMemory() const { return const_cast(&_zoneMemory); } // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- //! @brief Get logger. inline Logger* getLogger() const { return _logger; } //! @brief Set logger to @a logger. ASMJIT_API virtual void setLogger(Logger* logger); // -------------------------------------------------------------------------- // [Error Handling] // -------------------------------------------------------------------------- //! @brief Get error code. inline uint32_t getError() const { return _error; } //! @brief Set error code. //! //! This method is virtual, because higher classes can use it to catch all //! errors. ASMJIT_API virtual void setError(uint32_t error); // -------------------------------------------------------------------------- // [Properties] // -------------------------------------------------------------------------- //! @brief Get assembler property. ASMJIT_API virtual uint32_t getProperty(uint32_t propertyId) const; //! @brief Set assembler property. ASMJIT_API virtual void setProperty(uint32_t propertyId, uint32_t value); // -------------------------------------------------------------------------- // [Capacity] // -------------------------------------------------------------------------- //! @brief Get capacity of internal code buffer. inline size_t getCapacity() const { return _buffer.getCapacity(); } // -------------------------------------------------------------------------- // [Offset] // -------------------------------------------------------------------------- //! @brief Return current offset in buffer. inline size_t getOffset() const { return _buffer.getOffset(); } //! @brief Set offset to @a o and returns previous offset. //! //! This method can be used to truncate code (previous offset is not //! recorded) or to overwrite instruction stream at position @a o. //! //! @return Previous offset value that can be uset to set offset back later. inline size_t toOffset(size_t o) { return _buffer.toOffset(o); } // -------------------------------------------------------------------------- // [GetCode / GetCodeSize] // -------------------------------------------------------------------------- //! @brief Return start of assembler code buffer. //! //! Note that buffer address can change if you emit instruction or something //! else. Use this pointer only when you finished or make sure you do not //! use returned pointer after emitting. inline uint8_t* getCode() const { return _buffer.getData(); } //! @brief Return current offset in buffer (same as getOffset() + getTramplineSize()). inline size_t getCodeSize() const { return _buffer.getOffset() + getTrampolineSize(); } // -------------------------------------------------------------------------- // [TakeCode] // -------------------------------------------------------------------------- //! @brief Take internal code buffer and NULL all pointers (you take the ownership). ASMJIT_API uint8_t* takeCode(); // -------------------------------------------------------------------------- // [Clear / Reset] // -------------------------------------------------------------------------- //! @brief Clear everything, but not deallocate buffers. ASMJIT_API void clear(); //! @brief Reset everything (means also to free all buffers). ASMJIT_API void reset(); //! @brief Called by clear() and reset() to clear all data related to derived //! class implementation. ASMJIT_API virtual void _purge(); // -------------------------------------------------------------------------- // [EnsureSpace] // -------------------------------------------------------------------------- //! @brief Ensure space for next instruction. //! //! Note that this method can return false. It's rare and probably you never //! get this, but in some situations it's still possible. inline bool ensureSpace() { return _buffer.ensureSpace(); } // -------------------------------------------------------------------------- // [GetTrampolineSize] // -------------------------------------------------------------------------- //! @brief Get size of all possible trampolines needed to successfuly generate //! relative jumps to absolute addresses. This value is only non-zero if jmp //! of call instructions were used with immediate operand (this means jump or //! call absolute address directly). //! //! Currently only _emitJmpOrCallReloc() method can increase trampoline size //! value. inline size_t getTrampolineSize() const { return _trampolineSize; } // -------------------------------------------------------------------------- // [Buffer - Getters] // -------------------------------------------------------------------------- //! @brief Get byte at position @a pos. inline uint8_t getByteAt(size_t pos) const { return _buffer.getByteAt(pos); } //! @brief Get word at position @a pos. inline uint16_t getWordAt(size_t pos) const { return _buffer.getWordAt(pos); } //! @brief Get dword at position @a pos. inline uint32_t getDWordAt(size_t pos) const { return _buffer.getDWordAt(pos); } //! @brief Get qword at position @a pos. inline uint64_t getQWordAt(size_t pos) const { return _buffer.getQWordAt(pos); } //! @brief Get int32_t at position @a pos. inline int32_t getInt32At(size_t pos) const { return (int32_t)_buffer.getDWordAt(pos); } //! @brief Get int64_t at position @a pos. inline int64_t getInt64At(size_t pos) const { return (int64_t)_buffer.getQWordAt(pos); } //! @brief Get intptr_t at position @a pos. inline intptr_t getIntPtrTAt(size_t pos) const { return _buffer.getIntPtrTAt(pos); } //! @brief Get uintptr_t at position @a pos. inline uintptr_t getUIntPtrTAt(size_t pos) const { return _buffer.getUIntPtrTAt(pos); } //! @brief Get uintptr_t at position @a pos. inline size_t getSizeTAt(size_t pos) const { return _buffer.getSizeTAt(pos); } // -------------------------------------------------------------------------- // [Buffer - Setters] // -------------------------------------------------------------------------- //! @brief Set byte at position @a pos. inline void setByteAt(size_t pos, uint8_t x) { _buffer.setByteAt(pos, x); } //! @brief Set word at position @a pos. inline void setWordAt(size_t pos, uint16_t x) { _buffer.setWordAt(pos, x); } //! @brief Set dword at position @a pos. inline void setDWordAt(size_t pos, uint32_t x) { _buffer.setDWordAt(pos, x); } //! @brief Set qword at position @a pos. inline void setQWordAt(size_t pos, uint64_t x) { _buffer.setQWordAt(pos, x); } //! @brief Set int32_t at position @a pos. inline void setInt32At(size_t pos, int32_t x) { _buffer.setDWordAt(pos, (uint32_t)x); } //! @brief Set int64_t at position @a pos. inline void setInt64At(size_t pos, int64_t x) { _buffer.setQWordAt(pos, (uint64_t)x); } //! @brief Set intptr_t at position @a pos. inline void setIntPtrTAt(size_t pos, intptr_t x) { _buffer.setIntPtrTAt(pos, x); } //! @brief Set uintptr_t at position @a pos. inline void setUInt64At(size_t pos, uintptr_t x) { _buffer.setUIntPtrTAt(pos, x); } //! @brief Set size_t at position @a pos. inline void setSizeTAt(size_t pos, size_t x) { _buffer.setSizeTAt(pos, x); } // -------------------------------------------------------------------------- // [CanEmit] // -------------------------------------------------------------------------- //! @brief Get whether the instruction can be emitted. //! //! This function behaves like @c ensureSpace(), but it also checks if //! assembler is in error state and in that case it returns @c false. //! Assembler internally always uses this function before new instruction is //! emitted. //! //! It's implemented like: //! return ensureSpace() && !getError(); inline bool canEmit() { // If there is an error, we can't emit another instruction until last error // is cleared by calling @c setError(kErrorOk). If something caused the // error while generating code it's probably fatal in all cases. You can't // use generated code anymore, because you are not sure about the status. if (_error) return false; // The ensureSpace() method returns true on success and false on failure. We // are catching return value and setting error code here. if (ensureSpace()) return true; // If we are here, there is memory allocation error. Note that this is HEAP // allocation error, virtual allocation error can be caused only by // AsmJit::VirtualMemory class! setError(kErrorNoHeapMemory); return false; } // -------------------------------------------------------------------------- // [Emit] // // These functions are not protected against buffer overrun. Each place of // code which calls these functions ensures that there is some space using // canEmit() method. Emitters are internally protected in AsmJit::Buffer, // but only in debug builds. // -------------------------------------------------------------------------- //! @brief Emit Byte to internal buffer. inline void _emitByte(uint8_t x) { _buffer.emitByte(x); } //! @brief Emit word (2 bytes) to internal buffer. inline void _emitWord(uint16_t x) { _buffer.emitWord(x); } //! @brief Emit dword (4 bytes) to internal buffer. inline void _emitDWord(uint32_t x) { _buffer.emitDWord(x); } //! @brief Emit qword (8 bytes) to internal buffer. inline void _emitQWord(uint64_t x) { _buffer.emitQWord(x); } //! @brief Emit Int32 (4 bytes) to internal buffer. inline void _emitInt32(int32_t x) { _buffer.emitDWord((uint32_t)x); } //! @brief Emit Int64 (8 bytes) to internal buffer. inline void _emitInt64(int64_t x) { _buffer.emitQWord((uint64_t)x); } //! @brief Emit intptr_t (4 or 8 bytes) to internal buffer. inline void _emitIntPtrT(intptr_t x) { _buffer.emitIntPtrT(x); } //! @brief Emit uintptr_t (4 or 8 bytes) to internal buffer. inline void _emitUIntPtrT(uintptr_t x) { _buffer.emitUIntPtrT(x); } //! @brief Emit size_t (4 or 8 bytes) to internal buffer. inline void _emitSizeT(size_t x) { _buffer.emitSizeT(x); } //! @brief Embed data into instruction stream. ASMJIT_API void embed(const void* data, size_t len); // -------------------------------------------------------------------------- // [Reloc] // -------------------------------------------------------------------------- //! @brief Relocate code to a given address @a dst. //! //! @param dst Where the relocated code should me stored. The pointer can be //! address returned by virtual memory allocator or your own address if you //! want only to store the code for later reuse (or load, etc...). //! @param addressBase Base address used for relocation. When using JIT code //! generation, this will be the same as @a dst, only casted to system //! integer type. But when generating code for remote process then the value //! can be different. //! //! @retval The bytes used. Code-generator can create trampolines which are //! used when calling other functions inside the JIT code. However, these //! trampolines can be unused so the relocCode() returns the exact size needed //! for the function. //! //! A given buffer will be overwritten, to get number of bytes required use //! @c getCodeSize(). virtual size_t relocCode(void* dst, sysuint_t addressBase) const = 0; //! @brief Simplifed version of @c relocCode() method designed for JIT. //! //! @overload inline size_t relocCode(void* dst) const { return relocCode(dst, (uintptr_t)dst); } // -------------------------------------------------------------------------- // [Make] // -------------------------------------------------------------------------- //! @brief Make is convenience method to make currently serialized code and //! return pointer to generated function. //! //! What you need is only to cast this pointer to your function type and call //! it. Note that if there was an error and calling @c getError() method not //! returns @c kErrorOk (zero) then this function always return @c NULL and //! error value remains the same. virtual void* make() = 0; // -------------------------------------------------------------------------- // [Helpers] // -------------------------------------------------------------------------- ASMJIT_API LabelLink* _newLabelLink(); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief ZoneMemory management. ZoneMemory _zoneMemory; //! @brief Binary code buffer. Buffer _buffer; //! @brief Context (for example @ref JitContext). Context* _context; //! @brief Logger. Logger* _logger; //! @brief Error code. uint32_t _error; //! @brief Properties. uint32_t _properties; //! @brief Emit flags for next instruction (cleared after emit). uint32_t _emitOptions; //! @brief Size of possible trampolines. uint32_t _trampolineSize; //! @brief Inline comment that will be logged by the next instruction and //! set to NULL. const char* _inlineComment; //! @brief Linked list of unused links (@c LabelLink* structures) LabelLink* _unusedLinks; //! @brief Labels data. PodVector _labels; //! @brief Relocations data. PodVector _relocData; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_ASSEMBLER_H desmume-0.9.11/src/utils/AsmJit/core/virtualmemory.h0000755000000000000000000000500112467662066021113 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_VIRTUALMEMORY_H #define _ASMJIT_CORE_VIRTUALMEMORY_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::VirtualMemory] // ============================================================================ //! @brief Class that helps with allocating memory for executing code //! generated by JIT compiler. //! //! There are defined functions that provides facility to allocate and free //! memory where can be executed code. If processor and operating system //! supports execution protection then you can't run code from normally //! malloc()'ed memory. //! //! Functions are internally implemented by operating system dependent way. //! VirtualAlloc() function is used for Windows operating system and mmap() //! for posix ones. If you want to study or create your own functions, look //! at VirtualAlloc() or mmap() documentation (depends on you target OS). //! //! Under posix operating systems is also useable mprotect() function, that //! can enable execution protection to malloc()'ed memory block. struct VirtualMemory { //! @brief Allocate virtual memory. //! //! Pages are readable/writeable, but they are not guaranteed to be //! executable unless 'canExecute' is true. Returns the address of //! allocated memory, or NULL if failed. ASMJIT_API static void* alloc(size_t length, size_t* allocated, bool canExecute); //! @brief Free memory allocated by @c alloc() ASMJIT_API static void free(void* addr, size_t length); #if defined(ASMJIT_WINDOWS) //! @brief Allocate virtual memory of @a hProcess. //! //! @note This function is Windows specific. ASMJIT_API static void* allocProcessMemory(HANDLE hProcess, size_t length, size_t* allocated, bool canExecute); //! @brief Free virtual memory of @a hProcess. //! //! @note This function is Windows specific. ASMJIT_API static void freeProcessMemory(HANDLE hProcess, void* addr, size_t length); #endif // ASMJIT_WINDOWS //! @brief Get the alignment guaranteed by alloc(). ASMJIT_API static size_t getAlignment(); //! @brief Get size of single page. ASMJIT_API static size_t getPageSize(); }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_VIRTUALMEMORY_H desmume-0.9.11/src/utils/AsmJit/core/compileritem.cpp0000755000000000000000000001771112467662066021233 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/compiler.h" #include "../core/compilercontext.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/intutil.h" #include "../core/logger.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerItem - Construction / Destruction] // ============================================================================ CompilerItem::CompilerItem(Compiler* compiler, uint32_t type) : _compiler(compiler), _prev(NULL), _next(NULL), _comment(NULL), _type(static_cast(type)), _isTranslated(false), _isUnreachable(false), _reserved(0), _offset(kInvalidValue) { } CompilerItem::~CompilerItem() { } // ============================================================================ // [AsmJit::CompilerItem - Interface] // ============================================================================ void CompilerItem::prepare(CompilerContext& cc) { _offset = cc._currentOffset; } CompilerItem* CompilerItem::translate(CompilerContext& cc) { return translated(); } void CompilerItem::emit(Assembler& a) {} void CompilerItem::post(Assembler& a) {} // ============================================================================ // [AsmJit::CompilerItem - Misc] // ============================================================================ int CompilerItem::getMaxSize() const { // Default maximum size is -1 which means that it's not known. return -1; } bool CompilerItem::_tryUnuseVar(CompilerVar* v) { return false; } // ============================================================================ // [AsmJit::CompilerItem - Comment] // ============================================================================ void CompilerItem::setComment(const char* str) { _comment = _compiler->getZoneMemory().sdup(str); } void CompilerItem::formatComment(const char* fmt, ...) { // The capacity should be large enough. char buf[128]; va_list ap; va_start(ap, fmt); vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap); va_end(ap); // I don't know if vsnprintf can produce non-null terminated string, in case // it can, we terminate it here. buf[ASMJIT_ARRAY_SIZE(buf) - 1] = '\0'; setComment(buf); } // ============================================================================ // [AsmJit::CompilerMark - Construction / Destruction] // ============================================================================ CompilerMark::CompilerMark(Compiler* compiler) : CompilerItem(compiler, kCompilerItemMark) { } CompilerMark::~CompilerMark() { } // ============================================================================ // [AsmJit::CompilerMark - Misc] // ============================================================================ int CompilerMark::getMaxSize() const { return 0; } // ============================================================================ // [AsmJit::CompilerComment - Construction / Destruction] // ============================================================================ CompilerComment::CompilerComment(Compiler* compiler, const char* str) : CompilerItem(compiler, kCompilerItemComment) { if (str != NULL) setComment(str); } CompilerComment::~CompilerComment() { } // ============================================================================ // [AsmJit::CompilerComment - Interface] // ============================================================================ void CompilerComment::emit(Assembler& a) { Logger* logger = a.getLogger(); if (logger == NULL || !logger->isUsed()) return; logger->logString(logger->getInstructionPrefix()); logger->logString(getComment()); } // ============================================================================ // [AsmJit::CompilerComment - Misc] // ============================================================================ int CompilerComment::getMaxSize() const { return 0; } // ============================================================================ // [AsmJit::CompilerEmbed - Construction / Destruction] // ============================================================================ CompilerEmbed::CompilerEmbed(Compiler* compiler, const void* data, size_t length) : CompilerItem(compiler, kCompilerItemEmbed) { _length = length; memcpy(_data, data, length); } CompilerEmbed::~CompilerEmbed() { } // ============================================================================ // [AsmJit::CompilerEmbed - Interface] // ============================================================================ void CompilerEmbed::emit(Assembler& a) { a.embed(_data, _length); } // ============================================================================ // [AsmJit::CompilerEmbed - Misc] // ============================================================================ int CompilerEmbed::getMaxSize() const { return (int)_length;; } // ============================================================================ // [AsmJit::CompilerAlign - Construction / Destruction] // ============================================================================ CompilerAlign::CompilerAlign(Compiler* compiler, uint32_t size) : CompilerItem(compiler, kCompilerItemAlign), _size(size) { } CompilerAlign::~CompilerAlign() { } // ============================================================================ // [AsmJit::CompilerAlign - Misc] // ============================================================================ int CompilerAlign::getMaxSize() const { if (_size == 0) return 0; else return static_cast(_size - 1); } // ============================================================================ // [AsmJit::CompilerHint - Construction / Destruction] // ============================================================================ CompilerHint::CompilerHint(Compiler* compiler, CompilerVar* var, uint32_t hintId, uint32_t hintValue) : CompilerItem(compiler, kCompilerItemHint), _var(var), _hintId(hintId), _hintValue(hintValue) { ASMJIT_ASSERT(var != NULL); } CompilerHint::~CompilerHint() { } // ============================================================================ // [AsmJit::CompilerTarget - Construction / Destruction] // ============================================================================ CompilerTarget::CompilerTarget(Compiler* compiler, const Label& label) : CompilerItem(compiler, kCompilerItemTarget), _label(label), _from(NULL), _state(NULL), _jumpsCount(0) { } CompilerTarget::~CompilerTarget() { } // ============================================================================ // [AsmJit::CompilerTarget - Misc] // ============================================================================ int CompilerTarget::getMaxSize() const { return 0; } // ============================================================================ // [AsmJit::CompilerInst - Construction / Destruction] // ============================================================================ CompilerInst::CompilerInst(Compiler* compiler, uint32_t code, Operand* opData, uint32_t opCount) : CompilerItem(compiler, kCompilerItemInst), _code(code), _emitOptions(static_cast(compiler->_emitOptions)), _instFlags(0), _operandsCount(static_cast(opCount)), _variablesCount(0), _operands(opData) { // Each created instruction takes emit options and clears it. compiler->_emitOptions = 0; } CompilerInst::~CompilerInst() { } // ============================================================================ // [AsmJit::CompilerInst - GetJumpTarget] // ============================================================================ CompilerTarget* CompilerInst::getJumpTarget() const { return NULL; } } // AsmJit namespace // [Api-Begin] #include "../core/apibegin.h" desmume-0.9.11/src/utils/AsmJit/core/podvector.h0000755000000000000000000001271512467662066020213 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_PODVECTOR_H #define _ASMJIT_CORE_PODVECTOR_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::PodVector] // ============================================================================ //! @brief Template used to store and manage array of POD data. //! //! This template has these adventages over other vector<> templates: //! - Non-copyable (designed to be non-copyable, we want it) //! - No copy-on-write (some implementations of stl can use it) //! - Optimized for working only with POD types //! - Uses ASMJIT_... memory management macros template struct PodVector { ASMJIT_NO_COPY(PodVector) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new instance of PodVector template. Data will not //! be allocated (will be NULL). inline PodVector() : _data(NULL), _length(0), _capacity(0) { } //! @brief Destroy PodVector and free all data. inline ~PodVector() { if (_data != NULL) ASMJIT_FREE(_data); } // -------------------------------------------------------------------------- // [Data] // -------------------------------------------------------------------------- //! @brief Get data. inline T* getData() { return _data; } //! @overload inline const T* getData() const { return _data; } //! @brief Get length. inline size_t getLength() const { return _length; } //! @brief Get capacity. inline size_t getCapacity() const { return _capacity; } // -------------------------------------------------------------------------- // [Manipulation] // -------------------------------------------------------------------------- //! @brief Clear vector data, but not free internal buffer. void clear() { _length = 0; } //! @brief Clear vector data and free internal buffer. void reset() { if (_data != NULL) { ASMJIT_FREE(_data); _data = 0; _length = 0; _capacity = 0; } } //! @brief Prepend @a item to vector. bool prepend(const T& item) { if (_length == _capacity && !_grow()) return false; memmove(_data + 1, _data, sizeof(T) * _length); memcpy(_data, &item, sizeof(T)); _length++; return true; } //! @brief Insert an @a item at the @a index. bool insert(size_t index, const T& item) { ASMJIT_ASSERT(index <= _length); if (_length == _capacity && !_grow()) return false; T* dst = _data + index; memmove(dst + 1, dst, _length - index); memcpy(dst, &item, sizeof(T)); _length++; return true; } //! @brief Append @a item to vector. bool append(const T& item) { if (_length == _capacity && !_grow()) return false; memcpy(_data + _length, &item, sizeof(T)); _length++; return true; } //! @brief Get index of @a val or kInvalidSize if not found. size_t indexOf(const T& val) const { size_t i = 0, len = _length; for (i = 0; i < len; i++) { if (_data[i] == val) return i; } return kInvalidSize; } //! @brief Remove element at index @a i. void removeAt(size_t i) { ASMJIT_ASSERT(i < _length); T* dst = _data + i; _length--; memmove(dst, dst + 1, _length - i); } //! @brief Swap this pod-vector with @a other. void swap(PodVector& other) { T* _tmp_data = _data; size_t _tmp_length = _length; size_t _tmp_capacity = _capacity; _data = other._data; _length = other._length; _capacity = other._capacity; other._data = _tmp_data; other._length = _tmp_length; other._capacity = _tmp_capacity; } //! @brief Get item at position @a i. inline T& operator[](size_t i) { ASMJIT_ASSERT(i < _length); return _data[i]; } //! @brief Get item at position @a i. inline const T& operator[](size_t i) const { ASMJIT_ASSERT(i < _length); return _data[i]; } //! @brief Append the item and return address so it can be initialized. T* newItem() { if (_length == _capacity && !_grow()) return NULL; return _data + (_length++); } // -------------------------------------------------------------------------- // [Private] // -------------------------------------------------------------------------- //! @brief Called to grow internal array. bool _grow() { return _realloc(_capacity < 16 ? 16 : _capacity * 2); } //! @brief Realloc internal array to fit @a to items. bool _realloc(size_t to) { ASMJIT_ASSERT(to >= _length); T* p = reinterpret_cast(_data ? ASMJIT_REALLOC(_data, to * sizeof(T)) : ASMJIT_MALLOC(to * sizeof(T))); if (p == NULL) return false; _data = p; _capacity = to; return true; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Items data. T* _data; //! @brief Length of buffer (count of items in array). size_t _length; //! @brief Capacity of buffer (maximum items that can fit to current array). size_t _capacity; }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_PODVECTOR_H desmume-0.9.11/src/utils/AsmJit/core/compilerfunc.cpp0000755000000000000000000001077312467662066021231 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/compiler.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/intutil.h" #include "../core/logger.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerFuncDecl - Construction / Destruction] // ============================================================================ CompilerFuncDecl::CompilerFuncDecl(Compiler* compiler) : CompilerItem(compiler, kCompilerItemFuncDecl), _entryTarget(NULL), _exitTarget(NULL), _end(NULL), _decl(NULL), _vars(NULL), _funcHints(0), _funcFlags(0), _funcCallStackSize(0) { } CompilerFuncDecl::~CompilerFuncDecl() { } // ============================================================================ // [AsmJit::CompilerFuncDecl - Hints] // ============================================================================ void CompilerFuncDecl::setHint(uint32_t hint, uint32_t value) { if (hint > 31) return; if (value) _funcHints |= IntUtil::maskFromIndex(hint); else _funcHints &= ~IntUtil::maskFromIndex(hint); } uint32_t CompilerFuncDecl::getHint(uint32_t hint) const { if (hint > 31) return 0; return (_funcHints & IntUtil::maskFromIndex(hint)) != 0; } // ============================================================================ // [AsmJit::CompilerFuncEnd - Construction / Destruction] // ============================================================================ CompilerFuncEnd::CompilerFuncEnd(Compiler* compiler, CompilerFuncDecl* func) : CompilerItem(compiler, kCompilerItemFuncEnd), _func(func) { } CompilerFuncEnd::~CompilerFuncEnd() { } // ============================================================================ // [AsmJit::CompilerFuncEnd - Interface] // ============================================================================ CompilerItem* CompilerFuncEnd::translate(CompilerContext& cc) { _isTranslated = true; return NULL; } // ============================================================================ // [AsmJit::CompilerFuncRet - Construction / Destruction] // ============================================================================ CompilerFuncRet::CompilerFuncRet(Compiler* compiler, CompilerFuncDecl* func, const Operand* first, const Operand* second) : CompilerItem(compiler, kCompilerItemFuncRet), _func(func) { if (first != NULL) _ret[0] = *first; if (second != NULL) _ret[1] = *second; } CompilerFuncRet::~CompilerFuncRet() { } // ============================================================================ // [AsmJit::CompilerFuncRet - Misc] // ============================================================================ bool CompilerFuncRet::mustEmitJump() const { // Iterate over next items until we found an item which emits a real instruction. CompilerItem* item = this->getNext(); while (item) { switch (item->getType()) { // Interesting item. case kCompilerItemEmbed: case kCompilerItemInst: case kCompilerItemFuncCall: case kCompilerItemFuncRet: return true; // Non-interesting item. case kCompilerItemComment: case kCompilerItemMark: case kCompilerItemAlign: case kCompilerItemHint: break; case kCompilerItemTarget: if (static_cast(item)->getLabel().getId() == getFunc()->getExitLabel().getId()) return false; break; // Invalid items - these items shouldn't be here. We are inside the // function, after prolog. case kCompilerItemFuncDecl: break; // We can't go forward from here. case kCompilerItemFuncEnd: return false; } item = item->getNext(); } return false; } // ============================================================================ // [AsmJit::CompilerFuncCall - Construction / Destruction] // ============================================================================ CompilerFuncCall::CompilerFuncCall(Compiler* compiler, CompilerFuncDecl* caller, const Operand* target) : CompilerItem(compiler, kCompilerItemFuncCall), _caller(caller), _decl(NULL), _args(NULL) { if (target != NULL) _target = *target; } CompilerFuncCall::~CompilerFuncCall() { } } // AsmJit namespace // [Api-Begin] #include "../core/apibegin.h" desmume-0.9.11/src/utils/AsmJit/core/memorymarker.cpp0000755000000000000000000000114512467662066021246 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/memorymarker.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::MemoryMarker] // ============================================================================ MemoryMarker::MemoryMarker() {} MemoryMarker::~MemoryMarker() {} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/stringutil.cpp0000755000000000000000000000322512467662066020741 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/stringutil.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::StringUtil] // ============================================================================ static const char letters[] = "0123456789ABCDEF"; char* StringUtil::copy(char* dst, const char* src, size_t len) { if (src == NULL) return dst; if (len == kInvalidSize) { while (*src) *dst++ = *src++; } else { memcpy(dst, src, len); dst += len; } return dst; } char* StringUtil::fill(char* dst, const int c, size_t len) { memset(dst, c, len); return dst + len; } char* StringUtil::hex(char* dst, const uint8_t* src, size_t len) { for (size_t i = len; i; i--, dst += 2, src += 1) { dst[0] = letters[(src[0] >> 4) & 0xF]; dst[1] = letters[(src[0] ) & 0xF]; } return dst; } // Not too efficient, but this is mainly for debugging:) char* StringUtil::utoa(char* dst, uintptr_t i, size_t base) { ASMJIT_ASSERT(base <= 16); char buf[128]; char* p = buf + 128; do { uintptr_t b = i % base; *--p = letters[b]; i /= base; } while (i); return StringUtil::copy(dst, p, (size_t)(buf + 128 - p)); } char* StringUtil::itoa(char* dst, intptr_t i, size_t base) { if (i < 0) { *dst++ = '-'; i = -i; } return StringUtil::utoa(dst, (size_t)i, base); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/context.h0000755000000000000000000001152312467662066017666 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_CONTEXT_H #define _ASMJIT_CORE_CONTEXT_H // [Dependencies - AsmJit] #include "../core/build.h" namespace AsmJit { // ============================================================================ // [Forward Declarations] // ============================================================================ struct Assembler; struct MemoryManager; struct MemoryMarker; // ============================================================================ // [AsmJit::Context] // ============================================================================ //! @brief Class for changing behavior of code generated by @ref Assembler and //! @ref Compiler. struct Context { ASMJIT_NO_COPY(Context) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @c Context instance. ASMJIT_API Context(); //! @brief Destroy the @c Context instance. ASMJIT_API virtual ~Context(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- //! @brief Allocate memory for code generated in @a assembler and reloc it //! to target location. //! //! This method is universal allowing any pre-process / post-process work //! with code generated by @c Assembler or @c Compiler. Because @c Compiler //! always uses @c Assembler it's allowed to access only the @c Assembler //! instance. //! //! This method is always last step when using code generation. You can use //! it to allocate memory for JIT code, saving code to remote process or a //! shared library. //! //! @retrurn Error value, see @c kError. virtual uint32_t generate(void** dest, Assembler* assembler) = 0; }; // ============================================================================ // [AsmJit::JitContext] // ============================================================================ struct JitContext : public Context { ASMJIT_NO_COPY(JitContext) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @c JitContext instance. ASMJIT_API JitContext(); //! @brief Destroy the @c JitContext instance. ASMJIT_API virtual ~JitContext(); // -------------------------------------------------------------------------- // [Memory Manager and Alloc Type] // -------------------------------------------------------------------------- // Note: These members can be ignored by all derived classes. They are here // only to privide default implementation. All other implementations (remote // code patching or making dynamic loadable libraries/executables) ignore // members accessed by these accessors. //! @brief Get the @c MemoryManager instance. inline MemoryManager* getMemoryManager() const { return _memoryManager; } //! @brief Set the @c MemoryManager instance. inline void setMemoryManager(MemoryManager* memoryManager) { _memoryManager = memoryManager; } //! @brief Get the type of allocation. inline uint32_t getAllocType() const { return _allocType; } //! @brief Set the type of allocation. inline void setAllocType(uint32_t allocType) { _allocType = allocType; } // -------------------------------------------------------------------------- // [Memory Marker] // -------------------------------------------------------------------------- //! @brief Get the @c MemoryMarker instance. inline MemoryMarker* getMemoryMarker() const { return _memoryMarker; } //! @brief Set the @c MemoryMarker instance. inline void setMemoryMarker(MemoryMarker* memoryMarker) { _memoryMarker = memoryMarker; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual uint32_t generate(void** dest, Assembler* assembler); // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- ASMJIT_API static JitContext* getGlobal(); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Memory manager. MemoryManager* _memoryManager; //! @brief Memory marker. MemoryMarker* _memoryMarker; //! @brief Type of allocation. uint32_t _allocType; }; } // AsmJit namespace // [Guard] #endif // _ASMJIT_CORE_CONTEXT_H desmume-0.9.11/src/utils/AsmJit/core/compilercontext.cpp0000755000000000000000000000154212467662066021754 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/compilercontext.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerContext - Construction / Destruction] // ============================================================================ CompilerContext::CompilerContext(Compiler* compiler) : _zoneMemory(8192 - sizeof(ZoneChunk) - 32), _compiler(compiler), _func(NULL), _start(NULL), _stop(NULL), _extraBlock(NULL), _state(NULL), _active(NULL), _currentOffset(0), _isUnreachable(0) { } CompilerContext::~CompilerContext() { } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/lock.h0000755000000000000000000000702112467662066017130 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_LOCK_H #define _ASMJIT_CORE_LOCK_H // [Dependencies - AsmJit] #include "../core/build.h" // [Dependencies - Windows] #if defined(ASMJIT_WINDOWS) # include #endif // ASMJIT_WINDOWS // [Dependencies - Posix] #if defined(ASMJIT_POSIX) # include #endif // ASMJIT_POSIX // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Lock] // ============================================================================ //! @brief Lock - used in thread-safe code for locking. struct Lock { ASMJIT_NO_COPY(Lock) // -------------------------------------------------------------------------- // [Windows] // -------------------------------------------------------------------------- #if defined(ASMJIT_WINDOWS) typedef CRITICAL_SECTION Handle; //! @brief Create a new @ref Lock instance. inline Lock() { InitializeCriticalSection(&_handle); } //! @brief Destroy the @ref Lock instance. inline ~Lock() { DeleteCriticalSection(&_handle); } //! @brief Lock. inline void lock() { EnterCriticalSection(&_handle); } //! @brief Unlock. inline void unlock() { LeaveCriticalSection(&_handle); } #endif // ASMJIT_WINDOWS // -------------------------------------------------------------------------- // [Posix] // -------------------------------------------------------------------------- #if defined(ASMJIT_POSIX) typedef pthread_mutex_t Handle; //! @brief Create a new @ref Lock instance. inline Lock() { pthread_mutex_init(&_handle, NULL); } //! @brief Destroy the @ref Lock instance. inline ~Lock() { pthread_mutex_destroy(&_handle); } //! @brief Lock. inline void lock() { pthread_mutex_lock(&_handle); } //! @brief Unlock. inline void unlock() { pthread_mutex_unlock(&_handle); } #endif // ASMJIT_POSIX // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get handle. inline Handle& getHandle() { return _handle; } //! @overload inline const Handle& getHandle() const { return _handle; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Handle. Handle _handle; }; // ============================================================================ // [AsmJit::AutoLock] // ============================================================================ //! @brief Scope auto locker. struct AutoLock { ASMJIT_NO_COPY(AutoLock) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Locks @a target. inline AutoLock(Lock& target) : _target(target) { _target.lock(); } //! @brief Unlocks target. inline ~AutoLock() { _target.unlock(); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Pointer to target (lock). Lock& _target; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_LOCK_H desmume-0.9.11/src/utils/AsmJit/core/stringbuilder.h0000755000000000000000000001561312467662066021063 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #include // [Guard] #ifndef _ASMJIT_CORE_STRINGBUILDER_H #define _ASMJIT_CORE_STRINGBUILDER_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::StringBuilder] // ============================================================================ //! @brief String builder. //! //! String builder was designed to be able to build a string using append like //! operation to append numbers, other strings, or signle characters. It can //! allocate it's own buffer or use a buffer created on the stack. //! //! String builder contains method specific to AsmJit functionality, used for //! logging or HTML output. struct StringBuilder { ASMJIT_NO_COPY(StringBuilder) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API StringBuilder(); ASMJIT_API ~StringBuilder(); inline StringBuilder(const _DontInitialize&) {} // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get string builder capacity. inline size_t getCapacity() const { return _capacity; } //! @brief Get length. inline size_t getLength() const { return _length; } //! @brief Get null-terminated string data. inline char* getData() { return _data; } //! @brief Get null-terminated string data (const). inline const char* getData() const { return _data; } // -------------------------------------------------------------------------- // [Prepare / Reserve] // -------------------------------------------------------------------------- //! @brief Prepare to set/append. ASMJIT_API char* prepare(uint32_t op, size_t len); //! @brief Reserve @a to bytes in string builder. ASMJIT_API bool reserve(size_t to); // -------------------------------------------------------------------------- // [Clear] // -------------------------------------------------------------------------- //! @brief Clear the content in String builder. ASMJIT_API void clear(); // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- ASMJIT_API bool _opString(uint32_t op, const char* str, size_t len = kInvalidSize); ASMJIT_API bool _opVFormat(uint32_t op, const char* fmt, va_list ap); ASMJIT_API bool _opChars(uint32_t op, char c, size_t len); ASMJIT_API bool _opNumber(uint32_t op, uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0); ASMJIT_API bool _opHex(uint32_t op, const void* data, size_t length); //! @brief Replace the current content by @a str of @a len. inline bool setString(const char* str, size_t len = kInvalidSize) { return _opString(kStringBuilderOpSet, str, len); } //! @brief Replace the current content by formatted string @a fmt. inline bool setVFormat(const char* fmt, va_list ap) { return _opVFormat(kStringBuilderOpSet, fmt, ap); } //! @brief Replace the current content by formatted string @a fmt. ASMJIT_API bool setFormat(const char* fmt, ...); //! @brief Replace the current content by @a c of @a len. inline bool setChars(char c, size_t len) { return _opChars(kStringBuilderOpSet, c, len); } //! @brief Replace the current content by @a i.. inline bool setNumber(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) { return _opNumber(kStringBuilderOpSet, i, base, width, flags); } //! @brief Append @a str of @a len. inline bool appendString(const char* str, size_t len = kInvalidSize) { return _opString(kStringBuilderOpAppend, str, len); } //! @brief Append a formatted string @a fmt to the current content. inline bool appendVFormat(const char* fmt, va_list ap) { return _opVFormat(kStringBuilderOpAppend, fmt, ap); } //! @brief Append a formatted string @a fmt to the current content. ASMJIT_API bool appendFormat(const char* fmt, ...); //! @brief Append @a c of @a len. inline bool appendChars(char c, size_t len) { return _opChars(kStringBuilderOpAppend, c, len); } //! @brief Append @a i. inline bool appendNumber(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) { return _opNumber(kStringBuilderOpAppend, i, base, width, flags); } //! @brief Check for equality with other @a str. ASMJIT_API bool eq(const char* str, size_t len = kInvalidSize) const; //! @brief Check for equality with StringBuilder @a other. inline bool eq(const StringBuilder& other) const { return eq(other._data); } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- inline bool operator==(const StringBuilder& other) const { return eq(other); } inline bool operator!=(const StringBuilder& other) const { return !eq(other); } inline bool operator==(const char* str) const { return eq(str); } inline bool operator!=(const char* str) const { return !eq(str); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief String data. char* _data; //! @brief Length. size_t _length; //! @brief Capacity. size_t _capacity; //! @brief Whether the string can be freed. size_t _canFree; }; // ============================================================================ // [AsmJit::StringBuilderT] // ============================================================================ template struct StringBuilderT : public StringBuilder { ASMJIT_NO_COPY(StringBuilderT) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline StringBuilderT() : StringBuilder(_DontInitialize()) { _data = _embeddedData; _data[0] = 0; _length = 0; _capacity = 0; _canFree = false; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Embedded data. char _embeddedData[(N + sizeof(uintptr_t)) & ~(sizeof(uintptr_t) - 1)]; }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_STRINGBUILDER_H desmume-0.9.11/src/utils/AsmJit/core/assembler.cpp0000755000000000000000000001116612467662066020515 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/memorymanager.h" #include "../core/intutil.h" // [Dependenceis - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Assembler - Construction / Destruction] // ============================================================================ Assembler::Assembler(Context* context) : _zoneMemory(16384 - sizeof(ZoneChunk) - 32), _buffer(), _context(context != NULL ? context : static_cast(JitContext::getGlobal())), _logger(NULL), _error(kErrorOk), _properties(0), _emitOptions(0), _trampolineSize(0), _inlineComment(NULL), _unusedLinks(NULL) { } Assembler::~Assembler() { } // ============================================================================ // [AsmJit::Assembler - Logging] // ============================================================================ void Assembler::setLogger(Logger* logger) { _logger = logger; } // ============================================================================ // [AsmJit::Assembler - Error Handling] // ============================================================================ void Assembler::setError(uint32_t error) { _error = error; if (_error == kErrorOk) return; if (_logger) _logger->logFormat("*** ASSEMBLER ERROR: %s (%u).\n", getErrorString(error), (unsigned int)error); } // ============================================================================ // [AsmJit::Assembler - Properties] // ============================================================================ uint32_t Assembler::getProperty(uint32_t propertyId) const { if (propertyId > 31) return 0; return (_properties & (IntUtil::maskFromIndex(propertyId))) != 0; } void Assembler::setProperty(uint32_t propertyId, uint32_t value) { if (propertyId > 31) return; if (value) _properties |= IntUtil::maskFromIndex(propertyId); else _properties &= ~IntUtil::maskFromIndex(propertyId); } // ============================================================================ // [AsmJit::Assembler - TakeCode] // ============================================================================ uint8_t* Assembler::takeCode() { uint8_t* code = _buffer.take(); _relocData.clear(); _zoneMemory.clear(); if (_error != kErrorOk) setError(kErrorOk); return code; } // ============================================================================ // [AsmJit::Assembler - Clear / Reset] // ============================================================================ void Assembler::clear() { _purge(); if (_error != kErrorOk) setError(kErrorOk); } void Assembler::reset() { _purge(); _zoneMemory.reset(); _buffer.reset(); _labels.reset(); _relocData.reset(); if (_error != kErrorOk) setError(kErrorOk); } void Assembler::_purge() { _zoneMemory.clear(); _buffer.clear(); _emitOptions = 0; _trampolineSize = 0; _inlineComment = NULL; _unusedLinks = NULL; _labels.clear(); _relocData.clear(); } // ============================================================================ // [AsmJit::Assembler - Emit] // ============================================================================ void Assembler::embed(const void* data, size_t len) { if (!canEmit()) return; if (_logger) { size_t i, j; size_t max; char buf[128]; char dot[] = ".data "; char* p; memcpy(buf, dot, ASMJIT_ARRAY_SIZE(dot) - 1); for (i = 0; i < len; i += 16) { max = (len - i < 16) ? len - i : 16; p = buf + ASMJIT_ARRAY_SIZE(dot) - 1; for (j = 0; j < max; j++) p += sprintf(p, "%02X", reinterpret_cast(data)[i+j]); *p++ = '\n'; *p = '\0'; _logger->logString(buf); } } _buffer.emitData(data, len); } // ============================================================================ // [AsmJit::Assembler - Helpers] // ============================================================================ Assembler::LabelLink* Assembler::_newLabelLink() { LabelLink* link = _unusedLinks; if (link) { _unusedLinks = link->prev; } else { link = (LabelLink*)_zoneMemory.alloc(sizeof(LabelLink)); if (link == NULL) return NULL; } // clean link link->prev = NULL; link->offset = 0; link->displacement = 0; link->relocId = -1; return link; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.11/src/utils/AsmJit/core/defs.h0000755000000000000000000004654612467662066017140 0ustar rootroot// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_DEFS_H #define _ASMJIT_CORE_DEFS_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Global] // ============================================================================ enum { //! @brief Invalid operand identifier. kInvalidValue = 0xFFFFFFFFU, //! @brief Minimum reserved bytes in @ref Buffer. kBufferGrow = 32U }; static const size_t kInvalidSize = (size_t)-1; // ============================================================================ // [AsmJit::kStringBuilderOpType] // ============================================================================ //! @brief String builder operation. enum kStringBuilderOpType { //! @brief Replace the current content by a given content. kStringBuilderOpSet = 0, //! @brief Append a given content to the current content. kStringBuilderOpAppend = 1 }; // ============================================================================ // [AsmJit::kStringBuilderNumType] // ============================================================================ enum kStringBuilderNumFlags { kStringBuilderNumShowSign = (1U << 0), kStringBuilderNumShowSpace = (1U << 1), kStringBuilderNumAlternate = (1U << 2), kStringBuilderNumSigned = (1U << 31) }; // ============================================================================ // [AsmJit::kLoggerOption] // ============================================================================ enum kLoggerFlag { //! @brief Whether logger is enabled or disabled. //! //! Default @c true. kLoggerIsEnabled = 0x00000001, //! @brief Whether logger is enabled and can be used. //! //! This value can be set by inherited classes to inform @c Logger that //! assigned stream (or something that can log output) is invalid. If //! @c _used is false it means that there is no logging output and AsmJit //! shouldn't use this logger (because all messages will be lost). //! //! This is designed only to optimize cases that logger exists, but its //! configured not to output messages. The API inside Logging and AsmJit //! should only check this value when needed. The API outside AsmJit should //! check only whether logging is @c _enabled. //! //! Default @c true. kLoggerIsUsed = 0x00000002, //! @brief Whether to output instructions also in binary form. kLoggerOutputBinary = 0x00000010, //! @brief Whether to output immediates as hexadecimal numbers. kLoggerOutputHexImmediate = 0x00000020, //! @brief Whether to output displacements as hexadecimal numbers. kLoggerOutputHexDisplacement = 0x00000040 }; // ============================================================================ // [AsmJit::kCpu] // ============================================================================ //! @brief Cpu vendor IDs. //! //! Cpu vendor IDs are specific for AsmJit library. Vendor ID is not directly //! read from cpuid result, instead it's based on CPU vendor string. enum kCpu { //! @brief Unknown CPU vendor. kCpuUnknown = 0, //! @brief Intel CPU vendor. kCpuIntel = 1, //! @brief AMD CPU vendor. kCpuAmd = 2, //! @brief National Semiconductor CPU vendor (applies also to Cyrix processors). kCpuNSM = 3, //! @brief Transmeta CPU vendor. kCpuTransmeta = 4, //! @brief VIA CPU vendor. kCpuVia = 5 }; // ============================================================================ // [AsmJit::kMemAllocType] // ============================================================================ //! @brief Types of allocation used by @c AsmJit::MemoryManager::alloc() method. enum kMemAllocType { //! @brief Allocate memory that can be freed by @c AsmJit::MemoryManager::free() //! method. kMemAllocFreeable = 0, //! @brief Allocate permanent memory that will be never freed. kMemAllocPermanent = 1 }; // ============================================================================ // [AsmJit::kOperandType] // ============================================================================ //! @brief Operand types that can be encoded in @c Op operand. enum kOperandType { //! @brief Operand is none, used only internally (not initialized Operand). //! //! This operand is not valid. kOperandNone = 0x00, //! @brief Operand is label. kOperandLabel = 0x01, //! @brief Operand is register. kOperandReg = 0x02, //! @brief Operand is variable. kOperandVar = 0x04, //! @brief Operand is memory. kOperandMem = 0x08, //! @brief Operand is immediate. kOperandImm = 0x10 }; // ============================================================================ // [AsmJit::kOperandMemType] // ============================================================================ //! @brief Type of memory operand. enum kOperandMemType { //! @brief Operand is combination of register(s) and displacement (native). kOperandMemNative = 0, //! @brief Operand is label. kOperandMemLabel = 1, //! @brief Operand is absolute memory location (supported mainly in 32-bit mode) kOperandMemAbsolute = 2, }; // ============================================================================ // [AsmJit::kOperandId] // ============================================================================ //! @brief Operand ID masks used to determine the operand type. enum kOperandId { //! @brief Operand id type mask (part used for operand type). kOperandIdTypeMask = 0xC0000000, //! @brief Label operand mark id. kOperandIdTypeLabel = 0x40000000, //! @brief Variable operand mark id. kOperandIdTypeVar = 0x80000000, //! @brief Operand id value mask (part used for IDs). kOperandIdValueMask = 0x3FFFFFFF }; // ============================================================================ // [AsmJit::kRegType / kRegIndex] // ============================================================================ enum { //! @brief Mask for register type. kRegTypeMask = 0xFF00, //! @brief Mask for register code (index). kRegIndexMask = 0xFF, //! @brief Invalid register index. kRegIndexInvalid = 0xFF }; // ============================================================================ // [AsmJit::kCondHint] // ============================================================================ //! @brief Condition hint. enum kCondHint { //! @brief No hint. kCondHintNone = 0x00, //! @brief Condition is likely to be taken. kCondHintLikely = 0x01, //! @brief Condition is unlikely to be taken. kCondHintUnlikely = 0x02 }; // ============================================================================ // [AsmJit::kFuncAnonymous] // ============================================================================ enum { //! @brief Maximum allowed arguments per function declaration / call. kFuncArgsMax = 32, //! @brief Invalid stack offset in function or function parameter. kFuncStackInvalid = -1 }; // ============================================================================ // [AsmJit::kFuncConv] // ============================================================================ enum kFuncConv { //! @brief Calling convention is invalid (can't be used). kFuncConvNone = 0 }; // ============================================================================ // [AsmJit::kFuncHint] // ============================================================================ //! @brief Function hints. enum kFuncHint { //! @brief Make naked function (without using ebp/erp in prolog / epilog). kFuncHintNaked = 0 }; // ============================================================================ // [AsmJit::kFuncFlags] // ============================================================================ //! @brief Function flags. enum kFuncFlags { //! @brief Whether another function is called from this function. //! //! If another function is called from this function, it's needed to prepare //! stack for it. If this member is true then it's likely that true will be //! also @c _isEspAdjusted one. kFuncFlagIsCaller = (1U << 0), //! @brief Whether the function is finished using @c Compiler::endFunc(). kFuncFlagIsFinished = (1U << 1), //! @brief Whether the function is using naked (minimal) prolog / epilog. kFuncFlagIsNaked = (1U << 2) }; // ============================================================================ // [AsmJit::kFuncArgsDirection] // ============================================================================ //! @brief Function arguments direction. enum kFuncArgsDirection { //! @brief Arguments are passed left to right. //! //! This arguments direction is unusual to C programming, it's used by pascal //! compilers and in some calling conventions by Borland compiler). kFuncArgsLTR = 0, //! @brief Arguments are passed right ro left //! //! This is default argument direction in C programming. kFuncArgsRTL = 1 }; // ============================================================================ // [AsmJit::kInstCode] // ============================================================================ enum kInstCode { //! @brief No instruction. kInstNone = 0 }; // ============================================================================ // [AsmJit::kVarAllocFlags] // ============================================================================ //! @brief Variable alloc mode. enum kVarAllocFlags { //! @brief Allocating variable to read only. //! //! Read only variables are used to optimize variable spilling. If variable //! is some time ago deallocated and it's not marked as changed (so it was //! all the life time read only) then spill is simply NOP (no mov instruction //! is generated to move it to it's home memory location). kVarAllocRead = 0x01, //! @brief Allocating variable to write only (overwrite). //! //! Overwriting means that if variable is in memory, there is no generated //! instruction to move variable from memory to register, because that //! register will be overwritten by next instruction. This is used as a //! simple optimization to improve generated code by @c Compiler. kVarAllocWrite = 0x02, //! @brief Allocating variable to read / write. //! //! Variable allocated for read / write is marked as changed. This means that //! if variable must be later spilled into memory, mov (or similar) //! instruction will be generated. kVarAllocReadWrite = 0x03, //! @brief Variable can be allocated in register. kVarAllocRegister = 0x04, //! @brief Variable can be allocated only to a special register. kVarAllocSpecial = 0x08, //! @brief Variable can be allocated in memory. kVarAllocMem = 0x10, //! @brief Unuse the variable after use. kVarAllocUnuseAfterUse = 0x20 }; // ============================================================================ // [AsmJit::kVarHint] // ============================================================================ //! @brief Variable hint (used by @ref Compiler). //! //! @sa @ref Compiler. enum kVarHint { //! @brief Alloc variable. kVarHintAlloc = 0, //! @brief Spill variable. kVarHintSpill = 1, //! @brief Save variable if modified. kVarHintSave = 2, //! @brief Save variable if modified and mark it as unused. kVarHintSaveAndUnuse = 3, //! @brief Mark variable as unused. kVarHintUnuse = 4 }; // ============================================================================ // [AsmJit::kVarPolicy] // ============================================================================ //! @brief Variable allocation method. //! //! Variable allocation method is used by compiler and it means if compiler //! should first allocate preserved registers or not. Preserved registers are //! registers that must be saved / restored by generated function. //! //! This option is for people who are calling C/C++ functions from JIT code so //! Compiler can recude generating push/pop sequences before and after call, //! respectively. enum kVarPolicy { //! @brief Allocate preserved registers first. kVarPolicyPreservedFirst = 0, //! @brief Allocate preserved registers last (default). kVarPolicyPreservedLast = 1 }; // ============================================================================ // [AsmJit::kVarState] // ============================================================================ //! @brief State of variable. //! //! @note State of variable is used only during make process and it's not //! visible to the developer. enum kVarState { //! @brief Variable is currently not used. kVarStateUnused = 0, //! @brief Variable is in register. //! //! Variable is currently allocated in register. kVarStateReg = 1, //! @brief Variable is in memory location or spilled. //! //! Variable was spilled from register to memory or variable is used for //! memory only storage. kVarStateMem = 2 }; // ============================================================================ // [AsmJit::kVarType] // ============================================================================ enum kVarType { //! @brief Invalid variable type. kVarTypeInvalid = 0xFF }; // ============================================================================ // [AsmJit::kScale] // ============================================================================ //! @brief Scale which can be used for addressing (it the target instruction //! supports it). //! //! See @c Op and addressing methods like @c byte_ptr(), @c word_ptr(), //! @c dword_ptr(), etc... enum kScale { //! @brief No scale. kScaleNone = 0, //! @brief Scale 2 times (same as shifting to left by 1). kScale2Times = 1, //! @brief Scale 4 times (same as shifting to left by 2). kScale4Times = 2, //! @brief Scale 8 times (same as shifting to left by 3). kScale8Times = 3 }; // ============================================================================ // [AsmJit::kSize] // ============================================================================ //! @brief Size of registers and pointers. enum kSize { //! @brief 1 byte size. kSizeByte = 1, //! @brief 2 bytes size. kSizeWord = 2, //! @brief 4 bytes size. kSizeDWord = 4, //! @brief 8 bytes size. kSizeQWord = 8, //! @brief 10 bytes size. kSizeTWord = 10, //! @brief 16 bytes size. kSizeDQWord = 16 }; // ============================================================================ // [AsmJit::kRelocMode] // ============================================================================ enum kRelocMode { kRelocAbsToAbs = 0, kRelocRelToAbs = 1, kRelocAbsToRel = 2, kRelocTrampoline = 3 }; // ============================================================================ // [AsmJit::kCompilerItem] // ============================================================================ //! @brief Type of @ref CompilerItem. //! //! Each @c CompilerItem contains information about its type. Compiler can //! optimize instruction stream by analyzing items and each type is hint //! for it. The most used/serialized items are instructions //! (@c kCompilerItemInst). enum kCompilerItem { //! @brief Invalid item (can't be used). kCompilerItemNone = 0, //! @brief Item is mark, see @ref CompilerMark. kCompilerItemMark, //! @brief Item is comment, see @ref CompilerComment. kCompilerItemComment, //! @brief Item is embedded data, see @ref CompilerEmbed. kCompilerItemEmbed, //! @brief Item is .align directive, see @ref CompilerAlign. kCompilerItemAlign, //! @brief Item is variable hint (alloc, spill, use, unuse), see @ref CompilerHint. kCompilerItemHint, //! @brief Item is instruction, see @ref CompilerInst. kCompilerItemInst, //! @brief Item is target, see @ref CompilerTarget. kCompilerItemTarget, //! @brief Item is function call, see @ref CompilerFuncCall. kCompilerItemFuncCall, //! @brief Item is function declaration, see @ref CompilerFuncDecl. kCompilerItemFuncDecl, //! @brief Item is an end of the function, see @ref CompilerFuncEnd. kCompilerItemFuncEnd, //! @brief Item is function return, see @ref CompilerFuncRet. kCompilerItemFuncRet }; // ============================================================================ // [AsmJit::kError] // ============================================================================ //! @brief Error codes. enum kError { //! @brief No error (success). //! //! This is default state and state you want. kErrorOk = 0, //! @brief Memory allocation error (@c ASMJIT_MALLOC returned @c NULL). kErrorNoHeapMemory = 1, //! @brief Virtual memory allocation error (@c VirtualMemory returned @c NULL). kErrorNoVirtualMemory = 2, //! @brief Unknown instruction. This happens only if instruction code is //! out of bounds. Shouldn't happen. kErrorUnknownInstruction = 3, //! @brief Illegal instruction, usually generated by AsmJit::Assembler //! class when emitting instruction opcode. If this error is generated the //! target buffer is not affected by this invalid instruction. //! //! You can also get this error code if you are under x64 (64-bit x86) and //! you tried to decode instruction using AH, BH, CH or DH register with REX //! prefix. These registers can't be accessed if REX prefix is used and AsmJit //! didn't check for this situation in intrinsics (@c Compiler takes care of //! this and rearrange registers if needed). //! //! Examples that will raise @c kErrorIllegalInstruction error (a is //! @c Assembler instance): //! //! @code //! a.mov(dword_ptr(eax), al); // Invalid address size. //! a.mov(byte_ptr(r10), ah); // Undecodable instruction (AH used with r10 //! // which can be encoded only using REX prefix) //! @endcode //! //! @note In debug mode you get assertion failure instead of setting error //! code. kErrorIllegalInstruction = 4, //! @brief Illegal addressing used (unencodable). kErrorIllegalAddressing = 5, //! @brief Short jump instruction used, but displacement is out of bounds. kErrorIllegalShortJump = 6, //! @brief No function defined. kErrorNoFunction = 7, //! @brief Function generation is not finished by using @c Compiler::endFunc() //! or something bad happened during generation related to function. This can //! be missing compiler item, etc... kErrorIncompleteFunction = 8, //! @brief Compiler can't allocate registers, because all of them are used. //! //! @note AsmJit is able to spill registers so this error really shouldn't //! happen unless all registers have priority 0 (which means never spill). kErrorNoRegisters = 9, //! @brief Compiler can't allocate one register to multiple destinations. //! //! This error can only happen using special instructions like cmpxchg8b and //! others where there are more destination operands (implicit). kErrorOverlappedRegisters = 10, //! @brief Tried to call function using incompatible argument. kErrorIncompatibleArgumentType = 11, //! @brief Incompatible return value. kErrorIncompatibleReturnType = 12, //! @brief Count of error codes by AsmJit. Can grow in future. kErrorCount }; // ============================================================================ // [AsmJit::API] // ============================================================================ //! @brief Translates error code (see @c kError) into text representation. ASMJIT_API const char* getErrorString(uint32_t error); //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_DEFS_H desmume-0.9.11/src/utils/emufat_types.h0000755000000000000000000000014112467662066016562 0ustar rootroot#ifndef EMUFAT_TYPES_H #define EMUFAT_TYPES_H #include "types.h" #endif //EMUFAT_TYPES_H desmume-0.9.11/src/utils/fsnitro.h0000755000000000000000000000657612467662066015563 0ustar rootroot/* Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _FS_NITRO_H_ #define _FS_NITRO_H_ #include #ifndef _MSC_VER #include #include #endif #include "../types.h" using namespace std; enum FNT_TYPES { FS_FILE_ENTRY = 0, FS_SUBDIR_ENTRY = 1, FS_END_SUBTABLE = 2, FS_RESERVED = 3, }; #include "PACKED.h" struct FAT_NITRO { FAT_NITRO() : start(0) , end(0) , size(0) , parentOffset(0) , isOverlay(false) , file(false) , sizeFile(0) , parentID(0) { } u32 start; u32 end; u32 size; u32 parentOffset; bool isOverlay; bool file; u32 sizeFile; u16 parentID; string filename; }; struct FNT_MAIN { u32 offset; u16 firstID; u16 parentID; }; struct FNT_NITRO { FNT_NITRO() : offset(0) , firstID(0) , parentID(0) { } u32 offset; u16 firstID; u16 parentID; string filename; }; struct OVR_NITRO { u32 id; u32 RAMaddr; u32 RAMSize; u32 BSSSize; u32 start; u32 end; u32 fileID; u32 reserved; }; #include "PACKED_END.h" class FS_NITRO { private: bool inited; u32 FNameTblOff; u32 FNameTblSize; u32 FATOff; u32 FATSize; u32 FATEnd; u32 ARM9OverlayOff; u32 ARM9OverlaySize; u32 ARM7OverlayOff; u32 ARM7OverlaySize; u32 ARM9exeStart; u32 ARM9exeEnd; u32 ARM9exeSize; u32 ARM7exeStart; u32 ARM7exeEnd; u32 ARM7exeSize; u32 numFiles; u32 numDirs; u32 numOverlay7; u32 numOverlay9; u32 currentID; u8 *rom; FAT_NITRO *fat; FNT_NITRO *fnt; OVR_NITRO *ovr9; OVR_NITRO *ovr7; FNT_TYPES getFNTType(u8 type); bool loadFileTables(); bool extract(u16 id, string to); void destroy(); public: FS_NITRO(u8 *cart_rom); ~FS_NITRO(); bool getFileIdByAddr(u32 addr, u16 &id); bool getFileIdByAddr(u32 addr, u16 &id, u32 &offset); string getDirNameByID(u16 id); u16 getDirParrentByID(u16 id); string getFileNameByID(u16 id); string getFullPathByFileID(u16 id, bool addRoot = true); u16 getFileParentById(u16 id); u32 getFileSizeById(u16 id); u32 getStartAddrById(u16 id); u32 getEndAddrById(u16 id); bool isOverlay(u16 id) { if (id > numFiles) return false; return fat[id].isOverlay; } bool isARM9(u32 addr) { return ((addr >= ARM9exeStart) && (addr < ARM9exeEnd)); } bool isARM7(u32 addr) { return ((addr >= ARM7exeStart) && (addr < ARM7exeEnd)); } bool isFAT(u32 addr) { return ((addr >= FATOff) && (addr < FATEnd)); } bool rebuildFAT(u32 addr, u32 size, string pathData); bool rebuildFAT(string pathData); u32 getFATRecord(u32 addr); bool extractFile(u16 id, string to); bool extractAll(string to, void (*callback)(u32 current, u32 num) = NULL); u32 getNumDirs() { return numDirs; } u32 getNumFiles() { return numFiles; } }; #endif desmume-0.9.11/src/utils/xstring.cpp0000755000000000000000000004616312467662066016124 0ustar rootroot//taken from fceux on 10/27/08 //subsequently modified for desmume /* Copyright (C) 2008-2009 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "xstring.h" #include //a vc-style substring operation (very kind and lenient) std::string strsub(const std::string& str, int pos, int len) { int strlen = str.size(); if(strlen==0) return str; //empty strings always return empty strings if(pos>=strlen) return str; //if you start past the end of the string, return the entire string. this is unusual, but there you have it //clipping if(pos<0) { len += pos; pos = 0; } if (pos+len>=strlen) len=strlen-pos+1; //return str.str().substr(pos,len); return str.substr(pos,len); } std::string strmid(const std::string& str, int pos, int len) { return strsub(str,pos,len); } std::string strleft(const std::string& str, int len) { return strsub(str,0,len); } std::string strright(const std::string& str, int len) { return len ? strsub(str,str.size()-len,len) : ""; } std::string toupper(const std::string& str) { std::string ret = str; for(u32 i=0;i= 'a') && (str[i] <= 'z')) { str[i] &= ~0x20; j++; } i++; } return j; } ///Lower case routine. Returns number of characters modified int str_lcase(char *str) { u32 i=0,j=0; while (i < strlen(str)) { if ((str[i] >= 'A') && (str[i] <= 'Z')) { str[i] |= 0x20; j++; } i++; } return j; } ///White space-trimming routine ///Removes whitespace from left side of string, depending on the flags set (See STRIP_x definitions in xstring.h) ///Returns number of characters removed int str_ltrim(char *str, int flags) { u32 i=0; while (str[0]) { if ((str[0] != ' ') || (str[0] != '\t') || (str[0] != '\r') || (str[0] != '\n')) break; if ((flags & STRIP_SP) && (str[0] == ' ')) { i++; strcpy(str,str+1); } if ((flags & STRIP_TAB) && (str[0] == '\t')) { i++; strcpy(str,str+1); } if ((flags & STRIP_CR) && (str[0] == '\r')) { i++; strcpy(str,str+1); } if ((flags & STRIP_LF) && (str[0] == '\n')) { i++; strcpy(str,str+1); } } return i; } ///White space-trimming routine ///Removes whitespace from right side of string, depending on the flags set (See STRIP_x definitions in xstring.h) ///Returns number of characters removed int str_rtrim(char *str, int flags) { u32 i=0; while (strlen(str)) { if ((str[strlen(str)-1] != ' ') || (str[strlen(str)-1] != '\t') || (str[strlen(str)-1] != '\r') || (str[strlen(str)-1] != '\n')) break; if ((flags & STRIP_SP) && (str[0] == ' ')) { i++; str[strlen(str)-1] = 0; } if ((flags & STRIP_TAB) && (str[0] == '\t')) { i++; str[strlen(str)-1] = 0; } if ((flags & STRIP_CR) && (str[0] == '\r')) { i++; str[strlen(str)-1] = 0; } if ((flags & STRIP_LF) && (str[0] == '\n')) { i++; str[strlen(str)-1] = 0; } } return i; } ///White space-stripping routine ///Removes whitespace depending on the flags set (See STRIP_x definitions in xstring.h) ///Returns number of characters removed, or -1 on error int str_strip(char *str, int flags) { u32 i=0,j=0; char *astr,chr; if (!strlen(str)) return -1; if (!(flags & (STRIP_SP|STRIP_TAB|STRIP_CR|STRIP_LF))) return -1; if (!(astr = (char*)malloc(strlen(str)+1))) return -1; while (i < strlen(str)) { chr = str[i++]; if ((flags & STRIP_SP) && (chr == ' ')) chr = 0; if ((flags & STRIP_TAB) && (chr == '\t')) chr = 0; if ((flags & STRIP_CR) && (chr == '\r')) chr = 0; if ((flags & STRIP_LF) && (chr == '\n')) chr = 0; if (chr) astr[j++] = chr; } astr[j] = 0; strcpy(str,astr); free(astr); return j; } ///Character replacement routine ///Replaces all instances of 'search' with 'replace' ///Returns number of characters modified int chr_replace(char *str, char search, char replace) { u32 i=0,j=0; while (i < strlen(str)) { if (str[i] == search) { str[i] = replace; j++; } i++; } return j; } ///Sub-String replacement routine ///Replaces all instances of 'search' with 'replace' ///Returns number of sub-strings modified, or -1 on error int str_replace(char *str, char *search, char *replace) { u32 i=0,j=0; int searchlen,replacelen; char *astr; searchlen = strlen(search); replacelen = strlen(replace); if ((!strlen(str)) || (!searchlen)) return -1; //note: allow *replace to have a length of zero! if (!(astr = (char*)malloc(strlen(str)+1))) return -1; while (i < strlen(str)) { if (!strncmp(str+i,search,searchlen)) { if (replacelen) memcpy(astr+j,replace,replacelen); i += searchlen; j += replacelen; } else astr[j++] = str[i++]; } astr[j] = 0; strcpy(str,astr); free(astr); return j; } static const struct Base64Table { Base64Table() { size_t a=0; for(a=0; a<256; ++a) data[a] = 0xFF; // mark everything as invalid by default // create value->ascii mapping a=0; for(unsigned char c='A'; c<='Z'; ++c) data[a++] = c; // 0..25 for(unsigned char c='a'; c<='z'; ++c) data[a++] = c; // 26..51 for(unsigned char c='0'; c<='9'; ++c) data[a++] = c; // 52..61 data[62] = '+'; // 62 data[63] = '/'; // 63 // create ascii->value mapping (but due to overlap, write it to highbit region) for(a=0; a<64; ++a) data[data[a]^0x80] = a; // data[((unsigned char)'=') ^ 0x80] = 0; } unsigned char operator[] (size_t pos) const { return data[pos]; } private: unsigned char data[256]; } Base64Table; std::string u32ToHexString(u32 val) { char temp[16]; sprintf(temp,"%08X",val); return temp; } ///Converts the provided data to a string in a standard, user-friendly, round-trippable format std::string BytesToString(const void* data, int len) { char temp[16]; if(len==1) { sprintf(temp,"%d",*(const unsigned char*)data); return temp; } else if(len==2) { sprintf(temp,"%d",*(const unsigned short*)data); return temp; } else if(len==4) { sprintf(temp,"%d",*(const unsigned int*)data); return temp; } std::string ret; if(1) // use base64 { const unsigned char* src = (const unsigned char*)data; ret = "base64:"; for(int n; len > 0; len -= n) { unsigned char input[3] = {0,0,0}; for(n=0; n<3 && n> 2 ], Base64Table[ ((input[0] & 0x03) << 4) | (input[1] >> 4) ], n<2 ? '=' : Base64Table[ ((input[1] & 0x0F) << 2) | (input[2] >> 6) ], n<3 ? '=' : Base64Table[ input[2] & 0x3F ] }; ret.append(output, output+4); } } else // use hex { ret.resize(len*2+2); ret[0] = '0'; ret[1] = 'x'; for(int i=0;i>4); int b = (((const unsigned char*)data)[i])&15; if(a>9) a += 'A'-10; else a += '0'; if(b>9) b += 'A'-10; else b += '0'; ret[2+i*2] = a; ret[2+i*2+1] = b; } } return ret; } ///returns -1 if this is not a hex string int HexStringToBytesLength(const std::string& str) { if(str.size()>2 && str[0] == '0' && toupper(str[1]) == 'X') return str.size()/2-1; else return -1; } int Base64StringToBytesLength(const std::string& str) { if(str.size() < 7 || (str.size()-7) % 4 || str.substr(0,7) != "base64:") return -1; size_t c = ((str.size() - 7) / 4) * 3; if(str[str.size()-1] == '=') { --c; if(str[str.size()-2] == '=') --c; } return c; } ///parses a string in the same format as BytesToString ///returns true if success. bool StringToBytes(const std::string& str, void* data, int len) { if(str.substr(0,7) == "base64:") { // base64 unsigned char* tgt = (unsigned char*)data; for(size_t pos = 7; pos < str.size() && len > 0; ) { unsigned char input[4], converted[4]; for(int i=0; i<4; ++i) { if(pos >= str.size() && i > 0) return false; // invalid data input[i] = str[pos++]; if(input[i] & 0x80) return false; // illegal character converted[i] = Base64Table[input[i]^0x80]; if(converted[i] & 0x80) return false; // illegal character } unsigned char outpacket[3] = { (converted[0] << 2) | (converted[1] >> 4), (converted[1] << 4) | (converted[2] >> 2), (converted[2] << 6) | (converted[3]) }; int outlen = (input[2] == '=') ? 1 : (input[3] == '=' ? 2 : 3); if(outlen > len) outlen = len; memcpy(tgt, outpacket, outlen); tgt += outlen; len -= outlen; } return true; } if(str.size()>2 && str[0] == '0' && toupper(str[1]) == 'X') { // hex int amt = len; int bytesAvailable = str.size()/2; if(bytesAvailable < amt) amt = bytesAvailable; const char* cstr = str.c_str()+2; for(int i=0;i='A') a=a-'A'+10; else a-='0'; if(b>='A') b=b-'A'+10; else b-='0'; unsigned char val = ((unsigned char)a<<4)|(unsigned char)b; ((unsigned char*)data)[i] = val; } return true; } if(len==1) { int x = atoi(str.c_str()); *(unsigned char*)data = x; return true; } else if(len==2) { int x = atoi(str.c_str()); *(unsigned short*)data = x; return true; } else if(len==4) { int x = atoi(str.c_str()); *(unsigned int*)data = x; return true; } //we can't handle it return false; } #include #include /// \brief convert input string into vector of string tokens /// /// \note consecutive delimiters will be treated as single delimiter /// \note delimiters are _not_ included in return data /// /// \param input string to be parsed /// \param delims list of delimiters. std::vector tokenize_str(const std::string & str, const std::string & delims=", \t") { using namespace std; // Skip delims at beginning, find start of first token string::size_type lastPos = str.find_first_not_of(delims, 0); // Find next delimiter @ end of token string::size_type pos = str.find_first_of(delims, lastPos); // output vector vector tokens; while (string::npos != pos || string::npos != lastPos) { // Found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // Skip delims. Note the "not_of". this is beginning of token lastPos = str.find_first_not_of(delims, pos); // Find next delimiter at end of token. pos = str.find_first_of(delims, lastPos); } return tokens; } //this code was taken from WINE (LGPL) //http://google.com/codesearch?hl=en&q=+lang:c+splitpath+show:CPvw9Z-euls:_RSotQzmLeU:KGzljMEYFbY&sa=N&cd=9&ct=rc&cs_p=http://gentoo.osuosl.org/distfiles/Wine-20050524.tar.gz&cs_f=wine-20050524/programs/winefile/splitpath.c void splitpath(const char* path, char* drv, char* dir, char* name, char* ext) { const char* end; /* end of processed string */ const char* p; /* search pointer */ const char* s; /* copy pointer */ /* extract drive name */ if (path[0] && path[1]==':') { if (drv) { *drv++ = *path++; *drv++ = *path++; *drv = '\0'; } else path+=2; } else if (drv) *drv = '\0'; /* search for end of string or stream separator */ for(end=path; *end && *end!=':'; ) end++; /* search for begin of file extension */ for(p=end; p>path && *--p!='\\' && *p!='/'; ) if (*p == '.') { end = p; break; } if (ext) for(s=end; (*ext=*s++); ) ext++; else for(s=end; *s++; ) {} /* search for end of directory name */ for(p=end; p>path; ) if (*--p=='\\' || *p=='/') { p++; break; } if (name) { for(s=p; s= '0' && s[i] <= '9') { v+=s[i]-'0'; } else if(s[i] >= 'a' && s[i] <= 'f') { v+=s[i]-'a'+10; } else if(s[i] >= 'A' && s[i] <= 'F') { v+=s[i]-'A'+10; } else { valid = false; return 0xFFFF; } } valid = true; return v; } char *U8ToDecStr(uint8 a) { TempArray[0] = '0' + a/100; TempArray[1] = '0' + (a%100)/10; TempArray[2] = '0' + (a%10); TempArray[3] = 0; return TempArray; } char *U16ToDecStr(uint16 a) { TempArray[0] = '0' + a/10000; TempArray[1] = '0' + (a%10000)/1000; TempArray[2] = '0' + (a%1000)/100; TempArray[3] = '0' + (a%100)/10; TempArray[4] = '0' + (a%10); TempArray[5] = 0; return TempArray; } char *U32ToDecStr(char* buf, uint32 a) { buf[0] = '0' + a/1000000000; buf[1] = '0' + (a%1000000000)/100000000; buf[2] = '0' + (a%100000000)/10000000; buf[3] = '0' + (a%10000000)/1000000; buf[4] = '0' + (a%1000000)/100000; buf[5] = '0' + (a%100000)/10000; buf[6] = '0' + (a%10000)/1000; buf[7] = '0' + (a%1000)/100; buf[8] = '0' + (a%100)/10; buf[9] = '0' + (a%10); buf[10] = 0; return buf; } char *U32ToDecStr(uint32 a) { return U32ToDecStr(TempArray,a); } char *U16ToHexStr(uint16 a) { TempArray[0] = a/4096 > 9?'A'+a/4096-10:'0' + a/4096; TempArray[1] = (a%4096)/256 > 9?'A'+(a%4096)/256 - 10:'0' + (a%4096)/256; TempArray[2] = (a%256)/16 > 9?'A'+(a%256)/16 - 10:'0' + (a%256)/16; TempArray[3] = a%16 > 9?'A'+(a%16) - 10:'0' + (a%16); TempArray[4] = 0; return TempArray; } char *U8ToHexStr(uint8 a) { TempArray[0] = a/16 > 9?'A'+a/16 - 10:'0' + a/16; TempArray[1] = a%16 > 9?'A'+(a%16) - 10:'0' + (a%16); TempArray[2] = 0; return TempArray; } std::string stditoa(int n) { char tempbuf[16]; sprintf(tempbuf, "%d", n); return tempbuf; } std::string readNullTerminatedAscii(std::istream* is) { std::string ret; ret.reserve(50); for(;;) { int c = is->get(); if(c == 0) break; else ret += (char)c; } return ret; } // replace all instances of victim with replacement std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement) { std::string answer = source; std::string::size_type j = 0; while ((j = answer.find(victim, j)) != std::string::npos ) { answer.replace(j, victim.length(), replacement); j+= replacement.length(); } return answer; } //http://www.codeproject.com/KB/string/UtfConverter.aspx #include "ConvertUTF.h" namespace UtfConverter { static std::wstring FromUtf8(const std::string& utf8string) { size_t widesize = utf8string.length(); if (sizeof(wchar_t) == 2) { wchar_t* widestringnative = new wchar_t[widesize+1]; const UTF8* sourcestart = reinterpret_cast(utf8string.c_str()); const UTF8* sourceend = sourcestart + widesize; UTF16* targetstart = reinterpret_cast(widestringnative); UTF16* targetend = targetstart + widesize+1; ConversionResult res = ConvertUTF8toUTF16(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] widestringnative; throw std::exception(); } *targetstart = 0; std::wstring resultstring(widestringnative); delete [] widestringnative; return resultstring; } else if (sizeof(wchar_t) == 4) { wchar_t* widestringnative = new wchar_t[widesize+1]; const UTF8* sourcestart = reinterpret_cast(utf8string.c_str()); const UTF8* sourceend = sourcestart + widesize; UTF32* targetstart = reinterpret_cast(widestringnative); UTF32* targetend = targetstart + widesize+1; ConversionResult res = ConvertUTF8toUTF32(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] widestringnative; throw std::exception(); } *targetstart = 0; std::wstring resultstring(widestringnative); delete [] widestringnative; return resultstring; } else { throw std::exception(); } return L""; } static std::string ToUtf8(const std::wstring& widestring) { size_t widesize = widestring.length(); if (sizeof(wchar_t) == 2) { size_t utf8size = 3 * widesize + 1; char* utf8stringnative = new char[utf8size]; const UTF16* sourcestart = reinterpret_cast(widestring.c_str()); const UTF16* sourceend = sourcestart + widesize; UTF8* targetstart = reinterpret_cast(utf8stringnative); UTF8* targetend = targetstart + utf8size; ConversionResult res = ConvertUTF16toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] utf8stringnative; throw std::exception(); } *targetstart = 0; std::string resultstring(utf8stringnative); delete [] utf8stringnative; return resultstring; } else if (sizeof(wchar_t) == 4) { size_t utf8size = 4 * widesize + 1; char* utf8stringnative = new char[utf8size]; const UTF32* sourcestart = reinterpret_cast(widestring.c_str()); const UTF32* sourceend = sourcestart + widesize; UTF8* targetstart = reinterpret_cast(utf8stringnative); UTF8* targetend = targetstart + utf8size; ConversionResult res = ConvertUTF32toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] utf8stringnative; throw std::exception(); } *targetstart = 0; std::string resultstring(utf8stringnative); delete [] utf8stringnative; return resultstring; } else { throw std::exception(); } return ""; } } //convert a std::string to std::wstring std::wstring mbstowcs(std::string str) { try { return UtfConverter::FromUtf8(str); } catch(std::exception) { return L"(failed UTF-8 conversion)"; } } std::string wcstombs(std::wstring str) { return UtfConverter::ToUtf8(str); } //TODO - dont we already have another function that can do this std::string getExtension(const char* input) { char buf[1024]; strcpy(buf,input); char* dot=strrchr(buf,'.'); if(!dot) return ""; char ext [512]; strcpy(ext, dot+1); int k, extlen=strlen(ext); for(k=0;k. */ #include "types.h" #include #include #ifdef HOST_WINDOWS #include #include #define __mkdir(x) mkdir(x) #else #include #include #include #include #define __mkdir(x) mkdir(x, 0777) #endif #include "fsnitro.h" using namespace std; #ifdef HOST_WINDOWS #define FS_DIRECTORY_DELIMITER_CHAR "\\" #else #define FS_DIRECTORY_DELIMITER_CHAR "/" #endif FS_NITRO::FS_NITRO(u8 *cart_rom) { inited = false; numDirs = numFiles = numOverlay7 = numOverlay9 = currentID =0; fat = NULL; fnt = NULL; ovr9 = NULL; ovr7 = NULL; if (!cart_rom) return; rom = cart_rom; FNameTblOff = *(u32*)(rom + 0x40); FNameTblSize = *(u32*)(rom + 0x44); FATOff = *(u32*)(rom + 0x48); FATSize = *(u32*)(rom + 0x4C); ARM9OverlayOff = *(u32*)(rom + 0x50); ARM9OverlaySize = *(u32*)(rom + 0x54); ARM7OverlayOff = *(u32*)(rom + 0x58); ARM7OverlaySize = *(u32*)(rom + 0x5C); ARM9exeSize = *(u32*)(rom + 0x2C); ARM9exeStart = *(u32*)(rom + 0x20); ARM9exeEnd = (ARM9exeStart + ARM9exeSize); ARM7exeSize = *(u32*)(rom + 0x3C); ARM7exeStart = *(u32*)(rom + 0x30); ARM7exeEnd = (ARM7exeStart + ARM7exeSize); //printf("ARM9exe %08Xh - %08Xh, size %08Xh\n", ARM9exeStart, ARM9exeEnd, ARM9exeSize); //printf("ARM7exe %08Xh - %08Xh, size %08Xh\n", ARM7exeStart, ARM7exeEnd, ARM7exeSize); if (FNameTblOff < 0x8000) return; if (FNameTblOff == 0) return; if (FATOff < 0x8000) return; if (FATSize == 0) return; numDirs = *(u16*)(rom + FNameTblOff + 6); numFiles = FATSize / 8; if (numFiles == 0 || numDirs == 0) { numFiles = numDirs = 0; return; } FATEnd = (FATOff + FATSize); numOverlay9 = ARM9OverlaySize / sizeof(OVR_NITRO); numOverlay7 = ARM7OverlaySize / sizeof(OVR_NITRO); printf("Nitro File System:\n"); printf("\t* FNT at 0x%08X, size 0x%08X\n", FNameTblOff, FNameTblSize); printf("\t* FAT at 0x%08X, size 0x%08X\n", FATOff, FATSize); printf("\t* ARM9 at Overlay 0x%08X, size 0x%08X\n", ARM9OverlayOff, ARM9OverlaySize); printf("\t* ARM7 at Overlay 0x%08X, size 0x%08X\n", ARM7OverlayOff, ARM7OverlaySize); printf("\t* ARM9 exe at %08X, size %08Xh\n", ARM9exeStart, ARM9exeSize); printf("\t* ARM7 exe at %08X, size %08Xh\n", ARM7exeStart, ARM7exeSize); printf("\t* Directories: %u\n", numDirs); printf("\t* Files %u\n", numFiles); printf("\t* ARM9 Overlays %u\n", numOverlay9); printf("\t* ARM7 Overlays %u\n", numOverlay7); fat = new FAT_NITRO[numFiles]; fnt = new FNT_NITRO[numDirs]; if (numOverlay7) ovr7 = new OVR_NITRO[numOverlay7]; if (numOverlay9) ovr9 = new OVR_NITRO[numOverlay9]; if (!loadFileTables()) { destroy(); printf("FSNITRO: Error loading file system tables\n"); return; } inited = true; } FS_NITRO::~FS_NITRO() { destroy(); } void FS_NITRO::destroy() { if (fat) { delete [] fat; fat = NULL; } if (fnt) { delete [] fnt; fnt = NULL; } if (ovr9) { delete [] ovr9; ovr9 = NULL; } if (ovr7) { delete [] ovr7; ovr7 = NULL; } numDirs = numFiles = numOverlay7 = numOverlay9 = currentID = 0; inited = false; } FNT_TYPES FS_NITRO::getFNTType(u8 type) { if (type == 0x00) return FS_END_SUBTABLE; if (type == 0x80) return FS_RESERVED; if (type < 0x80) return FS_FILE_ENTRY; return FS_SUBDIR_ENTRY; } bool FS_NITRO::loadFileTables() { if (!fnt) return false; if (!fat) return false; if (numOverlay7 && !ovr7) return false; if (numOverlay9 && !ovr9) return false; delete[] fat; delete[] fnt; fat = new FAT_NITRO[numFiles]; fnt = new FNT_NITRO[numDirs]; // ========= FAT (File Allocation Table) u32 *_FAT = (u32*)(rom + FATOff); for (u32 i = 0; i < numFiles; i++) { const u32 ofs = (i * 2); fat[i].start = *(_FAT + ofs); fat[i].end = *(_FAT + ofs + 1); fat[i].size = fat[i].end - fat[i].start; fat[i].sizeFile = fat[i].size; fat[i].isOverlay = false; } // ========= Overlays ARM9 if (numOverlay9) { memcpy(ovr9, (rom + ARM9OverlayOff), ARM9OverlaySize); for (u32 i = 0 ; i < numOverlay9; i++) { char buf[129] = {0}; memset(&buf[0], 0, sizeof(buf)); fat[ovr9[i].fileID].isOverlay = true; sprintf(buf, "overlay_%04u.bin", ovr9[i].id); fat[ovr9[i].fileID].filename = buf; } } // ========= Overlays ARM7 if (numOverlay7) { memcpy(ovr7, (rom + ARM7OverlayOff), ARM7OverlaySize); for (u32 i = 0 ; i < numOverlay7; i++) { char buf[129] = {0}; memset(&buf[0], 0, sizeof(buf)); fat[ovr7[i].fileID].isOverlay = true; sprintf(buf, "overlay_%04u.bin", ovr7[i].id); fat[ovr7[i].fileID].filename = buf; } } // ========= FNT (File Names Table) u8 *_FNT = (u8*)(rom + FNameTblOff); for (u32 i = 0; i < numDirs; i++) { memcpy(&fnt[i], _FNT, 8); //printf("FNT %04Xh: sub:%08Xh, 1st ID:%04xh, parentID:%04Xh\n", i, fnt[i].offset, fnt[i].firstID, fnt[i].parentID); _FNT += 8; } // ========= Read file structure u8 *sub = (u8*)(rom + FNameTblOff + fnt[0].offset); u8 *_end = (u8*)(rom + FNameTblOff + FNameTblSize - 1); u16 fileCount = fnt[0].firstID; u16 fntID = 0xF000; uintptr_t *store = new uintptr_t[numDirs]; if (!store) return false; memset(store, 0, sizeof(uintptr_t) * numDirs); fnt[0].filename = FS_DIRECTORY_DELIMITER_CHAR; fnt[0].parentID = 0xF000; //printf("FNT F000: Sub:%08Xh, 1st ID:%04xh, parentID:%04Xh <%s>\n", fnt[0].offset, fnt[0].firstID, fnt[0].parentID, fnt[0].filename); while (true) { u8 len = (sub[0] & 0x7F); FNT_TYPES type = getFNTType(sub[0]); if (type == FS_END_SUBTABLE) { //printf("********** End Subdir (%04Xh, parent %04X)\n", fntID, fnt[fntID & 0x0FFF].parentID); sub = (u8*)store[fntID & 0x0FFF]; fntID = fnt[fntID & 0x0FFF].parentID; continue; } if (type == FS_SUBDIR_ENTRY) { //printf("********** Subdir Entry\n"); char buf[129] = {0}; memcpy(buf, (sub + 1), len); buf[len] = 0; sub += (len + 1); fntID = (*(u16*)sub); sub += 2; u32 id = (fntID & 0x0FFF); store[id] = (uintptr_t)sub; sub = (u8*)(rom + FNameTblOff + fnt[id].offset); fnt[id].filename = buf; //printf("FNT %04X: Sub:%08Xh, 1st ID:%04xh, parentID:%04Xh <%s>\n", fntID, fnt[id].offset, fnt[id].firstID, fnt[id].parentID, buf); continue; } if (type == FS_FILE_ENTRY) { //printf("********** File Entry\n"); char buf[129] = {0}; memcpy(buf, (sub + 1), len); buf[len] = 0; fat[fileCount].filename = buf; fat[fileCount].parentID = fntID; //printf("ID:%04Xh, len %03d, type %d, parentID %04X, filename: %s\n", fileCount, len, (u32)type, fntID, fat[fileCount].filename); sub += (len + 1); fileCount++; if (fileCount >= numFiles) break; continue; } if (type == FS_RESERVED) { printf("********** FS_RESERVED\n"); break; } } delete [] store; store = NULL; return true; } // ======================= tools bool FS_NITRO::rebuildFAT(u32 addr, u32 size, string pathData) { if (!inited) return false; if (size == 0) return false; if (addr < FATOff) return false; if (addr > FATEnd) return false; const u32 startID = (addr - FATOff) / 8; const u32 endID = startID + (size / 8); //printf("Start rebuild FAT (start ID:%04Xh)\n", startID); u8 *romFAT = (u8*)(rom + addr); for (u32 i = startID; i < endID; i++) { if (i >= numFiles) break; string path = pathData + getFullPathByFileID(i); //printf("%04Xh - %s (%d)\n", i, path.c_str(), fat[i].size); fat[i].file = false; FILE *fp = fopen(path.c_str(), "rb"); if (!fp) continue; fseek(fp, 0, SEEK_END); u32 size = ftell(fp); fclose(fp); fat[i].file = true; if (fat[i].size != size) { //printf("Different size: %s (ROM: %d, file %d)\n", path.c_str(), fat[i].size, size); fat[i].sizeFile = size; } else fat[i].sizeFile = fat[i].size; } return true; } bool FS_NITRO::rebuildFAT(string pathData) { return rebuildFAT(FATOff, FATSize, pathData); } u32 FS_NITRO::getFATRecord(u32 addr) { if (!inited) return 0xFFFFFFFF; if (addr < FATOff) return 0xFFFFFFFF; if (addr > FATEnd) return 0xFFFFFFFF; u32 id = (addr - FATOff) / 8; u32 offs = (addr - FATOff) % 8; if (offs == 0) { return fat[id].start; } else { if (fat[id].file) return (fat[id].start + fat[id].sizeFile); else return fat[id].end; } return 0xFFFFFFFF; } bool FS_NITRO::getFileIdByAddr(u32 addr, u16 &id) { id = 0xFFFF; if (!inited) return false; u32 pos = currentID; while (true) { if ((addr >= fat[pos].start) && (addr < fat[pos].end)) { id = pos; currentID = pos; return true; } pos++; if (pos >= numFiles) pos = 0; if (pos == currentID) break; } return false; } bool FS_NITRO::getFileIdByAddr(u32 addr, u16 &id, u32 &offset) { id = 0xFFFF; offset = 0; if (!inited) return false; u32 pos = currentID; while (true) { if ((addr >= fat[pos].start) && (addr < fat[pos].end)) { id = pos; offset = addr - fat[pos].start; currentID = pos; return true; } pos++; if (pos >= numFiles) pos = 0; if (pos == currentID) break; } return false; } string FS_NITRO::getDirNameByID(u16 id) { if (!inited) return ""; if ((id & 0xF000) != 0xF000) return "|file|"; if ((id & 0x0FFF) > numDirs) return ""; return fnt[id & 0x0FFF].filename; } u16 FS_NITRO::getDirParrentByID(u16 id) { if (!inited) return 0xFFFF; if ((id & 0xF000) != 0xF000) return 0xFFFF; if ((id & 0x0FFF) > numDirs) return 0xFFFF; return fnt[id & 0x0FFF].parentID; } string FS_NITRO::getFileNameByID(u16 id) { if (!inited) return ""; if ((id & 0xF000) == 0xF000) return ""; if (id > numFiles) return ""; return fat[id].filename; } u16 FS_NITRO::getFileParentById(u16 id) { if (!inited) return 0xFFFF; if ((id & 0xF000) == 0xF000) return 0xFFFF; if (id > numFiles) return 0xFFFF; return fat[id].parentID; } string FS_NITRO::getFullPathByFileID(u16 id, bool addRoot) { if (!inited) return ""; if (id > numFiles) return ""; string res = ""; if (!fat[id].isOverlay) { u32 parentID = (fat[id].parentID & 0x0FFF); while (parentID) { res = fnt[parentID].filename + string(FS_DIRECTORY_DELIMITER_CHAR) + res; parentID = (fnt[parentID].parentID & 0x0FFF); } if (addRoot) res = string(FS_DIRECTORY_DELIMITER_CHAR) + string("data") + string(FS_DIRECTORY_DELIMITER_CHAR) + res; } else { if (addRoot) res = string(FS_DIRECTORY_DELIMITER_CHAR) + string("overlay") + string(FS_DIRECTORY_DELIMITER_CHAR); } res += fat[id].filename; return res; } u32 FS_NITRO::getFileSizeById(u16 id) { if (!inited) return 0; if (id > numFiles) return 0; return (fat[id].size); } u32 FS_NITRO::getStartAddrById(u16 id) { if (!inited) return 0; if (id > numFiles) return 0; return (fat[id].start); } u32 FS_NITRO::getEndAddrById(u16 id) { if (!inited) return 0; if (id > numFiles) return 0; return (fat[id].end); } bool FS_NITRO::extract(u16 id, string to) { printf("Extract to %s\n", to.c_str()); FILE *fp = fopen(to.c_str(), "wb"); if (fp) { fwrite((rom + fat[id].start), 1, fat[id].size, fp); fclose(fp); return true; } return false; } bool FS_NITRO::extractFile(u16 id, string to) { if (!inited) return false; if (id > numFiles) return false; char curr_dir[MAX_PATH] = {0}; getcwd(curr_dir, sizeof(curr_dir)); chdir(to.c_str()); extract(id, fat[id].filename); chdir(curr_dir); return true; } bool FS_NITRO::extractAll(string to, void (*callback)(u32 current, u32 num)) { if (!inited) return false; string dataDir = to + "data" + FS_DIRECTORY_DELIMITER_CHAR; string overlayDir = to + "overlay" + FS_DIRECTORY_DELIMITER_CHAR; __mkdir(dataDir.c_str()); __mkdir(overlayDir.c_str()); char curr_dir[MAX_PATH] = {0}; getcwd(curr_dir, sizeof(curr_dir)); chdir(dataDir.c_str()); for (u32 i = 0; i < numDirs; i++) { string tmp = fnt[i].filename; u16 parent = (fnt[i].parentID) & 0x0FFF; while (parent) { tmp = fnt[parent].filename + string(FS_DIRECTORY_DELIMITER_CHAR) + tmp; parent = (fnt[parent].parentID) & 0x0FFF; } __mkdir(tmp.c_str()); } chdir(dataDir.c_str()); for (u32 i = 0; i < numFiles; i++) { if (fat[i].isOverlay) continue; string fname = getFullPathByFileID(i, false); extract(i, fname); if (callback) callback(i, numFiles); } chdir(overlayDir.c_str()); for (u32 i = 0; i < numFiles; i++) { if (!fat[i].isOverlay) continue; extract(i, fat[i].filename); } chdir(curr_dir); return true; } desmume-0.9.11/src/utils/xstring.h0000755000000000000000000000725212467662066015565 0ustar rootroot//taken from fceux on 27-oct-2008 //subsequently modified for desmume /* Copyright (C) 2008-2009 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _STRINGUTIL_H_ #define _STRINGUTIL_H_ #include #include #include #include #include #include #include "../types.h" #include "../emufile.h" //definitions for str_strip() flags #define STRIP_SP 0x01 // space #define STRIP_TAB 0x02 // tab #define STRIP_CR 0x04 // carriage return #define STRIP_LF 0x08 // line feed int str_ucase(char *str); int str_lcase(char *str); int str_ltrim(char *str, int flags); int str_rtrim(char *str, int flags); int str_strip(char *str, int flags); int chr_replace(char *str, char search, char replace); int str_replace(char *str, char *search, char *replace); std::string strsub(const std::string& str, int pos, int len); std::string strmid(const std::string& str, int pos, int len); std::string strleft(const std::string& str, int len); std::string strright(const std::string& str, int len); std::string toupper(const std::string& str); int HexStringToBytesLength(const std::string& str); int Base64StringToBytesLength(const std::string& str); std::string u32ToHexString(u32 val); std::string BytesToString(const void* data, int len); bool StringToBytes(const std::string& str, void* data, int len); std::vector tokenize_str(const std::string & str,const std::string & delims); void splitpath(const char* path, char* drv, char* dir, char* name, char* ext); uint16 FastStrToU16(char* s, bool& valid); char *U16ToDecStr(uint16 a); char *U32ToDecStr(uint32 a); char *U32ToDecStr(char* buf, uint32 a); char *U8ToDecStr(uint8 a); char *U8ToHexStr(uint8 a); char *U16ToHexStr(uint16 a); std::string stditoa(int n); std::string readNullTerminatedAscii(std::istream* is); //extracts a decimal uint from an istream template T templateIntegerDecFromIstream(EMUFILE* is) { unsigned int ret = 0; bool pre = true; for(;;) { int c = is->fgetc(); if(c == -1) return ret; int d = c - '0'; if((d<0 || d>9)) { if(!pre) break; } else { pre = false; ret *= 10; ret += d; } } is->unget(); return ret; } inline u32 u32DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream(is); } inline u64 u64DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream(is); } //puts an optionally 0-padded decimal integer of type T into the ostream (0-padding is quicker) template void putdec(EMUFILE* os, T dec) { char temp[DIGITS]; int ctr = 0; for(int i=0;ifwrite(temp+DIGITS-ctr-1,ctr+1); else os->fwrite(temp,DIGITS); } std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement); std::wstring mbstowcs(std::string str); std::string wcstombs(std::wstring str); //TODO - dont we already have another function that can do this std::string getExtension(const char* input); #endif desmume-0.9.11/src/utils/datetime.h0000755000000000000000000004665112467662066015671 0ustar rootroot/* Copyright (C) 2010 DeSmuME team This file is based on System.DateTime.cs and System.TimeSpan.cs from mono-2.6.7 This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ // // System.DateTime.cs // // author: // Marcel Narings (marcel@narings.nl) // Martin Baulig (martin@gnome.org) // Atsushi Enomoto (atsushi@ximian.com) // // (C) 2001 Marcel Narings // Copyright (C) 2004-2006 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // System.TimeSpan.cs // // Authors: // Duco Fijma (duco@lorentz.xs4all.nl) // Andreas Nahr (ClassDevelopment@A-SoftTech.com) // Sebastien Pouliot // // (C) 2001 Duco Fijma // (C) 2004 Andreas Nahr // Copyright (C) 2004 Novell (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // 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 _DATETIME_H_ #define _DATETIME_H_ #include #include #include #include #include #include "../types.h" enum DayOfWeek { DayOfWeek_Sunday=0, DayOfWeek_Monday=1, DayOfWeek_Tuesday=2, DayOfWeek_Wednesday=3, DayOfWeek_Thursday=4, DayOfWeek_Friday=5, DayOfWeek_Saturday=6 }; class TimeSpan { friend class DateTime; public: static const TimeSpan& get_MaxValue() { static TimeSpan val(0x7FFFFFFFFFFFFFFFLL); return val; } static const TimeSpan& get_MinValue() { static TimeSpan val(0x8000000000000000LL); return val; } static const TimeSpan& get_Zero() { static TimeSpan val(0); return val; } static const s64 TicksPerDay = 864000000000LL; static const s64 TicksPerHour = 36000000000LL; static const s64 TicksPerMillisecond = 10000LL; static const s64 TicksPerMinute = 600000000LL; static const s64 TicksPerSecond = 10000000LL; TimeSpan () { } TimeSpan (s64 ticks) : _ticks(ticks) { } TimeSpan (int hours, int minutes, int seconds) { _ticks = CalculateTicks (0, hours, minutes, seconds, 0); } TimeSpan (int days, int hours, int minutes, int seconds) { _ticks = CalculateTicks (days, hours, minutes, seconds, 0); } TimeSpan (int days, int hours, int minutes, int seconds, int milliseconds) { _ticks = CalculateTicks (days, hours, minutes, seconds, milliseconds); } int get_Days() const { return (int) (_ticks / TicksPerDay); } int get_Hours() const { return (int) (_ticks % TicksPerDay / TicksPerHour); } int get_Milliseconds() const { return (int) (_ticks % TicksPerSecond / TicksPerMillisecond); } int get_Minutes() const { return (int) (_ticks % TicksPerHour / TicksPerMinute); } int get_Seconds() const { return (int) (_ticks % TicksPerMinute / TicksPerSecond); } s64 get_Ticks() const { return _ticks; } double get_TotalDays() const { return (double) _ticks / TicksPerDay; } double get_TotalHours() const { return (double) _ticks / TicksPerHour; } double get_TotalMilliseconds() const { return (double) _ticks / TicksPerMillisecond; } double get_TotalMinutes() const { return (double) _ticks / TicksPerMinute; } double get_TotalSeconds() const { return (double) _ticks / TicksPerSecond; } TimeSpan Add (const TimeSpan &ts) { return TimeSpan (_ticks + ts._ticks); //removed: //catch (OverflowException) throw new OverflowException (Locale.GetText ("Resulting timespan is too big.")); } static int Compare (const TimeSpan& t1, const TimeSpan& t2) { if (t1._ticks < t2._ticks) return -1; if (t1._ticks > t2._ticks) return 1; return 0; } int CompareTo (const TimeSpan& value) { return Compare (*this, value); } TimeSpan Duration () { return TimeSpan(_ticks<0?-_ticks:_ticks); //removed: //catch (OverflowException) throw new OverflowException (Locale.GetText ("This TimeSpan value is MinValue so you cannot get the duration.")); } static TimeSpan FromDays (double value) { return From (value, TicksPerDay); } static TimeSpan FromHours (double value) { return From (value, TicksPerHour); } static TimeSpan FromMinutes (double value) { return From (value, TicksPerMinute); } static TimeSpan FromSeconds (double value) { return From (value, TicksPerSecond); } static TimeSpan FromMilliseconds (double value) { return From (value, TicksPerMillisecond); } static TimeSpan FromTicks (s64 value) { return TimeSpan (value); } TimeSpan Negate () { //removed error handling //if (_ticks == MinValue()._ticks) throw new OverflowException (Locale.GetText ( "This TimeSpan value is MinValue and cannot be negated.")); return TimeSpan (-_ticks); } TimeSpan Subtract (const TimeSpan& ts) { //removed error handling //try { checked { return TimeSpan (_ticks - ts._ticks); // } //} //catch (OverflowException) { // throw new OverflowException (Locale.GetText ("Resulting timespan is too big.")); //} } TimeSpan operator + (const TimeSpan& t2) const { TimeSpan temp = *this; temp.Add (t2); return temp; } bool operator == (const TimeSpan& t2) const { return _ticks == t2._ticks; } bool operator > (const TimeSpan& t2) const { return _ticks > t2._ticks; } bool operator >= (const TimeSpan& t2) const { return _ticks >= t2._ticks; } bool operator != (const TimeSpan& t2) const { return _ticks != t2._ticks; } bool operator < (const TimeSpan& t2) const { return _ticks < t2._ticks; } bool operator <= (const TimeSpan& t2) const { return _ticks <= t2._ticks; } TimeSpan operator - (const TimeSpan& t2) const { TimeSpan temp = *this; return temp.Subtract (t2); } TimeSpan operator - () { return Negate (); } private: s64 _ticks; static s64 CalculateTicks (int days, int hours, int minutes, int seconds, int milliseconds) { // there's no overflow checks for hours, minutes, ... // so big hours/minutes values can overflow at some point and change expected values int hrssec = (hours * 3600); // break point at (Int32.MaxValue - 596523) int minsec = (minutes * 60); s64 t = ((s64)(hrssec + minsec + seconds) * 1000L + (s64)milliseconds); t *= 10000; bool overflow = false; // days is problematic because it can overflow but that overflow can be // "legal" (i.e. temporary) (e.g. if other parameters are negative) or // illegal (e.g. sign change). if (days > 0) { s64 td = TicksPerDay * days; if (t < 0) { s64 ticks = t; t += td; // positive days -> total ticks should be lower overflow = (ticks > t); } else { t += td; // positive + positive != negative result overflow = (t < 0); } } else if (days < 0) { s64 td = TicksPerDay * days; if (t <= 0) { t += td; // negative + negative != positive result overflow = (t > 0); } else { s64 ticks = t; t += td; // negative days -> total ticks should be lower overflow = (t > ticks); } } //removed: //if (overflow) throw ArgumentOutOfRangeException ("The timespan is too big or too small."); return t; } static TimeSpan From (double value, s64 tickMultiplicator) { //a bunch of error handling removed //if (Double.IsNaN (value)) throw new ArgumentException (Locale.GetText ("Value cannot be NaN."), "value"); //if (Double.IsNegativeInfinity (value) || Double.IsPositiveInfinity (value) || // (value < MinValue.Ticks) || (value > MaxValue.Ticks)) // throw new OverflowException (Locale.GetText ("Outside range [MinValue,MaxValue]")); //try { value = (value * (tickMultiplicator / TicksPerMillisecond)); // checked { // long val = (long) Math.Round(value); // return new TimeSpan (val * TicksPerMillisecond); // } //} //catch (OverflowException) { // throw new OverflowException (Locale.GetText ("Resulting timespan is too big.")); //} //} } }; class DateTime { private: TimeSpan ticks; static inline double round(const double x) { return floor(x + 0.5); } static const int dp400 = 146097; static const int dp100 = 36524; static const int dp4 = 1461; // w32 file time starts counting from 1/1/1601 00:00 GMT // which is the constant ticks from the .NET epoch static const s64 w32file_epoch = 504911232000000000LL; //private const long MAX_VALUE_TICKS = 3155378975400000000L; // -- Microsoft .NET has this value. static const s64 MAX_VALUE_TICKS = 3155378975999999999LL; // // The UnixEpoch, it begins on Jan 1, 1970 at 0:0:0, expressed // in Ticks // static const s64 UnixEpoch = 621355968000000000LL; static const int daysmonth[13]; static const int daysmonthleap[13]; static const char* monthnames[13]; void init (int year, int month, int day, int hour, int minute, int second, int millisecond) { //removed error handling /* if ( year < 1 || year > 9999 || month < 1 || month >12 || day < 1 || day > DaysInMonth(year, month) || hour < 0 || hour > 23 || minute < 0 || minute > 59 || second < 0 || second > 59 || millisecond < 0 || millisecond > 999) throw new ArgumentOutOfRangeException ("Parameters describe an " + "unrepresentable DateTime.");*/ ticks = TimeSpan (AbsoluteDays(year,month,day), hour, minute, second, millisecond); } static int AbsoluteDays (int year, int month, int day) { const int* days; int temp = 0, m=1 ; days = (IsLeapYear(year) ? daysmonthleap : daysmonth); while (m < month) temp += days[m++]; return ((day-1) + temp + (365* (year-1)) + ((year-1)/4) - ((year-1)/100) + ((year-1)/400)); } enum Which { Which_Day, Which_DayYear, Which_Month, Which_Year }; int FromTicks(Which what) const { int num400, num100, num4, numyears; int M =1; const int* days = daysmonth; int totaldays = ticks.get_Days(); num400 = (totaldays / dp400); totaldays -= num400 * dp400; num100 = (totaldays / dp100); if (num100 == 4) // leap num100 = 3; totaldays -= (num100 * dp100); num4 = totaldays / dp4; totaldays -= (num4 * dp4); numyears = totaldays / 365 ; if (numyears == 4) //leap numyears =3 ; if (what == Which_Year ) return num400*400 + num100*100 + num4*4 + numyears + 1; totaldays -= (numyears * 365) ; if (what == Which_DayYear ) return totaldays + 1; if ((numyears==3) && ((num100 == 3) || !(num4 == 24)) ) //31 dec leapyear days = daysmonthleap; while (totaldays >= days[M]) totaldays -= days[M++]; if (what == Which_Month ) return M; return totaldays +1; } public: DateTime() : ticks(0) { } static const char* GetNameOfMonth(int month) { return monthnames[month]; } DateTime (s64 ticks) { this->ticks = TimeSpan (ticks); //removed error handling //if (ticks < get_MinValue().get_Ticks() || ticks > get_MaxValue().get_Ticks()) { // string msg = Locale.GetText ("Value {0} is outside the valid range [{1},{2}].", // ticks, MinValue.Ticks, MaxValue.Ticks); // throw new ArgumentOutOfRangeException ("ticks", msg); //} } static const DateTime& get_MaxValue() { static DateTime val(false, TimeSpan (MAX_VALUE_TICKS)); return val; } static const DateTime& get_MinValue() { static DateTime val(false, TimeSpan (0)); return val; } DateTime (int year, int month, int day) { init(year,month,day,0,0,0,0); } DateTime (int year, int month, int day, int hour, int minute, int second) { init(year, month, day, hour, minute, second, 0); } DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond) { init(year,month,day,hour,minute,second,millisecond); } DateTime (bool check, const TimeSpan& value) { //removed error handling //if (check && (value.Ticks < MinValue.Ticks || value.Ticks > MaxValue.Ticks)) // throw new ArgumentOutOfRangeException (); ticks = value; } DateTime get_Date () const { return DateTime (get_Year(), get_Month(), get_Day()); } int get_Month () const { return FromTicks(Which_Month); } int get_Day() const { return FromTicks(Which_Day); } DayOfWeek get_DayOfWeek () const { return ( (DayOfWeek) ((ticks.get_Days()+1) % 7) ); } int get_DayOfYear () const { return FromTicks(Which_DayYear); } TimeSpan get_TimeOfDay () const { return TimeSpan(ticks.get_Ticks() % TimeSpan::TicksPerDay ); } int get_Hour () const { return ticks.get_Hours(); } int get_Minute () const { return ticks.get_Minutes(); } int get_Second () const { return ticks.get_Seconds(); } int get_Millisecond () const { return ticks.get_Milliseconds(); } //internal static extern s64 GetTimeMonotonic (); //internal static extern s64 GetNow (); static DateTime get_Now () { time_t timer; time(&timer); struct tm *tm = localtime(&timer); return DateTime(tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec); } s64 get_Ticks()const { return ticks.get_Ticks(); } static DateTime get_Today () { DateTime now = get_Now(); DateTime today = DateTime (now.get_Year(), now.get_Month(), now.get_Day()); return today; } int get_Year () const { return FromTicks(Which_Year); } DateTime Add (const TimeSpan& value) const { DateTime ret = AddTicks (value.get_Ticks()); return ret; } DateTime AddDays (double value) const { return AddMilliseconds (round(value * 86400000)); } DateTime AddTicks (const s64 value) const { //removed error handling //if ((value + ticks.Ticks) > MAX_VALUE_TICKS || (value + ticks.Ticks) < 0) { // throw new ArgumentOutOfRangeException(); //} return DateTime (value + ticks.get_Ticks()); } DateTime AddHours (double value) const { return AddMilliseconds (value * 3600000); } DateTime AddMilliseconds (double value) const { //removed error handling /* if ((value * TimeSpan.TicksPerMillisecond) > long.MaxValue || (value * TimeSpan.TicksPerMillisecond) < long.MinValue) { throw new ArgumentOutOfRangeException(); } */ s64 msticks = (s64) round(value * TimeSpan::TicksPerMillisecond); return AddTicks (msticks); } DateTime AddMinutes (double value) const { return AddMilliseconds (value * 60000); } DateTime AddMonths (int months) const { int day, month, year, maxday ; DateTime temp; day = get_Day(); month = get_Month() + (months % 12); year = get_Year() + months/12 ; if (month < 1) { month = 12 + month ; year -- ; } else if (month>12) { month = month -12; year ++; } maxday = DaysInMonth(year, month); if (day > maxday) day = maxday; temp = (year, month, day); return temp.Add (get_TimeOfDay()); } DateTime AddSeconds (double value) const { return AddMilliseconds (value * 1000); } DateTime AddYears (int value) const { return AddMonths (value * 12); } static int Compare (const DateTime& t1, const DateTime& t2) { if (t1.ticks < t2.ticks) return -1; else if (t1.ticks > t2.ticks) return 1; else return 0; } static int DaysInMonth (int year, int month) { const int* days ; //removed error handling //if (month < 1 || month >12)throw new ArgumentOutOfRangeException (); //if (year < 1 || year > 9999)throw new ArgumentOutOfRangeException (); days = (IsLeapYear(year) ? daysmonthleap : daysmonth); return days[month]; } static bool IsLeapYear (int year) { //removed error handling /* if (year < 1 || year > 9999) throw new ArgumentOutOfRangeException ();*/ return ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ; } TimeSpan Subtract (const DateTime& value) const { return TimeSpan (ticks.get_Ticks()) - value.ticks; } DateTime Subtract(const TimeSpan& value) const { TimeSpan newticks; newticks = (TimeSpan (ticks.get_Ticks())) - value; DateTime ret = DateTime (true,newticks); return ret; } DateTime operator +(const TimeSpan& t) const { return DateTime (true, ticks + t); } bool operator ==(const DateTime& d2) const { return (ticks == d2.ticks); } bool operator >(const DateTime& t2) const { return (ticks > t2.ticks); } bool operator >=(const DateTime &t2) const { return (ticks >= t2.ticks); } bool operator !=(const DateTime& d2) const { return (ticks != d2.ticks); } bool operator <(const DateTime& t2) const { return (ticks < t2.ticks ); } bool operator <=(const DateTime& t2) const { return (ticks <= t2.ticks); } TimeSpan operator -(const DateTime& d2) const { return TimeSpan((ticks - d2.ticks).get_Ticks()); } DateTime operator -(const TimeSpan& t) const { return DateTime (true, ticks - t); } //try to have a canonical format here. this was comment was typed at 2010-oct-04 02:16:44:000 std::string ToString() const { char tmp[32]; sprintf(tmp,"%04d-%s-%02d %02d:%02d:%02d:%03d",get_Year(),monthnames[get_Month()],get_Day(),get_Hour(),get_Minute(),get_Second(),get_Millisecond()); return tmp; } static bool TryParse(const char* str, DateTime& out) { int year,mon=-1,day,hour,min,sec,ms; char strmon[4]; int done = sscanf(str,"%04d-%3s-%02d %02d:%02d:%02d:%03d",&year,strmon,&day,&hour,&min,&sec,&ms); if(done != 7) return false; for(int i=1;i<12;i++) if(!strncasecmp(monthnames[i],strmon,3)) { mon=i; break; } if(mon==-1) return false; out = DateTime(year,mon,day,hour,min,sec); return true; } static DateTime Parse(const char* str) { DateTime ret; TryParse(str,ret); return ret; } }; #endif //_DATETIME_H_ desmume-0.9.11/src/utils/md5.h0000755000000000000000000000073612467662066014554 0ustar rootroot#ifndef _MD5_H #define _MD5_H #include "../types.h" #include "valuearray.h" struct md5_context { u32 total[2]; u32 state[4]; u8 buffer[64]; }; typedef ValueArray MD5DATA; void md5_starts( struct md5_context *ctx ); void md5_update( struct md5_context *ctx, u8 *input, u32 length ); void md5_finish( struct md5_context *ctx, u8 digest[16] ); /* Uses a static buffer, so beware of how it's used. */ char *md5_asciistr(MD5DATA& md5); #endif /* md5.h */ desmume-0.9.11/src/utils/guid.h0000755000000000000000000000176012467662066015015 0ustar rootroot/* Copyright (C) 2008-2009 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _guid_h_ #define _guid_h_ #include #include #include "../types.h" #include "valuearray.h" struct Desmume_Guid : public ValueArray { void newGuid(); std::string toString(); static Desmume_Guid fromString(std::string str); static uint8 hexToByte(char** ptrptr); void scan(std::string& str); }; #endif desmume-0.9.11/src/utils/task.h0000755000000000000000000000233412467662066015025 0ustar rootroot/* Copyright (C) 2009 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _TASK_H_ #define _TASK_H_ //Sort of like a single-thread thread pool. //You hand it a worker function and then call finish() to synch with its completion class Task { public: Task(); ~Task(); typedef void * (*TWork)(void *); // initialize task runner void start(bool spinlock); //execute some work void execute(const TWork &work, void* param); //wait for the work to complete void* finish(); // does the opposite of start void shutdown(); class Impl; Impl *impl; }; int getOnlineCores (void); #endif desmume-0.9.11/src/utils/ConvertUTF.h0000755000000000000000000001371612467662066016070 0ustar rootroot/* * Copyright 2001-2004 Unicode, Inc. * * Disclaimer * * This source code is provided as is by Unicode, Inc. No claims are * made as to fitness for any particular purpose. No warranties of any * kind are expressed or implied. The recipient agrees to determine * applicability of information provided. If this file has been * purchased on magnetic or optical media from Unicode, Inc., the * sole remedy for any claim will be exchange of defective media * within 90 days of receipt. * * Limitations on Rights to Redistribute This Code * * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. */ /* --------------------------------------------------------------------- Conversions between UTF32, UTF-16, and UTF-8. Header file. Several funtions are included here, forming a complete set of conversions between the three formats. UTF-7 is not included here, but is handled in a separate source file. Each of these routines takes pointers to input buffers and output buffers. The input buffers are const. Each routine converts the text between *sourceStart and sourceEnd, putting the result into the buffer between *targetStart and targetEnd. Note: the end pointers are *after* the last item: e.g. *(sourceEnd - 1) is the last item. The return result indicates whether the conversion was successful, and if not, whether the problem was in the source or target buffers. (Only the first encountered problem is indicated.) After the conversion, *sourceStart and *targetStart are both updated to point to the end of last text successfully converted in the respective buffers. Input parameters: sourceStart - pointer to a pointer to the source buffer. The contents of this are modified on return so that it points at the next thing to be converted. targetStart - similarly, pointer to pointer to the target buffer. sourceEnd, targetEnd - respectively pointers to the ends of the two buffers, for overflow checking only. These conversion functions take a ConversionFlags argument. When this flag is set to strict, both irregular sequences and isolated surrogates will cause an error. When the flag is set to lenient, both irregular sequences and isolated surrogates are converted. Whether the flag is strict or lenient, all illegal sequences will cause an error return. This includes sequences such as: , , or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code must check for illegal sequences. When the flag is set to lenient, characters over 0x10FFFF are converted to the replacement character; otherwise (when the flag is set to strict) they constitute an error. Output parameters: The value "sourceIllegal" is returned from some routines if the input sequence is malformed. When "sourceIllegal" is returned, the source value will point to the illegal value that caused the problem. E.g., in UTF-8 when a sequence is malformed, it points to the start of the malformed sequence. Author: Mark E. Davis, 1994. Rev History: Rick McGowan, fixes & updates May 2001. Fixes & updates, Sept 2001. ------------------------------------------------------------------------ */ /* --------------------------------------------------------------------- The following 4 definitions are compiler-specific. The C standard does not guarantee that wchar_t has at least 16 bits, so wchar_t is no less portable than unsigned short! All should be unsigned values to avoid sign extension during bit mask & shift operations. ------------------------------------------------------------------------ */ #ifndef __CONVERTUTF_H__ #define __CONVERTUTF_H__ #if defined(_MSC_VER) typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #else #include #endif typedef uint32_t UTF32; typedef uint16_t UTF16; typedef uint8_t UTF8; typedef uint8_t Boolean; /* 0 or 1 */ /* Some fundamental constants */ #define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD #define UNI_MAX_BMP (UTF32)0x0000FFFF #define UNI_MAX_UTF16 (UTF32)0x0010FFFF #define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF #define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF typedef enum { conversionOK, /* conversion successful */ sourceExhausted, /* partial character in source, but hit end */ targetExhausted, /* insuff. room in target for conversion */ sourceIllegal /* source sequence is illegal/malformed */ } ConversionResult; typedef enum { strictConversion = 0, lenientConversion } ConversionFlags; /* This is for C++ and does no harm in C */ #ifdef __cplusplus extern "C" { #endif ConversionResult ConvertUTF8toUTF16 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF16toUTF8 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF8toUTF32 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF32toUTF8 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF16toUTF32 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF32toUTF16 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); #ifdef __cplusplus } #endif #endif // __CONVERTUTF_H__ /* --------------------------------------------------------------------- */ desmume-0.9.11/src/utils/md5.cpp0000755000000000000000000001552112467662066015105 0ustar rootroot/// \file /// \brief RFC 1321 compliant MD5 implementation, /// RFC 1321 compliant MD5 implementation, /// by Christophe Devine ; /// this program is licensed under the GPL. //Modified October 3, 2003, to remove testing code, and add include of "types.h". //Added simple MD5 to ASCII string conversion function. // -Xodnizel #include #include "../types.h" #include "md5.h" typedef u8 uint8; typedef u16 uint16; typedef u32 uint32; #define GET_UINT32(n,b,i) \ { \ (n) = ( (uint32) (b)[(i) + 3] << 24 ) \ | ( (uint32) (b)[(i) + 2] << 16 ) \ | ( (uint32) (b)[(i) + 1] << 8 ) \ | ( (uint32) (b)[(i) ] ); \ } #define PUT_UINT32(n,b,i) \ { \ (b)[(i) ] = (uint8) ( (n) ); \ (b)[(i) + 1] = (uint8) ( (n) >> 8 ); \ (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \ (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \ } void md5_starts( struct md5_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; } static void md5_process( struct md5_context *ctx, uint8 data[64] ) { uint32 A, B, C, D, X[16]; GET_UINT32( X[0], data, 0 ); GET_UINT32( X[1], data, 4 ); GET_UINT32( X[2], data, 8 ); GET_UINT32( X[3], data, 12 ); GET_UINT32( X[4], data, 16 ); GET_UINT32( X[5], data, 20 ); GET_UINT32( X[6], data, 24 ); GET_UINT32( X[7], data, 28 ); GET_UINT32( X[8], data, 32 ); GET_UINT32( X[9], data, 36 ); GET_UINT32( X[10], data, 40 ); GET_UINT32( X[11], data, 44 ); GET_UINT32( X[12], data, 48 ); GET_UINT32( X[13], data, 52 ); GET_UINT32( X[14], data, 56 ); GET_UINT32( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define P(a,b,c,d,k,s,t) \ { \ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x,y,z) (z ^ (x & (y ^ z))) P( A, B, C, D, 0, 7, 0xD76AA478 ); P( D, A, B, C, 1, 12, 0xE8C7B756 ); P( C, D, A, B, 2, 17, 0x242070DB ); P( B, C, D, A, 3, 22, 0xC1BDCEEE ); P( A, B, C, D, 4, 7, 0xF57C0FAF ); P( D, A, B, C, 5, 12, 0x4787C62A ); P( C, D, A, B, 6, 17, 0xA8304613 ); P( B, C, D, A, 7, 22, 0xFD469501 ); P( A, B, C, D, 8, 7, 0x698098D8 ); P( D, A, B, C, 9, 12, 0x8B44F7AF ); P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); P( B, C, D, A, 11, 22, 0x895CD7BE ); P( A, B, C, D, 12, 7, 0x6B901122 ); P( D, A, B, C, 13, 12, 0xFD987193 ); P( C, D, A, B, 14, 17, 0xA679438E ); P( B, C, D, A, 15, 22, 0x49B40821 ); #undef F #define F(x,y,z) (y ^ (z & (x ^ y))) P( A, B, C, D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B340 ); P( C, D, A, B, 11, 14, 0x265E5A51 ); P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( A, B, C, D, 5, 5, 0xD62F105D ); P( D, A, B, C, 10, 9, 0x02441453 ); P( C, D, A, B, 15, 14, 0xD8A1E681 ); P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); P( A, B, C, D, 9, 5, 0x21E1CDE6 ); P( D, A, B, C, 14, 9, 0xC33707D6 ); P( C, D, A, B, 3, 14, 0xF4D50D87 ); P( B, C, D, A, 8, 20, 0x455A14ED ); P( A, B, C, D, 13, 5, 0xA9E3E905 ); P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); P( C, D, A, B, 7, 14, 0x676F02D9 ); P( B, C, D, A, 12, 20, 0x8D2A4C8A ); #undef F #define F(x,y,z) (x ^ y ^ z) P( A, B, C, D, 5, 4, 0xFFFA3942 ); P( D, A, B, C, 8, 11, 0x8771F681 ); P( C, D, A, B, 11, 16, 0x6D9D6122 ); P( B, C, D, A, 14, 23, 0xFDE5380C ); P( A, B, C, D, 1, 4, 0xA4BEEA44 ); P( D, A, B, C, 4, 11, 0x4BDECFA9 ); P( C, D, A, B, 7, 16, 0xF6BB4B60 ); P( B, C, D, A, 10, 23, 0xBEBFBC70 ); P( A, B, C, D, 13, 4, 0x289B7EC6 ); P( D, A, B, C, 0, 11, 0xEAA127FA ); P( C, D, A, B, 3, 16, 0xD4EF3085 ); P( B, C, D, A, 6, 23, 0x04881D05 ); P( A, B, C, D, 9, 4, 0xD9D4D039 ); P( D, A, B, C, 12, 11, 0xE6DB99E5 ); P( C, D, A, B, 15, 16, 0x1FA27CF8 ); P( B, C, D, A, 2, 23, 0xC4AC5665 ); #undef F #define F(x,y,z) (y ^ (x | ~z)) P( A, B, C, D, 0, 6, 0xF4292244 ); P( D, A, B, C, 7, 10, 0x432AFF97 ); P( C, D, A, B, 14, 15, 0xAB9423A7 ); P( B, C, D, A, 5, 21, 0xFC93A039 ); P( A, B, C, D, 12, 6, 0x655B59C3 ); P( D, A, B, C, 3, 10, 0x8F0CCC92 ); P( C, D, A, B, 10, 15, 0xFFEFF47D ); P( B, C, D, A, 1, 21, 0x85845DD1 ); P( A, B, C, D, 8, 6, 0x6FA87E4F ); P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); P( C, D, A, B, 6, 15, 0xA3014314 ); P( B, C, D, A, 13, 21, 0x4E0811A1 ); P( A, B, C, D, 4, 6, 0xF7537E82 ); P( D, A, B, C, 11, 10, 0xBD3AF235 ); P( C, D, A, B, 2, 15, 0x2AD7D2BB ); P( B, C, D, A, 9, 21, 0xEB86D391 ); #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; } void md5_update( struct md5_context *ctx, uint8 *input, uint32 length ) { uint32 left, fill; if( ! length ) return; left = ( ctx->total[0] >> 3 ) & 0x3F; fill = 64 - left; ctx->total[0] += length << 3; ctx->total[1] += length >> 29; ctx->total[0] &= 0xFFFFFFFF; ctx->total[1] += ctx->total[0] < ( length << 3 ); if( left && length >= fill ) { memcpy( (void *) (ctx->buffer + left), (void *) input, fill ); md5_process( ctx, ctx->buffer ); length -= fill; input += fill; left = 0; } while( length >= 64 ) { md5_process( ctx, input ); length -= 64; input += 64; } if( length ) { memcpy( (void *) (ctx->buffer + left), (void *) input, length ); } } static uint8 md5_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; void md5_finish( struct md5_context *ctx, uint8 digest[16] ) { uint32 last, padn; uint8 msglen[8]; PUT_UINT32( ctx->total[0], msglen, 0 ); PUT_UINT32( ctx->total[1], msglen, 4 ); last = ( ctx->total[0] >> 3 ) & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); md5_update( ctx, md5_padding, padn ); md5_update( ctx, msglen, 8 ); PUT_UINT32( ctx->state[0], digest, 0 ); PUT_UINT32( ctx->state[1], digest, 4 ); PUT_UINT32( ctx->state[2], digest, 8 ); PUT_UINT32( ctx->state[3], digest, 12 ); } /* Uses a static buffer, so beware of how it's used. */ char *md5_asciistr(MD5DATA& md5) { uint8* digest = md5.data; static char str[33]; static char trans[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; int x; for(x=0;x<16;x++) { str[x*2]=trans[digest[x]>>4]; str[x*2+1]=trans[digest[x]&0x0F]; } return(str); } desmume-0.9.11/src/utils/libfat/0000755000000000000000000000000012467663413015143 5ustar rootrootdesmume-0.9.11/src/utils/libfat/disc_io.h0000755000000000000000000000473712467662066016746 0ustar rootroot/* disc_io.h Interface template for low level disc functions. Copyright (c) 2006 Michael "Chishm" Chisholm Based on code originally written by MightyMax 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 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. */ #ifndef NDS_DISC_IO_INCLUDE #define NDS_DISC_IO_INCLUDE #define FEATURE_MEDIUM_CANREAD 0x00000001 #define FEATURE_MEDIUM_CANWRITE 0x00000002 #define FEATURE_SLOT_GBA 0x00000010 #define FEATURE_SLOT_NDS 0x00000020 typedef uint32_t sec_t; typedef bool (* FN_MEDIUM_STARTUP)(void) ; typedef bool (* FN_MEDIUM_ISINSERTED)(void) ; typedef bool (* FN_MEDIUM_READSECTORS)(sec_t sector, sec_t numSectors, void* buffer) ; typedef bool (* FN_MEDIUM_WRITESECTORS)(sec_t sector, sec_t numSectors, const void* buffer) ; typedef bool (* FN_MEDIUM_CLEARSTATUS)(void) ; typedef bool (* FN_MEDIUM_SHUTDOWN)(void) ; struct DISC_INTERFACE_STRUCT { unsigned long ioType ; unsigned long features ; FN_MEDIUM_STARTUP startup ; FN_MEDIUM_ISINSERTED isInserted ; FN_MEDIUM_READSECTORS readSectors ; FN_MEDIUM_WRITESECTORS writeSectors ; FN_MEDIUM_CLEARSTATUS clearStatus ; FN_MEDIUM_SHUTDOWN shutdown ; } ; typedef struct DISC_INTERFACE_STRUCT DISC_INTERFACE ; #endif // define NDS_DISC_IO_INCLUDE desmume-0.9.11/src/utils/libfat/libfat_public_api.h0000755000000000000000000000043012467662066020747 0ustar rootroot#ifndef _LIBFAT_PUBLIC_API_H_ #define _LIBFAT_PUBLIC_API_H_ namespace LIBFAT { void Init(void* buffer, int size_bytes); void Shutdown(); bool MkDir(const char *path); bool WriteFile(const char *path, const void* data, int len); }; #endif //_LIBFAT_PUBLIC_API_H_ desmume-0.9.11/src/utils/libfat/filetime.h0000755000000000000000000000333212467662066017121 0ustar rootroot/* filetime.h Conversion of file time and date values to various other types Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _FILETIME_H #define _FILETIME_H #include "common.h" #include uint16_t _FAT_filetime_getTimeFromRTC (void); uint16_t _FAT_filetime_getDateFromRTC (void); time_t _FAT_filetime_to_time_t (uint16_t t, uint16_t d); #endif // _FILETIME_H desmume-0.9.11/src/utils/libfat/partition.cpp0000755000000000000000000002350312467662066017671 0ustar rootroot/* partition.c Functions for mounting and dismounting partitions on various block devices. Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #include "partition.h" #include "bit_ops.h" #include "file_allocation_table.h" #include "directory.h" #include "mem_allocate.h" #include "fatfile.h" #include #include #ifndef LIBFAT_PC #include #endif /* This device name, as known by devkitPro toolchains */ const char* DEVICE_NAME = "fat"; /* Data offsets */ // BIOS Parameter Block offsets enum BPB { BPB_jmpBoot = 0x00, BPB_OEMName = 0x03, // BIOS Parameter Block BPB_bytesPerSector = 0x0B, BPB_sectorsPerCluster = 0x0D, BPB_reservedSectors = 0x0E, BPB_numFATs = 0x10, BPB_rootEntries = 0x11, BPB_numSectorsSmall = 0x13, BPB_mediaDesc = 0x15, BPB_sectorsPerFAT = 0x16, BPB_sectorsPerTrk = 0x18, BPB_numHeads = 0x1A, BPB_numHiddenSectors = 0x1C, BPB_numSectors = 0x20, // Ext BIOS Parameter Block for FAT16 BPB_FAT16_driveNumber = 0x24, BPB_FAT16_reserved1 = 0x25, BPB_FAT16_extBootSig = 0x26, BPB_FAT16_volumeID = 0x27, BPB_FAT16_volumeLabel = 0x2B, BPB_FAT16_fileSysType = 0x36, // Bootcode BPB_FAT16_bootCode = 0x3E, // FAT32 extended block BPB_FAT32_sectorsPerFAT32 = 0x24, BPB_FAT32_extFlags = 0x28, BPB_FAT32_fsVer = 0x2A, BPB_FAT32_rootClus = 0x2C, BPB_FAT32_fsInfo = 0x30, BPB_FAT32_bkBootSec = 0x32, // Ext BIOS Parameter Block for FAT32 BPB_FAT32_driveNumber = 0x40, BPB_FAT32_reserved1 = 0x41, BPB_FAT32_extBootSig = 0x42, BPB_FAT32_volumeID = 0x43, BPB_FAT32_volumeLabel = 0x47, BPB_FAT32_fileSysType = 0x52, // Bootcode BPB_FAT32_bootCode = 0x5A, BPB_bootSig_55 = 0x1FE, BPB_bootSig_AA = 0x1FF }; static const char FAT_SIG[3] = {'F', 'A', 'T'}; sec_t FindFirstValidPartition(const DISC_INTERFACE* disc) { uint8_t part_table[16*4]; uint8_t *ptr; int i; uint8_t sectorBuffer[BYTES_PER_READ] = {0}; // Read first sector of disc if (!_FAT_disc_readSectors (disc, 0, 1, sectorBuffer)) { return 0; } memcpy(part_table,sectorBuffer+0x1BE,16*4); ptr = part_table; for(i=0;i<4;i++,ptr+=16) { sec_t part_lba = u8array_to_u32(ptr, 0x8); if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) || !memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return part_lba; } if(ptr[4]==0) continue; if(ptr[4]==0x0F) { sec_t part_lba2=part_lba; sec_t next_lba2=0; int n; for(n=0;n<8;n++) // max 8 logic partitions { if(!_FAT_disc_readSectors (disc, part_lba+next_lba2, 1, sectorBuffer)) return 0; part_lba2 = part_lba + next_lba2 + u8array_to_u32(sectorBuffer, 0x1C6) ; next_lba2 = u8array_to_u32(sectorBuffer, 0x1D6); if(!_FAT_disc_readSectors (disc, part_lba2, 1, sectorBuffer)) return 0; if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) || !memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return part_lba2; } if(next_lba2==0) break; } } else { if(!_FAT_disc_readSectors (disc, part_lba, 1, sectorBuffer)) return 0; if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) || !memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return part_lba; } } } return 0; } PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t sectorsPerPage, sec_t startSector) { PARTITION* partition; uint8_t sectorBuffer[BYTES_PER_READ] = {0}; // Read first sector of disc if (!_FAT_disc_readSectors (disc, startSector, 1, sectorBuffer)) { return NULL; } // Make sure it is a valid MBR or boot sector if ( (sectorBuffer[BPB_bootSig_55] != 0x55) || (sectorBuffer[BPB_bootSig_AA] != 0xAA)) { return NULL; } if (startSector != 0) { // We're told where to start the partition, so just accept it } else if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { // Check if there is a FAT string, which indicates this is a boot sector startSector = 0; } else if (!memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { // Check for FAT32 startSector = 0; } else { startSector = FindFirstValidPartition(disc); if (!_FAT_disc_readSectors (disc, startSector, 1, sectorBuffer)) { return NULL; } } // Now verify that this is indeed a FAT partition if (memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) && memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return NULL; } partition = (PARTITION*) _FAT_mem_allocate (sizeof(PARTITION)); if (partition == NULL) { return NULL; } // Init the partition lock _FAT_lock_init(&partition->lock); if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG))) strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT16_volumeLabel), 11); else strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT32_volumeLabel), 11); partition->label[11] = '\0'; // Set partition's disc interface partition->disc = disc; // Store required information about the file system partition->fat.sectorsPerFat = u8array_to_u16(sectorBuffer, BPB_sectorsPerFAT); if (partition->fat.sectorsPerFat == 0) { partition->fat.sectorsPerFat = u8array_to_u32( sectorBuffer, BPB_FAT32_sectorsPerFAT32); } partition->numberOfSectors = u8array_to_u16( sectorBuffer, BPB_numSectorsSmall); if (partition->numberOfSectors == 0) { partition->numberOfSectors = u8array_to_u32( sectorBuffer, BPB_numSectors); } partition->bytesPerSector = BYTES_PER_READ; // Sector size is redefined to be 512 bytes partition->sectorsPerCluster = sectorBuffer[BPB_sectorsPerCluster] * u8array_to_u16(sectorBuffer, BPB_bytesPerSector) / BYTES_PER_READ; partition->bytesPerCluster = partition->bytesPerSector * partition->sectorsPerCluster; partition->fat.fatStart = startSector + u8array_to_u16(sectorBuffer, BPB_reservedSectors); partition->rootDirStart = partition->fat.fatStart + (sectorBuffer[BPB_numFATs] * partition->fat.sectorsPerFat); partition->dataStart = partition->rootDirStart + (( u8array_to_u16(sectorBuffer, BPB_rootEntries) * DIR_ENTRY_DATA_SIZE) / partition->bytesPerSector); partition->totalSize = ((uint64_t)partition->numberOfSectors - (partition->dataStart - startSector)) * (uint64_t)partition->bytesPerSector; // Store info about FAT uint32_t clusterCount = (partition->numberOfSectors - (uint32_t)(partition->dataStart - startSector)) / partition->sectorsPerCluster; partition->fat.lastCluster = clusterCount + CLUSTER_FIRST - 1; partition->fat.firstFree = CLUSTER_FIRST; if (clusterCount < CLUSTERS_PER_FAT12) { partition->filesysType = FS_FAT12; // FAT12 volume } else if (clusterCount < CLUSTERS_PER_FAT16) { partition->filesysType = FS_FAT16; // FAT16 volume } else { partition->filesysType = FS_FAT32; // FAT32 volume } if (partition->filesysType != FS_FAT32) { partition->rootDirCluster = FAT16_ROOT_DIR_CLUSTER; } else { // Set up for the FAT32 way partition->rootDirCluster = u8array_to_u32(sectorBuffer, BPB_FAT32_rootClus); // Check if FAT mirroring is enabled if (!(sectorBuffer[BPB_FAT32_extFlags] & 0x80)) { // Use the active FAT partition->fat.fatStart = partition->fat.fatStart + ( partition->fat.sectorsPerFat * (sectorBuffer[BPB_FAT32_extFlags] & 0x0F)); } } // Create a cache to use partition->cache = _FAT_cache_constructor (cacheSize, sectorsPerPage, partition->disc, startSector+partition->numberOfSectors); // Set current directory to the root partition->cwdCluster = partition->rootDirCluster; // Check if this disc is writable, and set the readOnly property appropriately partition->readOnly = !(_FAT_disc_features(disc) & FEATURE_MEDIUM_CANWRITE); // There are currently no open files on this partition partition->openFileCount = 0; partition->firstOpenFile = NULL; return partition; } void _FAT_partition_destructor (PARTITION* partition) { FILE_STRUCT* nextFile; _FAT_lock(&partition->lock); // Synchronize open files nextFile = partition->firstOpenFile; while (nextFile) { _FAT_syncToDisc (nextFile); nextFile = nextFile->nextOpenFile; } // Free memory used by the cache, writing it to disc at the same time _FAT_cache_destructor (partition->cache); // Unlock the partition and destroy the lock _FAT_unlock(&partition->lock); _FAT_lock_deinit(&partition->lock); // Free memory used by the partition _FAT_mem_free (partition); } PARTITION* _FAT_partition_getPartitionFromPath (const char* path) { const devoptab_t *devops; devops = GetDeviceOpTab (path); if (!devops) { return NULL; } return (PARTITION*)devops->deviceData; } desmume-0.9.11/src/utils/libfat/libfat_pc.h0000755000000000000000000000572012467662066017251 0ustar rootroot#ifndef _LIBFAT_PC_H #define _LIBFAT_PC_H #ifdef LIBFAT_PC #include "../../types.h" #ifdef _MSC_VER #define ENOTSUP 0 #define EOVERFLOW 0 #include #include #define strcasecmp(x,y) _stricmp(x,y) #define strncasecmp(x, y, l) strnicmp(x, y, l) typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; typedef int32_t ssize_t; #include #define S_IRUSR S_IREAD #define S_IRGRP S_IREAD #define S_IROTH S_IREAD #define S_IWUSR S_IWRITE #define S_IWGRP S_IWRITE #define S_IWOTH S_IWRITE //struct stat { // u32 st_dev; // u32 st_ino; // u32 st_mode; // u32 st_nlink; // u32 st_uid; // u32 st_gid; // u32 st_rdev; // s64 st_size; // time_t st_atime; // time_t st_mtime; // time_t st_ctime; // s32 st_blksize; // s32 st_blocks; // u32 st_attr; //}; #else // (!_MSC_VER) #include #endif //_MSC_VER struct _reent { intptr_t _errno; }; #ifdef __APPLE__ typedef __darwin_mode_t mode_t; #elif defined(_MSC_VER) typedef uint32_t mode_t; #else #include #endif struct DIR_ITER { void* dirStruct; }; struct devoptab_t { const char *name; int structSize; intptr_t (*open_r)(struct _reent *r, void *fileStruct, const char *path, int flags, int mode); intptr_t (*close_r)(struct _reent *r, intptr_t fd); ssize_t (*write_r)(struct _reent *r, intptr_t fd, const char *ptr, size_t len); ssize_t (*read_r)(struct _reent *r, intptr_t fd, char *ptr, size_t len); off_t (*seek_r)(struct _reent *r, intptr_t fd, off_t pos, int dir); int (*fstat_r)(struct _reent *r, intptr_t fd, struct stat *st); int (*stat_r)(struct _reent *r, const char *file, struct stat *st); int (*link_r)(struct _reent *r, const char *existing, const char *newLink); int (*unlink_r)(struct _reent *r, const char *name); int (*chdir_r)(struct _reent *r, const char *name); int (*rename_r) (struct _reent *r, const char *oldName, const char *newName); int (*mkdir_r) (struct _reent *r, const char *path, int mode); int dirStateSize; DIR_ITER* (*diropen_r)(struct _reent *r, DIR_ITER *dirState, const char *path); int (*dirreset_r)(struct _reent *r, DIR_ITER *dirState); int (*dirnext_r)(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat); int (*dirclose_r)(struct _reent *r, DIR_ITER *dirState); #ifndef LIBFAT_PC int (*statvfs_r)(struct _reent *r, const char *path, struct statvfs *buf); #endif int (*ftruncate_r)(struct _reent *r, intptr_t fd, off_t len); int (*fsync_r)(struct _reent *r, intptr_t fd); void *deviceData; int (*chmod_r)(struct _reent *r, const char *path, mode_t mode); int (*fchmod_r)(struct _reent *r, int fd, mode_t mode); }; devoptab_t* GetDeviceOpTab(const char* name); #define _ATTR_WEAK_ #endif //LIBFAT_PC #endif //_LIBFAT_PC_H desmume-0.9.11/src/utils/libfat/disc.cpp0000755000000000000000000000634712467662066016611 0ustar rootroot/* disc.c Interface to the low level disc functions. Used by the higher level file system code. Copyright (c) 2008 Michael "Chishm" Chisholm 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 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. */ #include "disc.h" /* The list of interfaces consists of a series of name/interface pairs. The interface is returned via a simple function. This allows for platforms where the interface has to be "assembled" before it can be used, like DLDI on the NDS. For cases where a simple struct is available, wrapper functions are used. The list is terminated by a NULL/NULL entry. */ /* ====================== Wii ====================== */ #if defined (__wii__) #include #include #include static const DISC_INTERFACE* get_io_wiisd (void) { return &__io_wiisd; } static const DISC_INTERFACE* get_io_usbstorage (void) { return &__io_usbstorage; } static const DISC_INTERFACE* get_io_gcsda (void) { return &__io_gcsda; } static const DISC_INTERFACE* get_io_gcsdb (void) { return &__io_gcsdb; } const INTERFACE_ID _FAT_disc_interfaces[] = { {"sd", get_io_wiisd}, {"usb", get_io_usbstorage}, {"carda", get_io_gcsda}, {"cardb", get_io_gcsdb}, {NULL, NULL} }; /* ==================== Gamecube ==================== */ #elif defined (__gamecube__) #include static const DISC_INTERFACE* get_io_gcsda (void) { return &__io_gcsda; } static const DISC_INTERFACE* get_io_gcsdb (void) { return &__io_gcsdb; } const INTERFACE_ID _FAT_disc_interfaces[] = { {"carda", get_io_gcsda}, {"cardb", get_io_gcsdb}, {NULL, NULL} }; /* ====================== NDS ====================== */ #elif defined (NDS) #include const INTERFACE_ID _FAT_disc_interfaces[] = { {"fat", dldiGetInternal}, {NULL, NULL} }; /* ====================== GBA ====================== */ #elif defined (GBA) #include const INTERFACE_ID _FAT_disc_interfaces[] = { {"fat", discGetInterface}, {NULL, NULL} }; #endif desmume-0.9.11/src/utils/libfat/fatfile.cpp0000755000000000000000000010125512467662066017273 0ustar rootroot/* fatfile.c Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. 2009-10-23 oggzee: fixes for cluster aligned file size (write, truncate, seek) */ #include "fatfile.h" #include #include #include #include #ifndef _MSC_VER #include #endif #include "cache.h" #include "file_allocation_table.h" #include "bit_ops.h" #include "filetime.h" #include "lock.h" intptr_t _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode) { PARTITION* partition = NULL; bool fileExists; DIR_ENTRY dirEntry; const char* pathEnd; uint32_t dirCluster; FILE_STRUCT* file = (FILE_STRUCT*) fileStruct; partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } // Determine which mode the file is openned for if ((flags & 0x03) == O_RDONLY) { // Open the file for read-only access file->read = true; file->write = false; file->append = false; } else if ((flags & 0x03) == O_WRONLY) { // Open file for write only access file->read = false; file->write = true; file->append = false; } else if ((flags & 0x03) == O_RDWR) { // Open file for read/write access file->read = true; file->write = true; file->append = false; } else { r->_errno = EACCES; return -1; } // Make sure we aren't trying to write to a read-only disc if (file->write && partition->readOnly) { r->_errno = EROFS; return -1; } // Search for the file on the disc _FAT_lock(&partition->lock); fileExists = _FAT_directory_entryFromPath (partition, &dirEntry, path, NULL); // The file shouldn't exist if we are trying to create it if ((flags & O_CREAT) && (flags & O_EXCL) && fileExists) { _FAT_unlock(&partition->lock); r->_errno = EEXIST; return -1; } // It should not be a directory if we're openning a file, if (fileExists && _FAT_directory_isDirectory(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = EISDIR; return -1; } // We haven't modified the file yet file->modified = false; // If the file doesn't exist, create it if we're allowed to if (!fileExists) { if (flags & O_CREAT) { if (partition->readOnly) { // We can't write to a read-only partition _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Create the file // Get the directory it has to go in pathEnd = strrchr (path, DIR_SEPARATOR); if (pathEnd == NULL) { // No path was specified dirCluster = partition->cwdCluster; pathEnd = path; } else { // Path was specified -- get the right dirCluster // Recycling dirEntry, since it needs to be recreated anyway if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) || !_FAT_directory_isDirectory(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } dirCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // Move the pathEnd past the last DIR_SEPARATOR pathEnd += 1; } // Create the entry data strncpy (dirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1); memset (dirEntry.entryData, 0, DIR_ENTRY_DATA_SIZE); // Set the creation time and date dirEntry.entryData[DIR_ENTRY_cTime_ms] = 0; u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cDate, _FAT_filetime_getDateFromRTC()); if (!_FAT_directory_addEntry (partition, &dirEntry, dirCluster)) { _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } // File entry is modified file->modified = true; } else { // file doesn't exist, and we aren't creating it _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } } file->filesize = u8array_to_u32 (dirEntry.entryData, DIR_ENTRY_fileSize); /* Allow LARGEFILEs with undefined results // Make sure that the file size can fit in the available space if (!(flags & O_LARGEFILE) && (file->filesize >= (1<<31))) { r->_errno = EFBIG; return -1; } */ // Make sure we aren't trying to write to a read-only file if (file->write && !_FAT_directory_isWritable(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Associate this file with a particular partition file->partition = partition; file->startCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // Truncate the file if requested if ((flags & O_TRUNC) && file->write && (file->startCluster != 0)) { _FAT_fat_clearLinks (partition, file->startCluster); file->startCluster = CLUSTER_FREE; file->filesize = 0; // File is modified since we just cut it all off file->modified = true; } // Remember the position of this file's directory entry file->dirEntryStart = dirEntry.dataStart; // Points to the start of the LFN entries of a file, or the alias for no LFN file->dirEntryEnd = dirEntry.dataEnd; // Reset read/write pointer file->currentPosition = 0; file->rwPosition.cluster = file->startCluster; file->rwPosition.sector = 0; file->rwPosition.byte = 0; if (flags & O_APPEND) { file->append = true; // Set append pointer to the end of the file file->appendPosition.cluster = _FAT_fat_lastCluster (partition, file->startCluster); file->appendPosition.sector = (file->filesize % partition->bytesPerCluster) / BYTES_PER_READ; file->appendPosition.byte = file->filesize % BYTES_PER_READ; // Check if the end of the file is on the end of a cluster if ( (file->filesize > 0) && ((file->filesize % partition->bytesPerCluster)==0) ){ // Set flag to allocate a new cluster file->appendPosition.sector = partition->sectorsPerCluster; file->appendPosition.byte = 0; } } else { file->append = false; // Use something sane for the append pointer, so the whole file struct contains known values file->appendPosition = file->rwPosition; } file->inUse = true; // Insert this file into the double-linked list of open files partition->openFileCount += 1; if (partition->firstOpenFile) { file->nextOpenFile = partition->firstOpenFile; partition->firstOpenFile->prevOpenFile = file; } else { file->nextOpenFile = NULL; } file->prevOpenFile = NULL; partition->firstOpenFile = file; _FAT_unlock(&partition->lock); return (intptr_t) file; } /* Synchronizes the file data to disc. Does no locking of its own -- lock the partition before calling. Returns 0 on success, an error code on failure. */ int _FAT_syncToDisc (FILE_STRUCT* file) { uint8_t dirEntryData[DIR_ENTRY_DATA_SIZE]; if (!file || !file->inUse) { return EBADF; } if (file->write && file->modified) { // Load the old entry _FAT_cache_readPartialSector (file->partition->cache, dirEntryData, _FAT_fat_clusterToSector(file->partition, file->dirEntryEnd.cluster) + file->dirEntryEnd.sector, file->dirEntryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); // Write new data to the directory entry // File size u32_to_u8array (dirEntryData, DIR_ENTRY_fileSize, file->filesize); // Start cluster u16_to_u8array (dirEntryData, DIR_ENTRY_cluster, file->startCluster); u16_to_u8array (dirEntryData, DIR_ENTRY_clusterHigh, file->startCluster >> 16); // Modification time and date u16_to_u8array (dirEntryData, DIR_ENTRY_mTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntryData, DIR_ENTRY_mDate, _FAT_filetime_getDateFromRTC()); // Access date u16_to_u8array (dirEntryData, DIR_ENTRY_aDate, _FAT_filetime_getDateFromRTC()); // Set archive attribute dirEntryData[DIR_ENTRY_attributes] |= ATTRIB_ARCH; // Write the new entry _FAT_cache_writePartialSector (file->partition->cache, dirEntryData, _FAT_fat_clusterToSector(file->partition, file->dirEntryEnd.cluster) + file->dirEntryEnd.sector, file->dirEntryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); // Flush any sectors in the disc cache if (!_FAT_cache_flush(file->partition->cache)) { return EIO; } } file->modified = false; return 0; } intptr_t _FAT_close_r (struct _reent *r, intptr_t fd) { FILE_STRUCT* file = (FILE_STRUCT*) fd; intptr_t ret = 0; if (!file->inUse) { r->_errno = EBADF; return -1; } _FAT_lock(&file->partition->lock); if (file->write) { ret = _FAT_syncToDisc (file); if (ret != 0) { r->_errno = ret; ret = -1; } } file->inUse = false; // Remove this file from the double-linked list of open files file->partition->openFileCount -= 1; if (file->nextOpenFile) { file->nextOpenFile->prevOpenFile = file->prevOpenFile; } if (file->prevOpenFile) { file->prevOpenFile->nextOpenFile = file->nextOpenFile; } else { file->partition->firstOpenFile = file->nextOpenFile; } _FAT_unlock(&file->partition->lock); return ret; } ssize_t _FAT_read_r (struct _reent *r, intptr_t fd, char *ptr, size_t len) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; CACHE* cache; FILE_POSITION position; uint32_t tempNextCluster; unsigned int tempVar; size_t remain; bool flagNoError = true; // Short circuit cases where len is 0 (or less) if (len <= 0) { return 0; } // Make sure we can actually read from the file if ((file == NULL) || !file->inUse || !file->read) { r->_errno = EBADF; return -1; } partition = file->partition; _FAT_lock(&partition->lock); // Don't try to read if the read pointer is past the end of file if (file->currentPosition >= file->filesize || file->startCluster == CLUSTER_FREE) { r->_errno = EOVERFLOW; _FAT_unlock(&partition->lock); return 0; } // Don't read past end of file if (len + file->currentPosition > file->filesize) { r->_errno = EOVERFLOW; len = file->filesize - file->currentPosition; } remain = len; position = file->rwPosition; cache = file->partition->cache; // Align to sector tempVar = BYTES_PER_READ - position.byte; if (tempVar > remain) { tempVar = remain; } if ((tempVar < BYTES_PER_READ) && flagNoError) { _FAT_cache_readPartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, tempVar); remain -= tempVar; ptr += tempVar; position.byte += tempVar; if (position.byte >= BYTES_PER_READ) { position.byte = 0; position.sector++; } } // align to cluster // tempVar is number of sectors to read if (remain > (partition->sectorsPerCluster - position.sector) * BYTES_PER_READ) { tempVar = partition->sectorsPerCluster - position.sector; } else { tempVar = remain / BYTES_PER_READ; } if ((tempVar > 0) && flagNoError) { if (! _FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Move onto next cluster // It should get to here without reading anything if a cluster is due to be allocated if ((position.sector >= partition->sectorsPerCluster) && flagNoError) { tempNextCluster = _FAT_fat_nextCluster(partition, position.cluster); if ((remain == 0) && (tempNextCluster == CLUSTER_EOF)) { position.sector = partition->sectorsPerCluster; } else if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { r->_errno = EIO; flagNoError = false; } else { position.sector = 0; position.cluster = tempNextCluster; } } // Read in whole clusters, contiguous blocks at a time while ((remain >= partition->bytesPerCluster) && flagNoError) { uint32_t chunkEnd; uint32_t nextChunkStart = position.cluster; size_t chunkSize = 0; do { chunkEnd = nextChunkStart; nextChunkStart = _FAT_fat_nextCluster (partition, chunkEnd); chunkSize += partition->bytesPerCluster; } while ((nextChunkStart == chunkEnd + 1) && #ifdef LIMIT_SECTORS (chunkSize + partition->bytesPerCluster <= LIMIT_SECTORS * BYTES_PER_READ) && #endif (chunkSize + partition->bytesPerCluster <= remain)); if (!_FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster), chunkSize / BYTES_PER_READ, ptr)) { flagNoError = false; r->_errno = EIO; break; } ptr += chunkSize; remain -= chunkSize; // Advance to next cluster if ((remain == 0) && (nextChunkStart == CLUSTER_EOF)) { position.sector = partition->sectorsPerCluster; position.cluster = chunkEnd; } else if (!_FAT_fat_isValidCluster(partition, nextChunkStart)) { r->_errno = EIO; flagNoError = false; } else { position.sector = 0; position.cluster = nextChunkStart; } } // Read remaining sectors tempVar = remain / BYTES_PER_READ; // Number of sectors left if ((tempVar > 0) && flagNoError) { if (!_FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster), tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Last remaining sector // Check if anything is left if ((remain > 0) && flagNoError) { _FAT_cache_readPartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); position.byte += remain; remain = 0; } // Length read is the wanted length minus the stuff not read len = len - remain; // Update file information file->rwPosition = position; file->currentPosition += len; _FAT_unlock(&partition->lock); return len; } // if current position is on the cluster border and more data has to be written // then get next cluster or allocate next cluster // this solves the over-allocation problems when file size is aligned to cluster size // return true on succes, false on error static bool _FAT_check_position_for_next_cluster(struct _reent *r, FILE_POSITION *position, PARTITION* partition, size_t remain, bool *flagNoError) { uint32_t tempNextCluster; // do nothing if no more data to write if (remain == 0) return true; if (flagNoError && *flagNoError == false) return false; if ((remain < 0) || (position->sector > partition->sectorsPerCluster)) { // invalid arguments - internal error r->_errno = EINVAL; goto err; } if (position->sector == partition->sectorsPerCluster) { // need to advance to next cluster tempNextCluster = _FAT_fat_nextCluster(partition, position->cluster); if ((tempNextCluster == CLUSTER_EOF) || (tempNextCluster == CLUSTER_FREE)) { // Ran out of clusters so get a new one tempNextCluster = _FAT_fat_linkFreeCluster(partition, position->cluster); } if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort r->_errno = ENOSPC; goto err; } position->sector = 0; position->cluster = tempNextCluster; } return true; err: if (flagNoError) *flagNoError = false; return false; } /* Extend a file so that the size is the same as the rwPosition */ static bool _FAT_file_extend_r (struct _reent *r, FILE_STRUCT* file) { PARTITION* partition = file->partition; CACHE* cache = file->partition->cache; FILE_POSITION position; uint8_t zeroBuffer [BYTES_PER_READ] = {0}; uint32_t remain; uint32_t tempNextCluster; unsigned int sector; position.byte = file->filesize % BYTES_PER_READ; position.sector = (file->filesize % partition->bytesPerCluster) / BYTES_PER_READ; // It is assumed that there is always a startCluster // This will be true when _FAT_file_extend_r is called from _FAT_write_r position.cluster = _FAT_fat_lastCluster (partition, file->startCluster); remain = file->currentPosition - file->filesize; if ((remain > 0) && (file->filesize > 0) && (position.sector == 0) && (position.byte == 0)) { // Get a new cluster on the edge of a cluster boundary tempNextCluster = _FAT_fat_linkFreeCluster(partition, position.cluster); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort r->_errno = ENOSPC; return false; } position.cluster = tempNextCluster; position.sector = 0; } if (remain + position.byte < BYTES_PER_READ) { // Only need to clear to the end of the sector _FAT_cache_writePartialSector (cache, zeroBuffer, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, remain); position.byte += remain; } else { if (position.byte > 0) { _FAT_cache_writePartialSector (cache, zeroBuffer, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, BYTES_PER_READ - position.byte); remain -= (BYTES_PER_READ - position.byte); position.byte = 0; position.sector ++; } while (remain >= BYTES_PER_READ) { if (position.sector >= partition->sectorsPerCluster) { position.sector = 0; // Ran out of clusters so get a new one tempNextCluster = _FAT_fat_linkFreeCluster(partition, position.cluster); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort r->_errno = ENOSPC; return false; } position.cluster = tempNextCluster; } sector = _FAT_fat_clusterToSector (partition, position.cluster) + position.sector; _FAT_cache_writeSectors (cache, sector, 1, zeroBuffer); remain -= BYTES_PER_READ; position.sector ++; } if (!_FAT_check_position_for_next_cluster(r, &position, partition, remain, NULL)) { // error already marked return false; } if (remain > 0) { _FAT_cache_writePartialSector (cache, zeroBuffer, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); position.byte = remain; } } file->rwPosition = position; file->filesize = file->currentPosition; return true; } ssize_t _FAT_write_r (struct _reent *r, intptr_t fd, const char *ptr, size_t len) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; CACHE* cache; FILE_POSITION position; uint32_t tempNextCluster; unsigned int tempVar; size_t remain; bool flagNoError = true; bool flagAppending = false; // Make sure we can actually write to the file if ((file == NULL) || !file->inUse || !file->write) { r->_errno = EBADF; return -1; } partition = file->partition; cache = file->partition->cache; _FAT_lock(&partition->lock); // Only write up to the maximum file size, taking into account wrap-around of ints if (len + file->filesize > FILE_MAX_SIZE || len + file->filesize < file->filesize) { len = FILE_MAX_SIZE - file->filesize; } // Short circuit cases where len is 0 (or less) if (len <= 0) { _FAT_unlock(&partition->lock); return 0; } remain = len; // Get a new cluster for the start of the file if required if (file->startCluster == CLUSTER_FREE) { tempNextCluster = _FAT_fat_linkFreeCluster (partition, CLUSTER_FREE); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort immediately _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } file->startCluster = tempNextCluster; // Appending starts at the begining for a 0 byte file file->appendPosition.cluster = file->startCluster; file->appendPosition.sector = 0; file->appendPosition.byte = 0; file->rwPosition.cluster = file->startCluster; file->rwPosition.sector = 0; file->rwPosition.byte = 0; } if (file->append) { position = file->appendPosition; flagAppending = true; } else { // If the write pointer is past the end of the file, extend the file to that size if (file->currentPosition > file->filesize) { if (!_FAT_file_extend_r (r, file)) { _FAT_unlock(&partition->lock); return -1; } } // Write at current read pointer position = file->rwPosition; // If it is writing past the current end of file, set appending flag if (len + file->currentPosition > file->filesize) { flagAppending = true; } } // Move onto next cluster if needed _FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError); // Align to sector tempVar = BYTES_PER_READ - position.byte; if (tempVar > remain) { tempVar = remain; } if ((tempVar < BYTES_PER_READ) && flagNoError) { // Write partial sector to disk _FAT_cache_writePartialSector (cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, tempVar); remain -= tempVar; ptr += tempVar; position.byte += tempVar; // Move onto next sector if (position.byte >= BYTES_PER_READ) { position.byte = 0; position.sector ++; } } // Align to cluster // tempVar is number of sectors to write if (remain > (partition->sectorsPerCluster - position.sector) * BYTES_PER_READ) { tempVar = partition->sectorsPerCluster - position.sector; } else { tempVar = remain / BYTES_PER_READ; } if ((tempVar > 0 && tempVar < partition->sectorsPerCluster) && flagNoError) { if (!_FAT_cache_writeSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Write whole clusters while ((remain >= partition->bytesPerCluster) && flagNoError) { // allocate next cluster _FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError); if (!flagNoError) break; // set indexes to the current position uint32_t chunkEnd = position.cluster; uint32_t nextChunkStart = position.cluster; size_t chunkSize = partition->bytesPerCluster; FILE_POSITION next_position = position; // group consecutive clusters while (flagNoError && #ifdef LIMIT_SECTORS (chunkSize + partition->bytesPerCluster <= LIMIT_SECTORS * BYTES_PER_READ) && #endif (chunkSize + partition->bytesPerCluster < remain)) { // pretend to use up all sectors in next_position next_position.sector = partition->sectorsPerCluster; // get or allocate next cluster _FAT_check_position_for_next_cluster(r, &next_position, partition, remain - chunkSize, &flagNoError); if (!flagNoError) break; // exit loop on error nextChunkStart = next_position.cluster; if (nextChunkStart != chunkEnd + 1) break; // exit loop if not consecutive chunkEnd = nextChunkStart; chunkSize += partition->bytesPerCluster; } if ( !_FAT_cache_writeSectors (cache, _FAT_fat_clusterToSector(partition, position.cluster), chunkSize / BYTES_PER_READ, ptr)) { flagNoError = false; r->_errno = EIO; break; } ptr += chunkSize; remain -= chunkSize; if ((chunkEnd != nextChunkStart) && _FAT_fat_isValidCluster(partition, nextChunkStart)) { // new cluster is already allocated (because it was not consecutive) position.cluster = nextChunkStart; position.sector = 0; } else { // Allocate a new cluster when next writing the file position.cluster = chunkEnd; position.sector = partition->sectorsPerCluster; } } // allocate next cluster if needed _FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError); // Write remaining sectors tempVar = remain / BYTES_PER_READ; // Number of sectors left if ((tempVar > 0) && flagNoError) { if (!_FAT_cache_writeSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster), tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Last remaining sector if ((remain > 0) && flagNoError) { if (flagAppending) { _FAT_cache_eraseWritePartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); } else { _FAT_cache_writePartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); } position.byte += remain; remain = 0; } // Amount written is the originally requested amount minus stuff remaining len = len - remain; // Update file information file->modified = true; if (file->append) { // Appending doesn't affect the read pointer file->appendPosition = position; file->filesize += len; } else { // Writing also shifts the read pointer file->rwPosition = position; file->currentPosition += len; if (file->filesize < file->currentPosition) { file->filesize = file->currentPosition; } } _FAT_unlock(&partition->lock); return len; } off_t _FAT_seek_r (struct _reent *r, intptr_t fd, off_t pos, int dir) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; uint32_t cluster, nextCluster; int clusCount; off_t newPosition; uint32_t position; if ((file == NULL) || (file->inUse == false)) { // invalid file r->_errno = EBADF; return -1; } partition = file->partition; _FAT_lock(&partition->lock); switch (dir) { case SEEK_SET: newPosition = pos; break; case SEEK_CUR: newPosition = (off_t)file->currentPosition + pos; break; case SEEK_END: newPosition = (off_t)file->filesize + pos; break; default: _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } if ((pos > 0) && (newPosition < 0)) { _FAT_unlock(&partition->lock); r->_errno = EOVERFLOW; return -1; } // newPosition can only be larger than the FILE_MAX_SIZE on platforms where // off_t is larger than 32 bits. if (newPosition < 0 || ((sizeof(newPosition) > 4) && newPosition > (off_t)FILE_MAX_SIZE)) { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } position = (uint32_t)newPosition; // Only change the read/write position if it is within the bounds of the current filesize, // or at the very edge of the file if (position <= file->filesize && file->startCluster != CLUSTER_FREE) { // Calculate where the correct cluster is // how many clusters from start of file clusCount = position / partition->bytesPerCluster; cluster = file->startCluster; if (position >= file->currentPosition) { // start from current cluster int currentCount = file->currentPosition / partition->bytesPerCluster; if (file->rwPosition.sector == partition->sectorsPerCluster) { currentCount--; } clusCount -= currentCount; cluster = file->rwPosition.cluster; } // Calculate the sector and byte of the current position, // and store them file->rwPosition.sector = (position % partition->bytesPerCluster) / BYTES_PER_READ; file->rwPosition.byte = position % BYTES_PER_READ; nextCluster = _FAT_fat_nextCluster (partition, cluster); while ((clusCount > 0) && (nextCluster != CLUSTER_FREE) && (nextCluster != CLUSTER_EOF)) { clusCount--; cluster = nextCluster; nextCluster = _FAT_fat_nextCluster (partition, cluster); } // Check if ran out of clusters and it needs to allocate a new one if (clusCount > 0) { if ((clusCount == 1) && (file->filesize == position) && (file->rwPosition.sector == 0)) { // Set flag to allocate a new cluster file->rwPosition.sector = partition->sectorsPerCluster; file->rwPosition.byte = 0; } else { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } } file->rwPosition.cluster = cluster; } // Save position file->currentPosition = position; _FAT_unlock(&partition->lock); return position; } int _FAT_fstat_r (struct _reent *r, intptr_t fd, struct stat *st) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; DIR_ENTRY fileEntry; if ((file == NULL) || (file->inUse == false)) { // invalid file r->_errno = EBADF; return -1; } partition = file->partition; _FAT_lock(&partition->lock); // Get the file's entry data fileEntry.dataStart = file->dirEntryStart; fileEntry.dataEnd = file->dirEntryEnd; if (!_FAT_directory_entryFromPosition (partition, &fileEntry)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } // Fill in the stat struct _FAT_directory_entryStat (partition, &fileEntry, st); // Fix stats that have changed since the file was openned st->st_ino = (ino_t)(file->startCluster); // The file serial number is the start cluster st->st_size = file->filesize; // File size _FAT_unlock(&partition->lock); return 0; } int _FAT_ftruncate_r (struct _reent *r, intptr_t fd, off_t len) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; int ret=0; uint32_t newSize = (uint32_t)len; if (len < 0) { // Trying to truncate to a negative size r->_errno = EINVAL; return -1; } if ((sizeof(len) > 4) && len > (off_t)FILE_MAX_SIZE) { // Trying to extend the file beyond what FAT supports r->_errno = EFBIG; return -1; } if (!file || !file->inUse) { // invalid file r->_errno = EBADF; return -1; } if (!file->write) { // Read-only file r->_errno = EINVAL; return -1; } partition = file->partition; _FAT_lock(&partition->lock); if (newSize > file->filesize) { // Expanding the file FILE_POSITION savedPosition; uint32_t savedOffset; // Get a new cluster for the start of the file if required if (file->startCluster == CLUSTER_FREE) { uint32_t tempNextCluster = _FAT_fat_linkFreeCluster (partition, CLUSTER_FREE); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort immediately _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } file->startCluster = tempNextCluster; file->rwPosition.cluster = file->startCluster; file->rwPosition.sector = 0; file->rwPosition.byte = 0; } // Save the read/write pointer savedPosition = file->rwPosition; savedOffset = file->currentPosition; // Set the position to the new size file->currentPosition = newSize; // Extend the file to the new position if (!_FAT_file_extend_r (r, file)) { ret = -1; } // Set the append position to the new rwPointer if (file->append) { file->appendPosition = file->rwPosition; } // Restore the old rwPointer; file->rwPosition = savedPosition; file->currentPosition = savedOffset; } else if (newSize < file->filesize){ // Shrinking the file if (len == 0) { // Cutting the file down to nothing, clear all clusters used _FAT_fat_clearLinks (partition, file->startCluster); file->startCluster = CLUSTER_FREE; file->appendPosition.cluster = CLUSTER_FREE; file->appendPosition.sector = 0; file->appendPosition.byte = 0; } else { // Trimming the file down to the required size unsigned int chainLength; uint32_t lastCluster; // Drop the unneeded end of the cluster chain. // If the end falls on a cluster boundary, drop that cluster too, // then set a flag to allocate a cluster as needed chainLength = ((newSize-1) / partition->bytesPerCluster) + 1; lastCluster = _FAT_fat_trimChain (partition, file->startCluster, chainLength); if (file->append) { file->appendPosition.byte = newSize % BYTES_PER_READ; // Does the end of the file fall on the edge of a cluster? if (newSize % partition->bytesPerCluster == 0) { // Set a flag to allocate a new cluster file->appendPosition.sector = partition->sectorsPerCluster; } else { file->appendPosition.sector = (newSize % partition->bytesPerCluster) / BYTES_PER_READ; } file->appendPosition.cluster = lastCluster; } } } else { // Truncating to same length, so don't do anything } file->filesize = newSize; file->modified = true; _FAT_unlock(&partition->lock); return ret; } int _FAT_fsync_r (struct _reent *r, intptr_t fd) { FILE_STRUCT* file = (FILE_STRUCT*) fd; int ret = 0; if (!file->inUse) { r->_errno = EBADF; return -1; } _FAT_lock(&file->partition->lock); ret = _FAT_syncToDisc (file); if (ret != 0) { r->_errno = ret; ret = -1; } _FAT_unlock(&file->partition->lock); return ret; } desmume-0.9.11/src/utils/libfat/libfat_public_api.cpp0000755000000000000000000000501612467662066021307 0ustar rootroot#include #include #include "libfat_public_api.h" #include "common.h" #include "disc_io.h" #include "fatfile.h" struct Instance { void* buffer; int size_bytes; devoptab_t* devops; }; Instance sInstance; Instance* gInstance = NULL; bool MEDIUM_STARTUP(void) { return true; } bool MEDIUM_ISINSERTED(void) { return true; } bool MEDIUM_io(bool write, sec_t sector, sec_t numSectors, void* buffer) { int todo = (int)numSectors*512; int loc = (int)sector*512; int have = gInstance->size_bytes - loc; if(todo>have) return false; if(write) memcpy((u8*)gInstance->buffer + loc,buffer,todo); else memcpy(buffer,(u8*)gInstance->buffer + loc,todo); return true; } bool MEDIUM_READSECTORS(sec_t sector, sec_t numSectors, void* buffer) { return MEDIUM_io(false,sector,numSectors,buffer); } bool MEDIUM_WRITESECTORS(sec_t sector, sec_t numSectors, const void* buffer) { return MEDIUM_io(true,sector,numSectors,(void*)buffer); } bool MEDIUM_CLEARSTATUS(void) { return true; } bool MEDIUM_SHUTDOWN(void) { return true; } DISC_INTERFACE_STRUCT discio = { 0, //unsigned long ioType ; FEATURE_MEDIUM_CANWRITE | FEATURE_MEDIUM_CANREAD, //unsigned long features ; MEDIUM_STARTUP, // FN_MEDIUM_STARTUP startup ; MEDIUM_ISINSERTED, //FN_MEDIUM_ISINSERTED isInserted ; MEDIUM_READSECTORS, //FN_MEDIUM_READSECTORS readSectors ; MEDIUM_WRITESECTORS, //FN_MEDIUM_WRITESECTORS writeSectors ; MEDIUM_CLEARSTATUS, //FN_MEDIUM_CLEARSTATUS clearStatus ; MEDIUM_SHUTDOWN, //FN_MEDIUM_SHUTDOWN shutdown ; } ; //not declared in any libfat headers...? bool fatMountSimple (const char* name, const DISC_INTERFACE* interface); void fatUnmountDirect (devoptab_t *devops); namespace LIBFAT { void Init(void* buffer, int size_bytes) { gInstance = &sInstance; gInstance->buffer = buffer; gInstance->size_bytes = size_bytes; fatMountSimple("fat",&discio); gInstance->devops = GetDeviceOpTab(NULL); int zzz=9; } bool MkDir(const char *path) { _reent r; return gInstance->devops->mkdir_r(&r,path,0) == 0; } bool WriteFile(const char *path, const void* data, int len) { _reent r; FILE_STRUCT file; intptr_t fd = gInstance->devops->open_r(&r,&file,path,O_CREAT | O_RDWR,0); if(fd != -1) { ssize_t ret = gInstance->devops->write_r(&r, fd, (char*)data, len); gInstance->devops->close_r(&r, fd); if(ret == len) return true; } return false; } void Shutdown() { fatUnmountDirect(gInstance->devops); gInstance = NULL; } } desmume-0.9.11/src/utils/libfat/fatdir.h0000755000000000000000000000535112467662066016577 0ustar rootroot/* fatdir.h Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _FATDIR_H #define _FATDIR_H #include #include "common.h" #include "directory.h" #ifndef LIBFAT_PC #include #include #include #endif typedef struct { PARTITION* partition; DIR_ENTRY currentEntry; uint32_t startCluster; bool inUse; bool validEntry; } DIR_STATE_STRUCT; extern int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st); extern int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink); extern int _FAT_unlink_r (struct _reent *r, const char *name); extern int _FAT_chdir_r (struct _reent *r, const char *name); extern int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName); extern int _FAT_mkdir_r (struct _reent *r, const char *path, int mode); extern int _FAT_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf); /* Directory iterator functions */ extern DIR_ITER* _FAT_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path); extern int _FAT_dirreset_r (struct _reent *r, DIR_ITER *dirState); extern int _FAT_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat); extern int _FAT_dirclose_r (struct _reent *r, DIR_ITER *dirState); #endif // _FATDIR_H desmume-0.9.11/src/utils/libfat/directory.h0000755000000000000000000001410712467662066017331 0ustar rootroot/* directory.h Reading, writing and manipulation of the directory structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _DIRECTORY_H #define _DIRECTORY_H #include #include "common.h" #include "partition.h" #define DIR_ENTRY_DATA_SIZE 0x20 #define MAX_LFN_LENGTH 256 #define MAX_FILENAME_LENGTH 768 // 256 UCS-2 characters encoded into UTF-8 can use up to 768 UTF-8 chars #define MAX_ALIAS_LENGTH 13 #define LFN_ENTRY_LENGTH 13 #define ALIAS_ENTRY_LENGTH 11 #define MAX_ALIAS_EXT_LENGTH 3 #define MAX_ALIAS_PRI_LENGTH 8 #define MAX_NUMERIC_TAIL 999999 #define FAT16_ROOT_DIR_CLUSTER 0 #define DIR_SEPARATOR '/' // File attributes #define ATTRIB_ARCH 0x20 // Archive #define ATTRIB_DIR 0x10 // Directory #define ATTRIB_LFN 0x0F // Long file name #define ATTRIB_VOL 0x08 // Volume #define ATTRIB_SYS 0x04 // System #define ATTRIB_HID 0x02 // Hidden #define ATTRIB_RO 0x01 // Read only typedef enum {FT_DIRECTORY, FT_FILE} FILE_TYPE; typedef struct { uint32_t cluster; sec_t sector; int32_t offset; } DIR_ENTRY_POSITION; typedef struct { uint8_t entryData[DIR_ENTRY_DATA_SIZE]; DIR_ENTRY_POSITION dataStart; // Points to the start of the LFN entries of a file, or the alias for no LFN DIR_ENTRY_POSITION dataEnd; // Always points to the file/directory's alias entry char filename[MAX_FILENAME_LENGTH]; } DIR_ENTRY; // Directory entry offsets enum DIR_ENTRY_offset { DIR_ENTRY_name = 0x00, DIR_ENTRY_extension = 0x08, DIR_ENTRY_attributes = 0x0B, DIR_ENTRY_reserved = 0x0C, DIR_ENTRY_cTime_ms = 0x0D, DIR_ENTRY_cTime = 0x0E, DIR_ENTRY_cDate = 0x10, DIR_ENTRY_aDate = 0x12, DIR_ENTRY_clusterHigh = 0x14, DIR_ENTRY_mTime = 0x16, DIR_ENTRY_mDate = 0x18, DIR_ENTRY_cluster = 0x1A, DIR_ENTRY_fileSize = 0x1C }; /* Returns true if the file specified by entry is a directory */ static inline bool _FAT_directory_isDirectory (DIR_ENTRY* entry) { return ((entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) != 0); } static inline bool _FAT_directory_isWritable (DIR_ENTRY* entry) { return ((entry->entryData[DIR_ENTRY_attributes] & ATTRIB_RO) == 0); } static inline bool _FAT_directory_isDot (DIR_ENTRY* entry) { return ((entry->filename[0] == '.') && ((entry->filename[1] == '\0') || ((entry->filename[1] == '.') && entry->filename[2] == '\0'))); } /* Reads the first directory entry from the directory starting at dirCluster Places result in entry entry will be destroyed even if no directory entry is found Returns true on success, false on failure */ bool _FAT_directory_getFirstEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster); /* Reads the next directory entry after the one already pointed to by entry Places result in entry entry will be destroyed even if no directory entry is found Returns true on success, false on failure */ bool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry); /* Gets the directory entry corrsponding to the supplied path entry will be destroyed even if no directory entry is found pathEnd specifies the end of the path string, for cutting strings short if needed specify NULL to use the full length of path pathEnd is only a suggestion, and the path string will be searched up until the next PATH_SEPARATOR after pathEND. Returns true on success, false on failure */ bool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd); /* Changes the current directory to the one specified by path Returns true on success, false on failure */ bool _FAT_directory_chdir (PARTITION* partition, const char* path); /* Removes the directory entry specified by entry Assumes that entry is valid Returns true on success, false on failure */ bool _FAT_directory_removeEntry (PARTITION* partition, DIR_ENTRY* entry); /* Add a directory entry to the directory specified by dirCluster The fileData, dataStart and dataEnd elements of the DIR_ENTRY struct are updated with the new directory entry position and alias. Returns true on success, false on failure */ bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster); /* Get the start cluster of a file from it's entry data */ uint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData); /* Fill in the file name and entry data of DIR_ENTRY* entry. Assumes that the entry's dataStart and dataEnd are correct Returns true on success, false on failure */ bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry); /* Fill in a stat struct based on a file entry */ void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st); /* Get volume label */ bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label); #endif // _DIRECTORY_H desmume-0.9.11/src/utils/libfat/file_allocation_table.h0000755000000000000000000000546112467662066021623 0ustar rootroot/* file_allocation_table.h Reading, writing and manipulation of the FAT structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _FAT_H #define _FAT_H #include "common.h" #include "partition.h" #define CLUSTER_EOF_16 0xFFFF #define CLUSTER_EOF 0x0FFFFFFF #define CLUSTER_FREE 0x00000000 #define CLUSTER_ROOT 0x00000000 #define CLUSTER_FIRST 0x00000002 #define CLUSTER_ERROR 0xFFFFFFFF #define CLUSTERS_PER_FAT12 4085 #define CLUSTERS_PER_FAT16 65525 uint32_t _FAT_fat_nextCluster(PARTITION* partition, uint32_t cluster); uint32_t _FAT_fat_linkFreeCluster(PARTITION* partition, uint32_t cluster); uint32_t _FAT_fat_linkFreeClusterCleared (PARTITION* partition, uint32_t cluster); bool _FAT_fat_clearLinks (PARTITION* partition, uint32_t cluster); uint32_t _FAT_fat_trimChain (PARTITION* partition, uint32_t startCluster, unsigned int chainLength); uint32_t _FAT_fat_lastCluster (PARTITION* partition, uint32_t cluster); unsigned int _FAT_fat_freeClusterCount (PARTITION* partition); static inline sec_t _FAT_fat_clusterToSector (PARTITION* partition, uint32_t cluster) { return (cluster >= CLUSTER_FIRST) ? ((cluster - CLUSTER_FIRST) * (sec_t)partition->sectorsPerCluster) + partition->dataStart : partition->rootDirStart; } static inline bool _FAT_fat_isValidCluster (PARTITION* partition, uint32_t cluster) { return (cluster >= CLUSTER_FIRST) && (cluster <= partition->fat.lastCluster /* This will catch CLUSTER_ERROR */); } #endif // _FAT_H desmume-0.9.11/src/utils/libfat/libfat.cpp0000755000000000000000000001605212467662066017122 0ustar rootroot/* libfat.c Simple functionality for startup, mounting and unmounting of FAT-based devices. Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #include #include #include "common.h" #include "partition.h" #include "fatfile.h" #include "fatdir.h" #include "lock.h" #include "mem_allocate.h" #include "disc.h" #ifndef LIBFAT_PC #include #include #endif static const devoptab_t dotab_fat = { "fat", sizeof (FILE_STRUCT), _FAT_open_r, _FAT_close_r, _FAT_write_r, _FAT_read_r, _FAT_seek_r, _FAT_fstat_r, _FAT_stat_r, _FAT_link_r, _FAT_unlink_r, _FAT_chdir_r, _FAT_rename_r, _FAT_mkdir_r, sizeof (DIR_STATE_STRUCT), _FAT_diropen_r, _FAT_dirreset_r, _FAT_dirnext_r, _FAT_dirclose_r, #ifndef LIBFAT_PC _FAT_statvfs_r, #endif _FAT_ftruncate_r, _FAT_fsync_r, NULL, /* Device data */ NULL, NULL }; #ifdef LIBFAT_PC static devoptab_t* _sole_device = NULL; devoptab_t* GetDeviceOpTab(const char* name) { return _sole_device; } #endif bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage) { PARTITION* partition; devoptab_t* devops; //char* nameCopy; if(!name || strlen(name) > 8 || !interface) return false; if(!interface->startup()) return false; if(!interface->isInserted()) return false; //char devname[10]; //sprintf(devname, "%s:", name); //if(FindDevice(devname) >= 0) // return true; devops = (devoptab_t*)_FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1); if (!devops) { return false; } #ifdef LIBFAT_PC _sole_device = devops; #endif // Use the space allocated at the end of the devoptab struct for storing the name //nameCopy = (char*)(devops+1); // Initialize the file system partition = _FAT_partition_constructor (interface, cacheSize, SectorsPerPage, startSector); if (!partition) { _FAT_mem_free (devops); return false; } // Add an entry for this device to the devoptab table memcpy (devops, &dotab_fat, sizeof(dotab_fat)); //strcpy (nameCopy, name); //devops->name = nameCopy; devops->deviceData = partition; //AddDevice (devops); return true; } bool fatMountSimple (const char* name, const DISC_INTERFACE* interface) { return fatMount (name, interface, 0, DEFAULT_CACHE_PAGES, DEFAULT_SECTORS_PAGE); } void fatUnmountDirect (devoptab_t *devops) { PARTITION* partition = (PARTITION*)devops->deviceData; _FAT_partition_destructor (partition); _FAT_mem_free (devops); _sole_device = NULL; } //void fatUnmount (const char* name) { // devoptab_t *devops; // PARTITION* partition; // // if(!name) // return; // // devops = (devoptab_t*)GetDeviceOpTab (name); // if (!devops) { // return; // } // // // Perform a quick check to make sure we're dealing with a libfat controlled device // //if (devops->open_r != dotab_fat.open_r) { // // return; // //} // // if (RemoveDevice (name) == -1) { // return; // } // // partition = (PARTITION*)devops->deviceData; // _FAT_partition_destructor (partition); // _FAT_mem_free (devops); //} //bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice) { // int i; // int defaultDevice = -1; // const DISC_INTERFACE *disc; // // for (i = 0; // _FAT_disc_interfaces[i].name != NULL && _FAT_disc_interfaces[i].getInterface != NULL; // i++) // { // disc = _FAT_disc_interfaces[i].getInterface(); // if (fatMount (_FAT_disc_interfaces[i].name, disc, 0, cacheSize, DEFAULT_SECTORS_PAGE)) { // // The first device to successfully mount is set as the default // if (defaultDevice < 0) { // defaultDevice = i; // } // } // } // // if (defaultDevice < 0) { // // None of our devices mounted // return false; // } // // if (setAsDefaultDevice) { // char filePath[MAXPATHLEN * 2]; // strcpy (filePath, _FAT_disc_interfaces[defaultDevice].name); // strcat (filePath, ":/"); //#ifdef ARGV_MAGIC // if ( __system_argv->argvMagic == ARGV_MAGIC && __system_argv->argc >= 1 && strrchr( __system_argv->argv[0], '/' )!=NULL ) { // // Check the app's path against each of our mounted devices, to see // // if we can support it. If so, change to that path. // for (i = 0; // _FAT_disc_interfaces[i].name != NULL && _FAT_disc_interfaces[i].getInterface != NULL; // i++) // { // if ( !strncasecmp( __system_argv->argv[0], _FAT_disc_interfaces[i].name, // strlen(_FAT_disc_interfaces[i].name))) // { // char *lastSlash; // strcpy(filePath, __system_argv->argv[0]); // lastSlash = strrchr( filePath, '/' ); // // if ( NULL != lastSlash) { // if ( *(lastSlash - 1) == ':') lastSlash++; // *lastSlash = 0; // } // } // } // } //#endif // chdir (filePath); // } // // return true; //} //bool fatInitDefault (void) { // return fatInit (DEFAULT_CACHE_PAGES, true); //} //void fatGetVolumeLabel (const char* name, char *label) { // devoptab_t *devops; // PARTITION* partition; // char *buf; // int namelen,i; // // if(!name || !label) // return; // // namelen = strlen(name); // buf=(char*)_FAT_mem_allocate(sizeof(char)*namelen+2); // strcpy(buf,name); // // if (name[namelen-1] == '/') { // buf[namelen-1]='\0'; // namelen--; // } // // if (name[namelen-1] != ':') { // buf[namelen]=':'; // buf[namelen+1]='\0'; // } // // devops = (devoptab_t*)GetDeviceOpTab(buf); // // for(i=0;buf[i]!='\0' && buf[i]!=':';i++); // if (!devops || strncasecmp(buf,devops->name,i)) { // _FAT_mem_free(buf); // return; // } // // _FAT_mem_free(buf); // // // Perform a quick check to make sure we're dealing with a libfat controlled device // if (devops->open_r != dotab_fat.open_r) { // return; // } // // partition = (PARTITION*)devops->deviceData; // // if(!_FAT_directory_getVolumeLabel(partition, label)) { // strncpy(label,partition->label,11); // label[11]='\0'; // } // if(!strncmp(label, "NO NAME", 7)) label[0]='\0'; //} desmume-0.9.11/src/utils/libfat/cache.h0000755000000000000000000001151612467662066016371 0ustar rootroot/* cache.h The cache is not visible to the user. It should be flushed when any file is closed or changes are made to the filesystem. This cache implements a least-used-page replacement policy. This will distribute sectors evenly over the pages, so if less than the maximum pages are used at once, they should all eventually remain in the cache. This also has the benefit of throwing out old sectors, so as not to keep too many stale pages around. Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _CACHE_H #define _CACHE_H #include "common.h" #include "disc.h" #define PAGE_SECTORS 64 #define CACHE_PAGE_SIZE (BYTES_PER_READ * PAGE_SECTORS) typedef struct { sec_t sector; unsigned int count; unsigned int last_access; bool dirty; uint8_t* cache; } CACHE_ENTRY; typedef struct { const DISC_INTERFACE* disc; sec_t endOfPartition; unsigned int numberOfPages; unsigned int sectorsPerPage; CACHE_ENTRY* cacheEntries; } CACHE; /* Read data from a sector in the cache If the sector is not in the cache, it will be swapped in offset is the position to start reading from size is the amount of data to read Precondition: offset + size <= BYTES_PER_READ */ bool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size); bool _FAT_cache_readLittleEndianValue (CACHE* cache, uint32_t *value, sec_t sector, unsigned int offset, int num_bytes); /* Write data to a sector in the cache If the sector is not in the cache, it will be swapped in. When the sector is swapped out, the data will be written to the disc offset is the position to start writing to size is the amount of data to write Precondition: offset + size <= BYTES_PER_READ */ bool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size); bool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_t sector, unsigned int offset, int num_bytes); /* Write data to a sector in the cache, zeroing the sector first If the sector is not in the cache, it will be swapped in. When the sector is swapped out, the data will be written to the disc offset is the position to start writing to size is the amount of data to write Precondition: offset + size <= BYTES_PER_READ */ bool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size); /* Read several sectors from the cache */ bool _FAT_cache_readSectors (CACHE* cache, sec_t sector, sec_t numSectors, void* buffer); /* Read a full sector from the cache */ static inline bool _FAT_cache_readSector (CACHE* cache, void* buffer, sec_t sector) { return _FAT_cache_readPartialSector (cache, buffer, sector, 0, BYTES_PER_READ); } /* Write a full sector to the cache */ static inline bool _FAT_cache_writeSector (CACHE* cache, const void* buffer, sec_t sector) { return _FAT_cache_writePartialSector (cache, buffer, sector, 0, BYTES_PER_READ); } bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer); /* Write any dirty sectors back to disc and clear out the contents of the cache */ bool _FAT_cache_flush (CACHE* cache); /* Clear out the contents of the cache without writing any dirty sectors first */ void _FAT_cache_invalidate (CACHE* cache); CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition); void _FAT_cache_destructor (CACHE* cache); #endif // _CACHE_H desmume-0.9.11/src/utils/libfat/mem_allocate.h0000755000000000000000000000357712467662066017760 0ustar rootroot/* mem_allocate.h Memory allocation and destruction calls Replace these calls with custom allocators if malloc is unavailable Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _MEM_ALLOCATE_H #define _MEM_ALLOCATE_H #include static inline void* _FAT_mem_allocate (size_t size) { return malloc (size); } static inline void* _FAT_mem_align (size_t size) { #ifdef __wii__ return memalign (32, size); #else return malloc (size); #endif } static inline void _FAT_mem_free (void* mem) { free (mem); } #endif // _MEM_ALLOCATE_H desmume-0.9.11/src/utils/libfat/fatfile.h0000755000000000000000000000733012467662066016737 0ustar rootroot/* fatfile.h Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _FATFILE_H #define _FATFILE_H #include "common.h" #include "partition.h" #include "directory.h" #ifndef LIBFAT_PC #include #include #endif #define FILE_MAX_SIZE ((uint32_t)0xFFFFFFFF) // 4GiB - 1B typedef struct { u32 cluster; sec_t sector; s32 byte; } FILE_POSITION; struct _FILE_STRUCT; struct _FILE_STRUCT { uint32_t filesize; uint32_t startCluster; uint32_t currentPosition; FILE_POSITION rwPosition; FILE_POSITION appendPosition; DIR_ENTRY_POSITION dirEntryStart; // Points to the start of the LFN entries of a file, or the alias for no LFN DIR_ENTRY_POSITION dirEntryEnd; // Always points to the file's alias entry PARTITION* partition; struct _FILE_STRUCT* prevOpenFile; // The previous entry in a double-linked list of open files struct _FILE_STRUCT* nextOpenFile; // The next entry in a double-linked list of open files bool read; bool write; bool append; bool inUse; bool modified; }; typedef struct _FILE_STRUCT FILE_STRUCT; intptr_t _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode); intptr_t _FAT_close_r (struct _reent *r, intptr_t fd); ssize_t _FAT_write_r (struct _reent *r,intptr_t fd, const char *ptr, size_t len); ssize_t _FAT_read_r (struct _reent *r, intptr_t fd, char *ptr, size_t len); off_t _FAT_seek_r (struct _reent *r, intptr_t fd, off_t pos, int dir); int _FAT_fstat_r (struct _reent *r, intptr_t fd, struct stat *st); int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st); int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink); int _FAT_unlink_r (struct _reent *r, const char *name); int _FAT_chdir_r (struct _reent *r, const char *name); int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName); int _FAT_ftruncate_r (struct _reent *r, intptr_t fd, off_t len); int _FAT_fsync_r (struct _reent *r, intptr_t fd); /* Synchronizes the file data to disc. Does no locking of its own -- lock the partition before calling. Returns 0 on success, an error code on failure. */ extern int _FAT_syncToDisc (FILE_STRUCT* file); #endif // _FATFILE_H desmume-0.9.11/src/utils/libfat/disc.h0000755000000000000000000000715412467662066016253 0ustar rootroot/* disc.h Interface to the low level disc functions. Used by the higher level file system code. Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _DISC_H #define _DISC_H #include "common.h" /* A list of all default devices to try at startup, terminated by a {NULL,NULL} entry. */ typedef struct { const char* name; const DISC_INTERFACE* (*getInterface)(void); } INTERFACE_ID; extern const INTERFACE_ID _FAT_disc_interfaces[]; /* Check if a disc is inserted Return true if a disc is inserted and ready, false otherwise */ static inline bool _FAT_disc_isInserted (const DISC_INTERFACE* disc) { return disc->isInserted(); } /* Read numSectors sectors from a disc, starting at sector. numSectors is between 1 and LIMIT_SECTORS if LIMIT_SECTORS is defined, else it is at least 1 sector is 0 or greater buffer is a pointer to the memory to fill */ static inline bool _FAT_disc_readSectors (const DISC_INTERFACE* disc, sec_t sector, sec_t numSectors, void* buffer) { return disc->readSectors (sector, numSectors, buffer); } /* Write numSectors sectors to a disc, starting at sector. numSectors is between 1 and LIMIT_SECTORS if LIMIT_SECTORS is defined, else it is at least 1 sector is 0 or greater buffer is a pointer to the memory to read from */ static inline bool _FAT_disc_writeSectors (const DISC_INTERFACE* disc, sec_t sector, sec_t numSectors, const void* buffer) { return disc->writeSectors (sector, numSectors, buffer); } /* Reset the card back to a ready state */ static inline bool _FAT_disc_clearStatus (const DISC_INTERFACE* disc) { return disc->clearStatus(); } /* Initialise the disc to a state ready for data reading or writing */ static inline bool _FAT_disc_startup (const DISC_INTERFACE* disc) { return disc->startup(); } /* Put the disc in a state ready for power down. Complete any pending writes and disable the disc if necessary */ static inline bool _FAT_disc_shutdown (const DISC_INTERFACE* disc) { return disc->shutdown(); } /* Return a 32 bit value unique to each type of interface */ static inline uint32_t _FAT_disc_hostType (const DISC_INTERFACE* disc) { return disc->ioType; } /* Return a 32 bit value that specifies the capabilities of the disc */ static inline uint32_t _FAT_disc_features (const DISC_INTERFACE* disc) { return disc->features; } #endif // _DISC_H desmume-0.9.11/src/utils/libfat/cache.cpp0000755000000000000000000002444012467662066016724 0ustar rootroot/* cache.c The cache is not visible to the user. It should be flushed when any file is closed or changes are made to the filesystem. This cache implements a least-used-page replacement policy. This will distribute sectors evenly over the pages, so if less than the maximum pages are used at once, they should all eventually remain in the cache. This also has the benefit of throwing out old sectors, so as not to keep too many stale pages around. Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #include #include #include "common.h" #include "cache.h" #include "disc.h" #include "mem_allocate.h" #include "bit_ops.h" #include "file_allocation_table.h" #define CACHE_FREE UINT_MAX CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition) { CACHE* cache; unsigned int i; CACHE_ENTRY* cacheEntries; if (numberOfPages < 2) { numberOfPages = 2; } if (sectorsPerPage < 8) { sectorsPerPage = 8; } cache = (CACHE*) _FAT_mem_allocate (sizeof(CACHE)); if (cache == NULL) { return NULL; } cache->disc = discInterface; cache->endOfPartition = endOfPartition; cache->numberOfPages = numberOfPages; cache->sectorsPerPage = sectorsPerPage; cacheEntries = (CACHE_ENTRY*) _FAT_mem_allocate ( sizeof(CACHE_ENTRY) * numberOfPages); if (cacheEntries == NULL) { _FAT_mem_free (cache); return NULL; } for (i = 0; i < numberOfPages; i++) { cacheEntries[i].sector = CACHE_FREE; cacheEntries[i].count = 0; cacheEntries[i].last_access = 0; cacheEntries[i].dirty = false; cacheEntries[i].cache = (uint8_t*) _FAT_mem_align ( sectorsPerPage * BYTES_PER_READ ); } cache->cacheEntries = cacheEntries; return cache; } void _FAT_cache_destructor (CACHE* cache) { unsigned int i; // Clear out cache before destroying it _FAT_cache_flush(cache); // Free memory in reverse allocation order for (i = 0; i < cache->numberOfPages; i++) { _FAT_mem_free (cache->cacheEntries[i].cache); } _FAT_mem_free (cache->cacheEntries); _FAT_mem_free (cache); } static u32 accessCounter = 0; static u32 accessTime(){ accessCounter++; return accessCounter; } static CACHE_ENTRY* _FAT_cache_getPage(CACHE *cache,sec_t sector) { unsigned int i; CACHE_ENTRY* cacheEntries = cache->cacheEntries; unsigned int numberOfPages = cache->numberOfPages; unsigned int sectorsPerPage = cache->sectorsPerPage; bool foundFree = false; unsigned int oldUsed = 0; unsigned int oldAccess = UINT_MAX; for(i=0;i=cacheEntries[i].sector && sector<(cacheEntries[i].sector + cacheEntries[i].count)) { cacheEntries[i].last_access = accessTime(); return &(cacheEntries[i]); } if(foundFree==false && (cacheEntries[i].sector==CACHE_FREE || cacheEntries[i].last_accessdisc,cacheEntries[oldUsed].sector,cacheEntries[oldUsed].count,cacheEntries[oldUsed].cache)) return NULL; cacheEntries[oldUsed].dirty = false; } sector = (sector/sectorsPerPage)*sectorsPerPage; // align base sector to page size sec_t next_page = sector + sectorsPerPage; if(next_page > cache->endOfPartition) next_page = cache->endOfPartition; if(!_FAT_disc_readSectors(cache->disc,sector,next_page-sector,cacheEntries[oldUsed].cache)) return NULL; cacheEntries[oldUsed].sector = sector; cacheEntries[oldUsed].count = next_page-sector; cacheEntries[oldUsed].last_access = accessTime(); return &(cacheEntries[oldUsed]); } bool _FAT_cache_readSectors(CACHE *cache,sec_t sector,sec_t numSectors,void *buffer) { sec_t sec; sec_t secs_to_read; CACHE_ENTRY *entry; uint8_t *dest = (uint8_t *)buffer; while(numSectors>0) { entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; secs_to_read = entry->count - sec; if(secs_to_read>numSectors) secs_to_read = numSectors; memcpy(dest,entry->cache + (sec*BYTES_PER_READ),(secs_to_read*BYTES_PER_READ)); dest += (secs_to_read*BYTES_PER_READ); sector += secs_to_read; numSectors -= secs_to_read; } return true; } /* Reads some data from a cache page, determined by the sector number */ bool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size) { sec_t sec; CACHE_ENTRY *entry; if (offset + size > BYTES_PER_READ) return false; entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; memcpy(buffer,entry->cache + ((sec*BYTES_PER_READ) + offset),size); return true; } bool _FAT_cache_readLittleEndianValue (CACHE* cache, uint32_t *value, sec_t sector, unsigned int offset, int num_bytes) { uint8_t buf[4]; if (!_FAT_cache_readPartialSector(cache, buf, sector, offset, num_bytes)) return false; switch(num_bytes) { case 1: *value = buf[0]; break; case 2: *value = u8array_to_u16(buf,0); break; case 4: *value = u8array_to_u32(buf,0); break; default: return false; } return true; } /* Writes some data to a cache page, making sure it is loaded into memory first. */ bool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size) { sec_t sec; CACHE_ENTRY *entry; if (offset + size > BYTES_PER_READ) return false; entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; memcpy(entry->cache + ((sec*BYTES_PER_READ) + offset),buffer,size); entry->dirty = true; return true; } bool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_t sector, unsigned int offset, int size) { uint8_t buf[4] = {0, 0, 0, 0}; switch(size) { case 1: buf[0] = value; break; case 2: u16_to_u8array(buf, 0, value); break; case 4: u32_to_u8array(buf, 0, value); break; default: return false; } return _FAT_cache_writePartialSector(cache, buf, sector, offset, size); } /* Writes some data to a cache page, zeroing out the page first */ bool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size) { sec_t sec; CACHE_ENTRY *entry; if (offset + size > BYTES_PER_READ) return false; entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; memset(entry->cache + (sec*BYTES_PER_READ),0,BYTES_PER_READ); memcpy(entry->cache + ((sec*BYTES_PER_READ) + offset),buffer,size); entry->dirty = true; return true; } static CACHE_ENTRY* _FAT_cache_findPage(CACHE *cache, sec_t sector, sec_t count) { unsigned int i; CACHE_ENTRY* cacheEntries = cache->cacheEntries; unsigned int numberOfPages = cache->numberOfPages; CACHE_ENTRY *entry = NULL; sec_t lowest = UINT_MAX; for(i=0;i cacheEntries[i].sector) { intersect = sector - cacheEntries[i].sector < cacheEntries[i].count; } else { intersect = cacheEntries[i].sector - sector < count; } if ( intersect && (cacheEntries[i].sector < lowest)) { lowest = cacheEntries[i].sector; entry = &cacheEntries[i]; } } } return entry; } bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer) { sec_t sec; sec_t secs_to_write; CACHE_ENTRY* entry; const uint8_t *src = (const uint8_t *)buffer; while(numSectors>0) { entry = _FAT_cache_findPage(cache,sector,numSectors); if(entry!=NULL) { if ( entry->sector > sector) { secs_to_write = entry->sector - sector; _FAT_disc_writeSectors(cache->disc,sector,secs_to_write,src); src += (secs_to_write*BYTES_PER_READ); sector += secs_to_write; numSectors -= secs_to_write; } sec = sector - entry->sector; secs_to_write = entry->count - sec; if(secs_to_write>numSectors) secs_to_write = numSectors; memcpy(entry->cache + (sec*BYTES_PER_READ),src,(secs_to_write*BYTES_PER_READ)); src += (secs_to_write*BYTES_PER_READ); sector += secs_to_write; numSectors -= secs_to_write; entry->dirty = true; } else { _FAT_disc_writeSectors(cache->disc,sector,numSectors,src); numSectors=0; } } return true; } /* Flushes all dirty pages to disc, clearing the dirty flag. */ bool _FAT_cache_flush (CACHE* cache) { unsigned int i; for (i = 0; i < cache->numberOfPages; i++) { if (cache->cacheEntries[i].dirty) { if (!_FAT_disc_writeSectors (cache->disc, cache->cacheEntries[i].sector, cache->cacheEntries[i].count, cache->cacheEntries[i].cache)) { return false; } } cache->cacheEntries[i].dirty = false; } return true; } void _FAT_cache_invalidate (CACHE* cache) { unsigned int i; _FAT_cache_flush(cache); for (i = 0; i < cache->numberOfPages; i++) { cache->cacheEntries[i].sector = CACHE_FREE; cache->cacheEntries[i].last_access = 0; cache->cacheEntries[i].count = 0; cache->cacheEntries[i].dirty = false; } } desmume-0.9.11/src/utils/libfat/common.h0000755000000000000000000000537712467662066016626 0ustar rootroot/* common.h Common definitions and included files for the FATlib Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _COMMON_H #define _COMMON_H #define BYTES_PER_READ 512 #include #ifndef _MSC_VER #include #endif // When compiling for NDS, make sure NDS is defined #ifndef NDS #if defined ARM9 || defined ARM7 #define NDS #endif #endif // Platform specific includes #if defined(__gamecube__) || defined (__wii__) #include #include #include #elif defined(NDS) #include #include #include #elif defined(GBA) #include #include #endif // Platform specific options #if defined (__wii__) #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 64 #define USE_LWP_LOCK #define USE_RTC_TIME #elif defined (__gamecube__) #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 64 #define USE_LWP_LOCK #define USE_RTC_TIME #elif defined (NDS) #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 8 #define USE_RTC_TIME #elif defined (GBA) #define DEFAULT_CACHE_PAGES 2 #define DEFAULT_SECTORS_PAGE 8 #define LIMIT_SECTORS 128 #else #define LIBFAT_PC 1 //any particular reason for this? #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 8 #endif #include "libfat_pc.h" #include "fat.h" #endif // _COMMON_H desmume-0.9.11/src/utils/libfat/filetime.cpp0000755000000000000000000000635312467662066017462 0ustar rootroot/* filetime.c Conversion of file time and date values to various other types Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #include #include "filetime.h" #include "common.h" #define MAX_HOUR 23 #define MAX_MINUTE 59 #define MAX_SECOND 59 #define MAX_MONTH 11 #define MIN_MONTH 0 #define MAX_DAY 31 #define MIN_DAY 1 uint16_t _FAT_filetime_getTimeFromRTC (void) { #ifdef USE_RTC_TIME struct tm timeParts; time_t epochTime; if (time(&epochTime) == (time_t)-1) { return 0; } localtime_r(&epochTime, &timeParts); // Check that the values are all in range. // If they are not, return 0 (no timestamp) if ((timeParts.tm_hour < 0) || (timeParts.tm_hour > MAX_HOUR)) return 0; if ((timeParts.tm_min < 0) || (timeParts.tm_min > MAX_MINUTE)) return 0; if ((timeParts.tm_sec < 0) || (timeParts.tm_sec > MAX_SECOND)) return 0; return ( ((timeParts.tm_hour & 0x1F) << 11) | ((timeParts.tm_min & 0x3F) << 5) | ((timeParts.tm_sec >> 1) & 0x1F) ); #else return 0; #endif } uint16_t _FAT_filetime_getDateFromRTC (void) { #ifdef USE_RTC_TIME struct tm timeParts; time_t epochTime; if (time(&epochTime) == (time_t)-1) { return 0; } localtime_r(&epochTime, &timeParts); if ((timeParts.tm_mon < MIN_MONTH) || (timeParts.tm_mon > MAX_MONTH)) return 0; if ((timeParts.tm_mday < MIN_DAY) || (timeParts.tm_mday > MAX_DAY)) return 0; return ( (((timeParts.tm_year - 80) & 0x7F) <<9) | // Adjust for MS-FAT base year (1980 vs 1900 for tm_year) (((timeParts.tm_mon + 1) & 0xF) << 5) | (timeParts.tm_mday & 0x1F) ); #else return 0; #endif } time_t _FAT_filetime_to_time_t (uint16_t t, uint16_t d) { struct tm timeParts; timeParts.tm_hour = t >> 11; timeParts.tm_min = (t >> 5) & 0x3F; timeParts.tm_sec = (t & 0x1F) << 1; timeParts.tm_mday = d & 0x1F; timeParts.tm_mon = ((d >> 5) & 0x0F) - 1; timeParts.tm_year = (d >> 9) + 80; timeParts.tm_isdst = 0; return mktime(&timeParts); } desmume-0.9.11/src/utils/libfat/partition.h0000755000000000000000000000642612467662066017343 0ustar rootroot/* partition.h Functions for mounting and dismounting partitions on various block devices. Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _PARTITION_H #define _PARTITION_H #include "common.h" #include "cache.h" #include "lock.h" // Device name extern const char* DEVICE_NAME; // Filesystem type typedef enum {FS_UNKNOWN, FS_FAT12, FS_FAT16, FS_FAT32} FS_TYPE; typedef struct { sec_t fatStart; uint32_t sectorsPerFat; uint32_t lastCluster; uint32_t firstFree; } FAT; typedef struct { const DISC_INTERFACE* disc; CACHE* cache; // Info about the partition FS_TYPE filesysType; uint64_t totalSize; sec_t rootDirStart; uint32_t rootDirCluster; uint32_t numberOfSectors; sec_t dataStart; uint32_t bytesPerSector; uint32_t sectorsPerCluster; uint32_t bytesPerCluster; FAT fat; // Values that may change after construction uint32_t cwdCluster; // Current working directory cluster int openFileCount; struct _FILE_STRUCT* firstOpenFile; // The start of a linked list of files mutex_t lock; // A lock for partition operations bool readOnly; // If this is set, then do not try writing to the disc char label[12]; // Volume label } PARTITION; /* Mount the supplied device and return a pointer to the struct necessary to use it */ PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t SectorsPerPage, sec_t startSector); /* Dismount the device and free all structures used. Will also attempt to synchronise all open files to disc. */ void _FAT_partition_destructor (PARTITION* partition); /* Return the partition specified in a path, as taken from the devoptab. */ PARTITION* _FAT_partition_getPartitionFromPath (const char* path); #endif // _PARTITION_H desmume-0.9.11/src/utils/libfat/file_allocation_table.cpp0000755000000000000000000002635012467662066022156 0ustar rootroot/* file_allocation_table.c Reading, writing and manipulation of the FAT structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #include "file_allocation_table.h" #include "partition.h" #include /* Gets the cluster linked from input cluster */ uint32_t _FAT_fat_nextCluster(PARTITION* partition, uint32_t cluster) { uint32_t nextCluster = CLUSTER_FREE; sec_t sector; int offset; if (cluster == CLUSTER_FREE) { return CLUSTER_FREE; } switch (partition->filesysType) { case FS_UNKNOWN: return CLUSTER_ERROR; break; case FS_FAT12: { u32 nextCluster_h; sector = partition->fat.fatStart + (((cluster * 3) / 2) / BYTES_PER_READ); offset = ((cluster * 3) / 2) % BYTES_PER_READ; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u8)); offset++; if (offset >= BYTES_PER_READ) { offset = 0; sector++; } nextCluster_h = 0; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster_h, sector, offset, sizeof(u8)); nextCluster |= (nextCluster_h << 8); if (cluster & 0x01) { nextCluster = nextCluster >> 4; } else { nextCluster &= 0x0FFF; } if (nextCluster >= 0x0FF7) { nextCluster = CLUSTER_EOF; } break; } case FS_FAT16: sector = partition->fat.fatStart + ((cluster << 1) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 1)) << 1; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u16)); if (nextCluster >= 0xFFF7) { nextCluster = CLUSTER_EOF; } break; case FS_FAT32: sector = partition->fat.fatStart + ((cluster << 2) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 2)) << 2; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u32)); if (nextCluster >= 0x0FFFFFF7) { nextCluster = CLUSTER_EOF; } break; default: return CLUSTER_ERROR; break; } return nextCluster; } /* writes value into the correct offset within a partition's FAT, based on the cluster number. */ static bool _FAT_fat_writeFatEntry (PARTITION* partition, uint32_t cluster, uint32_t value) { sec_t sector; int offset; uint32_t oldValue; if ((cluster < CLUSTER_FIRST) || (cluster > partition->fat.lastCluster /* This will catch CLUSTER_ERROR */)) { return false; } switch (partition->filesysType) { case FS_UNKNOWN: return false; break; case FS_FAT12: sector = partition->fat.fatStart + (((cluster * 3) / 2) / BYTES_PER_READ); offset = ((cluster * 3) / 2) % BYTES_PER_READ; if (cluster & 0x01) { _FAT_cache_readLittleEndianValue (partition->cache, &oldValue, sector, offset, sizeof(u8)); value = (value << 4) | (oldValue & 0x0F); _FAT_cache_writeLittleEndianValue (partition->cache, value & 0xFF, sector, offset, sizeof(u8)); offset++; if (offset >= BYTES_PER_READ) { offset = 0; sector++; } _FAT_cache_writeLittleEndianValue (partition->cache, (value >> 8) & 0xFF, sector, offset, sizeof(u8)); } else { _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u8)); offset++; if (offset >= BYTES_PER_READ) { offset = 0; sector++; } _FAT_cache_readLittleEndianValue (partition->cache, &oldValue, sector, offset, sizeof(u8)); value = ((value >> 8) & 0x0F) | (oldValue & 0xF0); _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u8)); } break; case FS_FAT16: sector = partition->fat.fatStart + ((cluster << 1) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 1)) << 1; _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u16)); break; case FS_FAT32: sector = partition->fat.fatStart + ((cluster << 2) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 2)) << 2; _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u32)); break; default: return false; break; } return true; } /*----------------------------------------------------------------- gets the first available free cluster, sets it to end of file, links the input cluster to it then returns the cluster number If an error occurs, return CLUSTER_ERROR -----------------------------------------------------------------*/ uint32_t _FAT_fat_linkFreeCluster(PARTITION* partition, uint32_t cluster) { uint32_t firstFree; uint32_t curLink; uint32_t lastCluster; bool loopedAroundFAT = false; lastCluster = partition->fat.lastCluster; if (cluster > lastCluster) { return CLUSTER_ERROR; } // Check if the cluster already has a link, and return it if so curLink = _FAT_fat_nextCluster(partition, cluster); if ((curLink >= CLUSTER_FIRST) && (curLink <= lastCluster)) { return curLink; // Return the current link - don't allocate a new one } // Get a free cluster firstFree = partition->fat.firstFree; // Start at first valid cluster if (firstFree < CLUSTER_FIRST) { firstFree = CLUSTER_FIRST; } // Search until a free cluster is found while (_FAT_fat_nextCluster(partition, firstFree) != CLUSTER_FREE) { firstFree++; if (firstFree > lastCluster) { if (loopedAroundFAT) { // If couldn't get a free cluster then return an error partition->fat.firstFree = firstFree; return CLUSTER_ERROR; } else { // Try looping back to the beginning of the FAT // This was suggested by loopy firstFree = CLUSTER_FIRST; loopedAroundFAT = true; } } } partition->fat.firstFree = firstFree; if ((cluster >= CLUSTER_FIRST) && (cluster < lastCluster)) { // Update the linked from FAT entry _FAT_fat_writeFatEntry (partition, cluster, firstFree); } // Create the linked to FAT entry _FAT_fat_writeFatEntry (partition, firstFree, CLUSTER_EOF); return firstFree; } /*----------------------------------------------------------------- gets the first available free cluster, sets it to end of file, links the input cluster to it, clears the new cluster to 0 valued bytes, then returns the cluster number If an error occurs, return CLUSTER_ERROR -----------------------------------------------------------------*/ uint32_t _FAT_fat_linkFreeClusterCleared (PARTITION* partition, uint32_t cluster) { uint32_t newCluster; uint32_t i; uint8_t emptySector[BYTES_PER_READ]; // Link the cluster newCluster = _FAT_fat_linkFreeCluster(partition, cluster); if (newCluster == CLUSTER_FREE || newCluster == CLUSTER_ERROR) { return CLUSTER_ERROR; } // Clear all the sectors within the cluster memset (emptySector, 0, BYTES_PER_READ); for (i = 0; i < partition->sectorsPerCluster; i++) { _FAT_cache_writeSectors (partition->cache, _FAT_fat_clusterToSector (partition, newCluster) + i, 1, emptySector); } return newCluster; } /*----------------------------------------------------------------- _FAT_fat_clearLinks frees any cluster used by a file -----------------------------------------------------------------*/ bool _FAT_fat_clearLinks (PARTITION* partition, uint32_t cluster) { uint32_t nextCluster; if ((cluster < CLUSTER_FIRST) || (cluster > partition->fat.lastCluster /* This will catch CLUSTER_ERROR */)) return false; // If this clears up more space in the FAT before the current free pointer, move it backwards if (cluster < partition->fat.firstFree) { partition->fat.firstFree = cluster; } while ((cluster != CLUSTER_EOF) && (cluster != CLUSTER_FREE) && (cluster != CLUSTER_ERROR)) { // Store next cluster before erasing the link nextCluster = _FAT_fat_nextCluster (partition, cluster); // Erase the link _FAT_fat_writeFatEntry (partition, cluster, CLUSTER_FREE); // Move onto next cluster cluster = nextCluster; } return true; } /*----------------------------------------------------------------- _FAT_fat_trimChain Drop all clusters past the chainLength. If chainLength is 0, all clusters are dropped. If chainLength is 1, the first cluster is kept and the rest are dropped, and so on. Return the last cluster left in the chain. -----------------------------------------------------------------*/ uint32_t _FAT_fat_trimChain (PARTITION* partition, uint32_t startCluster, unsigned int chainLength) { uint32_t nextCluster; if (chainLength == 0) { // Drop the entire chain _FAT_fat_clearLinks (partition, startCluster); return CLUSTER_FREE; } else { // Find the last cluster in the chain, and the one after it chainLength--; nextCluster = _FAT_fat_nextCluster (partition, startCluster); while ((chainLength > 0) && (nextCluster != CLUSTER_FREE) && (nextCluster != CLUSTER_EOF)) { chainLength--; startCluster = nextCluster; nextCluster = _FAT_fat_nextCluster (partition, startCluster); } // Drop all clusters after the last in the chain if (nextCluster != CLUSTER_FREE && nextCluster != CLUSTER_EOF) { _FAT_fat_clearLinks (partition, nextCluster); } // Mark the last cluster in the chain as the end of the file _FAT_fat_writeFatEntry (partition, startCluster, CLUSTER_EOF); return startCluster; } } /*----------------------------------------------------------------- _FAT_fat_lastCluster Trace the cluster links until the last one is found -----------------------------------------------------------------*/ uint32_t _FAT_fat_lastCluster (PARTITION* partition, uint32_t cluster) { while ((_FAT_fat_nextCluster(partition, cluster) != CLUSTER_FREE) && (_FAT_fat_nextCluster(partition, cluster) != CLUSTER_EOF)) { cluster = _FAT_fat_nextCluster(partition, cluster); } return cluster; } /*----------------------------------------------------------------- _FAT_fat_freeClusterCount Return the number of free clusters available -----------------------------------------------------------------*/ unsigned int _FAT_fat_freeClusterCount (PARTITION* partition) { unsigned int count = 0; uint32_t curCluster; for (curCluster = CLUSTER_FIRST; curCluster <= partition->fat.lastCluster; curCluster++) { if (_FAT_fat_nextCluster(partition, curCluster) == CLUSTER_FREE) { count++; } } return count; } desmume-0.9.11/src/utils/libfat/lock.cpp0000755000000000000000000000054112467662066016605 0ustar rootroot#include "common.h" #ifndef USE_LWP_LOCK #ifndef mutex_t typedef int mutex_t; #endif void _ATTR_WEAK_ _FAT_lock_init(mutex_t *mutex) { return; } void _ATTR_WEAK_ _FAT_lock_deinit(mutex_t *mutex) { return; } void _ATTR_WEAK_ _FAT_lock(mutex_t *mutex) { return; } void _ATTR_WEAK_ _FAT_unlock(mutex_t *mutex) { return; } #endif // USE_LWP_LOCK desmume-0.9.11/src/utils/libfat/bit_ops.h0000755000000000000000000000473512467662066016772 0ustar rootroot/* bit_ops.h Functions for dealing with conversion of data between types Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #ifndef _BIT_OPS_H #define _BIT_OPS_H #ifndef _MSC_VER #include #endif /*----------------------------------------------------------------- Functions to deal with little endian values stored in uint8_t arrays -----------------------------------------------------------------*/ static inline uint16_t u8array_to_u16 (const uint8_t* item, int offset) { return ( item[offset] | (item[offset + 1] << 8)); } static inline uint32_t u8array_to_u32 (const uint8_t* item, int offset) { return ( item[offset] | (item[offset + 1] << 8) | (item[offset + 2] << 16) | (item[offset + 3] << 24)); } static inline void u16_to_u8array (uint8_t* item, int offset, uint16_t value) { item[offset] = (uint8_t) value; item[offset + 1] = (uint8_t)(value >> 8); } static inline void u32_to_u8array (uint8_t* item, int offset, uint32_t value) { item[offset] = (uint8_t) value; item[offset + 1] = (uint8_t)(value >> 8); item[offset + 2] = (uint8_t)(value >> 16); item[offset + 3] = (uint8_t)(value >> 24); } #endif // _BIT_OPS_H desmume-0.9.11/src/utils/libfat/lock.h0000755000000000000000000000406112467662066016253 0ustar rootroot/* lock.h Copyright (c) 2008 Sven Peter 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 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. */ #ifndef _LOCK_H #define _LOCK_H #include "common.h" #ifdef USE_LWP_LOCK static inline void _FAT_lock_init(mutex_t *mutex) { LWP_MutexInit(mutex, false); } static inline void _FAT_lock_deinit(mutex_t *mutex) { LWP_MutexDestroy(*mutex); } static inline void _FAT_lock(mutex_t *mutex) { LWP_MutexLock(*mutex); } static inline void _FAT_unlock(mutex_t *mutex) { LWP_MutexUnlock(*mutex); } #else // We still need a blank lock type #ifndef mutex_t typedef int mutex_t; #endif void _FAT_lock_init(mutex_t *mutex); void _FAT_lock_deinit(mutex_t *mutex); void _FAT_lock(mutex_t *mutex); void _FAT_unlock(mutex_t *mutex); #endif // USE_LWP_LOCK #endif // _LOCK_H desmume-0.9.11/src/utils/libfat/fatdir.cpp0000755000000000000000000004271712467662066017141 0ustar rootroot/* fatdir.c Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #include #include #include #ifndef _MSC_VER #include #include #endif #include "fatdir.h" #include "cache.h" #include "file_allocation_table.h" #include "partition.h" #include "directory.h" #include "bit_ops.h" #include "filetime.h" #include "lock.h" int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st) { PARTITION* partition = NULL; DIR_ENTRY dirEntry; // Get the partition this file is on partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Search for the file on the disc if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, NULL)) { _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } // Fill in the stat struct _FAT_directory_entryStat (partition, &dirEntry, st); _FAT_unlock(&partition->lock); return 0; } int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink) { r->_errno = ENOTSUP; return -1; } int _FAT_unlink_r (struct _reent *r, const char *path) { PARTITION* partition = NULL; DIR_ENTRY dirEntry; DIR_ENTRY dirContents; uint32_t cluster; bool nextEntry; bool errorOccured = false; // Get the partition this directory is on partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Make sure we aren't trying to write to a read-only disc if (partition->readOnly) { r->_errno = EROFS; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Search for the file on the disc if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, NULL)) { _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } cluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // If this is a directory, make sure it is empty if (_FAT_directory_isDirectory (&dirEntry)) { nextEntry = _FAT_directory_getFirstEntry (partition, &dirContents, cluster); while (nextEntry) { if (!_FAT_directory_isDot (&dirContents)) { // The directory had something in it that isn't a reference to itself or it's parent _FAT_unlock(&partition->lock); r->_errno = EPERM; return -1; } nextEntry = _FAT_directory_getNextEntry (partition, &dirContents); } } if (_FAT_fat_isValidCluster(partition, cluster)) { // Remove the cluster chain for this file if (!_FAT_fat_clearLinks (partition, cluster)) { r->_errno = EIO; errorOccured = true; } } // Remove the directory entry for this file if (!_FAT_directory_removeEntry (partition, &dirEntry)) { r->_errno = EIO; errorOccured = true; } // Flush any sectors in the disc cache if (!_FAT_cache_flush(partition->cache)) { r->_errno = EIO; errorOccured = true; } _FAT_unlock(&partition->lock); if (errorOccured) { return -1; } else { return 0; } } int _FAT_chdir_r (struct _reent *r, const char *path) { PARTITION* partition = NULL; // Get the partition this directory is on partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Try changing directory if (_FAT_directory_chdir (partition, path)) { // Successful _FAT_unlock(&partition->lock); return 0; } else { // Failed _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } } int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName) { PARTITION* partition = NULL; DIR_ENTRY oldDirEntry; DIR_ENTRY newDirEntry; const char *pathEnd; uint32_t dirCluster; // Get the partition this directory is on partition = _FAT_partition_getPartitionFromPath (oldName); if (partition == NULL) { r->_errno = ENODEV; return -1; } _FAT_lock(&partition->lock); // Make sure the same partition is used for the old and new names if (partition != _FAT_partition_getPartitionFromPath (newName)) { _FAT_unlock(&partition->lock); r->_errno = EXDEV; return -1; } // Make sure we aren't trying to write to a read-only disc if (partition->readOnly) { _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Move the path pointer to the start of the actual path if (strchr (oldName, ':') != NULL) { oldName = strchr (oldName, ':') + 1; } if (strchr (oldName, ':') != NULL) { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } if (strchr (newName, ':') != NULL) { newName = strchr (newName, ':') + 1; } if (strchr (newName, ':') != NULL) { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } // Search for the file on the disc if (!_FAT_directory_entryFromPath (partition, &oldDirEntry, oldName, NULL)) { _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } // Make sure there is no existing file / directory with the new name if (_FAT_directory_entryFromPath (partition, &newDirEntry, newName, NULL)) { _FAT_unlock(&partition->lock); r->_errno = EEXIST; return -1; } // Create the new file entry // Get the directory it has to go in pathEnd = strrchr (newName, DIR_SEPARATOR); if (pathEnd == NULL) { // No path was specified dirCluster = partition->cwdCluster; pathEnd = newName; } else { // Path was specified -- get the right dirCluster // Recycling newDirEntry, since it needs to be recreated anyway if (!_FAT_directory_entryFromPath (partition, &newDirEntry, newName, pathEnd) || !_FAT_directory_isDirectory(&newDirEntry)) { _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } dirCluster = _FAT_directory_entryGetCluster (partition, newDirEntry.entryData); // Move the pathEnd past the last DIR_SEPARATOR pathEnd += 1; } // Copy the entry data memcpy (&newDirEntry, &oldDirEntry, sizeof(DIR_ENTRY)); // Set the new name strncpy (newDirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1); // Write the new entry if (!_FAT_directory_addEntry (partition, &newDirEntry, dirCluster)) { _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } // Remove the old entry if (!_FAT_directory_removeEntry (partition, &oldDirEntry)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } // Flush any sectors in the disc cache if (!_FAT_cache_flush (partition->cache)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } _FAT_unlock(&partition->lock); return 0; } int _FAT_mkdir_r (struct _reent *r, const char *path, int mode) { PARTITION* partition = NULL; bool fileExists; DIR_ENTRY dirEntry; const char* pathEnd; uint32_t parentCluster, dirCluster; uint8_t newEntryData[DIR_ENTRY_DATA_SIZE]; partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Search for the file/directory on the disc fileExists = _FAT_directory_entryFromPath (partition, &dirEntry, path, NULL); // Make sure it doesn't exist if (fileExists) { _FAT_unlock(&partition->lock); r->_errno = EEXIST; return -1; } if (partition->readOnly) { // We can't write to a read-only partition _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Get the directory it has to go in pathEnd = strrchr (path, DIR_SEPARATOR); if (pathEnd == NULL) { // No path was specified parentCluster = partition->cwdCluster; pathEnd = path; } else { // Path was specified -- get the right parentCluster // Recycling dirEntry, since it needs to be recreated anyway if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) || !_FAT_directory_isDirectory(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } parentCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // Move the pathEnd past the last DIR_SEPARATOR pathEnd += 1; } // Create the entry data strncpy (dirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1); memset (dirEntry.entryData, 0, DIR_ENTRY_DATA_SIZE); // Set the creation time and date dirEntry.entryData[DIR_ENTRY_cTime_ms] = 0; u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cDate, _FAT_filetime_getDateFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_mTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_mDate, _FAT_filetime_getDateFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_aDate, _FAT_filetime_getDateFromRTC()); // Set the directory attribute dirEntry.entryData[DIR_ENTRY_attributes] = ATTRIB_DIR; // Get a cluster for the new directory dirCluster = _FAT_fat_linkFreeClusterCleared (partition, CLUSTER_FREE); if (!_FAT_fat_isValidCluster(partition, dirCluster)) { // No space left on disc for the cluster _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cluster, dirCluster); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_clusterHigh, dirCluster >> 16); // Write the new directory's entry to it's parent if (!_FAT_directory_addEntry (partition, &dirEntry, parentCluster)) { _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } // Create the dot entry within the directory memset (newEntryData, 0, DIR_ENTRY_DATA_SIZE); memset (newEntryData, ' ', 11); newEntryData[DIR_ENTRY_name] = '.'; newEntryData[DIR_ENTRY_attributes] = ATTRIB_DIR; u16_to_u8array (newEntryData, DIR_ENTRY_cluster, dirCluster); u16_to_u8array (newEntryData, DIR_ENTRY_clusterHigh, dirCluster >> 16); // Write it to the directory, erasing that sector in the process _FAT_cache_eraseWritePartialSector ( partition->cache, newEntryData, _FAT_fat_clusterToSector (partition, dirCluster), 0, DIR_ENTRY_DATA_SIZE); // Create the double dot entry within the directory // if ParentDir == Rootdir then ".."" always link to Cluster 0 if(parentCluster == partition->rootDirCluster) parentCluster = FAT16_ROOT_DIR_CLUSTER; newEntryData[DIR_ENTRY_name + 1] = '.'; u16_to_u8array (newEntryData, DIR_ENTRY_cluster, parentCluster); u16_to_u8array (newEntryData, DIR_ENTRY_clusterHigh, parentCluster >> 16); // Write it to the directory _FAT_cache_writePartialSector ( partition->cache, newEntryData, _FAT_fat_clusterToSector (partition, dirCluster), DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); // Flush any sectors in the disc cache if (!_FAT_cache_flush(partition->cache)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } _FAT_unlock(&partition->lock); return 0; } // //int _FAT_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf) //{ // PARTITION* partition = NULL; // unsigned int freeClusterCount; // // // Get the partition of the requested path // partition = _FAT_partition_getPartitionFromPath (path); // if (partition == NULL) { // r->_errno = ENODEV; // return -1; // } // // _FAT_lock(&partition->lock); // // freeClusterCount = _FAT_fat_freeClusterCount (partition); // // // FAT clusters = POSIX blocks // buf->f_bsize = partition->bytesPerCluster; // File system block size. // buf->f_frsize = partition->bytesPerCluster; // Fundamental file system block size. // // buf->f_blocks = partition->fat.lastCluster - CLUSTER_FIRST + 1; // Total number of blocks on file system in units of f_frsize. // buf->f_bfree = freeClusterCount; // Total number of free blocks. // buf->f_bavail = freeClusterCount; // Number of free blocks available to non-privileged process. // // // Treat requests for info on inodes as clusters // buf->f_files = partition->fat.lastCluster - CLUSTER_FIRST + 1; // Total number of file serial numbers. // buf->f_ffree = freeClusterCount; // Total number of free file serial numbers. // buf->f_favail = freeClusterCount; // Number of file serial numbers available to non-privileged process. // // // File system ID. 32bit ioType value // buf->f_fsid = _FAT_disc_hostType(partition->disc); // // // Bit mask of f_flag values. // buf->f_flag = ST_NOSUID /* No support for ST_ISUID and ST_ISGID file mode bits */ // | (partition->readOnly ? ST_RDONLY /* Read only file system */ : 0 ) ; // // Maximum filename length. // buf->f_namemax = MAX_FILENAME_LENGTH; // // _FAT_unlock(&partition->lock); // return 0; //} DIR_ITER* _FAT_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path) { DIR_ENTRY dirEntry; DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); bool fileExists; state->partition = _FAT_partition_getPartitionFromPath (path); if (state->partition == NULL) { r->_errno = ENODEV; return NULL; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return NULL; } _FAT_lock(&state->partition->lock); // Get the start cluster of the directory fileExists = _FAT_directory_entryFromPath (state->partition, &dirEntry, path, NULL); if (!fileExists) { _FAT_unlock(&state->partition->lock); r->_errno = ENOENT; return NULL; } // Make sure it is a directory if (! _FAT_directory_isDirectory (&dirEntry)) { _FAT_unlock(&state->partition->lock); r->_errno = ENOTDIR; return NULL; } // Save the start cluster for use when resetting the directory data state->startCluster = _FAT_directory_entryGetCluster (state->partition, dirEntry.entryData); // Get the first entry for use with a call to dirnext state->validEntry = _FAT_directory_getFirstEntry (state->partition, &(state->currentEntry), state->startCluster); // We are now using this entry state->inUse = true; _FAT_unlock(&state->partition->lock); return (DIR_ITER*) state; } int _FAT_dirreset_r (struct _reent *r, DIR_ITER *dirState) { DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); _FAT_lock(&state->partition->lock); // Make sure we are still using this entry if (!state->inUse) { _FAT_unlock(&state->partition->lock); r->_errno = EBADF; return -1; } // Get the first entry for use with a call to dirnext state->validEntry = _FAT_directory_getFirstEntry (state->partition, &(state->currentEntry), state->startCluster); _FAT_unlock(&state->partition->lock); return 0; } int _FAT_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat) { DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); _FAT_lock(&state->partition->lock); // Make sure we are still using this entry if (!state->inUse) { _FAT_unlock(&state->partition->lock); r->_errno = EBADF; return -1; } // Make sure there is another file to report on if (! state->validEntry) { _FAT_unlock(&state->partition->lock); r->_errno = ENOENT; return -1; } // Get the filename strncpy (filename, state->currentEntry.filename, MAX_FILENAME_LENGTH); // Get the stats, if requested if (filestat != NULL) { _FAT_directory_entryStat (state->partition, &(state->currentEntry), filestat); } // Look for the next entry for use next time state->validEntry = _FAT_directory_getNextEntry (state->partition, &(state->currentEntry)); _FAT_unlock(&state->partition->lock); return 0; } int _FAT_dirclose_r (struct _reent *r, DIR_ITER *dirState) { DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); // We are no longer using this entry _FAT_lock(&state->partition->lock); state->inUse = false; _FAT_unlock(&state->partition->lock); return 0; } desmume-0.9.11/src/utils/libfat/fat.h0000755000000000000000000000721112467662066016075 0ustar rootroot/* fat.h Simple functionality for startup, mounting and unmounting of FAT-based devices. Copyright (c) 2006 - 2009 Michael "Chishm" Chisholm Dave "WinterMute" Murphy 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 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. */ #ifndef _LIBFAT_H #define _LIBFAT_H #ifdef __cplusplus extern "C" { #endif // When compiling for NDS, make sure NDS is defined #ifndef NDS #if defined ARM9 || defined ARM7 #define NDS #endif #endif #ifndef _MSC_VER #include #endif #if defined(__gamecube__) || defined (__wii__) # include #else # ifdef NDS # include "nds/disc_io.h" # else # include "disc_io.h" # endif #endif /* Initialise any inserted block-devices. Add the fat device driver to the devoptab, making it available for standard file functions. cacheSize: The number of pages to allocate for each inserted block-device setAsDefaultDevice: if true, make this the default device driver for file operations */ extern bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice); /* Calls fatInit with setAsDefaultDevice = true and cacheSize optimised for the host system. */ extern bool fatInitDefault (void); /* Mount the device pointed to by interface, and set up a devoptab entry for it as "name:". You can then access the filesystem using "name:/". This will mount the active partition or the first valid partition on the disc, and will use a cache size optimized for the host system. */ extern bool fatMountSimple (const char* name, const DISC_INTERFACE* interface); /* Mount the device pointed to by interface, and set up a devoptab entry for it as "name:". You can then access the filesystem using "name:/". If startSector = 0, it will mount the active partition of the first valid partition on the disc. Otherwise it will try to mount the partition starting at startSector. cacheSize specifies the number of pages to allocate for the cache. This will not startup the disc, so you need to call interface->startup(); first. */ extern bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage); /* Unmount the partition specified by name. If there are open files, it will attempt to synchronise them to disc. */ extern void fatUnmount (const char* name); /* Get Volume Label */ extern void fatGetVolumeLabel (const char* name, char *label); #ifdef __cplusplus } #endif #endif // _LIBFAT_H desmume-0.9.11/src/utils/libfat/directory.cpp0000755000000000000000000010456012467662066017667 0ustar rootroot/* directory.c Reading, writing and manipulation of the directory structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm 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 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. */ #include #include #include #include #include #include #include "directory.h" #include "common.h" #include "partition.h" #include "file_allocation_table.h" #include "bit_ops.h" #include "filetime.h" #ifdef __APPLE__ #include #ifndef MAC_OS_X_VERSION_10_7 // In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here. static size_t strnlen(const char *s, size_t n) { const char *p = (const char *)memchr(s, 0, n); return(p ? p-s : n); } #endif #endif // __APPLE__ // Directory entry codes #define DIR_ENTRY_LAST 0x00 #define DIR_ENTRY_FREE 0xE5 #define LAST_LFN_POS (19*13) #define LAST_LFN_POS_CORRECTION (MAX_LFN_LENGTH-15) typedef unsigned short ucs2_t; // Long file name directory entry enum LFN_offset { LFN_offset_ordinal = 0x00, // Position within LFN LFN_offset_char0 = 0x01, LFN_offset_char1 = 0x03, LFN_offset_char2 = 0x05, LFN_offset_char3 = 0x07, LFN_offset_char4 = 0x09, LFN_offset_flag = 0x0B, // Should be equal to ATTRIB_LFN LFN_offset_reserved1 = 0x0C, // Always 0x00 LFN_offset_checkSum = 0x0D, // Checksum of short file name (alias) LFN_offset_char5 = 0x0E, LFN_offset_char6 = 0x10, LFN_offset_char7 = 0x12, LFN_offset_char8 = 0x14, LFN_offset_char9 = 0x16, LFN_offset_char10 = 0x18, LFN_offset_reserved2 = 0x1A, // Always 0x0000 LFN_offset_char11 = 0x1C, LFN_offset_char12 = 0x1E }; static const int LFN_offset_table[13]={0x01,0x03,0x05,0x07,0x09,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E}; #define LFN_END 0x40 #define LFN_DEL 0x80 static const char ILLEGAL_ALIAS_CHARACTERS[] = "\\/:;*?\"<>|&+,=[] "; static const char ILLEGAL_LFN_CHARACTERS[] = "\\/:*?\"<>|"; /* Returns number of UCS-2 characters needed to encode an LFN Returns -1 if it is an invalid LFN */ #define ABOVE_UCS_RANGE 0xF0 static int _FAT_directory_lfnLength (const char* name) { unsigned int i; size_t nameLength; int ucsLength; const char* tempName = name; nameLength = strnlen(name, MAX_FILENAME_LENGTH); // Make sure the name is short enough to be valid if ( nameLength >= MAX_FILENAME_LENGTH) { return -1; } // Make sure it doesn't contain any invalid characters if (strpbrk (name, ILLEGAL_LFN_CHARACTERS) != NULL) { return -1; } // Make sure the name doesn't contain any control codes or codes not representable in UCS-2 for (i = 0; i < nameLength; i++) { if (name[i] < 0x20 || name[i] >= ABOVE_UCS_RANGE) { return -1; } } // Convert to UCS-2 and get the resulting length ucsLength = mbsrtowcs(NULL, &tempName, MAX_LFN_LENGTH, NULL); if (ucsLength < 0 || ucsLength >= MAX_LFN_LENGTH) { return -1; } // Otherwise it is valid return ucsLength; } /* Convert a multibyte encoded string into a NUL-terminated UCS-2 string, storing at most len characters return number of characters stored */ static size_t _FAT_directory_mbstoucs2 (ucs2_t* dst, const char* src, size_t len) { mbstate_t ps = {0}; wchar_t tempChar; int bytes; size_t count = 0; while (count < len-1 && src != '\0') { bytes = mbrtowc (&tempChar, src, MB_CUR_MAX, &ps); if (bytes > 0) { *dst = (ucs2_t)tempChar; src += bytes; dst++; count++; } else if (bytes == 0) { break; } else { return -1; } } *dst = '\0'; return count; } /* Convert a UCS-2 string into a NUL-terminated multibyte string, storing at most len chars return number of chars stored, or (size_t)-1 on error */ static size_t _FAT_directory_ucs2tombs (char* dst, const ucs2_t* src, size_t len) { mbstate_t ps = {0}; size_t count = 0; int bytes; char* buff = (char*)alloca(MB_CUR_MAX); int i; while (count < len - 1 && *src != '\0') { bytes = wcrtomb (buff, *src, &ps); if (bytes < 0) { return -1; } if (count + bytes < len && bytes > 0) { for (i = 0; i < bytes; i++) { *dst++ = buff[i]; } src++; count += bytes; } else { break; } } *dst = L'\0'; return count; } /* Case-independent comparison of two multibyte encoded strings */ static int _FAT_directory_mbsncasecmp (const char* s1, const char* s2, size_t len1) { wchar_t wc1, wc2; mbstate_t ps1 = {0}; mbstate_t ps2 = {0}; size_t b1 = 0; size_t b2 = 0; if (len1 == 0) { return 0; } do { s1 += b1; s2 += b2; b1 = mbrtowc(&wc1, s1, MB_CUR_MAX, &ps1); b2 = mbrtowc(&wc2, s2, MB_CUR_MAX, &ps2); if ((int)b1 < 0 || (int)b2 < 0) { break; } len1 -= b1; } while (len1 > 0 && towlower(wc1) == towlower(wc2) && wc1 != 0); return towlower(wc1) - towlower(wc2); } static bool _FAT_directory_entryGetAlias (const u8* entryData, char* destName) { int i=0; int j=0; destName[0] = '\0'; if (entryData[0] != DIR_ENTRY_FREE) { if (entryData[0] == '.') { destName[0] = '.'; if (entryData[1] == '.') { destName[1] = '.'; destName[2] = '\0'; } else { destName[1] = '\0'; } } else { // Copy the filename from the dirEntry to the string for (i = 0; (i < 8) && (entryData[DIR_ENTRY_name + i] != ' '); i++) { destName[i] = entryData[DIR_ENTRY_name + i]; } // Copy the extension from the dirEntry to the string if (entryData[DIR_ENTRY_extension] != ' ') { destName[i++] = '.'; for ( j = 0; (j < 3) && (entryData[DIR_ENTRY_extension + j] != ' '); j++) { destName[i++] = entryData[DIR_ENTRY_extension + j]; } } destName[i] = '\0'; } } return (destName[0] != '\0'); } uint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData) { if (partition->filesysType == FS_FAT32) { // Only use high 16 bits of start cluster when we are certain they are correctly defined return u8array_to_u16(entryData,DIR_ENTRY_cluster) | (u8array_to_u16(entryData, DIR_ENTRY_clusterHigh) << 16); } else { return u8array_to_u16(entryData,DIR_ENTRY_cluster); } } static bool _FAT_directory_incrementDirEntryPosition (PARTITION* partition, DIR_ENTRY_POSITION* entryPosition, bool extendDirectory) { DIR_ENTRY_POSITION position = *entryPosition; uint32_t tempCluster; // Increment offset, wrapping at the end of a sector ++ position.offset; if (position.offset == BYTES_PER_READ / DIR_ENTRY_DATA_SIZE) { position.offset = 0; // Increment sector when wrapping ++ position.sector; // But wrap at the end of a cluster if ((position.sector == partition->sectorsPerCluster) && (position.cluster != FAT16_ROOT_DIR_CLUSTER)) { position.sector = 0; // Move onto the next cluster, making sure there is another cluster to go to tempCluster = _FAT_fat_nextCluster(partition, position.cluster); if (tempCluster == CLUSTER_EOF) { if (extendDirectory) { tempCluster = _FAT_fat_linkFreeClusterCleared (partition, position.cluster); if (!_FAT_fat_isValidCluster(partition, tempCluster)) { return false; // This will only happen if the disc is full } } else { return false; // Got to the end of the directory, not extending it } } position.cluster = tempCluster; } else if ((position.cluster == FAT16_ROOT_DIR_CLUSTER) && (position.sector == (partition->dataStart - partition->rootDirStart))) { return false; // Got to end of root directory, can't extend it } } *entryPosition = position; return true; } bool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry) { DIR_ENTRY_POSITION entryStart; DIR_ENTRY_POSITION entryEnd; uint8_t entryData[0x20]; ucs2_t lfn[MAX_LFN_LENGTH]; bool notFound, found; int lfnPos; uint8_t lfnChkSum, chkSum; bool lfnExists; int i; lfnChkSum = 0; entryStart = entry->dataEnd; // Make sure we are using the correct root directory, in case of FAT32 if (entryStart.cluster == FAT16_ROOT_DIR_CLUSTER) { entryStart.cluster = partition->rootDirCluster; } entryEnd = entryStart; lfnExists = false; found = false; notFound = false; while (!found && !notFound) { if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) { notFound = true; } _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector, entryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if (entryData[DIR_ENTRY_attributes] == ATTRIB_LFN) { // It's an LFN if (entryData[LFN_offset_ordinal] & LFN_DEL) { lfnExists = false; } else if (entryData[LFN_offset_ordinal] & LFN_END) { // Last part of LFN, make sure it isn't deleted using previous if(Thanks MoonLight) entryStart = entryEnd; // This is the start of a directory entry lfnExists = true; lfnPos = (entryData[LFN_offset_ordinal] & ~LFN_END) * 13; if (lfnPos > MAX_LFN_LENGTH - 1) { lfnPos = MAX_LFN_LENGTH - 1; } lfn[lfnPos] = '\0'; // Set end of lfn to null character lfnChkSum = entryData[LFN_offset_checkSum]; } if (lfnChkSum != entryData[LFN_offset_checkSum]) { lfnExists = false; } if (lfnExists) { lfnPos = ((entryData[LFN_offset_ordinal] & ~LFN_END) - 1) * 13; if (lfnPos > LAST_LFN_POS) { // Force it within the buffer. Will corrupt the filename but prevent buffer overflows lfnPos = LAST_LFN_POS; } for (i = 0; i < 13; i++) { lfn[lfnPos + i] = entryData[LFN_offset_table[i]] | (entryData[LFN_offset_table[i]+1] << 8); } } } else if (entryData[DIR_ENTRY_attributes] & ATTRIB_VOL) { // This is a volume name, don't bother with it } else if (entryData[0] == DIR_ENTRY_LAST) { notFound = true; } else if ((entryData[0] != DIR_ENTRY_FREE) && (entryData[0] > 0x20) && !(entryData[DIR_ENTRY_attributes] & ATTRIB_VOL)) { if (lfnExists) { // Calculate file checksum chkSum = 0; for (i=0; i < 11; i++) { // NOTE: The operation is an unsigned char rotate right chkSum = ((chkSum & 1) ? 0x80 : 0) + (chkSum >> 1) + entryData[i]; } if (chkSum != lfnChkSum) { lfnExists = false; entry->filename[0] = '\0'; } } if (lfnExists) { if (_FAT_directory_ucs2tombs (entry->filename, lfn, MAX_FILENAME_LENGTH) == (size_t)-1) { // Failed to convert the file name to UTF-8. Maybe the wrong locale is set? return false; } } else { entryStart = entryEnd; _FAT_directory_entryGetAlias (entryData, entry->filename); } found = true; } } // If no file is found, return false if (notFound) { return false; } else { // Fill in the directory entry struct entry->dataStart = entryStart; entry->dataEnd = entryEnd; memcpy (entry->entryData, entryData, DIR_ENTRY_DATA_SIZE); return true; } } bool _FAT_directory_getFirstEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster) { entry->dataStart.cluster = dirCluster; entry->dataStart.sector = 0; entry->dataStart.offset = -1; // Start before the beginning of the directory entry->dataEnd = entry->dataStart; return _FAT_directory_getNextEntry (partition, entry); } bool _FAT_directory_getRootEntry (PARTITION* partition, DIR_ENTRY* entry) { entry->dataStart.cluster = 0; entry->dataStart.sector = 0; entry->dataStart.offset = 0; entry->dataEnd = entry->dataStart; memset (entry->filename, '\0', MAX_FILENAME_LENGTH); entry->filename[0] = '.'; memset (entry->entryData, 0, DIR_ENTRY_DATA_SIZE); memset (entry->entryData, ' ', 11); entry->entryData[0] = '.'; entry->entryData[DIR_ENTRY_attributes] = ATTRIB_DIR; u16_to_u8array (entry->entryData, DIR_ENTRY_cluster, partition->rootDirCluster); u16_to_u8array (entry->entryData, DIR_ENTRY_clusterHigh, partition->rootDirCluster >> 16); return true; } bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label) { DIR_ENTRY entry; DIR_ENTRY_POSITION entryEnd; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; int i; bool end; _FAT_directory_getRootEntry(partition, &entry); entryEnd = entry.dataEnd; // Make sure we are using the correct root directory, in case of FAT32 if (entryEnd.cluster == FAT16_ROOT_DIR_CLUSTER) { entryEnd.cluster = partition->rootDirCluster; } label[0]='\0'; label[11]='\0'; end = false; //this entry should be among the first 3 entries in the root directory table, if not, then system can have trouble displaying the right volume label while(!end) { if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) { end = true; } if(!_FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector, entryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE)) { //error reading return false; } if (entryData[DIR_ENTRY_attributes] == ATTRIB_VOL && entryData[0] != DIR_ENTRY_FREE) { for (i = 0; i < 11; i++) { label[i] = entryData[DIR_ENTRY_name + i]; } return true; } else if (entryData[0] == DIR_ENTRY_LAST) { end = true; } } return false; } bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry) { DIR_ENTRY_POSITION entryStart = entry->dataStart; DIR_ENTRY_POSITION entryEnd = entry->dataEnd; bool entryStillValid; bool finished; ucs2_t lfn[MAX_LFN_LENGTH]; int i; int lfnPos; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; memset (entry->filename, '\0', MAX_FILENAME_LENGTH); // Create an empty directory entry to overwrite the old ones with for ( entryStillValid = true, finished = false; entryStillValid && !finished; entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &entryStart, false)) { _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if ((entryStart.cluster == entryEnd.cluster) && (entryStart.sector == entryEnd.sector) && (entryStart.offset == entryEnd.offset)) { // Copy the entry data and stop, since this is the last section of the directory entry memcpy (entry->entryData, entryData, DIR_ENTRY_DATA_SIZE); finished = true; } else { // Copy the long file name data lfnPos = ((entryData[LFN_offset_ordinal] & ~LFN_END) - 1) * 13; if (lfnPos > LAST_LFN_POS) { lfnPos = LAST_LFN_POS_CORRECTION; } for (i = 0; i < 13; i++) { lfn[lfnPos + i] = entryData[LFN_offset_table[i]] | (entryData[LFN_offset_table[i]+1] << 8); } } } if (!entryStillValid) { return false; } if ((entryStart.cluster == entryEnd.cluster) && (entryStart.sector == entryEnd.sector) && (entryStart.offset == entryEnd.offset)) { // Since the entry doesn't have a long file name, extract the short filename if (!_FAT_directory_entryGetAlias (entry->entryData, entry->filename)) { return false; } } else { // Encode the long file name into a multibyte string if (_FAT_directory_ucs2tombs (entry->filename, lfn, MAX_FILENAME_LENGTH) == (size_t)-1) { return false; } } return true; } bool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd) { size_t dirnameLength; const char* pathPosition; const char* nextPathPosition; uint32_t dirCluster; bool foundFile; char alias[MAX_ALIAS_LENGTH]; bool found, notFound; pathPosition = path; found = false; notFound = false; if (pathEnd == NULL) { // Set pathEnd to the end of the path string pathEnd = strchr (path, '\0'); } if (pathPosition[0] == DIR_SEPARATOR) { // Start at root directory dirCluster = partition->rootDirCluster; // Consume separator(s) while (pathPosition[0] == DIR_SEPARATOR) { pathPosition++; } // If the path is only specifying a directory in the form of "/" return it if (pathPosition >= pathEnd) { _FAT_directory_getRootEntry (partition, entry); found = true; } } else { // Start in current working directory dirCluster = partition->cwdCluster; } // If the path is only specifying a directory in the form "." // and this is the root directory, return it if ((dirCluster == partition->rootDirCluster) && (strcmp(".", pathPosition) == 0)) { _FAT_directory_getRootEntry (partition, entry); found = true; } while (!found && !notFound) { // Get the name of the next required subdirectory within the path nextPathPosition = strchr (pathPosition, DIR_SEPARATOR); if (nextPathPosition != NULL) { dirnameLength = nextPathPosition - pathPosition; } else { dirnameLength = strlen(pathPosition); } if (dirnameLength > MAX_FILENAME_LENGTH) { // The path is too long to bother with return false; } // Look for the directory within the path foundFile = _FAT_directory_getFirstEntry (partition, entry, dirCluster); while (foundFile && !found && !notFound) { // It hasn't already found the file // Check if the filename matches if ((dirnameLength == strnlen(entry->filename, MAX_FILENAME_LENGTH)) && (_FAT_directory_mbsncasecmp(pathPosition, entry->filename, dirnameLength) == 0)) { found = true; } // Check if the alias matches _FAT_directory_entryGetAlias (entry->entryData, alias); if ((dirnameLength == strnlen(alias, MAX_ALIAS_LENGTH)) && (strncasecmp(pathPosition, alias, dirnameLength) == 0)) { found = true; } if (found && !(entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) && (nextPathPosition != NULL)) { // Make sure that we aren't trying to follow a file instead of a directory in the path found = false; } if (!found) { foundFile = _FAT_directory_getNextEntry (partition, entry); } } if (!foundFile) { // Check that the search didn't get to the end of the directory notFound = true; found = false; } else if ((nextPathPosition == NULL) || (nextPathPosition >= pathEnd)) { // Check that we reached the end of the path found = true; } else if (entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) { dirCluster = _FAT_directory_entryGetCluster (partition, entry->entryData); pathPosition = nextPathPosition; // Consume separator(s) while (pathPosition[0] == DIR_SEPARATOR) { pathPosition++; } // The requested directory was found if (pathPosition >= pathEnd) { found = true; } else { found = false; } } } if (found && !notFound) { if (partition->filesysType == FS_FAT32 && (entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) && _FAT_directory_entryGetCluster (partition, entry->entryData) == CLUSTER_ROOT) { // On FAT32 it should specify an actual cluster for the root entry, // not cluster 0 as on FAT16 _FAT_directory_getRootEntry (partition, entry); } return true; } else { return false; } } bool _FAT_directory_removeEntry (PARTITION* partition, DIR_ENTRY* entry) { DIR_ENTRY_POSITION entryStart = entry->dataStart; DIR_ENTRY_POSITION entryEnd = entry->dataEnd; bool entryStillValid; bool finished; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; // Create an empty directory entry to overwrite the old ones with for ( entryStillValid = true, finished = false; entryStillValid && !finished; entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &entryStart, false)) { _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); entryData[0] = DIR_ENTRY_FREE; _FAT_cache_writePartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if ((entryStart.cluster == entryEnd.cluster) && (entryStart.sector == entryEnd.sector) && (entryStart.offset == entryEnd.offset)) { finished = true; } } if (!entryStillValid) { return false; } return true; } static bool _FAT_directory_findEntryGap (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster, size_t size) { DIR_ENTRY_POSITION gapStart; DIR_ENTRY_POSITION gapEnd; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; size_t dirEntryRemain; bool endOfDirectory, entryStillValid; // Scan Dir for free entry gapEnd.offset = 0; gapEnd.sector = 0; gapEnd.cluster = dirCluster; gapStart = gapEnd; entryStillValid = true; dirEntryRemain = size; endOfDirectory = false; while (entryStillValid && !endOfDirectory && (dirEntryRemain > 0)) { _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, gapEnd.cluster) + gapEnd.sector, gapEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if (entryData[0] == DIR_ENTRY_LAST) { gapStart = gapEnd; -- dirEntryRemain; endOfDirectory = true; } else if (entryData[0] == DIR_ENTRY_FREE) { if (dirEntryRemain == size) { gapStart = gapEnd; } -- dirEntryRemain; } else { dirEntryRemain = size; } if (!endOfDirectory && (dirEntryRemain > 0)) { entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &gapEnd, true); } } // Make sure the scanning didn't fail if (!entryStillValid) { return false; } // Save the start entry, since we know it is valid entry->dataStart = gapStart; if (endOfDirectory) { memset (entryData, DIR_ENTRY_LAST, DIR_ENTRY_DATA_SIZE); dirEntryRemain += 1; // Increase by one to take account of End Of Directory Marker while ((dirEntryRemain > 0) && entryStillValid) { // Get the gapEnd before incrementing it, so the second to last one is saved entry->dataEnd = gapEnd; // Increment gapEnd, moving onto the next entry entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &gapEnd, true); -- dirEntryRemain; // Fill the entry with blanks _FAT_cache_writePartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, gapEnd.cluster) + gapEnd.sector, gapEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); } if (!entryStillValid) { return false; } } else { entry->dataEnd = gapEnd; } return true; } static bool _FAT_directory_entryExists (PARTITION* partition, const char* name, uint32_t dirCluster) { DIR_ENTRY tempEntry; bool foundFile; char alias[MAX_ALIAS_LENGTH]; size_t dirnameLength; dirnameLength = strnlen(name, MAX_FILENAME_LENGTH); if (dirnameLength >= MAX_FILENAME_LENGTH) { return false; } // Make sure the entry doesn't already exist foundFile = _FAT_directory_getFirstEntry (partition, &tempEntry, dirCluster); while (foundFile) { // It hasn't already found the file // Check if the filename matches if ((dirnameLength == strnlen(tempEntry.filename, MAX_FILENAME_LENGTH)) && (_FAT_directory_mbsncasecmp(name, tempEntry.filename, dirnameLength) == 0)) { return true; } // Check if the alias matches _FAT_directory_entryGetAlias (tempEntry.entryData, alias); if ((strncasecmp(name, alias, MAX_ALIAS_LENGTH) == 0)) { return true; } foundFile = _FAT_directory_getNextEntry (partition, &tempEntry); } return false; } /* Creates an alias for a long file name. If the alias is not an exact match for the filename, it returns the number of characters in the alias. If the two names match, it returns 0. If there was an error, it returns -1. */ static int _FAT_directory_createAlias (char* alias, const char* lfn) { bool lossyConversion = false; // Set when the alias had to be modified to be valid int lfnPos = 0; int aliasPos = 0; wchar_t lfnChar; int oemChar; mbstate_t ps = {0}; int bytesUsed = 0; const char* lfnExt; int aliasExtLen; // Strip leading periods while (lfn[lfnPos] == '.') { lfnPos ++; lossyConversion = true; } // Primary portion of alias while (aliasPos < 8 && lfn[lfnPos] != '.' && lfn[lfnPos] != '\0') { bytesUsed = mbrtowc(&lfnChar, lfn + lfnPos, MAX_FILENAME_LENGTH - lfnPos, &ps); if (bytesUsed < 0) { return -1; } oemChar = wctob(towupper((wint_t)lfnChar)); if (wctob((wint_t)lfnChar) != oemChar) { // Case of letter was changed lossyConversion = true; } if (oemChar == ' ') { // Skip spaces in filename lossyConversion = true; lfnPos += bytesUsed; continue; } if (oemChar == EOF) { oemChar = '_'; // Replace unconvertable characters with underscores lossyConversion = true; } if (strchr (ILLEGAL_ALIAS_CHARACTERS, oemChar) != NULL) { // Invalid Alias character oemChar = '_'; // Replace illegal characters with underscores lossyConversion = true; } alias[aliasPos] = (char)oemChar; aliasPos++; lfnPos += bytesUsed; } if (lfn[lfnPos] != '.' && lfn[lfnPos] != '\0') { // Name was more than 8 characters long lossyConversion = true; } // Alias extension lfnExt = strrchr (lfn, '.'); if (lfnExt != NULL && lfnExt != strchr (lfn, '.')) { // More than one period in name lossyConversion = true; } if (lfnExt != NULL && lfnExt[1] != '\0') { lfnExt++; alias[aliasPos] = '.'; aliasPos++; memset (&ps, 0, sizeof(ps)); for (aliasExtLen = 0; aliasExtLen < MAX_ALIAS_EXT_LENGTH && *lfnExt != '\0'; aliasExtLen++) { bytesUsed = mbrtowc(&lfnChar, lfnExt, MAX_FILENAME_LENGTH - lfnPos, &ps); if (bytesUsed < 0) { return -1; } oemChar = wctob(towupper((wint_t)lfnChar)); if (wctob((wint_t)lfnChar) != oemChar) { // Case of letter was changed lossyConversion = true; } if (oemChar == ' ') { // Skip spaces in alias lossyConversion = true; lfnExt += bytesUsed; continue; } if (oemChar == EOF) { oemChar = '_'; // Replace unconvertable characters with underscores lossyConversion = true; } if (strchr (ILLEGAL_ALIAS_CHARACTERS, oemChar) != NULL) { // Invalid Alias character oemChar = '_'; // Replace illegal characters with underscores lossyConversion = true; } alias[aliasPos] = (char)oemChar; aliasPos++; lfnExt += bytesUsed; } if (*lfnExt != '\0') { // Extension was more than 3 characters long lossyConversion = true; } } alias[aliasPos] = '\0'; if (lossyConversion) { return aliasPos; } else { return 0; } } bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster) { size_t entrySize; uint8_t lfnEntry[DIR_ENTRY_DATA_SIZE]; int i,j; // Must be signed for use when decrementing in for loop char *tmpCharPtr; DIR_ENTRY_POSITION curEntryPos; bool entryStillValid; uint8_t aliasCheckSum = 0; char alias [MAX_ALIAS_LENGTH]; int aliasLen; int lfnLen; // Make sure the filename is not 0 length if (strnlen (entry->filename, MAX_FILENAME_LENGTH) < 1) { return false; } // Make sure the filename is at least a valid LFN lfnLen = _FAT_directory_lfnLength (entry->filename); if (lfnLen < 0) { return false; } // Remove trailing spaces for (i = strlen (entry->filename) - 1; (i > 0) && (entry->filename[i] == ' '); --i) { entry->filename[i] = '\0'; } // Remove leading spaces for (i = 0; (i < (int)strlen (entry->filename)) && (entry->filename[i] == ' '); ++i) ; if (i > 0) { memmove (entry->filename, entry->filename + i, strlen (entry->filename + i)); } // Remove junk in filename i = strlen (entry->filename); memset (entry->filename + i, '\0', MAX_FILENAME_LENGTH - i); // Make sure the entry doesn't already exist if (_FAT_directory_entryExists (partition, entry->filename, dirCluster)) { return false; } // Clear out alias, so we can generate a new one memset (entry->entryData, ' ', 11); if ( strncmp(entry->filename, ".", MAX_FILENAME_LENGTH) == 0) { // "." entry entry->entryData[0] = '.'; entrySize = 1; } else if ( strncmp(entry->filename, "..", MAX_FILENAME_LENGTH) == 0) { // ".." entry entry->entryData[0] = '.'; entry->entryData[1] = '.'; entrySize = 1; } else { // Normal file name aliasLen = _FAT_directory_createAlias (alias, entry->filename); if (aliasLen < 0) { return false; } else if (aliasLen == 0) { // It's a normal short filename entrySize = 1; } else { // It's a long filename with an alias entrySize = ((lfnLen + LFN_ENTRY_LENGTH - 1) / LFN_ENTRY_LENGTH) + 1; // Generate full alias for all cases except when the alias is simply an upper case version of the LFN // and there isn't already a file with that name if (strncasecmp (alias, entry->filename, MAX_ALIAS_LENGTH) != 0 || _FAT_directory_entryExists (partition, alias, dirCluster)) { // expand primary part to 8 characters long by padding the end with underscores i = MAX_ALIAS_PRI_LENGTH - 1; // Move extension to last 3 characters while (alias[i] != '.' && i > 0) i--; if (i > 0) { j = MAX_ALIAS_LENGTH - MAX_ALIAS_EXT_LENGTH - 2; // 1 char for '.', one for NUL, 3 for extension memmove (alias + j, alias + i, strlen(alias) - i); // Pad primary component memset (alias + i, '_', j - i); alias[MAX_ALIAS_LENGTH-1]=0; } // Generate numeric tail for (i = 1; i <= MAX_NUMERIC_TAIL; i++) { j = i; tmpCharPtr = alias + MAX_ALIAS_PRI_LENGTH - 1; while (j > 0) { *tmpCharPtr = '0' + (j % 10); // ASCII numeric value tmpCharPtr--; j /= 10; } *tmpCharPtr = '~'; if (!_FAT_directory_entryExists (partition, alias, dirCluster)) { break; } } if (i > MAX_NUMERIC_TAIL) { // Couldn't get a valid alias return false; } } } // Copy alias or short file name into directory entry data for (i = 0, j = 0; (j < 8) && (alias[i] != '.') && (alias[i] != '\0'); i++, j++) { entry->entryData[j] = alias[i]; } while (j < 8) { entry->entryData[j] = ' '; ++ j; } if (alias[i] == '.') { // Copy extension ++ i; while ((alias[i] != '\0') && (j < 11)) { entry->entryData[j] = alias[i]; ++ i; ++ j; } } while (j < 11) { entry->entryData[j] = ' '; ++ j; } // Generate alias checksum for (i=0; i < ALIAS_ENTRY_LENGTH; i++) { // NOTE: The operation is an unsigned char rotate right aliasCheckSum = ((aliasCheckSum & 1) ? 0x80 : 0) + (aliasCheckSum >> 1) + entry->entryData[i]; } } // Find or create space for the entry if (_FAT_directory_findEntryGap (partition, entry, dirCluster, entrySize) == false) { return false; } // Write out directory entry curEntryPos = entry->dataStart; { // lfn is only pushed onto the stack here, reducing overall stack usage ucs2_t lfn[MAX_LFN_LENGTH] = {0}; _FAT_directory_mbstoucs2 (lfn, entry->filename, MAX_LFN_LENGTH); for (entryStillValid = true, i = entrySize; entryStillValid && i > 0; entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &curEntryPos, false), -- i ) { if (i > 1) { // Long filename entry lfnEntry[LFN_offset_ordinal] = (i - 1) | ((size_t)i == entrySize ? LFN_END : 0); for (j = 0; j < 13; j++) { if (lfn [(i - 2) * 13 + j] == '\0') { if ((j > 1) && (lfn [(i - 2) * 13 + (j-1)] == '\0')) { u16_to_u8array (lfnEntry, LFN_offset_table[j], 0xffff); // Padding } else { u16_to_u8array (lfnEntry, LFN_offset_table[j], 0x0000); // Terminating null character } } else { u16_to_u8array (lfnEntry, LFN_offset_table[j], lfn [(i - 2) * 13 + j]); } } lfnEntry[LFN_offset_checkSum] = aliasCheckSum; lfnEntry[LFN_offset_flag] = ATTRIB_LFN; lfnEntry[LFN_offset_reserved1] = 0; u16_to_u8array (lfnEntry, LFN_offset_reserved2, 0); _FAT_cache_writePartialSector (partition->cache, lfnEntry, _FAT_fat_clusterToSector(partition, curEntryPos.cluster) + curEntryPos.sector, curEntryPos.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); } else { // Alias & file data _FAT_cache_writePartialSector (partition->cache, entry->entryData, _FAT_fat_clusterToSector(partition, curEntryPos.cluster) + curEntryPos.sector, curEntryPos.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); } } } return true; } bool _FAT_directory_chdir (PARTITION* partition, const char* path) { DIR_ENTRY entry; if (!_FAT_directory_entryFromPath (partition, &entry, path, NULL)) { return false; } if (!(entry.entryData[DIR_ENTRY_attributes] & ATTRIB_DIR)) { return false; } partition->cwdCluster = _FAT_directory_entryGetCluster (partition, entry.entryData); return true; } void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st) { // Fill in the stat struct // Some of the values are faked for the sake of compatibility st->st_dev = _FAT_disc_hostType(partition->disc); // The device is the 32bit ioType value st->st_ino = (ino_t)(_FAT_directory_entryGetCluster(partition, entry->entryData)); // The file serial number is the start cluster st->st_mode = (_FAT_directory_isDirectory(entry) ? S_IFDIR : S_IFREG) | (S_IRUSR | S_IRGRP | S_IROTH) | (_FAT_directory_isWritable (entry) ? (S_IWUSR | S_IWGRP | S_IWOTH) : 0); // Mode bits based on dirEntry ATTRIB byte st->st_nlink = 1; // Always one hard link on a FAT file st->st_uid = 1; // Faked for FAT st->st_gid = 2; // Faked for FAT st->st_rdev = st->st_dev; st->st_size = u8array_to_u32 (entry->entryData, DIR_ENTRY_fileSize); // File size st->st_atime = _FAT_filetime_to_time_t ( 0, u8array_to_u16 (entry->entryData, DIR_ENTRY_aDate) ); #ifndef LIBFAT_PC st->st_spare1 = 0; #endif st->st_mtime = _FAT_filetime_to_time_t ( u8array_to_u16 (entry->entryData, DIR_ENTRY_mTime), u8array_to_u16 (entry->entryData, DIR_ENTRY_mDate) ); #ifndef LIBFAT_PC st->st_spare2 = 0; #endif st->st_ctime = _FAT_filetime_to_time_t ( u8array_to_u16 (entry->entryData, DIR_ENTRY_cTime), u8array_to_u16 (entry->entryData, DIR_ENTRY_cDate) ); #ifndef LIBFAT_PC st->st_spare3 = 0; st->st_blksize = BYTES_PER_READ; // Prefered file I/O block size st->st_blocks = (st->st_size + BYTES_PER_READ - 1) / BYTES_PER_READ; // File size in blocks st->st_spare4[0] = 0; st->st_spare4[1] = 0; #endif } desmume-0.9.11/src/utils/vfat.cpp0000755000000000000000000001365612467662066015367 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006 Mic Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include #include #include #include "../types.h" #include "../debug.h" #include "../emufile.h" #include "../fs.h" #include "emufat.h" #include "vfat.h" #include "libfat/libfat_public_api.h" enum EListCallbackArg { EListCallbackArg_Item, EListCallbackArg_Pop }; typedef void (*ListCallback)(FsEntry* fs, EListCallbackArg); // List all files and subdirectories recursively static void list_files(const char *filepath, ListCallback list_callback) { char DirSpec[255+1], SubDir[255+1]; FsEntry entry; void * hFind; char *fname; u32 dwError; strncpy(DirSpec, filepath, ARRAY_SIZE(DirSpec)); DirSpec[255] = 0 ; // hard limit the string here hFind = FsReadFirst(DirSpec, &entry); if (hFind == NULL) return; do { fname = (strlen(entry.cAlternateFileName)>0) ? entry.cAlternateFileName : entry.cFileName; list_callback(&entry,EListCallbackArg_Item); printf("cflash added %s\n",entry.cFileName); if ((entry.flags & FS_IS_DIR) && (strcmp(fname, ".")) && (strcmp(fname, ".."))) { if (strlen(fname)+strlen(filepath)+2 < 256) { sprintf(SubDir, "%s%c%s", filepath, FS_SEPARATOR, fname); list_files(SubDir, list_callback); list_callback(&entry, EListCallbackArg_Pop); } } } while (FsReadNext(hFind, &entry) != 0); dwError = FsError(); FsClose(hFind); if (dwError != FS_ERR_NO_MORE_FILES) return; } static u64 dataSectors = 0; void count_ListCallback(FsEntry* fs, EListCallbackArg arg) { if(arg == EListCallbackArg_Pop) return; u32 sectors = 1; if(fs->flags & FS_IS_DIR) { } else sectors += (fs->fileSize+511)/512 + 1; dataSectors += sectors; } static std::string currPath; static std::stack pathStack; static std::stack virtPathStack; static std::string currVirtPath; void build_ListCallback(FsEntry* fs, EListCallbackArg arg) { char* fname = (strlen(fs->cAlternateFileName)>0) ? fs->cAlternateFileName : fs->cFileName; //we use cFileName always because it is a LFN and we are making sure that we always make a fat32 image fname = fs->cFileName; if(arg == EListCallbackArg_Pop) { currPath = pathStack.top(); pathStack.pop(); currVirtPath = virtPathStack.top(); virtPathStack.pop(); return; } if(fs->flags & FS_IS_DIR) { if(!strcmp(fname,".")) return; if(!strcmp(fname,"..")) return; pathStack.push(currPath); virtPathStack.push(currVirtPath); currVirtPath = currVirtPath + "/" + fname; bool ok = LIBFAT::MkDir(currVirtPath.c_str()); if(!ok) printf("ERROR adding dir %s via libfat\n",currVirtPath.c_str()); currPath = currPath + std::string(1,FS_SEPARATOR) + fname; return; } else { std::string path = currPath + std::string(1,FS_SEPARATOR) + fname; FILE* inf = fopen(path.c_str(),"rb"); if(inf) { fseek(inf,0,SEEK_END); long len = ftell(inf); fseek(inf,0,SEEK_SET); u8 *buf = new u8[len]; fread(buf,1,len,inf); fclose(inf); std::string path = currVirtPath + "/" + fname; printf("adding path %s for libfat\n",path.c_str()); bool ok = LIBFAT::WriteFile(path.c_str(),buf,len); if(!ok) printf("ERROR adding file to fat\n"); delete[] buf; } else printf("ERROR opening file for fat\n"); } } bool VFAT::build(const char* path, int extra_MB) { dataSectors = 0; currVirtPath = ""; currPath = path; list_files(path, count_ListCallback); dataSectors += 8; //a few for reserved sectors, etc. dataSectors += extra_MB*1024*1024/512; //add extra write space //dataSectors += 16*1024*1024/512; //add 16MB worth of write space. this is probably enough for anyone, but maybe it should be configurable. //we could always suggest to users to add a big file to their directory to overwrite (that would cause the image to get padded) //this seems to be the minimum size that will turn into a solid fat32 if(dataSectors<36*1024*1024/512) dataSectors = 36*1024*1024/512; if(dataSectors>=(0x80000000>>9)) { printf("error allocating memory for fat (%d KBytes)\n",(dataSectors*512)/1024); printf("total fat sizes > 2GB are never going to work\n"); } delete file; try { file = new EMUFILE_MEMORY(dataSectors*512); } catch(std::bad_alloc) { printf("error allocating memory for fat (%d KBytes)\n",(dataSectors*512)/1024); printf("(out of memory)\n"); return false; } //debug.. //file = new EMUFILE_FILE("c:\\temp.ima","rb+"); //format the disk { EmuFat fat(file); EmuFatVolume vol; u8 ok = vol.init(&fat); vol.formatNew(dataSectors); //ensure we are working in memory, just in case we were testing with a disk file. //libfat will need to go straight to memory (for now; we could easily change it to work with the disk) file = file->memwrap(); } EMUFILE_MEMORY* memf = (EMUFILE_MEMORY*)file; //setup libfat and write all the files through it LIBFAT::Init(memf->buf(),memf->size()); list_files(path, build_ListCallback); LIBFAT::Shutdown(); return true; } VFAT::VFAT() : file(NULL) { } VFAT::~VFAT() { delete file; } EMUFILE* VFAT::detach() { EMUFILE* ret = file; file = NULL; return ret; }desmume-0.9.11/src/utils/emufat.cpp0000755000000000000000000017367612467662066015721 0ustar rootroot/* Copyright 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //based on Arduino SdFat Library ( http://code.google.com/p/sdfatlib/ ) //Copyright (C) 2009 by William Greiman //based on mkdosfs - utility to create FAT/MS-DOS filesystems //Copyright (C) 1991 Linus Torvalds //Copyright (C) 1992-1993 Remy Card //Copyright (C) 1993-1994 David Hudson //Copyright (C) 1998 H. Peter Anvin //Copyright (C) 1998-2005 Roman Hodek #include "emufat.h" #include #include #include #include #include "../emufile.h" #define LE16(x) (x) #define LE32(x) (x) #define MAX_CLUST_12 ((1 << 12) - 16) #define MAX_CLUST_16 ((1 << 16) - 16) #define MIN_CLUST_32 65529 /* M$ says the high 4 bits of a FAT32 FAT entry are reserved and don't belong * to the cluster number. So the max. cluster# is based on 2^28 */ #define MAX_CLUST_32 ((1 << 28) - 16) #define FAT12_THRESHOLD 4085 #define MSDOS_EXT_SIGN 0x29 /* extended boot sector signature */ #define MSDOS_FAT12_SIGN "FAT12 " /* FAT12 filesystem signature */ #define MSDOS_FAT16_SIGN "FAT16 " /* FAT16 filesystem signature */ #define MSDOS_FAT32_SIGN "FAT32 " /* FAT32 filesystem signature */ static const int sector_size = 512; #define BLOCK_SIZE 512 #define HARD_SECTOR_SIZE 512 #define SECTORS_PER_BLOCK ( BLOCK_SIZE / HARD_SECTOR_SIZE ) #define FAT_EOF (0x0ffffff8) #define BOOT_SIGN 0xAA55 /* Boot sector magic number */ struct __PACKED fat32_fsinfo { u32 reserved1; /* Nothing as far as I can tell */ u32 signature; /* 0x61417272L */ u32 free_clusters; /* Free cluster count. -1 if unknown */ u32 next_cluster; /* Most recently allocated cluster. * Unused under Linux. */ u32 reserved2[4]; }; //see mkdosfs for the disassembly static const u8 mkdosfs_bootcode_fat32[420] = { 0x0E, 0x1F, 0xBE, 0x77, 0x7C, 0xAC, 0x22, 0xC0, 0x74, 0x0B, 0x56, 0xB4, 0x0E, 0xBB, 0x07, 0x00, 0xCD, 0x10, 0x5E, 0xEB, 0xF0, 0x32, 0xE4, 0xCD, 0x16, 0xCD, 0x19, 0xEB, 0xFE, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6B, 0x2E, 0x20, 0x20, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x66, 0x6C, 0x6F, 0x70, 0x70, 0x79, 0x20, 0x61, 0x6E, 0x64, 0x0D, 0x0A, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x72, 0x79, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6E, 0x20, 0x2E, 0x2E, 0x2E, 0x20, 0x0D, 0x0A, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; EmuFat::EmuFat(const char* fname, bool readonly) : m_readonly(readonly) , m_owns(true) { m_pFile = new EMUFILE_FILE(fname,readonly?"rb":"rb+"); } EmuFat::EmuFat() : m_readonly(false) , m_owns(true) { m_pFile = new EMUFILE_MEMORY(); } EmuFat::EmuFat(EMUFILE* fileNotToDelete) : m_pFile(fileNotToDelete) , m_owns(false) , m_readonly(false) { } EmuFat::~EmuFat() { cacheFlush(); if(m_owns) delete m_pFile; } u8 EmuFat::cacheRawBlock(u32 blockNumber, u8 action) { if (cache_.cacheBlockNumber_ != blockNumber) { if (!cacheFlush()) return false; if (!readBlock(blockNumber, cache_.cacheBuffer_.data)) return false; cache_.cacheBlockNumber_ = blockNumber; } cache_.cacheDirty_ |= action; return true; } u8 EmuFat::cacheZeroBlock(u32 blockNumber) { if (!cacheFlush()) return false; // loop take less flash than memset(cacheBuffer_.data, 0, 512); for (u16 i = 0; i < 512; i++) { cache_.cacheBuffer_.data[i] = 0; } cache_.cacheBlockNumber_ = blockNumber; cacheSetDirty(); return true; } void EmuFat::cacheReset() { reconstruct(&cache_); } u8 EmuFat::cacheFlush() { if (cache_.cacheDirty_) { if (!writeBlock(cache_.cacheBlockNumber_, cache_.cacheBuffer_.data)) { return false; } // mirror FAT tables if (cache_.cacheMirrorBlock_) { if (!writeBlock(cache_.cacheMirrorBlock_, cache_.cacheBuffer_.data)) { return false; } cache_.cacheMirrorBlock_ = 0; } cache_.cacheDirty_ = 0; } return true; } u8 EmuFat::readBlock(u32 block, u8* dst) { m_pFile->fseek(block*512,SEEK_SET); m_pFile->fread(dst,512); if(m_pFile->fail()) { m_pFile->unfail(); return 0; } return 1; } u8 EmuFat::writeBlock(u32 blockNumber, const u8* src) { m_pFile->fseek(blockNumber*512,SEEK_SET); m_pFile->fwrite(src,512); if(m_pFile->fail()) { m_pFile->unfail(); return 0; } return 1; } u8 EmuFat::readData(u32 block, u16 offset, u16 count, u8* dst) { m_pFile->fseek(block*512+offset,SEEK_SET); m_pFile->fread(dst,count); if(m_pFile->fail()) { m_pFile->unfail(); return 0; } return 1; } void EmuFat::truncate(u32 size) { m_pFile->truncate(size); } //------------------------------------------------------------------------------------- inline int cdiv (int a, int b) { return (a + b - 1) / b; } bool calculateClusterSize(TFat32BootSector* bsp, u32 avail_sectors, u32& cluster_count, u32& fat_length, int size_fat_by_user, int &size_fat) { TFat32BootSector &bs = *bsp; const u32 fatdata = avail_sectors; int maxclustsize = bsp->sectorsPerCluster; u32 fatlength12, fatlength16, fatlength32; u32 maxclust12, maxclust16, maxclust32; u32 clust12, clust16, clust32; do { printf( "Trying with %d sectors/cluster:\n", bs.sectorsPerCluster ); /* The factor 2 below avoids cut-off errors for nr_fats == 1. * The "nr_fats*3" is for the reserved first two FAT entries */ clust12 = 2*((u64) fatdata *sector_size + bs.fatCount*3) / (2*(int) bs.sectorsPerCluster * sector_size + bs.fatCount*3); fatlength12 = cdiv (((clust12+2) * 3 + 1) >> 1, sector_size); /* Need to recalculate number of clusters, since the unused parts of the * FATS and data area together could make up space for an additional, * not really present cluster. */ clust12 = (fatdata - bs.fatCount*fatlength12)/bs.sectorsPerCluster; maxclust12 = (fatlength12 * 2 * sector_size) / 3; if (maxclust12 > MAX_CLUST_12) maxclust12 = MAX_CLUST_12; printf( "FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", clust12, fatlength12, maxclust12, MAX_CLUST_12 ); if (clust12 > maxclust12-2) { clust12 = 0; printf( "FAT12: too much clusters\n" ); } clust16 = ((u64) fatdata *sector_size + bs.fatCount*4) / ((int) bs.sectorsPerCluster * sector_size + bs.fatCount*2); fatlength16 = cdiv ((clust16+2) * 2, sector_size); /* Need to recalculate number of clusters, since the unused parts of the * FATS and data area together could make up space for an additional, * not really present cluster. */ clust16 = (fatdata - bs.fatCount*fatlength16)/bs.sectorsPerCluster; maxclust16 = (fatlength16 * sector_size) / 2; if (maxclust16 > MAX_CLUST_16) maxclust16 = MAX_CLUST_16; printf( "FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", clust16, fatlength16, maxclust16, MAX_CLUST_16 ); if (clust16 > maxclust16-2) { printf( "FAT16: too much clusters\n" ); clust16 = 0; } /* The < 4078 avoids that the filesystem will be misdetected as having a * 12 bit FAT. */ if (clust16 < FAT12_THRESHOLD && !(size_fat_by_user && size_fat == 16)) { printf( clust16 < FAT12_THRESHOLD ? "FAT16: would be misdetected as FAT12\n" : "FAT16: too much clusters\n" ); clust16 = 0; } clust32 = ((u64) fatdata *sector_size + bs.fatCount*8) / ((int) bs.sectorsPerCluster * sector_size + bs.fatCount*4); fatlength32 = cdiv ((clust32+2) * 4, sector_size); /* Need to recalculate number of clusters, since the unused parts of the * FATS and data area together could make up space for an additional, * not really present cluster. */ clust32 = (fatdata - bs.fatCount*fatlength32)/bs.sectorsPerCluster; maxclust32 = (fatlength32 * sector_size) / 4; if (maxclust32 > MAX_CLUST_32) maxclust32 = MAX_CLUST_32; if (clust32 && clust32 < MIN_CLUST_32 && !(size_fat_by_user && size_fat == 32)) { clust32 = 0; printf( "FAT32: not enough clusters (%d)\n", MIN_CLUST_32); } printf( "FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", clust32, fatlength32, maxclust32, MAX_CLUST_32 ); if (clust32 > maxclust32) { clust32 = 0; printf( "FAT32: too much clusters\n" ); } if ((clust12 && (size_fat == 0 || size_fat == 12)) || (clust16 && (size_fat == 0 || size_fat == 16)) || (clust32 && size_fat == 32)) break; bs.sectorsPerCluster <<= 1; } while (bs.sectorsPerCluster && bs.sectorsPerCluster <= maxclustsize); /* Use the optimal FAT size if not specified; * FAT32 is (not yet) choosen automatically */ if (!size_fat) { size_fat = (clust16 > clust12) ? 16 : 12; printf( "Choosing %d bits for FAT\n", size_fat ); } switch (size_fat) { case 12: cluster_count = clust12; fat_length = fatlength12; bs.sectorsPerFat16 = LE16(fatlength12); break; case 16: if (clust16 < FAT12_THRESHOLD) { if (size_fat_by_user) { printf("WARNING: Not enough clusters for a " "16 bit FAT! The filesystem will be\n" "misinterpreted as having a 12 bit FAT without " "mount option \"fat=16\".\n" ); return false; } else { printf("This filesystem has an unfortunate size. " "A 12 bit FAT cannot provide\n" "enough clusters, but a 16 bit FAT takes up a little " "bit more space so that\n" "the total number of clusters becomes less than the " "threshold value for\n" "distinction between 12 and 16 bit FATs.\n" ); return false; } } cluster_count = clust16; fat_length = fatlength16; bs.sectorsPerFat16 = LE16(fatlength16); break; case 32: if (clust32 < MIN_CLUST_32) printf("WARNING: Not enough clusters for a 32 bit FAT!\n"); cluster_count = clust32; fat_length = fatlength32; bs.sectorsPerFat16 = LE16(0); bs.fat32.sectorsPerFat32 = LE32(fatlength32); break; } return true; } static void mark_FAT_cluster (int size_fat, u8* fat, int cluster, unsigned int value) { switch( size_fat ) { case 12: value &= 0x0fff; if (((cluster * 3) & 0x1) == 0) { fat[3 * cluster / 2] = (unsigned char) (value & 0x00ff); fat[(3 * cluster / 2) + 1] = (unsigned char) ((fat[(3 * cluster / 2) + 1] & 0x00f0) | ((value & 0x0f00) >> 8)); } else { fat[3 * cluster / 2] = (unsigned char) ((fat[3 * cluster / 2] & 0x000f) | ((value & 0x000f) << 4)); fat[(3 * cluster / 2) + 1] = (unsigned char) ((value & 0x0ff0) >> 4); } break; case 16: value &= 0xffff; fat[2 * cluster] = (unsigned char) (value & 0x00ff); fat[(2 * cluster) + 1] = (unsigned char) (value >> 8); break; case 32: value &= 0xfffffff; fat[4 * cluster] = (unsigned char) (value & 0x000000ff); fat[(4 * cluster) + 1] = (unsigned char) ((value & 0x0000ff00) >> 8); fat[(4 * cluster) + 2] = (unsigned char) ((value & 0x00ff0000) >> 16); fat[(4 * cluster) + 3] = (unsigned char) ((value & 0xff000000) >> 24); break; } } //use 36M as minimum fat32 size (or else mkdosfs complains) //this function assumes fat32. it could be redone to be intelligent by making another pass through mkdosfs and analyzing it again //but we onnly targeted fat32 our first time through bool EmuFatVolume::formatNew(u32 sectors) { u32 volumeStartBlock = 0; TFat32BootSector bsrec; memset(&bsrec,0,sizeof(TFat32BootSector)); TFat32BootSector *bs = &bsrec; //perform same analysis (we guess) as mkdosfs //"fake values" bs->sectorsPerTrack = 32; bs->headCount = 64; //def_hd_params: bs->mediaType = 0xF8; bs->rootDirEntryCount = LE16(512); //Default to 512 entries - N.B. this is overwritten later static const u32 BLOCK_SIZE_BITS = 9; const u32 sz_mb = (sectors+(1<<(20-BLOCK_SIZE_BITS))-1) >> (20-BLOCK_SIZE_BITS); bs->sectorsPerCluster = sz_mb > 16*1024 ? 32 : sz_mb > 8*1024 ? 16 : sz_mb > 260 ? 8 : 1; //(fat16 and fat12 would start at 4 sectors per cluster) memcpy (bs->oemName, "mkdosfs", 8); bs->rootDirEntryCount = 0; //Under FAT32, the root dir is in a cluster chain, and this is signalled by bs.dir_entries being 0 bs->fat32.vi.volume_id = 0; //not generating a volume id.. just use 0 for determinism's sake memcpy(bs->fat32.vi.volume_label," ",11); bs->jmpToBootCode[0] = 0xEB; bs->jmpToBootCode[1] = 0x58; //this value is only for fat32 //Patch in the correct offset to the boot code bs->jmpToBootCode[2] = 0x90; memcpy(bs->fat32.boot_code,mkdosfs_bootcode_fat32,420); bs->boot_sign[0] = 0x55; bs->boot_sign[1] = 0xAA; bs->reservedSectorCount = LE16(32); bs->fatCount = 2; bs->hiddenSectors = LE32(0); u32 fatdata = sectors - cdiv (bs->rootDirEntryCount * 32, 512) - bs->reservedSectorCount; u32 cluster_count; u32 fat_length; int size_fat = 32; if(!calculateClusterSize(bs, fatdata, cluster_count, fat_length, 1, size_fat)) return false; //TODO - this function whacks values we set earlier. gross. either mkdosfs is sloppy or i dont understand it. //anyway, whack that dup code switch(size_fat) { case 12: memcpy(bs->oldfat.vi.fs_type, MSDOS_FAT12_SIGN, 8); break; case 16: memcpy(bs->oldfat.vi.fs_type, MSDOS_FAT16_SIGN, 8); break; case 32: memcpy(bs->fat32.vi.fs_type, MSDOS_FAT32_SIGN, 8); break; } bs->bytesPerSector = 512; //set up additional FAT32 fields bs->fat32.fat32Flags = LE16(0); bs->fat32.fat32Version = LE16(0); bs->fat32.fat32RootCluster = LE32(2); bs->fat32.fat32FSInfo = LE16(1); u32 backup_boot = (bs->reservedSectorCount>= 7) ? 6 : (bs->reservedSectorCount >= 2) ? bs->reservedSectorCount-1 : 0; printf( "Using sector %d as backup boot sector (0 = none)\n",backup_boot ); bs->fat32.fat32BackBootBlock = LE16(backup_boot); memset(bs->fat32.fat32Reserved,0,sizeof(bs->fat32.fat32Reserved)); if(sectors>= 65536) { bs->totalSectors16 = LE16(0); bs->totalSectors32 = LE32(sectors); } else { bs->totalSectors16 = LE16(sectors); bs->totalSectors32 = LE32(0); } if (!cluster_count) { //if (sectors_per_cluster) /* If yes, die if we'd spec'd sectors per cluster */ // die ("Too many clusters for file system - try more sectors per cluster"); //else printf("Attempting to create a too large file system"); return false; } u32 start_data_sector = (bs->reservedSectorCount + bs->fatCount * fat_length) * (sector_size/512); u32 start_data_block = (start_data_sector + SECTORS_PER_BLOCK - 1) / SECTORS_PER_BLOCK; if (sectors < start_data_block + 32) /* Arbitrary undersize file system! */ { printf("Too few blocks for viable file system"); return false; } bs->fat32.vi.ext_boot_sign = MSDOS_EXT_SIGN; //Make the file allocation tables! u8* fat = new u8[fat_length * sector_size]; memset( fat, 0, fat_length * sector_size ); mark_FAT_cluster (size_fat, fat, 0, 0xffffffff); /* Initial fat entries */ mark_FAT_cluster (size_fat, fat, 1, 0xffffffff); fat[0] = bs->mediaType; /* Put media type in first byte! */ if (size_fat == 32) { /* Mark cluster 2 as EOF (used for root dir) */ mark_FAT_cluster (size_fat, fat, 2, FAT_EOF); } u32 size_root_dir = (size_fat == 32) ? bs->sectorsPerCluster*sector_size : bs->rootDirEntryCount * sizeof (TDirectoryEntry); //u8* root_dir = new u8[size_root_dir]; //memset(root_dir, 0, size_root_dir); u32 size_root_dir_in_sectors = size_root_dir/512; u8* info_sector = NULL; if (size_fat == 32) { /* For FAT32, create an info sector */ fat32_fsinfo *info; info_sector = new u8[sector_size]; memset(info_sector, 0, sector_size); /* fsinfo structure is at offset 0x1e0 in info sector by observation */ info = (fat32_fsinfo *)(info_sector + 0x1e0); /* Info sector magic */ info_sector[0] = 'R'; info_sector[1] = 'R'; info_sector[2] = 'a'; info_sector[3] = 'A'; /* Magic for fsinfo structure */ info->signature = LE32(0x61417272); /* We've allocated cluster 2 for the root dir. */ info->free_clusters = LE32(cluster_count - 1); info->next_cluster = LE32(2); /* Info sector also must have boot sign */ *(u16 *)(info_sector + 0x1fe) = LE16(BOOT_SIGN); } //------------- //write_tables() u8* blank_sector = new u8[512]; memset(blank_sector,0,512); dev_->cacheReset(); dev_->truncate(0); dev_->truncate(sectors*512); /* clear all reserved sectors */ for(int i=0;ireservedSectorCount;i++) dev_->writeBlock(0,blank_sector); /* seek back to sector 0 and write the boot sector */ dev_->writeBlock(0,(const u8*)bs); /* on FAT32, write the info sector and backup boot sector */ if (size_fat == 32) { dev_->writeBlock(bs->fat32.fat32FSInfo,info_sector); if(bs->fat32.fat32BackBootBlock) dev_->writeBlock(bs->fat32.fat32BackBootBlock,(const u8*)bs); } /* seek to start of FATS and write them all */ int ctr=bs->reservedSectorCount; for (int i=0;ifatCount;i++) for(int j=0;jwriteBlock(ctr,fat+j*sector_size); /* Write the root directory directly after the last FAT. This is the root * dir area on FAT12/16, and the first cluster on FAT32. */ for(int i=0;iwriteBlock(ctr,blank_sector); delete[] blank_sector; delete[] info_sector; delete[] fat; return init(dev_,0); //return true; } //well, there are a lot of ways to format a disk. this is just a simple one. //it would be nice if someone who understood fat better could modify the root //directory setup to use reasonable code instead of magic arrays bool EmuFatVolume::format(u32 sectors) { //u32 volumeStartBlock = 0; //dev_->truncate(0); //dev_->truncate(sectors*512); //if (!dev_->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_WRITE)) return false; //memset(&dev_->cache_.cacheBuffer_,0,sizeof(dev_->cache_.cacheBuffer_)); //TFat32BootSector* bs = &dev_->cache_.cacheBuffer_.fbs; //TBiosParmBlock* bpb = &bs->bpb; //bs->jmpToBootCode[0] = 0xEB; //bs->jmpToBootCode[1] = 0x3C; //bs->jmpToBootCode[2] = 0x90; //memcpy(bs->oemName,"mkdosfs",8); //bs->driveNumber = 0; //bs->reserved1 = 0; //bs->bootSignature = 0x29; //bs->volumeSerialNumber = 0; //memcpy(bs->volumeLabel," ",11); //memcpy(bs->fileSystemType,"FAT16 ",8); //memcpy(bs->bootCode,mkdosfs_bootcode,420); //bs->bootSectorSig0 = 0x55; //bs->bootSectorSig1 = 0xAA; //bpb->bytesPerSector = 512; //bpb->sectorsPerCluster = 4; //bpb->reservedSectorCount = 1; //bpb->fatCount = 2; //bpb->rootDirEntryCount = 512; //bpb->totalSectors16 = 0; //bpb->mediaType = 0xF8; //bpb->sectorsPerFat16 = 32; //bpb->sectorsPerTrack = 32; //bpb->headCount = 64; //bpb->hiddenSectors = 0; //bpb->totalSectors32 = sectors; //bpb->fat32Flags = 0xbe0d; //bpb->fat32Version = 0x20Fd; //bpb->fat32RootCluster = 0x20202020; //bpb->fat32FSInfo = 0x2020; //bpb->fat32BackBootBlock = 0x2020; //if(!dev_->cacheFlush()) // return false; //if (!dev_->cacheRawBlock(1, EmuFat::CACHE_FOR_WRITE)) return false; //static const u8 rootEntry[8] = //{ // 0xF8, 0xFF, 0xFF, 0xFF, //} ; //memcpy(dev_->cache_.cacheBuffer_.data,rootEntry,4); //if(!dev_->cacheFlush()) // return false; //if (!dev_->cacheRawBlock(33, EmuFat::CACHE_FOR_WRITE)) return false; //memcpy(dev_->cache_.cacheBuffer_.data,rootEntry,4); //if(!dev_->cacheFlush()) // return false; //return init(dev_,0); return false; } bool EmuFatVolume::init(EmuFat* dev, u8 part) { u32 volumeStartBlock = 0; dev_ = dev; // if part == 0 assume super floppy with FAT boot sector in block zero // if part > 0 assume mbr volume with partition table if (part) { if (part > 4) return false; if (!dev->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_READ)) return false; TPartitionRecord* p = &dev->cache_.cacheBuffer_.mbr.part[part-1]; if ((p->boot & 0X7F) !=0 || p->totalSectors < 100 || p->firstSector == 0) { // not a valid partition return false; } volumeStartBlock = p->firstSector; } if (!dev->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_READ)) return false; TFat32BootSector* bs = &dev->cache_.cacheBuffer_.fbs; if (bs->bytesPerSector != 512 || bs->fatCount == 0 || bs->reservedSectorCount == 0 || bs->sectorsPerCluster == 0) { // not valid FAT volume return false; } fatCount_ = bs->fatCount; blocksPerCluster_ = bs->sectorsPerCluster; // determine shift that is same as multiply by blocksPerCluster_ clusterSizeShift_ = 0; while (blocksPerCluster_ != (1 << clusterSizeShift_)) { // error if not power of 2 if (clusterSizeShift_++ > 7) return false; } blocksPerFat_ = bs->sectorsPerFat16 ? bs->sectorsPerFat16 : bs->fat32.sectorsPerFat32; fatStartBlock_ = volumeStartBlock + bs->reservedSectorCount; // count for FAT16 zero for FAT32 rootDirEntryCount_ = bs->rootDirEntryCount; // directory start for FAT16 dataStart for FAT32 rootDirStart_ = fatStartBlock_ + bs->fatCount * blocksPerFat_; // data start for FAT16 and FAT32 dataStartBlock_ = rootDirStart_ + ((32 * bs->rootDirEntryCount + 511)/512); // total blocks for FAT16 or FAT32 u32 totalBlocks = bs->totalSectors16 ? bs->totalSectors16 : bs->totalSectors32; // total data blocks clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); // divide by cluster size to get cluster count clusterCount_ >>= clusterSizeShift_; // FAT type is determined by cluster count if (clusterCount_ < 4085) { fatType_ = 12; } else if (clusterCount_ < 65525) { fatType_ = 16; } else { rootDirStart_ = bs->fat32.fat32RootCluster; fatType_ = 32; } return true; } u8 EmuFatVolume::allocContiguous(u32 count, u32* curCluster) { // start of group u32 bgnCluster; // flag to save place to start next search u8 setStart; // set search start cluster if (*curCluster) { // try to make file contiguous bgnCluster = *curCluster + 1; // don't save new start location setStart = false; } else { // start at likely place for free cluster bgnCluster = allocSearchStart_; // save next search start if one cluster setStart = 1 == count; } // end of group u32 endCluster = bgnCluster; // last cluster of FAT u32 fatEnd = clusterCount_ + 1; // search the FAT for free clusters for (u32 n = 0;; n++, endCluster++) { // can't find space checked all clusters if (n >= clusterCount_) return false; // past end - start from beginning of FAT if (endCluster > fatEnd) { bgnCluster = endCluster = 2; } u32 f; if (!fatGet(endCluster, &f)) return false; if (f != 0) { // cluster in use try next cluster as bgnCluster bgnCluster = endCluster + 1; } else if ((endCluster - bgnCluster + 1) == count) { // done - found space break; } } // mark end of chain if (!fatPutEOC(endCluster)) return false; // link clusters while (endCluster > bgnCluster) { if (!fatPut(endCluster - 1, endCluster)) return false; endCluster--; } if (*curCluster != 0) { // connect chains if (!fatPut(*curCluster, bgnCluster)) return false; } // return first cluster number to caller *curCluster = bgnCluster; // remember possible next free cluster if (setStart) allocSearchStart_ = bgnCluster + 1; return true; } u8 EmuFatVolume::fatGet(u32 cluster, u32* value) const { if (cluster > (clusterCount_ + 1)) return false; u32 lba = fatStartBlock_; lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; if (lba != dev_->cache_.cacheBlockNumber_) { if (!dev_->cacheRawBlock(lba, EmuFat::CACHE_FOR_READ)) return false; } if (fatType_ == 16) { *value = dev_->cache_.cacheBuffer_.fat16[cluster & 0XFF]; } else { *value = dev_->cache_.cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; } return true; } // Store a FAT entry u8 EmuFatVolume::fatPut(u32 cluster, u32 value) { // error if reserved cluster if (cluster < 2) return false; // error if not in FAT if (cluster > (clusterCount_ + 1)) return false; // calculate block address for entry u32 lba = fatStartBlock_; lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; if (lba != dev_->cache_.cacheBlockNumber_) { if (!dev_->cacheRawBlock(lba, EmuFat::CACHE_FOR_READ)) return false; } // store entry if (fatType_ == 16) { dev_->cache_.cacheBuffer_.fat16[cluster & 0xFF] = value; } else { dev_->cache_.cacheBuffer_.fat32[cluster & 0x7F] = value; } dev_->cacheSetDirty(); // mirror second FAT if (fatCount_ > 1) dev_->cache_.cacheMirrorBlock_ = lba + blocksPerFat_; return true; } // return the size in bytes of a cluster chain u8 EmuFatVolume::chainSize(u32 cluster, u32* size) const { u32 s = 0; do { if (!fatGet(cluster, &cluster)) return false; s += 512UL << clusterSizeShift_; } while (!isEOC(cluster)); *size = s; return true; } // free a cluster chain u8 EmuFatVolume::freeChain(u32 cluster) { // clear free cluster location allocSearchStart_ = 2; do { u32 next; if (!fatGet(cluster, &next)) return false; // free cluster if (!fatPut(cluster, 0)) return false; cluster = next; } while (!isEOC(cluster)); return true; } u8 EmuFatVolume::readData(u32 block, u16 offset, u16 count, u8* dst) { return dev_->readData(block, offset, count, dst); } u8 EmuFatVolume::writeBlock(u32 block, const u8* dst) { return dev_->writeBlock(block, dst); } //----------------------------------------------------------------------------------- //EmuFatFile: // add a cluster to a file u8 EmuFatFile::addCluster() { if (!vol_->allocContiguous(1, &curCluster_)) return false; // if first cluster of file link to directory entry if (firstCluster_ == 0) { firstCluster_ = curCluster_; flags_ |= F_FILE_DIR_DIRTY; } return true; } // Add a cluster to a directory file and zero the cluster. // return with first block of cluster in the cache u8 EmuFatFile::addDirCluster(void) { if (!addCluster()) return false; // zero data in cluster insure first cluster is in cache u32 block = vol_->clusterStartBlock(curCluster_); for (u8 i = vol_->blocksPerCluster_; i != 0; i--) { if (!vol_->dev_->cacheZeroBlock(block + i - 1)) return false; } // Increase directory file size by cluster size fileSize_ += 512UL << vol_->clusterSizeShift_; return true; } // cache a file's directory entry // return pointer to cached entry or null for failure TDirectoryEntry* EmuFatFile::cacheDirEntry(u8 action) { if (!vol_->dev_->cacheRawBlock(dirBlock_, action)) return NULL; return vol_->dev_->cache_.cacheBuffer_.dir + dirIndex_; } /** * Close a file and force cached data and directory information * to be written to the storage device. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include no file is open or an I/O error. */ u8 EmuFatFile::close(void) { if (!sync())return false; type_ = FAT_FILE_TYPE_CLOSED; return true; } /** * Check for contiguous file and return its raw block range. * * \param[out] bgnBlock the first block address for the file. * \param[out] endBlock the last block address for the file. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include file is not contiguous, file has zero length * or an I/O error occurred. */ u8 EmuFatFile::contiguousRange(u32* bgnBlock, u32* endBlock) { // error if no blocks if (firstCluster_ == 0) return false; for (u32 c = firstCluster_; ; c++) { u32 next; if (!vol_->fatGet(c, &next)) return false; // check for contiguous if (next != (c + 1)) { // error if not end of chain if (!vol_->isEOC(next)) return false; *bgnBlock = vol_->clusterStartBlock(firstCluster_); *endBlock = vol_->clusterStartBlock(c) + vol_->blocksPerCluster_ - 1; return true; } } } //------------------------------------------------------------------------------ /** * Create and open a new contiguous file of a specified size. * * \note This function only supports short DOS 8.3 names. * See open() for more information. * * \param[in] dirFile The directory where the file will be created. * \param[in] fileName A valid DOS 8.3 file name. * \param[in] size The desired file size. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include \a fileName contains * an invalid DOS 8.3 file name, the FAT volume has not been initialized, * a file is already open, the file already exists, the root * directory is full or an I/O error. * */ u8 EmuFatFile::createContiguous(EmuFatFile* dirFile, const char* fileName, u32 size) { // don't allow zero length file if (size == 0) return false; if (!open(dirFile, fileName, EO_CREAT | EO_EXCL | EO_RDWR)) return false; // calculate number of clusters needed u32 count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; // allocate clusters if (!vol_->allocContiguous(count, &firstCluster_)) { remove(); return false; } fileSize_ = size; // insure sync() will update dir entry flags_ |= F_FILE_DIR_DIRTY; return sync(); } /** * Return a files directory entry * * \param[out] dir Location for return of the files directory entry. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ u8 EmuFatFile::dirEntry(TDirectoryEntry* dir) { // make sure fields on SD are correct if (!sync()) return false; // read entry TDirectoryEntry* p = cacheDirEntry(EmuFat::CACHE_FOR_READ); if (!p) return false; // copy to caller's struct memcpy(dir, p, sizeof(TDirectoryEntry)); return true; } /** * Format the name field of \a dir into the 13 byte array * \a name in standard 8.3 short name format. * * \param[in] dir The directory structure containing the name. * \param[out] name A 13 byte char array for the formatted name. */ void EmuFatFile::dirName(const TDirectoryEntry& dir, char* name) { u8 j = 0; for (u8 i = 0; i < 11; i++) { if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; name[j++] = dir.name[i]; } name[j] = 0; } // format directory name field from a 8.3 name string u8 EmuFatFile::make83Name(const char* str, u8* name) { u8 c; u8 n = 7; // max index for part before dot u8 i = 0; // blank fill name and extension while (i < 11) name[i++] = ' '; i = 0; while ((c = *str++) != '\0') { if (c == '.') { if (n == 10) return false; // only one dot allowed n = 10; // max index for full 8.3 name i = 8; // place for extension } else { // illegal FAT characters static const char* px = "\\/:*?\"<>"; const char* p = px; u8 b; while ((b = *p++)) if (b == c) return false; // check size and only allow ASCII printable characters if (i > n || c < 0X21 || c > 0X7E)return false; // only upper case allowed in 8.3 names - convert lower to upper name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a'); } } // must have a file name, extension is optional return name[0] != ' '; } /** Make a new directory. * * \param[in] dir An open SdFat instance for the directory that will containing * the new directory. * * \param[in] dirName A valid 8.3 DOS name for the new directory. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include this SdFile is already open, \a dir is not a * directory, \a dirName is invalid or already exists in \a dir. */ u8 EmuFatFile::makeDir(EmuFatFile* dir, const char* dirName) { TDirectoryEntry d; // create a normal file if (!open(dir, dirName, EO_CREAT | EO_EXCL | EO_RDWR)) return false; // convert SdFile to directory flags_ = EO_READ; type_ = FAT_FILE_TYPE_SUBDIR; // allocate and zero first cluster if (!addDirCluster())return false; // force entry to SD if (!sync()) return false; // cache entry - should already be in cache due to sync() call TDirectoryEntry* p = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!p) return false; // change directory entry attribute p->attributes = DIR_ATT_DIRECTORY; // make entry for '.' memcpy(&d, p, sizeof(d)); for (u8 i = 1; i < 11; i++) d.name[i] = ' '; d.name[0] = '.'; // cache block for '.' and '..' u32 block = vol_->clusterStartBlock(firstCluster_); if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_WRITE)) return false; // copy '.' to block memcpy(&vol_->dev_->cache_.cacheBuffer_.dir[0], &d, sizeof(d)); // make entry for '..' d.name[1] = '.'; if (dir->isRoot()) { d.firstClusterLow = 0; d.firstClusterHigh = 0; } else { d.firstClusterLow = dir->firstCluster_ & 0XFFFF; d.firstClusterHigh = dir->firstCluster_ >> 16; } // copy '..' to block memcpy(&vol_->dev_->cache_.cacheBuffer_.dir[1], &d, sizeof(d)); // set position after '..' curPosition_ = 2 * sizeof(d); // write first block return vol_->dev_->cacheFlush(); } /** * Open a file or directory by name. * * \param[in] dirFile An open SdFat instance for the directory containing the * file to be opened. * * \param[in] fileName A valid 8.3 DOS name for a file to be opened. * * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of flags from the following list * * O_READ - Open for reading. * * O_RDONLY - Same as O_READ. * * O_WRITE - Open for writing. * * O_WRONLY - Same as O_WRITE. * * O_RDWR - Open for reading and writing. * * O_APPEND - If set, the file offset shall be set to the end of the * file prior to each write. * * O_CREAT - If the file exists, this flag has no effect except as noted * under O_EXCL below. Otherwise, the file shall be created * * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. * * O_SYNC - Call sync() after each write. This flag should not be used with * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. * These functions do character at a time writes so sync() will be called * after each byte. * * O_TRUNC - If the file exists and is a regular file, and the file is * successfully opened and is not read only, its length shall be truncated to 0. * * \note Directory files must be opened read only. Write and truncation is * not allowed for directory files. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include this SdFile is already open, \a difFile is not * a directory, \a fileName is invalid, the file does not exist * or can't be opened in the access mode specified by oflag. */ u8 EmuFatFile::open(EmuFatFile* dirFile, const char* fileName, u8 oflag) { u8 dname[11]; TDirectoryEntry* p; // error if already open if (isOpen())return false; if (!make83Name(fileName, dname)) return false; vol_ = dirFile->vol_; dirFile->rewind(); // bool for empty entry found u8 emptyFound = false; // search for file while (dirFile->curPosition_ < dirFile->fileSize_) { u8 index = 0XF & (dirFile->curPosition_ >> 5); p = dirFile->readDirCache(); if (p == NULL) return false; if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { // remember first empty slot if (!emptyFound) { emptyFound = true; dirIndex_ = index; dirBlock_ = vol_->dev_->cache_.cacheBlockNumber_; } // done if no entries follow if (p->name[0] == DIR_NAME_FREE) break; } else if (!memcmp(dname, p->name, 11)) { // don't open existing file if O_CREAT and O_EXCL if ((oflag & (EO_CREAT | EO_EXCL)) == (EO_CREAT | EO_EXCL)) return false; // open found file return openCachedEntry(0XF & index, oflag); } } // only create file if O_CREAT and O_WRITE if ((oflag & (EO_CREAT | EO_WRITE)) != (EO_CREAT | EO_WRITE)) return false; // cache found slot or add cluster if end of file if (emptyFound) { p = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!p) return false; } else { if (dirFile->type_ == FAT_FILE_TYPE_ROOT16) return false; // add and zero cluster for dirFile - first cluster is in cache for write if (!dirFile->addDirCluster()) return false; // use first entry in cluster dirIndex_ = 0; p = vol_->dev_->cache_.cacheBuffer_.dir; } // initialize as empty file memset(p, 0, sizeof(TDirectoryEntry)); memcpy(p->name, dname, 11); // set timestamps if (dateTime_) { // call user function dateTime_(&p->creationDate, &p->creationTime); } else { // use default date/time p->creationDate = FAT_DEFAULT_DATE; p->creationTime = FAT_DEFAULT_TIME; } p->lastAccessDate = p->creationDate; p->lastWriteDate = p->creationDate; p->lastWriteTime = p->creationTime; // force write of entry to SD if (!vol_->dev_->cacheFlush()) return false; // open entry in cache return openCachedEntry(dirIndex_, oflag); } /** * Open a file by index. * * \param[in] dirFile An open SdFat instance for the directory. * * \param[in] index The \a index of the directory entry for the file to be * opened. The value for \a index is (directory file position)/32. * * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. * * See open() by fileName for definition of flags and return values. * */ u8 EmuFatFile::open(EmuFatFile* dirFile, u16 index, u8 oflag) { // error if already open if (isOpen())return false; // don't open existing file if O_CREAT and O_EXCL - user call error if ((oflag & (EO_CREAT | EO_EXCL)) == (EO_CREAT | EO_EXCL)) return false; vol_ = dirFile->vol_; // seek to location of entry if (!dirFile->seekSet(32 * index)) return false; // read entry into cache TDirectoryEntry* p = dirFile->readDirCache(); if (p == NULL) return false; // error if empty slot or '.' or '..' if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { return false; } // open cached entry return openCachedEntry(index & 0XF, oflag); } //------------------------------------------------------------------------------ // open a cached directory entry. Assumes vol_ is initializes u8 EmuFatFile::openCachedEntry(u8 dirIndex, u8 oflag) { // location of entry in cache TDirectoryEntry* p = vol_->dev_->cache_.cacheBuffer_.dir + dirIndex; // write or truncate is an error for a directory or read-only file if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { if (oflag & (EO_WRITE | EO_TRUNC)) return false; } // remember location of directory entry on SD dirIndex_ = dirIndex; dirBlock_ = vol_->dev_->cache_.cacheBlockNumber_; // copy first cluster number for directory fields firstCluster_ = (u32)p->firstClusterHigh << 16; firstCluster_ |= p->firstClusterLow; // make sure it is a normal file or subdirectory if (DIR_IS_FILE(p)) { fileSize_ = p->fileSize; type_ = FAT_FILE_TYPE_NORMAL; } else if (DIR_IS_SUBDIR(p)) { if (!vol_->chainSize(firstCluster_, &fileSize_)) return false; type_ = FAT_FILE_TYPE_SUBDIR; } else { return false; } // save open flags for read/write flags_ = oflag & (EO_ACCMODE | EO_SYNC | EO_APPEND); // set to start of file curCluster_ = 0; curPosition_ = 0; // truncate file to zero length if requested if (oflag & EO_TRUNC) return truncate(0); return true; } //------------------------------------------------------------------------------ /** * Open a volume's root directory. * * \param[in] vol The FAT volume containing the root directory to be opened. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the FAT volume has not been initialized * or it a FAT12 volume. */ u8 EmuFatFile::openRoot(EmuFatVolume* vol) { // error if file is already open if (isOpen()) return false; if (vol->fatType() == 16) { type_ = FAT_FILE_TYPE_ROOT16; firstCluster_ = 0; fileSize_ = 32 * vol->rootDirEntryCount(); } else if (vol->fatType() == 32) { type_ = FAT_FILE_TYPE_ROOT32; firstCluster_ = vol->rootDirStart(); if (!vol->chainSize(firstCluster_, &fileSize_)) return false; } else { // volume is not initialized or FAT12 return false; } vol_ = vol; // read only flags_ = EO_READ; // set to start of file curCluster_ = 0; curPosition_ = 0; // root has no directory entry dirBlock_ = 0; dirIndex_ = 0; return true; } //------------------------------------------------------------------------------ /** * Read data from a file starting at the current position. * * \param[out] buf Pointer to the location that will receive the data. * * \param[in] nbyte Maximum number of bytes to read. * * \return For success read() returns the number of bytes read. * A value less than \a nbyte, including zero, will be returned * if end of file is reached. * If an error occurs, read() returns -1. Possible errors include * read() called before a file has been opened, corrupt file system * or an I/O error occurred. */ s32 EmuFatFile::read(void* buf, u32 nbyte) { u8* dst = reinterpret_cast(buf); // error if not open or write only if (!isOpen() || !(flags_ & EO_READ)) return -1; // max bytes left in file if (nbyte > (fileSize_ - curPosition_)) nbyte = fileSize_ - curPosition_; // amount left to read u32 toRead = nbyte; while (toRead > 0) { u32 block; // raw device block number u16 offset = curPosition_ & 0x1FF; // offset in block if (type_ == FAT_FILE_TYPE_ROOT16) { block = vol_->rootDirStart() + (curPosition_ >> 9); } else { u8 blockOfCluster = vol_->blockOfCluster(curPosition_); if (offset == 0 && blockOfCluster == 0) { // start of new cluster if (curPosition_ == 0) { // use first cluster in file curCluster_ = firstCluster_; } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) return -1; } } block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; } u32 n = toRead; // amount to be read from current block if (n > (512UL - offset)) n = 512 - offset; // no buffering needed if n == 512 or user requests no buffering if ((unbufferedRead() || n == 512) && block != vol_->dev_->cache_.cacheBlockNumber_) { if (!vol_->readData(block, offset, n, dst)) return -1; dst += n; } else { // read block to cache and copy data to caller if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_READ)) return -1; u8* src = vol_->dev_->cache_.cacheBuffer_.data + offset; u8* end = src + n; while (src != end) *dst++ = *src++; } curPosition_ += n; toRead -= n; } return nbyte; } //------------------------------------------------------------------------------ /** * Read the next directory entry from a directory file. * * \param[out] dir The dir_t struct that will receive the data. * * \return For success readDir() returns the number of bytes read. * A value of zero will be returned if end of file is reached. * If an error occurs, readDir() returns -1. Possible errors include * readDir() called before a directory has been opened, this is not * a directory file or an I/O error occurred. */ s8 EmuFatFile::readDir(TDirectoryEntry* dir) { s16 n; // if not a directory file or miss-positioned return an error if (!isDir() || (0x1F & curPosition_)) return -1; while ((n = read(dir, sizeof(TDirectoryEntry))) == sizeof(TDirectoryEntry)) { // last entry if DIR_NAME_FREE if (dir->name[0] == DIR_NAME_FREE) break; // skip empty entries and entry for . and .. if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; // return if normal file or subdirectory if (DIR_IS_FILE_OR_SUBDIR(dir)) return (s8)n; } // error, end of file, or past last entry return n < 0 ? -1 : 0; } // Read next directory entry into the cache // Assumes file is correctly positioned TDirectoryEntry* EmuFatFile::readDirCache(void) { // error if not directory if (!isDir()) return NULL; // index of entry in cache u8 i = (curPosition_ >> 5) & 0XF; // use read to locate and cache block if (read() < 0) return NULL; // advance to next entry curPosition_ += 31; // return pointer to entry return (vol_->dev_->cache_.cacheBuffer_.dir + i); } //------------------------------------------------------------------------------ /** * Remove a file. * * The directory entry and all data for the file are deleted. * * \note This function should not be used to delete the 8.3 version of a * file that has a long name. For example if a file has the long name * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the file read-only, is a directory, * or an I/O error occurred. */ u8 EmuFatFile::remove(void) { // free any clusters - will fail if read-only or directory if (!truncate(0)) return false; // cache directory entry TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!d) return false; // mark entry deleted d->name[0] = DIR_NAME_DELETED; // set this SdFile closed type_ = FAT_FILE_TYPE_CLOSED; // write entry to SD return vol_->dev_->cacheFlush(); } //------------------------------------------------------------------------------ /** * Remove a file. * * The directory entry and all data for the file are deleted. * * \param[in] dirFile The directory that contains the file. * \param[in] fileName The name of the file to be removed. * * \note This function should not be used to delete the 8.3 version of a * file that has a long name. For example if a file has the long name * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the file is a directory, is read only, * \a dirFile is not a directory, \a fileName is not found * or an I/O error occurred. */ u8 EmuFatFile::remove(EmuFatFile* dirFile, const char* fileName) { EmuFatFile file; if (!file.open(dirFile, fileName, EO_WRITE)) return false; return file.remove(); } //------------------------------------------------------------------------------ /** Remove a directory file. * * The directory file will be removed only if it is empty and is not the * root directory. rmDir() follows DOS and Windows and ignores the * read-only attribute for the directory. * * \note This function should not be used to delete the 8.3 version of a * directory that has a long name. For example if a directory has the * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the file is not a directory, is the root * directory, is not empty, or an I/O error occurred. */ u8 EmuFatFile::rmDir(void) { // must be open subdirectory if (!isSubDir()) return false; rewind(); // make sure directory is empty while (curPosition_ < fileSize_) { TDirectoryEntry* p = readDirCache(); if (p == NULL) return false; // done if past last used entry if (p->name[0] == DIR_NAME_FREE) break; // skip empty slot or '.' or '..' if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; // error not empty if (DIR_IS_FILE_OR_SUBDIR(p)) return false; } // convert empty directory to normal file for remove type_ = FAT_FILE_TYPE_NORMAL; flags_ |= EO_WRITE; return remove(); } //------------------------------------------------------------------------------ /** Recursively delete a directory and all contained files. * * This is like the Unix/Linux 'rm -rf *' if called with the root directory * hence the name. * * Warning - This will remove all contents of the directory including * subdirectories. The directory will then be removed if it is not root. * The read-only attribute for files will be ignored. * * \note This function should not be used to delete the 8.3 version of * a directory that has a long name. See remove() and rmDir(). * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ u8 EmuFatFile::rmRfStar(void) { rewind(); while (curPosition_ < fileSize_) { EmuFatFile f; // remember position u16 index = curPosition_/32; TDirectoryEntry* p = readDirCache(); if (!p) return false; // done if past last entry if (p->name[0] == DIR_NAME_FREE) break; // skip empty slot or '.' or '..' if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; // skip if part of long file name or volume label in root if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; if (!f.open(this, index, EO_READ)) return false; if (f.isSubDir()) { // recursively delete return rmRfStar(); } else { // ignore read-only f.flags_ |= EO_WRITE; if (!f.remove()) return false; } // position to next entry if required if (curPosition_ != (32*(index + 1))) { if (!seekSet(32*(index + 1))) return false; } } // don't try to delete root if (isRoot()) return true; return rmDir(); } u8 EmuFatFile::seekSet(u32 pos) { // error if file not open or seek past end of file if (!isOpen() || pos > fileSize_) return false; if (type_ == FAT_FILE_TYPE_ROOT16) { curPosition_ = pos; return true; } if (pos == 0) { // set position to start of file curCluster_ = 0; curPosition_ = 0; return true; } // calculate cluster index for cur and new position u32 nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); u32 nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); if (nNew < nCur || curPosition_ == 0) { // must follow chain from first cluster curCluster_ = firstCluster_; } else { // advance from curPosition nNew -= nCur; } while (nNew--) { if (!vol_->fatGet(curCluster_, &curCluster_)) return false; } curPosition_ = pos; return true; } //------------------------------------------------------------------------------ /** * The sync() call causes all modified data and directory fields * to be written to the storage device. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include a call to sync() before a file has been * opened or an I/O error. */ u8 EmuFatFile::sync(void) { // only allow open files and directories if (!isOpen()) return false; if (flags_ & F_FILE_DIR_DIRTY) { TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!d) return false; // do not set filesize for dir files if (!isDir()) d->fileSize = fileSize_; // update first cluster fields d->firstClusterLow = firstCluster_ & 0XFFFF; d->firstClusterHigh = firstCluster_ >> 16; // set modify time if user supplied a callback date/time function if (dateTime_) { dateTime_(&d->lastWriteDate, &d->lastWriteTime); d->lastAccessDate = d->lastWriteDate; } // clear directory dirty flags_ &= ~F_FILE_DIR_DIRTY; } return vol_->dev_->cacheFlush(); } //------------------------------------------------------------------------------ /** * Set a file's timestamps in its directory entry. * * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive * OR of flags from the following list * * T_ACCESS - Set the file's last access date. * * T_CREATE - Set the file's creation date and time. * * T_WRITE - Set the file's last write/modification date and time. * * \param[in] year Valid range 1980 - 2107 inclusive. * * \param[in] month Valid range 1 - 12 inclusive. * * \param[in] day Valid range 1 - 31 inclusive. * * \param[in] hour Valid range 0 - 23 inclusive. * * \param[in] minute Valid range 0 - 59 inclusive. * * \param[in] second Valid range 0 - 59 inclusive * * \note It is possible to set an invalid date since there is no check for * the number of days in a month. * * \note * Modify and access timestamps may be overwritten if a date time callback * function has been set by dateTimeCallback(). * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ u8 EmuFatFile::timestamp(u8 flags, u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second) { if (!isOpen() || year < 1980 || year > 2107 || month < 1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 59) { return false; } TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!d) return false; u16 dirDate = FAT_DATE(year, month, day); u16 dirTime = FAT_TIME(hour, minute, second); if (flags & T_ACCESS) { d->lastAccessDate = dirDate; } if (flags & T_CREATE) { d->creationDate = dirDate; d->creationTime = dirTime; // seems to be units of 1/100 second not 1/10 as Microsoft states d->creationTimeTenths = second & 1 ? 100 : 0; } if (flags & T_WRITE) { d->lastWriteDate = dirDate; d->lastWriteTime = dirTime; } vol_->dev_->cacheSetDirty(); return sync(); } //------------------------------------------------------------------------------ /** * Truncate a file to a specified length. The current file position * will be maintained if it is less than or equal to \a length otherwise * it will be set to end of file. * * \param[in] length The desired length for the file. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include file is read only, file is a directory, * \a length is greater than the current file size or an I/O error occurs. */ u8 EmuFatFile::truncate(u32 length) { // error if not a normal file or read-only if (!isFile() || !(flags_ & EO_WRITE)) return false; // error if length is greater than current size if (length > fileSize_) return false; // fileSize and length are zero - nothing to do if (fileSize_ == 0) return true; // remember position for seek after truncation u32 newPos = curPosition_ > length ? length : curPosition_; // position to last cluster in truncated file if (!seekSet(length)) return false; if (length == 0) { // free all clusters if (!vol_->freeChain(firstCluster_)) return false; firstCluster_ = 0; } else { u32 toFree; if (!vol_->fatGet(curCluster_, &toFree)) return false; if (!vol_->isEOC(toFree)) { // free extra clusters if (!vol_->freeChain(toFree)) return false; // current cluster is end of chain if (!vol_->fatPutEOC(curCluster_)) return false; } } fileSize_ = length; // need to update directory entry flags_ |= F_FILE_DIR_DIRTY; if (!sync()) return false; // set file to correct position return seekSet(newPos); } /** * Write data to an open file. * * \note Data is moved to the cache but may not be written to the * storage device until sync() is called. * * \param[in] buf Pointer to the location of the data to be written. * * \param[in] nbyte Number of bytes to write. * * \return For success write() returns the number of bytes written, always * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. * */ s32 EmuFatFile::write(const void* buf, u32 nbyte) { // convert void* to uint8_t* - must be before goto statements const u8* src = reinterpret_cast(buf); // number of bytes left to write - must be before goto statements u32 nToWrite = nbyte; // error if not a normal file or is read-only if (!isFile() || !(flags_ & EO_WRITE)) goto writeErrorReturn; // seek to end of file if append flag if ((flags_ & EO_APPEND) && curPosition_ != fileSize_) { if (!seekEnd()) goto writeErrorReturn; } while (nToWrite > 0) { u8 blockOfCluster = vol_->blockOfCluster(curPosition_); u16 blockOffset = curPosition_ & 0X1FF; if (blockOfCluster == 0 && blockOffset == 0) { // start of new cluster if (curCluster_ == 0) { if (firstCluster_ == 0) { // allocate first cluster of file if (!addCluster()) goto writeErrorReturn; } else { curCluster_ = firstCluster_; } } else { u32 next; if (!vol_->fatGet(curCluster_, &next)) return false; if (vol_->isEOC(next)) { // add cluster if at end of chain if (!addCluster()) goto writeErrorReturn; } else { curCluster_ = next; } } } // max space in block u32 n = 512 - blockOffset; // lesser of space and amount to write if (n > nToWrite) n = nToWrite; // block for data write u32 block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; if (n == 512) { // full block - don't need to use cache // invalidate cache if block is in cache if (vol_->dev_->cache_.cacheBlockNumber_ == block) { vol_->dev_->cache_.cacheBlockNumber_ = 0XFFFFFFFF; } if (!vol_->writeBlock(block, src)) goto writeErrorReturn; src += 512; } else { if (blockOffset == 0 && curPosition_ >= fileSize_) { // start of new block don't need to read into cache if (!vol_->dev_->cacheFlush()) goto writeErrorReturn; vol_->dev_->cache_.cacheBlockNumber_ = block; vol_->dev_->cacheSetDirty(); } else { // rewrite part of block if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_WRITE)) { goto writeErrorReturn; } } u8* dst = vol_->dev_->cache_.cacheBuffer_.data + blockOffset; u8* end = dst + n; while (dst != end) *dst++ = *src++; } nToWrite -= n; curPosition_ += n; } if (curPosition_ > fileSize_) { // update fileSize and insure sync will update dir entry fileSize_ = curPosition_; flags_ |= F_FILE_DIR_DIRTY; } else if (dateTime_ && nbyte) { // insure sync will update modified date and time flags_ |= F_FILE_DIR_DIRTY; } if (flags_ & EO_SYNC) { if (!sync()) goto writeErrorReturn; } return nbyte; writeErrorReturn: // return for write error writeError = true; return -1; } desmume-0.9.11/src/utils/tinyxml/0000755000000000000000000000000012467663413015406 5ustar rootrootdesmume-0.9.11/src/utils/tinyxml/tinystr.h0000755000000000000000000002000612467662066017277 0ustar rootroot/* www.sourceforge.net/projects/tinyxml This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TIXML_USE_STL #ifndef TIXML_STRING_INCLUDED #define TIXML_STRING_INCLUDED #include #include /* The support for explicit isn't that universal, and it isn't really required - it is used to check that the TiXmlString class isn't incorrectly used. Be nice to old compilers and macro it here: */ #if defined(_MSC_VER) && (_MSC_VER >= 1200 ) // Microsoft visual studio, version 6 and higher. #define TIXML_EXPLICIT explicit #elif defined(__GNUC__) && (__GNUC__ >= 3 ) // GCC version 3 and higher.s #define TIXML_EXPLICIT explicit #else #define TIXML_EXPLICIT #endif /* TiXmlString is an emulation of a subset of the std::string template. Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. Only the member functions relevant to the TinyXML project have been implemented. The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase a string and there's no more room, we allocate a buffer twice as big as we need. */ class TiXmlString { public : // The size type used typedef size_t size_type; // Error value for find primitive static const size_type npos; // = -1; // TiXmlString empty constructor TiXmlString () : rep_(&nullrep_) { } // TiXmlString copy constructor TiXmlString ( const TiXmlString & copy) : rep_(0) { init(copy.length()); memcpy(start(), copy.data(), length()); } // TiXmlString constructor, based on a string TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) { init( static_cast( strlen(copy) )); memcpy(start(), copy, length()); } // TiXmlString constructor, based on a string TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) { init(len); memcpy(start(), str, len); } // TiXmlString destructor ~TiXmlString () { quit(); } TiXmlString& operator = (const char * copy) { return assign( copy, (size_type)strlen(copy)); } TiXmlString& operator = (const TiXmlString & copy) { return assign(copy.start(), copy.length()); } // += operator. Maps to append TiXmlString& operator += (const char * suffix) { return append(suffix, static_cast( strlen(suffix) )); } // += operator. Maps to append TiXmlString& operator += (char single) { return append(&single, 1); } // += operator. Maps to append TiXmlString& operator += (const TiXmlString & suffix) { return append(suffix.data(), suffix.length()); } // Convert a TiXmlString into a null-terminated char * const char * c_str () const { return rep_->str; } // Convert a TiXmlString into a char * (need not be null terminated). const char * data () const { return rep_->str; } // Return the length of a TiXmlString size_type length () const { return rep_->size; } // Alias for length() size_type size () const { return rep_->size; } // Checks if a TiXmlString is empty bool empty () const { return rep_->size == 0; } // Return capacity of string size_type capacity () const { return rep_->capacity; } // single char extraction const char& at (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // [] operator char& operator [] (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // find a char in a string. Return TiXmlString::npos if not found size_type find (char lookup) const { return find(lookup, 0); } // find a char in a string from an offset. Return TiXmlString::npos if not found size_type find (char tofind, size_type offset) const { if (offset >= length()) return npos; for (const char* p = c_str() + offset; *p != '\0'; ++p) { if (*p == tofind) return static_cast< size_type >( p - c_str() ); } return npos; } void clear () { //Lee: //The original was just too strange, though correct: // TiXmlString().swap(*this); //Instead use the quit & re-init: quit(); init(0,0); } /* Function to reserve a big amount of data when we know we'll need it. Be aware that this function DOES NOT clear the content of the TiXmlString if any exists. */ void reserve (size_type cap); TiXmlString& assign (const char* str, size_type len); TiXmlString& append (const char* str, size_type len); void swap (TiXmlString& other) { Rep* r = rep_; rep_ = other.rep_; other.rep_ = r; } private: void init(size_type sz) { init(sz, sz); } void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } char* start() const { return rep_->str; } char* finish() const { return rep_->str + rep_->size; } struct Rep { size_type size, capacity; char str[1]; }; void init(size_type sz, size_type cap) { if (cap) { // Lee: the original form: // rep_ = static_cast(operator new(sizeof(Rep) + cap)); // doesn't work in some cases of new being overloaded. Switching // to the normal allocation, although use an 'int' for systems // that are overly picky about structure alignment. const size_type bytesNeeded = sizeof(Rep) + cap; const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); rep_ = reinterpret_cast( new int[ intsNeeded ] ); rep_->str[ rep_->size = sz ] = '\0'; rep_->capacity = cap; } else { rep_ = &nullrep_; } } void quit() { if (rep_ != &nullrep_) { // The rep_ is really an array of ints. (see the allocator, above). // Cast it back before delete, so the compiler won't incorrectly call destructors. delete [] ( reinterpret_cast( rep_ ) ); } } Rep * rep_; static Rep nullrep_; } ; inline bool operator == (const TiXmlString & a, const TiXmlString & b) { return ( a.length() == b.length() ) // optimization on some platforms && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare } inline bool operator < (const TiXmlString & a, const TiXmlString & b) { return strcmp(a.c_str(), b.c_str()) < 0; } inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); TiXmlString operator + (const TiXmlString & a, const char* b); TiXmlString operator + (const char* a, const TiXmlString & b); /* TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. Only the operators that we need for TinyXML have been developped. */ class TiXmlOutStream : public TiXmlString { public : // TiXmlOutStream << operator. TiXmlOutStream & operator << (const TiXmlString & in) { *this += in; return *this; } // TiXmlOutStream << operator. TiXmlOutStream & operator << (const char * in) { *this += in; return *this; } } ; #endif // TIXML_STRING_INCLUDED #endif // TIXML_USE_STL desmume-0.9.11/src/utils/tinyxml/tinyxml.h0000755000000000000000000017650212467662066017304 0ustar rootroot/* www.sourceforge.net/projects/tinyxml Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TINYXML_INCLUDED #define TINYXML_INCLUDED #ifdef _MSC_VER #pragma warning( push ) #pragma warning( disable : 4530 ) #pragma warning( disable : 4786 ) #endif #include #include #include #include #include // Help out windows: #if defined( _DEBUG ) && !defined( DEBUG ) #define DEBUG #endif #ifdef TIXML_USE_STL #include #include #include #define TIXML_STRING std::string #else #include "tinystr.h" #define TIXML_STRING TiXmlString #endif // Deprecated library function hell. Compilers want to use the // new safe versions. This probably doesn't fully address the problem, // but it gets closer. There are too many compilers for me to fully // test. If you get compilation troubles, undefine TIXML_SAFE #define TIXML_SAFE #ifdef TIXML_SAFE #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) // Microsoft visual studio, version 2005 and higher. #define TIXML_SNPRINTF _snprintf_s #define TIXML_SSCANF sscanf_s #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) // Microsoft visual studio, version 6 and higher. //#pragma message( "Using _sn* functions." ) #define TIXML_SNPRINTF _snprintf #define TIXML_SSCANF sscanf #elif defined(__GNUC__) && (__GNUC__ >= 3 ) // GCC version 3 and higher.s //#warning( "Using sn* functions." ) #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #else #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #endif #endif class TiXmlDocument; class TiXmlElement; class TiXmlComment; class TiXmlUnknown; class TiXmlAttribute; class TiXmlText; class TiXmlDeclaration; class TiXmlParsingData; const int TIXML_MAJOR_VERSION = 2; const int TIXML_MINOR_VERSION = 6; const int TIXML_PATCH_VERSION = 2; /* Internal structure for tracking location of items in the XML file. */ struct TiXmlCursor { TiXmlCursor() { Clear(); } void Clear() { row = col = -1; } int row; // 0 based. int col; // 0 based. }; /** Implements the interface to the "Visitor pattern" (see the Accept() method.) If you call the Accept() method, it requires being passed a TiXmlVisitor class to handle callbacks. For nodes that contain other nodes (Document, Element) you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves are simply called with Visit(). If you return 'true' from a Visit method, recursive parsing will continue. If you return false, no children of this node or its sibilings will be Visited. All flavors of Visit methods have a default implementation that returns 'true' (continue visiting). You need to only override methods that are interesting to you. Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. You should never change the document from a callback. @sa TiXmlNode::Accept() */ class TiXmlVisitor { public: virtual ~TiXmlVisitor() {} /// Visit a document. virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } /// Visit a document. virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } /// Visit an element. virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } /// Visit an element. virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } /// Visit a declaration virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } /// Visit a text node virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } /// Visit a comment node virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } /// Visit an unknown node virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } }; // Only used by Attribute::Query functions enum { TIXML_SUCCESS, TIXML_NO_ATTRIBUTE, TIXML_WRONG_TYPE }; // Used by the parsing routines. enum TiXmlEncoding { TIXML_ENCODING_UNKNOWN, TIXML_ENCODING_UTF8, TIXML_ENCODING_LEGACY }; const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; /** TiXmlBase is a base class for every class in TinyXml. It does little except to establish that TinyXml classes can be printed and provide some utility functions. In XML, the document and elements can contain other elements and other types of nodes. @verbatim A Document can contain: Element (container or leaf) Comment (leaf) Unknown (leaf) Declaration( leaf ) An Element can contain: Element (container or leaf) Text (leaf) Attributes (not on tree) Comment (leaf) Unknown (leaf) A Decleration contains: Attributes (not on tree) @endverbatim */ class TiXmlBase { friend class TiXmlNode; friend class TiXmlElement; friend class TiXmlDocument; public: TiXmlBase() : userData(0) {} virtual ~TiXmlBase() {} /** All TinyXml classes can print themselves to a filestream or the string class (TiXmlString in non-STL mode, std::string in STL mode.) Either or both cfile and str can be null. This is a formatted print, and will insert tabs and newlines. (For an unformatted stream, use the << operator.) */ virtual void Print( FILE* cfile, int depth ) const = 0; /** The world does not agree on whether white space should be kept or not. In order to make everyone happy, these global, static functions are provided to set whether or not TinyXml will condense all white space into a single space or not. The default is to condense. Note changing this value is not thread safe. */ static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } /// Return the current white space setting. static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } /** Return the position, in the original source file, of this node or attribute. The row and column are 1-based. (That is the first row and first column is 1,1). If the returns values are 0 or less, then the parser does not have a row and column value. Generally, the row and column value will be set when the TiXmlDocument::Load(), TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set when the DOM was created from operator>>. The values reflect the initial load. Once the DOM is modified programmatically (by adding or changing nodes and attributes) the new values will NOT update to reflect changes in the document. There is a minor performance cost to computing the row and column. Computation can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. @sa TiXmlDocument::SetTabSize() */ int Row() const { return location.row + 1; } int Column() const { return location.col + 1; } ///< See Row() void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. // Table that returs, for a given lead byte, the total number of bytes // in the UTF-8 sequence. static const int utf8ByteTable[256]; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, or they will be transformed into entities! */ static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); enum { TIXML_NO_ERROR = 0, TIXML_ERROR, TIXML_ERROR_OPENING_FILE, TIXML_ERROR_PARSING_ELEMENT, TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, TIXML_ERROR_READING_ELEMENT_VALUE, TIXML_ERROR_READING_ATTRIBUTES, TIXML_ERROR_PARSING_EMPTY, TIXML_ERROR_READING_END_TAG, TIXML_ERROR_PARSING_UNKNOWN, TIXML_ERROR_PARSING_COMMENT, TIXML_ERROR_PARSING_DECLARATION, TIXML_ERROR_DOCUMENT_EMPTY, TIXML_ERROR_EMBEDDED_NULL, TIXML_ERROR_PARSING_CDATA, TIXML_ERROR_DOCUMENT_TOP_ONLY, TIXML_ERROR_STRING_COUNT }; protected: static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); inline static bool IsWhiteSpace( char c ) { return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); } inline static bool IsWhiteSpace( int c ) { if ( c < 256 ) return IsWhiteSpace( (char) c ); return false; // Again, only truly correct for English/Latin...but usually works. } #ifdef TIXML_USE_STL static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); #endif /* Reads an XML name into the string provided. Returns a pointer just past the last character of the name, or 0 if the function has an error. */ static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); /* Reads text. Returns a pointer past the given end tag. Wickedly complex options, but it keeps the (sensitive) code in one place. */ static const char* ReadText( const char* in, // where to start TIXML_STRING* text, // the string read bool ignoreWhiteSpace, // whether to keep the white space const char* endTag, // what ends this text bool ignoreCase, // whether to ignore case in the end tag TiXmlEncoding encoding ); // the current encoding // If an entity has been found, transform it into a character. static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); // Get a character, while interpreting entities. // The length can be from 0 to 4 bytes. inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) { assert( p ); if ( encoding == TIXML_ENCODING_UTF8 ) { *length = utf8ByteTable[ *((const unsigned char*)p) ]; assert( *length >= 0 && *length < 5 ); } else { *length = 1; } if ( *length == 1 ) { if ( *p == '&' ) return GetEntity( p, _value, length, encoding ); *_value = *p; return p+1; } else if ( *length ) { //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), // and the null terminator isn't needed for( int i=0; p[i] && i<*length; ++i ) { _value[i] = p[i]; } return p + (*length); } else { // Not valid text. return 0; } } // Return true if the next characters in the stream are any of the endTag sequences. // Ignore case only works for english, and should only be relied on when comparing // to English words: StringEqual( p, "version", true ) is fine. static bool StringEqual( const char* p, const char* endTag, bool ignoreCase, TiXmlEncoding encoding ); static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; TiXmlCursor location; /// Field containing a generic user pointer void* userData; // None of these methods are reliable for any language except English. // Good for approximation, not great for accuracy. static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); inline static int ToLower( int v, TiXmlEncoding encoding ) { if ( encoding == TIXML_ENCODING_UTF8 ) { if ( v < 128 ) return tolower( v ); return v; } else { return tolower( v ); } } static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); private: TiXmlBase( const TiXmlBase& ); // not implemented. void operator=( const TiXmlBase& base ); // not allowed. struct Entity { const char* str; unsigned int strLength; char chr; }; enum { NUM_ENTITY = 5, MAX_ENTITY_LENGTH = 6 }; static Entity entity[ NUM_ENTITY ]; static bool condenseWhiteSpace; }; /** The parent class for everything in the Document Object Model. (Except for attributes). Nodes have siblings, a parent, and children. A node can be in a document, or stand on its own. The type of a TiXmlNode can be queried, and it can be cast to its more defined type. */ class TiXmlNode : public TiXmlBase { friend class TiXmlDocument; friend class TiXmlElement; public: #ifdef TIXML_USE_STL /** An input stream operator, for every class. Tolerant of newlines and formatting, but doesn't expect them. */ friend std::istream& operator >> (std::istream& in, TiXmlNode& base); /** An output stream operator, for every class. Note that this outputs without any newlines or formatting, as opposed to Print(), which includes tabs and new lines. The operator<< and operator>> are not completely symmetric. Writing a node to a stream is very well defined. You'll get a nice stream of output, without any extra whitespace or newlines. But reading is not as well defined. (As it always is.) If you create a TiXmlElement (for example) and read that from an input stream, the text needs to define an element or junk will result. This is true of all input streams, but it's worth keeping in mind. A TiXmlDocument will read nodes until it reads a root element, and all the children of that root element. */ friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); /// Appends the XML node or attribute to a std::string. friend std::string& operator<< (std::string& out, const TiXmlNode& base ); #endif /** The types of XML nodes supported by TinyXml. (All the unsupported types are picked up by UNKNOWN.) */ enum NodeType { TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, TINYXML_DECLARATION, TINYXML_TYPECOUNT }; virtual ~TiXmlNode(); /** The meaning of 'value' changes for the specific type of TiXmlNode. @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim The subclasses will wrap this function. */ const char *Value() const { return value.c_str (); } #ifdef TIXML_USE_STL /** Return Value() as a std::string. If you only use STL, this is more efficient than calling Value(). Only available in STL mode. */ const std::string& ValueStr() const { return value; } #endif const TIXML_STRING& ValueTStr() const { return value; } /** Changes the value of the node. Defined as: @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim */ void SetValue(const char * _value) { value = _value;} #ifdef TIXML_USE_STL /// STL std::string form. void SetValue( const std::string& _value ) { value = _value; } #endif /// Delete all the children of this node. Does not affect 'this'. void Clear(); /// One step up the DOM. TiXmlNode* Parent() { return parent; } const TiXmlNode* Parent() const { return parent; } const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. TiXmlNode* FirstChild() { return firstChild; } const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. /// The first child of this node with the matching 'value'. Will be null if none found. TiXmlNode* FirstChild( const char * _value ) { // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) // call the method, cast the return back to non-const. return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); } const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. TiXmlNode* LastChild() { return lastChild; } const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. TiXmlNode* LastChild( const char * _value ) { return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); } #ifdef TIXML_USE_STL const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. #endif /** An alternate way to walk the children of a node. One way to iterate over nodes is: @verbatim for( child = parent->FirstChild(); child; child = child->NextSibling() ) @endverbatim IterateChildren does the same thing with the syntax: @verbatim child = 0; while( child = parent->IterateChildren( child ) ) @endverbatim IterateChildren takes the previous child as input and finds the next one. If the previous child is null, it returns the first. IterateChildren will return null when done. */ const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( const TiXmlNode* previous ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); } /// This flavor of IterateChildren searches for children with a particular 'value' const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); } #ifdef TIXML_USE_STL const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. #endif /** Add a new node related to this. Adds a child past the LastChild. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child past the LastChild. NOTE: the node to be added is passed by pointer, and will be henceforth owned (and deleted) by tinyXml. This method is efficient and avoids an extra copy, but should be used with care as it uses a different memory model than the other insert functions. @sa InsertEndChild */ TiXmlNode* LinkEndChild( TiXmlNode* addThis ); /** Add a new node related to this. Adds a child before the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child after the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); /** Replace a child of this node. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); /// Delete a child of this node. bool RemoveChild( TiXmlNode* removeThis ); /// Navigate to a sibling node. const TiXmlNode* PreviousSibling() const { return prev; } TiXmlNode* PreviousSibling() { return prev; } /// Navigate to a sibling node. const TiXmlNode* PreviousSibling( const char * ) const; TiXmlNode* PreviousSibling( const char *_prev ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); } #ifdef TIXML_USE_STL const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. #endif /// Navigate to a sibling node. const TiXmlNode* NextSibling() const { return next; } TiXmlNode* NextSibling() { return next; } /// Navigate to a sibling node with the given 'value'. const TiXmlNode* NextSibling( const char * ) const; TiXmlNode* NextSibling( const char* _next ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); } /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement() const; TiXmlElement* NextSiblingElement() { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); } /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement( const char * ) const; TiXmlElement* NextSiblingElement( const char *_next ) { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); } #ifdef TIXML_USE_STL const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. #endif /// Convenience function to get through elements. const TiXmlElement* FirstChildElement() const; TiXmlElement* FirstChildElement() { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); } /// Convenience function to get through elements. const TiXmlElement* FirstChildElement( const char * _value ) const; TiXmlElement* FirstChildElement( const char * _value ) { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); } #ifdef TIXML_USE_STL const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. #endif /** Query the type (as an enumerated value, above) of this node. The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. */ int Type() const { return type; } /** Return a pointer to the Document this node lives in. Returns null if not in a document. */ const TiXmlDocument* GetDocument() const; TiXmlDocument* GetDocument() { return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); } /// Returns true if this node has no children. bool NoChildren() const { return !firstChild; } virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. /** Create an exact duplicate of this node and return it. The memory must be deleted by the caller. */ virtual TiXmlNode* Clone() const = 0; /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the XML tree will be conditionally visited and the host will be called back via the TiXmlVisitor interface. This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse the XML for the callbacks, so the performance of TinyXML is unchanged by using this interface versus any other.) The interface has been based on ideas from: - http://www.saxproject.org/ - http://c2.com/cgi/wiki?HierarchicalVisitorPattern Which are both good references for "visiting". An example of using Accept(): @verbatim TiXmlPrinter printer; tinyxmlDoc.Accept( &printer ); const char* xmlcstr = printer.CStr(); @endverbatim */ virtual bool Accept( TiXmlVisitor* visitor ) const = 0; protected: TiXmlNode( NodeType _type ); // Copy to the allocated object. Shared functionality between Clone, Copy constructor, // and the assignment operator. void CopyTo( TiXmlNode* target ) const; #ifdef TIXML_USE_STL // The real work of the input operator. virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; #endif // Figure out what is at *p, and parse it. Returns null if it is not an xml node. TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); TiXmlNode* parent; NodeType type; TiXmlNode* firstChild; TiXmlNode* lastChild; TIXML_STRING value; TiXmlNode* prev; TiXmlNode* next; private: TiXmlNode( const TiXmlNode& ); // not implemented. void operator=( const TiXmlNode& base ); // not allowed. }; /** An attribute is a name-value pair. Elements have an arbitrary number of attributes, each with a unique name. @note The attributes are not TiXmlNodes, since they are not part of the tinyXML document object model. There are other suggested ways to look at this problem. */ class TiXmlAttribute : public TiXmlBase { friend class TiXmlAttributeSet; public: /// Construct an empty attribute. TiXmlAttribute() : TiXmlBase() { document = 0; prev = next = 0; } #ifdef TIXML_USE_STL /// std::string constructor. TiXmlAttribute( const std::string& _name, const std::string& _value ) { name = _name; value = _value; document = 0; prev = next = 0; } #endif /// Construct an attribute with a name and value. TiXmlAttribute( const char * _name, const char * _value ) { name = _name; value = _value; document = 0; prev = next = 0; } const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. #ifdef TIXML_USE_STL const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. #endif int IntValue() const; ///< Return the value of this attribute, converted to an integer. double DoubleValue() const; ///< Return the value of this attribute, converted to a double. // Get the tinyxml string representation const TIXML_STRING& NameTStr() const { return name; } /** QueryIntValue examines the value string. It is an alternative to the IntValue() method with richer error checking. If the value is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. A specialized but useful call. Note that for success it returns 0, which is the opposite of almost all other TinyXml calls. */ int QueryIntValue( int* _value ) const; /// QueryDoubleValue examines the value string. See QueryIntValue(). int QueryDoubleValue( double* _value ) const; void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. void SetValue( const char* _value ) { value = _value; } ///< Set the value. void SetIntValue( int _value ); ///< Set the value from an integer. void SetDoubleValue( double _value ); ///< Set the value from a double. #ifdef TIXML_USE_STL /// STL std::string form. void SetName( const std::string& _name ) { name = _name; } /// STL std::string form. void SetValue( const std::string& _value ) { value = _value; } #endif /// Get the next sibling attribute in the DOM. Returns null at end. const TiXmlAttribute* Next() const; TiXmlAttribute* Next() { return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); } /// Get the previous sibling attribute in the DOM. Returns null at beginning. const TiXmlAttribute* Previous() const; TiXmlAttribute* Previous() { return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); } bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } /* Attribute parsing starts: first letter of the name returns: the next char after the value end quote */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); // Prints this Attribute to a FILE stream. virtual void Print( FILE* cfile, int depth ) const { Print( cfile, depth, 0 ); } void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; // [internal use] // Set the document pointer so the attribute can report errors. void SetDocument( TiXmlDocument* doc ) { document = doc; } private: TiXmlAttribute( const TiXmlAttribute& ); // not implemented. void operator=( const TiXmlAttribute& base ); // not allowed. TiXmlDocument* document; // A pointer back to a document, for error reporting. TIXML_STRING name; TIXML_STRING value; TiXmlAttribute* prev; TiXmlAttribute* next; }; /* A class used to manage a group of attributes. It is only used internally, both by the ELEMENT and the DECLARATION. The set can be changed transparent to the Element and Declaration classes that use it, but NOT transparent to the Attribute which has to implement a next() and previous() method. Which makes it a bit problematic and prevents the use of STL. This version is implemented with circular lists because: - I like circular lists - it demonstrates some independence from the (typical) doubly linked list. */ class TiXmlAttributeSet { public: TiXmlAttributeSet(); ~TiXmlAttributeSet(); void Add( TiXmlAttribute* attribute ); void Remove( TiXmlAttribute* attribute ); const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Find( const char* _name ) const; TiXmlAttribute* FindOrCreate( const char* _name ); # ifdef TIXML_USE_STL TiXmlAttribute* Find( const std::string& _name ) const; TiXmlAttribute* FindOrCreate( const std::string& _name ); # endif private: //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), //*ME: this class must be also use a hidden/disabled copy-constructor !!! TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) TiXmlAttribute sentinel; }; /** The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes. */ class TiXmlElement : public TiXmlNode { public: /// Construct an element. TiXmlElement (const char * in_value); #ifdef TIXML_USE_STL /// std::string constructor. TiXmlElement( const std::string& _value ); #endif TiXmlElement( const TiXmlElement& ); TiXmlElement& operator=( const TiXmlElement& base ); virtual ~TiXmlElement(); /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. */ const char* Attribute( const char* name ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an integer, the integer value will be put in the return 'i', if 'i' is non-null. */ const char* Attribute( const char* name, int* i ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an double, the double value will be put in the return 'd', if 'd' is non-null. */ const char* Attribute( const char* name, double* d ) const; /** QueryIntAttribute examines the attribute - it is an alternative to the Attribute() method with richer error checking. If the attribute is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. If the attribute does not exist, then TIXML_NO_ATTRIBUTE is returned. */ int QueryIntAttribute( const char* name, int* _value ) const; /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). Note that '1', 'true', or 'yes' are considered true, while '0', 'false' and 'no' are considered false. */ int QueryBoolAttribute( const char* name, bool* _value ) const; /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). int QueryDoubleAttribute( const char* name, double* _value ) const; /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). int QueryFloatAttribute( const char* name, float* _value ) const { double d; int result = QueryDoubleAttribute( name, &d ); if ( result == TIXML_SUCCESS ) { *_value = (float)d; } return result; } #ifdef TIXML_USE_STL /// QueryStringAttribute examines the attribute - see QueryIntAttribute(). int QueryStringAttribute( const char* name, std::string* _value ) const { const char* cstr = Attribute( name ); if ( cstr ) { *_value = std::string( cstr ); return TIXML_SUCCESS; } return TIXML_NO_ATTRIBUTE; } /** Template form of the attribute query which will try to read the attribute into the specified type. Very easy, very powerful, but be careful to make sure to call this with the correct type. NOTE: This method doesn't work correctly for 'string' types that contain spaces. @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE */ template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; std::stringstream sstream( node->ValueStr() ); sstream >> *outValue; if ( !sstream.fail() ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } int QueryValueAttribute( const std::string& name, std::string* outValue ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; *outValue = node->ValueStr(); return TIXML_SUCCESS; } #endif /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char* name, const char * _value ); #ifdef TIXML_USE_STL const std::string* Attribute( const std::string& name ) const; const std::string* Attribute( const std::string& name, int* i ) const; const std::string* Attribute( const std::string& name, double* d ) const; int QueryIntAttribute( const std::string& name, int* _value ) const; int QueryDoubleAttribute( const std::string& name, double* _value ) const; /// STL std::string form. void SetAttribute( const std::string& name, const std::string& _value ); ///< STL std::string form. void SetAttribute( const std::string& name, int _value ); ///< STL std::string form. void SetDoubleAttribute( const std::string& name, double value ); #endif /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char * name, int value ); /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetDoubleAttribute( const char * name, double value ); /** Deletes an attribute with the given name. */ void RemoveAttribute( const char * name ); #ifdef TIXML_USE_STL void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. #endif const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } /** Convenience function for easy access to the text inside an element. Although easy and concise, GetText() is limited compared to getting the TiXmlText child and accessing it directly. If the first child of 'this' is a TiXmlText, the GetText() returns the character string of the Text node, else null is returned. This is a convenient method for getting the text of simple contained text: @verbatim This is text const char* str = fooElement->GetText(); @endverbatim 'str' will be a pointer to "This is text". Note that this function can be misleading. If the element foo was created from this XML: @verbatim This is text @endverbatim then the value of str would be null. The first child node isn't a text node, it is another element. From this XML: @verbatim This is text @endverbatim GetText() will return "This is ". WARNING: GetText() accesses a child node - don't become confused with the similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are safe type casts on the referenced node. */ const char* GetText() const; /// Creates a new Element and returns it - the returned element is a copy. virtual TiXmlNode* Clone() const; // Print the Element to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: next char past '<' returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlElement* target ) const; void ClearThis(); // like clear, but initializes 'this' object as well // Used to be public [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif /* [internal use] Reads the "value" of the element -- another element, or text. This should terminate with the current end tag. */ const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); private: TiXmlAttributeSet attributeSet; }; /** An XML comment. */ class TiXmlComment : public TiXmlNode { public: /// Constructs an empty comment. TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {} /// Construct a comment from text. TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { SetValue( _value ); } TiXmlComment( const TiXmlComment& ); TiXmlComment& operator=( const TiXmlComment& base ); virtual ~TiXmlComment() {} /// Returns a copy of this Comment. virtual TiXmlNode* Clone() const; // Write this Comment to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: at the ! of the !-- returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlComment* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif // virtual void StreamOut( TIXML_OSTREAM * out ) const; private: }; /** XML text. A text node can have 2 ways to output the next. "normal" output and CDATA. It will default to the mode it was parsed from the XML file and you generally want to leave it alone, but you can change the output mode with SetCDATA() and query it with CDATA(). */ class TiXmlText : public TiXmlNode { friend class TiXmlElement; public: /** Constructor for text element. By default, it is treated as normal, encoded text. If you want it be output as a CDATA text element, set the parameter _cdata to 'true' */ TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) { SetValue( initValue ); cdata = false; } virtual ~TiXmlText() {} #ifdef TIXML_USE_STL /// Constructor. TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) { SetValue( initValue ); cdata = false; } #endif TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } // Write this text object to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /// Queries whether this represents text using a CDATA section. bool CDATA() const { return cdata; } /// Turns on or off a CDATA representation of text. void SetCDATA( bool _cdata ) { cdata = _cdata; } virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected : /// [internal use] Creates a new Element and returns it. virtual TiXmlNode* Clone() const; void CopyTo( TiXmlText* target ) const; bool Blank() const; // returns true if all white space and new lines // [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: bool cdata; // true if this should be input and output as a CDATA style text element }; /** In correct XML the declaration is the first entry in the file. @verbatim @endverbatim TinyXml will happily read or write files without a declaration, however. There are 3 possible attributes to the declaration: version, encoding, and standalone. Note: In this version of the code, the attributes are handled as special cases, not generic attributes, simply because there can only be at most 3 and they are always the same. */ class TiXmlDeclaration : public TiXmlNode { public: /// Construct an empty declaration. TiXmlDeclaration() : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {} #ifdef TIXML_USE_STL /// Constructor. TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ); #endif /// Construct. TiXmlDeclaration( const char* _version, const char* _encoding, const char* _standalone ); TiXmlDeclaration( const TiXmlDeclaration& copy ); TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); virtual ~TiXmlDeclaration() {} /// Version. Will return an empty string if none was found. const char *Version() const { return version.c_str (); } /// Encoding. Will return an empty string if none was found. const char *Encoding() const { return encoding.c_str (); } /// Is this a standalone document? const char *Standalone() const { return standalone.c_str (); } /// Creates a copy of this Declaration and returns it. virtual TiXmlNode* Clone() const; // Print this declaration to a FILE stream. virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; virtual void Print( FILE* cfile, int depth ) const { Print( cfile, depth, 0 ); } virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlDeclaration* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: TIXML_STRING version; TIXML_STRING encoding; TIXML_STRING standalone; }; /** Any tag that tinyXml doesn't recognize is saved as an unknown. It is a tag of text, but should not be modified. It will be written back to the XML, unchanged, when the file is saved. DTD tags get thrown into TiXmlUnknowns. */ class TiXmlUnknown : public TiXmlNode { public: TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} virtual ~TiXmlUnknown() {} TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } /// Creates a copy of this Unknown and returns it. virtual TiXmlNode* Clone() const; // Print this Unknown to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected: void CopyTo( TiXmlUnknown* target ) const; #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: }; /** Always the top level node. A document binds together all the XML pieces. It can be saved, loaded, and printed to the screen. The 'value' of a document node is the xml file name. */ class TiXmlDocument : public TiXmlNode { public: /// Create an empty document, that has no name. TiXmlDocument(); /// Create a document with a name. The name of the document is also the filename of the xml. TiXmlDocument( const char * documentName ); #ifdef TIXML_USE_STL /// Constructor. TiXmlDocument( const std::string& documentName ); #endif TiXmlDocument( const TiXmlDocument& copy ); TiXmlDocument& operator=( const TiXmlDocument& copy ); virtual ~TiXmlDocument() {} /** Load a file using the current document value. Returns true if successful. Will delete any existing document data before loading. */ bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the current document value. Returns true if successful. bool SaveFile() const; /// Load a file using the given filename. Returns true if successful. bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the given filename. Returns true if successful. bool SaveFile( const char * filename ) const; /** Load a file using the given FILE*. Returns true if successful. Note that this method doesn't stream - the entire object pointed at by the FILE* will be interpreted as an XML file. TinyXML doesn't stream in XML from the current file location. Streaming may be added in the future. */ bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the given FILE*. Returns true if successful. bool SaveFile( FILE* ) const; #ifdef TIXML_USE_STL bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. { return LoadFile( filename.c_str(), encoding ); } bool SaveFile( const std::string& filename ) const ///< STL std::string version. { return SaveFile( filename.c_str() ); } #endif /** Parse the given null terminated block of xml data. Passing in an encoding to this method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml to use that encoding, regardless of what TinyXml might otherwise try to detect. */ virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /** Get the root element -- the only top level element -- of the document. In well formed XML, there should only be one. TinyXml is tolerant of multiple elements at the document level. */ const TiXmlElement* RootElement() const { return FirstChildElement(); } TiXmlElement* RootElement() { return FirstChildElement(); } /** If an error occurs, Error will be set to true. Also, - The ErrorId() will contain the integer identifier of the error (not generally useful) - The ErrorDesc() method will return the name of the error. (very useful) - The ErrorRow() and ErrorCol() will return the location of the error (if known) */ bool Error() const { return error; } /// Contains a textual (english) description of the error if one occurs. const char * ErrorDesc() const { return errorDesc.c_str (); } /** Generally, you probably want the error string ( ErrorDesc() ). But if you prefer the ErrorId, this function will fetch it. */ int ErrorId() const { return errorId; } /** Returns the location (if known) of the error. The first column is column 1, and the first row is row 1. A value of 0 means the row and column wasn't applicable (memory errors, for example, have no row/column) or the parser lost the error. (An error in the error reporting, in that case.) @sa SetTabSize, Row, Column */ int ErrorRow() const { return errorLocation.row+1; } int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to report the correct values for row and column. It does not change the output or input in any way. By calling this method, with a tab size greater than 0, the row and column of each node and attribute is stored when the file is loaded. Very useful for tracking the DOM back in to the source file. The tab size is required for calculating the location of nodes. If not set, the default of 4 is used. The tabsize is set per document. Setting the tabsize to 0 disables row/column tracking. Note that row and column tracking is not supported when using operator>>. The tab size needs to be enabled before the parse or load. Correct usage: @verbatim TiXmlDocument doc; doc.SetTabSize( 8 ); doc.Load( "myfile.xml" ); @endverbatim @sa Row, Column */ void SetTabSize( int _tabsize ) { tabsize = _tabsize; } int TabSize() const { return tabsize; } /** If you have handled the error, it can be reset with this call. The error state is automatically cleared if you Parse a new XML block. */ void ClearError() { error = false; errorId = 0; errorDesc = ""; errorLocation.row = errorLocation.col = 0; //errorLocation.last = 0; } /** Write the document to standard out using formatted printing ("pretty print"). */ void Print() const { Print( stdout, 0 ); } /* Write the document to a string using formatted printing ("pretty print"). This will allocate a character array (new char[]) and return it as a pointer. The calling code pust call delete[] on the return char* to avoid a memory leak. */ //char* PrintToMemory() const; /// Print this Document to a FILE stream. virtual void Print( FILE* cfile, int depth = 0 ) const; // [internal use] void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected : // [internal use] virtual TiXmlNode* Clone() const; #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: void CopyTo( TiXmlDocument* target ) const; bool error; int errorId; TIXML_STRING errorDesc; int tabsize; TiXmlCursor errorLocation; bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. }; /** A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml DOM structure. It is a separate utility class. Take an example: @verbatim @endverbatim Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a *lot* of code that looks like: @verbatim TiXmlElement* root = document.FirstChildElement( "Document" ); if ( root ) { TiXmlElement* element = root->FirstChildElement( "Element" ); if ( element ) { TiXmlElement* child = element->FirstChildElement( "Child" ); if ( child ) { TiXmlElement* child2 = child->NextSiblingElement( "Child" ); if ( child2 ) { // Finally do something useful. @endverbatim And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity of such code. A TiXmlHandle checks for null pointers so it is perfectly safe and correct to use: @verbatim TiXmlHandle docHandle( &document ); TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); if ( child2 ) { // do something useful @endverbatim Which is MUCH more concise and useful. It is also safe to copy handles - internally they are nothing more than node pointers. @verbatim TiXmlHandle handleCopy = handle; @endverbatim What they should not be used for is iteration: @verbatim int i=0; while ( true ) { TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); if ( !child ) break; // do something ++i; } @endverbatim It seems reasonable, but it is in fact two embedded while loops. The Child method is a linear walk to find the element, so this code would iterate much more than it needs to. Instead, prefer: @verbatim TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); for( child; child; child=child->NextSiblingElement() ) { // do something } @endverbatim */ class TiXmlHandle { public: /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } /// Copy constructor TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } /// Return a handle to the first child node. TiXmlHandle FirstChild() const; /// Return a handle to the first child node with the given name. TiXmlHandle FirstChild( const char * value ) const; /// Return a handle to the first child element. TiXmlHandle FirstChildElement() const; /// Return a handle to the first child element with the given name. TiXmlHandle FirstChildElement( const char * value ) const; /** Return a handle to the "index" child with the given name. The first child is 0, the second 1, etc. */ TiXmlHandle Child( const char* value, int index ) const; /** Return a handle to the "index" child. The first child is 0, the second 1, etc. */ TiXmlHandle Child( int index ) const; /** Return a handle to the "index" child element with the given name. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( const char* value, int index ) const; /** Return a handle to the "index" child element. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( int index ) const; #ifdef TIXML_USE_STL TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } #endif /** Return the handle as a TiXmlNode. This may return null. */ TiXmlNode* ToNode() const { return node; } /** Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } /** Return the handle as a TiXmlText. This may return null. */ TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } /** Return the handle as a TiXmlUnknown. This may return null. */ TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } /** @deprecated use ToNode. Return the handle as a TiXmlNode. This may return null. */ TiXmlNode* Node() const { return ToNode(); } /** @deprecated use ToElement. Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* Element() const { return ToElement(); } /** @deprecated use ToText() Return the handle as a TiXmlText. This may return null. */ TiXmlText* Text() const { return ToText(); } /** @deprecated use ToUnknown() Return the handle as a TiXmlUnknown. This may return null. */ TiXmlUnknown* Unknown() const { return ToUnknown(); } private: TiXmlNode* node; }; /** Print to memory functionality. The TiXmlPrinter is useful when you need to: -# Print to memory (especially in non-STL mode) -# Control formatting (line endings, etc.) When constructed, the TiXmlPrinter is in its default "pretty printing" mode. Before calling Accept() you can call methods to control the printing of the XML document. After TiXmlNode::Accept() is called, the printed document can be accessed via the CStr(), Str(), and Size() methods. TiXmlPrinter uses the Visitor API. @verbatim TiXmlPrinter printer; printer.SetIndent( "\t" ); doc.Accept( &printer ); fprintf( stdout, "%s", printer.CStr() ); @endverbatim */ class TiXmlPrinter : public TiXmlVisitor { public: TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), buffer(), indent( " " ), lineBreak( "\n" ) {} virtual bool VisitEnter( const TiXmlDocument& doc ); virtual bool VisitExit( const TiXmlDocument& doc ); virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); virtual bool VisitExit( const TiXmlElement& element ); virtual bool Visit( const TiXmlDeclaration& declaration ); virtual bool Visit( const TiXmlText& text ); virtual bool Visit( const TiXmlComment& comment ); virtual bool Visit( const TiXmlUnknown& unknown ); /** Set the indent characters for printing. By default 4 spaces but tab (\t) is also useful, or null/empty string for no indentation. */ void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } /// Query the indention string. const char* Indent() { return indent.c_str(); } /** Set the line breaking string. By default set to newline (\n). Some operating systems prefer other characters, or can be set to the null/empty string for no indenation. */ void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } /// Query the current line breaking string. const char* LineBreak() { return lineBreak.c_str(); } /** Switch over to "stream printing" which is the most dense formatting without linebreaks. Common when the XML is needed for network transmission. */ void SetStreamPrinting() { indent = ""; lineBreak = ""; } /// Return the result. const char* CStr() { return buffer.c_str(); } /// Return the length of the result string. size_t Size() { return buffer.size(); } #ifdef TIXML_USE_STL /// Return the result. const std::string& Str() { return buffer; } #endif private: void DoIndent() { for( int i=0; i #ifdef TIXML_USE_STL #include #include #endif #include "tinyxml.h" FILE* TiXmlFOpen( const char* filename, const char* mode ); bool TiXmlBase::condenseWhiteSpace = true; // Microsoft compiler security FILE* TiXmlFOpen( const char* filename, const char* mode ) { #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) FILE* fp = 0; errno_t err = fopen_s( &fp, filename, mode ); if ( !err && fp ) return fp; return 0; #else return fopen( filename, mode ); #endif } void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) { int i=0; while( i<(int)str.length() ) { unsigned char c = (unsigned char) str[i]; if ( c == '&' && i < ( (int)str.length() - 2 ) && str[i+1] == '#' && str[i+2] == 'x' ) { // Hexadecimal character reference. // Pass through unchanged. // © -- copyright symbol, for example. // // The -1 is a bug fix from Rob Laveaux. It keeps // an overflow from happening if there is no ';'. // There are actually 2 ways to exit this loop - // while fails (error case) and break (semicolon found). // However, there is no mechanism (currently) for // this function to return an error. while ( i<(int)str.length()-1 ) { outString->append( str.c_str() + i, 1 ); ++i; if ( str[i] == ';' ) break; } } else if ( c == '&' ) { outString->append( entity[0].str, entity[0].strLength ); ++i; } else if ( c == '<' ) { outString->append( entity[1].str, entity[1].strLength ); ++i; } else if ( c == '>' ) { outString->append( entity[2].str, entity[2].strLength ); ++i; } else if ( c == '\"' ) { outString->append( entity[3].str, entity[3].strLength ); ++i; } else if ( c == '\'' ) { outString->append( entity[4].str, entity[4].strLength ); ++i; } else if ( c < 32 ) { // Easy pass at non-alpha/numeric/symbol // Below 32 is symbolic. char buf[ 32 ]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); #else sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); #endif //*ME: warning C4267: convert 'size_t' to 'int' //*ME: Int-Cast to make compiler happy ... outString->append( buf, (int)strlen( buf ) ); ++i; } else { //char realc = (char) c; //outString->append( &realc, 1 ); *outString += (char) c; // somewhat more efficient function call. ++i; } } } TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() { parent = 0; type = _type; firstChild = 0; lastChild = 0; prev = 0; next = 0; } TiXmlNode::~TiXmlNode() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } } void TiXmlNode::CopyTo( TiXmlNode* target ) const { target->SetValue (value.c_str() ); target->userData = userData; target->location = location; } void TiXmlNode::Clear() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } firstChild = 0; lastChild = 0; } TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) { assert( node->parent == 0 || node->parent == this ); assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT ) { delete node; if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } node->parent = this; node->prev = lastChild; node->next = 0; if ( lastChild ) lastChild->next = node; else firstChild = node; // it was an empty list. lastChild = node; return node; } TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) { if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; return LinkEndChild( node ); } TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) { if ( !beforeThis || beforeThis->parent != this ) { return 0; } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->next = beforeThis; node->prev = beforeThis->prev; if ( beforeThis->prev ) { beforeThis->prev->next = node; } else { assert( firstChild == beforeThis ); firstChild = node; } beforeThis->prev = node; return node; } TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) { if ( !afterThis || afterThis->parent != this ) { return 0; } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->prev = afterThis; node->next = afterThis->next; if ( afterThis->next ) { afterThis->next->prev = node; } else { assert( lastChild == afterThis ); lastChild = node; } afterThis->next = node; return node; } TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) { if ( !replaceThis ) return 0; if ( replaceThis->parent != this ) return 0; if ( withThis.ToDocument() ) { // A document can never be a child. Thanks to Noam. TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = withThis.Clone(); if ( !node ) return 0; node->next = replaceThis->next; node->prev = replaceThis->prev; if ( replaceThis->next ) replaceThis->next->prev = node; else lastChild = node; if ( replaceThis->prev ) replaceThis->prev->next = node; else firstChild = node; delete replaceThis; node->parent = this; return node; } bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) { if ( !removeThis ) { return false; } if ( removeThis->parent != this ) { assert( 0 ); return false; } if ( removeThis->next ) removeThis->next->prev = removeThis->prev; else lastChild = removeThis->prev; if ( removeThis->prev ) removeThis->prev->next = removeThis->next; else firstChild = removeThis->next; delete removeThis; return true; } const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const { const TiXmlNode* node; for ( node = firstChild; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const { const TiXmlNode* node; for ( node = lastChild; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild(); } else { assert( previous->parent == this ); return previous->NextSibling(); } } const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild( val ); } else { assert( previous->parent == this ); return previous->NextSibling( val ); } } const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const { const TiXmlNode* node; for ( node = next; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const { const TiXmlNode* node; for ( node = prev; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } void TiXmlElement::RemoveAttribute( const char * name ) { #ifdef TIXML_USE_STL TIXML_STRING str( name ); TiXmlAttribute* node = attributeSet.Find( str ); #else TiXmlAttribute* node = attributeSet.Find( name ); #endif if ( node ) { attributeSet.Remove( node ); delete node; } } const TiXmlElement* TiXmlNode::FirstChildElement() const { const TiXmlNode* node; for ( node = FirstChild(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const { const TiXmlNode* node; for ( node = FirstChild( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement() const { const TiXmlNode* node; for ( node = NextSibling(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const { const TiXmlNode* node; for ( node = NextSibling( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlDocument* TiXmlNode::GetDocument() const { const TiXmlNode* node; for( node = this; node; node = node->parent ) { if ( node->ToDocument() ) return node->ToDocument(); } return 0; } TiXmlElement::TiXmlElement (const char * _value) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; value = _value; } #ifdef TIXML_USE_STL TiXmlElement::TiXmlElement( const std::string& _value ) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; value = _value; } #endif TiXmlElement::TiXmlElement( const TiXmlElement& copy) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; copy.CopyTo( this ); } TiXmlElement& TiXmlElement::operator=( const TiXmlElement& base ) { ClearThis(); base.CopyTo( this ); return *this; } TiXmlElement::~TiXmlElement() { ClearThis(); } void TiXmlElement::ClearThis() { Clear(); while( attributeSet.First() ) { TiXmlAttribute* node = attributeSet.First(); attributeSet.Remove( node ); delete node; } } const char* TiXmlElement::Attribute( const char* name ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( node ) return node->Value(); return 0; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( attrib ) return &attrib->ValueStr(); return 0; } #endif const char* TiXmlElement::Attribute( const char* name, int* i ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const char* result = 0; if ( attrib ) { result = attrib->Value(); if ( i ) { attrib->QueryIntValue( i ); } } return result; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const std::string* result = 0; if ( attrib ) { result = &attrib->ValueStr(); if ( i ) { attrib->QueryIntValue( i ); } } return result; } #endif const char* TiXmlElement::Attribute( const char* name, double* d ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const char* result = 0; if ( attrib ) { result = attrib->Value(); if ( d ) { attrib->QueryDoubleValue( d ); } } return result; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const std::string* result = 0; if ( attrib ) { result = &attrib->ValueStr(); if ( d ) { attrib->QueryDoubleValue( d ); } } return result; } #endif int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryIntValue( ival ); } int TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; int ival = 0; int result = node->QueryIntValue( &ival ); *value = (unsigned)ival; return result; } int TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; int result = TIXML_WRONG_TYPE; if ( StringEqual( node->Value(), "true", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "yes", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "1", true, TIXML_ENCODING_UNKNOWN ) ) { *bval = true; result = TIXML_SUCCESS; } else if ( StringEqual( node->Value(), "false", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "no", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "0", true, TIXML_ENCODING_UNKNOWN ) ) { *bval = false; result = TIXML_SUCCESS; } return result; } #ifdef TIXML_USE_STL int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryIntValue( ival ); } #endif int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryDoubleValue( dval ); } #ifdef TIXML_USE_STL int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryDoubleValue( dval ); } #endif void TiXmlElement::SetAttribute( const char * name, int val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetIntValue( val ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetAttribute( const std::string& name, int val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetIntValue( val ); } } #endif void TiXmlElement::SetDoubleAttribute( const char * name, double val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetDoubleValue( val ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetDoubleAttribute( const std::string& name, double val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetDoubleValue( val ); } } #endif void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( cname ); if ( attrib ) { attrib->SetValue( cvalue ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetAttribute( const std::string& _name, const std::string& _value ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( _name ); if ( attrib ) { attrib->SetValue( _value ); } } #endif void TiXmlElement::Print( FILE* cfile, int depth ) const { int i; assert( cfile ); for ( i=0; iNext() ) { fprintf( cfile, " " ); attrib->Print( cfile, depth ); } // There are 3 different formatting approaches: // 1) An element without children is printed as a node // 2) An element with only a text child is printed as text // 3) An element with children is printed on multiple lines. TiXmlNode* node; if ( !firstChild ) { fprintf( cfile, " />" ); } else if ( firstChild == lastChild && firstChild->ToText() ) { fprintf( cfile, ">" ); firstChild->Print( cfile, depth + 1 ); fprintf( cfile, "", value.c_str() ); } else { fprintf( cfile, ">" ); for ( node = firstChild; node; node=node->NextSibling() ) { if ( !node->ToText() ) { fprintf( cfile, "\n" ); } node->Print( cfile, depth+1 ); } fprintf( cfile, "\n" ); for( i=0; i", value.c_str() ); } } void TiXmlElement::CopyTo( TiXmlElement* target ) const { // superclass: TiXmlNode::CopyTo( target ); // Element class: // Clone the attributes, then clone the children. const TiXmlAttribute* attribute = 0; for( attribute = attributeSet.First(); attribute; attribute = attribute->Next() ) { target->SetAttribute( attribute->Name(), attribute->Value() ); } TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const { if ( visitor->VisitEnter( *this, attributeSet.First() ) ) { for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) break; } } return visitor->VisitExit( *this ); } TiXmlNode* TiXmlElement::Clone() const { TiXmlElement* clone = new TiXmlElement( Value() ); if ( !clone ) return 0; CopyTo( clone ); return clone; } const char* TiXmlElement::GetText() const { const TiXmlNode* child = this->FirstChild(); if ( child ) { const TiXmlText* childText = child->ToText(); if ( childText ) { return childText->Value(); } } return 0; } TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; ClearError(); } TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #ifdef TIXML_USE_STL TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #endif TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { copy.CopyTo( this ); } TiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy ) { Clear(); copy.CopyTo( this ); return *this; } bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) { return LoadFile( Value(), encoding ); } bool TiXmlDocument::SaveFile() const { return SaveFile( Value() ); } bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) { TIXML_STRING filename( _filename ); value = filename; // reading in binary mode so that tinyxml can normalize the EOL FILE* file = TiXmlFOpen( value.c_str (), "rb" ); if ( file ) { bool result = LoadFile( file, encoding ); fclose( file ); return result; } else { SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } } bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) { if ( !file ) { SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Delete the existing data: Clear(); location.Clear(); // Get the file size, so we can pre-allocate the string. HUGE speed impact. long length = 0; fseek( file, 0, SEEK_END ); length = ftell( file ); fseek( file, 0, SEEK_SET ); // Strange case, but good to handle up front. if ( length <= 0 ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Subtle bug here. TinyXml did use fgets. But from the XML spec: // 2.11 End-of-Line Handling // // // ...the XML processor MUST behave as if it normalized all line breaks in external // parsed entities (including the document entity) on input, before parsing, by translating // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to // a single #xA character. // // // It is not clear fgets does that, and certainly isn't clear it works cross platform. // Generally, you expect fgets to translate from the convention of the OS to the c/unix // convention, and not work generally. /* while( fgets( buf, sizeof(buf), file ) ) { data += buf; } */ char* buf = new char[ length+1 ]; buf[0] = 0; if ( fread( buf, length, 1, file ) != 1 ) { delete [] buf; SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Process the buffer in place to normalize new lines. (See comment above.) // Copies from the 'p' to 'q' pointer, where p can advance faster if // a newline-carriage return is hit. // // Wikipedia: // Systems based on ASCII or a compatible character set use either LF (Line feed, '\n', 0x0A, 10 in decimal) or // CR (Carriage return, '\r', 0x0D, 13 in decimal) individually, or CR followed by LF (CR+LF, 0x0D 0x0A)... // * LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others // * CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS // * CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 const char* p = buf; // the read head char* q = buf; // the write head const char CR = 0x0d; const char LF = 0x0a; buf[length] = 0; while( *p ) { assert( p < (buf+length) ); assert( q <= (buf+length) ); assert( q <= p ); if ( *p == CR ) { *q++ = LF; p++; if ( *p == LF ) { // check for CR+LF (and skip LF) p++; } } else { *q++ = *p++; } } assert( q <= (buf+length) ); *q = 0; Parse( buf, 0, encoding ); delete [] buf; return !Error(); } bool TiXmlDocument::SaveFile( const char * filename ) const { // The old c stuff lives on... FILE* fp = TiXmlFOpen( filename, "w" ); if ( fp ) { bool result = SaveFile( fp ); fclose( fp ); return result; } return false; } bool TiXmlDocument::SaveFile( FILE* fp ) const { if ( useMicrosoftBOM ) { const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; fputc( TIXML_UTF_LEAD_0, fp ); fputc( TIXML_UTF_LEAD_1, fp ); fputc( TIXML_UTF_LEAD_2, fp ); } Print( fp, 0 ); return (ferror(fp) == 0); } void TiXmlDocument::CopyTo( TiXmlDocument* target ) const { TiXmlNode::CopyTo( target ); target->error = error; target->errorId = errorId; target->errorDesc = errorDesc; target->tabsize = tabsize; target->errorLocation = errorLocation; target->useMicrosoftBOM = useMicrosoftBOM; TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } TiXmlNode* TiXmlDocument::Clone() const { TiXmlDocument* clone = new TiXmlDocument(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlDocument::Print( FILE* cfile, int depth ) const { assert( cfile ); for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { node->Print( cfile, depth ); fprintf( cfile, "\n" ); } } bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const { if ( visitor->VisitEnter( *this ) ) { for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) break; } } return visitor->VisitExit( *this ); } const TiXmlAttribute* TiXmlAttribute::Next() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } /* TiXmlAttribute* TiXmlAttribute::Next() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } */ const TiXmlAttribute* TiXmlAttribute::Previous() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } /* TiXmlAttribute* TiXmlAttribute::Previous() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } */ void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const { TIXML_STRING n, v; EncodeString( name, &n ); EncodeString( value, &v ); if (value.find ('\"') == TIXML_STRING::npos) { if ( cfile ) { fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); } if ( str ) { (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; } } else { if ( cfile ) { fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); } if ( str ) { (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; } } } int TiXmlAttribute::QueryIntValue( int* ival ) const { if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } int TiXmlAttribute::QueryDoubleValue( double* dval ) const { if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } void TiXmlAttribute::SetIntValue( int _value ) { char buf [64]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); #else sprintf (buf, "%d", _value); #endif SetValue (buf); } void TiXmlAttribute::SetDoubleValue( double _value ) { char buf [256]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "%g", _value); #else sprintf (buf, "%g", _value); #endif SetValue (buf); } int TiXmlAttribute::IntValue() const { return atoi (value.c_str ()); } double TiXmlAttribute::DoubleValue() const { return atof (value.c_str ()); } TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { copy.CopyTo( this ); } TiXmlComment& TiXmlComment::operator=( const TiXmlComment& base ) { Clear(); base.CopyTo( this ); return *this; } void TiXmlComment::Print( FILE* cfile, int depth ) const { assert( cfile ); for ( int i=0; i", value.c_str() ); } void TiXmlComment::CopyTo( TiXmlComment* target ) const { TiXmlNode::CopyTo( target ); } bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlComment::Clone() const { TiXmlComment* clone = new TiXmlComment(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlText::Print( FILE* cfile, int depth ) const { assert( cfile ); if ( cdata ) { int i; fprintf( cfile, "\n" ); for ( i=0; i\n", value.c_str() ); // unformatted output } else { TIXML_STRING buffer; EncodeString( value, &buffer ); fprintf( cfile, "%s", buffer.c_str() ); } } void TiXmlText::CopyTo( TiXmlText* target ) const { TiXmlNode::CopyTo( target ); target->cdata = cdata; } bool TiXmlText::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlText::Clone() const { TiXmlText* clone = 0; clone = new TiXmlText( "" ); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlDeclaration::TiXmlDeclaration( const char * _version, const char * _encoding, const char * _standalone ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #ifdef TIXML_USE_STL TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #endif TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { copy.CopyTo( this ); } TiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) { Clear(); copy.CopyTo( this ); return *this; } void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const { if ( cfile ) fprintf( cfile, "" ); if ( str ) (*str) += "?>"; } void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const { TiXmlNode::CopyTo( target ); target->version = version; target->encoding = encoding; target->standalone = standalone; } bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlDeclaration::Clone() const { TiXmlDeclaration* clone = new TiXmlDeclaration(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlUnknown::Print( FILE* cfile, int depth ) const { for ( int i=0; i", value.c_str() ); } void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const { TiXmlNode::CopyTo( target ); } bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlUnknown::Clone() const { TiXmlUnknown* clone = new TiXmlUnknown(); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlAttributeSet::TiXmlAttributeSet() { sentinel.next = &sentinel; sentinel.prev = &sentinel; } TiXmlAttributeSet::~TiXmlAttributeSet() { assert( sentinel.next == &sentinel ); assert( sentinel.prev == &sentinel ); } void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) { #ifdef TIXML_USE_STL assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. #else assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. #endif addMe->next = &sentinel; addMe->prev = sentinel.prev; sentinel.prev->next = addMe; sentinel.prev = addMe; } void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) { TiXmlAttribute* node; for( node = sentinel.next; node != &sentinel; node = node->next ) { if ( node == removeMe ) { node->prev->next = node->next; node->next->prev = node->prev; node->next = 0; node->prev = 0; return; } } assert( 0 ); // we tried to remove a non-linked attribute. } #ifdef TIXML_USE_STL TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const { for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) { if ( node->name == name ) return node; } return 0; } TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const std::string& _name ) { TiXmlAttribute* attrib = Find( _name ); if ( !attrib ) { attrib = new TiXmlAttribute(); Add( attrib ); attrib->SetName( _name ); } return attrib; } #endif TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const { for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) { if ( strcmp( node->name.c_str(), name ) == 0 ) return node; } return 0; } TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const char* _name ) { TiXmlAttribute* attrib = Find( _name ); if ( !attrib ) { attrib = new TiXmlAttribute(); Add( attrib ); attrib->SetName( _name ); } return attrib; } #ifdef TIXML_USE_STL std::istream& operator>> (std::istream & in, TiXmlNode & base) { TIXML_STRING tag; tag.reserve( 8 * 1000 ); base.StreamIn( &in, &tag ); base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); return in; } #endif #ifdef TIXML_USE_STL std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) { TiXmlPrinter printer; printer.SetStreamPrinting(); base.Accept( &printer ); out << printer.Str(); return out; } std::string& operator<< (std::string& out, const TiXmlNode& base ) { TiXmlPrinter printer; printer.SetStreamPrinting(); base.Accept( &printer ); out.append( printer.Str() ); return out; } #endif TiXmlHandle TiXmlHandle::FirstChild() const { if ( node ) { TiXmlNode* child = node->FirstChild(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const { if ( node ) { TiXmlNode* child = node->FirstChild( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement() const { if ( node ) { TiXmlElement* child = node->FirstChildElement(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const { if ( node ) { TiXmlElement* child = node->FirstChildElement( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild(); for ( i=0; child && iNextSibling(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild( value ); for ( i=0; child && iNextSibling( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement(); for ( i=0; child && iNextSiblingElement(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement( value ); for ( i=0; child && iNextSiblingElement( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) { return true; } bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) { return true; } bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) { DoIndent(); buffer += "<"; buffer += element.Value(); for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) { buffer += " "; attrib->Print( 0, 0, &buffer ); } if ( !element.FirstChild() ) { buffer += " />"; DoLineBreak(); } else { buffer += ">"; if ( element.FirstChild()->ToText() && element.LastChild() == element.FirstChild() && element.FirstChild()->ToText()->CDATA() == false ) { simpleTextPrint = true; // no DoLineBreak()! } else { DoLineBreak(); } } ++depth; return true; } bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) { --depth; if ( !element.FirstChild() ) { // nothing. } else { if ( simpleTextPrint ) { simpleTextPrint = false; } else { DoIndent(); } buffer += ""; DoLineBreak(); } return true; } bool TiXmlPrinter::Visit( const TiXmlText& text ) { if ( text.CDATA() ) { DoIndent(); buffer += ""; DoLineBreak(); } else if ( simpleTextPrint ) { TIXML_STRING str; TiXmlBase::EncodeString( text.ValueTStr(), &str ); buffer += str; } else { DoIndent(); TIXML_STRING str; TiXmlBase::EncodeString( text.ValueTStr(), &str ); buffer += str; DoLineBreak(); } return true; } bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) { DoIndent(); declaration.Print( 0, 0, &buffer ); DoLineBreak(); return true; } bool TiXmlPrinter::Visit( const TiXmlComment& comment ) { DoIndent(); buffer += ""; DoLineBreak(); return true; } bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) { DoIndent(); buffer += "<"; buffer += unknown.Value(); buffer += ">"; DoLineBreak(); return true; } desmume-0.9.11/src/utils/tinyxml/tinyxmlerror.cpp0000755000000000000000000000337712467662066020710 0ustar rootroot/* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "tinyxml.h" // The goal of the seperate error file is to make the first // step towards localization. tinyxml (currently) only supports // english error messages, but the could now be translated. // // It also cleans up the code a bit. // const char* TiXmlBase::errorString[ TiXmlBase::TIXML_ERROR_STRING_COUNT ] = { "No error", "Error", "Failed to open file", "Error parsing Element.", "Failed to read Element name", "Error reading Element value.", "Error reading Attributes.", "Error: empty tag.", "Error reading end tag.", "Error parsing Unknown.", "Error parsing Comment.", "Error parsing Declaration.", "Error document empty.", "Error null (0) or unexpected EOF found in input stream.", "Error parsing CDATA.", "Error when TiXmlDocument added to document, because TiXmlDocument can only be at the root.", }; desmume-0.9.11/src/utils/tinyxml/tinyxmlparser.cpp0000755000000000000000000011057212467662066021047 0ustar rootroot/* www.sourceforge.net/projects/tinyxml Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include #include #include "tinyxml.h" //#define DEBUG_PARSER #if defined( DEBUG_PARSER ) # if defined( DEBUG ) && defined( _MSC_VER ) # include # define TIXML_LOG OutputDebugString # else # define TIXML_LOG printf # endif #endif // Note tha "PutString" hardcodes the same list. This // is less flexible than it appears. Changing the entries // or order will break putstring. TiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] = { { "&", 5, '&' }, { "<", 4, '<' }, { ">", 4, '>' }, { """, 6, '\"' }, { "'", 6, '\'' } }; // Bunch of unicode info at: // http://www.unicode.org/faq/utf_bom.html // Including the basic of this table, which determines the #bytes in the // sequence from the lead byte. 1 placed for invalid sequences -- // although the result will be junk, pass it through as much as possible. // Beware of the non-characters in UTF-8: // ef bb bf (Microsoft "lead bytes") // ef bf be // ef bf bf const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; const int TiXmlBase::utf8ByteTable[256] = { // 0 1 2 3 4 5 6 7 8 9 a b c d e f 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid }; void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) { const unsigned long BYTE_MASK = 0xBF; const unsigned long BYTE_MARK = 0x80; const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; if (input < 0x80) *length = 1; else if ( input < 0x800 ) *length = 2; else if ( input < 0x10000 ) *length = 3; else if ( input < 0x200000 ) *length = 4; else { *length = 0; return; } // This code won't covert this correctly anyway. output += *length; // Scary scary fall throughs. switch (*length) { case 4: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 3: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 2: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 1: --output; *output = (char)(input | FIRST_BYTE_MARK[*length]); } } /*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalpha( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalpha( anyByte ); // } } /*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalnum( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalnum( anyByte ); // } } class TiXmlParsingData { friend class TiXmlDocument; public: void Stamp( const char* now, TiXmlEncoding encoding ); const TiXmlCursor& Cursor() const { return cursor; } private: // Only used by the document! TiXmlParsingData( const char* start, int _tabsize, int row, int col ) { assert( start ); stamp = start; tabsize = _tabsize; cursor.row = row; cursor.col = col; } TiXmlCursor cursor; const char* stamp; int tabsize; }; void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) { assert( now ); // Do nothing if the tabsize is 0. if ( tabsize < 1 ) { return; } // Get the current row, column. int row = cursor.row; int col = cursor.col; const char* p = stamp; assert( p ); while ( p < now ) { // Treat p as unsigned, so we have a happy compiler. const unsigned char* pU = (const unsigned char*)p; // Code contributed by Fletcher Dunn: (modified by lee) switch (*pU) { case 0: // We *should* never get here, but in case we do, don't // advance past the terminating null character, ever return; case '\r': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \r\n sequence, and treat this as a single character if (*p == '\n') { ++p; } break; case '\n': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \n\r sequence, and treat this as a single // character. (Yes, this bizarre thing does occur still // on some arcane platforms...) if (*p == '\r') { ++p; } break; case '\t': // Eat the character ++p; // Skip to next tab stop col = (col / tabsize + 1) * tabsize; break; case TIXML_UTF_LEAD_0: if ( encoding == TIXML_ENCODING_UTF8 ) { if ( *(p+1) && *(p+2) ) { // In these cases, don't advance the column. These are // 0-width spaces. if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) p += 3; else { p +=3; ++col; } // A normal character. } } else { ++p; ++col; } break; default: if ( encoding == TIXML_ENCODING_UTF8 ) { // Eat the 1 to 4 byte utf8 character. int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; if ( step == 0 ) step = 1; // Error case from bad encoding, but handle gracefully. p += step; // Just advance one column, of course. ++col; } else { ++p; ++col; } break; } } cursor.row = row; cursor.col = col; assert( cursor.row >= -1 ); assert( cursor.col >= -1 ); stamp = p; assert( stamp ); } const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) { if ( !p || !*p ) { return 0; } if ( encoding == TIXML_ENCODING_UTF8 ) { while ( *p ) { const unsigned char* pU = (const unsigned char*)p; // Skip the stupid Microsoft UTF-8 Byte order marks if ( *(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbeU ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbfU ) { p += 3; continue; } if ( IsWhiteSpace( *p ) ) // Still using old rules for white space. ++p; else break; } } else { while ( *p && IsWhiteSpace( *p ) ) ++p; } return p; } #ifdef TIXML_USE_STL /*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) { for( ;; ) { if ( !in->good() ) return false; int c = in->peek(); // At this scope, we can't get to a document. So fail silently. if ( !IsWhiteSpace( c ) || c <= 0 ) return true; *tag += (char) in->get(); } } /*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) { //assert( character > 0 && character < 128 ); // else it won't work in utf-8 while ( in->good() ) { int c = in->peek(); if ( c == character ) return true; if ( c <= 0 ) // Silent failure: can't get document at this scope return false; in->get(); *tag += (char) c; } return false; } #endif // One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The // "assign" optimization removes over 10% of the execution time. // const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) { // Oddly, not supported on some comilers, //name->clear(); // So use this: *name = ""; assert( p ); // Names start with letters or underscores. // Of course, in unicode, tinyxml has no idea what a letter *is*. The // algorithm is generous. // // After that, they can be letters, underscores, numbers, // hyphens, or colons. (Colons are valid ony for namespaces, // but tinyxml can't tell namespaces from names.) if ( p && *p && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) { const char* start = p; while( p && *p && ( IsAlphaNum( (unsigned char ) *p, encoding ) || *p == '_' || *p == '-' || *p == '.' || *p == ':' ) ) { //(*name) += *p; // expensive ++p; } if ( p-start > 0 ) { name->assign( start, p-start ); } return p; } return 0; } const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) { // Presume an entity, and pull it out. TIXML_STRING ent; int i; *length = 0; if ( *(p+1) && *(p+1) == '#' && *(p+2) ) { unsigned long ucs = 0; ptrdiff_t delta = 0; unsigned mult = 1; if ( *(p+2) == 'x' ) { // Hexadecimal. if ( !*(p+3) ) return 0; const char* q = p+3; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != 'x' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else if ( *q >= 'a' && *q <= 'f' ) ucs += mult * (*q - 'a' + 10); else if ( *q >= 'A' && *q <= 'F' ) ucs += mult * (*q - 'A' + 10 ); else return 0; mult *= 16; --q; } } else { // Decimal. if ( !*(p+2) ) return 0; const char* q = p+2; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != '#' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else return 0; mult *= 10; --q; } } if ( encoding == TIXML_ENCODING_UTF8 ) { // convert the UCS to UTF-8 ConvertUTF32ToUTF8( ucs, value, length ); } else { *value = (char)ucs; *length = 1; } return p + delta + 1; } // Now try to match it. for( i=0; iappend( cArr, len ); } } else { bool whitespace = false; // Remove leading white space: p = SkipWhiteSpace( p, encoding ); while ( p && *p && !StringEqual( p, endTag, caseInsensitive, encoding ) ) { if ( *p == '\r' || *p == '\n' ) { whitespace = true; ++p; } else if ( IsWhiteSpace( *p ) ) { whitespace = true; ++p; } else { // If we've found whitespace, add it before the // new character. Any whitespace just becomes a space. if ( whitespace ) { (*text) += ' '; whitespace = false; } int len; char cArr[4] = { 0, 0, 0, 0 }; p = GetChar( p, cArr, &len, encoding ); if ( len == 1 ) (*text) += cArr[0]; // more efficient else text->append( cArr, len ); } } } if ( p && *p ) p += strlen( endTag ); return ( p && *p ) ? p : 0; } #ifdef TIXML_USE_STL void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) { // The basic issue with a document is that we don't know what we're // streaming. Read something presumed to be a tag (and hope), then // identify it, and call the appropriate stream method on the tag. // // This "pre-streaming" will never read the closing ">" so the // sub-tag can orient itself. if ( !StreamTo( in, '<', tag ) ) { SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } while ( in->good() ) { int tagIndex = (int) tag->length(); while ( in->good() && in->peek() != '>' ) { int c = in->get(); if ( c <= 0 ) { SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); break; } (*tag) += (char) c; } if ( in->good() ) { // We now have something we presume to be a node of // some sort. Identify it, and call the node to // continue streaming. TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); if ( node ) { node->StreamIn( in, tag ); bool isElement = node->ToElement() != 0; delete node; node = 0; // If this is the root element, we're done. Parsing will be // done by the >> operator. if ( isElement ) { return; } } else { SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } } } // We should have returned sooner. SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); } #endif const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) { ClearError(); // Parse away, at the document level. Since a document // contains nothing but other tags, most of what happens // here is skipping white space. if ( !p || !*p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } // Note that, for a document, this needs to come // before the while space skip, so that parsing // starts from the pointer we are given. location.Clear(); if ( prevData ) { location.row = prevData->cursor.row; location.col = prevData->cursor.col; } else { location.row = 0; location.col = 0; } TiXmlParsingData data( p, TabSize(), location.row, location.col ); location = data.Cursor(); if ( encoding == TIXML_ENCODING_UNKNOWN ) { // Check for the Microsoft UTF-8 lead bytes. const unsigned char* pU = (const unsigned char*)p; if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) { encoding = TIXML_ENCODING_UTF8; useMicrosoftBOM = true; } } p = SkipWhiteSpace( p, encoding ); if ( !p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } while ( p && *p ) { TiXmlNode* node = Identify( p, encoding ); if ( node ) { p = node->Parse( p, &data, encoding ); LinkEndChild( node ); } else { break; } // Did we get encoding info? if ( encoding == TIXML_ENCODING_UNKNOWN && node->ToDeclaration() ) { TiXmlDeclaration* dec = node->ToDeclaration(); const char* enc = dec->Encoding(); assert( enc ); if ( *enc == 0 ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice else encoding = TIXML_ENCODING_LEGACY; } p = SkipWhiteSpace( p, encoding ); } // Was this empty? if ( !firstChild ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); return 0; } // All is well. return p; } void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) { // The first error in a chain is more accurate - don't set again! if ( error ) return; assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); error = true; errorId = err; errorDesc = errorString[ errorId ]; errorLocation.Clear(); if ( pError && data ) { data->Stamp( pError, encoding ); errorLocation = data->Cursor(); } } TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) { TiXmlNode* returnNode = 0; p = SkipWhiteSpace( p, encoding ); if( !p || !*p || *p != '<' ) { return 0; } p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { return 0; } // What is this thing? // - Elements start with a letter or underscore, but xml is reserved. // - Comments: "; if ( !StringEqual( p, startTag, false, encoding ) ) { if ( document ) document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); return 0; } p += strlen( startTag ); // [ 1475201 ] TinyXML parses entities in comments // Oops - ReadText doesn't work, because we don't want to parse the entities. // p = ReadText( p, &value, false, endTag, false, encoding ); // // from the XML spec: /* [Definition: Comments may appear anywhere in a document outside other markup; in addition, they may appear within the document type declaration at places allowed by the grammar. They are not part of the document's character data; an XML processor MAY, but need not, make it possible for an application to retrieve the text of comments. For compatibility, the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity references MUST NOT be recognized within comments. An example of a comment: */ value = ""; // Keep all the white space. while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) { value.append( p, 1 ); ++p; } if ( p && *p ) p += strlen( endTag ); return p; } const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) return 0; if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } // Read the name, the '=' and the value. const char* pErr = p; p = ReadName( p, &name, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); return 0; } p = SkipWhiteSpace( p, encoding ); if ( !p || !*p || *p != '=' ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } ++p; // skip '=' p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } const char* end; const char SINGLE_QUOTE = '\''; const char DOUBLE_QUOTE = '\"'; if ( *p == SINGLE_QUOTE ) { ++p; end = "\'"; // single quote in string p = ReadText( p, &value, false, end, false, encoding ); } else if ( *p == DOUBLE_QUOTE ) { ++p; end = "\""; // double quote in string p = ReadText( p, &value, false, end, false, encoding ); } else { // All attribute values should be in single or double quotes. // But this is such a common error that the parser will try // its best, even without them. value = ""; while ( p && *p // existence && !IsWhiteSpace( *p ) // whitespace && *p != '/' && *p != '>' ) // tag end { if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { // [ 1451649 ] Attribute values with trailing quotes not handled correctly // We did not have an opening quote but seem to have a // closing one. Give up and throw an error. if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } value += *p; ++p; } } return p; } #ifdef TIXML_USE_STL void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) { while ( in->good() ) { int c = in->peek(); if ( !cdata && (c == '<' ) ) { return; } if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; in->get(); // "commits" the peek made above if ( cdata && c == '>' && tag->size() >= 3 ) { size_t len = tag->size(); if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { // terminator of cdata. return; } } } } #endif const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { value = ""; TiXmlDocument* document = GetDocument(); if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } const char* const startTag = ""; if ( cdata || StringEqual( p, startTag, false, encoding ) ) { cdata = true; if ( !StringEqual( p, startTag, false, encoding ) ) { if ( document ) document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); return 0; } p += strlen( startTag ); // Keep all the white space, ignore the encoding, etc. while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) { value += *p; ++p; } TIXML_STRING dummy; p = ReadText( p, &dummy, false, endTag, false, encoding ); return p; } else { bool ignoreWhite = true; const char* end = "<"; p = ReadText( p, &value, ignoreWhite, end, false, encoding ); if ( p && *p ) return p-1; // don't truncate the '<' return 0; } } #ifdef TIXML_USE_STL void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) { while ( in->good() ) { int c = in->get(); if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; if ( c == '>' ) { // All is well. return; } } } #endif const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) { p = SkipWhiteSpace( p, _encoding ); // Find the beginning, find the end, and look for // the stuff in-between. TiXmlDocument* document = GetDocument(); if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); return 0; } if ( data ) { data->Stamp( p, _encoding ); location = data->Cursor(); } p += 5; version = ""; encoding = ""; standalone = ""; while ( p && *p ) { if ( *p == '>' ) { ++p; return p; } p = SkipWhiteSpace( p, _encoding ); if ( StringEqual( p, "version", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); version = attrib.Value(); } else if ( StringEqual( p, "encoding", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); encoding = attrib.Value(); } else if ( StringEqual( p, "standalone", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); standalone = attrib.Value(); } else { // Read over whatever it is. while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) ++p; } } return 0; } bool TiXmlText::Blank() const { for ( unsigned i=0; i(-1); // Null rep. TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; void TiXmlString::reserve (size_type cap) { if (cap > capacity()) { TiXmlString tmp; tmp.init(length(), cap); memcpy(tmp.start(), data(), length()); swap(tmp); } } TiXmlString& TiXmlString::assign(const char* str, size_type len) { size_type cap = capacity(); if (len > cap || cap > 3*(len + 8)) { TiXmlString tmp; tmp.init(len); memcpy(tmp.start(), str, len); swap(tmp); } else { memmove(start(), str, len); set_size(len); } return *this; } TiXmlString& TiXmlString::append(const char* str, size_type len) { size_type newsize = length() + len; if (newsize > capacity()) { reserve (newsize + capacity()); } memmove(finish(), str, len); set_size(newsize); return *this; } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) { TiXmlString tmp; tmp.reserve(a.length() + b.length()); tmp += a; tmp += b; return tmp; } TiXmlString operator + (const TiXmlString & a, const char* b) { TiXmlString tmp; TiXmlString::size_type b_len = static_cast( strlen(b) ); tmp.reserve(a.length() + b_len); tmp += a; tmp.append(b, b_len); return tmp; } TiXmlString operator + (const char* a, const TiXmlString & b) { TiXmlString tmp; TiXmlString::size_type a_len = static_cast( strlen(a) ); tmp.reserve(a_len + b.length()); tmp.append(a, a_len); tmp += b; return tmp; } #endif // TIXML_USE_STL desmume-0.9.11/src/utils/ConvertUTF.c0000755000000000000000000004517312467662066016065 0ustar rootroot/* * Copyright 2001-2004 Unicode, Inc. * * Disclaimer * * This source code is provided as is by Unicode, Inc. No claims are * made as to fitness for any particular purpose. No warranties of any * kind are expressed or implied. The recipient agrees to determine * applicability of information provided. If this file has been * purchased on magnetic or optical media from Unicode, Inc., the * sole remedy for any claim will be exchange of defective media * within 90 days of receipt. * * Limitations on Rights to Redistribute This Code * * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. */ /* --------------------------------------------------------------------- Conversions between UTF32, UTF-16, and UTF-8. Source code file. Author: Mark E. Davis, 1994. Rev History: Rick McGowan, fixes & updates May 2001. Sept 2001: fixed const & error conditions per mods suggested by S. Parent & A. Lillich. June 2002: Tim Dodd added detection and handling of incomplete source sequences, enhanced error detection, added casts to eliminate compiler warnings. July 2003: slight mods to back out aggressive FFFE detection. Jan 2004: updated switches in from-UTF8 conversions. Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. See the header file "ConvertUTF.h" for complete documentation. ------------------------------------------------------------------------ */ #include "ConvertUTF.h" #ifdef CVTUTF_DEBUG #include #endif static const int halfShift = 10; /* used for shifting by 10 bits */ static const UTF32 halfBase = 0x0010000UL; static const UTF32 halfMask = 0x3FFUL; #define UNI_SUR_HIGH_START (UTF32)0xD800 #define UNI_SUR_HIGH_END (UTF32)0xDBFF #define UNI_SUR_LOW_START (UTF32)0xDC00 #define UNI_SUR_LOW_END (UTF32)0xDFFF #define false 0 #define true 1 /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF32toUTF16 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF32* source = *sourceStart; UTF16* target = *targetStart; while (source < sourceEnd) { UTF32 ch; if (target >= targetEnd) { result = targetExhausted; break; } ch = *source++; if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = (UTF16)ch; /* normal case */ } } else if (ch > UNI_MAX_LEGAL_UTF32) { if (flags == strictConversion) { result = sourceIllegal; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { /* target is a character in range 0xFFFF - 0x10FFFF. */ if (target + 1 >= targetEnd) { --source; /* Back up source pointer! */ result = targetExhausted; break; } ch -= halfBase; *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF16toUTF32 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF16* source = *sourceStart; UTF32* target = *targetStart; UTF32 ch, ch2; while (source < sourceEnd) { const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ ch = *source++; /* If we have a surrogate pair, convert to UTF32 first. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { /* If the 16 bits following the high surrogate are in the source buffer... */ if (source < sourceEnd) { ch2 = *source; /* If it's a low surrogate, convert to UTF32. */ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START) + halfBase; ++source; } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } else { /* We don't have the 16 bits following the high surrogate. */ --source; /* return to the high surrogate */ result = sourceExhausted; break; } } else if (flags == strictConversion) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } if (target >= targetEnd) { source = oldSource; /* Back up source pointer! */ result = targetExhausted; break; } *target++ = ch; } *sourceStart = source; *targetStart = target; #ifdef CVTUTF_DEBUG if (result == sourceIllegal) { fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); fflush(stderr); } #endif return result; } /* --------------------------------------------------------------------- */ /* * Index into the table below with the first byte of a UTF-8 sequence to * get the number of trailing bytes that are supposed to follow it. * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is * left as-is for anyone who may want to do such conversion, which was * allowed in earlier algorithms. */ static const char trailingBytesForUTF8[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; /* * Magic values subtracted from a buffer value during UTF8 conversion. * This table contains as many values as there might be trailing bytes * in a UTF-8 sequence. */ static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; /* * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed * into the first byte, depending on how many bytes follow. There are * as many entries in this table as there are UTF-8 sequence types. * (I.e., one byte sequence, two byte... etc.). Remember that sequencs * for *legal* UTF-8 will be 4 or fewer bytes total. */ static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; /* --------------------------------------------------------------------- */ /* The interface converts a whole buffer to avoid function-call overhead. * Constants have been gathered. Loops & conditionals have been removed as * much as possible for efficiency, in favor of drop-through switches. * (See "Note A" at the bottom of the file for equivalent code.) * If your compiler supports it, the "isLegalUTF8" call can be turned * into an inline function. */ /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF16toUTF8 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF16* source = *sourceStart; UTF8* target = *targetStart; while (source < sourceEnd) { UTF32 ch; unsigned short bytesToWrite = 0; const UTF32 byteMask = 0xBF; const UTF32 byteMark = 0x80; const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ ch = *source++; /* If we have a surrogate pair, convert to UTF32 first. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { /* If the 16 bits following the high surrogate are in the source buffer... */ if (source < sourceEnd) { UTF32 ch2 = *source; /* If it's a low surrogate, convert to UTF32. */ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START) + halfBase; ++source; } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } else { /* We don't have the 16 bits following the high surrogate. */ --source; /* return to the high surrogate */ result = sourceExhausted; break; } } else if (flags == strictConversion) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } /* Figure out how many bytes the result will require */ if (ch < (UTF32)0x80) { bytesToWrite = 1; } else if (ch < (UTF32)0x800) { bytesToWrite = 2; } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; } else { bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; } target += bytesToWrite; if (target > targetEnd) { source = oldSource; /* Back up source pointer! */ target -= bytesToWrite; result = targetExhausted; break; } switch (bytesToWrite) { /* note: everything falls through. */ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); } target += bytesToWrite; } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ /* * Utility routine to tell whether a sequence of bytes is legal UTF-8. * This must be called with the length pre-determined by the first byte. * If not calling this from ConvertUTF8to*, then the length can be set by: * length = trailingBytesForUTF8[*source]+1; * and the sequence is illegal right away if there aren't that many bytes * available. * If presented with a length > 4, this returns false. The Unicode * definition of UTF-8 goes up to 4-byte sequences. */ static Boolean isLegalUTF8(const UTF8 *source, int length) { UTF8 a; const UTF8 *srcptr = source+length; switch (length) { default: return false; /* Everything else falls through when "true"... */ case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; case 2: if ((a = (*--srcptr)) > 0xBF) return false; switch (*source) { /* no fall-through in this inner switch */ case 0xE0: if (a < 0xA0) return false; break; case 0xED: if (a > 0x9F) return false; break; case 0xF0: if (a < 0x90) return false; break; case 0xF4: if (a > 0x8F) return false; break; default: if (a < 0x80) return false; } case 1: if (*source >= 0x80 && *source < 0xC2) return false; } if (*source > 0xF4) return false; return true; } /* --------------------------------------------------------------------- */ /* * Exported function to return whether a UTF-8 sequence is legal or not. * This is not used here; it's just exported. */ Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { int length = trailingBytesForUTF8[*source]+1; if (source+length > sourceEnd) { return false; } return isLegalUTF8(source, length); } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF8toUTF16 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF8* source = *sourceStart; UTF16* target = *targetStart; while (source < sourceEnd) { UTF32 ch = 0; unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; if (source + extraBytesToRead >= sourceEnd) { result = sourceExhausted; break; } /* Do this check whether lenient or strict */ if (! isLegalUTF8(source, extraBytesToRead+1)) { result = sourceIllegal; break; } /* * The cases all fall through. See "Note A" below. */ switch (extraBytesToRead) { case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ case 3: ch += *source++; ch <<= 6; case 2: ch += *source++; ch <<= 6; case 1: ch += *source++; ch <<= 6; case 0: ch += *source++; } ch -= offsetsFromUTF8[extraBytesToRead]; if (target >= targetEnd) { source -= (extraBytesToRead+1); /* Back up source pointer! */ result = targetExhausted; break; } if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { source -= (extraBytesToRead+1); /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = (UTF16)ch; /* normal case */ } } else if (ch > UNI_MAX_UTF16) { if (flags == strictConversion) { result = sourceIllegal; source -= (extraBytesToRead+1); /* return to the start */ break; /* Bail out; shouldn't continue */ } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { /* target is a character in range 0xFFFF - 0x10FFFF. */ if (target + 1 >= targetEnd) { source -= (extraBytesToRead+1); /* Back up source pointer! */ result = targetExhausted; break; } ch -= halfBase; *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF32toUTF8 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF32* source = *sourceStart; UTF8* target = *targetStart; while (source < sourceEnd) { UTF32 ch; unsigned short bytesToWrite = 0; const UTF32 byteMask = 0xBF; const UTF32 byteMark = 0x80; ch = *source++; if (flags == strictConversion ) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } /* * Figure out how many bytes the result will require. Turn any * illegally large UTF32 things (> Plane 17) into replacement chars. */ if (ch < (UTF32)0x80) { bytesToWrite = 1; } else if (ch < (UTF32)0x800) { bytesToWrite = 2; } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; } else { bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; result = sourceIllegal; } target += bytesToWrite; if (target > targetEnd) { --source; /* Back up source pointer! */ target -= bytesToWrite; result = targetExhausted; break; } switch (bytesToWrite) { /* note: everything falls through. */ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); } target += bytesToWrite; } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF8toUTF32 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF8* source = *sourceStart; UTF32* target = *targetStart; while (source < sourceEnd) { UTF32 ch = 0; unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; if (source + extraBytesToRead >= sourceEnd) { result = sourceExhausted; break; } /* Do this check whether lenient or strict */ if (! isLegalUTF8(source, extraBytesToRead+1)) { result = sourceIllegal; break; } /* * The cases all fall through. See "Note A" below. */ switch (extraBytesToRead) { case 5: ch += *source++; ch <<= 6; case 4: ch += *source++; ch <<= 6; case 3: ch += *source++; ch <<= 6; case 2: ch += *source++; ch <<= 6; case 1: ch += *source++; ch <<= 6; case 0: ch += *source++; } ch -= offsetsFromUTF8[extraBytesToRead]; if (target >= targetEnd) { source -= (extraBytesToRead+1); /* Back up the source pointer! */ result = targetExhausted; break; } if (ch <= UNI_MAX_LEGAL_UTF32) { /* * UTF-16 surrogate values are illegal in UTF-32, and anything * over Plane 17 (> 0x10FFFF) is illegal. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { source -= (extraBytesToRead+1); /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = ch; } } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ result = sourceIllegal; *target++ = UNI_REPLACEMENT_CHAR; } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- Note A. The fall-through switches in UTF-8 reading code save a temp variable, some decrements & conditionals. The switches are equivalent to the following loop: { int tmpBytesToRead = extraBytesToRead+1; do { ch += *source++; --tmpBytesToRead; if (tmpBytesToRead) ch <<= 6; } while (tmpBytesToRead > 0); } In UTF-8 writing code, the switches on "bytesToWrite" are similarly unrolled loops. --------------------------------------------------------------------- */ desmume-0.9.11/src/utils/decrypt/0000755000000000000000000000000012467663413015354 5ustar rootrootdesmume-0.9.11/src/utils/decrypt/decrypt.h0000755000000000000000000000250512467662066017207 0ustar rootroot/* decrypt.h - this file is part of DeSmuME * * Copyright (C) 2006 Rafael Vuijk * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef _DECRYPT_H_ #define _DECRYPT_H_ #include "../../types.h" extern const unsigned char arm7_key[]; //decrypts the secure area of a rom (or does nothing if it is already decrypted) bool DecryptSecureArea(u8 *romheader, u8 *secure); //encrypts the secure area of a rom (or does nothing if it is already encrypted) bool EncryptSecureArea(u8 *romheader, u8 *secure); //since we have rom-type detection heuristics here, this module is responsible for checking whether a rom is valid bool CheckValidRom(u8 *header, u8 *secure); #endif desmume-0.9.11/src/utils/decrypt/crc.cpp0000755000000000000000000002074212467662066016642 0ustar rootroot//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/crc.cpp?revision=1587 /* crc.cpp - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Cyclic Redundancy Code (CRC) functions by Rafael Vuijk (aka DarkFader) */ unsigned short ccitt16tab[] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; unsigned short crc16tab[] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 }; unsigned long crc32tab[] = { 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL, 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L, 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL, 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L, 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL, 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L, 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L, 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L, 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L, 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL, 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL, 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L, 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L, 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L, 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L, 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L, 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL, 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L, 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L, 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L, 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL, 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L, 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL }; desmume-0.9.11/src/utils/decrypt/header.cpp0000755000000000000000000005272512467662066017331 0ustar rootroot//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/header.cpp?revision=3063 /* header.cpp - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "header.h" //#include "ndstool.h" //#include "banner.h" //#include "sha1.h" //#include "crc.h" //#include "bigint.h" //#include "arm7_sha1_homebrew.h" //#include "arm7_sha1_nintendo.h" //#include "encryption.h" // ///* // * Data // */ //unsigned char publicKeyNintendo[] = //{ // 0x9E, 0xC1, 0xCC, 0xC0, 0x4A, 0x6B, 0xD0, 0xA0, 0x6D, 0x62, 0xED, 0x5F, 0x15, 0x67, 0x87, 0x12, // 0xE6, 0xF4, 0x77, 0x1F, 0xD8, 0x5C, 0x81, 0xCE, 0x0C, 0xD0, 0x22, 0x31, 0xF5, 0x89, 0x08, 0xF5, // 0xBE, 0x04, 0xCB, 0xC1, 0x4F, 0x63, 0xD9, 0x5A, 0x98, 0xFF, 0xEB, 0x36, 0x0F, 0x9C, 0x5D, 0xAD, // 0x15, 0xB9, 0x99, 0xFB, 0xC6, 0x86, 0x2C, 0x0A, 0x0C, 0xFC, 0xE6, 0x86, 0x03, 0x60, 0xD4, 0x87, // 0x28, 0xD5, 0x66, 0x42, 0x9C, 0xF7, 0x04, 0x14, 0x4E, 0x6F, 0x73, 0x20, 0xC3, 0x3E, 0x3F, 0xF5, // 0x82, 0x2E, 0x78, 0x18, 0xD6, 0xCD, 0xD5, 0xC2, 0xDC, 0xAA, 0x1D, 0x34, 0x91, 0xEC, 0x99, 0xC9, // 0xF7, 0xBF, 0xBF, 0xA0, 0x0E, 0x1E, 0xF0, 0x25, 0xF8, 0x66, 0x17, 0x54, 0x34, 0x28, 0x2D, 0x28, // 0xA3, 0xAE, 0xF0, 0xA9, 0xFA, 0x3A, 0x70, 0x56, 0xD2, 0x34, 0xA9, 0xC5, 0x9E, 0x5D, 0xF5, 0xE1, //}; // ///* // * CalcHeaderCRC // */ //unsigned short CalcHeaderCRC(Header &header) //{ // return CalcCrc16((unsigned char *)&header, 0x15E); //} // ///* // * CalcLogoCRC // */ //unsigned short CalcLogoCRC(Header &header) //{ // return CalcCrc16((unsigned char *)&header + 0xC0, 156); //} // /* * DetectRomType */ int DetectRomType(const Header &header, char *secure) { const u64 data = LE_TO_LOCAL_64(*(u64 *)secure); //this is attempting to check for an utterly invalid nds header if(header.unitcode > 3) return ROMTYPE_INVALID; if (header.arm9_rom_offset < 0x4000) return ROMTYPE_HOMEBREW; else if (data == 0x0000000000000000ULL) return ROMTYPE_MULTIBOOT; else if (data == 0xE7FFDEFFE7FFDEFFULL) return ROMTYPE_NDSDUMPED; //TODO //for (int i=0x200; i<0x4000; i++) // if (romdata[i]) return ROMTYPE_MASKROM; // found something odd ;) return ROMTYPE_ENCRSECURE; } ///* // * CalcSecureAreaCRC // */ //unsigned short CalcSecureAreaCRC(bool encrypt) //{ // fseek(fNDS, 0x4000, SEEK_SET); // unsigned char data[0x4000]; // fread(data, 1, 0x4000, fNDS); // if (encrypt) encrypt_arm9(*(u32 *)header.gamecode, data); // return CalcCrc16(data, 0x4000); //} // ///* // * CalcSecurityDataCRC // */ //unsigned short CalcSecurityDataCRC() //{ // fseek(fNDS, 0x1000, SEEK_SET); // unsigned char data[0x2000]; // fread(data, 1, 0x2000, fNDS); // return CalcCrc16(data, 0x2000); //} // ///* // * CalcSegment3CRC // */ //unsigned short CalcSegment3CRC() //{ // fseek(fNDS, 0x3000, SEEK_SET); // unsigned char data[0x1000]; // fread(data, 1, 0x1000, fNDS); // for (int i=0; i<0x1000; i+=2) // swap bytes // { // unsigned char t = data[i+1]; data[i+1] = data[i]; data[i] = t; // } // return CalcCcitt16(data, 0x1000); // why would they use CRC16-CCITT ? //} // ///* // * FixHeaderCRC // */ //void FixHeaderCRC(char *ndsfilename) //{ // fNDS = fopen(ndsfilename, "r+b"); // if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } // fread(&header, 512, 1, fNDS); // header.header_crc = CalcHeaderCRC(header); // fseek(fNDS, 0, SEEK_SET); // fwrite(&header, 512, 1, fNDS); // fclose(fNDS); //} // ///* // * ShowHeaderInfo // */ //void ShowHeaderInfo(Header &header, int romType, unsigned int length = 0x200) //{ // printf("0x00\t%-25s\t", "Game title"); // // for (unsigned int i=0; i= 2) // { // printf("{ DS Download Play(TM) / Wireless MultiBoot header information:\n"); // ShowHeaderInfo(*(Header *)(buf + 0x20), romType, 0x160); // printf("}\n"); // } // } // else // { // fseek(fNDS, 0, SEEK_SET); // fread(buf, 1, sizeof(buf), fNDS); // sha1_hash(buf, 0x160, &m_sha1); // } // sha1_end(header_sha1, &m_sha1); //} // ///* // * Arm9Sha1Multiboot // */ //void Arm9Sha1Multiboot(FILE *fNDS, unsigned char *arm9_sha1) //{ // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // fseek(fNDS, header.arm9_rom_offset, SEEK_SET); // unsigned int len = header.arm9_size; // unsigned char *buf = new unsigned char [len]; // fread(buf, 1, len, fNDS); // //printf("%u\n", len); // sha1_hash(buf, len, &m_sha1); // delete [] buf; // sha1_end(arm9_sha1, &m_sha1); //} // ///* // * Arm9Sha1ClearedOutArea // */ //void Arm9Sha1ClearedOutArea(FILE *fNDS, unsigned char *arm9_sha1) //{ // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // fseek(fNDS, header.arm9_rom_offset, SEEK_SET); // unsigned int len = header.arm9_size; // unsigned char *buf = new unsigned char [len]; // // int len1 = (0x5000 - header.arm9_rom_offset); // e.g. 0x5000 - 0x4000 = 0x1000 // int len3 = header.arm9_size - (0x7000 - header.arm9_rom_offset); // e.g. 0x10000 - (0x7000 - 0x4000) = 0xD000 // int len2 = header.arm9_size - len1 - len3; // e.g. 0x10000 - 0x1000 - 0xD000 = 0x2000 // if (len1 > 0) fread(buf, 1, len1, fNDS); // if (len2 > 0) { memset(buf + len1, 0, len2); fseek(fNDS, len2, SEEK_CUR); } // gets cleared for security? // if (len3 > 0) fread(buf + len1 + len2, 1, len3, fNDS); //// printf("%X %X %X\n", len1, len2, len3); // //// memset(buf, 0, 0x800); // clear "secure area" too // // sha1_hash(buf, len, &m_sha1); // delete [] buf; // sha1_end(arm9_sha1, &m_sha1); //} // ///* // * Arm7Sha1 // */ //void Arm7Sha1(FILE *fNDS, unsigned char *arm7_sha1) //{ // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // fseek(fNDS, header.arm7_rom_offset, SEEK_SET); // unsigned int len = header.arm7_size; // unsigned char *buf = new unsigned char [len]; // fread(buf, 1, len, fNDS); // //printf("%u\n", len); // sha1_hash(buf, len, &m_sha1); // delete [] buf; // sha1_end(arm7_sha1, &m_sha1); //} // ///* // * CompareSha1WithList // */ //int CompareSha1WithList(unsigned char *arm7_sha1, const unsigned char *text, unsigned int textSize) //{ // while (1) // { // //printf("\n"); // for (int i=0; i '9') ? ((*text - 'A') & 7) + 10 : *text - '0'); // text++; // } // //printf("%02X", b); // if (b != arm7_sha1[i]) break; else if (i == 19) return 0; // } // while (*text && (*text >= ' ')) text++; // line end // while (*text && (*text < ' ')) text++; // new line // } //} // ///* // * HashAndCompareWithList // * -1=error, 0=match, 1=no match // */ //int HashAndCompareWithList(char *filename, unsigned char sha1[]) //{ // FILE *f = fopen(filename, "rb"); // if (!f) return -1; // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // unsigned char buf[1024]; // unsigned int r; // do // { // r = fread(buf, 1, 1024, f); // sha1_hash(buf, r, &m_sha1); // } while (r > 0); // fclose(f); // sha1_end(sha1, &m_sha1); // if (CompareSha1WithList(sha1, arm7_sha1_homebrew, arm7_sha1_homebrew_size)) return 1; // not yet in list // return 0; //} // ///* // * strsepc // */ //char *strsepc(char **s, char d) //{ // char *r = *s; // for (char *p = *s; ; p++) // { // if (*p == 0) { *s = p; break; } // if (*p == d) { *s = p+1; *p = 0; break; } // } // return r; //} // ///* // * RomListInfo // */ //void RomListInfo(unsigned int crc32_match) //{ // if (!romlistfilename) return; // FILE *fRomList = fopen(romlistfilename, "rt"); // if (!fRomList) { fprintf(stderr, "Cannot open file '%s'.\n", romlistfilename); exit(1); } // char s[1024]; // while (fgets(s, 1024, fRomList)) // empty, title, title, title, title, filename, CRC32 // { // char *p = s; // if (strlen(strsepc(&p, '\xAC')) == 0) // { // char *title = strsepc(&p, '\xAC'); // unsigned int index = strtoul(title, 0, 10); // title += 7; // char *b1 = strchr(title, '('); // char *b2 = b1 ? strchr(b1+1, ')') : 0; // char *b3 = b2 ? strchr(b2+1, '(') : 0; // char *b4 = b3 ? strchr(b3+1, ')') : 0; // char *group = 0; // if (b1 + 2 == b2) if (b3 && b4) { *b3 = 0; *b4 = 0; group = b3+1; } // remove release group name // strsepc(&p, '\xAC'); strsepc(&p, '\xAC'); // strsepc(&p, '\xAC'); strsepc(&p, '\xAC'); // unsigned long crc32 = strtoul(strsepc(&p, '\xAC'), 0, 16); // if (crc32 == crc32_match) // { // printf("Release index: \t%u\n", index); // printf("Release title: \t%s\n", title); // printf("Release group: \t%s\n", group ? group : ""); // } // //for (int i=0; i<10; i++) printf("%d %s\n", i, strsepc(&p, '\xAC')); // } // } //} // ///* // * ShowVerboseInfo // */ //void ShowVerboseInfo(FILE *fNDS, Header &header, int romType) //{ // // calculate SHA1 of ARM7 binary // unsigned char arm7_sha1[SHA1_DIGEST_SIZE]; // Arm7Sha1(fNDS, arm7_sha1); // // // find signature data // unsigned_int signature_id = 0; // fseek(fNDS, header.application_end_offset, SEEK_SET); // fread(&signature_id, sizeof(signature_id), 1, fNDS); // if (signature_id != 0x00016361) // { // fseek(fNDS, header.application_end_offset - 136, SEEK_SET); // try again // fread(&signature_id, sizeof(signature_id), 1, fNDS); // } // if (signature_id == 0x00016361) // { // printf("\n"); // // unsigned char signature[128]; // fread(signature, 1, sizeof(signature), fNDS); // // unsigned char sha_parts[3*SHA1_DIGEST_SIZE + 4]; // fread(sha_parts + 3*SHA1_DIGEST_SIZE, 4, 1, fNDS); // some number // // //printf("%08X\n", *(unsigned int *)(sha_parts + 3*SHA1_DIGEST_SIZE)); // // unsigned char header_sha1[SHA1_DIGEST_SIZE]; // HeaderSha1(fNDS, header_sha1, romType); // memcpy(sha_parts + 0*SHA1_DIGEST_SIZE, header_sha1, SHA1_DIGEST_SIZE); // // unsigned char arm9_sha1[SHA1_DIGEST_SIZE]; // if (romType == ROMTYPE_MULTIBOOT) // { // Arm9Sha1Multiboot(fNDS, arm9_sha1); // } // else // { // Arm9Sha1ClearedOutArea(fNDS, arm9_sha1); // } // memcpy(sha_parts + 1*SHA1_DIGEST_SIZE, arm9_sha1, SHA1_DIGEST_SIZE); // // memcpy(sha_parts + 2*SHA1_DIGEST_SIZE, arm7_sha1, SHA1_DIGEST_SIZE); // // unsigned char sha_final[SHA1_DIGEST_SIZE]; // { // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // unsigned int len = sizeof(sha_parts); // unsigned char *buf = sha_parts; // sha1_hash(buf, len, &m_sha1); // sha1_end(sha_final, &m_sha1); // } // // // calculate SHA1 from signature // unsigned char sha1_from_sig[SHA1_DIGEST_SIZE]; // { // BigInt _signature; // _signature.Set(signature, sizeof(signature)); // //printf("signature: "); _signature.print(); // // BigInt _publicKey; // _publicKey.Set(publicKeyNintendo, sizeof(publicKeyNintendo)); // //printf("public key: "); _publicKey.print(); // // BigInt big_sha1; // big_sha1.PowMod(_signature, _publicKey); // //printf("big_sha1: "); big_sha1.print(); // big_sha1.Get(sha1_from_sig, sizeof(sha1_from_sig)); // } // // bool ok = (memcmp(sha_final, sha1_from_sig, SHA1_DIGEST_SIZE) == 0); // printf("DS Download Play(TM) / Wireless MultiBoot signature: %s\n", ok ? "OK" : "INVALID"); // if (!ok) // { // printf("header hash: \t"); for (int i=0; i 0) // { // crc32 = CalcCrc32(buf, r, crc32); // } // crc32 = ~crc32; // delete [] buf; // // printf("\nFile CRC32: \t%08X\n", (unsigned int)crc32); // RomListInfo(crc32); // } // // // ROM dumper 1.0 bad data // { // unsigned char buf[0x200]; // fseek(fNDS, 0x7E00, SEEK_SET); // fread(buf, 1, 0x200, fNDS); // unsigned long crc32 = ~CalcCrc32(buf, 0x200); // printf("\nSMT dumper v1.0 corruption check: \t%s\n", (crc32 == 0x7E8B456F) ? "CORRUPTED" : "OK"); // } // // // Verify ARM7 SHA1 hash against known default binaries // int bKnownArm7 = 0; // { // printf("\nARM7 binary hash : \t"); for (int i=0; i= 0x04000000)) // { // printf("\nWARNING! ARM7 RAM address does not point to shared memory!\n"); // } // // // check ARM7 entry address // if ((header.arm7_entry_address < header.arm7_ram_address) || // (header.arm7_entry_address > header.arm7_ram_address + header.arm7_size)) // { // printf("\nWARNING! ARM7 entry address points outside of ARM7 binary!\n"); // } //} // ///* // * ShowInfo // */ //void ShowInfo(char *ndsfilename) //{ // fNDS = fopen(ndsfilename, "rb"); // if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } // fread(&header, 512, 1, fNDS); // // int romType = DetectRomType(); // // printf("Header information:\n"); // ShowHeaderInfo(header, romType); // // // banner info // if (header.banner_offset) // { // Banner banner; // fseek(fNDS, header.banner_offset, SEEK_SET); // if (fread(&banner, 1, sizeof(banner), fNDS)) // { // unsigned short banner_crc = CalcBannerCRC(banner); // printf("\n"); // printf("Banner CRC: \t0x%04X (%s)\n", (int)banner.crc, (banner_crc == banner.crc) ? "OK" : "INVALID"); // // for (int language=1; language<=1; language++) // { // int line = 1; // bool nextline = true; // for (int i=0; i<128; i++) // { // unsigned short c = banner.title[language][i]; // if (c >= 128) c = '_'; // if (c == 0x00) { printf("\n"); break; } // if (c == 0x0A) // { // nextline = true; // } // else // { // if (nextline) // { // if (line != 1) printf("\n"); // printf("%s banner text, line %d:", bannerLanguages[language], line); // for (unsigned int i=0; i<11 - strlen(bannerLanguages[language]); i++) putchar(' '); // printf("\t"); // nextline = false; // line++; // } // putchar(c); // } // } // } // } // } // // // ARM9 footer // fseek(fNDS, header.arm9_rom_offset + header.arm9_size, SEEK_SET); // unsigned_int nitrocode; // if (fread(&nitrocode, sizeof(nitrocode), 1, fNDS) && (nitrocode == 0xDEC00621)) // { // printf("\n"); // printf("ARM9 footer found.\n"); // unsigned_int x; // fread(&x, sizeof(x), 1, fNDS); // fread(&x, sizeof(x), 1, fNDS); // } // // // show security CRCs // if (romType >= ROMTYPE_NDSDUMPED) // { // printf("\n"); // unsigned short securitydata_crc = CalcSecurityDataCRC(); // printf("Security data CRC (0x1000-0x2FFF) 0x%04X\n", (int)securitydata_crc); // unsigned short segment3_crc = CalcSegment3CRC(); // printf("Segment3 CRC (0x3000-0x3FFF) 0x%04X (%s)\n", (int)segment3_crc, (segment3_crc == 0x0254) ? "OK" : "INVALID"); // } // // // more information // if (verbose >= 1) // { // ShowVerboseInfo(fNDS, header, romType); // } // // fclose(fNDS); //} desmume-0.9.11/src/utils/decrypt/header.h0000755000000000000000000000707612467662066016775 0ustar rootroot//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/header.h?revision=2447 /* header.h - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef _HEADER_H_ #define _HEADER_H_ #include "../../types.h" #include "../../PACKED.h" struct __PACKED Header { char title[0xC]; char gamecode[0x4]; char makercode[2]; unsigned char unitcode; // product code. 0 = Nintendo DS unsigned char devicetype; // device code. 0 = normal unsigned char devicecap; // device size. (1< #include #include "crc.h" #include "header.h" //encr_data const unsigned char arm7_key[] = { 0x99,0xD5,0x20,0x5F,0x57,0x44,0xF5,0xB9,0x6E,0x19,0xA4,0xD9,0x9E,0x6A,0x5A,0x94, 0xD8,0xAE,0xF1,0xEB,0x41,0x75,0xE2,0x3A,0x93,0x82,0xD0,0x32,0x33,0xEE,0x31,0xD5, 0xCC,0x57,0x61,0x9A,0x37,0x06,0xA2,0x1B,0x79,0x39,0x72,0xF5,0x55,0xAE,0xF6,0xBE, 0x5F,0x1B,0x69,0xFB,0xE5,0x9D,0xF1,0xE9,0xCE,0x2C,0xD9,0xA1,0x5E,0x32,0x05,0xE6, 0xFE,0xD3,0xFE,0xCF,0xD4,0x62,0x04,0x0D,0x8B,0xF5,0xEC,0xB7,0x2B,0x60,0x79,0xBB, 0x12,0x95,0x31,0x0D,0x6E,0x3F,0xDA,0x2B,0x88,0x84,0xF0,0xF1,0x3D,0x12,0x7E,0x25, 0x45,0x22,0xF1,0xBB,0x24,0x06,0x1A,0x06,0x11,0xAD,0xDF,0x28,0x8B,0x64,0x81,0x34, 0x2B,0xEB,0x33,0x29,0x99,0xAA,0xF2,0xBD,0x9C,0x14,0x95,0x9D,0x9F,0xF7,0xF5,0x8C, 0x72,0x97,0xA1,0x29,0x9D,0xD1,0x5F,0xCF,0x66,0x4D,0x07,0x1A,0xDE,0xD3,0x4A,0x4B, 0x85,0xC9,0xA7,0xA3,0x17,0x95,0x05,0x3A,0x3D,0x49,0x0A,0xBF,0x0A,0x89,0x8B,0xA2, 0x4A,0x82,0x49,0xDD,0x27,0x90,0xF1,0x0B,0xE9,0xEB,0x1C,0x6A,0x83,0x76,0x45,0x05, 0xBA,0x81,0x70,0x61,0x17,0x3F,0x4B,0xDE,0xAE,0xCF,0xAB,0x39,0x57,0xF2,0x3A,0x56, 0x48,0x11,0xAD,0x8A,0x40,0xE1,0x45,0x3F,0xFA,0x9B,0x02,0x54,0xCA,0xA6,0x93,0xFB, 0xEF,0x4D,0xFE,0x6F,0xA3,0xD8,0x87,0x9C,0x08,0xBA,0xD5,0x48,0x6A,0x8D,0x2D,0xFD, 0x6E,0x15,0xF8,0x74,0xBD,0xBE,0x52,0x8B,0x18,0x22,0x8A,0x9E,0xFB,0x74,0x37,0x07, 0x1B,0x36,0x6C,0x4A,0x19,0xBA,0x42,0x62,0xB9,0x79,0x91,0x10,0x7B,0x67,0x65,0x96, 0xFE,0x02,0x23,0xE8,0xEE,0x99,0x8C,0x77,0x3E,0x5C,0x86,0x64,0x4D,0x6D,0x78,0x86, 0xA5,0x4F,0x65,0xE2,0x1E,0xB2,0xDF,0x5A,0x0A,0xD0,0x7E,0x08,0x14,0xB0,0x71,0xAC, 0xBD,0xDB,0x83,0x1C,0xB9,0xD7,0xA1,0x62,0xCD,0xC6,0x63,0x7C,0x52,0x69,0xC3,0xE6, 0xBF,0x75,0xCE,0x12,0x44,0x5D,0x21,0x04,0xFA,0xFB,0xD3,0x3C,0x38,0x11,0x63,0xD4, 0x95,0x85,0x41,0x49,0x46,0x09,0xF2,0x08,0x43,0x11,0xDC,0x1F,0x76,0xC0,0x15,0x6D, 0x1F,0x3C,0x63,0x70,0xEA,0x87,0x80,0x6C,0xC3,0xBD,0x63,0x8B,0xC2,0x37,0x21,0x37, 0xDC,0xEE,0x09,0x23,0x2E,0x37,0x6A,0x4D,0x73,0x90,0xF7,0x50,0x30,0xAC,0x1C,0x92, 0x04,0x10,0x23,0x91,0x4F,0xD2,0x07,0xAA,0x68,0x3E,0x4F,0x9A,0xC9,0x64,0x60,0x6A, 0xC8,0x14,0x21,0xF3,0xD6,0x22,0x41,0x12,0x44,0x24,0xCF,0xE6,0x8A,0x56,0xDD,0x0D, 0x53,0x4D,0xE1,0x85,0x1E,0x8C,0x52,0x5A,0x9C,0x19,0x84,0xC2,0x03,0x57,0xF1,0x6F, 0xE3,0x00,0xBE,0x58,0xF6,0x4C,0xED,0xD5,0x21,0x64,0x9C,0x1F,0xBE,0x55,0x03,0x3C, 0x4A,0xDC,0xFF,0xAA,0xC9,0xDA,0xE0,0x5D,0x5E,0xBF,0xE6,0xDE,0xF5,0xD8,0xB1,0xF8, 0xFF,0x36,0xB3,0xB9,0x62,0x67,0x95,0xDB,0x31,0x5F,0x37,0xED,0x4C,0x70,0x67,0x99, 0x90,0xB5,0x18,0x31,0x6C,0x3D,0x99,0x99,0xE4,0x42,0xDA,0xD3,0x25,0x42,0x13,0xA0, 0xAE,0xD7,0x70,0x6C,0xB1,0x55,0xCF,0xC7,0xD7,0x46,0xD5,0x43,0x61,0x17,0x3D,0x44, 0x28,0xE9,0x33,0x85,0xD5,0xD0,0xA2,0x93,0xAA,0x25,0x12,0x1F,0xFB,0xC5,0x0B,0x46, 0xF5,0x97,0x76,0x56,0x45,0xA6,0xBE,0x87,0xB1,0x94,0x6B,0xE8,0xB1,0xFE,0x33,0x99, 0xAE,0x1F,0x3E,0x6C,0x39,0x71,0x1D,0x09,0x00,0x90,0x37,0xE4,0x10,0x3E,0x75,0x74, 0xFF,0x8C,0x83,0x3B,0xB0,0xF1,0xB0,0xF9,0x01,0x05,0x47,0x42,0x95,0xF1,0xD6,0xAC, 0x7E,0x38,0xE6,0x9E,0x95,0x74,0x26,0x3F,0xB4,0x68,0x50,0x18,0xD0,0x43,0x30,0xB4, 0x4C,0x4B,0xE3,0x68,0xBF,0xE5,0x4D,0xB6,0x95,0x8B,0x0A,0xA0,0x74,0x25,0x32,0x77, 0xCF,0xA1,0xF7,0x2C,0xD8,0x71,0x13,0x5A,0xAB,0xEA,0xC9,0x51,0xE8,0x0D,0xEE,0xEF, 0xE9,0x93,0x7E,0x19,0xA7,0x1E,0x43,0x38,0x81,0x16,0x2C,0xA1,0x48,0xE3,0x73,0xCC, 0x29,0x21,0x6C,0xD3,0x5D,0xCE,0xA0,0xD9,0x61,0x71,0x43,0xA0,0x15,0x13,0xB5,0x64, 0x92,0xCF,0x2A,0x19,0xDC,0xAD,0xB7,0xA5,0x9F,0x86,0x65,0xF8,0x1A,0x9F,0xE7,0xFB, 0xF7,0xFD,0xB8,0x13,0x6C,0x27,0xDB,0x6F,0xDF,0x35,0x1C,0xF7,0x8D,0x2C,0x5B,0x9B, 0x12,0xAB,0x38,0x64,0x06,0xCC,0xDE,0x31,0xE8,0x4E,0x75,0x11,0x64,0xE3,0xFA,0xEA, 0xEB,0x34,0x54,0xC2,0xAD,0x3F,0x34,0xEB,0x93,0x2C,0x7D,0x26,0x36,0x9D,0x56,0xF3, 0x5A,0xE1,0xF6,0xB3,0x98,0x63,0x4A,0x9E,0x32,0x83,0xE4,0x9A,0x84,0x60,0x7D,0x90, 0x2E,0x13,0x0E,0xEE,0x93,0x4B,0x36,0xA2,0x85,0xEC,0x16,0x38,0xE8,0x88,0x06,0x02, 0xBF,0xF0,0xA0,0x3A,0xED,0xD7,0x6A,0x9A,0x73,0xE1,0x57,0xCF,0xF8,0x44,0xB8,0xDC, 0x2E,0x23,0x59,0xD1,0xDF,0x95,0x52,0x71,0x99,0x61,0xA0,0x4B,0xD5,0x7F,0x6E,0x78, 0xBA,0xA9,0xC5,0x30,0xD3,0x40,0x86,0x32,0x9D,0x32,0x0C,0x9C,0x37,0xB7,0x02,0x2F, 0xBA,0x54,0x98,0xA9,0xC4,0x13,0x04,0xC9,0x8D,0xBE,0xC8,0xE7,0x5D,0x97,0x50,0x2E, 0x93,0xD6,0x22,0x59,0x0C,0x27,0xBC,0x22,0x92,0xE0,0xA7,0x20,0x0F,0x93,0x6F,0x7F, 0x4C,0x9F,0xD3,0xB5,0xA6,0x2A,0x0B,0x74,0x67,0x49,0x7D,0x10,0x26,0xCB,0xD1,0xC5, 0x86,0x71,0xE7,0x8C,0xA0,0x9C,0xE9,0x5B,0xB2,0x1A,0xF6,0x01,0xEE,0x8C,0x9E,0x5E, 0x83,0xF2,0x1A,0xDB,0xE6,0xE5,0xEA,0x84,0x59,0x76,0xD2,0x7C,0xF6,0x8D,0xA5,0x49, 0x36,0x48,0xC2,0x16,0x52,0xBB,0x83,0xA3,0x74,0xB9,0x07,0x0C,0x3B,0xFF,0x61,0x28, 0xE1,0x61,0xE9,0xE4,0xEF,0x6E,0x15,0xAA,0x4E,0xBA,0xE8,0x5D,0x05,0x96,0xBB,0x32, 0x56,0xB0,0xFB,0x72,0x52,0x0F,0x0E,0xC8,0x42,0x25,0x65,0x76,0x89,0xAF,0xF2,0xDE, 0x10,0x27,0xF0,0x01,0x4B,0x74,0xA7,0x97,0x07,0xD5,0x26,0x54,0x54,0x09,0x1F,0x82, 0x0A,0x86,0x7D,0x30,0x39,0x0E,0xB3,0x26,0x9B,0x0B,0x57,0xBB,0x36,0x06,0x31,0xAF, 0xFD,0x79,0xFC,0xD9,0x30,0x10,0x2B,0x0C,0xB3,0xE1,0x9B,0xD7,0x7B,0xDC,0x5F,0xEF, 0xD2,0xF8,0x13,0x45,0x4D,0x47,0x75,0xBD,0x46,0x96,0x3C,0x7E,0x75,0xF3,0x3E,0xB5, 0x67,0xC5,0x9A,0x3B,0xB0,0x5B,0x29,0x6B,0xDE,0x80,0x5B,0xC8,0x15,0x05,0xB1,0x31, 0xB6,0xCE,0x49,0xDD,0xAD,0x84,0xB5,0xAE,0x60,0xDC,0x67,0x31,0x34,0x30,0xFE,0x4E, 0xBD,0x80,0x2F,0xA6,0xBF,0x63,0x39,0x21,0x86,0xD9,0x35,0x7F,0x16,0x68,0x22,0x05, 0x54,0xE9,0x90,0x26,0x8C,0x07,0x6C,0x51,0xA4,0x31,0x55,0xD7,0x09,0x07,0xA8,0x3E, 0x2E,0x53,0x66,0xC1,0xF8,0xF2,0x7B,0xC4,0xF2,0x58,0xCF,0xF1,0x87,0xC5,0xA2,0xE7, 0x27,0x8F,0x30,0x87,0x58,0xA0,0x64,0x62,0x23,0x18,0xB9,0x88,0x7C,0xFA,0xCE,0xC4, 0x98,0xAE,0xAD,0x17,0xCC,0x4A,0x5B,0xF3,0xE9,0x48,0xD5,0x56,0xD3,0x0D,0xF2,0xC8, 0x92,0x73,0x8C,0xDB,0xD7,0x2F,0x56,0xAC,0x81,0xF9,0x92,0x69,0x4D,0xC6,0x32,0xF6, 0xE6,0xC0,0x8D,0x21,0xE2,0x76,0x80,0x61,0x11,0xBC,0xDC,0x6C,0x93,0xAF,0x19,0x69, 0x9B,0xD0,0xBF,0xB9,0x31,0x9F,0x02,0x67,0xA3,0x51,0xEE,0x83,0x06,0x22,0x7B,0x0C, 0xAB,0x49,0x42,0x40,0xB8,0xD5,0x01,0x7D,0xCE,0x5E,0xF7,0x55,0x53,0x39,0xC5,0x99, 0x46,0xD8,0x87,0x9F,0xBA,0xF7,0x64,0xB4,0xE3,0x9A,0xFA,0xA1,0x6D,0x90,0x68,0x10, 0x30,0xCA,0x8A,0x54,0xA7,0x9F,0x60,0xC3,0x19,0xF5,0x6B,0x0D,0x7A,0x51,0x98,0xE6, 0x98,0x43,0x51,0xB4,0xD6,0x35,0xE9,0x4F,0xC3,0xDF,0x0F,0x7B,0xD6,0x2F,0x5C,0xBD, 0x3A,0x15,0x61,0x19,0xF1,0x4B,0xCB,0xAA,0xDC,0x6D,0x64,0xC9,0xD3,0xC6,0x1E,0x56, 0xEF,0x38,0x4C,0x50,0x71,0x86,0x75,0xCC,0x0D,0x0D,0x4E,0xE9,0x28,0xF6,0x06,0x5D, 0x70,0x1B,0xAA,0xD3,0x45,0xCF,0xA8,0x39,0xAC,0x95,0xA6,0x2E,0xB4,0xE4,0x22,0xD4, 0x74,0xA8,0x37,0x5F,0x48,0x7A,0x04,0xCC,0xA5,0x4C,0x40,0xD8,0x28,0xB4,0x28,0x08, 0x0D,0x1C,0x72,0x52,0x41,0xF0,0x7D,0x47,0x19,0x3A,0x53,0x4E,0x58,0x84,0x62,0x6B, 0x93,0xB5,0x8A,0x81,0x21,0x4E,0x0D,0xDC,0xB4,0x3F,0xA2,0xC6,0xFC,0xC9,0x2B,0x40, 0xDA,0x38,0x04,0xE9,0x5E,0x5A,0x86,0x6B,0x0C,0x22,0x25,0x85,0x68,0x11,0x8D,0x7C, 0x92,0x1D,0x95,0x55,0x4D,0xAB,0x8E,0xBB,0xDA,0xA6,0xE6,0xB7,0x51,0xB6,0x32,0x5A, 0x05,0x41,0xDD,0x05,0x2A,0x0A,0x56,0x50,0x91,0x17,0x47,0xCC,0xC9,0xE6,0x7E,0xB5, 0x61,0x4A,0xDB,0x73,0x67,0x51,0xC8,0x33,0xF5,0xDA,0x6E,0x74,0x2E,0x54,0xC3,0x37, 0x0D,0x6D,0xAF,0x08,0xE8,0x15,0x8A,0x5F,0xE2,0x59,0x21,0xCD,0xA8,0xDE,0x0C,0x06, 0x5A,0x77,0x6B,0x5F,0xDB,0x18,0x65,0x3E,0xC8,0x50,0xDE,0x78,0xE0,0xB8,0x82,0xB3, 0x5D,0x4E,0x72,0x32,0x07,0x4F,0xC1,0x34,0x23,0xBA,0x96,0xB7,0x67,0x4E,0xA4,0x28, 0x1E,0x34,0x62,0xEB,0x2D,0x6A,0x70,0xE9,0x2F,0x42,0xC4,0x70,0x4E,0x5A,0x31,0x9C, 0xF9,0x5B,0x47,0x28,0xAA,0xDA,0x71,0x6F,0x38,0x1F,0xB3,0x78,0xC4,0x92,0x6B,0x1C, 0x9E,0xF6,0x35,0x9A,0xB7,0x4D,0x0E,0xBF,0xCC,0x18,0x29,0x41,0x03,0x48,0x35,0x5D, 0x55,0xD0,0x2B,0xC6,0x29,0xAF,0x5C,0x60,0x74,0x69,0x8E,0x5E,0x9B,0x7C,0xD4,0xBD, 0x7B,0x44,0x64,0x7D,0x3F,0x92,0x5D,0x69,0xB6,0x1F,0x00,0x4B,0xD4,0x83,0x35,0xCF, 0x7E,0x64,0x4E,0x17,0xAE,0x8D,0xD5,0x2E,0x9A,0x28,0x12,0x4E,0x2E,0x2B,0x49,0x08, 0x5C,0xAE,0xC6,0x46,0x85,0xAE,0x41,0x61,0x1E,0x6F,0x82,0xD2,0x51,0x37,0x16,0x1F, 0x0B,0xF6,0x59,0xA4,0x9A,0xCA,0x5A,0xAF,0x0D,0xD4,0x33,0x8B,0x20,0x63,0xF1,0x84, 0x80,0x5C,0xCB,0xCF,0x08,0xB4,0xB9,0xD3,0x16,0x05,0xBD,0x62,0x83,0x31,0x9B,0x56, 0x51,0x98,0x9F,0xBA,0xB2,0x5B,0xAA,0xB2,0x22,0x6B,0x2C,0xB5,0xD4,0x48,0xFA,0x63, 0x2B,0x5F,0x58,0xFA,0x61,0xFA,0x64,0x09,0xBB,0x38,0xE0,0xB8,0x9D,0x92,0x60,0xA8, 0x0D,0x67,0x6F,0x0E,0x37,0xF5,0x0D,0x01,0x9F,0xC2,0x77,0xD4,0xFE,0xEC,0xF1,0x73, 0x30,0x39,0xE0,0x7D,0xF5,0x61,0x98,0xE4,0x2C,0x28,0x55,0x04,0x56,0x55,0xDB,0x2F, 0x6B,0xEC,0xE5,0x58,0x06,0xB6,0x64,0x80,0x6A,0x2A,0x1A,0x4E,0x5B,0x0F,0xD8,0xC4, 0x0A,0x2E,0x52,0x19,0xD9,0x62,0xF5,0x30,0x48,0xBE,0x8C,0x7B,0x4F,0x38,0x9B,0xA2, 0xC3,0xAF,0xC9,0xD3,0xC7,0xC1,0x62,0x41,0x86,0xB9,0x61,0x21,0x57,0x6F,0x99,0x4F, 0xC1,0xBA,0xCE,0x7B,0xB5,0x3B,0x4D,0x5E,0x8A,0x8B,0x44,0x57,0x5F,0x13,0x5F,0x70, 0x6D,0x5B,0x29,0x47,0xDC,0x38,0xE2,0xEC,0x04,0x55,0x65,0x12,0x2A,0xE8,0x17,0x43, 0xE1,0x8E,0xDD,0x2A,0xB3,0xE2,0x94,0xF7,0x09,0x6E,0x5C,0xE6,0xEB,0x8A,0xF8,0x6D, 0x89,0x49,0x54,0x48,0xF5,0x2F,0xAD,0xBF,0xEA,0x94,0x4B,0xCA,0xFC,0x39,0x87,0x82, 0x5F,0x8A,0x01,0xF2,0x75,0xF2,0xE6,0x71,0xD6,0xD8,0x42,0xDE,0xF1,0x2D,0x1D,0x28, 0xA6,0x88,0x7E,0xA3,0xA0,0x47,0x1D,0x30,0xD9,0xA3,0x71,0xDF,0x49,0x1C,0xCB,0x01, 0xF8,0x36,0xB1,0xF2,0xF0,0x22,0x58,0x5D,0x45,0x6B,0xBD,0xA0,0xBB,0xB2,0x88,0x42, 0xC7,0x8C,0x28,0xCE,0x93,0xE8,0x90,0x63,0x08,0x90,0x7C,0x89,0x3C,0xF5,0x7D,0xB7, 0x04,0x2D,0x4F,0x55,0x51,0x16,0xFD,0x7E,0x79,0xE8,0xBE,0xC1,0xF2,0x12,0xD4,0xF8, 0xB4,0x84,0x05,0x23,0xA0,0xCC,0xD2,0x2B,0xFD,0xE1,0xAB,0xAD,0x0D,0xD1,0x55,0x6C, 0x23,0x41,0x94,0x4D,0x77,0x37,0x4F,0x05,0x28,0x0C,0xBF,0x17,0xB3,0x12,0x67,0x6C, 0x8C,0xC3,0x5A,0xF7,0x41,0x84,0x2A,0x6D,0xD0,0x94,0x12,0x27,0x2C,0xB4,0xED,0x9C, 0x4D,0xEC,0x47,0x82,0x97,0xD5,0x67,0xB9,0x1B,0x9D,0xC0,0x55,0x07,0x7E,0xE5,0x8E, 0xE2,0xA8,0xE7,0x3E,0x12,0xE4,0x0E,0x3A,0x2A,0x45,0x55,0x34,0xA2,0xF9,0x2D,0x5A, 0x1B,0xAB,0x52,0x7C,0x83,0x10,0x5F,0x55,0xD2,0xF1,0x5A,0x43,0x2B,0xC6,0xA7,0xA4, 0x89,0x15,0x95,0xE8,0xB4,0x4B,0x9D,0xF8,0x75,0xE3,0x9F,0x60,0x78,0x5B,0xD6,0xE6, 0x0D,0x44,0xE6,0x21,0x06,0xBD,0x47,0x22,0x53,0xA4,0x00,0xAD,0x8D,0x43,0x13,0x85, 0x39,0xF7,0xAA,0xFC,0x38,0xAF,0x7B,0xED,0xFC,0xE4,0x2B,0x54,0x50,0x98,0x4C,0xFC, 0x85,0x80,0xF7,0xDF,0x3C,0x80,0x22,0xE1,0x94,0xDA,0xDE,0x24,0xC6,0xB0,0x7A,0x39, 0x38,0xDC,0x0F,0xA1,0xA7,0xF4,0xF9,0x6F,0x63,0x18,0x57,0x8B,0x84,0x41,0x2A,0x2E, 0xD4,0x53,0xF2,0xD9,0x00,0x0F,0xD0,0xDD,0x99,0x6E,0x19,0xA6,0x0A,0xD0,0xEC,0x5B, 0x58,0x24,0xAB,0xC0,0xCB,0x06,0x65,0xEC,0x1A,0x13,0x38,0x94,0x0A,0x67,0x03,0x2F, 0x3F,0xF7,0xE3,0x77,0x44,0x77,0x33,0xC6,0x14,0x39,0xD0,0xE3,0xC0,0xA2,0x08,0x79, 0xBB,0x40,0x99,0x57,0x41,0x0B,0x01,0x90,0xCD,0xE1,0xCC,0x48,0x67,0xDB,0xB3,0xAF, 0x88,0x74,0xF3,0x4C,0x82,0x8F,0x72,0xB1,0xB5,0x23,0x29,0xC4,0x12,0x6C,0x19,0xFC, 0x8E,0x46,0xA4,0x9C,0xC4,0x25,0x65,0x87,0xD3,0x6D,0xBE,0x8A,0x93,0x11,0x03,0x38, 0xED,0x83,0x2B,0xF3,0x46,0xA4,0x93,0xEA,0x3B,0x53,0x85,0x1D,0xCE,0xD4,0xF1,0x08, 0x83,0x27,0xED,0xFC,0x9B,0x1A,0x18,0xBC,0xF9,0x8B,0xAE,0xDC,0x24,0xAB,0x50,0x38, 0xE9,0x72,0x4B,0x10,0x22,0x17,0x7B,0x46,0x5D,0xAB,0x59,0x64,0xF3,0x40,0xAE,0xF8, 0xBB,0xE5,0xC8,0xF9,0x26,0x03,0x4E,0x55,0x7D,0xEB,0xEB,0xFE,0xF7,0x39,0xE6,0xE0, 0x0A,0x11,0xBE,0x2E,0x28,0xFF,0x98,0xED,0xC0,0xC9,0x42,0x56,0x42,0xC3,0xFD,0x00, 0xF6,0xAF,0x87,0xA2,0x5B,0x01,0x3F,0x32,0x92,0x47,0x95,0x9A,0x72,0xA5,0x32,0x3D, 0xAE,0x6B,0xD0,0x9B,0x07,0xD2,0x49,0x92,0xE3,0x78,0x4A,0xFA,0xA1,0x06,0x7D,0xF2, 0x41,0xCF,0x77,0x74,0x04,0x14,0xB2,0x0C,0x86,0x84,0x64,0x16,0xD5,0xBB,0x51,0xA1, 0xE5,0x6F,0xF1,0xD1,0xF2,0xE2,0xF7,0x5F,0x58,0x20,0x4D,0xB8,0x57,0xC7,0xCF,0xDD, 0xC5,0xD8,0xBE,0x76,0x3D,0xF6,0x5F,0x7E,0xE7,0x2A,0x8B,0x88,0x24,0x1B,0x38,0x3F, 0x0E,0x41,0x23,0x77,0xF5,0xF0,0x4B,0xD4,0x0C,0x1F,0xFA,0xA4,0x0B,0x80,0x5F,0xCF, 0x45,0xF6,0xE0,0xDA,0x2F,0x34,0x59,0x53,0xFB,0x20,0x3C,0x52,0x62,0x5E,0x35,0xB5, 0x62,0xFE,0x8B,0x60,0x63,0xE3,0x86,0x5A,0x15,0x1A,0x6E,0xD1,0x47,0x45,0xBC,0x32, 0xB4,0xEB,0x67,0x38,0xAB,0xE4,0x6E,0x33,0x3A,0xB5,0xED,0xA3,0xAD,0x67,0xE0,0x4E, 0x41,0x95,0xEE,0x62,0x62,0x71,0x26,0x1D,0x31,0xEF,0x62,0x30,0xAF,0xD7,0x82,0xAC, 0xC2,0xDC,0x05,0x04,0xF5,0x97,0x07,0xBF,0x11,0x59,0x23,0x07,0xC0,0x64,0x02,0xE8, 0x97,0xE5,0x3E,0xAF,0x18,0xAC,0x59,0xA6,0x8B,0x4A,0x33,0x90,0x1C,0x6E,0x7C,0x9C, 0x20,0x7E,0x4C,0x3C,0x3E,0x61,0x64,0xBB,0xC5,0x6B,0x7C,0x7E,0x3E,0x9F,0xC5,0x4C, 0x9F,0xEA,0x73,0xF5,0xD7,0x89,0xC0,0x4C,0xF4,0xFB,0xF4,0x2D,0xEC,0x14,0x1B,0x51, 0xD5,0xC1,0x12,0xC8,0x10,0xDF,0x0B,0x4A,0x8B,0x9C,0xBC,0x93,0x45,0x6A,0x3E,0x3E, 0x7D,0xC1,0xA9,0xBA,0xCD,0xC1,0xB4,0x07,0xE4,0xE1,0x68,0x86,0x43,0xB2,0x6D,0x38, 0xF3,0xFB,0x0C,0x5C,0x66,0x37,0x71,0xDE,0x56,0xEF,0x6E,0xA0,0x10,0x40,0x65,0xA7, 0x98,0xF7,0xD0,0xBE,0x0E,0xC8,0x37,0x36,0xEC,0x10,0xCA,0x7C,0x9C,0xAB,0x84,0x1E, 0x05,0x17,0x76,0x02,0x1C,0x4F,0x52,0xAA,0x5F,0xC1,0xC6,0xA0,0x56,0xB9,0xD8,0x04, 0x84,0x44,0x4D,0xA7,0x59,0xD8,0xDE,0x60,0xE6,0x38,0x0E,0x05,0x8F,0x03,0xE1,0x3B, 0x6D,0x81,0x04,0x33,0x6F,0x30,0x0B,0xCE,0x69,0x05,0x21,0x33,0xFB,0x26,0xBB,0x89, 0x7D,0xB6,0xAE,0x87,0x7E,0x51,0x07,0xE0,0xAC,0xF7,0x96,0x0A,0x6B,0xF9,0xC4,0x5C, 0x1D,0xE4,0x44,0x47,0xB8,0x5E,0xFA,0xE3,0x78,0x84,0x55,0x42,0x4B,0x48,0x5E,0xF7, 0x7D,0x47,0x35,0x86,0x1D,0x2B,0x43,0x05,0x03,0xEC,0x8A,0xB8,0x1E,0x06,0x3C,0x76, 0x0C,0x48,0x1A,0x43,0xA7,0xB7,0x8A,0xED,0x1E,0x13,0xC6,0x43,0xEE,0x10,0xEF,0xDB, 0xEC,0xFB,0x3C,0x83,0xB2,0x95,0x44,0xEF,0xD8,0x54,0x51,0x4E,0x2D,0x11,0x44,0x1D, 0xFB,0x36,0x59,0x1E,0x7A,0x34,0xC1,0xC3,0xCA,0x57,0x00,0x61,0xEA,0x67,0xA5,0x16, 0x9B,0x55,0xD0,0x55,0xE1,0x7F,0xD9,0x36,0xD2,0x40,0x76,0xAE,0xDC,0x01,0xCE,0xB0, 0x7A,0x83,0xD5,0xCB,0x20,0x98,0xEC,0x6B,0xC1,0x72,0x92,0x34,0xF3,0x82,0x57,0x37, 0x62,0x8A,0x32,0x36,0x0C,0x90,0x43,0xAE,0xAE,0x5C,0x9B,0x78,0x8E,0x13,0x65,0x02, 0xFD,0x68,0x71,0xC1,0xFE,0xB0,0x31,0xA0,0x24,0x82,0xB0,0xC3,0xB1,0x79,0x69,0xA7, 0xF5,0xD2,0xEB,0xD0,0x82,0xC0,0x32,0xDC,0x9E,0xC7,0x26,0x3C,0x6D,0x8D,0x98,0xC1, 0xBB,0x22,0xD4,0xD0,0x0F,0x33,0xEC,0x3E,0xB9,0xCC,0xE1,0xDC,0x6A,0x4C,0x77,0x36, 0x14,0x1C,0xF9,0xBF,0x81,0x9F,0x28,0x5F,0x71,0x85,0x32,0x29,0x90,0x75,0x48,0xC4, 0xB3,0x4A,0xCE,0xD8,0x44,0x8F,0x14,0x2F,0xFD,0x40,0x57,0xEF,0xAA,0x08,0x75,0xD9, 0x46,0xD1,0xD6,0x6E,0x32,0x55,0x1F,0xC3,0x18,0xFE,0x84,0x1F,0xFC,0x84,0xD5,0xFF, 0x71,0x5E,0x1B,0x48,0xC3,0x86,0x95,0x0E,0x28,0x08,0x27,0xD3,0x38,0x83,0x71,0x7B, 0x4C,0x80,0x63,0x54,0x9A,0x56,0xB0,0xAC,0xCF,0x80,0xCA,0x31,0x09,0xEF,0xFE,0xF3, 0xBE,0xAF,0x24,0x7E,0xA6,0xFE,0x53,0x3F,0xC2,0x8D,0x4A,0x33,0x68,0xD1,0x22,0xA6, 0x66,0xAD,0x7B,0xEA,0xDE,0xB6,0x43,0xB0,0xA1,0x25,0x95,0x00,0xA3,0x3F,0x75,0x46, 0x14,0x11,0x44,0xEC,0xD7,0x95,0xBC,0x92,0xF0,0x4F,0xA9,0x16,0x53,0x62,0x97,0x60, 0x2A,0x0F,0x41,0xF1,0x71,0x24,0xBE,0xEE,0x94,0x7F,0x08,0xCD,0x60,0x93,0xB3,0x85, 0x5B,0x07,0x00,0x3F,0xD8,0x0F,0x28,0x83,0x9A,0xD1,0x69,0x9F,0xD1,0xDA,0x2E,0xC3, 0x90,0x01,0xA2,0xB9,0x6B,0x4E,0x2A,0x66,0x9D,0xDA,0xAE,0xA6,0xEA,0x2A,0xD3,0x68, 0x2F,0x0C,0x0C,0x9C,0xD2,0x8C,0x4A,0xED,0xE2,0x9E,0x57,0x65,0x9D,0x09,0x87,0xA3, 0xB4,0xC4,0x32,0x5D,0xC9,0xD4,0x32,0x2B,0xB1,0xE0,0x71,0x1E,0x64,0x4D,0xE6,0x90, 0x71,0xE3,0x1E,0x40,0xED,0x7D,0xF3,0x84,0x0E,0xED,0xC8,0x78,0x76,0xAE,0xC0,0x71, 0x27,0x72,0xBB,0x05,0xEA,0x02,0x64,0xFB,0xF3,0x48,0x6B,0xB5,0x42,0x93,0x3F,0xED, 0x9F,0x13,0x53,0xD2,0xF7,0xFE,0x2A,0xEC,0x1D,0x47,0x25,0xDB,0x3C,0x91,0x86,0xC6, 0x8E,0xF0,0x11,0xFD,0x23,0x74,0x36,0xF7,0xA4,0xF5,0x9E,0x7A,0x7E,0x53,0x50,0x44, 0xD4,0x47,0xCA,0xD3,0xEB,0x38,0x6D,0xE6,0xD9,0x71,0x94,0x7F,0x4A,0xC6,0x69,0x4B, 0x11,0xF4,0x52,0xEA,0x22,0xFE,0x8A,0xB0,0x36,0x67,0x8B,0x59,0xE8,0xE6,0x80,0x2A, 0xEB,0x65,0x04,0x13,0xEE,0xEC,0xDC,0x9E,0x5F,0xB1,0xEC,0x05,0x6A,0x59,0xE6,0x9F, 0x5E,0x59,0x6B,0x89,0xBF,0xF7,0x1A,0xCA,0x44,0xF9,0x5B,0x6A,0x71,0x85,0x03,0xE4, 0x29,0x62,0xE0,0x70,0x6F,0x41,0xC4,0xCF,0xB2,0xB1,0xCC,0xE3,0x7E,0xA6,0x07,0xA8, 0x87,0xE7,0x7F,0x84,0x93,0xDB,0x52,0x4B,0x6C,0xEC,0x7E,0xDD,0xD4,0x24,0x48,0x10, 0x69,0x9F,0x04,0x60,0x74,0xE6,0x48,0x18,0xF3,0xE4,0x2C,0xB9,0x4F,0x2E,0x50,0x7A, 0xDF,0xD4,0x54,0x69,0x2B,0x8B,0xA7,0xF3,0xCE,0xFF,0x1F,0xF3,0x3E,0x26,0x01,0x39, 0x17,0x95,0x84,0x89,0xB0,0xF0,0x4C,0x4B,0x82,0x91,0x9F,0xC4,0x4B,0xAC,0x9D,0xA5, 0x74,0xAF,0x17,0x25,0xC9,0xCA,0x32,0xD3,0xBC,0x89,0x8A,0x84,0x89,0xCC,0x0D,0xAE, 0x7C,0xA2,0xDB,0x9C,0x6A,0x78,0x91,0xEE,0xEA,0x76,0x5D,0x4E,0x87,0x60,0xF5,0x69, 0x15,0x67,0xD4,0x02,0xCF,0xAF,0x48,0x36,0x07,0xEA,0xBF,0x6F,0x66,0x2D,0x06,0x8F, 0xC4,0x9A,0xFE,0xF9,0xF6,0x90,0x87,0x75,0xB8,0xF7,0xAD,0x0F,0x76,0x10,0x5A,0x3D, 0x59,0xB0,0x2E,0xB3,0xC7,0x35,0x2C,0xCC,0x70,0x56,0x2B,0xCB,0xE3,0x37,0x96,0xC5, 0x2F,0x46,0x1B,0x8A,0x22,0x46,0xC7,0x88,0xA7,0x26,0x32,0x98,0x61,0xDF,0x86,0x22, 0x8A,0xF4,0x1C,0x2F,0x87,0xA1,0x09,0xAA,0xCC,0xA9,0xAE,0xD3,0xBD,0x00,0x45,0x1C, 0x9A,0x54,0x87,0x86,0x52,0x87,0xEF,0xFF,0x1E,0x8F,0xA1,0x8F,0xC1,0x89,0x5C,0x35, 0x1B,0xDA,0x2D,0x3A,0x2C,0x16,0xB2,0xC2,0xF1,0x56,0xE2,0x78,0xC1,0x6B,0x63,0x97, 0xC5,0x56,0x8F,0xC9,0x32,0x7F,0x2C,0xAA,0xAF,0xA6,0xA8,0xAC,0x20,0x91,0x22,0x88, 0xDE,0xE4,0x60,0x8B,0xF9,0x4B,0x42,0x25,0x1A,0xE3,0x7F,0x9C,0x2C,0x19,0x89,0x3A, 0x7E,0x05,0xD4,0x36,0xCC,0x69,0x58,0xC2,0xC1,0x32,0x8B,0x2F,0x90,0x85,0xEB,0x7A, 0x39,0x50,0xA5,0xA1,0x27,0x92,0xC5,0x66,0xB0,0x20,0x4F,0x58,0x7E,0x55,0x83,0x43, 0x2B,0x45,0xE2,0x9C,0xE4,0xD8,0x12,0x90,0x2C,0x16,0x83,0x56,0x16,0x79,0x03,0xB3, 0xAD,0x2D,0x61,0x18,0x1A,0x13,0x1F,0x37,0xE2,0xE1,0x9C,0x73,0x7B,0x80,0xD5,0xFD, 0x2D,0x51,0x87,0xFC,0x7B,0xAA,0xD7,0x1F,0x2C,0x7A,0x8E,0xAF,0xF4,0x8D,0xBB,0xCD, 0x95,0x11,0x7C,0x72,0x0B,0xEE,0x6F,0xE2,0xB9,0xAF,0xDE,0x37,0x83,0xDE,0x8C,0x8D, 0x62,0x05,0x67,0xB7,0x96,0xC6,0x8D,0x56,0xB6,0x0D,0xD7,0x62,0xBA,0xD6,0x46,0x36, 0xBD,0x8E,0xC8,0xE6,0xEA,0x2A,0x6C,0x10,0x14,0xFF,0x6B,0x5B,0xFA,0x82,0x3C,0x46, 0xB1,0x30,0x43,0x46,0x51,0x8A,0x7D,0x9B,0x92,0x3E,0x83,0x79,0x5B,0x55,0x5D,0xB2, 0x6C,0x5E,0xCE,0x90,0x62,0x8E,0x53,0x98,0xC9,0x0D,0x6D,0xE5,0x2D,0x57,0xCD,0xC5, 0x81,0x57,0xBA,0xE1,0xE8,0xB8,0x8F,0x72,0xE5,0x4F,0x13,0xDC,0xEA,0x9D,0x71,0x15, 0x10,0xB2,0x11,0x88,0xD5,0x09,0xD4,0x7F,0x5B,0x65,0x7F,0x2C,0x3B,0x38,0x4C,0x11, 0x68,0x50,0x8D,0xFB,0x9E,0xB0,0x59,0xBF,0x94,0x80,0x89,0x4A,0xC5,0x1A,0x18,0x12, 0x89,0x53,0xD1,0x4A,0x10,0x29,0xE8,0x8C,0x1C,0xEC,0xB6,0xEA,0x46,0xC7,0x17,0x8B, 0x25,0x15,0x31,0xA8,0xA2,0x6B,0x43,0xB1,0x9D,0xE2,0xDB,0x0B,0x87,0x9B,0xB0,0x11, 0x04,0x0E,0x71,0xD2,0x29,0x77,0x89,0x82,0x0A,0x66,0x41,0x7F,0x1D,0x0B,0x48,0xFF, 0x72,0xBB,0x24,0xFD,0xC2,0x48,0xA1,0x9B,0xFE,0x7B,0x7F,0xCE,0x88,0xDB,0x86,0xD9, 0x85,0x3B,0x1C,0xB0,0xDC,0xA8,0x33,0x07,0xBF,0x51,0x2E,0xE3,0x0E,0x9A,0x00,0x97, 0x1E,0x06,0xC0,0x97,0x43,0x9D,0xD8,0xB6,0x45,0xC4,0x86,0x67,0x5F,0x00,0xF8,0x88, 0x9A,0xA4,0x52,0x9E,0xC7,0xAA,0x8A,0x83,0x75,0xEC,0xC5,0x18,0xAE,0xCE,0xC3,0x2F, 0x1A,0x2B,0xF9,0x18,0xFF,0xAE,0x1A,0xF5,0x53,0x0B,0xB5,0x33,0x51,0xA7,0xFD,0xE8, 0xA8,0xE1,0xA2,0x64,0xB6,0x22,0x17,0x43,0x80,0xCC,0x0A,0xD8,0xAE,0x3B,0xBA,0x40, 0xD7,0xD9,0x92,0x4A,0x89,0xDF,0x04,0x10,0xEE,0x9B,0x18,0x2B,0x6A,0x77,0x69,0x8A, 0x68,0xF4,0xF9,0xB9,0xA2,0x21,0x15,0x6E,0xE6,0x1E,0x3B,0x03,0x62,0x30,0x9B,0x60, 0x41,0x7E,0x25,0x9B,0x9E,0x8F,0xC5,0x52,0x10,0x08,0xF8,0xC2,0x69,0xA1,0x21,0x11, 0x88,0x37,0x5E,0x79,0x35,0x66,0xFF,0x10,0x42,0x18,0x6E,0xED,0x97,0xB6,0x6B,0x1C, 0x4E,0x36,0xE5,0x6D,0x7D,0xB4,0xE4,0xBF,0x20,0xB9,0xE0,0x05,0x3A,0x69,0xD5,0xB8, 0xE3,0xD5,0xDC,0xE0,0xB9,0xAC,0x53,0x3E,0x07,0xA4,0x57,0xAD,0x77,0xFF,0x48,0x18, 0x76,0x2A,0xAC,0x49,0x2A,0x8E,0x47,0x75,0x6D,0x9F,0x67,0x63,0x30,0x35,0x8C,0x39, 0x05,0x39,0xD5,0x6F,0x64,0x3A,0x5B,0xAD,0xCA,0x0B,0xBB,0x82,0x52,0x99,0x45,0xB1, 0x93,0x36,0x36,0x99,0xAF,0x13,0x20,0x44,0x36,0xD8,0x02,0x44,0x09,0x39,0x92,0x85, 0xFF,0x4A,0x4A,0x97,0x87,0xA6,0x63,0xD7,0xC7,0xB5,0xB5,0x24,0xED,0x0F,0xB4,0x6F, 0x0C,0x58,0x52,0x14,0xD9,0xA6,0x7B,0xD3,0x79,0xBC,0x38,0x58,0xA1,0xBD,0x3B,0x84, 0x06,0xD8,0x1A,0x06,0xFD,0x6B,0xA8,0xEA,0x4B,0x69,0x28,0x04,0x37,0xAD,0x82,0x99, 0xFB,0x0E,0x1B,0x85,0xBD,0xA8,0x5D,0x73,0xCD,0xDC,0x58,0x75,0x0A,0xBE,0x63,0x6C, 0x48,0xE7,0x4C,0xE4,0x30,0x2B,0x04,0x60,0xB9,0x15,0xD8,0xDA,0x86,0x81,0x75,0x8F, 0x96,0xD4,0x8D,0x1C,0x5D,0x70,0x85,0x7C,0x1C,0x67,0x7B,0xD5,0x08,0x67,0xA6,0xCE, 0x4B,0x0A,0x66,0x70,0xB7,0xE5,0x63,0xD4,0x5B,0x8A,0x82,0xEA,0x10,0x67,0xCA,0xE2, 0xF4,0xEF,0x17,0x85,0x2F,0x2A,0x5F,0x8A,0x97,0x82,0xF8,0x6A,0xD6,0x34,0x10,0xEA, 0xEB,0xC9,0x5C,0x3C,0xE1,0x49,0xF8,0x46,0xEB,0xDE,0xBD,0xF6,0xA9,0x92,0xF1,0xAA, 0xA6,0xA0,0x18,0xB0,0x3A,0xD3,0x0F,0x1F,0xF3,0x6F,0xFF,0x31,0x45,0x43,0x44,0xD3, 0x50,0x9A,0xF7,0x88,0x09,0x96,0xC1,0xCE,0x76,0xCC,0xF2,0x2C,0x2C,0xBA,0xAD,0x82, 0x77,0x8F,0x18,0x84,0xC0,0xD2,0x07,0x9C,0x36,0x90,0x83,0x4E,0x0B,0xA5,0x4F,0x43, 0x3E,0x04,0xAB,0x78,0x4F,0xD6,0xFB,0x09,0x01,0x24,0x90,0xDA,0x6F,0x3C,0x3A,0x61, 0x0D,0x7F,0x69,0x4A,0xEB,0x2B,0x30,0x02,0xB4,0xDB,0xE0,0x84,0xA9,0xEC,0xD7,0x35, 0xBF,0x37,0x7D,0x85,0x58,0xCE,0xA9,0x4E,0xE4,0x80,0xC7,0xA8,0xD3,0x30,0x67,0x48, 0xEB,0x29,0xAF,0x2F,0x74,0x6A,0xB4,0xA7,0x3F,0x0F,0x3F,0x92,0xAF,0xF3,0xCA,0xAC, 0xAF,0x4B,0xD9,0x94,0xC0,0x43,0xCA,0x81,0x0D,0x2F,0x48,0xA1,0xB0,0x27,0xD5,0xD2, 0xEF,0x4B,0x05,0x85,0xA3,0xDE,0x4D,0x93,0x30,0x3C,0xF0,0xBB,0x4A,0x8F,0x30,0x27, 0x4C,0xEB,0xE3,0x3E,0x64,0xED,0x9A,0x2F,0x3B,0xF1,0x82,0xF0,0xBA,0xF4,0xCF,0x7F, 0x40,0xCB,0xB0,0xE1,0x7F,0xBC,0xAA,0x57,0xD3,0xC9,0x74,0xF2,0xFA,0x43,0x0D,0x22, 0xD0,0xF4,0x77,0x4E,0x93,0xD7,0x85,0x70,0x1F,0x99,0xBF,0xB6,0xDE,0x35,0xF1,0x30, 0xA7,0x5E,0x71,0xF0,0x6B,0x01,0x2D,0x7B,0x64,0xF0,0x33,0x53,0x0A,0x39,0x88,0xF3, 0x6B,0x3A,0xA6,0x6B,0x35,0xD2,0x2F,0x43,0xCD,0x02,0xFD,0xB5,0xE9,0xBC,0x5B,0xAA, 0xD8,0xA4,0x19,0x7E,0x0E,0x5D,0x94,0x81,0x9E,0x6F,0x77,0xAD,0xD6,0x0E,0x74,0x93, 0x96,0xE7,0xC4,0x18,0x5F,0xAD,0xF5,0x19, }; u32 card_hash[0x412]; int cardheader_devicetype = 0; u32 global3_x00, global3_x04; // RTC value u32 global3_rand1; u32 global3_rand3; static u32 lookup(u32 *magic, u32 v) { u32 a = (v >> 24) & 0xFF; u32 b = (v >> 16) & 0xFF; u32 c = (v >> 8) & 0xFF; u32 d = (v >> 0) & 0xFF; a = magic[a+18+0]; b = magic[b+18+256]; c = magic[c+18+512]; d = magic[d+18+768]; return d + (c ^ (b + a)); } static void encrypt(u32 *magic, u32 *arg1, u32 *arg2) { u32 a,b,c; a = *arg1; b = *arg2; for (int i=0; i<16; i++) { c = magic[i] ^ a; a = b ^ lookup(magic, c); b = c; } *arg2 = a ^ magic[16]; *arg1 = b ^ magic[17]; } static void decrypt(u32 *magic, u32 *arg1, u32 *arg2) { u32 a,b,c; a = *arg1; b = *arg2; for (int i=17; i>1; i--) { c = magic[i] ^ a; a = b ^ lookup(magic, c); b = c; } *arg1 = b ^ magic[0]; *arg2 = a ^ magic[1]; } static void encrypt(u32 *magic, u64 &cmd) { encrypt(magic, (u32 *)&cmd + 1, (u32 *)&cmd + 0); } static void decrypt(u32 *magic, u64 &cmd) { decrypt(magic, (u32 *)&cmd + 1, (u32 *)&cmd + 0); } static void update_hashtable(u32* magic, u8 arg1[8]) { for (int j=0;j<18;j++) { u32 r3=0; for (int i=0;i<4;i++) { r3 <<= 8; r3 |= arg1[(j*4 + i) & 7]; } magic[j] ^= r3; } u32 tmp1 = 0; u32 tmp2 = 0; for (int i=0; i<18; i+=2) { encrypt(magic,&tmp1,&tmp2); magic[i+0] = tmp1; magic[i+1] = tmp2; } for (int i=0; i<0x400; i+=2) { encrypt(magic,&tmp1,&tmp2); magic[i+18+0] = tmp1; magic[i+18+1] = tmp2; } } u32 arg2[3]; static void init2(u32 *magic, u32 a[3]) { encrypt(magic, a+2, a+1); encrypt(magic, a+1, a+0); update_hashtable(magic, (u8*)a); } static void init1(u32 cardheader_gamecode) { memcpy(card_hash, &arm7_key, 4*(1024 + 18)); arg2[0] = *(u32 *)&cardheader_gamecode; arg2[1] = (*(u32 *)&cardheader_gamecode) >> 1; arg2[2] = (*(u32 *)&cardheader_gamecode) << 1; init2(card_hash, arg2); init2(card_hash, arg2); } static void init0(u32 cardheader_gamecode) { init1(cardheader_gamecode); encrypt(card_hash, (u32*)&global3_x04, (u32*)&global3_x00); global3_rand1 = global3_x00 ^ global3_x04; // more RTC global3_rand3 = global3_x04 ^ 0x0380FEB2; encrypt(card_hash, (u32*)&global3_rand3, (u32*)&global3_rand1); } // ARM9 decryption check values #define MAGIC30 0x72636E65 #define MAGIC34 0x6A624F79 /* * decrypt_arm9 */ static bool decrypt_arm9(u32 cardheader_gamecode, unsigned char *data) { u32 *p = (u32*)data; init1(cardheader_gamecode); decrypt(card_hash, p+1, p); arg2[1] <<= 1; arg2[2] >>= 1; init2(card_hash, arg2); decrypt(card_hash, p+1, p); if (p[0] != MAGIC30 || p[1] != MAGIC34) { fprintf(stderr, "Decryption failed!\n"); return false; } *p++ = 0xE7FFDEFF; *p++ = 0xE7FFDEFF; u32 size = 0x800 - 8; while (size > 0) { decrypt(card_hash, p+1, p); p += 2; size -= 8; } return true; } static void encrypt_arm9(u32 cardheader_gamecode, unsigned char *data) { u32 *p = (u32*)data; if (p[0] != 0xE7FFDEFF || p[1] != 0xE7FFDEFF) { fprintf(stderr, "Encryption failed!\n"); return; } p += 2; init1(cardheader_gamecode); arg2[1] <<= 1; arg2[2] >>= 1; init2(card_hash, arg2); u32 size = 0x800 - 8; while (size > 0) { encrypt(card_hash, p+1, p); p += 2; size -= 8; } p = (u32*)data; p[0] = MAGIC30; p[1] = MAGIC34; encrypt(card_hash, p+1, p); init1(cardheader_gamecode); encrypt(card_hash, p+1, p); } //the NDS contains //0x0000 - 0x01FF : header //0x0200 - 0x3FFF : typically, nothing is stored here. on retail cards, you can't read from that area anyway, but im not sure if that's done in the game card or the GC bus controller on the system //0x4000 - 0x7FFF : secure area (details in gbatek) bool DecryptSecureArea(u8 *romheader, u8 *secure) { //this looks like it will only work on little endian hosts Header* header = (Header*)romheader; int romType = DetectRomType(*header, (char*)secure); if(romType == ROMTYPE_INVALID) return false; // check if ROM is already encrypted if (romType == ROMTYPE_NDSDUMPED) { printf("Already decrypted.\n"); } else if (romType >= ROMTYPE_ENCRSECURE) // includes ROMTYPE_MASKROM { //unsigned char data[0x4000]; //memcpy(data,romdata+0x4000,0x4000); //decrypt_arm9(*(u32 *)header->gamecode, data); //// clear data after header //memset(romdata+0x200,0,(0x4000-0x200)); //// write secure 0x800 //memcpy(romdata+0x4000,data,0x800); if (!decrypt_arm9(*(u32 *)header->gamecode, secure)) return false; printf("Decrypted.\n"); } else { printf("File doesn't appear to have a secure area.\n"); } return true; } bool EncryptSecureArea(u8 *romheader, u8 *secure) { //this looks like it will only work on little endian hosts Header* header = (Header*)romheader; int romType = DetectRomType(*header, (char*)secure); if(romType == ROMTYPE_INVALID) return false; if (romType == ROMTYPE_NDSDUMPED) { //unsigned char data[0x4000]; //memcpy(data,romdata+0x4000,0x4000); //encrypt_arm9(*(u32 *)header->gamecode, data); //// clear data after header //memset(romdata+0x200,0,(0x4000-0x200)); //// write secure 0x800 //memcpy(romdata+0x4000,data,0x800); encrypt_arm9(*(u32 *)header->gamecode, secure); printf("Encrypted.\n"); } return true; } bool CheckValidRom(u8 *header, u8 *secure) { Header* hdr = (Header*)header; int romType = DetectRomType(*hdr, (char*)secure); return (romType != ROMTYPE_INVALID); }desmume-0.9.11/src/utils/decrypt/crc.h0000755000000000000000000001330112467662066016300 0ustar rootroot//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/crc.h?revision=2447 /* crc.h - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Cyclic Redundancy Code (CRC) functions by Rafael Vuijk (aka DarkFader) */ #ifndef __CRC_H #define __CRC_H //#include "little.h" // FixCrc is not yet big endian compatible #include /* * Data */ extern unsigned short ccitt16tab[]; extern unsigned short crc16tab[]; extern unsigned long crc32tab[]; /* * Defines */ #define CRC_TEMPLATE template /* * CalcCcitt * Does not perform final inversion. */ #define CalcCcitt_ CalcCcitt #define CalcCcitt16 CalcCcitt CRC_TEMPLATE inline CrcType CalcCcitt(unsigned char *data, unsigned int length, CrcType crc = (CrcType)0) { for (unsigned int i=0; i> 8) ^ data[i]]; } return crc; } /* * CalcCrc * Does not perform final inversion. */ #define CalcCrc_ CalcCrc #define CalcCrc16 CalcCrc #define CalcCrc32 CalcCrc CRC_TEMPLATE inline CrcType CalcCrc(unsigned char *data, unsigned int length, CrcType crc = (CrcType)~0) { for (unsigned int i=0; i> 8) ^ crcTable[(crc ^ data[i]) & 0xFF]; } return crc; } /* * FCalcCrc * Does not perform final inversion. */ #define FCalcCrc_ FCalcCrc #define FCalcCrc16 FCalcCrc #define FCalcCrc32 FCalcCrc CRC_TEMPLATE inline CrcType FCalcCrc(FILE *f, unsigned int offset, unsigned int length, CrcType crc = (CrcType)~0) { fseek(f, offset, SEEK_SET); for (unsigned int i=0; i> 8) ^ crcTable[(crc ^ fgetc(f)) & 0xFF]; } return crc; } /* * RevCrc * Reverse table lookup. */ #define RevCrc_ RevCrc CRC_TEMPLATE inline unsigned char RevCrc(unsigned char x, CrcType *value = 0) { for (int y=0; y<256; y++) { if ((crcTable[y] >> (8*sizeof(CrcType)-8)) == x) { if (value) *value = crcTable[y]; return y; } } return 0; } /* * FixCrc */ #define FixCrc_ FixCrc #define FixCrc16 FixCrc #define FixCrc32 FixCrc CRC_TEMPLATE void FixCrc ( unsigned char *data, // data to be patched unsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length, // patch data unsigned int fix_offset = 0, // position to write the fix. by default, it is immediately after the patched data CrcType initial_crc = (CrcType)~0 // useful when manually calculating leading data ) { if (!fix_offset) fix_offset = patch_offset + patch_length; // calculate CRC after leading data initial_crc = CalcCrc_(data, patch_offset, initial_crc); // calculate CRC before fix unsigned char buf[2*sizeof(CrcType)]; CrcType crc_before_fix = CalcCrc_(data + patch_offset, fix_offset - patch_offset); *(CrcType *)(buf + 0) = crc_before_fix; // patch memcpy(data + patch_offset, patch_data, patch_length); // calculate CRC after unfixed CrcType crc_after_unfix = CalcCrc_(data + patch_offset, fix_offset - patch_offset + sizeof(CrcType)); *(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix; // fix it for (int i=sizeof(CrcType); i>=1; i--) { CrcType value; unsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value); *(CrcType *)(buf + i) ^= value; buf[i - 1] ^= index; } memcpy(data + fix_offset, buf, sizeof(CrcType)); } /* * FFixCrc */ #define FFixCrc_ FFixCrc #define FFixCrc16 FFixCrc #define FFixCrc32 FFixCrc CRC_TEMPLATE void FFixCrc ( FILE *f, // file to be patched unsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length, // patch data unsigned int fix_offset = 0, // position to write the fix. by default, it is immediately after the patched data CrcType initial_crc = (CrcType)~0 // useful when manually calculating leading data ) { if (!fix_offset) fix_offset = patch_offset + patch_length; // calculate CRC after leading data initial_crc = FCalcCrc_(f, 0, patch_offset, initial_crc); // calculate CRC before fix unsigned char buf[2*sizeof(CrcType)]; CrcType crc_before_fix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset); *(CrcType *)(buf + 0) = crc_before_fix; // patch fseek(f, patch_offset, SEEK_SET); fwrite(patch_data, 1, patch_length, f); // calculate CRC after unfixed CrcType crc_after_unfix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset + sizeof(CrcType)); *(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix; // fix it for (int i=sizeof(CrcType); i>=1; i--) { CrcType value=0; unsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value); *(CrcType *)(buf + i) ^= value; buf[i - 1] ^= index; } fseek(f, fix_offset, SEEK_SET); fwrite(buf, sizeof(CrcType), 1, f); } #endif // __CRC_H desmume-0.9.11/src/utils/advanscene.h0000755000000000000000000000363212467662066016174 0ustar rootroot/* Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include "../types.h" class EMUFILE; class ADVANsCEne { private: std::string database_path; time_t createTime; u32 crc32; char serial[6]; char version[4]; u8 versionBase[2]; u8 saveType; bool loaded; bool foundAsCrc, foundAsSerial; // XML std::string datName; std::string datVersion; std::string urlVersion; std::string urlDat; bool getXMLConfig(const char *in_filename); public: ADVANsCEne() : saveType(0xFF), crc32(0), loaded(false) { memset(versionBase, 0, sizeof(versionBase)); memset(version, 0, sizeof(version)); memset(serial, 0, sizeof(serial)); } void setDatabase(const char *path); std::string getDatabase() const { return database_path; } u32 convertDB(const char *in_filename, EMUFILE* output); u8 checkDB(const char *ROMserial, u32 crc); u32 getSaveType() { return saveType; } u32 getCRC32() { return crc32; } char *getSerial() { return serial; } bool isLoaded() { return loaded; } const char* getIdMethod() { if(foundAsSerial && foundAsCrc) return "Serial/CRC"; if(foundAsSerial) return "Serial"; if(foundAsCrc) return "CRC"; return ""; } std::string lastImportErrorMessage; }; extern ADVANsCEne advsc; desmume-0.9.11/src/utils/advanscene.cpp0000755000000000000000000001627312467662066016534 0ustar rootroot/* Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #define TIXML_USE_STL #include "tinyxml/tinyxml.h" #include "advanscene.h" #include "../common.h" #include "../mc.h" #include "../emufile.h" ADVANsCEne advsc; #define _ADVANsCEne_BASE_ID "DeSmuME database (ADVANsCEne)\0x1A" #define _ADVANsCEne_BASE_VERSION_MAJOR 1 #define _ADVANsCEne_BASE_VERSION_MINOR 0 #define _ADVANsCEne_BASE_NAME "ADVANsCEne Nintendo DS Collection" u8 ADVANsCEne::checkDB(const char *ROMserial, u32 crc) { loaded = false; FILE *fp = fopen(database_path.c_str(), "rb"); if (fp) { char buf[64]; memset(buf, 0, sizeof(buf)); if (fread(buf, 1, strlen(_ADVANsCEne_BASE_ID), fp) == strlen(_ADVANsCEne_BASE_ID)) { //printf("ID: %s\n", buf); if (strcmp(buf, _ADVANsCEne_BASE_ID) == 0) { if (fread(&versionBase[0], 1, 2, fp) == 2) { //printf("Version base: %i.%i\n", versionBase[0], versionBase[1]); if (fread(&version[0], 1, 4, fp) == 4) { //printf("Version: %c%c%c%c\n", version[3], version[2], version[1], version[0]); if (fread(&createTime, 1, sizeof(time_t), fp) == sizeof(time_t)) { memset(buf, 0,sizeof(buf)); // serial(8) + crc32(4) + save_type(1) = 13 + reserved(8) = 21 while (true) { if (fread(buf, 1, 21, fp) != 21) break; bool serialFound = (memcmp(&buf[4], ROMserial, 4) == 0); u32 dbcrc = LE_TO_LOCAL_32(*(u32*)(buf+8)); bool crcFound = (crc == dbcrc); if(serialFound || crcFound) { foundAsCrc = crcFound; foundAsSerial = serialFound; memcpy(&crc32, &buf[8], 4); memcpy(&serial[0], &buf[4], 4); //printf("%s founded: crc32=%04X, save type %02X\n", ROMserial, crc32, buf[12]); saveType = buf[12]; fclose(fp); loaded = true; return true; } } } } } } } fclose(fp); } return false; } void ADVANsCEne::setDatabase(const char *path) { database_path = path; //i guess this means it needs (re)loading on account of the path having changed loaded = false; } bool ADVANsCEne::getXMLConfig(const char *in_filename) { TiXmlDocument *xml = NULL; TiXmlElement *el = NULL; TiXmlElement *el_configuration = NULL; TiXmlElement *el_newDat = NULL; xml = new TiXmlDocument(); if (!xml) return false; if (!xml->LoadFile(in_filename)) return false; el = xml->FirstChildElement("dat"); if (!el) return false; el_configuration = el->FirstChildElement("configuration"); if (!el_configuration) return false; el = el_configuration->FirstChildElement("datName"); if (el) { datName = el->GetText() ? el->GetText() : ""; } el = el_configuration->FirstChildElement("datVersion"); if (el) { datVersion = el->GetText() ? el->GetText() : ""; } el_newDat = el_configuration->FirstChildElement("newDat"); if (!el_newDat) return false; el = el_newDat->FirstChildElement("datVersionURL"); if (el) { urlVersion = el->GetText() ? el->GetText() : ""; } el = el_newDat->FirstChildElement("datURL"); if (el) { urlDat = el->GetText() ? el->GetText() : ""; } delete xml; return true; } u32 ADVANsCEne::convertDB(const char *in_filename, EMUFILE* output) { //these strings are contained in the xml file, verbatim, so they function as enum values //we leave the strings here rather than pooled elsewhere to remind us that theyre part of the advanscene format. const char *saveTypeNames[] = { "Eeprom - 4 kbit", // EEPROM 4kbit "Eeprom - 64 kbit", // EEPROM 64kbit "Eeprom - 512 kbit", // EEPROM 512kbit "Fram - 256 kbit", // FRAM 256kbit ! "Flash - 2 mbit", // FLASH 2Mbit "Flash - 4 mbit", // FLASH 4Mbit "Flash - 8 mbit", // FLASH 8Mbit "Flash - 16 mbit", // FLASH 16Mbit ! "Flash - 32 mbit", // FLASH 32Mbit ! "Flash - 64 mbit", // FLASH 64Mbit "Flash - 128 mbit", // FLASH 128Mbit ! "Flash - 256 mbit", // FLASH 256Mbit ! "Flash - 512 mbit" // FLASH 512Mbit ! }; TiXmlDocument *xml = NULL; TiXmlElement *el = NULL; TiXmlElement *el_serial = NULL; TiXmlElement *el_games = NULL; TiXmlElement *el_crc32 = NULL; TiXmlElement *el_saveType = NULL; u32 crc32 = 0; u32 reserved = 0; lastImportErrorMessage = ""; printf("Converting DB...\n"); if (getXMLConfig(in_filename)) { if (datName.size()==0) return 0; if (datName != _ADVANsCEne_BASE_NAME) return 0; } // Header output->fwrite(_ADVANsCEne_BASE_ID, strlen(_ADVANsCEne_BASE_ID)); output->fputc(_ADVANsCEne_BASE_VERSION_MAJOR); output->fputc(_ADVANsCEne_BASE_VERSION_MINOR); if (datVersion.size()) output->fwrite(&datVersion[0], datVersion.size()); else output->fputc(0); time_t __time = time(NULL); output->fwrite(&__time, sizeof(time_t)); xml = new TiXmlDocument(); if (!xml) return 0; if (!xml->LoadFile(in_filename)) return 0; el = xml->FirstChildElement("dat"); if (!el) return 0; el_games = el->FirstChildElement("games"); if (!el_games) return 0; el = el_games->FirstChildElement("game"); if (!el) return 0; u32 count = 0; while (el) { TiXmlElement* title = el->FirstChildElement("title"); if(title) { //just a little diagnostic //printf("Importing %s\n",title->GetText()); } else return 0; el_serial = el->FirstChildElement("serial"); if(!el_serial) { lastImportErrorMessage = "Missing element. Did you use the right xml file? We need the RtoolDS one."; return 0; } output->fwrite(el_serial->GetText(), 8); // CRC32 el_crc32 = el->FirstChildElement("files"); sscanf_s(el_crc32->FirstChildElement("romCRC")->GetText(), "%x", &crc32); output->fwrite(&crc32, sizeof(u32)); // Save type el_saveType = el->FirstChildElement("saveType"); u8 selectedSaveType = 0xFF; //unknown if (el_saveType) { const char *tmp = el_saveType->GetText(); if (tmp) { if (strcmp(tmp, "None") == 0) selectedSaveType = 0xFE; else { for (u8 i = 0; i < MAX_SAVE_TYPES; i++) { if (strcmp(saveTypeNames[i], "") == 0) continue; if (strcasecmp(tmp, saveTypeNames[i]) == 0) { selectedSaveType = i; break; } } } } } output->fputc(selectedSaveType); output->fwrite(&reserved, sizeof(u32)); output->fwrite(&reserved, sizeof(u32)); count++; el = el->NextSiblingElement("game"); } printf("\n"); delete xml; if (count > 0) printf("done\n"); else printf("error\n"); printf("ADVANsCEne converter: %i found\n", count); return count; } desmume-0.9.11/src/utils/task.cpp0000755000000000000000000001617312467662066015366 0ustar rootroot/* Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "types.h" #include "task.h" #include #ifdef HOST_WINDOWS #include #else #include #if defined HOST_LINUX #include #elif defined HOST_BSD || defined HOST_DARWIN #include #endif #endif // HOST_WINDOWS // http://stackoverflow.com/questions/150355/programmatically-find-the-number-of-cores-on-a-machine int getOnlineCores (void) { #ifdef HOST_WINDOWS SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return sysinfo.dwNumberOfProcessors; #elif defined HOST_LINUX return sysconf(_SC_NPROCESSORS_ONLN); #elif defined HOST_BSD || defined HOST_DARWIN int cores; int mib[4] = { CTL_HW, HW_NCPU, 0, 0 }; size_t len = sizeof(cores); //don't make this const, i guess sysctl can't take a const * sysctl(mib, 2, &cores, &len, NULL, 0); return (cores < 1) ? 1 : cores; #else return 1; #endif } #ifdef HOST_WINDOWS class Task::Impl { public: Impl(); ~Impl(); bool spinlock; void start(bool spinlock); void shutdown(); //execute some work void execute(const TWork &work, void* param); //wait for the work to complete void* finish(); static DWORD __stdcall s_taskProc(void *ptr); void taskProc(); void init(); //the work function that shall be executed TWork workFunc; void* workFuncParam; HANDLE incomingWork, workDone, hThread; volatile bool bIncomingWork, bWorkDone, bKill; bool bStarted; }; static void* killTask(void* task) { ((Task::Impl*)task)->bKill = true; return 0; } Task::Impl::~Impl() { shutdown(); } Task::Impl::Impl() : workFunc(NULL) , bIncomingWork(false) , bWorkDone(true) , bKill(false) , bStarted(false) , incomingWork(INVALID_HANDLE_VALUE) , workDone(INVALID_HANDLE_VALUE) , hThread(INVALID_HANDLE_VALUE) { } DWORD __stdcall Task::Impl::s_taskProc(void *ptr) { //just past the buck to the instance method ((Task::Impl*)ptr)->taskProc(); return 0; } void Task::Impl::taskProc() { for(;;) { if(bKill) break; //wait for a chunk of work if(spinlock) while(!bIncomingWork) Sleep(0); else WaitForSingleObject(incomingWork,INFINITE); bIncomingWork = false; //execute the work workFuncParam = workFunc(workFuncParam); //signal completion bWorkDone = true; if(!spinlock) SetEvent(workDone); } } void Task::Impl::start(bool spinlock) { bIncomingWork = false; bWorkDone = true; bKill = false; bStarted = true; this->spinlock = spinlock; incomingWork = CreateEvent(NULL,FALSE,FALSE,NULL); workDone = CreateEvent(NULL,FALSE,FALSE,NULL); hThread = CreateThread(NULL,0,Task::Impl::s_taskProc,(void*)this, 0, NULL); } void Task::Impl::shutdown() { if(!bStarted) return; bStarted = false; execute(killTask,this); finish(); CloseHandle(incomingWork); CloseHandle(workDone); CloseHandle(hThread); incomingWork = INVALID_HANDLE_VALUE; workDone = INVALID_HANDLE_VALUE; hThread = INVALID_HANDLE_VALUE; } void Task::Impl::execute(const TWork &work, void* param) { //setup the work this->workFunc = work; this->workFuncParam = param; bWorkDone = false; //signal it to start if(!spinlock) SetEvent(incomingWork); bIncomingWork = true; } void* Task::Impl::finish() { //just wait for the work to be done if(spinlock) { while(!bWorkDone) Sleep(0); } else { while(!bWorkDone) WaitForSingleObject(workDone, INFINITE); } return workFuncParam; } #else class Task::Impl { private: pthread_t _thread; bool _isThreadRunning; public: Impl(); ~Impl(); void start(bool spinlock); void execute(const TWork &work, void *param); void* finish(); void shutdown(); pthread_mutex_t mutex; pthread_cond_t condWork; TWork workFunc; void *workFuncParam; void *ret; bool exitThread; }; static void* taskProc(void *arg) { Task::Impl *ctx = (Task::Impl *)arg; do { pthread_mutex_lock(&ctx->mutex); while (ctx->workFunc == NULL && !ctx->exitThread) { pthread_cond_wait(&ctx->condWork, &ctx->mutex); } if (ctx->workFunc != NULL) { ctx->ret = ctx->workFunc(ctx->workFuncParam); } else { ctx->ret = NULL; } ctx->workFunc = NULL; pthread_cond_signal(&ctx->condWork); pthread_mutex_unlock(&ctx->mutex); } while(!ctx->exitThread); return NULL; } Task::Impl::Impl() { _isThreadRunning = false; workFunc = NULL; workFuncParam = NULL; ret = NULL; exitThread = false; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&condWork, NULL); } Task::Impl::~Impl() { shutdown(); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&condWork); } void Task::Impl::start(bool spinlock) { pthread_mutex_lock(&this->mutex); if (this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return; } this->workFunc = NULL; this->workFuncParam = NULL; this->ret = NULL; this->exitThread = false; pthread_create(&this->_thread, NULL, &taskProc, this); this->_isThreadRunning = true; pthread_mutex_unlock(&this->mutex); } void Task::Impl::execute(const TWork &work, void *param) { pthread_mutex_lock(&this->mutex); if (work == NULL || !this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return; } this->workFunc = work; this->workFuncParam = param; pthread_cond_signal(&this->condWork); pthread_mutex_unlock(&this->mutex); } void* Task::Impl::finish() { void *returnValue = NULL; pthread_mutex_lock(&this->mutex); if (!this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return returnValue; } while (this->workFunc != NULL) { pthread_cond_wait(&this->condWork, &this->mutex); } returnValue = this->ret; pthread_mutex_unlock(&this->mutex); return returnValue; } void Task::Impl::shutdown() { pthread_mutex_lock(&this->mutex); if (!this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return; } this->workFunc = NULL; this->exitThread = true; pthread_cond_signal(&this->condWork); pthread_mutex_unlock(&this->mutex); pthread_join(this->_thread, NULL); pthread_mutex_lock(&this->mutex); this->_isThreadRunning = false; pthread_mutex_unlock(&this->mutex); } #endif void Task::start(bool spinlock) { impl->start(spinlock); } void Task::shutdown() { impl->shutdown(); } Task::Task() : impl(new Task::Impl()) {} Task::~Task() { delete impl; } void Task::execute(const TWork &work, void* param) { impl->execute(work,param); } void* Task::finish() { return impl->finish(); } desmume-0.9.11/src/utils/valuearray.h0000755000000000000000000000205012467662066016231 0ustar rootroot/* Copyright (C) 2008 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _VALUEARRAY_H_ #define _VALUEARRAY_H_ template struct ValueArray { T data[N]; T &operator[](int index) { return data[index]; } static const int size = N; bool operator!=(ValueArray &other) { return !operator==(other); } bool operator==(ValueArray &other) { for(int i=0;i #include #include #include #include #include #ifndef _MSC_VER #include #include #include #else typedef int int32_t; #define MAXPATHLEN 1024 #endif #include namespace DLDI { //#ifndef bool // typedef enum {false = 0, true = !0} bool; //#endif typedef int32_t addr_t; typedef unsigned char data_t; #define FEATURE_MEDIUM_CANREAD 0x00000001 #define FEATURE_MEDIUM_CANWRITE 0x00000002 #define FEATURE_SLOT_GBA 0x00000010 #define FEATURE_SLOT_NDS 0x00000020 #define MAGIC_TOKEN 0xBF8DA5ED #define FIX_ALL 0x01 #define FIX_GLUE 0x02 #define FIX_GOT 0x04 #define FIX_BSS 0x08 #define DLDI_VERSION 1 #define EXIT_NO_DLDI_SECTION 2 enum DldiOffsets { DO_magicString = 0x00, // "\xED\xA5\x8D\xBF Chishm" DO_magicToken = 0x00, // 0xBF8DA5ED DO_magicShortString = 0x04, // " Chishm" DO_version = 0x0C, DO_driverSize = 0x0D, DO_fixSections = 0x0E, DO_allocatedSpace = 0x0F, DO_friendlyName = 0x10, DO_text_start = 0x40, // Data start DO_data_end = 0x44, // Data end DO_glue_start = 0x48, // Interworking glue start -- Needs address fixing DO_glue_end = 0x4C, // Interworking glue end DO_got_start = 0x50, // GOT start -- Needs address fixing DO_got_end = 0x54, // GOT end DO_bss_start = 0x58, // bss start -- Needs setting to zero DO_bss_end = 0x5C, // bss end // IO_INTERFACE data DO_ioType = 0x60, DO_features = 0x64, DO_startup = 0x68, DO_isInserted = 0x6C, DO_readSectors = 0x70, DO_writeSectors = 0x74, DO_clearStatus = 0x78, DO_shutdown = 0x7C, DO_code = 0x80 }; const data_t dldiMagicString[] = "\xED\xA5\x8D\xBF Chishm"; const char dldiFileExtension[] = ".dldi"; void printUsage (char* programName) { printf ("Usage:\n"); printf ("%s \n", programName); printf (" the dldi patch file to apply\n"); printf (" the application binary to apply the patch to\n"); return; } addr_t readAddr (data_t *mem, addr_t offset) { return (addr_t)( (mem[offset + 0] << 0) | (mem[offset + 1] << 8) | (mem[offset + 2] << 16) | (mem[offset + 3] << 24) ); } void writeAddr (data_t *mem, addr_t offset, addr_t value) { mem[offset + 0] = (data_t)(value >> 0); mem[offset + 1] = (data_t)(value >> 8); mem[offset + 2] = (data_t)(value >> 16); mem[offset + 3] = (data_t)(value >> 24); } int stringCaseInsensitiveCompare (const char *str1, const char *str2) { while (tolower(*str1) == tolower(*str2)) { if (*str1 == '\0') { return 0; } str1++; str2++; } return (tolower(*str1) - tolower(*str2)); } bool stringEndsWith (const char *str, const char *end) { const char* strEnd; if (strlen (str) < strlen(end)) { return false; } strEnd = &str[strlen (str) - strlen(end)]; return (stringCaseInsensitiveCompare (strEnd, end) == 0); } bool stringStartsWith (const char *str, const char *start) { return (strstr (str, start) == str); } addr_t quickFind (const data_t* data, const data_t* search, size_t dataLen, size_t searchLen) { const int32_t* dataChunk = (const int32_t*) data; int searchChunk = ((const int32_t*)search)[0]; addr_t i; addr_t dataChunkEnd = (addr_t)(dataLen / sizeof(int32_t)); for ( i = 0; i < dataChunkEnd; i++) { if (dataChunk[i] == searchChunk) { if ((i*sizeof(int32_t) + searchLen) > dataLen) { return -1; } if (memcmp (&data[i*sizeof(int32_t)], search, searchLen) == 0) { return i*sizeof(int32_t); } } } return -1; } FILE *openDLDIFile(const char *argv0, char *dldiFileName ) { FILE *dldiFile; char *dldiPATH; char appPath[MAXPATHLEN]; char appName[MAXPATHLEN]; char appPathName[MAXPATHLEN]; char *ptr, *lastSlash; struct stat buf; // add .dldi extension to filename if (!stringEndsWith (dldiFileName, dldiFileExtension)) { strcat (dldiFileName, dldiFileExtension); } printf ("Trying \"%s\"\n", dldiFileName); // try opening from current directory dldiFile = fopen(dldiFileName,"rb"); if ( NULL != dldiFile ) return dldiFile; // check if the filename has a path component // check both slash varieties, win32 understands both // if we have a directory separator don't bother with search paths if ( NULL != strstr(dldiFileName,"\\") ) return NULL; if ( NULL != strstr(dldiFileName,"/") ) return NULL; // check for DLDIPATH in environment dldiPATH = getenv("DLDIPATH"); if ( NULL != dldiPATH ) { strcpy(appPath,dldiPATH); if ( appPath[strlen(appPath)] != '\\' && appPath[strlen(appPath)] != '/' ) strcat(appPath,"/"); strcat ( appPath, dldiFileName ); printf ("Trying \"%s\"\n", appPath); dldiFile = fopen(appPath,"rb"); if ( NULL != dldiFile ) return dldiFile; } lastSlash = NULL; ptr = (char *)argv0; while ( *(ptr++) != 0 ) { if ( *ptr == '\\' || * ptr == '/' ) lastSlash = ptr; } if ( NULL != lastSlash ) { *(lastSlash++) = '\0'; strcpy(appPath, argv0); strcpy(appName, lastSlash); strcat(appPath, "/"); } else { strcpy(appPath, ""); strcpy(appName, argv0); } // finally try in the application path // if argv0 contains a directory separator we have a path component if ( NULL == strstr(appPath,"\\") && NULL == strstr(appPath,"/") ) { // no path in argv0 so search system path char *sysPATH = getenv("PATH"); char *nextPATH; char *thisPATH = sysPATH; printf("Searching system path\n%s\n",sysPATH); while(1) { nextPATH = strstr(thisPATH, ":" ); // find next PATH separator if ( NULL != nextPATH ) *(nextPATH++) = '\0'; // terminate string, point to next component strcpy(appPath,thisPATH); strcat(appPath,"/"); strcpy(appPathName,appPath); strcat(appPathName,appName); // add application name if ( stat(appPathName,&buf) == 0 ) // if it exists we found the path break; thisPATH = nextPATH; strcpy(appPath,""); // empty path if ( thisPATH == NULL) break; } } strcat(appPath,"dldi/"); // add dldi folder strcat(appPath,dldiFileName); // add dldi filename to path printf ("Trying \"%s\"\n", appPath); return fopen(appPath,"rb"); // no more places to check, just return this handle } //int main(int argc, char* argv[]) //{ // // char *dldiFileName = NULL; // char *appFileName = NULL; // // addr_t memOffset; // Offset of DLDI after the file is loaded into memory // addr_t patchOffset; // Position of patch destination in the file // addr_t relocationOffset; // Value added to all offsets within the patch to fix it properly // addr_t ddmemOffset; // Original offset used in the DLDI file // addr_t ddmemStart; // Start of range that offsets can be in the DLDI file // addr_t ddmemEnd; // End of range that offsets can be in the DLDI file // addr_t ddmemSize; // Size of range that offsets can be in the DLDI file // // addr_t addrIter; // // FILE* dldiFile; // FILE* appFile; // // data_t *pDH; // data_t *pAH; // // data_t *appFileData = NULL; // size_t appFileSize = 0; // data_t *dldiFileData = NULL; // size_t dldiFileSize = 0; // // int i; // // printf ("Dynamically Linked Disk Interface patch tool " VERSION " by Michael Chisholm (Chishm)\n\n"); // // for (i = 1; i < argc; i++) { // if (dldiFileName == NULL) { // dldiFileName = (char*) malloc (strlen (argv[i]) + 1 + sizeof(dldiFileExtension)); // if (!dldiFileName) { // return EXIT_FAILURE; // } // strcpy (dldiFileName, argv[i]); // } else if (appFileName == NULL) { // appFileName = (char*) malloc (strlen (argv[i]) + 1); // if (!appFileName) { // return EXIT_FAILURE; // } // strcpy (appFileName, argv[i]); // } else { // printUsage (argv[0]); // return EXIT_FAILURE; // } // } // // if ((dldiFileName == NULL) || (appFileName == NULL)) { // printUsage (argv[0]); // return EXIT_FAILURE; // } // // if (!(dldiFile = openDLDIFile(argv[0],dldiFileName))) { // printf ("Cannot open \"%s\" - %s\n", dldiFileName, strerror(errno)); // return EXIT_FAILURE; // } // // if (!(appFile = fopen (appFileName, "rb+"))) { // printf ("Cannot open \"%s\" - %s\n", appFileName, strerror(errno)); // return EXIT_FAILURE; // } // // // Load the app file and the DLDI patch file // fseek (appFile, 0, SEEK_END); // appFileSize = ftell(appFile); // appFileData = (data_t*) malloc (appFileSize); // fseek (appFile, 0, SEEK_SET); // // fseek (dldiFile, 0, SEEK_END); // dldiFileSize = ftell(dldiFile); // dldiFileData = (data_t*) malloc (dldiFileSize); // fseek (dldiFile, 0, SEEK_SET); // // if (!appFileData || !dldiFileData) { // fclose (appFile); // fclose (dldiFile); // if (appFileData) free (appFileData); // if (dldiFileData) free (dldiFileData); // printf ("Out of memory\n"); // return EXIT_FAILURE; // } // // fread (appFileData, 1, appFileSize, appFile); // fread (dldiFileData, 1, dldiFileSize, dldiFile); // fclose (dldiFile); // // // Find the DSDI reserved space in the file // patchOffset = quickFind (appFileData, dldiMagicString, appFileSize, sizeof(dldiMagicString)/sizeof(char)); // // if (patchOffset < 0) { // printf ("%s does not have a DLDI section\n", appFileName); // return EXIT_NO_DLDI_SECTION; // } // // pDH = dldiFileData; // pAH = &appFileData[patchOffset]; // // // Make sure the DLDI file is valid and usable // if (strcmp ((char*)dldiMagicString, (char*)&pDH[DO_magicString]) != 0) { // printf ("Invalid DLDI file\n"); // return EXIT_FAILURE; // } // if (pDH[DO_version] != DLDI_VERSION) { // printf ("Incorrect DLDI file version. Expected %d, found %d.\n", DLDI_VERSION, pDH[DO_version]); // return EXIT_FAILURE; // } // if (pDH[DO_driverSize] > pAH[DO_allocatedSpace]) { // printf ("Not enough space for patch. Available %d bytes, need %d bytes\n", ( 1 << pAH[DO_allocatedSpace]), ( 1 << pDH[DO_driverSize]) ); // return EXIT_FAILURE; // } // // memOffset = readAddr (pAH, DO_text_start); // if (memOffset == 0) { // memOffset = readAddr (pAH, DO_startup) - DO_code; // } // ddmemOffset = readAddr (pDH, DO_text_start); // relocationOffset = memOffset - ddmemOffset; // // printf ("Old driver: %s\n", &pAH[DO_friendlyName]); // printf ("New driver: %s\n", &pDH[DO_friendlyName]); // printf ("\n"); // printf ("Position in file: 0x%08X\n", patchOffset); // printf ("Position in memory: 0x%08X\n", memOffset); // printf ("Patch base address: 0x%08X\n", ddmemOffset); // printf ("Relocation offset: 0x%08X\n", relocationOffset); // printf ("\n"); // // ddmemStart = readAddr (pDH, DO_text_start); // ddmemSize = (1 << pDH[DO_driverSize]); // ddmemEnd = ddmemStart + ddmemSize; // // // Remember how much space is actually reserved // pDH[DO_allocatedSpace] = pAH[DO_allocatedSpace]; // // Copy the DLDI patch into the application // memcpy (pAH, pDH, dldiFileSize); // // // Fix the section pointers in the header // writeAddr (pAH, DO_text_start, readAddr (pAH, DO_text_start) + relocationOffset); // writeAddr (pAH, DO_data_end, readAddr (pAH, DO_data_end) + relocationOffset); // writeAddr (pAH, DO_glue_start, readAddr (pAH, DO_glue_start) + relocationOffset); // writeAddr (pAH, DO_glue_end, readAddr (pAH, DO_glue_end) + relocationOffset); // writeAddr (pAH, DO_got_start, readAddr (pAH, DO_got_start) + relocationOffset); // writeAddr (pAH, DO_got_end, readAddr (pAH, DO_got_end) + relocationOffset); // writeAddr (pAH, DO_bss_start, readAddr (pAH, DO_bss_start) + relocationOffset); // writeAddr (pAH, DO_bss_end, readAddr (pAH, DO_bss_end) + relocationOffset); // // Fix the function pointers in the header // writeAddr (pAH, DO_startup, readAddr (pAH, DO_startup) + relocationOffset); // writeAddr (pAH, DO_isInserted, readAddr (pAH, DO_isInserted) + relocationOffset); // writeAddr (pAH, DO_readSectors, readAddr (pAH, DO_readSectors) + relocationOffset); // writeAddr (pAH, DO_writeSectors, readAddr (pAH, DO_writeSectors) + relocationOffset); // writeAddr (pAH, DO_clearStatus, readAddr (pAH, DO_clearStatus) + relocationOffset); // writeAddr (pAH, DO_shutdown, readAddr (pAH, DO_shutdown) + relocationOffset); // // if (pDH[DO_fixSections] & FIX_ALL) { // // Search through and fix pointers within the data section of the file // for (addrIter = (readAddr(pDH, DO_text_start) - ddmemStart); addrIter < (readAddr(pDH, DO_data_end) - ddmemStart); addrIter++) { // if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { // writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); // } // } // } // // if (pDH[DO_fixSections] & FIX_GLUE) { // // Search through and fix pointers within the glue section of the file // for (addrIter = (readAddr(pDH, DO_glue_start) - ddmemStart); addrIter < (readAddr(pDH, DO_glue_end) - ddmemStart); addrIter++) { // if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { // writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); // } // } // } // // if (pDH[DO_fixSections] & FIX_GOT) { // // Search through and fix pointers within the Global Offset Table section of the file // for (addrIter = (readAddr(pDH, DO_got_start) - ddmemStart); addrIter < (readAddr(pDH, DO_got_end) - ddmemStart); addrIter++) { // if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { // writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); // } // } // } // // if (pDH[DO_fixSections] & FIX_BSS) { // // Initialise the BSS to 0 // memset (&pAH[readAddr(pDH, DO_bss_start) - ddmemStart] , 0, readAddr(pDH, DO_bss_end) - readAddr(pDH, DO_bss_start)); // } // // // Write the patch back to the file // fseek (appFile, patchOffset, SEEK_SET); // fwrite (pAH, 1, ddmemSize, appFile); // fclose (appFile); // // free (appFileData); // free (dldiFileData); // // printf ("Patched successfully\n"); // // return EXIT_SUCCESS; //} // Source File: mpcf.dldi // Time: 6/14/2010 9:38 PM // Orig. Offset: 0 / 0x00000000 // Length: 1876 / 0x00000754 (bytes) data_t mpcf_dldi[1876] = { 0xED, 0xA5, 0x8D, 0xBF, 0x20, 0x43, 0x68, 0x69, 0x73, 0x68, 0x6D, 0x00, 0x01, 0x0B, 0x0C, 0x00, 0x47, 0x42, 0x41, 0x20, 0x4D, 0x6F, 0x76, 0x69, 0x65, 0x20, 0x50, 0x6C, 0x61, 0x79, 0x65, 0x72, 0x20, 0x28, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x46, 0x6C, 0x61, 0x73, 0x68, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xBF, 0x54, 0x07, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x50, 0x07, 0x80, 0xBF, 0x50, 0x07, 0x80, 0xBF, 0x54, 0x07, 0x80, 0xBF, 0x70, 0x07, 0x80, 0xBF, 0x4D, 0x50, 0x43, 0x46, 0x13, 0x00, 0x00, 0x00, 0x3C, 0x01, 0x80, 0xBF, 0x98, 0x01, 0x80, 0xBF, 0x78, 0x02, 0x80, 0xBF, 0xC8, 0x04, 0x80, 0xBF, 0xC8, 0x01, 0x80, 0xBF, 0x10, 0x07, 0x80, 0xBF, 0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x10, 0x40, 0x2D, 0xE9, 0x2C, 0x40, 0x9F, 0xE5, 0x00, 0x30, 0xD4, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x24, 0x20, 0x9F, 0xE5, 0x05, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x52, 0xE3, 0x1C, 0x00, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x12, 0xFF, 0x2F, 0x11, 0x01, 0x30, 0xA0, 0xE3, 0x00, 0x30, 0xC4, 0xE5, 0x10, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x54, 0x07, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x48, 0x07, 0x80, 0xBF, 0x04, 0xE0, 0x2D, 0xE5, 0x40, 0x30, 0x9F, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x04, 0xD0, 0x4D, 0xE2, 0x38, 0x00, 0x9F, 0xE5, 0x38, 0x10, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x30, 0x00, 0x9F, 0xE5, 0x00, 0x30, 0x90, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x28, 0x30, 0x9F, 0xE5, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x53, 0xE3, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x04, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x48, 0x07, 0x80, 0xBF, 0x58, 0x07, 0x80, 0xBF, 0x4C, 0x07, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x09, 0x14, 0xA0, 0xE3, 0x06, 0x18, 0x81, 0xE2, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x30, 0xE0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0xB0, 0x30, 0xC1, 0xE1, 0xB0, 0x20, 0xD1, 0xE1, 0x04, 0xE0, 0x2D, 0xE5, 0xAA, 0xCC, 0xA0, 0xE3, 0x55, 0xEC, 0xE0, 0xE3, 0x03, 0x00, 0x52, 0xE1, 0xAA, 0xE0, 0x4E, 0xE2, 0x55, 0xC0, 0x8C, 0xE2, 0x00, 0x00, 0xA0, 0xE3, 0x03, 0x00, 0x00, 0x1A, 0xB0, 0xE0, 0xC1, 0xE1, 0xB0, 0x30, 0xD1, 0xE1, 0x0C, 0x00, 0x53, 0xE0, 0x01, 0x00, 0xA0, 0x13, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x26, 0x35, 0xA0, 0xE3, 0x03, 0x37, 0x83, 0xE2, 0x50, 0x20, 0xA0, 0xE3, 0xB0, 0x20, 0xC3, 0xE1, 0xB0, 0x00, 0xD3, 0xE1, 0x00, 0x08, 0xA0, 0xE1, 0x20, 0x08, 0xA0, 0xE1, 0xFF, 0x00, 0x00, 0xE2, 0x50, 0x00, 0x50, 0xE3, 0x00, 0x00, 0xA0, 0x13, 0x01, 0x00, 0xA0, 0x03, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x80, 0x00, 0x12, 0xE3, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x50, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, 0x80, 0x00, 0x12, 0xE3, 0x01, 0x00, 0x80, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, 0x26, 0x15, 0xA0, 0xE3, 0x03, 0x17, 0x81, 0xE2, 0xB0, 0x30, 0xD1, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x01, 0x00, 0xA0, 0x13, 0x1E, 0xFF, 0x2F, 0x11, 0x26, 0x27, 0xA0, 0xE3, 0x96, 0x2C, 0x82, 0xE2, 0x03, 0x00, 0xA0, 0xE1, 0x80, 0x20, 0x82, 0xE2, 0x01, 0x00, 0x00, 0xEA, 0x02, 0x00, 0x50, 0xE1, 0x0A, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD1, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x01, 0x00, 0x80, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x50, 0xE1, 0x00, 0x00, 0xA0, 0xC3, 0x01, 0x00, 0xA0, 0xD3, 0x1E, 0xFF, 0x2F, 0xE1, 0x03, 0x00, 0xA0, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x4B, 0x2D, 0xE9, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0xC0, 0xD3, 0xE1, 0x80, 0x00, 0x1C, 0xE3, 0x10, 0xD0, 0x4D, 0xE2, 0x01, 0x90, 0xA0, 0xE1, 0x02, 0xE0, 0xA0, 0xE1, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0xC0, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x5C, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, 0x80, 0x00, 0x12, 0xE3, 0x01, 0xC0, 0x8C, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, 0x26, 0xC5, 0xA0, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x26, 0x17, 0xA0, 0x03, 0x96, 0x1C, 0x81, 0x02, 0x03, 0x20, 0xA0, 0x01, 0x80, 0x10, 0x81, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x67, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x00, 0x13, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x5E, 0x00, 0x00, 0xCA, 0xFF, 0x00, 0x59, 0xE3, 0x00, 0x30, 0xA0, 0x83, 0x0C, 0x30, 0x8D, 0x85, 0x5E, 0x00, 0x00, 0x9A, 0x00, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x09, 0x54, 0xA0, 0xE3, 0x04, 0x30, 0x8D, 0xE5, 0x0C, 0x30, 0x9D, 0xE5, 0x20, 0x4C, 0xA0, 0xE1, 0x0E, 0xB0, 0xA0, 0xE1, 0x05, 0x60, 0xA0, 0xE1, 0x20, 0x74, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, 0x20, 0x18, 0xA0, 0xE1, 0x05, 0xC0, 0xA0, 0xE1, 0x05, 0x00, 0xA0, 0xE1, 0x05, 0xE0, 0xA0, 0xE1, 0x01, 0x57, 0x85, 0xE2, 0xB0, 0x30, 0xC5, 0xE1, 0x04, 0x30, 0x9D, 0xE5, 0x0F, 0x40, 0x04, 0xE2, 0x06, 0x68, 0x86, 0xE2, 0xB0, 0x30, 0xC6, 0xE1, 0xFF, 0x70, 0x07, 0xE2, 0x02, 0x27, 0x82, 0xE2, 0xFF, 0x10, 0x01, 0xE2, 0x0A, 0x08, 0x80, 0xE2, 0xE0, 0x40, 0x84, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0x0E, 0xE8, 0x8E, 0xE2, 0x20, 0x30, 0xA0, 0xE3, 0xB0, 0x70, 0xC2, 0xE1, 0xB0, 0x10, 0xC0, 0xE1, 0xB0, 0x40, 0xCC, 0xE1, 0xB0, 0x30, 0xCE, 0xE1, 0x0B, 0x80, 0xA0, 0xE1, 0x01, 0x90, 0x59, 0xE2, 0x3E, 0x00, 0x00, 0x3A, 0x26, 0x25, 0xA0, 0xE3, 0x03, 0x27, 0x82, 0xE2, 0xB0, 0x30, 0xD2, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x26, 0x17, 0xA0, 0x13, 0x96, 0x1C, 0x81, 0x12, 0x02, 0x00, 0xA0, 0x11, 0x80, 0x10, 0x81, 0x12, 0x00, 0x20, 0xA0, 0x13, 0x02, 0x00, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x26, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x1A, 0x00, 0x00, 0xCA, 0x01, 0x00, 0x18, 0xE3, 0x0B, 0x10, 0xA0, 0x01, 0xFF, 0x20, 0xA0, 0x03, 0x09, 0x04, 0xA0, 0x03, 0x0E, 0x00, 0x00, 0x0A, 0x08, 0x10, 0xA0, 0xE1, 0xFF, 0x00, 0xA0, 0xE3, 0x09, 0xC4, 0xA0, 0xE3, 0xB0, 0x30, 0xDC, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0x01, 0x00, 0x40, 0xE2, 0x43, 0x24, 0xA0, 0xE1, 0x01, 0x00, 0x70, 0xE3, 0x01, 0x20, 0xC1, 0xE5, 0x00, 0x30, 0xC1, 0xE5, 0x02, 0x10, 0x81, 0xE2, 0xF5, 0xFF, 0xFF, 0x1A, 0x02, 0x8C, 0x88, 0xE2, 0xCD, 0xFF, 0xFF, 0xEA, 0x01, 0x20, 0x42, 0xE2, 0xB0, 0x30, 0xD0, 0xE1, 0x01, 0x00, 0x72, 0xE3, 0xB2, 0x30, 0xC1, 0xE0, 0xFA, 0xFF, 0xFF, 0x1A, 0x02, 0xBC, 0x8B, 0xE2, 0xC6, 0xFF, 0xFF, 0xEA, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0xD0, 0x8D, 0xE2, 0xF0, 0x4B, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0x0C, 0x30, 0x8D, 0xE5, 0x9C, 0xFF, 0xFF, 0xEA, 0x01, 0x00, 0xA0, 0xE3, 0xF6, 0xFF, 0xFF, 0xEA, 0xF0, 0x4B, 0x2D, 0xE9, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0xC0, 0xD3, 0xE1, 0x80, 0x00, 0x1C, 0xE3, 0x10, 0xD0, 0x4D, 0xE2, 0x01, 0x90, 0xA0, 0xE1, 0x02, 0xE0, 0xA0, 0xE1, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0xC0, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x5C, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, 0x80, 0x00, 0x12, 0xE3, 0x01, 0xC0, 0x8C, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, 0x26, 0xC5, 0xA0, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x26, 0x17, 0xA0, 0x03, 0x96, 0x1C, 0x81, 0x02, 0x03, 0x20, 0xA0, 0x01, 0x80, 0x10, 0x81, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x65, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x00, 0x13, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x5C, 0x00, 0x00, 0xCA, 0xFF, 0x00, 0x59, 0xE3, 0x00, 0x30, 0xA0, 0x83, 0x0C, 0x30, 0x8D, 0x85, 0x5C, 0x00, 0x00, 0x9A, 0x00, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x09, 0x54, 0xA0, 0xE3, 0x04, 0x30, 0x8D, 0xE5, 0x0C, 0x30, 0x9D, 0xE5, 0x20, 0x4C, 0xA0, 0xE1, 0x0E, 0xB0, 0xA0, 0xE1, 0x05, 0x60, 0xA0, 0xE1, 0x20, 0x74, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, 0x20, 0x18, 0xA0, 0xE1, 0x05, 0xC0, 0xA0, 0xE1, 0x05, 0x00, 0xA0, 0xE1, 0x05, 0xE0, 0xA0, 0xE1, 0x01, 0x57, 0x85, 0xE2, 0xB0, 0x30, 0xC5, 0xE1, 0x04, 0x30, 0x9D, 0xE5, 0x0F, 0x40, 0x04, 0xE2, 0x06, 0x68, 0x86, 0xE2, 0xB0, 0x30, 0xC6, 0xE1, 0xFF, 0x70, 0x07, 0xE2, 0x02, 0x27, 0x82, 0xE2, 0xFF, 0x10, 0x01, 0xE2, 0x0A, 0x08, 0x80, 0xE2, 0xE0, 0x40, 0x84, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0x0E, 0xE8, 0x8E, 0xE2, 0x30, 0x30, 0xA0, 0xE3, 0xB0, 0x70, 0xC2, 0xE1, 0xB0, 0x10, 0xC0, 0xE1, 0xB0, 0x40, 0xCC, 0xE1, 0xB0, 0x30, 0xCE, 0xE1, 0x0B, 0x80, 0xA0, 0xE1, 0x01, 0x90, 0x59, 0xE2, 0x3C, 0x00, 0x00, 0x3A, 0x26, 0x25, 0xA0, 0xE3, 0x03, 0x27, 0x82, 0xE2, 0xB0, 0x30, 0xD2, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x26, 0x17, 0xA0, 0x13, 0x96, 0x1C, 0x81, 0x12, 0x02, 0x00, 0xA0, 0x11, 0x80, 0x10, 0x81, 0x12, 0x00, 0x20, 0xA0, 0x13, 0x02, 0x00, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x24, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x18, 0x00, 0x00, 0xCA, 0x01, 0x00, 0x18, 0xE3, 0x0B, 0x10, 0xA0, 0x01, 0xFF, 0x20, 0xA0, 0x03, 0x09, 0x04, 0xA0, 0x03, 0x0C, 0x00, 0x00, 0x0A, 0x08, 0x10, 0xA0, 0xE1, 0xFF, 0x00, 0xA0, 0xE3, 0x09, 0xC4, 0xA0, 0xE3, 0x00, 0x30, 0xD1, 0xE5, 0x01, 0x20, 0xD1, 0xE5, 0x01, 0x00, 0x40, 0xE2, 0x02, 0x34, 0x83, 0xE1, 0x01, 0x00, 0x70, 0xE3, 0xB0, 0x30, 0xCC, 0xE1, 0x02, 0x10, 0x81, 0xE2, 0xF7, 0xFF, 0xFF, 0x1A, 0x02, 0x8C, 0x88, 0xE2, 0xCF, 0xFF, 0xFF, 0xEA, 0x01, 0x20, 0x42, 0xE2, 0xB2, 0x30, 0xD1, 0xE0, 0x01, 0x00, 0x72, 0xE3, 0xB0, 0x30, 0xC0, 0xE1, 0xFA, 0xFF, 0xFF, 0x1A, 0x02, 0xBC, 0x8B, 0xE2, 0xC8, 0xFF, 0xFF, 0xEA, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0xD0, 0x8D, 0xE2, 0xF0, 0x4B, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0x0C, 0x30, 0x8D, 0xE5, 0x9E, 0xFF, 0xFF, 0xEA, 0x01, 0x00, 0xA0, 0xE3, 0xF6, 0xFF, 0xFF, 0xEA, 0x04, 0xE0, 0x2D, 0xE5, 0x04, 0xD0, 0x4D, 0xE2, 0xAA, 0xFE, 0xFF, 0xEB, 0x04, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xDC, 0x00, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //unsigned char mpcf_dldi[1876] data_t r4_dldi[2276] = { 0xED, 0xA5, 0x8D, 0xBF, 0x20, 0x43, 0x68, 0x69, 0x73, 0x68, 0x6D, 0x00, 0x01, 0x0D, 0x0E, 0x00, 0x52, 0x34, 0x28, 0x44, 0x53, 0x29, 0x20, 0x2D, 0x20, 0x52, 0x65, 0x76, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x44, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xBF, 0xE4, 0x08, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0xB8, 0x00, 0x80, 0xBF, 0xE0, 0x08, 0x80, 0xBF, 0xE0, 0x08, 0x80, 0xBF, 0xE4, 0x08, 0x80, 0xBF, 0x00, 0x09, 0x80, 0xBF, 0x52, 0x34, 0x54, 0x46, 0x23, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x80, 0xBF, 0xD0, 0x03, 0x80, 0xBF, 0xD8, 0x04, 0x80, 0xBF, 0x24, 0x03, 0x80, 0xBF, 0x5C, 0x01, 0x80, 0xBF, 0x64, 0x01, 0x80, 0xBF, 0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x29, 0x05, 0x80, 0xBF, 0x00, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x4D, 0x05, 0x80, 0xBF, 0x78, 0x47, 0xC0, 0x46, 0xD6, 0x01, 0x00, 0xEA, 0x10, 0x40, 0x2D, 0xE9, 0x2C, 0x40, 0x9F, 0xE5, 0x00, 0x30, 0xD4, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x24, 0x20, 0x9F, 0xE5, 0x05, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x52, 0xE3, 0x1C, 0x00, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x12, 0xFF, 0x2F, 0x11, 0x01, 0x30, 0xA0, 0xE3, 0x00, 0x30, 0xC4, 0xE5, 0x10, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xE4, 0x08, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x08, 0x80, 0xBF, 0x04, 0xE0, 0x2D, 0xE5, 0x40, 0x30, 0x9F, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x04, 0xD0, 0x4D, 0xE2, 0x38, 0x00, 0x9F, 0xE5, 0x38, 0x10, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x30, 0x00, 0x9F, 0xE5, 0x00, 0x30, 0x90, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x28, 0x30, 0x9F, 0xE5, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x53, 0xE3, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x04, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x08, 0x80, 0xBF, 0xE8, 0x08, 0x80, 0xBF, 0xDC, 0x08, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1, 0x01, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1, 0x70, 0x40, 0x2D, 0xE9, 0x00, 0x50, 0xA0, 0xE1, 0x03, 0x00, 0xA0, 0xE1, 0x02, 0x40, 0xA0, 0xE1, 0x01, 0x60, 0xA0, 0xE1, 0xC4, 0xFF, 0xFF, 0xEB, 0x01, 0x33, 0xA0, 0xE3, 0xA4, 0x51, 0x83, 0xE5, 0x04, 0xE1, 0x86, 0xE0, 0x03, 0xC0, 0xA0, 0xE1, 0x41, 0x46, 0xA0, 0xE3, 0xA4, 0x31, 0x9C, 0xE5, 0x02, 0x05, 0x13, 0xE3, 0x09, 0x00, 0x00, 0x0A, 0x10, 0x30, 0x94, 0xE5, 0x0E, 0x00, 0x56, 0xE1, 0x23, 0x0C, 0xA0, 0xE1, 0x23, 0x24, 0xA0, 0xE1, 0x23, 0x18, 0xA0, 0xE1, 0x01, 0x20, 0xC6, 0x35, 0x02, 0x10, 0xC6, 0x35, 0x03, 0x00, 0xC6, 0x35, 0x00, 0x30, 0xC6, 0x35, 0x04, 0x60, 0x86, 0xE2, 0xA4, 0x31, 0x9C, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0xEF, 0xFF, 0xFF, 0xBA, 0x70, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x41, 0x2D, 0xE9, 0x00, 0x80, 0xA0, 0xE1, 0x01, 0x70, 0xA0, 0xE1, 0x00, 0x50, 0xA0, 0xE3, 0x01, 0x43, 0xA0, 0xE3, 0x41, 0x66, 0xA0, 0xE3, 0x07, 0x00, 0xA0, 0xE1, 0xA5, 0xFF, 0xFF, 0xEB, 0xA4, 0x81, 0x84, 0xE5, 0xA4, 0x31, 0x94, 0xE5, 0x02, 0x05, 0x13, 0xE3, 0x02, 0x00, 0x00, 0x0A, 0x10, 0x30, 0x96, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x01, 0x50, 0xA0, 0x03, 0xA4, 0x31, 0x94, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0xF6, 0xFF, 0xFF, 0xBA, 0x00, 0x00, 0x55, 0xE3, 0xF1, 0xFF, 0xFF, 0x0A, 0xF0, 0x41, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x40, 0x2D, 0xE9, 0x0C, 0xD0, 0x4D, 0xE2, 0x00, 0xC0, 0xA0, 0xE1, 0x20, 0xEC, 0xA0, 0xE1, 0x00, 0x40, 0xA0, 0xE3, 0x20, 0x58, 0xA0, 0xE1, 0x20, 0x64, 0xA0, 0xE1, 0x44, 0x30, 0xE0, 0xE3, 0x0D, 0x00, 0xA0, 0xE1, 0x07, 0x30, 0xCD, 0xE5, 0x06, 0xE0, 0xCD, 0xE5, 0x05, 0x50, 0xCD, 0xE5, 0x04, 0x60, 0xCD, 0xE5, 0x02, 0x50, 0xA0, 0xE1, 0x03, 0xC0, 0xCD, 0xE5, 0x01, 0x60, 0xA0, 0xE1, 0x02, 0x40, 0xCD, 0xE5, 0x01, 0x40, 0xCD, 0xE5, 0x00, 0x40, 0xCD, 0xE5, 0x83, 0xFF, 0xFF, 0xEB, 0xE1, 0x34, 0xA0, 0xE3, 0x16, 0x37, 0x83, 0xE2, 0x01, 0x23, 0xA0, 0xE3, 0x06, 0x3A, 0x83, 0xE2, 0xA4, 0x31, 0x82, 0xE5, 0x05, 0xE1, 0x86, 0xE0, 0x0D, 0x70, 0xA0, 0xE1, 0x02, 0xC0, 0xA0, 0xE1, 0x41, 0x56, 0xA0, 0xE3, 0xA4, 0x31, 0x9C, 0xE5, 0x02, 0x05, 0x13, 0xE3, 0x0D, 0x00, 0x00, 0x0A, 0x0E, 0x00, 0x56, 0xE1, 0x09, 0x00, 0x00, 0x2A, 0x03, 0x00, 0x16, 0xE3, 0x03, 0x30, 0xD6, 0x15, 0x00, 0x20, 0xD6, 0x15, 0x01, 0x10, 0xD6, 0x15, 0x02, 0x00, 0xD6, 0x15, 0x03, 0x3C, 0xA0, 0x11, 0x01, 0x24, 0x82, 0x11, 0x00, 0x38, 0x83, 0x11, 0x00, 0x40, 0x96, 0x05, 0x03, 0x40, 0x82, 0x11, 0x10, 0x40, 0x85, 0xE5, 0x04, 0x60, 0x86, 0xE2, 0xA4, 0x31, 0x9C, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0xEB, 0xFF, 0xFF, 0xBA, 0xA7, 0x04, 0xA0, 0xE3, 0x16, 0x07, 0x80, 0xE2, 0x43, 0x30, 0xE0, 0xE3, 0x06, 0x0A, 0x80, 0xE2, 0x0D, 0x10, 0xA0, 0xE1, 0x07, 0x30, 0xCD, 0xE5, 0xB1, 0xFF, 0xFF, 0xEB, 0x0C, 0xD0, 0x8D, 0xE2, 0xF0, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x40, 0x2D, 0xE9, 0x00, 0x70, 0x51, 0xE2, 0x04, 0xD0, 0x4D, 0xE2, 0x00, 0x50, 0xA0, 0xE1, 0x0A, 0x00, 0x00, 0x0A, 0x02, 0x40, 0xA0, 0xE1, 0x00, 0x60, 0xA0, 0xE3, 0x85, 0x04, 0xA0, 0xE1, 0x04, 0x10, 0xA0, 0xE1, 0x01, 0x60, 0x86, 0xE2, 0x80, 0x20, 0xA0, 0xE3, 0xB8, 0xFF, 0xFF, 0xEB, 0x06, 0x00, 0x57, 0xE1, 0x01, 0x50, 0x85, 0xE2, 0x02, 0x4C, 0x84, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, 0x01, 0x00, 0xA0, 0xE3, 0x04, 0xD0, 0x8D, 0xE2, 0xF0, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x04, 0xE0, 0x2D, 0xE5, 0xA7, 0x04, 0xA0, 0xE3, 0x14, 0xD0, 0x4D, 0xE2, 0x16, 0x07, 0x80, 0xE2, 0x00, 0xC0, 0xA0, 0xE3, 0x4F, 0xE0, 0xE0, 0xE3, 0x06, 0x0A, 0x80, 0xE2, 0x0C, 0x10, 0x8D, 0xE2, 0x01, 0x20, 0xA0, 0xE3, 0x04, 0x30, 0x8D, 0xE2, 0x0B, 0xE0, 0xCD, 0xE5, 0x04, 0xC0, 0xCD, 0xE5, 0x0A, 0xC0, 0xCD, 0xE5, 0x09, 0xC0, 0xCD, 0xE5, 0x08, 0xC0, 0xCD, 0xE5, 0x07, 0xC0, 0xCD, 0xE5, 0x06, 0xC0, 0xCD, 0xE5, 0x05, 0xC0, 0xCD, 0xE5, 0x38, 0xFF, 0xFF, 0xEB, 0x0C, 0x00, 0x9D, 0xE5, 0x14, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x04, 0xE0, 0x2D, 0xE5, 0x04, 0xD0, 0x4D, 0xE2, 0xE5, 0xFF, 0xFF, 0xEB, 0x07, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x50, 0xE3, 0x00, 0x00, 0xA0, 0x13, 0x01, 0x00, 0xA0, 0x03, 0x04, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x04, 0xE0, 0x2D, 0xE5, 0x04, 0xD0, 0x4D, 0xE2, 0xDB, 0xFF, 0xFF, 0xEB, 0x07, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x50, 0xE3, 0x00, 0x00, 0xA0, 0x13, 0x01, 0x00, 0xA0, 0x03, 0x04, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x41, 0x2D, 0xE9, 0x00, 0xC0, 0xA0, 0xE1, 0xA7, 0x04, 0xA0, 0xE3, 0x08, 0xD0, 0x4D, 0xE2, 0x16, 0x07, 0x80, 0xE2, 0x2C, 0x58, 0xA0, 0xE1, 0x01, 0x70, 0xA0, 0xE1, 0x00, 0x40, 0xA0, 0xE3, 0x2C, 0xEC, 0xA0, 0xE1, 0x2C, 0x64, 0xA0, 0xE1, 0x46, 0x30, 0xE0, 0xE3, 0x06, 0x0A, 0x80, 0xE2, 0x0D, 0x10, 0xA0, 0xE1, 0x07, 0x30, 0xCD, 0xE5, 0x05, 0x50, 0xCD, 0xE5, 0x03, 0xC0, 0xCD, 0xE5, 0x02, 0x50, 0xA0, 0xE1, 0x06, 0xE0, 0xCD, 0xE5, 0x04, 0x60, 0xCD, 0xE5, 0x00, 0x40, 0xCD, 0xE5, 0x02, 0x40, 0xCD, 0xE5, 0x01, 0x40, 0xCD, 0xE5, 0x58, 0xFF, 0xFF, 0xEB, 0xA1, 0x04, 0xA0, 0xE3, 0x16, 0x07, 0x80, 0xE2, 0x45, 0xC0, 0xE0, 0xE3, 0x03, 0x00, 0x17, 0xE3, 0x0D, 0x80, 0xA0, 0xE1, 0x06, 0x0A, 0x80, 0xE2, 0x07, 0x10, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, 0x0D, 0x30, 0xA0, 0xE1, 0x07, 0xC0, 0xCD, 0xE5, 0x03, 0x00, 0x00, 0x0A, 0x2F, 0xFF, 0xFF, 0xEB, 0x08, 0xD0, 0x8D, 0xE2, 0xF0, 0x41, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xA1, 0x04, 0xA0, 0xE3, 0x16, 0x07, 0x80, 0xE2, 0x06, 0x0A, 0x80, 0xE2, 0x07, 0x10, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, 0x0D, 0x30, 0xA0, 0xE1, 0xF3, 0xFE, 0xFF, 0xEB, 0xF4, 0xFF, 0xFF, 0xEA, 0xF0, 0x40, 0x2D, 0xE9, 0x00, 0x70, 0x51, 0xE2, 0x04, 0xD0, 0x4D, 0xE2, 0x00, 0x50, 0xA0, 0xE1, 0x0A, 0x00, 0x00, 0x0A, 0x02, 0x40, 0xA0, 0xE1, 0x00, 0x60, 0xA0, 0xE3, 0x85, 0x04, 0xA0, 0xE1, 0x04, 0x10, 0xA0, 0xE1, 0x01, 0x60, 0x86, 0xE2, 0x80, 0x20, 0xA0, 0xE3, 0xC5, 0xFF, 0xFF, 0xEB, 0x06, 0x00, 0x57, 0xE1, 0x01, 0x50, 0x85, 0xE2, 0x02, 0x4C, 0x84, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, 0x01, 0x00, 0xA0, 0xE3, 0x04, 0xD0, 0x8D, 0xE2, 0xF0, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x10, 0xB5, 0x40, 0x23, 0x05, 0x4A, 0x5B, 0x42, 0x05, 0x4C, 0x13, 0x70, 0x00, 0x21, 0x43, 0x5C, 0x62, 0x1A, 0x01, 0x31, 0x13, 0x70, 0x08, 0x29, 0xF9, 0xD1, 0x10, 0xBD, 0xA1, 0x01, 0x00, 0x04, 0xAF, 0x01, 0x00, 0x04, 0x70, 0xB5, 0x05, 0x1C, 0x18, 0x1C, 0x0E, 0x1C, 0x14, 0x1C, 0xFF, 0xF7, 0xE7, 0xFF, 0x0A, 0x4B, 0xA4, 0x00, 0x80, 0x22, 0x09, 0x48, 0x1D, 0x60, 0xA4, 0x19, 0x19, 0x1C, 0x12, 0x04, 0x0B, 0x68, 0x13, 0x42, 0x04, 0xD0, 0x03, 0x68, 0xA6, 0x42, 0x00, 0xD2, 0x33, 0x60, 0x04, 0x36, 0x0B, 0x68, 0x00, 0x2B, 0xF4, 0xDB, 0x70, 0xBD, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x04, 0x10, 0x00, 0x10, 0x04, 0x70, 0xB5, 0x0D, 0x1C, 0x14, 0x1C, 0x1E, 0x1C, 0xFF, 0xF7, 0xC8, 0xFF, 0x63, 0x00, 0x1B, 0x19, 0x07, 0x4A, 0x9B, 0x00, 0x99, 0x18, 0x07, 0x4A, 0x0A, 0x60, 0x07, 0x49, 0x5A, 0x18, 0x15, 0x60, 0x06, 0x4A, 0x9B, 0x18, 0x06, 0x4A, 0x1A, 0x60, 0x06, 0x4B, 0x1E, 0x60, 0x70, 0xBD, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x10, 0x04, 0xB4, 0x00, 0x00, 0x04, 0xB8, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0xAF, 0xA4, 0x01, 0x00, 0x04, 0x10, 0xB5, 0x0C, 0x1C, 0xFF, 0xF7, 0xA6, 0xFF, 0x06, 0x4B, 0x80, 0x22, 0x1C, 0x43, 0x06, 0x4B, 0x12, 0x04, 0x1C, 0x60, 0x19, 0x1C, 0x0B, 0x68, 0x13, 0x42, 0xFC, 0xD0, 0x03, 0x4B, 0x18, 0x68, 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xA4, 0x01, 0x00, 0x04, 0x10, 0x00, 0x10, 0x04, 0x70, 0xB5, 0x82, 0xB0, 0x1E, 0x1C, 0x04, 0x0E, 0x6B, 0x46, 0x9C, 0x71, 0x04, 0x0C, 0x00, 0x25, 0x5C, 0x71, 0x04, 0x0A, 0xDD, 0x71, 0xD8, 0x70, 0x9D, 0x70, 0x5D, 0x70, 0x1D, 0x70, 0x30, 0x1C, 0x1C, 0x71, 0xFF, 0xF7, 0x91, 0xFF, 0x02, 0xB0, 0x70, 0xBD, 0x00, 0x00, 0x00, 0xB5, 0x80, 0x22, 0x81, 0xB0, 0x01, 0x1C, 0x92, 0x00, 0x00, 0x20, 0x02, 0x4B, 0xFF, 0xF7, 0xE1, 0xFF, 0x01, 0xB0, 0x00, 0xBD, 0x00, 0x00, 0xFF, 0x1F, 0x3F, 0xA9, 0x30, 0xB5, 0x83, 0xB0, 0x05, 0x1C, 0x08, 0x22, 0x04, 0x49, 0x68, 0x46, 0xFF, 0xF7, 0x2A, 0xFD, 0x29, 0x1C, 0x68, 0x46, 0xFF, 0xF7, 0xB8, 0xFF, 0x03, 0xB0, 0x30, 0xBD, 0xC8, 0x08, 0x80, 0xBF, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0x12, 0x18, 0x83, 0xB0, 0x94, 0x46, 0x04, 0x1C, 0x0F, 0x1C, 0x01, 0x93, 0x60, 0x45, 0x63, 0xD2, 0x38, 0x4A, 0x39, 0x4B, 0x90, 0x46, 0x9B, 0x46, 0x02, 0x32, 0x80, 0x23, 0x92, 0x46, 0x99, 0x46, 0x5B, 0x46, 0x42, 0x46, 0x13, 0x80, 0x06, 0x23, 0x52, 0x46, 0x13, 0x70, 0x42, 0x46, 0x13, 0x88, 0x4A, 0x46, 0x13, 0x42, 0xFA, 0xD1, 0x43, 0x46, 0x40, 0x22, 0x1A, 0x80, 0x5A, 0x46, 0x1A, 0x80, 0x01, 0x9B, 0x01, 0x2B, 0x4F, 0xD0, 0x02, 0x23, 0x52, 0x46, 0x2A, 0x49, 0x13, 0x70, 0x80, 0x22, 0x0B, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x01, 0x9B, 0x01, 0x2B, 0x08, 0xD9, 0x23, 0x04, 0x52, 0x46, 0x1B, 0x0E, 0x24, 0x49, 0x13, 0x70, 0x80, 0x22, 0x0B, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x23, 0x06, 0x52, 0x46, 0x1B, 0x0E, 0x1F, 0x49, 0x13, 0x70, 0x80, 0x22, 0x0B, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x1E, 0x4D, 0x1C, 0x4A, 0x00, 0x20, 0x80, 0x21, 0x3B, 0x78, 0x01, 0x37, 0x2B, 0x70, 0x13, 0x88, 0x0B, 0x42, 0xFC, 0xD1, 0x01, 0x34, 0xA4, 0x45, 0x02, 0xD9, 0x01, 0x30, 0x20, 0x28, 0xF3, 0xD1, 0x40, 0x23, 0x13, 0x80, 0x5B, 0x46, 0x13, 0x80, 0x12, 0x49, 0x52, 0x46, 0x05, 0x23, 0x13, 0x70, 0x80, 0x22, 0x0B, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x10, 0x48, 0x0E, 0x49, 0x00, 0x26, 0x80, 0x22, 0x01, 0x25, 0x06, 0x70, 0x0B, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x03, 0x78, 0x2B, 0x42, 0xF8, 0xD1, 0x40, 0x23, 0x0B, 0x80, 0xA4, 0x45, 0xA3, 0xD8, 0x03, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBD, 0x23, 0x0A, 0xDB, 0x00, 0x02, 0x22, 0x13, 0x43, 0x1B, 0x06, 0x1B, 0x0E, 0xA9, 0xE7, 0xA0, 0x01, 0x00, 0x04, 0x40, 0xA0, 0xFF, 0xFF, 0xA2, 0x01, 0x00, 0x04, 0x70, 0xB5, 0x14, 0x1C, 0x1E, 0x1C, 0x22, 0x4A, 0x22, 0x4B, 0x0D, 0x1C, 0x1A, 0x80, 0x01, 0x2E, 0x31, 0xD0, 0x03, 0x22, 0x20, 0x4B, 0x1F, 0x49, 0x1A, 0x70, 0x80, 0x22, 0x0B, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x03, 0x2E, 0x2E, 0xD0, 0x01, 0x2E, 0x03, 0xD9, 0x03, 0x04, 0x1A, 0x4A, 0x1B, 0x0E, 0x13, 0x70, 0x18, 0x49, 0x0B, 0x88, 0x1A, 0x06, 0xFB, 0xD4, 0x03, 0x06, 0x16, 0x4A, 0x1B, 0x0E, 0x13, 0x70, 0x08, 0x1C, 0x80, 0x22, 0x03, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x00, 0x2C, 0x0E, 0xD0, 0x11, 0x49, 0x10, 0x48, 0x00, 0x26, 0x80, 0x22, 0x0E, 0x70, 0x03, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x0B, 0x78, 0x01, 0x3C, 0x2B, 0x70, 0x00, 0x2C, 0x01, 0xD0, 0x01, 0x35, 0xF4, 0xE7, 0x09, 0x4B, 0x40, 0x22, 0x1A, 0x80, 0x70, 0xBD, 0x03, 0x0A, 0x03, 0x22, 0xDB, 0x00, 0x13, 0x43, 0x1B, 0x06, 0x1A, 0x0E, 0xC7, 0xE7, 0x03, 0x02, 0x04, 0x4A, 0x1B, 0x0E, 0x13, 0x70, 0xD1, 0xE7, 0x00, 0x00, 0x40, 0xA0, 0xFF, 0xFF, 0xA0, 0x01, 0x00, 0x04, 0xA2, 0x01, 0x00, 0x04, 0x0F, 0x00, 0x52, 0xE3, 0x04, 0xE0, 0x2D, 0xE5, 0x00, 0xC0, 0xA0, 0xE1, 0x02, 0xE0, 0xA0, 0xE1, 0x02, 0x00, 0x00, 0x9A, 0x00, 0x30, 0x81, 0xE1, 0x03, 0x00, 0x13, 0xE3, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x5E, 0xE3, 0x05, 0x00, 0x00, 0x0A, 0x00, 0x20, 0xA0, 0xE3, 0x01, 0x30, 0xD1, 0xE4, 0x0C, 0x30, 0xC2, 0xE7, 0x01, 0x20, 0x82, 0xE2, 0x0E, 0x00, 0x52, 0xE1, 0xFA, 0xFF, 0xFF, 0x1A, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x30, 0x91, 0xE5, 0x00, 0x30, 0x8C, 0xE5, 0x04, 0x20, 0x91, 0xE5, 0x04, 0x20, 0x8C, 0xE5, 0x08, 0x30, 0x91, 0xE5, 0x08, 0x30, 0x8C, 0xE5, 0x10, 0xE0, 0x4E, 0xE2, 0x0C, 0x30, 0x91, 0xE5, 0x0F, 0x00, 0x5E, 0xE3, 0x0C, 0x30, 0x8C, 0xE5, 0x10, 0x10, 0x81, 0xE2, 0x10, 0xC0, 0x8C, 0xE2, 0xF2, 0xFF, 0xFF, 0x8A, 0x03, 0x00, 0x5E, 0xE3, 0xE6, 0xFF, 0xFF, 0x9A, 0x04, 0xE0, 0x4E, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x03, 0x00, 0x5E, 0xE3, 0x04, 0x30, 0x8C, 0xE4, 0xFA, 0xFF, 0xFF, 0x8A, 0xE0, 0xFF, 0xFF, 0xEA, 0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFC, 0x00, 0x80, 0xBF, 0xB8, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; bool tryPatch(void* data, size_t size, unsigned int device) { // Find the DSDI reserved space in the file addr_t patchOffset = quickFind ((data_t*)data, dldiMagicString, size, sizeof(dldiMagicString)/sizeof(char)); //no DLDI section if (patchOffset < 0) return false; data_t *pDH = device == 0?mpcf_dldi:r4_dldi; data_t *pAH = (data_t*)data + patchOffset; if (pDH[DO_driverSize] > pAH[DO_allocatedSpace]) { printf ("Not enough space for patch. Available %d bytes, need %d bytes\n", ( 1 << pAH[DO_allocatedSpace]), ( 1 << pDH[DO_driverSize]) ); return false; } if(memcmp(&pAH[DO_friendlyName],"Default (No interface)",22)) { printf("Would have been a candidate for auto-patch DLDI, but there was already a patch installed."); return false; } //----should be able to patch OK----- addr_t memOffset; // Offset of DLDI after the file is loaded into memory addr_t relocationOffset; // Value added to all offsets within the patch to fix it properly addr_t ddmemOffset; // Original offset used in the DLDI file addr_t ddmemStart; // Start of range that offsets can be in the DLDI file addr_t ddmemEnd; // End of range that offsets can be in the DLDI file addr_t ddmemSize; // Size of range that offsets can be in the DLDI file addr_t addrIter; memOffset = readAddr (pAH, DO_text_start); if (memOffset == 0) { memOffset = readAddr (pAH, DO_startup) - DO_code; } ddmemOffset = readAddr (pDH, DO_text_start); relocationOffset = memOffset - ddmemOffset; printf ("AUTO-PATCHING DLDI to MPCF! Lucky you!\n\n"); printf ("Old driver: %s\n", &pAH[DO_friendlyName]); printf ("New driver: %s\n", &pDH[DO_friendlyName]); printf ("\n"); printf ("Position in file: 0x%08X\n", patchOffset); printf ("Position in memory: 0x%08X\n", memOffset); printf ("Patch base address: 0x%08X\n", ddmemOffset); printf ("Relocation offset: 0x%08X\n", relocationOffset); printf ("\n"); ddmemStart = readAddr (pDH, DO_text_start); ddmemSize = (1 << pDH[DO_driverSize]); ddmemEnd = ddmemStart + ddmemSize; // Remember how much space is actually reserved pDH[DO_allocatedSpace] = pAH[DO_allocatedSpace]; // Copy the DLDI patch into the application memcpy (pAH, pDH, device == 0?sizeof(mpcf_dldi):sizeof(r4_dldi)); // Fix the section pointers in the header writeAddr (pAH, DO_text_start, readAddr (pAH, DO_text_start) + relocationOffset); writeAddr (pAH, DO_data_end, readAddr (pAH, DO_data_end) + relocationOffset); writeAddr (pAH, DO_glue_start, readAddr (pAH, DO_glue_start) + relocationOffset); writeAddr (pAH, DO_glue_end, readAddr (pAH, DO_glue_end) + relocationOffset); writeAddr (pAH, DO_got_start, readAddr (pAH, DO_got_start) + relocationOffset); writeAddr (pAH, DO_got_end, readAddr (pAH, DO_got_end) + relocationOffset); writeAddr (pAH, DO_bss_start, readAddr (pAH, DO_bss_start) + relocationOffset); writeAddr (pAH, DO_bss_end, readAddr (pAH, DO_bss_end) + relocationOffset); // Fix the function pointers in the header writeAddr (pAH, DO_startup, readAddr (pAH, DO_startup) + relocationOffset); writeAddr (pAH, DO_isInserted, readAddr (pAH, DO_isInserted) + relocationOffset); writeAddr (pAH, DO_readSectors, readAddr (pAH, DO_readSectors) + relocationOffset); writeAddr (pAH, DO_writeSectors, readAddr (pAH, DO_writeSectors) + relocationOffset); writeAddr (pAH, DO_clearStatus, readAddr (pAH, DO_clearStatus) + relocationOffset); writeAddr (pAH, DO_shutdown, readAddr (pAH, DO_shutdown) + relocationOffset); if (pDH[DO_fixSections] & FIX_ALL) { // Search through and fix pointers within the data section of the file for (addrIter = (readAddr(pDH, DO_text_start) - ddmemStart); addrIter < (readAddr(pDH, DO_data_end) - ddmemStart); addrIter++) { if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); } } } if (pDH[DO_fixSections] & FIX_GLUE) { // Search through and fix pointers within the glue section of the file for (addrIter = (readAddr(pDH, DO_glue_start) - ddmemStart); addrIter < (readAddr(pDH, DO_glue_end) - ddmemStart); addrIter++) { if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); } } } if (pDH[DO_fixSections] & FIX_GOT) { // Search through and fix pointers within the Global Offset Table section of the file for (addrIter = (readAddr(pDH, DO_got_start) - ddmemStart); addrIter < (readAddr(pDH, DO_got_end) - ddmemStart); addrIter++) { if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); } } } if (pDH[DO_fixSections] & FIX_BSS) { // Initialise the BSS to 0 memset (&pAH[readAddr(pDH, DO_bss_start) - ddmemStart] , 0, readAddr(pDH, DO_bss_end) - readAddr(pDH, DO_bss_start)); } return true; } } //namespace DLDI desmume-0.9.11/src/utils/guid.cpp0000755000000000000000000000337412467662066015353 0ustar rootroot/* Copyright (C) 2008-2009 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include "guid.h" #include "../types.h" void Desmume_Guid::newGuid() { for(int i=0;i='A') a=a-'A'+10; else a-='0'; if(b>='A') b=b-'A'+10; else b-='0'; return ((unsigned char)a<<4)|(unsigned char)b; } void Desmume_Guid::scan(std::string& str) { char* endptr = (char*)str.c_str(); en32lsb(data,strtoul(endptr,&endptr,16)); en16lsb(data+4,(u16)strtoul(endptr+1,&endptr,16)); en16lsb(data+6,(u16)strtoul(endptr+1,&endptr,16)); en16lsb(data+8,(u16)strtoul(endptr+1,&endptr,16)); endptr++; for(int i=0;i<6;i++) data[10+i] = hexToByte(&endptr); } desmume-0.9.11/src/utils/glcorearb.h0000644000000000000000000062764412467662066016041 0ustar rootroot#ifndef __glcorearb_h_ #define __glcorearb_h_ 1 #ifdef __cplusplus extern "C" { #endif /* ** Copyright (c) 2013-2014 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ /* ** This header is generated from the Khronos OpenGL / OpenGL ES XML ** API Registry. The current version of the Registry, generator scripts ** used to make the header, and the header can be found at ** http://www.opengl.org/registry/ ** ** Khronos $Revision: 26007 $ on $Date: 2014-03-19 01:28:09 -0700 (Wed, 19 Mar 2014) $ */ #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif #include #endif #ifndef APIENTRY #define APIENTRY #endif #ifndef APIENTRYP #define APIENTRYP APIENTRY * #endif #ifndef GLAPI #define GLAPI extern #endif /* glcorearb.h is for use with OpenGL core profile implementations. ** It should should be placed in the same directory as gl.h and ** included as . ** ** glcorearb.h includes only APIs in the latest OpenGL core profile ** implementation together with APIs in newer ARB extensions which ** can be supported by the core profile. It does not, and never will ** include functionality removed from the core profile, such as ** fixed-function vertex and fragment processing. ** ** Do not #include both and either of or ** in the same source file. */ /* Generated C header for: * API: gl * Profile: core * Versions considered: .* * Versions emitted: .* * Default extensions included: glcore * Additional extensions included: _nomatch_^ * Extensions removed: _nomatch_^ */ #ifndef GL_VERSION_1_0 #define GL_VERSION_1_0 1 typedef void GLvoid; typedef unsigned int GLenum; typedef float GLfloat; typedef int GLint; typedef int GLsizei; typedef unsigned int GLbitfield; typedef double GLdouble; typedef unsigned int GLuint; typedef unsigned char GLboolean; typedef unsigned char GLubyte; typedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); typedef void (APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); typedef void (APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); typedef void (APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); typedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size); typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode); typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLDRAWBUFFERPROC) (GLenum mode); typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth); typedef void (APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); typedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); typedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap); typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap); typedef void (APIENTRYP PFNGLFINISHPROC) (void); typedef void (APIENTRYP PFNGLFLUSHPROC) (void); typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); typedef void (APIENTRYP PFNGLLOGICOPPROC) (GLenum opcode); typedef void (APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); typedef void (APIENTRYP PFNGLPIXELSTOREFPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLREADBUFFERPROC) (GLenum mode); typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); typedef void (APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); typedef void (APIENTRYP PFNGLGETDOUBLEVPROC) (GLenum pname, GLdouble *data); typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void); typedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data); typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); typedef void (APIENTRYP PFNGLDEPTHRANGEPROC) (GLdouble near, GLdouble far); typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCullFace (GLenum mode); GLAPI void APIENTRY glFrontFace (GLenum mode); GLAPI void APIENTRY glHint (GLenum target, GLenum mode); GLAPI void APIENTRY glLineWidth (GLfloat width); GLAPI void APIENTRY glPointSize (GLfloat size); GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); GLAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glDrawBuffer (GLenum mode); GLAPI void APIENTRY glClear (GLbitfield mask); GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void APIENTRY glClearStencil (GLint s); GLAPI void APIENTRY glClearDepth (GLdouble depth); GLAPI void APIENTRY glStencilMask (GLuint mask); GLAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); GLAPI void APIENTRY glDepthMask (GLboolean flag); GLAPI void APIENTRY glDisable (GLenum cap); GLAPI void APIENTRY glEnable (GLenum cap); GLAPI void APIENTRY glFinish (void); GLAPI void APIENTRY glFlush (void); GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); GLAPI void APIENTRY glLogicOp (GLenum opcode); GLAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); GLAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); GLAPI void APIENTRY glDepthFunc (GLenum func); GLAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param); GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); GLAPI void APIENTRY glReadBuffer (GLenum mode); GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); GLAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); GLAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *data); GLAPI GLenum APIENTRY glGetError (void); GLAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *data); GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *data); GLAPI const GLubyte *APIENTRY glGetString (GLenum name); GLAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); GLAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap); GLAPI void APIENTRY glDepthRange (GLdouble near, GLdouble far); GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); #endif #endif /* GL_VERSION_1_0 */ #ifndef GL_VERSION_1_1 #define GL_VERSION_1_1 1 typedef float GLclampf; typedef double GLclampd; #define GL_DEPTH_BUFFER_BIT 0x00000100 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_FALSE 0 #define GL_TRUE 1 #define GL_POINTS 0x0000 #define GL_LINES 0x0001 #define GL_LINE_LOOP 0x0002 #define GL_LINE_STRIP 0x0003 #define GL_TRIANGLES 0x0004 #define GL_TRIANGLE_STRIP 0x0005 #define GL_TRIANGLE_FAN 0x0006 #define GL_QUADS 0x0007 #define GL_NEVER 0x0200 #define GL_LESS 0x0201 #define GL_EQUAL 0x0202 #define GL_LEQUAL 0x0203 #define GL_GREATER 0x0204 #define GL_NOTEQUAL 0x0205 #define GL_GEQUAL 0x0206 #define GL_ALWAYS 0x0207 #define GL_ZERO 0 #define GL_ONE 1 #define GL_SRC_COLOR 0x0300 #define GL_ONE_MINUS_SRC_COLOR 0x0301 #define GL_SRC_ALPHA 0x0302 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_DST_ALPHA 0x0304 #define GL_ONE_MINUS_DST_ALPHA 0x0305 #define GL_DST_COLOR 0x0306 #define GL_ONE_MINUS_DST_COLOR 0x0307 #define GL_SRC_ALPHA_SATURATE 0x0308 #define GL_NONE 0 #define GL_FRONT_LEFT 0x0400 #define GL_FRONT_RIGHT 0x0401 #define GL_BACK_LEFT 0x0402 #define GL_BACK_RIGHT 0x0403 #define GL_FRONT 0x0404 #define GL_BACK 0x0405 #define GL_LEFT 0x0406 #define GL_RIGHT 0x0407 #define GL_FRONT_AND_BACK 0x0408 #define GL_NO_ERROR 0 #define GL_INVALID_ENUM 0x0500 #define GL_INVALID_VALUE 0x0501 #define GL_INVALID_OPERATION 0x0502 #define GL_OUT_OF_MEMORY 0x0505 #define GL_CW 0x0900 #define GL_CCW 0x0901 #define GL_POINT_SIZE 0x0B11 #define GL_POINT_SIZE_RANGE 0x0B12 #define GL_POINT_SIZE_GRANULARITY 0x0B13 #define GL_LINE_SMOOTH 0x0B20 #define GL_LINE_WIDTH 0x0B21 #define GL_LINE_WIDTH_RANGE 0x0B22 #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_POLYGON_MODE 0x0B40 #define GL_POLYGON_SMOOTH 0x0B41 #define GL_CULL_FACE 0x0B44 #define GL_CULL_FACE_MODE 0x0B45 #define GL_FRONT_FACE 0x0B46 #define GL_DEPTH_RANGE 0x0B70 #define GL_DEPTH_TEST 0x0B71 #define GL_DEPTH_WRITEMASK 0x0B72 #define GL_DEPTH_CLEAR_VALUE 0x0B73 #define GL_DEPTH_FUNC 0x0B74 #define GL_STENCIL_TEST 0x0B90 #define GL_STENCIL_CLEAR_VALUE 0x0B91 #define GL_STENCIL_FUNC 0x0B92 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_STENCIL_FAIL 0x0B94 #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_STENCIL_REF 0x0B97 #define GL_STENCIL_WRITEMASK 0x0B98 #define GL_VIEWPORT 0x0BA2 #define GL_DITHER 0x0BD0 #define GL_BLEND_DST 0x0BE0 #define GL_BLEND_SRC 0x0BE1 #define GL_BLEND 0x0BE2 #define GL_LOGIC_OP_MODE 0x0BF0 #define GL_COLOR_LOGIC_OP 0x0BF2 #define GL_DRAW_BUFFER 0x0C01 #define GL_READ_BUFFER 0x0C02 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_COLOR_CLEAR_VALUE 0x0C22 #define GL_COLOR_WRITEMASK 0x0C23 #define GL_DOUBLEBUFFER 0x0C32 #define GL_STEREO 0x0C33 #define GL_LINE_SMOOTH_HINT 0x0C52 #define GL_POLYGON_SMOOTH_HINT 0x0C53 #define GL_UNPACK_SWAP_BYTES 0x0CF0 #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_UNPACK_ROW_LENGTH 0x0CF2 #define GL_UNPACK_SKIP_ROWS 0x0CF3 #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #define GL_UNPACK_ALIGNMENT 0x0CF5 #define GL_PACK_SWAP_BYTES 0x0D00 #define GL_PACK_LSB_FIRST 0x0D01 #define GL_PACK_ROW_LENGTH 0x0D02 #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_PACK_ALIGNMENT 0x0D05 #define GL_MAX_TEXTURE_SIZE 0x0D33 #define GL_MAX_VIEWPORT_DIMS 0x0D3A #define GL_SUBPIXEL_BITS 0x0D50 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_POLYGON_OFFSET_UNITS 0x2A00 #define GL_POLYGON_OFFSET_POINT 0x2A01 #define GL_POLYGON_OFFSET_LINE 0x2A02 #define GL_POLYGON_OFFSET_FILL 0x8037 #define GL_POLYGON_OFFSET_FACTOR 0x8038 #define GL_TEXTURE_BINDING_1D 0x8068 #define GL_TEXTURE_BINDING_2D 0x8069 #define GL_TEXTURE_WIDTH 0x1000 #define GL_TEXTURE_HEIGHT 0x1001 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 #define GL_TEXTURE_BORDER_COLOR 0x1004 #define GL_TEXTURE_RED_SIZE 0x805C #define GL_TEXTURE_GREEN_SIZE 0x805D #define GL_TEXTURE_BLUE_SIZE 0x805E #define GL_TEXTURE_ALPHA_SIZE 0x805F #define GL_DONT_CARE 0x1100 #define GL_FASTEST 0x1101 #define GL_NICEST 0x1102 #define GL_BYTE 0x1400 #define GL_UNSIGNED_BYTE 0x1401 #define GL_SHORT 0x1402 #define GL_UNSIGNED_SHORT 0x1403 #define GL_INT 0x1404 #define GL_UNSIGNED_INT 0x1405 #define GL_FLOAT 0x1406 #define GL_DOUBLE 0x140A #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_CLEAR 0x1500 #define GL_AND 0x1501 #define GL_AND_REVERSE 0x1502 #define GL_COPY 0x1503 #define GL_AND_INVERTED 0x1504 #define GL_NOOP 0x1505 #define GL_XOR 0x1506 #define GL_OR 0x1507 #define GL_NOR 0x1508 #define GL_EQUIV 0x1509 #define GL_INVERT 0x150A #define GL_OR_REVERSE 0x150B #define GL_COPY_INVERTED 0x150C #define GL_OR_INVERTED 0x150D #define GL_NAND 0x150E #define GL_SET 0x150F #define GL_TEXTURE 0x1702 #define GL_COLOR 0x1800 #define GL_DEPTH 0x1801 #define GL_STENCIL 0x1802 #define GL_STENCIL_INDEX 0x1901 #define GL_DEPTH_COMPONENT 0x1902 #define GL_RED 0x1903 #define GL_GREEN 0x1904 #define GL_BLUE 0x1905 #define GL_ALPHA 0x1906 #define GL_RGB 0x1907 #define GL_RGBA 0x1908 #define GL_POINT 0x1B00 #define GL_LINE 0x1B01 #define GL_FILL 0x1B02 #define GL_KEEP 0x1E00 #define GL_REPLACE 0x1E01 #define GL_INCR 0x1E02 #define GL_DECR 0x1E03 #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 #define GL_VERSION 0x1F02 #define GL_EXTENSIONS 0x1F03 #define GL_NEAREST 0x2600 #define GL_LINEAR 0x2601 #define GL_NEAREST_MIPMAP_NEAREST 0x2700 #define GL_LINEAR_MIPMAP_NEAREST 0x2701 #define GL_NEAREST_MIPMAP_LINEAR 0x2702 #define GL_LINEAR_MIPMAP_LINEAR 0x2703 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MIN_FILTER 0x2801 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_TEXTURE_WRAP_T 0x2803 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_REPEAT 0x2901 #define GL_R3_G3_B2 0x2A10 #define GL_RGB4 0x804F #define GL_RGB5 0x8050 #define GL_RGB8 0x8051 #define GL_RGB10 0x8052 #define GL_RGB12 0x8053 #define GL_RGB16 0x8054 #define GL_RGBA2 0x8055 #define GL_RGBA4 0x8056 #define GL_RGB5_A1 0x8057 #define GL_RGBA8 0x8058 #define GL_RGB10_A2 0x8059 #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B #define GL_VERTEX_ARRAY 0x8074 typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); typedef void (APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params); typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); GLAPI void APIENTRY glGetPointerv (GLenum pname, void **params); GLAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); GLAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); GLAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); GLAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); GLAPI GLboolean APIENTRY glIsTexture (GLuint texture); #endif #endif /* GL_VERSION_1_1 */ #ifndef GL_VERSION_1_2 #define GL_VERSION_1_2 1 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_TEXTURE_BINDING_3D 0x806A #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_CLAMP_TO_EDGE 0x812F #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif #endif /* GL_VERSION_1_2 */ #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 #define GL_TEXTURE3 0x84C3 #define GL_TEXTURE4 0x84C4 #define GL_TEXTURE5 0x84C5 #define GL_TEXTURE6 0x84C6 #define GL_TEXTURE7 0x84C7 #define GL_TEXTURE8 0x84C8 #define GL_TEXTURE9 0x84C9 #define GL_TEXTURE10 0x84CA #define GL_TEXTURE11 0x84CB #define GL_TEXTURE12 0x84CC #define GL_TEXTURE13 0x84CD #define GL_TEXTURE14 0x84CE #define GL_TEXTURE15 0x84CF #define GL_TEXTURE16 0x84D0 #define GL_TEXTURE17 0x84D1 #define GL_TEXTURE18 0x84D2 #define GL_TEXTURE19 0x84D3 #define GL_TEXTURE20 0x84D4 #define GL_TEXTURE21 0x84D5 #define GL_TEXTURE22 0x84D6 #define GL_TEXTURE23 0x84D7 #define GL_TEXTURE24 0x84D8 #define GL_TEXTURE25 0x84D9 #define GL_TEXTURE26 0x84DA #define GL_TEXTURE27 0x84DB #define GL_TEXTURE28 0x84DC #define GL_TEXTURE29 0x84DD #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_CLAMP_TO_BORDER 0x812D typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveTexture (GLenum texture); GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); #endif #endif /* GL_VERSION_1_3 */ #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 1 #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_MIRRORED_REPEAT 0x8370 #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_INCR_WRAP 0x8507 #define GL_DECR_WRAP 0x8508 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_FUNC_ADD 0x8006 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void APIENTRY glBlendEquation (GLenum mode); #endif #endif /* GL_VERSION_1_4 */ #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 #include typedef ptrdiff_t GLsizeiptr; typedef ptrdiff_t GLintptr; #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 #define GL_CURRENT_QUERY 0x8865 #define GL_QUERY_RESULT 0x8866 #define GL_QUERY_RESULT_AVAILABLE 0x8867 #define GL_ARRAY_BUFFER 0x8892 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_READ_ONLY 0x88B8 #define GL_WRITE_ONLY 0x88B9 #define GL_READ_WRITE 0x88BA #define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_STREAM_DRAW 0x88E0 #define GL_STREAM_READ 0x88E1 #define GL_STREAM_COPY 0x88E2 #define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_READ 0x88E5 #define GL_STATIC_COPY 0x88E6 #define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_COPY 0x88EA #define GL_SAMPLES_PASSED 0x8914 #define GL_SRC1_ALPHA 0x8589 typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); GLAPI GLboolean APIENTRY glIsQuery (GLuint id); GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); GLAPI void APIENTRY glEndQuery (GLenum target); GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); #endif #endif /* GL_VERSION_1_5 */ #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 typedef char GLchar; typedef short GLshort; typedef signed char GLbyte; typedef unsigned short GLushort; #define GL_BLEND_EQUATION_RGB 0x8009 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_STENCIL_BACK_FUNC 0x8800 #define GL_STENCIL_BACK_FAIL 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 #define GL_MAX_DRAW_BUFFERS 0x8824 #define GL_DRAW_BUFFER0 0x8825 #define GL_DRAW_BUFFER1 0x8826 #define GL_DRAW_BUFFER2 0x8827 #define GL_DRAW_BUFFER3 0x8828 #define GL_DRAW_BUFFER4 0x8829 #define GL_DRAW_BUFFER5 0x882A #define GL_DRAW_BUFFER6 0x882B #define GL_DRAW_BUFFER7 0x882C #define GL_DRAW_BUFFER8 0x882D #define GL_DRAW_BUFFER9 0x882E #define GL_DRAW_BUFFER10 0x882F #define GL_DRAW_BUFFER11 0x8830 #define GL_DRAW_BUFFER12 0x8831 #define GL_DRAW_BUFFER13 0x8832 #define GL_DRAW_BUFFER14 0x8833 #define GL_DRAW_BUFFER15 0x8834 #define GL_BLEND_EQUATION_ALPHA 0x883D #define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_VERTEX_SHADER 0x8B31 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A #define GL_MAX_VARYING_FLOATS 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_SHADER_TYPE 0x8B4F #define GL_FLOAT_VEC2 0x8B50 #define GL_FLOAT_VEC3 0x8B51 #define GL_FLOAT_VEC4 0x8B52 #define GL_INT_VEC2 0x8B53 #define GL_INT_VEC3 0x8B54 #define GL_INT_VEC4 0x8B55 #define GL_BOOL 0x8B56 #define GL_BOOL_VEC2 0x8B57 #define GL_BOOL_VEC3 0x8B58 #define GL_BOOL_VEC4 0x8B59 #define GL_FLOAT_MAT2 0x8B5A #define GL_FLOAT_MAT3 0x8B5B #define GL_FLOAT_MAT4 0x8B5C #define GL_SAMPLER_1D 0x8B5D #define GL_SAMPLER_2D 0x8B5E #define GL_SAMPLER_3D 0x8B5F #define GL_SAMPLER_CUBE 0x8B60 #define GL_SAMPLER_1D_SHADOW 0x8B61 #define GL_SAMPLER_2D_SHADOW 0x8B62 #define GL_DELETE_STATUS 0x8B80 #define GL_COMPILE_STATUS 0x8B81 #define GL_LINK_STATUS 0x8B82 #define GL_VALIDATE_STATUS 0x8B83 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_ATTACHED_SHADERS 0x8B85 #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 #define GL_SHADER_SOURCE_LENGTH 0x8B88 #define GL_ACTIVE_ATTRIBUTES 0x8B89 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B #define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_CURRENT_PROGRAM 0x8B8D #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 #define GL_LOWER_LEFT 0x8CA1 #define GL_UPPER_LEFT 0x8CA2 #define GL_STENCIL_BACK_REF 0x8CA3 #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); GLAPI void APIENTRY glCompileShader (GLuint shader); GLAPI GLuint APIENTRY glCreateProgram (void); GLAPI GLuint APIENTRY glCreateShader (GLenum type); GLAPI void APIENTRY glDeleteProgram (GLuint program); GLAPI void APIENTRY glDeleteShader (GLuint shader); GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); GLAPI GLboolean APIENTRY glIsProgram (GLuint program); GLAPI GLboolean APIENTRY glIsShader (GLuint shader); GLAPI void APIENTRY glLinkProgram (GLuint program); GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); GLAPI void APIENTRY glUseProgram (GLuint program); GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glValidateProgram (GLuint program); GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #endif #endif /* GL_VERSION_2_0 */ #ifndef GL_VERSION_2_1 #define GL_VERSION_2_1 1 #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF #define GL_FLOAT_MAT2x3 0x8B65 #define GL_FLOAT_MAT2x4 0x8B66 #define GL_FLOAT_MAT3x2 0x8B67 #define GL_FLOAT_MAT3x4 0x8B68 #define GL_FLOAT_MAT4x2 0x8B69 #define GL_FLOAT_MAT4x3 0x8B6A #define GL_SRGB 0x8C40 #define GL_SRGB8 0x8C41 #define GL_SRGB_ALPHA 0x8C42 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_COMPRESSED_SRGB 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49 typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #endif #endif /* GL_VERSION_2_1 */ #ifndef GL_VERSION_3_0 #define GL_VERSION_3_0 1 typedef unsigned short GLhalf; #define GL_COMPARE_REF_TO_TEXTURE 0x884E #define GL_CLIP_DISTANCE0 0x3000 #define GL_CLIP_DISTANCE1 0x3001 #define GL_CLIP_DISTANCE2 0x3002 #define GL_CLIP_DISTANCE3 0x3003 #define GL_CLIP_DISTANCE4 0x3004 #define GL_CLIP_DISTANCE5 0x3005 #define GL_CLIP_DISTANCE6 0x3006 #define GL_CLIP_DISTANCE7 0x3007 #define GL_MAX_CLIP_DISTANCES 0x0D32 #define GL_MAJOR_VERSION 0x821B #define GL_MINOR_VERSION 0x821C #define GL_NUM_EXTENSIONS 0x821D #define GL_CONTEXT_FLAGS 0x821E #define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RG 0x8226 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 #define GL_RGBA32F 0x8814 #define GL_RGB32F 0x8815 #define GL_RGBA16F 0x881A #define GL_RGB16F 0x881B #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 #define GL_CLAMP_READ_COLOR 0x891C #define GL_FIXED_ONLY 0x891D #define GL_MAX_VARYING_COMPONENTS 0x8B4B #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D #define GL_R11F_G11F_B10F 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GL_RGB9_E5 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E #define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 #define GL_PRIMITIVES_GENERATED 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 #define GL_RASTERIZER_DISCARD 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B #define GL_INTERLEAVED_ATTRIBS 0x8C8C #define GL_SEPARATE_ATTRIBS 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F #define GL_RGBA32UI 0x8D70 #define GL_RGB32UI 0x8D71 #define GL_RGBA16UI 0x8D76 #define GL_RGB16UI 0x8D77 #define GL_RGBA8UI 0x8D7C #define GL_RGB8UI 0x8D7D #define GL_RGBA32I 0x8D82 #define GL_RGB32I 0x8D83 #define GL_RGBA16I 0x8D88 #define GL_RGB16I 0x8D89 #define GL_RGBA8I 0x8D8E #define GL_RGB8I 0x8D8F #define GL_RED_INTEGER 0x8D94 #define GL_GREEN_INTEGER 0x8D95 #define GL_BLUE_INTEGER 0x8D96 #define GL_RGB_INTEGER 0x8D98 #define GL_RGBA_INTEGER 0x8D99 #define GL_BGR_INTEGER 0x8D9A #define GL_BGRA_INTEGER 0x8D9B #define GL_SAMPLER_1D_ARRAY 0x8DC0 #define GL_SAMPLER_2D_ARRAY 0x8DC1 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW 0x8DC5 #define GL_UNSIGNED_INT_VEC2 0x8DC6 #define GL_UNSIGNED_INT_VEC3 0x8DC7 #define GL_UNSIGNED_INT_VEC4 0x8DC8 #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_INT_SAMPLER_2D 0x8DCA #define GL_INT_SAMPLER_3D 0x8DCB #define GL_INT_SAMPLER_CUBE 0x8DCC #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 #define GL_QUERY_WAIT 0x8E13 #define GL_QUERY_NO_WAIT 0x8E14 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 #define GL_BUFFER_ACCESS_FLAGS 0x911F #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BUFFER_MAP_OFFSET 0x9121 #define GL_DEPTH_COMPONENT32F 0x8CAC #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 #define GL_FRAMEBUFFER_DEFAULT 0x8218 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_DEPTH_STENCIL 0x84F9 #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_TEXTURE_ALPHA_TYPE 0x8C13 #define GL_TEXTURE_DEPTH_TYPE 0x8C16 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 #define GL_RENDERBUFFER_BINDING 0x8CA7 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_RENDERBUFFER_SAMPLES 0x8CAB #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_COLOR_ATTACHMENT0 0x8CE0 #define GL_COLOR_ATTACHMENT1 0x8CE1 #define GL_COLOR_ATTACHMENT2 0x8CE2 #define GL_COLOR_ATTACHMENT3 0x8CE3 #define GL_COLOR_ATTACHMENT4 0x8CE4 #define GL_COLOR_ATTACHMENT5 0x8CE5 #define GL_COLOR_ATTACHMENT6 0x8CE6 #define GL_COLOR_ATTACHMENT7 0x8CE7 #define GL_COLOR_ATTACHMENT8 0x8CE8 #define GL_COLOR_ATTACHMENT9 0x8CE9 #define GL_COLOR_ATTACHMENT10 0x8CEA #define GL_COLOR_ATTACHMENT11 0x8CEB #define GL_COLOR_ATTACHMENT12 0x8CEC #define GL_COLOR_ATTACHMENT13 0x8CED #define GL_COLOR_ATTACHMENT14 0x8CEE #define GL_COLOR_ATTACHMENT15 0x8CEF #define GL_DEPTH_ATTACHMENT 0x8D00 #define GL_STENCIL_ATTACHMENT 0x8D20 #define GL_FRAMEBUFFER 0x8D40 #define GL_RENDERBUFFER 0x8D41 #define GL_RENDERBUFFER_WIDTH 0x8D42 #define GL_RENDERBUFFER_HEIGHT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 #define GL_STENCIL_INDEX1 0x8D46 #define GL_STENCIL_INDEX4 0x8D47 #define GL_STENCIL_INDEX8 0x8D48 #define GL_STENCIL_INDEX16 0x8D49 #define GL_RENDERBUFFER_RED_SIZE 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 #define GL_MAX_SAMPLES 0x8D57 #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GL_HALF_FLOAT 0x140B #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC #define GL_COMPRESSED_RG_RGTC2 0x8DBD #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE #define GL_RG 0x8227 #define GL_RG_INTEGER 0x8228 #define GL_R8 0x8229 #define GL_R16 0x822A #define GL_RG8 0x822B #define GL_RG16 0x822C #define GL_R16F 0x822D #define GL_R32F 0x822E #define GL_RG16F 0x822F #define GL_RG32F 0x8230 #define GL_R8I 0x8231 #define GL_R8UI 0x8232 #define GL_R16I 0x8233 #define GL_R16UI 0x8234 #define GL_R32I 0x8235 #define GL_R32UI 0x8236 #define GL_RG8I 0x8237 #define GL_RG8UI 0x8238 #define GL_RG16I 0x8239 #define GL_RG16UI 0x823A #define GL_RG32I 0x823B #define GL_RG32UI 0x823C #define GL_VERTEX_ARRAY_BINDING 0x85B5 typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); GLAPI void APIENTRY glEndTransformFeedback (void); GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); GLAPI void APIENTRY glEndConditionalRender (void); GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); GLAPI void APIENTRY glGenerateMipmap (GLenum target); GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); GLAPI void APIENTRY glBindVertexArray (GLuint array); GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); #endif #endif /* GL_VERSION_3_0 */ #ifndef GL_VERSION_3_1 #define GL_VERSION_3_1 1 #define GL_SAMPLER_2D_RECT 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 #define GL_SAMPLER_BUFFER 0x8DC2 #define GL_INT_SAMPLER_2D_RECT 0x8DCD #define GL_INT_SAMPLER_BUFFER 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 #define GL_TEXTURE_BUFFER 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B #define GL_TEXTURE_BINDING_BUFFER 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D #define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_PRIMITIVE_RESTART 0x8F9D #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E #define GL_COPY_READ_BUFFER 0x8F36 #define GL_COPY_WRITE_BUFFER 0x8F37 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 #define GL_UNIFORM_TYPE 0x8A37 #define GL_UNIFORM_SIZE 0x8A38 #define GL_UNIFORM_NAME_LENGTH 0x8A39 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A #define GL_UNIFORM_OFFSET 0x8A3B #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C #define GL_UNIFORM_MATRIX_STRIDE 0x8A3D #define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E #define GL_UNIFORM_BLOCK_BINDING 0x8A3F #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFFu typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #endif #endif /* GL_VERSION_3_1 */ #ifndef GL_VERSION_3_2 #define GL_VERSION_3_2 1 typedef struct __GLsync *GLsync; #ifndef GLEXT_64_TYPES_DEFINED /* This code block is duplicated in glxext.h, so must be protected */ #define GLEXT_64_TYPES_DEFINED /* Define int32_t, int64_t, and uint64_t types for UST/MSC */ /* (as used in the GL_EXT_timer_query extension). */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include #elif defined(__sun__) || defined(__digital__) #include #if defined(__STDC__) #if defined(__arch64__) || defined(_LP64) typedef long int int64_t; typedef unsigned long int uint64_t; #else typedef long long int int64_t; typedef unsigned long long int uint64_t; #endif /* __arch64__ */ #endif /* __STDC__ */ #elif defined( __VMS ) || defined(__sgi) #include #elif defined(__SCO__) || defined(__USLC__) #include #elif defined(__UNIXOS2__) || defined(__SOL64__) typedef long int int32_t; typedef long long int int64_t; typedef unsigned long long int uint64_t; #elif defined(_WIN32) && defined(__GNUC__) #include #elif defined(_WIN32) typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #else /* Fallback if nothing above works */ #include #endif #endif typedef uint64_t GLuint64; typedef int64_t GLint64; #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_LINES_ADJACENCY 0x000A #define GL_LINE_STRIP_ADJACENCY 0x000B #define GL_TRIANGLES_ADJACENCY 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_PROGRAM_POINT_SIZE 0x8642 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_GEOMETRY_SHADER 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 #define GL_CONTEXT_PROFILE_MASK 0x9126 #define GL_DEPTH_CLAMP 0x864F #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 #define GL_OBJECT_TYPE 0x9112 #define GL_SYNC_CONDITION 0x9113 #define GL_SYNC_STATUS 0x9114 #define GL_SYNC_FLAGS 0x9115 #define GL_SYNC_FENCE 0x9116 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #define GL_UNSIGNALED 0x9118 #define GL_SIGNALED 0x9119 #define GL_ALREADY_SIGNALED 0x911A #define GL_TIMEOUT_EXPIRED 0x911B #define GL_CONDITION_SATISFIED 0x911C #define GL_WAIT_FAILED 0x911D #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_SAMPLE_POSITION 0x8E50 #define GL_SAMPLE_MASK 0x8E51 #define GL_SAMPLE_MASK_VALUE 0x8E52 #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 #define GL_TEXTURE_SAMPLES 0x9106 #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 #define GL_SAMPLER_2D_MULTISAMPLE 0x9108 #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_INTEGER_SAMPLES 0x9110 typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); GLAPI void APIENTRY glProvokingVertex (GLenum mode); GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); GLAPI GLboolean APIENTRY glIsSync (GLsync sync); GLAPI void APIENTRY glDeleteSync (GLsync sync); GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); #endif #endif /* GL_VERSION_3_2 */ #ifndef GL_VERSION_3_3 #define GL_VERSION_3_3 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_SRC1_COLOR 0x88F9 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC #define GL_ANY_SAMPLES_PASSED 0x8C2F #define GL_SAMPLER_BINDING 0x8919 #define GL_RGB10_A2UI 0x906F #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 #define GL_INT_2_10_10_10_REV 0x8D9F typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); #endif #endif /* GL_VERSION_3_3 */ #ifndef GL_VERSION_4_0 #define GL_VERSION_4_0 1 #define GL_SAMPLE_SHADING 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MAX_VERTEX_STREAMS 0x8E71 #define GL_DOUBLE_VEC2 0x8FFC #define GL_DOUBLE_VEC3 0x8FFD #define GL_DOUBLE_VEC4 0x8FFE #define GL_DOUBLE_MAT2 0x8F46 #define GL_DOUBLE_MAT3 0x8F47 #define GL_DOUBLE_MAT4 0x8F48 #define GL_DOUBLE_MAT2x3 0x8F49 #define GL_DOUBLE_MAT2x4 0x8F4A #define GL_DOUBLE_MAT3x2 0x8F4B #define GL_DOUBLE_MAT3x4 0x8F4C #define GL_DOUBLE_MAT4x2 0x8F4D #define GL_DOUBLE_MAT4x3 0x8F4E #define GL_ACTIVE_SUBROUTINES 0x8DE5 #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 #define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 #define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 #define GL_MAX_SUBROUTINES 0x8DE7 #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_COMPATIBLE_SUBROUTINES 0x8E4B #define GL_PATCHES 0x000E #define GL_PATCH_VERTICES 0x8E72 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 #define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 #define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 #define GL_TESS_GEN_MODE 0x8E76 #define GL_TESS_GEN_SPACING 0x8E77 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TESS_GEN_POINT_MODE 0x8E79 #define GL_ISOLINES 0x8E7A #define GL_FRACTIONAL_ODD 0x8E7B #define GL_FRACTIONAL_EVEN 0x8E7C #define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_TESS_GEN_LEVEL 0x8E7E #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F #define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 #define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 #define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 #define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 #define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 #define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 #define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 #define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 #define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A #define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C #define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D #define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E #define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_TESS_CONTROL_SHADER 0x8E88 #define GL_TRANSFORM_FEEDBACK 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMinSampleShading (GLfloat value); GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); GLAPI void APIENTRY glPauseTransformFeedback (void); GLAPI void APIENTRY glResumeTransformFeedback (void); GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); #endif #endif /* GL_VERSION_4_0 */ #ifndef GL_VERSION_4_1 #define GL_VERSION_4_1 1 #define GL_FIXED 0x140C #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B #define GL_LOW_FLOAT 0x8DF0 #define GL_MEDIUM_FLOAT 0x8DF1 #define GL_HIGH_FLOAT 0x8DF2 #define GL_LOW_INT 0x8DF3 #define GL_MEDIUM_INT 0x8DF4 #define GL_HIGH_INT 0x8DF5 #define GL_SHADER_COMPILER 0x8DFA #define GL_SHADER_BINARY_FORMATS 0x8DF8 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD #define GL_RGB565 0x8D62 #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 #define GL_PROGRAM_BINARY_LENGTH 0x8741 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE #define GL_PROGRAM_BINARY_FORMATS 0x87FF #define GL_VERTEX_SHADER_BIT 0x00000001 #define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_GEOMETRY_SHADER_BIT 0x00000004 #define GL_TESS_CONTROL_SHADER_BIT 0x00000008 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 #define GL_ALL_SHADER_BITS 0xFFFFFFFF #define GL_PROGRAM_SEPARABLE 0x8258 #define GL_ACTIVE_PROGRAM 0x8259 #define GL_PROGRAM_PIPELINE_BINDING 0x825A #define GL_MAX_VIEWPORTS 0x825B #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C #define GL_VIEWPORT_BOUNDS_RANGE 0x825D #define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F #define GL_UNDEFINED_VERTEX 0x8260 typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glReleaseShaderCompiler (void); GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); GLAPI void APIENTRY glClearDepthf (GLfloat d); GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); #endif #endif /* GL_VERSION_4_1 */ #ifndef GL_VERSION_4_2 #define GL_VERSION_4_2 1 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 #define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A #define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E #define GL_NUM_SAMPLE_COUNTS 0x9380 #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC #define GL_ATOMIC_COUNTER_BUFFER 0x92C0 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 #define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 #define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB #define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF #define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 #define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 #define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 #define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 #define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 #define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_UNIFORM_BARRIER_BIT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 #define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 #define GL_ALL_BARRIER_BITS 0xFFFFFFFF #define GL_MAX_IMAGE_UNITS 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 #define GL_IMAGE_BINDING_NAME 0x8F3A #define GL_IMAGE_BINDING_LEVEL 0x8F3B #define GL_IMAGE_BINDING_LAYERED 0x8F3C #define GL_IMAGE_BINDING_LAYER 0x8F3D #define GL_IMAGE_BINDING_ACCESS 0x8F3E #define GL_IMAGE_1D 0x904C #define GL_IMAGE_2D 0x904D #define GL_IMAGE_3D 0x904E #define GL_IMAGE_2D_RECT 0x904F #define GL_IMAGE_CUBE 0x9050 #define GL_IMAGE_BUFFER 0x9051 #define GL_IMAGE_1D_ARRAY 0x9052 #define GL_IMAGE_2D_ARRAY 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 #define GL_IMAGE_2D_MULTISAMPLE 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 #define GL_INT_IMAGE_1D 0x9057 #define GL_INT_IMAGE_2D 0x9058 #define GL_INT_IMAGE_3D 0x9059 #define GL_INT_IMAGE_2D_RECT 0x905A #define GL_INT_IMAGE_CUBE 0x905B #define GL_INT_IMAGE_BUFFER 0x905C #define GL_INT_IMAGE_1D_ARRAY 0x905D #define GL_INT_IMAGE_2D_ARRAY 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C #define GL_MAX_IMAGE_SAMPLES 0x906D #define GL_IMAGE_BINDING_FORMAT 0x906E #define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 #define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA #define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB #define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); #endif #endif /* GL_VERSION_4_2 */ #ifndef GL_VERSION_4_3 #define GL_VERSION_4_3 1 typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E #define GL_COMPRESSED_RGB8_ETC2 0x9274 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #define GL_COMPRESSED_R11_EAC 0x9270 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_MAX_ELEMENT_INDEX 0x8D6B #define GL_COMPUTE_SHADER 0x91B9 #define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB #define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC #define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD #define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 #define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 #define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 #define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 #define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB #define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE #define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF #define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 #define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 #define GL_DEBUG_SOURCE_API 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 #define GL_DEBUG_SOURCE_APPLICATION 0x824A #define GL_DEBUG_SOURCE_OTHER 0x824B #define GL_DEBUG_TYPE_ERROR 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_DEBUG_TYPE_PORTABILITY 0x824F #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #define GL_DEBUG_TYPE_OTHER 0x8251 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 #define GL_DEBUG_LOGGED_MESSAGES 0x9145 #define GL_DEBUG_SEVERITY_HIGH 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 #define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_DEBUG_TYPE_MARKER 0x8268 #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 #define GL_DEBUG_TYPE_POP_GROUP 0x826A #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D #define GL_BUFFER 0x82E0 #define GL_SHADER 0x82E1 #define GL_PROGRAM 0x82E2 #define GL_QUERY 0x82E3 #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_SAMPLER 0x82E6 #define GL_MAX_LABEL_LENGTH 0x82E8 #define GL_DEBUG_OUTPUT 0x92E0 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 #define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 #define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 #define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 #define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 #define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 #define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 #define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 #define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 #define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 #define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 #define GL_INTERNALFORMAT_RED_TYPE 0x8278 #define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 #define GL_INTERNALFORMAT_BLUE_TYPE 0x827A #define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B #define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C #define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D #define GL_MAX_WIDTH 0x827E #define GL_MAX_HEIGHT 0x827F #define GL_MAX_DEPTH 0x8280 #define GL_MAX_LAYERS 0x8281 #define GL_MAX_COMBINED_DIMENSIONS 0x8282 #define GL_COLOR_COMPONENTS 0x8283 #define GL_DEPTH_COMPONENTS 0x8284 #define GL_STENCIL_COMPONENTS 0x8285 #define GL_COLOR_RENDERABLE 0x8286 #define GL_DEPTH_RENDERABLE 0x8287 #define GL_STENCIL_RENDERABLE 0x8288 #define GL_FRAMEBUFFER_RENDERABLE 0x8289 #define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A #define GL_FRAMEBUFFER_BLEND 0x828B #define GL_READ_PIXELS 0x828C #define GL_READ_PIXELS_FORMAT 0x828D #define GL_READ_PIXELS_TYPE 0x828E #define GL_TEXTURE_IMAGE_FORMAT 0x828F #define GL_TEXTURE_IMAGE_TYPE 0x8290 #define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 #define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_MIPMAP 0x8293 #define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_COLOR_ENCODING 0x8296 #define GL_SRGB_READ 0x8297 #define GL_SRGB_WRITE 0x8298 #define GL_FILTER 0x829A #define GL_VERTEX_TEXTURE 0x829B #define GL_TESS_CONTROL_TEXTURE 0x829C #define GL_TESS_EVALUATION_TEXTURE 0x829D #define GL_GEOMETRY_TEXTURE 0x829E #define GL_FRAGMENT_TEXTURE 0x829F #define GL_COMPUTE_TEXTURE 0x82A0 #define GL_TEXTURE_SHADOW 0x82A1 #define GL_TEXTURE_GATHER 0x82A2 #define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_SHADER_IMAGE_LOAD 0x82A4 #define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_SHADER_IMAGE_ATOMIC 0x82A6 #define GL_IMAGE_TEXEL_SIZE 0x82A7 #define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 #define GL_IMAGE_PIXEL_FORMAT 0x82A9 #define GL_IMAGE_PIXEL_TYPE 0x82AA #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF #define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 #define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 #define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 #define GL_CLEAR_BUFFER 0x82B4 #define GL_TEXTURE_VIEW 0x82B5 #define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 #define GL_FULL_SUPPORT 0x82B7 #define GL_CAVEAT_SUPPORT 0x82B8 #define GL_IMAGE_CLASS_4_X_32 0x82B9 #define GL_IMAGE_CLASS_2_X_32 0x82BA #define GL_IMAGE_CLASS_1_X_32 0x82BB #define GL_IMAGE_CLASS_4_X_16 0x82BC #define GL_IMAGE_CLASS_2_X_16 0x82BD #define GL_IMAGE_CLASS_1_X_16 0x82BE #define GL_IMAGE_CLASS_4_X_8 0x82BF #define GL_IMAGE_CLASS_2_X_8 0x82C0 #define GL_IMAGE_CLASS_1_X_8 0x82C1 #define GL_IMAGE_CLASS_11_11_10 0x82C2 #define GL_IMAGE_CLASS_10_10_10_2 0x82C3 #define GL_VIEW_CLASS_128_BITS 0x82C4 #define GL_VIEW_CLASS_96_BITS 0x82C5 #define GL_VIEW_CLASS_64_BITS 0x82C6 #define GL_VIEW_CLASS_48_BITS 0x82C7 #define GL_VIEW_CLASS_32_BITS 0x82C8 #define GL_VIEW_CLASS_24_BITS 0x82C9 #define GL_VIEW_CLASS_16_BITS 0x82CA #define GL_VIEW_CLASS_8_BITS 0x82CB #define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC #define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD #define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE #define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF #define GL_VIEW_CLASS_RGTC1_RED 0x82D0 #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 #define GL_UNIFORM 0x92E1 #define GL_UNIFORM_BLOCK 0x92E2 #define GL_PROGRAM_INPUT 0x92E3 #define GL_PROGRAM_OUTPUT 0x92E4 #define GL_BUFFER_VARIABLE 0x92E5 #define GL_SHADER_STORAGE_BLOCK 0x92E6 #define GL_VERTEX_SUBROUTINE 0x92E8 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9 #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA #define GL_GEOMETRY_SUBROUTINE 0x92EB #define GL_FRAGMENT_SUBROUTINE 0x92EC #define GL_COMPUTE_SUBROUTINE 0x92ED #define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE #define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF #define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 #define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 #define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 #define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 #define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 #define GL_ACTIVE_RESOURCES 0x92F5 #define GL_MAX_NAME_LENGTH 0x92F6 #define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 #define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 #define GL_NAME_LENGTH 0x92F9 #define GL_TYPE 0x92FA #define GL_ARRAY_SIZE 0x92FB #define GL_OFFSET 0x92FC #define GL_BLOCK_INDEX 0x92FD #define GL_ARRAY_STRIDE 0x92FE #define GL_MATRIX_STRIDE 0x92FF #define GL_IS_ROW_MAJOR 0x9300 #define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 #define GL_BUFFER_BINDING 0x9302 #define GL_BUFFER_DATA_SIZE 0x9303 #define GL_NUM_ACTIVE_VARIABLES 0x9304 #define GL_ACTIVE_VARIABLES 0x9305 #define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 #define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 #define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 #define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 #define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A #define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B #define GL_TOP_LEVEL_ARRAY_SIZE 0x930C #define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D #define GL_LOCATION 0x930E #define GL_LOCATION_INDEX 0x930F #define GL_IS_PER_PATCH 0x92E7 #define GL_SHADER_STORAGE_BUFFER 0x90D2 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4 #define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 #define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 #define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 #define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 #define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA #define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB #define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC #define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF #define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GL_TEXTURE_BUFFER_OFFSET 0x919D #define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F #define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB #define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD #define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_VERTEX_ATTRIB_BINDING 0x82D4 #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 #define GL_VERTEX_BINDING_DIVISOR 0x82D6 #define GL_VERTEX_BINDING_OFFSET 0x82D7 #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA #define GL_VERTEX_BINDING_BUFFER 0x8F4F typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); GLAPI void APIENTRY glPopDebugGroup (void); GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); #endif #endif /* GL_VERSION_4_3 */ #ifndef GL_VERSION_4_4 #define GL_VERSION_4_4 1 #define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 #define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 #define GL_TEXTURE_BUFFER_BINDING 0x8C2A #define GL_MAP_PERSISTENT_BIT 0x0040 #define GL_MAP_COHERENT_BIT 0x0080 #define GL_DYNAMIC_STORAGE_BIT 0x0100 #define GL_CLIENT_STORAGE_BIT 0x0200 #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 #define GL_BUFFER_IMMUTABLE_STORAGE 0x821F #define GL_BUFFER_STORAGE_FLAGS 0x8220 #define GL_CLEAR_TEXTURE 0x9365 #define GL_LOCATION_COMPONENT 0x934A #define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B #define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C #define GL_QUERY_BUFFER 0x9192 #define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 #define GL_QUERY_BUFFER_BINDING 0x9193 #define GL_QUERY_RESULT_NO_WAIT 0x9194 #define GL_MIRROR_CLAMP_TO_EDGE 0x8743 typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); #endif #endif /* GL_VERSION_4_4 */ #ifndef GL_ARB_ES2_compatibility #define GL_ARB_ES2_compatibility 1 #endif /* GL_ARB_ES2_compatibility */ #ifndef GL_ARB_ES3_compatibility #define GL_ARB_ES3_compatibility 1 #endif /* GL_ARB_ES3_compatibility */ #ifndef GL_ARB_arrays_of_arrays #define GL_ARB_arrays_of_arrays 1 #endif /* GL_ARB_arrays_of_arrays */ #ifndef GL_ARB_base_instance #define GL_ARB_base_instance 1 #endif /* GL_ARB_base_instance */ #ifndef GL_ARB_bindless_texture #define GL_ARB_bindless_texture 1 typedef uint64_t GLuint64EXT; #define GL_UNSIGNED_INT64_ARB 0x140F typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); #endif #endif /* GL_ARB_bindless_texture */ #ifndef GL_ARB_blend_func_extended #define GL_ARB_blend_func_extended 1 #endif /* GL_ARB_blend_func_extended */ #ifndef GL_ARB_buffer_storage #define GL_ARB_buffer_storage 1 #endif /* GL_ARB_buffer_storage */ #ifndef GL_ARB_cl_event #define GL_ARB_cl_event 1 struct _cl_context; struct _cl_event; #define GL_SYNC_CL_EVENT_ARB 0x8240 #define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); #endif #endif /* GL_ARB_cl_event */ #ifndef GL_ARB_clear_buffer_object #define GL_ARB_clear_buffer_object 1 #endif /* GL_ARB_clear_buffer_object */ #ifndef GL_ARB_clear_texture #define GL_ARB_clear_texture 1 #endif /* GL_ARB_clear_texture */ #ifndef GL_ARB_compressed_texture_pixel_storage #define GL_ARB_compressed_texture_pixel_storage 1 #endif /* GL_ARB_compressed_texture_pixel_storage */ #ifndef GL_ARB_compute_shader #define GL_ARB_compute_shader 1 #define GL_COMPUTE_SHADER_BIT 0x00000020 #endif /* GL_ARB_compute_shader */ #ifndef GL_ARB_compute_variable_group_size #define GL_ARB_compute_variable_group_size 1 #define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 #define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB #define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 #define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); #endif #endif /* GL_ARB_compute_variable_group_size */ #ifndef GL_ARB_conservative_depth #define GL_ARB_conservative_depth 1 #endif /* GL_ARB_conservative_depth */ #ifndef GL_ARB_copy_buffer #define GL_ARB_copy_buffer 1 #define GL_COPY_READ_BUFFER_BINDING 0x8F36 #define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 #endif /* GL_ARB_copy_buffer */ #ifndef GL_ARB_copy_image #define GL_ARB_copy_image 1 #endif /* GL_ARB_copy_image */ #ifndef GL_ARB_debug_output #define GL_ARB_debug_output 1 typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 #define GL_DEBUG_SOURCE_API_ARB 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 #define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A #define GL_DEBUG_SOURCE_OTHER_ARB 0x824B #define GL_DEBUG_TYPE_ERROR_ARB 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E #define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F #define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 #define GL_DEBUG_TYPE_OTHER_ARB 0x8251 #define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 #define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 #define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); #endif #endif /* GL_ARB_debug_output */ #ifndef GL_ARB_depth_buffer_float #define GL_ARB_depth_buffer_float 1 #endif /* GL_ARB_depth_buffer_float */ #ifndef GL_ARB_depth_clamp #define GL_ARB_depth_clamp 1 #endif /* GL_ARB_depth_clamp */ #ifndef GL_ARB_draw_buffers_blend #define GL_ARB_draw_buffers_blend 1 typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); #endif #endif /* GL_ARB_draw_buffers_blend */ #ifndef GL_ARB_draw_elements_base_vertex #define GL_ARB_draw_elements_base_vertex 1 #endif /* GL_ARB_draw_elements_base_vertex */ #ifndef GL_ARB_draw_indirect #define GL_ARB_draw_indirect 1 #endif /* GL_ARB_draw_indirect */ #ifndef GL_ARB_enhanced_layouts #define GL_ARB_enhanced_layouts 1 #endif /* GL_ARB_enhanced_layouts */ #ifndef GL_ARB_explicit_attrib_location #define GL_ARB_explicit_attrib_location 1 #endif /* GL_ARB_explicit_attrib_location */ #ifndef GL_ARB_explicit_uniform_location #define GL_ARB_explicit_uniform_location 1 #endif /* GL_ARB_explicit_uniform_location */ #ifndef GL_ARB_fragment_coord_conventions #define GL_ARB_fragment_coord_conventions 1 #endif /* GL_ARB_fragment_coord_conventions */ #ifndef GL_ARB_fragment_layer_viewport #define GL_ARB_fragment_layer_viewport 1 #endif /* GL_ARB_fragment_layer_viewport */ #ifndef GL_ARB_framebuffer_no_attachments #define GL_ARB_framebuffer_no_attachments 1 #endif /* GL_ARB_framebuffer_no_attachments */ #ifndef GL_ARB_framebuffer_object #define GL_ARB_framebuffer_object 1 #endif /* GL_ARB_framebuffer_object */ #ifndef GL_ARB_framebuffer_sRGB #define GL_ARB_framebuffer_sRGB 1 #endif /* GL_ARB_framebuffer_sRGB */ #ifndef GL_ARB_get_program_binary #define GL_ARB_get_program_binary 1 #endif /* GL_ARB_get_program_binary */ #ifndef GL_ARB_gpu_shader5 #define GL_ARB_gpu_shader5 1 #endif /* GL_ARB_gpu_shader5 */ #ifndef GL_ARB_gpu_shader_fp64 #define GL_ARB_gpu_shader_fp64 1 #endif /* GL_ARB_gpu_shader_fp64 */ #ifndef GL_ARB_half_float_vertex #define GL_ARB_half_float_vertex 1 #endif /* GL_ARB_half_float_vertex */ #ifndef GL_ARB_imaging #define GL_ARB_imaging 1 #define GL_BLEND_COLOR 0x8005 #define GL_BLEND_EQUATION 0x8009 #endif /* GL_ARB_imaging */ #ifndef GL_ARB_indirect_parameters #define GL_ARB_indirect_parameters 1 #define GL_PARAMETER_BUFFER_ARB 0x80EE #define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); #endif #endif /* GL_ARB_indirect_parameters */ #ifndef GL_ARB_internalformat_query #define GL_ARB_internalformat_query 1 #endif /* GL_ARB_internalformat_query */ #ifndef GL_ARB_internalformat_query2 #define GL_ARB_internalformat_query2 1 #define GL_SRGB_DECODE_ARB 0x8299 #endif /* GL_ARB_internalformat_query2 */ #ifndef GL_ARB_invalidate_subdata #define GL_ARB_invalidate_subdata 1 #endif /* GL_ARB_invalidate_subdata */ #ifndef GL_ARB_map_buffer_alignment #define GL_ARB_map_buffer_alignment 1 #endif /* GL_ARB_map_buffer_alignment */ #ifndef GL_ARB_map_buffer_range #define GL_ARB_map_buffer_range 1 #endif /* GL_ARB_map_buffer_range */ #ifndef GL_ARB_multi_bind #define GL_ARB_multi_bind 1 #endif /* GL_ARB_multi_bind */ #ifndef GL_ARB_multi_draw_indirect #define GL_ARB_multi_draw_indirect 1 #endif /* GL_ARB_multi_draw_indirect */ #ifndef GL_ARB_occlusion_query2 #define GL_ARB_occlusion_query2 1 #endif /* GL_ARB_occlusion_query2 */ #ifndef GL_ARB_program_interface_query #define GL_ARB_program_interface_query 1 #endif /* GL_ARB_program_interface_query */ #ifndef GL_ARB_provoking_vertex #define GL_ARB_provoking_vertex 1 #endif /* GL_ARB_provoking_vertex */ #ifndef GL_ARB_query_buffer_object #define GL_ARB_query_buffer_object 1 #endif /* GL_ARB_query_buffer_object */ #ifndef GL_ARB_robust_buffer_access_behavior #define GL_ARB_robust_buffer_access_behavior 1 #endif /* GL_ARB_robust_buffer_access_behavior */ #ifndef GL_ARB_robustness #define GL_ARB_robustness 1 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 #define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 #define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261 typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); #endif #endif /* GL_ARB_robustness */ #ifndef GL_ARB_robustness_isolation #define GL_ARB_robustness_isolation 1 #endif /* GL_ARB_robustness_isolation */ #ifndef GL_ARB_sample_shading #define GL_ARB_sample_shading 1 #define GL_SAMPLE_SHADING_ARB 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); #endif #endif /* GL_ARB_sample_shading */ #ifndef GL_ARB_sampler_objects #define GL_ARB_sampler_objects 1 #endif /* GL_ARB_sampler_objects */ #ifndef GL_ARB_seamless_cube_map #define GL_ARB_seamless_cube_map 1 #endif /* GL_ARB_seamless_cube_map */ #ifndef GL_ARB_seamless_cubemap_per_texture #define GL_ARB_seamless_cubemap_per_texture 1 #endif /* GL_ARB_seamless_cubemap_per_texture */ #ifndef GL_ARB_separate_shader_objects #define GL_ARB_separate_shader_objects 1 #endif /* GL_ARB_separate_shader_objects */ #ifndef GL_ARB_shader_atomic_counters #define GL_ARB_shader_atomic_counters 1 #endif /* GL_ARB_shader_atomic_counters */ #ifndef GL_ARB_shader_bit_encoding #define GL_ARB_shader_bit_encoding 1 #endif /* GL_ARB_shader_bit_encoding */ #ifndef GL_ARB_shader_draw_parameters #define GL_ARB_shader_draw_parameters 1 #endif /* GL_ARB_shader_draw_parameters */ #ifndef GL_ARB_shader_group_vote #define GL_ARB_shader_group_vote 1 #endif /* GL_ARB_shader_group_vote */ #ifndef GL_ARB_shader_image_load_store #define GL_ARB_shader_image_load_store 1 #endif /* GL_ARB_shader_image_load_store */ #ifndef GL_ARB_shader_image_size #define GL_ARB_shader_image_size 1 #endif /* GL_ARB_shader_image_size */ #ifndef GL_ARB_shader_precision #define GL_ARB_shader_precision 1 #endif /* GL_ARB_shader_precision */ #ifndef GL_ARB_shader_stencil_export #define GL_ARB_shader_stencil_export 1 #endif /* GL_ARB_shader_stencil_export */ #ifndef GL_ARB_shader_storage_buffer_object #define GL_ARB_shader_storage_buffer_object 1 #endif /* GL_ARB_shader_storage_buffer_object */ #ifndef GL_ARB_shader_subroutine #define GL_ARB_shader_subroutine 1 #endif /* GL_ARB_shader_subroutine */ #ifndef GL_ARB_shading_language_420pack #define GL_ARB_shading_language_420pack 1 #endif /* GL_ARB_shading_language_420pack */ #ifndef GL_ARB_shading_language_include #define GL_ARB_shading_language_include 1 #define GL_SHADER_INCLUDE_ARB 0x8DAE #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); #endif #endif /* GL_ARB_shading_language_include */ #ifndef GL_ARB_shading_language_packing #define GL_ARB_shading_language_packing 1 #endif /* GL_ARB_shading_language_packing */ #ifndef GL_ARB_sparse_texture #define GL_ARB_sparse_texture 1 #define GL_TEXTURE_SPARSE_ARB 0x91A6 #define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 #define GL_MIN_SPARSE_LEVEL_ARB 0x919B #define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 #define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A #define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); #endif #endif /* GL_ARB_sparse_texture */ #ifndef GL_ARB_stencil_texturing #define GL_ARB_stencil_texturing 1 #endif /* GL_ARB_stencil_texturing */ #ifndef GL_ARB_sync #define GL_ARB_sync 1 #endif /* GL_ARB_sync */ #ifndef GL_ARB_tessellation_shader #define GL_ARB_tessellation_shader 1 #endif /* GL_ARB_tessellation_shader */ #ifndef GL_ARB_texture_buffer_object_rgb32 #define GL_ARB_texture_buffer_object_rgb32 1 #endif /* GL_ARB_texture_buffer_object_rgb32 */ #ifndef GL_ARB_texture_buffer_range #define GL_ARB_texture_buffer_range 1 #endif /* GL_ARB_texture_buffer_range */ #ifndef GL_ARB_texture_compression_bptc #define GL_ARB_texture_compression_bptc 1 #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F #endif /* GL_ARB_texture_compression_bptc */ #ifndef GL_ARB_texture_compression_rgtc #define GL_ARB_texture_compression_rgtc 1 #endif /* GL_ARB_texture_compression_rgtc */ #ifndef GL_ARB_texture_cube_map_array #define GL_ARB_texture_cube_map_array 1 #define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F #endif /* GL_ARB_texture_cube_map_array */ #ifndef GL_ARB_texture_gather #define GL_ARB_texture_gather 1 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F #endif /* GL_ARB_texture_gather */ #ifndef GL_ARB_texture_mirror_clamp_to_edge #define GL_ARB_texture_mirror_clamp_to_edge 1 #endif /* GL_ARB_texture_mirror_clamp_to_edge */ #ifndef GL_ARB_texture_multisample #define GL_ARB_texture_multisample 1 #endif /* GL_ARB_texture_multisample */ #ifndef GL_ARB_texture_query_levels #define GL_ARB_texture_query_levels 1 #endif /* GL_ARB_texture_query_levels */ #ifndef GL_ARB_texture_query_lod #define GL_ARB_texture_query_lod 1 #endif /* GL_ARB_texture_query_lod */ #ifndef GL_ARB_texture_rg #define GL_ARB_texture_rg 1 #endif /* GL_ARB_texture_rg */ #ifndef GL_ARB_texture_rgb10_a2ui #define GL_ARB_texture_rgb10_a2ui 1 #endif /* GL_ARB_texture_rgb10_a2ui */ #ifndef GL_ARB_texture_stencil8 #define GL_ARB_texture_stencil8 1 #endif /* GL_ARB_texture_stencil8 */ #ifndef GL_ARB_texture_storage #define GL_ARB_texture_storage 1 #endif /* GL_ARB_texture_storage */ #ifndef GL_ARB_texture_storage_multisample #define GL_ARB_texture_storage_multisample 1 #endif /* GL_ARB_texture_storage_multisample */ #ifndef GL_ARB_texture_swizzle #define GL_ARB_texture_swizzle 1 #endif /* GL_ARB_texture_swizzle */ #ifndef GL_ARB_texture_view #define GL_ARB_texture_view 1 #endif /* GL_ARB_texture_view */ #ifndef GL_ARB_timer_query #define GL_ARB_timer_query 1 #endif /* GL_ARB_timer_query */ #ifndef GL_ARB_transform_feedback2 #define GL_ARB_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 #endif /* GL_ARB_transform_feedback2 */ #ifndef GL_ARB_transform_feedback3 #define GL_ARB_transform_feedback3 1 #endif /* GL_ARB_transform_feedback3 */ #ifndef GL_ARB_transform_feedback_instanced #define GL_ARB_transform_feedback_instanced 1 #endif /* GL_ARB_transform_feedback_instanced */ #ifndef GL_ARB_uniform_buffer_object #define GL_ARB_uniform_buffer_object 1 #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #endif /* GL_ARB_uniform_buffer_object */ #ifndef GL_ARB_vertex_array_bgra #define GL_ARB_vertex_array_bgra 1 #endif /* GL_ARB_vertex_array_bgra */ #ifndef GL_ARB_vertex_array_object #define GL_ARB_vertex_array_object 1 #endif /* GL_ARB_vertex_array_object */ #ifndef GL_ARB_vertex_attrib_64bit #define GL_ARB_vertex_attrib_64bit 1 #endif /* GL_ARB_vertex_attrib_64bit */ #ifndef GL_ARB_vertex_attrib_binding #define GL_ARB_vertex_attrib_binding 1 #endif /* GL_ARB_vertex_attrib_binding */ #ifndef GL_ARB_vertex_type_10f_11f_11f_rev #define GL_ARB_vertex_type_10f_11f_11f_rev 1 #endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ #ifndef GL_ARB_vertex_type_2_10_10_10_rev #define GL_ARB_vertex_type_2_10_10_10_rev 1 #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifndef GL_ARB_viewport_array #define GL_ARB_viewport_array 1 #endif /* GL_ARB_viewport_array */ #ifndef GL_KHR_debug #define GL_KHR_debug 1 #endif /* GL_KHR_debug */ #ifndef GL_KHR_texture_compression_astc_hdr #define GL_KHR_texture_compression_astc_hdr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #endif /* GL_KHR_texture_compression_astc_hdr */ #ifndef GL_KHR_texture_compression_astc_ldr #define GL_KHR_texture_compression_astc_ldr 1 #endif /* GL_KHR_texture_compression_astc_ldr */ #ifdef __cplusplus } #endif #endif desmume-0.9.11/src/utils/vfat.h0000755000000000000000000000165012467662066015023 0ustar rootroot/* Copyright (C) 2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _VFAT_H class EMUFILE; //THIS CLASS IS NOT THREAD SAFE!! SORRY SO SLOPPY class VFAT { public: VFAT(); ~VFAT(); bool build(const char* path, int extra_MB=0); EMUFILE* detach(); private: EMUFILE* file; }; #endif //_VFAT_H desmume-0.9.11/src/utils/datetime.cpp0000755000000000000000000000052712467662066016214 0ustar rootroot#include "datetime.h" const char* DateTime::monthnames[] = { NULL, "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; const int DateTime::daysmonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; const int DateTime::daysmonthleap[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; desmume-0.9.11/src/utils/emufat.h0000755000000000000000000006443212467662066015353 0ustar rootroot/* Copyright 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //based on Arduino SdFat Library ( http://code.google.com/p/sdfatlib/ ) //Copyright (C) 2009 by William Greiman //based on mkdosfs - utility to create FAT/MS-DOS filesystems //Copyright (C) 1991 Linus Torvalds //Copyright (C) 1992-1993 Remy Card //Copyright (C) 1993-1994 David Hudson //Copyright (C) 1998 H. Peter Anvin //Copyright (C) 1998-2005 Roman Hodek //based on libfat //Copyright (c) 2006 Michael "Chishm" Chisholm #ifndef EMUFAT_H #define EMUFAT_H #include "emufat_types.h" #include class EMUFILE; #define BOOTCODE_SIZE 448 #define BOOTCODE_FAT32_SIZE 420 // use the gnu style oflag in open() /** open() oflag for reading */ static const u8 EO_READ = 0X01; /** open() oflag - same as O_READ */ static const u8 EO_RDONLY = EO_READ; /** open() oflag for write */ static const u8 EO_WRITE = 0X02; /** open() oflag - same as O_WRITE */ static const u8 EO_WRONLY = EO_WRITE; /** open() oflag for reading and writing */ static const u8 EO_RDWR = (EO_READ | EO_WRITE); /** open() oflag mask for access modes */ static const u8 EO_ACCMODE = (EO_READ | EO_WRITE); /** The file offset shall be set to the end of the file prior to each write. */ static const u8 EO_APPEND = 0X04; /** synchronous writes - call sync() after each write */ static const u8 EO_SYNC = 0X08; /** create the file if nonexistent */ static const u8 EO_CREAT = 0X10; /** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ static const u8 EO_EXCL = 0X20; /** truncate the file to zero length */ static const u8 EO_TRUNC = 0X40; //Value for byte 510 of boot block or MBR static const u8 BOOTSIG0 = 0X55; //Value for byte 511 of boot block or MBR static const u8 BOOTSIG1 = 0XAA; static void (*dateTime_)(u16* date, u16* time) = NULL; #include "PACKED.h" //A partition table entry for a MBR formatted storage device. //The MBR partition table has four entries. struct __PACKED TPartitionRecord { //Boot Indicator . Indicates whether the volume is the active //partition. Legal values include: 0X00. Do not use for booting. //0X80 Active partition. u8 boot; //Head part of Cylinder-head-sector address of the first block in //the partition. Legal values are 0-255. Only used in old PC BIOS. u8 beginHead; struct { //Sector part of Cylinder-head-sector address of the first block in //the partition. Legal values are 1-63. Only used in old PC BIOS. u32 beginSector : 6; //High bits cylinder for first block in partition. u32 beginCylinderHigh : 2; }; //Combine beginCylinderLow with beginCylinderHigh. Legal values //are 0-1023. Only used in old PC BIOS. u8 beginCylinderLow; //Partition type. See defines that begin with PART_TYPE_ for //some Microsoft partition types. u8 type; //head part of cylinder-head-sector address of the last sector in the //partition. Legal values are 0-255. Only used in old PC BIOS. u8 endHead; struct { //Sector part of cylinder-head-sector address of the last sector in //the partition. Legal values are 1-63. Only used in old PC BIOS. u32 endSector : 6; // High bits of end cylinder u32 endCylinderHigh : 2; }; //Combine endCylinderLow with endCylinderHigh. Legal values //are 0-1023. Only used in old PC BIOS. u8 endCylinderLow; //Logical block address of the first block in the partition. u32 firstSector; //Length of the partition, in blocks. u32 totalSectors; }; //Master Boot Record: //The first block of a storage device that is formatted with a MBR. struct __PACKED TMasterBootRecord { //Code Area for master boot program. u8 codeArea[440]; //Optional WindowsNT disk signature. May contain more boot code. u32 diskSignature; //Usually zero but may be more boot code. u16 usuallyZero; //Partition tables. TPartitionRecord part[4]; //First MBR signature byte. Must be 0X55 u8 mbrSig0; //Second MBR signature byte. Must be 0XAA u8 mbrSig1; }; struct __PACKED msdos_volume_info { u8 drive_number; /* BIOS drive number */ u8 RESERVED; /* Unused */ u8 ext_boot_sign; /* 0x29 if fields below exist (DOS 3.3+) */ u32 volume_id; /* Volume ID number */ u8 volume_label[11];/* Volume label */ u8 fs_type[8]; /* Typically FAT12 or FAT16 */ }; //Boot sector for a FAT16 or FAT32 volume. struct __PACKED TFat32BootSector { //X86 jmp to boot program u8 jmpToBootCode[3]; //informational only - don't depend on it u8 oemName[8]; //Count of bytes per sector. This value may take on only the //following values: 512, 1024, 2048 or 4096 u16 bytesPerSector; //Number of sectors per allocation unit. This value must be a //power of 2 that is greater than 0. The legal values are //1, 2, 4, 8, 16, 32, 64, and 128. u8 sectorsPerCluster; //cluster_size //Number of sectors before the first FAT. //This value must not be zero. u16 reservedSectorCount; //The count of FAT data structures on the volume. This field should //always contain the value 2 for any FAT volume of any type. u8 fatCount; //For FAT12 and FAT16 volumes, this field contains the count of //32-byte directory entries in the root directory. For FAT32 volumes, //this field must be set to 0. For FAT12 and FAT16 volumes, this //value should always specify a count that when multiplied by 32 //results in a multiple of bytesPerSector. FAT16 volumes should //use the value 512. u16 rootDirEntryCount; //dir_entries //This field is the old 16-bit total count of sectors on the volume. //This count includes the count of all sectors in all four regions //of the volume. This field can be 0; if it is 0, then totalSectors32 //must be non-zero. For FAT32 volumes, this field must be 0. For //FAT12 and FAT16 volumes, this field contains the sector count, and //totalSectors32 is 0 if the total sector count fits //(is less than 0x10000). u16 totalSectors16; //This dates back to the old MS-DOS 1.x media determination and is //no longer usually used for anything. 0xF8 is the standard value //for fixed (non-removable) media. For removable media, 0xF0 is //frequently used. Legal values are 0xF0 or 0xF8-0xFF. u8 mediaType; //Count of sectors occupied by one FAT on FAT12/FAT16 volumes. //On FAT32 volumes this field must be 0, and sectorsPerFat32 //contains the FAT size count. u16 sectorsPerFat16; //Sectors per track for interrupt 0x13. Not used otherwise. u16 sectorsPerTrack; //Number of heads for interrupt 0x13. Not used otherwise. u16 headCount; //Count of hidden sectors preceding the partition that contains this //FAT volume. This field is generally only relevant for media //visible on interrupt 0x13. u32 hiddenSectors; //This field is the new 32-bit total count of sectors on the volume. //This count includes the count of all sectors in all four regions //of the volume. This field can be 0; if it is 0, then //totalSectors16 must be non-zero. u32 totalSectors32; union { struct __PACKED { msdos_volume_info vi; u8 boot_code[BOOTCODE_SIZE]; } oldfat; struct __PACKED { //Count of sectors occupied by one FAT on FAT32 volumes. u32 sectorsPerFat32; //fat32_length; /* sectors/FAT */ //This field is only defined for FAT32 media and does not exist on //FAT12 and FAT16 media. //Bits 0-3 -- Zero-based number of active FAT. // Only valid if mirroring is disabled. //Bits 4-6 -- Reserved. //Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. // -- 1 means only one FAT is active; it is the one referenced in bits 0-3. //Bits 8-15 -- Reserved. u16 fat32Flags;// flags; /* bit 8: fat mirroring, low 4: active fat */ //FAT32 version. High byte is major revision number. //Low byte is minor revision number. Only 0.0 define. u16 fat32Version;//version[2]; /* major, minor filesystem version */ //Cluster number of the first cluster of the root directory for FAT32. //This usually 2 but not required to be 2. u32 fat32RootCluster; //root_cluster; /* first cluster in root directory */ //Sector number of FSINFO structure in the reserved area of the //FAT32 volume. Usually 1. u16 fat32FSInfo;// info_sector; /* filesystem info sector */ //If non-zero, indicates the sector number in the reserved area //of the volume of a copy of the boot record. Usually 6. //No value other than 6 is recommended. u16 fat32BackBootBlock; //backup_boot; /* backup boot sector */ //Reserved for future expansion. Code that formats FAT32 volumes //should always set all of the bytes of this field to 0. u8 fat32Reserved[12]; //reserved2[6]; /* Unused */ msdos_volume_info vi; u8 boot_code[BOOTCODE_FAT32_SIZE]; } fat32; }; u8 boot_sign[2]; }; #include "PACKED_END.h" // End Of Chain values for FAT entries //FAT16 end of chain value used by Microsoft. static const u16 FAT16EOC = 0XFFFF; //Minimum value for FAT16 EOC. Use to test for EOC. static const u16 FAT16EOC_MIN = 0XFFF8; //FAT32 end of chain value used by Microsoft. static const u32 FAT32EOC = 0X0FFFFFFF; //Minimum value for FAT32 EOC. Use to test for EOC. static const u32 FAT32EOC_MIN = 0X0FFFFFF8; //Mask a for FAT32 entry. Entries are 28 bits. static const u32 FAT32MASK = 0X0FFFFFFF; //------------------------------------------------------------------------------ //\struct directoryEntry //\brief FAT short directory entry //Short means short 8.3 name, not the entry size. // //Date Format. A FAT directory entry date stamp is a 16-bit field that is //basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the //format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the //16-bit word): // //Bits 9-15: Count of years from 1980, valid value range 0-127 //inclusive (1980-2107). // //Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. //Bits 0-4: Day of month, valid value range 1-31 inclusive. //Time Format. A FAT directory entry time stamp is a 16-bit field that has //a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the //16-bit word, bit 15 is the MSB of the 16-bit word). // //Bits 11-15: Hours, valid value range 0-23 inclusive. // //Bits 5-10: Minutes, valid value range 0-59 inclusive. // //Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). // //The valid time range is from Midnight 00:00:00 to 23:59:58. struct TDirectoryEntry { //Short 8.3 name. //The first eight bytes contain the file name with blank fill. //The last three bytes contain the file extension with blank fill. u8 name[11]; //Entry attributes. //The upper two bits of the attribute byte are reserved and should //always be set to 0 when a file is created and never modified or //looked at after that. See defines that begin with DIR_ATT_. u8 attributes; //Reserved for use by Windows NT. Set value to 0 when a file is //created and never modify or look at it after that. u8 reservedNT; //The granularity of the seconds part of creationTime is 2 seconds //so this field is a count of tenths of a second and its valid //value range is 0-199 inclusive. (WHG note - seems to be hundredths) u8 creationTimeTenths; //Time file was created. u16 creationTime; //Date file was created. u16 creationDate; //Last access date. Note that there is no last access time, only //a date. This is the date of last read or write. In the case of //a write, this should be set to the same date as lastWriteDate. u16 lastAccessDate; //High word of this entry's first cluster number (always 0 for a //FAT12 or FAT16 volume). u16 firstClusterHigh; //Time of last write. File creation is considered a write. u16 lastWriteTime; // Date of last write. File creation is considered a write. u16 lastWriteDate; // Low word of this entry's first cluster number. u16 firstClusterLow; //32-bit unsigned holding this file's size in bytes. u32 fileSize; }; //escape for name[0] = 0xE5 static const u8 DIR_NAME_0XE5 = 0x05; //name[0] value for entry that is free after being "deleted" static const u8 DIR_NAME_DELETED = 0xE5; //name[0] value for entry that is free and no allocated entries follow static const u8 DIR_NAME_FREE = 0x00; //file is read-only static const u8 DIR_ATT_READ_ONLY = 0x01; //File should hidden in directory listings static const u8 DIR_ATT_HIDDEN = 0x02; //Entry is for a system file static const u8 DIR_ATT_SYSTEM = 0x04; //Directory entry contains the volume label static const u8 DIR_ATT_VOLUME_ID = 0x08; //Entry is for a directory static const u8 DIR_ATT_DIRECTORY = 0x10; //Old DOS archive bit for backup support static const u8 DIR_ATT_ARCHIVE = 0x20; //Test value for long name entry. Test is //(d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. static const u8 DIR_ATT_LONG_NAME = 0x0F; //Test mask for long name entry static const u8 DIR_ATT_LONG_NAME_MASK = 0x3F; //defined attribute bits static const u8 DIR_ATT_DEFINED_BITS = 0x3F; //Directory entry is part of a long name static inline u8 DIR_IS_LONG_NAME(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; } //Mask for file/subdirectory tests static const u8 DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); //Directory entry is for a file static inline u8 DIR_IS_FILE(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; } //Directory entry is for a subdirectory static inline u8 DIR_IS_SUBDIR(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; } //Directory entry is for a file or subdirectory static inline u8 DIR_IS_FILE_OR_SUBDIR(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; } // flags for timestamp /** set the file's last access date */ static const u8 T_ACCESS = 1; /** set the file's creation date and time */ static const u8 T_CREATE = 2; /** Set the file's write date and time */ static const u8 T_WRITE = 4; // values for type_ /** This SdFile has not been opened. */ static const u8 FAT_FILE_TYPE_CLOSED = 0; /** SdFile for a file */ static const u8 FAT_FILE_TYPE_NORMAL = 1; /** SdFile for a FAT16 root directory */ static const u8 FAT_FILE_TYPE_ROOT16 = 2; /** SdFile for a FAT32 root directory */ static const u8 FAT_FILE_TYPE_ROOT32 = 3; /** SdFile for a subdirectory */ static const u8 FAT_FILE_TYPE_SUBDIR = 4; /** Test value for directory type */ static const u8 FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16; /** date field for FAT directory entry */ static inline u16 FAT_DATE(u16 year, u8 month, u8 day) { return (year - 1980) << 9 | month << 5 | day; } /** year part of FAT directory date field */ static inline u16 FAT_YEAR(u16 fatDate) { return 1980 + (fatDate >> 9); } /** month part of FAT directory date field */ static inline u8 FAT_MONTH(u16 fatDate) { return (fatDate >> 5) & 0XF; } /** day part of FAT directory date field */ static inline u8 FAT_DAY(u16 fatDate) { return fatDate & 0X1F; } /** time field for FAT directory entry */ static inline u16 FAT_TIME(u8 hour, u8 minute, u8 second) { return hour << 11 | minute << 5 | second >> 1; } /** hour part of FAT directory time field */ static inline u8 FAT_HOUR(u16 fatTime) { return fatTime >> 11; } /** minute part of FAT directory time field */ static inline u8 FAT_MINUTE(u16 fatTime) { return(fatTime >> 5) & 0X3F; } /** second part of FAT directory time field */ static inline u8 FAT_SECOND(u16 fatTime) { return 2*(fatTime & 0X1F); } /** Default date for file timestamps is 1 Jan 2000 */ static const u16 FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; /** Default time for file timestamp is 1 am */ static const u16 FAT_DEFAULT_TIME = (1 << 11); //------------------------------------------------------ class EmuFat; class EmuFatVolume; class EmuFatFile; union cache_t { /** Used to access cached file data blocks. */ u8 data[512]; /** Used to access cached FAT16 entries. */ u16 fat16[256]; /** Used to access cached FAT32 entries. */ u32 fat32[128]; /** Used to access cached directory entries. */ TDirectoryEntry dir[16]; /** Used to access a cached MasterBoot Record. */ TMasterBootRecord mbr; /** Used to access to a cached FAT boot sector. */ TFat32BootSector fbs; }; class EmuFatFile { public: /** Create an instance of EmuFatFile. */ EmuFatFile() : type_(FAT_FILE_TYPE_CLOSED) {} bool writeError; void clearUnbufferedRead(void) { flags_ &= ~F_FILE_UNBUFFERED_READ; } void setUnbufferedRead(void) { if (isFile()) flags_ |= F_FILE_UNBUFFERED_READ; } u8 unbufferedRead(void) const { return flags_ & F_FILE_UNBUFFERED_READ; } u8 close(void); u8 contiguousRange(u32* bgnBlock, u32* endBlock); u8 createContiguous(EmuFatFile* dirFile, const char* fileName, u32 size); /** \return The current cluster number for a file or directory. */ u32 curCluster(void) const {return curCluster_;} /** \return The current position for a file or directory. */ u32 curPosition(void) const {return curPosition_;} u8 rmDir(void); u8 rmRfStar(void); s16 read(void) { u8 b; return read(&b, 1) == 1 ? b : -1; } s32 read(void* buf, u32 nbyte); s8 readDir(TDirectoryEntry* dir); s32 write(const void* buf, u32 nbyte); u8 openRoot(EmuFatVolume* vol); u8 timestamp(u8 flag, u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second); u8 sync(void); u8 makeDir(EmuFatFile* dir, const char* dirName); u8 open(EmuFatFile* dirFile, u16 index, u8 oflag); u8 open(EmuFatFile* dirFile, const char* fileName, u8 oflag); u8 remove(EmuFatFile* dirFile, const char* fileName); u8 remove(void); u8 dirEntry(TDirectoryEntry* dir); u8 seekCur(u32 pos) { return seekSet(curPosition_ + pos); } /** * Set the files current position to end of file. Useful to position * a file for append. See seekSet(). */ u8 seekEnd(void) {return seekSet(fileSize_);} u8 seekSet(u32 pos); u8 type(void) const {return type_;} u8 truncate(u32 size); u32 dirBlock(void) const {return dirBlock_;} /** \return Index of this file's directory in the block dirBlock. */ u8 dirIndex(void) const {return dirIndex_;} static void dirName(const TDirectoryEntry& dir, char* name); /** \return The total number of bytes in a file or directory. */ u32 fileSize(void) const {return fileSize_;} /** \return The first cluster number for a file or directory. */ u32 firstCluster(void) const {return firstCluster_;} /** \return True if this is a SdFile for a directory else false. */ u8 isDir(void) const {return type_ >= FAT_FILE_TYPE_MIN_DIR;} /** \return True if this is a SdFile for a file else false. */ u8 isFile(void) const {return type_ == FAT_FILE_TYPE_NORMAL;} /** \return True if this is a SdFile for an open file/directory else false. */ u8 isOpen(void) const {return type_ != FAT_FILE_TYPE_CLOSED;} /** \return True if this is a SdFile for a subdirectory else false. */ u8 isSubDir(void) const {return type_ == FAT_FILE_TYPE_SUBDIR;} /** \return True if this is a SdFile for the root directory. */ u8 isRoot(void) const { return type_ == FAT_FILE_TYPE_ROOT16 || type_ == FAT_FILE_TYPE_ROOT32; } /** Set the file's current position to zero. */ void rewind(void) { curPosition_ = curCluster_ = 0; } private: // bits defined in flags_ // should be 0XF static const u8 F_OFLAG = (EO_ACCMODE | EO_APPEND | EO_SYNC); // available bits static const u8 F_UNUSED = 0x30; // use unbuffered SD read static const u8 F_FILE_UNBUFFERED_READ = 0X40; // sync of directory entry required static const u8 F_FILE_DIR_DIRTY = 0x80; // make sure F_OFLAG is ok void ctassert() { CTASSERT(!((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG)); } // private data u8 flags_; // See above for definition of flags_ bits u8 type_; // type of file see above for values u32 curCluster_; // cluster for current file position u32 curPosition_; // current file position in bytes from beginning u32 dirBlock_; // SD block that contains directory entry for file u8 dirIndex_; // index of entry in dirBlock 0 <= dirIndex_ <= 0XF u32 fileSize_; // file size in bytes u32 firstCluster_; // first cluster of file EmuFatVolume* vol_; // volume where file is located // private functions u8 addCluster(void); u8 addDirCluster(void); TDirectoryEntry* cacheDirEntry(u8 action); static u8 make83Name(const char* str, u8* name); u8 openCachedEntry(u8 cacheIndex, u8 oflags); TDirectoryEntry* readDirCache(void); }; class EmuFatVolume { public: EmuFatVolume() :allocSearchStart_(2), fatType_(0) {} //Initialize a FAT volume. Try partition one first then try super floppy format. //dev The Sd2Card where the volume is located. //return The value one, true, is returned for success and //the value zero, false, is returned for failure. Reasons for //failure include not finding a valid partition, not finding a valid //FAT file system or an I/O error. bool init(EmuFat* dev) { return init(dev, 1) ? true : init(dev, 0);} bool init(EmuFat* dev, u8 part); bool format(u32 sectors); bool formatNew(u32 sectors); // inline functions that return volume info //The volume's cluster size in blocks. u8 blocksPerCluster(void) const {return blocksPerCluster_;} //The number of blocks in one FAT. u32 blocksPerFat(void) const {return blocksPerFat_;} //The total number of clusters in the volume. // u32 clusterCount(void) const {return clusterCount_;} //The shift count required to multiply by blocksPerCluster. // u8 clusterSizeShift(void) const {return clusterSizeShift_;} //The logical block number for the start of file data. // u32 dataStartBlock(void) const {return dataStartBlock_;} //The number of FAT structures on the volume. // u8 fatCount(void) const {return fatCount_;} //The logical block number for the start of the first FAT. // u32 fatStartBlock(void) const {return fatStartBlock_;} //The FAT type of the volume. Values are 12, 16 or 32. // u8 fatType(void) const {return fatType_;} //The number of entries in the root directory for FAT16 volumes. // u32 rootDirEntryCount(void) const {return rootDirEntryCount_;} //The logical block number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes. // u32 rootDirStart(void) const {return rootDirStart_;} EmuFat* dev_; private: friend class EmuFatFile; u32 allocSearchStart_; // start cluster for alloc search u8 blocksPerCluster_; // cluster size in blocks u32 blocksPerFat_; // FAT size in blocks u32 clusterCount_; // clusters in one FAT u8 clusterSizeShift_; // shift to convert cluster count to block count u32 dataStartBlock_; // first data block number u8 fatCount_; // number of FATs on volume u32 fatStartBlock_; // start block for first FAT u8 fatType_; // volume type (12, 16, OR 32) u16 rootDirEntryCount_; // number of entries in FAT16 root dir u32 rootDirStart_; // root start block for FAT16, cluster for FAT32 u8 allocContiguous(u32 count, u32* curCluster); u8 blockOfCluster(u32 position) const { return (position >> 9) & (blocksPerCluster_ - 1);} u32 clusterStartBlock(u32 cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} u32 blockNumber(u32 cluster, u32 position) const { return clusterStartBlock(cluster) + blockOfCluster(position);} u8 fatGet(u32 cluster, u32* value) const; u8 fatPut(u32 cluster, u32 value); u8 fatPutEOC(u32 cluster) { return fatPut(cluster, 0x0FFFFFFF); } u8 chainSize(u32 beginCluster, u32* size) const; u8 freeChain(u32 cluster); u8 isEOC(u32 cluster) const { return cluster >= (fatType_ == 16 ? FAT16EOC_MIN : FAT32EOC_MIN); } u8 readData(u32 block, u16 offset, u16 count, u8* dst); u8 writeBlock(u32 block, const u8* dst); }; class EmuFat { public: EmuFat(const char* fname, bool readonly=false); EmuFat(); EmuFat(EMUFILE* fileNotToDelete); virtual ~EmuFat(); private: EMUFILE* m_pFile; bool m_readonly, m_owns; friend class EmuFatVolume; friend class EmuFatFile; // value for action argument in cacheRawBlock to indicate read from cache static const u8 CACHE_FOR_READ = 0; // value for action argument in cacheRawBlock to indicate cache dirty static const u8 CACHE_FOR_WRITE = 1; struct Cache { Cache() : cacheBlockNumber_(0xFFFFFFFF) , cacheDirty_(0) // cacheFlush() will write block if true , cacheMirrorBlock_(0) // mirror block for second FAT {} cache_t cacheBuffer_; // 512 byte cache for device blocks u32 cacheBlockNumber_; // Logical number of block in the cache u8 cacheDirty_; // cacheFlush() will write block if true u32 cacheMirrorBlock_; // block number for mirror FAT } cache_; u8 cacheRawBlock(u32 blockNumber, u8 action); void cacheSetDirty() {cache_.cacheDirty_ |= CACHE_FOR_WRITE;} u8 cacheZeroBlock(u32 blockNumber); u8 cacheFlush(); void cacheReset(); //IO functions: u8 readBlock(u32 block, u8* dst); u8 writeBlock(u32 blockNumber, const u8* src); u8 readData(u32 block, u16 offset, u16 count, u8* dst); void truncate(u32 size); }; #endif //EMUFAT_H desmume-0.9.11/src/bios.h0000755000000000000000000000150112467662066013652 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef BIOS_H #define BIOS_H #include "types.h" extern u32 (* ARM_swi_tab[2][32])(); extern const char* ARM_swi_names[2][32]; #endif desmume-0.9.11/src/cp15.h0000755000000000000000000001044312467662066013473 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef __CP15_H__ #define __CP15_H__ #include #include "types.h" class EMUFILE; #define CP15_ACCESS_WRITE 0 #define CP15_ACCESS_READ 2 #define CP15_ACCESS_EXECUTE 4 #define CP15_ACCESS_WRITEUSR CP15_ACCESS_WRITE #define CP15_ACCESS_WRITESYS 1 #define CP15_ACCESS_READUSR CP15_ACCESS_READ #define CP15_ACCESS_READSYS 3 #define CP15_ACCESS_EXECUSR CP15_ACCESS_EXECUTE #define CP15_ACCESS_EXECSYS 5 #define CP15_SIZEBINARY(val) (1 << (CP15_SIZEIDENTIFIER(val)+1)) #define CP15_SIZEIDENTIFIER(val) ((((val) >> 1) & 0x1F)) #define CP15_MASKFROMREG(val) (~((CP15_SIZEBINARY(val)-1) | 0x3F)) #define CP15_SETFROMREG(val) ((val) & CP15_MASKFROMREG(val)) struct armcp15_t { public: u32 IDCode; u32 cacheType; u32 TCMSize; u32 ctrl; u32 DCConfig; u32 ICConfig; u32 writeBuffCtrl; u32 und; u32 DaccessPerm; u32 IaccessPerm; u32 protectBaseSize[8]; u32 cacheOp; u32 DcacheLock; u32 IcacheLock; u32 ITCMRegion; u32 DTCMRegion; u32 processID; u32 RAM_TAG; u32 testState; u32 cacheDbg; /* calculated bitmasks for the regions to decide rights uppon */ /* calculation is done in the MCR instead of on mem access for performance */ u32 regionWriteMask_USR[8] ; u32 regionWriteMask_SYS[8] ; u32 regionReadMask_USR[8] ; u32 regionReadMask_SYS[8] ; u32 regionExecuteMask_USR[8] ; u32 regionExecuteMask_SYS[8] ; u32 regionWriteSet_USR[8] ; u32 regionWriteSet_SYS[8] ; u32 regionReadSet_USR[8] ; u32 regionReadSet_SYS[8] ; u32 regionExecuteSet_USR[8] ; u32 regionExecuteSet_SYS[8] ; void setSingleRegionAccess(u8 num, u32 mask, u32 set); void maskPrecalc(); public: armcp15_t() : IDCode(0x41059461), cacheType(0x0F0D2112), TCMSize(0x00140180), ctrl(0x00012078), DCConfig(0), ICConfig(0), writeBuffCtrl(0), und(0), DaccessPerm(0x22222222), IaccessPerm(0x22222222), cacheOp(0), DcacheLock(0), IcacheLock(0), ITCMRegion(0x0C), DTCMRegion(0x0080000A), processID(0), RAM_TAG(0), testState(0), cacheDbg(0) { //printf("CP15 Reset\n"); memset(&protectBaseSize[0], 0, sizeof(protectBaseSize)); memset(®ionWriteMask_USR[0], 0, sizeof(regionWriteMask_USR)); memset(®ionWriteMask_SYS[0], 0, sizeof(regionWriteMask_SYS)); memset(®ionReadMask_USR[0], 0, sizeof(regionReadMask_USR)); memset(®ionReadMask_SYS[0], 0, sizeof(regionReadMask_SYS)); memset(®ionExecuteMask_USR[0], 0, sizeof(regionExecuteMask_USR)); memset(®ionExecuteMask_SYS[0], 0, sizeof(regionExecuteMask_SYS)); memset(®ionWriteSet_USR[0], 0, sizeof(regionWriteSet_USR)); memset(®ionWriteSet_SYS[0], 0, sizeof(regionWriteSet_SYS)); memset(®ionReadSet_USR[0], 0, sizeof(regionReadSet_USR)); memset(®ionReadSet_SYS[0], 0, sizeof(regionReadSet_SYS)); memset(®ionExecuteSet_USR[0], 0, sizeof(regionExecuteSet_USR)); memset(®ionExecuteSet_SYS[0], 0, sizeof(regionExecuteSet_SYS)); } BOOL dataProcess(u8 CRd, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2); BOOL load(u8 CRd, u8 adr); BOOL store(u8 CRd, u8 adr); BOOL moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2); BOOL moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2); BOOL isAccessAllowed(u32 address,u32 access); // savestate void saveone(EMUFILE* os); bool loadone(EMUFILE* is); }; extern armcp15_t cp15; #endif /* __CP15_H__*/ desmume-0.9.11/src/saves.cpp0000755000000000000000000011005112467662066014373 0ustar rootroot/* Copyright (C) 2006 Normmatt Copyright (C) 2006 Theo Berkau Copyright (C) 2007 Pascal Giard Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifdef HAVE_LIBZ #include #endif #include #include #include #include #include #include #include #include "common.h" #include "armcpu.h" #include "registers.h" #include "FIFO.h" #include "driver.h" #include "saves.h" #include "MMU.h" #include "NDSSystem.h" #include "render3D.h" #include "cp15.h" #include "GPU.h" #include "GPU_osd.h" #include "version.h" #include "readwrite.h" #include "gfx3d.h" #include "movie.h" #include "mic.h" #include "MMU_timing.h" #include "slot1.h" #include "slot2.h" #include "SPU.h" #include "wifi.h" #include "path.h" #ifdef HOST_WINDOWS #include "windows/main.h" #endif int lastSaveState = 0; //Keeps track of last savestate used for quick save/load functions //void*v is actually a void** which will be indirected before reading //since this isnt supported right now, it is declared in here to make things compile #define SS_INDIRECT 0x80000000 u32 _DESMUME_version = EMU_DESMUME_VERSION_NUMERIC(); u32 svn_rev = EMU_DESMUME_SUBVERSION_NUMERIC(); s64 save_time = 0; NDS_SLOT1_TYPE slot1Type = NDS_SLOT1_RETAIL_AUTO; NDS_SLOT2_TYPE slot2Type = NDS_SLOT2_AUTO; savestates_t savestates[NB_STATES]; #define SAVESTATE_VERSION 12 static const char* magic = "DeSmuME SState\0"; //a savestate chunk loader can set this if it wants to permit a silent failure (for compatibility) static bool SAV_silent_fail_flag; SFORMAT SF_NDS_INFO[]={ { "GINF", 1, sizeof(gameInfo.header), &gameInfo.header}, { "GRSZ", 1, 4, &gameInfo.romsize}, { "DVMJ", 1, 1, (void*)&DESMUME_VERSION_MAJOR}, { "DVMI", 1, 1, (void*)&DESMUME_VERSION_MINOR}, { "DSBD", 1, 1, (void*)&DESMUME_VERSION_BUILD}, { "GREV", 1, 4, &svn_rev}, { "GTIM", 1, 8, &save_time}, { 0 } }; SFORMAT SF_ARM7[]={ { "7INS", 4, 1, &NDS_ARM7.instruction }, { "7INA", 4, 1, &NDS_ARM7.instruct_adr }, { "7INN", 4, 1, &NDS_ARM7.next_instruction }, { "7REG", 4,16, NDS_ARM7.R }, { "7CPS", 4, 1, &NDS_ARM7.CPSR }, { "7SPS", 4, 1, &NDS_ARM7.SPSR }, { "7DUS", 4, 1, &NDS_ARM7.R13_usr }, { "7EUS", 4, 1, &NDS_ARM7.R14_usr }, { "7DSV", 4, 1, &NDS_ARM7.R13_svc }, { "7ESV", 4, 1, &NDS_ARM7.R14_svc }, { "7DAB", 4, 1, &NDS_ARM7.R13_abt }, { "7EAB", 4, 1, &NDS_ARM7.R14_abt }, { "7DUN", 4, 1, &NDS_ARM7.R13_und }, { "7EUN", 4, 1, &NDS_ARM7.R14_und }, { "7DIR", 4, 1, &NDS_ARM7.R13_irq }, { "7EIR", 4, 1, &NDS_ARM7.R14_irq }, { "78FI", 4, 1, &NDS_ARM7.R8_fiq }, { "79FI", 4, 1, &NDS_ARM7.R9_fiq }, { "7AFI", 4, 1, &NDS_ARM7.R10_fiq }, { "7BFI", 4, 1, &NDS_ARM7.R11_fiq }, { "7CFI", 4, 1, &NDS_ARM7.R12_fiq }, { "7DFI", 4, 1, &NDS_ARM7.R13_fiq }, { "7EFI", 4, 1, &NDS_ARM7.R14_fiq }, { "7SVC", 4, 1, &NDS_ARM7.SPSR_svc }, { "7ABT", 4, 1, &NDS_ARM7.SPSR_abt }, { "7UND", 4, 1, &NDS_ARM7.SPSR_und }, { "7IRQ", 4, 1, &NDS_ARM7.SPSR_irq }, { "7FIQ", 4, 1, &NDS_ARM7.SPSR_fiq }, { "7int", 4, 1, &NDS_ARM7.intVector }, { "7LDT", 1, 1, &NDS_ARM7.LDTBit }, { "7Wai", 4, 1, &NDS_ARM7.waitIRQ }, { "7hef", 4, 1, &NDS_ARM7.halt_IE_and_IF }, { "7iws", 1, 1, &NDS_ARM7.intrWaitARM_state }, { 0 } }; SFORMAT SF_ARM9[]={ { "9INS", 4, 1, &NDS_ARM9.instruction}, { "9INA", 4, 1, &NDS_ARM9.instruct_adr}, { "9INN", 4, 1, &NDS_ARM9.next_instruction}, { "9REG", 4,16, NDS_ARM9.R}, { "9CPS", 4, 1, &NDS_ARM9.CPSR}, { "9SPS", 4, 1, &NDS_ARM9.SPSR}, { "9DUS", 4, 1, &NDS_ARM9.R13_usr}, { "9EUS", 4, 1, &NDS_ARM9.R14_usr}, { "9DSV", 4, 1, &NDS_ARM9.R13_svc}, { "9ESV", 4, 1, &NDS_ARM9.R14_svc}, { "9DAB", 4, 1, &NDS_ARM9.R13_abt}, { "9EAB", 4, 1, &NDS_ARM9.R14_abt}, { "9DUN", 4, 1, &NDS_ARM9.R13_und}, { "9EUN", 4, 1, &NDS_ARM9.R14_und}, { "9DIR", 4, 1, &NDS_ARM9.R13_irq}, { "9EIR", 4, 1, &NDS_ARM9.R14_irq}, { "98FI", 4, 1, &NDS_ARM9.R8_fiq}, { "99FI", 4, 1, &NDS_ARM9.R9_fiq}, { "9AFI", 4, 1, &NDS_ARM9.R10_fiq}, { "9BFI", 4, 1, &NDS_ARM9.R11_fiq}, { "9CFI", 4, 1, &NDS_ARM9.R12_fiq}, { "9DFI", 4, 1, &NDS_ARM9.R13_fiq}, { "9EFI", 4, 1, &NDS_ARM9.R14_fiq}, { "9SVC", 4, 1, &NDS_ARM9.SPSR_svc}, { "9ABT", 4, 1, &NDS_ARM9.SPSR_abt}, { "9UND", 4, 1, &NDS_ARM9.SPSR_und}, { "9IRQ", 4, 1, &NDS_ARM9.SPSR_irq}, { "9FIQ", 4, 1, &NDS_ARM9.SPSR_fiq}, { "9int", 4, 1, &NDS_ARM9.intVector}, { "9LDT", 1, 1, &NDS_ARM9.LDTBit}, { "9Wai", 4, 1, &NDS_ARM9.waitIRQ}, { "9hef", 4, 1, &NDS_ARM9.halt_IE_and_IF }, { "9iws", 1, 1, &NDS_ARM9.intrWaitARM_state }, { 0 } }; SFORMAT SF_MEM[]={ { "ITCM", 1, sizeof(MMU.ARM9_ITCM), MMU.ARM9_ITCM}, { "DTCM", 1, sizeof(MMU.ARM9_DTCM), MMU.ARM9_DTCM}, //for legacy purposes, WRAX is a separate variable. shouldnt be a problem. { "WRAM", 1, 0x400000, MMU.MAIN_MEM}, { "WRAX", 1, 0x400000, MMU.MAIN_MEM+0x400000}, //NOTE - this is not as large as the allocated memory. //the memory is overlarge due to the way our memory map system is setup //but there are actually no more registers than this { "9REG", 1, 0x2000, MMU.ARM9_REG}, { "VMEM", 1, sizeof(MMU.ARM9_VMEM), MMU.ARM9_VMEM}, { "OAMS", 1, sizeof(MMU.ARM9_OAM), MMU.ARM9_OAM}, //this size is specially chosen to avoid saving the blank space at the end { "LCDM", 1, 0xA4000, MMU.ARM9_LCD}, { 0 } }; SFORMAT SF_NDS[]={ { "_WCY", 4, 1, &nds.wifiCycle}, { "_TCY", 8, 8, nds.timerCycle}, { "_VCT", 4, 1, &nds.VCount}, { "_OLD", 4, 1, &nds.old}, { "_TPX", 2, 1, &nds.adc_touchX}, { "_TPY", 2, 1, &nds.adc_touchY}, { "_TPC", 2, 1, &nds.adc_jitterctr}, { "_STX", 2, 1, &nds.scr_touchX}, { "_STY", 2, 1, &nds.scr_touchY}, { "_TPB", 4, 1, &nds.isTouch}, { "_IFB", 4, 1, &nds.isFakeBooted}, { "_DBG", 4, 1, &nds._DebugConsole}, { "_ENS", 4, 1, &nds.ensataEmulation}, { "_TYP", 4, 1, &nds.ConsoleType}, { "_ENH", 4, 1, &nds.ensataHandshake}, { "_ENI", 4, 1, &nds.ensataIpcSyncCounter}, { "_SLP", 4, 1, &nds.sleeping}, { "_FBS", 4, 1, &nds.freezeBus}, { "_CEJ", 4, 1, &nds.cardEjected}, { "_PDL", 2, 1, &nds.paddle}, { "_P00", 1, 1, &nds.power1.lcd}, { "_P01", 1, 1, &nds.power1.gpuMain}, { "_P02", 1, 1, &nds.power1.gfx3d_render}, { "_P03", 1, 1, &nds.power1.gfx3d_geometry}, { "_P04", 1, 1, &nds.power1.gpuSub}, { "_P05", 1, 1, &nds.power1.dispswap}, { "_P06", 1, 1, &nds.power2.speakers}, { "_P07", 1, 1, &nds.power2.wifi}, { 0 } }; SFORMAT SF_MMU[]={ { "M7BI", 1, sizeof(MMU.ARM7_BIOS), MMU.ARM7_BIOS}, { "M7ER", 1, sizeof(MMU.ARM7_ERAM), MMU.ARM7_ERAM}, { "M7RG", 1, sizeof(MMU.ARM7_REG), MMU.ARM7_REG}, { "M7WI", 1, sizeof(MMU.ARM7_WIRAM), MMU.ARM7_WIRAM}, { "MSWI", 1, sizeof(MMU.SWIRAM), MMU.SWIRAM}, { "M9RW", 1, 1, &MMU.ARM9_RW_MODE}, { "MDTC", 4, 1, &MMU.DTCMRegion}, { "MITC", 4, 1, &MMU.ITCMRegion}, { "MTIM", 2, 8, MMU.timer}, { "MTMO", 4, 8, MMU.timerMODE}, { "MTON", 4, 8, MMU.timerON}, { "MTRN", 4, 8, MMU.timerRUN}, { "MTRL", 2, 8, MMU.timerReload}, { "MIME", 4, 2, MMU.reg_IME}, { "MIE_", 4, 2, MMU.reg_IE}, { "MIF_", 4, 2, MMU.reg_IF_bits}, { "MIFP", 4, 2, MMU.reg_IF_pending}, { "MGXC", 8, 1, &MMU.gfx3dCycles}, { "M_SX", 1, 2, &MMU.SPI_CNT}, { "M_SC", 1, 2, &MMU.SPI_CMD}, { "MASX", 1, 2, &MMU.AUX_SPI_CNT}, //{ "MASC", 1, 2, &MMU.AUX_SPI_CMD}, //zero 20-aug-2013 - this seems pointless { "MWRA", 1, 2, &MMU.WRAMCNT}, { "MDV1", 4, 1, &MMU.divRunning}, { "MDV2", 8, 1, &MMU.divResult}, { "MDV3", 8, 1, &MMU.divMod}, { "MDV5", 8, 1, &MMU.divCycles}, { "MSQ1", 4, 1, &MMU.sqrtRunning}, { "MSQ2", 4, 1, &MMU.sqrtResult}, { "MSQ4", 8, 1, &MMU.sqrtCycles}, //begin memory chips { "BUCO", 1, 1, &MMU.fw.com}, { "BUAD", 4, 1, &MMU.fw.addr}, { "BUAS", 1, 1, &MMU.fw.addr_shift}, { "BUAZ", 1, 1, &MMU.fw.addr_size}, { "BUWE", 4, 1, &MMU.fw.write_enable}, { "BUWR", 4, 1, &MMU.fw.writeable_buffer}, //end memory chips //TODO:slot-1 plugins { "GC0T", 4, 1, &MMU.dscard[0].transfer_count}, { "GC0M", 4, 1, &MMU.dscard[0].mode}, { "GC1T", 4, 1, &MMU.dscard[1].transfer_count}, { "GC1M", 4, 1, &MMU.dscard[1].mode}, //{ "MCHT", 4, 1, &MMU.CheckTimers}, //{ "MCHD", 4, 1, &MMU.CheckDMAs}, //fifos { "F0TH", 1, 1, &ipc_fifo[0].head}, { "F0TL", 1, 1, &ipc_fifo[0].tail}, { "F0SZ", 1, 1, &ipc_fifo[0].size}, { "F0BF", 4, 16, ipc_fifo[0].buf}, { "F1TH", 1, 1, &ipc_fifo[1].head}, { "F1TL", 1, 1, &ipc_fifo[1].tail}, { "F1SZ", 1, 1, &ipc_fifo[1].size}, { "F1BF", 4, 16, ipc_fifo[1].buf}, { "FDHD", 4, 1, &disp_fifo.head}, { "FDTL", 4, 1, &disp_fifo.tail}, { "FDBF", 4, 0x6000, disp_fifo.buf}, { "PMCN", 1, 1, &MMU.powerMan_CntReg}, { "PMCW", 4, 1, &MMU.powerMan_CntRegWritten}, { "PMCR", 1, 5, &MMU.powerMan_Reg}, { "MR3D", 4, 1, &MMU.reg_DISP3DCNT_bits}, { 0 } }; SFORMAT SF_MOVIE[]={ { "FRAC", 4, 1, &currFrameCounter}, { "LAGC", 4, 1, &TotalLagFrames}, { 0 } }; // TODO: integrate the new wifi state variables once everything is settled SFORMAT SF_WIFI[]={ { "W000", 4, 1, &wifiMac.powerOn}, { "W010", 4, 1, &wifiMac.powerOnPending}, { "W020", 2, 1, &wifiMac.rfStatus}, { "W030", 2, 1, &wifiMac.rfPins}, { "W040", 2, 1, &wifiMac.IE}, { "W050", 2, 1, &wifiMac.IF}, { "W060", 2, 1, &wifiMac.macMode}, { "W070", 2, 1, &wifiMac.wepMode}, { "W080", 4, 1, &wifiMac.WEP_enable}, { "W100", 2, 1, &wifiMac.TXCnt}, { "W120", 2, 1, &wifiMac.TXStat}, { "W200", 2, 1, &wifiMac.RXCnt}, { "W210", 2, 1, &wifiMac.RXCheckCounter}, { "W220", 1, 6, &wifiMac.mac.bytes}, { "W230", 1, 6, &wifiMac.bss.bytes}, { "W240", 2, 1, &wifiMac.aid}, { "W250", 2, 1, &wifiMac.pid}, { "W260", 2, 1, &wifiMac.retryLimit}, { "W270", 4, 1, &wifiMac.crystalEnabled}, { "W280", 8, 1, &wifiMac.usec}, { "W290", 4, 1, &wifiMac.usecEnable}, { "W300", 8, 1, &wifiMac.ucmp}, { "W310", 4, 1, &wifiMac.ucmpEnable}, { "W320", 2, 1, &wifiMac.eCount}, { "W330", 4, 1, &wifiMac.eCountEnable}, { "WR00", 4, 1, &wifiMac.RF.CFG1.val}, { "WR01", 4, 1, &wifiMac.RF.IFPLL1.val}, { "WR02", 4, 1, &wifiMac.RF.IFPLL2.val}, { "WR03", 4, 1, &wifiMac.RF.IFPLL3.val}, { "WR04", 4, 1, &wifiMac.RF.RFPLL1.val}, { "WR05", 4, 1, &wifiMac.RF.RFPLL2.val}, { "WR06", 4, 1, &wifiMac.RF.RFPLL3.val}, { "WR07", 4, 1, &wifiMac.RF.RFPLL4.val}, { "WR08", 4, 1, &wifiMac.RF.CAL1.val}, { "WR09", 4, 1, &wifiMac.RF.TXRX1.val}, { "WR10", 4, 1, &wifiMac.RF.PCNT1.val}, { "WR11", 4, 1, &wifiMac.RF.PCNT2.val}, { "WR12", 4, 1, &wifiMac.RF.VCOT1.val}, { "W340", 1, 105, &wifiMac.BB.data[0]}, { "W350", 2, 1, &wifiMac.rfIOCnt.val}, { "W360", 2, 1, &wifiMac.rfIOStatus.val}, { "W370", 4, 1, &wifiMac.rfIOData.val}, { "W380", 2, 1, &wifiMac.bbIOCnt.val}, { "W400", 2, 0x1000, &wifiMac.RAM[0]}, { "W410", 2, 1, &wifiMac.RXRangeBegin}, { "W420", 2, 1, &wifiMac.RXRangeEnd}, { "W430", 2, 1, &wifiMac.RXWriteCursor}, { "W460", 2, 1, &wifiMac.RXReadCursor}, { "W470", 2, 1, &wifiMac.RXUnits}, { "W480", 2, 1, &wifiMac.RXBufCount}, { "W490", 2, 1, &wifiMac.CircBufReadAddress}, { "W500", 2, 1, &wifiMac.CircBufWriteAddress}, { "W510", 2, 1, &wifiMac.CircBufRdEnd}, { "W520", 2, 1, &wifiMac.CircBufRdSkip}, { "W530", 2, 1, &wifiMac.CircBufWrEnd}, { "W540", 2, 1, &wifiMac.CircBufWrSkip}, { "W580", 2, 0x800, &wifiMac.IOPorts[0]}, { "W590", 2, 1, &wifiMac.randomSeed}, { 0 } }; extern SFORMAT SF_RTC[]; static u8 reserveVal = 0; SFORMAT reserveChunks[] = { { "RESV", 1, 1, &reserveVal}, { 0 } }; static bool s_slot1_loadstate(EMUFILE* is, int size) { u32 version = is->read32le(); //version 0: if(version >= 0) { u8 slotID = is->read32le(); slot1Type = NDS_SLOT1_RETAIL_AUTO; if (version >= 1) slot1_getTypeByID(slotID, slot1Type); slot1_Change(slot1Type); EMUFILE_MEMORY temp; is->readMemoryStream(&temp); temp.fseek(0,SEEK_SET); slot1_Loadstate(&temp); } return true; } static void s_slot1_savestate(EMUFILE* os) { u32 version = 1; os->write32le(version); u8 slotID = (u8)slot1_List[slot1_GetSelectedType()]->info()->id(); os->write32le(slotID); EMUFILE_MEMORY temp; slot1_Savestate(&temp); os->writeMemoryStream(&temp); } static bool s_slot2_loadstate(EMUFILE* is, int size) { u32 version = is->read32le(); //version 0: if(version >= 0) { slot2Type = NDS_SLOT2_AUTO; u8 slotID = is->read32le(); if (version == 0) slot2_getTypeByID(slotID, slot2Type); slot2_Change(slot2Type); EMUFILE_MEMORY temp; is->readMemoryStream(&temp); temp.fseek(0,SEEK_SET); slot2_Loadstate(&temp); } return true; } static void s_slot2_savestate(EMUFILE* os) { u32 version = 0; os->write32le(version); //version 0: u8 slotID = (u8)slot2_List[slot2_GetSelectedType()]->info()->id(); os->write32le(slotID); EMUFILE_MEMORY temp; slot2_Savestate(&temp); os->writeMemoryStream(&temp); } static void mmu_savestate(EMUFILE* os) { u32 version = 8; write32le(version,os); //version 2: MMU_new.backupDevice.save_state(os); //version 3: MMU_new.gxstat.savestate(os); for(int i=0;i<2;i++) for(int j=0;j<4;j++) MMU_new.dma[i][j].savestate(os); MMU_timing.arm9codeFetch.savestate(os, version); MMU_timing.arm9dataFetch.savestate(os, version); MMU_timing.arm7codeFetch.savestate(os, version); MMU_timing.arm7dataFetch.savestate(os, version); MMU_timing.arm9codeCache.savestate(os, version); MMU_timing.arm9dataCache.savestate(os, version); //version 4: MMU_new.sqrt.savestate(os); MMU_new.div.savestate(os); //version 6: MMU_new.dsi_tsc.save_state(os); //version 8: os->write32le(MMU.fw.size); os->fwrite(MMU.fw.data,MMU.fw.size); } static bool mmu_loadstate(EMUFILE* is, int size) { //read version u32 version; if(read32le(&version,is) != 1) return false; if(version == 0 || version == 1) { u32 bupmem_size; u32 addr_size; if(version == 0) { //version 0 was buggy and didnt save the type. //it would silently fail if there was a size mismatch SAV_silent_fail_flag = true; if(read32le(&bupmem_size,is) != 1) return false; //if(bupmem_size != MMU.bupmem.size) return false; //mismatch between current initialized and saved size addr_size = BackupDevice::addr_size_for_old_save_size(bupmem_size); } else if(version == 1) { //version 1 reinitializes the save system with the type that was saved u32 bupmem_type; if(read32le(&bupmem_type,is) != 1) return false; if(read32le(&bupmem_size,is) != 1) return false; addr_size = BackupDevice::addr_size_for_old_save_type(bupmem_type); if(addr_size == 0xFFFFFFFF) addr_size = BackupDevice::addr_size_for_old_save_size(bupmem_size); } if(addr_size == 0xFFFFFFFF) return false; u8* temp = new u8[bupmem_size]; is->fread((char*)temp,bupmem_size); MMU_new.backupDevice.load_old_state(addr_size,temp,bupmem_size); delete[] temp; if(is->fail()) return false; } if(version < 2) return true; bool ok = MMU_new.backupDevice.load_state(is); if(version < 3) return ok; ok &= MMU_new.gxstat.loadstate(is); for(int i=0;i<2;i++) for(int j=0;j<4;j++) ok &= MMU_new.dma[i][j].loadstate(is); ok &= MMU_timing.arm9codeFetch.loadstate(is, version); ok &= MMU_timing.arm9dataFetch.loadstate(is, version); ok &= MMU_timing.arm7codeFetch.loadstate(is, version); ok &= MMU_timing.arm7dataFetch.loadstate(is, version); ok &= MMU_timing.arm9codeCache.loadstate(is, version); ok &= MMU_timing.arm9dataCache.loadstate(is, version); if(version < 4) return ok; ok &= MMU_new.sqrt.loadstate(is,version); ok &= MMU_new.div.loadstate(is,version); //to prevent old savestates from confusing IF bits, mask out ones which had been stored but should have been generated MMU.reg_IF_bits[0] &= ~0x00200000; MMU.reg_IF_bits[1] &= ~0x00000000; MMU_new.gxstat.fifo_low = gxFIFO.size <= 127; MMU_new.gxstat.fifo_empty = gxFIFO.size == 0; if(version < 5) MMU.reg_DISP3DCNT_bits = T1ReadWord(MMU.ARM9_REG,0x60); if(version < 6) return ok; MMU_new.dsi_tsc.load_state(is); //version 6 if(version < 7) { //recover WRAMCNT from the stashed WRAMSTAT memory location MMU.WRAMCNT = MMU.MMU_MEM[ARMCPU_ARM7][0x40][0x241]; } if(version<8) return ok; //version 8: delete[] MMU.fw.data; MMU.fw.size = is->read32le(); MMU.fw.data = new u8[size]; is->fread(MMU.fw.data,MMU.fw.size); return ok; } static void cp15_savestate(EMUFILE* os) { //version write32le(1,os); cp15.saveone(os); //ARM7 not have coprocessor //cp15_saveone((armcp15_t *)NDS_ARM7.coproc[15],os); } static bool cp15_loadstate(EMUFILE* is, int size) { //read version u32 version; if(read32le(&version,is) != 1) return false; if(version > 1) return false; if(!cp15.loadone(is)) return false; if(version == 0) { //ARM7 not have coprocessor u8 *tmp_buf = new u8 [sizeof(armcp15_t)]; if (!tmp_buf) return false; if(!cp15.loadone(is)) return false; delete [] tmp_buf; tmp_buf = NULL; } return true; } /* Format time and convert to string */ static char * format_time(time_t cal_time) { struct tm *time_struct; static char str[64]; time_struct=localtime(&cal_time); strftime(str, sizeof str, "%d-%b-%Y %H:%M:%S", time_struct); return(str); } void clear_savestates() { u8 i; for( i = 0; i < NB_STATES; i++ ) savestates[i].exists = FALSE; } // Scan for existing savestates and update struct void scan_savestates() { struct stat sbuf; char filename[MAX_PATH+1]; clear_savestates(); for(int i = 0; i < NB_STATES; i++ ) { path.getpathnoext(path.STATES, filename); if (strlen(filename) + strlen(".dst") + strlen("-2147483648") /* = biggest string for i */ >MAX_PATH) return ; sprintf(filename+strlen(filename), ".ds%d", i); if( stat(filename,&sbuf) == -1 ) continue; savestates[i].exists = TRUE; strncpy(savestates[i].date, format_time(sbuf.st_mtime),40); savestates[i].date[40-1] = '\0'; } return ; } void savestate_slot(int num) { struct stat sbuf; char filename[MAX_PATH+1]; lastSaveState = num; //Set last savestate used path.getpathnoext(path.STATES, filename); if (strlen(filename) + strlen(".dsx") + strlen("-2147483648") /* = biggest string for num */ >MAX_PATH) return ; sprintf(filename+strlen(filename), ".ds%d", num); if (savestate_save(filename)) { osd->setLineColor(255, 255, 255); osd->addLine("Saved to %i slot", num); } else { osd->setLineColor(255, 0, 0); osd->addLine("Error saving %i slot", num); return; } if (num >= 0 && num < NB_STATES) { if (stat(filename,&sbuf) != -1) { savestates[num].exists = TRUE; strncpy(savestates[num].date, format_time(sbuf.st_mtime),40); savestates[num].date[40-1] = '\0'; } } } void loadstate_slot(int num) { char filename[MAX_PATH]; lastSaveState = num; //Set last savestate used path.getpathnoext(path.STATES, filename); if (strlen(filename) + strlen(".dsx") + strlen("-2147483648") /* = biggest string for num */ >MAX_PATH) return ; sprintf(filename+strlen(filename), ".ds%d", num); if (savestate_load(filename)) { osd->setLineColor(255, 255, 255); osd->addLine("Loaded from %i slot", num); } else { osd->setLineColor(255, 0, 0); osd->addLine("Error loading %i slot", num); } } // note: guessSF is so we don't have to do a linear search through the SFORMAT array every time // in the (most common) case that we already know where the next entry is. static const SFORMAT *CheckS(const SFORMAT *guessSF, const SFORMAT *firstSF, u32 size, u32 count, char *desc) { const SFORMAT *sf = guessSF ? guessSF : firstSF; while(sf->v) { //NOT SUPPORTED RIGHT NOW //if(sf->size==~0) // Link to another SFORMAT structure. //{ // SFORMAT *tmp; // if((tmp= CheckS((SFORMAT *)sf->v, tsize, desc) )) // return(tmp); // sf++; // continue; //} if(!memcmp(desc,sf->desc,4)) { if(sf->size != size || sf->count != count) return 0; return sf; } // failed to find it, have to keep iterating if(guessSF) { sf = firstSF; guessSF = NULL; } else { sf++; } } return 0; } static bool ReadStateChunk(EMUFILE* is, const SFORMAT *sf, int size) { const SFORMAT *tmp = NULL; const SFORMAT *guessSF = NULL; int temp = is->ftell(); while(is->ftell()fread(toa,4); if(is->fail()) return false; if(!read32le(&sz,is)) return false; if(!read32le(&count,is)) return false; if((tmp=CheckS(guessSF,sf,sz,count,toa))) { #ifdef LOCAL_LE // no need to ever loop one at a time if not flipping byte order is->fread((char *)tmp->v,sz*count); #else if(sz == 1) { //special case: read a huge byte array is->fread((char *)tmp->v,count); } else { for(unsigned int i=0;ifread((char *)tmp->v + i*sz,sz); FlipByteOrder((u8*)tmp->v + i*sz,sz); } } #endif guessSF = tmp + 1; } else { is->fseek(sz*count,SEEK_CUR); guessSF = NULL; } } // while(...) return true; } static int SubWrite(EMUFILE* os, const SFORMAT *sf) { uint32 acc=0; #ifdef DEBUG std::set keyset; #endif const SFORMAT* temp = sf; while(temp->v) { const SFORMAT* seek = sf; while(seek->v && seek != temp) { if(!strcmp(seek->desc,temp->desc)) { printf("ERROR! duplicated chunk name: %s\n", temp->desc); } seek++; } temp++; } while(sf->v) { //not supported right now //if(sf->size==~0) //Link to another struct //{ // uint32 tmp; // if(!(tmp=SubWrite(os,(SFORMAT *)sf->v))) // return(0); // acc+=tmp; // sf++; // continue; //} int count = sf->count; int size = sf->size; //add size of current node to the accumulator acc += 4 + sizeof(sf->size) + sizeof(sf->count); acc += count * size; if(os) //Are we writing or calculating the size of this block? { os->fwrite(sf->desc,4); write32le(sf->size,os); write32le(sf->count,os); #ifdef DEBUG //make sure we dont dup any keys if(keyset.find(sf->desc) != keyset.end()) { printf("duplicate save key!\n"); assert(false); } keyset.insert(sf->desc); #endif #ifdef LOCAL_LE // no need to ever loop one at a time if not flipping byte order os->fwrite((char *)sf->v,size*count); #else if(size == 1) { //special case: write a huge byte array os->fwrite((char *)sf->v,count); } else { for(int i=0;iv + i*size, size); os->fwrite((char*)sf->v + i*size,size); //Now restore the original byte order. FlipByteOrder((u8*)sf->v + i*size, size); } } #endif } sf++; } return(acc); } static int savestate_WriteChunk(EMUFILE* os, int type, const SFORMAT *sf) { write32le(type,os); if(!sf) return 4; int bsize = SubWrite((EMUFILE*)0,sf); write32le(bsize,os); if(!SubWrite(os,sf)) { return 8; } return (bsize+8); } static void savestate_WriteChunk(EMUFILE* os, int type, void (*saveproc)(EMUFILE* os)) { u32 pos1 = os->ftell(); //write the type, size(placeholder), and data write32le(type,os); os->fseek(4, SEEK_CUR); // skip the size, we write that later saveproc(os); //get the size u32 pos2 = os->ftell(); assert(pos2 != (u32)-1); // if this assert fails, saveproc did something bad u32 size = (pos2 - pos1) - (2 * sizeof(u32)); //fill in the actual size os->fseek(pos1 + sizeof(u32),SEEK_SET); write32le(size,os); os->fseek(pos2,SEEK_SET); /* // old version of this function, // for reference in case the new one above starts misbehaving somehow: // - this is retarded. why not write placeholders for size and then write directly to the stream //and then go back and fill them in //get the size memorystream mstemp; saveproc(&mstemp); mstemp.flush(); u32 size = mstemp.size(); //write the type, size, and data write32le(type,os); write32le(size,os); os->write(mstemp.buf(),size); */ } static void writechunks(EMUFILE* os); bool savestate_save(EMUFILE* outstream, int compressionLevel) { #ifdef HAVE_JIT arm_jit_sync(); #endif #ifndef HAVE_LIBZ compressionLevel = Z_NO_COMPRESSION; #endif EMUFILE_MEMORY ms; EMUFILE* os; if(compressionLevel != Z_NO_COMPRESSION) { //generate the savestate in memory first os = (EMUFILE*)&ms; writechunks(os); } else { os = outstream; os->fseek(32,SEEK_SET); //skip the header writechunks(os); } //save the length of the file u32 len = os->ftell(); u32 comprlen = 0xFFFFFFFF; u8* cbuf; //compress the data int error = Z_OK; if(compressionLevel != Z_NO_COMPRESSION) { cbuf = ms.buf(); uLongf comprlen2; //worst case compression. //zlib says "0.1% larger than sourceLen plus 12 bytes" comprlen = (len>>9)+12 + len; cbuf = new u8[comprlen]; // Workaround to make it compile under linux 64bit comprlen2 = comprlen; error = compress2(cbuf,&comprlen2,ms.buf(),len,compressionLevel); comprlen = (u32)comprlen2; } //dump the header outstream->fseek(0,SEEK_SET); outstream->fwrite(magic,16); write32le(SAVESTATE_VERSION,outstream); write32le(EMU_DESMUME_VERSION_NUMERIC(),outstream); //desmume version write32le(len,outstream); //uncompressed length write32le(comprlen,outstream); //compressed length (-1 if it is not compressed) if(compressionLevel != Z_NO_COMPRESSION) { outstream->fwrite((char*)cbuf,comprlen==(u32)-1?len:comprlen); delete[] cbuf; } return error == Z_OK; } bool savestate_save (const char *file_name) { EMUFILE_MEMORY ms; size_t elems_written; #ifdef HAVE_LIBZ if(!savestate_save(&ms, Z_DEFAULT_COMPRESSION)) #else if(!savestate_save(&ms, 0)) #endif return false; FILE* file = fopen(file_name,"wb"); if(file) { elems_written = fwrite(ms.buf(),1,ms.size(),file); fclose(file); return (elems_written == ms.size()); } else return false; } static void writechunks(EMUFILE* os) { DateTime tm = DateTime::get_Now(); svn_rev = EMU_DESMUME_SUBVERSION_NUMERIC(); save_time = tm.get_Ticks(); savestate_WriteChunk(os,1,SF_ARM9); savestate_WriteChunk(os,2,SF_ARM7); savestate_WriteChunk(os,3,cp15_savestate); savestate_WriteChunk(os,4,SF_MEM); savestate_WriteChunk(os,5,SF_NDS); savestate_WriteChunk(os,51,nds_savestate); savestate_WriteChunk(os,60,SF_MMU); savestate_WriteChunk(os,61,mmu_savestate); savestate_WriteChunk(os,7,gpu_savestate); savestate_WriteChunk(os,8,spu_savestate); savestate_WriteChunk(os,81,mic_savestate); savestate_WriteChunk(os,90,SF_GFX3D); savestate_WriteChunk(os,91,gfx3d_savestate); savestate_WriteChunk(os,100,SF_MOVIE); savestate_WriteChunk(os,101,mov_savestate); savestate_WriteChunk(os,110,SF_WIFI); savestate_WriteChunk(os,120,SF_RTC); savestate_WriteChunk(os,130,SF_NDS_INFO); savestate_WriteChunk(os,140,s_slot1_savestate); savestate_WriteChunk(os,150,s_slot2_savestate); // reserved for future versions savestate_WriteChunk(os,160,reserveChunks); savestate_WriteChunk(os,170,reserveChunks); savestate_WriteChunk(os,180,reserveChunks); // ============================ savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0); } static bool ReadStateChunks(EMUFILE* is, s32 totalsize) { bool ret = true; bool haveInfo = false; s64 save_time = 0; u32 romsize = 0; u8 version_major = 0; u8 version_minor = 0; u8 version_build = 0; NDS_header header; SFORMAT SF_INFO[]={ { "GINF", 1, sizeof(header), &header}, { "GRSZ", 1, 4, &romsize}, { "DVMJ", 1, 1, &version_major}, { "DVMI", 1, 1, &version_minor}, { "DSBD", 1, 1, &version_build}, { "GREV", 1, 4, &svn_rev}, { "GTIM", 1, 8, &save_time}, { 0 } }; memset(&header, 0, sizeof(header)); while(totalsize > 0) { u32 size = 0; u32 t = 0; if(!read32le(&t,is)) { ret=false; break; } if(t == 0xFFFFFFFF) break; if(!read32le(&size,is)) { ret=false; break; } switch(t) { case 1: if(!ReadStateChunk(is,SF_ARM9,size)) ret=false; break; case 2: if(!ReadStateChunk(is,SF_ARM7,size)) ret=false; break; case 3: if(!cp15_loadstate(is,size)) ret=false; break; case 4: if(!ReadStateChunk(is,SF_MEM,size)) ret=false; break; case 5: if(!ReadStateChunk(is,SF_NDS,size)) ret=false; break; case 51: if(!nds_loadstate(is,size)) ret=false; break; case 60: if(!ReadStateChunk(is,SF_MMU,size)) ret=false; break; case 61: if(!mmu_loadstate(is,size)) ret=false; break; case 7: if(!gpu_loadstate(is,size)) ret=false; break; case 8: if(!spu_loadstate(is,size)) ret=false; break; case 81: if(!mic_loadstate(is,size)) ret=false; break; case 90: if(!ReadStateChunk(is,SF_GFX3D,size)) ret=false; break; case 91: if(!gfx3d_loadstate(is,size)) ret=false; break; case 100: if(!ReadStateChunk(is,SF_MOVIE, size)) ret=false; break; case 101: if(!mov_loadstate(is, size)) ret=false; break; case 110: if(!ReadStateChunk(is,SF_WIFI,size)) ret=false; break; case 120: if(!ReadStateChunk(is,SF_RTC,size)) ret=false; break; case 130: if(!ReadStateChunk(is,SF_INFO,size)) ret=false; else haveInfo=true; break; case 140: if(!s_slot1_loadstate(is, size)) ret=false; break; case 150: if(!s_slot2_loadstate(is, size)) ret=false; break; // reserved for future versions case 160: case 170: case 180: if(!ReadStateChunk(is,reserveChunks,size)) ret=false; break; // ============================ default: return false; } if(!ret) return false; } if (haveInfo) { char buf[14] = {0}; memset(&buf[0], 0, sizeof(buf)); memcpy(buf, header.gameTile, sizeof(header.gameTile)); printf("Savestate info:\n"); if (version_major | version_minor | version_build) { char buf[32] = {0}; if (svn_rev != 0xFFFFFFFF) sprintf(buf, " svn %u", svn_rev); printf("\tDeSmuME version: %u.%u.%u%s\n", version_major, version_minor, version_build, buf); } if (save_time) { static const char *wday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; DateTime tm = save_time; printf("\tSave created: %04d-%03s-%02d %s %02d:%02d:%02d\n", tm.get_Year(), DateTime::GetNameOfMonth(tm.get_Month()), tm.get_Day(), wday[tm.get_DayOfWeek()%7], tm.get_Hour(), tm.get_Minute(), tm.get_Second()); } printf("\tGame title: %s\n", buf); printf("\tGame code: %c%c%c%c\n", header.gameCode[0], header.gameCode[1], header.gameCode[2], header.gameCode[3]); printf("\tMaker code: %c%c (0x%04X) - %s\n", header.makerCode & 0xFF, header.makerCode >> 8, header.makerCode, getDeveloperNameByID(header.makerCode).c_str()); printf("\tDevice capacity: %dMb (real size %dMb)\n", ((128 * 1024) << header.cardSize) / (1024 * 1024), romsize / (1024 * 1024)); printf("\tCRC16: %04Xh\n", header.CRC16); printf("\tHeader CRC16: %04Xh\n", header.headerCRC16); printf("\tSlot1: %s\n", slot1_List[slot1Type]->info()->name()); printf("\tSlot2: %s\n", slot2_List[slot2Type]->info()->name()); if (gameInfo.romsize != romsize || memcmp(&gameInfo.header, &header, sizeof(header)) != 0) msgbox->warn("The savestate you are loading does not match the ROM you are running.\nYou should find the correct ROM"); } return ret; } static void loadstate() { // This should regenerate the vram banks for (int i = 0; i < 0xA; i++) _MMU_write08(0x04000240+i, _MMU_read08(0x04000240+i)); // This should regenerate the graphics power control register _MMU_write16(0x04000304, _MMU_read16(0x04000304)); // This should regenerate the graphics configuration //zero 27-jul-09 : was formerly up to 7F but that wrote to dispfifo which is dumb (one of nitsuja's desynch bugs [that he found, not caused]) //so then i brought it down to 66 but this resulted in a conceptual bug with affine start registers, which shouldnt get regenerated //so then i just made this exhaustive list // for (int i = REG_BASE_DISPA; i<=REG_BASE_DISPA + 0x66; i+=2) //_MMU_write16(i, _MMU_read16(i)); // for (int i = REG_BASE_DISPB; i<=REG_BASE_DISPB + 0x7F; i+=2) //_MMU_write16(i, _MMU_read16(i)); static const u8 mainRegenAddr[] = {0x00,0x02,0x08,0x0a,0x0c,0x0e,0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x50,0x52,0x54,0x64,0x66,0x6c}; static const u8 subRegenAddr[] = {0x00,0x02,0x08,0x0a,0x0c,0x0e,0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x50,0x52,0x54,0x6c}; for(u32 i=0;i(REG_BASE_DISPA+mainRegenAddr[i], _MMU_read16(REG_BASE_DISPA+mainRegenAddr[i])); for(u32 i=0;i(REG_BASE_DISPB+subRegenAddr[i], _MMU_read16(REG_BASE_DISPB+subRegenAddr[i])); // no need to restore 0x60 since control and MMU.ARM9_REG are both in the savestates, and restoring it could mess up the ack bits anyway SetupMMU(nds.Is_DebugConsole(),nds.Is_DSI()); execute = !driver->EMU_IsEmulationPaused(); } bool savestate_load(EMUFILE* is) { SAV_silent_fail_flag = false; char header[16]; is->fread(header,16); if(is->fail() || memcmp(header,magic,16)) return false; u32 ssversion,len,comprlen; if(!read32le(&ssversion,is)) return false; if(!read32le(&_DESMUME_version,is)) return false; if(!read32le(&len,is)) return false; if(!read32le(&comprlen,is)) return false; if(ssversion != SAVESTATE_VERSION) return false; std::vector buf(len); if(comprlen != 0xFFFFFFFF) { #ifndef HAVE_LIBZ //without libz, we can't decompress this savestate return false; #endif std::vector cbuf(comprlen); is->fread(&cbuf[0],comprlen); if(is->fail()) return false; #ifdef HAVE_LIBZ uLongf uncomprlen = len; int error = uncompress((uint8*)&buf[0],&uncomprlen,(uint8*)&cbuf[0],comprlen); if(error != Z_OK || uncomprlen != len) return false; #endif } else { is->fread((char*)&buf[0],len-32); } //GO!! READ THE SAVESTATE //THERE IS NO GOING BACK NOW //reset the emulator first to clean out the host's state //while the series of resets below should work, //we are testing the robustness of the savestate system with this full reset. //the full reset wipes more things, so we can make sure that they are being restored correctly extern bool _HACK_DONT_STOPMOVIE; _HACK_DONT_STOPMOVIE = true; NDS_Reset(); _HACK_DONT_STOPMOVIE = false; //reset some options to their old defaults which werent saved nds._DebugConsole = FALSE; //GPU_Reset(MainScreen.gpu, 0); //GPU_Reset(SubScreen.gpu, 1); //gfx3d_reset(); //gpu3D->NDS_3D_Reset(); //SPU_Reset(); EMUFILE_MEMORY mstemp(&buf); bool x = ReadStateChunks(&mstemp,(s32)len); if(!x && !SAV_silent_fail_flag) { msgbox->error("Error loading savestate. It failed halfway through;\nSince there is no savestate backup system, your current game session is wrecked"); return false; } loadstate(); if(nds.ConsoleType != CommonSettings.ConsoleType) { printf("WARNING: forcing console type to: ConsoleType=%d\n",nds.ConsoleType); } if((nds._DebugConsole!=0) != CommonSettings.DebugConsole) { printf("WARNING: forcing console debug mode to: debugmode=%s\n",nds._DebugConsole?"TRUE":"FALSE"); } return true; } bool savestate_load(const char *file_name) { EMUFILE_FILE f(file_name,"rb"); if(f.fail()) return false; return savestate_load(&f); } static std::stack rewindFreeList; static std::vector rewindbuffer; int rewindstates = 16; int rewindinterval = 4; void rewindsave () { if(currFrameCounter % rewindinterval) return; //printf("rewindsave"); printf("%d%s", currFrameCounter, "\n"); EMUFILE_MEMORY *ms; if(!rewindFreeList.empty()) { ms = rewindFreeList.top(); rewindFreeList.pop(); } else { ms = new EMUFILE_MEMORY(1024*1024*12); } if(!savestate_save(ms, Z_NO_COMPRESSION)) return; rewindbuffer.push_back(ms); if((int)rewindbuffer.size() > rewindstates) { delete *rewindbuffer.begin(); rewindbuffer.erase(rewindbuffer.begin()); } } void dorewind() { if(currFrameCounter % rewindinterval) return; //printf("rewind\n"); int size = rewindbuffer.size(); if(size < 1) { printf("rewind buffer empty\n"); return; } printf("%d", size); EMUFILE_MEMORY* loadms = rewindbuffer[size-1]; loadms->fseek(32, SEEK_SET); ReadStateChunks(loadms,loadms->size()-32); loadstate(); if(rewindbuffer.size()>1) { rewindFreeList.push(loadms); rewindbuffer.pop_back(); } } desmume-0.9.11/src/readwrite.h0000755000000000000000000000421512467662066014711 0ustar rootroot/* Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _READWRITE_H_ #define _READWRITE_H_ #include #include #include #include "types.h" class EMUFILE; //well. just for the sake of consistency int write8le(u8 b, EMUFILE *fp); inline int write8le(u8* b, EMUFILE *fp) { return write8le(*b,fp); } int write16le(u16 b, EMUFILE* os); int write32le(u32 b, EMUFILE* os); int write64le(u64 b, EMUFILE* os); inline int write_double_le(double b, EMUFILE*is) { u64 temp = double_to_u64(b); int ret = write64le(temp,is); return ret; } int read8le(u8 *Bufo, EMUFILE*is); int read16le(u16 *Bufo, EMUFILE*is); inline int read16le(s16 *Bufo, EMUFILE*is) { return read16le((u16*)Bufo,is); } int read32le(u32 *Bufo, EMUFILE*is); inline int read32le(s32 *Bufo, EMUFILE*is) { return read32le((u32*)Bufo,is); } int read64le(u64 *Bufo, EMUFILE*is); inline int read_double_le(double *Bufo, EMUFILE*is) { u64 temp; int ret = read64le(&temp,is); *Bufo = u64_to_double(temp); return ret; } int read16le(u16 *Bufo, std::istream *is); template int readle(T *Bufo, EMUFILE*is) { CTASSERT(sizeof(T)==1||sizeof(T)==2||sizeof(T)==4||sizeof(T)==8); switch(sizeof(T)) { case 1: return read8le((u8*)Bufo,is); case 2: return read16le((u16*)Bufo,is); case 4: return read32le((u32*)Bufo,is); case 8: return read64le((u64*)Bufo,is); default: return 0; } } int readbool(bool *b, EMUFILE* is); void writebool(bool b, EMUFILE* os); int readbuffer(std::vector &vec, EMUFILE* is); int writebuffer(std::vector& vec, EMUFILE* os); #endif desmume-0.9.11/src/armcpu.h0000755000000000000000000002240012467662066014206 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef ARM_CPU #define ARM_CPU #include "types.h" #include "bits.h" #include "MMU.h" #define CODE(i) (((i)>>25)&0x7) #define OPCODE(i) (((i)>>21)&0xF) #define SIGNEBIT(i) BIT_N(i,20) #define EXCEPTION_RESET 0x00 #define EXCEPTION_UNDEFINED_INSTRUCTION 0x04 #define EXCEPTION_SWI 0x08 #define EXCEPTION_PREFETCH_ABORT 0x0C #define EXCEPTION_DATA_ABORT 0x10 #define EXCEPTION_RESERVED_0x14 0x14 #define EXCEPTION_IRQ 0x18 #define EXCEPTION_FAST_IRQ 0x1C #define INSTRUCTION_INDEX(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF)) inline u32 ROR(u32 i, u32 j) { return ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j)))); } template inline T UNSIGNED_OVERFLOW(T a,T b,T c) { return BIT31(((a)&(b)) | (((a)|(b))&(~c))); } template inline T UNSIGNED_UNDERFLOW(T a,T b,T c) { return BIT31(((~a)&(b)) | (((~a)|(b))&(c))); } template inline T SIGNED_OVERFLOW(T a,T b,T c) { return BIT31(((a)&(b)&(~c)) | ((~a)&(~(b))&(c))); } template inline T SIGNED_UNDERFLOW(T a,T b,T c) { return BIT31(((a)&(~(b))&(~c)) | ((~a)&(b)&(c))); } #if !defined(bswap32) #define bswap32(val) \ ( (val << 24) & 0xFF000000) | \ ( (val << 8) & 0x00FF0000) | \ ( (val >> 8) & 0x0000FF00) | \ ( (val >> 24) & 0x000000FF) #endif #if !defined(bswap64) #define bswap64(x) \ ( (x << 56) & 0xff00000000000000ULL ) | \ ( (x << 40) & 0x00ff000000000000ULL ) | \ ( (x << 24) & 0x0000ff0000000000ULL ) | \ ( (x << 8) & 0x000000ff00000000ULL ) | \ ( (x >> 8) & 0x00000000ff000000ULL ) | \ ( (x >> 24) & 0x0000000000ff0000ULL ) | \ ( (x >> 40) & 0x000000000000ff00ULL ) | \ ( (x >> 56) & 0x00000000000000ffULL ) #endif // ============================= CPRS flags funcs inline bool CarryFrom(s32 left, s32 right) { u32 res = (0xFFFFFFFFU - (u32)left); return ((u32)right > res); } inline bool BorrowFrom(s32 left, s32 right) { return ((u32)right > (u32)left); } inline bool OverflowFromADD(s32 alu_out, s32 left, s32 right) { return ((left >= 0 && right >= 0) || (left < 0 && right < 0)) && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0)); } inline bool OverflowFromSUB(s32 alu_out, s32 left, s32 right) { return ((left < 0 && right >= 0) || (left >= 0 && right < 0)) && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0)); } //zero 15-feb-2009 - these werent getting used and they were getting in my way //#define EQ 0x0 //#define NE 0x1 //#define CS 0x2 //#define CC 0x3 //#define MI 0x4 //#define PL 0x5 //#define VS 0x6 //#define VC 0x7 //#define HI 0x8 //#define LS 0x9 //#define GE 0xA //#define LT 0xB //#define GT 0xC //#define LE 0xD //#define AL 0xE static const u8 arm_cond_table[16*16] = { // N=0, Z=0, C=0, V=0 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF, // 0x00 0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x20, // 0x00 // N=0, Z=0, C=0, V=1 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x00, // 0x10 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=0, Z=0, C=1, V=0 0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF, // 0x20 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x20, // N=0, Z=0, C=1, V=1 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00, // 0x30 0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=0, V=0 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF, // 0x40 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=0, V=1 0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00, // 0x50 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=1, V=0 0xFF,0x00,0xFF,0x00,0x00,0xFF,0x00,0xFF, // 0x60 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=1, V=1 0xFF,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00, // 0x70 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=0, C=0, V=0 0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0xFF, // 0x80 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=0, C=0, V=1 0x00,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0x00, // 0x90 0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x20, // N=1, Z=0, C=1, V=0 0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0xFF, // 0xA0 0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=0, C=1, V=1 0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x00, // 0xB0 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x20, // N=1, Z=1, C=0, V=0 0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF, // 0xC0 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=1, C=0, V=1 0xFF,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00, // 0xD0 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20, // N=1, Z=1, C=1, V=0 0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0xFF, // 0xE0 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=1, C=1, V=1 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00, // 0xF0 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20 }; #define TEST_COND(cond, inst, CPSR) ((arm_cond_table[((CPSR.val >> 24) & 0xf0)|(cond)]) & (1 << (inst))) enum Mode { USR = 0x10, FIQ = 0x11, IRQ = 0x12, SVC = 0x13, ABT = 0x17, UND = 0x1B, SYS = 0x1F }; #ifdef WORDS_BIGENDIAN typedef union { struct { u32 N : 1, Z : 1, C : 1, V : 1, Q : 1, RAZ : 19, I : 1, F : 1, T : 1, mode : 5; } bits; u32 val; } Status_Reg; #else typedef union { struct { u32 mode : 5, T : 1, F : 1, I : 1, RAZ : 19, Q : 1, V : 1, C : 1, Z : 1, N : 1; } bits; u32 val; } Status_Reg; #endif /** * The control interface to a CPU */ struct armcpu_ctrl_iface { /** stall the processor */ void (*stall)( void *instance); /** unstall the processor */ void (*unstall)( void *instance); /** read a register value */ u32 (*read_reg)( void *instance, u32 reg_num); /** set a register value */ void (*set_reg)( void *instance, u32 reg_num, u32 value); /** install the post execute function */ void (*install_post_ex_fn)( void *instance, void (*fn)( void *, u32 adr, int thumb), void *fn_data); /** remove the post execute function */ void (*remove_post_ex_fn)( void *instance); /** the private data passed to all interface functions */ void *data; }; typedef void* armcp_t; struct armcpu_t { u32 proc_ID; u32 instruction; //4 u32 instruct_adr; //8 u32 next_instruction; //12 u32 R[16]; //16 Status_Reg CPSR; //80 Status_Reg SPSR; void SetControlInterface(const armcpu_ctrl_iface *theCtrlInterface); armcpu_ctrl_iface* GetControlInterface(); void SetControlInterfaceData(void *theData); void* GetControlInterfaceData(); void SetCurrentMemoryInterface(armcpu_memory_iface *theMemInterface); armcpu_memory_iface* GetCurrentMemoryInterface(); void SetCurrentMemoryInterfaceData(void *theData); void* GetCurrentMemoryInterfaceData(); void SetBaseMemoryInterface(const armcpu_memory_iface *theMemInterface); armcpu_memory_iface* GetBaseMemoryInterface(); void SetBaseMemoryInterfaceData(void *theData); void* GetBaseMemoryInterfaceData(); void ResetMemoryInterfaceToBase(); void changeCPSR(); u32 R13_usr, R14_usr; u32 R13_svc, R14_svc; u32 R13_abt, R14_abt; u32 R13_und, R14_und; u32 R13_irq, R14_irq; u32 R8_fiq, R9_fiq, R10_fiq, R11_fiq, R12_fiq, R13_fiq, R14_fiq; Status_Reg SPSR_svc, SPSR_abt, SPSR_und, SPSR_irq, SPSR_fiq; u32 intVector; u8 LDTBit; //1 : ARMv5 style 0 : non ARMv5 (earlier) BOOL waitIRQ; BOOL halt_IE_and_IF; //the cpu is halted, waiting for IE&IF to signal something u8 intrWaitARM_state; BOOL BIOS_loaded; u32 (* *swi_tab)(); // flag indicating if the processor is stalled (for debugging) int stalled; #if defined(_M_X64) || defined(__x86_64__) u8 cond_table[16*16]; #endif /** there is a pending irq for the cpu */ int irq_flag; /** the post executed function (if installed) */ void (*post_ex_fn)( void *, u32 adr, int thumb); /** data for the post executed function */ void *post_ex_fn_data; /** the memory interface */ armcpu_memory_iface *mem_if; // This is the memory interface currently in use. armcpu_memory_iface base_mem_if; // This is the CPU's base memory interface. /** the ctrl interface */ armcpu_ctrl_iface ctrl_iface; }; int armcpu_new( armcpu_t *armcpu, u32 id); void armcpu_init(armcpu_t *armcpu, u32 adr); u32 armcpu_switchMode(armcpu_t *armcpu, u8 mode); BOOL armcpu_irqException(armcpu_t *armcpu); BOOL armcpu_flagIrq( armcpu_t *armcpu); void armcpu_exception(armcpu_t *cpu, u32 number); u32 TRAPUNDEF(armcpu_t* cpu); u32 armcpu_Wait4IRQ(armcpu_t *cpu); extern armcpu_t NDS_ARM7; extern armcpu_t NDS_ARM9; extern const armcpu_ctrl_iface arm_default_ctrl_iface; template u32 armcpu_exec(); #ifdef HAVE_JIT template u32 armcpu_exec(); #endif void setIF(int PROCNUM, u32 flag); char* decodeIntruction(bool thumb_mode, u32 instr); static INLINE void NDS_makeIrq(int PROCNUM, u32 num) { setIF(PROCNUM,1<. */ #include "slot2.h" #include "types.h" #include "mem.h" #include "MMU.h" #include "registers.h" #include "NDSSystem.h" //this is the currently-configured cflash mode ADDON_CFLASH_MODE CFlash_Mode = ADDON_CFLASH_MODE_RomPath; //this is the currently-configured path (directory or filename) for cflash. //it should be viewed as a parameter for the above. std::string CFlash_Path; // GBA file paths for cartridge and SRAM std::string GBACartridge_RomPath; std::string GBACartridge_SRAMPath; ISlot2Interface* slot2_List[NDS_SLOT2_COUNT] = {0}; ISlot2Interface* slot2_device = NULL; NDS_SLOT2_TYPE slot2_device_type = NDS_SLOT2_AUTO; NDS_SLOT2_TYPE slot2_selected_type = NDS_SLOT2_NONE; void slot2_Init() { //due to sloppy initialization code in various untestable desmume ports, we might try this more than once static bool initialized = false; if(initialized) return; initialized = true; //construct all devices extern TISlot2InterfaceConstructor construct_Slot2_None; extern TISlot2InterfaceConstructor construct_Slot2_Auto; extern TISlot2InterfaceConstructor construct_Slot2_CFlash; extern TISlot2InterfaceConstructor construct_Slot2_RumblePak; extern TISlot2InterfaceConstructor construct_Slot2_GbaCart; extern TISlot2InterfaceConstructor construct_Slot2_GuitarGrip; extern TISlot2InterfaceConstructor construct_Slot2_ExpansionPak; extern TISlot2InterfaceConstructor construct_Slot2_EasyPiano; extern TISlot2InterfaceConstructor construct_Slot2_Paddle; extern TISlot2InterfaceConstructor construct_Slot2_PassME; slot2_List[NDS_SLOT2_NONE] = construct_Slot2_None(); slot2_List[NDS_SLOT2_AUTO] = construct_Slot2_Auto(); slot2_List[NDS_SLOT2_CFLASH] = construct_Slot2_CFlash(); slot2_List[NDS_SLOT2_RUMBLEPAK] = construct_Slot2_RumblePak(); slot2_List[NDS_SLOT2_GBACART] = construct_Slot2_GbaCart(); slot2_List[NDS_SLOT2_GUITARGRIP] = construct_Slot2_GuitarGrip(); slot2_List[NDS_SLOT2_EXPMEMORY] = construct_Slot2_ExpansionPak(); slot2_List[NDS_SLOT2_EASYPIANO] = construct_Slot2_EasyPiano(); slot2_List[NDS_SLOT2_PADDLE] = construct_Slot2_Paddle(); slot2_List[NDS_SLOT2_PASSME] = construct_Slot2_PassME(); } void slot2_Shutdown() { for(size_t i=0; ishutdown(); delete slot2_List[i]; slot2_List[i] = NULL; } } bool slot2_Connect() { slot2_device->connect(); return true; } void slot2_Disconnect() { slot2_device->disconnect(); } void slot2_Reset() { //disconnect existing device if(slot2_device != NULL) slot2_device->disconnect(); //connect new device slot2_device = slot2_List[slot2_device_type]; slot2_device->connect(); } bool slot2_Change(NDS_SLOT2_TYPE changeToType) { if (changeToType > NDS_SLOT2_COUNT || changeToType < 0) return false; if (slot2_device_type == changeToType) { return false; } else if (slot2_device_type != NDS_SLOT2_AUTO && changeToType == NDS_SLOT2_AUTO) { const NDS_SLOT2_TYPE prevDeviceType = slot2_device_type; const NDS_SLOT2_TYPE autoDeviceType = slot2_DetermineType(); if (prevDeviceType != autoDeviceType && slot2_device != NULL) { slot2_device->disconnect(); } slot2_setDeviceByType(changeToType); slot2_selected_type = autoDeviceType; if (prevDeviceType != autoDeviceType) { slot2_device->connect(); } } else if (slot2_device_type == NDS_SLOT2_AUTO && changeToType != NDS_SLOT2_AUTO) { const NDS_SLOT2_TYPE autoDeviceType = slot2_DetermineType(); if (autoDeviceType != changeToType && slot2_device != NULL) { slot2_device->disconnect(); } slot2_setDeviceByType(changeToType); if (autoDeviceType != changeToType) { slot2_device->connect(); } } else //(slot2_device_type != NDS_SLOT2_AUTO && changeToType != NDS_SLOT2_AUTO) { if (slot2_device != NULL) { slot2_device->disconnect(); } slot2_setDeviceByType(changeToType); slot2_device->connect(); } return true; } void slot2_setDeviceByType(NDS_SLOT2_TYPE theType) { if (theType > NDS_SLOT2_COUNT || theType < 0) { return; } slot2_device_type = theType; slot2_device = slot2_List[slot2_device_type]; printf("Slot 2: %s\n", slot2_device->info()->name()); } bool slot2_getTypeByID(u8 ID, NDS_SLOT2_TYPE &type) { for (u8 i = 0; i < NDS_SLOT2_COUNT; i++) { if (slot2_List[i]->info()->id() == ID) { type = (NDS_SLOT2_TYPE)i; return true; } } return false; } bool slot2_ChangeByID(u8 ID) { NDS_SLOT2_TYPE type = NDS_SLOT2_AUTO; slot2_getTypeByID(ID, type); return slot2_Change(type); } NDS_SLOT2_TYPE slot2_GetCurrentType() { return slot2_device_type; } NDS_SLOT2_TYPE slot2_GetSelectedType() { if (slot2_device_type == NDS_SLOT2_AUTO) return slot2_selected_type; return slot2_device_type; } NDS_SLOT2_TYPE slot2_DetermineType() { NDS_SLOT2_TYPE theType = NDS_SLOT2_NONE; //check game ID in core emulator and select right implementation if (gameInfo.romsize == 0) { return theType; } else if (gameInfo.isHomebrew()) { theType = NDS_SLOT2_PASSME; } else { theType = slot2_DetermineTypeByGameCode(gameInfo.header.gameCode); } return theType; } NDS_SLOT2_TYPE slot2_DetermineTypeByGameCode(const char *theGameCode) { NDS_SLOT2_TYPE theType = NDS_SLOT2_NONE; struct Slot2AutoDeviceType { const char *gameCode; const NDS_SLOT2_TYPE deviceType; }; static const Slot2AutoDeviceType gameCodeDeviceTypes[] = { {"UBR", NDS_SLOT2_EXPMEMORY}, // Opera Browser {"YGH", NDS_SLOT2_GUITARGRIP}, // Guitar Hero - On Tour {"CGS", NDS_SLOT2_GUITARGRIP}, // Guitar Hero - On Tour - Decades {"C6Q", NDS_SLOT2_GUITARGRIP}, // Guitar Hero - On Tour - Modern Hits {"YGR", NDS_SLOT2_GUITARGRIP}, // Guitar Hero - On Tour (Demo) {"Y56", NDS_SLOT2_GUITARGRIP}, // Guitar Hero - On Tour - Decades (Demo) {"Y6R", NDS_SLOT2_GUITARGRIP}, // Guitar Hero - On Tour - Modern Hits (Demo) {"BEP", NDS_SLOT2_EASYPIANO}, // Easy Piano (EUR)(USA) {"YAA", NDS_SLOT2_PADDLE}, // Arkanoid DS {"CB6", NDS_SLOT2_PADDLE}, // Space Bust-A-Move {"YXX", NDS_SLOT2_PADDLE}, // Space Invaders Extreme {"CV8", NDS_SLOT2_PADDLE}, // Space Invaders Extreme 2 {"AP2", NDS_SLOT2_RUMBLEPAK}, // Metroid Prime Pinball }; for(size_t i = 0; i < ARRAY_SIZE(gameCodeDeviceTypes); i++) { if(memcmp(theGameCode, gameCodeDeviceTypes[i].gameCode, 3) == 0) { theType = gameCodeDeviceTypes[i].deviceType; break; } } return theType; } void slot2_Savestate(EMUFILE* os) { slot2_device->savestate(os); } void slot2_Loadstate(EMUFILE* is) { slot2_device->loadstate(is); } static bool isSlot2(u32 addr) { if (addr < 0x08000000) return false; if (addr >= 0x0A010000) return false; return true; } template static bool skipSlot2Data() { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[PROCNUM][0x40], 0x204); return (PROCNUM == ARMCPU_ARM9)? (exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7): !(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7); } template bool slot2_write(u32 addr, T val) { if (!isSlot2(addr)) return false; if (skipSlot2Data()) return true; switch (sizeof(T)) { case sizeof(u8) : slot2_device->writeByte(PROCNUM, addr, val); break; case sizeof(u16): slot2_device->writeWord(PROCNUM, addr, val); break; case sizeof(u32): slot2_device->writeLong(PROCNUM, addr, val); break; } return true; } template bool slot2_read(u32 addr, T &val) { if (!isSlot2(addr)) return false; if (skipSlot2Data()) { val = 0; return true; } switch (sizeof(T)) { case sizeof(u8) : val = slot2_device->readByte(PROCNUM, addr); break; case sizeof(u16): val = slot2_device->readWord(PROCNUM, addr); break; case sizeof(u32): val = slot2_device->readLong(PROCNUM, addr); break; default: val = 0; break; } return true; } template bool slot2_write<0, u8> (u32 addr, u8 val); template bool slot2_write<0, u16>(u32 addr, u16 val); template bool slot2_write<0, u32>(u32 addr, u32 val); template bool slot2_write<1, u8> (u32 addr, u8 val); template bool slot2_write<1, u16>(u32 addr, u16 val); template bool slot2_write<1, u32>(u32 addr, u32 val); template bool slot2_read<0, u8> (u32 addr, u8 &val); template bool slot2_read<0, u16>(u32 addr, u16 &val); template bool slot2_read<0, u32>(u32 addr, u32 &val); template bool slot2_read<1, u8> (u32 addr, u8 &val); template bool slot2_read<1, u16>(u32 addr, u16 &val); template bool slot2_read<1, u32>(u32 addr, u32 &val); desmume-0.9.11/src/cp15.cpp0000755000000000000000000003302412467662066014026 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include "armcpu.h" #include "cp15.h" #include "debug.h" #include "MMU.h" #include "emufile.h" #include "readwrite.h" armcp15_t cp15; #define CP15_ACCESSTYPE(val, n) (((val) >> (4*n)) & 0x0F) /* sets the precalculated regions to mask,set for the affected accesstypes */ void armcp15_t::setSingleRegionAccess(u8 num, u32 mask, u32 set) { switch (CP15_ACCESSTYPE(DaccessPerm, num)) { case 4: /* UNP */ case 7: /* UNP */ case 8: /* UNP */ case 9: /* UNP */ case 10: /* UNP */ case 11: /* UNP */ case 12: /* UNP */ case 13: /* UNP */ case 14: /* UNP */ case 15: /* UNP */ case 0: /* no access at all */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = 0 ; regionReadSet_USR[num] = 0xFFFFFFFF ; regionWriteMask_SYS[num] = 0 ; regionWriteSet_SYS[num] = 0xFFFFFFFF ; regionReadMask_SYS[num] = 0 ; regionReadSet_SYS[num] = 0xFFFFFFFF ; break ; case 1: /* no access at USR, all to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = 0 ; regionReadSet_USR[num] = 0xFFFFFFFF ; regionWriteMask_SYS[num] = mask ; regionWriteSet_SYS[num] = set ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 2: /* read at USR, all to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = mask ; regionReadSet_USR[num] = set ; regionWriteMask_SYS[num] = mask ; regionWriteSet_SYS[num] = set ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 3: /* all to USR, all to sys */ regionWriteMask_USR[num] = mask ; regionWriteSet_USR[num] = set ; regionReadMask_USR[num] = mask ; regionReadSet_USR[num] = set ; regionWriteMask_SYS[num] = mask ; regionWriteSet_SYS[num] = set ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 5: /* no access at USR, read to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = 0 ; regionReadSet_USR[num] = 0xFFFFFFFF ; regionWriteMask_SYS[num] = 0 ; regionWriteSet_SYS[num] = 0xFFFFFFFF ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 6: /* read at USR, read to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = mask ; regionReadSet_USR[num] = set ; regionWriteMask_SYS[num] = 0 ; regionWriteSet_SYS[num] = 0xFFFFFFFF ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; } switch (CP15_ACCESSTYPE(IaccessPerm, num)) { case 4: /* UNP */ case 7: /* UNP */ case 8: /* UNP */ case 9: /* UNP */ case 10: /* UNP */ case 11: /* UNP */ case 12: /* UNP */ case 13: /* UNP */ case 14: /* UNP */ case 15: /* UNP */ case 0: /* no access at all */ regionExecuteMask_USR[num] = 0 ; regionExecuteSet_USR[num] = 0xFFFFFFFF ; regionExecuteMask_SYS[num] = 0 ; regionExecuteSet_SYS[num] = 0xFFFFFFFF ; break ; case 1: regionExecuteMask_USR[num] = 0 ; regionExecuteSet_USR[num] = 0xFFFFFFFF ; regionExecuteMask_SYS[num] = mask ; regionExecuteSet_SYS[num] = set ; break ; case 2: case 3: case 6: regionExecuteMask_USR[num] = mask ; regionExecuteSet_USR[num] = set ; regionExecuteMask_SYS[num] = mask ; regionExecuteSet_SYS[num] = set ; break ; } } ; /* precalculate region masks/sets from cp15 register */ void armcp15_t::maskPrecalc() { #define precalc(num) { \ u32 mask = 0, set = 0xFFFFFFFF ; /* (x & 0) == 0xFF..FF is allways false (disabled) */ \ if (BIT_N(protectBaseSize[num],0)) /* if region is enabled */ \ { /* reason for this define: naming includes var */ \ mask = CP15_MASKFROMREG(protectBaseSize[num]) ; \ set = CP15_SETFROMREG(protectBaseSize[num]) ; \ if (CP15_SIZEIDENTIFIER(protectBaseSize[num])==0x1F) \ { /* for the 4GB region, u32 suffers wraparound */ \ mask = 0 ; set = 0 ; /* (x & 0) == 0 is allways true (enabled) */ \ } \ } \ setSingleRegionAccess(num, mask, set) ; \ } precalc(0) ; precalc(1) ; precalc(2) ; precalc(3) ; precalc(4) ; precalc(5) ; precalc(6) ; precalc(7) ; #undef precalc } BOOL armcp15_t::isAccessAllowed(u32 address,u32 access) { int i ; if (!(ctrl & 1)) return TRUE ; /* protection checking is not enabled */ for (i=0;i<8;i++) { switch (access) { case CP15_ACCESS_WRITEUSR: if ((address & regionWriteMask_USR[i]) == regionWriteSet_USR[i]) return TRUE ; break ; case CP15_ACCESS_WRITESYS: if ((address & regionWriteMask_SYS[i]) == regionWriteSet_SYS[i]) return TRUE ; break ; case CP15_ACCESS_READUSR: if ((address & regionReadMask_USR[i]) == regionReadSet_USR[i]) return TRUE ; break ; case CP15_ACCESS_READSYS: if ((address & regionReadMask_SYS[i]) == regionReadSet_SYS[i]) return TRUE ; break ; case CP15_ACCESS_EXECUSR: if ((address & regionExecuteMask_USR[i]) == regionExecuteSet_USR[i]) return TRUE ; break ; case CP15_ACCESS_EXECSYS: if ((address & regionExecuteMask_SYS[i]) == regionExecuteSet_SYS[i]) return TRUE ; break ; } } /* when protections are enabled, but no region allows access, deny access */ return FALSE ; } BOOL armcp15_t::dataProcess(u8 CRd, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2) { LOG("Unsupported CP15 operation : DataProcess\n"); return FALSE; } BOOL armcp15_t::load(u8 CRd, u8 adr) { LOG("Unsupported CP15 operation : Load\n"); return FALSE; } BOOL armcp15_t::store(u8 CRd, u8 adr) { LOG("Unsupported CP15 operation : Store\n"); return FALSE; } BOOL armcp15_t::moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2) { if(NDS_ARM9.CPSR.bits.mode == USR) return FALSE; switch(CRn) { case 0: if((opcode1 == 0)&&(CRm==0)) { switch(opcode2) { case 1: *R = cacheType; return TRUE; case 2: *R = TCMSize; return TRUE; default: *R = IDCode; return TRUE; } } return FALSE; case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { *R = ctrl; //LOG("CP15: CPtoARM ctrl %08X\n", ctrl); return TRUE; } return FALSE; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: *R = DCConfig; return TRUE; case 1: *R = ICConfig; return TRUE; default: return FALSE; } } return FALSE; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { *R = writeBuffCtrl; //LOG("CP15: CPtoARM writeBuffer ctrl %08X\n", writeBuffCtrl); return TRUE; } return FALSE; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: *R = DaccessPerm; return TRUE; case 3: *R = IaccessPerm; return TRUE; default: return FALSE; } } return FALSE; case 6: if((opcode1==0) && (opcode2==0)) { if (CRm < 8) { *R = protectBaseSize[CRm]; return TRUE; } } return FALSE; case 9: if(opcode1==0) { switch(CRm) { case 0: switch(opcode2) { case 0: *R = DcacheLock; return TRUE; case 1: *R = IcacheLock; return TRUE; default: return FALSE; } case 1: switch(opcode2) { case 0: *R = DTCMRegion; return TRUE; case 1: *R = ITCMRegion; return TRUE; default: return FALSE; } } } return FALSE; default: LOG("Unsupported CP15 operation : MRC\n"); return FALSE; } } BOOL armcp15_t::moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2) { if(NDS_ARM9.CPSR.bits.mode == USR) return FALSE; switch(CRn) { case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { //On the NDS bit0,2,7,12..19 are R/W, Bit3..6 are always set, all other bits are always zero. ctrl = (val & 0x000FF085) | 0x00000078; MMU.ARM9_RW_MODE = BIT7(val); //zero 31-jan-2010: change from 0x0FFF0000 to 0xFFFF0000 per gbatek NDS_ARM9.intVector = 0xFFFF0000 * (BIT13(val)); NDS_ARM9.LDTBit = !BIT15(val); //TBit //LOG("CP15: ARMtoCP ctrl %08X (val %08X)\n", ctrl, val); return TRUE; } return FALSE; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: DCConfig = val; return TRUE; case 1: ICConfig = val; return TRUE; default: return FALSE; } } return FALSE; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { writeBuffCtrl = val; //LOG("CP15: ARMtoCP writeBuffer ctrl %08X\n", writeBuffCtrl); return TRUE; } return FALSE; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: DaccessPerm = val; maskPrecalc(); return TRUE; case 3: IaccessPerm = val; maskPrecalc(); return TRUE; default: return FALSE; } } return FALSE; case 6: if((opcode1==0) && (opcode2==0)) { if (CRm < 8) { protectBaseSize[CRm] = val; maskPrecalc(); return TRUE; } } return FALSE; case 7: if((CRm==0)&&(opcode1==0)&&((opcode2==4))) { //CP15wait4IRQ; NDS_ARM9.waitIRQ = TRUE; NDS_ARM9.halt_IE_and_IF = TRUE; //IME set deliberately omitted: only SWI sets IME to 1 return TRUE; } return FALSE; case 9: if((opcode1==0)) { switch(CRm) { case 0: switch(opcode2) { case 0: DcacheLock = val; return TRUE; case 1: IcacheLock = val; return TRUE; default: return FALSE; } case 1: switch(opcode2) { case 0: MMU.DTCMRegion = DTCMRegion = val & 0x0FFFF000; return TRUE; case 1: ITCMRegion = val; //ITCM base is not writeable! MMU.ITCMRegion = 0; return TRUE; default: return FALSE; } } } return FALSE; default: return FALSE; } } // Save state void armcp15_t::saveone(EMUFILE* os) { write32le(IDCode,os); write32le(cacheType,os); write32le(TCMSize,os); write32le(ctrl,os); write32le(DCConfig,os); write32le(ICConfig,os); write32le(writeBuffCtrl,os); write32le(und,os); write32le(DaccessPerm,os); write32le(IaccessPerm,os); for(int i=0;i<8;i++) write32le(protectBaseSize[i],os); write32le(cacheOp,os); write32le(DcacheLock,os); write32le(IcacheLock,os); write32le(ITCMRegion,os); write32le(DTCMRegion,os); write32le(processID,os); write32le(RAM_TAG,os); write32le(testState,os); write32le(cacheDbg,os); for(int i=0;i<8;i++) write32le(regionWriteMask_USR[i],os); for(int i=0;i<8;i++) write32le(regionWriteMask_SYS[i],os); for(int i=0;i<8;i++) write32le(regionReadMask_USR[i],os); for(int i=0;i<8;i++) write32le(regionReadMask_SYS[i],os); for(int i=0;i<8;i++) write32le(regionExecuteMask_USR[i],os); for(int i=0;i<8;i++) write32le(regionExecuteMask_SYS[i],os); for(int i=0;i<8;i++) write32le(regionWriteSet_USR[i],os); for(int i=0;i<8;i++) write32le(regionWriteSet_SYS[i],os); for(int i=0;i<8;i++) write32le(regionReadSet_USR[i],os); for(int i=0;i<8;i++) write32le(regionReadSet_SYS[i],os); for(int i=0;i<8;i++) write32le(regionExecuteSet_USR[i],os); for(int i=0;i<8;i++) write32le(regionExecuteSet_SYS[i],os); } bool armcp15_t::loadone(EMUFILE* is) { if(!read32le(&IDCode,is)) return false; if(!read32le(&cacheType,is)) return false; if(!read32le(&TCMSize,is)) return false; if(!read32le(&ctrl,is)) return false; if(!read32le(&DCConfig,is)) return false; if(!read32le(&ICConfig,is)) return false; if(!read32le(&writeBuffCtrl,is)) return false; if(!read32le(&und,is)) return false; if(!read32le(&DaccessPerm,is)) return false; if(!read32le(&IaccessPerm,is)) return false; for(int i=0;i<8;i++) if(!read32le(&protectBaseSize[i],is)) return false; if(!read32le(&cacheOp,is)) return false; if(!read32le(&DcacheLock,is)) return false; if(!read32le(&IcacheLock,is)) return false; if(!read32le(&ITCMRegion,is)) return false; if(!read32le(&DTCMRegion,is)) return false; if(!read32le(&processID,is)) return false; if(!read32le(&RAM_TAG,is)) return false; if(!read32le(&testState,is)) return false; if(!read32le(&cacheDbg,is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteMask_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteMask_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadMask_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadMask_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteMask_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteMask_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteSet_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteSet_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadSet_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadSet_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteSet_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteSet_SYS[i],is)) return false; return true; } desmume-0.9.11/src/path.cpp0000755000000000000000000000775412467662066014225 0ustar rootroot/* Copyright (C) 2009-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "types.h" #include "path.h" #include //----------------------------------- //This is taken from mono Path.cs static const char InvalidPathChars[] = { '\x22', '\x3C', '\x3E', '\x7C', '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F' //but I added this #ifdef HOST_WINDOWS ,'\x2F' #endif }; //but it is sort of windows-specific. Does it work in linux? Maybe we'll have to make it smarter static const char VolumeSeparatorChar = ':'; static const char AltDirectorySeparatorChar = '/'; static bool dirEqualsVolume = (DIRECTORY_DELIMITER_CHAR == VolumeSeparatorChar); bool Path::IsPathRooted (const std::string &path) { if (path.empty()) { return false; } if (path.find_first_of(InvalidPathChars) != std::string::npos) { return false; } char c = path[0]; return (c == DIRECTORY_DELIMITER_CHAR || c == AltDirectorySeparatorChar || (!dirEqualsVolume && path.size() > 1 && path[1] == VolumeSeparatorChar)); } std::string Path::GetFileDirectoryPath(std::string filePath) { if (filePath.empty()) { return ""; } size_t i = filePath.find_last_of(ALL_DIRECTORY_DELIMITER_STRING); if (i == std::string::npos) { return filePath; } return filePath.substr(0, i); } std::string Path::GetFileNameFromPath(std::string filePath) { if (filePath.empty()) { return ""; } size_t i = filePath.find_last_of(ALL_DIRECTORY_DELIMITER_STRING); if (i == std::string::npos) { return filePath; } return filePath.substr(i + 1); } std::string Path::GetFileNameWithoutExt(std::string fileName) { if (fileName.empty()) { return ""; } size_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR); if (i == std::string::npos) { return fileName; } return fileName.substr(0, i); } std::string Path::ScrubInvalid(std::string str) { for (std::string::iterator it(str.begin()); it != str.end(); ++it) { bool ok = true; for(int i=0;i. */ #define WIN32_LEAN_AND_MEAN #include "movie.h" #include #include #include #include #include "utils/guid.h" #include "utils/xstring.h" #include "utils/datetime.h" #include "utils/ConvertUTF.h" #include "MMU.h" #include "NDSSystem.h" #include "readwrite.h" #include "debug.h" #include "driver.h" #include "rtc.h" #include "common.h" #include "mic.h" #include "version.h" #include "GPU_osd.h" #include "path.h" #include "emufile.h" using namespace std; bool freshMovie = false; //True when a movie loads, false when movie is altered. Used to determine if a movie has been altered since opening bool autoMovieBackup = true; #define FCEU_PrintError LOG #define MOVIE_VERSION 1 #ifdef WIN32 #include ".\windows\main.h" #endif //----movie engine main state EMOVIEMODE movieMode = MOVIEMODE_INACTIVE; //this should not be set unless we are in MOVIEMODE_RECORD! EMUFILE* osRecordingMovie = 0; int currFrameCounter; uint32 cur_input_display = 0; int pauseframe = -1; bool movie_readonly = true; char curMovieFilename[512] = {0}; MovieData currMovieData; int currRerecordCount; bool movie_reset_command = false; //-------------- void MovieData::clearRecordRange(int start, int len) { for(int i=0;ipad != compareRec.pad) return false; //Check Stylus if (this->touch.padding != compareRec.touch.padding) return false; if (this->touch.touch != compareRec.touch.touch) return false; if (this->touch.x != compareRec.touch.x) return false; if (this->touch.y != compareRec.touch.y) return false; //Check comamnds //if new commands are ever recordable, they need to be added here if we go with this method if(this->command_reset() != compareRec.command_reset()) return false; if(this->command_microphone() != compareRec.command_microphone()) return false; if(this->command_lid() != compareRec.command_lid()) return false; return true; } const char MovieRecord::mnemonics[13] = {'R','L','D','U','T','S','B','A','Y','X','W','E','G'}; void MovieRecord::dumpPad(EMUFILE* fp, u16 pad) { //these are mnemonics for each joystick bit. //since we usually use the regular joypad, these will be more helpful. //but any character other than ' ' or '.' should count as a set bit //maybe other input types will need to be encoded another way.. for(int bit=0;bit<13;bit++) { int bitmask = (1<<(12-bit)); char mnemonic = mnemonics[bit]; //if the bit is set write the mnemonic if(pad & bitmask) fp->fputc(mnemonic); else //otherwise write an unset bit fp->fputc('.'); } } void MovieRecord::parsePad(EMUFILE* fp, u16& pad) { char buf[13]; fp->fread(buf,13); pad = 0; for(int i=0;i<13;i++) { pad <<= 1; pad |= ((buf[i]=='.'||buf[i]==' ')?0:1); } } void MovieRecord::parse(EMUFILE* fp) { //by the time we get in here, the initial pipe has already been extracted //extract the commands commands = u32DecFromIstream(fp); fp->fgetc(); //eat the pipe parsePad(fp, pad); touch.x = u32DecFromIstream(fp); touch.y = u32DecFromIstream(fp); touch.touch = u32DecFromIstream(fp); fp->fgetc(); //eat the pipe //should be left at a newline } void MovieRecord::dump(EMUFILE* fp) { //dump the misc commands //*os << '|' << setw(1) << (int)commands; fp->fputc('|'); putdec(fp,commands); fp->fputc('|'); dumpPad(fp, pad); putdec(fp,touch.x); fp->fputc(' '); putdec(fp,touch.y); fp->fputc(' '); putdec(fp,touch.touch); fp->fputc('|'); //each frame is on a new line fp->fputc('\n'); } DateTime FCEUI_MovieGetRTCDefault() { // compatible with old desmume return DateTime(2009,1,1,0,0,0); } MovieData::MovieData() : version(MOVIE_VERSION) , emuVersion(EMU_DESMUME_VERSION_NUMERIC()) , romChecksum(0) , rerecordCount(0) , binaryFlag(false) , rtcStart(FCEUI_MovieGetRTCDefault()) { } void MovieData::truncateAt(int frame) { if((int)records.size() > frame) records.resize(frame); } void MovieData::installValue(std::string& key, std::string& val) { //todo - use another config system, or drive this from a little data structure. because this is gross if(key == "version") installInt(val,version); else if(key == "emuVersion") installInt(val,emuVersion); else if(key == "rerecordCount") installInt(val,rerecordCount); else if(key == "romFilename") romFilename = val; else if(key == "romChecksum") { // TODO: The current implementation of reading the checksum doesn't work correctly, and can // cause crashes when the MovieData object is deallocated. (This is caused by StringToBytes() // overrunning romChecksum into romSerial, making romSerial undefined.) Set romChecksum to // some dummy value for now to prevent crashing. This is okay, since romChecksum isn't actually // used in practice at this time. - rogerman, 2012/08/24 //StringToBytes(val,&romChecksum,MD5DATA::size); romChecksum = 0; } else if(key == "romSerial") romSerial = val; else if(key == "guid") guid = Desmume_Guid::fromString(val); else if(key == "rtcStart") { // sloppy format check and parse const char *validFormatStr = "####-##-##T##:##:##Z"; bool validFormat = true; for (int i = 0; validFormatStr[i] != '\0'; i++) { if (validFormatStr[i] != val[i] && !(validFormatStr[i] == '#' && isdigit(val[i]))) { validFormat = false; break; } } if (validFormat) { struct tm t; const char *s = val.data(); int year = atoi(&s[0]); int mon = atoi(&s[5]); int day = atoi(&s[8]); int hour = atoi(&s[11]); int min = atoi(&s[14]); int sec = atoi(&s[17]); rtcStart = DateTime(year,mon,day,hour,min,sec); } } else if(key == "rtcStartNew") { DateTime::TryParse(val.c_str(),rtcStart); } else if(key == "comment") comments.push_back(mbstowcs(val)); else if(key == "binary") installBool(val,binaryFlag); else if(key == "savestate") { BinaryDataFromString(val, &this->savestate); } else if(key == "sram") { BinaryDataFromString(val, &this->sram); } } int MovieData::dump(EMUFILE* fp, bool binary) { int start = fp->ftell(); fp->fprintf("version %d\n", version); fp->fprintf("emuVersion %d\n", emuVersion); fp->fprintf("rerecordCount %d\n", rerecordCount); fp->fprintf("romFilename %s\n", romFilename.c_str()); fp->fprintf("romChecksum %s\n", u32ToHexString(gameInfo.crc).c_str()); fp->fprintf("romSerial %s\n", romSerial.c_str()); fp->fprintf("guid %s\n", guid.toString().c_str()); fp->fprintf("useExtBios %d\n", CommonSettings.UseExtBIOS?1:0); fp->fprintf("advancedTiming %d\n", CommonSettings.advanced_timing?1:0); if(CommonSettings.UseExtBIOS) fp->fprintf("swiFromBios %d\n", CommonSettings.SWIFromBIOS?1:0); fp->fprintf("useExtFirmware %d\n", CommonSettings.UseExtFirmware?1:0); if(CommonSettings.UseExtFirmware) { fp->fprintf("bootFromFirmware %d\n", CommonSettings.BootFromFirmware?1:0); } else { UTF8 fwNicknameUTF8[MAX_FW_NICKNAME_LENGTH*4]; UTF8 *fwNicknameUTF8Start = fwNicknameUTF8; const UTF16 *fwNicknameUTF16 = (const UTF16 *)CommonSettings.fw_config.nickname; memset(fwNicknameUTF8, 0, sizeof(fwNicknameUTF8)); ConvertUTF16toUTF8(&fwNicknameUTF16, fwNicknameUTF16 + CommonSettings.fw_config.nickname_len, &fwNicknameUTF8Start, fwNicknameUTF8Start + sizeof(fwNicknameUTF8), strictConversion); UTF8 fwMessageUTF8[MAX_FW_MESSAGE_LENGTH*4]; UTF8 *fwMessageUTF8Start = fwMessageUTF8; const UTF16 *fwMessageUTF16 = (const UTF16 *)CommonSettings.fw_config.message; memset(fwMessageUTF8, 0, sizeof(fwMessageUTF8)); ConvertUTF16toUTF8(&fwMessageUTF16, fwMessageUTF16 + CommonSettings.fw_config.message_len, &fwMessageUTF8Start, fwMessageUTF8Start + sizeof(fwMessageUTF8), strictConversion); fp->fprintf("firmNickname %s\n", fwNicknameUTF8); fp->fprintf("firmMessage %s\n", fwMessageUTF8); fp->fprintf("firmFavColour %d\n", CommonSettings.fw_config.fav_colour); fp->fprintf("firmBirthMonth %d\n", CommonSettings.fw_config.birth_month); fp->fprintf("firmBirthDay %d\n", CommonSettings.fw_config.birth_day); fp->fprintf("firmLanguage %d\n", CommonSettings.fw_config.language); } fp->fprintf("rtcStartNew %s\n", rtcStart.ToString().c_str()); for(uint32 i=0;ifprintf("comment %s\n", wcstombs(comments[i]).c_str()); if(binary) fp->fprintf("binary 1\n"); if(savestate.size() != 0) fp->fprintf("savestate %s\n", BytesToString(&savestate[0],savestate.size()).c_str()); if(sram.size() != 0) fp->fprintf("sram %s\n", BytesToString(&sram[0],sram.size()).c_str()); if(binary) { //put one | to start the binary dump fp->fputc('|'); for(int i=0;i<(int)records.size();i++) records[i].dumpBinary(fp); } else for(int i=0;i<(int)records.size();i++) records[i].dump(fp); int end = fp->ftell(); return end-start; } //yuck... another custom text parser. bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader) { //TODO - start with something different. like 'desmume movie version 1" int curr = fp->ftell(); //movie must start with "version 1" char buf[9]; curr = fp->ftell(); fp->fread(buf,9); fp->fseek(curr, SEEK_SET); // if(fp->fail()) return false; if(memcmp(buf,"version 1",9)) return false; std::string key,value; enum { NEWLINE, KEY, SEPARATOR, VALUE, RECORD, COMMENT } state = NEWLINE; bool bail = false; for(;;) { bool iswhitespace, isrecchar, isnewline; int c; if(size--<=0) goto bail; c = fp->fgetc(); if(c == -1) goto bail; iswhitespace = (c==' '||c=='\t'); isrecchar = (c=='|'); isnewline = (c==10||c==13); if(isrecchar && movieData.binaryFlag && !stopAfterHeader) { LoadFM2_binarychunk(movieData, fp, size); return true; } switch(state) { case NEWLINE: if(isnewline) goto done; if(iswhitespace) goto done; if(isrecchar) goto dorecord; //must be a key key = ""; value = ""; goto dokey; break; case RECORD: { dorecord: if (stopAfterHeader) return true; int currcount = movieData.records.size(); movieData.records.resize(currcount+1); int preparse = fp->ftell(); movieData.records[currcount].parse(fp); int postparse = fp->ftell(); size -= (postparse-preparse); state = NEWLINE; break; } case KEY: dokey: //dookie state = KEY; if(iswhitespace) goto doseparator; if(isnewline) goto commit; key += c; break; case SEPARATOR: doseparator: state = SEPARATOR; if(isnewline) goto commit; if(!iswhitespace) goto dovalue; break; case VALUE: dovalue: state = VALUE; if(isnewline) goto commit; value += c; break; case COMMENT: default: break; } goto done; bail: bail = true; if(state == VALUE) goto commit; goto done; commit: movieData.installValue(key,value); state = NEWLINE; done: ; if(bail) break; } return true; } static void closeRecordingMovie() { if(osRecordingMovie) { delete osRecordingMovie; osRecordingMovie = 0; } } /// Stop movie playback. static void StopPlayback() { driver->USR_InfoMessage("Movie playback stopped."); movieMode = MOVIEMODE_INACTIVE; } /// Stop movie playback without closing the movie. static void FinishPlayback() { driver->USR_InfoMessage("Movie finished playing."); movieMode = MOVIEMODE_FINISHED; } /// Stop movie recording static void StopRecording() { driver->USR_InfoMessage("Movie recording stopped."); movieMode = MOVIEMODE_INACTIVE; closeRecordingMovie(); } void FCEUI_StopMovie() { if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED) StopPlayback(); else if(movieMode == MOVIEMODE_RECORD) StopRecording(); curMovieFilename[0] = 0; freshMovie = false; } //begin playing an existing movie const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe) { //if(!tasedit && !FCEU_IsValidUI(FCEUI_PLAYMOVIE)) // return; // FIXME: name==null indicates to BROWSE to retrieve fname from user (or stdin if that's impossible), // when called from movie_play assert(fname); if(!fname) return "LoadMovie doesn't support browsing yet"; //mbg 6/10/08 - we used to call StopMovie here, but that cleared curMovieFilename and gave us crashes... if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED) StopPlayback(); else if(movieMode == MOVIEMODE_RECORD) StopRecording(); //-------------- currMovieData = MovieData(); strcpy(curMovieFilename, fname); //FCEUFILE *fp = FCEU_fopen(fname,0,"rb",0); //if (!fp) return; //if(fp->isArchive() && !_read_only) { // FCEU_PrintError("Cannot open a movie in read+write from an archive."); // return; //} //LoadFM2(currMovieData, fp->stream, INT_MAX, false); bool loadedfm2 = false; bool opened = false; // { EMUFILE* fp = new EMUFILE_FILE(fname, "rb"); // if(fs.is_open()) // { loadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false); opened = true; // } // fs.close(); delete fp; // } if(!opened) { // for some reason fs.open doesn't work, it has to be a whole new fstream object // fstream fs (fname, std::ios_base::in); loadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false); // fs.close(); delete fp; } if(!loadedfm2) return "failed to load movie"; //TODO //fully reload the game to reinitialize everything before playing any movie //poweron(true); // reset firmware (some games can write to it) if (CommonSettings.UseExtFirmware == false) { NDS_CreateDummyFirmware(&CommonSettings.fw_config); } NDS_Reset(); ////WE NEED TO LOAD A SAVESTATE //if(currMovieData.savestate.size() != 0) //{ // bool success = MovieData::loadSavestateFrom(&currMovieData.savestate); // if(!success) return; //} lagframecounter=0; LagFrameFlag=0; lastLag=0; TotalLagFrames=0; currFrameCounter = 0; pauseframe = _pauseframe; movie_readonly = _read_only; movieMode = MOVIEMODE_PLAY; currRerecordCount = currMovieData.rerecordCount; MMU_new.backupDevice.movie_mode(); if(currMovieData.sram.size() != 0) { bool success = MovieData::loadSramFrom(&currMovieData.sram); if(!success) return "failed to load sram"; } freshMovie = true; ClearAutoHold(); if(movie_readonly) driver->USR_InfoMessage("Replay started Read-Only."); else driver->USR_InfoMessage("Replay started Read+Write."); return NULL; // success } static void openRecordingMovie(const char* fname) { //osRecordingMovie = FCEUD_UTF8_fstream(fname, "wb"); osRecordingMovie = new EMUFILE_FILE(fname, "wb"); /*if(!osRecordingMovie) FCEU_PrintError("Error opening movie output file: %s",fname);*/ strcpy(curMovieFilename, fname); } bool MovieData::loadSramFrom(std::vector* buf) { EMUFILE_MEMORY ms(buf); MMU_new.backupDevice.load_movie(&ms); return true; } //static bool FCEUSS_SaveSRAM(EMUFILE* outstream, const std::string& fname) //{ // //a temp memory stream. we'll dump some data here and then compress // //TODO - support dumping directly without compressing to save a buffer copy ////TODO ///* memorystream ms; // // //size it // FILE * fp = fopen( fname.c_str(), "r" ); // if(!fp) // return 0; // // fseek( fp, 0, SEEK_END ); // int size = ftell(fp); // fclose(fp); // // filebuf fb; // fb.open (fname.c_str(), ios::in | ios::binary);//ios::in // istream is(&fb); // // char *buffer = new char[size]; // // is.read(buffer, size); // // outstream->write((char*)buffer,size); // // fb.close(); //*/ // // // return true; //} //begin recording a new movie //TODO - BUG - the record-from-another-savestate doesnt work. void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart) { //if(!FCEU_IsValidUI(FCEUI_RECORDMOVIE)) // return; assert(fname); FCEUI_StopMovie(); openRecordingMovie(fname); currFrameCounter = 0; //LagCounterReset(); currMovieData = MovieData(); currMovieData.guid.newGuid(); if(author != L"") currMovieData.comments.push_back(L"author " + author); currMovieData.romChecksum = gameInfo.crc; currMovieData.romSerial = gameInfo.ROMserial; currMovieData.romFilename = path.GetRomName(); currMovieData.rtcStart = rtcstart; // reset firmware (some games can write to it) if (CommonSettings.UseExtFirmware == false) { NDS_CreateDummyFirmware(&CommonSettings.fw_config); } NDS_Reset(); //todo ? //poweron(true); //else // MovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION); if(flag == 1) EMUFILE::readAllBytes(&currMovieData.sram, sramfname); //we are going to go ahead and dump the header. from now on we will only be appending frames currMovieData.dump(osRecordingMovie, false); currFrameCounter=0; lagframecounter=0; LagFrameFlag=0; lastLag=0; TotalLagFrames=0; movieMode = MOVIEMODE_RECORD; movie_readonly = false; currRerecordCount = 0; MMU_new.backupDevice.movie_mode(); if(currMovieData.sram.size() != 0) { bool success = MovieData::loadSramFrom(&currMovieData.sram); if(!success) return; } driver->USR_InfoMessage("Movie recording started."); } //the main interaction point between the emulator and the movie system. //either dumps the current joystick state or loads one state from the movie. //deprecated, should use the two functions it has been split into directly void FCEUMOV_AddInputState() { FCEUMOV_HandlePlayback(); FCEUMOV_HandleRecording(); } void FCEUMOV_HandlePlayback() { if(movieMode == MOVIEMODE_PLAY) { //stop when we run out of frames if(currFrameCounter == (int)currMovieData.records.size()) { FinishPlayback(); } else { UserInput &input = NDS_getProcessingUserInput(); ReplayRecToDesmumeInput(currMovieData.records[currFrameCounter], &input); } //if we are on the last frame, then pause the emulator if the player requested it if(currFrameCounter == (int)currMovieData.records.size()-1) { /*if(FCEUD_PauseAfterPlayback()) { FCEUI_ToggleEmulationPause(); }*/ } //pause the movie at a specified frame //if(FCEUMOV_ShouldPause() && FCEUI_EmulationPaused()==0) //{ // FCEUI_ToggleEmulationPause(); // FCEU_DispMessage("Paused at specified movie frame"); //} // it's apparently un-threadsafe to do this here // (causes crazy flickering in other OSD elements, at least) // and it's also pretty annoying, // and the framecounter display already conveys this info as well. // so, I'm disabling this, at least for now. // osd->addFixed(180, 176, "%s", "Playback"); } } void FCEUMOV_HandleRecording() { if(movieMode == MOVIEMODE_RECORD) { MovieRecord mr; const UserInput &input = NDS_getFinalUserInput(); DesmumeInputToReplayRec(input, &mr); assert(mr.touch.touch || (!mr.touch.x && !mr.touch.y)); //assert(nds.touchX == input.touch.touchX && nds.touchY == input.touch.touchY); //assert((mr.touch.x << 4) == nds.touchX && (mr.touch.y << 4) == nds.touchY); mr.dump(osRecordingMovie); currMovieData.records.push_back(mr); // it's apparently un-threadsafe to do this here // (causes crazy flickering in other OSD elements, at least) // and it's also pretty annoying, // and the framecounter display already conveys this info as well. // so, I'm disabling this, at least for now. // osd->addFixed(180, 176, "%s", "Recording"); } /*extern uint8 joy[4]; memcpy(&cur_input_display,joy,4);*/ } //TODO static void FCEUMOV_AddCommand(int cmd) { // do nothing if not recording a movie if(movieMode != MOVIEMODE_RECORD) return; //printf("%d\n",cmd); //MBG TODO BIG TODO TODO TODO //DoEncode((cmd>>3)&0x3,cmd&0x7,1); } //little endian 4-byte cookies static const int kMOVI = 0x49564F4D; static const int kNOMO = 0x4F4D4F4E; void mov_savestate(EMUFILE* fp) { //we are supposed to dump the movie data into the savestate //if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY) // return currMovieData.dump(os, true); //else return 0; if(movieMode != MOVIEMODE_INACTIVE) { write32le(kMOVI,fp); currMovieData.dump(fp, true); } else { write32le(kNOMO,fp); } } bool CheckTimelines(MovieData& stateMovie, MovieData& currMovie, int& errorFr) { bool isInTimeline = true; int length; //First check, make sure we are checking is for a post-movie savestate, we just want to adjust the length for now, we will handle this situation later in another function if (currFrameCounter <= stateMovie.getNumRecords()) length = currFrameCounter; //Note: currFrameCounter corresponds to the framecounter in the savestate else if (currFrameCounter > currMovie.getNumRecords()) //Now that we know the length of the records of the savestate we plan to load, let's match the length against the movie length = currMovie.getNumRecords(); //If length < currMovie records then this is a "future" event from the current movie, againt we will handle this situation later, we just want to find the right number of frames to compare else length = stateMovie.getNumRecords(); for (int x = 0; x < length; x++) { if (!stateMovie.records[x].Compare(currMovie.records[x])) { isInTimeline = false; errorFr = x; break; } } return isInTimeline; } static bool load_successful; bool mov_loadstate(EMUFILE* fp, int size) { load_successful = false; u32 cookie; if(read32le(&cookie,fp) != 1) return false; if(cookie == kNOMO) { if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY) FinishPlayback(); return true; } else if(cookie != kMOVI) return false; size -= 4; if (!movie_readonly && autoMovieBackup && freshMovie) //If auto-backup is on, movie has not been altered this session and the movie is in read+write mode { FCEUI_MakeBackupMovie(false); //Backup the movie before the contents get altered, but do not display messages } //a little rule: cant load states in read+write mode with a movie from an archive. //so we are going to switch it to readonly mode in that case // if(!movie_readonly // //*&& FCEU_isFileInArchive(curMovieFilename)*/ // ) { // FCEU_PrintError("Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only."); // movie_readonly = true; // } MovieData tempMovieData = MovieData(); //int curr = fp->ftell(); if(!LoadFM2(tempMovieData, fp, size, false)) { // is->seekg((uint32)curr+size); /* extern bool FCEU_state_loading_old_format; if(FCEU_state_loading_old_format) { if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_RECORD) { FCEUI_StopMovie(); FCEU_PrintError("You have tried to use an old savestate while playing a movie. This is unsupported (since the old savestate has old-format movie data in it which can't be converted on the fly)"); } }*/ return false; } //---------------- //complex TAS logic for loadstate //fully conforms to the savestate logic documented in the Laws of TAS //http://tasvideos.org/LawsOfTAS/OnSavestates.html //---------------- /* Playback or Recording + Read-only * Check that GUID of movie and savestate-movie must match or else error o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway. + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted if user has backup savstates enabled else stop movie * Check that movie and savestate-movie are in same timeline. If not then this is a wrong timeline error. o on error: a message informing that the savestate doesn't belong to this movie + failstate: loadstate attempt canceled, movie can resume as if not attempted if user has backup savestates enabled else stop movie * Check that savestate-movie is not greater than movie. If not then this is a future event error and is not allowed in read-only o on error: message informing that the savestate is from a frame after the last frame of the movie + failstate - loadstate attempt cancelled, movie can resume if user has backup savesattes enabled, else stop movie * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate o on post-movie: See post-movie event section. * All error checks have passed, state will be loaded * Movie contained in the savestate will be discarded * Movie is now in Playback mode Playback, Recording + Read+write * Check that GUID of movie and savestate-movie must match or else error o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway. + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted (stop movie if resume fails)canceled, movie can resume if backup savestates enabled else stopmovie * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate o on post-movie: See post-movie event section. * savestate passed all error checks and will now be loaded in its entirety and replace movie (note: there will be no truncation yet) * current framecount will be set to savestate framecount * on the next frame of input, movie will be truncated to framecount o (note: savestate-movie can be a future event of the movie timeline, or a completely new timeline and it is still allowed) * Rerecord count of movie will be incremented * Movie is now in record mode Post-movie savestate event * Whan a savestate is loaded and is determined that the savestate-movie length is less than the savestate framecount then it is a post-movie savestate. These occur when a savestate was made during Movie Finished mode. * If read+write, the entire savestate movie will be loaded and replace current movie. * If read-only, the savestate movie will be discarded * Mode will be switched to Move Finished * Savestate will be loaded * Current framecount changes to savestate framecount * User will have control of input as if Movie inactive mode */ if(movieMode != MOVIEMODE_INACTIVE) { //handle moviefile mismatch if(tempMovieData.guid != currMovieData.guid) { //mbg 8/18/08 - this code can be used to turn the error message into an OK/CANCEL #if defined(WIN32) && !defined(DESMUME_QT) std::string msg = "There is a mismatch between savestate's movie and current movie.\ncurrent: " + currMovieData.guid.toString() + "\nsavestate: " + tempMovieData.guid.toString() + "\n\nThis means that you have loaded a savestate belonging to a different movie than the one you are playing now.\n\nContinue loading this savestate anyway?"; int result = MessageBox(MainWindow->getHWnd(),msg.c_str(),"Error loading savestate",MB_OKCANCEL); if(result == IDCANCEL) return false; #else FCEU_PrintError("Mismatch between savestate's movie and current movie.\ncurrent: %s\nsavestate: %s\n",currMovieData.guid.toString().c_str(),tempMovieData.guid.toString().c_str()); return false; #endif } closeRecordingMovie(); if(!movie_readonly) { currMovieData = tempMovieData; currMovieData.rerecordCount = currRerecordCount; } if(currFrameCounter > (int)currMovieData.records.size()) { // if the frame counter is longer than our current movie, // switch to "finished" mode. // this is a mode that behaves like "inactive" // except it permits switching to play/record by loading an earlier savestate. // (and we continue to store the finished movie in savestates made while finished) osd->setLineColor(255,0,0); // let's make the text red too to hopefully catch the user's attention a bit. FinishPlayback(); osd->setLineColor(255,255,255); //FCEU_PrintError("Savestate is from a frame (%d) after the final frame in the movie (%d). This is not permitted.", currFrameCounter, currMovieData.records.size()-1); //return false; } else if(movie_readonly) { //------------------------------------------------------------- //this code would reload the movie from disk. allegedly it is helpful to hexers, but //it is way too slow with dsm format. so it is only here as a reminder, and in case someone //wants to play with it //------------------------------------------------------------- //{ // fstream fs (curMovieFilename); // if(!LoadFM2(tempMovieData, &fs, INT_MAX, false)) // { // FCEU_PrintError("Failed to reload DSM after loading savestate"); // } // fs.close(); // currMovieData = tempMovieData; //} //------------------------------------------------------------- movieMode = MOVIEMODE_PLAY; } else { // #ifdef _S9XLUA_H // if(!FCEU_LuaRerecordCountSkip()) currRerecordCount++; // #endif currMovieData.rerecordCount = currRerecordCount; currMovieData.truncateAt(currFrameCounter); openRecordingMovie(curMovieFilename); if(!osRecordingMovie) { osd->setLineColor(255, 0, 0); osd->addLine("Can't save movie file!"); } //printf("DUMPING MOVIE: %d FRAMES\n",currMovieData.records.size()); currMovieData.dump(osRecordingMovie, false); movieMode = MOVIEMODE_RECORD; } } load_successful = true; freshMovie = false; return true; } static void FCEUMOV_PreLoad(void) { load_successful=0; } static bool FCEUMOV_PostLoad(void) { if(movieMode == MOVIEMODE_INACTIVE) return true; else return load_successful; } bool FCEUI_MovieGetInfo(EMUFILE* fp, MOVIE_INFO& info, bool skipFrameCount) { //MovieData md; //if(!LoadFM2(md, fp, INT_MAX, skipFrameCount)) // return false; // //info.movie_version = md.version; //info.poweron = md.savestate.size()==0; //info.pal = md.palFlag; //info.nosynchack = true; //info.num_frames = md.records.size(); //info.md5_of_rom_used = md.romChecksum; //info.emu_version_used = md.emuVersion; //info.name_of_rom_used = md.romFilename; //info.rerecord_count = md.rerecordCount; //info.comments = md.comments; return true; } bool MovieRecord::parseBinary(EMUFILE* fp) { commands=fp->fgetc(); fp->fread((char *) &pad, sizeof pad); fp->fread((char *) &touch.x, sizeof touch.x); fp->fread((char *) &touch.y, sizeof touch.y); fp->fread((char *) &touch.touch, sizeof touch.touch); return true; } void MovieRecord::dumpBinary(EMUFILE* fp) { fp->fputc(this->commands); fp->fwrite((char *) &this->pad, sizeof(this->pad)); fp->fwrite((char *) &this->touch.x, sizeof(this->touch.x)); fp->fwrite((char *) &this->touch.y, sizeof(this->touch.y)); fp->fwrite((char *) &this->touch.touch, sizeof(this->touch.touch)); } void LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size) { int recordsize = 1; //1 for the command recordsize = 6; assert(size%6==0); //find out how much remains in the file int curr = fp->ftell(); fp->fseek(0,SEEK_END); int end = fp->ftell(); int flen = end-curr; fp->fseek(curr,SEEK_SET); //the amount todo is the min of the limiting size we received and the remaining contents of the file int todo = std::min(size, flen); int numRecords = todo/recordsize; //printf("LOADED MOVIE: %d records; currFrameCounter: %d\n",numRecords,currFrameCounter); movieData.records.resize(numRecords); for(int i=0;i static bool CheckFileExists(const char* filename) { //This function simply checks to see if the given filename exists string checkFilename; if (filename) checkFilename = filename; //Check if this filename exists FILE* fp = fopen(checkFilename.c_str(), "rb"); if (!fp) { return false; } else { fclose(fp); return true; } } void FCEUI_MakeBackupMovie(bool dispMessage) { //This function generates backup movie files string currentFn; //Current movie fillename string backupFn; //Target backup filename string tempFn; //temp used in back filename creation stringstream stream; int x; //Temp variable for string manip bool exist = false; //Used to test if filename exists bool overflow = false; //Used for special situation when backup numbering exceeds limit currentFn = curMovieFilename; //Get current moviefilename backupFn = curMovieFilename; //Make backup filename the same as current moviefilename x = backupFn.find_last_of("."); //Find file extension backupFn = backupFn.substr(0,x); //Remove extension tempFn = backupFn; //Store the filename at this point for (unsigned int backNum=0;backNum<999;backNum++) //999 = arbituary limit to backup files { stream.str(""); //Clear stream if (backNum > 99) stream << "-" << backNum; //assign backNum to stream else if (backNum <= 99 && backNum >= 10) stream << "-0" << backNum; //Make it 010, etc if two digits else stream << "-00" << backNum; //Make it 001, etc if single digit backupFn.append(stream.str()); //add number to bak filename backupFn.append(".bak"); //add extension exist = CheckFileExists(backupFn.c_str()); //Check if file exists if (!exist) break; //Yeah yeah, I should use a do loop or something else { backupFn = tempFn; //Before we loop again, reset the filename if (backNum == 999) //If 999 exists, we have overflowed, let's handle that { backupFn.append("-001.bak"); //We are going to simply overwrite 001.bak overflow = true; //Flag that we have exceeded limit break; //Just in case } } } MovieData md = currMovieData; //Get current movie data EMUFILE* outf = new EMUFILE_FILE(backupFn.c_str(),"wb"); //FCEUD_UTF8_fstream(backupFn, "wb"); //open/create file md.dump(outf,false); //dump movie data delete outf; //clean up, delete file object //TODO, decide if fstream successfully opened the file and print error message if it doesn't if (dispMessage) //If we should inform the user { // if (overflow) // FCEUI_DispMessage("Backup overflow, overwriting %s",backupFn.c_str()); //Inform user of overflow // else // FCEUI_DispMessage("%s created",backupFn.c_str()); //Inform user of backup filename } } void BinaryDataFromString(std::string &inStringData, std::vector *outBinaryData) { int len = Base64StringToBytesLength(inStringData); if(len == -1) len = HexStringToBytesLength(inStringData); // wasn't base64, try hex if(len >= 1) { outBinaryData->resize(len); StringToBytes(inStringData, &outBinaryData->front(), len); // decodes either base64 or hex } } void ReplayRecToDesmumeInput(const MovieRecord &theRecord, UserInput *theInput) { if (theInput == NULL) { return; } if(theRecord.command_reset()) { NDS_Reset(); return; } else { movie_reset_command = false; } const u16 pad = theRecord.pad; theInput->buttons.R = (((pad>>12)&1)!=0); theInput->buttons.L = (((pad>>11)&1)!=0); theInput->buttons.D = (((pad>>10)&1)!=0); theInput->buttons.U = (((pad>>9)&1)!=0); theInput->buttons.T = (((pad>>8)&1)!=0); theInput->buttons.S = (((pad>>7)&1)!=0); theInput->buttons.B = (((pad>>6)&1)!=0); theInput->buttons.A = (((pad>>5)&1)!=0); theInput->buttons.Y = (((pad>>4)&1)!=0); theInput->buttons.X = (((pad>>3)&1)!=0); theInput->buttons.W = (((pad>>2)&1)!=0); theInput->buttons.E = (((pad>>1)&1)!=0); theInput->buttons.G = (((pad>>0)&1)!=0); theInput->buttons.F = theRecord.command_lid(); theInput->touch.touchX = theRecord.touch.x << 4; theInput->touch.touchY = theRecord.touch.y << 4; theInput->touch.isTouch = (theRecord.touch.touch != 0); theInput->mic.micButtonPressed = (theRecord.command_microphone()) ? 1 : 0; } void DesmumeInputToReplayRec(const UserInput &theInput, MovieRecord *theRecord) { theRecord->commands = 0; if(theInput.mic.micButtonPressed == 1) theRecord->commands = MOVIECMD_MIC; theRecord->pad = nds.pad; if(theInput.buttons.F) theRecord->commands = MOVIECMD_LID; if(movie_reset_command) { theRecord->commands = MOVIECMD_RESET; movie_reset_command = false; } theRecord->touch.touch = theInput.touch.isTouch ? 1 : 0; theRecord->touch.x = (theInput.touch.isTouch) ? theInput.touch.touchX >> 4 : 0; theRecord->touch.y = (theInput.touch.isTouch) ? theInput.touch.touchY >> 4 : 0; } desmume-0.9.11/src/ROMReader.h0000755000000000000000000000253412467662066014505 0ustar rootroot/* Copyright (C) 2007 Guillaume Duhamel Copyright (C) 2007 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifdef HAVE_LIBZ #include #endif #include #include "types.h" #define ROMREADER_DEFAULT -1 #define ROMREADER_STD 0 #define ROMREADER_GZIP 1 #define ROMREADER_ZIP 2 typedef struct { int id; const char * Name; void * (*Init)(const char * filename); void (*DeInit)(void * file); u32 (*Size)(void * file); int (*Seek)(void * file, int offset, int whence); int (*Read)(void * file, void * buffer, u32 size); } ROMReader_struct; extern ROMReader_struct STDROMReader; #ifdef HAVE_LIBZ extern ROMReader_struct GZIPROMReader; #endif #ifdef HAVE_LIBZZIP extern ROMReader_struct ZIPROMReader; #endif ROMReader_struct * ROMReaderInit(char ** filename); desmume-0.9.11/src/texcache.h0000755000000000000000000000406712467662066014514 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _TEXCACHE_H_ #define _TEXCACHE_H_ #include #include "types.h" enum TexCache_TexFormat { TexFormat_None, //used when nothing yet is cached TexFormat_32bpp, //used by ogl renderer TexFormat_15bpp //used by rasterizer }; class TexCacheItem; typedef std::multimap TTexCacheItemMultimap; class TexCacheItem { public: TexCacheItem() : decode_len(0) , decoded(NULL) , suspectedInvalid(false) , assumedInvalid(false) , deleteCallback(NULL) , cacheFormat(TexFormat_None) {} ~TexCacheItem() { delete[] decoded; if(deleteCallback) deleteCallback(this); } u32 decode_len; u32 mode; u8* decoded; //decoded texture data bool suspectedInvalid; bool assumedInvalid; TTexCacheItemMultimap::iterator iterator; int getTextureMode() const { return (int)((texformat>>26)&0x07); } u32 texformat, texpal; u32 sizeX, sizeY; float invSizeX, invSizeY; u64 texid; //used by ogl renderer for the texid void (*deleteCallback)(TexCacheItem*); TexCache_TexFormat cacheFormat; struct Dump { ~Dump() { delete[] texture; } int textureSize, indexSize; static const int maxTextureSize=128*1024; u8* texture; u8 palette[256*2]; } dump; }; void TexCache_Invalidate(); void TexCache_Reset(); void TexCache_EvictFrame(); TexCacheItem* TexCache_SetTexture(TexCache_TexFormat TEXFORMAT, u32 format, u32 texpal); #endif desmume-0.9.11/src/cheatSystem.h0000755000000000000000000001055712467662066015222 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include #include #include "types.h" #define CHEAT_VERSION_MAJOR 2 #define CHEAT_VERSION_MINOR 0 #define MAX_CHEAT_LIST 100 #define MAX_XX_CODE 1024 #define CHEAT_FILE_MIN_FGETS_BUFFER 32768 #define CHEAT_DB_GAME_TITLE_SIZE 256 struct CHEATS_LIST { CHEATS_LIST() { memset(this,0,sizeof(*this)); type = 0xFF; } u8 type; // 0 - internal cheat system // 1 - Action Replay // 2 - Codebreakers BOOL enabled; // TODO u8 freezeType; // 0 - normal freeze // 1 - can decrease // 2 - can increase u32 code[MAX_XX_CODE][2]; char description[1024]; int num; u8 size; }; class CHEATS { private: std::vector list; u8 filename[MAX_PATH]; u32 currentGet; void clear(); void ARparser(CHEATS_LIST& cheat); char *clearCode(char *s); public: CHEATS() : currentGet(0) { memset(filename, 0, sizeof(filename)); } ~CHEATS() {} void init(char *path); BOOL add(u8 size, u32 address, u32 val, char *description, BOOL enabled); BOOL update(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos); BOOL add_AR(char *code, char *description, BOOL enabled); BOOL update_AR(char *code, char *description, BOOL enabled, u32 pos); BOOL add_AR_Direct(CHEATS_LIST cheat); BOOL add_CB(char *code, char *description, BOOL enabled); BOOL update_CB(char *code, char *description, BOOL enabled, u32 pos); BOOL remove(u32 pos); void getListReset(); BOOL getList(CHEATS_LIST *cheat); CHEATS_LIST* getListPtr(); BOOL get(CHEATS_LIST *cheat, u32 pos); CHEATS_LIST* getItemByIndex(const u32 pos); u32 getSize(); size_t getActiveCount(); void setDescription(const char *description, u32 pos); BOOL save(); BOOL load(); void process(); void getXXcodeString(CHEATS_LIST cheat, char *res_buf); static BOOL XXCodeFromString(CHEATS_LIST *cheatItem, const std::string codeString); static BOOL XXCodeFromString(CHEATS_LIST *cheatItem, const char *codeString); }; class CHEATSEARCH { private: u8 *statMem; u8 *mem; u32 amount; u32 lastRecord; u32 _type; u32 _size; u32 _sign; public: CHEATSEARCH() : statMem(0), mem(0), amount(0), lastRecord(0), _type(0), _size(0), _sign(0) {} ~CHEATSEARCH() { close(); } BOOL start(u8 type, u8 size, u8 sign); BOOL close(); u32 search(u32 val); u32 search(u8 comp); u32 getAmount(); BOOL getList(u32 *address, u32 *curVal); void getListReset(); }; enum CHEATS_DB_TYPE { CHEATS_DB_R4 = 0 }; #pragma pack(push) #pragma pack(1) typedef struct FAT_R4 { u8 serial[4]; u32 CRC; u64 addr; } FAT_R4; #pragma pack(pop) class CHEATSEXPORT { private: CHEATS_DB_TYPE type; bool encrypted; FILE *fp; u32 fsize; u32 dataSize; u32 encOffset; FAT_R4 fat; bool search(); bool getCodes(); void R4decrypt(u8 *buf, u32 len, u32 n); u32 numCheats; CHEATS_LIST *cheats; u8 error; // 0 - no errors // 1 - open failed/file not found // 2 - file format is wrong (no valid header ID) // 3 - cheat not found in database // 4 - export error from database public: CHEATSEXPORT() : fp(NULL), fsize(0), dataSize(0), encOffset(0), type(CHEATS_DB_R4), encrypted(false), numCheats(0), cheats(0), CRC(0), error(0) { memset(date, 0, sizeof(date)); gametitle = (u8 *)malloc(CHEAT_DB_GAME_TITLE_SIZE); memset(gametitle, 0, CHEAT_DB_GAME_TITLE_SIZE); } ~CHEATSEXPORT() { free(gametitle); gametitle = NULL; } u8 *gametitle; u8 date[17]; u32 CRC; bool load(char *path); void close(); CHEATS_LIST *getCheats(); u32 getCheatsNum(); u8 getErrorCode() { return error; } }; extern CHEATS *cheats; extern CHEATSEARCH *cheatSearch; desmume-0.9.11/src/Disassembler.h0000755000000000000000000000166712467662066015350 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2009 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef DISASSEMBLER_H #define DISASSEMBLER_H #include "types.h" typedef char* (* DisasmOpFunc)(u32 adr, u32 i, char * txt); extern const DisasmOpFunc des_arm_instructions_set[4096]; extern const DisasmOpFunc des_thumb_instructions_set[1024]; #endif desmume-0.9.11/src/driver.h0000755000000000000000000000455612467662066014226 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _DRIVER_H_ #define _DRIVER_H_ #include #include "types.h" class VIEW3D_Driver { public: virtual void Launch() {} virtual void NewFrame() {} virtual bool IsRunning() { return false; } }; //each platform needs to implement this, although it doesnt need to implement any functions class BaseDriver { public: BaseDriver(); ~BaseDriver(); virtual void AVI_SoundUpdate(void* soundData, int soundLen) {} virtual bool AVI_IsRecording() { return FALSE; } virtual bool WAV_IsRecording() { return FALSE; } virtual void USR_InfoMessage(const char *message); virtual void USR_RefreshScreen() {} virtual void USR_SetDisplayPostpone(int milliseconds, bool drawNextFrame) {} // -1 == indefinitely, 0 == don't pospone, 500 == don't draw for 0.5 seconds enum eStepMainLoopResult { ESTEP_NOT_IMPLEMENTED = -1, ESTEP_CALL_AGAIN = 0, ESTEP_DONE = 1, }; virtual eStepMainLoopResult EMU_StepMainLoop(bool allowSleep, bool allowPause, int frameSkip, bool disableUser, bool disableCore) { return ESTEP_NOT_IMPLEMENTED; } // -1 frameSkip == useCurrentDefault virtual void EMU_PauseEmulation(bool pause) {} virtual bool EMU_IsEmulationPaused() { return false; } virtual bool EMU_IsFastForwarding() { return false; } virtual bool EMU_HasEmulationStarted() { return true; } virtual bool EMU_IsAtFrameBoundary() { return true; } virtual void EMU_DebugIdleEnter() {} virtual void EMU_DebugIdleUpdate() {} virtual void EMU_DebugIdleWakeUp() {} enum eDebug_IOReg { EDEBUG_IOREG_DMA }; virtual void DEBUG_UpdateIORegView(eDebug_IOReg category) { } VIEW3D_Driver* view3d; void VIEW3D_Shutdown(); void VIEW3D_Init(); }; #endif //_DRIVER_H_ desmume-0.9.11/src/SPU.h0000755000000000000000000001624712467662066013402 0ustar rootroot/* Copyright 2006 Theo Berkau Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef SPU_H #define SPU_H #include #include #include #include #include "types.h" #include "matrix.h" #include "metaspu/metaspu.h" class EMUFILE; #define SNDCORE_DEFAULT -1 #define SNDCORE_DUMMY 0 #define CHANSTAT_STOPPED 0 #define CHANSTAT_PLAY 1 //who made these static? theyre used in multiple places. FORCEINLINE u32 sputrunc(float f) { return u32floor(f); } FORCEINLINE u32 sputrunc(double d) { return u32floor(d); } FORCEINLINE s32 spumuldiv7(s32 val, u8 multiplier) { assert(multiplier <= 127); return (multiplier == 127) ? val : ((val * multiplier) >> 7); } enum SPUInterpolationMode { SPUInterpolation_None = 0, SPUInterpolation_Linear = 1, SPUInterpolation_Cosine = 2 }; struct SoundInterface_struct { int id; const char *Name; int (*Init)(int buffersize); void (*DeInit)(); void (*UpdateAudio)(s16 *buffer, u32 num_samples); u32 (*GetAudioSpace)(); void (*MuteAudio)(); void (*UnMuteAudio)(); void (*SetVolume)(int volume); void (*ClearBuffer)(); void (*FetchSamples)(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t (*PostProcessSamples)(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); }; extern SoundInterface_struct SNDDummy; extern SoundInterface_struct SNDFile; extern int SPU_currentCoreNum; struct channel_struct { channel_struct() : num(0), vol(0), volumeDiv(0), hold(0), pan(0), waveduty(0), repeat(0), format(0), keyon(0), status(0), addr(0), timer(0), loopstart(0), length(0), totlength(0), double_totlength_shifted(0.0), sampcnt(0.0), sampinc(0.0), lastsampcnt(0), pcm16b(0), pcm16b_last(0), loop_pcm16b(0), index(0), loop_index(0), x(0), psgnoise_last(0) {} u32 num; u8 vol; u8 volumeDiv; u8 hold; u8 pan; u8 waveduty; u8 repeat; u8 format; u8 keyon; u8 status; u32 addr; u16 timer; u16 loopstart; u32 length; u32 totlength; double double_totlength_shifted; double sampcnt; double sampinc; // ADPCM specific u32 lastsampcnt; s16 pcm16b, pcm16b_last; s16 loop_pcm16b; int index; int loop_index; u16 x; s16 psgnoise_last; }; class SPUFifo { public: SPUFifo(); void enqueue(s16 val); s16 dequeue(); s16 buffer[16]; s32 head,tail,size; void save(EMUFILE* fp); bool load(EMUFILE* fp); void reset(); }; class SPU_struct { public: SPU_struct(int buffersize); u32 bufpos; u32 buflength; s32 *sndbuf; s32 lastdata; //the last sample that a channel generated s16 *outbuf; u32 bufsize; channel_struct channels[16]; //registers struct REGS { REGS() : mastervol(0) , ctl_left(0) , ctl_right(0) , ctl_ch1bypass(0) , ctl_ch3bypass(0) , masteren(0) , soundbias(0) {} u8 mastervol; u8 ctl_left, ctl_right; u8 ctl_ch1bypass, ctl_ch3bypass; u8 masteren; u16 soundbias; enum LeftOutputMode { LOM_LEFT_MIXER=0, LOM_CH1=1, LOM_CH3=2, LOM_CH1_PLUS_CH3=3 }; enum RightOutputMode { ROM_RIGHT_MIXER=0, ROM_CH1=1, ROM_CH3=2, ROM_CH1_PLUS_CH3=3 }; struct CAP { CAP() : add(0), source(0), oneshot(0), bits8(0), active(0), dad(0), len(0) {} u8 add, source, oneshot, bits8, active; u32 dad; u16 len; struct Runtime { Runtime() : running(0), curdad(0), maxdad(0) {} u8 running; u32 curdad; u32 maxdad; double sampcnt; SPUFifo fifo; } runtime; } cap[2]; } regs; void reset(); ~SPU_struct(); void KeyOff(int channel); void KeyOn(int channel); void KeyProbe(int channel); void ProbeCapture(int which); void WriteByte(u32 addr, u8 val); void WriteWord(u32 addr, u16 val); void WriteLong(u32 addr, u32 val); u8 ReadByte(u32 addr); u16 ReadWord(u32 addr); u32 ReadLong(u32 addr); bool isSPU(u32 addr) { return ((addr >= 0x04000400) && (addr < 0x04000520)); } //kills all channels but leaves SPU otherwise running normally void ShutUp(); }; extern SPU_struct *SPU_core, *SPU_user; extern int spu_core_samples; int SPU_ChangeSoundCore(int coreid, int buffersize); SoundInterface_struct *SPU_SoundCore(); void SPU_ReInit(bool fakeBoot = false); int SPU_Init(int coreid, int buffersize); void SPU_Pause(int pause); void SPU_SetVolume(int volume); void SPU_SetSynchMode(int mode, int method); void SPU_ClearOutputBuffer(void); void SPU_Reset(void); void SPU_DeInit(void); void SPU_KeyOn(int channel); static FORCEINLINE void SPU_WriteByte(u32 addr, u8 val) { addr &= 0xFFF; SPU_core->WriteByte(addr,val); if(SPU_user) SPU_user->WriteByte(addr,val); } static FORCEINLINE void SPU_WriteWord(u32 addr, u16 val) { addr &= 0xFFF; SPU_core->WriteWord(addr,val); if(SPU_user) SPU_user->WriteWord(addr,val); } static FORCEINLINE void SPU_WriteLong(u32 addr, u32 val) { addr &= 0xFFF; SPU_core->WriteLong(addr,val); if(SPU_user) SPU_user->WriteLong(addr,val); } static FORCEINLINE u8 SPU_ReadByte(u32 addr) { return SPU_core->ReadByte(addr & 0x0FFF); } static FORCEINLINE u16 SPU_ReadWord(u32 addr) { return SPU_core->ReadWord(addr & 0x0FFF); } static FORCEINLINE u32 SPU_ReadLong(u32 addr) { return SPU_core->ReadLong(addr & 0x0FFF); } void SPU_Emulate_core(void); void SPU_Emulate_user(bool mix = true); void SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); void spu_savestate(EMUFILE* os); bool spu_loadstate(EMUFILE* is, int size); enum WAVMode { WAVMODE_ANY = -1, WAVMODE_CORE = 0, WAVMODE_USER = 1 }; class WavWriter { public: WavWriter(); bool open(const std::string & fname); void close(); void update(void* soundData, int numSamples); bool isRecording() const; WAVMode mode; private: FILE *spufp; }; void WAV_End(); bool WAV_Begin(const char* fname, WAVMode mode=WAVMODE_CORE); bool WAV_IsRecording(WAVMode mode=WAVMODE_ANY); void WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode=WAVMODE_CORE); // we should make this configurable eventually // but at least defining it somewhere is probably a step in the right direction #define DESMUME_SAMPLE_RATE 44100 //#define DESMUME_SAMPLE_RATE 48000 #endif desmume-0.9.11/src/thumb_tabdef.inc0000755000000000000000000016477612467662066015714 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2007-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ /* 00 0000 0000 */ TABDECL(OP_LSL_0), // OP_LSL_0 /* 00 0000 0001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1000 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0000 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1000 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0010 0000 */ TABDECL(OP_LSR_0), // OP_LSR_0 /* 00 0010 0001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1000 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0000 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1000 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0100 0000 */ TABDECL(OP_ASR_0), // OP_ASR_0 /* 00 0100 0001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1000 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0000 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1000 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0110 0000 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0001 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0010 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0011 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0100 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0101 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0110 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0111 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 1000 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1001 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1010 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1011 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1100 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1101 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1110 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1111 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0111 0000 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0001 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0010 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0011 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0100 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0101 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0110 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0111 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 1000 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1001 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1010 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1011 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1100 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1101 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1110 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1111 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 1000 0000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1010 0000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1100 0000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1110 0000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 01 0000 0000 */ TABDECL(OP_AND), // OP_AND /* 01 0000 0001 */ TABDECL(OP_EOR), // OP_EOR /* 01 0000 0010 */ TABDECL(OP_LSL_REG), // OP_LSL_REG /* 01 0000 0011 */ TABDECL(OP_LSR_REG), // OP_LSR_REG /* 01 0000 0100 */ TABDECL(OP_ASR_REG), // OP_ASR_REG /* 01 0000 0101 */ TABDECL(OP_ADC_REG), // OP_ADC_REG /* 01 0000 0110 */ TABDECL(OP_SBC_REG), // OP_SBC_REG /* 01 0000 0111 */ TABDECL(OP_ROR_REG), // OP_ROR_REG /* 01 0000 1000 */ TABDECL(OP_TST), // OP_TST /* 01 0000 1001 */ TABDECL(OP_NEG), // OP_NEG /* 01 0000 1010 */ TABDECL(OP_CMP), // OP_CMP /* 01 0000 1011 */ TABDECL(OP_CMN), // OP_CMN /* 01 0000 1100 */ TABDECL(OP_ORR), // OP_ORR /* 01 0000 1101 */ TABDECL(OP_MUL_REG), // OP_MUL_REG /* 01 0000 1110 */ TABDECL(OP_BIC), // OP_BIC /* 01 0000 1111 */ TABDECL(OP_MVN), // OP_MVN /* 01 0001 0000 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0001 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0010 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0011 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0100 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 0101 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 0110 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 0111 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 1000 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1001 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1010 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1011 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1100 */ TABDECL(OP_BX_THUMB), // OP_BX_THUMB /* 01 0001 1101 */ TABDECL(OP_BX_THUMB), // OP_BX_THUMB /* 01 0001 1110 */ TABDECL(OP_BLX_THUMB), // OP_BLX_THUMB /* 01 0001 1111 */ TABDECL(OP_BLX_THUMB), // OP_BLX_THUMB /* 01 0010 0000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0100 0000 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0001 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0010 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0011 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0100 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0101 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0110 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0111 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 1000 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1001 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1010 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1011 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1100 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1101 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1110 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1111 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0101 0000 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0001 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0010 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0011 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0100 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0101 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0110 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0111 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 1000 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1001 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1010 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1011 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1100 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1101 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1110 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1111 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0110 0000 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0001 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0010 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0011 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0100 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0101 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0110 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0111 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 1000 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1001 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1010 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1011 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1100 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1101 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1110 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1111 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0111 0000 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0001 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0010 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0011 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0100 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0101 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0110 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0111 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 1000 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1001 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1010 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1011 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1100 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1101 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1110 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1111 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 1000 0000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1010 0000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1100 0000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1110 0000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 10 0000 0000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0010 0000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0100 0000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0110 0000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 1000 0000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1010 0000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1100 0000 */ TABDECL(OP_ADJUST_P_SP), // OP_ADJUST_P_SP /* 10 1100 0001 */ TABDECL(OP_ADJUST_P_SP), // OP_ADJUST_P_SP /* 10 1100 0010 */ TABDECL(OP_ADJUST_M_SP), // OP_ADJUST_M_SP /* 10 1100 0011 */ TABDECL(OP_ADJUST_M_SP), // OP_ADJUST_M_SP /* 10 1100 0100 */ TABDECL(OP_UND_THUMB), /* 10 1100 0101 */ TABDECL(OP_UND_THUMB), /* 10 1100 0110 */ TABDECL(OP_UND_THUMB), /* 10 1100 0111 */ TABDECL(OP_UND_THUMB), /* 10 1100 1000 */ TABDECL(OP_UND_THUMB), /* 10 1100 1001 */ TABDECL(OP_UND_THUMB), /* 10 1100 1010 */ TABDECL(OP_UND_THUMB), /* 10 1100 1011 */ TABDECL(OP_UND_THUMB), /* 10 1100 1100 */ TABDECL(OP_UND_THUMB), /* 10 1100 1101 */ TABDECL(OP_UND_THUMB), /* 10 1100 1110 */ TABDECL(OP_UND_THUMB), /* 10 1100 1111 */ TABDECL(OP_UND_THUMB), /* 10 1101 0000 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0001 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0010 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0011 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0100 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 0101 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 0110 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 0111 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 1000 */ TABDECL(OP_UND_THUMB), /* 10 1101 1001 */ TABDECL(OP_UND_THUMB), /* 10 1101 1010 */ TABDECL(OP_UND_THUMB), /* 10 1101 1011 */ TABDECL(OP_UND_THUMB), /* 10 1101 1100 */ TABDECL(OP_UND_THUMB), /* 10 1101 1101 */ TABDECL(OP_UND_THUMB), /* 10 1101 1110 */ TABDECL(OP_UND_THUMB), /* 10 1101 1111 */ TABDECL(OP_UND_THUMB), /* 10 1110 0000 */ TABDECL(OP_UND_THUMB), /* 10 1110 0001 */ TABDECL(OP_UND_THUMB), /* 10 1110 0010 */ TABDECL(OP_UND_THUMB), /* 10 1110 0011 */ TABDECL(OP_UND_THUMB), /* 10 1110 0100 */ TABDECL(OP_UND_THUMB), /* 10 1110 0101 */ TABDECL(OP_UND_THUMB), /* 10 1110 0110 */ TABDECL(OP_UND_THUMB), /* 10 1110 0111 */ TABDECL(OP_UND_THUMB), /* 10 1110 1000 */ TABDECL(OP_UND_THUMB), /* 10 1110 1001 */ TABDECL(OP_UND_THUMB), /* 10 1110 1010 */ TABDECL(OP_UND_THUMB), /* 10 1110 1011 */ TABDECL(OP_UND_THUMB), /* 10 1110 1100 */ TABDECL(OP_UND_THUMB), /* 10 1110 1101 */ TABDECL(OP_UND_THUMB), /* 10 1110 1110 */ TABDECL(OP_UND_THUMB), /* 10 1110 1111 */ TABDECL(OP_UND_THUMB), /* 10 1111 0000 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0001 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0010 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0011 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0100 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 0101 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 0110 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 0111 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 1000 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1001 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1010 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1011 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1100 */ TABDECL(OP_UND_THUMB), /* 10 1111 1101 */ TABDECL(OP_UND_THUMB), /* 10 1111 1110 */ TABDECL(OP_UND_THUMB), /* 10 1111 1111 */ TABDECL(OP_UND_THUMB), /* 11 0000 0000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0010 0000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0100 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1100 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 0111 1101 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 0111 1110 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 0111 1111 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 1000 0000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1010 0000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1100 0000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1110 0000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0111 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1111 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0111 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1111 */ TABDECL(OP_BL_11), // OP_BL_11 desmume-0.9.11/src/firmware.cpp0000755000000000000000000007224212467662066015077 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "firmware.h" #include "NDSSystem.h" #include "MMU.h" #include "path.h" #include "encrypt.h" #include "wifi.h" #define DFC_ID_CODE "DeSmuME Firmware User Settings" #define DFC_ID_SIZE sizeof(DFC_ID_CODE) #define USER_SETTINGS_SIZE 0x100 #define WIFI_SETTINGS_SIZE 0x1D5 #define WIFI_AP_SETTINGS_SIZE 0x300 #define SETTINGS_SIZE (USER_SETTINGS_SIZE + WIFI_SETTINGS_SIZE + WIFI_AP_SETTINGS_SIZE) #define DFC_FILE_SIZE (SETTINGS_SIZE + DFC_ID_SIZE) #define WIFI_SETTINGS_OFF 0x0000002A #define WIFI_AP_SETTINGS_OFF 0x0003FA00 static _KEY1 enc(&MMU.ARM7_BIOS[0x0030]); u16 CFIRMWARE::getBootCodeCRC16() { unsigned int i, j; u32 crc = 0xFFFF; const u16 val[8] = {0xC0C1, 0xC181, 0xC301, 0xC601, 0xCC01, 0xD801, 0xF001, 0xA001}; for(i = 0; i < size9; i++) { crc = (crc ^ tmp_data9[i]); for(j = 0; j < 8; j++) { if(crc & 0x0001) crc = ((crc >> 1) ^ (val[j] << (7-j))); else crc = (crc >> 1); } } for(i = 0; i < size7; i++) { crc = (crc ^ tmp_data7[i]); for(j = 0; j < 8; j++) { if(crc & 0x0001) crc = ((crc >> 1) ^ (val[j] << (7-j))); else crc = (crc >> 1); } } return (crc & 0xFFFF); } u32 CFIRMWARE::decrypt(const u8 *in, u8* &out) { u32 curBlock[2] = { 0 }; u32 blockSize = 0; u32 xLen = 0; u32 i = 0, j = 0; u32 xIn = 4, xOut = 0; u32 len = 0; u32 offset = 0; u32 windowOffset = 0; u8 d = 0; u16 data = 0; memcpy(curBlock, in, 8); enc.decrypt(curBlock); blockSize = (curBlock[0] >> 8); if (blockSize == 0) return (0); out = new u8 [blockSize]; if (!out ) return (0); memset(out, 0xFF, blockSize); xLen = blockSize; while(xLen > 0) { d = T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); enc.decrypt(curBlock); } for(i = 0; i < 8; i++) { if(d & 0x80) { data = (T1ReadByte((u8*)curBlock, (xIn % 8)) << 8); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); enc.decrypt(curBlock); } data |= T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); enc.decrypt(curBlock); } len = (data >> 12) + 3; offset = (data & 0xFFF); windowOffset = (xOut - offset - 1); for(j = 0; j < len; j++) { T1WriteByte(out, xOut, T1ReadByte(out, windowOffset)); xOut++; windowOffset++; xLen--; if(xLen == 0) return (blockSize); } } else { T1WriteByte(out, xOut, T1ReadByte((u8*)curBlock, (xIn % 8))); xOut++; xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); enc.decrypt(curBlock); } xLen--; if(xLen == 0) return (blockSize); } d = ((d << 1) & 0xFF); } } return (blockSize); } u32 CFIRMWARE::decompress(const u8 *in, u8* &out) { u32 curBlock[2] = { 0 }; u32 blockSize = 0; u32 xLen = 0; u32 i = 0, j = 0; u32 xIn = 4, xOut = 0; u32 len = 0; u32 offset = 0; u32 windowOffset = 0; u8 d = 0; u16 data = 0; memcpy(curBlock, in, 8); blockSize = (curBlock[0] >> 8); if (blockSize == 0) return (0); out = new u8 [blockSize]; if (!out ) return (0); memset(out, 0xFF, blockSize); xLen = blockSize; while(xLen > 0) { d = T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } for(i = 0; i < 8; i++) { if(d & 0x80) { data = (T1ReadByte((u8*)curBlock, (xIn % 8)) << 8); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } data |= T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } len = (data >> 12) + 3; offset = (data & 0xFFF); windowOffset = (xOut - offset - 1); for(j = 0; j < len; j++) { T1WriteByte(out, xOut, T1ReadByte(out, windowOffset)); xOut++; windowOffset++; xLen--; if(xLen == 0) return (blockSize); } } else { T1WriteByte(out, xOut, T1ReadByte((u8*)curBlock, (xIn % 8))); xOut++; xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } xLen--; if(xLen == 0) return (blockSize); } d = ((d << 1) & 0xFF); } } return (blockSize); } //================================================================================ bool CFIRMWARE::load() { u32 size = 0; u8 *data = NULL; if (CommonSettings.UseExtFirmware == false) return false; if (strlen(CommonSettings.Firmware) == 0) return false; FILE *fp = fopen(CommonSettings.Firmware, "rb"); if (!fp) return false; fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); if( (size != NDS_FW_SIZE_V1) && (size != NDS_FW_SIZE_V2) ) { fclose(fp); return false; } data = new u8 [size]; if (!data) { fclose(fp); return false; } if (fread(data, 1, size, fp) != size) { delete [] data; data = NULL; fclose(fp); return false; } memcpy(&header, data, sizeof(header)); if ((header.fw_identifier & 0x00FFFFFF) != 0x0043414D) { delete [] data; data = NULL; fclose(fp); return false; } fclose(fp); if (MMU.fw.size != size) // reallocate mc_alloc(&MMU.fw, size); userDataAddr = T1ReadWord(data, 0x20) * 8; // fix bad dump of firmware? (wrong DS type) // fix mario kart touch screen calibration if ((T1ReadWord(data, 0x1E) != 0xFFFF) && data[0x1D] == 0x63) { data[0x1D] = NDS_CONSOLE_TYPE_FAT; data[0x1E] = 0xFF; data[0x1F] = 0xFF; } memcpy(MMU.fw.data, data, size); delete [] data; data = NULL; // Generate the path for the external firmware config file. std::string extFilePath = CFIRMWARE::GetExternalFilePath(); strncpy(MMU.fw.userfile, extFilePath.c_str(), MAX_PATH); successLoad = true; return true; } bool CFIRMWARE::unpack() { u32 src = 0; u16 shift1 = 0, shift2 = 0, shift3 = 0, shift4 = 0; u32 part1addr = 0, part2addr = 0, part3addr = 0, part4addr = 0, part5addr = 0; u32 part1ram = 0, part2ram = 0; u32 size = MMU.fw.size; if (size == 512*1024) { INFO("ERROR: 32Mbit (512Kb) firmware not supported\n"); return false; } u8 *data = new u8 [size]; if (!data) return false; memcpy(data, MMU.fw.data, size); shift1 = ((header.shift_amounts >> 0) & 0x07); shift2 = ((header.shift_amounts >> 3) & 0x07); shift3 = ((header.shift_amounts >> 6) & 0x07); shift4 = ((header.shift_amounts >> 9) & 0x07); // todo - add support for 512Kb part1addr = (header.part1_rom_boot9_addr << (2 + shift1)); part1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2))); part2addr = (header.part2_rom_boot7_addr << (2+shift3)); part2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4))); part3addr = (header.part3_rom_gui9_addr << 3); part4addr = (header.part4_rom_wifi7_addr << 3); part5addr = (header.part5_data_gfx_addr << 3); ARM9bootAddr = part1ram; ARM7bootAddr = part2ram; enc.init(header.fw_identifier, 1, 0xC); #if 0 enc.applyKeycode((u32*)&data[0x18]); #else // fix touch coords data[0x18] = 0x00; data[0x19] = 0x00; data[0x1A] = 0x00; data[0x1B] = 0x00; data[0x1C] = 0x00; data[0x1D] = 0xFF; data[0x1E] = 0x00; data[0x1F] = 0x00; #endif enc.init(header.fw_identifier, 2, 0xC); size9 = decrypt(data + part1addr, tmp_data9); if (!tmp_data9) { delete [] data; data = NULL; return false; } size7 = decrypt(data + part2addr, tmp_data7); if (!tmp_data7) { delete [] tmp_data9; delete [] data; data = NULL; return false; } u16 crc16_mine = getBootCodeCRC16(); if (crc16_mine != header.part12_boot_crc16) { INFO("Firmware: ERROR: the boot code CRC16 (0x%04X) doesn't match the value in the firmware header (0x%04X)", crc16_mine, header.part12_boot_crc16); delete [] tmp_data9; delete [] tmp_data7; delete [] data; data = NULL; return false; } // Copy firmware boot codes to their respective locations src = 0; for(u32 i = 0; i < (size9 >> 2); i++) { _MMU_write32(part1ram, T1ReadLong(tmp_data9, src)); src += 4; part1ram += 4; } src = 0; for(u32 i = 0; i < (size7 >> 2); i++) { _MMU_write32(part2ram, T1ReadLong(tmp_data7, src)); src += 4; part2ram += 4; } delete [] tmp_data7; delete [] tmp_data9; patched = false; if (data[0x17C] != 0xFF) patched = true; INFO("Firmware:\n"); INFO("- path: %s\n", CommonSettings.Firmware); INFO("- size: %i bytes (%i Mbit)\n", size, size/1024/8); INFO("- CRC : 0x%04X\n", header.part12_boot_crc16); INFO("- header: \n"); INFO(" * size firmware %i\n", ((header.shift_amounts >> 12) & 0xF) * 128 * 1024); INFO(" * ARM9 boot code address: 0x%08X\n", part1addr); INFO(" * ARM9 boot code RAM address: 0x%08X\n", ARM9bootAddr); INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", size9, size9); INFO(" * ARM9 GUI code address: 0x%08X\n", part3addr); INFO("\n"); INFO(" * ARM7 boot code address: 0x%08X\n", part2addr); INFO(" * ARM7 boot code RAM address: 0x%08X\n", ARM7bootAddr); INFO(" * ARM7 WiFi code address: 0x%08X\n", part4addr); INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", size7, size7); INFO("\n"); INFO(" * Data/GFX address: 0x%08X\n", part5addr); if (patched) { u32 patch_offset = 0x3FC80; if (data[0x17C] > 1) patch_offset = 0x3F680; memcpy(&header, data + patch_offset, sizeof(header)); shift1 = ((header.shift_amounts >> 0) & 0x07); shift2 = ((header.shift_amounts >> 3) & 0x07); shift3 = ((header.shift_amounts >> 6) & 0x07); shift4 = ((header.shift_amounts >> 9) & 0x07); // todo - add support for 512Kb part1addr = (header.part1_rom_boot9_addr << (2 + shift1)); part1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2))); part2addr = (header.part2_rom_boot7_addr << (2+shift3)); part2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4))); ARM9bootAddr = part1ram; ARM7bootAddr = part2ram; size9 = decompress(data + part1addr, tmp_data9); if (!tmp_data9) { delete [] data; return false; } size7 = decompress(data + part2addr, tmp_data7); if (!tmp_data7) { delete [] tmp_data9; delete [] data; return false; }; // Copy firmware boot codes to their respective locations src = 0; for(u32 i = 0; i < (size9 >> 2); i++) { _MMU_write32(part1ram, T1ReadLong(tmp_data9, src)); src += 4; part1ram += 4; } src = 0; for(u32 i = 0; i < (size7 >> 2); i++) { _MMU_write32(part2ram, T1ReadLong(tmp_data7, src)); src += 4; part2ram += 4; } delete [] tmp_data7; delete [] tmp_data9; INFO("\nFlashme:\n"); INFO("- header: \n"); INFO(" * ARM9 boot code address: 0x%08X\n", part1addr); INFO(" * ARM9 boot code RAM address: 0x%08X\n", ARM9bootAddr); INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", size9, size9); INFO("\n"); INFO(" * ARM7 boot code address: 0x%08X\n", part2addr); INFO(" * ARM7 boot code RAM address: 0x%08X\n", ARM7bootAddr); INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", size7, size7); } memcpy(MMU.fw.data, data, size); MMU.fw.fp = NULL; delete [] data; data = NULL; return true; } bool CFIRMWARE::loadSettings() { if (!CommonSettings.UseExtFirmware) return false; if (!CommonSettings.UseExtFirmwareSettings) return false; FILE *fp = fopen(MMU.fw.userfile, "rb"); if (fp) { fseek(fp, 0, SEEK_END); if (ftell(fp) == DFC_FILE_SIZE) { fseek(fp, 0, SEEK_SET); u8 *usr = new u8[SETTINGS_SIZE]; if (usr) { if (fread(usr, 1, DFC_ID_SIZE, fp) == DFC_ID_SIZE) { if (memcmp(usr, DFC_ID_CODE, DFC_ID_SIZE) == 0) { if (fread(usr, 1, SETTINGS_SIZE, fp) == SETTINGS_SIZE) { memcpy(&MMU.fw.data[userDataAddr], usr, USER_SETTINGS_SIZE); memcpy(&MMU.fw.data[userDataAddr + 0x100], usr, USER_SETTINGS_SIZE); memcpy(&MMU.fw.data[WIFI_SETTINGS_OFF], usr + USER_SETTINGS_SIZE, WIFI_SETTINGS_SIZE); memcpy(&MMU.fw.data[WIFI_AP_SETTINGS_OFF], usr + USER_SETTINGS_SIZE + WIFI_SETTINGS_SIZE, WIFI_AP_SETTINGS_SIZE); printf("Loaded user settings from %s\n", MMU.fw.userfile); } } } delete [] usr; usr = NULL; } } else printf("Failed loading firmware config from %s (wrong file size)\n", MMU.fw.userfile); fclose(fp); } return false; } bool CFIRMWARE::saveSettings() { if (!CommonSettings.UseExtFirmware) return false; if (!CommonSettings.UseExtFirmwareSettings) return false; u8 *data = &MMU.fw.data[userDataAddr]; u8 counter0 = data[0x070]; u8 counter1 = data[0x170]; if (counter1 == ((counter0 + 1) & 0x7F)) { // copy User Settings 1 to User Settings 0 area memcpy(data, data + 0x100, 0x100); } else { // copy User Settings 0 to User Settings 1 area memcpy(data + 0x100, data, 0x100); } printf("Firmware: saving config"); FILE *fp = fopen(MMU.fw.userfile, "wb"); if (fp) { u8 *usr = new u8[DFC_FILE_SIZE]; if (usr) { memcpy(usr, DFC_ID_CODE, DFC_ID_SIZE); memcpy(usr + DFC_ID_SIZE, data, USER_SETTINGS_SIZE); memcpy(usr + DFC_ID_SIZE + USER_SETTINGS_SIZE, &MMU.fw.data[WIFI_SETTINGS_OFF], WIFI_SETTINGS_SIZE); memcpy(usr + DFC_ID_SIZE + USER_SETTINGS_SIZE + WIFI_SETTINGS_SIZE, &MMU.fw.data[WIFI_AP_SETTINGS_OFF], WIFI_AP_SETTINGS_SIZE); if (fwrite(usr, 1, DFC_FILE_SIZE, fp) == DFC_FILE_SIZE) printf(" - done\n"); else printf(" - failed\n"); delete [] usr; } fclose(fp); } else printf(" - failed\n"); return true; } std::string CFIRMWARE::GetExternalFilePath() { std::string fwPath = CommonSettings.Firmware; std::string fwFileName = Path::GetFileNameFromPathWithoutExt(fwPath); char configPath[MAX_PATH] = {0}; path.getpath(path.BATTERY, configPath); if (configPath[strlen(configPath)-1] == DIRECTORY_DELIMITER_CHAR) configPath[strlen(configPath)-1] = 0; std::string finalPath = std::string(configPath) + DIRECTORY_DELIMITER_CHAR + fwFileName + FILE_EXT_DELIMITER_CHAR + FW_CONFIG_FILE_EXT; return finalPath; } void *CFIRMWARE::getTouchCalibrate() { static TSCalInfo cal = {0}; if (!successLoad || !CommonSettings.UseExtFirmware || !successLoad) { cal.adc.x1 = _MMU_read16(0x027FFC80 + 0x58) & 0x1FFF; cal.adc.y1 = _MMU_read16(0x027FFC80 + 0x5A) & 0x1FFF; cal.scr.x1 = _MMU_read08(0x027FFC80 + 0x5C); cal.scr.y1 = _MMU_read08(0x027FFC80 + 0x5D); cal.adc.x2 = _MMU_read16(0x027FFC80 + 0x5E) & 0x1FFF; cal.adc.y2 = _MMU_read16(0x027FFC80 + 0x60) & 0x1FFF; cal.scr.x2 = _MMU_read08(0x027FFC80 + 0x62); cal.scr.y2 = _MMU_read08(0x027FFC80 + 0x63); } else { cal.adc.x1 = T1ReadWord(MMU.fw.data, userDataAddr + 0x58) & 0x1FFF; cal.adc.y1 = T1ReadWord(MMU.fw.data, userDataAddr + 0x5A) & 0x1FFF; cal.scr.x1 = T1ReadByte(MMU.fw.data, userDataAddr + 0x5C); cal.scr.y1 = T1ReadByte(MMU.fw.data, userDataAddr + 0x5D); cal.adc.x2 = T1ReadWord(MMU.fw.data, userDataAddr + 0x5E) & 0x1FFF; cal.adc.y2 = T1ReadWord(MMU.fw.data, userDataAddr + 0x60) & 0x1FFF; cal.scr.x2 = T1ReadByte(MMU.fw.data, userDataAddr + 0x62); cal.scr.y2 = T1ReadByte(MMU.fw.data, userDataAddr + 0x63); } cal.adc.width = (cal.adc.x2 - cal.adc.x1); cal.adc.height = (cal.adc.y2 - cal.adc.y1); cal.scr.width = (cal.scr.x2 - cal.scr.x1); cal.scr.height = (cal.scr.y2 - cal.scr.y1); return (void*)&cal; } //===================================================================================================== static u32 calc_CRC16( u32 start, const u8 *data, int count) { int i,j; u32 crc = start & 0xffff; const u16 val[8] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 }; for(i = 0; i < count; i++) { crc = crc ^ data[i]; for(j = 0; j < 8; j++) { int do_bit = 0; if ( crc & 0x1) do_bit = 1; crc = crc >> 1; if ( do_bit) { crc = crc ^ (val[j] << (7-j)); } } } return crc; } int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data) { /* * Determine which of the two user settings in the firmware is the current * and valid one and then copy this into the destination buffer. * * The current setting will have a greater count. * Settings are only valid if its CRC16 is correct. */ int user1_valid = 0; int user2_valid = 0; u32 user_settings_offset; u32 fw_crc; u32 crc; int copy_good = 0; user_settings_offset = fw_data[0x20]; user_settings_offset |= fw_data[0x21] << 8; user_settings_offset <<= 3; if ( user_settings_offset <= 0x3FE00) { s32 copy_settings_offset = -1; crc = calc_CRC16( 0xffff, &fw_data[user_settings_offset], NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT); fw_crc = fw_data[user_settings_offset + 0x72]; fw_crc |= fw_data[user_settings_offset + 0x73] << 8; if ( crc == fw_crc) { user1_valid = 1; } crc = calc_CRC16( 0xffff, &fw_data[user_settings_offset + 0x100], NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT); fw_crc = fw_data[user_settings_offset + 0x100 + 0x72]; fw_crc |= fw_data[user_settings_offset + 0x100 + 0x73] << 8; if ( crc == fw_crc) { user2_valid = 1; } if ( user1_valid) { if ( user2_valid) { u16 count1, count2; count1 = fw_data[user_settings_offset + 0x70]; count1 |= fw_data[user_settings_offset + 0x71] << 8; count2 = fw_data[user_settings_offset + 0x100 + 0x70]; count2 |= fw_data[user_settings_offset + 0x100 + 0x71] << 8; if ( count2 > count1) { copy_settings_offset = user_settings_offset + 0x100; } else { copy_settings_offset = user_settings_offset; } } else { copy_settings_offset = user_settings_offset; } } else if ( user2_valid) { /* copy the second user settings */ copy_settings_offset = user_settings_offset + 0x100; } if ( copy_settings_offset > 0) { memcpy( dest_buffer, &fw_data[copy_settings_offset], NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT); copy_good = 1; } } return copy_good; } static void fill_user_data_area( struct NDS_fw_config_data *user_settings,u8 *data, int count) { u32 crc; int i; u8 *ts_cal_data_area; memset( data, 0, 0x100); // version data[0x00] = 5; data[0x01] = 0; // colour data[0x02] = user_settings->fav_colour; // birthday month and day data[0x03] = user_settings->birth_month; data[0x04] = user_settings->birth_day; //nickname and length for ( i = 0; i < MAX_FW_NICKNAME_LENGTH; i++) { data[0x06 + (i * 2)] = user_settings->nickname[i] & 0xff; data[0x06 + (i * 2) + 1] = (user_settings->nickname[i] >> 8) & 0xff; } data[0x1a] = user_settings->nickname_len; //Message for ( i = 0; i < MAX_FW_MESSAGE_LENGTH; i++) { data[0x1c + (i * 2)] = user_settings->message[i] & 0xff; data[0x1c + (i * 2) + 1] = (user_settings->message[i] >> 8) & 0xff; } data[0x50] = user_settings->message_len; //touch screen calibration ts_cal_data_area = &data[0x58]; for ( i = 0; i < 2; i++) { // ADC x y *ts_cal_data_area++ = user_settings->touch_cal[i].adc_x & 0xff; *ts_cal_data_area++ = (user_settings->touch_cal[i].adc_x >> 8) & 0xff; *ts_cal_data_area++ = user_settings->touch_cal[i].adc_y & 0xff; *ts_cal_data_area++ = (user_settings->touch_cal[i].adc_y >> 8) & 0xff; //screen x y *ts_cal_data_area++ = user_settings->touch_cal[i].screen_x; *ts_cal_data_area++ = user_settings->touch_cal[i].screen_y; } //language and flags data[0x64] = user_settings->language; data[0x65] = 0xfc; //update count and crc data[0x70] = count & 0xff; data[0x71] = (count >> 8) & 0xff; crc = calc_CRC16( 0xffff, data, 0x70); data[0x72] = crc & 0xff; data[0x73] = (crc >> 8) & 0xff; memset( &data[0x74], 0xff, 0x100 - 0x74); } // creates an firmware flash image, which contains all needed info to initiate a wifi connection int NDS_CreateDummyFirmware(NDS_fw_config_data *user_settings) { //Create the firmware header memset( MMU.fw.data, 0, 0x40000); //firmware identifier MMU.fw.data[0x8] = 'M'; MMU.fw.data[0x8 + 1] = 'A'; MMU.fw.data[0x8 + 2] = 'C'; MMU.fw.data[0x8 + 3] = 'P'; // DS type if ( user_settings->ds_type == NDS_CONSOLE_TYPE_DSI) MMU.fw.data[0x1d] = 0xFF; else MMU.fw.data[0x1d] = user_settings->ds_type; //User Settings offset 0x3fe00 / 8 MMU.fw.data[0x20] = 0xc0; MMU.fw.data[0x21] = 0x7f; //User settings (at 0x3FE00 and 0x3FF00) fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FE00], 0); fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FF00], 1); // Wifi config length MMU.fw.data[0x2C] = 0x38; MMU.fw.data[0x2D] = 0x01; MMU.fw.data[0x2E] = 0x00; //Wifi version MMU.fw.data[0x2F] = 0x00; //MAC address memcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac)); //Enabled channels MMU.fw.data[0x3C] = 0xFE; MMU.fw.data[0x3D] = 0x3F; MMU.fw.data[0x3E] = 0xFF; MMU.fw.data[0x3F] = 0xFF; //RF related MMU.fw.data[0x40] = 0x02; MMU.fw.data[0x41] = 0x18; MMU.fw.data[0x42] = 0x0C; MMU.fw.data[0x43] = 0x01; //Wifi I/O init values memcpy((MMU.fw.data + 0x44), FW_WIFIInit, sizeof(FW_WIFIInit)); //Wifi BB init values memcpy((MMU.fw.data + 0x64), FW_BBInit, sizeof(FW_BBInit)); //Wifi RF init values memcpy((MMU.fw.data + 0xCE), FW_RFInit, sizeof(FW_RFInit)); //Wifi channel-related init values memcpy((MMU.fw.data + 0xF2), FW_RFChannel, sizeof(FW_RFChannel)); memcpy((MMU.fw.data + 0x146), FW_BBChannel, sizeof(FW_BBChannel)); memset((MMU.fw.data + 0x154), 0x10, 0xE); //WFC profiles memcpy((MMU.fw.data + 0x3FA40), &FW_WFCProfile1, sizeof(FW_WFCProfile)); memcpy((MMU.fw.data + 0x3FB40), &FW_WFCProfile2, sizeof(FW_WFCProfile)); memcpy((MMU.fw.data + 0x3FC40), &FW_WFCProfile3, sizeof(FW_WFCProfile)); (*(u16*)(MMU.fw.data + 0x3FAFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FA00), 0xFE); (*(u16*)(MMU.fw.data + 0x3FBFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FB00), 0xFE); (*(u16*)(MMU.fw.data + 0x3FCFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FC00), 0xFE); MMU.fw.data[0x162] = 0x19; memset((MMU.fw.data + 0x163), 0xFF, 0x9D); //Wifi settings CRC16 (*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138); if (&CommonSettings.fw_config != user_settings) memcpy(&CommonSettings.fw_config, user_settings, sizeof(NDS_fw_config_data)); return TRUE ; } void NDS_FillDefaultFirmwareConfigData(NDS_fw_config_data *fw_config) { const char *default_nickname = "DeSmuME"; const char *default_message = "DeSmuME makes you happy!"; int i; int str_length; memset( fw_config, 0, sizeof(NDS_fw_config_data)); fw_config->ds_type = NDS_CONSOLE_TYPE_FAT; fw_config->fav_colour = 7; fw_config->birth_day = 23; fw_config->birth_month = 6; str_length = strlen( default_nickname); for ( i = 0; i < str_length; i++) { fw_config->nickname[i] = default_nickname[i]; } fw_config->nickname_len = str_length; str_length = strlen( default_message); for ( i = 0; i < str_length; i++) { fw_config->message[i] = default_message[i]; } fw_config->message_len = str_length; //default to English fw_config->language = 1; // default touchscreen calibration //ANCIENT DESMUME VALUES fw_config->touch_cal[0].adc_x = 0x200; fw_config->touch_cal[0].adc_y = 0x200; fw_config->touch_cal[0].screen_x = 0x20 + 1; // calibration screen coords are 1-based, fw_config->touch_cal[0].screen_y = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong. //VALUES FROM NOCASH //fw_config->touch_cal[0].adc_x = 0x02DF; //fw_config->touch_cal[0].adc_y = 0x032C; //fw_config->touch_cal[0].screen_x = 0x20; //fw_config->touch_cal[0].screen_y = 0x20; //ANCIENT DESMUME VALUES fw_config->touch_cal[1].adc_x = 0xe00; fw_config->touch_cal[1].adc_y = 0x800; fw_config->touch_cal[1].screen_x = 0xe0 + 1; fw_config->touch_cal[1].screen_y = 0x80 + 1; //VALUES FROM NOCASH //fw_config->touch_cal[1].adc_x = 0x0D3B; //fw_config->touch_cal[1].adc_y = 0x0CE7; //fw_config->touch_cal[1].screen_x = 0xE0; //fw_config->touch_cal[1].screen_y = 0xA0; } void NDS_PatchFirmwareMAC() { memcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac)); (*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138); } //========================= //- firmware SPI chip interface - //the original intention was for this code to have similarity to the AUXSPI backup memory devices. //however, that got overgrown, and this stuff stayed pretty simple. //perhaps it can be re-defined in terms of a simpler AUXSPI device after the AUXSPI devices are re-designed. #define FW_CMD_READ 0x03 #define FW_CMD_WRITEDISABLE 0x04 #define FW_CMD_READSTATUS 0x05 #define FW_CMD_WRITEENABLE 0x06 #define FW_CMD_PAGEWRITE 0x0A #define FW_CMD_READ_ID 0x9F void fw_reset_com(fw_memory_chip *mc) { if(mc->com == FW_CMD_PAGEWRITE) { if (mc->fp) { fseek(mc->fp, 0, SEEK_SET); fwrite(mc->data, mc->size, 1, mc->fp); } if (mc->isFirmware && CommonSettings.UseExtFirmware && CommonSettings.UseExtFirmwareSettings && firmware) { firmware->saveSettings(); } mc->write_enable = FALSE; } mc->com = 0; } u8 fw_transfer(fw_memory_chip *mc, u8 data) { if(mc->com == FW_CMD_READ || mc->com == FW_CMD_PAGEWRITE) /* check if we are in a command that needs 3 bytes address */ { if(mc->addr_shift > 0) /* if we got a complete address */ { mc->addr_shift--; mc->addr |= data << (mc->addr_shift * 8); /* argument is a byte of address */ } else /* if we have received 3 bytes of address, proceed command */ { switch(mc->com) { case FW_CMD_READ: if(mc->addr < mc->size) /* check if we can read */ { data = mc->data[mc->addr]; /* return byte */ mc->addr++; /* then increment address */ } break; case FW_CMD_PAGEWRITE: if(mc->addr < mc->size) { mc->data[mc->addr] = data; /* write byte */ mc->addr++; } break; } } } else if(mc->com == FW_CMD_READ_ID) { switch(mc->addr) { //here is an ID string measured from an old ds fat: 62 16 00 (0x62=sanyo) //but we chose to use an ST from martin's ds fat string so programs might have a clue as to the firmware size: //20 40 12 case 0: data = 0x20; mc->addr=1; break; case 1: data = 0x40; //according to gbatek this is the device ID for the flash on someone's ds fat mc->addr=2; break; case 2: data = 0x12; mc->addr = 0; break; } } else if(mc->com == FW_CMD_READSTATUS) { return (mc->write_enable ? 0x02 : 0x00); } else //finally, check if it's a new command { switch(data) { case 0: break; //nothing case FW_CMD_READ_ID: mc->addr = 0; mc->com = FW_CMD_READ_ID; break; case FW_CMD_READ: //read command mc->addr = 0; mc->addr_shift = 3; mc->com = FW_CMD_READ; break; case FW_CMD_WRITEENABLE: //enable writing if(mc->writeable_buffer) { mc->write_enable = TRUE; } break; case FW_CMD_WRITEDISABLE: //disable writing mc->write_enable = FALSE; break; case FW_CMD_PAGEWRITE: //write command if(mc->write_enable) { mc->addr = 0; mc->addr_shift = 3; mc->com = FW_CMD_PAGEWRITE; } else { data = 0; } break; case FW_CMD_READSTATUS: //status register command mc->com = FW_CMD_READSTATUS; break; default: printf("Unhandled FW command: %02X\n", data); break; } } return data; } void mc_init(fw_memory_chip *mc, int type) { mc->com = 0; mc->addr = 0; mc->addr_shift = 0; mc->data = NULL; mc->size = 0; mc->write_enable = FALSE; mc->writeable_buffer = FALSE; mc->type = type; switch(mc->type) { case MC_TYPE_EEPROM1: mc->addr_size = 1; break; case MC_TYPE_EEPROM2: case MC_TYPE_FRAM: mc->addr_size = 2; break; case MC_TYPE_FLASH: mc->addr_size = 3; break; default: break; } } u8 *mc_alloc(fw_memory_chip *mc, u32 size) { u8 *buffer = NULL; buffer = new u8[size]; if(!buffer) { return NULL; } memset(buffer,0,size); if (mc->data) delete [] mc->data; mc->data = buffer; mc->size = size; mc->writeable_buffer = TRUE; return buffer; } void mc_free(fw_memory_chip *mc) { if(mc->data) delete[] mc->data; mc_init(mc, 0); } desmume-0.9.11/src/fs-linux.cpp0000755000000000000000000000504312467662066015023 0ustar rootroot/* Copyright (C) 2006 Guillaume Duhamel This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "fs.h" #include #include #include #include #include #include typedef struct { DIR * dir; char * path; } FsLinuxDir; const char FS_SEPARATOR = '/'; void * FsReadFirst(const char * path, FsEntry * entry) { FsLinuxDir * dir; struct dirent * e; struct stat s; char buffer[512+1]; /* DirSpec[256] + '/' + dirent.d_name[256] */ DIR * tmp; dir = (FsLinuxDir*)malloc(sizeof(FsLinuxDir)); if (!dir) return NULL; tmp = opendir(path); if (!tmp) { free(dir); return NULL; } dir->dir = tmp; e = readdir(tmp); if (!e) { closedir(tmp); free(dir); return NULL; } strcpy(entry->cFileName, e->d_name); // there's no 8.3 file names support on linux :) strcpy(entry->cAlternateFileName, ""); entry->flags = 0; dir->path = strdup(path); sprintf(buffer, "%s/%s", dir->path, e->d_name); stat(buffer, &s); if (S_ISDIR(s.st_mode)) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = s.st_size; } return dir; } int FsReadNext(void * search, FsEntry * entry) { FsLinuxDir * dir = (FsLinuxDir*)search; struct dirent * e; struct stat s; char buffer[1024]; e = readdir(dir->dir); if (!e) return 0; strcpy(entry->cFileName, e->d_name); // there's no 8.3 file names support on linux :) strcpy(entry->cAlternateFileName, ""); entry->flags = 0; sprintf(buffer, "%s/%s", dir->path, e->d_name); stat(buffer, &s); if (S_ISDIR(s.st_mode)) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = s.st_size; } return 1; } void FsClose(void * search) { FsLinuxDir *linuxdir = (FsLinuxDir *) search; DIR * dir = linuxdir->dir; closedir(dir); free(linuxdir->path); free(search); } int FsError(void) { return 0; } desmume-0.9.11/src/sndsdl.h0000755000000000000000000000146312467662066014214 0ustar rootroot/* Copyright (C) 2005-2015 DeSmuME Team Copyright 2005-2006 Theo Berkau This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef SNDSDL_H #define SNDSDL_H #include "SPU.h" #define SNDCORE_SDL 2 extern SoundInterface_struct SNDSDL; #endif desmume-0.9.11/src/debug.h0000755000000000000000000001232512467662066014012 0ustar rootroot/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef DEBUG_H #define DEBUG_H #include #include #include #include #include "types.h" #include "mem.h" struct armcpu_t; class EMUFILE; struct DebugStatistics { DebugStatistics(); struct InstructionHits { InstructionHits(); u32 thumb[1024]; u32 arm[4096]; } instructionHits[2]; //one for each cpu s32 sequencerExecutionCounters[32]; void print(); void printSequencerExecutionCounters(); }; extern DebugStatistics DEBUG_statistics; void DEBUG_reset(); void DEBUG_dumpMemory(EMUFILE* fp); struct armcpu_t; class Logger { protected: void (*callback)(const Logger& logger, const char * format); std::ostream * out; unsigned int flags; static std::vector channels; static void fixSize(unsigned int channel); public: Logger(); ~Logger(); void vprintf(const char * format, va_list l, const char * filename, unsigned int line); void setOutput(std::ostream * o); void setCallback(void (*cback)(const Logger& logger, const char * message)); void setFlag(unsigned int flag); std::ostream& getOutput() const; static const int LINE = 1; static const int FILE = 2; static void log(unsigned int channel, const char * file, unsigned int line, const char * format, ...); static void log(unsigned int channel, const char * file, unsigned int line, std::ostream& os); static void log(unsigned int channel, const char * file, unsigned int line, unsigned int flag); static void log(unsigned int channel, const char * file, unsigned int line, void (*callback)(const Logger& logger, const char * message)); }; #if defined(DEBUG) || defined(GPUDEBUG) || defined(DIVDEBUG) || defined(SQRTDEBUG) || defined(DMADEBUG) || defined(DEVELOPER) #define LOGC(channel, ...) Logger::log(channel, __FILE__, __LINE__, __VA_ARGS__) #else #define LOGC(...) {} #endif #ifdef DEBUG #define LOG(...) LOGC(0, __VA_ARGS__) #else #define LOG(...) {} #endif #ifdef GPUDEBUG #define GPULOG(...) LOGC(1, __VA_ARGS__) #else #define GPULOG(...) {} #endif #ifdef DIVDEBUG #define DIVLOG(...) LOGC(2, __VA_ARGS__) #else #define DIVLOG(...) {} #endif #ifdef SQRTDEBUG #define SQRTLOG(...) LOGC(3, __VA_ARGS__) #else #define SQRTLOG(...) {} #endif #ifdef DMADEBUG #define DMALOG(...) LOGC(4, __VA_ARGS__) #else #define DMALOG(...) {} #endif #ifdef CFLASHDEBUG #define CFLASHLOG(...) LOGC(5, __VA_ARGS__) #else #define CFLASHLOG(...) {} #endif #ifdef UNTESTEDOPCODEDEBUG #define UNTESTEDOPCODELOG(...) LOGC(6, __VA_ARGS__) #else #define UNTESTEDOPCODELOG(...) {} #endif #ifdef DEVELOPER #define PROGINFO(...) LOGC(7, __VA_ARGS__) #else #define PROGINFO(...) {} #endif #define INFOC(channel, ...) Logger::log(channel, __FILE__, __LINE__, __VA_ARGS__) #define INFO(...) INFOC(10, __VA_ARGS__) void IdeasLog(armcpu_t* cpu); void NocashMessage(armcpu_t* cpu, int offset); enum EDEBUG_EVENT { DEBUG_EVENT_READ=1, //read from arm9 or arm7 bus, including cpu prefetch DEBUG_EVENT_WRITE=2, //write on arm9 or arm7 bus DEBUG_EVENT_EXECUTE=3, //prefetch on arm9 or arm7, triggered after the read event DEBUG_EVENT_ACL_EXCEPTION=4, //acl exception on arm9 DEBUG_EVENT_CACHE_MISS=5, //cache miss on arm9 }; enum EDEBUG_NOTIFY { DEBUG_NOTIFY_READ_BEYOND_END_OF_CART, DEBUG_NOTIFY_MAX }; class DebugNotify { public: void NextFrame(); void ReadBeyondEndOfCart(u32 addr, u32 romsize); private: std::bitset pingBits; std::bitset enableBits; bool ping(EDEBUG_NOTIFY which); }; extern DebugNotify DEBUG_Notify; //information about a debug event will be stuffed into here by the generator struct TDebugEventData { MMU_ACCESS_TYPE memAccessType; u32 procnum, addr, size, val; armcpu_t* cpu(); }; extern TDebugEventData DebugEventData; //bits in here are set according to what debug handlers are installed? //for now it is just a single bit extern u32 debugFlag; FORCEINLINE bool CheckDebugEvent(EDEBUG_EVENT event) { //for now, debug events are only handled in dev+ builds #ifndef DEVELOPER return false; #endif if(!debugFlag) return false; return true; } void HandleDebugEvent_Read(); void HandleDebugEvent_Write(); void HandleDebugEvent_Execute(); void HandleDebugEvent_ACL_Exception(); void HandleDebugEvent_CacheMiss(); inline void HandleDebugEvent(EDEBUG_EVENT event) { switch(event) { case DEBUG_EVENT_READ: HandleDebugEvent_Read(); return; case DEBUG_EVENT_WRITE: HandleDebugEvent_Write(); return; case DEBUG_EVENT_EXECUTE: HandleDebugEvent_Execute(); return; case DEBUG_EVENT_ACL_EXCEPTION: HandleDebugEvent_ACL_Exception(); return; case DEBUG_EVENT_CACHE_MISS: HandleDebugEvent_CacheMiss(); return; } } #endif desmume-0.9.11/src/fs-windows.cpp0000755000000000000000000000456612467662066015367 0ustar rootroot/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2006-2009 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "fs.h" #include #include #include #include const char FS_SEPARATOR = '\\'; void * FsReadFirst(const char * p, FsEntry * entry) { WIN32_FIND_DATA FindFileData; HANDLE hFind; HANDLE * ret; char path[1024]; if (strlen(p)+3 >sizeof(path)) return NULL ; sprintf(path, "%s\\*", p); hFind = FindFirstFile(path, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) return NULL; strncpy(entry->cFileName, FindFileData.cFileName,256); entry->cFileName[255] = 0 ; strncpy(entry->cAlternateFileName, FindFileData.cAlternateFileName,14); entry->cAlternateFileName[13] = 0 ; entry->flags = 0; if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = FindFileData.nFileSizeLow; } ret = (void**)malloc(sizeof(HANDLE)); *ret = hFind; return ret; } int FsReadNext(void * search, FsEntry * entry) { WIN32_FIND_DATA FindFileData; HANDLE * h = (HANDLE *) search; int ret; ret = FindNextFile(*h, &FindFileData); strncpy(entry->cFileName, FindFileData.cFileName,256); entry->cFileName[255] = 0 ; strncpy(entry->cAlternateFileName, FindFileData.cAlternateFileName,14); entry->cAlternateFileName[13] = 0 ; entry->flags = 0; if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = FindFileData.nFileSizeLow; } return ret; } void FsClose(void * search) { FindClose(*((HANDLE *) search)); } int FsError(void) { if (GetLastError() == ERROR_NO_MORE_FILES) return FS_ERR_NO_MORE_FILES; return FS_ERR_UNKNOWN; } desmume-0.9.11/src/NDSSystem.cpp0000755000000000000000000024507312467662066015120 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "NDSSystem.h" #include #include #include #include #include #include "utils/decrypt/decrypt.h" #include "utils/decrypt/crc.h" #include "utils/advanscene.h" #include "utils/task.h" #include "common.h" #include "armcpu.h" #include "render3D.h" #include "MMU.h" #include "ROMReader.h" #include "gfx3d.h" #include "GPU.h" #include "cp15.h" #include "bios.h" #include "debug.h" #include "cheatSystem.h" #include "movie.h" #include "Disassembler.h" #include "FIFO.h" #include "readwrite.h" #include "registers.h" #include "debug.h" #include "driver.h" #include "firmware.h" #include "version.h" #include "path.h" #include "slot1.h" #include "slot2.h" #include "SPU.h" #include "wifi.h" #ifdef GDB_STUB #include "gdbstub.h" #endif //int xxctr=0; //#define LOG_ARM9 //#define LOG_ARM7 //#define dolog (currFrameCounter>30) bool dolog = false; //#define LOG_TO_FILE //#define LOG_TO_FILE_REGS //=============================================================== FILE *fp_dis7 = NULL; FILE *fp_dis9 = NULL; PathInfo path; TCommonSettings CommonSettings; static BaseDriver _stub_driver; BaseDriver* driver = &_stub_driver; std::string InputDisplayString; static BOOL LidClosed = FALSE; static u8 countLid = 0; GameInfo gameInfo; NDSSystem nds; CFIRMWARE *firmware = NULL; using std::min; using std::max; bool singleStep; bool nds_debug_continuing[2]; int lagframecounter; int LagFrameFlag; int lastLag; int TotalLagFrames; TSCalInfo TSCal; namespace DLDI { bool tryPatch(void* data, size_t size, unsigned int device); } void Desmume_InitOnce() { static bool initOnce = false; if(initOnce) return; initOnce = true; #ifdef HAVE_LIBAGG extern void Agg_init(); //no need to include just for this Agg_init(); #endif } int NDS_GetCPUCoreCount() { return getOnlineCores(); } void NDS_SetupDefaultFirmware() { NDS_FillDefaultFirmwareConfigData(&CommonSettings.fw_config); } void NDS_RunAdvansceneAutoImport() { if(CommonSettings.run_advanscene_import != "") { std::string fname = CommonSettings.run_advanscene_import; std::string fname_out = fname + ".ddb"; EMUFILE_FILE outf(fname_out,"wb"); u32 ret = advsc.convertDB(fname.c_str(),&outf); if(ret == 0) exit(0); else exit(1); } } int NDS_Init() { nds.idleFrameCounter = 0; memset(nds.runCycleCollector,0,sizeof(nds.runCycleCollector)); MMU_Init(); //got to print this somewhere.. printf("%s\n", EMU_DESMUME_NAME_AND_VERSION()); if (Screen_Init() != 0) return -1; { char buf[MAX_PATH]; memset(buf, 0, MAX_PATH); strcpy(buf, path.pathToModule); strcat(buf, "desmume.ddb"); // DeSmuME database :) advsc.setDatabase(buf); //why is this done here? shitty engineering. not intended. NDS_RunAdvansceneAutoImport(); } gfx3d_init(); armcpu_new(&NDS_ARM9,0); NDS_ARM9.SetBaseMemoryInterface(&arm9_base_memory_iface); NDS_ARM9.SetBaseMemoryInterfaceData(NULL); NDS_ARM9.ResetMemoryInterfaceToBase(); armcpu_new(&NDS_ARM7,1); NDS_ARM7.SetBaseMemoryInterface(&arm7_base_memory_iface); NDS_ARM7.SetBaseMemoryInterfaceData(NULL); NDS_ARM7.ResetMemoryInterfaceToBase(); if (SPU_Init(SNDCORE_DUMMY, 740) != 0) return -1; WIFI_Init() ; cheats = new CHEATS(); cheatSearch = new CHEATSEARCH(); return 0; } void NDS_DeInit(void) { gameInfo.closeROM(); SPU_DeInit(); Screen_DeInit(); MMU_DeInit(); gpu3D->NDS_3D_Close(); WIFI_DeInit(); delete cheats; cheats = NULL; delete cheatSearch; cheatSearch = NULL; #ifdef HAVE_JIT arm_jit_close(); #endif #ifdef LOG_ARM7 if (fp_dis7 != NULL) { fclose(fp_dis7); fp_dis7 = NULL; } #endif #ifdef LOG_ARM9 if (fp_dis9 != NULL) { fclose(fp_dis9); fp_dis9 = NULL; } #endif } NDS_header* NDS_getROMHeader(void) { NDS_header *newHeader = new NDS_header; memcpy(newHeader, &gameInfo.header, sizeof(NDS_header)); return newHeader; } void debug() { //if(NDS_ARM9.R[15]==0x020520DC) emu_halt(); //DSLinux //if(NDS_ARM9.CPSR.bits.mode == 0) emu_halt(); //if((NDS_ARM9.R[15]&0xFFFFF000)==0) emu_halt(); //if((NDS_ARM9.R[15]==0x0201B4F4)/*&&(NDS_ARM9.R[1]==0x0)*/) emu_halt(); //AOE //if((NDS_ARM9.R[15]==0x01FFE194)&&(NDS_ARM9.R[0]==0)) emu_halt(); //if((NDS_ARM9.R[15]==0x01FFE134)&&(NDS_ARM9.R[0]==0)) emu_halt(); //BBMAN //if(NDS_ARM9.R[15]==0x02098B4C) emu_halt(); //if(NDS_ARM9.R[15]==0x02004924) emu_halt(); //if(NDS_ARM9.R[15]==0x02004890) emu_halt(); //if(NDS_ARM9.R[15]==0x0202B800) emu_halt(); //if(NDS_ARM9.R[15]==0x0202B3DC) emu_halt(); //if((NDS_ARM9.R[1]==0x9AC29AC1)&&(!fait)) {emu_halt();fait = TRUE;} //if(NDS_ARM9.R[1]==0x0400004A) {emu_halt();fait = TRUE;} /*if(NDS_ARM9.R[4]==0x2E33373C) emu_halt(); if(NDS_ARM9.R[15]==0x02036668) //emu_halt(); { nds.logcount++; sprintf(logbuf, "%d %08X", nds.logcount, NDS_ARM9.R[13]); log::ajouter(logbuf); if(nds.logcount==89) execute=FALSE; }*/ //if(NDS_ARM9.instruction==0) emu_halt(); //if((NDS_ARM9.R[15]>>28)) emu_halt(); } #if 0 /* not used */ //http://www.aggregate.org/MAGIC/#Population%20Count%20(Ones%20Count) static u32 ones32(u32 x) { /* 32-bit recursive reduction using SWAR... but first step is mapping 2-bit values into sum of 2 1-bit values in sneaky way */ x -= ((x >> 1) & 0x55555555); x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); x = (((x >> 4) + x) & 0x0f0f0f0f); x += (x >> 8); x += (x >> 16); return(x & 0x0000003f); } #endif RomBanner::RomBanner(bool defaultInit) { if(!defaultInit) return; version = 1; //Version (0001h) crc16 = 0; //CRC16 across entries 020h..83Fh memset(reserved,0,sizeof(reserved)); memset(bitmap,0,sizeof(bitmap)); memset(palette,0,sizeof(palette)); memset(titles,0,sizeof(titles)); memset(end0xFF,0,sizeof(end0xFF)); } bool GameInfo::hasRomBanner() { if(header.IconOff + sizeof(RomBanner) > romsize) return false; else return true; } const RomBanner& GameInfo::getRomBanner() { return banner; } void GameInfo::populate() { const char regions_index[] = "JPFSEODIRKHXVWUC"; const char *regions[] = { "???", "JPN", // J "EUR", // P "FRA", // F "ESP", // S "USA", // E "INT", // O "NOE", // D "ITA", // I "RUS", // R "KOR", // K "HOL", // H "EUU", // X "EUU", // V "EUU", // W "AUS", // U "CHN", // C }; memset(ROMserial, 0, sizeof(ROMserial)); memset(ROMname, 0, sizeof(ROMname)); if(isHomebrew()) { //we can't really make a serial for a homebrew game that hasnt set a game code strcpy(ROMserial, "Homebrew"); } else { if (isDSiEnhanced()) strcpy(ROMserial,"TWL- -"); else strcpy(ROMserial,"NTR- -"); memcpy(ROMserial+4, header.gameCode, 4); u32 regions_num = ARRAY_SIZE(regions); u32 region = (u32)(std::max(strchr(regions_index,header.gameCode[3]) - regions_index + 1, 0)); if (region < regions_num) strncat(ROMserial, regions[region], sizeof(ROMserial)); else strncat(ROMserial, "???", sizeof(ROMserial)); } //rom name is probably set even in homebrew, so do it regardless memset(ROMname, 0, sizeof(ROMname)); memcpy(ROMname, header.gameTile, 12); trim(ROMname,20); /*if(header.IconOff < romsize) { u8 num = (T1ReadByte((u8*)romdata, header.IconOff) == 1)?6:7; for (int i = 0; i < num; i++) { wcstombs(ROMfullName[i], (wchar_t *)(romdata+header.IconOff+0x240+(i*0x100)), 0x100); trim(ROMfullName[i]); } }*/ } bool GameInfo::loadROM(std::string fname, u32 type) { //printf("ROM %s\n", CommonSettings.loadToMemory?"loaded to RAM":"stream from disk"); closeROM(); fROM = fopen(fname.c_str(), "rb"); if (!fROM) return false; headerOffset = (type == ROM_DSGBA)?DSGBA_LOADER_SIZE:0; fseek(fROM, 0, SEEK_END); romsize = ftell(fROM) - headerOffset; fseek(fROM, headerOffset, SEEK_SET); bool res = (fread(&header, 1, sizeof(header), fROM) == sizeof(header)); if (res) { #ifndef LOCAL_LE //endian swap necessary fields. It would be better if we made accessors for these. I wonder if you could make a macro for a field accessor that would take the bitsize and do the swap on the fly struct FieldSwap { const size_t offset; const size_t bytes; }; static const FieldSwap fieldSwaps[] = { { offsetof(NDS_header,makerCode), 2}, { offsetof(NDS_header,ARM9src), 4}, { offsetof(NDS_header,ARM9exe), 4}, { offsetof(NDS_header,ARM9cpy), 4}, { offsetof(NDS_header,ARM9binSize), 4}, { offsetof(NDS_header,ARM7src), 4}, { offsetof(NDS_header,ARM7exe), 4}, { offsetof(NDS_header,ARM7cpy), 4}, { offsetof(NDS_header,ARM7binSize), 4}, { offsetof(NDS_header,FNameTblOff), 4}, { offsetof(NDS_header,FNameTblSize), 4}, { offsetof(NDS_header,FATOff), 4}, { offsetof(NDS_header,FATSize), 4}, { offsetof(NDS_header,ARM9OverlayOff), 4}, { offsetof(NDS_header,ARM9OverlaySize), 4}, { offsetof(NDS_header,ARM7OverlayOff), 4}, { offsetof(NDS_header,ARM7OverlaySize), 4}, { offsetof(NDS_header,normalCmd), 4}, { offsetof(NDS_header,Key1Cmd), 4}, { offsetof(NDS_header,IconOff), 4}, { offsetof(NDS_header,CRC16), 2}, { offsetof(NDS_header,ROMtimeout), 2}, { offsetof(NDS_header,ARM9autoload), 4}, { offsetof(NDS_header,ARM7autoload), 4}, { offsetof(NDS_header,endROMoffset), 4}, { offsetof(NDS_header,HeaderSize), 4}, { offsetof(NDS_header, ARM9module), 4}, { offsetof(NDS_header, ARM7module), 4}, { offsetof(NDS_header,logoCRC16), 2}, { offsetof(NDS_header,headerCRC16), 2}, }; for(size_t i = 0; i < ARRAY_SIZE(fieldSwaps); i++) { const u8 *fieldAddr = (u8 *)&header + fieldSwaps[i].offset; switch(fieldSwaps[i].bytes) { case 2: *(u16 *)fieldAddr = LE_TO_LOCAL_16(*(u16 *)fieldAddr); break; case 4: *(u32 *)fieldAddr = LE_TO_LOCAL_32(*(u32 *)fieldAddr); break; } } #endif cardSize = (128 * 1024) << header.cardSize; if (cardSize < romsize) { msgbox->warn("The ROM header is invalid.\nThe device size has been increased to allow for the provided file size.\n"); for (u32 i = header.cardSize; i < 0xF; i++) { if (((128 * 1024) << i) >= romsize) { header.cardSize = i; cardSize = (128 * 1024) << i; break; } } } mask = (cardSize - 1); mask |= (mask >>1); mask |= (mask >>2); mask |= (mask >>4); mask |= (mask >>8); mask |= (mask >>16); if (type == ROM_NDS) { fseek(fROM, 0x4000 + headerOffset, SEEK_SET); fread(&secureArea[0], 1, 0x4000, fROM); } if (CommonSettings.loadToMemory) { fseek(fROM, headerOffset, SEEK_SET); romdata = new u8[romsize + 4]; if (fread(romdata, 1, romsize, fROM) != romsize) { delete [] romdata; romdata = NULL; romsize = 0; return false; } if(hasRomBanner()) { memcpy(&banner, romdata + header.IconOff, sizeof(RomBanner)); banner.version = LE_TO_LOCAL_16(banner.version); banner.crc16 = LE_TO_LOCAL_16(banner.crc16); for(size_t i = 0; i < ARRAY_SIZE(banner.palette); i++) { banner.palette[i] = LE_TO_LOCAL_16(banner.palette[i]); } } _isDSiEnhanced = (LE_TO_LOCAL_32(*(u32*)(romdata + 0x180) == 0x8D898581U) && LE_TO_LOCAL_32(*(u32*)(romdata + 0x184) == 0x8C888480U)); fclose(fROM); fROM = NULL; return true; } _isDSiEnhanced = ((readROM(0x180) == 0x8D898581U) && (readROM(0x184) == 0x8C888480U)); if (hasRomBanner()) { fseek(fROM, header.IconOff + headerOffset, SEEK_SET); fread(&banner, 1, sizeof(RomBanner), fROM); banner.version = LE_TO_LOCAL_16(banner.version); banner.crc16 = LE_TO_LOCAL_16(banner.crc16); for(size_t i = 0; i < ARRAY_SIZE(banner.palette); i++) { banner.palette[i] = LE_TO_LOCAL_16(banner.palette[i]); } } fseek(fROM, headerOffset, SEEK_SET); lastReadPos = 0; return true; } romsize = 0; fclose(fROM); fROM = NULL; return false; } void GameInfo::closeROM() { if (fROM) fclose(fROM); if (romdata) delete [] romdata; fROM = NULL; romdata = NULL; romsize = 0; lastReadPos = 0xFFFFFFFF; } u32 GameInfo::readROM(u32 pos) { if (!romdata) { u32 data; if (lastReadPos != pos) fseek(fROM, pos + headerOffset, SEEK_SET); u32 num = fread(&data, 1, 4, fROM); lastReadPos = (pos + num); return LE_TO_LOCAL_32(data); } else { if(pos + 4 > romsize) { printf("Panic! GameInfo reading out of buffer!\n"); exit(-1); } return LE_TO_LOCAL_32(*(u32*)(romdata + pos)); } } bool GameInfo::isDSiEnhanced() { return _isDSiEnhanced; } bool GameInfo::isHomebrew() { return ((header.ARM9src < 0x4000) && (T1ReadLong(header.logo, 0) != 0x51AEFF24) && (T1ReadLong(header.logo, 4) != 0x699AA221)); } static int rom_init_path(const char *filename, const char *physicalName, const char *logicalFilename) { u32 type = ROM_NDS; path.init(logicalFilename? logicalFilename : filename); if ( path.isdsgba(path.path)) { type = ROM_DSGBA; gameInfo.loadROM(path.path, type); } else if ( !strcasecmp(path.extension().c_str(), "nds")) { type = ROM_NDS; gameInfo.loadROM(physicalName ? physicalName : path.path, type); //n.b. this does nothing if the file can't be found (i.e. if it was an extracted tempfile)... //...but since the data was extracted to gameInfo then it is ok } //ds.gba in archives, it's already been loaded into memory at this point else if (logicalFilename && path.isdsgba(std::string(logicalFilename))) { type = ROM_DSGBA; } else { //well, try to load it as an nds rom anyway type = ROM_NDS; gameInfo.loadROM(physicalName ? physicalName : path.path, type); } //check that size is at least the size of the header if (gameInfo.romsize < 352) { return -1; } gameInfo.romType = type; return 1; } int NDS_LoadROM(const char *filename, const char *physicalName, const char *logicalFilename) { int ret; char buf[MAX_PATH]; if (filename == NULL) return -1; ret = rom_init_path(filename, physicalName, logicalFilename); if (ret < 1) return ret; if (cheatSearch) cheatSearch->close(); FCEUI_StopMovie(); //check whether this rom is any kind of valid if(!CheckValidRom((u8*)&gameInfo.header, gameInfo.secureArea)) { printf("Specified file is not a valid rom\n"); return -1; } gameInfo.populate(); if (CommonSettings.loadToMemory) gameInfo.crc = crc32(0, (u8*)gameInfo.romdata, gameInfo.romsize); else gameInfo.crc = 0; gameInfo.chipID = 0xC2; // The Manufacturer ID is defined by JEDEC (C2h = Macronix) if (!gameInfo.isHomebrew()) { gameInfo.chipID |= ((((128 << gameInfo.header.cardSize) / 1024) - 1) << 8); // Chip size in megabytes minus 1 // (07h = 8MB, 0Fh = 16MB, 1Fh = 32MB, 3Fh = 64MB, 7Fh = 128MB) // flags // 0: Unknown // 1: Unknown // 2: Unknown // 3: Unknown // 4: Unknown // 5: DSi? (if set to 1 then DSi Enhanced games send command D6h to Slot1) // 6: Unknown // 7: ROM speed (Secure Area Block transfer mode (trasfer 8x200h or 1000h bytes) // TODO: //if (gameInfo.isDSiEnhanced()) // gameInfo.chipID |= (0x40 << 24); gameInfo.chipID |= (0x00 << 24); } INFO("\nROM game code: %c%c%c%c\n", gameInfo.header.gameCode[0], gameInfo.header.gameCode[1], gameInfo.header.gameCode[2], gameInfo.header.gameCode[3]); if (gameInfo.crc) INFO("ROM crc: %08X\n", gameInfo.crc); if (!gameInfo.isHomebrew()) { INFO("ROM serial: %s\n", gameInfo.ROMserial); INFO("ROM chipID: %08X\n", gameInfo.chipID); INFO("ROM internal name: %s\n", gameInfo.ROMname); if (gameInfo.isDSiEnhanced()) INFO("ROM DSi Enhanced\n"); } INFO("ROM developer: %s\n", ((gameInfo.header.makerCode == 0) && gameInfo.isHomebrew())?"Homebrew":getDeveloperNameByID(gameInfo.header.makerCode).c_str()); buf[0] = gameInfo.header.gameCode[0]; buf[1] = gameInfo.header.gameCode[1]; buf[2] = gameInfo.header.gameCode[2]; buf[3] = gameInfo.header.gameCode[3]; buf[4] = 0; if (advsc.checkDB(buf, gameInfo.crc)) { u8 sv = advsc.getSaveType(); printf("Found in game database by %s:\n", advsc.getIdMethod()); printf("\t* ROM serial:\t\t%s\n", advsc.getSerial()); printf("\t* ROM save type:\t"); if (sv == 0xFF) printf("Unknown"); else if (sv == 0xFE) printf("None"); else { printf("%s", save_types[sv + 1].descr); if (CommonSettings.autodetectBackupMethod == 1) backup_setManualBackupType(sv + 1); } printf("\n\t* ROM crc:\t\t%08X\n", advsc.getCRC32()); } printf("\n"); //for homebrew, try auto-patching DLDI. should be benign if there is no DLDI or if it fails if(gameInfo.isHomebrew()) { if(!CommonSettings.loadToMemory) msgbox->warn("Sorry.. right now, you can't use the default (stream rom from disk) with homebrew due to a bug with DLDI-autopatching"); if (slot1_GetCurrentType() == NDS_SLOT1_R4) DLDI::tryPatch((void*)gameInfo.romdata, gameInfo.romsize, 1); else if (slot2_GetCurrentType() == NDS_SLOT2_CFLASH) DLDI::tryPatch((void*)gameInfo.romdata, gameInfo.romsize, 0); } if (cheats != NULL) { memset(buf, 0, MAX_PATH); path.getpathnoext(path.CHEATS, buf); strcat(buf, ".dct"); // DeSmuME cheat :) cheats->init(buf); } NDS_Reset(); return ret; } void NDS_FreeROM(void) { FCEUI_StopMovie(); gameInfo.closeROM(); } void NDS_Sleep() { nds.sleeping = TRUE; } void NDS_TriggerCardEjectIRQ() { NDS_makeIrq(ARMCPU_ARM7, IRQ_BIT_GC_IREQ_MC); NDS_makeIrq(ARMCPU_ARM9, IRQ_BIT_GC_IREQ_MC); //zero added on 11-aug-2013 with no proof of accuracy } class FrameSkipper { public: void RequestSkip() { nextSkip = true; } void OmitSkip(bool force, bool forceEvenIfCapturing=false) { nextSkip = false; if((force && consecutiveNonCaptures > 30) || forceEvenIfCapturing) { SkipCur2DFrame = false; SkipCur3DFrame = false; SkipNext2DFrame = false; if(forceEvenIfCapturing) consecutiveNonCaptures = 0; } } void Advance() { bool capturing = (MainScreen.gpu->dispCapCnt.enabled || (MainScreen.gpu->dispCapCnt.val & 0x80000000)); if(capturing && consecutiveNonCaptures > 30) { // the worst-looking graphics corruption problems from frameskip // are the result of skipping the capture on first frame it turns on. // so we do this to handle the capture immediately, // despite the risk of 1 frame of 2d/3d mismatch or wrong screen display. SkipNext2DFrame = false; nextSkip = false; } else if(lastOffset != MainScreen.offset && lastSkip && !skipped) { // if we're switching from not skipping to skipping // and the screens are also switching around this frame, // go for 1 extra frame without skipping. // this avoids the scenario where we only draw one of the two screens // when a game is switching screens every frame. nextSkip = false; } if(capturing) consecutiveNonCaptures = 0; else if(!(consecutiveNonCaptures > 9000)) // arbitrary cap to avoid eventual wrap consecutiveNonCaptures++; lastLastOffset = lastOffset; lastOffset = MainScreen.offset; lastSkip = skipped; skipped = nextSkip; nextSkip = false; SkipCur2DFrame = SkipNext2DFrame; SkipCur3DFrame = skipped; SkipNext2DFrame = skipped; } FORCEINLINE bool ShouldSkip2D() { return SkipCur2DFrame; } FORCEINLINE bool ShouldSkip3D() { return SkipCur3DFrame; } FrameSkipper() { nextSkip = false; skipped = false; lastSkip = false; lastOffset = 0; SkipCur2DFrame = false; SkipCur3DFrame = false; SkipNext2DFrame = false; consecutiveNonCaptures = 0; } private: bool nextSkip; bool skipped; bool lastSkip; int lastOffset; int lastLastOffset; int consecutiveNonCaptures; bool SkipCur2DFrame; bool SkipCur3DFrame; bool SkipNext2DFrame; }; static FrameSkipper frameSkipper; void NDS_SkipNextFrame() { if (!driver->AVI_IsRecording()) { frameSkipper.RequestSkip(); } } void NDS_OmitFrameSkip(int force) { frameSkipper.OmitSkip(force > 0, force > 1); } #define INDEX(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF)) enum ESI_DISPCNT { ESI_DISPCNT_HStart, ESI_DISPCNT_HStartIRQ, ESI_DISPCNT_HDraw, ESI_DISPCNT_HBlank }; u64 nds_timer; u64 nds_arm9_timer, nds_arm7_timer; static const u64 kNever = 0xFFFFFFFFFFFFFFFFULL; struct TSequenceItem { u64 timestamp; u32 param; bool enabled; virtual void save(EMUFILE* os) { write64le(timestamp,os); write32le(param,os); writebool(enabled,os); } virtual bool load(EMUFILE* is) { if(read64le(×tamp,is) != 1) return false; if(read32le(¶m,is) != 1) return false; if(readbool(&enabled,is) != 1) return false; return true; } FORCEINLINE bool isTriggered() { return enabled && nds_timer >= timestamp; } FORCEINLINE u64 next() { return timestamp; } }; struct TSequenceItem_GXFIFO : public TSequenceItem { FORCEINLINE bool isTriggered() { return enabled && nds_timer >= MMU.gfx3dCycles; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[4]++); while(isTriggered()) { enabled = false; gfx3d_execute3D(); } } FORCEINLINE u64 next() { if(enabled) return MMU.gfx3dCycles; else return kNever; } }; template struct TSequenceItem_Timer : public TSequenceItem { FORCEINLINE bool isTriggered() { return enabled && nds_timer >= nds.timerCycle[procnum][num]; } FORCEINLINE void schedule() { enabled = MMU.timerON[procnum][num] && MMU.timerMODE[procnum][num] != 0xFFFF; } FORCEINLINE u64 next() { return nds.timerCycle[procnum][num]; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[13+procnum*4+num]++); u8* regs = procnum==0?MMU.ARM9_REG:MMU.ARM7_REG; bool first = true; //we'll need to check chained timers.. for(int i=num;i<4;i++) { bool over = false; //maybe too many checks if this is here, but we need it here for now if(!MMU.timerON[procnum][i]) return; if(MMU.timerMODE[procnum][i] == 0xFFFF) { ++(MMU.timer[procnum][i]); over = !MMU.timer[procnum][i]; } else { if(!first) break; //this timer isn't chained. break the chain first = false; over = true; int remain = 65536 - MMU.timerReload[procnum][i]; int ctr=0; while(nds.timerCycle[procnum][i] <= nds_timer) { nds.timerCycle[procnum][i] += (remain << MMU.timerMODE[procnum][i]); ctr++; } #ifndef NDEBUG if(ctr>1) { printf("yikes!!!!! please report!\n"); } #endif } if(over) { MMU.timer[procnum][i] = MMU.timerReload[procnum][i]; if(T1ReadWord(regs, 0x102 + i*4) & 0x40) { NDS_makeIrq(procnum, IRQ_BIT_TIMER_0 + i); } } else break; //no more chained timers to trigger. we're done here } } }; template struct TSequenceItem_DMA : public TSequenceItem { DmaController* controller; FORCEINLINE bool isTriggered() { return (controller->dmaCheck && nds_timer>= controller->nextEvent); } FORCEINLINE bool isEnabled() { return controller->dmaCheck?TRUE:FALSE; } FORCEINLINE u64 next() { return controller->nextEvent; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[5+procnum*4+chan]++); //if (nds.freezeBus) return; //printf("exec from TSequenceItem_DMA: %d %d\n",procnum,chan); controller->exec(); // //give gxfifo dmas a chance to re-trigger // if(MMU.DMAStartTime[procnum][chan] == EDMAMode_GXFifo) { // MMU.DMAing[procnum][chan] = FALSE; // if (gxFIFO.size <= 127) // { // execHardware_doDma(procnum,chan,EDMAMode_GXFifo); // if (MMU.DMACompleted[procnum][chan]) // goto docomplete; // else return; // } // } // //docomplete: // if (MMU.DMACompleted[procnum][chan]) // { // u8* regs = procnum==0?MMU.ARM9_REG:MMU.ARM7_REG; // // //disable the channel // if(MMU.DMAStartTime[procnum][chan] != EDMAMode_GXFifo) { // T1WriteLong(regs, 0xB8 + (0xC*chan), T1ReadLong(regs, 0xB8 + (0xC*chan)) & 0x7FFFFFFF); // MMU.DMACrt[procnum][chan] &= 0x7FFFFFFF; //blehhh i hate this shit being mirrored in memory // } // // if((MMU.DMACrt[procnum][chan])&(1<<30)) { // if(procnum==0) NDS_makeARM9Int(8+chan); // else NDS_makeARM7Int(8+chan); // } // // MMU.DMAing[procnum][chan] = FALSE; // } } }; struct TSequenceItem_divider : public TSequenceItem { FORCEINLINE bool isTriggered() { return MMU.divRunning && nds_timer >= MMU.divCycles; } bool isEnabled() { return MMU.divRunning!=0; } FORCEINLINE u64 next() { return MMU.divCycles; } void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[2]++); MMU_new.div.busy = 0; #ifdef HOST_64 T1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, MMU.divResult); T1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, MMU.divMod); #else T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, (u32)MMU.divResult); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A4, (u32)(MMU.divResult >> 32)); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, (u32)MMU.divMod); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2AC, (u32)(MMU.divMod >> 32)); #endif MMU.divRunning = FALSE; } }; struct TSequenceItem_sqrtunit : public TSequenceItem { FORCEINLINE bool isTriggered() { return MMU.sqrtRunning && nds_timer >= MMU.sqrtCycles; } bool isEnabled() { return MMU.sqrtRunning!=0; } FORCEINLINE u64 next() { return MMU.sqrtCycles; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[3]++); MMU_new.sqrt.busy = 0; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B4, MMU.sqrtResult); MMU.sqrtRunning = FALSE; } }; struct Sequencer { bool nds_vblankEnded; bool reschedule; TSequenceItem dispcnt; TSequenceItem wifi; TSequenceItem_divider divider; TSequenceItem_sqrtunit sqrtunit; TSequenceItem_GXFIFO gxfifo; TSequenceItem_DMA<0,0> dma_0_0; TSequenceItem_DMA<0,1> dma_0_1; TSequenceItem_DMA<0,2> dma_0_2; TSequenceItem_DMA<0,3> dma_0_3; TSequenceItem_DMA<1,0> dma_1_0; TSequenceItem_DMA<1,1> dma_1_1; TSequenceItem_DMA<1,2> dma_1_2; TSequenceItem_DMA<1,3> dma_1_3; TSequenceItem_Timer<0,0> timer_0_0; TSequenceItem_Timer<0,1> timer_0_1; TSequenceItem_Timer<0,2> timer_0_2; TSequenceItem_Timer<0,3> timer_0_3; TSequenceItem_Timer<1,0> timer_1_0; TSequenceItem_Timer<1,1> timer_1_1; TSequenceItem_Timer<1,2> timer_1_2; TSequenceItem_Timer<1,3> timer_1_3; void init(); void execHardware(); u64 findNext(); void save(EMUFILE* os) { write64le(nds_timer,os); write64le(nds_arm9_timer,os); write64le(nds_arm7_timer,os); dispcnt.save(os); divider.save(os); sqrtunit.save(os); gxfifo.save(os); wifi.save(os); #define SAVE(I,X,Y) I##_##X##_##Y .save(os); SAVE(timer,0,0); SAVE(timer,0,1); SAVE(timer,0,2); SAVE(timer,0,3); SAVE(timer,1,0); SAVE(timer,1,1); SAVE(timer,1,2); SAVE(timer,1,3); SAVE(dma,0,0); SAVE(dma,0,1); SAVE(dma,0,2); SAVE(dma,0,3); SAVE(dma,1,0); SAVE(dma,1,1); SAVE(dma,1,2); SAVE(dma,1,3); #undef SAVE } bool load(EMUFILE* is, int version) { if(read64le(&nds_timer,is) != 1) return false; if(read64le(&nds_arm9_timer,is) != 1) return false; if(read64le(&nds_arm7_timer,is) != 1) return false; if(!dispcnt.load(is)) return false; if(!divider.load(is)) return false; if(!sqrtunit.load(is)) return false; if(!gxfifo.load(is)) return false; if(version >= 1) if(!wifi.load(is)) return false; #define LOAD(I,X,Y) if(!I##_##X##_##Y .load(is)) return false; LOAD(timer,0,0); LOAD(timer,0,1); LOAD(timer,0,2); LOAD(timer,0,3); LOAD(timer,1,0); LOAD(timer,1,1); LOAD(timer,1,2); LOAD(timer,1,3); LOAD(dma,0,0); LOAD(dma,0,1); LOAD(dma,0,2); LOAD(dma,0,3); LOAD(dma,1,0); LOAD(dma,1,1); LOAD(dma,1,2); LOAD(dma,1,3); #undef LOAD return true; } } sequencer; void NDS_RescheduleGXFIFO(u32 cost) { if(!sequencer.gxfifo.enabled) { MMU.gfx3dCycles = nds_timer; sequencer.gxfifo.enabled = true; } MMU.gfx3dCycles += cost; NDS_Reschedule(); } void NDS_RescheduleTimers() { #define check(X,Y) sequencer.timer_##X##_##Y .schedule(); check(0,0); check(0,1); check(0,2); check(0,3); check(1,0); check(1,1); check(1,2); check(1,3); #undef check NDS_Reschedule(); } void NDS_RescheduleDMA() { //TBD NDS_Reschedule(); } static void initSchedule() { sequencer.init(); //begin at the very end of the last scanline //so that at t=0 we can increment to scanline=0 nds.VCount = 262; sequencer.nds_vblankEnded = false; } // 2196372 ~= (ARM7_CLOCK << 16) / 1000000 // This value makes more sense to me, because: // ARM7_CLOCK = 33.51 mhz // = 33513982 cycles per second // = 33.513982 cycles per microsecond const u64 kWifiCycles = 67;//34*2; //(this isn't very precise. I don't think it needs to be) void Sequencer::init() { NDS_RescheduleTimers(); NDS_RescheduleDMA(); reschedule = false; nds_timer = 0; nds_arm9_timer = 0; nds_arm7_timer = 0; dispcnt.enabled = true; dispcnt.param = ESI_DISPCNT_HStart; dispcnt.timestamp = 0; gxfifo.enabled = false; dma_0_0.controller = &MMU_new.dma[0][0]; dma_0_1.controller = &MMU_new.dma[0][1]; dma_0_2.controller = &MMU_new.dma[0][2]; dma_0_3.controller = &MMU_new.dma[0][3]; dma_1_0.controller = &MMU_new.dma[1][0]; dma_1_1.controller = &MMU_new.dma[1][1]; dma_1_2.controller = &MMU_new.dma[1][2]; dma_1_3.controller = &MMU_new.dma[1][3]; #ifdef EXPERIMENTAL_WIFI_COMM wifi.enabled = true; wifi.timestamp = kWifiCycles; #else wifi.enabled = false; #endif } //this isnt helping much right now. work on it later //#include "utils/task.h" //Task taskSubGpu(true); //void* renderSubScreen(void*) //{ // GPU_RenderLine(&SubScreen, nds.VCount, SkipCur2DFrame); // return NULL; //} static void execHardware_hblank() { //this logic keeps moving around. //now, we try and give the game as much time as possible to finish doing its work for the scanline, //by drawing scanline N at the end of drawing time (but before subsequent interrupt or hdma-driven events happen) //don't try to do this at the end of the scanline, because some games (sonic classics) may use hblank IRQ to set //scroll regs for the next scanline if(nds.VCount<192) { //taskSubGpu.execute(renderSubScreen,NULL); GPU_RenderLine(&MainScreen, nds.VCount, frameSkipper.ShouldSkip2D()); GPU_RenderLine(&SubScreen, nds.VCount, frameSkipper.ShouldSkip2D()); //taskSubGpu.finish(); //trigger hblank dmas //but notice, we do that just after we finished drawing the line //(values copied by this hdma should not be used until the next scanline) triggerDma(EDMAMode_HBlank); } if(nds.VCount==262) { //we need to trigger one last hblank dma since //a. we're sort of lagged behind by one scanline //b. i think that 193 hblanks actually fire (one for the hblank in scanline 262) //this is demonstrated by NSMB splot-parallaxing clouds //for some reason the game will setup two hdma scroll register buffers //to be run consecutively, and unless we do this, the second buffer will be offset by one scanline //causing a glitch in the 0th scanline //triggerDma(EDMAMode_HBlank); //BUT! this was removed in order to make glitches in megaman zero collection (mmz 4 1st level) work. //and, it seems that it is no longer necessary in nsmb. perhaps something else fixed it } //turn on hblank status bit T1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) | 2); T1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) | 2); //fire hblank interrupts if necessary if(T1ReadWord(MMU.ARM9_REG, 4) & 0x10) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_LCD_HBLANK); if(T1ReadWord(MMU.ARM7_REG, 4) & 0x10) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_LCD_HBLANK); //emulation housekeeping. for some reason we always do this at hblank, //even though it sounds more reasonable to do it at hstart SPU_Emulate_core(); driver->AVI_SoundUpdate(SPU_core->outbuf,spu_core_samples); WAV_WavSoundUpdate(SPU_core->outbuf,spu_core_samples); } static void execHardware_hstart_vblankEnd() { sequencer.nds_vblankEnded = true; sequencer.reschedule = true; //turn off vblank status bit T1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) & ~1); T1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) & ~1); //some emulation housekeeping frameSkipper.Advance(); } static void execHardware_hstart_vblankStart() { //printf("--------VBLANK!!!--------\n"); //fire vblank interrupts if necessary for(int i=0;i<2;i++) if(MMU.reg_IF_pending[i] & (1<>8)|((vmatch<<1)&(1<<8))); return vmatch; } static void execHardware_hstart_vcount_irq() { //trigger pending VMATCH irqs if(MMU.reg_IF_pending[ARMCPU_ARM9] & (1<>8)|((vmatch<<1)&(1<<8))); if(nds.VCount==vmatch) { //arm7 vmatch T1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) | 4); if(T1ReadWord(MMU.ARM7_REG, 4) & 32) MMU.reg_IF_pending[ARMCPU_ARM7] |= (1<> (32-1)) & (c^d)) ^ d); } FORCEINLINE u64 _fast_min(u64 a, u64 b) { //you might find that this is faster on a 64bit system; someone should try it //http://aggregate.org/MAGIC/#Integer%20Selection //u64 ret = (((((s64)(a-b)) >> (64-1)) & (a^b)) ^ b); //assert(ret==min(a,b)); //return ret; //but this ends up being the fastest on 32bits return a>= 63; //no 64bit shra in sse2, what a disappointment //temp = _mm_and_si128(temp,xorval); //temp = _mm_xor_si128(temp,__b); //return temp.m128i_u64[0]; } u64 Sequencer::findNext() { //this one is always enabled so dont bother to check it u64 next = dispcnt.next(); if(divider.isEnabled()) next = _fast_min(next,divider.next()); if(sqrtunit.isEnabled()) next = _fast_min(next,sqrtunit.next()); if(gxfifo.enabled) next = _fast_min(next,gxfifo.next()); #ifdef EXPERIMENTAL_WIFI_COMM next = _fast_min(next,wifi.next()); #endif #define test(X,Y) if(dma_##X##_##Y .isEnabled()) next = _fast_min(next,dma_##X##_##Y .next()); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test #define test(X,Y) if(timer_##X##_##Y .enabled) next = _fast_min(next,timer_##X##_##Y .next()); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test return next; } void Sequencer::execHardware() { if(dispcnt.isTriggered()) { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[1]++); switch(dispcnt.param) { case ESI_DISPCNT_HStart: execHardware_hstart(); //(used to be 3168) //hstart is actually 8 dots before the visible drawing begins //we're going to run 1 here and then run 7 in the next case dispcnt.timestamp += 1*6*2; dispcnt.param = ESI_DISPCNT_HStartIRQ; break; case ESI_DISPCNT_HStartIRQ: execHardware_hstart_irq(); dispcnt.timestamp += 7*6*2; dispcnt.param = ESI_DISPCNT_HDraw; break; case ESI_DISPCNT_HDraw: execHardware_hdraw(); //duration of non-blanking period is ~1606 clocks (gbatek agrees) [but says its different on arm7] //im gonna call this 267 dots = 267*6=1602 //so, this event lasts 267 dots minus the 8 dot preroll dispcnt.timestamp += (267-8)*6*2; dispcnt.param = ESI_DISPCNT_HBlank; break; case ESI_DISPCNT_HBlank: execHardware_hblank(); //(once this was 1092 or 1092/12=91 dots.) //there are surely 355 dots per scanline, less 267 for non-blanking period. the rest is hblank and then after that is hstart dispcnt.timestamp += (355-267)*6*2; dispcnt.param = ESI_DISPCNT_HStart; break; } } #ifdef EXPERIMENTAL_WIFI_COMM if(wifi.isTriggered()) { WIFI_usTrigger(); wifi.timestamp += kWifiCycles; } #endif if(divider.isTriggered()) divider.exec(); if(sqrtunit.isTriggered()) sqrtunit.exec(); if(gxfifo.isTriggered()) gxfifo.exec(); #define test(X,Y) if(dma_##X##_##Y .isTriggered()) dma_##X##_##Y .exec(); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test #define test(X,Y) if(timer_##X##_##Y .enabled) if(timer_##X##_##Y .isTriggered()) timer_##X##_##Y .exec(); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test } void execHardware_interrupts(); static void saveUserInput(EMUFILE* os); static bool loadUserInput(EMUFILE* is, int version); void nds_savestate(EMUFILE* os) { //version write32le(3,os); sequencer.save(os); saveUserInput(os); write32le(LidClosed,os); write8le(countLid,os); } bool nds_loadstate(EMUFILE* is, int size) { // this isn't part of the savestate loading logic, but // don't skip the next frame after loading a savestate frameSkipper.OmitSkip(true, true); //read version u32 version; if(read32le(&version,is) != 1) return false; if(version > 3) return false; bool temp = true; temp &= sequencer.load(is, version); if(version <= 1 || !temp) return temp; temp &= loadUserInput(is, version); if(version < 3) return temp; read32le(&LidClosed,is); read8le(&countLid,is); return temp; } FORCEINLINE void arm9log() { #ifdef LOG_ARM9 if(dolog) { char dasmbuf[4096]; if(NDS_ARM9.CPSR.bits.T) des_thumb_instructions_set[((NDS_ARM9.instruction)>>6)&1023](NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf); else des_arm_instructions_set[INDEX(NDS_ARM9.instruction)](NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf); #ifdef LOG_TO_FILE if (!fp_dis9) return; #ifdef LOG_TO_FILE_REGS fprintf(fp_dis9, "\t\t;%05d:%03d %12lld\n\t\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\n\t\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\n", currFrameCounter, nds.VCount, nds_timer, NDS_ARM9.R[0], NDS_ARM9.R[1], NDS_ARM9.R[2], NDS_ARM9.R[3], NDS_ARM9.R[4], NDS_ARM9.R[5], NDS_ARM9.R[6], NDS_ARM9.R[7], NDS_ARM9.R[8], NDS_ARM9.R[9], NDS_ARM9.R[10], NDS_ARM9.R[11], NDS_ARM9.R[12], NDS_ARM9.R[13], NDS_ARM9.R[14], NDS_ARM9.R[15], NDS_ARM9.next_instruction, NDS_ARM9.CPSR.bits.N, NDS_ARM9.CPSR.bits.Z, NDS_ARM9.CPSR.bits.C, NDS_ARM9.CPSR.bits.V); #endif fprintf(fp_dis9, "%s %08X\t%08X \t%s\n", NDS_ARM9.CPSR.bits.T?"THUMB":"ARM", NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf); /*if (NDS_ARM9.instruction == 0) { dolog = false; INFO("Disassembler is stopped\n"); }*/ #else printf("%05d:%03d %12lld 9:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", currFrameCounter, nds.VCount, nds_timer, NDS_ARM9.instruct_adr,NDS_ARM9.instruction, dasmbuf, NDS_ARM9.R[0], NDS_ARM9.R[1], NDS_ARM9.R[2], NDS_ARM9.R[3], NDS_ARM9.R[4], NDS_ARM9.R[5], NDS_ARM9.R[6], NDS_ARM9.R[7], NDS_ARM9.R[8], NDS_ARM9.R[9], NDS_ARM9.R[10], NDS_ARM9.R[11], NDS_ARM9.R[12], NDS_ARM9.R[13], NDS_ARM9.R[14], NDS_ARM9.R[15]); #endif } #endif } FORCEINLINE void arm7log() { #ifdef LOG_ARM7 if(dolog) { char dasmbuf[4096]; if(NDS_ARM7.CPSR.bits.T) des_thumb_instructions_set[((NDS_ARM7.instruction)>>6)&1023](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); else des_arm_instructions_set[INDEX(NDS_ARM7.instruction)](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); #ifdef LOG_TO_FILE if (!fp_dis7) return; #ifdef LOG_TO_FILE_REGS fprintf(fp_dis7, "\t\t;%05d:%03d %12lld\n\t\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\n\t\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\n", currFrameCounter, nds.VCount, nds_timer, NDS_ARM7.R[0], NDS_ARM7.R[1], NDS_ARM7.R[2], NDS_ARM7.R[3], NDS_ARM7.R[4], NDS_ARM7.R[5], NDS_ARM7.R[6], NDS_ARM7.R[7], NDS_ARM7.R[8], NDS_ARM7.R[9], NDS_ARM7.R[10], NDS_ARM7.R[11], NDS_ARM7.R[12], NDS_ARM7.R[13], NDS_ARM7.R[14], NDS_ARM7.R[15], NDS_ARM7.next_instruction, NDS_ARM7.CPSR.bits.N, NDS_ARM7.CPSR.bits.Z, NDS_ARM7.CPSR.bits.C, NDS_ARM7.CPSR.bits.V); #endif fprintf(fp_dis7, "%s %08X\t%08X \t%s\n", NDS_ARM7.CPSR.bits.T?"THUMB":"ARM", NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); /*if (NDS_ARM7.instruction == 0) { dolog = false; INFO("Disassembler is stopped\n"); }*/ #else printf("%05d:%03d %12lld 7:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", currFrameCounter, nds.VCount, nds_timer, NDS_ARM7.instruct_adr,NDS_ARM7.instruction, dasmbuf, NDS_ARM7.R[0], NDS_ARM7.R[1], NDS_ARM7.R[2], NDS_ARM7.R[3], NDS_ARM7.R[4], NDS_ARM7.R[5], NDS_ARM7.R[6], NDS_ARM7.R[7], NDS_ARM7.R[8], NDS_ARM7.R[9], NDS_ARM7.R[10], NDS_ARM7.R[11], NDS_ARM7.R[12], NDS_ARM7.R[13], NDS_ARM7.R[14], NDS_ARM7.R[15]); #endif } #endif } //these have not been tuned very well yet. static const int kMaxWork = 4000; static const int kIrqWait = 4000; template static FORCEINLINE s32 minarmtime(s32 arm9, s32 arm7) { if(doarm9) if(doarm7) return min(arm9,arm7); else return arm9; else return arm7; } #ifdef HAVE_JIT template #else template #endif static /*donotinline*/ std::pair armInnerLoop( const u64 nds_timer_base, const s32 s32next, s32 arm9, s32 arm7) { s32 timer = minarmtime(arm9,arm7); while(timer < s32next && !sequencer.reschedule && execute) { if(doarm9 && (!doarm7 || arm9 <= timer)) { if(!NDS_ARM9.waitIRQ&&!nds.freezeBus) { arm9log(); debug(); #ifdef HAVE_JIT arm9 += armcpu_exec(); #else arm9 += armcpu_exec(); #endif #ifdef DEVELOPER nds_debug_continuing[0] = false; #endif } else { s32 temp = arm9; arm9 = min(s32next, arm9 + kIrqWait); nds.idleCycles[0] += arm9-temp; if (gxFIFO.size < 255) nds.freezeBus &= ~1; } } if(doarm7 && (!doarm9 || arm7 <= timer)) { if(!NDS_ARM7.waitIRQ&&!nds.freezeBus) { arm7log(); #ifdef HAVE_JIT arm7 += (armcpu_exec()<<1); #else arm7 += (armcpu_exec()<<1); #endif #ifdef DEVELOPER nds_debug_continuing[1] = false; #endif } else { s32 temp = arm7; arm7 = min(s32next, arm7 + kIrqWait); nds.idleCycles[1] += arm7-temp; if(arm7 == s32next) { nds_timer = nds_timer_base + minarmtime(arm9,arm7); #ifdef HAVE_JIT return armInnerLoop(nds_timer_base, s32next, arm9, arm7); #else return armInnerLoop(nds_timer_base, s32next, arm9, arm7); #endif } } } timer = minarmtime(arm9,arm7); nds_timer = nds_timer_base + timer; } return std::make_pair(arm9, arm7); } void NDS_debug_break() { NDS_ARM9.stalled = NDS_ARM7.stalled = 1; //triggers an immediate exit from the cpu loop NDS_Reschedule(); } void NDS_debug_continue() { NDS_ARM9.stalled = NDS_ARM7.stalled = 0; } void NDS_debug_step() { NDS_debug_continue(); singleStep = true; } template void NDS_exec(s32 nb) { #ifdef GDB_STUB gdbstub_mutex_lock(); #endif LagFrameFlag=1; sequencer.nds_vblankEnded = false; nds.cpuloopIterationCount = 0; IF_DEVELOPER(for(int i=0;i<32;i++) DEBUG_statistics.sequencerExecutionCounters[i] = 0); if(nds.sleeping) { //speculative code: if ANY irq happens, wake up the arm7. //I think the arm7 program analyzes the system and may decide not to wake up //if it is dissatisfied with the conditions if((MMU.reg_IE[1] & MMU.gen_IF<1>())) { nds.sleeping = FALSE; } } else { for(;;) { //trap the debug-stalled condition #ifdef DEVELOPER singleStep = false; //(gdb stub doesnt yet know how to trigger these immediately by calling reschedule) if ((NDS_ARM9.stalled || NDS_ARM7.stalled) && execute) { driver->EMU_DebugIdleEnter(); while((NDS_ARM9.stalled || NDS_ARM7.stalled) && execute) { #ifdef GDB_STUB gdbstub_mutex_unlock(); #endif driver->EMU_DebugIdleUpdate(); #ifdef GDB_STUB gdbstub_mutex_lock(); #endif nds_debug_continuing[0] = nds_debug_continuing[1] = true; } driver->EMU_DebugIdleWakeUp(); } #endif nds.cpuloopIterationCount++; sequencer.execHardware(); //break out once per frame if(sequencer.nds_vblankEnded) break; //it should be benign to execute execHardware in the next frame, //since there won't be anything for it to do (everything should be scheduled in the future) //bail in case the system halted if(!execute) break; execHardware_interrupts(); //find next work unit: u64 next = sequencer.findNext(); next = min(next,nds_timer+kMaxWork); //lets set an upper limit for now //printf("%d\n",(next-nds_timer)); sequencer.reschedule = false; //cast these down to 32bits so that things run faster on 32bit procs u64 nds_timer_base = nds_timer; s32 arm9 = (s32)(nds_arm9_timer-nds_timer); s32 arm7 = (s32)(nds_arm7_timer-nds_timer); s32 s32next = (s32)(next-nds_timer); #ifdef DEVELOPER if(singleStep) { s32next = 1; } #endif #ifdef HAVE_JIT std::pair arm9arm7 = CommonSettings.use_jit ? armInnerLoop(nds_timer_base,s32next,arm9,arm7) : armInnerLoop(nds_timer_base,s32next,arm9,arm7); #else std::pair arm9arm7 = armInnerLoop(nds_timer_base,s32next,arm9,arm7); #endif #ifdef DEVELOPER if(singleStep) { NDS_ARM9.stalled = NDS_ARM7.stalled = 1; } #endif arm9 = arm9arm7.first; arm7 = arm9arm7.second; nds_arm7_timer = nds_timer_base+arm7; nds_arm9_timer = nds_timer_base+arm9; #ifndef NDEBUG //what we find here is dependent on the timing constants above //if(nds_timer>next && (nds_timer-next)>22) // printf("curious. please report: over by %d\n",(int)(nds_timer-next)); #endif //if we were waiting for an irq, don't wait too long: //let's re-analyze it after this hardware event (this rolls back a big burst of irq waiting which may have been interrupted by a resynch) if(NDS_ARM9.waitIRQ) { nds.idleCycles[0] -= (s32)(nds_arm9_timer-nds_timer); nds_arm9_timer = nds_timer; } if(NDS_ARM7.waitIRQ) { nds.idleCycles[1] -= (s32)(nds_arm7_timer-nds_timer); nds_arm7_timer = nds_timer; } } } //DEBUG_statistics.printSequencerExecutionCounters(); //DEBUG_statistics.print(); //end of frame emulation housekeeping if(LagFrameFlag) { lagframecounter++; TotalLagFrames++; } else { lastLag = lagframecounter; lagframecounter = 0; } currFrameCounter++; DEBUG_Notify.NextFrame(); if (cheats) cheats->process(); #ifdef GDB_STUB gdbstub_mutex_unlock(); #endif } template static void execHardware_interrupts_core() { u32 IF = MMU.gen_IF(); u32 IE = MMU.reg_IE[PROCNUM]; u32 masked = IF & IE; if(ARMPROC.halt_IE_and_IF && masked) { ARMPROC.halt_IE_and_IF = FALSE; ARMPROC.waitIRQ = FALSE; } if(masked && MMU.reg_IME[PROCNUM] && !ARMPROC.CPSR.bits.I) { //printf("Executing IRQ on procnum %d with IF = %08X and IE = %08X\n",PROCNUM,IF,IE); armcpu_irqException(&ARMPROC); } } void execHardware_interrupts() { execHardware_interrupts_core(); execHardware_interrupts_core(); } static void resetUserInput(); static void PrepareBiosARM7() { //begin with the bios unloaded NDS_ARM7.BIOS_loaded = false; memset(MMU.ARM7_BIOS, 0, sizeof(MMU.ARM7_BIOS)); if(CommonSettings.UseExtBIOS == true) { //read arm7 bios from inputfile and flag it if it succeeds FILE *arm7inf = fopen(CommonSettings.ARM7BIOS,"rb"); if (arm7inf) { if (fread(MMU.ARM7_BIOS,1,16384,arm7inf) == 16384) NDS_ARM7.BIOS_loaded = true; fclose(arm7inf); } } //choose to use SWI emulation or routines from bios if((CommonSettings.SWIFromBIOS) && (NDS_ARM7.BIOS_loaded)) { NDS_ARM7.swi_tab = 0; //if we used routines from bios, apply patches if (CommonSettings.PatchSWI3) { //[3801] SUB R0, #1 -> [4770] BX LR T1WriteWord(MMU.ARM7_BIOS,0x2F08, 0x4770); } } else NDS_ARM7.swi_tab = ARM_swi_tab[ARMCPU_ARM7]; if(NDS_ARM7.BIOS_loaded) { INFO("ARM7 BIOS load: %s.\n", NDS_ARM7.BIOS_loaded?"OK":"FAILED"); } else { //fake bios content, critical to normal operations, since we dont have a real bios. T1WriteLong(MMU.ARM7_BIOS, 0x0000, 0xEAFFFFFE); //B 00000000 (reset: infinite loop) (originally: 0xE25EF002 - SUBS PC, LR, #2 T1WriteLong(MMU.ARM7_BIOS, 0x0004, 0xEAFFFFFE); //B 00000004 (undefined instruction: infinite loop) T1WriteLong(MMU.ARM7_BIOS, 0x0008, 0xEAFFFFFE); //B 00000280 (SWI: infinite loop [since we will be HLEing the SWI routines]) T1WriteLong(MMU.ARM7_BIOS, 0x000C, 0xEAFFFFFE); //B 0000000C (prefetch abort: infinite loop) T1WriteLong(MMU.ARM7_BIOS, 0x0010, 0xEAFFFFFE); //B 00000010 (data abort: infinite loop) T1WriteLong(MMU.ARM7_BIOS, 0x0018, 0xEA000000); //B 00000020 (IRQ: branch to handler) T1WriteLong(MMU.ARM7_BIOS, 0x001C, 0xEAFFFFFE); //B 0000001C (FIQ vector: infinite loop) //IRQ handler T1WriteLong(MMU.ARM7_BIOS, 0x0020, 0xE92D500F); //STMDB SP!, {R0-R3,R12,LR} T1WriteLong(MMU.ARM7_BIOS, 0x0024, 0xE3A00301); //MOV R0, #4000000 T1WriteLong(MMU.ARM7_BIOS, 0x0028, 0xE28FE000); //ADD LR, PC, #0 T1WriteLong(MMU.ARM7_BIOS, 0x002C, 0xE510F004); //LDR PC, [R0, -#4] T1WriteLong(MMU.ARM7_BIOS, 0x0030, 0xE8BD500F); //LDMIA SP!, {R0-R3,R12,LR} T1WriteLong(MMU.ARM7_BIOS, 0x0034, 0xE25EF004); //SUBS PC, LR, #4 } } static void PrepareBiosARM9() { //begin with the bios unloaded memset(MMU.ARM9_BIOS, 0, sizeof(MMU.ARM9_BIOS)); NDS_ARM9.BIOS_loaded = false; if(CommonSettings.UseExtBIOS == true) { //read arm9 bios from inputfile and flag it if it succeeds FILE* arm9inf = fopen(CommonSettings.ARM9BIOS,"rb"); if (arm9inf) { if (fread(MMU.ARM9_BIOS,1,4096,arm9inf) == 4096) NDS_ARM9.BIOS_loaded = true; fclose(arm9inf); } } //choose to use SWI emulation or routines from bios if((CommonSettings.SWIFromBIOS) && (NDS_ARM9.BIOS_loaded)) { NDS_ARM9.swi_tab = 0; //if we used routines from bios, apply patches //[3801] SUB R0, #1 -> [4770] BX LR if (CommonSettings.PatchSWI3) T1WriteWord(MMU.ARM9_BIOS, 0x07CC, 0x4770); } else NDS_ARM9.swi_tab = ARM_swi_tab[ARMCPU_ARM9]; if(NDS_ARM9.BIOS_loaded) { INFO("ARM9 BIOS load: %s.\n", NDS_ARM9.BIOS_loaded?"OK":"FAILED"); } else { //fake bios content, critical to normal operations, since we dont have a real bios. //it'd be cool if we could write this in some kind of assembly language, inline or otherwise, without some bulky dependencies //perhaps we could build it with devkitarm? but thats bulky (offline) dependencies, to be sure.. //reminder: bios chains data abort to fast irq //exception vectors: T1WriteLong(MMU.ARM9_BIOS, 0x0000, 0xEAFFFFFE); // (infinite loop for) Reset !!! //T1WriteLong(MMU.ARM9_BIOS, 0x0004, 0xEAFFFFFE); // (infinite loop for) Undefined instruction T1WriteLong(MMU.ARM9_BIOS, 0x0004, 0xEA000004); // Undefined instruction -> Fast IRQ (just guessing) T1WriteLong(MMU.ARM9_BIOS, 0x0008, 0xEA00009C); // SWI -> ????? T1WriteLong(MMU.ARM9_BIOS, 0x000C, 0xEAFFFFFE); // (infinite loop for) Prefetch Abort T1WriteLong(MMU.ARM9_BIOS, 0x0010, 0xEA000001); // Data Abort -> Fast IRQ T1WriteLong(MMU.ARM9_BIOS, 0x0014, 0x00000000); // Reserved T1WriteLong(MMU.ARM9_BIOS, 0x0018, 0xEA000095); // Normal IRQ -> 0x0274 T1WriteLong(MMU.ARM9_BIOS, 0x001C, 0xEA00009D); // Fast IRQ -> 0x0298 //copy the logo content into the bios - Pokemon Platinum uses this in Pal Park trade //it compares the logo from the arm9 bios to the logo in the GBA header. //NOTE: in the unlikely event that the valid header is missing from the gameInfo, we'd be doing wrong here. // however, its nice not to have the logo embedded here. // TODO - take a CRC of the logo, check vs logoCRC16, and a hardcoded value, to make sure all is in order--report error if not memcpy(&MMU.ARM9_BIOS[0x20], &gameInfo.header.logo[0], 0x9C); T1WriteWord(MMU.ARM9_BIOS, 0x20 + 0x9C, gameInfo.header.logoCRC16); //... and with that we are at 0xBC: //(now what goes in this gap?? nothing we need, i guess) //IRQ handler: get dtcm address and jump to a vector in it T1WriteLong(MMU.ARM9_BIOS, 0x0274, 0xE92D500F); //STMDB SP!, {R0-R3,R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x0278, 0xEE190F11); //MRC CP15, 0, R0, CR9, CR1, 0 T1WriteLong(MMU.ARM9_BIOS, 0x027C, 0xE1A00620); //MOV R0, R0, LSR #C T1WriteLong(MMU.ARM9_BIOS, 0x0280, 0xE1A00600); //MOV R0, R0, LSL #C T1WriteLong(MMU.ARM9_BIOS, 0x0284, 0xE2800C40); //ADD R0, R0, #4000 T1WriteLong(MMU.ARM9_BIOS, 0x0288, 0xE28FE000); //ADD LR, PC, #0 T1WriteLong(MMU.ARM9_BIOS, 0x028C, 0xE510F004); //LDR PC, [R0, -#4] //???? T1WriteLong(MMU.ARM9_BIOS, 0x0290, 0xE8BD500F); //LDMIA SP!, {R0-R3,R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x0294, 0xE25EF004); //SUBS PC, LR, #4 //------- //FIQ and abort exception handler //TODO - this code is copied from the bios. refactor it //friendly reminder: to calculate an immediate offset: encoded = (desired_address-cur_address-8) T1WriteLong(MMU.ARM9_BIOS, 0x0298, 0xE10FD000); //MRS SP, CPSR T1WriteLong(MMU.ARM9_BIOS, 0x029C, 0xE38DD0C0); //ORR SP, SP, #C0 T1WriteLong(MMU.ARM9_BIOS, 0x02A0, 0xE12FF00D); //MSR CPSR_fsxc, SP T1WriteLong(MMU.ARM9_BIOS, 0x02A4, 0xE59FD000 | (0x2D4-0x2A4-8)); //LDR SP, [FFFF02D4] T1WriteLong(MMU.ARM9_BIOS, 0x02A8, 0xE28DD001); //ADD SP, SP, #1 T1WriteLong(MMU.ARM9_BIOS, 0x02AC, 0xE92D5000); //STMDB SP!, {R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x02B0, 0xE14FE000); //MRS LR, SPSR T1WriteLong(MMU.ARM9_BIOS, 0x02B4, 0xEE11CF10); //MRC CP15, 0, R12, CR1, CR0, 0 T1WriteLong(MMU.ARM9_BIOS, 0x02B8, 0xE92D5000); //STMDB SP!, {R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x02BC, 0xE3CCC001); //BIC R12, R12, #1 T1WriteLong(MMU.ARM9_BIOS, 0x02C0, 0xEE01CF10); //MCR CP15, 0, R12, CR1, CR0, 0 T1WriteLong(MMU.ARM9_BIOS, 0x02C4, 0xE3CDC001); //BIC R12, SP, #1 T1WriteLong(MMU.ARM9_BIOS, 0x02C8, 0xE59CC010); //LDR R12, [R12, #10] T1WriteLong(MMU.ARM9_BIOS, 0x02CC, 0xE35C0000); //CMP R12, #0 T1WriteLong(MMU.ARM9_BIOS, 0x02D0, 0x112FFF3C); //BLXNE R12 T1WriteLong(MMU.ARM9_BIOS, 0x02D4, 0x027FFD9C); //0x027FFD9C //--------- } } static void JumbleMemory() { //put random garbage in vram for homebrew games, to help mimic the situation where libnds does not clear out junk //which the card's launcher may or may not have left behind //analysis: //1. retail games dont clear TCM, so why should we jumble it and expect homebrew to clear it? //2. some retail games _dont boot_ if main memory is jumbled. wha...? //3. clearing this is not as useful as tracking uninitialized reads in dev+ builds //4. the vram clearing causes lots of graphical corruptions in badly coded homebrews. this reduces compatibility substantially //conclusion: disable it for now and bring it back as an option //if(gameInfo.isHomebrew) //{ // u32 w=100000,x=99,y=117,z=19382173; // CTASSERT(sizeof(MMU.ARM9_LCD) < sizeof(MMU.MAIN_MEM)); // CTASSERT(sizeof(MMU.ARM9_VMEM) < sizeof(MMU.MAIN_MEM)); // CTASSERT(sizeof(MMU.ARM9_ITCM) < sizeof(MMU.MAIN_MEM)); // CTASSERT(sizeof(MMU.ARM9_DTCM) < sizeof(MMU.MAIN_MEM)); // for(int i=0;i>19))^(t^(t>>8))); // //MMU.MAIN_MEM[i] = t; // if (iloadSettings(); //since firmware only boots encrypted roms, we have to make sure it's encrypted first //this has not been validated on big endian systems. it almost positively doesn't work. if (gameInfo.header.CRC16 != 0) EncryptSecureArea((u8*)&gameInfo.header, (u8*)gameInfo.secureArea); //boot processors from their bios entrypoints armcpu_init(&NDS_ARM7, 0x00000000); armcpu_init(&NDS_ARM9, 0xFFFF0000); return true; } //the fake firmware boot-up process bool NDS_FakeBoot() { NDS_header * header = NDS_getROMHeader(); //DEBUG_reset(); if (!header) return false; nds.isFakeBooted = true; //since we're bypassing the code to decrypt the secure area, we need to make sure its decrypted first //this has not been validated on big endian systems. it almost positively doesn't work. if (gameInfo.header.CRC16 != 0) { bool okRom = DecryptSecureArea((u8*)&gameInfo.header, (u8*)gameInfo.secureArea); if(!okRom) { printf("Specified file is not a valid rom\n"); return false; } } //bios (or firmware) sets this default, which is generally not important for retail games but some homebrews are depending on _MMU_write08(REG_WRAMCNT,3); //EDIT - whats this firmware and how is it relating to the dummy firmware below //how do these even get used? what is the purpose of unpack and why is it not used by the firmware boot process? if (CommonSettings.UseExtFirmware && firmware->loaded()) { firmware->unpack(); firmware->loadSettings(); } // Create the dummy firmware //EDIT - whats dummy firmware and how is relating to the above? //it seems to be emplacing basic firmware data into MMU.fw.data NDS_CreateDummyFirmware(&CommonSettings.fw_config); //firmware loads the game card arm9 and arm7 programs as specified in rom header { bool hasSecureArea = ((gameInfo.romType == ROM_NDS) && (gameInfo.header.CRC16 != 0)); //copy the arm9 program to the address specified by rom header u32 src = header->ARM9src; u32 dst = header->ARM9cpy; for(u32 i = 0; i < header->ARM9binSize; i+=4) { u32 tmp = (hasSecureArea && ((src >= 0x4000) && (src < 0x8000)))?LE_TO_LOCAL_32(*(u32*)(gameInfo.secureArea + (src - 0x4000))):gameInfo.readROM(src); _MMU_write32(dst, tmp); dst += 4; src += 4; } //copy the arm7 program to the address specified by rom header src = header->ARM7src; dst = header->ARM7cpy; for(u32 i = 0; i < header->ARM7binSize; i+=4) { _MMU_write32(dst, gameInfo.readROM(src)); dst += 4; src += 4; } } //bios does this (thats weird, though. shouldnt it get changed when the card is swapped in the firmware menu? //right now our firmware menu isnt detecting any change to the card. //are some games depending on it being written here? please document. //_MMU_write16(0x027FF808, T1ReadWord(MMU.CART_ROM, 0x15E)); //firmware sets up a copy of the firmware user settings in memory. //TBD - this code is really clunky //it seems to be copying the MMU.fw.data data into RAM in the user memory stash locations u8 temp_buffer[NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT]; if ( copy_firmware_user_data( temp_buffer, MMU.fw.data)) { for ( int fw_index = 0; fw_index < NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT; fw_index++) _MMU_write08(0x027FFC80 + fw_index, temp_buffer[fw_index]); } //something copies the whole header to Main RAM 0x27FFE00 on startup. (http://nocash.emubase.de/gbatek.htm#dscartridgeheader) //once upon a time this copied 0x90 more. this was thought to be wrong, and changed. if(nds.Is_DSI()) { //dsi needs this copied later in memory. there are probably a number of things that get copied to a later location in memory.. thats where the NDS consoles tend to stash stuff. for (int i = 0; i < (0x170); i+=4) _MMU_write32(0x027FFE00 + i, gameInfo.readROM(i)); } else { for (int i = 0; i < (0x170); i+=4) _MMU_write32(0x027FFE00 + i, gameInfo.readROM(i)); } //the firmware will be booting to these entrypoint addresses via BX (well, the arm9 at least; is unverified for the arm7) armcpu_init(&NDS_ARM7, header->ARM7exe); armcpu_init(&NDS_ARM9, header->ARM9exe); //firmware sets REG_POSTFLG to the value indicating post-firmware status MMU.ARM9_REG[0x300] = 1; MMU.ARM7_REG[0x300] = 1; //firmware makes system think it's booted from card -- EXTREMELY IMPORTANT!!! This is actually checked by some things. (which things?) Thanks to cReDiAr _MMU_write08(0x02FFFC40,0x1); // removed redundant write to ARM9, this is going to shared main memory. But one has to wonder why r3478 was made which corrected a typo resulting in only ARMCPU_ARM7 getting used. //the chipId is read several times //for some reason, each of those reads get stored here. _MMU_write32(0x027FF800, gameInfo.chipID); //1st chipId _MMU_write32(0x027FF804, gameInfo.chipID); //2nd (secure) chipId _MMU_write32(0x027FFC00, gameInfo.chipID); //3rd (secure) chipId // Write the header checksum to memory _MMU_write16(0x027FF808, gameInfo.header.headerCRC16); //bitbox 4k demo is so stripped down it relies on default stack values //otherwise the arm7 will crash before making a sound //(these according to gbatek softreset bios docs) NDS_ARM7.R13_svc = 0x0380FFDC; NDS_ARM7.R13_irq = 0x0380FFB0; NDS_ARM7.R13_usr = 0x0380FF00; NDS_ARM7.R[13] = NDS_ARM7.R13_usr; //and let's set these for the arm9 while we're at it, though we have no proof NDS_ARM9.R13_svc = 0x00803FC0; NDS_ARM9.R13_irq = 0x00803FA0; NDS_ARM9.R13_usr = 0x00803EC0; NDS_ARM9.R13_abt = NDS_ARM9.R13_usr; //????? //I think it is wrong to take gbatek's "SYS" and put it in USR--maybe USR doesnt matter. //i think SYS is all the misc modes. please verify by setting nonsensical stack values for USR here NDS_ARM9.R[13] = NDS_ARM9.R13_usr; //n.b.: im not sure about all these, I dont know enough about arm9 svc/irq/etc modes //and how theyre named in desmume to match them up correctly. i just guessed. //-------------------------------- //setup the homebrew argv //this is useful for nitrofs apps which are emulating themselves via cflash //struct __argv { // int argvMagic; //!< argv magic number, set to 0x5f617267 ('_arg') if valid // char *commandLine; //!< base address of command line, set of null terminated strings // int length; //!< total length of command line // int argc; //!< internal use, number of arguments // char **argv; //!< internal use, argv pointer //}; std::string rompath = "fat:/" + path.RomName; const u32 kCommandline = 0x027E0000; //const u32 kCommandline = 0x027FFF84; //homebrew-related stuff. //its safe to put things in this position.. apparently nothing important is here. //however, some games could be checking them as an anti-desmume measure, so we might have to control it with slot-1 settings to suggest booting a homebrew app //perhaps we could automatically boot homebrew to an R4-like device. _MMU_write32(0x02FFFE70, 0x5f617267); _MMU_write32(0x02FFFE74, kCommandline); //(commandline starts here) _MMU_write32(0x02FFFE78, rompath.size()+1); //0x027FFF7C (argc) //0x027FFF80 (argv) for(size_t i=0;i(kCommandline+i, rompath[i]); _MMU_write08(kCommandline+rompath.size(), 0); //-------------------------------- //Call the card post_fakeboot hook to perform additional initialization slot1_device->post_fakeboot(ARMCPU_ARM9); slot1_device->post_fakeboot(ARMCPU_ARM7); delete header; return true; } bool _HACK_DONT_STOPMOVIE = false; void NDS_Reset() { PrepareLogfiles(); if(movieMode != MOVIEMODE_INACTIVE && !_HACK_DONT_STOPMOVIE) movie_reset_command = true; if(movieMode == MOVIEMODE_INACTIVE) { currFrameCounter = 0; lagframecounter = 0; LagFrameFlag = 0; lastLag = 0; TotalLagFrames = 0; } resetUserInput(); singleStep = false; nds_debug_continuing[0] = nds_debug_continuing[1] = false; nds.sleeping = FALSE; nds.cardEjected = FALSE; nds.freezeBus = 0; nds.power1.lcd = nds.power1.gpuMain = nds.power1.gfx3d_render = nds.power1.gfx3d_geometry = nds.power1.gpuSub = nds.power1.dispswap = 1; nds.power2.speakers = 1; nds.power2.wifi = 0; nds.wifiCycle = 0; memset(nds.timerCycle, 0, sizeof(u64) * 2 * 4); nds.old = 0; nds.scr_touchX = nds.scr_touchY = nds.adc_touchX = nds.adc_touchY = 0; nds.isTouch = 0; nds.isFakeBooted = false; nds.paddle = 0; nds.ConsoleType = CommonSettings.ConsoleType; nds._DebugConsole = CommonSettings.DebugConsole; nds.ensataEmulation = CommonSettings.EnsataEmulation; nds.stylusJitter = CommonSettings.StylusJitter; nds.ensataHandshake = ENSATA_HANDSHAKE_none; nds.ensataIpcSyncCounter = 0; nds_timer = 0; nds_arm9_timer = 0; nds_arm7_timer = 0; LidClosed = FALSE; countLid = 0; MMU_Reset(); SetupMMU(nds.Is_DebugConsole(),nds.Is_DSI()); JumbleMemory(); #ifdef HAVE_JIT arm_jit_reset(CommonSettings.use_jit); #endif //initialize CP15 specially for this platform //TODO - how much of this is necessary for firmware boot? //(only ARM9 has CP15) reconstruct(&cp15); MMU.ARM9_RW_MODE = BIT7(cp15.ctrl); NDS_ARM9.intVector = 0xFFFF0000 * (BIT13(cp15.ctrl)); NDS_ARM9.LDTBit = !BIT15(cp15.ctrl); //TBit PrepareBiosARM7(); PrepareBiosARM9(); if (firmware) { delete firmware; firmware = NULL; } firmware = new CFIRMWARE(); firmware->load(); //we will allow a proper firmware boot, if: //1. we have the ARM7 and ARM9 bioses (its doubtful that our HLE bios implement the necessary functions) //2. firmware is available //3. user has requested booting from firmware bool canBootFromFirmware = (NDS_ARM7.BIOS_loaded && NDS_ARM9.BIOS_loaded && CommonSettings.BootFromFirmware && firmware->loaded()); bool bootResult = false; if(canBootFromFirmware) bootResult = NDS_LegitBoot(); else bootResult = NDS_FakeBoot(); // Init calibration info memcpy(&TSCal, firmware->getTouchCalibrate(), sizeof(TSCalInfo)); Screen_Reset(); gfx3d_reset(); gpu3D->NDS_3D_Reset(); WIFI_Reset(); memcpy(FW_Mac, (MMU.fw.data + 0x36), 6); SPU_DeInit(); SPU_ReInit(!canBootFromFirmware && bootResult); //this needs to happen last, pretty much, since it establishes the correct scheduling state based on all of the above initialization initSchedule(); } static std::string MakeInputDisplayString(u16 pad, const std::string* Buttons, int count) { std::string s; for (int x = 0; x < count; x++) { if (pad & (1 << x)) s.append(Buttons[x].size(), ' '); else s += Buttons[x]; } return s; } static std::string MakeInputDisplayString(u16 pad, u16 padExt) { const std::string Buttons[] = {"A", "B", "Sl", "St", "R", "L", "U", "D", "Rs", "Ls"}; const std::string Ext[] = {"X", "Y"}; std::string s = MakeInputDisplayString(pad, Ext, ARRAY_SIZE(Ext)); s += MakeInputDisplayString(padExt, Buttons, ARRAY_SIZE(Buttons)); return s; } buttonstruct Turbo; buttonstruct TurboTime; buttonstruct AutoHold; void ClearAutoHold(void) { for (u32 i=0; i < ARRAY_SIZE(AutoHold.array); i++) { AutoHold.array[i]=false; } } //convert a 12.4 screen coordinate to an ADC value. //the desmume host system will track the screen coordinate, but the hardware should be receiving the raw ADC values. //so we'll need to use this to simulate the ADC values corresponding to the desired screen coords, based on the current TSC calibrations u16 NDS_getADCTouchPosX(int scrX_lsl4) { scrX_lsl4 >>= 4; int rv = ((scrX_lsl4 - TSCal.scr.x1 + 1) * TSCal.adc.width) / TSCal.scr.width + TSCal.adc.x1; rv = min(0xFFF, max(0, rv)); return (u16)(rv); } u16 NDS_getADCTouchPosY(int scrY_lsl4) { scrY_lsl4 >>= 4; int rv = ((scrY_lsl4 - TSCal.scr.y1 + 1) * TSCal.adc.height) / TSCal.scr.height + TSCal.adc.y1; rv = min(0xFFF, max(0, rv)); return (u16)(rv); } static UserInput rawUserInput = {}; // requested input, generally what the user is physically pressing static UserInput intermediateUserInput = {}; // intermediate buffer for modifications (seperated from finalUserInput for safety reasons) static UserInput finalUserInput = {}; // what gets sent to the game and possibly recorded bool validToProcessInput = false; const UserInput& NDS_getRawUserInput() { return rawUserInput; } UserInput& NDS_getProcessingUserInput() { assert(validToProcessInput); return intermediateUserInput; } bool NDS_isProcessingUserInput() { return validToProcessInput; } const UserInput& NDS_getFinalUserInput() { return finalUserInput; } static void saveUserInput(EMUFILE* os, UserInput& input) { os->fwrite((const char*)input.buttons.array, 14); writebool(input.touch.isTouch, os); write16le(input.touch.touchX, os); write16le(input.touch.touchY, os); write32le(input.mic.micButtonPressed, os); } static bool loadUserInput(EMUFILE* is, UserInput& input, int version) { is->fread((char*)input.buttons.array, 14); readbool(&input.touch.isTouch, is); read16le(&input.touch.touchX, is); read16le(&input.touch.touchY, is); read32le(&input.mic.micButtonPressed, is); return true; } static void resetUserInput(UserInput& input) { memset(&input, 0, sizeof(UserInput)); } // (userinput is kind of a misnomer, e.g. finalUserInput has to mirror nds.pad, nds.touchX, etc.) static void saveUserInput(EMUFILE* os) { saveUserInput(os, finalUserInput); saveUserInput(os, intermediateUserInput); // saved in case a savestate is made during input processing (which Lua could do if nothing else) writebool(validToProcessInput, os); for(int i = 0; i < 14; i++) write32le(TurboTime.array[i], os); // saved to make autofire more tolerable to use with re-recording } static bool loadUserInput(EMUFILE* is, int version) { bool rv = true; rv &= loadUserInput(is, finalUserInput, version); rv &= loadUserInput(is, intermediateUserInput, version); readbool(&validToProcessInput, is); for(int i = 0; i < 14; i++) read32le((u32*)&TurboTime.array[i], is); return rv; } static void resetUserInput() { resetUserInput(finalUserInput); resetUserInput(intermediateUserInput); } static inline void gotInputRequest() { // nobody should set the raw input while we're processing the input. // it might not screw anything up but it would be completely useless. assert(!validToProcessInput); } void NDS_setPad(bool R,bool L,bool D,bool U,bool T,bool S,bool B,bool A,bool Y,bool X,bool W,bool E,bool G, bool F) { gotInputRequest(); UserButtons& rawButtons = rawUserInput.buttons; rawButtons.R = R; rawButtons.L = L; rawButtons.D = D; rawButtons.U = U; rawButtons.T = T; rawButtons.S = S; rawButtons.B = B; rawButtons.A = A; rawButtons.Y = Y; rawButtons.X = X; rawButtons.W = W; rawButtons.E = E; rawButtons.G = G; rawButtons.F = F; } void NDS_setTouchPos(u16 x, u16 y) { gotInputRequest(); rawUserInput.touch.touchX = x<<4; rawUserInput.touch.touchY = y<<4; rawUserInput.touch.isTouch = true; if(movieMode != MOVIEMODE_INACTIVE && movieMode != MOVIEMODE_FINISHED) { // just in case, since the movie only stores 8 bits per touch coord #ifdef WORDS_BIGENDIAN rawUserInput.touch.touchX &= 0xF00F; rawUserInput.touch.touchY &= 0xF00F; #else rawUserInput.touch.touchX &= 0x0FF0; rawUserInput.touch.touchY &= 0x0FF0; #endif } } void NDS_releaseTouch(void) { gotInputRequest(); rawUserInput.touch.touchX = 0; rawUserInput.touch.touchY = 0; rawUserInput.touch.isTouch = false; } void NDS_setMic(bool pressed) { gotInputRequest(); rawUserInput.mic.micButtonPressed = (pressed ? TRUE : FALSE); } static void NDS_applyFinalInput(); void NDS_beginProcessingInput() { // start off from the raw input intermediateUserInput = rawUserInput; // processing is valid now validToProcessInput = true; } void NDS_endProcessingInput() { // transfer the processed input finalUserInput = intermediateUserInput; // processing is invalid now validToProcessInput = false; // use the final input for a few things right away NDS_applyFinalInput(); } static void NDS_applyFinalInput() { const UserInput& input = NDS_getFinalUserInput(); u16 pad = (0 | ((input.buttons.A ? 0 : 0x80) >> 7) | ((input.buttons.B ? 0 : 0x80) >> 6) | ((input.buttons.T ? 0 : 0x80) >> 5) | ((input.buttons.S ? 0 : 0x80) >> 4) | ((input.buttons.R ? 0 : 0x80) >> 3) | ((input.buttons.L ? 0 : 0x80) >> 2) | ((input.buttons.U ? 0 : 0x80) >> 1) | ((input.buttons.D ? 0 : 0x80) ) | ((input.buttons.E ? 0 : 0x80) << 1) | ((input.buttons.W ? 0 : 0x80) << 2)) ; pad = LOCAL_TO_LE_16(pad); ((u16 *)MMU.ARM9_REG)[0x130>>1] = (u16)pad; ((u16 *)MMU.ARM7_REG)[0x130>>1] = (u16)pad; u16 k_cnt = ((u16 *)MMU.ARM9_REG)[0x132>>1]; if ( k_cnt & (1<<14)) { //INFO("ARM9: KeyPad IRQ (pad 0x%04X, cnt 0x%04X (condition %s))\n", pad, k_cnt, k_cnt&(1<<15)?"AND":"OR"); u16 k_cnt_selected = (k_cnt & 0x3F); if (k_cnt&(1<<15)) // AND { if ((~pad & k_cnt_selected) == k_cnt_selected) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_KEYPAD); } else // OR { if (~pad & k_cnt_selected) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_KEYPAD); } } k_cnt = ((u16 *)MMU.ARM7_REG)[0x132>>1]; if ( k_cnt & (1<<14)) { //INFO("ARM7: KeyPad IRQ (pad 0x%04X, cnt 0x%04X (condition %s))\n", pad, k_cnt, k_cnt&(1<<15)?"AND":"OR"); u16 k_cnt_selected = (k_cnt & 0x3F); if (k_cnt&(1<<15)) // AND { if ((~pad & k_cnt_selected) == k_cnt_selected) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_KEYPAD); } else // OR { if (~pad & k_cnt_selected) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_KEYPAD); } } if(input.touch.isTouch) { u16 adc_x = NDS_getADCTouchPosX(input.touch.touchX); u16 adc_y = NDS_getADCTouchPosY(input.touch.touchY); nds.adc_touchX = adc_x; nds.adc_touchY = adc_y; nds.adc_jitterctr = 0; nds.scr_touchX = input.touch.touchX; nds.scr_touchY = input.touch.touchY; nds.isTouch = 1; } else { nds.adc_touchX = 0; nds.adc_touchY = 0; nds.scr_touchX = 0; nds.scr_touchY = 0; nds.isTouch = 0; } if (input.buttons.F && !countLid) { LidClosed = (!LidClosed) & 0x01; if (!LidClosed) { NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_ARM7_FOLD); } countLid = 30; } else { if (countLid > 0) countLid--; } u16 padExt = ((input.buttons.X ? 0 : 0x80) >> 7) | ((input.buttons.Y ? 0 : 0x80) >> 6) | ((input.buttons.G ? 0 : 0x80) >> 4) | ((LidClosed) << 7) | 0x0034; padExt = LOCAL_TO_LE_16(padExt); padExt |= (((u16 *)MMU.ARM7_REG)[0x136>>1] & 0x0070); ((u16 *)MMU.ARM7_REG)[0x136>>1] = (u16)padExt; InputDisplayString=MakeInputDisplayString(padExt, pad); //put into the format we want for the movie system //fRLDUTSBAYXWEg //we don't really need nds.pad anymore, but removing it would be a pain nds.pad = ((input.buttons.R ? 1 : 0) << 12)| ((input.buttons.L ? 1 : 0) << 11)| ((input.buttons.D ? 1 : 0) << 10)| ((input.buttons.U ? 1 : 0) << 9)| ((input.buttons.T ? 1 : 0) << 8)| ((input.buttons.S ? 1 : 0) << 7)| ((input.buttons.B ? 1 : 0) << 6)| ((input.buttons.A ? 1 : 0) << 5)| ((input.buttons.Y ? 1 : 0) << 4)| ((input.buttons.X ? 1 : 0) << 3)| ((input.buttons.W ? 1 : 0) << 2)| ((input.buttons.E ? 1 : 0) << 1); } void NDS_suspendProcessingInput(bool suspend) { static int suspendCount = 0; if(suspend) { // enter non-processing block assert(validToProcessInput); validToProcessInput = false; suspendCount++; } else if(suspendCount) { // exit non-processing block validToProcessInput = true; suspendCount--; } else { // unwound past first time -> not processing validToProcessInput = false; } } void NDS_swapScreen() { u16 tmp = MainScreen.offset; MainScreen.offset = SubScreen.offset; SubScreen.offset = tmp; } void emu_halt() { //printf("halting emu: ARM9 PC=%08X/%08X, ARM7 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr, NDS_ARM7.R[15], NDS_ARM7.instruct_adr); execute = false; #ifdef LOG_ARM9 if (fp_dis9) { char buf[256] = { 0 }; sprintf(buf, "halting emu: ARM9 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr); fwrite(buf, 1, strlen(buf), fp_dis9); INFO("ARM9 halted\n"); } #endif #ifdef LOG_ARM7 if (fp_dis7) { char buf[256] = { 0 }; sprintf(buf, "halting emu: ARM7 PC=%08X/%08X\n", NDS_ARM7.R[15], NDS_ARM7.instruct_adr); fwrite(buf, 1, strlen(buf), fp_dis7); INFO("ARM7 halted\n"); } #endif } //returns true if exmemcnt specifies satisfactory parameters for the device, which calls this function bool ValidateSlot2Access(u32 procnum, u32 demandSRAMSpeed, u32 demand1stROMSpeed, u32 demand2ndROMSpeed, int clockbits) { static const u32 _sramSpeeds[] = {10,8,6,18}; static const u32 _rom1Speeds[] = {10,8,6,18}; static const u32 _rom2Speeds[] = {6,4}; u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[procnum][0x40], 0x204); u16 exmemcnt9 = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); u32 arm7access = (exmemcnt9 & EXMEMCNT_MASK_SLOT2_ARM7); u32 sramSpeed = _sramSpeeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_SRAM_TIME)]; u32 romSpeed1 = _rom1Speeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_ROM_1ST_TIME)>>2]; u32 romSpeed2 = _rom2Speeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_ROM_2ND_TIME)>>4]; u32 curclockbits = (exmemcnt & EXMEMCNT_MASK_SLOT2_CLOCKRATE)>>5; if(procnum==ARMCPU_ARM9 && arm7access) return false; if(procnum==ARMCPU_ARM7 && !arm7access) return false; //what we're interested in here is whether the rom/ram are too low -> too fast. then accesses won't have enough time to work. //i'm not sure if this gives us enough flexibility, but it is good enough for now. //should make the arguments to this function bitmasks later if we need better. if(sramSpeed < demandSRAMSpeed) return false; if(romSpeed1 < demand1stROMSpeed) return false; if(romSpeed2 < demand2ndROMSpeed) return false; if(clockbits != -1 && clockbits != (int)curclockbits) return false; return true; } //these templates needed to be instantiated manually template void NDS_exec(s32 nb); template void NDS_exec(s32 nb); desmume-0.9.11/src/commandline.h0000755000000000000000000000554612467662066015221 0ustar rootroot/* Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _COMMANDLINE_H_ #define _COMMANDLINE_H_ #include #include "types.h" //I hate C. we have to forward declare these with more detail than I like typedef struct _GOptionContext GOptionContext; typedef struct _GError GError; //hacky commandline options that i didnt want to route through commonoptions extern int _commandline_linux_nojoy; //this class will also eventually try to take over the responsibility of using the args that it handles //for example: preparing the emulator run by loading the rom, savestate, and/or movie in the correct pattern. //it should also populate CommonSettings with its initial values class CommandLine { public: //actual options: these may move to another sturct int load_slot; int depth_threshold; int autodetect_method; std::string nds_file; std::string play_movie_file; std::string record_movie_file; int arm9_gdb_port, arm7_gdb_port; int start_paused; std::string cflash_image; std::string cflash_path; std::string gbaslot_rom; std::string slot1; std::string console_type; std::string slot1_fat_dir; bool _slot1_fat_dir_type; #ifndef HOST_WINDOWS int disable_sound; int disable_limiter; #endif //load up the common commandline options void loadCommonOptions(); bool parse(int argc,char **argv); //validate the common commandline options bool validate(); //process movie play/record commands void process_movieCommands(); //etc. void process_addonCommands(); bool is_cflash_configured; //print a little help message for cases when erroneous commandlines are entered void errorHelp(const char* binName); CommandLine(); ~CommandLine(); GError *error; GOptionContext *ctx; int _spu_sync_mode; int _spu_sync_method; private: char* _play_movie_file; char* _record_movie_file; char* _cflash_image; char* _cflash_path; char* _gbaslot_rom; char* _bios_arm9, *_bios_arm7; int _load_to_memory; int _bios_swi; int _spu_advanced; int _num_cores; int _rigorous_timing; int _advanced_timing; #ifdef HAVE_JIT int _cpu_mode; int _jit_size; #endif char* _slot1; char *_slot1_fat_dir; char* _console_type; char* _advanscene_import; }; #endif desmume-0.9.11/src/mic_alsa.cpp0000755000000000000000000001032612467662066015026 0ustar rootroot/* Copyright (C) 2009-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include "types.h" #include "mic.h" #include "debug.h" #include "readwrite.h" #include "emufile.h" #define MIC_BUFSIZE 4096 BOOL Mic_Inited = FALSE; u8 Mic_Buffer[2][MIC_BUFSIZE]; u16 Mic_BufPos; u8 Mic_PlayBuf; u8 Mic_WriteBuf; int MicButtonPressed; /* Alsa stuff */ static snd_pcm_t *pcm_handle; BOOL Mic_Init() { snd_pcm_hw_params_t *hwparams; snd_pcm_uframes_t mic_bufsize, periods; int err; if (Mic_Inited) return TRUE; if ((err = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { g_printerr("Failed to open device: %s\n", snd_strerror(err)); return FALSE; } /* Hardware params */ snd_pcm_hw_params_alloca(&hwparams); if ((err = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0) { g_printerr("Failed to setup hw parameters: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { g_printerr("Failed to set access: %s\n", snd_strerror(err)); return FALSE; } /* 8bit signed, mono, 16000hz */ if ((err = snd_pcm_hw_params_set_format(pcm_handle, hwparams, SND_PCM_FORMAT_S8)) < 0) { g_printerr("Failed to set format: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 1)) < 0) { g_printerr("Failed to set channels: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_set_rate(pcm_handle, hwparams, 16000, 0)) < 0) { g_printerr("Failed to set rate: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) { g_printerr("Failed to set hw parameters: %s\n", snd_strerror(err)); return FALSE; } /* Query the driver for buffer and period sizes */ if ((err = snd_pcm_hw_params_get_buffer_size(hwparams, &mic_bufsize)) < 0) { g_printerr("Failed to get buffer size: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_get_period_size(hwparams, &periods, 0)) < 0) { g_printerr("Failed to get period size: %s\n", snd_strerror(err)); return FALSE; } Mic_Inited = TRUE; Mic_Reset(); return TRUE; } void Mic_Reset() { if (!Mic_Inited) return; memset(Mic_Buffer, 0, MIC_BUFSIZE * 2); Mic_BufPos = 0; Mic_PlayBuf = 1; Mic_WriteBuf = 0; } void Mic_DeInit() { if (!Mic_Inited) return; Mic_Inited = FALSE; snd_pcm_drop(pcm_handle); snd_pcm_close(pcm_handle); } static void snd_pcm_read() { int error; error = snd_pcm_readi(pcm_handle, Mic_Buffer[Mic_WriteBuf], MIC_BUFSIZE); if (error < 0) error = snd_pcm_recover(pcm_handle, error, 0); if (error < 0) LOG("snd_pcm_readi FAIL!: %s\n", snd_strerror(error)); } u8 Mic_ReadSample() { u8 tmp; u8 ret; if (!Mic_Inited) return 0; tmp = Mic_Buffer[Mic_PlayBuf][Mic_BufPos >> 1]; if (Mic_BufPos & 0x1) { ret = ((tmp & 0x1) << 7); } else { ret = ((tmp & 0xFE) >> 1); snd_pcm_read(); } Mic_BufPos++; if (Mic_BufPos >= (MIC_BUFSIZE << 1)) { snd_pcm_read(); Mic_BufPos = 0; Mic_PlayBuf ^= 1; Mic_WriteBuf ^= 1; } return ret; } /* FIXME: stub! */ void mic_savestate(EMUFILE* os) { write32le((u32)(-1),os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return TRUE; } desmume-0.9.11/src/arm_jit.cpp0000755000000000000000000044136412467662066014715 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "types.h" #ifdef HAVE_JIT #if !defined(HOST_32) && !defined(HOST_64) #error "ERROR: JIT compiler - unsupported target platform" #endif #ifdef HOST_WINDOWS // **** Windows port #else #include #include #include #include #define HAVE_STATIC_CODE_BUFFER #endif #include "armcpu.h" #include "instructions.h" #include "instruction_attributes.h" #include "Disassembler.h" #include "MMU.h" #include "MMU_timing.h" #include "utils/AsmJit/AsmJit.h" #include "arm_jit.h" #include "bios.h" #define LOG_JIT_LEVEL 0 #define PROFILER_JIT_LEVEL 0 #if (PROFILER_JIT_LEVEL > 0) #include #endif using namespace AsmJit; #if (LOG_JIT_LEVEL > 0) #define LOG_JIT 1 #define JIT_COMMENT(...) c.comment(__VA_ARGS__) #define printJIT(buf, val) { \ JIT_COMMENT("printJIT(\""##buf"\", val);"); \ GpVar txt = c.newGpVar(kX86VarTypeGpz); \ GpVar data = c.newGpVar(kX86VarTypeGpz); \ GpVar io = c.newGpVar(kX86VarTypeGpd); \ c.lea(io, dword_ptr_abs(stdout)); \ c.lea(txt, dword_ptr_abs(&buf)); \ c.mov(data, *(GpVar*)&val); \ X86CompilerFuncCall* prn = c.call((uintptr_t)fprintf); \ prn->setPrototype(kX86FuncConvDefault, FuncBuilder3()); \ prn->setArgument(0, io); \ prn->setArgument(1, txt); \ prn->setArgument(2, data); \ X86CompilerFuncCall* prn_flush = c.call((uintptr_t)fflush); \ prn_flush->setPrototype(kX86FuncConvDefault, FuncBuilder1()); \ prn_flush->setArgument(0, io); \ } #else #define LOG_JIT 0 #define JIT_COMMENT(...) #define printJIT(buf, val) #endif u32 saveBlockSizeJIT = 0; #ifdef MAPPED_JIT_FUNCS CACHE_ALIGN JIT_struct JIT; uintptr_t *JIT_struct::JIT_MEM[2][0x4000] = {{0}}; static uintptr_t *JIT_MEM[2][32] = { //arm9 { /* 0X*/ DUP2(JIT.ARM9_ITCM), /* 1X*/ DUP2(JIT.ARM9_ITCM), // mirror /* 2X*/ DUP2(JIT.MAIN_MEM), /* 3X*/ DUP2(JIT.SWIRAM), /* 4X*/ DUP2(NULL), /* 5X*/ DUP2(NULL), /* 6X*/ NULL, JIT.ARM9_LCDC, // Plain ARM9-CPU Access (LCDC mode) (max 656KB) /* 7X*/ DUP2(NULL), /* 8X*/ DUP2(NULL), /* 9X*/ DUP2(NULL), /* AX*/ DUP2(NULL), /* BX*/ DUP2(NULL), /* CX*/ DUP2(NULL), /* DX*/ DUP2(NULL), /* EX*/ DUP2(NULL), /* FX*/ DUP2(JIT.ARM9_BIOS) }, //arm7 { /* 0X*/ DUP2(JIT.ARM7_BIOS), /* 1X*/ DUP2(NULL), /* 2X*/ DUP2(JIT.MAIN_MEM), /* 3X*/ JIT.SWIRAM, JIT.ARM7_ERAM, /* 4X*/ NULL, JIT.ARM7_WIRAM, /* 5X*/ DUP2(NULL), /* 6X*/ JIT.ARM7_WRAM, // VRAM allocated as Work RAM to ARM7 (max. 256K) NULL, /* 7X*/ DUP2(NULL), /* 8X*/ DUP2(NULL), /* 9X*/ DUP2(NULL), /* AX*/ DUP2(NULL), /* BX*/ DUP2(NULL), /* CX*/ DUP2(NULL), /* DX*/ DUP2(NULL), /* EX*/ DUP2(NULL), /* FX*/ DUP2(NULL) } }; static u32 JIT_MASK[2][32] = { //arm9 { /* 0X*/ DUP2(0x00007FFF), /* 1X*/ DUP2(0x00007FFF), /* 2X*/ DUP2(0x003FFFFF), // FIXME _MMU_MAIN_MEM_MASK /* 3X*/ DUP2(0x00007FFF), /* 4X*/ DUP2(0x00000000), /* 5X*/ DUP2(0x00000000), /* 6X*/ 0x00000000, 0x000FFFFF, /* 7X*/ DUP2(0x00000000), /* 8X*/ DUP2(0x00000000), /* 9X*/ DUP2(0x00000000), /* AX*/ DUP2(0x00000000), /* BX*/ DUP2(0x00000000), /* CX*/ DUP2(0x00000000), /* DX*/ DUP2(0x00000000), /* EX*/ DUP2(0x00000000), /* FX*/ DUP2(0x00007FFF) }, //arm7 { /* 0X*/ DUP2(0x00003FFF), /* 1X*/ DUP2(0x00000000), /* 2X*/ DUP2(0x003FFFFF), /* 3X*/ 0x00007FFF, 0x0000FFFF, /* 4X*/ 0x00000000, 0x0000FFFF, /* 5X*/ DUP2(0x00000000), /* 6X*/ 0x0003FFFF, 0x00000000, /* 7X*/ DUP2(0x00000000), /* 8X*/ DUP2(0x00000000), /* 9X*/ DUP2(0x00000000), /* AX*/ DUP2(0x00000000), /* BX*/ DUP2(0x00000000), /* CX*/ DUP2(0x00000000), /* DX*/ DUP2(0x00000000), /* EX*/ DUP2(0x00000000), /* FX*/ DUP2(0x00000000) } }; static void init_jit_mem() { static bool inited = false; if(inited) return; inited = true; for(int proc=0; proc<2; proc++) for(int i=0; i<0x4000; i++) JIT.JIT_MEM[proc][i] = JIT_MEM[proc][i>>9] + (((i<<14) & JIT_MASK[proc][i>>9]) >> 1); } #else DS_ALIGN(4096) uintptr_t compiled_funcs[1<<26] = {0}; #endif static u8 recompile_counts[(1<<26)/16]; #ifdef HAVE_STATIC_CODE_BUFFER // On x86_64, allocate jitted code from a static buffer to ensure that it's within 2GB of .text // Allows call instructions to use pcrel offsets, as opposed to slower indirect calls. // Reduces memory needed for function pointers. // FIXME win64 needs this too, x86_32 doesn't DS_ALIGN(4096) static u8 scratchpad[1<<25]; static u8 *scratchptr; struct ASMJIT_API StaticCodeGenerator : public Context { StaticCodeGenerator() { scratchptr = scratchpad; int align = (uintptr_t)scratchpad & (sysconf(_SC_PAGESIZE) - 1); int err = mprotect(scratchpad-align, sizeof(scratchpad)+align, PROT_READ|PROT_WRITE|PROT_EXEC); if(err) { fprintf(stderr, "mprotect failed: %s\n", strerror(errno)); abort(); } } uint32_t generate(void** dest, Assembler* assembler) { uintptr_t size = assembler->getCodeSize(); if(size == 0) { *dest = NULL; return kErrorNoFunction; } if(size > (uintptr_t)(scratchpad+sizeof(scratchpad)-scratchptr)) { fprintf(stderr, "Out of memory for asmjit. Clearing code cache.\n"); arm_jit_reset(1); // If arm_jit_reset didn't involve recompiling op_cmp, we could keep the current function. *dest = NULL; return kErrorOk; } void *p = scratchptr; size = assembler->relocCode(p); scratchptr += size; *dest = p; return kErrorOk; } }; static StaticCodeGenerator codegen; static X86Compiler c(&codegen); #else static X86Compiler c; #endif static void emit_branch(int cond, Label to); static void _armlog(u8 proc, u32 addr, u32 opcode); static FileLogger logger(stderr); static int PROCNUM; static int *PROCNUM_ptr = &PROCNUM; static int bb_opcodesize; static int bb_adr; static bool bb_thumb; static GpVar bb_cpu; static GpVar bb_cycles; static GpVar bb_total_cycles; static u32 bb_constant_cycles; #define cpu (&ARMPROC) #define bb_next_instruction (bb_adr + bb_opcodesize) #define bb_r15 (bb_adr + 2 * bb_opcodesize) #define cpu_ptr(x) dword_ptr(bb_cpu, offsetof(armcpu_t, x)) #define cpu_ptr_byte(x, y) byte_ptr(bb_cpu, offsetof(armcpu_t, x) + y) #define flags_ptr cpu_ptr_byte(CPSR.val, 3) #define reg_ptr(x) dword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*(x)) #define reg_pos_ptr(x) dword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x))) #define reg_pos_ptrL(x) word_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x))) #define reg_pos_ptrH(x) word_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x)) + 2) #define reg_pos_ptrB(x) byte_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x))) #define reg_pos_thumb(x) dword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*((i>>(x))&0x7)) #define reg_pos_thumbB(x) byte_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*((i>>(x))&0x7)) #define cp15_ptr(x) dword_ptr(bb_cp15, offsetof(armcp15_t, x)) #define cp15_ptr_off(x, y) dword_ptr(bb_cp15, offsetof(armcp15_t, x) + y) #define mmu_ptr(x) dword_ptr(bb_mmu, offsetof(MMU_struct, x)) #define mmu_ptr_byte(x) byte_ptr(bb_mmu, offsetof(MMU_struct, x)) #define _REG_NUM(i, n) ((i>>(n))&0x7) #ifndef ASMJIT_X64 #define r64 r32 #endif // sequencer.reschedule = true; #define changeCPSR { \ X86CompilerFuncCall* ctxCPSR = c.call((void*)NDS_Reschedule); \ ctxCPSR->setPrototype(kX86FuncConvDefault, FuncBuilder0()); \ } #if (PROFILER_JIT_LEVEL > 0) struct PROFILER_COUNTER_INFO { u64 count; char name[64]; }; struct JIT_PROFILER { JIT_PROFILER() { memset(&arm_count[0], 0, sizeof(arm_count)); memset(&thumb_count[0], 0, sizeof(thumb_count)); } u64 arm_count[4096]; u64 thumb_count[1024]; } profiler_counter[2]; static GpVar bb_profiler; #define profiler_counter_arm(opcode) qword_ptr(bb_profiler, offsetof(JIT_PROFILER, arm_count) + (INSTRUCTION_INDEX(opcode)*sizeof(u64))) #define profiler_counter_thumb(opcode) qword_ptr(bb_profiler, offsetof(JIT_PROFILER, thumb_count) + ((opcode>>6)*sizeof(u64))) #if (PROFILER_JIT_LEVEL > 1) struct PROFILER_ENTRY { u32 addr; u32 cycles; } profiler_entry[2][1<<26]; static GpVar bb_profiler_entry; #endif #endif //----------------------------------------------------------------------------- // Shifting macros //----------------------------------------------------------------------------- #define SET_NZCV(sign) { \ JIT_COMMENT("SET_NZCV"); \ GpVar x = c.newGpVar(kX86VarTypeGpd); \ GpVar y = c.newGpVar(kX86VarTypeGpd); \ c.sets(x.r8Lo()); \ c.setz(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ if (sign) { c.setnc(y.r8Lo()); } else { c.setc(y.r8Lo()); } \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ c.seto(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ c.movzx(y, flags_ptr); \ c.shl(x, 4); \ c.and_(y, 0xF); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ c.unuse(x); \ c.unuse(y); \ JIT_COMMENT("end SET_NZCV"); \ } #define SET_NZC { \ JIT_COMMENT("SET_NZC"); \ GpVar x = c.newGpVar(kX86VarTypeGpd); \ GpVar y = c.newGpVar(kX86VarTypeGpd); \ c.sets(x.r8Lo()); \ c.setz(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ if (cf_change) { c.lea(x, ptr(rcf.r64(), x.r64(), kScale2Times)); c.unuse(rcf); } \ c.movzx(y, flags_ptr); \ c.shl(x, 6 - cf_change); \ c.and_(y, cf_change?0x1F:0x3F); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_NZC"); \ } #define SET_NZC_SHIFTS_ZERO(cf) { \ JIT_COMMENT("SET_NZC_SHIFTS_ZERO"); \ c.and_(flags_ptr, 0x1F); \ if(cf) \ { \ c.shl(rcf, 5); \ c.or_(rcf, (1<<6)); \ c.or_(flags_ptr, rcf.r8Lo()); \ } \ else \ c.or_(flags_ptr, (1<<6)); \ JIT_COMMENT("end SET_NZC_SHIFTS_ZERO"); \ } #define SET_NZ(clear_cv) { \ JIT_COMMENT("SET_NZ"); \ GpVar x = c.newGpVar(kX86VarTypeGpz); \ GpVar y = c.newGpVar(kX86VarTypeGpz); \ c.sets(x.r8Lo()); \ c.setz(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ c.movzx(y, flags_ptr); \ c.and_(y, clear_cv?0x0F:0x3F); \ c.shl(x, 6); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_NZ"); \ } #define SET_N { \ JIT_COMMENT("SET_N"); \ GpVar x = c.newGpVar(kX86VarTypeGpz); \ GpVar y = c.newGpVar(kX86VarTypeGpz); \ c.sets(x.r8Lo()); \ c.movzx(y, flags_ptr); \ c.and_(y, 0x7F); \ c.shl(x, 7); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_N"); \ } #define SET_Z { \ JIT_COMMENT("SET_Z"); \ GpVar x = c.newGpVar(kX86VarTypeGpz); \ GpVar y = c.newGpVar(kX86VarTypeGpz); \ c.setz(x.r8Lo()); \ c.movzx(y, flags_ptr); \ c.and_(y, 0xBF); \ c.shl(x, 6); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_Z"); \ } #define SET_Q { \ JIT_COMMENT("SET_Q"); \ GpVar x = c.newGpVar(kX86VarTypeGpz); \ c.seto(x.r8Lo()); \ c.shl(x, 3); \ c.or_(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_Q"); \ } #define S_DST_R15 { \ JIT_COMMENT("S_DST_R15"); \ GpVar SPSR = c.newGpVar(kX86VarTypeGpd); \ GpVar tmp = c.newGpVar(kX86VarTypeGpd); \ c.mov(SPSR, cpu_ptr(SPSR.val)); \ c.mov(tmp, SPSR); \ c.and_(tmp, 0x1F); \ X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \ ctx->setPrototype(kX86FuncConvDefault, FuncBuilder2()); \ ctx->setArgument(0, bb_cpu); \ ctx->setArgument(1, tmp); \ c.mov(cpu_ptr(CPSR.val), SPSR); \ c.and_(SPSR, (1<<5)); \ c.shr(SPSR, 5); \ c.lea(tmp, ptr_abs((void*)0xFFFFFFFC, SPSR.r64(), kScale2Times)); \ c.and_(tmp, reg_ptr(15)); \ c.mov(cpu_ptr(next_instruction), tmp); \ c.unuse(tmp); \ JIT_COMMENT("end S_DST_R15"); \ } // ============================================================================================= IMM #define LSL_IMM \ JIT_COMMENT("LSL_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_ptr(0)); \ if(imm) c.shl(rhs, imm); \ u32 rhs_first = cpu->R[REG_POS(i,0)] << imm; #define S_LSL_IMM \ JIT_COMMENT("S_LSL_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 0; \ GpVar rcf; \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (imm) \ { \ cf_change = 1; \ c.shl(rhs, imm); \ rcf = c.newGpVar(kX86VarTypeGpd); \ c.setc(rcf.r8Lo()); \ } #define LSR_IMM \ JIT_COMMENT("LSR_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ if(imm) \ { \ c.mov(rhs, reg_pos_ptr(0)); \ c.shr(rhs, imm); \ } \ else \ c.mov(rhs, 0); \ u32 rhs_first = imm ? cpu->R[REG_POS(i,0)] >> imm : 0; #define S_LSR_IMM \ JIT_COMMENT("S_LSR_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) \ { \ c.test(rhs, (1 << 31)); \ c.setnz(rcf.r8Lo()); \ c.xor_(rhs, rhs); \ } \ else \ { \ c.shr(rhs, imm); \ c.setc(rcf.r8Lo()); \ } #define ASR_IMM \ JIT_COMMENT("ASR_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_ptr(0)); \ if(!imm) imm = 31; \ c.sar(rhs, imm); \ u32 rhs_first = (s32)cpu->R[REG_POS(i,0)] >> imm; #define S_ASR_IMM \ JIT_COMMENT("S_ASR_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) imm = 31; \ c.sar(rhs, imm); \ imm==31?c.sets(rcf.r8Lo()):c.setc(rcf.r8Lo()); #define ROR_IMM \ JIT_COMMENT("ROR_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) \ { \ c.bt(flags_ptr, 5); \ c.rcr(rhs, 1); \ } \ else \ c.ror(rhs, imm); \ u32 rhs_first = imm?ROR(cpu->R[REG_POS(i,0)], imm) : ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); #define S_ROR_IMM \ JIT_COMMENT("S_ROR_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) \ { \ c.bt(flags_ptr, 5); \ c.rcr(rhs, 1); \ } \ else \ c.ror(rhs, imm); \ c.setc(rcf.r8Lo()); #define REG_OFF \ JIT_COMMENT("REG_OFF"); \ bool rhs_is_imm = false; \ Mem rhs = reg_pos_ptr(0); \ u32 rhs_first = cpu->R[REG_POS(i,0)]; #define IMM_VAL \ JIT_COMMENT("IMM_VAL"); \ bool rhs_is_imm = true; \ u32 rhs = ROR((i&0xFF), (i>>7)&0x1E); \ u32 rhs_first = rhs; #define S_IMM_VAL \ JIT_COMMENT("S_IMM_VAL"); \ bool rhs_is_imm = true; \ u8 cf_change = 0; \ GpVar rcf; \ u32 rhs = ROR((i&0xFF), (i>>7)&0x1E); \ if ((i>>8)&0xF) \ { \ cf_change = 1; \ rcf = c.newGpVar(kX86VarTypeGpd); \ c.mov(rcf, BIT31(rhs)); \ } \ u32 rhs_first = rhs; #define IMM_OFF \ JIT_COMMENT("IMM_OFF"); \ bool rhs_is_imm = true; \ u32 rhs = ((i>>4)&0xF0)+(i&0xF); \ u32 rhs_first = rhs; #define IMM_OFF_12 \ JIT_COMMENT("IMM_OFF_12"); \ bool rhs_is_imm = true; \ u32 rhs = (i & 0xFFF); \ u32 rhs_first = rhs; // ============================================================================================= REG #define LSX_REG(name, x86inst, sign) \ JIT_COMMENT(#name); \ bool rhs_is_imm = false; \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ GpVar tmp = c.newGpVar(kX86VarTypeGpz); \ if(sign) c.mov(tmp, 31); \ else c.mov(tmp, 0); \ c.movzx(imm, reg_pos_ptrB(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.cmp(imm, 31); \ if(sign) c.cmovg(imm, tmp); \ else c.cmovg(rhs, tmp); \ c.x86inst(rhs, imm); \ c.unuse(tmp); #define S_LSX_REG(name, x86inst, sign) \ JIT_COMMENT(#name); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ Label __zero = c.newLabel(); \ Label __lt32 = c.newLabel(); \ Label __done = c.newLabel(); \ c.mov(imm, reg_pos_ptr(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.and_(imm, 0xFF); \ c.jz(__zero); \ c.cmp(imm, 32); \ c.jl(__lt32); \ if(!sign) \ { \ Label __eq32 = c.newLabel(); \ c.je(__eq32); \ /* imm > 32 */ \ c.mov(rhs, 0); \ c.mov(rcf, 0); \ c.jmp(__done); \ /* imm == 32 */ \ c.bind(__eq32); \ } \ c.x86inst(rhs, 31); \ c.x86inst(rhs, 1); \ c.setc(rcf.r8Lo()); \ c.jmp(__done); \ /* imm == 0 */ \ c.bind(__zero); \ c.test(flags_ptr, (1 << 5)); \ c.setnz(rcf.r8Lo()); \ c.jmp(__done); \ /* imm < 32 */ \ c.bind(__lt32); \ c.x86inst(rhs, imm); \ c.setc(rcf.r8Lo()); \ /* done */ \ c.bind(__done); #define LSL_REG LSX_REG(LSL_REG, shl, 0) #define LSR_REG LSX_REG(LSR_REG, shr, 0) #define ASR_REG LSX_REG(ASR_REG, sar, 1) #define S_LSL_REG S_LSX_REG(S_LSL_REG, shl, 0) #define S_LSR_REG S_LSX_REG(S_LSR_REG, shr, 0) #define S_ASR_REG S_LSX_REG(S_ASR_REG, sar, 1) #define ROR_REG \ JIT_COMMENT("ROR_REG"); \ bool rhs_is_imm = false; \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ c.mov(rhs, reg_pos_ptr(0)); \ c.mov(imm, reg_pos_ptrB(8)); \ c.ror(rhs, imm.r8Lo()); #define S_ROR_REG \ JIT_COMMENT("S_ROR_REG"); \ bool rhs_is_imm = false; \ bool cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ Label __zero = c.newLabel(); \ Label __zero_1F = c.newLabel(); \ Label __done = c.newLabel(); \ c.mov(imm, reg_pos_ptr(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.and_(imm, 0xFF); \ c.jz(__zero);\ c.and_(imm, 0x1F); \ c.jz(__zero_1F);\ /* imm&0x1F != 0 */ \ c.ror(rhs, imm); \ c.setc(rcf.r8Lo()); \ c.jmp(__done); \ /* imm&0x1F == 0 */ \ c.bind(__zero_1F); \ c.test(rhs, (1 << 31)); \ c.setnz(rcf.r8Lo()); \ c.jmp(__done); \ /* imm == 0 */ \ c.bind(__zero); \ c.test(flags_ptr, (1 << 5)); \ c.setnz(rcf.r8Lo()); \ /* done */ \ c.bind(__done); //==================================================================== common funcs static void emit_MMU_aluMemCycles(int alu_cycles, GpVar mem_cycles, int population) { if(PROCNUM==ARMCPU_ARM9) { if(population < alu_cycles) { GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, alu_cycles); c.cmp(mem_cycles, alu_cycles); c.cmovl(mem_cycles, x); } } else c.add(mem_cycles, alu_cycles); } //----------------------------------------------------------------------------- // OPs //----------------------------------------------------------------------------- #define OP_ARITHMETIC(arg, x86inst, symmetric, flags) \ arg; \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ if(REG_POS(i,12) == REG_POS(i,16)) \ c.x86inst(reg_pos_ptr(12), rhs); \ else if(symmetric && !rhs_is_imm) \ { \ c.x86inst(*(GpVar*)&rhs, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), rhs); \ } \ else \ { \ c.mov(lhs, reg_pos_ptr(16)); \ c.x86inst(lhs, rhs); \ c.mov(reg_pos_ptr(12), lhs); \ } \ if(flags) \ { \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ SET_NZCV(!symmetric); \ } \ else \ { \ if(REG_POS(i,12)==15) \ { \ GpVar tmp = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp, reg_ptr(15)); \ c.mov(cpu_ptr(next_instruction), tmp); \ c.add(bb_total_cycles, 2); \ } \ } \ return 1; #define OP_ARITHMETIC_R(arg, x86inst, flags) \ arg; \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, rhs); \ c.x86inst(lhs, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), lhs); \ if(flags) \ { \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ SET_NZCV(1); \ } \ else \ { \ if(REG_POS(i,12)==15) \ { \ c.mov(cpu_ptr(next_instruction), lhs); \ c.add(bb_total_cycles, 2); \ } \ } \ return 1; #define OP_ARITHMETIC_S(arg, x86inst, symmetric) \ arg; \ if(REG_POS(i,12) == REG_POS(i,16)) \ c.x86inst(reg_pos_ptr(12), rhs); \ else if(symmetric && !rhs_is_imm) \ { \ c.x86inst(*(GpVar*)&rhs, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), rhs); \ } \ else \ { \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, reg_pos_ptr(16)); \ c.x86inst(lhs, rhs); \ c.mov(reg_pos_ptr(12), lhs); \ } \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ SET_NZC; \ return 1; #define GET_CARRY(invert) { \ c.bt(flags_ptr, 5); \ if (invert) c.cmc(); } static int OP_AND_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, and_, 1, 0); } static int OP_AND_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, and_, 1, 0); } static int OP_AND_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, and_, 1, 0); } static int OP_AND_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, and_, 1, 0); } static int OP_AND_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, and_, 1, 0); } static int OP_AND_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, and_, 1, 0); } static int OP_AND_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, and_, 1, 0); } static int OP_AND_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, and_, 1, 0); } static int OP_AND_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, and_, 1, 0); } static int OP_EOR_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, xor_, 1, 0); } static int OP_EOR_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, xor_, 1, 0); } static int OP_EOR_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, xor_, 1, 0); } static int OP_EOR_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, xor_, 1, 0); } static int OP_EOR_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, xor_, 1, 0); } static int OP_EOR_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, xor_, 1, 0); } static int OP_EOR_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, xor_, 1, 0); } static int OP_EOR_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, xor_, 1, 0); } static int OP_EOR_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, xor_, 1, 0); } static int OP_ORR_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, or_, 1, 0); } static int OP_ORR_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, or_, 1, 0); } static int OP_ORR_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, or_, 1, 0); } static int OP_ORR_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, or_, 1, 0); } static int OP_ORR_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, or_, 1, 0); } static int OP_ORR_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, or_, 1, 0); } static int OP_ORR_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, or_, 1, 0); } static int OP_ORR_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, or_, 1, 0); } static int OP_ORR_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, or_, 1, 0); } static int OP_ADD_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, add, 1, 0); } static int OP_ADD_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, add, 1, 0); } static int OP_ADD_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, add, 1, 0); } static int OP_ADD_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, add, 1, 0); } static int OP_ADD_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, add, 1, 0); } static int OP_ADD_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, add, 1, 0); } static int OP_ADD_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, add, 1, 0); } static int OP_ADD_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, add, 1, 0); } static int OP_ADD_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, add, 1, 0); } static int OP_SUB_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, sub, 0, 0); } static int OP_SUB_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, sub, 0, 0); } static int OP_SUB_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, sub, 0, 0); } static int OP_SUB_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, sub, 0, 0); } static int OP_SUB_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, sub, 0, 0); } static int OP_SUB_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, sub, 0, 0); } static int OP_SUB_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, sub, 0, 0); } static int OP_SUB_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, sub, 0, 0); } static int OP_SUB_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, sub, 0, 0); } static int OP_RSB_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM, sub, 0); } static int OP_RSB_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG, sub, 0); } static int OP_RSB_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM, sub, 0); } static int OP_RSB_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG, sub, 0); } static int OP_RSB_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM, sub, 0); } static int OP_RSB_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG, sub, 0); } static int OP_RSB_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM, sub, 0); } static int OP_RSB_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG, sub, 0); } static int OP_RSB_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL, sub, 0); } // ================================ S instructions static int OP_AND_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, and_, 1); } static int OP_AND_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, and_, 1); } static int OP_AND_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, and_, 1); } static int OP_AND_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, and_, 1); } static int OP_AND_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, and_, 1); } static int OP_AND_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, and_, 1); } static int OP_AND_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, and_, 1); } static int OP_AND_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, and_, 1); } static int OP_AND_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, and_, 1); } static int OP_EOR_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, xor_, 1); } static int OP_EOR_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, xor_, 1); } static int OP_EOR_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, xor_, 1); } static int OP_EOR_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, xor_, 1); } static int OP_EOR_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, xor_, 1); } static int OP_EOR_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, xor_, 1); } static int OP_EOR_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, xor_, 1); } static int OP_EOR_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, xor_, 1); } static int OP_EOR_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, xor_, 1); } static int OP_ORR_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, or_, 1); } static int OP_ORR_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, or_, 1); } static int OP_ORR_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, or_, 1); } static int OP_ORR_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, or_, 1); } static int OP_ORR_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, or_, 1); } static int OP_ORR_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, or_, 1); } static int OP_ORR_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, or_, 1); } static int OP_ORR_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, or_, 1); } static int OP_ORR_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, or_, 1); } static int OP_ADD_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, add, 1, 1); } static int OP_ADD_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, add, 1, 1); } static int OP_ADD_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, add, 1, 1); } static int OP_ADD_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, add, 1, 1); } static int OP_ADD_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, add, 1, 1); } static int OP_ADD_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, add, 1, 1); } static int OP_ADD_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, add, 1, 1); } static int OP_ADD_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, add, 1, 1); } static int OP_ADD_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, add, 1, 1); } static int OP_SUB_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, sub, 0, 1); } static int OP_SUB_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, sub, 0, 1); } static int OP_SUB_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, sub, 0, 1); } static int OP_SUB_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, sub, 0, 1); } static int OP_SUB_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, sub, 0, 1); } static int OP_SUB_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, sub, 0, 1); } static int OP_SUB_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, sub, 0, 1); } static int OP_SUB_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, sub, 0, 1); } static int OP_SUB_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, sub, 0, 1); } static int OP_RSB_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM, sub, 1); } static int OP_RSB_S_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG, sub, 1); } static int OP_RSB_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM, sub, 1); } static int OP_RSB_S_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG, sub, 1); } static int OP_RSB_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM, sub, 1); } static int OP_RSB_S_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG, sub, 1); } static int OP_RSB_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM, sub, 1); } static int OP_RSB_S_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG, sub, 1); } static int OP_RSB_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL, sub, 1); } static int OP_ADC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(0), adc, 1, 1); } static int OP_SBC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(1), sbb, 0, 1); } static int OP_RSC_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL; GET_CARRY(1), sbb, 0); } static int OP_RSC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL; GET_CARRY(1), sbb, 1); } static int OP_BIC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; rhs = ~rhs, and_, 1, 0); } static int OP_BIC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL; rhs = ~rhs, and_, 1); } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- #define OP_TST_(arg) \ arg; \ c.test(reg_pos_ptr(16), rhs); \ SET_NZC; \ return 1; static int OP_TST_LSL_IMM(const u32 i) { OP_TST_(S_LSL_IMM); } static int OP_TST_LSL_REG(const u32 i) { OP_TST_(S_LSL_REG); } static int OP_TST_LSR_IMM(const u32 i) { OP_TST_(S_LSR_IMM); } static int OP_TST_LSR_REG(const u32 i) { OP_TST_(S_LSR_REG); } static int OP_TST_ASR_IMM(const u32 i) { OP_TST_(S_ASR_IMM); } static int OP_TST_ASR_REG(const u32 i) { OP_TST_(S_ASR_REG); } static int OP_TST_ROR_IMM(const u32 i) { OP_TST_(S_ROR_IMM); } static int OP_TST_ROR_REG(const u32 i) { OP_TST_(S_ROR_REG); } static int OP_TST_IMM_VAL(const u32 i) { OP_TST_(S_IMM_VAL); } //----------------------------------------------------------------------------- // TEQ //----------------------------------------------------------------------------- #define OP_TEQ_(arg) \ arg; \ if (!rhs_is_imm) \ c.xor_(*(GpVar*)&rhs, reg_pos_ptr(16)); \ else \ { \ GpVar x = c.newGpVar(kX86VarTypeGpd); \ c.mov(x, rhs); \ c.xor_(x, reg_pos_ptr(16)); \ } \ SET_NZC; \ return 1; static int OP_TEQ_LSL_IMM(const u32 i) { OP_TEQ_(S_LSL_IMM); } static int OP_TEQ_LSL_REG(const u32 i) { OP_TEQ_(S_LSL_REG); } static int OP_TEQ_LSR_IMM(const u32 i) { OP_TEQ_(S_LSR_IMM); } static int OP_TEQ_LSR_REG(const u32 i) { OP_TEQ_(S_LSR_REG); } static int OP_TEQ_ASR_IMM(const u32 i) { OP_TEQ_(S_ASR_IMM); } static int OP_TEQ_ASR_REG(const u32 i) { OP_TEQ_(S_ASR_REG); } static int OP_TEQ_ROR_IMM(const u32 i) { OP_TEQ_(S_ROR_IMM); } static int OP_TEQ_ROR_REG(const u32 i) { OP_TEQ_(S_ROR_REG); } static int OP_TEQ_IMM_VAL(const u32 i) { OP_TEQ_(S_IMM_VAL); } //----------------------------------------------------------------------------- // CMP //----------------------------------------------------------------------------- #define OP_CMP(arg) \ arg; \ c.cmp(reg_pos_ptr(16), rhs); \ SET_NZCV(1); \ return 1; static int OP_CMP_LSL_IMM(const u32 i) { OP_CMP(LSL_IMM); } static int OP_CMP_LSL_REG(const u32 i) { OP_CMP(LSL_REG); } static int OP_CMP_LSR_IMM(const u32 i) { OP_CMP(LSR_IMM); } static int OP_CMP_LSR_REG(const u32 i) { OP_CMP(LSR_REG); } static int OP_CMP_ASR_IMM(const u32 i) { OP_CMP(ASR_IMM); } static int OP_CMP_ASR_REG(const u32 i) { OP_CMP(ASR_REG); } static int OP_CMP_ROR_IMM(const u32 i) { OP_CMP(ROR_IMM); } static int OP_CMP_ROR_REG(const u32 i) { OP_CMP(ROR_REG); } static int OP_CMP_IMM_VAL(const u32 i) { OP_CMP(IMM_VAL); } #undef OP_CMP //----------------------------------------------------------------------------- // CMN //----------------------------------------------------------------------------- #define OP_CMN(arg) \ arg; \ u32 rhs_imm = *(u32*)&rhs; \ int sign = rhs_is_imm && (rhs_imm != -rhs_imm); \ if(sign) \ c.cmp(reg_pos_ptr(16), -rhs_imm); \ else \ { \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, reg_pos_ptr(16)); \ c.add(lhs, rhs); \ } \ SET_NZCV(sign); \ return 1; static int OP_CMN_LSL_IMM(const u32 i) { OP_CMN(LSL_IMM); } static int OP_CMN_LSL_REG(const u32 i) { OP_CMN(LSL_REG); } static int OP_CMN_LSR_IMM(const u32 i) { OP_CMN(LSR_IMM); } static int OP_CMN_LSR_REG(const u32 i) { OP_CMN(LSR_REG); } static int OP_CMN_ASR_IMM(const u32 i) { OP_CMN(ASR_IMM); } static int OP_CMN_ASR_REG(const u32 i) { OP_CMN(ASR_REG); } static int OP_CMN_ROR_IMM(const u32 i) { OP_CMN(ROR_IMM); } static int OP_CMN_ROR_REG(const u32 i) { OP_CMN(ROR_REG); } static int OP_CMN_IMM_VAL(const u32 i) { OP_CMN(IMM_VAL); } #undef OP_CMN //----------------------------------------------------------------------------- // MOV //----------------------------------------------------------------------------- #define OP_MOV(arg) \ arg; \ c.mov(reg_pos_ptr(12), rhs); \ if(REG_POS(i,12)==15) \ { \ c.mov(cpu_ptr(next_instruction), rhs); \ return 1; \ } \ return 1; static int OP_MOV_LSL_IMM(const u32 i) { if (i == 0xE1A00000) { /* nop */ JIT_COMMENT("nop"); return 1; } OP_MOV(LSL_IMM); } static int OP_MOV_LSL_REG(const u32 i) { OP_MOV(LSL_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_LSR_IMM(const u32 i) { OP_MOV(LSR_IMM); } static int OP_MOV_LSR_REG(const u32 i) { OP_MOV(LSR_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_ASR_IMM(const u32 i) { OP_MOV(ASR_IMM); } static int OP_MOV_ASR_REG(const u32 i) { OP_MOV(ASR_REG); } static int OP_MOV_ROR_IMM(const u32 i) { OP_MOV(ROR_IMM); } static int OP_MOV_ROR_REG(const u32 i) { OP_MOV(ROR_REG); } static int OP_MOV_IMM_VAL(const u32 i) { OP_MOV(IMM_VAL); } #define OP_MOV_S(arg) \ arg; \ c.mov(reg_pos_ptr(12), rhs); \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ if(!rhs_is_imm) \ c.cmp(*(GpVar*)&rhs, 0); \ else \ c.cmp(reg_pos_ptr(12), 0); \ SET_NZC; \ return 1; static int OP_MOV_S_LSL_IMM(const u32 i) { OP_MOV_S(S_LSL_IMM); } static int OP_MOV_S_LSL_REG(const u32 i) { OP_MOV_S(S_LSL_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_S_LSR_IMM(const u32 i) { OP_MOV_S(S_LSR_IMM); } static int OP_MOV_S_LSR_REG(const u32 i) { OP_MOV_S(S_LSR_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_S_ASR_IMM(const u32 i) { OP_MOV_S(S_ASR_IMM); } static int OP_MOV_S_ASR_REG(const u32 i) { OP_MOV_S(S_ASR_REG); } static int OP_MOV_S_ROR_IMM(const u32 i) { OP_MOV_S(S_ROR_IMM); } static int OP_MOV_S_ROR_REG(const u32 i) { OP_MOV_S(S_ROR_REG); } static int OP_MOV_S_IMM_VAL(const u32 i) { OP_MOV_S(S_IMM_VAL); } //----------------------------------------------------------------------------- // MVN //----------------------------------------------------------------------------- static int OP_MVN_LSL_IMM(const u32 i) { OP_MOV(LSL_IMM; c.not_(rhs)); } static int OP_MVN_LSL_REG(const u32 i) { OP_MOV(LSL_REG; c.not_(rhs)); } static int OP_MVN_LSR_IMM(const u32 i) { OP_MOV(LSR_IMM; c.not_(rhs)); } static int OP_MVN_LSR_REG(const u32 i) { OP_MOV(LSR_REG; c.not_(rhs)); } static int OP_MVN_ASR_IMM(const u32 i) { OP_MOV(ASR_IMM; c.not_(rhs)); } static int OP_MVN_ASR_REG(const u32 i) { OP_MOV(ASR_REG; c.not_(rhs)); } static int OP_MVN_ROR_IMM(const u32 i) { OP_MOV(ROR_IMM; c.not_(rhs)); } static int OP_MVN_ROR_REG(const u32 i) { OP_MOV(ROR_REG; c.not_(rhs)); } static int OP_MVN_IMM_VAL(const u32 i) { OP_MOV(IMM_VAL; rhs = ~rhs); } static int OP_MVN_S_LSL_IMM(const u32 i) { OP_MOV_S(S_LSL_IMM; c.not_(rhs)); } static int OP_MVN_S_LSL_REG(const u32 i) { OP_MOV_S(S_LSL_REG; c.not_(rhs)); } static int OP_MVN_S_LSR_IMM(const u32 i) { OP_MOV_S(S_LSR_IMM; c.not_(rhs)); } static int OP_MVN_S_LSR_REG(const u32 i) { OP_MOV_S(S_LSR_REG; c.not_(rhs)); } static int OP_MVN_S_ASR_IMM(const u32 i) { OP_MOV_S(S_ASR_IMM; c.not_(rhs)); } static int OP_MVN_S_ASR_REG(const u32 i) { OP_MOV_S(S_ASR_REG; c.not_(rhs)); } static int OP_MVN_S_ROR_IMM(const u32 i) { OP_MOV_S(S_ROR_IMM; c.not_(rhs)); } static int OP_MVN_S_ROR_REG(const u32 i) { OP_MOV_S(S_ROR_REG; c.not_(rhs)); } static int OP_MVN_S_IMM_VAL(const u32 i) { OP_MOV_S(S_IMM_VAL; rhs = ~rhs); } //----------------------------------------------------------------------------- // QADD / QDADD / QSUB / QDSUB //----------------------------------------------------------------------------- // TODO static int OP_QADD(const u32 i) { printf("JIT: unimplemented OP_QADD\n"); return 0; } static int OP_QSUB(const u32 i) { printf("JIT: unimplemented OP_QSUB\n"); return 0; } static int OP_QDADD(const u32 i) { printf("JIT: unimplemented OP_QDADD\n"); return 0; } static int OP_QDSUB(const u32 i) { printf("JIT: unimplemented OP_QDSUB\n"); return 0; } //----------------------------------------------------------------------------- // MUL //----------------------------------------------------------------------------- static void MUL_Mxx_END(GpVar x, bool sign, int cycles) { if(sign) { GpVar y = c.newGpVar(kX86VarTypeGpd); c.mov(y, x); c.sar(x, 31); c.xor_(x, y); } c.or_(x, 1); c.bsr(bb_cycles, x); c.shr(bb_cycles, 3); c.add(bb_cycles, cycles+1); } #define OP_MUL_(op, width, sign, accum, flags) \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar hi; \ if (width) \ { \ hi = c.newGpVar(kX86VarTypeGpd); \ c.xor_(hi, hi); \ } \ c.mov(lhs, reg_pos_ptr(0)); \ c.mov(rhs, reg_pos_ptr(8)); \ op; \ if(width && accum) \ { \ if(flags) \ { \ c.add(lhs, reg_pos_ptr(12)); \ c.adc(hi, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ c.or_(lhs, hi); SET_Z; \ c.and_(hi, (1 << 31)); SET_N; \ } \ else \ { \ c.add(reg_pos_ptr(12), lhs); \ c.adc(reg_pos_ptr(16), hi); \ } \ } \ else if(width) \ { \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ if(flags) { c.cmp(hi, lhs); SET_NZ(0); } \ } \ else \ { \ if(accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs); \ if(flags) { c.cmp(lhs, 0); SET_NZ(0); }\ } \ MUL_Mxx_END(rhs, sign, 1+width+accum); \ return 1; static int OP_MUL(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 0, 0); } static int OP_MLA(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 1, 0); } static int OP_UMULL(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 0, 0); } static int OP_UMLAL(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 1, 0); } static int OP_SMULL(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 0, 0); } static int OP_SMLAL(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 1, 0); } static int OP_MUL_S(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 0, 1); } static int OP_MLA_S(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 1, 1); } static int OP_UMULL_S(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 0, 1); } static int OP_UMLAL_S(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 1, 1); } static int OP_SMULL_S(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 0, 1); } static int OP_SMLAL_S(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 1, 1); } #define OP_MULxy_(op, x, y, width, accum, flags) \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar hi; \ c.movsx(lhs, reg_pos_ptr##x(0)); \ c.movsx(rhs, reg_pos_ptr##y(8)); \ if (width) \ { \ hi = c.newGpVar(kX86VarTypeGpd); \ } \ op; \ if(width && accum) \ { \ if(flags) \ { \ c.add(lhs, reg_pos_ptr(12)); \ c.adc(hi, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ SET_Q; \ } \ else \ { \ c.add(reg_pos_ptr(12), lhs); \ c.adc(reg_pos_ptr(16), hi); \ } \ } \ else \ if(width) \ { \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ if(flags) { SET_Q; }\ } \ else \ { \ if (accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs); \ if(flags) { SET_Q; }\ } \ return 1; //----------------------------------------------------------------------------- // SMUL //----------------------------------------------------------------------------- static int OP_SMUL_B_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, L, 0, 0, 0); } static int OP_SMUL_B_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, H, 0, 0, 0); } static int OP_SMUL_T_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, L, 0, 0, 0); } static int OP_SMUL_T_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, H, 0, 0, 0); } //----------------------------------------------------------------------------- // SMLA //----------------------------------------------------------------------------- static int OP_SMLA_B_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, L, 0, 1, 1); } static int OP_SMLA_B_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, H, 0, 1, 1); } static int OP_SMLA_T_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, L, 0, 1, 1); } static int OP_SMLA_T_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, H, 0, 1, 1); } //----------------------------------------------------------------------------- // SMLAL //----------------------------------------------------------------------------- static int OP_SMLAL_B_B(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), L, L, 1, 1, 1); } static int OP_SMLAL_B_T(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), L, H, 1, 1, 1); } static int OP_SMLAL_T_B(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), H, L, 1, 1, 1); } static int OP_SMLAL_T_T(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), H, H, 1, 1, 1); } //----------------------------------------------------------------------------- // SMULW / SMLAW //----------------------------------------------------------------------------- #ifdef ASMJIT_X64 #define OP_SMxxW_(x, accum, flags) \ GpVar lhs = c.newGpVar(kX86VarTypeGpz); \ GpVar rhs = c.newGpVar(kX86VarTypeGpz); \ c.movsx(lhs, reg_pos_ptr##x(8)); \ c.movsxd(rhs, reg_pos_ptr(0)); \ c.imul(lhs, rhs); \ c.sar(lhs, 16); \ if (accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs.r32()); \ if (flags) { SET_Q; } \ return 1; #else #define OP_SMxxW_(x, accum, flags) \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ GpVar hi = c.newGpVar(kX86VarTypeGpd); \ c.xor_(hi, hi); \ c.movsx(lhs, reg_pos_ptr##x(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.imul(hi, lhs, rhs); \ c.mov(lhs.r16(), hi.r16()); \ c.ror(lhs, 16); \ if (accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs); \ if (flags) { SET_Q; } \ return 1; #endif static int OP_SMULW_B(const u32 i) { OP_SMxxW_(L, 0, 0); } static int OP_SMULW_T(const u32 i) { OP_SMxxW_(H, 0, 0); } static int OP_SMLAW_B(const u32 i) { OP_SMxxW_(L, 1, 1); } static int OP_SMLAW_T(const u32 i) { OP_SMxxW_(H, 1, 1); } //----------------------------------------------------------------------------- // MRS / MSR //----------------------------------------------------------------------------- static int OP_MRS_CPSR(const u32 i) { GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, cpu_ptr(CPSR)); c.mov(reg_pos_ptr(12), x); return 1; } static int OP_MRS_SPSR(const u32 i) { GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, cpu_ptr(SPSR)); c.mov(reg_pos_ptr(12), x); return 1; } // TODO: SPSR: if(cpu->CPSR.bits.mode == USR || cpu->CPSR.bits.mode == SYS) return 1; #define OP_MSR_(reg, args, sw) \ GpVar operand = c.newGpVar(kX86VarTypeGpd); \ args; \ c.mov(operand, rhs); \ switch (((i>>16) & 0xF)) \ { \ case 0x1: /* bit 16 */ \ { \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __skip = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__skip); \ if (sw) \ { \ c.mov(mode, rhs); \ c.and_(mode, 0x1F); \ X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \ ctx->setPrototype(kX86FuncConvDefault, FuncBuilder2()); \ ctx->setArgument(0, bb_cpu); \ ctx->setArgument(1, mode); \ } \ Mem xPSR_memB = cpu_ptr_byte(reg, 0); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ c.bind(__skip); \ } \ return 1; \ case 0x2: /* bit 17 */ \ { \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __skip = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__skip); \ Mem xPSR_memB = cpu_ptr_byte(reg, 1); \ c.shr(operand, 8); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ c.bind(__skip); \ } \ return 1; \ case 0x4: /* bit 18 */ \ { \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __skip = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__skip); \ Mem xPSR_memB = cpu_ptr_byte(reg, 2); \ c.shr(operand, 16); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ c.bind(__skip); \ } \ return 1; \ case 0x8: /* bit 19 */ \ { \ Mem xPSR_memB = cpu_ptr_byte(reg, 3); \ c.shr(operand, 24); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ } \ return 1; \ default: \ break; \ } \ \ static u32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) | \ (BIT17(i)?0x0000FF00:0x00000000) | \ (BIT18(i)?0x00FF0000:0x00000000) | \ (BIT19(i)?0xFF000000:0x00000000); \ static u32 byte_mask_USR = (BIT19(i)?0xFF000000:0x00000000); \ \ Mem xPSR_mem = cpu_ptr(reg.val); \ GpVar xPSR = c.newGpVar(kX86VarTypeGpd); \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __USR = c.newLabel(); \ Label __done = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR.val)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__USR); \ /* mode != USR */ \ if (sw && BIT16(i)) \ { \ /* armcpu_switchMode */ \ c.mov(mode, rhs); \ c.and_(mode, 0x1F); \ X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \ ctx->setPrototype(kX86FuncConvDefault, FuncBuilder2()); \ ctx->setArgument(0, bb_cpu); \ ctx->setArgument(1, mode); \ } \ /* cpu->CPSR.val = (cpu->CPSR.val & ~byte_mask) | (operand & byte_mask); */ \ c.mov(xPSR, xPSR_mem); \ c.and_(operand, byte_mask); \ c.and_(xPSR, ~byte_mask); \ c.or_(xPSR, operand); \ c.mov(xPSR_mem, xPSR); \ c.jmp(__done); \ /* mode == USR */ \ c.bind(__USR); \ c.mov(xPSR, xPSR_mem); \ c.and_(operand, byte_mask_USR); \ c.and_(xPSR, ~byte_mask_USR); \ c.or_(xPSR, operand); \ c.mov(xPSR_mem, xPSR); \ c.bind(__done); \ changeCPSR; \ return 1; static int OP_MSR_CPSR(const u32 i) { OP_MSR_(CPSR, REG_OFF, 1); } static int OP_MSR_SPSR(const u32 i) { OP_MSR_(SPSR, REG_OFF, 0); } static int OP_MSR_CPSR_IMM_VAL(const u32 i) { OP_MSR_(CPSR, IMM_VAL, 1); } static int OP_MSR_SPSR_IMM_VAL(const u32 i) { OP_MSR_(SPSR, IMM_VAL, 0); } //----------------------------------------------------------------------------- // LDR //----------------------------------------------------------------------------- typedef u32 (FASTCALL* OpLDR)(u32, u32*); // 98% of all memory accesses land in the same region as the first execution of // that instruction, so keep multiple copies with different fastpaths. // The copies don't need to differ in any way; the point is merely to cooperate // with x86 branch prediction. enum { MEMTYPE_GENERIC = 0, // no assumptions MEMTYPE_MAIN = 1, MEMTYPE_DTCM = 2, MEMTYPE_ERAM = 3, MEMTYPE_SWIRAM = 4, MEMTYPE_OTHER = 5, // memory that is known to not be MAIN, DTCM, ERAM, or SWIRAM }; static u32 classify_adr(u32 adr, bool store) { if(PROCNUM==ARMCPU_ARM9 && (adr & ~0x3FFF) == MMU.DTCMRegion) return MEMTYPE_DTCM; else if((adr & 0x0F000000) == 0x02000000) return MEMTYPE_MAIN; else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03800000) return MEMTYPE_ERAM; else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03000000) return MEMTYPE_SWIRAM; else return MEMTYPE_GENERIC; } template static u32 FASTCALL OP_LDR(u32 adr, u32 *dstreg) { u32 data = READ32(cpu->mem_if->data, adr); if(adr&3) data = ROR(data, 8*(adr&3)); *dstreg = data; return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRH(u32 adr, u32 *dstreg) { *dstreg = READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRSH(u32 adr, u32 *dstreg) { *dstreg = (s16)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRB(u32 adr, u32 *dstreg) { *dstreg = READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRSB(u32 adr, u32 *dstreg) { *dstreg = (s8)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } #define T(op) op<0,0>, op<0,1>, op<0,2>, NULL, NULL, op<1,0>, op<1,1>, NULL, op<1,3>, op<1,4> static const OpLDR LDR_tab[2][5] = { T(OP_LDR) }; static const OpLDR LDRH_tab[2][5] = { T(OP_LDRH) }; static const OpLDR LDRSH_tab[2][5] = { T(OP_LDRSH) }; static const OpLDR LDRB_tab[2][5] = { T(OP_LDRB) }; static const OpLDR LDRSB_tab[2][5] = { T(OP_LDRSB) }; #undef T static u32 add(u32 lhs, u32 rhs) { return lhs + rhs; } static u32 sub(u32 lhs, u32 rhs) { return lhs - rhs; } #define OP_LDR_(mem_op, arg, sign_op, writeback) \ GpVar adr = c.newGpVar(kX86VarTypeGpd); \ GpVar dst = c.newGpVar(kX86VarTypeGpz); \ c.mov(adr, reg_pos_ptr(16)); \ c.lea(dst, reg_pos_ptr(12)); \ arg; \ if(!rhs_is_imm || *(u32*)&rhs) \ { \ if(writeback == 0) \ c.sign_op(adr, rhs); \ else if(writeback < 0) \ { \ c.sign_op(adr, rhs); \ c.mov(reg_pos_ptr(16), adr); \ } \ else if(writeback > 0) \ { \ GpVar tmp_reg = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp_reg, adr); \ c.sign_op(tmp_reg, rhs); \ c.mov(reg_pos_ptr(16), tmp_reg); \ } \ } \ u32 adr_first = sign_op(cpu->R[REG_POS(i,16)], rhs_first); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,0)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, adr); \ ctx->setArgument(1, dst); \ ctx->setReturn(bb_cycles); \ if(REG_POS(i,12)==15) \ { \ GpVar tmp = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp, reg_ptr(15)); \ if (PROCNUM == 0) \ { \ GpVar thumb = c.newGpVar(kX86VarTypeGpz); \ c.mov(thumb, tmp); \ c.and_(thumb, 1); \ c.shl(thumb, 5); \ c.or_(cpu_ptr(CPSR), thumb.r64()); \ c.and_(tmp, 0xFFFFFFFE); \ } \ else \ { \ c.and_(tmp, 0xFFFFFFFC); \ } \ c.mov(cpu_ptr(next_instruction), tmp); \ } \ return 1; // LDR static int OP_LDR_P_IMM_OFF(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, 0); } static int OP_LDR_M_IMM_OFF(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, 0); } static int OP_LDR_P_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, 0); } static int OP_LDR_M_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, 0); } static int OP_LDR_P_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, 0); } static int OP_LDR_M_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, 0); } static int OP_LDR_P_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, 0); } static int OP_LDR_M_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, 0); } static int OP_LDR_P_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, 0); } static int OP_LDR_M_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, 0); } static int OP_LDR_P_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, -1); } static int OP_LDR_M_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, -1); } static int OP_LDR_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, -1); } static int OP_LDR_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, -1); } static int OP_LDR_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, -1); } static int OP_LDR_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, -1); } static int OP_LDR_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, -1); } static int OP_LDR_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, -1); } static int OP_LDR_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, -1); } static int OP_LDR_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, -1); } static int OP_LDR_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, 1); } static int OP_LDR_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, 1); } static int OP_LDR_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, 1); } static int OP_LDR_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, 1); } static int OP_LDR_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, 1); } static int OP_LDR_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, 1); } static int OP_LDR_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, 1); } static int OP_LDR_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, 1); } static int OP_LDR_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, 1); } static int OP_LDR_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, 1); } // LDRH static int OP_LDRH_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, 0); } static int OP_LDRH_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, 0); } static int OP_LDRH_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, 0); } static int OP_LDRH_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, 0); } static int OP_LDRH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, -1); } static int OP_LDRH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, -1); } static int OP_LDRH_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, -1); } static int OP_LDRH_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, -1); } static int OP_LDRH_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, 1); } static int OP_LDRH_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, 1); } static int OP_LDRH_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, 1); } static int OP_LDRH_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, 1); } // LDRSH static int OP_LDRSH_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, 0); } static int OP_LDRSH_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, 0); } static int OP_LDRSH_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, 0); } static int OP_LDRSH_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, 0); } static int OP_LDRSH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, -1); } static int OP_LDRSH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, -1); } static int OP_LDRSH_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, -1); } static int OP_LDRSH_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, -1); } static int OP_LDRSH_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, 1); } static int OP_LDRSH_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, 1); } static int OP_LDRSH_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, 1); } static int OP_LDRSH_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, 1); } // LDRB static int OP_LDRB_P_IMM_OFF(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, 0); } static int OP_LDRB_M_IMM_OFF(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, 0); } static int OP_LDRB_P_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, 0); } static int OP_LDRB_M_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, 0); } static int OP_LDRB_P_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, 0); } static int OP_LDRB_M_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, 0); } static int OP_LDRB_P_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, 0); } static int OP_LDRB_M_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, 0); } static int OP_LDRB_P_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, 0); } static int OP_LDRB_M_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, 0); } static int OP_LDRB_P_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, -1); } static int OP_LDRB_M_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, -1); } static int OP_LDRB_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, -1); } static int OP_LDRB_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, -1); } static int OP_LDRB_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, -1); } static int OP_LDRB_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, -1); } static int OP_LDRB_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, -1); } static int OP_LDRB_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, -1); } static int OP_LDRB_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, -1); } static int OP_LDRB_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, -1); } static int OP_LDRB_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, 1); } static int OP_LDRB_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, 1); } static int OP_LDRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, 1); } static int OP_LDRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, 1); } static int OP_LDRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, 1); } static int OP_LDRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, 1); } static int OP_LDRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, 1); } static int OP_LDRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, 1); } static int OP_LDRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, 1); } static int OP_LDRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, 1); } // LDRSB static int OP_LDRSB_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, 0); } static int OP_LDRSB_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, 0); } static int OP_LDRSB_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, 0); } static int OP_LDRSB_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, 0); } static int OP_LDRSB_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, -1); } static int OP_LDRSB_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, -1); } static int OP_LDRSB_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, -1); } static int OP_LDRSB_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, -1); } static int OP_LDRSB_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, 1); } static int OP_LDRSB_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, 1); } static int OP_LDRSB_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, 1); } static int OP_LDRSB_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, 1); } //----------------------------------------------------------------------------- // STR //----------------------------------------------------------------------------- template static u32 FASTCALL OP_STR(u32 adr, u32 data) { WRITE32(cpu->mem_if->data, adr, data); return MMU_aluMemAccessCycles(2,adr); } template static u32 FASTCALL OP_STRH(u32 adr, u32 data) { WRITE16(cpu->mem_if->data, adr, data); return MMU_aluMemAccessCycles(2,adr); } template static u32 FASTCALL OP_STRB(u32 adr, u32 data) { WRITE8(cpu->mem_if->data, adr, data); return MMU_aluMemAccessCycles(2,adr); } typedef u32 (FASTCALL* OpSTR)(u32, u32); #define T(op) op<0,0>, op<0,1>, op<0,2>, op<1,0>, op<1,1>, NULL static const OpSTR STR_tab[2][3] = { T(OP_STR) }; static const OpSTR STRH_tab[2][3] = { T(OP_STRH) }; static const OpSTR STRB_tab[2][3] = { T(OP_STRB) }; #undef T #define OP_STR_(mem_op, arg, sign_op, writeback) \ GpVar adr = c.newGpVar(kX86VarTypeGpd); \ GpVar data = c.newGpVar(kX86VarTypeGpd); \ c.mov(adr, reg_pos_ptr(16)); \ c.mov(data, reg_pos_ptr(12)); \ arg; \ if(!rhs_is_imm || *(u32*)&rhs) \ { \ if(writeback == 0) \ c.sign_op(adr, rhs); \ else if(writeback < 0) \ { \ c.sign_op(adr, rhs); \ c.mov(reg_pos_ptr(16), adr); \ } \ else if(writeback > 0) \ { \ GpVar tmp_reg = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp_reg, adr); \ c.sign_op(tmp_reg, rhs); \ c.mov(reg_pos_ptr(16), tmp_reg); \ } \ } \ u32 adr_first = sign_op(cpu->R[REG_POS(i,16)], rhs_first); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,1)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, adr); \ ctx->setArgument(1, data); \ ctx->setReturn(bb_cycles); \ return 1; static int OP_STR_P_IMM_OFF(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, 0); } static int OP_STR_M_IMM_OFF(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, 0); } static int OP_STR_P_LSL_IMM_OFF(const u32 i) { OP_STR_(STR, LSL_IMM, add, 0); } static int OP_STR_M_LSL_IMM_OFF(const u32 i) { OP_STR_(STR, LSL_IMM, sub, 0); } static int OP_STR_P_LSR_IMM_OFF(const u32 i) { OP_STR_(STR, LSR_IMM, add, 0); } static int OP_STR_M_LSR_IMM_OFF(const u32 i) { OP_STR_(STR, LSR_IMM, sub, 0); } static int OP_STR_P_ASR_IMM_OFF(const u32 i) { OP_STR_(STR, ASR_IMM, add, 0); } static int OP_STR_M_ASR_IMM_OFF(const u32 i) { OP_STR_(STR, ASR_IMM, sub, 0); } static int OP_STR_P_ROR_IMM_OFF(const u32 i) { OP_STR_(STR, ROR_IMM, add, 0); } static int OP_STR_M_ROR_IMM_OFF(const u32 i) { OP_STR_(STR, ROR_IMM, sub, 0); } static int OP_STR_P_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, -1); } static int OP_STR_M_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, -1); } static int OP_STR_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSL_IMM, add, -1); } static int OP_STR_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSL_IMM, sub, -1); } static int OP_STR_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSR_IMM, add, -1); } static int OP_STR_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSR_IMM, sub, -1); } static int OP_STR_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ASR_IMM, add, -1); } static int OP_STR_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ASR_IMM, sub, -1); } static int OP_STR_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ROR_IMM, add, -1); } static int OP_STR_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ROR_IMM, sub, -1); } static int OP_STR_P_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, 1); } static int OP_STR_M_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, 1); } static int OP_STR_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSL_IMM, add, 1); } static int OP_STR_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSL_IMM, sub, 1); } static int OP_STR_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSR_IMM, add, 1); } static int OP_STR_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSR_IMM, sub, 1); } static int OP_STR_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ASR_IMM, add, 1); } static int OP_STR_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ASR_IMM, sub, 1); } static int OP_STR_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ROR_IMM, add, 1); } static int OP_STR_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ROR_IMM, sub, 1); } static int OP_STRH_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, 0); } static int OP_STRH_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, 0); } static int OP_STRH_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, 0); } static int OP_STRH_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, 0); } static int OP_STRH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, -1); } static int OP_STRH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, -1); } static int OP_STRH_PRE_INDE_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, -1); } static int OP_STRH_PRE_INDE_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, -1); } static int OP_STRH_POS_INDE_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, 1); } static int OP_STRH_POS_INDE_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, 1); } static int OP_STRH_POS_INDE_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, 1); } static int OP_STRH_POS_INDE_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, 1); } static int OP_STRB_P_IMM_OFF(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, 0); } static int OP_STRB_M_IMM_OFF(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, 0); } static int OP_STRB_P_LSL_IMM_OFF(const u32 i) { OP_STR_(STRB, LSL_IMM, add, 0); } static int OP_STRB_M_LSL_IMM_OFF(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, 0); } static int OP_STRB_P_LSR_IMM_OFF(const u32 i) { OP_STR_(STRB, LSR_IMM, add, 0); } static int OP_STRB_M_LSR_IMM_OFF(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, 0); } static int OP_STRB_P_ASR_IMM_OFF(const u32 i) { OP_STR_(STRB, ASR_IMM, add, 0); } static int OP_STRB_M_ASR_IMM_OFF(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, 0); } static int OP_STRB_P_ROR_IMM_OFF(const u32 i) { OP_STR_(STRB, ROR_IMM, add, 0); } static int OP_STRB_M_ROR_IMM_OFF(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, 0); } static int OP_STRB_P_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, -1); } static int OP_STRB_M_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, -1); } static int OP_STRB_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSL_IMM, add, -1); } static int OP_STRB_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, -1); } static int OP_STRB_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSR_IMM, add, -1); } static int OP_STRB_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, -1); } static int OP_STRB_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ASR_IMM, add, -1); } static int OP_STRB_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, -1); } static int OP_STRB_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ROR_IMM, add, -1); } static int OP_STRB_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, -1); } static int OP_STRB_P_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, 1); } static int OP_STRB_M_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, 1); } static int OP_STRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSL_IMM, add, 1); } static int OP_STRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, 1); } static int OP_STRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSR_IMM, add, 1); } static int OP_STRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, 1); } static int OP_STRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ASR_IMM, add, 1); } static int OP_STRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, 1); } static int OP_STRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ROR_IMM, add, 1); } static int OP_STRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, 1); } //----------------------------------------------------------------------------- // LDRD / STRD //----------------------------------------------------------------------------- typedef u32 FASTCALL (*LDRD_STRD_REG)(u32); template static u32 FASTCALL OP_LDRD_REG(u32 adr) { cpu->R[Rnum] = READ32(cpu->mem_if->data, adr); cpu->R[Rnum+1] = READ32(cpu->mem_if->data, adr+4); return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); } template static u32 FASTCALL OP_STRD_REG(u32 adr) { WRITE32(cpu->mem_if->data, adr, cpu->R[Rnum]); WRITE32(cpu->mem_if->data, adr + 4, cpu->R[Rnum + 1]); return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); } #define T(op, proc) op, op, op, op, op, op, op, op, op, op, op, op, op, op, op, op static const LDRD_STRD_REG op_ldrd_tab[2][16] = { {T(OP_LDRD_REG, 0)}, {T(OP_LDRD_REG, 1)} }; static const LDRD_STRD_REG op_strd_tab[2][16] = { {T(OP_STRD_REG, 0)}, {T(OP_STRD_REG, 1)} }; #undef T static int OP_LDRD_STRD_POST_INDEX(const u32 i) { u8 Rd_num = REG_POS(i, 12); if (Rd_num == 14) { printf("OP_LDRD_STRD_POST_INDEX: use R14!!!!\n"); return 0; // TODO: exception } if (Rd_num & 0x1) { printf("OP_LDRD_STRD_POST_INDEX: ERROR!!!!\n"); return 0; // TODO: exception } GpVar Rd = c.newGpVar(kX86VarTypeGpd); GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(Rd, reg_pos_ptr(16)); c.mov(addr, reg_pos_ptr(16)); // I bit - immediate or register if (BIT22(i)) { IMM_OFF; BIT23(i)?c.add(reg_pos_ptr(16), rhs):c.sub(reg_pos_ptr(16), rhs); } else { GpVar idx = c.newGpVar(kX86VarTypeGpd); c.mov(idx, reg_pos_ptr(0)); BIT23(i)?c.add(reg_pos_ptr(16), idx):c.sub(reg_pos_ptr(16), idx); } X86CompilerFuncCall *ctx = c.call((void*)(BIT5(i) ? op_strd_tab[PROCNUM][Rd_num] : op_ldrd_tab[PROCNUM][Rd_num])); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, addr); ctx->setReturn(bb_cycles); emit_MMU_aluMemCycles(3, bb_cycles, 0); return 1; } static int OP_LDRD_STRD_OFFSET_PRE_INDEX(const u32 i) { u8 Rd_num = REG_POS(i, 12); if (Rd_num == 14) { printf("OP_LDRD_STRD_OFFSET_PRE_INDEX: use R14!!!!\n"); return 0; // TODO: exception } if (Rd_num & 0x1) { printf("OP_LDRD_STRD_OFFSET_PRE_INDEX: ERROR!!!!\n"); return 0; // TODO: exception } GpVar Rd = c.newGpVar(kX86VarTypeGpd); GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(Rd, reg_pos_ptr(16)); c.mov(addr, reg_pos_ptr(16)); // I bit - immediate or register if (BIT22(i)) { IMM_OFF; BIT23(i)?c.add(addr, rhs):c.sub(addr, rhs); } else BIT23(i)?c.add(addr, reg_pos_ptr(0)):c.sub(addr, reg_pos_ptr(0)); if (BIT5(i)) // Store { X86CompilerFuncCall *ctx = c.call((void*)op_strd_tab[PROCNUM][Rd_num]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, addr); ctx->setReturn(bb_cycles); if (BIT21(i)) // W bit - writeback c.mov(reg_pos_ptr(16), addr); emit_MMU_aluMemCycles(3, bb_cycles, 0); } else // Load { if (BIT21(i)) // W bit - writeback c.mov(reg_pos_ptr(16), addr); X86CompilerFuncCall *ctx = c.call((void*)op_ldrd_tab[PROCNUM][Rd_num]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, addr); ctx->setReturn(bb_cycles); emit_MMU_aluMemCycles(3, bb_cycles, 0); } return 1; } //----------------------------------------------------------------------------- // SWP/SWPB //----------------------------------------------------------------------------- template static u32 FASTCALL op_swp(u32 adr, u32 *Rd, u32 Rs) { u32 tmp = ROR(READ32(cpu->mem_if->data, adr), (adr & 3)<<3); WRITE32(cpu->mem_if->data, adr, Rs); *Rd = tmp; return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr)); } template static u32 FASTCALL op_swpb(u32 adr, u32 *Rd, u32 Rs) { u32 tmp = READ8(cpu->mem_if->data, adr); WRITE8(cpu->mem_if->data, adr, Rs); *Rd = tmp; return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr)); } typedef u32 FASTCALL (*OP_SWP_SWPB)(u32, u32*, u32); static const OP_SWP_SWPB op_swp_tab[2][2] = {{ op_swp<0>, op_swp<1> }, { op_swpb<0>, op_swpb<1> }}; static int op_swp_(const u32 i, int b) { GpVar addr = c.newGpVar(kX86VarTypeGpd); GpVar Rd = c.newGpVar(kX86VarTypeGpz); GpVar Rs = c.newGpVar(kX86VarTypeGpd); c.mov(addr, reg_pos_ptr(16)); c.lea(Rd, reg_pos_ptr(12)); if(b) c.movzx(Rs, reg_pos_ptrB(0)); else c.mov(Rs, reg_pos_ptr(0)); X86CompilerFuncCall *ctx = c.call((void*)op_swp_tab[b][PROCNUM]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder3()); ctx->setArgument(0, addr); ctx->setArgument(1, Rd); ctx->setArgument(2, Rs); ctx->setReturn(bb_cycles); emit_MMU_aluMemCycles(4, bb_cycles, 0); return 1; } static int OP_SWP(const u32 i) { return op_swp_(i, 0); } static int OP_SWPB(const u32 i) { return op_swp_(i, 1); } //----------------------------------------------------------------------------- // LDMIA / LDMIB / LDMDA / LDMDB / STMIA / STMIB / STMDA / STMDB //----------------------------------------------------------------------------- static u32 popregcount(u32 x) { uint32_t pop = 0; for(; x; x>>=1) pop += x&1; return pop; } static u64 get_reg_list(u32 reg_mask, int dir) { u64 regs = 0; for(int j=0; j<16; j++) { int k = dir<0 ? j : 15-j; if(BIT_N(reg_mask,k)) regs = (regs << 4) | k; } return regs; } #ifdef ASMJIT_X64 // generic needs to spill regs and main doesn't; if it's inlined gcc isn't smart enough to keep the spills out of the common case. #define LDM_INLINE NOINLINE #else // spills either way, and we might as well save codesize by not having separate functions #define LDM_INLINE INLINE #endif template static LDM_INLINE FASTCALL u32 OP_LDM_STM_generic(u32 adr, u64 regs, int n) { u32 cycles = 0; adr &= ~3; do { if(store) _MMU_write32(adr, cpu->R[regs&0xF]); else cpu->R[regs&0xF] = _MMU_read32(adr); cycles += MMU_memAccessCycles(adr); adr += 4*dir; regs >>= 4; } while(--n > 0); return cycles; } #ifdef ENABLE_ADVANCED_TIMING #define ADV_CYCLES cycles += MMU_memAccessCycles(adr); #else #define ADV_CYCLES #endif template static LDM_INLINE FASTCALL u32 OP_LDM_STM_other(u32 adr, u64 regs, int n) { u32 cycles = 0; adr &= ~3; #ifndef ENABLE_ADVANCED_TIMING cycles = n * MMU_memAccessCycles(adr); #endif do { if(PROCNUM==ARMCPU_ARM9) if(store) _MMU_ARM9_write32(adr, cpu->R[regs&0xF]); else cpu->R[regs&0xF] = _MMU_ARM9_read32(adr); else if(store) _MMU_ARM7_write32(adr, cpu->R[regs&0xF]); else cpu->R[regs&0xF] = _MMU_ARM7_read32(adr); ADV_CYCLES; adr += 4*dir; regs >>= 4; } while(--n > 0); return cycles; } template static FORCEINLINE FASTCALL u32 OP_LDM_STM_main(u32 adr, u64 regs, int n, u8 *ptr, u32 cycles) { #ifdef ENABLE_ADVANCED_TIMING cycles = 0; #endif uintptr_t *func = (uintptr_t *)&JIT_COMPILED_FUNC(adr, PROCNUM); #define OP(j) { \ /* no need to zero functions in DTCM, since we can't execute from it */ \ if(null_compiled && store) \ { \ *func = 0; \ *(func+1) = 0; \ } \ int Rd = ((uintptr_t)regs >> (j*4)) & 0xF; \ if(store) *(u32*)ptr = cpu->R[Rd]; \ else cpu->R[Rd] = *(u32*)ptr; \ ADV_CYCLES; \ func += 2*dir; \ adr += 4*dir; \ ptr += 4*dir; } do { OP(0); if(n == 1) break; OP(1); if(n == 2) break; OP(2); if(n == 3) break; OP(3); regs >>= 16; n -= 4; } while(n > 0); return cycles; #undef OP #undef ADV_CYCLES } template static u32 FASTCALL OP_LDM_STM(u32 adr, u64 regs, int n) { // TODO use classify_adr? u32 cycles; u8 *ptr; if((adr ^ (adr + (dir>0 ? (n-1)*4 : -15*4))) & ~0x3FFF) // a little conservative, but we don't want to run too many comparisons { // the memory region spans a page boundary, so we can't factor the address translation out of the loop return OP_LDM_STM_generic(adr, regs, n); } else if(PROCNUM==ARMCPU_ARM9 && (adr & ~0x3FFF) == MMU.DTCMRegion) { // don't special-case DTCM cycles, even though that would be both faster and more accurate, // because that wouldn't match the non-jitted version with !ACCOUNT_FOR_DATA_TCM_SPEED ptr = MMU.ARM9_DTCM + (adr & 0x3FFC); cycles = n * MMU_memAccessCycles(adr); if(store) return OP_LDM_STM_main(adr, regs, n, ptr, cycles); } else if((adr & 0x0F000000) == 0x02000000) { ptr = MMU.MAIN_MEM + (adr & _MMU_MAIN_MEM_MASK32); cycles = n * ((PROCNUM==ARMCPU_ARM9) ? 4 : 2); } else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03800000) { ptr = MMU.ARM7_ERAM + (adr & 0xFFFC); cycles = n; } else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03000000) { ptr = MMU.SWIRAM + (adr & 0x7FFC); cycles = n; } else return OP_LDM_STM_other(adr, regs, n); return OP_LDM_STM_main(adr, regs, n, ptr, cycles); } typedef u32 FASTCALL (*LDMOpFunc)(u32,u64,int); static const LDMOpFunc op_ldm_stm_tab[2][2][2] = {{ { OP_LDM_STM<0,0,-1>, OP_LDM_STM<0,0,+1> }, { OP_LDM_STM<0,1,-1>, OP_LDM_STM<0,1,+1> }, },{ { OP_LDM_STM<1,0,-1>, OP_LDM_STM<1,0,+1> }, { OP_LDM_STM<1,1,-1>, OP_LDM_STM<1,1,+1> }, }}; static void call_ldm_stm(GpVar adr, u32 bitmask, bool store, int dir) { if(bitmask) { GpVar n = c.newGpVar(kX86VarTypeGpd); c.mov(n, popregcount(bitmask)); #ifdef ASMJIT_X64 GpVar regs = c.newGpVar(kX86VarTypeGpz); c.mov(regs, get_reg_list(bitmask, dir)); X86CompilerFuncCall *ctx = c.call((void*)op_ldm_stm_tab[PROCNUM][store][dir>0]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder3()); ctx->setArgument(0, adr); ctx->setArgument(1, regs); ctx->setArgument(2, n); #else // same prototype, but we have to handle splitting of a u64 arg manually GpVar regs_lo = c.newGpVar(kX86VarTypeGpd); GpVar regs_hi = c.newGpVar(kX86VarTypeGpd); c.mov(regs_lo, (u32)get_reg_list(bitmask, dir)); c.mov(regs_hi, get_reg_list(bitmask, dir) >> 32); X86CompilerFuncCall *ctx = c.call((void*)op_ldm_stm_tab[PROCNUM][store][dir>0]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder4()); ctx->setArgument(0, adr); ctx->setArgument(1, regs_lo); ctx->setArgument(2, regs_hi); ctx->setArgument(3, n); #endif ctx->setReturn(bb_cycles); } else bb_constant_cycles++; } static int op_bx(Mem srcreg, bool blx, bool test_thumb); static int op_bx_thumb(Mem srcreg, bool blx, bool test_thumb); static int op_ldm_stm(u32 i, bool store, int dir, bool before, bool writeback) { u32 bitmask = i & 0xFFFF; u32 pop = popregcount(bitmask); GpVar adr = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_pos_ptr(16)); if(before) c.add(adr, 4*dir); call_ldm_stm(adr, bitmask, store, dir); if(BIT15(i) && !store) { op_bx(reg_ptr(15), 0, PROCNUM == ARMCPU_ARM9); } if(writeback) { if(store || !(i & (1 << REG_POS(i,16)))) { JIT_COMMENT("--- writeback"); c.add(reg_pos_ptr(16), 4*dir*pop); } else { u32 bitlist = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; if(i & bitlist) { JIT_COMMENT("--- writeback"); c.add(adr, 4*dir*(pop-before)); c.mov(reg_pos_ptr(16), adr); } } } emit_MMU_aluMemCycles(store ? 1 : 2, bb_cycles, pop); return 1; } static int OP_LDMIA(const u32 i) { return op_ldm_stm(i, 0, +1, 0, 0); } static int OP_LDMIB(const u32 i) { return op_ldm_stm(i, 0, +1, 1, 0); } static int OP_LDMDA(const u32 i) { return op_ldm_stm(i, 0, -1, 0, 0); } static int OP_LDMDB(const u32 i) { return op_ldm_stm(i, 0, -1, 1, 0); } static int OP_LDMIA_W(const u32 i) { return op_ldm_stm(i, 0, +1, 0, 1); } static int OP_LDMIB_W(const u32 i) { return op_ldm_stm(i, 0, +1, 1, 1); } static int OP_LDMDA_W(const u32 i) { return op_ldm_stm(i, 0, -1, 0, 1); } static int OP_LDMDB_W(const u32 i) { return op_ldm_stm(i, 0, -1, 1, 1); } static int OP_STMIA(const u32 i) { return op_ldm_stm(i, 1, +1, 0, 0); } static int OP_STMIB(const u32 i) { return op_ldm_stm(i, 1, +1, 1, 0); } static int OP_STMDA(const u32 i) { return op_ldm_stm(i, 1, -1, 0, 0); } static int OP_STMDB(const u32 i) { return op_ldm_stm(i, 1, -1, 1, 0); } static int OP_STMIA_W(const u32 i) { return op_ldm_stm(i, 1, +1, 0, 1); } static int OP_STMIB_W(const u32 i) { return op_ldm_stm(i, 1, +1, 1, 1); } static int OP_STMDA_W(const u32 i) { return op_ldm_stm(i, 1, -1, 0, 1); } static int OP_STMDB_W(const u32 i) { return op_ldm_stm(i, 1, -1, 1, 1); } static int op_ldm_stm2(u32 i, bool store, int dir, bool before, bool writeback) { u32 bitmask = i & 0xFFFF; u32 pop = popregcount(bitmask); bool bit15 = BIT15(i); //printf("ARM%c: %s R%d:%08X, bitmask %02X\n", PROCNUM?'7':'9', (store?"STM":"LDM"), REG_POS(i, 16), cpu->R[REG_POS(i, 16)], bitmask); u32 adr_first = cpu->R[REG_POS(i, 16)]; GpVar adr = c.newGpVar(kX86VarTypeGpd); GpVar oldmode = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_pos_ptr(16)); if(before) c.add(adr, 4*dir); if (!bit15 || store) { //if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } //oldmode = armcpu_switchMode(cpu, SYS); c.mov(oldmode, SYS); X86CompilerFuncCall *ctx = c.call((void*)armcpu_switchMode); ctx->setPrototype(kX86FuncConvDefault, FuncBuilder2()); ctx->setArgument(0, bb_cpu); ctx->setArgument(1, oldmode); ctx->setReturn(oldmode); } call_ldm_stm(adr, bitmask, store, dir); if(!bit15 || store) { //armcpu_switchMode(cpu, oldmode); X86CompilerFuncCall *ctx = c.call((void*)armcpu_switchMode); ctx->setPrototype(kX86FuncConvDefault, FuncBuilder2()); ctx->setArgument(0, bb_cpu); ctx->setArgument(1, oldmode); } else { S_DST_R15; } // FIXME if(writeback) { if(store || !(i & (1 << REG_POS(i,16)))) c.add(reg_pos_ptr(16), 4*dir*pop); else { u32 bitlist = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; if(i & bitlist) { c.add(adr, 4*dir*(pop-before)); c.mov(reg_pos_ptr(16), adr); } } } emit_MMU_aluMemCycles(store ? 1 : 2, bb_cycles, pop); return 1; } static int OP_LDMIA2(const u32 i) { return op_ldm_stm2(i, 0, +1, 0, 0); } static int OP_LDMIB2(const u32 i) { return op_ldm_stm2(i, 0, +1, 1, 0); } static int OP_LDMDA2(const u32 i) { return op_ldm_stm2(i, 0, -1, 0, 0); } static int OP_LDMDB2(const u32 i) { return op_ldm_stm2(i, 0, -1, 1, 0); } static int OP_LDMIA2_W(const u32 i) { return op_ldm_stm2(i, 0, +1, 0, 1); } static int OP_LDMIB2_W(const u32 i) { return op_ldm_stm2(i, 0, +1, 1, 1); } static int OP_LDMDA2_W(const u32 i) { return op_ldm_stm2(i, 0, -1, 0, 1); } static int OP_LDMDB2_W(const u32 i) { return op_ldm_stm2(i, 0, -1, 1, 1); } static int OP_STMIA2(const u32 i) { return op_ldm_stm2(i, 1, +1, 0, 0); } static int OP_STMIB2(const u32 i) { return op_ldm_stm2(i, 1, +1, 1, 0); } static int OP_STMDA2(const u32 i) { return op_ldm_stm2(i, 1, -1, 0, 0); } static int OP_STMDB2(const u32 i) { return op_ldm_stm2(i, 1, -1, 1, 0); } static int OP_STMIA2_W(const u32 i) { return op_ldm_stm2(i, 1, +1, 0, 1); } static int OP_STMIB2_W(const u32 i) { return op_ldm_stm2(i, 1, +1, 1, 1); } static int OP_STMDA2_W(const u32 i) { return op_ldm_stm2(i, 1, -1, 0, 1); } static int OP_STMDB2_W(const u32 i) { return op_ldm_stm2(i, 1, -1, 1, 1); } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- #define SIGNEXTEND_11(i) (((s32)i<<21)>>21) #define SIGNEXTEND_24(i) (((s32)i<<8)>>8) static int op_b(u32 i, bool bl) { u32 dst = bb_r15 + (SIGNEXTEND_24(i) << 2); if(CONDITION(i)==0xF) { if(bl) dst += 2; c.or_(cpu_ptr_byte(CPSR, 0), 1<<5); } if(bl || CONDITION(i)==0xF) c.mov(reg_ptr(14), bb_next_instruction); c.mov(cpu_ptr(instruct_adr), dst); return 1; } static int OP_B(const u32 i) { return op_b(i, 0); } static int OP_BL(const u32 i) { return op_b(i, 1); } static int op_bx(Mem srcreg, bool blx, bool test_thumb) { GpVar dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, srcreg); if(test_thumb) { GpVar mask = c.newGpVar(kX86VarTypeGpd); GpVar thumb = dst; dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, thumb); c.and_(thumb, 1); c.lea(mask, ptr_abs((void*)0xFFFFFFFC, thumb.r64(), kScale2Times)); c.shl(thumb, 5); c.or_(cpu_ptr_byte(CPSR, 0), thumb.r8Lo()); c.and_(dst, mask); } else c.and_(dst, 0xFFFFFFFC); if(blx) c.mov(reg_ptr(14), bb_next_instruction); c.mov(cpu_ptr(instruct_adr), dst); return 1; } static int OP_BX(const u32 i) { return op_bx(reg_pos_ptr(0), 0, 1); } static int OP_BLX_REG(const u32 i) { return op_bx(reg_pos_ptr(0), 1, 1); } //----------------------------------------------------------------------------- // CLZ //----------------------------------------------------------------------------- static int OP_CLZ(const u32 i) { GpVar res = c.newGpVar(kX86VarTypeGpd); c.mov(res, 0x3F); c.bsr(res, reg_pos_ptr(0)); c.xor_(res, 0x1F); c.mov(reg_pos_ptr(12), res); return 1; } //----------------------------------------------------------------------------- // MCR / MRC //----------------------------------------------------------------------------- // precalculate region masks/sets from cp15 register ----- JIT // TODO: rewrite to asm static void maskPrecalc(u32 _num) { #define precalc(num) { \ u32 mask = 0, set = 0xFFFFFFFF ; /* (x & 0) == 0xFF..FF is allways false (disabled) */ \ if (BIT_N(cp15.protectBaseSize[num],0)) /* if region is enabled */ \ { /* reason for this define: naming includes var */ \ mask = CP15_MASKFROMREG(cp15.protectBaseSize[num]) ; \ set = CP15_SETFROMREG(cp15.protectBaseSize[num]) ; \ if (CP15_SIZEIDENTIFIER(cp15.protectBaseSize[num])==0x1F) \ { /* for the 4GB region, u32 suffers wraparound */ \ mask = 0 ; set = 0 ; /* (x & 0) == 0 is allways true (enabled) */ \ } \ } \ cp15.setSingleRegionAccess(num, mask, set) ; \ } switch(_num) { case 0: precalc(0); break; case 1: precalc(1); break; case 2: precalc(2); break; case 3: precalc(3); break; case 4: precalc(4); break; case 5: precalc(5); break; case 6: precalc(6); break; case 7: precalc(7); break; case 0xFF: precalc(0); precalc(1); precalc(2); precalc(3); precalc(4); precalc(5); precalc(6); precalc(7); break; } #undef precalc } #define _maskPrecalc(num) \ { \ GpVar _num = c.newGpVar(kX86VarTypeGpd); \ X86CompilerFuncCall* ctxM = c.call((uintptr_t)maskPrecalc); \ c.mov(_num, num); \ ctxM->setPrototype(kX86FuncConvDefault, FuncBuilder1()); \ ctxM->setArgument(0, _num); \ } static int OP_MCR(const u32 i) { if (PROCNUM == ARMCPU_ARM7) return 0; u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { // TODO - exception? printf("JIT: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } if (REG_POS(i, 12) == 15) { printf("JIT: MCR Rd=R15\n"); return 2; } u8 CRn = REG_POS(i, 16); // Cn u8 CRm = REG_POS(i, 0); // Cm u8 opcode1 = ((i>>21)&0x7); // opcode1 u8 opcode2 = ((i>>5)&0x7); // opcode2 GpVar bb_cp15 = c.newGpVar(kX86VarTypeGpz); GpVar data = c.newGpVar(kX86VarTypeGpd); c.mov(data, reg_pos_ptr(12)); c.mov(bb_cp15, (uintptr_t)&cp15); bool bUnknown = false; switch(CRn) { case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); // On the NDS bit0,2,7,12..19 are R/W, Bit3..6 are always set, all other bits are always zero. //MMU.ARM9_RW_MODE = BIT7(val); GpVar bb_mmu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_mmu, (uintptr_t)&MMU); Mem rwmode = mmu_ptr_byte(ARM9_RW_MODE); Mem ldtbit = cpu_ptr_byte(LDTBit, 0); c.test(data, (1<<7)); c.setnz(rwmode); //cpu->intVector = 0xFFFF0000 * (BIT13(val)); GpVar vec = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, 0xFFFF0000); c.xor_(vec, vec); c.test(data, (1 << 13)); c.cmovnz(vec, tmp); c.mov(cpu_ptr(intVector), vec); //cpu->LDTBit = !BIT15(val); //TBit c.test(data, (1 << 15)); c.setz(ldtbit); //ctrl = (val & 0x000FF085) | 0x00000078; c.and_(data, 0x000FF085); c.or_(data, 0x00000078); c.mov(cp15_ptr(ctrl), data); break; } bUnknown = true; break; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: // DCConfig = val; c.mov(cp15_ptr(DCConfig), data); break; case 1: // ICConfig = val; c.mov(cp15_ptr(ICConfig), data); break; default: bUnknown = true; break; } break; } bUnknown = true; break; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { //writeBuffCtrl = val; c.mov(cp15_ptr(writeBuffCtrl), data); break; } bUnknown = true; break; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: //DaccessPerm = val; c.mov(cp15_ptr(DaccessPerm), data); _maskPrecalc(0xFF); break; case 3: //IaccessPerm = val; c.mov(cp15_ptr(IaccessPerm), data); _maskPrecalc(0xFF); break; default: bUnknown = true; break; } } bUnknown = true; break; case 6: if((opcode1==0) && (opcode2==0)) { if (CRm < 8) { //protectBaseSize[CRm] = val; c.mov(cp15_ptr_off(protectBaseSize, (CRm * sizeof(u32))), data); _maskPrecalc(CRm); break; } } bUnknown = true; break; case 7: if((CRm==0)&&(opcode1==0)&&((opcode2==4))) { //CP15wait4IRQ; c.mov(cpu_ptr(waitIRQ), true); c.mov(cpu_ptr(halt_IE_and_IF), true); //IME set deliberately omitted: only SWI sets IME to 1 break; } bUnknown = true; break; case 9: if((opcode1==0)) { switch(CRm) { case 0: switch(opcode2) { case 0: //DcacheLock = val; c.mov(cp15_ptr(DcacheLock), data); break; case 1: //IcacheLock = val; c.mov(cp15_ptr(IcacheLock), data); break; default: bUnknown = true; break; } case 1: switch(opcode2) { case 0: { //MMU.DTCMRegion = DTCMRegion = val & 0x0FFFF000; c.and_(data, 0x0FFFF000); GpVar bb_mmu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_mmu, (uintptr_t)&MMU); c.mov(mmu_ptr(DTCMRegion), data); c.mov(cp15_ptr(DTCMRegion), data); } break; case 1: { //ITCMRegion = val; //ITCM base is not writeable! GpVar bb_mmu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_mmu, (uintptr_t)&MMU); c.mov(mmu_ptr(ITCMRegion), 0); c.mov(cp15_ptr(ITCMRegion), data); } break; default: bUnknown = true; break; } } break; } bUnknown = true; break; case 13: bUnknown = true; break; case 15: bUnknown = true; break; default: bUnknown = true; break; } if (bUnknown) { //printf("Unknown MCR command: MRC P15, 0, R%i, C%i, C%i, %i, %i\n", REG_POS(i, 12), CRn, CRm, opcode1, opcode2); return 1; } return 1; } static int OP_MRC(const u32 i) { if (PROCNUM == ARMCPU_ARM7) return 0; u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { printf("MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } u8 CRn = REG_POS(i, 16); // Cn u8 CRm = REG_POS(i, 0); // Cm u8 opcode1 = ((i>>21)&0x7); // opcode1 u8 opcode2 = ((i>>5)&0x7); // opcode2 GpVar bb_cp15 = c.newGpVar(kX86VarTypeGpz); GpVar data = c.newGpVar(kX86VarTypeGpd); c.mov(bb_cp15, (uintptr_t)&cp15); bool bUnknown = false; switch(CRn) { case 0: if((opcode1 == 0)&&(CRm==0)) { switch(opcode2) { case 1: // *R = cacheType; c.mov(data, cp15_ptr(cacheType)); break; case 2: // *R = TCMSize; c.mov(data, cp15_ptr(TCMSize)); break; default: // FIXME // *R = IDCode; c.mov(data, cp15_ptr(IDCode)); break; } break; } bUnknown = true; break; case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { // *R = ctrl; c.mov(data, cp15_ptr(ctrl)); break; } bUnknown = true; break; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: // *R = DCConfig; c.mov(data, cp15_ptr(DCConfig)); break; case 1: // *R = ICConfig; c.mov(data, cp15_ptr(ICConfig)); break; default: bUnknown = true; break; } break; } bUnknown = true; break; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { // *R = writeBuffCtrl; c.mov(data, cp15_ptr(writeBuffCtrl)); break; } bUnknown = true; break; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: // *R = DaccessPerm; c.mov(data, cp15_ptr(DaccessPerm)); break; case 3: // *R = IaccessPerm; c.mov(data, cp15_ptr(IaccessPerm)); break; default: bUnknown = true; break; } break; } bUnknown = true; break; case 6: if((opcode1==0) && (opcode2==0)) { if (CRm < 8) { // *R = protectBaseSize[CRm]; c.mov(data, cp15_ptr_off(protectBaseSize, (CRm * sizeof(u32)))); break; } } bUnknown = true; break; case 7: bUnknown = true; break; case 9: if(opcode1 == 0) { switch(CRm) { case 0: switch(opcode2) { case 0: //*R = DcacheLock; c.mov(data, cp15_ptr(DcacheLock)); break; case 1: //*R = IcacheLock; c.mov(data, cp15_ptr(IcacheLock)); break; default: bUnknown = true; break; } case 1: switch(opcode2) { case 0: //*R = DTCMRegion; c.mov(data, cp15_ptr(DTCMRegion)); break; case 1: //*R = ITCMRegion; c.mov(data, cp15_ptr(ITCMRegion)); break; default: bUnknown = true; break; } } // break; } bUnknown = true; break; case 13: bUnknown = true; break; case 15: bUnknown = true; break; default: bUnknown = true; break; } if (bUnknown) { //printf("Unknown MRC command: MRC P15, 0, R%i, C%i, C%i, %i, %i\n", REG_POS(i, 12), CRn, CRm, opcode1, opcode2); return 1; } if (REG_POS(i, 12) == 15) // set NZCV { //CPSR.bits.N = BIT31(data); //CPSR.bits.Z = BIT30(data); //CPSR.bits.C = BIT29(data); //CPSR.bits.V = BIT28(data); c.and_(data, 0xF0000000); c.and_(cpu_ptr(CPSR), 0x0FFFFFFF); c.or_(cpu_ptr(CPSR), data); } else c.mov(reg_pos_ptr(12), data); return 1; } u32 op_swi(u8 swinum) { if(cpu->swi_tab) { #if defined(_M_X64) || defined(__x86_64__) // TODO: return 0; #else X86CompilerFuncCall *ctx = c.call((void*)ARM_swi_tab[PROCNUM][swinum]); ctx->setPrototype(kX86FuncConvDefault, FuncBuilder0()); ctx->setReturn(bb_cycles); c.add(bb_cycles, 3); return 1; #endif } GpVar oldCPSR = c.newGpVar(kX86VarTypeGpd); GpVar mode = c.newGpVar(kX86VarTypeGpd); Mem CPSR = cpu_ptr(CPSR.val); JIT_COMMENT("store CPSR to x86 stack"); c.mov(oldCPSR, CPSR); JIT_COMMENT("enter SVC mode"); c.mov(mode, imm(SVC)); X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); ctx->setPrototype(kX86FuncConvDefault, FuncBuilder2()); ctx->setArgument(0, bb_cpu); ctx->setArgument(1, mode); c.unuse(mode); JIT_COMMENT("store next instruction address to R14"); c.mov(reg_ptr(14), bb_next_instruction); JIT_COMMENT("save old CPSR as new SPSR"); c.mov(cpu_ptr(SPSR.val), oldCPSR); JIT_COMMENT("CPSR: clear T, set I"); GpVar _cpsr = c.newGpVar(kX86VarTypeGpd); c.mov(_cpsr, CPSR); c.and_(_cpsr, ~(1 << 5)); /* clear T */ c.or_(_cpsr, (1 << 7)); /* set I */ c.mov(CPSR, _cpsr); c.unuse(_cpsr); JIT_COMMENT("set next instruction"); c.mov(cpu_ptr(next_instruction), imm(cpu->intVector+0x08)); return 1; } static int OP_SWI(const u32 i) { return op_swi((i >> 16) & 0x1F); } //----------------------------------------------------------------------------- // BKPT //----------------------------------------------------------------------------- static int OP_BKPT(const u32 i) { printf("JIT: unimplemented OP_BKPT\n"); return 0; } //----------------------------------------------------------------------------- // THUMB //----------------------------------------------------------------------------- #define OP_SHIFTS_IMM(x86inst) \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ u8 cf_change = 1; \ const u32 rhs = ((i>>6) & 0x1F); \ if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) \ c.x86inst(reg_pos_thumb(0), rhs); \ else \ { \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, reg_pos_thumb(3)); \ c.x86inst(lhs, rhs); \ c.mov(reg_pos_thumb(0), lhs); \ c.unuse(lhs); \ } \ c.setc(rcf.r8Lo()); \ SET_NZC; \ return 1; #define OP_SHIFTS_REG(x86inst, bit) \ u8 cf_change = 1; \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ Label __eq32 = c.newLabel(); \ Label __ls32 = c.newLabel(); \ Label __zero = c.newLabel(); \ Label __done = c.newLabel(); \ \ c.mov(imm, reg_pos_thumb(3)); \ c.and_(imm, 0xFF); \ c.jz(__zero); \ c.cmp(imm, 32); \ c.jl(__ls32); \ c.je(__eq32); \ /* imm > 32 */ \ c.mov(reg_pos_thumb(0), 0); \ SET_NZC_SHIFTS_ZERO(0); \ c.jmp(__done); \ /* imm == 32 */ \ c.bind(__eq32); \ c.test(reg_pos_thumb(0), (1 << bit)); \ c.setnz(rcf.r8Lo()); \ c.mov(reg_pos_thumb(0), 0); \ SET_NZC_SHIFTS_ZERO(1); \ c.jmp(__done); \ /* imm == 0 */ \ c.bind(__zero); \ c.cmp(reg_pos_thumb(0), 0); \ SET_NZ(0); \ c.jmp(__done); \ /* imm < 32 */ \ c.bind(__ls32); \ c.x86inst(reg_pos_thumb(0), imm); \ c.setc(rcf.r8Lo()); \ SET_NZC; \ c.bind(__done); \ return 1; #define OP_LOGIC(x86inst, _conv) \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_thumb(3)); \ if (_conv==1) c.not_(rhs); \ c.x86inst(reg_pos_thumb(0), rhs); \ SET_NZ(0); \ return 1; //----------------------------------------------------------------------------- // LSL / LSR / ASR / ROR //----------------------------------------------------------------------------- static int OP_LSL_0(const u32 i) { if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) c.cmp(reg_pos_thumb(0), 0); else { GpVar rhs = c.newGpVar(kX86VarTypeGpd); c.mov(rhs, reg_pos_thumb(3)); c.mov(reg_pos_thumb(0), rhs); c.cmp(rhs, 0); } SET_NZ(0); return 1; } static int OP_LSL(const u32 i) { OP_SHIFTS_IMM(shl); } static int OP_LSL_REG(const u32 i) { OP_SHIFTS_REG(shl, 0); } static int OP_LSR_0(const u32 i) { GpVar rcf = c.newGpVar(kX86VarTypeGpd); c.test(reg_pos_thumb(3), (1 << 31)); c.setnz(rcf.r8Lo()); SET_NZC_SHIFTS_ZERO(1); c.mov(reg_pos_thumb(0), 0); return 1; } static int OP_LSR(const u32 i) { OP_SHIFTS_IMM(shr); } static int OP_LSR_REG(const u32 i) { OP_SHIFTS_REG(shr, 31); } static int OP_ASR_0(const u32 i) { u8 cf_change = 1; GpVar rcf = c.newGpVar(kX86VarTypeGpd); GpVar rhs = c.newGpVar(kX86VarTypeGpd); if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) c.sar(reg_pos_thumb(0), 31); else { c.mov(rhs, reg_pos_thumb(3)); c.sar(rhs, 31); c.mov(reg_pos_thumb(0), rhs); } c.sets(rcf.r8Lo()); SET_NZC; return 1; } static int OP_ASR(const u32 i) { OP_SHIFTS_IMM(sar); } static int OP_ASR_REG(const u32 i) { u8 cf_change = 1; Label __gr0 = c.newLabel(); Label __lt32 = c.newLabel(); Label __done = c.newLabel(); Label __setFlags = c.newLabel(); GpVar imm = c.newGpVar(kX86VarTypeGpz); GpVar rcf = c.newGpVar(kX86VarTypeGpd); c.mov(imm, reg_pos_thumb(3)); c.and_(imm, 0xFF); c.jnz(__gr0); /* imm == 0 */ c.cmp(reg_pos_thumb(0), 0); SET_NZ(0); c.jmp(__done); /* imm > 0 */ c.bind(__gr0); c.cmp(imm, 32); c.jl(__lt32); /* imm > 31 */ c.sar(reg_pos_thumb(0), 31); c.sets(rcf.r8Lo()); c.jmp(__setFlags); /* imm < 32 */ c.bind(__lt32); c.sar(reg_pos_thumb(0), imm); c.setc(rcf.r8Lo()); c.bind(__setFlags); SET_NZC; c.bind(__done); return 1; } //----------------------------------------------------------------------------- // ROR //----------------------------------------------------------------------------- static int OP_ROR_REG(const u32 i) { u8 cf_change = 1; GpVar imm = c.newGpVar(kX86VarTypeGpz); GpVar rcf = c.newGpVar(kX86VarTypeGpd); Label __zero = c.newLabel(); Label __zero_1F = c.newLabel(); Label __done = c.newLabel(); c.mov(imm, reg_pos_thumb(3)); c.and_(imm, 0xFF); c.jz(__zero); c.and_(imm, 0x1F); c.jz(__zero_1F); c.ror(reg_pos_thumb(0), imm); c.setc(rcf.r8Lo()); SET_NZC; c.jmp(__done); /* imm & 0x1F == 0 */ c.bind(__zero_1F); c.cmp(reg_pos_thumb(0), 0); c.sets(rcf.r8Lo()); SET_NZC; c.jmp(__done); /* imm == 0 */ c.bind(__zero); c.cmp(reg_pos_thumb(0), 0); SET_NZ(0); c.bind(__done); return 1; } //----------------------------------------------------------------------------- // AND / ORR / EOR / BIC //----------------------------------------------------------------------------- static int OP_AND(const u32 i) { OP_LOGIC(and_, 0); } static int OP_ORR(const u32 i) { OP_LOGIC(or_, 0); } static int OP_EOR(const u32 i) { OP_LOGIC(xor_, 0); } static int OP_BIC(const u32 i) { OP_LOGIC(and_, 1); } //----------------------------------------------------------------------------- // NEG //----------------------------------------------------------------------------- static int OP_NEG(const u32 i) { if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) c.neg(reg_pos_thumb(0)); else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.neg(tmp); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(1); return 1; } //----------------------------------------------------------------------------- // ADD //----------------------------------------------------------------------------- static int OP_ADD_IMM3(const u32 i) { u32 imm3 = (i >> 6) & 0x07; if (imm3 == 0) // mov 2 { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.mov(reg_pos_thumb(0), tmp); c.cmp(tmp, 0); SET_NZ(1); return 1; } if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { c.add(reg_pos_thumb(0), imm3); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.add(tmp, imm3); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(0); return 1; } static int OP_ADD_IMM8(const u32 i) { c.add(reg_pos_thumb(8), (i & 0xFF)); SET_NZCV(0); return 1; } static int OP_ADD_REG(const u32 i) { //cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(6)); c.add(reg_pos_thumb(0), tmp); } else if (_REG_NUM(i, 0) == _REG_NUM(i, 6)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.add(reg_pos_thumb(0), tmp); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.add(tmp, reg_pos_thumb(6)); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(0); return 1; } static int OP_ADD_SPE(const u32 i) { u32 Rd = _REG_NUM(i, 0) | ((i>>4)&8); //cpu->R[Rd] += cpu->R[REG_POS(i, 3)]; GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_ptr(Rd)); c.add(tmp, reg_pos_ptr(3)); c.mov(reg_ptr(Rd), tmp); if(Rd==15) c.mov(cpu_ptr(next_instruction), tmp); return 1; } static int OP_ADD_2PC(const u32 i) { u32 imm = ((i&0xFF)<<2); c.mov(reg_pos_thumb(8), (bb_r15 & 0xFFFFFFFC) + imm); return 1; } static int OP_ADD_2SP(const u32 i) { u32 imm = ((i&0xFF)<<2); //cpu->R[REG_NUM(i, 8)] = cpu->R[13] + ((i&0xFF)<<2); GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_ptr(13)); if (imm) c.add(tmp, imm); c.mov(reg_pos_thumb(8), tmp); return 1; } //----------------------------------------------------------------------------- // SUB //----------------------------------------------------------------------------- static int OP_SUB_IMM3(const u32 i) { u32 imm3 = (i >> 6) & 0x07; // cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] - imm3; if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { c.sub(reg_pos_thumb(0), imm3); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.sub(tmp, imm3); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(1); return 1; } static int OP_SUB_IMM8(const u32 i) { //cpu->R[REG_NUM(i, 8)] -= imm8; c.sub(reg_pos_thumb(8), (i & 0xFF)); SET_NZCV(1); return 1; } static int OP_SUB_REG(const u32 i) { // cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] - cpu->R[REG_NUM(i, 6)]; if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(6)); c.sub(reg_pos_thumb(0), tmp); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.sub(tmp, reg_pos_thumb(6)); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(1); return 1; } //----------------------------------------------------------------------------- // ADC //----------------------------------------------------------------------------- static int OP_ADC_REG(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); GET_CARRY(0); c.adc(reg_pos_thumb(0), tmp); SET_NZCV(0); return 1; } //----------------------------------------------------------------------------- // SBC //----------------------------------------------------------------------------- static int OP_SBC_REG(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); GET_CARRY(1); c.sbb(reg_pos_thumb(0), tmp); SET_NZCV(1); return 1; } //----------------------------------------------------------------------------- // MOV / MVN //----------------------------------------------------------------------------- static int OP_MOV_IMM8(const u32 i) { c.mov(reg_pos_thumb(8), (i & 0xFF)); c.cmp(reg_pos_thumb(8), 0); SET_NZ(0); return 1; } static int OP_MOV_SPE(const u32 i) { u32 Rd = _REG_NUM(i, 0) | ((i>>4)&8); //cpu->R[Rd] = cpu->R[REG_POS(i, 3)]; GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_ptr(3)); c.mov(reg_ptr(Rd), tmp); if(Rd == 15) { c.mov(cpu_ptr(next_instruction), tmp); bb_constant_cycles += 2; } return 1; } static int OP_MVN(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.not_(tmp); c.cmp(tmp, 0); c.mov(reg_pos_thumb(0), tmp); SET_NZ(0); return 1; } //----------------------------------------------------------------------------- // MUL //----------------------------------------------------------------------------- static int OP_MUL_REG(const u32 i) { GpVar lhs = c.newGpVar(kX86VarTypeGpd); c.mov(lhs, reg_pos_thumb(0)); c.imul(lhs, reg_pos_thumb(3)); c.cmp(lhs, 0); c.mov(reg_pos_thumb(0), lhs); SET_NZ(0); if (PROCNUM == ARMCPU_ARM7) c.mov(bb_cycles, 4); else MUL_Mxx_END(lhs, 0, 1); return 1; } //----------------------------------------------------------------------------- // CMP / CMN //----------------------------------------------------------------------------- static int OP_CMP_IMM8(const u32 i) { c.cmp(reg_pos_thumb(8), (i & 0xFF)); SET_NZCV(1); return 1; } static int OP_CMP(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.cmp(reg_pos_thumb(0), tmp); SET_NZCV(1); return 1; } static int OP_CMP_SPE(const u32 i) { u32 Rn = (i&7) | ((i>>4)&8); GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_ptr(3)); c.cmp(reg_ptr(Rn), tmp); SET_NZCV(1); return 1; } static int OP_CMN(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(0)); c.add(tmp, reg_pos_thumb(3)); SET_NZCV(0); return 1; } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- static int OP_TST(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.test(reg_pos_thumb(0), tmp); SET_NZ(0); return 1; } //----------------------------------------------------------------------------- // STR / LDR / STRB / LDRB //----------------------------------------------------------------------------- #define STR_THUMB(mem_op, offset) \ GpVar addr = c.newGpVar(kX86VarTypeGpd); \ GpVar data = c.newGpVar(kX86VarTypeGpd); \ u32 adr_first = cpu->R[_REG_NUM(i, 3)]; \ \ c.mov(addr, reg_pos_thumb(3)); \ if ((offset) != -1) \ { \ if ((offset) != 0) \ { \ c.add(addr, (u32)(offset)); \ adr_first += (u32)(offset); \ } \ } \ else \ { \ c.add(addr, reg_pos_thumb(6)); \ adr_first += cpu->R[_REG_NUM(i, 6)]; \ } \ c.mov(data, reg_pos_thumb(0)); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,1)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, addr); \ ctx->setArgument(1, data); \ ctx->setReturn(bb_cycles); \ return 1; #define LDR_THUMB(mem_op, offset) \ GpVar addr = c.newGpVar(kX86VarTypeGpd); \ GpVar data = c.newGpVar(kX86VarTypeGpz); \ u32 adr_first = cpu->R[_REG_NUM(i, 3)]; \ \ c.mov(addr, reg_pos_thumb(3)); \ if ((offset) != -1) \ { \ if ((offset) != 0) \ { \ c.add(addr, (u32)(offset)); \ adr_first += (u32)(offset); \ } \ } \ else \ { \ c.add(addr, reg_pos_thumb(6)); \ adr_first += cpu->R[_REG_NUM(i, 6)]; \ } \ c.lea(data, reg_pos_thumb(0)); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,0)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, addr); \ ctx->setArgument(1, data); \ ctx->setReturn(bb_cycles); \ return 1; static int OP_STRB_IMM_OFF(const u32 i) { STR_THUMB(STRB, ((i>>6)&0x1F)); } static int OP_LDRB_IMM_OFF(const u32 i) { LDR_THUMB(LDRB, ((i>>6)&0x1F)); } static int OP_STRB_REG_OFF(const u32 i) { STR_THUMB(STRB, -1); } static int OP_LDRB_REG_OFF(const u32 i) { LDR_THUMB(LDRB, -1); } static int OP_LDRSB_REG_OFF(const u32 i) { LDR_THUMB(LDRSB, -1); } static int OP_STRH_IMM_OFF(const u32 i) { STR_THUMB(STRH, ((i>>5)&0x3E)); } static int OP_LDRH_IMM_OFF(const u32 i) { LDR_THUMB(LDRH, ((i>>5)&0x3E)); } static int OP_STRH_REG_OFF(const u32 i) { STR_THUMB(STRH, -1); } static int OP_LDRH_REG_OFF(const u32 i) { LDR_THUMB(LDRH, -1); } static int OP_LDRSH_REG_OFF(const u32 i) { LDR_THUMB(LDRSH, -1); } static int OP_STR_IMM_OFF(const u32 i) { STR_THUMB(STR, ((i>>4)&0x7C)); } static int OP_LDR_IMM_OFF(const u32 i) { LDR_THUMB(LDR, ((i>>4)&0x7C)); } // FIXME: tempValue = (tempValue>>adr) | (tempValue<<(32-adr)); static int OP_STR_REG_OFF(const u32 i) { STR_THUMB(STR, -1); } static int OP_LDR_REG_OFF(const u32 i) { LDR_THUMB(LDR, -1); } static int OP_STR_SPREL(const u32 i) { u32 imm = ((i&0xFF)<<2); u32 adr_first = cpu->R[13] + imm; GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(addr, reg_ptr(13)); if (imm) c.add(addr, imm); GpVar data = c.newGpVar(kX86VarTypeGpd); c.mov(data, reg_pos_thumb(8)); X86CompilerFuncCall *ctx = c.call((void*)STR_tab[PROCNUM][classify_adr(adr_first,1)]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, addr); ctx->setArgument(1, data); ctx->setReturn(bb_cycles); return 1; } static int OP_LDR_SPREL(const u32 i) { u32 imm = ((i&0xFF)<<2); u32 adr_first = cpu->R[13] + imm; GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(addr, reg_ptr(13)); if (imm) c.add(addr, imm); GpVar data = c.newGpVar(kX86VarTypeGpz); c.lea(data, reg_pos_thumb(8)); X86CompilerFuncCall *ctx = c.call((void*)LDR_tab[PROCNUM][classify_adr(adr_first,0)]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, addr); ctx->setArgument(1, data); ctx->setReturn(bb_cycles); return 1; } static int OP_LDR_PCREL(const u32 i) { u32 imm = ((i&0xFF)<<2); u32 adr_first = (bb_r15 & 0xFFFFFFFC) + imm; GpVar addr = c.newGpVar(kX86VarTypeGpd); GpVar data = c.newGpVar(kX86VarTypeGpz); c.mov(addr, adr_first); c.lea(data, reg_pos_thumb(8)); X86CompilerFuncCall *ctx = c.call((void*)LDR_tab[PROCNUM][classify_adr(adr_first,0)]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, addr); ctx->setArgument(1, data); ctx->setReturn(bb_cycles); return 1; } //----------------------------------------------------------------------------- // STMIA / LDMIA //----------------------------------------------------------------------------- static int op_ldm_stm_thumb(u32 i, bool store) { u32 bitmask = i & 0xFF; u32 pop = popregcount(bitmask); //if (BIT_N(i, _REG_NUM(i, 8))) // printf("WARNING - %sIA with Rb in Rlist (THUMB)\n", store?"STM":"LDM"); GpVar adr = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_pos_thumb(8)); call_ldm_stm(adr, bitmask, store, 1); // ARM_REF: THUMB: Causes base register write-back, and is not optional // ARM_REF: If the base register is specified in , the final value of is the loaded value // (not the written-back value). if (store) c.add(reg_pos_thumb(8), 4*pop); else { if (!BIT_N(i, _REG_NUM(i, 8))) c.add(reg_pos_thumb(8), 4*pop); } emit_MMU_aluMemCycles(store ? 2 : 3, bb_cycles, pop); return 1; } static int OP_LDMIA_THUMB(const u32 i) { return op_ldm_stm_thumb(i, 0); } static int OP_STMIA_THUMB(const u32 i) { return op_ldm_stm_thumb(i, 1); } //----------------------------------------------------------------------------- // Adjust SP //----------------------------------------------------------------------------- static int OP_ADJUST_P_SP(const u32 i) { c.add(reg_ptr(13), ((i&0x7F)<<2)); return 1; } static int OP_ADJUST_M_SP(const u32 i) { c.sub(reg_ptr(13), ((i&0x7F)<<2)); return 1; } //----------------------------------------------------------------------------- // PUSH / POP //----------------------------------------------------------------------------- static int op_push_pop(u32 i, bool store, bool pc_lr) { u32 bitmask = (i & 0xFF); bitmask |= pc_lr << (store ? 14 : 15); u32 pop = popregcount(bitmask); int dir = store ? -1 : 1; GpVar adr = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_ptr(13)); if(store) c.sub(adr, 4); call_ldm_stm(adr, bitmask, store, dir); if(pc_lr && !store) op_bx_thumb(reg_ptr(15), 0, PROCNUM == ARMCPU_ARM9); c.add(reg_ptr(13), 4*dir*pop); emit_MMU_aluMemCycles(store ? (pc_lr?4:3) : (pc_lr?5:2), bb_cycles, pop); return 1; } static int OP_PUSH(const u32 i) { return op_push_pop(i, 1, 0); } static int OP_PUSH_LR(const u32 i) { return op_push_pop(i, 1, 1); } static int OP_POP(const u32 i) { return op_push_pop(i, 0, 0); } static int OP_POP_PC(const u32 i) { return op_push_pop(i, 0, 1); } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- static int OP_B_COND(const u32 i) { Label skip = c.newLabel(); u32 dst = bb_r15 + ((u32)((s8)(i&0xFF))<<1); c.mov(cpu_ptr(instruct_adr), bb_next_instruction); emit_branch((i>>8)&0xF, skip); c.mov(cpu_ptr(instruct_adr), dst); c.add(bb_total_cycles, 2); c.bind(skip); return 1; } static int OP_B_UNCOND(const u32 i) { u32 dst = bb_r15 + (SIGNEXTEND_11(i)<<1); c.mov(cpu_ptr(instruct_adr), dst); return 1; } static int OP_BLX(const u32 i) { GpVar dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, reg_ptr(14)); c.add(dst, (i&0x7FF) << 1); c.and_(dst, 0xFFFFFFFC); c.mov(cpu_ptr(instruct_adr), dst); c.mov(reg_ptr(14), bb_next_instruction | 1); // reset T bit c.and_(cpu_ptr_byte(CPSR, 0), ~(1<<5)); return 1; } static int OP_BL_10(const u32 i) { u32 dst = bb_r15 + (SIGNEXTEND_11(i)<<12); c.mov(reg_ptr(14), dst); return 1; } static int OP_BL_11(const u32 i) { GpVar dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, reg_ptr(14)); c.add(dst, (i&0x7FF) << 1); c.mov(cpu_ptr(instruct_adr), dst); c.mov(reg_ptr(14), bb_next_instruction | 1); return 1; } static int op_bx_thumb(Mem srcreg, bool blx, bool test_thumb) { GpVar dst = c.newGpVar(kX86VarTypeGpd); GpVar thumb = c.newGpVar(kX86VarTypeGpd); c.mov(dst, srcreg); c.mov(thumb, dst); // * cpu->CPSR.bits.T = BIT0(Rm); c.and_(thumb, 1); // * if (blx) c.mov(reg_ptr(14), bb_next_instruction | 1); if(test_thumb) { GpVar mask = c.newGpVar(kX86VarTypeGpd); c.lea(mask, ptr_abs((void*)0xFFFFFFFC, thumb.r64(), kScale2Times)); c.and_(dst, mask); } else c.and_(dst, 0xFFFFFFFE); GpVar tmp = c.newGpVar(kX86VarTypeGpd); // * c.mov(tmp, cpu_ptr_byte(CPSR, 0)); // * c.and_(tmp, ~(1<< 5)); // * c.shl(thumb, 5); // * c.or_(tmp, thumb); // * c.mov(cpu_ptr_byte(CPSR, 0), tmp.r8Lo()); // ****************************** c.mov(cpu_ptr(instruct_adr), dst); return 1; } static int op_bx_thumbR15() { const u32 r15 = (bb_r15 & 0xFFFFFFFC); c.mov(cpu_ptr(instruct_adr), Imm(r15)); c.mov(reg_ptr(15), Imm(r15)); c.and_(cpu_ptr(CPSR), (u32)~(1<< 5)); return 1; } static int OP_BX_THUMB(const u32 i) { if (REG_POS(i, 3) == 15) return op_bx_thumbR15(); return op_bx_thumb(reg_pos_ptr(3), 0, 0); } static int OP_BLX_THUMB(const u32 i) { return op_bx_thumb(reg_pos_ptr(3), 1, 1); } static int OP_SWI_THUMB(const u32 i) { return op_swi(i & 0x1F); } //----------------------------------------------------------------------------- // Unimplemented; fall back to the C versions //----------------------------------------------------------------------------- #define OP_UND NULL #define OP_LDREX NULL #define OP_STREX NULL #define OP_LDC_P_IMM_OFF NULL #define OP_LDC_M_IMM_OFF NULL #define OP_LDC_P_PREIND NULL #define OP_LDC_M_PREIND NULL #define OP_LDC_P_POSTIND NULL #define OP_LDC_M_POSTIND NULL #define OP_LDC_OPTION NULL #define OP_STC_P_IMM_OFF NULL #define OP_STC_M_IMM_OFF NULL #define OP_STC_P_PREIND NULL #define OP_STC_M_PREIND NULL #define OP_STC_P_POSTIND NULL #define OP_STC_M_POSTIND NULL #define OP_STC_OPTION NULL #define OP_CDP NULL #define OP_UND_THUMB NULL #define OP_BKPT_THUMB NULL //----------------------------------------------------------------------------- // Dispatch table //----------------------------------------------------------------------------- typedef int (*ArmOpCompiler)(u32); static const ArmOpCompiler arm_instruction_compilers[4096] = { #define TABDECL(x) x #include "instruction_tabdef.inc" #undef TABDECL }; static const ArmOpCompiler thumb_instruction_compilers[1024] = { #define TABDECL(x) x #include "thumb_tabdef.inc" #undef TABDECL }; //----------------------------------------------------------------------------- // Generic instruction wrapper //----------------------------------------------------------------------------- template static u32 FASTCALL OP_DECODE() { u32 cycles; u32 adr = cpu->instruct_adr; if(thumb) { cpu->next_instruction = adr + 2; cpu->R[15] = adr + 4; u32 opcode = _MMU_read16(adr); _armlog(PROCNUM, adr, opcode); cycles = thumb_instructions_set[PROCNUM][opcode>>6](opcode); } else { cpu->next_instruction = adr + 4; cpu->R[15] = adr + 8; u32 opcode = _MMU_read32(adr); _armlog(PROCNUM, adr, opcode); if(CONDITION(opcode) == 0xE || TEST_COND(CONDITION(opcode), CODE(opcode), cpu->CPSR)) cycles = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)](opcode); else cycles = 1; } cpu->instruct_adr = cpu->next_instruction; return cycles; } static const ArmOpCompiled op_decode[2][2] = { OP_DECODE<0,0>, OP_DECODE<0,1>, OP_DECODE<1,0>, OP_DECODE<1,1> }; //----------------------------------------------------------------------------- // Compiler //----------------------------------------------------------------------------- static u32 instr_attributes(u32 opcode) { return bb_thumb ? thumb_attributes[opcode>>6] : instruction_attributes[INSTRUCTION_INDEX(opcode)]; } static bool instr_is_branch(u32 opcode) { u32 x = instr_attributes(opcode); if(bb_thumb) { // merge OP_BL_10+OP_BL_11 if (x & MERGE_NEXT) return false; return (x & BRANCH_ALWAYS) || ((x & BRANCH_POS0) && ((opcode&7) | ((opcode>>4)&8)) == 15) || (x & BRANCH_SWI) || (x & JIT_BYPASS); } else return (x & BRANCH_ALWAYS) || ((x & BRANCH_POS12) && REG_POS(opcode,12) == 15) || ((x & BRANCH_LDM) && BIT15(opcode)) || (x & BRANCH_SWI) || (x & JIT_BYPASS); } static bool instr_uses_r15(u32 opcode) { u32 x = instr_attributes(opcode); if(bb_thumb) return ((x & SRCREG_POS0) && ((opcode&7) | ((opcode>>4)&8)) == 15) || ((x & SRCREG_POS3) && REG_POS(opcode,3) == 15) || (x & JIT_BYPASS); else return ((x & SRCREG_POS0) && REG_POS(opcode,0) == 15) || ((x & SRCREG_POS8) && REG_POS(opcode,8) == 15) || ((x & SRCREG_POS12) && REG_POS(opcode,12) == 15) || ((x & SRCREG_POS16) && REG_POS(opcode,16) == 15) || ((x & SRCREG_STM) && BIT15(opcode)) || (x & JIT_BYPASS); } static bool instr_is_conditional(u32 opcode) { if(bb_thumb) return false; return !(CONDITION(opcode) == 0xE || (CONDITION(opcode) == 0xF && CODE(opcode) == 5)); } static int instr_cycles(u32 opcode) { u32 x = instr_attributes(opcode); u32 c = (x & INSTR_CYCLES_MASK); if(c == INSTR_CYCLES_VARIABLE) { if ((x & BRANCH_SWI) && !cpu->swi_tab) return 3; return 0; } if(instr_is_branch(opcode) && !(instr_attributes(opcode) & (BRANCH_ALWAYS|BRANCH_LDM))) c += 2; return c; } static bool instr_does_prefetch(u32 opcode) { u32 x = instr_attributes(opcode); if(bb_thumb) return thumb_instruction_compilers[opcode>>6] && (x & BRANCH_ALWAYS); else return instr_is_branch(opcode) && arm_instruction_compilers[INSTRUCTION_INDEX(opcode)] && ((x & BRANCH_ALWAYS) || (x & BRANCH_LDM)); } static const char *disassemble(u32 opcode) { if(bb_thumb) return thumb_instruction_names[opcode>>6]; static char str[100]; strcpy(str, arm_instruction_names[INSTRUCTION_INDEX(opcode)]); static const char *conds[16] = {"EQ","NE","CS","CC","MI","PL","VS","VC","HI","LS","GE","LT","GT","LE","AL","NV"}; if(instr_is_conditional(opcode)) { strcat(str, "."); strcat(str, conds[CONDITION(opcode)]); } return str; } static void sync_r15(u32 opcode, bool is_last, bool force) { if(instr_does_prefetch(opcode)) { if(force) { //assert(!instr_uses_r15(opcode)); JIT_COMMENT("sync_r15: force instruct_adr %08Xh (PREFETCH)", bb_adr); c.mov(cpu_ptr(instruct_adr), bb_next_instruction); } } else { if(force || (instr_attributes(opcode) & JIT_BYPASS) || (instr_attributes(opcode) & BRANCH_SWI) || (is_last && !instr_is_branch(opcode))) { JIT_COMMENT("sync_r15: next_instruction %08Xh - %s%s%s%s", bb_next_instruction, force?" FORCE":"", (instr_attributes(opcode) & JIT_BYPASS)?" BYPASS":"", (instr_attributes(opcode) & BRANCH_SWI)?" SWI":"", (is_last && !instr_is_branch(opcode))?" LAST":"" ); c.mov(cpu_ptr(next_instruction), bb_next_instruction); } if(instr_uses_r15(opcode)) { JIT_COMMENT("sync_r15: R15 %08Xh (USES R15)", bb_r15); c.mov(reg_ptr(15), bb_r15); } if(instr_attributes(opcode) & JIT_BYPASS) { JIT_COMMENT("sync_r15: instruct_adr %08Xh (JIT_BYPASS)", bb_adr); c.mov(cpu_ptr(instruct_adr), bb_adr); } } } static void emit_branch(int cond, Label to) { JIT_COMMENT("emit_branch cond %02X", cond); static const u8 cond_bit[] = {0x40, 0x40, 0x20, 0x20, 0x80, 0x80, 0x10, 0x10}; if(cond < 8) { c.test(flags_ptr, cond_bit[cond]); (cond & 1)?c.jnz(to):c.jz(to); } else { GpVar x = c.newGpVar(kX86VarTypeGpz); c.movzx(x, flags_ptr); c.and_(x, 0xF0); #if defined(_M_X64) || defined(__x86_64__) c.add(x, offsetof(armcpu_t,cond_table) + cond); c.test(byte_ptr(bb_cpu, x), 1); #else c.test(byte_ptr_abs((void*)(arm_cond_table + cond), x, kScaleNone), 1); #endif c.unuse(x); c.jz(to); } } static void emit_armop_call(u32 opcode) { ArmOpCompiler fc = bb_thumb? thumb_instruction_compilers[opcode>>6]: arm_instruction_compilers[INSTRUCTION_INDEX(opcode)]; if (fc && fc(opcode)) return; JIT_COMMENT("call interpreter"); GpVar arg = c.newGpVar(kX86VarTypeGpd); c.mov(arg, opcode); OpFunc f = bb_thumb ? thumb_instructions_set[PROCNUM][opcode>>6] : arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)]; X86CompilerFuncCall* ctx = c.call((void*)f); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, arg); ctx->setReturn(bb_cycles); } static void _armlog(u8 proc, u32 addr, u32 opcode) { #if 0 #if 0 fprintf(stderr, "\t\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\n\t\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\n", cpu->R[0], cpu->R[1], cpu->R[2], cpu->R[3], cpu->R[4], cpu->R[5], cpu->R[6], cpu->R[7], cpu->R[8], cpu->R[9], cpu->R[10], cpu->R[11], cpu->R[12], cpu->R[13], cpu->R[14], cpu->R[15], cpu->next_instruction, cpu->CPSR.bits.N, cpu->CPSR.bits.Z, cpu->CPSR.bits.C, cpu->CPSR.bits.V); #endif #define INDEX22(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF)) char dasmbuf[4096]; if(cpu->CPSR.bits.T) des_thumb_instructions_set[((opcode)>>6)&1023](addr, opcode, dasmbuf); else des_arm_instructions_set[INDEX22(opcode)](addr, opcode, dasmbuf); #undef INDEX22 fprintf(stderr, "%s%c %08X\t%08X \t%s\n", cpu->CPSR.bits.T?"THUMB":"ARM", proc?'7':'9', addr, opcode, dasmbuf); #else return; #endif } template static u32 compile_basicblock() { #if LOG_JIT bool has_variable_cycles = FALSE; #endif u32 interpreted_cycles = 0; u32 start_adr = cpu->instruct_adr; u32 opcode = 0; bb_thumb = cpu->CPSR.bits.T; bb_opcodesize = bb_thumb ? 2 : 4; if (!JIT_MAPPED(start_adr & 0x0FFFFFFF, PROCNUM)) { printf("JIT: use unmapped memory address %08X\n", start_adr); execute = false; return 1; } #if LOG_JIT fprintf(stderr, "adr %08Xh %s%c\n", start_adr, ARMPROC.CPSR.bits.T ? "THUMB":"ARM", PROCNUM?'7':'9'); #endif c.clear(); c.newFunc(ASMJIT_CALL_CONV, FuncBuilder0()); c.getFunc()->setHint(kFuncHintNaked, true); c.getFunc()->setHint(kX86FuncHintPushPop, true); JIT_COMMENT("CPU ptr"); bb_cpu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_cpu, (uintptr_t)&ARMPROC); JIT_COMMENT("reset bb_total_cycles"); bb_total_cycles = c.newGpVar(kX86VarTypeGpz); c.mov(bb_total_cycles, 0); #if (PROFILER_JIT_LEVEL > 0) JIT_COMMENT("Profiler ptr"); bb_profiler = c.newGpVar(kX86VarTypeGpz); c.mov(bb_profiler, (uintptr_t)&profiler_counter[PROCNUM]); #endif bb_constant_cycles = 0; for(u32 i=0, bEndBlock = 0; bEndBlock == 0; i++) { bb_adr = start_adr + (i * bb_opcodesize); if(bb_thumb) opcode = _MMU_read16(bb_adr); else opcode = _MMU_read32(bb_adr); #if LOG_JIT char dasmbuf[1024] = {0}; if(bb_thumb) des_thumb_instructions_set[opcode>>6](bb_adr, opcode, dasmbuf); else des_arm_instructions_set[INSTRUCTION_INDEX(opcode)](bb_adr, opcode, dasmbuf); fprintf(stderr, "%08X\t%s\t\t; %s \n", bb_adr, dasmbuf, disassemble(opcode)); #endif u32 cycles = instr_cycles(opcode); bEndBlock = instr_is_branch(opcode) || (i >= (CommonSettings.jit_max_block_size - 1)); #if LOG_JIT if (instr_is_conditional(opcode) && (cycles > 1) || (cycles == 0)) has_variable_cycles = TRUE; #endif bb_cycles = c.newGpVar(kX86VarTypeGpz); bb_constant_cycles += instr_is_conditional(opcode) ? 1 : cycles; JIT_COMMENT("%s (PC:%08X)", disassemble(opcode), bb_adr); #if (PROFILER_JIT_LEVEL > 0) JIT_COMMENT("*** profiler - counter"); if (bb_thumb) c.add(profiler_counter_thumb(opcode), 1); else c.add(profiler_counter_arm(opcode), 1); #endif if(instr_is_conditional(opcode)) { // 25% of conditional instructions are immediately followed by // another with the same condition, but merging them into a // single branch has negligible effect on speed. if(bEndBlock) sync_r15(opcode, 1, 1); Label skip = c.newLabel(); emit_branch(CONDITION(opcode), skip); if(!bEndBlock) sync_r15(opcode, 0, 0); emit_armop_call(opcode); if(cycles == 0) { JIT_COMMENT("variable cycles"); c.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), bb_cycles.r64(), kScaleNone, -1)); } else if (cycles > 1) { JIT_COMMENT("cycles (%d)", cycles); c.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), -1)); } c.bind(skip); } else { sync_r15(opcode, bEndBlock, 0); emit_armop_call(opcode); if(cycles == 0) { JIT_COMMENT("variable cycles"); c.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), bb_cycles.r64(), kScaleNone)); } } interpreted_cycles += op_decode[PROCNUM][bb_thumb](); } if(!instr_does_prefetch(opcode)) { JIT_COMMENT("!instr_does_prefetch: copy next_instruction (%08X) to instruct_adr (%08X)", cpu->next_instruction, cpu->instruct_adr); GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, cpu_ptr(next_instruction)); c.mov(cpu_ptr(instruct_adr), x); c.unuse(x); //c.mov(cpu_ptr(instruct_adr), bb_adr); //c.mov(cpu_ptr(instruct_adr), bb_next_instruction); } JIT_COMMENT("total cycles (block)"); if (bb_constant_cycles > 0) c.add(bb_total_cycles, bb_constant_cycles); #if (PROFILER_JIT_LEVEL > 1) JIT_COMMENT("*** profiler - cycles"); u32 padr = ((start_adr & 0x07FFFFFE) >> 1); bb_profiler_entry = c.newGpVar(kX86VarTypeGpz); c.mov(bb_profiler_entry, (uintptr_t)&profiler_entry[PROCNUM][padr]); c.add(dword_ptr(bb_profiler_entry, offsetof(PROFILER_ENTRY, cycles)), bb_total_cycles); profiler_entry[PROCNUM][padr].addr = start_adr; #endif c.ret(bb_total_cycles); #if LOG_JIT fprintf(stderr, "cycles %d%s\n", bb_constant_cycles, has_variable_cycles ? " + variable" : ""); #endif c.endFunc(); ArmOpCompiled f = (ArmOpCompiled)c.make(); if(c.getError()) { fprintf(stderr, "JIT error at %s%c-%08X: %s\n", bb_thumb?"THUMB":"ARM", PROCNUM?'7':'9', start_adr, getErrorString(c.getError())); f = op_decode[PROCNUM][bb_thumb]; } #if LOG_JIT uintptr_t baddr = (uintptr_t)f; fprintf(stderr, "Block address %08lX\n\n", baddr); fflush(stderr); #endif JIT_COMPILED_FUNC(start_adr, PROCNUM) = (uintptr_t)f; return interpreted_cycles; } template u32 arm_jit_compile() { *PROCNUM_ptr = PROCNUM; // prevent endless recompilation of self-modifying code, which would be a memleak since we only free code all at once. // also allows us to clear compiled_funcs[] while leaving it sparsely allocated, if the OS does memory overcommit. u32 adr = cpu->instruct_adr; u32 mask_adr = (adr & 0x07FFFFFE) >> 4; if(((recompile_counts[mask_adr >> 1] >> 4*(mask_adr & 1)) & 0xF) > 8) { ArmOpCompiled f = op_decode[PROCNUM][cpu->CPSR.bits.T]; JIT_COMPILED_FUNC(adr, PROCNUM) = (uintptr_t)f; return f(); } recompile_counts[mask_adr >> 1] += 1 << 4*(mask_adr & 1); return compile_basicblock(); } template u32 arm_jit_compile<0>(); template u32 arm_jit_compile<1>(); void arm_jit_reset(bool enable, bool suppress_msg) { #if LOG_JIT c.setLogger(&logger); freopen("desmume_jit.log", "w", stderr); #endif #ifdef HAVE_STATIC_CODE_BUFFER scratchptr = scratchpad; #endif if (!suppress_msg) printf("CPU mode: %s\n", enable?"JIT":"Interpreter"); saveBlockSizeJIT = CommonSettings.jit_max_block_size; if (enable) { printf("JIT: max block size %d instruction(s)\n", CommonSettings.jit_max_block_size); #ifdef MAPPED_JIT_FUNCS //these pointers are allocated by asmjit and need freeing #define JITFREE(x) for(int iii=0;iiifree((void*)x[iii]); memset(x,0,sizeof(x)); JITFREE(JIT.MAIN_MEM); JITFREE(JIT.SWIRAM); JITFREE(JIT.ARM9_ITCM); JITFREE(JIT.ARM9_LCDC); JITFREE(JIT.ARM9_BIOS); JITFREE(JIT.ARM7_BIOS); JITFREE(JIT.ARM7_ERAM); JITFREE(JIT.ARM7_WIRAM); JITFREE(JIT.ARM7_WRAM); #undef JITFREE memset(recompile_counts, 0, sizeof(recompile_counts)); init_jit_mem(); #else for(int i=0; i 0) reconstruct(&profiler_counter[0]); reconstruct(&profiler_counter[1]); #if (PROFILER_JIT_LEVEL > 1) for (u8 t = 0; t < 2; t++) { for (u32 i = 0; i < (1<<26); i++) memset(&profiler_entry[t][i], 0, sizeof(PROFILER_ENTRY)); } #endif #endif } #if (PROFILER_JIT_LEVEL > 0) static int pcmp(PROFILER_COUNTER_INFO *info1, PROFILER_COUNTER_INFO *info2) { return (int)(info2->count - info1->count); } #if (PROFILER_JIT_LEVEL > 1) static int pcmp_entry(PROFILER_ENTRY *info1, PROFILER_ENTRY *info2) { return (int)(info1->cycles - info2->cycles); } #endif #endif void arm_jit_close() { #if (PROFILER_JIT_LEVEL > 0) printf("Generating profile report..."); for (u8 proc = 0; proc < 2; proc++) { extern GameInfo gameInfo; u16 last[2] = {0}; PROFILER_COUNTER_INFO *arm_info = NULL; PROFILER_COUNTER_INFO *thumb_info = NULL; arm_info = new PROFILER_COUNTER_INFO[4096]; thumb_info = new PROFILER_COUNTER_INFO[1024]; memset(arm_info, 0, sizeof(PROFILER_COUNTER_INFO) * 4096); memset(thumb_info, 0, sizeof(PROFILER_COUNTER_INFO) * 1024); // ARM last[0] = 0; for (u16 i=0; i < 4096; i++) { u16 t = 0; if (profiler_counter[proc].arm_count[i] == 0) continue; for (t = 0; t < last[0]; t++) { if (strcmp(arm_instruction_names[i], arm_info[t].name) == 0) { arm_info[t].count += profiler_counter[proc].arm_count[i]; break; } } if (t == last[0]) { strcpy(arm_info[last[0]++].name, arm_instruction_names[i]); arm_info[t].count = profiler_counter[proc].arm_count[i]; } } // THUMB last[1] = 0; for (u16 i=0; i < 1024; i++) { u16 t = 0; if (profiler_counter[proc].thumb_count[i] == 0) continue; for (t = 0; t < last[1]; t++) { if (strcmp(thumb_instruction_names[i], thumb_info[t].name) == 0) { thumb_info[t].count += profiler_counter[proc].thumb_count[i]; break; } } if (t == last[1]) { strcpy(thumb_info[last[1]++].name, thumb_instruction_names[i]); thumb_info[t].count = profiler_counter[proc].thumb_count[i]; } } std::qsort(arm_info, last[0], sizeof(PROFILER_COUNTER_INFO), (int (*)(const void *, const void *))pcmp); std::qsort(thumb_info, last[1], sizeof(PROFILER_COUNTER_INFO), (int (*)(const void *, const void *))pcmp); char buf[MAX_PATH] = {0}; sprintf(buf, "desmume_jit%c_counter.profiler", proc==0?'9':'7'); FILE *fp = fopen(buf, "w"); if (fp) { if (!gameInfo.isHomebrew()) { fprintf(fp, "Name: %s\n", gameInfo.ROMname); fprintf(fp, "Serial: %s\n", gameInfo.ROMserial); } else fprintf(fp, "Homebrew\n"); fprintf(fp, "CPU: ARM%c\n\n", proc==0?'9':'7'); if (last[0]) { fprintf(fp, "========================================== ARM ==========================================\n"); for (int i=0; i < last[0]; i++) fprintf(fp, "%30s: %20ld\n", arm_info[i].name, arm_info[i].count); fprintf(fp, "\n"); } if (last[1]) { fprintf(fp, "========================================== THUMB ==========================================\n"); for (int i=0; i < last[1]; i++) fprintf(fp, "%30s: %20ld\n", thumb_info[i].name, thumb_info[i].count); fprintf(fp, "\n"); } fclose(fp); } delete [] arm_info; arm_info = NULL; delete [] thumb_info; thumb_info = NULL; #if (PROFILER_JIT_LEVEL > 1) sprintf(buf, "desmume_jit%c_entry.profiler", proc==0?'9':'7'); fp = fopen(buf, "w"); if (fp) { u32 count = 0; PROFILER_ENTRY *tmp = NULL; fprintf(fp, "Entrypoints (cycles):\n"); tmp = new PROFILER_ENTRY[1<<26]; memset(tmp, 0, sizeof(PROFILER_ENTRY) * (1<<26)); for (u32 i = 0; i < (1<<26); i++) { if (profiler_entry[proc][i].cycles == 0) continue; memcpy(&tmp[count++], &profiler_entry[proc][i], sizeof(PROFILER_ENTRY)); } std::qsort(tmp, count, sizeof(PROFILER_ENTRY), (int (*)(const void *, const void *))pcmp_entry); if (!gameInfo.isHomebrew()) { fprintf(fp, "Name: %s\n", gameInfo.ROMname); fprintf(fp, "Serial: %s\n", gameInfo.ROMserial); } else fprintf(fp, "Homebrew\n"); fprintf(fp, "CPU: ARM%c\n\n", proc==0?'9':'7'); while ((count--) > 0) fprintf(fp, "%08X: %20ld\n", tmp[count].addr, tmp[count].cycles); delete [] tmp; tmp = NULL; fclose(fp); } #endif } printf(" done.\n"); #endif } #endif // HAVE_JIT desmume-0.9.11/src/debug.cpp0000755000000000000000000003050412467662066014344 0ustar rootroot/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2006-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "debug.h" #include #include #include #include "MMU.h" #include "armcpu.h" #include "instructions.h" #include "cp15.h" #include "NDSSystem.h" #include "utils/xstring.h" #include "movie.h" #ifdef HAVE_LUA #include "lua-engine.h" #endif armcpu_t* TDebugEventData::cpu() { return procnum==0?&NDS_ARM9:&NDS_ARM7; } TDebugEventData DebugEventData; u32 debugFlag; //DEBUG CONFIGURATION const bool debug_acl = false; const bool debug_cacheMiss = false; static bool acl_check_access(u32 adr, u32 access) { //non-user modes get separate access handling, so check that here if(NDS_ARM9.CPSR.bits.mode != USR) access |= 1; if (cp15.isAccessAllowed(adr,access)==FALSE) { HandleDebugEvent(DEBUG_EVENT_ACL_EXCEPTION); } return true; } void HandleDebugEvent_ACL_Exception() { printf("ACL EXCEPTION!\n"); if(DebugEventData.memAccessType == MMU_AT_CODE) armcpu_exception(DebugEventData.cpu(),EXCEPTION_PREFETCH_ABORT); else if(DebugEventData.memAccessType == MMU_AT_DATA) armcpu_exception(DebugEventData.cpu(),EXCEPTION_DATA_ABORT); } static bool CheckRange(u32 adr, u32 min, u32 len) { return (adr>=min && adr static bool debugStatsSort(int num1, int num2) { if(which==0) { if(combinedHits[proc].arm[num2] == combinedHits[proc].arm[num1]) return false; if(combinedHits[proc].arm[num1] == 0xFFFFFFFF) return false; if(combinedHits[proc].arm[num2] == 0xFFFFFFFF) return true; return combinedHits[proc].arm[num2] < combinedHits[proc].arm[num1]; } else { if(combinedHits[proc].thumb[num2] == combinedHits[proc].thumb[num1]) return false; if(combinedHits[proc].thumb[num1] == 0xFFFFFFFF) return false; if(combinedHits[proc].thumb[num2] == 0xFFFFFFFF) return true; return combinedHits[proc].thumb[num2] < combinedHits[proc].thumb[num1]; } } void DebugStatistics::print() { //consolidate opcodes with the same names for(int i=0;i<2;i++) { combinedHits[i] = DEBUG_statistics.instructionHits[i]; for(int j=0;j<4096;j++) { if(combinedHits[i].arm[j] == 0xFFFFFFFF) continue; std::string name = arm_instruction_names[j]; for(int k=j+1;k<4096;k++) { if(combinedHits[i].arm[k] == 0xFFFFFFFF) continue; if(name == arm_instruction_names[k]) { //printf("combining %s with %d and %d\n",name.c_str(),combinedHits[i].arm[j],combinedHits[i].arm[k]); combinedHits[i].arm[j] += combinedHits[i].arm[k]; combinedHits[i].arm[k] = 0xFFFFFFFF; } } } for(int j=0;j<1024;j++) { if(combinedHits[i].thumb[j] == 0xFFFFFFFF) continue; std::string name = thumb_instruction_names[j]; for(int k=j+1;k<1024;k++) { if(combinedHits[i].thumb[k] == 0xFFFFFFFF) continue; if(name == thumb_instruction_names[k]) { //printf("combining %s with %d and %d\n",name.c_str(),combinedHits[i].arm[j],combinedHits[i].arm[k]); combinedHits[i].thumb[j] += combinedHits[i].thumb[k]; combinedHits[i].thumb[k] = 0xFFFFFFFF; } } } } InstructionHits sorts[2]; for(int i=0;i<2;i++) { for(int j=0;j<4096;j++) sorts[i].arm[j] = j; for(int j=0;j<1024;j++) sorts[i].thumb[j] = j; } std::sort(sorts[0].arm, sorts[0].arm+4096, debugStatsSort<0,0>); std::sort(sorts[0].thumb, sorts[0].thumb+1024, debugStatsSort<0,1>); std::sort(sorts[1].arm, sorts[1].arm+4096, debugStatsSort<1,0>); std::sort(sorts[1].thumb, sorts[1].thumb+1024, debugStatsSort<1,1>); for(int i=0;i<2;i++) { printf("Top arm instructions for ARM%d:\n",7+i*2); for(int j=0;j<10;j++) { int val = sorts[i].arm[j]; printf("%08d: %s\n", combinedHits[i].arm[val], arm_instruction_names[val]); } printf("Top thumb instructions for ARM%d:\n",7+i*2); for(int j=0;j<10;j++) { int val = sorts[i].thumb[j]; printf("%08d: %s\n", combinedHits[i].thumb[val], thumb_instruction_names[val]); } } } void DebugStatistics::printSequencerExecutionCounters() { for(int i=0;i<21;i++) printf("%06d ",sequencerExecutionCounters[i]); printf("\n"); } void DEBUG_reset() { //for now, just enable all debugging in developer builds #ifdef DEVELOPER debugFlag = 1; #endif DEBUG_Notify = DebugNotify(); DEBUG_statistics = DebugStatistics(); printf("DEBUG_reset: %08X\n",&DebugStatistics::print); //force a reference to this function } static void DEBUG_dumpMemory_fill(EMUFILE *fp, u32 size) { static std::vector buf; buf.resize(size); memset(&buf[0],0,size); fp->fwrite(&buf[0],size); } void DEBUG_dumpMemory(EMUFILE* fp) { fp->fseek(0x000000,SEEK_SET); fp->fwrite(MMU.MAIN_MEM,0x800000); //arm9 main mem (8192K) fp->fseek(0x900000,SEEK_SET); fp->fwrite(MMU.ARM9_DTCM,0x4000); //arm9 DTCM (16K) fp->fseek(0xA00000,SEEK_SET); fp->fwrite(MMU.ARM9_ITCM,0x8000); //arm9 ITCM (32K) fp->fseek(0xB00000,SEEK_SET); fp->fwrite(MMU.ARM9_LCD,0xA4000); //LCD mem 656K fp->fseek(0xC00000,SEEK_SET); fp->fwrite(MMU.ARM9_VMEM,0x800); //OAM fp->fseek(0xD00000,SEEK_SET); fp->fwrite(MMU.ARM7_ERAM,0x10000); //arm7 WRAM (64K) fp->fseek(0xE00000,SEEK_SET); fp->fwrite(MMU.ARM7_WIRAM,0x10000); //arm7 wifi RAM ? fp->fseek(0xF00000,SEEK_SET); fp->fwrite(MMU.SWIRAM,0x8000); //arm9/arm7 shared WRAM (32KB) } //---------------------------------------------------- std::vector Logger::channels; static void defaultCallback(const Logger& logger, const char * message) { logger.getOutput() << message; } Logger::Logger() { out = &std::cout; callback = defaultCallback; flags = 0; } Logger::~Logger() { for(int i=0;i<(int)channels.size();i++) delete channels[i]; } void Logger::vprintf(const char * format, va_list l, const char * file, unsigned int line) { char buffer[1024]; char * cur = buffer; if (flags & Logger::FILE) cur += sprintf(cur, "%s:", file); if (flags & Logger::LINE) cur += sprintf(cur, "%d:", line); if (flags) cur += sprintf(cur, " "); ::vsnprintf(cur, 1024, format, l); callback(*this, buffer); } void Logger::setOutput(std::ostream * o) { out = o; } void Logger::setCallback(void (*cback)(const Logger& logger, const char * message)) { callback = cback; } void Logger::setFlag(unsigned int flag) { this->flags = flag; } void Logger::fixSize(unsigned int channel) { while(channel >= channels.size()) { channels.push_back(new Logger()); } } std::ostream& Logger::getOutput() const { return *out; } void Logger::log(unsigned int channel, const char * file, unsigned int line, const char * format, ...) { fixSize(channel); va_list l; va_start(l, format); channels[channel]->vprintf(format, l, file, line); va_end(l); } void Logger::log(unsigned int channel, const char * file, unsigned int line, std::ostream& os) { fixSize(channel); channels[channel]->setOutput(&os); } void Logger::log(unsigned int channel, const char * file, unsigned int line, unsigned int flag) { fixSize(channel); channels[channel]->setFlag(flag); } void Logger::log(unsigned int channel, const char * file, unsigned int line, void (*callback)(const Logger& logger, const char * message)) { fixSize(channel); channels[channel]->setCallback(callback); } void IdeasLog(armcpu_t* cpu) { u32 adr = cpu->R[0]; for(;;) { u8 c = _MMU_read08(cpu->proc_ID, MMU_AT_DEBUG, adr); adr++; if(!c) break; printf("%c",c); } //don't emit a newline. that is a pain in the butt. } void NocashMessage(armcpu_t* cpu, int offset) { u32 adr = cpu->instruct_adr + offset; std::string todo; for(;;) { u8 c = _MMU_read08(cpu->proc_ID, MMU_AT_DEBUG, adr); adr++; if(!c) break; todo.push_back(c); } //r0,r1,r2,...,r15 show register content (displayed as 32bit Hex number) //sp,lr,pc alias for r13,r14,r15 //scanline show current scanline number //frame show total number of frames since coldboot //totalclks show total number of clock cycles since coldboot //lastclks show number of cycles since previous lastclks (or zeroclks) //zeroclks resets the 'lastclks' counter //this is very inefficiently coded! char tmp[100]; todo = mass_replace(todo,"%sp%","%r13%"); todo = mass_replace(todo,"%lr%","%r14%"); todo = mass_replace(todo,"%pc%","%r15%"); sprintf(tmp,"%08X",cpu->R[0]); todo = mass_replace(todo,"%r0%",tmp); sprintf(tmp,"%08X",cpu->R[1]); todo = mass_replace(todo,"%r1%",tmp); sprintf(tmp,"%08X",cpu->R[2]); todo = mass_replace(todo,"%r2%",tmp); sprintf(tmp,"%08X",cpu->R[3]); todo = mass_replace(todo,"%r3%",tmp); sprintf(tmp,"%08X",cpu->R[4]); todo = mass_replace(todo,"%r4%",tmp); sprintf(tmp,"%08X",cpu->R[5]); todo = mass_replace(todo,"%r5%",tmp); sprintf(tmp,"%08X",cpu->R[6]); todo = mass_replace(todo,"%r6%",tmp); sprintf(tmp,"%08X",cpu->R[7]); todo = mass_replace(todo,"%r7%",tmp); sprintf(tmp,"%08X",cpu->R[8]); todo = mass_replace(todo,"%r8%",tmp); sprintf(tmp,"%08X",cpu->R[9]); todo = mass_replace(todo,"%r9%",tmp); sprintf(tmp,"%08X",cpu->R[10]); todo = mass_replace(todo,"%r10%",tmp); sprintf(tmp,"%08X",cpu->R[11]); todo = mass_replace(todo,"%r11%",tmp); sprintf(tmp,"%08X",cpu->R[12]); todo = mass_replace(todo,"%r12%",tmp); sprintf(tmp,"%08X",cpu->R[13]); todo = mass_replace(todo,"%r13%",tmp); sprintf(tmp,"%08X",cpu->R[14]); todo = mass_replace(todo,"%r14%",tmp); sprintf(tmp,"%08X",cpu->R[15]); todo = mass_replace(todo,"%r15%",tmp); sprintf(tmp,"%d",nds.VCount); todo = mass_replace(todo,"%scanline%",tmp); sprintf(tmp,"%d",currFrameCounter); todo = mass_replace(todo,"%frame%",tmp); sprintf(tmp,"%lld",nds_timer); todo = mass_replace(todo,"%totalclks%",tmp); printf("%s",todo.c_str()); } //------- DebugNotify DEBUG_Notify; //enable bits arent being used right now. //if you want exhaustive logging, move the print before the early return (or comment the early return) //the intent of this system is to provide a compact dialog box showing which debug notifies have been //triggered in this frame (with a glowing LED!) and which debug notifies have been triggered EVER //which can be cleared, like a clip indicator in an audio tool. //obviously all this isnt implemented yet. void DebugNotify::NextFrame() { #ifdef DEVELOPER pingBits.reset(); #endif } void DebugNotify::ReadBeyondEndOfCart(u32 addr, u32 romsize) { #ifdef DEVELOPER if(!ping(DEBUG_NOTIFY_READ_BEYOND_END_OF_CART)) return; INFO("Reading beyond end of cart! ... %08X >= %08X\n",addr,romsize); #endif } bool DebugNotify::ping(EDEBUG_NOTIFY which) { bool wasPinged = pingBits[(int)which]; pingBits[(int)which] = true; return !wasPinged; } desmume-0.9.11/src/cheatSystem.cpp0000755000000000000000000010035012467662066015544 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "cheatSystem.h" #include "bits.h" #include "NDSSystem.h" #include "common.h" #include "mem.h" #include "MMU.h" #include "debug.h" #include "utils/xstring.h" #ifndef _MSC_VER #include #endif CHEATS *cheats = NULL; CHEATSEARCH *cheatSearch = NULL; void CHEATS::clear() { list.resize(0); currentGet = 0; } void CHEATS::init(char *path) { clear(); strcpy((char *)filename, path); load(); } BOOL CHEATS::add(u8 size, u32 address, u32 val, char *description, BOOL enabled) { size_t num = list.size(); list.push_back(CHEATS_LIST()); list[num].code[0][0] = address & 0x00FFFFFF; list[num].code[0][1] = val; list[num].num = 1; list[num].type = 0; list[num].size = size; this->setDescription(description, num); list[num].enabled = enabled; return TRUE; } BOOL CHEATS::update(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos) { if (pos >= list.size()) return FALSE; list[pos].code[0][0] = address & 0x00FFFFFF; list[pos].code[0][1] = val; list[pos].num = 1; list[pos].type = 0; list[pos].size = size; this->setDescription(description, pos); list[pos].enabled = enabled; return TRUE; } void CHEATS::ARparser(CHEATS_LIST& list) { u8 type = 0; u8 subtype = 0; u32 hi = 0; u32 lo = 0; u32 addr = 0; u32 val = 0; // AR temporary vars & flags u32 offset = 0; u32 datareg = 0; u32 loopcount = 0; u32 counter = 0; u32 if_flag = 0; s32 loopbackline = 0; u32 loop_flag = 0; for (int i=0; i < list.num; i++) { type = list.code[i][0] >> 28; subtype = (list.code[i][0] >> 24) & 0x0F; hi = list.code[i][0] & 0x0FFFFFFF; lo = list.code[i][1]; if (if_flag > 0) { if ((type == 0x0E)) i += ((lo + 7) / 8); if ( (type == 0x0D) && (subtype == 0)) if_flag--; // ENDIF if ( (type == 0x0D) && (subtype == 2)) // NEXT & Flush { if (loop_flag) i = (loopbackline-1); else { offset = 0; datareg = 0; loopcount = 0; counter = 0; if_flag = 0; loop_flag = 0; } } continue; } switch (type) { case 0x00: { if (hi==0) { //manual hook } else if ((hi==0x0000AA99) && (lo==0)) // 0000AA99 00000000 parameter bytes 9..10 for above code (padded with 00s) { //parameter bytes 9..10 for above code (padded with 00s) } else // 0XXXXXXX YYYYYYYY word[XXXXXXX+offset] = YYYYYYYY { addr = hi + offset; _MMU_write32(addr, lo); } } break; case 0x01: // 1XXXXXXX 0000YYYY half[XXXXXXX+offset] = YYYY addr = hi + offset; _MMU_write16(addr, lo); break; case 0x02: // 2XXXXXXX 000000YY byte[XXXXXXX+offset] = YY addr = hi + offset; _MMU_write08(addr, lo); break; case 0x03: // 3XXXXXXX YYYYYYYY IF YYYYYYYY > word[XXXXXXX] ;unsigned if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo > val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x04: // 4XXXXXXX YYYYYYYY IF YYYYYYYY < word[XXXXXXX] ;unsigned if ((hi == 0x04332211) && (lo == 88776655)) //44332211 88776655 parameter bytes 1..8 for above code (example) { break; } if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo < val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x05: // 5XXXXXXX YYYYYYYY IF YYYYYYYY = word[XXXXXXX] if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo == val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x06: // 6XXXXXXX YYYYYYYY IF YYYYYYYY <> word[XXXXXXX] if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo != val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x07: // 7XXXXXXX ZZZZYYYY IF YYYY > ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) > ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x08: // 8XXXXXXX ZZZZYYYY IF YYYY < ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) < ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x09: // 9XXXXXXX ZZZZYYYY IF YYYY = ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) == ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x0A: // AXXXXXXX ZZZZYYYY IF YYYY <> ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) != ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x0B: // BXXXXXXX 00000000 offset = word[XXXXXXX+offset] addr = hi + offset; offset = _MMU_read32(addr);; break; case 0x0C: switch (subtype) { case 0x0: // C0000000 YYYYYYYY FOR loopcount=0 to YYYYYYYY ;execute Y+1 times if (loopcount < (lo+1)) loop_flag = 1; else loop_flag = 0; loopcount++; loopbackline = i; break; case 0x4: // C4000000 00000000 offset = address of the C4000000 code ; V1.54 printf("AR: untested code C4\n"); break; case 0x5: // C5000000 XXXXYYYY counter=counter+1, IF (counter AND YYYY) = XXXX ; V1.54 counter++; if ( (counter & (lo & 0xFFFF)) == ((lo >> 8) & 0xFFFF) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x6: // C6000000 XXXXXXXX [XXXXXXXX]=offset ; V1.54 _MMU_write32(lo, offset); break; } break; case 0x0D: { switch (subtype) { case 0x0: // D0000000 00000000 ENDIF break; case 0x1: // D1000000 00000000 NEXT loopcount if (loop_flag) i = (loopbackline-1); break; case 0x2: // D2000000 00000000 NEXT loopcount, and then FLUSH everything if (loop_flag) i = (loopbackline-1); else { offset = 0; datareg = 0; loopcount = 0; counter = 0; if_flag = 0; loop_flag = 0; } break; case 0x3: // D3000000 XXXXXXXX offset = XXXXXXXX offset = lo; break; case 0x4: // D4000000 XXXXXXXX datareg = datareg + XXXXXXXX datareg += lo; break; case 0x5: // D5000000 XXXXXXXX datareg = XXXXXXXX datareg = lo; break; case 0x6: // D6000000 XXXXXXXX word[XXXXXXXX+offset]=datareg, offset=offset+4 addr = lo + offset; _MMU_write32(addr, datareg); offset += 4; break; case 0x7: // D7000000 XXXXXXXX half[XXXXXXXX+offset]=datareg, offset=offset+2 addr = lo + offset; _MMU_write16(addr, datareg); offset += 2; break; case 0x8: // D8000000 XXXXXXXX byte[XXXXXXXX+offset]=datareg, offset=offset+1 addr = lo + offset; _MMU_write08(addr, datareg); offset += 1; break; case 0x9: // D9000000 XXXXXXXX datareg = word[XXXXXXXX+offset] addr = lo + offset; datareg = _MMU_read32(addr); break; case 0xA: // DA000000 XXXXXXXX datareg = half[XXXXXXXX+offset] addr = lo + offset; datareg = _MMU_read16(addr); break; case 0xB: // DB000000 XXXXXXXX datareg = byte[XXXXXXXX+offset] ;bugged on pre-v1.54 addr = lo + offset; datareg = _MMU_read08(addr); break; case 0xC: // DC000000 XXXXXXXX offset = offset + XXXXXXXX offset += lo; break; } } break; case 0xE: // EXXXXXXX YYYYYYYY Copy YYYYYYYY parameter bytes to [XXXXXXXX+offset...] { u8 *tmp_code = (u8*)(list.code[i+1]); u32 addr = hi+offset; u32 maxByteReadLocation = ((2 * 4) * (MAX_XX_CODE - i - 1)) - 1; // 2 = 2 array dimensions, 4 = 4 bytes per array element if (lo <= maxByteReadLocation) { for (u32 t = 0; t < lo; t++) { u8 tmp = tmp_code[t]; _MMU_write08(addr, tmp); addr++; } } i += ((lo + 7) / 8); } break; case 0xF: // FXXXXXXX YYYYYYYY Copy YYYYYYYY bytes from [offset..] to [XXXXXXX...] for (u32 t = 0; t < lo; t++) { u8 tmp = _MMU_read08(offset+t); _MMU_write08(hi+t, tmp); } break; default: PROGINFO("AR: ERROR unknown command 0x%2X at %08X:%08X\n", type, hi, lo); break; } } } BOOL CHEATS::add_AR_Direct(CHEATS_LIST cheat) { size_t num = list.size(); list.push_back(cheat); list[num].type = 1; return TRUE; } BOOL CHEATS::add_AR(char *code, char *description, BOOL enabled) { //if (num == MAX_CHEAT_LIST) return FALSE; size_t num = list.size(); CHEATS_LIST temp; if (!CHEATS::XXCodeFromString(&temp, code)) return FALSE; list.push_back(temp); list[num].type = 1; this->setDescription(description, num); list[num].enabled = enabled; return TRUE; } BOOL CHEATS::update_AR(char *code, char *description, BOOL enabled, u32 pos) { if (pos >= list.size()) return FALSE; if (code != NULL) { if (!CHEATS::XXCodeFromString(this->getItemByIndex(pos), code)) return FALSE; this->setDescription(description, pos); list[pos].type = 1; } list[pos].enabled = enabled; return TRUE; } BOOL CHEATS::add_CB(char *code, char *description, BOOL enabled) { //if (num == MAX_CHEAT_LIST) return FALSE; size_t num = list.size(); if (!CHEATS::XXCodeFromString(this->getItemByIndex(num), code)) return FALSE; list[num].type = 2; this->setDescription(description, num); list[num].enabled = enabled; return TRUE; } BOOL CHEATS::update_CB(char *code, char *description, BOOL enabled, u32 pos) { if (pos >= list.size()) return FALSE; if (code != NULL) { if (!CHEATS::XXCodeFromString(this->getItemByIndex(pos), code)) return FALSE; list[pos].type = 2; this->setDescription(description, pos); } list[pos].enabled = enabled; return TRUE; } BOOL CHEATS::remove(u32 pos) { if (pos >= list.size()) return FALSE; if (list.size() == 0) return FALSE; list.erase(list.begin()+pos); return TRUE; } void CHEATS::getListReset() { currentGet = 0; return; } BOOL CHEATS::getList(CHEATS_LIST *cheat) { BOOL result = FALSE; if (currentGet >= this->list.size()) { this->getListReset(); return result; } result = this->get(cheat, currentGet++); return result; } CHEATS_LIST* CHEATS::getListPtr() { return &this->list[0]; } BOOL CHEATS::get(CHEATS_LIST *cheat, u32 pos) { CHEATS_LIST *item = this->getItemByIndex(pos); if (item == NULL) { return FALSE; } *cheat = *item; return TRUE; } CHEATS_LIST* CHEATS::getItemByIndex(const u32 pos) { if (pos >= this->getSize()) { return NULL; } return &this->list[pos]; } u32 CHEATS::getSize() { return list.size(); } size_t CHEATS::getActiveCount() { size_t activeCheatCount = 0; const size_t cheatListCount = this->getSize(); for (size_t i = 0; i < cheatListCount; i++) { if (list[i].enabled) { activeCheatCount++; } } return activeCheatCount; } void CHEATS::setDescription(const char *description, u32 pos) { strncpy(list[pos].description, description, sizeof(list[pos].description)); list[pos].description[sizeof(list[pos].description) - 1] = '\0'; } BOOL CHEATS::save() { const char *types[] = {"DS", "AR", "CB"}; std::string cheatLineStr = ""; FILE *flist = fopen((char *)filename, "w"); if (flist) { fprintf(flist, "; DeSmuME cheats file. VERSION %i.%03i\n", CHEAT_VERSION_MAJOR, CHEAT_VERSION_MINOR); fprintf(flist, "Name=%s\n", gameInfo.ROMname); fprintf(flist, "Serial=%s\n", gameInfo.ROMserial); fputs("\n; cheats list\n", flist); for (size_t i = 0; i < list.size(); i++) { if (list[i].num == 0) continue; char buf1[8] = {0}; sprintf(buf1, "%s %c ", types[list[i].type], list[i].enabled?'1':'0'); cheatLineStr = buf1; for (int t = 0; t < list[i].num; t++) { char buf2[10] = { 0 }; u32 adr = list[i].code[t][0]; if (list[i].type == 0) { //size of the cheat is written out as adr highest nybble adr &= 0x0FFFFFFF; adr |= (list[i].size << 28); } sprintf(buf2, "%08X", adr); cheatLineStr += buf2; sprintf(buf2, "%08X", list[i].code[t][1]); cheatLineStr += buf2; if (t < (list[i].num - 1)) cheatLineStr += ","; } cheatLineStr += " ;"; cheatLineStr += trim(list[i].description); fprintf(flist, "%s\n", cheatLineStr.c_str()); } fputs("\n", flist); fclose(flist); return TRUE; } return FALSE; } char *CHEATS::clearCode(char *s) { char *buf = s; if (!s) return NULL; if (!*s) return s; for (u32 i = 0; i < strlen(s); i++) { if (s[i] == ';') break; if (strchr(hexValid, s[i])) { *buf = s[i]; buf++; } } *buf = 0; return s; } BOOL CHEATS::load() { FILE *flist = fopen((char *)filename, "r"); if (flist == NULL) { return FALSE; } size_t readSize = (MAX_XX_CODE * 17) + sizeof(list[0].description) + 7; if (readSize < CHEAT_FILE_MIN_FGETS_BUFFER) { readSize = CHEAT_FILE_MIN_FGETS_BUFFER; } char *buf = (char *)malloc(readSize); if (buf == NULL) { fclose(flist); return FALSE; } readSize *= sizeof(*buf); std::string codeStr = ""; u32 last = 0; u32 line = 0; INFO("Load cheats: %s\n", filename); clear(); last = 0; line = 0; while (!feof(flist)) { CHEATS_LIST tmp_cht; line++; // only for debug memset(buf, 0, readSize); if (fgets(buf, readSize, flist) == NULL) { //INFO("Cheats: Failed to read from flist at line %i\n", line); continue; } trim(buf); if ((buf[0] == 0) || (buf[0] == ';')) continue; if(!strncasecmp(buf,"name=",5)) continue; if(!strncasecmp(buf,"serial=",7)) continue; memset(&tmp_cht, 0, sizeof(tmp_cht)); if ((buf[0] == 'D') && (buf[1] == 'S')) // internal tmp_cht.type = 0; else if ((buf[0] == 'A') && (buf[1] == 'R')) // Action Replay tmp_cht.type = 1; else if ((buf[0] == 'B') && (buf[1] == 'S')) // Codebreaker tmp_cht.type = 2; else continue; // TODO: CB not supported if (tmp_cht.type == 3) { INFO("Cheats: Codebreaker code no supported at line %i\n", line); continue; } codeStr = (char *)(buf + 5); codeStr = clearCode((char *)codeStr.c_str()); if (codeStr.empty() || (codeStr.length() % 16 != 0)) { INFO("Cheats: Syntax error at line %i\n", line); continue; } tmp_cht.enabled = (buf[3] == '0')?FALSE:TRUE; u32 descr_pos = (u32)(std::max(strchr((char*)buf, ';') - buf, 0)); if (descr_pos != 0) { strncpy(tmp_cht.description, (buf + descr_pos + 1), sizeof(tmp_cht.description)); tmp_cht.description[sizeof(tmp_cht.description) - 1] = '\0'; } tmp_cht.num = codeStr.length() / 16; if ((tmp_cht.type == 0) && (tmp_cht.num > 1)) { INFO("Cheats: Too many values for internal cheat\n", line); continue; } for (int i = 0; i < tmp_cht.num; i++) { char tmp_buf[9] = {0}; strncpy(tmp_buf, &codeStr[i * 16], 8); sscanf_s(tmp_buf, "%x", &tmp_cht.code[i][0]); if (tmp_cht.type == 0) { tmp_cht.size = std::min(3, ((tmp_cht.code[i][0] & 0xF0000000) >> 28)); tmp_cht.code[i][0] &= 0x00FFFFFF; } strncpy(tmp_buf, &codeStr[(i * 16) + 8], 8); sscanf_s(tmp_buf, "%x", &tmp_cht.code[i][1]); } list.push_back(tmp_cht); last++; } free(buf); buf = NULL; fclose(flist); INFO("Added %i cheat codes\n", list.size()); return TRUE; } void CHEATS::process() { if (CommonSettings.cheatsDisable) return; if (list.size() == 0) return; size_t num = list.size(); for (size_t i = 0; i < num; i++) { if (!list[i].enabled) continue; switch (list[i].type) { case 0: // internal cheat system { //INFO("list at 0x02|%06X value %i (size %i)\n",list[i].code[0], list[i].lo[0], list[i].size); u32 addr = list[i].code[0][0] | 0x02000000; u32 val = list[i].code[0][1]; switch (list[i].size) { case 0: _MMU_write08(addr,val); break; case 1: _MMU_write16(addr,val); break; case 2: { u32 tmp = _MMU_read32(addr); tmp &= 0xFF000000; tmp |= (val & 0x00FFFFFF); _MMU_write32(addr,tmp); break; } case 3: _MMU_write32(addr,val); break; } break; } //end case 0 internal cheat system case 1: // Action Replay ARparser(list[i]); break; case 2: // Codebreaker break; default: continue; } } } void CHEATS::getXXcodeString(CHEATS_LIST list, char *res_buf) { char buf[50] = { 0 }; for (int i=0; i < list.num; i++) { sprintf(buf, "%08X %08X\n", list.code[i][0], list.code[i][1]); strcat(res_buf, buf); } } BOOL CHEATS::XXCodeFromString(CHEATS_LIST *cheatItem, const std::string codeString) { return CHEATS::XXCodeFromString(cheatItem, codeString.c_str()); } BOOL CHEATS::XXCodeFromString(CHEATS_LIST *cheatItem, const char *codeString) { BOOL result = FALSE; if (cheatItem == NULL || codeString == NULL) { return result; } int count = 0; u16 t = 0; char tmp_buf[sizeof(cheatItem->code) * 2 + 1]; memset(tmp_buf, 0, sizeof(tmp_buf)); size_t code_len = strlen(codeString); // remove wrong chars for (size_t i=0; i < code_len; i++) { char c = codeString[i]; //apparently 100% of pokemon codes were typed with the letter O in place of zero in some places //so let's try to adjust for that here static const char *AR_Valid = "Oo0123456789ABCDEFabcdef"; if (strchr(AR_Valid, c)) { if(c=='o' || c=='O') c='0'; tmp_buf[t++] = c; } } size_t len = strlen(tmp_buf); if ((len % 16) != 0) return result; // error // TODO: syntax check count = (len / 16); for (int i=0; i < count; i++) { char buf[9] = {0}; memcpy(buf, tmp_buf+(i*16), 8); sscanf(buf, "%x", &cheatItem->code[i][0]); memcpy(buf, tmp_buf+(i*16) + 8, 8); sscanf(buf, "%x", &cheatItem->code[i][1]); } cheatItem->num = count; cheatItem->size = 0; result = TRUE; return result; } // ========================================== search BOOL CHEATSEARCH::start(u8 type, u8 size, u8 sign) { if (statMem) return FALSE; if (mem) return FALSE; statMem = new u8 [ ( 4 * 1024 * 1024 ) / 8 ]; memset(statMem, 0xFF, ( 4 * 1024 * 1024 ) / 8); // comparative search type (need 8Mb RAM !!! (4+4)) mem = new u8 [ ( 4 * 1024 * 1024 ) ]; memcpy(mem, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) ); _type = type; _size = size; _sign = sign; amount = 0; lastRecord = 0; //INFO("Cheat search system is inited (type %s)\n", type?"comparative":"exact"); return TRUE; } BOOL CHEATSEARCH::close() { if (statMem) { delete [] statMem; statMem = NULL; } if (mem) { delete [] mem; mem = NULL; } amount = 0; lastRecord = 0; //INFO("Cheat search system is closed\n"); return FALSE; } u32 CHEATSEARCH::search(u32 val) { amount = 0; switch (_size) { case 0: // 1 byte for (u32 i = 0; i < (4 * 1024 * 1024); i++) { u32 addr = (i >> 3); u32 offs = (i % 8); if (statMem[addr] & (1<> 3); u32 offs = (i % 8); if (statMem[addr] & (3<> 3); u32 offs = (i % 8); if (statMem[addr] & (0x7<> 3); u32 offs = (i % 8); if (statMem[addr] & (0xF<> 3); u32 offs = (i % 8); if (statMem[addr] & (1< T1ReadByte(mem, i)); break; case 1: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadByte(mem, i)); break; case 2: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadByte(mem, i)); break; case 3: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadByte(mem, i)); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (1<> 3); u32 offs = (i % 8); if (statMem[addr] & (3< T1ReadWord(mem, i)); break; case 1: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadWord(mem, i)); break; case 2: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadWord(mem, i)); break; case 3: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadWord(mem, i)); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (3<> 3); u32 offs = (i % 8); if (statMem[addr] & (7< (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; case 1: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) < (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; case 2: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) == (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; case 3: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) != (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (7<> 3); u32 offs = (i % 8); if (statMem[addr] & (0xF< T1ReadLong(mem, i)); break; case 1: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadLong(mem, i)); break; case 2: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadLong(mem, i)); break; case 3: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadLong(mem, i)); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (0xF<> 3); u32 offs = (i % 8); if (statMem[addr] & (stepMem<> j; key = 0x0000; if (BIT_N(x, 23)) key |= 0x8000; if (BIT_N(k, 22)) key |= 0x4000; if (BIT_N(k, 21)) key |= 0x2000; if (BIT_N(k, 20)) key |= 0x1000; if (BIT_N(k, 19)) key |= 0x0800; if (BIT_N(k, 18)) key |= 0x0400; if (BIT_N(k, 17) != BIT_N(x, 31)) key |= 0x0200; if (BIT_N(k, 16) != BIT_N(x, 30)) key |= 0x0100; if (BIT_N(k, 30) != BIT_N(k, 29)) key |= 0x0080; if (BIT_N(k, 29) != BIT_N(k, 28)) key |= 0x0040; if (BIT_N(k, 28) != BIT_N(k, 27)) key |= 0x0020; if (BIT_N(k, 27) != BIT_N(k, 26)) key |= 0x0010; if (BIT_N(k, 26) != BIT_N(k, 25)) key |= 0x0008; if (BIT_N(k, 25) != BIT_N(k, 24)) key |= 0x0004; if (BIT_N(k, 25) != BIT_N(x, 26)) key |= 0x0002; if (BIT_N(k, 24) != BIT_N(x, 25)) key |= 0x0001; buf[i] ^= _xor; } buf+= 512; r += 512; n += 1; } } bool CHEATSEXPORT::load(char *path) { error = 0; fp = fopen(path, "rb"); if (!fp) { printf("Error open database\n"); error = 1; return false; } const char *headerID = "R4 CheatCode"; char buf[255] = {0}; fread(buf, 1, strlen(headerID), fp); if (strncmp(buf, headerID, strlen(headerID)) != 0) { // check encrypted R4decrypt((u8 *)buf, strlen(headerID), 0); if (strcmp(buf, headerID) != 0) { error = 2; return false; } encrypted = true; } fseek(fp, 0, SEEK_END); fsize = ftell(fp); fseek(fp, 0, SEEK_SET); if (!search()) { printf("ERROR: cheat in database not found\n"); error = 3; return false; } if (!getCodes()) { printf("ERROR: export cheats failed\n"); error = 4; return false; } return true; } void CHEATSEXPORT::close() { if (fp) fclose(fp); if (cheats) { delete [] cheats; cheats = NULL; } } bool CHEATSEXPORT::search() { if (!fp) return false; u32 pos = 0x0100; FAT_R4 fat_tmp = {0}; u8 buf[512] = {0}; CRC = 0; encOffset = 0; u32 t = 0; memset(date, 0, sizeof(date)); if (encrypted) { fseek(fp, 0, SEEK_SET); fread(&buf[0], 1, 512, fp); R4decrypt((u8 *)&buf[0], 512, 0); memcpy(&date[0], &buf[0x10], 16); } else { fseek(fp, 0x10, SEEK_SET); fread(&date, 16, 1, fp); fseek(fp, pos, SEEK_SET); fread(&fat_tmp, sizeof(fat), 1, fp); } while (1) { if (encrypted) { memcpy(&fat, &buf[pos % 512], sizeof(fat)); pos += sizeof(fat); if ((pos>>9) > t) { t++; fread(&buf[0], 1, 512, fp); R4decrypt((u8 *)&buf[0], 512, t); } memcpy(&fat_tmp, &buf[pos % 512], sizeof(fat_tmp)); // next } else { memcpy(&fat, &fat_tmp, sizeof(fat)); fread(&fat_tmp, sizeof(fat_tmp), 1, fp); } //printf("serial: %s, offset %08X\n", fat.serial, fat.addr); if (memcmp(gameInfo.header.gameCode, &fat.serial[0], 4) == 0) { dataSize = fat_tmp.addr?(fat_tmp.addr - fat.addr):0; if (encrypted) { encOffset = fat.addr % 512; dataSize += encOffset; } if (!dataSize) return false; CRC = fat.CRC; char buf[5] = {0}; memcpy(&buf, &fat.serial[0], 4); printf("Cheats: found %s CRC %08X at 0x%08llX, size %i byte(s)\n", buf, fat.CRC, fat.addr, dataSize - encOffset); return true; } if (fat.addr == 0) break; } memset(&fat, 0, sizeof(FAT_R4)); return false; } bool CHEATSEXPORT::getCodes() { if (!fp) return false; u32 pos = 0; u32 pos_cht = 0; u8 *data = new u8 [dataSize+8]; if (!data) return false; memset(data, 0, dataSize+8); fseek(fp, fat.addr - encOffset, SEEK_SET); if (fread(data, 1, dataSize, fp) != dataSize) { delete [] data; data = NULL; return false; } if (encrypted) R4decrypt(data, dataSize, fat.addr >> 9); intptr_t ptrMask = (~0 << 2); u8 *gameTitlePtr = (u8 *)data + encOffset; memset(gametitle, 0, CHEAT_DB_GAME_TITLE_SIZE); memcpy(gametitle, gameTitlePtr, strlen((const char *)gameTitlePtr)); u32 *cmd = (u32 *)(((intptr_t)gameTitlePtr + strlen((const char *)gameTitlePtr) + 4) & ptrMask); numCheats = cmd[0] & 0x0FFFFFFF; cmd += 9; cheats = new CHEATS_LIST[numCheats]; memset(cheats, 0, sizeof(CHEATS_LIST) * numCheats); while (pos < numCheats) { u32 folderNum = 1; u8 *folderName = NULL; u8 *folderNote = NULL; if ((*cmd & 0xF0000000) == 0x10000000) // Folder { folderNum = (*cmd & 0x00FFFFFF); folderName = (u8*)((intptr_t)cmd + 4); folderNote = (u8*)((intptr_t)folderName + strlen((char*)folderName) + 1); pos++; cmd = (u32 *)(((intptr_t)folderName + strlen((char*)folderName) + 1 + strlen((char*)folderNote) + 1 + 3) & ptrMask); } for (u32 i = 0; i < folderNum; i++) // in folder { u8 *cheatName = (u8 *)((intptr_t)cmd + 4); u8 *cheatNote = (u8 *)((intptr_t)cheatName + strlen((char*)cheatName) + 1); u32 *cheatData = (u32 *)(((intptr_t)cheatNote + strlen((char*)cheatNote) + 1 + 3) & ptrMask); u32 cheatDataLen = *cheatData++; u32 numberCodes = cheatDataLen / 2; if (numberCodes <= MAX_XX_CODE) { std::string descriptionStr = ""; if ( folderName && *folderName ) { descriptionStr += (char *)folderName; descriptionStr += ": "; } descriptionStr += (char *)cheatName; if ( cheatNote && *cheatNote ) { descriptionStr += " | "; descriptionStr += (char *)cheatNote; } strncpy(cheats[pos_cht].description, descriptionStr.c_str(), sizeof(cheats[pos_cht].description)); cheats[pos_cht].description[sizeof(cheats[pos_cht].description) - 1] = '\0'; cheats[pos_cht].num = numberCodes; cheats[pos_cht].type = 1; for(u32 j = 0, t = 0; j < numberCodes; j++, t+=2 ) { cheats[pos_cht].code[j][0] = (u32)*(cheatData+t); //printf("%i: %08X ", j, cheats[pos_cht].code[j][0]); cheats[pos_cht].code[j][1] = (u32)*(cheatData+t+1); //printf("%08X\n", cheats[pos_cht].code[j][1]); } pos_cht++; } pos++; cmd = (u32 *)((intptr_t)cmd + ((*cmd + 1)*4)); } }; delete [] data; numCheats = pos_cht; //for (int i = 0; i < numCheats; i++) // printf("%i: %s\n", i, cheats[i].description); return true; } CHEATS_LIST *CHEATSEXPORT::getCheats() { return cheats; } u32 CHEATSEXPORT::getCheatsNum() { return numCheats; } desmume-0.9.11/src/Makefile.in0000644000000000000000000020356212467662234014617 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk @HAVE_JIT_TRUE@am__append_1 = \ @HAVE_JIT_TRUE@ arm_jit.cpp arm_jit.h instruction_attributes.h \ @HAVE_JIT_TRUE@ utils/AsmJit/AsmJit.h \ @HAVE_JIT_TRUE@ utils/AsmJit/Config.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/apibegin.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/apiend.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assembler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assembler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assert.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assert.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/buffer.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/buffer.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/build.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compiler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compiler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilercontext.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilercontext.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilerfunc.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilerfunc.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compileritem.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compileritem.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/context.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/context.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/cpuinfo.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/cpuinfo.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/defs.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/defs.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/func.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/func.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/intutil.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/lock.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/logger.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/logger.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymanager.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymanager.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymarker.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymarker.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/operand.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/operand.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/podvector.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringbuilder.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringbuilder.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringutil.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringutil.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/virtualmemory.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/virtualmemory.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/zonememory.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/zonememory.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86assembler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86assembler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compiler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compiler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilercontext.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilercontext.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilerfunc.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilerfunc.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compileritem.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compileritem.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86cpuinfo.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86cpuinfo.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86defs.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86defs.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86func.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86func.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86operand.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86operand.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86util.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86util.h @HAVE_GL_TRUE@am__append_2 = OGLRender.cpp OGLRender_3_2.cpp @HAVE_OPENAL_TRUE@am__append_3 = mic_openal.cpp @HAVE_ALSA_TRUE@@HAVE_OPENAL_FALSE@am__append_4 = mic_alsa.cpp @HAVE_ALSA_FALSE@@HAVE_OPENAL_FALSE@am__append_5 = mic.cpp @HAVE_LIBSOUNDTOUCH_TRUE@am__append_6 = metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp @HAVE_LIBAGG_TRUE@am__append_7 = aggdraw.cpp aggdraw.h GPU_osd.cpp @HAVE_LIBAGG_FALSE@am__append_8 = GPU_osd_stub.cpp @HAVE_LUA_TRUE@am__append_9 = $(LUA_CFLAGS) @HAVE_LUA_TRUE@am__append_10 = lua-engine.cpp @HAVE_GDB_STUB_TRUE@am__append_11 = gdbstub.h subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libdesmume_a_AR = $(AR) $(ARFLAGS) libdesmume_a_DEPENDENCIES = fs-$(desmume_arch).$(OBJEXT) am__libdesmume_a_SOURCES_DIST = armcpu.cpp armcpu.h \ arm_instructions.cpp agg2d.h agg2d.inl bios.cpp bios.h bits.h \ cp15.cpp cp15.h commandline.h commandline.cpp common.cpp \ common.h debug.cpp debug.h Disassembler.cpp Disassembler.h \ emufile.h emufile.cpp emufile_types.h encrypt.h encrypt.cpp \ FIFO.cpp FIFO.h firmware.cpp firmware.h GPU.cpp GPU.h fs.h \ GPU_osd.h instructions.h mem.h mc.cpp mc.h path.cpp path.h \ readwrite.cpp readwrite.h wifi.cpp wifi.h mic.h MMU.cpp MMU.h \ MMU_timing.h NDSSystem.cpp NDSSystem.h registers.h OGLRender.h \ OGLRender_3_2.h ROMReader.cpp ROMReader.h render3D.cpp \ render3D.h rtc.cpp rtc.h saves.cpp saves.h slot1.cpp slot1.h \ slot2.cpp slot2.h SPU.cpp SPU.h matrix.cpp matrix.h gfx3d.cpp \ gfx3d.h thumb_instructions.cpp types.h movie.cpp movie.h \ PACKED.h PACKED_END.h utils/advanscene.cpp utils/advanscene.h \ utils/datetime.cpp utils/datetime.h utils/ConvertUTF.c \ utils/ConvertUTF.h utils/guid.cpp utils/guid.h \ utils/emufat.cpp utils/emufat.h utils/emufat_types.h \ utils/fsnitro.cpp utils/fsnitro.h utils/md5.cpp utils/md5.h \ utils/valuearray.h utils/xstring.cpp utils/xstring.h \ utils/decrypt/crc.cpp utils/decrypt/crc.h \ utils/decrypt/decrypt.cpp utils/decrypt/decrypt.h \ utils/decrypt/header.cpp utils/decrypt/header.h utils/task.cpp \ utils/task.h utils/vfat.h utils/vfat.cpp utils/dlditool.cpp \ utils/libfat/bit_ops.h utils/libfat/cache.cpp \ utils/libfat/cache.h utils/libfat/common.h \ utils/libfat/directory.cpp utils/libfat/directory.h \ utils/libfat/disc.cpp utils/libfat/disc.h \ utils/libfat/disc_io.h utils/libfat/fat.h \ utils/libfat/fatdir.cpp utils/libfat/fatdir.h \ utils/libfat/fatfile.cpp utils/libfat/fatfile.h \ utils/libfat/filetime.cpp utils/libfat/filetime.h \ utils/libfat/file_allocation_table.cpp \ utils/libfat/file_allocation_table.h utils/libfat/libfat.cpp \ utils/libfat/libfat_pc.h utils/libfat/libfat_public_api.cpp \ utils/libfat/libfat_public_api.h utils/libfat/lock.cpp \ utils/libfat/lock.h utils/libfat/mem_allocate.h \ utils/libfat/partition.cpp utils/libfat/partition.h \ utils/tinyxml/tinystr.cpp utils/tinyxml/tinystr.h \ utils/tinyxml/tinyxml.cpp utils/tinyxml/tinyxml.h \ utils/tinyxml/tinyxmlerror.cpp utils/tinyxml/tinyxmlparser.cpp \ utils/glcorearb.h addons/slot2_auto.cpp addons/slot2_mpcf.cpp \ addons/slot2_paddle.cpp addons/slot2_gbagame.cpp \ addons/slot2_none.cpp addons/slot2_rumblepak.cpp \ addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp \ addons/slot2_piano.cpp addons/slot2_passme.cpp \ addons/slot1_none.cpp addons/slot1_r4.cpp \ addons/slot1_retail_nand.cpp addons/slot1_retail_auto.cpp \ addons/slot1_retail_mcrom.cpp \ addons/slot1_retail_mcrom_debug.cpp addons/slot1comp_mc.cpp \ addons/slot1comp_mc.h addons/slot1comp_rom.h \ addons/slot1comp_rom.cpp addons/slot1comp_protocol.h \ addons/slot1comp_protocol.cpp cheatSystem.cpp cheatSystem.h \ texcache.cpp texcache.h rasterize.cpp rasterize.h \ metaspu/metaspu.cpp metaspu/metaspu.h filter/2xsai.cpp \ filter/bilinear.cpp filter/epx.cpp filter/filter.h \ filter/hq2x.cpp filter/hq2x.h filter/hq4x.cpp filter/hq4x.dat \ filter/hq4x.h filter/interp.h filter/lq2x.cpp filter/lq2x.h \ filter/scanline.cpp filter/videofilter.cpp \ filter/videofilter.h filter/xbrz.cpp filter/xbrz.h version.cpp \ version.h desmume_config.cpp desmume_config.h arm_jit.cpp \ arm_jit.h instruction_attributes.h utils/AsmJit/AsmJit.h \ utils/AsmJit/Config.h utils/AsmJit/core.h utils/AsmJit/x86.h \ utils/AsmJit/core/apibegin.h utils/AsmJit/core/apiend.h \ utils/AsmJit/core/assembler.cpp utils/AsmJit/core/assembler.h \ utils/AsmJit/core/assert.cpp utils/AsmJit/core/assert.h \ utils/AsmJit/core/buffer.cpp utils/AsmJit/core/buffer.h \ utils/AsmJit/core/build.h utils/AsmJit/core/compiler.cpp \ utils/AsmJit/core/compiler.h \ utils/AsmJit/core/compilercontext.cpp \ utils/AsmJit/core/compilercontext.h \ utils/AsmJit/core/compilerfunc.cpp \ utils/AsmJit/core/compilerfunc.h \ utils/AsmJit/core/compileritem.cpp \ utils/AsmJit/core/compileritem.h utils/AsmJit/core/context.cpp \ utils/AsmJit/core/context.h utils/AsmJit/core/cpuinfo.cpp \ utils/AsmJit/core/cpuinfo.h utils/AsmJit/core/defs.cpp \ utils/AsmJit/core/defs.h utils/AsmJit/core/func.cpp \ utils/AsmJit/core/func.h utils/AsmJit/core/intutil.h \ utils/AsmJit/core/lock.h utils/AsmJit/core/logger.cpp \ utils/AsmJit/core/logger.h utils/AsmJit/core/memorymanager.cpp \ utils/AsmJit/core/memorymanager.h \ utils/AsmJit/core/memorymarker.cpp \ utils/AsmJit/core/memorymarker.h utils/AsmJit/core/operand.cpp \ utils/AsmJit/core/operand.h utils/AsmJit/core/podvector.h \ utils/AsmJit/core/stringbuilder.cpp \ utils/AsmJit/core/stringbuilder.h \ utils/AsmJit/core/stringutil.cpp \ utils/AsmJit/core/stringutil.h \ utils/AsmJit/core/virtualmemory.cpp \ utils/AsmJit/core/virtualmemory.h \ utils/AsmJit/core/zonememory.cpp \ utils/AsmJit/core/zonememory.h \ utils/AsmJit/x86/x86assembler.cpp \ utils/AsmJit/x86/x86assembler.h \ utils/AsmJit/x86/x86compiler.cpp \ utils/AsmJit/x86/x86compiler.h \ utils/AsmJit/x86/x86compilercontext.cpp \ utils/AsmJit/x86/x86compilercontext.h \ utils/AsmJit/x86/x86compilerfunc.cpp \ utils/AsmJit/x86/x86compilerfunc.h \ utils/AsmJit/x86/x86compileritem.cpp \ utils/AsmJit/x86/x86compileritem.h \ utils/AsmJit/x86/x86cpuinfo.cpp utils/AsmJit/x86/x86cpuinfo.h \ utils/AsmJit/x86/x86defs.cpp utils/AsmJit/x86/x86defs.h \ utils/AsmJit/x86/x86func.cpp utils/AsmJit/x86/x86func.h \ utils/AsmJit/x86/x86operand.cpp utils/AsmJit/x86/x86operand.h \ utils/AsmJit/x86/x86util.cpp utils/AsmJit/x86/x86util.h \ OGLRender.cpp OGLRender_3_2.cpp mic_openal.cpp mic_alsa.cpp \ mic.cpp metaspu/SndOut.cpp metaspu/SndOut.h \ metaspu/Timestretcher.cpp aggdraw.cpp aggdraw.h GPU_osd.cpp \ GPU_osd_stub.cpp lua-engine.cpp gdbstub.h am__dirstamp = $(am__leading_dot)dirstamp @HAVE_JIT_TRUE@am__objects_1 = arm_jit.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assembler.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assert.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/buffer.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compiler.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilercontext.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilerfunc.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compileritem.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/context.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/cpuinfo.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/defs.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/func.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/logger.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymanager.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymarker.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/operand.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringbuilder.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringutil.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/virtualmemory.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/core/zonememory.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86assembler.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compiler.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilercontext.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilerfunc.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compileritem.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86cpuinfo.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86defs.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86func.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86operand.$(OBJEXT) \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86util.$(OBJEXT) @HAVE_GL_TRUE@am__objects_2 = OGLRender.$(OBJEXT) \ @HAVE_GL_TRUE@ OGLRender_3_2.$(OBJEXT) @HAVE_OPENAL_TRUE@am__objects_3 = mic_openal.$(OBJEXT) @HAVE_ALSA_TRUE@@HAVE_OPENAL_FALSE@am__objects_4 = mic_alsa.$(OBJEXT) @HAVE_ALSA_FALSE@@HAVE_OPENAL_FALSE@am__objects_5 = mic.$(OBJEXT) @HAVE_LIBSOUNDTOUCH_TRUE@am__objects_6 = metaspu/SndOut.$(OBJEXT) \ @HAVE_LIBSOUNDTOUCH_TRUE@ metaspu/Timestretcher.$(OBJEXT) @HAVE_LIBAGG_TRUE@am__objects_7 = aggdraw.$(OBJEXT) GPU_osd.$(OBJEXT) @HAVE_LIBAGG_FALSE@am__objects_8 = GPU_osd_stub.$(OBJEXT) @HAVE_LUA_TRUE@am__objects_9 = lua-engine.$(OBJEXT) am__objects_10 = am_libdesmume_a_OBJECTS = armcpu.$(OBJEXT) arm_instructions.$(OBJEXT) \ bios.$(OBJEXT) cp15.$(OBJEXT) commandline.$(OBJEXT) \ common.$(OBJEXT) debug.$(OBJEXT) Disassembler.$(OBJEXT) \ emufile.$(OBJEXT) encrypt.$(OBJEXT) FIFO.$(OBJEXT) \ firmware.$(OBJEXT) GPU.$(OBJEXT) mc.$(OBJEXT) path.$(OBJEXT) \ readwrite.$(OBJEXT) wifi.$(OBJEXT) MMU.$(OBJEXT) \ NDSSystem.$(OBJEXT) ROMReader.$(OBJEXT) render3D.$(OBJEXT) \ rtc.$(OBJEXT) saves.$(OBJEXT) slot1.$(OBJEXT) slot2.$(OBJEXT) \ SPU.$(OBJEXT) matrix.$(OBJEXT) gfx3d.$(OBJEXT) \ thumb_instructions.$(OBJEXT) movie.$(OBJEXT) \ utils/advanscene.$(OBJEXT) utils/datetime.$(OBJEXT) \ utils/ConvertUTF.$(OBJEXT) utils/guid.$(OBJEXT) \ utils/emufat.$(OBJEXT) utils/fsnitro.$(OBJEXT) \ utils/md5.$(OBJEXT) utils/xstring.$(OBJEXT) \ utils/decrypt/crc.$(OBJEXT) utils/decrypt/decrypt.$(OBJEXT) \ utils/decrypt/header.$(OBJEXT) utils/task.$(OBJEXT) \ utils/vfat.$(OBJEXT) utils/dlditool.$(OBJEXT) \ utils/libfat/cache.$(OBJEXT) utils/libfat/directory.$(OBJEXT) \ utils/libfat/disc.$(OBJEXT) utils/libfat/fatdir.$(OBJEXT) \ utils/libfat/fatfile.$(OBJEXT) utils/libfat/filetime.$(OBJEXT) \ utils/libfat/file_allocation_table.$(OBJEXT) \ utils/libfat/libfat.$(OBJEXT) \ utils/libfat/libfat_public_api.$(OBJEXT) \ utils/libfat/lock.$(OBJEXT) utils/libfat/partition.$(OBJEXT) \ utils/tinyxml/tinystr.$(OBJEXT) \ utils/tinyxml/tinyxml.$(OBJEXT) \ utils/tinyxml/tinyxmlerror.$(OBJEXT) \ utils/tinyxml/tinyxmlparser.$(OBJEXT) \ addons/slot2_auto.$(OBJEXT) addons/slot2_mpcf.$(OBJEXT) \ addons/slot2_paddle.$(OBJEXT) addons/slot2_gbagame.$(OBJEXT) \ addons/slot2_none.$(OBJEXT) addons/slot2_rumblepak.$(OBJEXT) \ addons/slot2_guitarGrip.$(OBJEXT) \ addons/slot2_expMemory.$(OBJEXT) addons/slot2_piano.$(OBJEXT) \ addons/slot2_passme.$(OBJEXT) addons/slot1_none.$(OBJEXT) \ addons/slot1_r4.$(OBJEXT) addons/slot1_retail_nand.$(OBJEXT) \ addons/slot1_retail_auto.$(OBJEXT) \ addons/slot1_retail_mcrom.$(OBJEXT) \ addons/slot1_retail_mcrom_debug.$(OBJEXT) \ addons/slot1comp_mc.$(OBJEXT) addons/slot1comp_rom.$(OBJEXT) \ addons/slot1comp_protocol.$(OBJEXT) cheatSystem.$(OBJEXT) \ texcache.$(OBJEXT) rasterize.$(OBJEXT) \ metaspu/metaspu.$(OBJEXT) filter/2xsai.$(OBJEXT) \ filter/bilinear.$(OBJEXT) filter/epx.$(OBJEXT) \ filter/hq2x.$(OBJEXT) filter/hq4x.$(OBJEXT) \ filter/lq2x.$(OBJEXT) filter/scanline.$(OBJEXT) \ filter/videofilter.$(OBJEXT) filter/xbrz.$(OBJEXT) \ version.$(OBJEXT) desmume_config.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) $(am__objects_3) $(am__objects_4) \ $(am__objects_5) $(am__objects_6) $(am__objects_7) \ $(am__objects_8) $(am__objects_9) $(am__objects_10) libdesmume_a_OBJECTS = $(am_libdesmume_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libdesmume_a_SOURCES) DIST_SOURCES = $(am__libdesmume_a_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(GTHREAD_CFLAGS) \ $(X_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) $(am__append_9) AM_LDFLAGS = EXTRA_DIST = build.bat instruction_tabdef.inc thumb_tabdef.inc fs-linux.cpp fs-windows.cpp cocoa @HAVE_GDB_STUB_FALSE@SUBDIRS = . $(UI_DIR) @HAVE_GDB_STUB_TRUE@SUBDIRS = . gdbstub $(UI_DIR) DIST_SUBDIRS = . gdbstub cli gtk gtk-glade noinst_LIBRARIES = libdesmume.a libdesmume_a_SOURCES = armcpu.cpp armcpu.h arm_instructions.cpp \ agg2d.h agg2d.inl bios.cpp bios.h bits.h cp15.cpp cp15.h \ commandline.h commandline.cpp common.cpp common.h debug.cpp \ debug.h Disassembler.cpp Disassembler.h emufile.h emufile.cpp \ emufile_types.h encrypt.h encrypt.cpp FIFO.cpp FIFO.h \ firmware.cpp firmware.h GPU.cpp GPU.h fs.h GPU_osd.h \ instructions.h mem.h mc.cpp mc.h path.cpp path.h readwrite.cpp \ readwrite.h wifi.cpp wifi.h mic.h MMU.cpp MMU.h MMU_timing.h \ NDSSystem.cpp NDSSystem.h registers.h OGLRender.h \ OGLRender_3_2.h ROMReader.cpp ROMReader.h render3D.cpp \ render3D.h rtc.cpp rtc.h saves.cpp saves.h slot1.cpp slot1.h \ slot2.cpp slot2.h SPU.cpp SPU.h matrix.cpp matrix.h gfx3d.cpp \ gfx3d.h thumb_instructions.cpp types.h movie.cpp movie.h \ PACKED.h PACKED_END.h utils/advanscene.cpp utils/advanscene.h \ utils/datetime.cpp utils/datetime.h utils/ConvertUTF.c \ utils/ConvertUTF.h utils/guid.cpp utils/guid.h \ utils/emufat.cpp utils/emufat.h utils/emufat_types.h \ utils/fsnitro.cpp utils/fsnitro.h utils/md5.cpp utils/md5.h \ utils/valuearray.h utils/xstring.cpp utils/xstring.h \ utils/decrypt/crc.cpp utils/decrypt/crc.h \ utils/decrypt/decrypt.cpp utils/decrypt/decrypt.h \ utils/decrypt/header.cpp utils/decrypt/header.h utils/task.cpp \ utils/task.h utils/vfat.h utils/vfat.cpp utils/dlditool.cpp \ utils/libfat/bit_ops.h utils/libfat/cache.cpp \ utils/libfat/cache.h utils/libfat/common.h \ utils/libfat/directory.cpp utils/libfat/directory.h \ utils/libfat/disc.cpp utils/libfat/disc.h \ utils/libfat/disc_io.h utils/libfat/fat.h \ utils/libfat/fatdir.cpp utils/libfat/fatdir.h \ utils/libfat/fatfile.cpp utils/libfat/fatfile.h \ utils/libfat/filetime.cpp utils/libfat/filetime.h \ utils/libfat/file_allocation_table.cpp \ utils/libfat/file_allocation_table.h utils/libfat/libfat.cpp \ utils/libfat/libfat_pc.h utils/libfat/libfat_public_api.cpp \ utils/libfat/libfat_public_api.h utils/libfat/lock.cpp \ utils/libfat/lock.h utils/libfat/mem_allocate.h \ utils/libfat/partition.cpp utils/libfat/partition.h \ utils/tinyxml/tinystr.cpp utils/tinyxml/tinystr.h \ utils/tinyxml/tinyxml.cpp utils/tinyxml/tinyxml.h \ utils/tinyxml/tinyxmlerror.cpp utils/tinyxml/tinyxmlparser.cpp \ utils/glcorearb.h addons/slot2_auto.cpp addons/slot2_mpcf.cpp \ addons/slot2_paddle.cpp addons/slot2_gbagame.cpp \ addons/slot2_none.cpp addons/slot2_rumblepak.cpp \ addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp \ addons/slot2_piano.cpp addons/slot2_passme.cpp \ addons/slot1_none.cpp addons/slot1_r4.cpp \ addons/slot1_retail_nand.cpp addons/slot1_retail_auto.cpp \ addons/slot1_retail_mcrom.cpp \ addons/slot1_retail_mcrom_debug.cpp addons/slot1comp_mc.cpp \ addons/slot1comp_mc.h addons/slot1comp_rom.h \ addons/slot1comp_rom.cpp addons/slot1comp_protocol.h \ addons/slot1comp_protocol.cpp cheatSystem.cpp cheatSystem.h \ texcache.cpp texcache.h rasterize.cpp rasterize.h \ metaspu/metaspu.cpp metaspu/metaspu.h filter/2xsai.cpp \ filter/bilinear.cpp filter/epx.cpp filter/filter.h \ filter/hq2x.cpp filter/hq2x.h filter/hq4x.cpp filter/hq4x.dat \ filter/hq4x.h filter/interp.h filter/lq2x.cpp filter/lq2x.h \ filter/scanline.cpp filter/videofilter.cpp \ filter/videofilter.h filter/xbrz.cpp filter/xbrz.h version.cpp \ version.h desmume_config.cpp desmume_config.h $(am__append_1) \ $(am__append_2) $(am__append_3) $(am__append_4) \ $(am__append_5) $(am__append_6) $(am__append_7) \ $(am__append_8) $(am__append_10) $(am__append_11) libdesmume_a_LIBADD = fs-$(desmume_arch).$(OBJEXT) all: all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) utils/$(am__dirstamp): @$(MKDIR_P) utils @: > utils/$(am__dirstamp) utils/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) utils/$(DEPDIR) @: > utils/$(DEPDIR)/$(am__dirstamp) utils/advanscene.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/datetime.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/ConvertUTF.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/guid.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/emufat.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/fsnitro.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/md5.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/xstring.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/decrypt/$(am__dirstamp): @$(MKDIR_P) utils/decrypt @: > utils/decrypt/$(am__dirstamp) utils/decrypt/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) utils/decrypt/$(DEPDIR) @: > utils/decrypt/$(DEPDIR)/$(am__dirstamp) utils/decrypt/crc.$(OBJEXT): utils/decrypt/$(am__dirstamp) \ utils/decrypt/$(DEPDIR)/$(am__dirstamp) utils/decrypt/decrypt.$(OBJEXT): utils/decrypt/$(am__dirstamp) \ utils/decrypt/$(DEPDIR)/$(am__dirstamp) utils/decrypt/header.$(OBJEXT): utils/decrypt/$(am__dirstamp) \ utils/decrypt/$(DEPDIR)/$(am__dirstamp) utils/task.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/vfat.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/dlditool.$(OBJEXT): utils/$(am__dirstamp) \ utils/$(DEPDIR)/$(am__dirstamp) utils/libfat/$(am__dirstamp): @$(MKDIR_P) utils/libfat @: > utils/libfat/$(am__dirstamp) utils/libfat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) utils/libfat/$(DEPDIR) @: > utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/cache.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/directory.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/disc.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/fatdir.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/fatfile.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/filetime.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/file_allocation_table.$(OBJEXT): \ utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/libfat.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/libfat_public_api.$(OBJEXT): \ utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/lock.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/libfat/partition.$(OBJEXT): utils/libfat/$(am__dirstamp) \ utils/libfat/$(DEPDIR)/$(am__dirstamp) utils/tinyxml/$(am__dirstamp): @$(MKDIR_P) utils/tinyxml @: > utils/tinyxml/$(am__dirstamp) utils/tinyxml/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) utils/tinyxml/$(DEPDIR) @: > utils/tinyxml/$(DEPDIR)/$(am__dirstamp) utils/tinyxml/tinystr.$(OBJEXT): utils/tinyxml/$(am__dirstamp) \ utils/tinyxml/$(DEPDIR)/$(am__dirstamp) utils/tinyxml/tinyxml.$(OBJEXT): utils/tinyxml/$(am__dirstamp) \ utils/tinyxml/$(DEPDIR)/$(am__dirstamp) utils/tinyxml/tinyxmlerror.$(OBJEXT): utils/tinyxml/$(am__dirstamp) \ utils/tinyxml/$(DEPDIR)/$(am__dirstamp) utils/tinyxml/tinyxmlparser.$(OBJEXT): utils/tinyxml/$(am__dirstamp) \ utils/tinyxml/$(DEPDIR)/$(am__dirstamp) addons/$(am__dirstamp): @$(MKDIR_P) addons @: > addons/$(am__dirstamp) addons/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) addons/$(DEPDIR) @: > addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_auto.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_mpcf.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_paddle.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_gbagame.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_none.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_rumblepak.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_guitarGrip.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_expMemory.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_piano.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot2_passme.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1_none.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1_r4.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1_retail_nand.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1_retail_auto.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1_retail_mcrom.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1_retail_mcrom_debug.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1comp_mc.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1comp_rom.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) addons/slot1comp_protocol.$(OBJEXT): addons/$(am__dirstamp) \ addons/$(DEPDIR)/$(am__dirstamp) metaspu/$(am__dirstamp): @$(MKDIR_P) metaspu @: > metaspu/$(am__dirstamp) metaspu/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) metaspu/$(DEPDIR) @: > metaspu/$(DEPDIR)/$(am__dirstamp) metaspu/metaspu.$(OBJEXT): metaspu/$(am__dirstamp) \ metaspu/$(DEPDIR)/$(am__dirstamp) filter/$(am__dirstamp): @$(MKDIR_P) filter @: > filter/$(am__dirstamp) filter/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) filter/$(DEPDIR) @: > filter/$(DEPDIR)/$(am__dirstamp) filter/2xsai.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/bilinear.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/epx.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/hq2x.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/hq4x.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/lq2x.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/scanline.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/videofilter.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) filter/xbrz.$(OBJEXT): filter/$(am__dirstamp) \ filter/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/$(am__dirstamp): @$(MKDIR_P) utils/AsmJit/core @: > utils/AsmJit/core/$(am__dirstamp) utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) utils/AsmJit/core/$(DEPDIR) @: > utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/assembler.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/assert.$(OBJEXT): utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/buffer.$(OBJEXT): utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/compiler.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/compilercontext.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/compilerfunc.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/compileritem.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/context.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/cpuinfo.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/defs.$(OBJEXT): utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/func.$(OBJEXT): utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/logger.$(OBJEXT): utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/memorymanager.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/memorymarker.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/operand.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/stringbuilder.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/stringutil.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/virtualmemory.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/core/zonememory.$(OBJEXT): \ utils/AsmJit/core/$(am__dirstamp) \ utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/$(am__dirstamp): @$(MKDIR_P) utils/AsmJit/x86 @: > utils/AsmJit/x86/$(am__dirstamp) utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) utils/AsmJit/x86/$(DEPDIR) @: > utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86assembler.$(OBJEXT): \ utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86compiler.$(OBJEXT): \ utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86compilercontext.$(OBJEXT): \ utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86compilerfunc.$(OBJEXT): \ utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86compileritem.$(OBJEXT): \ utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86cpuinfo.$(OBJEXT): \ utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86defs.$(OBJEXT): utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86func.$(OBJEXT): utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86operand.$(OBJEXT): \ utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) utils/AsmJit/x86/x86util.$(OBJEXT): utils/AsmJit/x86/$(am__dirstamp) \ utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) metaspu/SndOut.$(OBJEXT): metaspu/$(am__dirstamp) \ metaspu/$(DEPDIR)/$(am__dirstamp) metaspu/Timestretcher.$(OBJEXT): metaspu/$(am__dirstamp) \ metaspu/$(DEPDIR)/$(am__dirstamp) libdesmume.a: $(libdesmume_a_OBJECTS) $(libdesmume_a_DEPENDENCIES) $(EXTRA_libdesmume_a_DEPENDENCIES) -rm -f libdesmume.a $(libdesmume_a_AR) libdesmume.a $(libdesmume_a_OBJECTS) $(libdesmume_a_LIBADD) $(RANLIB) libdesmume.a mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f addons/slot1_none.$(OBJEXT) -rm -f addons/slot1_r4.$(OBJEXT) -rm -f addons/slot1_retail_auto.$(OBJEXT) -rm -f addons/slot1_retail_mcrom.$(OBJEXT) -rm -f addons/slot1_retail_mcrom_debug.$(OBJEXT) -rm -f addons/slot1_retail_nand.$(OBJEXT) -rm -f addons/slot1comp_mc.$(OBJEXT) -rm -f addons/slot1comp_protocol.$(OBJEXT) -rm -f addons/slot1comp_rom.$(OBJEXT) -rm -f addons/slot2_auto.$(OBJEXT) -rm -f addons/slot2_expMemory.$(OBJEXT) -rm -f addons/slot2_gbagame.$(OBJEXT) -rm -f addons/slot2_guitarGrip.$(OBJEXT) -rm -f addons/slot2_mpcf.$(OBJEXT) -rm -f addons/slot2_none.$(OBJEXT) -rm -f addons/slot2_paddle.$(OBJEXT) -rm -f addons/slot2_passme.$(OBJEXT) -rm -f addons/slot2_piano.$(OBJEXT) -rm -f addons/slot2_rumblepak.$(OBJEXT) -rm -f filter/2xsai.$(OBJEXT) -rm -f filter/bilinear.$(OBJEXT) -rm -f filter/epx.$(OBJEXT) -rm -f filter/hq2x.$(OBJEXT) -rm -f filter/hq4x.$(OBJEXT) -rm -f filter/lq2x.$(OBJEXT) -rm -f filter/scanline.$(OBJEXT) -rm -f filter/videofilter.$(OBJEXT) -rm -f filter/xbrz.$(OBJEXT) -rm -f metaspu/SndOut.$(OBJEXT) -rm -f metaspu/Timestretcher.$(OBJEXT) -rm -f metaspu/metaspu.$(OBJEXT) -rm -f utils/AsmJit/core/assembler.$(OBJEXT) -rm -f utils/AsmJit/core/assert.$(OBJEXT) -rm -f utils/AsmJit/core/buffer.$(OBJEXT) -rm -f utils/AsmJit/core/compiler.$(OBJEXT) -rm -f utils/AsmJit/core/compilercontext.$(OBJEXT) -rm -f utils/AsmJit/core/compilerfunc.$(OBJEXT) -rm -f utils/AsmJit/core/compileritem.$(OBJEXT) -rm -f utils/AsmJit/core/context.$(OBJEXT) -rm -f utils/AsmJit/core/cpuinfo.$(OBJEXT) -rm -f utils/AsmJit/core/defs.$(OBJEXT) -rm -f utils/AsmJit/core/func.$(OBJEXT) -rm -f utils/AsmJit/core/logger.$(OBJEXT) -rm -f utils/AsmJit/core/memorymanager.$(OBJEXT) -rm -f utils/AsmJit/core/memorymarker.$(OBJEXT) -rm -f utils/AsmJit/core/operand.$(OBJEXT) -rm -f utils/AsmJit/core/stringbuilder.$(OBJEXT) -rm -f utils/AsmJit/core/stringutil.$(OBJEXT) -rm -f utils/AsmJit/core/virtualmemory.$(OBJEXT) -rm -f utils/AsmJit/core/zonememory.$(OBJEXT) -rm -f utils/AsmJit/x86/x86assembler.$(OBJEXT) -rm -f utils/AsmJit/x86/x86compiler.$(OBJEXT) -rm -f utils/AsmJit/x86/x86compilercontext.$(OBJEXT) -rm -f utils/AsmJit/x86/x86compilerfunc.$(OBJEXT) -rm -f utils/AsmJit/x86/x86compileritem.$(OBJEXT) -rm -f utils/AsmJit/x86/x86cpuinfo.$(OBJEXT) -rm -f utils/AsmJit/x86/x86defs.$(OBJEXT) -rm -f utils/AsmJit/x86/x86func.$(OBJEXT) -rm -f utils/AsmJit/x86/x86operand.$(OBJEXT) -rm -f utils/AsmJit/x86/x86util.$(OBJEXT) -rm -f utils/ConvertUTF.$(OBJEXT) -rm -f utils/advanscene.$(OBJEXT) -rm -f utils/datetime.$(OBJEXT) -rm -f utils/decrypt/crc.$(OBJEXT) -rm -f utils/decrypt/decrypt.$(OBJEXT) -rm -f utils/decrypt/header.$(OBJEXT) -rm -f utils/dlditool.$(OBJEXT) -rm -f utils/emufat.$(OBJEXT) -rm -f utils/fsnitro.$(OBJEXT) -rm -f utils/guid.$(OBJEXT) -rm -f utils/libfat/cache.$(OBJEXT) -rm -f utils/libfat/directory.$(OBJEXT) -rm -f utils/libfat/disc.$(OBJEXT) -rm -f utils/libfat/fatdir.$(OBJEXT) -rm -f utils/libfat/fatfile.$(OBJEXT) -rm -f utils/libfat/file_allocation_table.$(OBJEXT) -rm -f utils/libfat/filetime.$(OBJEXT) -rm -f utils/libfat/libfat.$(OBJEXT) -rm -f utils/libfat/libfat_public_api.$(OBJEXT) -rm -f utils/libfat/lock.$(OBJEXT) -rm -f utils/libfat/partition.$(OBJEXT) -rm -f utils/md5.$(OBJEXT) -rm -f utils/task.$(OBJEXT) -rm -f utils/tinyxml/tinystr.$(OBJEXT) -rm -f utils/tinyxml/tinyxml.$(OBJEXT) -rm -f utils/tinyxml/tinyxmlerror.$(OBJEXT) -rm -f utils/tinyxml/tinyxmlparser.$(OBJEXT) -rm -f utils/vfat.$(OBJEXT) -rm -f utils/xstring.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Disassembler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FIFO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU_osd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU_osd_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MMU.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NDSSystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OGLRender.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OGLRender_3_2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ROMReader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SPU.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aggdraw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_instructions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_jit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/armcpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bios.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheatSystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commandline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp15.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desmume_config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emufile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/firmware.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx3d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua-engine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic_alsa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic_openal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rasterize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readwrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render3D.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/saves.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texcache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumb_instructions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wifi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1_none.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1_r4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1_retail_auto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1_retail_mcrom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1_retail_mcrom_debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1_retail_nand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1comp_mc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1comp_protocol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot1comp_rom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_auto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_expMemory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_gbagame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_guitarGrip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_mpcf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_none.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_paddle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_passme.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_piano.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@addons/$(DEPDIR)/slot2_rumblepak.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/2xsai.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/bilinear.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/epx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/hq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/hq4x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/lq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/scanline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/videofilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@filter/$(DEPDIR)/xbrz.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@metaspu/$(DEPDIR)/SndOut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@metaspu/$(DEPDIR)/Timestretcher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@metaspu/$(DEPDIR)/metaspu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/ConvertUTF.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/advanscene.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/datetime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/dlditool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/emufat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/fsnitro.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/guid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/vfat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/xstring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/assembler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/assert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/compiler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/compilercontext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/compilerfunc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/compileritem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/cpuinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/defs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/func.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/memorymanager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/memorymarker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/operand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/stringbuilder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/stringutil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/virtualmemory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/core/$(DEPDIR)/zonememory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86assembler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86compiler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86compilercontext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86compilerfunc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86compileritem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86cpuinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86defs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86func.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86operand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/AsmJit/x86/$(DEPDIR)/x86util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/decrypt/$(DEPDIR)/crc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/decrypt/$(DEPDIR)/decrypt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/decrypt/$(DEPDIR)/header.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/directory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/disc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/fatdir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/fatfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/file_allocation_table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/filetime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/libfat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/libfat_public_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/lock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/libfat/$(DEPDIR)/partition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/tinyxml/$(DEPDIR)/tinystr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/tinyxml/$(DEPDIR)/tinyxml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/tinyxml/$(DEPDIR)/tinyxmlerror.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@utils/tinyxml/$(DEPDIR)/tinyxmlparser.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f addons/$(DEPDIR)/$(am__dirstamp) -rm -f addons/$(am__dirstamp) -rm -f filter/$(DEPDIR)/$(am__dirstamp) -rm -f filter/$(am__dirstamp) -rm -f metaspu/$(DEPDIR)/$(am__dirstamp) -rm -f metaspu/$(am__dirstamp) -rm -f utils/$(DEPDIR)/$(am__dirstamp) -rm -f utils/$(am__dirstamp) -rm -f utils/AsmJit/core/$(DEPDIR)/$(am__dirstamp) -rm -f utils/AsmJit/core/$(am__dirstamp) -rm -f utils/AsmJit/x86/$(DEPDIR)/$(am__dirstamp) -rm -f utils/AsmJit/x86/$(am__dirstamp) -rm -f utils/decrypt/$(DEPDIR)/$(am__dirstamp) -rm -f utils/decrypt/$(am__dirstamp) -rm -f utils/libfat/$(DEPDIR)/$(am__dirstamp) -rm -f utils/libfat/$(am__dirstamp) -rm -f utils/tinyxml/$(DEPDIR)/$(am__dirstamp) -rm -f utils/tinyxml/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) addons/$(DEPDIR) filter/$(DEPDIR) metaspu/$(DEPDIR) utils/$(DEPDIR) utils/AsmJit/core/$(DEPDIR) utils/AsmJit/x86/$(DEPDIR) utils/decrypt/$(DEPDIR) utils/libfat/$(DEPDIR) utils/tinyxml/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) addons/$(DEPDIR) filter/$(DEPDIR) metaspu/$(DEPDIR) utils/$(DEPDIR) utils/AsmJit/core/$(DEPDIR) utils/AsmJit/x86/$(DEPDIR) utils/decrypt/$(DEPDIR) utils/libfat/$(DEPDIR) utils/tinyxml/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/agg2d.h0000755000000000000000000007032112467662066013710 0ustar rootroot//---------------------------------------------------------------------------- // Agg2D - Version 1.0 // Based on Anti-Grain Geometry // Copyright (C) 2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // // 25 Jan 2007 - Ported to AGG 2.4 Jerry Evans (jerry@novadsp.com) // 11 Jul 2009 - significant refactors for introduction to desmume // //---------------------------------------------------------------------------- #ifndef AGG2D_INCLUDED #define AGG2D_INCLUDED //we're not using vector fonts right now. //#define AGG2D_USE_VECTORFONTS #ifdef AGG2D_USE_VECTORFONTS #if defined(UNDER_CE) || not defined(WIN32) #define AGG2D_USE_FREETYPE #endif #endif #ifdef _MSC_VER #pragma warning(disable: 4786) #endif // JME #include "agg_basics.h" #include "agg_math_stroke.h" #include "agg_trans_affine.h" #include "agg_trans_viewport.h" #include "agg_path_storage.h" #include "agg_conv_stroke.h" #include "agg_conv_transform.h" #include "agg_conv_curve.h" #include "agg_rendering_buffer.h" #include "agg_renderer_base.h" #include "agg_renderer_scanline.h" #include "agg_span_gradient.h" #include "agg_span_image_filter_rgba.h" //+ JME #include "agg_span_allocator.h" #include "agg_span_converter.h" #include "agg_span_interpolator_linear.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_gamma_functions.h" #include "agg_scanline_u.h" #include "agg_bezier_arc.h" #include "agg_rounded_rect.h" #include "agg_font_cache_manager.h" #include "agg_glyph_raster_bin.h" #include "agg_renderer_raster_text.h" #include "agg_embedded_raster_fonts.h" #include #ifdef AGG2D_USE_VECTORFONTS #ifdef AGG2D_USE_FREETYPE #ifndef WIN32 #include "agg_font_freetype.h" #else #include "../font_freetype/agg_font_freetype.h" #endif #else #include "../font_win32_tt/agg_font_win32_tt.h" #endif #endif #include "agg_pixfmt_rgba.h" //+ JME #include "agg_image_accessors.h" #define AGG2D_TEMPLATE template #define AGG2D_TEMPLATE_WITH_IMAGE template #define AGG2D_TEMPLATE_ARG #define AGG2D_IMAGE_TEMPLATE template #define AGG2D_IMAGE_TEMPLATE_ARG #define TIMAGE Agg2DBase :: Image AGG2D_IMAGE_TEMPLATE_ARG template class PixFormatSetDeclaration { public: typedef Main PixFormat; typedef Pre PixFormatPre; typedef SG SpanGenerator; }; class Agg2DBase { public: // JME //typedef agg::rect Rect; typedef agg::rect_i Rect; typedef agg::rect_d RectD; typedef agg::trans_affine Affine; enum LineJoin { JOIN_MITER = agg::miter_join, JOIN_ROUND = agg::round_join, JOIN_BEVEL = agg::bevel_join }; enum LineCap { CAP_BUTT = agg::butt_cap, CAP_SQUARE = agg::square_cap, CAP_ROUND = agg::round_cap }; enum TextAlignment { AlignLeft, AlignRight, AlignCenter, AlignBaseline, AlignTop = AlignRight, AlignBottom = AlignLeft }; enum DrawPathFlag { FillOnly, StrokeOnly, FillAndStroke, FillWithLineColor }; enum ViewportOption { Anisotropic, XMinYMin, XMidYMin, XMaxYMin, XMinYMid, XMidYMid, XMaxYMid, XMinYMax, XMidYMax, XMaxYMax }; enum WindowFitLogic { WindowFitLogic_meet, WindowFitLogic_slice }; struct Transformations { double affineMatrix[6]; }; AGG2D_IMAGE_TEMPLATE struct Image { agg::rendering_buffer renBuf; Image(const agg::rendering_buffer& srcBuf) : renBuf(srcBuf) {} Image(unsigned char* buf, unsigned width, unsigned height, int stride) : renBuf(buf, width, height, stride) {} void attach(unsigned char* buf, unsigned width, unsigned height, int stride) { renBuf.attach(buf, width, height, stride); } int width() const { return renBuf.width(); } int height() const { return renBuf.height(); } AGG2D_TEMPLATE void premultiply() { typename PixFormatSet::PixFormat pixf(renBuf); pixf.premultiply(); } AGG2D_TEMPLATE void demultiply() { typename PixFormatSet::PixFormat pixf(renBuf); pixf.demultiply(); } }; enum ImageFilter { NoFilter, Bilinear, Hanning, Hermite, Quadric, Bicubic, Catrom, Spline16, Spline36, Blackman144 }; enum ImageResample { NoResample, ResampleAlways, ResampleOnZoomOut }; enum FontCacheType { RasterFontCache, VectorFontCache }; enum BlendMode { BlendAlpha = agg::end_of_comp_op_e, BlendClear = agg::comp_op_clear, BlendSrc = agg::comp_op_src, BlendDst = agg::comp_op_dst, BlendSrcOver = agg::comp_op_src_over, BlendDstOver = agg::comp_op_dst_over, BlendSrcIn = agg::comp_op_src_in, BlendDstIn = agg::comp_op_dst_in, BlendSrcOut = agg::comp_op_src_out, BlendDstOut = agg::comp_op_dst_out, BlendSrcAtop = agg::comp_op_src_atop, BlendDstAtop = agg::comp_op_dst_atop, BlendXor = agg::comp_op_xor, BlendAdd = agg::comp_op_plus, BlendSub = agg::comp_op_minus, BlendMultiply = agg::comp_op_multiply, BlendScreen = agg::comp_op_screen, BlendOverlay = agg::comp_op_overlay, BlendDarken = agg::comp_op_darken, BlendLighten = agg::comp_op_lighten, BlendColorDodge = agg::comp_op_color_dodge, BlendColorBurn = agg::comp_op_color_burn, BlendHardLight = agg::comp_op_hard_light, BlendSoftLight = agg::comp_op_soft_light, BlendDifference = agg::comp_op_difference, BlendExclusion = agg::comp_op_exclusion, BlendContrast = agg::comp_op_contrast }; enum Direction { CW, CCW }; }; template class Agg2DRenderer; template class Agg2D : public Agg2DBase { public: typedef typename PixFormatSet::PixFormat PixFormat; typedef Image MyImage; typedef agg::order_bgra ComponentOrder; // Platform dependent! typedef agg::rgba8 ColorType; typedef agg::blender_rgba Blender; typedef agg::comp_op_adaptor_rgba BlenderComp; typedef agg::blender_rgba_pre BlenderPre; typedef agg::comp_op_adaptor_rgba_pre BlenderCompPre; // JME //typedef agg::pixel_formats_rgba PixFormat; //typedef agg::pixfmt_bgra32 PixFormat; // JME //typedef agg::pixfmt_custom_blend_rgba PixFormatComp; typedef agg::pixfmt_custom_blend_rgba PixFormatComp; // JME //typedef agg::pixel_formats_rgba PixFormatPre; typedef typename PixFormatSet::PixFormatPre PixFormatPre; // JME //typedef agg::pixfmt_custom_blend_rgba PixFormatCompPre; typedef agg::pixfmt_custom_blend_rgba PixFormatCompPre; typedef agg::renderer_base RendererBase; typedef agg::renderer_base RendererBaseComp; typedef agg::renderer_base RendererBasePre; typedef agg::renderer_base RendererBaseCompPre; typedef agg::renderer_scanline_aa_solid RendererSolid; typedef agg::renderer_scanline_aa_solid RendererSolidComp; typedef agg::span_allocator SpanAllocator; typedef agg::pod_auto_array GradientArray; typedef agg::span_gradient, agg::gradient_x, GradientArray> LinearGradientSpan; typedef agg::span_gradient, agg::gradient_circle, GradientArray> RadialGradientSpan; #ifdef AGG2D_USE_VECTORFONTS #ifdef AGG2D_USE_FREETYPE typedef agg::font_engine_freetype_int32 FontEngine; #else typedef agg::font_engine_win32_tt_int32 FontEngine; #endif typedef agg::font_cache_manager FontCacheManager; typedef FontCacheManager::gray8_adaptor_type FontRasterizer; typedef FontCacheManager::gray8_scanline_type FontScanline; #endif typedef agg::conv_curve ConvCurve; typedef agg::conv_stroke ConvStroke; typedef agg::conv_transform PathTransform; typedef agg::conv_transform StrokeTransform; enum Gradient { Solid, Linear, Radial }; public: template friend class Agg2DRenderer; typedef ColorType Color; struct State { RectD m_clipBox; BlendMode m_blendMode; BlendMode m_imageBlendMode; Color m_imageBlendColor; double m_masterAlpha; double m_antiAliasGamma; const agg::int8u* m_font; Color m_fillColor; Color m_lineColor; GradientArray m_fillGradient; GradientArray m_lineGradient; LineCap m_lineCap; LineJoin m_lineJoin; Gradient m_fillGradientFlag; Gradient m_lineGradientFlag; agg::trans_affine m_fillGradientMatrix; agg::trans_affine m_lineGradientMatrix; double m_fillGradientD1; double m_lineGradientD1; double m_fillGradientD2; double m_lineGradientD2; double m_textAngle; TextAlignment m_textAlignX; TextAlignment m_textAlignY; bool m_textHints; double m_fontHeight; double m_fontAscent; double m_fontDescent; FontCacheType m_fontCacheType; double m_lineWidth; bool m_evenOddFlag; agg::trans_affine m_transform; agg::trans_affine m_affine; }; ~Agg2D(); Agg2D(); // Setup //----------------------- void attach(unsigned char* buf, unsigned width, unsigned height, int stride); void attach(MyImage& img); void clipBox(double x1, double y1, double x2, double y2); RectD clipBox() const; void clearAll(Color c); void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255); void clearClipBox(Color c); void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255); unsigned width() const { return m_rbuf.width(); } unsigned height() const { return m_rbuf.height(); } unsigned stride() const { return m_rbuf.stride(); } // Conversions //----------------------- void worldToScreen(double& x, double& y) const; void screenToWorld(double& x, double& y) const; double worldToScreen(double scalar) const; double screenToWorld(double scalar) const; void alignPoint(double& x, double& y) const; bool inBox(double worldX, double worldY) const; // General Attributes //----------------------- void blendMode(BlendMode m); BlendMode blendMode() const; void imageBlendMode(BlendMode m); BlendMode imageBlendMode() const; void imageBlendColor(Color c); void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255); Color imageBlendColor() const; void masterAlpha(double a); double masterAlpha() const; void antiAliasGamma(double g); double antiAliasGamma() const; void font(const agg::int8u* font) { m_font = font; } const agg::int8u* font() { return m_font; } void fillColor(Color c); void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255); void noFill(); void lineColor(Color c); void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255); void noLine(); Color fillColor() const; Color lineColor() const; void fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0); void lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0); void fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0); void lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0); void fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3); void lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3); void fillRadialGradient(double x, double y, double r); void lineRadialGradient(double x, double y, double r); void lineWidth(double w); double lineWidth() const; void lineCap(LineCap cap); LineCap lineCap() const; void lineJoin(LineJoin join); LineJoin lineJoin() const; void fillEvenOdd(bool evenOddFlag); bool fillEvenOdd() const; // Transformations //----------------------- Transformations transformations() const; void transformations(const Transformations& tr); const Affine& affine() const; void affine(const Affine&); void resetTransformations(); void matrix(const Affine& tr); void matrix(const Transformations& tr); void rotate(double angle); void rotate(double angle, double cx, double cy); void scale(double s); void scale(double sx, double sy); void skew(double sx, double sy); void translate(double x, double y); void parallelogram(double x1, double y1, double x2, double y2, const double* para); void viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, ViewportOption opt=XMidYMid, WindowFitLogic fl = WindowFitLogic_meet); // Basic Shapes //----------------------- void line(double x1, double y1, double x2, double y2); void triangle(double x1, double y1, double x2, double y2, double x3, double y3); void rectangle(double x1, double y1, double x2, double y2); void roundedRect(double x1, double y1, double x2, double y2, double r); void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry); void roundedRect(double x1, double y1, double x2, double y2, double rxBottom, double ryBottom, double rxTop, double ryTop); void ellipse(double cx, double cy, double rx, double ry); void arc(double cx, double cy, double rx, double ry, double start, double sweep); void star(double cx, double cy, double r1, double r2, double startAngle, int numRays); void curve(double x1, double y1, double x2, double y2, double x3, double y3); void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); void polygon(double* xy, int numPoints); void polyline(double* xy, int numPoints); // Text //----------------------- #ifdef AGG2D_USE_VECTORFONTS void flipText(bool flip); void font(const char* fileName, double height, bool bold = false, bool italic = false, FontCacheType ch = RasterFontCache, double angle = 0.0); double fontHeight() const; double fontAscent() const; void textAlignment(TextAlignment alignX, TextAlignment alignY); bool textHints() const; void textHints(bool hints); double textWidth(const char* str, unsigned int len); double textWidth(const wchar_t* str, unsigned int len); void text(double x, double y, const char* str, unsigned int len, bool roundOff=false, double dx=0.0, double dy=0.0); void text(double x, double y, const wchar_t* str, unsigned int len, bool roundOff=false, double dx=0.0, double dy=0.0); double textWidth(const char* str); void text(double x, double y, const char* str, bool roundOff=false, double dx=0.0, double dy=0.0); #endif // Path commands //----------------------- void resetPath(); void moveTo(double x, double y); void moveRel(double dx, double dy); void lineTo(double x, double y); void lineRel(double dx, double dy); void horLineTo(double x); void horLineRel(double dx); void verLineTo(double y); void verLineRel(double dy); void arcTo(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double x, double y); void arcRel(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double dx, double dy); void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo); void quadricCurveRel(double dxCtrl, double dyCtrl, double dxTo, double dyTo); void quadricCurveTo(double xTo, double yTo); void quadricCurveRel(double dxTo, double dyTo); void cubicCurveTo(double xCtrl1, double yCtrl1, double xCtrl2, double yCtrl2, double xTo, double yTo); void cubicCurveRel(double dxCtrl1, double dyCtrl1, double dxCtrl2, double dyCtrl2, double dxTo, double dyTo); void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo); void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo); void addEllipse(double cx, double cy, double rx, double ry, Direction dir); void closePolygon(); void drawPath(DrawPathFlag flag = FillAndStroke); void drawPathNoTransform(DrawPathFlag flag = FillAndStroke); // Image Transformations //----------------------- void imageFilter(ImageFilter f); ImageFilter imageFilter() const; void imageResample(ImageResample f); ImageResample imageResample() const; //--------- //if anyone can figure out how to put these in the .inl file, theyre more than welcome to. I couldnt declare them correctly to match //the .h file declaration AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX1, double dstY1, double dstX2, double dstY2) { resetPath(); moveTo(dstX1, dstY1); lineTo(dstX2, dstY1); lineTo(dstX2, dstY2); lineTo(dstX1, dstY2); closePolygon(); double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage (img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, double dstX1, double dstY1, double dstX2, double dstY2) { resetPath(); moveTo(dstX1, dstY1); lineTo(dstX2, dstY1); lineTo(dstX2, dstY2); lineTo(dstX1, dstY2); closePolygon(); double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, const double* parallelogram) { resetPath(); moveTo(parallelogram[0], parallelogram[1]); lineTo(parallelogram[2], parallelogram[3]); lineTo(parallelogram[4], parallelogram[5]); lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], parallelogram[1] + parallelogram[5] - parallelogram[3]); closePolygon(); renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, const double* parallelogram) { resetPath(); moveTo(parallelogram[0], parallelogram[1]); lineTo(parallelogram[2], parallelogram[3]); lineTo(parallelogram[4], parallelogram[5]); lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], parallelogram[1] + parallelogram[5] - parallelogram[3]); closePolygon(); renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX1, double dstY1, double dstX2, double dstY2) { double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, double dstX1, double dstY1, double dstX2, double dstY2) { double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, const double* parallelogram) { renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, const double* parallelogram) { renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } // Image Blending (no transformations available) AGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX, double dstY, unsigned alpha=255) { worldToScreen(dstX, dstY); PixFormat pixF(img.renBuf); // JME //agg::rect r(imgX1, imgY1, imgX2, imgY2); Rect r(imgX1, imgY1, imgX2, imgY2); if(m_blendMode == BlendAlpha) { m_renBasePre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); } else { m_renBaseCompPre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); } } void renderText(double dstX, double dstY, const std::string& str) { worldToScreen(dstX, dstY); PixFormat pixF(m_rbuf); //Rect r(imgX1, imgY1, imgX2, imgY2); typedef agg::glyph_raster_bin glyph_gen; glyph_gen glyph(0); if(m_blendMode == BlendAlpha) { typedef agg::renderer_base ren_base; agg::renderer_raster_htext_solid rt(m_renBasePre,glyph); rt.color(m_lineColor); glyph.font(m_font); rt.render_text(dstX, dstY, str.c_str(), true); //flipy } else { typedef agg::renderer_base ren_base; agg::renderer_raster_htext_solid rt(m_renBaseCompPre,glyph); rt.color(m_lineColor); glyph.font(m_font); rt.render_text(dstX, dstY, str.c_str(), true); //flipy } } AGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img, double dstX, double dstY, unsigned alpha=255) { worldToScreen(dstX, dstY); PixFormat pixF(img.renBuf); m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); if(m_blendMode == BlendAlpha) { m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); } else { m_renBaseCompPre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); } } // Copy image directly, together with alpha-channel AGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX, double dstY) { worldToScreen(dstX, dstY); // JME //agg::rect r(imgX1, imgY1, imgX2, imgY2); Rect r(imgX1, imgY1, imgX2, imgY2); m_renBase.copy_from(img.renBuf, &r, int(dstX)-imgX1, int(dstY)-imgY1); } AGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img, double dstX, double dstY) { worldToScreen(dstX, dstY); m_renBase.copy_from(img.renBuf, 0, int(dstX), int(dstY)); } // State //----------------------- void saveStateTo(State& st); void restoreStateFrom(const State& st); // Auxiliary //----------------------- static double pi() { return agg::pi; } static double deg2Rad(double v) { return v * agg::pi / 180.0; } static double rad2Deg(double v) { return v * 180.0 / agg::pi; } PixFormat & pixFormat() { return m_pixFormat; } agg::rendering_buffer & buf() { return m_rbuf; } private: void render(bool fillColor); #ifdef AGG2D_USE_VECTORFONTS #if !defined( UNDER_CE ) void render(FontRasterizer& ras, FontScanline& sl); #endif #endif void addLine(double x1, double y1, double x2, double y2); void updateRasterizerGamma(); AGG2D_IMAGE_TEMPLATE void renderImage(const TIMAGE& img, int x1, int y1, int x2, int y2, const double* parl) { agg::trans_affine mtx((double)x1, (double)y1, (double)x2, (double)y2, parl); mtx *= m_transform; mtx.invert(); m_rasterizer.reset(); m_rasterizer.add_path(m_pathTransform); typedef agg::span_interpolator_linear Interpolator; Interpolator interpolator(mtx); if(m_blendMode == BlendAlpha) { // JME audit - Agg2DRenderer::renderImage(*this, img, m_renBasePre, interpolator); } else { Agg2DRenderer::renderImage(*this, img, m_renBaseCompPre, interpolator); } } void updateTransformations(); agg::rendering_buffer m_rbuf; PixFormat m_pixFormat; PixFormatComp m_pixFormatComp; PixFormatPre m_pixFormatPre; PixFormatCompPre m_pixFormatCompPre; RendererBase m_renBase; RendererBaseComp m_renBaseComp; RendererBasePre m_renBasePre; RendererBaseCompPre m_renBaseCompPre; RendererSolid m_renSolid; RendererSolidComp m_renSolidComp; SpanAllocator m_allocator; RectD m_clipBox; BlendMode m_blendMode; BlendMode m_imageBlendMode; Color m_imageBlendColor; agg::scanline_u8 m_scanline; agg::rasterizer_scanline_aa<> m_rasterizer; double m_masterAlpha; double m_antiAliasGamma; const agg::int8u* m_font; Color m_fillColor; Color m_lineColor; GradientArray m_fillGradient; GradientArray m_lineGradient; LineCap m_lineCap; LineJoin m_lineJoin; Gradient m_fillGradientFlag; Gradient m_lineGradientFlag; agg::trans_affine m_fillGradientMatrix; agg::trans_affine m_lineGradientMatrix; double m_fillGradientD1; double m_lineGradientD1; double m_fillGradientD2; double m_lineGradientD2; double m_textAngle; TextAlignment m_textAlignX; TextAlignment m_textAlignY; bool m_textHints; double m_fontHeight; double m_fontAscent; double m_fontDescent; FontCacheType m_fontCacheType; ImageFilter m_imageFilter; ImageResample m_imageResample; agg::image_filter_lut m_imageFilterLut; agg::span_interpolator_linear<> m_fillGradientInterpolator; agg::span_interpolator_linear<> m_lineGradientInterpolator; agg::gradient_x m_linearGradientFunction; agg::gradient_circle m_radialGradientFunction; double m_lineWidth; bool m_evenOddFlag; double m_start_x; double m_start_y; agg::path_storage m_path; agg::trans_affine m_transform; agg::trans_affine m_viewport; agg::trans_affine m_affine; ConvCurve m_convCurve; ConvStroke m_convStroke; PathTransform m_pathTransform; StrokeTransform m_strokeTransform; #ifdef AGG2D_USE_VECTORFONTS #ifndef AGG2D_USE_FREETYPE HDC m_fontDC; #endif FontEngine m_fontEngine; FontCacheManager m_fontCacheManager; #endif }; #include "agg2d.inl" #endif desmume-0.9.11/src/emufile.cpp0000755000000000000000000001400412467662066014701 0ustar rootroot/* The MIT License Copyright (C) 2009-2015 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 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 "emufile.h" #include bool EMUFILE::readAllBytes(std::vector* dstbuf, const std::string& fname) { EMUFILE_FILE file(fname.c_str(),"rb"); if(file.fail()) return false; int size = file.size(); dstbuf->resize(size); file.fread(&dstbuf->at(0),size); return true; } size_t EMUFILE_MEMORY::_fread(const void *ptr, size_t bytes){ u32 remain = len-pos; u32 todo = std::min(remain,(u32)bytes); if(len==0) { failbit = true; return 0; } if(todo<=4) { u8* src = buf()+pos; u8* dst = (u8*)ptr; for(size_t i=0;ibuf(),size()); return mem; } EMUFILE* EMUFILE_MEMORY::memwrap() { return this; } void EMUFILE::write64le(u64* val) { write64le(*val); } void EMUFILE::write64le(u64 val) { val = LOCAL_TO_LE_64(val); fwrite(&val,8); } size_t EMUFILE::read64le(u64 *Bufo) { u64 buf; if(fread((char*)&buf,8) != 8) return 0; *Bufo = LE_TO_LOCAL_64(buf); return 1; } u64 EMUFILE::read64le() { u64 temp; read64le(&temp); return temp; } void EMUFILE::write32le(u32* val) { write32le(*val); } void EMUFILE::write32le(u32 val) { val = LOCAL_TO_LE_32(val); fwrite(&val,4); } size_t EMUFILE::read32le(s32* Bufo) { return read32le((u32*)Bufo); } size_t EMUFILE::read32le(u32* Bufo) { u32 buf; if(fread(&buf,4)<4) return 0; *Bufo = LE_TO_LOCAL_32(buf); return 1; } u32 EMUFILE::read32le() { u32 ret; read32le(&ret); return ret; } void EMUFILE::write16le(u16* val) { write16le(*val); } void EMUFILE::write16le(u16 val) { val = LOCAL_TO_LE_16(val); fwrite(&val,2); } size_t EMUFILE::read16le(s16* Bufo) { return read16le((u16*)Bufo); } size_t EMUFILE::read16le(u16* Bufo) { u32 buf; if(fread(&buf,2)<2) return 0; *Bufo = LE_TO_LOCAL_16(buf); return 1; } u16 EMUFILE::read16le() { u16 ret; read16le(&ret); return ret; } void EMUFILE::write8le(u8* val) { write8le(*val); } void EMUFILE::write8le(u8 val) { fwrite(&val,1); } size_t EMUFILE::read8le(u8* val) { return fread(val,1); } u8 EMUFILE::read8le() { u8 temp; fread(&temp,1); return temp; } void EMUFILE::writedouble(double* val) { write64le(double_to_u64(*val)); } void EMUFILE::writedouble(double val) { write64le(double_to_u64(val)); } double EMUFILE::readdouble() { double temp; readdouble(&temp); return temp; } size_t EMUFILE::readdouble(double* val) { u64 temp; size_t ret = read64le(&temp); *val = u64_to_double(temp); return ret; } void EMUFILE::writeMemoryStream(EMUFILE_MEMORY* ms) { s32 size = (s32)ms->size(); write32le(size); if(size>0) { std::vector* vec = ms->get_vec(); fwrite(&vec->at(0),size); } } void EMUFILE::readMemoryStream(EMUFILE_MEMORY* ms) { s32 size = read32le(); if(size != 0) { std::vector temp(size); fread(&temp[0],size); ms->fwrite(&temp[0],size); } } desmume-0.9.11/src/rtc.cpp0000755000000000000000000002061012467662066014043 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008 CrazyMax Copyright (C) 2008-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ // TODO: interrupt handler #include "rtc.h" #include "common.h" #include "debug.h" #include "armcpu.h" #include #include "saves.h" #ifdef WIN32 #include "windows/main.h" #endif #include "movie.h" typedef struct { // RTC registers u8 regStatus1; u8 regStatus2; u8 regAdjustment; u8 regFree; // BUS u8 _prevSCK; u8 _prevCS; u8 _prevSIO; u8 _SCK; u8 _CS; u8 _SIO; u8 _DD; u16 _REG; // command & data u8 cmd; u8 cmdStat; u8 bitsCount; u8 data[8]; u8 cmdBitsSize[8]; } _RTC; _RTC rtc; SFORMAT SF_RTC[]={ { "R000", 1, 1, &rtc.regStatus1}, { "R010", 1, 1, &rtc.regStatus2}, { "R020", 1, 1, &rtc.regAdjustment}, { "R030", 1, 1, &rtc.regFree}, { "R040", 1, 1, &rtc._prevSCK}, { "R050", 1, 1, &rtc._prevCS}, { "R060", 1, 1, &rtc._prevSIO}, { "R070", 1, 1, &rtc._SCK}, { "R080", 1, 1, &rtc._CS}, { "R090", 1, 1, &rtc._SIO}, { "R100", 1, 1, &rtc._DD}, { "R110", 2, 1, &rtc._REG}, { "R120", 1, 1, &rtc.cmd}, { "R130", 1, 1, &rtc.cmdStat}, { "R140", 1, 1, &rtc.bitsCount}, { "R150", 1, 8, &rtc.data[0]}, { "R160", 1, 8, &rtc.cmdBitsSize[0]}, { 0 } }; static const u8 kDefaultCmdBitsSize[8] = {8, 8, 56, 24, 0, 24, 8, 8}; static inline u8 toBCD(u8 x) { return ((x / 10) << 4) | (x % 10); } bool moviemode=false; DateTime rtcGetTime(void) { DateTime tm; if(movieMode == MOVIEMODE_INACTIVE) { return DateTime::get_Now(); } else { //now, you might think it is silly to go through all these conniptions //when we could just assume that there are 60fps and base the seconds on frameCounter/60 //but, we were imagining that one day we might need more precision const u32 arm9rate_unitsperframe = 560190<<1; const u32 arm9rate_unitspersecond = (u32)(arm9rate_unitsperframe * 59.8261); u64 totalcycles = (u64)arm9rate_unitsperframe * currFrameCounter; u64 totalseconds=totalcycles/arm9rate_unitspersecond; DateTime timer = currMovieData.rtcStart; return timer.AddSeconds(totalseconds); } } static void rtcRecv() { //INFO("RTC Read command 0x%02X\n", (rtc.cmd >> 1)); memset(&rtc.data[0], 0, sizeof(rtc.data)); switch (rtc.cmd >> 1) { case 0: // status register 1 //INFO("RTC: read regstatus1 (0x%02X)\n", rtc.regStatus1); rtc.regStatus1 &= 0x0F; rtc.data[0] = rtc.regStatus1; //rtc.regStatus1 &= 0x7F; break; case 1: // status register 2 //INFO("RTC: read regstatus2 (0x%02X)\n", rtc.regStatus1); rtc.data[0] = rtc.regStatus2; break; case 2: // date & time { //INFO("RTC: read date & time\n"); DateTime tm = rtcGetTime(); rtc.data[0] = toBCD(tm.get_Year() % 100); rtc.data[1] = toBCD(tm.get_Month()); rtc.data[2] = toBCD(tm.get_Day()); //zero 24-apr-2010 - this is nonsense. //but it is so wrong, someone mustve thought they knew what they were doing, so i am leaving it... //rtc.data[3] = (tm.tm_wday + 6) & 7; //if (rtc.data[3] == 7) rtc.data[3] = 6; //do this instead (gbatek seems to say monday=0 but i don't think that is right) //0=sunday is necessary to make animal crossing behave //maybe it means "custom assignment" can be specified by the game rtc.data[3] = tm.get_DayOfWeek(); int hour = tm.get_Hour(); if (!(rtc.regStatus1 & 0x02)) hour %= 12; rtc.data[4] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour); rtc.data[5] = toBCD(tm.get_Minute()); rtc.data[6] = toBCD(tm.get_Second()); break; } case 3: // time { //INFO("RTC: read time\n"); DateTime tm = rtcGetTime(); int hour = tm.get_Hour(); if (!(rtc.regStatus1 & 0x02)) hour %= 12; rtc.data[0] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour); rtc.data[1] = toBCD(tm.get_Minute()); rtc.data[2] = toBCD(tm.get_Second()); break; } case 4: // freq/alarm 1 /*if (cmdBitsSize[0x04] == 8) INFO("RTC: read INT1 freq\n"); else INFO("RTC: read INT1 alarm1\n");*/ //NDS_makeARM7Int(7); break; case 5: // alarm 2 //INFO("RTC: read alarm 2\n"); break; case 6: // clock adjust //INFO("RTC: read clock adjust\n"); rtc.data[0] = rtc.regAdjustment; break; case 7: // free register //INFO("RTC: read free register\n"); rtc.data[0] = rtc.regFree; break; } } static void rtcSend() { //INFO("RTC write command 0x%02X\n", (rtc.cmd >> 1)); switch (rtc.cmd >> 1) { case 0: // status register 1 //INFO("RTC: write regstatus1 0x%02X\n", rtc.data[0]); // rtc.regStatus1 &= 0xF1; // rtc.regStatus1 |= (rtc.data[0] | 0x0E); rtc.regStatus1 = rtc.data[0]; break; case 1: // status register 2 //INFO("RTC: write regstatus2 0x%02X\n", rtc.data[0]); rtc.regStatus2 = rtc.data[0]; break; case 2: // date & time //INFO("RTC: write date & time : %02X %02X %02X %02X %02X %02X %02X\n", rtc.data[0], rtc.data[1], rtc.data[2], rtc.data[3], rtc.data[4], rtc.data[5], rtc.data[6]); break; case 3: // time //INFO("RTC: write time : %02X %02X %02X\n", rtc.data[0], rtc.data[1], rtc.data[2]); break; case 4: // freq/alarm 1 /*if (cmdBitsSize[0x04] == 8) INFO("RTC: write INT1 freq 0x%02X\n", rtc.data[0]); else INFO("RTC: write INT1 alarm1 0x%02X\n", rtc.data[0]);*/ break; case 5: // alarm 2 //INFO("RTC: write alarm 2\n"); break; case 6: // clock adjust //INFO("RTC: write clock adjust\n"); rtc.regAdjustment = rtc.data[0]; break; case 7: // free register //INFO("RTC: write free register\n"); rtc.regFree = rtc.data[0]; break; } } void rtcInit() { memset(&rtc, 0, sizeof(rtc)); memcpy(&rtc.cmdBitsSize[0],kDefaultCmdBitsSize,8); rtc.regStatus1 |= 0x02; } u16 rtcRead() { //INFO("MMU Read RTC 0x%02X (%03i)\n", rtc._REG, rtc.bitsCount); return (rtc._REG); } void rtcWrite(u16 val) { //INFO("MMU Write RTC 0x%02X (%03i)\n", val, rtc.bitsCount); rtc._DD = (val & 0x10) >> 4; rtc._SIO = rtc._DD?(val & 0x01):rtc._prevSIO; rtc._SCK = (val & 0x20)?((val & 0x02) >> 1):rtc._prevSCK; rtc._CS = (val & 0x40)?((val & 0x04) >> 2):rtc._prevCS; switch (rtc.cmdStat) { case 0: if ( (!rtc._prevCS) && (rtc._prevSCK) && (rtc._CS) && (rtc._SCK) ) { rtc.cmdStat = 1; rtc.bitsCount = 0; rtc.cmd = 0; } break; case 1: if (!rtc._CS) { rtc.cmdStat = 0; break; } if (rtc._SCK && rtc._DD) break; if (!rtc._SCK && !rtc._DD) break; rtc.cmd |= (rtc._SIO << rtc.bitsCount ); rtc.bitsCount ++; if (rtc.bitsCount == 8) { //INFO("RTC command 0x%02X\n", rtc.cmd); // Little-endian command if((rtc.cmd & 0x0F) == 0x06) { u8 tmp = rtc.cmd; rtc.cmd = ((tmp & 0x80) >> 7) | ((tmp & 0x40) >> 5) | ((tmp & 0x20) >> 3) | ((tmp & 0x10) >> 1); } // Big-endian command else { rtc.cmd &= 0x0F; } if((rtc._prevSCK) && (!rtc._SCK)) { rtc.bitsCount = 0; if ((rtc.cmd >> 1) == 0x04) { if ((rtc.regStatus2 & 0x0F) == 0x04) rtc.cmdBitsSize[rtc.cmd >> 1] = 24; else rtc.cmdBitsSize[rtc.cmd >> 1] = 8; } if (rtc.cmd & 0x01) { rtc.cmdStat = 4; rtcRecv(); } else { rtc.cmdStat = 3; } } } break; case 3: // write: if( (rtc._prevSCK) && (!rtc._SCK) ) { if(rtc._SIO) rtc.data[rtc.bitsCount >> 3] |= (1 << (rtc.bitsCount & 0x07)); rtc.bitsCount++; if (rtc.bitsCount == rtc.cmdBitsSize[rtc.cmd >> 1]) { rtcSend(); rtc.cmdStat = 0; } } break; case 4: // read: if( (rtc._prevSCK) && (!rtc._SCK) ) { rtc._REG = val; if((rtc.data[(rtc.bitsCount >> 3)] >> (rtc.bitsCount & 0x07)) & 0x01) rtc._REG |= 0x01; else rtc._REG &= ~0x01; rtc.bitsCount++; if (rtc.bitsCount == rtc.cmdBitsSize[rtc.cmd >> 1] || (!(val & 0x04))) rtc.cmdStat = 0; } break; } rtc._prevSIO = rtc._SIO; rtc._prevSCK = rtc._SCK; rtc._prevCS = rtc._CS; } desmume-0.9.11/src/build.bat0000755000000000000000000000003712467662066014337 0ustar rootrootconfigure make clean make pausedesmume-0.9.11/src/encrypt.h0000755000000000000000000000300312467662066014401 0ustar rootroot/* Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _ENCRYPT_H_ #define _ENCRYPT_H_ #include "types.h" #include struct _KEY1 { _KEY1(const u8 *inKeyBufPtr) { if (keyBuf) delete keyBuf; keyBuf = new u32 [0x412]; memset(keyBuf, 0x00, 0x412 * sizeof(u32)); memset(&keyCode[0], 0, sizeof(keyCode)); this->keyBufPtr = inKeyBufPtr; } ~_KEY1() { if (keyBuf) { delete keyBuf; keyBuf = NULL; } } u32 *keyBuf; u32 keyCode[3]; const u8 *keyBufPtr; void init(u32 idcode, u8 level, u8 modulo); void applyKeycode(u8 modulo); void decrypt(u32 *ptr); void encrypt(u32 *ptr); }; struct _KEY2 { private: u64 seed0; u64 seed1; u64 x; u64 y; u64 bitsReverse39(u64 key); public: _KEY2() : seed0(0x58C56DE0E8ULL), seed1(0x5C879B9B05ULL) {} void applySeed(u8 PROCNUM); u8 apply(u8 data); }; #endifdesmume-0.9.11/src/commandline.cpp0000755000000000000000000003241112467662066015543 0ustar rootroot/* Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //windows note: make sure this file gets compiled with _cdecl #include #include #include #include "commandline.h" #include "types.h" #include "movie.h" #include "slot1.h" #include "slot2.h" #include "NDSSystem.h" #include "utils/xstring.h" int _scanline_filter_a = 0, _scanline_filter_b = 2, _scanline_filter_c = 2, _scanline_filter_d = 4; int _commandline_linux_nojoy = 0; CommandLine::CommandLine() : is_cflash_configured(false) , _load_to_memory(-1) , error(NULL) , ctx(g_option_context_new ("")) , _play_movie_file(0) , _record_movie_file(0) , _cflash_image(0) , _cflash_path(0) , _gbaslot_rom(0) , _bios_arm9(NULL) , _bios_arm7(NULL) , _bios_swi(0) , _spu_sync_mode(-1) , _spu_sync_method(-1) , _spu_advanced(0) , _num_cores(-1) , _rigorous_timing(0) , _advanced_timing(-1) , _slot1(NULL) , _slot1_fat_dir(NULL) , _slot1_fat_dir_type(false) #ifdef HAVE_JIT , _cpu_mode(-1) , _jit_size(-1) #endif , _console_type(NULL) , _advanscene_import(NULL) , depth_threshold(-1) , load_slot(-1) , arm9_gdb_port(0) , arm7_gdb_port(0) , start_paused(FALSE) , autodetect_method(-1) { #ifndef HOST_WINDOWS disable_sound = 0; disable_limiter = 0; #endif } CommandLine::~CommandLine() { if(error) g_error_free (error); g_option_context_free (ctx); } void CommandLine::loadCommonOptions() { //these options should be available in every port. //my advice is, do not be afraid of using #ifdef here if it makes sense. //but also see the gtk port for an example of how to combine this with other options //(you may need to use ifdefs to cause options to be entered in the desired order) static const GOptionEntry options[] = { { "load-type", 0, 0, G_OPTION_ARG_INT, &_load_to_memory, "ROM loading method, 0 - stream from disk (like an iso), 1 - load entirely to RAM (default 0)", "LOAD_TYPE"}, { "load-slot", 0, 0, G_OPTION_ARG_INT, &load_slot, "Loads savestate from slot NUM", "NUM"}, { "play-movie", 0, 0, G_OPTION_ARG_FILENAME, &_play_movie_file, "Specifies a dsm format movie to play", "PATH_TO_PLAY_MOVIE"}, { "record-movie", 0, 0, G_OPTION_ARG_FILENAME, &_record_movie_file, "Specifies a path to a new dsm format movie", "PATH_TO_RECORD_MOVIE"}, { "start-paused", 0, 0, G_OPTION_ARG_NONE, &start_paused, "Indicates that emulation should start paused", "START_PAUSED"}, { "cflash-image", 0, 0, G_OPTION_ARG_FILENAME, &_cflash_image, "Requests cflash in gbaslot with fat image at this path", "CFLASH_IMAGE"}, { "cflash-path", 0, 0, G_OPTION_ARG_FILENAME, &_cflash_path, "Requests cflash in gbaslot with filesystem rooted at this path", "CFLASH_PATH"}, { "gbaslot-rom", 0, 0, G_OPTION_ARG_FILENAME, &_gbaslot_rom, "Requests this GBA rom in gbaslot", "GBASLOT_ROM"}, { "bios-arm9", 0, 0, G_OPTION_ARG_FILENAME, &_bios_arm9, "Uses the arm9 bios provided at the specified path", "BIOS_ARM9_PATH"}, { "bios-arm7", 0, 0, G_OPTION_ARG_FILENAME, &_bios_arm7, "Uses the arm7 bios provided at the specified path", "BIOS_ARM7_PATH"}, { "bios-swi", 0, 0, G_OPTION_ARG_INT, &_bios_swi, "Uses SWI from the provided bios files", "BIOS_SWI"}, { "spu-mode", 0, 0, G_OPTION_ARG_INT, &_spu_sync_mode, "Select SPU Synchronization Mode. 0 - Dual SPU Synch/Asynch (traditional), 1 - Synchronous (sometimes needed for streams) (default 0)", "SPU_MODE"}, { "spu-method", 0, 0, G_OPTION_ARG_INT, &_spu_sync_method, "Select SPU Synchronizer Method. 0 - N, 1 - Z, 2 - P (default 0)", "SPU_SYNC_METHOD"}, { "spu-advanced", 0, 0, G_OPTION_ARG_INT, &_spu_advanced, "Uses advanced SPU capture functions", "SPU_ADVANCED"}, { "num-cores", 0, 0, G_OPTION_ARG_INT, &_num_cores, "Override numcores detection and use this many", "NUM_CORES"}, { "scanline-filter-a", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_a, "Intensity of fadeout for scanlines filter (topleft) (default 0)", "SCANLINE_FILTER_A"}, { "scanline-filter-b", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_b, "Intensity of fadeout for scanlines filter (topright) (default 2)", "SCANLINE_FILTER_B"}, { "scanline-filter-c", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_c, "Intensity of fadeout for scanlines filter (bottomleft) (default 2)", "SCANLINE_FILTER_C"}, { "scanline-filter-d", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_d, "Intensity of fadeout for scanlines filter (bottomright) (default 4)", "SCANLINE_FILTER_D"}, { "rigorous-timing", 0, 0, G_OPTION_ARG_INT, &_rigorous_timing, "Use some rigorous timings instead of unrealistically generous (default 0)", "RIGOROUS_TIMING"}, { "advanced-timing", 0, 0, G_OPTION_ARG_INT, &_advanced_timing, "Use advanced BUS-level timing (default 1)", "ADVANCED_TIMING"}, { "slot1", 0, 0, G_OPTION_ARG_STRING, &_slot1, "Device to mount in slot 1 (default retail)", "SLOT1"}, { "slot1-fat-dir", 0, 0, G_OPTION_ARG_STRING, &_slot1_fat_dir, "Directory to scan for slot 1", "SLOT1_DIR"}, { "depth-threshold", 0, 0, G_OPTION_ARG_INT, &depth_threshold, "Depth comparison threshold (default 0)", "DEPTHTHRESHOLD"}, { "console-type", 0, 0, G_OPTION_ARG_STRING, &_console_type, "Select console type: {fat,lite,ique,debug,dsi}", "CONSOLETYPE" }, { "advanscene-import", 0, 0, G_OPTION_ARG_STRING, &_advanscene_import, "Import advanscene, dump .ddb, and exit", "ADVANSCENE_IMPORT" }, #ifdef HAVE_JIT { "cpu-mode", 0, 0, G_OPTION_ARG_INT, &_cpu_mode, "ARM CPU emulation mode: 0 - interpreter, 1 - dynarec (default 1)", NULL}, { "jit-size", 0, 0, G_OPTION_ARG_INT, &_jit_size, "ARM JIT block size: 1..100 (1 - accuracy, 100 - faster) (default 100)", NULL}, #endif #ifndef HOST_WINDOWS { "disable-sound", 0, 0, G_OPTION_ARG_NONE, &disable_sound, "Disables the sound emulation", NULL}, { "disable-limiter", 0, 0, G_OPTION_ARG_NONE, &disable_limiter, "Disables the 60fps limiter", NULL}, { "nojoy", 0, 0, G_OPTION_ARG_INT, &_commandline_linux_nojoy, "Disables joystick support", "NOJOY"}, #endif #ifdef GDB_STUB { "arm9gdb", 0, 0, G_OPTION_ARG_INT, &arm9_gdb_port, "Enable the ARM9 GDB stub on the given port", "PORT_NUM"}, { "arm7gdb", 0, 0, G_OPTION_ARG_INT, &arm7_gdb_port, "Enable the ARM7 GDB stub on the given port", "PORT_NUM"}, #endif { "autodetect_method", 0, 0, G_OPTION_ARG_INT, &autodetect_method, "Autodetect backup method (0 - internal, 1 - from database)", "AUTODETECT_METHOD"}, { NULL } }; g_option_context_add_main_entries (ctx, options, "options"); } static char mytoupper(char c) { return ::toupper(c); } static std::string strtoupper(const std::string& str) { std::string ret = str; std::transform(ret.begin(), ret.end(), ret.begin(), ::mytoupper); return ret; } bool CommandLine::parse(int argc,char **argv) { g_option_context_parse (ctx, &argc, &argv, &error); if (error) { g_printerr("Error parsing command line arguments: %s\n", error->message); return false; } if(_advanscene_import) CommonSettings.run_advanscene_import = _advanscene_import; if(_slot1_fat_dir) slot1_fat_dir = _slot1_fat_dir; if(_slot1) slot1 = _slot1; slot1 = strtoupper(slot1); if(_console_type) console_type = _console_type; if(_load_to_memory != -1) CommonSettings.loadToMemory = (_load_to_memory == 1)?true:false; if(_play_movie_file) play_movie_file = _play_movie_file; if(_record_movie_file) record_movie_file = _record_movie_file; if(_cflash_image) cflash_image = _cflash_image; if(_cflash_path) cflash_path = _cflash_path; if(_gbaslot_rom) gbaslot_rom = _gbaslot_rom; if(_num_cores != -1) CommonSettings.num_cores = _num_cores; if(_rigorous_timing) CommonSettings.rigorous_timing = true; if(_advanced_timing != -1) CommonSettings.advanced_timing = _advanced_timing==1; #ifdef HAVE_JIT if(_cpu_mode != -1) CommonSettings.use_jit = (_cpu_mode==1); if(_jit_size != -1) { if ((_jit_size < 1) || (_jit_size > 100)) CommonSettings.jit_max_block_size = 100; else CommonSettings.jit_max_block_size = _jit_size; } #endif if(depth_threshold != -1) CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = depth_threshold; //process console type CommonSettings.DebugConsole = false; CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT; console_type = strtoupper(console_type); if(console_type == "") {} else if(console_type == "FAT") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT; else if(console_type == "LITE") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_LITE; else if(console_type == "IQUE") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_IQUE; else if(console_type == "DSI") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_DSI; else if(console_type == "DEBUG") { CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT; CommonSettings.DebugConsole = true; } if (autodetect_method != -1) CommonSettings.autodetectBackupMethod = autodetect_method; //TODO NOT MAX PRIORITY! change ARM9BIOS etc to be a std::string if(_bios_arm9) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM9BIOS,_bios_arm9); } if(_bios_arm7) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM7BIOS,_bios_arm7); } if(_bios_swi) CommonSettings.SWIFromBIOS = true; if(_spu_sync_mode != -1) CommonSettings.SPU_sync_mode = _spu_sync_mode; if(_spu_sync_method != -1) CommonSettings.SPU_sync_method = _spu_sync_method; if(_spu_advanced) CommonSettings.spu_advanced = true; if (argc == 2) nds_file = argv[1]; if (argc > 2) return false; return true; } bool CommandLine::validate() { if(slot1 != "") { if(slot1 != "R4" && slot1 != "RETAIL" && slot1 != "NONE" && slot1 != "RETAILNAND") { g_printerr("Invalid slot1 device specified.\n"); return false; } } if (_load_to_memory < -1 || _load_to_memory > 1) { g_printerr("Invalid parameter (0 - stream from disk, 1 - from RAM)\n"); return false; } if (_spu_sync_mode < -1 || _spu_sync_mode > 1) { g_printerr("Invalid parameter\n"); return false; } if (_spu_sync_method < -1 || _spu_sync_method > 2) { g_printerr("Invalid parameter\n"); return false; } if (load_slot < -1 || load_slot > 10) { g_printerr("I only know how to load from slots 0-10; -1 means 'do not load savegame' and is default\n"); return false; } if(play_movie_file != "" && record_movie_file != "") { g_printerr("Cannot both play and record a movie.\n"); return false; } if(record_movie_file != "" && load_slot != -1) { g_printerr("Cannot both record a movie and load a savestate.\n"); return false; } if(cflash_path != "" && cflash_image != "") { g_printerr("Cannot specify both cflash-image and cflash-path.\n"); return false; } if((_bios_arm9 && !_bios_arm7) || (_bios_arm7 && !_bios_arm9)) { g_printerr("If either bios-arm7 or bios-arm9 are specified, both must be.\n"); return false; } if(_bios_swi && (!_bios_arm7 || !_bios_arm9)) { g_printerr("If either bios-swi is used, bios-arm9 and bios-arm7 must be specified.\n"); } if((_cflash_image && _gbaslot_rom) || (_cflash_path && _gbaslot_rom)) { g_printerr("Cannot specify both cflash and gbaslot rom (both occupy SLOT-2)\n"); } if (autodetect_method < -1 || autodetect_method > 1) { g_printerr("Invalid autodetect save method (0 - internal, 1 - from database)\n"); } #ifdef HAVE_JIT if (_cpu_mode < -1 || _cpu_mode > 1) { g_printerr("Invalid cpu mode emulation (0 - interpreter, 1 - dynarec)\n"); } if (_jit_size < -1 && (_jit_size == 0 || _jit_size > 100)) { g_printerr("Invalid jit block size [1..100]. set to 100\n"); } #endif return true; } void CommandLine::errorHelp(const char* binName) { //TODO - strip this down to just the filename g_printerr("USAGE: %s [options] [nds-file]\n", binName); g_printerr("USAGE: %s --help - for help\n", binName); } void CommandLine::process_movieCommands() { if(play_movie_file != "") { FCEUI_LoadMovie(play_movie_file.c_str(),true,false,-1); } else if(record_movie_file != "") { FCEUI_SaveMovie(record_movie_file.c_str(), L"", 0, NULL, FCEUI_MovieGetRTCDefault()); } } void CommandLine::process_addonCommands() { if (cflash_image != "") { CFlash_Mode = ADDON_CFLASH_MODE_File; CFlash_Path = cflash_image; is_cflash_configured = true; } if (cflash_path != "") { CFlash_Mode = ADDON_CFLASH_MODE_Path; CFlash_Path = cflash_path; is_cflash_configured = true; } if(slot1_fat_dir != "") slot1_SetFatDir(slot1_fat_dir); if(slot1 == "RETAIL") slot1_Change(NDS_SLOT1_RETAIL_AUTO); else if(slot1 == "RETAILAUTO") slot1_Change(NDS_SLOT1_RETAIL_AUTO); else if(slot1 == "R4") slot1_Change(NDS_SLOT1_R4); else if(slot1 == "RETAILNAND") slot1_Change(NDS_SLOT1_RETAIL_NAND); else if(slot1 == "RETAILMCROM") slot1_Change(NDS_SLOT1_RETAIL_MCROM); else if(slot1 == "RETAILDEBUG") slot1_Change(NDS_SLOT1_RETAIL_DEBUG); } desmume-0.9.11/src/encrypt.cpp0000755000000000000000000000774212467662066014752 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "encrypt.h" #include "armcpu.h" #include "MMU.h" #include "registers.h" //TODO - a lot of redundant code (maybe?) with utils/decrypt.cpp //we should try unifying all that. //TODO - endian unsafeness in here... dont like the way these take u32. maybe it makes sense and the user is genuinely supposed to present data in units of u32 //================================================================================== KEY1 #define DWNUM(i) ((i) >> 2) void _KEY1::init(u32 idcode, u8 level, u8 modulo) { memcpy(keyBuf, keyBufPtr, 0x1048); keyCode[0] = idcode; keyCode[1] = idcode >> 1; keyCode[2] = idcode << 1; if (level >= 1) // first apply (always) applyKeycode(modulo); if (level >= 2) // second apply (optional) applyKeycode(modulo); keyCode[1] <<= 1; keyCode[2] >>= 1; if (level >= 3) // third apply (optional) applyKeycode(modulo); } void _KEY1::applyKeycode(u8 modulo) { encrypt(&keyCode[1]); encrypt(&keyCode[0]); u32 scratch[2] = {0}; for (u32 i = 0; i <= 0x44; i += 4) // xor with reversed byte-order (bswap) keyBuf[DWNUM(i)] ^= bswap32(keyCode[DWNUM(i % modulo)]); for (u32 i = 0; i <= 0x1040; i += 8) { encrypt(scratch); // encrypt S (64bit) by keybuf keyBuf[DWNUM(i)] = scratch[1]; // write S to keybuf (first upper 32bit) keyBuf[DWNUM(i+4)] = scratch[0]; // write S to keybuf (then lower 32bit) } } void _KEY1::decrypt(u32 *ptr) { u32 y = ptr[0]; u32 x = ptr[1]; for (u32 i = 0x11; i >= 0x02; i--) { u32 z = keyBuf[i] ^ x; x = keyBuf[DWNUM(0x048 + (((z >> 24) & 0xFF) << 2))]; x = keyBuf[DWNUM(0x448 + (((z >> 16) & 0xFF) << 2))] + x; x = keyBuf[DWNUM(0x848 + (((z >> 8) & 0xFF) << 2))] ^ x; x = keyBuf[DWNUM(0xC48 + (((z >> 0) & 0xFF) << 2))] + x; x = y ^ x; y = z; } ptr[0] = x ^ keyBuf[DWNUM(0x04)]; ptr[1] = y ^ keyBuf[DWNUM(0x00)]; } void _KEY1::encrypt(u32 *ptr) { u32 y = ptr[0]; u32 x = ptr[1]; for (u32 i = 0x00; i <= 0x0F; i++) { u32 z = keyBuf[i] ^ x; x = keyBuf[DWNUM(0x048 + (((z >> 24) & 0xFF) << 2))]; x = keyBuf[DWNUM(0x448 + (((z >> 16) & 0xFF) << 2))] + x; x = keyBuf[DWNUM(0x848 + (((z >> 8) & 0xFF) << 2))] ^ x; x = keyBuf[DWNUM(0xC48 + (((z >> 0) & 0xFF) << 2))] + x; x = y ^ x; y = z; } ptr[0] = x ^ keyBuf[DWNUM(0x40)]; ptr[1] = y ^ keyBuf[DWNUM(0x44)]; } #undef DWNUM //================================================================================== KEY2 u64 _KEY2::bitsReverse39(u64 key) { u64 tmp = 0; for (u32 i = 0; i < 39; i++) tmp |= ((key >> i) & 1) << (38 - i); return tmp; } void _KEY2::applySeed(u8 PROCNUM) { u64 tmp = (MMU_read8(PROCNUM, REG_ENCSEED0H) & 0xFF); seed0 = MMU_read32(PROCNUM, REG_ENCSEED0L) | (tmp << 32); tmp = (MMU_read8(PROCNUM, REG_ENCSEED1H) & 0xFF); seed1 = MMU_read32(PROCNUM, REG_ENCSEED1L) | (tmp << 32); x = bitsReverse39(seed0); y = bitsReverse39(seed1); //printf("ARM%c: set KEY2 seed0 to %010llX (reverse %010llX)\n", PROCNUM?'7':'9', seed0, x); //printf("ARM%c: set KEY2 seed1 to %010llX (reverse %010llX)\n", PROCNUM?'7':'9', seed1, y); } u8 _KEY2::apply(u8 data) { x = (((x >> 5) ^ (x >> 17) ^ (x >> 18) ^ (x >> 31)) & 0xFF) + (x << 8); y = (((y >> 5) ^ (y >> 23) ^ (y >> 18) ^ (y >> 31)) & 0xFF) + (y << 8); return ((data ^ x ^ y) & 0xFF); } desmume-0.9.11/src/movie.h0000755000000000000000000001266512467662066014052 0ustar rootroot/* Copyright 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef __MOVIE_H_ #define __MOVIE_H_ #include #include #include #include #include #include "utils/datetime.h" #include "utils/guid.h" #include "utils/md5.h" struct UserInput; class EMUFILE; typedef struct { int movie_version; // version of the movie format in the file u32 num_frames; u32 rerecord_count; bool poweron; u32 emu_version_used; MD5DATA md5_of_rom_used; std::string name_of_rom_used; std::vector comments; std::vector subtitles; } MOVIE_INFO; enum EMOVIEMODE { MOVIEMODE_INACTIVE = 0, MOVIEMODE_RECORD = 1, MOVIEMODE_PLAY = 2, MOVIEMODE_FINISHED = 3, }; enum EMOVIECMD { MOVIECMD_MIC = 1, MOVIECMD_RESET = 2, MOVIECMD_LID = 4, }; //RLDUTSBAYXWEG class MovieData; class MovieRecord { public: u16 pad; union { struct { u8 x, y; u8 touch; }; u32 padding; } touch; //misc commands like reset, etc. //small now to save space; we might need to support more commands later. //the disk format will support up to 64bit if necessary u8 commands; bool command_reset() const { return (commands&MOVIECMD_RESET)!=0; } bool command_microphone() const { return (commands&MOVIECMD_MIC)!=0; } bool command_lid() const { return (commands&MOVIECMD_LID)!=0; } void toggleBit(int bit) { pad ^= mask(bit); } void setBit(int bit) { pad |= mask(bit); } void clearBit(int bit) { pad &= ~mask(bit); } void setBitValue(int bit, bool val) { if(val) setBit(bit); else clearBit(bit); } bool checkBit(int bit) { return (pad & mask(bit))!=0; } bool Compare(MovieRecord& compareRec); void clear(); void parse(EMUFILE* fp); bool parseBinary(EMUFILE* fp); void dump(EMUFILE* fp); void dumpBinary(EMUFILE* fp); void parsePad(EMUFILE* fp, u16& pad); void dumpPad(EMUFILE* fp, u16 pad); static const char mnemonics[13]; private: int mask(int bit) { return 1< savestate; std::vector sram; std::vector records; std::vector comments; int rerecordCount; Desmume_Guid guid; DateTime rtcStart; //was the frame data stored in binary? bool binaryFlag; int getNumRecords() { return records.size(); } class TDictionary : public std::map { public: bool containsKey(std::string key) { return find(key) != end(); } void tryInstallBool(std::string key, bool& val) { if(containsKey(key)) val = atoi(operator [](key).c_str())!=0; } void tryInstallString(std::string key, std::string& val) { if(containsKey(key)) val = operator [](key); } void tryInstallInt(std::string key, int& val) { if(containsKey(key)) val = atoi(operator [](key).c_str()); } }; void truncateAt(int frame); void installValue(std::string& key, std::string& val); int dump(EMUFILE* fp, bool binary); void clearRecordRange(int start, int len); void insertEmpty(int at, int frames); static bool loadSavestateFrom(std::vector* buf); static void dumpSavestateTo(std::vector* buf, int compressionLevel); static bool loadSramFrom(std::vector* buf); //void TryDumpIncremental(); private: void installInt(std::string& val, int& var) { var = atoi(val.c_str()); } void installBool(std::string& val, bool& var) { var = atoi(val.c_str())!=0; } }; extern int currFrameCounter; extern EMOVIEMODE movieMode; //adelikat: main needs this for frame counter display extern MovieData currMovieData; //adelikat: main needs this for frame counter display extern bool movie_reset_command; bool FCEUI_MovieGetInfo(EMUFILE* fp, MOVIE_INFO& info, bool skipFrameCount); void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart); const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe); // returns NULL on success, errmsg on failure void FCEUI_StopMovie(); void FCEUMOV_AddInputState(); void FCEUMOV_HandlePlayback(); void FCEUMOV_HandleRecording(); void mov_savestate(EMUFILE* fp); bool mov_loadstate(EMUFILE* fp, int size); void LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size); bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader); extern bool movie_readonly; extern bool ShowInputDisplay; void FCEUI_MakeBackupMovie(bool dispMessage); DateTime FCEUI_MovieGetRTCDefault(); void BinaryDataFromString(std::string &inStringData, std::vector *outBinaryData); void ReplayRecToDesmumeInput(const MovieRecord &theRecord, UserInput *theInput); void DesmumeInputToReplayRec(const UserInput &theInput, MovieRecord *theRecord); #endif desmume-0.9.11/src/common.cpp0000755000000000000000000004103012467662066014542 0ustar rootroot/* Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //TODO - move this into ndssystem where it belongs probably #include "common.h" #include #include #include #include #include char *trim(char *s, int len) { char *ptr = NULL; if (!s) return NULL; if (!*s) return s; if(len==-1) ptr = s + strlen(s) - 1; else ptr = s+len - 1; for (; (ptr >= s) && (!*ptr || isspace((u8)*ptr)) ; ptr--); ptr[1] = '\0'; return s; } char *removeSpecialChars(char *s) { char *buf = s; if (!s) return NULL; if (!*s) return s; for (u32 i = 0; i < strlen(s); i++) { if (isspace((u8)s[i]) && (s[i] != 0x20)) *buf = 0x20; else *buf = s[i]; buf++; } *buf = 0; return s; } static MAKER makerCodes[] = { { 0x3130, "Nintendo" }, { 0x3230, "Rocket Games, Ajinomoto" }, { 0x3330, "Imagineer-Zoom" }, { 0x3430, "Gray Matter?" }, { 0x3530, "Zamuse" }, { 0x3630, "Falcom" }, { 0x3730, "Enix?" }, { 0x3830, "Capcom" }, { 0x3930, "Hot B Co." }, { 0x4130, "Jaleco" }, { 0x4230, "Coconuts Japan" }, { 0x4330, "Coconuts Japan/G.X.Media" }, { 0x4430, "Micronet?" }, { 0x4530, "Technos" }, { 0x4630, "Mebio Software" }, { 0x4730, "Shouei System" }, { 0x4830, "Starfish" }, { 0x4A30, "Mitsui Fudosan/Dentsu" }, { 0x4C30, "Warashi Inc." }, { 0x4E30, "Nowpro" }, { 0x5030, "Game Village" }, { 0x3031, "?????????????" }, { 0x3231, "Infocom" }, { 0x3331, "Electronic Arts Japan" }, { 0x3531, "Cobra Team" }, { 0x3631, "Human/Field" }, { 0x3731, "KOEI" }, { 0x3831, "Hudson Soft" }, { 0x3931, "S.C.P." }, { 0x4131, "Yanoman" }, { 0x4331, "Tecmo Products" }, { 0x4431, "Japan Glary Business" }, { 0x4531, "Forum/OpenSystem" }, { 0x4631, "Virgin Games" }, { 0x4731, "SMDE" }, { 0x4A31, "Daikokudenki" }, { 0x5031, "Creatures Inc." }, { 0x5131, "TDK Deep Impresion" }, { 0x3032, "Destination Software, KSS" }, { 0x3132, "Sunsoft/Tokai Engineering??" }, { 0x3232, "POW, VR 1 Japan??" }, { 0x3332, "Micro World" }, { 0x3532, "San-X" }, { 0x3632, "Enix" }, { 0x3732, "Loriciel/Electro Brain" }, { 0x3832, "Kemco Japan" }, { 0x3932, "Seta" }, { 0x4132, "Culture Brain" }, { 0x4332, "Palsoft" }, { 0x4432, "Visit Co.,Ltd." }, { 0x4532, "Intec" }, { 0x4632, "System Sacom" }, { 0x4732, "Poppo" }, { 0x4832, "Ubisoft Japan" }, { 0x4A32, "Media Works" }, { 0x4B32, "NEC InterChannel" }, { 0x4C32, "Tam" }, { 0x4D32, "Jordan" }, { 0x4E32, "Smilesoft ???, Rocket ???" }, { 0x5132, "Mediakite" }, { 0x3033, "Viacom" }, { 0x3133, "Carrozzeria" }, { 0x3233, "Dynamic" }, { 0x3433, "Magifact" }, { 0x3533, "Hect" }, { 0x3633, "Codemasters" }, { 0x3733, "Taito/GAGA Communications" }, { 0x3833, "Laguna" }, { 0x3933, "Telstar Fun & Games, Event/Taito" }, { 0x4233, "Arcade Zone Ltd" }, { 0x4333, "Entertainment International/Empire Software?" }, { 0x4433, "Loriciel" }, { 0x4533, "Gremlin Graphics" }, { 0x4633, "K.Amusement Leasing Co." }, { 0x3034, "Seika Corp." }, { 0x3134, "Ubi Soft Entertainment" }, { 0x3234, "Sunsoft US?" }, { 0x3434, "Life Fitness" }, { 0x3634, "System 3" }, { 0x3734, "Spectrum Holobyte" }, { 0x3934, "IREM" }, { 0x4234, "Raya Systems" }, { 0x4334, "Renovation Products" }, { 0x4434, "Malibu Games" }, { 0x4634, "Eidos (was U.S. Gold <=1995)" }, { 0x4734, "Playmates Interactive?" }, { 0x4A34, "Fox Interactive" }, { 0x4B34, "Time Warner Interactive" }, { 0x5134, "Disney Interactive" }, { 0x5334, "Black Pearl" }, { 0x5534, "Advanced Productions" }, { 0x5834, "GT Interactive" }, { 0x5934, "RARE?" }, { 0x5A34, "Crave Entertainment" }, { 0x3035, "Absolute Entertainment" }, { 0x3135, "Acclaim" }, { 0x3235, "Activision" }, { 0x3335, "American Sammy" }, { 0x3435, "Take 2 Interactive (before it was GameTek)" }, { 0x3535, "Hi Tech" }, { 0x3635, "LJN LTD." }, { 0x3835, "Mattel" }, { 0x4135, "Mindscape, Red Orb Entertainment?" }, { 0x4235, "Romstar" }, { 0x4335, "Taxan" }, { 0x4435, "Midway (before it was Tradewest)" }, { 0x4635, "American Softworks" }, { 0x4735, "Majesco Sales Inc" }, { 0x4835, "3DO" }, { 0x4B35, "Hasbro" }, { 0x4C35, "NewKidCo" }, { 0x4D35, "Telegames" }, { 0x4E35, "Metro3D" }, { 0x5035, "Vatical Entertainment" }, { 0x5135, "LEGO Media" }, { 0x5335, "Xicat Interactive" }, { 0x5435, "Cryo Interactive" }, { 0x5735, "Red Storm Entertainment" }, { 0x5835, "Microids" }, { 0x5A35, "Conspiracy/Swing" }, { 0x3036, "Titus" }, { 0x3136, "Virgin Interactive" }, { 0x3236, "Maxis" }, { 0x3436, "LucasArts Entertainment" }, { 0x3736, "Ocean" }, { 0x3936, "Electronic Arts" }, { 0x4236, "Laser Beam" }, { 0x4536, "Elite Systems" }, { 0x4636, "Electro Brain" }, { 0x4736, "The Learning Company" }, { 0x4836, "BBC" }, { 0x4A36, "Software 2000" }, { 0x4C36, "BAM! Entertainment" }, { 0x4D36, "Studio 3" }, { 0x5136, "Classified Games" }, { 0x5336, "TDK Mediactive" }, { 0x5536, "DreamCatcher" }, { 0x5636, "JoWood Produtions" }, { 0x5736, "SEGA" }, { 0x5836, "Wannado Edition" }, { 0x5936, "LSP" }, { 0x5A36, "ITE Media" }, { 0x3037, "Infogrames" }, { 0x3137, "Interplay" }, { 0x3237, "JVC" }, { 0x3337, "Parker Brothers" }, { 0x3537, "Sales Curve" }, { 0x3837, "THQ" }, { 0x3937, "Accolade" }, { 0x4137, "Triffix Entertainment" }, { 0x4337, "Microprose Software" }, { 0x4437, "Universal Interactive, Sierra, Simon & Schuster?" }, { 0x4637, "Kemco" }, { 0x4737, "Rage Software" }, { 0x4837, "Encore" }, { 0x4A37, "Zoo" }, { 0x4B37, "BVM" }, { 0x4C37, "Simon & Schuster Interactive" }, { 0x4D37, "Asmik Ace Entertainment Inc./AIA" }, { 0x4E37, "Empire Interactive?" }, { 0x5137, "Jester Interactive" }, { 0x5437, "Scholastic" }, { 0x5537, "Ignition Entertainment" }, { 0x5737, "Stadlbauer" }, { 0x3038, "Misawa" }, { 0x3138, "Teichiku" }, { 0x3238, "Namco Ltd." }, { 0x3338, "LOZC" }, { 0x3438, "KOEI" }, { 0x3638, "Tokuma Shoten Intermedia" }, { 0x3738, "Tsukuda Original" }, { 0x3838, "DATAM-Polystar" }, { 0x4238, "Bulletproof Software" }, { 0x4338, "Vic Tokai Inc." }, { 0x4538, "Character Soft" }, { 0x4638, "I'Max" }, { 0x4738, "Saurus" }, { 0x4A38, "General Entertainment" }, { 0x4E38, "Success" }, { 0x5038, "SEGA Japan" }, { 0x3039, "Takara Amusement" }, { 0x3139, "Chun Soft" }, { 0x3239, "Video System, McO'River???" }, { 0x3339, "BEC" }, { 0x3539, "Varie" }, { 0x3639, "Yonezawa/S'pal" }, { 0x3739, "Kaneko" }, { 0x3939, "Victor Interactive Software, Pack in Video" }, { 0x4139, "Nichibutsu/Nihon Bussan" }, { 0x4239, "Tecmo" }, { 0x4339, "Imagineer" }, { 0x4639, "Nova" }, { 0x4739, "Den'Z" }, { 0x4839, "Bottom Up" }, { 0x4A39, "TGL" }, { 0x4C39, "Hasbro Japan?" }, { 0x4E39, "Marvelous Entertainment" }, { 0x5039, "Keynet Inc." }, { 0x5139, "Hands-On Entertainment" }, { 0x3041, "Telenet" }, { 0x3141, "Hori" }, { 0x3441, "Konami" }, { 0x3541, "K.Amusement Leasing Co." }, { 0x3641, "Kawada" }, { 0x3741, "Takara" }, { 0x3941, "Technos Japan Corp." }, { 0x4141, "JVC, Victor Musical Indutries" }, { 0x4341, "Toei Animation" }, { 0x4441, "Toho" }, { 0x4641, "Namco" }, { 0x4741, "Media Rings Corporation" }, { 0x4841, "J-Wing" }, { 0x4A41, "Pioneer LDC" }, { 0x4B41, "KID" }, { 0x4C41, "Mediafactory" }, { 0x5041, "Infogrames Hudson" }, { 0x5141, "Kiratto. Ludic Inc" }, { 0x3042, "Acclaim Japan" }, { 0x3142, "ASCII (was Nexoft?)" }, { 0x3242, "Bandai" }, { 0x3442, "Enix" }, { 0x3642, "HAL Laboratory" }, { 0x3742, "SNK" }, { 0x3942, "Pony Canyon" }, { 0x4142, "Culture Brain" }, { 0x4242, "Sunsoft" }, { 0x4342, "Toshiba EMI" }, { 0x4442, "Sony Imagesoft" }, { 0x4642, "Sammy" }, { 0x4742, "Magical" }, { 0x4842, "Visco" }, { 0x4A42, "Compile " }, { 0x4C42, "MTO Inc." }, { 0x4E42, "Sunrise Interactive" }, { 0x5042, "Global A Entertainment" }, { 0x5142, "Fuuki" }, { 0x3043, "Taito" }, { 0x3243, "Kemco" }, { 0x3343, "Square" }, { 0x3443, "Tokuma Shoten" }, { 0x3543, "Data East" }, { 0x3643, "Tonkin House (was Tokyo Shoseki)" }, { 0x3843, "Koei" }, { 0x4143, "Konami/Ultra/Palcom" }, { 0x4243, "NTVIC/VAP" }, { 0x4343, "Use Co.,Ltd." }, { 0x4443, "Meldac" }, { 0x4543, "Pony Canyon" }, { 0x4643, "Angel, Sotsu Agency/Sunrise" }, { 0x4A43, "Boss" }, { 0x4743, "Yumedia/Aroma Co., Ltd" }, { 0x4B43, "Axela/Crea-Tech?" }, { 0x4C43, "Sekaibunka-Sha, Sumire kobo?, Marigul Management Inc.?" }, { 0x4D43, "Konami Computer Entertainment Osaka" }, { 0x5043, "Enterbrain" }, { 0x3044, "Taito/Disco" }, { 0x3144, "Sofel" }, { 0x3244, "Quest, Bothtec" }, { 0x3344, "Sigma, ?????" }, { 0x3444, "Ask Kodansha" }, { 0x3644, "Naxat" }, { 0x3744, "Copya System" }, { 0x3844, "Capcom Co., Ltd." }, { 0x3944, "Banpresto" }, { 0x4144, "TOMY" }, { 0x4244, "LJN Japan" }, { 0x4444, "NCS" }, { 0x4544, "Human Entertainment" }, { 0x4644, "Altron" }, { 0x4744, "Jaleco???" }, { 0x4844, "Gaps Inc." }, { 0x4C44, "????" }, { 0x4E44, "Elf" }, { 0x3045, "Jaleco" }, { 0x3145, "????" }, { 0x3245, "Yutaka" }, { 0x3345, "Varie" }, { 0x3445, "T&ESoft" }, { 0x3545, "Epoch" }, { 0x3745, "Athena" }, { 0x3845, "Asmik" }, { 0x3945, "Natsume" }, { 0x4145, "King Records" }, { 0x4245, "Atlus" }, { 0x4345, "Epic/Sony Records" }, { 0x4545, "IGS" }, { 0x4745, "Chatnoir" }, { 0x4845, "Right Stuff" }, { 0x4C45, "Spike" }, { 0x4D45, "Konami Computer Entertainment Tokyo" }, { 0x4E45, "Alphadream Corporation" }, { 0x3046, "A Wave" }, { 0x3146, "Motown Software" }, { 0x3246, "Left Field Entertainment" }, { 0x3346, "Extreme Ent. Grp." }, { 0x3446, "TecMagik" }, { 0x3946, "Cybersoft" }, { 0x4246, "Psygnosis" }, { 0x4546, "Davidson/Western Tech." }, { 0x3147, "PCCW Japan" }, { 0x3447, "KiKi Co Ltd" }, { 0x3547, "Open Sesame Inc???" }, { 0x3647, "Sims" }, { 0x3747, "Broccoli" }, { 0x3847, "Avex" }, { 0x3947, "D3 Publisher" }, { 0x4247, "Konami Computer Entertainment Japan" }, { 0x4447, "Square-Enix" }, { 0x4849, "Yojigen" }, }; #define makerNum sizeof(makerCodes) / sizeof(makerCodes[0]) std::string getDeveloperNameByID(u16 id) { for (u32 i = 0; i < makerNum; i++) { if (makerCodes[i].code == id) { return makerCodes[i].name; } } return "Unknown"; } // =============================================================================== // PNG/BMP // =============================================================================== static int WritePNGChunk(FILE *fp, uint32 size, const char *type, const uint8 *data) { uint32 crc; uint8 tempo[4]; tempo[0]=size>>24; tempo[1]=size>>16; tempo[2]=size>>8; tempo[3]=size; if(fwrite(tempo,4,1,fp)!=1) return 0; if(fwrite(type,4,1,fp)!=1) return 0; if(size) if(fwrite(data,1,size,fp)!=size) return 0; crc = crc32(0,(uint8 *)type,4); if(size) crc = crc32(crc,data,size); tempo[0]=crc>>24; tempo[1]=crc>>16; tempo[2]=crc>>8; tempo[3]=crc; if(fwrite(tempo,4,1,fp)!=1) return 0; return 1; } int NDS_WritePNG(const char *fname, u8 *data) { int x, y; int width=256; int height=192*2; u16 * bmp = (u16 *)data; FILE *pp=NULL; uint8 *compmem = NULL; uLongf compmemsize = (uLongf)( (height * (width + 1) * 3 * 1.001 + 1) + 12 ); if(!(compmem=(uint8 *)malloc(compmemsize))) return 0; if(!(pp=fopen(fname, "wb"))) { goto PNGerr; } { const uint8 header[8]={137,80,78,71,13,10,26,10}; if(fwrite(header,8,1,pp)!=1) goto PNGerr; } { uint8 chunko[13]; chunko[0] = width >> 24; // Width chunko[1] = width >> 16; chunko[2] = width >> 8; chunko[3] = width; chunko[4] = height >> 24; // Height chunko[5] = height >> 16; chunko[6] = height >> 8; chunko[7] = height; chunko[8]=8; // 8 bits per sample(24 bits per pixel) chunko[9]=2; // Color type; RGB triplet chunko[10]=0; // compression: deflate chunko[11]=0; // Basic adapative filter set(though none are used). chunko[12]=0; // No interlace. if(!WritePNGChunk(pp,13,"IHDR",chunko)) goto PNGerr; } { uint8 *tmp_buffer; uint8 *tmp_inc; tmp_inc = tmp_buffer = (uint8 *)malloc((width * 3 + 1) * height); for(y=0;y>10; pixel-=r<<10; g = pixel>>5; pixel-=g<<5; b = pixel; r*=255/31; g*=255/31; b*=255/31; tmp_inc[0] = b; tmp_inc[1] = g; tmp_inc[2] = r; tmp_inc += 3; } } if(compress(compmem, &compmemsize, tmp_buffer, height * (width * 3 + 1))!=Z_OK) { if(tmp_buffer) free(tmp_buffer); goto PNGerr; } if(tmp_buffer) free(tmp_buffer); if(!WritePNGChunk(pp,compmemsize,"IDAT",compmem)) goto PNGerr; } if(!WritePNGChunk(pp,0,"IEND",0)) goto PNGerr; free(compmem); fclose(pp); return 1; PNGerr: if(compmem) free(compmem); if(pp) fclose(pp); return(0); } typedef struct { u32 size; s32 width; s32 height; u16 planes; u16 bpp; u32 cmptype; u32 imgsize; s32 hppm; s32 vppm; u32 numcol; u32 numimpcol; } bmpimgheader_struct; #include "PACKED.h" typedef struct { u16 id __PACKED; u32 size __PACKED; u16 reserved1 __PACKED; u16 reserved2 __PACKED; u32 imgoffset __PACKED; } bmpfileheader_struct; #include "PACKED_END.h" int NDS_WriteBMP(const char *filename, u8 *data) { bmpfileheader_struct fileheader; bmpimgheader_struct imageheader; FILE *file; int i,j; u16 * bmp = (u16 *)data; size_t elems_written = 0; memset(&fileheader, 0, sizeof(fileheader)); fileheader.size = sizeof(fileheader); fileheader.id = 'B' | ('M' << 8); fileheader.imgoffset = sizeof(fileheader)+sizeof(imageheader); memset(&imageheader, 0, sizeof(imageheader)); imageheader.size = sizeof(imageheader); imageheader.width = 256; imageheader.height = 192*2; imageheader.planes = 1; imageheader.bpp = 24; imageheader.cmptype = 0; // None imageheader.imgsize = imageheader.width * imageheader.height * 3; if ((file = fopen(filename,"wb")) == NULL) return 0; elems_written += fwrite(&fileheader, 1, sizeof(fileheader), file); elems_written += fwrite(&imageheader, 1, sizeof(imageheader), file); for(j=0;j<192*2;j++) { for(i=0;i<256;i++) { u8 r,g,b; u16 pixel = bmp[(192*2-j-1)*256+i]; r = pixel>>10; pixel-=r<<10; g = pixel>>5; pixel-=g<<5; b = (u8)pixel; r*=255/31; g*=255/31; b*=255/31; elems_written += fwrite(&r, 1, sizeof(u8), file); elems_written += fwrite(&g, 1, sizeof(u8), file); elems_written += fwrite(&b, 1, sizeof(u8), file); } } fclose(file); return 1; } int NDS_WriteBMP_32bppBuffer(int width, int height, const void* buf, const char *filename) { bmpfileheader_struct fileheader; bmpimgheader_struct imageheader; FILE *file; size_t elems_written = 0; memset(&fileheader, 0, sizeof(fileheader)); fileheader.size = sizeof(fileheader); fileheader.id = 'B' | ('M' << 8); fileheader.imgoffset = sizeof(fileheader)+sizeof(imageheader); memset(&imageheader, 0, sizeof(imageheader)); imageheader.size = sizeof(imageheader); imageheader.width = width; imageheader.height = height; imageheader.planes = 1; imageheader.bpp = 32; imageheader.cmptype = 0; // None imageheader.imgsize = imageheader.width * imageheader.height * 4; if ((file = fopen(filename,"wb")) == NULL) return 0; elems_written += fwrite(&fileheader, 1, sizeof(fileheader), file); elems_written += fwrite(&imageheader, 1, sizeof(imageheader), file); for(int i=0;i #include #include "../GPU.h" #define _DUP8(a) a,a,a,a, a,a,a,a #define _DUP4(a) a,a,a,a #define _DUP2(a) a,a GLuint Textures[2]; // free number we can use in tools 0-1 reserved for screens static int free_gl_drawable=2; GdkGLConfig *my_glConfig=NULL; GdkGLContext *my_glContext[8]={_DUP8(NULL)}; GdkGLDrawable *my_glDrawable[8]={_DUP8(NULL)}; GtkWidget *pDrawingTexArea; GLuint screen_texture[1]; /* enable software colour format conversion */ static int gtk_glade_use_software_colour_convert; #undef _DUP8 #undef _DUP4 #undef _DUP2 /* FIXME: Purpose of this code? */ /*static BOOL _fun_gl_Begin (int screen) { return FALSE; } static void _fun_gl_End (int screen) { } fun_gl_Begin Open_GL_beg = _fun_gl_Begin; fun_gl_End Open_GL_end = _fun_gl_End; void register_gl_fun(fun_gl_Begin beg,fun_gl_End end) { Open_GL_beg = beg; Open_GL_end = end; }*/ /************************************************/ /* BEGIN & END */ /************************************************/ BOOL my_gl_Begin (int screen) { return gdk_gl_drawable_gl_begin(my_glDrawable[screen], my_glContext[screen]); } void my_gl_End (int screen) { if (gdk_gl_drawable_is_double_buffered (my_glDrawable[screen])) gdk_gl_drawable_swap_buffers (my_glDrawable[screen]); else glFlush(); gdk_gl_drawable_gl_end(my_glDrawable[screen]); } /************************************************/ /* OTHER GL COMMANDS */ /************************************************/ void my_gl_Identity() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void my_gl_DrawBeautifulQuad( void) { // beautiful quad glBegin(GL_QUADS); glColor3ub(255,0,0); glVertex2d(-0.75,-0.75); glColor3ub(128,255,0); glVertex2d(-0.75, 0.75); glColor3ub(0,255,128); glVertex2d( 0.75, 0.75); glColor3ub(0,0,255); glVertex2d( 0.75,-0.75); glEnd(); glColor3ub(255,255,255); } #if 0 /* not used */ static void my_gl_DrawLogo() { } #endif void my_gl_Clear(int screen) { if (!my_gl_Begin(screen)) return; /* Set the background black */ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearDepth(1.0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); my_gl_DrawBeautifulQuad(); my_gl_End(screen); } /************************************************/ /* INITIALIZATION */ /************************************************/ void init_GL(GtkWidget * widget, int screen, int share_num) { // for (n=gtk_events_pending(); n>0; n--) // gtk_main_iteration(); // init GL capability my_glContext[screen]=NULL; my_glDrawable[screen]=NULL; if (!gtk_widget_set_gl_capability( widget, my_glConfig, my_glContext[share_num], //NULL, TRUE, GDK_GL_RGBA_TYPE)) { printf ("gtk_widget_set_gl_capability\n"); exit(1); } // realize so that we get a GdkWindow gtk_widget_realize(widget); // make sure we realize gdk_flush(); my_glDrawable[screen] = gtk_widget_get_gl_drawable(widget); if (screen == share_num) { my_glContext[screen] = gtk_widget_get_gl_context(widget); } else { my_glContext[screen] = my_glContext[share_num]; return; } reshape(widget, screen); } int init_GL_free_s(GtkWidget * widget, int share_num) { int r = free_gl_drawable; my_glContext[r]=NULL; my_glDrawable[r]=NULL; init_GL(widget, r, share_num); free_gl_drawable++; return r; } int init_GL_free(GtkWidget * widget) { int r = free_gl_drawable; my_glContext[r]=NULL; my_glDrawable[r]=NULL; init_GL(widget, r, r); free_gl_drawable++; return r; } void init_GL_capabilities( int use_software_convert) { uint16_t blank_texture[256 * 512]; my_glConfig = gdk_gl_config_new_by_mode ( (GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE) ); gtk_glade_use_software_colour_convert = use_software_convert; // initialize 1st drawing area init_GL(pDrawingArea,0,0); my_gl_Clear(0); if (!my_gl_Begin(0)) return; // generate ONE texture (display) glEnable(GL_TEXTURE_2D); glGenTextures(2, Textures); /* Generate The Texture */ glBindTexture( GL_TEXTURE_2D, Textures[0]); memset(blank_texture, 0x001f, sizeof(blank_texture)); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 256, 512, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, blank_texture); my_gl_End(0); // initialize 2nd drawing area (sharing context) init_GL(pDrawingArea2,1,0); my_gl_Clear(1); } /************************************************/ /* RESHAPE */ /************************************************/ void reshape (GtkWidget * widget, int screen) { if (my_glDrawable[screen] == NULL || !my_gl_Begin(screen)) return; glViewport (0, 0, widget->allocation.width, widget->allocation.height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); my_gl_End(screen); } /************************************************/ /* TEXTURING */ /************************************************/ static void my_gl_Texture2D() { glBindTexture(GL_TEXTURE_2D, Textures[0]); #define MyFILTER GL_LINEAR //#define MyFILTER GL_NEAREST glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MyFILTER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MyFILTER); #undef MyFILTER } static void my_gl_ScreenTex( int software_convert) { if ( software_convert) { u8 converted[256 * 384 * 3]; int i; for ( i = 0; i < (256 * 384); i++) { converted[(i * 3) + 0] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 0) & 0x1f) << 3; converted[(i * 3) + 1] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 5) & 0x1f) << 3; converted[(i * 3) + 2] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 10) & 0x1f) << 3; } glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGB, GL_UNSIGNED_BYTE, converted); } else { glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, &GPU_screen); } } static void my_gl_ScreenTexApply(int screen) { float off = (screen)?0.375:0; glBegin(GL_QUADS); // texcoords 0.375 means 192, 1 means 256 glTexCoord2f(0.0, off+0.000); glVertex2d(-1.0, 1.0); glTexCoord2f(1.0, off+0.000); glVertex2d( 1.0, 1.0); glTexCoord2f(1.0, off+0.375); glVertex2d( 1.0,-1.0); glTexCoord2f(0.0, off+0.375); glVertex2d(-1.0,-1.0); glEnd(); } /************************************************/ /* RENDERING */ /************************************************/ gboolean screen (GtkWidget * widget, int viewportscreen) { int screen; GPU * gpu; float bright_color = 0.0f; // blend with black float bright_alpha = 0.0f; // don't blend // we take care to draw the right thing the right place // we need to rearrange widgets not to use this trick screen = (ScreenInvert)?1-viewportscreen:viewportscreen; // screen = viewportscreen; if (!my_gl_Begin(viewportscreen)) return TRUE; glLoadIdentity(); // clear screen glClearColor(0.0f,0.0f,0.0f,0.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable(GL_TEXTURE_2D); if (desmume_running()) { // master bright gpu = ((screen)?SubScreen:MainScreen).gpu; switch (gpu->MasterBrightMode) { case 1: // Bright up : blend with white bright_color = 1.0f; // no break; case 2: // Bright down : blend with black bright_alpha = 1.0f; // blending max bright_alpha = gpu->MasterBrightFactor / 16.0; break; // Disabled 0, Reserved 3 default: break; } // rotate glRotatef(ScreenRotate, 0.0, 0.0, 1.0); // create the texture for both display my_gl_Texture2D(); if (viewportscreen==0) { my_gl_ScreenTex( gtk_glade_use_software_colour_convert); } } else { // pause // fake master bright up 50% bright_color = 0.0f; bright_alpha = 0.5f; } // make sure current color is ok glColor4ub(255,255,255,255); // apply part of the texture my_gl_ScreenTexApply(screen); glDisable(GL_TEXTURE_2D); // master bright (bis) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(bright_color,bright_color,bright_color,bright_alpha); glBegin(GL_QUADS); glVertex2d(-1.0, 1.0); glVertex2d( 1.0, 1.0); glVertex2d( 1.0,-1.0); glVertex2d(-1.0,-1.0); glEnd(); glDisable(GL_BLEND); my_gl_End(viewportscreen); return TRUE; } #endif /* if GTKGLEXT_AVAILABLE */ desmume-0.9.11/src/gtk-glade/callbacks_IO.h0000755000000000000000000000470712467662066017076 0ustar rootroot/* callbacks_IO.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "globals.h" #include "gdk_gl.h" extern "C" { /* INPUT BUTTONS / KEYBOARD */ G_MODULE_EXPORT gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); /* OUTPUT SCREENS */ G_MODULE_EXPORT gboolean on_wDrawScreen_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); /* INPUT STYLUS / MOUSE */ G_MODULE_EXPORT gboolean on_wDrawScreen_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_scroll_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); /* KEYBOARD CONFIG / KEY DEFINITION */ G_MODULE_EXPORT gboolean on_wKeyDlg_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); G_MODULE_EXPORT void on_wKeybConfDlg_response (GtkDialog *dialog, gint arg1, gpointer user_data); G_MODULE_EXPORT void on_button_kb_key_clicked (GtkButton *button, gpointer user_data); /* Joystick configuration / Key definition */ G_MODULE_EXPORT void on_button_joy_key_clicked (GtkButton *button, gpointer user_data); } desmume-0.9.11/src/gtk-glade/globals.h0000755000000000000000000000574612467662066016217 0ustar rootroot/* globals.h - this file is part of DeSmuME * * Copyright (C) 2007-2015 DeSmuME Team * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GLOBALS_H__ #define __GLOBALS_H__ #ifndef GTK_UI #define GTK_UI #endif #include #include #include #include // Localization #include #define _(String) gettext (String) #include // fix gtk-glade on windows with no configure #ifndef DATADIR #define DATADIR " " #endif #ifndef GLADEUI_UNINSTALLED_DIR #define GLADEUI_UNINSTALLED_DIR "glade/" #endif #include #include #include #include typedef union _callback_arg{ gpointer my_pointer; gconstpointer my_constpointer; gfloat my_float; gdouble my_double; gsize my_size; gssize my_ssize; gboolean my_boolean; guchar my_uchar; guint my_uint; guint8 my_uint8; guint16 my_uint16; guint32 my_uint32; guint64 my_uint64; gushort my_ushort; gulong my_ulong; gchar my_char; gint my_int; gint8 my_int8; gint16 my_int16; gint32 my_int32; gint64 my_int64; gshort my_short; glong my_long; } callback_arg; #define dyn_CAST(gtype,var) (((callback_arg*)var)->my_##gtype) #include "../MMU.h" #include "../registers.h" #include "../armcpu.h" #include "../NDSSystem.h" #include "../GPU.h" #include "../sndsdl.h" #include "../ctrlssdl.h" #include "../types.h" #include "../saves.h" #include "../render3D.h" #include "desmume.h" // autoconnect with strings as user_data void glade_xml_signal_autoconnect_StringObject (GladeXML *self); //--- extern int Frameskip; /* main.cpp */ extern GtkWidget * pWindow; extern GtkWidget * pDrawingArea, * pDrawingArea2; extern GladeXML * xml, * xml_tools; typedef void (*VoidFunPtr)(); void notify_Tools(); void register_Tool(VoidFunPtr fun); void unregister_Tool(VoidFunPtr fun); gchar * get_ui_file (const char *filename); /* callbacks.cpp */ void enable_rom_features(); void resize (float Size1, float Size2); void rotate(float angle); extern gboolean ScreenInvert; /* callbacks_IO.cpp */ extern float ScreenCoeff_Size[2]; extern float ScreenRotate; void black_screen (); void edit_controls(); void init_joy_labels(); #endif /* __GLOBALS_H__ */ desmume-0.9.11/src/gtk-glade/dTools/0000755000000000000000000000000012467663414015646 5ustar rootrootdesmume-0.9.11/src/gtk-glade/dTools/callbacks_dtools.h0000755000000000000000000001041312467662066021326 0ustar rootroot/* callbacks_dtools.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __CALLBACKS_DTOOLS_H__ #define __CALLBACKS_DTOOLS_H__ #include "../globals.h" extern "C" { /* ***** ***** IO REGISTERS ***** ***** */ G_MODULE_EXPORT void on_wtools_1_combo_cpu_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_1_IOregs_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_1_IOregs_close (GtkWidget *, ...); G_MODULE_EXPORT gboolean on_wtools_1_draw_button_release_event(GtkWidget *, GdkEventButton *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_1_draw_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); /* ***** ***** MEMORY VIEWER ***** ***** */ G_MODULE_EXPORT void on_wtools_2_MemView_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_MemView_close (GtkWidget *, ...); G_MODULE_EXPORT void on_wtools_2_cpu_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_2_r8_toggled (GtkToggleButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_r16_toggled (GtkToggleButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_r32_toggled (GtkToggleButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_GotoAddress_activate (GtkEntry *, gpointer ); G_MODULE_EXPORT void on_wtools_2_GotoAddress_changed (GtkEntry *, gpointer ); G_MODULE_EXPORT void on_wtools_2_GotoButton_clicked (GtkButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_scroll_value_changed (GtkRange *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_draw_button_release_event(GtkWidget *, GdkEventButton *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_draw_expose_event (GtkWidget *, GdkEventExpose *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_draw_scroll_event (GtkWidget *, GdkEventScroll *, gpointer ); /* ***** ***** PALETTE VIEWER ***** ***** */ // initialise combo box for all palettes void init_combo_palette(GtkComboBox *combo, u16 ** addresses); G_MODULE_EXPORT void on_wtools_3_PalView_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_3_PalView_close (GtkWidget *, ...); G_MODULE_EXPORT gboolean on_wtools_3_PalView_delete_event (GtkWidget *, GdkEvent *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_3_draw_expose_event (GtkWidget *, GdkEventExpose *, gpointer ); G_MODULE_EXPORT void on_wtools_3_palette_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_3_palnum_value_changed (GtkSpinButton *, gpointer ); /* ***** ***** TILE VIEWER ***** ***** */ // initialise combo box for all palettes void init_combo_memory(GtkComboBox *combo, u8 ** addresses); G_MODULE_EXPORT void on_wtools_4_TileView_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_4_TileView_close (GtkWidget *, ...); G_MODULE_EXPORT gboolean on_wtools_4_TileView_delete_event (GtkWidget *, GdkEvent *, gpointer ); G_MODULE_EXPORT void on_wtools_4_memory_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_4_palette_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_4_palnum_value_changed (GtkSpinButton *, gpointer ); G_MODULE_EXPORT void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data); G_MODULE_EXPORT gboolean on_wDraw_Tile_expose_event (GtkWidget *, GdkEventExpose *, gpointer ); } #endif desmume-0.9.11/src/gtk-glade/dTools/dTools_display.h0000755000000000000000000000674112467662066021025 0ustar rootroot/* dTools_display.c * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef _DTOOLS_DISPLAY_H_ #define _DTOOLS_DISPLAY_H_ #include typedef struct { GtkWidget *widget; GdkDrawable *draw; GdkGC *gc_fg; GdkGC *gc_bg; PangoLayout* playout; int size_w, size_h; int char_w, char_h, padding; GList * colors_rgb; GList * attr_list; PangoAttrList * curr_attr; } dTools_dsp; static void inline dTools_display_set_size(dTools_dsp * dsp, int w, int h, int pad) { dsp->size_w = w; dsp->size_h = h; dsp->padding = pad; // gtk_widget_set_size_request(dsp->widget, // dsp->char_w * w + pad * 2, dsp->char_h * h + pad * 2); gtk_widget_set_usize(dsp->widget, dsp->char_w * w + pad * 2, dsp->char_h * h + pad * 2); } static void inline dTools_display_init(dTools_dsp * dsp, GtkWidget * widget, int w, int h, int pad) { dsp->widget = widget; dsp->draw = widget->window; dsp->gc_fg = widget->style->fg_gc[widget->state]; dsp->gc_bg = widget->style->white_gc; dsp->playout = gtk_widget_create_pango_layout(widget, NULL); dsp->colors_rgb = NULL; dsp->attr_list = NULL; dsp->curr_attr = NULL; pango_layout_set_markup(dsp->playout, "X",-1); pango_layout_get_pixel_size(dsp->playout, &dsp->char_w, &dsp->char_h); dTools_display_set_size(dsp, w, h, pad); } // void unref (gpointer data, ...) { // pango_attr_list_unref(data); // } static void inline dTools_display_free(dTools_dsp * dsp) { // g_list_foreach(dsp->attr_list, (GFunc)unref, NULL); // g_object_unref(dsp->playout); // not alloc } static void inline dTools_display_add_markup(dTools_dsp * dsp, const char * markup) { PangoAttrList *attr; pango_parse_markup (markup, -1, 0, &attr, NULL, NULL, NULL); dsp->attr_list = g_list_append(dsp->attr_list, attr); dsp->curr_attr = attr; } static void inline dTools_display_clear(dTools_dsp * dsp) { gdk_draw_rectangle(dsp->draw, dsp->gc_bg, TRUE, 0, 0, dsp->widget->allocation.width, dsp->widget->allocation.height); } static void inline dTools_display_clear_char(dTools_dsp * dsp, int x, int y, int nb) { gdk_draw_rectangle(dsp->draw, dsp->gc_bg, TRUE, x * dsp->char_w + dsp->padding, y * dsp->char_h + dsp->padding, nb * dsp->char_w, dsp->char_h); } static void inline dTools_display_select_attr(dTools_dsp * dsp, int index) { PangoAttrList *attr = NULL; attr = (PangoAttrList*) g_list_nth_data(dsp->attr_list, index); if (attr != NULL) { dsp->curr_attr = attr; } pango_layout_set_attributes(dsp->playout, dsp->curr_attr); } static void inline dTools_display_draw_text(dTools_dsp * dsp, int x, int y, const char * txt) { pango_layout_set_text(dsp->playout, txt, -1); gdk_draw_layout(dsp->draw, dsp->gc_fg, x * dsp->char_w + dsp->padding, y * dsp->char_h + dsp->padding, dsp->playout); } #endif desmume-0.9.11/src/gtk-glade/dTools/callbacks_4_tileview.cpp0000755000000000000000000002302412467662066022432 0ustar rootroot/* callbacks_3_palview.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" #ifdef GTKGLEXT_AVAILABLE #include "../gdk_gl.h" void init_combo_memory(GtkComboBox *combo, u8 ** addresses) { GtkTreeIter iter; GtkListStore* model = gtk_list_store_new(1, G_TYPE_STRING); gtk_combo_box_set_model(combo, (GtkTreeModel*)model); int i=0; #define DO(str,addr,r) \ gtk_list_store_append (model, &iter); \ gtk_list_store_set (model, &iter, 0, str,-1); \ addresses[i]=(addr r); i++; // FIXME: update tileview to actually work // DO("A-BG - 0x6000000",MMU.ARM9_ABG,) // DO("A-BG - 0x6010000",MMU.ARM9_ABG,+0x10000) // DO("A-BG - 0x6020000",MMU.ARM9_ABG,+0x20000) // DO("A-BG - 0x6030000",MMU.ARM9_ABG,+0x30000) // DO("A-BG - 0x6040000",MMU.ARM9_ABG,+0x40000) // DO("A-BG - 0x6050000",MMU.ARM9_ABG,+0x50000) // DO("A-BG - 0x6060000",MMU.ARM9_ABG,+0x60000) // DO("A-BG - 0x6070000",MMU.ARM9_ABG,+0x70000) // DO("B-BG - 0x6200000",MMU.ARM9_BBG,) // DO("B-BG - 0x6210000",MMU.ARM9_BBG,+0x10000) // DO("A-OBJ- 0x6400000",MMU.ARM9_AOBJ,) // DO("A-OBJ- 0x6410000",MMU.ARM9_AOBJ,+0x10000) // DO("A-OBJ- 0x6420000",MMU.ARM9_AOBJ,+0x20000) // DO("A-OBJ- 0x6430000",MMU.ARM9_AOBJ,+0x30000) // DO("B-OBJ- 0x6600000",MMU.ARM9_BOBJ,) // DO("B-OBJ- 0x6610000",MMU.ARM9_BOBJ,+0x10000) DO("LCD - 0x6800000",MMU.ARM9_LCD,) DO("LCD - 0x6810000",MMU.ARM9_LCD,+0x10000) DO("LCD - 0x6820000",MMU.ARM9_LCD,+0x20000) DO("LCD - 0x6830000",MMU.ARM9_LCD,+0x30000) DO("LCD - 0x6840000",MMU.ARM9_LCD,+0x40000) DO("LCD - 0x6850000",MMU.ARM9_LCD,+0x50000) DO("LCD - 0x6860000",MMU.ARM9_LCD,+0x60000) DO("LCD - 0x6870000",MMU.ARM9_LCD,+0x70000) DO("LCD - 0x6880000",MMU.ARM9_LCD,+0x80000) DO("LCD - 0x6890000",MMU.ARM9_LCD,+0x90000) #undef DO gtk_combo_box_set_active(combo,0); } static u16* pal_addr[20]; static u8* mem_addr[26]; static BOOL init=FALSE; static int palnum=0; static int palindex=0; static int memnum=0; static int colnum=0; static void refresh(); static GtkWidget * wPaint; static GtkSpinButton * wSpin; static int gl_context_num=0; #define TILE_NUM_MAX 1024 #define TILE_W_SZ 8 #define TILE_H_SZ 8 static void wtools_4_update() { } typedef u16 tileBMP[8*8]; static void refresh() { u16 palette_16[64]; u16 palette_256[64]; u8 * index16, * index256, * indexBMP; u16 * pal; int tile_n, index; guint Textures; if (!init) return; index16 = index256 = indexBMP = mem_addr[memnum]; // this little thing doesnt display properly // nothing drawn... // seems that is the context is not shared there is a pb switching context /* if (!my_gl_Begin(gl_context_num)) return; glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); my_gl_DrawBeautifulQuad(); my_gl_End(gl_context_num); return; */ if (!my_gl_Begin(gl_context_num)) return; glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); #if 1 glEnable(GL_TEXTURE_2D); glGenTextures(1, &Textures); //proxy glBindTexture(GL_TEXTURE_2D, Textures); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, indexBMP); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2d(-1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex2d( 1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex2d( 1.0,-1.0); glTexCoord2f(0.0, 1.0); glVertex2d(-1.0,-1.0); glEnd(); glDeleteTextures(1, &Textures); my_gl_End(gl_context_num); return; glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL); switch(colnum) { case 0: //BMP for (tile_n=0; tile_n> 5)<<3, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, indexBMP); indexBMP +=64; } break; case 1: //256c pal = pal_addr[palindex]; if (pal) { pal += palnum*256; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64; index++) { palette_256[index]=pal[*index256]; index256++; } glTexSubImage2D(GL_TEXTURE_2D, 0, (tile_n & 0x1F)<<3, (tile_n >> 5)<<3, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_256); } } break; case 2: //16c pal = pal_addr[palindex]; if (pal) { pal += palnum*16; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64-1; index++) { if (index & 1) continue; palette_16[index] =pal[*index16 & 15]; palette_16[index+1]=pal[*index16 >> 4]; index16++; } glTexSubImage2D(GL_TEXTURE_2D, 0, (tile_n & 0x1F)<<3, (tile_n >> 5)<<3, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_16); } } break; } glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2d(-0.5, 0.5); glTexCoord2f(0.0, 1.0); glVertex2d(-0.5,-0.5); glTexCoord2f(1.0, 1.0); glVertex2d( 0.5,-0.5); glTexCoord2f(1.0, 0.0); glVertex2d( 0.5, 0.5); glEnd(); glDeleteTextures(1, &Textures); #else glDisable(GL_LIGHTING); glDisable(GL_BLEND); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor4ub(255,255,255,255); switch(colnum) { case 0: //BMP { tileBMP tiles * = indexBMP; for (tile_n=0; tile_n<1024; tile_n++) { i = (tile_n & 0x1F) << 4; j = (tile_n >> 5) << 12; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; } glRasterPos2i(0,0); glDrawPixels(256,256,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV, bmp); } break; case 1: //256c if (pal = pal_addr[palindex]) { pal += palnum*256; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64; index++) { palette_256[index]=pal[*index256]; index256++; } glRasterPos2i((tile_n & 0x1F)<<3, (tile_n >> 5)<<3); glDrawPixels(8,8,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_256); } } break; case 2: //16c if (pal = pal_addr[palindex]) { pal += palnum*16; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64; index++) { if (index & 1) continue; palette_16[index] =pal[*index16 & 15]; palette_16[index+1]=pal[*index16 >> 4]; index16++; } glRasterPos2i((tile_n & 0x1F)<<3, (tile_n >> 5)<<3); glDrawPixels(8,8,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_16); } } break; } #endif my_gl_End(gl_context_num); } static void initialize() { GtkComboBox * combo; if (init) return; wPaint= glade_xml_get_widget(xml_tools, "wDraw_Tile"); wSpin = (GtkSpinButton*)glade_xml_get_widget(xml_tools, "wtools_4_palnum"); combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_4_palette"); init_combo_palette(combo, pal_addr); combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_4_memory"); init_combo_memory(combo, mem_addr); gl_context_num = init_GL_free_s(wPaint,0); reshape(wPaint, gl_context_num); gtk_widget_show(wPaint); init=TRUE; } void on_wtools_4_TileView_show (GtkWidget *widget, gpointer data) { initialize(); register_Tool(wtools_4_update); } gboolean on_wtools_4_TileView_close (GtkWidget *widget, ...) { unregister_Tool(wtools_4_update); gtk_widget_hide(widget); return TRUE; } void on_wtools_4_palette_changed (GtkComboBox *combo, gpointer user_data) { palindex = gtk_combo_box_get_active(combo); gtk_widget_set_sensitive((GtkWidget*)wSpin,(palindex >=4)); gtk_spin_button_set_value(wSpin,0); gtk_widget_queue_draw(wPaint); } void on_wtools_4_palnum_value_changed (GtkSpinButton *spin, gpointer user_data) { palnum = gtk_spin_button_get_value_as_int(spin); gtk_widget_queue_draw(wPaint); } void on_wtools_4_memory_changed (GtkComboBox *combo, gpointer user_data) { memnum = gtk_combo_box_get_active(combo); gtk_widget_queue_draw(wPaint); } void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { colnum = dyn_CAST(int,user_data); gtk_widget_queue_draw(wPaint); } gboolean on_wDraw_Tile_expose_event (GtkWidget * w, GdkEventExpose * e, gpointer user_data) { refresh(); return TRUE; } #else void on_wtools_4_TileView_show (GtkWidget *widget, gpointer data) { } gboolean on_wtools_4_TileView_close (GtkWidget *widget, ...) { return FALSE; } void on_wtools_4_palette_changed (GtkComboBox *combo, gpointer user_data) { } void on_wtools_4_palnum_value_changed (GtkSpinButton *spin, gpointer user_data) { } void on_wtools_4_memory_changed (GtkComboBox *combo, gpointer user_data) { } void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { } gboolean on_wDraw_Tile_expose_event (GtkWidget * w, GdkEventExpose * e, gpointer user_data) { return FALSE; } #endif desmume-0.9.11/src/gtk-glade/dTools/callbacks_2_memview.cpp0000755000000000000000000001731612467662066022260 0ustar rootroot/* callbacks_2_memview.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" #include "dTools_display.h" /* ***** ***** MEMORY VIEWER ***** ***** */ enum SHOW { Bit8, Bit16, Bit32 }; static BOOL init=FALSE; static enum SHOW packmode=Bit8; static u32 address=0, tmpaddr=0; int cpu=0; static char patt[512]; static u8 mem[0x100]; static dTools_dsp dsp; static GtkEntry *wAddress; static GtkRange *wRange; static void refresh(); static void initialize(); /* update */ static void wtools_2_update() { int i,j; u8 m8, *mem8 =mem; u16 m16, *mem16=(u16*)mem; u32 m32, *mem32=(u32*)mem; u32 addr; char txt[16]; // red dTools_display_select_attr(&dsp, 3); addr = address; switch (packmode) { case Bit8: for (i=0; i<0x10; i++) { for (j=0; j<16; j++, addr++,mem8++) { m8 = *mem8; *mem8 = MMU_read8(cpu, addr); if (m8 != *mem8) { sprintf(txt, "%02X", *mem8); dTools_display_clear_char(&dsp, 12+3*j, i, 3); dTools_display_draw_text(&dsp, 12+3*j, i, txt); } } } break; case Bit16: for (i=0; i<0x10; i++) { for (j=0; j<16; j+=2, addr+=2,mem16++) { m16 = *mem16; *mem16 = MMU_read16(cpu, addr); if (m16 != *mem16) { sprintf(txt, " %04X", *mem16); dTools_display_clear_char(&dsp, 12+3*j, i, 6); dTools_display_draw_text(&dsp, 12+3*j, i, txt); } } } break; case Bit32: for (i=0; i<0x10; i++) { for (j=0; j<16; j+=4, addr+=4,mem32++) { m32 = *mem32; *mem32 = MMU_read32(cpu, addr); if (m32 != *mem32) { sprintf(txt, " %08X", *mem32); dTools_display_clear_char(&dsp, 12+3*j, i, 12); dTools_display_draw_text(&dsp, 12+3*j, i, txt); } } } break; } } gboolean on_wtools_2_draw_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { // clear the red marks :) if (event->button==1) refresh(); return TRUE; } /* which cpu we look into */ void on_wtools_2_cpu_changed (GtkComboBox *widget, gpointer user_data) { /* c == 0 means ARM9 */ cpu=gtk_combo_box_get_active(widget); refresh(); } /* how to pack bytes */ void on_wtools_2_r8_toggled (GtkToggleButton *togglebutton, gpointer user_data) { packmode=Bit8; refresh(); } void on_wtools_2_r16_toggled (GtkToggleButton *togglebutton, gpointer user_data) { packmode=Bit16; refresh(); } void on_wtools_2_r32_toggled (GtkToggleButton *togglebutton, gpointer user_data) { packmode=Bit32; refresh(); } /* which address */ #define RANGE_MIN 0 #define RANGE_MAX 0x10000000 #define ADDR_MASK 0xFFFFFFF #define STEP_ONE_LINE 0x1 #define STEP_ONE_PAGE 0x10 #define STEP_x10_PAGE 0x100 static void scroll_address(u32 addr) { address = (addr & ADDR_MASK); refresh(); } static void change_address(u32 addr) { addr /= 0x10; gtk_range_set_value(wRange, addr); } static void add_to_address(s32 inc) { u32 addr = (address+inc) & ADDR_MASK; gtk_range_set_value(wRange, addr); } void on_wtools_2_GotoAddress_activate (GtkEntry *entry, gpointer user_data) { change_address(strtol(gtk_entry_get_text(entry),NULL,0)); } void on_wtools_2_GotoAddress_changed (GtkEntry *entry, gpointer user_data) { tmpaddr=strtol(gtk_entry_get_text(entry),NULL,0); } void on_wtools_2_GotoButton_clicked (GtkButton *button, gpointer user_data) { change_address(tmpaddr); } /* show, register, unregister */ void on_wtools_2_MemView_show (GtkWidget *widget, gpointer user_data) { initialize(); register_Tool(wtools_2_update); } gboolean on_wtools_2_MemView_close (GtkWidget *widget, ...) { unregister_Tool(wtools_2_update); dTools_display_free(&dsp); gtk_widget_hide(widget); return TRUE; } /* scroll functions :D */ void on_wtools_2_scroll_value_changed (GtkRange *range, gpointer user_data) { u32 addr=(u32)gtk_range_get_value(range); scroll_address(addr); } gboolean on_wtools_2_draw_scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer user_data) { switch (event->direction) { case GDK_SCROLL_UP: add_to_address(-STEP_ONE_PAGE); break; case GDK_SCROLL_DOWN: add_to_address(+STEP_ONE_PAGE); break; case GDK_SCROLL_LEFT: case GDK_SCROLL_RIGHT: default: break; } return TRUE; } gboolean on_wtools_2_draw_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { refresh(); return TRUE; } /* initialise what we have to */ static void initialize() { GtkWidget * combo; GtkWidget * wPaint; GtkAdjustment *adj; if (init) return; combo = glade_xml_get_widget(xml_tools, "wtools_2_cpu"); adj = (GtkAdjustment *)gtk_adjustment_new (RANGE_MIN, RANGE_MIN, RANGE_MAX, STEP_ONE_LINE, STEP_x10_PAGE, STEP_ONE_PAGE); // get widget reference wAddress = (GtkEntry*)glade_xml_get_widget(xml_tools, "wtools_2_GotoAddress"); wRange = (GtkRange*)glade_xml_get_widget(xml_tools, "wtools_2_scroll"); wPaint = glade_xml_get_widget(xml_tools, "wtools_2_draw"); dTools_display_init(&dsp, wPaint, 80, 16, 5); #define PATT(x) x"" x "" #define DUP(x) x x sprintf(patt, "0000:0000 | %s| 0123456789ABCDEF", DUP(DUP(DUP(PATT("00_")))) ); dTools_display_add_markup(&dsp, patt); sprintf(patt, "0000:0000 | %s| 0123456789ABCDEF", DUP(DUP(PATT("_0000_"))) ); dTools_display_add_markup(&dsp, patt); sprintf(patt, "0000:0000 | %s| 0123456789ABCDEF", DUP(PATT("__00000000__")) ); dTools_display_add_markup(&dsp, patt); #undef DUP #undef PATT strcpy(patt, "__00000000__"); dTools_display_add_markup(&dsp, patt); init = TRUE; gtk_combo_box_set_active((GtkComboBox*)combo, 0); gtk_range_set_adjustment(wRange, adj); change_address(RANGE_MIN); } /* PAINT memory panel */ static void refresh() { int i,j,addr; u8 c; u8 *mem8=mem; u16 *mem16=(u16*)mem; u32 *mem32=(u32*)mem; char *ptxt, txt[]="0000:0000 | 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | 0123456789ABCDEF\0"; if (!init) return; addr=address * 0x10; for (i=0; i<0x100; i++) mem[i] = MMU_read8(cpu, addr+i); dTools_display_clear(&dsp); switch(packmode) { case Bit8: dTools_display_select_attr(&dsp, 0); break; case Bit16: dTools_display_select_attr(&dsp, 1); break; case Bit32: dTools_display_select_attr(&dsp, 2); break; } // draw memory content here for (i=0; i<0x10; i++) { ptxt = txt; sprintf(ptxt, "%04X:%04X | ", (addr>>16)&0xFFFF, addr&0xFFFF); ptxt+=12; switch(packmode) { case Bit8: for (j=0; j<16; j++,ptxt+=3) sprintf(ptxt, "%02X ", mem8[j]); break; case Bit16: for (j=0; j<16; j+=2,ptxt+=6, mem16++) sprintf(ptxt, " %04X ", *mem16); break; case Bit32: for (j=0; j<16; j+=4,ptxt+=12, mem32++) sprintf(ptxt, " %08X ", *mem32); break; } sprintf(ptxt, "| "); ptxt +=2; for (j=0; j<16; j++,ptxt++) // only ASCII printable sprintf(ptxt, "%c", ((c=mem8[j])<0x20)?'.':((c>=0x7F)?'.':c)); addr += 16; mem8 +=16; *(ptxt)=0; dTools_display_draw_text(&dsp, 0, i, txt); } } desmume-0.9.11/src/gtk-glade/dTools/callbacks_1_ioregs.cpp0000755000000000000000000001045112467662066022067 0ustar rootroot/* callbacks_1_ioregs.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" #include "dTools_display.h" /* ***** ***** IO REGISTERS ***** ***** */ static int cpu=0; static BOOL init=FALSE; static int size_=0; static dTools_dsp dsp; static void update_regs_fast(); static void update_regs(); /* Register name list */ #define NBR_IO_REGS 7 typedef struct { char name[20]; u32 addr; BOOL trunc; } reg_name_addr; const reg_name_addr Reg_Names_Addr[NBR_IO_REGS] = { { "REG_IPCFIFOCNT", REG_IPCFIFOCNT, TRUE }, { "REG_SPICNT", REG_SPICNT, TRUE }, { "REG_IME", REG_IME, TRUE }, { "REG_IE", REG_IE, FALSE }, { "REG_IF", REG_IF, FALSE }, { "REG_POWCNT1", REG_POWCNT1, TRUE }, { "REG_DISPCAPCNT", REG_DISPA_DISPCAPCNT, FALSE } }; /* update */ static void wtools_1_update () { update_regs_fast(); } /* Update register display */ static u32 mem[NBR_IO_REGS]; static void update_regs_fast(){ char text[11]; int i; u32 w, m; for( i = 0; i < NBR_IO_REGS; i++ ) { w = MMU_read32(cpu,Reg_Names_Addr[i].addr); m = mem[i]; if ( Reg_Names_Addr[i].trunc ) { w &= 0xFFFF; m &= 0xFFFF; } mem[i] = w; if (w == m) continue; if ( Reg_Names_Addr[i].trunc ) sprintf(text, " 0x%04X", w); else sprintf(text, "0x%08X", w); dTools_display_select_attr(&dsp, 2); dTools_display_clear_char(&dsp, size_+3, i, 10); dTools_display_draw_text(&dsp, size_+3, i, text); } } static void update_regs() { char text[80]; int len, i; if (init==FALSE) { GtkWidget * wPaint = glade_xml_get_widget(xml_tools, "wtools_1_draw"); for( i = 0; i < NBR_IO_REGS; i++ ) { len = strlen(Reg_Names_Addr[i].name); if (size_ "); dTools_display_add_markup(&dsp, "0x00000000"); dTools_display_add_markup(&dsp, "0x00000000"); init=TRUE; } dTools_display_clear(&dsp); for( i = 0; i < NBR_IO_REGS; i++ ) { mem[i] = MMU_read32(cpu,Reg_Names_Addr[i].addr); if ( Reg_Names_Addr[i].trunc ) sprintf(text, " 0x%04X", mem[i]); else sprintf(text, "0x%08X", mem[i]); dTools_display_select_attr(&dsp, 0); dTools_display_draw_text(&dsp, 0, i, Reg_Names_Addr[i].name); dTools_display_draw_text(&dsp, size_, i, " : "); dTools_display_select_attr(&dsp, 1); dTools_display_draw_text(&dsp, size_+3, i, text); } } gboolean on_wtools_1_draw_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { // clear the red marks :) if (event->button==1) update_regs(); return TRUE; } gboolean on_wtools_1_draw_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { update_regs(); return TRUE; } void on_wtools_1_combo_cpu_changed (GtkComboBox *widget, gpointer user_data) { /* c == 0 means ARM9 */ cpu=gtk_combo_box_get_active(widget); update_regs(); } /* show, register, unregister */ void on_wtools_1_IOregs_show (GtkWidget *widget, gpointer user_data) { GtkWidget * combo = glade_xml_get_widget(xml_tools, "wtools_1_combo_cpu"); // do as if we had selected this button and ARM7 cpu gtk_combo_box_set_active((GtkComboBox*)combo, 0); register_Tool(wtools_1_update); } gboolean on_wtools_1_IOregs_close (GtkWidget *widget, ...) { unregister_Tool(wtools_1_update); gtk_widget_hide(widget); return TRUE; } desmume-0.9.11/src/gtk-glade/dTools/callbacks_3_palview.cpp0000755000000000000000000001176312467662066022257 0ustar rootroot/* callbacks_3_palview.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" void init_combo_palette(GtkComboBox *combo, u16 ** addresses) { GtkTreeIter iter; GtkListStore* model = gtk_list_store_new(1, G_TYPE_STRING); gtk_combo_box_set_model(combo, (GtkTreeModel*)model); int i=0; #define DO(str,addr,r) \ gtk_list_store_append (model, &iter); \ gtk_list_store_set (model, &iter, 0, str,-1); \ addresses[i]=((u16*)(addr) r); i++; DO("Main screen BG PAL", MMU.ARM9_VMEM,) DO("Main screen SPR PAL", MMU.ARM9_VMEM,+0x100) DO("Sub screen BG PAL", MMU.ARM9_VMEM,+0x200) DO("Sub screen SPR PAL", MMU.ARM9_VMEM,+0x300) DO("Main screen ExtPAL 0", MMU.ExtPal[0][0],) DO("Main screen ExtPAL 1", MMU.ExtPal[0][1],) DO("Main screen ExtPAL 2", MMU.ExtPal[0][2],) DO("Main screen ExtPAL 3", MMU.ExtPal[0][3],) DO("Sub screen ExtPAL 0", MMU.ExtPal[1][0],) DO("Sub screen ExtPAL 1", MMU.ExtPal[1][1],) DO("Sub screen ExtPAL 2", MMU.ExtPal[1][2],) DO("Sub screen ExtPAL 3", MMU.ExtPal[1][3],) DO("Main screen SPR ExtPAL 0", MMU.ObjExtPal[0][0],) DO("Main screen SPR ExtPAL 1", MMU.ObjExtPal[0][1],) DO("Sub screen SPR ExtPAL 0", MMU.ObjExtPal[1][0],) DO("Sub screen SPR ExtPAL 1", MMU.ObjExtPal[1][1],) DO("Texture PAL 0", MMU.texInfo.texPalSlot[0],) DO("Texture PAL 1", MMU.texInfo.texPalSlot[1],) DO("Texture PAL 2", MMU.texInfo.texPalSlot[2],) DO("Texture PAL 3", MMU.texInfo.texPalSlot[3],) #undef DO gtk_combo_box_set_active(combo,0); } static u16* base_addr[20]; static BOOL init=FALSE; static int palnum=0; static int palindex=0; static void refresh(); static GtkWidget * wPaint; static GtkSpinButton * wSpin; static u16 mem[0x100]; static COLOR c; static COLOR32 c32; static GdkGC * gdkGC; static inline void paint_col(int x, int y, u16 col) { c.val = col; COLOR_16_32(c,c32) gdk_rgb_gc_set_foreground(gdkGC, c32.val); gdk_draw_rectangle(wPaint->window, gdkGC, TRUE, x, y, 15, 15); } static inline void paint_cross(int x, int y) { gdk_rgb_gc_set_foreground(gdkGC, 0x808080); gdk_draw_rectangle(wPaint->window, gdkGC, TRUE, x, y, 15, 15); gdk_rgb_gc_set_foreground(gdkGC, 0xFF0000); gdk_draw_line(wPaint->window, gdkGC, x+14, y+1, x+1, y+14); gdk_draw_line(wPaint->window, gdkGC, x+1, y+1, x+14, y+14); } static void wtools_3_update() { int i,x,y,X,Y; u16 * addr = base_addr[palindex], tmp; gdkGC = gdk_gc_new(wPaint->window); if (addr) { memcpy(mem, addr, 0x100*sizeof(u16)); i=0; for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) { tmp=mem[i]; if (tmp != (mem[i]=*(addr+Y+x+0x100*palnum))) paint_col(X,Y,mem[i]); } } else { for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) paint_cross(X,Y); } g_object_unref(gdkGC); } static void refresh() { int x,y,X,Y; u16 * addr = base_addr[palindex]; gdkGC = gdk_gc_new(wPaint->window); if (addr) { memcpy(mem, addr, 0x100*sizeof(u16)); for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) paint_col(X,Y,*(addr+Y+x+0x100*palnum)); } else { for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) paint_cross(X,Y); } g_object_unref(gdkGC); } static void initialize() { GtkComboBox * combo; if (init) return; wPaint= glade_xml_get_widget(xml_tools, "wtools_3_draw"); wSpin = (GtkSpinButton*)glade_xml_get_widget(xml_tools, "wtools_3_palnum"); combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_3_palette"); init_combo_palette(combo, base_addr); init=TRUE; } void on_wtools_3_PalView_show (GtkWidget *widget, gpointer data) { initialize(); register_Tool(wtools_3_update); } gboolean on_wtools_3_PalView_close (GtkWidget *widget, ...) { unregister_Tool(wtools_3_update); gtk_widget_hide(widget); return TRUE; } gboolean on_wtools_3_draw_expose_event (GtkWidget * widget, GdkEventExpose *event, gpointer user_data) { refresh(); return TRUE; } void on_wtools_3_palette_changed (GtkComboBox *combo, gpointer user_data) { palindex = gtk_combo_box_get_active(combo); gtk_widget_set_sensitive((GtkWidget*)wSpin,(palindex >=4)); gtk_spin_button_set_value(wSpin,0); refresh(); } void on_wtools_3_palnum_value_changed (GtkSpinButton *spin, gpointer user_data) { palnum = gtk_spin_button_get_value_as_int(spin); refresh(); } desmume-0.9.11/src/gtk-glade/callbacks.h0000755000000000000000000000761712467662066016512 0ustar rootroot/* callbacks.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "globals.h" extern "C" { /* MENU FILE */ G_MODULE_EXPORT void on_menu_open_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_quit_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU SAVES */ G_MODULE_EXPORT void on_loadstateXX_activate (GtkMenuItem *, gpointer ); G_MODULE_EXPORT void on_savestateXX_activate (GtkMenuItem *, gpointer ); G_MODULE_EXPORT void on_savetypeXX_activate (GtkMenuItem *, gpointer ); /* MENU EMULATION */ G_MODULE_EXPORT void on_menu_exec_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_pause_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_reset_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_layers_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_fsXX_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_sizeXX_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU CONFIG */ G_MODULE_EXPORT void on_menu_controls_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_joy_controls_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_audio_on_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_gapscreen_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_nogap_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_rightscreen_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_rotatescreen_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU TOOLS */ G_MODULE_EXPORT void on_menu_wtoolsXX_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_IO_regs_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_memview_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_palview_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_tileview_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU ? */ G_MODULE_EXPORT void on_menu_apropos_activate (GtkMenuItem *menuitem, gpointer user_data); /* TOOLBAR */ G_MODULE_EXPORT void on_wgt_Open_clicked (GtkToolButton *toolbutton, gpointer user_data); G_MODULE_EXPORT void on_wgt_Exec_toggled (GtkToggleToolButton *toggletoolbutton, gpointer user_data); G_MODULE_EXPORT void on_wgt_Reset_clicked (GtkToolButton *toolbutton, gpointer user_data); G_MODULE_EXPORT void on_wgt_Quit_clicked (GtkToolButton *toolbutton, gpointer user_data); /* LAYERS TOGGLE */ G_MODULE_EXPORT void on_wc_1_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data); G_MODULE_EXPORT void on_wc_2_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data); } desmume-0.9.11/src/gtk-glade/Makefile.in0000644000000000000000000007571412467662234016464 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk bin_PROGRAMS = desmume-glade$(EXEEXT) @HAVE_GDB_STUB_TRUE@am__append_1 = ../gdbstub/libgdbstub.a subdir = src/gtk-glade ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" \ "$(DESTDIR)$(gladedir)" "$(DESTDIR)$(pixmapdir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_desmume_glade_OBJECTS = glade-xml.$(OBJEXT) callbacks.$(OBJEXT) \ callbacks_IO.$(OBJEXT) desmume.$(OBJEXT) \ keyval_names.$(OBJEXT) main.$(OBJEXT) gdk_gl.$(OBJEXT) \ dTools/callbacks_1_ioregs.$(OBJEXT) \ dTools/callbacks_2_memview.$(OBJEXT) \ dTools/callbacks_3_palview.$(OBJEXT) \ dTools/callbacks_4_tileview.$(OBJEXT) gdk_3Demu.$(OBJEXT) \ ../sndsdl.$(OBJEXT) ../ctrlssdl.$(OBJEXT) ../driver.$(OBJEXT) desmume_glade_OBJECTS = $(am_desmume_glade_OBJECTS) am__DEPENDENCIES_1 = desmume_glade_DEPENDENCIES = ../libdesmume.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(desmume_glade_SOURCES) DIST_SOURCES = $(desmume_glade_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(Applications_DATA) $(glade_DATA) $(pixmap_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(GTKGLEXT_CFLAGS) \ $(LIBGLADE_CFLAGS) $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) \ $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) \ -DDATADIR=\"$(gladedir)/\" -DLOCALEDIR=\"$(localedir)\" AM_LDFLAGS = -rdynamic $(INTLLIBS) EXTRA_DIST = $(glade_DATA) desmume-glade.desktop Applicationsdir = $(datadir)/applications Applications_DATA = desmume-glade.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = glade/DeSmuME.xpm gladedir = $(datadir)/desmume/glade glade_DATA = glade/DeSmuMe_Dtools.glade glade/DeSmuMe.glade glade/DeSmuME.xpm desmume_glade_SOURCES = \ globals.h glade-xml.cpp \ callbacks.cpp callbacks.h callbacks_IO.cpp callbacks_IO.h \ desmume.cpp desmume.h \ keyval_names.cpp keyval_names.h main.cpp gdk_gl.cpp gdk_gl.h \ dTools/callbacks_1_ioregs.cpp dTools/callbacks_2_memview.cpp \ dTools/callbacks_3_palview.cpp dTools/callbacks_4_tileview.cpp \ dTools/callbacks_dtools.h \ dTools/dTools_display.h \ gdk_3Demu.cpp gdk_3Demu.h \ ../sndsdl.h ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp desmume_glade_LDADD = ../libdesmume.a $(SDL_LIBS) $(GTKGLEXT_LIBS) \ $(LIBGLADE_LIBS) $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) \ $(LIBSOUNDTOUCH_LIBS) $(am__append_1) all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk-glade/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk-glade/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) dTools/$(am__dirstamp): @$(MKDIR_P) dTools @: > dTools/$(am__dirstamp) dTools/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dTools/$(DEPDIR) @: > dTools/$(DEPDIR)/$(am__dirstamp) dTools/callbacks_1_ioregs.$(OBJEXT): dTools/$(am__dirstamp) \ dTools/$(DEPDIR)/$(am__dirstamp) dTools/callbacks_2_memview.$(OBJEXT): dTools/$(am__dirstamp) \ dTools/$(DEPDIR)/$(am__dirstamp) dTools/callbacks_3_palview.$(OBJEXT): dTools/$(am__dirstamp) \ dTools/$(DEPDIR)/$(am__dirstamp) dTools/callbacks_4_tileview.$(OBJEXT): dTools/$(am__dirstamp) \ dTools/$(DEPDIR)/$(am__dirstamp) ../$(am__dirstamp): @$(MKDIR_P) .. @: > ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../$(DEPDIR) @: > ../$(DEPDIR)/$(am__dirstamp) ../sndsdl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../ctrlssdl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../driver.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) desmume-glade$(EXEEXT): $(desmume_glade_OBJECTS) $(desmume_glade_DEPENDENCIES) $(EXTRA_desmume_glade_DEPENDENCIES) @rm -f desmume-glade$(EXEEXT) $(CXXLINK) $(desmume_glade_OBJECTS) $(desmume_glade_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../ctrlssdl.$(OBJEXT) -rm -f ../driver.$(OBJEXT) -rm -f ../sndsdl.$(OBJEXT) -rm -f dTools/callbacks_1_ioregs.$(OBJEXT) -rm -f dTools/callbacks_2_memview.$(OBJEXT) -rm -f dTools/callbacks_3_palview.$(OBJEXT) -rm -f dTools/callbacks_4_tileview.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/ctrlssdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/sndsdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks_IO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desmume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdk_3Demu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdk_gl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glade-xml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyval_names.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dTools/$(DEPDIR)/callbacks_1_ioregs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dTools/$(DEPDIR)/callbacks_2_memview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dTools/$(DEPDIR)/callbacks_3_palview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@dTools/$(DEPDIR)/callbacks_4_tileview.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-ApplicationsDATA: $(Applications_DATA) @$(NORMAL_INSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(Applicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(Applicationsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Applicationsdir)" || exit $$?; \ done uninstall-ApplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(Applicationsdir)'; $(am__uninstall_files_from_dir) install-gladeDATA: $(glade_DATA) @$(NORMAL_INSTALL) @list='$(glade_DATA)'; test -n "$(gladedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(gladedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(gladedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gladedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(gladedir)" || exit $$?; \ done uninstall-gladeDATA: @$(NORMAL_UNINSTALL) @list='$(glade_DATA)'; test -n "$(gladedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(gladedir)'; $(am__uninstall_files_from_dir) install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \ done uninstall-pixmapDATA: @$(NORMAL_UNINSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" "$(DESTDIR)$(gladedir)" "$(DESTDIR)$(pixmapdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../$(DEPDIR)/$(am__dirstamp) -rm -f ../$(am__dirstamp) -rm -f dTools/$(DEPDIR)/$(am__dirstamp) -rm -f dTools/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ../$(DEPDIR) ./$(DEPDIR) dTools/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-ApplicationsDATA install-gladeDATA \ install-pixmapDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ../$(DEPDIR) ./$(DEPDIR) dTools/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-ApplicationsDATA uninstall-binPROGRAMS \ uninstall-gladeDATA uninstall-pixmapDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install \ install-ApplicationsDATA install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-gladeDATA install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pixmapDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-ApplicationsDATA uninstall-am \ uninstall-binPROGRAMS uninstall-gladeDATA uninstall-pixmapDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/gtk-glade/desmume.cpp0000755000000000000000000000710712467662066016557 0ustar rootroot/* desmume.c - this file is part of DeSmuME * * Copyright (C) 2007-2015 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "desmume.h" #define EMULOOP_PRIO (G_PRIORITY_HIGH_IDLE + 20) gboolean EmuLoop(gpointer data); static BOOL regMainLoop = FALSE; #define TICKS_PER_FRAME 17 static BOOL noticed_3D=FALSE; volatile bool execute = false; BOOL click = FALSE; void desmume_mem_init(); u8 *desmume_rom_data = NULL; u32 desmume_last_cycle; void desmume_init() { NDS_Init(); SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); execute = false; } void desmume_free() { execute = false; NDS_DeInit(); } int desmume_open(const char *filename) { int i; noticed_3D=FALSE; clear_savestates(); i = NDS_LoadROM(filename); return i; } void desmume_savetype(int type) { backup_setManualBackupType(type); } void desmume_pause() { execute = false; SPU_Pause(1); } void desmume_resume() { SPU_Pause(0); execute = true; if(!regMainLoop) g_idle_add_full(EMULOOP_PRIO, &EmuLoop, NULL, NULL); regMainLoop = TRUE; } void desmume_reset() { noticed_3D=FALSE; NDS_Reset(); desmume_resume(); } void desmume_toggle() { execute ^= true; } /*INLINE BOOL desmume_running() { return execute; }*/ INLINE void desmume_cycle() { u16 keypad; /* Joystick events */ /* Retrieve old value: can use joysticks w/ another device (from our side) */ keypad = get_keypad(); /* Process joystick events if any */ process_joystick_events( &keypad); /* Update keypad value */ update_keypad(keypad); NDS_exec(); SPU_Emulate_user(); } Uint32 fps, fps_SecStart, fps_FrameCount; Uint32 fsFrameCount = 0; Uint32 ticksPrevFrame = 0, ticksCurFrame = 0; static void Draw() { } gboolean EmuLoop(gpointer data) { if(desmume_running()) /* Si on est en train d'executer le programme ... */ { if(Frameskip != 0 && (fsFrameCount % (Frameskip+1)) != 0) NDS_SkipNextFrame(); fsFrameCount++; fps_FrameCount++; if(!fps_SecStart) fps_SecStart = SDL_GetTicks(); if(SDL_GetTicks() - fps_SecStart >= 1000) { fps_SecStart = SDL_GetTicks(); fps = fps_FrameCount; fps_FrameCount = 0; char Title[32]; sprintf(Title, "Desmume - %dfps", fps); gtk_window_set_title(GTK_WINDOW(pWindow), Title); } desmume_cycle(); /* Emule ! */ //for(i = 0; i < Frameskip; i++) desmume_cycle(); /* cycles supplİmentaires pour le frameskip */ Draw(); notify_Tools(); gtk_widget_queue_draw(pDrawingArea); gtk_widget_queue_draw(pDrawingArea2); ticksCurFrame = SDL_GetTicks(); if(!glade_fps_limiter_disabled) { if((ticksCurFrame - ticksPrevFrame) < TICKS_PER_FRAME) while((ticksCurFrame - ticksPrevFrame) < TICKS_PER_FRAME) ticksCurFrame = SDL_GetTicks(); } ticksPrevFrame = SDL_GetTicks(); return TRUE; } gtk_widget_queue_draw(pDrawingArea); gtk_widget_queue_draw(pDrawingArea2); regMainLoop = FALSE; return FALSE; } desmume-0.9.11/src/gtk-glade/glade/0000755000000000000000000000000012467663414015456 5ustar rootrootdesmume-0.9.11/src/gtk-glade/glade/DeSmuME.xpm0000755000000000000000000000263512467662066017456 0ustar rootroot/* XPM */ static const char * DeSmuME_xpm[] = { "32 32 15 1", " c None", ". c #000000", "+ c #F6F6FB", "@ c #ECECF6", "# c #E2E2F1", "$ c #D8D8EC", "% c #CFCFE7", "& c #C5C5E2", "* c #BBBBDE", "= c #B1B1D9", "- c #A8A8D4", "; c #9E9ECF", "> c #9494CA", ", c #8A8AC5", "' c #8080C0", " .................... ", " .................... ", ".....++..+++++..+++++.. ", ".....++..++.....++..... ", "..@@@@@..@@@@@..@@@@@.. ", "..@@.@@..@@........@@.. ", "..##.##..##.##..##.##.. ", "..##.##..##.##..##.##.. ", "..$$.$$..$$.$$..$$.$$.. ", "..$$.$$..$$.$$..$$.$$.. ", "..%%.%%..%%.%%..%%.%%.. ", "..%%.%%..%%.%%..%%.%%.. ", "..&&&&&..&&&&&..&&&&&.. ", "....................... ", ".......********.**.**.. ", " ..==.==.==.==.==.. ", " ..==.==.==.==.==.. ", " ..--.--.--.--.--.. ", " ..--.--.--.--.--.. ", " ..;;.;;.;;.;;;;;.. ", " ..................... ", " ..................... ", " ..>>>>>>>>.>>>>>.. ", " ..>>.>>.>>.>>..... ", " ..,,.,,.,,.,,,,,.. ", " ..,,.,,.,,.,,..... ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.'''''.. ", " .................. ", " .................. "}; desmume-0.9.11/src/gtk-glade/glade/DeSmuMe.glade0000755000000000000000000036312712467662066017774 0ustar rootroot True GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK DeSmuME GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER False False False DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True GTK_PACK_DIRECTION_LTR GTK_PACK_DIRECTION_LTR True _File True True gtk-open True True Save State True True State 1 True True State 2 True True State 3 True True State 4 True True State 5 True True State 6 True True State 7 True True State 8 True True State 9 True True State 10 True True Load State True True State 1 True True State 2 True True State 3 True True State 4 True True State 5 True True State 6 True True State 7 True True State 8 True True State 9 True True State 10 True True _PrintScreen True True gtk-quit True True _Emulation True True False gtk-execute True True False gtk-media-pause True True False Reset True True gtk-refresh 1 0.5 0.5 0 0 True Layers True False True FrameSkip True True 0 True True True 1 True False fs0 True 2 True False fs0 True 3 True False fs0 True 4 True False fs0 True 5 True False fs0 True 6 True False fs0 True 7 True False fs0 True 8 True False fs0 True 9 True False fs0 True Size True True 1x True True True 2x True False size1x True 3x True False size1x True Config True True _Saves True True TYPE: Auto (1B) True True True TYPE: EEPROM1 (4kB) True False savetype1 True TYPE: EEPROM2 (64kB) True False savetype1 True TYPE: EEPROM2 (512kB) True False savetype1 True TYPE: FLASH (256kB) True False savetype1 True TYPE: FRAM (2MB) True False savetype1 True TYPE: FRAM (4MB) True False savetype1 True Keyboard controls True True gtk-preferences 1 0.5 0.5 0 0 True Joystick controls True True gtk-preferences 1 0.5 0.5 0 0 True Audio On True True True True Gap True False True No Gap True False True Right Screen True False True Rotate Screen 0 True True True Rotate Screen 90 True False menu_rotatescreen0 True Rotate Screen 180 True False menu_rotatescreen0 True Rotate Screen 270 True False menu_rotatescreen0 True Tools True True IO regs True True gtk-properties 1 0.5 0.5 0 0 True View Memory True True gtk-properties 1 0.5 0.5 0 0 True View Palette True True gtk-properties 1 0.5 0.5 0 0 True View Tiles True True gtk-properties 1 0.5 0.5 0 0 True ? True True gtk-about True 0 False False GTK_ORIENTATION_HORIZONTAL GTK_TOOLBAR_BOTH True True True gtk-open True True False False True True True True True False False True False gtk-execute True True False False False True True False Reset True gtk-refresh True True False False True True True True True False False True gtk-quit True True False False True 0 False False True 3 5 False 0 0 256 192 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_EXPOSURE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK 1 2 0 1 256 192 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_EXPOSURE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK 1 2 2 3 False False 0 True True BG0 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG1 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG2 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG3 True GTK_RELIEF_NORMAL True True False True 0 False False True True OBJ True GTK_RELIEF_NORMAL True True False True 0 False False 0 1 2 3 False False 0 True True BG0 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG1 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG2 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG3 True GTK_RELIEF_NORMAL True True False True 0 False False True True OBJ True GTK_RELIEF_NORMAL True True False True 0 False False 0 1 0 1 True 2 3 0 1 fill True 1 2 1 2 fill 0 False False True True 0 False False False DeSmuME Nintendo DS emulator based on work by Yopyop False http://desmume.org http://desmume.org Original author: yopyop (now inactive) Current team: Allustar amponzi ape delfare Guillaume Duhamel Normmatt Romain Vallet shash Theo Berkau thoduv Tim Seidel (Mighty Max) Damien Nozay (damdoum) Pascal Giard (evilynux) Contributors: Anthony Molinaro translator-credits DeSmuME.xpm Keyboard Config GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT False True True DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END True 6 7 False 0 0 True True Left : True GTK_RELIEF_NORMAL True 0 1 4 5 fill True True Up : True GTK_RELIEF_NORMAL True 1 2 3 4 fill True True Right : True GTK_RELIEF_NORMAL True 2 3 4 5 fill True True Y : True GTK_RELIEF_NORMAL True 4 5 4 5 fill True True X : True GTK_RELIEF_NORMAL True 5 6 3 4 fill True True A : True GTK_RELIEF_NORMAL True 6 7 4 5 fill True True Down : True GTK_RELIEF_NORMAL True 1 2 5 6 fill True True B : True GTK_RELIEF_NORMAL True 5 6 5 6 fill True True Lid : True GTK_RELIEF_NORMAL True 4 5 2 3 fill True True Select : True GTK_RELIEF_NORMAL True 3 4 2 3 fill True True L : True GTK_RELIEF_NORMAL True 0 2 1 2 fill True True R : True GTK_RELIEF_NORMAL True 5 7 1 2 fill True True Debug : True GTK_RELIEF_NORMAL True 2 3 1 2 fill True True Start : True GTK_RELIEF_NORMAL True 3 4 1 2 fill True True Boost : True GTK_RELIEF_NORMAL True 4 5 1 2 fill 0 True True GDK_KEY_RELEASE_MASK Key definition GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT True True True DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True gtk-cancel True GTK_RELIEF_NORMAL False -6 True gtk-ok True GTK_RELIEF_NORMAL False -5 0 False True GTK_PACK_END True Press a key... False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False Joystick Config GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT False True True DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END True 5 7 True 0 0 True True Y : True GTK_RELIEF_NORMAL True 4 5 3 4 fill True True X : True GTK_RELIEF_NORMAL True 5 6 2 3 fill True True A : True GTK_RELIEF_NORMAL True 6 7 3 4 fill True True B : True GTK_RELIEF_NORMAL True 5 6 4 5 fill True True Select : True GTK_RELIEF_NORMAL True 3 4 1 2 fill True True Lid : True GTK_RELIEF_NORMAL True 4 5 1 2 fill True True L : True GTK_RELIEF_NORMAL True 0 2 0 1 fill True True R : True GTK_RELIEF_NORMAL True 5 7 0 1 fill True True Debug : True GTK_RELIEF_NORMAL True 2 3 0 1 fill True True Start : True GTK_RELIEF_NORMAL True 3 4 0 1 fill True True Boost : True GTK_RELIEF_NORMAL True 4 5 0 1 fill True True Axis : True GTK_RELIEF_NORMAL True 1 2 2 3 fill True True Axis : True GTK_RELIEF_NORMAL True 1 2 4 5 fill True True Axis : True GTK_RELIEF_NORMAL True 0 1 3 4 fill True True Axis : True GTK_RELIEF_NORMAL True 2 3 3 4 fill 0 True True GDK_KEY_RELEASE_MASK Key definition GTK_WINDOW_POPUP GTK_WIN_POS_CENTER_ALWAYS True False False DeSmuME.xpm False False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False False True False 0 True GTK_BUTTONBOX_END 0 False True GTK_PACK_END True Press a button... False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 True True 3D rom GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER True False False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END 250 20 True 3D operation detected False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 10 True True desmume-0.9.11/src/gtk-glade/glade/DeSmuMe_Dtools.glade0000755000000000000000000006120712467662066021312 0ustar rootroot IO registers True GDK_WINDOW_TYPE_HINT_DIALOG True True 2 2 5 True GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 1 2 GTK_FILL True cpu : ARM9 cpu : ARM7 GTK_FILL GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-ok True -5 False GTK_PACK_END memory viewer DeSmuME.xpm GDK_WINDOW_TYPE_HINT_DIALOG True True 2 2 True True True 8 bit True True True False False True True 16 bit True True wtools_2_r8 False False 1 True True 32 bit True True wtools_2_r8 False False 2 True ARM9 cpu ARM7 cpu False False 3 True 0.000000 GoTo: GTK_JUSTIFY_RIGHT False 4 True True 10 ● 0x00000000 False 5 True True Go! True False False 6 GTK_FILL GTK_FILL True GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 True 0 0 0 0 0 0 1 2 1 2 GTK_FILL GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False GTK_PACK_END Palette Viewer DeSmuME.xpm GDK_WINDOW_TYPE_HINT_DIALOG True True 2 3 256 256 True 3 1 2 True 0.000000 Palette : GTK_JUSTIFY_RIGHT 1 2 GTK_FILL True True 0 0 15 1 2 0 1 2 3 GTK_FILL True GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False GTK_PACK_END Tile viewer False GDK_WINDOW_TYPE_HINT_DIALOG True True 3 4 True 1 2 GTK_FILL True True BMP True True True wtools_4_r16 1 2 1 2 GTK_FILL True True 256c True True True wtools_4_r16 2 3 1 2 GTK_FILL True True 16c True True True 3 4 1 2 GTK_FILL True 0.000000 Palette : GTK_JUSTIFY_RIGHT 2 3 GTK_FILL True True 0 0 15 1 2 0 1 3 4 256 256 GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK 3 2 3 True GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False GTK_PACK_END desmume-0.9.11/src/gtk-glade/callbacks_IO.cpp0000755000000000000000000002537212467662066017432 0ustar rootroot/* callbacks_IO.c - this file is part of DeSmuME * * Copyright (C) 2007-2015 DeSmuME Team * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_IO.h" #include "keyval_names.h" static u16 Cur_Keypad = 0; float ScreenCoeff_Size[2]={1.0,1.0}; float ScreenRotate=0.0; gboolean Boost=FALSE; int BoostFS=20; int saveFS; /* ***** ***** INPUT BUTTONS / KEYBOARD ***** ***** */ gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { u16 Key = lookup_key(event->keyval); guint mask; mask = GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_MOD5_MASK; // shift,ctrl, both alts if( (event->state & mask) == 0){ if (event->keyval == keyboard_cfg[KEY_BOOST-1]) { Boost = !Boost; if (Boost) { saveFS = Frameskip; Frameskip = BoostFS; } else { Frameskip = saveFS; } return 1; } if(Key){ ADD_KEY( Cur_Keypad, Key ); if(desmume_running()) update_keypad(Cur_Keypad); return 1; } } return 0; } gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { u16 Key = lookup_key(event->keyval); RM_KEY( Cur_Keypad, Key ); if(desmume_running()) update_keypad(Cur_Keypad); return 1; } /* ***** ***** SCREEN DRAWING ***** ***** */ #define RAW_W 256 #define RAW_H 192 #define RAW_OFFSET 256*192*sizeof(u16) #define MAX_SIZE 3 u32 on_screen_image32[RAW_W*RAW_H*2*MAX_SIZE*MAX_SIZE]; int inline screen_size() { int sz = ScreenCoeff_Size[0]; return RAW_W*RAW_H*2*sz*sz*sizeof(u32); } int inline offset_pixels_lower_screen() { return screen_size()/2; } void black_screen () { /* removes artifacts when resizing with scanlines */ memset(on_screen_image32,0,screen_size()); } #ifndef GTKGLEXT_AVAILABLE // they are empty if no opengl // else see gdk_gl.c / gdk_gl.h BOOL my_gl_Begin (int screen) { return FALSE; } void my_gl_End (int screen) {} void reshape (GtkWidget * widget, int screen) {} void init_GL_capabilities( int use_software_convert) {} int has_pix_col_map=0; u32 pix_col_map[0x8000]; static void init_pix_col_map() { // precalc factors int a,b,c,A,B,C,rA,rB,rC; if (has_pix_col_map) return; for (a=0; a<0x20; a++) { A=a<<10; rA=A<<9; for (b=0; b<0x20; b++) { B=b<<5; rB=B<<6; for (c=0; c<0x20; c++) { C=c; rC=C<<3; pix_col_map[A|B|C]=rA|rB|rC; } } } has_pix_col_map=1; } static void decode_screen () { int x,y, m, W,H,L,BL; u32 image[RAW_H*2][RAW_W], pix; u16 * pixel = (u16*)&GPU_screen; u32 * rgb32 = &on_screen_image32[0]; /* decode colors */ init_pix_col_map(); for (y=0; y= 0, x--, y=0, y < RAW_H, y++) LOOP(x=RAW_W-1, x >= 0, x--, y=RAW_H, y < RAW_H*2, y++) } else { H=RAW_H*2; W=RAW_W; LOOP(y=0, y < RAW_H*2, y++, x=0, x < RAW_W, x++) } } gboolean screen (GtkWidget * widget, int off) { int H,W,L; if (off==0) decode_screen(); if (ScreenRotate) { W=RAW_H; H=RAW_W; } else { H=RAW_H; W=RAW_W; } L=W*ScreenCoeff_Size[0]*sizeof(u32); off*= offset_pixels_lower_screen(); gdk_draw_rgb_32_image (widget->window, widget->style->fg_gc[widget->state],0,0, W*ScreenCoeff_Size[0], H*ScreenCoeff_Size[0], GDK_RGB_DITHER_NONE,((guchar*)on_screen_image32)+off,L); return TRUE; } #endif /* if GTKGLEXT_AVAILABLE */ /* OUTPUT SCREENS */ gboolean on_wDrawScreen_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); return screen(widget, scr); } gboolean on_wDrawScreen_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); reshape(widget, scr); return TRUE; } /* ***** ***** INPUT STYLUS / MOUSE ***** ***** */ static void resize_incremental(int i, GdkEventScroll *event) { #ifdef GTKGLEXT_AVAILABLE float zoom_inc=.125, zoom_min=0.25, zoom_max=5.0; #else float zoom_inc=1.0, zoom_min=1.0, zoom_max=3.0; #endif switch (event->direction) { case GDK_SCROLL_UP: ScreenCoeff_Size[i]=MIN(ScreenCoeff_Size[i]+zoom_inc,zoom_max); break; case GDK_SCROLL_DOWN: ScreenCoeff_Size[i]=MAX(ScreenCoeff_Size[i]-zoom_inc,zoom_min); break; case GDK_SCROLL_LEFT: case GDK_SCROLL_RIGHT: return; } resize(ScreenCoeff_Size[0],ScreenCoeff_Size[1]); } gboolean on_wDrawScreen_scroll_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); // separate zoom factors not supported yet scr = 0; resize_incremental(scr,(GdkEventScroll*)event); return TRUE; } static void set_touch_pos (int x, int y) { s32 EmuX, EmuY; x /= ScreenCoeff_Size[1]; y /= ScreenCoeff_Size[1]; EmuX = x; EmuY = y; if (ScreenRotate==90.0 || ScreenRotate==270.0) { EmuX = 256-y; EmuY = x; } if(EmuX<0) EmuX = 0; else if(EmuX>255) EmuX = 255; if(EmuY<0) EmuY = 0; else if(EmuY>192) EmuY = 192; if (ScreenInvert) { EmuX = 255-EmuX; EmuY = 192-EmuY; } NDS_setTouchPos(EmuX, EmuY); } gboolean on_wDrawScreen_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); GdkModifierType state; gint x,y; switch (event->button) { case 1: if (((scr==1) ^ ScreenInvert) && desmume_running()) { click = TRUE; gdk_window_get_pointer(widget->window, &x, &y, &state); if (state & GDK_BUTTON1_MASK) set_touch_pos(x,y); } break; case 3: break; case 2: // filter out 2x / 3x clicks if (event->type==GDK_BUTTON_PRESS) rotate(ScreenRotate + 90.0); break; } return TRUE; } gboolean on_wDrawScreen_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); if ((scr==1) ^ ScreenInvert) { if (click) NDS_releaseTouch(); click = FALSE; } return TRUE; } gboolean on_wDrawScreen_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); GdkModifierType state; gint x,y; if (((scr==1) ^ ScreenInvert) && click) { if(event->is_hint) gdk_window_get_pointer(widget->window, &x, &y, &state); else { x= (gint)event->x; y= (gint)event->y; state=(GdkModifierType)event->state; } // fprintf(stderr,"X=%d, Y=%d, S&1=%d\n", x,y,state&GDK_BUTTON1_MASK); if(state & GDK_BUTTON1_MASK) set_touch_pos(x,y); } return TRUE; } /* ***** ***** KEYBOARD CONFIG / KEY DEFINITION ***** ***** */ u16 Keypad_Temp[NB_KEYS]; guint temp_Key=0; static void init_labels() { int i; char text[50], bname[20]; GtkButton *b; for (i=0; ikeyval; current_key_label(); return TRUE; } static void ask(GtkButton*b, int key) { char text[50]; GtkDialog * dlg = (GtkDialog*)glade_xml_get_widget(xml, "wKeyDlg"); key--; /* key = bit position, start with 1 */ temp_Key = Keypad_Temp[key]; current_key_label(); switch (gtk_dialog_run(dlg)) { case GTK_RESPONSE_OK: Keypad_Temp[key]=temp_Key; snprintf(text, 50, "%s : %s",key_names[key],KEYNAME(temp_Key)); gtk_button_set_label(b,text); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: break; } gtk_widget_hide((GtkWidget*)dlg); } /* Joystick configuration / Key definition */ static void ask_joy_key(GtkButton*b, int key) { char text[50]; u16 joykey; GtkWidget * dlg = (GtkWidget*)glade_xml_get_widget(xml, "wJoyDlg"); key--; /* remove 1 to get index */ gtk_widget_show_now(dlg); /* Need to force event processing. Otherwise, popup won't show up. */ while ( gtk_events_pending() ) gtk_main_iteration(); joykey = get_set_joy_key(key); snprintf(text, 50, "%s : %d",key_names[key],joykey); gtk_button_set_label(b,text); gtk_widget_hide((GtkWidget*)dlg); } /* Bind a keyboard key to a keypad key */ void on_button_kb_key_clicked (GtkButton *b, gpointer user_data) { int key = dyn_CAST( int, user_data ); ask( b, key ); } /* Bind a joystick button to a keypad key */ void on_button_joy_key_clicked (GtkButton *b, gpointer user_data) { int key = dyn_CAST( int, user_data ); ask_joy_key( b, key ); } desmume-0.9.11/src/gtk-glade/main.cpp0000755000000000000000000003710612467662066016046 0ustar rootroot/* main.c - this file is part of DeSmuME * * Copyright (C) 2007-2015 DeSmuME Team * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks.h" #include "callbacks_IO.h" #include "dTools/callbacks_dtools.h" #include "globals.h" #include "keyval_names.h" #include "rasterize.h" #include "desmume.h" #include "firmware.h" #include "desmume_config.h" #ifdef GDB_STUB #include "../armcpu.h" #include "../gdbstub.h" #endif #ifdef GTKGLEXT_AVAILABLE #include #include "../OGLRender.h" #include "gdk_3Demu.h" #endif int glade_fps_limiter_disabled = 0; GtkWidget * pWindow; GtkWidget * pDrawingArea, * pDrawingArea2; GladeXML * xml, * xml_tools; const u16 gtk_kb_cfg[NB_KEYS] = { GDK_x, // A GDK_z, // B GDK_Shift_R, // select GDK_Return, // start GDK_Right, // Right GDK_Left, // Left GDK_Up, // Up GDK_Down, // Down GDK_w, // R GDK_q, // L GDK_s, // X GDK_a, // Y GDK_p, // DEBUG GDK_o, // BOOST GDK_BackSpace, // Lid }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDDummy, &SNDSDL, NULL }; GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize #ifdef GTKGLEXT_AVAILABLE , &gpu3Dgl #endif }; /* * * Command line handling * */ struct configured_features { int load_slot; int software_colour_convert; int opengl_2d; int engine_3d; int disable_limiter; int savetype; u16 arm9_gdb_port; u16 arm7_gdb_port; int firmware_language; const char *nds_file; }; static void init_configured_features( struct configured_features *config) { config->load_slot = 0; config->arm9_gdb_port = 0; config->arm7_gdb_port = 0; config->software_colour_convert = 0; config->opengl_2d = 0; config->engine_3d = 1; config->disable_limiter = 0; config->savetype = 0; config->nds_file = NULL; /* use the default language */ config->firmware_language = -1; } static int fill_configured_features( struct configured_features *config, int argc, char ** argv) { int good_args = 1; int print_usage = 0; int i; for ( i = 1; i < argc && good_args; i++) { if ( strcmp( argv[i], "--help") == 0) { g_print( _("USAGE: %s [OPTIONS] [nds-file]\n"), argv[0]); g_print( _("OPTIONS:\n")); g_print( _("\ --load-slot=NUM Load game saved under NUM position.\n\n")); #ifdef GTKGLEXT_AVAILABLE g_print( _("\ --soft-convert Use software colour conversion during OpenGL\n\ screen rendering. May produce better or worse\n\ frame rates depending on hardware.\n\n")); #endif g_print( _("\ --3d-engine=ENGINE Selects 3D rendering engine\n\ 0 = disabled\n\ 1 = internal desmume rasterizer (default)\n")); #ifdef GTKGLEXT_AVAILABLE g_print( _("\ 2 = gtkglext off-screen 3d opengl\n\n")); #endif g_print( _("\ --disable-limiter Disables the 60 fps limiter\n\n")); g_print( _("\ --save-type=TYPE Selects savetype:\n\ 0 = Autodetect (default)\n\ 1 = EEPROM 4kbit\n\ 2 = EEPROM 64kbit\n\ 3 = EEPROM 512kbit\n\ 4 = FRAM 256kbit\n\ 5 = FLASH 2mbit\n\ 6 = FLASH 4mbit\n\ \n")); g_print( _("\ --fwlang=LANG Set the language in the firmware, LANG as follows:\n\ 0 = Japanese\n\ 1 = English\n\ 2 = French\n\ 3 = German\n\ 4 = Italian\n\ 5 = Spanish\n\n")); #ifdef GDB_STUB g_print( _("\ --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n\ --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n\n")); #endif g_print( _("\ --help Display this message\n")); //g_print(" --sticky Enable sticky keys and stylus\n"); good_args = 0; } else if ( strncmp( argv[i], "--load-slot=", 12) == 0) { char *end_char; int slot = strtoul( &argv[i][12], &end_char, 10); if ( slot >= 0 && slot <= 10) { config->load_slot = slot; } else { g_printerr( _("I only know how to load from slots 1-10.\n")); good_args = 0; } } #ifdef GTKGLEXT_AVAILABLE else if ( strcmp( argv[i], "--opengl-2d") == 0) { // FIXME: to be implemented config->opengl_2d = 1; } else if ( strcmp( argv[i], "--soft-convert") == 0) { config->software_colour_convert = 1; } #define MAX3DEMU 2 #else #define MAX3DEMU 1 #endif else if ( strncmp( argv[i], "--3d-engine=", 12) == 0) { char *end_char; int engine = strtoul( &argv[i][12], &end_char, 10); if ( engine >= 0 && engine <= MAX3DEMU) { config->engine_3d = engine; } else { g_printerr( _("Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n")); good_args = 0; } } else if ( strncmp( argv[i], "--save-type=", 12) == 0) { char *end_char; int type = strtoul( &argv[i][12], &end_char, 10); if ( type >= 0 && type <= 6) { config->savetype = type; } else { g_printerr( _("select savetype from 0 to 6; use --help option for details\n")); good_args = 0; } } else if ( strncmp( argv[i], "--fwlang=", 9) == 0) { char *end_char; int lang = strtoul( &argv[i][9], &end_char, 10); if ( lang >= 0 && lang <= 5) { config->firmware_language = lang; } else { g_printerr( _("Firmware language must be set to a value from 0 to 5.\n")); good_args = 0; } } #ifdef GDB_STUB else if ( strncmp( argv[i], "--arm9gdb=", 10) == 0) { char *end_char; unsigned long port_num = strtoul( &argv[i][10], &end_char, 10); if ( port_num > 0 && port_num < 65536) { config->arm9_gdb_port = port_num; } else { g_print( _("ARM9 GDB stub port must be in the range 1 to 65535\n")); good_args = 0; } } else if ( strncmp( argv[i], "--arm7gdb=", 10) == 0) { char *end_char; unsigned long port_num = strtoul( &argv[i][10], &end_char, 10); if ( port_num > 0 && port_num < 65536) { config->arm7_gdb_port = port_num; } else { g_print( _("ARM7 GDB stub port must be in the range 1 to 65535\n")); good_args = 0; } } #endif else if ( strcmp( argv[i], "--disable-limiter") == 0) { config->disable_limiter = 1; } else { if ( config->nds_file == NULL) { config->nds_file = argv[i]; } else { g_print( _("NDS file (\"%s\") already set\n"), config->nds_file); good_args = 0; } } } if ( good_args) { /* * check if the configured features are consistant */ } if ( print_usage) { g_print( _("USAGE: %s [options] [nds-file]\n"), argv[0]); g_print( _("USAGE: %s --help - for help\n"), argv[0]); } return good_args; } /* ***** ***** TOOLS ***** ***** */ GList * tools_to_update = NULL; // register tool void register_Tool(VoidFunPtr fun) { tools_to_update = g_list_append(tools_to_update, (void *) fun); } void unregister_Tool(VoidFunPtr fun) { if (tools_to_update == NULL) return; tools_to_update = g_list_remove(tools_to_update, (void *) fun); } static void notify_Tool (VoidFunPtr fun, gpointer func_data) { fun(); } void notify_Tools() { g_list_foreach(tools_to_update, (GFunc)notify_Tool, NULL); } /* Return the glade directory. Note: See configure.ac for the value of GLADEUI_UNINSTALLED_DIR. */ gchar * get_ui_file (const char *filename) { gchar *path; /* looking in uninstalled (aka building) dir first */ path = g_build_filename (GLADEUI_UNINSTALLED_DIR, filename, NULL); if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) return path; g_free (path); /* looking in installed dir */ path = g_build_filename (DATADIR, filename, NULL); if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) return path; g_free (path); /* not found */ return NULL; } /* * The thread handling functions needed by the GDB stub code. */ #ifdef GDB_STUB void * createThread_gdb( void (*thread_function)( void *data), void *thread_data) { GThread *new_thread = g_thread_create( (GThreadFunc)thread_function, thread_data, TRUE, NULL); return new_thread; } void joinThread_gdb( void *thread_handle) { g_thread_join((GThread *) thread_handle); } #endif /* ***** ***** MAIN ***** ***** */ static int common_gtk_glade_main( struct configured_features *my_config) { /* the firmware settings */ struct NDS_fw_config_data fw_config; gchar *uifile; GKeyFile *keyfile; /* default the firmware settings, they may get changed later */ NDS_FillDefaultFirmwareConfigData( &fw_config); /* use any language set on the command line */ if ( my_config->firmware_language != -1) { fw_config.language = my_config->firmware_language; } desmume_savetype(my_config->savetype); #ifdef GTKGLEXT_AVAILABLE // check if you have GTHREAD when running configure script //g_thread_init(NULL); //register_gl_fun(my_gl_Begin,my_gl_End); #endif init_keyvals(); if(SDL_Init( SDL_INIT_TIMER | SDL_INIT_VIDEO) == -1) { fprintf(stderr, _("Error trying to initialize SDL: %s\n"), SDL_GetError()); return 1; } desmume_init(); /* Create the dummy firmware */ NDS_CreateDummyFirmware( &fw_config); /* * Activate the GDB stubs * This has to come after the NDS_Init (called in desmume_init) * where the cpus are set up. */ #ifdef GDB_STUB gdbstub_mutex_init(); gdbstub_handle_t arm9_gdb_stub = NULL; gdbstub_handle_t arm7_gdb_stub = NULL; if ( my_config->arm9_gdb_port > 0) { arm9_gdb_stub = createStub_gdb( my_config->arm9_gdb_port, &NDS_ARM9, &arm9_direct_memory_iface); if ( arm9_gdb_stub == NULL) { g_printerr("Failed to create ARM9 gdbstub on port %d\n", my_config->arm9_gdb_port); exit( -1); } else { activateStub_gdb( arm9_gdb_stub); } } if ( my_config->arm7_gdb_port > 0) { arm7_gdb_stub = createStub_gdb( my_config->arm7_gdb_port, &NDS_ARM7, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { g_printerr("Failed to create ARM7 gdbstub on port %d\n", my_config->arm7_gdb_port); exit( -1); } else { activateStub_gdb( arm7_gdb_stub); } } #endif /* Initialize joysticks */ if(!init_joy()) return 1; keyfile = desmume_config_read_file(gtk_kb_cfg); /* load the interface */ uifile = get_ui_file("DeSmuMe.glade"); xml = glade_xml_new(uifile, NULL, NULL); g_free (uifile); uifile = get_ui_file("DeSmuMe_Dtools.glade"); xml_tools = glade_xml_new(uifile, NULL, NULL); g_free (uifile); pWindow = glade_xml_get_widget(xml, "wMainW"); pDrawingArea = glade_xml_get_widget(xml, "wDraw_Main"); pDrawingArea2 = glade_xml_get_widget(xml, "wDraw_Sub"); { char wdgName[40]; snprintf(wdgName, 39, "savetype%d", my_config->savetype+1); GtkWidget * wdgt = glade_xml_get_widget(xml, wdgName); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (wdgt), TRUE); } /* connect the signals in the interface */ glade_xml_signal_autoconnect_StringObject(xml); glade_xml_signal_autoconnect_StringObject(xml_tools); init_GL_capabilities( my_config->software_colour_convert); /* check command line file */ if( my_config->nds_file) { if(desmume_open( my_config->nds_file) >= 0) { loadstate_slot( my_config->load_slot); desmume_resume(); enable_rom_features(); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, _("Unable to load :\n%s"), my_config->nds_file); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } } gtk_widget_show(pDrawingArea); gtk_widget_show(pDrawingArea2); { int engine = my_config->engine_3d; #ifdef GTKGLEXT_AVAILABLE if ( my_config->engine_3d==2 ) /* setup the gdk 3D emulation */ if(!init_opengl_gdk_3Demu(GDK_DRAWABLE(pWindow->window))){ fprintf( stderr, _("Failed to initialise openGL 3D emulation; " "removing 3D support\n")); engine = 0; } #endif NDS_3D_ChangeCore(engine); if(my_config->engine_3d != 0 && gpu3D == GPU3D_NULL) fprintf(stderr, _("Failed to setup 3D engine; removing 3D support\n")); } // on_menu_tileview_activate(NULL,NULL); /* setup the frame limiter and indicate if it is disabled */ glade_fps_limiter_disabled = my_config->disable_limiter; /* start event loop */ gtk_main(); desmume_free(); #ifdef GDB_STUB destroyStub_gdb( arm9_gdb_stub); arm9_gdb_stub = NULL; destroyStub_gdb( arm7_gdb_stub); arm7_gdb_stub = NULL; gdbstub_mutex_destroy(); #endif /* Unload joystick */ uninit_joy(); SDL_Quit(); desmume_config_update_keys(keyfile); desmume_config_update_joykeys(keyfile); desmume_config_dispose(keyfile); return EXIT_SUCCESS; } int main(int argc, char *argv[]) { struct configured_features my_config; // Localization bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); init_configured_features( &my_config); if (!g_thread_supported()) g_thread_init( NULL); gtk_init(&argc, &argv); #ifdef GTKGLEXT_AVAILABLE gtk_gl_init( &argc, &argv); #endif if ( !fill_configured_features( &my_config, argc, argv)) { exit(0); } return common_gtk_glade_main( &my_config); } #ifdef WIN32 int WinMain ( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { int argc = 0; char *argv[] = NULL; /* * FIXME: * Emulate the argc and argv main parameters. Could do this using * CommandLineToArgvW and then convert the wide chars to thin chars. * Or parse the wide chars directly and call common_gtk_glade_main with a * filled configuration structure. */ main( argc, argv); } #endif desmume-0.9.11/src/gtk-glade/gdk_3Demu.cpp0000755000000000000000000001535512467662066016726 0ustar rootroot/* $Id: gdk_3Demu.c,v 1.4 2007-07-15 21:50:30 evilynux Exp $ */ /* Copyright (C) 2006-2007 Ben Jaques This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef GTKGLEXT_AVAILABLE #include #include // Localization #include #define _(String) gettext (String) #include "../types.h" #include "../render3D.h" #include "../OGLRender.h" #include "gdk_3Demu.h" /* * The GDK 3D emulation. * This uses the OpenGL Collector plugin, using gdkGLext for the platform * specific helper functions. */ static GdkPixmap *target_pixmap; static GdkGLContext *glcontext = NULL; static GdkGLDrawable *gldrawable; #if 0 /* not used */ static void print_gl_config_attrib (GdkGLConfig *glconfig, const gchar *attrib_str, int attrib, gboolean is_boolean) { int value; g_print ("%s = ", attrib_str); if (gdk_gl_config_get_attrib (glconfig, attrib, &value)) { if (is_boolean) g_print ("%s\n", value == TRUE ? "TRUE" : "FALSE"); else g_print ("%d\n", value); } else g_print (_("*** Cannot get %s attribute value\n"), attrib_str); } static void examine_gl_config_attrib (GdkGLConfig *glconfig) { g_print ("\nOpenGL visual configurations :\n\n"); g_print ("gdk_gl_config_is_rgba (glconfig) = %s\n", gdk_gl_config_is_rgba (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_is_double_buffered (glconfig) = %s\n", gdk_gl_config_is_double_buffered (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_is_stereo (glconfig) = %s\n", gdk_gl_config_is_stereo (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_alpha (glconfig) = %s\n", gdk_gl_config_has_alpha (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_depth_buffer (glconfig) = %s\n", gdk_gl_config_has_depth_buffer (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_stencil_buffer (glconfig) = %s\n", gdk_gl_config_has_stencil_buffer (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_accum_buffer (glconfig) = %s\n", gdk_gl_config_has_accum_buffer (glconfig) ? "TRUE" : "FALSE"); g_print ("\n"); print_gl_config_attrib (glconfig, "GDK_GL_USE_GL", GDK_GL_USE_GL, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_BUFFER_SIZE", GDK_GL_BUFFER_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_LEVEL", GDK_GL_LEVEL, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_RGBA", GDK_GL_RGBA, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_DOUBLEBUFFER", GDK_GL_DOUBLEBUFFER, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_STEREO", GDK_GL_STEREO, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_AUX_BUFFERS", GDK_GL_AUX_BUFFERS, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_RED_SIZE", GDK_GL_RED_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_GREEN_SIZE", GDK_GL_GREEN_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_BLUE_SIZE", GDK_GL_BLUE_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ALPHA_SIZE", GDK_GL_ALPHA_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_DEPTH_SIZE", GDK_GL_DEPTH_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_STENCIL_SIZE", GDK_GL_STENCIL_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_RED_SIZE", GDK_GL_ACCUM_RED_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_GREEN_SIZE", GDK_GL_ACCUM_GREEN_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_BLUE_SIZE", GDK_GL_ACCUM_BLUE_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_ALPHA_SIZE", GDK_GL_ACCUM_ALPHA_SIZE, FALSE); g_print ("\n"); } #endif static bool begin_opengl_region_gdk_3d( void) { bool failed = false; gdk_error_trap_push(); failed = !gdk_gl_drawable_gl_begin(gldrawable, glcontext); gdk_flush(); failed = failed | gdk_error_trap_pop(); if (failed) return false; return true; } static void end_opengl_region_gdk_3d( void) { gdk_gl_drawable_gl_end (gldrawable); } static bool initialise_gdk_3d( void) { /* this does nothing */ return true; } int init_opengl_gdk_3Demu( GdkDrawable * drawable) { GdkGLConfig *glconfig; /* create the off screen pixmap */ target_pixmap = gdk_pixmap_new ( drawable, 256, 192, -1); if ( target_pixmap == NULL) { g_print (_("*** Failed to create pixmap.\n")); return 0; } glconfig = gdk_gl_config_new_by_mode ((GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_STENCIL | GDK_GL_MODE_SINGLE)); if (glconfig == NULL) { g_print (_("*** No appropriate OpenGL-capable visual found.\n")); return 0; } /* * Set OpenGL-capability to the pixmap */ gldrawable = GDK_GL_DRAWABLE (gdk_pixmap_set_gl_capability (target_pixmap, glconfig, NULL)); if ( gldrawable == NULL) { g_print (_("Failed to create the GdkGLPixmap\n")); return 0; } glcontext = gdk_gl_context_new (gldrawable, NULL, FALSE, GDK_GL_RGBA_TYPE); if (glcontext == NULL) { g_print (_("Connot create the OpenGL rendering context\n")); return 0; } oglrender_init = initialise_gdk_3d; oglrender_beginOpenGL = begin_opengl_region_gdk_3d; oglrender_endOpenGL = end_opengl_region_gdk_3d; return 1; } #endif desmume-0.9.11/src/gtk-glade/desmume-glade.desktop0000755000000000000000000000027512467662066020517 0ustar rootroot[Desktop Entry] Version=1.0 Type=Application Name=DeSmuME (Gtk-Glade) Comment=Nintento DS emulator TryExec=desmume-glade Exec=desmume-glade Icon=DeSmuME Categories=GNOME;GTK;Game;Emulator; desmume-0.9.11/src/gtk-glade/desmume.h0000755000000000000000000000265612467662066016230 0ustar rootroot/* desmume.h - this file is part of DeSmuME * * Copyright (C) 2007-2015 DeSmuME Team * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __DESMUME_H__ #define __DESMUME_H__ #include "globals.h" #define FPS_LIMITER_FRAME_PERIOD 5 extern SDL_sem *glade_fps_limiter_semaphore; extern int glade_fps_limiter_disabled; extern void desmume_init( void); extern void desmume_free( void); extern int desmume_open(const char *filename); extern void desmume_savetype(int type); extern void desmume_pause( void); extern void desmume_resume( void); extern void desmume_reset( void); extern void desmume_toggle( void); //extern BOOL desmume_running( void); INLINE BOOL desmume_running(void) { return execute; } extern INLINE void desmume_cycle( void); #endif /*__DESMUME_H__*/ desmume-0.9.11/src/gtk-glade/gdk_3Demu.h0000755000000000000000000000206012467662066016360 0ustar rootroot/* $Id: gdk_3Demu.h,v 1.1 2007-04-21 19:45:07 evilynux Exp $ */ /* Copyright (C) 2006-2007 Ben Jaques This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef GTKGLEXT_AVAILABLE /* * The GDK 3D emulation. * This uses the OpenGL Collector plugin, using gdkGLext for the platform * specific helper functions. */ int init_opengl_gdk_3Demu( GdkDrawable * drawable); #endif desmume-0.9.11/src/gtk-glade/glade-xml.cpp0000755000000000000000000001174612467662066016776 0ustar rootroot/* -*- Mode: C; c-basic-offset: 4 -*- * libglade - a library for building interfaces from XML files at runtime * Copyright (C) 1998-2002 James Henstridge * * glade-xml.c: implementation of core public interface functions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "globals.h" #include #include #include #include typedef struct _GladeXMLPrivate nopriv_GladeXMLPrivate; struct _GladeXMLPrivate { GladeInterface *tree; /* the tree for this GladeXML */ GtkTooltips *tooltips; /* if not NULL, holds all tooltip info */ GHashTable *name_hash; GHashTable *signals; GtkWindow *toplevel; GtkAccelGroup *accel_group; GtkWidget *focus_widget; GtkWidget *default_widget; GList *deferred_props; }; typedef struct _GladeSignalData GladeSignalData; struct _GladeSignalData { GObject *signal_object; char *signal_name; char *connect_object; /* or NULL if there is none */ gboolean signal_after; }; static void autoconnect_foreach_StringObject(const char *signal_handler, GList * signals, GModule * allsymbols) { GCallback func; if (!g_module_symbol(allsymbols, signal_handler, (void **) &func)) g_warning(_("could not find signal handler '%s'."), signal_handler); else for (; signals != NULL; signals = signals->next) { GladeSignalData *data = (GladeSignalData *) signals->data; if (data->connect_object) { GladeXML *self = glade_get_widget_tree(GTK_WIDGET(data->signal_object)); char format[] = "%_\0\0"; if (sscanf(data->connect_object, "%%%c:", &format[1])) { // this should solve 64bit problems but now memory gets // (it should get) deallocated when program is destroyed gpointer argument = g_malloc(sizeof(callback_arg)); sscanf(data->connect_object + 3, format, argument); // printf ("%f \n",obj); if (data->signal_after) g_signal_connect_after(data->signal_object, data->signal_name, func, argument); else g_signal_connect(data->signal_object, data->signal_name, func, argument); } else { GObject *other = (GObject *) g_hash_table_lookup( self->priv->name_hash, data->connect_object); g_signal_connect_object(data->signal_object, data->signal_name, func, other, (GConnectFlags) ((data->signal_after ? G_CONNECT_AFTER : 0) | G_CONNECT_SWAPPED)); } } else { /* the signal_data argument is just a string, but may * be helpful for someone */ if (data->signal_after) g_signal_connect_after(data->signal_object, data->signal_name, func, NULL); else g_signal_connect(data->signal_object, data->signal_name, func, NULL); } } } /** * glade_xml_signal_autoconnect_StringObject: * @self: the GladeXML object. * * This function is a variation of glade_xml_signal_connect. It uses * gmodule's introspective features (by openning the module %NULL) to * look at the application's symbol table. From here it tries to match * the signal handler names given in the interface description with * symbols in the application and connects the signals. * * Note that this function will not work correctly if gmodule is not * supported on the platform. */ void glade_xml_signal_autoconnect_StringObject(GladeXML * self) { GModule *allsymbols; nopriv_GladeXMLPrivate *priv; g_return_if_fail(self != NULL); if (!g_module_supported()) g_error("glade_xml_signal_autoconnect requires working gmodule"); /* get a handle on the main executable -- use this to find symbols */ allsymbols = g_module_open(NULL, (GModuleFlags) 0); priv = (nopriv_GladeXMLPrivate *) self->priv; g_hash_table_foreach(priv->signals, (GHFunc) autoconnect_foreach_StringObject, allsymbols); } desmume-0.9.11/src/gtk-glade/keyval_names.h0000755000000000000000000000162612467662066017243 0ustar rootroot/* keyval_names.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ const char * KEYNAME(int k); void init_keyvals(); desmume-0.9.11/src/gtk-glade/keyval_names.cpp0000755000000000000000000014325112467662066017577 0ustar rootroot/* keyval_names.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "keyval_names.h" /* see */ const char * unknown="(unknown)"; const char * KEYVAL_NAMES[0x10000]; const char * KEYNAME(int k) { const char * s = unknown; s = KEYVAL_NAMES[k & 0xFFFF]; return s; } static void KEYVAL(int k, const char * name) { if (KEYVAL_NAMES[k] == unknown) KEYVAL_NAMES[k] = name; } void init_keyvals() { int i; for (i=0; i<0x10000; i++) KEYVAL_NAMES[i]=unknown; KEYVAL ( 0x0020 , "space" ); KEYVAL ( 0x0021 , "exclam" ); KEYVAL ( 0x0022 , "quotedbl" ); KEYVAL ( 0x0023 , "numbersign" ); KEYVAL ( 0x0024 , "dollar" ); KEYVAL ( 0x0025 , "percent" ); KEYVAL ( 0x0026 , "ampersand" ); KEYVAL ( 0x0027 , "apostrophe" ); KEYVAL ( 0x0027 , "quoteright" ); KEYVAL ( 0x0028 , "parenleft" ); KEYVAL ( 0x0029 , "parenright" ); KEYVAL ( 0x002a , "asterisk" ); KEYVAL ( 0x002b , "plus" ); KEYVAL ( 0x002c , "comma" ); KEYVAL ( 0x002d , "minus" ); KEYVAL ( 0x002e , "period" ); KEYVAL ( 0x002f , "slash" ); KEYVAL ( 0x0030 , "0" ); KEYVAL ( 0x0031 , "1" ); KEYVAL ( 0x0032 , "2" ); KEYVAL ( 0x0033 , "3" ); KEYVAL ( 0x0034 , "4" ); KEYVAL ( 0x0035 , "5" ); KEYVAL ( 0x0036 , "6" ); KEYVAL ( 0x0037 , "7" ); KEYVAL ( 0x0038 , "8" ); KEYVAL ( 0x0039 , "9" ); KEYVAL ( 0x003a , "colon" ); KEYVAL ( 0x003b , "semicolon" ); KEYVAL ( 0x003c , "less" ); KEYVAL ( 0x003d , "equal" ); KEYVAL ( 0x003e , "greater" ); KEYVAL ( 0x003f , "question" ); KEYVAL ( 0x0040 , "at" ); KEYVAL ( 0x0041 , "A" ); KEYVAL ( 0x0042 , "B" ); KEYVAL ( 0x0043 , "C" ); KEYVAL ( 0x0044 , "D" ); KEYVAL ( 0x0045 , "E" ); KEYVAL ( 0x0046 , "F" ); KEYVAL ( 0x0047 , "G" ); KEYVAL ( 0x0048 , "H" ); KEYVAL ( 0x0049 , "I" ); KEYVAL ( 0x004a , "J" ); KEYVAL ( 0x004b , "K" ); KEYVAL ( 0x004c , "L" ); KEYVAL ( 0x004d , "M" ); KEYVAL ( 0x004e , "N" ); KEYVAL ( 0x004f , "O" ); KEYVAL ( 0x0050 , "P" ); KEYVAL ( 0x0051 , "Q" ); KEYVAL ( 0x0052 , "R" ); KEYVAL ( 0x0053 , "S" ); KEYVAL ( 0x0054 , "T" ); KEYVAL ( 0x0055 , "U" ); KEYVAL ( 0x0056 , "V" ); KEYVAL ( 0x0057 , "W" ); KEYVAL ( 0x0058 , "X" ); KEYVAL ( 0x0059 , "Y" ); KEYVAL ( 0x005a , "Z" ); KEYVAL ( 0x005b , "bracketleft" ); KEYVAL ( 0x005c , "backslash" ); KEYVAL ( 0x005d , "bracketright" ); KEYVAL ( 0x005e , "asciicircum" ); KEYVAL ( 0x005f , "underscore" ); KEYVAL ( 0x0060 , "grave" ); KEYVAL ( 0x0060 , "quoteleft" ); KEYVAL ( 0x0061 , "a" ); KEYVAL ( 0x0062 , "b" ); KEYVAL ( 0x0063 , "c" ); KEYVAL ( 0x0064 , "d" ); KEYVAL ( 0x0065 , "e" ); KEYVAL ( 0x0066 , "f" ); KEYVAL ( 0x0067 , "g" ); KEYVAL ( 0x0068 , "h" ); KEYVAL ( 0x0069 , "i" ); KEYVAL ( 0x006a , "j" ); KEYVAL ( 0x006b , "k" ); KEYVAL ( 0x006c , "l" ); KEYVAL ( 0x006d , "m" ); KEYVAL ( 0x006e , "n" ); KEYVAL ( 0x006f , "o" ); KEYVAL ( 0x0070 , "p" ); KEYVAL ( 0x0071 , "q" ); KEYVAL ( 0x0072 , "r" ); KEYVAL ( 0x0073 , "s" ); KEYVAL ( 0x0074 , "t" ); KEYVAL ( 0x0075 , "u" ); KEYVAL ( 0x0076 , "v" ); KEYVAL ( 0x0077 , "w" ); KEYVAL ( 0x0078 , "x" ); KEYVAL ( 0x0079 , "y" ); KEYVAL ( 0x007a , "z" ); KEYVAL ( 0x007b , "braceleft" ); KEYVAL ( 0x007c , "bar" ); KEYVAL ( 0x007d , "braceright" ); KEYVAL ( 0x007e , "asciitilde" ); KEYVAL ( 0x00a0 , "nobreakspace" ); KEYVAL ( 0x00a1 , "exclamdown" ); KEYVAL ( 0x00a2 , "cent" ); KEYVAL ( 0x00a3 , "sterling" ); KEYVAL ( 0x00a4 , "currency" ); KEYVAL ( 0x00a5 , "yen" ); KEYVAL ( 0x00a6 , "brokenbar" ); KEYVAL ( 0x00a7 , "section" ); KEYVAL ( 0x00a8 , "diaeresis" ); KEYVAL ( 0x00a9 , "copyright" ); KEYVAL ( 0x00aa , "ordfeminine" ); KEYVAL ( 0x00ab , "guillemotleft" ); KEYVAL ( 0x00ac , "notsign" ); KEYVAL ( 0x00ad , "hyphen" ); KEYVAL ( 0x00ae , "registered" ); KEYVAL ( 0x00af , "macron" ); KEYVAL ( 0x00b0 , "degree" ); KEYVAL ( 0x00b1 , "plusminus" ); KEYVAL ( 0x00b2 , "twosuperior" ); KEYVAL ( 0x00b3 , "threesuperior" ); KEYVAL ( 0x00b4 , "acute" ); KEYVAL ( 0x00b5 , "mu" ); KEYVAL ( 0x00b6 , "paragraph" ); KEYVAL ( 0x00b7 , "periodcentered" ); KEYVAL ( 0x00b8 , "cedilla" ); KEYVAL ( 0x00b9 , "onesuperior" ); KEYVAL ( 0x00ba , "masculine" ); KEYVAL ( 0x00bb , "guillemotright" ); KEYVAL ( 0x00bc , "onequarter" ); KEYVAL ( 0x00bd , "onehalf" ); KEYVAL ( 0x00be , "threequarters" ); KEYVAL ( 0x00bf , "questiondown" ); KEYVAL ( 0x00c0 , "Agrave" ); KEYVAL ( 0x00c1 , "Aacute" ); KEYVAL ( 0x00c2 , "Acircumflex" ); KEYVAL ( 0x00c3 , "Atilde" ); KEYVAL ( 0x00c4 , "Adiaeresis" ); KEYVAL ( 0x00c5 , "Aring" ); KEYVAL ( 0x00c6 , "AE" ); KEYVAL ( 0x00c7 , "Ccedilla" ); KEYVAL ( 0x00c8 , "Egrave" ); KEYVAL ( 0x00c9 , "Eacute" ); KEYVAL ( 0x00ca , "Ecircumflex" ); KEYVAL ( 0x00cb , "Ediaeresis" ); KEYVAL ( 0x00cc , "Igrave" ); KEYVAL ( 0x00cd , "Iacute" ); KEYVAL ( 0x00ce , "Icircumflex" ); KEYVAL ( 0x00cf , "Idiaeresis" ); KEYVAL ( 0x00d0 , "ETH" ); KEYVAL ( 0x00d0 , "Eth" ); KEYVAL ( 0x00d1 , "Ntilde" ); KEYVAL ( 0x00d2 , "Ograve" ); KEYVAL ( 0x00d3 , "Oacute" ); KEYVAL ( 0x00d4 , "Ocircumflex" ); KEYVAL ( 0x00d5 , "Otilde" ); KEYVAL ( 0x00d6 , "Odiaeresis" ); KEYVAL ( 0x00d7 , "multiply" ); KEYVAL ( 0x00d8 , "Ooblique" ); KEYVAL ( 0x00d9 , "Ugrave" ); KEYVAL ( 0x00da , "Uacute" ); KEYVAL ( 0x00db , "Ucircumflex" ); KEYVAL ( 0x00dc , "Udiaeresis" ); KEYVAL ( 0x00dd , "Yacute" ); KEYVAL ( 0x00de , "THORN" ); KEYVAL ( 0x00de , "Thorn" ); KEYVAL ( 0x00df , "ssharp" ); KEYVAL ( 0x00e0 , "agrave" ); KEYVAL ( 0x00e1 , "aacute" ); KEYVAL ( 0x00e2 , "acircumflex" ); KEYVAL ( 0x00e3 , "atilde" ); KEYVAL ( 0x00e4 , "adiaeresis" ); KEYVAL ( 0x00e5 , "aring" ); KEYVAL ( 0x00e6 , "ae" ); KEYVAL ( 0x00e7 , "ccedilla" ); KEYVAL ( 0x00e8 , "egrave" ); KEYVAL ( 0x00e9 , "eacute" ); KEYVAL ( 0x00ea , "ecircumflex" ); KEYVAL ( 0x00eb , "ediaeresis" ); KEYVAL ( 0x00ec , "igrave" ); KEYVAL ( 0x00ed , "iacute" ); KEYVAL ( 0x00ee , "icircumflex" ); KEYVAL ( 0x00ef , "idiaeresis" ); KEYVAL ( 0x00f0 , "eth" ); KEYVAL ( 0x00f1 , "ntilde" ); KEYVAL ( 0x00f2 , "ograve" ); KEYVAL ( 0x00f3 , "oacute" ); KEYVAL ( 0x00f4 , "ocircumflex" ); KEYVAL ( 0x00f5 , "otilde" ); KEYVAL ( 0x00f6 , "odiaeresis" ); KEYVAL ( 0x00f7 , "division" ); KEYVAL ( 0x00f8 , "oslash" ); KEYVAL ( 0x00f9 , "ugrave" ); KEYVAL ( 0x00fa , "uacute" ); KEYVAL ( 0x00fb , "ucircumflex" ); KEYVAL ( 0x00fc , "udiaeresis" ); KEYVAL ( 0x00fd , "yacute" ); KEYVAL ( 0x00fe , "thorn" ); KEYVAL ( 0x00ff , "ydiaeresis" ); KEYVAL ( 0x01a1 , "Aogonek" ); KEYVAL ( 0x01a2 , "breve" ); KEYVAL ( 0x01a3 , "Lstroke" ); KEYVAL ( 0x01a5 , "Lcaron" ); KEYVAL ( 0x01a6 , "Sacute" ); KEYVAL ( 0x01a9 , "Scaron" ); KEYVAL ( 0x01aa , "Scedilla" ); KEYVAL ( 0x01ab , "Tcaron" ); KEYVAL ( 0x01ac , "Zacute" ); KEYVAL ( 0x01ae , "Zcaron" ); KEYVAL ( 0x01af , "Zabovedot" ); KEYVAL ( 0x01b1 , "aogonek" ); KEYVAL ( 0x01b2 , "ogonek" ); KEYVAL ( 0x01b3 , "lstroke" ); KEYVAL ( 0x01b5 , "lcaron" ); KEYVAL ( 0x01b6 , "sacute" ); KEYVAL ( 0x01b7 , "caron" ); KEYVAL ( 0x01b9 , "scaron" ); KEYVAL ( 0x01ba , "scedilla" ); KEYVAL ( 0x01bb , "tcaron" ); KEYVAL ( 0x01bc , "zacute" ); KEYVAL ( 0x01bd , "doubleacute" ); KEYVAL ( 0x01be , "zcaron" ); KEYVAL ( 0x01bf , "zabovedot" ); KEYVAL ( 0x01c0 , "Racute" ); KEYVAL ( 0x01c3 , "Abreve" ); KEYVAL ( 0x01c5 , "Lacute" ); KEYVAL ( 0x01c6 , "Cacute" ); KEYVAL ( 0x01c8 , "Ccaron" ); KEYVAL ( 0x01ca , "Eogonek" ); KEYVAL ( 0x01cc , "Ecaron" ); KEYVAL ( 0x01cf , "Dcaron" ); KEYVAL ( 0x01d0 , "Dstroke" ); KEYVAL ( 0x01d1 , "Nacute" ); KEYVAL ( 0x01d2 , "Ncaron" ); KEYVAL ( 0x01d5 , "Odoubleacute" ); KEYVAL ( 0x01d8 , "Rcaron" ); KEYVAL ( 0x01d9 , "Uring" ); KEYVAL ( 0x01db , "Udoubleacute" ); KEYVAL ( 0x01de , "Tcedilla" ); KEYVAL ( 0x01e0 , "racute" ); KEYVAL ( 0x01e3 , "abreve" ); KEYVAL ( 0x01e5 , "lacute" ); KEYVAL ( 0x01e6 , "cacute" ); KEYVAL ( 0x01e8 , "ccaron" ); KEYVAL ( 0x01ea , "eogonek" ); KEYVAL ( 0x01ec , "ecaron" ); KEYVAL ( 0x01ef , "dcaron" ); KEYVAL ( 0x01f0 , "dstroke" ); KEYVAL ( 0x01f1 , "nacute" ); KEYVAL ( 0x01f2 , "ncaron" ); KEYVAL ( 0x01f5 , "odoubleacute" ); KEYVAL ( 0x01f8 , "rcaron" ); KEYVAL ( 0x01f9 , "uring" ); KEYVAL ( 0x01fb , "udoubleacute" ); KEYVAL ( 0x01fe , "tcedilla" ); KEYVAL ( 0x01ff , "abovedot" ); KEYVAL ( 0x02a1 , "Hstroke" ); KEYVAL ( 0x02a6 , "Hcircumflex" ); KEYVAL ( 0x02a9 , "Iabovedot" ); KEYVAL ( 0x02ab , "Gbreve" ); KEYVAL ( 0x02ac , "Jcircumflex" ); KEYVAL ( 0x02b1 , "hstroke" ); KEYVAL ( 0x02b6 , "hcircumflex" ); KEYVAL ( 0x02b9 , "idotless" ); KEYVAL ( 0x02bb , "gbreve" ); KEYVAL ( 0x02bc , "jcircumflex" ); KEYVAL ( 0x02c5 , "Cabovedot" ); KEYVAL ( 0x02c6 , "Ccircumflex" ); KEYVAL ( 0x02d5 , "Gabovedot" ); KEYVAL ( 0x02d8 , "Gcircumflex" ); KEYVAL ( 0x02dd , "Ubreve" ); KEYVAL ( 0x02de , "Scircumflex" ); KEYVAL ( 0x02e5 , "cabovedot" ); KEYVAL ( 0x02e6 , "ccircumflex" ); KEYVAL ( 0x02f5 , "gabovedot" ); KEYVAL ( 0x02f8 , "gcircumflex" ); KEYVAL ( 0x02fd , "ubreve" ); KEYVAL ( 0x02fe , "scircumflex" ); KEYVAL ( 0x03a2 , "kappa" ); KEYVAL ( 0x03a2 , "kra" ); KEYVAL ( 0x03a3 , "Rcedilla" ); KEYVAL ( 0x03a5 , "Itilde" ); KEYVAL ( 0x03a6 , "Lcedilla" ); KEYVAL ( 0x03aa , "Emacron" ); KEYVAL ( 0x03ab , "Gcedilla" ); KEYVAL ( 0x03ac , "Tslash" ); KEYVAL ( 0x03b3 , "rcedilla" ); KEYVAL ( 0x03b5 , "itilde" ); KEYVAL ( 0x03b6 , "lcedilla" ); KEYVAL ( 0x03ba , "emacron" ); KEYVAL ( 0x03bb , "gcedilla" ); KEYVAL ( 0x03bc , "tslash" ); KEYVAL ( 0x03bd , "ENG" ); KEYVAL ( 0x03bf , "eng" ); KEYVAL ( 0x03c0 , "Amacron" ); KEYVAL ( 0x03c7 , "Iogonek" ); KEYVAL ( 0x03cc , "Eabovedot" ); KEYVAL ( 0x03cf , "Imacron" ); KEYVAL ( 0x03d1 , "Ncedilla" ); KEYVAL ( 0x03d2 , "Omacron" ); KEYVAL ( 0x03d3 , "Kcedilla" ); KEYVAL ( 0x03d9 , "Uogonek" ); KEYVAL ( 0x03dd , "Utilde" ); KEYVAL ( 0x03de , "Umacron" ); KEYVAL ( 0x03e0 , "amacron" ); KEYVAL ( 0x03e7 , "iogonek" ); KEYVAL ( 0x03ec , "eabovedot" ); KEYVAL ( 0x03ef , "imacron" ); KEYVAL ( 0x03f1 , "ncedilla" ); KEYVAL ( 0x03f2 , "omacron" ); KEYVAL ( 0x03f3 , "kcedilla" ); KEYVAL ( 0x03f9 , "uogonek" ); KEYVAL ( 0x03fd , "utilde" ); KEYVAL ( 0x03fe , "umacron" ); KEYVAL ( 0x047e , "overline" ); KEYVAL ( 0x04a1 , "kana_fullstop" ); KEYVAL ( 0x04a2 , "kana_openingbracket" ); KEYVAL ( 0x04a3 , "kana_closingbracket" ); KEYVAL ( 0x04a4 , "kana_comma" ); KEYVAL ( 0x04a5 , "kana_conjunctive" ); KEYVAL ( 0x04a5 , "kana_middledot" ); KEYVAL ( 0x04a6 , "kana_WO" ); KEYVAL ( 0x04a7 , "kana_a" ); KEYVAL ( 0x04a8 , "kana_i" ); KEYVAL ( 0x04a9 , "kana_u" ); KEYVAL ( 0x04aa , "kana_e" ); KEYVAL ( 0x04ab , "kana_o" ); KEYVAL ( 0x04ac , "kana_ya" ); KEYVAL ( 0x04ad , "kana_yu" ); KEYVAL ( 0x04ae , "kana_yo" ); KEYVAL ( 0x04af , "kana_tsu" ); KEYVAL ( 0x04af , "kana_tu" ); KEYVAL ( 0x04b0 , "prolongedsound" ); KEYVAL ( 0x04b1 , "kana_A" ); KEYVAL ( 0x04b2 , "kana_I" ); KEYVAL ( 0x04b3 , "kana_U" ); KEYVAL ( 0x04b4 , "kana_E" ); KEYVAL ( 0x04b5 , "kana_O" ); KEYVAL ( 0x04b6 , "kana_KA" ); KEYVAL ( 0x04b7 , "kana_KI" ); KEYVAL ( 0x04b8 , "kana_KU" ); KEYVAL ( 0x04b9 , "kana_KE" ); KEYVAL ( 0x04ba , "kana_KO" ); KEYVAL ( 0x04bb , "kana_SA" ); KEYVAL ( 0x04bc , "kana_SHI" ); KEYVAL ( 0x04bd , "kana_SU" ); KEYVAL ( 0x04be , "kana_SE" ); KEYVAL ( 0x04bf , "kana_SO" ); KEYVAL ( 0x04c0 , "kana_TA" ); KEYVAL ( 0x04c1 , "kana_CHI" ); KEYVAL ( 0x04c1 , "kana_TI" ); KEYVAL ( 0x04c2 , "kana_TSU" ); KEYVAL ( 0x04c2 , "kana_TU" ); KEYVAL ( 0x04c3 , "kana_TE" ); KEYVAL ( 0x04c4 , "kana_TO" ); KEYVAL ( 0x04c5 , "kana_NA" ); KEYVAL ( 0x04c6 , "kana_NI" ); KEYVAL ( 0x04c7 , "kana_NU" ); KEYVAL ( 0x04c8 , "kana_NE" ); KEYVAL ( 0x04c9 , "kana_NO" ); KEYVAL ( 0x04ca , "kana_HA" ); KEYVAL ( 0x04cb , "kana_HI" ); KEYVAL ( 0x04cc , "kana_FU" ); KEYVAL ( 0x04cc , "kana_HU" ); KEYVAL ( 0x04cd , "kana_HE" ); KEYVAL ( 0x04ce , "kana_HO" ); KEYVAL ( 0x04cf , "kana_MA" ); KEYVAL ( 0x04d0 , "kana_MI" ); KEYVAL ( 0x04d1 , "kana_MU" ); KEYVAL ( 0x04d2 , "kana_ME" ); KEYVAL ( 0x04d3 , "kana_MO" ); KEYVAL ( 0x04d4 , "kana_YA" ); KEYVAL ( 0x04d5 , "kana_YU" ); KEYVAL ( 0x04d6 , "kana_YO" ); KEYVAL ( 0x04d7 , "kana_RA" ); KEYVAL ( 0x04d8 , "kana_RI" ); KEYVAL ( 0x04d9 , "kana_RU" ); KEYVAL ( 0x04da , "kana_RE" ); KEYVAL ( 0x04db , "kana_RO" ); KEYVAL ( 0x04dc , "kana_WA" ); KEYVAL ( 0x04dd , "kana_N" ); KEYVAL ( 0x04de , "voicedsound" ); KEYVAL ( 0x04df , "semivoicedsound" ); KEYVAL ( 0x05ac , "Arabic_comma" ); KEYVAL ( 0x05bb , "Arabic_semicolon" ); KEYVAL ( 0x05bf , "Arabic_question_mark" ); KEYVAL ( 0x05c1 , "Arabic_hamza" ); KEYVAL ( 0x05c2 , "Arabic_maddaonalef" ); KEYVAL ( 0x05c3 , "Arabic_hamzaonalef" ); KEYVAL ( 0x05c4 , "Arabic_hamzaonwaw" ); KEYVAL ( 0x05c5 , "Arabic_hamzaunderalef" ); KEYVAL ( 0x05c6 , "Arabic_hamzaonyeh" ); KEYVAL ( 0x05c7 , "Arabic_alef" ); KEYVAL ( 0x05c8 , "Arabic_beh" ); KEYVAL ( 0x05c9 , "Arabic_tehmarbuta" ); KEYVAL ( 0x05ca , "Arabic_teh" ); KEYVAL ( 0x05cb , "Arabic_theh" ); KEYVAL ( 0x05cc , "Arabic_jeem" ); KEYVAL ( 0x05cd , "Arabic_hah" ); KEYVAL ( 0x05ce , "Arabic_khah" ); KEYVAL ( 0x05cf , "Arabic_dal" ); KEYVAL ( 0x05d0 , "Arabic_thal" ); KEYVAL ( 0x05d1 , "Arabic_ra" ); KEYVAL ( 0x05d2 , "Arabic_zain" ); KEYVAL ( 0x05d3 , "Arabic_seen" ); KEYVAL ( 0x05d4 , "Arabic_sheen" ); KEYVAL ( 0x05d5 , "Arabic_sad" ); KEYVAL ( 0x05d6 , "Arabic_dad" ); KEYVAL ( 0x05d7 , "Arabic_tah" ); KEYVAL ( 0x05d8 , "Arabic_zah" ); KEYVAL ( 0x05d9 , "Arabic_ain" ); KEYVAL ( 0x05da , "Arabic_ghain" ); KEYVAL ( 0x05e0 , "Arabic_tatweel" ); KEYVAL ( 0x05e1 , "Arabic_feh" ); KEYVAL ( 0x05e2 , "Arabic_qaf" ); KEYVAL ( 0x05e3 , "Arabic_kaf" ); KEYVAL ( 0x05e4 , "Arabic_lam" ); KEYVAL ( 0x05e5 , "Arabic_meem" ); KEYVAL ( 0x05e6 , "Arabic_noon" ); KEYVAL ( 0x05e7 , "Arabic_ha" ); KEYVAL ( 0x05e7 , "Arabic_heh" ); KEYVAL ( 0x05e8 , "Arabic_waw" ); KEYVAL ( 0x05e9 , "Arabic_alefmaksura" ); KEYVAL ( 0x05ea , "Arabic_yeh" ); KEYVAL ( 0x05eb , "Arabic_fathatan" ); KEYVAL ( 0x05ec , "Arabic_dammatan" ); KEYVAL ( 0x05ed , "Arabic_kasratan" ); KEYVAL ( 0x05ee , "Arabic_fatha" ); KEYVAL ( 0x05ef , "Arabic_damma" ); KEYVAL ( 0x05f0 , "Arabic_kasra" ); KEYVAL ( 0x05f1 , "Arabic_shadda" ); KEYVAL ( 0x05f2 , "Arabic_sukun" ); KEYVAL ( 0x06a1 , "Serbian_dje" ); KEYVAL ( 0x06a2 , "Macedonia_gje" ); KEYVAL ( 0x06a3 , "Cyrillic_io" ); KEYVAL ( 0x06a4 , "Ukrainian_ie" ); KEYVAL ( 0x06a4 , "Ukranian_je" ); KEYVAL ( 0x06a5 , "Macedonia_dse" ); KEYVAL ( 0x06a6 , "Ukrainian_i" ); KEYVAL ( 0x06a6 , "Ukranian_i" ); KEYVAL ( 0x06a7 , "Ukrainian_yi" ); KEYVAL ( 0x06a7 , "Ukranian_yi" ); KEYVAL ( 0x06a8 , "Cyrillic_je" ); KEYVAL ( 0x06a8 , "Serbian_je" ); KEYVAL ( 0x06a9 , "Cyrillic_lje" ); KEYVAL ( 0x06a9 , "Serbian_lje" ); KEYVAL ( 0x06aa , "Cyrillic_nje" ); KEYVAL ( 0x06aa , "Serbian_nje" ); KEYVAL ( 0x06ab , "Serbian_tshe" ); KEYVAL ( 0x06ac , "Macedonia_kje" ); KEYVAL ( 0x06ad , "Ukrainian_ghe_with_upturn" ); KEYVAL ( 0x06ae , "Byelorussian_shortu" ); KEYVAL ( 0x06af , "Cyrillic_dzhe" ); KEYVAL ( 0x06af , "Serbian_dze" ); KEYVAL ( 0x06b0 , "numerosign" ); KEYVAL ( 0x06b1 , "Serbian_DJE" ); KEYVAL ( 0x06b2 , "Macedonia_GJE" ); KEYVAL ( 0x06b3 , "Cyrillic_IO" ); KEYVAL ( 0x06b4 , "Ukrainian_IE" ); KEYVAL ( 0x06b4 , "Ukranian_JE" ); KEYVAL ( 0x06b5 , "Macedonia_DSE" ); KEYVAL ( 0x06b6 , "Ukrainian_I" ); KEYVAL ( 0x06b6 , "Ukranian_I" ); KEYVAL ( 0x06b7 , "Ukrainian_YI" ); KEYVAL ( 0x06b7 , "Ukranian_YI" ); KEYVAL ( 0x06b8 , "Cyrillic_JE" ); KEYVAL ( 0x06b8 , "Serbian_JE" ); KEYVAL ( 0x06b9 , "Cyrillic_LJE" ); KEYVAL ( 0x06b9 , "Serbian_LJE" ); KEYVAL ( 0x06ba , "Cyrillic_NJE" ); KEYVAL ( 0x06ba , "Serbian_NJE" ); KEYVAL ( 0x06bb , "Serbian_TSHE" ); KEYVAL ( 0x06bc , "Macedonia_KJE" ); KEYVAL ( 0x06bd , "Ukrainian_GHE_WITH_UPTURN" ); KEYVAL ( 0x06be , "Byelorussian_SHORTU" ); KEYVAL ( 0x06bf , "Cyrillic_DZHE" ); KEYVAL ( 0x06bf , "Serbian_DZE" ); KEYVAL ( 0x06c0 , "Cyrillic_yu" ); KEYVAL ( 0x06c1 , "Cyrillic_a" ); KEYVAL ( 0x06c2 , "Cyrillic_be" ); KEYVAL ( 0x06c3 , "Cyrillic_tse" ); KEYVAL ( 0x06c4 , "Cyrillic_de" ); KEYVAL ( 0x06c5 , "Cyrillic_ie" ); KEYVAL ( 0x06c6 , "Cyrillic_ef" ); KEYVAL ( 0x06c7 , "Cyrillic_ghe" ); KEYVAL ( 0x06c8 , "Cyrillic_ha" ); KEYVAL ( 0x06c9 , "Cyrillic_i" ); KEYVAL ( 0x06ca , "Cyrillic_shorti" ); KEYVAL ( 0x06cb , "Cyrillic_ka" ); KEYVAL ( 0x06cc , "Cyrillic_el" ); KEYVAL ( 0x06cd , "Cyrillic_em" ); KEYVAL ( 0x06ce , "Cyrillic_en" ); KEYVAL ( 0x06cf , "Cyrillic_o" ); KEYVAL ( 0x06d0 , "Cyrillic_pe" ); KEYVAL ( 0x06d1 , "Cyrillic_ya" ); KEYVAL ( 0x06d2 , "Cyrillic_er" ); KEYVAL ( 0x06d3 , "Cyrillic_es" ); KEYVAL ( 0x06d4 , "Cyrillic_te" ); KEYVAL ( 0x06d5 , "Cyrillic_u" ); KEYVAL ( 0x06d6 , "Cyrillic_zhe" ); KEYVAL ( 0x06d7 , "Cyrillic_ve" ); KEYVAL ( 0x06d8 , "Cyrillic_softsign" ); KEYVAL ( 0x06d9 , "Cyrillic_yeru" ); KEYVAL ( 0x06da , "Cyrillic_ze" ); KEYVAL ( 0x06db , "Cyrillic_sha" ); KEYVAL ( 0x06dc , "Cyrillic_e" ); KEYVAL ( 0x06dd , "Cyrillic_shcha" ); KEYVAL ( 0x06de , "Cyrillic_che" ); KEYVAL ( 0x06df , "Cyrillic_hardsign" ); KEYVAL ( 0x06e0 , "Cyrillic_YU" ); KEYVAL ( 0x06e1 , "Cyrillic_A" ); KEYVAL ( 0x06e2 , "Cyrillic_BE" ); KEYVAL ( 0x06e3 , "Cyrillic_TSE" ); KEYVAL ( 0x06e4 , "Cyrillic_DE" ); KEYVAL ( 0x06e5 , "Cyrillic_IE" ); KEYVAL ( 0x06e6 , "Cyrillic_EF" ); KEYVAL ( 0x06e7 , "Cyrillic_GHE" ); KEYVAL ( 0x06e8 , "Cyrillic_HA" ); KEYVAL ( 0x06e9 , "Cyrillic_I" ); KEYVAL ( 0x06ea , "Cyrillic_SHORTI" ); KEYVAL ( 0x06eb , "Cyrillic_KA" ); KEYVAL ( 0x06ec , "Cyrillic_EL" ); KEYVAL ( 0x06ed , "Cyrillic_EM" ); KEYVAL ( 0x06ee , "Cyrillic_EN" ); KEYVAL ( 0x06ef , "Cyrillic_O" ); KEYVAL ( 0x06f0 , "Cyrillic_PE" ); KEYVAL ( 0x06f1 , "Cyrillic_YA" ); KEYVAL ( 0x06f2 , "Cyrillic_ER" ); KEYVAL ( 0x06f3 , "Cyrillic_ES" ); KEYVAL ( 0x06f4 , "Cyrillic_TE" ); KEYVAL ( 0x06f5 , "Cyrillic_U" ); KEYVAL ( 0x06f6 , "Cyrillic_ZHE" ); KEYVAL ( 0x06f7 , "Cyrillic_VE" ); KEYVAL ( 0x06f8 , "Cyrillic_SOFTSIGN" ); KEYVAL ( 0x06f9 , "Cyrillic_YERU" ); KEYVAL ( 0x06fa , "Cyrillic_ZE" ); KEYVAL ( 0x06fb , "Cyrillic_SHA" ); KEYVAL ( 0x06fc , "Cyrillic_E" ); KEYVAL ( 0x06fd , "Cyrillic_SHCHA" ); KEYVAL ( 0x06fe , "Cyrillic_CHE" ); KEYVAL ( 0x06ff , "Cyrillic_HARDSIGN" ); KEYVAL ( 0x07a1 , "Greek_ALPHAaccent" ); KEYVAL ( 0x07a2 , "Greek_EPSILONaccent" ); KEYVAL ( 0x07a3 , "Greek_ETAaccent" ); KEYVAL ( 0x07a4 , "Greek_IOTAaccent" ); KEYVAL ( 0x07a5 , "Greek_IOTAdieresis" ); KEYVAL ( 0x07a7 , "Greek_OMICRONaccent" ); KEYVAL ( 0x07a8 , "Greek_UPSILONaccent" ); KEYVAL ( 0x07a9 , "Greek_UPSILONdieresis" ); KEYVAL ( 0x07ab , "Greek_OMEGAaccent" ); KEYVAL ( 0x07ae , "Greek_accentdieresis" ); KEYVAL ( 0x07af , "Greek_horizbar" ); KEYVAL ( 0x07b1 , "Greek_alphaaccent" ); KEYVAL ( 0x07b2 , "Greek_epsilonaccent" ); KEYVAL ( 0x07b3 , "Greek_etaaccent" ); KEYVAL ( 0x07b4 , "Greek_iotaaccent" ); KEYVAL ( 0x07b5 , "Greek_iotadieresis" ); KEYVAL ( 0x07b6 , "Greek_iotaaccentdieresis" ); KEYVAL ( 0x07b7 , "Greek_omicronaccent" ); KEYVAL ( 0x07b8 , "Greek_upsilonaccent" ); KEYVAL ( 0x07b9 , "Greek_upsilondieresis" ); KEYVAL ( 0x07ba , "Greek_upsilonaccentdieresis" ); KEYVAL ( 0x07bb , "Greek_omegaaccent" ); KEYVAL ( 0x07c1 , "Greek_ALPHA" ); KEYVAL ( 0x07c2 , "Greek_BETA" ); KEYVAL ( 0x07c3 , "Greek_GAMMA" ); KEYVAL ( 0x07c4 , "Greek_DELTA" ); KEYVAL ( 0x07c5 , "Greek_EPSILON" ); KEYVAL ( 0x07c6 , "Greek_ZETA" ); KEYVAL ( 0x07c7 , "Greek_ETA" ); KEYVAL ( 0x07c8 , "Greek_THETA" ); KEYVAL ( 0x07c9 , "Greek_IOTA" ); KEYVAL ( 0x07ca , "Greek_KAPPA" ); KEYVAL ( 0x07cb , "Greek_LAMBDA" ); KEYVAL ( 0x07cb , "Greek_LAMDA" ); KEYVAL ( 0x07cc , "Greek_MU" ); KEYVAL ( 0x07cd , "Greek_NU" ); KEYVAL ( 0x07ce , "Greek_XI" ); KEYVAL ( 0x07cf , "Greek_OMICRON" ); KEYVAL ( 0x07d0 , "Greek_PI" ); KEYVAL ( 0x07d1 , "Greek_RHO" ); KEYVAL ( 0x07d2 , "Greek_SIGMA" ); KEYVAL ( 0x07d4 , "Greek_TAU" ); KEYVAL ( 0x07d5 , "Greek_UPSILON" ); KEYVAL ( 0x07d6 , "Greek_PHI" ); KEYVAL ( 0x07d7 , "Greek_CHI" ); KEYVAL ( 0x07d8 , "Greek_PSI" ); KEYVAL ( 0x07d9 , "Greek_OMEGA" ); KEYVAL ( 0x07e1 , "Greek_alpha" ); KEYVAL ( 0x07e2 , "Greek_beta" ); KEYVAL ( 0x07e3 , "Greek_gamma" ); KEYVAL ( 0x07e4 , "Greek_delta" ); KEYVAL ( 0x07e5 , "Greek_epsilon" ); KEYVAL ( 0x07e6 , "Greek_zeta" ); KEYVAL ( 0x07e7 , "Greek_eta" ); KEYVAL ( 0x07e8 , "Greek_theta" ); KEYVAL ( 0x07e9 , "Greek_iota" ); KEYVAL ( 0x07ea , "Greek_kappa" ); KEYVAL ( 0x07eb , "Greek_lambda" ); KEYVAL ( 0x07eb , "Greek_lamda" ); KEYVAL ( 0x07ec , "Greek_mu" ); KEYVAL ( 0x07ed , "Greek_nu" ); KEYVAL ( 0x07ee , "Greek_xi" ); KEYVAL ( 0x07ef , "Greek_omicron" ); KEYVAL ( 0x07f0 , "Greek_pi" ); KEYVAL ( 0x07f1 , "Greek_rho" ); KEYVAL ( 0x07f2 , "Greek_sigma" ); KEYVAL ( 0x07f3 , "Greek_finalsmallsigma" ); KEYVAL ( 0x07f4 , "Greek_tau" ); KEYVAL ( 0x07f5 , "Greek_upsilon" ); KEYVAL ( 0x07f6 , "Greek_phi" ); KEYVAL ( 0x07f7 , "Greek_chi" ); KEYVAL ( 0x07f8 , "Greek_psi" ); KEYVAL ( 0x07f9 , "Greek_omega" ); KEYVAL ( 0x08a1 , "leftradical" ); KEYVAL ( 0x08a2 , "topleftradical" ); KEYVAL ( 0x08a3 , "horizconnector" ); KEYVAL ( 0x08a4 , "topintegral" ); KEYVAL ( 0x08a5 , "botintegral" ); KEYVAL ( 0x08a6 , "vertconnector" ); KEYVAL ( 0x08a7 , "topleftsqbracket" ); KEYVAL ( 0x08a8 , "botleftsqbracket" ); KEYVAL ( 0x08a9 , "toprightsqbracket" ); KEYVAL ( 0x08aa , "botrightsqbracket" ); KEYVAL ( 0x08ab , "topleftparens" ); KEYVAL ( 0x08ac , "botleftparens" ); KEYVAL ( 0x08ad , "toprightparens" ); KEYVAL ( 0x08ae , "botrightparens" ); KEYVAL ( 0x08af , "leftmiddlecurlybrace" ); KEYVAL ( 0x08b0 , "rightmiddlecurlybrace" ); KEYVAL ( 0x08b1 , "topleftsummation" ); KEYVAL ( 0x08b2 , "botleftsummation" ); KEYVAL ( 0x08b3 , "topvertsummationconnector" ); KEYVAL ( 0x08b4 , "botvertsummationconnector" ); KEYVAL ( 0x08b5 , "toprightsummation" ); KEYVAL ( 0x08b6 , "botrightsummation" ); KEYVAL ( 0x08b7 , "rightmiddlesummation" ); KEYVAL ( 0x08bc , "lessthanequal" ); KEYVAL ( 0x08bd , "notequal" ); KEYVAL ( 0x08be , "greaterthanequal" ); KEYVAL ( 0x08bf , "integral" ); KEYVAL ( 0x08c0 , "therefore" ); KEYVAL ( 0x08c1 , "variation" ); KEYVAL ( 0x08c2 , "infinity" ); KEYVAL ( 0x08c5 , "nabla" ); KEYVAL ( 0x08c8 , "approximate" ); KEYVAL ( 0x08c9 , "similarequal" ); KEYVAL ( 0x08cd , "ifonlyif" ); KEYVAL ( 0x08ce , "implies" ); KEYVAL ( 0x08cf , "identical" ); KEYVAL ( 0x08d6 , "radical" ); KEYVAL ( 0x08da , "includedin" ); KEYVAL ( 0x08db , "includes" ); KEYVAL ( 0x08dc , "intersection" ); KEYVAL ( 0x08dd , "union" ); KEYVAL ( 0x08de , "logicaland" ); KEYVAL ( 0x08df , "logicalor" ); KEYVAL ( 0x08ef , "partialderivative" ); KEYVAL ( 0x08f6 , "function" ); KEYVAL ( 0x08fb , "leftarrow" ); KEYVAL ( 0x08fc , "uparrow" ); KEYVAL ( 0x08fd , "rightarrow" ); KEYVAL ( 0x08fe , "downarrow" ); KEYVAL ( 0x09df , "blank" ); KEYVAL ( 0x09e0 , "soliddiamond" ); KEYVAL ( 0x09e1 , "checkerboard" ); KEYVAL ( 0x09e2 , "ht" ); KEYVAL ( 0x09e3 , "ff" ); KEYVAL ( 0x09e4 , "cr" ); KEYVAL ( 0x09e5 , "lf" ); KEYVAL ( 0x09e8 , "nl" ); KEYVAL ( 0x09e9 , "vt" ); KEYVAL ( 0x09ea , "lowrightcorner" ); KEYVAL ( 0x09eb , "uprightcorner" ); KEYVAL ( 0x09ec , "upleftcorner" ); KEYVAL ( 0x09ed , "lowleftcorner" ); KEYVAL ( 0x09ee , "crossinglines" ); KEYVAL ( 0x09ef , "horizlinescan1" ); KEYVAL ( 0x09f0 , "horizlinescan3" ); KEYVAL ( 0x09f1 , "horizlinescan5" ); KEYVAL ( 0x09f2 , "horizlinescan7" ); KEYVAL ( 0x09f3 , "horizlinescan9" ); KEYVAL ( 0x09f4 , "leftt" ); KEYVAL ( 0x09f5 , "rightt" ); KEYVAL ( 0x09f6 , "bott" ); KEYVAL ( 0x09f7 , "topt" ); KEYVAL ( 0x09f8 , "vertbar" ); KEYVAL ( 0x0aa1 , "emspace" ); KEYVAL ( 0x0aa2 , "enspace" ); KEYVAL ( 0x0aa3 , "em3space" ); KEYVAL ( 0x0aa4 , "em4space" ); KEYVAL ( 0x0aa5 , "digitspace" ); KEYVAL ( 0x0aa6 , "punctspace" ); KEYVAL ( 0x0aa7 , "thinspace" ); KEYVAL ( 0x0aa8 , "hairspace" ); KEYVAL ( 0x0aa9 , "emdash" ); KEYVAL ( 0x0aaa , "endash" ); KEYVAL ( 0x0aac , "signifblank" ); KEYVAL ( 0x0aae , "ellipsis" ); KEYVAL ( 0x0aaf , "doubbaselinedot" ); KEYVAL ( 0x0ab0 , "onethird" ); KEYVAL ( 0x0ab1 , "twothirds" ); KEYVAL ( 0x0ab2 , "onefifth" ); KEYVAL ( 0x0ab3 , "twofifths" ); KEYVAL ( 0x0ab4 , "threefifths" ); KEYVAL ( 0x0ab5 , "fourfifths" ); KEYVAL ( 0x0ab6 , "onesixth" ); KEYVAL ( 0x0ab7 , "fivesixths" ); KEYVAL ( 0x0ab8 , "careof" ); KEYVAL ( 0x0abb , "figdash" ); KEYVAL ( 0x0abc , "leftanglebracket" ); KEYVAL ( 0x0abd , "decimalpoint" ); KEYVAL ( 0x0abe , "rightanglebracket" ); KEYVAL ( 0x0abf , "marker" ); KEYVAL ( 0x0ac3 , "oneeighth" ); KEYVAL ( 0x0ac4 , "threeeighths" ); KEYVAL ( 0x0ac5 , "fiveeighths" ); KEYVAL ( 0x0ac6 , "seveneighths" ); KEYVAL ( 0x0ac9 , "trademark" ); KEYVAL ( 0x0aca , "signaturemark" ); KEYVAL ( 0x0acb , "trademarkincircle" ); KEYVAL ( 0x0acc , "leftopentriangle" ); KEYVAL ( 0x0acd , "rightopentriangle" ); KEYVAL ( 0x0ace , "emopencircle" ); KEYVAL ( 0x0acf , "emopenrectangle" ); KEYVAL ( 0x0ad0 , "leftsinglequotemark" ); KEYVAL ( 0x0ad1 , "rightsinglequotemark" ); KEYVAL ( 0x0ad2 , "leftdoublequotemark" ); KEYVAL ( 0x0ad3 , "rightdoublequotemark" ); KEYVAL ( 0x0ad4 , "prescription" ); KEYVAL ( 0x0ad6 , "minutes" ); KEYVAL ( 0x0ad7 , "seconds" ); KEYVAL ( 0x0ad9 , "latincross" ); KEYVAL ( 0x0ada , "hexagram" ); KEYVAL ( 0x0adb , "filledrectbullet" ); KEYVAL ( 0x0adc , "filledlefttribullet" ); KEYVAL ( 0x0add , "filledrighttribullet" ); KEYVAL ( 0x0ade , "emfilledcircle" ); KEYVAL ( 0x0adf , "emfilledrect" ); KEYVAL ( 0x0ae0 , "enopencircbullet" ); KEYVAL ( 0x0ae1 , "enopensquarebullet" ); KEYVAL ( 0x0ae2 , "openrectbullet" ); KEYVAL ( 0x0ae3 , "opentribulletup" ); KEYVAL ( 0x0ae4 , "opentribulletdown" ); KEYVAL ( 0x0ae5 , "openstar" ); KEYVAL ( 0x0ae6 , "enfilledcircbullet" ); KEYVAL ( 0x0ae7 , "enfilledsqbullet" ); KEYVAL ( 0x0ae8 , "filledtribulletup" ); KEYVAL ( 0x0ae9 , "filledtribulletdown" ); KEYVAL ( 0x0aea , "leftpointer" ); KEYVAL ( 0x0aeb , "rightpointer" ); KEYVAL ( 0x0aec , "club" ); KEYVAL ( 0x0aed , "diamond" ); KEYVAL ( 0x0aee , "heart" ); KEYVAL ( 0x0af0 , "maltesecross" ); KEYVAL ( 0x0af1 , "dagger" ); KEYVAL ( 0x0af2 , "doubledagger" ); KEYVAL ( 0x0af3 , "checkmark" ); KEYVAL ( 0x0af4 , "ballotcross" ); KEYVAL ( 0x0af5 , "musicalsharp" ); KEYVAL ( 0x0af6 , "musicalflat" ); KEYVAL ( 0x0af7 , "malesymbol" ); KEYVAL ( 0x0af8 , "femalesymbol" ); KEYVAL ( 0x0af9 , "telephone" ); KEYVAL ( 0x0afa , "telephonerecorder" ); KEYVAL ( 0x0afb , "phonographcopyright" ); KEYVAL ( 0x0afc , "caret" ); KEYVAL ( 0x0afd , "singlelowquotemark" ); KEYVAL ( 0x0afe , "doublelowquotemark" ); KEYVAL ( 0x0aff , "cursor" ); KEYVAL ( 0x0ba3 , "leftcaret" ); KEYVAL ( 0x0ba6 , "rightcaret" ); KEYVAL ( 0x0ba8 , "downcaret" ); KEYVAL ( 0x0ba9 , "upcaret" ); KEYVAL ( 0x0bc0 , "overbar" ); KEYVAL ( 0x0bc2 , "downtack" ); KEYVAL ( 0x0bc3 , "upshoe" ); KEYVAL ( 0x0bc4 , "downstile" ); KEYVAL ( 0x0bc6 , "underbar" ); KEYVAL ( 0x0bca , "jot" ); KEYVAL ( 0x0bcc , "quad" ); KEYVAL ( 0x0bce , "uptack" ); KEYVAL ( 0x0bcf , "circle" ); KEYVAL ( 0x0bd3 , "upstile" ); KEYVAL ( 0x0bd6 , "downshoe" ); KEYVAL ( 0x0bd8 , "rightshoe" ); KEYVAL ( 0x0bda , "leftshoe" ); KEYVAL ( 0x0bdc , "lefttack" ); KEYVAL ( 0x0bfc , "righttack" ); KEYVAL ( 0x0cdf , "hebrew_doublelowline" ); KEYVAL ( 0x0ce0 , "hebrew_aleph" ); KEYVAL ( 0x0ce1 , "hebrew_bet" ); KEYVAL ( 0x0ce1 , "hebrew_beth" ); KEYVAL ( 0x0ce2 , "hebrew_gimel" ); KEYVAL ( 0x0ce2 , "hebrew_gimmel" ); KEYVAL ( 0x0ce3 , "hebrew_dalet" ); KEYVAL ( 0x0ce3 , "hebrew_daleth" ); KEYVAL ( 0x0ce4 , "hebrew_he" ); KEYVAL ( 0x0ce5 , "hebrew_waw" ); KEYVAL ( 0x0ce6 , "hebrew_zain" ); KEYVAL ( 0x0ce6 , "hebrew_zayin" ); KEYVAL ( 0x0ce7 , "hebrew_chet" ); KEYVAL ( 0x0ce7 , "hebrew_het" ); KEYVAL ( 0x0ce8 , "hebrew_tet" ); KEYVAL ( 0x0ce8 , "hebrew_teth" ); KEYVAL ( 0x0ce9 , "hebrew_yod" ); KEYVAL ( 0x0cea , "hebrew_finalkaph" ); KEYVAL ( 0x0ceb , "hebrew_kaph" ); KEYVAL ( 0x0cec , "hebrew_lamed" ); KEYVAL ( 0x0ced , "hebrew_finalmem" ); KEYVAL ( 0x0cee , "hebrew_mem" ); KEYVAL ( 0x0cef , "hebrew_finalnun" ); KEYVAL ( 0x0cf0 , "hebrew_nun" ); KEYVAL ( 0x0cf1 , "hebrew_samech" ); KEYVAL ( 0x0cf1 , "hebrew_samekh" ); KEYVAL ( 0x0cf2 , "hebrew_ayin" ); KEYVAL ( 0x0cf3 , "hebrew_finalpe" ); KEYVAL ( 0x0cf4 , "hebrew_pe" ); KEYVAL ( 0x0cf5 , "hebrew_finalzade" ); KEYVAL ( 0x0cf5 , "hebrew_finalzadi" ); KEYVAL ( 0x0cf6 , "hebrew_zade" ); KEYVAL ( 0x0cf6 , "hebrew_zadi" ); KEYVAL ( 0x0cf7 , "hebrew_kuf" ); KEYVAL ( 0x0cf7 , "hebrew_qoph" ); KEYVAL ( 0x0cf8 , "hebrew_resh" ); KEYVAL ( 0x0cf9 , "hebrew_shin" ); KEYVAL ( 0x0cfa , "hebrew_taf" ); KEYVAL ( 0x0cfa , "hebrew_taw" ); KEYVAL ( 0x0da1 , "Thai_kokai" ); KEYVAL ( 0x0da2 , "Thai_khokhai" ); KEYVAL ( 0x0da3 , "Thai_khokhuat" ); KEYVAL ( 0x0da4 , "Thai_khokhwai" ); KEYVAL ( 0x0da5 , "Thai_khokhon" ); KEYVAL ( 0x0da6 , "Thai_khorakhang" ); KEYVAL ( 0x0da7 , "Thai_ngongu" ); KEYVAL ( 0x0da8 , "Thai_chochan" ); KEYVAL ( 0x0da9 , "Thai_choching" ); KEYVAL ( 0x0daa , "Thai_chochang" ); KEYVAL ( 0x0dab , "Thai_soso" ); KEYVAL ( 0x0dac , "Thai_chochoe" ); KEYVAL ( 0x0dad , "Thai_yoying" ); KEYVAL ( 0x0dae , "Thai_dochada" ); KEYVAL ( 0x0daf , "Thai_topatak" ); KEYVAL ( 0x0db0 , "Thai_thothan" ); KEYVAL ( 0x0db1 , "Thai_thonangmontho" ); KEYVAL ( 0x0db2 , "Thai_thophuthao" ); KEYVAL ( 0x0db3 , "Thai_nonen" ); KEYVAL ( 0x0db4 , "Thai_dodek" ); KEYVAL ( 0x0db5 , "Thai_totao" ); KEYVAL ( 0x0db6 , "Thai_thothung" ); KEYVAL ( 0x0db7 , "Thai_thothahan" ); KEYVAL ( 0x0db8 , "Thai_thothong" ); KEYVAL ( 0x0db9 , "Thai_nonu" ); KEYVAL ( 0x0dba , "Thai_bobaimai" ); KEYVAL ( 0x0dbb , "Thai_popla" ); KEYVAL ( 0x0dbc , "Thai_phophung" ); KEYVAL ( 0x0dbd , "Thai_fofa" ); KEYVAL ( 0x0dbe , "Thai_phophan" ); KEYVAL ( 0x0dbf , "Thai_fofan" ); KEYVAL ( 0x0dc0 , "Thai_phosamphao" ); KEYVAL ( 0x0dc1 , "Thai_moma" ); KEYVAL ( 0x0dc2 , "Thai_yoyak" ); KEYVAL ( 0x0dc3 , "Thai_rorua" ); KEYVAL ( 0x0dc4 , "Thai_ru" ); KEYVAL ( 0x0dc5 , "Thai_loling" ); KEYVAL ( 0x0dc6 , "Thai_lu" ); KEYVAL ( 0x0dc7 , "Thai_wowaen" ); KEYVAL ( 0x0dc8 , "Thai_sosala" ); KEYVAL ( 0x0dc9 , "Thai_sorusi" ); KEYVAL ( 0x0dca , "Thai_sosua" ); KEYVAL ( 0x0dcb , "Thai_hohip" ); KEYVAL ( 0x0dcc , "Thai_lochula" ); KEYVAL ( 0x0dcd , "Thai_oang" ); KEYVAL ( 0x0dce , "Thai_honokhuk" ); KEYVAL ( 0x0dcf , "Thai_paiyannoi" ); KEYVAL ( 0x0dd0 , "Thai_saraa" ); KEYVAL ( 0x0dd1 , "Thai_maihanakat" ); KEYVAL ( 0x0dd2 , "Thai_saraaa" ); KEYVAL ( 0x0dd3 , "Thai_saraam" ); KEYVAL ( 0x0dd4 , "Thai_sarai" ); KEYVAL ( 0x0dd5 , "Thai_saraii" ); KEYVAL ( 0x0dd6 , "Thai_saraue" ); KEYVAL ( 0x0dd7 , "Thai_sarauee" ); KEYVAL ( 0x0dd8 , "Thai_sarau" ); KEYVAL ( 0x0dd9 , "Thai_sarauu" ); KEYVAL ( 0x0dda , "Thai_phinthu" ); KEYVAL ( 0x0dde , "Thai_maihanakat_maitho" ); KEYVAL ( 0x0ddf , "Thai_baht" ); KEYVAL ( 0x0de0 , "Thai_sarae" ); KEYVAL ( 0x0de1 , "Thai_saraae" ); KEYVAL ( 0x0de2 , "Thai_sarao" ); KEYVAL ( 0x0de3 , "Thai_saraaimaimuan" ); KEYVAL ( 0x0de4 , "Thai_saraaimaimalai" ); KEYVAL ( 0x0de5 , "Thai_lakkhangyao" ); KEYVAL ( 0x0de6 , "Thai_maiyamok" ); KEYVAL ( 0x0de7 , "Thai_maitaikhu" ); KEYVAL ( 0x0de8 , "Thai_maiek" ); KEYVAL ( 0x0de9 , "Thai_maitho" ); KEYVAL ( 0x0dea , "Thai_maitri" ); KEYVAL ( 0x0deb , "Thai_maichattawa" ); KEYVAL ( 0x0dec , "Thai_thanthakhat" ); KEYVAL ( 0x0ded , "Thai_nikhahit" ); KEYVAL ( 0x0df0 , "Thai_leksun" ); KEYVAL ( 0x0df1 , "Thai_leknung" ); KEYVAL ( 0x0df2 , "Thai_leksong" ); KEYVAL ( 0x0df3 , "Thai_leksam" ); KEYVAL ( 0x0df4 , "Thai_leksi" ); KEYVAL ( 0x0df5 , "Thai_lekha" ); KEYVAL ( 0x0df6 , "Thai_lekhok" ); KEYVAL ( 0x0df7 , "Thai_lekchet" ); KEYVAL ( 0x0df8 , "Thai_lekpaet" ); KEYVAL ( 0x0df9 , "Thai_lekkao" ); KEYVAL ( 0x0ea1 , "Hangul_Kiyeog" ); KEYVAL ( 0x0ea2 , "Hangul_SsangKiyeog" ); KEYVAL ( 0x0ea3 , "Hangul_KiyeogSios" ); KEYVAL ( 0x0ea4 , "Hangul_Nieun" ); KEYVAL ( 0x0ea5 , "Hangul_NieunJieuj" ); KEYVAL ( 0x0ea6 , "Hangul_NieunHieuh" ); KEYVAL ( 0x0ea7 , "Hangul_Dikeud" ); KEYVAL ( 0x0ea8 , "Hangul_SsangDikeud" ); KEYVAL ( 0x0ea9 , "Hangul_Rieul" ); KEYVAL ( 0x0eaa , "Hangul_RieulKiyeog" ); KEYVAL ( 0x0eab , "Hangul_RieulMieum" ); KEYVAL ( 0x0eac , "Hangul_RieulPieub" ); KEYVAL ( 0x0ead , "Hangul_RieulSios" ); KEYVAL ( 0x0eae , "Hangul_RieulTieut" ); KEYVAL ( 0x0eaf , "Hangul_RieulPhieuf" ); KEYVAL ( 0x0eb0 , "Hangul_RieulHieuh" ); KEYVAL ( 0x0eb1 , "Hangul_Mieum" ); KEYVAL ( 0x0eb2 , "Hangul_Pieub" ); KEYVAL ( 0x0eb3 , "Hangul_SsangPieub" ); KEYVAL ( 0x0eb4 , "Hangul_PieubSios" ); KEYVAL ( 0x0eb5 , "Hangul_Sios" ); KEYVAL ( 0x0eb6 , "Hangul_SsangSios" ); KEYVAL ( 0x0eb7 , "Hangul_Ieung" ); KEYVAL ( 0x0eb8 , "Hangul_Jieuj" ); KEYVAL ( 0x0eb9 , "Hangul_SsangJieuj" ); KEYVAL ( 0x0eba , "Hangul_Cieuc" ); KEYVAL ( 0x0ebb , "Hangul_Khieuq" ); KEYVAL ( 0x0ebc , "Hangul_Tieut" ); KEYVAL ( 0x0ebd , "Hangul_Phieuf" ); KEYVAL ( 0x0ebe , "Hangul_Hieuh" ); KEYVAL ( 0x0ebf , "Hangul_A" ); KEYVAL ( 0x0ec0 , "Hangul_AE" ); KEYVAL ( 0x0ec1 , "Hangul_YA" ); KEYVAL ( 0x0ec2 , "Hangul_YAE" ); KEYVAL ( 0x0ec3 , "Hangul_EO" ); KEYVAL ( 0x0ec4 , "Hangul_E" ); KEYVAL ( 0x0ec5 , "Hangul_YEO" ); KEYVAL ( 0x0ec6 , "Hangul_YE" ); KEYVAL ( 0x0ec7 , "Hangul_O" ); KEYVAL ( 0x0ec8 , "Hangul_WA" ); KEYVAL ( 0x0ec9 , "Hangul_WAE" ); KEYVAL ( 0x0eca , "Hangul_OE" ); KEYVAL ( 0x0ecb , "Hangul_YO" ); KEYVAL ( 0x0ecc , "Hangul_U" ); KEYVAL ( 0x0ecd , "Hangul_WEO" ); KEYVAL ( 0x0ece , "Hangul_WE" ); KEYVAL ( 0x0ecf , "Hangul_WI" ); KEYVAL ( 0x0ed0 , "Hangul_YU" ); KEYVAL ( 0x0ed1 , "Hangul_EU" ); KEYVAL ( 0x0ed2 , "Hangul_YI" ); KEYVAL ( 0x0ed3 , "Hangul_I" ); KEYVAL ( 0x0ed4 , "Hangul_J_Kiyeog" ); KEYVAL ( 0x0ed5 , "Hangul_J_SsangKiyeog" ); KEYVAL ( 0x0ed6 , "Hangul_J_KiyeogSios" ); KEYVAL ( 0x0ed7 , "Hangul_J_Nieun" ); KEYVAL ( 0x0ed8 , "Hangul_J_NieunJieuj" ); KEYVAL ( 0x0ed9 , "Hangul_J_NieunHieuh" ); KEYVAL ( 0x0eda , "Hangul_J_Dikeud" ); KEYVAL ( 0x0edb , "Hangul_J_Rieul" ); KEYVAL ( 0x0edc , "Hangul_J_RieulKiyeog" ); KEYVAL ( 0x0edd , "Hangul_J_RieulMieum" ); KEYVAL ( 0x0ede , "Hangul_J_RieulPieub" ); KEYVAL ( 0x0edf , "Hangul_J_RieulSios" ); KEYVAL ( 0x0ee0 , "Hangul_J_RieulTieut" ); KEYVAL ( 0x0ee1 , "Hangul_J_RieulPhieuf" ); KEYVAL ( 0x0ee2 , "Hangul_J_RieulHieuh" ); KEYVAL ( 0x0ee3 , "Hangul_J_Mieum" ); KEYVAL ( 0x0ee4 , "Hangul_J_Pieub" ); KEYVAL ( 0x0ee5 , "Hangul_J_PieubSios" ); KEYVAL ( 0x0ee6 , "Hangul_J_Sios" ); KEYVAL ( 0x0ee7 , "Hangul_J_SsangSios" ); KEYVAL ( 0x0ee8 , "Hangul_J_Ieung" ); KEYVAL ( 0x0ee9 , "Hangul_J_Jieuj" ); KEYVAL ( 0x0eea , "Hangul_J_Cieuc" ); KEYVAL ( 0x0eeb , "Hangul_J_Khieuq" ); KEYVAL ( 0x0eec , "Hangul_J_Tieut" ); KEYVAL ( 0x0eed , "Hangul_J_Phieuf" ); KEYVAL ( 0x0eee , "Hangul_J_Hieuh" ); KEYVAL ( 0x0eef , "Hangul_RieulYeorinHieuh" ); KEYVAL ( 0x0ef0 , "Hangul_SunkyeongeumMieum" ); KEYVAL ( 0x0ef1 , "Hangul_SunkyeongeumPieub" ); KEYVAL ( 0x0ef2 , "Hangul_PanSios" ); KEYVAL ( 0x0ef3 , "Hangul_KkogjiDalrinIeung" ); KEYVAL ( 0x0ef4 , "Hangul_SunkyeongeumPhieuf" ); KEYVAL ( 0x0ef5 , "Hangul_YeorinHieuh" ); KEYVAL ( 0x0ef6 , "Hangul_AraeA" ); KEYVAL ( 0x0ef7 , "Hangul_AraeAE" ); KEYVAL ( 0x0ef8 , "Hangul_J_PanSios" ); KEYVAL ( 0x0ef9 , "Hangul_J_KkogjiDalrinIeung" ); KEYVAL ( 0x0efa , "Hangul_J_YeorinHieuh" ); KEYVAL ( 0x0eff , "Korean_Won" ); KEYVAL ( 0x13bc , "OE" ); KEYVAL ( 0x13bd , "oe" ); KEYVAL ( 0x13be , "Ydiaeresis" ); KEYVAL ( 0x20a0 , "EcuSign" ); KEYVAL ( 0x20a1 , "ColonSign" ); KEYVAL ( 0x20a2 , "CruzeiroSign" ); KEYVAL ( 0x20a3 , "FFrancSign" ); KEYVAL ( 0x20a4 , "LiraSign" ); KEYVAL ( 0x20a5 , "MillSign" ); KEYVAL ( 0x20a6 , "NairaSign" ); KEYVAL ( 0x20a7 , "PesetaSign" ); KEYVAL ( 0x20a8 , "RupeeSign" ); KEYVAL ( 0x20a9 , "WonSign" ); KEYVAL ( 0x20aa , "NewSheqelSign" ); KEYVAL ( 0x20ab , "DongSign" ); KEYVAL ( 0x20ac , "EuroSign" ); KEYVAL ( 0xFD01 , "3270_Duplicate" ); KEYVAL ( 0xFD02 , "3270_FieldMark" ); KEYVAL ( 0xFD03 , "3270_Right2" ); KEYVAL ( 0xFD04 , "3270_Left2" ); KEYVAL ( 0xFD05 , "3270_BackTab" ); KEYVAL ( 0xFD06 , "3270_EraseEOF" ); KEYVAL ( 0xFD07 , "3270_EraseInput" ); KEYVAL ( 0xFD08 , "3270_Reset" ); KEYVAL ( 0xFD09 , "3270_Quit" ); KEYVAL ( 0xFD0A , "3270_PA1" ); KEYVAL ( 0xFD0B , "3270_PA2" ); KEYVAL ( 0xFD0C , "3270_PA3" ); KEYVAL ( 0xFD0D , "3270_Test" ); KEYVAL ( 0xFD0E , "3270_Attn" ); KEYVAL ( 0xFD0F , "3270_CursorBlink" ); KEYVAL ( 0xFD10 , "3270_AltCursor" ); KEYVAL ( 0xFD11 , "3270_KeyClick" ); KEYVAL ( 0xFD12 , "3270_Jump" ); KEYVAL ( 0xFD13 , "3270_Ident" ); KEYVAL ( 0xFD14 , "3270_Rule" ); KEYVAL ( 0xFD15 , "3270_Copy" ); KEYVAL ( 0xFD16 , "3270_Play" ); KEYVAL ( 0xFD17 , "3270_Setup" ); KEYVAL ( 0xFD18 , "3270_Record" ); KEYVAL ( 0xFD19 , "3270_ChangeScreen" ); KEYVAL ( 0xFD1A , "3270_DeleteWord" ); KEYVAL ( 0xFD1B , "3270_ExSelect" ); KEYVAL ( 0xFD1C , "3270_CursorSelect" ); KEYVAL ( 0xFD1D , "3270_PrintScreen" ); KEYVAL ( 0xFD1E , "3270_Enter" ); KEYVAL ( 0xFE01 , "ISO_Lock" ); KEYVAL ( 0xFE02 , "ISO_Level2_Latch" ); KEYVAL ( 0xFE03 , "ISO_Level3_Shift" ); KEYVAL ( 0xFE04 , "ISO_Level3_Latch" ); KEYVAL ( 0xFE05 , "ISO_Level3_Lock" ); KEYVAL ( 0xFE06 , "ISO_Group_Latch" ); KEYVAL ( 0xFE07 , "ISO_Group_Lock" ); KEYVAL ( 0xFE08 , "ISO_Next_Group" ); KEYVAL ( 0xFE09 , "ISO_Next_Group_Lock" ); KEYVAL ( 0xFE0A , "ISO_Prev_Group" ); KEYVAL ( 0xFE0B , "ISO_Prev_Group_Lock" ); KEYVAL ( 0xFE0C , "ISO_First_Group" ); KEYVAL ( 0xFE0D , "ISO_First_Group_Lock" ); KEYVAL ( 0xFE0E , "ISO_Last_Group" ); KEYVAL ( 0xFE0F , "ISO_Last_Group_Lock" ); KEYVAL ( 0xFE20 , "ISO_Left_Tab" ); KEYVAL ( 0xFE21 , "ISO_Move_Line_Up" ); KEYVAL ( 0xFE22 , "ISO_Move_Line_Down" ); KEYVAL ( 0xFE23 , "ISO_Partial_Line_Up" ); KEYVAL ( 0xFE24 , "ISO_Partial_Line_Down" ); KEYVAL ( 0xFE25 , "ISO_Partial_Space_Left" ); KEYVAL ( 0xFE26 , "ISO_Partial_Space_Right" ); KEYVAL ( 0xFE27 , "ISO_Set_Margin_Left" ); KEYVAL ( 0xFE28 , "ISO_Set_Margin_Right" ); KEYVAL ( 0xFE29 , "ISO_Release_Margin_Left" ); KEYVAL ( 0xFE2A , "ISO_Release_Margin_Right" ); KEYVAL ( 0xFE2B , "ISO_Release_Both_Margins" ); KEYVAL ( 0xFE2C , "ISO_Fast_Cursor_Left" ); KEYVAL ( 0xFE2D , "ISO_Fast_Cursor_Right" ); KEYVAL ( 0xFE2E , "ISO_Fast_Cursor_Up" ); KEYVAL ( 0xFE2F , "ISO_Fast_Cursor_Down" ); KEYVAL ( 0xFE30 , "ISO_Continuous_Underline" ); KEYVAL ( 0xFE31 , "ISO_Discontinuous_Underline" ); KEYVAL ( 0xFE32 , "ISO_Emphasize" ); KEYVAL ( 0xFE33 , "ISO_Center_Object" ); KEYVAL ( 0xFE34 , "ISO_Enter" ); KEYVAL ( 0xFE50 , "dead_grave" ); KEYVAL ( 0xFE51 , "dead_acute" ); KEYVAL ( 0xFE52 , "dead_circumflex" ); KEYVAL ( 0xFE53 , "dead_tilde" ); KEYVAL ( 0xFE54 , "dead_macron" ); KEYVAL ( 0xFE55 , "dead_breve" ); KEYVAL ( 0xFE56 , "dead_abovedot" ); KEYVAL ( 0xFE57 , "dead_diaeresis" ); KEYVAL ( 0xFE58 , "dead_abovering" ); KEYVAL ( 0xFE59 , "dead_doubleacute" ); KEYVAL ( 0xFE5A , "dead_caron" ); KEYVAL ( 0xFE5B , "dead_cedilla" ); KEYVAL ( 0xFE5C , "dead_ogonek" ); KEYVAL ( 0xFE5D , "dead_iota" ); KEYVAL ( 0xFE5E , "dead_voiced_sound" ); KEYVAL ( 0xFE5F , "dead_semivoiced_sound" ); KEYVAL ( 0xFE60 , "dead_belowdot" ); KEYVAL ( 0xFE61 , "dead_hook" ); KEYVAL ( 0xFE62 , "dead_horn" ); KEYVAL ( 0xFE70 , "AccessX_Enable" ); KEYVAL ( 0xFE71 , "AccessX_Feedback_Enable" ); KEYVAL ( 0xFE72 , "RepeatKeys_Enable" ); KEYVAL ( 0xFE73 , "SlowKeys_Enable" ); KEYVAL ( 0xFE74 , "BounceKeys_Enable" ); KEYVAL ( 0xFE75 , "StickyKeys_Enable" ); KEYVAL ( 0xFE76 , "MouseKeys_Enable" ); KEYVAL ( 0xFE77 , "MouseKeys_Accel_Enable" ); KEYVAL ( 0xFE78 , "Overlay1_Enable" ); KEYVAL ( 0xFE79 , "Overlay2_Enable" ); KEYVAL ( 0xFE7A , "AudibleBell_Enable" ); KEYVAL ( 0xFED0 , "First_Virtual_Screen" ); KEYVAL ( 0xFED1 , "Prev_Virtual_Screen" ); KEYVAL ( 0xFED2 , "Next_Virtual_Screen" ); KEYVAL ( 0xFED4 , "Last_Virtual_Screen" ); KEYVAL ( 0xFED5 , "Terminate_Server" ); KEYVAL ( 0xFEE0 , "Pointer_Left" ); KEYVAL ( 0xFEE1 , "Pointer_Right" ); KEYVAL ( 0xFEE2 , "Pointer_Up" ); KEYVAL ( 0xFEE3 , "Pointer_Down" ); KEYVAL ( 0xFEE4 , "Pointer_UpLeft" ); KEYVAL ( 0xFEE5 , "Pointer_UpRight" ); KEYVAL ( 0xFEE6 , "Pointer_DownLeft" ); KEYVAL ( 0xFEE7 , "Pointer_DownRight" ); KEYVAL ( 0xFEE8 , "Pointer_Button_Dflt" ); KEYVAL ( 0xFEE9 , "Pointer_Button1" ); KEYVAL ( 0xFEEA , "Pointer_Button2" ); KEYVAL ( 0xFEEB , "Pointer_Button3" ); KEYVAL ( 0xFEEC , "Pointer_Button4" ); KEYVAL ( 0xFEED , "Pointer_Button5" ); KEYVAL ( 0xFEEE , "Pointer_DblClick_Dflt" ); KEYVAL ( 0xFEEF , "Pointer_DblClick1" ); KEYVAL ( 0xFEF0 , "Pointer_DblClick2" ); KEYVAL ( 0xFEF1 , "Pointer_DblClick3" ); KEYVAL ( 0xFEF2 , "Pointer_DblClick4" ); KEYVAL ( 0xFEF3 , "Pointer_DblClick5" ); KEYVAL ( 0xFEF4 , "Pointer_Drag_Dflt" ); KEYVAL ( 0xFEF5 , "Pointer_Drag1" ); KEYVAL ( 0xFEF6 , "Pointer_Drag2" ); KEYVAL ( 0xFEF7 , "Pointer_Drag3" ); KEYVAL ( 0xFEF8 , "Pointer_Drag4" ); KEYVAL ( 0xFEF9 , "Pointer_EnableKeys" ); KEYVAL ( 0xFEFA , "Pointer_Accelerate" ); KEYVAL ( 0xFEFB , "Pointer_DfltBtnNext" ); KEYVAL ( 0xFEFC , "Pointer_DfltBtnPrev" ); KEYVAL ( 0xFEFD , "Pointer_Drag5" ); KEYVAL ( 0xFF08 , "BackSpace" ); KEYVAL ( 0xFF09 , "Tab" ); KEYVAL ( 0xFF0A , "Linefeed" ); KEYVAL ( 0xFF0B , "Clear" ); KEYVAL ( 0xFF0D , "Return" ); KEYVAL ( 0xFF13 , "Pause" ); KEYVAL ( 0xFF14 , "Scroll_Lock" ); KEYVAL ( 0xFF15 , "Sys_Req" ); KEYVAL ( 0xFF1B , "Escape" ); KEYVAL ( 0xFF20 , "Multi_key" ); KEYVAL ( 0xFF21 , "Kanji" ); KEYVAL ( 0xFF22 , "Muhenkan" ); KEYVAL ( 0xFF23 , "Henkan" ); KEYVAL ( 0xFF23 , "Henkan_Mode" ); KEYVAL ( 0xFF24 , "Romaji" ); KEYVAL ( 0xFF25 , "Hiragana" ); KEYVAL ( 0xFF26 , "Katakana" ); KEYVAL ( 0xFF27 , "Hiragana_Katakana" ); KEYVAL ( 0xFF28 , "Zenkaku" ); KEYVAL ( 0xFF29 , "Hankaku" ); KEYVAL ( 0xFF2A , "Zenkaku_Hankaku" ); KEYVAL ( 0xFF2B , "Touroku" ); KEYVAL ( 0xFF2C , "Massyo" ); KEYVAL ( 0xFF2D , "Kana_Lock" ); KEYVAL ( 0xFF2E , "Kana_Shift" ); KEYVAL ( 0xFF2F , "Eisu_Shift" ); KEYVAL ( 0xFF30 , "Eisu_toggle" ); KEYVAL ( 0xff31 , "Hangul" ); KEYVAL ( 0xff32 , "Hangul_Start" ); KEYVAL ( 0xff33 , "Hangul_End" ); KEYVAL ( 0xff34 , "Hangul_Hanja" ); KEYVAL ( 0xff35 , "Hangul_Jamo" ); KEYVAL ( 0xff36 , "Hangul_Romaja" ); KEYVAL ( 0xFF37 , "Codeinput" ); KEYVAL ( 0xff37 , "Hangul_Codeinput" ); KEYVAL ( 0xFF37 , "Kanji_Bangou" ); KEYVAL ( 0xff38 , "Hangul_Jeonja" ); KEYVAL ( 0xff39 , "Hangul_Banja" ); KEYVAL ( 0xff3a , "Hangul_PreHanja" ); KEYVAL ( 0xff3b , "Hangul_PostHanja" ); KEYVAL ( 0xff3c , "Hangul_SingleCandidate" ); KEYVAL ( 0xFF3C , "SingleCandidate" ); KEYVAL ( 0xff3d , "Hangul_MultipleCandidate" ); KEYVAL ( 0xFF3D , "MultipleCandidate" ); KEYVAL ( 0xFF3D , "Zen_Koho" ); KEYVAL ( 0xff3e , "Hangul_PreviousCandidate" ); KEYVAL ( 0xFF3E , "Mae_Koho" ); KEYVAL ( 0xFF3E , "PreviousCandidate" ); KEYVAL ( 0xff3f , "Hangul_Special" ); KEYVAL ( 0xFF50 , "Home" ); KEYVAL ( 0xFF51 , "Left" ); KEYVAL ( 0xFF52 , "Up" ); KEYVAL ( 0xFF53 , "Right" ); KEYVAL ( 0xFF54 , "Down" ); KEYVAL ( 0xFF55 , "Page_Up" ); KEYVAL ( 0xFF55 , "Prior" ); KEYVAL ( 0xFF56 , "Next" ); KEYVAL ( 0xFF56 , "Page_Down" ); KEYVAL ( 0xFF57 , "End" ); KEYVAL ( 0xFF58 , "Begin" ); KEYVAL ( 0xFF60 , "Select" ); KEYVAL ( 0xFF61 , "Print" ); KEYVAL ( 0xFF62 , "Execute" ); KEYVAL ( 0xFF63 , "Insert" ); KEYVAL ( 0xFF65 , "Undo" ); KEYVAL ( 0xFF66 , "Redo" ); KEYVAL ( 0xFF67 , "Menu" ); KEYVAL ( 0xFF68 , "Find" ); KEYVAL ( 0xFF69 , "Cancel" ); KEYVAL ( 0xFF6A , "Help" ); KEYVAL ( 0xFF6B , "Break" ); KEYVAL ( 0xFF7E , "Arabic_switch" ); KEYVAL ( 0xFF7E , "Greek_switch" ); KEYVAL ( 0xFF7E , "Hangul_switch" ); KEYVAL ( 0xFF7E , "Hebrew_switch" ); KEYVAL ( 0xFF7E , "ISO_Group_Shift" ); KEYVAL ( 0xFF7E , "kana_switch" ); KEYVAL ( 0xFF7E , "Mode_switch" ); KEYVAL ( 0xFF7E , "script_switch" ); KEYVAL ( 0xFF7F , "Num_Lock" ); KEYVAL ( 0xFF80 , "KP_Space" ); KEYVAL ( 0xFF89 , "KP_Tab" ); KEYVAL ( 0xFF8D , "KP_Enter" ); KEYVAL ( 0xFF91 , "KP_F1" ); KEYVAL ( 0xFF92 , "KP_F2" ); KEYVAL ( 0xFF93 , "KP_F3" ); KEYVAL ( 0xFF94 , "KP_F4" ); KEYVAL ( 0xFF95 , "KP_Home" ); KEYVAL ( 0xFF96 , "KP_Left" ); KEYVAL ( 0xFF97 , "KP_Up" ); KEYVAL ( 0xFF98 , "KP_Right" ); KEYVAL ( 0xFF99 , "KP_Down" ); KEYVAL ( 0xFF9A , "KP_Page_Up" ); KEYVAL ( 0xFF9A , "KP_Prior" ); KEYVAL ( 0xFF9B , "KP_Next" ); KEYVAL ( 0xFF9B , "KP_Page_Down" ); KEYVAL ( 0xFF9C , "KP_End" ); KEYVAL ( 0xFF9D , "KP_Begin" ); KEYVAL ( 0xFF9E , "KP_Insert" ); KEYVAL ( 0xFF9F , "KP_Delete" ); KEYVAL ( 0xFFAA , "KP_Multiply" ); KEYVAL ( 0xFFAB , "KP_Add" ); KEYVAL ( 0xFFAC , "KP_Separator" ); KEYVAL ( 0xFFAD , "KP_Subtract" ); KEYVAL ( 0xFFAE , "KP_Decimal" ); KEYVAL ( 0xFFAF , "KP_Divide" ); KEYVAL ( 0xFFB0 , "KP_0" ); KEYVAL ( 0xFFB1 , "KP_1" ); KEYVAL ( 0xFFB2 , "KP_2" ); KEYVAL ( 0xFFB3 , "KP_3" ); KEYVAL ( 0xFFB4 , "KP_4" ); KEYVAL ( 0xFFB5 , "KP_5" ); KEYVAL ( 0xFFB6 , "KP_6" ); KEYVAL ( 0xFFB7 , "KP_7" ); KEYVAL ( 0xFFB8 , "KP_8" ); KEYVAL ( 0xFFB9 , "KP_9" ); KEYVAL ( 0xFFBD , "KP_Equal" ); KEYVAL ( 0xFFBE , "F1" ); KEYVAL ( 0xFFBF , "F2" ); KEYVAL ( 0xFFC0 , "F3" ); KEYVAL ( 0xFFC1 , "F4" ); KEYVAL ( 0xFFC2 , "F5" ); KEYVAL ( 0xFFC3 , "F6" ); KEYVAL ( 0xFFC4 , "F7" ); KEYVAL ( 0xFFC5 , "F8" ); KEYVAL ( 0xFFC6 , "F9" ); KEYVAL ( 0xFFC7 , "F10" ); KEYVAL ( 0xFFC8 , "F11" ); KEYVAL ( 0xFFC8 , "L1" ); KEYVAL ( 0xFFC9 , "F12" ); KEYVAL ( 0xFFC9 , "L2" ); KEYVAL ( 0xFFCA , "F13" ); KEYVAL ( 0xFFCA , "L3" ); KEYVAL ( 0xFFCB , "F14" ); KEYVAL ( 0xFFCB , "L4" ); KEYVAL ( 0xFFCC , "F15" ); KEYVAL ( 0xFFCC , "L5" ); KEYVAL ( 0xFFCD , "F16" ); KEYVAL ( 0xFFCD , "L6" ); KEYVAL ( 0xFFCE , "F17" ); KEYVAL ( 0xFFCE , "L7" ); KEYVAL ( 0xFFCF , "F18" ); KEYVAL ( 0xFFCF , "L8" ); KEYVAL ( 0xFFD0 , "F19" ); KEYVAL ( 0xFFD0 , "L9" ); KEYVAL ( 0xFFD1 , "F20" ); KEYVAL ( 0xFFD1 , "L10" ); KEYVAL ( 0xFFD2 , "F21" ); KEYVAL ( 0xFFD2 , "R1" ); KEYVAL ( 0xFFD3 , "F22" ); KEYVAL ( 0xFFD3 , "R2" ); KEYVAL ( 0xFFD4 , "F23" ); KEYVAL ( 0xFFD4 , "R3" ); KEYVAL ( 0xFFD5 , "F24" ); KEYVAL ( 0xFFD5 , "R4" ); KEYVAL ( 0xFFD6 , "F25" ); KEYVAL ( 0xFFD6 , "R5" ); KEYVAL ( 0xFFD7 , "F26" ); KEYVAL ( 0xFFD7 , "R6" ); KEYVAL ( 0xFFD8 , "F27" ); KEYVAL ( 0xFFD8 , "R7" ); KEYVAL ( 0xFFD9 , "F28" ); KEYVAL ( 0xFFD9 , "R8" ); KEYVAL ( 0xFFDA , "F29" ); KEYVAL ( 0xFFDA , "R9" ); KEYVAL ( 0xFFDB , "F30" ); KEYVAL ( 0xFFDB , "R10" ); KEYVAL ( 0xFFDC , "F31" ); KEYVAL ( 0xFFDC , "R11" ); KEYVAL ( 0xFFDD , "F32" ); KEYVAL ( 0xFFDD , "R12" ); KEYVAL ( 0xFFDE , "F33" ); KEYVAL ( 0xFFDE , "R13" ); KEYVAL ( 0xFFDF , "F34" ); KEYVAL ( 0xFFDF , "R14" ); KEYVAL ( 0xFFE0 , "F35" ); KEYVAL ( 0xFFE0 , "R15" ); KEYVAL ( 0xFFE1 , "Shift_L" ); KEYVAL ( 0xFFE2 , "Shift_R" ); KEYVAL ( 0xFFE3 , "Control_L" ); KEYVAL ( 0xFFE4 , "Control_R" ); KEYVAL ( 0xFFE5 , "Caps_Lock" ); KEYVAL ( 0xFFE6 , "Shift_Lock" ); KEYVAL ( 0xFFE7 , "Meta_L" ); KEYVAL ( 0xFFE8 , "Meta_R" ); KEYVAL ( 0xFFE9 , "Alt_L" ); KEYVAL ( 0xFFEA , "Alt_R" ); KEYVAL ( 0xFFEB , "Super_L" ); KEYVAL ( 0xFFEC , "Super_R" ); KEYVAL ( 0xFFED , "Hyper_L" ); KEYVAL ( 0xFFEE , "Hyper_R" ); KEYVAL ( 0xFFFF , "Delete" ); /* 0xFFFFFF "VoidSymbol" */ } desmume-0.9.11/src/gtk-glade/Makefile.am0000755000000000000000000000254512467662066016451 0ustar rootrootSUBDIRS = doc include $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(GTKGLEXT_CFLAGS) $(LIBGLADE_CFLAGS) \ $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) \ -DDATADIR=\"$(gladedir)/\" -DLOCALEDIR=\"$(localedir)\" AM_LDFLAGS += -rdynamic $(INTLLIBS) EXTRA_DIST = $(glade_DATA) desmume-glade.desktop Applicationsdir = $(datadir)/applications Applications_DATA = desmume-glade.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = glade/DeSmuME.xpm gladedir = $(datadir)/desmume/glade glade_DATA = glade/DeSmuMe_Dtools.glade glade/DeSmuMe.glade glade/DeSmuME.xpm bin_PROGRAMS = desmume-glade desmume_glade_SOURCES = \ globals.h glade-xml.cpp \ callbacks.cpp callbacks.h callbacks_IO.cpp callbacks_IO.h \ desmume.cpp desmume.h \ keyval_names.cpp keyval_names.h main.cpp gdk_gl.cpp gdk_gl.h \ dTools/callbacks_1_ioregs.cpp dTools/callbacks_2_memview.cpp \ dTools/callbacks_3_palview.cpp dTools/callbacks_4_tileview.cpp \ dTools/callbacks_dtools.h \ dTools/dTools_display.h \ gdk_3Demu.cpp gdk_3Demu.h \ ../sndsdl.h ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp desmume_glade_LDADD = ../libdesmume.a \ $(SDL_LIBS) $(GTKGLEXT_LIBS) $(LIBGLADE_LIBS) \ $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) \ $(LIBSOUNDTOUCH_LIBS) if HAVE_GDB_STUB desmume_glade_LDADD += ../gdbstub/libgdbstub.a endif desmume-0.9.11/src/gtk-glade/doc/0000755000000000000000000000000012467663414015147 5ustar rootrootdesmume-0.9.11/src/gtk-glade/doc/Makefile.in0000644000000000000000000003655512467662234017231 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/gtk-glade/doc DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = desmume-glade.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk-glade/doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk-glade/doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/gtk-glade/doc/desmume-glade.10000755000000000000000000000525512467662066017756 0ustar rootroot.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH DESMUME 1 "June 26, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME desmume-glade \- Nintendo DS emulator .SH SYNOPSIS .B desmume-glade .RI [ options ] " files" ... .SH DESCRIPTION This manual page documents briefly the .B desmume-glade program .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBdesmume\fP is a Nintendo DS emulator running homebrew demos and commercial games. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-load-slot=NUM Loads savegame from slot NUM .TP .B \-\-soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. .TP .B \-\-3d-engine=ENGINE Select available 3d emulation: .RS 0 = 3d disabled .RE .RS 1 = internal desmume software rasterizer (default) .RE .RS 2 = osmesa or gtkglext opengl (if available, depending on compilation options, see desmume \-\-help) .RE .TP .B \-\-disable-limiter Disables the 60 fps limiter .TP .B \-\-arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port .TP .B \-\-arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of program. .SH INPUT Mouse cursor acts as stylus, mouse click replaces stylus touch. .PP Keyboard can be configured and by default works as follows: .RS F1-F10 load savegame from slot 1-10 .RE .RS Shift+F1-F10 save game to slot 1-10 .RE .RS Non-keypad arrows act as d-pad .RE .RS z = A .RE .RS x = B .RE .RS a = Y .RE .RS s = X .RE .RS q = L .RE .RS w = R .RE .RS Enter = START .RE .RS Left Shift = SELECT .RE .RS Backspace = LID .RE .PP Desmume accepts joystick events, which can be configured by user. .SH AUTHOR desmume was written by DeSmuME team (http://sourceforge.net/projects/desmume). .PP This manual page was written by Pascal Giard , for the Debian project (but may be used by others). desmume-0.9.11/src/gtk-glade/doc/Makefile.am0000755000000000000000000000004012467662066017202 0ustar rootrootdist_man_MANS = desmume-glade.1 desmume-0.9.11/src/gtk-glade/gdk_gl.h0000755000000000000000000000276412467662066016020 0ustar rootroot/* gdk_gl.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GDKGL_H__ #define __GDKGL_H__ #include "globals.h" #ifdef GTKGLEXT_AVAILABLE #include #include #include #include #endif BOOL my_gl_Begin (int screen); void my_gl_End (int screen); void my_gl_Clear(int screen); void my_gl_DrawBeautifulQuad( void); void my_gl_Identity( void); void init_GL_capabilities( int use_software_convert); void init_GL(GtkWidget * widget, int screen, int share_num); int init_GL_free_s(GtkWidget * widget, int share_num); int init_GL_free(GtkWidget * widget); void reshape (GtkWidget * widget, int screen); gboolean screen (GtkWidget * widget, int off); #endif desmume-0.9.11/src/gtk-glade/callbacks.cpp0000755000000000000000000004067212467662066017043 0ustar rootroot/* callbacks.c - this file is part of DeSmuME * * Copyright (C) 2007-2015 DeSmuME Team * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks.h" #include "../GPU.h" #define SAVESTATE_SLOT(x) ((x) < 10 ? (x) : 0) /* globals */ int Frameskip = 0; gboolean ScreenRightForce=FALSE; gboolean ScreenRight=FALSE; gboolean ScreenGap=FALSE; gboolean ScreenNoGap=FALSE; gboolean ScreenInvert=FALSE; /* ******** Savestate menu items handling ******** */ static void set_menuitem_label(GtkWidget * w, char * text ) { GtkLabel * child; if ( GTK_BIN(w)->child ) { child = (GtkLabel*)GTK_BIN(w)->child; gtk_label_set_text(child, text); } } static void clear_savestate_menu(const char * cb_name, u8 num) { GtkWidget * w; char cb[40]; char text[40]; sprintf( cb, "%s%d", cb_name, num); sprintf( text, _("State %d (empty)"), num); w = glade_xml_get_widget(xml, cb); set_menuitem_label( w, text ); } static void update_savestate_menu(const char * cb_name, u8 num) { GtkWidget * w; char cb[40]; snprintf( cb, 39, "%s%d", cb_name, num); w = glade_xml_get_widget(xml, cb); set_menuitem_label( w, savestates[SAVESTATE_SLOT(num)].date ); } static void update_savestates_menu() { u8 i; for( i = 1; i <= NB_STATES; i++ ) { if( savestates[SAVESTATE_SLOT(i)].exists == TRUE ) { update_savestate_menu("loadstate", i); update_savestate_menu("savestate", i); } else { clear_savestate_menu("loadstate", i); clear_savestate_menu("savestate", i); } } } static void update_savestate(u8 num) { desmume_pause(); savestate_slot(SAVESTATE_SLOT(num)); update_savestate_menu("savestate", num); update_savestate_menu("loadstate", num); desmume_resume(); } /* inline & protos */ inline void SET_SENSITIVE(const gchar *w, gboolean b) { gtk_widget_set_sensitive( glade_xml_get_widget(xml, w), TRUE); } void enable_rom_features() { scan_savestates(); update_savestates_menu(); SET_SENSITIVE("menu_exec", TRUE); SET_SENSITIVE("menu_pause", TRUE); SET_SENSITIVE("menu_reset", TRUE); SET_SENSITIVE("wgt_Exec", TRUE); SET_SENSITIVE("wgt_Reset", TRUE); } static void MAINWINDOW_RESIZE() { GtkWidget * spacer1 = glade_xml_get_widget(xml, "misc_sep3"); GtkWidget * spacer2 = glade_xml_get_widget(xml, "misc_sep4"); int dim1,dim2; BOOL rotate = (ScreenRotate==90.0 || ScreenRotate==270.0 ); dim1 = dim2 = 66 * ScreenCoeff_Size[0]; /* sees whether we want a gap */ if (!ScreenGap) dim1 = dim2 = -1; if (ScreenNoGap) { gtk_widget_hide (spacer1); gtk_widget_hide (spacer2); } else { gtk_widget_show (spacer1); gtk_widget_show (spacer2); } if (ScreenRight == rotate) { if (ScreenRight) dim2 = -1; else dim1 = -1; } else { dim1 = dim2 = -1; } gtk_widget_set_usize(spacer1, dim1, -1); gtk_widget_set_usize(spacer2, -1, dim2); gtk_window_resize ((GtkWindow*)pWindow,1,1); } /* MENU FILE ***** ***** ***** ***** */ void inline ADD_FILTER(GtkWidget * filech, const char * pattern, const char * name) { GtkFileFilter *pFilter; pFilter = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter, pattern); gtk_file_filter_set_name(pFilter, name); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(filech), pFilter); } static void file_open() { desmume_pause(); GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sChemin; pParent = GTK_WIDGET(pWindow); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new(_("Open..."), GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); /* On limite les actions a cette fenetre */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); ADD_FILTER(pFileSelection, "*.nds", _("Nds binary (.nds)")); ADD_FILTER(pFileSelection, "*.ds.gba", _("Nds binary with loader (.ds.gba)")); ADD_FILTER(pFileSelection, "*", _("All files")); //ADD_FILTER(pFileSelection, "*.zip", "Nds zipped binary"); /* Affichage fenetre*/ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: /* Recuperation du chemin */ sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(desmume_open((const char*)sChemin) < 0) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Unable to load :\n%s"), sChemin); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { desmume_resume(); enable_rom_features(); } g_free(sChemin); break; default: break; } gtk_widget_destroy(pFileSelection); } void on_menu_open_activate (GtkMenuItem *menuitem, gpointer user_data) { file_open();} void on_menu_quit_activate (GtkMenuItem *menuitem, gpointer user_data) { gtk_main_quit(); } #define SCREENS_PIXEL_SIZE 98304 static void Printscreen() { GdkPixbuf *screenshot; gchar *filename; GError *error = NULL; u8 *rgb; static int seq = 0; rgb = (u8 *) malloc(SCREENS_PIXEL_SIZE*3); if (!rgb) return; for (int i = 0; i < SCREENS_PIXEL_SIZE; i++) { rgb[(i * 3) + 0] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 0) & 0x1f) << 3; rgb[(i * 3) + 1] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 5) & 0x1f) << 3; rgb[(i * 3) + 2] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 10) & 0x1f) << 3; } screenshot = gdk_pixbuf_new_from_data(rgb, GDK_COLORSPACE_RGB, FALSE, 8, 256, 192*2, 256*3, NULL, NULL); filename = g_strdup_printf("./desmume-screenshot-%d.png", seq); gdk_pixbuf_save(screenshot, filename, "png", &error, NULL); if (error) { g_error_free (error); g_printerr("Failed to save %s", filename); } else { seq++; } free(rgb); g_object_unref(screenshot); g_free(filename); } void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { Printscreen(); } /* MENU SAVES ***** ***** ***** ***** */ void on_loadstateXX_activate (GtkMenuItem *m, gpointer d) { int slot = dyn_CAST(int,d); loadstate_slot(SAVESTATE_SLOT(slot)); } void on_savestateXX_activate (GtkMenuItem *m, gpointer d) { int slot = dyn_CAST(int,d); update_savestate(slot); } void on_savetypeXX_activate (GtkMenuItem *m, gpointer d) { int type = dyn_CAST(int,d); desmume_savetype(type); } /* MENU EMULATION ***** ***** ***** ***** */ void on_menu_exec_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_resume(); } void on_menu_pause_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_pause(); } void on_menu_reset_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_reset(); } void on_menu_layers_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want to hide or show the checkbox for the layers */ GtkWidget * w1 = glade_xml_get_widget(xml, "wvb_1_Main"); GtkWidget * w2 = glade_xml_get_widget(xml, "wvb_2_Sub"); if (gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem)==TRUE) { gtk_widget_show(w1); gtk_widget_show(w2); } else { gtk_widget_hide(w1); gtk_widget_hide(w2); } /* pack the window */ MAINWINDOW_RESIZE(); } /* SUBMENU FRAMESKIP ***** ***** ***** ***** */ void on_fsXX_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = dyn_CAST(int,user_data); // printf ("setting FS %d %d\n", Frameskip, user_data); } /* SUBMENU SIZE ***** ***** ***** ***** */ static void gtk_table_reattach(GtkTable * table, GtkWidget * w, guint left_attach, guint right_attach, guint top_attach, guint bottom_attach, GtkAttachOptions xoptions, GtkAttachOptions yoptions, guint xpadding, guint ypadding) { GList *list; for (list = table->children; list; list = list->next) { GtkTableChild *table_child; table_child = (GtkTableChild *) list->data; if (table_child->widget == w) { table_child->left_attach = left_attach; table_child->right_attach = right_attach; table_child->top_attach = top_attach; table_child->bottom_attach = bottom_attach; table_child->xexpand = (xoptions & GTK_EXPAND) != 0; table_child->xshrink = (xoptions & GTK_SHRINK) != 0; table_child->xfill = (xoptions & GTK_FILL) != 0; table_child->xpadding = xpadding; table_child->yexpand = (yoptions & GTK_EXPAND) != 0; table_child->yshrink = (yoptions & GTK_SHRINK) != 0; table_child->yfill = (yoptions & GTK_FILL) != 0; table_child->ypadding = ypadding; break; } } } static void rightscreen(BOOL apply) { GtkWidget *chk = glade_xml_get_widget(xml, "wvb_2_Sub"); GtkTable *table = (GtkTable *)glade_xml_get_widget(xml, "table_layout"); ScreenRight = apply || ScreenRightForce; if (ScreenRight) { /* we want to change the layout, lower screen goes right */ gtk_table_reattach(table, pDrawingArea2, 3,4, 0,1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); gtk_table_reattach(table, chk, 4,5, 0,1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); } else { /* we want to change the layout, lower screen goes down */ gtk_table_reattach(table, pDrawingArea2, 1,2, 2,3, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); gtk_table_reattach(table, chk, 0,1, 2,3, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); ScreenRight = FALSE; } gtk_widget_queue_resize (GTK_WIDGET (table)); /* pack the window */ MAINWINDOW_RESIZE(); } int H=192, W=256; void resize (float Size1, float Size2) { // not ready yet to handle different zoom factors Size2 = Size1; /* we want to scale drawing areas by a factor (1x,2x or 3x) */ gtk_widget_set_size_request (pDrawingArea, W * Size1, H * Size1); gtk_widget_set_size_request (pDrawingArea2, W * Size2, H * Size2); ScreenCoeff_Size[0] = Size1; ScreenCoeff_Size[1] = Size2; /* remove artifacts */ black_screen(); /* pack the window */ MAINWINDOW_RESIZE(); } void rotate(float angle) { BOOL rotated; if (angle >= 360.0) angle -= 360.0; ScreenRotate = angle; rotated = (ScreenRotate==90.0 || ScreenRotate==270.0); ScreenInvert = (ScreenRotate >= 180.0); if (rotated) { H=256; W=192; } else { W=256; H=192; } rightscreen(rotated); resize(ScreenCoeff_Size[0],ScreenCoeff_Size[1]); } void on_sizeXX_activate (GtkMenuItem *menuitem, gpointer user_data) { float f = dyn_CAST(float,user_data); // printf("setting ZOOM %f\n",f); resize(f,f); } /* MENU CONFIG ***** ***** ***** ***** */ void on_menu_controls_activate (GtkMenuItem *menuitem, gpointer user_data) { edit_controls(); } /* Show joystick controls configuration dialog FIXME: sdl doesn't detect unplugged joysticks!! */ void on_menu_joy_controls_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkDialog * dlg; GtkDialog * msgbox; char * text; /* At least one joystick connected? Can't configure joystick if SDL Event loop is already running. */ if( (nbr_joy < 1) || desmume_running() ) { if( nbr_joy < 1 ) text = _("You don't have any joystick!"); else text = _("Can't configure joystick while the game is running!"); dlg = (GtkDialog*)glade_xml_get_widget(xml, "wMainW"); msgbox = (GtkDialog*) gtk_message_dialog_new((GtkWindow*)dlg, (GtkDialogFlags) (GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT), GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s", text); g_signal_connect(G_OBJECT(msgbox), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_dialog_run( msgbox ); } else { dlg = (GtkDialog*)glade_xml_get_widget(xml, "wJoyConfDlg"); init_joy_labels(); gtk_dialog_run(dlg); } } void on_menu_audio_on_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want set audio emulation ON or OFF */ if (gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem)) { SPU_Pause(0); } else { SPU_Pause(1); } } void on_menu_gapscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want to add a gap between screens */ ScreenGap = gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem); /* pack the window */ MAINWINDOW_RESIZE(); } void on_menu_nogap_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we'll make both gaps visibility false */ ScreenNoGap = gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem); /* pack the window */ MAINWINDOW_RESIZE(); } void on_menu_rightscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { ScreenRightForce=gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem); rightscreen(ScreenRightForce); } void on_menu_rotatescreen_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want to rotate the screen */ float angle = dyn_CAST(float,user_data); rotate(angle); } /* MENU TOOLS ***** ***** ***** ***** */ void on_menu_IO_regs_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_1_IOregs"); gtk_widget_show(dlg); } void on_menu_memview_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_2_MemView"); gtk_widget_show(dlg); } void on_menu_palview_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_3_PalView"); gtk_widget_show(dlg); } #ifdef GTKGLEXT_AVAILABLE void on_menu_tileview_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_4_TileView"); gtk_widget_show(dlg); } #else void on_menu_tileview_activate (GtkMenuItem *menuitem, gpointer user_data) { g_printerr("You need gtkglext for the tile viewer\n"); } #endif void on_menu_wtoolsXX_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * w = (GtkWidget *) user_data; gtk_widget_show(w); } /* MENU ? ***** ***** ***** ***** */ /* About dialog FIXME: Add proper copyright */ void on_menu_apropos_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * wAbout = glade_xml_get_widget(xml, "wAboutDlg"); gtk_about_dialog_set_version((GtkAboutDialog *)wAbout, VERSION); gtk_widget_show(wAbout); } /* TOOLBAR ***** ***** ***** ***** */ void on_wgt_Open_clicked (GtkToolButton *toolbutton, gpointer user_data) { file_open(); } void on_wgt_Reset_clicked (GtkToolButton *toolbutton, gpointer user_data) { desmume_reset(); } void on_wgt_Quit_clicked (GtkToolButton *toolbutton, gpointer user_data) { gtk_main_quit(); } void on_wgt_Exec_toggled (GtkToggleToolButton *toggletoolbutton, gpointer user_data) { if (gtk_toggle_tool_button_get_active(toggletoolbutton)==TRUE) desmume_resume(); else desmume_pause(); } /* LAYERS ***** ***** ***** ***** */ static void change_bgx_layer(int layer, gboolean state, NDS_Screen scr) { //if(!desmume_running()) return; if(state==TRUE) { GPU_addBack(scr.gpu, layer); } else { GPU_remove(scr.gpu, layer); } //fprintf(stderr,"Changed Layer %s to %d\n",layer,state); } void on_wc_1_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { int layer = dyn_CAST(int,user_data); change_bgx_layer(layer, gtk_toggle_button_get_active(togglebutton), MainScreen); } void on_wc_2_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { int layer = dyn_CAST(int,user_data); change_bgx_layer(layer, gtk_toggle_button_get_active(togglebutton), SubScreen); } desmume-0.9.11/src/aggdraw.cpp0000755000000000000000000005515312467662066014701 0ustar rootroot/* The MIT License Copyright (C) 2009-2010 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 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 #include "GPU.h" #include "NDSSystem.h" #include "aggdraw.h" #include "agg_renderer_base.h" #include "agg_renderer_primitives.h" #include "agg_renderer_scanline.h" #include "agg_bounding_rect.h" #include "agg_trans_affine.h" #include "agg_path_storage.h" #include "agg_color_rgba.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_u.h" #include "agg_renderer_scanline.h" #include "agg_scanline_p.h" //raster text #include "agg_glyph_raster_bin.h" #include "agg_embedded_raster_fonts.h" #include "agg_renderer_raster_text.h" #include "ctrl/agg_bezier_ctrl.h" #include "platform/agg_platform_support.h" #include "agg_pattern_filters_rgba.h" #include "agg_renderer_outline_image.h" #include "agg_rasterizer_outline_aa.h" #include "agg_image_accessors.h" #include "agg_span_interpolator_linear.h" #include "agg_span_image_filter_rgb.h" #include "agg_span_image_filter_rgba.h" #include "agg_span_image_filter_gray.h" #include "agg_span_allocator.h" typedef std::map TAgg_Font_Table; static TAgg_Font_Table font_table; font_type fonts_list[] = { { agg::gse4x6, "gse4x6" }, { agg::gse4x8, "gse4x8" }, { agg::gse5x7, "gse5x7" }, { agg::gse5x9, "gse5x9" }, { agg::gse6x9, "gse6x9" }, { agg::gse6x12, "gse6x12" }, { agg::gse7x11, "gse7x11" }, { agg::gse7x11_bold, "gse7x11_bold" }, { agg::gse7x15, "gse7x15" }, { agg::gse7x15_bold, "gse7x15_bold" }, { agg::gse8x16, "gse8x16" }, { agg::gse8x16_bold, "gse8x16_bold" }, { agg::mcs11_prop, "mcs11_prop" }, { agg::mcs11_prop_condensed, "mcs11_prop_condensed" }, { agg::mcs12_prop, "mcs12_prop" }, { agg::mcs13_prop, "mcs13_prop" }, { agg::mcs5x10_mono, "mcs5x10_mono" }, { agg::mcs5x11_mono, "mcs5x11_mono" }, { agg::mcs6x10_mono, "mcs6x10_mono" }, { agg::mcs6x11_mono, "mcs6x11_mono" }, { agg::mcs7x12_mono_high, "mcs7x12_mono_high" }, { agg::mcs7x12_mono_low, "mcs7x12_mono_low" }, { agg::verdana12, "verdana12" }, { agg::verdana12_bold, "verdana12_bold" }, { agg::verdana13, "verdana13" }, { agg::verdana13_bold, "verdana13_bold" }, { agg::verdana14, "verdana14" }, { agg::verdana14_bold, "verdana14_bold" }, { agg::verdana16, "verdana16" }, { agg::verdana16_bold, "verdana16_bold" }, { agg::verdana17, "verdana17" }, { agg::verdana17_bold, "verdana17_bold" }, { agg::verdana18, "verdana18" }, { agg::verdana18_bold, "verdana18_bold" }, }; int font_Nums = ARRAY_SIZE(fonts_list); const agg::int8u* AggDrawTarget::lookupFont(const std::string& name) { TAgg_Font_Table::iterator it(font_table.find(name)); if(it == font_table.end()) return NULL; else return it->second; } static void Agg_init_fonts() { for(u32 i=0;isetFont("verdana18_bold"); } void AggDraw_Desmume::setTarget(AggTarget newTarget) { target = targets[newTarget]; } ////temporary, just for testing the lib //void AGGDraw() { //// // aggDraw.setTarget(AggTarget_Screen); // //// aggDraw.target->clear(); //// //// aggDraw.target->clipBox(0,0,255,383); //// // aggDraw.target->lineColor(0, 0, 255, 128); // aggDraw.target->fillColor(0, 0, 255, 128); //// //aggDraw.target->noFill(); // aggDraw.target->lineWidth(1.0); // aggDraw.target->roundedRect(10,30,256-10,192-10,4); //// //// aggDraw.target->setFont("verdana18_bold"); //// aggDraw.target->renderText(60,60, "testing testing testing"); //// //// // Gradients (Aqua Buttons) //// //======================================= ////// m_graphics.font("Verdana", 20.0, false, false, TAGG2D::VectorFontCache); //// double xb1 = 10; //// double yb1 = 80; //// double xb2 = xb1 + 150; //// double yb2 = yb1 + 36; //// //// aggDraw.target->fillColor(0,50,180,180); //// aggDraw.target->lineColor(0,0,80, 255); //// aggDraw.target->lineWidth(1.0); //// aggDraw.target->roundedRect(xb1, yb1, xb2, yb2, 12, 18); //// //// aggDraw.target->lineColor(0,0,0,0); //// aggDraw.target->fillLinearGradient(xb1, yb1, xb1, yb1+30, //// agg::rgba8(100,200,255,255), //// agg::rgba8(255,255,255,0)); //// aggDraw.target->roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); //// //// aggDraw.target->fillColor(0,0,50, 200); //// aggDraw.target->noLine(); /////* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); //// m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Button", true, 0.0, 0.0); ////*/ //// aggDraw.target->fillLinearGradient(xb1, yb2-20, xb1, yb2-3, //// agg::rgba8(0, 0, 255,0), //// agg::rgba8(100,255,255,255)); //// aggDraw.target->roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18); //// //// // Basic Shapes -- Ellipse //// //=========================================== //// aggDraw.target->lineWidth(3.5); //// aggDraw.target->lineColor(20, 80, 80); //// aggDraw.target->fillColor(200, 255, 80, 200); //// aggDraw.target->ellipse(150, 200, 50, 90); //// //// // Paths //// //=========================================== //// aggDraw.target->resetPath(); //// aggDraw.target->fillColor(255, 0, 0, 100); //// aggDraw.target->lineColor(0, 0, 255, 100); //// aggDraw.target->lineWidth(2); //// aggDraw.target->moveTo(300/2, 200/2); //// aggDraw.target->horLineRel(-150/2); //// aggDraw.target->arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2); //// aggDraw.target->closePolygon(); //// aggDraw.target->drawPath(); //// //// aggDraw.target->resetPath(); //// aggDraw.target->fillColor(255, 255, 0, 100); //// aggDraw.target->lineColor(0, 0, 255, 100); //// aggDraw.target->lineWidth(2); //// aggDraw.target->moveTo(275/2, 175/2); //// aggDraw.target->verLineRel(-150/2); //// aggDraw.target->arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2); //// aggDraw.target->closePolygon(); //// aggDraw.target->drawPath(); //// //// aggDraw.target->resetPath(); //// aggDraw.target->noFill(); //// aggDraw.target->lineColor(127, 0, 0); //// aggDraw.target->lineWidth(5); //// aggDraw.target->moveTo(600/2, 350/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->arcRel(25/2, 25/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->arcRel(25/2, 50/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->arcRel(25/2, 75/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50, -25); //// aggDraw.target->arcRel(25/2, 100/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->drawPath(); //} //// // ////======================== ////testing stufff // //int width = 256; //int height = 384; // //Agg2D m_graphics; // //void AGGDraw(unsigned char * buffer) // { // m_graphics.attach(buffer, // 256, // 384, // 512); // // m_graphics.clearAll(255, 255, 255); // //m_graphics.clearAll(0, 0, 0); // // //m_graphics.blendMode(TAGG2D::BlendSub); // //m_graphics.blendMode(TAGG2D::BlendAdd); // // m_graphics.antiAliasGamma(1.4); // // // Set flipText(true) if you have the Y axis upside down. // //m_graphics.flipText(true); // // // // ClipBox. // //m_graphics.clipBox(50, 50, rbuf_window().width() - 50, rbuf_window().height() - 50); // // // Transfornations - Rotate around (300,300) to 5 degree // //m_graphics.translate(-300, -300); // //m_graphics.rotate(TAGG2D::deg2Rad(5.0)); // //m_graphics.translate(300, 300); // // // Viewport - set 0,0,600,600 to the actual window size // // preserving aspect ratio and placing the viewport in the center. // // To ignore aspect ratio use TAGG2D::Anisotropic // // Note that the viewport just adds transformations to the current // // affine matrix. So that, set the viewport *after* all transformations! // m_graphics.viewport(0, 0, 600, 600, // 0, 0, width, height, // //TAGG2D::Anisotropic); // TAGG2D::XMidYMid); // // // // Rounded Rect // m_graphics.lineColor(0, 0, 0); // m_graphics.noFill(); // m_graphics.roundedRect(0.5, 0.5, 600-0.5, 600-0.5, 20.0); ///* // // // Reglar Text // m_graphics.font("Times New Roman", 14.0, false, false); // m_graphics.fillColor(0, 0, 0); // m_graphics.noLine(); // m_graphics.text(100, 20, "Regular Raster Text -- Fast, but can't be rotated"); // // // Outlined Text // m_graphics.font("Times New Roman", 50.0, false, false, TAGG2D::VectorFontCache); // m_graphics.lineColor(50, 0, 0); // m_graphics.fillColor(180, 200, 100); // m_graphics.lineWidth(1.0); // m_graphics.text(100.5, 50.5, "Outlined Text"); // // // Text Alignment // m_graphics.line(250.5-150, 150.5, 250.5+150, 150.5); // m_graphics.line(250.5, 150.5-20, 250.5, 150.5+20); // m_graphics.line(250.5-150, 200.5, 250.5+150, 200.5); // m_graphics.line(250.5, 200.5-20, 250.5, 200.5+20); // m_graphics.line(250.5-150, 250.5, 250.5+150, 250.5); // m_graphics.line(250.5, 250.5-20, 250.5, 250.5+20); // m_graphics.line(250.5-150, 300.5, 250.5+150, 300.5); // m_graphics.line(250.5, 300.5-20, 250.5, 300.5+20); // m_graphics.line(250.5-150, 350.5, 250.5+150, 350.5); // m_graphics.line(250.5, 350.5-20, 250.5, 350.5+20); // m_graphics.line(250.5-150, 400.5, 250.5+150, 400.5); // m_graphics.line(250.5, 400.5-20, 250.5, 400.5+20); // m_graphics.line(250.5-150, 450.5, 250.5+150, 450.5); // m_graphics.line(250.5, 450.5-20, 250.5, 450.5+20); // m_graphics.line(250.5-150, 500.5, 250.5+150, 500.5); // m_graphics.line(250.5, 500.5-20, 250.5, 500.5+20); // m_graphics.line(250.5-150, 550.5, 250.5+150, 550.5); // m_graphics.line(250.5, 550.5-20, 250.5, 550.5+20); //*/ ///* // m_graphics.fillColor(100, 50, 50); // m_graphics.noLine(); // //m_graphics.textHints(false); // m_graphics.font("Times New Roman", 40.0, false, false, TAGG2D::VectorFontCache); // // m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignBottom); // m_graphics.text(250.0, 150.0, "Left-Bottom", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignBottom); // m_graphics.text(250.0, 200.0, "Center-Bottom", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignBottom); // m_graphics.text(250.0, 250.0, "Right-Bottom", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignCenter); // m_graphics.text(250.0, 300.0, "Left-Center", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); // m_graphics.text(250.0, 350.0, "Center-Center", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignCenter); // m_graphics.text(250.0, 400.0, "Right-Center", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignTop); // m_graphics.text(250.0, 450.0, "Left-Top", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignTop); // m_graphics.text(250.0, 500.0, "Center-Top", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignTop); // m_graphics.text(250.0, 550.0, "Right-Top", true, 0, 0); // //*/ // // Gradients (Aqua Buttons) // //======================================= // m_graphics.font("Verdana", 20.0, false, false, TAGG2D::VectorFontCache); // double xb1 = 400; // double yb1 = 80; // double xb2 = xb1 + 150; // double yb2 = yb1 + 36; // // m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); // m_graphics.lineColor(TAGG2D::Color(0,0,80, 255)); // m_graphics.lineWidth(1.0); // m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); // // m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); // m_graphics.fillLinearGradient(xb1, yb1, xb1, yb1+30, // TAGG2D::Color(100,200,255,255), // TAGG2D::Color(255,255,255,0)); // m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); // // m_graphics.fillColor(TAGG2D::Color(0,0,50, 200)); // m_graphics.noLine(); ///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); // m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Button", true, 0.0, 0.0); //*/ // m_graphics.fillLinearGradient(xb1, yb2-20, xb1, yb2-3, // TAGG2D::Color(0, 0, 255,0), // TAGG2D::Color(100,255,255,255)); // m_graphics.roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18); // // // // Aqua Button Pressed // xb1 = 400; // yb1 = 30; // xb2 = xb1 + 150; // yb2 = yb1 + 36; // // m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); // m_graphics.lineColor(TAGG2D::Color(0,0,0, 255)); // m_graphics.lineWidth(2.0); // m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); // // m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); // m_graphics.fillLinearGradient(xb1, yb1+2, xb1, yb1+25, // TAGG2D::Color(60, 160,255,255), // TAGG2D::Color(100,255,255,0)); // m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); // // m_graphics.fillColor(TAGG2D::Color(0,0,50, 255)); // m_graphics.noLine(); ///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); // m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Pressed", 0.0, 0.0); //*/ // m_graphics.fillLinearGradient(xb1, yb2-25, xb1, yb2-5, // TAGG2D::Color(0, 180,255,0), // TAGG2D::Color(0, 200,255,255)); // m_graphics.roundedRect(xb1+3, yb2-25, xb2-3, yb2-2, 1, 1, 9, 18); // // // // // // Basic Shapes -- Ellipse // //=========================================== // m_graphics.lineWidth(3.5); // m_graphics.lineColor(20, 80, 80); // m_graphics.fillColor(200, 255, 80, 200); // m_graphics.ellipse(450, 200, 50, 90); // // // // Paths // //=========================================== // m_graphics.resetPath(); // m_graphics.fillColor(255, 0, 0, 100); // m_graphics.lineColor(0, 0, 255, 100); // m_graphics.lineWidth(2); // m_graphics.moveTo(300/2, 200/2); // m_graphics.horLineRel(-150/2); // m_graphics.arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2); // m_graphics.closePolygon(); // m_graphics.drawPath(); // // m_graphics.resetPath(); // m_graphics.fillColor(255, 255, 0, 100); // m_graphics.lineColor(0, 0, 255, 100); // m_graphics.lineWidth(2); // m_graphics.moveTo(275/2, 175/2); // m_graphics.verLineRel(-150/2); // m_graphics.arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2); // m_graphics.closePolygon(); // m_graphics.drawPath(); // // // m_graphics.resetPath(); // m_graphics.noFill(); // m_graphics.lineColor(127, 0, 0); // m_graphics.lineWidth(5); // m_graphics.moveTo(600/2, 350/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.arcRel(25/2, 25/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.arcRel(25/2, 50/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.arcRel(25/2, 75/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50, -25); // m_graphics.arcRel(25/2, 100/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.drawPath(); // // // // Master Alpha. From now on everything will be translucent // //=========================================== // m_graphics.masterAlpha(0.85); // // // // Image Transformations // //=========================================== ///* TAGG2D::Image img(rbuf_img(0).buf(), // rbuf_img(0).width(), // rbuf_img(0).height(), // rbuf_img(0).stride()); // m_graphics.imageFilter(TAGG2D::Bilinear); // // //m_graphics.imageResample(TAGG2D::NoResample); // //m_graphics.imageResample(TAGG2D::ResampleAlways); // m_graphics.imageResample(TAGG2D::ResampleOnZoomOut); // // // Set the initial image blending operation as BlendDst, that actually // // does nothing. // //----------------- // m_graphics.imageBlendMode(TAGG2D::BlendDst); // // // // Transform the whole image to the destination rectangle // //----------------- // //m_graphics.transformImage(img, 450, 200, 595, 350); // // // Transform the rectangular part of the image to the destination rectangle // //----------------- // //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, // // 450, 200, 595, 350); // // // Transform the whole image to the destination parallelogram // //----------------- // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImage(img, parl); // // // Transform the rectangular part of the image to the destination parallelogram // //----------------- // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, parl); // // // Transform image to the destination path. The scale is determined by a rectangle // //----------------- // //m_graphics.resetPath(); // //m_graphics.moveTo(450, 200); // //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // //m_graphics.lineTo(470, 340); // //m_graphics.transformImagePath(img, 450, 200, 595, 350); // // // // Transform image to the destination path. // // The scale is determined by a rectangle // //----------------- // m_graphics.resetPath(); // m_graphics.moveTo(450, 200); // m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // m_graphics.lineTo(470, 340); // m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, // 450, 200, 595, 350); // // // Transform image to the destination path. // // The transformation is determined by a parallelogram // //m_graphics.resetPath(); // //m_graphics.moveTo(450, 200); // //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // //m_graphics.lineTo(470, 340); // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImagePath(img, parl); // // // Transform the rectangular part of the image to the destination path. // // The transformation is determined by a parallelogram // //m_graphics.resetPath(); // //m_graphics.moveTo(450, 200); // //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // //m_graphics.lineTo(470, 340); // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, parl); //*/ // // // Add/Sub/Contrast Blending Modes // m_graphics.noLine(); // m_graphics.fillColor(70, 70, 0); // m_graphics.blendMode(TAGG2D::BlendAdd); // m_graphics.ellipse(500, 280, 20, 40); // // m_graphics.fillColor(255, 255, 255); // m_graphics.blendMode(TAGG2D::BlendContrast); // m_graphics.ellipse(500+40, 280, 20, 40); // // // // // Radial gradient. // m_graphics.blendMode(TAGG2D::BlendAlpha); // m_graphics.fillRadialGradient(400, 500, 40, // TAGG2D::Color(255, 255, 0, 0), // TAGG2D::Color(0, 0, 127), // TAGG2D::Color(0, 255, 0, 0)); // m_graphics.ellipse(400, 500, 40, 40); // // } // desmume-0.9.11/src/rasterize.h0000755000000000000000000000411312467662066014730 0ustar rootroot/* Copyright (C) 2009-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _RASTERIZE_H_ #define _RASTERIZE_H_ #include "render3D.h" #include "gfx3d.h" extern GPU3DInterface gpu3DRasterize; union FragmentColor { u32 color; struct { u8 r,g,b,a; }; }; inline FragmentColor MakeFragmentColor(u8 r, u8 g,u8 b,u8 a) { FragmentColor ret; ret.r = r; ret.g = g; ret.b = b; ret.a = a; return ret; } struct Fragment { u32 depth; struct { u8 opaque, translucent; } polyid; u8 stencil; struct { u8 isTranslucentPoly:1; u8 fogged:1; }; }; class TexCacheItem; class SoftRasterizerEngine { public: //debug: int _debug_drawClippedUserPoly; SoftRasterizerEngine(); void initFramebuffer(const int width, const int height, const bool clearImage); void framebufferProcess(); void updateToonTable(); void updateFogTable(); void updateFloatColors(); void performClipping(bool hirez); template void performViewportTransforms(int width, int height); void performCoordAdjustment(const bool skipBackfacing); void performBackfaceTests(); void setupTextures(const bool skipBackfacing); FragmentColor toonTable[32]; u8 fogTable[32768]; GFX3D_Clipper clipper; GFX3D_Clipper::TClippedPoly *clippedPolys; int clippedPolyCounter; TexCacheItem* polyTexKeys[POLYLIST_SIZE]; bool polyVisible[POLYLIST_SIZE]; bool polyBackfacing[POLYLIST_SIZE]; Fragment *screen; FragmentColor *screenColor; POLYLIST* polylist; VERTLIST* vertlist; INDEXLIST* indexlist; int width, height; }; #endif desmume-0.9.11/src/MMU.cpp0000755000000000000000000047627112467662066013733 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2007 shash Copyright (C) 2007-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include #include #include "armcpu.h" #include "common.h" #include "debug.h" #include "driver.h" #include "NDSSystem.h" #include "cp15.h" #include "wifi.h" #include "registers.h" #include "render3D.h" #include "FIFO.h" #include "gfx3d.h" #include "rtc.h" #include "mc.h" #include "slot1.h" #include "slot2.h" #include "mic.h" #include "movie.h" #include "readwrite.h" #include "MMU_timing.h" #include "firmware.h" #include "encrypt.h" #include "GPU.h" #include "SPU.h" #ifdef DO_ASSERT_UNALIGNED #define ASSERT_UNALIGNED(x) assert(x) #else #define ASSERT_UNALIGNED(x) #endif //TODO - do we need these here? _KEY2 key2; //http://home.utah.edu/~nahaj/factoring/isqrt.c.html static u64 isqrt (u64 x) { u64 squaredbit, remainder, root; if (x<1) return 0; /* Load the binary constant 01 00 00 ... 00, where the number * of zero bits to the right of the single one bit * is even, and the one bit is as far left as is consistant * with that condition.) */ squaredbit = (u64) ((((u64) ~0LL) >> 1) & ~(((u64) ~0LL) >> 2)); /* This portable load replaces the loop that used to be * here, and was donated by legalize@xmission.com */ /* Form bits of the answer. */ remainder = x; root = 0; while (squaredbit > 0) { if (remainder >= (squaredbit | root)) { remainder -= (squaredbit | root); root >>= 1; root |= squaredbit; } else { root >>= 1; } squaredbit >>= 2; } return root; } u32 partie = 1; u32 _MMU_MAIN_MEM_MASK = 0x3FFFFF; u32 _MMU_MAIN_MEM_MASK16 = 0x3FFFFF & ~1; u32 _MMU_MAIN_MEM_MASK32 = 0x3FFFFF & ~3; //#define _MMU_DEBUG #ifdef _MMU_DEBUG #include void mmu_log_debug_ARM9(u32 adr, const char *fmt, ...) { if (adr < 0x4000000) return; // if (adr > 0x4100014) return; //#if 1 if (adr >= 0x4000000 && adr <= 0x400006E) return; // Display Engine A if (adr >= 0x40000B0 && adr <= 0x4000134) return; // DMA, Timers and Keypad if (adr >= 0x4000180 && adr <= 0x40001BC) return; // IPC/ROM if (adr >= 0x4000204 && adr <= 0x400024A) return; // Memory & IRQ control if (adr >= 0x4000280 && adr <= 0x4000306) return; // Maths if (adr >= 0x4000320 && adr <= 0x40006A3) return; // 3D dispaly engine if (adr >= 0x4001000 && adr <= 0x400106E) return; // Display Engine B if (adr >= 0x4100000 && adr <= 0x4100014) return; // IPC/ROM //#endif va_list list; char msg[512]; memset(msg,0,512); va_start(list,fmt); _vsnprintf(msg,511,fmt,list); va_end(list); INFO("MMU ARM9 0x%08X: %s\n", adr, msg); } void mmu_log_debug_ARM7(u32 adr, const char *fmt, ...) { if (adr < 0x4000004) return; if (adr > 0x4808FFF) return; #if 1 if (adr >= 0x4000004 && adr < 0x4000180) return; // ARM7 I/O Map if (adr >= 0x4000180 && adr <= 0x40001C4) return; // IPC/ROM if (adr >= 0x4000204 && adr <= 0x400030C) return; // Memory and IRQ Control if (adr >= 0x4000400 && adr <= 0x400051E) return; // Sound Registers if (adr >= 0x4100000 && adr <= 0x4100014) return; // IPC/ROM if (adr >= 0x4800000 && adr <= 0x4808FFF) return; // WLAN Registers #endif va_list list; char msg[512]; memset(msg,0,512); va_start(list,fmt); _vsnprintf(msg,511,fmt,list); va_end(list); INFO("MMU ARM7 0x%08X: %s\n", adr, msg); } #else #define mmu_log_debug_ARM9(...) #define mmu_log_debug_ARM7(...) #endif //#define LOG_CARD //#define LOG_GPU //#define LOG_DMA //#define LOG_DMA2 //#define LOG_DIV MMU_struct MMU; MMU_struct_new MMU_new; MMU_struct_timing MMU_timing; u8 * MMU_struct::MMU_MEM[2][256] = { //arm9 { /* 0X*/ DUP16(MMU.ARM9_ITCM), /* 1X*/ //DUP16(MMU.ARM9_ITCM) /* 1X*/ DUP16(MMU.UNUSED_RAM), /* 2X*/ DUP16(MMU.MAIN_MEM), /* 3X*/ DUP16(MMU.SWIRAM), /* 4X*/ DUP16(MMU.ARM9_REG), /* 5X*/ DUP16(MMU.ARM9_VMEM), /* 6X*/ DUP16(MMU.ARM9_LCD), /* 7X*/ DUP16(MMU.ARM9_OAM), /* 8X*/ DUP16(NULL), /* 9X*/ DUP16(NULL), /* AX*/ DUP16(MMU.UNUSED_RAM), /* BX*/ DUP16(MMU.UNUSED_RAM), /* CX*/ DUP16(MMU.UNUSED_RAM), /* DX*/ DUP16(MMU.UNUSED_RAM), /* EX*/ DUP16(MMU.UNUSED_RAM), /* FX*/ DUP16(MMU.ARM9_BIOS) }, //arm7 { /* 0X*/ DUP16(MMU.ARM7_BIOS), /* 1X*/ DUP16(MMU.UNUSED_RAM), /* 2X*/ DUP16(MMU.MAIN_MEM), /* 3X*/ DUP8(MMU.SWIRAM), DUP8(MMU.ARM7_ERAM), /* 4X*/ DUP8(MMU.ARM7_REG), DUP8(MMU.ARM7_WIRAM), /* 5X*/ DUP16(MMU.UNUSED_RAM), /* 6X*/ DUP16(MMU.ARM9_LCD), /* 7X*/ DUP16(MMU.UNUSED_RAM), /* 8X*/ DUP16(NULL), /* 9X*/ DUP16(NULL), /* AX*/ DUP16(MMU.UNUSED_RAM), /* BX*/ DUP16(MMU.UNUSED_RAM), /* CX*/ DUP16(MMU.UNUSED_RAM), /* DX*/ DUP16(MMU.UNUSED_RAM), /* EX*/ DUP16(MMU.UNUSED_RAM), /* FX*/ DUP16(MMU.UNUSED_RAM) } }; u32 MMU_struct::MMU_MASK[2][256] = { //arm9 { /* 0X*/ DUP16(0x00007FFF), /* 1X*/ //DUP16(0x00007FFF) /* 1X*/ DUP16(0x00000003), /* 2X*/ DUP16(0x003FFFFF), /* 3X*/ DUP16(0x00007FFF), /* 4X*/ DUP16(0x00FFFFFF), /* 5X*/ DUP16(0x000007FF), /* 6X*/ DUP16(0x00FFFFFF), /* 7X*/ DUP16(0x000007FF), /* 8X*/ DUP16(0x00000003), /* 9X*/ DUP16(0x00000003), /* AX*/ DUP16(0x00000003), /* BX*/ DUP16(0x00000003), /* CX*/ DUP16(0x00000003), /* DX*/ DUP16(0x00000003), /* EX*/ DUP16(0x00000003), /* FX*/ DUP16(0x00007FFF) }, //arm7 { /* 0X*/ DUP16(0x00003FFF), /* 1X*/ DUP16(0x00000003), /* 2X*/ DUP16(0x003FFFFF), /* 3X*/ DUP8(0x00007FFF), DUP8(0x0000FFFF), /* 4X*/ DUP8(0x00FFFFFF), DUP8(0x0000FFFF), /* 5X*/ DUP16(0x00000003), /* 6X*/ DUP16(0x00FFFFFF), /* 7X*/ DUP16(0x00000003), /* 8X*/ DUP16(0x00000003), /* 9X*/ DUP16(0x00000003), /* AX*/ DUP16(0x00000003), /* BX*/ DUP16(0x00000003), /* CX*/ DUP16(0x00000003), /* DX*/ DUP16(0x00000003), /* EX*/ DUP16(0x00000003), /* FX*/ DUP16(0x00000003) } }; // this logic was moved to MMU_timing.h //CACHE_ALIGN //TWaitState MMU_struct::MMU_WAIT16[2][16] = { // { 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1 }, //arm9 // { 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1 }, //arm7 //}; // //CACHE_ALIGN //TWaitState MMU_struct::MMU_WAIT32[2][16] = { // { 1, 1, 1, 1, 1, 2, 2, 1, 8, 8, 5, 1, 1, 1, 1, 1 }, //arm9 // { 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 5, 1, 1, 1, 1, 1 }, //arm7 //}; ////////////////////////////////////////////////////////////// //------------- //VRAM MEMORY MAPPING //------------- //(Everything is mapped through to ARM9_LCD in blocks of 16KB) //for all of the below, values = 41 indicate unmapped memory #define VRAM_PAGE_UNMAPPED 41 #define VRAM_LCDC_PAGES 41 u8 vram_lcdc_map[VRAM_LCDC_PAGES]; //in the range of 0x06000000 - 0x06800000 in 16KB pages (the ARM9 vram mappable area) //this maps to 16KB pages in the LCDC buffer which is what will actually contain the data u8 vram_arm9_map[VRAM_ARM9_PAGES]; //this chooses which banks are mapped in the 128K banks starting at 0x06000000 in ARM7 u8 vram_arm7_map[2]; //-----> //consider these later, for better recordkeeping, instead of using the u8* in MMU ////for each 128KB texture slot, this maps to a 16KB starting page in the LCDC buffer //#define VRAM_TEX_SLOTS 4 //u8 vram_tex_map[VRAM_TEX_SLOTS]; // ////for each 16KB tex palette slot, this maps to a 16KB starting page in the LCDC buffer //#define VRAM_TEX_PALETTE_SLOTS 6 //u8 vram_tex_palette_map[VRAM_TEX_PALETTE_SLOTS]; //<--------- void MMU_VRAM_unmap_all(); struct TVramBankInfo { u8 page_addr, num_pages; }; static const TVramBankInfo vram_bank_info[VRAM_BANKS] = { {0,8}, {8,8}, {16,8}, {24,8}, {32,4}, {36,1}, {37,1}, {38,2}, {40,1} }; //this is to remind you that the LCDC mapping returns a strange value (not 0x06800000) as you would expect //in order to play nicely with the MMU address and mask tables #define LCDC_HACKY_LOCATION 0x06000000 #define ARM7_HACKY_IWRAM_LOCATION 0x03800000 #define ARM7_HACKY_SIWRAM_LOCATION 0x03000000 //maps an ARM9 BG/OBJ or LCDC address into an LCDC address, and informs the caller of whether it isn't mapped //TODO - in cases where this does some mapping work, we could bypass the logic at the end of the _read* and _write* routines //this is a good optimization to consider //NOTE - this whole approach is probably fundamentally wrong. //according to dasShiny research, its possible to map multiple banks to the same addresses. something more sophisticated would be needed. //however, it hasnt proven necessary yet for any known test case. template static FORCEINLINE u32 MMU_LCDmap(u32 addr, bool& unmapped, bool& restricted) { unmapped = false; restricted = false; //this will track whether 8bit writes are allowed //handle SIWRAM and non-shared IWRAM in here too, since it is quite similar to vram. //in fact it is probably implemented with the same pieces of hardware. //its sort of like arm7 non-shared IWRAM is lowest priority, and then SIWRAM goes on top. //however, we implement it differently than vram in emulator for historical reasons. //instead of keeping a page map like we do vram, we just have a list of all possible page maps (there are only 4 each for arm9 and arm7) if(addr >= 0x03000000 && addr < 0x04000000) { //blocks 0,1,2,3 is arm7 non-shared IWRAM and blocks 4,5 is SIWRAM, and block 8 is un-mapped zeroes int iwram_block_16k; int iwram_offset = addr & 0x3FFF; addr &= 0x00FFFFFF; if(PROCNUM == ARMCPU_ARM7) { static const int arm7_siwram_blocks[2][4][4] = { { {0,1,2,3}, //WRAMCNT = 0 -> map to IWRAM {4,4,4,4}, //WRAMCNT = 1 -> map to SIWRAM block 0 {5,5,5,5}, //WRAMCNT = 2 -> map to SIWRAM block 1 {4,5,4,5}, //WRAMCNT = 3 -> map to SIWRAM blocks 0,1 }, //high region; always maps to non-shared IWRAM { {0,1,2,3}, {0,1,2,3}, {0,1,2,3}, {0,1,2,3} } }; int region = (addr >> 23)&1; int block = (addr >> 14)&3; assert(region<2); assert(block<4); iwram_block_16k = arm7_siwram_blocks[region][MMU.WRAMCNT][block]; } //PROCNUM == ARMCPU_ARM7 else { //PROCNUM == ARMCPU_ARM9 static const int arm9_siwram_blocks[4][4] = { {4,5,4,5}, //WRAMCNT = 0 -> map to SIWRAM blocks 0,1 {5,5,5,5}, //WRAMCNT = 1 -> map to SIWRAM block 1 {4,4,4,4}, //WRAMCNT = 2 -> map to SIWRAM block 0 {8,8,8,8}, //WRAMCNT = 3 -> unmapped }; int block = (addr >> 14)&3; assert(block<4); iwram_block_16k = arm9_siwram_blocks[MMU.WRAMCNT][block]; } switch(iwram_block_16k>>2) { case 0: //arm7 non-shared IWRAM return ARM7_HACKY_IWRAM_LOCATION + (iwram_block_16k<<14) + iwram_offset; case 1: //SIWRAM return ARM7_HACKY_SIWRAM_LOCATION + ((iwram_block_16k&3)<<14) + iwram_offset; case 2: //zeroes CASE2: unmapped = true; return 0; default: assert(false); //how did this happen? goto CASE2; } } //in case the address is entirely outside of the interesting VRAM ranges if(addr < 0x06000000) return addr; if(addr >= 0x07000000) return addr; //shared wram mapping for arm7 if(PROCNUM==ARMCPU_ARM7) { //necessary? not sure //addr &= 0x3FFFF; //addr += 0x06000000; u32 ofs = addr & 0x1FFFF; u32 bank = (addr >> 17)&1; if(vram_arm7_map[bank] == VRAM_PAGE_UNMAPPED) { unmapped = true; return 0; } return LCDC_HACKY_LOCATION + (vram_arm7_map[bank]<<14) + ofs; } restricted = true; //handle LCD memory mirroring //TODO - this is gross! this should be renovated if the vram mapping is ever done in a more sophisticated way taking into account dasShiny research if(addr>=0x068A4000) addr = 0x06800000 + //(addr%0xA4000); //yuck!! is this even how it mirrors? but we have to keep from overrunning the buffer somehow (addr&0x80000); //just as likely to be right (I have no clue how it should work) but faster. u32 vram_page; u32 ofs = addr & 0x3FFF; //return addresses in LCDC range if(addr>=0x06800000) { //already in LCDC range. just look it up to see whether it is unmapped vram_page = (addr>>14)&63; assert(vram_page>14)&(VRAM_ARM9_PAGES-1); assert(vram_page= VRAM_BANK_H) block++; u8 VRAMBankCnt = T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x240 + block); //do nothing if the bank isnt enabled u8 en = VRAMBankCnt & 0x80; if(!en) return; int mst,ofs=0; switch(bank) { case VRAM_BANK_A: case VRAM_BANK_B: mst = VRAMBankCnt & 3; ofs = (VRAMBankCnt>>3) & 3; switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG+ofs*8); break; case 2: //AOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ; switch(ofs) { case 0: case 1: MMU_vram_arm9(bank,VRAM_PAGE_AOBJ+ofs*8); break; default: PROGINFO("Unsupported ofs setting %d for engine A OBJ vram bank %c\n", ofs, 'A'+bank); } break; case 3: //texture vramConfiguration.banks[bank].purpose = VramConfiguration::TEX; MMU.texInfo.textureSlotAddr[ofs] = MMU_vram_physical(vram_bank_info[bank].page_addr); break; default: goto unsupported_mst; } break; case VRAM_BANK_C: case VRAM_BANK_D: mst = VRAMBankCnt & 7; ofs = (VRAMBankCnt>>3) & 3; switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG+ofs*8); break; case 2: //arm7 vramConfiguration.banks[bank].purpose = VramConfiguration::ARM7; if(bank == 2) T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240, T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240) | 1); if(bank == 3) T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240, T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240) | 2); //printf("DING!\n"); switch(ofs) { case 0: case 1: vram_arm7_map[ofs] = vram_bank_info[bank].page_addr; break; default: PROGINFO("Unsupported ofs setting %d for arm7 vram bank %c\n", ofs, 'A'+bank); } break; case 3: //texture vramConfiguration.banks[bank].purpose = VramConfiguration::TEX; MMU.texInfo.textureSlotAddr[ofs] = MMU_vram_physical(vram_bank_info[bank].page_addr); break; case 4: //BGB or BOBJ if(bank == VRAM_BANK_C) { vramConfiguration.banks[bank].purpose = VramConfiguration::BBG; MMU_vram_arm9(bank,VRAM_PAGE_BBG); //BBG } else { vramConfiguration.banks[bank].purpose = VramConfiguration::BOBJ; MMU_vram_arm9(bank,VRAM_PAGE_BOBJ); //BOBJ } if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; default: goto unsupported_mst; } break; case VRAM_BANK_E: mst = VRAMBankCnt & 7; if(((VRAMBankCnt>>3)&3) != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG); break; case 2: //AOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ; MMU_vram_arm9(bank,VRAM_PAGE_AOBJ); break; case 3: //texture palette vramConfiguration.banks[bank].purpose = VramConfiguration::TEXPAL; MMU.texInfo.texPalSlot[0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.texInfo.texPalSlot[1] = MMU_vram_physical(vram_bank_info[bank].page_addr+1); MMU.texInfo.texPalSlot[2] = MMU_vram_physical(vram_bank_info[bank].page_addr+2); MMU.texInfo.texPalSlot[3] = MMU_vram_physical(vram_bank_info[bank].page_addr+3); break; case 4: //A BG extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::ABGEXTPAL; MMU.ExtPal[0][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ExtPal[0][1] = MMU.ExtPal[0][0] + ADDRESS_STEP_8KB; MMU.ExtPal[0][2] = MMU.ExtPal[0][1] + ADDRESS_STEP_8KB; MMU.ExtPal[0][3] = MMU.ExtPal[0][2] + ADDRESS_STEP_8KB; break; default: goto unsupported_mst; } break; case VRAM_BANK_F: case VRAM_BANK_G: { mst = VRAMBankCnt & 7; ofs = (VRAMBankCnt>>3) & 3; const int pageofslut[] = {0,1,4,5}; const int pageofs = pageofslut[ofs]; switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG+pageofs); MMU_vram_arm9(bank,VRAM_PAGE_ABG+pageofs+2); //unexpected mirroring (required by spyro eternal night) break; case 2: //AOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ; MMU_vram_arm9(bank,VRAM_PAGE_AOBJ+pageofs); MMU_vram_arm9(bank,VRAM_PAGE_AOBJ+pageofs+2); //unexpected mirroring - I have no proof, but it is inferred from the ABG above break; case 3: //texture palette vramConfiguration.banks[bank].purpose = VramConfiguration::TEXPAL; MMU.texInfo.texPalSlot[pageofs] = MMU_vram_physical(vram_bank_info[bank].page_addr); break; case 4: //A BG extended palette switch(ofs) { case 0: case 1: vramConfiguration.banks[bank].purpose = VramConfiguration::ABGEXTPAL; MMU.ExtPal[0][ofs*2] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ExtPal[0][ofs*2+1] = MMU.ExtPal[0][ofs*2] + ADDRESS_STEP_8KB; break; default: vramConfiguration.banks[bank].purpose = VramConfiguration::INVALID; PROGINFO("Unsupported ofs setting %d for engine A bgextpal vram bank %c\n", ofs, 'A'+bank); break; } break; case 5: //A OBJ extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJEXTPAL; MMU.ObjExtPal[0][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ObjExtPal[0][1] = MMU.ObjExtPal[0][1] + ADDRESS_STEP_8KB; if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; default: goto unsupported_mst; } break; } case VRAM_BANK_H: mst = VRAMBankCnt & 3; if(((VRAMBankCnt>>3)&3) != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); break; case 1: //BBG vramConfiguration.banks[bank].purpose = VramConfiguration::BBG; MMU_vram_arm9(bank,VRAM_PAGE_BBG); MMU_vram_arm9(bank,VRAM_PAGE_BBG + 4); //unexpected mirroring break; case 2: //B BG extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::BBGEXTPAL; MMU.ExtPal[1][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ExtPal[1][1] = MMU.ExtPal[1][0] + ADDRESS_STEP_8KB; MMU.ExtPal[1][2] = MMU.ExtPal[1][1] + ADDRESS_STEP_8KB; MMU.ExtPal[1][3] = MMU.ExtPal[1][2] + ADDRESS_STEP_8KB; break; default: goto unsupported_mst; } break; case VRAM_BANK_I: mst = VRAMBankCnt & 3; if(((VRAMBankCnt>>3)&3) != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); break; case 1: //BBG vramConfiguration.banks[bank].purpose = VramConfiguration::BBG; MMU_vram_arm9(bank,VRAM_PAGE_BBG+2); MMU_vram_arm9(bank,VRAM_PAGE_BBG+3); //unexpected mirroring break; case 2: //BOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::BOBJ; MMU_vram_arm9(bank,VRAM_PAGE_BOBJ); MMU_vram_arm9(bank,VRAM_PAGE_BOBJ+1); //FF3 end scene (lens flare sprite) needs this as it renders a sprite off the end of the 16KB and back around break; case 3: //B OBJ extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::BOBJEXTPAL; MMU.ObjExtPal[1][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ObjExtPal[1][1] = MMU.ObjExtPal[1][1] + ADDRESS_STEP_8KB; break; default: goto unsupported_mst; } break; } //switch(bank) vramConfiguration.banks[bank].ofs = ofs; return; unsupported_mst: vramConfiguration.banks[bank].purpose = VramConfiguration::INVALID; PROGINFO("Unsupported mst setting %d for vram bank %c\n", mst, 'A'+bank); } void MMU_VRAM_unmap_all() { vramConfiguration.clear(); vram_arm7_map[0] = VRAM_PAGE_UNMAPPED; vram_arm7_map[1] = VRAM_PAGE_UNMAPPED; for(int i=0;iNDS_3D_VramReconfigureSignal(); } //------------------------------- //set up arm9 mirrorings //these are probably not entirely accurate. more study will be necessary. //in general, we find that it is not uncommon at all for games to accidentally do this. // //being able to easily do these experiments was one of the primary motivations for this remake of the vram mapping system //see the "unexpected mirroring" comments above for some more mirroring //so far "unexpected mirrorings" are tested by combining these games: //despereaux - storybook subtitles //NSMB - world map sub screen //drill spirits EU - mission select (just for control purposes, as it doesnt use H or I) //... //note that the "unexpected mirroring" items above may at some point rely on being executed in a certain order. //(sequentially A..I) const int types[] = {VRAM_PAGE_ABG,VRAM_PAGE_BBG,VRAM_PAGE_AOBJ,VRAM_PAGE_BOBJ}; const int sizes[] = {32,8,16,8}; for(int t=0;t<4;t++) { //the idea here is to pad out the mirrored space with copies of the mappable area, //without respect to what is mapped within that mappable area. //we hope that this is correct in all cases //required for driller spirits in mission select (mapping is simple A,B,C,D to each purpose) const int size = sizes[t]; const int mask = size-1; const int type = types[t]; for(int i=size;i<128;i++) { const int page = type + i; vram_arm9_map[page] = vram_arm9_map[type+(i&mask)]; } //attempt #1: screen corruption in drill spirits EU //it seems like these shouldnt pad out 128K banks (space beyond those should have remained unmapped) //int mirrorMask = -1; //int type = types[t]; ////if(type==VRAM_PAGE_BOBJ) continue; //if(type==VRAM_PAGE_AOBJ) continue; //for(int i=0;i<128;i++) //{ // int page = type + i; // if(vram_arm9_map[page] == VRAM_PAGE_UNMAPPED) // { // if(i==0) break; //can't mirror anything if theres nothing mapped! // if(mirrorMask == -1) // mirrorMask = i-1; // vram_arm9_map[page] = vram_arm9_map[type+(i&mirrorMask)]; // } //} } //------------------------------- } ////////////////////////////////////////////////////////////// //end vram ////////////////////////////////////////////////////////////// void MMU_Init(void) { LOG("MMU init\n"); memset(&MMU, 0, sizeof(MMU_struct)); //MMU.DTCMRegion = 0x027C0000; //even though apps may change dtcm immediately upon startup, this is the correct hardware starting value: MMU.DTCMRegion = 0x08000000; MMU.ITCMRegion = 0x00000000; IPC_FIFOinit(ARMCPU_ARM9); IPC_FIFOinit(ARMCPU_ARM7); GFX_PIPEclear(); GFX_FIFOclear(); DISP_FIFOinit(); mc_init(&MMU.fw, MC_TYPE_FLASH); /* init fw device */ mc_alloc(&MMU.fw, NDS_FW_SIZE_V1); MMU.fw.fp = NULL; MMU.fw.isFirmware = true; rtcInit(); slot1_Init(); slot2_Init(); if(Mic_Init() == FALSE) INFO("Microphone init failed.\n"); else INFO("Microphone successfully inited.\n"); } void MMU_DeInit(void) { LOG("MMU deinit\n"); if (MMU.fw.fp) fclose(MMU.fw.fp); mc_free(&MMU.fw); slot1_Shutdown(); slot2_Shutdown(); Mic_DeInit(); } void MMU_Reset() { memset(MMU.ARM9_DTCM, 0, sizeof(MMU.ARM9_DTCM)); memset(MMU.ARM9_ITCM, 0, sizeof(MMU.ARM9_ITCM)); memset(MMU.ARM9_LCD, 0, sizeof(MMU.ARM9_LCD)); memset(MMU.ARM9_OAM, 0, sizeof(MMU.ARM9_OAM)); memset(MMU.ARM9_REG, 0, sizeof(MMU.ARM9_REG)); memset(MMU.ARM9_VMEM, 0, sizeof(MMU.ARM9_VMEM)); memset(MMU.MAIN_MEM, 0, sizeof(MMU.MAIN_MEM)); memset(MMU.blank_memory, 0, sizeof(MMU.blank_memory)); memset(MMU.UNUSED_RAM, 0, sizeof(MMU.UNUSED_RAM)); memset(MMU.MORE_UNUSED_RAM, 0, sizeof(MMU.UNUSED_RAM)); memset(MMU.ARM7_ERAM, 0, sizeof(MMU.ARM7_ERAM)); memset(MMU.ARM7_REG, 0, sizeof(MMU.ARM7_REG)); memset(MMU.ARM7_WIRAM, 0, sizeof(MMU.ARM7_WIRAM)); memset(MMU.SWIRAM, 0, sizeof(MMU.SWIRAM)); IPC_FIFOinit(ARMCPU_ARM9); IPC_FIFOinit(ARMCPU_ARM7); GFX_PIPEclear(); GFX_FIFOclear(); DISP_FIFOinit(); MMU.DTCMRegion = 0x027C0000; MMU.ITCMRegion = 0x00000000; memset(MMU.timer, 0, sizeof(u16) * 2 * 4); memset(MMU.timerMODE, 0, sizeof(s32) * 2 * 4); memset(MMU.timerON, 0, sizeof(u32) * 2 * 4); memset(MMU.timerRUN, 0, sizeof(u32) * 2 * 4); memset(MMU.timerReload, 0, sizeof(u16) * 2 * 4); memset(MMU.reg_IME, 0, sizeof(u32) * 2); memset(MMU.reg_IE, 0, sizeof(u32) * 2); memset(MMU.reg_IF_bits, 0, sizeof(u32) * 2); memset(MMU.reg_IF_pending, 0, sizeof(u32) * 2); memset(&MMU.dscard, 0, sizeof(MMU.dscard)); MMU.divRunning = 0; MMU.divResult = 0; MMU.divMod = 0; MMU.divCycles = 0; MMU.sqrtRunning = 0; MMU.sqrtResult = 0; MMU.sqrtCycles = 0; MMU.SPI_CNT = 0; MMU.AUX_SPI_CNT = 0; reconstruct(&key2); MMU.WRAMCNT = 0; // Enable the sound speakers T1WriteWord(MMU.ARM7_REG, 0x304, 0x0001); MainScreen.offset = 0; SubScreen.offset = 192; MMU_VRAM_unmap_all(); MMU.powerMan_CntReg = 0x00; MMU.powerMan_CntRegWritten = FALSE; MMU.powerMan_Reg[0] = 0x0B; MMU.powerMan_Reg[1] = 0x00; MMU.powerMan_Reg[2] = 0x01; MMU.powerMan_Reg[3] = 0x00; rtcInit(); partie = 1; slot1_Reset(); slot2_Reset(); Mic_Reset(); MMU.gfx3dCycles = 0; MMU.dscard[0].transfer_count = 0; MMU.dscard[0].mode = eCardMode_RAW; MMU.dscard[1].transfer_count = 0; MMU.dscard[1].mode = eCardMode_RAW; reconstruct(&MMU_new); MMU_timing.arm7codeFetch.Reset(); MMU_timing.arm7dataFetch.Reset(); MMU_timing.arm9codeFetch.Reset(); MMU_timing.arm9dataFetch.Reset(); MMU_timing.arm9codeCache.Reset(); MMU_timing.arm9dataCache.Reset(); } void SetupMMU(bool debugConsole, bool dsi) { if(debugConsole) _MMU_MAIN_MEM_MASK = 0x7FFFFF; else _MMU_MAIN_MEM_MASK = 0x3FFFFF; if(dsi) _MMU_MAIN_MEM_MASK = 0xFFFFFF; _MMU_MAIN_MEM_MASK16 = _MMU_MAIN_MEM_MASK & ~1; _MMU_MAIN_MEM_MASK32 = _MMU_MAIN_MEM_MASK & ~3; } static void execsqrt() { u32 ret; u8 mode = MMU_new.sqrt.mode; MMU_new.sqrt.busy = 1; if (mode) { u64 v = T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8); ret = (u32)isqrt(v); } else { u32 v = T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8); ret = (u32)isqrt(v); } //clear the result while the sqrt unit is busy //todo - is this right? is it reasonable? T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B4, 0); MMU.sqrtCycles = nds_timer + 26; MMU.sqrtResult = ret; MMU.sqrtRunning = TRUE; NDS_Reschedule(); } static void execdiv() { s64 num,den; s64 res,mod; u8 mode = MMU_new.div.mode; MMU_new.div.busy = 1; MMU_new.div.div0 = 0; switch(mode) { case 0: // 32/32 num = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290); den = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298); MMU.divCycles = nds_timer + 36; break; case 1: // 64/32 case 3: //gbatek says this is same as mode 1 num = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290); den = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298); MMU.divCycles = nds_timer + 68; break; case 2: // 64/64 default: num = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290); den = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298); MMU.divCycles = nds_timer + 68; break; } if(den==0) { res = ((num < 0) ? 1 : -1); mod = num; // the DIV0 flag in DIVCNT is set only if the full 64bit DIV_DENOM value is zero, even in 32bit mode if ((u64)T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298) == 0) MMU_new.div.div0 = 1; } else { res = num / den; mod = num % den; } DIVLOG("DIV %08X%08X / %08X%08X = %08X%08X\r\n", (u32)(num>>32), (u32)num, (u32)(den>>32), (u32)den, (u32)(res>>32), (u32)res); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, 0); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A4, 0); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, 0); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2AC, 0); MMU.divResult = res; MMU.divMod = mod; MMU.divRunning = TRUE; NDS_Reschedule(); } DSI_TSC::DSI_TSC() { for(int i=0;i>1)&0x7F; read_flag = val&1; state = 1; return read16(); case 1: if(read_flag) { } else { registers[reg_selection] = (u8)val; } ret = read16(); reg_selection++; reg_selection &= 0x7F; return ret; } return 0; } u16 DSI_TSC::read16() { u8 page = registers[0]; switch(page) { case 3: //page 3 switch(reg_selection) { case 9: if(nds.isTouch) return 0; else return 0x40; break; case 14: if(nds.isTouch) return 0; else return 0x02; break; } break; case 252: //page 252 switch(reg_selection) { //high byte of X: case 1: case 3: case 5: case 7: case 9: return (nds.scr_touchX>>8)&0xFF; //low byte of X: case 2: case 4: case 6: case 8: case 10: return nds.scr_touchX&0xFF; //high byte of Y: case 11: case 13: case 15: case 17: case 19: return (nds.scr_touchY>>8)&0xFF; //low byte of Y: case 12: case 14: case 16: case 18: case 20: return nds.scr_touchY&0xFF; default: return 0xFF; } break; } //switch(page) //unknown page or register return 0xFF; } bool DSI_TSC::save_state(EMUFILE* os) { u32 version = 0; write32le(version,os); write8le(reg_selection,os); write8le(read_flag,os); write32le(state,os); write32le(readcount,os); for(int i=0;i>0)&0xFF; bytes[6] = (buf[0]>>8)&0xFF; bytes[5] = (buf[0]>>16)&0xFF; bytes[4] = (buf[0]>>24)&0xFF; bytes[3] = (buf[1]>>0)&0xFF; bytes[2] = (buf[1]>>8)&0xFF; bytes[1] = (buf[1]>>16)&0xFF; bytes[0] = (buf[1]>>24)&0xFF; } template void FASTCALL MMU_writeToGCControl(u32 val) { int dbsize = (val>>24)&7; static int gcctr=0; GCLOG("[GC] [%07d] GCControl: %08X (dbsize:%d)\n",gcctr,val,dbsize); gcctr++; GCBUS_Controller& card = MMU.dscard[PROCNUM]; //....pick apart the fields.... int keylength = (val&0x1FFF); //key1length high gcromctrl[21:16] ?? u8 key2_encryptdata = (val>>13)&1; u8 bit15 = (val>>14)&1; u8 key2_applyseed = (val>>15)&1; //write only strobe //key1length high gcromctrl[21:16] ?? u8 key2_encryptcommand = (val>>22)&1; //bit 23 read only status int blocksize_field = (val>>24)&7; u8 clockrate = (val>>27)&1; u8 secureareamode = (val>>28)&1; //RESB bit 29? u8 wr = (val>>30)&1; u8 start = (val>>31)&1; //doubles as busy on read static const int blocksize_table[] = {0,0x200,0x400,0x800,0x1000,0x2000,0x4000,4}; int blocksize = blocksize_table[blocksize_field]; //store written value, without bit 31 and bit 23 set (those will be patched in as operations proceed) //T1WriteLong(MMU.MMU_MEM[PROCNUM][0x40], 0x1A4, val & 0x7F7FFFFF); //if this operation has been triggered by strobing that bit, run it if (key2_applyseed) { key2.applySeed(PROCNUM); } //pluck out the command registers into a more convenient format GC_Command rawcmd = *(GC_Command*)&MMU.MMU_MEM[PROCNUM][0x40][0x1A8]; //when writing a 1 to the start bit, a command runs. //the command is transferred to the GC during the next 8 clocks if(start) { GCLOG("[GC] command:"); rawcmd.print(); slot1_device->write_command(PROCNUM, rawcmd); /*INFO("WRITE: %02X%02X%02X%02X%02X%02X%02X%02X ", rawcmd.bytes[0], rawcmd.bytes[1], rawcmd.bytes[2], rawcmd.bytes[3], rawcmd.bytes[4], rawcmd.bytes[5], rawcmd.bytes[6], rawcmd.bytes[7]); INFO("FROM: %08X ", (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr); INFO("1A4: %08X ", val); INFO("SIZE: %08X\n", blocksize);*/ } else { T1WriteLong(MMU.MMU_MEM[PROCNUM][0x40], 0x1A4, val & 0x7F7FFFFF); GCLOG("SCUTTLE????\n"); return; } //the transfer size is determined by the specification here in GCROMCTRL, not any logic private to the card. card.transfer_count = blocksize; //if there was nothing to be done here, go ahead and flag it as done if(card.transfer_count == 0) { MMU_GC_endTransfer(PROCNUM); return; } val |= 0x00800000; T1WriteLong(MMU.MMU_MEM[PROCNUM][0x40], 0x1A4, val); // Launch DMA if start flag was set to "DS Cart" triggerDma(EDMAMode_Card); } /*template u32 FASTCALL MMU_readFromGCControl() { return T1ReadLong(MMU.MMU_MEM[0][0x40], 0x1A4); }*/ template u32 MMU_readFromGC() { GCBUS_Controller& card = MMU.dscard[PROCNUM]; //???? return the latched / last read value instead perhaps? if(card.transfer_count == 0) return 0; u32 val = slot1_device->read_GCDATAIN(PROCNUM); //update transfer counter and complete the transfer if necessary card.transfer_count -= 4; if(card.transfer_count <= 0) { MMU_GC_endTransfer(PROCNUM); } return val; } template void MMU_writeToGC(u32 val) { GCBUS_Controller& card = MMU.dscard[PROCNUM]; slot1_device->write_GCDATAIN(PROCNUM,val); //update transfer counter and complete the transfer if necessary card.transfer_count -= 4; if(card.transfer_count <= 0) { MMU_GC_endTransfer(PROCNUM); } } // ====================================================================== REG_SPIxxx static void CalculateTouchPressure(int pressurePercent, u16 &z1, u16& z2) { bool touch = nds.isTouch!=0; if(!touch) { z1 = z2 = 0; return; } int y = nds.scr_touchY; int x = nds.scr_touchX; float u = (x/256.0f); float v = (y/192.0f); //these coefficients float fPressurePercent = pressurePercent/100.0f; //z1 goes up as pressure goes up { float b0 = (96-80)*fPressurePercent + 80; float b1 = (970-864)*fPressurePercent + 864; float b2 = (192-136)*fPressurePercent + 136; float b3 = (1560-1100)*fPressurePercent + 1100; z1 = (u16)(int)(b0 + (b1-b0)*u + (b2-b0)*v + (b3-b2-b1+b0)*u*v); } //z2 goes down as pressure goes up { float b0=(1976-2300)*fPressurePercent + 2300; float b1=(2360-2600)*fPressurePercent + 2600; float b2=(3840-3900)*fPressurePercent + 3900; float b3=(3912-3950)*fPressurePercent + 3950; z2 = (u16)(int)(b0 + (b1-b0)*u + (b2-b0)*v + (b3-b2-b1+b0)*u*v); } } void FASTCALL MMU_writeToSPIData(u16 val) { enum PM_Bits //from libnds { PM_SOUND_AMP = BIT(0) , /*!< \brief Power the sound hardware (needed to hear stuff in GBA mode too) */ PM_SOUND_MUTE = BIT(1), /*!< \brief Mute the main speakers, headphone output will still work. */ PM_BACKLIGHT_BOTTOM = BIT(2), /*!< \brief Enable the top backlight if set */ PM_BACKLIGHT_TOP = BIT(3) , /*!< \brief Enable the bottom backlight if set */ PM_SYSTEM_PWR = BIT(6) , /*!< \brief Turn the power *off* if set */ }; if (val !=0) MMU.SPI_CMD = val; u16 spicnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPICNT >> 20) & 0xff], REG_SPICNT & 0xfff); int device = (spicnt >> 8) & 0x3; int baudrate = spicnt & 0x3; switch(device) { case SPI_DEVICE_POWERMAN: if (!MMU.powerMan_CntRegWritten) { MMU.powerMan_CntReg = (val & 0xFF); MMU.powerMan_CntRegWritten = TRUE; } else { u16 reg = MMU.powerMan_CntReg & 0x7F; reg &= 0x7; if(reg==5 || reg==6 || reg==7) reg = 4; //(let's start with emulating a DS lite, since it is the more complex case) if(MMU.powerMan_CntReg & 0x80) { //read val = MMU.powerMan_Reg[reg]; } else { //write MMU.powerMan_Reg[reg] = (u8)val; //our totally pathetic register handling, only the one thing we've wanted so far if(MMU.powerMan_Reg[0]&PM_SYSTEM_PWR) { printf("SYSTEM POWERED OFF VIA ARM7 SPI POWER DEVICE\n"); printf("Did your main() return?\n"); emu_halt(); } } MMU.powerMan_CntRegWritten = FALSE; } break; case SPI_DEVICE_FIRMWARE: if(baudrate != SPI_BAUDRATE_4MHZ) // check SPI baudrate (must be 4mhz) { printf("Wrong SPI baud rate for firmware access\n"); val = 0; } else val = fw_transfer(&MMU.fw, (u8)val); break; case SPI_DEVICE_TOUCHSCREEN: { if(nds.Is_DSI()) { //pass data to TSC val = MMU_new.dsi_tsc.write16(val); //apply reset command if appropriate if(!BIT11(MMU.SPI_CNT)) MMU_new.dsi_tsc.reset_command(); break; } int channel = (MMU.SPI_CMD&0x70)>>4; switch(channel) { case TSC_MEASURE_TEMP1: if(spicnt & 0x800) { if(partie) { val = ((716<<3)&0x7FF); partie = 0; break; } val = (716>>5); partie = 1; break; } val = ((716<<3)&0x7FF); partie = 1; break; case TSC_MEASURE_TEMP2: if(spicnt & 0x800) { if(partie) { val = ((865<<3)&0x7FF); partie = 0; break; } val = (865>>5); partie = 1; break; } val = ((865<<3)&0x7FF); partie = 1; break; case TSC_MEASURE_Y: //counter the number of adc touch coord reads and jitter it after a while to simulate a shaky human hand or multiple reads //this is actually important for some games.. seemingly due to bugs. nds.adc_jitterctr++; if(nds.adc_jitterctr == 25) { nds.adc_jitterctr = 0; if (nds.stylusJitter) { nds.adc_touchY ^= 16; nds.adc_touchX ^= 16; } } if(MMU.SPI_CNT&(1<<11)) { if(partie) { val = (nds.adc_touchY<<3) & 0xFF; partie = 0; break; } val = (nds.adc_touchY>>5) & 0xFF; partie = 1; break; } val = (nds.adc_touchY<<3)&0xFF; partie = 1; break; case TSC_MEASURE_Z1: //Z1 { //used for pressure calculation - must be nonzero or else some softwares will think the stylus is up. //something is wrong in here and some of these LSB dont make it back to libnds... whatever. u16 scratch; CalculateTouchPressure(CommonSettings.StylusPressure,val,scratch); if(spicnt & 0x800) { if(partie) { val = ((val<<3)&0x7FF); partie = 0; break; } val = (val>>5); partie = 1; break; } val = ((val<<3)&0x7FF); partie = 1; break; } case TSC_MEASURE_Z2: //Z2 { //used for pressure calculation - must be nonzero or else some softwares will think the stylus is up. //something is wrong in here and some of these LSB dont make it back to libnds... whatever. u16 scratch; CalculateTouchPressure(CommonSettings.StylusPressure,scratch,val); if(spicnt & 0x800) { if(partie) { val = ((val<<3)&0x7FF); partie = 0; break; } val = (val>>5); partie = 1; break; } val = ((val<<3)&0x7FF); partie = 1; break; } case TSC_MEASURE_X: if(spicnt & 0x800) { if(partie) { val = (nds.adc_touchX << 3) & 0xFF; partie = 0; break; } val = (nds.adc_touchX>>5) & 0xFF; partie = 1; break; } val = (nds.adc_touchX<<3) & 0xFF; partie = 1; break; case TSC_MEASURE_AUX: if(!(val & 0x80)) val = (Mic_ReadSample() & 0xFF); else val = 0; break; } break; } case 3 : // NOTICE: Device 3 of SPI is reserved (unused and unusable) break; } T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPIDATA >> 20) & 0xff], REG_SPIDATA & 0xfff, val & 0x00FF); } // ====================================================================== REG_SPIxxx END //does some validation on the game's choice of IF value, correcting it if necessary static void validateIF_arm9() { } template static void REG_IF_WriteByte(u32 addr, u8 val) { //the following bits are generated from logic and should not be affected here //Bit 21 NDS9 only: Geometry Command FIFO //arm9: IF &= ~0x00200000; //arm7: IF &= ~0x00000000; //UPDATE IN setIF() ALSO!!!!!!!!!!!!!!!! //UPDATE IN mmu_loadstate ALSO!!!!!!!!!!!! if (addr==2) { if(PROCNUM==ARMCPU_ARM9) val &= ~0x20; else val &= ~0x00; } //ZERO 01-dec-2010 : I am no longer sure this approach is correct.. it proved to be wrong for IPC fifo....... //it seems as if IF bits should always be cached (only the user can clear them) MMU.reg_IF_bits[PROCNUM] &= (~(((u32)val)<<(addr<<3))); NDS_Reschedule(); } template static void REG_IF_WriteWord(u32 addr,u16 val) { REG_IF_WriteByte(addr,val&0xFF); REG_IF_WriteByte(addr+1,(val>>8)&0xFF); } template static void REG_IF_WriteLong(u32 val) { REG_IF_WriteByte(0,val&0xFF); REG_IF_WriteByte(1,(val>>8)&0xFF); REG_IF_WriteByte(2,(val>>16)&0xFF); REG_IF_WriteByte(3,(val>>24)&0xFF); } template u32 MMU_struct::gen_IF() { u32 IF = reg_IF_bits[PROCNUM]; if(PROCNUM==ARMCPU_ARM9) { //according to gbatek, these flags are forced on until the condition is removed. //no proof of this though... switch(MMU_new.gxstat.gxfifo_irq) { case 0: //never break; case 1: //less than half full if(MMU_new.gxstat.fifo_low) IF |= IRQ_MASK_ARM9_GXFIFO; break; case 2: //empty if(MMU_new.gxstat.fifo_empty) IF |= IRQ_MASK_ARM9_GXFIFO; break; case 3: //reserved/unknown break; } } return IF; } static void writereg_DISP3DCNT(const int size, const u32 adr, const u32 val) { //UGH. rewrite this shite to use individual values and reconstruct the return value instead of packing things in this !@#)ing register //nanostray2 cutscene will test this vs old desmumes by using some kind of 32bit access for setting up this reg for cutscenes switch(size) { case 8: switch(adr) { case REG_DISPA_DISP3DCNT: MMU.reg_DISP3DCNT_bits &= 0xFFFFFF00; MMU.reg_DISP3DCNT_bits |= val; gfx3d_Control(MMU.reg_DISP3DCNT_bits); break; case REG_DISPA_DISP3DCNT+1: { u32 myval = (val & ~0x30) | (~val & ((MMU.reg_DISP3DCNT_bits>>8) & 0x30)); // bits 12,13 are ack bits myval &= 0x7F; //top bit isnt connected MMU.reg_DISP3DCNT_bits = MMU.reg_DISP3DCNT_bits&0xFFFF00FF; MMU.reg_DISP3DCNT_bits |= (myval<<8); gfx3d_Control(MMU.reg_DISP3DCNT_bits); } break; } break; case 16: case 32: writereg_DISP3DCNT(8,adr,val&0xFF); writereg_DISP3DCNT(8,adr+1,(val>>8)&0xFF); break; } } static u32 readreg_DISP3DCNT(const int size, const u32 adr) { //UGH. rewrite this shite to use individual values and reconstruct the return value instead of packing things in this !@#)ing register switch(size) { case 8: switch(adr) { case REG_DISPA_DISP3DCNT: return MMU.reg_DISP3DCNT_bits & 0xFF; case REG_DISPA_DISP3DCNT+1: return ((MMU.reg_DISP3DCNT_bits)>>8)& 0xFF; } break; case 16: case 32: return readreg_DISP3DCNT(8,adr)|(readreg_DISP3DCNT(8,adr+1)<<8); } assert(false); return 0; } static u32 readreg_POWCNT1(const int size, const u32 adr) { switch(size) { case 8: switch(adr) { case REG_POWCNT1: { u8 ret = 0; ret |= nds.power1.lcd?BIT(0):0; ret |= nds.power1.gpuMain?BIT(1):0; ret |= nds.power1.gfx3d_render?BIT(2):0; ret |= nds.power1.gfx3d_geometry?BIT(3):0; return ret; } case REG_POWCNT1+1: { u8 ret = 0; ret |= nds.power1.gpuSub?BIT(1):0; ret |= nds.power1.dispswap?BIT(7):0; return ret; } default: return 0; } case 16: case 32: return readreg_POWCNT1(8,adr)|(readreg_POWCNT1(8,adr+1)<<8); } assert(false); return 0; } static void writereg_POWCNT1(const int size, const u32 adr, const u32 val) { switch(size) { case 8: switch(adr) { case REG_POWCNT1: nds.power1.lcd = BIT0(val); nds.power1.gpuMain = BIT1(val); nds.power1.gfx3d_render = BIT2(val); nds.power1.gfx3d_geometry = BIT3(val); break; case REG_POWCNT1+1: nds.power1.gpuSub = BIT1(val); nds.power1.dispswap = BIT7(val); if(nds.power1.dispswap) { //printf("Main core on top (vcount=%d)\n",nds.VCount); MainScreen.offset = 0; SubScreen.offset = 192; } else { //printf("Main core on bottom (vcount=%d)\n",nds.VCount); MainScreen.offset = 192; SubScreen.offset = 0; } break; } break; case 16: case 32: writereg_POWCNT1(8,adr,val&0xFF); writereg_POWCNT1(8,adr+1,(val>>8)&0xFF); break; } } static INLINE void MMU_IPCSync(u8 proc, u32 val) { //INFO("IPC%s sync 0x%04X (0x%02X|%02X)\n", proc?"7":"9", val, val >> 8, val & 0xFF); u32 sync_l = T1ReadLong(MMU.MMU_MEM[proc][0x40], 0x180) & 0xFFFF; u32 sync_r = T1ReadLong(MMU.MMU_MEM[proc^1][0x40], 0x180) & 0xFFFF; sync_l = ( sync_l & 0x000F ) | ( val & 0x0F00 ); sync_r = ( sync_r & 0x6F00 ) | ( (val >> 8) & 0x000F ); sync_l |= val & 0x6000; if(nds.ensataEmulation && proc==1 && nds.ensataIpcSyncCounter<9) { u32 iteration = (val&0x0F00)>>8; if(iteration==8-nds.ensataIpcSyncCounter) nds.ensataIpcSyncCounter++; else printf("ERROR: ENSATA IPC SYNC HACK FAILED; BAD THINGS MAY HAPPEN\n"); //for some reason, the arm9 doesn't handshake when ensata is detected. //so we complete the protocol here, which is to mirror the values 8..0 back to //the arm7 as they are written by the arm7 sync_r &= 0xF0FF; sync_r |= (iteration<<8); sync_l &= 0xFFF0; sync_l |= iteration; } T1WriteLong(MMU.MMU_MEM[proc][0x40], 0x180, sync_l); T1WriteLong(MMU.MMU_MEM[proc^1][0x40], 0x180, sync_r); if ((sync_l & IPCSYNC_IRQ_SEND) && (sync_r & IPCSYNC_IRQ_RECV)) NDS_makeIrq(proc^1, IRQ_BIT_IPCSYNC); NDS_Reschedule(); } static INLINE u16 read_timer(int proc, int timerIndex) { //chained timers are always up to date if(MMU.timerMODE[proc][timerIndex] == 0xFFFF) return MMU.timer[proc][timerIndex]; //sometimes a timer will be read when it is not enabled. //we should have the value cached if(!MMU.timerON[proc][timerIndex]) return MMU.timer[proc][timerIndex]; //for unchained timers, we do not keep the timer up to date. its value will need to be calculated here s32 diff = (s32)(nds.timerCycle[proc][timerIndex] - nds_timer); assert(diff>=0); if(diff<0) printf("NEW EMULOOP BAD NEWS PLEASE REPORT: TIME READ DIFF < 0 (%d) (%d) (%d)\n",diff,timerIndex,MMU.timerMODE[proc][timerIndex]); s32 units = diff / (1<65536) { printf("NEW EMULOOP BAD NEWS PLEASE REPORT: UNITS %d:%d = %d\n",proc,timerIndex,units); ret = 0; } else ret = 65535 - units; return ret; } static INLINE void write_timer(int proc, int timerIndex, u16 val) { #if 0 int mask = ((val&0x80)>>7) << timerIndex; MMU.CheckTimers = (MMU.CheckTimers & (~mask)) | mask; #endif if(val&0x80) MMU.timer[proc][timerIndex] = MMU.timerReload[proc][timerIndex]; else { if(MMU.timerON[proc][timerIndex]) //read the timer value one last time MMU.timer[proc][timerIndex] = read_timer(proc,timerIndex); } MMU.timerON[proc][timerIndex] = val & 0x80; switch(val&7) { case 0 : MMU.timerMODE[proc][timerIndex] = 0+1; break; case 1 : MMU.timerMODE[proc][timerIndex] = 6+1; break; case 2 : MMU.timerMODE[proc][timerIndex] = 8+1; break; case 3 : MMU.timerMODE[proc][timerIndex] = 10+1; break; default : MMU.timerMODE[proc][timerIndex] = 0xFFFF; break; } int remain = 65536 - MMU.timerReload[proc][timerIndex]; nds.timerCycle[proc][timerIndex] = nds_timer + (remain<=255) ret |= BIT(24); //fifo full if(gxFIFO.size<128) ret |= BIT(25); //fifo half if(gxFIFO.size==0) ret |= BIT(26); //fifo empty //determine busy flag. //if we're waiting for a flush, we're busy if(isSwapBuffers) ret |= BIT(27); //if fifo is nonempty, we're busy if(gxFIFO.size!=0) ret |= BIT(27); //printf("[%d] %d %d %d\n",currFrameCounter,se,sb,gxFIFO.size!=0); ret |= ((gxfifo_irq & 0x3) << 30); //user's irq flags //printf("vc=%03d Returning gxstat read: %08X (isSwapBuffers=%d)\n",nds.VCount,ret,isSwapBuffers); //ret = (2 << 8); //INFO("gxSTAT 0x%08X (proj %i, pos %i)\n", ret, _hack_getMatrixStackLevel(1), _hack_getMatrixStackLevel(2)); return ret; } void TGXSTAT::write32(const u32 val) { gxfifo_irq = (val>>30)&3; if(BIT15(val)) { // Writing "1" to Bit15 does reset the Error Flag (Bit15), // and additionally resets the Projection Stack Pointer (Bit13) mtxStack[0].position = 0; se = 0; //clear stack error flag } //printf("gxstat write: %08X while gxfifo.size=%d\n",val,gxFIFO.size); //if (val & (1<<29)) // clear? (only in homebrew?) //{ // GFX_PIPEclear(); // GFX_FIFOclear(); // return; //} } void TGXSTAT::savestate(EMUFILE *f) { write32le(1,f); //version write8le(tb,f); write8le(tr,f); write8le(se,f); write8le(gxfifo_irq,f); write8le(sb,f); } bool TGXSTAT::loadstate(EMUFILE *f) { u32 version; if(read32le(&version,f) != 1) return false; if(version > 1) return false; read8le(&tb,f); read8le(&tr,f); read8le(&se,f); read8le(&gxfifo_irq,f); if (version >= 1) read8le(&sb,f); return true; } //this could be inlined... void MMU_struct_new::write_dma(const int proc, const int size, const u32 _adr, const u32 val) { //printf("%08lld -- write_dma: %d %d %08X %08X\n",nds_timer,proc,size,_adr,val); const u32 adr = _adr - _REG_DMA_CONTROL_MIN; const u32 chan = adr/12; const u32 regnum = (adr - chan*12)>>2; MMU_new.dma[proc][chan].regs[regnum]->write(size,adr,val); } //this could be inlined... u32 MMU_struct_new::read_dma(const int proc, const int size, const u32 _adr) { const u32 adr = _adr - _REG_DMA_CONTROL_MIN; const u32 chan = adr/12; const u32 regnum = (adr - chan*12)>>2; const u32 temp = MMU_new.dma[proc][chan].regs[regnum]->read(size,adr); //printf("%08lld -- read_dma: %d %d %08X = %08X\n",nds_timer,proc,size,_adr,temp); return temp; } bool MMU_struct_new::is_dma(const u32 adr) { return adr >= _REG_DMA_CONTROL_MIN && adr <= _REG_DMA_CONTROL_MAX; } MMU_struct_new::MMU_struct_new() { for(int i=0;i<2;i++) for(int j=0;j<4;j++) { dma[i][j].procnum = i; dma[i][j].chan = j; } } void DivController::savestate(EMUFILE* os) { write8le(&mode,os); write8le(&busy,os); write8le(&div0,os); } bool DivController::loadstate(EMUFILE* is, int version) { int ret = 1; ret &= read8le(&mode,is); ret &= read8le(&busy,is); ret &= read8le(&div0,is); return ret==1; } void SqrtController::savestate(EMUFILE* os) { write8le(&mode,os); write8le(&busy,os); } bool SqrtController::loadstate(EMUFILE* is, int version) { int ret=1; ret &= read8le(&mode,is); ret &= read8le(&busy,is); return ret==1; } bool DmaController::loadstate(EMUFILE* f) { u32 version; if(read32le(&version,f) != 1) return false; if(version >1) return false; read8le(&enable,f); read8le(&irq,f); read8le(&repeatMode,f); read8le(&_startmode,f); read8le(&userEnable,f); read32le(&wordcount,f); u8 temp; read8le(&temp,f); startmode = (EDMAMode)temp; read8le(&temp,f); bitWidth = (EDMABitWidth)temp; read8le(&temp,f); sar = (EDMASourceUpdate)temp; read8le(&temp,f); dar = (EDMADestinationUpdate)temp; read32le(&saddr,f); read32le(&daddr,f); read32le(&dmaCheck,f); read32le(&running,f); read32le(&paused,f); read32le(&triggered,f); read64le(&nextEvent,f); if(version==1) { read32le(&saddr_user,f); read32le(&daddr_user,f); } return true; } void DmaController::savestate(EMUFILE *f) { write32le(1,f); //version write8le(enable,f); write8le(irq,f); write8le(repeatMode,f); write8le(_startmode,f); write8le(userEnable,f); write32le(wordcount,f); write8le(startmode,f); write8le(bitWidth,f); write8le(sar,f); write8le(dar,f); write32le(saddr,f); write32le(daddr,f); write32le(dmaCheck,f); write32le(running,f); write32le(paused,f); write32le(triggered,f); write64le(nextEvent,f); write32le(saddr_user,f); write32le(daddr_user,f); } void DmaController::write32(const u32 val) { if(running) { //desp triggers this a lot. figure out whats going on //printf("thats weird..user edited dma control while it was running\n"); } wordcount = val&0x1FFFFF; u8 wasRepeatMode = repeatMode; u8 wasEnable = enable; u32 valhi = val>>16; dar = (EDMADestinationUpdate)((valhi>>5)&3); sar = (EDMASourceUpdate)((valhi>>7)&3); repeatMode = BIT9(valhi); bitWidth = (EDMABitWidth)BIT10(valhi); _startmode = (valhi>>11)&7; if(procnum==ARMCPU_ARM7) _startmode &= 6; irq = BIT14(valhi); enable = BIT15(valhi); //printf("ARM%c DMA%d WRITE %08X count %08X, %08X -> %08X\n", procnum?'7':'9', chan, val, wordcount, saddr_user, daddr_user); //if(irq) printf("!!!!!!!!!!!!IRQ!!!!!!!!!!!!!\n"); //make sure we don't get any old triggers if(!wasEnable && enable) triggered = FALSE; if(enable) { //address registers are reloaded from user's settings whenever dma is enabled //this is tested well by contra4 classic games, which use this to hdma scroll registers //specifically in the fit-screen mode. saddr = saddr_user; daddr = daddr_user; } //printf("dma %d,%d set to startmode %d with wordcount set to: %08X\n",procnum,chan,_startmode,wordcount); if (enable && procnum==1 && (!(chan&1)) && _startmode==6) printf("!!!---!!! WIFI DMA: %08X TO %08X, %i WORDS !!!---!!!\n", saddr, daddr, wordcount); //analyze enabling and startmode. //note that we only do this if the dma was freshly enabled. //we should probably also only be latching these other regs in that case too.. //but for now just this one will do (otherwise the dma repeat stop procedure (in this case the ff4 title menu load with gamecard dma) will fail) //if(!running) enable = userEnable; //if we were previously in a triggered mode, and were already enabled, //then don't re-trigger now. this is rather confusing.. //we really only want to auto-trigger gxfifo and immediate modes. //but we don't know what mode we're in yet. //so this is our workaround //(otherwise the dma repeat stop procedure (in this case the ff4 title menu load with gamecard dma) will fail) bool doNotStart = false; if(startmode != EDMAMode_Immediate && startmode != EDMAMode_GXFifo && wasEnable) doNotStart = true; //this dma may need to trigger now, so give it a chance //if(!(wasRepeatMode && !repeatMode)) //this was an older test if(!doNotStart) doSchedule(); driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA); } void DmaController::exec() { //this function runs when the DMA ends. the dma start actually queues this event after some kind of guess as to how long the DMA should take //printf("ARM%c DMA%d execute, count %08X, mode %d%s\n", procnum?'7':'9', chan, wordcount, startmode, running?" - RUNNING":""); //we'll need to unfreeze the arm9 bus now if(procnum==ARMCPU_ARM9) nds.freezeBus &= ~(1<<(chan+1)); dmaCheck = FALSE; if(running) { switch(startmode) { case EDMAMode_GXFifo: //this dma mode won't finish always its job when it gets signalled //sometimes it will have words left to transfer. //if(!paused) printf("gxfifo dma ended with %d remaining\n",wordcount); //only print this once if(wordcount>0) { doPause(); break; } default: doStop(); driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA); return; } } if(enable) { //analyze startmode (this only gets latched when a dma begins) if(procnum==ARMCPU_ARM9) startmode = (EDMAMode)_startmode; else { //arm7 startmode analysis: static const EDMAMode lookup[] = {EDMAMode_Immediate,EDMAMode_VBlank,EDMAMode_Card,EDMAMode7_Wifi}; //arm7 has a slightly different startmode encoding startmode = lookup[_startmode>>1]; if(startmode == EDMAMode7_Wifi && (chan==1 || chan==3)) startmode = EDMAMode7_GBASlot; } //make it run, if it is triggered //but first, scan for triggering conditions switch(startmode) { case EDMAMode_Immediate: triggered = TRUE; break; case EDMAMode_GXFifo: if(gxFIFO.size<=127) triggered = TRUE; break; default: break; } if(triggered) { //if(procnum==0) printf("vc=%03d %08lld trig type %d dma#%d w/words %d at src:%08X dst:%08X gxf:%d",nds.VCount,nds_timer,startmode,chan,wordcount,saddr,daddr,gxFIFO.size); running = TRUE; paused = FALSE; if(procnum == ARMCPU_ARM9) doCopy(); else doCopy(); //printf(";%d\n",gxFIFO.size); } } driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA); } template void DmaController::doCopy() { //generate a copy count depending on various copy mode's behavior u32 todo = wordcount; u32 sz = (bitWidth==EDMABitWidth_16)?2:4; u32 dstinc = 0, srcinc = 0; if(PROCNUM == ARMCPU_ARM9) if(todo == 0) todo = 0x200000; //according to gbatek.. we've verified this behaviour on the arm7 if(startmode == EDMAMode_MemDisplay) { todo = 128; //this is a hack. maybe an alright one though. it should be 4 words at a time. this is a whole scanline //apparently this dma turns off after it finishes a frame if(nds.VCount==191) enable = 0; } if(startmode == EDMAMode_Card) todo = MMU.dscard[PROCNUM].transfer_count / sz; if(startmode == EDMAMode_GXFifo) todo = std::min(todo,(u32)112); //determine how we're going to copy bool bogarted = false; switch(dar) { case EDMADestinationUpdate_Increment : dstinc = sz; break; case EDMADestinationUpdate_Decrement : dstinc = (u32)-(s32)sz; break; case EDMADestinationUpdate_Fixed : dstinc = 0; break; case EDMADestinationUpdate_IncrementReload : dstinc = sz; break; default: bogarted = true; break; } switch(sar) { case EDMASourceUpdate_Increment : srcinc = sz; break; case EDMASourceUpdate_Decrement : srcinc = (u32)-(s32)sz; break; case EDMASourceUpdate_Fixed : srcinc = 0; break; case EDMASourceUpdate_Invalid : bogarted = true; break; default: bogarted = true; break; } //need to figure out what to do about this if(bogarted) { printf("YOUR GAME IS BOGARTED!!! PLEASE REPORT!!!\n"); assert(false); return; } u32 src = saddr; u32 dst = daddr; //if these do not use MMU_AT_DMA and the corresponding code in the read/write routines, //then danny phantom title screen will be filled with a garbage char which is made by //dmaing from 0x00000000 to 0x06000000 //TODO - these might be losing out a lot by not going through the templated version anymore. //we might make another function to do just the raw copy op which can use them with checks //outside the loop int time_elapsed = 0; if(sz==4) { for(s32 i=(s32)todo; i>0; i--) { time_elapsed += _MMU_accesstime(src,true); time_elapsed += _MMU_accesstime(dst,true); u32 temp = _MMU_read32(procnum,MMU_AT_DMA,src); _MMU_write32(procnum,MMU_AT_DMA,dst, temp); dst += dstinc; src += srcinc; } } else { for(s32 i=(s32)todo; i>0; i--) { time_elapsed += _MMU_accesstime(src,true); time_elapsed += _MMU_accesstime(dst,true); u16 temp = _MMU_read16(procnum,MMU_AT_DMA,src); _MMU_write16(procnum,MMU_AT_DMA,dst, temp); dst += dstinc; src += srcinc; } } //printf("ARM%c dma of size %d from 0x%08X to 0x%08X took %d cycles\n",PROCNUM==0?'9':'7',todo*sz,saddr,daddr,time_elapsed); //reschedule an event for the end of this dma, and figure out how much it cost us doSchedule(); nextEvent += time_elapsed; //freeze the ARM9 bus for the duration of this DMA //thats not entirely accurate if(procnum==ARMCPU_ARM9) nds.freezeBus |= (1<<(chan+1)); //write back the addresses saddr = src; if(dar != EDMADestinationUpdate_IncrementReload) //but dont write back dst if we were supposed to reload daddr = dst; if(!repeatMode) { if(startmode == EDMAMode_Card) wordcount = 0; else wordcount -= todo; } } void triggerDma(EDMAMode mode) { MACRODO2(0, { const int i=X; MACRODO4(0, { const int j=X; MMU_new.dma[i][j].tryTrigger(mode); }); }); } void DmaController::tryTrigger(EDMAMode mode) { if(startmode != mode) return; if(!enable) return; //hmm dont trigger it if its already running! //but paused things need triggers to continue if(running && !paused) return; triggered = TRUE; doSchedule(); } void DmaController::doSchedule() { dmaCheck = TRUE; nextEvent = nds_timer; NDS_RescheduleDMA(); } void DmaController::doPause() { triggered = FALSE; paused = TRUE; } void DmaController::doStop() { //if(procnum==0) printf("%08lld stop type %d dma#%d\n",nds_timer,startmode,chan); running = FALSE; if(!repeatMode) enable = FALSE; if(irq) { NDS_makeIrq(procnum,IRQ_BIT_DMA_0+chan); } } u32 DmaController::read32() { u32 ret = 0; ret |= enable<<31; ret |= irq<<30; ret |= _startmode<<27; ret |= bitWidth<<26; ret |= repeatMode<<25; ret |= sar<<23; ret |= dar<<21; ret |= wordcount; //printf("dma %d,%d READ %08X\n",procnum,chan,ret); return ret; } static INLINE void write_auxspicnt(const int PROCNUM, const int size, const int adr, const int val) { u16 oldCnt = MMU.AUX_SPI_CNT; switch(size) { case 16: MMU.AUX_SPI_CNT = val; break; case 8: T1WriteByte((u8*)&MMU.AUX_SPI_CNT, adr, val); break; } bool csOld = (oldCnt & (1 << 6))?true:false; bool cs = (MMU.AUX_SPI_CNT & (1 << 6))?true:false; bool spi = (MMU.AUX_SPI_CNT & (1 << 13))?true:false; if ((!cs && csOld) || (spi && (oldCnt == 0) && !cs)) { //printf("MMU%c: CS changed from HIGH to LOW *****\n", PROCNUM?'7':'9'); slot1_device->auxspi_reset(PROCNUM); } //printf("MMU%c: cnt %04X, old %04X\n", PROCNUM?'7':'9', MMU.AUX_SPI_CNT, oldCnt); } template bool validateIORegsWrite(u32 addr, u8 size, u32 val) { if (PROCNUM == ARMCPU_ARM9) { switch (addr & 0x0FFFFFFC) { // Display Engine A case REG_DISPA_DISPCNT: case REG_DISPA_DISPSTAT: case REG_DISPA_VCOUNT: // same as GBA... case REG_DISPA_BG0CNT: case REG_DISPA_BG1CNT: case REG_DISPA_BG2CNT: case REG_DISPA_BG3CNT: case REG_DISPA_BG0HOFS: case REG_DISPA_BG0VOFS: case REG_DISPA_BG1HOFS: case REG_DISPA_BG1VOFS: case REG_DISPA_BG2HOFS: case REG_DISPA_BG2VOFS: case REG_DISPA_BG3HOFS: case REG_DISPA_BG3VOFS: case REG_DISPA_BG2PA: case REG_DISPA_BG2PB: case REG_DISPA_BG2PC: case REG_DISPA_BG2PD: case REG_DISPA_BG2XL: case REG_DISPA_BG2XH: case REG_DISPA_BG2YL: case REG_DISPA_BG2YH: case REG_DISPA_BG3PA: case REG_DISPA_BG3PB: case REG_DISPA_BG3PC: case REG_DISPA_BG3PD: case REG_DISPA_BG3XL: case REG_DISPA_BG3XH: case REG_DISPA_BG3YL: case REG_DISPA_BG3YH: case REG_DISPA_WIN0H: case REG_DISPA_WIN1H: case REG_DISPA_WIN0V: case REG_DISPA_WIN1V: case REG_DISPA_WININ: case REG_DISPA_WINOUT: case REG_DISPA_MOSAIC: case REG_DISPA_BLDCNT: case REG_DISPA_BLDALPHA: case REG_DISPA_BLDY: // ...GBA case REG_DISPA_DISP3DCNT: case REG_DISPA_DISPCAPCNT: case REG_DISPA_DISPMMEMFIFO: case REG_DISPA_MASTERBRIGHT: // DMA case REG_DMA0SAD: case REG_DMA0DAD: case REG_DMA0CNTL: case REG_DMA0CNTH: case REG_DMA1SAD: case REG_DMA1DAD: case REG_DMA1CNTL: case REG_DMA2SAD: case REG_DMA2DAD: case REG_DMA2CNTL: case REG_DMA2CNTH: case REG_DMA3SAD: case REG_DMA3DAD: case REG_DMA3CNTL: case REG_DMA3CNTH: case REG_DMA0FILL: case REG_DMA1FILL: case REG_DMA2FILL: case REG_DMA3FILL: // Timers case REG_TM0CNTL: case REG_TM0CNTH: case REG_TM1CNTL: case REG_TM1CNTH: case REG_TM2CNTL: case REG_TM2CNTH: case REG_TM3CNTL: case REG_TM3CNTH: // Keypad Input case REG_KEYINPUT: case REG_KEYCNT: // IPC case REG_IPCSYNC: case REG_IPCFIFOCNT: case REG_IPCFIFOSEND: // ROM case REG_AUXSPICNT: case REG_AUXSPIDATA: case REG_GCROMCTRL: case REG_GCCMDOUT + 0x00: case REG_GCCMDOUT + 0x04: case REG_ENCSEED0L: case REG_ENCSEED1L: case REG_ENCSEED0H: case REG_ENCSEED1H: // Memory/IRQ case REG_EXMEMCNT: case REG_IME: case REG_IE: case REG_IF: case REG_VRAMCNTA: case REG_VRAMCNTB: case REG_VRAMCNTC: case REG_VRAMCNTD: case REG_VRAMCNTE: case REG_VRAMCNTF: case REG_VRAMCNTG: case REG_WRAMCNT: case REG_VRAMCNTH: case REG_VRAMCNTI: // Math case REG_DIVCNT: case REG_DIVNUMER + 0x00: case REG_DIVNUMER + 0x04: case REG_DIVDENOM + 0x00: case REG_DIVDENOM + 0x04: case REG_DIVRESULT + 0x00: case REG_DIVRESULT + 0x04: case REG_DIVREMRESULT + 0x00: case REG_DIVREMRESULT + 0x04: case REG_SQRTCNT: case REG_SQRTRESULT: case REG_SQRTPARAM + 0x00: case REG_SQRTPARAM + 0x04: // Other case REG_POSTFLG: case REG_HALTCNT: case REG_POWCNT1: //R case eng_3D_RDLINES_COUNT: // 3D =============================================================== case eng_3D_EDGE_COLOR + 0x00: case eng_3D_EDGE_COLOR + 0x04: case eng_3D_EDGE_COLOR + 0x08: case eng_3D_EDGE_COLOR + 0x0C: case eng_3D_ALPHA_TEST_REF: case eng_3D_CLEAR_COLOR: case eng_3D_CLEAR_DEPTH: case eng_3D_CLRIMAGE_OFFSET: case eng_3D_FOG_COLOR: case eng_3D_FOG_OFFSET: case eng_3D_FOG_TABLE + 0x00: case eng_3D_FOG_TABLE + 0x04: case eng_3D_FOG_TABLE + 0x08: case eng_3D_FOG_TABLE + 0x0C: case eng_3D_FOG_TABLE + 0x10: case eng_3D_FOG_TABLE + 0x14: case eng_3D_FOG_TABLE + 0x18: case eng_3D_FOG_TABLE + 0x1C: case eng_3D_TOON_TABLE + 0x00: case eng_3D_TOON_TABLE + 0x04: case eng_3D_TOON_TABLE + 0x08: case eng_3D_TOON_TABLE + 0x0C: case eng_3D_TOON_TABLE + 0x10: case eng_3D_TOON_TABLE + 0x14: case eng_3D_TOON_TABLE + 0x18: case eng_3D_TOON_TABLE + 0x1C: case eng_3D_TOON_TABLE + 0x20: case eng_3D_TOON_TABLE + 0x24: case eng_3D_TOON_TABLE + 0x28: case eng_3D_TOON_TABLE + 0x2C: case eng_3D_TOON_TABLE + 0x30: case eng_3D_TOON_TABLE + 0x34: case eng_3D_TOON_TABLE + 0x38: case eng_3D_TOON_TABLE + 0x3C: case eng_3D_GXFIFO + 0x00: case eng_3D_GXFIFO + 0x04: case eng_3D_GXFIFO + 0x08: case eng_3D_GXFIFO + 0x0C: case eng_3D_GXFIFO + 0x10: case eng_3D_GXFIFO + 0x14: case eng_3D_GXFIFO + 0x18: case eng_3D_GXFIFO + 0x1C: case eng_3D_GXFIFO + 0x20: case eng_3D_GXFIFO + 0x24: case eng_3D_GXFIFO + 0x28: case eng_3D_GXFIFO + 0x2C: case eng_3D_GXFIFO + 0x30: case eng_3D_GXFIFO + 0x34: case eng_3D_GXFIFO + 0x38: case eng_3D_GXFIFO + 0x3C: // 3d commands case cmd_3D_MTX_MODE: case cmd_3D_MTX_PUSH: case cmd_3D_MTX_POP: case cmd_3D_MTX_STORE: case cmd_3D_MTX_RESTORE: case cmd_3D_MTX_IDENTITY: case cmd_3D_MTX_LOAD_4x4: case cmd_3D_MTX_LOAD_4x3: case cmd_3D_MTX_MULT_4x4: case cmd_3D_MTX_MULT_4x3: case cmd_3D_MTX_MULT_3x3: case cmd_3D_MTX_SCALE: case cmd_3D_MTX_TRANS: case cmd_3D_COLOR: case cmd_3D_NORMA: case cmd_3D_TEXCOORD: case cmd_3D_VTX_16: case cmd_3D_VTX_10: case cmd_3D_VTX_XY: case cmd_3D_VTX_XZ: case cmd_3D_VTX_YZ: case cmd_3D_VTX_DIFF: case cmd_3D_POLYGON_ATTR: case cmd_3D_TEXIMAGE_PARAM: case cmd_3D_PLTT_BASE: case cmd_3D_DIF_AMB: case cmd_3D_SPE_EMI: case cmd_3D_LIGHT_VECTOR: case cmd_3D_LIGHT_COLOR: case cmd_3D_SHININESS: case cmd_3D_BEGIN_VTXS: case cmd_3D_END_VTXS: case cmd_3D_SWAP_BUFFERS: case cmd_3D_VIEWPORT: case cmd_3D_BOX_TEST: case cmd_3D_POS_TEST: case cmd_3D_VEC_TEST: case eng_3D_GXSTAT: //R case eng_3D_RAM_COUNT: case eng_3D_DISP_1DOT_DEPTH: //R case eng_3D_POS_RESULT + 0x00: case eng_3D_POS_RESULT + 0x04: case eng_3D_POS_RESULT + 0x08: case eng_3D_POS_RESULT + 0x0C: //R case eng_3D_VEC_RESULT + 0x00: case eng_3D_VEC_RESULT + 0x04: //R case eng_3D_CLIPMTX_RESULT + 0x00: case eng_3D_CLIPMTX_RESULT + 0x04: case eng_3D_CLIPMTX_RESULT + 0x08: case eng_3D_CLIPMTX_RESULT + 0x0C: //R case eng_3D_CLIPMTX_RESULT + 0x10: case eng_3D_CLIPMTX_RESULT + 0x14: case eng_3D_CLIPMTX_RESULT + 0x18: case eng_3D_CLIPMTX_RESULT + 0x1C: //R case eng_3D_CLIPMTX_RESULT + 0x20: case eng_3D_CLIPMTX_RESULT + 0x24: case eng_3D_CLIPMTX_RESULT + 0x28: case eng_3D_CLIPMTX_RESULT + 0x2C: //R case eng_3D_CLIPMTX_RESULT + 0x30: case eng_3D_CLIPMTX_RESULT + 0x34: case eng_3D_CLIPMTX_RESULT + 0x38: case eng_3D_CLIPMTX_RESULT + 0x3C: //R case eng_3D_VECMTX_RESULT + 0x00: case eng_3D_VECMTX_RESULT + 0x04: case eng_3D_VECMTX_RESULT + 0x08: case eng_3D_VECMTX_RESULT + 0x0C: //R case eng_3D_VECMTX_RESULT + 0x20: // 0x04001xxx case REG_DISPB_DISPCNT: // same as GBA... case REG_DISPB_BG0CNT: case REG_DISPB_BG1CNT: case REG_DISPB_BG2CNT: case REG_DISPB_BG3CNT: case REG_DISPB_BG0HOFS: case REG_DISPB_BG0VOFS: case REG_DISPB_BG1HOFS: case REG_DISPB_BG1VOFS: case REG_DISPB_BG2HOFS: case REG_DISPB_BG2VOFS: case REG_DISPB_BG3HOFS: case REG_DISPB_BG3VOFS: case REG_DISPB_BG2PA: case REG_DISPB_BG2PB: case REG_DISPB_BG2PC: case REG_DISPB_BG2PD: case REG_DISPB_BG2XL: case REG_DISPB_BG2XH: case REG_DISPB_BG2YL: case REG_DISPB_BG2YH: case REG_DISPB_BG3PA: case REG_DISPB_BG3PB: case REG_DISPB_BG3PC: case REG_DISPB_BG3PD: case REG_DISPB_BG3XL: case REG_DISPB_BG3XH: case REG_DISPB_BG3YL: case REG_DISPB_BG3YH: case REG_DISPB_WIN0H: case REG_DISPB_WIN1H: case REG_DISPB_WIN0V: case REG_DISPB_WIN1V: case REG_DISPB_WININ: case REG_DISPB_WINOUT: case REG_DISPB_MOSAIC: case REG_DISPB_BLDCNT: case REG_DISPB_BLDALPHA: case REG_DISPB_BLDY: // ...GBA case REG_DISPB_MASTERBRIGHT: // 0x04100000 case REG_IPCFIFORECV: case REG_GCDATAIN: //printf("MMU9 write%02d to register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr); return true; default: #ifdef DEVELOPER printf("MMU9 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr); #endif return false; } } // ARM7 if (PROCNUM == ARMCPU_ARM7) { switch (addr & 0x0FFFFFFC) { case REG_DISPA_DISPSTAT: case REG_DISPA_VCOUNT: // DMA case REG_DMA0SAD: case REG_DMA0DAD: case REG_DMA0CNTL: case REG_DMA0CNTH: case REG_DMA1SAD: case REG_DMA1DAD: case REG_DMA1CNTL: case REG_DMA2SAD: case REG_DMA2DAD: case REG_DMA2CNTL: case REG_DMA2CNTH: case REG_DMA3SAD: case REG_DMA3DAD: case REG_DMA3CNTL: case REG_DMA3CNTH: case REG_DMA0FILL: case REG_DMA1FILL: case REG_DMA2FILL: case REG_DMA3FILL: // Timers case REG_TM0CNTL: case REG_TM0CNTH: case REG_TM1CNTL: case REG_TM1CNTH: case REG_TM2CNTL: case REG_TM2CNTH: case REG_TM3CNTL: case REG_TM3CNTH: // SIO/Keypad Input/RTC case REG_SIODATA32: case REG_SIOCNT: case REG_KEYINPUT: case REG_KEYCNT: case REG_RCNT: case REG_EXTKEYIN: case REG_RTC: // IPC case REG_IPCSYNC: case REG_IPCFIFOCNT: case REG_IPCFIFOSEND: // ROM case REG_AUXSPICNT: case REG_AUXSPIDATA: case REG_GCROMCTRL: case REG_GCCMDOUT: case REG_GCCMDOUT + 4: case REG_ENCSEED0L: case REG_ENCSEED1L: case REG_ENCSEED0H: case REG_ENCSEED1H: case REG_SPICNT: case REG_SPIDATA: // Memory/IRQ case REG_EXMEMCNT: case REG_IME: case REG_IE: case REG_IF: case REG_VRAMSTAT: case REG_WRAMSTAT: // Other case REG_POSTFLG: case REG_HALTCNT: case REG_POWCNT2: case REG_BIOSPROT: // Sound // 0x04100000 - IPC case REG_IPCFIFORECV: case REG_GCDATAIN: //printf("MMU7 write%02d to register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr); return true; default: #ifdef DEVELOPER printf("MMU7 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr); #endif return false; } } return false; } #if 0 template bool validateIORegsRead(u32 addr, u8 size) { if (PROCNUM == ARMCPU_ARM9) { switch (addr & 0x0FFFFFFC) { // Display Engine A case REG_DISPA_DISPCNT: case REG_DISPA_DISPSTAT: case REG_DISPA_VCOUNT: // same as GBA... case REG_DISPA_BG0CNT: case REG_DISPA_BG1CNT: case REG_DISPA_BG2CNT: case REG_DISPA_BG3CNT: case REG_DISPA_BG0HOFS: case REG_DISPA_BG0VOFS: case REG_DISPA_BG1HOFS: case REG_DISPA_BG1VOFS: case REG_DISPA_BG2HOFS: case REG_DISPA_BG2VOFS: case REG_DISPA_BG3HOFS: case REG_DISPA_BG3VOFS: case REG_DISPA_BG2PA: case REG_DISPA_BG2PB: case REG_DISPA_BG2PC: case REG_DISPA_BG2PD: case REG_DISPA_BG2XL: case REG_DISPA_BG2XH: case REG_DISPA_BG2YL: case REG_DISPA_BG2YH: case REG_DISPA_BG3PA: case REG_DISPA_BG3PB: case REG_DISPA_BG3PC: case REG_DISPA_BG3PD: case REG_DISPA_BG3XL: case REG_DISPA_BG3XH: case REG_DISPA_BG3YL: case REG_DISPA_BG3YH: case REG_DISPA_WIN0H: case REG_DISPA_WIN1H: case REG_DISPA_WIN0V: case REG_DISPA_WIN1V: case REG_DISPA_WININ: case REG_DISPA_WINOUT: case REG_DISPA_MOSAIC: case REG_DISPA_BLDCNT: case REG_DISPA_BLDALPHA: case REG_DISPA_BLDY: // ...GBA case REG_DISPA_DISP3DCNT: case REG_DISPA_DISPCAPCNT: case REG_DISPA_DISPMMEMFIFO: case REG_DISPA_MASTERBRIGHT: // DMA case REG_DMA0SAD: case REG_DMA0DAD: case REG_DMA0CNTL: case REG_DMA0CNTH: case REG_DMA1SAD: case REG_DMA1DAD: case REG_DMA1CNTL: case REG_DMA2SAD: case REG_DMA2DAD: case REG_DMA2CNTL: case REG_DMA2CNTH: case REG_DMA3SAD: case REG_DMA3DAD: case REG_DMA3CNTL: case REG_DMA3CNTH: case REG_DMA0FILL: case REG_DMA1FILL: case REG_DMA2FILL: case REG_DMA3FILL: // Timers case REG_TM0CNTL: case REG_TM0CNTH: case REG_TM1CNTL: case REG_TM1CNTH: case REG_TM2CNTL: case REG_TM2CNTH: case REG_TM3CNTL: case REG_TM3CNTH: // Keypad Input case REG_KEYINPUT: case REG_KEYCNT: // IPC case REG_IPCSYNC: case REG_IPCFIFOCNT: case REG_IPCFIFOSEND: // ROM case REG_AUXSPICNT: case REG_AUXSPIDATA: case REG_GCROMCTRL: case REG_GCCMDOUT + 0x00: case REG_GCCMDOUT + 0x04: case REG_ENCSEED0L: case REG_ENCSEED1L: case REG_ENCSEED0H: case REG_ENCSEED1H: // Memory/IRQ case REG_EXMEMCNT: case REG_IME: case REG_IE: case REG_IF: case REG_VRAMCNTA: case REG_VRAMCNTB: case REG_VRAMCNTC: case REG_VRAMCNTD: case REG_VRAMCNTE: case REG_VRAMCNTF: case REG_VRAMCNTG: case REG_WRAMCNT: case REG_VRAMCNTH: case REG_VRAMCNTI: // Math case REG_DIVCNT: case REG_DIVNUMER + 0x00: case REG_DIVNUMER + 0x04: case REG_DIVDENOM + 0x00: case REG_DIVDENOM + 0x04: case REG_DIVRESULT + 0x00: case REG_DIVRESULT + 0x04: case REG_DIVREMRESULT + 0x00: case REG_DIVREMRESULT + 0x04: case REG_SQRTCNT: case REG_SQRTRESULT: case REG_SQRTPARAM + 0x00: case REG_SQRTPARAM + 0x04: // Other case REG_POSTFLG: case REG_HALTCNT: case REG_POWCNT1: case eng_3D_RDLINES_COUNT: // 3D =============================================================== //W case eng_3D_EDGE_COLOR + 0x00: //W case eng_3D_EDGE_COLOR + 0x04: //W case eng_3D_EDGE_COLOR + 0x08: //W case eng_3D_EDGE_COLOR + 0x0C: //W case eng_3D_ALPHA_TEST_REF: //W case eng_3D_CLEAR_COLOR: //W case eng_3D_CLEAR_DEPTH: //W case eng_3D_CLRIMAGE_OFFSET: //W case eng_3D_FOG_COLOR: //W case eng_3D_FOG_OFFSET: //W case eng_3D_FOG_TABLE + 0x00: case eng_3D_FOG_TABLE + 0x04: case eng_3D_FOG_TABLE + 0x08: case eng_3D_FOG_TABLE + 0x0C: //W case eng_3D_FOG_TABLE + 0x10: case eng_3D_FOG_TABLE + 0x14: case eng_3D_FOG_TABLE + 0x18: case eng_3D_FOG_TABLE + 0x1C: //W case eng_3D_TOON_TABLE + 0x00: case eng_3D_TOON_TABLE + 0x04: case eng_3D_TOON_TABLE + 0x08: case eng_3D_TOON_TABLE + 0x0C: //W case eng_3D_TOON_TABLE + 0x10: case eng_3D_TOON_TABLE + 0x14: case eng_3D_TOON_TABLE + 0x18: case eng_3D_TOON_TABLE + 0x1C: //W case eng_3D_TOON_TABLE + 0x20: case eng_3D_TOON_TABLE + 0x24: case eng_3D_TOON_TABLE + 0x28: case eng_3D_TOON_TABLE + 0x2C: //W case eng_3D_TOON_TABLE + 0x30: case eng_3D_TOON_TABLE + 0x34: case eng_3D_TOON_TABLE + 0x38: case eng_3D_TOON_TABLE + 0x3C: //W case eng_3D_GXFIFO + 0x00: case eng_3D_GXFIFO + 0x04: case eng_3D_GXFIFO + 0x08: case eng_3D_GXFIFO + 0x0C: //W case eng_3D_GXFIFO + 0x10: case eng_3D_GXFIFO + 0x14: case eng_3D_GXFIFO + 0x18: case eng_3D_GXFIFO + 0x1C: //W case eng_3D_GXFIFO + 0x20: case eng_3D_GXFIFO + 0x24: case eng_3D_GXFIFO + 0x28: case eng_3D_GXFIFO + 0x2C: //W case eng_3D_GXFIFO + 0x30: case eng_3D_GXFIFO + 0x34: case eng_3D_GXFIFO + 0x38: case eng_3D_GXFIFO + 0x3C: // 3d commands //W case cmd_3D_MTX_MODE: //W case cmd_3D_MTX_PUSH: //W case cmd_3D_MTX_POP: //W case cmd_3D_MTX_STORE: //W case cmd_3D_MTX_RESTORE: //W case cmd_3D_MTX_IDENTITY: //W case cmd_3D_MTX_LOAD_4x4: //W case cmd_3D_MTX_LOAD_4x3: //W case cmd_3D_MTX_MULT_4x4: //W case cmd_3D_MTX_MULT_4x3: //W case cmd_3D_MTX_MULT_3x3: //W case cmd_3D_MTX_SCALE: //W case cmd_3D_MTX_TRANS: //W case cmd_3D_COLOR: //W case cmd_3D_NORMA: //W case cmd_3D_TEXCOORD: //W case cmd_3D_VTX_16: //W case cmd_3D_VTX_10: //W case cmd_3D_VTX_XY: //W case cmd_3D_VTX_XZ: //W case cmd_3D_VTX_YZ: //W case cmd_3D_VTX_DIFF: //W case cmd_3D_POLYGON_ATTR: //W case cmd_3D_TEXIMAGE_PARAM: //W case cmd_3D_PLTT_BASE: //W case cmd_3D_DIF_AMB: //W case cmd_3D_SPE_EMI: //W case cmd_3D_LIGHT_VECTOR: //W case cmd_3D_LIGHT_COLOR: //W case cmd_3D_SHININESS: //W case cmd_3D_BEGIN_VTXS: //W case cmd_3D_END_VTXS: //W case cmd_3D_SWAP_BUFFERS: //W case cmd_3D_VIEWPORT: //W case cmd_3D_BOX_TEST: //W case cmd_3D_POS_TEST: //W case cmd_3D_VEC_TEST: case eng_3D_GXSTAT: case eng_3D_RAM_COUNT: //W case eng_3D_DISP_1DOT_DEPTH: case eng_3D_POS_RESULT + 0x00: case eng_3D_POS_RESULT + 0x04: case eng_3D_POS_RESULT + 0x08: case eng_3D_POS_RESULT + 0x0C: case eng_3D_VEC_RESULT + 0x00: case eng_3D_VEC_RESULT + 0x04: case eng_3D_CLIPMTX_RESULT + 0x00: case eng_3D_CLIPMTX_RESULT + 0x04: case eng_3D_CLIPMTX_RESULT + 0x08: case eng_3D_CLIPMTX_RESULT + 0x0C: case eng_3D_CLIPMTX_RESULT + 0x10: case eng_3D_CLIPMTX_RESULT + 0x14: case eng_3D_CLIPMTX_RESULT + 0x18: case eng_3D_CLIPMTX_RESULT + 0x1C: case eng_3D_CLIPMTX_RESULT + 0x20: case eng_3D_CLIPMTX_RESULT + 0x24: case eng_3D_CLIPMTX_RESULT + 0x28: case eng_3D_CLIPMTX_RESULT + 0x2C: case eng_3D_CLIPMTX_RESULT + 0x30: case eng_3D_CLIPMTX_RESULT + 0x34: case eng_3D_CLIPMTX_RESULT + 0x38: case eng_3D_CLIPMTX_RESULT + 0x3C: case eng_3D_VECMTX_RESULT + 0x00: case eng_3D_VECMTX_RESULT + 0x04: case eng_3D_VECMTX_RESULT + 0x08: case eng_3D_VECMTX_RESULT + 0x0C: case eng_3D_VECMTX_RESULT + 0x20: // 0x04001xxx case REG_DISPB_DISPCNT: // same as GBA... case REG_DISPB_BG0CNT: case REG_DISPB_BG1CNT: case REG_DISPB_BG2CNT: case REG_DISPB_BG3CNT: case REG_DISPB_BG0HOFS: case REG_DISPB_BG0VOFS: case REG_DISPB_BG1HOFS: case REG_DISPB_BG1VOFS: case REG_DISPB_BG2HOFS: case REG_DISPB_BG2VOFS: case REG_DISPB_BG3HOFS: case REG_DISPB_BG3VOFS: case REG_DISPB_BG2PA: case REG_DISPB_BG2PB: case REG_DISPB_BG2PC: case REG_DISPB_BG2PD: case REG_DISPB_BG2XL: case REG_DISPB_BG2XH: case REG_DISPB_BG2YL: case REG_DISPB_BG2YH: case REG_DISPB_BG3PA: case REG_DISPB_BG3PB: case REG_DISPB_BG3PC: case REG_DISPB_BG3PD: case REG_DISPB_BG3XL: case REG_DISPB_BG3XH: case REG_DISPB_BG3YL: case REG_DISPB_BG3YH: case REG_DISPB_WIN0H: case REG_DISPB_WIN1H: case REG_DISPB_WIN0V: case REG_DISPB_WIN1V: case REG_DISPB_WININ: case REG_DISPB_WINOUT: case REG_DISPB_MOSAIC: case REG_DISPB_BLDCNT: case REG_DISPB_BLDALPHA: case REG_DISPB_BLDY: // ...GBA case REG_DISPB_MASTERBRIGHT: // 0x04100000 case REG_IPCFIFORECV: case REG_GCDATAIN: //printf("MMU9 read%02d from register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM9_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr); return true; default: #ifdef DEVELOPER printf("MMU9 read%02d from undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM9_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr); #endif return false; } } // ARM7 if (PROCNUM == ARMCPU_ARM7) { switch (addr & 0x0FFFFFFC) { case REG_DISPA_DISPSTAT: case REG_DISPA_VCOUNT: // DMA case REG_DMA0SAD: case REG_DMA0DAD: case REG_DMA0CNTL: case REG_DMA0CNTH: case REG_DMA1SAD: case REG_DMA1DAD: case REG_DMA1CNTL: case REG_DMA2SAD: case REG_DMA2DAD: case REG_DMA2CNTL: case REG_DMA2CNTH: case REG_DMA3SAD: case REG_DMA3DAD: case REG_DMA3CNTL: case REG_DMA3CNTH: case REG_DMA0FILL: case REG_DMA1FILL: case REG_DMA2FILL: case REG_DMA3FILL: // Timers case REG_TM0CNTL: case REG_TM0CNTH: case REG_TM1CNTL: case REG_TM1CNTH: case REG_TM2CNTL: case REG_TM2CNTH: case REG_TM3CNTL: case REG_TM3CNTH: // SIO/Keypad Input/RTC case REG_SIODATA32: case REG_SIOCNT: case REG_KEYINPUT: case REG_KEYCNT: case REG_RCNT: case REG_EXTKEYIN: case REG_RTC: // IPC case REG_IPCSYNC: case REG_IPCFIFOCNT: case REG_IPCFIFOSEND: // ROM case REG_AUXSPICNT: case REG_AUXSPIDATA: case REG_GCROMCTRL: case REG_GCCMDOUT: case REG_GCCMDOUT + 4: case REG_ENCSEED0L: case REG_ENCSEED1L: case REG_ENCSEED0H: case REG_ENCSEED1H: case REG_SPICNT: case REG_SPIDATA: // Memory/IRQ case REG_EXMEMCNT: case REG_IME: case REG_IE: case REG_IF: case REG_VRAMSTAT: case REG_WRAMSTAT: // Other case REG_POSTFLG: case REG_HALTCNT: case REG_POWCNT2: case REG_BIOSPROT: // Sound // 0x04100000 - IPC case REG_IPCFIFORECV: case REG_GCDATAIN: //printf("MMU7 read%02d from register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM9_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr); return true; default: #ifdef DEVELOPER printf("MMU7 read%02d from undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM7_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr); #endif return false; } } return false; } #define VALIDATE_IO_REGS_READ(PROC, SIZE) if (!validateIORegsRead(adr, SIZE)) return 0; #else #define VALIDATE_IO_REGS_READ(PROC, SIZE) ; #endif //================================================================================================== ARM9 * //========================================================================================================= //========================================================================================================= //================================================= MMU write 08 void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM9(adr, "(write08) 0x%02X", val); if(adr < 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0; #endif T1WriteByte(MMU.ARM9_ITCM, adr & 0x7FFF, val); return; } if (slot2_write(adr, val)) return; //block 8bit writes to OAM and palette memory if ((adr & 0x0F000000) == 0x07000000) return; if ((adr & 0x0F000000) == 0x05000000) return; // Address is an IO register if ((adr >> 24) == 4) { if (!validateIORegsWrite(adr, 8, val)) return; // TODO: add pal reg if (nds.power1.gpuMain == 0) if ((adr >= 0x04000008) && (adr <= 0x0400005F)) return; if (nds.power1.gpuSub == 0) if ((adr >= 0x04001008) && (adr <= 0x0400105F)) return; if (nds.power1.gfx3d_geometry == 0) if ((adr >= 0x04000400) && (adr <= 0x040006FF)) return; if (nds.power1.gfx3d_render == 0) if ((adr >= 0x04000320) && (adr <= 0x040003FF)) return; if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM9,8,adr,val); return; } switch(adr) { case REG_SQRTCNT: printf("ERROR 8bit SQRTCNT WRITE\n"); return; case REG_SQRTCNT+1: printf("ERROR 8bit SQRTCNT1 WRITE\n"); return; case REG_SQRTCNT+2: printf("ERROR 8bit SQRTCNT2 WRITE\n"); return; case REG_SQRTCNT+3: printf("ERROR 8bit SQRTCNT3 WRITE\n"); return; #if 1 case REG_DIVCNT: printf("ERROR 8bit DIVCNT WRITE\n"); return; case REG_DIVCNT+1: printf("ERROR 8bit DIVCNT+1 WRITE\n"); return; case REG_DIVCNT+2: printf("ERROR 8bit DIVCNT+2 WRITE\n"); return; case REG_DIVCNT+3: printf("ERROR 8bit DIVCNT+3 WRITE\n"); return; #endif //fog table: only write bottom 7 bits case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x01: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x03: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x05: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x07: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x09: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0B: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0D: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x0F: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x11: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x13: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x15: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x17: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x19: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1B: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1D: case eng_3D_FOG_TABLE+0x1E: case eng_3D_FOG_TABLE+0x1F: val &= 0x7F; break; //ensata putchar port case 0x04FFF000: if(nds.ensataEmulation) { printf("%c",val); fflush(stdout); } break; case eng_3D_GXSTAT: MMU_new.gxstat.write(8,adr,val); break; case REG_DISPA_WIN0H: GPU_setWIN0_H1(MainScreen.gpu, val); break ; case REG_DISPA_WIN0H+1: GPU_setWIN0_H0 (MainScreen.gpu, val); break ; case REG_DISPA_WIN1H: GPU_setWIN1_H1 (MainScreen.gpu,val); break ; case REG_DISPA_WIN1H+1: GPU_setWIN1_H0 (MainScreen.gpu,val); break ; case REG_DISPB_WIN0H: GPU_setWIN0_H1(SubScreen.gpu,val); break ; case REG_DISPB_WIN0H+1: GPU_setWIN0_H0(SubScreen.gpu,val); break ; case REG_DISPB_WIN1H: GPU_setWIN1_H1(SubScreen.gpu,val); break ; case REG_DISPB_WIN1H+1: GPU_setWIN1_H0(SubScreen.gpu,val); break ; case REG_DISPA_WIN0V: GPU_setWIN0_V1(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN0V+1: GPU_setWIN0_V0(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1V: GPU_setWIN1_V1(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1V+1: GPU_setWIN1_V0(MainScreen.gpu,val) ; break ; case REG_DISPB_WIN0V: GPU_setWIN0_V1(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN0V+1: GPU_setWIN0_V0(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1V: GPU_setWIN1_V1(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1V+1: GPU_setWIN1_V0(SubScreen.gpu,val) ; break ; case REG_DISPA_WININ: GPU_setWININ0(MainScreen.gpu,val) ; break ; case REG_DISPA_WININ+1: GPU_setWININ1(MainScreen.gpu,val) ; break ; case REG_DISPA_WINOUT: GPU_setWINOUT(MainScreen.gpu,val) ; break ; case REG_DISPA_WINOUT+1: GPU_setWINOBJ(MainScreen.gpu,val); break ; case REG_DISPB_WININ: GPU_setWININ0(SubScreen.gpu,val) ; break ; case REG_DISPB_WININ+1: GPU_setWININ1(SubScreen.gpu,val) ; break ; case REG_DISPB_WINOUT: GPU_setWINOUT(SubScreen.gpu,val) ; break ; case REG_DISPB_WINOUT+1: GPU_setWINOBJ(SubScreen.gpu,val) ; break ; case REG_DISPA_BLDCNT: GPU_setBLDCNT_HIGH(MainScreen.gpu,val); break; case REG_DISPA_BLDCNT+1: GPU_setBLDCNT_LOW (MainScreen.gpu,val); break; case REG_DISPB_BLDCNT: GPU_setBLDCNT_HIGH (SubScreen.gpu,val); break; case REG_DISPB_BLDCNT+1: GPU_setBLDCNT_LOW (SubScreen.gpu,val); break; case REG_DISPA_BLDALPHA: MainScreen.gpu->setBLDALPHA_EVA(val); break; case REG_DISPA_BLDALPHA+1: MainScreen.gpu->setBLDALPHA_EVB(val); break; case REG_DISPB_BLDALPHA: SubScreen.gpu->setBLDALPHA_EVA(val); break; case REG_DISPB_BLDALPHA+1: SubScreen.gpu->setBLDALPHA_EVB(val); break; case REG_DISPA_BLDY: GPU_setBLDY_EVY(MainScreen.gpu,val) ; break ; case REG_DISPB_BLDY: GPU_setBLDY_EVY(SubScreen.gpu,val) ; break; case REG_AUXSPICNT: case REG_AUXSPICNT+1: write_auxspicnt(ARMCPU_ARM9, 8, adr & 1, val); return; case REG_AUXSPIDATA: { //if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; //zero 20-aug-2013 - this seems pointless u8 spidata = slot1_device->auxspi_transaction(ARMCPU_ARM9,(u8)val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, spidata); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; } case REG_POWCNT1: writereg_POWCNT1(8,adr,val); break; case REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(8,adr,val); return; case REG_DISPA_DISP3DCNT+1: writereg_DISP3DCNT(8,adr,val); return; case REG_IF: REG_IF_WriteByte(0,val); break; case REG_IF+1: REG_IF_WriteByte(1,val); break; case REG_IF+2: REG_IF_WriteByte(2,val); break; case REG_IF+3: REG_IF_WriteByte(3,val); break; case eng_3D_CLEAR_COLOR+0: case eng_3D_CLEAR_COLOR+1: case eng_3D_CLEAR_COLOR+2: case eng_3D_CLEAR_COLOR+3: T1WriteByte((u8*)&gfx3d.state.clearColor,adr-eng_3D_CLEAR_COLOR,val); break; case REG_VRAMCNTA: case REG_VRAMCNTB: case REG_VRAMCNTC: case REG_VRAMCNTD: case REG_VRAMCNTE: case REG_VRAMCNTF: case REG_VRAMCNTG: case REG_WRAMCNT: case REG_VRAMCNTH: case REG_VRAMCNTI: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val); break; case REG_DISPA_DISPMMEMFIFO: { DISP_FIFOsend(val); return; } #ifdef LOG_CARD case 0x040001A0 : /* TODO (clear): ??? */ case 0x040001A1 : case 0x040001A2 : case 0x040001A8 : case 0x040001A9 : case 0x040001AA : case 0x040001AB : case 0x040001AC : case 0x040001AD : case 0x040001AE : case 0x040001AF : LOG("%08X : %02X\r\n", adr, val); #endif } MMU.MMU_MEM[ARMCPU_ARM9][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val; return; } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return; if(restricted) return; //block 8bit vram writes #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM9)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] MMU.MMU_MEM[ARMCPU_ARM9][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val; } //================================================= MMU ARM9 write 16 void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM9(adr, "(write16) 0x%04X", val); if (adr < 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0; #endif T1WriteWord(MMU.ARM9_ITCM, adr & 0x7FFF, val); return; } if (slot2_write(adr, val)) return; // Address is an IO register if ((adr >> 24) == 4) { if (!validateIORegsWrite(adr, 16, val)) return; // TODO: add pal reg if (nds.power1.gpuMain == 0) if ((adr >= 0x04000008) && (adr <= 0x0400005F)) return; if (nds.power1.gpuSub == 0) if ((adr >= 0x04001008) && (adr <= 0x0400105F)) return; if (nds.power1.gfx3d_geometry == 0) if ((adr >= 0x04000400) && (adr <= 0x040006FF)) return; if (nds.power1.gfx3d_render == 0) if ((adr >= 0x04000320) && (adr <= 0x040003FF)) return; if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM9,16,adr,val); return; } switch (adr >> 4) { //toon table case 0x0400038: case 0x0400039: case 0x040003A: case 0x040003B: ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF)>>1] = val; gfx3d_UpdateToonTable((adr & 0x3F) >> 1, val); return; } // Address is an IO register switch(adr) { case eng_3D_GXSTAT: MMU_new.gxstat.write(16,adr,val); break; //fog table: only write bottom 7 bits case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1E: val &= 0x7F7F; break; case REG_DISPA_BG2XL: MainScreen.gpu->setAffineStartWord(2,0,val,0); break; case REG_DISPA_BG2XH: MainScreen.gpu->setAffineStartWord(2,0,val,1); break; case REG_DISPA_BG2YL: MainScreen.gpu->setAffineStartWord(2,1,val,0); break; case REG_DISPA_BG2YH: MainScreen.gpu->setAffineStartWord(2,1,val,1); break; case REG_DISPA_BG3XL: MainScreen.gpu->setAffineStartWord(3,0,val,0); break; case REG_DISPA_BG3XH: MainScreen.gpu->setAffineStartWord(3,0,val,1); break; case REG_DISPA_BG3YL: MainScreen.gpu->setAffineStartWord(3,1,val,0); break; case REG_DISPA_BG3YH: MainScreen.gpu->setAffineStartWord(3,1,val,1); break; case REG_DISPB_BG2XL: SubScreen.gpu->setAffineStartWord(2,0,val,0); break; case REG_DISPB_BG2XH: SubScreen.gpu->setAffineStartWord(2,0,val,1); break; case REG_DISPB_BG2YL: SubScreen.gpu->setAffineStartWord(2,1,val,0); break; case REG_DISPB_BG2YH: SubScreen.gpu->setAffineStartWord(2,1,val,1); break; case REG_DISPB_BG3XL: SubScreen.gpu->setAffineStartWord(3,0,val,0); break; case REG_DISPB_BG3XH: SubScreen.gpu->setAffineStartWord(3,0,val,1); break; case REG_DISPB_BG3YL: SubScreen.gpu->setAffineStartWord(3,1,val,0); break; case REG_DISPB_BG3YH: SubScreen.gpu->setAffineStartWord(3,1,val,1); break; case REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(16,adr,val); return; // Alpha test reference value - Parameters:1 case eng_3D_ALPHA_TEST_REF: { ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x340>>1] = val; gfx3d_glAlphaFunc(val); return; } case eng_3D_CLEAR_COLOR: case eng_3D_CLEAR_COLOR+2: { T1WriteWord((u8*)&gfx3d.state.clearColor,adr-eng_3D_CLEAR_COLOR,val); break; } // Clear background depth setup - Parameters:2 case eng_3D_CLEAR_DEPTH: { ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x354>>1] = val; gfx3d_glClearDepth(val); return; } // Fog Color - Parameters:4b case eng_3D_FOG_COLOR: { ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x358>>1] = val; gfx3d_glFogColor(val); return; } case eng_3D_FOG_OFFSET: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x35C>>1] = val; gfx3d_glFogOffset(val); return; } case REG_DIVCNT: MMU_new.div.write16(val); execdiv(); return; #if 1 case REG_DIVNUMER: case REG_DIVNUMER+2: case REG_DIVNUMER+4: printf("DIV: 16 write NUMER %08X. PLEASE REPORT! \n", val); break; case REG_DIVDENOM: case REG_DIVDENOM+2: case REG_DIVDENOM+4: printf("DIV: 16 write DENOM %08X. PLEASE REPORT! \n", val); break; #endif case REG_SQRTCNT: MMU_new.sqrt.write16(val); execsqrt(); return; case REG_DISPA_BLDCNT: GPU_setBLDCNT(MainScreen.gpu,val) ; break ; case REG_DISPB_BLDCNT: GPU_setBLDCNT(SubScreen.gpu,val) ; break ; case REG_DISPA_BLDALPHA: MainScreen.gpu->setBLDALPHA(val); break ; case REG_DISPB_BLDALPHA: SubScreen.gpu->setBLDALPHA(val); break ; case REG_DISPA_BLDY: GPU_setBLDY_EVY(MainScreen.gpu,val) ; break ; case REG_DISPB_BLDY: GPU_setBLDY_EVY(SubScreen.gpu,val) ; break; case REG_DISPA_MASTERBRIGHT: GPU_setMasterBrightness (MainScreen.gpu, val); break; /* case REG_DISPA_MOSAIC: GPU_setMOSAIC(MainScreen.gpu,val) ; break ; case REG_DISPB_MOSAIC: GPU_setMOSAIC(SubScreen.gpu,val) ; break ; */ //case REG_DISPA_BG0HOFS: // GPU_setBGxHOFS(0, MainScreen.gpu, val); // break; //case REG_DISPA_BG0VOFS: // GPU_setBGxVOFS(0, MainScreen.gpu, val); // break; //case REG_DISPA_BG1HOFS: // GPU_setBGxHOFS(1, MainScreen.gpu, val); // break; //case REG_DISPA_BG1VOFS: // GPU_setBGxVOFS(1, MainScreen.gpu, val); // break; //case REG_DISPA_BG2HOFS: // GPU_setBGxHOFS(2, MainScreen.gpu, val); // break; //case REG_DISPA_BG2VOFS: // GPU_setBGxVOFS(2, MainScreen.gpu, val); // break; //case REG_DISPA_BG3HOFS: // GPU_setBGxHOFS(3, MainScreen.gpu, val); // break; //case REG_DISPA_BG3VOFS: // GPU_setBGxVOFS(3, MainScreen.gpu, val); // break; case REG_DISPA_WIN0H: GPU_setWIN0_H (MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1H: GPU_setWIN1_H(MainScreen.gpu,val) ; break ; case REG_DISPB_WIN0H: GPU_setWIN0_H(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1H: GPU_setWIN1_H(SubScreen.gpu,val) ; break ; case REG_DISPA_WIN0V: GPU_setWIN0_V(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1V: GPU_setWIN1_V(MainScreen.gpu,val) ; break ; case REG_DISPB_WIN0V: GPU_setWIN0_V(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1V: GPU_setWIN1_V(SubScreen.gpu,val) ; break ; case REG_DISPA_WININ: GPU_setWININ(MainScreen.gpu, val) ; break ; case REG_DISPA_WINOUT: GPU_setWINOUT16(MainScreen.gpu, val) ; break ; /* case REG_DISPB_BG0HOFS: GPU_setBGxHOFS(0, SubScreen.gpu, val); break; case REG_DISPB_BG0VOFS: GPU_setBGxVOFS(0, SubScreen.gpu, val); break; case REG_DISPB_BG1HOFS: GPU_setBGxHOFS(1, SubScreen.gpu, val); break; case REG_DISPB_BG1VOFS: GPU_setBGxVOFS(1, SubScreen.gpu, val); break; case REG_DISPB_BG2HOFS: GPU_setBGxHOFS(2, SubScreen.gpu, val); break; case REG_DISPB_BG2VOFS: GPU_setBGxVOFS(2, SubScreen.gpu, val); break; case REG_DISPB_BG3HOFS: GPU_setBGxHOFS(3, SubScreen.gpu, val); break; case REG_DISPB_BG3VOFS: GPU_setBGxVOFS(3, SubScreen.gpu, val); break;*/ case REG_DISPB_WININ: GPU_setWININ(SubScreen.gpu, val) ; break ; case REG_DISPB_WINOUT: GPU_setWINOUT16(SubScreen.gpu, val) ; break ; case REG_DISPB_MASTERBRIGHT: GPU_setMasterBrightness (SubScreen.gpu, val); break; case REG_POWCNT1: writereg_POWCNT1(16,adr,val); return; case REG_EXMEMCNT: { u16 remote_proc = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204, (val & 0xFF80) | (remote_proc & 0x7F)); return; } case REG_AUXSPICNT: write_auxspicnt(ARMCPU_ARM9, 16, 0, val); return; case REG_AUXSPIDATA: { //if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; //zero 20-aug-2013 - this seems pointless u8 spidata = slot1_device->auxspi_transaction(ARMCPU_ARM9,(u8)val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, spidata); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; } case REG_DISPA_BG0CNT : //GPULOG("MAIN BG0 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 0, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x8, val); return; case REG_DISPA_BG1CNT : //GPULOG("MAIN BG1 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 1, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xA, val); return; case REG_DISPA_BG2CNT : //GPULOG("MAIN BG2 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 2, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xC, val); return; case REG_DISPA_BG3CNT : //GPULOG("MAIN BG3 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 3, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xE, val); return; case REG_DISPB_BG0CNT : //GPULOG("SUB BG0 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 0, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1008, val); return; case REG_DISPB_BG1CNT : //GPULOG("SUB BG1 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 1, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100A, val); return; case REG_DISPB_BG2CNT : //GPULOG("SUB BG2 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 2, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100C, val); return; case REG_DISPB_BG3CNT : //GPULOG("SUB BG3 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 3, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100E, val); return; case REG_VRAMCNTA: case REG_VRAMCNTC: case REG_VRAMCNTE: case REG_VRAMCNTG: case REG_VRAMCNTH: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+1, val >> 8); break; case REG_IME: NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM9] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM9] = (MMU.reg_IE[ARMCPU_ARM9]&0xFFFF0000) | val; return; case REG_IE + 2 : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM9] = (MMU.reg_IE[ARMCPU_ARM9]&0xFFFF) | (((u32)val)<<16); return; case REG_IF: REG_IF_WriteWord(0,val); return; case REG_IF+2: REG_IF_WriteWord(2,val); return; case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM9, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM9, val); return; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : MMU.timerReload[ARMCPU_ARM9][(adr>>2)&3] = val; return; case REG_TM0CNTH : case REG_TM1CNTH : case REG_TM2CNTH : case REG_TM3CNTH : { int timerIndex = ((adr-2)>>2)&0x3; write_timer(ARMCPU_ARM9, timerIndex, val); return; } case REG_DISPA_DISPCNT : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0) & 0xFFFF0000) | val; GPU_setVideoProp(MainScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, v); return; } case REG_DISPA_DISPCNT+2 : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0) & 0xFFFF) | ((u32) val << 16); GPU_setVideoProp(MainScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, v); } return; case REG_DISPA_DISPCAPCNT : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64) & 0xFFFF0000) | val; GPU_set_DISPCAPCNT(v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64, v); return; } case REG_DISPA_DISPCAPCNT + 2: { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64) & 0xFFFF) | ((u32)val << 16); GPU_set_DISPCAPCNT(v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64, v); return; } case REG_DISPB_DISPCNT : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000) & 0xFFFF0000) | val; GPU_setVideoProp(SubScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, v); return; } case REG_DISPB_DISPCNT+2 : { //emu_halt(); u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000) & 0xFFFF) | ((u32) val << 16); GPU_setVideoProp(SubScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, v); return; } case REG_DISPA_DISPMMEMFIFO: { DISP_FIFOsend(val); return; } case REG_GCROMCTRL : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[0][0x40], 0x1A4) & 0xFFFF0000) | val); return; case REG_GCROMCTRL+2 : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[0][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16)); return; } T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM9)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); } //================================================= MMU ARM9 write 32 void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM9(adr, "(write32) 0x%08X", val); if(adr<0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0; JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 1) = 0; #endif T1WriteLong(MMU.ARM9_ITCM, adr & 0x7FFF, val); return ; } if (slot2_write(adr, val)) return; #if 0 if ((adr & 0xFF800000) == 0x04800000) { // access to non regular hw registers // return to not overwrite valid data return ; } #endif // Address is an IO register if ((adr >> 24) == 4) { if (!validateIORegsWrite(adr, 32, val)) return; // TODO: add pal reg if (nds.power1.gpuMain == 0) if ((adr >= 0x04000008) && (adr <= 0x0400005F)) return; if (nds.power1.gpuSub == 0) if ((adr >= 0x04001008) && (adr <= 0x0400105F)) return; if (nds.power1.gfx3d_geometry == 0) if ((adr >= 0x04000400) && (adr <= 0x040006FF)) return; if (nds.power1.gfx3d_render == 0) if ((adr >= 0x04000320) && (adr <= 0x040003FF)) return; // MightyMax: no need to do several ifs, when only one can happen // switch/case instead // both comparison >=,< per if can be replaced by one bit comparison since // they are 2^4 aligned and 2^4n wide // this looks ugly but should reduce load on register writes, they are done as // lookups by the compiler switch (adr >> 4) { case 0x400033: //edge color table ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; return; case 0x400038: case 0x400039: case 0x40003A: case 0x40003B: //toon table ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; gfx3d_UpdateToonTable((adr & 0x3F) >> 1, val); return; case 0x400040: case 0x400041: case 0x400042: case 0x400043: // FIFO Commands ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; gfx3d_sendCommandToFIFO(val); return; case 0x400044: case 0x400045: case 0x400046: case 0x400047: case 0x400048: case 0x400049: case 0x40004A: case 0x40004B: case 0x40004C: case 0x40004D: case 0x40004E: case 0x40004F: case 0x400050: case 0x400051: case 0x400052: case 0x400053: case 0x400054: case 0x400055: case 0x400056: case 0x400057: case 0x400058: case 0x400059: case 0x40005A: case 0x40005B: case 0x40005C: // Individual Commands if (gxFIFO.size > 254) nds.freezeBus |= 1; ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; gfx3d_sendCommand(adr, val); return; default: break; } if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM9,32,adr,val); return; } switch(adr) { case REG_SQRTCNT: MMU_new.sqrt.write16((u16)val); return; case REG_DIVCNT: MMU_new.div.write16((u16)val); return; case REG_POWCNT1: writereg_POWCNT1(32,adr,val); break; //fog table: only write bottom 7 bits case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1C: val &= 0x7F7F7F7F; break; //ensata handshaking port? case 0x04FFF010: if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_ack && val == 0x13579bdf) nds.ensataHandshake = ENSATA_HANDSHAKE_confirm; if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_confirm && val == 0xfdb97531) { printf("ENSATA HANDSHAKE COMPLETE\n"); nds.ensataHandshake = ENSATA_HANDSHAKE_complete; } break; //todo - these are usually write only regs (these and 1000 more) //shouldnt we block them from getting written? ugh case eng_3D_CLIPMTX_RESULT: if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_none && val==0x2468ace0) { printf("ENSATA HANDSHAKE BEGIN\n"); nds.ensataHandshake = ENSATA_HANDSHAKE_query; } break; case eng_3D_GXSTAT: MMU_new.gxstat.write32(val); break; case REG_DISPA_BG2XL: MainScreen.gpu->setAffineStart(2,0,val); return; case REG_DISPA_BG2YL: MainScreen.gpu->setAffineStart(2,1,val); return; case REG_DISPB_BG2XL: SubScreen.gpu->setAffineStart(2,0,val); return; case REG_DISPB_BG2YL: SubScreen.gpu->setAffineStart(2,1,val); return; case REG_DISPA_BG3XL: MainScreen.gpu->setAffineStart(3,0,val); return; case REG_DISPA_BG3YL: MainScreen.gpu->setAffineStart(3,1,val); return; case REG_DISPB_BG3XL: SubScreen.gpu->setAffineStart(3,0,val); return; case REG_DISPB_BG3YL: SubScreen.gpu->setAffineStart(3,1,val); return; // Alpha test reference value - Parameters:1 case eng_3D_ALPHA_TEST_REF: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x340>>2] = val; gfx3d_glAlphaFunc(val); return; } case eng_3D_CLEAR_COLOR: T1WriteLong((u8*)&gfx3d.state.clearColor,0,val); break; // Clear background depth setup - Parameters:2 case eng_3D_CLEAR_DEPTH: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x354>>2] = val; gfx3d_glClearDepth(val); return; } // Fog Color - Parameters:4b case 0x04000358: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x358>>2] = val; gfx3d_glFogColor(val); return; } case 0x0400035C: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x35C>>2] = val; gfx3d_glFogOffset(val); return; } //case REG_DISPA_BG0HOFS: // GPU_setBGxHOFS(0, MainScreen.gpu, val&0xFFFF); // GPU_setBGxVOFS(0, MainScreen.gpu, (val>>16)); // break; case REG_DISPA_WININ: { GPU_setWININ(MainScreen.gpu, val & 0xFFFF) ; GPU_setWINOUT16(MainScreen.gpu, (val >> 16) & 0xFFFF) ; break; } case REG_DISPB_WININ: { GPU_setWININ(SubScreen.gpu, val & 0xFFFF) ; GPU_setWINOUT16(SubScreen.gpu, (val >> 16) & 0xFFFF) ; break; } case REG_DISPA_WIN0H: { GPU_setWIN0_H(MainScreen.gpu, val&0xFFFF); GPU_setWIN1_H(MainScreen.gpu, val>>16); break; } case REG_DISPA_WIN0V: { GPU_setWIN0_V(MainScreen.gpu, val&0xFFFF); GPU_setWIN1_V(MainScreen.gpu, val>>16); break; } case REG_DISPB_WIN0H: { GPU_setWIN0_H(SubScreen.gpu, val&0xFFFF); GPU_setWIN1_H(SubScreen.gpu, val>>16); break; } case REG_DISPB_WIN0V: { GPU_setWIN0_V(SubScreen.gpu, val&0xFFFF); GPU_setWIN1_V(SubScreen.gpu, val>>16); break; } case REG_DISPA_MASTERBRIGHT: GPU_setMasterBrightness(MainScreen.gpu, val & 0xFFFF); break; case REG_DISPB_MASTERBRIGHT: GPU_setMasterBrightness(SubScreen.gpu, val & 0xFFFF); break; case REG_DISPA_BLDCNT: { GPU_setBLDCNT (MainScreen.gpu,val&0xffff); MainScreen.gpu->setBLDALPHA(val>>16); break; } case REG_DISPB_BLDCNT: { GPU_setBLDCNT (SubScreen.gpu,val&0xffff); SubScreen.gpu->setBLDALPHA(val>>16); break; } case REG_DISPA_BLDY: GPU_setBLDY_EVY(MainScreen.gpu,val&0xFFFF) ; break ; case REG_DISPB_BLDY: GPU_setBLDY_EVY(SubScreen.gpu,val&0xFFFF); break; case REG_DISPA_DISPCNT : GPU_setVideoProp(MainScreen.gpu, val); //GPULOG("MAIN INIT 32B %08X\r\n", val); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, val); return; case REG_DISPB_DISPCNT : GPU_setVideoProp(SubScreen.gpu, val); //GPULOG("SUB INIT 32B %08X\r\n", val); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, val); return; case REG_VRAMCNTA: case REG_VRAMCNTE: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+1, (val >> 8) & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+2, (val >> 16) & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+3, (val >> 24) & 0xFF); break; case REG_VRAMCNTH: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+1, (val >> 8) & 0xFF); break; case REG_IME : NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM9] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM9] = val; return; case REG_IF: REG_IF_WriteLong(val); return; case REG_TM0CNTL: case REG_TM1CNTL: case REG_TM2CNTL: case REG_TM3CNTL: { int timerIndex = (adr>>2)&0x3; MMU.timerReload[ARMCPU_ARM9][timerIndex] = (u16)val; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & 0xFFF, val); write_timer(ARMCPU_ARM9, timerIndex, val>>16); return; } case REG_DIVNUMER: T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290, val); execdiv(); return; case REG_DIVNUMER+4: T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x294, val); execdiv(); return; case REG_DIVDENOM : { T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298, val); execdiv(); return; } case REG_DIVDENOM+4 : { T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x29C, val); execdiv(); return; } case REG_SQRTPARAM : { T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8, val); execsqrt(); return; } case REG_SQRTPARAM+4 : T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2BC, val); execsqrt(); return; case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM9, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM9, val); return; case REG_IPCFIFOSEND: IPC_FIFOsend(ARMCPU_ARM9, val); return; case REG_GCROMCTRL : MMU_writeToGCControl(val); return; case REG_DISPA_DISPCAPCNT : //INFO("MMU write32: REG_DISPA_DISPCAPCNT 0x%X\n", val); GPU_set_DISPCAPCNT(val); T1WriteLong(MMU.ARM9_REG, 0x64, val); return; case REG_DISPA_BG0CNT : GPU_setBGProp(MainScreen.gpu, 0, (val&0xFFFF)); GPU_setBGProp(MainScreen.gpu, 1, (val>>16)); //if((val>>16)==0x400) emu_halt(); T1WriteLong(MMU.ARM9_REG, 8, val); return; case REG_DISPA_BG2CNT : GPU_setBGProp(MainScreen.gpu, 2, (val&0xFFFF)); GPU_setBGProp(MainScreen.gpu, 3, (val>>16)); T1WriteLong(MMU.ARM9_REG, 0xC, val); return; case REG_DISPB_BG0CNT : GPU_setBGProp(SubScreen.gpu, 0, (val&0xFFFF)); GPU_setBGProp(SubScreen.gpu, 1, (val>>16)); T1WriteLong(MMU.ARM9_REG, 0x1008, val); return; case REG_DISPB_BG2CNT : GPU_setBGProp(SubScreen.gpu, 2, (val&0xFFFF)); GPU_setBGProp(SubScreen.gpu, 3, (val>>16)); T1WriteLong(MMU.ARM9_REG, 0x100C, val); return; case REG_DISPA_DISPMMEMFIFO: { DISP_FIFOsend(val); return; } case REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(32,adr,val); return; case REG_GCDATAIN: MMU_writeToGC(val); return; } T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM9)) { JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 0) = 0; JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 1) = 0; } #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); } //================================================= MMU ARM9 read 08 u8 FASTCALL _MMU_ARM9_read08(u32 adr) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM9(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]); if(adr<0x02000000) return T1ReadByte(MMU.ARM9_ITCM, adr&0x7FFF); u8 slot2_val; if (slot2_read(adr, slot2_val)) return slot2_val; // Address is an IO register if ((adr >> 24) == 4) { VALIDATE_IO_REGS_READ(ARMCPU_ARM9, 8); if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,8,adr); switch(adr) { case REG_IF: return MMU.gen_IF(); case REG_IF+1: return (MMU.gen_IF()>>8); case REG_IF+2: return (MMU.gen_IF()>>16); case REG_IF+3: return (MMU.gen_IF()>>24); case REG_WRAMCNT: return MMU.WRAMCNT; case REG_DISPA_DISPSTAT: break; case REG_DISPA_DISPSTAT+1: break; case REG_DISPx_VCOUNT: return nds.VCount & 0xFF; case REG_DISPx_VCOUNT+1: return (nds.VCount>>8) & 0xFF; case REG_SQRTCNT: return (MMU_new.sqrt.read16() & 0xFF); case REG_SQRTCNT+1: return ((MMU_new.sqrt.read16()>>8) & 0xFF); //sqrtcnt isnt big enough for these to exist. but they'd probably return 0 so its ok case REG_SQRTCNT+2: printf("ERROR 8bit SQRTCNT+2 READ\n"); return 0; case REG_SQRTCNT+3: printf("ERROR 8bit SQRTCNT+3 READ\n"); return 0; //these aren't readable case REG_DISPA_BG0HOFS: case REG_DISPA_BG0HOFS+1: case REG_DISPA_BG1HOFS: case REG_DISPA_BG1HOFS+1: case REG_DISPA_BG2HOFS: case REG_DISPA_BG2HOFS+1: case REG_DISPA_BG3HOFS: case REG_DISPA_BG3HOFS+1: case REG_DISPB_BG0HOFS: case REG_DISPB_BG0HOFS+1: case REG_DISPB_BG1HOFS: case REG_DISPB_BG1HOFS+1: case REG_DISPB_BG2HOFS: case REG_DISPB_BG2HOFS+1: case REG_DISPB_BG3HOFS: case REG_DISPB_BG3HOFS+1: case REG_DISPA_BG0VOFS: case REG_DISPA_BG0VOFS+1: case REG_DISPA_BG1VOFS: case REG_DISPA_BG1VOFS+1: case REG_DISPA_BG2VOFS: case REG_DISPA_BG2VOFS+1: case REG_DISPA_BG3VOFS: case REG_DISPA_BG3VOFS+1: case REG_DISPB_BG0VOFS: case REG_DISPB_BG0VOFS+1: case REG_DISPB_BG1VOFS: case REG_DISPB_BG1VOFS+1: case REG_DISPB_BG2VOFS: case REG_DISPB_BG2VOFS+1: case REG_DISPB_BG3VOFS: case REG_DISPB_BG3VOFS+1: return 0; //Nostalgia's options menu requires that these work case REG_DIVCNT: return (MMU_new.div.read16() & 0xFF); case REG_DIVCNT+1: return ((MMU_new.div.read16()>>8) & 0xFF); //divcnt isnt big enough for these to exist. but they'd probably return 0 so its ok case REG_DIVCNT+2: printf("ERROR 8bit DIVCNT+2 READ\n"); return 0; case REG_DIVCNT+3: printf("ERROR 8bit DIVCNT+3 READ\n"); return 0; //fog table: write only case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x01: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x03: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x05: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x07: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x09: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0B: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0D: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x0F: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x11: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x13: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x15: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x17: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x19: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1B: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1D: case eng_3D_FOG_TABLE+0x1E: case eng_3D_FOG_TABLE+0x1F: return 0; case REG_POWCNT1: case REG_POWCNT1+1: case REG_POWCNT1+2: case REG_POWCNT1+3: return readreg_POWCNT1(8,adr); case eng_3D_GXSTAT: return MMU_new.gxstat.read(8,adr); case REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(8,adr); case REG_DISPA_DISP3DCNT+1: return readreg_DISP3DCNT(8,adr); case REG_DISPA_DISP3DCNT+2: return readreg_DISP3DCNT(8,adr); case REG_DISPA_DISP3DCNT+3: return readreg_DISP3DCNT(8,adr); case REG_KEYINPUT: LagFrameFlag=0; break; } } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return 0; return MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]; } //================================================= MMU ARM9 read 16 u16 FASTCALL _MMU_ARM9_read16(u32 adr) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM9(adr, "(read16) 0x%04X", T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20])); if(adr<0x02000000) return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, adr & 0x7FFE); u16 slot2_val; if (slot2_read(adr, slot2_val)) return slot2_val; // Address is an IO register if ((adr >> 24) == 4) { VALIDATE_IO_REGS_READ(ARMCPU_ARM9, 16); if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,16,adr); switch(adr) { case REG_DISPA_DISPSTAT: break; //these aren't readable case REG_DISPA_BG0HOFS: case REG_DISPA_BG1HOFS: case REG_DISPA_BG2HOFS: case REG_DISPA_BG3HOFS: case REG_DISPB_BG0HOFS: case REG_DISPB_BG1HOFS: case REG_DISPB_BG2HOFS: case REG_DISPB_BG3HOFS: case REG_DISPA_BG0VOFS: case REG_DISPA_BG1VOFS: case REG_DISPA_BG2VOFS: case REG_DISPA_BG3VOFS: case REG_DISPB_BG0VOFS: case REG_DISPB_BG1VOFS: case REG_DISPB_BG2VOFS: case REG_DISPB_BG3VOFS: return 0; case REG_SQRTCNT: return MMU_new.sqrt.read16(); //sqrtcnt isnt big enough for this to exist. but it'd probably return 0 so its ok case REG_SQRTCNT+2: printf("ERROR 16bit SQRTCNT+2 READ\n"); return 0; case REG_DIVCNT: return MMU_new.div.read16(); //divcnt isnt big enough for this to exist. but it'd probably return 0 so its ok case REG_DIVCNT+2: printf("ERROR 16bit DIVCNT+2 READ\n"); return 0; case eng_3D_GXSTAT: return MMU_new.gxstat.read(16,adr); case REG_DISPA_VCOUNT: if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_query) { nds.ensataHandshake = ENSATA_HANDSHAKE_ack; return 270; } else return nds.VCount; // ============================================= 3D case eng_3D_RAM_COUNT: return 0; //almost worthless for now //return (gfx3d_GetNumPolys()); case eng_3D_RAM_COUNT+2: return 0; //almost worthless for now //return (gfx3d_GetNumVertex()); // ============================================= 3D end case REG_IME : return (u16)MMU.reg_IME[ARMCPU_ARM9]; case REG_IE : return (u16)MMU.reg_IE[ARMCPU_ARM9]; case REG_IE + 2 : return (u16)(MMU.reg_IE[ARMCPU_ARM9]>>16); case REG_IF: return MMU.gen_IF(); case REG_IF+2: return MMU.gen_IF()>>16; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : return read_timer(ARMCPU_ARM9,(adr&0xF)>>2); case REG_AUXSPICNT: return MMU.AUX_SPI_CNT; case REG_POWCNT1: case REG_POWCNT1+2: return readreg_POWCNT1(16,adr); case REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(16,adr); case REG_DISPA_DISP3DCNT+2: return readreg_DISP3DCNT(16,adr); case REG_KEYINPUT: LagFrameFlag=0; break; //fog table: write only case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1E: return 0; } return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]); } //================================================= MMU ARM9 read 32 u32 FASTCALL _MMU_ARM9_read32(u32 adr) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM9(adr, "(read32) 0x%08X", T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20])); if(adr<0x02000000) return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, adr&0x7FFC); u32 slot2_val; if (slot2_read(adr, slot2_val)) return slot2_val; // Address is an IO register if ((adr >> 24) == 4) { VALIDATE_IO_REGS_READ(ARMCPU_ARM9, 32); if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,32,adr); switch(adr) { case REG_DSIMODE: if(!nds.Is_DSI()) break; return 1; case 0x04004008: if(!nds.Is_DSI()) break; return 0x8000; //these aren't readable. //note: ratatouille stage 3 begins testing this.. it will write a 256, then read it, and if it reads back a 256, the 3d display will be scrolled invisibly. it needs to read a 0 to cause an unscrolled 3d display. case REG_DISPA_BG0HOFS: case REG_DISPA_BG1HOFS: case REG_DISPA_BG2HOFS: case REG_DISPA_BG3HOFS: case REG_DISPB_BG0HOFS: case REG_DISPB_BG1HOFS: case REG_DISPB_BG2HOFS: case REG_DISPB_BG3HOFS: return 0; case REG_DISPA_DISPSTAT: break; case REG_DISPx_VCOUNT: return nds.VCount; //despite these being 16bit regs, //Dolphin Island Underwater Adventures uses this amidst seemingly reasonable divs so we're going to emulate it. //well, it's pretty reasonable to read them as 32bits though, isnt it? case REG_DIVCNT: return MMU_new.div.read16(); case REG_SQRTCNT: return MMU_new.sqrt.read16(); //I guess we'll do this also //fog table: write only case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1C: return 0; case eng_3D_CLIPMTX_RESULT: case eng_3D_CLIPMTX_RESULT+4: case eng_3D_CLIPMTX_RESULT+8: case eng_3D_CLIPMTX_RESULT+12: case eng_3D_CLIPMTX_RESULT+16: case eng_3D_CLIPMTX_RESULT+20: case eng_3D_CLIPMTX_RESULT+24: case eng_3D_CLIPMTX_RESULT+28: case eng_3D_CLIPMTX_RESULT+32: case eng_3D_CLIPMTX_RESULT+36: case eng_3D_CLIPMTX_RESULT+40: case eng_3D_CLIPMTX_RESULT+44: case eng_3D_CLIPMTX_RESULT+48: case eng_3D_CLIPMTX_RESULT+52: case eng_3D_CLIPMTX_RESULT+56: case eng_3D_CLIPMTX_RESULT+60: { //LOG("4000640h..67Fh - CLIPMTX_RESULT - Read Current Clip Coordinates Matrix (R)"); return gfx3d_GetClipMatrix ((adr-0x04000640)/4); } case eng_3D_VECMTX_RESULT: case eng_3D_VECMTX_RESULT+4: case eng_3D_VECMTX_RESULT+8: case eng_3D_VECMTX_RESULT+12: case eng_3D_VECMTX_RESULT+16: case eng_3D_VECMTX_RESULT+20: case eng_3D_VECMTX_RESULT+24: case eng_3D_VECMTX_RESULT+28: case eng_3D_VECMTX_RESULT+32: { //LOG("4000680h..6A3h - VECMTX_RESULT - Read Current Directional Vector Matrix (R)"); return gfx3d_GetDirectionalMatrix ((adr-0x04000680)/4); } case eng_3D_RAM_COUNT: { return (gfx3d_GetNumPolys()) | ((gfx3d_GetNumVertex()) << 16); //LOG ("read32 - RAM_COUNT -> 0x%X", ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF]))[(adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF])>>2]); } case eng_3D_POS_RESULT: case eng_3D_POS_RESULT+4: case eng_3D_POS_RESULT+8: case eng_3D_POS_RESULT+12: { return gfx3d_glGetPosRes((adr & 0xF) >> 2); } case eng_3D_GXSTAT: return MMU_new.gxstat.read(32,adr); // ======================================== 3D end case REG_IME : return MMU.reg_IME[ARMCPU_ARM9]; case REG_IE : return MMU.reg_IE[ARMCPU_ARM9]; case REG_IF: return MMU.gen_IF(); case REG_IPCFIFORECV : return IPC_FIFOrecv(ARMCPU_ARM9); case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : { u32 val = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], (adr + 2) & 0xFFF); return MMU.timer[ARMCPU_ARM9][(adr&0xF)>>2] | (val<<16); } case REG_GCDATAIN: return MMU_readFromGC(); case REG_POWCNT1: return readreg_POWCNT1(32,adr); case REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(32,adr); case REG_KEYINPUT: LagFrameFlag=0; break; } return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [zeromus, inspired by shash] return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]); } //================================================================================================== ARM7 * //========================================================================================================= //========================================================================================================= //================================================= MMU ARM7 write 08 void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM7(adr, "(write08) 0x%02X", val); if (adr < 0x02000000) return; //can't write to bios or entire area below main memory if (slot2_write(adr, val)) return; if (SPU_core->isSPU(adr)) { SPU_WriteByte(adr, val); return; } if ((adr & 0xFFFF0000) == 0x04800000) { /* is wifi hardware, dont intermix with regular hardware registers */ // 8-bit writes to wifi I/O and RAM are ignored // Reference: http://nocash.emubase.de/gbatek.htm#dswifiiomap return; } // Address is an IO register if ((adr >> 24) == 4) { if (!validateIORegsWrite(adr, 8, val)) return; if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,8,adr,val); return; } switch(adr) { case REG_IF: REG_IF_WriteByte(0,val); break; case REG_IF+1: REG_IF_WriteByte(1,val); break; case REG_IF+2: REG_IF_WriteByte(2,val); break; case REG_IF+3: REG_IF_WriteByte(3,val); break; case REG_POSTFLG: //printf("ARM7: write POSTFLG %02X PC:0x%08X\n", val, NDS_ARM7.instruct_adr); //The NDS7 register can be written to only from code executed in BIOS. if (NDS_ARM7.instruct_adr > 0x3FFF) return; #ifdef HAVE_JIT // hack for firmware boot in JIT mode if (CommonSettings.UseExtFirmware && CommonSettings.BootFromFirmware && firmware->loaded() && val == 1) CommonSettings.jit_max_block_size = saveBlockSizeJIT; #endif break; case REG_HALTCNT: { //printf("ARM7: Halt 0x%02X IME %02X, IE 0x%08X, IF 0x%08X PC 0x%08X\n", val, MMU.reg_IME[1], MMU.reg_IE[1], MMU.reg_IF_bits[1], NDS_ARM7.instruct_adr); switch(val) { //case 0x10: printf("GBA mode unsupported\n"); break; case 0xC0: NDS_Sleep(); break; case 0x80: armcpu_Wait4IRQ(&NDS_ARM7); break; default: break; } break; } case REG_RTC: rtcWrite(val); return; case REG_AUXSPICNT: case REG_AUXSPICNT+1: write_auxspicnt(ARMCPU_ARM7, 8, adr & 1, val); return; case REG_AUXSPIDATA: { //if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; //zero 20-aug-2013 - this seems pointless u8 spidata = slot1_device->auxspi_transaction(ARMCPU_ARM7,(u8)val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, spidata); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; } case REG_SPIDATA: // CrazyMax: 27 May 2013: BIOS write 8bit commands to flash controller when load firmware header // into RAM at 0x027FF830 MMU_writeToSPIData(val); return; } MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val; return; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM7)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val; } //================================================= MMU ARM7 write 16 void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM7(adr, "(write16) 0x%04X", val); if (adr < 0x02000000) return; //can't write to bios or entire area below main memory if (slot2_write(adr, val)) return; if (SPU_core->isSPU(adr)) { SPU_WriteWord(adr, val); return; } //wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) { WIFI_write16(adr,val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x48], adr&MMU.MMU_MASK[ARMCPU_ARM7][0x48], val); return; } // Address is an IO register if ((adr >> 24) == 4) { if (!validateIORegsWrite(adr, 16, val)) return; if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,16,adr,val); return; } //Address is an IO register switch(adr) { case REG_DISPA_VCOUNT: if (nds.VCount >= 202 && nds.VCount <= 212) { printf("VCOUNT set to %i (previous value %i)\n", val, nds.VCount); nds.VCount = val; } else printf("Attempt to set VCOUNT while not within 202-212 (%i), ignored\n", nds.VCount); return; case REG_RTC: rtcWrite(val); break; case REG_EXMEMCNT: { u16 remote_proc = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204, (val & 0x7F) | (remote_proc & 0xFF80)); } return; case REG_EXTKEYIN: //readonly return; case REG_POWCNT2: { nds.power2.speakers = BIT0(val); nds.power2.wifi = BIT1(val); } return; case REG_AUXSPICNT: write_auxspicnt(ARMCPU_ARM7, 16, 0, val); return; case REG_AUXSPIDATA: { //if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; //zero 20-aug-2013 - this seems pointless u8 spidata = slot1_device->auxspi_transaction(ARMCPU_ARM7,(u8)val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, spidata); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; } case REG_SPICNT : { int reset_firmware = 1; if ( ((MMU.SPI_CNT >> 8) & 0x3) == 1) { if ( ((val >> 8) & 0x3) == 1) { if ( BIT11(MMU.SPI_CNT)) { // select held reset_firmware = 0; } } } //MMU.fw.com == 0; // reset fw device communication if ( reset_firmware) { // reset fw device communication fw_reset_com(&MMU.fw); } MMU.SPI_CNT = val; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPICNT >> 20) & 0xff], REG_SPICNT & 0xfff, val); } return; case REG_SPIDATA : MMU_writeToSPIData(val); return; /* NOTICE: Perhaps we have to use gbatek-like reg names instead of libnds-like ones ...*/ case REG_IME : NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM7] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM7] = (MMU.reg_IE[ARMCPU_ARM7]&0xFFFF0000) | val; return; case REG_IE + 2 : NDS_Reschedule(); //emu_halt(); MMU.reg_IE[ARMCPU_ARM7] = (MMU.reg_IE[ARMCPU_ARM7]&0xFFFF) | (((u32)val)<<16); return; case REG_IF: REG_IF_WriteWord(0,val); return; case REG_IF+2: REG_IF_WriteWord(2,val); return; case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM7, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM7, val); return; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : MMU.timerReload[ARMCPU_ARM7][(adr>>2)&3] = val; return; case REG_TM0CNTH : case REG_TM1CNTH : case REG_TM2CNTH : case REG_TM3CNTH : { int timerIndex = ((adr-2)>>2)&0x3; write_timer(ARMCPU_ARM7, timerIndex, val); return; } case REG_GCROMCTRL : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[1][0x40], 0x1A4) & 0xFFFF0000) | val); return; case REG_GCROMCTRL+2 : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[1][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16)); return; } T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM7)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); } //================================================= MMU ARM7 write 32 void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM7(adr, "(write32) 0x%08X", val); if (adr < 0x02000000) return; //can't write to bios or entire area below main memory if (slot2_write(adr, val)) return; if (SPU_core->isSPU(adr)) { SPU_WriteLong(adr, val); return; } if ((adr & 0xFFFF0000) == 0x04800000) { WIFI_write16(adr, val & 0xFFFF); WIFI_write16(adr+2, val >> 16); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x48], adr&MMU.MMU_MASK[ARMCPU_ARM7][0x48], val); return; } // Address is an IO register if ((adr >> 24) == 4) { if (!validateIORegsWrite(adr, 32, val)) return; if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,32,adr,val); return; } switch(adr) { case REG_RTC: rtcWrite((u16)val); break; case REG_IME : NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM7] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM7] = val; return; case REG_IF: REG_IF_WriteLong(val); return; case REG_TM0CNTL: case REG_TM1CNTL: case REG_TM2CNTL: case REG_TM3CNTL: { int timerIndex = (adr>>2)&0x3; MMU.timerReload[ARMCPU_ARM7][timerIndex] = (u16)val; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr & 0xFFF, val); write_timer(ARMCPU_ARM7, timerIndex, val>>16); return; } case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM7, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM7, val); return; case REG_IPCFIFOSEND: IPC_FIFOsend(ARMCPU_ARM7, val); return; case REG_GCROMCTRL : MMU_writeToGCControl(val); return; case REG_GCDATAIN: MMU_writeToGC(val); return; } T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM7)) { JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 0) = 0; JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 1) = 0; } #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); } //================================================= MMU ARM7 read 08 u8 FASTCALL _MMU_ARM7_read08(u32 adr) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM7(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]]); if (adr < 0x4000) { //the ARM7 bios can't be read by instructions outside of itself. //TODO - use REG_BIOSPROT //How accurate is this? our instruct_adr may not be exactly what the hardware uses (may use something +/- 0x08 or so) //This may be inaccurate at the very edge cases. if (NDS_ARM7.instruct_adr > 0x3FFF) return 0xFF; } // wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) { if (adr & 1) return (WIFI_read16(adr-1) >> 8) & 0xFF; else return WIFI_read16(adr) & 0xFF; } u8 slot2_val; if (slot2_read(adr, slot2_val)) return slot2_val; if (SPU_core->isSPU(adr)) { return SPU_ReadByte(adr); } // Address is an IO register if ((adr >> 24) == 4) { VALIDATE_IO_REGS_READ(ARMCPU_ARM7, 8); if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,8,adr); switch(adr) { case REG_RTC: return (u8)rtcRead(); case REG_IF: return MMU.gen_IF(); case REG_IF+1: return (MMU.gen_IF()>>8); case REG_IF+2: return (MMU.gen_IF()>>16); case REG_IF+3: return (MMU.gen_IF()>>24); case REG_DISPx_VCOUNT: return nds.VCount&0xFF; case REG_DISPx_VCOUNT+1: return (nds.VCount>>8)&0xFF; case REG_WRAMSTAT: return MMU.WRAMCNT; } return MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; return MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]; } //================================================= MMU ARM7 read 16 u16 FASTCALL _MMU_ARM7_read16(u32 adr) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM7(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); if (adr < 0x4000) { if (NDS_ARM7.instruct_adr > 0x3FFF) return 0xFFFF; } //wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) return WIFI_read16(adr) ; u16 slot2_val; if (slot2_read(adr, slot2_val)) return slot2_val; if (SPU_core->isSPU(adr)) { return SPU_ReadWord(adr); } // Address is an IO register if ((adr >> 24) == 4) { VALIDATE_IO_REGS_READ(ARMCPU_ARM7, 16); if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,16,adr); switch(adr) { case REG_POWCNT2: { u16 ret = 0; ret |= nds.power2.speakers?BIT(0):0; ret |= nds.power2.wifi?BIT(1):0; return ret; } case REG_DISPx_VCOUNT: return nds.VCount; case REG_RTC: return rtcRead(); case REG_IME: return (u16)MMU.reg_IME[ARMCPU_ARM7]; case REG_IE: return (u16)MMU.reg_IE[ARMCPU_ARM7]; case REG_IE + 2: return (u16)(MMU.reg_IE[ARMCPU_ARM7]>>16); case REG_IF: return MMU.gen_IF(); case REG_IF+2: return MMU.gen_IF()>>16; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : return read_timer(ARMCPU_ARM7,(adr&0xF)>>2); case REG_VRAMSTAT: //make sure WRAMSTAT is stashed and then fallthrough to return the value from memory. i know, gross. T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, MMU.WRAMCNT); break; case REG_AUXSPICNT: return MMU.AUX_SPI_CNT; case REG_KEYINPUT: //here is an example of what not to do: //since the arm7 polls this (and EXTKEYIN) every frame, we shouldnt count this as an input check //LagFrameFlag=0; break; case REG_EXTKEYIN: { //this is gross. we should generate this whole reg instead of poking it in ndssystem u16 ret = MMU.ARM7_REG[0x136]; if(nds.isTouch) ret &= ~64; else ret |= 64; return ret; } } return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; /* Returns data from memory */ // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]); } //================================================= MMU ARM7 read 32 u32 FASTCALL _MMU_ARM7_read32(u32 adr) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM7(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); if (adr < 0x4000) { //the ARM7 bios can't be read by instructions outside of itself. //TODO - use REG_BIOSPROT //How accurate is this? our instruct_adr may not be exactly what the hardware uses (may use something +/- 0x08 or so) //This may be inaccurate at the very edge cases. if (NDS_ARM7.instruct_adr > 0x3FFF) return 0xFFFFFFFF; } //wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) return (WIFI_read16(adr) | (WIFI_read16(adr+2) << 16)); u32 slot2_val; if (slot2_read(adr, slot2_val)) return slot2_val; if (SPU_core->isSPU(adr)) { return SPU_ReadLong(adr); } // Address is an IO register if ((adr >> 24) == 4) { VALIDATE_IO_REGS_READ(ARMCPU_ARM7, 32); if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,32,adr); switch(adr) { case REG_RTC: return (u32)rtcRead(); case REG_DISPx_VCOUNT: return nds.VCount; case REG_IME : return MMU.reg_IME[ARMCPU_ARM7]; case REG_IE : return MMU.reg_IE[ARMCPU_ARM7]; case REG_IF: return MMU.gen_IF(); case REG_IPCFIFORECV : return IPC_FIFOrecv(ARMCPU_ARM7); case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : { u32 val = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], (adr + 2) & 0xFFF); return MMU.timer[ARMCPU_ARM7][(adr&0xF)>>2] | (val<<16); } //case REG_GCROMCTRL: // return MMU_readFromGCControl(); case REG_GCDATAIN: return MMU_readFromGC(); case REG_VRAMSTAT: //make sure WRAMSTAT is stashed and then fallthrough return the value from memory. i know, gross. T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, MMU.WRAMCNT); break; } return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; //Returns data from memory // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [zeromus, inspired by shash] return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]); } //========================================================================================================= u32 FASTCALL MMU_read32(u32 proc, u32 adr) { ASSERT_UNALIGNED((adr&3)==0); if(proc==0) return _MMU_ARM9_read32(adr); else return _MMU_ARM7_read32(adr); } u16 FASTCALL MMU_read16(u32 proc, u32 adr) { ASSERT_UNALIGNED((adr&1)==0); if(proc==0) return _MMU_ARM9_read16(adr); else return _MMU_ARM7_read16(adr); } u8 FASTCALL MMU_read8(u32 proc, u32 adr) { if(proc==0) return _MMU_ARM9_read08(adr); else return _MMU_ARM7_read08(adr); } void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val) { ASSERT_UNALIGNED((adr&3)==0); if(proc==0) _MMU_ARM9_write32(adr, val); else _MMU_ARM7_write32(adr,val); } void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val) { ASSERT_UNALIGNED((adr&1)==0); if(proc==0) _MMU_ARM9_write16(adr, val); else _MMU_ARM7_write16(adr,val); } void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) { if(proc==0) _MMU_ARM9_write08(adr, val); else _MMU_ARM7_write08(adr,val); } void FASTCALL MMU_DumpMemBlock(u8 proc, u32 address, u32 size, u8 *buffer) { u32 i; u32 curaddr; for(i = 0, curaddr = address; i < size; i++, curaddr++) { buffer[i] = _MMU_read08(proc,MMU_AT_DEBUG,curaddr); } } //these templates needed to be instantiated manually template u32 MMU_struct::gen_IF(); template u32 MMU_struct::gen_IF(); //////////////////////////////////////////////////////////// //function pointer handlers for gdb stub stuff static u16 FASTCALL arm9_prefetch16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm9_prefetch32( void *data, u32 adr) { return _MMU_read32(adr); } static u8 FASTCALL arm9_read8( void *data, u32 adr) { return _MMU_read08(adr); } static u16 FASTCALL arm9_read16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm9_read32( void *data, u32 adr) { return _MMU_read32(adr); } static void FASTCALL arm9_write8(void *data, u32 adr, u8 val) { _MMU_write08(adr, val); } static void FASTCALL arm9_write16(void *data, u32 adr, u16 val) { _MMU_write16(adr, val); } static void FASTCALL arm9_write32(void *data, u32 adr, u32 val) { _MMU_write32(adr, val); } static u16 FASTCALL arm7_prefetch16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm7_prefetch32( void *data, u32 adr) { return _MMU_read32(adr); } static u8 FASTCALL arm7_read8( void *data, u32 adr) { return _MMU_read08(adr); } static u16 FASTCALL arm7_read16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm7_read32( void *data, u32 adr) { return _MMU_read32(adr); } static void FASTCALL arm7_write8(void *data, u32 adr, u8 val) { _MMU_write08(adr, val); } static void FASTCALL arm7_write16(void *data, u32 adr, u16 val) { _MMU_write16(adr, val); } static void FASTCALL arm7_write32(void *data, u32 adr, u32 val) { _MMU_write32(adr, val); } /* * the base memory interfaces */ const armcpu_memory_iface arm9_base_memory_iface = { arm9_prefetch32, arm9_prefetch16, arm9_read8, arm9_read16, arm9_read32, arm9_write8, arm9_write16, arm9_write32, NULL }; const armcpu_memory_iface arm7_base_memory_iface = { arm7_prefetch32, arm7_prefetch16, arm7_read8, arm7_read16, arm7_read32, arm7_write8, arm7_write16, arm7_write32, NULL }; /* * The direct memory interface for the ARM9. * This avoids the ARM9 protection unit when accessing * memory. */ const armcpu_memory_iface arm9_direct_memory_iface = { NULL, NULL, arm9_read8, arm9_read16, arm9_read32, arm9_write8, arm9_write16, arm9_write32, NULL }; ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// //#ifdef PROFILE_MEMORY_ACCESS // //#define PROFILE_PREFETCH 0 //#define PROFILE_READ 1 //#define PROFILE_WRITE 2 // //struct mem_access_profile { // u64 num_accesses; // u32 address_mask; // u32 masked_value; //}; // //#define PROFILE_NUM_MEM_ACCESS_PROFILES 4 // //static u64 profile_num_accesses[2][3]; //static u64 profile_unknown_addresses[2][3]; //static struct mem_access_profile //profile_memory_accesses[2][3][PROFILE_NUM_MEM_ACCESS_PROFILES]; // //static void //setup_profiling( void) { // int i; // // for ( i = 0; i < 2; i++) { // int access_type; // // for ( access_type = 0; access_type < 3; access_type++) { // profile_num_accesses[i][access_type] = 0; // profile_unknown_addresses[i][access_type] = 0; // // /* // * Setup the access testing structures // */ // profile_memory_accesses[i][access_type][0].address_mask = 0x0e000000; // profile_memory_accesses[i][access_type][0].masked_value = 0x00000000; // profile_memory_accesses[i][access_type][0].num_accesses = 0; // // /* main memory */ // profile_memory_accesses[i][access_type][1].address_mask = 0x0f000000; // profile_memory_accesses[i][access_type][1].masked_value = 0x02000000; // profile_memory_accesses[i][access_type][1].num_accesses = 0; // // /* shared memory */ // profile_memory_accesses[i][access_type][2].address_mask = 0x0f800000; // profile_memory_accesses[i][access_type][2].masked_value = 0x03000000; // profile_memory_accesses[i][access_type][2].num_accesses = 0; // // /* arm7 memory */ // profile_memory_accesses[i][access_type][3].address_mask = 0x0f800000; // profile_memory_accesses[i][access_type][3].masked_value = 0x03800000; // profile_memory_accesses[i][access_type][3].num_accesses = 0; // } // } //} // //static void //profile_memory_access( int arm9, u32 adr, int access_type) { // static int first = 1; // int mem_profile; // int address_found = 0; // // if ( first) { // setup_profiling(); // first = 0; // } // // profile_num_accesses[arm9][access_type] += 1; // // for ( mem_profile = 0; // mem_profile < PROFILE_NUM_MEM_ACCESS_PROFILES && // !address_found; // mem_profile++) { // if ( (adr & profile_memory_accesses[arm9][access_type][mem_profile].address_mask) == // profile_memory_accesses[arm9][access_type][mem_profile].masked_value) { // /*printf( "adr %08x mask %08x res %08x expected %08x\n", // adr, // profile_memory_accesses[arm9][access_type][mem_profile].address_mask, // adr & profile_memory_accesses[arm9][access_type][mem_profile].address_mask, // profile_memory_accesses[arm9][access_type][mem_profile].masked_value);*/ // address_found = 1; // profile_memory_accesses[arm9][access_type][mem_profile].num_accesses += 1; // } // } // // if ( !address_found) { // profile_unknown_addresses[arm9][access_type] += 1; // } //} // // //static const char *access_type_strings[] = { // "prefetch", // "read ", // "write " //}; // //void //print_memory_profiling( void) { // int arm; // // printf("------ Memory access profile ------\n"); // // for ( arm = 0; arm < 2; arm++) { // int access_type; // // for ( access_type = 0; access_type < 3; access_type++) { // int mem_profile; // printf("ARM%c: num of %s %lld\n", // arm ? '9' : '7', // access_type_strings[access_type], // profile_num_accesses[arm][access_type]); // // for ( mem_profile = 0; // mem_profile < PROFILE_NUM_MEM_ACCESS_PROFILES; // mem_profile++) { // printf( "address %08x: %lld\n", // profile_memory_accesses[arm][access_type][mem_profile].masked_value, // profile_memory_accesses[arm][access_type][mem_profile].num_accesses); // } // // printf( "unknown addresses %lld\n", // profile_unknown_addresses[arm][access_type]); // // printf( "\n"); // } // } // // printf("------ End of Memory access profile ------\n\n"); //} //#else //void //print_memory_profiling( void) { //} //#endif /* End of PROFILE_MEMORY_ACCESS area */ desmume-0.9.11/src/mc.h0000755000000000000000000001302612467662066013322 0ustar rootroot/* Copyright (C) 2006 thoduv Copyright (C) 2006 Theo Berkau Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef __MC_H__ #define __MC_H__ #include #include #include #include "types.h" #define MAX_SAVE_TYPES 13 #define MC_TYPE_AUTODETECT 0x0 #define MC_TYPE_EEPROM1 0x1 #define MC_TYPE_EEPROM2 0x2 #define MC_TYPE_FLASH 0x3 #define MC_TYPE_FRAM 0x4 #define MC_SIZE_4KBITS 0x000200 #define MC_SIZE_64KBITS 0x002000 #define MC_SIZE_256KBITS 0x008000 #define MC_SIZE_512KBITS 0x010000 #define MC_SIZE_1MBITS 0x020000 #define MC_SIZE_2MBITS 0x040000 #define MC_SIZE_4MBITS 0x080000 #define MC_SIZE_8MBITS 0x100000 #define MC_SIZE_16MBITS 0x200000 #define MC_SIZE_32MBITS 0x400000 #define MC_SIZE_64MBITS 0x800000 #define MC_SIZE_128MBITS 0x1000000 #define MC_SIZE_256MBITS 0x2000000 #define MC_SIZE_512MBITS 0x4000000 class EMUFILE; //This "backup device" represents a typical retail NDS save memory accessible via AUXSPI. //It is managed as a core emulator service for historical reasons which are bad, //and possible infrastructural simplification reasons which are good. //Slot-1 devices will map their AUXSPI accesses through to the core-managed BackupDevice to access it for the running software. class BackupDevice { public: BackupDevice(); ~BackupDevice(); //signals the save system that we are in MOVIE mode. doesnt load up a rom, and never saves it. initializes for that case. void movie_mode(); void reset(); void close_rom(); void forceManualBackupType(); void reset_hardware(); std::string getFilename() { return filename; } u8 readByte(u32 addr, const u8 init); u16 readWord(u32 addr, const u16 init); u32 readLong(u32 addr, const u32 init); u8 readByte(const u8 init); u16 readWord(const u16 init); u32 readLong(const u32 init); void writeByte(u32 addr, u8 val); void writeWord(u32 addr, u16 val); void writeLong(u32 addr, u32 val); void writeByte(u8 val); void writeWord(u16 val); void writeLong(u32 val); void seek(u32 pos); void flushBackup(); u8 searchFileSaveType(u32 size); bool save_state(EMUFILE* os); bool load_state(EMUFILE* is); //commands from mmu void reset_command() { reset_command_state = true; }; u8 data_command(u8, u8); //this info was saved before the last reset (used for savestate compatibility) struct SavedInfo { u32 addr_size; } savedInfo; void ensure(u32 addr, EMUFILE *fpOut = NULL); void ensure(u32 addr, u8 val, EMUFILE *fpOut = NULL); //and these are used by old savestates void load_old_state(u32 addr_size, u8* data, u32 datasize); static u32 addr_size_for_old_save_size(int bupmem_size); static u32 addr_size_for_old_save_type(int bupmem_type); static u32 pad_up_size(u32 startSize); void raw_applyUserSettings(u32& size, bool manual = false); u32 trim(void *buf, u32 size); u32 fillLeft(u32 size); u32 get_save_duc_size(const char* filename); u32 get_save_nogba_size(const char* filename); u32 get_save_nogba_size(u8 *data); u32 get_save_raw_size(const char* filename); bool import_duc(const char* filename, u32 force_size = 0); bool import_no_gba(const char *fname, u32 force_size = 0); bool import_raw(const char* filename, u32 force_size = 0); bool export_no_gba(const char* fname); bool export_raw(const char* filename); bool no_gba_unpack(u8 *&buf, u32 &size); bool load_movie(EMUFILE* is); struct { u32 size,padSize,type,addr_size,mem_size; } info; bool isMovieMode; u32 importDataSize(const char *filename); bool importData(const char *filename, u32 force_size = 0); bool exportData(const char *filename); //the value contained in memory when shipped from factory (before user program ever writes to it). more details commented elsewhere. u8 uninitializedValue; private: EMUFILE *fpMC; std::string filename; u32 fsize; int readFooter(); bool write(u8 val); u8 read(); bool saveBuffer(u8 *data, u32 size, bool _rewind, bool _truncate = false); bool write_enable; bool reset_command_state; u32 com; //persistent command actually handled u32 addr_size, addr_counter; u32 addr; u8 write_protect; std::vector data_autodetect; enum STATE { DETECTING = 0, RUNNING = 1 } state; enum MOTION_INIT_STATE { MOTION_INIT_STATE_IDLE, MOTION_INIT_STATE_RECEIVED_4, MOTION_INIT_STATE_RECEIVED_4_B, MOTION_INIT_STATE_FE, MOTION_INIT_STATE_FD, MOTION_INIT_STATE_FB }; enum MOTION_FLAG { MOTION_FLAG_NONE=0, MOTION_FLAG_ENABLED=1, MOTION_FLAG_SENSORMODE=2 }; u8 motionInitState, motionFlag; void checkReset(); void detect(); }; void backup_setManualBackupType(int type); void backup_forceManualBackupType(); struct SAVE_TYPE { const char* descr; int media_type; int size; int addr_size; }; extern const SAVE_TYPE save_types[]; #endif /*__FW_H__*/ desmume-0.9.11/src/version.h0000755000000000000000000000211412467662066014404 0ustar rootroot/* Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include "types.h" extern const u8 DESMUME_VERSION_MAJOR; extern const u8 DESMUME_VERSION_MINOR; extern const u8 DESMUME_VERSION_BUILD; u32 EMU_DESMUME_VERSION_NUMERIC(); u32 EMU_DESMUME_SUBVERSION_NUMERIC(); const char* EMU_DESMUME_VERSION_STRING(); const char* EMU_DESMUME_SUBVERSION_STRING(); const char* EMU_DESMUME_NAME_AND_VERSION(); const char* EMU_DESMUME_COMPILER_DETAIL(); desmume-0.9.11/src/slot1.cpp0000755000000000000000000002041512467662066014320 0ustar rootroot/* Copyright (C) 2010-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ /* Notes for future development: Despite gbatek's specifications contrariwise, GCDATAIN is writeable. R4 uses this for writes to the card. Despite gbatek's specifications contrariwise, GCROMCTRL[30] can take a value of 1 to indicate that the GC bus transaction should be writes. It is unclear what kicks GC bus transactions. It's possibly bit 31 of GCROMCTRL, but normmatt thinks he might have had to hack around that to make something work, and that it might just be any write to GCROMCTRL. Since GCROMCTRL[26:24] can't represent 'data block size' of 1 or 2, it is assumed that transactions always happen in 4 byte pieces. ...so, any 8/16bit accesses to GCDATAIN would transfer a whole 32bit unit and then just return the requested portion */ //TODO - create a Slot1_TurboRom which we can select when booting from fakebios/nonfirmware and which would provide a useful service to people porting to tighter platforms by bypassing largely useless cruft #include #include "types.h" #include "slot1.h" #include "NDSSystem.h" #include "emufile.h" #include "utils/vfat.h" #include "path.h" bool slot1_R4_path_type = false; //------- //fat-related common elements static EMUFILE* fatImage = NULL; static std::string fatDir; static void scanDir() { if(fatDir == "") return; if (fatImage) { delete fatImage; fatImage = NULL; } VFAT vfat; if(vfat.build(slot1_R4_path_type?path.RomDirectory.c_str():fatDir.c_str(), 16)) { fatImage = vfat.detach(); } } void slot1_SetFatDir(const std::string& dir, bool sameAsRom) { //printf("FAT path %s\n", dir.c_str()); slot1_R4_path_type = sameAsRom; if (!slot1_R4_path_type) fatDir = dir; } std::string slot1_GetFatDir() { return fatDir; } EMUFILE* slot1_GetFatImage() { return fatImage; } //------------ ISlot1Interface* slot1_List[NDS_SLOT1_COUNT] = {0}; ISlot1Interface* slot1_device = NULL; NDS_SLOT1_TYPE slot1_device_type = NDS_SLOT1_RETAIL_AUTO; //default for frontends that dont even configure this NDS_SLOT1_TYPE slot1_selected_type = NDS_SLOT1_NONE; void slot1_Init() { //due to sloppy initialization code in various untestable desmume ports, we might try this more than once static bool initialized = false; if(initialized) return; initialized = true; //construct all devices extern TISlot1InterfaceConstructor construct_Slot1_None; extern TISlot1InterfaceConstructor construct_Slot1_Retail_Auto; extern TISlot1InterfaceConstructor construct_Slot1_R4; extern TISlot1InterfaceConstructor construct_Slot1_Retail_NAND; extern TISlot1InterfaceConstructor construct_Slot1_Retail_MCROM; extern TISlot1InterfaceConstructor construct_Slot1_Retail_DEBUG; slot1_List[NDS_SLOT1_NONE] = construct_Slot1_None(); slot1_List[NDS_SLOT1_RETAIL_AUTO] = construct_Slot1_Retail_Auto(); slot1_List[NDS_SLOT1_R4] = construct_Slot1_R4(); slot1_List[NDS_SLOT1_RETAIL_NAND] = construct_Slot1_Retail_NAND(); slot1_List[NDS_SLOT1_RETAIL_MCROM] = construct_Slot1_Retail_MCROM(); slot1_List[NDS_SLOT1_RETAIL_DEBUG] = construct_Slot1_Retail_DEBUG(); } void slot1_Shutdown() { for(int i=0;ishutdown(); delete slot1_List[i]; } } bool slot1_Connect() { slot1_device->connect(); return true; } void slot1_Disconnect() { slot1_device->disconnect(); //be careful to do this second, maybe the device will write something more if (fatImage) { delete fatImage; fatImage = NULL; } } void slot1_Reset() { //disconnect existing device if(slot1_device != NULL) slot1_device->disconnect(); //connect new device slot1_device = slot1_List[slot1_device_type]; if (slot1_device_type == NDS_SLOT1_R4) scanDir(); slot1_device->connect(); } bool slot1_Change(NDS_SLOT1_TYPE changeToType) { if((changeToType == slot1_device_type) || (changeToType == slot1_GetSelectedType())) return FALSE; //nothing to do if (changeToType > NDS_SLOT1_COUNT || changeToType < 0) return FALSE; if(slot1_device != NULL) slot1_device->disconnect(); slot1_device_type = changeToType; slot1_device = slot1_List[slot1_device_type]; printf("Slot 1: %s\n", slot1_device->info()->name()); printf("sending eject signal to SLOT-1\n"); NDS_TriggerCardEjectIRQ(); slot1_device->connect(); return true; } bool slot1_getTypeByID(u8 ID, NDS_SLOT1_TYPE &type) { for (u8 i = 0; i < NDS_SLOT1_COUNT; i++) { if (slot1_List[i]->info()->id() == ID) { type = (NDS_SLOT1_TYPE)i; return true; } } return false; } bool slot1_ChangeByID(u8 ID) { NDS_SLOT1_TYPE type = NDS_SLOT1_RETAIL_AUTO; slot1_getTypeByID(ID, type); return slot1_Change(type); } NDS_SLOT1_TYPE slot1_GetCurrentType() { return slot1_device_type; } NDS_SLOT1_TYPE slot1_GetSelectedType() { if (slot1_device_type == NDS_SLOT1_RETAIL_AUTO) return slot1_selected_type; return slot1_device_type; } void slot1_Savestate(EMUFILE* os) { slot1_device->savestate(os); } void slot1_Loadstate(EMUFILE* is) { slot1_device->loadstate(is); } //// --- Ninja SD commands notes ------------------------------------- // ///writetoGCControl: // // NJSD init/reset // case 0x20: // { // card.address = 0; // card.transfer_count = 0; // } // break; // // NJSD_sendCLK() // case 0xE0: // { // card.address = 0; // card.transfer_count = 0; // NDS_makeInt(PROCNUM, 20); // } // break; // // NJSD_sendCMDN() / NJSD_sendCMDR() // case 0xF0: // case 0xF1: // switch (card.command[2]) // { // // GO_IDLE_STATE // case 0x40: // card.address = 0; // card.transfer_count = 0; // NDS_makeInt(PROCNUM, 20); // break; // case 0x42: // ALL_SEND_CID // case 0x43: // SEND_RELATIVE_ADDR // case 0x47: // SELECT_CARD // case 0x49: // SEND_CSD // case 0x4D: // case 0x77: // APP_CMD // case 0x69: // SD_APP_OP_COND // card.address = 0; // card.transfer_count = 6; // NDS_makeInt(PROCNUM, 20); // break; // // SET_BLOCKLEN // case 0x50: // card.address = 0; // card.transfer_count = 6; // card.blocklen = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24); // NDS_makeInt(PROCNUM, 20); // break; // // READ_SINGLE_BLOCK // case 0x51: // card.address = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24); // card.transfer_count = (card.blocklen + 3) >> 2; // NDS_makeInt(PROCNUM, 20); // break; // } // break; // // --- Ninja SD commands end --------------------------------- // //GCDATAIN: // // --- Ninja SD commands ------------------------------------- // // NJSD_sendCMDN() / NJSD_sendCMDR() // case 0xF0: // case 0xF1: // switch (card.command[2]) // { // // ALL_SEND_CID // case 0x42: // if (card.transfer_count == 2) val = 0x44534A4E; // else val = 0x00000000; // // SEND_RELATIVE_ADDR // case 0x43: // case 0x47: // case 0x49: // case 0x50: // val = 0x00000000; // break; // case 0x4D: // if (card.transfer_count == 2) val = 0x09000000; // else val = 0x00000000; // break; // // APP_CMD // case 0x77: // if (card.transfer_count == 2) val = 0x00000037; // else val = 0x00000000; // break; // // SD_APP_OP_COND // case 0x69: // if (card.transfer_count == 2) val = 0x00008000; // else val = 0x00000000; // break; // // READ_SINGLE_BLOCK // case 0x51: // val = 0x00000000; // break; // } // break; // // --- Ninja SD commands end --------------------------------- desmume-0.9.11/src/mic.h0000755000000000000000000000206512467662066013474 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef MIC_H #define MIC_H #include "types.h" class EMUFILE; #ifdef WIN32 static char MicSampleName[256]; bool LoadSample(const char *name); #endif extern int MicDisplay; #ifdef FAKE_MIC void Mic_DoNoise(BOOL); #endif BOOL Mic_Init(void); void Mic_Reset(void); void Mic_DeInit(void); u8 Mic_ReadSample(void); void mic_savestate(EMUFILE* os); bool mic_loadstate(EMUFILE* is, int size); #endif // MIC_H desmume-0.9.11/src/FIFO.h0000755000000000000000000000433412467662066013450 0ustar rootroot/* Copyright 2006 yopyop Copyright 2007 shash Copyright 2007-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef FIFO_H #define FIFO_H #include "types.h" //=================================================== IPC FIFO typedef struct { u32 buf[16]; u8 head; u8 tail; u8 size; } IPC_FIFO; extern IPC_FIFO ipc_fifo[2]; extern void IPC_FIFOinit(u8 proc); extern void IPC_FIFOsend(u8 proc, u32 val); extern u32 IPC_FIFOrecv(u8 proc); extern void IPC_FIFOcnt(u8 proc, u16 val); //=================================================== GFX FIFO //yeah, its oversize for now. thats a simpler solution //moon seems to overdrive the fifo with immediate dmas //i think this might be nintendo code too #define HACK_GXIFO_SIZE 200000 typedef struct { u8 cmd[HACK_GXIFO_SIZE]; u32 param[HACK_GXIFO_SIZE]; u32 head; // start position u32 tail; // tail u32 size; // size FIFO buffer u32 matrix_stack_op_size; //number of matrix stack items in the fifo (stack is busy when this is nonzero) } GFX_FIFO; typedef struct { u8 cmd[4]; u32 param[4]; u8 head; u8 tail; u8 size; } GFX_PIPE; extern GFX_PIPE gxPIPE; extern GFX_FIFO gxFIFO; extern void GFX_PIPEclear(); extern void GFX_FIFOclear(); extern void GFX_FIFOsend(u8 cmd, u32 param); extern BOOL GFX_PIPErecv(u8 *cmd, u32 *param); extern void GFX_FIFOcnt(u32 val); //=================================================== Display memory FIFO typedef struct { u32 buf[0x6000]; // 256x192 32K color u32 head; // head u32 tail; // tail } DISP_FIFO; extern DISP_FIFO disp_fifo; extern void DISP_FIFOinit(); extern void DISP_FIFOsend(u32 val); extern u32 DISP_FIFOrecv(); #endif desmume-0.9.11/src/types.h0000755000000000000000000003016012467662066014065 0ustar rootroot/* Copyright (C) 2005 Guillaume Duhamel Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef TYPES_HPP #define TYPES_HPP //analyze microsoft compilers #ifdef _MSC_VER #define HOST_WINDOWS //todo - everyone will want to support this eventually, i suppose #ifndef DESMUME_QT #include "config.h" #endif #endif //_MSC_VER // Determine CPU architecture for platforms that don't use the autoconf script #if defined(HOST_WINDOWS) || defined(DESMUME_COCOA) #if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) #define HOST_64 #else #define HOST_32 #endif #endif //enforce a constraint: gdb stub requires developer #if defined(GDB_STUB) && !defined(DEVELOPER) #define DEVELOPER #endif #ifdef DEVELOPER #define IF_DEVELOPER(X) X #else #define IF_DEVELOPER(X) #endif #ifdef HOST_WINDOWS #define HAVE_LIBAGG #define ENABLE_SSE #define ENABLE_SSE2 #ifdef DEVELOPER #define HAVE_LUA #endif #define HAVE_JIT #endif #ifdef __GNUC__ #ifdef __SSE__ #define ENABLE_SSE #endif #ifdef __SSE2__ #define ENABLE_SSE2 #endif #endif #ifdef NOSSE #undef ENABLE_SSE #endif #ifdef NOSSE2 #undef ENABLE_SSE2 #endif #ifdef _MSC_VER #define strcasecmp(x,y) _stricmp(x,y) #define strncasecmp(x, y, l) strnicmp(x, y, l) #define snprintf _snprintf #else #define WINAPI #endif #if !defined(MAX_PATH) #if defined(HOST_WINDOWS) #define MAX_PATH 260 #elif defined(__GNUC__) #include #if !defined(PATH_MAX) #define MAX_PATH 1024 #else #define MAX_PATH PATH_MAX #endif #else #define MAX_PATH 1024 #endif #endif //------------alignment macros------------- //dont apply these to types without further testing. it only works portably here on declarations of variables //cant we find a pattern other people use more successfully? #if defined(_MSC_VER) || defined(__INTEL_COMPILER) #define DS_ALIGN(X) __declspec(align(X)) #elif defined(__GNUC__) #define DS_ALIGN(X) __attribute__ ((aligned (X))) #else #define DS_ALIGN(X) #endif #define CACHE_ALIGN DS_ALIGN(32) //use this for example when you want a byte value to be better-aligned #define FAST_ALIGN DS_ALIGN(4) //--------------------------------------------- #ifdef __MINGW32__ #define FASTCALL __attribute__((fastcall)) #define ASMJIT_CALL_CONV kX86FuncConvGccFastCall #elif defined (__i386__) && !defined(__clang__) #define FASTCALL __attribute__((regparm(3))) #define ASMJIT_CALL_CONV kX86FuncConvGccRegParm3 #elif defined(_MSC_VER) || defined(__INTEL_COMPILER) #define FASTCALL #define ASMJIT_CALL_CONV kX86FuncConvDefault #else #define FASTCALL #define ASMJIT_CALL_CONV kX86FuncConvDefault #endif #ifdef _MSC_VER #define _CDECL_ __cdecl #else #define _CDECL_ #endif #ifndef INLINE #if defined(_MSC_VER) || defined(__INTEL_COMPILER) #define INLINE _inline #else #define INLINE inline #endif #endif #ifndef FORCEINLINE #if defined(_MSC_VER) || defined(__INTEL_COMPILER) #define FORCEINLINE __forceinline #define MSC_FORCEINLINE __forceinline #else #define FORCEINLINE inline __attribute__((always_inline)) #define MSC_FORCEINLINE #endif #endif #ifndef NOINLINE #ifdef __GNUC__ #define NOINLINE __attribute__((noinline)) #else #define NOINLINE #endif #endif #if defined(__LP64__) typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; typedef signed char s8; typedef signed short s16; typedef signed int s32; typedef signed long long s64; #else typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; #if defined(_MSC_VER) || defined(__INTEL_COMPILER) typedef unsigned __int64 u64; #else typedef unsigned long long u64; #endif typedef signed char s8; typedef signed short s16; typedef signed int s32; #if defined(_MSC_VER) || defined(__INTEL_COMPILER) typedef __int64 s64; #else typedef signed long long s64; #endif #endif typedef u8 uint8; typedef u16 uint16; #ifndef OBJ_C typedef u32 uint32; #else #define uint32 u32 //uint32 is defined in Leopard somewhere, avoid conflicts #endif /*---------- GPU3D fixed-points types -----------*/ typedef s32 f32; #define inttof32(n) ((n) << 12) #define f32toint(n) ((n) >> 12) #define floattof32(n) ((int32)((n) * (1 << 12))) #define f32tofloat(n) (((float)(n)) / (float)(1<<12)) typedef s16 t16; #define f32tot16(n) ((t16)(n >> 8)) #define inttot16(n) ((n) << 4) #define t16toint(n) ((n) >> 4) #define floattot16(n) ((t16)((n) * (1 << 4))) #define t16ofloat(n) (((float)(n)) / (float)(1<<4)) typedef s16 v16; #define inttov16(n) ((n) << 12) #define f32tov16(n) (n) #define floattov16(n) ((v16)((n) * (1 << 12))) #define v16toint(n) ((n) >> 12) #define v16tofloat(n) (((float)(n)) / (float)(1<<12)) typedef s16 v10; #define inttov10(n) ((n) << 9) #define f32tov10(n) ((v10)(n >> 3)) #define v10toint(n) ((n) >> 9) #define floattov10(n) ((v10)((n) * (1 << 9))) #define v10tofloat(n) (((float)(n)) / (float)(1<<9)) /*----------------------*/ #ifndef OBJ_C typedef int BOOL; #else //apple also defines BOOL typedef int desmume_BOOL; #define BOOL desmume_BOOL #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifdef __BIG_ENDIAN__ #ifndef WORDS_BIGENDIAN #define WORDS_BIGENDIAN #endif #endif #ifdef WORDS_BIGENDIAN # define LOCAL_BE #else # define LOCAL_LE #endif /* little endian (ds' endianess) to local endianess convert macros */ #ifdef LOCAL_BE /* local arch is big endian */ # define LE_TO_LOCAL_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff)) # define LE_TO_LOCAL_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff)) # define LE_TO_LOCAL_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff0000)|(((x)>>40)&0xff00)|(((x)>>56)&0xff)) # define LOCAL_TO_LE_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff)) # define LOCAL_TO_LE_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff)) # define LOCAL_TO_LE_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff0000)|(((x)>>40)&0xff00)|(((x)>>56)&0xff)) #else /* local arch is little endian */ # define LE_TO_LOCAL_16(x) (x) # define LE_TO_LOCAL_32(x) (x) # define LE_TO_LOCAL_64(x) (x) # define LOCAL_TO_LE_16(x) (x) # define LOCAL_TO_LE_32(x) (x) # define LOCAL_TO_LE_64(x) (x) #endif // kilobytes and megabytes macro #define MB(x) ((x)*1024*1024) #define KB(x) ((x)*1024) #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define CPU_STR(c) ((c==ARM9)?"ARM9":"ARM7") typedef enum { ARM9 = 0, ARM7 = 1 } cpu_id_t; ///endian-flips count bytes. count should be even and nonzero. inline void FlipByteOrder(u8 *src, u32 count) { u8 *start=src; u8 *end=src+count-1; if((count&1) || !count) return; /* This shouldn't happen. */ while(count--) { u8 tmp; tmp=*end; *end=*start; *start=tmp; end--; start++; } } inline u64 double_to_u64(double d) { union { u64 a; double b; } fuxor; fuxor.b = d; return fuxor.a; } inline double u64_to_double(u64 u) { union { u64 a; double b; } fuxor; fuxor.a = u; return fuxor.b; } inline u32 float_to_u32(float f) { union { u32 a; float b; } fuxor; fuxor.b = f; return fuxor.a; } inline float u32_to_float(u32 u) { union { u32 a; float b; } fuxor; fuxor.a = u; return fuxor.b; } ///stores a 32bit value into the provided byte array in guaranteed little endian form inline void en32lsb(u8 *buf, u32 morp) { buf[0]=(u8)(morp); buf[1]=(u8)(morp>>8); buf[2]=(u8)(morp>>16); buf[3]=(u8)(morp>>24); } inline void en16lsb(u8* buf, u16 morp) { buf[0]=(u8)morp; buf[1]=(u8)(morp>>8); } ///unpacks a 64bit little endian value from the provided byte array into host byte order inline u64 de64lsb(u8 *morp) { return morp[0]|(morp[1]<<8)|(morp[2]<<16)|(morp[3]<<24)|((u64)morp[4]<<32)|((u64)morp[5]<<40)|((u64)morp[6]<<48)|((u64)morp[7]<<56); } ///unpacks a 32bit little endian value from the provided byte array into host byte order inline u32 de32lsb(u8 *morp) { return morp[0]|(morp[1]<<8)|(morp[2]<<16)|(morp[3]<<24); } ///unpacks a 16bit little endian value from the provided byte array into host byte order inline u16 de16lsb(u8 *morp) { return morp[0]|(morp[1]<<8); } #ifndef ARRAY_SIZE //taken from winnt.h extern "C++" // templates cannot be declared to have 'C' linkage template char (*BLAHBLAHBLAH( UNALIGNED T (&)[N] ))[N]; #define ARRAY_SIZE(A) (sizeof(*BLAHBLAHBLAH(A))) #endif //fairly standard for loop macros #define MACRODO1(TRICK,TODO) { const int X = TRICK; TODO; } #define MACRODO2(X,TODO) { MACRODO1((X),TODO) MACRODO1(((X)+1),TODO) } #define MACRODO4(X,TODO) { MACRODO2((X),TODO) MACRODO2(((X)+2),TODO) } #define MACRODO8(X,TODO) { MACRODO4((X),TODO) MACRODO4(((X)+4),TODO) } #define MACRODO16(X,TODO) { MACRODO8((X),TODO) MACRODO8(((X)+8),TODO) } #define MACRODO32(X,TODO) { MACRODO16((X),TODO) MACRODO16(((X)+16),TODO) } #define MACRODO64(X,TODO) { MACRODO32((X),TODO) MACRODO32(((X)+32),TODO) } #define MACRODO128(X,TODO) { MACRODO64((X),TODO) MACRODO64(((X)+64),TODO) } #define MACRODO256(X,TODO) { MACRODO128((X),TODO) MACRODO128(((X)+128),TODO) } //this one lets you loop any number of times (as long as N<256) #define MACRODO_N(N,TODO) {\ if((N)&0x100) MACRODO256(0,TODO); \ if((N)&0x080) MACRODO128((N)&(0x100),TODO); \ if((N)&0x040) MACRODO64((N)&(0x100|0x080),TODO); \ if((N)&0x020) MACRODO32((N)&(0x100|0x080|0x040),TODO); \ if((N)&0x010) MACRODO16((N)&(0x100|0x080|0x040|0x020),TODO); \ if((N)&0x008) MACRODO8((N)&(0x100|0x080|0x040|0x020|0x010),TODO); \ if((N)&0x004) MACRODO4((N)&(0x100|0x080|0x040|0x020|0x010|0x008),TODO); \ if((N)&0x002) MACRODO2((N)&(0x100|0x080|0x040|0x020|0x010|0x008|0x004),TODO); \ if((N)&0x001) MACRODO1((N)&(0x100|0x080|0x040|0x020|0x010|0x008|0x004|0x002),TODO); \ } //--------------------------- //Binary constant generator macro By Tom Torfs - donated to the public domain //turn a numeric literal into a hex constant //(avoids problems with leading zeroes) //8-bit constants max value 0x11111111, always fits in unsigned long #define HEX__(n) 0x##n##LU //8-bit conversion function #define B8__(x) ((x&0x0000000FLU)?1:0) \ +((x&0x000000F0LU)?2:0) \ +((x&0x00000F00LU)?4:0) \ +((x&0x0000F000LU)?8:0) \ +((x&0x000F0000LU)?16:0) \ +((x&0x00F00000LU)?32:0) \ +((x&0x0F000000LU)?64:0) \ +((x&0xF0000000LU)?128:0) //for upto 8-bit binary constants #define B8(d) ((unsigned char)B8__(HEX__(d))) // for upto 16-bit binary constants, MSB first #define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) \ + B8(dlsb)) // for upto 32-bit binary constants, MSB first */ #define B32(dmsb,db2,db3,dlsb) (((unsigned long)B8(dmsb)<<24) \ + ((unsigned long)B8(db2)<<16) \ + ((unsigned long)B8(db3)<<8) \ + B8(dlsb)) //Sample usage: //B8(01010101) = 85 //B16(10101010,01010101) = 43605 //B32(10000000,11111111,10101010,01010101) = 2164238933 //--------------------------- #ifndef CTASSERT #define CTASSERT(x) typedef char __assert ## y[(x) ? 1 : -1] #endif static const char hexValid[23] = {"0123456789ABCDEFabcdef"}; template inline void reconstruct(T* t) { t->~T(); new(t) T(); } //-------------fixed point speedup macros #ifdef _WIN32 #include #endif FORCEINLINE s64 fx32_mul(const s32 a, const s32 b) { #ifdef _WIN32 return __emul(a,b); #else return ((s64)a)*((s64)b); #endif } FORCEINLINE s32 fx32_shiftdown(const s64 a) { #ifdef _WIN32 return (s32)__ll_rshift(a,12); #else return (s32)(a>>12); #endif } FORCEINLINE s64 fx32_shiftup(const s32 a) { #ifdef _WIN32 return __ll_lshift(a,12); #else return ((s64)a)<<12; #endif } #endif desmume-0.9.11/src/mic.cpp0000755000000000000000000001134412467662066014027 0ustar rootroot/* mic.cpp - this file is part of DeSmuME * * Copyright (C) 2009-2015 DeSmuME Team * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #if !defined(WIN32) || defined(DESMUME_QT) #include #include "mic.h" #include "NDSSystem.h" #include "readwrite.h" #include "emufile.h" #define MIC_NULL_SAMPLE_VALUE 0 #define MIC_MAX_BUFFER_SAMPLES 320 #define MIC_BUFFER_SIZE (sizeof(u8) * MIC_MAX_BUFFER_SAMPLES) #define NUM_INTERNAL_NOISE_SAMPLES 32 static u8 *micSampleBuffer = NULL; // Pointer to the internal sample buffer. static u8 *micReadPosition = NULL; // Pointer to the read position of the internal sample buffer. static u8 *micWritePosition = NULL; // Pointer to the write position of the internal sample buffer. static unsigned int micBufferFillCount; // The number of readable samples in the internal sample buffer. static void Mic_BufferClear(void) { if (micSampleBuffer == NULL) { return; } memset(micSampleBuffer, MIC_NULL_SAMPLE_VALUE, MIC_BUFFER_SIZE); micReadPosition = micSampleBuffer; micWritePosition = micSampleBuffer; micBufferFillCount = 0; } BOOL Mic_Init(void) { BOOL result = FALSE; u8 *newBuffer = (u8 *)malloc(MIC_BUFFER_SIZE); if (newBuffer == NULL) { return result; } micSampleBuffer = newBuffer; Mic_BufferClear(); result = TRUE; return result; } void Mic_DeInit(void) { free(micSampleBuffer); micSampleBuffer = NULL; } void Mic_Reset(void) { *micReadPosition = MIC_NULL_SAMPLE_VALUE; micWritePosition = micReadPosition; micBufferFillCount = 0; } static bool Mic_GetActivate(void) { return NDS_getFinalUserInput().mic.micButtonPressed; } static bool Mic_IsBufferFull(void) { return (micBufferFillCount >= MIC_MAX_BUFFER_SAMPLES); } static bool Mic_IsBufferEmpty(void) { return (micBufferFillCount == 0); } static u8 Mic_DefaultBufferRead(void) { u8 theSample = MIC_NULL_SAMPLE_VALUE; if (micSampleBuffer == NULL) { return theSample; } theSample = *micReadPosition; if (Mic_IsBufferEmpty()) { return theSample; } micReadPosition++; micBufferFillCount--; // Move the pointer back to start if we reach the end of the memory block. if (micReadPosition >= (micSampleBuffer + MIC_BUFFER_SIZE)) { micReadPosition = micSampleBuffer; } return theSample; } u8 Mic_ReadSample(void) { // All mic modes other than Physical must have the mic hotkey pressed in order // to work. if (CommonSettings.micMode != TCommonSettings::Physical && !Mic_GetActivate()) { return MIC_NULL_SAMPLE_VALUE; } return Mic_DefaultBufferRead(); } static void Mic_DefaultBufferWrite(u8 theSample) { if (micSampleBuffer == NULL || Mic_IsBufferFull()) { return; } *micWritePosition = theSample; micWritePosition++; micBufferFillCount++; // Move the pointer back to start if we reach the end of the memory block. if (micWritePosition >= (micSampleBuffer + MIC_BUFFER_SIZE)) { micWritePosition = micSampleBuffer; } } static u8 Mic_GenerateInternalNoiseSample(void) { const u8 noiseSample[NUM_INTERNAL_NOISE_SAMPLES] = { 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFF, 0xF4, 0xE1, 0xBF, 0x9A, 0x71, 0x58, 0x5B, 0x5F, 0x62, 0xC2, 0x25, 0x05, 0x01, 0x01, 0x01, 0x01 }; static unsigned int i = 0; if (++i >= NUM_INTERNAL_NOISE_SAMPLES) { i = 0; } return noiseSample[i]; } static u8 Mic_GenerateWhiteNoiseSample(void) { return (u8)(rand() & 0xFF); } static u8 Mic_GenerateNullSample(void) { return MIC_NULL_SAMPLE_VALUE; } void Mic_DoNoise(BOOL noise) { u8 (*generator) (void) = NULL; if (micSampleBuffer == NULL) { return; } if (!noise) { generator = &Mic_GenerateNullSample; } else if (CommonSettings.micMode == TCommonSettings::InternalNoise) { generator = &Mic_GenerateInternalNoiseSample; } else if (CommonSettings.micMode == TCommonSettings::Random) { generator = &Mic_GenerateWhiteNoiseSample; } if (generator == NULL) { return; } while (micBufferFillCount < MIC_MAX_BUFFER_SAMPLES) { Mic_DefaultBufferWrite(generator()); } } void mic_savestate(EMUFILE* os) { write32le(-1,os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return TRUE; } #endif desmume-0.9.11/src/driver.cpp0000755000000000000000000000225512467662066014553 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "driver.h" #include "debug.h" #include "rasterize.h" #include "gfx3d.h" #include "texcache.h" static VIEW3D_Driver nullView3d; BaseDriver::BaseDriver() : view3d(NULL) { VIEW3D_Shutdown(); } void BaseDriver::VIEW3D_Shutdown() { if(view3d != &nullView3d) delete view3d; view3d = &nullView3d; } void BaseDriver::VIEW3D_Init() { VIEW3D_Shutdown(); } BaseDriver::~BaseDriver() { } void BaseDriver::USR_InfoMessage(const char *message) { LOG("%s\n", message); } desmume-0.9.11/src/GPU_osd_stub.cpp0000755000000000000000000000170412467662066015613 0ustar rootroot/* Copyright (C) 2010 DeSmumE team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "types.h" #include "GPU_osd.h" OSDCLASS *osd; OSDCLASS::OSDCLASS(u8 core) {} OSDCLASS::~OSDCLASS() {} void OSDCLASS::update() {} void OSDCLASS::clear() {} void OSDCLASS::setLineColor(u8 r, u8 b, u8 g) {} void OSDCLASS::addLine(const char *fmt, ...) {} void DrawHUD() {} desmume-0.9.11/src/cocoa/0000755000000000000000000000000012467662066013631 5ustar rootrootdesmume-0.9.11/src/cocoa/AppIcon_ROMSave.icns0000755000000000000000000023573612467662066017417 0ustar rootrooticns;Ŝis32E !!9^’‘––——›œĦ•–eC'|˙íÊĊÒˤ­£ċ˙Š0)}˙òòíñÊĵ½Ö˙Œ5&y˙óŝ€ûŭŭ˙ö˙‰3$x˙öóôôñïñçí5"w˙ñùġööĝ÷òŬŬz4!v˙ñĝġööġêßÍÎs5u˙ñĝġöôêÜÑżl5t˙ñĝġóçÚÍÁ°­e4t˙ïĝñċĜÍÀ´¤ ^4q˙ôöĉÚÍĵ£’V3u˙âßÏÄ· ³İ›ˆQ2 \ŭŝ€˙'ŝÎĈÖĊä(1(Wzqvtrd_g^gI/=,&'&& +0-1.76!"!9]•€”:˜› “”dC'|˙îÌÈĜÑŞ°§ĉ˙‹0+tëáçáÏĠ­ŻħĊó€7-T“‘š——Ħ–\;+V—€’’Š‹‰‹Z<*T•Ž’‘’“ƒT;(S–’€‘ZŠƒzwP;'R–’‘‘Š‚{rnL:%Q–‘‘ˆ€xqhcG9#R—’އyrjb\C9$M–‘‘ˆ€yne_VO>7!V›‡†|unoj`[T<6!Xù˙ŝÉÁÓÁà~(1)Y|swvse`h_iJ/=+%€& +/-1.76f!# 9\”’”™ž‘bC'|˙ïÍâÙ³´Ğç˙‹0-gÈÉĜ̤­ƒž­o:8$ F6%!F4"€ E3!€ D2 € C/„A.  ?-€€=+&‚   ;"SïúùÂşÌğÚ{)0*\vzxugbi`jJ/<*$€%*.,0-66s8mk>[TWVVVWWWWXU[DÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÇ˙òùö÷÷÷÷÷öùó˙ĠÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÜË˙ù˙ŭŝŝŝŝŝŭ˙ú˙ÚÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ù˙ŭŝŝŝŝŝŭ˙ú˙ÚÊ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÈ˙ñùö÷÷÷÷÷öĝó˙Ġ”˙÷˙ŝ˙˙˙˙˙ŝ˙û˙Ĝil32 #"%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpllklopszjmvroql?>J J=Z˙ŭ‰˙Uüö˙˙üŝ˙ú˙w8W H7\˙ġù÷š€˜w‚Ĥš…ysvİ}m³˙ùò˙z3U G7[˙ü˙˙äĜÛÜÜâÖÜҞaÒG£Vç˙÷˙z4U G6[˙û˙ŝ˙ŝ€˙;úîÀıĉÙÇê˙÷˙|4V F7Vûôùĝöôġġñòññô÷˙˙ùŭ˙üúñ˙|4V D6Uúó÷ö÷ĝ÷÷ĝ÷ġîóóïòĝë÷y5U C5Uúó÷ƒöġġöö÷ùùĝĝùöòäïv6U B3Túó÷ˆöġôîêŬçs6T B3Túó÷‹öôîçäÖàp6T A2Súó÷ŠöôíĉàÜÏĜl6S?0Sûó÷‰öóìĉßĜĠÇj5Q>/Rûó÷ˆöòëċßĜÑÍÀÈf6Q>/Rûó÷‡öñêäŜ×ÑÉĈşÀc6P=.Rûó÷…öġéŬÖÉÂż²¸`5O<-Qûó÷„öġïèâÜĠÏÈÂğ·Ğ°]5N;,Pûó÷ƒöġîçáÛÔÎÇÁğ´Ż¤¨Z4L:+Pûó÷‚öôíçáÚÓÍÇÀş³Ĵ¨ W5L:*Pûó÷öóìĉßÙÓÌĈÀı²Ĵ –™S4K9*Pûó÷€öòëċßĜÒÌĊż¸²Ğž™’Q4I9*Oûó÷ġöñéŬÖÉÂğµ¨Ħ›”…†L3H8)PüòĝöñëċŜĜÒËĊÀ½µŻŞĦ–‘ˆ‰K3G8)LúôôíċßĜÑÊĵĥĴŸ›“Šˆ~vrggD3F9'Pŝôûôñí êĉâßÜ×ĜĜ××ÉÌÉĊW.F5.:ë˙úŝŭŝŝ€˙ü˙蜽°ıÛ°ÄÜËêx#I 45$K˙ŝƒ˙ŭ˙êİğ­ĦÙĴœ·§Çu!H8/9";ZSVUVWW\jbej_figie54? 5/27.%(&''€&$" %"!##%86?);/02†6,4;8:;9:; 53;-887†5753€4€5€6:99"%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7cropqmjplkklopszjmvroqk?>J J=Z˙ŭ‰˙Süġ˙˙üŝ˙ú˙w8W H7\˙ġúĝ›šx™„xruŞn´˙úó˙z3U G7[˙ü˙˙âĠĜÙŜċĜßĠĦaÎE Tĉ˙÷˙z4U G6Yŝùƒ˙:úúŭüóşÂêßÍí˙ö˙x5U C7>’‹‘‹‡„z}J“’‰‘‹‡ƒ}vxI“’ˆ‘Š‡ƒ{xrtGJ J=Z˙ŭ‰˙Süġ˙˙üŝ˙ù˙w8W H7\ŝġûúƒœz£—ƒvpu­pµ˙úó˙y3U G7[˙ü˙ŭŜÒĠàçÜâÚĤ`ÊA›Q˙÷˙z4V F7Vġ÷ƒ˙9ïìïîċÒ²ÏïçÔ˙ôŝt6U @C& +9GPhY&}aUQ<*!FN ?B"ƒ‚…GN >A# ƒ € GM =?" GM ! EL :=  EK 9;  EJ 9;  DJ 8: CI 79 BH 68 AG 57 AF 57 @F 46 >E 46 =D 34 ˆ  ÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙ú˙ÌĈòġÔĠƒŸ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûú˙ĈÙ˙˙ÜȊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙ç%6;IIGHFK@WP‚ @F@A@A@E?9b˙÷˙ŝ˙ŝ•˙û˙ĈïñÊʂ;h[8!¤˙Q!€c!şÊ”ĵ˙ü†˙ŭ˙è&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝ‹˙ŝ˙˙€ŝ˙˙€ŝ˙ŝ˙ŝ˙˙€ŝ˙!ŝ˙îğğż³°QeRQRY°í˙˙´eZNSlžĉ˙Ŭ­ĵ˙ü†˙ŭ˙ç%6;IHGHGK@WO‚ @F@BAA@D=:a˙÷˙ŝş˙ŭú…˙ŝü‹˙ŭ˙é'5;IHGHGK@VP‚ @F@ ?D=:a˙÷˙ŝĞ˙ŝ€ŭüŝüĝùġôġġĝùŝ˙˙ùġ€ôġĝŭ˙üùúˆ˙ŭ˙ç&6;IHGGFJ@WP‚ ?FAA@A@D=:`˙óŝüŭ€ŝ’˙ŭŽĝƒùúüü„˙ŝŒ˙€ŝŭ üûúĝò90=HH€GK@VP‚ >EABBA?E=9Z˙îĝôġġ€ö÷÷€ĝùùúúü‚ŭŝŝ‚˙ûö•ġôôġû€˙ŭŝŝŭüûú€ùĝ€÷€ö ġöġôòíï;/=HH€GJ@WP‚ >E>@@A?D=7N˙ïùġ„öˆġöö€÷€ĝù›ö€ĝ÷÷€ö‰ġ…öôòñìë80?@A>C<7O˙ïùġÎö ġóñïîëëèç80=HH€GK@WP‚ >D?==?@D<6O˙ïùġÍöôòñîíêêëĉċ80>€? =B;7O˙ïùġËöóóñïíêêéĉĉâà70@>B;6O˙ïùġÊöôòîìêêèĉääßà70=<==B;7O˙ïùġÉöóñïîìêêèĉäáßß60?>><@93O˙ïùġö&ġòñïîëêêèĉâààßÜÛÙ×ĠÔÓÒÍÍ40:HHGGEI?VP‚ 8A<;:;;@93O˙ïùġ½öġòñïí€êçĉäâáàŜÜÚĜÖÔÔÓÑËË40:GGFHFJ?WP‚ 9A<=<;9?93O˙ïùġĵöôòñïìëêéçċáàßŜŬÚĜրÔÏÍÉÈ30:FGDFGI?WP‚8@;€< :?82O˙ïùġğö ôòïìëêéĉää€àŜÜÚÙÖÔÔÒÎÌÌÇÈ30:GGFECI?VP‚7A:9;<;@82O˙ïùġşö óòïìêêéĉċáàßŬÛÚĜÖÔÔÒÑÏÌËÉĈÇ30:G€FDH>UQ‚ 7@;;€9?82O˙ïùġıö+óòïîìêêèĉäâààßŬÜÙĜĠÔÔÑÏÎÌÊÈÉĈĊ319GGEEDG>UP‚ 7?9<<;9>82O˙ïùġ·ö"ġóñïîëêêçĉäááàßÜÛÙĜĠÔÔÑÏÎËÊÈÈÇÂÂ209€FEEH>UP‚ 8?99;<;>71O˙ïùġĥö.ġòñîíëêêèċäâààßŬÛĜ×ĠÔÔÑÏÍÌÉÉÇÇĊÁÁ209GEEFEI>UO‚6?:9899>71O˙ïùġµö&ġóòïíêêéèċäâààŜÜÚĜ×ÔÔÓÑÎÌÉÈÈĈż208GF€CG>UM‚5?9:9:7=72O˙ïùġ´öôòîíëêêçääáààŜÜÛĜÖÔÔÓÌ̀ÈĈÁÁ½118GFEECF=UO‚6>89:;9=61O˙ïùġ³ö1ôñïíêêéĉääáàßŬÜÙĜÖÔÔÒÑÎÌËÈÈÇĊÂżżĵĵ118GFEEDG=TO‚7>788:9=61O˙ïùġ²ö2ôòîìêêéĉäáààŬÛÚĜÖÔÓÒÎÌËÈÈÇĊÂżżşı107FFDDCG=TN‚7>89786=52O˙ïùġħö óòîëêêèĉä€à%ŬÛÙ×ĠÔÔÒÍËÊÈÈÇÄÁżĵ¸ı107FFDEDG=TN‚6>89897<50O˙ïùġŻö5ġóòîìêêèĉċààßÜÛÙ×ĠÔÓÑÎÌÊÈÈĈÄÁż½ğşĥĥ107FFEFCG=TN‚5>€8 98<50P˙ïùġöġóñïíëêêçċäâààßŬÛÙĜ€Ô ÒÏÍÌÊÈÈĈÄÂÁ€ğı·´´007GFDECG=TN‚6>€8 97<50O˙ïùġ­öġòòïíëêêĉċäáààßÜÚĜ׀ÔÑÏÍËÉÈÈĈÄÀĵşı·ĥħ²006€FEBG=SN‚4>99898<51O˙ïùġĴö8ôóñîíëêêçċäáààŜŬÚĜÖÔÔÓÏÍÌÉÈÈĊÂÀĵş¸ĥµ´ħ²/06EEDFEH=TN‚4=89::7<50O˙ïùġĞö9óòîíêêéçċäáààŬÜÚĜÖÔÔÓÏÍËÈÈÇĈÂÀĵş¸ĥ´³³°°/16EDBDCG=TN‚4=767:7<5/P˙ïùġŞöôòñíìêêéĉääààßŬÜÙ×ĠĠÔÒÎÌËÈÈÇĊÁ€ğşıĥ´²ħħ­­.16EEDCAF=SN‚4=87686<5/P˙ïùġİöóñïîìêêéĉċààßŬÜĜĜĠÔÔÑÎÌËÈÈÇĊÁ€ĵı¸ĥµ²ħŻŻĞĞ/05E€DBF@@C9QJ‚0:5454481,P˙ïùġ•öOġòñïíëêêçċäáàßßÜÚĜ×ÔÔÓÑÏÍËÉÈÇĈÂÀ½ş¸·µ²²ħŻ­ĴިĤĤ£Ħž›š™—•”‘Œ)11B@?>?C8QJ‚0:45€482+P˙ïùġ”öPġóñïíëêéçċäáàßŬÜÚĜ×ĠÔÓÏÍÌÉÈÈĊÄÂÀ½½ş¸·µ²²ħŻĞݨĤ¤˘ žœ›š™—•“‘ŽŠ‹*10A@AA>A8PJ‚/:5443482+P˙ïùġ“öQôòîìêêéçċäáààŜÛÙĜ×ÔÔÓÏÍËÉÈÈĊÂÀĵş¸·µ²²ħĞݧĤ¤£ žœšš™–”“‘Œˆ‰)10@?>@?C8OI‚.95 382+P˙ïùġ’öRôòïíìêêéĉäáààŬÜÙĜÖÔÔÒÎÌÊÈÈÇĊÄÂżğş¸ĥµ²²ħĴŞİ§Ĥ£ĦŸžœ›š™–”“Œ‹Š†‡)10A?>>=B8PI‚/93455482+P˙ïùġö ġóñïíìêééĉċâààßŬÛÙĜĠÔÔÒÎÌÊÈÈÇÄÁ€0ĵş·ĥ³²²ħ­ĞݧĤĤ£ĦŸž›š™—–•’‹ˆ‡ƒ†)0/A@??<@7OJ‚093325482+P˙ïùġöUġòòïìêêèĉċâààßŬÛÙĜĠÔÔÒÏËÊÈÈÇÄÂÂż½ğı·µ³²²°ĴШĤĤ˘ĦŸ›šš˜•”’ŒŠˆ‡…ƒ„(1/@??@>A7NH‚/93432171+P˙ïùġŽöVġóñïíëêéèċċâààßÜÚĜ×ĠÔÔÑÍÌÊÈÈĈÄÁ½ğı·ĥ³²²°ĴŞİĤĤ¤˘ĦŸž›šš—•”’ŽŒŠˆ†„…‚‚(1/@><>>B7NI‚083€4 371*P˙ïùġöġòñïíëêêèċäâààŜÜÚÙ׀ÔAÑÏÍÌÉÈÇĊÂÀĵ𸷵³²ħ°­ĴݨĤĤ˘ĦŸšš™—•”‘Œ‰‡†„„ƒ'1/@?==;?7OH‚083424371*P˙ïùġŒöġòñïíëêéèċáàßŜÜÚ×׀Ô8ÑÏÍÌÉÈÈĈÂÀ½ş¸·µ³²ħĞŞ§ĤĤ¤˘ žœšš˜—•“‘ŒŠˆ†„„ƒ}}'1.@€>A6MH‚/83255371*P˙ïùġŠöZôòîíêêéĉċáààŬÛÙ×ÖÔÔÓÏÍÊÉÈÇĊÂÂżĵş¸ĥ´²²ħ­ĞިĤĤ¤˘ žœšš™–”“‹‰ˆ…„„‚€}y{'1/@=;<<@6MI‚.73213371*P˙ïùġ‰öóòîìêêéĉäáààÜÛÙĜÖÔÔÓÑÏÌËÈÈÇÄ€.ĵş¸ĥ´²²ħ­Şİ§Ĥ£  ›šš˜•”“‹ˆˆ…„„‚€~|zvy'1-@€=:=5MH‚07€3 1071*P˙ïùġ‡ö]ġóòíìêêéĉċààßŬÛÙĜĠÔÔÒÎÌÊÈÈÇÄÂÁ½ğı·ĥ´²²°­ŞİĤĤ£˘ž›šš—•”’Œ‹ˆ‡…„„}{yywx&1-@=<=><:=<;;:?5LG‚ 173260( P˙îĝôġYóñïíëééçċáßŜÜÛÙ×ĠÓÑÑÏÌËÉÇĊÄÄÁż½ğşı·ĥ³ħŻ­Ĵݨ£Ħ  š™—•”“‘Ž‹‰‰ˆ…ƒ~||ywusrponligeebf%/,>€<:=4KG‚ 173212160(P˙ñû÷€ĝ ÷ġôòñïîíëê€èċċââ€ß'ŬÜÚÙĜÖÖĠÓÒÑÏÎÎÍËÉÈÇĊĊÄÁż½ĵğşş¸ĥµ´³³ħ°Ż€Ğ$ݧ¤˘˘£ĦŸž›šš™—–”“’‘‘ˆ#1+=<<=<=4KG‚ 063323260) S˙ĝ˙ŝÒ˙ŝ˙ŭ˙ċ$1,=;9;;?4KG‚ 253232260( O˙ĝ˙ŝƒ˙•ŝŽŭüö€ñ÷ŝ÷òòñġüö€ü öùŭüûôòòñû€˙€ŭûŝüŭ€ŝù˙á),=<;:8<4JG‚ 253233260) T˙ġ˙ŭħ˙ŝŝ„˙ŝƒ˙ŝ‚˙úùùŭüü˙úŝüùùŝŭ˙(,;€<9=3IF‚ 253 252#"#ĉ˙ü˙ŝİ˙ ŝ˙óxNURħ˙ĥ[eV˜ĝxŜ˙˙‰½˙û÷]]eï˙ŝ˙ŝ˙ŝŝ˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝĤ˙<ŝ˙ü˙&Šİ~,ß.d„…Ż_˙ʝ˙˙y„q›˙ŽYaŜž¨˙wĠıUcÂ˙˙ä(+<;998;3IF‚ 46323225458 ,íŝü˙ŝ§˙:ŭ˙ç4n‘}<ÏAú˙H‘Yíp­˙˙½IiZ}˙“i3^İ9ä#Ŝ hJ>˙üĉ(+<;::9;2IF‚,67334328+76 1ïŝü˙ŭ¤ŝ<ŭ˙û˙ċi?Àġ%İ°&\v+]YŠ˙÷îzx ħ7[C0˙B$òed‰˙˙ċ(*:99<:<2HF‚.$2423256.56 .ë˙û˙ŝ˙:ŭ˙ép˙q¤˙•5D1uènç>ğĤ˙˙Ĵ0RAûhCO˙¨?ä˙B=~˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöĤ÷ù˙íñ˙÷ĝŝ˙ û˙ù˙ûüüö÷ŭ˙û€˙ŝ÷ü˙ĝĝŝ˙ŝ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qt”st sttvstwttw€x wuvtxuuvttux€wvx€wtvxuuwwxu}L97#>8898;2IG‚!E/4)8033223166,9;!—‹€€ €;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799:99†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙ú˙ÍÇôöĠ׃Ÿ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûû˙ÇÙ˙˙ÜɊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙÷˙ŝ˙ŝ“˙ŝ˙ú˙ĈÄïñË˂;h[8!¤˙Q!€c!şÊ”ĵ˙ü†˙ŭ˙è&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝŠ˙ƒŝ˙€ŝ˙˙€ŝ˙!ŝ˙ïÂĥñ²SfSQRY°ìŝ˙´eYNRkžĉ˙ŬĴğ˙ü†˙ŭ˙è&5;IHGHGK@WO‚ @F@BAA@D=:a˙ô˙û€üŭŝŝ“˙ŭŽüŝ˙ŝŝ…˙ŭú…˙ŝŭƒ˙ŝŝŭŭ€üŭú˙ĉ'5;IHGHGK@VP‚ @F@ ?D=9a˙÷˙ŝ„˙ŭ‡üŭŭŝƒ˙ŭ˜˙ ùòööùĝŭ˙ŝ÷òóġúŝùöĝüŝ†˙ŭ˙é'5;IHGGFJ@WP‚ ?FAA@A@D>8OÊÀÎßċäçìġùŝ‹˙ ŝüüŭû˙Ğ­Ğ‹Ĵ­­°µï˙ŝ˙üĝôìèääàÒÌĸ-3;IH€GK@VP‚/ >EABBA?D>6?”†Œ‰ŠŠŽ’—›ŸŞĴ­´ğÉĠċĉêîóĝü˙˙ŝ˙Ġ”Š*‰‰ˆ”Ù˙ŝŝĝġñíéċâä×ÌÇÁğµĞ­¤žš—“‹ŠŠ‰‡……'4;IH€GJ@WP‚ >E>@@A?D>56Ÿ–“””“’Ž‹†Š Œ‘•š¤­Ğ³²Ž‘••” •Ş­Ş œ˜”ŒˆŠŒŽ‘“””“‘ŽŒ&4;IHFGFI@WP‚ ?E@?=@@D?56›‹’€‘‘’’‡”“’‘ŽŒ€Š‹“‘— ’“‹Š‹Ž‘’“ˆ”“’’‘‘ŽŒ‹‹‰ˆ&4;IHGHGK@WP‚ =D?A@?=C>66œŒ“‚‘‹‘’’“”™‘€”’’‘‘Œ‘ŽŒŒŠ‰&4;IHGHGK@XP‚ =D>?@A>C>56œŒ“’‘ƒ›‘‚‘ ŽŒŠŠ‰‡&4;IH€GK@WP‚ >D?==?@C=46œŒ“Í‘ŽŽŒ‹‹ŠŠ‡†&4;IHGHGJ@VP‚ >€? =B=46œŒ“Ë‘ŽŒ‹ŠŠ‰‡‡…ƒ%4;IHFHFK@WQ‚;C==>@>B<46œŒ“Ê‘ŽŒ‹ŠŠ‰‡‡†„ƒ%4:IHGHGJ@VP‚ =<==B<46œŒ“É‘ŽŒ‹ŠŠ‰‡†…„ƒƒ%4:IHFGFJ@WP‚ ?>>=@;06›Œ“‘ŽŽŒ‹‹ŠŠˆ‡†…„„ƒ~~}|{yx$49I€GEI?VP‚ 8A<;:;;@;06›Œ“½‘ŽŽ‹€Šˆ‡†…„„‚€~}}|{zxw$48HGFHFJ?WP‚ 9A<=<;9?:06›Œ“ĵ‘ŽŒ‹‹Š‰ˆ‡……„„ƒ‚€~€}zzywv#48GGDFGI?WP‚8@;€< :?:/6›Œ“ğ‘ ŽŒ‹ŠŠ‰‡††€„‚€~}}|zyxxvu#48GFFECI?VP‚7A:9;<;@:/6›Œ“ş‘*ŽŒ‹ŠŠ‰‡††„„ƒ‚€~}}|{yxwvut#58GFEFDH>UQ‚ 7@;;€9?:/6›Œ“ı‘+ŽŒ‹ŠŠ‰‡†…„„ƒ€~}}{zyxwvvus#58HFEEDG>UP‚ 7?9<<;9=9/6›Œ“·‘-ŽŒ‹ŠŠˆ‡†…„„ƒ€€~}}{zyxwvvusr#48GFFEEH>UP‚ 8?99;<;>9.6›Œ“ĥ‘.ŽŒ‹ŠŠˆ‡†…„„ƒ‚€€~~}}{zyxwvuusrq#47GEEFEI>UO‚6?:9899>9/6›Œ“µ‘&Ž‹ŠŠ‰ˆ‡†…„„ƒ€~}}|zzyxwvvusrqo"48HE€CG>UM‚5?9:9:7=8/6›Œ“´‘ŽŒ‹‹ŠŠˆ††…„„ƒ€~}}|zzxx€v tsrrpo"48H€ECF=UO‚6>89:;9=8.6›Œ“³‘'ŽŒ‹ŠŠ‰‡††…„„‚€~}}|{yxwvvutsrqpon"47H€EDG=TO‚7>788:9=8.6›Œ“²‘2ŽŒ‹ŠŠ‰‡††…„„‚€~}}|zyxwvvusrrqppml"46GEDDCG=TN‚7>89786<7.6›Œ“ħ‘ ŽŒ‹ŠŠˆ‡††€„%€~~}}|zyxwvvussqqppnll"56GEDEDG=TN‚6>89897;7.6›Œ“Ż‘ ŽŒ‹ŠŠˆ‡†…€„&€€~~}}{zyxwvvusrqqponmkk"56GEEFCG=TN‚5>€8 98<7-6›Œ“‘ Ž‹‹ŠŠˆ‡†…„„ƒ‚€€~}}{zyxwvutsrq€pnllji!46HEDECG=TN‚6>€8 97<7-6›Œ“­‘ŽŽŒ‹ŠŠ‡‡†…„„ƒ€~€}!zyywwvvtsrqppommlkih!45GEFEBG=SN‚4>99898<7-6›Œ“Ĵ‘8ŒŒ‹ŠŠˆ‡†…„„‚€~}}|zyyxwvvtsrqppomlljjhh!55FEDFEH=TN‚4=89::7<7,6›Œ“Ğ‘ŽŒ‹ŠŠ‰ˆ††…„„‚€~}}|zyxx€vtsrqppomlkjiihg!45FDBDCG=TN‚4=767:8<7,6›Œ“Ş‘ŽŒ‹ŠŠ‰‡††„„ƒ€~}}|zyxwvvutsq€pnmlkjiihfe!45FEDCAF=SN‚4=87686;7,6›Œ“İ‘ŽŒ‹ŠŠ‰‡†…„„ƒ‚€~}}{zyxwvvutrq€pnmlkjiigfed!44E€DBF@@C9QJ‚0:5454483)7›“•‘ŽŽ‹€Š ˆ‡†…„„ƒ€€}9zzxxwvutrrqppomllkiihgfedcbba_^]\\[ZYXWVUUTR41C@?>?C8QJ‚0:45€483(7›“”‘PŒŒ‹Š‰ˆ‡†…„„‚€~}}|zzyxwvvtsrqppomlljiihgfedcbaa_^]\[[ZYXVVUUSQQ40B@AA>A8PJ‚/:5443483'7›““‘QŽŒ‹ŠŠ‰ˆ††…„„‚€~}}|zyywwvvtsrqppomlkjiihffecbba`_^]\[[ZYWVVUTSRPP4/A?>@?C8OI‚.95 383'7›“’‘<ŽŒ‹ŠŠ‰‡††…„„‚€~}}|{yxwvvutsrqppnmlkjiihfeddcba`_^]\[[ZXWV€URRQOO40B?>>=B8PI‚/93455483'7›“‘‘ŽŒ‹Š‰‰‡†…„„ƒ‚€~}}|zyxw€vsrr€p0omlkjiihgedccbb`_^]\[ZYXWVUUTRQPONN4/B@??<@7OJ‚093325483'7›“‘UŽŽŒ‹ŠŠ‰‡†…„„ƒ‚€~}}{zyxwvvusrrqppnmlkjiigfedcbba_^^]\[[YXWVUUTSQPONMM4/@??@>A7NH‚/93432172(7›“Ž‘VŽ‹‹Š‰ˆ‡†…„„ƒ‚€~~}}{zyxwvvusrqppomllkjiigfedcbba_^]]\[[YXWVUUSRQPONNML4/@><>>B7NI‚083€4 362'7›“‘ŽŽŒ‹ŠŠˆ‡†…„„ƒ‚€~€}A{yyxwvutsrqpponlljjihgfedcbba_^]][[ZYXWVUUTRQPONNMKK4.A?==;?7OH‚083424372'7›“Œ‘ŽŒ‹Š‰ˆ‡†…„„ƒ€~€}zyyxwvvtsrqpponlkj€i#ffedcbb`_^]\[[ZXWWVUUSRQPONNMKJI4.A€>A6MH‚/83255372'7›“Š‘ZŽŒ‹ŠŠ‰ˆ†……„„‚€~}}|zyxwwvusrrqppnmlkjiihfeddcbb`_^]\[[ZXWVUUTRRQPONNMKJIHH4.@=;<<@6MI‚.73213372'7›“‰‘ ŽŒ‹ŠŠ‰‡†…€„€~}}|{yxwvvussr€p.nmlkjiihfeddbba_^^]\[[YXWVUUTSQPPONNLKJIHFG4-@€=:=5MH‚07€3 2061'7›“‡‘ ŽŒ‹ŠŠ‰‡†…„„ƒ€~}}{zyxwvvusrq€p9nllkjiihfedccba`^]]\[[YXWVUUTRQQOONNLKJIHGGF4,@=<=>?4,><:==<<;:87665453,?€<:=4KG‚ 173212161&=¸§ĞĴ Şİݨ§§Ĥ¤¤€£Ħ ŸŸž€ œšš™˜˜—–••€”“‘‘€ŽŒŠ‰‰ˆ‡‡†…„„ƒ„‚€€$~|{zyyzywwvvuutsrqpqppg3+=<<=<=4KG‚ 063323260( S˙ĝ˙ŝÒ˙ŝ˙ŭ˙ä"1,=;9;;?4KG‚ 253232260( N˙öŝûüšûúô€ïöüġïóúôúúûġ÷ûúúò€ù€ŭûüüùŭûü€ŭ÷˙ß),=<;:8<4JG‚ 253233260) T˙ö˙ŝÇ˙ûúúŝŭü˙ûŝüúùŝŭ˙ä(,;€<9=3IF‚ 253 252#"#ĉ˙ü˙ŭŽ˙—ŝ!˙ŭ˙òxNTRħ˙ĥ[dU˜ĝwŜ˙˙‰½˙ú÷]]dî˙ŝ˙ŝ˙ŝŝ˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝĤ˙<ŝ˙ü˙&Šİ~,ß.d„…Ż_˙ʝ˙˙y„q›˙ŽYaŜž¨˙wĠıUcÂ˙˙ä(+<;998;3IF‚ 46323225458 ,íŝü˙ŝ§˙:ŭ˙ç4n‘}<ÏAú˙H‘Yíp­˙˙½IiZ}˙“i3^İ9ä#Ŝ hJ>˙üĉ(+<;::9;2IF‚,67334328+76 1ïŝü˙ŭ¤ŝ<ŭ˙û˙ċi?Àġ%İ°&\v+]YŠ˙÷îzx ħ7[C0˙B$òed‰˙˙ċ(*:99<:<2HF‚.$2423256.56 .ë˙û˙ŝ˙:ŭ˙ép˙q¤˙•5D1uènç>ğĤ˙˙Ĵ0RAûhCO˙¨?ä˙B=~˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöĤ÷ù˙íñ˙÷ĝŝ˙ û˙ù˙ûüüö÷ŭ˙û€˙ŝ÷ü˙ĝĝŝ˙ŝ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qt”st sttvstwttw€x wuvtxuuvttux€wvx€wtvxuuwwxu}L97#>8898;2IG‚!E/4)8033223166,9;!—‹€€ €;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799:99†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙û˙ÎÉġ÷×ĜƒŸ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûû˙ÉÚ˙˙Ŭˊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙ö˙ŭƒŝŠ˙ŝ…˙ŝŝ˙ŝ˙ŝ˙ŝƒ˙ŝ˙ú˙ÈĊïñÌ́;h[8!¤˙Q!€c !şÊ”ĵ˙ü˙„ŝ˙ü˙ç&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝ„˙„ŝŭ‚ŝ˙˙ŝŝŭ˙!ŝ˙ñÂÂĊşó²UhTPRYŻìŝ˙³dYMRkċ˙ÜĴğ˙û†˙ŭ˙è&5;IHGHGK@WO‚ @F@BAA@D=:`˙ñû÷ĝĝùúüŭŝ˙ŝ˙úŽĝûŝŭŭ˙ûŭ…˙ŝûŒ˙ŝŭüûù€ĝùöüâ&5;IHGHGK@VP‚ @F@ ?D=:a˙÷˙ŝ„˙ú†ĝùúûŭŝ‚˙úŝ•˙ ŝ˙úîĝùúĝüŝûôîïñöúġòôĝŭ†˙ŭ˙ë)5;IHGGFJ@WP‚ ?FAA@A@C?5!7nyеÁżÈÓŬçòŭ‹˙ ŭ÷ĝùö˙=C?Œ@A@BBP×˙ûŭüŽ˙ùïĉŬÔËÁÁ·–Š|g7:JH€GK@VP‚ >EABBA?D@2&ƒ!;ACScuƒžÂ½ÄÏÙäîù˙˙ü˙–¨˙ŭŝéßÖÍĽÀ£Š€qbTF>B. ƒ :8KH€GJ@WP‚ >E>@@A?C@0% ‹  -A?PM” :B:!ށ :8JHFGFI@WP‚ ?E@?=@@DA1&„†…—„ˆ„ :8KHGHGK@WP‚ =D?A@?=B@2&€—‘‚ :8KHGHGK@XP‚ =D>?@A>B@0&†‰†™…‹† :8KH€GK@WP‚ >D?==>@B@0&•ƒ›‚— :8KHGHGJ@VP‚ >€?=A>/&Ĝ :8KHFHFK@WQ‚;C==>@>A>0&Ĝ ;8JHGHGJ@VP‚ =<==A>0&Ĝ ;8JHFGFJ@WP‚ ?>>/&Ĝ ;8JHGHFK@WP‚ ;B<==?=@=/&Ĝ :8KH€GJ@WP‚;B;<<==A=/&Ĝ :7KHHGFJ@WP‚ :B<=<<;@=/&Ĝ :7JHHIGK@VP‚:B<;?=.%Ĝ :7IGEEFJ@VP‚:C<==<=?=,%Ĝ :7J€GEI?VP‚ 8A<;:;;?=,%Ĝ :6JFFHFJ?WP‚ 9A<=<;9><,%Ĝ :6HFDFGI?WP‚8@;€<:>;,%Ĝ :6IFFECI?VP‚7A:9;<;?<+%Ĝ :6IFEFDH>UQ‚ 7@;;€9><+%Ĝ :5HFEEDG>UP‚ 7?9<<;9=;+%Ĝ :5HFFEEH>UP‚ 8?99;<;=;*$Ĝ :6HEEFEI>UO‚6?:9899=:+$Ĝ :6IE€CG>UM‚5?9:9:7<:*$Ĝ :5I€ECF=UO‚6>89:;9<:*$Ĝ :5I€EDG=TO‚7>788:9<:*$Ĝ :4HEDDCG=TN‚7>89786;9+$Ĝ :4HEDEDG=TN‚6>89897;9*$Ĝ :4HEEFCG=TN‚5>€898;9)$Ĝ :4HEDECG=TN‚6>€897;9)$Ĝ 93HEFEBG=SN‚4>99898;9)$Ĝ :3GEDFEH=TN‚4=89::7;9)$Ĝ 93GDBDCG=TN‚4=767:8;9($Ĝ 93GDDCAF=SN‚4=87686:9($Ĝ 92F€DBF@@C9QJ‚0:5454475%#Ĝ 9/D@?>?C8QJ‚0:45€475$#Ĝ 8.C@AA>A8PJ‚/:5443475$#Ĝ 8.B?>@?C8OI‚.95375$#Ĝ 8.C?>>=B8PI‚/93455475$#Ĝ 8-C€?<@7OJ‚093325485$#Ĝ 8-A??@>A7NH‚/93432174$#Ĝ 8-A><>>B7NI‚083€4364##Ĝ 8,B>==;?7OH‚083424364##Ĝ 8,B€>A6MH‚/83255364##Ĝ 8,A=;<<@6MI‚.73213364""Ĝ 7+A<==:=5MH‚07€32063#"Ĝ 7*A=<=>A@‚?@‚?@?€@??€@?‹@?B85*=<<=<=4KG‚ 063323260( S˙ĝ˙ŝÒ˙ŝ˙ŭ˙ċ#1,=;9;;?4KG‚ 253232260( M˙òú÷­ĝñ€íóúóîîíñĝñ÷ĝĝòġùĝ÷€î÷€ûùúú÷ûùú€ûġŝŬ*+=<;:8<4JG‚ 253233260) T˙ö˙ŝÇ˙üûûŝŭŭ˙üŝŭûú˙ŭ˙ä(,;€<9=3IF‚ 253 252#""ċ˙û˙ŭ¨ŝ!˙ŭ˙òwNTQ°˙ĥ[dU˜÷wŜ˙˙ˆ½˙úö€\\dî˙ŝ˙ŝ˙ŝŝ˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝĤ˙<ŝ˙ü˙&Šİ~,ß.d„…Ż_˙ʝ˙˙y„q›˙ŽYaŜž¨˙wĠıUcÂ˙˙ä(+<;998;3IF‚ 46323225458 ,íŝü˙ŝ§˙:ŭ˙ç4n‘}<ÏAú˙H‘Yíp­˙˙½IiZ}˙“i3^İ9ä#Ŝ hJ>˙üĉ(+<;::9;2IF‚,67334328+76 1ïŝü˙ŭ¤ŝ<ŭ˙û˙ċi?Àġ%İ°&\v+]YŠ˙÷îzx ħ7[C0˙B$òed‰˙˙ċ(*:99<:<2HF‚.$2423256.56 .ë˙û˙ŝ˙:ŭ˙ép˙q¤˙•5D1uènç>ğĤ˙˙Ĵ0RAûhCO˙¨?ä˙B=~˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöĤ÷ù˙íñ˙÷ĝŝ˙ û˙ù˙ûüüö÷ŭ˙û€˙ŝ÷ü˙ĝĝŝ˙ŝ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qt”st sttvstwttw€x wuvtxuuvttux€wvx€wtvxuuwwxu}L97#>8898;2IG‚!E/4)8033223166,9;!—‹€€ €;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799:99†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"·˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûsŽ˙ġ˙úûûûûûûûûûûûûûúûûûûûûûûûûûûûûûûûûûûûûûûûûúúúúúúúúúúúúúúúúúúúúúúúûúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúûúúúûú˙=Ġ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ö˙ˆë˙ŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝŝŝŝŭŝŝŝ˙ŝŝŝŝŝŝŝŝŝŭŭŝŝŝŝŝŝŝŭŭŭŭŝŝŝŝŭŝŝŭŭŭŝŝŝŝŝŝŝŝŝŭŝŝŝŝŭŭŝŭŝŝŭŝŭŝŝŝŝŝŭŭŝŝŝŝŝŭŝŝŝŭŭ˙ĝ˙ !˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙˙ŝ˙˙ŝŝŝŝŝ˙˙ŝ˙ŝŝŝ˙˙ŝŝ˙˙ŝŝ˙ŝŝŝŝŝŝ˙˙˙ŝŝ˙˙˙˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝ˙˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙˙˙ŝ˙˙ŝ˙÷˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙ŝŝ˙ŝ˙ŝ˙ĝ˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŝŝŝŝŭ˙÷˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙ŝŝŭŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŝŭ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝŝŭŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭŝŝŝ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙÷˙¨!ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝŝŭŝŭŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŭŭŝü˙÷˙¨!ñ˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙˙˙ŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§#ò˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŭŭ˙ĝ˙Ĥ#ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙Ĥ#ó˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙Ĥ$ó˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ$ô˙˙ŝŭŭŝŝŭŝŭŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŭŝŝŭ˙÷˙Ĥ!˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ç˙ŭ˙ŝ˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ċ˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙ŭŝŝ˙˙ŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙˙˙ŝ˙˙ŝŝ˙˙ŝ˙˙˙˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝ˙˙ŝ˙˙˙ŝ˙ŝŝ˙˙˙˙ŝ˙ŝŝŝ˙˙˙ŝ˙ŝŝŝ˙ŝ˙ŝ˙˙˙˙˙˙˙ŝŝŭ˙ĝ˙ĤÔ˙û˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙ŭŝŝŝ˙ŝ˙ŝŝŝ˙ŝŝ˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙ĤË˙ú˙ŭŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ˙ù˙ŭŝŝŝŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝ˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝŝ˙˙ŝŝ˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙ŝŝ˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝ˙˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙˜§˙ĝ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙’ƒ˙ĝ˙ŭŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝ˙ŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝŝŝ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙>˙ú˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ˆ Ú˙û˙ŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŭŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙‡˙ĝ˙ŝŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙‡ ïŝŝ˙ŭŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭ˙ŝ˙ŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙‡q˙ġ˙˙ŝŭŭŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙÷˙‡˙ôü˙˙˙˙˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙ŭŝŝ˙˙˙˙ŝŝŝŝ˙ŝŝ˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙ŝŝ˙˙˙ŝ˙ù˙€ŝŝü÷úüŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝüŝñ˙[?Éü˙˙˙˙ŭüüüüüüüüüüüŭüüüŭüüüüüüüŭüüüüüüŭüüüüŭüŭüüüüüüüüüŭŭŭüüüüŭŭŭŭüŭüüüüüüüüüŭüüüüüüüüüüüüüüŭüŭüŭüüüüüüüŭ˙˙ŝ˙ŭ˙Ô9œÓçòü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝóòêܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08w{ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2c˙O˙Q2˙R ˙\ PXX`XX`XX`XXXPPX˙dKakadu-v5.2.1˙ vŽ˙“ÏÁĈR@îötŬj3˨=¸GßíÊkÀÎĝħ9È&ĴVŸ2“&5"‰ëâồnÚñşj%_-Œ'ˆħÄ´ÏÀà‡[˜ö[c›ğB ÑS°3¸—´ĵ/C:O™(‚êH6—“Ĥ<ù.ž+lüœĞ“ö6ËV_gÍ,ÇÚb3]™2ŽÎB9‘uñN## .bŜĥġ}"Í.“EĞRWX…é7ĉÙ)•ğuÏÀüß²È´TIġL° ˘êä˘2uèe-ògwı эvÀY“‡(%EOéÎ?)˘“˙Pğ”•Nf8í7ÀÎ´È îı$O*!…ΈNˆ}‚î+Àŝ”Ċ|S}Œşj(µèÁ‘™•ÒzPfò4 ë/}ħF\Ĉ8IŻK:o"÷,+ĉ­>‹×Ŭ ĥĤƒ ó a(ï›ö>²t›–,?âTĊħ9 ‚›Ħô Píô¨9o(İuícì=úsÜàš<>Çs$‰Ê Qí(‡ÚIê!s:h’ˆúÌôĵiY´.‚4eáŜġG^Zó SI¸”ÉuI€c·×: Ҟaáè$HÔ A9 ħ-üĝĦ4²‚ÙÜNK¤ċˆâĴ‰ĜZ·\"ÇŞÏR:"JŬÂ&†Ö—‰G8=£vÁġCí!ġ€j~ŜFhˆke¨sù°{jhá3,‰ü‰f3ùĦ>îÏ+FÛù¤ˆÑ4$Š}v=Ġ{à­6:iĵˤ‘ƒV Aĵ"Ÿr™Ĵšfí˜Ï[Ĝ}½ ÓU6Q3öĉÈzEÏÇà1€ÄhÈ#ĉu·wşslP‘VPê ÚÒ †ŻĴÑwÛ·ôÂ9[f7} ÑâPîÁ>°@E§ }4Ÿç‡–ˆÇáPÇáMÇçGyËûÂbF˜ĴhnjËÑĞĥħƒċë`UȆLĦ‡NÏç+cʝ—2ÖQPÍtjn­á‹)ö&ĝĉsıclÇ,ħ{·Ç|³˜£¤P@ŽÈğĨŬdĵ‘8÷äB?ù'6eÚjeÊöYËëW ´1ŸĊPFÀ‰ú?¨…ÔbrÜ0‡ċċC –„›>+€Cám̞ÍËQš1Àt8oU‰âÖD8í5ÒÁ1!d­TA3Ü­1İù˘µ“#+ùc`m£ÚmD l²[Ò:­ùñ´ƒyÒÚ-Mâ–APĜw|wÀËe¸%Äô{+Z-ú½¸Œ´OoèĴŸz;íK‡Ú—êBn\OÖFĠ“z†%Ĝ3bÚPO×Zf+šĠ]!È÷!ŜŞ^şe"PTĜÍĥñġÒE;ĊşúİЉŠßĠ,ĥ@$·Ë ĈĴ#„ÈèëÇld9X‹)ŠĦìí`ĤĝĉF?قİċ‘Q@¨Oʐlġ´ìu'Çċĝ/öĊäż"˘µ@a6+;ĉ™NËs'òl9ş,œçĦíX䚏uÖôàt$P‘DÉżÊZŒïë ëì€&paËĊBïğ"0üVÎ '&×.…áÖvQ4×íA‡Úê;o9´˜ñ ':#ĥ‹) û(+šÛ·-i1ùëw´D=Ò ;m„ñùC5„•|b[nxERC,²~Œ‡iëÌü+$ Ĉ³ċ/ ‰o›.#NHHÖJ{Żû¤{0ŞRsTï? y?„X(˘ë+-mNu, Ê!ìSŜYĴŞïĴ`ìçŬ†sÒò 2rlŻ6xnÉ*Ĝ_§’„Ùoƒá×#J4fütdJÎ˨‚S–Ü,vċˆKh7¸3À £È˘´e§ÏÍ?~`]£=@Éŝ¸ âPŜż> Bk¸pĵó"  ¨`3 ¨QkMq›͜ Ñ1äğŬöµċRîċ‹ÄmèïiOŜƒB!Ĥ Oİn'|Uä Òğ:ùġ7ƒ0µ8”)Ўşë´&Àô[˘Œ‹DGÛښ_GR!ĉpuL,4€´K%’(†Ï×R@Aĥ§(‹,ü™™ßàäĝüö*tÇᷓóŬüöˆ‡SXïšäġċMr%ñ9ê³ßjŒĈ3úµIˆ+F Ÿ£Ç ú­aÁşäTŝ|ĝĤWî _ $ûĤ—’Ğ¤ŽOѽñ“úĵž“08é2+íÌn×ÄòwdO ƒÌbġòlúâ"‘N›’:$3ÁĉMC46 ŠĴ˘)ôXwz6”k ħ„›[ÖÌçˆáO1 D~^&@‹=§jèŽÎsŞŬ¤ 5‘VëçĈö¸Ò3´ÜoH£T\öwçîLKeöe ıohŞ_ŠúŞŞ%aXġF7µÀ„B6üĵŠ.Ğ[†ÎÚîǂ-ĵÄwá˔f‡‚NNY4<ˆ…Š HF`nĝ}ŬĞ1ùH™N€ÇöŞôê`wU'î­xŽ4AÙO#äójB8 b÷ú„¤“Ê\_à­fÌ á t<’—ŒGèKËk?V<|ġ²žġÚyQ”(g‡c²ƒZ\/ĜNüéUĉCfH4[uqŽšnJÖFqœjrĠ2À/³]jÚúĊé6ġSkŬ~Ż—„Žıä$ĥ˙+°ôÜìDİ ig!íĵ…3p|[ VñP'D%($1_µJ|ç‚!ŭuAqhyY*jÎ‹‚Z. OŠ˘89K@ ĠíİĦöÖ}µÒġ8"?ĝC•ĉEOıFíŝ&l+ĜEŸÇ@‡˙<ĈħáxքšċˆÍĴ“p‹êĴ•é‹İ€C(I)„,: ]ÏĞìOšŭX$UɔêôA/Ğj. h”™}H>ô&›Óu _K½ž8ÏLo\fŒzhS"* ĵ˙Hƒd·ß˘yîñOŸbħÛ˙6êĵrU°Eö‡ìŸ†]ĈšñY8É·´û;1GÇh”Aûv˘|3ĈîÜ÷A†N…8"¤räŽà ôìÓ>G` -çÈs,¤ċ[u'û 4–ĉ›Ċkµ £2C>“÷TDifÓħİŻ6Şı9ġ8ú¸¨nÊáĜÂÄ}ù-J1?§zûÔ3{î<8ӒˆÜҖÉc óܒt ¨%UĈŬżıİħoXħ{XpIÔ?ŠA0â~›D7²‡Ip³˜‹§À–4";°"ßĦ W^â6ï'yÏĥêEö’ÁÈz0ü@p½j\¸íûĦù> · ~ÜÙ*ÌŞVşkÍ>ñŭˆĵ‡3ŝ3 KOVmK8JߪˆŭĝÓĵ‡ĞX*ğ˜?VҏÄô]#ĵËnz²Œg³·Uƒş’µ#İaË87ò< ħ3Ĉj/Ê˘M_!‡‹½ŭeFó@übÈï)ÁġRPûjˆU&èux'ĈÔÒ!5—`@èÈÛ1L@uûĵpÖeÑĥ`<ÜùàĞşçµÔÊ< ċl{—AÌ--@X}GÂWbĠƒí‰hŻ“1´zĵÖĦÌjŭ[ñŞpk›g1†_Żĵhw$ŝğ*e`ŭÎÉ;h€šĥñ›´²k>>Ç-ljñU^§ 6˘ nb4³•ž£ħû”…Ò‹Ğ´…¸îc7ÍàÑ+0AÁÌ“z~C³K'ŝËbŝKÈëĦSèĤÒ´'ñá¸9ŞÂ]€˙VÎ6Ù,ĊuäŽ Ĥż‰(ê°_ nżwÍwšiʎ2:·›Şê„woûİ˙JPN'ô Ó.ż’v?Îé?\u1pv‰"'żl$Cé~yğL䚰é üñbt߆wècéj À€3ŸÊÍÏ1u*Ĉt¤Ù0 êĠ)#núĤ¨âG?İÏ,w Qı.‹x” ‰pçSWğÛ@HÀM)ì>JÖŻ-ŝĥtNĥôé™!ĝŜw˜í÷IJÂ˙;?Èġq ›ˆÎqP-ĠħŽÉʎ<£Ôá‰ŭzŸÜE¸ ݤ6ìʰQŒ=ĈĤ@b›:„ĞôlíßlôHfÄA%÷ÊU;ûO`í€$HċÛí…è·_vó–ÙĊO÷À|҉܈ g‚EvĴ *DnĠ #k‘lr ıŬÍgŞĝ‹›y7X†Y¸8MÊû˜¸T9˜i1tW`¸}HòW Zrżż½ˆF¸Ğ²×°26j´ħ×ô­MĞ‘1:‚ħÏÏÔ~~гóô’ÓÑìʲ",üÁü;ıŭvyáa`Î4;ġF+ì)8ô²ğg(3À—}½ĞµdQˆÑ×°<Ë  (v˘Ë­JWaDi&ÙÖ?s‡d³X¨<ĠçĵŭGßL½GòQŬ.0>ŭV1µh¸pô5ürY+/“O^ñ‡WWß*ƒJ)8żuÜ#oÂġ×r–{F³$xî dbi‚ÎŽ—Ñ˙ÉDmԔ{[ Zd›B?0áĥŝ(;ÉĦèÑíGëGœšËċQHŝŬÛ%ż?r'Ò}2[/ÄĤBsoğîxwĠÄÌÈ2˘™ş,EK]/F!|8Úêá:ß[8BF >O‰_GĝZ;ıŽÒ†Ğñĵbä•ĥà:F?f*Ó!Rây¤ OıÒêĝ²ÚÈċ-Ĥ>–ğ0´‡Z.‘oÜ Ùzöpŝ8Ŝ DU),“V#áT' ÇyI섉_–Ĵ÷Ó%'는)ê˜Í_ĥ´?ñjŝ!Ĥ"›m&í°wdá\ÙlĥÍğ,u•™%Ô$° !g½GP7°˘ĉßĊ^“á—şé›–ò ONas·˙]фzç)ċ˙˙x½ž}" 5÷ĞonŸXGˆ~J´Mê-ıfßE¨ÉÚsÑ$Ħéé D\:ô ĥR³™ûú°œŒïßwafêÙú›1Ğ37,$lŝù~ƒr°ËpíC͌×vŞfÈEœNe†Ĉ£Fċò@ ħAĠÓÚ=ˆ#°€p PŸ„io£ŭÍ$ꝵ'“––‚2`ÁË HUs!ßÖ ƒkT`Ĉ§dñ%š%ìıïâ˜TĴ¨!„iËİŠKàë{uDTĜ½8îz&p0Ar›²_|‚n½÷ÓıfBš!oı, ó°Xŭ[FBT¸Ž]·ĥŝ$Ôg€ëH/ä1ŝ(=+À‘>òkÜn^Èd†Âŭ9ÖÀ€!›ÊÛĈ蘆{Y­pŠôÖâÛàYĦeâǨÈ6'éÒMÄĠÔwVC˘‰H ”ı™öuQÌ]!Ĉ†Òĵ1‡gÔ„Ż'9HĉĝĠĤŒÊÖқ1Ñùž\ßğXdà&,Ŝċ†4n&ê×ÜÀuĉ&³Ndİŭ‹‹ìÔns6jŭşŝ5’Î÷XZü„ïeu -äÂQâT4ôZèXÎĝ¨ŝ$ ˆd¸¤³ogsíÄZû•bEfˆ²ÜĊ֊“ŬXôcU€ÀÖOL3Cy“Á ‚³$5‡ÇPÀ‚şé°‘׋ÏóŝôNyŬŞó!prß_û“ŞE9;³-Ò¤ú i/7aŭ4ë5:)qà(£ûÇ!ìàu-‘’Ş/AcĜî'éyñ™.n*˘*Ħ`)œċµíĵTxħ ó[˙&möżôäğñ ĤŽd 7Ĉ òt ‘”$_À{˙#ĞşŜ‡g)ıDŜ–~vi횤BcUyRĊgù~jdĥ~":šú5ÏÇKQϖ"ìh›Ğ(?ZĵÑfïaşÊ?ùŠw”×%ïéïFÍn€˙Áè„òyDŬ<Ìħ&w—l'µ§aiVqÀé Ó,/àDĥ=Ĝbşò\¸Zzĉ3Î]ŭŻ%Ĥv Iö?"oÏ8BV¤\#‚@˜BfúÚ;"ĵVTQ-›g4óùäGyrÀıúZ0şħñ˜‹ÎކšA˙yóŜ)A‚îÀ‚ÈĴé‰p“ìôùüœôƒ_yFŻ-Bı-ùĜċ¸Â$ámı4é=İúëĊŠŻ˙úŬĈŠ×ĝ§<À%Jı΢/ƒDĜ¤ =ŻùŠÇ#Û %-)ż5ŭéÜBŭחv‰.cĈ#ÑŜ_Ê(+³,*.0”U!bYÙıÛĊ·êXH)Öµc£žħ¨¸Ċ&mĴŬVmÈĜÁGŒĉ„¨8ÓçÉĥâ!Ï]`€âK:˙³?ŞĞ J™kšJéI7Í}Ĥ‡Érİ[1(SfÏ{¸Ħ˘<ù;é0g…‡B9kğ üğ\ûBê%MÖTÖÎ%cݰHÍ@Ä ĜïħàĈqcäêè¤dR^ü˙+ÛNT³&uà$Ż~}Lw[\PÔÙÉVŬœ˙v”µ£j†ġŠVÎÊ^ÈWM‡É'k£Ÿ˙(opéŻ<Ë,R•c Zéážl§‚£9s _“†Œ@;!ÙĦ‘áċïC!…Ìî_H]eT]:^´; :‡pZêê÷’ı#ÙÑ1ħ*émeE(&…­ ›Ĉ=.ĜîQ“L\Eü95 F”+4šÓ[ \İxċQ ­0SiŝĄ–’şÛùV÷°{Â.oŝôŒ”Q‡Â¨-/&ŜĵŸM%Ñ}£ŠŠĤÓ)FQ  öċ„8µ&X 5ŻÉïDü‹M¨‡ko]‹ ĉĉ•Ká4äÀomÁ5ñz1tÜ Â—ĝ†€MĥĥC·ĦœÊkNp˙f Ïĵԁ2áˆÖĤúW—<íт îÓ°‰œ@dKH=”DDÌ$ÊÄ5ŒżYÉQœ™ÒïŻ!k" žì׀ƒßŝğ 3 cêFr Ħ5;vss=ŞœŒċ‰ŜqYIïj̽Z%J ÛLX0ú$>€Sà˜6Œß„à¤TU“ÜžĈhNĈš7í“ĠVÈèĵ3è6ËŜƒqĥšN{7d˙a @Mf›aA:ĉ+½Y*Af^ĥ¸ NbÉ. ĤYr‹ü’'~“$îĈe‚—Z{XŒuÀÉ´ö#h ŠE•ĥ˙LŻ TğÔ^ İᙗ|ó6rĦŜLE|úöé!>›%Ĉñ SŻŜĴĈÚßĉK(Á†ŽŸĜ7fxÏ#K,t_…€ÔġÉ}‡{ş&0Ÿ]aÔ½žÛìŬ"‹a 8ǁAÒ|F2ĥOì‚ÇÔ$"ÉSMgê3{r4Çf, =8³ĤǢċ Ċ/íkAŠioĜ@bĦäĵ Âĉ1ΏL‰9 ÑyÂIħâgҔB§´}há !ìqn€R‰ƒ|Üçó´›~Òßè€yÍTé…ž“~)ħÌhúĴ;C:‹·°8²ċ‰J79§ÍĦt"ÒèYšë[bxfœhş†—ÉÌ_âz¨ŠeRµÉĥ¸bÌĞĈƒêw“ëı|ïóîSÏyPB‡h‰ûGg$dC”ż6ܕ%ô‚6~2Â:çĦa…€JeAĉ´ÜìJ/ŝûçz˜zĴı÷§ŜñŠİt{òŝe]e'xÓù"\Ĥy\Ħïmq•êàa!çÀ)Ç୐9&yaġµ\ŝŞÍyXxŜóµÜû ŻrbÂYê°żĈ—pWŽû„Ï›â²c 4ŝƒ™$ù~‘§1j/ĥï4Ĥµ5¨sñîż %ق`ĉ„°JBġMœ¸ċWQ[Bmh0Ä<üÈ!Ŭ öx{ŜOÜ—ĈĊÎ%·ßµjùjkçóĤíïb>÷Çd§ŸĞTŬ]i£Ž5d.`ç1obÉÒ·rŒ’Ur²< 9cOÒë„vüżh Ñ_ŭv`C]‚z3z}ȸ_DžÚefCNß4î™Á!Şíädĥ3‘@ûA€Ĥ lĉ2{{ü7>iĤg#÷ òܝ„P…áÏÍT9•°a!„ïä™Ô$ (•bcG­ۜ‚-jŜB€fU!<àg~aŜ›ù81WyW¨hH’ƒ@èûraĴKùc¨ŸR?ï2iZ˜—–‚ÊCúÁÄĜÉĥ GÏçë²QĊ‹ï'~ìNeîHpœ'u… ~ÔJÇŜœ#&ÜÄ97 Vĉ Ħ=•qĵKm#İ-s‡jğâ ĊüR.ˆY~ü˙y£9—îï= ˜Ó~“%İTžïLÛ̇4Bƒ]$'5ğÈö*Go>2Y˘íFZW›ġ·)Ħż´Ò#0H˙s2|y֞ĠÇû³´ĥd ÑŭBEòğIO2~%~/ÌġĦÊħLjħ/ Îż„ŠU;A'žc ûpo {ä1„]0TӉ#Löäh.Eyùşwù€‰…&O£àžp1k£°b@1żutnş.îħRšAÂ})k›sE?V×ىûšµZU.<+kԞ6ĵĊ ċ’߽N\)ÔêmÛäHĜ„ea˜Jû˙-v‚û2=eÒez!€Ċ¸V ˆâF'CXÒ³Ëĉx„áY,0ö~RnSûym˜YD͒D™àÓ’Ô Ħ†k£[şL Ĉ“â:âdÁ8áÔµye6÷+âĊ A3×?ıŸ…#G7‹ù!˙>˘“ħ G@D Ĉq|áa…. 1~öħĝ~@Û ĉx!µÓó,Ġ7Ĝ²xÒäM=LĦbM,¤÷mE “ÛlâEh œß¸ž$ĊçDä§ŭtĝN}g£ôsîP+˘À%@ħ÷ÙOc'Ġ9ê_چÂ$_zet¨áĥċd̳Ħ‘[XZ_ ßŝ äg¤§Ġ§Ôì"v˘IòŭĴCû7!š*,òċ„|Ĉ<{ä/ÛĈğ ;a²·ùÍäÍ{FIŽĵ4ëW$ÇûÇPCM1j§™ħ¸× Š 'w cyǐSA—£ˆĵ!6 ‰w[‡)v\lŽ„ ’ĈCÌhëdħÌP0j!5ž÷{‚”çàşÎxòC|82ĉdı}  48„µG%PE‡Ô͖ˆ‰%°ŜÖÄ’4èW|!7uV˘ Ÿ]ŸÍBX(·_g~›5 fÎ÷’xÚÜdñ+Ï,P“q˜r)×áNÑ£½ħ‰<ʧÓšğž°‘ù†#>;‹N Íä8ܧLjPé1Xĵûvĝjz“=?ÜHi„ìŽr}/;‚ġĠĉk/˘Q'Jğ~’:Ĝ_a*‡úUöÌZÁ÷‹IĈô|g :™ƒŝèËËç|+îw[PáĠ×ĝŻ™9²,×5ú@ÍqúÄÒô\'kT!ß{ëoí×È}ğ·ZÀà>ÑĈÛôYJúi­´%Gʤ$pkµé@•ÂÒĥ;¨˙µŽ_s‚Ġ,Ìé‹QÏûʃ53Ħ$Oé÷$’ÂҌ­ç:|½h(܇gšŻˆ%n™\†ŭb÷òğY†ù2Ġİí÷ŝsP8˘*ï XuTfŬHQN8GÎĤ´2ó/œû°ß˜‘”sQ‘Ÿħ½r*ŞiTx ĠoŞS½ß:FpBÇğĥ÷<ëgÜ@FÌW2Ŭ^èšIÖ^nú.XíşÁ­\„ĥúaħĜ3hVm-ŞU×bEŒšqçâÄ*_‘ËŒ,5\ĈIı/™c‘E„ê`AŠ×ŭÀ'ħ>Ž#G @‘ùmuħZmëŸÄ0ċkµ‡(ġ§/i˘(€Ġq$kÈ&ĉj^½{uŞÀF&Lñ| <Ŭ •£[ĝöúJ00ĝ~C÷__ŝŸzŬŬÁäRĜ­kĵ $Ğ”ÌDħ–ħj€,mj@°“vpÊpˆYà%wqIHsÏ#œ1—gÂßѳ„½ĵ  Oûĉ“µŝXÄ^+]š'ŽG5£÷,öA5<2ba[7²6ü²AÂĈ$ 2ŻerÍĴ³gÛkHċ iT"CÀŽFAvĞç:mĵµ‹¨—ċŬamÓ÷N`…€£Ds‘œ™E ñíQes¸†<Á‹íà$Œwk{1Ĉċ!N}ħ’ ĵeˆÖĝ£lÓ&G+€—µ½d<Ħš PÔ Ü‡ñ\Ż/„ƒn7TûĜ[É>"ŸÍÏQg#@ß?ÔÂİZ Íîg`!E&İġ6dÂÛ8-r´gÔFíh˙$ġóĤffçVµTZ8:2’xwħˆ^>(ĊïİršŞÒ_CêûI)B}^?xŒŒAëwÓğñÉŬíhè”ÒGmۃu•‰\ĉ¨/@ĥ‚ûëJíÁš“ČÑ;#³û.öJm$@@FĈ2 à77µ@@T#0Oáŭ#˜I×߈~YáĉŞrMòÎħĞe háĈÙ_˙8™ÊNğ8"½â-áläÚruÂèá>e½?ž &kf´+zgŠúiÈĴbš¨gÒ·ĤŒƒEñÉcrMó5JŞiŬ*?·!4kUHğġ÷`òMşŝuLCqÑ(.ù³cŭëâuúIğ‰8wò~ܲ٭ôZÚrAXÊRK·vĜè_PhBĊBa ~² š#°ÂÜG\ìĤöĦĜ’{ 3üA–aDíÏfMÍK–Á%ùŭ|*÷9€şĊeÉ97YCżá§'[„ĴiĤQ!€íHzQwÔ×_ZŒĊ‡³żŝŝ*kĞeĥUWŽİ0à7?²> VîĈ‡9OŬ1M BÀÁÄç÷ ^|Î`vZ¨,†ˆİr=YTڅHhŬÔöŸIı|3ÚJĤx<×Áñô&Mß%Ĵv3ٙ 4ú(Áġj„VíÔßġêçÀ?JÖf%ŽmW´Ò‚† ÁJPe”‘8‹tŞi;Oœ{ĦîOµŝċžlâħ6°şHŸĉyZOM“{ h[xiŠĦV•ƒÄà}*˜.€D’“Y³r”˜ö\Ž}²³`+˙wï´ĥ~ı)6 Vӈ9E’çt* îR(ê.ì`Ûgq­‡Ÿù—Ÿ*Œé3N+§Ô‡ä‹ŭüϣǞ G4Î.ÎßċéR% ç}ı”•ÎĴ ĞÇ I6¤Żè)óE+*ŒS¤F> Ċġż2/İ^~á²ş û-ևwŞ5Ò °òŜĝĊ*+$!ˆgÇkÜne3“ÈÂExşİnP~ڀž6âúŝ}ĝ“Cݲv4Z_ĞŻXoŠ] ×ÙTÁ0!çeĊ)óêsoùŻtŽ)Ëû™ċ¤^¤M°NšdáÁüÍ­ô=Íì’h™Tà TÊÇa1ü2Ô!÷ïĜ˙}ïèòmßHA\›dàôRAÍ+ĤŽîb¨•Oƒë2RwñÀĦkSÁĊd6{)âœôÉE‘cd 1ŜŜl_œ< _ĠL-Ùázq(ŝó0|rµcvB–ŭ¤úÀÖ½jêŝ6ä,Éh+VÈ -À?áX=­“İ—×a!H 2QÇüŻĦ‹ıL¤zÇSÚîÓj A½enÛ·ŝ[rSŝŝuşvĜ1’ψN³ĵèĞÛ 6°ĴD‚§ƒG Ñ/+şeÈ‚zWŒEêLkòĜúUDŝħP³5½”îŭ¸5pôX'vıMlOŞDšD֘†C§;R2-7Ú16{á”4Gf,Ç[H‰Ŝ#š°1¸AÌ „IĈQÓT°n£Bó²ïƒzÓR·€˘ĉŸ„ÑasµĠfó-ö ´£Ÿ¸ÍvıSGXôúÏÔ¸îÏVÀ›;ëĤ·5e£À€‚yï›Në%çĴĞĥb8„äHÎlσCtu$C›jş`:r‘ës·ñáÖvĥMÒ­NT›?Äë•͵˙?Îżġ.úÚ ŠRğ )¤£˘ħ°;·|gcç ž1jÀÍì)ovĥ.sĉ”d*BôÜ>§yH?—[b*ËóŻéܰcŭ¸'EVĝG>(ƒ`Wo‰ç|:yž…[íÑJXğ?µʞ$Ĵ*ŝlw :NߍÇìëÖÏ,ncm%żŻ,^Ż[˜-Šz˜Û˙qĜPFu­ $ŒÚš]<›h:³şùo›ĉùo›ĉùz~%îċ;‘Á/Ì3äĵĵĵĵĵĵĵĵĵĵĜ^+§Üq)gv’Uôw›ĴAMs|ß7ÍóàWo7Íó{cËĠ\Ž: ĊĜğև­9£Î˜°—ÎXÍħVi}ƒ²DӃ&·˙ÁĊä%Ieĉ$k’cÛ ĜY‚‡ŭû”Üîm.ĊÁÄ5h°ßA­£%/†oħCȓFTÂÀÏĦÈ/ЋԷߔzğgnhCHX üß_J–šNpÎ%Ğ bÑLîŠñı× 5E½tu%W—+²|9s‘äÛĤ.r‰àrÂbT‡-—uL‹3aäİy¤d Cem_ ­$‘WùIŒJGÀ¸˙…I,Pȸ9têQ i‘Äç<íëċüÂ^ÍkĴLÜN_Qs9ŭLĝŭ/Hwݞ¸ Ü_Ò ħF1ċ‚÷Èïá?ĦqĴ÷† amĝ—ÖĊï}H^ö`ŭGRšö£AŬI½žqbù ˘‹ÈúœO7a3Ŝ>‘smmŜ ı—9oÒşàiĵÈË2œÚʑ9’˙-àN ĤZ§xË:bTƒ$ĥwäĝYk}O„áñ‚_züç {ñlÎ ÏÚĥĜk %ê_ór sUHêµo>ÊQŒ˙z÷§ÔPż$ä@/é $šSÓV"Rq6`ĥ)ÔCa•LĉXšE‚Ŝ€^'(Œwg3ñÒ,ÍhŝíĦdN|İC䨄‹fŬéÑìÇÂÔ<#ċkŒéV>x²’Z… njüŭiîQ='‰jŒ€&ïÙuN"„r‰Ĝw^ñġ?ΗhíVgp²Ĵ0víˆV‡@üÁŻżV)Jvĝ°sír,˟!ùŒmÛĈW<  Û˘÷zÌ-²Ĝo8ÇÉUzd ÎÌ×Ŭ1¸Ú÷duıi ŸsÀü5-èŻ4k…ÖœZ 8ƒxÀ“ŒmÁéòü¨´Y½q2~ë§DHdنt$ıëOĥ‘)ğƒ£×ÙÔxl/>E ­”k+HQà ^q[Qbß´eŽ2ëtŻ×¤~¨ÖzksÌە@‚ŭ’Şophö“Ö•µ—ëuqĴò­‡PÊĝVK Ż db”`ŜÒ ò“Ùp|oôv#ü>48âÀĥsSÀdà,íó“ĠdDÛĦî‹ Ö@ю\ĴDŽĉĦÀÂJF²$KÔ2ߖ 5SGVۈŽr&cÑ÷(ŭŽ1)”'p1jİÚÁ ÁĤÔ"&ˆİFŞÖ“€lB>äâ5òÊaÖNô™:Ó ü}mĈ‹qŝ˙>t­“—7l%iùÖL,LIB£’‡\sè A–ĞñÇd³Ĵ ÓPóĦFGÁñı|“´áTú-TëPċGXŭùö~Ġ{ġ‘Í’Žw½Ĵ=5½Ç]ż…t‹“Ô͝ïÜÖĥà³7눣`[^µ((gJ[×/` mÙV8ÎK2àċœşá]͗ÄÌñuÊĤC+{0úbÍ’žħşHéŝ÷°ÌŞöNZÒM}œĠö“ñtwàÂÓMËĥ€rĜ[{ƒ7fğ„ ÎbLÑvĵNú;÷§ÚÈé3›_\ëKâí?3ҒH˅ïaö\™†é„UâŻIàgÒ'›ĴQaÊ|ġk…š}ƒYíY›¸h”C;¤•†Xxuo›Pyí?|§R”›cÛÉѝ[Ĉ]ħ´ĞËşà›ñPXštĠŬĴÄĞ-b{„ÏR)| ާ<ûƒÌšż Ô·ñÁŸ³D‘™ĉQ€ĝÍjß ğì3 FÌ İ2¸ÈO!Ö.,œrPD‰a'ÓHr}Ż£/…Ë'Š6ĝ×BÎ4vìž)j³ïËQ5q—ŞÇ‡ĠOíîŒÑÏFĦ¤ŠH9Ż‹z"žX…[ìô [ŝz24^ kçx×iI¸yġŬ,t;­`*ĥ|ĵ{Dˆë5€èÉĈû(Ĉ=ğ…Ġ7Ö8—s0Y'Iöx÷ĞŞjó{A9Ŝt{ñŬŻuÜSċˆ4Šé!|,1§bdBż6p–ĥÚgvpİ|ŞĠoŻXF‚H„^t™§ûÔo HúµPµ|ŬfûDÚ£ şmÜèCäc^áÀ×ħ5žiÎèž-Öŝ$ ݘ Ŭ“?eú×Yü‡Lîù9&TUĥïÌ8 ġ²ò°B yŽŭËϵ­e9\WĦôNa֛|.ĥëĉû$>è¨u bôwİ*€AÇĞ)5!żbǢž |ĵ£}—…ŽÌŒ‘ ;ĞN)xĜ^ßÑV[mÙd•ŞĦ†CtÀVêlĝŠŻÁ\ÁW´=?:5 ]t>ˊôêH·‰><QĝK„;舋Ž)§ŞHâÊÒ×iµ•Q BŸ$?ˆ/Ž^Ş+Ž·£CŻO jG*GìĦò¸4Ğġ &”‡XĊ•z-pb—_‚ċ+Ĝ‰ÒZŜ^o\ûW‚V~ËldI‹Êİר³|ÁŞĠ{ÓPÌìĦƒŻ›+ΐÏóîw ?QÎ6éıZ*î󉢸§eSMĠ7ĤÀÀñ°x‡¨wr*Uĵ²YÑ-šàÜ;}Ÿ0ù6ĵ˘T9Ԇ*’ïZşYš—öNôò’ˆc²ş•4]Ħ¸Ş"î}+1Œew†„ë1ĝâìôƒ ı“@ĉÄÉŬys¸Šßİjİ›İÑŭSâòĊ@şŝšËȰıGïŻÑEÓ#hĤċÓxĜÊ÷ŽŬOào;OO6µFĴ¸ *ê°aĝ·86ÉAĥ÷Óà3–qġÛJüÉĉ˜1ŸÍğuRècèï´é‹ùŭĴ6Ú¨ƒ^똂ż14ŝƒÓß"üÔL!WX|‡Q }PárŻW`x”5€Dëòê)aL4€FÙ%ž¨ħÌÄɉ´üëܗŜ¤Ĉb`Jçġİ(°˙xWĵçS½QËÀaŝŝÏBboìi‰À˘Lô‰èN°HÏùÓŬ~ršÏV.ŠÎscAÄxOž›°@­§ïœáÔ>W.úE-Òĝy£mKDY4S[ç%öÉ´]ċ÷윳kgH" òν­ĊÙt…ğ4²Œ›öUíA×UŽcB£ÙnġâöR3Ċ÷WÂÀĜʌEJŠĵRĤ6ä½GŒ|FÚd$ĜŝP¨$U_žı$݉Ĵ8 áĠ÷BD;iéç ġÍiÏáe’yCĜ5£=7™}×üṲ̆Ŭ}q˘`§À1²„ĈÄm}Ż!FȕŸƒş4žSíƒá,×G†.lUĥn I„Ġ“z„Ñ8_ê#ö5é#(íë÷3‹ÚCœ%iÜ<ÁÜŞO6şÈ™è[†k;ŝbıˆYdK~PÈì~Ü1:Ÿ} …çQ£"9ÈtÈMs-í`iH$1̊_9ş–ŭZì3ŭ·×Éĝ–~Ü6Dî…ĵĉR׉e†ÊWCuˆà·›ÀŽlQÁÈt9¨–‚i(TÑBé-,„Ÿu?Ù/ÒÇĠîşÛ³6Â×\Q |ħ‡z÷ÍÈÙSèErżċ63´ŞÎĉÊŻŬ’K|…áĤċĜÍÇa¸&ŝĞ3L@óÓ2êKĥá×Ó§Ĉ8…'µˆïŽ^ +GjêE^n|††ÌŭëÉÜ„6×,zÙjĦš(7”“Wĥёƒ›ŠRE-‡ÄŞ˘TħE¸|ÉĤóĈb@Y?™½ÈŬ]µmbZmabĞ9ğaTìlÑ8“Z¸ŽÈY¤İ$ÒYÊŭ/­ĵäûR76V,ċPÍ3˜ŭî‚ò¤Ÿ$=û½áF™€$WÓ˘…RBç­3ċLŞ5ÉòwN=­ioiֆ7)Û·Û­QhWdÎ^Îa5ğŬ~ϔé‚RzS(ĝıġ>p$Kpô4µVŬ)1›‘˜óùğm/;)%Ô "ö[jc!ë*S!íyÌC‡¨ŻÎŞ9§ê/j¤‹âî8”­Ù–żÁ0şo= xއ1EÙĝÁ[LĠôĤ6Vħwç¤s˜/&UÇä2ĞOŽbû ĵĤw †÷™ôĜTwżô‘=7Êób†Ĝ*Âàĥ‹*s–kfm‚‡ï2.À1⍂[rĴr5t³.Jô Q-ħ êEÒĵ3í¸P Â4ó#v~uŬ§"pèN²~Y:pĉƒ C°ğ›Ĵx{xјħŝżä%RŞÛLŭìÉSG÷QlfyiȑÓÇW˘#ĊÒ&³ĵ´iŒı‹Šû%@ÏÍ+„ĉ´ŝŒ!NŽhwc.@ûÚ. ÀŒ/P¨Àf™”ż*šP-*9hŠ1-͈Ït6+oĤ,]Pñ¨Şµxs.ıĝƒš¸›Ŝ– ûĈMìIMÚO4‡rÉKÛp×ö5,żD]êǐôú'Š‚tÑK Tn?Ħ¨²NáĊ‚}´8ïÎù‘~’Ê"ÜġáHÚ:…ߑŽ>èN\ùÇNEXŒñ“%Ò}4HC-ĞÛï8žÍԜ5ˆŽ×W38dò£EJJ71.rèȤĥQŬĥŬĝ,ž“ G™·\lĝß9ġ9ps–SÈĊùàG}ĞËŬ‹í'ĵ­)–/ĝ6†S„h|ħĠĦëĦċdo´×òÂ;Š…ĥÇV¤sĠòħKşžÓ#>Ċ„hħĝƒ„0ğŝgàI A5?E”WI:d€%Ċĵâaa\ˆ:JµJŞœ@r0z pxPĥ‰dšáB'Ks<–GBq³áÈ+wÄBuuÏĉXïeÜnÈÉ-m¤ÚĦSìiKÛ/•CżÛDñÒ}ÏÑqŒ…i+ĦYÔŜżĉ´8ÚuTĤÜħA­ĜVfİñ|ŝ˘xE‡·4íi×NöÚħPAƒ;\U‡k³6§ •C¨ĥpj› „9Ġ‹y~ú˙†ÀgxšŜ°9{\ÖÒĞ!‚8ùĥ]jfÁ #19íŻ·D3“ŜcÚëxċùŜ°vċœKm$4  é… vMú+˙ _ħVêNgû´Û ‘T?ŭÒġT\TÍ]ùŭìÀÏ36)Vĝ ³küŻşçüÏ!Ġŭĉßà'lħbđÀÊĈl["îuÎ ÛüëïÖӌ˙hĥîڞĞö\ $kA$,Ó|ÜĦRÁÛ%m‹é<œBëéqÎ<­öë³ĵ‚™„Ğl 96ĜʤS" ¸ż:|Ÿ+ÛĞ 86ĞêÖ¤ç–&„–°P%6nš-:İ,èİV†‹Ĵ£È$=àXé` êÄ{‰Ql ŽKk]Ì[Ĉûôkôuxż‡;c)üz”çû×ꕔœwk˜ƒ˜oVÙġ£ g×ı`B䜨y2ÉıŭU‡Öµ7x³2Jğ+áîS‡ê­›O*04iĵ—˜r}W\Ï"!"Nŭ´Èß9ûIÙÛĊap•wüŒ‹ğ7uÈx­Y7ŭ›µZühĦû9ÒßhLUuµ›ôÇFàmġ^ŠuùßĜ (ġDż]ò×§|A3a°I`µ=i^-Ŝċ[Óğß`P̌jÉY$Óİw_ùQŝo VK¸ŝ‰Ħ’OóPUà[ÒòżÎ—F™ĴŒÀ$ħÜŝwb:]ŸÂze–aó#ymDŽgʅ=‚Çïë2\*’=)ôd#E‹JˆÍÁsğá*Œ]ş H4µ×Ş ˙?­8b`Ğ”`LŻT‘2à½dKıQi6‘óßĠ!Yù4/r~żŝżâHU­: ,Àıšğߞ4‰ މ°ŝŝQÒaU)ÓhĊI?ùÈpġV0b×ĥ[ŒWSH˜¤NŝfĉÏh˜ÓŝëÁ1JœÏ0 ÌÌH5˙éE]Yàùo%C?ċ;_À``WΖċwS€*ĥÊ­``˙QYóİ|aüħ*@ÔΣÂ:Ž'kÀ0#Ç*îàÉÍ÷ÓnŸûŝlbPœÁ§-‡¨8έò"sH04 ‘…ÇK ÏäĞUI×>Ί<×!×ÛĞŒ›%"âZV$;- Ġ€ 1-½úâÊmr0}eíüí·n•*³m*R”)JR”)JRÂ04Z |•<éĞöÎ2ffĴbo–ÓHĦĉ9~ŞĊsĈpßPúċVŞi.oĦìJċ˙†k̤Ġ0‚’ÙĠKlšĉ;6B!Su­Šr~ħ;ŸŜYCGEÖ´BÒó·%t2ĝ“´ĤEĥĝ>„ŻÇ‘i„âçĜ˙v€›,†ÒÒtÔmNsÏ.•ô:0âZà_n‚=–´œGàP.ŜzI$’I$~‰íµÒlUġ½Ù¸Aá ĊDĥcOjáVÍŞÖ#I·g_(€ÛŻY&uġÀÄkr”arôwàƒİ]*ĠÒöI…nÒm! 5“X1Q³*‚§!z ïAWÒîT@7(SfL şê5c*/”fÓ2öòƒîĈnî ü½Ĵ IcŞ˙pC‰ UÓ} ¸äf*ğâÂ`_}t\ε¸§‚“cóA£ħ§’ÔmÀ³Ŭdq6T•U½žh ÷~š„~A|ù{Ŭ[Í/ÈߔÚóĉ]¤jçÓ2Ë îÙéÈÏ ŬN ×t˙iÁ Ò¨KOí’aOWŝħžUG*T¤ö…üÜ J˘mRÔsç~qßb¨êÎ9ŠÛ^\pÄÔ8*˙Šm8 àË´-—‘a½t "[‚4gÜv@‚u7.Ĵ^‚ߌÙ'셜Wû¤‹Şżè ab’ÀIĈöƒÁ>ÓrÚôs§mëN_ğ­@4İ^Üdšfĝ_î=û9°Êú'˘è„@ŭ—=#bÌ ÇĞkĤÓq˙ pħ*„š>ŽM­¨}W^ŻÇñlÉj#1k:O~N]•ÇÌİKÛĉ›Úŭ4Vxz˙-yĵÖgФ Âòİw4ҍìò^ ÁayxfÚO–Ġ{6/ġ@â9é‚!Ï"#"R0î ĜdESp°jµÛD#;òçÚè/½µ³ĤVŬa2ŬsRÛANŻô Eċo΄œà1˙$kĦ &IŒ^ÒYĈ/BĠÓüs´ÁéİŞ7™án2˜ddĤĦ M|G1Ĥ(…6 w:çĴ?Më&bÛÁЇ"Bk™g"KòżiÈ' óï Dà5Z\†Ê–Ÿ'¸ûú‰j7Í Ġġ”€´Ĥä-jBGÛ•ÀoĠŝI§*8™ĉŒĤ:â%ÖíQp mèĠ[ 6K’\xç}H{çŒĝo1ŒĈżvçّSptY,yğzĦĤIö ÀĊxĤi8x×ÏÎ÷@áñkœ&O[ıvHÍ´r#QÉ$’I$’Iİ "ù‹İ…gÂ1Â7Fiò@BöM L-Á‰Ċ¤ÜK8Iœµé’vċwŞ›´ıK\9šj°¨Y·°£ċ“û‘4áUúƒüİñ™îïUó>ĝċgê§míÂdu,+°nyk:eK=2]JöÇV%/ĜÈk”ìĊ‘° |4}wS`Drç6`ı}VÑ˘÷Ġ+íöeÏŭ8Ĉ|üËħ]ŜkÂĊ÷fÁù Kˆ+ ü½soè×Lxi;ä\)â(µÎïS@şĠݍ„M°päŭÁG¤GˆZĞ")Ê)ħé9o R‘ġwÎgÄ8çLZ` D ŸRĴÁÀ>L›˘à}şœ3¸²*2JĠ?˜ùktĉĴzêo¤­ĥ!J(ôÁşl¨ï,™˘3*˜"í^•PSŬ“K{׉CqĜa4Ŝ;/²à3;ż żXCPómÖZšĦbŭŜĠm.VƒĞb1ċ\ĉ0‚ ?HĠë—~N£½Íèµzc. ۈGŝĤlÛA ‚.Ù@Ü÷ŝħñĈCaŸ]!$>W֗G?ä+ß 2L*C@ç3Ì­ÇÇçGJĈĦçÔĵô–›§b÷9óšı„\oÚMœĴ³ıéí×ĂÎјïĴÂÔKŬçĠ.Vò›ĠçïçsTN{k4ëa1Ĉ‹ñ|%۔sIamˆ żŭlHv\#ġÔ´ŠqšV½V&‹ñß ˆŬ _…òOhĴQ>Ŝ§:ZĉèW·ñ]EIc€$ŞNu£°´Ñ?%ßÙ礓ĝÌsUIp‹döáĠşÎÁÁí3„‘†Œö/ë)FZLOÖ-}t0v3jMÑÇ i*Í&ô:=ĝÑŬügŬ{äŜ/Ż;œċ%ÁVż§OíĠœÇ?>–ךڔƒ;Şsù !6 vö8ĞĤJZğ83‘*Êe:ġÍ-—•UЁkŠfCrG&tז,zÀùñĉ€ÎxZtüƒw2‘3Œ­0&·Z\’ôcŬÒÜb;.ÚżÌ%ŞÏ{~Ĉµ0ÙWE‚4‡ûíE`]Á{$‚8ìâĈ†ŝÉvX4ü+”K4­ ÒÊl¨ÌġB3’“ÊyKŬž‰­7¸ĠşgޤŒ ¨ 2.£ôòtŞ àñM³oI´-[™ŒcŒ`ÍĠÏB”lĞĥÄ3=Pİ‚Ò.Ôé;—½šÍ[7@ҕ ò QŻ‘àNÊ@}qHÌW°3WäÂ:ž§*gĤ€:8ŜQ~6ûÈ ê' ŝ0ž3=Oĵ—a°ÑǨ&ŻršrħXċ0éT,Ç; A²‚Ŭ/—!ÛUùŬŠÓ…KOYnĦ{ÓüşìŜğ¤™vbmy%`ş´uóšIĈ0ò” QܑM—JuP–wĥh&Ë³éîĝĠÁX› ì,S"Ä EÈMà'9Œn7ŝ1ĥşÁ]2ĤGÌìMSê³u‚ßlùîV[FŽtzñ]ë}„zù)‚˙•êC?cPĊ£$·ĉ&èeeNW7ӟLYײYR– !²3Ëà"= °/ü…Ĝ`BgEç[p{pۙю^)‡ˆŞñ”Œş°ĉŠŜÔsħ°éä³Ä¸ĞBĦ;1{‘„Kì¤66ˆŽçŝíL™ë­sĉäxoı™q Êï7x”ÇÏrÀ|´Ä6Ü"ÈmZ#ĉÇIbĴ!üm“+ĉu>î<³.éĦ\İ͖´Uêhd•à”<Ì}Ş× Ǚ@¤7LDρfìÄpèáĥÎÎ.ßÚ£ù6òkŸ\˘ċÒuŻàCœ²YŽQ%İ@F¤ığÂ~‰vï hɵĝġÑÄLOUĊt84û2sşD1zÈ\ÏE rê“-Ŭβaĥí MËĤ{P³¤6ğ?µ3XHšBDlŒV³PD-¨ğzôduí£ÇİV+ÏDea8–ÌPħfWgùħрTM×ìĊĴüŠ îˆÈĈt/&ŸÑ"f™”ğrħá×vAb7OÁ²­„şDŭßŝĊ¨0ì9è]ƒĴÈdÏ ċ‡A[À-¨£YóĜĝÓ7ĦŽé¨*çĈŞó̇S,9˙c;£šüy§mك!Ŝ|Ġ˜5É+Égo†+D ƒĦ€oßX^÷=lÏl§~UBÖÒÈ2;œŠî–y­_ƒ™Ĵk˜h1À7.íg’rZJ=L­AÔbkğ!e9ÑkT41Â-˜+j&oR~›u Ġ8ħġQ‰È&zşÓ_Ì1íÙ fÒ+-ƒŝ€^ïü‰0Ħ%ĥì˙jƒĤžPwħèKÚ (qj¤RÖ{ġ ä>Ğe;-=uµq 9öt\–¤÷glP)ouŞ÷zöĠÍxŸb , _ST2èT!v…Εo‚ܧstJXÁĊÇĝôġï5şġF9|UNzè*òi# U5šÚ<š ×;ZíRĈ€‚­OŻpûnÂı–_S7S]“hĝŬÉhÉXşoñcJc3(ħ>Bú÷8ë‘Ïè>{“ĥ݁&| Q&•j}Zšôà€Ĥ]F/—?Éĵn=4ò.÷ ¤´İBçÈiá…%×[šÊÊġëE³-•>ÇòL˜<ÚÓ)-Ô­nşżŽ Ôßzj ük;êe’ CeÈúÄbÍYz@Uû­Ĥğħš™Ġ˙PµŽ¸ĜÀ uŸ}“¨è?^ó?ZĵHF÷á?¨Ŝtm0Iŝ Ùöƒž–Ĥ³xĝïĴğcsÓUl# ÊړĈä!1Fx+rpvÌ7Aó-šd"6Nĵœ¤-VVĦĈˆ’.‹ĴË+Iİ’…&3óżİĤ‚Ÿ™8bĦĦµĦ^ٍHiÂJżâ—:*…Ö;yKoĦ„IÇj¨ĈêLlr”b×h`d=Ż8,KM_{Í2@Sĥ1ÎHèX›dĈ°VéòT­żĦtm,î^Ŭq6'„­;ÓìÉ#̑Ĝ#-wú#*¤YMï„JÁXw ÀŞhĝ†¤Ħġ~-t$jŞuÚĵaÔÑq,aŻ^Ÿoa˰—?‰“· toE IÇj1g痒KJšÉŝÈZšOÌY°OĴĠc%˙ Ż Á“ıùçÈR”™‡g+G£ñÜn`/í]ĵƒô Q sxw—É QÁ?z™N’²''äwÔbè$‘Œ$lÙ—-GKóÈH‹qÚLĊKaŸĝXÙâH?.ôPƒaDüY0˘uü‹;³·´Ž…2;ĝM…ÁÈBS:ĤŒQž•9ÁÒ+ë}iNGŸu:it•GÁ÷s{÷rQĠéR^‡<Ä^è#…4ĵùşż=ŠÄĤĴ’nĴBżÛ#ĜH¨ş]\y*˜yÌ2nFŞ€GQLTÀı:ÍÜM½Š§öê˘!QŭŒàÁŽ>#ûş…`żó0/ "SÇ­-ëƒOÚ3– ÈŜċµŬS˘Û‡7‡ A†ƒo ġZħ.böÚ´ıÀgÈÒÚ'ÌÓÚE‹?żĵ]ĥ>–’H5ġ<8¤|¤ı/÷÷Ġ˘ËD‰Yñë;\ħ!w›kóD™„G&uŻ(ÀòvlZµú„vìÉ]J…ÔquNē;°—ô_G—‹•^ío{ş…Ï]´tÌâ ϲ—ĉ8%ı6Á†W€:˸€=NFɋ#| vÛîv½€ô˘`64aDD Oos:ĥ}áCLl@ln)ï‘OlâZ)m§ħmHàqž$=mTÁ…\+£À—ƒĥQĜ@pˆ{żuĞÍÜĈQ#[·H`g_;~·u]S¸ğg”h•Œ”bÌ9³Ú9+Ïŝ¤ġVó *´ŜĜ­à ’ġCL-EàbM¨juۋ֘ݰ ĤÁċÈ0Ê$½–êi¸rÄYsÀG7 “"i.ÓfŬ/òM˙g•R’êRo`éió|¤ûğOĝĈÇû8Aœ˘A:3FDŝ)VÉíáûcOÛXWîs8И.7ÙĴ ıY˙ эkµüWB 2ĊQ„šMpeZéÒ7ŻnG%YÉ ì¸r1Ĥ’:·HÏÖ>ÒÜQ¤÷ÉÉ9˜Gó_Bƒïú*ĈÛʕF&‡B…·9y0èòçcFUì;“>v¸ĵidb˜‡xŭòêß(†#cԖìrŻġĉEOwğ]{†äro mŭzp4>ÎûôDˆ”‚TÒ$zWŒäĉțhÌl‹kżXÁÙ ĵôB½€ĊÒ*Hçİ6Bħ›Ú^íí`BÓ?ÖgpşoĦó•¤Ïp‰t\mE˙|×[öÏÊ-5î£ŬoË'MŒ˘£JG X>ħÖ7q‘e°µûĈĈìʇ>•ŝ£öˆú Ì;˜xġ ´X3‡°N½ßVSd£ìï½ċÒ)5dĜÑ ÎhD2Ÿ\MSxt˙$ôKċ’2ÍÏXšMÎ%8Ĥbˆ¸’O>c„§Û',ċçVĠnEċĝĠġP“k@-L– ‡Äc—V6ı?7Cf`"÷ɑ˘Eż‰ĈjëzJaˆóUŞHŬċFs‡m­İ°;ÁR­oJ ĠŠÌ€ö] x˜×öµµ;’ĥ਌DĴ÷r‰e!£jîâ }ñW8A½­Ú[Ë£™.Ĵ˙?ĦlëKb˜9XŞ`Nœ S"úÊ;9³E™˙eˆ5´`h˙g çlpĤ•Î`E-§OMá´µë1ÈtŽÉŜM“ú›oü¸Á"†ÒuÀh×ák™j™x³€ê2€ Xħ?‚·lŬÌ9P‘(sv·œŝ[@W­ìżLÎÂĥôŸÎ3UŸ)˜yċqÁÙcÔhˆŞe#cYv.vE]"³Ŝ^™g-Žx(öĈk ĠÒŬùĈ;Ĥ¤¤öJäO,­ƒÄ/mŝDéƒ4UgEÚĉ35ߤÙ`lßgÜy5NL]˘şÇ]úêECéóh@€íÄiK¸YpV1ößV…ŝÛúµëµöéí²ïĞ\0~£ŻĠ?ŞÄ~ǀí ĝúžA üc0nF]‘àÜıŸèƒ fĴé֓B&Çġb ïòJq£[Ú äħĈüµ%r˜WġĦÙò\¨rĉ. t"ŸK(U Óù޲ŭk£%yFmšn€îŭ¸úÇP/”V‘ñ\÷ĦaŜV˜/ŒTAMWİÛ³m\y;#ìu½Ŭiü*è‚PAk_Q&u\í0!nBŝކ8 OpZŞ żàbƒ¤’—ƒÀeYS|ŞúûÍ{4ä$Lg$4#ˆ'£š?@P™Ç@_[™Î[.%$p ”G<äT—vT˘ı6ġ^†ÔQQĴ(jÍfìñÈG¤$3ë^¤²pĉŬȞj“Ŝœ>$ò0_íâÛúíq„>“sÁ°o#ldÙîǓ ô^‡ĥ"+Ô )JšPlš l&†oÉ'X.é#Š}3Ϗ˙vî/í}ëÄûŒà)ÚÍÎ6{  ‰Eüòĵ…µÎǢ9u eD.ù Üâ†Ï6!‰\(]‚Œ--HB7Ȱş Knĝ5ü@/”M9•Ùdŝ¸+ÈÊ5òŠ0Ç*Kô­f!"—ËĞÒÂî² ˙š’šèBĦĦżQ/v-!§ŭ(‘ÜúACyô߆=ĝgi|§­°‡;{‹íUcOOßŭ²~§+‰ÒJñx #¨ ³Z8Ì KÌ,)”°fè¸á+΀­ žïĈ³Ĝ[ŬP¨îuC<ħúñzÙPİïÙ+*%öKŠxžgMre‚/v\†ûS vvk€’û$żÜîM–ħż ˘†6Tl‘Â7¤ÜŻ6%𷚟‚ž+ú~ݐÂ+ùĵәjíPJwĜzĤ—“UèċŻ€Ġ#µ3z¸"„úĦ ³?ğ'ï`° ^i–Ï{ğTŞê…bÒ, ½KQ<{Ġ³ìŝšîëéH?˘ê&ŭâßUŞ‘x.hœyD]ġ v ì€KÇe2ŭ’ïfd6ɓÛZm–…Xî²§ßá—YZÉ'½nïşDàĉ°¸9j!H˜—HnT5K"žŜ”0Qu²6˙<Ŭĥm\ž¤ŬÈꓷˆğw‹B&yք>ZŬäwÓÄMó?İ­Ë|–˙f?ËÇÚU‚mbšÍ=}aŜPVĵŻN×Wg äĤŸ–1Á¸}xşNzı†W§şL¨B¨ó• yT>lŸĝTùï"ŝ³/§żµ.ĝsŽ‘m¸sè³q|­S4Fà×0BGuñ ¨% ú푖Ĝ‘èÔñçëSĜ×h1*ìMAmŬêÂÏB£6iò¤òİŸ¤ËGÍüZž„]°ÛÖtCÎm„—ZRû¤l11-oÍùÉ䐆`ѝï<‡’ ÊÇĞÜużÓ²'N@sêĤ`ĥlâŠĉĝ)’^ĵÜZԏkzÛÑBʒdäDıĦ˜=ú—ż0·ŝa=Éo5£‡° >“*<ĈÑ"zˆS›qtBœB"â†ÖfM0Ċ;gĴV+Àoפ.bc\Ç3/ï•ÖÏSTh›žâżóµwOèüÙíI)j9KŒRòW§ösiı'3Ä$$$² KluTr5Ö9­àqoeŜlVÑ˘ŝ(ìiˆÇ &Ü^|Ѳ‚Ĵˆg o‰ñgĠPÚX*"á ÙÒáxt ›zTŬ£I •(lŝX˙„ùO&7@–ŜäÔh_™˙\0ƒ‘pÚ$Bíü{vĜQcLLeħ@Ñ ßHr†tMŝğÖ°`tzKÑíö/äCPĵ˜C80љ´êò,ùH7wŸO ċà=#côKÏVp%öĈ÷Pž“ìÍ%5/›óۀı\µö—QŽ%’Jt v<ĞûżaĜk qŒàPÇĠ `0Á ÛWˆ‰ ÔĠ;é:5}tmÑ^Š:Ÿ…çË%q@ou­ô5b›ˆ7îF y5I'à̸ŜӅàa€¸´×ŝ*nOt)b~ƒĞ [HLÀcPÉ/ŽÀ½ġ=YgĈÁùÎl£íUÇM€šZ´éC;_{öİ~ĝwTvĉOĥ!{Â! 'ŠT‘ġ9Işƒ6 ä ²èÓ¸d³Tžn÷ìLbk ıĤX]ĈĝBiĦi-ÊWèġ²ÒĈE$H†~crċî,f^œŽĜEWîoüK½Ó³EGj”ú²ĵë\,ĂcEĠäQMn?}²ÄúƒÁÈòü4-VşŠ.jb˜ç‘֏wtU‡™ÇN]ñÇÍ2Ĝ=ş/w‘~kĵ àGib†i#[şun•ƒÖm2jTÓlaŞMZ`;ğÄ=û¤jġ¸Ü[rEéîv³Ĉ'à€ İbĴ /âM:ĉ½ Úco¤jÂV F­Ô mNğ”íƒċY ¨¤`ÀŞŝÜ._y)Fĝ ݐ] ëĞĵĥMa½nž––Ağ0$ŒˆîÙ%ƒ45TñS‚Só-ŝŒ(ÇI£/’3ŭ£9Ï\RT8™ÈžëıUâ‚SÔ :ĥĉiۊ˙i|ô5ѤÁ²p(†² B²Ï ¤şxҚğÚlû˘\„‘dŬËUÔŭžû×xj,CëOŝìÓݞ ŝž˜Àccħ=ùßlÍÙ¤—ñ™µ#ûQĈ” ȕÇÓ65x…zÏÒĵÙğ<†ıwĊżS<9ıaò-âÛûâçÜŬğĝı(‹Ċàġ1w²rMé2YDˆBpžŸ—p;ô ó£İ„•+=Á ^ï&ÒÚCħ†ê"?Gé3YŝA¸·áÖ0>*`Wñ9FJjj8éÄ˙‡Sïç'Ödá{ñ‘W­żÇJž~™€í˽îĵıÜs+Šûꝧ‰`ŻÏíÎÎr)tÌBP´¨J¸Ç ċħ5FxËħ)ryfŬ„ĤÖô^²ï‡y…Aô9KŞè*ËĈ"Cv ğ|ĵ4é˙5ĝsíŞGO+dÀŒäĉ Á™wc†€?ÒŬm‡­^Vŝ‚‡™ŞTvE eÚDüA­ŭ{9 Œ‰ö¸ká&ž“|ĥôÏD…Ö={_wФkĦ¸O9³¤Ùê3ŻRùü"îK ĥĤİÇBĥŝĊfNî)Vzo’u éLY…cÌĠB&Ĵmĥ!cq“!H"ö˙7„ž'8D­ĉċž÷SWšîÉ!Wfßı|0“6ş’H=p’/ˆÊĥR—béƒe|¸°ĈE4ĞQVÚO=À,syêÏkk[ëxĞSŒ²tÁaŬ¸!·=5Ïíô'XÈ™ĥx‹éh7ê´udDoèv§Ĥ[ ¨Œ•Vß³F‡@òáˆÇ6nڀ“GꆀŬ0µ09v­zäxaexRxÈەëĉ˜7Ħ†½°· ?À6Ş@2sÙÙjZHËp82ŽİIϽà9 ¨§2h¤Aĥ@d]Š*c d[·ü›žÊ#ƒ…Ckr3ġ0 ÚT0£Ä„…°ŬÒ³$ù½U |M%ÚÂ(‹5Sêd¨İİ _,£•§ĵ~ħçy<Û­›Ż7pjŝA_ŬBÊĤßMHDp +ĦW֎öĦ„ ĠÂ&YÎs> ÷ĦçAJÀ Ĝ—ÉOÄ·à"żßk”SħS$€ß¨Éĉß.Ĵöù’ûoÂDì˜2Ĝ=…~;ĊHħX§Wip‘ÑOò¨óĤ¤òM^q>‰Naŝ} Ĥ%ñB1­ç9à8˙>Yşé^*ì—+iŝnÀŽñ,&{ġAùĞ4öñ 6]šD]zà÷lŸœÏ;;\@ġ>‡À´Şgŝ3 À ÷ĥ³mt Šw?hf³½ÍïÚy·hï-—oäÉ÷?ʙâzËßOĤd•,ˆÌ|ûÂö²ôĜÉ3IĊ#­bĜLÏxJêíJ÷“êòVә˰î—ÁÖ$=ġIò Jżâ.WĤej\+ĥ³N?9S]ĉñ[pOÎwĝwùR°Îżj_^>I GFh>$ÒQéhqÒW:ŞĉƒËEüZşîݵċß{&a’\ ~Gú;DîP4Ŭ’Ï{’Ğç˜B#=ٔÍRôYZ\ç_xê"‹g=}/}V Ĝ_GğœĦàXĉMÙ°W­aĞáDh޵à8`cע9§Y8~jş„-_ZĞĈ0ü#ŬÏ:G5$1Ŝ˜#8+t­|˜Ìßµ}T¸-ÏHLÔ9ĉCGŝĵa"Ŝ[q\Í_£7i°ıtĠ”2I H”ö4 U4Òyĵ²bMÇRflÖIoÔnûJENfY°M9Z~Á>ğÚġÄuĝíŻRK›PEàJyzhĝc- GìÄZo~ƒPO/Ċh¸ü3Òħ%ġ€ßِ…î3Šx Ä@˜ox4'HĤìħ |/ô X WXü µ¨Ż²û˘pŭH{Ĥñ¨Ħíè…;âÛ[]F÷ÎÛ‡_Á4š(Lk{mrŞ: "îéËyY˘{@5!’ùà¸ò¤rŒw£ŭî„fzġĊŝ|¤ßُKdKÊ>–;ò"¨Ì3ĉëö707Bmċ†§BżĠvx³KİmŒ_ê…—]ısÚŝ Ûù›7ÊÍ÷%˜ÒüreCÉ)şÌ³ÛÔd#Ï1’\Xì/³‚žĝ*ìÁÇs|DU`("IT‘˘m/½´’’m4ì?#íïjy02šĉ´·ú‚!*váó-Rz‘o`Ħŝ ÊĜç-ËgÉT,FżrĤqX›ÚTġBÂ6nżÍq£ÊÄ譏íuàí•#Kz4²h½^tN1ŜR5* ²û* ŞW¨ô,ŻáħġÏ\쐈6WÖˆ$_†}…\ĦàŝnwÖN^’¨i4*s,ϟ^½m™‚ïİĉġÎày*.GтóPôá°R1ŝS²zWx_íĜ-ĦMv%¸ëŝ¨|²„£uĊ=šjÍínj˘UA•&Ëĝaĉ³ME–B­ç›Ó35— ÉÙígaFÁâÄö:äèp•@í˘•K4ó}–Š9% 2-´YnZ Ċk >³,˙­H Ħ´½à1KQB`:•=KÚĊzTkˆá.|ÔÑ^ÙßUH%öÜĥúŭşÛûv ĥöŭş9ûuköë†ĥäĞ“öë'íÔP.ïŻOWŜç¨ŝ3I‰‰2˙w­klög„ş/9C½{OöŒŽÒ Œw1Xż˙pÌÊ2ĵŞ˙.ÒŭŝDH e€·uÉÒ-Ï/ •ıĄĞŝ E[ċ², _Ŝ‰ïzıÂ睇zŸ>°êJ­c6àğ şyXĉ.âËN° `öĊrgÙ=ŸKß BƒB™\”~_;ċÈ vëR¨b´ûôż˙˜ú Ğ•ÂD,ü%8O2”’ÄGBŝQ}6_Yż¸‰Ä¸HK‘?ƒT¸’@xö˘ÀíU!žèş4ĴyV˙ Š UN˘U^;pbÇÀBïƒsÒŞJĤŠ=Êö 6=rxqn# d@µAp zżQcV+Û§ĥr,ö#“çä#°ĥ›ï¨6˙C'ó˘™6¸Żqlż&Ĵeñ@5d˙LïÒ^@Şçqí“rK@‡hŽüğ×D_ úX4gç‰6I·V?„É/ñÖS7şÇvI|Q‰Äéàñê‰ËRn‚xµQ;E| +ŒĉĜù–}߉ßoŸ‹WġÜ8ŝŽO:@` –ħIğ'VSÎ˙û——ΗÌ@Â4X)ÖÄÈ!'è‚~Ċ=+ĜY(A‚ dy8ĝ2Ÿiĝ•Šß޸=+@ùÓVĴˆÊYĥ_¨lkkEß6XtÀF*‘ÈĉĈš“ I „ş,t˙)ÇpCÜb:m–_,gu$Àe£Ĉ^N›2-j;o:—KPVĝ}8úĠ5Ó;ü™îx8xˆ<â /“aMNvX—Jì}Fë{]ÍÊRC_oŒüÓ`dQÑ·"Ŝ~˜÷Ù(ż¤ŭO•ŭKefQŽ;?şuSO§„îë D˘9aȕ<ŜáA0ĤMĊĴĝë‚]ÉQ–PŭขݧTô~pèŞûŽ" ’0,­²½ĜŞlIZjN"ìŞÛ ½AġOĠµ’[ֈġcT /ħìîOPw‰AÑ-9 Ò2Ĵ°w§ˆ’k 7D€ä#Ċ÷Ûİ1Oû\ù•HĝG]`²bwK˜$%ˆğ:Ħ=™Ŭ™܋Lyo›ĉùo›ĉùom,Ġ&Ž{ ÛŻ›ß…:s÷-úMĴz+² –†!á1·[­­„’ċʅGg¨4'‘Sš‡WьpP wğ-"|€Ĝğ…je”ñ°oߓwóa)oáFġ†j9oÍ1=ĤqĊĜĵ­~ĝŞn›˙$O‰›ueèâÀóÙÖJìħ>1ËÍ 8Œ7Ÿ_üıž˙;Ö۝ÉmóPÓŻœ!<ŬwñŻ’KĈèÙsÀ­WŻ!+yŞï`FŻ^…| zŠîèÁŒt‘Ŝi‹^o+ /eŞ!ĉàĵhDĤ*ï{~ßTLK˃âêßW%—7×u{¤)|!ä Nw“ÍĝşJ×Y Y7Nï}U<Š5a Ċ°ÛíbYJ§ċ |™d°eCì…héWÉ@$$›ĉ›¨|D ZÜ÷<ĴpĈ;ËfĈ!sċĤv#q,8Yƒ0n4¨fS˙jĉCHĤHH|X²• Çmz91w},„P ¨úP‘Ŭ€X˘‘ùNëéĈ£Á<<Âŝĝ‡ ´Œz½;Z˘<*8ÑL×[^6W³·œ N|ŽgïbêzyBꃁ™SWÊċ‚OF£TE³Ú­nhsoSÎ\ ,d.¤Žğx}Šy£^ˆ›ġ ğċ‰h9n EĠĊRôʍtÒ‚Ì&zRÙƒï`ĝNT.‰7*öEÁÊêsè.ÛĊüNƒĦFÑğäd0@ĵ Ù.ÚËpŜ˙Mĉ5ġŝ8&ôl|X7³R@öħV`F›z†m(nñöc˙:İ[)Àà·¤÷’8 k}ş€D%Ö£b§ĵJ>6\ħ*còƒufġ!*³ÇċÂ#Ŝ°O3·ês‘ Ĵb[wN ]GrĠĠ€Mşf KG=­ĴÜJùÀLfq+ġs*ĠżOÈ£Ò·à+ŠVÚÛĵâKùoS‘[ŒÁĦ£ÉùF@Tà£Ó6˜ÁESƒŜƒzQûÁŒQfÑ#„­5ÉZŝQ$,p† ~^0“òs ĈÔğ›ħsşü³k2p â+ñQ@#í…pĵ˘¸ŜC’ġË'˙:ÇüÙ5µÀ@pÁPúrĈ›p£ÜG`Òíş°6Ž}÷bĵ#ĵ_ğ2ñ(żŭœĝĠCòxĝp„Ŭ§˙œÀƒ­šâ" Ñ%n7mûú`él~ğ™²W\xŸËš U Ĥùo&zo#ŝöoÈA!ô"Dí‚á*‰ój(×°ĵÒ\p?ĴF#.'́ÂPŽMŝIpĉhúEvßJĥ÷Vҁâğy†Â?0ɎW7Ğ’˙˙p÷ğžlxµß'™ÚTB~•—½MŜÓ*^Ñú„9RœYaÍ%^wĜ2ǵj2sôӜÎĥ…ŝ•ìW”l–svÏIו´2î5ŠŝĜÑzYžž÷CŜ.rS–KôĤúʘP9{}– żËî1šCw~ ÄNP¤[@6&÷I–p>8ĜY—f†oJdö7ZVÔL€úL>uÊñgġIi!q`›İ”€Ï'§³j?à™bÇ ÊĝPj†îŸž{|€•-RG;â,A7•ż²Š‹Gú9Œdĵ} Ëŭ{Lŭ Cîye<ƒşžġò’çßîŻNpà>r…F(N“DònğÙ:²H+™Ĵ —Zuu$·†éĠióĉy‰ĠyC•‘Ôh†êĈ^›½ŭĦ´ÙI‘7ñıßLµğèZ—ħΔ"]°x”üµè£9ßĊEž Ğ`Rĥ¨›‚Ê zÍzˉµ#{x¸½T‚oĈ~&×Îö4ċ!àĦYÔÉ çoëk~CaŒÌWGÁ?b†2­ğżŻ°LÁ› íGÓ?)™Hé9ßÇ,l:1„L0²àtµäĞß̑Z²ÙZù´öñİaç§z€ż'1+ÓÇĉòŸżÄ¨ü´œ’ŝ Żts¨˘Y8?ï"o7e‰§²{ĥqûì½ĤŸ>¸öħ‡Š³›FŒ(½İçۏc‡qŒŸŜ3š›Ŝ#;ùîmL$Á֍ùċËŬÏ˙N ,×-*ƒŬĝ^(ïŠd$;Ë@üÚìNĤÚìĜ#Ö/̨„‡¤Tu’àÊy$@qk­=s§ŜXŬ^â}f’ÈĞçGHAohÎx>(0×â{Œ‰µ@b0 wŽÂ$ñѽ4?šEòyÏC&ƒ˙kihĊ˘¤€›ÒĊ2Ê£…*žjPs™éƒIÖhtYú“î½)ĦÓ¤3›Ĝ~§reèĝĦ8ˆnÊcƒĦ à Zî˙!‚ͧ“Zö~2žGĤƒP˘i+¤"–{JCfQïĤ† !f ‚ŽíÍH|LTQÓ¤ÛmoœÜ‚-ùŭY^>‹êO3STވËZÏĦ^5İ›5à½qŽżŸĦËĈ”X?Zü·´Ġ²[•×ġ0Ĵ)cŠĤÉa:=²hr⊨(˜ĥ[báè²ËYçĜÊùóV¸‚“?a'ŻhEa¤îoÇ­eÛ@÷û&‰ò>Ik†sÛ§‘àż 4nQ™Ë- ŸHċ?NŸôG!óbòüĥk÷ċqö°kĥÛy†9ǨÇà˙Ri2LéÇv{­c•OòÜ4ê&Š ŬHñ=ĝ Ĵ>0yÛ̑ ïcİm×ċ蓁šfN‡HÊ,Ä9@pì!êr˜<ĉ*…Ġ^ÈMşš“ĈĞçÇĈçÊÔ?`f×·8÷@nƒŝ×Q–ŸtHöçVŝĉIJĴğЁĈ ^hŜ"D ŽNOİ›À6MÌÎbú3ħ}ŭċċv_˙|GĦžbíËŝĠ } 8½ֆlıñlbv @#ĥ^›`Ô\–Á³œ§úQ8€ëHm{ğ} ôüƒĤ„ 4*ŭ:Œ™aîNôJ;uĥĦëⴕȉÀö4*ŠZċÑ Pë˘ñXL].L2%Ĉ¨Ú˘ËÄĉÒjX’ȃħR5Ĥ• YKwn‰oĤÂUìÜW}aJ“¤Gğ·œċ8„xċ•×=ËŸD" Rœ0%äˆtÍ^}u9*1½²4óŻéèŭöï>Ûj³ôsî„êiĠŒwJl™ĝ‘³c/$$­€wŞünĠT;B™’҄Ĉ“1e9p9ìĉ3/àék2‹8Ğ2>~QïĞpáġŠgÓçÜkĝXhÙ£Ĵ‡£²I>ġ<–ÚK/=PÚçbF×UMĴͤ7Ì÷T{êlân Ŭ)pqTÈȋ<éÛ)\g“ŬôŸav¸B°Kù˜q.c$Òi,ém.-´ğżd5ĴNúâ‰ı 3Aâ‚s¸8|ÀğP…:*˜ÉÉFĴƒïM06x×$viŒ$aŜ.<§ú*>H—3-¸Ġt&°tÔlš§Bħħ\ċ éġ<î_;hSñġ2‰…‡âW…•ߪ(Û3?ÀÄ£}ôââ} ÀÏğ]﭅÷ĉCĈFg ĵYfÖĉQ äv$œ1y&*MbÜ0=ßہêqÇŜ˙ÙicnV Bŝffdesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/0000755000000000000000000000000012467662066020422 5ustar rootrootdesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/project.xcworkspace/0000755000000000000000000000000012467662066024420 5ustar rootrootdesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/project.xcworkspace/PaxHeaders.9136/0000755000000000000000000000000012467662066027045 5ustar rootroot././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/project.xcworkspace/PaxHeaders.9136/contents.xcworkdesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/project.xcworkspace/PaxHeaders.9136/contents.xcw0000755000000000000000000000024112467662066031425 0ustar rootroot desmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj0000755000000000000000000127332112467662066023512 0ustar rootroot// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB0038A71872A96700B0B055 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0038A61872A96700B0B055 /* Image_PaddleController.png */; }; AB0038A81872A96700B0B055 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0038A61872A96700B0B055 /* Image_PaddleController.png */; }; AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB00E87E14205EBC00DE561F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB01005E170D07B000D70FBE /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB01005D170D07B000D70FBE /* InputProfileController.mm */; }; AB01005F170D07B000D70FBE /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB01005D170D07B000D70FBE /* InputProfileController.mm */; }; AB02475C13886BF300E9F9AB /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB031B5518472F3100541888 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB0F290214BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB0F290314BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB0F290414BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB0F290514BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB0F291D14BE6F4A009ABC6F /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB0F293814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB0F293914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB0F293A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB0F293B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB0F293C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB0F293D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB0F293E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB0F293F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB0F294014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB0F294114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB0F294214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB0F294314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB0F294414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB0F294514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB0F294614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB0F294714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB0F296D14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB0F296E14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB0F297A14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB0F298C14BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB0F298D14BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB0F298E14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB0F298F14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB0F29A614BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB0F29A714BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB0F29A814BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB0F29A914BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB0F29AA14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB0F29AB14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB0F29AC14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB0F29AD14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB0F29B514BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB0F29B614BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB0F29B714BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB15CA7214A29EE500B8A6A4 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; AB1773FD182ECA8A009F29DD /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1773FC182ECA8A009F29DD /* slot2_passme.cpp */; }; AB1773FE182ECA8A009F29DD /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1773FC182ECA8A009F29DD /* slot2_passme.cpp */; }; AB1773FF182ECA8A009F29DD /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1773FC182ECA8A009F29DD /* slot2_passme.cpp */; }; AB181D0013B66889006CA82D /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB1949DB15034F900098793E /* OESoundInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABB3C6401501BB8300E0C22E /* OESoundInterface.mm */; }; AB1B9E631501A78000464647 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */; }; AB1B9E661501A78000464647 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; }; AB1F468413A0ADE400B80DE6 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB1F469813A0AE2F00B80DE6 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB23567416C2F6F400DA782E /* macosx_10_5_compat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */; }; AB23567516C2FAD800DA782E /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB26D87C16B5253D00A2305C /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB29B16218313AF5009B7982 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16118313AF5009B7982 /* slot2.cpp */; }; AB29B16318313AF5009B7982 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16118313AF5009B7982 /* slot2.cpp */; }; AB29B16418313AF5009B7982 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16118313AF5009B7982 /* slot2.cpp */; }; AB29B16618313C14009B7982 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16518313C14009B7982 /* slot2_auto.cpp */; }; AB29B16718313C14009B7982 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16518313C14009B7982 /* slot2_auto.cpp */; }; AB29B16818313C14009B7982 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16518313C14009B7982 /* slot2_auto.cpp */; }; AB29B33116D4BEBF000EF671 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB29B33016D4BEBF000EF671 /* InputManager.mm */; }; AB29B33216D4BEBF000EF671 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB29B33016D4BEBF000EF671 /* InputManager.mm */; }; AB2EE12C17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE12B17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp */; }; AB2EE12D17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE12B17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp */; }; AB2EE12E17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE12B17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp */; }; AB2EE13117D57F5000F68622 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE13017D57F5000F68622 /* fsnitro.cpp */; }; AB2EE13217D57F5000F68622 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE13017D57F5000F68622 /* fsnitro.cpp */; }; AB2EE13317D57F5000F68622 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE13017D57F5000F68622 /* fsnitro.cpp */; }; AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB74EC891738499C0026C41E /* Carbon.framework */; }; AB3A655E16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */; }; AB3A655F16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */; }; AB3A656116CC5438001F5D4A /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; AB3A656216CC5438001F5D4A /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; AB3A656316CC5438001F5D4A /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; AB3ACB7214C2361100D7D192 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB3ACB7314C2361100D7D192 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB3ACB7614C2361100D7D192 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB3ACB7714C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB3ACC3E14C24D5400D7D192 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB3ACC3F14C24D5400D7D192 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB3ACC4014C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB3ACC4114C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB40562A169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB40562B169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB40562C169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB40562D169F5DBB0016AC3E /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405602169F5DBB0016AC3E /* assert.cpp */; }; AB40562E169F5DBB0016AC3E /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405602169F5DBB0016AC3E /* assert.cpp */; }; AB40562F169F5DBB0016AC3E /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405602169F5DBB0016AC3E /* assert.cpp */; }; AB405630169F5DBB0016AC3E /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405604169F5DBB0016AC3E /* buffer.cpp */; }; AB405631169F5DBB0016AC3E /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405604169F5DBB0016AC3E /* buffer.cpp */; }; AB405632169F5DBB0016AC3E /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405604169F5DBB0016AC3E /* buffer.cpp */; }; AB405633169F5DBB0016AC3E /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405607169F5DBB0016AC3E /* compiler.cpp */; }; AB405634169F5DBB0016AC3E /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405607169F5DBB0016AC3E /* compiler.cpp */; }; AB405635169F5DBB0016AC3E /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405607169F5DBB0016AC3E /* compiler.cpp */; }; AB405636169F5DBB0016AC3E /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405609169F5DBB0016AC3E /* compilercontext.cpp */; }; AB405637169F5DBB0016AC3E /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405609169F5DBB0016AC3E /* compilercontext.cpp */; }; AB405638169F5DBB0016AC3E /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405609169F5DBB0016AC3E /* compilercontext.cpp */; }; AB405639169F5DBB0016AC3E /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */; }; AB40563A169F5DBB0016AC3E /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */; }; AB40563B169F5DBB0016AC3E /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */; }; AB40563C169F5DBB0016AC3E /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560D169F5DBB0016AC3E /* compileritem.cpp */; }; AB40563D169F5DBB0016AC3E /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560D169F5DBB0016AC3E /* compileritem.cpp */; }; AB40563E169F5DBB0016AC3E /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560D169F5DBB0016AC3E /* compileritem.cpp */; }; AB40563F169F5DBB0016AC3E /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560F169F5DBB0016AC3E /* context.cpp */; }; AB405640169F5DBB0016AC3E /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560F169F5DBB0016AC3E /* context.cpp */; }; AB405641169F5DBB0016AC3E /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560F169F5DBB0016AC3E /* context.cpp */; }; AB405642169F5DBB0016AC3E /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405611169F5DBB0016AC3E /* cpuinfo.cpp */; }; AB405643169F5DBB0016AC3E /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405611169F5DBB0016AC3E /* cpuinfo.cpp */; }; AB405644169F5DBB0016AC3E /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405611169F5DBB0016AC3E /* cpuinfo.cpp */; }; AB405645169F5DBB0016AC3E /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405613169F5DBB0016AC3E /* defs.cpp */; }; AB405646169F5DBB0016AC3E /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405613169F5DBB0016AC3E /* defs.cpp */; }; AB405647169F5DBB0016AC3E /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405613169F5DBB0016AC3E /* defs.cpp */; }; AB405648169F5DBB0016AC3E /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405615169F5DBB0016AC3E /* func.cpp */; }; AB405649169F5DBB0016AC3E /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405615169F5DBB0016AC3E /* func.cpp */; }; AB40564A169F5DBB0016AC3E /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405615169F5DBB0016AC3E /* func.cpp */; }; AB40564B169F5DBB0016AC3E /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405619169F5DBB0016AC3E /* logger.cpp */; }; AB40564C169F5DBB0016AC3E /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405619169F5DBB0016AC3E /* logger.cpp */; }; AB40564D169F5DBB0016AC3E /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405619169F5DBB0016AC3E /* logger.cpp */; }; AB40564E169F5DBB0016AC3E /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561B169F5DBB0016AC3E /* memorymanager.cpp */; }; AB40564F169F5DBB0016AC3E /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561B169F5DBB0016AC3E /* memorymanager.cpp */; }; AB405650169F5DBB0016AC3E /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561B169F5DBB0016AC3E /* memorymanager.cpp */; }; AB405651169F5DBB0016AC3E /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561D169F5DBB0016AC3E /* memorymarker.cpp */; }; AB405652169F5DBB0016AC3E /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561D169F5DBB0016AC3E /* memorymarker.cpp */; }; AB405653169F5DBB0016AC3E /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561D169F5DBB0016AC3E /* memorymarker.cpp */; }; AB405654169F5DBB0016AC3E /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561F169F5DBB0016AC3E /* operand.cpp */; }; AB405655169F5DBB0016AC3E /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561F169F5DBB0016AC3E /* operand.cpp */; }; AB405656169F5DBB0016AC3E /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561F169F5DBB0016AC3E /* operand.cpp */; }; AB405657169F5DBB0016AC3E /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405622169F5DBB0016AC3E /* stringbuilder.cpp */; }; AB405658169F5DBB0016AC3E /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405622169F5DBB0016AC3E /* stringbuilder.cpp */; }; AB405659169F5DBB0016AC3E /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405622169F5DBB0016AC3E /* stringbuilder.cpp */; }; AB40565A169F5DBB0016AC3E /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405624169F5DBB0016AC3E /* stringutil.cpp */; }; AB40565B169F5DBB0016AC3E /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405624169F5DBB0016AC3E /* stringutil.cpp */; }; AB40565C169F5DBB0016AC3E /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405624169F5DBB0016AC3E /* stringutil.cpp */; }; AB40565D169F5DBB0016AC3E /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405626169F5DBB0016AC3E /* virtualmemory.cpp */; }; AB40565E169F5DBB0016AC3E /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405626169F5DBB0016AC3E /* virtualmemory.cpp */; }; AB40565F169F5DBB0016AC3E /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405626169F5DBB0016AC3E /* virtualmemory.cpp */; }; AB405660169F5DBB0016AC3E /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405628169F5DBB0016AC3E /* zonememory.cpp */; }; AB405661169F5DBB0016AC3E /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405628169F5DBB0016AC3E /* zonememory.cpp */; }; AB405662169F5DBB0016AC3E /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405628169F5DBB0016AC3E /* zonememory.cpp */; }; AB405678169F5DCC0016AC3E /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405664169F5DCC0016AC3E /* x86assembler.cpp */; }; AB405679169F5DCC0016AC3E /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405664169F5DCC0016AC3E /* x86assembler.cpp */; }; AB40567A169F5DCC0016AC3E /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405664169F5DCC0016AC3E /* x86assembler.cpp */; }; AB40567B169F5DCC0016AC3E /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405666169F5DCC0016AC3E /* x86compiler.cpp */; }; AB40567C169F5DCC0016AC3E /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405666169F5DCC0016AC3E /* x86compiler.cpp */; }; AB40567D169F5DCC0016AC3E /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405666169F5DCC0016AC3E /* x86compiler.cpp */; }; AB40567E169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */; }; AB40567F169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */; }; AB405680169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */; }; AB405681169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */; }; AB405682169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */; }; AB405683169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */; }; AB405684169F5DCC0016AC3E /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */; }; AB405685169F5DCC0016AC3E /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */; }; AB405686169F5DCC0016AC3E /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */; }; AB405687169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */; }; AB405688169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */; }; AB405689169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */; }; AB40568A169F5DCC0016AC3E /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405670169F5DCC0016AC3E /* x86defs.cpp */; }; AB40568B169F5DCC0016AC3E /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405670169F5DCC0016AC3E /* x86defs.cpp */; }; AB40568C169F5DCC0016AC3E /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405670169F5DCC0016AC3E /* x86defs.cpp */; }; AB40568D169F5DCC0016AC3E /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405672169F5DCC0016AC3E /* x86func.cpp */; }; AB40568E169F5DCC0016AC3E /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405672169F5DCC0016AC3E /* x86func.cpp */; }; AB40568F169F5DCC0016AC3E /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405672169F5DCC0016AC3E /* x86func.cpp */; }; AB405690169F5DCC0016AC3E /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405674169F5DCC0016AC3E /* x86operand.cpp */; }; AB405691169F5DCC0016AC3E /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405674169F5DCC0016AC3E /* x86operand.cpp */; }; AB405692169F5DCC0016AC3E /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405674169F5DCC0016AC3E /* x86operand.cpp */; }; AB405693169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; }; AB405694169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; }; AB405695169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; }; AB407F371A6206FB00313213 /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB47B52C18A3F722009A42AF /* xbrz.cpp */; }; AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB47B52E18A3F722009A42AF /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB47B52C18A3F722009A42AF /* xbrz.cpp */; }; AB47B52F18A45C35009A42AF /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB47B52C18A3F722009A42AF /* xbrz.cpp */; }; AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB5648FF186E6EA8002740F4 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */; }; AB564900186E6EA8002740F4 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */; }; AB564901186E6EA8002740F4 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */; }; AB564904186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */; }; AB564905186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */; }; AB564907186E6F0C002740F4 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB564906186E6F0C002740F4 /* ForceFeedback.framework */; }; AB564908186E6F1F002740F4 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB564906186E6F0C002740F4 /* ForceFeedback.framework */; }; AB564910186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */; }; AB564911186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */; }; AB564912186E6F67002740F4 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490A186E6F67002740F4 /* Image_PassME.png */; }; AB564913186E6F67002740F4 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490A186E6F67002740F4 /* Image_PassME.png */; }; AB564914186E6F67002740F4 /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490B186E6F67002740F4 /* Image_Piano.png */; }; AB564915186E6F67002740F4 /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490B186E6F67002740F4 /* Image_Piano.png */; }; AB5785FD17176AFC002C5FC7 /* OpenEmuBase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */; }; AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB68101B187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681013187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; AB68101C187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681013187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; AB68101D187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681014187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; AB68101E187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681014187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; AB68101F187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681015187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; AB681020187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681015187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; AB681021187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681016187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; AB681022187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681016187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; AB681025187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681018187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png */; }; AB681026187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681018187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png */; }; AB681027187D4AEF0049F2C2 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681019187D4AEF0049F2C2 /* Icon_Piano_256x256.png */; }; AB681028187D4AEF0049F2C2 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681019187D4AEF0049F2C2 /* Icon_Piano_256x256.png */; }; AB68A0DD16B139BC00DE0546 /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB6FBEF6139B6258007BB045 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB74EC8A1738499C0026C41E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB74EC891738499C0026C41E /* Carbon.framework */; }; AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB796C9C15CDCB0F00C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB796C9F15CDCB0F00C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB796CA715CDCBA200C59155 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB796CA815CDCBA200C59155 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB796CA915CDCBA200C59155 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB796CAA15CDCBA200C59155 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB796CAB15CDCBA200C59155 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB796CAC15CDCBA200C59155 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB796CAD15CDCBA200C59155 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB796CAE15CDCBA200C59155 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB796CAF15CDCBA200C59155 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB796CB015CDCBA200C59155 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB796CB115CDCBA200C59155 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB796CB215CDCBA200C59155 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB796CB315CDCBA200C59155 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB796CB415CDCBA200C59155 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB796CB515CDCBA200C59155 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB796CB615CDCBA200C59155 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB796CB715CDCBA200C59155 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB796CB815CDCBA200C59155 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB796CB915CDCBA200C59155 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB796CBA15CDCBA200C59155 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB796CBB15CDCBA200C59155 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB796CBC15CDCBA200C59155 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB796CBD15CDCBA200C59155 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB796CBE15CDCBA200C59155 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB796CBF15CDCBA200C59155 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB796CC015CDCBA200C59155 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB796CC115CDCBA200C59155 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB796CC215CDCBA200C59155 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB796CC315CDCBA200C59155 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB796CC415CDCBA200C59155 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB796CC515CDCBA200C59155 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB796CC615CDCBA200C59155 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB796CC715CDCBA200C59155 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB796CC815CDCBA200C59155 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB796CC915CDCBA200C59155 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB796CCA15CDCBA200C59155 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB796CCB15CDCBA200C59155 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB796CCC15CDCBA200C59155 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB796CCD15CDCBA200C59155 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB796CCE15CDCBA200C59155 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB796CCF15CDCBA200C59155 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB796CD015CDCBA200C59155 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB796CD115CDCBA200C59155 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB796CD215CDCBA200C59155 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB796CD315CDCBA200C59155 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB796CD415CDCBA200C59155 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB796CD515CDCBA200C59155 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB796CD615CDCBA200C59155 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB796CD715CDCBA200C59155 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB796CD815CDCBA200C59155 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB796CD915CDCBA200C59155 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB796CDA15CDCBA200C59155 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB796CDB15CDCBA200C59155 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB796CDC15CDCBA200C59155 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB796CDD15CDCBA200C59155 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB796CDE15CDCBA200C59155 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB796CDF15CDCBA200C59155 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB796CE015CDCBA200C59155 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB796CE215CDCBA200C59155 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB796CE315CDCBA200C59155 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB796CE415CDCBA200C59155 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB796CE515CDCBA200C59155 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB796CE615CDCBA200C59155 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB796CE715CDCBA200C59155 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB796CE815CDCBA200C59155 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB796CE915CDCBA200C59155 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB796CEA15CDCBA200C59155 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB796CEB15CDCBA200C59155 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB796CEC15CDCBA200C59155 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB796CED15CDCBA200C59155 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB796CEF15CDCBA200C59155 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB796CF015CDCBA200C59155 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; AB796CF215CDCBA200C59155 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB796CF315CDCBA200C59155 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB796CF415CDCBA200C59155 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB796CF515CDCBA200C59155 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB796CF615CDCBA200C59155 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB796CF715CDCBA200C59155 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB796CF815CDCBA200C59155 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB796CF915CDCBA200C59155 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; AB796CFA15CDCBA200C59155 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB796CFB15CDCBA200C59155 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB796CFC15CDCBA200C59155 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB796CFD15CDCBA200C59155 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB796CFE15CDCBA200C59155 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB796CFF15CDCBA200C59155 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB796D0015CDCBA200C59155 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB796D0115CDCBA200C59155 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB796D0215CDCBA200C59155 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB796D0315CDCBA200C59155 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB796D0415CDCBA200C59155 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB796D0515CDCBA200C59155 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB796D0615CDCBA200C59155 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB796D0715CDCBA200C59155 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB796D0815CDCBA200C59155 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; AB796D0915CDCBA200C59155 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB796D0A15CDCBA200C59155 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB796D0B15CDCBA200C59155 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; AB796D0C15CDCBA200C59155 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB796D0D15CDCBA200C59155 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB796D0E15CDCBA200C59155 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB796D0F15CDCBA200C59155 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB796D1015CDCBA200C59155 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB796D1115CDCBA200C59155 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB796D1215CDCBA200C59155 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB796D1315CDCBA200C59155 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB796D1415CDCBA200C59155 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB796D1515CDCBA200C59155 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB796D1615CDCBA200C59155 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB796D1715CDCBA200C59155 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB796D1815CDCBA200C59155 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB796D1915CDCBA200C59155 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB796D1A15CDCBA200C59155 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB796D1B15CDCBA200C59155 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; AB796D1C15CDCBA200C59155 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB796D1D15CDCBA200C59155 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB796D1E15CDCBA200C59155 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB796D1F15CDCBA200C59155 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB796D2015CDCBA200C59155 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB796D2115CDCBA200C59155 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB796D2215CDCBA200C59155 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; AB796D2315CDCBA200C59155 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB796D2415CDCBA200C59155 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB796D2515CDCBA200C59155 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB796D2615CDCBA200C59155 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB796D2715CDCBA200C59155 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB796D2815CDCBA200C59155 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB796D2915CDCBA200C59155 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB796D2A15CDCBA200C59155 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB796D2C15CDCBA200C59155 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB796D2D15CDCBA200C59155 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB796D2E15CDCBA200C59155 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB796D2F15CDCBA200C59155 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB796D3015CDCBA200C59155 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB796D3115CDCBA200C59155 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB796D3215CDCBA200C59155 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB796D3315CDCBA200C59155 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB796D3415CDCBA200C59155 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB796D3515CDCBA200C59155 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB796D3615CDCBA200C59155 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB796D3715CDCBA200C59155 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; AB796D3815CDCBA200C59155 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB796D3915CDCBA200C59155 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; AB796D3A15CDCBA200C59155 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB796D3B15CDCBA200C59155 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; AB796D3C15CDCBA200C59155 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB796D3D15CDCBA200C59155 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB796D3E15CDCBA200C59155 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB796D3F15CDCBA200C59155 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB796D4015CDCBA200C59155 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB796D4115CDCBA200C59155 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB796D4215CDCBA200C59155 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB796D4315CDCBA200C59155 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB796D4415CDCBA200C59155 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB796D4515CDCBA200C59155 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB796D4615CDCBA200C59155 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; AB796D4715CDCBA200C59155 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB796D4815CDCBA200C59155 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB796D4915CDCBA200C59155 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB796D4A15CDCBA200C59155 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB796D4B15CDCBA200C59155 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB796D5415CDCBA200C59155 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB796D5515CDCBA200C59155 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB796D5615CDCBA200C59155 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB796D5915CDCBA200C59155 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB796D5A15CDCBA200C59155 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB796D5B15CDCBA200C59155 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB796D5C15CDCBA200C59155 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB796D5D15CDCBA200C59155 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB796D5E15CDCBA200C59155 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB796D5F15CDCBA200C59155 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB796D6015CDCBA200C59155 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB796D6115CDCBA200C59155 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB796D6215CDCBA200C59155 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */; }; AB796D6315CDCBA200C59155 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; }; AB796D6415CDCBA200C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB796D6C15CDCBA200C59155 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB7EC7F4189B2B92009D198A /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F2189B2B92009D198A /* Icon_AutoholdClear_420x420.png */; }; AB7EC7F5189B2B92009D198A /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F2189B2B92009D198A /* Icon_AutoholdClear_420x420.png */; }; AB7EC7F6189B2B92009D198A /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F3189B2B92009D198A /* Icon_AutoholdSet_420x420.png */; }; AB7EC7F7189B2B92009D198A /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F3189B2B92009D198A /* Icon_AutoholdSet_420x420.png */; }; AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB82445B1704AE9A00B8EE20 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB82445A1704AE9A00B8EE20 /* utilities.c */; }; AB82445C1704AE9A00B8EE20 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB82445A1704AE9A00B8EE20 /* utilities.c */; }; AB82445D1704AE9A00B8EE20 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB82445A1704AE9A00B8EE20 /* utilities.c */; }; AB8967D916D2ED0700F826F1 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */; }; AB8967DA16D2ED0700F826F1 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */; }; AB8967DD16D2ED2700F826F1 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */; }; AB8967DE16D2ED2700F826F1 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */; }; AB8B7AAC17CE8C440051CEBF /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB8B7AAB17CE8C440051CEBF /* slot1comp_protocol.cpp */; }; AB8B7AAD17CE8C440051CEBF /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB8B7AAB17CE8C440051CEBF /* slot1comp_protocol.cpp */; }; AB8B7AAE17CE8C440051CEBF /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB8B7AAB17CE8C440051CEBF /* slot1comp_protocol.cpp */; }; AB8F3C1A1A53AC2600A80BF6 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB8F3C1B1A53AC2600A80BF6 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB8F3C1C1A53AC2600A80BF6 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB8F3C1D1A53AC2600A80BF6 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB8F3C1E1A53AC2600A80BF6 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB8F3C1F1A53AC2600A80BF6 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB8F3C201A53AC2600A80BF6 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB8F3C211A53AC2600A80BF6 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB8F3C221A53AC2600A80BF6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB8F3C231A53AC2600A80BF6 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB8F3C241A53AC2600A80BF6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB8F3C251A53AC2600A80BF6 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB8F3C261A53AC2600A80BF6 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB8F3C271A53AC2600A80BF6 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB8F3C281A53AC2600A80BF6 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB8F3C291A53AC2600A80BF6 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB8F3C2A1A53AC2600A80BF6 /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490B186E6F67002740F4 /* Image_Piano.png */; }; AB8F3C2B1A53AC2600A80BF6 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB8F3C2C1A53AC2600A80BF6 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB8F3C2D1A53AC2600A80BF6 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB8F3C2E1A53AC2600A80BF6 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB8F3C2F1A53AC2600A80BF6 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C81898F032007583C1 /* Icon_FrameJump_420x420.png */; }; AB8F3C301A53AC2600A80BF6 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB8F3C311A53AC2600A80BF6 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB8F3C321A53AC2600A80BF6 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB8F3C331A53AC2600A80BF6 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB8F3C341A53AC2600A80BF6 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB8F3C351A53AC2600A80BF6 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB8F3C361A53AC2600A80BF6 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB8F3C371A53AC2600A80BF6 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB8F3C381A53AC2600A80BF6 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB8F3C391A53AC2600A80BF6 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB8F3C3A1A53AC2600A80BF6 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB8F3C3B1A53AC2600A80BF6 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB8F3C3C1A53AC2600A80BF6 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB8F3C3D1A53AC2600A80BF6 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB8F3C3E1A53AC2600A80BF6 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB8F3C3F1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681014187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; AB8F3C401A53AC2600A80BF6 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB8F3C411A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681013187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; AB8F3C421A53AC2600A80BF6 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB8F3C431A53AC2600A80BF6 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB8F3C441A53AC2600A80BF6 /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */; }; AB8F3C451A53AC2600A80BF6 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB8F3C461A53AC2600A80BF6 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB8F3C471A53AC2600A80BF6 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB8F3C481A53AC2600A80BF6 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB8F3C491A53AC2600A80BF6 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB8F3C4A1A53AC2600A80BF6 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490A186E6F67002740F4 /* Image_PassME.png */; }; AB8F3C4B1A53AC2600A80BF6 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681018187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png */; }; AB8F3C4C1A53AC2600A80BF6 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB8F3C4D1A53AC2600A80BF6 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB8F3C4E1A53AC2600A80BF6 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB8F3C4F1A53AC2600A80BF6 /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F2189B2B92009D198A /* Icon_AutoholdClear_420x420.png */; }; AB8F3C501A53AC2600A80BF6 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C41898F024007583C1 /* Icon_DisplayToggle_420x420.png */; }; AB8F3C511A53AC2600A80BF6 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB8F3C521A53AC2600A80BF6 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB8F3C531A53AC2600A80BF6 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB8F3C541A53AC2600A80BF6 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB8F3C551A53AC2600A80BF6 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681019187D4AEF0049F2C2 /* Icon_Piano_256x256.png */; }; AB8F3C561A53AC2600A80BF6 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C71898F032007583C1 /* Icon_FrameAdvance_420x420.png */; }; AB8F3C571A53AC2600A80BF6 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB8F3C581A53AC2600A80BF6 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB8F3C591A53AC2600A80BF6 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB8F3C5A1A53AC2600A80BF6 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB8F3C5B1A53AC2600A80BF6 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB8F3C5C1A53AC2600A80BF6 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0038A61872A96700B0B055 /* Image_PaddleController.png */; }; AB8F3C5D1A53AC2600A80BF6 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB8F3C5E1A53AC2600A80BF6 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB8F3C5F1A53AC2600A80BF6 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB8F3C601A53AC2600A80BF6 /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F3189B2B92009D198A /* Icon_AutoholdSet_420x420.png */; }; AB8F3C621A53AC2600A80BF6 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB8F3C631A53AC2600A80BF6 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB8F3C641A53AC2600A80BF6 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB8F3C651A53AC2600A80BF6 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB8F3C661A53AC2600A80BF6 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB8F3C671A53AC2600A80BF6 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB8F3C681A53AC2600A80BF6 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB8F3C691A53AC2600A80BF6 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB8F3C6A1A53AC2600A80BF6 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB8F3C6B1A53AC2600A80BF6 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB8F3C6C1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681015187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; AB8F3C6D1A53AC2600A80BF6 /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAB454E187CDB70007BE20C /* Image_GuitarGrip.png */; }; AB8F3C6E1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = AB681016187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; AB8F3C6F1A53AC2600A80BF6 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB8F3C701A53AC2600A80BF6 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB8F3C711A53AC2600A80BF6 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */; }; AB8F3C741A53AC2600A80BF6 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB8F3C751A53AC2600A80BF6 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; AB8F3C761A53AC2600A80BF6 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB8F3C771A53AC2600A80BF6 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB8F3C781A53AC2600A80BF6 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB8F3C791A53AC2600A80BF6 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB8F3C7A1A53AC2600A80BF6 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB8F3C7B1A53AC2600A80BF6 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16518313C14009B7982 /* slot2_auto.cpp */; }; AB8F3C7C1A53AC2600A80BF6 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB8F3C7D1A53AC2600A80BF6 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB8F3C7E1A53AC2600A80BF6 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; AB8F3C7F1A53AC2600A80BF6 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB8F3C801A53AC2600A80BF6 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB8F3C811A53AC2600A80BF6 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB8F3C821A53AC2600A80BF6 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB8F3C831A53AC2600A80BF6 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB8F3C841A53AC2600A80BF6 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB8F3C851A53AC2600A80BF6 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB8F3C861A53AC2600A80BF6 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB8F3C871A53AC2600A80BF6 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB8F3C881A53AC2600A80BF6 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB8F3C891A53AC2600A80BF6 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB8F3C8A1A53AC2600A80BF6 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB8F3C8B1A53AC2600A80BF6 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB8F3C8C1A53AC2600A80BF6 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB8F3C8D1A53AC2600A80BF6 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; AB8F3C8E1A53AC2600A80BF6 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB8F3C8F1A53AC2600A80BF6 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE12B17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp */; }; AB8F3C901A53AC2600A80BF6 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB8F3C911A53AC2600A80BF6 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; AB8F3C921A53AC2600A80BF6 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB8F3C931A53AC2600A80BF6 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB8F3C941A53AC2600A80BF6 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB8F3C951A53AC2600A80BF6 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB8F3C961A53AC2600A80BF6 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB8F3C971A53AC2600A80BF6 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB8F3C981A53AC2600A80BF6 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB8F3C991A53AC2600A80BF6 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB8F3C9A1A53AC2600A80BF6 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB8F3C9B1A53AC2600A80BF6 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB8F3C9C1A53AC2600A80BF6 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB8F3C9D1A53AC2600A80BF6 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB8F3C9E1A53AC2600A80BF6 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB8F3C9F1A53AC2600A80BF6 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB8F3CA01A53AC2600A80BF6 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB8F3CA11A53AC2600A80BF6 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; AB8F3CA21A53AC2600A80BF6 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB8F3CA31A53AC2600A80BF6 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB29B16118313AF5009B7982 /* slot2.cpp */; }; AB8F3CA41A53AC2600A80BF6 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB8F3CA51A53AC2600A80BF6 /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */; }; AB8F3CA61A53AC2600A80BF6 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB8F3CA71A53AC2600A80BF6 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB8F3CA81A53AC2600A80BF6 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB8F3CA91A53AC2600A80BF6 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; AB8F3CAA1A53AC2600A80BF6 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB8F3CAB1A53AC2600A80BF6 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB8F3CAC1A53AC2600A80BF6 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB8F3CAD1A53AC2600A80BF6 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB8F3CAE1A53AC2600A80BF6 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB8F3CAF1A53AC2600A80BF6 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB8F3CB01A53AC2600A80BF6 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB8F3CB11A53AC2600A80BF6 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB8F3CB21A53AC2600A80BF6 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB8F3CB31A53AC2600A80BF6 /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABCFA9F3178BDE920030C8BA /* encrypt.cpp */; }; AB8F3CB41A53AC2600A80BF6 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB8F3CB51A53AC2600A80BF6 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB8F3CB61A53AC2600A80BF6 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB8F3CB71A53AC2600A80BF6 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB8F3CB81A53AC2600A80BF6 /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6840B189E33BC007FD69C /* OGLDisplayOutput.cpp */; }; AB8F3CB91A53AC2600A80BF6 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB8F3CBA1A53AC2600A80BF6 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB8F3CBB1A53AC2600A80BF6 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB8F3CBC1A53AC2600A80BF6 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB8F3CBD1A53AC2600A80BF6 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB8F3CBE1A53AC2600A80BF6 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB8F3CBF1A53AC2600A80BF6 /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */; }; AB8F3CC01A53AC2600A80BF6 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; AB8F3CC11A53AC2600A80BF6 /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A917C5ED2200F410BD /* slot1_retail_auto.cpp */; }; AB8F3CC21A53AC2600A80BF6 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB8F3CC31A53AC2600A80BF6 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; AB8F3CC41A53AC2600A80BF6 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB8F3CC51A53AC2600A80BF6 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; AB8F3CC61A53AC2600A80BF6 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB8F3CC71A53AC2600A80BF6 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB8F3CC81A53AC2600A80BF6 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB8F3CC91A53AC2600A80BF6 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB8F3CCA1A53AC2600A80BF6 /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AB17C5ED2200F410BD /* slot1comp_mc.cpp */; }; AB8F3CCB1A53AC2600A80BF6 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB8F3CCC1A53AC2600A80BF6 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB8F3CCD1A53AC2600A80BF6 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB8F3CCE1A53AC2600A80BF6 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB8F3CCF1A53AC2600A80BF6 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB8F3CD01A53AC2600A80BF6 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB8F3CD11A53AC2600A80BF6 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1773FC182ECA8A009F29DD /* slot2_passme.cpp */; }; AB8F3CD21A53AC2600A80BF6 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; AB8F3CD31A53AC2600A80BF6 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB8F3CD41A53AC2600A80BF6 /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AA17C5ED2200F410BD /* slot1_retail_mcrom.cpp */; }; AB8F3CD51A53AC2600A80BF6 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB8F3CD61A53AC2600A80BF6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB8F3CD71A53AC2600A80BF6 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB8F3CD81A53AC2600A80BF6 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB8F3CD91A53AC2600A80BF6 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB8F3CDA1A53AC2600A80BF6 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB8F3CDB1A53AC2600A80BF6 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB8F3CDC1A53AC2600A80BF6 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB8F3CDD1A53AC2600A80BF6 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB8F3CDE1A53AC2600A80BF6 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB8F3CDF1A53AC2600A80BF6 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB8F3CE01A53AC2600A80BF6 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB8F3CE11A53AC2600A80BF6 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB8B7AAB17CE8C440051CEBF /* slot1comp_protocol.cpp */; }; AB8F3CE21A53AC2600A80BF6 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB8F3CE31A53AC2600A80BF6 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB8F3CE41A53AC2600A80BF6 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB8F3CE51A53AC2600A80BF6 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB8F3CE61A53AC2600A80BF6 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB8F3CE71A53AC2600A80BF6 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB8F3CE81A53AC2600A80BF6 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB8F3CE91A53AC2600A80BF6 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB8F3CEA1A53AC2600A80BF6 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB8F3CEB1A53AC2600A80BF6 /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A517C5ECFD00F410BD /* advanscene.cpp */; }; AB8F3CEC1A53AC2600A80BF6 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB8F3CED1A53AC2600A80BF6 /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB47B52C18A3F722009A42AF /* xbrz.cpp */; }; AB8F3CEE1A53AC2600A80BF6 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB8F3CEF1A53AC2600A80BF6 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */; }; AB8F3CF01A53AC2600A80BF6 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; }; AB8F3CF11A53AC2600A80BF6 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB8F3CF21A53AC2600A80BF6 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */; }; AB8F3CF31A53AC2600A80BF6 /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB8F3CF41A53AC2600A80BF6 /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405602169F5DBB0016AC3E /* assert.cpp */; }; AB8F3CF51A53AC2600A80BF6 /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405604169F5DBB0016AC3E /* buffer.cpp */; }; AB8F3CF61A53AC2600A80BF6 /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405607169F5DBB0016AC3E /* compiler.cpp */; }; AB8F3CF71A53AC2600A80BF6 /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405609169F5DBB0016AC3E /* compilercontext.cpp */; }; AB8F3CF81A53AC2600A80BF6 /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */; }; AB8F3CF91A53AC2600A80BF6 /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560D169F5DBB0016AC3E /* compileritem.cpp */; }; AB8F3CFA1A53AC2600A80BF6 /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560F169F5DBB0016AC3E /* context.cpp */; }; AB8F3CFB1A53AC2600A80BF6 /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405611169F5DBB0016AC3E /* cpuinfo.cpp */; }; AB8F3CFC1A53AC2600A80BF6 /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405613169F5DBB0016AC3E /* defs.cpp */; }; AB8F3CFD1A53AC2600A80BF6 /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405615169F5DBB0016AC3E /* func.cpp */; }; AB8F3CFE1A53AC2600A80BF6 /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405619169F5DBB0016AC3E /* logger.cpp */; }; AB8F3CFF1A53AC2600A80BF6 /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561B169F5DBB0016AC3E /* memorymanager.cpp */; }; AB8F3D001A53AC2600A80BF6 /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561D169F5DBB0016AC3E /* memorymarker.cpp */; }; AB8F3D011A53AC2600A80BF6 /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561F169F5DBB0016AC3E /* operand.cpp */; }; AB8F3D021A53AC2600A80BF6 /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405622169F5DBB0016AC3E /* stringbuilder.cpp */; }; AB8F3D031A53AC2600A80BF6 /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405624169F5DBB0016AC3E /* stringutil.cpp */; }; AB8F3D041A53AC2600A80BF6 /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405626169F5DBB0016AC3E /* virtualmemory.cpp */; }; AB8F3D051A53AC2600A80BF6 /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405628169F5DBB0016AC3E /* zonememory.cpp */; }; AB8F3D061A53AC2600A80BF6 /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405664169F5DCC0016AC3E /* x86assembler.cpp */; }; AB8F3D071A53AC2600A80BF6 /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405666169F5DCC0016AC3E /* x86compiler.cpp */; }; AB8F3D081A53AC2600A80BF6 /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */; }; AB8F3D091A53AC2600A80BF6 /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */; }; AB8F3D0A1A53AC2600A80BF6 /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */; }; AB8F3D0B1A53AC2600A80BF6 /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */; }; AB8F3D0C1A53AC2600A80BF6 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */; }; AB8F3D0D1A53AC2600A80BF6 /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405670169F5DCC0016AC3E /* x86defs.cpp */; }; AB8F3D0E1A53AC2600A80BF6 /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405672169F5DCC0016AC3E /* x86func.cpp */; }; AB8F3D0F1A53AC2600A80BF6 /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405674169F5DCC0016AC3E /* x86operand.cpp */; }; AB8F3D101A53AC2600A80BF6 /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; }; AB8F3D111A53AC2600A80BF6 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2EE13017D57F5000F68622 /* fsnitro.cpp */; }; AB8F3D121A53AC2600A80BF6 /* macosx_10_5_compat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */; }; AB8F3D131A53AC2600A80BF6 /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB8F3D141A53AC2600A80BF6 /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */; }; AB8F3D151A53AC2600A80BF6 /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; AB8F3D161A53AC2600A80BF6 /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AD17C5ED2200F410BD /* slot1comp_rom.cpp */; }; AB8F3D171A53AC2600A80BF6 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */; }; AB8F3D181A53AC2600A80BF6 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB29B33016D4BEBF000EF671 /* InputManager.mm */; }; AB8F3D191A53AC2600A80BF6 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB82445A1704AE9A00B8EE20 /* utilities.c */; }; AB8F3D1A1A53AC2600A80BF6 /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB01005D170D07B000D70FBE /* InputProfileController.mm */; }; AB8F3D1B1A53AC2600A80BF6 /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; }; AB8F3D1C1A53AC2600A80BF6 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; }; AB8F3D1D1A53AC2600A80BF6 /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */; }; AB8F3D1F1A53AC2600A80BF6 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB8F3D201A53AC2600A80BF6 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB8F3D211A53AC2600A80BF6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; }; AB8F3D221A53AC2600A80BF6 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB8F3D231A53AC2600A80BF6 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB74EC891738499C0026C41E /* Carbon.framework */; }; AB8F3D241A53AC2600A80BF6 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB8F3D251A53AC2600A80BF6 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB564906186E6F0C002740F4 /* ForceFeedback.framework */; }; AB8F3D261A53AC2600A80BF6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB8F3D271A53AC2600A80BF6 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB8F3D281A53AC2600A80BF6 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB8F3D291A53AC2600A80BF6 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB901BDE1420706100348EEC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB9038A617C5ECFD00F410BD /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A517C5ECFD00F410BD /* advanscene.cpp */; }; AB9038A717C5ECFD00F410BD /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A517C5ECFD00F410BD /* advanscene.cpp */; }; AB9038A817C5ECFD00F410BD /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A517C5ECFD00F410BD /* advanscene.cpp */; }; AB9038AF17C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A917C5ED2200F410BD /* slot1_retail_auto.cpp */; }; AB9038B017C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A917C5ED2200F410BD /* slot1_retail_auto.cpp */; }; AB9038B117C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A917C5ED2200F410BD /* slot1_retail_auto.cpp */; }; AB9038B217C5ED2200F410BD /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AA17C5ED2200F410BD /* slot1_retail_mcrom.cpp */; }; AB9038B317C5ED2200F410BD /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AA17C5ED2200F410BD /* slot1_retail_mcrom.cpp */; }; AB9038B417C5ED2200F410BD /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AA17C5ED2200F410BD /* slot1_retail_mcrom.cpp */; }; AB9038B517C5ED2200F410BD /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AB17C5ED2200F410BD /* slot1comp_mc.cpp */; }; AB9038B617C5ED2200F410BD /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AB17C5ED2200F410BD /* slot1comp_mc.cpp */; }; AB9038B717C5ED2200F410BD /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AB17C5ED2200F410BD /* slot1comp_mc.cpp */; }; AB9038B817C5ED2200F410BD /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AD17C5ED2200F410BD /* slot1comp_rom.cpp */; }; AB9038B917C5ED2200F410BD /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AD17C5ED2200F410BD /* slot1comp_rom.cpp */; }; AB9038BA17C5ED2200F410BD /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038AD17C5ED2200F410BD /* slot1comp_rom.cpp */; }; AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; ABAB454F187CDB70007BE20C /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAB454E187CDB70007BE20C /* Image_GuitarGrip.png */; }; ABAB4550187CDB70007BE20C /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAB454E187CDB70007BE20C /* Image_GuitarGrip.png */; }; ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; }; ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; }; ABACB8DE1710B65F003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; }; ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; ABAD3E7613AF1D6D00502E1E /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; ABAD3E7713AF1D6D00502E1E /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; ABAD3E7813AF1D6D00502E1E /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; ABAD3E7913AF1D6D00502E1E /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; ABAD3E7A13AF1D6D00502E1E /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; ABAD3E7B13AF1D6D00502E1E /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; ABAF0A411A96E67200B95B75 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */; }; ABAF0A421A96E67200B95B75 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */; }; ABAF0A431A96E67200B95B75 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */; }; ABB0FBC51A9E5CEA0060C55A /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; }; ABB0FBC61A9E5D070060C55A /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; }; ABB0FBC71A9E5D080060C55A /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; }; ABB0FBCC1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */; }; ABB0FBCD1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */; }; ABB0FBCE1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */; }; ABB0FBCF1A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */; }; ABB0FBD01A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */; }; ABB0FBD11A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */; }; ABB0FBD21A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */; }; ABB0FBD31A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */; }; ABB0FBD41A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */; }; ABB0FBD51A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */; }; ABB0FBD61A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */; }; ABB0FBD71A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */; }; ABB0FBD91A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */; }; ABB0FBDA1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */; }; ABB0FBDB1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */; }; ABB24F6D1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */; }; ABB24F6E1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */; }; ABB24F6F1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */; }; ABB3C6621501BF4E00E0C22E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; ABB3C6631501BF4E00E0C22E /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; ABB3C6641501BF8A00E0C22E /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABB3C6651501BF8A00E0C22E /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; ABB3C6691501BF8A00E0C22E /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABB3C66A1501BF8A00E0C22E /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; ABB3C66C1501C04F00E0C22E /* NDSGameCore.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABB3C63E1501BB8300E0C22E /* NDSGameCore.mm */; }; ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; ABB3C6781501C04F00E0C22E /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; ABB3C6791501C04F00E0C22E /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; ABB3C67A1501C04F00E0C22E /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; ABB3C67C1501C04F00E0C22E /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; ABB3C67D1501C04F00E0C22E /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; ABB3C67E1501C04F00E0C22E /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; ABB3C67F1501C04F00E0C22E /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; ABB3C6801501C04F00E0C22E /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; ABB3C6811501C04F00E0C22E /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; ABB3C6821501C04F00E0C22E /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; ABB3C6831501C04F00E0C22E /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; ABB3C6841501C04F00E0C22E /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABB3C6851501C04F00E0C22E /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABB3C6861501C04F00E0C22E /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABB3C6871501C04F00E0C22E /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABB3C6881501C04F00E0C22E /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABB3C6891501C04F00E0C22E /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABB3C68A1501C04F00E0C22E /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; ABB3C68B1501C04F00E0C22E /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; ABB3C68C1501C04F00E0C22E /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; ABB3C68D1501C04F00E0C22E /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; ABB3C68E1501C04F00E0C22E /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; ABB3C68F1501C04F00E0C22E /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; ABB3C6901501C04F00E0C22E /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; ABB3C6911501C04F00E0C22E /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; ABB3C6921501C04F00E0C22E /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; ABB3C6931501C04F00E0C22E /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; ABB3C6941501C04F00E0C22E /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; ABB3C6951501C04F00E0C22E /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; ABB3C6961501C04F00E0C22E /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; ABB3C6971501C04F00E0C22E /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; ABB3C6981501C04F00E0C22E /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; ABB3C6991501C04F00E0C22E /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; ABB3C69A1501C04F00E0C22E /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; ABB3C69B1501C04F00E0C22E /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; ABB3C69C1501C04F00E0C22E /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; ABB3C69D1501C04F00E0C22E /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; ABB3C69E1501C04F00E0C22E /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; ABB3C69F1501C04F00E0C22E /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; ABB3C6A01501C04F00E0C22E /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; ABB3C6A11501C04F00E0C22E /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; ABB3C6A21501C04F00E0C22E /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; ABB3C6A31501C04F00E0C22E /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; ABB3C6A41501C04F00E0C22E /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; ABB3C6A51501C04F00E0C22E /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; ABB3C6A61501C04F00E0C22E /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; ABB3C6A71501C04F00E0C22E /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; ABB3C6A81501C04F00E0C22E /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; ABB3C6A91501C04F00E0C22E /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; ABB3C6AA1501C04F00E0C22E /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; ABB3C6AB1501C04F00E0C22E /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; ABB3C6AC1501C04F00E0C22E /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; ABB3C6AD1501C04F00E0C22E /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; ABB3C6AE1501C04F00E0C22E /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; ABB3C6AF1501C04F00E0C22E /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; ABB3C6B01501C04F00E0C22E /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; ABB3C6B11501C04F00E0C22E /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; ABB3C6B21501C04F00E0C22E /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; ABB3C6B41501C04F00E0C22E /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; ABB3C6B51501C04F00E0C22E /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; ABB3C6B61501C04F00E0C22E /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; ABB3C6B71501C04F00E0C22E /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; ABB3C6B81501C04F00E0C22E /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; ABB3C6B91501C04F00E0C22E /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; ABB3C6BA1501C04F00E0C22E /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; ABB3C6BB1501C04F00E0C22E /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; ABB3C6BC1501C04F00E0C22E /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; ABB3C6BD1501C04F00E0C22E /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; ABB3C6BE1501C04F00E0C22E /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; ABB3C6BF1501C04F00E0C22E /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; ABB3C6C01501C04F00E0C22E /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; ABB3C6C11501C04F00E0C22E /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; ABB3C6C21501C04F00E0C22E /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; ABB3C6C31501C04F00E0C22E /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; ABB3C6C41501C04F00E0C22E /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; ABB3C6C61501C04F00E0C22E /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; ABB3C6C71501C04F00E0C22E /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; ABB3C6C81501C04F00E0C22E /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; ABB3C6C91501C04F00E0C22E /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; ABB3C6CA1501C04F00E0C22E /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; ABB3C6CB1501C04F00E0C22E /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; ABB3C6CC1501C04F00E0C22E /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; ABB3C6CD1501C04F00E0C22E /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; ABB3C6CE1501C04F00E0C22E /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; ABB3C6CF1501C04F00E0C22E /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; ABB3C6D01501C04F00E0C22E /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; ABB3C6D11501C04F00E0C22E /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; ABB3C6D31501C04F00E0C22E /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; ABB3C6D41501C04F00E0C22E /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; ABB3C6D51501C04F00E0C22E /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; ABB3C6D61501C04F00E0C22E /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; ABB3C6D71501C04F00E0C22E /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; ABB97876144E89CC00793FA3 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; ABB97877144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; ABB97878144E89CC00793FA3 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; ABBC0F8D1394B1AA0028B6BD /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; ABBF04A514B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; ABC3AF2F14B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; ABC503AD1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABC503AE1AAC2B90002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABC503AF1AAC2B91002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABC503B01AAC42C2002FCD43 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */; }; ABC503B11AAC4355002FCD43 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; }; ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; ABCFA9F4178BDE920030C8BA /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABCFA9F3178BDE920030C8BA /* encrypt.cpp */; }; ABCFA9F5178BDE920030C8BA /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABCFA9F3178BDE920030C8BA /* encrypt.cpp */; }; ABCFA9F6178BDE920030C8BA /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABCFA9F3178BDE920030C8BA /* encrypt.cpp */; }; ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; ABD104281346653B00AF11D1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; ABD10AE71715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; }; ABD10AE81715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; }; ABD10AE91715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; }; ABD10AEA1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; }; ABD10AEB1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; }; ABD10AEC1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; }; ABD10AED17160C9300B5729D /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; }; ABD10AEE17160CDD00B5729D /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; ABD1FED41345AC8400AF11D1 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; ABD1FED51345AC8400AF11D1 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; ABD1FED71345AC8400AF11D1 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; ABD1FED81345AC8400AF11D1 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; ABD1FEDA1345AC8400AF11D1 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; ABD1FEDC1345AC8400AF11D1 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; ABD1FEDD1345AC8400AF11D1 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; ABD1FEDE1345AC8400AF11D1 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; ABD1FEDF1345AC8400AF11D1 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; ABD1FEE01345AC8400AF11D1 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; ABD1FEE31345AC8400AF11D1 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; ABD1FEE41345AC8400AF11D1 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; ABD1FEE61345AC8400AF11D1 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; ABD1FEE81345AC8400AF11D1 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; ABD1FEE91345AC8400AF11D1 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; ABD1FEED1345AC8400AF11D1 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; ABD1FEEE1345AC8400AF11D1 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; ABD1FEEF1345AC8400AF11D1 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; ABD1FEF11345AC8400AF11D1 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; ABD1FEF21345AC8400AF11D1 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; ABD1FEF31345AC8400AF11D1 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; ABD1FEF41345AC8400AF11D1 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; ABD1FEF51345AC8400AF11D1 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; ABD1FEF61345AC8400AF11D1 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; ABD1FEF71345AC8400AF11D1 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; ABD1FEF81345AC8400AF11D1 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; ABD1FEFA1345AC8400AF11D1 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; ABD1FEFB1345AC8400AF11D1 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; ABD1FEFC1345AC8400AF11D1 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; ABD1FEFD1345AC8400AF11D1 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; ABD1FEFE1345AC8400AF11D1 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; ABD1FF0B1345AC9C00AF11D1 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; ABD1FF0C1345AC9C00AF11D1 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; ABD1FF0E1345AC9C00AF11D1 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; ABD1FF0F1345AC9C00AF11D1 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; ABD1FF101345AC9C00AF11D1 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; ABD1FF111345AC9C00AF11D1 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; ABD1FF121345AC9C00AF11D1 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; ABD1FF131345AC9C00AF11D1 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; ABD1FF141345AC9C00AF11D1 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; ABD1FF151345AC9C00AF11D1 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; ABD1FF531345ACBF00AF11D1 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; ABD1FF551345ACBF00AF11D1 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; ABD1FF561345ACBF00AF11D1 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; ABD1FF571345ACBF00AF11D1 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; ABD1FF581345ACBF00AF11D1 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; ABD1FF591345ACBF00AF11D1 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; ABD1FF5A1345ACBF00AF11D1 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; ABD1FF5B1345ACBF00AF11D1 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; ABD1FF5C1345ACBF00AF11D1 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; ABD1FF5D1345ACBF00AF11D1 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; ABD1FF5E1345ACBF00AF11D1 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; ABD1FF5F1345ACBF00AF11D1 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; ABD1FF601345ACBF00AF11D1 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; ABD1FF611345ACBF00AF11D1 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; ABD1FF621345ACBF00AF11D1 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; ABD1FF631345ACBF00AF11D1 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; ABD1FF641345ACBF00AF11D1 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; ABD1FF651345ACBF00AF11D1 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; ABD1FF661345ACBF00AF11D1 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; ABD1FF671345ACBF00AF11D1 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; ABD42047172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */; }; ABD42048172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */; }; ABDDF7C51898F024007583C1 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C41898F024007583C1 /* Icon_DisplayToggle_420x420.png */; }; ABDDF7C61898F024007583C1 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C41898F024007583C1 /* Icon_DisplayToggle_420x420.png */; }; ABDDF7C91898F032007583C1 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C71898F032007583C1 /* Icon_FrameAdvance_420x420.png */; }; ABDDF7CA1898F032007583C1 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C71898F032007583C1 /* Icon_FrameAdvance_420x420.png */; }; ABDDF7CB1898F032007583C1 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C81898F032007583C1 /* Icon_FrameJump_420x420.png */; }; ABDDF7CC1898F032007583C1 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABDDF7C81898F032007583C1 /* Icon_FrameJump_420x420.png */; }; ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; ABE6702C1415DE6C00E8E4C9 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; ABE6702D1415DE6C00E8E4C9 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; ABE6702E1415DE6C00E8E4C9 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; ABE6840C189E33BC007FD69C /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6840B189E33BC007FD69C /* OGLDisplayOutput.cpp */; }; ABE6840D189E33BC007FD69C /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6840B189E33BC007FD69C /* OGLDisplayOutput.cpp */; }; ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; ABE9EEEA1501C6EB00D3FB19 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; ABE9EEEB1501C78700D3FB19 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; ABEFCF61141AB82A000CC0CD /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; ABEFCF62141AB82A000CC0CD /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; ABEFCF63141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; ABEFCF64141AB82A000CC0CD /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; ABF2B9FB16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */; }; ABF2B9FC16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */; }; ABFE150714C92FF5005D6699 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABFE150814C92FF5005D6699 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABFE150914C92FF5005D6699 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABFE150A14C92FF5005D6699 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABFE150B14C92FF5005D6699 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABFE150D14C92FF5005D6699 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABFE150E14C92FF5005D6699 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; AB0038A61872A96700B0B055 /* Image_PaddleController.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PaddleController.png; path = images/Image_PaddleController.png; sourceTree = ""; }; AB00E87A14205EAE00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; name = English; path = translations/English.lproj/InfoPlist.strings; sourceTree = ""; }; AB00E87D14205EBC00DE561F /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/MainMenu.xib; sourceTree = ""; }; AB00E89114205ECC00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/Localizable.strings; sourceTree = ""; }; AB01005C170D07AF00D70FBE /* InputProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputProfileController.h; sourceTree = ""; }; AB01005D170D07B000D70FBE /* InputProfileController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputProfileController.mm; sourceTree = ""; }; AB02475B13886BF300E9F9AB /* KeyNames.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyNames.plist; sourceTree = ""; }; AB02791814415E4C0075E58C /* Info (Debug).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Debug).plist"; sourceTree = ""; }; AB0A0D1914AACA9600E83E91 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Execute_420x420.png; path = images/Icon_Execute_420x420.png; sourceTree = ""; }; AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Pause_420x420.png; path = images/Icon_Pause_420x420.png; sourceTree = ""; }; AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed1x_420x420.png; path = images/Icon_Speed1x_420x420.png; sourceTree = ""; }; AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed2x_420x420.png; path = images/Icon_Speed2x_420x420.png; sourceTree = ""; }; AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Blue_16x16.png; path = images/ColorSwatch_Blue_16x16.png; sourceTree = ""; }; AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Brown_16x16.png; path = images/ColorSwatch_Brown_16x16.png; sourceTree = ""; }; AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkBlue_16x16.png; path = images/ColorSwatch_DarkBlue_16x16.png; sourceTree = ""; }; AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkGreen_16x16.png; path = images/ColorSwatch_DarkGreen_16x16.png; sourceTree = ""; }; AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkPurple_16x16.png; path = images/ColorSwatch_DarkPurple_16x16.png; sourceTree = ""; }; AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Gray_16x16.png; path = images/ColorSwatch_Gray_16x16.png; sourceTree = ""; }; AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Green_16x16.png; path = images/ColorSwatch_Green_16x16.png; sourceTree = ""; }; AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_LimeGreen_16x16.png; path = images/ColorSwatch_LimeGreen_16x16.png; sourceTree = ""; }; AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Magenta_16x16.png; path = images/ColorSwatch_Magenta_16x16.png; sourceTree = ""; }; AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Orange_16x16.png; path = images/ColorSwatch_Orange_16x16.png; sourceTree = ""; }; AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Pink_16x16.png; path = images/ColorSwatch_Pink_16x16.png; sourceTree = ""; }; AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Red_16x16.png; path = images/ColorSwatch_Red_16x16.png; sourceTree = ""; }; AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_SeaGreen_16x16.png; path = images/ColorSwatch_SeaGreen_16x16.png; sourceTree = ""; }; AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Turquoise_16x16.png; path = images/ColorSwatch_Turquoise_16x16.png; sourceTree = ""; }; AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Violet_16x16.png; path = images/ColorSwatch_Violet_16x16.png; sourceTree = ""; }; AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Yellow_16x16.png; path = images/ColorSwatch_Yellow_16x16.png; sourceTree = ""; }; AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_128x128.png; path = images/Icon_ActionReplay_128x128.png; sourceTree = ""; }; AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_128x128.png; path = images/Icon_CodeBreaker_128x128.png; sourceTree = ""; }; AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = VideoFilterPreview_64x64.png; path = images/VideoFilterPreview_64x64.png; sourceTree = ""; }; AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowDown_420x420.png; path = images/Icon_ArrowDown_420x420.png; sourceTree = ""; }; AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowLeft_420x420.png; path = images/Icon_ArrowLeft_420x420.png; sourceTree = ""; }; AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowRight_420x420.png; path = images/Icon_ArrowRight_420x420.png; sourceTree = ""; }; AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowUp_420x420.png; path = images/Icon_ArrowUp_420x420.png; sourceTree = ""; }; AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DoubleSpeed_420x420.png; path = images/Icon_DoubleSpeed_420x420.png; sourceTree = ""; }; AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonA_420x420.png; path = images/Icon_DSButtonA_420x420.png; sourceTree = ""; }; AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonB_420x420.png; path = images/Icon_DSButtonB_420x420.png; sourceTree = ""; }; AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonL_420x420.png; path = images/Icon_DSButtonL_420x420.png; sourceTree = ""; }; AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonR_420x420.png; path = images/Icon_DSButtonR_420x420.png; sourceTree = ""; }; AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonSelect_420x420.png; path = images/Icon_DSButtonSelect_420x420.png; sourceTree = ""; }; AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonStart_420x420.png; path = images/Icon_DSButtonStart_420x420.png; sourceTree = ""; }; AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonX_420x420.png; path = images/Icon_DSButtonX_420x420.png; sourceTree = ""; }; AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonY_420x420.png; path = images/Icon_DSButtonY_420x420.png; sourceTree = ""; }; AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Emulation_420x420.png; path = images/Icon_Emulation_420x420.png; sourceTree = ""; }; AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Input_420x420.png; path = images/Icon_Input_420x420.png; sourceTree = ""; }; AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_OpenROM_420x420.png; path = images/Icon_OpenROM_420x420.png; sourceTree = ""; }; AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Reset_420x420.png; path = images/Icon_Reset_420x420.png; sourceTree = ""; }; AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCCW_420x420.png; path = images/Icon_RotateCCW_420x420.png; sourceTree = ""; }; AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCW_420x420.png; path = images/Icon_RotateCW_420x420.png; sourceTree = ""; }; AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ShowHUD_420x420.png; path = images/Icon_ShowHUD_420x420.png; sourceTree = ""; }; AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = ""; }; AB1773FC182ECA8A009F29DD /* slot2_passme.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_passme.cpp; sourceTree = ""; }; AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coreaudiosound.cpp; sourceTree = ""; }; AB1B9E601501A78000464647 /* ringbuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ringbuffer.cpp; sourceTree = ""; }; AB1B9E611501A78000464647 /* coreaudiosound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coreaudiosound.h; sourceTree = ""; }; AB1B9E621501A78000464647 /* ringbuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ringbuffer.h; sourceTree = ""; }; AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macosx_10_5_compat.cpp; sourceTree = ""; }; AB29B15C18313ACD009B7982 /* slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot2.h; path = ../slot2.h; sourceTree = ""; }; AB29B16118313AF5009B7982 /* slot2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot2.cpp; path = ../slot2.cpp; sourceTree = ""; }; AB29B16518313C14009B7982 /* slot2_auto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_auto.cpp; sourceTree = ""; }; AB29B32F16D4BEBF000EF671 /* InputManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputManager.h; sourceTree = ""; }; AB29B33016D4BEBF000EF671 /* InputManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputManager.mm; sourceTree = ""; }; AB2EE12B17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_mcrom_debug.cpp; sourceTree = ""; }; AB2EE12F17D57F5000F68622 /* fsnitro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsnitro.h; sourceTree = ""; }; AB2EE13017D57F5000F68622 /* fsnitro.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fsnitro.cpp; sourceTree = ""; }; AB350BA41478AC96007165AC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; AB350D38147A1D8D007165AC /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = English; path = translations/English.lproj/HID_usage_strings.plist; sourceTree = ""; }; AB3A655C16CC5416001F5D4A /* EmuControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmuControllerDelegate.h; sourceTree = ""; }; AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EmuControllerDelegate.mm; sourceTree = ""; }; AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_GPU.mm; sourceTree = ""; }; AB3A656416CC5442001F5D4A /* cocoa_GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_GPU.h; sourceTree = ""; }; AB3ACB6614C2361100D7D192 /* appDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = appDelegate.h; sourceTree = ""; }; AB3ACB6714C2361100D7D192 /* appDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = appDelegate.mm; sourceTree = ""; }; AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheatWindowDelegate.h; sourceTree = ""; }; AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cheatWindowDelegate.mm; sourceTree = ""; }; AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inputPrefsView.h; sourceTree = ""; }; AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = inputPrefsView.mm; sourceTree = ""; }; AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = preferencesWindowDelegate.h; sourceTree = ""; }; AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = preferencesWindowDelegate.mm; sourceTree = ""; }; AB3ACC3814C24D5400D7D192 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; }; AB3ACC3914C24D5400D7D192 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; }; AB3ACC3A14C24D5400D7D192 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; }; AB3ACC3B14C24D5400D7D192 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; }; AB3ACC3D14C24D5400D7D192 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../README.MAC; sourceTree = SOURCE_ROOT; }; AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; AB4055ED169F59380016AC3E /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = ""; }; AB4055EE169F59380016AC3E /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = ""; }; AB4055EF169F59380016AC3E /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; AB4055F0169F59380016AC3E /* x86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86.h; sourceTree = ""; }; AB4055FE169F5DBB0016AC3E /* apibegin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apibegin.h; sourceTree = ""; }; AB4055FF169F5DBB0016AC3E /* apiend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apiend.h; sourceTree = ""; }; AB405600169F5DBB0016AC3E /* assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembler.cpp; sourceTree = ""; }; AB405601169F5DBB0016AC3E /* assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembler.h; sourceTree = ""; }; AB405602169F5DBB0016AC3E /* assert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assert.cpp; sourceTree = ""; }; AB405603169F5DBB0016AC3E /* assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assert.h; sourceTree = ""; }; AB405604169F5DBB0016AC3E /* buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = buffer.cpp; sourceTree = ""; }; AB405605169F5DBB0016AC3E /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; AB405606169F5DBB0016AC3E /* build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build.h; sourceTree = ""; }; AB405607169F5DBB0016AC3E /* compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compiler.cpp; sourceTree = ""; }; AB405608169F5DBB0016AC3E /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = ""; }; AB405609169F5DBB0016AC3E /* compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilercontext.cpp; sourceTree = ""; }; AB40560A169F5DBB0016AC3E /* compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilercontext.h; sourceTree = ""; }; AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilerfunc.cpp; sourceTree = ""; }; AB40560C169F5DBB0016AC3E /* compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilerfunc.h; sourceTree = ""; }; AB40560D169F5DBB0016AC3E /* compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compileritem.cpp; sourceTree = ""; }; AB40560E169F5DBB0016AC3E /* compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compileritem.h; sourceTree = ""; }; AB40560F169F5DBB0016AC3E /* context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = context.cpp; sourceTree = ""; }; AB405610169F5DBB0016AC3E /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; AB405611169F5DBB0016AC3E /* cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpuinfo.cpp; sourceTree = ""; }; AB405612169F5DBB0016AC3E /* cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpuinfo.h; sourceTree = ""; }; AB405613169F5DBB0016AC3E /* defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = defs.cpp; sourceTree = ""; }; AB405614169F5DBB0016AC3E /* defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defs.h; sourceTree = ""; }; AB405615169F5DBB0016AC3E /* func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = func.cpp; sourceTree = ""; }; AB405616169F5DBB0016AC3E /* func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = func.h; sourceTree = ""; }; AB405617169F5DBB0016AC3E /* intutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intutil.h; sourceTree = ""; }; AB405618169F5DBB0016AC3E /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; AB405619169F5DBB0016AC3E /* logger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logger.cpp; sourceTree = ""; }; AB40561A169F5DBB0016AC3E /* logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logger.h; sourceTree = ""; }; AB40561B169F5DBB0016AC3E /* memorymanager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymanager.cpp; sourceTree = ""; }; AB40561C169F5DBB0016AC3E /* memorymanager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymanager.h; sourceTree = ""; }; AB40561D169F5DBB0016AC3E /* memorymarker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymarker.cpp; sourceTree = ""; }; AB40561E169F5DBB0016AC3E /* memorymarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymarker.h; sourceTree = ""; }; AB40561F169F5DBB0016AC3E /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = ""; }; AB405620169F5DBB0016AC3E /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = ""; }; AB405621169F5DBB0016AC3E /* podvector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = podvector.h; sourceTree = ""; }; AB405622169F5DBB0016AC3E /* stringbuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringbuilder.cpp; sourceTree = ""; }; AB405623169F5DBB0016AC3E /* stringbuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringbuilder.h; sourceTree = ""; }; AB405624169F5DBB0016AC3E /* stringutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutil.cpp; sourceTree = ""; }; AB405625169F5DBB0016AC3E /* stringutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutil.h; sourceTree = ""; }; AB405626169F5DBB0016AC3E /* virtualmemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = virtualmemory.cpp; sourceTree = ""; }; AB405627169F5DBB0016AC3E /* virtualmemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = virtualmemory.h; sourceTree = ""; }; AB405628169F5DBB0016AC3E /* zonememory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = zonememory.cpp; sourceTree = ""; }; AB405629169F5DBB0016AC3E /* zonememory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zonememory.h; sourceTree = ""; }; AB405664169F5DCC0016AC3E /* x86assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86assembler.cpp; sourceTree = ""; }; AB405665169F5DCC0016AC3E /* x86assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86assembler.h; sourceTree = ""; }; AB405666169F5DCC0016AC3E /* x86compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compiler.cpp; sourceTree = ""; }; AB405667169F5DCC0016AC3E /* x86compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compiler.h; sourceTree = ""; }; AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilercontext.cpp; sourceTree = ""; }; AB405669169F5DCC0016AC3E /* x86compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilercontext.h; sourceTree = ""; }; AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilerfunc.cpp; sourceTree = ""; }; AB40566B169F5DCC0016AC3E /* x86compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilerfunc.h; sourceTree = ""; }; AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compileritem.cpp; sourceTree = ""; }; AB40566D169F5DCC0016AC3E /* x86compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compileritem.h; sourceTree = ""; }; AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86cpuinfo.cpp; sourceTree = ""; }; AB40566F169F5DCC0016AC3E /* x86cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86cpuinfo.h; sourceTree = ""; }; AB405670169F5DCC0016AC3E /* x86defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86defs.cpp; sourceTree = ""; }; AB405671169F5DCC0016AC3E /* x86defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86defs.h; sourceTree = ""; }; AB405672169F5DCC0016AC3E /* x86func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86func.cpp; sourceTree = ""; }; AB405673169F5DCC0016AC3E /* x86func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86func.h; sourceTree = ""; }; AB405674169F5DCC0016AC3E /* x86operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86operand.cpp; sourceTree = ""; }; AB405675169F5DCC0016AC3E /* x86operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86operand.h; sourceTree = ""; }; AB405676169F5DCC0016AC3E /* x86util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86util.cpp; sourceTree = ""; }; AB405677169F5DCC0016AC3E /* x86util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86util.h; sourceTree = ""; }; AB407F391A620D6E00313213 /* DeSmuME (Latest).profdata */ = {isa = PBXFileReference; lastKnownFileType = file; path = "DeSmuME (Latest).profdata"; sourceTree = ""; }; AB47B52B18A3F722009A42AF /* xbrz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbrz.h; sourceTree = ""; }; AB47B52C18A3F722009A42AF /* xbrz.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xbrz.cpp; sourceTree = ""; }; AB4FCEBC1692AB82000F498F /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; AB5648FD186E6EA8002740F4 /* cocoa_slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_slot2.h; sourceTree = ""; }; AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_slot2.mm; sourceTree = ""; }; AB564902186E6EBC002740F4 /* Slot2WindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Slot2WindowDelegate.h; sourceTree = ""; }; AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Slot2WindowDelegate.mm; sourceTree = ""; }; AB564906186E6F0C002740F4 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = System/Library/Frameworks/ForceFeedback.framework; sourceTree = SDKROOT; }; AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_MemoryExpansionPak.png; path = images/Image_MemoryExpansionPak.png; sourceTree = ""; }; AB56490A186E6F67002740F4 /* Image_PassME.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PassME.png; path = images/Image_PassME.png; sourceTree = ""; }; AB56490B186E6F67002740F4 /* Image_Piano.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_Piano.png; path = images/Image_Piano.png; sourceTree = ""; }; AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenEmuBase.framework; path = openemu/OpenEmuBase.framework; sourceTree = ""; }; AB58F32B1364F44B0074C376 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; AB58F32C1364F44B0074C376 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = FileTypeInfo.plist; sourceTree = ""; }; AB681013187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Blue_512x512.png; path = images/Icon_GuitarGrip_Button_Blue_512x512.png; sourceTree = ""; }; AB681014187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Green_512x512.png; path = images/Icon_GuitarGrip_Button_Green_512x512.png; sourceTree = ""; }; AB681015187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Red_512x512.png; path = images/Icon_GuitarGrip_Button_Red_512x512.png; sourceTree = ""; }; AB681016187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Yellow_512x512.png; path = images/Icon_GuitarGrip_Button_Yellow_512x512.png; sourceTree = ""; }; AB681018187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_PaddleKnob_256x256.png; path = images/Icon_PaddleKnob_256x256.png; sourceTree = ""; }; AB681019187D4AEF0049F2C2 /* Icon_Piano_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Piano_256x256.png; path = images/Icon_Piano_256x256.png; sourceTree = ""; }; AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender_3_2.cpp; path = ../OGLRender_3_2.cpp; sourceTree = ""; }; AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; AB74EC891738499C0026C41E /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_FirmwareConfig.icns; sourceTree = ""; }; AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_jit.cpp; path = ../arm_jit.cpp; sourceTree = ""; }; AB796CA115CDCB4600C59155 /* arm_jit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arm_jit.h; path = ../arm_jit.h; sourceTree = ""; }; AB796CA215CDCB6B00C59155 /* instruction_attributes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = instruction_attributes.h; path = ../instruction_attributes.h; sourceTree = ""; }; AB796CA315CDCB6B00C59155 /* instructions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = instructions.h; path = ../instructions.h; sourceTree = ""; }; AB796D7015CDCBA200C59155 /* DeSmuME (Debug).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (Debug).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB7EC7F2189B2B92009D198A /* Icon_AutoholdClear_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_AutoholdClear_420x420.png; path = images/Icon_AutoholdClear_420x420.png; sourceTree = ""; }; AB7EC7F3189B2B92009D198A /* Icon_AutoholdSet_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_AutoholdSet_420x420.png; path = images/Icon_AutoholdSet_420x420.png; sourceTree = ""; }; AB80E04C142BC4A800A52038 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = ""; }; AB80E050142BC4FA00A52038 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; AB817A34143EE2DB00A7DFE9 /* videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = videofilter.h; sourceTree = ""; }; AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = videofilter.cpp; sourceTree = ""; }; AB82445A1704AE9A00B8EE20 /* utilities.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utilities.c; sourceTree = ""; }; AB82445E1704AEC400B8EE20 /* utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = ""; }; AB8967D716D2ED0700F826F1 /* DisplayWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayWindowController.h; sourceTree = ""; }; AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayWindowController.mm; sourceTree = ""; }; AB8967DC16D2ED2700F826F1 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/DisplayWindow.xib; sourceTree = ""; }; AB8B7AAA17CE8C440051CEBF /* slot1comp_protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slot1comp_protocol.h; sourceTree = ""; }; AB8B7AAB17CE8C440051CEBF /* slot1comp_protocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1comp_protocol.cpp; sourceTree = ""; }; AB8F3D2E1A53AC2600A80BF6 /* DeSmuME (Debug, dev+).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (Debug, dev+).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB9038A417C5ECFD00F410BD /* advanscene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = advanscene.h; sourceTree = ""; }; AB9038A517C5ECFD00F410BD /* advanscene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = advanscene.cpp; sourceTree = ""; }; AB9038A917C5ED2200F410BD /* slot1_retail_auto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_auto.cpp; sourceTree = ""; }; AB9038AA17C5ED2200F410BD /* slot1_retail_mcrom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_mcrom.cpp; sourceTree = ""; }; AB9038AB17C5ED2200F410BD /* slot1comp_mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1comp_mc.cpp; sourceTree = ""; }; AB9038AC17C5ED2200F410BD /* slot1comp_mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slot1comp_mc.h; sourceTree = ""; }; AB9038AD17C5ED2200F410BD /* slot1comp_rom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1comp_rom.cpp; sourceTree = ""; }; AB9038AE17C5ED2200F410BD /* slot1comp_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slot1comp_rom.h; sourceTree = ""; }; AB9971CE134EDA0800531BA7 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = ""; }; ABA6574914511EC90077E5E9 /* cocoa_cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_cheat.h; sourceTree = ""; }; ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_cheat.mm; sourceTree = ""; }; ABAB454E187CDB70007BE20C /* Image_GuitarGrip.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_GuitarGrip.png; path = images/Image_GuitarGrip.png; sourceTree = ""; }; ABACB8DB1710B621003B845D /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; ABAD3E5913AF1D6D00502E1E /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = ""; }; ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = ""; }; ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = ""; }; ABAD3E5C13AF1D6D00502E1E /* FIFOSampleBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSampleBuffer.h; sourceTree = ""; }; ABAD3E5D13AF1D6D00502E1E /* FIFOSamplePipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSamplePipe.h; sourceTree = ""; }; ABAD3E5E13AF1D6D00502E1E /* FIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRFilter.h; sourceTree = ""; }; ABAD3E5F13AF1D6D00502E1E /* RateTransposer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RateTransposer.h; sourceTree = ""; }; ABAD3E6013AF1D6D00502E1E /* SoundTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundTouch.h; sourceTree = ""; }; ABAD3E6113AF1D6D00502E1E /* STTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STTypes.h; sourceTree = ""; }; ABAD3E6213AF1D6D00502E1E /* TDStretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDStretch.h; sourceTree = ""; }; ABAD3E6313AF1D6D00502E1E /* WavFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WavFile.h; sourceTree = ""; }; ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AAFilter.cpp; sourceTree = ""; }; ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_detect_x86_gcc.cpp; sourceTree = ""; }; ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIFOSampleBuffer.cpp; sourceTree = ""; }; ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIRFilter.cpp; sourceTree = ""; }; ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmx_optimized.cpp; sourceTree = ""; }; ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RateTransposer.cpp; sourceTree = ""; }; ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundTouch.cpp; sourceTree = ""; }; ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sse_optimized.cpp; sourceTree = ""; }; ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TDStretch.cpp; sourceTree = ""; }; ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WavFile.cpp; sourceTree = ""; }; ABAF0A3F1A96E67200B95B75 /* RomInfoPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RomInfoPanel.h; sourceTree = ""; }; ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RomInfoPanel.mm; sourceTree = ""; }; ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlack_256x256.png; path = images/Icon_MicrophoneBlack_256x256.png; sourceTree = ""; }; ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlueGlow_256x256.png; path = images/Icon_MicrophoneBlueGlow_256x256.png; sourceTree = ""; }; ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGreen_256x256.png; path = images/Icon_MicrophoneGreen_256x256.png; sourceTree = ""; }; ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneRed_256x256.png; path = images/Icon_MicrophoneRed_256x256.png; sourceTree = ""; }; ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGray_256x256.png; path = images/Icon_MicrophoneGray_256x256.png; sourceTree = ""; }; ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OGLDisplayOutput_3_2.cpp; sourceTree = ""; }; ABB24F6C1A81EE92006C1108 /* OGLDisplayOutput_3_2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OGLDisplayOutput_3_2.h; sourceTree = ""; }; ABB3C63B1501BB8300E0C22E /* DeSmuME_Prefix_OpenEmu.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix_OpenEmu.pch; sourceTree = ""; }; ABB3C63C1501BB8300E0C22E /* Info (OpenEmu Plug-in).plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info (OpenEmu Plug-in).plist"; sourceTree = ""; }; ABB3C63D1501BB8300E0C22E /* NDSGameCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NDSGameCore.h; sourceTree = ""; }; ABB3C63E1501BB8300E0C22E /* NDSGameCore.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = NDSGameCore.mm; sourceTree = ""; }; ABB3C63F1501BB8300E0C22E /* OENDSSystemResponderClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OENDSSystemResponderClient.h; sourceTree = ""; }; ABB3C6401501BB8300E0C22E /* OESoundInterface.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OESoundInterface.mm; sourceTree = ""; }; ABB3C6411501BB8300E0C22E /* OESoundInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OESoundInterface.h; sourceTree = ""; }; ABB3C6471501BC6D00E0C22E /* DeSmuME.oecoreplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DeSmuME.oecoreplugin; sourceTree = BUILT_PRODUCTS_DIR; }; ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_32x32.png; path = Images/Icon_ActionReplay_32x32.png; sourceTree = ""; }; ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = Images/Icon_CodeBreaker_32x32.png; sourceTree = ""; }; ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = Images/Icon_DeSmuME_32x32.png; sourceTree = ""; }; ABBB421516B4A5F30012E5AB /* OGLRender_3_2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender_3_2.h; path = ../OGLRender_3_2.h; sourceTree = ""; }; ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = DefaultUserPrefs.plist; sourceTree = ""; }; ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = ""; }; ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_16x16.png; path = images/Icon_VolumeFull_16x16.png; sourceTree = ""; }; ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeMute_16x16.png; path = images/Icon_VolumeMute_16x16.png; sourceTree = ""; }; ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_16x16.png; path = images/Icon_VolumeOneThird_16x16.png; sourceTree = ""; }; ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_16x16.png; path = images/Icon_VolumeTwoThird_16x16.png; sourceTree = ""; }; ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDarkGreen_256x256.png; path = images/Icon_MicrophoneDarkGreen_256x256.png; sourceTree = ""; }; ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; ABC570D4134431DA00E7B0B1 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultKeyMappings.plist; sourceTree = ""; }; ABCFA9F2178BDE920030C8BA /* encrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encrypt.h; path = ../encrypt.h; sourceTree = ""; }; ABCFA9F3178BDE920030C8BA /* encrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = encrypt.cpp; path = ../encrypt.cpp; sourceTree = ""; }; ABD103FE1346652500AF11D1 /* cocoa_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_core.h; sourceTree = ""; }; ABD103FF1346652500AF11D1 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = ""; }; ABD104001346652500AF11D1 /* cocoa_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_rom.h; sourceTree = ""; }; ABD104011346652500AF11D1 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = ""; }; ABD104111346652500AF11D1 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = ""; }; ABD104121346652500AF11D1 /* cocoa_core.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_core.mm; sourceTree = ""; }; ABD104131346652500AF11D1 /* cocoa_rom.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_rom.mm; sourceTree = ""; }; ABD104141346652500AF11D1 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = ""; }; ABD104271346653B00AF11D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = ""; }; ABD10AE31715FCDD00B5729D /* audiosamplegenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiosamplegenerator.h; sourceTree = SOURCE_ROOT; }; ABD10AE41715FCDD00B5729D /* mic_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mic_ext.h; sourceTree = SOURCE_ROOT; }; ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiosamplegenerator.cpp; sourceTree = SOURCE_ROOT; }; ABD10AE61715FCDD00B5729D /* mic_ext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mic_ext.cpp; sourceTree = SOURCE_ROOT; }; ABD1FE6C1345AC8400AF11D1 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; }; ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; }; ABD1FE6F1345AC8400AF11D1 /* armcpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = armcpu.h; path = ../armcpu.h; sourceTree = SOURCE_ROOT; }; ABD1FE701345AC8400AF11D1 /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bios.h; path = ../bios.h; sourceTree = SOURCE_ROOT; }; ABD1FE711345AC8400AF11D1 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bits.h; path = ../bits.h; sourceTree = SOURCE_ROOT; }; ABD1FE721345AC8400AF11D1 /* cheatSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cheatSystem.h; path = ../cheatSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE731345AC8400AF11D1 /* commandline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = commandline.h; path = ../commandline.h; sourceTree = SOURCE_ROOT; }; ABD1FE741345AC8400AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../common.h; sourceTree = SOURCE_ROOT; }; ABD1FE751345AC8400AF11D1 /* cp15.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cp15.h; path = ../cp15.h; sourceTree = SOURCE_ROOT; }; ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ctrlssdl.h; path = ../ctrlssdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE771345AC8400AF11D1 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../debug.h; sourceTree = SOURCE_ROOT; }; ABD1FE781345AC8400AF11D1 /* desmume_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = desmume_config.h; path = ../desmume_config.h; sourceTree = SOURCE_ROOT; }; ABD1FE791345AC8400AF11D1 /* Disassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Disassembler.h; path = ../Disassembler.h; sourceTree = SOURCE_ROOT; }; ABD1FE7A1345AC8400AF11D1 /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../driver.h; sourceTree = SOURCE_ROOT; }; ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile_types.h; path = ../emufile_types.h; sourceTree = SOURCE_ROOT; }; ABD1FE7C1345AC8400AF11D1 /* emufile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile.h; path = ../emufile.h; sourceTree = SOURCE_ROOT; }; ABD1FE7D1345AC8400AF11D1 /* FIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FIFO.h; path = ../FIFO.h; sourceTree = SOURCE_ROOT; }; ABD1FE7E1345AC8400AF11D1 /* firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = firmware.h; path = ../firmware.h; sourceTree = SOURCE_ROOT; }; ABD1FE7F1345AC8400AF11D1 /* fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fs.h; path = ../fs.h; sourceTree = SOURCE_ROOT; }; ABD1FE801345AC8400AF11D1 /* gdbstub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gdbstub.h; path = ../gdbstub.h; sourceTree = SOURCE_ROOT; }; ABD1FE811345AC8400AF11D1 /* gfx3d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gfx3d.h; path = ../gfx3d.h; sourceTree = SOURCE_ROOT; }; ABD1FE821345AC8400AF11D1 /* GPU_osd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU_osd.h; path = ../GPU_osd.h; sourceTree = SOURCE_ROOT; }; ABD1FE831345AC8400AF11D1 /* GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU.h; path = ../GPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE841345AC8400AF11D1 /* lua-engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lua-engine.h"; path = "../lua-engine.h"; sourceTree = SOURCE_ROOT; }; ABD1FE851345AC8400AF11D1 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../matrix.h; sourceTree = SOURCE_ROOT; }; ABD1FE861345AC8400AF11D1 /* mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mc.h; path = ../mc.h; sourceTree = SOURCE_ROOT; }; ABD1FE871345AC8400AF11D1 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mem.h; path = ../mem.h; sourceTree = SOURCE_ROOT; }; ABD1FE881345AC8400AF11D1 /* mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mic.h; path = ../mic.h; sourceTree = SOURCE_ROOT; }; ABD1FE891345AC8400AF11D1 /* MMU_timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU_timing.h; path = ../MMU_timing.h; sourceTree = SOURCE_ROOT; }; ABD1FE8A1345AC8400AF11D1 /* MMU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU.h; path = ../MMU.h; sourceTree = SOURCE_ROOT; }; ABD1FE8B1345AC8400AF11D1 /* movie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = movie.h; path = ../movie.h; sourceTree = SOURCE_ROOT; }; ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NDSSystem.h; path = ../NDSSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender.h; path = ../OGLRender.h; sourceTree = SOURCE_ROOT; }; ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED_END.h; path = ../PACKED_END.h; sourceTree = SOURCE_ROOT; }; ABD1FE8F1345AC8400AF11D1 /* PACKED.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED.h; path = ../PACKED.h; sourceTree = SOURCE_ROOT; }; ABD1FE901345AC8400AF11D1 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path.h; path = ../path.h; sourceTree = SOURCE_ROOT; }; ABD1FE911345AC8400AF11D1 /* rasterize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rasterize.h; path = ../rasterize.h; sourceTree = SOURCE_ROOT; }; ABD1FE921345AC8400AF11D1 /* readwrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readwrite.h; path = ../readwrite.h; sourceTree = SOURCE_ROOT; }; ABD1FE931345AC8400AF11D1 /* registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registers.h; path = ../registers.h; sourceTree = SOURCE_ROOT; }; ABD1FE941345AC8400AF11D1 /* render3D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = render3D.h; path = ../render3D.h; sourceTree = SOURCE_ROOT; }; ABD1FE951345AC8400AF11D1 /* ROMReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ROMReader.h; path = ../ROMReader.h; sourceTree = SOURCE_ROOT; }; ABD1FE961345AC8400AF11D1 /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rtc.h; path = ../rtc.h; sourceTree = SOURCE_ROOT; }; ABD1FE971345AC8400AF11D1 /* saves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = saves.h; path = ../saves.h; sourceTree = SOURCE_ROOT; }; ABD1FE991345AC8400AF11D1 /* slot1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot1.h; path = ../slot1.h; sourceTree = SOURCE_ROOT; }; ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndsdl.h; path = ../sndsdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE9B1345AC8400AF11D1 /* SPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPU.h; path = ../SPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE9C1345AC8400AF11D1 /* texcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = texcache.h; path = ../texcache.h; sourceTree = SOURCE_ROOT; }; ABD1FE9E1345AC8400AF11D1 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../types.h; sourceTree = SOURCE_ROOT; }; ABD1FE9F1345AC8400AF11D1 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../version.h; sourceTree = SOURCE_ROOT; }; ABD1FEA01345AC8400AF11D1 /* wifi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wifi.h; path = ../wifi.h; sourceTree = SOURCE_ROOT; }; ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aggdraw.cpp; path = ../aggdraw.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_instructions.cpp; path = ../arm_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = armcpu.cpp; path = ../armcpu.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA51345AC8400AF11D1 /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bios.cpp; path = ../bios.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cheatSystem.cpp; path = ../cheatSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA71345AC8400AF11D1 /* commandline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = commandline.cpp; path = ../commandline.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA81345AC8400AF11D1 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../common.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA91345AC8400AF11D1 /* cp15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cp15.cpp; path = ../cp15.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ctrlssdl.cpp; path = ../ctrlssdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAB1345AC8400AF11D1 /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cpp; path = ../debug.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = desmume_config.cpp; path = ../desmume_config.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disassembler.cpp; path = ../Disassembler.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAE1345AC8400AF11D1 /* driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = driver.cpp; path = ../driver.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = emufile.cpp; path = ../emufile.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FIFO.cpp; path = ../FIFO.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB11345AC8400AF11D1 /* firmware.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = firmware.cpp; path = ../firmware.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "fs-linux.cpp"; path = "../fs-linux.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gfx3d.cpp; path = ../gfx3d.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd_stub.cpp; path = ../GPU_osd_stub.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd.cpp; path = ../GPU_osd.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB71345AC8400AF11D1 /* GPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU.cpp; path = ../GPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lua-engine.cpp"; path = "../lua-engine.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB91345AC8400AF11D1 /* matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = matrix.cpp; path = ../matrix.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBA1345AC8400AF11D1 /* mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mc.cpp; path = ../mc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_alsa.cpp; path = ../mic_alsa.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_openal.cpp; path = ../mic_openal.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBD1345AC8400AF11D1 /* mic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic.cpp; path = ../mic.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MMU.cpp; path = ../MMU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBF1345AC8400AF11D1 /* movie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = movie.cpp; path = ../movie.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NDSSystem.cpp; path = ../NDSSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender.cpp; path = ../OGLRender.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC21345AC8400AF11D1 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path.cpp; path = ../path.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rasterize.cpp; path = ../rasterize.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = readwrite.cpp; path = ../readwrite.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC51345AC8400AF11D1 /* render3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = render3D.cpp; path = ../render3D.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ROMReader.cpp; path = ../ROMReader.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC71345AC8400AF11D1 /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rtc.cpp; path = ../rtc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC81345AC8400AF11D1 /* saves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = saves.cpp; path = ../saves.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC91345AC8400AF11D1 /* slot1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1.cpp; path = ../slot1.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndsdl.cpp; path = ../sndsdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECB1345AC8400AF11D1 /* SPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SPU.cpp; path = ../SPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECC1345AC8400AF11D1 /* texcache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = texcache.cpp; path = ../texcache.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thumb_instructions.cpp; path = ../thumb_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECE1345AC8400AF11D1 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cpp; path = ../version.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECF1345AC8400AF11D1 /* wifi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wifi.cpp; path = ../wifi.cpp; sourceTree = SOURCE_ROOT; }; ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_none.cpp; sourceTree = ""; }; ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_r4.cpp; sourceTree = ""; }; ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_expMemory.cpp; sourceTree = ""; }; ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_gbagame.cpp; sourceTree = ""; }; ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_guitarGrip.cpp; sourceTree = ""; }; ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_mpcf.cpp; sourceTree = ""; }; ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_none.cpp; sourceTree = ""; }; ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_paddle.cpp; sourceTree = ""; }; ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_piano.cpp; sourceTree = ""; }; ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_rumblepak.cpp; sourceTree = ""; }; ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gdbstub.cpp; sourceTree = ""; }; ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gdbstub_internal.h; sourceTree = ""; }; ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConvertUTF.c; sourceTree = ""; }; ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = ""; }; ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = datetime.cpp; sourceTree = ""; }; ABD1FF201345ACBF00AF11D1 /* datetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datetime.h; sourceTree = ""; }; ABD1FF221345ACBF00AF11D1 /* crc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crc.cpp; sourceTree = ""; }; ABD1FF231345ACBF00AF11D1 /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decrypt.cpp; sourceTree = ""; }; ABD1FF251345ACBF00AF11D1 /* decrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decrypt.h; sourceTree = ""; }; ABD1FF261345ACBF00AF11D1 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; ABD1FF271345ACBF00AF11D1 /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = header.h; sourceTree = ""; }; ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dlditool.cpp; sourceTree = ""; }; ABD1FF291345ACBF00AF11D1 /* emufat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emufat.cpp; sourceTree = ""; }; ABD1FF2A1345ACBF00AF11D1 /* emufat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat.h; sourceTree = ""; }; ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat_types.h; sourceTree = ""; }; ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = guid.cpp; sourceTree = ""; }; ABD1FF2D1345ACBF00AF11D1 /* guid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guid.h; sourceTree = ""; }; ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_ops.h; sourceTree = ""; }; ABD1FF301345ACBF00AF11D1 /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; ABD1FF311345ACBF00AF11D1 /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; ABD1FF321345ACBF00AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; ABD1FF331345ACBF00AF11D1 /* directory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = directory.cpp; sourceTree = ""; }; ABD1FF341345ACBF00AF11D1 /* directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directory.h; sourceTree = ""; }; ABD1FF351345ACBF00AF11D1 /* disc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disc.cpp; sourceTree = ""; }; ABD1FF361345ACBF00AF11D1 /* disc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc.h; sourceTree = ""; }; ABD1FF371345ACBF00AF11D1 /* disc_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc_io.h; sourceTree = ""; }; ABD1FF381345ACBF00AF11D1 /* fat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fat.h; sourceTree = ""; }; ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatdir.cpp; sourceTree = ""; }; ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatdir.h; sourceTree = ""; }; ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatfile.cpp; sourceTree = ""; }; ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatfile.h; sourceTree = ""; }; ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_allocation_table.cpp; sourceTree = ""; }; ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_allocation_table.h; sourceTree = ""; }; ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filetime.cpp; sourceTree = ""; }; ABD1FF401345ACBF00AF11D1 /* filetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filetime.h; sourceTree = ""; }; ABD1FF411345ACBF00AF11D1 /* libfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat.cpp; sourceTree = ""; }; ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_pc.h; sourceTree = ""; }; ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat_public_api.cpp; sourceTree = ""; }; ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_public_api.h; sourceTree = ""; }; ABD1FF451345ACBF00AF11D1 /* lock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lock.cpp; sourceTree = ""; }; ABD1FF461345ACBF00AF11D1 /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_allocate.h; sourceTree = ""; }; ABD1FF481345ACBF00AF11D1 /* partition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = partition.cpp; sourceTree = ""; }; ABD1FF491345ACBF00AF11D1 /* partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition.h; sourceTree = ""; }; ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; ABD1FF4B1345ACBF00AF11D1 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; ABD1FF4C1345ACBF00AF11D1 /* task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cpp; sourceTree = ""; }; ABD1FF4D1345ACBF00AF11D1 /* task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = task.h; sourceTree = ""; }; ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = valuearray.h; sourceTree = ""; }; ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vfat.cpp; sourceTree = ""; }; ABD1FF501345ACBF00AF11D1 /* vfat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vfat.h; sourceTree = ""; }; ABD1FF511345ACBF00AF11D1 /* xstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xstring.cpp; sourceTree = ""; }; ABD1FF521345ACBF00AF11D1 /* xstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xstring.h; sourceTree = ""; }; ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metaspu.cpp; sourceTree = ""; }; ABD1FF781345ACFA00AF11D1 /* metaspu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metaspu.h; sourceTree = ""; }; ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = ""; }; ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = ""; }; ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = ""; }; ABD42045172319D1006A9B46 /* FileMigrationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMigrationDelegate.h; sourceTree = ""; }; ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileMigrationDelegate.mm; sourceTree = ""; }; ABDDF7C41898F024007583C1 /* Icon_DisplayToggle_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DisplayToggle_420x420.png; path = images/Icon_DisplayToggle_420x420.png; sourceTree = ""; }; ABDDF7C71898F032007583C1 /* Icon_FrameAdvance_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_FrameAdvance_420x420.png; path = images/Icon_FrameAdvance_420x420.png; sourceTree = ""; }; ABDDF7C81898F032007583C1 /* Icon_FrameJump_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_FrameJump_420x420.png; path = images/Icon_FrameJump_420x420.png; sourceTree = ""; }; ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = ""; }; ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = ""; }; ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = ""; }; ABE670261415DE6C00E8E4C9 /* tinystr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinystr.h; sourceTree = ""; }; ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxml.cpp; sourceTree = ""; }; ABE670281415DE6C00E8E4C9 /* tinyxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyxml.h; sourceTree = ""; }; ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlerror.cpp; sourceTree = ""; }; ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = ""; }; ABE6840B189E33BC007FD69C /* OGLDisplayOutput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OGLDisplayOutput.cpp; sourceTree = ""; }; ABE6840E189E33D5007FD69C /* OGLDisplayOutput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OGLDisplayOutput.h; sourceTree = ""; }; ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_firmware.h; sourceTree = ""; }; ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_firmware.mm; sourceTree = ""; }; ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = ""; }; ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_DeSmuME.icns; sourceTree = ""; }; ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = ""; }; ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = ""; }; ABF2B9F81690412A000FF7C0 /* troubleshootingWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = troubleshootingWindowDelegate.h; sourceTree = ""; }; ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = troubleshootingWindowDelegate.mm; sourceTree = ""; }; ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 2xsai.cpp; sourceTree = ""; }; ABFE14FB14C92FF5005D6699 /* bilinear.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bilinear.cpp; sourceTree = ""; }; ABFE14FC14C92FF5005D6699 /* epx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = epx.cpp; sourceTree = ""; }; ABFE14FD14C92FF5005D6699 /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = ""; }; ABFE14FE14C92FF5005D6699 /* hq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq2x.cpp; sourceTree = ""; }; ABFE14FF14C92FF5005D6699 /* hq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq2x.h; sourceTree = ""; }; ABFE150014C92FF5005D6699 /* hq4x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq4x.cpp; sourceTree = ""; }; ABFE150214C92FF5005D6699 /* hq4x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq4x.h; sourceTree = ""; }; ABFE150314C92FF5005D6699 /* interp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interp.h; sourceTree = ""; }; ABFE150414C92FF5005D6699 /* lq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lq2x.cpp; sourceTree = ""; }; ABFE150514C92FF5005D6699 /* lq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lq2x.h; sourceTree = ""; }; ABFE150614C92FF5005D6699 /* scanline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scanline.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */, ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */, ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */, ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */, AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, ABB0FBC61A9E5D070060C55A /* CoreAudio.framework in Frameworks */, AB564908186E6F1F002740F4 /* ForceFeedback.framework in Frameworks */, ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */, AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */, ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */, AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB796D6515CDCBA200C59155 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */, AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */, ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */, AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */, AB74EC8A1738499C0026C41E /* Carbon.framework in Frameworks */, AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */, ABB0FBC71A9E5D080060C55A /* CoreAudio.framework in Frameworks */, AB564907186E6F0C002740F4 /* ForceFeedback.framework in Frameworks */, AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */, AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */, AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */, AB796D6C15CDCBA200C59155 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB8F3D1E1A53AC2600A80BF6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB8F3D1F1A53AC2600A80BF6 /* Accelerate.framework in Frameworks */, AB8F3D201A53AC2600A80BF6 /* AppKit.framework in Frameworks */, AB8F3D211A53AC2600A80BF6 /* AudioToolbox.framework in Frameworks */, AB8F3D221A53AC2600A80BF6 /* AudioUnit.framework in Frameworks */, AB8F3D231A53AC2600A80BF6 /* Carbon.framework in Frameworks */, AB8F3D241A53AC2600A80BF6 /* Cocoa.framework in Frameworks */, ABB0FBC51A9E5CEA0060C55A /* CoreAudio.framework in Frameworks */, AB8F3D251A53AC2600A80BF6 /* ForceFeedback.framework in Frameworks */, AB8F3D261A53AC2600A80BF6 /* Foundation.framework in Frameworks */, AB8F3D271A53AC2600A80BF6 /* IOKit.framework in Frameworks */, AB8F3D281A53AC2600A80BF6 /* OpenGL.framework in Frameworks */, AB8F3D291A53AC2600A80BF6 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; ABB3C6441501BC6D00E0C22E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */, ABB3C6641501BF8A00E0C22E /* AppKit.framework in Frameworks */, ABACB8DE1710B65F003B845D /* AudioToolbox.framework in Frameworks */, ABB3C6651501BF8A00E0C22E /* AudioUnit.framework in Frameworks */, ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */, ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */, ABB3C6691501BF8A00E0C22E /* OpenGL.framework in Frameworks */, ABB3C66A1501BF8A00E0C22E /* libz.dylib in Frameworks */, ABC503B11AAC4355002FCD43 /* CoreAudio.framework in Frameworks */, AB5785FD17176AFC002C5FC7 /* OpenEmuBase.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Cocoa Port */ = { isa = PBXGroup; children = ( ABB3C63A1501BB8300E0C22E /* openemu */, AB3ACB6514C2361100D7D192 /* userinterface */, AB82445A1704AE9A00B8EE20 /* utilities.c */, ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */, AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */, AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */, ABD10AE61715FCDD00B5729D /* mic_ext.cpp */, ABE6840B189E33BC007FD69C /* OGLDisplayOutput.cpp */, ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */, AB1B9E601501A78000464647 /* ringbuffer.cpp */, ABD104141346652500AF11D1 /* sndOSX.cpp */, ABD10AE31715FCDD00B5729D /* audiosamplegenerator.h */, ABA6574914511EC90077E5E9 /* cocoa_cheat.h */, ABD103FE1346652500AF11D1 /* cocoa_core.h */, AB58F32B1364F44B0074C376 /* cocoa_file.h */, ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */, AB9971CE134EDA0800531BA7 /* cocoa_globals.h */, AB3A656416CC5442001F5D4A /* cocoa_GPU.h */, ABD103FF1346652500AF11D1 /* cocoa_input.h */, AB3E34C7134AF4500056477A /* cocoa_output.h */, ABD104001346652500AF11D1 /* cocoa_rom.h */, AB5648FD186E6EA8002740F4 /* cocoa_slot2.h */, AB80E050142BC4FA00A52038 /* cocoa_util.h */, ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, AB1B9E611501A78000464647 /* coreaudiosound.h */, ABD10AE41715FCDD00B5729D /* mic_ext.h */, AB1B9E621501A78000464647 /* ringbuffer.h */, ABE6840E189E33D5007FD69C /* OGLDisplayOutput.h */, ABB24F6C1A81EE92006C1108 /* OGLDisplayOutput_3_2.h */, ABD104011346652500AF11D1 /* sndOSX.h */, AB82445E1704AEC400B8EE20 /* utilities.h */, ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */, ABD104121346652500AF11D1 /* cocoa_core.mm */, AB58F32C1364F44B0074C376 /* cocoa_file.mm */, ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */, AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */, ABD104111346652500AF11D1 /* cocoa_input.mm */, AB3E34C8134AF4500056477A /* cocoa_output.mm */, ABD104131346652500AF11D1 /* cocoa_rom.mm */, AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */, AB80E04C142BC4A800A52038 /* cocoa_util.mm */, ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, ); name = "Cocoa Port"; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( AB4FCEBC1692AB82000F498F /* Accelerate.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, ABACB8DB1710B621003B845D /* AudioToolbox.framework */, ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, AB74EC891738499C0026C41E /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */, AB564906186E6F0C002740F4 /* ForceFeedback.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, AB0A0D1914AACA9600E83E91 /* libz.dylib */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* DeSmuME.app */, ABB3C6471501BC6D00E0C22E /* DeSmuME.oecoreplugin */, AB796D7015CDCBA200C59155 /* DeSmuME (Debug).app */, AB8F3D2E1A53AC2600A80BF6 /* DeSmuME (Debug, dev+).app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* DeSmuME */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Cocoa Port */, ABC572B7134592D900E7B0B1 /* Core */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 19C28FACFE9D520D11CA2CBB /* Products */, 29B97317FDCFA39411CA2CEA /* Resources */, AB407F381A620D6E00313213 /* OptimizationProfiles */, ); name = DeSmuME; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( ABD104271346653B00AF11D1 /* main.m */, ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( ABC2ECD613B1C87000FAAA2A /* Images */, AB00E87C14205EBC00DE561F /* MainMenu.xib */, AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */, AB350D3A147A1D93007165AC /* HID_usage_strings.plist */, 8D1107310486CEB800E47090 /* Info.plist */, AB02791814415E4C0075E58C /* Info (Debug).plist */, AB00E87914205EAE00DE561F /* InfoPlist.strings */, AB02475B13886BF300E9F9AB /* KeyNames.plist */, AB901BDD1420706100348EEC /* Localizable.strings */, ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */, ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */, AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */, AB3ACC3814C24D5400D7D192 /* AUTHORS */, AB3ACC3914C24D5400D7D192 /* ChangeLog */, AB3ACC3A14C24D5400D7D192 /* COPYING */, AB3ACC3B14C24D5400D7D192 /* README */, AB3ACC3D14C24D5400D7D192 /* README.MAC */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; AB3ACB6514C2361100D7D192 /* userinterface */ = { isa = PBXGroup; children = ( AB3ACB6614C2361100D7D192 /* appDelegate.h */, AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */, AB8967D716D2ED0700F826F1 /* DisplayWindowController.h */, AB3A655C16CC5416001F5D4A /* EmuControllerDelegate.h */, ABD42045172319D1006A9B46 /* FileMigrationDelegate.h */, AB29B32F16D4BEBF000EF671 /* InputManager.h */, AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB01005C170D07AF00D70FBE /* InputProfileController.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, ABAF0A3F1A96E67200B95B75 /* RomInfoPanel.h */, AB564902186E6EBC002740F4 /* Slot2WindowDelegate.h */, ABF2B9F81690412A000FF7C0 /* troubleshootingWindowDelegate.h */, AB3ACB6714C2361100D7D192 /* appDelegate.mm */, AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */, AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */, ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */, AB29B33016D4BEBF000EF671 /* InputManager.mm */, AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB01005D170D07B000D70FBE /* InputProfileController.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */, AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */, ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */, ); path = userinterface; sourceTree = ""; }; AB4055FD169F5DBB0016AC3E /* core */ = { isa = PBXGroup; children = ( AB405600169F5DBB0016AC3E /* assembler.cpp */, AB405602169F5DBB0016AC3E /* assert.cpp */, AB405604169F5DBB0016AC3E /* buffer.cpp */, AB405607169F5DBB0016AC3E /* compiler.cpp */, AB405609169F5DBB0016AC3E /* compilercontext.cpp */, AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */, AB40560D169F5DBB0016AC3E /* compileritem.cpp */, AB40560F169F5DBB0016AC3E /* context.cpp */, AB405611169F5DBB0016AC3E /* cpuinfo.cpp */, AB405613169F5DBB0016AC3E /* defs.cpp */, AB405615169F5DBB0016AC3E /* func.cpp */, AB405619169F5DBB0016AC3E /* logger.cpp */, AB40561B169F5DBB0016AC3E /* memorymanager.cpp */, AB40561D169F5DBB0016AC3E /* memorymarker.cpp */, AB40561F169F5DBB0016AC3E /* operand.cpp */, AB405622169F5DBB0016AC3E /* stringbuilder.cpp */, AB405624169F5DBB0016AC3E /* stringutil.cpp */, AB405626169F5DBB0016AC3E /* virtualmemory.cpp */, AB405628169F5DBB0016AC3E /* zonememory.cpp */, AB4055FE169F5DBB0016AC3E /* apibegin.h */, AB4055FF169F5DBB0016AC3E /* apiend.h */, AB405601169F5DBB0016AC3E /* assembler.h */, AB405603169F5DBB0016AC3E /* assert.h */, AB405605169F5DBB0016AC3E /* buffer.h */, AB405606169F5DBB0016AC3E /* build.h */, AB405608169F5DBB0016AC3E /* compiler.h */, AB40560A169F5DBB0016AC3E /* compilercontext.h */, AB40560C169F5DBB0016AC3E /* compilerfunc.h */, AB40560E169F5DBB0016AC3E /* compileritem.h */, AB405610169F5DBB0016AC3E /* context.h */, AB405612169F5DBB0016AC3E /* cpuinfo.h */, AB405614169F5DBB0016AC3E /* defs.h */, AB405616169F5DBB0016AC3E /* func.h */, AB405617169F5DBB0016AC3E /* intutil.h */, AB405618169F5DBB0016AC3E /* lock.h */, AB40561A169F5DBB0016AC3E /* logger.h */, AB40561C169F5DBB0016AC3E /* memorymanager.h */, AB40561E169F5DBB0016AC3E /* memorymarker.h */, AB405620169F5DBB0016AC3E /* operand.h */, AB405621169F5DBB0016AC3E /* podvector.h */, AB405623169F5DBB0016AC3E /* stringbuilder.h */, AB405625169F5DBB0016AC3E /* stringutil.h */, AB405627169F5DBB0016AC3E /* virtualmemory.h */, AB405629169F5DBB0016AC3E /* zonememory.h */, ); path = core; sourceTree = ""; }; AB405663169F5DCC0016AC3E /* x86 */ = { isa = PBXGroup; children = ( AB405664169F5DCC0016AC3E /* x86assembler.cpp */, AB405666169F5DCC0016AC3E /* x86compiler.cpp */, AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */, AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */, AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */, AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */, AB405670169F5DCC0016AC3E /* x86defs.cpp */, AB405672169F5DCC0016AC3E /* x86func.cpp */, AB405674169F5DCC0016AC3E /* x86operand.cpp */, AB405676169F5DCC0016AC3E /* x86util.cpp */, AB405665169F5DCC0016AC3E /* x86assembler.h */, AB405667169F5DCC0016AC3E /* x86compiler.h */, AB405669169F5DCC0016AC3E /* x86compilercontext.h */, AB40566B169F5DCC0016AC3E /* x86compilerfunc.h */, AB40566D169F5DCC0016AC3E /* x86compileritem.h */, AB40566F169F5DCC0016AC3E /* x86cpuinfo.h */, AB405671169F5DCC0016AC3E /* x86defs.h */, AB405673169F5DCC0016AC3E /* x86func.h */, AB405675169F5DCC0016AC3E /* x86operand.h */, AB405677169F5DCC0016AC3E /* x86util.h */, ); path = x86; sourceTree = ""; }; AB407F381A620D6E00313213 /* OptimizationProfiles */ = { isa = PBXGroup; children = ( AB407F391A620D6E00313213 /* DeSmuME (Latest).profdata */, ); path = OptimizationProfiles; sourceTree = ""; }; AB796D7415CDD20E00C59155 /* AsmJit */ = { isa = PBXGroup; children = ( AB4055ED169F59380016AC3E /* AsmJit.h */, AB4055EE169F59380016AC3E /* Config.h */, AB4055EF169F59380016AC3E /* core.h */, AB4055F0169F59380016AC3E /* x86.h */, AB4055FD169F5DBB0016AC3E /* core */, AB405663169F5DCC0016AC3E /* x86 */, ); path = AsmJit; sourceTree = ""; }; AB85D77414ABE42100286B70 /* App Icons */ = { isa = PBXGroup; children = ( ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */, ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */, ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */, ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */, AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */, ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */, ); name = "App Icons"; sourceTree = ""; }; ABB3C63A1501BB8300E0C22E /* openemu */ = { isa = PBXGroup; children = ( ABB3C63D1501BB8300E0C22E /* NDSGameCore.h */, ABB3C63F1501BB8300E0C22E /* OENDSSystemResponderClient.h */, ABB3C6411501BB8300E0C22E /* OESoundInterface.h */, ABB3C63E1501BB8300E0C22E /* NDSGameCore.mm */, ABB3C6401501BB8300E0C22E /* OESoundInterface.mm */, ABB3C63B1501BB8300E0C22E /* DeSmuME_Prefix_OpenEmu.pch */, ABB3C63C1501BB8300E0C22E /* Info (OpenEmu Plug-in).plist */, ); path = openemu; sourceTree = ""; }; ABC2ECD613B1C87000FAAA2A /* Images */ = { isa = PBXGroup; children = ( AB85D77414ABE42100286B70 /* App Icons */, AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */, AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */, AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */, AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */, AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */, AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */, AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */, AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */, AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */, AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */, AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */, AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */, AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */, AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */, AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */, AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */, AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */, ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */, AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */, AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */, AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */, AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */, AB7EC7F2189B2B92009D198A /* Icon_AutoholdClear_420x420.png */, AB7EC7F3189B2B92009D198A /* Icon_AutoholdSet_420x420.png */, AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */, ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */, ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */, ABDDF7C41898F024007583C1 /* Icon_DisplayToggle_420x420.png */, AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */, AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */, AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */, AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */, AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */, AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */, AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */, AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */, AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */, AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */, AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */, ABDDF7C71898F032007583C1 /* Icon_FrameAdvance_420x420.png */, ABDDF7C81898F032007583C1 /* Icon_FrameJump_420x420.png */, AB681013187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png */, AB681014187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png */, AB681015187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png */, AB681016187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png */, AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */, ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */, ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */, ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */, ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */, ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */, ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */, AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */, AB681018187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png */, AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */, AB681019187D4AEF0049F2C2 /* Icon_Piano_256x256.png */, AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */, AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */, AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */, AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */, AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */, AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */, AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */, ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */, ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, ABAB454E187CDB70007BE20C /* Image_GuitarGrip.png */, AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */, AB0038A61872A96700B0B055 /* Image_PaddleController.png */, AB56490A186E6F67002740F4 /* Image_PassME.png */, AB56490B186E6F67002740F4 /* Image_Piano.png */, AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, ); name = Images; sourceTree = ""; }; ABC572B7134592D900E7B0B1 /* Core */ = { isa = PBXGroup; children = ( ABD1FEFF1345AC9B00AF11D1 /* addons */, ABD1FF161345ACA900AF11D1 /* gdbstub */, ABFE14F914C92FF5005D6699 /* filter */, ABD1FF761345ACFA00AF11D1 /* metaspu */, ABD1FF1C1345ACBF00AF11D1 /* utils */, ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */, ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */, AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */, ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */, ABD1FEA51345AC8400AF11D1 /* bios.cpp */, ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */, ABD1FEA71345AC8400AF11D1 /* commandline.cpp */, ABD1FEA81345AC8400AF11D1 /* common.cpp */, ABD1FEA91345AC8400AF11D1 /* cp15.cpp */, ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */, ABD1FEAB1345AC8400AF11D1 /* debug.cpp */, ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */, ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */, ABD1FEAE1345AC8400AF11D1 /* driver.cpp */, ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */, ABCFA9F3178BDE920030C8BA /* encrypt.cpp */, ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */, ABD1FEB11345AC8400AF11D1 /* firmware.cpp */, ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */, ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */, ABD1FEB71345AC8400AF11D1 /* GPU.cpp */, ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */, ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */, ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */, ABD1FEB91345AC8400AF11D1 /* matrix.cpp */, ABD1FEBA1345AC8400AF11D1 /* mc.cpp */, ABD1FEBD1345AC8400AF11D1 /* mic.cpp */, ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */, ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */, ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */, ABD1FEBF1345AC8400AF11D1 /* movie.cpp */, ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */, ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */, AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */, ABD1FEC21345AC8400AF11D1 /* path.cpp */, ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */, ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */, ABD1FEC51345AC8400AF11D1 /* render3D.cpp */, ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */, ABD1FEC71345AC8400AF11D1 /* rtc.cpp */, ABD1FEC81345AC8400AF11D1 /* saves.cpp */, ABD1FEC91345AC8400AF11D1 /* slot1.cpp */, AB29B16118313AF5009B7982 /* slot2.cpp */, ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */, ABD1FECB1345AC8400AF11D1 /* SPU.cpp */, ABD1FECC1345AC8400AF11D1 /* texcache.cpp */, ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */, ABD1FECE1345AC8400AF11D1 /* version.cpp */, ABD1FECF1345AC8400AF11D1 /* wifi.cpp */, ABD1FE6C1345AC8400AF11D1 /* agg2d.h */, ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */, ABD1FE6F1345AC8400AF11D1 /* armcpu.h */, AB796CA115CDCB4600C59155 /* arm_jit.h */, ABD1FE701345AC8400AF11D1 /* bios.h */, ABD1FE711345AC8400AF11D1 /* bits.h */, ABD1FE721345AC8400AF11D1 /* cheatSystem.h */, ABD1FE731345AC8400AF11D1 /* commandline.h */, ABD1FE741345AC8400AF11D1 /* common.h */, ABD1FE751345AC8400AF11D1 /* cp15.h */, ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */, ABD1FE771345AC8400AF11D1 /* debug.h */, ABD1FE781345AC8400AF11D1 /* desmume_config.h */, ABD1FE791345AC8400AF11D1 /* Disassembler.h */, ABD1FE7A1345AC8400AF11D1 /* driver.h */, ABD1FE7C1345AC8400AF11D1 /* emufile.h */, ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */, ABCFA9F2178BDE920030C8BA /* encrypt.h */, ABD1FE7D1345AC8400AF11D1 /* FIFO.h */, ABD1FE7E1345AC8400AF11D1 /* firmware.h */, ABD1FE7F1345AC8400AF11D1 /* fs.h */, ABD1FE801345AC8400AF11D1 /* gdbstub.h */, ABD1FE811345AC8400AF11D1 /* gfx3d.h */, ABD1FE831345AC8400AF11D1 /* GPU.h */, ABD1FE821345AC8400AF11D1 /* GPU_osd.h */, AB796CA215CDCB6B00C59155 /* instruction_attributes.h */, AB796CA315CDCB6B00C59155 /* instructions.h */, ABD1FE841345AC8400AF11D1 /* lua-engine.h */, ABD1FE851345AC8400AF11D1 /* matrix.h */, ABD1FE861345AC8400AF11D1 /* mc.h */, ABD1FE871345AC8400AF11D1 /* mem.h */, ABD1FE881345AC8400AF11D1 /* mic.h */, ABD1FE8A1345AC8400AF11D1 /* MMU.h */, ABD1FE891345AC8400AF11D1 /* MMU_timing.h */, ABD1FE8B1345AC8400AF11D1 /* movie.h */, ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */, ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */, ABBB421516B4A5F30012E5AB /* OGLRender_3_2.h */, ABD1FE8F1345AC8400AF11D1 /* PACKED.h */, ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */, ABD1FE901345AC8400AF11D1 /* path.h */, ABD1FE911345AC8400AF11D1 /* rasterize.h */, ABD1FE921345AC8400AF11D1 /* readwrite.h */, ABD1FE931345AC8400AF11D1 /* registers.h */, ABD1FE941345AC8400AF11D1 /* render3D.h */, ABD1FE951345AC8400AF11D1 /* ROMReader.h */, ABD1FE961345AC8400AF11D1 /* rtc.h */, ABD1FE971345AC8400AF11D1 /* saves.h */, ABD1FE991345AC8400AF11D1 /* slot1.h */, AB29B15C18313ACD009B7982 /* slot2.h */, ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */, ABD1FE9B1345AC8400AF11D1 /* SPU.h */, ABD1FE9C1345AC8400AF11D1 /* texcache.h */, ABD1FE9E1345AC8400AF11D1 /* types.h */, ABD1FE9F1345AC8400AF11D1 /* version.h */, ABD1FEA01345AC8400AF11D1 /* wifi.h */, ); name = Core; sourceTree = ""; }; ABD1FEFF1345AC9B00AF11D1 /* addons */ = { isa = PBXGroup; children = ( ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */, ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */, AB9038A917C5ED2200F410BD /* slot1_retail_auto.cpp */, AB9038AA17C5ED2200F410BD /* slot1_retail_mcrom.cpp */, AB2EE12B17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp */, AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */, AB9038AB17C5ED2200F410BD /* slot1comp_mc.cpp */, AB8B7AAB17CE8C440051CEBF /* slot1comp_protocol.cpp */, AB9038AD17C5ED2200F410BD /* slot1comp_rom.cpp */, AB29B16518313C14009B7982 /* slot2_auto.cpp */, ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */, ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */, ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */, ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */, ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */, ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */, AB1773FC182ECA8A009F29DD /* slot2_passme.cpp */, ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */, ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */, AB9038AC17C5ED2200F410BD /* slot1comp_mc.h */, AB8B7AAA17CE8C440051CEBF /* slot1comp_protocol.h */, AB9038AE17C5ED2200F410BD /* slot1comp_rom.h */, ); name = addons; path = ../addons; sourceTree = SOURCE_ROOT; }; ABD1FF161345ACA900AF11D1 /* gdbstub */ = { isa = PBXGroup; children = ( ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */, ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */, ); name = gdbstub; path = ../gdbstub; sourceTree = SOURCE_ROOT; }; ABD1FF1C1345ACBF00AF11D1 /* utils */ = { isa = PBXGroup; children = ( AB796D7415CDD20E00C59155 /* AsmJit */, ABD1FF211345ACBF00AF11D1 /* decrypt */, ABD1FF2E1345ACBF00AF11D1 /* libfat */, ABE670241415DE6C00E8E4C9 /* tinyxml */, ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */, AB9038A517C5ECFD00F410BD /* advanscene.cpp */, ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */, ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */, ABD1FF291345ACBF00AF11D1 /* emufat.cpp */, AB2EE13017D57F5000F68622 /* fsnitro.cpp */, ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */, ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */, ABD1FF4C1345ACBF00AF11D1 /* task.cpp */, ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */, ABD1FF511345ACBF00AF11D1 /* xstring.cpp */, AB9038A417C5ECFD00F410BD /* advanscene.h */, ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */, ABD1FF201345ACBF00AF11D1 /* datetime.h */, ABD1FF2A1345ACBF00AF11D1 /* emufat.h */, ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */, AB2EE12F17D57F5000F68622 /* fsnitro.h */, ABD1FF2D1345ACBF00AF11D1 /* guid.h */, ABD1FF4B1345ACBF00AF11D1 /* md5.h */, ABD1FF4D1345ACBF00AF11D1 /* task.h */, ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */, ABD1FF501345ACBF00AF11D1 /* vfat.h */, ABD1FF521345ACBF00AF11D1 /* xstring.h */, ); name = utils; path = ../utils; sourceTree = SOURCE_ROOT; }; ABD1FF211345ACBF00AF11D1 /* decrypt */ = { isa = PBXGroup; children = ( ABD1FF221345ACBF00AF11D1 /* crc.cpp */, ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */, ABD1FF261345ACBF00AF11D1 /* header.cpp */, ABD1FF231345ACBF00AF11D1 /* crc.h */, ABD1FF251345ACBF00AF11D1 /* decrypt.h */, ABD1FF271345ACBF00AF11D1 /* header.h */, ); path = decrypt; sourceTree = ""; }; ABD1FF2E1345ACBF00AF11D1 /* libfat */ = { isa = PBXGroup; children = ( ABD1FF301345ACBF00AF11D1 /* cache.cpp */, ABD1FF331345ACBF00AF11D1 /* directory.cpp */, ABD1FF351345ACBF00AF11D1 /* disc.cpp */, ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */, ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */, ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */, ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */, ABD1FF411345ACBF00AF11D1 /* libfat.cpp */, ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */, ABD1FF451345ACBF00AF11D1 /* lock.cpp */, ABD1FF481345ACBF00AF11D1 /* partition.cpp */, ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */, ABD1FF311345ACBF00AF11D1 /* cache.h */, ABD1FF321345ACBF00AF11D1 /* common.h */, ABD1FF341345ACBF00AF11D1 /* directory.h */, ABD1FF361345ACBF00AF11D1 /* disc.h */, ABD1FF371345ACBF00AF11D1 /* disc_io.h */, ABD1FF381345ACBF00AF11D1 /* fat.h */, ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */, ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */, ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */, ABD1FF401345ACBF00AF11D1 /* filetime.h */, ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */, ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */, ABD1FF461345ACBF00AF11D1 /* lock.h */, ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */, ABD1FF491345ACBF00AF11D1 /* partition.h */, ); path = libfat; sourceTree = ""; }; ABD1FF761345ACFA00AF11D1 /* metaspu */ = { isa = PBXGroup; children = ( ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */, ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */, ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */, ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */, ABD1FF781345ACFA00AF11D1 /* metaspu.h */, ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */, ); name = metaspu; path = ../metaspu; sourceTree = SOURCE_ROOT; }; ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */ = { isa = PBXGroup; children = ( ABAD3E5913AF1D6D00502E1E /* AAFilter.h */, ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */, ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */, ABAD3E5C13AF1D6D00502E1E /* FIFOSampleBuffer.h */, ABAD3E5D13AF1D6D00502E1E /* FIFOSamplePipe.h */, ABAD3E5E13AF1D6D00502E1E /* FIRFilter.h */, ABAD3E5F13AF1D6D00502E1E /* RateTransposer.h */, ABAD3E6013AF1D6D00502E1E /* SoundTouch.h */, ABAD3E6113AF1D6D00502E1E /* STTypes.h */, ABAD3E6213AF1D6D00502E1E /* TDStretch.h */, ABAD3E6313AF1D6D00502E1E /* WavFile.h */, ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */, ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */, ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */, ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */, ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */, ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */, ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */, ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */, ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */, ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */, ); path = SoundTouch; sourceTree = ""; }; ABE670241415DE6C00E8E4C9 /* tinyxml */ = { isa = PBXGroup; children = ( ABE670251415DE6C00E8E4C9 /* tinystr.cpp */, ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */, ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */, ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */, ABE670261415DE6C00E8E4C9 /* tinystr.h */, ABE670281415DE6C00E8E4C9 /* tinyxml.h */, ); path = tinyxml; sourceTree = ""; }; ABFE14F914C92FF5005D6699 /* filter */ = { isa = PBXGroup; children = ( ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */, ABFE14FB14C92FF5005D6699 /* bilinear.cpp */, ABFE14FC14C92FF5005D6699 /* epx.cpp */, ABFE14FE14C92FF5005D6699 /* hq2x.cpp */, ABFE150014C92FF5005D6699 /* hq4x.cpp */, ABFE150414C92FF5005D6699 /* lq2x.cpp */, ABFE150614C92FF5005D6699 /* scanline.cpp */, AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */, AB47B52C18A3F722009A42AF /* xbrz.cpp */, ABFE14FD14C92FF5005D6699 /* filter.h */, ABFE14FF14C92FF5005D6699 /* hq2x.h */, ABFE150214C92FF5005D6699 /* hq4x.h */, ABFE150314C92FF5005D6699 /* interp.h */, ABFE150514C92FF5005D6699 /* lq2x.h */, AB817A34143EE2DB00A7DFE9 /* videofilter.h */, AB47B52B18A3F722009A42AF /* xbrz.h */, ); name = filter; path = ../filter; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D1107260486CEB800E47090 /* DeSmuME (OS X App; v10.5 Leopard Release Build) */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; v10.5 Leopard Release Build)" */; buildPhases = ( AB75221714C79884009B97B3 /* ShellScript */, 8D1107290486CEB800E47090 /* Resources */, AB2DF23415E0838600B4D0BC /* ShellScript */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, AB067BF0153E59B000F417B1 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; v10.5 Leopard Release Build)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = 8D1107320486CEB800E47090 /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; AB796CA415CDCBA200C59155 /* DeSmuME (OS X App) */ = { isa = PBXNativeTarget; buildConfigurationList = AB796D6D15CDCBA200C59155 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App)" */; buildPhases = ( AB796CA515CDCBA200C59155 /* ShellScript */, AB796CA615CDCBA200C59155 /* Resources */, AB2DF23215E0834E00B4D0BC /* ShellScript */, AB796CEE15CDCBA200C59155 /* Sources */, AB796D6515CDCBA200C59155 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB796D7015CDCBA200C59155 /* DeSmuME (Debug).app */; productType = "com.apple.product-type.application"; }; AB8F3C171A53AC2600A80BF6 /* DeSmuME (OS X App; dev+) */ = { isa = PBXNativeTarget; buildConfigurationList = AB8F3D2B1A53AC2600A80BF6 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; dev+)" */; buildPhases = ( AB8F3C181A53AC2600A80BF6 /* ShellScript */, AB8F3C191A53AC2600A80BF6 /* Resources */, AB8F3C721A53AC2600A80BF6 /* ShellScript */, AB8F3C731A53AC2600A80BF6 /* Sources */, AB8F3D1E1A53AC2600A80BF6 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; dev+)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB8F3D2E1A53AC2600A80BF6 /* DeSmuME (Debug, dev+).app */; productType = "com.apple.product-type.application"; }; ABB3C6461501BC6D00E0C22E /* DeSmuME (OpenEmu Plug-in) */ = { isa = PBXNativeTarget; buildConfigurationList = ABB3C6571501BC6D00E0C22E /* Build configuration list for PBXNativeTarget "DeSmuME (OpenEmu Plug-in)" */; buildPhases = ( ABB3C6611501BF3700E0C22E /* Resources */, AB2DF23515E0839D00B4D0BC /* ShellScript */, ABB3C6431501BC6D00E0C22E /* Sources */, ABB3C6441501BC6D00E0C22E /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OpenEmu Plug-in)"; productName = DeSmuME; productReference = ABB3C6471501BC6D00E0C22E /* DeSmuME.oecoreplugin */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0460; ORGANIZATIONNAME = "DeSmuME Team"; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (Latest)" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, Italian, Chinese, Norwegian, Romanian, en, ); mainGroup = 29B97314FDCFA39411CA2CEA /* DeSmuME */; projectDirPath = ""; projectRoot = ""; targets = ( AB796CA415CDCBA200C59155 /* DeSmuME (OS X App) */, 8D1107260486CEB800E47090 /* DeSmuME (OS X App; v10.5 Leopard Release Build) */, AB8F3C171A53AC2600A80BF6 /* DeSmuME (OS X App; dev+) */, ABB3C6461501BC6D00E0C22E /* DeSmuME (OpenEmu Plug-in) */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB02475C13886BF300E9F9AB /* KeyNames.plist in Resources */, ABB0FBDA1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */, ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */, ABBC0F8D1394B1AA0028B6BD /* DefaultUserPrefs.plist in Resources */, AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */, ABEFCF61141AB82A000CC0CD /* AppIcon_ROMSave.icns in Resources */, ABEFCF62141AB82A000CC0CD /* AppIcon_DeSmuME.icns in Resources */, ABB0FBD01A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, ABEFCF63141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns in Resources */, ABEFCF64141AB82A000CC0CD /* AppIcon_SaveState.icns in Resources */, AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */, AB00E87E14205EBC00DE561F /* MainMenu.xib in Resources */, AB901BDE1420706100348EEC /* Localizable.strings in Resources */, ABB97876144E89CC00793FA3 /* Icon_ActionReplay_32x32.png in Resources */, ABB97877144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png in Resources */, ABB97878144E89CC00793FA3 /* Icon_DeSmuME_32x32.png in Resources */, AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */, ABBF04A514B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */, AB564915186E6F67002740F4 /* Image_Piano.png in Resources */, ABC3AF2F14B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */, ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */, ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */, ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */, ABB0FBD31A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */, ABDDF7CC1898F032007583C1 /* Icon_FrameJump_420x420.png in Resources */, AB0F290214BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */, AB0F290314BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */, AB0F290414BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */, AB0F290514BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */, AB0F293814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */, AB0F293914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */, AB0F293A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB0F293B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB0F293C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB0F293D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */, ABC503AF1AAC2B91002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, AB0F293E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */, AB0F293F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB0F294014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */, AB0F294114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */, AB0F294214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */, AB68101E187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, AB0F294314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */, AB68101C187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, AB0F294414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB0F294514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */, AB564911186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */, AB0F294614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */, AB0F294714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */, AB0F296D14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */, AB0F296E14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */, AB0F297A14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */, AB564913186E6F67002740F4 /* Image_PassME.png in Resources */, AB681026187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png in Resources */, AB0F298C14BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */, AB0F298D14BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */, AB0F298E14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */, AB7EC7F5189B2B92009D198A /* Icon_AutoholdClear_420x420.png in Resources */, ABDDF7C61898F024007583C1 /* Icon_DisplayToggle_420x420.png in Resources */, AB0F298F14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */, AB0F29A614BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */, AB0F29A714BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */, AB0F29A814BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */, AB681028187D4AEF0049F2C2 /* Icon_Piano_256x256.png in Resources */, ABDDF7CA1898F032007583C1 /* Icon_FrameAdvance_420x420.png in Resources */, AB0F29A914BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */, AB0F29AA14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */, AB0F29AB14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */, AB0F29AC14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */, AB0F29AD14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */, AB0038A81872A96700B0B055 /* Image_PaddleController.png in Resources */, AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */, AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */, AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */, AB7EC7F7189B2B92009D198A /* Icon_AutoholdSet_420x420.png in Resources */, ABB0FBCD1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */, AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */, AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */, AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */, AB0F29B514BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */, AB0F29B614BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */, AB0F29B714BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */, AB3ACC3E14C24D5400D7D192 /* AUTHORS in Resources */, AB3ACC3F14C24D5400D7D192 /* ChangeLog in Resources */, AB3ACC4014C24D5400D7D192 /* COPYING in Resources */, AB3ACC4114C24D5400D7D192 /* README in Resources */, ABB0FBD61A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */, AB681020187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABAB4550187CDB70007BE20C /* Image_GuitarGrip.png in Resources */, AB681022187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */, AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, AB8967DE16D2ED2700F826F1 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB796CA615CDCBA200C59155 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB796CA715CDCBA200C59155 /* KeyNames.plist in Resources */, ABB0FBD91A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */, AB796CA815CDCBA200C59155 /* DefaultKeyMappings.plist in Resources */, AB796CA915CDCBA200C59155 /* DefaultUserPrefs.plist in Resources */, AB796CAA15CDCBA200C59155 /* FileTypeInfo.plist in Resources */, AB796CAB15CDCBA200C59155 /* AppIcon_ROMSave.icns in Resources */, AB796CAC15CDCBA200C59155 /* AppIcon_DeSmuME.icns in Resources */, ABB0FBCF1A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, AB796CAD15CDCBA200C59155 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB796CAE15CDCBA200C59155 /* AppIcon_SaveState.icns in Resources */, AB796CAF15CDCBA200C59155 /* InfoPlist.strings in Resources */, AB796CB015CDCBA200C59155 /* MainMenu.xib in Resources */, AB796CB115CDCBA200C59155 /* Localizable.strings in Resources */, AB796CB215CDCBA200C59155 /* Icon_ActionReplay_32x32.png in Resources */, AB796CB315CDCBA200C59155 /* Icon_CodeBreaker_32x32.png in Resources */, AB796CB415CDCBA200C59155 /* Icon_DeSmuME_32x32.png in Resources */, AB796CB515CDCBA200C59155 /* HID_usage_strings.plist in Resources */, AB796CB615CDCBA200C59155 /* AppIcon_ROMCheats.icns in Resources */, AB564914186E6F67002740F4 /* Image_Piano.png in Resources */, AB796CB715CDCBA200C59155 /* Icon_VolumeFull_16x16.png in Resources */, AB796CB815CDCBA200C59155 /* Icon_VolumeMute_16x16.png in Resources */, AB796CB915CDCBA200C59155 /* Icon_VolumeOneThird_16x16.png in Resources */, AB796CBA15CDCBA200C59155 /* Icon_VolumeTwoThird_16x16.png in Resources */, ABB0FBD21A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */, ABDDF7CB1898F032007583C1 /* Icon_FrameJump_420x420.png in Resources */, AB796CBB15CDCBA200C59155 /* Icon_Execute_420x420.png in Resources */, AB796CBC15CDCBA200C59155 /* Icon_Pause_420x420.png in Resources */, AB796CBD15CDCBA200C59155 /* Icon_Speed1x_420x420.png in Resources */, AB796CBE15CDCBA200C59155 /* Icon_Speed2x_420x420.png in Resources */, AB796CBF15CDCBA200C59155 /* ColorSwatch_Blue_16x16.png in Resources */, AB796CC015CDCBA200C59155 /* ColorSwatch_Brown_16x16.png in Resources */, AB796CC115CDCBA200C59155 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB796CC215CDCBA200C59155 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB796CC315CDCBA200C59155 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB796CC415CDCBA200C59155 /* ColorSwatch_Gray_16x16.png in Resources */, ABC503AD1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, AB796CC515CDCBA200C59155 /* ColorSwatch_Green_16x16.png in Resources */, AB796CC615CDCBA200C59155 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB796CC715CDCBA200C59155 /* ColorSwatch_Magenta_16x16.png in Resources */, AB796CC815CDCBA200C59155 /* ColorSwatch_Orange_16x16.png in Resources */, AB796CC915CDCBA200C59155 /* ColorSwatch_Pink_16x16.png in Resources */, AB68101D187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, AB796CCA15CDCBA200C59155 /* ColorSwatch_Red_16x16.png in Resources */, AB68101B187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, AB796CCB15CDCBA200C59155 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB796CCC15CDCBA200C59155 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB564910186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */, AB796CCD15CDCBA200C59155 /* ColorSwatch_Violet_16x16.png in Resources */, AB796CCE15CDCBA200C59155 /* ColorSwatch_Yellow_16x16.png in Resources */, AB796CCF15CDCBA200C59155 /* Icon_ActionReplay_128x128.png in Resources */, AB796CD015CDCBA200C59155 /* Icon_CodeBreaker_128x128.png in Resources */, AB796CD115CDCBA200C59155 /* VideoFilterPreview_64x64.png in Resources */, AB564912186E6F67002740F4 /* Image_PassME.png in Resources */, AB681025187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png in Resources */, AB796CD215CDCBA200C59155 /* Icon_ArrowDown_420x420.png in Resources */, AB796CD315CDCBA200C59155 /* Icon_ArrowLeft_420x420.png in Resources */, AB796CD415CDCBA200C59155 /* Icon_ArrowRight_420x420.png in Resources */, AB7EC7F4189B2B92009D198A /* Icon_AutoholdClear_420x420.png in Resources */, ABDDF7C51898F024007583C1 /* Icon_DisplayToggle_420x420.png in Resources */, AB796CD515CDCBA200C59155 /* Icon_ArrowUp_420x420.png in Resources */, AB796CD615CDCBA200C59155 /* Icon_DoubleSpeed_420x420.png in Resources */, AB796CD715CDCBA200C59155 /* Icon_DSButtonA_420x420.png in Resources */, AB796CD815CDCBA200C59155 /* Icon_DSButtonB_420x420.png in Resources */, AB681027187D4AEF0049F2C2 /* Icon_Piano_256x256.png in Resources */, ABDDF7C91898F032007583C1 /* Icon_FrameAdvance_420x420.png in Resources */, AB796CD915CDCBA200C59155 /* Icon_DSButtonL_420x420.png in Resources */, AB796CDA15CDCBA200C59155 /* Icon_DSButtonR_420x420.png in Resources */, AB796CDB15CDCBA200C59155 /* Icon_DSButtonSelect_420x420.png in Resources */, AB796CDC15CDCBA200C59155 /* Icon_DSButtonStart_420x420.png in Resources */, AB796CDD15CDCBA200C59155 /* Icon_DSButtonX_420x420.png in Resources */, AB0038A71872A96700B0B055 /* Image_PaddleController.png in Resources */, AB796CDE15CDCBA200C59155 /* Icon_DSButtonY_420x420.png in Resources */, AB796CDF15CDCBA200C59155 /* Icon_Emulation_420x420.png in Resources */, AB796CE015CDCBA200C59155 /* Icon_Input_420x420.png in Resources */, AB7EC7F6189B2B92009D198A /* Icon_AutoholdSet_420x420.png in Resources */, ABB0FBCC1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */, AB796CE215CDCBA200C59155 /* Icon_OpenROM_420x420.png in Resources */, AB796CE315CDCBA200C59155 /* Icon_Reset_420x420.png in Resources */, AB796CE415CDCBA200C59155 /* Icon_RotateCCW_420x420.png in Resources */, AB796CE515CDCBA200C59155 /* Icon_RotateCW_420x420.png in Resources */, AB796CE615CDCBA200C59155 /* Icon_ShowHUD_420x420.png in Resources */, AB796CE715CDCBA200C59155 /* Icon_Speaker_420x420.png in Resources */, AB796CE815CDCBA200C59155 /* AUTHORS in Resources */, AB796CE915CDCBA200C59155 /* ChangeLog in Resources */, AB796CEA15CDCBA200C59155 /* COPYING in Resources */, AB796CEB15CDCBA200C59155 /* README in Resources */, ABB0FBD51A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */, AB68101F187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABAB454F187CDB70007BE20C /* Image_GuitarGrip.png in Resources */, AB681021187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB796CEC15CDCBA200C59155 /* README.MAC in Resources */, AB796CED15CDCBA200C59155 /* AppIcon_FirmwareConfig.icns in Resources */, AB8967DD16D2ED2700F826F1 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB8F3C191A53AC2600A80BF6 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB8F3C1A1A53AC2600A80BF6 /* KeyNames.plist in Resources */, ABB0FBDB1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */, AB8F3C1B1A53AC2600A80BF6 /* DefaultKeyMappings.plist in Resources */, AB8F3C1C1A53AC2600A80BF6 /* DefaultUserPrefs.plist in Resources */, AB8F3C1D1A53AC2600A80BF6 /* FileTypeInfo.plist in Resources */, AB8F3C1E1A53AC2600A80BF6 /* AppIcon_ROMSave.icns in Resources */, AB8F3C1F1A53AC2600A80BF6 /* AppIcon_DeSmuME.icns in Resources */, ABB0FBD11A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, AB8F3C201A53AC2600A80BF6 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB8F3C211A53AC2600A80BF6 /* AppIcon_SaveState.icns in Resources */, AB8F3C221A53AC2600A80BF6 /* InfoPlist.strings in Resources */, AB8F3C231A53AC2600A80BF6 /* MainMenu.xib in Resources */, AB8F3C241A53AC2600A80BF6 /* Localizable.strings in Resources */, AB8F3C251A53AC2600A80BF6 /* Icon_ActionReplay_32x32.png in Resources */, AB8F3C261A53AC2600A80BF6 /* Icon_CodeBreaker_32x32.png in Resources */, AB8F3C271A53AC2600A80BF6 /* Icon_DeSmuME_32x32.png in Resources */, AB8F3C281A53AC2600A80BF6 /* HID_usage_strings.plist in Resources */, AB8F3C291A53AC2600A80BF6 /* AppIcon_ROMCheats.icns in Resources */, AB8F3C2A1A53AC2600A80BF6 /* Image_Piano.png in Resources */, AB8F3C2B1A53AC2600A80BF6 /* Icon_VolumeFull_16x16.png in Resources */, AB8F3C2C1A53AC2600A80BF6 /* Icon_VolumeMute_16x16.png in Resources */, AB8F3C2D1A53AC2600A80BF6 /* Icon_VolumeOneThird_16x16.png in Resources */, AB8F3C2E1A53AC2600A80BF6 /* Icon_VolumeTwoThird_16x16.png in Resources */, ABB0FBD41A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */, AB8F3C2F1A53AC2600A80BF6 /* Icon_FrameJump_420x420.png in Resources */, AB8F3C301A53AC2600A80BF6 /* Icon_Execute_420x420.png in Resources */, AB8F3C311A53AC2600A80BF6 /* Icon_Pause_420x420.png in Resources */, AB8F3C321A53AC2600A80BF6 /* Icon_Speed1x_420x420.png in Resources */, AB8F3C331A53AC2600A80BF6 /* Icon_Speed2x_420x420.png in Resources */, AB8F3C341A53AC2600A80BF6 /* ColorSwatch_Blue_16x16.png in Resources */, AB8F3C351A53AC2600A80BF6 /* ColorSwatch_Brown_16x16.png in Resources */, AB8F3C361A53AC2600A80BF6 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB8F3C371A53AC2600A80BF6 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB8F3C381A53AC2600A80BF6 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB8F3C391A53AC2600A80BF6 /* ColorSwatch_Gray_16x16.png in Resources */, ABC503AE1AAC2B90002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, AB8F3C3A1A53AC2600A80BF6 /* ColorSwatch_Green_16x16.png in Resources */, AB8F3C3B1A53AC2600A80BF6 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB8F3C3C1A53AC2600A80BF6 /* ColorSwatch_Magenta_16x16.png in Resources */, AB8F3C3D1A53AC2600A80BF6 /* ColorSwatch_Orange_16x16.png in Resources */, AB8F3C3E1A53AC2600A80BF6 /* ColorSwatch_Pink_16x16.png in Resources */, AB8F3C3F1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, AB8F3C401A53AC2600A80BF6 /* ColorSwatch_Red_16x16.png in Resources */, AB8F3C411A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, AB8F3C421A53AC2600A80BF6 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB8F3C431A53AC2600A80BF6 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB8F3C441A53AC2600A80BF6 /* Image_MemoryExpansionPak.png in Resources */, AB8F3C451A53AC2600A80BF6 /* ColorSwatch_Violet_16x16.png in Resources */, AB8F3C461A53AC2600A80BF6 /* ColorSwatch_Yellow_16x16.png in Resources */, AB8F3C471A53AC2600A80BF6 /* Icon_ActionReplay_128x128.png in Resources */, AB8F3C481A53AC2600A80BF6 /* Icon_CodeBreaker_128x128.png in Resources */, AB8F3C491A53AC2600A80BF6 /* VideoFilterPreview_64x64.png in Resources */, AB8F3C4A1A53AC2600A80BF6 /* Image_PassME.png in Resources */, AB8F3C4B1A53AC2600A80BF6 /* Icon_PaddleKnob_256x256.png in Resources */, AB8F3C4C1A53AC2600A80BF6 /* Icon_ArrowDown_420x420.png in Resources */, AB8F3C4D1A53AC2600A80BF6 /* Icon_ArrowLeft_420x420.png in Resources */, AB8F3C4E1A53AC2600A80BF6 /* Icon_ArrowRight_420x420.png in Resources */, AB8F3C4F1A53AC2600A80BF6 /* Icon_AutoholdClear_420x420.png in Resources */, AB8F3C501A53AC2600A80BF6 /* Icon_DisplayToggle_420x420.png in Resources */, AB8F3C511A53AC2600A80BF6 /* Icon_ArrowUp_420x420.png in Resources */, AB8F3C521A53AC2600A80BF6 /* Icon_DoubleSpeed_420x420.png in Resources */, AB8F3C531A53AC2600A80BF6 /* Icon_DSButtonA_420x420.png in Resources */, AB8F3C541A53AC2600A80BF6 /* Icon_DSButtonB_420x420.png in Resources */, AB8F3C551A53AC2600A80BF6 /* Icon_Piano_256x256.png in Resources */, AB8F3C561A53AC2600A80BF6 /* Icon_FrameAdvance_420x420.png in Resources */, AB8F3C571A53AC2600A80BF6 /* Icon_DSButtonL_420x420.png in Resources */, AB8F3C581A53AC2600A80BF6 /* Icon_DSButtonR_420x420.png in Resources */, AB8F3C591A53AC2600A80BF6 /* Icon_DSButtonSelect_420x420.png in Resources */, AB8F3C5A1A53AC2600A80BF6 /* Icon_DSButtonStart_420x420.png in Resources */, AB8F3C5B1A53AC2600A80BF6 /* Icon_DSButtonX_420x420.png in Resources */, AB8F3C5C1A53AC2600A80BF6 /* Image_PaddleController.png in Resources */, AB8F3C5D1A53AC2600A80BF6 /* Icon_DSButtonY_420x420.png in Resources */, AB8F3C5E1A53AC2600A80BF6 /* Icon_Emulation_420x420.png in Resources */, AB8F3C5F1A53AC2600A80BF6 /* Icon_Input_420x420.png in Resources */, AB8F3C601A53AC2600A80BF6 /* Icon_AutoholdSet_420x420.png in Resources */, ABB0FBCE1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */, AB8F3C621A53AC2600A80BF6 /* Icon_OpenROM_420x420.png in Resources */, AB8F3C631A53AC2600A80BF6 /* Icon_Reset_420x420.png in Resources */, AB8F3C641A53AC2600A80BF6 /* Icon_RotateCCW_420x420.png in Resources */, AB8F3C651A53AC2600A80BF6 /* Icon_RotateCW_420x420.png in Resources */, AB8F3C661A53AC2600A80BF6 /* Icon_ShowHUD_420x420.png in Resources */, AB8F3C671A53AC2600A80BF6 /* Icon_Speaker_420x420.png in Resources */, AB8F3C681A53AC2600A80BF6 /* AUTHORS in Resources */, AB8F3C691A53AC2600A80BF6 /* ChangeLog in Resources */, AB8F3C6A1A53AC2600A80BF6 /* COPYING in Resources */, AB8F3C6B1A53AC2600A80BF6 /* README in Resources */, ABB0FBD71A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */, AB8F3C6C1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, AB8F3C6D1A53AC2600A80BF6 /* Image_GuitarGrip.png in Resources */, AB8F3C6E1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB8F3C6F1A53AC2600A80BF6 /* README.MAC in Resources */, AB8F3C701A53AC2600A80BF6 /* AppIcon_FirmwareConfig.icns in Resources */, AB8F3C711A53AC2600A80BF6 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABB3C6611501BF3700E0C22E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ABB3C6621501BF4E00E0C22E /* InfoPlist.strings in Resources */, ABB3C6631501BF4E00E0C22E /* FileTypeInfo.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ AB067BF0153E59B000F417B1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "#!/bin/sh\n\n# This script creates an application package that merges the ppc binary of an\n# Xcode 3 PowerPC release build to the i386 and x86_64 binaries of an Xcode 4\n# (or later) release build.\n#\n# Before you use this script, make sure that you already have an existing\n# PowerPC Release build from Xcode 3 in the ${SRCROOT}/build/Release directory.\n\nif test -e \"${SRCROOT}/build/Release/DeSmuME (PPC).app/Contents/MacOS/DeSmuME (PPC)\"\nthen\n\n# Create the Merged Release directory, plus a working copy of the\n# universal binary .app.\ncd \"${SRCROOT}/build\"\nmkdir -p \"./Merged Release\"\ncd \"./Merged Release\"\ncp -a \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app\" \"./\"\nrm -f \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\"\n\n# Create the temp binaries for Intel.\ncd \"${TARGET_BUILD_DIR}\"\nlipo \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\" -thin i386 -output \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_i386\"\nlipo \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\" -thin x86_64 -output \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_x86_64\"\n\n# Merge the separate temp binaries into a single binary package.\ncd \"${SRCROOT}/build/Merged Release\"\nlipo \"../Release/DeSmuME (PPC).app/Contents/MacOS/DeSmuME (PPC)\" \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_i386\" \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_x86_64\" -create -output \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\"\n\n# Remove the temp binaries now that we're done with them.\nrm -f \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_i386\"\nrm -f \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_x86_64\"\n\nfi"; }; AB2DF23215E0834E00B4D0BC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; AB2DF23415E0838600B4D0BC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; AB2DF23515E0839D00B4D0BC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; AB75221714C79884009B97B3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB796CA515CDCBA200C59155 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB8F3C181A53AC2600A80BF6 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB8F3C721A53AC2600A80BF6 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ABD1FF531345ACBF00AF11D1 /* ConvertUTF.c in Sources */, ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */, ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */, ABAF0A421A96E67200B95B75 /* RomInfoPanel.mm in Sources */, ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */, ABD1FED41345AC8400AF11D1 /* bios.cpp in Sources */, ABD1FF5B1345ACBF00AF11D1 /* cache.cpp in Sources */, ABD1FED51345AC8400AF11D1 /* cheatSystem.cpp in Sources */, AB29B16718313C14009B7982 /* slot2_auto.cpp in Sources */, ABD1FED71345AC8400AF11D1 /* common.cpp in Sources */, ABD1FED81345AC8400AF11D1 /* cp15.cpp in Sources */, AB15CA7214A29EE500B8A6A4 /* cpu_detect_x86_gcc.cpp in Sources */, ABD1FF551345ACBF00AF11D1 /* crc.cpp in Sources */, AB181D0013B66889006CA82D /* datetime.cpp in Sources */, ABD1FEDA1345AC8400AF11D1 /* debug.cpp in Sources */, ABD1FF561345ACBF00AF11D1 /* decrypt.cpp in Sources */, ABD1FF5C1345ACBF00AF11D1 /* directory.cpp in Sources */, ABD1FEDC1345AC8400AF11D1 /* Disassembler.cpp in Sources */, ABD1FF5D1345ACBF00AF11D1 /* disc.cpp in Sources */, ABD1FF581345ACBF00AF11D1 /* dlditool.cpp in Sources */, ABD1FEDD1345AC8400AF11D1 /* driver.cpp in Sources */, ABD1FF591345ACBF00AF11D1 /* emufat.cpp in Sources */, ABD1FEDE1345AC8400AF11D1 /* emufile.cpp in Sources */, ABD1FF5E1345ACBF00AF11D1 /* fatdir.cpp in Sources */, ABB24F6E1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */, ABD1FF5F1345ACBF00AF11D1 /* fatfile.cpp in Sources */, ABD1FEDF1345AC8400AF11D1 /* FIFO.cpp in Sources */, ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */, ABD1FF601345ACBF00AF11D1 /* file_allocation_table.cpp in Sources */, AB2EE12D17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp in Sources */, ABD1FF611345ACBF00AF11D1 /* filetime.cpp in Sources */, ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */, ABD1FEE01345AC8400AF11D1 /* firmware.cpp in Sources */, AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */, ABD1FEE31345AC8400AF11D1 /* gfx3d.cpp in Sources */, ABD1FEE61345AC8400AF11D1 /* GPU.cpp in Sources */, ABD1FEE41345AC8400AF11D1 /* GPU_osd_stub.cpp in Sources */, ABD1FF5A1345ACBF00AF11D1 /* guid.cpp in Sources */, ABD1FF571345ACBF00AF11D1 /* header.cpp in Sources */, ABD1FF621345ACBF00AF11D1 /* libfat.cpp in Sources */, ABD1FF631345ACBF00AF11D1 /* libfat_public_api.cpp in Sources */, ABD1FF641345ACBF00AF11D1 /* lock.cpp in Sources */, ABD1FEE81345AC8400AF11D1 /* matrix.cpp in Sources */, ABD1FEE91345AC8400AF11D1 /* mc.cpp in Sources */, ABD1FF661345ACBF00AF11D1 /* md5.cpp in Sources */, ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */, ABD1FEED1345AC8400AF11D1 /* MMU.cpp in Sources */, ABAD3E7613AF1D6D00502E1E /* mmx_optimized.cpp in Sources */, ABD1FEEE1345AC8400AF11D1 /* movie.cpp in Sources */, AB29B16318313AF5009B7982 /* slot2.cpp in Sources */, ABD1FEEF1345AC8400AF11D1 /* NDSSystem.cpp in Sources */, ABD1FF651345ACBF00AF11D1 /* partition.cpp in Sources */, ABD1FEF11345AC8400AF11D1 /* path.cpp in Sources */, ABD1FEF21345AC8400AF11D1 /* rasterize.cpp in Sources */, ABAD3E7713AF1D6D00502E1E /* RateTransposer.cpp in Sources */, ABD1FEF31345AC8400AF11D1 /* readwrite.cpp in Sources */, ABD1FEF41345AC8400AF11D1 /* render3D.cpp in Sources */, ABD1FEF51345AC8400AF11D1 /* ROMReader.cpp in Sources */, ABD1FEF61345AC8400AF11D1 /* rtc.cpp in Sources */, ABD1FEF71345AC8400AF11D1 /* saves.cpp in Sources */, ABD1FEF81345AC8400AF11D1 /* slot1.cpp in Sources */, ABD1FF0B1345AC9C00AF11D1 /* slot1_none.cpp in Sources */, ABD1FF0C1345AC9C00AF11D1 /* slot1_r4.cpp in Sources */, AB6FBEF6139B6258007BB045 /* slot1_retail_nand.cpp in Sources */, ABCFA9F5178BDE920030C8BA /* encrypt.cpp in Sources */, ABD1FF0E1345AC9C00AF11D1 /* slot2_expMemory.cpp in Sources */, ABD1FF0F1345AC9C00AF11D1 /* slot2_gbagame.cpp in Sources */, ABD1FF101345AC9C00AF11D1 /* slot2_guitarGrip.cpp in Sources */, ABD1FF111345AC9C00AF11D1 /* slot2_mpcf.cpp in Sources */, ABE6840D189E33BC007FD69C /* OGLDisplayOutput.cpp in Sources */, ABD1FF121345AC9C00AF11D1 /* slot2_none.cpp in Sources */, ABD1FF131345AC9C00AF11D1 /* slot2_paddle.cpp in Sources */, ABD1FF141345AC9C00AF11D1 /* slot2_piano.cpp in Sources */, ABD1FF151345AC9C00AF11D1 /* slot2_rumblepak.cpp in Sources */, ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */, AB1F468413A0ADE400B80DE6 /* SndOut.cpp in Sources */, AB564905186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */, ABAD3E7813AF1D6D00502E1E /* SoundTouch.cpp in Sources */, AB9038B017C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */, ABD1FEFA1345AC8400AF11D1 /* SPU.cpp in Sources */, ABAD3E7913AF1D6D00502E1E /* sse_optimized.cpp in Sources */, ABD1FF671345ACBF00AF11D1 /* task.cpp in Sources */, ABAD3E7A13AF1D6D00502E1E /* TDStretch.cpp in Sources */, ABD1FEFB1345AC8400AF11D1 /* texcache.cpp in Sources */, ABD1FEFC1345AC8400AF11D1 /* thumb_instructions.cpp in Sources */, AB1F469813A0AE2F00B80DE6 /* Timestretcher.cpp in Sources */, ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */, AB9038B617C5ED2200F410BD /* slot1comp_mc.cpp in Sources */, ABE6702C1415DE6C00E8E4C9 /* tinyxml.cpp in Sources */, ABE6702D1415DE6C00E8E4C9 /* tinyxmlerror.cpp in Sources */, ABE6702E1415DE6C00E8E4C9 /* tinyxmlparser.cpp in Sources */, ABD1FEFD1345AC8400AF11D1 /* version.cpp in Sources */, ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */, ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */, AB1773FE182ECA8A009F29DD /* slot2_passme.cpp in Sources */, ABAD3E7B13AF1D6D00502E1E /* WavFile.cpp in Sources */, ABD1FEFE1345AC8400AF11D1 /* wifi.cpp in Sources */, AB9038B317C5ED2200F410BD /* slot1_retail_mcrom.cpp in Sources */, ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */, ABD104281346653B00AF11D1 /* main.m in Sources */, ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */, ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */, AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */, ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */, ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */, AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */, ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */, AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */, ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */, AB0F291D14BE6F4A009ABC6F /* OGLRender.cpp in Sources */, AB8B7AAD17CE8C440051CEBF /* slot1comp_protocol.cpp in Sources */, AB3ACB7214C2361100D7D192 /* appDelegate.mm in Sources */, AB3ACB7314C2361100D7D192 /* cheatWindowDelegate.mm in Sources */, AB3ACB7614C2361100D7D192 /* inputPrefsView.mm in Sources */, AB3ACB7714C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */, ABFE150714C92FF5005D6699 /* 2xsai.cpp in Sources */, ABFE150814C92FF5005D6699 /* bilinear.cpp in Sources */, ABFE150914C92FF5005D6699 /* epx.cpp in Sources */, ABFE150A14C92FF5005D6699 /* hq2x.cpp in Sources */, ABFE150B14C92FF5005D6699 /* hq4x.cpp in Sources */, AB9038A717C5ECFD00F410BD /* advanscene.cpp in Sources */, ABFE150D14C92FF5005D6699 /* lq2x.cpp in Sources */, AB47B52E18A3F722009A42AF /* xbrz.cpp in Sources */, ABFE150E14C92FF5005D6699 /* scanline.cpp in Sources */, AB1B9E631501A78000464647 /* coreaudiosound.cpp in Sources */, AB1B9E661501A78000464647 /* ringbuffer.cpp in Sources */, AB796C9C15CDCB0F00C59155 /* arm_jit.cpp in Sources */, ABF2B9FC16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */, AB40562B169F5DBB0016AC3E /* assembler.cpp in Sources */, AB40562E169F5DBB0016AC3E /* assert.cpp in Sources */, AB405631169F5DBB0016AC3E /* buffer.cpp in Sources */, AB405634169F5DBB0016AC3E /* compiler.cpp in Sources */, AB405637169F5DBB0016AC3E /* compilercontext.cpp in Sources */, AB40563A169F5DBB0016AC3E /* compilerfunc.cpp in Sources */, AB40563D169F5DBB0016AC3E /* compileritem.cpp in Sources */, AB405640169F5DBB0016AC3E /* context.cpp in Sources */, AB405643169F5DBB0016AC3E /* cpuinfo.cpp in Sources */, AB405646169F5DBB0016AC3E /* defs.cpp in Sources */, AB405649169F5DBB0016AC3E /* func.cpp in Sources */, AB40564C169F5DBB0016AC3E /* logger.cpp in Sources */, AB40564F169F5DBB0016AC3E /* memorymanager.cpp in Sources */, AB405652169F5DBB0016AC3E /* memorymarker.cpp in Sources */, AB405655169F5DBB0016AC3E /* operand.cpp in Sources */, AB405658169F5DBB0016AC3E /* stringbuilder.cpp in Sources */, AB40565B169F5DBB0016AC3E /* stringutil.cpp in Sources */, AB40565E169F5DBB0016AC3E /* virtualmemory.cpp in Sources */, AB405661169F5DBB0016AC3E /* zonememory.cpp in Sources */, AB405679169F5DCC0016AC3E /* x86assembler.cpp in Sources */, AB40567C169F5DCC0016AC3E /* x86compiler.cpp in Sources */, AB40567F169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */, AB405682169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */, AB405685169F5DCC0016AC3E /* x86compileritem.cpp in Sources */, AB405688169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */, AB564900186E6EA8002740F4 /* cocoa_slot2.mm in Sources */, AB40568B169F5DCC0016AC3E /* x86defs.cpp in Sources */, AB40568E169F5DCC0016AC3E /* x86func.cpp in Sources */, AB405691169F5DCC0016AC3E /* x86operand.cpp in Sources */, AB405694169F5DCC0016AC3E /* x86util.cpp in Sources */, AB2EE13217D57F5000F68622 /* fsnitro.cpp in Sources */, AB23567416C2F6F400DA782E /* macosx_10_5_compat.cpp in Sources */, AB23567516C2FAD800DA782E /* OGLRender_3_2.cpp in Sources */, AB3A655F16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */, AB3A656216CC5438001F5D4A /* cocoa_GPU.mm in Sources */, AB9038B917C5ED2200F410BD /* slot1comp_rom.cpp in Sources */, AB8967DA16D2ED0700F826F1 /* DisplayWindowController.mm in Sources */, AB29B33216D4BEBF000EF671 /* InputManager.mm in Sources */, AB82445C1704AE9A00B8EE20 /* utilities.c in Sources */, AB01005F170D07B000D70FBE /* InputProfileController.mm in Sources */, ABD10AE81715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */, ABD10AEB1715FCDD00B5729D /* mic_ext.cpp in Sources */, ABD42048172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB796CEE15CDCBA200C59155 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB796CEF15CDCBA200C59155 /* ConvertUTF.c in Sources */, AB796CF015CDCBA200C59155 /* AAFilter.cpp in Sources */, AB796CF215CDCBA200C59155 /* arm_instructions.cpp in Sources */, AB796CF315CDCBA200C59155 /* armcpu.cpp in Sources */, AB796CF415CDCBA200C59155 /* bios.cpp in Sources */, AB796CF515CDCBA200C59155 /* cache.cpp in Sources */, AB2EE13117D57F5000F68622 /* fsnitro.cpp in Sources */, AB796CF615CDCBA200C59155 /* cheatSystem.cpp in Sources */, AB796CF715CDCBA200C59155 /* common.cpp in Sources */, AB9038B517C5ED2200F410BD /* slot1comp_mc.cpp in Sources */, AB796CF815CDCBA200C59155 /* cp15.cpp in Sources */, AB796CF915CDCBA200C59155 /* cpu_detect_x86_gcc.cpp in Sources */, AB796CFA15CDCBA200C59155 /* crc.cpp in Sources */, AB796CFB15CDCBA200C59155 /* datetime.cpp in Sources */, AB796CFC15CDCBA200C59155 /* debug.cpp in Sources */, AB796CFD15CDCBA200C59155 /* decrypt.cpp in Sources */, AB796CFE15CDCBA200C59155 /* directory.cpp in Sources */, AB796CFF15CDCBA200C59155 /* Disassembler.cpp in Sources */, AB796D0015CDCBA200C59155 /* disc.cpp in Sources */, AB29B16218313AF5009B7982 /* slot2.cpp in Sources */, AB796D0115CDCBA200C59155 /* dlditool.cpp in Sources */, AB796D0215CDCBA200C59155 /* driver.cpp in Sources */, AB796D0315CDCBA200C59155 /* emufat.cpp in Sources */, AB564904186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */, AB9038B217C5ED2200F410BD /* slot1_retail_mcrom.cpp in Sources */, AB796D0415CDCBA200C59155 /* emufile.cpp in Sources */, AB796D0515CDCBA200C59155 /* fatdir.cpp in Sources */, AB796D0615CDCBA200C59155 /* fatfile.cpp in Sources */, AB796D0715CDCBA200C59155 /* FIFO.cpp in Sources */, AB796D0815CDCBA200C59155 /* FIFOSampleBuffer.cpp in Sources */, AB796D0915CDCBA200C59155 /* file_allocation_table.cpp in Sources */, AB796D0A15CDCBA200C59155 /* filetime.cpp in Sources */, AB796D0B15CDCBA200C59155 /* FIRFilter.cpp in Sources */, AB796D0C15CDCBA200C59155 /* firmware.cpp in Sources */, AB796D0D15CDCBA200C59155 /* fs-linux.cpp in Sources */, ABAF0A411A96E67200B95B75 /* RomInfoPanel.mm in Sources */, AB796D0E15CDCBA200C59155 /* gfx3d.cpp in Sources */, AB796D0F15CDCBA200C59155 /* GPU.cpp in Sources */, AB9038AF17C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */, AB796D1015CDCBA200C59155 /* GPU_osd_stub.cpp in Sources */, AB796D1115CDCBA200C59155 /* guid.cpp in Sources */, AB796D1215CDCBA200C59155 /* header.cpp in Sources */, AB796D1315CDCBA200C59155 /* libfat.cpp in Sources */, AB796D1415CDCBA200C59155 /* libfat_public_api.cpp in Sources */, AB796D1515CDCBA200C59155 /* lock.cpp in Sources */, AB796D1615CDCBA200C59155 /* matrix.cpp in Sources */, AB796D1715CDCBA200C59155 /* mc.cpp in Sources */, AB796D1815CDCBA200C59155 /* md5.cpp in Sources */, AB796D1915CDCBA200C59155 /* metaspu.cpp in Sources */, AB796D1A15CDCBA200C59155 /* MMU.cpp in Sources */, ABB24F6D1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */, AB796D1B15CDCBA200C59155 /* mmx_optimized.cpp in Sources */, AB796D1C15CDCBA200C59155 /* movie.cpp in Sources */, AB9038B817C5ED2200F410BD /* slot1comp_rom.cpp in Sources */, AB796D1D15CDCBA200C59155 /* NDSSystem.cpp in Sources */, AB796D1E15CDCBA200C59155 /* OGLRender.cpp in Sources */, AB796D1F15CDCBA200C59155 /* partition.cpp in Sources */, AB796D2015CDCBA200C59155 /* path.cpp in Sources */, AB796D2115CDCBA200C59155 /* rasterize.cpp in Sources */, AB796D2215CDCBA200C59155 /* RateTransposer.cpp in Sources */, AB796D2315CDCBA200C59155 /* readwrite.cpp in Sources */, AB796D2415CDCBA200C59155 /* render3D.cpp in Sources */, AB796D2515CDCBA200C59155 /* ROMReader.cpp in Sources */, AB796D2615CDCBA200C59155 /* rtc.cpp in Sources */, AB796D2715CDCBA200C59155 /* saves.cpp in Sources */, AB796D2815CDCBA200C59155 /* slot1.cpp in Sources */, AB796D2915CDCBA200C59155 /* slot1_none.cpp in Sources */, AB2EE12C17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp in Sources */, AB5648FF186E6EA8002740F4 /* cocoa_slot2.mm in Sources */, AB796D2A15CDCBA200C59155 /* slot1_r4.cpp in Sources */, AB796D2C15CDCBA200C59155 /* slot1_retail_nand.cpp in Sources */, ABE6840C189E33BC007FD69C /* OGLDisplayOutput.cpp in Sources */, AB796D2D15CDCBA200C59155 /* slot2_expMemory.cpp in Sources */, AB47B52F18A45C35009A42AF /* xbrz.cpp in Sources */, AB796D2E15CDCBA200C59155 /* slot2_gbagame.cpp in Sources */, AB796D2F15CDCBA200C59155 /* slot2_guitarGrip.cpp in Sources */, AB796D3015CDCBA200C59155 /* slot2_mpcf.cpp in Sources */, AB796D3115CDCBA200C59155 /* slot2_none.cpp in Sources */, AB796D3215CDCBA200C59155 /* slot2_paddle.cpp in Sources */, AB796D3315CDCBA200C59155 /* slot2_piano.cpp in Sources */, AB796D3415CDCBA200C59155 /* slot2_rumblepak.cpp in Sources */, AB796D3515CDCBA200C59155 /* sndOSX.cpp in Sources */, AB796D3615CDCBA200C59155 /* SndOut.cpp in Sources */, AB796D3715CDCBA200C59155 /* SoundTouch.cpp in Sources */, AB796D3815CDCBA200C59155 /* SPU.cpp in Sources */, AB796D3915CDCBA200C59155 /* sse_optimized.cpp in Sources */, AB796D3A15CDCBA200C59155 /* task.cpp in Sources */, AB796D3B15CDCBA200C59155 /* TDStretch.cpp in Sources */, AB796D3C15CDCBA200C59155 /* texcache.cpp in Sources */, AB796D3D15CDCBA200C59155 /* thumb_instructions.cpp in Sources */, AB9038A617C5ECFD00F410BD /* advanscene.cpp in Sources */, AB796D3E15CDCBA200C59155 /* Timestretcher.cpp in Sources */, AB796D3F15CDCBA200C59155 /* tinystr.cpp in Sources */, AB796D4015CDCBA200C59155 /* tinyxml.cpp in Sources */, AB796D4115CDCBA200C59155 /* tinyxmlerror.cpp in Sources */, AB796D4215CDCBA200C59155 /* tinyxmlparser.cpp in Sources */, AB796D4315CDCBA200C59155 /* version.cpp in Sources */, AB796D4415CDCBA200C59155 /* vfat.cpp in Sources */, AB796D4515CDCBA200C59155 /* videofilter.cpp in Sources */, AB796D4615CDCBA200C59155 /* WavFile.cpp in Sources */, AB796D4715CDCBA200C59155 /* wifi.cpp in Sources */, AB796D4815CDCBA200C59155 /* xstring.cpp in Sources */, AB796D4915CDCBA200C59155 /* main.m in Sources */, AB796D4A15CDCBA200C59155 /* cocoa_cheat.mm in Sources */, AB796D4B15CDCBA200C59155 /* cocoa_core.mm in Sources */, AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */, AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */, AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */, AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */, AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */, AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */, AB796D5415CDCBA200C59155 /* cocoa_videofilter.mm in Sources */, AB796D5515CDCBA200C59155 /* appDelegate.mm in Sources */, AB796D5615CDCBA200C59155 /* cheatWindowDelegate.mm in Sources */, AB796D5915CDCBA200C59155 /* inputPrefsView.mm in Sources */, AB796D5A15CDCBA200C59155 /* preferencesWindowDelegate.mm in Sources */, AB796D5B15CDCBA200C59155 /* 2xsai.cpp in Sources */, AB796D5C15CDCBA200C59155 /* bilinear.cpp in Sources */, AB796D5D15CDCBA200C59155 /* epx.cpp in Sources */, AB796D5E15CDCBA200C59155 /* hq2x.cpp in Sources */, AB796D5F15CDCBA200C59155 /* hq4x.cpp in Sources */, AB29B16618313C14009B7982 /* slot2_auto.cpp in Sources */, ABCFA9F4178BDE920030C8BA /* encrypt.cpp in Sources */, AB796D6015CDCBA200C59155 /* lq2x.cpp in Sources */, AB796D6115CDCBA200C59155 /* scanline.cpp in Sources */, AB796D6215CDCBA200C59155 /* coreaudiosound.cpp in Sources */, AB796D6315CDCBA200C59155 /* ringbuffer.cpp in Sources */, AB796D6415CDCBA200C59155 /* arm_jit.cpp in Sources */, ABF2B9FB16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */, AB40562A169F5DBB0016AC3E /* assembler.cpp in Sources */, AB40562D169F5DBB0016AC3E /* assert.cpp in Sources */, AB405630169F5DBB0016AC3E /* buffer.cpp in Sources */, AB405633169F5DBB0016AC3E /* compiler.cpp in Sources */, AB405636169F5DBB0016AC3E /* compilercontext.cpp in Sources */, AB405639169F5DBB0016AC3E /* compilerfunc.cpp in Sources */, AB40563C169F5DBB0016AC3E /* compileritem.cpp in Sources */, AB40563F169F5DBB0016AC3E /* context.cpp in Sources */, AB405642169F5DBB0016AC3E /* cpuinfo.cpp in Sources */, AB405645169F5DBB0016AC3E /* defs.cpp in Sources */, AB405648169F5DBB0016AC3E /* func.cpp in Sources */, AB40564B169F5DBB0016AC3E /* logger.cpp in Sources */, AB40564E169F5DBB0016AC3E /* memorymanager.cpp in Sources */, AB405651169F5DBB0016AC3E /* memorymarker.cpp in Sources */, AB405654169F5DBB0016AC3E /* operand.cpp in Sources */, AB405657169F5DBB0016AC3E /* stringbuilder.cpp in Sources */, AB40565A169F5DBB0016AC3E /* stringutil.cpp in Sources */, AB40565D169F5DBB0016AC3E /* virtualmemory.cpp in Sources */, AB405660169F5DBB0016AC3E /* zonememory.cpp in Sources */, AB405678169F5DCC0016AC3E /* x86assembler.cpp in Sources */, AB40567B169F5DCC0016AC3E /* x86compiler.cpp in Sources */, AB40567E169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */, AB405681169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */, AB405684169F5DCC0016AC3E /* x86compileritem.cpp in Sources */, AB1773FD182ECA8A009F29DD /* slot2_passme.cpp in Sources */, AB405687169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */, AB40568A169F5DCC0016AC3E /* x86defs.cpp in Sources */, AB40568D169F5DCC0016AC3E /* x86func.cpp in Sources */, AB405690169F5DCC0016AC3E /* x86operand.cpp in Sources */, AB405693169F5DCC0016AC3E /* x86util.cpp in Sources */, AB26D87C16B5253D00A2305C /* OGLRender_3_2.cpp in Sources */, AB3A655E16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */, AB3A656116CC5438001F5D4A /* cocoa_GPU.mm in Sources */, AB8967D916D2ED0700F826F1 /* DisplayWindowController.mm in Sources */, AB29B33116D4BEBF000EF671 /* InputManager.mm in Sources */, AB8B7AAC17CE8C440051CEBF /* slot1comp_protocol.cpp in Sources */, AB82445B1704AE9A00B8EE20 /* utilities.c in Sources */, AB01005E170D07B000D70FBE /* InputProfileController.mm in Sources */, ABD10AE71715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */, ABD10AEA1715FCDD00B5729D /* mic_ext.cpp in Sources */, ABD42047172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB8F3C731A53AC2600A80BF6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB8F3C741A53AC2600A80BF6 /* ConvertUTF.c in Sources */, AB8F3C751A53AC2600A80BF6 /* AAFilter.cpp in Sources */, AB8F3C761A53AC2600A80BF6 /* arm_instructions.cpp in Sources */, AB8F3C771A53AC2600A80BF6 /* armcpu.cpp in Sources */, AB8F3C781A53AC2600A80BF6 /* bios.cpp in Sources */, AB8F3C791A53AC2600A80BF6 /* cache.cpp in Sources */, AB8F3C7A1A53AC2600A80BF6 /* cheatSystem.cpp in Sources */, AB8F3C7B1A53AC2600A80BF6 /* slot2_auto.cpp in Sources */, AB8F3C7C1A53AC2600A80BF6 /* common.cpp in Sources */, AB8F3C7D1A53AC2600A80BF6 /* cp15.cpp in Sources */, AB8F3C7E1A53AC2600A80BF6 /* cpu_detect_x86_gcc.cpp in Sources */, AB8F3C7F1A53AC2600A80BF6 /* crc.cpp in Sources */, AB8F3C801A53AC2600A80BF6 /* datetime.cpp in Sources */, AB8F3C811A53AC2600A80BF6 /* debug.cpp in Sources */, AB8F3C821A53AC2600A80BF6 /* decrypt.cpp in Sources */, AB8F3C831A53AC2600A80BF6 /* directory.cpp in Sources */, AB8F3C841A53AC2600A80BF6 /* Disassembler.cpp in Sources */, ABAF0A431A96E67200B95B75 /* RomInfoPanel.mm in Sources */, AB8F3C851A53AC2600A80BF6 /* disc.cpp in Sources */, AB8F3C861A53AC2600A80BF6 /* dlditool.cpp in Sources */, AB8F3C871A53AC2600A80BF6 /* driver.cpp in Sources */, AB8F3C881A53AC2600A80BF6 /* emufat.cpp in Sources */, AB8F3C891A53AC2600A80BF6 /* emufile.cpp in Sources */, AB8F3C8A1A53AC2600A80BF6 /* fatdir.cpp in Sources */, AB8F3C8B1A53AC2600A80BF6 /* fatfile.cpp in Sources */, AB8F3C8C1A53AC2600A80BF6 /* FIFO.cpp in Sources */, AB8F3C8D1A53AC2600A80BF6 /* FIFOSampleBuffer.cpp in Sources */, AB8F3C8E1A53AC2600A80BF6 /* file_allocation_table.cpp in Sources */, AB8F3C8F1A53AC2600A80BF6 /* slot1_retail_mcrom_debug.cpp in Sources */, AB8F3C901A53AC2600A80BF6 /* filetime.cpp in Sources */, AB8F3C911A53AC2600A80BF6 /* FIRFilter.cpp in Sources */, AB8F3C921A53AC2600A80BF6 /* firmware.cpp in Sources */, AB8F3C931A53AC2600A80BF6 /* fs-linux.cpp in Sources */, AB8F3C941A53AC2600A80BF6 /* gfx3d.cpp in Sources */, AB8F3C951A53AC2600A80BF6 /* GPU.cpp in Sources */, AB8F3C961A53AC2600A80BF6 /* GPU_osd_stub.cpp in Sources */, AB8F3C971A53AC2600A80BF6 /* guid.cpp in Sources */, AB8F3C981A53AC2600A80BF6 /* header.cpp in Sources */, AB8F3C991A53AC2600A80BF6 /* libfat.cpp in Sources */, AB8F3C9A1A53AC2600A80BF6 /* libfat_public_api.cpp in Sources */, AB8F3C9B1A53AC2600A80BF6 /* lock.cpp in Sources */, AB8F3C9C1A53AC2600A80BF6 /* matrix.cpp in Sources */, AB8F3C9D1A53AC2600A80BF6 /* mc.cpp in Sources */, AB8F3C9E1A53AC2600A80BF6 /* md5.cpp in Sources */, AB8F3C9F1A53AC2600A80BF6 /* metaspu.cpp in Sources */, AB8F3CA01A53AC2600A80BF6 /* MMU.cpp in Sources */, AB8F3CA11A53AC2600A80BF6 /* mmx_optimized.cpp in Sources */, AB8F3CA21A53AC2600A80BF6 /* movie.cpp in Sources */, AB8F3CA31A53AC2600A80BF6 /* slot2.cpp in Sources */, AB8F3CA41A53AC2600A80BF6 /* NDSSystem.cpp in Sources */, AB8F3CA51A53AC2600A80BF6 /* gdbstub.cpp in Sources */, AB8F3CA61A53AC2600A80BF6 /* partition.cpp in Sources */, AB8F3CA71A53AC2600A80BF6 /* path.cpp in Sources */, AB8F3CA81A53AC2600A80BF6 /* rasterize.cpp in Sources */, AB8F3CA91A53AC2600A80BF6 /* RateTransposer.cpp in Sources */, AB8F3CAA1A53AC2600A80BF6 /* readwrite.cpp in Sources */, AB8F3CAB1A53AC2600A80BF6 /* render3D.cpp in Sources */, AB8F3CAC1A53AC2600A80BF6 /* ROMReader.cpp in Sources */, AB8F3CAD1A53AC2600A80BF6 /* rtc.cpp in Sources */, AB8F3CAE1A53AC2600A80BF6 /* saves.cpp in Sources */, AB8F3CAF1A53AC2600A80BF6 /* slot1.cpp in Sources */, AB8F3CB01A53AC2600A80BF6 /* slot1_none.cpp in Sources */, AB8F3CB11A53AC2600A80BF6 /* slot1_r4.cpp in Sources */, AB8F3CB21A53AC2600A80BF6 /* slot1_retail_nand.cpp in Sources */, AB8F3CB31A53AC2600A80BF6 /* encrypt.cpp in Sources */, AB8F3CB41A53AC2600A80BF6 /* slot2_expMemory.cpp in Sources */, AB8F3CB51A53AC2600A80BF6 /* slot2_gbagame.cpp in Sources */, AB8F3CB61A53AC2600A80BF6 /* slot2_guitarGrip.cpp in Sources */, AB8F3CB71A53AC2600A80BF6 /* slot2_mpcf.cpp in Sources */, AB8F3CB81A53AC2600A80BF6 /* OGLDisplayOutput.cpp in Sources */, AB8F3CB91A53AC2600A80BF6 /* slot2_none.cpp in Sources */, AB8F3CBA1A53AC2600A80BF6 /* slot2_paddle.cpp in Sources */, AB8F3CBB1A53AC2600A80BF6 /* slot2_piano.cpp in Sources */, AB8F3CBC1A53AC2600A80BF6 /* slot2_rumblepak.cpp in Sources */, AB8F3CBD1A53AC2600A80BF6 /* sndOSX.cpp in Sources */, AB8F3CBE1A53AC2600A80BF6 /* SndOut.cpp in Sources */, AB8F3CBF1A53AC2600A80BF6 /* Slot2WindowDelegate.mm in Sources */, AB8F3CC01A53AC2600A80BF6 /* SoundTouch.cpp in Sources */, AB8F3CC11A53AC2600A80BF6 /* slot1_retail_auto.cpp in Sources */, AB8F3CC21A53AC2600A80BF6 /* SPU.cpp in Sources */, AB8F3CC31A53AC2600A80BF6 /* sse_optimized.cpp in Sources */, AB8F3CC41A53AC2600A80BF6 /* task.cpp in Sources */, AB8F3CC51A53AC2600A80BF6 /* TDStretch.cpp in Sources */, AB8F3CC61A53AC2600A80BF6 /* texcache.cpp in Sources */, AB8F3CC71A53AC2600A80BF6 /* thumb_instructions.cpp in Sources */, AB8F3CC81A53AC2600A80BF6 /* Timestretcher.cpp in Sources */, AB8F3CC91A53AC2600A80BF6 /* tinystr.cpp in Sources */, AB8F3CCA1A53AC2600A80BF6 /* slot1comp_mc.cpp in Sources */, AB8F3CCB1A53AC2600A80BF6 /* tinyxml.cpp in Sources */, AB8F3CCC1A53AC2600A80BF6 /* tinyxmlerror.cpp in Sources */, AB8F3CCD1A53AC2600A80BF6 /* tinyxmlparser.cpp in Sources */, AB8F3CCE1A53AC2600A80BF6 /* version.cpp in Sources */, AB8F3CCF1A53AC2600A80BF6 /* vfat.cpp in Sources */, AB8F3CD01A53AC2600A80BF6 /* videofilter.cpp in Sources */, AB8F3CD11A53AC2600A80BF6 /* slot2_passme.cpp in Sources */, AB8F3CD21A53AC2600A80BF6 /* WavFile.cpp in Sources */, AB8F3CD31A53AC2600A80BF6 /* wifi.cpp in Sources */, AB8F3CD41A53AC2600A80BF6 /* slot1_retail_mcrom.cpp in Sources */, AB8F3CD51A53AC2600A80BF6 /* xstring.cpp in Sources */, AB8F3CD61A53AC2600A80BF6 /* main.m in Sources */, AB8F3CD71A53AC2600A80BF6 /* cocoa_cheat.mm in Sources */, AB8F3CD81A53AC2600A80BF6 /* cocoa_core.mm in Sources */, AB8F3CD91A53AC2600A80BF6 /* cocoa_file.mm in Sources */, AB8F3CDA1A53AC2600A80BF6 /* cocoa_firmware.mm in Sources */, AB8F3CDB1A53AC2600A80BF6 /* cocoa_input.mm in Sources */, AB8F3CDC1A53AC2600A80BF6 /* cocoa_output.mm in Sources */, AB8F3CDD1A53AC2600A80BF6 /* cocoa_rom.mm in Sources */, AB8F3CDE1A53AC2600A80BF6 /* cocoa_util.mm in Sources */, AB8F3CDF1A53AC2600A80BF6 /* cocoa_videofilter.mm in Sources */, AB8F3CE01A53AC2600A80BF6 /* OGLRender.cpp in Sources */, AB8F3CE11A53AC2600A80BF6 /* slot1comp_protocol.cpp in Sources */, AB8F3CE21A53AC2600A80BF6 /* appDelegate.mm in Sources */, AB8F3CE31A53AC2600A80BF6 /* cheatWindowDelegate.mm in Sources */, AB8F3CE41A53AC2600A80BF6 /* inputPrefsView.mm in Sources */, AB8F3CE51A53AC2600A80BF6 /* preferencesWindowDelegate.mm in Sources */, AB8F3CE61A53AC2600A80BF6 /* 2xsai.cpp in Sources */, AB8F3CE71A53AC2600A80BF6 /* bilinear.cpp in Sources */, AB8F3CE81A53AC2600A80BF6 /* epx.cpp in Sources */, AB8F3CE91A53AC2600A80BF6 /* hq2x.cpp in Sources */, AB8F3CEA1A53AC2600A80BF6 /* hq4x.cpp in Sources */, AB8F3CEB1A53AC2600A80BF6 /* advanscene.cpp in Sources */, AB8F3CEC1A53AC2600A80BF6 /* lq2x.cpp in Sources */, AB8F3CED1A53AC2600A80BF6 /* xbrz.cpp in Sources */, ABB24F6F1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */, AB8F3CEE1A53AC2600A80BF6 /* scanline.cpp in Sources */, AB8F3CEF1A53AC2600A80BF6 /* coreaudiosound.cpp in Sources */, AB8F3CF01A53AC2600A80BF6 /* ringbuffer.cpp in Sources */, AB8F3CF11A53AC2600A80BF6 /* arm_jit.cpp in Sources */, AB8F3CF21A53AC2600A80BF6 /* troubleshootingWindowDelegate.mm in Sources */, AB8F3CF31A53AC2600A80BF6 /* assembler.cpp in Sources */, AB8F3CF41A53AC2600A80BF6 /* assert.cpp in Sources */, AB8F3CF51A53AC2600A80BF6 /* buffer.cpp in Sources */, AB8F3CF61A53AC2600A80BF6 /* compiler.cpp in Sources */, AB8F3CF71A53AC2600A80BF6 /* compilercontext.cpp in Sources */, AB8F3CF81A53AC2600A80BF6 /* compilerfunc.cpp in Sources */, AB8F3CF91A53AC2600A80BF6 /* compileritem.cpp in Sources */, AB8F3CFA1A53AC2600A80BF6 /* context.cpp in Sources */, AB8F3CFB1A53AC2600A80BF6 /* cpuinfo.cpp in Sources */, AB8F3CFC1A53AC2600A80BF6 /* defs.cpp in Sources */, AB8F3CFD1A53AC2600A80BF6 /* func.cpp in Sources */, AB8F3CFE1A53AC2600A80BF6 /* logger.cpp in Sources */, AB8F3CFF1A53AC2600A80BF6 /* memorymanager.cpp in Sources */, AB8F3D001A53AC2600A80BF6 /* memorymarker.cpp in Sources */, AB8F3D011A53AC2600A80BF6 /* operand.cpp in Sources */, AB8F3D021A53AC2600A80BF6 /* stringbuilder.cpp in Sources */, AB8F3D031A53AC2600A80BF6 /* stringutil.cpp in Sources */, AB8F3D041A53AC2600A80BF6 /* virtualmemory.cpp in Sources */, AB8F3D051A53AC2600A80BF6 /* zonememory.cpp in Sources */, AB8F3D061A53AC2600A80BF6 /* x86assembler.cpp in Sources */, AB8F3D071A53AC2600A80BF6 /* x86compiler.cpp in Sources */, AB8F3D081A53AC2600A80BF6 /* x86compilercontext.cpp in Sources */, AB8F3D091A53AC2600A80BF6 /* x86compilerfunc.cpp in Sources */, AB8F3D0A1A53AC2600A80BF6 /* x86compileritem.cpp in Sources */, AB8F3D0B1A53AC2600A80BF6 /* x86cpuinfo.cpp in Sources */, AB8F3D0C1A53AC2600A80BF6 /* cocoa_slot2.mm in Sources */, AB8F3D0D1A53AC2600A80BF6 /* x86defs.cpp in Sources */, AB8F3D0E1A53AC2600A80BF6 /* x86func.cpp in Sources */, AB8F3D0F1A53AC2600A80BF6 /* x86operand.cpp in Sources */, AB8F3D101A53AC2600A80BF6 /* x86util.cpp in Sources */, AB8F3D111A53AC2600A80BF6 /* fsnitro.cpp in Sources */, AB8F3D121A53AC2600A80BF6 /* macosx_10_5_compat.cpp in Sources */, AB8F3D131A53AC2600A80BF6 /* OGLRender_3_2.cpp in Sources */, AB8F3D141A53AC2600A80BF6 /* EmuControllerDelegate.mm in Sources */, AB8F3D151A53AC2600A80BF6 /* cocoa_GPU.mm in Sources */, AB8F3D161A53AC2600A80BF6 /* slot1comp_rom.cpp in Sources */, AB8F3D171A53AC2600A80BF6 /* DisplayWindowController.mm in Sources */, AB8F3D181A53AC2600A80BF6 /* InputManager.mm in Sources */, AB8F3D191A53AC2600A80BF6 /* utilities.c in Sources */, AB8F3D1A1A53AC2600A80BF6 /* InputProfileController.mm in Sources */, AB8F3D1B1A53AC2600A80BF6 /* audiosamplegenerator.cpp in Sources */, AB8F3D1C1A53AC2600A80BF6 /* mic_ext.cpp in Sources */, AB8F3D1D1A53AC2600A80BF6 /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABB3C6431501BC6D00E0C22E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB564901186E6EA8002740F4 /* cocoa_slot2.mm in Sources */, ABE9EEEB1501C78700D3FB19 /* fs-linux.cpp in Sources */, ABCFA9F6178BDE920030C8BA /* encrypt.cpp in Sources */, ABB3C66C1501C04F00E0C22E /* NDSGameCore.mm in Sources */, ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */, ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */, ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */, AB29B16418313AF5009B7982 /* slot2.cpp in Sources */, ABB3C6781501C04F00E0C22E /* slot1_none.cpp in Sources */, AB29B16818313C14009B7982 /* slot2_auto.cpp in Sources */, AB9038B417C5ED2200F410BD /* slot1_retail_mcrom.cpp in Sources */, ABB3C6791501C04F00E0C22E /* slot1_r4.cpp in Sources */, ABB3C67A1501C04F00E0C22E /* slot1_retail_nand.cpp in Sources */, ABB3C67C1501C04F00E0C22E /* slot2_expMemory.cpp in Sources */, ABB3C67D1501C04F00E0C22E /* slot2_gbagame.cpp in Sources */, ABB3C67E1501C04F00E0C22E /* slot2_guitarGrip.cpp in Sources */, AB2EE12E17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp in Sources */, ABB3C67F1501C04F00E0C22E /* slot2_mpcf.cpp in Sources */, ABB3C6801501C04F00E0C22E /* slot2_none.cpp in Sources */, ABB3C6811501C04F00E0C22E /* slot2_paddle.cpp in Sources */, ABB3C6821501C04F00E0C22E /* slot2_piano.cpp in Sources */, ABB3C6831501C04F00E0C22E /* slot2_rumblepak.cpp in Sources */, ABB3C6841501C04F00E0C22E /* 2xsai.cpp in Sources */, ABC503B01AAC42C2002FCD43 /* coreaudiosound.cpp in Sources */, ABB3C6851501C04F00E0C22E /* bilinear.cpp in Sources */, ABB3C6861501C04F00E0C22E /* epx.cpp in Sources */, ABB3C6871501C04F00E0C22E /* hq2x.cpp in Sources */, ABB3C6881501C04F00E0C22E /* hq4x.cpp in Sources */, ABB3C6891501C04F00E0C22E /* lq2x.cpp in Sources */, ABB3C68A1501C04F00E0C22E /* scanline.cpp in Sources */, ABB3C68B1501C04F00E0C22E /* AAFilter.cpp in Sources */, ABB3C68C1501C04F00E0C22E /* cpu_detect_x86_gcc.cpp in Sources */, ABB3C68D1501C04F00E0C22E /* FIFOSampleBuffer.cpp in Sources */, AB9038A817C5ECFD00F410BD /* advanscene.cpp in Sources */, ABB3C68E1501C04F00E0C22E /* FIRFilter.cpp in Sources */, ABB3C68F1501C04F00E0C22E /* mmx_optimized.cpp in Sources */, ABB3C6901501C04F00E0C22E /* RateTransposer.cpp in Sources */, ABB3C6911501C04F00E0C22E /* SoundTouch.cpp in Sources */, ABB3C6921501C04F00E0C22E /* sse_optimized.cpp in Sources */, ABB3C6931501C04F00E0C22E /* TDStretch.cpp in Sources */, ABB3C6941501C04F00E0C22E /* WavFile.cpp in Sources */, ABB3C6951501C04F00E0C22E /* metaspu.cpp in Sources */, ABB3C6961501C04F00E0C22E /* SndOut.cpp in Sources */, ABB3C6971501C04F00E0C22E /* Timestretcher.cpp in Sources */, ABB3C6981501C04F00E0C22E /* crc.cpp in Sources */, AB031B5518472F3100541888 /* cocoa_cheat.mm in Sources */, ABB3C6991501C04F00E0C22E /* decrypt.cpp in Sources */, ABB3C69A1501C04F00E0C22E /* header.cpp in Sources */, AB1773FF182ECA8A009F29DD /* slot2_passme.cpp in Sources */, ABB3C69B1501C04F00E0C22E /* cache.cpp in Sources */, ABB3C69C1501C04F00E0C22E /* directory.cpp in Sources */, ABB3C69D1501C04F00E0C22E /* disc.cpp in Sources */, ABB3C69E1501C04F00E0C22E /* fatdir.cpp in Sources */, ABB3C69F1501C04F00E0C22E /* fatfile.cpp in Sources */, ABB3C6A01501C04F00E0C22E /* file_allocation_table.cpp in Sources */, ABB3C6A11501C04F00E0C22E /* filetime.cpp in Sources */, ABB3C6A21501C04F00E0C22E /* libfat.cpp in Sources */, ABB3C6A31501C04F00E0C22E /* libfat_public_api.cpp in Sources */, ABB3C6A41501C04F00E0C22E /* lock.cpp in Sources */, ABB3C6A51501C04F00E0C22E /* partition.cpp in Sources */, ABB3C6A61501C04F00E0C22E /* tinystr.cpp in Sources */, ABB3C6A71501C04F00E0C22E /* tinyxml.cpp in Sources */, ABB3C6A81501C04F00E0C22E /* tinyxmlerror.cpp in Sources */, ABB3C6A91501C04F00E0C22E /* tinyxmlparser.cpp in Sources */, ABB3C6AA1501C04F00E0C22E /* ConvertUTF.c in Sources */, ABB3C6AB1501C04F00E0C22E /* datetime.cpp in Sources */, AB9038B117C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */, ABB3C6AC1501C04F00E0C22E /* dlditool.cpp in Sources */, ABB3C6AD1501C04F00E0C22E /* emufat.cpp in Sources */, ABB3C6AE1501C04F00E0C22E /* guid.cpp in Sources */, ABB3C6AF1501C04F00E0C22E /* md5.cpp in Sources */, ABB3C6B01501C04F00E0C22E /* task.cpp in Sources */, ABB3C6B11501C04F00E0C22E /* vfat.cpp in Sources */, ABB3C6B21501C04F00E0C22E /* xstring.cpp in Sources */, ABB3C6B41501C04F00E0C22E /* arm_instructions.cpp in Sources */, ABB3C6B51501C04F00E0C22E /* armcpu.cpp in Sources */, ABB3C6B61501C04F00E0C22E /* bios.cpp in Sources */, ABB3C6B71501C04F00E0C22E /* cheatSystem.cpp in Sources */, ABB3C6B81501C04F00E0C22E /* common.cpp in Sources */, ABB3C6B91501C04F00E0C22E /* cp15.cpp in Sources */, AB407F371A6206FB00313213 /* xbrz.cpp in Sources */, ABB3C6BA1501C04F00E0C22E /* debug.cpp in Sources */, ABB3C6BB1501C04F00E0C22E /* Disassembler.cpp in Sources */, ABB3C6BC1501C04F00E0C22E /* driver.cpp in Sources */, ABB3C6BD1501C04F00E0C22E /* emufile.cpp in Sources */, ABB3C6BE1501C04F00E0C22E /* FIFO.cpp in Sources */, ABB3C6BF1501C04F00E0C22E /* firmware.cpp in Sources */, ABB3C6C01501C04F00E0C22E /* gfx3d.cpp in Sources */, ABB3C6C11501C04F00E0C22E /* GPU.cpp in Sources */, ABB3C6C21501C04F00E0C22E /* GPU_osd_stub.cpp in Sources */, ABB3C6C31501C04F00E0C22E /* matrix.cpp in Sources */, ABB3C6C41501C04F00E0C22E /* mc.cpp in Sources */, ABB3C6C61501C04F00E0C22E /* MMU.cpp in Sources */, ABB3C6C71501C04F00E0C22E /* movie.cpp in Sources */, AB8B7AAE17CE8C440051CEBF /* slot1comp_protocol.cpp in Sources */, ABB3C6C81501C04F00E0C22E /* NDSSystem.cpp in Sources */, ABB3C6C91501C04F00E0C22E /* OGLRender.cpp in Sources */, ABB3C6CA1501C04F00E0C22E /* path.cpp in Sources */, ABB3C6CB1501C04F00E0C22E /* rasterize.cpp in Sources */, ABB3C6CC1501C04F00E0C22E /* readwrite.cpp in Sources */, ABB3C6CD1501C04F00E0C22E /* render3D.cpp in Sources */, ABB3C6CE1501C04F00E0C22E /* ROMReader.cpp in Sources */, ABB3C6CF1501C04F00E0C22E /* rtc.cpp in Sources */, ABB3C6D01501C04F00E0C22E /* saves.cpp in Sources */, ABB3C6D11501C04F00E0C22E /* slot1.cpp in Sources */, ABB3C6D31501C04F00E0C22E /* SPU.cpp in Sources */, ABB3C6D41501C04F00E0C22E /* texcache.cpp in Sources */, AB9038BA17C5ED2200F410BD /* slot1comp_rom.cpp in Sources */, ABB3C6D51501C04F00E0C22E /* thumb_instructions.cpp in Sources */, AB2EE13317D57F5000F68622 /* fsnitro.cpp in Sources */, ABB3C6D61501C04F00E0C22E /* version.cpp in Sources */, ABB3C6D71501C04F00E0C22E /* wifi.cpp in Sources */, ABE9EEEA1501C6EB00D3FB19 /* cocoa_firmware.mm in Sources */, AB1949DB15034F900098793E /* OESoundInterface.mm in Sources */, AB796C9F15CDCB0F00C59155 /* arm_jit.cpp in Sources */, AB40562C169F5DBB0016AC3E /* assembler.cpp in Sources */, AB40562F169F5DBB0016AC3E /* assert.cpp in Sources */, AB405632169F5DBB0016AC3E /* buffer.cpp in Sources */, AB405635169F5DBB0016AC3E /* compiler.cpp in Sources */, AB405638169F5DBB0016AC3E /* compilercontext.cpp in Sources */, AB40563B169F5DBB0016AC3E /* compilerfunc.cpp in Sources */, AB40563E169F5DBB0016AC3E /* compileritem.cpp in Sources */, AB405641169F5DBB0016AC3E /* context.cpp in Sources */, AB405644169F5DBB0016AC3E /* cpuinfo.cpp in Sources */, AB405647169F5DBB0016AC3E /* defs.cpp in Sources */, AB40564A169F5DBB0016AC3E /* func.cpp in Sources */, AB40564D169F5DBB0016AC3E /* logger.cpp in Sources */, AB405650169F5DBB0016AC3E /* memorymanager.cpp in Sources */, AB405653169F5DBB0016AC3E /* memorymarker.cpp in Sources */, AB405656169F5DBB0016AC3E /* operand.cpp in Sources */, AB405659169F5DBB0016AC3E /* stringbuilder.cpp in Sources */, AB40565C169F5DBB0016AC3E /* stringutil.cpp in Sources */, AB40565F169F5DBB0016AC3E /* virtualmemory.cpp in Sources */, AB405662169F5DBB0016AC3E /* zonememory.cpp in Sources */, AB40567A169F5DCC0016AC3E /* x86assembler.cpp in Sources */, AB40567D169F5DCC0016AC3E /* x86compiler.cpp in Sources */, AB405680169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */, AB405683169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */, AB405686169F5DCC0016AC3E /* x86compileritem.cpp in Sources */, AB405689169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */, AB40568C169F5DCC0016AC3E /* x86defs.cpp in Sources */, AB40568F169F5DCC0016AC3E /* x86func.cpp in Sources */, AB405692169F5DCC0016AC3E /* x86operand.cpp in Sources */, AB405695169F5DCC0016AC3E /* x86util.cpp in Sources */, AB68A0DD16B139BC00DE0546 /* OGLRender_3_2.cpp in Sources */, AB9038B717C5ED2200F410BD /* slot1comp_mc.cpp in Sources */, AB3A656316CC5438001F5D4A /* cocoa_GPU.mm in Sources */, AB82445D1704AE9A00B8EE20 /* utilities.c in Sources */, ABD10AE91715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */, ABD10AEC1715FCDD00B5729D /* mic_ext.cpp in Sources */, ABD10AED17160C9300B5729D /* ringbuffer.cpp in Sources */, ABD10AEE17160CDD00B5729D /* cocoa_input.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ AB00E87914205EAE00DE561F /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( AB00E87A14205EAE00DE561F /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; AB00E87C14205EBC00DE561F /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( AB00E87D14205EBC00DE561F /* English */, ); name = MainMenu.xib; sourceTree = ""; }; AB350D3A147A1D93007165AC /* HID_usage_strings.plist */ = { isa = PBXVariantGroup; children = ( AB350D38147A1D8D007165AC /* English */, ); name = HID_usage_strings.plist; sourceTree = ""; }; AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */ = { isa = PBXVariantGroup; children = ( AB8967DC16D2ED2700F826F1 /* English */, ); name = DisplayWindow.xib; sourceTree = ""; }; AB901BDD1420706100348EEC /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( AB00E89114205ECC00DE561F /* English */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ AB796D6E15CDCBA200C59155 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Debug; }; AB796D6F15CDCBA200C59155 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Release; }; AB8F3D2C1A53AC2600A80BF6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = ( _DEBUG, "DEBUG=1", GDB_STUB, ); PRODUCT_NAME = "DeSmuME (Debug, dev+)"; }; name = Debug; }; AB8F3D2D1A53AC2600A80BF6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = ( NDEBUG, GDB_STUB, ); LLVM_LTO = YES; PRODUCT_NAME = "DeSmuME (dev+)"; }; name = Release; }; ABB3C6581501BC6D00E0C22E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LIBRARY = "libc++"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/openemu\"", ); GCC_PREFIX_HEADER = openemu/DeSmuME_Prefix_OpenEmu.pch; INFOPLIST_FILE = "openemu/Info (OpenEmu Plug-in).plist"; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = DeSmuME; WRAPPER_EXTENSION = oecoreplugin; }; name = Debug; }; ABB3C6591501BC6D00E0C22E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LIBRARY = "libc++"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/openemu\"", ); GCC_PREFIX_HEADER = openemu/DeSmuME_Prefix_OpenEmu.pch; INFOPLIST_FILE = "openemu/Info (OpenEmu Plug-in).plist"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = DeSmuME; WRAPPER_EXTENSION = oecoreplugin; }; name = Release; }; C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_FAST_OBJC_DISPATCH = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = fast; GCC_PREPROCESSOR_DEFINITIONS = ( NDEBUG, PUBLIC_RELEASE, ); GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_UNROLL_LOOPS = YES; IBC_FLATTEN_NIBS = YES; INFOPLIST_FILE = Info.plist; LLVM_LTO = YES; LLVM_VECTORIZE_LOOPS = YES; ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = DeSmuME; SKIP_INSTALL = NO; VALIDATE_PRODUCT = YES; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_USE_OPTIMIZATION_PROFILE = YES; GCC_FAST_OBJC_DISPATCH = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = fast; GCC_PREPROCESSOR_DEFINITIONS = ( NDEBUG, PUBLIC_RELEASE, ); GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_UNROLL_LOOPS = YES; IBC_FLATTEN_NIBS = YES; LLVM_LTO = YES; VALIDATE_PRODUCT = YES; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = ssse3; "CLANG_X86_VECTOR_INSTRUCTIONS[arch=i386]" = sse3; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; GCC_DYNAMIC_NO_PIC = YES; GCC_FAST_MATH = YES; GCC_FAST_OBJC_DISPATCH = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( _DEBUG, "DEBUG=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IBC_FLATTEN_NIBS = NO; INFOPLIST_FILE = "Info (Debug).plist"; LD_NO_PIE = YES; MACOSX_DEPLOYMENT_TARGET = 10.5; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "DeSmuME (Debug)"; SDKROOT = macosx; SKIP_INSTALL = YES; STRIP_INSTALLED_PRODUCT = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = ssse3; "CLANG_X86_VECTOR_INSTRUCTIONS[arch=i386]" = sse3; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_FAST_MATH = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; GCC_OPTIMIZATION_LEVEL = fast; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; GCC_STRICT_ALIASING = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Info.plist; LD_NO_PIE = YES; LLVM_VECTORIZE_LOOPS = YES; MACOSX_DEPLOYMENT_TARGET = 10.5; PRODUCT_NAME = DeSmuME; SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = NO; VALIDATE_PRODUCT = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ AB796D6D15CDCBA200C59155 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB796D6E15CDCBA200C59155 /* Debug */, AB796D6F15CDCBA200C59155 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB8F3D2B1A53AC2600A80BF6 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; dev+)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB8F3D2C1A53AC2600A80BF6 /* Debug */, AB8F3D2D1A53AC2600A80BF6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ABB3C6571501BC6D00E0C22E /* Build configuration list for PBXNativeTarget "DeSmuME (OpenEmu Plug-in)" */ = { isa = XCConfigurationList; buildConfigurations = ( ABB3C6581501BC6D00E0C22E /* Debug */, ABB3C6591501BC6D00E0C22E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; v10.5 Leopard Release Build)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (Latest)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } desmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/xcshareddata/0000755000000000000000000000000012467662066023055 5ustar rootrootdesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/xcshareddata/xcschemes/0000755000000000000000000000000012467662066025037 5ustar rootroot././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/xcshareddata/xcschemes/DeSmuME (OS X App).xcschemedesmume-0.9.11/src/cocoa/DeSmuME (Latest).xcodeproj/xcshareddata/xcschemes/DeSmuME (OS X App).xcsche0000755000000000000000000000621712467662066031022 0ustar rootroot desmume-0.9.11/src/cocoa/audiosamplegenerator.cpp0000755000000000000000000001075712467662066020564 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifdef __APPLE__ #include #include "utilities.h" #endif // __APPLE__ #include "audiosamplegenerator.h" #include #include "cocoa_globals.h" #define NUM_INTERNAL_NOISE_SAMPLES 32 static const uint8_t noiseSample[NUM_INTERNAL_NOISE_SAMPLES] = { 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFF, 0xF4, 0xE1, 0xBF, 0x9A, 0x71, 0x58, 0x5B, 0x5F, 0x62, 0xC2, 0x25, 0x05, 0x01, 0x01, 0x01, 0x01 }; size_t AudioGenerator::generateSampleBlock(size_t sampleCount, uint8_t *outBuffer) { if (outBuffer == NULL) { return 0; } for (uint8_t *i = outBuffer; i < outBuffer + sampleCount; i++) { *i = this->generateSample(); } return sampleCount; } uint8_t AudioGenerator::generateSample() { return MIC_NULL_SAMPLE_VALUE; } AudioSampleBlockGenerator::AudioSampleBlockGenerator(const uint8_t *audioBuffer, const size_t sampleCount) { _buffer = (uint8_t *)malloc(sampleCount * sizeof(uint8_t)); _sampleCount = sampleCount; _samplePosition = 0; memcpy(_buffer, audioBuffer, _sampleCount * sizeof(uint8_t)); } AudioSampleBlockGenerator::~AudioSampleBlockGenerator() { free(this->_buffer); this->_buffer = NULL; } uint8_t* AudioSampleBlockGenerator::allocate(const size_t sampleCount) { if (this->_buffer != NULL) { free(this->_buffer); } this->_buffer = (uint8_t *)malloc(sampleCount * sizeof(uint8_t)); this->_sampleCount = sampleCount; this->_samplePosition = 0; memset(this->_buffer, MIC_NULL_SAMPLE_VALUE, this->_sampleCount * sizeof(uint8_t)); return this->_buffer; } uint8_t AudioSampleBlockGenerator::generateSample() { if (this->_samplePosition >= this->_sampleCount) { this->_samplePosition = 0; } return this->_buffer[_samplePosition++]; } uint8_t* AudioSampleBlockGenerator::getBuffer() const { return this->_buffer; } size_t AudioSampleBlockGenerator::getSampleCount() const { return this->_sampleCount; } size_t AudioSampleBlockGenerator::getSamplePosition() const { return this->_samplePosition; } void AudioSampleBlockGenerator::setSamplePosition(size_t thePosition) { this->_samplePosition = thePosition % this->_sampleCount; } InternalNoiseGenerator::InternalNoiseGenerator() { _buffer = (uint8_t *)malloc(NUM_INTERNAL_NOISE_SAMPLES * sizeof(uint8_t)); _sampleCount = NUM_INTERNAL_NOISE_SAMPLES; _samplePosition = 0; memcpy(_buffer, noiseSample, _sampleCount * sizeof(uint8_t)); for (size_t i = 0; i < NUM_INTERNAL_NOISE_SAMPLES; i++) { _buffer[i] >>= 1; } } uint8_t WhiteNoiseGenerator::generateSample() { #ifdef __APPLE__ #ifdef MAC_OS_X_VERSION_10_7 if (IsOSXVersionSupported(10, 7, 0)) { return (uint8_t)(arc4random_uniform(0x00000080) & 0x7F); } return (uint8_t)((arc4random() % 0x00000080) & 0x7F); #else return (uint8_t)((arc4random() % 0x00000080) & 0x7F); #endif #else return (uint8_t)(rand() & 0x7F); #endif } SineWaveGenerator::SineWaveGenerator() { _frequency = 250.0; _sampleRate = MIC_SAMPLE_RATE; _cyclePosition = 0.0; }; SineWaveGenerator::SineWaveGenerator(const double freq, const double sampleRate) { _frequency = freq; _sampleRate = sampleRate; _cyclePosition = 0.0; } uint8_t SineWaveGenerator::generateSample() { const uint8_t sampleValue = (uint8_t)(63.0 * sin(2.0 * M_PI * this->_cyclePosition)) + MIC_NULL_SAMPLE_VALUE; this->_cyclePosition += (this->_frequency / this->_sampleRate); return sampleValue; } double SineWaveGenerator::getFrequency() const { return this->_frequency; } void SineWaveGenerator::setFrequency(double freq) { this->_frequency = freq; } double SineWaveGenerator::getSampleRate() const { return this->_sampleRate; } void SineWaveGenerator::setSampleRate(double sampleRate) { this->_sampleRate = sampleRate; } double SineWaveGenerator::getCyclePosition() const { return this->_cyclePosition; } void SineWaveGenerator::setCyclePosition(double thePosition) { this->_cyclePosition = thePosition; } desmume-0.9.11/src/cocoa/cocoa_slot2.h0000755000000000000000000000350112467662066016213 0ustar rootroot/* Copyright (C) 2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include "../slot2.h" #undef BOOL @interface CocoaDSSlot2Device : NSObject { ISlot2Interface *device; BOOL enabled; } @property (readonly) NSString *name; @property (readonly) NSString *description; @property (readonly) NSInteger deviceID; @property (readonly) NDS_SLOT2_TYPE type; @property (assign) BOOL enabled; - (id) initWithDeviceData:(ISlot2Interface *)deviceData; @end @interface CocoaDSSlot2Manager : NSObject { NSMutableArray *deviceList; CocoaDSSlot2Device *currentDevice; NSString *slot2StatusText; } @property (readonly) NSMutableArray *deviceList; @property (retain) CocoaDSSlot2Device *currentDevice; @property (assign) NSString *slot2StatusText; @property (retain) NSURL *mpcfFileSearchURL; @property (copy) NSURL *gbaCartridgeURL; @property (copy) NSURL *gbaSRamURL; @property (readonly) BOOL doesGbaCartridgeSaveExist; - (CocoaDSSlot2Device *) autoSelectedDevice; - (NSString *) autoSelectedDeviceName; - (CocoaDSSlot2Device *) findDeviceByType:(NDS_SLOT2_TYPE)theType; - (void) setDeviceByType:(NDS_SLOT2_TYPE)theType; - (void) updateDeviceList; - (void) updateStatus; @end // Force Feedback void OSXSendForceFeedbackState(bool enable); desmume-0.9.11/src/cocoa/AppIcon_FirmwareConfig.icns0000755000000000000000000054010612467662066021033 0ustar rootrooticnsÀFis32ħ F?DVXLC *˙ü˙ÁoÑ˙ %˙›’˙Ĉ "˙V ¤˙àĝĥ #˙^ ž˙ġĤ€#˙Q Ħ˙ö˙óò#%˙q>Iž˙ö˙üŭ$&˙{W[ž˙÷˙ûü$x$˙N,M˙ö˙ŭŭ$#˙FS›˙ġ˙üü$$˙F ˙ö˙üü$$˙B ž˙ö˙ûû$%˙J£˙ĝ˙ŭŭ$$˙;  ŝïùôô#&˙ƒjıô˙ŝ˙˙ŝŭ$}€„‹€|€{zz (#'11'!€› šmDš˘U–Y „¨|oĦ2 ˆ°v›b˘9ˆ²€II7Ĥ1ˆ²Ž‚¤SDD †ĥ™ ž¤^^W ‡¸›£ž­32I‡şœ ĦXħ,O†ž§˘£³. Šż£ĞĤ§ħ,‰½˘ŞĤ·2 ŽÄ¨°ĞĴ'‰¸Ħ§£¤żd[‰ħµ€ı¸¸TY]ZSTRSSRR ” H†k6ˆ^,…d1†_+ƒ ,eM\- @•p]+…ks[.‚ M–7X3†].†]+…_.…,U)„:$"„ „s8mkKIJJJJG 4˙û˙ŝ˙û˙È3ŭôù÷÷ùġ˙É4˙û˙ŝ˙ŝ˙ö˙É4˙ú˙ŭŭŝŭ˙ġ˙À4˙ú˙ŭŭŭŝŭ˙ĝŝ,4˙ú˙ŭŭŭŭŝŝüŭ,4˙ú˙ŭŭŭŭŭ˙û˙-4˙ú˙ŭŭŭŭŭ˙û˙-4˙ú˙ŭŭŭŭŭ˙û˙-4˙ú˙ŭŭŭŭŭ˙û˙-4˙ùŝüüüüüŝú˙-4˙û˙ŝŝŝŝŝ˙ü˙-2üóĝöööööĝôù+5˙û˙ŝŝŝŝŝ˙ü˙-”’‘‘‘‘‘‘’il32 a‚ ˆğ˙íùóëìù˙ġġöóò9…Ä˙ùŭŭ˙˙„?_é˙ŝ˙à;„˙ĝ˙ġħL ’˙ñòÔè;ƒĈ˙˙•'¸˙ô˙ßäĝ7 ‚Ĉ˙˙9 ˙˙ëá˙ë4Ĉ˙˙A"­˙ò˙íç˙üĝD€<Ĉ˙˙5£˙ô˙÷˞²Ï9Ĉ˙˙9§˙ôû˙ьƒv{‘€Ĉ˙ŝ4­˙ġŝ˙ùèŜÒ΀Ċ˙û2 ˙óü˙ŝŭû˙÷˙²Ċ˙û/ħ˙ġŝŝ˙˙ŝ˙÷˙µÄ˙ôDAj;b" ›˙óŭŝ˙˙ŝ˙ĝ˙µrÂ˙èvnz_g9$Ż˙ô˙ŝ˙˙ŝ˙ĝ˙ĥ˙ëbOYZ\' ˙ôŝŝ˙˙ŝ˙ĝ˙ĥĊ˙ĝ$g,B ­˙ôŝŝ˙˙ŝ˙ĝ˙ĥĊ˙ù"r+o+Ĥ˙ġŭ€˙{ŝ˙ĝ˙ĥÄ˙ó%)G43˘˙òŭŝ˙˙ŝ˙ĝ˙ĥÄ˙$5_=V!²˙ö˙ŝ˙˙ŝ˙ĝ˙ĥÄ˙ Ħ˙óû˙ŝ˙ŝ˙ĝ˙ĥÄ˙ï·˙ö˙ŝ˙ĝ˙ĥ˙îš˙ñŭ€˙ŝ˙ĝ˙ĥ˙ìı˙ö˙ŝ˙˙ŝ˙ĝ˙ĥ˙ë™˙óŭŝ˙˙ŝ˙ĝ˙ĥ˙êş˙ġŝŝ˙˙ŝ˙ĝ˙ĥÂ˙ç£˙ôŭŝ˙˙ŝ˙ĝ˙ĥÂ˙ĉ³˙óü€ŝŭ˙÷˙µÂ˙â %I‡˜É˙ûŭ€˙ŝ˙ĝ˙ĥ€ĵ˙ß(&KbšÓó˙ûö÷÷€öġùï˙ŻÄ˙úúċï˙ŝ‡˙ŝ˙ĝ˙ĥ€[~s|zsrtx{zwxxwxtUŸ‚ €    Šj’‡ŽŠ††Ž–Œ‹~j‡rœ‘’“žœ‚K-Hĵ‰‚n†pšŽf,€™ey‡r™“W+ĤĈ••i…‡†r™”!†ğš›o†Ħv…sš•&%Éš›qŽğ§ „t›•!Œş˜š|iWS]eƒvž™"#–Ëœ„b6/).= ‚w š #œÁšžŒsmoe_;‚wĦ—!‰Ä˘¤”‡…‡„Ž\‚x˘™"ŸĊĦš™™˜š“Ÿj‚z¨–4Ei;a# !„Ċ¤İŸž š¨p‚x­‹grx`f9)ĦÏ£žŸŸžĦšİq‚y­SRW[\( "†À˘§ž  Ÿ˘›Şr‚}İŸe,B $ ÑĤŞ ˘˘Ħ¤Ĵs€}İ %q,n,!Â£İ ˘˘Ħ¤Ĵs€}Ĵ›'H43’ŞŞ˘££˘ž­t€~š5_=V!£ÇŞ˘¤¤£ĤŸŻu€€ħž‹Ëħħ§§Ĥİ˘²w€²ž!ШĴ§¨¨§Ş£³x€²‚Ç­°Ĥ¨¨§Ş£³x€³œ ­ÓŞ­§¨¨§Ş£³x€‚µ„ÇĴ°İŞŞİĴµy€‚µœ Ö²¨ŞŞİĴµy€‚·› ŠÄвİĞĞŞ­Ĥĥz€‚ĥš²Ûħ¨ŞŞİĴµy€„ğš ,O~„ݰ³­­°İı|€~ħ–'5SXx™Ż°££€¤§ °v€ŽÂĥµŻ¸żğ¸µ´ışş€ı¸ğ´Ċ„€ =TNQPOMNOPRQ„PQNU9ŸŒ ˜•&‹b• *eX)( *Œi“ &cL"“ („o!€ 'lH€ &xl0€ 'Q 'eV$  '„\ ^~Iv-*ZN ‹_“‘‚ƒG.†n‹U€yƒ;*^?Ž2žIg4)…oŒFşKşN+gB HŒaf!tl)a·o°6‰R #C&N%bP0"Ž€ %d Ž QA'Ž€ #”n Ž T>Ž€ %“uŽ€ Q1Ž&'ކŽ3Qj@Ž  IY=.‘A=€•–‘l8mkÉ˙òùö÷÷÷÷÷÷÷ĝôĜBÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙ŝùHÒ˙ú˙ŝ˙˙˙˙˙˙˙ŝ˙úúúHÓ˙û˙ŝ˙˙˙˙˙˙˙˙ŝ˙ŭúúHÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙ŭ˙ŭúúHÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙ŝ˙ŭúúHÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭúùGÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭûġ1Ó˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ö˙­Ó˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÂÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙Ó˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ÄÒ˙ú˙ŭŝŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙ÄÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ĊÍ˙ôú÷ĝĝĝĝĝĝĝĝĝĝĝĝĝ÷ûò˙żÓ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙Ċ€¤›Ÿžžžžžžžžžžžžžž ›Ĥxit32P  ³ ù ğcĞšĦžŸd1ş Ÿ˙ö˙ŝħ˙ۀıš˙îúġ™ö ġöĝùôòôġ÷ù÷‰öŭ˙˙ĉ7¸ Ÿ˙ö˙ŝ›˙ŝü˙ŝŝ‹˙ĝëô÷K· Ÿ˙ġ˙ŭ“ŝŭŭŝ˙˙ŭöûŝ˙Âàñĝ˙Šŝ ŭĝöĉßüM ĥ Ÿ˙ö˙ŝ‘˙ŝŝ€˙ ùĝŝŝ˙×j(.Â˙ĝ˙ŝ‚˙ ŝŭŝŭ˙˙ŝġĉÓó˙ŝ‚˙ ŝ˙ùìîFĤ Ÿ˙ö˙ŝ€˙ŝ˙ĝ˙f „„ +!'&A@ı˙ùüûúŝ˙ŭŝ„˙÷çÖÀó˙ŝƒ˙ ŝ˙úíïH Ÿ˙ö˙ŝ‚˙û˙Fˆ€+%,-CEÉ˙ú˙ŝŝüü˙˙ŝ˙ŭŭ€˙ùêÙô˙ŝ„˙ ŭ˙úíH¤ Ÿ˙ö˙ŝ€˙ ŝ˙ú˙JŠ /'/33:u¸ĠĜëġ÷íìöŭŭ‚˙ĝëÛĈô˙üŝ€ŭŝ€˙ ŝ˙ûñH£ Ÿ˙ö˙ŝ‚˙ û˙Eƒ‚# .'+$T˙ĜŬ÷ŝûíÚÙîçïŭ˙˙ùíŜËö˙ŝ‚˙ ŝŭúúĝüúñôJ˘ Ÿ˙ö˙ŝ‚˙ ü˙A€ +'( O˙ú˙ŝ€˙ŝĝüòàĝ˙˙ûïàÍìóíìêîñù‚˙ ŝ˙ùêIĦ Ÿ˙ö˙ŝ‚˙û˙D†… -#&%%‚ŭúŭŝ˙˙ŭŝ„˙üáѽ§Ž|pnpvx|‘ŸşÔ˙˙úD  Ÿ˙ö˙ŝ‚˙ü˙Aƒ‚€ +$$);Ċ˙ĝ˙ŝ‚˙ŝ˙ŭŭ€˙ŭòÓĴ’~skhd`^VRPTb­àĝùD Ÿ Ÿ˙ö˙ŝ‚˙ü˙@‹€,#$A>ĵ˙ùŭùûŝ˙ŭŝ„˙ŝġçĜĈ°—€trsqqonklid\T`…Êù8ž Ÿ˙ö˙ŝ‚˙ŭŝ8ƒ„€)"*+BCÇ˙ú˙ŝ˙ŝŝ˙˙ŝ€ŭ˙ĝìßÎş˘€€~{xurrstwxocZŠÛ4 Ÿ˙ö˙ŝ‚˙û˙GЁ,&)17=ƒĈâáïĝġòóĝŝ„˙ ûċÖĊ³ •’‘‹€ˆ ‡„‚€€cv³ž Ÿ˙ö˙ŝ€˙ŝ˙ú˙S‚*).&W˙ŜÔòŭüôĉŜâëòŭ€˙ŝöìßÒķާ¤ Ÿž›€š•‡wˆŒž Ÿ˙ö˙ŝ‚˙û˙J‹ *%*\˙ù˙ŝ€˙(ŝĝßÜĉó˙ŝ˙˙ûòèŜÓÊżğş·µ´²²ħ°ŻĴާ¤—Š¨R› Ÿ˙ö˙ŝ‚˙ü˙@„‚ƒ-#!!‡˙ù˙ŭ˙€ŝ‡˙ùèàĜÒÎÌÊÉÇĈĈĊĊÄÂżĵ¸´­İݤž Ÿ˙ö˙ŝ‚˙ŭŭ8„ƒ , -6Â˙ĝ˙ŝ‚˙ŝüŭŭ„˙ĝñëċàÛÚÙ××Ö××ÖĠÔÔÑÏÊÇÂÀĥÈ3š Ÿ˙ö˙ŝ‚˙ŝĝ-‚‚ *CBş˙ùüûûŭŭŝŝ‰˙ûöñîëè€çĉĉ€çċäâŜŬÚĠĠÇßRš Ÿ˙ö˙ŝƒ˙÷.ˆ‚ '&(E;Ç˙ú˙ŝüŭ€˙ŝŭŭˆ˙üùöġôôġööġóóíéĉçĜòWš Ÿ˙ö˙ŝƒ˙ô'ƒ(+/>A‘ÍéíñúòéöùŽ˙‚ŝ˙˙‚ŝ üûĝôùê˙Zš Ÿ˙ö˙ŝƒ˙ó&‰+$-) M˙éáúöéùíçèúŝ˜˙ŝ˙ö˙^š Ÿ˙ö˙ŝ˙ŝ˙ó%‚ƒ.%)\˙ù˙ŝ˙ĝéÒÔü˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝƒ˙ġ(„€ +#$n˙ù˙ŝŝŭŝŝ˙˙ŝú™˙ŝ˙ö˙` š Ÿ˙ö˙ŝƒ˙ó&…€€€  * "&6ĥ˙ú˙ŝ‚˙ŝŭŝš˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙ŝ˙#†‚(!@CÂ˙öŝúŭŝŭŝ˙ŝ™˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙)ŝ˙î#   *"'&F9½˙ú˙ŝûŭ€˙ŝŭŝš˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙ŝ˙ì‘ *$-+;CĦċÜôġûġíúûŝœ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙1ŝ˙í l— š§Ĵ¤Ÿ˘´x ,$,& MäîèéûäÙòîíġûŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙1ŝ˙î”ĜËÑG67 I@/,%) c˙ù˙ü˙˙ŭ˙ûÜÖù˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙+ŝ˙ê Š’–¸· ·ÁŒ‰ ԉ„Y'$! p˙ĝ˙ŝŝŭŝ€˙ŭĝŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙(ŝ˙ëÊÉF ÂğÂYA?*6Oٟ(#&(˘üû˙ŝŝ˙ŝŭŝš˙ŝ˙ö˙` š8 Ÿ˙ö˙ŝ˙˙ŝ˙ŭ˙ĉµħÁĥµMU^D²‡ (AB˙ġŝûŭŝŭŝ˙ŝ™˙ŝ˙ö˙` š9 Ÿ˙ö˙ŝ˙˙ŝ˙ŭ˙äıĥ…½ ³ħ&ĊϙÁ‹& &#F9ĵ˙ú˙ŝüŝ˙˙ŭ€ŝš˙ŝ˙ö˙` š8 Ÿ˙ö˙ŝ˙˙ŝ˙ŭ˙ ²~ı ° Ğ~·† )"+* Ÿ˙ö˙ŝ˙˙ŝ˙ŭ˙ Чx² ¨¨(£Ğ}° *$* Y˙ù˙ü˙˙üñúòàÛú˜˙ŝ˙ö˙` š4 Ÿ˙ö˙ŝ˙˙ŝ˙ŭ˙à ĞĴ@­ ²§ħŞĤ¤s¸ +$ ^˙ĝ˙€ŝ˙ŝġŝ˜˙ŝ˙ö˙` š2 Ÿ˙ö˙ŝ˙˙ŝ˙ü˙Ŭ˜ Ğ“ •˘ŸĦ™’§Ğr' !$%‰ûƒ˙ŭ€ŝš˙ŝ˙ö˙` š6 Ÿ˙ö˙ŝ˙˙ŝ˙ü˙á    & =BÇ˙ö˙ŭŝŝƒ˙ŭ™˙ŝ˙ö˙` š8 Ÿ˙ö˙ŝ˙˙ŝ˙ŭ˙ä     "$G2ş˙ú˙úú˙ŝŭ€ŝ›˙ŝ˙ö˙` š7 Ÿ˙ö˙ŝ˙˙ŝ˙ü˙× hŸ™œ—ž¤f–e Ĵf!!('ABÈ˙óŭŝ˙ùü˙ŝü™˙ŝ˙ö˙` š; Ÿ˙ö˙ŝ˙˙ŝ˙ü˙× h´Sw§3‡tj!ĥk%**.mòèàóóĠĉñü›˙ŝ˙ö˙` š> Ÿ˙ö˙ŝ˙˙ŝ˙û˙Ò a²%ZĤmt –g#g%( e˙ĝġ÷˙ĝġùêß×ßü˜˙ŝ˙ö˙` š5 Ÿ˙ö˙ŝ˙˙ŝ˙û˙Ïaħ*_pt –eŻg##"[˙ĝ˙ŝ‚˙ŭìŜŭ˜˙ŝ˙ö˙` š: Ÿ˙ö˙ŝ˙˙ŝ˙ú˙Ë[Ĥ$Ušfl ‡o?Ÿb"fşû˙ŭŝ˙ŝŭŝŝœ˙ŝ˙ö˙` š6 Ÿ˙ö˙ŝ˙˙ŝ˙û˙Íaħ'\nu‡ ™Ħm5:È˙ù˙ŝ˙ŝ‚˙ŭü™˙ŝ˙ö˙` š: Ÿ˙ö˙ŝ˙˙ŝ˙ú˙É>r;iGJ Wc[hE >6şüúüûúŝ˙ŭŭŝœ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ü˙Ú ‡€€ '&@=Ċ˙ĝ˙ŝ˙úû˙ŝŭŝ˜˙ŝ˙ö˙` š; Ÿ˙ö˙ŝ˙˙ŝ˙û˙Ë,‚z€v€{‚7Tqrp")' +I‘ĠÑĉñöìèûû›˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ú˙€()’J`‘NF‘4R“>$#*U˙àê÷ŝŭñÚÙïäëû˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ú˙€%‘"B•#0Q„lhg %!"Z˙ù˙ŝ˙ŭŝößô˙ŝ–˙ŝ˙ö˙` š9 Ÿ˙ö˙ŝ˙˙ŝ˙ú˙Â%Ž%E‘&Œ/M‰7" "'9˘˙úŭŭ˙˙ŭŭ˙ŝ˙ö˙` š4 Ÿ˙ö˙ŝ˙˙ŝ˙ú˙ż#‰!?Ž!‡,I‰$9o"! *1Ì˙ĝ˙ŝ„˙ŝŭŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ú˙ż€ "… ?Š!„+D†!E‚ !A:ĵ˙úŭûüŭ€ŝ˙ŝ˙ö˙` š6 Ÿ˙ö˙ŝ˙˙ŝ˙ù˙ı!€<…*H3Js #$!?FÈ˙ú˙˙ŝŭ˙€ŭ™˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ù˙¸€$ {9z(4mjlg ('/<†äêúïëööŭœ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ù˙²‚&  $' Q˙êŜ÷ùöúìâáêòŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ù˙ĵ‚‡‚ &p˙ĝ˙ŝ˙ûíÑŬŭ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ù˙²„€ ' ! …˙ĝ˙ŭŝ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ù˙³„€‚€ $ .:ĵ˙ú˙ŝ‚˙ŝŭŭŝ™˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ù˙Ĵ‡† $@Hĵ˙÷ŭûŭ€ŝž˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ù˙Ĵ€‚„ $#@A˙ú˙˙üü˙˙ŝüŭŭš˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙§‹€ && ?I³íÜîĝùöòĝž˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙¤ && ]ìÈìôúóâÜàîòûŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙¤’ %! `˙ù˙ŝ€˙÷âëêŬù˙ŝ–˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙ %"e˙÷˙ŝ˙ŝŝ˙üŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙˘  $"&ĉŝƒ˙ŝüŭŝš˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙žŒ $ =DË˙ù˙ŝ‚˙ŝ™˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙˜„‡ $D;ğ˙ûŝûúŝ˙ŭŭŝŝ›˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙–†… #$@FÇ˙ñ˙ŝŝúĝ‚˙ŭŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙“Ž "'/;ŒĜÇßùëâéò÷ŝš˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙–ƒ† "% W˙èéú˙ŝġŜìïáĉû˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙–ƒ‡ !"$V˙ù˙€ŝ˙ùĉĝ˙ŝ–˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙’Š  " R°€ŭŝ˙˙ŭŭŝŝ›˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙Œ $ 4HÂ˙ĝ˙ŝ„˙ŝüŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙‰ E@²˙ûŝúú€ŭŝŝœ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙ˆ‹ !D@Ĉ˙ĝ˙ŝ˙ŭ˙ŭüŭŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙†ƒˆ $.H~ÈòċéôóŬîġùœ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙‡„Š$k˙óèì˙êġçääíü˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙€ €‹!r˙ù˙ŝ˙ŝġŬÜŭ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙} !„˙ùŝŭ˙ŭŭŝŝœ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙x" )*µ˙ö˙ŝƒ˙ŭüŝŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙v >/¸˙ĝŝùüŭŭŝŝ˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙vŠ€ $;*°˙ú˙ŭü˙ŝŭŝš˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙y„€  &:L˙çóúŭñïĝû€˙ŝ™˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙s„#.4#&$:KmëêÖìóŬġëéîĝŝŝ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙sƒ€)8@FI+!b˙ûŭü€˙ŝóÌĜŭ˜˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ú˙^€(".%5@FPX\ahwtWLA)˙ù˙ŝŭŭŝ˙ŝ˙÷ġ˙ŝ—˙ŝ˙ö˙` š Ÿ˙ö˙ŝ˙˙ŝ˙ĝ˙e€ #=9@AFKLSb|ˆ‰Ž•¤°Ââî˙€ŝ˙ŝŭ›˙ŝ˙ö˙` š. Ÿ˙ö˙ŝ˙˙ŝ˙ù˙^5@:AGW_dcm‘²ÍìüŠ˙ŝŝ™˙ŝ˙ö˙` š* Ÿ˙ö˙ŝ˙˙ŝ˙ú˙X :& *:HHLdihx”µÏê€˙ŝŭŭŝ˙ŝ˙ö˙` š- Ÿ˙ö˙ŝ˙˙ŝ˙ú˙R-:FHP<4IOE=CXh‘ŻÒô˙ŝ˙ŭüŭİ˙ŝ˙ö˙` š* Ÿ˙ö˙ŝ˙˙ŝ˙ù˙p3CDCHGJQYYIBMd’şÛĝ˙ŝ˙üûŭ˙ŝŝĤ˙ŝ˙ö˙` š' Ÿ˙ö˙ŝ˙˙ŝ˙ú˙…-HHOQS[`dmsy‚”­Ììŝ˙˙ŭúûŝŻ˙ŝ˙ö˙` š Ÿ˙ö˙ŝƒ˙÷´[Wajx€’’ˆ§ıŬò˙ŝ˙ûúüŝ€˙ŝŝ­˙ŝ˙ö˙` š Ÿ˙ö˙ŝ…˙ 떒˘š™†‚Óŝ€˙ûûŭ˙ŝŝ°˙ŝ˙ö˙` š Ÿ˙ġ˙ŭƒŝŭú˙úúûìâÔĥÖí÷ûü€˙€ŭ³ŝŭ˙ġ˙_ š Ÿ˙ö˙ŝŒ˙ŝñÜú˙ŝı˙ŝ˙ö˙` šš˙îúġ…ö ÷÷ö÷ġôòġüû÷ğöġúî˙\š Ÿ˙ö˙ŝÎ˙ŝ˙ö˙` œÁ˙çÎŞ’•—“’““Œ‡‚zpgU–°¨Ş§¤ ˜ˆ}vt Ĥ\ –“€”“–;0-"*'CA¸ŭû˙˙׏’——”Žˆƒ|qhW•°İШ§£Ÿ˜ˆ}vt!]Ħ—”•–’™+‘1-&..EGÊ˙û˙ü˙丠‹‘”“Žˆƒ}sjX–ħŞ­ĞŞ¨¤ ˜ˆ}vu!¤]Ħ—”•–’™-2 1(045<;;:86€5 320010)T ž`Ĥ•œ™š›— 3+,*.) 6šĤ­—™ĈĜÚÈŻ•Œ‡‚{tme\TNKIIGEDDCB€A>;5:,3Až`Ĥ•œ™š›˜ž/(,(, 7¤›š•œœ–’”ŸŻÀ›ˆ…yrlf`[XVUTRQ€P OOMKIH?C8G'`Ĥ•œ™š›˜œ(7.()"i›’™˜™œž›–’“‹†ƒ}xrmheba`_^]^]\\[ZYWTRMKJKž`Ĥ•œ™š›™š$‘+.&&.:˙çϨ”œš—˜—˜™—”“‘މ„‚|xtpmkjihhghhg€f dc`^[YS]œ`Ĥ•œ™‚š™—‘#-&%DFğ˙ú˙ûÀ“šœš–•–““‘‰†ƒ{xvtrqq€r ppomljgg_j'œ`Ĥ•œ™ƒš–‘% ,$+)H>Ç˙ú˙û˙˜”“–˜ž›˜•““‘Š‡…ƒ}|zy‚z{{zzyxusqqjv+š`Ĥ•œ™‚𛓑&.'/0BC‘ÊĜïĝûîÛ³İ˘“”™˜”““‘Œ‰‡†„ƒƒ‚…‚ €}z|u-š`Ĥ•œ™‚𛓑1*/+ 0™›µ·šĦşËĜà˳šš˜•€“’Œ‹Š‰‰†ˆ ‰ˆ‡†…ƒ…~‹0š`Ĥ•œ™‚š›’/(* 9Ĥ—–”›˜’”›ĥÀŸ™›˜–”€“’‘ŽŽ„Œ ‹Šˆ‰ƒ’3š`Ĥ•œ™ƒš” -$% O”–Ÿ™šžš˜“”‚𗕁“ƒ’“ƒ’ ‘‘‡™6š`Ĥ•œ™ƒš“€ +!#)5¸úżĞ••œš—˜šœžƒš™˜–€•€”‰“ ’‘”7ša§–š‚›œ“) "ACÁ˙üù⸔›žž›™˜™››†š‚™˜˜ƒ— ––••”– 7ša¨—ž›‚œ/’  ,#)(F9ĵ˙ú˙˙ĝşž•”›žŸž€œ››”š˜›”9šcĞšĦžŸžĦ”‘ ,%.-;C˘çà÷ĝ˙ĝĠı˘™™š‚Ÿœœ€›Žš™œ•Ĥ:šcĞšĦžŸ2žĦ• l— ›§Ĵ¤Ÿ£´x .&.' 8š§ÂÊ­ĞżÓÙĊĵµž ƒŸžœ‚œœœ›š•Ĥ:šcĞšĦžŸ2ž •”ĜËÑG67 żIA/.'+ ?Ĵš›˜œ–™§ıÄȤž“Ÿ€ž œŸ˜İ;šcĞšĦž€Ÿ1 ž “ ‰’–¸¸ ·ÁŒ‰ Äԉ„Y(%# Mš¤£Ÿ £˘™™›™ŸžĦšĞ<šcĞšĦž€Ÿ1 Ÿ ” ÊÊF ÂğÂXA?*7Oڟ) %)*ĤñÄŻšš žœ ˘˘Ħ™ŸžĦšĞ<šcĞšĦž€Ÿ1 žĦ‘ µ°‚ÁµµMV^D³‡ ) !CEÄ˙ûúċ½™ ˘˘Ÿž™ŸžĦšĞ<šcĞšĦž€Ÿ1 žĦıĥ…½ ³²&ĊϙÁ‹ ( (%I<ĵ˙ú˙˙úž˜˜Ÿ˘Ħ ™ŸžĦšĞ<šcĞšĦž€Ÿ1 žĦ޲Ż~ı °ĦĞ~·† +$--?Eµĝâ÷ù˙ĝáѸĦ˜šž™ŸžĦšĞ<šcĞšĦž€Ÿ1 žĦ °€ĥ ­ĞĞĥ¸ˆ·„ +$,+E•¨ÇÍŻÁĠ×Ȱ£™ŸžĦšĞ<šcĞšĦž€Ÿ3 žĦЧx² ¨§'£Ğ~݁ ,&+8Şš›šœ›—™¨ğÄÁĤž—ŸžĦšĞ<šd­›˘Ÿ€ 2ĦŸ˘ŽŞĴ@­ ²§ħİĤs¸ -&" =ž›ĦĦ˘¤˘™œĦĦ˜ Ÿ˘›­<šd­›˘Ÿ€ 0ĦŸ£˜ Ş“ •ĦŸĦ™’§ĤĞr*"#'(×ÀĴšŸŸžŸĦ£˘š Ÿ˘›­<šeݜ¤Ħ€˘1£ Ĥ     ) "?EÉ˙ûûÛĤĦĤ¤˘ Ÿ Ħ™˘Ħ¤œŻ=šeݜ¤Ħ€˘0£Ħ‘     $!&"J5ğ˙÷ŭ˙䣚£¤š˘Ħ¤œŻ=šeݜ¤Ħ€˘0£ §‰hžšœ–ž¤f•e Ĵf""*)EDÇ˙÷˙ŭ˙íÎĥĦ››š˘Ħ¤œŻ=šeݜ¤Ħ€˘2£ Ĥ‰h´Sw¨3†tœj!ĥk&,,0a³ĈŜŬÄÈÚÙÄ·£Ħ˜˘Ħ¤œŻ=šeݜ¤Ħ€˘3£ §‡a²%Zmt •g#g&*?§˜ Ÿ›™ÌÔÌĤĦ—˘Ħ¤œŻ=šeݜ¤Ħ€˘3£ §„aħ+_qt –eŻg%$%:İ£¨£¤Ĥ¤ž›œž§Ħ—˘Ħ¤œŻ=šeݜ¤Ħ€˘2£Ÿ¨‚ZĤ$Ušfl ‡o?Ÿa $lݤž›ĦĦŸ ¤£ Ħ˜˘Ħ¤œŻ=šeݜ¤Ħ€˘£Ÿ¨ƒ€)aħ']Ĥnu† ™Ħm 7>É˙òàÁĤ˘§¤ĦŸ Ħ£™˘Ħ¤œŻ=šeݜ¤Ħ€˘1£Ÿ¨?s;iGJ Vc[hE" B9ğúù˙˙ĉĦšž£Ĥ¤˘Ħ™˘Ħ¤œŻ=šf°Ĥ˘€£¤Ħ§Œ ‡€€")(A@Ċ˙ú˙ü˙íË´ĦœŸ¤™£˘Ĥ°=šf°Ĥ˘€£¤ İ‚(,‚z€v|7Sprp!$+(",K‰¸ÏëíÙÚċÜʲĦž˘˜£˘Ĥ°=šf°Ĥ˘££˘¤ Ş~€*)’J_‘MF‘4R“>%%*5£’Ğœœ²ÔËşĤ˘—£˘Ĥ°=šf°Ĥ˘££˘ Ş{€*%‘"C•#0R„mhg &"$9Ĵ§ ĤĤ£žšĦ·Ĥ˘—£˘Ĥ°=šf°Ĥ˘££˘¤ Ş~€)%Ž&E’&Œ/MŠ8$!#+<ŠĤœž¤ĦĦ£§ Ÿ˘˜£˘Ĥ°=šf°Ĥ˘££˘ Ş{€(#‰!@Ž!ˆ,IŠ$9o#".4Ì˙ïŬ½£¤£Ħ Ħ¤™£˘Ĥ°=šg²Ÿ¨¤¤§˘Ĵ}€("…!?‰!„+D†!E‚ "D<ğŭú˙˙ٟ£¤§İ§¤™¤¨Ÿ²>šh´ĦŞĤ§§Ĥİ£Żz‚&!<…*I3Js %($BFÇ˙ú˙ú˙Ŝ°Ż ¤İŞ™§ĤŞĦ´?šh´ĦŞĤ§§Ĥİ£Ży‚' {:z(4mjmg$$*'/:ˆżÍáó÷çÜêĉ̵ĦĤ˜§ĤŞĦ´?šh´ĦŞĤ§§Ĥİ£°v„% $''5Ĥž­µ˘Ĥ´Ĉ×Ŝ×Á¨˜§ĤŞĦ´?šh´ĦŞĤ§§Ĥİ£Ż}Ž‚) !KĥĤ§£İ§¤ĦĦݰÀ­Ĥ¨–§ĤŞĦ´?šh´ĦŞĤ§§Ĥİ£°u…# )!$bŸİŞ§İŞŞ¨£˘™§ĤŞĦ´?šiµ˘Ğ§¨¨§Ş¤°x’&0:ĵŝÔÀ§£ĞİĤĤ§¨ŞŞ™¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤ħr’ 'EJĵ˙üŭËĦ§ŞĞݧĤ§™¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤ħs’ &$EA½˙ú˙˙ûÍŻ£ ĤŞŞİ™¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤²p’ ('!@J´îŬġü˙÷êßÇħ¤£Ĥ™¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤²n’ ( (!G˘ŸĈÏħÂÒÙÒ½™¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤ħo’ ' # B³˘¤˘§ĤĦ §¸ĈĊЧ—¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤²n&# DŞĤިİĞШ££§™¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤ħl &#%Ñ²¨ Ĥ¨€Ĥ¨ŞŞİ™¨§Ğ˘µ?šiµ˘Ğ§¨¨§Ş¤ħj ' šsĈ²ğ·Š¸ııż¸·ğ²ĈEœ(E>A@A>E˙žÖ˙ ×˙˙˙Š˙˙˙˙„ö‚ î:,.$ €ç€€, !0;œÔ7áƒ,+0*>>˙üŭ˙˜ àƒ*.55KEĊ˙úŝî˙yÚƒ,/5889rħ¸áôùàęSKÛ„1.4- [W,O‹À͗Q׊ ,02ƒ2{¤"э+)+! =Q €&%*1AÄ˙Ҍ9€ Ϗ&)+)GAĥûûŭ˙ž ѐ+*02IGÇ˙ûûî˙ĵZ ċ/-07:8uÚôé¨ĈÖ¤W“/.5) R14ş½SΓ 0*- !B{ 3')9M é0''/<À˙·4 € ċ 0%,*F=µüüŝ˙ “0)01F<Ċ˙ûüí˙ğT Í“ 4+283/tž™Ùóê´ÄӟVΓ 3+/'G13Ğ‹MÍ“ /*, HuË“ 2'*+.C ‘/((.>Ä˙ȃ1€ Í“ 0'$%D>ĵŝŭŭ˙ “ -',(A?Ċ˙û÷íĝİY Í“0+*.57‚´ŻáöĜÒÛ¤SÏ“.,0' € ]??ŽĊȓP Γ/)/Á˙ŭòğN /ġò°üñî1íúú¸üĥ +#-&E6ş˙ôŭ˙íN Í-óïĞŭî$ŬêíĞĝµ -(1+:>²ûèĝŭĊŽ: €Ë0ôòħŭñî&ëĝù¸üĥ .&.' $"9˜2H—½¨€:Ì%òí¨üïî5èóö°ĝĥ .%.ƒ\É,ô÷[Í÷í˙ò˙óîí¤˙´ .&$#  €Ë(ßîûôĜÛïëíàĠ÷ôŭ (#%'!ŒÄ[ Ï)      (##=>Ĉ˙ûòŸ Í€     $$(#E.şŝñĝ˙ı  Ï*Ħûó÷îù˙žé0˙ž$$,(>?Ç˙ú˙ô˙v1€Í/¤˙ƒ˙QÖ¸ ú§3˙Ş )/+3IC„Í­k§¸§oZ5Í1ž˙;“˙°½ ö¨8˙¨)- *j ÊİË1 ˙E›˙· ú2˙Ş(''  F Ë-š˙;’˙­ıêk˙Ĥ#!&n‹  Ï) ˙B˜˙´Áâ˙ö˙´!""6;Ç˙ä§S €Í,mÌ+gğ|‚™ħ˘şy$""?7¸ùùŝ˙ğ  ‡€ !%+*D=˙ûŝï˙Íp' ́&S÷èôáôëġdöĠÛÔ$&.-$)NwéàžŻĠħp-+P˙·˙‘‡˙a ˙s1(&/!* e•ž™cˁ"J˙E‚˙E9˙]˙ÛÒÎ*#) €.mɁ&K˙N‹˙MB˙] ˙o!8%$)(B` "K˙F…˙F:˙\›˙Hvë& ().È˙ߛF ́&K˙G‡˙G;˙\–˙E˙%#!?7şûûŭ˙” )K˙G†˙F:˙\˙r¨˙(& W^¤ÚÀm˜ÒɓJ Ï“*!)€  Fg“{Ë“)#%'   OË“ ($%"[r “'!4Eż˙³ŞN Í“ &!E;ŭû˙˙” “&!&B9Â˙ú˙î˙§* Í“ %%*#0=ƒ¤‚ÀçêÀĊĥvpAΓ ((*6?1_ĦʸzËŽƒ)$& € OyË”)#' " ˆˆ(! ' ħġ£] ͏€% >,ĥ˙û˙éK Ò’ (#9'˙ĝġ÷îB Í…„"$$*8Iş˙Ûŭùŝĉ­v)Ñ…#69&(&9HR?’„1Tw¤¤°s)Í‚ €,6@HM3%  „/hĤŞÊƒ&3'7@HQZ`dhqoYXB-€ ΀ (?9?=CJNV`uƒ‹Ÿ¤œuG… Ì €5B=ACKU_j‚c=ƒÒ €:%.=G=?[ntmO, †Ï +:GIR>2CC<:N\`P2€Ŝ'6DA?FFJJOTLKQT:# €ß%=?FKMP\ghfx†‚r> €€ßNYfntzˆ}K€é Poƒ™˜_ì  #nwñ8ġ€ü˙˙˙˙˙˙˙˙t8mk@|½Żĥ³´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´Ĵ˜sC ·˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝڈ·˙òû÷ĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝĝŭ˙˙éL ż˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭú^ À˙ĝ˙ŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŭúŭa À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭb À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭa À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúŭ^ À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝúûT À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüġDÀ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙û˙â)À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙ş À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙o À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙û˙Ġ À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙PÀ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙y À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙… À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‡À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙ˆÀ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰À˙ĝ˙ŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭ˙÷˙‰À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙‰ĵ˙ôŭùúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúùŭó˙‡À˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙ˆm›› ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ ™™R  ,8:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::6( %)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++($  ic08  jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2c˙O˙Q2˙R ˙\ PXX`XX`XX`XXXPPX˙dKakadu-v5.2.1˙ Ÿ°˙“ÏÁ ĝ@Cxi8‹@ġÑi²’#ŽÚpœ³ [q}ÂÒO„ ñ(Çòî·³â0 ô|ŸlŝoA œoԜĈsj0¸ë_[42ÏÀ6^i´LÖ9h JFN?Ĵ“Û/qÜ._ \Hž-Ä3Ŭ£JÎAm…l†ZÔà a7‹˙@ĜÏÀĜ+/fɛdébħ™í‚“t[àÛ$áïasL0_*ı0ż! ı˙Â?ĴX ÑʧîÏÁ_Wt8yL°×X)83êäEM b÷ŝ/"°žÈìùŒB>žaÈÙ÷=Y÷àx'ƒ×aם#ʐ Çào¤?ƒÚ™6ĝ¤oiÏÌ;âß+AäÊ ÊtɨÏ1ƒĉ‡nûéñ]\LÛıMQAĦÒK>-{³*˘Ĥżô ĈÀíìŬ££Ièz¨ùù[˜‡œê†È3$żî–Ôs1:ñB‚\qJ„C-™Ĝ*)d×֔âm”°•cáżŬŸ4³a7`͒‡_â2cév(•Çàsœ?×ò™wAĠËÍbQf*IĠ&=„`³òĝÁŜıg ŝNR{l¤;/-î,—7p+ħ•×½Ey÷ S}ĦŠí:QiXk÷Ö‚úɊDĴĦ">P4:‘m˘>qı„z‹ 6£EnON΋àÇÌv,Íözé(ö;Y"nŠhAԁîcqĞÁÁ‘ŭd*§9)ž‰D\ك\e:í4‡ÚYÚV€Ëĥ[{’³?bİlİ>|,'\êw–ĠçœŬ˙ylâħXi— °ât­ZÁ6§í:R¸:ët ­yıkŬâ‡ĥĊV™˘ь4vè ùŠ=ŠıĴî‘!ŞñïŠ?ŝá2NîŬµŻU­í^ïĝĞXa››ŞJÎׁê‰<ġ˘épÇàG€ü~c €ËîÒĉ5Qì:|)*B›°`ÂĦ•x\t²Â@nnÈ$<ä’ßĴ·8 4›O[Úż(‹ì|şċXÇvnŒXj+ÜìIaí¸ÌcùdM͞Ùi£Ċhgíİc§aĝR ›á”WĜ…Wñ`s£–=ö‚Ĵ(áQö˘ċy˘ˆĞru(½ßó”*¸hâ2DÁqÂ器 °RYœqšÍÖ¤ż¨Ì‘EÀ40ŝêQÁż„À}‘_Nì %э›ĤŠö³ ‚4ç“ĥI¤!Š˜2i퓕ûĘHĜ˙(䂺Àm.âg.M…½g‰& MÜÂı•[çY%2ù½†{’żħéq 6¨LìĥĞ(Cs•z•rƒŭ^‹+ĝĦgŠy°\ĴLŸw&UĈÔ²VZ,ÔKµ‰,Œ£ïĠ0˘×CPR²Ç<3Ĥl(ò%nÌy›ħ£rïڏHĤ°LFLŜF[3öLà;L‹jĜ­Oġ3˙g¸˙ßBêJğc#xİAÖLziġqœ}ˆ€N#ÌX>Pżü“C“-½hq‡PDĊeĦ÷;éêE-ħĊ3°.V)§Ñ†6xjF`ŞÎÀ½É”×d\³O+ŒŭËğ¨ú [5ĴE?tAŭ¤NĜ‡WÑaâFh´œ[*#™FB½ùC¸Ş—šËôĉh‘ĉÓˇ³\—Ċ­nfe• IêŬmµ6 ÷?msZSÇëŬßé³^˙'b³Ïí¨£§ĦĝR`ô‚ĵŒBTJ‡żáŞw9¨ífVF˘_À(ßhñ%Ŝ@ù—C˘Òtú°wCë3ûOdgş?'Eb Cg~ò_.ĝU<ĵżĤ™qbĝÖa&VŻ[ğ)ùNaùHFÑáYٟAêŽĦ^ÀczċŸÇaĝŒÄ8áö"-Žlş(ılŝĞD6¨/dg#÷žÒA Ż}=ĴgM‡60ieü”ÔeÂBdxNßĈvżŜ<˘¸ÖvNg‚É%Ôĝ]½Ħw— ÁİaHRì Ša[­5˘OH”–j)ûĴ bĠÔĝ#ibWê'x†)Êb^Ùç£* ğ0äjyÍ·Ĵ=#r­K'ĜAi&‚Q´“¨ò–Q‰ĉËyĊÀ)>ŭO´B'"e΁!-ÂÖşb:;Žéğ;À7Rú Âòî0ìUĴŭ‚ˆĥ6_ĜĈÂ3[˙O'sEüwËe &µ÷PZ:Ż%ġ'Ô.m;ôwD*€W p×ÒxÒTÙaeŸ˘{?Ħ§–şZHèœËs×ÒüêzÉŭtÄßhhl§K+ kf w9^{ĥ··;zÔ!ż²èK¸ŒÓĥ½b;9íĦ£Ħáĝ=€$%ä#5' 5éà–dä…EíMşY¤ÉŬ~-,bÁğ}ê`ݘ)Ġ8NŸšĞğÜGğAH³u‡rüœh>Y’N7ùÀ1“)Li‹dNÇÍò,c<fiĥ‘yûY?1(yı‰ĝ{§Sµ:è1Ĝ "%ğ5ˆQè@ĥğF6òĦ•ĝŝżBUŸ;Nu‘ßo(Š•‡X½?ëËĈyĠÑÇà“ì? ¤ëθpĝL45Ĝ`•ĤħĊÁŜŸ‹-—ôvŒ‰ħ1ïIJT(#ŸiRîÇà‰Yúaf/Ž9ÈÊxےL"c€­´Ğ’.Fm8+½+!?(‚Äž… Ö·¤Ĝƒ‡0ĴßÌCϚœƒÛç°9W úÑ\A’êވúò%JWŒ‹úÊ¸&„½~ĵF6 ñgë ʉ)=¸Ê'dÇᵑĝmd? jĈ9LŻÒ½#Ár݃Rœ=íŝùŻC³1-„+ÏóPË1şŠ4“òX6œŝş*Hêv>ŝŽú>=–›.}gé.ĠC?hŻ(ÔgŭïšWs„ ÇXgi5şWÎ`W— ûgÚg5̎4ĦġbmwÊè+ʟ tB45Żt^ğ4ŭħŻ —lȋĝ^ċ^×˙NğÙHë‰âñçşï&2™É’Џ8@d ;û³y—9jŝN‘­;ùPÉí?’îŞ.=í¨NËÚŻz#<Œ 5àÒ`˘˘Ö.ÑÂn Û3ôDŜĥ£â°Ĵ0ž]1Ż+QPTü¤EyŒÚ—¨p×[~ÎĴ2HҒ‚'\,]5ZJ·ġŜ ™ëŽü¤-Ó[Ğ"ÒY_ÂŞ Û¨ÎŝQä˙ƒŬ˙{xÜ<” ž'Ż?‡üĴğŞ £ú‡SÁ.vĊ(27<4Uk[;¤á—)n€éF§ÑŬçÉ&j1ŻÒ>Bèj^ˆÒ*(U…“Êp‹VPš=§Ŭì{|µ…D˜Rv'7-ü:kÜW/eï>ÓĊ äÎNĦfN¨ê÷=;ƒü]ynqub1"Ġ€ï ‘’$íÓNpäĤ’f/Yì˙;†ö5ÊÌ2ċÎs,îîrDċ`½€B¸ mĦáĴžíĊuŒü˙4Ö˘•ÜĔKÑᐊ\X¸Ġħñù5$¨mĤœ'ayÏÎrísĞ,Êcğ§o7|wZvgs<šüB€-JÔRjH(ŠZ“uJ„ᑁŭ•Ċ`—–­ĦVQ“Ġ½|é3ŜŽÉĵñÂ!Ċ7/ B0ġš}Bí7wÊŝÙ" ü° ċueŸĊG×ViŠgĈp‰S×t!EĦ.Œ$ĥı[¤Ġ D:Tö†@îÌl=ĵU†"NĜVüàîÍĞöSŞGÓú?vLâÁĠżF9s5:/áŬià˜fNx›à‚ĉlƒjÄ/釰ÜËŞ–ü1D0öıîĦ-YE,ÔX_âĴOyĜ8½?(P Z˙nĠĜ˜ˆ"ƒLĦ”ĠĥT’òĠ. ê:ÖA×µ²×Ów7úħĈŝŸÄ›{@•jÑĜ÷|Š Ò!œúxùÛ/丌bì]íA˜0ĦôŠó• _YÄrÂ)ŒĴžLÓ-ċJÊùACPçʨkqJYÑúfœ‹Bbżr§ñF ŒWŜİ#^NĦ²óNü20ž×·ÇûŭTҌ`|ٓâ—p)ĉÓyD§ÂqIÏMZÒ½ó]kžgy×xÓQ:(Œ=WS‡–?·X`›´fşċäĠhÏ'[mڐGmF}ĤRŽÂĊw*Aŭ#Rì5|J úħ=ĈD´ú áê<^¸Vžï‹àı²v ]³-†ÖGë\m-%/²j´w„isn¨Ş°ŬÉS€HᑵkÏá²ŬQr•YÊF'cٵ̗jЧ^ïO„×0 ĴġŻîñż°îk^o€OJ lèlÉ@46Xš­Í%g¸pëÒ´Àa7Ĥ %ÑJ-ˆO‰×ûgꚏ9054[£^Á\˙I /¨Ä{S—úKf9ôV¤€x@p¨˘;K@W²†M×ŝ Uß Alü}{şAâ%+Œn½ Û 5HiTÌf<9q„Ä‚Mdğ@ġd!ÏÜĉŽ˘×Èêp toŽ Ġuı3-ŸÑ2 bLÀ›t}ċx$Ž_œ­=öNĜ&=÷)Zn@pB^Rë)Šjż ĝvMĵ%q ĤĜ‘ ÜÌgxêÛlg ³ Ħ¨l@oìğˆñWö ì)LeÏĵ‰U‹´> '„üM. N8ïİiSuħ%MĠÇ:.Tp{/zÀ²W\‰~úĝŜ(V&“WYÖÔ?jw–v¨(A™ïF×y¨fŒlß]½žçT×÷ÂÎħĥKI½ÁS߂İ÷ÜH è]ĝ°\Ö).¤Nhœ™ıȃıUğĥCXŜ%lG#A1_ƒâ=ĵûÄÊH˘?Ž˜qi+Ùŝuz]B²6ËnVëí‘ Ĵ9wannç˙ıÏ;x Ìl"9ŻK{bßp°䟣OÛè~ߑ…ßĵÀû_[ŒŞ[ŭş˘#öĞħíHŜ´/É5Ìä3ìÚç%{Ċ¤ ¸@Uxçi@JnNc•9HRˎrzŒşh§R‰ âíĠ˜}şÛÛĤ %h: ô›BB ZċQĜô$N“²\AšYŜ²C-ġT3@Y1)Oâr…8çN°[°Œ°ĉ¤Œ"Ş OQ<`äcCX¨Žu OwĉϚ¸Edb4ŒœÔó¸ä4Q˘nԗD^d$e†Rġ-!lqQP‚ި0Û½R—äcxĥì&`=•Şm ô$\˘n{xd5ż3˨b‡Öï‡ÓjĴ8yışuĵ>Ĥ`Ó³tÔ-Ĝ' X–_Î'*ᔉ\7¨˜P·kĵÜ£!j"}Y˘ ĉ…t4ü‰“]§HÜ”˙ ñ|tكÖÒî2IŜó/5}ù mïV%}3Ĉ³cׄg˜H3Eî2×{°v˘+µoÉôÙPtċ 6IñH 7‘ŝpl´ó^Ĝ˙1ü Ž1.ÈöÏP˜˘ÖQ·3ĈÒĠ•zR;ä²ìögĊÑıHjU‰pĜè­ áè˙môÀÖú1C4Šê΀TÀ¸k#è×ÔMğËN™²aRv_£µòĤìòf•"ħ\ĥ‰¤™á€üè¸Ô€hO¸ü3L-wßYáxĉŬ½V]”zž–ÙkÌZÙÀĵ˜uœÉT$™—"Ïy!à'Öë=¤w’d„ĝ:ÑĤż%‚˙WSéobvŝ‘v#ĠÖ²[ÁJ³ğc|ġ8K2ħ·ĞÂ`)7+’él:óQ>O*_ŭ9’[Sá2@v-½NŝĈ);O=f,F`ĥoòD$U†ÈFANaŞ ĦRǗ_+|RëĵHòZK×9ˆ0ĴZ-3ÒâÜÁŒß28 X7ôŞŜĝ.šàíŬĝıíò"{.•ŜDPj 6ȅÉ!àrQêËùlOËĜ Ф"{hëIQ]UêI—Ğ%§ožĴ£v tˆĴS S4udÊ@- ‡5Íw`Ş~M Ô|î, #½vĝ.RQv ÁeŬoR™NV!)ÎGġ€ò•ğhŝƒİßözƒVç+Ċ\ìËö7ä\ˆ \AMŝÉâ#o°Qµ–tŞšŬB3Â9¤óžĤ €`Œ>E,·÷„ıl0xħ|şC-Çsِ­6 Ô÷xÙw Žħĥ’zŻġġ–—[YJ }99Ğ1[Ê@‚+ġGAC\pv˜HŬ-ÎĈH~ûÒHp ‚n<ÂóÔ"on\,MñĴ,Ĥ‡Ò÷)ñ€à(³!HFĜÍQîóÀ'C¨jûçA—#yİ2*ÒĦO&żğ– X ¨S½ ÒÏÏX€Ùç,1—Úà"e1ÀœX{ırƒ×…*ëbO:ıԀûĊëÇàïƒ? ÂĥŭîL`*ŸÓDèÛùó⿸´ŭÁEQô½ ° Ñĉ˜bÖꐠĊ)YV ™'8jfçÀX{Ġ ÚK/™‚e˜ŽVPżÈsjvÄ!ZG_’9wMB³S ANiJ‘Lùá8?£ïÁZÉĦ|ċ/'Ħqs² ÄWhOĝßT˙"î³Ì3Ì"µhú/FˆÏŝ—1.àğ¤ŝ}ŭhÙU`ĈċàñyŸ‡IÜfżqrjÖ Xè)”™>~nŞĤ×ZEg¤ÄǒyÛU‚éˆp|ƒŻÄ>NÙŻuޤž}Èš½éìz‚bĠv×wÄ5@RO2ä]'Âk—'ÍMK‹0ËrŽj jÊ€Áۖ2×*Ïkı™NÄaIíÒÏħÊó·C7Ĝqè+ďZdĴsà ŒêF Ö~•?˙==‹aÚù,ġÙ8‡A#¨i>İß ßCŻÔżişġ¸7(RÄ5“iğ3IJJ^׎ût×R´˘wŭNK%NjġTKží'àF °ŝ JTliÜXj·šlK‚g7Yŝ̘Ñy=pf2ÉÏäDá/œƒ=Î߅ ¸xSkÏĊ.uƒpŭ7„ǀܷÛ/݈Á,"ʀNŸuĈg>Ó)4"UwdĤÀċŝúŭŬkrÔ!A5:*á,SŻÜÎĜËñŽšŽĴ瓷(…($ŞcŽ6A9íTŬK$ßĊv=~…ˆ42L‚ê˙Ĝ™?=Ó]ÀmFd:‰*K}lĠsÏd%lÑÍY ܁YJç?ƒ I„² PW„°KXŸ(–0 a”ÄɛĈ˙e#ß(É[ì÷Ec0yğPG`³²ÓâĜ=ŭGSL¸ó29ì‘äµ­‡!˜b2ŝħ‹Ç-< ÓsA hÇ|ĊmkšfÁĵۈQ#ı‹M§üQ£İ¸Qö6"İŠft=¸ÖzbúĤí=jßΟ!€˜ÙÔÚW­üçvŜxw)Çû+ ëò%˙K˘„ú219¤ô҂K(Żu‘ôÏvzùBÜ6rÔOpiĵg˘6pÔP—Y“>i+'_B‰<İé@$\ŭ! ħ9~ÉĈBDì”˘§ŭ`*EòúwĈ<ĝ}H '~.i]gÒ˙2näÊ5ĝħñÜ/8´.ÂíLÔ£Û`8ißî’X~mrpui”£Ò‚ŭÒÏc·ĥ‰lT›‚KıÓZ½²ÊSÎkx–%/d;b ÷uÛĠ ›l†ĴÁeóïoF#³R„‡ß|Ş7yàşAÚñŸÛœġñw2qfRÙĈän£A‹²°Ȥ„vHġ_FFĝ]6P˜ĊfĜVç™6ı…,m~oj<ĠĤĊÜeX‡P2Ç&kĊá·~tŻ‡×_W£M{mCâPYÌ(*ŠV¨wyĉ)Bʨ,ú*PÏÊfŸRL0WċCïĜ4'5°üIAöjÛ4ÙINfĤp7em☜uüJŝ•Aß?cĠÄċ\ŒË/ë >ôO'NV£U0a’ëXCÚê yÓ*£#÷=W ³ú”( ûf%ïáˆéĞŜAQ„öĊ•‚Ĝĝô䒂nU%+èRÛ#w!ä+£máÔġäy yĠ1ĉ´Ş×IñßYÒŬÚqî{dÖÛĥéѲŝñż„BeĦé+è•(ÑiDñ‘ kÒ°ċD>ÇošĉÍġá%yau9TJ^#ú@§Š,Bß˙;ŝ‰ùΞ?A0G䞍{0‚}hÓ<ĵĤħÑ7§ŭ‰Ö8™"•#ÁŬя4ËáıÄٜdžf–X<ìeéó=Çŝ•Ì\ˆ‰uċüIDcxğ˙„ÏŒ *ŒĦ£aŠô’ĝ0^Ŭ’™KÂßy §nÇġݘDŒüŻcÄ@ûó( ^×{"Bv QÌ\Ħ £†L¤á C LŭJE?Z˘{ĝ ĊːßS²LxW)Ġn{bP,}úÇ KVt¤ŝıˆ ˆ§ ûĦ–3°A“ħšz1ĞV8,)ú"Ĥe µ÷ĥĤù>×ĥ°’òÑüçKBÂwÑ˙*}™ŜöËn‹§)Ğdc™˘+k:×67OĊ4Šd/0¤˜jèÁl{‘q„ô7Paà"+°uždİhUXJÏĴÚŝċmI݆Ìä>ĥ5j¤ÚCWfñŝûbú8\Oˆë%#¤TWq¤ò}9zù&—$÷››Ú0̗{Y2ş eZ·şËĞ—64êê%jú?ŸNü‰,@zŸ´Éâ/Ù| éħ"ıgÊS|í\i; À>Ĝz.Ò}Z.ĝÛàıXĞ£¸ç|` \ġáĤĵ•+ƒ˙†\BOÜ PG§‚ĝc0ŞšR!ŬżCĤ˙S$l͑Ö(È^µ$u€îcEÈÁj&”€bĦ*€ŜjĵaLj&/ĉIUĵk=Çá蛇Ħ<~Òò²Y"5À£(+N°ÉùċEx|#ë ŝ=Ş%ċmq;ĝ%ä,‰Ħsˆa;œĉ2Ì҃£_³Ä”‘Ĉž˜M? öÙĝv"=BŒ˜(6!­zÍ)Î3Á ŝAĞ|W§ŻpO=yl;c÷£Y·_Œ?n*äiğÉ.#{ĠÛdGü…‘MÏ`;Wl@ §R½a ¤ ì<‘Ícva?T!|(hP6ÄXítˆ†”ځrS:pÀħÊvŜÔ´ñW¤nCĞHcĠĈOM &Bż/;'òÀâ hÒᛆï\B§ĈÎŜ XVg‚Èxl*ÛHÁÀ‡“oƒİĜlé¤'7OıÑ]ápŠ7ZCfĴAD’|Ûb“2|Íż­ĉ5x#ì3iVzíŻJ=:ÁĜxJV]Èż ëxiò3}Ž4–Nˆ· ’_…áĊÌÌ\:C:G9Ŭ( ?*&{rǽ-¤}>5 í·W(â,~¤#PÈGĝn &NIêıċ…È€Ż›6‰2s2/ĜĞáŭB"°^šRJÖ>XqŜĵL+¤ĝ/9üü_‚7EK“3Zg—Pżœ Àb–5ê9 ç33Šž àÎÇ?ŭÓcNȎ¨u¸úb>ġÓZËÈ3ÊĦÄϽŽn9YM:üτµè˜ż²ïĝÎ 7‹ü*QĊŜÍ˙–Wġ,ħ–ûKÖ/ċêiöÒğĈ¸{úï…f.R§òšpĦĝ·)÷PP肄VÒF;TÓFRK™ĥÓ*ÜäE}tSż£H [`-×3lv\ÁÀcğ“™>½N$hb'–üJD°2#ÊÏÔìK˙~{‰#Ókĥ%—m‘4OñÚ/GÖÒ§­zħbè"}.z€’#[úNŬ31e²âQŞŬż“&VDµ,,TĜµġ ™ħ€l–éUÓ)Àî€ÜŒĴ‰²ÌÙĴdvFŭ<Ñnfïñ’J²êT“WĈınchèf`j.ѓ“ìâ:ŝGŒœşAÔTŝ·ˆ¸„·#Ǩ~-OÒ";Ċ{kî‹ĥéâ_/ă>%Œ™;"°*Ó\¨xT‚u(râ[ƒKÀŞS_l ^VÁïeâ7#q9+G•óğ#ÔĤp8âqG'=äWq­t4Òm„â¸Ñ³Hg4 àˆ'WFV·ŭÍŭÓùwï*˙wˆg†ŠúöÇoŬ7CÔŬ3ÒӞu á b0×3Ĉ\uFWı}c8RÜáŜġgÙ<“ïYlœÀÖŭ êQSË.é2£mgéO`×;3€+ƒNívD,ĉµjBu³XĉŝñGœB*klûIçäLġǑ‹[4ù’ä0ûú1¨ëß7M?öñ˙D8`Z^¤DŒĜŻVtóÑ4zħJJ r=Y-4ŽìÜN·"…Vê=™*sR× ԋĤ|t–·5‡ZŬÜİS1üg|oœ€)Ĵ9òŻîh§Ó§ĜäĈÙ05rM°í_żú{ƒ€ñÒġ&yéÍ(gƒÑêĉèö-CrlêB,CjT:œ;–ż°–˜˙/ȉç>œ2CÜыbz ­íÏċÙN&ö~ä¨j%ÈĞ%™–Š”/BS)Ú¸ĉvû"ċ]#DWĝí…Vzŭı5Xé,éŠwÜ@üŒÎ~o˜!973.JîÚÁċÇ1óÙ\òùĤBvĦ{â÷œ.JN‹ß:TĜ‡vFF´XÑٕ¤^’uY½X“˘’Üĉ*Ž(L$$ Ĵfò İDШTi6¨O"/Û~´4¸<İó÷Q7“7ŠËTÉïQvô÷›#Ù´ž {Ùì÷ Ŭ:›Fnì["9é˜göŻîۉêlú½ġì>Ŝs £`6ĝŭĝ7Yß LĞü“üÏTàċ·)Ġ÷½tĴ÷Yˆ-,Ş_÷…n2uĠVL2ċ-€Ĥa×N{-ê3·hœƒ™˜ iİFÈaÑıL”vÀ~xD+ŭ†ÇFoŭñàâûύŒs›ĵRb6½×ĴêvÂl [%Y S’ëÉx˙ íçilrµÚO$·Éú=žĠ˜x”W˙L´Vuğ%çŻö<'c*Ò-ô/WÀÑè OmäŬŬ ‰Y§eZVêmƒhz ™”ŞĜY1ښİW(˙-Ğ!èĉ_ÊĥqNžşn-¸&)˙D×ʄ2ğÜŜ-ıbŻœ6 ò}ÑYDħ~×=Ċ̨ü.S  Ħ#i3ħĞ7ß5­ TT”3ÇĞù˙CİA•ğiw'R{Û*T¸ŭœkQ–Žqğ‰Ì€AßĵCÔÎÑȚİVíĞûèµ½dèqHÒòî6ƒ$vsi]ÄċëÚǙŜ WCcĴÑ;&O‡ċ; í²zÉĊ?Br+ħ| 翊-suÁXnoĈfBW|:\ÓàBòŝê˘‡˜Ÿq²ĵ]Ŝù9šßHWM‰‘‚ßïĥw#ĵOxN˘fÎöskŽ˘ •°fË#ó½¨ÉMύC\k‚˘eÁĝ‘ÈĜ…ìvDyzŒÁRzziÌ:s;é‡HĴ9´ÉĦ@F2&/-&ßTP—w“-öÓ¸jÜĥû½€‚(ż)Ä"Y0×ĵ“° Ù››;Ÿ›ù‚’èVV ‰?è–_ XkğB)£`š–žÂìĦÌÙ,D+ú+3_v)e‚9”êaŸï•ċÉ4ËÀì×ùµµ1|¨ß(ò˜P.pœ/|xŻ?VìZƒqSĦ쀴jğG¤m )N;HLp‘4]ğzĈ’O~h<‘Ŭ Šq²_°‰èŒuĝŒî€İ-&óyjuĜŠ!ù&ˆ€LöÚ?ĦpĠ ĤĥĉyÂ#9wùŽÊC'}PtpQ'~CÒß#Ö1İĉPĠ½× AuuĊ÷/{ÀùhÈT uBÄB[‘сdcĠRlÚ€’ûgˆƒònŜ>İw~3(y‰ıxt…TEL:# ˜DyO\Úz^mžĈ~~ûUÏ˙67@óm<4°oÄĉIÔŬ÷$FäyıdÎ,M†`Żue’•ŻÚc”µ>~|3×Ñŝ·ì|÷Fۙ\‡£!˙B~P˙8Ù,dŻ˙e W™¨‘żÑeÏĝF`Q% Ĥ!Ĉ^?Qg÷ĤgGE&£7Êĝßi£ıïxŝW·ŻÖkġ &OÎ|E÷nıÔt‰2³ÌŒ-‡/Ï/,`0÷ı‘ñ[Ċ^HÈ%^ç°‘˙V)#dĥ‰jÔtß82ŭéŝ†ÌĴ2“òwž=wJz”c²mĠġ´×–­jPğċàáHÈ}FŞnœ=^Ú1XJŻ)éè·HÖ0‚ìÑϓW!Ùşücĉ ìÎ÷Û#˘ä`‡+rƒ  Bœ£RĊ ¸Ĝ†K²QôŜÚûÜrD‹ü<ŭtxñĥğ\JŭâWş‚nîÙċüqK `QîĵžŻ’Ğ"ÁÇò½Żž}8ı)gb­ ?p]H>n[êŒQ@ç8Ë‡˜3D <ùßĊ™k³2ûÌ6#Ì˙oœSe^Vž×uJCùŸÈk9Ä1yç·ÜHO"Z–íĈt" SÇ^‚zË ž˜&dz| ĴğJⓇTİğô^ĝ~¸~(}Ú!œî‘"qı3Iòâái.yI5g•Yñ4˜íÛ)[éöĜ_Ô(HóÌNŠ ĦghÈL R Ÿ>§°Œĝhĥƒ äO_•]̏ŝjBpƒĊ˘n³üVía_1!Ž,„ yĥÎm½Û’S32éû2WĥyylŸÚ…Ozq²”ġüŬUÉÏĜHêf4 ZӖ`İ&‘4Ä3lM=2XÁ¸?Ĥċžb·Ÿ<ʋz4X£Ç9)aó€"–xĜWÌ*{Â?Ĵ)ĥƒ+X²½ÏÌEşiÀ)äzħ(vĉeûò+èï?Ĉ:ġ!£(ÎѸ=û.꤅KV™÷$ÄĜ#znß°Ċ·ĠaŽéÉï0FbäÙczÊ+ Ôŭ”·„O„.úul\TÌ>5-ĠMpŸġ!{ĉĠN•ÀÒ˙u tÔÀ4\VĴ=$öĥĦŞ3ë#:¨8™²ħµ€t)u& ıP$¤Œ}Ĵri3b‘8ƒg˙~`én U—˙nKXÈ^¤Z&‹şÉQ\ŞıòIwr[F#ÂíämşÚ­Ĉ†ı‰bë9[+˙ ĉż& y…˜½ìĊ‚s:Ğ‚‘dˆx_×ʟ I#§uĥ û=1òé=jLw‡Ažô“ĴrC΀HüRĦĵ•Âñ˘‡0$C–`·vcsümßW?j#ßì"N¨LlÑ Ò@=/GñLö}?ğ<“‰µHl„ÊûùÌĜb` 3Âof*¤…Î’oġĤ³Fî„1[Z0+úS@ĉTÁá‹JÚ¸u{.%¸’ùòT! ë‘ĥÏ ™‡YL$KN`MÌî2ĴğŒjÀ+žr•¸…ŝÚ·~ ħŒ.cYĝmúÎş(%uÉï Ñ )èp é5U.ĈgPÙŞÎNıúYdĈ(ÑĞîT6‡À­-ĥ"ı´ r{‰=§ƒŬ FÔ\nĤ7 à"8~[P²ŜŻ£† *Íl­˙GNO~ïÉRÀ2İ^ ŭÄ/c&-Fp˜Â9MQmĦybú.Ġu´Û ”QE3öşüNhJÁŬA]úĈÒѵŠéŒyEZ6Ö¨Ĝ½wkWP”ʍlĴ‚s/#Äè™JU£e'K: „ú mÀœ˜Kx’†:ıeĦDV’4s|ñÄZ¸ˆBíPóp~mo\g` ,ĥ˘†_ş9@}BoDVĴB&7µìÙn–DÏ/?ÄÛĜQ¨÷gƒ$a› Ĉè6Oa—Ì’zO/äüĥy-äYŽĈYġ·4ĵ-V³KBMÙ­˜;Rwy1Ü£ÑŭĦäǘ>ó}j“C5# §/Mdĵ~6†pŸ C8%"󑎙—À–‘܆À‹n ĴTë0­_…‹ċĊIú­¤jgXú‰Žqİ ӞËÁg^˘?ߙĈk³”|nfċĦÙ)Ng34ĉ<Ô3 F_ üPùúÀ̓yŜġSš}{ŭĥEGœĥŽ@nÙiħ8İĥ8µÌÌ<#]ʙ”A}ŽġžŒ[ÈêU#€›öÙe˘‡ÊëÊşßÌ xâ×ÓB˜¤ï̃6g™üx^RşĴŠBQ*çĠ鞨ò#$}ĉĤÏ­N>UŬW¸*öxoƒáMlĴî.‡ĜµĠ|ĝ³œì>Ċ,â6hÜżn‚î?}r $’£•°VJ{™àŭE̜ ÔqYa·£^jW a6‰êgMKÄ5y“d†?­û[_Œ-B„Ġ4_âXPWrĠÓN ü [ԌkËךlħĠ*äï(…žŬ*Ò>TÎŬ¤`›MyëıöĥPí ’× +ĥ;d!€– ”„İ2ĠĦ ’×h5==ëÊ&˙LşÛohe›ñP;ĉJ–{-ı_>ݟ—ËT€Şk 2Ĝ˘Êc…ÚE 8:•Çš –Ñ!˘ĝŬçií’쒁Ä| â˜Lvâ¨k„"ĉA¤wĥ7ÉëK1ëÂRDâq“<0ûaô×ĝ[5Ħ~{‹#Wŭ‚R\Z‰šŜĠ-|ĈQǝžÎ™ĤF`ÂKúxg’àTŠR”ž‰(QşŻÛfx~Á-}êĠ'ğY_`XPYşñH—ö îé²Ġ‰ŒŜğĉv+Ä­ W¨Ni"Î(ïĉż“ŸĜŸ[¸/+˙wiN':wqİzÏmN˘&Ĩí°!ö×Qĝ.B'ÒŭqhÁŝNOÌRޏà†FıŝєÏE“™ahóv%ô2yXËï’#˙4P­ú(1t$ôF6Tv),XL˘h^yjá†Ğuí¸€żù½…; ¨ôÔSçsñàY*7I¤ĝ“WȟVÚ ôÍ„€òí˜UË,œ½ÄQ ô{ÛvSĦŒ7wX´ùÀEc&z>¸ĦĉbĝWAaoiš àRJ ×+öfÀèyÏŭ#Ô¤a8Ċ€öÀ9ìĊLÌEž£c8_ħÒ^Ú´/Ŭ-Ĵ}ĝ zöÒ. #CI9Ĵ]”çĵiȨeù˜ĈrójPŭ$ç*­‘ğğä@Ԛ‡Î‹Ùv#pÉPğ†J=ĴĴjĊ¸ċ›ôÁ˙B ³ÄƒÜ}:ÁYĴŒQp Éäû™²pĦ(šoûĝH=Èù¤ÖJ?KĦjœŻgÊ5ڐRŸÖÒĉ.~{^˙}‘ħ^eŭş¨NJ€³kĵl!8V'Œô ^”A}Žġž…_ Œ ½%nÏ0 P *Aï¸ÔótœĜŻù²1éïú )Ĥg3÷;Qâ–ĉž VÚ˙†ĈP£{ô€Ÿìi€iê_#!–7pìtĞγ~3M@-ö÷g}]uŝŜä?nÊöö{û{iŭ½•ŝŬÊÂúşĊŭ½pßWS“çéˆġ?\ĦKäGċi#{Ğŭâ<„D$ˇüğ;وJUĝí“A~ñÊËï§8òL.XFĞ*ı4˘ÇHšFQħÑvĎS™ßĦÄ)AÛÁT?¤ĤŬjÉhwü—Ż3u?œfıÁÀú–ôŠ|IgFò雝½ĈWž£Ĝ·Ħ‹ouÜÍeˆLó;†0×;î Ğ\GKŽù%}>υÂ*!ş" _ŭ8Ş´ÄDjA÷ûİĝ­"½„›ZŬıgr:è ò•šš¤‚kbñ.?_·£gÄĝşœ¨&×=†[ŬOGŒ*¨Ċé_cñ9^<éÛR/L‚SO—Jžé–Ì‹r"†2303Ğ­j{Šq˘ŝÉAš Mú JäTÈñH܊D×Si´ßè˙{Bá1z/‡×|…§ë%Xş”ÑÖβ'ó XPá…Ö‰ĥÇ×wM~é vÁ8WR>ìâ]6Aġż*˜Q¸ĉ‹'pKĠĜ?ùĵŒîûĞ‘h˙:6•6eż0asOD7qF†f-•İJ>´²¸wŒè”Ï8Íò\d;Ġ—nĜ^D蝎áѲpq çóŽÒÄ܁Ĉ{ÀĵWUqäĦîbUöıÎĊPšÑDÒ1{Ż–€×ú>‹O žÒ‡:W.A´CŒĝ_8­ŬŒTëúÍ‚ıs‚ˆċùǤ Ċ‡u hê,°s`ä$;§xÁ–²šâi%ù>$Ĉړş˙5Â,ġ§5p…Ï˘²R“!üŝ¤§íPEsŝÜç›×5şŒCF1VYjŽĦ½ċoq§r‰­dBğŜÔ^qˆħe…ŝñIòƒ˜p|fe‰ÈÙŻ”ô‘ÏZûÙ%fv5cáŻÇb,Íg'!î¨ÙQ ùi¨Yg$xš`wKŬ@••_Ħîâˆĉû`öıLZs$ RË-żx#ÑĠpÖ&Bg X$0ö<|÷˜–*†… &žk?ZÍD {ġ™NÏ h•¤Ğë‚ùïpêqxY+ÇÄ•û2ia,” ‚•‡U”4Ċxé J'„Y98Í8ÁesĊAr´nîÊW˜HB=íöżóÓµ’Ú<ğñY’Ŝ´êk" x~'è̕:5)~9kıŬs0ž<C×Eî§ĵRħ}ŭ ’iW›”ËÒ½–qM~/ê‰ħïġcWOàׂܟ´,†Iâžk)>B³HÍڽܖz+Vw^˜n ıô$nú'w#64Ġ#êÙ|ĉŽëÉM;ĞBsâ˙jhAsֈbŝK£q—¤›ÎQY‘—{íşò½Ô]*•=G7 LŸ%òîFĵĥfTÓU~˘7u;Zİf~LĊ j´Ü-Ëm]ċĤ•ë$*™IÏHJatLĈDĤ[ž‚÷!ç_€d‡dèUÒ ™>½’£XÒ`·£µ–‘:+]R:߃ZĜTGqµ£ŸŸw˜‰ 6˘ÏE}0çêfµM`´ÁġÎ4C‰z;rz´cJSekl€‹İ({Î%L$ˆ”Š6`‰œydÍĞkTĉ‹˟İÀáÂş-h¤ÌBŽ"ïàcìİH9ˑ%XVdŝĠÏe¤g’á‰bç`ß-ïÓ÷òpûĜQ:–rm`ZŞYY <ž55j:B<ŽôbTX%Š–×G˙(–Ş6÷XçĈ‰›çğ[„öĝaì=U@zÖÊĜíîĞl™&(ò4êJ&BŝŠ!' R’·,H{ÁÏ•'•= ¸6ŞÈn„ µeCòR`ï,(|΃]çe˜œ^ñÌúğ‹òxŬ„z…Î$€c ^ZjĴa½Èr‡Y¤ġe-M„`ıgşßîoXŻ÷O^Y\‚o_÷’ùGi.!òAŞÔ‚éžé“†=,ÀÎIÊ!eĜÈ L!dğÑï ™nÇ܎ı q@ċìËŝKż%)H(*•Eì€v…Z5…a£Ënĝ9üSbm•W,ÙKìwI@dóıŠ=$éˆ ¤:ċÙyÁ\ŒúŝĞGÌm´Y’ë‰; œîIJ@÷ĤqUFe3ĝµ ÈsJôóÌ ”›¸ƒèŠ^´dG8wDÏ@;„ċĈ²B; )Ò(޵\lˀĠ,á3HAÖC bHdĵwËá‚ŭġK€‡zŬŠV^ 5ĝ9Ñà=Ôn ÛŜ ÑÜ>aJĊ{·× ÀħÏĠ鐁H]Ö*H„¸àĥ3.ˆĵZİьœÂ4ݲLÑġöǙ׉2ódË^7z'+?Ĥ¨x£znħF¸Š£/TBuvş´J#J¤h9MÔġ—Iúê–9rĞÁRÌe(–|€ì%ÁĞ8çİŬâ@Ü À…%sgü'zġ(QĊbgR™#Ĥéd*ĵ:”ĉ‹²Ŝyú½Ze“Ż>ÁŽu§>Ó ŒRö*ëÁžcKUĝ$:q7sÈ7†(HµħdvYÓJ¤ „p@Ɉ3Z y*Xòn_è7¨ÎJäĊy<Ŭ]äĈë⠎K4ëµŭdAÑöKáù<˙)­-ÖMLr^ÌĈ=,ܕĜÛħ!-’¤dôħĜ °÷÷X9ĞûÒ0³g7“ VĤrvהĊ€$¤0áQŭ—B:. ´µÉDŠ Á3á ŻevbRĠŭ*Aw²ĤÊn÷÷Ùïôm OxîßO/%nÂ÷² §1†ƒ4žhè)o%ĠU‡½YŠ@ÛıQs—ĤSĊĉ×NúAt" ŭœĤ)ĈÛ(,ıÁŭ¨6Mì* ŞO½5Âúîûö_°è³a âgéoŭpì²@ƒÈŬÄkçä9àvT€b`(n*kgòB­§ejÎÌFttEórQ¤>ŞfYI°v¤àŜ¸„|h§`§vâżĞ@u/:B$èYj¤R~bµĜ'Ñxü$ˆ:S\ hûK "D+úwMô< ]ê•Ä;‹·İş’Ölʁ˙UŻDƒÏ·[Z‘ÁáÎ?îß³ŭ„ĝŝşŞżnS%o‘tO¸iŜè8‚ĉ„ɐ”ÎŜÚNšÂVk?ëDôM…ĝŠB™Ô›şQ zxB…,Ww “8ْUV"½ bĥ`lšzâüĠ1ž)+Ż1ŸeŽQƒK%Ĉ=>lx –‹ĵ+–Šı"éÌ˙bĦ›D“],œˆÖx–‰ê#ï‡i_YŸ–ĜK8ĉx¸għâÎĉ ÀšŻA+‡ћġžQ}£r) ŬEß(VŸÊ P÷ĊE;R<òf 7ßĜ 3ЍÀóG< µêFş‰:IqĴĥÙu­?³6œĦ„( Ĵ{}i]ÒŞĴN—”ŽWi¤çÎi3ĤPÇÛßUĦŭŝÏnıén÷OÎQ+ Ğ€WŠûƒZÜá‡P3ĴˆèZ•‰,2÷˜˘ö‚üò Ê Ğ1òÎÔìo­$êGöOċ†âŻú×6§ŸLkŞÔÜï#;”^öT,~1 ~„ÓyMÔà‘:ÂÑĊ`^Ĉ›ÍÈW?%'bw]ĴŒFŽ9Ĉ@É˙o<ĦçÖĊ;Ħ Ea"‚vŝ`D·zÙÜô}ŒÎO ԊE˙q&§Ħ4ËôϚ_ĠÉ ˙K/ÚK(uTe­„ +$H#ži^—^}(ÁüôıÁ#ƒÂ2Vë/EŻßĥII'S‹PN[ƒR(ŬŬĞ;›Ĥ[¨ÜSdß֓*V̐ûJ6˒kì[p\b)ĊÑ@LÚ"ç›;’kE˘ŭĠJĝvQŜtoĴmĦ˙i˘ÙxF?žqžŽa…â3›E\ÑêTx`’SV­mG–GWŸï}ô÷Èh‚´`.„3ö?—ĉ}§,{€Ó„Xû5 $M0EŸ-ˆħ€Ĥv[Y?JĜàüÒ³ŭbRĤ&L'üÖ]”16ñK҄„>'’’I$’I$’I$^¨$bŬ%¤8ĝ•3ŜmŭK!JqyżRŽż.6‘oëÑ Ñ =khÁÌY^ÄdO?s,cĊ‡%ä˙c‹¨<à'xèE°çí.Ŭ€Şú|Ö6àBxc¨T舕ž×ˆ`ChpÊÂŻaÖcû$͟R>;sÜÁ.]†”IʐżÏŝ‚J5 ׌ÔÒnÜ^ħíÂŬÙÀž˙dŝñW4´ş´ZQŻĊ”F˙rùuë³]áşİ­Ä>|ĉĠÄËUôL˜Êݽgƒ·CŭO´uâ˘|ÄŻ¸ğˆYM¸é¤!ĥÛK6E³~{£À.O :–LpûÖĉġÑè(Ĉ¤" #äj$|“$Ĥ‡²jû]ךÛ'Vs,Dwê eğ CÈ%¤ċN‹ĴŠO07Xt:6@!ŜÛ<Œ4=mœ‚0ċĤë …c³€]‚›AĤË: ôÓAšdŬ…9r Ŝ]öïèğ2WKğÁe•+ÍeÎĉwŝ˙5v‚MžFî×뉚û[ĜVîÎÂOáà\k‡ñš˘ÉŞv÷(޲)žıċG­ŞP‚ö{ş‡ŜPTÖ²i>OXhêîšĠ”gÉ8ċj“–GÎŭ2ԄنîDĵGÖ3”ż^€k–/ŠÈD m&hŝÔèŒB]N_1ifŸ+÷˘sĠËÒ÷ ĜŸŻ1Àô1è.$À ħúc2kì·d˜ˆTĈ^1â­ħ†X’X[*²tm\ĉZíħ7/¨ÓM›<ïDzóíiÎ=m޲ĵ2ÉİZĴÔÙz}kṳ́“èë8clûĞft¤pœdĠMVħ9= a€V˙;ùŒ[Êܧ™Ĥ%w„ŠÉ—ĜÁPĵcûóáĤSHȖĜ‡˘Şô#£ }2ˆÀĥ‘7èTI‡ċë²LèŽŻ­q•#Ŭ@3­Eµĥ‘ ğÙÉÇä3Y˙pȄéRşİŸ´?a3ü›‘KÇ/+Y­mpŭ%+mGd+_C$ÛYÖĐZZL'ĞcgĤĵ†"ŸB•ĜÂAèß&çò.ÍaT S9òİ qËkĉR˜bjσÊ##˘¤§v¤káöĉÍZ,¸êE´O'Ŝ7T¸:ù}$'Ħ äì=òpüb4ç ½ˆÓİ'߇3ÍìpLT6GĤÖ˜}£=gˆŭáĝİÄúñ|é˙yfœs5òy÷E‰KÂZrĤžBL¸Ż+ r gŬĵż ­u–üÀĠžçv½™š,rù}zÇʵ#Ŭ—ˆ˜ġĥĠ#ËrbŜc#ĉÏútNŒ6@I=¤Eî'ó’)†,òrŬ›ĈGkS’G<ż2k@”•‡X¸ÂÌÀŬÇĠ)†~ŝ”.+ŝŬ{IkéÄy²ûèHCG!â–yĥñ ^'.<ÜBÄŬôVЎbüżO2:^ŝ‚4‰@ëq€óîó.üž˘ÒĵJoÙIJ@,ëÑҘ}mÀ‚ÏV†hÂ"ŜD-°<îsîSÂ{´ƒ•Á.u*(Ìî˙~üúî×QUfœÔ§=ót~k?íż#HIéQ‚3x µêÈòúE ?Ȓ?1… J‚Ĉ+·âÖĠnċL}”á–Y•b‘Š™E>'!% °ìHò^mŝUŝQaşġ¸jkiްÍ5X%aBe†µ+˜~J>SĤğSï‰&HÒ ´ô,Ô3\½ĜĝĤ1\€{S òè‘ÁôNJżZ5ĥlM·5aíÙ8û5ñÊd/ĥĥ 5µ(ĞËû¨s˙á÷’R&Xô¨?gĵĜî3D†ġg9 ıîYXó‹Ĵq’ ŜŸ#\âA!Ó *v–CĤ`Áxu€’Ş÷z´ıU€}†U:Üİô9€ZHnRÚş€@äĵ·sċlmL?¤ŞœÁ İña4| EAÍ_rŸğž²çĉ+z½˘ÍŞ‘!0côˆÈA h›p˘|(ßÚû#l})ZmhV‘Ît0Ìáĉz%ëŜ'GŠLŠÔğYcı×F¸ùQQG9Ġ˘­&›ŝhÉ´yC³ĝpû¤…KŠ+<ÑOSĊxXŽ#=ä7ÒXŽ9Dċp@çÖQñ&h˜.=BA•ŜÑpmáÊfdSX$3FĴNšè˘Œ<ĝ Í3ÁFhŠ>];óÊÓ •›h~߆ÚCÛHҝû2˙ 3Ù†G<žÓ¨:vV2m6ş‡ğt{šġš,vx­ŝĠÑĵò9>:œÌŒĉ €[üKJ BPÎCq˙HA´&2¨Ñê”?˘ 7Ŭ—<qġžÉÒß˘Â£*p½ Ë„pIq"‚ ˙eïÏ)â)ípvxˆr²4˜ÈK37ž}–äM´ÄúÎò'ĵÔŜ‚Q0Qƒi˜ŒS@ŝ°o=u›Ğ†Ñ½Œ›ÁC Â)Ë êÖkbIN0ÚRñW6dòñ‚ŜŠû@ÄğörÖ1½ù˜Ih›¤İp޲ûžU5ż-Í…!a^ÀϙnRˢ¸Ç)sАĊYÖ Ü×Ĉ`4S:8"íg–Ġ;}ô°t˜ŬĤ秛u7.,tÎf†œPÏ…+KR{àîû"µnG„m£ÔşË˙ 0äëìÂáZêÀ$ccB ü™ĵfDel‰ìëRĝDİĠĈëM…"u7ĞÑIŭr°\08P˘îdUT–XJuYT²ĉFùiE$ŬÏ´lvËŭÛĠŻäôˆ–Pĉşq|ߔx6ÁĦġÇpÊÈÇÊßËġ¨òšÌ2dcYÒN ÒPûfb_Iôi$t/Áï‡JxëĈȤl^ĉݵWíóää pË]Ì ?™¨­—+ĈAÀ³èŸû™´l‡ßŬtiħï…çZ| ĜUÇhÉÛ˙ êÎİ*“(S7 ‡éĠêĝXÒ}_]Žİċŝ1ħÀ2µ‰zhBñżR7î=³¤\BĤ4ĈöÜÀ š Ğ‚gm³ŞŜ,Ék}ĥ­äĦ żìQ@̏Pŭ°=0۟Çmxe+yġÚ8€•áé>˘Ġ°ş SĞoñn÷­3U´Ü7²çèÖiŸÓŞĊ·QڝO ?ğ­Ž°O ĜuİÎHÉıĵwҔì²A~EaDžP2ĈŝUr7ħ.í†ĉƒ5͇)­è…Ÿ}"1Ù"QĈ@c^èWŠy>_ż÷ĤyJÄkpëʲ6t8ÊGÜÙë]ŬË4TúşĥĞż y}}“C|>’”SlŭÓûUUž°çŒPgÛ¤pnä¨öÄS|”ŭ§†5ôŒÜ ^ĝÒW<^C,ÎÊ Ze$*1aè;ȵF] ‘šŻĦpwu׳?>í-²ĠŻ2DİÒ³żb0B)~,Ĉ 49|yxždĤGĤÓ?˜ }6MüvßħÏÛŭ‘e:Mßp(†Ż*ŞÚOž>gh­d$m¸ùĞ@ĴñĞèË=lbú³iĊ7P1êäˆKĊhɋœ^êĝxnŠa{X!F]ß´ÎîZv`@^CO­IrâT1xhJ}ÂŞöÜ€n`ĊŒáċíÔ&§³á‘5Ê݈RÙm `Ò7PmAü4XVëxs”BğOŒüb÷òŞI3§µj fĉfkŬœUˆsp߂œÜYĴ25Ĉ~ëñdĥŜZÔġŜ€”ï=F¤ÈĦÓ^xÔÄ‘J“È·ŜÛN ™™Ŝq³^–Dä+áiLL1ĥ Y´…ñğÌ ³  ˘á›ĥ&‡"ƒdâĈûéŞMfLy>=NŠ è¸˜/œUAĝuÇ;ŭ gĞh×=­ê ŜbT ˘);§ĉ-+ĥŞ0€ÀĜr#xŒ£ZÀ—z!@µêĉ(ÓĥşŻşTus°x=QËĦC™pW÷?­n¸Óۃ³Í`†ŭċ£›Bˆ –D+Ċ$½²,İu=­ıĝr×|éŠí|8Auwfé#Q ³ŠkbĊ$İı‰ƒêŸB¤˜Ë>9ÉBE fÍ˙ŻMo1{ ‰ğ'=ËòÁËĦ>ž`aœ×4ààutoèÔÏ_‹oÍA ĞuŞÓáqŞ0£ħ=hRâ;Ĉċèëèqr €Ù8îçÚF›xÔThY¨˙2]íiñ›‡ŝ¸²óŻ÷h „WšUÔ8f…qkK˘ĝjKë= –ñ·ÚG9Ô~U/E+à"E”"U/ XĜPŬXğ­DgžÎ–\X´M<‰NĜ‡Aƒ·ÍL·v…k ñGp ”kTTíè²ìú|áïÎ2mC™”xÂÉ˙gOAH_Ĉ6e…#„‹–ߪ–;­íb+>{wxWhq˜K+ןgŸÎ‹ßĤÖRx<şkÁúê1‚şŜ#!ÜOğ]ŠN.$ =Qeëôùwa9÷rK„›.Fġ ĉ[ÛÏʈÄĝ„Y·NzrjÇçiUÖù([Jît‘ߛ)/U½k~ùŞ*ñ•úİ”È:x.Z%4‰˜‘Î"ŭpJ¸ÊßïŬdɞÑÄKĜĠ„\R‚œ¤î­Cϛ*Êè@áž`”íexĝá:Û!„qä.·ċĜ$šp+èÂÚCÍÛ!T/ԙµ]Ü xĝ°¨‘—ĦŻċı£?ÏT™˙$onĈĜ =ٗio’—¨y#ŻAĈş)nì@ñ#§Âñl[Ñèıy葴xl²ĈJüTSUèżċδÊî¤ÓŠ 5RŒq…,Ԓöù°xÚadyl£nÊZGħoïQo%ĝ~Ùè7x?vš#Ûôíô­"W*n$Ċec;ñ;ßş·}jş>u!Ÿ­¤Ÿşvħ˙Tvĵ³µÈŒmßâúğŭ½Ş~ŜÄ˙7wñ}]~Ŝêżoa·~0Ÿ?ĴÛٌùŭZßVħ€pPÒüuû˜óÑû‹ °öI]ĞÊüİq[9|\'ğóa£!ħ]`‹‘Nü+nĊڙĈ+OmôX“ÄFí’—M÷†ÀLÂn-¨f¤N/o°™4˙ ­|Gò(XӍ·żĤü8?" p{ ŒñuôŒ#VÏÏÙNJ*ë)%ÈÀÔܧ!,ħŞ“>ٕDœżÉù6\Wé4^ކ‹żjOƒÇʵAċwŞ 5d”OqĞ…¤Ž•CXTwàŝîŬhCÀÌùħ›%Ï(wFh5ŒY "Z¨?ÊRÙ`‘$ Ġñ$/eٗى1C9ĈËÉ-ÈıŽâ-$À'ŒÇ)DMRbyŞì>¤ï ĉ¸DĜÈÈ8§öbàŜ(žĴ Ĝ‰Í´&‰¸ÒûÑĉÀECù‘à6C„F.PqŻy&65Ĝ}Úa¤qŽœğÔ1ô*ÙYƒ‰A_rĞ}żù[ۀ˘q@òâI_ٛHħúÇÜéTäۆ“îĝYŒäX`—´‰I_ùÀNÎé½Ğ\.ŭ›ĥ£ržĝ¨~’µ%yİc0Z+jÂ&RĴB§šEµ/.DUûQ›œ‰Ÿ[\Kş™I§i,³ (ÔB‰ò ´C,³-‡ž… “1˘íIÎĴKZü–ċġ T@‹ż‚ŭBuJjÁ¨ÓzĊQL°ïMĞ]YHöJqN:=  îŝ'bYy˘jJk Úz²Ĉc2­ cÇK=ÏdI´5\­1À×Ĝ-ÓOìĥwşa÷tj}ŭ„pG½ŝ(ÓiEr֛•W`ëŒÚh×dÏġ}ÄËìĝôpGר6Ëe´”&>ĥjG‘%.‹lĉQ ÷É'Ĝ8Ïôçžôsà!wB%!‡ŠÂQiyvÌáerI”9ÀP†ÔŜy5ÜòËY— ĥÄê1M~LеÉĞ8ŝ,E>öĠ#nV=“s[÷L`˜żßËŒĥ|zèö“‹¸Ó8yÌêûĈ™UíΑĊ˙.µ9ÚäWż+ôF)ħ?wšG?3˙Y˳µÓÔ³M,Ş3§¸ŞŒ YÂîÈX›ĉϔÀ=,lŬÁfÁÏVSŒÇl”d’A´\1˘ıXö.Ñ’Ïž9÷×dž†áqe‘™žÖj‹WxÌèĴA ŬMĜ—dӘ½£!aE†'|`ËÔdòiéÍ4û2Ië– ĵĉŬ¤ÁL[´ìÌm2֟|ıjG™ _Äì£}‰ĴVÖdњ5Ÿr/·D;B’ŬċŸ|Œ‹œ-‹J́Hž!(‹n“†îá—j<24 ş 8ĤZBÉͨ[• ŬCŞ'?Ò´lòĥYéĴ)|Ïí÷änŻeĵ%¨¤/ğ£UWŭÔgᏙ2üvXċƒÊû|}Z¸ŸÛé;ż‚ì;\­ËÚÑ3ĤçÉÚ¨ĝQĝ{ÒWj P€¨Š°íö@ñͳk ĴŜĉrà0 ‰ĤvgvÛĵÊċ£Ħ9!˜ ŻÉ0c)SY• CˆäíġA‡uǛJכ”úŒˆÔtžˆĞ™ƒáË£ÓCĠ~‡lZùĊ·G-ÜjnKnĠŠ‘[e“`ŜÄ-î‘Bñĥ"6ŭ@—NPwşujôaƒ~„'ĈÉ…‚2p ÀQä]!O1qÈS×zĠ˽#f—ġñŒċ’X™ xf7Qğżc°|š°³:5ÄŝÂĞò;Omŭr$î"öjb+Öġcn Ìùŭı ı/r%ÂQÇëOŭ˙cħ˜;à,á…Ŭw)ÈSP qdȤ Yĵ…!šp“v¨˘ÙÖ[’é—POk× Ìp(]A˘ @„9Ċ„ş/2‡K ÌÜ˙†|)ÊŜá{Ğ"Ŝv o<˘˜g¤ŝkş‚µËuW .ñ“uZ! ÇöÏ´âq˜ŭİnĴèSŸBí¨£×.ùœÖħô? /÷Ğ2U*­ĊO‰¤l™²ÓWĜB‡GÌ›4²ŭÀ|İmĊ! mG!œımË$ ²Ñ%á&uħêĠŒ? m°İÊáŻÑcE†ĝQ]ğ0{F´Q”ĥßÎçsú×nDFmóDrYû>ˆB·Á`X„J^-Î2䀀 U]ÒïYŠô/hS<âÍúɰ|_O·:Eċ.tȂ! ŒĈçnë-{O"¨/Ï7è‘â>О<ÙKÍ:}#M"Lż¸\ò‰kßJ%–Û„şĉ3˘r9oü”2ĞŬµ™ ħOùşL̗ġ@ ½u;cŬĝ]éfv\Ú]ıĦ:ġs%;ñ ~ü7ħŬh…#Jù#/8Ô(Ô^CU˙VQ!Ӕ+~EħĜ ßì¤ċ[RVaVA‹ ·İ“ÉŒ֋zÙéZş×T/ïÄĈ_îêoCwv‹‘€0YñĞKoPšztż=²ıÌšä$×&H0mRġݟŜ i€‹4n1Ù½Ñì/ċ`Óa‰é“ˆ…Ħ”qċ§–‚2GsşÇÇìèÓ:#ġîrŝžğ”Säİôä•ÛÎÄKĥ‡Dıñán=ˇ–<6üZ^ħÙKäsħlµ Ügfô·>À…j|.†GŒÒ–h£Rà‰ÄòN2Ü&\ù]:Ŝˆ@]xhñ}I5ŭA~ÁZÑ;§ ·]´Ïó²ŝÇT:ü)T>+qû+Ĉ;ßċË@ÀáĈÄ'HgÀŬĝûĴ‹j¸ü”yò ğşYÖW6À˙3ƒ&A~e§è½_ŒÛÌL>Š–tÖ$]ög„iE9SÉŞÔšĝċâ‡ßzŜ(* Qœµ‰ôއnZg¤&Fĝ#RJ*ÄWŸ_x?j{­”}ċÀÇ5üÈúj½rîżPޙӑSc¢ĉ,ŭ^?†ü]şĤş2TGTy§íë%llhD‘4°9ƒ²]l4z‚X•ÔJ,YÁ,:¤IH‰ìèİkf‡ï7§väR–|lhìĝîPò2 i·³Kì…ĤÈĉx+sÍ1‡„B•Û='Äl-ßşfïSI!û—Àk ½äqgûä4ñ”t?˜J}m-ë Ÿ|÷6uż7qµv£dr–JôÁ˘÷ĵµ™ĝĦğ˘h@h!ÜHùoáıe„^5 .ġ1nà ˘`K„ú‚é*7³ġUÜĊ‰TRqFSxGyŸ”]]X›6ïù{.Tt ˜ÚĴÔD@~BġMë“Gg\£áŻĝê_köÔnŠ›-ézŜSùïžóy˙5V(M•²Ü °í†Àí ĉ‚ŝÈ{KžrL†K<óËé@lIÀ·“ ˙>"êl7÷踳–[ÚgÉAó8 Öħ­ˆ›ÍáXöÖġëÈJçĴŜnšÈ LŬ­’=ÎâÓS yÏä\$TÙ)ŭ"ĥrz}— úé;½î4ï°×ѸVşlS C96ħv0a9ġ„ż˜ÂÚMŻ)ÄòÈ Àp‘Ĝïµ+KjEQ“ĦĤônÙ7!kÏËÔ]~Pìjìßo RĊXI;˘ÙJ0ÈÒ6½7i5+S“\'͒ş<ü$9Ol^"6kžÎEW9ÒmöŜ´0 ĝoûîŭ^ryz.\mĥÛmĥÛmĥÛmĥ2:Kšók/ˆD²ks`ö˜Iŝ÷e½ÉK‰rŠè{M>Jġ}&*cbö>;àP€Ĵ‘,cpM§ Ĉ yÀğ[ŻŜ)dâDğeÚLJq:EŜ˘É´C²%}e²PͽK‡'èqÔħuâšt¸–İċœ×Q´Ôq¨‚'P°Ç% ÎĝŒeĞ*·ĦŠä„Ü)cHÌîjÏöAżœµî{BŝŜš-ÛWċn&†u|Λ´¸\ÔÄâ÷ÄĵžÙÁ üµh:{·ĉÁŞİ°ëŬÙĈWĴŽRğ6B(ÑŬŸ ŸSÖNU ${Vh‚ÊĵٔÂê zPĠ-·ĈE3@0³‡uŒ>p÷ĈħîD€ĵϘ×وBmxi |Y—)éžĜš–_áóu4Ž´=LÎïCĦLèh)3•Ħ2xñ“ÒŻ)>^Y0:,ŒÓ²Eş µ9“Ĉ­½$TŒÄıӖTÍFi,Ë:6˜ŞÙµ/2k) ™v°Ŭ ³0ŜžêÚHàœd€²áŻqÇÙ!ULШá#Ċ+çÀQLÍŞâCġƒR\¸@şĞŞĤöŸıy&"‡SoŬħˆ Ú-Ä3­=÷ĵ'Xlqq²€-Éġìm ġĊş.Eêì—6eOğ’| ŻóżPÌÎ-ĈÇ O} ƒ'Iß&2–‘AïP{Ùŝ7ıÎ6H‰‘$}ò6ŽÒ`żġ6Kñ‘Ôó½nÚ ³$sózż†Yïè]mQ\ïDÀ*gA ċONk ñóîÏSĊì*÷HĦ|İrˆ†¤GÂ+vö;Gxz1ÍçáĞ ²ĵÜĝGÇŻ@èv Ï5Ĉœöy¨œì>é1MFE f]¨—†Sgf†MC(4àS!’:ƒfeo‡XáÌ>˙C”ÄdÇv ÊÉ÷ĉ\’:·"ù“‡bV qHÔ0ÁĥP~Ò,'UKûXŒÖXV¸[Ş!CĴÛGMj›İ€gxk( Œvez›]5`am\ê!íéŠÉĦéò“”H~Ŝ‹µÛîĠ8ñı˘3*qì*ùŝopc‰rş‡ƒ’Ċ£ÖÙ T=ÀAòÈrÊÈŝ*•ÛµyrGҚ¤o°pêÑq-ÀR(1DEèĠ´'ĵ)ódĈÇêU0ˇ:…Ĉıp#c$ğż‡UV2Ĥ]ġדĴlĤ³žŻkí: D¸9za"otZ°ËçD='ëÖk=›jöÁϙ3ÏŞDl0[ğŠdŞW8ϐÁĊ?ĥ!ÜŸèrżsÀLv˙/½fukŜ‚×A†>Úb‘ƒñĦúúÔ֗ċ_‹™Ş†ŻIqĉEk #› ƒ dä>ó/ü£67)d“ĤŠn†Ò ˘gúĜÜ<@ÌĜvTĊmĥĉtÙË/§+_^ùÛfۂŸŜ–Ò+Ó§ÍĠ¤Ê0Wñäzr‘ö²ġMġ›ö²ŸcŞ­zn\ûEîÀúŽEŸîŒ‘9V™Á˙ î/’ÍcŝĤîÂCï8_{"SMBM È= ĴE° D:4Ü'‰ÙFH.zÍI–PmÖ§‰$³y$ŸöŭïÓ —;šçÙt˘V_ĈAÁS –µĜŽ ?¨gn0ÒNvċÙ§½*ğħ JƒI=xŜñTOè8&n1çÀ­ÙĥLqv3ݽ·=HµÂZ-~çŽ-F YsïÙÚLç ’kFĤôĦrMw¸Ŝ‹Ġ ‚ş–É˙-ï  S×í”qžƒ(]Ħwu4²36:[kB÷•ċ×!Jß>‚ BpYÓ˘‰,‘ŝDé9²ïò2Úˆ¤]èĊéb%á.Gë#fBô˙b~VRĞ˘wb+˜>™šVZş#ë|QX§Ôœ-Âĵ[mÉ\•äL‹ž´L3k!ɐo‚in=ŝħ ”? Ò6UkZ ÍDƒÍ”³"KŭÀd$B‚%ŭ; "dKŞJ°vôÌ£JŭĤ…“bIYOf2 šònşj~ċÌSuGÂĉěħĵĈÚğŠ´G£•aiŝŠĦH·Xş`7y.êûŞoœÄ=2rj„)ˆ09\Š^Ğş€8‹1ùM#ı˙NäèÎd˘ä!62O?fZ*9—W>îñtġÌWç벗ìî£:hBNĉÀ+r£Oƒ““˘İ 1˘3ÂmŒÖoT”íĵĞŞŬ_Ğsı¨ïİIY…÷nnŜ›A Qx|^ádşM™ŸYO˙ctż&˘q{q•­ĵnÔáx§Mkm~0ĜċˆŒÍÀk]&S@…chŭI§{3{Â@á+³9ĞZ †ġj:öÏü ;‡oĝ÷ċ)]ȅ`2(lŝD›ĠŬ 6Ż‹eŬĊƒÑ 7$ Ë5K‹q\-´Œ  1R¸Ê¸˘³ˆ3ŽŬ Wbj ›˙9ˆŭ@ʊFQêÎxñ?[ĞòŬì3ŽDħ M>YP?v‰žóR0BzÀôÚÁm½‘=†Ôí.|q◿ŭ£C!b2Ŭ‘jQPġad0Ġú˙`äÜ{”_ ss›jn8ÇDQ$§\kNÙbŸÏAg€u"ô˘Ótì}€îvİ%ààâ}^b^LeÛ ]CXÉöV(,íŝPiŸ ^u]ߛú7ŻM"Ĵ`÷ŞGşÖL?§ô&ürê‡:R ˆÁĤµĜħÔ-Gm`Ħ %´KĦoï›-Ŝ6÷Q„ħ´Ÿ½’Í(ċ~wŠ€rÄ+cëU(kžŻBĊ2!}!!YĞÖİn_PXW(ˆĵvĞn° >ԞòP’0¤Ştq#$ j˘ˆĤҏ&oE1@S‹÷À-A?d=Çфƒœ?;ÄÏqLB)×È2Ż5è‹8żka€ùtC^­•íû8U+á‹6-µkŸ˙zÛCLt-7•na›šÀ“Dßëˆ4ʕ§Žş-ÔÂ<ĉ›ñn‰gh3˙OZ8ĦFPNWD°˘'FšB Ĝ˘ĠV/]יS—vLzMŸ˙uû2Îë(%YP/Ò`ŭ:|{>ĦîG˙~ğĉs²ħf÷¸ñ:ëœĦE]ìŬ˜Yŝ×#Â}…šœ ;à<ĦÉSĥ ÀĦ÷›8 kY˘b!Ŝœı½am6×g3ċöĥĊȆA™ı³’ùRKŞ‹Gê›Ï8×g^ÖhCħ+QÇ# ]ÄŻvì[µ SŸ ġ5&*÷µÙċ.èÀ/a‡5 ‹‚eE’Çb×áN™"ş_ïñA•âÉŝ¸/44,Ĥé|)î‘]l ş œ]Ú"áßTôéŽ%Wżœ˜!WŒš-„²„W_° Ä3óĉxRëġ’Ü֖JÇòá¨lq z>h#ÙĞï”È›­wktÚVn-!ü­AŒ‰\ruC3ĥ-•ŜÜÙñp^ĥ×?—2ĝĥċu#ÙEŝ‘1ß1 ˜È‡4”-Í_Ġ†ç2è7´â˘5´U”-ŭ²`^˙wÑşo?ëZÍğñĤêDÉ ZİüÀm£zžO­°ı`᲋ëŬl²ÖÁÛ {™úӛUĝgbWD˘j2k‘ykÚ0|<>.×"ßĝï˘ŝċwĞÙ ˜ï!Ëf+DÜ<*?ô+:íáó·ó~hêcµhĦŠ{”~—ç ò~àÈlĝËYËôL݌knÏĤıŬŽÄàiÂjóF‚iÂ(E‘ÄÚ\˜W^Kw~‡˙nûĝPĞ﵈Ÿ˜U€Yn1 É3 \Ìr0¤ùuYrÂş„Jái6b´4e:íÌKè˘jY"?ÔRbtcŭŻğñn@…'P'ñ‰ˆ^8V+$˙j§˘\d‹Éc”OÓŞ¨íf“ž†Ü"*~ùd½ĊÓ÷m‰ŭHèÛĊÔ§†€RŒùóôAëĜšˆ2Ž\êH:Ċ“² éùĴJc…û‘½áâúĵ—ÏĦô^é·i¤öŠx˵M[>e—bbxCŬÁ@‹q:• òE¤‰Ĉû‘ëwŒŞë΂:ĝÍŻ‡. œbġ—Ó“ ‚ JÇÖò‚'^o§öQWoĜʀċÖóŞĝ‡żšğÈéfÛL; ˆäh‘¤aĜëX6Ž|ı‹yr¢ SZ,UVÏìTì†1†dui[öAŞğsÎ‰Ż€áÏ2îàjvsHĜĈ˙‚ï›u=•nĊñ.ŝĥÜ&=…İŬ3ô×oÍ!‡Ĉ) â(ġ+íaM *KWç0 #¨vâWY9 iĝ ÷zç4Ââà¤Täžl2bż÷R(ˆ4ĦÌ|…9dY._ìĦYJRLjÛ0ĝ‚z;Á&ğ#%÷°Ò°â,1c˙7˘˙Ke˜Ġ+trk°†§ ½şfšı(Í-ײïİŸrĤEÉѸ™ALĜĜö pèü15í4G†ş5Ç ;4VßBĉp[q{68|yçäKĞ‹˜îĴĦ r8:~A-Óĥág+Á*G„9B<–.–³ya"u2¤m "‘žµ;–N QÁƒÒ£´)~¸¸PŜÏjï‘K˙ZŜM°ş1WĴ0'$šÉá›vT]ŞSíIA΢[´Ĝ~‘‹Ò]ĦYŽÇ)ğŭŭż$DÒĉèaŒ8ċz½5îaş°FĤhġùĝF0íëËCUɍa,6ŠR>$§hZ$½ KìCáƒû„EÁĵšu‰<ŭËî½8˙{Si\üĞJµ+€´Ĉ1lxaP!ç{šF,7fqë“wħHW²ï}}MéħbCôúƒg âKŠû(ìŠó›ŠZŭPdú9ÂZğ‡3{iQkŜd‘°–~‚½½hyÒÉŭuĉßëÒ³DÔ`ò‡ĊI;ĥ"Üh’hċÏUÁKb Êb’ÔL<Ğ<‘”x¤$Fş˙1ĉ=ĵšQ]ÒÙgBş–ÊÙI_´0ÉÍ×Óg'g=7…L?”a@ƒ‡™v4ÙżŸy a,DËŬêrVŞšž˙Zgá|3òQ¨Ġıñ$DíœM|X^E K$ŽîİF ÀÚoám2ĈKïû“%YÑ˘}:I9npĈżÈ °xżñèk´4Hamm‚*÷½Aĥ”„ŒAîÚ|Ĝ2ı²˜ŒsNċ›3-[”~*àlE[ßÚy9ARî‰!Q_"›&Yù˙"ĵd–_eş ü6 @yiÒùvŸU[ŬZ:8!=Ċ2cµY<²Ğ\‹Ô°2o[avÈX vSòÒhé£ĝQ„5“ğˆ¤ëÁÑ‘ˆş0,?>öPĵ6ÇU&öR1°ĵ‡°ÁâÈ1jW£ŠÑÓú*˄— Çk:AĥĜÉ×0³  Ĉ‚ŝÑìá›I2ı UĜ][ĝÌú`ġ?šİCŜ;Ú~IÌï^߄81é\AûĤOïаŞĠ‰xéV[`ÊHïK~µßEğĵO˙ïêĥdßZ'ÙkÄ=e—ŬnÂaIçÙÉ=qZ"ŝO^Bì&'I‰Oïâ‰F~ŻŬ êÒ̇e|OΗğ![ċ+m!ޏÜj-“ĥDşêљ/ ċĊ*¸L”;JóÄÇë\E òë34Gwö7#1ge\KG½cüd|òk~óƒú>`Ž‘ÀÁñ0tĊ<âB.鳔˙"-HİÁ“^ġ5›!H‹1„Ğî‹RŞDÁŽò ‹€³´;&…‡ç‚°&L$ÖĠ?0˘%]mXĵƒŜçĉĵŭ98ôv6RA+bàRžáÀ2„'ŻG§ò².Çb-ZëѸ’{yĤëıŬÖeñĜ=>dìîUòzŞt}%F1TĈ^FnìPa‰fš+‰˙m7A¸oï6ƒf N.”Qî§ ˘˜"Š)Nĵv¨|ĈĈûjtˆáúş~ŭ]•ŝŽïŸ˜›żoq×ĠÒÇíÛ,'Ïéƒöö%>E3çé€qÓħ…ÊœÄ˘„|Éà‹Š˘2Èüĝ£8Ö'SXÈğî“ÇGŝùĤĤKÒ=ñ;Áp@NT›³ ŝ,öŝ½Œé\˘q2~À~~06ñnĜîÁRzOÔÏŸc\-Ò!ĜŻż‚nCĠ‰~îŽúÎÛ˘ĊÄ vAÊòW‰)%&ÊfĤ8ì‰!v †HLoOQc;> À;`eÉW}İkâèÜX)2Ğı‚´GĠĦ°Ĥ˘6ÙĜŭ·½òĝ30$ҔĈ ÷óŞLE„zr*ċÊc5i7_äĤû³Ôv“ 4÷gİâ³ñŽŒ^ä‰N$X5_´à2ŝá,B^…’c“c—˙)YYB†ÑċÊyÂOo'ĝšIÇÂĵ`~ŸaÄíĊ^¤˘] _¤uH1ÉŻÖÀ ú“Èı &=‰¸÷ €ÓAŭ5–¤ägz4_sôÈáĴ²ó´ÍÌ×HŠtY˙8GÀ_ €ŞAŻÄOafCç"ċ}ÍŽ­î¤/Jmݸër`-€ÑŽÚÌö³Š Zñ#ÎÏĵi×ÊÔŝ‘+Ry4£!·Àôê3+jëAúrBô>Ôï™P=- sáP™c³/6¤x  ċùÚĥn@ożäD*ónrò9$§µKâ§×AYc½ä k$b,e:Z|DÍ·YĦ ğ‹Xqž˜UhéĦ9QġíO„·D4~TA†&zÊóŻE-âH,9¨CŒÉ •ä* żK_ =š£êsG•_9ĝ°SúAÔLââÜĝ֔^ö†8ŽYĦ2cĠ šà}ž_o C e%çñ?žiĊná”C˙+oh[À7î÷™3IÈOBexϜ’Îî ÂŞÑ'/b¨2Y*²Yo2‡Y§K#ŒËtaĊj _L ġöú—şIŜ°+mšžLä”\ׇèµ›I×Ĉü–¸$·ê˙ ŒĜOŻUìƒìĤ‡TYXÜçó.|‚Ğ[â84ĥ ĴO.¤°Lf>_ġ—ËìmK7èO½Ü‹³ÛŞvnŬĊ]}Ĵ0¤ĝĊŬdkp´ĵk%=°â×cĥôĤd=;-ş†)—İcŝ×FM„y(ĠJd\îğ™£ÌU_i fŠğÁˆîżBh=Òìوċ@iÉħC[°9c5ywm|”„"’”DììrĦê{<ŜÁçĝ×8t[ËÜ)"ŬbŸ•O¨ ÖÛyESÁqâ …Ĝm6ĥĤà–Ğ]ħš‡Wiui" e”~9¨áĉ݊âyĦMÊ •„ĞÌĊE:™"Şïò]ŬŽguCĈWàMv ÓĈ-Â$9²`Ìĥ~c&ĥÌĉîâÓÇ$žŒßŸ,¤Ç˜jÀHSKâ[+g„kïñ‚àh!ÄħÙ@ü˙GrIêK:ß,è=_ˆˆsAàJ ,ÈK]Ï2+ż`ŻIzRŜ˃Wüğ™Êâ…jt#EfW¤Ì\Ŭ––yĝNTıTȍ(QßKž‰ß~9Ĝœe˘›o HëÓÔ`&É ż^Ğö g`n6ך˜cË·››ĉbÜ·—DĠ8‹“YzÜ;½uâ^¤@²ƒà—/ÇÎġşo1(â"Ÿ÷—"ñğZ3˙ T1}Àżòˁ³܈Wċ"’#g“²°}ÙZmX:<;ïàÚÒÒğ_Jh–éHĥ=Â\•\sŝŒ†V^teEPŭZ„išB úòá&w·pżĴg×.şg½½#%²Òħú‘ËÁH[ĥŜFbïX“˘żÄÉÖl&ákìTÇÚn¤ÍĥËqgQPÀc˘ÒŸEŬšA·ǤëLĉ‘¸GËğòs#ƒÂl9Xə4޳ (ħ­ĵOġÉßAÎԐn]³·üŻ[UVÎÏàÔöfUB³Ijôûù„Ĵškˆ¤:ċ%ŠZ€ĉl—`9ä'”™âħ.½/Ż$şÎĠŝġöĈVh.=(Ş“ŞâT[ġço î'˙5Öİ/Ĉ|˜‡Ŝ;G* ağN2X5jBŻ£ûÛ%§FV0l:¤J˘mÏĥI\Ü!ž§•rOÚçY-TĜĈÀ—_{£q˜|_-…p+ĵĊğĥµ%ŞŻ•Ĥ³û’ Ğdyˆĉ>Ĵj<ċƒá­V'Ä(ğß=}·)YĝġÎżSk,Qâo´CW÷/ÁŸä>•ÏEĉW××6.ŭñržb?˙#Hğ'Á[’şqg›Ĝ ü ÔÓŭĠĴ;ö´nŞŻžY°ÁZ€óüAw½"˜ÂаfïD$èKjîc“H@ˆ™2cÙR8*ñf”ò u!@ÙgNyÛsó’½ĈŒ×Äq›!Vw=œŻ—˘îÈx(gâß[h÷{vV— ›Ċ˜²"4˜„a­.T…Ġ½µ•aH•óL÷€Ödˆü˙Y)ÈN”áš$ûíC›ĵ}|˘N­Ĝ2Ŭ6m¨2›àÎĥòÁĥÍĦW£lUXĞ2ژñWM[•jhËhĵPY\; ˆİÙƒ!Œá Ùi8~²„=QX½Íqya·ÏĠECvIğ†íoTlëdpäĤñuó§€Z]b6Ħí'L7…ÛèR3D˘ •íċeÔûî=?²éġLŞHĤLJ¤œ7›™$:B‚šL?sQRΟŜ¸g9p>âœ9=› ĴOġЉáZqX˜SNȀĦuŠÙ§Ŝ†‹`V½Â˘@~Öĝ‚n+IġĠôn<‘BRHşB^☳ŭv–W#sŠ݇ĊPaĝÙVo9êv’á´é8½/à׋>ž­'6ŭ/ëQh0ş¤Ú•+U’[Ċ?‘klğ`=ä˜ÍȄ¨5tÜŞRÀTġŸžŭĝjH¤8¤Aü>… ÙX×[#ÇhZıTí‚Q@²{Ò^VÈOö´ ukaëô‰sچ ‘,癈²‰ÏY€ÚNì3q?zcıÉÒc;Ĉ¨£Ŭʍ7u¸Ôа€ĤŜ½NHäDJĈÓís¨MS—ÑEüĵŸ}{EÀÒÊ™@ÀmduÎqĈĥŻaŬz8­N†›É;Ü5ÄiĈ `f·ċ‰°­ğ~$|wcżO"CR†bş ;\ĞĠ8—Íì¸s™Ĝ²“‰‰< |€m|ŜÍğrÇ̧c }h€Â,ŜíP;Ô]€aY²Ùec6“âE Ù/Ħ²·n`ĈŽM+ósı?Sâ n#µµ”Ü%In,á= !W4ŽÇluùäÒ¸ŬيUċ’Sĝ³A7²fò”ˆ#wŸ³›)uż°­ÍwĦl(”tç˙G7E|xìRA_ĉúċĉÊ!è`ĠûĊrŜ½`~ŜÔĠ˘³y1\Ï éš54céÚ·# œ>ŽĈĥbkO‚ĥkYe€>^).]ÈN28iGMÜ÷êb@A\š-Š?;PżVÎġfÒ2Ĵ-$½y—ÚI˙Z½.€Í ­äċĝ/c5vKżêùÎI'7=„ĠĈ’†/Zì:);˙ié½5göúS5Ğî'ĝŸÊ˘töR>é9­ËĊKˆ³]²\…aCl˜‹*pĊ<¤Şİì#or=ġdş’²˘k‰ĜÄÚ΅ääEžôEk`ċw>Ĵĝ‹ ÷Ŝ8ğ]ɋ0òš46IßË8ÏÛi+6 T/ıPħ·˜ òĜ/2XV­Î>e_Dùχ˜Òß(ˆ'RĈeË&rÙğŬ \?ŝó˙-#!Ĵƒ”Ñ7ĞZ>–Ôş/Bƒ-ȟ-9F’’8Ħ¸÷Ki<ÑÚA—H#Xĥż·Í½É~ÄŜ{ÁV‹/h8ŝ”Ĵ¨ì‚u1éQÂğù@N,ıên?ïkxşú#ÖZ|@§{ ÊòѧÈ͔mb“ÁägĈB%ŞŬDB 7ç}Ġ>´t‰yè„xµ³˘b5ŻOŝ…LCíGk îܢRkŻ8œÄ‚ Ò§ŬwèúÁkvżË× ĉĤü‡Ì6hMAu :¸>¸ù­ÜNÀpĈĜ§l ĉšÎ05\wòl+ç´´\˘† Ġû^÷Ĝ¨uŬĠ£`ĤîÒԀ LQûĤˆ¨‡JiBàOó ½’.Ĥ×ĝµÈ½ÍÔ,M1ÊÌaö³MŻönûxŝ˙1ŻŻĉw#fë$j·yUç—ÈBO‰ˆ”PÊĈúÇۘxÇPè’oŠ[Ĝ~Ġ–"Ü"ïbêbÑàT}WûÙ%Ôuͤ r6Ż„á JĞPšçtc$hĝ•ޘĞOÊĊvݍwEš›:UŽz$ÌŝrÌÖá­h<âŽô“EL£É¸‚Ò7Tç5G^ô7w–àĵ5û8Rh(`/k˜aŭÄIÀ}ĞWÛĵJ핉îIöš[§Ĝ½ĴKóe52òÂΓĤu‰MopŜÓu1¨ĦÊŜF•ƒĜ:­Ċ–kÌ3ûœ™…˙ˆ¨§èÉWĥ}½Wwoœ š£ÒàÈVpĥHWçĠÓĤ–Êe†'F7ùXfg2šdĥÏŞnhÛ@‹Íž}áe•À„‡İ e/,W‡wŽŽ.àĦÀ†›\: î<ÌŜུ$ACżÙwĝƒld<³VXú6Ŝ!|ĠŝX (WËĤĦb¸fĜŸ2À)ÀXYRĴŜ ƒ 3–˜ßyŽÑÈŜ  +ÎÙوö[¸§¤_ġíj g G‹_ħ:ĠLA¨ZSu^ïk4b~m6+tùv× ×óíšk^laBï8€ú=̳bd½&Ÿ\ˆaôùÚ<ĊĤTܽĠÎQ£äuÙÉt‰‘Ż7àÀavĜ”·œ}"Uט˘4\›d*ħħrœXWjEVVt;vÌ"Ŭ´nìrĴñ&kRjv},LĝávCìß(c Ê‚àZ³­@(yŬ„~1ƒ/¸=œ‘XV‰Dƒ3=£Ĉ2yTJżİ^Ĝ¨.ïqQ=’vÇîı÷…; ËçĴC‰¨ħè˙nŠ6W[ë mR\J+; ġ+ ‘Ì:§˜Ç•QËÍ_6˙wà<×sR‰1!žJċ™Êˆü|ì]a¨ßúvġ› ħı=°×UäĊÜžÒÍùhеyÊ@E Š9;ĝ}˙Ŭ‰R=Ñyŭñöé´¨öoœÑ™q °* ),/od ĤIšsn* 3y tJj §‚żv*x ⎆&+'Ú ööÛÄós1Ŝv%ƒğŭÖ>08„Òĥdil×xÁĝÎċ˜…قδtٝÒG5hÂÈ}gŽkçġw[Œâ9ï4œİÜR<Ä46{WqË ƒHÏĦ³ 5ô%Œo9ŽrÂ3ó@r§p?=˜…”żß‘Bñòñ"swärŠĞDi£²Gİ2­`ċuĵ%Û‡˘\5ê˘W„WŜ…è)e›½§+½‹,³ BˆO!Ĝmâ¨Ĵj”y•ÛĵÇTı·ġŠcsiĥ$çÎ5j„ÜĜ$Ġj˘­cf°q硫·V3[ŝĈÎSzèâß?ß?0ó˘]Ĝĥİ”z˜†‰.̽&˙‚=@[µ}~ÊtÜî5+É%IÌ›°ì>€#½ŸĈ8Z„'µŞY…ê›…—ó,emSâa‰%cŭá‰ıĦ³ĝX…¤M韛HşùGÔ˙{>IŜ&Şd²AŸ]ÔVGı7@çqµ‚Òô?lD-÷ݘıŒĝˆR˜ú8ıG—ìGĦÎ#è†ÉïÀÚ½™ävuĝÓs xß)óġ˘I·iüC´"Ÿ{1*‡`.KoWSœÌ{ ‘ ŭͧ5:#)›9lë*@aŸI´ÂĤB9’,U‘ÖçùKıÇËşÒߘĞ{[Vż'qPžaKzF¤àŠĜP‡^œŭMˌ‰•v*1“äYŞş×“Ö}wÜJ GŜOĦÌJrĴb ¤ -ô}0—şS ëħ WĊWçĠuƒ·£=ş²´"„cvxôŸÓ„yÊJ~‘ï'áC8ŒjbÑġ ÔòŬ/"H_Pùä +4Ò‘ğ÷Ĝ•wÌ$PhĦ[†´ċFc²Ĉt\İ<2Z‚–N~5‹ò·*•ĉM…Ìèċ O%Xw–Q™(Ù]P]ù{Fżó´ÇÖ%cڙ%Cé9)‰ë/˜·ù˙B/ŭs’‡Ĉr7é.¸ [(÷ŜÍŞŭˆĦÀa=GÍÁ–)ŻaÊNŽĥힵIdŸêŭ^k=‡Ñ<û¨:PߐzŭEx?ÙB ÒPjq%àwχû7„’L3 ŝÈbż,œ8VqĜ9Üy~°7c-GËzN+ìUĵuŜ 5”RÀ.jƒÓBS÷”wxóŠs†2<„UŬ>´˜_%×½s?$h£üQ^*{’S踈cšÚÍğ4ckAÔfċÎ/ċòG5xž2Œ’s)˙,Ğ“Èzm™†>•ġgĊ7Öàĥt}çĝ´-HÜm>0V; Ĥ~ ŸğMÒçÊü 5ħ‘/QĴDĠĤqVáOâġ+,üSÉŝŝàŸSʖ“v£ NĠžaOŻŻ ƒ|[Ó ¸îXfÙm2Ŭ™— É⧙˜ÂUJÒŞŠ·û”â‡˙F€+À™f1G–÷µ·Ħ5ċ†ë|™Ĥ.Ž 0âgÌ ÍŒoLÊ!Êä-²öaÈWbĵ÷MA†gÖò3?˘;†_Ûô ‚)˙9îa‹P Ò2êKµ$nk?Y%}xËÊ@òkD)ñÀrʁ ÔŞ•É0,‚ù„6ö’†éc3 àœ2ŠßÉ^­’eî¤é‡ë×΁É;ĦBxş’jŝ} –M—?ú‹¨!(Ġâ·­X{ı§lGÚ´É ŝŽ­ ¸mîϞÂR!OÜˎԅ:¨í6îVx°ĦH˘fi =ĠĴ”Ö~jLhžYögŭzğWo°ëŬŭħqĦPa é}ağÖoŝz=ù)Š ß{_DıwûĞ/ÉQCÓ-&ò"-H%’ŝ~ÉYĈÓ%Á¤ê‹ì%6éwĜ·w%ïĞ”÷şï]ßÇcDì#jÙ­Ž^’d‹ğ U!WêÉĝ8ċގóçoŽ5‰œµİ`ÁŽòbĴEV|ˆçA¸½`·µ T,ßıžßEÊf-1ˆƒ3€ù:Ħ˘Ĥ1Ù~r›ĉaj4â5ċç+,9ħ­?¤vP)*šÁz0SÉ,Óqv(QċÊ4u‚3.Yœ•ĉ]N•I;°7­”gê M|GÍĜNj|tbËÊe@/zWÙvdŠü͍•…2XüİP"ì×ÔvNˊt)Ħ=Ö"â€cMfżrš ”DoĈ(”ï€h@ÉÔځ"ËÖĉâġzĵ%Éú’X@];JÒ]šgŝ‚(hzkt'âP;O¤3‹'â ùï™EY_X坏mZS7ž˘k§IëLà|ĉPô9 I³d'ÑwW²½§Ĥ6ÈsŽÊÂ$Žż{Ĥ@‰{Š $"#™‹MGÈMFïʘYM0„•üĝ jŠK}Ĵ ëìä ĥ|dJD‘ŽÄrħ2Œ=&EJ·egbtÊtúg÷ĥĦr7í]~អÄr.¸Yεş‹áŭŽ“|&5d=ş|(‚‰V‡o˜ ġ*b4ßçZ&Q.­ĉÀ´‡ŒitΆ„ í^ŬKLĜEcĝˆž ß/"Ż‰Ï„ˆ1\ħr4ŭ<ĉñŽmS§fĦÇH&F³ŭ bvÉ ˙fßQš8Ĝ„¸_2ïÎ+ó‡Ytñöj Ǣœòĉ‹&ìé•-^lÓ ÈÇG/M÷ÓÙSµ¨ë͐§˙ğŬì½Îˆß=kä¤ħ} ~ 0¤&mL½ĈH+Qzî’kŠ5Ĝ%îsÎ8ĉ÷˙(fŠùg~³ˆˆ0<ÓNa{µCSfìo'jDO°úŠïëW‘rÁn_ñ¸(ÈħŝÂ*Wk™d‹ÍĴ/Ú`Pm§@cg2iàĝ3KÎfW=Eîc‹™ö§~ÛOöĴ~×ĵ~ÔoÛa_Q˙v¤á}Bĥ”Ÿ9Yó’o¤˙&e3Î3G>N„DĊ\bÚ¤ôV?#oN•ežÏôò§˙Aš'%`˜ŭ}†ğX’ƒ×T|RIÎùÁpÛú2ĝb^ ˆNI e!xí µt ŭ+9\yÊÎWr¸ó•Çœ<ċqç+4eĊ#÷ rBżŝĥ’˘ĥ! üQ -v—Ž\xĦì§Ùd¨Hİż™úγĝFĞkÍ,…a*@pŜŒlOúşŽ xB'>qÚ gF›ÑG-\íŒŜÜ\Ï˘wëÏóñ³sŻ”.rÀvN(F“ ÄğX’3ÖYglċÈñüƒH€’XwĊj}ÂxÉ:5G&è('x2ysrón}ÖŬ”C”fŽ0‡Ĵö2"ßì“.ï“ÑôŠ ÜñOWÜûZ/­Œ^´d¤1µg}ëßjÎû×Ġ£¨§Àqmğà}´Ë%.Ŭ-ÒŬ+üû;AŸ÷>°İ˙xúác—ûHKRŒ+@„ƒğžAÖÀëożˆ—:ù„)ÎÎ5ë”8 Tŭ?韌żäg÷°ÔX=|iÖw÷‡PZ ğÛiÂBIVۚ F ŜCy3]>óE4É;–,Sâ#ôápáFáŒ9¸Òm8@ ƒ§?ò³¨lġmâ“éùäw+G–òé+˙[]NĦÔ |Ĵ[ĤĞ”C —èÈ} Ù*tş#ïsí+¸ığ 0?Lßf2 }›Ÿ4p§‚1CY\½~4½OZŻüÎĊ"œûn:ƒ‚g m4`˙>ġ¤Ìǝ/ß7ËôZÑǢòÇ:Ë Ĥ­‹‘£ÈÛÉAnı†Fµ4Uż?wĜşrFtž½… I÷9Ö–3ôÎWcȍvtÚòíĈ[ş÷°Ì˙j—†-šBȈ@˙Ùic09~_ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2c˙O˙Q2˙R ˙\ PXX`XX`XX`XXXPPX˙dKakadu-v5.2.1˙ }r˙“ÏÂíPç(‰{?1pê(ïëŽA(fĤ•vä·tñĵKÎ|  _üP˙‹Ü4Cß˙)–)záï´8/9£iߕ7ÀŝlĜßÇx£çĵZ0ĉ'm,v>îç8#+ ş"úŸ'ÖTërgD˙Xëè]QĵUìÖ3•ŸïàCF˘Hĉ/UıŠPÎ`S+‰àa˘€È-ĊPpğ˙[‡*qÔF†kĊŒ‘ rÍnı¤ĉe½UÈ~C¤:uë†Á[„dñhĞbz3#•äŜ`KÇö(ŽÎÀĤ.Ĉ1—Í(bU ”½MFÏÂÄ @Nž~lÇw|úHސñgşcpì)T´­Eċ2ç5&Ó×é`yj(İÎ$&[ü¤ô†Ÿ@çĥ,Cñ;´IQhĤ¸QAëZm4ŭÓ×ĝċİ üö‘@ Ğgê÷˜9Ĝc†­K|rċn´QŒtžm„–Šáıéw„·ĉxэUê´í¤²ÓĵCĠkJK1ĴíéhY6Î –VlĴ.÷ĴY²Ŝ5Lôż/IѨ„`ÜZûûHlĜÑÏÂĤ ½žP;ħĴmM> k;ad{S9żòvâ"͢ÇQŝÉj/žáBé™l°Ŝٕêŭk!ÊÒw!ċ8zŻäG&-— oÔS蕌ïc; ŞĤÍ%}ĜÉ{ Ġ'óÚµŞûg£óÊLı!ɕtϋ)QʝÑm§d¸Ò."œ‘ EhĠY•ÎtOMc'_\ş Ìċ‰Éş8óXRĠ`ğÉ7Ͻ`ßZĝŭ FQ/Ġ0Ĝ!MÖ"~*yĜÇ=‹á×vÌ DpÙC¸ê½T5Ŝ‚XàžµÍÚed \]Šf5ωHEr 0ž~‡ —Â7ßN„òħcŠ‹$:×\4‘Ĥ; ’–ÜÖĉ­Ŭ6-ĊħgÖW·\UĦì&­‹p#N·5G'E:·hxİ›nÂĤW”é~‘`vqbKĝ2ábġú8áĦ\YÇŸ‰ħ‚§WÜñ“ÒJwİí¨§áĝQà ›~…ß9¸Ç#Wx·$*Kħ˘ĥ)օW#‹KVĊ£qÏÈ@ÀzH˙(ĝ é îıžš#Z&µ6ŜŸìEr”Î8´!ĉâg`–ŞëB°!™  Jĉ=5PÔ8!½P$Y5Äv1(p遍מú5+!×°kËĜ4#Ö”~D'No†`Ôèƒx†ÁÑ-ž-§Ĝ`’gp ,—)+ 7‰Kq¨6¨LìĥĞ(Cs•z•rƒŭ^‹+ĝĦgŠyħs_ ç"°ĉ~ZŜ†&² F@Ñ&ċ*Š>^_ë›ABGÖ’żî*Jŝóş"8+p—·NV‚7P!ê`żò6ĴĴœĝî%GèóĊ‹ij‘Â6L3FOTUkR–%DíÄ^è=ß60ieûƒìlhyV NÑ86cÜV`|o”ğ Ŭ{i·Œ|ˆš_Ĝ`‰7ÓUÈŜgjhhŝh‰2ÍÙ8,È ġ%íĠ³½gTbtŽaê\ﳂ~™ĵKfz8‡şRg¤{Ġġm[K!òQ/ǃ‡ĝL/ÀA”—.F\ŞH°ßö:Q‘ü’-c>kƒ)YÎu@qšH´Dx½ñ:YÒßÍ{}&Nl[<N˘7n>2rÓıŻá—ߌ+Ż$kÏ0аĝ3ħ &e?‰ĴNÓİmâ\*àWĞӎ8eCȇŝ6eŻXڗ"{ŭï;à_&Ċ–ÉW…ÍCÏu[ çŬ‹ıÂî΁ATߐÉ`óĊŬŜ&+í˘#˘Ħĝ>ä İïĦ5ZŬTmĦsmƒY[òÈ5ñ&˘cMnFé_šIYOKĥ‚Ñc l+˘ œŭœ×)Çê.Mħ’¸#y[”ùKa-u˘öÇ.Ĥ Hh’=ëYĝäìÁ:ĝ9ÑêaU£ñ÷a]xŭ23Ìİ|?Ĝˆ¤r"|ùÇ,Àù6܂żî9S™Á}–“26ı†Ì ô\ŠıòX’lĉħ‚ϸJşNË÷Ê•"4‹)‘N‰ ïM†s¸ÓâHsE³ĵĝxĝğ³@ı`ël =‘öK:i³ÜĞ,ĈPD†îB:D ž: îCšĥ*Œúš€{;ϸp V?mé2`0xœİm\éCގDÂşéŻ* B[ZQ~$…i~l²Ëż'0ŭÎÚ¸Ö³9ˆùTìŸŞ§ìàI“÷+r£}QoWŽ"|#ÏKŽ6Ê1‰qׅĠ 9ŞËEzÖġF#A4?o/[ÀaïT#5ê|˘é$úïñ7K ħ˜|M²z7Œ Ġ^Ä^onkĦïµ|H³Îˆżbf¸\ïz ˘KJXÌâú —ĝ/™bEġH ph4M†A8ĵä*Ú$γˆlÜ:ƒ4~:—ħxR[ Ĵ%ĴL$Nĥğp¸s–;*o)ŝ·Pµ?ôà‹†iUQ’{(Ì6fN¨ê÷Ÿˆ|>ĴèÑi4³0ċĊQ 8šÂ=ÛùPÜĈD@CÁ·b$ÙeMı òa––w:@°¸WùĉŒ‹°(|î(„¨Tuë\¨DĊûÎîÄLBŬ›#…Ş`‡á̌aU”wiÁ4Ër¤ŝúˆÑKy&‘³-ÒŞŒOħÀêä´éh™ŬÑJb`ŭŽ…p+ ğÀŜ$*O_Ì778$0Ò˘Qo‚°éMPÌTÜ"w2‡TÈ!c#Ùp%pk&AçÓúĴ$]\n‹sÜNÇUŸ̙tŒĝz1ĵJ™úW×ÉÉô<5²/taᅠ[S^ Qa\²ì ¨ž8lħ÷¨*AStáĉBż+ïҚ€9Í<ĉĜéa]Ñ?ÊŜ`ѵĉğRpu´rsĚ\I’‚gdò82€7yèċ#Ÿ’·ïìao Ğİ›0‹UžÖ\‘߆žĊˆL’%ŸÌĊ¤c6 v0Ǟt#ûÉ{Ñ]ïë“À%ì/†CÌt9ŽċĥCĠ=x"Ìox=ˆÓÌLpôtĵ5ë owuíëċWíDA…@ǸrwĠ^ŞZÈQ;˙nCƒ_×ĴúüdáRµRħ²L0Vğt ÚŻ.Û ˆáħšâ’’ 3ï˙.[1f×û3pÊÇÒ džġ+÷1[䰍ĴEä­Ù4`ö×ܽè"2 ımžAz0Ù³[‹Ż×2 ­h‰TžĝQÉ+˜*ìÍjÚ ĵ9”~óÁòµÄş…S$µâ4T*&À1<2 ÒHq]Ú¸Oì`EĜ‘ì̊ Ħ1Ĝ7Q%³ˆÖÚĞ…ŭWIM4, ԙ‰=ŜFüo·†fj³ŝ#Ââ”É^”FyA„ŬöëïÎ'kc¤a_Ŝ^¤ùĈeiâX›Rž{Ĵ38Û6Ċ]’ЧğM~aı Œ èĊîúìgÓXks!́C$C/Ĵ$<ğÔìz‰Ôk§ĈéÇÖš‚í2Ŝħ7g9JŻjĴù“‹Ĵ·S€2ʊ䌤И6]íÜü6ކı€%äñ„qU uïÏnÜ ÖĥV´Bw\—£Â„ÊšÛXIí|zŞüâZ˘DTĞĵàİUœ, ɊÏÑ˘n·eµWU‘ÌĥšĠ azόêLż^Íl¨~ïÁܝ Ü3‡Z :†hqCĠyĵ ‹9@­uu>¸yeFI3"aĵËi*:X“p[Ç<‘ò$ŜŠç²Ĵܵ <?§—û£ùx ó×µZÍdípÖ^·Èĉ4Ê-§&Îŝé²Gè°@PèĈ”ƒD.9‚f½o΂–jU]™í0ˆÊ·ĞrRžˆ÷†Sâ;ô&ˆ÷ÛĤaY·ÖÛ£lÎ<4(ç„Z“ğ%b]@ĵoœŻHŸ3‘Éùö˙l£G ?ŞMĤ‘g5:LĉüfŞÎÉ…‡Áq>ĠpsŞsÎGċ\ĊÖdÙáŬ6öO!\M$(áhê…Û:ÓÜn!á{ÖyóË4‰L2† JNŬŸûšŻĈçċԛòcͳ¨]> ÷œOH˜Ŝŭì;½Ŝ!ƒş³{·ôu^¸2ğ6ñĈġöŽ” ûĈËY ġRkqJî%îJċv ™„ÏġüœŒ·NÊhȖól/Ia˘ 0ż‰SĄzŜĴ ÒP¤ÄfGĜuê‡G4xi TXYêı ÑìŞÒÔj! ŬOs5Âĉ ƒT"‘Ó\eÉ´’dŭÚ|’&/f&tÑġYöŞı~µ0\kğġÏd‚nG˜dÒ2\äGzĤG)Ċ‘I>eÒĝ1W˙2Lj•KÓÓSĜDY;À ´g ‚pêƒäV(Àûžœâр*v­ùŞ[}Aŭ[ÌEÒ]Bà&#²Òġ…ĠÏ£œĠċƒL]`ËɧĦ&!DzĝX˜ÁFëžvd’.nËyÁˆÖ¸ RĴé™6•E–oĴ5EëJ̳5'²a4MNd$·•_}eœè ÄŽÊ- ;úİ˘­çÛrö \"Ħ F˘ ô*@Ĉ\S_)ŽŝcÄc ÌR³×`J‚EíitŒ÷CÏÔ;B[Áŝkjқq=ÉġɁ³Ġ›™¤ĥ‘7˙>ĵ€ É|¨Ŭv.VWUäJR 9ŽĜœEx" ‡-v/ÓoMÈ'äËÁ†ş)Ê>}ÂhŸtòb˘ŝPÉXŽ"ĦĜŝÜï‰é1M•‹èÓIĜ˗žèİ >E,àÈÌĞru³)/ë÷b´:aà×ĜÒ+ÚŞé+÷~„JÂѓÌKU‹GKÁ<+GL-Yô̊¨k>ƒá¸XoËà-áômşġJˆ%îÚa‹ Ċ…ôBÀ>Ŝ_ê_8ن>t²bsTs\ȌĦ-ÂksúC+%@¨”(l3^MRûiÒ x˜hĉVŜ•@ĊĥWˆ ÛCÊ*GàĵĠ|ċtÄO ¤Ë‘Ç „ÀB›ĞĠôö|ş 1Ÿĵ„ìyÀË@!É KF—B)MUt‰ŠÖXĈ/ĞÛç¨ú6=6ĊĠ¤xÂA1rW÷·jĠ ²"‹0À€9R ›ú%g/°¸µq‘ĉ6zV2yw;~Úbġš@ ĠM =yl”盽A"öíֈ}şßO€%:ˌĊŸM£k`wâ*J*wȂ‚w‚òjJx&Â0i¨çĠ³ı,*–T•›Ú1“ĝN=ê:ĦĴÑ İ´cÓv‰lôëiß^²ÌlŽ z$äjşLO­Ca•Sk5‚ÚġiDX`’üċjÇŞÖ}Nċ46î3euh˘Ŝ³àûӕžä›œğBùÜaŽŻŬ×6Œ·2a]îñ0£Fçc@ɖÛwˎ\U”ö[C0Ò-ĝA‹ÈѸıô€.§RTÀuXèùĉ´iÊY#ú„7bĥ^ôm1ĉÖl&C_FŭK',“˜w,d ‹½Qì<–r%ú‹P< á,‚wċĊÖŭ$Ŝğt‰½Ĵ0¤,- ï>˘ K…\WäUX£?פ/{q.a„üÌŽÖ˘äÊQ͸îšpÈe_JAôDè•ÁR’öXB ô$Ôğġµmż|Ûu:ÌáHjU‰pĜè­ áè˙môÀÖúġ}EP{™ÍëıH”ò|h13Ôw#ú˜àx];Ĝş`ŝŬ€ŭ>™{&yŝ<ĝ˘µw:T\.PŽMıféċaAĝèXQĥ_3Ñ<³ŭż6’=Íû3€7À"Ÿ–Żú§€Q/8ż/XePµIWWN0Ĵ‰Nğ?K4jNš‡o$ŠòŞœ†™£µŒ“òr™˘iÛŒdeJq´0³‹ gêÊä”N•|R5Ñ“òTÁ–”Í)¨ 1Èr^SbĴÂĊNÒGŭ^˙"Û=#„ANÖg(úA동É` {ŭ%˘ĵë)—×EErĉ !ÉO”b´˜ñĵ²ˆ#ƒĝ+Q3şP"_´xċ@†'&êvŻwĥŒ@çÇ7˵ ¤×úËtڇ·ÖŻ‹Â9ŭż;íYOßú+£.à„ßñwjŒ7‚@>:ş ³VÔÀ,³żï?û…ż§\·Ü 2ËĦĠ—€èĦÉ#=P˘U Ç"ŒÑxXS ì/ Zħbn´^ĵ›uç(Uœg/żĵŝ%+ƒò| ĥġcu²Ŝh[ŞUq’Ëzù_6à]Ñáé´½Ê²ƒ=]Ôsq׉ò¨]¤·ÌxY‡˜Ö ò^‰Ŭ<â8ÊN:ż³5úÛµp8=ċï2€Ó^ײĊ'§˘ÂKüĤ2_ëĤ§ğ÷_¨ŝ9 ‰2µÎ–R·‹ƒ÷ˆ(v1ĊË+2ĵ_+pD £›ĜHËJ2ğwnÚüQAÍù˙IbÈHlqސÒA4r’½ĴPÊŝ_w]7o+q*t4Ι–N´úŭ£Vµ²’îoewĉ‰üÍO½êUŻ­!2Ħöĉ]Ùp!¨ï³?ozsÛ6¸ÁWuIÇàġƒD?pÂĥûqÀùÁé…wî /vZ’Ŝ{Ÿ&>@ñ7)WTaú„‡5€ü+W KÀݜ“Gúáp’Üùà.üÄò›X“£··µ0À)@ŭò€-x1Ċ)}ĥ ÷]dUi†“‹Œy" 7ħoÀöĤ†ĝ4´K‘]\'[ëiáÄs² ÄWhOĝßT˙"ìħ-=ŠWúf·CŭâëñÙ³ĥ[ĵĤçħùĥQÏN'Ĝq‚0Uxàâ*H`)ƒ9·,´ ÂCfż^ÊżßĦQ޸9[02Èû—ClijO°Ž‚†Ôğ &Şĵw`´oèQ  |ż,oȵY‹Ö &-™Ż­·/߉¸a¨`Şä*Hs†˙ChsV4Ĥö]ŝ%҄ÏÏÒ~~Žü;ĝíKVrPò;a~Hı ™!İ_n$èg`tşEju÷ĈĤ)fĝwDÀ‰œ–ÛüN\˙~—ɝé%>րċüöR7M›q\2‚mò.kä6|ż†ĠŜÙË9sìöÊ2´àLpA3xPBinD%eeœü½fb"üşÁü ʌ ídEióv)ÚíXMÂ~0AŽƒ·Ŭ鋸żiħß_’t +ÊDŒO&À!àż½of²ì„4~=%I!ZOíĜŭĈöoYiJĥ…4ĵAÁùY%½Ĵ%Ş%Ó9^O Gĵ'0#žAö’Ŝ$NñnLËTŜŝĵ•ġhj-0áž@΍ġVòu]’İ oGGÓô Żà ñž$£ûğ)xrÓWQéè`ôñ0î^İìR+ 'irËèħ†zÍTàHšÚ˲6ħÂËĤ°<ù§Ñċ7#„ RËÌĴğ˘£Zì—~€ĞW½hšyĥğîQ Jaˆ¸€_Ħx Ñe"[p“XŽw~ĊíĜ l\îN…_ƒ•‹ 7[tĤĥ,F•Pe˙uˆeúúĞc€_ìší ?ZËŭvGœ|áÁÊeÚDšVLᗲ‰/™]ÄĉgÛ~V[‹‰ĜLÖ˙9ĵŝ~öşñ-|xëµĊ#ĴŒĦ£Ş U’ wÄoĥéêÒ·Fħü½†×Ĥ4C {‹Êî˜÷·â”w§ŭÌ",îË,ÒNOü[¨êLï˘A<¸Ĵk5Ŭ(Ĥ·OğĞé·˘ZaÍ;Ż’ öBŒĵZéú€eîç+ĝ{‰ë†êY20–>NG5UK• ‰™(I1:oê6h:ŞĞ` ra:ց#É<Ĵ`Úî[ëĤ·€'”ĉž¨oo[WÚĉWí NÒC,d! ÷€;[E™>Wͽ·f&š9ĉTG?ÖN0ĵ9ó@ÊI 'ː?şLApîŞ<ÍoM^‰×!OĥhÛs7{Îa¤)†.ĥb×Byä2ríĤġġì5wîCW”Ò §Lwí{OŬf“k0]C˜-u§ƒ'{ú0}ûbĦQöî›IËġkzŜB‰Ĵ€¤YšËt°ìe ÷s 9İ’óB'ZËCG‚wĵ˜kNÚ*èw‘ÒD0Ôĝ˜äĉè ‰“µ•° µÒÇaŬpY ñ\lh™´Şäú.RsUnjl€şÙĜà‹$lcBġ rµKnŻsߜĊä\­UŜÍ$Ǹ°¸Páĥ°ħÂ3"%éÜı Šz FZòFƒKîVĊ†|GQŠPŭ|ŻlSì]êÀ„Nŭä˙2ÏiÍnŜFÀLŻÈ1cîċTL€ñì‹ÀÂf‡ġŸiYWyíez!şÂpO8l?ÙM ~²Á9ʄ’dYcç÷Û4eêŻP$ĤkµˆuŭAQ j ż §ç!İ”ú5y‘¤P³98–@FDĠÒN:y uĝ”ŻE˙™ =š+y(„œ¤ô;;‰6%[O'n°½;û‚³B'â.#OŝÔñRµ™ž¨ ñ—öĝkAbüĜö(NBYÎ 1ċâFseéiE…Ù´aÎu 0_H@jĦħ { ˜ŭŬ“‰ÉéİΞÙŬÉd ĉ}ZîúĉÉ~Ġ$îs+ÈîœÓEwôpĉû`ŞŜ(ç)ÉbšÉÉÙòú—ЏË,/‰ ÷ĉWôVtü"ƒ)ĵq9›DĴ 9§[<ħċŝşAf eÛ鸀‘ÉĊ-Ŝ.)Ŝk˙x}çg>ġ­§"‰ÚÉe_K\Îè:‘×G‚e‡Ċġ ŸÉß Ê—éżX-µ˙dáĊÛC“?ì!™2ŽñïÁá÷4cržJî9ÊĝÉÌİżÓ†úĉc·ç9Š6qú×’Í gf,qÂ'Mâ`ÛêYÑǚ– >63·Ġ.ܚ |²ÚÂħ-+&bïz0ëĝ–‰}„O@/Ĝ•ÊA0ä„ċİuş|r˜F‡‘/×ÌI7ݧœ×–f6½èq‡9ñˆ¤MDùÂĉ£ctôL_ Ċ3!†{){$]­‰ġğ Ş‰~‘N ÜŞH'MàÚ ú…o`Ĝöee†*s‘Ĝ˙Qċ~µĞï -!]7”ĝ/mEQ81Á“pĵË.ÏpŻeT5öÄĊ^[Œ´d뇏ŻíiG]nÎsL~ëı‹fe•Óx,‚4rȔë›@ûXÎZy• {t|™,ž¸Ä˙5ór3´ZŠžäŞ^ËS"póoùÇÌëWӄAúeŸŜ Y ­nߒ Iäá, â³=$iıيm¸oĠ2óĤ×oè/ÀĜéOQwñçšóÙ w¤·*êԐ`Uc·„‡<÷û/äŠRr˙EŒ“KV/H% ]ÀYÉF^,ìŝÇx÷’íW·àÛOëÒ÷öÈLóÓ|ÊZê&(ħ6Ä 5Ĵlżğ'˙‹ŜŻ !‹ lEĞ\d“šÍ4ù§]8ǎˆ0CKÔBÚÎ×Ât`yŝ Ô-âây{˘sYl1äŜ‡ĞâŒ2>k6c)Èè̳*ˆ¸9Tżz›ìxğ_чœ• öĵÒàğ#ŬÁ3şÀİŠÒéŝħ,˙_ E,£H½Ö™°ĥ1Ŝ~Ëñĥœ/³Ż´„ıĵÁ"—Ĝ½x;pĞÛ>+èN„ÍUZċf!‹ít§ŭm`‹NĊ²ĵsï²ï·H‚ít•o]m‘†MP¸µKƒ•ôlĠ+kHaU”Ÿĝ3ĉË+}Vî/Aê5ĥ‘wİ?k˙'Ÿu5çJÛܙŻxĞò4ONÁä/56,ED/ȓŸÎ Wy—:úŸaó‘~GI*Ñ?Ž–ÉĞׁ.!Ìeĝ7ħÒ§nFĜĉéS`‚Yƒ˘ċVF,*½ç1ü î"mm‘ÜíÇe>w‰ŸŸ ĥ”A…Pà¨Ö†P‚ÂM>—6àfy\Ġ´~ġà:üe?(á+8„5ôġœ.ÖPŠá .<›û‡ $gšŭŜƒ_5U@¨˜‹.€âoH q ‰;ıdefärĠVá-[Ñ-ÜĥŽ*yzó\âj,Í]yé1ˆŭwL˗Z°’ËÇçı7ùg-Ĝ¤d8lî6—΋İĤl²ŠŽˆˆK;iÂŞĈ†Mší[avWaĉċ°ŬŸ(SÍ7ßRçó†ëĉAËÈSB‡é}KúżQĵj^4ħĝ^'Ĥg“qŒ_Óĉğ‰ËۇŞvU[ú̞P"^nŞ’n&(¸‚¨kî^ĉ­ŭġ âdÓAÜä×=Öá LúĈİ0OĴ?k80Ìkğê[¨WQĥ"?ğùKäÖÂ3T'½šúŸq>s¨]üzwkcqe6ÌÉí—Y\͂Mèd—””ûóNUhVÛùUż=d›Ġ=“ÔoE²ßòVğ¨˙ ) „ÚR0JÁÔ<ߑh ĴHċƒBë²ôĤĤ] Wx ûYˆĞŻŜ‹_7!Ĝ!ĥX`HÑèو ŝ‡óÇSÛNÓı¨ˆû4ü6qôĴÙn†°˘ T˜‡{ŝrœ…Èw0%­;roŒ§ôŸ8Ô8³'Iêàŝñ&?×p:ĈÜżĦÀĝìSôYÇ}X°Äêç?ÒÈ dİĥÌĦE/M/Ë2óXfaX$•Ó½JĦzŒy€)üŒıŸ,)_$͈)ĦAÁ%Í;uĈô‡‘‹~Ú…“U·#ĴV²ÚÑ"{4:ĉŸu…LxnŜÍjc ÂŞNƒ2ɝû_ÔİKI81 4ĝDBG)FßêVŞĴœÀè“ÖΕ·0ğ ƒ!‹jRŠuĥò{KíîËĥ²1^Ĥ ÷>’àQuPZ!n K&\h*͕—ŽŒ òbí]uXŜ$dH'ĉ] vƒ(Ş`)’ÍvLîÚáŽXĈWèĉ9X!żi,İ ‘o€ucVE×êçöžuËzU—ïóɎs@îkâ‚' âH ßğá9‡ĝïÉÏcŬe2 iAYĝ-XjÔwF³›şUݐŸĦvĈ=^sb†ĦŠ´—7Ġñr%SàßĴ›$ߚM²s“;DĠŽ{³ġväSd~êD?oSĥżßòĤuÔ¨³ä´ŭ}'SPŭMÚXš°˙'œŒ úY“5AE‡–µÈïl¤X$ œ­~ š1p`*#ĊŠÑ#„-ĦÑĴWŽÉÀ°×€Bƒ˙P³Maĉiy’·ñÈ Çáè͇Ħü?ôÀñ@ç6ƒıòÓ.…jü“òKİh¸˙â&‚İíQFÁ†Ğ˜™)iüÎ9x-$èSĤıtîvT+@ĝ‘ê:ĉaŬ9ƒL ïÊe2ġ6I7ävƒ³ĥàèÏU*2ÜÓZ€¨lxwQ8D‰´:.KD +°#´ç(jĝH•,0‰dĥ2u¤\hä“PpwßafKîïoÔqğpM´ŭ5µĥ˙&Š™Lœ0g'³oaCG£œ!ĉAï'Ŝzŝ‡Zm$iÚ púêĈ>^ö¨ËŞŭ Tġl< )S_àĤZÙùF€wÈMP‰aÏÚЧβ;…äüËÜ&òċöe*y¤+ ,è2G4Ğc0ż ü°Ĥe˜ÍF'ı^ġ.Mîf îŜ>4ÎÖx ƒ$­a*†@§è™Rh · ëM5g%š;ĠÌĥ…Y ˆÖ#öUoġÊö$ÉàÁżĦ r\Ît?KùhŜFéQɂ3W&Ĥı9ŭVÏ˘Ş•ë~ìFŜğŜ{ĉ`ı>ˆè){Úut·zl-‚@ĥ AŒ°”’ş ˜2kòcÊ]êßה|Şó‹mçì*uä à‡)h„Ç€FĵßM@vC!ż´ 'ùÉ;=(˙BMXœˆKÒµ=éˆġèğ%sK§”I¤ˆĤ2}p£ğ^*Ф1Œ‚dˆe.§>M`§D³7˜Ó‹Ç@a’ĦOĞ˘.,×Á›ç޲a4%!]Ir‰²ŬJĜöÍ&œXûŝ˜nĉ½ÀŝE>˙mșòkOhoħ;}k‘P{àËg¤á €âÔ6Ñ'…˙MğvÌĜ ÇmF({4”Š75ú"_ŭ³íTòrƒÜġóì]\3G4ßÈŞ.êK̜˜ò‹d1/£×£I4´—pTċ êŞ_+AÀMİšBˆßO„.£ŝİÀ(ĉb’](ì„òF˘ûW–&96Çb"V•ğÉ$—•Ħ! ¤zIĠ>Öµá›w$Ó­¤aż2›Ä¤ñÂß…ìÖ\ÖzĴϘ~Xı ŬžJĥf˜-¸ŝñîstƒtsn4M”?DŞù†Rk‡ŭHŒÖ—ÛáC†ò …ݵ*h"rßçÒÁa™È-Ħ´ %Ëıô@&&"ʉbĜıZŝö-Œ8:_vqĜ7ĵqÍ?š× $9x íżü›ÔU7ïi]Hé Ĉbğgĝ_\‡’ħAc‘ĦrúiÈyŻ@Ġhùİ›M£.ïs͌]îÚü#ŻídılşĞZ‹Gż%fNJ)ò6?ù“ŸjkÎèӀ8mÉÚkçÙµ+f£qĥ|Ôĝ­M\û:×÷÷‚Js7L´Vĉ=Td§°Mµ†?ô=i•›ôó/âĴ2+Ğ,oxJ^”˜!ĴÈyy“¨˘uϖğ­$‹ÓkCğ/PIpûy?“Ö”—†‹Żı.ZĴ“”3ÇŞVµ @:(:oŒäżGœĠñm2Ž™ó£Ĝ|„Ì p#álrJğìQIñfK_f żìY™ıšÂ”›½A·x5Œ˙7[Ju’”á˙Ġeucí†üó£˘‚FğöŒxğĵÙbé#£ßEżTbG4xIà á‡cú´ $ìr„Xˋ&rÔéxQ;ï–TH¤X.¨żĠMÔKׅŒ‚ĉ*èŻ˘Ô!C2}ŽĠ¨êÑOù%?Jvuñ§c›à­‡2.#¨-½Ìh5v^¤ôĜÛÍ•(עˆS"oEiµ~HċËĴQú¤pdjĴ gQâo>·ĝ+ȚL·½ÑY˘{ċ%G‡öĞïŒ"¤$`£ù™>ĥ×èçŠġnżgâ ~ħ.S &úRsv´)uÖ~XÂê”Ċ \ÏôÑĦ‡òx°é Ħĝ;Š›5"3˙;ÀÁ|Ġé˜^ŠŸïbž8dTċMšíŠá<ä?4sš]ˆÜpÌ"[ÁĤµBä×ç SZ ĉíġ7`›IÇlĦôĊ²şÌ@_‘âBÛŬ·ğû·>Îj\—ŸàÀ?1ğKGZ+,ıá ż*Z÷İG$GċìíÂ̙"Tƒ7Z ›ìMJçvˆÎ {ÇŞ TփŜl ŭhëœ8ñn“L‚èĈö.ĝ%s~~Bx’Ġ|%w·ûta_×::µĥĜë?™ĜŜÍĥŜ³ħöÊßz<áħ{{í]Œ%àR‚JMßĦ^ġxm& Üé½Âë½oBŝâ)e“!dT“iO §ż—w­ŒŠ_QÀ¨ë@¤9}hd#ŭħ+Ì­­o½N˜šıĈpÊÍM>ıßì]< Ñ'{/•lı}³CçNXêr€qeÓ_Ô}Ü}BûiB<§“³Ĝ@òÈÁÚŻ×w³pnŞX”j]ñğ3 ëVúÒ|>*Â"(ÖÊÛ{G}ž‰Gż›o KĤŠòTänQ˜BïŸÍĞ™O£ħ× YJ#ÙLŸ(;ÜÏm2swÍôS¨\¨ŬHŻù;-é<)|9Ú܃ĵŒî‹!dÓ-ciœÑŠ-ħ@oúœ"°âR&)¤ Ĝ„ Ċ(‰ò5ħŭ8|IhŞámV²!U Ïzs]"x|Ëßü`|zħ²£Ô’¨D††NTÍ/ÑrRĥä8Şzêa×ħĤŠğĊ%ı;˔ûüĠ‰ArĜL…ċ!/’ŜtŸ Ü5È%ħ§l; Ŭ„É`ë×|=ğ´b?“Ġ;ħ~íî^?ç!ĝv\ÄAÀµÍjLgıíéŒìG€…8 açġÚ·Œ'ıÒ2úT&†b µío²ö? ´ZMrû(Òïı&‰ĵŞ h‘mR+M–jòѧ·¤4żt˜x_C|Y[’×·„0‰ÀzŠĝI˜e²$†¤µ‚xb“ù§Ŭe†·H)ĉ]Ò'Íĵ÷öòTúŠ$“yg$;íTóâ½HwŻ÷Yè$\]ií:ĵ#„pMü<žáö‰Rúä­íOÔŸÛ;ĉ€‰żÜ3Ħd*˘ñJ°Xۊ6ŸhhÖPÀCĝ§+ĵIŬž‰W=ÉĦ(ooƒĜÂur!‹NérDğ×)È…ÒÈİClĥù­0ÁŻ˘JkíÔ9£‹I•ÓŸž);ŸìèĊ9a‰ñÏ;‰aÏĜjğˋB½d-@^´´AòüŝCyÌÏs4§˙#€dsiáÄtFħ TˆŻZĠ2^‘Áħ%VyÎWê2œşïF–ôF¸AÇ˙x;ħğS˙b‰}eDşĵZGĠ†Ĥg²ÏäŽX6Œç*ÂpF2)(àn½Î£@N.£…ì.H­+o7c{³ŭĈŸŠ]ġ‰žÊZFŒP2Ĥ”uĠÊĉÓch Ŝ¤Ŝ˙N !*5ïliËÈGá>uùŻ·^ [ À "ßLeUá{ğo)ĝXÄHŜQZ²XˆœNĦÒ 2ìñ*jAO:áµJ†YşgM’qél’˙\ċÊùñ]/˜p^HXîd”°Ħ‘‚)Ñ‹Í˘“˙L2);(?ĵŝÏzŒ'dkċyÑÜ*û›=Ġ:“wP@Ŭ-ñ„žó—ˆá,Œ½ÄP”9`SjĊ#Ĥ߇•˙Ó!U .²dÊG‘@‰ëjY[¸°öDŸ+Ž."ÌÔvŒ¤C EÇİ1ĞĉüIġş½É¤ÄĜ#z0vˆÁñD =qJvĴSlBçÖIwçi·~ğ'â—2ġj°­7<êĦ W`+y6Ħù/M_E*´z51ínٟìPúfƒïàŝ£’~òÔÄdñ@oş2ÔTİNWƒ’ôúĜĴé9Ÿœ‡µ–÷°úŸ}*˙~âÁ0Ü/ïµh†=yÜAÁ³8Y˜¤Oö’ƒŭ…?;â23éöÌs^0]ÔëòEĞĞ­XÒ­_G|9 9|$n‚n8[}üÔ=š–úô7.iôİĈí„d–q¸3FüeşMm2ڕ ?tÑU|n‹#éM5HƒDq—£w͂q8ŬU%Çŝc¤ì $qí‡JYLK¨R%Ì1e ĉxìğGâ{?y"Ġ÷†‚Uñy!ÁëŠGÀĝâ,’%§a‚K’޸ Y_vÔ%ȵNóbA=‚›š"l@îô„j~4Pġ3E-ĝ<ĥXHġòĠW˜·>g‘ä96ÒımĈò>˜5WÀQħw ÛËĥqy” ĉu€K7ĝ2)r4¤z ›:%˘Ù}¨ÂtżŒn”HİP&ÔžÈL´èÑäĊnägU;à}×L†žÁ!œžç:ܢ ïhqa§–Gòŝo/SÂf³Ädà‘ĴġDówâ3İÌf÷g˙BTp‚€Ášw˘ĉĠ…4éjŝ÷†AD3ċ%3{%@oÏxw]dĉħ,˙·oU§F-oád(„Ċ<1šĈêĉ§zÑgÚÚınHJ,8oèÑú³ŭ9rH—½Êh3`&†_,+0#µ:YÎÊî£XRtÙë=yI”X &/ç$úp™Ë ™ü b7Q­™´_WŠGb–ĊêtĊi¸”jâOĤ p `ĦJċ–e"ñZ'E+X(³ğ§'OÊĈĊ`=Sıe+ı½öŻl6Ùı×÷W ŭéIq_£UnĤ˘ı;ÔG½‹h`”Üè8‡ûı„s.‘4Ï­lÈyñ%u„da’Î>T‹aÑ/•Ĝ$ġ–îÈßá]ùhcQ PìpšZ<ĜÚĤ{ĠN†sbŒ; ċĵƒÚÌϊ˘'ü͐´W:=×ı´ĵĊ×ï;7´ÁŠuĝ1%@–ñ”„…ĉ?lÛĉpG+ۆGYŞŬĠC+)CîĤEœ2ˆí @9oËâÚ58§ù+FAŞ6PòoR hheG:s²jaq‰ü§fĴJgL:7ÏQožĥŭ%(J¤÷€vh°ġE:Ñ`>dâKF‡-îóoö~Ŝ×Ċû# íċ çħcYĉLa|gp> `H iózŻW€ĥîŻTà Î¨ĜGğĠĥSK LóZ’ˆ }²H'HŞzюi¸[„xċÊgħżQ^2#Á7‡ŬÔħ'#.Ižem"ÂzÓ/ÈY£Fóo;êĵ—~Ĉş9 ç܂8è”áĈĥı–ŜŽ*gġAirÀîĊ<%НYY6€ÜîzGy7˘żÜ?ùw9ŭ‘4ÄÉá$K*…‡˘ÖJ?ƒ…ş`f7] BqVt-ĦpSÉ  xoM!Ú:Ŭ§SÂk0áÒQÍĥcWug°ĥÑú+ܝKäs›€Bü1òÛ° cµ}XXћ¤Œ^Ĥ˘ĉñȸsÔ`l^&żÉ ÷ò´Zğ‘z´nĠU=yÛ_ށ³Ä•÷hĞv/È0¸‚żĈOżxpɑ¤½_)Á…Ħżҋ<4âÚÑfҖmmgİif]ĠÇálÇábCaç ğ¨\”Ġ;%ößòZâż6_àĴ²„ĤPÒ+H}ĊëS[@WpÇ}ßOÎmż̟š/yġ ¤-mì/Ê:WîI¸ħZş‰ĜVŝĊÑFĊ ß%mé?ŝCĉñ+Ë`9qzG†ôŸ‰nbĦB¨ t w‹$L…?²JĝÏ{ċ:Ñ$`‹ŭtĵóŭï<À8ìŒÒ\Ìtw…Â?B ·“Jf´÷‰JKCÎkß`˙eo’ûĵw?Ó˨öŝġ Éĉ!­ŜQ›ìy*ĠqeĈ'\rîÒ,E„럕çRŭ(ë<´¸W>xğ~ S”k¤ù‚ŝäŭŭħOĦ vĤD ˙yŽ,Ċ’5n“ĜVNY÷ĠhSôäħV/:ĥy'Ye¤rê3´>cĠ˙b$Ix}ëöŝ]œXNŜGÚûRœ‚ÊÊ{T1ê턃ŒUòK„4êż0yİ=´ĈaG§Ġê½# pâ´ĥ°5ò_áìB´Š€)r2_XġÊ9ÂK€VpÉP:”A}Žġž…^oŝ^Ĉ-Ì Ö4ÑßHëHÖTùx£RŜdO’líù‘=/kYi+Ġ:EœB'ŜCü˸núUrA™„’аô0bċ8a[¸ ßQ1[ ‡ÁŝLZĝwi}½~_on÷Ûиŝßom×Ûمöí/·ŻáĜ$úşÚŸV•öbi Λé§Ë³tħéŻ£ RQzŸÚĴÖPŞċ${H˘í7#zLŽÁR È˙LÒŸ3ÖŞ1ô–2İ÷ôž İóšyx‹ĤM˙ў³€u€Ö‚óž\%ĉ—Q™D‘ğ{.cüÛĤ‹€ç/wt”Ԑ³‹'JÛFä*ٍ‚WĵN³ÍĞʈ=Ġ+y@œĦ,‰EŜ0(ĝ3ú{Ĵê˔N7Ż+j_QrÓefȔQV{Ùşgßë„{–³ĵ“m€cƒ)ßff¤°cÉ-GSrüÖÉŞB ’¤ˆö ÂĠRuĊ7½TfÇ1r%ml‰ó3VûB€ŸI´ë KŻËړBLN–ĜxDĠ ~֏d$ „aéµz€(M´2΁]‘ƒĊ]ÑNCĠżò³ĤUR8˙Q{w‚˜ìö÷oXs­W˘>ĵ/³Ħ•á7LĦï)OfC‘nÉö½âÜß_v°iıµÇ½Ç{éAZ5gZËŝU>·•äOI ıj^]ìY¤;ä(3"<ġŸtpw  Lam9On[ƒn6[1 ò³ž(š İ{‘ĦËöG_& ]§lşíıT”‘ ɓ4Ä}ËÌżZ'Ž@Xeg'†·şĞÏzSb)á?}EôÚÒÙĥvûCç!ûfw_Tn1+İÛCákúġ²ñֈ&+k¤"‘%µ­€ëı>+ŞíRDäÉvƒµVbä1ŒU›´êX"pï‰ĉ˜ú`ôÖÌĉımòšœ²•í~=ßï½ üÎì™7"Ş=˘y~/y–’Ó²çè3žèĈèĴ)êE9sˆj0WU´IÁô€âEgìĊ`žô—ÙjM.;Ü16ŽüÎ/8IùĠ?s•:Ĝ5“è%mc"ŝ42¸Ĝë!Ż, gÇı|R\‚qÜbÎâä°OŞ!Œħ•ĥâD¤WÁÚY’P°Ëj(˙wĈŒó½wÉrÄ-†Î’–fb²GĠñĜŜB‹ĥže5éîTqħÎy °ü›Ġ#„ÉHí?}ӘRžs=%}!$Ëñs|°6(œžĊ³ênÖÊUݧŻÙŻD ê—aĊ>%ħa„ҝ{ÏyX‡gĈÓaÌ-işŻÑîۊ"u™3‚ƒ@Ÿ}NcGsĴ™ƒ Q}ÜĵÁ8îčìŬ´ñ³š2Ês–‚ÍšŽdà^û“°„{MkğjNÔSÓ÷ş$I ĵ•oUچ:+ñĝäÖÇBŝ ´OmÎ^Ş’…Xĉ½é\j­wçs$ŻÄ“éñúÌ °> ‹{s¤³œÙ#^ĝe*X"v\Zƒ,Yœ:1k x=ŻGíAŜ×îÁ™°"V ÀÄU+ ¸ÍöˆŭöSÑWşÇXBh(Ub›‘5ġTl°lŠİQ/ó#ÂĈ€}퓓fJ?ĤŸe_uïò.Š˘ĊÛ,7?,QSËú½'ĈvìSĥ~àñɌ½ħHĜ ’TUş5 ¸Ÿ†zô ÙÇ)Ó#X*ĵej4!ž}O(Y€,è´ü]“Ö•şCqéŭ‰ b\ÙĝÒ·#V88O`² &_Ó1ı°jPĜ0áFž´qĤM¸ŬÀê“*Ż2†œP‰ 3sPאäOµ(|š/ŝby_8-„ŸŠâġBÏEba§÷/ÜéĠŸŝx×\ÂΙ‘Ĉzt vöŸËĥ'ÜòËàDbHË÷ XÓǧDÖ÷‹àĊ.ĥe’î-Rŝrá;QĦ@SŸèċ–Êĥ’('P6ĝ9ĉ(üzÓNGşI“ÁgċäkBWƒhjżÍ:’ġš>ŒÖÑY!'`M[Ş5tçĦİĠ"‡ü„ĈœĈa(ètF\N7( Ğ‚9gv&LBşŒqcûŝëP*GŬü|şE`ycYz3^0”=İfĉ/zàÂmlE‰ïÄ×u:jSEtJҔÂ1yüé v‹<öÚ ĴVïĝhÂëSq?ÁÛé}Äŝ ô‚‚:µÀÈ? çÎ.óׅŞäT#ĜŬVOrA{–/Ħ´˜pßÑËcÜ(î;É˨e͗ÂC™%Û,„ġŝ§ş›o“ž¨ ùHo5ıçĜ}fG(w€:oŽx]Ĉù܎%g—>{{Ċ .…q:äĦ…ùÎŬĝ^˘xşKt{-~‡Ŝì]ŜÉĴN˜3ñz½ Œ–àçÑB·|>É@,Oy6̵UêÚeTxpù‚˙D ¤[ÇEӟÄ{}6”¤ŒĥÈĴĴ‚‚&+cÇÉr lûş(£wêşŠ"‡ıĵqrnµçġè6dטòX•pî,˜×dFñ× eHá,LüîÒ  /1SÈŭğ€ÀjN Î_$żŸž˜ñ:•ÓùĤ_£6–ġ&ĝ^@LÌÑ{İ5'Ĝ9¨-ĥ­ĥżÉ09Û­ÚÓ ĝĊçwä„ĉp ßĦÚż+tìZŽ0JĊ„Ù“·-žA=Aɲ4[RùÑajËU„ ċ&´³žŒOñ/şÛ‹hóC§ĴĠŠşJħô<´aŻ+‡<$$}~jĜ9f"=˙QÚÉÉ´´”÷˙ĥ½ĈFDŝĊżçTyG(ŠĴĦqĥ9ŭ¤Kµç¸:áëgñ!ŝQż<ÍÍF!#é€ŝ‘MÄi ĵáŭÔN‹ aòš‡îq—ÒEó‡ħÁ³Ÿ_ƒùĴ.ñ'¸ °0M2~­^˙z³Vp‡ÌFĞe6ŭüŝ£TĞĞïş'ĜÒô$B=ŜÓr‚D^‡ĥ˜Šgñ'Rğf÷HÀ(HžQ!Ò:y#Q÷3 uqúa˘ú+/Ë2µ<Ĵž4PԂ3ĉFĤfóĝg––86Ÿ˘:2öŠZĠ.ŞÖr—¨jcXÙj=ÀÒWÏ.Öën^_E´8[è”~ŸµîmŽ <żv•DÛó6QިNycT²1¨U‡ĠQ{’>ġ $¨7ËR70£ŸìGĊ¨.­ÙjMµfPĈè˙'pïe‰Aƒ ݉ĵ}Aġg”F•NĝKVx…"íŻßtĥ]Îa|â²2~ÇLWÈïÔû–0*³B‹ÍN€³b9ĤFwħŭó~7}oY„‡ŒVó5‚ċôh£‚""ÏF Rž½Žê[‚GÛŻ›öaóĝĞ$­_AHÄ|in+xû²2  Sd›ĴŸ&žx{uw$toÇĜÀ"Şî™V#x &péı9 güTYEŜ]§QMÁkĝ(9¸L×ĤW½~ĞH|wÀp4QV„€AµÊ ´âi× µí­7)Äwħ·ÂûşĵJżöÉñ>îżÜPrhB(ꇨ—7í#wO†šèċÙÖëÁiú+Ŭċcêd8éÎôż€*ŞinÛ?HÑŬĥ°;Ŭr%uF²z­ }²u|â%6Ér% Ġ×Nƒd;Ĝ4,N+ÒtóĜ]‡`jĕ‡ÎÜuĦZ~xFV£Ĵö bĝñ4ˆj!g;pMxN½ -ĥĥEŞv·ġ&d|ŬöÍÌÑû=²Ĵ3ÄJœ˘ÒÜü5N@„ĦaĊßîħȧ*¸„ŞxB~ħËĝ‰LO—(­ŭéÏ}Ws Ş§ĤÖAH› D*>Z+rÙS–ˆÂ)`îVÉ"ÚĴ5…‡!ì³ •Ûëqg+lÎ> ™t;¸k#²nÁ—Oܧì8˘N޵ħ×hĜ£œ#)scÈQ„Pĉr§œ \›ûYpù-íÇ ŸùŬÜÏ£2˙7#*Bç$މjfEÛ/n²EàJk"tlš,iÑ&~ÌöÎĦZı ŜdżÍBÈnlÒĝŠ„™,[b[– hCnW²§+tĊôß.nöa3ĵ„÷vO÷-Š'ĉí†ġŭwĞâ ŭĠP|Ô˙/|W4qġ!17ĠdZ\e pA‰$du—çĵ*¨/|,&½ĥRġôÜĞ˙F3{fŒß^’ó&’w<ÁĠÄ&Ĝ!ˆ\=Ñ+vnœÊ0°˙WÒô†˜#Ħ!2úYÍÙï8÷“ wĊrŭsJ_*wéäÌۓ%S(ƒ7oċĵÜê1–ÛÖì)Ŝ÷ŝ´³’Oa½†AÛċ˜œbHÁBtJáĞı#£_ˆş`‚'=ú—ûĜQŸâ~² Ù_ĥµÍBÊïÁÊëĠŝ×Ċ\’÷pï—Cŭĥ,B.LᙇĵëV+ìkŸ@µż= Œ*p‹v5ğbWnğç•T%1¸·³ÎĈĵֈBç]ĈĴyJŬZQë’ĝáb .ô´ĝn‰˙UJ² †AlŒµ¨ó&À]°öÌkíT{2î Sşi!R¨wëg 73rn¤3·4²ŞŜf×ċ“;£ÀġY雜ڐ˘.gï^‚F“ˆˆ _=˜ïËXT|ò´m?Nûıi;鲔+€Ŝ—'ÁL*ÌäÉO|3\Ô\; Qŭ_·K˜8}ä# Ĵ"yX;żY-‘šK r˘8šĊáŝÈ`ĉ) #°s™ż.ÏB@,Œ"²" Äûé(ô[bú—ób?Y7 K 7½ènĵÑjôäLĤ4(0F[ŸÙĴÇĤËğŸœZM+“÷k·pUÒï&P 3Vµû£ :żvòġ–'òg¤°Ì…™JÌŭúħÙyB$k°5€um@èĉûàt—ùĊEşôĵ$ ™0JÉûm.ĉ{0“+izyĦ^ɚà$˙]ħ„ƒ3ş(΁Œ¸Ÿ£oık)Fnâ'Ò$˜ĉ_ö|QLÊş#˘N{Ş(FCNËċŜcŜŜ˙xP²- Z^.épö†#‡H½Öš E‚LÍCÓ/…Ê‹ı}ffËR]°@`”òˆ·!‡C(³Úê´¸µê{{ü \Y™ĤĊ%ĈT>ÔL Ñ "ï#£„½ ‡`r(ù‹"k´<Èhty¨g&Ëñ›τ }\Żtˆ™ùƒ mĞ*i"YübMŭNGyqZİù•Ÿ%EVH;·½Ċ#ÛÎ}É-áŒ6ÏAËr¤¤rQôĥS\64ŝĵşž&Ħ%ˆÂj_BwÍϋuq܄-)7…Ŝ_Òâ)¸I/ŽÀğO*ôíùgÍ —Ž(¨ìÛ°oŬÂ/~ß]) uÓ ÑN&EÀôÏTÄLßHµş—Ñ”QD HrczGQJ„!Ç €~†™Ψ°#L–Ċx$³ßŞ#q¸ò× )žêĝħŝ´?Dh”)8˘·s1Ÿxü#PY¸g1D³Ĥ úìÓŜžµl 2MŝÚúĵÖ p˙"ÀxY‰´`Lzî&ĴŜ ٗ¨SJa öb†Ò%iş(YUJ‡ƒŽ„‹µ ŭ¤[Peb•ÚË(öŸ1 £.;@/ŸoÈÙ"fىĤûz.EâkÙXĴ”ĉ ġH$¤†ı`è@I.’s€58ÇİóüÎjİKœjH˜*Ê Gş½ Ŭ Ö DWŞcG =l°ĞHü?´)‡Ô€‹EĈÏ´S†ŒÀĊ´aÎKFò „ó%À6Èħ•].·ŒZ#چŭ§†'@#œ›îr²P‚Ú> )x‚Êi¤{<ÙŭĴÜÉ™†mĴ†á‡·$!ž$ сĦÄ`-6áK8‡ġ‚ôêÙâ?Wktç¤ÖÙïaĞ6˙o²E"£‘ Â:żxŬ ]3³„ŸĠlŬĞ­aV³”Ô Ġ›f\:”J_tϟĠ}5KĦD|zĜŻ> MĞġbMçhİÉĵ“Z_§‘ŭÁ´UÉü’…ÄʸgÎdO  ™AĦ“áÈ*  uÊ)ilí…Û|ĉÉ_úzBi°%ŝž|§póöñÌ@ˆ÷$?&U]ö隭İ(Ÿ4!†´„1ŻñŜ{™ƒ[>鯨£ jòSéR—Ò˙'n@žˆ9mƒA`ïʛdäm Œ=$›S;€ĞŜ^@Uúêë<ıNë]‚6 ĞOÛaġNí‹7ġ 7w¸(ƒdë.zĤ¨–ÁÓy_ï¨ÂŞ ' Ĵ‚)(s F*áÚŬ[ÛHİücr ׳ݭŝ›e‡žCċ“ö$mç£m- ö…V§²{=r7d‰K+°­Í½ -ސŞÚ!—ĝŜ(M/{ßyJwrEPàš•Fr§i4TŽsvG#3â8MNâĦġ*˘LÒ32Ô;™<}×čGKbİŽjECwu"–K;Ò +ĝ’JuwúSfLĥÜĜ];wâ™:ġ'Ñù~Xjšäżê7 Ħĵ I£ç[ÑĦI ŸŭÙœpÀ^}ÖJ1y ‚è܃è4Şñó*t×Ή§§ßö ÚSıĈ޽Jë™$Y]Żż6j’­êà£ċ£”<â ˙) ñË;ß×Y•'ħ9ĈAŸĠ(8ŸAÁ½i!-=é™ñbî"ÓzÀC­A*³†Q57§ÏvPûiwċ1sqÜħôÌX´ ôzßÈ=ò-ò‹ ›^I’"ĵVŸ$רˆÏnİ…“˜Şr?îâÙY_­ŒWVBg.PCj4q–=‡’úŸ;sĜìa`ŞS)cbw}4j†Üżó3[ŠÛ÷u˜Á‰Û÷LħA×#U ^ġV™ĈuTJl #ş‘ĦFËëŽüÊċÛİK¤üÜĞġŽí(\+òäßĝMçÁ?¸l“¤ûìžżÈ’¤fĥĥ)aê‡GœTM_ÈKÇêş ‰PëóY˜`yû!FĠŭb–<љ_vûZfòZ²Ċ…£rj(Äò+Ñ÷”:šúġÊġpâ™"9ċp×îRÍk4ŭœGŒ€àŬjïĴ“šÙ_„Q?¨œzİ’V Ŭ?vjá@kf|z Ò:˙sŬ(ĥáË"È%{ôàxv_Z@·öÎÙmĞ|NtĦ˜3O…ÇË ġŜ¨&ÖXM˙S­FYċ,ŽÑ…* ˙mû‰ÍÍhúŬ5ó1É':&ŸKŝŭO˘TĦu³Ííٓ7B›‘`œ÷?n&N64 s§d‡w]ŸoĞRÜ`³ĊN`Š˙+Ÿ˘Ž$ăjÔKĜ1ÇAP i½Ħí, yÚĦ-&"B¤•¸âò$:Š#فD8ĵġ⚠ĦĠNŠ#Ì}ÎavċÊ´~Âç7BdĤ/*[v˜‰8i'Gñb]}ܔ¨Ó+BÁƒ4Ù6Í …iÄ(ÁĠ@ٔ¸ġy.ÛñÍCyBPmŽ Š÷òRH )4£t@lü͔}l…VožĦŜ€Ì#1Z1ÜoöœW–˘%³ ´m‘#÷Ċµ|û|ËN\.Nq ^:³ŻèÜ4İşĦ'$|˙ [¢E=׳ı^jÚQ4n”;‚eyÏRĤ …²XZKœ‰Ċ@pḭ‡á­5Œ›ı4V˙T437̓ġ/@“ŒˆÄ‰;êŭž\ ĉ¸‡ÈğġU*-~5V Ċ] œ 9}{ê³ Ĵ„çEâËD–½³‹L›’0[gƒ2HŜ‘ Òp…@g“PUWçÍ=ċ|ZWË˙2s­tC`s-ʚšĈŭÈÀöšÜo 3I4ÉÂ:#o‚NēíÌ}cĝ£ÙôİıĈÑŽŞÄTx‡ŻäBùa•jħş+ÂÛ_8/Ôß k÷í&E "Dtú^ebŠË´ZŠfïĤë$ŻgÁ¨Ÿşf˜$ÔLşcûĵ~Ajx—hsZ…Kƒ'›Ġ‘;KB—çU·là+ ıö5 NŝS3awéŬ<Ó˘mfYĞÔ ÛÓ`”Âoħ;ӍUÛòèÜekCï‰\ħLâÈìs%ŭ÷U÷†jHĠˆ’ejñ0·$%[ëñ-•““E•ıi7 Â.팪 ¤ °žÉÁ{âä I+‘K­Ċßö ˆĉM"=¸N“Up=ê&bPcğ÷كá^P:¨GDސ:ê…elKî—ż;ùHMZòz/‘ŻòBŒüF`h,§_•]zżĤ‡ èì#DĤ'Xn%îše U¤ÌÏyÙ[Fà³ámEunR½Ĵ²g2)4BĥK§ñjI$´‚_ĠMS:5˜_e4 Ykh—Ĝo‡Ùfjêqˆtü²iVŠÎwÛGü e„Ĵü ĊÔş-é-÷‹Rïä2E-j{ö‚ıëRV°C2w´k wÒß"‘Éùµ÷Xöôı´;ÄJÏ΍ƒDŻ>$äˆ$׳£ċ „ꤰ’S;ÈU(Ät4í÷Ċ‰Ğ{Ä)Ñ[ÉHC€VB ÓϞi:zÎLQ"i0³sĥ)_%Bñd.s+›œż Užgwb˘zÛ¤½ŠĤ Gy™tŻĞ3 Ús\Éŝ_ñÙĠVÓy{‹DEÇQ„BYí5Ók†üŸÁ‹–`,R´ÏÖ4Ì°ÀÇ eB#^ŭT2Ä×=€ 1/y+m„-‘]rµgĵ7˙Wġ…2ğÛ>òÓ½B/ĉs uŽvCıŠÓA”—^ĉQî2ˆÓ5Áöîw:ßÖo´Ċˁíµ#xĈċ06sÖ]Ò!ċ^ jŝċµ˜a"€‹zÛÛLkžŜLY.­vI–€@–Üi?Πڍ#W[ŝ­Mĥ6g /mz:³áûzŭ½­~ŜĵnÓbûz´Ŝò/·áğĝŸWOß·™ġua}şqù+"uPġĊÌt],ì³N'™§hn™Iĉaj,öĦ™2Ħġ 9VšVcm3t?àó²#yܕE]Ëŝ" óOyˆztŸk+KĝŻê¤ħĞq9Ħ}Ÿ/ÍÉùì )²Ş­j;ĴE°^Rµ+·£FĤY|PŬ8@ -Žù0hܕû…äu•KoÄYĵ˜]ĦC×mÛ.6¨†‘7҉sŻZôħĦ Ġa6jü­lsb2È?‰2݊mÙۗ•U1¤Ïs.cKSfóHV˜ÄĤ<`K):·|İ œ‚Ô‡—¸%žz…!"Ö/éÉro~38#òûQŸĊĝıÊ8hᆘéΊhˆĈwûݤreLt2ŜKg>\OsÑŬbÈÓÙ2ûħ(ÚçıR¨ó'h ˘95yó"í€zG¤1${a ‡ş3âCŒİş%Ú9‚Ž$½ŒO7´"›òM 5ÁĈˆ˜GĊœĉê>\Öĵ… u=Kâê3%›­ š Ç ï Ê\Ġ·ÏNMÔ9po5fHĠw- šà!òÂ`İï‰Á ËiPÙÍ£ÊK(@ŽÜ\…#ïMßò ş28ñ/xÖÍ ŒìpEn$Ŝ} ùMb0XċvĞ%µžiä]qĞ›{wĤÜ ĤÉáŞĠiĥ(Ŝ(úù÷UèwJùm; :Jċ/Ê<|(µ7ƒ1LÎ <ä%jŠÂQ3Ĝ€(…2Öç%XqkùĉßfPYB˘@ö£kJ‰#Ġx5{ċž´˘ÁƒÀu#oôžù÷ñj%ĦòWäOü“á˜Ĵô@ÔgğçĠnşC8Żù³6ƒNÙ2§RòÚ˙…§4ä¸m…zµ\=S^ÂMmN&ċ‹ÂȔ*c˘Nú`ۊ:C×9ۘeğ Eĉߢ÷)ÒĊU*ŭÑ•QU%„Žŝ¤­Pügâ|ö4YŜUé‰˙N•”ŜßğžC–§g°´Áûì=\œ“WÑÑ` ə@ĥà­,umÀ$–ġ“!FdìÏà™?ôöÙî‹û‡/ĦhĈDİĦÍ·íVÇ14™´ŞJ´´wÍÊĠ^HŜ>H˜‰ùuy/;µiʨ4iä1›YßĈBšbyù)‚W­ Ĵuw™s˘ıîŒC A²{½Ğ ƒ\ùÏÇÀ›ĴĤDŒáM™l?5n1`×ıîúŜ¤·í(“ ŜŒîżô Ż½’Íd3ŒÜ—Ĥ ²żù0ùêÂOëD”ƒìš(éÑútj¤ĊÇóĜİ…¤§g!ˆ8ġ˖*ÜĦ%áŸn7ÌVÒĉÖĤdüqÄñÖħZ…{ĞK|DX #`ċÛĦŬ"âMôL§­ÂȘhzÀœ+nO')(ÎĦÜ>– v~7)ŽCdrúmd—…´››ĥğè ĴżŞUdĉî…ŻlŸŻ×'²™Jó°Áòğwk¨N÷ġCŽfş–‚~3ĵċ¨ĈÑòp‘N“zióôµ•¸¨ëÉ66ÚüDá6úxµÈkv8˘Íí*AK aT5è4|4Ì/2>è³í÷•Ö÷u‡VŞò-ż>cíħNċµ ÖA∺ˆ\e>£—hOQX‰Ô{<Ż*{ċj gĈd<½ÔçĦ더òŒƒ B²Ĉ/ŽÑTƒ÷N*‘ž5ecʜeN.Ŭĝĵg“ iÀŬ‡uaúYq oĠ˜EOÊĴt\dÏ0öCJY“1OÌIŭÖÓ~ıuáÑJîÂkúiÓ{î?żÇ§G¤WodLI ä@ħħdż3„j#bġ2éÇàP'’,&ԉ˘• IKĤĝ–o ²ĝ—Èä£?úE‰ö& ÎÙÛ˙n$e#;ÚÛ:Œ8cPyĜŭÊÓXRxÏó΀ …VwVínÁ3ۋYô2.Z˜ŞĊ¨Ĥnğ‘֗2³ĉñT9ĤJX“î,ˆeÒzU}Žë“ñ°\Ì(3vñ**Ċŭ~/kŒ|ÒàÌÉYġ+ˆìhV)TÔ"X<;DŒWO @Lµ|ß[Úmäì¨o8YĴŬ¸ħûOìnwamçà€k†W?ì#%Pk<,ċšĴó³/l̒ÁL24Hġ½öPÒ˙]—ĤT΋QbŜlñcì(VÔ82:gïPì+ÈkTV/„ ä& ŜL ×ëcçÈ9ĊĴk;êsǛóĝşĝP v·L¤6‡½Ġ…ĤĴġ_|³µÔ•,hĤLk· 8o>gĦ"ú0çnœˆä½×Ê<iYOĦ( |n‹*wE~‚q~…)é=Ġ”búOe&k²ÄQ’˘ġjFƒÈùœ‰KIC×cÇĊ]fn§ĵŸòÔÙcEŬ†™ 5áŠäğH’+› âjÌ] ;•Ö`.(ä7ĴZ\Nñp?ŻĠ˜îÑ1ÓE[]ğ”>lë‘#ĝ\‡FdZħà}H—Òħdà::×İ4ħš Gĝ¤Ž"­Ò/Ü,(œÁùW0kŝZ! ğAċšhàħD~˙ Òp |ŽlċÉ …Œ½ğRĠ.Ġo@×X¸ĤŻ)‘8#R— Idjí})X>Ğù!‹<ˆD;îÙ…˙ċMYvï{ßnċ¸(=û/p!&§ÓÄ}ġ|Uµ;f˙z•Á}èuXû]+İBëš}3kŜäİßĉÏ Ü,OUĠş Ċ?ÊôŜT8 òĴ­šĠZú†•ż˙lĸ\fö1ÂùĊÍè­ÖhKŞ6ÉĦç×H$D¨ÔwxF ĴTÙVğÌĜ’0ôġT wĴkû‡7÷Ş›=¤o 1èMXÏ0ĵlfıEĥ†2r8ë£q‰~w  hí\ŭİÙ;×ÁËĝ R%•Ŭmbî0žxżXWpwŠ5{sĵ¤œKыŻl›żA/Ön´çHË.ˎל…M$6ך€Ĵêż¸£ÈR DÀqŭÈKñ€@ÑûF™CžF„E“–LĠjX;Ñ6žßo@sÑéı"–Èì*˜‹ï}Nè@‡“|Œ­ àR^ıϋÀ?awş›”Ô€:ÜòlĝŸµiî[úˆ*^¸FB¤hڈƒĴ½ jÇĈdŒG>Û[ĉí“â ¨?ç­°lü´Wı(I÷ö?èfċçîĞ?Ĉ}ÊӂvŸgÍ[\V|ƒ,ı²‚¤ ıK"‚V P¤Z™|¤Â1~ ĈòĜŒÇÒÑÊŝ ÷ŭk­2k§fĥÖZ83e.F,FëíïéútΜTĈÌşúÒ§n)‰ĞXn aG rı·²Öñn¤F˙‰­=[1×ċĜYĤÚΒĝ&TgC^P˘Ż8rJ’ž—†£r^K³ë‰ò“z…Ó˘cç"Ħ×ğ‘°xU;ı9ŻD<,8ŭŭ=0–6<²ŝŒ•&óĥYİĴ<µû>¸ÍŝS<\÷É:Ÿƒ°äÓwae 0·2Rd.˜‘$ë}-Q>3Ύœ~™°?›‰{BÓżm*^CıÒK0¨ïĠmvW‚“0ɇż-rT1‘ĞĦdAfš˘6£Êì ûutuùÁEìe°‘İ:—sŠ”LŜëgJ.xL÷4·v÷3€Ê,c^şYj+2+Ĝ¸ÖïèH˜½;H7g×òK K ,ÀCrûħñĴĊÒu$%·żr ôcO˘÷웧+L•§˙ñ‹zSì‚gÓ·á"Ğ0se³CÏnmÜ“zNänĠf—RÜ_‡*ÉÁÖż†ˆ½9…Ó ‘£;BüÜgŒİĉ²Ç0(;ŝ‹81–U?•ÁÏÚ#Smè°.¤ŭñ™à‰ĦŭQq“zxÌU#DàÊĦ•{ 4vÁòŜż3¸…ŽùƒRx˙kóA˜üP€r“VgǖÑòé²-imµ˙Ĵ(2ĞŻ˙9(ÄNĥ”ħo“!1ǟR(@l_†}&¤[—Ŝ;c÷ħüĞtğ^€êq Üİ!'z¸YLżĞa ÄUÉÛ¸ĦÎċRñoN3ôĴğY=CwO_ΤġÍ H’sÀ.ž5]2’?vPĜTUç%•K´;ŒE#*Sàá¸öíWL \ŠŠ} ŭ(&@üÄɓÓ3MÑߎœC„˙}ħ]˙{  —…çĝĵΕA}$MÀˆ§oäÉĠ”ït<†Ŝ'èë 3âéĜ‡³´v.qàó˙xĈ„Ŝ`ŭĤüğ$Ä£CƒS~oCĵLñpŽiÜÉ1Ĵ?ĥŝ\ÏËlŻî6èrÏż¨4ߗŭêĝîüNĤÎa%7ĞÂ[6¨ç”˙@‹Z]‡hż}Ŝû0€ü½îY%Ż*ĴÑÒ¤S8íÁ>“ÊQŞŬIéAÚxXRwï\}êWċ"žÚ!:dèÀxüĴ;òìRPb’ħCV¤i#u˘€ñĴġlĴi´ċ·÷ XŽ ÁàñCĈ-Kôȸ/pĤAĴË w Zİ@Ïĥ|°ĤÍî.p΋ġ.ĥvĊĠ“ˆßŜ3:}.~ŞŬ‹û˜Ş8ĝŝê/Ğa•4žîRßĞ ˜ƒĞÙàĝñ_A­£#½ûö/ɕ0°ĝ{e’úÙÂÖÍûG÷ħ`œE²²´qŸÙú8k£lÔR)¨À}úäùJŻ?Xe˘o§î!Ĵ Ĥ•—4ÑŞ;ƒBżĦ´ú…ˆ– Âĉ÷ÄÛQ虝YŽÙ1ĥŽj‹wbÀğŸ³?Ï~2FċÇ­öŬËo…ƒ3K—³ġÇö›’Âûžr¨@^³ÁíR% ˜°ÇœCgĜşÚ‰’šä*]'ĉĝçÓIˆ(uĵ×s„tïz˜HAÓĈHz§2äVŻċJƒ)ğÚ²B÷ġo™ß´(S1ÇşÔƒOôĦOm_y^¤8ʳŸşú I˙ìı DŞŞ§âšh5z:$Q…ĠÑĞ<‡‘ŞÎüÜFş²œ#ŒQ“}ÉRŬ÷9áĴ4úŜX×°ÎŜs^ˆİ&‹ĞÄċgâó}—P9Ĥ‘àġw>Î9Ùx{Ö£Ŭ¨Pó¤E­>ŜÄ’ŝÎHvBzĈ(ìyžÓchŒ7s?ó ¸\½Nĉ×=û°Bˆ÷{^eüß÷ġëžä¸üétİy{Òtg[L8(zF‡(2‹a¤ÍxÔ c½Zŝ,Ġıt=gú§˙\˙Tğ‰°ċ_\O~(˘ -˜³uħpe™ŬşpÉc;à†Û$ 1Ž›œHšŝ(ĵY#ƒƒ›í‹Ìež(‡ĤâaÛħ‚ÌUĝĤ£QĊʒŒ)/ıèÉ Ŭġ4f>„3%ÖCÛÏ˙eœ?:‡jOQ7ó7óú‡Ĥi…,?2l°„éĵúg>gX)ġġġ”ħSq68ĵ…XßS…^tìUÂsWö‚H/›ûIĵ+$Mĝñ,XV€ĉġÌbëlŠ…ÌrĈiNÑ€jdmiêħ!$÷ıŜkî<ż4W ö_ġ—4ÀêAœ†ZT9Ë6‡ĦÀ‰J&£žÚe´ƒ m6Ĝŝg¤.ĝcü–˘uÑ:ù’vH äZ8ĝû]Ìímƒ;,ùˆ= MMyäŝLÖ÷eàs/r‘È$Dž ³=>CˆG˙ ĉR+vÖl3šiŽĥ;ÉYU×S4#dœ÷¸ĊMħĥP{0Êj><êżqéHOt Qš,'ȀVèÚN÷ b|TH#èQvxy(1†ġƒÔTP.< Q+BĈ˘Íóĉ2Ĝŝ‡ĝ ]J$¨`­[Dçâĵ˙6ËӍĈmk²¤­z[RaËR.’4%Œ2R‡”ĠíT–·tT°ż?0îU ü)yW'8˜Fx™ĥ8.ú·²ĥwŬ³ûSĝ—îò¨<œeË/ +ùë†ë7çżÖZ••'pN@.µtñWßŬ"5ÚÙG2Ò§ÄhÒÂ˙ušż*7iBŽR“Ïİr× žÏ ƒ²ĦAŝaÒÖ·è†p“÷¸2–ÜJ2ĊĉSşŒf¤O[ĠéÂHò1¤0XóĞÓ&Û4( Ô::ž @ĆUçżäsE"™§“Ŝ½o,eċ"—Ĝh†žšZŝ…Ċżƒ‰qϊ+Ž£3‹h \zËüÔهZĴóĠ†ˆOùJb°8Ä, Xòħ=ÑH·áXQpœ,ê8IµÌ^úĥßï7J5”ѳjsúß}ÛC>Bĝ=Ôì€ŬHî˘â ÍA‘„ˆ,ß´üĠĤ\+eʳr'ŭ?×ß^ëne?‡aYœ7àQE4Ħh1…ˆ*1ÈÑa°|xÉB犠)½—³ûÂ&‡Àû™X4¨Qß—Ef‹˙#êiÑbä\IŻîüœI֊TÖ#díĵ@‡?è>@×~ż‰oż’À/j‚ƒ³Izƒjŝ˙ sŝê‰:pgR ÍÉ݃˙4ŝ­R‚ĊO˘ċυŠjCĤŸF³ ~ó˙0Ú` oÀé£h(GĝƒĝĤ˙.Ŭc3­HÒM˘nĦKnS a“S=¸ü‚ÁGZ‡éRşŭ\&²ëĜ=MÜ)4~qˢġñÖDÀMÄ8@T|]„.9ĝı?*ş’¨@[\™*oÒR,p†ŻEt˘U0xC)ì°phĜTĤÚĉr²c‚ÙÄ]Ž2ïÊş'Zñ̘‚úL+fâAQ—éöIQgCï%q%—‹Ġ^C_ˆ0Ö4)$…ŜNƒ]BÇĴ’ŝ^Z??uXŝ[IŞ„ĴŠÏO|MI0™=­…ëòĵLt F›…˘çtšİħjż˘â\Xâd7Ë+}BÚV‡İ­a4G0 z•³³fJٛo—rÌ$jŬ²ÓèYy`B\İ.5;n¤Ĥ%{Dŝˆ’öÚŝ‹|>Mßëâ“}Ĉ6‹Ċ ´äž0H–:éälÒô-xĦ˙sԜ—ñ~WRş”_â”%Z…Ĝ"+Ċ÷Ö°bŽhñ{ ÚŻx(ÜôÙ¤1uvÊÊZœ´WUÒÚi1ĊXU˙\m#ŸF ĵ½/‡}â³N‘¤Gı(ç†Bà•yĜÛXF*O ۟í*4‰/òÀƒ›oˆp‹ÚñÍÑ·jÔps3=cù&>ÛbZ 7‘IÊ"Çá.¸ˆˆìXËwİsù•ûo§B“—ëÍÌl)ÖC\ĞɊà›!G7ŠÔlî)*ߛ³çÊ Ġ‹ï’+štœ™Œg´\CTzW9ùû‰-Èp팀˜xìċX1ˆĵ]"m.Ş §8$Âq~›HŽU‘2FÖĊÏÏŜ°ŬÒ")Şê¤£Ċ;Iò“!ıŬËóm %ŭ‰c‹¨ĉm˜ĥ•İË*&Ċ½àOöĵÜÏ4ĥÈŭƒÜ˘lÜ?Ê!ıKĥĦ³'Ĝê¤p¸bëĦç(,:랈‡=Ì3£Ŭ*üI‘çùµw Ŭè‡<ÈIAïM÷ŠÄ2Ş’"Ù|§b9Ç)qK*R­ĠŽÁH£’Ĥ– HİÂYá:ÙYħ½ĤOç{8TÜ#X‰(âѐ6ë ĉ­#W‘:L´ŸUÖĥ Vàig|Ċ7I₧yaYĠŬöö~§³ğ²quE<Ìv~L!W”ê>›$ʂ,§ƒù€u—^9€pnˆŭfĊ:Dê@>ePTáÍáÉ:Bó,KËnҎDÈ~t-[ûħïFı“3Ëëşa 1hï –”ö:b>èˆŝ îZ~žäÇ4ïyô:oî…H2ûb2ô#‡*¨Q\}—ġ=½ĊŞöı!m?Y~n]·Óßìî#}’BÇ&Ħñ³aƒ&f Î×Î踕W™ 0´Ş U êvdVR=B0ğ½w€8„ÁqÍRjʞTy=Â5l•i|×ĤqŞì§û["€ġ9ܒƒ³£\fOWwƒ2`•–%tÖ÷›ú=ÍiU'³LğĜbÑ|Ħ™˘ı– Œ]nÍN½(èëË❸ğoĊä5)Z í‡O„Ž@Qĉ_Ô%ò¸­RĠ´'Tż62ġ"éU¤ž› ñĝtGm—ş:™›W÷–{“}S3âä–û¸–xç˙!a̗6%ܸdĤûĠ ĉ…ö,d7 Dô:/½ö0hóeŝ͉5 gÒŞ¤>dx€"—Sçŝà-é*vĥcKXJY^Ğk½ħœHĈÀĈDbËŝFğ‰L*Ŭ˙ÉxĝJysIĉêċ°P%fsšúQRé nî"(Ė…žŻžP§KAñ$†ï4tÚÒÂÇ$ĝ QјşŝĤ9dàŸ˜³R =°Ó|˘Ğ (AW"ɜu½£ß]ú˜.:[³V}”ìÌSĈÚiĦXwÁï oÜŻB‚’YĦ’À˜İnpCHä63ÀX^†Ï@èU;=ߖÊ!ΧN1“OµıŠh‘ıjGĥšW yŬWERĊ­{ÄbŬï!tǎhİT+k{IW’÷’¨‡˘ua˘3Iy¤˙Ğ3vg£› axħj zİ"TžŬÊúËÒu`ËXñy˙>˙L°o·h•§8FçOĞ> @JëÂÇêûû†Ċ½H=ĉğ7Bò ËÎÈ2§°¨ŭdà·÷lYÒèŽEÊTúĦ(üP&%+KŞSkq‰÷ ċßLµú@uê!ż1(ĵŒFŬ4˗ğÉHòè0„é`N¤aómĦÍNá}]7~ŜÉ/Ğ£êĠĴ/ĞĤOÛÜŬġtsûv‡êé³ĝv?£ ġio¤üuúĴ"wŬxl4ùĞf£°ŬÌÏ ÛÛAîÀíL,ĥcBÏ,Ç (ĥÊïıIxĴsZ:ċİrdJ‡ùžW ŞŜçĴ^›ŬcAFSk„Âĥ°EÓ˙+Äòѽ€òĥ€ġ95cĞ˘—ĵ/×Ó­ùĜM2%ġÒcuU´}§^+=”§5sO޵e½^‡Ġğî]"SdÚ•ğzğ• ï>Ùú¤Î`,2“ĞÈ˘ 7½NqxàĵÍDp?ށïÏÊ% ó-_°¸EÈŬ˙[o×½÷@Żı!Rè|XòÑżowP[bóHžçpt™ †żöŭ’RŸË›ĝˆs§àĉLd°_Ċ¤ÜìÀ?úŸŞ5*²zcĉëĥĤˆ3SF˙xĜďKˆç“ġMԝ‚··ħ7%\?[^Çüş€Ĝ8 ܝš&ïdùž9DNŻòw Ĉ·ZúßFÖLöIÛ¤é-肉">&,#ÚK÷뽆(2dœ;*ĥĜޤÛÙ|žÓĦP¸ŞÑ;U˜LÏT.vö ŽÖĠІRÍa_?ƒĞMÔ Q‰úsş÷àW$ĉ]‘Ë×S–Êl(Ï-²’–Şıê„lyr8°äĦ•1İ;ĵ¤KÎ&™ “9Ô'5~A–×!fn¤Ż'Àî]0¤bŜ_†ÓGŸ€‰×Ŭ Ĝm£CùKw–˘–<üÛÚBR’Ċ۞PyGnt­Œ*öġ[ž:‡#%.JÓ: úMÏéŻÌ—FBä(5’Y$RZu™2Á\éjʚ¨/ÀéŠĜÌÍ“{V’b>òž”P\ÑT‹ßĤ/?p€µžñĝäÖİ‘JHzüżSÛS CGóE5ñ/]ÄEÈEY²–ĤCÓK”‘¨ôîw-ú*,h˙JkáVŽ6‚QÀ—Çħŝhù σ0ç™%yĊ½aH ŜjƒŜG½î¨W úO˘ óĤ&zšvTT“ tÚÍ îǢdıOV`aĝ˝d +*hß>ÎÑĵ"î•*÷™–1ŽşGì‹kl+#a•ëÎSÒÑeĴQ'~İVí(ˆ!ääUädfŒ Òcµ ÀWɃš)%›Ż½JD .›Á\ȝ(sĠ̳/ĈÖF·ú{ĦRïûİT ½›AZp8šuŠ+•}7 HWĜiêqn EُÀ|ÑĴ̘÷¤&e†0Ş @Ż|PíêPÄ ÜßĜiqĥicd–ĉĦÙĥXŽM…PĦşé¸ċւ”ëܑż4¤Ž=(QâħËż &F@¸ÏġL•˙Î˙Y,œêĝ&˜l+È+­ùƒóÈoŭ—8˙ü€ż‚(5@Ċ@‘ñ˘G7QĈ‰`´ ʵ;jġ{?6,GLĞ&›ÌdâŞœŞži W‰Í™>*~EPĦ%+&߲½-3·ÀÙş[˜!œó£<şn]³ĤĈŸ)úd%ŝ´7VK/ÏnMoĊ{Ċú²^dPñ nò0ÎBpÈâd~͐oŜü'ġ݈u¨A%݌2îXßäĝàzħnĦp !ZdĤáò¸‚tá8c§Wyöż ŽQDĦpħÏ5ĞPÑî1\€ŜLŝ`޲!×Û§unĈ {ñ*QW°l¸AÂdÑbFıĵ.eFÉPÂĞ5ĤΝQÁ´'!…,ˆ¸¸,'˜ĝË İÛ JËżž3Üq{ÇáïĴ^ğŞ€K¨jhĤÛüá_X„—p ّúżQ²|O’}}i¤ĵ‘ĉ Ï HÈ˙ ˆ”6—.ó‚Áŭ˜0‡ê'“ı DPJ,ĝCŞÏ³%ë%É_í‰˙‹ĥ9ş Çe0*ÄX=+€G}ñp½é’XêĤM8ÛûÂ&²Ĵ‹‘ĉ 2C[;2Ñ`ÖÍôhÊ üñ^òqXîŠ1™½ˆ^‡·i}×bpMŬp,œ Ώ[¨Uá„Ġ5kTœ_Ú–‡Ĵ„G5ów€ÚĨtüHÜ:ŭŝ˘Ò éêĊÇ$ÈfVÉcP.N]EMéRLÚ£³€îž"Eà³(÷ż :óx7˘èeòvÇMbd~˙ _ì˙Chò§tĤ³jˆ™ä! ­NŞœ/x6!S}ȝ–X½ĉQ¸ŽÖ1ëÇö:ĦŽ!SÀò†i*ÎÂŝ\îġ ı›şĠ„ *™76yqàĞ4ëBĵ@µŸħÁ {k‘\]jŬZ4 żèqЍ ?‹żx”_AšsۅÏCŬżS’£`Ħ¨Hϧj£Pĝ„hï;ùÎ$0o,/KÀíŸt/‚ĥçÀ HU3•ú"‚˘'– Z4Ĝ\Si?”Œ˜]@T̄÷tŬŭjUJ ž§ßtċÌ6ZÛ)(ž¸"8…ˆûcL„––9Ä3)&½ĊHï3а¸Ż–ì%54d£JÓ<—äJYÎGYe£ŽÈ•%Ŭvá—Ħ ġßpĞ!I“•ż·HdsN{ŬMO³÷¨î&.l „ÀdQ”óž¤uhŬu*ì¨Cžz1Y›‡sò›Ù”GŜĉtšàînLXBËGÂ'ċél1E˙HĥçäÁêĥ]Ĵšž@1ÓîyvĜ™ĈıÁ[;; ĵ Ï'5áV'Ci°oyrBżUĊCR‚2?q˙vsmê£@˙ó,dcÈÏñ…ÚVş[½ögĤ\gƒ†¨À’î)3Sŝéy  hCR àM~à+[™Ĝ;fJû­…‚óay¤ë§3âÙ;勤-ÒÂĴĜròÚ͂f_}éŜlKX›FŻ˙GqaMZ# \}ŬFŭuĜ8÷,·,oEĊĉƒò%ĉAÄtxG_ĉĵ˘cwĝ•ókíÁ{á`†×Ġq‘o°ä&rsiô Ç 8üË)KĜ@ WĊ›Ìŝüp? J#=q˙&ÀbxUÚhnŒÄŭ î*‰L×ĉÔÓO3C[™Öìew“Ż0]²€ârú_t ~ı˜ĞŸZ?ĈŻߎżdh˘$MO'ŬL“*áÚ~ ŻÌħœÙâ봜"NcÒ;wàÇ&ĵŭKv÷ü…bd­ßô˘¨…ÁDŞІpħUÑ z~YÂn&şON{½.ó›üş.™W¸•ân o ×·PÁóâ(Ö}i˘Ï .Ĥ[Ż}³à1tvîZK˘À\Pyóóá}ùV6!çÑîĝ½ÀĝĥaÍìî>ñFLc¸¨Ö ˖”­~[˜™wI VËò "VIᛵĞH·h9ŜÁ¤NÉ3@ĦŒŽÍĦE,fó+ĀÇ88}ĈŒL Ï ˙:„µc€w˜‡:†}ù1{Â\İxšñTP0í§Ê̞h´Îj… âċj8ÜáS3j3AHeÛi/ù<ÀŝjXŻQ"¨Ŭ@‡ş9˜3X<ĵ˜ż@÷òĴr¨ş•ÖwKŒnìaRVŭcdÒHVœéĦc1ŝ pçĜ³Ö&—FòLúá(| ceż„àB'ÄŬ(Żk²È6ĝG.E‰ƒĵc@2ÌO‰ĤĠ8Ŭë vƒĝœŬŠŬÎ-ì˜&ÉYÌÁZ.µ“Gâĵ˙ħfñ-\šyġpmDü+ÒŻÉH‰m_Mù˘r£¤Ž(ààn›ĜĠM#˗hÍ×á3Ämϐl4v1)A^şšž"›Ÿ=ÚġĜ5ï%h˙B—DQÁÜWó-͙ĉ,†Í÷é0sħ‡FB9Œ^‘_ŒcD„€ÀZ÷Ġ"LEu“J_iĊ‘ҁZÙWE•6R^b!0O~k z2§öC{Ù)fżÔ^ Ċò¤#&·Á¨#ۋWl;5ˆ›.Za C( ĜžĜ?³¸ê5Ç)ëİä%Ŝ~v|?u˜HC<³ùP•5+1Ä×h†ŻtJíÇ??}0ġ‡aÒĠï@¨ċ &§•;Á(ĈèŜT€-fûÓ@Ó^4АùüÖñ™³§Kß È+ġ|üŭ„ÀXE|r ?ş93wŞÂO‰ïƒ‘ÉŞŠ4Éë”T(äİ ôwÈgĴÁĥò&ĤôÚzħŽŭ0\kIgE`îµÂÑOs²3Ÿ^žĦŜ£'*‘Öı§†ç³ÍÏtKï+>ô§Z‰k—˘‡şİç>ž£.qJËC˙qÌY­À}1*Żf4ík?°ıàt’H³ż÷ǸĉÉž_Żĥ‹Ü\[£`ĤWsw„Ëà·`ş:Ǒg+†˜ƒdĞ+}TMœĉı{5Rüy ›Ğ÷7ñö€d#NşĦëqşĠ $¨NÌr2닭×W ñ*‹İÙùç<˜!Ç]Y÷…~ќʽœ>,8˙h hö25ÜU1È n“—ì1ϐúlbö‰÷ٝĝD˘ËèMz+wĞšÀ>S*~éŽoqö7ò‚€ŭżŒïĊ4\üê*(_ÑïâAr9à]áLsŸw’á û%gĜ8=ZŒĦŸb4va!ƒ?L€HġƒÊìÔ.ŒñëÊġĝ š:lAÙ³˙fÉĠY,Ìm;µŻ Û9‰ŞëÖöż(>‘ nvŬ…O>"żĠŸÎhÌŞtyNGÇĦÂù‚LEzpRkZَ“xäŠ>փ˘6 —>Äò Ú@ET 5Î*êĴzሠùÇafú°"ı¨“0ñÓS —ç>ê–À‡˙@\”# ¨+\;v&p°‡Ó£m EĤŜCY´ "&êâxŒç!³û,y4‚j`éŻĴü2Câ5QÏ@+ÄĤL2`ˆ#D‹ŽÌž£]aë÷žÓyôIŽ˜N4żjÊ0Ĥ´âëŻ£{ ÇT^)Ŭ`ĥ<=EàÎÈDñ4%íÍËbIáï/èôC€‰ÑeN X6ìŻ0颰YzgèmÔyí,]ùCĜ“ônòŒv%^DGôtîùlР‰‡?-Nìr °éŸË]–‹ iúÉà")˘Ùf8’Tm™Ö`’4Ó\µ”³Ì]¸>‡oħĠCĉ UYœm2t "öçÂ1§Şë*z¤JŞ ‹ĉIƒ¨’|îPf.êÌòlżça! ‚]$ë‰ô‡Qùs¤vNh…ß[ĊĦïHH=Ŝ·éċá´,×Euì"éöó-ÔŬx{íqš§–™ÀÁ‰(` _ğ$ĠÈNLI˙aI“jÀí.Á{òŻVñf?`êÓ°şÒ̙'ZŭË[7ˆ˜(<Ŭ…e!§3ô Ħœ’ Ĵj"µ¨ı!*Z7:⠌I˘6ÊvĴ Bç$Cáħ"Dwš*ߕ?oñ˙Bá`J´m|ŻğÔħÊ´‹D²ÍQ´èŽ€ÊĠEµîRŞì€¸Y}À'{‘bÚÉmÂA÷"F4TäCìÌ^jôĊáñÛÂŜWp^̀}²+}˘„:D²÷˜UÖ"–zÓAE” Ŭ ڎ òCµ<{BŸÈ¨ -Aż™i2ßİë{ŠÈùhÙĵ_|Ì=mdîĉ~hsŻjB%ûŽ_qȤw ¨Nò…•_Ĵû&H{¤Fƒ°¨0QFWĠâĥ#@¸ğ[IĈbĠRL`Ȳ8tÖ{ò²~€OÙ;.ĵɎ6ŞUEB³€ŬÏŜj× L›˜0oΔĴħÚФ5ĝ‘FóhË" ß:ÔÑ[Ċ4Ħ ÀԚK9wë[Ûô!œ˘ kĠ×~Q’ĠŬpE 7g $£˙ ëXü^érO­΂XH1mâ?tVĵ}ÂÔ Aä ‚Ç޸˜(•Ïmv/~‘ÀĠӐNW{=µ^è³á RĦ˙_£ŻĦŝ1=Ì˘˘ÇÉ$ҞÍ7 (°Eżġq"ÀnLƒ{ĉP1*˘rnİùv$ 9~S>­ocÎuˆö1èÂÌùUß#BĴŠuÓ½µkÖÙëÓDût‡hçíÇĤùiTÙç÷sb™AŻ*<×g/ĠÏ%îxÍ&Ç`ÈâxŻ:]ĵa6§ŝaùìÚ×K߸ZàZŸcTş_£¨Ž"Dqìí ÄŝJĞ\çüŬa÷ÜAԛ}äżÔ‚ĴŝLԆä:“û;Û)2 ĥµ˜)ÑŝëôU\[·|`S2wx09ïуĊ°“†‰À\kÇCġßğ4 …³ûÎşŬ‰£…S=OoD£!“›'ò‰£Ñĉ£{qŝLíċş0R*•ÛĦĴ™wìY¨×ôÙçĞPÇX|ÛM'c鉛_µ.À„?ZĞD?Dşèt,xfSIĤRĦJñÄ ›Ž %ÌÜÏŬ[äó¸|TR÷ ·ä·ÀĊıDŝ²„SŝÚ!“wı,àž=Ŝ£>ĦÖĊ7ı˜œtËٌ PÌ;֖V;H|à…|rLW•’ħç‹÷$ LlE½î Z÷-†ŝġ&UCìŒçâ<éJìe$x .ĝ<Íó.qM ¤MuŻ×U8µê¤•€ [&-Äĝ›ü4‚—…cÄĤpėÇW€211&ĉ½”\W¸vìpÑ'Ĵ{Oö—}ö¨•µ‘NÇOÚDĜŒk&şLò5ڟş[Ôbñó.ë,_ñHġbğ‚Ċġ—ûÍ֌äĜ›ħIl*PŒ–]‡)Ĥè"ӎàë)˜fóğ*2ŝ´ċÛë‡.%Íğä ™B´tTJ˜“Ñ9Ş"ĜdŝşÂ|b9Ë1ö9ê Eh%Ú:ö{[sjŬŽq?ÂĦB÷( d“İšRâ)BYDÁîBİÁ”&íÍ€Ù\ŻP*(~¨ŭW ĴÏ­ż‰7EÄ ƒéë—'|GŻxáKÖe_ï-Lâ™Bşuwíĉ4Òâ°ŭÎ( ˜`”ËRûì( E3Żd'h֐:Ĝ·BmÇ<‹~\žb½Èž”,ë]{Â#ĵ£ùŒo8­b$^Ó{°yûġĝp–„ÑÊmŭ™ċ˜KDŻ]SòÔ˜1„Z–ó•˙{á*$ìöĈ×ßì~WN÷žĦt²ğ·6ÊPż¸Ĵ˙%ŬçŒf-;C­ÂĝV‰aT1ÍgÓŝ´EÇqžŸ~¨è°Â+ ³f‡] ‰ŸH,+XSBe÷tĴĠf'$2ŝŭcq çĝ%slM¤L]U¤ê•ôTM~$Í4½­5œ€ù‘-ÑÖÁıı˙V{ís‚?Ÿt¨h!Ż#­Ö&}Ӏ)Éàp‘èÏ£q=J³˙8‘ú!3y1:E”DVä…4‚o[L Ïu?ó.~ÎH‹ò.9™Ğèê%ÄŞ }uù7?Š+Zžb€Q3˜–gùöänÓÌ/°Ĥí ÷Ħ DšSßùBC— UP÷ŜÔFcžğ\dñD‡H0D Û1êAµÀpIĥNĉŒ—&< ×CÂëCcBâĉ*~ևŭd œÉ²’5NŻ5#(Mû*nó)_%Aı‘c u\:ĜÓJŭWÂ+˜Ċ‘?ĜŒ=èlBiħe#ŬÛiJ SÚ+ĜT@ñƒ!6REµ÷ Ӎ°0²q¨ënjAœD #-&Á|­4ïΧĥìŽY^^ʟ4Vn÷ËdQÊJÁ-êı–öµàTġ5ıßUĴüŝ-6LB}Ë lU?`h òœ*§,|>F‚ (k|¸‹€½Ï¨³žìÖ,1`†ƒ;ßäüÏ++ùduÌ}4Š'FeħïĜhT_…^öêsAQŞi‘¸ÎSLƒwzYJß3şÙACn.ÔHhÛÌ —s0be:M›IĠ3NŠħ™~dƒ­âÊаÉ,SœO;Z`zjîW`N0SO\ s*.óï/Ÿgj´êZÁàş…ŭĞK>IùS"Ĵ‰şĥ–m·€GŽ`BN^Ŭ0ǐ™ëċÖ5›é†yE0ŞöÈ ÑÌ2dı‰‡UaġƒŻMş5ɰ (’ûfï `ËM”ı÷ÏŭİÏ÷ê„pΈPšŝ•İ—zûœ$!ĉ=OVá2ËĉÀy!GX˜Ò§ì)àáġıRú"гžF‡’Q—eÑ"…¨hÍ|îġ5|é+—glùÉ)‹Ñï?8n÷-Ĉöñc쌛|uÍÂU=è‰%ċ`ÈÍ(ĉëpk,Ÿ˘ó% Œd–dĤı]5 &˘ĥ*%al(£_|&IxÙÏñ‹§“F– aĝġ­À9z÷Gŭ„‡05 ĞżÑëÂIèjÉIµĵ˘[£÷´6ef!HÔèÊ ?Ë0iGÜGyĤHôĥ)¤¤Uš–¤Pşeä^ċŸî$7vĈèúM²9Ccˆ]Ĝ>SE¸ĝ °j=lŭŽĠïeÀ6ĦŽkŬ{ÀMe C°pMàĥîÖoÈd(J7‚'H Ôìv™ùìX^Ï7ê5BÊ ŻÍzċ€@œ6sêxÂĊ–í%]%ËŻ(“E""=́Ŝx¸×eÀż€§Ĝ—•LM{VٝWЍ}Ĥ=è§Ċ„Û˜ċ~|d˘ñŝ…tSÑ ĥfĊc3ìg]ŭ¤3T #şÈ[:G˙s¨‚W·%òĞa÷· żĥdèğä%—ćóĥ H0wġOD £xKà†ò÷SYA.ŞC/Tqà}/ò.8$ónȄ#â/u `ût+:TÓhtM½wNsj7l™üĥ‡îÇè_wmYŜıÀÎNĜŻlږ6wÁT o óÍEëżëħg§iKï}Ģ'şÁöÔc`ıİ'~3ŞBÖ(>Ħò[?û’ùš›‘z½…×) µm0ŜŞCêê²ŭĦ¨’6bôĤϤDòü1wıîŭm‡ĥ˙&óY £˜âöáûPżmƒûR?j–´ïöÓ˙ZoûNq> ïáJO¨B}B o¤˙%úTwu4Ó†ş9@Àa!Ĉ+î:×À0;-`ü+no›ĉùo›ĉùo›ĥCMÊXE˙şUËĵ~T (ñġ•ÛAS|İf˙|ä.HĤ:,i†[?ExYg"z*Ҕ“8AĠ‚Wêí„×ô@\:èÉPµë薷ú>³ÏP‰$÷Ú²ISă¤²Ìj•a)Ĥ £Yâ44míŞOĊm×ÍójĝL´y:X à\1XdÌÌÙGN£ŝ?ŝ>%^3×&Ĉ¸ÉHjÄ$܊+ĉ0ŭ-͎ĥ€$IGœğİfñ‹˙“ż-áĝ:4ğt·Kü7ŝ¤Ì ñċċën]³·üŻ[PĞU}µŬMv0‚ßì\g‚O˜bÖëĉùo›ĉùo›´gI'V}_Lŭç,ü“l`荗XÂÔÊ/Š™7ħÏùş°ċ·i}87üHIh„/Ĝ÷²³Öµşùo›ĉùo›çbPX”>ځ‚úġ.* Ğ =R€ü+no›ĉùo›ĉùïEâŒrBżŝ·uÜîÄêÍüH8W²„Hˆ_àÖĈB_b†}Ϗ<œ{£Ùd¨ xBĞââ ?X8iGB9ġúˆwşk0ÙıżàE%wòĊ›Ş+0ŞÀ ~GŽĥÎjyöÍÀÍŜÖİ0§£{KŒ ˆcIżeyB„áşç.nkm}t”¤AŽj˙'•"ħË%ŝ?äŬ_F\ĠŜi…EDŬE`²•#Ġŝ~ŝñ –g/Yŝ?ŝ°Ş#Û;D@#á|Caµ *Î×È­2ċ?°á‹×ZQ_[áAĊàÁħÊ $–1x9oöèİñğs€-/$M ĵÇ $f}Ïx ’âCÖ/dÀ/üPóo½¤¤Û€a {™Ħ ¸mⓖ‹oÜGw;"ĜY¤蛘–×›6KÚżôdÄĞȂÙÄ  ^£½^Ï1íWÖ ††ÌKSÌip6(󂄃܁×@`9Ĵ°XPJKSEéŞĠ8•ß–j0äĵgHw]ŜÀİŭĉj˜p?bġŠFLOÎĈKÒ[Œ_Ô-ÎDùSóí/Zŝ\oHŬ0íOQş½bcŒĴžLbÂ:Û&œk+÷9ß ‡o}Ñ8Á3Ó ­÷°Ġ˜úŬÓöáx1R!Ӟ`†£x½ñŭ´TùŭD÷ĠÜmġ:ŝÛöúDOŸÒ§íĴ˙mżozĵùû1ûGżm9>IçĠŸ´sítŭ½I˙[Ŝ½ġSħòhŻÛÜ´ùŭ—_UƒÇɧżokĵùŭ$@Ğŭ´íê˙{t7ö‹pżRTù;§ŝŜÓ?m-úşÏ“ÑŻíŞ4|=úşÓäëôŝĝĝ}ž‡P(Ċ^àŝ.™³E ŝıÎM¨8~ğĞB³Ñtċ+œċ€q|D`E¤ޞWÄġğb.ë>sqĜìÂ+vY_]¸Ë#󛙜’+àíżê.ŝŒ˙]Ú¸K8…³Qžž¸wöӘjTŞíV‰ÖÇh ë–9;€OÛ¨óғĠ/ö‡´•eòç¤òâ5†§”6TN[üş`ükx J.ñáròßËXùJŬi¸_àµ\Ol”^ÜÔïFäâ8ĝlj˜dSaÓ³>j‡>Ö9Qruın3ĥı˙5żC³,Ĉô„ßo 2hS¨ĊĉzEy.é dóIŞp”šÄ$P:p,Ġù*ĜĠO½•ö>zß.fĵ+Y[żP- ŻÙ!QÙúú;ñÚüÇ^Ч3ܵscY;s:-šÔ&sͤétàOüR˜n‘ÑÔ3Ηdä¸ ÌĜ!˙ÖGš9İVñJqiDÏÉĦ…İÔ0³Ħ£×‰i îX€PÍJÔ4>ŽÀ1Ÿ 5Ñ;5PVĊñġTÊĈw¤RP?s½Í3İ•yt¸“ßVT=€.4!Ô½´TÈİdžÇGĈŜ!V))Nê҂to*bŻE/Ú£ÍXs\jŜĥÁ‡Ä Óqs…:ǜ+Ĝ=¤H˜z.#è@‰ôÓb:1(ŭSĤ0ĥĥB‚sìI#ÔşĴëĴ ïè9‹ĝ İàġʑ‹‰ôND EŸUƒz͎’nwŬôËAı= a8–ÜVCÍçĝViJt{K=ûĥHĜnáaÁŻ(ÖôÉï‡a X]n8ŝ›¨h°Ëg>Ö?ċĊ‘˘u5Q×Ü:—uËüÛiĊ‹ùU‰÷ҍ…*2˜ŬDnċž+}Ħ)œ¸*/:„˙:–VXlÉN‹ ‹ĈİŞħġ(´oëŝĝ™"ŭ/O‰+{ı6ÌSöÉŻ$P sÎĉĈ˜äqĥròBV ‹ñÛ &ü-ĠÁŬœeӘwĞôÖÑkÍÜŬ[àÎòİÎ8ó¸=2Â0ï Ä>Ôe[Êx`Ç è4JZğ‚C¤zâMdĴĠ|EE„ ĉzwoŒC;şÙóƒYö¤v³q×dË]d†('d,Ngk<œ²+Ûáƒ,w§žxlcr^§Tb{ƒq@4ŒÉğgħËğÔ2oĝ‡)KeĤIş+S–1ĥ†“ Pd&ÜQ·UiŸ_¤`ëĥ8.h¨‹`VŠìÇEEJ”­Üš„ĤŞ[ĊµħĦ| c¨l;PâŝgDĠcœzSvĥ•1Z%Jú‰/Q쀋JqtN²BġieĠ#Àĥ6Hĥ‡m•6Ocëk…2żŠŽ?FeJ†ÑF˘5Ôr ÷>І}[Œe•ïÁ%rÎJ°ï=QD•`#„°²üќk…yC|qŠôôÖj8ى ˜ü’ßs›cİ*Ž<à:½F,ӝNplÈ~“áXˆĦ^Ï~ò£­ĉ?$Bĉ›á‚X]!݉êÂ(Ñım}—]xK`ÜÖŻô”}OéJ‚üİÄ)Ë ½!;Âŭ˜mhO(j,êO˜ı˜&˘m;ì%²(Ë'dj˲ÛĴ&‹³LIÔoœ1SĊ„5ç2:V•/› ŜŒÑcWżÓ–ä8óï,“c žŠıƒ3Ĉ“?IÁż^ÏFT¨KÚ„ÑŻ#¸ĦSĉc&âµĤçİE=ʛ]7ÓèU¸UÔ0˙ĵĵP=¨qNKBN şúš÷ùÜoÒ ¨]´8ÊO>ûîá†zÚÛ,ĈÖ2'‚ïö7§5gC`ôNĦ£L’c “8CdĈR„O7Úòk¤L¤ĝÙüÒ¤ĝf–‘(ÏS˜„ ôíĞ ›ÊÛS÷Ëİùfı&C œÁ:½6T˙rwSއ¤Î1Ê=/v`"4ü™“²SGÍú#¤–:d™À܋ş>ë7ïǍYù>DvË:T‹eXÖe#ŭµÇ”(Ġ>ı1o+ɖ;=ÒĊ‘™1O˙,bێEĞÑÖħµ[<Âu„O’ìH(#"{vÑ-)b;ıJ,QŬQëú °ÈpX Á9ÌKQ룳‡ä—×?Ñ b=ż)ı)r'$[ûġ=`|$‘ÍTȕĝË aè^çn@sÂ]ĥbüÂQ xÙ Flşnpp¸%żo닄Ëú"kœ{à›FFċE†pŠş'w†F›gÎ9K/D)('ĜFËöy'É :7ġ Ù)ğġïEp1RA$•:tŞL> Ŝ‚0:&C]‹%œµ‹NWü0!ŝ2]à…PĦkZfËke‰ÂTìX£E“§,Ÿ <ŞMjU‹Neèröĵù^ž/ŻtÓûVsO>^ċL<çePXČK9Á'í·ŝë´[š*ĴĥuŜügÏ/u÷ÔÌ£aħ)Â%HöIĞ€ m³–öêE7İR=Já ĊG{h;è:¤b3ğˤ/£)äRmġö„ê“yñiG> ŒA0ŠœlŝöĜĥ—dı¨ı,ŻÂ`h €Ö>Ż}H pšë8·yž_ĥC]ÉräMDJžL´"Ĉ­)-yó'H\:hıcÉŸìÜż>"‹Ä Aċ5ï!úsâ2MċDEĜlĞ î‰ÎÖİóKÜC?6½'œ¨’ï›Èx3ħÁŻÁnEœst= h{š=Jï6ˀıs #Şs†ÜàÚajY1â”_6Ĥɧ˙P,ĊËĤÏlşïù”6Ĝôx5ícŭŞêı¨š€J1”|a1kÎġVĜ7f0œaĉR,7co§ƒ ÀÀB€ĵHcw"<ôñ„şĥö”*Ŝ4×Ï–†ƒOSKÛ÷_ߔıû;†ÉFµ™×FŠqA•×ג<íc2ġ.÷ħĦà£Ú4l†Ħ 1ß$Êl”°ġû'Ş×–ߘĠÌϗ~_— ıd“~Í÷ŻnËúo]zħ|ÜöìJzħĤÍÔ­·áX×·jVZżYOÀÏİßtÜÇ?'+N@ d}\n%Z•›sJf°Ğ‘éhfBÛцà~yOöĤ¨@âV"Ô6]+;U35Ċü“Ĵ ‘-h‹,é5ˢ£S_sßÈİ:ëúövıÊ܅/ħùtÀjóÛF údĤOœŭĦú _älĝez`+ƒPälzĤ?/…nħËRbĵˆP1+íîŭ€ˆµ/ħd2¸˘?ü*”ĉ›èLĊYr€ôÛwëhÛÁİĥÉ`‰İ×è‚:˜öuğúġŝIáí2’ž „EwŝĴ¤}Ì@9ï3=Ó •ġTZsċÈdLˆ²r–kÚŬġ£+ŻžàĈŭ͆ B·ĤK†}Ɉ/XځCĦnƒŬ1Y~èF˜°üÖsτT5°†ÔfĜˆ‰6ċs™Œ%‹E^Ġ{šPg‹™Ż>•‘v(Á5B7ÓH§)<÷hEÓ‡“ÈŻK8HŻÀB–TĠPwVŜ„?¤ĦNĜcÏÍñWôéA;·Öı3È`ùW£ƒä #nνvîÎUJnCÓXìÊ<ˆéĠÒOòÊ V)x Mć˘O êWġ‡şċ?$KvŬ„ċÁDëیà²8EO•ŸÇ˙sÑ`ìZÙvzDì/n°t¤ Ҍ!ôŭxúŻ;™Üp+ÏX/NC#ŽĵñÍÎlX⛞„ÄànëĜnhd°k&Rs*ïÛY”ÏĵÏ٘šŝo*:•XÂG$4P>×7Œ³Ì}Ĉ ˜~uIZ˙ÙԌâfúĊKB`“ú–Œŝl5Ĉ”Z“İĝÀĊ%K•Éɤi]£¸Ù1SĜ žQ Í%˘µ0@]ŬżGġ!ï•E”r7ÀŸ¤\˜2ÎÇ÷JDu½0ĴċúP$ŝù;ï€DUtzâ‰Ŝş:'Ü ˙eŻÄ‡ òúâ³Ż ˙EġÙ gd·bÎĝ£PÁıÖ˙U‡ƒÙp:ޤâ5­,èéA×uwĴ“İÜ:L.ViGÀ?zst*‹bŞ\V´ÉùŜIòqn',6šŝ݆žP9 ‘Ċq›\Ş™]úışpٖ·$;òcèU"dĝŭ>Ċœğù ×B”=Pl šĠÈÊ@÷iµŜŠŜ${ âíHcŒŬ0˜Ĉf7s¨™]mQâah&îġq¨Ùô÷…ä‚Î)óıRû™v K³9Ŝ˜2ÍİĊQÊv£h}¨à*fġl§Ċœô7ò¨è[İĦŠÏù@àö@™QĜÛÈÓw ğà“AJD^k8£BúPŬx¤i+R•ş°Ž’CHÈY¤(˘ŝç°b§`H|ä~–a0–Žzµ™‰ħĵm<ÓÑa’OœwKÁÛ\ÌAQ?˜$.k‹èaúEĠTż3³€ü:g#ZżŝħÓiÉΜâïÒÍÂòÁ˘š”ê¤n˨ħÇc\G)†‰èóbÌ#èħ`¤•É[›Ï%+ҒĜù–B2oqôH‰‹QĜ½ÛSÁ‚ëÔHğ|5U~F(7yd+n¸àêÌN”ÄHżk;šʤ xĝ‘¨4i‚żïUÙı;"A3SÚ²U•S„ó67€‘—yô™I“û¸ÂħH³’Êw‘™1O˙,bOÀ!ÓûR!2'y‘x/ÔlàJ›"öZhGrëĝßpXœ J‹ežÚaÛ<Ğú,•nj&™WĥUÌÔ˘€PE~Χe=h–"…Éĵ+·|ŻĜjˆ}ġħ¤³àá|´j¤âuâF7—ÔQ@îêC·Ñï r˜Sŭi@›•d÷ž•¸_™Ÿ&sSu•!·ùu‚“Üğ[ÈĈw“ ‚@q…úAA}|’G\ĊÏF™.žèE'v˙=£Xsžä‡ĵ.Ç8r€DzS/J-g.[9,;j5…,ċûN<ÂZ "0Ċ:mdÙÎÇ­¤Ê£°İ-Ĵ³+U„¨B’%j0&tbÙ²Ò{@ِa…& }d²léÂ-‘ö÷ôÑ[?Á ›kèÖĉJ…oh”Ç“ġżÔáŬ+§Ĉ€sĞ\g˙ Ÿ: †òŜŠ+µ ‹íĈD×ıĴp—çQħħ‘´í 'dރé?~³ċ§fÍHsJëĈŠHÌu\+ĠĈvUÍäDŬ‹ î2ûŞ%Ë2$İ5kĥ~ġžÖŠıidJ=”ĦĊ·g-h¨ÂÇm9âÏößąbu”§û ñ“ç–ùzÓ3ÎëĞ}MĝCV)á{”ŬŭGĞәûBÊHDàž¨?Wë§7&£˙[ċjr{‘Ĵ&ˆ˘ĊˆâxjMğOÌ^û$>ÈP1TĤah›‘£Žâ]àBž\êÎĊŒQ%yúöğs]LÖGafÓJ˙FĤšíôߙ5ü#sM9ĞñÊ÷:ú3Ü[ñhÚrèéò°û9͏ĊiG'²üŬ§+ĝLkpƒ3}ÛEê@9żWìİô@Ĵ´QŠŜé1•[ñL[t1=–Vc›Š'ĜƒòUnAŸĤċ`ÁQƒ|––,Ž£Xµx=*ı:ˆë•ŸœËêñOz;oDÈĴCËûÑ|‡–Ÿ§ßSĈŭ Sñœèż@}$X;oŝ2mtÂÔ ßbı̀c_İZ˜‡áê·ìż9d—Á£xL(…w¸aġç0„ ‡”\d–M›ˆxdÏs=01zm‚\´|Md:ÍÏ‹xöĊŞPB#’5ÇC˙j•T\á‡sŠÁws{ŭ˜VAwy Â2‚%&Q-Cë- ıEo€ÏÎÌ]ğUBÔż‡ĥnu÷uoHÈĜ[Ü{uâ„5Èı ĈVÌö.W‹§áœ·)p –Úۑ³9ÜÑʽÓë²BR=Ѩżn(èZĝr:’Wv\Mwê‘$CsÑÀ ¨ò„~Ħ|)Cş•EÙŜ–€upCàj˘ħ6,ÂkMCñ‚ž…ÓvTÁ1-£ <š‹€dŝ€+x°áFÄvLv”†áM¸´,ziÇ=%q6çjÏmX€âa&KĠÓñ­Ô× ÉŜxsÙbÇżX¸Żj4ÙϤ šSV“v pi„tî,Ëĵ:ÚúÉ5ïöÂşĴ/<èc×Ù²Y Q¸.'˙;•ƒŻ0ùä)ŭ²Îm ġGkŒHŞ?l££8l8×——Ġ@XŠ› cGç”,̓xëBĤ‚’\àĠHĠ g­ WfCÂġ0v.Ż-èÓQÛĝç?ž²,\ž°c;"àSzFü4M4ó ŸşOMŸ–Iô^XWi–Osr˙gĞ|V’GÑ}~³Çáüċœ|o"ŭƒd@Ŭ?bŠñâìß_ı„ŝ1ÏòĉT?^a ÄĴ¸À ìDNf”*B`jÎ3ˤ@Á ÍĈ0€¨·8jOĦ İò’02%û´fÑ4íEµ‡Qm`{îy˙}.Ä,²¨nXF!Ù…Eg$]ـEċ$DŠtĥG=oL!‡ Ğü-žA²I­_}œ€nÁyRdÌ~Ġ Ñ~÷ÎG¤ÑŠ Ù²l×ĥÉÈ,5çM…^žÊb%TXjGy;Ÿ°ŠFçl3kSÀÄĴñü/Q˜÷}ŸüԁnÖ¨CÇ\݆ŝ=4 ]Cj[ĝÛ&Œe|Çġ˘Si°}:šJÈĵıÁ^ƒ Ó)^hzĴƒ"s9”%ĞódM ĉĉ]µĤO HH0R a\£˘:<—€7äù(Ġĉ÷{èĠŝÎv΃Ş6“*hô¨²ĜÀ ŠÁ÷˖ ŽÀ˜zòpĠuMZIñĝYĠҚşë!} ñòAÇĉLĤqë`4IÂr¨dù¸ßV)Ğ@Z¤(ŬԆĜaLŭŜ€ š#À§şhJÊQRĜÔ{˙ÒxJö‡é5B‚>‹^ÀSqM‹²èpGLqĉO•6çQ 5É8hê,b#ix´êdÒeŭĜôíc`‚Íċĥgk—sWzhĞmbèI‚˜7êڕ˘&²&§ġGJù§GȂÉÎ< èħU3çe&6’9Ĵĵ⇨wRŻŞ‰S5s ım$`IKÀ„Í0żJΙ‡_$ÎTG°"ĵä˘d¸7Âì~RO) ?_4÷….ÜQP”ĤÂşnHĦpov\ßû’!QX9J9Ğ7³€Ŭ()k٘7ĊġİÍúŸ|äü@_ċ˙t•txíɄâ”a¤ÌÓĤ9a ġ• ú;ÎMkKe}že)´ĥ}cR x ¤ĈgöQ%=i&0Ħj—IÇÉ\ĦBÙ˙q8nžë,f7ĝÏ7˜&âkcîÍuVÓÁ§4½ş}?i2°PĈP&] ñíâĤÎúµŜSœx¤ıR|ş0îôÔÎ9€nòÁ›’HëŭN™ñë‚Saœá7h/ëš —ú$•¨ â+–É"‹:ŝŸ¤"+]÷Köä6cxÚ4dNn;q;d##×O³àò—Ħ ‡Qĵĥ߃Ğ(}Í *hß;6Úg˙?BϓúÌ$—ÏĠQíúµS“Ôá™p—½ŝD<\ŭĠ-´i{tĉ­À‚ätgġŬ<Ž:½’œ#Ŝ;\ŝ…Äa*vì%ߤÑĊ\°Çw´NĜŞLğ,âV.uüóàŸÔ}—;Š6hB0Î3Êç2O0ÙUĴ^ŒpğQ×ĉŸˆİ@Ĉ‘scc[İŞq|³ÑŸÄUÑĊ í¤µĦÊ™˘Ú8ÓÏ Ñš[)cĥ-ë6´ ïċ2Ó&İ·ĵÁİğZß„Z݉ĴpTGY~xžÉóĜ[ĥ@ Š”ĝ·|+ŞúŸ”óŞÑTòĊ*ˆ9Püî•ßûB˜áĞljvK&q#dżµÜÇık ]ı—_-!ÊԞ Rw*)Ä óZtöï¤D—–Bİkè œ ġ·ĝp×â|šµ4U”ñk§“b> ,ċJá|ğfëâ,C1‹Ĝ`ž3F-K…AÄ —ĵyĤ@ÖZžŽÜşÄvnË –Eĉ9Ùi ò]/ڝ+ÓbI2M7%ĵ–ıMœYĊ6ˆŬÁ³OeNôgû‡’ÉU%Ì$8ŬrlÒݏĈİ”DXÎ=ۃ&2ŽéO˘^ù° °´*ş–&` ŠsĈÚàŻSu’úHo£³=Ħa²ġgáS˜WċïuܒYB7Â[£³ĥüêŞE÷EŠĤGKîô-Ël*îä<&§$Ô:rçV*5‹a!4Cyî'Z`Xĥ$0+$ĥ´*Aù%Tìw–.ÎkEu4B•JŜkúëaó)x–“~ùs׌„k‹<¤à@Ute êt딍(ħJš(Ċí >#օv–;­vfğ?ZÎXÜ£^_8·°äp=x·ryǍƒĥĊ˜ċ…t†Üïԛu'VDGcÓÄPIòğˆ×(bêd‘œcÁŻôòdU — nlŠbá_BŭÜzċó—˜ÔçÙ#†İìí‰{>(V˘žzžKÉz­†1uyŝœµ,#ŒÇB—ífk"rUÊê’r\ô‚FµĜÒşĜ˘˘† #hÈ{l)ôğA$ÔôĞĊR%­ì֍ "—ĞĠ9AÖòMQxCÌÏĥÏ3ĜTs<ĝñ­ì…£tġó!K %2v‹ë%dŞˇc;Ï\UuÙÜóÓ A€Rœèğ%”ijüPêÓÊGzj,‘ù‘ŠHM:b'ĠAOB•3ùD2´ˆzF62ž›Ŝç,w,vƒ)LŒŠb=Á~U‚×Rŝ aíÂiĦF’Gë“LËÁ™û(9âIb5T‰“ÖÈ[Bŝt[m‚frÎ=Ĵ½Ġˆ zƒĈ‘°Ú$#tîßkŒòPäùĦhô½ĝZóˆyĥ^­]8˙O‹ċ3@c§½sħœ2˘ü܅Í=÷$ï…W˜ÚàÄĦtN§è­5ďôp{ 8땄ĉâR0Ú —Ŭ0¤ä9rZšÚZ‘ùc–üżïjTJ˘‚´ÌòıĴ7o<Î܋ü·5V).ZŝO ÇMŭ=Ĥ[L?•Uƒê8ž'˜µJxÎÌÚĈ‰ĜÖĵÁfŽÒI3s-m_B¸óDD(€—Z@H‘ÒĈ”e áiıç|„RsÚs)Èol NON'İI•s]2Ĉ°@4ÓíÑĴ'ĤSo1~Mbš³-ê| ñ­ÒR;É6gù3+Ê` n¸ÑZ•“B< ŝYĉ*×ÌחLÊĈ£Ÿœş ĥù:—ˆĦĊĤġڑc‹ĊŻġ,%òVE£ŠĠ´ĈĞ!bEċ³Ju‡adÚÙòíTjŬ"$^uË£ ŻÚ ipÉe~%Ĥ ` g3²nky” @hòŝ§5B6unO!ĊN=™vd]0vûÊGÊô*"b.·Ğd— °óŒc™Dz#’äBg2Ş"Çg|Ä¨@Ùf°@ò€Ĵüòìç|‰Tw‰O~ĊÑC,T@t~x”BÑuA ¸ıĦV_܍OÀ — Û0RÄ"KB¨ZœÓ–T$#Ĵ\wêŭĞ–61í µî•ÜsI¨´£&;•Šñ€cÎ÷ k ŒÑAKqö€ FŠ^Ïù3ËÔÜtN"]]üvž^ìŸì85Ú&ğ ŭ;G0üàݤNąĉĤĊW´Á’› ރ‹8şĥSĴ×/nĤÙ~–‡91¨6 F³zž([£ ˙–[#wş-„‹~ÊĦwÊhq‚F°e-àqU9ñ´S;îmRçӛÁLw}—ŞAÈî”dnˆŸoŻè}óƒĵ‹6—[÷sëíċĈ"òĈü€C6á,9d`œ&EĦ"Oıl'êo™(Cj E†ibWŞ0gË*°FöA½ĴúÉ–Î(•roÈÊ/UuŻžµĝSiÒ6\ħ´}!üô7ş‡½irU xˆ†{Jm¸²‚Yև³½Iu. Ҕ§#Ÿ…°¤€#Z›’Ôyb nMX%îƒnÁGMm¨Pa„™ÓäżnısëÛ^ĉQóL÷à´ìo50…ñ}‚/Oef†K&g·qOaĜPÇBrdâCÁÜûÄMrÍáöĜ(>ŸDnä³ğCżfĴUÇ·MşĦPùóŒaŭûËÊÏBŽŝ–ë”Ĝ˙k˜îÂeĜM U6‘ħğ† ıĝMwÇŜôdCġêS=hœ€È ´rM˜lĜ1MĴÇĉ2€úiÏÁ²­ĉ‰µÏ–‹:(.V=,ĝŽÄ<Í,Q3ñkL+€lp³/\ĝşž äŒıżS)'Dy=œAŽħ^!7áê•îûQ' †’5£^öé~]&ùPŜ–}§=.K Ĝ€ìÖ8;Ċ£UÔzĉÖógx_„Şkö#dïĜÛµ2£Ž'mÛ)FW˙Mç3öc!ƒŠ O—à‚ò×Ê!Ç7ó!·d.8'Ċ¤çĉkö´Ĥ—MBĴ5SŬuàħ Ò{%–r•u|A’ââxËA´ÄĉäÓĦrœk…‘ߍ½oĤ>ĉâŸ4ñeŽ\G`ٞ°ÄMŸQÄ.m3Ŭ0Ĝ,˘°K§‹-££ò‹)˙NôêďHC&Od~ü£ş%Ŭ(zœ6ßöÓ£t‹Lâ +ö=Òü=lİï ÛĵŜ6ĉ¤˙+ÍÎüı DtbBĦ=ĵQW·Ï–£ĤR1Ì4Ѓê<‹µêŻÀ2íĴ ğš+S úN/÷ŞL9Ħ¤#g]…]YÖzט/ŒLu8D'ĥ\ñ İĦ4ıš‹$´c>žqx‘ŭĈPÑçÏżç”Ï%§ -gVQáĦHэÜĉ4R´S4ÊÉjb›˜VŠ'9˜o££ú3dĉEĝÉêċd£ᯉğ3“í=TžïˆĈı 4ĉ4—‘Í7ißM-{˙brIiô1§ïw NW‰xäÒjÎ~ ĉà^i_ÌQ–F½ts- T½s¨%§g0˙¨à0fÉĊg opċK-b+.ARܘ]0lż" …âƒñÈßTáMmW“÷I`$½Ö‹îÀàĤfG˘Ħµ$2òBbñ~cûL'ƒ=×r;‰ 7†FŬÚ·<°RèVX$+wĴvb`S*Ħ0NÄùpĜ +;×%§Ú ¸ğżÑ£ÎL^%Ĝ´ˆ„ #¤M"Ö 2£,wMË’˘§KÀ6‰ñÖ/;—Ï@|D˘à’äÒÇ/°³ƒa=²:*ÖgÎ  ßĴœÜc×Ġ{j’–’…Óê< iı0UĠĞ)³ıò ĴŜo³èCÊAÄÓa–+êߍ@ŝĞWPhŜaC•QöˆRMpŞŻµ ¤fqÍ0C8×Q˙ƒ}‰üÎÁSµáUnžVšâĤm'¤êV“cyĞCíôĝ21FYżwm]ÎfäíODĘNĈ"לùëÙé& ıxĤSnò÷Ìaƒâ–˘¨Ç¸ JÖWÔ²g—Šhċ3hBıTö]Û˘à>ËZ‚œ„sŜ"Ùbğàѧ(É:bëuZı@5Ù}ÎZöż.ï³Îe0Ĉ.ĝü”µ8z8µMyiaéu ,—ħ~^›|\B“gLYÈ£àMV”ûò,(x~³ Ï÷qà[ùĊ‰ĴzKxéÖŜiħ‹eҌá/²ñ‹Ä̂A‚€ä_~Š$çHÊ)+#ĉ †"Y!>Y5 É’‹gwċ0‚ŝW£1ìŻâÇËÍEÁĵ⯝mŞç(NċM>;ÚÊyŻL&È.éìBıÙıw˜Ë0ċ£.°V Î×B{öÎ_àÈEú—ΈÀîJ&h3e^iï5ÇŜIômpÚ7Kmj˘B!S˘×1-Jğ§`ħ*[ <ëżSÍÍ8`´ĞAú ·é÷GÈ<É4ñË>l&,L°ñG›x!½´2áLïbÑĵ~f˜Ĉ´ž51slۃq`&àáµJ苆;–{`Ç݈µ%nš'vè/ŽžDšÑû%êw[œ†‹ `\ñšıdYÔvê˜s’²‰"%GÖU`ĉ·$żÏ^ñS,_Ħ/íÙèı½ÉŸ{cġ1;55J´ì•jéË,$ħi jòó>mž‹àWû¨4ݞÉŝ àżÓ÷EİÄÔ½˜Häè ,í<&n–ġËgGuÈ`ĵ8Ċ/†İ"Z~Ŝö—âü˘–Œ›ÍĜĵKñ‰G<˙wĞğáÇu5é5üş òë¤Ëqë8“ì|ŸĊŸ„}½´Úá9ŠÛ;хoG͋Uô¸İŽĦ§’zeT‚ê6é¤j€LÙÌ \͒9Äñ£­ï/’;!;+ò/ŜmwÌàqúİ˙ Ґfçü††żqÔ/Ĝ8ĝIĠ9×0>†Ĥ:y˙“éH vR+òЎġM`İÏ3?&ap\7 ŬŞo½ôĜìŻÊ² “ü­/ù\¸wÎ:=PûÄğÁ‹ÍÊÔĝǚ˙0é‹q›IÒ<ŬRÇ8ĈËW=wï$ӕ†|óVĈÄL&rŜ?!Ÿ Ḭ̀v1I,0 6ÊôÍLFl³´ŭV~I‰àM¤kû&íÄğżò,Ïŭ@RŠL7Ççsp9?íÜ:P$ûj==ƒv½ÙwaêF=)2MBHœ ıí_Ò×½:ÊًlA}V[–lĞĠ‰2:݃×ú~żĈ6ûşÔ~¸ġ­zéĊYIÁАìĵĤ'#tŭŬ:ÍDĵğ!S£a˘é`˘y'ĵ귊ö5‹`Ĝ×.r´3äʋ&†5% ĤÍ N4ñ)ŝF@ŝ'żÍZ›'+d­yĜ|áMûĵŝbÁöúQ^ĤU邎kÖYP‡–ĞÍŻE]ŒĜ F{‡½i’Ffĵ>Nç’„ŒyĴ+n’ [Y ż!³Ĥx§Sĝ ŭDġŭxù_Ş:Ü΋‡ċPCËĥ•×1ñNıZR(ìj J­ofO¤VÄ̸ ß|´Ol`é&0üß˙m)š x¨8x”´ŞjÏñ-Ñ_ä÷úyó½cÉŬBl^ĈÙàħ/òĠ‡zÏWFÇóħYʗÓÉİsÊ>{³ŭU/IĞCô Ş:#•~ËWˆc߂U÷ĤM%!âÁMR*l֘ ‰Ñƒ·Ñ†]÷HۖEhŻĞŭOis #ĊÏÌ~ Ġ‡C°è%ÛHÌ_ §,½)H:÷ʧPMŠW ċ¸èmÜĠE8‘†e1ŽqûDı0V<ì³XzT wEŝ•l[~vdÌ/2.áġ˙eq€ŜžS%gXĵ7÷<šÙR{ŒFŝŸÎ ÛĴWáŠğcuı|Rfi€om;‰’ĈŝQ ĜĜ^ÒE BGÂ,˙^tzp£í!%@‚Mô ¨^ŸxZBŻ„añÊ:ĦnŽÇ‘ü XMÄêÛá–Í2Ħ1C‚bɈƒĠ%q5ĦÇħl<Έ2–ĠÁĵx„P˘ġFqÌ ˆ²ö'#~ÑÉ q§ÔG]K|%âGƒ÷ü'碌 Ó×Ŝ'ža”C*ıJ‹‹üğ7!ĠP­ġÖCiĊIBl>£öXÙf÷ž½ŭ13ö˘­ "„4ĵWn(>ĠȕìŝeâSÎn^⧃4bg{á'ıYdàü„ÈÚ0)ĉ_ ĉöE”Ħ@.˙wdáê-+ÚĜ|Ñ9ÚŞħ!‰êIz{§áHœÔ’L7:p—,³ÔϤ‘ >Únct¨żĵpġĥG—Q_ŭD·ëĥĥŞaëóxpÙÛa´}èĝ ö@NÎëÚÛ{ƒMÂüŜĞF4=VWr[ú{%Vù%è1ÂúۗóÄÒíso8٘×i“‡Ôé½H9dDĵf˜‚ Êë0ŝ;á`#{&³Xxä{Ha<ÉHì£YŒOŸXç3äa‡“{Ù.SY#8 –IöO¸ç{x…¤0ÖŞsİW3—c‘p6€ĊÍ*ıó…Ö*‘‰ħÈçÓĉè¸SukÄ iĵvw†é/·g ĜóˆaZfĦà„<ĤÒŽ–ENÚn²Ĉ阀Z‘Áí̞ÜÜTŽäÖ·,GŸžSÔr{żMUáÌJ> ÁÁЁI•Ä5²(ùυ\gfWğyˆĞ·dZ0—ïw´ĊASJß8QŜpÛtY)—OLïpDçŽ “Sç 4²ß=")Lç„m“Š̰}èKĊ@ÙwĜsÚ=yê(rÚ%( D+-pVn'›]¤½Ĥp(*ÁĠ0I´ûЧxŻìiË â½€ËpĜè¸:ċñ„÷…;÷¤@€Ï"Í"á²F0Ħ8ÙjTċóoÁ?‡şlàG˜ğ|AĠ­ڔ?ĴÙVO Çû/\B™ÈâòFÈ'íµ‡‚HÑûV"Żşh—Ü+·ì ûڗêÇċ³)öÎóÔ×„Ö i#†ĵÖéWsW‹Ĉħ%Ü_J‚dĈñm“ôOËÙ·ıe£§#hE‡ ˘iEŒĝô7ìö=Ëĵ˘çš_/ŭa£ ^Xêä‘EÂĠâ–ŭk€ÛŸçáŸú ÚéŻS0Ż WTM˘CĥFÛÌ}}%ˆ’È:ǓİĴûğĈ×ĉ­b P6 1÷ċ9³1ž-G(‰-ÎqëÚġŞ4ÄrôíYu5b<ߐI5,›ƒÏkÁœ§o4Ċ˘ċŸĠˆÄ´. î4ÙâKxıdéĉ ¨żrèKšgí>ħŠ-êûÏBıcé °@éúáŞĥÒĈYCáTı½J&ŽB%ĝċÔÊ=k:£‘è Ìŭĵ:;IŽ×ƒY -˘Żâ9şÖ5µ‹ğë.!ßzuİ ˜b$Y-y˙TµΉy˜Zu¤4ibÏmOÚu\|ĞÄÇ5VGŒĴúâĤ=M]v:{T/Äʍ!Ċċ¨Ä‘WŬùͽ'{ñé%qìç=ÉM}?ChĈÙmRKóŽ˜Q=ÑèĤĵÜ 5miÇâÚH:˘(?CİŜ7I,#ôı˘aıTFż–ä§AĦ, ‚;­.OZA‡GŜĜ×`Àmӓì·Ùġü—ġĜé ?kĊ÷żëd-—xBîòr5Qâ1š˙M5´éX|tµ-<‹(Œğ}ÏÁ=pċ)Äż;dĴ+É 6˙ŽŞ4Ĵí÷hĞċÉ Ç/ÁŞWıÏD`ĝcÁ³ÉÚmb9ϛa½ħżJ˜áŬ0úħja Ħ'öŞŒO]a /ÂĵûŻô’à0·È' ‰¸×[äÎ]ˆÁ¸˙•< wJuìÛ¨WZ0ßLğ×"´(ëĵ6ğí;Ċ²‰ħ:kQA†Žimd ĞR]âX³F‰ ŽYʉ†êžĈŜ(ĦıI2Şü!é£=¸—kħ!şpMcĉîôM=¸v~!CÓ;ߕ£Üš²^ƒLŭA} ĈüBîQ4gcSŬ°“C¨wi¸èĈÍ5iÏç>‰•R@UUrÖ*&[‘Ĥ\fmüÙÑ Is'ġĠeyÓë)гıžµn>ó8e.ù 'IçZjġ:jġp¸|Ì>›ŠÑáßġĤú[›8޲s‚ ¨ )”òÒ]ĞÒÙgIùÔœSéf¨^YéòLX³‚ŠĴ²2­Öŭ=ğPÊeÓ a–£a‹;ÑŝÜè1ċ½ÜaN-ğXC³Ó&ñŽ5ÑÁ+ıìî[×İĉ•R|ûŬ~ÎĊH°'kQ¨ë:F´”Š hN]•¨˘ƒ½_gÇP÷ÑÎÎGAIÏËÓ¸4ŞUîe‡SrFHħó’œŞdŜ~ş jЏĊñCFx8°(8 *êÑU˜9Ş]ÖáGŝ§÷[Û—ĞĦ~9_Îgp˘„uĞ{ÑÏví5½ÁL@ıÙ=Ħİ@Wób/|#a4ËQFòĦñ+3”ìÖŬ‰ŻËż ˜#ĜaċIı gW9K°t€ĥİpż2Bµ‚g™í.Ċë1êûÎÁIÄ–Ğ4xàA£ddEԃ“_²ÌŒ> N@ċŞÉ%#',̒”ŬŽ'’ŞKŞcTDb™Vİĝ¤zöĠŝJe4‘üÓx< ĉYç]ú™{•ĈhâÉçcϧÉŜëëĜ>İ_ŸħŽŞ+GŜVî óAÇ ôr$²\ËÂo ğ+lĈ);d:5ğ\EŞ`Zä0Ñ(‰şÓ"|ĥŞğg”OcšQĝˆ\Żä§}D;n^‡]H7LE)ŝ Ú@ Êċ˜ñ/Á5 À›už–sñ’ŸŽ6>â3ħ@.%=Ô͖’">îšò2[0ëµÈévċ{Q „ÄëËşµÈ¸zV tı‚²¸AjlĠg ÷•H˘†)SĵJİ "˘½)5´R̊ž'3ı¤5σ€'ĤQûyÎԌä]Š˘ó`Ógì·UïŜwä51 ÑG˙ZLÚÀ·Ç}×M4Oˆ•eb\Ĵ-n(Y‡827-)j=!ÜldÂ`ĊÂ^êÙşÁQïÉŝğ*Ÿf¸²o´TÌĵJ…Ċŝ'Ŝ #³€ş§F(÷İŻÛÛVkÂm·Eñ˘&7K xö²„ûyFÏ—7ÑBÑQşŽìÉ˙y‚œÌÀzlċŒƒ$0u ìì<¸‡³ı'7³¸\9#'ì;ĤpX³Ÿû!ûúú&P¸JÜŭ }Üó–m÷/WĉĴԇ÷Xuĉ?|‘{éŒ (éĦD˙Ù$˜7yŒ É!òPñugĈ ’œàÑíZR“†i~kÁXÎM%îž^ÑĦ£ŞDt¨·]ÏŬäİÜg(HÂ)i_ç ;ŝî€ÊĊmYA-gZÒ˘ÂÔóùX;KG˘DÏ‹7jx)Ġĵ†_ÙkĤ7 ǒRŬÙ.×G ÉÊ_­–‹PD„ôƒÈ0ÎçyĵÊ{ ’p³'îɰ‰ĥZŻ|r lqóp 1à gñ!`CıĤ€µ`èĦŽLvRú“£ ‹}8FŻ;üÚ2o0<},xŽ•âoˆ…ĥçîoÎÛĠĞ’Ż‚a;ÑĞ€2•hwV°óóêj@Y w†Ù‚Òx<ŠúHpœ`ċŸ\1Z6ŜI 7IAÒ¸Öd"Ë4ú¨–|]‘Pûx<²~#ó< ¨RĤ‘›ġ1} Pˆ|½Î İ™İ‰\pK A›Jk6à³öt'ŞŞN‰?IAÔÌâ5}#Êt>óÚÛ&ĵ£ƒ,lŭ ïk— ‹ùġá*œÍ°ŠġÁ$ĵşO`²'[ċj.YŒtelÍGfİlÌqq wÚ½ĉ'uM4̐zażçn—ȨP7ßùšòŸW7CÊ:È"f}şˆé 'Ÿš‡ÄµˆW_²ħ‘ùT>H(–WĉŸíüˆs“0pCE/ô{´4­ ÓêħV”P HÛSĦ÷ ByYPá(êÀ‘׎ëX6Us0X‹R}`Ï187MK è°Ĵĝ™dZœ²3$ ¸g­ĥ™_U2ŬlЇ_û4vk˙P"×5+@$ÈpĵPk‚Á\ÛQßêm,wż~m("ñ+³[eR¤RôÍĠÛ#ÀGDâ8°ÛV‡NĤĈ,/<£ŜNÊsAÚü½ş|ßß½ö`2ë_1ŠtĤl9*ŝ ˜‹—€ÖzÄ&Ÿ@OĤo…:9Òa–µéĥîPÍĈsH­r%î FÉĈÖSüߓlی’b> f8GÎÑ˘d:â01Z-qг†çĈ†ı†{ğr†1аÈLµ>3ŬçÓhŬr%½ÔHÖF}~ğyE°vxN5ÍgïN£FÒ°ÎIˆDßĨ`9›yêM—Ñħ âÊ÷ˆXËcĉsi’n‹-%'`b"‹oÊëùQŞíħ“nBìRµ=öċ{KĜK­!ħžñŭ³ĠĦäläĈGŞ×žÊŻ,3ı,ĉQ€#ġƒLÏÎÊıĤÓ7WŜ-‘ï˘LĴyÓÙÑY9İaq­S@]ç Şˆ8rüMH²yTÒ=‡û[foŜ1ˆĥô`NBêACıe@ ¸~^½Â%bUlçÏöŻ˙a‡{²\–óĊ0üD×L{‚ÂQg‰ġH%7réN²ë”’sk×Çb$”Ín$à<Ĵ–˘”bĦWŒ½SÛ¨·]GDü¸aî˙/€LÑĵ¨^ŜżŠ¤·°Ĵœ˘ż.Ÿ,ĥ=R½‹†èöÊeà7ÏBL )3 Ü&Ón¨‹]k´tĊOŻĈÇoıÄî‰oùó›‡T—„#OD€¤½ ½ÎGM3Fلù‹ÑŬOÄ΁Dw—ücĊĴG; ”4İéñ”ŞÈ>ù˙ĜşM4@wj2ż],ĉÁ+ǂ´ Ì Ħ<§˜+˜¸“ÓDŞÜ{A¤ïӑUߣP˜µG8‡%ş>Bñ&˜ġ ñ­n£U²Me<é\+Z“םÏÜÊ\ PĊ¸ÚŬNÁœ‡"0Ŭ lêvXà‡GžSÚNĵ›ĈĤ ĞĉĝEñG*ê3)˘EÎêëŻ:?N—~ĦaĝËÈ< ÏĞw§‘Ú„›yè‹Ósä˜`nÌ.[ñžÔ„†.ñ4Ħêàû7ċгnġ‰81cÈoLF5 hïZ{n’fRä è%l¤ğîP@ ’ÑßD#ÍÉraóÏĵ‘v{XI°ñÌĜé>´IŸ M4İïŻ˙eWÇş¤(O+Ÿ `Y WĜlOÑMΜ-Ĥ[#êhDs¤8ğ›tıİváĉüòÓ4Ó+£` ħÍ%eŭÉf­^íg]ÙíµµgSÚû;‰AÌ³ 8"Ä@VLÓZ,k—šRßá}|‹YÊ Kĥ#F(s×ߢHÜĜI…˘6 íƒŜ>—x.Şċ_Ö&…"üÏİ£YëâvĠĦµÎ’Ëġ&)@ñŭ´tùŭ÷Ġè]}O?ĥÉè'Ïë×öÛíÑÛڟ>@Ÿ´öÔóçô=>}ÇûG¸ŝןÛÔ/û}mE>}3}]_Ww÷ĠssçÖ?·ħÎúş™ƒ~Ú?öôïûuöŽpżR”ù=·żÛNO’ó|ŝı#äġ·ûkí>M=úşíÓäîäŝĤùòzŸ&Äŭ@àĊ~뀝0E ¤ Ë5ËápdÀtÊd|Ż3Íû’NÂbôŠÀî 4˘šàËġİP·ZÍ_oċŒ÷·c:ħ Ĥ ‡<'Êlż_Á§êk[ıy„GÇMÛÜ İÙ៚½ÒıĞ$ıFË?4›,¤ù睛]aĤ+ëÂ0÷w— t¸èe6ŠA i ìlà0… „,˙ĝdÖ+Ïç-ċ/ıÛê…S3 oqĠ|F è–yD#Ĥğ Wb†ú€˜mbŒny./?ï2·¤à0VùŻNt;k6us%G`ı-Vĥ9r[ PÈĴ ²ä:~ğ…ĵ#‹¸W™ff•ü'ÏZHŝÁbI%—Ú°è“ ĦÑŭ:£Ò“Bj˙NR{záPe}ĵ@rò‚Vżñiè`Tr4…>eÒÁ(Wö!zûv† ıŝVÛx"î°ŬA†·„û>sBwˆÉá³~(|ÄÊE;ĈNÚh‹‡‹Ğ‰Ġ½BÀĦİġjĴ { ÷4žé6ĆfÛ è^VyœT;(ĝ(+Ĥ–ƒ·™ QùƒàÈĴJDÙÙĞ[nƒŞOAZJ)>AÜ5ÊòĥftJ˘Ìç}ÀHíÏ^ĠŬaü-ĝ<•™ñ^p]ŭ@U%53ÈP¤ĵŞŭÊ‹ğy‚“_Ò ~EàyœZœġûYôċá§;;Ôîî x1 ^èíïv’VNß\Ĵ16´˜£^ TöûĊÉÖ~¸ mÄ<£'i§2(tˆv€¸'²FN!{°ü~ágżÍŞ4&9¨U,݈ap—Ŝw*Eu‰H,Ĥ’Ċ£ñ˘cTXĠÔhj‹N 6NĝvİıÎr#u¨„'Ö!ôġ°ùM jm_Înw1·ÖğîGobnïırŜX‰Ú9ŻĝßbY#Şš9Ġ^‰'Ĉ`öĥÙ3ŜyäôÇKnEDáêbZtĝħ@aYҟ6,„t„9.”6 ë PRÍеÌ×l“ëžŝÏŭ:NhʄŽ$‡aƒB09ċiîc·¸€ĵqì|ÑdCÏYXĤ–ÉÇQáÛS-&âµ>ï_÷. 9oÓğŒçDâÖ ĥï˙ċšÌ‡İêÙ lkŜñ=á M—ŞYʈzÂî›rÏd÷bş™ħ }áoQ÷„ġ˜ùšżèğ|6hCËBd­o^áˆ8ËÄ9`ċÒġ·Í„[/~Áw턆F N7Ÿ ?<5ĜGíùßê-َZ2•ŠğŻxb_jÉäġkç>:˜Áà ³0/şĴ RŸ A§e™˘"´£G¨ŬĜiû˂O.bĠÉ(Ò0 #"ğQaÒ™,ÏaYoĠCZZ Î>zİhÇLw!`ŭaˆË%ïùàx1dÁÛr_Úq*Ök1òW˙D‡Qş´Ï˘)gŻ€)̆ŭïoáċjuŠ`ǰ’c QÛ7(¨Hnĉ÷Dê/v}=İ>„¤\0F3Ĥ§:[cuƒZÄúeŸkW’°{÷!r>5£˜y V8µ~Á˘mşĉm-ĥÉǤ~—ĝ³cBÚBĞKQÄ<é'ÔxĊè´ÑğyÒ]µ.ġĊċ“êΰj­ !3ÉPùMèwç 3ŞbÄp KÓĵ ŞÛ)QÓ"áè²Ŝŭ ˜Ièo>g;Eċ˙S*)tdp¤Š•[i­{@ßω_Ŭa<¤\¨ KêÍÌĴ{ğ?•×ıċYžĵÚżR0ÇEŭ£ĉd/…ĉü°ŠöUàìE}UŻÈáÇ­ebJi1RûĴŽž”?ÊßS)}{q‡/IĜ´g |7ÎWMA’D‡yl³İ%ŠÍ}0¸÷Žĉ Ñ‡!?Iu֗X… Œ3-[D ĴĴ›êïNhĥ'½wqıġÓñMhŸ‹Â*ğjBŽƒĜ x•wxÇR…ÁÔßÓŭȃê‰Â"~î(ö›ï'ĉFûĜı­n,½ŜòÉÜ0qiĥΜŝÁ7Ž ²œÄ0ŭ+äcê³òr’Z^ž“ˆ‚̝ó˙]ÄgÚ×8oy@U äa„*´úd?yü ĝ í=€áŒóž&§6Cżcнh& ;9ċú¤×{ħ(˜ÍbĴş‰bżFšëgià49¤ÖkĴ°.ÑäրBÓx|›Û˙.àĞz9d‰FW;ŝ#úŝ&ñ“ĈÌÚA°ġo45}ê`²wv9ĝQùyîa=0M‘Ä1Ï˙,\° #öf?#ôÎ'êG°JQĞцÀ„„€bŸ_Í*8uĝìVV_À§˘-ĜċXâ€tG {ĥ‘èJÎ5}Ĥ€hêµ{‰Í7‘ bzçğƒ,–% ÂèOF)ı=Ĉ:ÇŻM³ú@Ô3rŞ÷€‚óşT%kù3hM §²êИqħK`…œ™ŸmdÒVĠ‹ċ+‚2adyHŝJ3s0‘{tĜöl3KË([½1Ëï?ŻÙĝOÓú3.lj†ê(°Ì€aŝÎLœûŝ½%/ÓçƒL1xg†1~FzĞ`5tĝHNÙW0Gmañi¤É½œŻPsŭyġĈ‘(³¤Py‚U^˘#“ÁF Uç ™q£˜Ok쒚ÏÇìĠÁyC²—xtĜÉÜÇF$ĝŸĜN#?˙ ĈèŸÉFù!î1ñ÷ç€Ï~ tšĠ_½ Dıê­§PĠ#­´³¨­ÇĦßh‡>öŬ-íGĤ™Jݽ÷Á›1dŠrb gĉ ą=ÄIŝ”FŽêú)|ĝ(+Ŝ:-Nô^LtÚșžĜœq…#¨³‘ş"A.ÁÙ;xğÈ˘dĝÙqŝ8şŜ]h—Ûg½żĜhžïŞêœOÉxX_ÌYş ô×#&N‰˙F@R=ò@`“É_ş)K§ÎmŞLَ=ŽhiO|E|ċ+ZH+wĜ²^-9ÀÚŞRe÷Nm³–ù[Á!ÀRRfj`PïàPÄug™Qĝ•>kڕB„Y /+Ú~—iÏĊfá—ñ™î+,™=Fj-¸eU¨ˆK&¨ĉ‚}êŝÙÖ×E4Ŝ]Îİî5xŝĥúĞ_=MQŬ?¤ ‘)›Œ?sÁÌH³q°úĠ˘ğáİC}U*üE°–<}šÒÌŻ›Ĝ}€*ċ*ÚŻwY ˙}XÎÁD`(^3Š™ĝÍÊċeK, A’‘ıÀ èÓ/2jL_Œx4,ñ”ŝ¸–ÊjЍì' ·FĴ#¤½aL{ßÚ?' -Œ•*ë Œäshù@*B™X›ê8@Ž‹ IS’µGÊ rĵîĵ½%Áy§|*íE ÚF·¤ċöߕòŠ.Cp’/"gxFöw’Ák_€ Àxœ³¨]U—¸ÊTĴ"pl%‡Ħc÷ĉË' e¨˙2ş\˙ ħ{–éäxċ°G÷t/§üvÄR„47ğvoò˙[Ê٭„qĤQ6u*À 9Ÿ Ġĝ.b“.ŸĜò>Ĝ ÓiÉ²²Q÷ò%÷ĝ·ż m”ìáġèéÜfòş Tç`Ë´;—2.eċῘ‡SÜ£ÚïĦ·˙Ğë)T ı-ĥߪœ³:k.ş”r°˙Bɤgp–<Ùíżž1ĵÔ!ÊW‰gfÍڌŞXıNüžĞ&ŸY ÓŞM¨Ŭ)üm`zÈiQ/(ŞòˆÔžG€œÁ9çŭUú’˜dÀ0¤í>§% iŽ„ÉSöR:׆ÄÇÒàiñ4úîJ’NîĴŬڂ}ÜĈoj‚cUĜ½ĉoB*R—l阮+´Âœ‰gpüŒğşpßTA>ş`ÏÑÉĵp{^ħšÉ9Ùàı ÀŒL}t2ċHá’ë Ż&ÓW€ŻK‡PħĥÄ(g™B°F;#Ñ3£Ş)­ĥ¢YâG[EÔ] wܓĴ Ż.ħÇ<ċAâ}tíR‚)%¤ï}eĤÔsĠ½ċeż7UÊx :V{F<„ĵsŠo] ë$ƒnÈÂÁ'áà‡ûÏáÚT9t³Y5hQâÉ£ÜÚOŭ†|ş şŽ@—Zî9~ıŽYnZ ²}Î_÷˘˙F&AˆâOö“ÒY™}çpJWa57{ѝ@Oi8Zš$zñ&YloġËóöŽá’h*ʲ7l4#ĵ£ Ÿ8Ú9J×L~8át&NÏ ĤĤB’˘,YCÏd× YĤÄm²Y³9ċݏW(hÌğ²;‚ßjġYÔ>.âÀf"ݵèp0°ùŞIa7lß~|U½3i W|'q~Ôŭ:PʑĤ X­Ú˘E°]³„ÓdiœâïÒÍÂòÁ˘š”èĠTq/ĥÜ 8jÙ€`٘HÙĉh‰ ğ5‚—ż5íta‹G?qF°û ĝ0À#ŜÌH:­Ï6™oŞ4 %˙C)­x[ÂüĴ„K:LġO ê9}‚p?8Ħ °ĈŬA͔`tQñùƒÊn™3#„ ™êG ûOÌïWÜâŒŜàȝƒ."ĤÇD Bżèñ\pć&Iİ Q*hm ÖŜÔfôvĉ°<üb%ï_á7 àA– r]ĉ$ǕF!ÑŞg+k̊ao%Kèì“YSÈËë{ê‹ÁÉk?V ŞŞëöw³}ÑÛÇĦÎs½i§n¸wĥtÑI8т"À`î—;NsRÇ +w§ŸÀġÈ[’€Ŝ†uùÓ÷wÀġ.‘ÉŞúÑʰCž”ĈĠ ħ¸ığñI¨.y÷Ü([ë[Ħlx.FàD*‘€Â¤°m.7ÀĤXbÇ ŞA™4Ĉô Ŝ%xs#ċQĊÈèËĥĊˆôÍ:V…Zĉ.+‚ÛݽÀ]òĴâh’}ÌjŸÍK›S2n¨8Żĝ^‘"Ĝ³ÀVÒĝ|{Œ;”àO³]İÚnì}*4E†\‚żMŜ½ŝҜÊ[û úzüa^TYâšb‚au³Äó$Ċ†Uy msÄGÌOñ)!Èî&Iʆ(9|f4jòß m„ ñ½Ħü‡Ÿ0Ùŭà`>ñ- µ°$˙c.çĤŸP äD5şä‡ċä vڅ'¤^Àßٟ‡ĉ}äËUsGĴ>‰;ÙÙɁ£ŠÜvòéèŽLߎ?yvsÁ€#şÀ6ĦóhE}û'/,h2P,3ÑPäQşï((;hkċ!Ôf]ÏîĦíÜâÖ0Bŭlâ^5>4¤€Ö"Ù c:†1f–aÖħ½ŜùÓÏ%tiDħ(F‘8 =ˆĥĵğ’OĊvjÛ<ĉŭˆ,*ĴDŒùQüĠġ(–ş²áÜĜeğŬN5à‘•]|*ÜZڊ(uQîŝ,İzT⅀,ê_jŒpd°—İì+JŬâ׌eüK;ëĈ>ÏüÚ§Çâ`,£g—AşްM+€  ½´BŠĴ&w֋'NŻéd°Sàt/Érâ$ RĴtî÷ Ԉ­îüҒ›“dŽä½0B{Á°×&Št˜ü™ż§#L:;ħ~÷!Ĉ‚eġĴñħLA§Ġ7„ö7<o-íBËû;N~ ÑkrFPŻ0û € ná9è÷%‰½{šĵ°…%X$Kó7bŬcvU[;ş8s]èGÏ*„`Ĉċ“³ÇµTßPu<×ı„ô"íÔŻâÙ<ŬÍ7‰ÓŜÍjvż›_Ż›^Âyvm4ñ"Sû) 3rğGŬB•&-–›ĥ£FŠŬ|ÏÓ˜‡œı9„Ó1O˙.ġ ´ÂB\N€a 8l4!wCÂ;ċ0‹şİ‘Ä1ÏòğÀjŽœÔ)³L’5vœrß[„Ò‹ŝ²;¤µg87l“‹*Ê<˘YŒW›A(168êĴ_$‰Ħ`riÂĉ(İ_˜§µU@~4î^XÉçċ‹T/°áı~˜'†“Ú°Ŝ~÷Á[ïóˆ€bĠW}edн££âŠ1$×ÉgfÑ?†!7Qi²X÷Wòrúžú‹)|5ì"PxĉOÁ·eîÎ]iZQRT‰ùŭV×ÛÚÓĈ §B@²Óp+'Ĵ<Ħ:dTĤ0*z À[6S·~<7ïô@/6 üµ71:Ú+ ˜m?ƒ=Óú$8”áâ€öÙüÇŭ/ġه™dċY½ Gޤù ˜/ϸéX²’oú¸\àÍH]ĝÁ#0ż ‚Ŝ|Ċ ûeíŜİİżĈĝlĜğ(2e'L„Ó1OòĉRŸ· ċÚÀ„ƒŒXH8…̃ÏoË “*…Œŝ5нJ· şqVuŻ´7';1™g‡iìÄ99Ê ŝ#œ£7î[~˜M.è6½\Œ}íW"úŽÂfÛĥğ8J˘Ìúé|†£wŝ\DQIW[£?NĦAê7VçŸ(ħwbg‹í˙˙t÷=îÙĉcí{ş+x4@ $#˜ñ­(ĜûÊ `u˘{kgŻîŝñrİ0ŝƒé0‘Ͳq7ÎĦÚÖÁ 'óB u] #І\aze!ŸĞ•­>Ŭğn™Êûh<(üv Cġl(ĵC Š’˘µûÙ}’ °?ı ż’¸;Óöî×BWÑW+÷ĞZ„Ïšè@|j4›{S9ǤY$ÒC}Öô)Âr†YoTÖı§`§£J{ĥ v9ib|Ê\lÜm1_ék.Np54MÚf;ìµ5›[9!{ë;‘ĝ‡ġŒ6˙ŒOsq²–à£U£)Ûĝfpݑϟt™úĵğ¸½9ŭeĊËÏ,ı´ĵ\×-ÎbÍàŭ²²°á> ġ ëËĵ/†AŒe‡>ŭx)öĴÄ!Töû”*<˘Q.CŸ;úĈsìÌ;{óÂÇ)ƒN'/Ž%WÎÙħœ£…ß`ͳâŝ=YOáÁ€ġ²KŬĦ" lÊbœ£`"¤˜SÔé³Ü ¤c9ÎŬ|ŜKÍm#NĤ$'´òíżƒğ)Ë˘ï˙|ŒV542²wEôcf;+B*#Qáî˙0ŻÄ7dĴŭ™uî?£/:Ĥŭ)if•äÜżOnfEĜúJ‡{\V·µŜşÛĈO‘s{…tŞ$x8F²,ŭŞê‚ô„'=ùı<ĴÉĦá1™ğ” K†Ü™%“ŝ£¸+;ŭ_'ÉNĜəÈè­=}%{Ò0z @ż„Ö9€`·¸HNd”ġĞÍ˙V‘ñpú>O™§ĉèżòxĉ…€.ĵNĥZŭjŠc^™ `ˆï[g²OS†GW }Ċ6̝-ċÊıEW s´sfÁ—ûÂöSpÍkS §IaéiÑSˆ0ŜtU÷ĦzĊ‡Şx³bĥÎ/`‘1·ŝÂú´ ‰KT’EyÙ=eŒ[öWzYm>/›ú>Fä]JžŽSp…-w˜ŜĜĥ-ìÓ.ĠĊĵıñóEhŒ %áċ´öçm€0CTS™0ۖ!çĞy(xJ Ċ_íLÏw;+ċŬ+9)ۈ£„”!Ì*—^;G*Ú'‘Ècì\dÌe7†p™WwŸ½"/ YŜ€ÉS4£A”˜QgóÊ[Má>ô%é3žĦdÛja˜ÎBûF7Ğû',ĞŻââQ|çi€7öè"“ëTÂ0~0ĜHËK—\w WZÈĞ#F?÷֓şğŠ‚Ò$o?­ò•n›–hbJA }‡?nia0’ĝŠSĉ²fž™DQßûôJnjò[+uâ%´sˆ:í¤éÖ¸}à3vIˆi†)X£UàïCĈ˃¸.4üdCô+äYşé!iöğÊÍ Ŝ ÈË5LÌôîö$T€Ħm üúPÔ(İW[fôÒŭñ´Œ qÙĞ<Ĥ¤ĝ{Ĵġ ĵ/Ç(8IÂÛµ ĊWdŽé áƒv“8ĊA†Âí^ƒ~5`<•^™$ö  ¸‰8=\Äôġ^C˘I"Òċ*´­ûz÷Ï­BĴw£ú==È˙}JĊ/ı˙w§UÒ2Á½=Ŝ’óİħĜ$² +Ç-°½Ó ‡Ş8r"‘+R9­;AÙÙÎşFġ~ù$|hŸOaüĴžry#î3ċv7s /ËúÜôkí(ʖ_íeœ-ñîÈhRÙTÌĞ]›¤ġxÓpTí[ÖO3…á‰%Ž1çë^EŠŻ+ôŞpżİ ›˘Ż1xġIċĝ7;™ŸFŻr†~rŠPNÎ#ñXŒ— ÙCu“ 2n ‰ žË”Bö1P„qS˜íĵ[ÀéTŠÜYĝAŭgĈ2™´ Àƒò‹É--$ħ‚ìĝNÁiÉ/˙sş,=’ġŜӟĠp0ĝU‰ àœĠhkú6:eH£˜ÇQyu_Áĵ]FIĊó~L ŭXzS•ÍgĊŝË<¢K†ô`¤)‹€`Q\PVRe6&oñKÈw;Ó*µ’A@ ĞjBàĦë܍‡ñE˙–Ü3߆Q–^!- –}2µÌOT>Ž•4}0¨$ë{{G.>mŻ£X“v&o _ɖgŒż½Q2KÀdxĈoµ§~žqH}+Ê7ĝ2ĥŠ*ô×]oyésHŒòbĴ‰ ĥ.fM²g#EñÊ˘Š*ÊëÖ\ùC÷½4ĜUş£Ù+ĥ-²ϖ³žšŬÀk Àäïf)ž#S²y Ú‡• ôCû£#ÜìˆŬÊÂ}óŒ–CâZ6ŭRˆ“ Ò‚̉#0²}ıePÁbŽâŠb>ċ^é½{S2Ç~wq²ž>Ĝ†ákI …>2fŞ›’wü_h>ñVTf7 …<1Œ¨ĦħWġS(enÈŭ'+s4ĠĜÊÒ4ĴD /~Ê\8C1ËiMY1GÛ aĈWt0>Ŭíùê9HÚäPôd|BófĤR֙ ˜BżŻHôÀEïñ§}˘È˜眉mÑĵGó$Û?w:(ĜÏĊZ:P=T³T Şĝ‚gî°L´KWBSŝ˙ÇgŜûg}35Ô÷ë%zû“Ù,T…‰Â€í•Cߨsîí•î^k§b÷­ˆfÛLˆËoĥü–Éħá û>ßڄ†iO! ĵ8v$äÜâQ D@?£ÛúZÖ½PéB§„ŠĤq ƒùŻĦ#Á…$Ž|FíÀF/7–ï“3œ 7§6I[k<6ŝF,‡ğ9=v8MY‡ÂÙßêÄ=&:¨ùhĦo´z›ÔùC[B²pê ßĥĈÓ/i[ É£oä8L eU۝–Ĉ>^rÎzKîĤVnĉċƒħ“m{à_˜4I&ë{@Çr•Ĥi›cŻs²=žšCóv­7>›Muo;Iĵ¸€ĴƒĊ]ן='v${Ëäœ  îġàĤ0âPŭŽ/˙w7˙wXßĈu1Çİñ”ĝŬĵBç|ÎşĴĤX{9·)Vt6O‰ĦÚÈû;@T‡z"É·›fYMWùaİ)K>ñ•gŝo¤£hJˆŻç½/‰'ŒŝTxsöÛ7!°7bġ0¨IöݽĜq”ÇJš(Œ}´j€_¨<ŠJ‡ê†Wâj)ÄĝÖVœH•½4ȋß5İ "5lƒëdʙĤ3lGßIíiáċaĉ7Ċ0$ŭÚCXS¤ŠgƒC˜.;Î´ašyŽDœŞ˙7IlVliUpŻĉ DPƒ81zˆvbeP˙w1lNĝ­ µvJ˙++é‹^q!G4³R[œğ84´ÈDĴOyF“„š~…ċמ]l?hXî³İ·?×9 ñ1cĵz,ŽjˆiôFï}:G·4Ŭ"è ÷ŻPß?ŜÊĝZ|b`?~#÷†Àv6oʐRd ĜÎRUĈ)˘™ÎÎ%äG9t°ĵİñÚ\àn>ĉPĵ$ÁëԇƒÂÚó l0È>Ĝ(IvH"-iË< ĞĊ™~áÂQ§Íf /üu–>³îh–”Ŭšî§ÈïáC@2ò6uÏaÜŝĊìs™ŻZlnˆ6• ,İ{|Ĉġ™½ĊƒŸcù¤Š7• ´+:ԌħK}üJEf[z•½ÉZ‡˙(5şq: $ lÒĊ_"öpĝ”ZPŻĵݏİè~Ÿ1.^nQ†á ҍ‹\ŭĴÇÇb ½•MIşŻ—fV„<ħêħ†Wży)ëŞ&JêcĽÖFƒ/ğôC%àókT ĈŝʜËŬŬÛıĥ×ĵ_s׍”^úšKĥƒ·›HüŠœĞ~ARé˔IżB„@ n[d&‘Ç˙RáaB2(҃  ƒY˜³a ġFmC×ròñIґ@+l€¸k”JžíûŒâ+2J¸A˘Q`ˉŽÍħ/L ÔiE~[\.ĥW˙K=–'xíğ'S üÍ\v$ĵPŜG½8Fĉ; Ĉ¤ì?ÜXêú´‰òJŜ­²oħQ†’Ô§İ2nŝ q5vÒSsOliġû}ô%¤U“[ċëĈßŝ\ôƒD—S›³uƒ§ħ@İJŒž*Ê@ŻÏÑSĴ-Œh´+à’{Ô\Ċ0cDħtt_˙UÀ9àË8ö´lı°‘ÜÎÌi”˙$‡.AüX ‚‡kħä4¨ËhÒüñ‹ ĜhÙ{ó)ŠĊŜĦŞò,z_%)?ŜbĈ3á ¸µ ŝ/=* Ên÷ż˘)ïÚÍí}ĴÄżĤ`™e‘YŞ5&£Zî=Uœ‘ÂğŻŠšù•+‚=7HÒ M˙#Òk{ögġûSq+§÷ĴáB/CÖù¤DĞÎ^ûô+zóHU܆âYxĥRċ ö H ƒ•ä’|‚Ô—dxkòn=çĝñZĉdèë–Àg0‘€mÊÇÎ$w§§²Ĵяyɳ}{ÒF‚Ò@+w“ÉrĦE,ƒUûċZ•o…?(ܜŻK>˜uM(`¨K~AìŽÈĈPt½ˆ5(£ŸżUÄ!éž8ĉ —ê¨İ9ż#Żŝ.ĦG™X,÷GSħŝ‡Ĵp]˜­ÏKcĥĝ3²;çŬiA›bà‰ ĝ½*§İSĴÄŜiG×fú1µÉ!ÔÌ5ïĊ|›;‹(8bŻ6LjéĠnn'Ü#†ê‘ŸĵJ6é—%şüjƒR/I°ÎkH€›<è×Iëj9ŝê쁟P:RDÓWÊ#Hs+ÙÔY%ɛ3e|nIë‡.cN3?µ–l‹húÁ;š%×ҋv€"Êh֛bvE^üÀÚYñöîÌ·„aa%ċx× nŽÙ¸ÏSԒûŬ &È|†€á†4ÎEÍ1żAhʜ9üş#b&ì3CŒpjŝĤbŠêžÊÂ߇é'ñtt,˘˙J@.qí;ġYş$1ÄÑîíü·*‘Ĵ²úxj?„Żöi蓏Nçl÷/p[}\‡gĤrÂ_‹{Ln@q¤žiê^÷̧}‰ŞÑóTNHNġRï ¸TŞŽÉ Wsd,,D£ ^d÷5mÜ˙6…ü£S=˘Yš RPÖìö˙;†kKè?îafk"î˙(ƒž~hŜÒlpğCjO9jġ›•Ïß.ܸž…×ʒhm–XB½‰ŭVL=3›ÉŠÍĦÙú½:?Zú“Óżö‹ 29”€PÀì?9L‚—JUtĠbL a~Ì%M°6•0%&Cçc—q0XqÒ)ĊN^~>¤u°jXX?xÜÜ51s-5nİ™"iJ *~…Ö´‚ĵpFZCQ–>EƒsĦœÉĦ\röçÀĤ&³¨@İaÌÀT½ }Üà‡xR3ĝ^Yŝ~_”`jœÛ†„ï]5ÇÙT̋ĝċAéİ“ĦE„ğq{{òdMġ r4i²İôLŻÇŭ‚Òzšû"Uïj<{⪵4íu ?ö˜Œ->B´Ÿ×ŻàëSÊ §ŞÌ[ÈŠCè.ŭ›Ì’`³ì8J5GžÂàLq·Š³ßĉ?ĥc?ä&‘›R7Jà;FbĤ¸äIz}üŽ‘UĂÔïqôMœ•ġÀÛŭÌ;.ğ£YÌ4ô&ŞËÒ{ ˆĤ÷ş Ç+HuD&İ,U(ş•>p.UŞż:E¤]4舟`@QŒdƒş‹ĦÒbĠ&&™3ƒ ŭI{‹tŒğâ&Ÿĝĝȁ•s_żÙß˙#a[ġġ½HĴDk3n\jÛ8Ë ñ2Idßl˘ôĤ§fŸŭB×0İHs:O8x\Nƒy„żÇäYK“pDk+膳^ŭZf’Ë…R#Ż LüDĦÓ ²Œ{E‡šŽR3ÂΒìĤìÇü,Ġ™HMĞtLeXġM ¨Ï2jĜg€>ÛFM%Š :%î(ı"ò:|˘§’Òßu5Öwn[y'iÂĝnsĥŞ‚YYšżá8WT%éĥ¸³'ƒ7E›µ€@ƒ”C:Œö3R“Ï^ˆÇB œĝ£çQ~Ñ!Û-ŽS7Z£-/d”;7Ë5½ĵqG Œċ*Oΐ!*óӝ¤öbĞ{9I™ħ|ŜŞ8Ä{pdžBD1ñA”D<Ĝı^N½(0†qÌS]1E€öeV—Sö{TašíŸô…‚9ˆ×LÏ|z&èDMhB8·¸}B(“Ğ çÂBġL­B§ĦèÇ˘öE@$˘X¤ü ĜÄ$Çċ&İÊeäñoÍ6žjˆzĞœîkTâ)eĈçÓÌ?ChúŻßĝéÀm–]„Ĉï;j2󃒺Ĵ‘ĝ ŬË.Bä]9ħAM <ënĥÍÜySÄ·7oĤ5FTî¤Tî2×`żÊBôŸŞİ:"(KoFžĵ̊÷7ѽ>aG MÒ 6ĊAòœ´{•IyĈsjïHԍĠV/?çš ‘dÉĜé~(#‡À‰XdÈ, ûġCsǒušTû àÙuŒ“Y! .L¤}CQ°ˆ·,ŝÒSY™ızċpßĤzİ!a!)G“2ƒĞPa'xr:\a*µk9÷çŝǰ)@$Cô:‹W·n9 VC3%½Wà§ÁÔ˜—½@Ì:Ğ–ĥĴëŻ;PȤŒš×g4¸  YHFzzÊPx˜à*;lċĞ[Ġî}ŠŠcH-—5›Í|ñÓ ŠŜ5·•ĉË7ĴèĞ÷ÎÄ/FÂ2|y@7?ws+re£B…!ͧÎ@½B 8§Ŝ!O;b‚ŬC‰@†c;iħgÂìÍż|ôŸŞ§^ŸxW·‡„YBv>â™ÖàÀ<ĊÏ‘ĉЇçÊ·Väh—Ĉײ–jd2/J,_”Y>şç,S1˘—Â8‚èT?Ë^¤Ż‚rÍR¤—] ƒ<•/MĴ!kż JĈ‹ g]âF j}I9–i5FŽıŒ´‰">ûùFä›ì25ÂBt² C¨gÜ½@ċ¸Ôï$rĠe/Ŝîbȓ$p™U˸x§ŝßĊATÍ+˙ ¨Ĵ­ ĵÇÖA Çƒ@Ŭà™GvŻ— }Ŭ\,Îĥŝߘ!eùġ\ñy>ÈZwmRНŝŭôİ*F,ĞP€¸Ĝgrhïâ!‚bv¤?˙j§cÚ  ³LĤE—áßfòÛ\„ ˙„ÄUB73ìë™ĝšĜ =ğVb1`ü(ÜàodßÎ%‰î@ûU-“]×hвwĠXĴmÚĊYžKçġmöÀŻ‚—´ı\˙vsÚ äUáċ‘ĥAı7*mäf ÂòVžŝÏéċuÛ­k¸Œlàċhü…\ñ}öazŝaT˜˘ ¤´'Ì FÀuGR™,´\òxhmDV7`³:çìŸÊŠ-ÌÀ+Ú0„=š[ÙïĊ,x'ÙQ!>ËşŞe‘)“¤ˆŜ=z’”h6Bì5 ²Ž¸ĝ܊6zr_!˙İòÄfÚ´JSo‘@ ş;'q-èĴ†ll1Ž^ĝ Ĥl›W´7* ìÛ,âÄ=Ñm Î Ë{˙`¤WlµÇŝ˘&óq's²LˑŒ Úş.[\‹ °ñ!›ÌË)މĴ–ŬZ¸è­§ÉH] Ù#Ħ–ÊqĠWTʜ„ÉÈÌÇmUi<Ê*ÔNĊHŸCbSš0ĦeÄĜ¸Ĉ·ċż˜Ĵ펣 LƒQ,o´íßѧϐm̛éŻÇj¨†ß=ÖÄÎxË!†ñômx²AŻ:¸O(½HìÁN4œ}Ñ֝:A)܁Fj2Ċ1!¸g0‘Œ” d0@‚ĜžhĤe+K@kÌ<¨ĥ?ëĜ=vĤ%ìĵ:{°fve^Mi‚ü˜.‰T ˜&½ŭÖoq÷_ ö­#Jïğ}GĈ¨ =Ί$Ĵ†Ccö½ĝ˜Żĝ­IRd­óÀ°9pìêıŻ[.Ž–²u̲C ˙2­"ÂnĞĊÄepdƒ—ıñ˙ •q{¸RWüЍŽf?Î%DÂ)|ú]Í˙>; ğŭQ1fP)+4UµcE ²ŻĊžÍJvx`ԉÜ=){AÌßk(Òŭ”‹µbĴŝ’~£ğRáëŻÓPb<ׂ$ù%²Ú“½VƒĦRèÓÄÌW;v:i§ùŬ[ÜgÉñA fş=^Ÿ„ÀŠ‚s” ´œĞ9ÊtixGéò§Ï,;*Tš;’èòĵ Eĝ’&2ċF_[7ĠïO‘µ<8 Ò@ÂÔzOżÑĤ-ÇYŒYç…?Èv/ÑóÀpœ^¸a¤â=éXˆŞ$7uÁ2 uƒ×R°ÏSUÓRµŬĠ´òš4ğ+3H>1~}?Û_áó"˜ßŻÊ­ÌËżêÄĤxĊ:ëÁñfƒÁŸ—ÙĝO˜)³“ì‡MÍ죰ş`ö7˙lfuAşn2. ĠJÌ_u[Ödùµx²½Q¨‡êêĊ²7q´?×R¨µòŸÙúጴS#DKÇLŬ7Nי,{dù6£ ¸ûLLë*Ĝĵ]mfXM›7ĥ/ˆ[^ŭ Ÿ´z¤™ UÛ×iŬ´tZĈD3Év~'dÊÚ~.ĠDŭŬ³5Žƒçú;ÉÁ£gc^ĝDkoíù ĝF3ëG£ş>˙ -³ ”*˘Ö[)¤M'.ıSöc”/ş3™Hne÷Ö8ĥöb]=âIÎËÍRU•OLU—r@ĥ€öh:G’@ÄĴJÌa À é܀À××J͖˙DiÂáZ*:g7†„)ërŻž5żûXŬ˙‚ÓOWËbÖÈCġĦâgs­ìö£³wr,ÙĤi~ĵÉ!-PçhžUNÓĜjş [ËŝŞv>clOOìÉ iD]5@+Ê%mš1ż‘›Ó4ˆĉŻġ}Óü#\”GÛ;³9Ê4`=p}£h wğq³ıĉû£‹é ôBÁ•ô ġŜ^’rş&ì–€äüÀ-͓ç£0’íÓç^Hš´Ï Fç HZÂï‘Ï—eĥ˙lQ­;.N½ÈlĥĞÀx.²+™ż`GĞ!ĉÄV :cĞ@Äâ7h†Şt͐qèj!oh}™}­‹Ï‚‘Eƒ.îz1h‘ï@=İ·Ŝê췞£Œĉžw¨“Ĉf¸>ġèċşûpç×|§Ûí,,"ZȵCñ3’^ċŝUGî²÷˜Ğ 6ï+4-ցMC(£Ċş{Ç @é•!Ë|áıï¤rúÑÒ~ +·KxDŝ$tF˘ìÓKnf:J ş1’W˜U³Ĉ'Ž$íû6R˜„>);˙m’üÜûíXXÈv̀)ÚÇ0_*ċÛeñ— w L/äà4ñíċˎ"‚Íêh3‹DË÷jÀߘ Ĵ0Íi˂4‹bIü&÷žé·YݸfĠšëë(áQπ‰½óĴáĠSŠ6dÓ-v?ĝñݰ+:Ž×x^äŜù2áë‚@gĈ:ŠĤ~Z*ĉl&ôtÈMżiòAßċ*Lî-•ë7ĊJƒ ’Ż=#ijĜ™‘u €àsš ù:êz†˜ÓĜèĦV~  L€pĈĝ`ĵ×ğ"mvÚ~Ÿ˙lŠ-´dȑ€qjm[Âĵ_4zóßġˆGñ•x‚0~ż£~Gl…8UBç0lA{RamMWíÈ„ĝN˙-ħLÑ4…™íŠÀÎħİĦ9Yjžég­ÇyàG,Äëúë’ÛqÏmca÷Ĥ1ùĥQ=*Z#€!#Ä(u³SĞŒÖ|ı(cʕh+­Ġb|udbR Mµh“£ê2‘°úĉ#‰Ŝ…W-yċ\J„żêTĝ.“Zî£`p,Ê;şŞŜ;#ƒĵ¤V&ß~÷d‚ˆ #4íç“›4xK’AËŝĈbÀ×zĉCÛK‰;ĥħ))–Ÿı”pËVûû^YÁÙ­+ó,³Çħ4iĤà$ĉÜóÊänW˘uĥ‰Äê M~'%S–ñ0ŝA˘JĞA/éicµĥÇ@UP£wMŝžtJ4°ĉ?{‚ó‹”)+uÈr‡9ɳ}á6ûé\ nù2P`êcÑDÍóş4‰Ŝ -÷*3&•ËŝJd¨ô+ê‹·¤ƒ˘wêföldŞĤg½$Í}Ë”9' ĥP58¸È ĈŜ³Da‹[7›³DsË\:€*dH’1ÊG%ÒÌÙ?Xħ0îôxÀ‡óâÎEµŞġ,ö>£vĉFTÑ'Vkֽ٘îß`ÉàÖg;ReŸ0}EÉÚIÙ(ÚĈ4kIŸvGÄOvZ€yUĴt{ĉĈşÌpœ˘ÒÉDZ R?Üʐ˙aTÔX m,u€ċOGSâĝ’?l#9yâÂÈ Íf;?ù4£=èrè'ĉŞ„ìĤ‘ààû%;8WĵZtÀNáċ6\öı i?ӊÀ2½˜pp‚Y•6’(o¨6(ó~ìÎ[ìĵU ŞYñ“"Y­p›ˆ?Ùö)8ˆŞuÍjì$FRGC)ÑİÁ´€m@ (qŝSÎġnXö3 “ƒ\ċXÀĠ”DDŬlĉYœ[ĦĴI@“P=ùí"x+?vğĤhßà0ÎüdŻCĞÔ(ÄĈĉ¨l;:x&FL Ŝ“Q„Ĵ”imw!­H…‰”$i³mè˘óuhWq?kùßOròAÒfŝĤfX<¨Ü’Á`O·.žÌßÉ<–/vƒ =”MϜH6Q…2ĉ>·Bİ(ğKÏ!Wè3è\ÓPŭĵ•Ĝ|õöŻ×4ŠMżĠj5ZO*O…5„Ïï²À¨ĞħÔx×bŝa”*óĴ I* ½êÓĠá=£ug$äïàĵ.ÊÓ/ŽAû=W[?ÄÑ˙"Ç,ÍD VLOü´mƒ4Ï:L ‰Â ²MCYñSëZ'TżUƒ'˰—äòY# íÏ-ìt 4áä$ˆ .;Üĉ³½JuzUM{·Pr„Òáòqy_*vĥ#9Ŝž¨Ü>$ĜPr™ĈİîKá<Ûô`ÖĦŒÉ€ï 7,şzñÑ7:2+Y¨ŻE26RÉNû –Y\d£ĵRށD sİŜċY¸>•}âŭRŞċ94ġHĉùY}ÎĦ,Ġ˙ÒHë:½´™:´pŬͲß>ñë½˙kÇîoǨÏZ„‡ÏpÊŻÔğòĴ^ >SöğĤ@P˜EATĴU6ëZ#^JûŞ Ëڄ*:cNİEó›Şlġ0ÍÚ5Êi˘ …v}Òï/KOwßş›Ċ§~_OÌnñqË8wĉŝB(@U+é@pWC´ŬlÎvË$Á,ŻÁ{ĝ–ġψ\š˜—˙n‘İ1ŝ*µ?öÀÓññ†ĥć¤ÈŞp@zkĦğ  CÚ·’Rkİaĥ6¤ËĜsTÊY3ŝ'ġL0Ò+Íy£ƒj9ä/ÍúÊ_oTNj1ñ­Š0óËİvU\"ş|Y÷@_ÒàŝsplŸğ^ËJ „Żž#ìĴqû"'Ù˚ġ›ÌŒݝîّ{4™MĈ;û‹‘Ó#{8üĴËġ 5 äÁ_TċŜqĠ‹o\eŠğ|h›û·Ÿĵmlµ‰Y1÷ÒĉèL*ÙĴYÍÚϙ×*ì#ÌìÜ£ĵá ·çlZ…n^ŭíò }ß0ŭ=É0ĝOód˞W,‡ñY]üp×Ġmiòiwés_?¨tŻÔŭúş/ŭZ1ú†8OÏJOGíî×öÑóáÚ§ġ['ŞÛTäĝz|?R™|—„žİ>v'ԟœ8Ċt+`'`ĦP$|”ž}ÁüÄ‚rÄey¸ĵž@‰İËÄù¤ÇĊp?D@×"µ€â2Éıœ0Žùxp²,#×ğ2ĤNşô¤jj[=wYH²ÁáżDÍĦdEjàµ{Èè<Ëôp¸…Ü>ğ™ò)‘}•Ĵ…fóx˘ÛĜ}Ÿ´q¤=Ż3ĝò™ ½#œp­Ñä?èIá˙ifO0?ğââ ĜĤìì>Äçyt˙ Oá™Ŝ£‘JoŬ”ByËŻÛbÍÑÎv¨ ì&•“‰Äêv›̊&ĜşKP–nĞä1£PéÔòĠ¸K”ô&œ£ĉ#ŒL„EœżSÒ ¸ˆ5ĵÚ1 ž"2ÑLgÍecó~Ĥw5Ÿ•,>è\’ú¸x9Ä}É‚%ÂÒÊ}ӉCDQ&+"@ÏbâÇô<ĉ§@_]ƒĜ=kĊ灗ÇDŒĤŻûì\`MJ×n+2QŬW)ĈHè¨Ĥîıy½˜w™vL&µp‹(X:´~ü‚Vi‰ê&>g• ’ï,Âs%Óo„ŜKY;4­sĦ3È·rÀS³’p Ár„eN‹n)i|3˙pÂ{< ¤ŜÓ&á Û0Ç^ÄLZî.çĜU-úÂ.|yĉ81h0×½äğ£w/ÌŜ0sÒqOÌ ŻÒ˙R>Èöpхï%$Ħ>C“óúÖ>ÎBrÓî9AÎéI>Q0Ĉ3ĜU""†9]tè ~íZ/ӖxÄ=ꜽí; Í›ŭF8–²Ĝŭìôюğ‡(Á‘0î2 #4œ•džG³ÍP[¤Œ” Ĉr"§˜Ŝ-€lwÂF$uK >ëK/Ŝî˜ ËJ3 ´jÏP›ħ|:.óí´…žĊ<Ör/3Ş™ħş.°0Hı‹Ğ,Â!JH"ĝŜm›ìô\] tí›,‹ÍDŽ)Ĵ¤QüßÔe.^ĝÄ:ĤˆjŸıilÏ  Qw/”âĴٕÜo/%;ñl†5­ Îêä£ş€Ï˜ĤiñD†ÀBˆžġôM}Y|öŻráöoäM”v˙zÎ2׋ĤF•6V´˙F8iM˙8Ó~cÍq§żî•ì}ZIŒƒIċi`NkĵôÎWT·›6ÁτNLŭ˘‚Ĉ\ ûɀµY eÎ3SòÇL@3ÓĈòŽmĠ@[êu á|+³_"8í˘éD–/'âòD)Rü`‘-[¨lŒCĵ Ĵ+ßI‹ˆïCmşî?‰ŽÈ? 5ż0Iĝ$)F4>šQŬĊâ?‘ óïv¸‘)P*´İ€ĝpŒ:qwıùµ'¤ÛfëŬ?J%´jLĞ+²‚Ïa•[şO>›fG â\ ÑĊ‘K…9hâëĈ·fT‰!Ѩ—î÷­¸v– D˘q_²J˘Ì"iËWyŠ%XŸİôU0O·ùBNĜE)ĵ ħŠ6ްˆHġd̘ö¤5fˆ1ĞX69b9ù—„A~ĴŞ.Vô!8‘ÓkV½•ÜKíkŒjÍïë6]ğh´Ğn ÷ê+o€ÜŽ&ÁFœOŞ÷ù5Ĉkh‘ÊQ ˆMĉsoOo&’ QŸ=îGU„Ċ&sn3˜Z ²$f²µ|0‘÷ĴîíAx[¤´@ùŞċ—Û%8˙aPŠ‘yüGvž5ñ£`qÓĝjúe‘íŬìÒ}/(ŝètš",”;\kàvu¸”b³B߄óœ`ó_q*um*8TÖŒ‚ĴÍtó Ÿ•"”µkè˘$ġl˙%ä/÷Úï(6‚eä‹çGüÈĞçŞutƒÙġ „-€µ’Ŭ€Û=ĉCa€€K§‡G½â3ßT@òkfˆŞaon—ŜG‹ô3(ĊÙ­ü8t‘6~›˘Mbĉ ü9DTF—á ßÚ}hm@"„ë÷ Üĥ˽íŠ,Ŭڍ£·İ1FÄ5§½ANNHŭžù†ŭħ0ğçÑèââgÁ‘mJ‘Aè?3˜Üû;J,5Ĉ3hu)îG¨Z3÷>örÈ$VĥùV·<4hËW†ŝà‡]˜É›=B·NÙú.£™è’ÏĴġË8YtüÑ/X˜fb3+éÄIe2™pàÈsĦóĠĝaYQêGÊ\0œ g€9†X£oוˆÄꄲJÄt2’ĊĥuŒÍ  Xž­VĝfxÓŭ€4ĉĜ×|§ÌI*‡Ï(  °.&pc‰~y#x˘JqGj}mêĜ§#}Òe/ÓòûĊ9&Ûċ\:ܟÀœ˘ŠÜӋÖÖâLŠĵĵ ÈKJ•–(²wU„Ê@?ÓÈ ‘™1O˙xݘ~gXTĴ=³nÌ%í›[]#]"ûb£ëQ*kì.ï”{÷wV:Z‚ ù‘^Ĝâ̎ jvËĥ·b—7µcú˜;Ÿ‹œĦZZQEÁġ˘yÈ=VÈŻV<µÛpĤ,OQİßĵ6Ñĉ#~á‹]İ…˜ş;‹ë>˜t^wĊ,3 g&Lé! ;œîİHpÍ{Êî+ÊÒ ,AD<ıWéu~­ĵ‡¸…€/Ink6Ú$d?+  °BÍW%5dUlÎxÜü פW” }î½emÁúï# á_mÛïßdOïd²6T—É{b0w6Eż2¸UàénÇğ2Ğ!İZ0ÜèD6e(ĵ ‡—)ĝß*Ì}\pĠÑçD|cżëzG° öüQŻÒžÔ û r1l´qÄv<ÁÙU½~?߅˙1!ħÚÍ­€]-hıYn·zÏPdğc¤ùÉĉS$ÀefèÍR²ó£dÈrúwĥèä²|›:€X뢒Tç”äL6ŭ@÷]=4ċÄ 1´ıoÚu0Éc}nÎE,ЎР?lŝTüA›¸ŭ@=,è½İ%².(ĵ·ĵÓòÇÊۃĊ ?Ž5€ÜÁ€ ZSĦ ¤tżŠàHĦ1ŽpŬÔÍq#LD—ÄÀ]ìN hl5z%Àıi\jES²“·—(œĵ8‡ğÓš%ĜbK*Ż.rF²Œ)šö4èÚmXW\ŭoÀv{+3ö%ž@$̧¸şBߢ.ÚĦŒ-Ş(ĠŽ¨T÷ )ĈdäĜ;‡×뚪FqáEöœÒĥÈDŸÉÏŻFjž–v("5EC (ğÄÉl¤G!ŸĊGĉŠŻeï{pËÎ$` ŭxzoß9)ZY/˘,w=úšiş²Á|ċÉĞbĞ(àwÄ&^6­Áŝżï† öNèg<.WUˆ‹â&ôšŽÖT "Í4p>“§òÒÁ#À$ÍrÒSŬ_swëB’Ñi}äeßo‰7ħŸĵ%š%äU4 8Ç·ƒÉ׈zXŜŝ}—ċŜşŸšöT²Öİß|Ònel$ £êîaċ2V?]ÈÛ67 i„œÚĤB_üî¤c0’é[£ĵġŬ<˔U>×\ÏñDzmáĤ­ë8ŽQ'êŜ"ÇuC‘ġ-ž R7Ü|²v9ìLMÊú†[KIĉĞ ĜKf”._ Ĉ0&lv_R+£Û \´×Ċ[ĞóċoĊH3V Ċ(Wĝ>c%Ġ™”R…¨éO$Y}'ˆ‚ĜQ†¸&‰E§íZh58‚ˆ?Ĵï†D&‚­ËÖÎ,÷ sԍÑŜħlˁ^;x:Ù á”Í£ p°U5:^†bĵÔZ•Ĝäcï:AXħöì²Dˆ†ŽEĉíîħ>GlüŝĉĤ6Ï˙uéfeí°. Ë(ğWgy–1ÖóÌÎE֌ EĴ/Á8ÒCŭÜĞptcäDm{Ż*l•K--9%Geœ›bKd{[İ´_ÑfçÍ_{c2Ÿċëuĥ‡éĊƒÍĵîŜÄöċÉè.˘ġE½ÙF‰ĝö6†Ħŭĥ,ċ̸ô ÎÑ íšĞšÔÚxĴúm{òAş>R5AÜ#/ġk†´*z€~BĴ‹ç=›1ĝR#gÂïˆĊIëËü^ëòóXżÊôôşĤpyA:;ĦîĴX&ŝs_N€ü°Żr­È ı\3µ½ö!İ0\ÜİŝS½Nêğ%-bqĜNhöĴôoÉ\°ç_sĈ#Ì^²¨TH—YÊ˰6šÁ‡e‘Z?²ÒĦNvê!AKĤOkğc>wߐ—Ä­?Kɤ“}ÄFhÁ‹È|hŞŸ§šó… ĴĦiñàÊS*U7á.™œBüUœñ]Š\Âä­ĴJŝòê>~r)îÊ;sK3)g£ B8ñ|_XĊ`ÂÁu’/‘  Ĵò”<4§|8tİ˘ éĉdë͞•ŜŻÑNôéW„P1ŻYÚSŭ‹n”9'ÎÌA)àğ4Ҍ™)ˆ> ³|ÎEiĤĝhˆm‹ôS})òŝŒuáŒTP Ï){ *À>>ĈĴlżÙQ]sÎ^ÁĠ}X ˘Ëa6wI‚ċwÁ}ĉ3̑^İĝĠnĊh }3Ŭ1nÌÜ'…‡VrèÍö€‡k¤jZôĵG›*óŬ½Ì}cgÁ\İZlıĝQï²úše•rÁ&½ĠFì{ԊĜ5Ëv6ŸNtšò=Eğf_r+™ Y4ŠP"}êioIĞ•ú}§ċĉ_ŝÙvxÑŞĉĤazTĜŬz%ċ -ž^“‰°4LVfVĵê[áVŻĵ÷AĈ§&ĊİÚPĤ9à ÷ŒqĚ7rĉhñʜfÖw“eÜÙĉÂÙ&!bFĥ~– —Ŭ´:jşñ×ûsħÌàrτê›WÍÄ×f[ÏeÖj޵_ÎjĈí ÑN*Û¸°{'!˙#g“pÈ÷Ü´TÉö“çĞ0fĜ›ÂaašĊRf ËSá œ"V“_ĝĞr˜ŽÄq2ßPèòŬveÖЉ,.ä7dmÛEužK&AR]è,7™™Xh€fN+*ŜötœŜÁÀX’<´LÓëġXt(„]—΁kŠ(§#¸˘€½˘U2x°Àú—³ù5·N .ÖĊL§IòiŞ]{Tp¤X›si&dŝùwùŒèM’’zuûïËË3żğäuéd´<8éc÷ë­ħüĥŭ*îJoħÓah Ë%äf r 0–§‘ÜŒ‡U"§\ĊŸ“w*~ z‘ˆÊD'Û=`hiNG›-NŻJwkĜ=eÍÜöċ”ÁÒÂ-ÜZ°ĜSËYĠ}!÷1p .A%Š£[ü2î›tĊéuˆ ƒ§÷˜qÁU4·Oßoİùzèĉhġ‚´ìeĴ[Ŝ“¨fcôŬĵJ?ÜĞ̇z fçHäV5ˆuÓö·W–Ê5ˆ'YÀ•/ ó=aéĴvÍNğéÍĦèĵŬ¤ WŽA/Ĉy˙h&;0`DÖsê×İ€_DB@żoŬ;ĤëRl­ž ôkä:ŜcŭC¸9KX›°FS!,$ŭ œ´ĝ ħڍÔrâû™“SP"Rż$€+àè¸ôr,Œŭžh`úêŞ6ü!‡$l–œ‰pññğß³jCuĉßYd ĵċƒVOĜüş—?i0’ 5ùL‚Öӛ`¸˙ ħñ}·w:ş½@edçeà…²‰ ŝFN§ìù„ɰĤߎUg%‹„´Îž²# ³`÷!2ïb]1 ŞŠĊ^rĞ‚Kzk6FAúiZ Á@]ÓÀi N˙ió³,ÒlÔÚò6eĵ§UèǤ´ÌcF Ħ)#G*Ž8²O ´vÌ%@gš:¸|›ı½¤|f^ËfrĦeÛŭÄ*}ĜÎÏê•Á§žiúàĤJ(´²·Ğ[5óî-›#‘„Ÿv /âD9/I‚t˘/áŞü2"÷:`Ú.`ü|İŒ„ŝ1Ï˙.ġÂÒ7×VÄJxbDŝ針Ŝ‘™1OòÑM9éÍB›4É#WiÀç-ûHkZ›[RĉŬНôżÎĊ€C2×Êè˜hCFhVÙoäL6J)×䉵!û‘ËĜĈfˆğşo•Cx|qfó<Xo)ġş›)LâĊÜ8 vI, UüKĦœÔĝĝAÈ>D9fòĦŸv‘g÷ħe\Ár”yÂk·~éȕ•Ÿ“·ÏMžŝâ˙‘ V-ÀÒ Xzip…ô臈מ^ÑBétX]§‰ħqż.„ëŽĜ‘3§$9TÈZ8ˆˆœê{Ĉzû :ÛĈç£ÙθàèĈ•îÛìœZĝç™!P}'żöy\/\^<ĤÀD|ċë<fb‘ġ ĠÜ[•Œ MÜGnĜà\Íħ ž6&9T,ï•[¤Ìm£QÌHq¸a™6¸ÚQh.A‘Kzċu[Ï,m5)¨o‚M¤Ó˜Ôòġ’x—in)ĵĞ…pçÁYxöKûp™xŸ¸dÓŬv7­O|ùM7‡YĈĝ_@zçĊt}Ò/"zà~żá;½é>Üu;ünfÒğäǎ§ƒmûÁúħŻW(dS˙6Ogûx.ĦLFĴMóÛĥËeˆĈo–PCeOsßÛ3™JşZʔÉÇiŞá +[hvâÑvtL!¸Żêr—1#¨şY×|8ş×ŜŝëŜiYSc§M2âż3ÛëO¸ġ'tH²d£ş ™öw­ĥÑ×Cä͊փ*=t{ç ċJ(•k¨ŻşÈ  ;uü£ÂC ƒ#üY\*/ŠclPÚ@:|HLĊµyAÎŝ ƒÀЉ§Zĝ ‘ÎîżĤ/Có‹÷*#µùŞ~L—ŞŒm/´6ğ6?cûÊŞ›’^„ ‹{PwġŒ˙>òÄ)/ĝ#éÂÙ¨ĉĜSb‹ž7ĜHíK<]‰|˙=žñîEŸÄŝ!Ÿ+ĦÀçÈLIQcmì€n_Eyĵšçô`´Ë•÷”mE‘1ˆë’QrÔÁı„ŝ1ÏòĉRŸ· ċÚÀ„ƒŒXH7ú„$’ñŞEzÜŬ½œ|gĥĜm2/17Üîx¸!§Í‹aa²°{)çhż N2hbİ:–ÄJv EÌĦŸ¨\ÂTÒÖq醍£QC‹ĦĠöÀ5ED…Ĉ<XÛíe‘òġy8b$Y÷˜ç˙FÖDaf*ġĠ Ñ~˙i¤ásâÎ5×琓{c½²²5,ÍlRċÛe˽\7֙iâ3ĠòƒĦ˙JlĊş[;qK'Ĥ×·„lŜtj˙]) H„‚eÙLäŭžë×܏ġ!¤Dú=0ÀÇB<³Ü3IDİ[MÓ L>¨ğ s-͈/¨ĥ7QÛ ĉÎ )“Żf…€Ÿ[=§ËíÇ4x 8ŠLhâÇË÷9í˜'âE˜ú‹ĵÀDZÊ |z0cáŠ,-(L‡ƒ1´B#d0Sq·Ö†Eċ †Ÿ ZŽËtšKhìK'÷§"İJ†áEíÀY†)§_ş£cĊ°Žï7‹BTtUMn,uı’ ëĴÎê#oĈĊĦĤÔ" Pİ#-’8^5./ô\ğCÚE&Ĵ톝PÄ-ä6ˆŜˊ£tÌeö¤od-z,úĝ2Œ¨BÂş²Ëi\ĝ’}DuÊÑ^dBîĉë´iÏFƒ£ġ3FZ“ĝïYBÄp}Ġƒۑd·3ıî9§;&I=Q]^}pbƒƒÔA(_qñSٝŽş]¤_— Ĝ5T3ĒܺĤtɧĈB€ïΗÒBò–ñS4Qʸ³(ï÷;'j|ϒ„ÁW‰Mâs–ÊW°H X`}>ǧ[k+ÊXwŸ´1v<ğ\½a)ĈĊñXĝXEóT˜ìs‹=*œ.òĝNN­M½?!*ë0¨Ôú?gR´…Ž´ :úQ'ĥĞ_Ħ1",ö¨Tŝïa%èĜE°³à™ Íè"J_ü£´ıùıĈÍeÉ{˘w˘$,ÔÓúví—•ĦÊäf5'c-/½!Ġ3_:bĤ2³·6T&Ÿ.pÁġ1!‚5]Ç WÖÇeW2V×Û61!Ní²,ĉbT L&$ğ‚ ħ)×]-Ĝ p½áBfŸXéµ³öéR€´ VòÌÚôä:Äv2ﳨòkċĠÄÇVJ^š`ü7ÙCŝÁï]/òÖċe“IÏ.7‡˙AHcb!˜Mż`T ûâÒԀl8‚}gü4‚öç0(ĜΛÊY#wtÛ,„¤·˘òl] ÎĜ§äÚgO“Ġ8V ˜_G Q\ù€ġŠ–‹Pĝĝ£Ö–š‡>‚Á­Ç˙XôYġV‚bß']ì!˜ˆLp}“anZ#DÍaïq­;ħŝf3y¨egÏOz2[ıì&ŸÚ£tbùߓ}äÌŬUÔêdżşvyŭʲÜ÷–IÒŭYáÈĵfñ%À(/KƒµÈUr…²½'i·}eÊï;2ımk + AĊ6~ġ5ZÂ××[„ƒêW§ï62‚CwĵĵÓFêRt”\ĞtözÂèD–áVüÔÛÜ*Ür—ŒÌFĥ÷)|qiWÍ;”cê U€”96sñÊnk|ÖşŻMH|ÀĠ{£z­*é3Ô"w|u-›éWññÌ<˘b(ä8BġˆÍœ L°_jÉ"üEÏŜğ@>Ĉ€JRJÌŬK)Èܤv$Žü"V°ˆl˘û2 Áٞäĝĥ òÜ²v£ÌŬĝ™˘r¸ë?ȝARGjöXtnıùù0ٚOż%ĞZp ;—¨Ğ°Ë‡ FVġéúxXO1A”ÈğÌÏÑÛçfP•èvÜW‹ÈĴ•‰&Œ3aÄı‹^èbĝŽmH*p2ħSA‰ÎĞb‹Ñz>+`êYíĝ …ĵ%AèÀë§·İ*%™ħ [ĜÚ"ü7½ċÄâvËéÑUŬċ”vG)ÖĤÛkjÊÎ"bÄܓŽl÷Ş#È3iÍĦË~[„A°ÖaoRùèšċŬô°kÌüž>ĵm4ΈŸ$uQü _LóPúÀ /‹„á×áğ—ÇÙŽ&b^£Żp²Új–ŒUԃŬ6F8İ`dJıĴ ¸à³8uWĵÂġfäBÌĴö½ Läp£Œwâ—NVn·d~i%—JŞ+ŒpŒ°z45³WDJgûa˙FtË*l…3m҈ÔÎòjtíF'0£Iĉ6ERa´Ò³Ġ¸½j‰í•³pšÌ !ËċĜ3A^àÑ6ŸŭzIÇva‘ùTœÚrÈ*ç=hNX¸›D˜Ó@²(qûŜĝ×YÈtNĵİáû(ƒ aÎ6ËZèJö–4Á>ş³ĵûIgh‚+%_†ĥJİüGšÑ ì[hNO Ŭ-ˆ”·wpPN½3Ŝ ³dUË"‡2öı2 P“sä{dQ¸Ĥ ×Ó½&ŬO{u,JöZií=ĤvfwkEüߗ`ïòpş 2Z²?ıĦµ=2l_9$˘ñÚ+‘UÑ´-­ż¤­n=áÑö[:MáşÓÊx·ÈëÊ-ċÇf-iL˙5€qŽ Jœë÷ıîD•xßû}M2èĈù÷µ§#ŜáWë·żQFs´LZiÔhÀóËyŸÔĦU[gmqgBçïÚîڔYİaġ z>6,Ë£?ÌÙóÇÇfĴÌşôìà aŝ£ Ġ–ŝv—- 3Žjˆ+Dr~¨,ÓܛêqéŠoçĵP›ĝµ2'û.üCà}çώĦ(‹^Xay‡?#ŭĠS|zI,Ğ{ˆm—ĝNÚ5ÔhZ˜i²÷<"YeĵYĦ§¸+@Ĥ˕úOeĊ²¸ôÚuI|Ħ s1a–+1KhGšŸ.ŸHŻT‘ÜoJ1Ĥ§‡ÂġéiÂM{Нu3ù(L&1Żüï2%ğäqşó+gfŒ˜ż›JONÀàŻÑJŝR1˘ż¨’ÄÖĝ§*G*ÛàÇĠ°‰¤Ó£yƒîV=¸Ĝ„…Lß´t0§›)ġxÁ&×e òJĠVl ğġÎPKġœuğŠ÷ÈŞ\ïVP–?ŠÔZm˘Žġ×|˙#ŭĜM2OóĵÑş sµ>!’“è17x‰(°ù NP MÍÇmv²]c ö2fŬXLú½‚lĤ³‚a”½B^ÎîfbsôNìàĤ3ÏïN9p¸Êç`-Ë~àŜ´ğ'5À­´!gc$n´ĉhŽˆ6öĦŬßK&3úĤX)ËĞ8C+·ì# ·ŞÊ°Ô4cĜjĝ—%‹³ÈÁċÇÛZäŸ`ZzĊ§ä YÌéÔ­Ŭ9Ž%ak­hğĦ•lP É&Ê´y‡NŜ×ÏĊƒıLżAìWxvı&/l p1xʆEżĤ°ëksİwë+ ċI½.;£@8¸ëÒ ƒ+Ӎ‘axŜ–Żc=û,ğàŽä'í€KWĞ•o §›˙3XXEiŞôžTI$duîOĤ‹GŸ‹Rŭ1/´;ìĦ‰,Äs½ÑNħ\6`ÖPUġ0šû6JĜìŞ[‘9WÇGO?§½Hp:J7=ÀoÄ%‰˙ŝ­[DèÌ=L?ĝü‰Ĵ_/ŠG ŝ$?è%[£žÈ’!]$‹â^îÒşÙ.,%AR7ÖÄwżôcëb*o'4ċ–n;G +ĝ%a­œŜ°Ş’QÄzYΜÊ} pÑ2é„éšßtwÀĦ ûXġA͝ŬŜËd5ï(İ˙l>ŽvÀ‰„D!=4…Ç[0şdšħ.”D8-²¸2LmہupĴÀfCÚ\G0o?.NĜĝÌ))˙Z¸ŞDġĉüGAaëNLHÒT0bBúUôG Â, 'B\[äĜPÑQ9c‚ Ğ|0G‡ŭm`›İz~(GdÏXyñ:p֛Ŝi쨚(FŽ0Ù\ìš.=‘…H^O’ÉÚH˙aWġêF·´ĝ]Á€Ħ‘Gbëĝ.Qç=ڋz%"Ċ v}£BÓZ"hĞt ^*lÇEa+]ġĥG€ÚùĊŭıpé‚Ïbo„·Qs+ڇކ:•¨ĵ˘?~ddâ;¤mïĝî=A*C:nçRw|Ô]qêÜL[Ïr6×àĵF|…Ğ7 ĵ?³ô<+Psħó³ X9k@A'“½é²A³šğN­˘lLxÜóŒKm&@ûàÀÊèÒëaC(L£ÊĜ˙²Ċg97‰~ 'tmzwJé™ÚŞÈ§˙£=âßδcŠf<Ŝ‘ÖÖ TßÉMw–цçcn hO³O"$Â틧8ŭ,zĉ ÜċЍÊLö.ĈÑ˙\W–]–˙àĜ}[K´´CşK˜ĥ›ŬĴ>qa@֜ƒ)Xg£ŸÖŬuê3ċ~ñ„ĦSn‹IGÔÏĥò!ıX8}Ö~$2t¨AàĈÚ·íĠZh¨Áz[8ò3l8$” ˘‡'ŸRPcIi$ƒŭ1şğΛ@–ĊċÏ`d<‡'$ˆpÈв]k”uÇ }‡˘,>‘VaÏ>œz ëı Mm‰yèP@‚ĥY[½RˆÄgyÒü™-­wcuŠÖV"‡Œ2Á͏8ï"IŠvä·ĜöîTCĝÉ vä@ŸÔĈ@ À*K˙OIžşrçÛ$òܟt[ÍÙ²{ĜŻAè&ZX­p01ĝ½P`*m!Ù0@!èpKĠ6çM=p<ŭ!(Sò‚q#ìVrЉ‹ĝ;<Žˆ 0|Ciŭw­ ‹TE?‚5ŒEĦôĵžŽ˜͂:ìİîĵ%"ĊbĦbìS ƒ}Ë ”MaĈğëV$a´„{ë´Ò>ÍMÄBĞÖĝ>:)Hâ]ù _eY áNi¸`' …ë›WLPÉR(W‡ójĊGĤİĦAµ9Sµbd]nú3‡$è—ġzyíU:Ú8•zASŒ I3@ÛŻÈ\5>MË-ÇbeÏJ·;çií*g3Ç)0%sJ½-. ĉZ_+bb´ ԙŝÑ™Ş8ÀŽ„~PÎc–èŝnݵN°yĝgr|ıbĜž¸òUà×!Ġú_ŞëQ`ô4uùĝi)„sç}ép+zPĜƒÇ&Ċw€Û¨FwVş›2Nñ½×˘ÍJt}v|Ûż5ٜşÊ1ŝÂ;‰š½aüCòis <2?İq#ÀĦ´2¨’>Ç ŒP’*^ċʃü҅ĝıĈÂU¤6ËUĤ*Ĉ‚Ì_­˘Ê”e%A “ Ŝĝíùċ)”ŭĥñâŠw ë%}) ġ3óXcıöD“½ßßŜÍú6’ÑC´¨4y•ê"7,éUÌWpo~~”œÈŜ–żĊè!9‹%a3;ħÖ²Áŭ›Î ÑfóÄœÁÈĈQcŸl€$p“MË ËœÙ`Û?ƒí–J––1ì™Âf0 óċíĠ‚p‹ŽË`ßuĊTI0óıMÊc‹éÑè‰ü \Aş2`f¨Ä2Ä~ÑuaA+´Ìh3gĥ)dÚÑŜ§P%`Á–Ĵöö–ĵ„OlÀAÁfhëš°9Ù÷bhé9KÑÀĉ" ñ{ñ?ĉÌ7’£Óa¨ cAoX,*á0òŝÊßÇ4*ùÚ=µñóŭğ÷v\èWŻ(ÇH à6N­/І7qÈÑ몊'ŜŻ>]Î8еaó!O[ŭÓ¤ê_ċŭ2KáÜĴ£ġX.;é§Şë$OÑ9|m`èğ\}9Û9`žĠ·”ì›(Ĵ¤nŜ"@úC™âé£IĜTŜQpS˜Zl ıKGi@Ĵdµ­H$ş³Êi2ş?éEûédôN֏ĈÀtçzz­ê*+ ;§2Qvü·ŝaèVíġÜ+sfg1qO‡ĜĤlŜkUèZ)0ÎbC{8ĥlôŝ€BÜċ$қÇċwĵ_2áĈ7²ıá듲 Ӂ%şÎH6uçëìüù~ÜEeo„KàBĴ°şĊnaĤ²³ó¤4x:\Z£K nçÍ:XĜ–A6kčIlüÒ÷-lÎôïÈÏ ­Ö#Í"'ĴX›n¸¨ƒŠX Ü hò‡le&ôüŻĴ•Ħ5…³´?ò#hÒŝ9˘FIyD€ö!ÀAJ”-[ÒPµú—X°X>ĊÊÒ‰Ç?0Wż0.{Ñ@ż_*é7ħFš p\ëô³*µ@#ncrñġZd¤š’pN?ƒĠĠ7wÄpŻRÈĉÇ5šÂjÎ2ƒ˙~(%@/™HMĞtLeXġM`İÏ2jĜg€ñiOn.\5ä+ì”<³Ê0QTóf§ÂB_Ÿ(Ĥç °I½Mû§ÒÖŻĤ Ş;Ô>½N>n+g£ċˆó!#ôÉۜ§Œ^&ġu½N?wŬ ìOòâ–dššÉÓûŸü´ħĤEÑ›,ɗh8ż9Â1b İÛà"~ȃ=¸í~ Ŝb-ëĵˆÊĵ'˜˙J@>³ œ;ĞĈDöµÄ8ëòYİ˙•–¤ìĞÏ,ÌfñHD~aB„­ĝß RäwıĠˆ-&îUABÁš÷ ‚#ż?/ÛÏéħ–;:ËßĜ~ßw? ŭŸhú ·›†ÙïÇê˙:2á'<šP¸ÍĦ„ž“pİċ9Ħżĥ§ùGÔA÷‹g¸M°*QB:“fSJĝ”ĵ­M ˘I›ÑäĊ" s0É`Ĥ˜äkïĜL£³÷µġj ħ9êÊbÈIûÀw ‡K{÷hZNÜÒu?v–ƒ‹Ĝ"Œ ċ—Uî·’=wĊÀVĴ{œ˙xŒÂíá'XĤ/i èwô ¨^ŸxW·‡„YBv>â™ÖJ°‘ü —b-Ó SÓJö™ ·mԟĜ]†‡¤1Għ‘ċÉëòH QÂ]BSC|Ċö=JSn:l§tħ‡$Ñc9ġÇĵàĉ}êŬX<Çä|Ġ¨J+['™Bêòú>”’{VŞ)ŭ¨ħıFqġıêÇZcKŠc:˘Q`ŸvAàȵÀԛĵĉk½A”“ ıWŸ{¨šÜÜïYP EÂİïñı 0)E?mhżx5v#IĊ¨?ûx:3áé÷ô™{5 d¸› * GÊ/iĜ$,Y?”ÎYVëë ÇÙäúà1  (ü£E‰£|IŞıĴ3œhY‹ŝıé)ıÑ–R ÄËíáÍ2D6ÊbùQ™†ĝXâqÒq:LM°çĤ{´Ùäši½6ĵCŻĵ[Z šÌğLĝs”Û7;œŽ:‡nóR-PŽ ŭÇĠû)NqVş“šxrkôüp(† Ž-ö ˙h ­ZÙñŭÉ}ú›Şdœí=4½·"Ħ²½Š½ċÖ˙:q/ í7üƒ9ìD%³Ċ´ùlhóËĴŸ6ĜÜì9™ÚŽDÜû“áAo–UU°|…íñFÉW˘'–e†îız_¨çZ÷ASv50qkt,kSJŜüwiwü &ŬŒÀƒ1d4“YÏè 1Ó`oôqĊvê\“HSğîWX]ŬIÁ·³äse›=;Fݚ_€? ӛ°?ß5‰;ÍÏ`ì,žİ\E’²@wĵ3@‚ż.NIl×Dé@Oħ82êl¤Ĉ›É iò\˜íĴQÄè­&nb _q˙X zò;l8ŝĥi ïD ç/"ܐˆĞ¸ôkˆñRÁÁˆÛq-Ĉ£Ò™Í™ #ġ—ËËġ@/:W\-·/•w~z2MËñ á{n⃙şîfM€$ŬJĤ~p¸ ,ċĜí[˜Í ?+{ é%ı×'ҋ!OA£~Pâq•ġÎÎY*ם<*!é_¤ġ&È÷ч ‚ŒşòqvÁš~.1ġĈĥÖ£Šç)…()khù°*|–żanaß2bYûkˆŜwéÊŝ²ş° ÓĉlHèñAob‡İ–ìh‚s“j6žwéÀQÀ†z½!%Ԛ@Ĉ,ê}"'hWPiTWÀW8 ŠÁħ:íŻY Ŝ£ĵ­úmÉ ³‡ĦrÀH†IE@M;O M,Cîô;Ÿ$ż¨àZ(=e˘ŽK›d|ĠöBpì8I "6çÂ6Í q”§oķĜ„xÅñÂĜżŽZ‰4í܎t¨½lF]MĠñgF7šy/‡A E9ıHQżiğ&YĜ}œXt a䀛.èßRó[òĊŽŒYñHĴċœËŽr*yż.Y ÍşĦ‡Îġ³>ç#E/‘¸íKV|şWJÉM· ?—ÍSùhMŞĤG¨`|ä}?ĤÎlşVz6KŞš·?Ğ˙uì´!9]Ö˘=x2 ^ ġ{ì}È*a€œµĦ/QÏN­+J#Î969ċèX&“i|bL[ %[ŞÇw8šßu7³Ñ#uşÊŞ! mO2>Ódöß1ĵi ŸòéNq?–óŭ”ÓŽ* £Š-¤ïQ·ÏÖKıĵ ¤ĤO\ŽH-ž<ĈDŸ ~w(ÚB8ˆŸ/+=—Mlˆ/Rêö-2ò„Ô‰›„}Ú ċĞíô:€wİÊ2ÄË{y‘ĝğ=”²°‡ŝm/ħ£kıÎU&ğ˜cOÙcÌB m|ÊÊ gĞK+}Kx*îĦ˘M%Şĵ*OÇZUiËşŜ¨*/ g§xë%×h~Ŭe\½Ġ•d(ß×\ġ³Fŭç0„²ĤHZĊ1bSܧ²ĜıÚi%Ğ8:ê`‹Sŝ‘ĝ›üċÈÈ1ôÀD1RÉZ£‚NeàÒĊ‡mÓl Œ˜önc!şÜéƒ`™§ khú@äxéjô§6ÁÍ6VxĝcÁı‘{ ɰOċìŞÜ8ZʄzÙ³ˆ%DUbŝä]‡ózc/—ñ¨…X¸z8ħzّÄÂhĤż4‹.…w&5NBPd (ƒT‘tşġċoz„ÇÙMğêı-sdşeíE‘Ò„ŞĵÖYjXuċ)3Ù}àSP£oĦê„x„”?PTĵÔbî*_c-¸èkœĞÚf/ °hİS ½¤¸íL*ĝ=N`Ê£Ü=twCú„9JYL"fżşښ×ğù÷Ŭc Œ(|<ŻĜ…5´fÀ(-5™ ğŜž]ïGPú‘׈ôf¤Úûß!6X)Àñ=^77S> @“È] ÒÔ\M-ßQĦ# €dè”sġ‡ğú+ZË+ú&ƒ^]ӓŬ“Ĵä›ĉŒNlDìˆÄEÒÚŭ/ëp£~Ĉb֎ÛîgeI˙I|w¨MÌ$#ٍ̳˜vĊìŜíĞ-)öĴCğÄCĦz/Ó ×Êĵġ"ĥ×J{ôáÍ%XŒÓm£Ösë9Ul“a^O7 “Ž‚öWF%ˆĤÄò€,†ê%H1òĜŽÉÛ9r ĉ:!˳N֋d?Ĥµ²Üŝ€u{£‡su<|n×R=,†2“ßpMQ7("C€ž‡wZÉpHµ¤ÓbÌçñ‹‘ Ĝé §&½.ŒwƒlrêqfÊġ¤ÍŞv•wäĵ²Ä{âîb£ 8Òŝ^Üĝ\œÂĝ‰…g“u2Ġ"àól³ĠµŝTqŻë*ŝCŠùHÀp^¤ĞnDÏVS`ô$‹!ŭšxA/ûĵ5 úWÏQ™uSqĠ?ú{XşÎXO÷`ğ½U½¸™¤ï+ü§a Œnh€âßŜùżğĵLvRÇ ÑB²2ĝ%;iy”$ğH8ħœ˘HNööBA˜ëcäMÌYŭM!m^Ĝ9·,é(@ŜHe(AŻċÎİĴ6N’TX úgž$”W,R/¸äĊ ş…˜ĝ²ŝ÷ûı=?hLaĞ(ïş°*YċÔ-Ĥ"r;oŻeĥÄpôJÑ'°ĈŠEĦ˜êsS1Ïï{]èşß$ĴL?XypCçR·œ†—Ú —!÷^“MĥÜ6ĉ'tŸíĝ,9D^v‘aĴĤ\)ğŸñ”³,îOttÛİÛ4)Â>Qŭ…È+*°Ôo€Ğ Z^ĝ‚}<ÜÁB£MP~ĵ·ĝ‹­ âĴÒ]#&ĉ°İu}ÍŭdÌ8ĊËĝrÒSW=îr™Ó$‰ÖK_žIJĞ8‹˜³é7úÀCcĥÈ·~³żüe­ç2nV b TüżĥÛüĥ=ġ”ëz‘|ħ˜<­¤âê˜É)qpéGš0ÌÈXLJ–ÓçĊ°'EÚÓĊğí?ŭ "Hç֑•"Áx O<ŜtÉuR\§Î+ĥqPS +"ö͖[³ {qï@PĴÉ]18Fĥš†ê“Jç[ŜT䖃VÒA‚ËŬÇpêĜsâŒñäS<ë .ùL—°–`ϽÀı yÉsm %§CìÄ3 ğϧ ` Ş}ċË Ş·â1#Ä-T8ÔU“KĝU´—›·!Lá­c›ùn8í Ċ#(ŻùÜñîaì;d½…삞àD×-ÙÖo‡ÚžgÙ<ްë¸c£FÊpá…ïU 6ñ<ĴÓ ´Ôİ3–Y$j-Ç Ċâ NŸaN”ü@Ku†Í´ÚĠâclۅ^òôVïżµŞĊrîñACêQĥÒ÷•‡ ïJ7Z~Äls$$ÉÖà4żÔQ÷F•Ûà,VHExÖL‘ĞĈĞċ߅KÇç$ĜŜgòĴHc°É ž&> ˆ[Ë!ċqIìûĉN@ŠtìĠŒ…˜¤q–ÊM^qBœKÒXe˙dv‰@ˆ2ĉwh{fŻ^}¤³½ĈŞ­X­ ÓÏc˘d£Àbx0<ü™ñMckŞâĈŽSf´§ [uSû{$ċU­@GHĜÉïXÖéż?ï° ћ‡ĉ9VäӒżœnNàXĞHê(˘}/ë|݃“ĵzúñ½}ĝÎ/ 0F’fĴƒ'Yë·5ò%JògqQ@~ϒißM“ĝ˜ÙÔ×÷GĤ'i ŝ•`ĈMË^Ûúîµ4Ü@l*²áè$N5šf"5Ìj%V´ċòE·Íô–y:<Ç9ż˘5¸&ışÙ‹ÇŭVV!~À IÏBHĝ ˘Ÿ z&8ġ% >is­ĝ/³Żĉ™îFm +{dtÈPav­İŞjY|âIÀ+ġċX) ³<Ĉ¸- i7!ÄÑáĵޙ݅Ö}@g5ÒM'opnŒÂ”½˙\—NœI› ?ŞHܳG̜{ÂŞĝ +PÄÀ˘N£à5ûpqnϚ³™O>:ˆú‚ĵ”ŻÍóÂq)ûŞhĦn'U-s'ÉŬĴÜŝ˙:!´ÂÀ%Mì.ÑV[âúĉĉÁŭeY<ĉ˘­ ×ġhÓ0ÖZKS,lŝ·ž€Ü`ġôıÔĝ×~ÑŬ,öìúáj·§Ş~póÒĊpšÂ£F0şó×lá.şvz½`Ġ@˜4°À¤şĊá¸Ê$‡Báw]۔'óÒÍ.…uAZ[ĉ…CŞÍ¸lŒ™µ%˘œ!W#Y\ċ›ĴĈ‹f+H×#ż>UŠu8¤aÑO8mwƒŸ›a†AFC x‚ƒ7+YS:Œ÷P ƒSäÀîúëÁÑİœċ;5]·Üܚğ`}§Q‚?â'ÌN˜fĉÖA)|Q÷:Ĝ\ñ žĥëc—~äĵ'’/ë×DDïIdîáìƒyovíĉû£ÏÏ@Ĵ/òè&˙8ì1ÓòXÒĞœ( Ĵ‹­GI!ÙÈ/OÊxӕ} X@ïmAĈ”ÄKˆ,k˘ä NÉÀ·x"˘`Vù\ëĊ~Ŭ;NW´ŭ£‹ƒé'³˙ f&Q£­ż[û{hqĴ}Ñ .  0`yè&J3ċ5`=”&¨?ŒŝŭS+ĵ…ŝçJ,-ÂÂąó`£ŭ¸9Ĉ­Gi@ís•î‘?ÜpwV°íÛ6žĊ?ÒqCÓáŻÀNjݤbĦùy•mZĴù{sJÜÚµ³pşÎĜ.9U}ɑȅÓŸRšpE‹OoÙÚ_ݎħĤ! húcĝ´1ŸRkını÷ÍĞ3W´žIS|ruÜë0=?(á…âìĊL­ßF–-£Ï—DÀqi/ŝá óâk]ÍTĉ`ëv1ñ…£8ÂVE‰#×ŝ*•1Ù_Œ·$!l„ïŜy˙g9ŭ-Ì*´f²‚“ èüô›Şkŝ9q~LĦäŻz1lžċ94ġHĝûÚ·Í÷&ÒÜĞ0cRÌ­x\cgì?^G˙ıkmT‘îċ­?·˙wjÄÓʔHBL §ò݁ÎTĉ·Ì8‡o³xxÛ.]êċrç})zëâ‘7ŝĜ$Ñ2Ŭ€ĠëRıŬ#€c6„L˽™ĉӁRÄÚ[ ÖÇ7`6ÓÑÈ:ó^¤Tĝ*[sĠ,5ħK€ÑQ,JNRÙĴ WíIzèĴœ'ùĥUMoév;Ĝ ĝ߯Qr¤D˜`Àeĵ›F4†tm;gfà̟ÏĵIÉè0s´M´MÖÑ)Úħ+ozVkàcoˆ›ĉ<*ĊSމËUĤȑájJ>ßċĠP‰ħ:Ò6(›F˙f3…j‡ôUâĞÄ#éĠ{ 'sD˘•š˙ħŝdëjĥxƒJÛĈ @à?%ädÉħÖĥF1{ąÚq—‚p-™â̵ĦqÈeÔçès³xĉğÑħ à´È…İ÷gME+gúSAáÙ3šşö ü,,KÔ£ŽÙܑwD]ĠÓhÚ³c{¨IĈƒ§<\–1pw„S`‡k,U.’U½ĜñĵÉŞ.*â²ÖícĝsF‡Ŭŭ­ĊfSÚpN,tŠ„-SħÁĤ5Ż?3_GS ›²$U²Xŭĥ| ğ7WSIyNm*TAŞadÄg’µ4³*ŜX7Mé÷û#CwvƒV=ŭíÊËáP€dgX²ˆé–Wz>&fìF@üGĵKZ@ {°Î•L@l5Zòc|ó ĦŽGrâÌäìh…_ıŭìċI)H&gZ†tOMÇpTŒŬ`§%÷§´ŞşDυ[Îd˙³Ì CŜj[ Ÿ÷^ċq=Ÿg`IXó˘Ĥq—éqó ċ[Ìk3ìċ픟j%\µH&oNÈ*“#ûèìŞIZaÂġ&"”İñŭ§Ž|÷ğêGŭ£'íj˙4eiwíC?joÚaûE˙m/İ\_QtŸÚyûG´wö pżPëŭ´ßía´Kġ—ê!Ċt+`0@Û~ PĉˆÚxэëôM¤Dö=‰ä6”)Fħ8”—3_šjCı5’‰¨‡  AÂşs%ŒŻm’£ƒĠlÜ95š/Z=Ċ#8i˘;ğ•#ĥ?—•oÀTĉÄx=ı•òTú +vÎPż(ˆL˜™Ğc2{êu:NR™Ĉ@i²íaħŽ ~òL]I‰k™=“bJċ8èï ìsFïġ— gDÛoĝca‰xĵĦëž.9a+’ìŜz)™żÖL @úfĦÉ#Dg¨Ko^°h‚x*ŸŞ—ÇúŸh>; žŠĵ/‘™1O˙,gpeŭ‘h„EêĊˆŠÙĈyn‚•Páşíŝ/ì/´€É¨ePĉ„sÖ ÀŬü‰İ„WşNJrûTàŠ$ÉÙÑXç„ëÓ³V&Ÿ|á€ñ‚]}ÙÈY†˙y”€4mTQÌĜl6 †a°Ĝl5­° Dpê,‘™1O˙,gpeŭ‘h„EêĊˆŠÙĈ„ŝ1Ï˙.ġ ´ÂBBL—ŠbHKèÊ 0˘„I†-no›ĉùo›ĉùo›‘™1OòÏ)aKħqé’$d!J’‘ĵéZ²˜LÑ& ³ ‚ûYĝHK&3gBێEÖUË=d4ÒIƒDˆíE€Îü‡„ŝ1ÏòĉRŸ· ċÚÀ„ƒ’mnUˆXH:ˆhÀ%-qâ˙9›-X Ĥ [jû^òĊJ‚L˘İ'½Ĵa`? ÛŻ›ĉùo›ĉ¨9N’ñŞEŒï•€aŝ6÷ĝŭħqV{ÒcâŜĴR;½+6z£—ôŞ.Ŝ –Ġ Ñ~÷ĝ£ßÀ $$—"1ÄÊİÔÎ9X§0ÀRŭ ġн{½‘Nš~ıx/`B×-A×|yš²€ÍˆP‘›˘}7pó˙{´ÌşcKŝĊŬûDŞPŭµ„À%˙sP²Úfei­²’aëĈ†‘éÑäín‚à|†ĵwŽñŜ÷µyhn) Ĝi<ÁÙRz]~ŭıĵ17êĉŭoŸÀù°ôƒqtL ġz÷ÌS-ÈlĜ#h½ jèú ivén–én–Úİ^SŜĝdŸuÙh3C[š1ù÷>8Óc}„ieß2ž àrô†ĊWLí” ĵ]áeíH#BŬ†ÒÓĈ—S„{Ív§ċÀЏáj1kPĜ­ÛK·K¸0ğÒGOv€Ĥ~ '¤}÷ \55‡~ [ìalŒ+‘}' AP¤˜Ŝ"FŞĜĉ{ÑóÛġM`İÏ1ŜÄêŻċŠsáë;` €úBÙİèl0›0?êĈèeXŝÍê‰2vŬ°ÔEżÜ~‡”ô Ş:#–.@ $%—HJ$ħÑ£Òô Ş:#–.@ $%—HJ$ħÑ£Òô ¨^ŸužĠ²H "ħ-Â<ʝm£µs§g…H¨0—b¤ċƒ+"aÜÑK5Ĵr:Œ`ıû=[ĤŽ„§‘ü RYĠ$4JKʗ1ĥ²ŽôaOÓŒ5‚/ÔoÉËċQ •JRޤ£<0˙Ó;U]²2ÚaÌHڃÏÈw|(2›|ĉAŽÈ4ĥò\ÛĜ¤ÜUjş2‹êè)†ıêr-"‰DĵvSŞXÂâ=¸ÙŽž ÖEDžc88 ^[Ĉıg‘aà‡ÜÑĥĉ6^ĥ]`kùKSĞcçÑ˙hd6 I’hƒìĝíéÇ.Ġĝî7†aâ^ l¨*Ĉšu#3,]§Żì U˜êË 1J+Êŝ‚JVġìÖ ásğs4Tr56É/jSùÂ[xÈɐÇMa˜žÏÍúƒá8Ñ}ĝÎ/dÓxI)JLĊoÍSYr Y@‰¨{~äı™!B&Édh·>Şí›¸Ot&ġH"%şÒ·Ŝ]­ï2/çS•”˘ħѓ""n-HüLhwIBxğ^Xaġ%É|4ßŭD pšfXĥĦ$èêÂ$0´_úÙ²ŭ™‚O˙ÙicnV Bŝffdesmume-0.9.11/src/cocoa/OGLDisplayOutput.h0000755000000000000000000002400112467662066017172 0ustar rootroot/* Copyright (C) 2014-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _OGLDISPLAYOUTPUT_H_ #define _OGLDISPLAYOUTPUT_H_ #ifndef _OGLDISPLAYOUTPUT_3_2_H_ #if defined(__APPLE__) #include #include #endif #endif // _OGLDISPLAYOUTPUT_3_2_H_ #include #include #include "../filter/videofilter.h" class OGLVideoOutput; enum { OutputFilterTypeID_NearestNeighbor = 0, OutputFilterTypeID_Bilinear = 1, OutputFilterTypeID_BicubicBSpline = 2, OutputFilterTypeID_BicubicMitchell = 3, OutputFilterTypeID_Lanczos2 = 4, OutputFilterTypeID_Lanczos3 = 5 }; enum ShaderSupportTier { ShaderSupport_Unsupported = 0, ShaderSupport_BottomTier = 1, ShaderSupport_LowTier = 2, ShaderSupport_MidTier = 3, ShaderSupport_HighTier = 4, ShaderSupport_TopTier = 5, ShaderSupport_FutureTier = 6, }; class OGLInfo { protected: GLint _versionMajor; GLint _versionMinor; GLint _versionRevision; ShaderSupportTier _shaderSupport; bool _useShader150; bool _isVBOSupported; bool _isPBOSupported; bool _isFBOSupported; public: OGLInfo(); virtual ~OGLInfo() {}; bool IsUsingShader150(); bool IsVBOSupported(); bool IsPBOSupported(); bool IsShaderSupported(); bool IsFBOSupported(); ShaderSupportTier GetShaderSupport(); virtual void GetExtensionSetOGL(std::set *oglExtensionSet) = 0; virtual bool IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const = 0; }; class OGLInfo_Legacy : public OGLInfo { public: OGLInfo_Legacy(); virtual void GetExtensionSetOGL(std::set *oglExtensionSet); virtual bool IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const; }; class OGLShaderProgram { protected: GLuint _vertexID; GLuint _fragmentID; GLuint _programID; ShaderSupportTier _shaderSupport; virtual GLuint LoadShaderOGL(GLenum shaderType, const char *shaderProgram, bool useShader150); virtual bool LinkOGL(); public: OGLShaderProgram(); virtual ~OGLShaderProgram(); ShaderSupportTier GetShaderSupport(); void SetShaderSupport(const ShaderSupportTier theTier); GLuint GetVertexShaderID(); void SetVertexShaderOGL(const char *shaderProgram, bool useShader150); GLuint GetFragmentShaderID(); void SetFragmentShaderOGL(const char *shaderProgram, bool useShader150); void SetVertexAndFragmentShaderOGL(const char *vertShaderProgram, const char *fragShaderProgram, bool useShader150); GLuint GetProgramID(); }; class OGLFilter { protected: OGLShaderProgram *_program; bool _isVAOPresent; GLuint _texDstID; GLint _texCoordBuffer[8]; GLuint _fboID; GLuint _vaoID; GLuint _vboVtxID; GLuint _vboTexCoordID; GLuint _vboElementID; GLfloat _scale; GLsizei _srcWidth; GLsizei _srcHeight; GLsizei _dstWidth; GLsizei _dstHeight; virtual void OGLFilterInit(GLsizei srcWidth, GLsizei srcHeight, GLfloat scale); public: OGLFilter(); OGLFilter(GLsizei srcWidth, GLsizei srcHeight, GLfloat scale); virtual ~OGLFilter(); static void GetSupport(int vfTypeID, bool *outSupportCPU, bool *outSupportShader); OGLShaderProgram* GetProgram(); GLuint GetDstTexID(); GLsizei GetSrcWidth(); GLsizei GetSrcHeight(); GLsizei GetDstWidth(); GLsizei GetDstHeight(); void SetSrcSizeOGL(GLsizei w, GLsizei h); GLfloat GetScale(); void SetScaleOGL(GLfloat scale); virtual GLuint RunFilterOGL(GLuint srcTexID); void DownloadDstBufferOGL(uint32_t *dstBuffer, size_t lineOffset, size_t readLineCount); }; class OGLFilterDeposterize : public OGLFilter { protected: GLuint _texIntermediateID; public: OGLFilterDeposterize(GLsizei srcWidth, GLsizei srcHeight, ShaderSupportTier theTier, bool useShader150); ~OGLFilterDeposterize(); virtual GLuint RunFilterOGL(GLuint srcTexID); }; class OGLVideoLayer { protected: OGLVideoOutput *_output; GLsizei _viewportWidth; GLsizei _viewportHeight; public: OGLVideoLayer() {}; ~OGLVideoLayer() {}; void SetViewportSizeOGL(GLsizei w, GLsizei h) { this->_viewportWidth = w; this->_viewportHeight = h; }; virtual void ProcessOGL() {}; virtual void RenderOGL() {}; }; class OGLImage { protected: bool _isVAOPresent; bool _canUseShaderBasedFilters; bool _canUseShaderOutput; bool _useShader150; ShaderSupportTier _shaderSupport; bool _needUploadVertices; bool _useDeposterize; bool _useShaderBasedPixelScaler; bool _filtersPreferGPU; int _outputFilter; VideoFilterTypeID _pixelScaler; OGLFilter *_filterDeposterize; OGLFilter *_shaderFilter; OGLShaderProgram *_finalOutputProgram; VideoFilter *_vf; uint32_t *_vfMasterDstBuffer; double _normalWidth; double _normalHeight; GLsizei _viewportWidth; GLsizei _viewportHeight; GLubyte *_vtxElementPointer; GLint _displayTexFilter; GLuint _texCPUFilterDstID; GLuint _texLQ2xLUT; GLuint _texHQ2xLUT; GLuint _texHQ4xLUT; GLint _vtxBuffer[8]; GLfloat _texCoordBuffer[8]; GLuint _texVideoInputDataID; GLuint _texVideoSourceID; GLuint _texVideoPixelScalerID; GLuint _texVideoOutputID; GLuint _vaoMainStatesID; GLuint _vboVertexID; GLuint _vboTexCoordID; GLuint _vboElementID; GLint _uniformFinalOutputAngleDegrees; GLint _uniformFinalOutputScalar; GLint _uniformFinalOutputViewSize; void UploadHQnxLUTs(); virtual void UploadVerticesOGL(); virtual void UploadTexCoordsOGL(); virtual void UploadTransformationOGL(); void UpdateVertices(); void UpdateTexCoords(GLfloat s, GLfloat t); public: OGLImage() {}; OGLImage(OGLInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GLsizei viewportWidth, GLsizei viewportHeight); virtual ~OGLImage(); bool GetFiltersPreferGPU(); void SetFiltersPreferGPUOGL(bool preferGPU); bool GetSourceDeposterize(); void SetSourceDeposterize(bool useDeposterize); bool CanUseShaderBasedFilters(); void GetNormalSize(double *w, double *h); int GetOutputFilter(); virtual void SetOutputFilterOGL(const int filterID); int GetPixelScaler(); virtual void SetPixelScalerOGL(const int filterID); virtual bool SetGPUPixelScalerOGL(const VideoFilterTypeID filterID); virtual void SetCPUPixelScalerOGL(const VideoFilterTypeID filterID); virtual void LoadFrameOGL(const uint32_t *frameData, GLint x, GLint y, GLsizei w, GLsizei h); virtual void ProcessOGL(); virtual void RenderOGL(); }; class OGLDisplayLayer : public OGLVideoLayer { protected: bool _isVAOPresent; bool _canUseShaderBasedFilters; bool _canUseShaderOutput; bool _useShader150; ShaderSupportTier _shaderSupport; bool _needUploadVertices; bool _useDeposterize; bool _useShaderBasedPixelScaler; bool _filtersPreferGPU; int _outputFilter; VideoFilterTypeID _pixelScaler; OGLShaderProgram *_finalOutputProgram; OGLFilter *_filterDeposterize[2]; OGLFilter *_shaderFilter[2]; GLint _displayTexFilter[2]; GLuint _texVideoInputDataID[2]; GLuint _texVideoSourceID[2]; GLuint _texVideoPixelScalerID[2]; GLuint _texVideoOutputID[2]; uint32_t *_vfMasterDstBuffer; VideoFilter *_vf[2]; VideoFilter *_vfDual; GLuint _texCPUFilterDstID[2]; int _displayMode; int _displayOrder; int _displayOrientation; double _normalWidth; double _normalHeight; GLfloat _gapScalar; GLfloat _rotation; GLuint _texLQ2xLUT; GLuint _texHQ2xLUT; GLuint _texHQ4xLUT; GLint vtxBuffer[4 * 8]; GLfloat texCoordBuffer[2 * 8]; size_t _vtxBufferOffset; GLuint _vaoMainStatesID; GLuint _vboVertexID; GLuint _vboTexCoordID; GLuint _vboElementID; GLint _uniformFinalOutputAngleDegrees; GLint _uniformFinalOutputScalar; GLint _uniformFinalOutputViewSize; void UploadHQnxLUTs(); virtual void UploadVerticesOGL(); virtual void UploadTexCoordsOGL(); virtual void UploadTransformationOGL(); void UpdateVertices(); void UpdateTexCoords(GLfloat s, GLfloat t); public: OGLDisplayLayer() {}; OGLDisplayLayer(OGLVideoOutput *oglVO); virtual ~OGLDisplayLayer(); bool GetFiltersPreferGPU(); void SetFiltersPreferGPUOGL(bool preferGPU); int GetMode(); void SetMode(int dispMode); int GetOrientation(); void SetOrientation(int dispOrientation); int GetOrder(); void SetOrder(int dispOrder); GLfloat GetGapScalar(); void SetGapScalar(GLfloat theScalar); GLfloat GetRotation(); void SetRotation(GLfloat theRotation); bool GetSourceDeposterize(); void SetSourceDeposterize(bool useDeposterize); bool CanUseShaderBasedFilters(); void GetNormalSize(double *w, double *h); int GetOutputFilter(); virtual void SetOutputFilterOGL(const int filterID); int GetPixelScaler(); virtual void SetPixelScalerOGL(const int filterID); virtual bool SetGPUPixelScalerOGL(const VideoFilterTypeID filterID); virtual void SetCPUPixelScalerOGL(const VideoFilterTypeID filterID); virtual void LoadFrameOGL(const uint16_t *frameData, GLint x, GLint y, GLsizei w, GLsizei h); virtual void ProcessOGL(); virtual void RenderOGL(); }; class OGLVideoOutput { protected: OGLInfo *_info; GLsizei _viewportWidth; GLsizei _viewportHeight; std::vector *_layerList; public: OGLVideoOutput(); ~OGLVideoOutput(); virtual void InitLayers(); virtual OGLInfo* GetInfo(); virtual GLsizei GetViewportWidth(); virtual GLsizei GetViewportHeight(); OGLDisplayLayer* GetDisplayLayer(); virtual void ProcessOGL(); virtual void RenderOGL(); virtual void SetViewportSizeOGL(GLsizei w, GLsizei h); }; OGLInfo* OGLInfoCreate_Legacy(); extern OGLInfo* (*OGLInfoCreate_Func)(); extern void (*glBindVertexArrayDESMUME)(GLuint id); extern void (*glDeleteVertexArraysDESMUME)(GLsizei n, const GLuint *ids); extern void (*glGenVertexArraysDESMUME)(GLsizei n, GLuint *ids); #endif // _OGLDISPLAYOUTPUT_H_ desmume-0.9.11/src/cocoa/cocoa_globals.h0000755000000000000000000006044512467662066016605 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #define STRING_DESMUME_WEBSITE "http://desmume.org" #define STRING_DESMUME_SHORT_DESCRIPTION "Nintendo DS Emulator" #define STRING_DESMUME_FORUM_SITE "http://forums.desmume.org/index.php" #define STRING_DESMUME_TECH_SUPPORT_SITE "http://forums.desmume.org/viewforum.php?id=4" #define STRING_DESMUME_BUG_REPORT_SITE "http://sourceforge.net/p/desmume/bugs" // User Interface Localized Strings #define NSSTRING_TITLE_OPEN_ROM_PANEL NSLocalizedString(@"Open ROM", nil) #define NSSTRING_TITLE_OPEN_STATE_FILE_PANEL NSLocalizedString(@"Open State File", nil) #define NSSTRING_TITLE_SAVE_STATE_FILE_PANEL NSLocalizedString(@"Save State File", nil) #define NSSTRING_TITLE_IMPORT_ROM_SAVE_PANEL NSLocalizedString(@"Import ROM Save File", nil) #define NSSTRING_TITLE_EXPORT_ROM_SAVE_PANEL NSLocalizedString(@"Export ROM Save File", nil) #define NSSTRING_TITLE_SELECT_ROM_PANEL NSLocalizedString(@"Select ROM", nil) #define NSSTRING_TITLE_SELECT_ADVANSCENE_DB_PANEL NSLocalizedString(@"Select ADVANsCEne Database", nil) #define NSSTRING_TITLE_SELECT_R4_CHEAT_DB_PANEL NSLocalizedString(@"Select R4 Cheat Database", nil) #define NSSTRING_TITLE_SELECT_ARM7_IMAGE_PANEL NSLocalizedString(@"Select ARM7 BIOS Image", nil) #define NSSTRING_TITLE_SELECT_ARM9_IMAGE_PANEL NSLocalizedString(@"Select ARM9 BIOS Image", nil) #define NSSTRING_TITLE_SELECT_FIRMWARE_IMAGE_PANEL NSLocalizedString(@"Select Firmware Image", nil) #define NSSTRING_TITLE_SELECT_MPCF_FOLDER_PANEL NSLocalizedString(@"Select MPCF Folder", nil) #define NSSTRING_TITLE_SELECT_MPCF_DISK_IMAGE_PANEL NSLocalizedString(@"Select MPCF Disk Image", nil) #define NSSTRING_TITLE_CHOOSE_GBA_CARTRIDGE_PANEL NSLocalizedString(@"Choose GBA Cartridge", nil) #define NSSTRING_TITLE_CHOOSE_GBA_SRAM_PANEL NSLocalizedString(@"Choose GBA SRAM File", nil) #define NSSTRING_TITLE_SAVE_SCREENSHOT_PANEL NSLocalizedString(@"Save Screenshot", nil) #define NSSTRING_TITLE_EXECUTE_CONTROL NSLocalizedString(@"Execute", nil) #define NSSTRING_TITLE_PAUSE_CONTROL NSLocalizedString(@"Pause", nil) #define NSSTRING_TITLE_DISABLE_SPEED_LIMIT NSLocalizedString(@"Disable Speed Limit", nil) #define NSSTRING_TITLE_ENABLE_SPEED_LIMIT NSLocalizedString(@"Enable Speed Limit", nil) #define NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP NSLocalizedString(@"Disable Auto Frame Skip", nil) #define NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP NSLocalizedString(@"Enable Auto Frame Skip", nil) #define NSSTRING_TITLE_DISABLE_CHEATS NSLocalizedString(@"Disable Cheats", nil) #define NSSTRING_TITLE_ENABLE_CHEATS NSLocalizedString(@"Enable Cheats", nil) #define NSSTRING_TITLE_DISABLE_HUD NSLocalizedString(@"Disable HUD", nil) #define NSSTRING_TITLE_ENABLE_HUD NSLocalizedString(@"Enable HUD", nil) #define NSSTRING_TITLE_EXIT_FULL_SCREEN NSLocalizedString(@"Exit Full Screen", nil) #define NSSTRING_TITLE_ENTER_FULL_SCREEN NSLocalizedString(@"Enter Full Screen", nil) #define NSSTRING_TITLE_HIDE_STATUS_BAR NSLocalizedString(@"Hide Status Bar", nil) #define NSSTRING_TITLE_SHOW_STATUS_BAR NSLocalizedString(@"Show Status Bar", nil) #define NSSTRING_TITLE_HIDE_TOOLBAR NSLocalizedString(@"Hide Toolbar", nil) #define NSSTRING_TITLE_SHOW_TOOLBAR NSLocalizedString(@"Show Toolbar", nil) #define NSSTRING_TITLE_SPEED_1X NSLocalizedString(@"Speed 1x", nil) #define NSSTRING_TITLE_SPEED_2X NSLocalizedString(@"Speed 2x", nil) #define NSSTRING_TITLE_SLOT_NUMBER NSLocalizedString(@"Slot %ld", nil) #define NSSTRING_TITLE_TECH_SUPPORT_WINDOW_TITLE NSLocalizedString(@"Support Request Form", nil) #define NSSTRING_TITLE_BUG_REPORT_WINDOW_TITLE NSLocalizedString(@"Bug Report Form", nil) #define NSSTRING_TITLE_GO_TECH_SUPPORT_WEBPAGE_TITLE NSLocalizedString(@"Go to Tech Support Webpage", nil) #define NSSTRING_TITLE_GO_BUG_REPORT_WEBPAGE_TITLE NSLocalizedString(@"Go to Bug Report Webpage", nil) #define NSSTRING_HELP_COPY_PASTE_TECH_SUPPORT NSLocalizedString(@"Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us.", nil) #define NSSTRING_HELP_COPY_PASTE_BUG_REPORT NSLocalizedString(@"Please copy-paste the above information into our bug report webpage. This will ensure the fastest response time from us.", nil) #define NSSTRING_ALERT_CRITICAL_FILE_MISSING_PRI NSLocalizedString(@"A critical file is missing. DeSmuME will now quit.", nil) #define NSSTRING_ALERT_CRITICAL_FILE_MISSING_SEC NSLocalizedString(@"The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME.", nil) #define NSSTRING_STATUS_READY NSLocalizedString(@"Ready.", nil) #define NSSTRING_STATUS_SAVESTATE_LOADING_FAILED NSLocalizedString(@"Save state file loading failed!", nil) #define NSSTRING_STATUS_SAVESTATE_LOADED NSLocalizedString(@"Save state file loaded.", nil) #define NSSTRING_STATUS_SAVESTATE_SAVING_FAILED NSLocalizedString(@"Save state file saving failed!", nil) #define NSSTRING_STATUS_SAVESTATE_SAVED NSLocalizedString(@"Save state file saved.", nil) #define NSSTRING_STATUS_SAVESTATE_REVERTING_FAILED NSLocalizedString(@"Save state file reverting failed!", nil) #define NSSTRING_STATUS_SAVESTATE_REVERTED NSLocalizedString(@"Save state file reverted.", nil) #define NSSTRING_STATUS_ROM_SAVE_IMPORT_FAILED NSLocalizedString(@"ROM save file import failed!", nil) #define NSSTRING_STATUS_ROM_SAVE_IMPORTED NSLocalizedString(@"ROM save file imported.", nil) #define NSSTRING_STATUS_ROM_SAVE_EXPORT_FAILED NSLocalizedString(@"ROM save file export failed!", nil) #define NSSTRING_STATUS_ROM_SAVE_EXPORTED NSLocalizedString(@"ROM save file exported.", nil) #define NSSTRING_STATUS_ROM_LOADING NSLocalizedString(@"Loading ROM...", nil) #define NSSTRING_STATUS_ROM_LOADING_FAILED NSLocalizedString(@"ROM loading failed!", nil) #define NSSTRING_STATUS_ROM_LOADED NSLocalizedString(@"ROM loaded.", nil) #define NSSTRING_STATUS_ROM_UNLOADING NSLocalizedString(@"Unloading ROM...", nil) #define NSSTRING_STATUS_ROM_UNLOADED NSLocalizedString(@"ROM unloaded.", nil) #define NSSTRING_STATUS_EMULATOR_RESETTING NSLocalizedString(@"Emulator resetting...", nil) #define NSSTRING_STATUS_EMULATOR_RESET NSLocalizedString(@"Emulator reset.", nil) #define NSSTRING_STATUS_AUTOHOLD_SET NSLocalizedString(@"Autohold set...", nil) #define NSSTRING_STATUS_AUTOHOLD_SET_RELEASE NSLocalizedString(@"Autohold set released.", nil) #define NSSTRING_STATUS_AUTOHOLD_CLEAR NSLocalizedString(@"Autohold cleared.", nil) #define NSSTRING_STATUS_CANNOT_GENERATE_SAVE_PATH NSLocalizedString(@"Cannot generate the save file path!", nil) #define NSSTRING_STATUS_CANNOT_CREATE_SAVE_DIRECTORY NSLocalizedString(@"Cannot create the save directory!", nil) #define NSSTRING_STATUS_SPEED_LIMIT_DISABLED NSLocalizedString(@"Speed limit disabled.", nil) #define NSSTRING_STATUS_SPEED_LIMIT_ENABLED NSLocalizedString(@"Speed limit enabled.", nil) #define NSSTRING_STATUS_AUTO_FRAME_SKIP_DISABLED NSLocalizedString(@"Auto frame skip disabled.", nil) #define NSSTRING_STATUS_AUTO_FRAME_SKIP_ENABLED NSLocalizedString(@"Auto frame skip enabled.", nil) #define NSSTRING_STATUS_CHEATS_DISABLED NSLocalizedString(@"Cheats disabled.", nil) #define NSSTRING_STATUS_CHEATS_ENABLED NSLocalizedString(@"Cheats enabled.", nil) #define NSSTRING_STATUS_HUD_DISABLED NSLocalizedString(@"HUD disabled.", nil) #define NSSTRING_STATUS_HUD_ENABLED NSLocalizedString(@"HUD enabled.", nil) #define NSSTRING_STATUS_VOLUME NSLocalizedString(@"Volume: %1.1f%%", nil) #define NSSTRING_STATUS_NO_ROM_LOADED NSLocalizedString(@"No ROM loaded.", nil) #define NSSTRING_STATUS_SIZE_BYTES NSLocalizedString(@"%i bytes", nil) #define NSSTRING_STATUS_EMULATION_NOT_RUNNING NSLocalizedString(@"Emulation is not running.", nil) #define NSSTRING_STATUS_SLOT1_UNKNOWN_STATE NSLocalizedString(@"Unknown state.", nil) #define NSSTRING_STATUS_SLOT1_NO_DEVICE NSLocalizedString(@"No device inserted.", nil) #define NSSTRING_STATUS_SLOT1_RETAIL_INSERTED NSLocalizedString(@"Retail cartridge inserted. (Auto-detect)", nil) #define NSSTRING_STATUS_SLOT1_RETAIL_NAND_INSERTED NSLocalizedString(@"Retail cartridge w/ NAND flash inserted.", nil) #define NSSTRING_STATUS_SLOT1_R4_INSERTED NSLocalizedString(@"R4 cartridge interface inserted.", nil) #define NSSTRING_STATUS_SLOT1_STANDARD_INSERTED NSLocalizedString(@"Standard retail cartridge inserted.", nil) #define NSSTRING_STATUS_SLOT2_LOADED_NONE NSLocalizedString(@"No SLOT-2 device loaded.", nil) #define NSSTRING_STATUS_SLOT2_LOADED_AUTOMATIC NSLocalizedString(@"Loaded SLOT-2 device using automatic selection.\nSelected device type: %@", nil) #define NSSTRING_STATUS_SLOT2_LOADED_MPCF_WITH_ROM NSLocalizedString(@"Compact flash device loaded with data from the ROM's directory.", nil) #define NSSTRING_STATUS_SLOT2_LOADED_MPCF_DIRECTORY NSLocalizedString(@"Compact flash device loaded with data from directory path:\n%s", nil) #define NSSTRING_STATUS_SLOT2_LOADED_MPCF_DISK_IMAGE NSLocalizedString(@"Compact flash device loaded using disk image:\n%s", nil) #define NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_WITH_SRAM NSLocalizedString(@"GBA cartridge loaded with SRAM file:\n%s", nil) #define NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_NO_SRAM NSLocalizedString(@"GBA cartridge loaded. (No associated SRAM file loaded.)", nil) #define NSSTRING_STATUS_SLOT2_LOADED_GENERIC_DEVICE NSLocalizedString(@"Loaded SLOT-2 device:\n%@", nil) #define NSSTRING_STATUS_SLOT2_LOADED_UNKNOWN NSLocalizedString(@"An unknown SLOT-2 device has been loaded.", nil) #define NSSTRING_STATUS_NO_ROM_CHOSEN NSLocalizedString(@"No ROM chosen.", nil) #define NSSTRING_STATUS_NO_FOLDER_CHOSEN NSLocalizedString(@"No folder chosen.", nil) #define NSSTRING_STATUS_NO_DISK_IMAGE_CHOSEN NSLocalizedString(@"No disk image chosen.", nil) #define NSSTRING_STATUS_NO_GBA_CART_CHOSEN NSLocalizedString(@"No GBA cartridge chosen.", nil) #define NSSTRING_STATUS_NO_GBA_SRAM_CHOSEN NSLocalizedString(@"No GBA SRAM chosen.", nil) #define NSSTRING_STATUS_NO_GBA_SRAM_FOUND NSLocalizedString(@"No GBA SRAM found.", nil) #define NSSTRING_DISPLAYMODE_MAIN NSLocalizedString(@"Main", nil) #define NSSTRING_DISPLAYMODE_TOUCH NSLocalizedString(@"Touch", nil) #define NSSTRING_DISPLAYMODE_DUAL NSLocalizedString(@"Dual Screen", nil) #define NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED NSLocalizedString(@"%ld Input Mapped", nil) #define NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED_PLURAL NSLocalizedString(@"%ld Inputs Mapped", nil) #define NSSTRING_INPUTPREF_NO_SAVED_PROFILES NSLocalizedString(@"No saved profiles.", nil) #define NSSTRING_INPUTPREF_USE_DEVICE_COORDINATES NSLocalizedString(@"Use Device Coordinates", nil) #define NSSTRING_INPUTPREF_MIC_NONE NSLocalizedString(@"None", nil) #define NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE NSLocalizedString(@"Internal Noise Samples", nil) #define NSSTRING_INPUTPREF_MIC_AUDIO_FILE_NONE_SELECTED NSLocalizedString(@"No audio file selected.", nil) #define NSSTRING_INPUTPREF_MIC_WHITE_NOISE NSLocalizedString(@"White Noise", nil) #define NSSTRING_INPUTPREF_MIC_SINE_WAVE NSLocalizedString(@"%1.1f Hz Sine Wave", nil) #define NSSTRING_INPUTPREF_SPEED_SCALAR NSLocalizedString(@"%1.2fx Speed", nil) #define NSSTRING_INPUTPREF_GPU_STATE_ALL_MAIN NSLocalizedString(@"Main GPU - All Layers", nil) #define NSSTRING_INPUTPREF_GPU_STATE_ALL_SUB NSLocalizedString(@"Sub GPU - All Layers", nil) // LEGACY STRINGS #define NSSTRING_TITLE_OPEN_ROM_PANEL_LEGACY NSLocalizedString(@"Open ROM...", nil) #define NSSTRING_TITLE_OPEN_STATE_FILE_PANEL_LEGACY NSLocalizedString(@"Load State From...", nil) #define NSSTRING_TITLE_SAVE_STATE_FILE_PANEL_LEGACY NSLocalizedString(@"Save State...", nil) #define NSSTRING_STATUS_ROM_UNLOADED_LEGACY NSLocalizedString(@"No ROM Loaded", nil) #define NSSTRING_STATUS_ROM_LOADED_LEGACY NSLocalizedString(@"ROM Loaded", nil) #define NSSTRING_STATUS_ROM_LOADING_FAILED_LEGACY NSLocalizedString(@"Couldn't load ROM", nil) #define NSSTRING_STATUS_EMULATOR_EXECUTING_LEGACY NSLocalizedString(@"Emulation Executing", nil) #define NSSTRING_STATUS_EMULATOR_PAUSED_LEGACY NSLocalizedString(@"Emulation Paused", nil) #define NSSTRING_STATUS_EMULATOR_RESET_LEGACY NSLocalizedString(@"Emulation Reset", nil) #define NSSTRING_ERROR_TITLE_LEGACY NSLocalizedString(@"Error", nil) #define NSSTRING_ERROR_GENERIC_LEGACY NSLocalizedString(@"An emulation error occurred", nil) #define NSSTRING_ERROR_SCREENSHOT_FAILED_LEGACY NSLocalizedString(@"Couldn't create the screenshot image", nil) #define NSSTRING_MESSAGE_TITLE_LEGACY NSLocalizedString(@"DeSmuME Emulator", nil) #define NSSTRING_MESSAGE_ASK_CLOSE_LEGACY NSLocalizedString(@"Are you sure you want to close the ROM?", nil) #define FILENAME_README "README" #define FILENAME_COPYING "COPYING" #define FILENAME_AUTHORS "AUTHORS" #define FILENAME_CHANGELOG "ChangeLog" #define PATH_CONFIG_DIRECTORY_0_9_6 "~/.config/desmume" #define PATH_USER_APP_SUPPORT "${APPSUPPORT}" #define PATH_OPEN_EMU "${OPENEMU}" #define PATH_WITH_ROM "${WITHROM}" #define FILE_EXT_FIRMWARE_CONFIG "dfc" #define FILE_EXT_SAVE_STATE "dst" #define FILE_EXT_ROM_SAVE "dsv" #define FILE_EXT_CHEAT "dct" #define FILE_EXT_ROM_SAVE_NOGBA "sav*" #define FILE_EXT_ROM_SAVE_RAW "sav" #define FILE_EXT_ACTION_REPLAY_SAVE "dss" #define FILE_EXT_ACTION_REPLAY_MAX_SAVE "duc" #define FILE_EXT_ROM_DS "nds" #define FILE_EXT_ROM_GBA "ds.gba" #define FILE_EXT_HW_IMAGE_FILE "bin" #define FILE_EXT_ADVANSCENE_DB "xml" #define FILE_EXT_R4_CHEAT_DB "dat" #define FILE_EXT_GBA_ROM "gba" #define FILE_EXT_GBA_SRAM "sav" #define MAX_SAVESTATE_SLOTS 10 #define MAX_VOLUME 100.0f #define MAX_BRIGHTNESS 100.0f #define CHEAT_DESCRIPTION_LENGTH 1024 #define GPU_DISPLAY_WIDTH 256 #define GPU_DISPLAY_HEIGHT 192 #define GPU_DISPLAY_COLOR_DEPTH sizeof(UInt16) #define GPU_SCREEN_SIZE_BYTES (GPU_DISPLAY_WIDTH * GPU_DISPLAY_HEIGHT * GPU_DISPLAY_COLOR_DEPTH) // The numbers are: 256px width, 192px height, 16bit color depth #define DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO (21.0/46.0) // Based on the official DS specification: 21mm/46mm #define DS_DISPLAY_GAP (GPU_DISPLAY_HEIGHT * DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO) #define WINDOW_STATUS_BAR_HEIGHT 24 // Height of an emulation window status bar in pixels. #define SPEED_SCALAR_QUARTER 0.25 // Speed scalar for quarter execution speed. #define SPEED_SCALAR_HALF 0.5 // Speed scalar for half execution speed. #define SPEED_SCALAR_THREE_QUARTER 0.75 // Speed scalar for three quarters execution speed. #define SPEED_SCALAR_NORMAL 1.0 // Speed scalar for normal execution speed. #define SPEED_SCALAR_DOUBLE 2.0 // Speed scalar for double execution speed. #define SPEED_SCALAR_MIN 0.005 // Lower limit for the speed multiplier. #define DS_FRAMES_PER_SECOND 59.8261 // Number of DS frames per second. #define DS_SECONDS_PER_FRAME (1.0 / DS_FRAMES_PER_SECOND) // The length of time in seconds that, ideally, a frame should be processed within. #define FRAME_SKIP_AGGRESSIVENESS 9.0 // Must be a value between 0.0 (inclusive) and positive infinity. // This value acts as a scalar multiple of the frame skip. #define FRAME_SKIP_BIAS 0.1 // May be any real number. This value acts as a vector addition to the frame skip. #define MAX_FRAME_SKIP (DS_FRAMES_PER_SECOND / 3.0) //#define SPU_SAMPLE_RATE (44100.0 * DS_FRAMES_PER_SECOND / 60.0) // Samples per second #define SPU_SAMPLE_RATE 44100.0 // Samples per second #define SPU_SAMPLE_RESOLUTION 16 // Bits per sample; must be a multiple of 8 #define SPU_NUMBER_CHANNELS 2 // Number of channels #define SPU_SAMPLE_SIZE ((SPU_SAMPLE_RESOLUTION / 8) * SPU_NUMBER_CHANNELS) // Bytes per sample, multiplied by the number of channels #define SPU_BUFFER_BYTES ((SPU_SAMPLE_RATE / DS_FRAMES_PER_SECOND) * SPU_SAMPLE_SIZE) // Note that this value may be returned as floating point #define CLOCKWISE_DEGREES(x) (360.0 - x) // Converts an angle in degrees from normal-direction to clockwise-direction. #define VOLUME_THRESHOLD_LOW 35.0f #define VOLUME_THRESHOLD_HIGH 75.0f #define ROM_ICON_WIDTH 32 #define ROM_ICON_HEIGHT 32 #define ROMINFO_GAME_TITLE_LENGTH 12 #define ROMINFO_GAME_CODE_LENGTH 4 #define ROMINFO_GAME_BANNER_LENGTH 128 #define MIC_SAMPLE_RATE 16000.0 #define MIC_SAMPLE_RESOLUTION 8 // Bits per sample; must be a multiple of 8 #define MIC_NUMBER_CHANNELS 1 // Number of channels #define MIC_SAMPLE_SIZE ((MIC_SAMPLE_RESOLUTION / 8) * MIC_NUMBER_CHANNELS) // Bytes per sample, multiplied by the number of channels #define MIC_MAX_BUFFER_SAMPLES ((MIC_SAMPLE_RATE / DS_FRAMES_PER_SECOND) * MIC_SAMPLE_SIZE) #define MIC_CAPTURE_FRAMES 192 // The number of audio frames that the NDS microphone should pull. The lower this value, the lower the latency. Ensure that this value is not too low, or else audio frames may be lost. #define MIC_NULL_LEVEL_THRESHOLD 2.5 #define MIC_CLIP_LEVEL_THRESHOLD 39.743665431525209 // ((2.0/pi) * MIC_NULL_SAMPLE_VALUE) - 1.0 #define MIC_NULL_SAMPLE_VALUE 64 #define COCOA_DIALOG_CANCEL 0 #define COCOA_DIALOG_DEFAULT 1 #define COCOA_DIALOG_OK 1 #define COCOA_DIALOG_OPTION 2 #define RUMBLE_ITERATIONS_RUMBLE_PAK 2 #define RUMBLE_ITERATIONS_ENABLE 1 #define RUMBLE_ITERATIONS_TEST 3 enum { ROMAUTOLOADOPTION_LOAD_LAST = 0, ROMAUTOLOADOPTION_LOAD_SELECTED = 1, ROMAUTOLOADOPTION_LOAD_NONE = 10000, ROMAUTOLOADOPTION_CHOOSE_ROM = 10001 }; enum { MPCF_OPTION_LOAD_WITH_ROM = 0, MPCF_OPTION_LOAD_DIRECTORY = 1, MPCF_OPTION_LOAD_DISK_IMAGE = 2, MPCF_ACTION_CHOOSE_DIRECTORY = 10000, MPCF_ACTION_CHOOSE_DISK_IMAGE = 10001 }; enum { REASONFORCLOSE_NORMAL = 0, REASONFORCLOSE_OPEN, REASONFORCLOSE_TERMINATE }; enum { ROMSAVEFORMAT_DESMUME = 0, ROMSAVEFORMAT_NOGBA = 1, ROMSAVEFORMAT_RAW = 2 }; enum { ROMSAVETYPE_AUTOMATIC = 0 }; enum { EMULATION_ENSATA_BIT = 0, EMULATION_ADVANCED_BUS_LEVEL_TIMING_BIT = 1, EMULATION_USE_EXTERNAL_BIOS_BIT = 2, EMULATION_BIOS_SWI_BIT = 3, EMULATION_PATCH_DELAY_LOOP_BIT = 4, EMULATION_USE_EXTERNAL_FIRMWARE_BIT = 5, EMULATION_BOOT_FROM_FIRMWARE_BIT = 6, EMULATION_SLEEP_BIT = 7, EMULATION_CARD_EJECT_BIT = 8, EMULATION_DEBUG_CONSOLE_BIT = 9, EMULATION_RIGOROUS_TIMING_BIT = 10 }; enum { EMULATION_ENSATA_MASK = 1 << EMULATION_ENSATA_BIT, EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK = 1 << EMULATION_ADVANCED_BUS_LEVEL_TIMING_BIT, EMULATION_USE_EXTERNAL_BIOS_MASK = 1 << EMULATION_USE_EXTERNAL_BIOS_BIT, EMULATION_BIOS_SWI_MASK = 1 << EMULATION_BIOS_SWI_BIT, EMULATION_PATCH_DELAY_LOOP_MASK = 1 << EMULATION_PATCH_DELAY_LOOP_BIT, EMULATION_USE_EXTERNAL_FIRMWARE_MASK = 1 << EMULATION_USE_EXTERNAL_FIRMWARE_BIT, EMULATION_BOOT_FROM_FIRMWARE_MASK = 1 << EMULATION_BOOT_FROM_FIRMWARE_BIT, EMULATION_SLEEP_MASK = 1 << EMULATION_SLEEP_BIT, EMULATION_CARD_EJECT_MASK = 1 << EMULATION_CARD_EJECT_BIT, EMULATION_DEBUG_CONSOLE_MASK = 1 << EMULATION_DEBUG_CONSOLE_BIT, EMULATION_RIGOROUS_TIMING_MASK = 1 << EMULATION_RIGOROUS_TIMING_BIT }; enum { CPU_EMULATION_ENGINE_INTERPRETER = 0, CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER = 1 }; enum { GPUSTATE_MAIN_GPU_BIT = 0, GPUSTATE_MAIN_BG0_BIT = 1, GPUSTATE_MAIN_BG1_BIT = 2, GPUSTATE_MAIN_BG2_BIT = 3, GPUSTATE_MAIN_BG3_BIT = 4, GPUSTATE_MAIN_OBJ_BIT = 5, GPUSTATE_SUB_GPU_BIT = 6, GPUSTATE_SUB_BG0_BIT = 7, GPUSTATE_SUB_BG1_BIT = 8, GPUSTATE_SUB_BG2_BIT = 9, GPUSTATE_SUB_BG3_BIT = 10, GPUSTATE_SUB_OBJ_BIT = 11 }; enum { GPUSTATE_MAIN_GPU_MASK = 1 << GPUSTATE_MAIN_GPU_BIT, GPUSTATE_MAIN_BG0_MASK = 1 << GPUSTATE_MAIN_BG0_BIT, GPUSTATE_MAIN_BG1_MASK = 1 << GPUSTATE_MAIN_BG1_BIT, GPUSTATE_MAIN_BG2_MASK = 1 << GPUSTATE_MAIN_BG2_BIT, GPUSTATE_MAIN_BG3_MASK = 1 << GPUSTATE_MAIN_BG3_BIT, GPUSTATE_MAIN_OBJ_MASK = 1 << GPUSTATE_MAIN_OBJ_BIT, GPUSTATE_SUB_GPU_MASK = 1 << GPUSTATE_SUB_GPU_BIT, GPUSTATE_SUB_BG0_MASK = 1 << GPUSTATE_SUB_BG0_BIT, GPUSTATE_SUB_BG1_MASK = 1 << GPUSTATE_SUB_BG1_BIT, GPUSTATE_SUB_BG2_MASK = 1 << GPUSTATE_SUB_BG2_BIT, GPUSTATE_SUB_BG3_MASK = 1 << GPUSTATE_SUB_BG3_BIT, GPUSTATE_SUB_OBJ_MASK = 1 << GPUSTATE_SUB_OBJ_BIT }; enum { SPU_SYNC_MODE_DUAL_SYNC_ASYNC = 0, SPU_SYNC_MODE_SYNCHRONOUS = 1 }; enum { SPU_SYNC_METHOD_N = 0, SPU_SYNC_METHOD_Z = 1, SPU_SYNC_METHOD_P = 2 }; enum { CHEAT_TYPE_INTERNAL = 0, CHEAT_TYPE_ACTION_REPLAY = 1, CHEAT_TYPE_CODE_BREAKER = 2 }; enum { CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE = 0, CHEATSEARCH_SEARCHSTYLE_COMPARATIVE = 1 }; enum { CHEATSEARCH_COMPARETYPE_GREATER_THAN = 0, CHEATSEARCH_COMPARETYPE_LESSER_THAN = 1, CHEATSEARCH_COMPARETYPE_EQUALS_TO = 2, CHEATSEARCH_COMPARETYPE_NOT_EQUALS_TO = 3 }; enum { CHEATSEARCH_UNSIGNED = 0, CHEATSEARCH_SIGNED = 1 }; enum { CHEATEXPORT_ERROR_FILE_NOT_FOUND = 1, CHEATEXPORT_ERROR_WRONG_FILE_FORMAT = 2, CHEATEXPORT_ERROR_SERIAL_NOT_FOUND = 3, CHEATEXPORT_ERROR_EXPORT_FAILED = 4 }; /* PORT MESSAGES */ enum { MESSAGE_CHECK_FOR_RESPONSE = 100, // Message to check if a port is responding. Usually sent to make sure that a thread is alive. MESSAGE_CHECK_RESPONSE_ECHO, // Response message when another port sends MESSAGE_CHECK_FOR_RESPONSE. Sent to confirm that a thread is indeed alive. MESSAGE_EXIT_THREAD, // Sent whenever there is a need to stop a thread. MESSAGE_EMU_FRAME_PROCESSED = 1000, // Sent whenever an emulation frame is fully processed. This is mostly used to signal outputs to update themselves based on the new emulation frame. MESSAGE_OUTPUT_FINISHED_FRAME, // Sent from an output device whenever it finishes processing the frame data. MESSAGE_SET_EMULATION_FLAGS, // Video Messages MESSAGE_RESIZE_VIEW, MESSAGE_TRANSFORM_VIEW, MESSAGE_REDRAW_VIEW, MESSAGE_REPROCESS_AND_REDRAW, MESSAGE_SET_GPU_STATE_FLAGS, MESSAGE_CHANGE_DISPLAY_TYPE, MESSAGE_CHANGE_DISPLAY_ORIENTATION, MESSAGE_CHANGE_DISPLAY_ORDER, MESSAGE_CHANGE_DISPLAY_GAP, MESSAGE_SET_RENDER3D_METHOD, MESSAGE_SET_RENDER3D_HIGH_PRECISION_COLOR_INTERPOLATION, MESSAGE_SET_RENDER3D_EDGE_MARKING, MESSAGE_SET_RENDER3D_FOG, MESSAGE_SET_RENDER3D_TEXTURES, MESSAGE_SET_RENDER3D_DEPTH_COMPARISON_THRESHOLD, MESSAGE_SET_RENDER3D_THREADS, MESSAGE_SET_RENDER3D_LINE_HACK, MESSAGE_SET_RENDER3D_MULTISAMPLE, MESSAGE_SET_AUDIO_PROCESS_METHOD, MESSAGE_SET_SPU_ADVANCED_LOGIC, MESSAGE_SET_SPU_SYNC_MODE, MESSAGE_SET_SPU_SYNC_METHOD, MESSAGE_SET_SPU_INTERPOLATION_MODE, MESSAGE_SET_VOLUME, MESSAGE_REQUEST_SCREENSHOT, MESSAGE_COPY_TO_PASTEBOARD }; /* DS DISPLAY TYPES */ enum { DS_DISPLAY_TYPE_MAIN = 0, DS_DISPLAY_TYPE_TOUCH, DS_DISPLAY_TYPE_DUAL }; enum { VIDEO_SOURCE_INTERNAL = 0, VIDEO_SOURCE_EMULATOR = 1 }; enum { DS_DISPLAY_ORIENTATION_VERTICAL = 0, DS_DISPLAY_ORIENTATION_HORIZONTAL }; enum { DS_DISPLAY_ORDER_MAIN_FIRST = 0, DS_DISPLAY_ORDER_TOUCH_FIRST }; /* DS GPU TYPES */ enum { DS_GPU_TYPE_MAIN = 0, DS_GPU_TYPE_SUB, DS_GPU_TYPE_MAIN_AND_SUB }; /* COCOA DS CORE STATES */ enum { CORESTATE_PAUSE = 0, CORESTATE_EXECUTE, CORESTATE_FRAMEADVANCE, CORESTATE_FRAMEJUMP }; /* DESMUME 3D RENDERER TYPES */ enum { CORE3DLIST_NULL = 0, CORE3DLIST_SWRASTERIZE, CORE3DLIST_OPENGL }; /* MICROPHONE MODE */ enum { MICMODE_NONE = 0, MICMODE_INTERNAL_NOISE, MICMODE_AUDIO_FILE, MICMODE_WHITE_NOISE, MICMODE_PHYSICAL, MICMODE_SINE_WAVE }; enum { FRAMEJUMP_TYPE_FORWARD = 0, FRAMEJUMP_TYPE_TOFRAME = 1, FRAMEJUMP_TYPE_NEXTMARKER = 2 }; enum { PADDLE_CONTROL_RELATIVE = 0, PADDLE_CONTROL_DIRECT }; desmume-0.9.11/src/cocoa/Info.plist0000755000000000000000000003031412467662066015605 0ustar rootroot CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions nds CFBundleTypeIconFile AppIcon_NintendoDS_ROM.icns CFBundleTypeName Nintendo DS ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions ds.gba CFBundleTypeIconFile AppIcon_NintendoGBA_ROM.icns CFBundleTypeName Gameboy Advance ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dst CFBundleTypeIconFile AppIcon_SaveState.icns CFBundleTypeName DeSmuME Save State CFBundleTypeRole Editor LSItemContentTypes com.desmume.savestate LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dsv CFBundleTypeIconFile AppIcon_ROMSave.icns CFBundleTypeName DeSmuME ROM Save CFBundleTypeRole Editor LSItemContentTypes com.desmume.romsave LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dfc CFBundleTypeIconFile AppIcon_FirmwareConfig.icns CFBundleTypeName DeSmuME Firmware Configuration CFBundleTypeRole Editor LSItemContentTypes com.desmume.firmwareconfig LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dct CFBundleTypeIconFile AppIcon_ROMCheats.icns CFBundleTypeName DeSmuME ROM Cheats CFBundleTypeRole Editor LSItemContentTypes com.desmume.romcheats LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions sav CFBundleTypeIconFile AppIcon_NoGBA_ROMSave.icns CFBundleTypeName No$GBA ROM Save CFBundleTypeRole Viewer LSItemContentTypes de.emubase.nocash.romsave.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions duc CFBundleTypeIconFile AppIcon_ActionReplaySave.icns CFBundleTypeName Action Replay Save CFBundleTypeRole Viewer LSItemContentTypes com.codejunkies.actionreplay.save.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions bin CFBundleTypeIconFile AppIcon_HWImage_NDS.icns CFBundleTypeName Nintendo DS Hardware Image CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.hwimage.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions xml CFBundleTypeIconFile AppIcon_ADVANsCEneDatabase.icns CFBundleTypeName ADVANsCEne Database CFBundleTypeRole Viewer LSItemContentTypes com.advanscene.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dat CFBundleTypeIconFile AppIcon_R4CheatDatabase.icns CFBundleTypeName R4 Cheats Database CFBundleTypeRole Viewer LSItemContentTypes net.gbatemp.cheats.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleExecutable ${PRODUCT_NAME} CFBundleIconFile AppIcon_DeSmuME CFBundleIdentifier org.desmume.DeSmuME CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString v0.9.11 CFBundleSignature DSmM CFBundleVersion 0.9.11 LSApplicationCategoryType public.app-category.entertainment LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright Copyright Âİ2007-2015 DeSmuME Team. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass NSApplication UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription DeSmuME Save State UTTypeIconFile AppIcon_SaveState.icns UTTypeIdentifier com.desmume.savestate UTTypeTagSpecification public.filename-extension dst UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Save UTTypeIconFile AppIcon_ROMSave.icns UTTypeIdentifier com.desmume.romsave UTTypeTagSpecification public.filename-extension dsv UTTypeConformsTo public.data UTTypeDescription DeSmuME Firmware Configuration UTTypeIconFile AppIcon_FirmwareConfig.icns UTTypeIdentifier com.desmume.firmwareconfig UTTypeTagSpecification public.filename-extension dfc UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Cheats UTTypeIconFile AppIcon_ROMCheats.icns UTTypeIdentifier com.desmume.romcheats UTTypeTagSpecification public.filename-extension dct UTImportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription Nintendo DS ROM UTTypeIconFile AppIcon_NintendoDS_ROM.icns UTTypeIdentifier com.nintendo.rom.ds UTTypeTagSpecification public.filename-extension nds UTTypeConformsTo public.data UTTypeDescription Gameboy Advance ROM UTTypeIconFile AppIcon_NintendoGBA_ROM.icns UTTypeIdentifier com.nintendo.rom.gba UTTypeTagSpecification public.filename-extension ds.gba UTTypeConformsTo public.data UTTypeDescription No$GBA ROM Save UTTypeIconFile AppIcon_NoGBA_ROMSave.icns UTTypeIdentifier de.emubase.nocash.romsave.gba UTTypeTagSpecification public.filename-extension sav UTTypeConformsTo public.data UTTypeDescription Action Replay Save UTTypeIconFile AppIcon_ActionReplaySave.icns UTTypeIdentifier com.codejunkies.actionreplay.save.nintendo.ds UTTypeTagSpecification public.filename-extension duc UTTypeConformsTo public.data UTTypeDescription Nintendo DS Hardware Image UTTypeIconFile AppIcon_HWImage_NDS.icns UTTypeIdentifier com.nintendo.hwimage.ds UTTypeTagSpecification public.filename-extension bin UTTypeConformsTo public.xml UTTypeDescription ADVANsCEne Database UTTypeIconFile AppIcon_ADVANsCEneDatabase.icns UTTypeIdentifier com.advanscene.database.nintendo.ds UTTypeTagSpecification public.filename-extension xml UTTypeConformsTo public.data UTTypeDescription R4 Cheats Database UTTypeIconFile AppIcon_R4CheatDatabase.icns UTTypeIdentifier net.gbatemp.cheats.database.nintendo.ds UTTypeTagSpecification public.filename-extension dat desmume-0.9.11/src/cocoa/ringbuffer.h0000755000000000000000000000315512467662066016142 0ustar rootroot/* Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _RINGBUFFER_ #define _RINGBUFFER_ #include #include class RingBuffer { private: uint8_t *_buffer; size_t _bufferSize; size_t _elementCapacity; size_t _elementSize; int32_t _elementFillCount; // need to use int32_t for OSAtomicAdd32Barrier() size_t _readPosition; size_t _writePosition; void allocate(const size_t numberElements, const size_t elementSize); public: RingBuffer(const size_t numberElements, const size_t elementSize); ~RingBuffer(); void clear(); void resize(const size_t numberElements, const size_t elementSize); size_t read(void *__restrict__ destBuffer, size_t requestedNumberElements); size_t write(const void *__restrict__ srcBuffer, size_t requestedNumberElements); size_t drop(size_t requestedNumberElements); size_t getAvailableElements() const; size_t getUsedElements() const; size_t getElementCapacity() const; size_t getElementSize() const; bool isEmpty() const; bool isFull() const; }; #endif desmume-0.9.11/src/cocoa/cocoa_videofilter.h0000755000000000000000000000447712467662066017501 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include "../filter/videofilter.h" #undef BOOL @class NSImage; @class NSBitmapImageRep; /******************************************************************************************** CocoaVideoFilter - OBJECTIVE-C CLASS This is an Objective-C wrapper class for the video filter C++ object. Thread Safety: All methods are thread-safe. ********************************************************************************************/ @interface CocoaVideoFilter : NSObject { VideoFilter *vf; VideoFilterTypeID currentFilterType; } - (id) initWithSize:(NSSize)theSize; - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID; - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID numberThreads:(NSUInteger)numThreads; - (BOOL) setSourceSize:(NSSize)theSize; - (BOOL) changeFilter:(VideoFilterTypeID)typeID; - (UInt32 *) runFilter; - (NSImage *) image; - (NSBitmapImageRep *) bitmapImageRep; - (VideoFilterTypeID) typeID; - (NSString *) typeString; - (UInt32 *) srcBufferPtr; - (UInt32 *) dstBufferPtr; - (NSSize) srcSize; - (NSSize) destSize; - (VideoFilterParamType) filterParameterType:(VideoFilterParamID)paramID; - (int) filterParameteri:(VideoFilterParamID)paramID; - (unsigned int) filterParameterui:(VideoFilterParamID)paramID; - (float) filterParameterf:(VideoFilterParamID)paramID; - (void) setFilterParameter:(VideoFilterParamID)paramID intValue:(int)value; - (void) setFilterParameter:(VideoFilterParamID)paramID uintValue:(unsigned int)value; - (void) setFilterParameter:(VideoFilterParamID)paramID floatValue:(float)value; + (NSString *) typeStringByID:(VideoFilterTypeID)typeID; @end desmume-0.9.11/src/cocoa/cocoa_GPU.mm0000755000000000000000000005611412467662066015775 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_GPU.h" #import "cocoa_globals.h" #include "utilities.h" #include "../NDSSystem.h" #include "../GPU.h" #include "../rasterize.h" #ifdef MAC_OS_X_VERSION_10_7 #include "../OGLRender_3_2.h" #else #include "../OGLRender.h" #endif #include #undef BOOL GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, &gpu3Dgl, NULL }; @implementation CocoaDSGPU @dynamic gpuStateFlags; @synthesize rwlockProducer; @dynamic layerMainGPU; @dynamic layerMainBG0; @dynamic layerMainBG1; @dynamic layerMainBG2; @dynamic layerMainBG3; @dynamic layerMainOBJ; @dynamic layerSubGPU; @dynamic layerSubBG0; @dynamic layerSubBG1; @dynamic layerSubBG2; @dynamic layerSubBG3; @dynamic layerSubOBJ; @dynamic render3DRenderingEngine; @dynamic render3DHighPrecisionColorInterpolation; @dynamic render3DEdgeMarking; @dynamic render3DFog; @dynamic render3DTextures; @dynamic render3DDepthComparisonThreshold; @dynamic render3DThreads; @dynamic render3DLineHack; @dynamic render3DMultisample; @dynamic render3DFragmentSamplingHack; - (id)init { self = [super init]; if (self == nil) { return self; } spinlockGpuState = OS_SPINLOCK_INIT; rwlockProducer = NULL; gpuStateFlags = GPUSTATE_MAIN_GPU_MASK | GPUSTATE_MAIN_BG0_MASK | GPUSTATE_MAIN_BG1_MASK | GPUSTATE_MAIN_BG2_MASK | GPUSTATE_MAIN_BG3_MASK | GPUSTATE_MAIN_OBJ_MASK | GPUSTATE_SUB_GPU_MASK | GPUSTATE_SUB_BG0_MASK | GPUSTATE_SUB_BG1_MASK | GPUSTATE_SUB_BG2_MASK | GPUSTATE_SUB_BG3_MASK | GPUSTATE_SUB_OBJ_MASK; isCPUCoreCountAuto = NO; SetOpenGLRendererFunctions(&OSXOpenGLRendererInit, &OSXOpenGLRendererBegin, &OSXOpenGLRendererEnd); GPU_FillScreenWithBGRA5551(0x8000); return self; } - (void)dealloc { NDS_3D_ChangeCore(CORE3DLIST_NULL); DestroyOpenGLRenderer(); [super dealloc]; } - (void) setGpuStateFlags:(UInt32)flags { OSSpinLockLock(&spinlockGpuState); gpuStateFlags = flags; OSSpinLockUnlock(&spinlockGpuState); [self setLayerMainGPU:((flags & GPUSTATE_MAIN_GPU_MASK) != 0)]; [self setLayerMainBG0:((flags & GPUSTATE_MAIN_BG0_MASK) != 0)]; [self setLayerMainBG1:((flags & GPUSTATE_MAIN_BG1_MASK) != 0)]; [self setLayerMainBG2:((flags & GPUSTATE_MAIN_BG2_MASK) != 0)]; [self setLayerMainBG3:((flags & GPUSTATE_MAIN_BG3_MASK) != 0)]; [self setLayerMainOBJ:((flags & GPUSTATE_MAIN_OBJ_MASK) != 0)]; [self setLayerSubGPU:((flags & GPUSTATE_SUB_GPU_MASK) != 0)]; [self setLayerSubBG0:((flags & GPUSTATE_SUB_BG0_MASK) != 0)]; [self setLayerSubBG1:((flags & GPUSTATE_SUB_BG1_MASK) != 0)]; [self setLayerSubBG2:((flags & GPUSTATE_SUB_BG2_MASK) != 0)]; [self setLayerSubBG3:((flags & GPUSTATE_SUB_BG3_MASK) != 0)]; [self setLayerSubOBJ:((flags & GPUSTATE_SUB_OBJ_MASK) != 0)]; } - (UInt32) gpuStateFlags { OSSpinLockLock(&spinlockGpuState); const UInt32 flags = gpuStateFlags; OSSpinLockUnlock(&spinlockGpuState); return flags; } - (void) setRender3DRenderingEngine:(NSInteger)methodID { pthread_rwlock_wrlock(self.rwlockProducer); NDS_3D_ChangeCore(methodID); pthread_rwlock_unlock(self.rwlockProducer); } - (NSInteger) render3DRenderingEngine { pthread_rwlock_rdlock(self.rwlockProducer); const NSInteger methodID = (NSInteger)cur3DCore; pthread_rwlock_unlock(self.rwlockProducer); return methodID; } - (void) setRender3DHighPrecisionColorInterpolation:(BOOL)state { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_HighResolutionInterpolateColor = state ? true : false; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) render3DHighPrecisionColorInterpolation { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL state = CommonSettings.GFX3D_HighResolutionInterpolateColor ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return state; } - (void) setRender3DEdgeMarking:(BOOL)state { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_EdgeMark = state ? true : false; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) render3DEdgeMarking { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL state = CommonSettings.GFX3D_EdgeMark ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return state; } - (void) setRender3DFog:(BOOL)state { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_Fog = state ? true : false; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) render3DFog { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL state = CommonSettings.GFX3D_Fog ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return state; } - (void) setRender3DTextures:(BOOL)state { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_Texture = state ? true : false; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) render3DTextures { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL state = CommonSettings.GFX3D_Texture ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return state; } - (void) setRender3DDepthComparisonThreshold:(NSUInteger)threshold { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = threshold; pthread_rwlock_unlock(self.rwlockProducer); } - (NSUInteger) render3DDepthComparisonThreshold { pthread_rwlock_rdlock(self.rwlockProducer); const NSUInteger threshold = (NSUInteger)CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack; pthread_rwlock_unlock(self.rwlockProducer); return threshold; } - (void) setRender3DThreads:(NSUInteger)numberThreads { NSUInteger numberCores = [[NSProcessInfo processInfo] activeProcessorCount]; if (numberThreads == 0) { isCPUCoreCountAuto = YES; if (numberCores >= 8) { numberCores = 8; } else if (numberCores >= 4) { numberCores = 4; } else if (numberCores >= 2) { numberCores = 2; } else { numberCores = 1; } } else { isCPUCoreCountAuto = NO; numberCores = numberThreads; } const NSInteger renderingEngineID = [self render3DRenderingEngine]; pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.num_cores = numberCores; if (renderingEngineID == CORE3DLIST_SWRASTERIZE || renderingEngineID == CORE3DLIST_OPENGL) { NDS_3D_ChangeCore(renderingEngineID); } pthread_rwlock_unlock(self.rwlockProducer); } - (NSUInteger) render3DThreads { pthread_rwlock_rdlock(self.rwlockProducer); const NSUInteger numberThreads = isCPUCoreCountAuto ? 0 : (NSUInteger)CommonSettings.num_cores; pthread_rwlock_unlock(self.rwlockProducer); return numberThreads; } - (void) setRender3DLineHack:(BOOL)state { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_LineHack = state ? true : false; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) render3DLineHack { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL state = CommonSettings.GFX3D_LineHack ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return state; } - (void) setRender3DMultisample:(BOOL)state { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_Renderer_Multisample = state ? true : false; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) render3DMultisample { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL state = CommonSettings.GFX3D_Renderer_Multisample ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return state; } - (void) setRender3DFragmentSamplingHack:(BOOL)state { pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.GFX3D_TXTHack = state ? true : false; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) render3DFragmentSamplingHack { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL state = CommonSettings.GFX3D_TXTHack ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return state; } - (void) setLayerMainGPU:(BOOL)gpuState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPUDisplayState(DS_GPU_TYPE_MAIN, (gpuState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (gpuState) ? (gpuStateFlags | GPUSTATE_MAIN_GPU_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_GPU_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainGPU { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL gpuState = GetGPUDisplayState(DS_GPU_TYPE_MAIN) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return gpuState; } - (void) setLayerMainBG0:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 0, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG0_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG0_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG0 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 0) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerMainBG1:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 1, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG1_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG1_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG1 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 1) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerMainBG2:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 2, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG2_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG2_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG2 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 2) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerMainBG3:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 3, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG3_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG3_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG3 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 3) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerMainOBJ:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 4, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_OBJ_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_OBJ_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainOBJ { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 4) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerSubGPU:(BOOL)gpuState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPUDisplayState(DS_GPU_TYPE_SUB, (gpuState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (gpuState) ? (gpuStateFlags | GPUSTATE_SUB_GPU_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_GPU_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubGPU { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL gpuState = GetGPUDisplayState(DS_GPU_TYPE_SUB) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return gpuState; } - (void) setLayerSubBG0:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 0, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG0_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG0_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG0 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 0) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerSubBG1:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 1, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG1_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG1_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG1 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 1) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerSubBG2:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 2, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG2_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG2_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG2 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 2) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerSubBG3:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 3, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG3_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG3_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG3 { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 3) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (void) setLayerSubOBJ:(BOOL)layerState { pthread_rwlock_wrlock(self.rwlockProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 4, (layerState) ? true : false); pthread_rwlock_unlock(self.rwlockProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_OBJ_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_OBJ_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubOBJ { pthread_rwlock_rdlock(self.rwlockProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 4) ? YES : NO; pthread_rwlock_unlock(self.rwlockProducer); return layerState; } - (BOOL) gpuStateByBit:(const UInt32)stateBit { return ([self gpuStateFlags] & (1 << stateBit)) ? YES : NO; } - (BOOL) isGPUTypeDisplayed:(const NSInteger)theGpuType { BOOL result = NO; const UInt32 flags = [self gpuStateFlags]; switch (theGpuType) { case DS_GPU_TYPE_MAIN: if (flags & GPUSTATE_MAIN_GPU_MASK) { result = YES; } break; case DS_GPU_TYPE_SUB: if (flags & GPUSTATE_SUB_GPU_MASK) { result = YES; } break; case DS_GPU_TYPE_MAIN_AND_SUB: if (flags & (GPUSTATE_MAIN_GPU_MASK | GPUSTATE_SUB_GPU_MASK)) { result = YES; } break; default: break; } return result; } - (void) hideGPUType:(const NSInteger)theGpuType { UInt32 flags = [self gpuStateFlags]; switch (theGpuType) { case DS_GPU_TYPE_MAIN: flags &= ~GPUSTATE_MAIN_GPU_MASK; break; case DS_GPU_TYPE_SUB: flags &= ~GPUSTATE_SUB_GPU_MASK; break; case DS_GPU_TYPE_MAIN_AND_SUB: flags &= ~GPUSTATE_MAIN_GPU_MASK; flags &= ~GPUSTATE_SUB_GPU_MASK; break; default: break; } [self setGpuStateFlags:flags]; } - (void) showGPUType:(const NSInteger)theGpuType { UInt32 flags = [self gpuStateFlags]; switch (theGpuType) { case DS_GPU_TYPE_MAIN: flags |= GPUSTATE_MAIN_GPU_MASK; break; case DS_GPU_TYPE_SUB: flags |= GPUSTATE_SUB_GPU_MASK; break; case DS_GPU_TYPE_MAIN_AND_SUB: flags |= GPUSTATE_MAIN_GPU_MASK; flags |= GPUSTATE_SUB_GPU_MASK; break; default: break; } [self setGpuStateFlags:flags]; } - (NSString *) render3DRenderingEngineString { NSString *theString = @"Uninitialized"; pthread_rwlock_rdlock(self.rwlockProducer); if(gpu3D == NULL) { pthread_rwlock_unlock(self.rwlockProducer); return theString; } const char *theName = gpu3D->name; theString = [NSString stringWithCString:theName encoding:NSUTF8StringEncoding]; pthread_rwlock_unlock(self.rwlockProducer); return theString; } @end void SetGPULayerState(const int gpuType, const unsigned int i, const bool state) { GPU *theGpu = NULL; // Check bounds on the layer index. if(i > 4) { return; } switch (gpuType) { case DS_GPU_TYPE_SUB: theGpu = SubScreen.gpu; break; case DS_GPU_TYPE_MAIN: theGpu = MainScreen.gpu; break; case DS_GPU_TYPE_MAIN_AND_SUB: SetGPULayerState(DS_GPU_TYPE_SUB, i, state); // Recursive call theGpu = MainScreen.gpu; break; default: break; } if (theGpu != NULL) { if (state) { GPU_addBack(theGpu, i); } else { GPU_remove(theGpu, i); } } } bool GetGPULayerState(const int gpuType, const unsigned int i) { bool theState = false; // Check bounds on the layer index. if(i > 4) { return theState; } switch (gpuType) { case DS_GPU_TYPE_SUB: if (SubScreen.gpu != NULL) { theState = CommonSettings.dispLayers[SubScreen.gpu->core][i]; } break; case DS_GPU_TYPE_MAIN: if (MainScreen.gpu != NULL) { theState = CommonSettings.dispLayers[MainScreen.gpu->core][i]; } break; case DS_GPU_TYPE_MAIN_AND_SUB: if (SubScreen.gpu != NULL && MainScreen.gpu != NULL) { theState = (CommonSettings.dispLayers[SubScreen.gpu->core][i] && CommonSettings.dispLayers[MainScreen.gpu->core][i]); } break; default: break; } return theState; } void SetGPUDisplayState(const int gpuType, const bool state) { switch (gpuType) { case DS_GPU_TYPE_SUB: CommonSettings.showGpu.sub = state; break; case DS_GPU_TYPE_MAIN: CommonSettings.showGpu.main = state; break; case DS_GPU_TYPE_MAIN_AND_SUB: CommonSettings.showGpu.sub = state; CommonSettings.showGpu.main = state; break; default: break; } } bool GetGPUDisplayState(const int gpuType) { bool theState = false; switch (gpuType) { case DS_GPU_TYPE_SUB: theState = CommonSettings.showGpu.sub; break; case DS_GPU_TYPE_MAIN: theState = CommonSettings.showGpu.main; break; case DS_GPU_TYPE_MAIN_AND_SUB: theState = (CommonSettings.showGpu.sub && CommonSettings.showGpu.main); break; default: break; } return theState; } void GPU_FillScreenWithBGRA5551(const uint16_t colorValue) { const size_t pixCount = sizeof(GPU_screen) / sizeof(uint16_t); #ifdef __APPLE__ if (pixCount % 16 == 0) { const uint16_t colorValuePattern[] = {colorValue, colorValue, colorValue, colorValue, colorValue, colorValue, colorValue, colorValue}; memset_pattern16(GPU_screen, colorValuePattern, sizeof(GPU_screen)); } else #endif { for (size_t i = 0; i < pixCount; i++) { ((uint16_t *)GPU_screen)[i] = colorValue; } } } CGLContextObj OSXOpenGLRendererContext = NULL; CGLPBufferObj OSXOpenGLRendererPBuffer = NULL; bool OSXOpenGLRendererInit() { static bool isContextAlreadyCreated = false; if (!isContextAlreadyCreated) { isContextAlreadyCreated = CreateOpenGLRenderer(); } return true; } bool OSXOpenGLRendererBegin() { CGLSetCurrentContext(OSXOpenGLRendererContext); return true; } void OSXOpenGLRendererEnd() { } bool CreateOpenGLRenderer() { bool result = false; bool useContext_3_2 = false; CGLPixelFormatObj cglPixFormat = NULL; CGLContextObj newContext = NULL; CGLPBufferObj newPBuffer = NULL; GLint virtualScreenCount = 0; CGLPixelFormatAttribute attrs[] = { kCGLPFAColorSize, (CGLPixelFormatAttribute)24, kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8, kCGLPFADepthSize, (CGLPixelFormatAttribute)24, kCGLPFAStencilSize, (CGLPixelFormatAttribute)8, kCGLPFAAccelerated, (CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0 }; #ifdef MAC_OS_X_VERSION_10_7 // If we can support a 3.2 Core Profile context, then request that in our // pixel format attributes. useContext_3_2 = IsOSXVersionSupported(10, 7, 0); if (useContext_3_2) { attrs[9] = kCGLPFAOpenGLProfile; attrs[10] = (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core; } #endif CGLChoosePixelFormat(attrs, &cglPixFormat, &virtualScreenCount); if (cglPixFormat == NULL) { // Remove the HW rendering requirement and try again. Note that this will // result in SW rendering, which will cause a substantial speed hit. attrs[8] = (CGLPixelFormatAttribute)0; CGLChoosePixelFormat(attrs, &cglPixFormat, &virtualScreenCount); if (cglPixFormat == NULL) { return result; } } CGLCreateContext(cglPixFormat, NULL, &newContext); CGLReleasePixelFormat(cglPixFormat); // Create a PBuffer for legacy contexts since the availability of FBOs // is not guaranteed. if (!useContext_3_2) { CGLCreatePBuffer(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT, GL_TEXTURE_2D, GL_RGBA, 0, &newPBuffer); if (newPBuffer == NULL) { CGLReleaseContext(newContext); return result; } else { GLint virtualScreenID = 0; CGLGetVirtualScreen(newContext, &virtualScreenID); CGLSetPBuffer(newContext, newPBuffer, 0, 0, virtualScreenID); } } RequestOpenGLRenderer_3_2(useContext_3_2); OSXOpenGLRendererContext = newContext; OSXOpenGLRendererPBuffer = newPBuffer; result = true; return result; } void DestroyOpenGLRenderer() { if (OSXOpenGLRendererContext == NULL) { return; } CGLReleasePBuffer(OSXOpenGLRendererPBuffer); CGLReleaseContext(OSXOpenGLRendererContext); OSXOpenGLRendererContext = NULL; OSXOpenGLRendererPBuffer = NULL; } void RequestOpenGLRenderer_3_2(bool request_3_2) { #ifdef OGLRENDER_3_2_H if (request_3_2) { OGLLoadEntryPoints_3_2_Func = &OGLLoadEntryPoints_3_2; OGLCreateRenderer_3_2_Func = &OGLCreateRenderer_3_2; return; } #endif OGLLoadEntryPoints_3_2_Func = NULL; OGLCreateRenderer_3_2_Func = NULL; } void SetOpenGLRendererFunctions(bool (*initFunction)(), bool (*beginOGLFunction)(), void (*endOGLFunction)()) { oglrender_init = initFunction; oglrender_beginOpenGL = beginOGLFunction; oglrender_endOpenGL = endOGLFunction; } desmume-0.9.11/src/cocoa/AppIcon_NintendoDS_ROM.icns0000755000000000000000000023350712467662066020657 0ustar rootrooticns7Gis32üf!# 9\”’”™ž‘bC'|˙ïÍâÙ³´Ğç˙‹0-gÈÉĜ̤­ƒž­o:8$ F6%!F4"€ E3!€ D2 € C/„A. ?.„C=+'     ;"SïÏĈȽθÏÀ|(1)]m_hZccej`bK.=**-+.%+.,0/66!!!9^‘–•––™›Ħ”•dC'|˙íËĈĠΧċ˙Š0)yĝêíéàä½ĥ¸Î˙‡6)hÇÑÍÊÊÑ×ÛÌÊu7'hÄÇĊÇÇÄÁğıl9&gÏÄÊÈÈÇÉÊ­d9$fÑÄÊÇÈÈÇğ­›“[9#eÑÄÊÇÈÇşŞœ‹S9!dÑÄÉÇÄ·§™‰ymI9eÑÄÌÄ·§˜‰zk]A9aÑĊÂħĦ”„ufVE88hÓş§Š}o_TE37 ZûÚÔÓÈÖÁËĠĊÔ~(1(Xj\eW`ach_bK.=++.,/&,.-0066f!# 9\”’”™ž‘bC'|˙ïÍâÙ³´Ğç˙‹0-gÈÉĜ̤­ƒž­o:8$ F6%!F4"€ E3!€ D2 € C/„A. ?-„C=+'     ;"SïÏĈȽθÏÀ|(1)]m_hZccej`bK.=**-+.%+.,0/66s8mk>[TWVVVWWWWXU[DÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÇ˙òùö÷÷÷÷÷öùó˙ĠÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÜË˙ù˙ŭŝŝŝŝŝŭ˙ú˙ÚÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ù˙ŭŝŝŝŝŝŭ˙ú˙ÚÊ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÈ˙ñùö÷÷÷÷÷öĝó˙Ġ”˙÷˙ŝ˙˙˙˙˙ŝ˙û˙Ĝil32 Ĉ"%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7crnpqmjplkkloprzjmvqoqk?>J J=Z˙ŭ‰˙Süġ˙˙üŝ˙ù˙w8W H7\ŝġûúƒœz£—ƒvpu­pµ˙úó˙z3U G7[˙ü˙ŭŜÒĠàçÜâÙ¤`ÊA›Q˙÷˙z4V F7Vġ÷ƒ˙9ïìïîäѲÏïçÔ˙ôŝt6U @C& +9GPhY&}aUQ<*! FN ?B#ƒ‚…GN >A# ƒ € GM =?" GM ! EL :=  EK 9;  DJ 9;  DJ 8: CI 79 BH 68 AG 57 AF 57 @F 46 >E 46,=D 34  3D6,@ò˙íÌßÒÍÙĜë´·ÇÂÛÏÔÙáËñw$I 45$>òçşĞ£ħ¤ž~Ġ²Ħ¸œÊ·Ş˘ĤwËq#H8/9'=c^eieeibkcjicmchjkfQih54? 5/25.!#  !#$"!!$#$86?);/01778988989.6:8;9;;::;;53;-8875544546545455‚6:99"%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpllklopszjmvroql?>J J=Z˙ŭ‰˙Süö˙˙üŝ˙ú˙w8W H7\˙ġúĝš™w™…ysvİ~m³˙ùò˙z3U G7[˙ü˙˙ÖÙÛŬ×ŬÔ aFĦUĉ˙÷˙z4U G6Z˙úƒ˙?ŭŭŝŝ÷é½½èÜÊë˙÷˙{4U E9NÏÍÒÔĠĠÛĜĊĈÄÄÈÊÛñàŜäÙÓÊÓn8T C8KÊĊĈĊĈĈĊĈÊÉÇÁĵÂÂÂȽh9T B7KËÇʂɀÈÇÈÉËÍËËÌÉÄĥğe9S A5KËĈɂǃÈÇĈÇÇĊżş­ħa9S A5JËĈɋÈĈż·²İ]:R @4IËĈɊÈĈĥݍŸY:Q >3IËĈɉÈĊ½µĤ ”–V:P =1IËĈɈÈÄĵ´­—ŒQ:O=1HËĈɇÈğ³Ĵ¤•Ž„ƒN;O<0HËĈɅÈÇÁş²Ğ£›”Œ†{zJ:M;/GËĈɄÈÇÀıħİ˘š“‹„}sqF:L:.GÌĈɃÈĈż·°¨Ħ™’Šƒ{tkgB9J9-GÌĈɂÈĈ·Ż§ ˜‘‰‚zrlb^>:I9-GÌĈɁÈĊ½µĤŸ—ˆyqjcZU:9I8-FÌĈÉÈÈÉÄĵµ­Ĥž—ˆ€yqjb[RM69G8,FÊĊÈÇĈÁıħİ˘š“‹ƒ{sld]UME>19F7+GÏÇÌËĈÀ¸ħŞ˘œ’Œ…}wnhaYRKC08D7+CĈÄż·­£œ”Š„yuia[PLA81) $:C9(NçĜĉ€áÚĠÔÌÎżµ¸ĞĴİ£Ÿ›™F1E5.<ê˙é½ÓĈ͸ÏÄç­­Àğ×ËÎĠŬĈïw$I 45%FöéÁħİÄĥİ£ƒĜĥĵ Ìş­¤¨yÌr#H8/9$:_[bfbcg_iahhbkbgijehg54? 5/26/"$!@! "$ $"!!$#$86?);/01778988989.6:8;9;;::;;53;-8875544546545455‚6:99"%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7crnpqmjplkkloprzjmvqoqk?>J J=Z˙ŭ‰˙Süġ˙˙üŝ˙ù˙w8W H7\ŝġûúƒœz£—ƒvpu­pµ˙úó˙z3U G7[˙ü˙ŭŜÒĠàçÜâÚĤ`ÊA›Q˙÷˙z4V F7Vġ÷ƒ˙9ïìïîċÒ²ÏïçÔ˙ôŝt6U @C& +9GPhY&}aUQ<*! FN ?B"ƒ‚…GN >A# ƒ € GM =?" GM ! EL :=  EK 9;  EJ 9;  DJ 8: CI 79 BH 68 AG 57 AF 57 @F 46 >E 46,=D 34  3D6,@ò˙íÌßÒÍÙĜë´·ÇÂÛÏÔÙáËñw$I 45$>òçşĞ£ħ¤ž~Ġ²Ħ¸œÊ·Ş˘ĤwËq#H8/9'=c^eieeibkcjicmchjkfQih54? 5/25.!#  !#$"!!$#$86?);/01778988989.6:8;9;;::;;53;-8875544546545455‚6:99l8mk%402111111111112222222222213,ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙;+˙ùüûûûûûûûûûûûûûûûûûûûûûûúŝô˙M)˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙J*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙L*˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K*˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙J$ûŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭ˙÷˙Kïûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙Eı˙÷ŝúûûûûûûûûüüûüûûûûûûûûúŝġ˙E"Ê˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ/it32i—ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙ú˙ÌĈòġÔĠƒŸ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûú˙ĈÙ˙˙ÜȊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙ö˙ŭƒŝŠ˙ŝ…˙ŝŝ˙ŝ˙ŝ˙ŝƒ˙ŝ˙ú˙ĊÂîÉɁ;h[8!¤˙Q!€c !şÊ”ĵ˙ü˙„ŝ˙ü˙ç&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝ„˙„ŝŭ‚ŝ˙˙ŝŝŭ˙!ŝ˙ñżÂĥò³UhTPRYŻìŝ˙³dYMRkċ˙ÜĴğ˙û†˙ŭ˙è&5;IHGHGK@WO‚ @F@BAA@D=9`˙ñû÷ĝĝùúüŭŝ˙ŝ˙úĝ÷û€ŝ˙ûŭ…˙ŝûŒ˙ŝŭüûù€ĝùöŭá%6;IHGHGK@VP‚ @F@ ?D=:a˙÷˙ŝ„˙ú†ĝùúûŭŝ‚˙úŝ•˙ ŝ˙úîĝùúĝüŝûôîïñöúġòôĝŭ†˙ŝ˙ñ03EABBA?D@2'ƒ!;ACScuƒžÂ½ÄÏÙäîù˙˙ü˙–¨˙ŭŝéßÖÍĽÀ£Š€qbTF>B. ƒ :8KH€GJ@WP‚ >E>@@A?C@1& ‹  -A?PM” :B:!ށ :8JHFGFI@WP‚ ?E@?=@@D@1'„†…—„ˆ„ :8KHGHGK@WP‚ =D?A@?=C@2'€—‘‚ :8KHGHGK@XP‚ =D>?@A>B@1'†‰†™…‹† :8KH€GK@WP‚ >D?==?@C?0&•ƒ›‚— :8KHGHGJ@VP‚ >€?=A?0'Ĝ :8KHFHFK@WQ‚;C==>@>A>/&Ĝ :8KHGHGJ@VP‚ =<==A>0'Ĝ :8KHFGFJ@WP‚ ?>>/'Ĝ :8KHGHFK@WP‚ ;B<==?=@=.&Ĝ :7KH€GJ@WP‚;B;<<==A=/&Ĝ :7KHHGFJ@WP‚ :B<=<<;@=/'Ĝ :7JHHIGK@VP‚:B<;?<.&Ĝ :7IGEEFJ@VP‚:C<==<<,&Ĝ :6HFDFGI?WP‚8@;€<:>;+%Ĝ :6IFFECI?VP‚7A:9;<;?;+%Ĝ :6I€FDH>UQ‚ 7@;;€9>;+%Ĝ :5IFEEDG>UP‚ 7?9<<;9=;+%Ĝ 95HFFEEH>UP‚ 8?99;<;=;*%Ĝ 95HEEFEI>UO‚6?:9899=:*%Ĝ 95IE€CG>UM‚5?9:9:7<:+%Ĝ 95I€ECF=UO‚6>89:;9<9*%Ĝ 95I€EDG=TO‚7>788:9<9*%Ĝ 93HEDDCG=TN‚7>89786<9+&Ĝ 93HEDEDG=TN‚6>89897;8)%Ĝ 93HEEFCG=TN‚5>€898;9)%Ĝ 93IEDECG=TN‚6>€897;8)%Ĝ 93HEFEBG=SN‚4>99898;8*%Ĝ 92GEDFEH=TN‚4=89::7;8)%Ĝ 92GDBDCG=TN‚4=767:7;9(%Ĝ 92GDDCAF=SN‚4=87686;8(%Ĝ 92F€DBF@@C9QJ‚0:5454475%$Ĝ 8.D@?>?C8QJ‚0:45€475$$Ĝ 8-C@AA>A8PJ‚/:5443475$#Ĝ 8-B?>@?C8OI‚.95375$#Ĝ 8-C?>>=B8PI‚/93455475$#Ĝ 7,C€?<@7OJ‚093325485$#Ĝ 7,A??@>A7NH‚/93432174$#Ĝ 8,A><>>B7NI‚083€4364##Ĝ 7,B>==;?7OH‚083424364##Ĝ 7,A€>A6MH‚/83255364##Ĝ 8,A=;<<@6MI‚.73213364##Ĝ 7+A<==:=5MH‚07€31064##Ĝ 7*A=<=>A†@‚?†@?@AŽ@‚?@‚?@?€@??@@??@A?C66*><<=<=4KG‚ 063323260) S˙ĝ˙ŝÔ˙ŭ˙ç%0,=;9;;?4KG‚ 253232260( M˙òú÷„ĝùó€îï÷úûûùùüûöôúúüúŝúüüùùĝ€üùúûûú€ĝñííìóĝï€îġĝñ÷ĝĝòġĝĝôôûüûüüĝù€ûĝù€üùú€ûöŭŜ),=<;:8<4JG‚ 253233260) T˙ö˙ŝ‹˙üûûŝ˙ùû˙ŭŝüùüéüùĝĝú˙ĝ÷ùŝŭûûŭ–˙üĝûúĝ˙ŝûûü˙ŝù÷ùŝŭûú˙ŭ˙ä(,;€<9=3IF‚ 253 252#""ċ˙û˙ŭ€ŝŭ˙ú˙ZcW†ûŝ˙˙ŝ˙ú˙Ԕ˙ĝ˙óšòù˙Y·˙ö˙€ŝ€˙ü˙òwMUNĥüv\_cÙûvŜ˙˙‡ż˙˙ĥ§˙ù˙ŝƒ˙ŝŭ€˙ŝŝ˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝ˙aŝú-_Šx‹˙Yc×Oo×`Ώák`·˙ZXeÉ·VbÂ˙˙ä%‰Ĵu?v,…‰MD˙j˙˝˙˙€R›PŠƒUñÜ[^˙cTfÉ·VbÂ˙˙ä(+<;998;3IF‚z 46323225458 ,íŝü˙ŝ˙˙ŭ˙ç>ċ˙ŝü˙“i4Yöq9í™×Cs5Äє2Ĉ€3_Q0˙˙è3m“wJa‹˙˙½<÷:#èq˙˙‰`4x"aJtúStԒ4Ċ€2aM>˙üĉ(+<;::9;2IF‚z,67334328+76 1ïŝü˙ŭ˙ŝŝġ,„´ ¤)e5H„^˙Ĥ/ß(íäBlBñʒAñ:y0Wkŝ˙ċhBӉ:³²k@î?‚&^X˙˙P>îBÀĦY£…ǐCñ:y0Xhˆ˙˙ċ(*:99<:<2HF‚z.$2423256.56 .ë˙û˙ŝ˙ú˙Ħ4C4fġiGE˜ ‹˙L–sàġhÖR)QŬúZ@˘9A}˙˙ìpï˙m­ñL;?9Äġké=ğ§˙˙…oêrİŠ4UP×ûZ@˘9A}˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝö÷÷ŭ˙û€˙ŭŭ˙ĝú€˙ûù˙ú˙ŝ˙ĝúôjkñŝ˙˙üö÷ù˙íñ˙öú˙ŭĝ˙ĝ˙ûüüö÷ü˙˙üŝŭŝŭü˙ŝ˙ĝúôjkñŝ€˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qtssuwtvvwvuurtvuvssvtwxwutxwnr€wu€tustwtuw€x0utvtxuuvttuvvtvuuvwxwxvuyxosxwxu}L97#>8898;2IG‚!E/4)8033223166,9;!€‚€€‚ƒ€ €;D,(@7997;0DD‚)E)6&91322323167'.29˜878€97„8799::9†:…9:<<ƒ;<;=<<;;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙ú˙ÍÇôöĠ׃Ÿ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûû˙ÇÙ˙˙ÜɊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙÷˙ŝ˙ŝ“˙ŝ˙û˙ÇÄïñË˂;h[8!¤˙Q!€c!şÊ”ĵ˙ü†˙ŭ˙è&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝŠ˙‚ŝ˙˙€ŝ˙˙€ŝ˙!ŝ˙ïÁµñħReSQRY°ìŝ˙´eYNSlžĉ˙Ŭ­ĵ˙ü†˙ŭ˙è&5;IHGHGK@WO‚ @F@BAA@D=:a˙ġ˙üŭŭ€ŝ”˙ŝŽŭŝ˙ŝŝ…˙ŭú…˙ŝŭ„˙ŝŭŭŝû˙ç'5;IHGHGK@VP‚ @F@ ?D=9a˙÷˙ŝ„˙‡ŭŝƒ˙ŝ•˙ ŝúü÷óööĝùŭ˙ŝĝóôöû˙ûĝùŭŝ†˙ŝ˙ì+4;IHGGFJ@WP‚ ?FAA@A@D>9YíÜéîññóġ÷úü˙ŝ€ŭ˙ñĠ׍ց×Ö×ÙÜù’˙ŝüùĝöôòñïçċŬàEABBA?D>8NÒÇÄÄĈÉËÍÏĠÖÖÚŬáäêòñòô÷ùûŭ˙˙ŝ˙êǗÄÉë€˙"ûúĝöóññêċâàŬÙÖĠÖÒÏÍËÉÇĊĊÄÁÂıÈ=.=HH€GJ@WP‚ >E>@@A?D>6CĜÄÍÉÊÊÉÈÈÇĈ‡Ä ĊÈÊÌÎÑÖÖÙÙĈÈ—Ê ÇÇĠÖĠÏÍËÉÇĊˆÄĊÇÇÈȀÉĈÄĊ½É:/=HHFGFI@WP‚ ?E@?=@@E>6DĠÁÊĈÇǁÈÉ‡Ê ÉÉÈÇÇĈĊÄÄĊÉȗÇÈȀÄĈÇÈÈÉɈÊÉɀÈÇĈÄÂÀÀ¸Ċ;.=HHGHGK@WP‚ =D?A@?=C=7DÖÂËDŽȈǀȀɀÊǙÈǀÊɁȉǂÈÇĊÁżÀ·:/=HHGHGK@XP‚ =D>?@A>C=6DÖÂËÇ”ÈÇ›È€Ç’È ĈÄÀżĵ½µÁ9/=HH€GK@WP‚ >D?==?@C=5DÖÂËÇÍÈĈÄÂÀ½şğ³ż9/=HHGHGJ@VP‚ >€? =B<5DÖÂËÇÊÈÇĊÄÂÀĵş¸ĥ·Żş8/=HHFHFK@WQ‚;C==>@>B<5DÖÂËÇÉÈÇĊÁż½ĵş¸ĥ³´Ĵ¸8/=HHGHGJ@VP‚ =<==B<5DÖÂËÇÈÈÇĊÁżğş·ĥ´ħ²Şĥ70=HHFGFJ@WP‚ ?>>=@:2DÖÂËÇÈ&ĈÄÁ½ğı·µ³ħ°ĴިĤ¤£ žŸ˜Ħ20;HHGGEI?VP‚ 8A<;:;;@:2DÖÂËǽÈ'ĈÄÀż½ğı·µ³²Ż­ĞިĤ¤˘ žœœ•ž20:HGFHFJ?WP‚ 9A<=<;9?92DÖÂËÇĵÈ(ĈÄÂÀ½ş¸·µ²ħŻ­ĴިĤ¤˘ žš™“›11:GGDFGI?WP‚8@;€< :?91DÖÂËÇşÈ*ÇĈÄÂÀĵş¸ĥ´³°Ż­Ğݧ¤˘ žœš˜—’š01:GFFECI?VP‚7A:9;<;@91DÖÂËÇıÈ+ÇĊÁÀ½ĵş¸ĥ´³°ŻĴĞݧ£Ħ žœš˜–•˜01:GFEFDH>UQ‚ 7@;;€9?91DÖÂËǸÈ,ÇĊÄÁÀ½ĵş¸ĥ´²°­Şİ§£ĦŸ›™˜–”“–01:GGEEDG>UP‚ 7?9<<;9=81DÖÂËÇ·È-ÇĊÁż½ğş¸ĥ´ħ°ĴШ§£ĦŸ›™—•“‘‘‹“/19GFFEEH>UP‚ 8?99;<;>80DÖÂËÇĥÈ.ĈÄÂÀ½ğı·µ³ħ°Ĵި§¤£ĦŸ›™—–”‘‰.19GEEFEI>UO‚6?:9899>81DÖÂËǵÈ&ĈÄÂÁ½ğ¸·µ³ħ°ĴިĤ¤˘ Ÿœ›™—•“‘‡.19GE€CG>UM‚5?9:9:7=80DÖÂËÇ´È&ĈÄÂÀĵşı·´³ħŻĞݨĤ¤˘ žœš™—•“‘‹‹…Œ-19G€ECF=UO‚6>89:;9=70DÖÂËDzÈ(ÇĈÂÀĵ𸷴³ħŻ­ĞŞ§¤˘Ÿžœš˜–”’‹‰ˆ‚Š-18G€EDG=TO‚7>788:9=70DÖÂËÇħÈ3ÇĊÁÀ½ĵş¸ĥ´²ħ­Ğݧ¤˘Ÿžœš˜–”’‘Œ‹‰‡†€ˆ,17FFDDCG=TN‚7>89786<60DÖÂËǰÈ4ÇĊÁż½ğş·ĥ´²°ĴĞݧ¤£ĦŸœš—–”’Ž‹‰‡…„~…,27FFDEDG=TN‚6>89897<60DÖÂËÇŻÈ5ĈÄÁż½ĵı¸ĥ´²°ĴŞİĤ¤£ĦŸ›š—–”’ŽŒŠˆ†…ƒ‚|ƒ+27FEEFCG=TN‚5>€8 98<6/DÖÂËÇÈ6ĈÄÂÀż½ğı·µ³²°Ĵި§£ĦŸ›™—•”‘Ž‹Šˆ†…ƒ€€z+27GEDECG=TN‚6>€8 97<6/DÖÂËÇ­È7ĈÄÂÀ½ğıĥµ³ħŻĴިĤ¤£ Ÿš™—•“‘ŽŒŠˆ†„‚€~~x*26GFFEBG=SN‚4>99898<6/DÖÂËÇĞÈ9ÇĈÄÂÀ½şı·µ³ħŻ­ĞŞ¨¤˘ žœš™—•“‘‹‰‡†„‚€~||w|)26EEDFEH=TN‚4=89::7<6.DÖÂËÇĞÈ9ĊÄÂÀĵşı·µ³ħŻ­Ğݧ¤˘ œš˜—”“‘‹‰‡…ƒ€~|zyt{)26FDBDCG=TN‚4=767:8<6.DÖÂËÇİÈ;ÇĈÄÂż½ĵş¸ĥ´³ħĴĞݧ£˘Ÿžœš˜–”’‘ŽŠˆ‡…ƒ€}|zwwrw)26FEDCAF=SN‚4=87686;6.DÖÂËǨÈ1ÇĊÁż½ĵş¸ĥ´²°Ż­Şİ§£ĦŸœš—–”’ŽŒŠ‰‡…ƒ~|ywuupu(25DBF@@C9QJ‚0:5454482*DÖÂËǕÈOĈÄÂÀ½ğı·µ³ħ°­ĞިĤ˘ žœ›™—•“‘ŒŠˆ†„‚€|{yvusqonljhfdb`^\[YWUSQPLN41C@?>?C8QJ‚0:45€483*DÖÂËǔÈPĈÄÂÀ½ş¸·µ³ħŻ­ĴިĤ¤˘ žœš™—•“‘Ž‹Šˆ†„‚€~|zxwusqomligfda`^\ZYWUSQONJK30B@AA>A8PJ‚/:5443483)EÖÂËǓÈQĈÂÀĵş¸ĥµ³ħŻ­Ğݧ£˘ žœš™–•“‘‹‰‡†ƒ‚~|zxvtsqomkigecb`^\ZXVTSPNMKHI40A?>@?C8OI‚.95 383)EÖÂËǑÈSÇĈÁÀĵş¸·´³ħ­Ğݧ£˘ žœš˜–”’‹‰‡…„~|zxvtrpomjhgeca`^[ZXVTRPNLKIFG40B?>>=B8PI‚/93455483)EÖÂËǐÈTÇĊÁż½ĵş¸ĥ´²°Ż­Ğݧ£ĦŸžœš˜–”’ŽŒ‹ˆ‡…ƒ~{yxvtrpomjhgeca_][YWVTRPNLJHGDE4/B@??<@7OJ‚093325483)EÖÂËǏÈUĈÄÂż½ğş¸µ´²°ĴШ§£Ħ ›š—–”’ŽŒ‹ˆ‡…ƒ}{yxutrpnljifdca_][YXUSRPNLJHFEBC4/@??@>A7NH‚/93432171)DÖÂËǎÈVĈĊÁż½ğı·µ´²°ĴިĤ¤£ Ÿ›™˜•”’ŽŒŠˆ†„‚€}{ywusrpnljhfdba_][YWUSQOMLJHFDC?A4/@><>>B7NI‚083€4 371(DÖÂËǍÈWĈÄÁż½ğı·µ³²°ĴިĤ¤˘ Ÿš™—•“‘ŒŠˆ†„‚€}{yvusqonljhfdba_]ZXVUSQPNKIGFDB@>>4.A?==;?7OH‚083424372(DÖÂËnjÈNĈÄÂÀ½ğı·µ³ħŻ­Ĵި¤˘ žœš™—•“‘‹Šˆ†„‚€~|zxwusqomkjgfdb`^\ZYVTSQOMKIHEDB@>;<4.A€><994.A=A6MH‚/83255371(DÖÂËljÈ[ÇĊÂÀĵş¸ĥ´³ħ­Ğݧ¤ĦŸžœš˜–•“‘ŽŒ‹‰‡…ƒ€~{zxvtrpomkigeca_][ZXVTRPOMKIGECB?=<:774.A=;<<@6MI‚.73213372(DÖÂËLjÈRÇĊÁÀ½ĵş¸ĥ´²°Ż­Şİ§¤ĦŸžœš˜–”’Ž‹ˆ†…ƒ~|yxvtrpoljhgeca_][YWUTRPNLJHGECA?=;98554,A€=:=5MH‚07€3 2061(DÖÂËLJÈ]ĈĊÁż½ğş¸ĥ´²°ĴШ§£ĦŸ›™˜•”’ŽŒ‹‰‡…ƒ€}{yxvtrpnljhgeba_][YWUSQPNLJHFDBA?=;975424,@=<=<:97531/.5,@==<;?5LH‚173 261'EÖÂËDŽÈ`ĈÄÂÀĵğı·µ³²°ĴިĤ¤˘ĦŸ›™—•“’ŽŒŠ‰†…ƒ}zxxutrpnljhgeba_][YWUSQPNLJIFDB@?=;985420.,5,?=>><:==:97531/,+)&%#!4+?€<:=4KG‚z 173212160(HäÙĠÖÖĠÔÒÑÏÎÌÊÉÇĈĊÄÂÁżż½ğı¸·ĥ´³²°Ż­ĴĞݨĤ£˘ĦŸžœ›™—–”“‘‘ŽŒŠ‰‰†…„ƒ}{zywvusqqomlkjhfecba__\]S4+=<<=<=4KG‚ 063323260( S˙ĝ˙ŝÒ˙ŝ˙ŭ˙ä#1,=;9;;?4KG‚ 253232260( O˙÷˙ü„ŭŝĝ€óôü€˙ŝŝ˙˙ûùŝŝ˙ŭ˙ŭ˙˙üŭŭ€˙ŭŝ˙˙ŝ€ûôïöûòñĝûôúúûġ÷úúööŭŝŭŝŝúû€ŭùú€ŝúûŭüüö˙Ŝ*,=<;:8<4JG‚ 253233260) T˙ö˙ŝ‹˙úùĝŭŭ÷ùŝüŭú÷ûçûĝööù˙öġ÷ŝûùùü–˙û÷úù÷ŝŝúúû˙ŝĝöĝ˙üúúŝŭ˙ä(,;€<9=3IF‚ 253 252#"#ĉ˙ü˙ŭ€˙ ŝ˙ü˙ż[dX‡üŝ˙˙ŝ˙ú˙Ġ”˙ĝ˙ó›òù˙Y¸˙ö˙ŝ‚˙ü˙òxNUO·üv\_cÚûwß˙˙ˆż˙˙ĥ§˙ù˙ŝƒ˙ŝŭ€˙ŝŝ˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝ˙aŝú-_Šx‹˙Yc×Oo×`Ώák`·˙ZXeÉ·VbÂ˙˙ä%‰Ĵu?v,…‰MD˙j˙˝˙˙€R›PŠƒUñÜ[^˙cTfÉ·VbÂ˙˙ä(+<;998;3IF‚z 46323225458 ,íŝü˙ŝ˙˙ŭ˙ç>ċ˙ŝü˙“i4Yöq9í™×Cs5Äє2Ĉ€3_Q0˙˙è3m“wJa‹˙˙½<÷:#èq˙˙‰`4x"aJtúStԒ4Ċ€2aM>˙üĉ(+<;::9;2IF‚z,67334328+76 1ïŝü˙ŭ˙ŝŝġ,„´ ¤)e5H„^˙Ĥ/ß(íäBlBñʒAñ:y0Wkŝ˙ċhBӉ:³²k@î?‚&^X˙˙P>îBÀĦY£…ǐCñ:y0Xhˆ˙˙ċ(*:99<:<2HF‚z.$2423256.56 .ë˙û˙ŝ˙ú˙Ħ4C4fġiGE˜ ‹˙L–sàġhÖR)QŬúZ@˘9A}˙˙ìpï˙m­ñL;?9Äġké=ğ§˙˙…oêrİŠ4UP×ûZ@˘9A}˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝö÷÷ŭ˙û€˙ŭŭ˙ĝú€˙ûù˙ú˙ŝ˙ĝúôjkñŝ˙˙üö÷ù˙íñ˙öú˙ŭĝ˙ĝ˙ûüüö÷ü˙˙üŝŭŝŭü˙ŝ˙ĝúôjkñŝ€˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qtssuwtvvwvuurtvuvssvtwxwutxwnr€wu€tustwtuw€x0utvtxuuvttuvvtvuuvwxwxvuyxosxwxu}L97#>8898;2IG‚!E/4)8033223166,9;!€‚€€‚ƒ€ €;D,(@7997;0DD‚)E)6&91322323167'.29˜878€97„8799::9†:…9:<<ƒ;<;=<<;;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙û˙ÎÉġ÷×ĜƒŸ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûû˙ÉÚ˙˙Ŭˊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙ö˙ŭƒŝŠ˙ŝ…˙ŝŝ˙ŝ˙ŝ˙ŝƒ˙ŝ˙ú˙ÈĊïñÌ́;h[8!¤˙Q!€c !şÊ”ĵ˙ü˙„ŝ˙ü˙ç&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝ„˙„ŝŭ‚ŝ˙˙ŝŝŭ˙!ŝ˙ñÂÂĊşó²UhTPRYŻìŝ˙³dYMRkċ˙ÜĴğ˙û†˙ŭ˙è&5;IHGHGK@WO‚ @F@BAA@D=:`˙ñû÷ĝĝùúüŭŝ˙ŝ˙úŽĝûŝŭŭ˙ûŭ…˙ŝûŒ˙ŝŭüûù€ĝùöŭá%6;IHGHGK@VP‚ @F@ ?D=:a˙÷˙ŝ„˙ú†ĝùúûŭŝ‚˙úŝ•˙ ŝ˙úîĝùúĝüŝûôîïñöúġòôĝŭ†˙ŝ˙ï.3EABBA?D@2&ƒ!;ACScuƒžÂ½ÄÏÙäîù˙˙ü˙–¨˙ŭŝéßÖÍĽÀ£Š€qbTF>B. ƒ :8KH€GJ@WP‚ >E>@@A?C@0% ‹  -A?PM” :B:!ށ :8JHFGFI@WP‚ ?E@?=@@DA1&„†…—„ˆ„ :8KHGHGK@WP‚ =D?A@?=B@2&€—‘‚ :8KHGHGK@XP‚ =D>?@A>B@0&†‰†™…‹† :8KH€GK@WP‚ >D?==>@B@0&•ƒ›‚— :8KHGHGJ@VP‚ >€?=A>/&Ĝ :8KHFHFK@WQ‚;C==>@>A>0&Ĝ ;8JHGHGJ@VP‚ =<==A>0&Ĝ ;8JHFGFJ@WP‚ ?>>/&Ĝ ;8JHGHFK@WP‚ ;B<==?=@=/&Ĝ :8KH€GJ@WP‚;B;<<==A=/&Ĝ :7KHHGFJ@WP‚ :B<=<<;@=/&Ĝ :7JHHIGK@VP‚:B<;?=.%Ĝ :7IGEEFJ@VP‚:C<==<=?=,%Ĝ :7J€GEI?VP‚ 8A<;:;;?=,%Ĝ :6JFFHFJ?WP‚ 9A<=<;9><,%Ĝ :6HFDFGI?WP‚8@;€<:>;,%Ĝ :6IFFECI?VP‚7A:9;<;?<+%Ĝ :6IFEFDH>UQ‚ 7@;;€9><+%Ĝ :5HFEEDG>UP‚ 7?9<<;9=;+%Ĝ :5HFFEEH>UP‚ 8?99;<;=;*$Ĝ :6HEEFEI>UO‚6?:9899=:+$Ĝ :6IE€CG>UM‚5?9:9:7<:*$Ĝ :5I€ECF=UO‚6>89:;9<:*$Ĝ :5I€EDG=TO‚7>788:9<:*$Ĝ :4HEDDCG=TN‚7>89786;9+$Ĝ :4HEDEDG=TN‚6>89897;9*$Ĝ :4HEEFCG=TN‚5>€898;9)$Ĝ :4HEDECG=TN‚6>€897;9)$Ĝ 93HEFEBG=SN‚4>99898;9)$Ĝ :3GEDFEH=TN‚4=89::7;9)$Ĝ 93GDBDCG=TN‚4=767:8;9($Ĝ 93GDDCAF=SN‚4=87686:9($Ĝ 92F€DBF@@C9QJ‚0:5454475%#Ĝ 9/D@?>?C8QJ‚0:45€475$#Ĝ 8.C@AA>A8PJ‚/:5443475$#Ĝ 8.B?>@?C8OI‚.95375$#Ĝ 8.C?>>=B8PI‚/93455475$#Ĝ 8-C€?<@7OJ‚093325485$#Ĝ 8-A??@>A7NH‚/93432174$#Ĝ 8-A><>>B7NI‚083€4364##Ĝ 8,B>==;?7OH‚083424364##Ĝ 8,B€>A6MH‚/83255364##Ĝ 8,A=;<<@6MI‚.73213364""Ĝ 7+A<==:=5MH‚07€32063#"Ĝ 7*A=<=>A†@‚?†@?@AŽ@‚?@‚?@?€@??@@??‘@?B85*=<<=<=4KG‚ 063323260( S˙ĝ˙ŝÒ˙ŝ˙ŭ˙ċ#1,=;9;;?4KG‚ 253232260( M˙òú÷„ĝùó€îï÷úûûùùüûöôúúüúŝúüüùùĝ€üùúûûú€ĝñííìóĝï€îġĝñ÷ĝĝòġĝĝôôûüûüüĝù€ûĝù€üùú€ûġŝŬ*+=<;:8<4JG‚ 253233260) T˙ö˙ŝ‹˙üûûŝ˙ùû˙ŭŝüùüéüùĝĝú˙ĝ÷ùŝŭûûŭ–˙üĝûúĝ˙ŝûûü˙ŝù÷ùŝŭûú˙ŭ˙ä(,;€<9=3IF‚ 253 252#""ċ˙û˙ŭ€ŝŭ˙ú˙ZcW†ûŝ˙˙ŝ˙ú˙Ԕ˙ĝ˙óšòù˙Y·˙ö˙€ŝ€˙ü˙òwMUNĥüv\_cÙûvŜ˙˙‡ż˙˙ĥ§˙ù˙ŝƒ˙ŝŭ€˙ŝŝ˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝ˙aŝú-_Šx‹˙Yc×Oo×`Ώák`·˙ZXeÉ·VbÂ˙˙ä%‰Ĵu?v,…‰MD˙j˙˝˙˙€R›PŠƒUñÜ[^˙cTfÉ·VbÂ˙˙ä(+<;998;3IF‚z 46323225458 ,íŝü˙ŝ˙˙ŭ˙ç>ċ˙ŝü˙“i4Yöq9í™×Cs5Äє2Ĉ€3_Q0˙˙è3m“wJa‹˙˙½<÷:#èq˙˙‰`4x"aJtúStԒ4Ċ€2aM>˙üĉ(+<;::9;2IF‚z,67334328+76 1ïŝü˙ŭ˙ŝŝġ,„´ ¤)e5H„^˙Ĥ/ß(íäBlBñʒAñ:y0Wkŝ˙ċhBӉ:³²k@î?‚&^X˙˙P>îBÀĦY£…ǐCñ:y0Xhˆ˙˙ċ(*:99<:<2HF‚z.$2423256.56 .ë˙û˙ŝ˙ú˙Ħ4C4fġiGE˜ ‹˙L–sàġhÖR)QŬúZ@˘9A}˙˙ìpï˙m­ñL;?9Äġké=ğ§˙˙…oêrİŠ4UP×ûZ@˘9A}˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝö÷÷ŭ˙û€˙ŭŭ˙ĝú€˙ûù˙ú˙ŝ˙ĝúôjkñŝ˙˙üö÷ù˙íñ˙öú˙ŭĝ˙ĝ˙ûüüö÷ü˙˙üŝŭŝŭü˙ŝ˙ĝúôjkñŝ€˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qtssuwtvvwvuurtvuvssvtwxwutxwnr€wu€tustwtuw€x0utvtxuuvttuvvtvuuvwxwxvuyxosxwxu}L97#>8898;2IG‚!E/4)8033223166,9;!€‚€€‚ƒ€ €;D,(@7997;0DD‚)E)6&91322323167'.29˜878€97„8799::9†:…9:<<ƒ;<;=<<;;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"·˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûsŽ˙ġ˙úûûûûûûûûûûûûûúûûûûûûûûûûûûûûûûûûûûûûûûûûúúúúúúúúúúúúúúúúúúúúúúúûúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúûúúúûú˙=Ġ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ö˙ˆë˙ŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝŝŝŝŭŝŝŝ˙ŝŝŝŝŝŝŝŝŝŭŭŝŝŝŝŝŝŝŭŭŭŭŝŝŝŝŭŝŝŭŭŭŝŝŝŝŝŝŝŝŝŭŝŝŝŝŭŭŝŭŝŝŭŝŭŝŝŝŝŝŭŭŝŝŝŝŝŭŝŝŝŭŭ˙ĝ˙ !˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙˙ŝ˙˙ŝŝŝŝŝ˙˙ŝ˙ŝŝŝ˙˙ŝŝ˙˙ŝŝ˙ŝŝŝŝŝŝ˙˙˙ŝŝ˙˙˙˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝ˙˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙˙˙ŝ˙˙ŝ˙÷˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙ŝŝ˙ŝ˙ŝ˙ĝ˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŝŝŝŝŭ˙÷˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙ŝŝŭŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŝŭ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝŝŭŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭŝŝŝ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙÷˙¨!ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝŝŭŝŭŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŭŭŝü˙÷˙¨!ñ˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙˙˙ŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§#ò˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŭŭ˙ĝ˙Ĥ#ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙Ĥ#ó˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙Ĥ$ó˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ$ô˙˙ŝŭŭŝŝŭŝŭŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŭŝŝŭ˙÷˙Ĥ!˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ç˙ŭ˙ŝ˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ċ˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙ŭŝŝ˙˙ŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙˙˙ŝ˙˙ŝŝ˙˙ŝ˙˙˙˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝ˙˙ŝ˙˙˙ŝ˙ŝŝ˙˙˙˙ŝ˙ŝŝŝ˙˙˙ŝ˙ŝŝŝ˙ŝ˙ŝ˙˙˙˙˙˙˙ŝŝŭ˙ĝ˙ĤÔ˙û˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙ŭŝŝŝ˙ŝ˙ŝŝŝ˙ŝŝ˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙ĤË˙ú˙ŭŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ˙ù˙ŭŝŝŝŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝ˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝŝ˙˙ŝŝ˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙ŝŝ˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝ˙˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙˜§˙ĝ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙’ƒ˙ĝ˙ŭŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝ˙ŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝŝŝ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙>˙ú˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ˆ Ú˙û˙ŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŭŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙‡˙ĝ˙ŝŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙‡ ïŝŝ˙ŭŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭ˙ŝ˙ŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙‡q˙ġ˙˙ŝŭŭŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙÷˙‡˙ôü˙˙˙˙˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙ŭŝŝ˙˙˙˙ŝŝŝŝ˙ŝŝ˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙ŝŝ˙˙˙ŝ˙ù˙€ŝŝü÷úüŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝüŝñ˙[?Éü˙˙˙˙ŭüüüüüüüüüüüŭüüüŭüüüüüüüŭüüüüüüŭüüüüŭüŭüüüüüüüüüŭŭŭüüüüŭŭŭŭüŭüüüüüüüüüŭüüüüüüüüüüüüüüŭüŭüŭüüüüüüüŭ˙˙ŝ˙ŭ˙Ô9œÓçòü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝóòêܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08{ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2c˙O˙Q2˙R ˙\ PXX`XX`XX`XXXPPX˙dKakadu-v5.2.1˙ zĠ˙“ÏÀüĈR@îöpsDG|İVï¤8ĝÁzƒuĊ· /ż Ô/bêBêÙˆĴĈúUPS:§<ĵ Á7™ğ -ıÏÀì‡[™'·Áa×íbU;Ϙù]~p×÷(sDÀÌÀhÒl:"’Ĵk< ³WŸ&· Á‡XäÈ×ÏÀì‡[™'·Áa×íbU;Ϙù]~p×÷(sDÀÌÀhÒlR{K°RxbXï[‹n„ża“#_ÏÀüß²È´TIġL° ˘êä˘2uèe-ògwı эvÀY“‡(%EOéÎ?)˘“˙Pğ”•Nf8Çàq”? ħÍ£nĈ€ ÚûŽĥ€Q›–îÑë‰aí,À–´”n]&Gĝĥg?‡‡:ċ°ñqÔİ˙]ŸÛÚŞp6XŻÌ”Ú𤠒² FG‡ŭ4ŜÛ Ġ˙t`$÷µÒ--×B-L\߯älw_=™Bh$Ÿr™Ĵ£?/ls$ĊeÓÄá·Àx­!ٟNqcŞìÉh@µí,Àš´˜n]&Gĝĥg?‡‡:ċ°ñqÔİ˙G.M̲0y£ŠŬüżfêÒh|ĠŝkskMG‡ŭ4ŜÛ Ġ˙t`$ĠLîNPwN;ç$„àԌ°X_ DŒ dBh$Ÿr™Ĵ£?/ls$ĊeÓÄá·Àx­"ĉÂbˆœžXŜ"ÀÇà1€ÄhÈ#ĉu·wşslP‘VPê ÚÒ †ŻĴÑwÛ·ôÂ9[f7} ÑâPîÁ>°@E§ }4Ÿç‡–ˆÇáVGáLGçK€yËûĴÀĥBFĞëÊIá}bè:‹.Ü9ĤĝlòáŒ!ĄzÒ°mħ„G^ ´‡tĈÇ=D.ˆèŜnY_¤:ŠÂíôW<ƒ̽)‚êG¤$+™jĴT4“‡nşŽĠjsÄkž‰2‡Ş_Ò×Ñ÷żŭŬş‹¤ÄmJM€ôĵŞ}ħtn>~e?á›âŭn€,'ȂE•h„@}kşĈŠêóNˆP-Ğ ċ!á}¸n_ä,ˆ=ßB"ó‰ÔÚX1} Ş1¨4÷ Ym_ċt ´ĦïݍĤŸœ2 ÓñĜcqB‰ĥGµMÚ8'K£Œ'°C%Ïï÷T­\ ŽAI´ ”*}GOĉŬĵŽñ‡è=ûxÀĜİó#ÊÇ9J÷‹„˘—SRÉÏĈÂU~<šW[B×*o?wtE*‚FÀ‰ú?¨…Ôï•y]NĦڕ\!ÁŬ=ûCùëa$Ĥú›ú͐97ïìĵ£P߅4Im”w;KÎ Ív§Eûr7†Xĵ!ë‰ K˘1ûp…×XDÖ£gĞY(˙|<™aB÷û`x&µ[˜;ÈÔHoxÓ"@%Ŝ ö Zb˙Sי]%şmEıè_Ò6-5Z7Çà§‚„ièn²˜ñUK¨rŻdš˜{މ ħoU‹Bi…Dı n 4?Ĉ‚ġ·J.,´\ÙëSĈ$ĵ"&&*³!g5ÉĦUÏ1¸œlä0ž$ĈpçÒtĠ&œJüÂiT'ó…tóCx'ö´ÉfuMßC”";tħüû,ƒ/œÒç0kşÄùÚ8VĉͽĤµët³˙kÏßX:î蜆•.ÍêcÀÄÑJ}$ïrûTàÛ%ĝ9y'Ÿç‡X/âZ•˜­F#5‘„ĠhĦµrŠ[Ä$m€cöJăEÚÇà‚¤in²˜ñUK¨rŻdš˜{މ ħoU‹Bi…Dı nñ~ìRŭÔE½7%§§ŬABĵ,uV²ÔC+Ԛlb;L²[e"LQş6*ŭ0Kӑ È>$ĈpçÒtĠ&œJüÂiT'ó…tóCx'ö´ÉfuMßC”";tħü XŞ{É}²ĦğuÖt™PˆIm$GĴÔ]ódÑüûĊwnŜÌ_Í †°ÀÄÑJ}$ïrûTàÛ%ĝ'zo0+•ŬÈĥ+x˜Ê/óÄJ ~9œ?ĉLÌ\Ĥ[oµĠd{! ÏÍ?~`]£=@Éŝ¸ âPŜż> Bk¸pĵó"  ¨`3 ¨QkMq›͜ Ñ1äğŬöµċRîċ‹ÄmèïiOŜƒB!Ĥ Oİn'|Uä Òğ:ùġ7ƒ0µ8”)Ўşë´&Àô[˘Œ‹DGÛښ_GR!ĉpuL,4€´K%’(†Ï×R@Aĥ§(‹,ü™™ßàäĝüö*tÇáğóóŬĝüö̇Rèt } ɕg ŞÓ›X.l1œĜÚ9fù3İu(ˆÁ{żeXaÉ]zbŬ"4CĠښD_LF–› İĴ‡éĈË?ŝï×Ž0ûĥ§€'Ìżtü¤Ğw{pŬLŝu¸Í”a\œñq|¤Ö´ÉÖrŠaĠ|í²”Àî§ûÔkîkN¸BÈJ ³Kh=^zĊ1Û9éùA˜-ÄB 0‰GÀv rSÌ N³'aT“Ż6<_ CŽ%N€[$6†f/­Ë…ç19W‰é’Çß,fÌùBk\dÜo`•?l"²•”ĦBKĴïĥnüi 4xĉ‡‰(Xa˜áÍB‰ ‚PfmÓżÈëÜĦF—ġcíµ t4JêÖġ€3ˆgG—$ĞçĜœ˙^ ›ß˜€ÖĞ÷¸A†AfİטÍH‡í^bx xĥ˙N÷­-ğħ LÌŬˆğׅ-~U;U%d<*y¤€½NÚMŞ&+h*nDÙ'r%Ug¨ħ;Ü6ôŒ_İói =Jém{5‹ĴĞñZG·]şÉV2F€²dµ½y?ĈÓŬÙ•Ĝşg@#™˙ s}׿ ˜Ñâ9²†‹ĵÂħq$Öp~ÔĞ'£(Š>€–‹Š·R§ıiët˘/žè1Dˆ£\'ĥP‚ĝ~…†t6q<ÜÉ1 ĉµd¸‚îżíu6Q :ÉĵP:ó9]r¨Ÿó†¸ħŻQÉ9˘œĴ%$†Râ˙ 4 IĦiŜŻÈ}ZŭğKM‘W#°ž^ÄT˙:™Ž<ğšçFh0v‚N—Ds>ߛ·×|³ Ô0ä„óA,‚-(|Üìapĥ…\qŭ Ĝr)ĥ퀠ƒˆÑƒĞ<-›…CîD{|C,ԕüP‘“œM‰P\ZV)zĴ!‰­ÔxĝFî`\0ŻŬTŒÖm[1ß°3–M1Š(Bŭ¨S'é=ô5p-„Ŝĉ?úÔIä xÎwŒ3ĝ;BuVRšáfŻ”)WjżÒ]·t§C¨ŭ½á]ıqŒ¨g;¤%œ›0HO“b€¸;Ĵ˘|6Kâ9Ħğê职?‰~––M ĴÁèë‚}·†ÂmH ˙sqÉyÀS&“îSËÂ#Ĉğ¸3@ôŬ>`×ÊMCQÇ˙;L‚t²§Â/݌¤?gC̎Ñù/4rä`š\"Ĝ]h/žŽ7 áÛrı<:ĞĴŬ_Ü2ġ=İp)ŸhZZ}mżNèü½WÄÏđicbP[†¨J……0„¨ڋ4òUSŝ@ 8 +ó=ċ͑]– ğŝ dF4úˆi“>K#,%15OŸ0°AXşëàŻ€tġÑĜTŭÖ†˘NĦşYjŜBX­%“I~ù‚9mAĉG1]fò9È<kdˆŜ ”™ìòŝĉ}[È t,Òĥòƒ0½KàĈĝ$yĉËáŸ$g:Ĥ[iˆdˆöìP2%Ë ‹ĉħŠ€0à—dO}#ĜçSĊ3³OҍÒOCĥĝ”ö:íŞáöĠP}´PÒġ8#½ğ×Yï< ’B …>'nžĵí0Q™›¨ŞlħĴ¤ċ´ è§2<jqáo0݃ĜrŠ‰Rş˙m˜Ĥ‰3Ÿ˜;-:Ïû üµÉ´Żlo{ƒÀ_PjjoaÔb?˙9œR¤/ĈĦ‰£*ĈBá4ĵaÚÔ oż.áj·\•BUİqOjĝè:=pğ5D1 ÜyŠh{Ú2琓1€D!QûŜj˘š‡ÀÒÔo¤xŞüüáž(^ül ɟÈô·<ď‡çސĝ²Ĉgz*Żô–· â[8) ôŬì<‹_bŜ45ц”!'ց4 >|äûĵèêáíd+™Ċ†Ċ‡5rĴÎĤòPEĜl˙EêéǏú9vÂ3Şk&o÷>)˜ÔPv)?Ĥ>½ÏâiXäòé•` X2D”£-ݧRŭèĦ `EòÖóŬ ?ĵÄbÏà…SÚ°$}ĝTZQY\˜HŽ[ÊäĊĊ|_VP‘F”hϓö™˘ı!ĥċİäÌߣ½qÌëĜÉŝÓÑOä}EĜÉ>ÓjáüÂEždôBË[CÉw."‡÷Ü· ŜoÈĞ„ĵšsÀOs”xSSŭ Yí"ĈíŞĦöĠP}´@Òġ8#½ğ×Yï< ’B …>'nžĵí0Q™›¨ŞlħĴ¤ċ´ èħ(b0œ-ĉ0{Ŭ$ûµ7ԃ‹mû“9=FîÂrà(~WlÖ>‚ƒiW~ŜY¤û´àÈWŽcĤx|‘áArÌD£ˆzLȧq|Í#ĵL@°ŭxm pF_ĝ3H¤Ïş|ƒÑâÀġ|¤ŝ›WD·=òऎ“1€D!QûŜj˘š‡ÀÒÔo¤xŞüüáž(^ül ɟÈô·<ď‡çސĝ²Ĉgz*Żô–· â[8) ôŬì<‹_bŜĞ 6fpvh9 >*v!߁£ò´òÊàÔQÊİŞ£éË÷Ár˙y×ЎLpÌóŬ‡XġòÖxŞòdqÌV¨Âvd„QĵˆÌtĈZ<Ŝlĵ›à”µC$MìÇo:mìDĦ `EòÖóŬ ?Ç^ZĊ;"PéÑIògÈĊŜĤY…Jŭ6 ͙×ĥâ‹Vk·XĠŝ P+ı†J у0ë„îŜ—"äX ½°F÷hŜfOLwÊĊ4¸‰§xFĞÓ{\ÛeôÓ k[ó˙céĥ%kÛ¸ġ(Çòc&j‘WÇáLOÍòƒp‰û€½¸·Ç_öšK„ŝHo<ßÈ/ñfĈf†ËĊ:•qö8AvÔ²JşvTĉùT.²I"Ro’nÊŞ€Ċ!$ĝZŝƒT˙O‡T7VĽQ×ۏaì˘à q/LhGʊ‰àƒ`Úlùä£@š~„ kwj„ÏŝñÜHœ³Ë ıM•ÖxoŒ´÷–ù—ĥ,*}eŸJ0á8ÔÖÙŝ'ŽLÑîRBX£È°RħxFßC”£ ٍ-ìñ9·\÷–@†Ó -ïdl)6ŝ5FŸĵFAh˘;‚‹ÛM›Ò„ [>¸ ݤ6ìʰQŒ=ĈĤ@b›:„ĞôlíßlôHfÄA%÷ÊU;ûO`í€$HċÛí…è·_vó–ÙĊO÷À|҉܈ g‚EvĴ *DnĠ #k‘lr ıŬÍgŞĝ‹›y7X†Y¸8MÊû˜¸T9˜i1tW`¸}HòW Zrżż½ˆF¸Ğ²×°26j´ħ×ô­MĞ‘1:‚ħÏÏĠĥ~~µ³óôäÓÑì†C3:ÙÁü;QçßĊĝ 2…h8cĴò¨<³²“ż‚ƒÛ—váèsaĞıż2˙;D‰3s˙|8{ï+ÄóŞ=96ôwġM-²dġ]~ŻvâӖşm™\\ğÔ! <İ ­DŻGƒNĜ^˜)L—ż·KÚrÏ´)pêRğäIN‡>gkPÄ“ù{œĞVúZ}ĝò †öˆŽü9í̑o—ôÔdĈ•sŭnĊ. =XÀDÔŭ›£=ÊŜ%”ŠeĤÎĜ]h“ĉ=Qžô„Î%ŝġÌeŻe³˙mİ!-³= B`²oĴ…˜öF w‚&~A„dÀĞ`Aú*üìFMĦ„%Û+ô‘?Ġ2—”ĵŭ‘Ì ż ?úYn;¤mtԀ>2uß×°}aĦ˙ŭÏaĤÀĝ6:à¨JÂòß~rE=.,ğúLsâú³e‚mòM'ž*/3-`„ À‘òQÁŻĥB›‰[Uë~ "ïÊûë&u"²%~Z³ßLH–¸Ÿ*Yİâ´pî;ioËoç çTj,äî˙ ü’1Ĝ’ñ}2Ĉñ‚ŒÖĞ˙d YŬÖÚZ/‰f½„]p(µ<ĤM šZ$K°‹áêXĈüôÈ(,×mN@˙èoŝċK%Ĝƒ–,cŝéáM½5ÍÇËXI’çÒÉ.4³éĈ›Ô[r ͋P7“´ç˘ICÓÓ@ˆ¸ZĠSÙë›Ñ¨ïwNçhĥc|…IÁ~δad2ÔabQMrτğ’Ĝ H*eıž­íż˘hÍĴ‰{é֚˘™Ñé•*7ôT n;ĥè%µÙQ4é;—fQ_ä[g 7GyJNÚ`ŞK”†ˆWû^Êŭt@ĉ›—yŜ—&0Äk\ż ĝ´`·ŞŽd[Ë•ĉ˜âJv7= éŞòˆĦpAâd­W~ĊéÇsÑ3‚ ”„ĜĊ’ûäuè0ǝË0:Ñ }VœžZm›‚)“˵Ŭ¨[…ĉ_„H˜}7ÉĊ NùĤ9tx>˘œFí•egĤŝĝ 74 ‡üÜÛp‰DGZ+~f§Q†ĝx"2Ra˘M{¤¤û ‰ËñĞv’mËˎĉVñËÑ”ÔĦ +ĦyÊÜqFİ’ĵ Uĝ§Î²(ħ85`n3>!ôp÷˘ŒËâè(”(ÍÏ%GÊE9â…ÓsçĈ@˜Ç}SĊ[ĵššÈĤôĦ>͑ş]éJWI™“ŽĞñ_=OJä*:/ùqZ·ĥ§wr+$üÒü´ËƒR,ġÑ7Ż ™:§ü`Y@ üÑ<×6ÓyžG#µIE.è;`ĵ:­pÑ÷5(‘ó\W*sĴžÇ&€^ġۘ·Ëğ5=iuêcĜۜÜ=Â6a|ĜÔ™·d2µŝçdJİè†ê(ş`|ßX Ĝ†}4ċħ ÎĊÓoëùBGÔ,3œĥ½·Š€ŝ Œ~ÄxÔ|˜š“ß@˛%Ġag(g¤™ÄĴ0âĝrY( Gu”û˘@žry1{Š$(˙!û·uyz^Ğ6@o´ÔâÊd‡×Ÿ]Xêh,u‰Œó”;Ĝ¸ı|²+âbU—3 ¤÷áˆŬeüĊ;Ë܊’Ò ƒ÷üš–ĊB3Ġ&XÖ!½‘Ó·<;yŸ—óH)ĠĵWy\IWëŬoS“‘XÌ@X¤d+ g80çMĝ%xb;ĥ=Ÿäµ„%´1Bec ³sÇİ£…²˜6bCÍ­%Iä³ÀıúZ0ĵĦß; ¤˙nġ‰ˆ&WpÇßc!Gk‚o *CÖĊ˙X v\ÔXIĊ ²Ë*ióĊ¨Ñ‚MĜMsá8/Ö(8:BL„š½Ş ĦŞŒ7˙ŝÇ5gŭGÀ„Ö­Ì%—c½´TGNÏË,úĠW§xúìvĵßSx”Á¤ż.Çr‰˙Z™ öĵ:%¸Ÿ\”BÁŒöPs܋fì²w´H8ŠĴ@ŭް€/Óħ×I—Ÿ:KSCŞ Ÿ‚ÊŞi‘ %ż[> ‹ŒRamÚÍŜ0TP †b ’¸LÍdZG%ŭkĝEd?FÚH]žYß䪀€ •[Ô-‹Û:‰Î°ÜgM]/EiЍMJ…CïöÂùŜĤĞ.}é÷ĵbŞ}FğPżT™gIŜ4ŝH—)„žW({Ĉ›\ezk7ö!ÚPœ0›n÷ŻâSs{êW·T•£-–z²?ÏĈb¨İ 9pÊŒ=7ÔÛ\ĝuŞü†Uüŭš9e_b™Œ}[OZ\ÀÑ>\yAcZ‹­ğÍ)­MjüF{ŻÈ E46`˜9ĵ!,é•~eÀyÌçŒħO%°À¸­"ôG˘öËêfıİ0?˙}Û·8Uò˙oĦ’œdxŻÓ˜÷…½ÇQoZßϚ :Ù}KóÈĵN‰ĴġšW üèwfa1ҁ¤ùO²Ú‚8ŝ>•£LŸvŞ[Û o[·ĉ]2°CjŸÑ%×Š2úéY_˙L ùK †Ñ ŞN>}*~Šœ¸6ßü%êÖ¤ˆ^ĞÔĜžŒÁfÏ8—l¤>+mú-Wمⓛ§›jöaÎÓ5d›Ş°‘ùn€=ï'€žM*ú4Êߚŝ·1d#,KxÍcrW½’/Tt–oƒnZ°LÌ)³Ҁ:XO>’ߢRñjŭ Ú^½%]Ò]ul·żÙɘp9£Žıİ`Ŝ‰ÄĵfvÁù"yOàù3S¨N° 3}íy K?H *Ïé]*Ió·[!á—gdŜ&ተôŝА „. kŜ•×Qi=ˀĝ.³Û7AYtÉäĉŭoäÜíÒĴáz à—Bnî9ÖáUnς¤5ÁìŝîËZCוŭŭÁqÄ­Jq%M0̄jÖ^—Ç Ì,Šĥ[·ûŠÖïVOŭü/ "ìBZrk$ċŬ•ò„`Ċ1ëéèÌKpòa’ĉ½ÇrrލġYÚӞsr< ç/ĠĊ¸íF̸[D’Ĵf‘@šĤYiÇİùĵj1°ôÍN‘–yòÏŬb—ǽò-_˘m–âÁ'^íaŠ'Î.Żû ĵYèkÓښ}Ĝ$†ÌġéàÈz_V˘ĤÓo8-—q¤E/ކgf.÷ĜIüH9Àċıá8’Ÿ|òóyÈU2Rŭ¤6íjoĞ%¨!1hĞ‹)f %îµÔ gKôD9×ÀÉ ΨO›C2à›a¸ÂĞ"°EZ†Kŝ}TÄí²Cô(t‰Ĵ^}ğ|5=IžŸî$4ÂvGx9>—äŸ3%”4=’M|Ż&ħ™“ö¤S§ŠélżîžÑÄÇjß³Í 5˜(EŒü^¤ğMŒyÓ_ ûÖÔ0ĝ é \@š–Yp^UµRI“ÁùĤ°Ë×Ĵsž'•“˘½|óèшcħÂT„—°Ċ ì\íĠ¸}şż†œà=WŝÊĥ‡Yĉ0§—“‰ċÊnÙKħ£qhb­55ËaÍÈnyËÇʲŜajhaÚġi °0-sÛŞíƒ­Kf7â+G˚,ĞQšzŝ#\~":ġîÇÁ0ħf„Ê%kâ9Lz‡O4§ċƒ`t"ĉ•,4í}Ŭ@Ħè\Ŭéà˜sñcd0=€êħz‹˜am7ÑO4ĉŞÚŝĉöÉp6tÂCñĦ‘a›áÈÁSѨ›Ĵ8„*—w­ı‰Law‘Y²{&ŞĦ5è){„ŽÀÒIzWü\ô%˜~Fìˆ>pbIĵk ê‰Ğ6nÓ9X‘ŠĤKĥŝ“+Ôm¨]ñUĠIm”wšŞEŸĤÜP\ÎÏÙ\Úqz¸·Š§d ŒErQµRʨA‹ÂIéτŸnóċFA3nÔ>ïÚsĉß!ís!€+ gÉë˙wà Ò³ğ63İ™Ó#’˙Y°ĞïkT,­ÊĊd„C ‹4a_ vKAmÊúbڗ ‘Lż ĥ›<ħkM8 j ĉcġâÏŞ.íĞqnċw(죀Îp[êĦŭğ”RkCéҐ÷MœŜr¤ŸCknH£š˙l‹o ÷-Vf€9Ĥ"n™÷½UDHÌÄ8/X‚ÈMİ6ğ°^r°ÛÔÁ5µ„ħMeàŸ-Ài<³´ôŞSͽI‘7…îÁ˜x5›ZÜ^šhHÔ"²¸6ijÚÁ|WB9[iĥXöx›1o)˜7sˆ'Їm@÷É-ÙĉÇu ÍY„p¨ÄϟÓs üŸ9]b1+é(£cutâuŻ ‰ÊOäëÊ9(,SÙ‰§i‚òşñó†Ü˽}ĤúNUAAn %PWğ\§Ĥże›#܍!3n7:áĉĴğ,ßQ›[ûEĊ\09_\Ê,î]ÇB?TXÛÜġËĤŸ8ĝ?ÂjÍ~¸ġuŜ½*5qú’ÖBÈ#ô’I ͉Inŭ†59p,nVR0§â€AúaQċ†÷c*ò‰ŻĦÉKY<òqZĝçşú²YFSòùm>Ñr'úç/ž—Ùóµ@¨Äq0Ĝ>“­ÀĤÚ+âZb“žÛt^à7fv|Éhŭ„Âĵ‚½o´·[äj²axr˜ôWµ@´B @B š‚^t× ù ÄùŠ’ÛCÈèHĠöşñ„(ÜŬ_Ŝş˜ĊLĴmó¤òh¸†üÉğş8:ӓŞM˙_½YŬ#Ó ÉL]ĵ3[7üFŠ·ˆN×ñNjıUĞĵSג^ò?ž˜3.ÂóÇíi GAƒ×ݜ„ï£Ğ˙P Á8 ½p‹÷ÌNš]câ™x£Ŭ.iFS2ĜÇ-7à Ò³ğ63İ™Ó#’˙Y°ĞïkT,­ÊĊd„C ‹4a_ vKAmÊúbڗ ‘Lż ĥ›<ħkM8 j ĉcġâÏŞ.íĞqnċw(죀Îp[êĦŭğ”RkCéĠPxğä Tĝ£xl9ĊÏĞBë,%˘L/Ël²ĥѽêŞ"F_c7Ücö›ğw#_›Ñ,Œ‚E´FÊ) ĉž\ÛË02•i C÷zXméÎH) <üĊiÁÉ~Š2‚W§és ğ£¨J ,|{ħ4ÜÙÁÏjDU|¨ĝĞšĈjxAó•b3Ĥ¤(fìŽÂ8Ôbèj0bÓ#ŒdiJÈê´¨ê<6EOQ/‡¨˙K"AYb:oÌV‹îĵċvrá—9TqNîJƒj[Ż%íŠ^½êŬ9γ-ûôrmêLÔîQ^&=áĉĴğ,ßQ›[ûEĊ\09_\Ê,î]ÇB?TXÛÜġËĤŸ8ĝ?ÂjÍ~¸ġuŜ½*5ў­ĉ=Ïü—Ÿo[$…Ö´÷Û"HğżĦŻ–>½ĉ?L=‹ž‰Ù/àĵÚüL%‰1 ›>żIëĤıÌíż‹ġŬ˙yUp#8vÚ ÍŽr|ż I–÷×(,'79wfÂ}~·TH˜(hݤt7çp|î˙3ˆhAúUŸ^€/De”‡Ú”†zCÍQ˘éä×ážÜ ‘+µĝ Mó”È@ ~JĵShuİÔġ]Ìı–鍧”r>Ĵ‰{€„k×ÇÎW“ßñğŻlÔ4Chej}•Bnuğ<€êÒñ[µ ġA_ëžÉGÀN_–H´òx ÇáĵóÙ¨ü5è֘[è0â·q”nÙkè°˙3É>­ $ŒÚš]<›h:³şùo›ĉùo›ĉùz~%îċ;‘Á/Ì3äĵĵĵĵĵĵĵĵĵĵĜ^+§Üq)gv’Uôw›ĴAMs|ß7ÍóàWo7Íó{cËĠ\Ž: ĊĜğև­9£Î˜°—ÎXÍħVi}ƒ²DӃ&·˙ÁĊä%Ieĉ$k’cÛ ĜY‚‡ŭû”Üîm.ĊÁÄ5h°ßA­£%/†oħCȓFTÂÀÏĦÈ/ЋԷߔzğgnhCHX üß_J–šNpÎ%Ğ bÑLîŠñı× 5E½tu%W—+²|9s‘äÛĤ.r‰àrÂbT‡-—uL‹3aäİy¤d Cem_ ­$‘WùIŒJGÀ¸˙…I,Pȸ9têQ i‘Äç<íëċüÂ^ÍkĴLÜN_Qs9ŭLĝŭ/Hwݞ¸ Ü_Ò ħF1ċ‚÷Èïá?ĦqĴ÷† amĝ—ÖĊï}H^ö`ŭGRšö£AŬI½žqbù ˘‹ÈúœO7a3Ŝ>‘smmŜ ı—9oÒşàiĵÈË2œÚʑ9’˙-àN ĤZ§xË:bTƒ$ĥwäĝYk}O„áñ‚_züç {ñlÎ ÏÚĥĜk %ê_ór sUHêµo>ÊQŒ˙z÷§ÔPż$ä@/é $šSÓV"Rq6`ĥ)ÔCa•LĉXšE‚Ŝ€^'(Œwg3ñÒ,ÍhŝíĦdN|İC䨄‹fŬéÑìÇÂÔ<#ċkŒéV>x²’Z… njüŭiîQ='‰jŒ€&ïÙuN"„r‰Ĝw^ñġ?ΗhíVgp²Ĵ0víˆV‡@üÁŻżV)Jvĝ°sír,˟!ùŒmÛĈW<  Û˘÷zÌ-²Ĝo8ÇÉUzd ÎÌ×Ŭ1¸Ú÷duıi ŸsÀü5-èŻ4k…ÖœZ 8ƒxÀ“ŒmÁéòü¨´Y½q2~ë§DHdنt$ıëOĥ‘)ğƒ£×ÙÔxl/>E ­”k+HQà ^q[Qbß´eŽ2ëtŻ×¤~¨ÖzksÌە@‚ŭ’Şophö“Ö•µ—ëuqĴò­‡PÊĝVK Ż db”`ŜÒ ò“Ùp|oôv#ü>48âÀĥsSÀdà,íó“ĠdDÛĦî‹ Ö@ю\ĴDŽĉĦÀÂJF²$KÔ2ߖ 5SGVۈŽr&cÑ÷(ŭŽ1)”'p1jİÚÁ ÁĤÔ"&ˆİFŞÖ“€lB>äâ5òÊaÖNô™:Ó ü}mĈ‹qŝ˙>t­“—7l%iùÖL,LIB£’‡\sè A–ĞñÇd³Ĵ ÓPóĦFGÁñı|“´áTú-TëPċGXŭùö~Ġ{ġ‘Í’Žw½Ĵ=5½Ç]ż…t‹“Ô͝ïÜÖĥà³7눣`[^µ((gJ[×/` mÙV8ÎK2àċœş‰c)ıˆîŝù˙j„ÎݟÖħEKóp˙LĥùüçĴú“ Ô¨A%ÉġÈıÔ.óó=)$LW./ÖU›ĦAöY˙\œ‹„âm{êcJm löĦä˙'ÖòʛZ²3Vè†ÑTì>h! "ݍújÓÚ~ĝ1N)6Çĥ, “£:·Œğb#iW†=—uÁŠUĜG´  ç,óŠncÎÓXŬzÇh7×í’3;Mû„`ÄÜوçżmëäS£†ï¸È| ŻĜbĜ(oëê.L4ŠëŽÎŠn¨ŭÇgÀQJ}/KKÖ)ü†Ÿ“-:Ĵ´–gÜS™‘İİş ?YóÊŬÌ'˜Tî|Ŭ}˜Š ;îSs×ö7Òôŭö(”}í$ċá~§òpÓ_e·y˘ĊàĴ};ŭv˙1?ìÛ#kĈŭĦÀÌVϗ‚Oh‘f°8ßeÇħ·zqş³ŬŻòhó$•¨.˜ŒMb Ĥ´Huz“òlëa  Î8 E¸îƒ˘Û´§m7ı$bëÜËNğlÂ;‡Q%ĉldŠ™§ûÔo HúµPµ|ŬfûDÚ£ şmÜèCäc^áÀ×ħ5žiÎèž-Öŝ$ ݘ Ŭ“?eú×YüRŬ' }ä’S³5²3[X9ìתYÔŜ_° Êâ½˘s´á×ÊŬ|ß7Ù}hGȓ7'ó’VıÜ1šÄÍ %öŽ1 ÊUKğg"qF!›ċ8Ÿ+¸„fê!Ú·@kŸ eÄÒ ÊÙp"íşĵ>"„l#h Àíé×CÑ0ĞS•p”È(ÀpÛßPıtÁUĉxı"žó“T–_n]kҏâ\ġLás¸zôc ò$%;ûëŻŜ0“ê/ġÁf„½ ÍÚU׉n[Îĥ;Ŭ‰­5=Œ`˙#˛UZş“WŞúFĞ™™af–M[.@ÜKáG'N1ƒžrê0y ÂŝŸpŸ ³-Ça^³äÔÂÙӒ£ĉ‹­+Ò=ŬƑ¨ÁŞ RÊZŠâ·BGyŻ–Œ#aŒ‚ tÁÇÔÚ´Ô:.ô †À¨•ÛŒbZDг Ö/çö8—ĝ™)”I+ŭRòUwĝÍj·àqĵ)íSuȃġ›Îû÷ĝ‚.£f3G•Çë—h|(Bpk]›Ğz-/µôÁĊ‹š£R…îVÍ´"+0ĵ"½-Ò-`"“Éç!ù01҈‹BËèàD3û½ş§ĥÖşĦ†7Gİ:ÈR° rġŒċÂ**|ŭ“ùñgñ6yĊ?°×³Q˙aAŽ)ŝàÛóÔ:Wŭƒá/r_/˙Sƒ-÷Bhç~§ÙŬ“°‹Ú0dr°èˆĥpz[„³\àŒġÀµq°H%gìĥĈD‘ˆĵޝz‹7Ì­W½5 ÎÊX:i°Bĵé ˙s¸QúŽq¸ċʌ™ÄA GGò -ñ`NÔv@ûd&k‡ğ>=sżKAĤ7wáÒï¸)ȉ805f˘ÚUž£‘Ê:„…`iKÌ ˜BÎ,£÷b£ÖPü¸h ÊIĈŜ3Ê%ʟċô(ëE5?¸§Ó|rÎ fSñôÏŻüÑ Ï9âŬ{C”ÊY=d‹}}žMatéAûÈô.cċˆôış¸a'˘ÂÁùŸĉ˜µˆÈĈ1ۅġ:dy?ĜÚü‰Q#Ó@ ˆÌîY x‘éq4Â}“ż\˙7“Ĉ“pœ7Ŭ‰…Á&ämħö˜0œż˙ÏmÖÒkXċž:ĉy@ótĉ ‘/wŞy:vBĦm,´ĦǵŸ<›—nĞİn*Ìï$b홅›'KïĥĦ}&^ÓzQNOċiıÙ&q•Ù„'˘ĠMmĤ0Ğ2²;"Â8‚Wˍ|f—˘Ĉ’÷à`ì6uáN҅„R˘İ#ù÷hÜíœbN mˆ=Ş@ÓS³i0ͤ¿ïœuAĊ˘żQ–ħ·Á˜½3Œc,,ħĴJ5Ìu"˅êßĵÁZß\×`ûÇĠM:&B‘t{›#Ä xˆĉÁZħ“ŝïeÙËVÊÉ: í˜G”:ç„â½pġI›Ş6ıpC—‰×‡,´„–(Áúôs{òĦ­ıÑôZ~˘~7ݰ%˘Ğdû·;ƒÇj`RŬ´'{.Ké5°İÍ82” ÈZŭzӜvUíA×UŽcB£Ùnġâġġiù9“J@9P?EfĞ).FCr˙xò{ˉ)ĵc u#ĤÙp[dçĦ³FCÓ9ŭ×T“°&Opg V‚GtÎjÜÚL2‘Kşö<7\ :›dĴŬpC}á\H Žı` ¤ħ>ċŭÎñ8BPëÇ?ÇŞÙrG}ŻÙB,AFŒ–0ĉB|~ŝTċ°²U@¸ ZY >ê²_ĞŬu·fm{¨‡§'<{ÖġúŞRÌY‹}­D óŜxĵġw|˨–¸9ßc¸!È;ĵYF•jŸmڕ„ßËâoS_KQëÙóĦâPż{28Žûŝz<şîG†Á„à qzùÇ<{5Ò²A˘…œ2½ÚŠ‹˙$à€(˘çĠ!Ö&Ĥ~Û÷ğ˜^JTFŽ”<ŭê!òŝ²8çú„ûO¨:ùŒĝ—§ùĥüyÎ×l°AĞuв´İkhê1ġĝ˜5g=Ú˘­D~€È“‘w ‡trxGŻwïŒúŝò$}q1‹2m„ġràŝ\ştl00ágùċ‘8ü.e²DñfÇAÏHO_ÊFÈjÍxŽÉÁžJ#&”²•XŻĴħ›ŭc…‹nbŸ|D÷ ˘Ğ3Ğ;×çfż&ĥ8 ]ğM&<_Eœ(^£¤ ) À“îû2 Ÿ[L êÎáfU%Í (zYÙü–Ê2hɃ²žş'|‚£•àÑ<ž ȎĠ{Ŭï(V)}äÚÈOĤ ™-§ƒW•Ïù™“R6-ŜJMÚÊájlf@]$]ı•†MŸUte‘r܋™pĈZÚ_2÷?‡ ğ…_=Ѝoĝµŭ#µ`]uŭħĤ· ìc’8? ´ŻĦZ²E0ÁŽ$‹™ħVщÈiƒ!#óPŠĴǐgÄ$óÔuQa€ß7Ûbĉv{zô²ÂĠIè=˜›WLŻ2´dsU‹ƒ š0}­•'Ħ8ËnċJ-ßd“pdfáÊmÛàċ'„µÁpjùŞA³%”Ĉ7tùö+X5ĞĜ;Ì”{‡à˜ĉC—›ĈPê +ù‡Ê) ÇgŬÀşg]µ*µY“{dBÎUU“5˜§M‰ċŭns‘ğœğɽ2ċÎö4|:$żb‹ÇZ71ËTúW-g¤ĠyAŜëüÎş\~Ìl`ÁĠ‰×˘·V¤sĠòħKşžÓ#>ĊR÷ „·XŽ ^!}µ.ĉġ9UüŝÔëSó-ħ›’XwĈµCĊħÀ‘ı8m“,T"ş5rà˜ëž’ÄûMÌş†@K’ÜĜ²ŻžJÉ7àhGÖf›:M‘Ÿm|=œ0P:/Rĥħ†ıˆoÊïáù×LÉuo&íGúŸ}"Ì?Ce4 î^ŒċùŜ°vċœKm$4  é… vMú+˙ _ħVêNgû´ÚĤŬh‚h?J„ŸöV;šœıd[v–s·5í`ì6Öżßè]›_ċ}×?éÂf}oşdŒôŭ‘ż]pò¸wÌßÂSıħÊ4˙[ïSùSġH"փ˘6oèÍıBİ]·ž&@iğĝ ñ1µ~7dçŜÖ끯šĦĝĦl…(‰:H~tİ’i§>ÎDgΝ›bM<³2ıjĠ¤b˖Ž}ÏĤ­ü5Ġ­$Ĥ ŭĞıʄχ3;?MF'–0Ô*)Ŝĝĵ°·Rcùğ_˜œsĞÄ_qJ°2·7€·€Dâi'ž‹Ŭ¤Óïö,pƒd½…&!À?@›ŸĠX}kSw‹3$вıŜ^ċ8~ŞÛé´ò£F›Éy‡'ĠuÌò‘GÀH;A*X[Qpµ#Ä+ üÏ´1üÄşËlέùğ1KŒeĵüθ0²ßüġcĦÔiâşü–\RköÈĤ4x¤Ê£HÜŜ Q ÇÂÈYۖÚÑ*|È„M‹ê°¨íz|p]ĠyHˆ•Ò4/8x#ş5 _ßIlP@ċÇûXIë´öèStícôž ÀiE6}· Ż DÁÔi‘wèŒ}k]P ĊV7ÙZfEÁ-Ĥ %Ós3ۊGİ<ˆë•Ċl/Tġúŝ·2ıSX„ (rwikU†Íu:‚1>ŜKú¤+?&—EîO×ċáeÀâ) ~‡ß=>Ĝ3Ż8›•ŸC’Uë&^ĊyŝQÒaU)ÓhĊI?ùÈpġV0b×ĥ[ŒWSH˜¤NŝfĉÏh˜ÓŝëÁ1JœÏ0 ­öfĜ£/ÁŸt ›ïïû‡"Ĥ°”í„N1ó YĈ é œáŻÏ+ħ/ŽN.dà ­²­ _Lúş™ZRê"ê1U_dĠç7ŬKaŸ‡n贋Ô=ĉYÇċ½ĵˆVĦŞíŭ!×(Í=‡– $2a$qÔĥü…^··Dä'ʝş"‘Ġ&×Ì)Ÿ”.ÙózŻñÓP%ÄkÌÛ.îŠĊJwJ—´Ò0Éêi]ÑÂû!)}İW­ÎUsÈИ5‚ŞÄ’Z ŝOQ >ü¨‰˘Ĵ3‹7ׄ:DÀl Ħ™J ŽÀhĵ~Ñ ĵ)İħ×'ÉV^W½X* —ĜöÍĜ˙|7ˆ½létv°ÇŭôÔg ~.Zhž‘­ŞÄ*\Ìŭû(˨ĵH) `$í Kwñkq—,‚EÉÚLĝC½ğ‹3Ž`aġqûOÙxZìôÈş£Ï¸#F}Çd'SpêĊè-ĝ͒~ÈYĊş@&xGîÓN„1ï 7À>bĠĜ'Ún[^îc4÷Ò ½iË÷u¨•+ی“Gƒ9™2è|; ġK8!ö3ò=OÀ:ìċ‰ÓĵŭnbÒ˙Kz„q&‚”{’ȵQ§ùĜXÓŬÚ’{%ûlM3oĥŜRíVgĊ_ô@ĠG{0ĵ8Έ÷ ~N7İRd`z.<Üġc îò ;O“ì`Hĉ+ÌßóSğzz-îoù\è^t‹˙|ü_}Ä{+o\éÔXèk²ÓjüH2‹Íŭ›2›·–IÓż¤+÷î단ZŜ½jú•>ħËÁƒĞĉAûrJz*à{½Eüò}µŞşİ ÖMœ/ıĠKXH ’H˘(#)ݏä4&1zÛ܇oû§#ÄeU˘uuBÍôÖĉkgjä´vNM˲òlûÁ>ڛëÖŻA#{ĥT‰¸ĊÛĝÖ@~ĊşÜnÊĈ?Üé¤Z%(üaİĈŒòj2ÁÉ,‰·\ükoĝIJdĥâoј ͜×=ˆG›Ğ ‚U?omëĊä Š9â€UG“ĈnËuŬÏĞfˆçâŒÛÙ;ÍM×°# z+öWOԓ<Óċ×+ĝ•žîÈÌŜɇIÎKħžv^e2•Šv`pVşÛO›˜Ë8˜úêġlI­Ú˘àÛÑŞ*(ĥ:lsÇÓq'ñit0,hǕŻËi–‡lBiÈÎıNĈž‰#››ìg}ñêSĤĤ‚ŻAù[b.'è zʨSX5Š÷„š[³›p×˙ZħĠ¨şĠĠŜ"rŒ4€rè„e vCc$°Ħ É$’I$’EAg’‡£(=i8wyFŽş3N‡‘˙ Ĝy40·'“q,á&6tÑ8dnçb²“`ëĠ’D×Cít~ÙUÍ0•­˜†xĜÊ-Ğd,Äòt_£êÉĦ Ċ !ÀĤԆ…+ Pò-p]‰ğuŬŽup”ü¸şxÈ"ÑÑċ,‹¸çrŸÒ‡¤×£›ÂıÄyIò÷|è]°ÛÉHä($Rh’ÚhÏäݎñ´è­ rĤ k˙2 'Êsò÷8ó{!ö¤@e<Şcl°ğËGM9+í\=¸UòJâĊä{ı?=ÛÓӋµ.}TKĠJF-½ĠĠĈßYüĈĈ튓rÜŜêê,ƒĤ8 0sİĞcħ ħ›6Ë iĴ3˘Î/ ˜>Gód([ê*!_%#‹5e]8š‚+Ħ²Ä3fu‹e œò"Qrw.h{>ÖT2r׃?Y‰·ċÒÂħ·oŭ.Ġî˙LqÄ}:c·?rtw^ŝžAĦ ‚èn; &›Çeö\gwôë‚ĵhjmşËST´,_ğÚ­²àEÊulB>#<ĞœĈDé½sÒò‚â?R(€Ž˙O[ÖCĵ‰ £úH5Ïŭ:mÓV£7ŠĊĴ‰,´“1\fbÌĞ­^o­żŝĵ†ÓrëXóŒÏı„\s/Ç/ 7˙UT<\nAì ċ׌µŻZÏtè£$wU86£ë¨lÊ]U¤ÂŭĵmĜ ɅïIAçüŝDË˙~RVEô·×AQ…œC…¸îË}ÍÂKıÜ9¨fò•½£9C–׎‡#95\£YÖDH>‚’’=ıĜj–Ŝ²¸q8;>TIQ¨ÛNÂir-6GTŒi"È Ş½SäB’*ĦZPRAŬâĦÄû –Á8*Ż:^œXı}\˜KÌIĴĈC)÷ĵ•QŽ3î½òqLY‡aq>’Ï›0IdAŒÒ<ĦÊs¸#irhhó_B —Ŭì„ŝáœÌçNáÛm0ĵOyĥ¨üÜŝi¤\ğˆÀsR2˘V QÜîáKŭ+‰0„sÂÔ §äı”‰œei4âÈ1q Š8ÜCëĠCڅw\z-›ĵ¸,qBŜ˜€5zĝݜHeî%ô£’pq Ö=Ê‚~;•Ŝhh o€ô¸Ğ€ ùŝQ6çhLéOq:‘çc‘£‡ĤšËÊÉMÛ3Pp>üoüùAm&ß° àŞxY6ğ9¤ÔÚŜĞ'Úişa=€@Á.nğÂe&Ä‹Üé\žDòÏd\½ĈwSC³lòh7 jŜĥÁQayĝÀTìàĴ'z‡wV|ĥ$íƒÀÒE(FÚvġ‰Ò%X[ü(C÷j…àêwcl6ıqpŜ'̋b芜Hm|âyW1‹ş '˜W2”ûx£]„ıüL˜ŭ¸k£z(JH;'ĈR3gŭ‡µé‡ëuÇAv>ÏJJö" 28áî.C”)Yż˙Ş^ XFŒ£şÙ1iĉRbâ#§mş¸eŽìFÀ›fYÑ_D;óòŝ$ħàFœ. `+î½ËnI˜šaòŬ({sœû>§ĝŭ9‹c”RÍşz=œ×ŽkëñӊĦŒċd nff8GmĈȐ¸Ŭ ŻĉD’.‘\IYÄEhF~e+V ×ċz"oÊßJ'óiC‰(MÁĊa÷É@\Iœ#k–e´LPi#J*€¨ß;èğı`~c1èïG}àBÍ^²ĤĤ QĞYFGˆÄ—ĵÊâĜ&gŝîğ·V•Ĥ)Ê-rİJe™u­ÒÂġ™•vBé×É?oˆ£L·°{=aúŸ[&e‡ISÎ1EZĥÒ@›KUĦ¨ôžYÄJs@ĝ9wA"ÍßîQ½Zz߆2ŽdY€0—íh9ŽÔ 8ĤHšJŭt1TR6r<~IĠQB6Ċ…„É/°ĥ 䘲.ŒFсE™zMáñ. –­5Gû=żċĈ°ö=}˜ñĉV ÷Éùá˜î–­[sm„kÀŽ­­˙WZd>É{fïĝFÁŞÈf÷:Lí‚I+nJ<×)ÜjôÛèÖ_ÀÜ9 ¸ZwĴèLJK•ö|u`Jœ)‘ĠšôĠZ}Ĉaħ*›€ŒŬŽ(봘U’?Sĉ S#e×ŝ[ ċ+ĞÛdž­RŜŸ·$ ·Á§˜ĈqOïäqQĥX¤†ÑÇŻçĴ§}<˙q½k%lÀÖgĠPı.!µ ĞIü6ܨ›Ìİ6M8m—<÷ˉáêeè)Sӕt˘ğ䐨\TµÌjQ’`ô Ħ‘ÇŽÚ§ÖğBXħ+a×SsÓò~0zu²hĵŽ{ëı_úĉ@ZT¸Iĵb`û‹×âĤ—"|ûżĜî蟒„„ĈœŻ²=òħ6ó`Äáĝ`ÇŬó’zĊ^Bv¸ÔÄ$´!ٞ|ĵ7FÖè÷4ùGRÄo [İ~DdëUd~>;˜+PÀ>Hħ×#1Gĝf^E(h½ jš9,KÚÌ ä³âvowŝ.—q[¤?ˆúRlÄ˙~ë¸Yhyy :j3wó­)ùgL}ùżTİò‚%|UFŻìħ`i‹-¤İ%q>ğZ?8lÖ/TÏFflvĝŞñĠŞÏóXÉÒÒkƒL<€(ړş7•Ü/~g ïy——N‚ĵœ@…W(˙‚Z`KˆŞš|,â`?V<ÚiT—%k¨Ž­–ŠSAëÓħşkŽtcT8‰ĈŒ`”¨Ċŝ ÌEû”Ġĉwïm•Y•^Y8_X ĉÊü‰‚ĊÉ F{Ù >ˆ˘ĉ›ıqŝô-ˆŜèĜë<êkĝ) ٟĜçŽÉ‹FúĤAòdŭÉŝ6´d(/QÜûNÉIĤŝH÷'•ĤOoDĠ[GàR”¨‡Ğaµ³JĈ$ Ż£ŸhA†ƒú‹„Ĥ Y0ëiO?Ai{ÛÁÎĉ„84-ȂŒ@‹Ô…IĞ`Òê6#Ĵ´Ĥ;°)C3£ç‚B=Ĥ.Úаız˘0rSô,–żCĞ;iċ•WclBM$²K|„{*Ëùx„)Gyi:Êj€*{|çĊßYĈéˆ\!âB"rT²D‰ç*ÌD¸w·)Üĉ;ħ›#5")Lĵ?‘Ŭ!·…Ğ<.k™"_H"ĥM !ô~İdı:CˆĠ˜tCšNÈë²ŜˇÄÎ!S>§ĠZ*ÏÚµ‚›@k VYĜB›â†°*ü V‡úÀ2Œ§(P/’’ŒšĠ28‹ûš1„‹j&-†œİë Ğ‚Óâè]ÎLù"¤ç \Glk,1•’0 ­{aÍ`ÓğZ{$ÖĥDÀğÀj‡—˙%Ĝ§|tœŠĦ‰ò1Œm&MĈok‚öÏk[Ë} ΏR ] É5‚ *U˙KÜdı5{¨Ñ€´`ĝrff ´ĦNHÂú4Ŭ(ß×°w}~ĞÉ—Ÿ޲ßê~ό‚‡Èv* ¨2vPé²Êóı‹êÙ×l^'´9ŠË5óŒ.Ĉ:YXÀ]ĉ˙u0GËS 2‹Ax€$ì6TµWpT : P;ĊU¸-ό! ‡ÓCìiĈGĥHŒ1.˙;ÀekEHUé‘!ĊwÍ·RÍ[˙? Ö‹öħ~Ŭŭµµġjn?jgíÑÛYßVĞáûM˙7GŻŞÂ“Ż í sıîĵsxŠF‡_ ' ‰6ì`ìÜĉ52,Šû´kôŒ<^äipz  ‘@ĵ q+§î7]î#ُpe&ƒ­Z´Vw/£Qˌ랃$?˘jLJ[µ­öï3ıÓàrNÍ)Ëó9|8ÖÏTÁÓlŝâ€r­çh·mጟÖÔ:½xqûUh3Ψñ݇úêŻ ³N&zŠÖŭËÉáXìYUO—A1\NşödUòb"–o´‘ĊžV˜Ħ7\ĦH–m x9ÙĊÎ2Ç/,ït•1}·Ĥ…Ŝ˙D ĠCmÁ$€İP·‰ÂUgòKç:l€ì–ݵï̀r…*ìDh׈ŝşĵèz ’°„ž7Í)P¸ĥ• žôg÷OĤ>$+·ş²^)ñá1{QıjİèÛtxíD„+ŞĵY†AaĦς/FÉ/Œ\-Š“àÍ`kÇcY]ü÷hKi<³·ċ3px9kDHŭÑ 6kĤĠÒ÷î ;:iœ êŸÊÓ_ĉ[‘­˜Œ— 2Ċï/Ĵ÷ë:ûOí¤9ğ™@èp:A"ˆÂÎí Jö­0íÄÏÓÈrä0Ŝ=~"e÷ñi²ŬßÛmí ‡/×"qŬ`•­­Eoá9ż=’ú2ޏsî²²v*§ŞÂšGf÷ŭ ĜօëĊ§{u6#ú“íô kıñ&Ĝo`İT+`R÷täœ>1KÒc^„SÑßlŝĠÒix9^'É Ċ,0* èRĵÚíaÖ(<'ùPhĝ˘ŻĜà‚ÉÉNÙÇj>™M`m4 šŠáVÊù…`™AN%'ıJŒÄĥJԆb†~!ò@ĴñÀ;ôŬŽ#Y†–ûív”Deci íòŜ9/ïħÔ “”ÚûZŜĊ]n7]‘Ó òıšÙ&ˆ*™t3™pgWI)7v+ğéûWbIC:üġĵĤu²À× Ĉus‰]ÏĥµW^}ZI–iv‹ŠäïD³Ĉ Nċġyi^™úlwĝàSˆ\VG“§ş@ZÀÎĠş.lX÷ña_úzĤM ´r­îIaLÚz(áݍ„„,É£9xôé0Îy¤ŠÒéÒĉ4Ċ~ƒ4°ú@$iÜ6ò2½PÑ÷â3 {L(™ò\3éÑí¤'XÈ™ĥx‹éh7ê´udDoèvµŠß€½îÍÜÀ Ŝ¨›ÇÄ•ĵżĵœĝ¨H *oÙâf°Z˙Ĉċ§>Ĝ“¸Ŭ3êëéH?Ħ†½Úˆ´ ?À6İûŻYÙjQÉŬä"!ß †ĵÒĠqş6sg<ñäı'éìˆWşÀH²9Nu˙:`â)îŜÒv›ÁäX)˘'UĤg?mKŸ5ßúԃ|˜ï8/ÄA„ı“µšÇ;ıħìèpJ³Ż£xTÙ{ó%ÊĦžé*„´"6|ÂIġ';JżÓ¨A­×@¨5E/În/ ÀċvżĊ6Ŭ`ùĉİDëdßPáB³üFÙè,™Iq”Ì‚cë7$ûeÊɂށŻċ<7HËVŞ~l'ËMSG$@üŒ7šœÔ(6ċğĴq³Eçy´àT_}ubÌk”= öê)!ÏsòİŸ§ìñ -P‰]ÓV”‚Ž Ûe‚…ZĈÜu˜,À§ùÛ_ċŬ½D+krĝĵ•—„y’Ä€Ü{ġŭĥ¤ÏQËÓnŜ ß ¤”­jŜ?-k­âú](ÚÎú•f]”R@ñĤŸé/—"'U×ôIi‚êdQ×ÚŭA)&vM¤žOŻ]e]7À˘jQ˘éQ)€}<;U<ı7—ş8Ò~ÌLËaDV0˘~~`còWĤŬĥ+è•şp6h?ÓÄyµgsÚs ÷ ËX„rÙʔ3e&”ıżá/VĴkħ c˘ë§¤½qĦċö£Ñއ=6ÓdCŭjm4~ö“•ŬˆÎzÓŭ½f”ßoUŬ‹ tĵX疕PÄiA 6l½M˘ÉY µ¸ìE? l ‰ïœ—‹ŝÚm™.}q›šÇÉ\s’Z…á  ˘ż#Ĉ•U0‚v™µ7ĦC“š‘MC^ŸĉĦwL=ĥġÄR#˙l›.èà$8¨‹ı›ÏĵûoŸŽ4ùÍĥĝĦM*$”^üû‚Yüˆ2´Ç^™ Œ!ZŒ2Ğj.ĈĵŠWd6Í˙1ÌÑRübı>ϝÁĠQw5° Êôù˘—9@{ˆż#“ëµ7u{Û2Ĥ?SíԜ)”ŬĈRßAldFĤ~úoù\ñ3êK9DêŞh\EŒĤ½?ï#Ş ħ¸-x6-ĵ™%ù‡Ŝĥ‡GċêRŝ݆Ġ„“ĵ Ŭ6ÉèĈĈï•cg¨ĵ„ìÍ%haù͚‚Û™8N<$U7ñ0fê.p(ÙĜèw,5½ĴÓëZ@…Q"€Âdžâ~‹M¤Xżg¤ĜĝšÉê{âl÷ŽuŒksĵ£Ÿ‹ż|oŸÇĠbNÍ-şż°‹Ċz‰Ñ)“§)0ÚëJôp!N9èĝĴ?nŭjvÉ*qĈÔ Iȇ‚ö:Ÿ”–c€?Œ¸4?,H‰;zklÉÊĝ,Ĉ˛.¤”uƒsB ·9ŽPFın9ĜN°›œ4F7hyùÌtO›RµËÚW5WĦÏwFDӎ-ħ’Û`HŻÂ ĵ ·3*1e‚Q=“˘Ğ¨öq#ħ͘ŜĊôïÔóê—&„HşŻTW?`ŝ݌”;k*òC ·&$à'™)/Ç]’ernşôŞiï,)Y”ŞOƒÈŽŭIè”ÔĠbànŞ`½ż]ÈX1ÊqLސÜŝLƒşß9_фF;í…X dq13–ËÇ͛Üè ‡W3×еˆo ¤ŽÊÑGı¸EYށüùı›ôŸÀAìq`7lÚ8WëŻAfġ'îÖż4 (ÚĞġÜa³<í@`J !ßÔĞîcFfžâa|ôË ċĵŽĥ7°Ló-ŝv˜[ÍHÙ½‚ ŸĜ¸|K6lmόċVĤĤqn)Ùİ>( i.2Ò9màK'Ŭ|jz r\ıïTUö@žìR`żx ˙w”½™Ĝ`>|8FöHĉw+³ž+W?PiïjçU OġÔVRÔnœ; ڊ ´cÍ÷ĠĘĦÇh͉ #΄ĜŬIèñÏċ4gĞ @= /Ġ M”v\/ŝ‘j“ÙkïµMñ)žäȎyƒwĴİğ€¸Û0àiJâK([G›$Â7ġŞ–ôÍ,·‡)xKÛ+ûŭ‚|ÎW]ƒ 9Í  nC“ %N‹ ‚znOkAħ?(V5Œá\w&Lş^ôÚjNgf9˜iQ§.6 bv)Š+m¨tʕ£|‘hn^˜5ԝĵµċ>ƒli<³·ċ3px9kDHŭÑ 6%à#k6‹fRÁoÙ*Ùßc˘Apw+u°?Pĥŭô”lİ‘î@ 3´óÀħpÈÖ6c×u9K³¸7Ċ*µ İĉÑ:-8ñ…Ĉ:ÁšÔ&œ+wµ˘–¤ş‰3§lĊí jnŠ7: jıÖ sJ%—ÔÈyلÙÀ¸ża“:R„ lAèıdž(甃/ŻÔ|ùœD‘´Ž ³ĵBÑ1ğv2œ>1KÒi‘f„Q h³D$óàċ´Ê,0(šÎ’–m&BP`KÁ×Í·7Z,ۙıñÑö(ĤŞŸȲ€êaüÀ$„U7›b[ú@ħñƒ°¸^—nƒÔ IpĊ—„¨xƒ==úx:}ɢà’ĥè8)n@Š\ĥ5gsˆn!NÊĤ [%™ƒ¸fÓU5ñ :•È`âĵ½Èa^ċ‡cJäó™÷ÜáÁ‡ÙÜt×t=Dîœ4N\–|Ԑ˘SP‡Ħ~…gĠbİĊT!Ĝ,ÈÌ£QĝàÙAï” Á ;:^rTğĠyĤ)Žâ‚Ü9%½DS*áÚK‚öŒìĜ“¸ŬG… ö!^·l™~ÀFÍ3ĤëéH?Ħ†½Úˆ´ ?À6İûŻYÙjQÉŬä"!ß †ĵÒĠqş6sg<ñäı'éìˆWşÀH²9NuöŝŬí}DtżÎV͟ŭóגQƒıӌE;ŜáN!ßZ·M[FüĊ=öŸ,¸s ŝe™r·6–ğU&‡+ˆè:èÍt^û֜q6ï˜ìáKċ2ë= uÚĉÄm"ŞdSk´êÄÛĉòùx>ïóóਔê4üj+ʚ>m€($X•G"ĜRpF]‡›.ÙDGT£BˆĠWl.Şâ9ĉ*yĥĞÖ²‰à[@ójµÒLÑ@gž/{  ʍ:÷ʝ¨FÊué_/èć˜òİŸ§ìñ -P‰]ÓV”‚Ž Ûe‚…ZĈÜu˜,À§ùÛ_ċŬ½D+krĝĵ•—„y’Ä€Ü{ġŭĥ¤ÏQËÓnŜÈı<$>kV÷ëê‹Ż\ËtzKÎİ·„h [dHŭ”4x´û SX­rjœ§;Ɋ*–_Ċ“ á |áĦâö8DÓLŸëÀ6N›@˜ùÒö´˙"ÜTŬóâı½Ŝ pÎ JwšlSmòWĤŬĥ+è•şp6h?ÓÄyµgsÚs5Jħ ĥ”h kbK;f˜<È˘·üóñÈï5­GÀ„Ċܗċ(mI>ğp?ƒûQeá_ùÚQ8œ7§+ĤöwΊÔTÉŽ.ÁôùtÔé*#Ŝ&’µğĠòëğŸâ3ĥ¨½s×5K3ô µsVÙÁċÒŸoÇ"8Ö×%Żo°Ä!N„.@(eÎÓ˙.dlšĴĊ‚/"6ÜÇıİC<“k<)ġQ$Ĉ³ĤÒ E–3Ġ(éeQµ*z%Ŝ°Ž4·{ŬvĴîIòAúâi÷{ŒQu.§ßtĈmš½}Sï~W<ŠŞĉĞò·ŜÊż&$f{ġVTVô4ez€QŸAdî7×>hD= û´ŸV#N müXĦó-Qѽ%ĥéˆ8çŻwêß/– È¤™äWr.{qTŸ/ݐŸ‘nÖN—WŬĵ?Nı:(oä§Ĵó—ݤĦşMʋx£2˙[S7û‡û^d’c½x‘Ĵħ|Cċ½c@Îçe-¤§ħ£!Ħ÷öǑŭ†} ô‡Ŝtki˙n=sċ{ar7'B§‚Ħöž·O¤ŝâ˜'I_ËĝÇvkC ĦO~ıYíf.*…óĝQ%r&ċ™Á[Oñl˘uİöêş€ú˙OûĜ ¸IöëxÓdĵ3‹+Î/Z;ç˜êjul6ñÜßë³XQâ;Î˙:í×ġÉ-óĠÖ­XÚ²{ĜÙg}œ™E‚£:ix’fš#[˙HŞ½sQ%ê[È0UÇÈUÛ&4ôÀŬ˘ē tŒS”mEşŒÁ“ECÁİĵÖxF&èyt_޳>4‚U/&”µK TÀœC À´ÇFEĊâÒÒ ŞÀġ­ClŜ\·p7öÜĥúŭşÛûv ĥöŭş9ûuköë†ĥäĞ“öë'íÔP.ïŻOWŜç¨ŝ3I‰‰2˙w­klög„ş/9C½{OöŒŽÒ Œw1Xż˙pÌÊ2ĵŞ˙.ÒŭŝDH e€·uÉÒ-Ï/ •ıĄĞŝ E[ċ², _Ŝ‰ïzıÂ睇zŸ>°êJ­c6àğ şyXĉ.âËN° `öĊrgÙ=ŸKß BƒB™\”~_;ċÈ vëR¨b´ûôż˙˜ú Ğ•ÂD,ü%8O2”’ÄGBŝQ}6_Yż¸‰Ä¸HK‘?ƒT¸’@xö˘ÀíU!žèş4ĴyV˙ Š UN˘U^;pbÇÀBïƒsÒŞJĤŠ=Êö 6=rxqn# d@µAp zżQcV+Û§ĥr,ö#“çä#°ĥ›ï¨6˙C'ó˘™6¸Żqlż&Ĵeñ@5d˙LïÒ^@Şçqí“rK@‡hŽüğ×D_ úX4gç‰6I·V?„É/ñÖS7şÇvI|Q‰Äéàñê‰ËRn‚xµQ;E| +ŒĉĜù–}߉ßoŸ‹WġÜ8ŝŽO:@` –ħIğ'VSÎ˙û——ΗÌ@Â4X)ÖÄÈ!'è‚~Ċ=+ĜY(A‚ dy8ĝ2Ÿiĝ•Šß޸=+@ùÓVĴˆÊYĥ_¨lkkEß6XtÀF*‘ÈĉĈš“ I „ş,t˙)ÇpCÜb:m–_,gu$Àe£Ĉ^N›2-j;o:—KPVĝ}8úĠ5Ó;ü™îx8xˆ<â /“aMNvX—Jì}Fë{]ÍÊRC_oŒüÓ`dQÑ·"Ŝ~˜÷Ù(ż¤ŭO•ŭKefQŽ;?şuSO§„îë D˘9aȕ<ŜáA0ĤMĊĴĝë‚]ÉQ–PŭขݧTô~pèŞûŽ" ’0,­²½ĜŞlIZjN"ìŞÛ ½AġOĠµ’[ֈġcT /ħìîOPw‰AÑ-9 Ò2Ĵ°w§ˆ’k 7D€ä#Ċ÷Ûİ1Oû\ù•HĝG]`²bwK˜$%ˆğ:Ħ=™Ŭ™܋Lyo›ĉùo›ĉùom,Ġ&Ž{ ÛŻ›ß…:s÷-úMĴz+² –†!á1·[­­„’ċʅGg¨4'‘Sš‡WьpP wğ-"|€Ĝğ…je”ñ°oߓwóa)oáFġ†j9oÍ1=ĤqĊĜĵ­~ĝŞn›˙$O‰›ueèâÀóÙÖJìħ>1ËÍ 8Œ7Ÿ_üıž˙;Ö۝ÉmóPÓŻœ!<ŬwñŻ’KĈèÙsÀ­WŻ!+yŞï`FŻ^…| zŠîèÁŒt‘Ŝi‹^o+ /eŞ!ĉàĵhDĤ*ï{~ßTLK˃âêßW%—7×u{¤)|!ä Nw“ÍĝşJ×Y Y7Nï}U<Š5a Ċ°ÛíbYJ§ċ |™d°eCì…héWÉ@$$›ĉ›¨|D ZÜ÷<ĴpĈ;ËfĈ!sċĤv#q,8Yƒ0n4¨fS˙jĉCHĤHH|X²• Çmz91w},„P ¨úP‘Ŭ€X˘‘ùNëéĈ£Á<<Âŝĝ‡ ´Œz½;Z˘<*8ÑL×[^6W³·œ N|ŽgïbêzyBꃁ™SWÊċ‚OF£TE³Ú­nhsoSÎ\ ,d.¤Žğx}Šy£^ˆ›ġ ğċ‰h9n EĠĊRôʍtÒ‚Ì&zRÙƒï`ĝNT.‰7*öEÁÊêsè.ÛĊüNƒĦFÑğäd0@ĵ Ù.ÚËpŜ˙Mĉ5ġŝ8&ôl|X7³R@öħV`F›z†m(nñöc˙:İ[)Àà·¤÷’8 k}ş€D%Ö£b§ĵJ>6\ħ*còƒufġ!*³ÇċÂ#Ŝ°O3·ês‘ Ĵb[wN ]GrĠĠ€Mşf KG=­ĴÜJùÀLfq+ġs*ĠżOÈ£Ò·à+ŠVÚÛĵâKùoS‘[ŒÁĦ£ÉùF@Tà£Ó6˜ÁESƒŜƒzQûÁŒQfÑ#„­5ÉZŝQ$,p† ~^0“òs ĈÔğ›ħsşü³k2p â+ñQ@#í…pĵ˘¸ŜC’ġË'˙:ÇüÙ5µÀ@pÁPúrĈ›p£ÜG`Òíş°6Ž}÷bĵ#ĵ_ğ2ñ(żŭœĝĠCòxĝp„Ŭ§˙œÀƒ­šâ" Ñ%n7mûú`él~ğ™²W\xŸËš U Ĥùo&zo#ŝöoÈA!ô"Dí‚á*‰ój(×°ĵÒ\p?ĴF#.'́ÂPŽMŝIpĉhúEvßJĥ÷Vҁâğy†Â?0ɎW7Ğ’˙˙p÷ğžlxµß'™ÚTB~•—½MŜÓ*^Ñú„9RœYaÍ%^wĜ2ǵj2sôӜÎĥ…ŝ•ìW”l–svÏIו´2î5ŠŝĜÑzYžž÷CŜ.rS–KôĤúʘP9{}– żËî1šCw~ ÄNP¤[@6&÷I–p>8ĜY—f†oJdö7ZVÔL€úL>uÊñgġIi!q`›İ”€Ï'§³j?à™bÇ ÊĝPj†îŸž{|€•-RG;â,A7•ż²Š‹Gú9Œdĵ} Ëŭ{Lŭ Cîye<ƒşžġò’çßîŻNpà>r…F(N“DònğÙ:²H+™Ĵ —Zuu$·†éĠióĉy‰ĠyC•‘Ôh†êĈ^›½ŭĦ´ÙI‘7ñıßLµğèZ—ħΔ"]°x”üµè£9ßĊEž Ğ`Rĥ¨›‚Ê zÍzˉµ#{x¸½T‚oĈ~&×Îö4ċ!àĦYÔÉ çoëk~CaŒÌWGÁ?b†2­ğżŻ°LÁ› íGÓ?)™Hé9ßÇ,l:1„L0²àtµäĞß̑Z²ÙZù´öñİaç§z€ż'1+ÓÇĉòŸżÄ¨ü´œ’ŝ Żts¨˘Y8?ï"o7e‰§²{ĥqûì½ĤŸ>¸öħ‡Š³›FŒ(½İçۏc‡qŒŸŜ3š›Ŝ#;ùîmL$Á֍ùċËŬÏ˙N ,×-*ƒŬĝ^(ïŠd$;Ë@üÚìNĤÚìĜ#Ö/̨„‡¤Tu’àÊy$@qk­=s§ŜXŬ^â}f’ÈĞçGHAohÎx>(0×â{Œ‰µ@b0 wŽÂ$ñѽ4?šEòyÏC&ƒ˙kihĊ˘¤€›ÒĊ2Ê£…*žjPs™éƒIÖhtYú“î½)ĦÓ¤3›Ĝ~§reèĝĦ8ˆnÊcƒĦ à Zî˙!‚ͧ“Zö~2žGĤƒP˘i+¤"–{JCfQïĤ† !f ‚ŽíÍH|LTQÓ¤ÛmoœÜ‚-ùŭY^>‹êO3STވËZÏĦ^5İ›5à½qŽżŸĦËĈ”X?Zü·´Ġ²[•×ġ0Ĵ)cŠĤÉa:=²hr⊨(˜ĥ[báè²ËYçĜÊùóV¸‚“?a'ŻhEa¤îoÇ­eÛ@÷û&‰ò>Ik†sÛ§‘àż 4nQ™Ë- ŸHċ?NŸôG!óbòüĥk÷ċqö°kĥÛy†9ǨÇà˙Ri2LéÇv{­c•OòÜ4ê&Š ŬHñ=ĝ Ĵ>0yÛ̑ ïcİm×ċ蓁šfN‡HÊ,Ä9@pì!êr˜<ĉ*…Ġ^ÈMşš“ĈĞçÇĈçÊÔ?`f×·8÷@nƒŝ×Q–ŸtHöçVŝĉIJĴğЁĈ ^hŜ"D ŽNOİ›À6MÌÎbú3ħ}ŭċċv_˙|GĦžbíËŝĠ } 8½ֆlıñlbv @#ĥ^›`Ô\–Á³œ§úQ8€ëHm{ğ} ôüƒĤ„ 4*ŭ:Œ™aîNôJ;uĥĦëⴕȉÀö4*ŠZċÑ Pë˘ñXL].L2%Ĉ¨Ú˘ËÄĉÒjX’ȃħR5Ĥ• YKwn‰oĤÂUìÜW}aJ“¤Gğ·œċ8„xċ•×=ËŸD" Rœ0%äˆtÍ^}u9*1½²4óŻéèŭöï>Ûj³ôsî„êiĠŒwJl™ĝ‘³c/$$­€wŞünĠT;B™’҄Ĉ“1e9p9ìĉ3/àék2‹8Ğ2>~QïĞpáġŠgÓçÜkĝXhÙ£Ĵ‡£²I>ġ<–ÚK/=PÚçbF×UMĴͤ7Ì÷T{êlân Ŭ)pqTÈȋ<éÛ)\g“ŬôŸav¸B°Kù˜q.c$Òi,ém.-´ğżd5ĴNúâ‰ı 3Aâ‚s¸8|ÀğP…:*˜ÉÉFĴƒïM06x×$viŒ$aŜ.<§ú*>H—3-¸Ġt&°tÔlš§Bħħ\ċ éġ<î_;hSñġ2‰…‡âW…•ߪ(Û3?ÀÄ£}ôââ} ÀÏğ]﭅÷ĉCĈFg ĵYfÖĉQ äv$œ1y&*MbÜ0=ßہêqÇŜ˙ÙicnV Bŝffdesmume-0.9.11/src/cocoa/translations/0000755000000000000000000000000012467662066016352 5ustar rootrootdesmume-0.9.11/src/cocoa/translations/English.lproj/0000755000000000000000000000000012467662066021070 5ustar rootrootdesmume-0.9.11/src/cocoa/translations/English.lproj/HID_usage_strings.plist0000755000000000000000000012524412467662066025521 0ustar rootroot 0x0001 0x0000 Undefined Usage 0x0001 Pointer 0x0002 Mouse 0x0004 Joystick 0x0005 GamePad 0x0006 Keyboard 0x0007 Keypad 0x0008 MultiAxisController 0x0030 X 0x0031 Y 0x0032 Z 0x0033 Rx 0x0034 Ry 0x0035 Rz 0x0036 Slider 0x0037 Dial 0x0038 Wheel 0x0039 Hatswitch 0x003A Counted Buffer 0x003B Byte Count 0x003C Motion Wakeup 0x003D Start 0x003E Select 0x0040 Vx 0x0041 Vy 0x0042 Vz 0x0043 Vbrx 0x0044 Vbry 0x0045 Vbrz 0x0046 Vno 0x0080 System Control 0x0081 System Power Down 0x0082 System Sleep 0x0083 System Wake Up 0x0084 SystemContext Menu 0x0085 System Main Menu 0x0086 System App Menu 0x0087 System Menu help 0x0088 System Menu Exit 0x0089 System Menu 0x008A System Menu Right 0x008B System Menu Left 0x008C System Menu Up 0x008D System Menu Down 0x0090 DPad Up 0x0091 DPad Down 0x0092 DPad Right 0x0093 DPad Left Name Generic Desktop 0x0002 0x0000 Undefined Usage 0x0001 Flight Simulation Device 0x0002 Automobile Simulation Device 0x0003 Tank Simulation Device 0x0004 Spaceship Simulation Device 0x0005 Submarine Simulation Device 0x0006 Sailing Simulation Device 0x0007 Motorcycle Simulation Device 0x0008 Sports Simulation Device 0x0009 Airplane Simulation Device 0x000A Helicopter Simulation Device 0x000B Magic Carpet Simulation Device 0x000C Bicycle Simulation Device 0x0020 Flight Control Stick 0x0021 Flight Stick 0x0022 Cyclic Control 0x0023 Cyclic Trim 0x0024 Flight Yoke 0x0025 Track Control 0x00B0 Aileron 0x00B1 Aileron Trim 0x00B2 Anti Torque Control 0x00B5 Collective Control 0x00B6 Dive Brake 0x00B7 Electronic Countermeasures 0x00B8 Elevator 0x00B9 Elevator Trim 0x00BA Rudder 0x00BB Throttle 0x00BC Flight Communications 0x00BD Flare Release 0x00BE Landing Gear 0x00BF Toe Brake 0x00C0 Trigger 0x00C1 Weapons Arm 0x00C2 Weapons 0x00C3 Wing Flaps 0x00C4 Accelerator 0x00C5 Brake 0x00C6 Clutch 0x00C7 Shifter 0x00C8 Steering 0x00C9 Turret Direction 0x00CA Barrel Elevation 0x00CB Dive Plane 0x00CC Ballast 0x00CD Bicycle Crank 0x00CE Handle Bars 0x00CF Front Brake 0x00D0 Rear Brake Name Simulation 0x0003 0x0000 Undefined Usage 0x0001 Belt 0x0002 Body Suit 0x0003 Flexor 0x0004 Glove 0x0005 Head Tracker 0x0006 Head Mounted Display 0x0007 Hand Tracker 0x0008 Oculometer 0x0009 Vest 0x000A Animatronic Device 0x0020 Stereo Enable 0x0021 Display Enable Name Virtual Reality 0x0004 0x0000 Undefined Usage 0x0001 Baseball Bat 0x0002 Golf Club 0x0003 Rowing Machine 0x0004 Treadmill 0x0030 Oar 0x0031 Slope 0x0032 Rate 0x0033 Stick Speed 0x0034 Stick Face Angle 0x0035 Stick Heel Or Toe 0x0036 Stick Follow Through 0x0037 Stick Tempo 0x0038 Stick Type 0x0039 Stick Height 0x0050 Putter 0x0051 1 Iron 0x0052 2 Iron 0x0053 3 Iron 0x0054 4 Iron 0x0055 5 Iron 0x0056 6 Iron 0x0057 7 Iron 0x0058 8 Iron 0x0059 9 Iron 0x005A 10 Iron 0x005B 11 Iron 0x005C Sand Wedge 0x005D Loft Wedge 0x005E Power Wedge 0x005F 1 Wood 0x0060 3 Wood 0x0061 5 Wood 0x0062 7 Wood 0x0063 9 Wood Name Sport 0x0005 0x0000 Undefined Usage 0x0001 3D Game Controller 0x0002 Pinball Device 0x0003 Gun 0x0020 Point of View 0x0021 Turn Right Or Left 0x0022 Pitch Up Or Down 0x0023 Roll Right Or Left 0x0024 Move Right Or Left 0x0025 Move Forward Or Backward 0x0026 Move Up Or Down 0x0027 Lean Right Or Left 0x0029 Height Of POV 0x002A Flipper 0x002B Secondary Flipper 0x002C Bump 0x002D New Game 0x002E Shoot Ball 0x002F Player 0x0030 Gun Bolt 0x0031 Gun Clip 0x0032 Gun 0x0033 Gun Single Shot 0x0034 Gun Burst 0x0035 Gun Automatic 0x0036 Gun Safety 0x0037 Gamepad Fire Or Jump 0x0039 Gamepad Trigger Name Game 0x0007 0x0000 Undefined Usage 0x0001 Error Roll Over 0x0002 POST Fail 0x0003 Error Undefined 0x0004 A 0x0005 B 0x0006 C 0x0007 D 0x0008 E 0x0009 F 0x000A G 0x000B H 0x000C I 0x000D J 0x000E K 0x000F L 0x0010 M 0x0011 N 0x0012 O 0x0013 P 0x0014 Q 0x0015 R 0x0016 S 0x0017 T 0x0018 U 0x0019 V 0x001A W 0x001B X 0x001C Y 0x001D Z 0x001E 1 0x001F 2 0x0020 3 0x0021 4 0x0022 5 0x0023 6 0x0024 7 0x0025 8 0x0026 9 0x0027 0 0x0028 Return 0x0029 Escape 0x002A Delete 0x002B Tab 0x002C Spacebar 0x002D Dash 0x002E Equal 0x002F Left Square Bracket 0x0030 Right Square Bracket 0x0031 Slash 0x0032 Non-US # 0x0033 Semi-Colan 0x0034 Single Quote 0x0035 Grave Accent 0x0036 Comma 0x0037 Period 0x0038 Slash 0x0039 Caps Lock 0x003A F1 0x003B F2 0x003C F3 0x003D F4 0x003E F5 0x003F F6 0x0040 F7 0x0041 F8 0x0042 F9 0x0043 F10 0x0044 F11 0x0045 F12 0x0046 Print Screen 0x0047 Scroll Lock 0x0048 Pause 0x0049 Insert 0x004A Home 0x004B Page Up 0x004C Delete Forward 0x004D End 0x004E Page Down 0x004F Right Arrow 0x0050 Left Arrow 0x0051 Down Arrow 0x0052 Up Arrow 0x0053 Keypad NumLock 0x0054 Keypad Slash 0x0055 Keypad Asterisk 0x0056 Keypad Dash 0x0057 Keypad Plus 0x0058 Keypad Enter 0x0059 Keypad 1 0x005A Keypad 2 0x005B Keypad 3 0x005C Keypad 4 0x005D Keypad 5 0x005E Keypad 6 0x005F Keypad 7 0x0060 Keypad 8 0x0061 Keypad 9 0x0062 Keypad 0 0x0063 Keypad Period 0x0064 Non-US Backslash 0x0065 Application 0x0066 Power 0x0067 Keypad Equal 0x0068 F13 0x0069 F14 0x006A F15 0x006B F16 0x006C F17 0x006D F18 0x006E F19 0x006F F20 0x0070 F21 0x0071 F22 0x0072 F23 0x0073 F24 0x0074 Execute 0x0075 Help 0x0076 Menu 0x0077 Select 0x0078 Stop 0x0079 Again 0x007A Undo 0x007B Cut 0x007C Copy 0x007D Paste 0x007E Find 0x007F Mute 0x0080 Volume Up 0x0081 Volume Down 0x0082 Locking Caps Lock 0x0083 Locking Num Lock 0x0084 Locking Scroll Lock 0x0085 Keypad Comma 0x0086 Keypad Equal Sign for AS-400 0x0087 International1 0x0088 International2 0x0089 International3 0x008A International4 0x008B International5 0x008C International6 0x008D International7 0x008E International8 0x008F International9 0x0090 LANG1 0x0091 LANG2 0x0092 LANG3 0x0093 LANG4 0x0094 LANG5 0x0095 LANG6 0x0096 LANG7 0x0097 LANG8 0x0098 LANG9 0x0099 Alternate Erase 0x009A SysReq or Attention 0x009B Cancel 0x009C Clear 0x009D Prior 0x009E Return 0x009F Separator 0x00A0 Out 0x00A1 Oper 0x00A2 Clear or Again 0x00A3 CrSel or Props 0x00A4 ExSel 0x00E0 Left Control 0x00E1 Left Shift 0x00E2 Left Alt 0x00E3 Left GUI 0x00E4 Right Control 0x00E5 Right Shift 0x00E6 Right Alt 0x00E7 Right GUI Name Keyboard or Keypad 0x0008 0x0000 Undefined Usage 0x0001 Num Lock 0x0002 Caps Lock 0x0003 Scroll Lock 0x0004 Compose 0x0005 Kana 0x0006 Power 0x0007 Shift 0x0008 DoNotDisturb 0x0009 Mute 0x000A Tone Enable 0x000B High Cut Filter 0x000C Low Cut Filter 0x000D Equalizer Enable 0x000E Sound Field On 0x000F Surround On 0x0010 Repeat 0x0011 Stereo 0x0012 Sampling Rate Detect 0x0013 Spinning 0x0014 CAV 0x0015 CLV 0x0016 Recording Format Detect 0x0017 Off Hook 0x0018 Ring 0x0019 Message Waiting 0x001A Data Mode 0x001B Battery Operation 0x001C Battery OK 0x001D Battery Low 0x001E Speaker 0x001F Headset 0x0020 Hold 0x0021 Microphone 0x0022 Coverage 0x0023 Night Mode 0x0024 Send Calls 0x0025 Call Pickup 0x0026 Conference 0x0027 Stand By 0x0028 Camera On 0x0029 Camera Off 0x002A On Line 0x002B Off Line 0x002C Busy 0x002D Ready 0x002E Paper Out 0x002F Paper Jam 0x0030 Remote 0x0031 Forward 0x0032 Reverse 0x0033 Stop 0x0034 Rewind 0x0035 Fast Forward 0x0036 Play 0x0037 Pause 0x0038 Record 0x0039 Error 0x003A Usage 0x003B Usage In Use Indicator 0x003C Usage Multi Mode indicator 0x003D Indicator On 0x003E Indicator Flash 0x003F Indicator Slow Blink 0x0040 Indicator Fast Blink 0x0041 Indicator Off 0x0042 Flash On Time 0x0043 Slow Blink On Time 0x0044 Slow Blink Off Time 0x0045 Fast Blink On Time 0x0046 Fast Blink Off Time 0x0047 Usage Indicator Color 0x0048 Indicator Red 0x0049 Indicator Green 0x004A Indicator Amber 0x004B Generic Indicator 0x004C System Suspend 0x004D External Power Connected Name LED 0x0009 Name Button 0x000C 0x0000 Undefined Usage 0x0001 Consumer Control 0x0002 Numeric KeyPad 0x0003 Programmable Buttons 0x0020 Plus 10 0x0021 Plus 100 0x0022 AM Or PM 0x0030 Power 0x0031 Reset 0x0032 Sleep 0x0033 Sleep After 0x0034 Sleep Mode 0x0035 Illumination 0x0036 Function Buttons 0x0040 Menu 0x0041 Menu Pick 0x0042 Menu Up 0x0043 Menu Down 0x0044 Menu Left 0x0045 Menu Right 0x0046 Menu Escape 0x0047 Menu Value Increase 0x0048 Menu Value Decrease 0x0060 Data On Screen 0x0061 Closed Caption 0x0062 Closed Caption Select 0x0063 VCR Or TV 0x0064 Broadcast Mode 0x0065 Snapshot 0x0066 Still 0x0080 Selection 0x0081 Assign 0x0082 Mode Step 0x0083 Recall Last 0x0084 Enter Channel 0x0085 Order Movie 0x0086 Channel 0x0087 Media Selection 0x0088 Media Select Computer 0x0089 Media Select TV 0x008A Media Select WWW 0x008B Media Select DVD 0x008E Media Select Video Phone 0x008F Media Select Games 0x0090 Media Select Messages 0x0091 Media Select CD 0x0092 Media Select VCR 0x0093 Media Select Tuner 0x0094 Quit 0x0095 Help 0x0096 Media Select Tape 0x0097 Media Select Cable 0x0098 Media Select Satellite 0x0099 Media Select Security 0x009A Media Select Home 0x009B Media Select Call 0x009C Channel Increment 0x009D Channel Decrement 0x009E Media 0x00A0 VCR Plus 0x00A1 Once 0x00A2 Daily 0x00A3 Weekly 0x00A4 Monthly 0x00B0 Play 0x00B1 Pause 0x00B2 Record 0x00B3 Fast Forward 0x00B4 Rewind 0x00B5 Scan Next Track 0x00B6 Scan Previous Track 0x00B7 Stop 0x00B8 Eject 0x00B9 Random Play 0x00BA Select Disc 0x00BB Enter Disc 0x00BC Repeat 0x00BD Tracking 0x00BE Track Normal 0x00BF Slow Tracking 0x00C0 Frame Forward 0x00C1 Frame Back 0x00C2 Mark 0x00C3 Clear Mark 0x00C4 Repeat From Mark 0x00C5 Return To Mark 0x00C6 Search Mark Forward 0x00C7 Search Mark Backwards 0x00C8 Counter Reset 0x00C9 Show Counter 0x00CA Tracking Increment 0x00CB Tracking Decrement 0x00CC Stop Or Eject 0x00CD Play Or Pause 0x00CE Play Or Skip 0x00E0 Volume 0x00E1 Balance 0x00E2 Mute 0x00E3 Bass 0x00E4 Treble 0x00E5 Bass Boost 0x00E6 Surround Mode 0x00E7 Loudness 0x00E8 MPX 0x00E9 Volume Increment 0x00EA Volume Decrement 0x00F0 Speed 0x00F1 Playback Speed 0x00F2 Standard Play 0x00F3 Long Play 0x00F4 Extended Play 0x00F5 Slow 0x0100 Fan Enable 0x0101 Fan Speed 0x0102 Light Enable 0x0103 Light Illumination Level 0x0104 Climate Control Enable 0x0105 Room Temperature 0x0106 Security Enable 0x0107 Fire Alarm 0x0108 Police Alarm 0x0150 Balance Right 0x0151 Balance Left 0x0152 Bass Increment 0x0153 Bass Decrement 0x0154 Treble Increment 0x0155 Treble Decrement 0x0160 Speaker System 0x0161 Channel Left 0x0162 Channel Right 0x0164 Channel Front 0x0165 Channel Center Front 0x0166 Channel Side 0x0167 Channel Surround 0x0168 Channel Low Frequency Enhancement 0x0169 Channel Top 0x016A Channel Unknown 0x0170 Sub Channel 0x0171 Sub Channel Increment 0x0172 Sub Channel Decrement 0x0173 Alternate Audio Increment 0x0174 Alternate Audio Decrement 0x0180 Application Launch Buttons 0x0181 AL Launch Button Configuration Tool 0x0182 AL Programmable Button Configuration 0x0183 AL Consumer Control Configuration 0x0184 AL Word Processor 0x0185 AL Text Editor 0x0186 AL Spreadsheet 0x0187 AL Graphics Editor 0x0188 AL Presentation App 0x0189 AL Database App 0x018A AL Email Reader 0x018B AL Newsreader 0x018C AL Voicemail 0x018D AL Contacts Or AddressBook 0x018E AL Calendar Or Schedule 0x018F AL Task Or Project Manager 0x0190 AL Log Or Journal Or Timecard 0x0191 AL Checkbook Or Finance 0x0192 AL Calculator 0x0193 AL A Or V Capture Or Playback 0x0194 AL Local Machine Browser 0x0195 AL LAN Or WAN Browser 0x0196 AL Internet Browser 0x0197 AL Remote Networking Or ISP Connect 0x0198 AL Network Conference 0x0199 AL Network Chat 0x019A AL Telephony Or Dialer 0x019B AL Logon 0x019C AL Logoff 0x019D AL Logon Or Logoff 0x019E AL Terminal Lock Or Screensaver 0x019F AL Control Panel 0x01A0 AL Command Line Processor Or Run 0x01A1 AL Process Or Task Manager 0x01A2 AL 0x01A3 AL Next Task Or Application 0x01A4 AL Previous Task Or Application 0x01A5 AL Preemptive Halt Task Or Application 0x0200 Generic GUI Application Controls 0x0201 AC New 0x0202 AC Open 0x0203 AC Close 0x0204 AC Exit 0x0205 AC Maximize 0x0206 AC Minimize 0x0207 AC Save 0x0208 AC Print 0x0209 AC Properties 0x021A AC Undo 0x021B AC Copy 0x021C AC Cut 0x021D AC Paste 0x021E AC 0x021F AC Find 0x0220 AC Find and Replace 0x0221 AC Search 0x0222 AC Go To 0x0223 AC Home 0x0224 AC Back 0x0225 AC Forward 0x0226 AC Stop 0x0227 AC Refresh 0x0228 AC Previous Link 0x0229 AC Next Link 0x022A AC Bookmarks 0x022B AC History 0x022C AC Subscriptions 0x022D AC Zoom In 0x022E AC Zoom Out 0x022F AC Zoom 0x0230 AC Full Screen View 0x0231 AC Normal View 0x0232 AC View Toggle 0x0233 AC Scroll Up 0x0234 AC Scroll Down 0x0235 AC Scroll 0x0236 AC Pan Left 0x0237 AC Pan Right 0x0238 AC Pan 0x0239 AC New Window 0x023A AC Tile Horizontally 0x023B AC Tile Vertically 0x023C AC Format Name Consumer 0x0084 0x0000 Undefined Usage 0x0001 Name Index 0x0002 Present Status 0x0003 Changed Status 0x0004 Uninterruptible Power Supply 0x0005 Power Supply 0x0010 Battery System power module 0x0011 Battery System ID 0x0012 Battery 0x0013 Battery ID 0x0014 Charger 0x0015 Charger ID 0x0016 Power Converter power module 0x0017 Power Converter ID 0x0018 Outlet System power module 0x0019 Outlet System ID 0x001A Input 0x001B Input ID 0x001C Output 0x001D Output ID 0x001E Flow 0x001F Flow ID 0x0020 Outlet 0x0021 Outlet ID 0x0022 Gang 0x0023 Gang ID 0x0024 Power Summary 0x0025 Power Summary ID 0x0030 Voltage 0x0031 Current 0x0032 Frequency 0x0033 Apparent Power 0x0034 RMS Power 0x0035 Percent Load 0x0036 Temperature 0x0037 Humidity 0x0038 Bad Condition Count 0x0040 Nominal Voltage 0x0041 Nominal Current 0x0042 Nominal Frequency 0x0043 Nominal Apparent Power 0x0044 Nominal RMS Power 0x0045 Nominal Percent Load 0x0046 Nominal Temperature 0x0047 Nominal Humidity 0x0050 Switch On Control 0x0051 Switch Off Control 0x0052 Toogle Sequence Control 0x0053 Min Transfer Voltage 0x0054 Max Transfer Voltage 0x0055 Delay Before Reboot 0x0056 Delay Before Startup 0x0057 Delay Before Shutdown 0x0058 Test Request/Result 0x0059 Reset Request/Result 0x005A Audible Alarm Control 0x0060 Present 0x0061 Good 0x0062 Internal Failure 0x0063 Voltage Out Of Range 0x0064 Frequency Out Of Range 0x0065 Overload 0x0066 Over Charged 0x0067 Over Temperature 0x0068 Shutdown Requested 0x0069 Shutdown Imminent 0x006B On/Off Switch Status 0x006C Switchable 0x006D Used 0x006E Boosted 0x006F Bucked 0x0070 Initialized 0x0071 Tested 0x0072 Awaiting Power 0x0073 Communication Lost 0x00FD Manufacturer String Index 0x00FE Product String Index 0x00FF Serial Number String Index Name Power Device Page 0x0085 0x0000 Undefined Usage 0x0001 Mode 0x0002 Status 0x0003 Alarm Warning 0x0004 Charger Mode 0x0005 Charger Status 0x0006 Charger Extended Status 0x0007 Selector State 0x0008 Selector Presets 0x0009 Selector Info 0x0010 Mfg Function 1 0x0011 Mfg Function 2 0x0012 Mfg Function 3 0x0013 Mfg Function 4 0x0014 Mfg Function 5 0x0015 Connection To System Management Bus 0x0016 Output Connection Status 0x0017 Charger Connection 0x0018 Battery Insertion 0x0019 Use Next 0x001A OK To Use 0x001B Battery Supported 0x001C Selector Revision 0x001D Charging Indicator 0x0028 Manufacturer Access 0x0029 Remaining Capacity Limit 0x002A Remaining Time Limit 0x002B At Rate... 0x002C Capacity Mode 0x002D Broadcast To Charger 0x002E Primary Battery 0x002F Charge Controller 0x0040 Terminate Charge 0x0041 Terminate Discharge 0x0042 Below Remaining Capacity Limit 0x0043 Remaining Time Limit Expired 0x0044 Charging 0x0045 Discharging 0x0046 Fully Charged 0x0047 Fully Discharged 0x0048 Conditioning Flag 0x0049 At Rate OK 0x004A SMB Error Code 0x004B Need Replacement 0x0060 At Rate Time To Full 0x0061 At Rate Time To Empty 0x0062 Average Current 0x0063 Max Error 0x0065 Absolute State Of Charge 0x0066 Remaining Capacity 0x0067 Full Charge Capacity 0x0068 Run Time To Empty 0x0069 Average Time To Empty 0x006A Average Time To Full 0x006B Cycle Count 0x0080 Batt Pack Model Level 0x0081 Internal Charge Controller 0x0082 Primary Battery Support 0x0083 Design Capacity 0x0084 Specification Info 0x0085 Manufacturer Date 0x0086 Serial Number 0x0087 Manufacturer Name Index 0x0088 Device Name Index 0x0089 Device Chemistry Index 0x008A Manufacturer Data 0x008B Rechargable 0x008C Warning Capacity Limit 0x008D Capacity Granularity 1 0x008E Capacity Granularity 2 0x008F OEM Information Index 0x00C0 Inhibit Charge 0x00C1 Enable Polling 0x00C2 Reset To Zero 0x00D0 AC Present 0x00D1 Battery Present 0x00D2 Power Fail 0x00D3 Alarm Inhibited 0x00D4 Thermistor Under Range 0x00D5 Thermistor Hot 0x00D6 Thermistor Cold 0x00D7 Thermistor Over Range 0x00D8 Voltage Out Of Range 0x00D9 Current Out Of Range 0x00DA Current Not Regulated 0x00DB Voltage Not Regulated 0x00DC Master Mode 0x00F0 Charger Support Selector 0x00F1 Charger Specification 0x00F2 Charger Level 2 0x00F3 Charger Level 3 Name Battery System Page 0xFF00 Name Vendor desmume-0.9.11/src/cocoa/translations/English.lproj/MainMenu.strings0000755000000000000000000123023612467662066024226 0ustar rootroot˙ŝ /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "5"; */ "5.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "19"; */ "19.title" = "Window"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "23"; */ "23.title" = "Minimize"; /* Class = "NSMenu"; title = "Window"; ObjectID = "24"; */ "24.title" = "Window"; /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "About DeSmuME"; /* Class = "NSMenuItem"; title = "Load ROM& "; ObjectID = "72"; */ "72.title" = "Load ROM& "; /* Class = "NSMenuItem"; title = "Save State File"; ObjectID = "75"; */ "75.title" = "Save State File"; /* Class = "NSMenuItem"; title = "Save State File As& "; ObjectID = "80"; */ "80.title" = "Save State File As& "; /* Class = "NSMenu"; title = "File"; ObjectID = "81"; */ "81.title" = "File"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "83"; */ "83.title" = "File"; /* Class = "NSMenuItem"; title = "Revert State File to Saved"; ObjectID = "112"; */ "112.title" = "Revert State File to Saved"; /* Class = "NSMenuItem"; title = "Load Recent ROM"; ObjectID = "124"; */ "124.title" = "Load Recent ROM"; /* Class = "NSMenu"; title = "Load Recent ROM"; ObjectID = "125"; */ "125.title" = "Load Recent ROM"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "126"; */ "126.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Preferences& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Services"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Services"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Hide DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Quit DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Show All"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "239"; */ "239.title" = "Zoom"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "295"; */ "295.title" = "View"; /* Class = "NSMenu"; title = "View"; ObjectID = "296"; */ "296.title" = "View"; /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "297"; */ "297.title" = "Show Toolbar"; /* Class = "NSMenuItem"; title = "Customize Toolbar& "; ObjectID = "298"; */ "298.title" = "Customize Toolbar& "; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "490"; */ "490.title" = "Help"; /* Class = "NSMenu"; title = "Help"; ObjectID = "491"; */ "491.title" = "Help"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "492"; */ "492.title" = "DeSmuME Help"; /* Class = "NSMenuItem"; title = "Unload ROM"; ObjectID = "534"; */ "534.title" = "Unload ROM"; /* Class = "NSMenuItem"; title = "Open State File..."; ObjectID = "535"; */ "535.title" = "Open State File..."; /* Class = "NSMenuItem"; title = "Load State Slot"; ObjectID = "538"; */ "538.title" = "Load State Slot"; /* Class = "NSMenu"; title = "Load State Slot"; ObjectID = "539"; */ "539.title" = "Load State Slot"; /* Class = "NSMenuItem"; title = "Save State Slot"; ObjectID = "541"; */ "541.title" = "Save State Slot"; /* Class = "NSMenu"; title = "Save State Slot"; ObjectID = "542"; */ "542.title" = "Save State Slot"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "575"; */ "575.title" = "Emulation"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "576"; */ "576.title" = "Emulation"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "594"; */ "594.title" = "Execute"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "596"; */ "596.title" = "Reset"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "607"; */ "607.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "608"; */ "608.title" = "Tools"; /* Class = "NSWindow"; title = "DeSmuME Preferences"; ObjectID = "627"; */ "627.title" = "DeSmuME Preferences"; /* Class = "NSMenuItem"; title = "Display Rotation"; ObjectID = "783"; */ "783.title" = "Display Rotation"; /* Class = "NSMenu"; title = "Display Rotation"; ObjectID = "784"; */ "784.title" = "Display Rotation"; /* Class = "NSMenuItem"; title = "0ş"; ObjectID = "785"; */ "785.title" = "0ş"; /* Class = "NSMenuItem"; title = "Display Size"; ObjectID = "787"; */ "787.title" = "Display Size"; /* Class = "NSMenu"; title = "Display Size"; ObjectID = "788"; */ "788.title" = "Display Size"; /* Class = "NSMenuItem"; title = "1x"; ObjectID = "789"; */ "789.title" = "1x"; /* Class = "NSWindow"; title = "HUD Settings"; ObjectID = "794"; */ "794.title" = "HUD Settings"; /* Class = "NSWindow"; title = "Video Settings"; ObjectID = "796"; */ "796.title" = "Video Settings"; /* Class = "NSButtonCell"; title = "Frame Counter"; ObjectID = "824"; */ "824.title" = "Frame Counter"; /* Class = "NSButtonCell"; title = "Frames Per Second"; ObjectID = "826"; */ "826.title" = "Frames Per Second"; /* Class = "NSButtonCell"; title = "Input"; ObjectID = "828"; */ "828.title" = "Input"; /* Class = "NSButtonCell"; title = "Graphical Input"; ObjectID = "830"; */ "830.title" = "Graphical Input"; /* Class = "NSButtonCell"; title = "Lag Counter"; ObjectID = "832"; */ "832.title" = "Lag Counter"; /* Class = "NSButtonCell"; title = "Microphone"; ObjectID = "834"; */ "834.title" = "Microphone"; /* Class = "NSButtonCell"; title = "Real Time Clock"; ObjectID = "836"; */ "836.title" = "Real Time Clock"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "844"; */ "844.title" = "Save Settings as Default"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "846"; */ "846.title" = "Save Settings as Default"; /* Class = "NSWindow"; title = "ROM Info"; ObjectID = "861"; */ "861.title" = "ROM Info"; /* Class = "NSTextFieldCell"; title = "Name: "; ObjectID = "880"; */ "880.title" = "Name: "; /* Class = "NSTextFieldCell"; title = "Serial: "; ObjectID = "884"; */ "884.title" = "Serial: "; /* Class = "NSTextFieldCell"; title = "Developer: "; ObjectID = "886"; */ "886.title" = "Developer: "; /* Class = "NSTextFieldCell"; title = "Capacity: "; ObjectID = "888"; */ "888.title" = "Capacity: "; /* Class = "NSTextFieldCell"; title = "Japanese:"; ObjectID = "890"; */ "890.title" = "Japanese:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary ROM Offset:"; ObjectID = "898"; */ "898.title" = "ARM9 Binary ROM Offset:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary Entry Address:"; ObjectID = "900"; */ "900.title" = "ARM9 Binary Entry Address:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary Start Address:"; ObjectID = "902"; */ "902.title" = "ARM9 Binary Start Address:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary Size:"; ObjectID = "904"; */ "904.title" = "ARM9 Binary Size:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary ROM Offset:"; ObjectID = "906"; */ "906.title" = "ARM7 Binary ROM Offset:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary Entry Address:"; ObjectID = "908"; */ "908.title" = "ARM7 Binary Entry Address:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary Start Address:"; ObjectID = "910"; */ "910.title" = "ARM7 Binary Start Address:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary Size:"; ObjectID = "912"; */ "912.title" = "ARM7 Binary Size:"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "914"; */ "914.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; title = "English:"; ObjectID = "925"; */ "925.title" = "English:"; /* Class = "NSTextFieldCell"; title = "French:"; ObjectID = "927"; */ "927.title" = "French:"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "929"; */ "929.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "931"; */ "931.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "933"; */ "933.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "935"; */ "935.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "937"; */ "937.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "939"; */ "939.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "941"; */ "941.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "German:"; ObjectID = "943"; */ "943.title" = "German:"; /* Class = "NSTextFieldCell"; title = "Italian:"; ObjectID = "945"; */ "945.title" = "Italian:"; /* Class = "NSTextFieldCell"; title = "Spanish:"; ObjectID = "947"; */ "947.title" = "Spanish:"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "950"; */ "950.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; title = "FNT ROM Offset:"; ObjectID = "951"; */ "951.title" = "FNT ROM Offset:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "954"; */ "954.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "FNT Size:"; ObjectID = "955"; */ "955.title" = "FNT Size:"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "958"; */ "958.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; title = "FAT ROM Offset:"; ObjectID = "959"; */ "959.title" = "FAT ROM Offset:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "962"; */ "962.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "FAT Size:"; ObjectID = "963"; */ "963.title" = "FAT Size:"; /* Class = "NSTextFieldCell"; placeholderString = "0xXXXXXXXX"; ObjectID = "966"; */ "966.placeholderString" = "0xXXXXXXXX"; /* Class = "NSTextFieldCell"; title = "Icon/Title Offset:"; ObjectID = "967"; */ "967.title" = "Icon/Title Offset:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "970"; */ "970.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Used:"; ObjectID = "971"; */ "971.title" = "Used:"; /* Class = "NSMenuItem"; title = "Go to Website..."; ObjectID = "977"; */ "977.title" = "Go to Website..."; /* Class = "NSMenuItem"; title = "Go to Forums..."; ObjectID = "978"; */ "978.title" = "Go to Forums..."; /* Class = "NSMenuItem"; title = "Submit a Bug Report..."; ObjectID = "979"; */ "979.title" = "Submit a Bug Report..."; /* Class = "NSTextFieldCell"; placeholderString = "romInternalName"; ObjectID = "1035"; */ "1035.placeholderString" = "romInternalName"; /* Class = "NSTextFieldCell"; placeholderString = "romSerial"; ObjectID = "1037"; */ "1037.placeholderString" = "romSerial"; /* Class = "NSTextFieldCell"; placeholderString = "gameDeveloperWithCode"; ObjectID = "1039"; */ "1039.placeholderString" = "gameDeveloperWithCode"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "1041"; */ "1041.placeholderString" = "? bytes"; /* Class = "NSMenuItem"; title = "90ş"; ObjectID = "1113"; */ "1113.title" = "90ş"; /* Class = "NSMenuItem"; title = "180ş"; ObjectID = "1114"; */ "1114.title" = "180ş"; /* Class = "NSMenuItem"; title = "270ş"; ObjectID = "1115"; */ "1115.title" = "270ş"; /* Class = "NSMenuItem"; title = "2x"; ObjectID = "1118"; */ "1118.title" = "2x"; /* Class = "NSMenuItem"; title = "3x"; ObjectID = "1119"; */ "1119.title" = "3x"; /* Class = "NSMenuItem"; title = "4x"; ObjectID = "1120"; */ "1120.title" = "4x"; /* Class = "NSButtonCell"; title = "Automatically execute emulation when loading a ROM"; ObjectID = "1300"; */ "1300.title" = "Automatically execute emulation when loading a ROM"; /* Class = "NSPopUpButton"; ibShadowedToolTip = "Sets the default size for new NDS display views."; ObjectID = "1507"; */ "1507.ibShadowedToolTip" = "Sets the default size for new NDS display views."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1509"; */ "1509.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "1x"; ObjectID = "1510"; */ "1510.title" = "1x"; /* Class = "NSMenuItem"; title = "2x"; ObjectID = "1511"; */ "1511.title" = "2x"; /* Class = "NSMenuItem"; title = "3x"; ObjectID = "1512"; */ "1512.title" = "3x"; /* Class = "NSPopUpButton"; ibShadowedToolTip = "Sets the default rotation for new NDS display views."; ObjectID = "1525"; */ "1525.ibShadowedToolTip" = "Sets the default rotation for new NDS display views."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1527"; */ "1527.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "0ş"; ObjectID = "1528"; */ "1528.title" = "0ş"; /* Class = "NSMenuItem"; title = "90ş"; ObjectID = "1529"; */ "1529.title" = "90ş"; /* Class = "NSMenuItem"; title = "180ş"; ObjectID = "1530"; */ "1530.title" = "180ş"; /* Class = "NSMenuItem"; title = "270ş"; ObjectID = "1531"; */ "1531.title" = "270ş"; /* Class = "NSMenuItem"; title = "4x"; ObjectID = "1532"; */ "1532.title" = "4x"; /* Class = "NSBox"; title = "General Behavior"; ObjectID = "1538"; */ "1538.title" = "General Behavior"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1543"; */ "1543.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Last Loaded ROM"; ObjectID = "1544"; */ "1544.title" = "Last Loaded ROM"; /* Class = "NSMenuItem"; title = "Choose ROM..."; ObjectID = "1545"; */ "1545.title" = "Choose ROM..."; /* Class = "NSTextField"; ibShadowedToolTip = "The default rotation for new NDS display views. A custom rotation angle may be entered here. (The angle must be between 0ş and 360ş.)"; ObjectID = "1577"; */ "1577.ibShadowedToolTip" = "The default rotation for new NDS display views. A custom rotation angle may be entered here. (The angle must be between 0ş and 360ş.)"; /* Class = "NSTextFieldCell"; title = "0ş"; ObjectID = "1578"; */ "1578.title" = "0ş"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "1581"; */ "1581.title" = "Custom"; /* Class = "NSTabViewItem"; label = "Display Views"; ObjectID = "1616"; */ "1616.label" = "Display Views"; /* Class = "NSTabViewItem"; label = "Video Settings"; ObjectID = "1620"; */ "1620.label" = "Video Settings"; /* Class = "NSPopUpButton"; ibShadowedToolTip = "Sets the default pixel scaler for new NDS display views, producing a variety of visual effects. CPU (or GPU) usage is dependent on which scaler is used."; ObjectID = "1626"; */ "1626.ibShadowedToolTip" = "Sets the default pixel scaler for new NDS display views, producing a variety of visual effects. CPU (or GPU) usage is dependent on which scaler is used."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1628"; */ "1628.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "1629"; */ "1629.title" = "None"; /* Class = "NSMenuItem"; title = "LQ2x"; ObjectID = "1630"; */ "1630.title" = "LQ2x"; /* Class = "NSMenuItem"; title = "LQ2xS"; ObjectID = "1631"; */ "1631.title" = "LQ2xS"; /* Class = "NSTextFieldCell"; title = "Preview:"; ObjectID = "1635"; */ "1635.title" = "Preview:"; /* Class = "NSMenuItem"; title = "HQ2x"; ObjectID = "1636"; */ "1636.title" = "HQ2x"; /* Class = "NSMenuItem"; title = "2xSaI"; ObjectID = "1637"; */ "1637.title" = "2xSaI"; /* Class = "NSMenuItem"; title = "HQ2xS"; ObjectID = "1638"; */ "1638.title" = "HQ2xS"; /* Class = "NSMenuItem"; title = "Super 2xSaI"; ObjectID = "1639"; */ "1639.title" = "Super 2xSaI"; /* Class = "NSMenuItem"; title = "Scanline"; ObjectID = "1640"; */ "1640.title" = "Scanline"; /* Class = "NSMenuItem"; title = "Super Eagle"; ObjectID = "1641"; */ "1641.title" = "Super Eagle"; /* Class = "NSMenuItem"; title = "Nearest 2x"; ObjectID = "1643"; */ "1643.title" = "Nearest 2x"; /* Class = "NSMenuItem"; title = "EPX"; ObjectID = "1646"; */ "1646.title" = "EPX"; /* Class = "NSMenuItem"; title = "EPX+"; ObjectID = "1647"; */ "1647.title" = "EPX+"; /* Class = "NSTextFieldCell"; title = "Pixel Scaler:"; ObjectID = "1651"; */ "1651.title" = "Pixel Scaler:"; /* Class = "NSToolbarItem"; label = "Input"; ObjectID = "1679"; */ "1679.label" = "Input"; /* Class = "NSToolbarItem"; paletteLabel = "Input"; ObjectID = "1679"; */ "1679.paletteLabel" = "Input"; /* Class = "NSToolbarItem"; label = "General"; ObjectID = "1680"; */ "1680.label" = "General"; /* Class = "NSToolbarItem"; paletteLabel = "General"; ObjectID = "1680"; */ "1680.paletteLabel" = "General"; /* Class = "NSToolbarItem"; label = "Display"; ObjectID = "1681"; */ "1681.label" = "Display"; /* Class = "NSToolbarItem"; paletteLabel = "Display"; ObjectID = "1681"; */ "1681.paletteLabel" = "Display"; /* Class = "NSMenuItem"; title = "Custom..."; ObjectID = "1855"; */ "1855.title" = "Custom..."; /* Class = "NSWindow"; title = "Set Rotation"; ObjectID = "1856"; */ "1856.title" = "Set Rotation"; /* Class = "NSTextFieldCell"; title = "0ş"; ObjectID = "1977"; */ "1977.title" = "0ş"; /* Class = "NSTextFieldCell"; title = "90ş"; ObjectID = "1979"; */ "1979.title" = "90ş"; /* Class = "NSTextFieldCell"; title = "180ş"; ObjectID = "1981"; */ "1981.title" = "180ş"; /* Class = "NSTextFieldCell"; title = "270ş"; ObjectID = "1983"; */ "1983.title" = "270ş"; /* Class = "NSTextFieldCell"; placeholderString = "rotX"; ObjectID = "1988"; */ "1988.placeholderString" = "rotX"; /* Class = "NSTextFieldCell"; title = "Rotation set to:"; ObjectID = "1999"; */ "1999.title" = "Rotation set to:"; /* Class = "NSMenuItem"; title = "5x"; ObjectID = "2095"; */ "2095.title" = "5x"; /* Class = "NSButtonCell"; title = "Set to 0ş"; ObjectID = "2155"; */ "2155.title" = "Set to 0ş"; /* Class = "NSToolbarItem"; label = "Sound"; ObjectID = "2246"; */ "2246.label" = "Sound"; /* Class = "NSToolbarItem"; paletteLabel = "Sound"; ObjectID = "2246"; */ "2246.paletteLabel" = "Sound"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "2250"; */ "2250.title" = "General Settings"; /* Class = "NSSlider"; ibShadowedToolTip = "Sets the default sound volume."; ObjectID = "2253"; */ "2253.ibShadowedToolTip" = "Sets the default sound volume."; /* Class = "NSTextFieldCell"; placeholderString = "%1.1f%%"; ObjectID = "2258"; */ "2258.placeholderString" = "%1.1f%%"; /* Class = "NSTextFieldCell"; title = "Display Size:"; ObjectID = "2288"; */ "2288.title" = "Display Size:"; /* Class = "NSTextFieldCell"; title = "Display Rotation:"; ObjectID = "2290"; */ "2290.title" = "Display Rotation:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "2294"; */ "2294.title" = "OtherViews"; /* Class = "NSMenuItem"; ibShadowedToolTip = "New display views will show both NDS screens by default."; ObjectID = "2297"; */ "2297.ibShadowedToolTip" = "New display views will show both NDS screens by default."; /* Class = "NSMenuItem"; title = "Dual Screen"; ObjectID = "2297"; */ "2297.title" = "Dual Screen"; /* Class = "NSMenuItem"; ibShadowedToolTip = "New display views will show only the NDS touch screen by default."; ObjectID = "2298"; */ "2298.ibShadowedToolTip" = "New display views will show only the NDS touch screen by default."; /* Class = "NSMenuItem"; title = "Touch"; ObjectID = "2298"; */ "2298.title" = "Touch"; /* Class = "NSTextFieldCell"; title = "Display Mode:"; ObjectID = "2299"; */ "2299.title" = "Display Mode:"; /* Class = "NSBox"; title = "SPU Interpolation Method"; ObjectID = "2327"; */ "2327.title" = "SPU Interpolation Method"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; ObjectID = "2329"; */ "2329.ibShadowedToolTip" = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "2329"; */ "2329.title" = "None"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; ObjectID = "2330"; */ "2330.ibShadowedToolTip" = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Linear"; ObjectID = "2330"; */ "2330.title" = "Linear"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "2331"; */ "2331.title" = "Radio"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; ObjectID = "2332"; */ "2332.ibShadowedToolTip" = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "Cosine"; ObjectID = "2332"; */ "2332.title" = "Cosine"; /* Class = "NSToolbarItem"; label = "Emulation"; ObjectID = "2340"; */ "2340.label" = "Emulation"; /* Class = "NSToolbarItem"; paletteLabel = "Emulation"; ObjectID = "2340"; */ "2340.paletteLabel" = "Emulation"; /* Class = "NSBox"; title = "Emulation Timing"; ObjectID = "2341"; */ "2341.title" = "Emulation Timing"; /* Class = "NSBox"; title = "BIOS Configuration"; ObjectID = "2342"; */ "2342.title" = "BIOS Configuration"; /* Class = "NSBox"; title = "Firmware Configuration"; ObjectID = "2343"; */ "2343.title" = "Firmware Configuration"; /* Class = "NSBox"; title = "Debugger Configuration"; ObjectID = "2344"; */ "2344.title" = "Debugger Configuration"; /* Class = "NSButton"; ibShadowedToolTip = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; ObjectID = "2345"; */ "2345.ibShadowedToolTip" = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; /* Class = "NSButtonCell"; title = "Advanced Bus-Level Timing"; ObjectID = "2346"; */ "2346.title" = "Advanced Bus-Level Timing"; /* Class = "NSButton"; ibShadowedToolTip = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; ObjectID = "2347"; */ "2347.ibShadowedToolTip" = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; /* Class = "NSButtonCell"; title = "Use External BIOS Images"; ObjectID = "2348"; */ "2348.title" = "Use External BIOS Images"; /* Class = "NSTextFieldCell"; placeholderString = "Set BIOS Image..."; ObjectID = "2350"; */ "2350.placeholderString" = "Set BIOS Image..."; /* Class = "NSTextFieldCell"; title = "ARM9 BIOS Image:"; ObjectID = "2354"; */ "2354.title" = "ARM9 BIOS Image:"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "2356"; */ "2356.title" = "Choose..."; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "2360"; */ "2360.title" = "Choose..."; /* Class = "NSTextFieldCell"; title = "ARM7 BIOS Image:"; ObjectID = "2361"; */ "2361.title" = "ARM7 BIOS Image:"; /* Class = "NSTextFieldCell"; placeholderString = "Set BIOS Image..."; ObjectID = "2362"; */ "2362.placeholderString" = "Set BIOS Image..."; /* Class = "NSButton"; ibShadowedToolTip = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May CPU usage, depending on if the ROM uses the ARM SWIs."; ObjectID = "2363"; */ "2363.ibShadowedToolTip" = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May CPU usage, depending on if the ROM uses the ARM SWIs."; /* Class = "NSButtonCell"; title = "Emulate BIOS Software Interrupts"; ObjectID = "2364"; */ "2364.title" = "Emulate BIOS Software Interrupts"; /* Class = "NSButton"; ibShadowedToolTip = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; ObjectID = "2365"; */ "2365.ibShadowedToolTip" = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; /* Class = "NSButtonCell"; title = "Patch DelayLoop SWI (speed hack)"; ObjectID = "2366"; */ "2366.title" = "Patch DelayLoop SWI (speed hack)"; /* Class = "NSButton"; ibShadowedToolTip = "For developer usage only."; ObjectID = "2367"; */ "2367.ibShadowedToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Use Debug Console"; ObjectID = "2368"; */ "2368.title" = "Use Debug Console"; /* Class = "NSButton"; ibShadowedToolTip = "For developer usage only."; ObjectID = "2369"; */ "2369.ibShadowedToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Emulate Ensata"; ObjectID = "2370"; */ "2370.title" = "Emulate Ensata"; /* Class = "NSButton"; ibShadowedToolTip = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; ObjectID = "2371"; */ "2371.ibShadowedToolTip" = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "2375"; */ "2375.title" = "Choose..."; /* Class = "NSTextFieldCell"; title = "Firmware Image:"; ObjectID = "2376"; */ "2376.title" = "Firmware Image:"; /* Class = "NSTextFieldCell"; placeholderString = "Set Firmware Image..."; ObjectID = "2377"; */ "2377.placeholderString" = "Set Firmware Image..."; /* Class = "NSButtonCell"; title = "Use External Firmware Image"; ObjectID = "2378"; */ "2378.title" = "Use External Firmware Image"; /* Class = "NSMenuItem"; title = "ROM Save Type"; ObjectID = "2382"; */ "2382.title" = "ROM Save Type"; /* Class = "NSMenu"; title = "ROM Save Type"; ObjectID = "2383"; */ "2383.title" = "ROM Save Type"; /* Class = "NSMenuItem"; title = "Automatic"; ObjectID = "2384"; */ "2384.title" = "Automatic"; /* Class = "NSMenuItem"; title = "EEPROM 4Kb"; ObjectID = "2386"; */ "2386.title" = "EEPROM 4Kb"; /* Class = "NSMenuItem"; title = "EEPROM 64Kb"; ObjectID = "2388"; */ "2388.title" = "EEPROM 64Kb"; /* Class = "NSMenuItem"; title = "EEPROM 512Kb"; ObjectID = "2389"; */ "2389.title" = "EEPROM 512Kb"; /* Class = "NSMenuItem"; title = "FRAM 256Kb"; ObjectID = "2390"; */ "2390.title" = "FRAM 256Kb"; /* Class = "NSMenuItem"; title = "FLASH 2Mb"; ObjectID = "2391"; */ "2391.title" = "FLASH 2Mb"; /* Class = "NSMenuItem"; title = "FLASH 4Mb"; ObjectID = "2392"; */ "2392.title" = "FLASH 4Mb"; /* Class = "NSMenuItem"; title = "FLASH 8Mb"; ObjectID = "2393"; */ "2393.title" = "FLASH 8Mb"; /* Class = "NSMenuItem"; title = "FLASH 16Mb"; ObjectID = "2394"; */ "2394.title" = "FLASH 16Mb"; /* Class = "NSMenuItem"; title = "FLASH 32Mb"; ObjectID = "2395"; */ "2395.title" = "FLASH 32Mb"; /* Class = "NSMenuItem"; title = "FLASH 64Mb"; ObjectID = "2396"; */ "2396.title" = "FLASH 64Mb"; /* Class = "NSMenuItem"; title = "FLASH 256Mb"; ObjectID = "2397"; */ "2397.title" = "FLASH 256Mb"; /* Class = "NSMenuItem"; title = "FLASH 128Mb"; ObjectID = "2398"; */ "2398.title" = "FLASH 128Mb"; /* Class = "NSMenuItem"; title = "FLASH 512Mb"; ObjectID = "2399"; */ "2399.title" = "FLASH 512Mb"; /* Class = "NSBox"; ibShadowedToolTip = "Performs no sound interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; ObjectID = "2427"; */ "2427.ibShadowedToolTip" = "Performs no sound interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; /* Class = "NSBox"; title = "SPU Sound Synchronization Method"; ObjectID = "2427"; */ "2427.title" = "SPU Sound Synchronization Method"; /* Class = "NSBox"; title = "SPU Configuration"; ObjectID = "2428"; */ "2428.title" = "SPU Configuration"; /* Class = "NSButton"; ibShadowedToolTip = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; ObjectID = "2429"; */ "2429.ibShadowedToolTip" = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; /* Class = "NSButtonCell"; title = "Advanced SPU Logic"; ObjectID = "2430"; */ "2430.title" = "Advanced SPU Logic"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "2433"; */ "2433.title" = "OtherViews"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. Recommended setting."; ObjectID = "2434"; */ "2434.ibShadowedToolTip" = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. Recommended setting."; /* Class = "NSMenuItem"; title = "\"N\" Method"; ObjectID = "2434"; */ "2434.title" = "\"N\" Method"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Pitch bends the sound depending on the emulation speed. Provides extremely smooth sound, but only when emulation speed is faster than normal. Medium latency. Low CPU usage."; ObjectID = "2435"; */ "2435.ibShadowedToolTip" = "Pitch bends the sound depending on the emulation speed. Provides extremely smooth sound, but only when emulation speed is faster than normal. Medium latency. Low CPU usage."; /* Class = "NSMenuItem"; title = "\"Z\" Method"; ObjectID = "2435"; */ "2435.title" = "\"Z\" Method"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Provides smooth sound at all emulation speeds, but with some added latency. High latency. Low CPU usage."; ObjectID = "2436"; */ "2436.ibShadowedToolTip" = "Provides smooth sound at all emulation speeds, but with some added latency. High latency. Low CPU usage."; /* Class = "NSMenuItem"; title = "\"P\" Method"; ObjectID = "2436"; */ "2436.title" = "\"P\" Method"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; ObjectID = "2438"; */ "2438.ibShadowedToolTip" = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Dual SPU Synch/Asynch"; ObjectID = "2438"; */ "2438.title" = "Dual SPU Synch/Asynch"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Enables the use of more complex sound synchronization methods."; ObjectID = "2439"; */ "2439.ibShadowedToolTip" = "Enables the use of more complex sound synchronization methods."; /* Class = "NSButtonCell"; title = "Synchronous"; ObjectID = "2439"; */ "2439.title" = "Synchronous"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "2440"; */ "2440.title" = "Radio"; /* Class = "NSMenuItem"; title = "Disable Cheats"; ObjectID = "2482"; */ "2482.title" = "Disable Cheats"; /* Class = "NSMenuItem"; title = "Show Cheat Manager..."; ObjectID = "2483"; */ "2483.title" = "Show Cheat Manager..."; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "2519"; */ "2519.title" = "Save Settings as Default"; /* Class = "NSMenuItem"; title = "Save Screenshot As..."; ObjectID = "2553"; */ "2553.title" = "Save Screenshot As..."; /* Class = "NSButton"; ibShadowedToolTip = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; ObjectID = "2565"; */ "2565.ibShadowedToolTip" = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; /* Class = "NSButtonCell"; title = "Boot From Firmware"; ObjectID = "2566"; */ "2566.title" = "Boot From Firmware"; /* Class = "NSMenuItem"; title = "Reveal Game Data Folder in Finder"; ObjectID = "2604"; */ "2604.title" = "Reveal Game Data Folder in Finder"; /* Class = "NSMenuItem"; title = "ROM Info"; ObjectID = "2609"; */ "2609.title" = "ROM Info"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2810"; */ "2810.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2812"; */ "2812.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2814"; */ "2814.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2818"; */ "2818.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2819"; */ "2819.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2820"; */ "2820.placeholderString" = "?"; /* Class = "NSWindow"; title = "ROM Save File Migration"; ObjectID = "2847"; */ "2847.title" = "ROM Save File Migration"; /* Class = "NSTextFieldCell"; title = "Migrating the ROM save file will move it to DeSmuME's game data folder. If you do not migrate the save file now, a new file will be created instead. This will be like starting the ROM for the first time."; ObjectID = "2900"; */ "2900.title" = "Migrating the ROM save file will move it to DeSmuME's game data folder. If you do not migrate the save file now, a new file will be created instead. This will be like starting the ROM for the first time."; /* Class = "NSButtonCell"; title = "Don't Migrate"; ObjectID = "2901"; */ "2901.title" = "Don't Migrate"; /* Class = "NSButtonCell"; title = "Migrate"; ObjectID = "2902"; */ "2902.title" = "Migrate"; /* Class = "NSTextFieldCell"; title = "This ROM's save file has not been created yet, but there is a save file with this ROM that has the same file name. Would you like to migrate it to work with DeSmuME?"; ObjectID = "2903"; */ "2903.title" = "This ROM's save file has not been created yet, but there is a save file with this ROM that has the same file name. Would you like to migrate it to work with DeSmuME?"; /* Class = "NSButtonCell"; title = "Do not show Game Data Migration Assistant on startup"; ObjectID = "3060"; */ "3060.title" = "Do not show Game Data Migration Assistant on startup"; /* Class = "NSButtonCell"; title = "Show Game Data Migration Assistant"; ObjectID = "3062"; */ "3062.title" = "Show Game Data Migration Assistant"; /* Class = "NSBox"; title = "User File Migration"; ObjectID = "3063"; */ "3063.title" = "User File Migration"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "3204"; */ "3204.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "3205"; */ "3205.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "3206"; */ "3206.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "3207"; */ "3207.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "3209"; */ "3209.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "3210"; */ "3210.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "3211"; */ "3211.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "3213"; */ "3213.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "3214"; */ "3214.title" = "Select All"; /* Class = "NSWindow"; title = "Save State"; ObjectID = "3456"; */ "3456.title" = "Save State"; /* Class = "NSTextFieldCell"; title = "Would you like to save the emulation state before closing?"; ObjectID = "3462"; */ "3462.title" = "Would you like to save the emulation state before closing?"; /* Class = "NSTextFieldCell"; title = "If you haven't already saved using this ROM's save, then not saving the emulation state now will cause any unsaved changes to be lost."; ObjectID = "3463"; */ "3463.title" = "If you haven't already saved using this ROM's save, then not saving the emulation state now will cause any unsaved changes to be lost."; /* Class = "NSButtonCell"; title = "Save"; ObjectID = "3464"; */ "3464.title" = "Save"; /* Class = "NSButtonCell"; title = "Don't Save"; ObjectID = "3465"; */ "3465.title" = "Don't Save"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "3472"; */ "3472.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Enable HUD"; ObjectID = "3481"; */ "3481.title" = "Enable HUD"; /* Class = "NSBox"; title = "Box"; ObjectID = "3482"; */ "3482.title" = "Box"; /* Class = "NSWindow"; title = "Cheat Manager"; ObjectID = "3488"; */ "3488.title" = "Cheat Manager"; /* Class = "NSTableColumn"; headerCell.title = "Description"; ObjectID = "3507"; */ "3507.headerCell.title" = "Description"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "3508"; */ "3508.title" = "Text Cell"; /* Class = "NSButtonCell"; title = "View Cheat Database..."; ObjectID = "3517"; */ "3517.title" = "View Cheat Database..."; /* Class = "NSMenuItem"; title = "Export ROM Save File..."; ObjectID = "3522"; */ "3522.title" = "Export ROM Save File..."; /* Class = "NSMenuItem"; title = "Import ROM Save File..."; ObjectID = "3523"; */ "3523.title" = "Import ROM Save File..."; /* Class = "NSMenuItem"; title = "HQ4x"; ObjectID = "3644"; */ "3644.title" = "HQ4x"; /* Class = "NSButtonCell"; title = "5xBRZ"; ObjectID = "3649"; */ "3649.title" = "5xBRZ"; /* Class = "NSButtonCell"; title = "4xBRZ"; ObjectID = "3650"; */ "3650.title" = "4xBRZ"; /* Class = "NSButtonCell"; title = "3xBRZ"; ObjectID = "3651"; */ "3651.title" = "3xBRZ"; /* Class = "NSButtonCell"; title = "2xBRZ"; ObjectID = "3652"; */ "3652.title" = "2xBRZ"; /* Class = "NSButtonCell"; title = "HQ4xS"; ObjectID = "3653"; */ "3653.title" = "HQ4xS"; /* Class = "NSButtonCell"; title = "HQ4x"; ObjectID = "3654"; */ "3654.title" = "HQ4x"; /* Class = "NSButtonCell"; title = "HQ2xS"; ObjectID = "3655"; */ "3655.title" = "HQ2xS"; /* Class = "NSButtonCell"; title = "HQ2x"; ObjectID = "3656"; */ "3656.title" = "HQ2x"; /* Class = "NSButtonCell"; title = "LQ2xS"; ObjectID = "3657"; */ "3657.title" = "LQ2xS"; /* Class = "NSButtonCell"; title = "LQ2x"; ObjectID = "3658"; */ "3658.title" = "LQ2x"; /* Class = "NSButtonCell"; title = "Super 2xSaI"; ObjectID = "3659"; */ "3659.title" = "Super 2xSaI"; /* Class = "NSButtonCell"; title = "2xSaI"; ObjectID = "3660"; */ "3660.title" = "2xSaI"; /* Class = "NSButtonCell"; title = "Super Eagle"; ObjectID = "3661"; */ "3661.title" = "Super Eagle"; /* Class = "NSButtonCell"; title = "EPX+"; ObjectID = "3662"; */ "3662.title" = "EPX+"; /* Class = "NSButtonCell"; title = "EPX"; ObjectID = "3663"; */ "3663.title" = "EPX"; /* Class = "NSButtonCell"; title = "Scanline"; ObjectID = "3664"; */ "3664.title" = "Scanline"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3665"; */ "3665.title" = "Radio"; /* Class = "NSButtonCell"; title = "Nearest 2x"; ObjectID = "3666"; */ "3666.title" = "Nearest 2x"; /* Class = "NSButtonCell"; title = "None"; ObjectID = "3667"; */ "3667.title" = "None"; /* Class = "NSMenuItem"; title = "Show Sound Settings..."; ObjectID = "3709"; */ "3709.title" = "Show Sound Settings..."; /* Class = "NSWindow"; title = "Sound Settings"; ObjectID = "3712"; */ "3712.title" = "Sound Settings"; /* Class = "NSButton"; ibShadowedToolTip = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; ObjectID = "3714"; */ "3714.ibShadowedToolTip" = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; /* Class = "NSButtonCell"; title = "Advanced SPU Logic"; ObjectID = "3715"; */ "3715.title" = "Advanced SPU Logic"; /* Class = "NSBox"; title = "SPU Interpolation Method"; ObjectID = "3716"; */ "3716.title" = "SPU Interpolation Method"; /* Class = "NSBox"; title = "SPU Sound Synchronization Method"; ObjectID = "3717"; */ "3717.title" = "SPU Sound Synchronization Method"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; ObjectID = "3719"; */ "3719.ibShadowedToolTip" = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "3719"; */ "3719.title" = "None"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; ObjectID = "3720"; */ "3720.ibShadowedToolTip" = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Linear"; ObjectID = "3720"; */ "3720.title" = "Linear"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3721"; */ "3721.title" = "Radio"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; ObjectID = "3723"; */ "3723.ibShadowedToolTip" = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Dual SPU Synch/Asynch"; ObjectID = "3723"; */ "3723.title" = "Dual SPU Synch/Asynch"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Enables the use of more complex sound synchronization methods."; ObjectID = "3724"; */ "3724.ibShadowedToolTip" = "Enables the use of more complex sound synchronization methods."; /* Class = "NSButtonCell"; title = "Synchronous"; ObjectID = "3724"; */ "3724.title" = "Synchronous"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3725"; */ "3725.title" = "Radio"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; ObjectID = "3732"; */ "3732.ibShadowedToolTip" = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "Cosine"; ObjectID = "3732"; */ "3732.title" = "Cosine"; /* Class = "NSBox"; title = "SPU Configuration"; ObjectID = "3733"; */ "3733.title" = "SPU Configuration"; /* Class = "NSSlider"; ibShadowedToolTip = "Sets the current sound volume."; ObjectID = "3736"; */ "3736.ibShadowedToolTip" = "Sets the current sound volume."; /* Class = "NSTextFieldCell"; placeholderString = "%1.1f%%"; ObjectID = "3740"; */ "3740.placeholderString" = "%1.1f%%"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "3747"; */ "3747.title" = "General Settings"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "3749"; */ "3749.title" = "Save Settings as Default"; /* Class = "NSMenuItem"; title = "Disable Auto Frame Skip"; ObjectID = "3751"; */ "3751.title" = "Disable Auto Frame Skip"; /* Class = "NSButton"; ibShadowedToolTip = "When set, SoftRasterizer will produce smoother color transitions than a standard NDS. No CPU usage."; ObjectID = "3771"; */ "3771.ibShadowedToolTip" = "When set, SoftRasterizer will produce smoother color transitions than a standard NDS. No CPU usage."; /* Class = "NSButtonCell"; title = "High-Precision Color Interpolation"; ObjectID = "3772"; */ "3772.title" = "High-Precision Color Interpolation"; /* Class = "NSButton"; ibShadowedToolTip = "When set, SoftRasterizer will emulate the NDS toon edge marking. Very low CPU usage."; ObjectID = "3773"; */ "3773.ibShadowedToolTip" = "When set, SoftRasterizer will emulate the NDS toon edge marking. Very low CPU usage."; /* Class = "NSButtonCell"; title = "Enable Edge Marking"; ObjectID = "3774"; */ "3774.title" = "Enable Edge Marking"; /* Class = "NSButton"; ibShadowedToolTip = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; ObjectID = "3775"; */ "3775.ibShadowedToolTip" = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; /* Class = "NSButtonCell"; title = "Enable Fog"; ObjectID = "3776"; */ "3776.title" = "Enable Fog"; /* Class = "NSButton"; ibShadowedToolTip = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; ObjectID = "3777"; */ "3777.ibShadowedToolTip" = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; /* Class = "NSButtonCell"; title = "Enable Textures"; ObjectID = "3778"; */ "3778.title" = "Enable Textures"; /* Class = "NSTextField"; ibShadowedToolTip = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; ObjectID = "3779"; */ "3779.ibShadowedToolTip" = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; /* Class = "NSTextFieldCell"; title = "0"; ObjectID = "3780"; */ "3780.title" = "0"; /* Class = "NSTextFieldCell"; title = "Depth Comparison Threshold:"; ObjectID = "3783"; */ "3783.title" = "Depth Comparison Threshold:"; /* Class = "NSBox"; title = "Pixel Scaler"; ObjectID = "3784"; */ "3784.title" = "Pixel Scaler"; /* Class = "NSBox"; title = "SoftRasterizer Options"; ObjectID = "3786"; */ "3786.title" = "SoftRasterizer Options"; /* Class = "NSTabViewItem"; label = "3D Rendering"; ObjectID = "3787"; */ "3787.label" = "3D Rendering"; /* Class = "NSMenuItem"; title = "Show 3D Rendering Settings..."; ObjectID = "3789"; */ "3789.title" = "Show 3D Rendering Settings..."; /* Class = "NSWindow"; title = "3D Rendering Settings"; ObjectID = "3790"; */ "3790.title" = "3D Rendering Settings"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "3794"; */ "3794.title" = "Save Settings as Default"; /* Class = "NSBox"; title = "SoftRasterizer Options"; ObjectID = "3798"; */ "3798.title" = "SoftRasterizer Options"; /* Class = "NSTextField"; ibShadowedToolTip = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; ObjectID = "3800"; */ "3800.ibShadowedToolTip" = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; /* Class = "NSButton"; ibShadowedToolTip = "When set, SoftRasterizer will produce smoother color transitions than a standard NDS. No CPU usage."; ObjectID = "3801"; */ "3801.ibShadowedToolTip" = "When set, SoftRasterizer will produce smoother color transitions than a standard NDS. No CPU usage."; /* Class = "NSButton"; ibShadowedToolTip = "When set, SoftRasterizer will emulate the NDS toon edge marking. Very low CPU usage."; ObjectID = "3802"; */ "3802.ibShadowedToolTip" = "When set, SoftRasterizer will emulate the NDS toon edge marking. Very low CPU usage."; /* Class = "NSButton"; ibShadowedToolTip = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; ObjectID = "3803"; */ "3803.ibShadowedToolTip" = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; /* Class = "NSButton"; ibShadowedToolTip = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; ObjectID = "3804"; */ "3804.ibShadowedToolTip" = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; /* Class = "NSButtonCell"; title = "Enable Textures"; ObjectID = "3805"; */ "3805.title" = "Enable Textures"; /* Class = "NSButtonCell"; title = "Enable Fog"; ObjectID = "3806"; */ "3806.title" = "Enable Fog"; /* Class = "NSButtonCell"; title = "Enable Edge Marking"; ObjectID = "3807"; */ "3807.title" = "Enable Edge Marking"; /* Class = "NSButtonCell"; title = "High-Precision Color Interpolation"; ObjectID = "3808"; */ "3808.title" = "High-Precision Color Interpolation"; /* Class = "NSTextFieldCell"; title = "Depth Comparison Threshold:"; ObjectID = "3811"; */ "3811.title" = "Depth Comparison Threshold:"; /* Class = "NSBox"; title = "3D Rendering Engine"; ObjectID = "3837"; */ "3837.title" = "3D Rendering Engine"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Disables 3D rendering. No CPU usage."; ObjectID = "3839"; */ "3839.ibShadowedToolTip" = "Disables 3D rendering. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "3839"; */ "3839.title" = "None"; /* Class = "NSButtonCell"; ibShadowedToolTip = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; ObjectID = "3840"; */ "3840.ibShadowedToolTip" = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "SoftRasterizer"; ObjectID = "3840"; */ "3840.title" = "SoftRasterizer"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3841"; */ "3841.title" = "Radio"; /* Class = "NSPopUpButton"; ibShadowedToolTip = "Sets the default 3D rendering engine for rendering the NDS 3D layer."; ObjectID = "3843"; */ "3843.ibShadowedToolTip" = "Sets the default 3D rendering engine for rendering the NDS 3D layer."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "3845"; */ "3845.title" = "OtherViews"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Disables 3D rendering. No CPU usage."; ObjectID = "3846"; */ "3846.ibShadowedToolTip" = "Disables 3D rendering. No CPU usage."; /* Class = "NSMenuItem"; title = "None"; ObjectID = "3846"; */ "3846.title" = "None"; /* Class = "NSMenuItem"; ibShadowedToolTip = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; ObjectID = "3847"; */ "3847.ibShadowedToolTip" = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; /* Class = "NSMenuItem"; title = "SoftRasterizer"; ObjectID = "3847"; */ "3847.title" = "SoftRasterizer"; /* Class = "NSTextFieldCell"; title = "3D Rendering Engine:"; ObjectID = "3850"; */ "3850.title" = "3D Rendering Engine:"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "3885"; */ "3885.title" = "General Settings"; /* Class = "NSButton"; ibShadowedToolTip = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; ObjectID = "3886"; */ "3886.ibShadowedToolTip" = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; /* Class = "NSButtonCell"; title = "Enable Line Hack"; ObjectID = "3887"; */ "3887.title" = "Enable Line Hack"; /* Class = "NSPopUpButton"; ibShadowedToolTip = "Sets the default number of processing threads that DeSmuME will use for 3D rendering. This is an option for advanced users. For most cases, it's best to keep this set to Automatic."; ObjectID = "3888"; */ "3888.ibShadowedToolTip" = "Sets the default number of processing threads that DeSmuME will use for 3D rendering. This is an option for advanced users. For most cases, it's best to keep this set to Automatic."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "3890"; */ "3890.title" = "OtherViews"; /* Class = "NSMenuItem"; ibShadowedToolTip = "DeSmuME automatically chooses the best number of rendering threads based on your hardware."; ObjectID = "3891"; */ "3891.ibShadowedToolTip" = "DeSmuME automatically chooses the best number of rendering threads based on your hardware."; /* Class = "NSMenuItem"; title = "Automatic"; ObjectID = "3891"; */ "3891.title" = "Automatic"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Renders 3D on the same thread as the core emulation thread by default. Best performance option for single processor machines."; ObjectID = "3892"; */ "3892.ibShadowedToolTip" = "Renders 3D on the same thread as the core emulation thread by default. Best performance option for single processor machines."; /* Class = "NSMenuItem"; title = "Single-Threaded"; ObjectID = "3892"; */ "3892.title" = "Single-Threaded"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Renders 3D on two separate threads by default. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines."; ObjectID = "3893"; */ "3893.ibShadowedToolTip" = "Renders 3D on two separate threads by default. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "2 Threads"; ObjectID = "3893"; */ "3893.title" = "2 Threads"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Renders 3D on four separate threads by default. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines."; ObjectID = "3894"; */ "3894.ibShadowedToolTip" = "Renders 3D on four separate threads by default. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "4 Threads"; ObjectID = "3894"; */ "3894.title" = "4 Threads"; /* Class = "NSTextFieldCell"; title = "Rendering Threads:"; ObjectID = "3897"; */ "3897.title" = "Rendering Threads:"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "3899"; */ "3899.title" = "General Settings"; /* Class = "NSButton"; ibShadowedToolTip = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; ObjectID = "3900"; */ "3900.ibShadowedToolTip" = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; /* Class = "NSButtonCell"; title = "Enable Line Hack"; ObjectID = "3901"; */ "3901.title" = "Enable Line Hack"; /* Class = "NSMenuItem"; title = "Display Mode"; ObjectID = "3935"; */ "3935.title" = "Display Mode"; /* Class = "NSMenu"; title = "Display Mode"; ObjectID = "3936"; */ "3936.title" = "Display Mode"; /* Class = "NSMenuItem"; title = "Main"; ObjectID = "3937"; */ "3937.title" = "Main"; /* Class = "NSMenuItem"; title = "Touch"; ObjectID = "3938"; */ "3938.title" = "Touch"; /* Class = "NSMenuItem"; title = "Dual Screen"; ObjectID = "3939"; */ "3939.title" = "Dual Screen"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. Recommended setting."; ObjectID = "3966"; */ "3966.ibShadowedToolTip" = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "\"N\" Method"; ObjectID = "3966"; */ "3966.title" = "\"N\" Method"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Pitch bends the sound depending on the emulation speed. Provides extremely smooth sound, but only when emulation speed is faster than normal. Medium latency. Low CPU usage."; ObjectID = "3967"; */ "3967.ibShadowedToolTip" = "Pitch bends the sound depending on the emulation speed. Provides extremely smooth sound, but only when emulation speed is faster than normal. Medium latency. Low CPU usage."; /* Class = "NSButtonCell"; title = "\"Z\" Method"; ObjectID = "3967"; */ "3967.title" = "\"Z\" Method"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3968"; */ "3968.title" = "Radio"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Provides smooth sound at all emulation speeds, but with some added latency. High latency. Low CPU usage."; ObjectID = "3969"; */ "3969.ibShadowedToolTip" = "Provides smooth sound at all emulation speeds, but with some added latency. High latency. Low CPU usage."; /* Class = "NSButtonCell"; title = "\"P\" Method"; ObjectID = "3969"; */ "3969.title" = "\"P\" Method"; /* Class = "NSTextFieldCell"; title = "Audio Output Engine: "; ObjectID = "3993"; */ "3993.title" = "Audio Output Engine: "; /* Class = "NSPopUpButton"; ibShadowedToolTip = "Sets the default audio output engine."; ObjectID = "3994"; */ "3994.ibShadowedToolTip" = "Sets the default audio output engine."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "3996"; */ "3996.title" = "OtherViews"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Disables audio output. No CPU usage."; ObjectID = "3997"; */ "3997.ibShadowedToolTip" = "Disables audio output. No CPU usage."; /* Class = "NSMenuItem"; title = "None"; ObjectID = "3997"; */ "3997.title" = "None"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Native audio output engine for Mac OS X. Low CPU usage."; ObjectID = "3998"; */ "3998.ibShadowedToolTip" = "Native audio output engine for Mac OS X. Low CPU usage."; /* Class = "NSMenuItem"; title = "OS X Core Audio"; ObjectID = "3998"; */ "3998.title" = "OS X Core Audio"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Disables audio output. No CPU usage."; ObjectID = "4002"; */ "4002.ibShadowedToolTip" = "Disables audio output. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "4002"; */ "4002.title" = "None"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Native audio output engine for Mac OS X. Low CPU usage."; ObjectID = "4003"; */ "4003.ibShadowedToolTip" = "Native audio output engine for Mac OS X. Low CPU usage."; /* Class = "NSButtonCell"; title = "OS X Core Audio"; ObjectID = "4003"; */ "4003.title" = "OS X Core Audio"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "4004"; */ "4004.title" = "Radio"; /* Class = "NSBox"; title = "Audio Output Engine"; ObjectID = "4024"; */ "4024.title" = "Audio Output Engine"; /* Class = "NSWindow"; title = "Emulation Settings"; ObjectID = "4027"; */ "4027.title" = "Emulation Settings"; /* Class = "NSBox"; title = "Emulation Timing"; ObjectID = "4029"; */ "4029.title" = "Emulation Timing"; /* Class = "NSButton"; ibShadowedToolTip = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; ObjectID = "4030"; */ "4030.ibShadowedToolTip" = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; /* Class = "NSButtonCell"; title = "Advanced Bus-Level Timing"; ObjectID = "4031"; */ "4031.title" = "Advanced Bus-Level Timing"; /* Class = "NSBox"; title = "BIOS Configuration"; ObjectID = "4032"; */ "4032.title" = "BIOS Configuration"; /* Class = "NSButton"; ibShadowedToolTip = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; ObjectID = "4033"; */ "4033.ibShadowedToolTip" = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; /* Class = "NSButtonCell"; title = "Use External BIOS Images"; ObjectID = "4034"; */ "4034.title" = "Use External BIOS Images"; /* Class = "NSButton"; ibShadowedToolTip = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May incur CPU usage, depending on if the ROM uses the ARM SWIs."; ObjectID = "4035"; */ "4035.ibShadowedToolTip" = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May incur CPU usage, depending on if the ROM uses the ARM SWIs."; /* Class = "NSButtonCell"; title = "Emulate BIOS SWIs"; ObjectID = "4036"; */ "4036.title" = "Emulate BIOS SWIs"; /* Class = "NSButton"; ibShadowedToolTip = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; ObjectID = "4037"; */ "4037.ibShadowedToolTip" = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; /* Class = "NSButtonCell"; title = "Patch DelayLoop SWI"; ObjectID = "4038"; */ "4038.title" = "Patch DelayLoop SWI"; /* Class = "NSBox"; title = "Firmware Configuration"; ObjectID = "4039"; */ "4039.title" = "Firmware Configuration"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "4041"; */ "4041.title" = "Save Settings as Default"; /* Class = "NSButton"; ibShadowedToolTip = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; ObjectID = "4043"; */ "4043.ibShadowedToolTip" = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; /* Class = "NSButtonCell"; title = "Use External Firmware Image"; ObjectID = "4044"; */ "4044.title" = "Use External Firmware Image"; /* Class = "NSButton"; ibShadowedToolTip = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; ObjectID = "4045"; */ "4045.ibShadowedToolTip" = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; /* Class = "NSButtonCell"; title = "Boot From Firmware"; ObjectID = "4046"; */ "4046.title" = "Boot From Firmware"; /* Class = "NSBox"; title = "Debugger Configuration"; ObjectID = "4047"; */ "4047.title" = "Debugger Configuration"; /* Class = "NSButton"; ibShadowedToolTip = "For developer usage only."; ObjectID = "4048"; */ "4048.ibShadowedToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Use Debug Console"; ObjectID = "4049"; */ "4049.title" = "Use Debug Console"; /* Class = "NSButton"; ibShadowedToolTip = "For developer usage only."; ObjectID = "4050"; */ "4050.ibShadowedToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Emulate Ensata"; ObjectID = "4051"; */ "4051.title" = "Emulate Ensata"; /* Class = "NSMenuItem"; title = "Show Emulation Settings..."; ObjectID = "4062"; */ "4062.title" = "Show Emulation Settings..."; /* Class = "NSTextFieldCell"; title = "Configure Internal Firmware:"; ObjectID = "4067"; */ "4067.title" = "Configure Internal Firmware:"; /* Class = "NSTextField"; ibShadowedToolTip = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; ObjectID = "4069"; */ "4069.ibShadowedToolTip" = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; /* Class = "NSTextField"; ibShadowedToolTip = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; ObjectID = "4070"; */ "4070.ibShadowedToolTip" = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4082"; */ "4082.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Turquoise"; ObjectID = "4083"; */ "4083.title" = "Turquoise"; /* Class = "NSMenuItem"; title = "Blue"; ObjectID = "4084"; */ "4084.title" = "Blue"; /* Class = "NSMenuItem"; title = "Sea Green"; ObjectID = "4085"; */ "4085.title" = "Sea Green"; /* Class = "NSMenuItem"; title = "Dark Purple"; ObjectID = "4086"; */ "4086.title" = "Dark Purple"; /* Class = "NSMenuItem"; title = "Dark Green"; ObjectID = "4087"; */ "4087.title" = "Dark Green"; /* Class = "NSMenuItem"; title = "Violet"; ObjectID = "4088"; */ "4088.title" = "Violet"; /* Class = "NSMenuItem"; title = "Magenta"; ObjectID = "4089"; */ "4089.title" = "Magenta"; /* Class = "NSMenuItem"; title = "Green"; ObjectID = "4090"; */ "4090.title" = "Green"; /* Class = "NSMenuItem"; title = "Dark Blue"; ObjectID = "4091"; */ "4091.title" = "Dark Blue"; /* Class = "NSMenuItem"; title = "Lime Green"; ObjectID = "4092"; */ "4092.title" = "Lime Green"; /* Class = "NSMenuItem"; title = "Yellow"; ObjectID = "4093"; */ "4093.title" = "Yellow"; /* Class = "NSMenuItem"; title = "Orange"; ObjectID = "4094"; */ "4094.title" = "Orange"; /* Class = "NSMenuItem"; title = "Red"; ObjectID = "4095"; */ "4095.title" = "Red"; /* Class = "NSMenuItem"; title = "Pink"; ObjectID = "4096"; */ "4096.title" = "Pink"; /* Class = "NSMenuItem"; title = "Brown"; ObjectID = "4097"; */ "4097.title" = "Brown"; /* Class = "NSMenuItem"; title = "Gray"; ObjectID = "4098"; */ "4098.title" = "Gray"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4100"; */ "4100.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Italian"; ObjectID = "4101"; */ "4101.title" = "Italian"; /* Class = "NSMenuItem"; title = "Spanish"; ObjectID = "4102"; */ "4102.title" = "Spanish"; /* Class = "NSMenuItem"; title = "German"; ObjectID = "4103"; */ "4103.title" = "German"; /* Class = "NSMenuItem"; title = "French"; ObjectID = "4104"; */ "4104.title" = "French"; /* Class = "NSMenuItem"; title = "English"; ObjectID = "4105"; */ "4105.title" = "English"; /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "4106"; */ "4106.title" = "Japanese"; /* Class = "NSTextFieldCell"; title = "Note: To use this configuration, click Apply, and then reset the emulator. Also, these settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; ObjectID = "4107"; */ "4107.title" = "Note: To use this configuration, click Apply, and then reset the emulator. Also, these settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; /* Class = "NSTextFieldCell"; title = "Language:"; ObjectID = "4110"; */ "4110.title" = "Language:"; /* Class = "NSTextFieldCell"; title = "Birthday:"; ObjectID = "4111"; */ "4111.title" = "Birthday:"; /* Class = "NSTextFieldCell"; title = "Favorite Color:"; ObjectID = "4112"; */ "4112.title" = "Favorite Color:"; /* Class = "NSTextFieldCell"; title = "Message:"; ObjectID = "4113"; */ "4113.title" = "Message:"; /* Class = "NSTextFieldCell"; title = "Nickname:"; ObjectID = "4114"; */ "4114.title" = "Nickname:"; /* Class = "NSTextFieldCell"; placeholderString = "Enter a message..."; ObjectID = "4115"; */ "4115.placeholderString" = "Enter a message..."; /* Class = "NSTextFieldCell"; placeholderString = "Enter a nickname..."; ObjectID = "4116"; */ "4116.placeholderString" = "Enter a nickname..."; /* Class = "NSButtonCell"; title = "Apply"; ObjectID = "4180"; */ "4180.title" = "Apply"; /* Class = "NSWindow"; title = "Internal Firmware Preferences"; ObjectID = "4181"; */ "4181.title" = "Internal Firmware Preferences"; /* Class = "NSTextField"; ibShadowedToolTip = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; ObjectID = "4191"; */ "4191.ibShadowedToolTip" = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; /* Class = "NSTextField"; ibShadowedToolTip = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; ObjectID = "4192"; */ "4192.ibShadowedToolTip" = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4202"; */ "4202.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Gray"; ObjectID = "4203"; */ "4203.title" = "Gray"; /* Class = "NSMenuItem"; title = "Brown"; ObjectID = "4204"; */ "4204.title" = "Brown"; /* Class = "NSMenuItem"; title = "Pink"; ObjectID = "4205"; */ "4205.title" = "Pink"; /* Class = "NSMenuItem"; title = "Red"; ObjectID = "4206"; */ "4206.title" = "Red"; /* Class = "NSMenuItem"; title = "Orange"; ObjectID = "4207"; */ "4207.title" = "Orange"; /* Class = "NSMenuItem"; title = "Yellow"; ObjectID = "4208"; */ "4208.title" = "Yellow"; /* Class = "NSMenuItem"; title = "Lime Green"; ObjectID = "4209"; */ "4209.title" = "Lime Green"; /* Class = "NSMenuItem"; title = "Dark Blue"; ObjectID = "4210"; */ "4210.title" = "Dark Blue"; /* Class = "NSMenuItem"; title = "Green"; ObjectID = "4211"; */ "4211.title" = "Green"; /* Class = "NSMenuItem"; title = "Magenta"; ObjectID = "4212"; */ "4212.title" = "Magenta"; /* Class = "NSMenuItem"; title = "Violet"; ObjectID = "4213"; */ "4213.title" = "Violet"; /* Class = "NSMenuItem"; title = "Dark Green"; ObjectID = "4214"; */ "4214.title" = "Dark Green"; /* Class = "NSMenuItem"; title = "Dark Purple"; ObjectID = "4215"; */ "4215.title" = "Dark Purple"; /* Class = "NSMenuItem"; title = "Sea Green"; ObjectID = "4216"; */ "4216.title" = "Sea Green"; /* Class = "NSMenuItem"; title = "Blue"; ObjectID = "4217"; */ "4217.title" = "Blue"; /* Class = "NSMenuItem"; title = "Turquoise"; ObjectID = "4218"; */ "4218.title" = "Turquoise"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4220"; */ "4220.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "4221"; */ "4221.title" = "Japanese"; /* Class = "NSMenuItem"; title = "English"; ObjectID = "4222"; */ "4222.title" = "English"; /* Class = "NSMenuItem"; title = "French"; ObjectID = "4223"; */ "4223.title" = "French"; /* Class = "NSMenuItem"; title = "German"; ObjectID = "4224"; */ "4224.title" = "German"; /* Class = "NSMenuItem"; title = "Spanish"; ObjectID = "4225"; */ "4225.title" = "Spanish"; /* Class = "NSMenuItem"; title = "Italian"; ObjectID = "4226"; */ "4226.title" = "Italian"; /* Class = "NSTextFieldCell"; title = "Language:"; ObjectID = "4228"; */ "4228.title" = "Language:"; /* Class = "NSTextFieldCell"; title = "Birthday:"; ObjectID = "4229"; */ "4229.title" = "Birthday:"; /* Class = "NSTextFieldCell"; title = "Favorite Color:"; ObjectID = "4230"; */ "4230.title" = "Favorite Color:"; /* Class = "NSTextFieldCell"; title = "Message:"; ObjectID = "4231"; */ "4231.title" = "Message:"; /* Class = "NSTextFieldCell"; title = "Nickname:"; ObjectID = "4232"; */ "4232.title" = "Nickname:"; /* Class = "NSTextFieldCell"; placeholderString = "Enter a message..."; ObjectID = "4233"; */ "4233.placeholderString" = "Enter a message..."; /* Class = "NSTextFieldCell"; placeholderString = "Enter a nickname..."; ObjectID = "4234"; */ "4234.placeholderString" = "Enter a nickname..."; /* Class = "NSTextFieldCell"; title = "Note: These settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; ObjectID = "4241"; */ "4241.title" = "Note: These settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; /* Class = "NSButtonCell"; title = "Configure Internal Firmware..."; ObjectID = "4276"; */ "4276.title" = "Configure Internal Firmware..."; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "4278"; */ "4278.title" = "OK"; /* Class = "NSBox"; title = "Cheat Settings"; ObjectID = "4565"; */ "4565.title" = "Cheat Settings"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4576"; */ "4576.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Internal Cheat"; ObjectID = "4577"; */ "4577.title" = "Internal Cheat"; /* Class = "NSMenuItem"; title = "Action Replay"; ObjectID = "4578"; */ "4578.title" = "Action Replay"; /* Class = "NSButtonCell"; title = "Enable this cheat"; ObjectID = "4582"; */ "4582.title" = "Enable this cheat"; /* Class = "NSButtonCell"; title = "Enable Cheats"; ObjectID = "4584"; */ "4584.title" = "Enable Cheats"; /* Class = "NSBox"; title = "Select Memory Size"; ObjectID = "4586"; */ "4586.title" = "Select Memory Size"; /* Class = "NSTextField"; ibShadowedToolTip = "All addresses start with 0x02. Enter the last 6 digits of the address here in hexadecimal format."; ObjectID = "4588"; */ "4588.ibShadowedToolTip" = "All addresses start with 0x02. Enter the last 6 digits of the address here in hexadecimal format."; /* Class = "NSTextField"; ibShadowedToolTip = "Enter the numeric value to write to the target address."; ObjectID = "4590"; */ "4590.ibShadowedToolTip" = "Enter the numeric value to write to the target address."; /* Class = "NSTextFieldCell"; title = "0x02"; ObjectID = "4594"; */ "4594.title" = "0x02"; /* Class = "NSTextFieldCell"; title = "Value:"; ObjectID = "4598"; */ "4598.title" = "Value:"; /* Class = "NSTextFieldCell"; title = "Address:"; ObjectID = "4600"; */ "4600.title" = "Address:"; /* Class = "NSMatrix"; ibShadowedToolTip = "Select the memory size of the target address in bytes."; ObjectID = "4601"; */ "4601.ibShadowedToolTip" = "Select the memory size of the target address in bytes."; /* Class = "NSButtonCell"; title = "3 Bytes [0 - 16777215]"; ObjectID = "4602"; */ "4602.title" = "3 Bytes [0 - 16777215]"; /* Class = "NSButtonCell"; title = "4 Bytes [0 - 4294967295]"; ObjectID = "4603"; */ "4603.title" = "4 Bytes [0 - 4294967295]"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "4604"; */ "4604.title" = "Radio"; /* Class = "NSButtonCell"; title = "2 Bytes [0 - 65536]"; ObjectID = "4605"; */ "4605.title" = "2 Bytes [0 - 65536]"; /* Class = "NSButtonCell"; title = "1 Byte [0 - 255]"; ObjectID = "4606"; */ "4606.title" = "1 Byte [0 - 255]"; /* Class = "NSTableColumn"; headerCell.title = "Type"; ObjectID = "4607"; */ "4607.headerCell.title" = "Type"; /* Class = "NSTextFieldCell"; title = "Action Replay Code:"; ObjectID = "4637"; */ "4637.title" = "Action Replay Code:"; /* Class = "NSTextFieldCell"; title = "Type:"; ObjectID = "4640"; */ "4640.title" = "Type:"; /* Class = "NSBox"; title = "Box"; ObjectID = "4647"; */ "4647.title" = "Box"; /* Class = "NSTextFieldCell"; title = "Description:"; ObjectID = "4662"; */ "4662.title" = "Description:"; /* Class = "NSButtonCell"; title = "Apply"; ObjectID = "4665"; */ "4665.title" = "Apply"; /* Class = "NSTextFieldCell"; title = "Code Breaker cheats have not been implemented in this version of DeSmuME."; ObjectID = "4694"; */ "4694.title" = "Code Breaker cheats have not been implemented in this version of DeSmuME."; /* Class = "NSTableColumn"; headerCell.title = "Address"; ObjectID = "4799"; */ "4799.headerCell.title" = "Address"; /* Class = "NSTableColumn"; headerCell.title = "Value"; ObjectID = "4800"; */ "4800.headerCell.title" = "Value"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "4801"; */ "4801.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "4802"; */ "4802.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Found: "; ObjectID = "4810"; */ "4810.title" = "Found: "; /* Class = "NSTextFieldCell"; placeholderString = "Search not started."; ObjectID = "4812"; */ "4812.placeholderString" = "Search not started."; /* Class = "NSButton"; ibShadowedToolTip = "Shows/hides the address search drawer."; ObjectID = "4814"; */ "4814.ibShadowedToolTip" = "Shows/hides the address search drawer."; /* Class = "NSTextFieldCell"; title = "Search for Address:"; ObjectID = "4818"; */ "4818.title" = "Search for Address:"; /* Class = "NSButton"; ibShadowedToolTip = "Resets the memory address search."; ObjectID = "4822"; */ "4822.ibShadowedToolTip" = "Resets the memory address search."; /* Class = "NSButtonCell"; title = "Reset"; ObjectID = "4823"; */ "4823.title" = "Reset"; /* Class = "NSTextFieldCell"; title = "Click the appropriate button based on how the target value is changing."; ObjectID = "4864"; */ "4864.title" = "Click the appropriate button based on how the target value is changing."; /* Class = "NSTextFieldCell"; title = "How is the value changing?"; ObjectID = "4865"; */ "4865.title" = "How is the value changing?"; /* Class = "NSButtonCell"; title = "Value is now lower"; ObjectID = "4866"; */ "4866.title" = "Value is now lower"; /* Class = "NSButtonCell"; title = "Value is now higher"; ObjectID = "4867"; */ "4867.title" = "Value is now higher"; /* Class = "NSButtonCell"; title = "Value did change"; ObjectID = "4868"; */ "4868.title" = "Value did change"; /* Class = "NSButtonCell"; title = "Value is unchanged"; ObjectID = "4869"; */ "4869.title" = "Value is unchanged"; /* Class = "NSTextFieldCell"; title = "Enter a search value, and then click Search."; ObjectID = "4873"; */ "4873.title" = "Enter a search value, and then click Search."; /* Class = "NSTextFieldCell"; title = "Search for an exact value."; ObjectID = "4874"; */ "4874.title" = "Search for an exact value."; /* Class = "NSButtonCell"; title = "Search"; ObjectID = "4878"; */ "4878.title" = "Search"; /* Class = "NSSearchFieldCell"; placeholderString = "Search value"; ObjectID = "4879"; */ "4879.placeholderString" = "Search value"; /* Class = "NSTextFieldCell"; title = "Start a comparative search."; ObjectID = "4890"; */ "4890.title" = "Start a comparative search."; /* Class = "NSTextFieldCell"; title = "Click Start Search to begin a comparative search."; ObjectID = "4891"; */ "4891.title" = "Click Start Search to begin a comparative search."; /* Class = "NSButtonCell"; title = "Start Search"; ObjectID = "4892"; */ "4892.title" = "Start Search"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4902"; */ "4902.title" = "OtherViews"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Searches the NDS memory for all addresses that currently carry the search value."; ObjectID = "4903"; */ "4903.ibShadowedToolTip" = "Searches the NDS memory for all addresses that currently carry the search value."; /* Class = "NSMenuItem"; title = "Exact Value"; ObjectID = "4903"; */ "4903.title" = "Exact Value"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Searches the NDS memory for any addresses which match the comparative search criteria."; ObjectID = "4904"; */ "4904.ibShadowedToolTip" = "Searches the NDS memory for any addresses which match the comparative search criteria."; /* Class = "NSMenuItem"; title = "Comparative"; ObjectID = "4904"; */ "4904.title" = "Comparative"; /* Class = "NSTextFieldCell"; title = "Search Style:"; ObjectID = "4907"; */ "4907.title" = "Search Style:"; /* Class = "NSTextFieldCell"; title = "Sign Type:"; ObjectID = "4909"; */ "4909.title" = "Sign Type:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4912"; */ "4912.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Unsigned"; ObjectID = "4913"; */ "4913.title" = "Unsigned"; /* Class = "NSMenuItem"; title = "Signed (NOT IMPLEMENTED)"; ObjectID = "4914"; */ "4914.title" = "Signed (NOT IMPLEMENTED)"; /* Class = "NSBox"; title = "Cheat Configuration"; ObjectID = "5003"; */ "5003.title" = "Cheat Configuration"; /* Class = "NSTextFieldCell"; title = "R4 Cheat Database:"; ObjectID = "5007"; */ "5007.title" = "R4 Cheat Database:"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "5008"; */ "5008.title" = "Choose..."; /* Class = "NSTextFieldCell"; placeholderString = "File Name"; ObjectID = "5009"; */ "5009.placeholderString" = "File Name"; /* Class = "NSTextFieldCell"; title = "Note: Enabling this cheat freezes the value in memory. If you only want to change a value without actually freezing it in memory, click Write Once."; ObjectID = "5067"; */ "5067.title" = "Note: Enabling this cheat freezes the value in memory. If you only want to change a value without actually freezing it in memory, click Write Once."; /* Class = "NSButton"; ibShadowedToolTip = "Immediately writes the value once to the target address."; ObjectID = "5068"; */ "5068.ibShadowedToolTip" = "Immediately writes the value once to the target address."; /* Class = "NSButtonCell"; title = "Write Once"; ObjectID = "5069"; */ "5069.title" = "Write Once"; /* Class = "NSWindow"; title = "Cheat Database"; ObjectID = "5080"; */ "5080.title" = "Cheat Database"; /* Class = "NSTableColumn"; headerCell.title = "Description"; ObjectID = "5088"; */ "5088.headerCell.title" = "Description"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "5089"; */ "5089.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "R4 Cheats Database:"; ObjectID = "5099"; */ "5099.title" = "R4 Cheats Database:"; /* Class = "NSButtonCell"; title = "Select All"; ObjectID = "5101"; */ "5101.title" = "Select All"; /* Class = "NSButtonCell"; title = "Select None"; ObjectID = "5103"; */ "5103.title" = "Select None"; /* Class = "NSButtonCell"; title = "Add"; ObjectID = "5105"; */ "5105.title" = "Add"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "5107"; */ "5107.title" = "Cancel"; /* Class = "NSTextFieldCell"; title = "Found:"; ObjectID = "5112"; */ "5112.title" = "Found:"; /* Class = "NSTextFieldCell"; title = "ROM Title:"; ObjectID = "5128"; */ "5128.title" = "ROM Title:"; /* Class = "NSTextFieldCell"; placeholderString = "Database file"; ObjectID = "5134"; */ "5134.placeholderString" = "Database file"; /* Class = "NSTextFieldCell"; placeholderString = "Count"; ObjectID = "5136"; */ "5136.placeholderString" = "Count"; /* Class = "NSTextFieldCell"; placeholderString = "ROM title"; ObjectID = "5141"; */ "5141.placeholderString" = "ROM title"; /* Class = "NSTextFieldCell"; title = "This list only shows the first 100 search results."; ObjectID = "5169"; */ "5169.title" = "This list only shows the first 100 search results."; /* Class = "NSBox"; title = "ADVANsCEne Database"; ObjectID = "5171"; */ "5171.title" = "ADVANsCEne Database"; /* Class = "NSTextFieldCell"; placeholderString = "File Name"; ObjectID = "5176"; */ "5176.placeholderString" = "File Name"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "5177"; */ "5177.title" = "Choose..."; /* Class = "NSTextFieldCell"; title = "ADVANsCEne Database:"; ObjectID = "5178"; */ "5178.title" = "ADVANsCEne Database:"; /* Class = "NSTextFieldCell"; title = "You can download the latest ADVANsCEne Database from:\nhttp://www.advanscene.com/offline/datas/ADVANsCEne_RToolDS.zip"; ObjectID = "5179"; */ "5179.title" = "You can download the latest ADVANsCEne Database from:\nhttp://www.advanscene.com/offline/datas/ADVANsCEne_RToolDS.zip"; /* Class = "NSBox"; title = "ROM Save Configuration"; ObjectID = "5186"; */ "5186.title" = "ROM Save Configuration"; /* Class = "NSButton"; ibShadowedToolTip = "Whenever DeSmuME needs to determine a ROM's save type, use the ADVANsCEne database to determine the save type before using the internal autodetect algorithm."; ObjectID = "5188"; */ "5188.ibShadowedToolTip" = "Whenever DeSmuME needs to determine a ROM's save type, use the ADVANsCEne database to determine the save type before using the internal autodetect algorithm."; /* Class = "NSButtonCell"; title = "Use ADVANsCEne Database when auto-detecting the ROM save type"; ObjectID = "5189"; */ "5189.title" = "Use ADVANsCEne Database when auto-detecting the ROM save type"; /* Class = "NSMenuItem"; title = "Close State File"; ObjectID = "5329"; */ "5329.title" = "Close State File"; /* Class = "NSMenuItem"; title = "Rotate Right"; ObjectID = "5419"; */ "5419.title" = "Rotate Right"; /* Class = "NSMenuItem"; title = "Rotate Left"; ObjectID = "5421"; */ "5421.title" = "Rotate Left"; /* Class = "NSMenuItem"; ibShadowedToolTip = "New display views will show only the main NDS screen by default."; ObjectID = "5427"; */ "5427.ibShadowedToolTip" = "New display views will show only the main NDS screen by default."; /* Class = "NSMenuItem"; title = "Main"; ObjectID = "5427"; */ "5427.title" = "Main"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "5450"; */ "5450.title" = "General Settings"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "5648"; */ "5648.title" = "Show Status Bar"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "5651"; */ "5651.title" = "About DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "App Description"; ObjectID = "5661"; */ "5661.placeholderString" = "App Description"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "5665"; */ "5665.label" = "Change Log"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "5666"; */ "5666.label" = "Authors"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "5667"; */ "5667.label" = "License"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "5668"; */ "5668.label" = "Read Me"; /* Class = "NSTextFieldCell"; placeholderString = "Build Info"; ObjectID = "5689"; */ "5689.placeholderString" = "Build Info"; /* Class = "NSMenuItem"; title = "Keep Minimum Display Size at 1x"; ObjectID = "5702"; */ "5702.title" = "Keep Minimum Display Size at 1x"; /* Class = "NSTextFieldCell"; title = "Select ROM Save Format:"; ObjectID = "5936"; */ "5936.title" = "Select ROM Save Format:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "5938"; */ "5938.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "No$GBA ROM Save (.sav)"; ObjectID = "5939"; */ "5939.title" = "No$GBA ROM Save (.sav)"; /* Class = "NSMenuItem"; title = "DeSmuME ROM Save (.dsv)"; ObjectID = "5942"; */ "5942.title" = "DeSmuME ROM Save (.dsv)"; /* Class = "NSMenuItem"; title = "Raw Save File (.sav)"; ObjectID = "5963"; */ "5963.title" = "Raw Save File (.sav)"; /* Class = "NSBox"; title = "CPU Emulation Engine"; ObjectID = "6126"; */ "6126.title" = "CPU Emulation Engine"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Sets the classic interpreter engine to emulate the ARM7 and ARM9 CPUs by default. It features very high compatibility with most configurations, as well as high accuracy with most ROMs."; ObjectID = "6128"; */ "6128.ibShadowedToolTip" = "Sets the classic interpreter engine to emulate the ARM7 and ARM9 CPUs by default. It features very high compatibility with most configurations, as well as high accuracy with most ROMs."; /* Class = "NSButtonCell"; title = "Interpreter"; ObjectID = "6128"; */ "6128.title" = "Interpreter"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Sets the dynarec engine to emulate the ARM7 and ARM9 CPUs by default. It features far superior performance to the Interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.)"; ObjectID = "6129"; */ "6129.ibShadowedToolTip" = "Sets the dynarec engine to emulate the ARM7 and ARM9 CPUs by default. It features far superior performance to the Interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.)"; /* Class = "NSButtonCell"; title = "Dynamic Recompiler"; ObjectID = "6129"; */ "6129.title" = "Dynamic Recompiler"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6130"; */ "6130.title" = "Radio"; /* Class = "NSBox"; title = "CPU Emulation Engine"; ObjectID = "6131"; */ "6131.title" = "CPU Emulation Engine"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Uses the classic interpreter engine to emulate the ARM7 and ARM9 CPUs. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; ObjectID = "6133"; */ "6133.ibShadowedToolTip" = "Uses the classic interpreter engine to emulate the ARM7 and ARM9 CPUs. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; /* Class = "NSButtonCell"; title = "Interpreter"; ObjectID = "6133"; */ "6133.title" = "Interpreter"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Uses the dynarec engine to emulate the ARM7 and ARM9 CPUs. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; ObjectID = "6134"; */ "6134.ibShadowedToolTip" = "Uses the dynarec engine to emulate the ARM7 and ARM9 CPUs. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; /* Class = "NSButtonCell"; title = "Dynamic Recompiler"; ObjectID = "6134"; */ "6134.title" = "Dynamic Recompiler"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6135"; */ "6135.title" = "Radio"; /* Class = "NSButton"; ibShadowedToolTip = "Enable to use vertical sync on the video output. This setting eliminates screen tearing, but may also reduce the video frame rate."; ObjectID = "6159"; */ "6159.ibShadowedToolTip" = "Enable to use vertical sync on the video output. This setting eliminates screen tearing, but may also reduce the video frame rate."; /* Class = "NSButtonCell"; title = "Use vertical sync"; ObjectID = "6160"; */ "6160.title" = "Use vertical sync"; /* Class = "NSButton"; ibShadowedToolTip = "Enable to use vertical sync on the video output by default. This setting eliminates screen tearing, but may also reduce the video frame rate."; ObjectID = "6161"; */ "6161.ibShadowedToolTip" = "Enable to use vertical sync on the video output by default. This setting eliminates screen tearing, but may also reduce the video frame rate."; /* Class = "NSButtonCell"; title = "Use vertical sync"; ObjectID = "6162"; */ "6162.title" = "Use vertical sync"; /* Class = "NSMenuItem"; title = "Display Orientation"; ObjectID = "6168"; */ "6168.title" = "Display Orientation"; /* Class = "NSMenu"; title = "Display Orientation"; ObjectID = "6169"; */ "6169.title" = "Display Orientation"; /* Class = "NSMenuItem"; title = "Vertical"; ObjectID = "6170"; */ "6170.title" = "Vertical"; /* Class = "NSMenuItem"; title = "Display Order"; ObjectID = "6171"; */ "6171.title" = "Display Order"; /* Class = "NSMenu"; title = "Display Order"; ObjectID = "6172"; */ "6172.title" = "Display Order"; /* Class = "NSMenuItem"; title = "Main Screen First"; ObjectID = "6173"; */ "6173.title" = "Main Screen First"; /* Class = "NSMenuItem"; title = "Horizontal"; ObjectID = "6174"; */ "6174.title" = "Horizontal"; /* Class = "NSMenuItem"; title = "Touch Screen First"; ObjectID = "6177"; */ "6177.title" = "Touch Screen First"; /* Class = "NSBox"; title = "Dual Screen Display Layout"; ObjectID = "6180"; */ "6180.title" = "Dual Screen Display Layout"; /* Class = "NSBox"; title = "Display Orientation"; ObjectID = "6182"; */ "6182.title" = "Display Orientation"; /* Class = "NSBox"; title = "Display Order"; ObjectID = "6183"; */ "6183.title" = "Display Order"; /* Class = "NSButtonCell"; ibShadowedToolTip = "If the display orientation is vertical, the main screen will be arranged above the touch screen by default. If the display layout is horizontal, the main screen will be arranged left of the touch screen by default."; ObjectID = "6185"; */ "6185.ibShadowedToolTip" = "If the display orientation is vertical, the main screen will be arranged above the touch screen by default. If the display layout is horizontal, the main screen will be arranged left of the touch screen by default."; /* Class = "NSButtonCell"; title = "Main Screen First"; ObjectID = "6185"; */ "6185.title" = "Main Screen First"; /* Class = "NSButtonCell"; ibShadowedToolTip = "If the display orientation is vertical, the touch screen will be arranged above the main screen by default. If the display layout is horizontal, the touch screen will be arranged left of the main screen by default."; ObjectID = "6186"; */ "6186.ibShadowedToolTip" = "If the display orientation is vertical, the touch screen will be arranged above the main screen by default. If the display layout is horizontal, the touch screen will be arranged left of the main screen by default."; /* Class = "NSButtonCell"; title = "Touch Screen First"; ObjectID = "6186"; */ "6186.title" = "Touch Screen First"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6187"; */ "6187.title" = "Radio"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6189"; */ "6189.title" = "Radio"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Arranges the NDS screens where one screen is to the left of the other screen by default."; ObjectID = "6190"; */ "6190.ibShadowedToolTip" = "Arranges the NDS screens where one screen is to the left of the other screen by default."; /* Class = "NSButtonCell"; title = "Horizontal"; ObjectID = "6190"; */ "6190.title" = "Horizontal"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Arranges the NDS screens where one screen is above the other screen by default."; ObjectID = "6191"; */ "6191.ibShadowedToolTip" = "Arranges the NDS screens where one screen is above the other screen by default."; /* Class = "NSButtonCell"; title = "Vertical"; ObjectID = "6191"; */ "6191.title" = "Vertical"; /* Class = "NSMenuItem"; ibShadowedToolTip = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; ObjectID = "6233"; */ "6233.ibShadowedToolTip" = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; /* Class = "NSMenuItem"; title = "OpenGL"; ObjectID = "6233"; */ "6233.title" = "OpenGL"; /* Class = "NSButtonCell"; ibShadowedToolTip = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; ObjectID = "6234"; */ "6234.ibShadowedToolTip" = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; /* Class = "NSButtonCell"; title = "OpenGL"; ObjectID = "6234"; */ "6234.title" = "OpenGL"; /* Class = "NSMenuItem"; title = "HQ4xS"; ObjectID = "6238"; */ "6238.title" = "HQ4xS"; /* Class = "NSWindow"; title = "Troubleshooting Form"; ObjectID = "6295"; */ "6295.title" = "Troubleshooting Form"; /* Class = "NSBox"; title = "Box"; ObjectID = "6361"; */ "6361.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6364"; */ "6364.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6368"; */ "6368.title" = "Box"; /* Class = "NSTextFieldCell"; title = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; ObjectID = "6374"; */ "6374.title" = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; /* Class = "NSTextFieldCell"; title = "In the field below, briefly describe your situation and what you need help with. (Please be as specific as possible! It will help us to understand your situation better.)"; ObjectID = "6376"; */ "6376.title" = "In the field below, briefly describe your situation and what you need help with. (Please be as specific as possible! It will help us to understand your situation better.)"; /* Class = "NSTextFieldCell"; title = "Tell us what you need help with."; ObjectID = "6377"; */ "6377.title" = "Tell us what you need help with."; /* Class = "NSTextFieldCell"; title = "Do you need help with using DeSmuME? If so, it never hurts to ask! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your issue quicker and easier."; ObjectID = "6378"; */ "6378.title" = "Do you need help with using DeSmuME? If so, it never hurts to ask! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your issue quicker and easier."; /* Class = "NSTextFieldCell"; title = "DeSmuME Technical Support Request Form"; ObjectID = "6379"; */ "6379.title" = "DeSmuME Technical Support Request Form"; /* Class = "NSTextFieldCell"; title = "Tell us about the ROM."; ObjectID = "6380"; */ "6380.title" = "Tell us about the ROM."; /* Class = "NSTextFieldCell"; title = "If your issue is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; ObjectID = "6381"; */ "6381.title" = "If your issue is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; /* Class = "NSTextFieldCell"; title = "ROM Serial:"; ObjectID = "6382"; */ "6382.title" = "ROM Serial:"; /* Class = "NSTextFieldCell"; title = "ROM Name:"; ObjectID = "6383"; */ "6383.title" = "ROM Name:"; /* Class = "NSButtonCell"; title = "Use Currently Loaded ROM"; ObjectID = "6386"; */ "6386.title" = "Use Currently Loaded ROM"; /* Class = "NSButtonCell"; title = "Continue"; ObjectID = "6387"; */ "6387.title" = "Continue"; /* Class = "NSBox"; title = "Box"; ObjectID = "6397"; */ "6397.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6400"; */ "6400.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6407"; */ "6407.title" = "Box"; /* Class = "NSTextFieldCell"; title = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; ObjectID = "6413"; */ "6413.title" = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; /* Class = "NSTextFieldCell"; title = "Expected Behavior:"; ObjectID = "6414"; */ "6414.title" = "Expected Behavior:"; /* Class = "NSTextFieldCell"; title = "Observed Behavior:"; ObjectID = "6415"; */ "6415.title" = "Observed Behavior:"; /* Class = "NSTextFieldCell"; title = "In the fields below, give us specific details on what you OBSERVED happened, and then what you EXPECTED to happen."; ObjectID = "6418"; */ "6418.title" = "In the fields below, give us specific details on what you OBSERVED happened, and then what you EXPECTED to happen."; /* Class = "NSTextFieldCell"; title = "Tell us what is happening."; ObjectID = "6419"; */ "6419.title" = "Tell us what is happening."; /* Class = "NSTextFieldCell"; title = "Think you just spotted a bug with DeSmuME? Be sure to let us know! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your bug report quicker and easier."; ObjectID = "6420"; */ "6420.title" = "Think you just spotted a bug with DeSmuME? Be sure to let us know! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your bug report quicker and easier."; /* Class = "NSTextFieldCell"; title = "DeSmuME Bug Report Form"; ObjectID = "6421"; */ "6421.title" = "DeSmuME Bug Report Form"; /* Class = "NSTextFieldCell"; title = "Tell us about the ROM."; ObjectID = "6422"; */ "6422.title" = "Tell us about the ROM."; /* Class = "NSTextFieldCell"; title = "If your bug is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; ObjectID = "6423"; */ "6423.title" = "If your bug is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; /* Class = "NSTextFieldCell"; title = "ROM Serial:"; ObjectID = "6424"; */ "6424.title" = "ROM Serial:"; /* Class = "NSTextFieldCell"; title = "ROM Name:"; ObjectID = "6425"; */ "6425.title" = "ROM Name:"; /* Class = "NSButtonCell"; title = "Use Currently Loaded ROM"; ObjectID = "6428"; */ "6428.title" = "Use Currently Loaded ROM"; /* Class = "NSButtonCell"; title = "Continue"; ObjectID = "6429"; */ "6429.title" = "Continue"; /* Class = "NSButtonCell"; title = "Go to Tech Support Webpage"; ObjectID = "6434"; */ "6434.title" = "Go to Tech Support Webpage"; /* Class = "NSButtonCell"; title = "Back"; ObjectID = "6435"; */ "6435.title" = "Back"; /* Class = "NSMenuItem"; title = "Submit a Support Request..."; ObjectID = "6451"; */ "6451.title" = "Submit a Support Request..."; /* Class = "NSTextFieldCell"; title = "Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us."; ObjectID = "6485"; */ "6485.title" = "Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us."; /* Class = "NSButtonCell"; title = "Copy Info to Clipboard"; ObjectID = "6612"; */ "6612.title" = "Copy Info to Clipboard"; /* Class = "NSBox"; title = "OpenGL Options"; ObjectID = "6617"; */ "6617.title" = "OpenGL Options"; /* Class = "NSButton"; ibShadowedToolTip = "Smooths the edges of 3D objects using multisample antialiasing (MSAA). No CPU usage. However, it requires additional VRAM from your GPU."; ObjectID = "6618"; */ "6618.ibShadowedToolTip" = "Smooths the edges of 3D objects using multisample antialiasing (MSAA). No CPU usage. However, it requires additional VRAM from your GPU."; /* Class = "NSButtonCell"; title = "Enable Multisample Antialiasing"; ObjectID = "6619"; */ "6619.title" = "Enable Multisample Antialiasing"; /* Class = "NSBox"; title = "OpenGL Options"; ObjectID = "6622"; */ "6622.title" = "OpenGL Options"; /* Class = "NSButton"; ibShadowedToolTip = "Smooths the edges of 3D objects using multisample antialiasing (MSAA) by default. No CPU usage. However, it requires additional VRAM from your GPU."; ObjectID = "6623"; */ "6623.ibShadowedToolTip" = "Smooths the edges of 3D objects using multisample antialiasing (MSAA) by default. No CPU usage. However, it requires additional VRAM from your GPU."; /* Class = "NSButtonCell"; title = "Enable Multisample Antialiasing"; ObjectID = "6624"; */ "6624.title" = "Enable Multisample Antialiasing"; /* Class = "NSButton"; ibShadowedToolTip = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; ObjectID = "6627"; */ "6627.ibShadowedToolTip" = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; /* Class = "NSButtonCell"; title = "Rigorous 3D Rendering Timing"; ObjectID = "6628"; */ "6628.title" = "Rigorous 3D Rendering Timing"; /* Class = "NSButton"; ibShadowedToolTip = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; ObjectID = "6630"; */ "6630.ibShadowedToolTip" = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; /* Class = "NSButtonCell"; title = "Rigorous 3D Rendering Timing"; ObjectID = "6631"; */ "6631.title" = "Rigorous 3D Rendering Timing"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; ObjectID = "6634"; */ "6634.ibShadowedToolTip" = "Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "8 Threads"; ObjectID = "6634"; */ "6634.title" = "8 Threads"; /* Class = "NSMenuItem"; title = "New Display Window"; ObjectID = "6931"; */ "6931.title" = "New Display Window"; /* Class = "NSMenuItem"; title = "Close Window"; ObjectID = "6998"; */ "6998.title" = "Close Window"; /* Class = "NSTableColumn"; headerCell.title = "Input Settings Summary"; ObjectID = "7133"; */ "7133.headerCell.title" = "Input Settings Summary"; /* Class = "NSTableColumn"; headerCell.title = "Input Device"; ObjectID = "7136"; */ "7136.headerCell.title" = "Input Device"; /* Class = "NSTableColumn"; headerCell.title = "Set Command"; ObjectID = "7137"; */ "7137.headerCell.title" = "Set Command"; /* Class = "NSButtonCell"; title = "Command"; ObjectID = "7138"; */ "7138.title" = "Command"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7139"; */ "7139.title" = "Text Cell"; /* Class = "NSButtonCell"; title = "Remove"; ObjectID = "7140"; */ "7140.title" = "Remove"; /* Class = "NSButtonCell"; title = "Settings"; ObjectID = "7141"; */ "7141.title" = "Settings"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7142"; */ "7142.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Click this area to map mouse input."; ObjectID = "7169"; */ "7169.title" = "Click this area to map mouse input."; /* Class = "NSWindow"; title = "InputSettingsTouch"; ObjectID = "7171"; */ "7171.title" = "InputSettingsTouch"; /* Class = "NSWindow"; title = "InputSettingsLoadStateSlot"; ObjectID = "7173"; */ "7173.title" = "InputSettingsLoadStateSlot"; /* Class = "NSWindow"; title = "InputSettingsMicrophone"; ObjectID = "7175"; */ "7175.title" = "InputSettingsMicrophone"; /* Class = "NSWindow"; title = "InputSettingsGPUState"; ObjectID = "7179"; */ "7179.title" = "InputSettingsGPUState"; /* Class = "NSBox"; title = "Audio Sample Generators"; ObjectID = "7182"; */ "7182.title" = "Audio Sample Generators"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Generates a predefined buzzing sound."; ObjectID = "7186"; */ "7186.ibShadowedToolTip" = "Generates a predefined buzzing sound."; /* Class = "NSButtonCell"; title = "Internal Noise Samples"; ObjectID = "7186"; */ "7186.title" = "Internal Noise Samples"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "7187"; */ "7187.title" = "Radio"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Generates randomly generated white noise."; ObjectID = "7188"; */ "7188.ibShadowedToolTip" = "Generates randomly generated white noise."; /* Class = "NSButtonCell"; title = "White Noise"; ObjectID = "7188"; */ "7188.title" = "White Noise"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Generates a pure sine wave tone. Can be adjusted for frequency. (Some games, such as \"The Legend of Zelda: Spirit Tracks,\" work especially well at 40 Hz.)"; ObjectID = "7189"; */ "7189.ibShadowedToolTip" = "Generates a pure sine wave tone. Can be adjusted for frequency. (Some games, such as \"The Legend of Zelda: Spirit Tracks,\" work especially well at 40 Hz.)"; /* Class = "NSButtonCell"; title = "Sine Wave"; ObjectID = "7189"; */ "7189.title" = "Sine Wave"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Generates predefined samples taken from an audio file. (Whenever the Microphone command is deactivated, sample reading will be reset to the beginning of the file.)"; ObjectID = "7190"; */ "7190.ibShadowedToolTip" = "Generates predefined samples taken from an audio file. (Whenever the Microphone command is deactivated, sample reading will be reset to the beginning of the file.)"; /* Class = "NSButtonCell"; title = "Audio File"; ObjectID = "7190"; */ "7190.title" = "Audio File"; /* Class = "NSTextFieldCell"; placeholderString = "File Name"; ObjectID = "7191"; */ "7191.placeholderString" = "File Name"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "7192"; */ "7192.title" = "Choose..."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7212"; */ "7212.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Slot 1"; ObjectID = "7213"; */ "7213.title" = "Slot 1"; /* Class = "NSMenuItem"; title = "Slot 2"; ObjectID = "7214"; */ "7214.title" = "Slot 2"; /* Class = "NSMenuItem"; title = "Slot 3"; ObjectID = "7215"; */ "7215.title" = "Slot 3"; /* Class = "NSTextFieldCell"; title = "Load State Slot:"; ObjectID = "7217"; */ "7217.title" = "Load State Slot:"; /* Class = "NSMenuItem"; title = "Slot 4"; ObjectID = "7218"; */ "7218.title" = "Slot 4"; /* Class = "NSMenuItem"; title = "Slot 5"; ObjectID = "7219"; */ "7219.title" = "Slot 5"; /* Class = "NSMenuItem"; title = "Slot 6"; ObjectID = "7220"; */ "7220.title" = "Slot 6"; /* Class = "NSMenuItem"; title = "Slot 7"; ObjectID = "7221"; */ "7221.title" = "Slot 7"; /* Class = "NSMenuItem"; title = "Slot 8"; ObjectID = "7222"; */ "7222.title" = "Slot 8"; /* Class = "NSMenuItem"; title = "Slot 9"; ObjectID = "7223"; */ "7223.title" = "Slot 9"; /* Class = "NSMenuItem"; title = "Slot 10"; ObjectID = "7224"; */ "7224.title" = "Slot 10"; /* Class = "NSWindow"; title = "InputSettingsSaveStateSlot"; ObjectID = "7225"; */ "7225.title" = "InputSettingsSaveStateSlot"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7230"; */ "7230.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Slot 10"; ObjectID = "7231"; */ "7231.title" = "Slot 10"; /* Class = "NSMenuItem"; title = "Slot 9"; ObjectID = "7232"; */ "7232.title" = "Slot 9"; /* Class = "NSMenuItem"; title = "Slot 8"; ObjectID = "7233"; */ "7233.title" = "Slot 8"; /* Class = "NSMenuItem"; title = "Slot 7"; ObjectID = "7234"; */ "7234.title" = "Slot 7"; /* Class = "NSMenuItem"; title = "Slot 6"; ObjectID = "7235"; */ "7235.title" = "Slot 6"; /* Class = "NSMenuItem"; title = "Slot 5"; ObjectID = "7236"; */ "7236.title" = "Slot 5"; /* Class = "NSMenuItem"; title = "Slot 4"; ObjectID = "7237"; */ "7237.title" = "Slot 4"; /* Class = "NSMenuItem"; title = "Slot 3"; ObjectID = "7238"; */ "7238.title" = "Slot 3"; /* Class = "NSMenuItem"; title = "Slot 2"; ObjectID = "7239"; */ "7239.title" = "Slot 2"; /* Class = "NSMenuItem"; title = "Slot 1"; ObjectID = "7240"; */ "7240.title" = "Slot 1"; /* Class = "NSTextFieldCell"; title = "Save State Slot:"; ObjectID = "7241"; */ "7241.title" = "Save State Slot:"; /* Class = "NSBox"; title = "GPU Layers"; ObjectID = "7266"; */ "7266.title" = "GPU Layers"; /* Class = "NSButtonCell"; title = "Main GPU (All Layers)"; ObjectID = "7268"; */ "7268.title" = "Main GPU (All Layers)"; /* Class = "NSButtonCell"; title = "Main BG0"; ObjectID = "7269"; */ "7269.title" = "Main BG0"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "7270"; */ "7270.title" = "Radio"; /* Class = "NSButtonCell"; title = "Sub GPU (All Layers)"; ObjectID = "7271"; */ "7271.title" = "Sub GPU (All Layers)"; /* Class = "NSButtonCell"; title = "Sub BG0"; ObjectID = "7272"; */ "7272.title" = "Sub BG0"; /* Class = "NSButtonCell"; title = "Main BG1"; ObjectID = "7273"; */ "7273.title" = "Main BG1"; /* Class = "NSButtonCell"; title = "Sub BG1"; ObjectID = "7274"; */ "7274.title" = "Sub BG1"; /* Class = "NSButtonCell"; title = "Sub BG2"; ObjectID = "7275"; */ "7275.title" = "Sub BG2"; /* Class = "NSButtonCell"; title = "Main BG2"; ObjectID = "7276"; */ "7276.title" = "Main BG2"; /* Class = "NSButtonCell"; title = "Main BG3"; ObjectID = "7277"; */ "7277.title" = "Main BG3"; /* Class = "NSButtonCell"; title = "Sub BG3"; ObjectID = "7278"; */ "7278.title" = "Sub BG3"; /* Class = "NSButtonCell"; title = "Main OBJ"; ObjectID = "7279"; */ "7279.title" = "Main OBJ"; /* Class = "NSButtonCell"; title = "Sub OBJ"; ObjectID = "7280"; */ "7280.title" = "Sub OBJ"; /* Class = "NSTextFieldCell"; title = "X:"; ObjectID = "7286"; */ "7286.title" = "X:"; /* Class = "NSTextFieldCell"; title = "Y:"; ObjectID = "7292"; */ "7292.title" = "Y:"; /* Class = "NSBox"; title = "User Defined Coordinates"; ObjectID = "7293"; */ "7293.title" = "User Defined Coordinates"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7302"; */ "7302.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7308"; */ "7308.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7312"; */ "7312.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7316"; */ "7316.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7320"; */ "7320.title" = "OK"; /* Class = "NSButtonCell"; title = "Use user defined coordinates"; ObjectID = "7355"; */ "7355.title" = "Use user defined coordinates"; /* Class = "NSTextFieldCell"; title = "If this setting is disabled, then the Touch command will read the coordinates from the input device instead."; ObjectID = "7359"; */ "7359.title" = "If this setting is disabled, then the Touch command will read the coordinates from the input device instead."; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7393"; */ "7393.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7396"; */ "7396.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7399"; */ "7399.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7402"; */ "7402.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7405"; */ "7405.title" = "Cancel"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7434"; */ "7434.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7437"; */ "7437.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7440"; */ "7440.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7443"; */ "7443.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7446"; */ "7446.placeholderString" = "Device Info Summary"; /* Class = "NSWindow"; title = "InputSettingsSpeedLimit"; ObjectID = "7449"; */ "7449.title" = "InputSettingsSpeedLimit"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7452"; */ "7452.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "%1.2fx"; ObjectID = "7464"; */ "7464.placeholderString" = "%1.2fx"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "7466"; */ "7466.title" = "Speed limit set to: "; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "7467"; */ "7467.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "7468"; */ "7468.title" = "8x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "7469"; */ "7469.title" = "6x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "7470"; */ "7470.title" = "4x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "7471"; */ "7471.title" = "2x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "7472"; */ "7472.title" = "10x"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "7473"; */ "7473.title" = "0x"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7488"; */ "7488.title" = "Cancel"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7489"; */ "7489.title" = "OK"; /* Class = "NSWindow"; title = "Input Profile"; ObjectID = "7515"; */ "7515.title" = "Input Profile"; /* Class = "NSTableColumn"; headerCell.title = "Input Settings Summary"; ObjectID = "7522"; */ "7522.headerCell.title" = "Input Settings Summary"; /* Class = "NSTableColumn"; headerCell.title = "Input Device"; ObjectID = "7525"; */ "7525.headerCell.title" = "Input Device"; /* Class = "NSTableColumn"; headerCell.title = "Command"; ObjectID = "7526"; */ "7526.headerCell.title" = "Command"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7528"; */ "7528.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7531"; */ "7531.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Text"; ObjectID = "7540"; */ "7540.title" = "Text"; /* Class = "NSTextFieldCell"; title = "Profile Name"; ObjectID = "7542"; */ "7542.title" = "Profile Name"; /* Class = "NSButtonCell"; title = "Close"; ObjectID = "7544"; */ "7544.title" = "Close"; /* Class = "NSButtonCell"; title = "Apply to Current Configuration"; ObjectID = "7552"; */ "7552.title" = "Apply to Current Configuration"; /* Class = "NSButtonCell"; title = "Next"; ObjectID = "7554"; */ "7554.title" = "Next"; /* Class = "NSButtonCell"; title = "Previous"; ObjectID = "7556"; */ "7556.title" = "Previous"; /* Class = "NSButtonCell"; title = "Delete"; ObjectID = "7584"; */ "7584.title" = "Delete"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7596"; */ "7596.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Actions"; ObjectID = "7597"; */ "7597.title" = "Actions"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Saves the current configuration to the selected profile."; ObjectID = "7598"; */ "7598.ibShadowedToolTip" = "Saves the current configuration to the selected profile."; /* Class = "NSMenuItem"; title = "Save"; ObjectID = "7598"; */ "7598.title" = "Save"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Deletes the selected profile."; ObjectID = "7599"; */ "7599.ibShadowedToolTip" = "Deletes the selected profile."; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "7599"; */ "7599.title" = "Delete"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Replaces the current configuration with the selected profile."; ObjectID = "7600"; */ "7600.ibShadowedToolTip" = "Replaces the current configuration with the selected profile."; /* Class = "NSMenuItem"; title = "Apply"; ObjectID = "7600"; */ "7600.title" = "Apply"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Renames the selected profile."; ObjectID = "7601"; */ "7601.ibShadowedToolTip" = "Renames the selected profile."; /* Class = "NSMenuItem"; title = "Rename"; ObjectID = "7601"; */ "7601.title" = "Rename"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Shows the selected profile."; ObjectID = "7604"; */ "7604.ibShadowedToolTip" = "Shows the selected profile."; /* Class = "NSMenuItem"; title = "View"; ObjectID = "7604"; */ "7604.title" = "View"; /* Class = "NSMenu"; title = "InputConfigurationMenu"; ObjectID = "7607"; */ "7607.title" = "InputConfigurationMenu"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Creates a new profile using the current configuration."; ObjectID = "7610"; */ "7610.ibShadowedToolTip" = "Creates a new profile using the current configuration."; /* Class = "NSMenuItem"; title = "New..."; ObjectID = "7610"; */ "7610.title" = "New..."; /* Class = "NSTextFieldCell"; title = "Saved Profiles:"; ObjectID = "7625"; */ "7625.title" = "Saved Profiles:"; /* Class = "NSWindow"; title = "Input Profile Rename"; ObjectID = "7707"; */ "7707.title" = "Input Profile Rename"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7726"; */ "7726.title" = "OK"; /* Class = "NSTextFieldCell"; title = "Enter a new name for this profile:"; ObjectID = "7730"; */ "7730.title" = "Enter a new name for this profile:"; /* Class = "NSTextFieldCell"; placeholderString = "%1.1f Hz"; ObjectID = "7762"; */ "7762.placeholderString" = "%1.1f Hz"; /* Class = "NSButtonCell"; title = "Choose None"; ObjectID = "7767"; */ "7767.title" = "Choose None"; /* Class = "NSMenuItem"; title = "Display Separation"; ObjectID = "7771"; */ "7771.title" = "Display Separation"; /* Class = "NSMenu"; title = "Display Separation"; ObjectID = "7772"; */ "7772.title" = "Display Separation"; /* Class = "NSMenuItem"; title = "0%"; ObjectID = "7773"; */ "7773.title" = "0%"; /* Class = "NSMenuItem"; title = "50%"; ObjectID = "7774"; */ "7774.title" = "50%"; /* Class = "NSMenuItem"; title = "100%"; ObjectID = "7775"; */ "7775.title" = "100%"; /* Class = "NSMenuItem"; title = "150%"; ObjectID = "7776"; */ "7776.title" = "150%"; /* Class = "NSMenuItem"; title = "200%"; ObjectID = "7777"; */ "7777.title" = "200%"; /* Class = "NSMenuItem"; title = "Custom..."; ObjectID = "7779"; */ "7779.title" = "Custom..."; /* Class = "NSTextFieldCell"; title = "Display Separation:"; ObjectID = "7781"; */ "7781.title" = "Display Separation:"; /* Class = "NSTextField"; ibShadowedToolTip = "The default separation for new NDS display views. A custom gap percentage may be entered here. (The gap percentage must be between 0% and 200%.)"; ObjectID = "7792"; */ "7792.ibShadowedToolTip" = "The default separation for new NDS display views. A custom gap percentage may be entered here. (The gap percentage must be between 0% and 200%.)"; /* Class = "NSTextFieldCell"; title = "0%"; ObjectID = "7793"; */ "7793.title" = "0%"; /* Class = "NSSlider"; ibShadowedToolTip = "Sets the default screen separation for new NDS display views. (A value of 100% will create a gap between the screens that has the same relative distance as a hardware NDS.)"; ObjectID = "7802"; */ "7802.ibShadowedToolTip" = "Sets the default screen separation for new NDS display views. (A value of 100% will create a gap between the screens that has the same relative distance as a hardware NDS.)"; /* Class = "NSTextFieldCell"; title = "200%"; ObjectID = "7805"; */ "7805.title" = "200%"; /* Class = "NSTextFieldCell"; title = "150%"; ObjectID = "7807"; */ "7807.title" = "150%"; /* Class = "NSTextFieldCell"; title = "100%"; ObjectID = "7809"; */ "7809.title" = "100%"; /* Class = "NSTextFieldCell"; title = "50%"; ObjectID = "7811"; */ "7811.title" = "50%"; /* Class = "NSTextFieldCell"; title = "0%"; ObjectID = "7813"; */ "7813.title" = "0%"; /* Class = "NSWindow"; title = "Set Separation"; ObjectID = "7817"; */ "7817.title" = "Set Separation"; /* Class = "NSTextFieldCell"; title = "0%"; ObjectID = "7826"; */ "7826.title" = "0%"; /* Class = "NSTextFieldCell"; title = "50%"; ObjectID = "7827"; */ "7827.title" = "50%"; /* Class = "NSTextFieldCell"; title = "100%"; ObjectID = "7828"; */ "7828.title" = "100%"; /* Class = "NSTextFieldCell"; title = "150%"; ObjectID = "7829"; */ "7829.title" = "150%"; /* Class = "NSTextFieldCell"; title = "200%"; ObjectID = "7830"; */ "7830.title" = "200%"; /* Class = "NSTextFieldCell"; title = "Gap Percentage:"; ObjectID = "7837"; */ "7837.title" = "Gap Percentage:"; /* Class = "NSTextFieldCell"; placeholderString = "1.1f%"; ObjectID = "7839"; */ "7839.placeholderString" = "1.1f%"; /* Class = "NSButton"; ibShadowedToolTip = "Sets the screen separation to 0%, which removes any gap between the screens."; ObjectID = "7843"; */ "7843.ibShadowedToolTip" = "Sets the screen separation to 0%, which removes any gap between the screens."; /* Class = "NSButtonCell"; title = "Set to 0%"; ObjectID = "7844"; */ "7844.title" = "Set to 0%"; /* Class = "NSButton"; ibShadowedToolTip = "Sets the screen separation to 100%, which creates a gap between the screens that has the same relative distance as a hardware NDS."; ObjectID = "7845"; */ "7845.ibShadowedToolTip" = "Sets the screen separation to 100%, which creates a gap between the screens that has the same relative distance as a hardware NDS."; /* Class = "NSButtonCell"; title = "Set to 100%"; ObjectID = "7846"; */ "7846.title" = "Set to 100%"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "7848"; */ "7848.title" = "Save Settings as Default"; /* Class = "NSWindow"; title = "SLOT-1 (NDS Slot) Manager"; ObjectID = "7855"; */ "7855.title" = "SLOT-1 (NDS Slot) Manager"; /* Class = "NSButtonCell"; title = "None"; ObjectID = "7858"; */ "7858.title" = "None"; /* Class = "NSButtonCell"; title = "Retail (Auto-detect)"; ObjectID = "7859"; */ "7859.title" = "Retail (Auto-detect)"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "7860"; */ "7860.title" = "Radio"; /* Class = "NSButtonCell"; title = "Retail with NAND Flash"; ObjectID = "7861"; */ "7861.title" = "Retail with NAND Flash"; /* Class = "NSButtonCell"; ibShadowedToolTip = "Standard Retail Memory Card + ROM"; ObjectID = "7862"; */ "7862.ibShadowedToolTip" = "Standard Retail Memory Card + ROM"; /* Class = "NSButtonCell"; title = "Standard Retail MC + ROM"; ObjectID = "7862"; */ "7862.title" = "Standard Retail MC + ROM"; /* Class = "NSTextFieldCell"; placeholderString = "Directory Path"; ObjectID = "7864"; */ "7864.placeholderString" = "Directory Path"; /* Class = "NSButton"; ibShadowedToolTip = "Choose a directory where the R4 device stores its data."; ObjectID = "7866"; */ "7866.ibShadowedToolTip" = "Choose a directory where the R4 device stores its data."; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "7867"; */ "7867.title" = "Choose..."; /* Class = "NSButton"; ibShadowedToolTip = "Sends a SLOT-1 eject IRQ. The emulator will then detect that no device is inserted into SLOT-1."; ObjectID = "7871"; */ "7871.ibShadowedToolTip" = "Sends a SLOT-1 eject IRQ. The emulator will then detect that no device is inserted into SLOT-1."; /* Class = "NSButtonCell"; title = "Eject SLOT-1 Device"; ObjectID = "7872"; */ "7872.title" = "Eject SLOT-1 Device"; /* Class = "NSButton"; ibShadowedToolTip = "Resets the emulation."; ObjectID = "7873"; */ "7873.ibShadowedToolTip" = "Resets the emulation."; /* Class = "NSButtonCell"; title = "Reset NDS"; ObjectID = "7874"; */ "7874.title" = "Reset NDS"; /* Class = "NSTextFieldCell"; title = "Note: Changes to the SLOT-1 device will only take effect after a ROM is loaded or after the emulator is reset."; ObjectID = "7876"; */ "7876.title" = "Note: Changes to the SLOT-1 device will only take effect after a ROM is loaded or after the emulator is reset."; /* Class = "NSBox"; title = "Box"; ObjectID = "7879"; */ "7879.title" = "Box"; /* Class = "NSTextFieldCell"; placeholderString = "slot1StatusText"; ObjectID = "7881"; */ "7881.placeholderString" = "slot1StatusText"; /* Class = "NSMenuItem"; title = "Show SLOT-1 Manager..."; ObjectID = "7886"; */ "7886.title" = "Show SLOT-1 Manager..."; /* Class = "NSBox"; title = "SLOT-1 Device Type"; ObjectID = "7899"; */ "7899.title" = "SLOT-1 Device Type"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "7973"; */ "7973.title" = "Name:\nSerial:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7989"; */ "7989.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Actions"; ObjectID = "7993"; */ "7993.title" = "Actions"; /* Class = "NSMenuItem"; title = "Load ROM& "; ObjectID = "7994"; */ "7994.title" = "Load ROM& "; /* Class = "NSMenuItem"; title = "Load Recent ROM"; ObjectID = "7995"; */ "7995.title" = "Load Recent ROM"; /* Class = "NSMenuItem"; title = "Unload ROM"; ObjectID = "7996"; */ "7996.title" = "Unload ROM"; /* Class = "NSMenu"; title = "Load Recent ROM"; ObjectID = "7997"; */ "7997.title" = "Load Recent ROM"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "7998"; */ "7998.title" = "Clear Menu"; /* Class = "NSBox"; title = "Loaded ROM"; ObjectID = "8009"; */ "8009.title" = "Loaded ROM"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "8015"; */ "8015.title" = "Name:\nSerial:"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "8024"; */ "8024.title" = "Name:\nSerial:"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "8033"; */ "8033.title" = "Name:\nSerial:"; /* Class = "NSTextField"; ibShadowedToolTip = "Changes the maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; ObjectID = "8045"; */ "8045.ibShadowedToolTip" = "Changes the maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; /* Class = "NSTextFieldCell"; title = "12"; ObjectID = "8046"; */ "8046.title" = "12"; /* Class = "NSTextFieldCell"; title = "Block Size:"; ObjectID = "8049"; */ "8049.title" = "Block Size:"; /* Class = "NSTextFieldCell"; title = "Block Size:"; ObjectID = "8057"; */ "8057.title" = "Block Size:"; /* Class = "NSTextField"; ibShadowedToolTip = "Changes the default maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; ObjectID = "8058"; */ "8058.ibShadowedToolTip" = "Changes the default maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; /* Class = "NSTextFieldCell"; title = "12"; ObjectID = "8059"; */ "8059.title" = "12"; /* Class = "NSWindow"; title = "GPU Layers"; ObjectID = "8134"; */ "8134.title" = "GPU Layers"; /* Class = "NSButtonCell"; title = "GPU (All Layers)"; ObjectID = "8137"; */ "8137.title" = "GPU (All Layers)"; /* Class = "NSButtonCell"; title = "BG0"; ObjectID = "8139"; */ "8139.title" = "BG0"; /* Class = "NSButtonCell"; title = "BG1"; ObjectID = "8141"; */ "8141.title" = "BG1"; /* Class = "NSButtonCell"; title = "BG2"; ObjectID = "8143"; */ "8143.title" = "BG2"; /* Class = "NSButtonCell"; title = "BG3"; ObjectID = "8145"; */ "8145.title" = "BG3"; /* Class = "NSButtonCell"; title = "OBJ"; ObjectID = "8147"; */ "8147.title" = "OBJ"; /* Class = "NSButtonCell"; title = "GPU (All Layers)"; ObjectID = "8149"; */ "8149.title" = "GPU (All Layers)"; /* Class = "NSButtonCell"; title = "BG0"; ObjectID = "8151"; */ "8151.title" = "BG0"; /* Class = "NSButtonCell"; title = "BG1"; ObjectID = "8153"; */ "8153.title" = "BG1"; /* Class = "NSButtonCell"; title = "BG2"; ObjectID = "8155"; */ "8155.title" = "BG2"; /* Class = "NSButtonCell"; title = "BG3"; ObjectID = "8157"; */ "8157.title" = "BG3"; /* Class = "NSButtonCell"; title = "OBJ"; ObjectID = "8159"; */ "8159.title" = "OBJ"; /* Class = "NSBox"; title = "Main"; ObjectID = "8160"; */ "8160.title" = "Main"; /* Class = "NSBox"; title = "Sub"; ObjectID = "8161"; */ "8161.title" = "Sub"; /* Class = "NSMenuItem"; title = "Show GPU Layers..."; ObjectID = "8162"; */ "8162.title" = "Show GPU Layers..."; /* Class = "NSMenuItem"; title = "Reveal ROM in Finder"; ObjectID = "8164"; */ "8164.title" = "Reveal ROM in Finder"; /* Class = "NSTabViewItem"; label = "General Settings"; ObjectID = "8182"; */ "8182.label" = "General Settings"; /* Class = "NSTabViewItem"; label = "BIOS and Firmware"; ObjectID = "8183"; */ "8183.label" = "BIOS and Firmware"; /* Class = "NSMenuItem"; title = "5x"; ObjectID = "8186"; */ "8186.title" = "5x"; /* Class = "NSMenuItem"; title = "Video Pixel Scaler"; ObjectID = "8245"; */ "8245.title" = "Video Pixel Scaler"; /* Class = "NSMenu"; title = "Video Pixel Scaler"; ObjectID = "8246"; */ "8246.title" = "Video Pixel Scaler"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "8253"; */ "8253.title" = "None"; /* Class = "NSMenuItem"; title = "LQ2x"; ObjectID = "8254"; */ "8254.title" = "LQ2x"; /* Class = "NSMenuItem"; title = "LQ2xS"; ObjectID = "8255"; */ "8255.title" = "LQ2xS"; /* Class = "NSMenuItem"; title = "HQ2x"; ObjectID = "8256"; */ "8256.title" = "HQ2x"; /* Class = "NSMenuItem"; title = "HQ2xS"; ObjectID = "8257"; */ "8257.title" = "HQ2xS"; /* Class = "NSMenuItem"; title = "HQ4x"; ObjectID = "8258"; */ "8258.title" = "HQ4x"; /* Class = "NSMenuItem"; title = "HQ4xS"; ObjectID = "8259"; */ "8259.title" = "HQ4xS"; /* Class = "NSMenuItem"; title = "2xSaI"; ObjectID = "8260"; */ "8260.title" = "2xSaI"; /* Class = "NSMenuItem"; title = "Super 2xSaI"; ObjectID = "8261"; */ "8261.title" = "Super 2xSaI"; /* Class = "NSMenuItem"; title = "Super Eagle"; ObjectID = "8262"; */ "8262.title" = "Super Eagle"; /* Class = "NSMenuItem"; title = "Scanline"; ObjectID = "8263"; */ "8263.title" = "Scanline"; /* Class = "NSMenuItem"; title = "Nearest 2x"; ObjectID = "8265"; */ "8265.title" = "Nearest 2x"; /* Class = "NSMenuItem"; title = "EPX"; ObjectID = "8268"; */ "8268.title" = "EPX"; /* Class = "NSMenuItem"; title = "EPX+"; ObjectID = "8269"; */ "8269.title" = "EPX+"; /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "8295"; */ "8295.title" = "Enter Full Screen"; /* Class = "NSButtonCell"; title = "R4"; ObjectID = "8301"; */ "8301.title" = "R4"; /* Class = "NSButtonCell"; title = "Restore display windows on startup"; ObjectID = "8303"; */ "8303.title" = "Restore display windows on startup"; /* Class = "NSTextFieldCell"; title = "Automatically load this ROM on startup:"; ObjectID = "8309"; */ "8309.title" = "Automatically load this ROM on startup:"; /* Class = "NSMenuItem"; title = "No ROM chosen."; ObjectID = "8310"; */ "8310.title" = "No ROM chosen."; /* Class = "NSMenuItem"; title = "None"; ObjectID = "8316"; */ "8316.title" = "None"; /* Class = "NSButton"; ibShadowedToolTip = "When checked, the ROM data is only loaded as needed. When unchecked, all of the ROM data is completely preloaded into RAM before use."; ObjectID = "8322"; */ "8322.ibShadowedToolTip" = "When checked, the ROM data is only loaded as needed. When unchecked, all of the ROM data is completely preloaded into RAM before use."; /* Class = "NSButtonCell"; title = "Only load ROM data as needed"; ObjectID = "8323"; */ "8323.title" = "Only load ROM data as needed"; /* Class = "NSWindow"; title = "SLOT-2 (GBA Slot) Manager"; ObjectID = "8331"; */ "8331.title" = "SLOT-2 (GBA Slot) Manager"; /* Class = "NSTableColumn"; headerCell.title = "SLOT-2 Device Type"; ObjectID = "8338"; */ "8338.headerCell.title" = "SLOT-2 Device Type"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "8341"; */ "8341.title" = "Text Cell"; /* Class = "NSBox"; title = "Device Settings"; ObjectID = "8343"; */ "8343.title" = "Device Settings"; /* Class = "NSButton"; ibShadowedToolTip = "Applies the selected SLOT-2 device's settings."; ObjectID = "8345"; */ "8345.ibShadowedToolTip" = "Applies the selected SLOT-2 device's settings."; /* Class = "NSButtonCell"; title = "Apply"; ObjectID = "8346"; */ "8346.title" = "Apply"; /* Class = "NSMenuItem"; title = "Show SLOT-2 Manager..."; ObjectID = "8352"; */ "8352.title" = "Show SLOT-2 Manager..."; /* Class = "NSTextFieldCell"; placeholderString = "slot2StatusText"; ObjectID = "8364"; */ "8364.placeholderString" = "slot2StatusText"; /* Class = "NSBox"; title = "GBA Slot Status"; ObjectID = "8365"; */ "8365.title" = "GBA Slot Status"; /* Class = "NSTextFieldCell"; title = "No additional configuration required."; ObjectID = "8368"; */ "8368.title" = "No additional configuration required."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "8379"; */ "8379.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Same folder as the loaded ROM"; ObjectID = "8380"; */ "8380.title" = "Same folder as the loaded ROM"; /* Class = "NSMenuItem"; title = "Custom folder"; ObjectID = "8381"; */ "8381.title" = "Custom folder"; /* Class = "NSMenuItem"; title = "Choose a folder..."; ObjectID = "8382"; */ "8382.title" = "Choose a folder..."; /* Class = "NSMenuItem"; title = "Custom disk image"; ObjectID = "8384"; */ "8384.title" = "Custom disk image"; /* Class = "NSMenuItem"; title = "Choose a disk image..."; ObjectID = "8386"; */ "8386.title" = "Choose a disk image..."; /* Class = "NSTextFieldCell"; title = "Search for files at this location:"; ObjectID = "8388"; */ "8388.title" = "Search for files at this location:"; /* Class = "NSTextFieldCell"; title = "No additional configuration required."; ObjectID = "8410"; */ "8410.title" = "No additional configuration required."; /* Class = "NSTextFieldCell"; title = "GBA ROM Cartridge File:"; ObjectID = "8412"; */ "8412.title" = "GBA ROM Cartridge File:"; /* Class = "NSTextFieldCell"; placeholderString = "File Path"; ObjectID = "8414"; */ "8414.placeholderString" = "File Path"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "8416"; */ "8416.title" = "Choose..."; /* Class = "NSBox"; title = "Box"; ObjectID = "8427"; */ "8427.title" = "Box"; /* Class = "NSTextFieldCell"; title = "No additional configuration required."; ObjectID = "8447"; */ "8447.title" = "No additional configuration required."; /* Class = "NSTextFieldCell"; title = "No additional configuration required."; ObjectID = "8456"; */ "8456.title" = "No additional configuration required."; /* Class = "NSTextFieldCell"; title = "Note: Rumble will only work for supported games. In addition, you must have a supported input device. To check if the selected input devices support rumble, click Test Rumble."; ObjectID = "8500"; */ "8500.title" = "Note: Rumble will only work for supported games. In addition, you must have a supported input device. To check if the selected input devices support rumble, click Test Rumble."; /* Class = "NSButtonCell"; title = "Test Rumble"; ObjectID = "8502"; */ "8502.title" = "Test Rumble"; /* Class = "NSTableColumn"; headerCell.title = "Input Device"; ObjectID = "8518"; */ "8518.headerCell.title" = "Input Device"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "8519"; */ "8519.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Enable rumble for the selected input devices:"; ObjectID = "8526"; */ "8526.title" = "Enable rumble for the selected input devices:"; /* Class = "NSTextFieldCell"; title = "This device is unsupported at this time."; ObjectID = "8554"; */ "8554.title" = "This device is unsupported at this time."; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "8560"; */ "8560.title" = "Name:\nSerial:"; /* Class = "NSBox"; title = "Box"; ObjectID = "8568"; */ "8568.title" = "Box"; /* Class = "NSTextFieldCell"; title = "Currently Loaded ROM"; ObjectID = "8570"; */ "8570.title" = "Currently Loaded ROM"; /* Class = "NSTextFieldCell"; title = "Selected SLOT-2 Device:"; ObjectID = "8572"; */ "8572.title" = "Selected SLOT-2 Device:"; /* Class = "NSTextFieldCell"; placeholderString = "SLOT-2 Device Name"; ObjectID = "8576"; */ "8576.placeholderString" = "SLOT-2 Device Name"; /* Class = "NSWindow"; title = "InputSettingsPaddleController"; ObjectID = "8596"; */ "8596.title" = "InputSettingsPaddleController"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "8599"; */ "8599.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "%d"; ObjectID = "8609"; */ "8609.placeholderString" = "%d"; /* Class = "NSBox"; title = "Digital Input Settings"; ObjectID = "8612"; */ "8612.title" = "Digital Input Settings"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "8640"; */ "8640.title" = "Cancel"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "8641"; */ "8641.title" = "OK"; /* Class = "NSTextFieldCell"; title = "This is an input device. You can set up this device through your Input Preferences."; ObjectID = "8654"; */ "8654.title" = "This is an input device. You can set up this device through your Input Preferences."; /* Class = "NSButtonCell"; title = "Input Preferences"; ObjectID = "8661"; */ "8661.title" = "Input Preferences"; /* Class = "NSButtonCell"; title = "Input Preferences"; ObjectID = "8664"; */ "8664.title" = "Input Preferences"; /* Class = "NSTextFieldCell"; title = "This is an input device. You can set up this device through your Input Preferences."; ObjectID = "8668"; */ "8668.title" = "This is an input device. You can set up this device through your Input Preferences."; /* Class = "NSTextFieldCell"; title = "When a ROM is loading, this setting prevents any SLOT-2 device from being loaded into the GBA slot. If a ROM is already loaded, this setting removes any previously loaded SLOT-2 device."; ObjectID = "8678"; */ "8678.title" = "When a ROM is loading, this setting prevents any SLOT-2 device from being loaded into the GBA slot. If a ROM is already loaded, this setting removes any previously loaded SLOT-2 device."; /* Class = "NSTextFieldCell"; title = "Note: If a game is dependent on having a particular SLOT-2 device loaded, then removing the device while the game is running may cause the game to fail."; ObjectID = "8680"; */ "8680.title" = "Note: If a game is dependent on having a particular SLOT-2 device loaded, then removing the device while the game is running may cause the game to fail."; /* Class = "NSTextFieldCell"; title = "Note: This is not an actual device. Rather, this setting will automatically select a SLOT-2 device depending on the loaded ROM, and then load the device as the ROM loads."; ObjectID = "8682"; */ "8682.title" = "Note: This is not an actual device. Rather, this setting will automatically select a SLOT-2 device depending on the loaded ROM, and then load the device as the ROM loads."; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "8690"; */ "8690.title" = "Choose..."; /* Class = "NSTextFieldCell"; placeholderString = "File Path"; ObjectID = "8691"; */ "8691.placeholderString" = "File Path"; /* Class = "NSTextFieldCell"; title = "GBA SRAM File:"; ObjectID = "8692"; */ "8692.title" = "GBA SRAM File:"; /* Class = "NSButtonCell"; title = "Clear SRAM Path"; ObjectID = "8707"; */ "8707.title" = "Clear SRAM Path"; /* Class = "NSTextFieldCell"; title = "Less Sensitive"; ObjectID = "8723"; */ "8723.title" = "Less Sensitive"; /* Class = "NSTextFieldCell"; title = "More Sensitive"; ObjectID = "8725"; */ "8725.title" = "More Sensitive"; /* Class = "NSBox"; title = "Analog Input Settings"; ObjectID = "8727"; */ "8727.title" = "Analog Input Settings"; /* Class = "NSTextFieldCell"; title = "" This is an analog input."; ObjectID = "8731"; */ "8731.title" = "" This is an analog input."; /* Class = "NSTextFieldCell"; title = "" This is a digital input."; ObjectID = "8736"; */ "8736.title" = "" This is a digital input."; /* Class = "NSTextFieldCell"; title = "Paddle Adjustment:"; ObjectID = "8740"; */ "8740.title" = "Paddle Adjustment:"; /* Class = "NSButtonCell"; title = "Input Preferences"; ObjectID = "8743"; */ "8743.title" = "Input Preferences"; /* Class = "NSTextFieldCell"; title = "This is an input device. You can set up this device through your Input Preferences."; ObjectID = "8744"; */ "8744.title" = "This is an input device. You can set up this device through your Input Preferences."; /* Class = "NSMenuItem"; title = "Toggle All Displays"; ObjectID = "8975"; */ "8975.title" = "Toggle All Displays"; /* Class = "NSMenuItem"; title = "Frame Advance"; ObjectID = "8978"; */ "8978.title" = "Frame Advance"; /* Class = "NSMenuItem"; title = "Frame Jump"; ObjectID = "8979"; */ "8979.title" = "Frame Jump"; /* Class = "NSWindow"; title = "Execution Control"; ObjectID = "8991"; */ "8991.title" = "Execution Control"; /* Class = "NSButton"; ibShadowedToolTip = "Execute"; ObjectID = "8993"; */ "8993.ibShadowedToolTip" = "Execute"; /* Class = "NSButton"; ibShadowedToolTip = "Frame Advance"; ObjectID = "8995"; */ "8995.ibShadowedToolTip" = "Frame Advance"; /* Class = "NSButton"; ibShadowedToolTip = "Reset"; ObjectID = "8997"; */ "8997.ibShadowedToolTip" = "Reset"; /* Class = "NSButton"; ibShadowedToolTip = "Frame Jump"; ObjectID = "9001"; */ "9001.ibShadowedToolTip" = "Frame Jump"; /* Class = "NSMenuItem"; title = "Show Execution Control..."; ObjectID = "9007"; */ "9007.title" = "Show Execution Control..."; /* Class = "NSButton"; ibShadowedToolTip = "Pause"; ObjectID = "9019"; */ "9019.ibShadowedToolTip" = "Pause"; /* Class = "NSButtonCell"; title = "Jump forward frames:"; ObjectID = "9035"; */ "9035.title" = "Jump forward frames:"; /* Class = "NSButtonCell"; title = "Jump to frame number:"; ObjectID = "9036"; */ "9036.title" = "Jump to frame number:"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "9037"; */ "9037.title" = "Radio"; /* Class = "NSButtonCell"; title = "Jump to next marker"; ObjectID = "9038"; */ "9038.title" = "Jump to next marker"; /* Class = "NSButtonCell"; title = "Enable Limiter"; ObjectID = "9052"; */ "9052.title" = "Enable Limiter"; /* Class = "NSTextFieldCell"; placeholderString = "statusText"; ObjectID = "9053"; */ "9053.placeholderString" = "statusText"; /* Class = "NSTextFieldCell"; title = "Execution speed set to: "; ObjectID = "9055"; */ "9055.title" = "Execution speed set to: "; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "9057"; */ "9057.title" = "8x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "9058"; */ "9058.title" = "6x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "9059"; */ "9059.title" = "4x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "9060"; */ "9060.title" = "2x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "9061"; */ "9061.title" = "10x"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "9062"; */ "9062.title" = "0x"; /* Class = "NSBox"; title = "Frame Jump Properties"; ObjectID = "9071"; */ "9071.title" = "Frame Jump Properties"; /* Class = "NSBox"; title = "Execution Speed Properties"; ObjectID = "9072"; */ "9072.title" = "Execution Speed Properties"; /* Class = "NSButtonCell"; title = "Normal Speed"; ObjectID = "9076"; */ "9076.title" = "Normal Speed"; /* Class = "NSMenuItem"; title = "Pause"; ObjectID = "9084"; */ "9084.title" = "Pause"; /* Class = "NSTextFieldCell"; title = "Frame:"; ObjectID = "9088"; */ "9088.title" = "Frame:"; /* Class = "NSTextFieldCell"; placeholderString = "statusText"; ObjectID = "9090"; */ "9090.placeholderString" = "statusText"; /* Class = "NSWindow"; title = "InputSettingsNDSInput"; ObjectID = "9104"; */ "9104.title" = "InputSettingsNDSInput"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "9107"; */ "9107.placeholderString" = "Device Info Summary"; /* Class = "NSButtonCell"; title = "Turbo"; ObjectID = "9110"; */ "9110.title" = "Turbo"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "9114"; */ "9114.title" = "Cancel"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "9115"; */ "9115.title" = "OK"; /* Class = "NSMenuItem"; title = "2xBRZ"; ObjectID = "9129"; */ "9129.title" = "2xBRZ"; /* Class = "NSMenuItem"; title = "3xBRZ"; ObjectID = "9131"; */ "9131.title" = "3xBRZ"; /* Class = "NSMenuItem"; title = "4xBRZ"; ObjectID = "9133"; */ "9133.title" = "4xBRZ"; /* Class = "NSMenuItem"; title = "5xBRZ"; ObjectID = "9135"; */ "9135.title" = "5xBRZ"; /* Class = "NSMenuItem"; title = "Open Replay..."; ObjectID = "9137"; */ "9137.title" = "Open Replay..."; /* Class = "NSMenuItem"; title = "Start Replay Recording..."; ObjectID = "9139"; */ "9139.title" = "Start Replay Recording..."; /* Class = "NSMenuItem"; title = "Stop Replay"; ObjectID = "9140"; */ "9140.title" = "Stop Replay"; /* Class = "NSMenuItem"; title = "2xBRZ"; ObjectID = "9144"; */ "9144.title" = "2xBRZ"; /* Class = "NSMenuItem"; title = "3xBRZ"; ObjectID = "9146"; */ "9146.title" = "3xBRZ"; /* Class = "NSMenuItem"; title = "4xBRZ"; ObjectID = "9148"; */ "9148.title" = "4xBRZ"; /* Class = "NSMenuItem"; title = "5xBRZ"; ObjectID = "9150"; */ "9150.title" = "5xBRZ"; /* Class = "NSButton"; ibShadowedToolTip = "When set, fragment colors will be sampled using an alternate algorithm. This may fix certain graphical glitches, such as the text in some Atlus games like Etrian Odyssey III."; ObjectID = "9152"; */ "9152.ibShadowedToolTip" = "When set, fragment colors will be sampled using an alternate algorithm. This may fix certain graphical glitches, such as the text in some Atlus games like Etrian Odyssey III."; /* Class = "NSButtonCell"; title = "Enable Fragment Sampling Hack"; ObjectID = "9153"; */ "9153.title" = "Enable Fragment Sampling Hack"; /* Class = "NSButton"; ibShadowedToolTip = "When set, fragment colors will be sampled using an alternate algorithm. This may fix certain graphical glitches, such as the text in some Atlus games like Etrian Odyssey III."; ObjectID = "9156"; */ "9156.ibShadowedToolTip" = "When set, fragment colors will be sampled using an alternate algorithm. This may fix certain graphical glitches, such as the text in some Atlus games like Etrian Odyssey III."; /* Class = "NSButtonCell"; title = "Enable Fragment Sampling Hack"; ObjectID = "9157"; */ "9157.title" = "Enable Fragment Sampling Hack"; /* Class = "NSPopUpButton"; ibShadowedToolTip = "Sets the default output filter for new NDS display views. No CPU usage. The use of any output filter (other than Nearest Neighbor and Bilinear) requires the use of your GPU."; ObjectID = "9184"; */ "9184.ibShadowedToolTip" = "Sets the default output filter for new NDS display views. No CPU usage. The use of any output filter (other than Nearest Neighbor and Bilinear) requires the use of your GPU."; /* Class = "NSTextFieldCell"; title = "Output Filter:"; ObjectID = "9186"; */ "9186.title" = "Output Filter:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "9188"; */ "9188.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Lanczos3"; ObjectID = "9195"; */ "9195.title" = "Lanczos3"; /* Class = "NSMenuItem"; title = "Lanczos2"; ObjectID = "9206"; */ "9206.title" = "Lanczos2"; /* Class = "NSMenuItem"; title = "Bicubic (Mitchell-Netravali)"; ObjectID = "9208"; */ "9208.title" = "Bicubic (Mitchell-Netravali)"; /* Class = "NSMenuItem"; title = "Bicubic (B-Spline)"; ObjectID = "9209"; */ "9209.title" = "Bicubic (B-Spline)"; /* Class = "NSMenuItem"; title = "Bilinear"; ObjectID = "9210"; */ "9210.title" = "Bilinear"; /* Class = "NSMenuItem"; title = "Nearest Neighbor"; ObjectID = "9211"; */ "9211.title" = "Nearest Neighbor"; /* Class = "NSBox"; title = "Source Filters"; ObjectID = "9236"; */ "9236.title" = "Source Filters"; /* Class = "NSButton"; ibShadowedToolTip = "When set, helps to preserve the color gradations of the video. This can compensate for poor color blending from the original 16-bit NDS color palette, or for posterization caused by certain filters. No CPU usage, but requires the use of your GPU."; ObjectID = "9237"; */ "9237.ibShadowedToolTip" = "When set, helps to preserve the color gradations of the video. This can compensate for poor color blending from the original 16-bit NDS color palette, or for posterization caused by certain filters. No CPU usage, but requires the use of your GPU."; /* Class = "NSButtonCell"; title = "Deposterize"; ObjectID = "9238"; */ "9238.title" = "Deposterize"; /* Class = "NSButton"; ibShadowedToolTip = "When set, filters will prefer to run on the GPU if possible. Otherwise, filters will prefer to run on the CPU if possible."; ObjectID = "9257"; */ "9257.ibShadowedToolTip" = "When set, filters will prefer to run on the GPU if possible. Otherwise, filters will prefer to run on the CPU if possible."; /* Class = "NSButtonCell"; title = "Run filters on GPU if possible"; ObjectID = "9258"; */ "9258.title" = "Run filters on GPU if possible"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Renders 3D on 16 separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; ObjectID = "9259"; */ "9259.ibShadowedToolTip" = "Renders 3D on 16 separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "16 Threads"; ObjectID = "9259"; */ "9259.title" = "16 Threads"; /* Class = "NSMenuItem"; ibShadowedToolTip = "Renders 3D on 32 separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; ObjectID = "9260"; */ "9260.ibShadowedToolTip" = "Renders 3D on 32 separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "32 Threads"; ObjectID = "9260"; */ "9260.title" = "32 Threads"; /* Class = "NSMenuItem"; title = "Video Source Filters"; ObjectID = "9262"; */ "9262.title" = "Video Source Filters"; /* Class = "NSMenu"; title = "Video Source Filters"; ObjectID = "9263"; */ "9263.title" = "Video Source Filters"; /* Class = "NSMenuItem"; title = "Deposterize"; ObjectID = "9264"; */ "9264.title" = "Deposterize"; /* Class = "NSMenuItem"; title = "Video Output Filter"; ObjectID = "9265"; */ "9265.title" = "Video Output Filter"; /* Class = "NSMenu"; title = "Video Output Filter"; ObjectID = "9266"; */ "9266.title" = "Video Output Filter"; /* Class = "NSMenuItem"; title = "Nearest Neighbor"; ObjectID = "9267"; */ "9267.title" = "Nearest Neighbor"; /* Class = "NSMenuItem"; title = "Show Video Settings& "; ObjectID = "9269"; */ "9269.title" = "Show Video Settings& "; /* Class = "NSMenuItem"; title = "Bilinear"; ObjectID = "9270"; */ "9270.title" = "Bilinear"; /* Class = "NSMenuItem"; title = "Bicubic (B-Spline)"; ObjectID = "9271"; */ "9271.title" = "Bicubic (B-Spline)"; /* Class = "NSMenuItem"; title = "Bicubic (Mitchell-Netravali)"; ObjectID = "9272"; */ "9272.title" = "Bicubic (Mitchell-Netravali)"; /* Class = "NSMenuItem"; title = "Lanczos2"; ObjectID = "9273"; */ "9273.title" = "Lanczos2"; /* Class = "NSMenuItem"; title = "Lanczos3"; ObjectID = "9274"; */ "9274.title" = "Lanczos3"; /* Class = "NSButton"; ibShadowedToolTip = "When set, filters will prefer to run on the GPU if possible. Otherwise, filters will prefer to run on the CPU if possible."; ObjectID = "9276"; */ "9276.ibShadowedToolTip" = "When set, filters will prefer to run on the GPU if possible. Otherwise, filters will prefer to run on the CPU if possible."; /* Class = "NSButtonCell"; title = "Run filters on GPU if possible"; ObjectID = "9277"; */ "9277.title" = "Run filters on GPU if possible"; /* Class = "NSBox"; title = "Source Filters"; ObjectID = "9278"; */ "9278.title" = "Source Filters"; /* Class = "NSBox"; title = "Output Filter"; ObjectID = "9279"; */ "9279.title" = "Output Filter"; /* Class = "NSButton"; ibShadowedToolTip = "When set, helps to preserve the color gradations of the video. This can compensate for poor color blending from the original 16-bit NDS color palette, or for posterization caused by certain filters. No CPU usage, but requires the use of your GPU."; ObjectID = "9280"; */ "9280.ibShadowedToolTip" = "When set, helps to preserve the color gradations of the video. This can compensate for poor color blending from the original 16-bit NDS color palette, or for posterization caused by certain filters. No CPU usage, but requires the use of your GPU."; /* Class = "NSButtonCell"; title = "Deposterize"; ObjectID = "9281"; */ "9281.title" = "Deposterize"; /* Class = "NSButtonCell"; title = "Nearest Neighbor"; ObjectID = "9283"; */ "9283.title" = "Nearest Neighbor"; /* Class = "NSButtonCell"; title = "Bilinear"; ObjectID = "9284"; */ "9284.title" = "Bilinear"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "9285"; */ "9285.title" = "Radio"; /* Class = "NSButtonCell"; title = "Bicubic (B-Spline)"; ObjectID = "9286"; */ "9286.title" = "Bicubic (B-Spline)"; /* Class = "NSButtonCell"; title = "Bicubic (Mitchell)"; ObjectID = "9287"; */ "9287.title" = "Bicubic (Mitchell)"; /* Class = "NSButtonCell"; title = "Lanczos2"; ObjectID = "9288"; */ "9288.title" = "Lanczos2"; /* Class = "NSButtonCell"; title = "Lanczos3"; ObjectID = "9289"; */ "9289.title" = "Lanczos3"; /* Class = "NSTextFieldCell"; title = "Rendering Threads:"; ObjectID = "9291"; */ "9291.title" = "Rendering Threads:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "9294"; */ "9294.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Automatic"; ObjectID = "9295"; */ "9295.title" = "Automatic"; /* Class = "NSMenuItem"; title = "Single-Threaded"; ObjectID = "9296"; */ "9296.title" = "Single-Threaded"; /* Class = "NSMenuItem"; title = "2 Threads"; ObjectID = "9297"; */ "9297.title" = "2 Threads"; /* Class = "NSMenuItem"; title = "4 Threads"; ObjectID = "9299"; */ "9299.title" = "4 Threads"; /* Class = "NSMenuItem"; title = "8 Threads"; ObjectID = "9300"; */ "9300.title" = "8 Threads"; /* Class = "NSMenuItem"; title = "16 Threads"; ObjectID = "9301"; */ "9301.title" = "16 Threads"; /* Class = "NSMenuItem"; title = "32 Threads"; ObjectID = "9302"; */ "9302.title" = "32 Threads"; /* Class = "NSWindow"; title = "GDB Stub Control"; ObjectID = "9389"; */ "9389.title" = "GDB Stub Control"; /* Class = "NSButtonCell"; title = "Enable for ARM9"; ObjectID = "9400"; */ "9400.title" = "Enable for ARM9"; /* Class = "NSButtonCell"; title = "Enable for ARM7"; ObjectID = "9401"; */ "9401.title" = "Enable for ARM7"; /* Class = "NSTextFieldCell"; title = "Port:"; ObjectID = "9402"; */ "9402.title" = "Port:"; /* Class = "NSTextFieldCell"; title = "Port:"; ObjectID = "9403"; */ "9403.title" = "Port:"; /* Class = "NSMenuItem"; title = "Show GDB Stub Control..."; ObjectID = "9409"; */ "9409.title" = "Show GDB Stub Control..."; /* Class = "NSButtonCell"; alternateTitle = "Stop"; ObjectID = "9425"; */ "9425.alternateTitle" = "Stop"; /* Class = "NSButtonCell"; title = "Start"; ObjectID = "9425"; */ "9425.title" = "Start"; /* Class = "NSTextFieldCell"; title = "Storage Directory Path:"; ObjectID = "9526"; */ "9526.title" = "Storage Directory Path:"; /* Class = "NSBox"; title = "NDS Slot Status"; ObjectID = "9633"; */ "9633.title" = "NDS Slot Status"; /* Class = "NSBox"; title = "R4 Device Setup"; ObjectID = "9634"; */ "9634.title" = "R4 Device Setup"; /* Class = "NSMenuItem"; title = "ROM Info"; ObjectID = "9636"; */ "9636.title" = "ROM Info"; /* Class = "NSMenuItem"; title = "Reveal ROM in Finder"; ObjectID = "9637"; */ "9637.title" = "Reveal ROM in Finder"; /* Class = "NSMenuItem"; title = "Import ROM Save File..."; ObjectID = "9639"; */ "9639.title" = "Import ROM Save File..."; /* Class = "NSMenuItem"; title = "Export ROM Save File..."; ObjectID = "9640"; */ "9640.title" = "Export ROM Save File..."; /* Class = "NSMenuItem"; title = "ROM Save Type"; ObjectID = "9642"; */ "9642.title" = "ROM Save Type"; /* Class = "NSMenu"; title = "ROM Save Type"; ObjectID = "9643"; */ "9643.title" = "ROM Save Type"; /* Class = "NSMenuItem"; title = "FLASH 512Mb"; ObjectID = "9644"; */ "9644.title" = "FLASH 512Mb"; /* Class = "NSMenuItem"; title = "FLASH 256Mb"; ObjectID = "9645"; */ "9645.title" = "FLASH 256Mb"; /* Class = "NSMenuItem"; title = "FLASH 128Mb"; ObjectID = "9646"; */ "9646.title" = "FLASH 128Mb"; /* Class = "NSMenuItem"; title = "FLASH 64Mb"; ObjectID = "9647"; */ "9647.title" = "FLASH 64Mb"; /* Class = "NSMenuItem"; title = "FLASH 32Mb"; ObjectID = "9648"; */ "9648.title" = "FLASH 32Mb"; /* Class = "NSMenuItem"; title = "FLASH 16Mb"; ObjectID = "9649"; */ "9649.title" = "FLASH 16Mb"; /* Class = "NSMenuItem"; title = "FLASH 8Mb"; ObjectID = "9650"; */ "9650.title" = "FLASH 8Mb"; /* Class = "NSMenuItem"; title = "FLASH 4Mb"; ObjectID = "9651"; */ "9651.title" = "FLASH 4Mb"; /* Class = "NSMenuItem"; title = "FLASH 2Mb"; ObjectID = "9652"; */ "9652.title" = "FLASH 2Mb"; /* Class = "NSMenuItem"; title = "FRAM 256Kb"; ObjectID = "9653"; */ "9653.title" = "FRAM 256Kb"; /* Class = "NSMenuItem"; title = "EEPROM 512Kb"; ObjectID = "9654"; */ "9654.title" = "EEPROM 512Kb"; /* Class = "NSMenuItem"; title = "EEPROM 64Kb"; ObjectID = "9655"; */ "9655.title" = "EEPROM 64Kb"; /* Class = "NSMenuItem"; title = "EEPROM 4Kb"; ObjectID = "9656"; */ "9656.title" = "EEPROM 4Kb"; /* Class = "NSMenuItem"; title = "Automatic"; ObjectID = "9658"; */ "9658.title" = "Automatic"; /* Class = "NSWindow"; title = "Game Data Migration Assistant"; ObjectID = "9705"; */ "9705.title" = "Game Data Migration Assistant"; /* Class = "NSTextFieldCell"; title = "Game data from previous versions of DeSmuME were found. Would you like to migrate your previous game data to work with this version?"; ObjectID = "9716"; */ "9716.title" = "Game data from previous versions of DeSmuME were found. Would you like to migrate your previous game data to work with this version?"; /* Class = "NSTextFieldCell"; title = "Game data from previous versions may not be fully compatible with the current version, especially Save States. Game data migration cannot guarantee that all your old game data will continue to work."; ObjectID = "9717"; */ "9717.title" = "Game data from previous versions may not be fully compatible with the current version, especially Save States. Game data migration cannot guarantee that all your old game data will continue to work."; /* Class = "NSButtonCell"; title = "Migrate By Moving"; ObjectID = "9732"; */ "9732.title" = "Migrate By Moving"; /* Class = "NSButtonCell"; title = "Don't Migrate"; ObjectID = "9733"; */ "9733.title" = "Don't Migrate"; /* Class = "NSButtonCell"; title = "Do not ask on startup"; ObjectID = "9734"; */ "9734.title" = "Do not ask on startup"; /* Class = "NSButtonCell"; title = "Migrate By Copying"; ObjectID = "9735"; */ "9735.title" = "Migrate By Copying"; /* Class = "NSTableColumn"; headerCell.title = "File Name"; ObjectID = "9757"; */ "9757.headerCell.title" = "File Name"; /* Class = "NSTableColumn"; headerCell.title = "Kind"; ObjectID = "9758"; */ "9758.headerCell.title" = "Kind"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "9759"; */ "9759.title" = "Text Cell"; /* Class = "NSTableColumn"; headerCell.title = "Date Modified"; ObjectID = "9763"; */ "9763.headerCell.title" = "Date Modified"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "9764"; */ "9764.title" = "Text Cell"; /* Class = "NSButtonCell"; title = "File Name"; ObjectID = "9776"; */ "9776.title" = "File Name"; /* Class = "NSTextFieldCell"; title = "All of your game data is up to date."; ObjectID = "9778"; */ "9778.title" = "All of your game data is up to date."; /* Class = "NSTextFieldCell"; title = "All of your previous game data already exists in this version of DeSmuME. No migration is needed."; ObjectID = "9780"; */ "9780.title" = "All of your previous game data already exists in this version of DeSmuME. No migration is needed."; /* Class = "NSBox"; title = "Box"; ObjectID = "9796"; */ "9796.title" = "Box"; /* Class = "NSTextFieldCell"; title = "Titles"; ObjectID = "9798"; */ "9798.title" = "Titles"; /* Class = "NSBox"; title = "Box"; ObjectID = "9806"; */ "9806.title" = "Box"; /* Class = "NSTextFieldCell"; title = "ARM9 & ARM7 Binaries"; ObjectID = "9810"; */ "9810.title" = "ARM9 & ARM7 Binaries"; /* Class = "NSBox"; title = "Box"; ObjectID = "9812"; */ "9812.title" = "Box"; /* Class = "NSTextFieldCell"; title = "File System"; ObjectID = "9817"; */ "9817.title" = "File System"; /* Class = "NSBox"; title = "Box"; ObjectID = "9818"; */ "9818.title" = "Box"; /* Class = "NSTextFieldCell"; title = "Miscellaneous"; ObjectID = "9823"; */ "9823.title" = "Miscellaneous"; /* Class = "NSBox"; title = "Box"; ObjectID = "9829"; */ "9829.title" = "Box"; /* Class = "NSTextFieldCell"; title = "General"; ObjectID = "9858"; */ "9858.title" = "General"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "9867"; */ "9867.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Remaining:"; ObjectID = "9868"; */ "9868.title" = "Remaining:"; /* Class = "NSTextFieldCell"; placeholderString = "unitCode"; ObjectID = "9872"; */ "9872.placeholderString" = "unitCode"; /* Class = "NSTextFieldCell"; title = "Kind: "; ObjectID = "9873"; */ "9873.title" = "Kind: "; /* Class = "NSWindow"; title = "Microphone Settings"; ObjectID = "9946"; */ "9946.title" = "Microphone Settings"; /* Class = "NSMenuItem"; title = "Show Microphone Settings..."; ObjectID = "9959"; */ "9959.title" = "Show Microphone Settings..."; /* Class = "NSTextFieldCell"; title = "Name:"; ObjectID = "9962"; */ "9962.title" = "Name:"; /* Class = "NSTextFieldCell"; title = "Manufacturer:"; ObjectID = "9964"; */ "9964.title" = "Manufacturer:"; /* Class = "NSTextFieldCell"; title = "Sample Rate:"; ObjectID = "9966"; */ "9966.title" = "Sample Rate:"; /* Class = "NSBox"; title = "Host Device Information"; ObjectID = "9967"; */ "9967.title" = "Host Device Information"; /* Class = "NSTextFieldCell"; title = "0%"; ObjectID = "9971"; */ "9971.title" = "0%"; /* Class = "NSTextFieldCell"; title = "25%"; ObjectID = "9973"; */ "9973.title" = "25%"; /* Class = "NSTextFieldCell"; title = "50%"; ObjectID = "9975"; */ "9975.title" = "50%"; /* Class = "NSTextFieldCell"; title = "75%"; ObjectID = "9977"; */ "9977.title" = "75%"; /* Class = "NSTextFieldCell"; title = "100%"; ObjectID = "9979"; */ "9979.title" = "100%"; /* Class = "NSTextFieldCell"; title = "Gain:"; ObjectID = "9981"; */ "9981.title" = "Gain:"; /* Class = "NSButtonCell"; title = "Input Preferences"; ObjectID = "9985"; */ "9985.title" = "Input Preferences"; /* Class = "NSTextFieldCell"; placeholderString = "deviceSampleRate"; ObjectID = "9990"; */ "9990.placeholderString" = "deviceSampleRate"; /* Class = "NSTextFieldCell"; placeholderString = "deviceManufacturer"; ObjectID = "9991"; */ "9991.placeholderString" = "deviceManufacturer"; /* Class = "NSTextFieldCell"; placeholderString = "deviceName"; ObjectID = "9992"; */ "9992.placeholderString" = "deviceName"; /* Class = "NSTextFieldCell"; title = "NDS Microphone Level:"; ObjectID = "9994"; */ "9994.title" = "NDS Microphone Level:"; /* Class = "NSButtonCell"; title = "Mute"; ObjectID = "10004"; */ "10004.title" = "Mute"; /* Class = "NSTextFieldCell"; placeholderString = "%1.1f%%"; ObjectID = "10005"; */ "10005.placeholderString" = "%1.1f%%"; /* Class = "NSTextFieldCell"; title = "You can also generate audio samples in software and send them to the NDS. You can configure this with the Microphone command in your Input Preferences."; ObjectID = "10014"; */ "10014.title" = "You can also generate audio samples in software and send them to the NDS. You can configure this with the Microphone command in your Input Preferences."; /* Class = "NSBox"; title = "Box"; ObjectID = "10015"; */ "10015.title" = "Box"; desmume-0.9.11/src/cocoa/translations/English.lproj/MainMenu.xib0000755000000000000000001233455012467662066023325 0ustar rootroot 1050 14C1510 6751 1344.72 757.30 com.apple.InterfaceBuilder.CocoaPlugin 6751 NSArrayController NSBox NSButton NSButtonCell NSCustomObject NSCustomView NSDatePicker NSDatePickerCell NSDrawer NSImageCell NSImageView NSLevelIndicator NSLevelIndicatorCell NSMatrix NSMenu NSMenuItem NSNumberFormatter NSObjectController NSOutlineView NSPopUpButton NSPopUpButtonCell NSProgressIndicator NSScrollView NSScroller NSSearchField NSSearchFieldCell NSSlider NSSliderCell NSStepper NSStepperCell NSTabView NSTabViewItem NSTableColumn NSTableHeaderView NSTableView NSTextField NSTextFieldCell NSTextView NSToolbar NSToolbarFlexibleSpaceItem NSToolbarItem NSToolbarSpaceItem NSUserDefaultsController NSView NSWindowTemplate com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion NSApplication FirstResponder NSApplication MainMenu DeSmuME 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: DeSmuME About DeSmuME 2147483647 YES YES 1048576 2147483647 Preferencesâ€Ĥ , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services _NSServicesMenu YES YES 1048576 2147483647 Hide DeSmuME h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit DeSmuME q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File New Display Window n 1048576 2147483647 Load ROMâ€Ĥ o 1048576 2147483647 Load Recent ROM 1048576 2147483647 submenuAction: Load Recent ROM Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close Window w 1048576 2147483647 Unload ROM w 1572864 2147483647 YES YES 2147483647 ROM Info i 1048576 2147483647 Reveal ROM in Finder 2147483647 Reveal Game Data Folder in Finder 2147483647 YES YES 2147483647 Open State File... O 1048576 2147483647 Close State File W 1048576 2147483647 Save State File s 1048576 2147483647 Save State File Asâ€Ĥ S 1179648 2147483647 Revert State File to Saved 2147483647 YES YES 1048576 2147483647 Load State Slot 2147483647 submenuAction: Load State Slot Save State Slot 2147483647 submenuAction: Save State Slot YES YES 2147483647 Open Replay... 2147483647 Start Replay Recording... 2147483647 Stop Replay 2147483647 YES YES 2147483647 Import ROM Save File... 2147483647 Export ROM Save File... 2147483647 Edit 2147483647 submenuAction: Edit Undo z 1048576 2147483647 Redo Z 1048576 2147483647 YES YES 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 2147483647 Select All a 1048576 2147483647 Emulation 2147483647 submenuAction: Emulation Show Execution Control... 2147483647 YES YES 2147483647 Execute 2147483647 Pause 2147483647 Frame Advance 2147483647 Frame Jump 2147483647 YES YES 2147483647 Reset 2147483647 YES YES 2147483647 Disable Auto Frame Skip 2147483647 YES YES 2147483647 Show Cheat Manager... 2147483647 Disable Cheats 2147483647 YES YES 2147483647 Show SLOT-1 Manager... 2147483647 Show SLOT-2 Manager... 2147483647 YES YES 2147483647 Show Emulation Settings... 2147483647 Show 3D Rendering Settings... 2147483647 Show Microphone Settings... 2147483647 Show Sound Settings... 2147483647 YES YES 2147483647 ROM Save Type 2147483647 submenuAction: ROM Save Type Automatic 2147483647 YES YES 2147483647 -1 EEPROM 4Kb 2147483647 1 EEPROM 64Kb 2147483647 2 EEPROM 512Kb 2147483647 3 FRAM 256Kb 2147483647 4 FLASH 2Mb 2147483647 5 FLASH 4Mb 2147483647 6 FLASH 8Mb 2147483647 7 FLASH 16Mb 2147483647 8 FLASH 32Mb 2147483647 9 FLASH 64Mb 2147483647 10 FLASH 128Mb 2147483647 11 FLASH 256Mb 2147483647 12 FLASH 512Mb 2147483647 13 View 1048576 2147483647 submenuAction: View Display Mode 2147483647 submenuAction: Display Mode Main 2147483647 Touch 2147483647 1 Dual Screen 2147483647 2 Display Size 2147483647 submenuAction: Display Size 1x 2147483647 100 2x 2147483647 200 3x 2147483647 300 4x 2147483647 400 5x 2147483647 500 Display Rotation 2147483647 submenuAction: Display Rotation Rotate Left 2147483647 -90 Rotate Right 2147483647 90 YES YES 2147483647 0Âş 2147483647 90Âş 2147483647 90 180Âş 2147483647 180 270Âş 2147483647 270 YES YES 2147483647 Custom... 2147483647 -1 Display Orientation 2147483647 submenuAction: Display Orientation Vertical 2147483647 Horizontal 2147483647 1 Display Order 2147483647 submenuAction: Display Order Main Screen First 2147483647 Touch Screen First 2147483647 1 Display Separation 2147483647 submenuAction: Display Separation 0% 2147483647 50% 2147483647 50 100% 2147483647 100 150% 2147483647 150 200% 2147483647 200 YES YES 2147483647 Custom... 2147483647 -1 YES YES 2147483647 Video Source Filters 2147483647 submenuAction: Video Source Filters Deposterize 2147483647 Video Output Filter 2147483647 submenuAction: Video Output Filter Nearest Neighbor 2147483647 Bilinear 2147483647 1 Bicubic (B-Spline) 2147483647 2 Bicubic (Mitchell-Netravali) 2147483647 3 Lanczos2 2147483647 4 Lanczos3 2147483647 5 Video Pixel Scaler 2147483647 submenuAction: Video Pixel Scaler None 2147483647 Nearest 2x 2147483647 11 Scanline 2147483647 9 EPX 2147483647 14 EPX+ 2147483647 15 Super Eagle 2147483647 8 2xSaI 2147483647 6 Super 2xSaI 2147483647 7 LQ2x 2147483647 1 LQ2xS 2147483647 2 HQ2x 2147483647 3 HQ2xS 2147483647 4 HQ4x 2147483647 5 HQ4xS 2147483647 18 2xBRZ 2147483647 19 3xBRZ 2147483647 20 4xBRZ 2147483647 21 5xBRZ 2147483647 22 Show Video Settingsâ€Ĥ 2147483647 YES YES 2147483647 Enter Full Screen f 1310720 2147483647 Keep Minimum Display Size at 1x 2147483647 Show Status Bar / 1048576 2147483647 YES YES 2147483647 Show Toolbar t 1572864 2147483647 Customize Toolbarâ€Ĥ 1048576 2147483647 YES YES 2147483647 Toggle All Displays t 1048576 2147483647 Tools 2147483647 submenuAction: Tools Save Screenshot As... 2147483647 YES YES 2147483647 Show GPU Layers... 2147483647 YES YES 2147483647 Show GDB Stub Control... 2147483647 Window 1048576 2147483647 submenuAction: Window Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 2147483647 submenuAction: Help DeSmuME Help ? 1048576 2147483647 YES YES 2147483647 Go to Website... 2147483647 Go to Forums... 2147483647 Submit a Support Request... 2147483647 Submit a Bug Report... 2147483647 _NSHelpMenu _NSMainMenu AppDelegate EmuControllerDelegate InputManager 15 2 {{53, 296}, {550, 450}} 1148716032 About DeSmuME NSWindow 256 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 302}, {128, 128}} YES 134217728 33554432 NSImage NSApplicationIcon 0 1 0 NO NO YES 274 {{13, 10}, {524, 290}} 1 274 274 2322 2322 {490, 244} 38 490 1 67119109 0 3 MQA 6 System selectedTextBackgroundColor 3 MC42NjY2NjY2NjY3AA 6 System selectedTextColor 3 MAA 6 System controlTextColor 1 MCAwIDEAA {8, -8} 13 1 6 {505, 10000000} {490, 244} {4, 5} 79691776 file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff 3 MCAwAA 2 YES 256 {{490, 0}, {15, 244}} NO _doScroller: _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 133136 0.25 4 1 {{10, 33}, {504, 244}} Read Me 6 System controlColor 2 256 274 2304 2322 {490, 244} 38 490 1 67119109 0 1 6 {490, 10000000} {490, 244} 2 YES 256 {{490, 0}, {15, 244}} NO _doScroller: _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 133136 0.25 4 1 {{10, 33}, {504, 244}} License Item 2 256 274 2304 2322 {490, 244} 38 490 1 67119109 0 1 6 {490, 10000000} {490, 244} 2 YES 256 {{490, 0}, {15, 244}} NO _doScroller: _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 133136 0.25 4 1 {{10, 33}, {504, 244}} Authors Item 3 256 274 2304 2322 {490, 244} 38 490 1 67119109 0 1 6 {490, 10000000} {490, 244} 2 YES 256 {{490, 0}, {15, 244}} NO _doScroller: _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 133136 0.25 4 1 {{10, 33}, {504, 244}} Change Log YES 13 1044 0 YES YES 270 {{153, 374}, {380, 56}} YES 69206017 4198400 App Description NO 1 270 {{156, 302}, {374, 64}} YES 73400321 4329472 YES 11 3100 Build Info YES NO 1 {550, 450} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 7 2 {{94, 633}, {400, 100}} 1685588992 DeSmuME Preferences NSWindow 7F8262D5-9D3C-423C-B7C5-79385DDE5A70 YES YES NO NO 1 1 8DD2F943-8717-4EC3-A3C5-30068405F029 Input Input NSImage Icon_Input_420x420 {0, 0} {0, 0} YES YES -1 YES 0 A9C4AA28-77F8-4AD3-96D8-A67306997B4C General General NSImage NSPreferencesGeneral {0, 0} {0, 0} YES YES -1 YES 0 AC584A31-E187-4BC3-9981-D18A2C8553F7 Emulation Emulation NSImage Icon_Emulation_420x420 {0, 0} {0, 0} YES YES -1 YES 0 C9B4F2D8-9F6E-4ED5-84C7-E13EB3484A3A Sound Sound NSImage Icon_Speaker_420x420 {0, 0} {0, 0} YES YES -1 YES 0 E30B98EC-D044-488C-A4E0-5BCE53366462 Display Display NSImage Icon_ShowHUD_420x420 {0, 0} {0, 0} YES YES -1 YES 0 NSToolbarFlexibleSpaceItem Flexible Space {1, 5} {20000, 32} YES YES -1 YES 0 YES YES 1048576 2147483647 NSToolbarSpaceItem Space {32, 5} {32, 10000} YES YES -1 YES 0 YES YES 1048576 2147483647 256 {400, 100} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 268 12 274 268 {{175, 50}, {199, 21}} YES 613417024 272634880 File Name NO 1 268 {{376, 43}, {96, 32}} YES 67108864 134217728 Choose... -2038284288 129 200 25 NO 268 {{15, 53}, {155, 17}} YES 68157504 71304192 ADVANsCEne Database: NO 1 268 {{15, 14}, {454, 28}} YES 69206017 138543104 WW91IGNhbiBkb3dubG9hZCB0aGUgbGF0ZXN0IEFEVkFOc0NFbmUgRGF0YWJhc2UgZnJvbToKaHR0cDov L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA NO 1 {{1, 1}, {484, 81}} {{17, 16}, {486, 97}} {0, 0} 67108864 0 ADVANsCEne Database 6 System textBackgroundColor 6 System labelColor 1 0 2 NO 12 274 268 {{148, 14}, {226, 21}} YES 613417024 272634880 File Name NO 1 268 {{376, 7}, {96, 32}} YES 67108864 134217728 Choose... -2038284288 129 200 25 NO 268 {{15, 17}, {128, 17}} YES 68157504 71304192 R4 Cheat Database: NO 1 {{1, 1}, {484, 45}} {{17, 117}, {486, 61}} {0, 0} 67108864 0 Cheat Configuration 1 0 2 NO 12 274 268 {{63, 12}, {371, 18}} YES 67108864 0 Do not show Game Data Migration Assistant on startup 1211912448 2 NSImage NSSwitch NSSwitch 200 25 NO 268 {{114, 33}, {270, 32}} YES 67108864 134217728 Show Game Data Migration Assistant -2038284288 129 200 25 NO {{1, 1}, {484, 75}} {{17, 182}, {486, 91}} {0, 0} 67108864 0 User File Migration 1 0 2 NO 12 274 268 {{16, 40}, {366, 18}} YES -2080374784 0 Automatically execute emulation when loading a ROM 1211912448 2 200 25 NO 268 {{16, 84}, {247, 18}} YES -2080374784 0 Restore display windows on startup 1211912448 2 200 25 NO 268 {{273, 10}, {196, 26}} YES -2076180416 2048 109199360 129 400 75 None 2147483647 1 _popUpItemAction: 10000 YES OtherViews Last Loaded ROM 2147483647 _popUpItemAction: YES No ROM chosen. 2147483647 _popUpItemAction: 1 YES YES 2147483647 _popUpItemAction: -1 Choose ROM... 2147483647 NSImage NSActionTemplate _popUpItemAction: 10001 1 YES YES 2 NO 268 {{15, 16}, {256, 17}} _NS:4068 YES 68157504 272630784 Automatically load this ROM on startup: _NS:4068 NO 1 268 {{16, 62}, {216, 18}} _NS:682 YES -2080374784 0 Only load ROM data as needed _NS:682 1211912448 2 200 25 NO {{1, 1}, {484, 109}} {{17, 277}, {486, 125}} {0, 0} 67108864 0 General Behavior 1 0 2 NO {520, 422} NSView 268 268 {{96, 463}, {97, 17}} YES 68157504 71304192 Saved Profiles: NO 1 268 {{195, 457}, {265, 26}} YES -2076180416 2048 109199360 129 400 75 New... 2147483647 1 _popUpItemAction: -1 YES InputConfigurationMenu YES YES 2147483647 _popUpItemAction: YES 1 1 YES YES 2 NO 268 {{462, 457}, {116, 26}} YES -2076180416 134219776 -2038284288 129 LucidaGrande 13 16 400 75 YES Actions 1048576 2147483647 1 _popUpItemAction: YES OtherViews View 2147483647 _popUpItemAction: Apply 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: YES Rename 2147483647 _popUpItemAction: YES Save 1048576 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: YES Delete 1048576 2147483647 _popUpItemAction: YES YES 1 YES YES 2 NO 274 2322 256 {640, 394} YES NO YES 256 {640, 17} -2147483392 {{584, 0}, {16, 17}} InputCommandTagColumn 155 16 1000 75497536 2048 Set Command 3 MC4zMzMzMzI5ODU2AA 6 System headerTextColor 68157504 132096 Command -2034483200 100 200 25 3 YES InputDeviceColumn 175 10 3.4028234663852886e+38 75497536 2048 Input Device 6 System headerColor 70254657 136192 Text Cell 6 System controlBackgroundColor 3 YES InputSettingsSummaryColumn 136 10 3.4028234663852886e+38 75497536 2048 Input Settings Summary 70254657 136192 Text Cell 3 YES InputSettingsColumn 69 10 3.4028234663852886e+38 75497536 2048 605028416 134349824 Settings -2035007488 36 200 25 RemoveInputColumn 67 10 3.4028234663852886e+38 75497536 2048 68157504 134349824 Remove -2035007488 36 200 25 3 2 6 System gridColor 3 MC41AA 17 1402994688 InputPreferences 0 15 0 NO 0 1 NO YES {{1, 17}, {640, 394}} 4 YES 2338 {{1, 0}, {640, 17}} YES -2147483392 {{584, 17}, {15, 102}} NO _doScroller: _doScroller: 0.96411483253588515 -2147483392 {{1, 420}, {624, 15}} NO _doScroller: 1 _doScroller: 0.99843505477308292 {{-1, 37}, {642, 412}} 133682 QSAAAEEgAABBmAAAQZgAAA 0.25 4 1 {{197, 12}, {247, 17}} YES 605028416 171971584 Click this area to map mouse input. YES 13 2072 NO 1 {640, 495} InputPrefsView 268 268 {{13, 10}, {463, 412}} 1 274 12 274 268 {{72, 44}, {84, 17}} YES 68157504 71304192 Display Size: NO 1 268 {{44, 16}, {112, 17}} YES 68157504 71304192 Display Rotation: NO 1 268 {{158, 38}, {126, 26}} YES -2076180416 2048 109199360 129 400 75 1x 2147483647 1 _popUpItemAction: 100 YES OtherViews 2x 2147483647 _popUpItemAction: 200 3x 2147483647 _popUpItemAction: 300 4x 2147483647 _popUpItemAction: 400 5x 2147483647 _popUpItemAction: 500 1 YES YES 2 NO 268 {{289, 14}, {72, 22}} YES -1804599231 71304192 -∞ #0.##Âş +∞ #0.##Âş #0.##Âş NaN 3 YES YES YES . , NO NO YES YES 6 System textColor NO 1 268 {{63, 72}, {93, 17}} YES 68157504 71304192 Display Mode: NO 1 268 {{158, 66}, {126, 26}} YES -2076180416 2048 109199360 129 400 75 Dual Screen 2147483647 1 _popUpItemAction: 2 YES OtherViews Main 2147483647 _popUpItemAction: Touch 2147483647 _popUpItemAction: 1 YES 2 1 YES YES 2 NO 268 {{158, 11}, {126, 26}} YES -2076180416 2048 109199360 129 400 75 0Âş 1048576 2147483647 1 _popUpItemAction: YES OtherViews 90Âş 1048576 2147483647 _popUpItemAction: 90 180Âş 1048576 2147483647 _popUpItemAction: 180 270Âş 2147483647 _popUpItemAction: 270 YES YES 2147483647 _popUpItemAction: Custom 2147483647 _popUpItemAction: -1 1 YES YES 2 NO {{1, 1}, {429, 100}} {{6, 217}, {431, 116}} {0, 0} 67108864 0 General Settings 1 0 2 NO 12 274 12 274 268 {{18, 14}, {100, 38}} YES NO 2 1 -2080374784 0 Vertical 1211912448 0 NSRadioButton 200 25 67108864 0 Horizontal 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {100, 18} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 {{1, 1}, {194, 62}} {{15, 53}, {196, 78}} {0, 0} 67108864 0 Display Orientation 1 0 2 NO 12 274 268 {{18, 14}, {150, 38}} YES NO 2 1 -2080374784 0 Main Screen First 1211912448 0 200 25 67108864 0 Touch Screen First 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {150, 18} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 {{1, 1}, {194, 62}} {{218, 53}, {196, 78}} {0, 0} 67108864 0 Display Order 1 0 2 NO 268 {{15, 18}, {126, 17}} YES 68157504 4195328 Display Separation: NO 1 268 {{339, 16}, {72, 22}} YES -1804599231 71304192 #0.#% -∞ #0.#% +∞ #0.#% #0.#% NaN 3 YES YES YES . , NO NO YES YES NO 1 268 {{144, 12}, {189, 26}} YES -2080112384 0 200 0.0 0.0 0.0 5 1 NO NO NO 268 {{305, 38}, {38, 11}} YES 68157504 138675200 200% YES 9 3614 NO 1 268 {{263, 38}, {38, 11}} YES 68157504 138675200 150% NO 1 268 {{220, 38}, {38, 11}} YES 68157504 138675200 100% NO 1 268 {{178, 38}, {38, 11}} YES 68157504 138675200 50% NO 1 268 {{137, 38}, {38, 11}} YES 68157504 138675200 0% NO 1 {{1, 1}, {429, 141}} {{6, 56}, {431, 157}} {0, 0} 67108864 0 Dual Screen Display Layout 1 0 2 NO {{10, 33}, {443, 366}} Display Views 2 274 268 {{167, 270}, {220, 26}} YES -2076180416 2048 109199360 129 400 75 None 2147483647 1 _popUpItemAction: YES OtherViews Nearest 2x 2147483647 _popUpItemAction: 11 Scanline 2147483647 _popUpItemAction: 9 EPX 2147483647 _popUpItemAction: 14 EPX+ 2147483647 _popUpItemAction: 15 Super Eagle 2147483647 _popUpItemAction: 8 2xSaI 2147483647 _popUpItemAction: 6 Super 2xSaI 2147483647 _popUpItemAction: 7 LQ2x 2147483647 _popUpItemAction: 1 LQ2xS 2147483647 _popUpItemAction: 2 HQ2x 2147483647 _popUpItemAction: 3 HQ2xS 2147483647 _popUpItemAction: 4 HQ4x 2147483647 _popUpItemAction: 5 HQ4xS 2147483647 _popUpItemAction: 18 2xBRZ 2147483647 _popUpItemAction: 19 3xBRZ 2147483647 _popUpItemAction: 20 4xBRZ 2147483647 _popUpItemAction: 21 5xBRZ 2147483647 _popUpItemAction: 22 YES 1 YES YES 2 NO 268 {{59, 249}, {106, 17}} YES 68157504 71304192 Preview: NO 1 268 {{59, 276}, {106, 17}} YES 68157504 71304192 Pixel Scaler: NO 1 268 {{167, 297}, {220, 26}} YES -2076180416 2048 109199360 129 400 75 Bilinear 2147483647 1 _popUpItemAction: 1 YES OtherViews Nearest Neighbor 2147483647 _popUpItemAction: Bicubic (B-Spline) 2147483647 _popUpItemAction: 2 Bicubic (Mitchell-Netravali) 2147483647 _popUpItemAction: 3 Lanczos2 2147483647 _popUpItemAction: 4 Lanczos3 2147483647 _popUpItemAction: 5 YES 1 1 YES YES 2 NO 268 {{59, 303}, {106, 17}} YES 68157504 71304192 Output Filter: NO 1 268 {{168, 347}, {129, 18}} YES 67108864 0 Use vertical sync 1211912448 2 200 25 NO 12 274 268 {{16, 192}, {98, 18}} _NS:682 YES 67108864 0 Deposterize _NS:682 1211912448 2 200 25 NO {{1, 1}, {151, 218}} _NS:21 {{6, 6}, {153, 234}} _NS:18 {0, 0} 67108864 0 Source Filters 1 0 2 NO 268 {{168, 327}, {206, 18}} _NS:682 YES -2080374784 0 Run filters on GPU if possible _NS:682 1211912448 2 200 25 NO 268 {{170, 10}, {256, 256}} _NS:1109 DisplayPreviewView {{10, 33}, {443, 366}} Video Settings 0 YES YES {489, 437} NSView 268 268 {{163, 329}, {220, 26}} YES -2076180416 2048 109199360 129 400 75 OS X Core Audio 1048576 2147483647 1 _popUpItemAction: 58325 YES OtherViews None 1048576 2147483647 _popUpItemAction: 1 1 YES YES 2 NO 268 {{17, 335}, {144, 17}} YES 68157504 272630784 Audio Output Engine: NO 1 12 274 268 {{16, 12}, {153, 18}} YES -2080374784 0 Advanced SPU Logic 1211912448 2 200 25 NO {{1, 1}, {364, 38}} {{17, 209}, {366, 54}} {0, 0} 67108864 0 SPU Configuration 1 0 2 NO 12 274 268 {{18, 15}, {180, 46}} YES NO 2 1 67108864 0 Dual SPU Synch/Asynch 1211912448 0 200 25 -2080374784 0 Synchronous 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {180, 18} {4, 10} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 1 268 {{145, 10}, {204, 26}} YES -2076180416 2048 109199360 129 400 75 "N" Method 1048576 2147483647 1 _popUpItemAction: YES OtherViews "Z" Method 1048576 2147483647 _popUpItemAction: 1 "P" Method 1048576 2147483647 _popUpItemAction: 2 1 YES YES 2 NO {{1, 1}, {364, 71}} {{17, 16}, {366, 87}} {0, 0} 67108864 0 SPU Sound Synchronization Method 1 0 2 NO 12 274 268 {{18, 14}, {328, 58}} YES NO 3 1 67108864 0 None 1211912448 0 200 25 67108864 0 Linear 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 -2080374784 0 Cosine 2 1211912448 0 400 75 {328, 18} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 2 {{1, 1}, {364, 82}} {{17, 107}, {366, 98}} {0, 0} 67108864 0 SPU Interpolation Method 1 0 2 NO 12 274 268 {{40, 13}, {246, 21}} YES 67371264 0 100 0.0 100 0.0 0 1 NO NO NO 268 {{287, 17}, {62, 17}} YES 68157504 71308288 -∞ +∞ #0.0% #0.0% NaN 0 0 YES NO 1 AAAAAAAAAAAAAAAAAAAAAA 3 YES YES YES . , NO NO YES %1.1f%% NO 1 289 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{18, 16}, {16, 16}} YES 134217728 33554432 NSImage Icon_VolumeFull_16x16 0 2 0 YES NO YES {{1, 1}, {364, 44}} {{17, 267}, {366, 60}} {0, 0} 67108864 0 General Settings 1 0 2 NO {400, 373} NSView 268 268 {{13, 10}, {528, 388}} 1 274 12 274 268 {{16, 32}, {198, 18}} YES -2080374784 0 Advanced Bus-Level Timing 1211912448 2 200 25 NO 268 {{16, 12}, {217, 18}} YES 67108864 0 Rigorous 3D Rendering Timing 1211912448 2 200 25 NO {{1, 1}, {494, 58}} {{6, 248}, {496, 74}} {0, 0} 67108864 0 Emulation Timing 1 0 2 NO 12 274 268 {{18, 14}, {165, 38}} YES NO 2 1 -2080374784 0 Interpreter 1211912448 0 200 25 67108864 0 Dynamic Recompiler 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {165, 18} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 268 {{242, 15}, {73, 17}} YES 68157504 71304192 Block Size: NO 1 268 {{320, 13}, {50, 22}} YES -1804599231 71304192 -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO YES NO 1 268 {{371, 10}, {19, 27}} YES 67895328 0 12 1 100 1 YES NO {{1, 1}, {494, 62}} {{6, 166}, {496, 78}} {0, 0} 67108864 0 CPU Emulation Engine 1 0 2 NO 12 274 268 {{16, 32}, {146, 18}} YES 67108864 0 Use Debug Console 1211912448 2 200 25 NO 268 {{16, 12}, {118, 18}} YES 67108864 0 Emulate Ensata 1211912448 2 200 25 NO {{1, 1}, {494, 58}} {{6, 88}, {496, 74}} {0, 0} 67108864 0 Debugger Configuration 1 0 2 NO 12 274 268 {{16, 12}, {462, 18}} YES -2080374784 0 Use ADVANsCEne Database when auto-detecting the ROM save type 1211912448 2 200 25 NO {{1, 1}, {494, 38}} {{6, 30}, {496, 54}} {0, 0} 67108864 0 ROM Save Configuration 1 0 2 NO {{10, 33}, {508, 342}} General Settings 2 274 12 274 268 {{16, 117}, {185, 18}} YES 67108864 0 Use External BIOS Images 1211912448 2 200 25 NO 268 {{140, 86}, {240, 22}} YES -2070937536 272634880 Set BIOS Image... YES NO 1 268 {{15, 89}, {124, 17}} YES 68157504 272630784 ARM9 BIOS Image: NO 1 268 {{382, 80}, {100, 32}} YES 67108864 134217728 Choose... -2038284288 129 200 25 NO 268 {{140, 59}, {240, 22}} YES -2070937536 272634880 Set BIOS Image... YES NO 1 268 {{15, 62}, {124, 17}} YES 68157504 272630784 ARM7 BIOS Image: NO 1 268 {{382, 53}, {100, 32}} YES 67108864 134217728 Choose... -2038284288 129 200 25 NO 268 {{16, 32}, {230, 18}} YES -1543503872 0 Emulate BIOS Software Interrupts 1211912448 2 200 25 NO 268 {{16, 12}, {239, 18}} YES 603979776 0 Patch DelayLoop SWI (speed hack) 1211912448 2 200 25 NO {{1, 1}, {494, 143}} {{6, 166}, {496, 159}} {0, 0} 67108864 0 BIOS Configuration 1 0 2 NO 12 274 268 {{16, 61}, {206, 18}} YES 603979776 0 Use External Firmware Image 1211912448 2 200 25 NO 268 {{140, 33}, {240, 22}} YES -2070937536 272634880 Set Firmware Image... YES NO 1 268 {{15, 37}, {120, 17}} YES 68157504 272630784 Firmware Image: NO 1 268 {{382, 27}, {100, 32}} YES 67108864 134217728 Choose... -2038284288 129 200 25 NO 268 {{16, 12}, {149, 18}} YES 603979776 0 Boot From Firmware 1211912448 2 200 25 NO 268 {{12, 81}, {229, 32}} YES 67108864 134217728 Configure Internal Firmware... -2038284288 129 200 25 NO {{1, 1}, {494, 119}} {{6, 27}, {496, 135}} {0, 0} 67108864 0 Firmware Configuration 1 0 2 NO {{10, 33}, {508, 342}} BIOS and Firmware 4 274 12 274 268 {{16, 150}, {239, 18}} YES -2080374784 0 High-Precision Color Interpolation 1211912448 2 200 25 NO 268 {{16, 130}, {154, 18}} YES -2080374784 0 Enable Edge Marking 1211912448 2 200 25 NO 268 {{16, 110}, {92, 18}} YES -2080374784 0 Enable Fog 1211912448 2 200 25 NO 268 {{215, 42}, {60, 22}} YES -1804599231 71304192 0 . ¤ . E , ¤¤ - # -∞ - NaN * ‰ % + # +∞ # # NaN 3 YES YES YES . , NO NO NO YES NO 1 268 {{15, 44}, {195, 17}} YES 68157504 4195328 Depth Comparison Threshold: NO 1 268 {{276, 39}, {19, 27}} YES 67895328 0 100 1 YES NO 268 {{16, 90}, {130, 18}} YES -2080374784 0 Enable Line Hack 1211912448 2 200 25 NO 268 {{16, 70}, {225, 18}} YES -2080374784 0 Enable Fragment Sampling Hack 1211912448 2 200 25 NO 268 {{145, 10}, {150, 26}} YES -2076180416 2048 109199360 129 400 75 Automatic 2147483647 1 _popUpItemAction: YES OtherViews Single-Threaded 2147483647 _popUpItemAction: 1 2 Threads 2147483647 _popUpItemAction: 2 4 Threads 2147483647 _popUpItemAction: 4 8 Threads 2147483647 _popUpItemAction: 8 16 Threads 2147483647 _popUpItemAction: 16 32 Threads 2147483647 _popUpItemAction: 32 1 YES YES 2 NO 268 {{15, 16}, {128, 17}} YES 68157504 4195328 Rendering Threads: NO 1 {{1, 1}, {310, 176}} {{101, 63}, {312, 192}} {0, 0} 67108864 0 SoftRasterizer Options 1 0 2 NO 268 {{244, 315}, {169, 26}} YES -2076180416 2048 109199360 129 400 75 SoftRasterizer 2147483647 1 _popUpItemAction: 1 YES OtherViews None 2147483647 _popUpItemAction: OpenGL 2147483647 _popUpItemAction: 2 1 1 YES YES 2 NO 268 {{74, 321}, {168, 17}} YES 68157504 71304192 3D Rendering Engine: NO 1 12 274 268 {{16, 12}, {124, 18}} YES -2080374784 0 Enable Textures 1211912448 2 200 25 NO {{1, 1}, {310, 38}} {{101, 259}, {312, 54}} {0, 0} 67108864 0 General Settings 1 0 2 NO 12 274 268 {{16, 12}, {223, 18}} YES 67108864 0 Enable Multisample Antialiasing 1211912448 2 200 25 NO {{1, 1}, {310, 38}} {{101, 5}, {312, 54}} {0, 0} 67108864 0 OpenGL Options 1 0 2 NO {{10, 33}, {508, 342}} 3D Rendering 0 YES YES {554, 412} NSView PreferencesWindowDelegate 9 2 {{235, 426}, {620, 442}} 1685586944 Input Profile NSWindow {620, 180} 256 274 2322 256 {620, 304} YES NO YES 256 {620, 17} -2147483392 {{584, 0}, {16, 17}} InputCommandIconColumn 35 16 3.4028234663852886e+38 75497536 2048 135266368 33686528 0 3 0 NO InputCommandTagColumn 181 16 1000 75497536 2048 Command 3 MC4zMzMzMzI5ODU2AA 68157504 272761856 Text 3 YES InputDeviceColumn 222 10 3.4028234663852886e+38 75497536 2048 Input Device 70254657 136192 Text Cell 3 YES InputSettingsSummaryColumn 151 10 3.4028234663852886e+38 75497536 2048 Input Settings Summary 70254657 136192 Text Cell 3 YES 3 2 17 1386217472 0 15 0 NO 0 1 NO {{1, 17}, {620, 304}} 4 YES -2147483392 {{584, 17}, {15, 102}} NO _doScroller: _doScroller: 0.95844875346260383 -2147483392 {{1, 325}, {599, 15}} NO _doScroller: 1 _doScroller: 0.99667221297836939 2338 {{1, 0}, {620, 17}} YES {{-1, 60}, {622, 322}} 133682 QSAAAEEgAABBmAAAQZgAAA 0.25 4 1 268 {{19, 419}, {72, 14}} YES 68157504 272761856 Profile Name NO 1 289 {{510, 12}, {96, 32}} YES 67108864 134217728 Close -2038284288 129 DQ 200 25 NO 266 {{20, 396}, {392, 22}} YES -1804599231 272630784 YES NO 1 292 {{14, 12}, {236, 32}} YES 67108864 134217728 Apply to Current Configuration -2038284288 129 200 25 NO 265 {{510, 390}, {96, 32}} YES 67108864 134217728 Next -2038284288 129 200 25 NO 265 {{414, 390}, {96, 32}} YES 67108864 134217728 Previous -2038284288 129 200 25 NO 292 {{250, 12}, {96, 32}} YES 67108864 134217728 Delete -2038284288 129 200 25 NO {620, 442} {{0, 0}, {1920, 1177}} {620, 202} {10000000000000, 10000000000000} YES 1 2 {{235, 444}, {452, 115}} 1685586944 Input Profile Rename NSWindow 256 266 {{20, 48}, {412, 22}} YES -1804599231 272630784 YES NO 1 268 {{342, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{17, 78}, {215, 17}} YES 68157504 272630784 Enter a new name for this profile: NO 1 {452, 115} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{157, 353}, {300, 108}} 1685586944 InputSettingsNDSInput NSWindow 256 268 {{17, 71}, {266, 17}} YES 70254657 272634880 Device Info Summary NO 1 268 {{18, 47}, {63, 18}} _NS:682 YES -2080374784 0 Turbo _NS:682 1211912448 2 200 25 NO 268 {{190, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{94, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO {300, 108} _NS:122 {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} NO 1 2 {{235, 292}, {620, 267}} 1685586944 InputSettingsMicrophone NSWindow 256 12 274 268 {{18, 14}, {190, 126}} YES NO 4 1 -2080374784 0 Internal Noise Samples 1 1211912448 0 200 25 67108864 0 White Noise 3 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67108864 0 Sine Wave 5 1211912448 0 400 75 67108864 0 Audio File 2 1211912448 0 400 75 {190, 30} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 268 {{130, 18}, {224, 21}} YES 612368448 272635904 File Name YES NO 1 268 {{476, 11}, {96, 32}} YES 67108864 134217728 Choose... -2038284288 129 200 25 NO 268 {{128, 47}, {348, 26}} YES -2080112384 0 4000 40 500 0.0 11 1 NO NO NO 268 {{479, 56}, {90, 17}} YES 68157504 71308288 -∞ #0.0 Hz +∞ #0.0 Hz #0.0 Hz NaN 3 YES YES YES . , NO NO YES %1.1f Hz NO 1 268 {{356, 11}, {124, 32}} YES 67108864 134217728 Choose None -2038284288 129 200 25 NO {{1, 1}, {584, 150}} {{17, 56}, {586, 166}} {0, 0} 67108864 0 Audio Sample Generators 1 0 2 NO 268 {{510, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{414, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO 268 {{17, 230}, {586, 17}} YES 70254657 272634880 Device Info Summary NO 1 {620, 267} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{235, 296}, {350, 263}} 1685586944 InputSettingsTouch NSWindow 256 12 274 268 {{97, 44}, {17, 17}} YES 68157504 71304192 X: NO 1 268 {{119, 42}, {96, 22}} YES -1804599231 -1874852864 -∞ +∞ # # NaN 3 YES YES YES . , NO NO NO YES NO 1 268 {{97, 16}, {17, 17}} YES 68157504 71304192 Y: NO 1 268 {{119, 14}, {96, 22}} YES -1804599231 -1874852864 -∞ +∞ # # NaN 3 YES YES YES . , NO NO NO YES NO 1 {{1, 1}, {314, 74}} {{17, 56}, {316, 90}} {0, 0} 67108864 0 User Defined Coordinates 1 0 2 NO 268 {{240, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{18, 202}, {206, 18}} YES 67108864 0 Use user defined coordinates 1211912448 2 200 25 NO 268 {{17, 154}, {316, 42}} YES 67108864 272760832 If this setting is disabled, then the Touch command will read the coordinates from the input device instead. NO 1 268 {{144, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO 268 {{17, 226}, {316, 17}} YES 70254657 272634880 Device Info Summary NO 1 {350, 263} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{235, 434}, {350, 125}} 1685586944 InputSettingsLoadStateSlot NSWindow 256 268 {{127, 56}, {206, 26}} YES -2076180416 2048 109199360 129 400 75 Slot 1 2147483647 1 _popUpItemAction: YES OtherViews Slot 2 2147483647 _popUpItemAction: 1 Slot 3 2147483647 _popUpItemAction: 2 Slot 4 2147483647 _popUpItemAction: 3 Slot 5 2147483647 _popUpItemAction: 4 Slot 6 2147483647 _popUpItemAction: 5 Slot 7 2147483647 _popUpItemAction: 6 Slot 8 2147483647 _popUpItemAction: 7 Slot 9 2147483647 _popUpItemAction: 8 Slot 10 2147483647 _popUpItemAction: 9 1 YES YES 2 NO 268 {{17, 62}, {108, 17}} YES 68157504 272630784 Load State Slot: NO 1 268 {{240, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{144, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO 268 {{17, 88}, {316, 17}} YES 70254657 272634880 Device Info Summary NO 1 {350, 125} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{235, 459}, {350, 125}} 1685586944 InputSettingsSaveStateSlot NSWindow 256 268 {{127, 56}, {206, 26}} YES -2076180416 2048 109199360 129 400 75 Slot 1 2147483647 1 _popUpItemAction: YES OtherViews Slot 2 2147483647 _popUpItemAction: 1 Slot 3 2147483647 _popUpItemAction: 2 Slot 4 2147483647 _popUpItemAction: 3 Slot 5 2147483647 _popUpItemAction: 4 Slot 6 2147483647 _popUpItemAction: 5 Slot 7 2147483647 _popUpItemAction: 6 Slot 8 2147483647 _popUpItemAction: 7 Slot 9 2147483647 _popUpItemAction: 8 Slot 10 2147483647 _popUpItemAction: 9 1 YES YES 2 NO 268 {{17, 62}, {108, 17}} YES 68157504 272630784 Save State Slot: NO 1 268 {{240, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{144, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO 268 {{17, 88}, {316, 17}} YES 70254657 272634880 Device Info Summary NO 1 {350, 125} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{235, 399}, {467, 160}} 1685586944 InputSettingsSpeedLimit NSWindow 256 268 {{17, 123}, {425, 17}} YES 70254657 272634880 Device Info Summary NO 1 268 {{30, 71}, {411, 26}} YES -2080112384 0 10 0.0 1 0.0 11 1 NO NO NO 268 {{20, 98}, {38, 17}} YES 68157504 138413056 0x NO 1 268 {{412, 98}, {38, 17}} YES 68157504 138413056 10x NO 1 268 {{98, 98}, {38, 17}} YES 68157504 138413056 2x NO 1 268 {{177, 98}, {38, 17}} YES 68157504 138413056 4x NO 1 268 {{255, 98}, {38, 17}} YES 68157504 138413056 6x NO 1 268 {{335, 98}, {38, 17}} YES 68157504 138413056 8x NO 1 268 {{14, 12}, {169, 32}} 100 YES 67108864 134217728 Set to Normal Speed -2038022144 129 400 75 NO 268 {{112, 48}, {156, 17}} YES 68157504 71304192 Speed limit set to: NO 1 268 {{270, 48}, {81, 17}} YES 68157504 4195328 #0.00x -∞ #0.00x +∞ #0.00x #0.00x NaN 3 YES YES YES . , NO NO YES %1.2fx NO 1 268 {{357, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{261, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO {467, 160} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{235, 276}, {516, 283}} 1685586944 InputSettingsGPUState NSWindow 256 12 274 268 {{18, 14}, {444, 142}} YES NO 6 2 -2080374784 0 Main GPU (All Layers) 1211912448 0 200 25 67108864 0 Sub GPU (All Layers) 6 1211912448 0 400 75 67108864 0 Main BG0 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67108864 0 Sub BG0 7 1211912448 0 400 75 67108864 0 Main BG1 2 1211912448 0 400 75 67108864 0 Sub BG1 8 1211912448 0 400 75 67108864 0 Main BG2 3 1211912448 0 400 75 67108864 0 Sub BG2 9 1211912448 0 400 75 67108864 0 Main BG3 4 1211912448 0 400 75 67108864 0 Sub BG3 10 1211912448 0 400 75 67108864 0 Main OBJ 5 1211912448 0 400 75 67108864 0 Sub OBJ 11 1211912448 0 400 75 {220, 22} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 {{1, 1}, {480, 166}} {{17, 56}, {482, 182}} {0, 0} 67108864 0 GPU Layers 1 0 2 NO 268 {{406, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{310, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO 268 {{17, 246}, {482, 17}} YES 70254657 272634880 Device Info Summary NO 1 {516, 283} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{235, 319}, {350, 240}} 1685586944 InputSettingsPaddleController NSWindow 256 268 {{17, 203}, {316, 17}} YES 70254657 272634880 Device Info Summary NO 1 12 274 268 {{195.08984375, 16}, {38, 17}} _NS:4068 YES 68157504 -2076175360 # -∞ - # +∞ + 0 # # 0 NaN 3 YES YES YES . , NO NO NO %d _NS:4068 NO 1 268 {{235, 11}, {19, 27}} _NS:4123 YES -2146697184 0 _NS:4123 1 -20 20 1 YES NO 268 {{67, 16}, {127, 17}} _NS:4068 YES 68157504 272630784 Paddle Adjustment: _NS:4068 NO 1 {{1, 1}, {314, 46}} {{17, 56}, {316, 62}} {0, 0} 67108864 0 Digital Input Settings 1 0 2 NO 268 {{240, 12}, {96, 32}} 1 YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO 268 {{144, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO 12 274 268 {{84, 10}, {144, 21}} _NS:700 YES -2080374784 0 _NS:700 20 2 10 0.0 0 1 NO NO NO 268 {{15, 15}, {68, 11}} _NS:4068 YES 68157504 71566336 Less Sensitive _NS:4068 NO 1 268 {{229, 15}, {70, 11}} _NS:4068 YES 68157504 4457472 More Sensitive _NS:4068 NO 1 {{1, 1}, {314, 39}} _NS:21 {{17, 122}, {316, 55}} _NS:18 {0, 0} 67108864 0 Analog Input Settings 1 0 2 NO 268 {{17, 185}, {316, 17}} _NS:4068 YES 68157504 272630784 • This is an analog input. _NS:4068 NO 1 268 {{17, 185}, {316, 17}} _NS:4068 YES 68157504 272630784 • This is a digital input. _NS:4068 NO 1 {350, 240} _NS:122 {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} NO 1 2 {{235, 244}, {305, 315}} 1685585920 Internal Firmware Preferences NSWindow 256 268 {{119, 276}, {166, 22}} YES -1804599231 272630784 Enter a nickname... YES NO 1 268 {{119, 222}, {166, 44}} YES -1805647871 272629760 Enter a message... YES NO 1 268 {{17, 278}, {97, 17}} YES 68157504 71304192 Nickname: NO 1 268 {{17, 246}, {97, 17}} YES 68157504 71304192 Message: NO 1 268 {{12, 196}, {102, 17}} YES 68157504 71304192 Favorite Color: NO 1 268 {{17, 154}, {97, 17}} YES 68157504 71304192 Birthday: NO 1 268 {{17, 126}, {97, 17}} YES 68157504 71304192 Language: NO 1 268 {{119, 152}, {169, 27}} YES 71303168 0 330548400 0.0 224 NO 268 {{116, 120}, {172, 26}} YES -2076180416 2048 109199360 129 400 75 English 2147483647 1 _popUpItemAction: 1 YES OtherViews Japanese 2147483647 _popUpItemAction: French 2147483647 _popUpItemAction: 2 German 2147483647 _popUpItemAction: 3 Italian 2147483647 _popUpItemAction: 4 Spanish 2147483647 _popUpItemAction: 5 1 1 YES YES 2 NO 268 {{116, 190}, {172, 26}} YES -2076180416 2048 109199360 129 400 75 Gray 2147483647 1 NSImage ColorSwatch_Gray_16x16 _popUpItemAction: YES OtherViews Brown 2147483647 NSImage ColorSwatch_Brown_16x16 _popUpItemAction: 1 Red 2147483647 NSImage ColorSwatch_Red_16x16 _popUpItemAction: 2 Pink 2147483647 NSImage ColorSwatch_Pink_16x16 _popUpItemAction: 3 Orange 2147483647 NSImage ColorSwatch_Orange_16x16 _popUpItemAction: 4 Yellow 2147483647 NSImage ColorSwatch_Yellow_16x16 _popUpItemAction: 5 Lime Green 2147483647 NSImage ColorSwatch_LimeGreen_16x16 _popUpItemAction: 6 Green 2147483647 NSImage ColorSwatch_Green_16x16 _popUpItemAction: 7 Dark Green 2147483647 NSImage ColorSwatch_DarkGreen_16x16 _popUpItemAction: 8 Sea Green 2147483647 NSImage ColorSwatch_SeaGreen_16x16 _popUpItemAction: 9 Turquoise 2147483647 NSImage ColorSwatch_Turquoise_16x16 _popUpItemAction: 10 Blue 2147483647 NSImage ColorSwatch_Blue_16x16 _popUpItemAction: 11 Dark Blue 2147483647 NSImage ColorSwatch_DarkBlue_16x16 _popUpItemAction: 12 Dark Purple 2147483647 NSImage ColorSwatch_DarkPurple_16x16 _popUpItemAction: 13 Violet 2147483647 NSImage ColorSwatch_Violet_16x16 _popUpItemAction: 14 Magenta 2147483647 NSImage ColorSwatch_Magenta_16x16 _popUpItemAction: 15 1 YES YES 2 NO 268 {{17, 56}, {271, 56}} YES 67108864 272760832 Note: These settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled. NO 1 268 {{104, 12}, {96, 32}} YES 67108864 134217728 OK -2038284288 129 DQ 200 25 NO {305, 315} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 11 2 {{702, 407}, {700, 405}} 1685586944 Game Data Migration Assistant NSWindow {700, 250} 256 268 {{17, 351}, {666, 34}} YES 67108864 272629760 Game data from previous versions of DeSmuME were found. Would you like to migrate your previous game data to work with this version? NO 1 268 {{17, 351}, {666, 34}} YES 67108864 272629760 All of your game data is up to date. NO 1 289 {{362, 12}, {162, 32}} 2 YES 67108864 134217728 Migrate By Moving -2038284288 129 200 25 NO 289 {{200, 12}, {162, 32}} YES 67108864 134217728 Don't Migrate -2038284288 129 Gw 200 25 NO 268 {{17, 315}, {666, 28}} YES 67108864 272633856 Game data from previous versions may not be fully compatible with the current version, especially Save States. Game data migration cannot guarantee that all your old game data will continue to work. NO 1 268 {{17, 315}, {666, 28}} YES 67108864 272633856 All of your previous game data already exists in this version of DeSmuME. No migration is needed. NO 1 292 {{18, 21}, {182, 18}} YES 67108864 0 Do not ask on startup 1211912448 2 200 25 NO 289 {{524, 12}, {162, 32}} 1 YES 67108864 134217728 Migrate By Copying -2038284288 129 DQ 200 25 NO 274 2322 256 {700, 229} _NS:1718 YES NO YES 256 {700, 17} _NS:1720 -2147483392 {{224, 0}, {16, 17}} _NS:1724 FileNameColumn 375 50 5000 75497536 2048 File Name 3 MC4zMzMzMzI5ODU2AA 67108864 131072 File Name _NS:1912 1211912448 2 200 25 3 YES FileKindColumn 135 40 1000 75497536 2048 Kind 337641536 133120 Text Cell 3 YES FileDateModifiedColumn 181 10 3.4028234663852886e+38 75497536 2048 Date Modified 337641536 133120 Text Cell 3 YES 3 2 17 1656750080 1 4 15 0 YES 0 1 {{1, 17}, {700, 229}} _NS:1716 4 YES -2147483392 {{224, 17}, {15, 102}} _NS:1741 NO _doScroller: _doScroller: 0.92307692307692313 -2147483392 {{1, 197}, {700, 15}} _NS:1743 NO _doScroller: 1 _doScroller: 0.98176718092566617 2338 {{1, 0}, {700, 17}} _NS:1721 YES {{-1, 60}, {702, 247}} _NS:1714 133682 QSAAAEEgAABBmAAAQZgAAA 0.25 4 1 {700, 405} {{0, 0}, {1920, 1177}} {700, 272} {10000000000000, 10000000000000} YES FileMigrationDelegate 1 2 {{157, 261}, {380, 200}} 1685586944 ROM Save File Migration NSWindow 256 268 {{17, 112}, {346, 68}} YES 67108864 272629760 This ROM's save file has not been created yet, but there is a save file with this ROM that has the same file name. Would you like to migrate it to work with DeSmuME? NO 1 268 {{270, 12}, {96, 32}} 1 YES 67108864 134217728 Migrate -2038284288 129 DQ 200 25 NO 268 {{144, 12}, {126, 32}} YES 67108864 134217728 Don't Migrate -2038284288 129 Gw 200 25 NO 268 {{17, 48}, {346, 56}} YES 67108864 272633856 Migrating the ROM save file will move it to DeSmuME's game data folder. If you do not migrate the save file now, a new file will be created instead. This will be like starting the ROM for the first time. NO 1 {380, 200} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 1 2 {{157, 298}, {335, 163}} 1685586944 Save State NSWindow 256 268 {{17, 109}, {301, 34}} YES 67108864 272629760 Would you like to save the emulation state before closing? NO 1 268 {{220, 12}, {96, 32}} 1 YES 67108864 134217728 Save -2038284288 129 DQ 200 25 NO 268 {{114, 12}, {106, 32}} 2 YES 67108864 134217728 Don't Save -2038284288 129 200 25 NO 268 {{17, 59}, {301, 42}} YES 67108864 272633856 If you haven't already saved using this ROM's save, then not saving the emulation state now will cause any unsaved changes to be lost. NO 1 268 {{18, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO {335, 163} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 7 2 {{235, 88}, {640, 480}} 1685586944 Cheat Manager NSWindow 256 268 2322 256 {270, 335} YES NO YES 256 {270, 17} -2147483392 {{256, 0}, {16, 17}} 20 20 20 75497536 2048 3 MC4zMzMzMzI5ODU2AA 67108864 0 1215582464 2 200 25 YES 36 10 3.4028234663852886e+38 75497536 2048 Type 134217728 33554432 0 0 0 NO cheatType YES compare: 205 10 3.4028234663852886e+38 75497536 2048 Description 337641472 4325632 Text Cell 3 YES YES 3 2 42 1925185536 1 4 15 0 NO 0 1 {{1, 17}, {270, 335}} 4 YES 2338 {{1, 0}, {270, 17}} YES -2147483392 {{256, 17}, {15, 306}} NO _doScroller: _doScroller: 0.99689440993788825 -2147483392 {{1, 323}, {270, 15}} NO _doScroller: 1 _doScroller: 0.99630996309963105 {{20, 49}, {272, 353}} 133682 QSAAAEEgAABCMAAAQjAAAA 0.25 4 1 268 {{113, 12}, {185, 32}} YES 67108864 134217728 View Cheat Database... -2038284288 129 200 25 NO 268 {{47, 19}, {28, 23}} YES -2080374784 134217728 -2033434624 162 NSImage NSRemoveTemplate 400 75 NO 268 {{20, 19}, {28, 23}} YES -2080374784 134217728 -2033434624 162 NSImage NSAddTemplate 400 75 NO 12 274 268 {{100, 372}, {209, 26}} YES -2076180416 2048 109199360 129 400 75 Internal Cheat 1048576 2147483647 1 NSImage Icon_DeSmuME_32x32 _popUpItemAction: YES OtherViews Action Replay 1048576 2147483647 NSImage Icon_ActionReplay_32x32 _popUpItemAction: 1 1 YES YES 2 NO 301 {{2, 33}, {320, 290}} NSView 268 {{16, 402}, {130, 18}} YES 67108864 0 Enable this cheat 1211912448 2 200 25 NO 268 {{15, 378}, {83, 17}} YES 68157504 272630784 Type: NO 1 12 {{14, 320}, {292, 5}} {0, 0} 67108864 0 Box 3 2 0 NO 268 {{103, 331}, {203, 39}} YES -1805647871 272629760 YES NO 1 268 {{15, 353}, {83, 17}} YES 68157504 272630784 Description: NO 1 268 {{114, 6}, {96, 32}} YES 67108864 134217728 Apply -2038284288 129 200 25 NO {{1, 1}, {324, 428}} {{297, 16}, {326, 444}} {0, 0} 67108864 0 Cheat Settings 1 0 2 NO 268 {{76, 408}, {190, 18}} YES -2080374784 0 Enable Cheats 1211912448 2 200 25 NO 265 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 410}, {50, 50}} YES 134217728 33554432 0 3 0 NO NO YES 265 {{75, 432}, {168, 28}} YES 69206017 272764928 TmFtZToKU2VyaWFsOg NO 1 1292 {{29, 419}, {32, 32}} 28682 100 {640, 480} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} CheatManagerWindow YES CheatWindowDelegate 256 292 {{17, 4}, {294, 14}} YES 68157504 138548224 This list only shows the first 100 search results. YES 11 3357 NO 1 1292 {{214, 220}, {16, 16}} 28938 100 268 {{133, 369}, {136, 22}} YES -2076180416 133120 109199360 129 400 75 Unsigned 2147483647 1 _popUpItemAction: YES OtherViews YES Signed (NOT IMPLEMENTED) 2147483647 _popUpItemAction: YES 1 YES YES 2 NO 268 {{45, 374}, {86, 14}} YES 68157504 71435264 Sign Type: NO 1 268 {{45, 398}, {86, 14}} YES 68157504 71435264 Search Style: NO 1 268 {{133, 393}, {136, 22}} YES -2076180416 133120 109199360 129 400 75 Exact Value 1048576 2147483647 1 _popUpItemAction: YES OtherViews Comparative 1048576 2147483647 _popUpItemAction: 1 1 YES YES 2 NO 268 {{0, 237}, {328, 134}} NSView 268 {{233, 213}, {80, 28}} YES 67108864 134348800 Reset -2038284288 129 200 25 NO 268 {{59, 222}, {150, 14}} YES 68157504 272761856 Search not started. NO 1 268 {{17, 222}, {45, 14}} YES 68157504 272761856 Found: NO 1 284 2322 256 {286, 176} YES NO YES 256 {286, 17} -2147483392 {{224, 0}, {16, 17}} 102 40 1000 75497536 2048 Address 3 MC4zMzMzMzI5ODU2AA 69206081 137216 Text Cell Monaco 11 16 3 YES 178 40 1000 75497536 2048 Value 69206081 137216 Text Cell 3 YES 3 2 14 1916796928 3 4 15 0 NO 0 1 {{1, 17}, {286, 176}} 4 YES 2338 {{1, 0}, {286, 17}} YES -2147483392 {{224, 17}, {15, 102}} NO _doScroller: _doScroller: 0.94863013698630139 -2147483392 {{1, 294}, {338, 15}} NO _doScroller: 1 _doScroller: 0.93888888888888888 {{20, 20}, {288, 194}} 133682 QSAAAEEgAABBgAAAQYAAAA 0.25 4 1 {328, 434} NSView {328, 397} {0, 397} {328, 397} 2 0.0 0.0 15 2 {{235, 143}, {500, 416}} 1685585920 Cheat Database NSWindow {500, 272} 256 274 2304 256 {500, 287} YES NO YES 256 {500, 17} -2147483392 {{224, 0}, {16, 17}} 25 25 25 75497536 2048 3 MC4zMzMzMzI5ODU2AA 67108864 134217728 1215582464 2 200 25 YES 464 40 1000 75497536 2048 Description 69206017 135168 Text Cell 3 YES YES 3 2 39 1925185536 1 4 15 0 NO 0 1 {{1, 17}, {500, 287}} 4 YES -2147483392 {{224, 17}, {15, 102}} NO _doScroller: _doScroller: 0.94773519163763065 -2147483392 {{1, 249}, {568, 15}} NO _doScroller: 1 _doScroller: 0.99206349206349209 2304 {{1, 0}, {500, 17}} YES {{-1, 57}, {502, 305}} 133682 QSAAAEEgAABCJAAAQiQAAA 0.25 4 1 268 {{17, 370}, {125, 14}} YES 68157504 272761856 R4 Cheats Database: NO 1 268 {{17, 392}, {68, 14}} YES 68157504 272761856 ROM Title: NO 1 292 {{14, 12}, {114, 32}} YES 67108864 134217728 Select All -2038284288 129 200 25 NO 292 {{128, 12}, {114, 32}} YES 67108864 134217728 Select None -2038284288 129 200 25 NO 289 {{390, 12}, {96, 32}} 1 YES 67108864 134217728 Add -2038284288 129 DQ 200 25 NO 289 {{294, 12}, {96, 32}} YES 67108864 134217728 Cancel -2038284288 129 Gw 200 25 NO 265 {{372, 370}, {48, 14}} YES 68157504 71435264 Found: NO 1 268 {{144, 370}, {232, 14}} YES 70254657 272765952 Database file NO 1 265 {{422, 370}, {61, 14}} YES 70254657 4330496 Count NO 1 268 {{87, 392}, {396, 14}} YES 70254657 272765952 ROM title NO 1 {500, 416} {{0, 0}, {1920, 1177}} {500, 294} {10000000000000, 10000000000000} YES 268 268 {{233, 54}, {80, 28}} YES 67108864 134348800 Search -2038284288 129 200 25 NO 268 {{20, 59}, {210, 19}} YES YES 342884416 268567552 Search value YES 1 0 0 search _searchFieldSearch: 138690560 0 400 75 0 0 clear cancel _searchFieldCancel: 138690560 0 400 75 255 BgAAAA NO 1 268 {{17, 86}, {294, 14}} YES 67108864 272760832 Enter a search value, and then click Search. NO 1 268 {{17, 100}, {294, 14}} YES 67108864 272760832 Search for an exact value. NO 1 {328, 134} NSView 268 268 {{17, 86}, {294, 14}} YES 67108864 272760832 Click Start Search to begin a comparative search. NO 1 268 {{17, 100}, {294, 14}} YES 67108864 272760832 Start a comparative search. NO 1 268 {{116, 47}, {96, 28}} YES 67108864 134348800 Start Search -2038284288 129 200 25 NO {328, 134} NSView 268 268 {{17, 72}, {294, 28}} YES 67108864 272760832 Click the appropriate button based on how the target value is changing. NO 1 268 {{17, 100}, {294, 14}} YES 67108864 272760832 How is the value changing? NO 1 268 {{163, 13}, {150, 28}} 1 YES 67108864 134348800 Value is now lower -2038284288 129 200 25 NO 268 {{163, 40}, {150, 28}} YES 67108864 134348800 Value is now higher -2038284288 129 200 25 NO 268 {{15, 13}, {150, 28}} 3 YES 67108864 134348800 Value did change -2038284288 129 200 25 NO 268 {{15, 40}, {150, 28}} 2 YES 67108864 134348800 Value is unchanged -2038284288 129 200 25 NO {328, 134} NSView 301 268 {{197, 191}, {109, 32}} YES 67108864 134217728 Write Once -2038284288 129 200 25 NO 268 {{17, 20}, {286, 42}} YES 67108864 272760832 Note: Enabling this cheat freezes the value in memory. If you only want to change a value without actually freezing it in memory, click Write Once. NO 1 268 {{17, 262}, {128, 17}} YES 68157504 272630784 Search for Address: NO 1 265 {{149, 257}, {27, 27}} YES -2080374784 134217728 -2033434624 160 400 75 NO 268 {{79, 230}, {38, 17}} YES 68157504 71304192 0x02 Monaco 13 16 NO 1 268 {{67, 198}, {128, 22}} YES -1804599231 -1874852864 -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO YES NO 1 268 {{17, 201}, {45, 17}} YES 68157504 272630784 Value: NO 1 268 {{118, 228}, {77, 22}} YES -1804599231 272630784 YES NO 1 268 {{17, 231}, {60, 17}} YES 68157504 272630784 Address: NO 1 12 274 268 {{18, 14}, {190, 78}} YES NO 4 1 67108864 0 1 Byte [0 - 255] 1 1211912448 0 200 25 67108864 0 2 Bytes [0 - 65536] 2 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67108864 0 3 Bytes [0 - 16777215] 3 1211912448 0 400 75 -2080374784 0 4 Bytes [0 - 4294967295] 4 1211912448 0 400 75 {190, 18} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 3 {{1, 1}, {226, 102}} {{46, 72}, {228, 118}} {0, 0} 67108864 0 Select Memory Size 1 0 2 NO {320, 290} NSView 301 256 2304 2322 Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {{0, 125}, {278, 223}} 166 278 1 67120387 0 4 1 1 6 {463, 10000000} NSAllRomanInputSourcesLocaleIdentifier {{1, 1}, {278, 223}} 4 YES -2147483392 {{231, 1}, {15, 172}} NO _doScroller: _doScroller: 0.68253968253968256 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 0.97142857142857142 0.94565218687057495 {{20, 20}, {280, 225}} 133650 0.25 4 1 268 {{17, 253}, {138, 17}} YES 68157504 272630784 Action Replay Code: NO 1 {320, 290} NSView 301 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{101, 133}, {128, 128}} YES 134217728 33554432 NSImage Icon_CodeBreaker_128x128 0 3 0 NO NO YES 268 {{17, 35}, {286, 72}} YES 67108864 138412032 Code Breaker cheats have not been implemented in this version of DeSmuME. YES 20 2072 NO 1 {320, 290} NSView 7 2 {{235, 256}, {640, 303}} 1685586944 SLOT-1 (NDS Slot) Manager NSWindow 256 12 274 268 {{18, 152}, {230, 98}} YES NO 5 1 -2080374784 0 None 1211912448 0 200 25 67108864 0 Retail (Auto-detect) 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67108864 0 Retail with NAND Flash 3 1211912448 0 400 75 67108864 0 Standard Retail MC + ROM 4 1211912448 0 400 75 67108864 0 R4 2 1211912448 0 400 75 {230, 18} {4, 2} 1151868928 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 268 {{15, 93}, {236, 42}} YES 67108864 138543104 Note: Changes to the SLOT-1 device will only take effect after a ROM is loaded or after the emulator is reset. 1 MCAwIDAAA NO 1 268 {{49, 16}, {168, 32}} YES 67108864 134217728 Eject SLOT-1 Device -2038284288 129 200 25 NO 268 {{49, 48}, {168, 32}} YES 67108864 134217728 Reset NDS -2034876416 129 200 25 NO 12 {{14, 141}, {238, 5}} {0, 0} 67108864 0 Box 3 2 0 NO {{1, 1}, {266, 260}} {{17, 16}, {268, 276}} {0, 0} 67108864 0 SLOT-1 Device Type 1 0 2 NO 12 274 265 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{14, 16}, {30, 30}} YES 134217728 33554432 0 3 0 NO NO YES 265 {{52, 18}, {154, 28}} YES 69206017 272764928 TmFtZToKU2VyaWFsOg NO 1 1292 {{11, 14}, {32, 32}} 28682 100 268 {{205, 17}, {116, 26}} YES -2076180416 2048 109199360 129 400 75 YES Actions 1048576 2147483647 1 _popUpItemAction: YES OtherViews Load ROMâ€Ĥ 2147483647 _popUpItemAction: Load Recent ROM 1048576 2147483647 submenuAction: Load Recent ROM Clear Menu 1048576 2147483647 _popUpItemAction: _NSRecentDocumentsMenu YES YES 2147483647 _popUpItemAction: Unload ROM 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: ROM Info 2147483647 _popUpItemAction: Reveal ROM in Finder 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: Import ROM Save File... 2147483647 _popUpItemAction: Export ROM Save File... 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: ROM Save Type 2147483647 submenuAction: ROM Save Type Automatic 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: -1 EEPROM 4Kb 2147483647 _popUpItemAction: 1 EEPROM 64Kb 2147483647 _popUpItemAction: 2 EEPROM 512Kb 2147483647 _popUpItemAction: 3 FRAM 256Kb 2147483647 _popUpItemAction: 4 FLASH 2Mb 2147483647 _popUpItemAction: 5 FLASH 4Mb 2147483647 _popUpItemAction: 6 FLASH 8Mb 2147483647 _popUpItemAction: 7 FLASH 16Mb 2147483647 _popUpItemAction: 8 FLASH 32Mb 2147483647 _popUpItemAction: 9 FLASH 64Mb 2147483647 _popUpItemAction: 10 FLASH 128Mb 2147483647 _popUpItemAction: 11 FLASH 256Mb 2147483647 _popUpItemAction: 12 FLASH 512Mb 2147483647 _popUpItemAction: 13 YES 1 YES YES 2 NO {{1, 1}, {334, 56}} {{287, 220}, {336, 72}} {0, 0} 67108864 0 Loaded ROM 1 0 2 NO 12 274 268 {{14, 14}, {304, 42}} YES 69206017 272764928 slot1StatusText NO 1 {{1, 1}, {334, 66}} _NS:21 {{287, 16}, {336, 82}} _NS:18 {0, 0} 67108864 0 NDS Slot Status 1 0 2 NO 12 274 268 {{226, 6}, {96, 32}} YES 67108864 134217728 Choose... -2038284288 129 200 25 NO 268 {{18, 45}, {298, 18}} YES 77594689 272767744 Directory Path YES NO 1 268 {{15, 71}, {150, 17}} _NS:4068 YES 68157504 272630784 Storage Directory Path: _NS:4068 NO 1 {{1, 1}, {334, 98}} _NS:21 {{287, 102}, {336, 114}} _NS:18 {0, 0} 67108864 0 R4 Device Setup 1 0 2 NO {640, 303} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} Slot1ManagerWindow YES 7 2 {{235, 111}, {640, 448}} 1685586944 SLOT-2 (GBA Slot) Manager NSWindow 256 268 2304 256 {188, 304} _NS:1843 YES NO YES 256 {188, 17} -2147483392 {{224, 0}, {16, 17}} _NS:1848 185 40 1000 75497536 2048 SLOT-2 Device Type 3 MC4zMzMzMzI5ODU2AA 337641536 2048 Text Cell 1 YES 3 2 17 46137344 4 15 0 YES 0 1 {{1, 17}, {188, 304}} _NS:1841 4 YES 2304 {{1, 0}, {188, 17}} YES -2147483392 {{224, 17}, {15, 102}} _NS:1860 NO _doScroller: _doScroller: 0.99723756906077343 -2147483392 {{1, 306}, {188.95703125, 15}} _NS:1862 NO _doScroller: 1 _doScroller: 0.9943820224719101 {{20, 106}, {190, 322}} _NS:1839 133682 QSAAAEEgAABBmAAAQZgAAA 0.25 4 1 12 274 268 {{3, 4}, {400, 320}} _NS:1109 NSView {{1, 1}, {406, 326}} _NS:21 {{215, 102}, {408, 328}} _NS:18 {0, 0} 67108864 0 Device Settings 1 0 0 NO 268 {{530, 12}, {96, 32}} _NS:610 YES 67108864 134217728 Apply _NS:610 -2038284288 129 200 25 NO 12 274 268 {{15, 14}, {482, 42}} _NS:3939 YES 69206017 272760832 slot2StatusText _NS:3939 NO 1 {{1, 1}, {512, 66}} _NS:21 {{17, 16}, {514, 82}} _NS:18 {0, 0} 67108864 0 GBA Slot Status 1 0 2 NO {640, 448} _NS:122 {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} Slot2ManagerWindow NO Slot2WindowDelegate 268 268 {{17, 152}, {366, 17}} _NS:3939 YES 67108864 138674176 This device is unsupported at this time. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 268 268 {{17, 45}, {366, 56}} _NS:3939 YES 67108864 272760832 Note: If a game is dependent on having a particular SLOT-2 device loaded, then removing the device while the game is running may cause the game to fail. _NS:3939 NO 1 268 {{17, 109}, {366, 56}} _NS:3939 YES 67108864 272760832 When a ROM is loading, this setting prevents any SLOT-2 device from being loaded into the GBA slot. If a ROM is already loaded, this setting removes any previously loaded SLOT-2 device. _NS:3939 NO 1 268 {{17, 20}, {366, 17}} _NS:3939 YES 67108864 138674176 No additional configuration required. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 268 268 {{17, 45}, {366, 56}} _NS:3939 YES 67108864 272760832 Note: This is not an actual device. Rather, this setting will automatically select a SLOT-2 device depending on the loaded ROM, and then load the device as the ROM loads. _NS:3939 NO 1 268 {{187, 126}, {196, 17}} _NS:4068 YES 70254657 4199424 SLOT-2 Device Name _NS:4068 NO 1 268 {{17, 126}, {168, 17}} _NS:4068 YES 68157504 71304192 Selected SLOT-2 Device: _NS:4068 NO 1 268 {{153, 283}, {230, 17}} _NS:4068 YES 68157504 272630784 Currently Loaded ROM _NS:4068 NO 1 12 {{12, 149}, {376, 5}} _NS:2429 {0, 0} 67108864 0 Box 3 2 0 NO 268 {{68, 220}, {32, 32}} 28682 100 265 {{165, 241}, {218, 34}} YES 69206017 272633856 TmFtZToKU2VyaWFsOg NO 1 265 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 172}, {128, 128}} YES 134217728 33554432 0 3 0 NO NO YES 268 {{17, 20}, {366, 17}} _NS:3939 YES 67108864 138674176 No additional configuration required. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 268 268 {{17, 283}, {366, 17}} _NS:4068 YES 68157504 272630784 Search for files at this location: _NS:4068 NO 1 268 {{17, 251}, {366, 26}} _NS:791 YES -2076180416 2048 _NS:791 109199360 129 400 75 Same folder as the loaded ROM 2147483647 1 _popUpItemAction: YES OtherViews YES YES 2147483647 _popUpItemAction: YES Custom folder 2147483647 _popUpItemAction: 1 Choose a folder... 2147483647 _popUpItemAction: 10000 YES YES 2147483647 _popUpItemAction: YES Custom disk image 2147483647 _popUpItemAction: 2 Choose a disk image... 2147483647 _popUpItemAction: 10001 1 YES YES 2 NO {400, 320} _NS:1109 NSView 268 268 {{17, 286}, {366, 14}} _NS:4068 YES 68157504 272761856 Enable rumble for the selected input devices: _NS:4068 NO 1 268 2304 256 {358, 156} _NS:1843 YES NO YES 256 {358, 17} -2147483392 {{224, 0}, {16, 17}} _NS:1848 30 30 1000 75497536 2048 3 MC4zMzMzMzI5ODU2AA 68157504 1024 _NS:1912 1214533888 2 200 25 YES 317.5234375 40 1000 75497536 2048 Input Device 338690112 1024 Text Cell 3 YES 3 2 17 1386217472 0 15 0 NO 0 1 {{1, 17}, {358, 156}} _NS:1841 4 YES -2147483392 {{224, 17}, {15, 102}} _NS:1860 NO _doScroller: _doScroller: 0.90625 -2147483392 {{1, 162}, {358, 15}} _NS:1862 NO _doScroller: 1 _doScroller: 1 0.97814207650273222 2304 {{1, 0}, {358, 17}} YES {{20, 110}, {360, 174}} _NS:1839 133682 QSAAAEEgAABBmAAAQZgAAA 0.25 4 1 268 {{267, 12}, {119, 32}} _NS:610 YES 67108864 134217728 Test Rumble _NS:610 -2038284288 129 200 25 NO 268 {{17, 60}, {366, 42}} _NS:3939 YES 67108864 272760832 Note: Rumble will only work for supported games. In addition, you must have a supported input device. To check if the selected input devices support rumble, click Test Rumble. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 268 268 {{142, 113}, {144, 32}} _NS:610 YES 67108864 134217728 Clear SRAM Path _NS:610 -2038284288 129 200 25 NO 268 {{286, 113}, {100, 32}} _NS:610 YES 67108864 134217728 Choose... _NS:610 -2038284288 129 200 25 NO 268 {{20, 149}, {360, 22}} _NS:817 YES -2068840383 272630784 File Path _NS:817 YES NO 1 268 {{17, 179}, {105, 17}} _NS:4068 YES 68157504 272630784 GBA SRAM File: _NS:4068 NO 1 12 {{12, 202}, {376, 5}} _NS:2429 {0, 0} 67108864 0 Box 3 2 0 NO 268 {{286, 217}, {100, 32}} _NS:610 YES 67108864 134217728 Choose... _NS:610 -2038284288 129 200 25 NO 268 {{20, 253}, {360, 22}} _NS:817 YES -2068840383 272630784 File Path _NS:817 YES NO 1 268 {{17, 283}, {159, 17}} _NS:4068 YES 68157504 272630784 GBA ROM Cartridge File: _NS:4068 NO 1 {400, 320} _NS:1109 NSView 268 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{75, 96}, {254, 204}} _NS:2165 YES 134217728 33554432 NSImage Image_GuitarGrip _NS:2165 0 3 0 NO NO YES 268 {{127, 12}, {150, 32}} _NS:610 YES 67108864 134217728 Input Preferences _NS:610 -2038284288 129 200 25 NO 268 {{17, 60}, {366, 28}} _NS:3939 YES 67108864 272760832 This is an input device. You can set up this device through your Input Preferences. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 268 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{11, 104}, {360, 136}} _NS:2165 YES 134217728 33816576 NSImage Image_MemoryExpansionPak _NS:2165 0 3 0 NO NO YES 268 {{17, 20}, {366, 17}} _NS:3939 YES 67108864 138674176 No additional configuration required. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 268 268 {{17, 60}, {366, 28}} _NS:3939 YES 67108864 272760832 This is an input device. You can set up this device through your Input Preferences. _NS:3939 NO 1 268 {{127, 12}, {150, 32}} _NS:610 YES 67108864 134217728 Input Preferences _NS:610 -2038284288 129 200 25 NO 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{87, 96}, {230, 204}} _NS:2165 YES 134217728 33554432 NSImage Image_Piano _NS:2165 0 0 0 NO NO YES {400, 320} _NS:1109 NSView 268 268 {{127, 12}, {150, 32}} _NS:610 YES 67108864 134217728 Input Preferences _NS:610 -2038284288 129 200 25 NO 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{53, 96}, {297, 204}} _NS:2165 YES 134217728 33554432 NSImage Image_PaddleController _NS:2165 0 3 0 NO NO YES 268 {{17, 60}, {366, 28}} _NS:3939 YES 67108864 272760832 This is an input device. You can set up this device through your Input Preferences. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 268 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{60, 70}, {279, 214}} _NS:2165 YES 134217728 33816576 NSImage Image_PassME _NS:2165 0 3 0 NO NO YES 268 {{17, 20}, {366, 17}} _NS:3939 YES 67108864 138674176 No additional configuration required. _NS:3939 NO 1 {400, 320} _NS:1109 NSView 279 2 {{230, 19}, {286, 522}} -461896704 Emulation Settings NSPanel 256 12 274 268 {{16, 32}, {171, 18}} 1 YES -2080374784 131072 Advanced Bus-Level Timing 1211912448 2 200 25 NO 268 {{16, 12}, {187, 18}} 10 YES 67108864 131072 Rigorous 3D Rendering Timing 1211912448 2 200 25 NO {{1, 1}, {250, 58}} {{17, 428}, {252, 74}} {0, 0} 67108864 0 Emulation Timing 1 0 2 NO 12 274 268 {{16, 52}, {162, 18}} 2 YES 67108864 131072 Use External BIOS Images 1211912448 2 200 25 NO 268 {{35, 32}, {127, 18}} 3 YES -2080374784 131072 Emulate BIOS SWIs 1211912448 2 200 25 NO 268 {{35, 12}, {138, 18}} 4 YES 67108864 131072 Patch DelayLoop SWI 1211912448 2 200 25 NO {{1, 1}, {250, 78}} {{17, 224}, {252, 94}} {0, 0} 67108864 0 BIOS Configuration 1 0 2 NO 12 274 268 {{15, 32}, {177, 18}} 5 YES 67108864 131072 Use External Firmware Image 1211912448 2 200 25 NO 268 {{15, 12}, {130, 18}} 6 YES 67108864 131072 Boot From Firmware 1211912448 2 200 25 NO 265 {{176, 54}, {27, 27}} YES -2080374784 134217728 -2033434624 160 400 75 NO 268 {{15, 61}, {157, 14}} YES 68157504 272761856 Configure Internal Firmware: NO 1 {{1, 1}, {250, 85}} {{17, 119}, {252, 101}} {0, 0} 67108864 0 Firmware Configuration 1 0 2 NO 268 {{62, 18}, {162, 19}} YES -2080374784 134217728 Save Settings as Default YES 12 787 -2038153216 164 400 75 NO 12 274 268 {{15, 32}, {128, 18}} 9 YES 67108864 131072 Use Debug Console 1211912448 2 200 25 NO 268 {{15, 12}, {105, 18}} YES 67108864 131072 Emulate Ensata 1211912448 2 200 25 NO {{1, 1}, {250, 58}} {{17, 41}, {252, 74}} {0, 0} 67108864 0 Debugger Configuration 1 0 2 NO 12 274 268 {{18, 38}, {145, 38}} YES NO 2 1 -2080374784 131072 Interpreter 1211912448 0 200 25 67108864 131072 Dynamic Recompiler 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {145, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 268 {{198, 11}, {19, 27}} YES 67895328 0 12 1 100 1 YES NO 268 {{157, 16}, {40, 19}} YES -1804599231 71435264 -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO YES NO 1 268 {{74, 18}, {78, 14}} YES 68157504 71435264 Block Size: NO 1 {{1, 1}, {250, 86}} {{17, 322}, {252, 102}} {0, 0} 67108864 0 CPU Emulation Engine 1 0 2 NO {286, 522} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} EmulationSettingsPanel YES 256 268 {{53, 18}, {154, 19}} YES -2080374784 134217728 Apply -2038153216 164 400 75 NO 268 {{107, 212}, {136, 22}} YES -2076180416 133120 109199360 129 400 75 Gray 2147483647 1 _popUpItemAction: YES OtherViews Brown 2147483647 _popUpItemAction: 1 Red 2147483647 _popUpItemAction: 2 Pink 2147483647 _popUpItemAction: 3 Orange 2147483647 _popUpItemAction: 4 Yellow 2147483647 _popUpItemAction: 5 Lime Green 2147483647 _popUpItemAction: 6 Green 2147483647 _popUpItemAction: 7 Dark Green 2147483647 _popUpItemAction: 8 Sea Green 2147483647 _popUpItemAction: 9 Turquoise 2147483647 _popUpItemAction: 10 Blue 2147483647 _popUpItemAction: 11 Dark Blue 2147483647 _popUpItemAction: 12 Dark Purple 2147483647 _popUpItemAction: 13 Violet 2147483647 _popUpItemAction: 14 Magenta 2147483647 _popUpItemAction: 15 1 YES YES 2 NO 268 {{107, 157}, {136, 22}} YES -2076180416 133120 109199360 129 400 75 English 2147483647 1 _popUpItemAction: 1 YES OtherViews Japanese 2147483647 _popUpItemAction: French 2147483647 _popUpItemAction: 2 German 2147483647 _popUpItemAction: 3 Italian 2147483647 _popUpItemAction: 4 Spanish 2147483647 _popUpItemAction: 5 1 1 YES YES 2 NO 268 {{17, 45}, {226, 98}} YES 67108864 272760832 Note: To use this configuration, click Apply, and then reset the emulator. Also, these settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled. NO 1 268 {{110, 186}, {133, 27}} YES 71303168 131072 0.0 224 NO 268 {{17, 162}, {88, 14}} YES 68157504 71435264 Language: NO 1 268 {{17, 190}, {88, 14}} YES 68157504 71435264 Birthday: NO 1 268 {{17, 217}, {88, 14}} YES 68157504 71435264 Favorite Color: NO 1 268 {{17, 264}, {88, 14}} YES 68157504 71435264 Message: NO 1 268 {{17, 291}, {88, 14}} YES 68157504 71435264 Nickname: NO 1 268 {{110, 241}, {130, 40}} YES -1805647871 272760832 Enter a message... YES NO 1 268 {{110, 289}, {130, 19}} YES -1804599231 272761856 Enter a nickname... YES NO 1 {260, 328} NSView {260, 328} {0, 328} {260, 328} 2 0.0 0.0 23 2 {{144, 214}, {254, 262}} -461896704 Execution Control NSPanel 256 268 {{0, 230}, {32, 32}} _NS:2530 YES 67108864 134217728 _NS:2530 -2033958912 134 NSImage Icon_Execute_420x420 400 75 NO 268 {{32, 230}, {32, 32}} _NS:2530 YES 67108864 134217728 _NS:2530 -2033958912 134 NSImage Icon_Pause_420x420 400 75 NO 268 {{64, 230}, {32, 32}} _NS:2530 YES 67108864 134217728 _NS:2530 -2033958912 134 NSImage Icon_FrameAdvance_420x420 400 75 NO 268 {{222, 230}, {32, 32}} _NS:2530 YES 67108864 134217728 _NS:2530 -2033958912 134 NSImage Icon_Reset_420x420 400 75 NO 268 {{96, 230}, {32, 32}} _NS:2530 YES 67108864 134217728 _NS:2530 -2033958912 134 NSImage Icon_FrameJump_420x420 400 75 NO 12 274 268 {{176, 53}, {64, 19}} _NS:817 YES -1804599231 272761856 -∞ # +∞ # # NaN 3 YES YES YES . , NO NO NO _NS:817 YES NO 1 268 {{176, 33}, {64, 19}} _NS:817 YES -1804599231 -1874721792 -∞ +∞ # # NaN 3 YES YES YES . , NO NO NO _NS:817 YES NO 1 268 {{18, 14}, {150, 58}} _NS:736 YES NO 3 1 -2080374784 131072 Jump forward frames: 1211912448 0 200 25 67108864 131072 Jump to frame number: 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 603979776 131072 Jump to next marker 2 1211912448 0 12779520 regular normal radiobutton {18, 18} 0 YES NSCalibratedRGBColorSpace 400 75 {150, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 {{1, 1}, {258, 82}} _NS:21 {{-3, 124}, {260, 98}} _NS:18 {0, 0} 67108864 0 Frame Jump Properties 1 0 2 NO 12 274 268 {{18, 30}, {222, 16}} YES -2080112384 262144 10 0.0 1 0.0 11 1 NO NO NO 268 {{219, 45}, {28, 11}} YES 68157504 138675200 10x NO 1 268 {{52, 45}, {28, 11}} YES 68157504 138675200 2x NO 1 268 {{94, 45}, {28, 11}} YES 68157504 138675200 4x NO 1 268 {{136, 45}, {28, 11}} YES 68157504 138675200 6x NO 1 268 {{178, 45}, {28, 11}} YES 68157504 138675200 8x NO 1 268 {{150, 62}, {90, 17}} 100 YES 67108864 134348800 Normal Speed -2038153216 164 400 75 NO 268 {{15, 14}, {133, 14}} YES 68157504 4326400 Execution speed set to: NO 1 268 {{150, 14}, {93, 14}} YES 68157504 4326400 statusText NO 1 268 {{15, 62}, {98, 18}} YES -2080374784 131072 Enable Limiter 1211912448 2 200 25 NO 268 {{9, 45}, {28, 11}} YES 68157504 138675200 0x NO 1 {{1, 1}, {258, 88}} _NS:21 {{-3, 16}, {260, 104}} _NS:18 {0, 0} 67108864 0 Execution Speed Properties 1 0 2 NO 268 {{4, 4}, {45, 14}} _NS:4068 YES 68157504 272761856 Frame: _NS:4068 NO 1 268 {{51, 4}, {186, 14}} _NS:4068 YES 68157504 272761856 statusText _NS:4068 NO 1 {254, 262} _NS:103 {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} ExecutionControlPanel NO 279 2 {{170, 20}, {194, 241}} -461896704 HUD Settings NSPanel 256 268 {{18, 174}, {158, 18}} YES -2080374784 131072 Frame Counter 1211912448 2 200 25 NO 268 {{18, 154}, {158, 18}} YES -2080374784 131072 Frames Per Second 1211912448 2 200 25 NO 268 {{18, 134}, {158, 18}} YES -2080374784 131072 Input 1211912448 2 200 25 NO 268 {{18, 114}, {158, 18}} YES -2080374784 131072 Graphical Input 1211912448 2 200 25 NO 268 {{18, 94}, {158, 18}} YES -2080374784 131072 Lag Counter 1211912448 2 200 25 NO 268 {{18, 74}, {158, 18}} YES -2080374784 131072 Microphone 1211912448 2 200 25 NO 268 {{18, 54}, {158, 18}} YES -2080374784 131072 Real Time Clock 1211912448 2 200 25 NO 268 {{16, 18}, {162, 19}} YES -2080374784 134217728 Save Settings as Default -2038153216 164 400 75 NO 268 {{18, 205}, {158, 18}} YES -2080374784 131072 Enable HUD 1211912448 2 200 25 NO 12 {{21, 196}, {153, 5}} {0, 0} 67108864 0 Box 3 2 0 NO {194, 241} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} YES 279 2 {{1004, 23}, {204, 713}} -461896704 Video Settings NSPanel 256 268 {{21, 18}, {162, 19}} YES -2080374784 134217728 Save Settings as Default -2038153216 164 400 75 NO 12 274 268 {{18, 14}, {132, 358}} YES NO 18 1 -2080374784 131072 None 1211912448 2 NSImage NSRadioButton 200 25 67108864 131072 Nearest 2x 11 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 1140850688 131072 Scanline 9 1211912448 0 12779520 regular normal radiobutton {18, 18} 0 YES NSCalibratedRGBColorSpace 400 75 1140850688 131072 EPX 14 1211912448 0 400 75 1140850688 131072 EPX+ 15 1211912448 0 400 75 67108864 131072 Super Eagle 8 1211912448 0 400 75 1140850688 131072 2xSaI 6 1211912448 0 400 75 67108864 131072 Super 2xSaI 7 1211912448 0 400 75 1140850688 131072 LQ2x 1 1211912448 0 400 75 67108864 131072 LQ2xS 2 1211912448 0 400 75 67108864 131072 HQ2x 3 1211912448 0 400 75 1140850688 131072 HQ2xS 4 1211912448 0 400 75 67108864 131072 HQ4x 5 1211912448 0 400 75 67108864 131072 HQ4xS 18 1211912448 0 400 75 67108864 131072 2xBRZ 19 1211912448 0 400 75 67108864 131072 3xBRZ 20 1211912448 0 400 75 67108864 131072 4xBRZ 21 1211912448 0 400 75 67108864 131072 5xBRZ 22 1211912448 0 12779520 regular normal radiobutton {18, 18} 0 YES NSCalibratedRGBColorSpace 400 75 {132, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 {{1, 1}, {168, 382}} {{17, 41}, {170, 398}} {0, 0} 67108864 0 Pixel Scaler 1 0 2 NO 268 {{17, 685}, {113, 18}} YES 67108864 131072 Use vertical sync 1211912448 2 200 25 NO 268 {{17, 665}, {178, 18}} _NS:682 YES -2080374784 131072 Run filters on GPU if possible _NS:682 1211912448 2 200 25 NO 12 274 268 {{15, 12}, {87, 18}} _NS:682 YES -2080374784 131072 Deposterize _NS:682 1211912448 2 200 25 NO {{1, 1}, {168, 38}} _NS:21 {{17, 605}, {170, 54}} _NS:18 {0, 0} 67108864 0 Source Filters 1 0 2 NO 12 274 268 {{18, 14}, {132, 118}} _NS:736 YES NO 6 1 67108864 131072 Nearest Neighbor 1211912448 0 200 25 -2080374784 131072 Bilinear 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67108864 131072 Bicubic (B-Spline) 2 1211912448 0 400 75 67108864 131072 Bicubic (Mitchell) 3 1211912448 0 400 75 67108864 131072 Lanczos2 4 1211912448 0 400 75 67108864 131072 Lanczos3 5 1211912448 0 400 75 {132, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 1 {{1, 1}, {168, 142}} _NS:21 {{17, 443}, {170, 158}} _NS:18 {0, 0} 67108864 0 Output Filter 1 0 2 NO {204, 713} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} DisplayVideoSettingsPanel YES 279 2 {{149, 201}, {301, 467}} -461896704 3D Rendering Settings NSPanel 256 12 274 268 {{15, 145}, {206, 18}} YES -2080374784 131072 High-Precision Color Interpolation 1211912448 2 200 25 NO 268 {{15, 125}, {135, 18}} YES -2080374784 131072 Enable Edge Marking 1211912448 2 200 25 NO 268 {{15, 105}, {82, 18}} YES -2080374784 131072 Enable Fog 1211912448 2 200 25 NO 268 {{185, 39}, {45, 19}} YES -1804599231 71435264 # -∞ # +∞ # # NaN 3 YES YES YES . , NO NO NO YES NO 1 268 {{15, 41}, {165, 14}} YES 68157504 4326400 Depth Comparison Threshold: NO 1 268 {{15, 15}, {109, 14}} YES 68157504 4326400 Rendering Threads: NO 1 268 {{231, 34}, {19, 27}} YES 67895328 0 100 1 YES NO 268 {{15, 85}, {115, 18}} YES -2080374784 131072 Enable Line Hack 1211912448 2 200 25 NO 268 {{15, 65}, {195, 18}} YES -2080374784 131072 Enable Fragment Sampling Hack 1211912448 2 200 25 NO 268 {{126, 10}, {124, 22}} _NS:791 YES -2076180416 133120 _NS:791 109199360 129 400 75 Automatic 2147483647 1 _popUpItemAction: YES OtherViews Single-Threaded 2147483647 _popUpItemAction: 1 2 Threads 2147483647 _popUpItemAction: 2 4 Threads 2147483647 _popUpItemAction: 4 8 Threads 2147483647 _popUpItemAction: 8 16 Threads 2147483647 _popUpItemAction: 16 32 Threads 2147483647 _popUpItemAction: 32 1 YES YES 2 NO {{1, 1}, {265, 171}} {{17, 99}, {267, 187}} {0, 0} 67108864 0 SoftRasterizer Options 1 0 2 NO 268 {{69, 18}, {162, 19}} YES -2080374784 134217728 Save Settings as Default -2038153216 164 400 75 NO 12 274 268 {{18, 14}, {107, 58}} YES NO 3 1 67108864 131072 None 1211912448 0 200 25 -2080374784 131072 SoftRasterizer 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67108864 131072 OpenGL 2 1211912448 0 400 75 {107, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 1 {{1, 1}, {265, 82}} {{17, 349}, {267, 98}} {0, 0} 67108864 0 3D Rendering Engine 1 0 2 NO 12 274 268 {{15, 12}, {108, 18}} YES -2080374784 131072 Enable Textures 1211912448 2 200 25 NO {{1, 1}, {265, 38}} {{17, 291}, {267, 54}} {0, 0} 67108864 0 General Settings 1 0 2 NO 12 274 268 {{16, 12}, {192, 18}} YES 67108864 131072 Enable Multisample Antialiasing 1211912448 2 200 25 NO {{1, 1}, {265, 38}} {{17, 41}, {267, 54}} {0, 0} 67108864 0 OpenGL Options 1 0 2 NO {301, 467} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} 3DRenderingSettingsPanel YES 279 2 {{196, 132}, {387, 323}} -461896704 Microphone Settings NSPanel 256 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{11, 119}, {48, 48}} _NS:9 {251, 251} YES 134217728 33554432 NSImage Icon_MicrophoneBlack_256x256 _NS:9 0 0 0 NO NO YES 268 {{60, 125}, {248, 18}} _NS:9 YES 134217728 0 _NS:9 42 30 40 2 NO 268 {{118, 19}, {150, 19}} _NS:610 YES 67108864 134217728 Input Preferences _NS:610 -2038284288 164 200 25 NO 268 {{58, 148}, {150, 14}} _NS:526 {251, 750} YES 68157504 272761856 NDS Microphone Level: _NS:526 NO 1 12 274 268 {{16, 92}, {110, 14}} _NS:526 {251, 750} YES 68157504 71435264 Name: _NS:526 NO 1 268 {{16, 75}, {110, 14}} _NS:526 {251, 750} YES 68157504 71435264 Manufacturer: _NS:526 NO 1 268 {{16, 58}, {110, 14}} _NS:526 {251, 750} YES 68157504 71435264 Sample Rate: _NS:526 NO 1 268 {{130, 92}, {205, 14}} _NS:526 {251, 750} YES 68157504 4326400 deviceName _NS:526 NO 1 268 {{130, 75}, {205, 14}} _NS:526 {251, 750} YES 68157504 4326400 deviceManufacturer _NS:526 NO 1 268 {{130, 58}, {205, 14}} _NS:526 {251, 750} YES 68157504 4326400 deviceSampleRate _NS:526 NO 1 268 {{65, 23}, {205, 27}} _NS:9 YES -1543241472 0 _NS:9 100 0.0 0.0 0.0 5 0 NO NO NO 268 {{67, 14}, {26, 11}} _NS:526 {251, 750} YES 68157504 272892928 0% _NS:526 NO 1 268 {{112, 14}, {33, 11}} _NS:526 {251, 750} YES 68157504 272892928 25% _NS:526 NO 1 268 {{156, 14}, {33, 11}} _NS:526 {251, 750} YES 68157504 272892928 50% _NS:526 NO 1 268 {{204, 14}, {33, 11}} _NS:526 {251, 750} YES 68157504 272892928 75% _NS:526 NO 1 268 {{248, 14}, {41, 11}} _NS:526 {251, 750} YES 68157504 272892928 100% _NS:526 NO 1 268 {{24, 33}, {37, 17}} _NS:526 {251, 750} YES 68157504 71304192 Gain: _NS:526 NO 1 268 {{263, 33}, {72, 17}} YES 605028416 71308288 -∞ +∞ #0.0% #0.0% NaN 3 YES YES YES . , NO NO YES %1.1f%% NO 1 {{1, 1}, {351, 116}} _NS:11 {{17, 171}, {353, 132}} _NS:9 {0, 0} 67108864 0 Host Device Information 1 0 2 NO 268 {{310, 125}, {59, 20}} _NS:682 YES 67108864 0 Mute _NS:682 1211912448 2 200 25 NO 268 {{18, 46}, {351, 56}} _NS:9 {250, 750} YES 67108864 272760832 You can also generate audio samples in software and send them to the NDS. You can configure this with the Microphone command in your Input Preferences. _NS:9 NO YES 1 12 {{11, 108}, {364, 5}} _NS:9 {0, 0} 67108864 0 Box 3 2 0 NO {387, 323} _NS:21 {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} MicrophoneSettingsPanel YES 279 2 {{230, 30}, {288, 511}} -461896704 Sound Settings NSPanel 256 12 274 268 {{18, 14}, {61, 58}} YES NO 3 1 67108864 131072 None 1211912448 0 200 25 67108864 131072 Linear 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 -2080374784 131072 Cosine 2 1211912448 0 400 75 {61, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 2 {{1, 1}, {253, 82}} {{16, 189}, {255, 98}} {0, 0} 67108864 0 SPU Interpolation Method 1 0 2 NO 12 274 268 {{18, 80}, {154, 38}} YES NO 2 1 67108864 131072 Dual SPU Synch/Asynch 1211912448 0 200 25 -2080374784 131072 Synchronous 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {154, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 1 268 {{53, 14}, {100, 58}} YES NO 3 1 -2080374784 131072 "N" Method 1211912448 0 200 25 67108864 131072 "Z" Method 1 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67108864 131072 "P" Method 2 1211912448 0 400 75 {100, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 {{1, 1}, {253, 128}} {{16, 41}, {255, 144}} {0, 0} 67108864 0 SPU Sound Synchronization Method 1 0 2 NO 12 274 268 {{15, 12}, {135, 18}} YES -2080374784 131072 Advanced SPU Logic 1211912448 2 200 25 NO {{1, 1}, {253, 38}} {{16, 291}, {255, 54}} {0, 0} 67108864 0 SPU Configuration 1 0 2 NO 12 274 268 {{40, 13}, {132, 21}} YES 67371264 0 100 0.0 100 0.0 0 1 NO NO NO 268 {{172, 17}, {66, 17}} YES 68157504 71308288 -∞ +∞ #0.0% #0.0% NaN 3 YES YES YES . , NO NO YES %1.1f%% NO 1 289 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{18, 16}, {16, 16}} YES 134217728 33554432 0 2 0 YES NO YES {{1, 1}, {253, 44}} {{16, 349}, {255, 60}} {0, 0} 67108864 0 General Settings 1 0 2 NO 268 {{62, 18}, {162, 19}} YES -2080374784 134217728 Save Settings as Default -2038153216 164 400 75 NO 12 274 268 {{18, 14}, {116, 38}} YES NO 2 1 67108864 131072 None 1211912448 0 200 25 -2080374784 131072 OS X Core Audio 58325 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {116, 18} {4, 2} 1151868928 NSActionCell 67108864 131072 Radio 1211912448 0 549453824 {18, 18} TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAxIAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMSExp bm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAA A0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAA BDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA b6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYx OTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABM CVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3 AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHp AfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAML AxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+ BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZI BlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3Arz CwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTw FRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhx KKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUT NU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76Dwn PGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkvi TCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSP VNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3J XhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeT Z+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHw cktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzh fUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2 y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 2vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn +3f8B/yY/Sn9uv5L/tz/bf//A 400 75 1 {{1, 1}, {253, 62}} {{16, 413}, {255, 78}} {0, 0} 67108864 0 Audio Output Engine 1 0 2 NO {288, 511} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} SoundSettingsPanel YES 15 2 {{64, 101}, {330, 811}} 1685585920 ROM Info RomInfoPanel {330, 811} {330, 88} 256 274 2322 268 266 10 {{0, 40}, {321, 5}} _NS:2429 {0, 0} 67108864 0 Box 3 2 0 NO 268 {{8, 27}, {13, 13}} _NS:4078 YES -2080374784 0 _NS:4078 -1198768128 133 200 25 NO 268 {{23, 26}, {206, 14}} _NS:4068 YES 68157504 272761856 Miscellaneous _NS:4068 NO 1 266 {{192, 8}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 268 {{4, 8}, {186, 14}} YES 68157504 71304192 Icon/Title Offset: NO 1 {{0, -2}, {321, 44}} _NS:1109 RomInfoPanelSectionView 266 10 {{0, 92}, {322, 5}} _NS:2429 {0, 0} 67108864 0 Box 3 2 0 NO 268 {{8, 78}, {13, 13}} _NS:4078 YES -2080374784 0 _NS:4078 -1198768128 133 200 25 NO 268 {{23, 77}, {206, 14}} _NS:4068 YES 68157504 272761856 File System _NS:4068 NO 1 266 {{192, 9}, {112, 14}} YES 70254657 4199424 ? bytes NO 1 268 {{4, 9}, {186, 14}} YES 68157504 71304192 FAT Size: NO 1 266 {{192, 25}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 268 {{4, 25}, {186, 14}} YES 68157504 71304192 FAT ROM Offset: NO 1 266 {{192, 41}, {112, 14}} YES 70254657 4199424 ? bytes NO 1 268 {{4, 41}, {186, 14}} YES 68157504 71304192 FNT Size: NO 1 266 {{192, 57}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 268 {{4, 57}, {186, 14}} YES 68157504 71304192 FNT ROM Offset: NO 1 {{0, 42}, {321, 95}} _NS:1109 RomInfoPanelSectionView 266 10 {{0, 155}, {322, 5}} _NS:2429 {0, 0} 67108864 0 Box 3 2 0 NO 268 {{8, 141}, {13, 13}} _NS:4078 YES -2080374784 0 _NS:4078 -1198768128 133 200 25 NO 266 {{23, 140}, {206, 14}} _NS:4068 YES 68157504 272761856 ARM9 & ARM7 Binaries _NS:4068 NO 1 266 {{192, 10}, {112, 14}} YES 70254657 4199424 ? bytes NO 1 266 {{192, 26}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 266 {{192, 42}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 266 {{192, 58}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 266 {{192, 74}, {112, 14}} YES 70254657 4199424 ? bytes NO 1 266 {{192, 90}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 266 {{192, 106}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 266 {{192, 122}, {112, 14}} YES 70254657 4199424 0xXXXXXXXX NO 1 268 {{4, 10}, {186, 14}} YES 68157504 71304192 ARM7 Binary Size: NO 1 268 {{4, 26}, {186, 14}} YES 68157504 71304192 ARM7 Binary Start Address: NO 1 268 {{4, 42}, {186, 14}} YES 68157504 71304192 ARM7 Binary Entry Address: NO 1 268 {{4, 58}, {186, 14}} YES 68157504 71304192 ARM7 Binary ROM Offset: NO 1 268 {{4, 74}, {186, 14}} YES 68157504 71304192 ARM9 Binary Size: NO 1 268 {{4, 90}, {186, 14}} YES 68157504 71304192 ARM9 Binary Start Address: NO 1 268 {{4, 106}, {186, 14}} YES 68157504 71304192 ARM9 Binary Entry Address: NO 1 268 {{4, 122}, {186, 14}} YES 68157504 71304192 ARM9 Binary ROM Offset: NO 1 {{0, 137}, {321, 158}} _NS:1109 RomInfoPanelSectionView 266 10 {{0, 91}, {321, 5}} _NS:2429 {0, 0} 67108864 0 Box 3 2 0 NO 268 {{8, 77}, {13, 13}} _NS:4078 YES -2080374784 0 _NS:4078 -1198768128 133 200 25 NO 268 {{23, 76}, {206, 14}} _NS:4068 YES 68157504 272761856 General _NS:4068 NO 1 266 {{95, 9}, {166, 14}} YES 70254657 4199424 ? bytes NO 1 268 {{-3, 9}, {96, 14}} YES 68157504 71304192 Remaining: NO 1 266 {{95, 25}, {166, 14}} YES 70254657 4199424 ? bytes NO 1 268 {{-3, 25}, {96, 14}} YES 68157504 71304192 Used: NO 1 266 {{95, 57}, {166, 14}} YES 70254657 4330496 unitCode NO 1 268 {{-3, 57}, {96, 14}} YES 68157504 71435264 Kind: NO 1 266 {{95, 41}, {166, 14}} YES 70254657 4330496 ? bytes NO 1 268 {{-3, 41}, {96, 14}} YES 68157504 71435264 Capacity: NO 1 {{0, 627}, {321, 94}} _NS:1109 RomInfoPanelSectionView 266 268 {{8, 315}, {13, 13}} _NS:4078 YES -2080374784 0 _NS:4078 -1198768128 133 200 25 NO 268 {{23, 314}, {206, 14}} _NS:4068 YES 68157504 272761856 Titles _NS:4068 NO 1 10 {{-3, 329}, {321, 5}} _NS:2429 {0, 0} 67108864 0 Box 3 2 0 NO 266 {{95, 18}, {214, 42}} YES 69206017 272764928 ? NO 1 266 {{95, 68}, {214, 42}} YES 69206017 272764928 ? NO 1 266 {{95, 118}, {214, 42}} YES 69206017 272764928 ? NO 1 266 {{95, 168}, {214, 42}} YES 69206017 272764928 ? NO 1 266 {{95, 218}, {214, 42}} YES 69206017 272764928 ? NO 1 266 {{95, 268}, {214, 42}} YES 69206017 272764928 ? NO 1 268 {{-3, 18}, {96, 42}} YES 67108864 71438336 Spanish: NO 1 268 {{-3, 68}, {96, 42}} YES 67108864 71438336 Italian: NO 1 268 {{-3, 118}, {96, 42}} YES 67108864 71438336 German: NO 1 268 {{-3, 168}, {96, 42}} YES 67108864 71438336 French: NO 1 268 {{-3, 218}, {96, 42}} YES 67108864 71438336 English: NO 1 268 {{-3, 268}, {96, 42}} YES 67108864 71438336 Japanese: NO 1 {{0, 295}, {321, 332}} _NS:1109 RomInfoPanelSectionView 266 {{165, 727}, {152, 42}} YES 69206017 4329472 gameDeveloperWithCode NO 1 266 {{165, 771}, {152, 14}} YES 70254657 4330496 romSerial NO 1 266 {{165, 787}, {152, 14}} YES 70254657 4330496 romInternalName NO 1 268 {{77, 755}, {86, 14}} YES 68157504 71435264 Developer: NO 1 268 {{78, 771}, {86, 14}} YES 68157504 71435264 Serial: NO 1 268 {{78, 787}, {86, 14}} YES 68157504 71439360 Name: NO 1 12 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{9, 735}, {64, 64}} YES 134217728 33554432 0 3 0 NO NO YES {319, 810} RomInfoContentView {{1, 1}, {315, 810}} _NS:353 4 YES 256 {{316, 1}, {15, 810}} _NS:359 NO _doScroller: _doScroller: 0.99629629629629635 -2147483392 {{-100, -100}, {295, 15}} _NS:363 YES NO _doScroller: 1 _doScroller: 0.94551282051282048 {{-1, -1}, {332, 812}} _NS:351 133266 AAAAAEEgAAAAAAAAQSAAAA 0.25 4 1 {330, 811} {{0, 0}, {1920, 1177}} {330, 110} {330, 833} ROMInfoPanel YES 279 2 {{162, 281}, {213, 198}} -461896704 Set Rotation NSPanel 256 268 {{88, 119}, {32, 34}} YES 67371264 0 360 0.0 0.0 0.0 4 1 NO NO 1 NO 268 {{85, 161}, {38, 17}} YES 68157504 138413056 0Âş NO 1 268 {{85, 94}, {39, 17}} YES 68157504 138413056 180Âş NO 1 268 {{44, 127}, {39, 17}} YES 68157504 138413056 270Âş NO 1 268 {{125, 127}, {38, 17}} YES 68157504 138413056 90Âş NO 1 268 {{127, 69}, {57, 17}} YES 68157504 272630784 ¤ ¤¤ #0.00Âş Âş #0.00Âş Âş #0.00Âş #0.00Âş NaN 3 YES YES YES . , NO NO YES rotX NO 1 268 {{24, 69}, {101, 17}} YES 68157504 272630784 Rotation set to: NO 1 268 {{23, 42}, {162, 19}} YES -2080374784 134217728 Set to 0Âş -2038153216 164 400 75 NO 268 {{23, 17}, {162, 19}} YES -2080374784 134217728 Save Settings as Default -2038153216 164 400 75 NO {213, 198} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} SetRotationPanel YES 279 2 {{230, 408}, {441, 133}} -461896704 Set Separation NSPanel 256 268 {{30, 73}, {385, 26}} YES -2080112384 0 2 0.0 1 0.0 5 1 NO NO NO 268 {{388, 99}, {40, 14}} YES 68157504 138544128 200% NO 1 268 {{297, 99}, {40, 14}} YES 68157504 138544128 150% NO 1 268 {{207, 99}, {40, 14}} YES 68157504 138544128 100% NO 1 268 {{116, 99}, {38, 14}} YES 68157504 138544128 50% NO 1 268 {{25, 99}, {38, 14}} YES 68157504 138544128 0% NO 1 268 {{248, 51}, {108, 17}} YES 68157504 71304192 Gap Percentage: NO 1 268 {{358, 51}, {66, 17}} YES 68157504 -2143288320 -∞ +∞ #0.0% #0.0% NaN 3 YES YES YES . , NO NO YES 1.1f% NO 1 268 {{20, 48}, {100, 19}} YES -2080374784 134217728 Set to 0% -2038153216 164 400 75 NO 268 {{128, 48}, {100, 19}} 100 YES -2080374784 134217728 Set to 100% -2038153216 164 400 75 NO 268 {{142, 18}, {162, 19}} YES -2080374784 134217728 Save Settings as Default -2038153216 164 400 75 NO {441, 133} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} SetSeparationPanel YES 279 2 {{230, 202}, {173, 339}} -461896704 GPU Layers NSPanel 256 12 274 268 {{15, 112}, {108, 18}} YES -2080374784 131072 GPU (All Layers) 1211912448 2 200 25 NO 268 {{33, 92}, {46, 18}} 1 YES -2080374784 131072 BG0 1211912448 2 200 25 NO 268 {{33, 72}, {46, 18}} 2 YES -2080374784 131072 BG1 1211912448 2 200 25 NO 268 {{33, 52}, {46, 18}} 3 YES -2080374784 131072 BG2 1211912448 2 200 25 NO 268 {{33, 32}, {46, 18}} 4 YES -2080374784 131072 BG3 1211912448 2 200 25 NO 268 {{33, 12}, {46, 18}} 5 YES -2080374784 131072 OBJ 1211912448 2 200 25 NO {{1, 1}, {137, 138}} {{17, 174}, {139, 154}} {0, 0} 67108864 0 Main 1 0 2 NO 12 274 268 {{15, 112}, {108, 18}} 6 YES -2080374784 131072 GPU (All Layers) 1211912448 2 200 25 NO 268 {{33, 92}, {46, 18}} 7 YES -2080374784 131072 BG0 1211912448 2 200 25 NO 268 {{33, 72}, {46, 18}} 8 YES -2080374784 131072 BG1 1211912448 2 200 25 NO 268 {{33, 52}, {46, 18}} 9 YES -2080374784 131072 BG2 1211912448 2 200 25 NO 268 {{33, 32}, {46, 18}} 10 YES -2080374784 131072 BG3 1211912448 2 200 25 NO 268 {{33, 12}, {46, 18}} 11 YES -2080374784 131072 OBJ 1211912448 2 200 25 NO {{1, 1}, {137, 138}} {{17, 16}, {139, 154}} {0, 0} 67108864 0 Sub 1 0 2 NO {173, 339} {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} GPULayersPanel YES 279 2 {{162, 360}, {290, 119}} -461896704 GDB Stub Control NSPanel 256 268 {{190, 80}, {80, 19}} _NS:817 YES -1804599231 272761856 -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO _NS:817 YES NO 1 268 {{190, 55}, {80, 19}} _NS:817 YES -1804599231 272761856 -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO _NS:817 YES NO 1 268 {{17, 80}, {112, 18}} _NS:682 YES 67108864 131072 Enable for ARM9 _NS:682 1211912448 2 200 25 NO 268 {{17, 55}, {112, 18}} _NS:682 YES 67108864 131072 Enable for ARM7 _NS:682 1211912448 2 200 25 NO 268 {{147, 82}, {38, 14}} _NS:4068 YES 68157504 71435264 Port: _NS:4068 NO 1 268 {{147, 57}, {38, 14}} _NS:4068 YES 68157504 71435264 Port: _NS:4068 NO 1 268 {{97, 18}, {100, 19}} _NS:2460 YES -2080374784 134217728 Start _NS:2460 -2038153216 164 Stop 400 75 NO {290, 119} _NS:103 {{0, 0}, {1920, 1177}} {10000000000000, 10000000000000} GDBStubControlPanel NO 268 268 {{195, 5}, {226, 26}} YES -2076180416 2048 109199360 1 400 75 DeSmuME ROM Save (.dsv) 2147483647 1 _popUpItemAction: YES OtherViews No$GBA ROM Save (.sav) 2147483647 _popUpItemAction: 1 Raw Save File (.sav) 2147483647 _popUpItemAction: 2 1 YES YES 2 NO 268 {{17, 11}, {176, 17}} YES 68157504 71304192 Select ROM Save Format: NO 1 {450, 35} NSView 7 2 {{88, 206}, {580, 592}} 1685586944 Troubleshooting Form NSWindow {580, 592} {580, 592} 256 {580, 592} {{0, 0}, {1920, 1177}} {580, 614} {580, 614} YES 268 1292 {{364, 339}, {32, 32}} 28682 100 265 {{396, 343}, {168, 28}} YES 69206017 272764928 TmFtZToKU2VyaWFsOg NO 1 265 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{364, 341}, {30, 30}} YES 134217728 33554432 0 3 0 NO NO YES 256 2304 2322 Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {523, 202} 38 523 1 67121027 0 1 6 {525, 10000000} {{1, 1}, {523, 202}} 4 YES 256 {{524, 1}, {15, 202}} NO _doScroller: _doScroller: 0.99248120300751874 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{20, 61}, {540, 204}} 133138 0.25 4 1 288 {{125, 16}, {438, 28}} YES 67108864 272760832 And that's it! Click Continue to review your information before submitting it to the DeSmuME team. NO 1 34 {{12, 50}, {556, 5}} {0, 0} 67108864 0 Box 3 2 0 NO 269 {{17, 273}, {546, 28}} YES 67108864 272760832 In the field below, briefly describe your situation and what you need help with. (Please be as specific as possible! It will help us to understand your situation better.) NO 1 269 {{17, 309}, {546, 17}} YES 68157504 272630784 Tell us what you need help with. NO 1 10 {{12, 332}, {556, 5}} {0, 0} 67108864 0 Box 3 2 0 NO 269 {{17, 489}, {546, 42}} YES 67108864 272760832 Do you need help with using DeSmuME? If so, it never hurts to ask! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your issue quicker and easier. NO 1 269 {{17, 539}, {546, 17}} YES 68157504 138413056 DeSmuME Technical Support Request Form NO 1 10 {{12, 478}, {556, 5}} {0, 0} 67108864 0 Box 3 2 0 NO 269 {{17, 455}, {546, 17}} YES 68157504 272630784 Tell us about the ROM. NO 1 269 {{17, 405}, {546, 42}} YES 67108864 272760832 If your issue is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.) NO 1 268 {{17, 347}, {84, 17}} YES 68157504 272630784 ROM Serial: NO 1 268 {{17, 377}, {84, 17}} YES 68157504 272630784 ROM Name: NO 1 266 {{106, 345}, {250, 22}} YES -1804599231 272630784 YES NO 1 266 {{106, 375}, {250, 22}} YES -1804599231 272630784 YES NO 1 265 {{358, 370}, {209, 32}} YES 67108864 134217728 Use Currently Loaded ROM -2038284288 129 200 25 NO 288 {{14, 12}, {112, 32}} YES 67108864 134217728 Continue -2038284288 129 200 25 NO {580, 567} NSView 268 1292 {{363, 339}, {32, 32}} 28682 100 265 {{396, 343}, {168, 28}} YES 69206017 272764928 TmFtZToKU2VyaWFsOg NO 1 265 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{364, 341}, {30, 30}} YES 134217728 33554432 0 3 0 NO NO YES 256 2304 2322 Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {524, 80} 38 524 1 67121027 0 1 6 {531, 10000000} {{1, 1}, {524, 80}} 4 YES 256 {{525, 1}, {15, 80}} NO _doScroller: _doScroller: 0.99248120300751874 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{20, 61}, {541, 82}} 133138 0.25 4 1 256 2304 2322 Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {523, 80} 38 523 1 67121027 0 1 6 {523, 10000000} {{1, 1}, {523, 80}} 4 YES 256 {{524, 1}, {15, 80}} NO _doScroller: _doScroller: 0.99248120300751874 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{20, 167}, {540, 82}} 133138 0.25 4 1 288 {{125, 16}, {438, 28}} YES 67108864 272760832 And that's it! Click Continue to review your information before submitting it to the DeSmuME team. NO 1 34 {{12, 50}, {556, 5}} {0, 0} 67108864 0 Box 3 2 0 NO 256 {{17, 145}, {206, 14}} YES 68157504 272761856 Expected Behavior: NO 1 256 {{17, 251}, {206, 14}} YES 68157504 272761856 Observed Behavior: NO 1 269 {{17, 273}, {546, 28}} YES 67108864 272760832 In the fields below, give us specific details on what you OBSERVED happened, and then what you EXPECTED to happen. NO 1 269 {{17, 309}, {546, 17}} YES 68157504 272630784 Tell us what is happening. NO 1 10 {{12, 332}, {556, 5}} {0, 0} 67108864 0 Box 3 2 0 NO 269 {{17, 489}, {546, 42}} YES 67108864 272760832 Think you just spotted a bug with DeSmuME? Be sure to let us know! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your bug report quicker and easier. NO 1 269 {{17, 539}, {546, 17}} YES 68157504 138413056 DeSmuME Bug Report Form NO 1 10 {{12, 478}, {556, 5}} {0, 0} 67108864 0 Box 3 2 0 NO 269 {{17, 455}, {546, 17}} YES 68157504 272630784 Tell us about the ROM. NO 1 269 {{17, 405}, {546, 42}} YES 67108864 272760832 If your bug is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.) NO 1 268 {{17, 347}, {83, 17}} YES 68157504 272630784 ROM Serial: NO 1 268 {{17, 377}, {83, 17}} YES 68157504 272630784 ROM Name: NO 1 266 {{105, 345}, {250, 22}} YES -1804599231 272630784 YES NO 1 266 {{105, 375}, {250, 22}} YES -1804599231 272630784 YES NO 1 265 {{358, 370}, {209, 32}} YES 67108864 134217728 Use Currently Loaded ROM -2038284288 129 200 25 NO 288 {{14, 12}, {112, 32}} YES 67108864 134217728 Continue -2038284288 129 200 25 NO {580, 567} NSView 268 268 {{342, 55}, {224, 32}} YES 67108864 134217728 Copy Info to Clipboard -2038284288 129 200 25 NO 268 {{17, 52}, {326, 42}} YES 67108864 272760832 Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us. NO 1 268 {{342, 12}, {224, 32}} YES 67108864 134217728 Go to Tech Support Webpage -2038284288 129 DQ 200 25 NO 268 {{14, 12}, {112, 32}} YES 67108864 134217728 Back -2038284288 129 200 25 NO 256 2304 2322 {538, 443} 38 538 1 67111169 0 0 6 {597, 10000000} {{1, 1}, {538, 443}} 4 YES 256 {{523, 1}, {16, 443}} NO _doScroller: _doScroller: 1 0.85256409645080566 -2147483392 {{-100, -100}, {87, 18}} NO _doScroller: 1 _doScroller: 1 0.94565218687057495 {{20, 102}, {540, 445}} 133138 0.25 4 1 {580, 567} NSView TroubleshootingWindowDelegate readMePath licensePath authorsPath changeLogPath descriptionString buildInfoString aboutTextFilesFont YES isSpeedLimitEnabled isCheatingEnabled speedScalar isFrameSkipEnabled emuFlagAdvancedBusLevelTiming emuFlagUseExternalBios emuFlagEmulateBiosInterrupts emuFlagPatchDelayLoop emuFlagUseExternalFirmware emuFlagFirmwareBoot emuFlagDebugConsole emuFlagEmulateEnsata cpuEmulationEngine emuFlagRigorousTiming slot1StatusText slot1DeviceType maxJITBlockSize cdsGPU.layerMainGPU cdsGPU.layerMainBG0 cdsGPU.layerMainBG1 cdsGPU.layerMainBG2 cdsGPU.layerMainBG3 cdsGPU.layerMainOBJ cdsGPU.layerSubGPU cdsGPU.layerSubBG0 cdsGPU.layerSubBG1 cdsGPU.layerSubBG2 cdsGPU.layerSubBG3 cdsGPU.layerSubOBJ coreState frameStatus executionSpeedStatus cdsGPU.render3DRenderingEngine cdsGPU.render3DTextures cdsGPU.render3DHighPrecisionColorInterpolation cdsGPU.render3DEdgeMarking cdsGPU.render3DFog cdsGPU.render3DLineHack cdsGPU.render3DDepthComparisonThreshold cdsGPU.render3DMultisample cdsGPU.render3DThreads cdsGPU.render3DFragmentSamplingHack isGdbStubStarted enableGdbStubARM9 enableGdbStubARM7 gdbStubPortARM9 gdbStubPortARM7 isInDebugTrap CocoaDSCore spuInterpolationMode spuSyncMode spuSyncMethod spuAdvancedLogic volume audioOutputEngine YES isWorking isRomLoading statusText currentVolumeValue currentVolumeIcon isShowingSaveStateDialog isShowingFileMigrationDialog isUserInterfaceBlockingExecution currentSaveStateURL selectedRomSaveTypeID currentRom mainWindow mainWindow.displayRotation mainWindow.videoFilterType mainWindow.useBilinearOutput mainWindow.useVerticalSync mainWindow.screenshotFileFormat selectedExportRomSaveID mainWindow.displayGap frameJumpType frameJumpFramesForward frameJumpToFrame mainWindow.outputFilter mainWindow.videoSourceDeposterize mainWindow.videoFiltersPreferGPU mainWindow.view.videoSourceDeposterize mainWindow.view.outputFilter mainWindow.view.sourceDeposterize mainWindow.view.srcDeposterize mainWindow.view.videoFilterType mainWindow.view.pixelScaler mainWindow.view.videoFiltersPreferGPU mainWindow.view.useVerticalSync mainWindow.videoOutputFilter mainWindow.videoPixelScaler mainWindow.view.canUseShaderBasedFilters EmuControllerDelegate hasSelection hasItems cheatList cheatSearchStyle cheatSearchSignType cheatSearchSearchValue cheatSearchAddressCount isRunningSearch isSearchStarted cheatDBTitle cheatDBItemCount cheatDBDate YES Input_Up Input_Down Input_Left Input_Right Input_A Input_B Input_X Input_Y Input_L Input_R Input_Start Input_Select Input_Microphone Input_Lid Input_Debug Input_SpeedHalf Input_SpeedDouble Input_HUD Input_Execute Input_Pause Input_Reset Arm7BiosImageName Arm9BiosImageName FirmwareImageName AutoloadRomName VideoFilterPreviewImage volumeIconImage R4CheatDatabaseName AdvansceneDatabaseName YES romName romSerial supportRequestText bugReportObservedText bugReportExpectedText finalFormText goWebpageButtonTitle copyPasteHelpText nickname message favoriteColor birthday language consoleType CocoaDSFirmware gameTitle gameCode makerCode cardSize bannerJapanese bannerEnglish bannerFrench bannerGerman bannerItalian bannerSpanish fntOffset fntTableSize fatOffset fatSize iconOffset romSize iconImage arm9BinaryOffset arm9BinaryEntryAddress arm9BinaryStartAddress arm9BinarySize arm7BinaryOffset arm7BinaryEntryAddress arm7BinaryStartAddress arm7BinarySize romInternalName romSerial romNameAndSerialInfo gameDeveloper gameDeveloperWithCode usedRomSize unitCode unusedCapacity enabled cheatType description cheatTypeIcon isSupportedCheatType freezeType codeCount bytes memAddress value code memAddressString memAddressSixDigitString CocoaDSCheatItem YES Name IsDefaultType Mappings YES intValue0 intValue1 intValue2 intValue3 floatValue0 floatValue1 floatValue2 floatValue3 object0 object1 object2 object3 useInputForIntCoord useInputForFloatCoord useInputForScalar useInputForSender deviceInfoSummary isInputAnalog YES enabled cheatTypeIcon description cheatType CocoaDSCheatItem YES YES YES YES YES YES value addressString YES willAdd description YES YES slot2StatusText autoSelectedDeviceText mpcfFolderName mpcfFolderPath mpcfDiskImageName mpcfDiskImagePath gbaCartridgeName gbaCartridgePath deviceManager.slot2StatusText gbaSRamName gbaSRamPath Slot2WindowDelegate YES name description deviceID type enabled CocoaSlot2Device YES YES YES YES supportsForceFeedback isForceFeedbackEnabled manufacturerName productName serialNumber InputHIDDevice YES YES YES YES YES terminate: 449 delegate 495 performMiniaturize: 37 arrangeInFront: 39 clearRecentDocuments: 127 performZoom: 240 hide: 367 hideOtherApplications: 368 unhideAllApplications: 370 showHelp: 493 cut: 3252 paste: 3257 redo: 3266 delete: 3267 selectAll: 3270 undo: 3272 copy: 7011 clearRecentDocuments: 7999 changeDisplayMode: 8204 changeDisplayMode: 8205 changeDisplayMode: 8206 runToolbarCustomizationPalette: 8208 toggleToolbarShown: 8209 changeDisplayGap: 8210 changeDisplayGap: 8211 changeDisplayGap: 8212 changeDisplayGap: 8213 changeDisplayGap: 8214 changeDisplayGap: 8215 changeDisplayGap: 8216 changeDisplayOrder: 8217 changeDisplayOrder: 8218 changeDisplayOrientation: 8219 changeDisplayOrientation: 8220 changeScale: 8221 changeScale: 8222 changeScale: 8223 changeScale: 8224 changeScale: 8225 changeRotation: 8226 changeRotation: 8227 changeRotation: 8228 changeRotation: 8229 changeRotationRelative: 8230 changeRotationRelative: 8231 changeRotation: 8232 changeRotation: 8233 toggleStatusBar: 8234 toggleKeepMinDisplaySizeAtNormal: 8235 writeDefaultsDisplayGap: 8236 writeDefaultsDisplayRotation: 8237 writeDefaultsDisplayVideoSettings: 8238 writeDefaultsHUDSettings: 8239 performClose: 8240 saveScreenshotAs: 8241 toggleFullScreenDisplay: 8297 changeVideoOutputFilter: 9325 changeVideoOutputFilter: 9326 changeVideoOutputFilter: 9327 changeVideoOutputFilter: 9328 changeVideoOutputFilter: 9329 changeVideoOutputFilter: 9330 changeVideoPixelScaler: 9331 changeVideoPixelScaler: 9332 changeVideoPixelScaler: 9333 changeVideoPixelScaler: 9334 changeVideoPixelScaler: 9335 changeVideoPixelScaler: 9336 changeVideoPixelScaler: 9337 changeVideoPixelScaler: 9338 changeVideoPixelScaler: 9339 changeVideoPixelScaler: 9340 changeVideoPixelScaler: 9341 changeVideoPixelScaler: 9342 changeVideoPixelScaler: 9343 changeVideoPixelScaler: 9344 changeVideoPixelScaler: 9345 changeVideoPixelScaler: 9346 changeVideoPixelScaler: 9347 changeVideoPixelScaler: 9348 toggleVideoSourceDeposterize: 9349 launchWebsite: 1101 launchForums: 1102 bugReport: 1103 mLoadStateSlot 1775 mSaveStateSlot 1776 prefGeneralView 2093 prefWindow 2094 prefWindowController 3532 cdsCoreController 4955 cheatListWindow 5146 cheatWindowController 5147 aboutWindowController 5721 troubleshootingWindow 6449 supportRequest: 6452 emuControlController 6808 cdsSoundController 6824 romInfoPanelController 6825 inputManager 7004 inputPrefsView 7109 migrationDelegate 8098 slot2Window 8509 inputDeviceListController 8532 romInfoPanel 9887 makeKeyAndOrderFront: 782 delegate 2025 contentView 718 parentWindow 4791 toggle: 4819 makeKeyAndOrderFront: 9275 makeKeyAndOrderFront: 2611 makeKeyAndOrderFront: 9672 toggleViewState: 9877 toggleViewState: 9878 toggleViewState: 9879 toggleViewState: 9880 toggleViewState: 9881 armBinariesSectionView 9882 generalSectionView 9883 titlesSectionView 9884 fileSystemSectionView 9885 miscSectionView 9886 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 5580 value: selection.arm9BinaryOffset value: selection.arm9BinaryOffset value selection.arm9BinaryOffset 2 5591 value: selection.arm9BinaryEntryAddress value: selection.arm9BinaryEntryAddress value selection.arm9BinaryEntryAddress 2 5592 value: selection.arm9BinaryStartAddress value: selection.arm9BinaryStartAddress value selection.arm9BinaryStartAddress 2 5593 value: selection.arm9BinarySize value: selection.arm9BinarySize value selection.arm9BinarySize 2 5594 value: selection.arm7BinaryOffset value: selection.arm7BinaryOffset value selection.arm7BinaryOffset 2 5595 value: selection.arm7BinaryEntryAddress value: selection.arm7BinaryEntryAddress value selection.arm7BinaryEntryAddress 2 5596 value: selection.arm7BinaryStartAddress value: selection.arm7BinaryStartAddress value selection.arm7BinaryStartAddress 2 5597 value: selection.arm7BinarySize value: selection.arm7BinarySize value selection.arm7BinarySize 2 5598 value: selection.fntOffset value: selection.fntOffset value selection.fntOffset 2 5599 value: selection.fntTableSize value: selection.fntTableSize value selection.fntTableSize 2 5600 value: selection.fatOffset value: selection.fatOffset value selection.fatOffset 2 5601 value: selection.fatSize value: selection.fatSize value selection.fatSize 2 5602 value: selection.iconOffset value: selection.iconOffset value selection.iconOffset 2 5603 value: selection.usedRomSize value: selection.usedRomSize value selection.usedRomSize 2 9828 value: selection.romInternalName value: selection.romInternalName value selection.romInternalName 2 5723 value: selection.romSerial value: selection.romSerial value selection.romSerial 2 5722 value: selection.gameDeveloperWithCode value: selection.gameDeveloperWithCode value selection.gameDeveloperWithCode 2 8299 value: selection.romSize value: selection.romSize value selection.romSize 2 5584 value: values.General_ExecuteROMOnLoad value: values.General_ExecuteROMOnLoad value values.General_ExecuteROMOnLoad 2 6119 selectedTag: values.DisplayView_Size selectedTag: values.DisplayView_Size selectedTag values.DisplayView_Size NSValidatesImmediately 2 8319 selectedTag: values.General_AutoloadROMOption selectedTag: values.General_AutoloadROMOption selectedTag values.General_AutoloadROMOption NSValidatesImmediately 2 8318 delegate 2314 value: values.DisplayView_Rotation value: values.DisplayView_Rotation value values.DisplayView_Rotation 2 5974 selectedTag: values.DisplayView_VideoFilter selectedTag: values.DisplayView_VideoFilter selectedTag values.DisplayView_VideoFilter 2 5976 window 1689 viewDisplay 1690 viewGeneral 1691 viewSound 2251 updateVolumeIcon: 2268 selectDisplayRotation: 2310 selectDisplayRotation: 2311 selectDisplayRotation: 2312 selectDisplayRotation: 2313 displayRotationField 2315 displayRotationMenu 2316 displayRotationMenuCustomItem 2317 viewEmulation 2380 selectSPUSyncMode: 2451 selectSPUSyncMode: 2452 selectSPUSyncMethod: 2453 selectSPUSyncMethod: 2454 selectSPUSyncMethod: 2455 spuSyncMethodMenu 2456 chooseFirmwareImage: 2575 chooseARM7BiosImage: 2587 chooseARM9BiosImage: 2588 firmwareConfigSheet 4466 configureInternalFirmware: 4467 closeFirmwareConfigSheet: 4468 chooseCheatDatabase: 5078 cheatWindowController 5143 cheatDatabaseController 5145 prefWindowController 5149 cdsCoreController 5150 chooseAdvansceneDatabase: 5183 emuController 6939 viewInput 7108 chooseRomForAutoload: 8317 toolbar 8666 changePrefView: 8671 changePrefView: 8672 changePrefView: 8673 changePrefView: 8674 changePrefView: 8675 selectOutputFilter: 9678 selectOutputFilter: 9679 selectOutputFilter: 9680 selectOutputFilter: 9681 selectOutputFilter: 9682 selectOutputFilter: 9683 updateFiltersPreferGPU: 9684 updateSourceDeposterize: 9685 selectPixelScaler: 9686 selectPixelScaler: 9687 selectPixelScaler: 9688 selectPixelScaler: 9689 selectPixelScaler: 9690 selectPixelScaler: 9691 selectPixelScaler: 9692 selectPixelScaler: 9693 selectPixelScaler: 9694 selectPixelScaler: 9695 selectPixelScaler: 9696 selectPixelScaler: 9697 selectPixelScaler: 9698 selectPixelScaler: 9699 selectPixelScaler: 9700 selectPixelScaler: 9701 selectPixelScaler: 9702 selectPixelScaler: 9703 previewView 9704 makeKeyAndOrderFront: 4280 value: selection.mainWindow.displayRotation value: selection.mainWindow.displayRotation value selection.mainWindow.displayRotation 2 6967 value: selection.mainWindow.displayRotation value: selection.mainWindow.displayRotation value selection.mainWindow.displayRotation 2 6966 value: values.Sound_Volume value: values.Sound_Volume value values.Sound_Volume 2 5990 value: values.Sound_Volume value: values.Sound_Volume value values.Sound_Volume 2 5991 value: selection.volumeIconImage value: selection.volumeIconImage value selection.volumeIconImage 2 5525 selectedTag: values.DisplayView_Mode selectedTag: values.DisplayView_Mode selectedTag values.DisplayView_Mode NSValidatesImmediately 2 8320 selectedTag: values.SPU_InterpolationMode selectedTag: values.SPU_InterpolationMode selectedTag values.SPU_InterpolationMode 2 4138 value: values.Emulation_AdvancedBusLevelTiming value: values.Emulation_AdvancedBusLevelTiming value values.Emulation_AdvancedBusLevelTiming 2 5993 value: values.Emulation_UseExternalBIOSImages value: values.Emulation_UseExternalBIOSImages value values.Emulation_UseExternalBIOSImages 2 6000 enabled: values.BIOS_ARM9ImagePath enabled: values.BIOS_ARM9ImagePath enabled values.BIOS_ARM9ImagePath NSValueTransformerName NSIsNotNil 2 6018 enabled2: values.BIOS_ARM7ImagePath enabled2: values.BIOS_ARM7ImagePath enabled2 values.BIOS_ARM7ImagePath NSIsNotNil 2 6027 value: selection.Arm9BiosImageName value: selection.Arm9BiosImageName value selection.Arm9BiosImageName 2 4025 value: selection.Arm7BiosImageName value: selection.Arm7BiosImageName value selection.Arm7BiosImageName 2 4026 value: values.Emulation_BIOSEmulateSWI value: values.Emulation_BIOSEmulateSWI value values.Emulation_BIOSEmulateSWI 2 5994 enabled: values.Emulation_UseExternalBIOSImages enabled: values.Emulation_UseExternalBIOSImages enabled values.Emulation_UseExternalBIOSImages NSRaisesForNotApplicableKeys 2 6001 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath NSIsNotNil 2 6020 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath NSIsNotNil 2 6028 value: values.Emulation_BIOSPatchDelayLoopSWI value: values.Emulation_BIOSPatchDelayLoopSWI value values.Emulation_BIOSPatchDelayLoopSWI 2 5995 enabled: values.Emulation_UseExternalBIOSImages enabled: values.Emulation_UseExternalBIOSImages enabled values.Emulation_UseExternalBIOSImages NSRaisesForNotApplicableKeys 2 6004 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath NSIsNotNil 2 6022 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath NSIsNotNil 2 6029 value: values.Emulation_UseDebugConsole value: values.Emulation_UseDebugConsole value values.Emulation_UseDebugConsole 2 5998 value: values.Emulation_EmulateEnsata value: values.Emulation_EmulateEnsata value values.Emulation_EmulateEnsata 2 5996 value: values.Emulation_UseExternalFirmwareImage value: values.Emulation_UseExternalFirmwareImage value values.Emulation_UseExternalFirmwareImage 2 6011 enabled: values.Emulation_FirmwareImagePath enabled: values.Emulation_FirmwareImagePath enabled values.Emulation_FirmwareImagePath NSValueTransformerName NSIsNotNil 2 6034 value: selection.FirmwareImageName value: selection.FirmwareImageName value selection.FirmwareImageName 2 3561 enabled: values.Emulation_UseExternalFirmwareImage enabled: values.Emulation_UseExternalFirmwareImage enabled values.Emulation_UseExternalFirmwareImage NSRaisesForNotApplicableKeys 2 6012 value: values.SPU_AdvancedLogic value: values.SPU_AdvancedLogic value values.SPU_AdvancedLogic 2 4137 selectedTag: values.SPU_SyncMethod selectedTag: values.SPU_SyncMethod selectedTag values.SPU_SyncMethod 2 4140 selectedTag: values.SPU_SyncMode selectedTag: values.SPU_SyncMode selectedTag values.SPU_SyncMode 2 4139 value: values.Emulation_FirmwareBoot value: values.Emulation_FirmwareBoot value values.Emulation_FirmwareBoot 2 5999 enabled: values.Emulation_UseExternalFirmwareImage enabled: values.Emulation_UseExternalFirmwareImage enabled values.Emulation_UseExternalFirmwareImage 2 6013 enabled2: values.Emulation_UseExternalBIOSImages enabled2: values.Emulation_UseExternalBIOSImages enabled2 values.Emulation_UseExternalBIOSImages 2 6014 enabled3: values.BIOS_ARM9ImagePath enabled3: values.BIOS_ARM9ImagePath enabled3 values.BIOS_ARM9ImagePath NSIsNotNil 2 6024 enabled4: values.BIOS_ARM7ImagePath enabled4: values.BIOS_ARM7ImagePath enabled4 values.BIOS_ARM7ImagePath NSIsNotNil 2 6030 enabled5: values.Emulation_FirmwareImagePath enabled5: values.Emulation_FirmwareImagePath enabled5 values.Emulation_FirmwareImagePath NSIsNotNil 2 6037 value: selection.bannerJapanese value: selection.bannerJapanese value selection.bannerJapanese 2 5585 value: selection.bannerEnglish value: selection.bannerEnglish value selection.bannerEnglish 2 5586 value: selection.bannerFrench value: selection.bannerFrench value selection.bannerFrench 2 5587 value: selection.bannerGerman value: selection.bannerGerman value selection.bannerGerman 2 5588 value: selection.bannerItalian value: selection.bannerItalian value selection.bannerItalian 2 5589 value: selection.bannerSpanish value: selection.bannerSpanish value selection.bannerSpanish 2 5590 value: values.General_DoNotAskMigrate value: values.General_DoNotAskMigrate value values.General_DoNotAskMigrate 2 6123 makeKeyAndOrderFront: 4638 delegate 4700 delegate 4716 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6864 value: arrangedObjects.enabled value: arrangedObjects.enabled value arrangedObjects.enabled 2 5493 value: arrangedObjects.description value: arrangedObjects.description value arrangedObjects.description 2 5495 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6873 enabled2: values.R4Cheat_DatabasePath enabled2: values.R4Cheat_DatabasePath enabled2 values.R4Cheat_DatabasePath NSIsNotNil 2 6874 selectedTag: selection.mainWindow.videoPixelScaler selectedTag: selection.mainWindow.videoPixelScaler selectedTag selection.mainWindow.videoPixelScaler 2 9321 makeKeyAndOrderFront: 3964 value: selection.spuAdvancedLogic value: selection.spuAdvancedLogic value selection.spuAdvancedLogic 2 5609 selectedTag: selection.spuInterpolationMode selectedTag: selection.spuInterpolationMode selectedTag selection.spuInterpolationMode 2 5610 selectedTag: selection.spuSyncMode selectedTag: selection.spuSyncMode selectedTag selection.spuSyncMode 2 5611 value: selection.currentVolumeValue value: selection.currentVolumeValue value selection.currentVolumeValue 2 6765 value: selection.currentVolumeValue value: selection.currentVolumeValue value selection.currentVolumeValue 2 6769 value: selection.currentVolumeIcon value: selection.currentVolumeIcon value selection.currentVolumeIcon 2 6767 value: selection.cdsGPU.render3DHighPrecisionColorInterpolation value: selection.cdsGPU.render3DHighPrecisionColorInterpolation value selection.cdsGPU.render3DHighPrecisionColorInterpolation 2 9164 value: selection.cdsGPU.render3DEdgeMarking value: selection.cdsGPU.render3DEdgeMarking value selection.cdsGPU.render3DEdgeMarking 2 9166 value: selection.cdsGPU.render3DFog value: selection.cdsGPU.render3DFog value selection.cdsGPU.render3DFog 2 9168 value: selection.cdsGPU.render3DTextures value: selection.cdsGPU.render3DTextures value selection.cdsGPU.render3DTextures 2 9162 delegate 6809 value: selection.cdsGPU.render3DDepthComparisonThreshold value: selection.cdsGPU.render3DDepthComparisonThreshold value selection.cdsGPU.render3DDepthComparisonThreshold 2 9174 makeKeyAndOrderFront: 3792 value: values.Render3D_DepthComparisonThreshold value: values.Render3D_DepthComparisonThreshold value values.Render3D_DepthComparisonThreshold 2 3834 value: values.Render3D_HighPrecisionColorInterpolation value: values.Render3D_HighPrecisionColorInterpolation value values.Render3D_HighPrecisionColorInterpolation 2 3830 value: values.Render3D_EdgeMarking value: values.Render3D_EdgeMarking value values.Render3D_EdgeMarking 2 3836 value: values.Render3D_Fog value: values.Render3D_Fog value values.Render3D_Fog 2 3832 value: values.Render3D_Textures value: values.Render3D_Textures value values.Render3D_Textures 2 3833 selectedTag: selection.cdsGPU.render3DRenderingEngine selectedTag: selection.cdsGPU.render3DRenderingEngine selectedTag selection.cdsGPU.render3DRenderingEngine 2 9160 selectedTag: values.Render3D_RenderingEngine selectedTag: values.Render3D_RenderingEngine selectedTag values.Render3D_RenderingEngine 2 6109 value: selection.cdsGPU.render3DLineHack value: selection.cdsGPU.render3DLineHack value selection.cdsGPU.render3DLineHack 2 9170 selectedTag: values.Render3D_Threads selectedTag: values.Render3D_Threads selectedTag values.Render3D_Threads 2 3895 value: values.Render3D_LineHack value: values.Render3D_LineHack value values.Render3D_LineHack 2 3902 selectedTag: selection.spuSyncMethod selectedTag: selection.spuSyncMethod selectedTag selection.spuSyncMethod 2 5612 selectedTag: values.Sound_AudioOutputEngine selectedTag: values.Sound_AudioOutputEngine selectedTag values.Sound_AudioOutputEngine 2 5989 selectedTag: selection.audioOutputEngine selectedTag: selection.audioOutputEngine selectedTag selection.audioOutputEngine 2 5608 makeKeyAndOrderFront: 4063 value: selection.emuFlagAdvancedBusLevelTiming value: selection.emuFlagAdvancedBusLevelTiming value selection.emuFlagAdvancedBusLevelTiming 2 4141 value: selection.emuFlagUseExternalBios value: selection.emuFlagUseExternalBios value selection.emuFlagUseExternalBios 2 4142 enabled: values.BIOS_ARM9ImagePath enabled: values.BIOS_ARM9ImagePath enabled values.BIOS_ARM9ImagePath NSValueTransformerName NSIsNotNil 2 6100 enabled2: values.BIOS_ARM7ImagePath enabled2: values.BIOS_ARM7ImagePath enabled2 values.BIOS_ARM7ImagePath NSIsNotNil 2 6105 value: selection.emuFlagEmulateBiosInterrupts value: selection.emuFlagEmulateBiosInterrupts value selection.emuFlagEmulateBiosInterrupts 2 4143 enabled: selection.emuFlagUseExternalBios enabled: selection.emuFlagUseExternalBios enabled selection.emuFlagUseExternalBios 2 4150 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath NSIsNotNil 2 6088 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath NSIsNotNil 2 6093 value: selection.emuFlagPatchDelayLoop value: selection.emuFlagPatchDelayLoop value selection.emuFlagPatchDelayLoop 2 4145 enabled: selection.emuFlagUseExternalBios enabled: selection.emuFlagUseExternalBios enabled selection.emuFlagUseExternalBios 2 4151 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath NSIsNotNil 2 6076 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath NSIsNotNil 2 6081 value: selection.emuFlagUseExternalFirmware value: selection.emuFlagUseExternalFirmware value selection.emuFlagUseExternalFirmware 2 4146 enabled: values.Emulation_FirmwareImagePath enabled: values.Emulation_FirmwareImagePath enabled values.Emulation_FirmwareImagePath NSValueTransformerName NSIsNotNil 2 6048 value: selection.emuFlagFirmwareBoot value: selection.emuFlagFirmwareBoot value selection.emuFlagFirmwareBoot 2 4147 enabled: selection.emuFlagUseExternalFirmware enabled: selection.emuFlagUseExternalFirmware enabled selection.emuFlagUseExternalFirmware 2 6041 enabled2: selection.emuFlagUseExternalBios enabled2: selection.emuFlagUseExternalBios enabled2 selection.emuFlagUseExternalBios 2 6042 enabled3: values.BIOS_ARM9ImagePath enabled3: values.BIOS_ARM9ImagePath enabled3 values.BIOS_ARM9ImagePath NSIsNotNil 2 6058 enabled4: values.BIOS_ARM7ImagePath enabled4: values.BIOS_ARM7ImagePath enabled4 values.BIOS_ARM7ImagePath NSIsNotNil 2 6067 enabled5: values.Emulation_FirmwareImagePath enabled5: values.Emulation_FirmwareImagePath enabled5 values.Emulation_FirmwareImagePath NSIsNotNil 2 6069 value: selection.emuFlagDebugConsole value: selection.emuFlagDebugConsole value selection.emuFlagDebugConsole 2 4148 value: selection.emuFlagEmulateEnsata value: selection.emuFlagEmulateEnsata value selection.emuFlagEmulateEnsata 2 4149 contentView 4057 parentWindow 4058 toggle: 4068 value: selection.nickname value: selection.nickname value selection.nickname 2 5478 value: selection.message value: selection.message value selection.message 2 5479 value: selection.birthday value: selection.birthday value selection.birthday 2 5481 selectedTag: selection.language selectedTag: selection.language selectedTag selection.language 2 5482 selectedTag: selection.favoriteColor selectedTag: selection.favoriteColor selectedTag selection.favoriteColor 2 5480 value: values.FirmwareConfig_Nickname value: values.FirmwareConfig_Nickname value values.FirmwareConfig_Nickname 2 5729 value: values.FirmwareConfig_Message value: values.FirmwareConfig_Message value values.FirmwareConfig_Message 2 5730 value: values.FirmwareConfig_Birthday value: values.FirmwareConfig_Birthday value values.FirmwareConfig_Birthday 2 5732 selectedTag: values.FirmwareConfig_Language selectedTag: values.FirmwareConfig_Language selectedTag values.FirmwareConfig_Language 2 5733 selectedTag: values.FirmwareConfig_FavoriteColor selectedTag: values.FirmwareConfig_FavoriteColor selectedTag values.FirmwareConfig_FavoriteColor 2 5731 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6869 enabled2: selection.hasSelection enabled2: selection.hasSelection enabled2 selection.hasSelection 2 6870 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6866 selectedTag: selection.cheatType selectedTag: selection.cheatType selectedTag selection.cheatType 2 5487 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6880 value: selection.enabled value: selection.enabled value selection.enabled 2 5489 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6877 enabled2: selection.isSupportedCheatType enabled2: selection.isSupportedCheatType enabled2 selection.isSupportedCheatType 2 6878 value: selection.isCheatingEnabled value: selection.isCheatingEnabled value selection.isCheatingEnabled 2 4648 value: selection.memAddressSixDigitString value: selection.memAddressSixDigitString value selection.memAddressSixDigitString 2 5499 value: selection.value value: selection.value value selection.value 2 5484 selectedTag: selection.bytes selectedTag: selection.bytes selectedTag selection.bytes 2 5485 value: arrangedObjects.cheatTypeIcon value: arrangedObjects.cheatTypeIcon value arrangedObjects.cheatTypeIcon 2 5494 value: selection.code value: selection.code value selection.code 2 5486 value: selection.description value: selection.description value selection.description 2 5488 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6882 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6886 enabled2: selection.hasSelection enabled2: selection.hasSelection enabled2 selection.hasSelection 2 6887 enabled3: selection.isSupportedCheatType enabled3: selection.isSupportedCheatType enabled3 selection.isSupportedCheatType 2 6888 window 4699 viewConfigureActionReplayCheat 4702 viewConfigureInternalCheat 4703 cheatConfigBox 4709 cheatSelectedItemController 4717 selectCheatType: 4718 selectCheatType: 4719 addToList: 4721 applyConfiguration: 4722 cheatListTable 4728 removeFromList: 4730 cheatWindowController 4735 viewConfigureNoSelection 4747 viewConfigureCodeBreakerCheat 4748 cheatListController 4755 cheatSearchListController 4922 runExactValueSearch: 4928 runComparativeSearch: 4929 runComparativeSearch: 4930 runComparativeSearch: 4931 runComparativeSearch: 4932 selectCheatSearchStyle: 4933 selectCheatSearchStyle: 4934 viewSearchComparativeContinue 4936 viewSearchComparativeStart 4937 viewSearchExactValue 4938 viewSearchNoSelection 4939 cheatSearchView 4940 resetSearch: 4941 runComparativeSearch: 4943 searchField 4944 cheatSearchListTable 4945 setInternalCheatValue: 5070 viewDatabase: 5079 cheatDatabaseSheet 5108 closeCheatDatabaseSheet: 5109 closeCheatDatabaseSheet: 5110 cheatDatabaseController 5119 selectAllCheatsInDatabase: 5122 selectNoneCheatsInDatabase: 5123 delegate 4946 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6894 value: arrangedObjects.addressString value: arrangedObjects.addressString value arrangedObjects.addressString 2 5566 value: arrangedObjects.value value: arrangedObjects.value value arrangedObjects.value 2 5567 value: selection.cheatSearchAddressCount value: selection.cheatSearchAddressCount value selection.cheatSearchAddressCount 2 5622 enabled: selection.isRunningSearch enabled: selection.isRunningSearch enabled selection.isRunningSearch NSValueTransformerName NSNegateBoolean 2 5627 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted 2 5644 enabled3: selection.currentRom enabled3: selection.currentRom enabled3 selection.currentRom NSIsNotNil 2 6892 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6906 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted 2 6907 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch NSNegateBoolean 2 6908 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6918 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted 2 6919 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch NSNegateBoolean 2 6920 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6912 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted 2 6913 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch NSNegateBoolean 2 6914 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6924 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted 2 6925 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch NSNegateBoolean 2 6926 value: selection.cheatSearchSearchValue value: selection.cheatSearchSearchValue value selection.cheatSearchSearchValue 2 5623 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6896 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6900 enabled2: selection.cheatSearchSearchValue enabled2: selection.cheatSearchSearchValue enabled2 selection.cheatSearchSearchValue NSIsNotNil 2 6901 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch NSNegateBoolean 2 6902 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6929 enabled2: selection.isRunningSearch enabled2: selection.isRunningSearch enabled2 selection.isRunningSearch NSNegateBoolean 2 6930 selectedTag: selection.cheatSearchStyle selectedTag: selection.cheatSearchStyle selectedTag selection.cheatSearchStyle 2 5621 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6890 animate: selection.isRunningSearch animate: selection.isRunningSearch animate selection.isRunningSearch 2 5626 value: selection.R4CheatDatabaseName value: selection.R4CheatDatabaseName value selection.R4CheatDatabaseName 2 5073 enabled: selection.value enabled: selection.value enabled selection.value NSValueTransformerName NSIsNotNil 2 5490 value: arrangedObjects.willAdd value: arrangedObjects.willAdd value arrangedObjects.willAdd 2 5497 value: arrangedObjects.description value: arrangedObjects.description value arrangedObjects.description NSConditionallySetsEditable 2 5498 value: selection.cheatDBDate value: selection.cheatDBDate value selection.cheatDBDate 2 5619 value: selection.cheatDBItemCount value: selection.cheatDBItemCount value selection.cheatDBItemCount 2 5620 value: selection.cheatDBTitle value: selection.cheatDBTitle value selection.cheatDBTitle 2 5618 value: selection.AdvansceneDatabaseName value: selection.AdvansceneDatabaseName value selection.AdvansceneDatabaseName 2 5182 value: values.Advanscene_AutoDetectRomSaveType value: values.Advanscene_AutoDetectRomSaveType value values.Advanscene_AutoDetectRomSaveType 2 5647 enabled: values.Advanscene_DatabasePath enabled: values.Advanscene_DatabasePath enabled values.Advanscene_DatabasePath NSValueTransformerName NSIsNotNil 2 5992 makeKeyAndOrderFront: 5720 value: selection.buildInfoString value: selection.buildInfoString value selection.buildInfoString 2 6231 value: selection.descriptionString value: selection.descriptionString value selection.descriptionString 2 6232 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6589 valuePath: selection.readMePath valuePath: selection.readMePath valuePath selection.readMePath 2 6598 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6593 valuePath: selection.licensePath valuePath: selection.licensePath valuePath selection.licensePath 2 6601 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6594 valuePath: selection.authorsPath valuePath: selection.authorsPath valuePath selection.authorsPath 2 6604 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6595 valuePath: selection.changeLogPath valuePath: selection.changeLogPath valuePath selection.changeLogPath 2 6610 selectedTag: selection.selectedExportRomSaveID selectedTag: selection.selectedExportRomSaveID selectedTag selection.selectedExportRomSaveID 2 7001 selectedTag: values.Emulation_CPUEmulationEngine selectedTag: values.Emulation_CPUEmulationEngine selectedTag values.Emulation_CPUEmulationEngine NSConditionallySetsEnabled 2 8074 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8073 selectedTag: selection.cpuEmulationEngine selectedTag: selection.cpuEmulationEngine selectedTag selection.cpuEmulationEngine NSConditionallySetsEnabled 2 8072 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8071 value: selection.mainWindow.view.useVerticalSync value: selection.mainWindow.view.useVerticalSync value selection.mainWindow.view.useVerticalSync 2 9318 value: values.DisplayView_UseVerticalSync value: values.DisplayView_UseVerticalSync value values.DisplayView_UseVerticalSync 2 6164 selectedTag: values.DisplayViewCombo_Order selectedTag: values.DisplayViewCombo_Order selectedTag values.DisplayViewCombo_Order 2 6230 selectedTag: values.DisplayViewCombo_Orientation selectedTag: values.DisplayViewCombo_Orientation selectedTag values.DisplayViewCombo_Orientation 2 6226 delegate 6450 value: selection.romName value: selection.romName value selection.romName 2 6459 value: selection.romSerial value: selection.romSerial value selection.romSerial 2 6460 value: selection.romName value: selection.romName value selection.romName 2 6463 value: selection.romSerial value: selection.romSerial value selection.romSerial 2 6464 title: selection.goWebpageButtonTitle title: selection.goWebpageButtonTitle title selection.goWebpageButtonTitle 2 6457 value: selection.finalFormText value: selection.finalFormText value selection.finalFormText 2 6507 troubleshootingWindowController 6442 window 6443 viewBugReport 6444 viewFinishedForm 6445 viewSupportRequest 6446 romInfoController 6467 continueToFinalForm: 6468 continueToFinalForm: 6469 copyRomInfoToTextFields: 6470 copyRomInfoToTextFields: 6471 backForm: 6472 copyInfoToPasteboard: 6613 goToWebpage: 6614 cdsCoreController 8329 emuControlController 8330 value: selection.copyPasteHelpText value: selection.copyPasteHelpText value selection.copyPasteHelpText NSAllowsEditingMultipleValuesSelection 2 6616 value: selection.bugReportObservedText value: selection.bugReportObservedText value selection.bugReportObservedText 2 6490 value: selection.bugReportExpectedText value: selection.bugReportExpectedText value selection.bugReportExpectedText 2 6495 value: selection.supportRequestText value: selection.supportRequestText value selection.supportRequestText 2 6500 value: selection.cdsGPU.render3DMultisample value: selection.cdsGPU.render3DMultisample value selection.cdsGPU.render3DMultisample 2 9178 value: values.Render3D_Multisample value: values.Render3D_Multisample value values.Render3D_Multisample 2 6625 value: values.Emulation_RigorousTiming value: values.Emulation_RigorousTiming value values.Emulation_RigorousTiming 2 6629 value: selection.emuFlagRigorousTiming value: selection.emuFlagRigorousTiming value selection.emuFlagRigorousTiming 2 6632 cdsCoreController 6655 cdsSoundController 6656 cheatDatabaseController 6657 cheatListController 6658 cheatWindowController 6659 cheatWindowDelegate 6660 exportRomSavePanelAccessoryView 6661 firmwarePanelController 6662 romInfoPanelController 6663 changeAudioEngine: 6680 changeAudioEngine: 6681 changeSpuAdvancedLogic: 6682 changeSpuInterpolationMode: 6683 changeSpuInterpolationMode: 6684 changeSpuInterpolationMode: 6685 changeSpuSyncMethod: 6686 changeSpuSyncMethod: 6687 changeSpuSyncMethod: 6688 changeSpuSyncMode: 6689 changeSpuSyncMode: 6690 changeVolume: 6691 writeDefaults3DRenderingSettings: 6692 writeDefaultsEmulationSettings: 6693 writeDefaultsSoundSettings: 6694 changeRomSaveType: 6695 changeRomSaveType: 6696 changeRomSaveType: 6697 changeRomSaveType: 6698 changeRomSaveType: 6699 changeRomSaveType: 6700 changeRomSaveType: 6701 changeRomSaveType: 6702 changeRomSaveType: 6703 changeRomSaveType: 6704 changeRomSaveType: 6705 changeRomSaveType: 6706 changeRomSaveType: 6707 changeRomSaveType: 6708 closeRom: 6709 exportRomSave: 6710 importRomSave: 6711 openRom: 6712 revertEmuSaveState: 6713 saveEmuSaveState: 6714 saveEmuSaveStateAs: 6715 toggleAutoFrameSkip: 6716 changeCoreEmuFlags: 6723 changeCoreEmuFlags: 6724 changeCoreEmuFlags: 6725 changeCoreEmuFlags: 6726 changeCoreEmuFlags: 6727 changeCoreEmuFlags: 6728 changeCoreEmuFlags: 6729 changeCoreEmuFlags: 6730 changeCoreEmuFlags: 6731 openEmuSaveState: 6744 changeFirmwareSettings: 6745 closeSheet: 6799 closeSheet: 6800 closeSheet: 6801 closeSheet: 6802 closeSheet: 6803 saveFileMigrationSheet 6804 saveStatePrecloseSheet 6805 newDisplayWindow: 6940 inputManager 7005 reset: 7010 toggleCheats: 7012 slot1Eject: 7888 reset: 7889 chooseSlot1R4Directory: 7897 slot1ManagerWindow 7898 loadRecentRom: 7983 loadRecentRom: 8000 closeRom: 8001 openRom: 8002 revealGameDataFolderInFinder: 8167 revealRomInFinder: 8168 slot2WindowController 8574 toggleAllDisplays: 8977 frameAdvance: 8980 frameJump: 8982 frameAdvance: 9004 frameJump: 9005 reset: 9006 changeCoreSpeed: 9065 changeCoreSpeed: 9078 executionControlWindow 9099 coreExecute: 9100 corePause: 9101 coreExecute: 9102 corePause: 9103 openReplay: 9141 recordReplay: 9142 stopReplay: 9143 toggleGDBStubActivate: 9461 exportRomSave: 9659 changeRomSaveType: 9660 changeRomSaveType: 9661 changeRomSaveType: 9662 changeRomSaveType: 9663 changeRomSaveType: 9664 importRomSave: 9665 changeRomSaveType: 9666 changeRomSaveType: 9667 changeRomSaveType: 9668 changeRomSaveType: 9669 changeRomSaveType: 9670 revealRomInFinder: 9671 changeRomSaveType: 9673 changeRomSaveType: 9674 changeRomSaveType: 9675 changeRomSaveType: 9676 changeHardwareMicGain: 9995 displayVideoSettingsPanel 10016 displaySeparationPanel 10017 displayRotationPanel 10018 changeHardwareMicMute: 10019 content 6826 emuControl 7003 inputManager 7110 prefWindow 7111 removeInput: 7167 setInputAdd: 7170 inputSettingsGPUState 7296 inputSettingsLoadStateSlot 7297 inputSettingsMicrophone 7298 inputSettingsSaveStateSlot 7299 inputSettingsTouch 7300 showSettingsSheet: 7321 closeSettingsSheet: 7322 closeSettingsSheet: 7323 closeSettingsSheet: 7324 closeSettingsSheet: 7325 closeSettingsSheet: 7326 inputSettingsController 7391 closeSettingsSheet: 7394 closeSettingsSheet: 7397 closeSettingsSheet: 7400 closeSettingsSheet: 7403 closeSettingsSheet: 7406 inputSettingsSetSpeedLimit 7484 closeSettingsSheet: 7490 closeSettingsSheet: 7491 changeSpeed: 7492 inputProfileController 7685 inputProfileMenu 7686 inputProfileSheet 7687 profileApply: 7688 profileRename: 7689 profileSave: 7690 profileView: 7691 profileDelete: 7692 profileNew: 7693 closeProfileSheet: 7696 profileDelete: 7697 profileApply: 7698 inputProfileNextButton 7700 inputProfilePreviousButton 7701 profileSelect: 7702 profileSelect: 7703 inputProfileRenameSheet 7731 closeProfileRenameSheet: 7732 inputPrefOutlineView 7734 audioFileChoose: 7769 audioFileChooseNone: 7770 inputSettingsPaddleController 8637 closeSettingsSheet: 8642 closeSettingsSheet: 8643 inputSettingsNDSInput 9111 closeSettingsSheet: 9116 closeSettingsSheet: 9117 dataSource 7164 delegate 7165 value: selection.object1 value: selection.object1 value selection.object1 2 7755 selectedTag: selection.intValue1 selectedTag: selection.intValue1 selectedTag selection.intValue1 NSConditionallySetsEnabled 2 7448 selectedTag: selection.intValue0 selectedTag: selection.intValue0 selectedTag selection.intValue0 2 7407 selectedTag: selection.intValue0 selectedTag: selection.intValue0 selectedTag selection.intValue0 2 7410 selectedTag: selection.intValue0 selectedTag: selection.intValue0 selectedTag selection.intValue0 2 7411 enabled: selection.useInputForIntCoord enabled: selection.useInputForIntCoord enabled selection.useInputForIntCoord NSValueTransformerName NSNegateBoolean 2 7417 value: selection.intValue1 value: selection.intValue1 value selection.intValue1 2 7422 enabled: selection.useInputForIntCoord enabled: selection.useInputForIntCoord enabled selection.useInputForIntCoord NSValueTransformerName NSNegateBoolean 2 7419 value: selection.intValue2 value: selection.intValue2 value selection.intValue2 2 7423 value: selection.useInputForIntCoord value: selection.useInputForIntCoord value selection.useInputForIntCoord NSValueTransformerName NSNegateBoolean 2 7421 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7435 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7438 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7441 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7444 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7447 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7453 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 2 7482 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 2 7495 dataSource 7742 delegate 7743 enabled: selection.Name enabled: selection.Name enabled selection.Name NSValueTransformerName NSIsNotNil 2 7754 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7682 delegate 7706 value: selection.Name value: selection.Name value selection.Name NSContinuouslyUpdatesValue 2 7750 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7705 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7676 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7678 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7674 inputManager 7741 profileOutlineView 7744 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7719 delegate 7720 value: selection.Name value: selection.Name value selection.Name NSContinuouslyUpdatesValue 2 7749 enabled: selection.Name enabled: selection.Name enabled selection.Name NSValueTransformerName NSIsNotNil 2 7752 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 2 7763 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 2 7764 delegate 7795 value: values.DisplayViewCombo_Gap value: values.DisplayViewCombo_Gap value values.DisplayViewCombo_Gap NSContinuouslyUpdatesValue 2 7816 value: values.DisplayViewCombo_Gap value: values.DisplayViewCombo_Gap value values.DisplayViewCombo_Gap 2 7814 makeKeyAndOrderFront: 7850 value: selection.mainWindow.displayGap value: selection.mainWindow.displayGap value selection.mainWindow.displayGap 2 7853 value: selection.mainWindow.displayGap value: selection.mainWindow.displayGap value selection.mainWindow.displayGap NSContinuouslyUpdatesValue 2 7842 makeKeyAndOrderFront: 7887 selectedTag: selection.slot1DeviceType selectedTag: selection.slot1DeviceType selectedTag selection.slot1DeviceType 2 7896 value: values.EmulationSlot1_R4StoragePath value: values.EmulationSlot1_R4StoragePath value values.EmulationSlot1_R4StoragePath 2 8199 toolTip: values.EmulationSlot1_R4StoragePath toolTip: values.EmulationSlot1_R4StoragePath toolTip values.EmulationSlot1_R4StoragePath 2 8200 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 7885 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 8042 value: selection.slot1StatusText value: selection.slot1StatusText value selection.slot1StatusText 2 7892 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 7976 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8011 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 7975 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 7979 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 8017 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8020 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 8018 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 8019 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8026 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 8029 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 8027 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 8028 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 8035 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8038 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 8036 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 8037 value: selection.maxJITBlockSize value: selection.maxJITBlockSize value selection.maxJITBlockSize 2 8063 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8070 value: selection.maxJITBlockSize value: selection.maxJITBlockSize value selection.maxJITBlockSize 2 8062 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8069 value: values.Emulation_MaxJITBlockSize value: values.Emulation_MaxJITBlockSize value values.Emulation_MaxJITBlockSize 2 8064 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8067 value: values.Emulation_MaxJITBlockSize value: values.Emulation_MaxJITBlockSize value values.Emulation_MaxJITBlockSize 2 8065 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8068 updateAndShowWindow: 8133 handleChoice: 9738 handleChoice: 9739 handleChoice: 9742 window 9771 fileTreeOutlineView 9775 makeKeyAndOrderFront: 8163 value: selection.cdsGPU.layerMainGPU value: selection.cdsGPU.layerMainGPU value selection.cdsGPU.layerMainGPU 2 8169 value: selection.cdsGPU.layerMainBG0 value: selection.cdsGPU.layerMainBG0 value selection.cdsGPU.layerMainBG0 2 8170 value: selection.cdsGPU.layerMainBG1 value: selection.cdsGPU.layerMainBG1 value selection.cdsGPU.layerMainBG1 2 8171 value: selection.cdsGPU.layerMainBG2 value: selection.cdsGPU.layerMainBG2 value selection.cdsGPU.layerMainBG2 2 8172 value: selection.cdsGPU.layerMainBG3 value: selection.cdsGPU.layerMainBG3 value selection.cdsGPU.layerMainBG3 2 8173 value: selection.cdsGPU.layerMainOBJ value: selection.cdsGPU.layerMainOBJ value selection.cdsGPU.layerMainOBJ 2 8174 value: selection.cdsGPU.layerSubGPU value: selection.cdsGPU.layerSubGPU value selection.cdsGPU.layerSubGPU 2 8175 value: selection.cdsGPU.layerSubBG0 value: selection.cdsGPU.layerSubBG0 value selection.cdsGPU.layerSubBG0 2 8176 value: selection.cdsGPU.layerSubBG1 value: selection.cdsGPU.layerSubBG1 value selection.cdsGPU.layerSubBG1 2 8177 value: selection.cdsGPU.layerSubBG2 value: selection.cdsGPU.layerSubBG2 value selection.cdsGPU.layerSubBG2 2 8178 value: selection.cdsGPU.layerSubBG3 value: selection.cdsGPU.layerSubBG3 value selection.cdsGPU.layerSubBG3 2 8179 value: selection.cdsGPU.layerSubOBJ value: selection.cdsGPU.layerSubOBJ value selection.cdsGPU.layerSubOBJ 2 8180 value: selection.cdsGPU.render3DDepthComparisonThreshold value: selection.cdsGPU.render3DDepthComparisonThreshold value selection.cdsGPU.render3DDepthComparisonThreshold 2 9176 value: values.Render3D_DepthComparisonThreshold value: values.Render3D_DepthComparisonThreshold value values.Render3D_DepthComparisonThreshold 2 8198 value: values.General_WillRestoreDisplayWindows value: values.General_WillRestoreDisplayWindows value values.General_WillRestoreDisplayWindows 2 8306 enabled: values.General_AutoloadROMSelectedPath enabled: values.General_AutoloadROMSelectedPath enabled values.General_AutoloadROMSelectedPath NSValueTransformerName NSIsNotNil 2 8313 title: selection.AutoloadRomName title: selection.AutoloadRomName title selection.AutoloadRomName 2 8315 value: values.General_StreamLoadRomData value: values.General_StreamLoadRomData value values.General_StreamLoadRomData 2 8328 makeKeyAndOrderFront: 8353 delegate 8357 delegate 8361 value: arrangedObjects.name value: arrangedObjects.name value arrangedObjects.name NSAllowsEditingMultipleValuesSelection 2 8464 enabled: arrangedObjects.enabled enabled: arrangedObjects.enabled enabled arrangedObjects.enabled 2 8506 enabled: selection.enabled enabled: selection.enabled enabled selection.enabled 2 8508 deviceListController 8358 deviceListTable 8360 applySettings: 8362 viewAuto 8465 viewCompactFlash 8466 viewGBACartridge 8467 viewGuitarGrip 8468 viewMemoryExpansionPack 8469 viewNone 8470 viewPaddleController 8471 viewPassME 8472 viewPiano 8473 viewRumblePak 8474 viewNoSelection 8475 deviceSettingsBox 8476 window 8510 testRumble: 8533 viewUnsupported 8555 mpcfFileSearchMenu 8587 chooseMPCFPath: 8593 chooseMPCFPath: 8594 chooseMPCFPath: 8595 prefWindowDelegate 8650 showInputPreferences: 8662 showInputPreferences: 8665 chooseGbaCartridgePath: 8704 chooseGbaSRamPath: 8705 clearSRamPath: 8708 showInputPreferences: 8745 showInputPreferences: 9986 value: selection.deviceManager.slot2StatusText value: selection.deviceManager.slot2StatusText value selection.deviceManager.slot2StatusText 2 8676 selectedTag: values.Slot2_MPCF_PathOption selectedTag: values.Slot2_MPCF_PathOption selectedTag values.Slot2_MPCF_PathOption 2 8589 title: selection.mpcfFolderName title: selection.mpcfFolderName title selection.mpcfFolderName 2 8586 enabled: selection.mpcfFolderPath enabled: selection.mpcfFolderPath enabled selection.mpcfFolderPath NSValueTransformerName NSIsNotNil 2 8709 enabled: selection.mpcfDiskImagePath enabled: selection.mpcfDiskImagePath enabled selection.mpcfDiskImagePath NSValueTransformerName NSIsNotNil 2 8543 title: selection.mpcfDiskImageName title: selection.mpcfDiskImageName title selection.mpcfDiskImageName 2 8551 value: selection.gbaCartridgeName value: selection.gbaCartridgeName value selection.gbaCartridgeName 2 8702 enabled: selection.gbaCartridgePath enabled: selection.gbaCartridgePath enabled selection.gbaCartridgePath NSValueTransformerName NSIsNotNil 2 8711 value: arrangedObjects.isForceFeedbackEnabled value: arrangedObjects.isForceFeedbackEnabled value arrangedObjects.isForceFeedbackEnabled 2 8528 enabled: arrangedObjects.supportsForceFeedback enabled: arrangedObjects.supportsForceFeedback enabled arrangedObjects.supportsForceFeedback 2 8530 value: arrangedObjects.productName value: arrangedObjects.productName value arrangedObjects.productName NSConditionallySetsEditable 2 8529 enabled: arrangedObjects.supportsForceFeedback enabled: arrangedObjects.supportsForceFeedback enabled arrangedObjects.supportsForceFeedback 2 8531 content 8549 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8564 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 8567 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 8566 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 8565 value: selection.autoSelectedDeviceText value: selection.autoSelectedDeviceText value selection.autoSelectedDeviceText 2 8577 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 8600 value: selection.intValue1 value: selection.intValue1 value selection.intValue1 2 8645 value: selection.intValue1 value: selection.intValue1 value selection.intValue1 2 8646 enabled: selection.isInputAnalog enabled: selection.isInputAnalog enabled selection.isInputAnalog NSValueTransformerName NSNegateBoolean 2 8729 value: selection.gbaSRamName value: selection.gbaSRamName value selection.gbaSRamName 2 8703 enabled: selection.gbaSRamPath enabled: selection.gbaSRamPath enabled selection.gbaSRamPath NSValueTransformerName NSIsNotNil 2 8713 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 NSValidatesImmediately 2 8721 enabled: selection.isInputAnalog enabled: selection.isInputAnalog enabled selection.isInputAnalog 2 8726 hidden: selection.isInputAnalog hidden: selection.isInputAnalog hidden selection.isInputAnalog NSValueTransformerName NSNegateBoolean 2 8734 hidden: selection.isInputAnalog hidden: selection.isInputAnalog hidden selection.isInputAnalog 2 8738 makeKeyAndOrderFront: 9008 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 9018 enabled2: selection.coreState enabled2: selection.coreState enabled2 selection.coreState NSNegateBoolean 2 9028 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 9012 enabled2: selection.coreState enabled2: selection.coreState enabled2 selection.coreState NSNegateBoolean 2 9070 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 9016 enabled2: selection.isUserInterfaceBlockingExecution enabled2: selection.isUserInterfaceBlockingExecution enabled2 selection.isUserInterfaceBlockingExecution NSNegateBoolean 2 9467 enabled3: selection.isInDebugTrap enabled3: selection.isInDebugTrap enabled3 selection.isInDebugTrap NSNegateBoolean 2 9469 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 9014 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 9022 enabled2: selection.coreState enabled2: selection.coreState enabled2 selection.coreState 2 9029 value: selection.frameJumpFramesForward value: selection.frameJumpFramesForward value selection.frameJumpFramesForward 2 9097 selectedTag: selection.frameJumpType selectedTag: selection.frameJumpType selectedTag selection.frameJumpType 2 9096 value: selection.frameJumpToFrame value: selection.frameJumpToFrame value selection.frameJumpToFrame 2 9098 value: selection.speedScalar value: selection.speedScalar value selection.speedScalar 2 9068 enabled: selection.isSpeedLimitEnabled enabled: selection.isSpeedLimitEnabled enabled selection.isSpeedLimitEnabled 2 9073 value: selection.executionSpeedStatus value: selection.executionSpeedStatus value selection.executionSpeedStatus 2 9093 value: selection.isSpeedLimitEnabled value: selection.isSpeedLimitEnabled value selection.isSpeedLimitEnabled 2 9067 enabled: selection.isSpeedLimitEnabled enabled: selection.isSpeedLimitEnabled enabled selection.isSpeedLimitEnabled 2 9077 value: selection.frameStatus value: selection.frameStatus value selection.frameStatus NSValidatesImmediately 2 9092 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 9108 value: selection.intValue1 value: selection.intValue1 value selection.intValue1 2 9119 value: values.Render3D_FragmentSamplingHack value: values.Render3D_FragmentSamplingHack value values.Render3D_FragmentSamplingHack 2 9183 value: selection.cdsGPU.render3DFragmentSamplingHack value: selection.cdsGPU.render3DFragmentSamplingHack value selection.cdsGPU.render3DFragmentSamplingHack 2 9182 selectedTag: values.DisplayView_OutputFilter selectedTag: values.DisplayView_OutputFilter selectedTag values.DisplayView_OutputFilter 2 9323 value: values.DisplayView_Deposterize value: values.DisplayView_Deposterize value values.DisplayView_Deposterize 2 9324 value: values.DisplayView_FiltersPreferGPU value: values.DisplayView_FiltersPreferGPU value values.DisplayView_FiltersPreferGPU 2 9350 value: selection.mainWindow.videoFiltersPreferGPU value: selection.mainWindow.videoFiltersPreferGPU value selection.mainWindow.videoFiltersPreferGPU 2 9322 enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled selection.mainWindow.view.canUseShaderBasedFilters 2 9357 value: selection.mainWindow.videoSourceDeposterize value: selection.mainWindow.videoSourceDeposterize value selection.mainWindow.videoSourceDeposterize 2 9319 enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled selection.mainWindow.view.canUseShaderBasedFilters 2 9352 selectedTag: selection.mainWindow.videoOutputFilter selectedTag: selection.mainWindow.videoOutputFilter selectedTag selection.mainWindow.videoOutputFilter 2 9320 enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled selection.mainWindow.view.canUseShaderBasedFilters 2 9353 enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled selection.mainWindow.view.canUseShaderBasedFilters 2 9354 enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled selection.mainWindow.view.canUseShaderBasedFilters 2 9355 enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled: selection.mainWindow.view.canUseShaderBasedFilters enabled selection.mainWindow.view.canUseShaderBasedFilters 2 9356 selectedTag: selection.cdsGPU.render3DThreads selectedTag: selection.cdsGPU.render3DThreads selectedTag selection.cdsGPU.render3DThreads 2 9298 makeKeyAndOrderFront: 9410 value: selection.gdbStubPortARM7 value: selection.gdbStubPortARM7 value selection.gdbStubPortARM7 2 9423 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNil 2 9441 enabled2: selection.isGdbStubStarted enabled2: selection.isGdbStubStarted enabled2 selection.isGdbStubStarted NSNegateBoolean 2 9465 value: selection.gdbStubPortARM9 value: selection.gdbStubPortARM9 value selection.gdbStubPortARM9 2 9422 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNil 2 9439 enabled2: selection.isGdbStubStarted enabled2: selection.isGdbStubStarted enabled2 selection.isGdbStubStarted NSNegateBoolean 2 9464 value: selection.enableGdbStubARM7 value: selection.enableGdbStubARM7 value selection.enableGdbStubARM7 2 9421 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNil 2 9437 enabled2: selection.isGdbStubStarted enabled2: selection.isGdbStubStarted enabled2 selection.isGdbStubStarted NSNegateBoolean 2 9463 value: selection.enableGdbStubARM9 value: selection.enableGdbStubARM9 value selection.enableGdbStubARM9 2 9420 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNil 2 9434 enabled2: selection.isGdbStubStarted enabled2: selection.isGdbStubStarted enabled2 selection.isGdbStubStarted NSNegateBoolean 2 9462 hidden: isDeveloperPlusBuild hidden: isDeveloperPlusBuild hidden isDeveloperPlusBuild NSValueTransformerName NSNegateBoolean 2 9413 hidden: isDeveloperPlusBuild hidden: isDeveloperPlusBuild hidden isDeveloperPlusBuild NSValueTransformerName NSNegateBoolean 2 9415 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNil 2 9472 delegate 9751 enabled: filesPresent enabled: filesPresent enabled filesPresent 2 9744 value: values.General_DoNotAskMigrate value: values.General_DoNotAskMigrate value values.General_DoNotAskMigrate 2 9750 enabled: filesPresent enabled: filesPresent enabled filesPresent 2 9749 hidden: filesPresent hidden: filesPresent hidden filesPresent NSValueTransformerName NSNegateBoolean 2 9795 hidden: filesPresent hidden: filesPresent hidden filesPresent NSValueTransformerName NSNegateBoolean 2 9793 dataSource 9773 delegate 9774 hidden: filesPresent hidden: filesPresent hidden filesPresent 2 9792 hidden: filesPresent hidden: filesPresent hidden filesPresent 2 9794 disclosureButton 9889 sectionLabel 9894 disclosureButton 9890 sectionLabel 9895 disclosureButton 9891 sectionLabel 9896 disclosureButton 9892 sectionLabel 9897 disclosureButton 9888 sectionLabel 9893 value: selection.unusedCapacity value: selection.unusedCapacity value selection.unusedCapacity 2 9876 value: selection.unitCode value: selection.unitCode value selection.unitCode 2 9875 makeKeyAndOrderFront: 9960 value: selection.currentMicStatusIcon value: selection.currentMicStatusIcon value selection.currentMicStatusIcon 2 9958 value: selection.currentMicGainValue value: selection.currentMicGainValue value selection.currentMicGainValue 2 9956 enabled: selection.isHardwareMicAvailable enabled: selection.isHardwareMicAvailable enabled selection.isHardwareMicAvailable 2 9969 value: selection.cdsController.micLevel value: selection.cdsController.micLevel value selection.cdsController.micLevel 2 9983 value: selection.cdsController.hardwareMicNameString value: selection.cdsController.hardwareMicNameString value selection.cdsController.hardwareMicNameString 2 9997 value: selection.cdsController.hardwareMicManufacturerString value: selection.cdsController.hardwareMicManufacturerString value selection.cdsController.hardwareMicManufacturerString 2 9999 value: selection.cdsController.hardwareMicSampleRateString value: selection.cdsController.hardwareMicSampleRateString value selection.cdsController.hardwareMicSampleRateString 2 10001 value: selection.currentMicGainValue value: selection.currentMicGainValue value selection.currentMicGainValue 2 10010 enabled: selection.isHardwareMicAvailable enabled: selection.isHardwareMicAvailable enabled selection.isHardwareMicAvailable 2 10012 value: selection.cdsController.hardwareMicMute value: selection.cdsController.hardwareMicMute value selection.cdsController.hardwareMicMute 2 10008 0 -2 File's Owner -1 First Responder -3 Application 29 19 56 83 81 75 80 72 124 79 112 74 57 58 134 150 136 144 129 143 236 131 149 145 130 295 296 297 298 494 App Delegate 534 535 538 539 541 542 575 576 594 596 607 627 628 629 634 635 714 Cheat Search Drawer Content View 715 Cheat Search Drawer 783 784 785 787 788 789 794 795 796 797 823 824 825 826 827 828 829 830 831 832 833 834 835 836 843 844 845 846 850 855 861 862 1113 1114 1115 1118 1119 1120 1298 General Preferences View 1538 1299 1300 1541 1542 1543 1544 1545 1584 Display Preferences View 1615 1616 1619 1620 1621 1626 1627 1628 1629 1630 1631 1634 1635 1636 1637 1638 1639 1640 1641 1643 1646 1647 1650 1651 1679 1680 1681 1682 1721 CocoaDS Core Controller 1855 1856 1857 1858 1859 1976 1977 1978 1979 1980 1981 1982 1983 1986 1987 1988 1998 1999 2000 2095 2098 2154 2155 2246 2248 Sound Preferences View 2250 2253 2254 2257 2258 2262 2265 2266 2327 2328 2329 2330 2331 2332 2339 Emulation Preferences View 2340 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2482 2483 2518 2519 608 2556 2609 2610 2653 ROM Info Panel Controller 2847 2848 2894 2895 2896 2897 2900 2901 2902 2903 3063 3059 3060 3061 3062 3146 3148 Firmware Panel Controller 3204 3205 3206 3207 3208 3209 3210 3211 3213 3214 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3471 3472 3480 3481 3482 3488 3489 3496 3497 3498 3499 3501 3507 3508 3509 3516 3517 3520 Preferences Window Controller 3522 3523 3644 3712 3713 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3732 3733 3714 3715 3747 3736 3742 3737 3740 3741 3738 3739 3748 3749 3751 3752 3784 3648 3667 3666 3664 3663 3662 3661 3660 3659 3658 3657 3656 3655 3654 3653 3652 3651 3650 3649 3790 3791 3786 3775 3773 3771 3779 Depth Comparison Threshold Text Field 3782 3783 3780 3781 3772 3774 3776 3793 3794 3837 3838 3839 3840 3841 3885 3935 3936 3937 3938 3939 3959 CocoaDS Sound Controller 3965 3966 3967 3968 3969 4024 4001 4004 4003 4002 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4043 4044 4045 4046 4047 4048 4049 4050 4051 4053 Internal Firmware Drawer Content View 4054 Internal Firmware Drawer 4059 4060 4066 4067 4069 4070 4071 4072 4073 4074 4075 4076 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4109 4110 4111 4112 4113 4114 4115 4116 4179 4180 4181 4182 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4240 4241 4277 4278 4559 4560 4561 4562 4565 4574 4575 4576 4577 4578 4580 4581 4582 4583 4584 4585 Internal Cheat View 4586 4587 4588 4589 4590 4593 4594 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4610 Action Replay Cheat View 4632 4633 4634 4635 4636 4637 4639 4640 4647 4656 Cheats List Array Controller 4660 4661 4662 4663 4664 4665 4673 Code Breaker Cheat View 4693 4694 4697 4711 Cheat Selected Item Controller 4715 4731 Cheat Window Controller 4745 4746 4607 4778 4792 4795 4796 4797 4798 4799 4800 4801 4802 4809 4810 4811 4812 4814 4815 4817 4818 4822 4823 4850 Exact Value Search View 4851 Comparative Search Continue View 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4871 4872 4873 4874 4876 4877 4878 4879 4880 Comparative Search Start View 4887 4888 4889 4890 4891 4892 4899 4900 4901 4902 4903 4904 4906 4907 4908 4909 4910 4911 4912 4913 4914 4916 Cheat Search List Array Controller 4947 5003 5004 5005 5006 5007 5008 5009 5066 5067 5068 5069 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5111 5112 5115 Cheat Database Array Controller 5127 5128 5133 5134 5135 5136 5140 5141 5168 5169 5171 5172 5173 5174 5175 5176 5177 5178 5179 5193 24 23 239 5 92 5329 490 5419 5420 5421 5450 2287 2288 2289 2290 1507 1508 1509 1532 1512 1511 1510 1577 1578 1579 2291 2299 2292 2293 2294 5427 2298 2297 3994 3995 3996 3997 3998 3992 3993 1525 1526 1527 1531 1530 1529 1528 1580 1581 5648 5649 5651 5652 5653 5654 5658 5659 5660 5661 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5702 2553 5713 About Window Controller 5933 Export ROM Save Panel Accessory 5934 5935 5936 5937 5938 5939 5942 5963 6131 6132 6133 6134 6135 6159 6160 6161 6162 6168 6169 6170 6171 6172 6173 6174 6177 6180 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6234 3777 3778 6238 6295 6296 6352 Support Request Form View 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6368 6369 6374 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 Bug Report Form View 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6405 6406 6407 6408 6413 6414 6415 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 Troubleshooting Info View 6431 6432 6433 6434 6435 6436 6437 6438 6440 6441 Troubleshooting Window Controller 6484 6485 6486 6487 6488 6489 6491 6492 6493 6494 6496 6497 6498 6499 6611 6612 6617 6618 6619 6630 6631 6651 6652 Emulation Control Controller 6931 6998 6999 7002 7014 Input Preferences View 7168 7169 7171 7172 7173 7174 7175 7176 7179 7180 7182 7183 7184 7185 7186 7187 7188 7189 7191 7192 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7293 7285 7286 7287 7288 7289 7292 7290 7291 7294 7295 7301 7302 7305 7308 7309 7312 7313 7316 7317 7320 7353 Input Settings Controller 7354 7355 7358 7359 7392 7393 7395 7396 7398 7399 7401 7402 7404 7405 7433 7434 7436 7437 7439 7440 7442 7443 7445 7446 7449 7450 7451 7452 7454 7455 7456 7457 7458 7459 7460 7462 7463 7464 7465 7466 7468 7469 7470 7471 7472 7473 7474 7486 7487 7488 7489 7461 7467 7515 7516 7517 7521 7520 7519 7518 7526 7525 7522 7531 7528 7537 7540 7541 7542 7543 7544 7545 7546 7551 7552 7553 7554 7555 7556 7583 7584 7128 7132 7131 7130 7129 7137 7136 7135 7134 7133 7142 7141 7140 7139 7138 7594 7595 7596 7597 7598 7599 7601 7602 7603 7600 7604 7605 7606 7607 7610 7612 7624 7625 7666 Input Profile Controller 7707 7708 7715 7716 7725 7726 7729 7730 7740 7190 7759 7760 7761 7762 7765 7766 7767 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7792 7793 7794 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7817 7818 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7836 7837 7838 7839 7840 7843 7844 7845 7846 7847 7848 7855 7856 7886 7899 125 126 8009 7971 7974 7972 7973 7978 7987 7988 7989 8003 7996 7995 7994 7993 7997 7998 8012 8013 8014 8015 8016 8021 8022 8023 8024 8025 8030 8031 8032 8033 8034 8043 8044 8045 8046 8047 8048 8049 8084 2604 8134 8135 8160 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8161 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8162 8164 8181 8182 8183 8184 8185 2342 2359 2355 2365 2363 2358 2357 2349 2353 2347 2348 2354 2350 2362 2361 2364 2366 2356 2360 2343 2374 4275 2565 2373 2372 2371 2378 2377 2376 2566 4276 2375 2341 6627 2345 2346 6628 6126 6127 8060 8058 8056 8057 8059 8066 8061 6130 6129 6128 2344 2369 2367 2368 2370 5186 5188 5189 8186 8188 8189 8245 8246 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8265 8268 8269 8295 8302 8303 8307 8308 8309 8310 8316 8322 8323 8331 8332 8333 8334 8335 8336 8338 8341 8343 8344 8351 8352 8354 SLOT-2 Device Array Controller 8345 8346 8356 SLOT-2 Window Delegate 8365 8363 8364 8366 SLOT-2 None View 8367 8368 8402 SLOT-2 Rumble Pak View 8405 SLOT-2 GBA Cartridge View 8369 SLOT-2 MPCF Flash Card View 8377 8387 8388 8378 8379 8380 8381 8382 8383 8384 8385 8386 8408 SLOT-2 Auto View 8409 8410 8411 8412 8413 8414 8415 8416 8427 8428 SLOT-2 Guitar Grip View 8445 SLOT-2 Memory Expansion Pack View 8446 8447 8448 SLOT-2 Piano View 8451 SLOT-2 Paddle Controller View 8454 SLOT-2 PassME View 8455 8456 8457 8458 8477 8478 8499 8500 8501 8502 8512 8513 8514 8515 8517 8518 8519 8523 8524 8525 8526 8527 Input Device List Array Controller 8535 SLOT-2 Window Controller 8552 SLOT-2 Unsupported View 8553 8554 8557 8558 8559 8560 8561 8568 8569 8570 8571 8572 8575 8576 8578 8579 8596 8597 8598 8599 8612 8608 8609 8610 8611 8635 8638 8639 8640 8641 8653 8654 8655 8656 8660 8661 8663 8664 8667 8668 8677 8678 8679 8680 8681 8682 8687 8688 8689 8690 8691 8692 8706 8707 8727 8718 8719 8722 8723 8724 8725 8730 8731 8735 8736 8739 8740 8741 8742 8743 8744 8746 8747 491 6451 492 977 978 979 980 8758 8975 8978 8979 8991 8992 8993 8994 8995 8996 8997 8998 9001 9002 9007 9019 9020 9071 9032 9033 9039 9040 9034 9038 9037 9036 9035 9072 9041 9063 9043 9061 9044 9060 9045 9059 9046 9058 9047 9057 9049 9055 9050 9053 9051 9052 9042 9062 9075 9076 9083 9084 8976 3789 4062 3709 9085 9086 9087 9088 9089 9090 9094 9095 9104 9105 9106 9107 9109 9110 9112 9113 9114 9115 3665 9129 9131 9133 9135 9137 9138 9139 9140 9144 9146 9148 9150 3886 3887 9156 9157 9184 9185 9186 9187 9188 9195 9206 9208 9209 9210 9211 9236 9237 9238 9257 9258 9261 9262 9263 9264 9265 9266 9267 9269 9270 9271 9272 9273 9274 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9299 9300 9301 9302 9389 9390 9393 9404 9405 9392 9406 9407 9397 9400 9396 9401 9395 9402 9394 9403 9408 9409 9424 9425 7857 8301 7858 7859 7860 7861 7862 9633 7880 7881 9634 7866 7867 7863 7864 9525 9526 7875 7876 7871 7872 7873 7874 7879 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9677 9705 9706 9709 9710 9711 9712 9714 9715 9716 9717 9732 9733 9734 9735 9752 9753 9754 9755 9756 9757 9758 9759 9763 9764 9776 9777 9778 9779 9780 9824 9825 9826 9827 865 866 883 884 885 886 1034 1035 1036 1037 1038 1039 9811 897 899 901 903 905 907 909 911 913 928 930 932 934 936 938 940 941 939 937 935 933 931 929 914 912 910 908 906 904 902 900 898 9819 964 965 966 967 9832 9870 9873 9871 9872 9866 9867 9865 9868 969 970 968 971 1040 1041 887 888 879 880 9830 9858 9831 9857 9829 9805 9797 9798 9803 9804 9796 2817 2818 2811 2812 926 927 889 890 924 925 942 943 944 945 946 947 2815 2820 2816 2819 2809 2810 9807 9810 9808 9809 9806 2813 2814 9820 9823 9821 9822 9813 9812 9814 9817 9815 9816 961 962 960 963 957 958 956 959 953 954 952 955 949 950 948 951 9818 9946 9947 9948 9949 9952 9953 9959 9967 9965 9963 9961 9962 9964 9966 9984 9985 9950 9951 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9987 9988 9989 9990 9991 9992 9993 9994 10003 10004 10002 10005 10006 10013 10014 10015 3787 3788 6622 3798 3899 3849 3843 3844 3845 6233 3847 3846 3850 3804 3805 3896 3888 8194 3799 3800 9152 3900 3803 3802 3801 3808 3807 3806 3901 9153 3809 3810 3811 8195 3889 3890 9260 9259 3894 3893 3892 3891 6634 3897 6623 6624 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {215, 355} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default size for new NDS display views. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default rotation for new NDS display views. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip The default rotation for new NDS display views. A custom rotation angle may be entered here. (The angle must be between 0Âş and 360Âş.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin InitialTabViewItem InitialTabViewItem com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default pixel scaler for new NDS display views, producing a variety of visual effects. CPU (or GPU) usage is dependent on which scaler is used. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin Input com.apple.InterfaceBuilder.CocoaPlugin General com.apple.InterfaceBuilder.CocoaPlugin Display com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1227, 664}, {213, 198}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin Sound com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default sound volume. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip New display views will show both NDS screens by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip New display views will show only the NDS touch screen by default. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin {232, 826} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin Emulation com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May CPU usage, depending on if the ROM uses the ARM SWIs. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Performs no sound interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Pitch bends the sound depending on the emulation speed. Provides extremely smooth sound, but only when emulation speed is faster than normal. Medium latency. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Provides smooth sound at all emulation speeds, but with some added latency. High latency. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the use of more complex sound synchronization methods. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1156, 396}, {380, 200}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1241, 208}, {335, 163}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{657, 415}, {640, 480}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {492, 305.5} com.apple.InterfaceBuilder.CocoaPlugin {{942, 249}, {288, 511}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the use of more complex sound synchronization methods. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the current sound volume. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will produce smoother color transitions than a standard NDS. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will emulate the NDS toon edge marking. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in "The Legend of Zelda: Spirit Tracks." No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{84, 481}, {301, 467}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in "The Legend of Zelda: Spirit Tracks." No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will produce smoother color transitions than a standard NDS. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will emulate the NDS toon edge marking. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Disables 3D rendering. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default 3D rendering engine for rendering the NDS 3D layer. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Disables 3D rendering. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default number of processing threads that DeSmuME will use for 3D rendering. This is an option for advanced users. For most cases, it's best to keep this set to Automatic. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip DeSmuME automatically chooses the best number of rendering threads based on your hardware. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on the same thread as the core emulation thread by default. Best performance option for single processor machines. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on two separate threads by default. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on four separate threads by default. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Pitch bends the sound depending on the emulation speed. Provides extremely smooth sound, but only when emulation speed is faster than normal. Medium latency. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Provides smooth sound at all emulation speeds, but with some added latency. High latency. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default audio output engine. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Disables audio output. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Native audio output engine for Mac OS X. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Disables audio output. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Native audio output engine for Mac OS X. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{912, 394}, {286, 522}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May incur CPU usage, depending on if the ROM uses the ARM SWIs. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Nicknames should be a maximum of 10 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Messages should be a maximum of 26 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{126, 670}, {305, 315}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Nicknames should be a maximum of 10 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Messages should be a maximum of 26 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip All addresses start with 0x02. Enter the last 6 digits of the address here in hexadecimal format. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enter the numeric value to write to the target address. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Select the memory size of the target address in bytes. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Shows/hides the address search drawer. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Resets the memory address search. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Searches the NDS memory for all addresses that currently carry the search value. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Searches the NDS memory for any addresses which match the comparative search criteria. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Immediately writes the value once to the target address. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{768, 739}, {500, 416}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Whenever DeSmuME needs to determine a ROM's save type, use the ADVANsCEne database to determine the save type before using the internal autodetect algorithm. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip New display views will show only the main NDS screen by default. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{343, 269}, {550, 450}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin InitialTabViewItem InitialTabViewItem com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the classic interpreter engine to emulate the ARM7 and ARM9 CPUs by default. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the dynarec engine to emulate the ARM7 and ARM9 CPUs by default. It features far superior performance to the Interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Uses the classic interpreter engine to emulate the ARM7 and ARM9 CPUs. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.] com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Uses the dynarec engine to emulate the ARM7 and ARM9 CPUs. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.] com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enable to use vertical sync on the video output. This setting eliminates screen tearing, but may also reduce the video frame rate. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enable to use vertical sync on the video output by default. This setting eliminates screen tearing, but may also reduce the video frame rate. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip If the display orientation is vertical, the main screen will be arranged above the touch screen by default. If the display layout is horizontal, the main screen will be arranged left of the touch screen by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip If the display orientation is vertical, the touch screen will be arranged above the main screen by default. If the display layout is horizontal, the touch screen will be arranged left of the main screen by default. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Arranges the NDS screens where one screen is to the left of the other screen by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Arranges the NDS screens where one screen is above the other screen by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{210, 648}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{42, 506}, {580, 592}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Smooths the edges of 3D objects using multisample antialiasing (MSAA). No CPU usage. However, it requires additional VRAM from your GPU. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Smooths the edges of 3D objects using multisample antialiasing (MSAA) by default. No CPU usage. However, it requires additional VRAM from your GPU. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{784, 552}, {350, 263}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{885, 594}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{310, 589}, {620, 267}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{789, 354}, {516, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Generates a predefined buzzing sound. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Generates randomly generated white noise. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Generates a pure sine wave tone. Can be adjusted for frequency. (Some games, such as "The Legend of Zelda: Spirit Tracks," work especially well at 40 Hz.) com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Generates predefined samples taken from an audio file. (Whenever the Microphone command is deactivated, sample reading will be reset to the beginning of the file.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{900, 757}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{21, 940}, {467, 160}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{0, 702}, {620, 442}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Saves the current configuration to the selected profile. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Deletes the selected profile. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Replaces the current configuration with the selected profile. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renames the selected profile. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Shows the selected profile. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Creates a new profile using the current configuration. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin InputProfileController com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{147, 847}, {452, 115}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip The default separation for new NDS display views. A custom gap percentage may be entered here. (The gap percentage must be between 0% and 200%.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default screen separation for new NDS display views. (A value of 100% will create a gap between the screens that has the same relative distance as a hardware NDS.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{585, 535}, {441, 133}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the screen separation to 0%, which removes any gap between the screens. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the screen separation to 100%, which creates a gap between the screens that has the same relative distance as a hardware NDS. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{105, 616}, {640, 303}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Standard Retail Memory Card + ROM com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Choose a directory where the R4 device stores its data. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sends a SLOT-1 eject IRQ. The emulator will then detect that no device is inserted into SLOT-1. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Resets the emulation. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{343, 530}, {194, 241}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{126, 189}, {204, 713}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Changes the maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Changes the default maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{997, 610}, {173, 339}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When checked, the ROM data is only loaded as needed. When unchecked, all of the ROM data is completely preloaded into RAM before use. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{509, 91}, {640, 448}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Applies the selected SLOT-2 device's settings. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {70, 698} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{672, 478}, {350, 240}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{624, 234}, {330, 811}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{63, 709}, {254, 262}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Execute com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Frame Advance com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Reset com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Frame Jump com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Pause com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{820, 748}, {300, 108}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, fragment colors will be sampled using an alternate algorithm. This may fix certain graphical glitches, such as the text in some Atlus games like Etrian Odyssey III. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, fragment colors will be sampled using an alternate algorithm. This may fix certain graphical glitches, such as the text in some Atlus games like Etrian Odyssey III. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default output filter for new NDS display views. No CPU usage. The use of any output filter (other than Nearest Neighbor and Bilinear) requires the use of your GPU. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, helps to preserve the color gradations of the video. This can compensate for poor color blending from the original 16-bit NDS color palette, or for posterization caused by certain filters. No CPU usage, but requires the use of your GPU. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, filters will prefer to run on the GPU if possible. Otherwise, filters will prefer to run on the CPU if possible. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on 16 separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on 32 separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, filters will prefer to run on the GPU if possible. Otherwise, filters will prefer to run on the CPU if possible. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, helps to preserve the color gradations of the video. This can compensate for poor color blending from the original 16-bit NDS color palette, or for posterization caused by certain filters. No CPU usage, but requires the use of your GPU. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{848, 607}, {290, 119}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{189, 422}, {700, 405}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {99.5, 246.5} com.apple.InterfaceBuilder.CocoaPlugin {{103, 632}, {387, 323}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {289.5, 186} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin 10019 0 IBCocoaFramework NO com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES 3 {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {32, 32} {128, 128} {32, 32} {420, 420} {420, 420} {420, 420} {420, 420} {420, 420} {256, 256} {420, 420} {420, 420} {420, 420} {420, 420} {16, 16} {421, 339} {360, 136} {698, 479} {111.60000000000001, 85.600000000000009} {515, 457} {14, 14} {11, 11} {128, 128} {12, 12} {10, 2} {32, 32} {16, 15} {11, 11} {15, 15} desmume-0.9.11/src/cocoa/translations/English.lproj/InfoPlist.strings0000755000000000000000000000040412467662066024413 0ustar rootroot/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright İ2007-2015 DeSmuME Team. All rights reserved.";desmume-0.9.11/src/cocoa/translations/English.lproj/DisplayWindow.xib0000755000000000000000000024327612467662066024412 0ustar rootroot 1050 14C1510 6751 1344.72 757.30 com.apple.InterfaceBuilder.CocoaPlugin 6751 NSButton NSButtonCell NSCustomObject NSCustomView NSMenu NSMenuItem NSNumberFormatter NSPopUpButton NSPopUpButtonCell NSProgressIndicator NSSlider NSSliderCell NSTextField NSTextFieldCell NSToolbar NSToolbarFlexibleSpaceItem NSToolbarItem NSToolbarSpaceItem NSView NSWindowTemplate com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion DisplayWindowController FirstResponder NSApplication 271 2 {{830, 370}, {256, 408}} 74973184 DeSmuME NSWindow D5552DCE-722B-4ECB-8E0A-8B7CF76EAC70 YES YES YES YES 1 2 0135754F-463F-4625-9D27-DEF701AEF50E Open ROM Open ROM NSImage Icon_OpenROM_420x420 {0, 0} {0, 0} YES YES -1 YES 0 2E728430-6055-404B-944F-25594ACBEC39 Execute Execute/Pause NSImage Icon_Execute_420x420 {0, 0} {0, 0} YES YES -1 YES 0 321036F9-6034-47B1-9CC5-2461D98700F0 Reset Reset NSImage Icon_Reset_420x420 {0, 0} {0, 0} YES YES -1 YES 0 41A299FB-4A95-4FA3-9982-8523FF04ACDE Rotate Right Rotate Right NSImage Icon_RotateCW_420x420 {0, 0} {0, 0} YES YES 90 YES 0 C626F2C1-4353-4288-AD59-40FB7F4C1A58 Rotate Left Rotate Left NSImage Icon_RotateCCW_420x420 {0, 0} {0, 0} YES YES -90 YES 0 EDBFD998-E031-4AC5-A86A-7114D66FF847 Speed 2x Speed 1x/2x NSImage Icon_Speed2x_420x420 {0, 0} {0, 0} YES YES 200 YES 0 NSToolbarFlexibleSpaceItem Flexible Space {1, 5} {20000, 32} YES YES -1 YES 0 YES YES 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState NSToolbarSpaceItem Space {32, 5} {32, 10000} YES YES -1 YES 0 YES YES 1048576 2147483647 {256, 408} 256 5156 {{2, 3}, {16, 16}} 28938 100 294 {{17, 5}, {137, 14}} YES 68157504 272634880 YES 11 3100 Status Text 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA NO 1 45 {{0, 24}, {256, 384}} YES DisplayView 289 {{192, -1}, {40, 26}} _NS:791 YES -2076180416 134219776 YES 13 1044 _NS:791 -2043002880 34 LucidaGrande 13 16 400 75 YES 2147483647 1 NSImage Icon_VolumeFull_16x16 _popUpItemAction: YES OtherViews Volume 2147483647 _popUpItemAction: YES 1 YES YES 2 NO 289 {{151, -1}, {42, 26}} _NS:791 YES -2076180416 134219776 _NS:791 -2043002880 162 400 75 YES 2147483647 1 NSImage Icon_MicrophoneBlack_256x256 _popUpItemAction: YES OtherViews Gain 2147483647 _popUpItemAction: YES 1 YES YES 2 NO {256, 408} {{0, 0}, {1920, 1177}} {256, 477} {10000000000000, 10000000000000} NO 268 268 {{176, 5}, {126, 26}} YES -2076180416 2048 109199360 1 400 75 TIFF 2147483647 1 _popUpItemAction: YES OtherViews BMP 2147483647 _popUpItemAction: 1 GIF 2147483647 _popUpItemAction: 2 JPEG 2147483647 _popUpItemAction: 3 PNG 2147483647 _popUpItemAction: 4 JPEG 2000 2147483647 _popUpItemAction: 5 1 YES YES 2 NO 268 {{38, 11}, {136, 17}} YES 68157504 71304192 Select Image Format: NO 1 {350, 35} NSView 268 268 {{2, 0}, {49, 18}} _NS:682 YES 67108864 131072 Mute _NS:682 1211912448 2 NSImage NSSwitch NSSwitch 200 25 NO 268 {{-3, 20}, {66, 11}} YES 68157504 138679296 YES 9 3614 -∞ +∞ #0.0% #0.0% NaN 0 0 YES NO 1 AAAAAAAAAAAAAAAAAAAAAA 3 YES YES YES . , NO NO YES %1.1f%% NO 1 268 {{17, 31}, {21, 105}} _NS:768 YES 604242176 0 _NS:768 100 0.0 0.0 0.0 0 0 NO YES NO {55, 139} _NS:1109 NSView 268 268 {{-1, 6}, {51, 11}} YES 68157504 138679296 #0.0% #0.0% NaN 3 YES YES YES . , NO NO YES %1.1f%% NO 1 268 {{12, 17}, {21, 105}} _NS:768 YES 67371264 0 _NS:768 100 0.0 100 0.0 0 0 NO YES NO {45, 125} _NS:1109 NSView changeCoreSpeed: 56 changeRotationRelative: 57 changeRotationRelative: 58 openRom: 60 view 64 saveScreenshotPanelAccessoryView 105 reset: 107 toggleExecutePause: 108 window 109 changeVolume: 141 outputVolumeMenuItem 142 microphoneGainMenuItem 144 outputVolumeControlView 160 microphoneGainControlView 183 microphoneGainSlider 203 microphoneMuteButton 204 changeHardwareMicGain: 207 changeHardwareMicMute: 233 delegate 62 enabled: isShowingStatusBar enabled: isShowingStatusBar enabled isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 53 value: emuControl.statusText value: emuControl.statusText value emuControl.statusText 2 67 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 54 animate: emuControl.isWorking animate: emuControl.isWorking animate emuControl.isWorking 2 68 selectedTag: screenshotFileFormat selectedTag: screenshotFileFormat selectedTag screenshotFileFormat 2 106 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 131 image: emuControl.currentVolumeIcon image: emuControl.currentVolumeIcon image emuControl.currentVolumeIcon 2 135 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 133 toolTip: emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString toolTip: emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString toolTip emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString 2 226 image: emuControl.currentMicStatusIcon image: emuControl.currentMicStatusIcon image emuControl.currentMicStatusIcon 2 184 value: emuControl.currentVolumeValue value: emuControl.currentVolumeValue value emuControl.currentVolumeValue 2 138 enabled: emuControl.isHardwareMicAvailable enabled: emuControl.isHardwareMicAvailable enabled emuControl.isHardwareMicAvailable 2 218 value: emuControl.currentMicGainValue value: emuControl.currentMicGainValue value emuControl.currentMicGainValue 2 230 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 159 value: emuControl.currentVolumeValue value: emuControl.currentVolumeValue value emuControl.currentVolumeValue 2 157 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 167 enabled: emuControl.isHardwareMicAvailable enabled: emuControl.isHardwareMicAvailable enabled emuControl.isHardwareMicAvailable 2 220 value: emuControl.currentMicGainValue value: emuControl.currentMicGainValue value emuControl.currentMicGainValue 2 232 value: emuControl.cdsCoreController.content.cdsController.hardwareMicMute value: emuControl.cdsCoreController.content.cdsController.hardwareMicMute value emuControl.cdsCoreController.content.cdsController.hardwareMicMute 2 224 0 -2 File's Owner -1 First Responder -3 Application 3 4 5 6 10 13 14 15 16 17 18 19 20 21 63 93 Screenshot Save Panel Accessory 94 95 96 97 98 99 100 101 102 103 104 116 117 118 120 119 122 123 124 125 126 151 Sound Output Volume Menu Item 136 137 152 153 154 161 Microphone Input Gain Menu Item 162 165 166 145 146 185 186 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {183.5, 317.5} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {84.5, 324.5} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1059, 381}, {256, 408}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin 233 0 IBCocoaFramework NO com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES 3 {420, 420} {256, 256} {420, 420} {420, 420} {420, 420} {420, 420} {420, 420} {16, 16} {12, 12} {10, 2} {15, 15} desmume-0.9.11/src/cocoa/translations/English.lproj/Localizable.strings0000755000000000000000000002264412467662066024737 0ustar rootroot˙ŝ/* DeSmuME Strings File */ /* ENGLISH */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "Execute"; "Pause" = "Pause"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "Show Status Bar"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "Slot %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "Volume: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "DeSmuME Emulator"; "OK" = "OK"; "Cancel" = "Cancel"; /* File Menu */ //"Slot %d" = "Slot %d"; /* Emulation Menu */ //"Execute" = "Execute"; //"Pause" = "Pause"; /* View Menu */ //"Show Status Bar" = "Show Status Bar"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = "Are you sure you want to quit?"; "Are you sure you want to close the ROM?" = "Are you sure you want to close the ROM?"; /* Status Bar Messages */ "No ROM Loaded" = "No ROM loaded"; "Executing" = "Executing"; "Paused" = "Paused"; /* Preferences Window */ "DeSmuME Preferences" = "DeSmuME Preferences"; "Interface" = "Interface"; "Controls" = "Controls"; "DS Firmware" = "DS Firmware"; "Yes" = "Yes"; "No" = "No"; /* Interface Preferences */ "Execute Upon Load" = "Execute Upon Load"; "When Launching, Load" = "When Launching, Load"; "Load Nothing" = "Nothing"; "Load Last ROM" = "Last ROM"; /* Control Preferences */ "A Button" = "A Button"; "B Button" = "B Button"; "X Button" = "X Button"; "Y Button" = "Y Button"; "L Button" = "L Button"; "R Button" = "R Button"; "Up Button" = "Up"; "Down Button" = "Down"; "Left Button" = "Left"; "Right Button" = "Right"; "Start Button" = "Start"; "Select Button" = "Select"; "Up Key" = "[UP]"; "Down Key" = "[DOWN]"; "Left Key" = "[LEFT]"; "Right Key" = "[RIGHT]"; "Space Bar" = "[SPACE]"; "Enter Key" = "[ENTER]"; /* Status Bar */ "No ROM loaded" = "No ROM loaded"; "ROM Loaded" = "ROM Loaded"; "Emulation Executing" = "Executing"; "Emulation Paused" = "Paused"; "Emulation Reset" = "Reset"; /* Errors */ "Error" = "Error"; "An emulation error occurred" = "An emulation error occurred"; desmume-0.9.11/src/cocoa/AppIcon_DeSmuME.icns0000755000000000000000000035171712467662066017400 0ustar rootrooticnsÓÏis32 A6XDPU'€ Iş2‹µa"͚7€ [­˜/}VD~v€ S~}3ymœ3Ps€ Q{w1sg–1yHo€ O˜”0r¸Ĥ)›¤g€ 62-"$3‚ ha`D C3;€ (oZYt]d€ $€_FNqfZ€ hJ08 j…7‚ 618"/, € :tn_`‡S€ 4QQO\N'€ )BA/> W\ A6XDOT'€ Hş2‹µa"͚7€ [Ĵ˜/~VD~v€ S~}3zmœ3Ps€ Q{w1sg–1yHo€ O˜•0r¸Ĥ)›£g€ 62-"$3‚ ha`D C3;€ (p[Yt^d€ $_FNqfZ€ hJ/8 j…7‚ 728"/, € ;tn_`‡S€ 4QQO\N'€ (BA/> W\ L>iVXg2€ !SŜ9Òs,é·B€ eÈÂ;šb"T‹€ f˘¨B™‰ÊD™_Œ€ f˘A˜†ĈD“UŒ€ dÌÏ@ž˙Ŝ;ËŬ‡€ IE @0 2H€ £š™keP[€ @ۂ}*‡’€ >‘fs*­£€ 3wIX­Ù]‚ `Xb<TV€ dγĞ-ö&€ d˘œ€ /Îi&€ għ¨Œ9ıĞO€ T‘‰n‰şĊ5s8mkA˙û˙˙˙˙˙˙˙ü˙ż@˙ü˙˙˙˙˙˙˙ü˙ż@˙ü˙˙˙˙˙˙˙ü˙ż@˙ü˙˙˙˙˙˙˙ü˙ż?˙û˙˙˙˙˙˙˙ü˙ż@˙ü˙˙˙˙˙˙˙ü˙ż@˙ú˙˙˙˙˙˙˙ü˙ż,Vŝ˙ŝ˙˙˙˙ü˙ż1˙˙ŝ˙˙˙˙ü˙À3üŭ˙˙˙˙˙ü˙ż5˙ŝ˙˙˙˙˙ŭ˙܁0&ĵÔ˙ŝ˙˙˙˙˙ü˙YQ˙ü˙˙˙˙˙û˙UX˙ü˙˙˙˙˙ü˙VV˙ü˙˙˙˙˙ü˙VV˙ü˙˙˙˙˙ü˙Vil32Zƒ#.#')+1+'+1Œĥë·ġżıĊ]s÷â²Ċ]ˆ-#§ÔÙ7eŜˆ-òĉÒ×Í£×ÓïrfÙĠĜôoˆ "ߙ˜Î Ù‚"aˆ!ܝËÜ–×ccâ#ĉ_ˆ!Ĝ››ÇšĜ •Ñ]^ââ^ˆ Ԙ—Ä—Ô ’Í\\ŜŜ\ˆ ••À• ÊZZÚÚZˆ̑½’Ĉ‡ĊYYÒÒYˆĈ‘‘¸ş§´WWĊĈWˆ$żı½¸‹´°°ğXXğ´³ğXĵiˆŠŠ†…B˜?•B„tt²__°QÂLĵQ~Ğ::·°LıH³M|¨>?ĥ­KµF°Ky¤==ħŞI<ĞIv <;­ĤH£s H}ĞDDµŞN¨ Ÿ§N ‘Ÿ–˜—–’tœzvrŒ‘` Œcc†h‰"ŽbŽfeƒe‡ƒˆŒŠ_Šccc††\†``|`† \zŒ‚Y‚]]x]‚XxWZZu[yYt„[ „__zR~||wŽƒƒ#.#')+1+&+1Œµë·öżıÄ]s÷â²Ä]ˆ-#¨ÔÙ7dŜˆ-óċÑ×Í£×ÒïrfÙĠĜôoˆ "Ŝ˜˜Î Ĝ‚"aˆ!ܝËžÜ–×ccâ#ĉ`ˆ!Ĝ››Ç›Ĝ •Ñ]^ââ^ˆ Ԙ—Ä—Ô ’Î\\ŜŜ\ˆ ••À• ÊZZÚÚZˆ̐½’Ĉ‡ĊYYÒÒYˆǑ‘¸ş§´WWĈĈWˆ$ı½ı‹´°°ğXXğ³³ğWĵiˆŠŠ†„B˜?•B„­tt²__ŻQÂLĵQ~Ğ::¸°MıH´M|¨?>µKµF°Ky¤==ħİI<ĞIv <<­ĤG£s H}ĞDCµŞN§ Ÿ§N ‘ –———’tœzvrŒ‘` cc†h‰"ŽbŽfeƒe†„ˆŒŠ_Šcc€c††\†``|`† \zŒ‚Z‚]]x]‚Xx~W~ZZu[yYt„\ …__zR~||wŽƒƒ*9*024<4/4<Œá˙˙íċótŽ˙˙Üótˆ9-Ô˙Ñ˙F ˙Lj9‚˙с˙’ƒ˙Žˆ -˙ÈÈ˙Ñ˙%‚-˙ˆ-˙ÑÑ˙Ñ˙È˙ƒƒ˙.&˙ˆ-˙ÑÑ˙Ñ˙Ê˙˙%%˙ˆ-˙ÑÑ˙Ñ˙Ê˙˙%%˙ˆ-˙ÑÑ˙Ñ˙Ê˙˙%%˙ˆ-˙ÏÏ˙Ñ˙Á˙˙˙ˆ-˙Ô Ô˙Ñ˙ô˙˙˙ÑÑ˙ˆ6‚˙˙ƒƒ˙ƒ‰€ıĤ×ÛÛÔßßÒhñcìh×˙ĵĵ˙šš˙ƒ˙{˙ƒÑ˙``˙˙˙w˙Ñ˙jj˙%%˙˙w˙Ñ˙jj˙%%˙˙h˙Ñ˙jj˙%%˙˙Ìċ˙ ˙{{˙22˙ށ˙Ž*7 9;.+,/‘2**'+-).#,24=9…˙˙íċß Œ-˙Á˙ÈÈ˙Ñ˙F ! -˙Ê˙ÑÑ˙с˙ Œ-˙Ê˙ÑÑ˙Ñ˙%-˙Ê˙ÑÑ˙Ñ˙È˙Œ-˙Ê˙ÑÑ˙Ñ˙ Ç˙-˙Ê˙ÑÑ˙Ó˙FÎ˙ 9˙Ü ˙˙ā˙Œ<(<**93--6ƒl8mk˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÑÑĊü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙{ŽÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙4˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-.˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙--˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-it32:‹˙˙˙˙˙+$.„#&‚$%€$%„$&"„/%$$%€$%‚$%$$&#tĝèéèèü/„ ıíèççéèèççèèçèééíı„/üé‚èçé…èíıgàÎÎÍÎĉ$„ İÓÎÍÎÎÍÎÍÎυÎÔŞ„$ĉƒÎ̓ÎÍÎÎÔŞfŜÍċ$„İӎÍÓİ„$ċÍÎÍ̆ÍÓİfŬÌÍÌÌċ$„¨Ò€ÌÍÌÏÓ҄ÓĜ§„$ċÌÍÌÖɁÓҀÓĜ§fÜËÌËËä$„¨ÑËÌĜbˆ„$ƒËɇeۀÊË#„§ÑÉËÊËÊÛe$‚ÊËÑÉeځÊâ#„ĤÊÉÚe#âƒÊÉaրÉÈá#„ÏÉȀÉÖaˆ„#á€ÉÈÉÉĈ‡°+ßÎÎσΠÏÎÊËËÇÈÈÇß#„¤ÎÈǀÈÌËʁÎÏÏÎÏÏÓ£„#à€ÈÇÈÈÑĊ€ÎρÎÓ£°#ßÇĈ€ÇȃǀĈ€ÇŜ#„¤Í€ÇĈŠÇÌ£„#ŜÇĈ€ÇĈÇÈÇÇÍ£°#ŜĈĈĊ…ĈÇĈĊǀĈŬ"„£ÌĈljĈÌ£„"ŜĈĊƒĈĊĈÌ£°"ŬƒĊπˀȁĊÜ"„˘Ë‚ĊÉÉȀË̂ËĦ„*܇ËẤĊˢ°"ÜÄĊ€ÄĊ‚_ÑĊÄÄĊÜ"„˘Ë‚ÄÑ_ˆ‘ÂÄÄĊÄˢ°"ÛÄĀÄɂaÔÄÄÄÜ"„ĦʁÄÓbÊÄÊĦ°"Ù‚ɂaҁÚ"„ È€ÒaÉÂÈ °"كÂȂ`сÂĜ"„ŸÇÁÁÂÂÁÑaÇÂǟ°"ĜƒÁǂ`€ÁÀ×"„žÇÀÁÁÂÀ`€(‚"$ „+"'‚ǁÁĈž°"׃ÀĊ‚_Ïż€ÀÖ!„Ĉ‚ÀÏ_€kĉր×ÖÜĞ„+ê×ċk‚ĈÀżÀÀĊ°"փżÄ‚_ρżÖ"„œĊ€żżÏ_€_€żĊ„!ցżÏ`‚Ċż€Ċ°!Ԁ½Ä‚^νĠ!„œÄ‚Î_€^΂Ĝ„!ĠżÎ_‚āĝ°!Ӄ½‚^́½Ô!„›‚½Í^€^͂½›„!Ô½½½Í^‚½œ°!Óĵ½ĵ‚^́ĵÒ!„›Â‚ĵÌ^€^Ìĵ½€ĵ›„!Óĵ½ĵĵÌ^‚Âĵĵ½½Â›°!Òğĵğ€ĵÁ‚]ˀğĵÑ!„šÂğĵ€ğË]€]ËğĵğĵğÀš„!ҁğË^‚Áğ€ĵÁš°!ÒşğşğşşÀ‚]ˀşğ „™ÀığşşğÊ\€]Êşğşğşż™„ €şğË]‚ÀğğşşÁš° ı‚şÀ‚]ɁşÏ „™ż€şışÈ]€]ɂıż™„ ı€şÉ]‚À€şıÀ™°!ρışıż‚\ȁıÏ „˜‚ıÈ\€\Ȃıż˜„ ρıÈ\‚żıż˜° η€¸ı·‚[Ǹ·¸·Í „—ı¸ı¸¸Ç[€[ȸı¸·¸—„ ΁¸Ç[‚¸ı·¸½—° Ìĥ·ĥ½‚[Ĉ·ĥ¸ĥÌ „–½·ĥ€·Ĉ[€[Ç·¸·ĥ·½—„ ́·Ĉ[‚½·ĵ–° ̃ĥğ‚[ĊĥµĥĥÌ „•ğ‚ĥĊ[€ZĊ‚ĥğ–„ ˁĥĈ[‚ĵĥĵ–° ˃µğ‚ZāµË „•ğµĥÄZ€Zõğ•„ ˁµÄZ‚ğµğ•° ʁ´µ´ş‚Z´Ê„•ş´µZ€Z‚´ş”„ ʁ´Z‚ş´ş”°ɀ³€´ı‚Y³€´È„”¸³´³´³ÂZ€Z€³´³¸“„ ɀ³´ÂY‚ı€´³ı“°Ȁ²€³¸‚YÁ³Ç„“¸²€³ħÁY€YÀ²²ħ³²·“„Dz²³³ÁX‚¸€³²¸“°Çħ€²ħ²·‚YÀ²Ĉ„’·ħħ€²ÀX€XÀ²ħ²²ħ·’„Çħ²²ħÀY‚·ħħ²ħ·’°Ĉħ²ħĥ‚XżħĈ„‘ĥ°ħĵU€Uĵ‚ħĥ’„ĈħÀX‚ĥ€ħ°ĥ‘°Ċ°°ŻŻ°°ĥ‚XżŻ°Ż°Ċ„ ĥŻŻ°°Ż³²²µ²²´‚°µ‘„Ċ€°ħP‚²°ŻŻħµ‘°ÄŻ€ŻŻ´‚UŻŻŻÄ„´ŻŻ€ ŻŻŻŻ°Ż°Ż´„āŻµƒP€WT²ŻŻ°´°ƒ­€f¸„³­‹³„€­µ½½ĵ½ı²³°ƒ­´ğ€ÂÁ¸Ż€­Â„³­²„­ˆ­³°Á‰Ĵ­€Ĵ­­Á„޲‰Ĵ­€Ĵ­ħ„ÁĴ­ƒĴ­Ĵ­Ĵ­²°ÀĴĞĞĴ…ĞĴĴĞĞĴĴÀ„ħĞĴĞĞĴ‚ĞĴ€ĞĴĞĞħŒ„ż…ĞĴ€ĞĴĞĞĴħ°ÀĞŞ„ĞİŞĞĞŞŞ€Ğż„ŒŻƒĞŞŞĞŞĞŞ€ĞŞŞ°Œ„żĞŞĞŞŞƒĞŞĞĞŞŞ°Œ°&𽂽€½½€Ï&„˜½„½½½—„&Ͻ½…ż½ĵ—°&‚€€&„„&ƒ˙˙˙˙˙˙˙´BŽ˜…‘……ŽB€‘‚…ˆiÂS³˜Ĥı…ıĤ³S€ı‚ĤЇÂPŸ‡ Ÿ€ Ÿ‚ Ÿ  Ħ  ³…³ Ħ  ­O€³Ÿ Ÿ  ƒÂOĴž€Ÿ ŸŸžžƒŸžž„Ÿ  Ÿ²…²Ÿ Ÿ ĴO€²ž  ŸŸ¤ƒÂNޝ€žŸžĦ˘˘£Ħ‚žĦ£Ħžħ…ħžĞO€ħ€žž£‚ÂNŞ‚˘}‚€‚¤˘}‚‚€‚€°…°ž€ŞN€°‚˘ÂNݝœœœ¨D€Ёœ¨DĴ€œŻ…ŻœœİN€Żœœœ˘ÂN¨œ›İN€­›€œ¨M€œ­…œ››œİM€œ››œœĦÂM§š›š›š§M€­››š›¨M­›šš­…Ĵšš››§M€­›š€›ŸÂMĤ™šĤL€­šš™š§MĴ€šĴ…Ĵ™™ššĤM€Ĵš™€šž~ÂLĤš™L€Ğ™™š™LĞ€™Ğ…Ĵ˜˜™™L€Ğ™˜€™~ÂL™˜¤L€ޘ˜™™¤Kޘ—˜Ş…ޘ—˜˜L€И—€˜œ}ÂK£—–——˜£K€İ€—˜¤Kİ€—Ş…݁—¤L€İ——˜——œ}ÂK£——––—˘J€݁—£J¨•––¨…İ——––£K€¨–•›|ÂJ˘•–ĦJ€§€–•˘J§”•–§…§••––˘J€§•––••™{ÂJĦ”•€” J€Ĥ€•” JĤ”••Ĥ…Ĥ””••ĦJ€Ĥ”••””™zÂJ ‚” J€€”“ŸJĤ“””…““”” I€¤”“˜yÂIŸ‚“ŸI€€“’žI’““¤…¤€’“ŸI€£’’““’—xÂIž‚’žI€¤€’‘žI¤€’£…£’‘’’@€ ‚’–xÂH‚‘H€˘‘I£€‘˘…˘‘•„swux˜‚‘–wÂHœ‘‘œG€Ħ‘œHĦ€Ħ…Ħ€‘“•””“‘”vÂG›ŽŽ›G€ ›G Ž … Ž€ŽŽ“vÂGšŽ™G€ ŽšGŸŽŽ …ŸŽŽ€ŽŽŽŽ“uÂF™‚™F€ž™FžŽž…ž’tÂF˜‚Œ˜F€ŒŒŒ˜F€Œ…ŒŒ…Œ€ŒsÂF—Œ‹ŒŒ‹—F€œ‹ŒŒ‹—FœŒ‹‹œ…ƒŒ ‹‹ŒŒ‹ŒŒ‹ŒsÂKĦ€–•—ĦK€Ĥ––•–ĦJĤ––•Ĥ…Ĥ——–•€–•–——––šyÂ"JE€DEJ"€ MEEDDJ" MDEDL … M€EDEEDEEDDEDG8˙˙˙˙Èû ˆ‰‰ˆ‰Šˆ‰ˆ‰€ˆ‰‰Š‰ƒˆ‰‚ˆŠ”„lŒ€ˆ‰‰ˆ‰ˆ€‰ˆˆ‰‰ˆ“ˆ„€ƒ „ƒ„ƒƒ„ƒƒ„ƒ„„ƒƒ„€ƒ„ƒ„“„lˆƒƒ€„ ƒ„ƒ„ƒƒ„ƒƒ„ƒ“‡ƒ‚ƒ‚‚ƒƒ‚‚ƒƒ‚ƒ‚€ƒ‚‚ƒ‚ƒƒ„‚ƒ’„l‡€ƒ‚‚€ƒ‚ƒ‚ƒ‚€ƒ“†‚‚‚€‚‚‚€€‚‚‚‚‚‚’„k†€‚‚…„„…†…†…‘…‚ˆ‘Šƒƒ‡‹€‰‚€„j…‚‰>̈́€€ƒj ,‰€€€€K†€€„i„€€€Š?̓€€~„g€€€‚‚=‰~€€Ž„hƒ€€‰?Í‚~~ƒh€Ž~~~‚‚?ˆ}€„g‚~~~†=́}g€Œƒ}‚?ˆ}~}}Œ„ g~~}~}€€…ŒÂ€}||}€f€‹ƒ|€‚>†|}}|‹„f€}}|}||}†|‹Â|€{e€Š|€{||‚>†{{|{Š„e|{{||{|ƒ{ŠÂ{z{{d€Š{{z{|{‚=…{zz{‰„e€{zz}||ƒ~‰Â}y€z}c€‰‚zy}‚<ƒzyyzˆ„d~€zyz‚;Í|yyzy|c€ˆƒy|‚<ƒy‡„c|‚yƒ<Í|xwxw{c€‡xw€xy|‚;‚wxxw†„b|w€xw‚<Í|xwwx{a€…vvw{‚;‚wwvw†„b|€wxv;Ízwvvwz`€„uuvz‚;vvuw…„bzvwvvu€;€=‚z„Âyuvuuy`€„uuv€uy‚:uƒ„ay‚u:€:uƒÂxt€ux`€ƒtt€utx‚:~uutt‚„`y€tuu:€:~€ut‚Âxsttsw`€‚sstw‚:}tust‚„_xst}9€9}€st‚Âvrssru^€€r‚sv‚9|strs„^wrs|9€9}rrss€Âuru]€q‚rv‚9{r€„^v‚r{9€9|rÂtqt]€p‚qu‚8zq„]t‚q{9€8zq~Âsps\€~o‚pt‚8y€pq~„\s€pqpz8€8yp}Âroopos\€}popopos‚7xoopo}„[s‚oy8€7yo}Ârononr[€|‚onr‚7xonoo{„[r‚ox7€7xn€o|ÂqmmnmpZ€{ƒmq‚6vmmnmz„Zp‚mt4€5tmnnmzÂplmmlpY€zlmmp‚6ullmly„Yp‚l€n pnoolmmlzÂol€koY€ykkln‚6tkklkx„Yo€lklkll€klkyÂnk€jmX€xj‚kn‚5tjjkjx„Ovjj€kj€k„jxÂm€jimW€wi‚jm‚5sjw„Yri…ji‚jwÂsrqrqu\€}‚qrs‚8zq€r}†Ywqqrqrr€qrq~Â546+€ :ƒ45‚84: ††43‚4: ˙˙˙˙˙Œ˙˙˙˙˙+$$%$/„#&†$%%$$%€$&#„/€$%‰$&"tĝèèéçü.„ıíèèé€è éèçèèçèèççèíı„.û€èéƒèçèèççèí¸gà€ÎÍĉ$„ŞÔˆÎÍÎÎÍÎÎÔŞ„$ĉÎψÎÔİfŜÍċ$„İӀÍΊÍÓİ„$ĉ‡Í΂ÍÓİfŬ̀Íċ$„¨ÒÌ̀ÍÏπÓҀÓÒÒĜ§„$ċÌ́ÌÖÊ҂ÓÒÓĜ§eÜËËÌÌċ$„§Ñ́ËĜbˆ„$äËÌÊËÌËȇeÛÊËËÊ$„§ÑˁÊÛe$ÊËÊËËÊÉdځÊâ#„ĤÊÊÉÊÊÛe#âɂÊÉaÖÊÈÊÉà#„ÏÉÉÈÉÉÖaˆ„#áÉÉȀÉĈ‡°+ßÎÎπÎρÎËËÌÉÈÉÈß#„ ÎÇÈÇÈÈÌËËÎπÎπÎÓ£„ #ßÈÉÇÇÈÈĊ΀ρÎÔ£°#ßÈÈÇÇĈÇĈÇȀÇß#„¤ÌĈȀÇĈÇĈÇĈĈ€ÇÈÇÇͤ„#߀ÇĈ„ÇȁÇÍ£°#ŜĈĊ†ĈǀĈŜ"„£ËĈǀĈĊĈĊĈĊĊĈǁĈÌ£„#Ŝ„ĈĊĊ„Ĉ͢°"ŬƒĊ΀ËÇÈȁĊÜ"„˘Ë‚ĊÈÈǀË̀ËÌËĦ„*܁Ë̂ËÂ΁ĊÌ˘°"܃Ä‚_ÑÄÄĊÄÜ"„˘Ê‚ÄÑ_ˆ‘ÁĊ€ÄËĦ°"ڃɂaĠÄÛ"„ĦɂÓaÉÄÊ °"ÚÂÁÂȂaÓÂÂÙ"„ È‚ÂÒaÉÂÂÉ °"ÙÂÂÁ€ÂǂaÒÁÂÂÁĜ"„ŸÈÂÁÁÂÂÒaÈÂȟ°"ĜÁÁÀ€ÁĈ‚`сÀ×"„žÇÁÀÀÁÁÑ`€'‚"$ „+"'‚Ç€ÁÂȞ°!×ÀÀżÀÀżĈ‚_żÀÀż×"„žÇÀżżÀÀÑ`€kċ€×Ö×ŬĞ„+é×ċl‚ĈÀżÀÁĈž°"ĠżżżżĊ‚_ÏżÀż×!„ĊÀżżżÏ_€_ÏÀżżżĊ„"ÖżżżÎ`‚ĊżĊ°!ԀżÄ‚_ν€Ġ!„œÄ½½Î^€^΁½Ä„!Ġ½Í_‚āĝ°!Ӏ½½½‚^́½Ô!„›½ĵÍ^€^͂½›„!Ԁ½Í^‚½›°!Ӏĵ½½ĵ‚^́ĵÓ!„›Âĵ½Ì^€^̂ĵ›„!Ӏĵ½Ì^‚½€ĵ›°!Ҁğ€ĵ‚]ËĵĵğğÒ!„›ÂĵğğĵĵË]€^Ìğğĵğğš„!Òğ€ĵË^‚ÁĵğĵğÁš°!ÑıığÀ‚]ÊğğşğÑ!„šÀğşÉ]€]ÊşşğğşÁ™„!şşğğÊ]‚ÀğşğşÀ™° ı€şııż‚\ɁşÏ „˜‚şÉ\€]ÉşşışşÀ™„!ρıÉ]‚Àıışşż™° σıż‚\ɁıÏ „˜‚ıÉ\€\Ȃı˜„ πı¸É\‚żışıı˜° θ·¸··¸‚\ǁ¸Î „—½¸·¸¸ıÇ[€\Ç·¸ıı¸—„ ϸ·¸·Ç\‚¸ı¸¸—° ́·ĥ·ĵ‚[Ĉ·Í „–½·ĥ··¸Ĉ[€[Ĉĥ¸·¸·½—„ ηĥ··Ĉ[‚½··ĥ·½–° ̃ĥğ‚[ĈĥĥµĥÌ „–ĵ‚ĥĊ[€ZĊ‚ĥğ–„ ́ĥĊ[‚ĵĥĵ–° ˃µğ‚ZāµË „•ğ€µĥµÄZ€Zõğ•„ ˁµÄ[‚ğĥµµĥğ•°ʀ´µ´´ş‚Z´Ê „”𴁵Z€Zµ´ş”„ʁ´Z‚şĥ€µş”°É´³³´³³ı‚Z³É „”ı³´ÂY€Z´´€³ı“„É´³´³Z‚¸´³³´ı”°dz²€³²ı‚YÁ²È„“·ħ³²²³ÀY€YÁ‚²¸“„dz³²²ÂY‚·³²²³¸“°Dzħ²ħħ²·‚YÁħ²²ħÇ„’·ħ²ħ²²ÀY€YÁ²ħ€²·’„Ĉħ²ħħÀX‚·€²ħĥ’°Ĉƒħĥ‚Xż°€ħĈ„‘·°ħĵU€Uĵħ°€ħĥ‘„ĈħżX‚ĥħĥ‘°Ċ°°ŻŻ°ħĥ‚XżŻ€°Ċ„‘ĥ°Ż€³ ĥ³²³Ż°ħ°°µ„Ċ°½Q‚²°Ż°°µ‘°ÄŻŻ°Ż´‚U€ŻÄ„ µŻŻ°ŻŻ°Ż°€Żµ„Ċ°ŻŻĥ„P€WTħŻŻŻ´‘°ƒ­€f·„³‚­ˆ´„Żĥ½€ĵş²³°ƒ­³ĵ€ÂÀ¸Ż­­­Â„³‡­Ĵ­­­³„‚­„­­­³°Á€Ĵ­Ĵ­Ĵ­€Ĵ­­Ĵ­Á„޲ĴĴ­Ĵ ­­ĴĴ­Ĵ­­Ĵ­ħ„ÁĴ­ĴĴ­­Ĵ­Ĵ­­ĴĴ²°À„ĞĴĞĴĴĞ€ĴÀ„ħĞĞĴĞĞĴĞĞĴĞĞĴĞĴĴĞĴ°Œ„żĞĴĴ‚ĞĴĞĴĞаŒ°żŞĞŞĞĞ€Ş€ĞŞ€Ğż„Œ°ĞŞĞŞŞ†Ğ°Œ„żĞЂނĞŞĞĞŞŻŒ°&큽½½…Î&„ —½½½ż½½—„&ς½½½½½Â—°&€‚&„€€„&˙˙˙˙˙˙˙´Bކ‚…„„…†Ž…‘…‘…ŽB€‘‚…ˆjÂS³˜Ĥı…ıĤ³S€ı‚ĤЈÂP Ÿƒ Ħ„ Ÿ  Ħ €Ÿ  Ÿ³…´Ÿ€ ­P€³ Ħ€ ¤„ÂO­Ÿž€Ÿ ŸŸ €ŸžŸ ƒŸ Ÿž²…³ŸŸžŸĴO€²Ÿž£ƒÂOĴƒžĦ€£˘žžŸžžĦ€£¤Ħ€žħ…°žžžĞO€ħž˘‚ÂNЁžĦ}€ƒ€œ˘}‚€‚€°…°ž€ŞO€°‚˘ÂNİœœœ¨E€Ĵ€œ¨EĞœœŻ…°€œİN€ݜœœœĦ€ÂM¨›œ§M€Ż€œ›¨M­œ›œ…›œ››¨M€œ›œ››ĦÂM§š›§M€­›§M­›š›­…­šš›š§M€Ĵ›š›ššŸÂM§€š™šĤM€Ĵš§MĴ™ššĴ…ĴšĤM€Ĵ€š™šž~ÂL€™˜™L€Ё™LИ™™Ğ…Ё™L€Ğ‚™}ÂK¤—˜—˜˜¤L€Ş™€˜¤LŞ€˜Ş…Ş——˜˜¤K€Ş€—˜˜œ}ÂK¤‚—£L€¨—€–£L¨€—İ…݁—¤K€İ–—œ}ÂJ˘—––——£K€¨——––˘Kİ€—İ…İ––——£K€¨–—›{ÂJĦ•–€•˘K€§•ĦJ§€•§…§•–••˘J€§–•šzÂJ ”•€”ĦJ€Ĥ•€” JĤ””•Ĥ…Ĥ••””ĦJ€Ĥ•”™zÂI €“”” J€Ĥ•“”“ I““”…”“”” I€““””“˜zÂIŸ“’’““ŸI€£“’“’ŸI¤’’“¤…¤“’’“ŸI€’’“’“—yÂHž‚’žI€£€’‘žI£€’£…£’@€ ‚’–wÂH‚‘H€£€‘H˘€‘˘…˘‘–„rwvx˜‚‘•wÂHœœH€˘‘›GĦ‘˘…Ħ€‘“””•“€‘•wÂG›Ž›H€ ›G  … ‚Ž“vÂFš€ŽŽšG€žšG ŽŽ …  ŽŽŽŽŽ’uÂF™‚™F€ž™Fž€ž…ŸŒˆ’tÂF˜ŒŒŒŒ˜F€ŒŒŒ˜FŒŒ…žŒŒŒŒ†Œ‘sÂF—€Œ‹Œ˜F€œ‹‹Œ‹—Eœ‹ŒŒ…œ‹‹€Œ‹ŒŒ‹Œ€‹€ŒsÂJĦ—––—–ĦK€–—––ĦKĤ€–Ĥ…Ĥ––€—–•––—–•–€—›yÂ"K‚EK"€ MEJ" MDEEM … MƒEDEDEG8˙˙˙˙Èû‡ˆ‰Š‰‰ˆ€‰ˆ‰ˆ‰‰Š€‰ˆ€‰ˆ•„lŒ‰€ˆ Šˆˆ‰‰Š‰ˆ‰ˆ‰‰”‡ƒ€„ƒƒ„ƒ„ƒ„ƒ„ƒ„ƒ€„ƒ”„l‡„€ƒ „ƒ„„ƒ„„ƒ„ƒƒ„“‡ƒƒ‚ƒ‚ƒ„„ƒ‚‚…ƒ‚ƒ“„l‡ƒ‚…ƒ‚ƒ‚’†‚‚ƒ‚‚‚€‚‚‚‚‚’„ k†‚‚‚…ƒ„††…†…‘Â…‚‡‘Šƒ€€†‹ˆ‚„j…‚‰>ͅ€‚j ,‰ƒ€€K‡€€„i„‚€Š@̓~ƒg€Ž€€€ƒ‚>‰~€„iƒ€€Š@Í‚}}~‚g€€~~ƒ‚?ˆ€~Ž„h~}~†=́}g€Œ~~}‚>ˆ}~}}Œ„ g}}~}}€€‚‚ŒÂ€}||}€f€‹ƒ}€‚>†|}||‹„g€||}}€| }||}}||}}‹Â{{||f€Š||{€|‚>†{|{{‹„f|{{|{|{|{{|{|{{|ŠÂ~{z{{e€‰z{z{z{~‚=…{z{z‰„e~{zz{z~|}~~~~‰Â~zyyz~d€ˆ€zyzz}‚<ƒzyzzˆ„d~yyzzy‚;Í}yxyy|c€‡ƒy}‚<ƒzxyy‡„c|‚yƒ<Í|x|b€†yxw€x|‚<‚xwxx†„b{‚x‚<Í{wxww{b€†xwxwwx{‚;€xw…„b{xw;Íyvwvvzb€…vvwvvwz‚;€wwvv„„bz‚v€;€=y€z„Âxuya€„uvuvuuy‚;uƒ„`yuuvuu:€;uƒÂxtx`€ƒtututty‚:~tutu‚„`xttuut:€:~t‚Âwsstsw`€‚stt€sw‚:}stst„_w€sus}:€:~tsst‚Âwrssrv_€€rssrsrv‚9|ssrs„^vrsstr|9€9}rrsrÂvru^€ƒru‚9{r„]vqr{9€9|r€Âtqt]€qrqu‚8{q~„]u‚qz8€8zq~Âsps\€~pqpt‚8zp}„\t‚py8€7y€pq}Âspopps[€}‚ons‚8yo}„[rnppooy7€8yonop|ÂrorZ€|onor‚7x€on|„Zrn€omw7€7xnnoo|ÂqmqY€{mnmq‚6wmnmm{„Yq€mnmt5€4tmmnnzÂplpY€{lmlp‚6v€mlz„ Ypmllmlonnp€nllmnyÂpl€koY€ylmlklln‚5tkkmky„Yoklklk€lklxÂnjnX€w€kjkjm‚5sjjkjx„Otjkj€k jkjkkjjkjjwÂm€jimW€vƒjm‚5rjw„Xs‚ji„jijvÂsqqrqu\€~‚qrs‚9{rqrr}†Yw€qrrqrqq‚r~Â5€436+€ ;ƒ46‚94: †Š454: ˙˙˙˙˙Œ˙˙˙˙˙4-9„*/Ž-/*„9-/*Žƒ˙9„˙„9˙ƒ˙-„ѐ˙ф-˙у˙-„ѐ˙ф-˙у˙-„ѐ˙„-…˙û†˙ƒ˙-„Ñ„˙{ˆ„-„˙û‡ƒ˙-„Ñ„˙-…˙Ƀ˙-„Ñ„˙-…˙ĵ‰{ƒ˙-„Ñ„˙{ˆ„-„˙û‡°6‘˙-„ѐ˙„-…˙û†˙°-‘˙-„ѐ˙ф-˙Ѱ-‘˙-„ѐ˙ф-˙Ѱ-…˙ûˆ˙-„ѐ˙„6ˆ˙ûƒ˙Ѱ-„˙û‚{ƒ˙-„Ñ„˙{ˆ…ˆû‚˙Ѱ-…˙‚ƒ˙-„Ñ„˙ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€4‚-/*„9-4‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€Ž„˙„9ƒ˙Ž‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙€„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„Ñ„˙{€{„˙ф-ƒ˙‚ƒ˙Ѱ-…˙‚ƒ˙-„ѐ˙ф-ƒ˙t‚ƒ˙Ѱ-…˙‚{ƒ˙-„ѐ˙ф-ƒ˙żt€{ƒ˙Ѱ-„˙ŭ.€-–ƒ˙-„ѐ˙ф-˙Ѱ-‘˙-„ѐ˙ф-˙Ѱ-‘˙-„ѐ˙ф-˙Ѱ-‘˙-„ѐ˙ф-˙Ѱ-‘˙-„ѐ˙ф-˙Ѱ9‘˙9„˙„9˙°9-9„*/Ž-/*„9-/*˙˙˙˙˙˙˙´hߘÑ*…*Ñßh€*‚Ñ×Ĥƒš˙/…/ƒ˙ƒ€/„˙ך˙-…-ƒ˙€-„˙Ñš˙-…-ƒ˙€-„˙Ñš˙-…-ƒ˙€-„˙Ñ„˙èÊÑÏԃ˙èÊÑÑÏԂ˙-…-ƒ˙€-„˙Ñ„˙p€ƒ˙p‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙€-„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙p€„˙Ñ„˙€-ƒ˙-‚˙-…-ƒ˙èÊÑÏԄ˙Ñ„˙€-ƒ˙-‚˙-…-˙Ñ„˙€-ƒ˙-‚˙-…-˙Ñ„˙€-ƒ˙-‚˙-…-˙Ñ„˙€-ƒ˙-‚˙-…-˙Ñ„˙€-ƒ˙-‚˙-…-˙Ñ„˙€-ƒ˙-‚˙-…-˙ÑŠ„˙Š€4ƒ˙Ё4‚˙4…4˙ßÂ?Š‚Š?€ށŠ?Ž€Ž…Žƒh˙˙˙˙Èš…ŽÂœ˙6„˙6œ˙-„я˙-œ˙-„я˙-œ˙-„я˙6œ˙-„Ñ„˙{†ƒ˙Ô-'X„˙ŭ.€-–ƒ˙-„Ñ„˙̓˙π'…˙‚{ƒ˙-„Ñ„˙̓˙р-…˙‚ƒ˙-„Ñ„˙{†ƒ˙р-…˙‚ƒ˙-„я˙6ƒ˙р-…˙‚ƒ˙-„я˙-ƒ˙р-…˙‚ƒ˙-„я˙-ƒ˙р-…˙‚ƒ˙-„я˙6ƒ˙р-…˙‚ƒ˙-„Ñ„˙{†ƒ˙р-…˙‚ƒ˙-„Ñ„˙̓˙р-…˙‚ƒ˙-„Ñ„˙̓˙р-…˙‚ƒ˙-„Ñ„˙†ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒƒ˙6ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙€ƒ˙-ƒ˙р-…˙‚ƒ˙-„Ñ„˙{€{ƒ˙-ƒ˙р-…˙‚ƒ˙-„я˙-ƒ˙р-…˙‚ƒ˙-„ӏ˙-ƒ˙р-…˙‚ƒ˙-„˙-ƒ˙р-…˙‚ƒ˙-„ĠŽ˙-ƒ˙߀4…˙‚Šƒ˙4†×˙4ƒƒh€Žƒƒ‚?ЁŽ†€‹Ž˙˙˙˙˙Œt8mk@Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙-Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙'Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙X'---------4Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŽÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙*/-----------.ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ic08^E jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2c˙O˙Q2˙R ˙\ PXX`XX`XX`XXXPPX˙dKakadu-v5.2.1˙ ]X˙“ÏÁ ֘ċx8ÒLñr‚‡ÖüíèĞë8ÄÚh+ĵíóÛÒ?ó²UCœéëġšĠ–žw‰/Ÿ}j>oĜD6Aö^ÇÚnEß ~   b ÇÜ.†9u?~•ÂÍÀBálctȸe$PĉEÂ9$˜Óĝ Ž4y˜ÊÊÀ:€{§è•½É.ëî™yŬœèÏÁkÑóêÎP)êŽÇÊ´8\´0÷”H‡ž(q*˜Ĵ…)ÁİSž˘|Ĉ$']Żaüc?…üu}ÀAîĤyİ›˜w‚aÏÍ?È~ ħ³6˜#­˘ƒ5·C„ġá,ö$ÁOÖ*k H—ÎDĴ3™Ġ €Œ5ğ+ıP}0÷µóíı-—'/K)ö)şL÷Ú£ŝÉéóĉӇĵ ìtîu˘j.FÏ`ŠÔPp­ T‰²CĦˆpÔ*Xİ-Ĥ³•“ZY3Ĉ×ŜÀJé¨úí$FiŸRßq‚  Ê,‚(Ĵ2&aßóĊPŜĊĜĦÒNĴ\N~™fâ(aeÇà]€ì? Àf–Q—5ĝïŜe%…9Ċ9hm}3Ê\ĴϑR™w "ä7c‡ Ó¸–z˙†îüz-RVÈĝɄ+üR½iàLÛg£H+0YZD+4Ád3è£N9Üş>³^Ñŝ§w•ìŬÇáZÏÎĦ‡áK€ ÇĠSˆ!SÑÛñĈQy ˆc:­×+c5>A?=X>OèìIiŜíör£”…í“(|á5pŒÔl 9KŜù$›c0àƒŝdħK^Â$f(SP8:qdġJİLáXŜÑßÜ`BŸ…Ë_‰€7’öñldƒkیŬtş'8kÊïÖXĥà³Ŝ霄 +b€g0vȑZĊ5=LC:ÍrĜálĉ2-[Ì4{ŭuĴÀW•˘gykËE#`·’Äĝ§ŭöd"i“è\‰êzk­)ħžk!Zßj˜€÷ħ„fŭĴ¸ÍY™Ĥ<Ì>ˆĉôˆ…â#× ÛÙ´µÍEq…gBŻŬ˘Äyx!$ĥžV)èmϸLW =k$ïéjï_•ŭÑ[œ„ŽsĠ7H"îígjä[ÎuĦ+›ÜıŸbG: P°:2nŝżà8/‡+.¸AsЃ½)ĉÙ_­"/OŠv:GŸ>&/0Ä÷ 8óqbûÌé˜u*m ƒBrpuèVÎħHÜDí™RaÁUĦñŽJêÌ 9ĥvÇż’;Ôı·drĊEŞ`˜˜àġ÷úF`wÎç[ïB~ġ3\UFĴQû FÄoÎicbK}ŝÊ̳_1ÍŻ6¤šdŬûÇáOGáEĦ€’L²şbíĴs§öèd]v& }cıŽıY£äà–Ú÷İ<Ò£ž‚98Îa%ñ8yÍ ˆġÉFï=(òIŬ3íX>Bv“"eï .kxŞ:#\wâÈHz`âIÖZ56ß Ĵ&’OêÛ+Áh'ëĜùöqiÜp PȒ­’—c“á¤Q¸Q<#â ŬÔô‡sT‘#ŸêĈ…Vˆ•(£úğHÒc–ŞYĠ¸é Fä62üWùôL|ñ™sCìÂ(¤ÑLf†sâtşßûNè™u)âW+•TĈ6k,ċ5)‚068ë(Ĉ€}Ç˙/D…T È‡Ğ]GniÒ5ótİä`Ñ`/ç]ŬAĵ‘›yÉFpgÇà,i ëÜuiLž"UW‘èóşÖ˜eżER§d%ñûżĈ)dMhY–}²ğŝÀÇHrV·ŒÔÖ&×sӋĉ×n_‹/–cÁi~'Ħ˙HZ ,nqVÑâ3ݜ/)Ʌ^07[Ŭéfšr'kı•Ò}\³ìT: ğ`m_¤Ŭ€šŭŜnĤ?~µ èÚfz%ĦħŻÈÑçCt9ЧŞÇáĝkœnĞ€<ŽxÄúË\kŽĈFž&wìPÒ „ËEô/ÍíO­*TË´ò„*“0FżR@Y‹"ïŞŠTbïʔÉm VŝP½›‰ Ú.Ĵ!´Ĉ$^¤4É<ŠÌá_ĵ_!Ñ4BëӉIä+´-ĝ Ú§^íB%PŒzXş& Ÿ›Ž‰À”ÀcvÄ26-›À]D›ŽÁÛŒWÔ˙l.çwó•&ğÁÏPApĊ7r§²½İĦĥ[%÷˙/êĈ’kŭ4Ġ;B¸ğpC’ŜUsżPEeÛ8şÑIލ&Ž#´+£À(Äׁşm yŜj÷–¤l² KÏ2ÔäBœ*[܉ÊcŭeQîMô}0NCT˘ëCj,Ħİä ]Ċ vĠ‡€ĴÒ(Cı•ŝġ!^s ÊĉážİÙYcÏ(háäÊÂuaĝ}XîL4!ÛÏÙÇXMun,uj·İ^£NĈıq‡›Ŝ†ĵş^oĥH‘ċ_3cn²MâڕÄ$7ŝŭcœ·rYġ&ZäN<™×÷Ĥöu_ŝż8Ŝ‚ġ˙WÏTŸĠ‹gE5PS:Ô #ÎFíü¸ Y[K°.½•·Ŭ (Ñ$z™Ä‰Çε—êg<ɳEòŽ\)(H–ŻiĝŽ’HŭyTíbŞÀ#cġ–NFéžúż×6ş˙ x›hX{OPïäñZŽ™V™ Ğ1•àï3Á!Ï`œ`™ö!^÷E)Nä] ×ŭ/zĤkè²lrĊ]/W]‚ï“çÀÎH)ññ6ú*4f˜ŭ;+¤[KùŸ z­%Œğô7Ê FCx;‘Ñ4h×CŬy{& żÑ'Q9ïKÊ[fm ‚%AÜÀvàŠé'9QŝxŝGOè­ż%|zR#ݰŽİUX‡/×Á˜ŬJ4üq¤˘ıX1„@&h#6Ì9;F_+bİóV³ožUR {à•¨(†›#*]Í˜§5ZĦïË2'0‰ JVŭŬ½îŭ<ÔÒwf³+¸’„=t“?J:DЍRmfÓ·D:ş]ZS_Ì4ríڈ}ş•êÒ°ÑÖ~=Òd%Ä/ž"áj¨#9íÏk ”ä&•*MĜ|ÌħV)ûòêcĥThÉĜÁH|ĉ‡?]ó YŻÂf%Ö²!Ö:ċ‚“g˜Žˆ•Żñàít%ÎŻ-ñìÙϤÉtù:j.äÙ,SĜŝC"eàÒ3?ı¤b&˙y?v Y×ÈQAQ¸KÌ<€ìÖkşDÙ+JJ%5;ş ĜVL?Ο|Vܳ< ˜ÎËùpH…î4Ħhq#ÊŝŒ´şò8Ħ4XŽÛÓèn’n2JĵÌ2ˆœÌôó,Ĥ·k~yLô(öY)îŻ}™–^ŒÚì‚H½rә§ŸµCÂôšŻf€öVñb‡iJP|Ĥ‚‡ûZĊ˘ÛmÑ{˙%ıl–$vM*ÎĞjV‘KX1p§Ê#˘§2’,iâ4AlżW<Ġa½Ğ‰U˘eq;p´b1ËËíŽ<÷òê£s Ï µp•hàÍL¨Öż1âôĝ÷Yƒ3  ŞÇ£ ¸,$q}L+Ĥ½ı“€§Û(,œ´Ż+. üŻMġÒpWĜ½’6eeqoôÉK–Ïït ô‰âUG°É n!pJ>1BĊ‰™ĈÁ5Š]gïš&Y£ ŸK8t ì4 Ż@‡RşĴóÄ·.S#ğ]Dìy‘+@Ş´1Ìs‹ñÈ9Ó–÷Ï"óP3-òV}£]Š˘çŻAmgoĴk#+ĞɕZ°Äê áNƒ5‹bË·tlĤĵv *˜G)êUÔè° ñ AĠ #)è‹g#ädò€À ƒ57 i%„Ñê‹3Î Ş‹˘Ê¸ÀÈ`}jqŠéùû ޳ö…Y \q_œv÷sπ‹Ž‚SP9ä´ż›âċ¨•òrœûża­ôp&Qßڔ_“^ñgÊÁ#C”à%H‰Ż4IŻIĤ ·<³K`WŻŬ3L2µÒ˘1Jrğ³˙>ŝ{uŒá°ÌÙ`ĜrÑ_äú?)É aáĵWÉèj—VkU8Ü˙G#Ô †Ŭ4Ó!Ëtx³Îĕ@œÜÁÉAĜĊžäµ–ĥž_Ru fq³‘|E™YyżL5ÓÜSR§v]ù?fŽTÛF‡ĤËĜjê˙I>ܳ`c!k²Ht˜6Ğ|CHeFWè 5ÙkܵŒ>'™dĴšeh ¸Ż#bŠîñQóBñ[R27RL†ıûcrĥ·Ŭ •0'ñLŒè—²Ŝ[L-`ĈÀÍtÄı†| é£ú€q3ŭZĤ!`Œp|X[áŠhÚ(/0î•G]ŽQ°m >Xo°‡3ïHêĦüÓäiÖSGàûġœŽÇ4ħ’—âcÙ^ÎĤvĉ‡ƒNfk,ÒàM¤qdÀŜ ípÒÀM \iħÁÁԟĉßͤ÷pɐ_kżòí çtWKBJm>ŻLĦg1çöżÍÜ{£„ƒJƒqÈô”…ş{a°ş|8Ïn˘GâħĴìó;ÂOHŝħğ ìu¸`ğLŜÜUñıƒ†`ñT:ÎíHv8ïŬ„Àß_÷ÌwL¤wĵü@ñOòéó¤.ú…v‰jjħ[ïŽü\Ÿ¸j ĝü‚WX—^Ĝ­½\#P Nù߂ĠĠv4¤_SĊ(ƒ5[‚_^”gÔŜ˘Ô@Ä/Œ ½P)3ù?ò>Çĥşĝb‘6¨•aÇ7D5?ÔÓ7Ħ@Ş}H„‰ˆÚÒxġ‰+Ġ÷#Pù¸×VfSì.ùËqĵıv×xˆӅ|Ü {Wɞ#À™ÀÒ\TQZÁ ރì#ş7ƒÛ(Až~Ó hü;²GŭŽĴĠÚyĝ&Dé° ‚ÓJv˜ *:"íÈDÇáAGàyÚdßĜÛTçSQ‰›1¨ĝ_´Ë˜ˆP!ŝş6 L?ŠL˙ ĤŒĦÓe̙qTßYF÷œòBħ[KĞn¤ <Öĝı­×ÍäĤœ·˘G”~&f„…ö…2%ÖĜÚ:RŞ/w£öœ¨FġzOÛE×IS×O9SL‘{G³$ìI>è(èĈĝ£”ßìÖ¸pëyPêœr4‚Àöżv˜G&*İíjìú-kŝe31$[:‘ı×t_µFÓäùtúmŞ!–ê1JŸÊúêĜĵš^Ó $nĴb‡f(Qg/ä *R°‡ğÇáŜ´>Ŝĵ`úşŒĵa­5…šsÁ4d×E• Yò%ĦĠĤĠ²ÁKBşÇ9Ì …!}³´[9ż 'wôF3ÈM)f‚rrĞNÚġĞFŭĤ(ÍĦúĵğ·bSÁeùÙù„Żi+•ÁlÓ}&&o>‰˙?Ü\•×SĦĵ u²­Ĵİ3ÊPÔêg~“íĜ° H…ïġ íğ‘Ċ¨İàùäëħšß“Sž˘5s#,üÓQ¨Sħ´Ş…ı·;ċHúGĠ ,ĵQ€QÈi§ÎVg_Ç>ı"˜rzƒ:Jê!,£I44z¨ÊĤ£ìä‡xÉPL¨Ş8ş_¨rĉޝ.ĝ„ÔìlČQ*Ña‹D€…Hˆ”ĝ ž0yIʟÙ)ÌÍ’L­GM?xH?İHϳSİ.„r’Y&™ )MÒîj ³‡]¤ş+¸ceQ Z¤wÎ]ÓħD:JiŝGLšÄ$ú‹é½3˙G½…uÍᢿ-O‡48ĝ;Ĉ”û,xœ ŝ á¤à‹°Lı•L."^Ï.!bÔɟ\ižeSĝl™R̎ ™ĉX,§^O[ĥZĴá3D]QšTÇCƒ\fİ{ÚIġ°Ò-+„Ú{lü sLkŬ­_nPó+ ^ÓkÖ7tA(xµñž”fN\á‹ĉo…xóüşíż“y½<^Ÿ{jÊe! 0äŬ͌@Ĝ`Púràyv6F1sùÌ áûÖ v÷~˜9-•SâuÏŸĉ§êż˘šİrû2J3^´?Í_™  ıpÖXÒ´w!‚%3mK3ëùĥž‰ôlĊöfïYĜ_|áp¤·3FŝL-Ht‹€0µ zRÔ:żös™2{ÖĥO¨v/X•¸Í"@üçpwÈlgkw˙z8s¤ıżêš˜NŬr7÷\nmZàJ9÷è¤oŸ.A1ìKğ)V+,ôŠızžŽP6°û}÷"p†îI“ıÔd¤Z0v´ Ê'!wì…Ŭy½÷‡—&]’sjˆXAZGĵ¨G´²bĥ÷˘BypɇC Ċ_O|Tƒ_bwÒfL!Wh _Wĵk™Ô}áäĈVĠòïAşĥp™g÷ ïĤ޵‘ê£íµwÉĜV9ó1%°2Hn%Ë +ĝħ^›ŸÓƒçŻä'ç˙iĜ…8ˆ ŝHWVĤQ¨ö P‹”–PĊŒßy,âÑ;ĵ G‹uĝĝn‘(ó nXÙ!‰~S‘fiĥ¤!Ÿ¤{Ô fÍÌck+’’3ċËÄaB%ġÒ¤à븜ŭüGŠ´¨I’É £ġûĞñòĤŬ­cOĥîħEĞ,ìŠûoFˆ ÛU“ÉÖ>ÎĠCHÜ/×Y2Š›çëĕûBížZħ]ĥP;•Ç“„ÜS _eH1 ïż%wŬĝ ġu†xĴÈqû½>> ',H)•ħLeĠ§;·>ˆ¤§œcÛl9›­úéuy&šŠÄLЇpçÀƒMÒ-kââÌħÏ9qħĠZ^0Ú˙ĤQì 4ïâÊV*·)NßÖa.œR. CŻ'ßYh‹ùË­-ö#纖ġœJyDLÜ;az,êĠ/Ġaŝž]*7'.úĈTwAıŽŸ|8U#!1Tc½gÊxÜȸò-6à8Y˙^Pt‚< E˘†%_òl%mĊ§ü(DC¤úe1­òIVq‹ôcêT²p: =Qdat5†ùë`Ñ :Os!+aI1ĥl1&퀷4–Tş`DŽv/íî6oU}]5ó …MKTJPìçtOgzÂ@a=N´X£¨½ñĠĦƒ%×-Z‰`’? 0)<ÁA†ÄœœdÛÓ@_áFódteğ3Ídż@×8°.{Ġ YÄ=Żğ7(d!IY8ƒ:?ùÔ H û@ wŒ¨!w\ş’|ÏÓèí Lş”ûÄ#÷îS__8Ĉù´]ÜT¤G˘fŞÛC÷ÊġԊşŬ*AF‘4*ŽmMĵ!‘ôrĠl÷ĴÓÚé =Î>B­òp9"z¸êÓ =YTÍ+гŸ2Ôdž‡8khÔÍŭÇjóäŒSDZ™çy(ĝ D<µzĊ ä‚MŸ&B aĵĜ›mAµ]½nµPüİÑö}àŠažœħJ3s¸ôŬ_ßiE×$ş•o­~ğ•}ÚÌïĴô$ ˆaÎàÖ/ŠPeË żz]O]à;ħu}éĜžpË9ôxñħucŜá2™‡Yk^"”:H$ĦÎŭR<:sħJ÷ŻŞtÉğ½nSc<‹µĴHà 3§p'A™M™eê‡HsRuĝë0|&@½w5Ú˙#%äd hßû’pñĉ&í™|o#‡•7ĝLĞRHäÌs-ž*Ĝ\ĥ  „xVrÀhıÀ£!wuÊLżÔ Ħ¸DŬ~ż¨ŝÇl`χ™èj¸°Ĥ0@ùfnÛ:ħİŸXLĤŠwÇm¤°Œëä)GĦ{ħ 'd”9ĠËê­b˘˙7sż…éŻıbƒJ Ác€òNİšC:âgW ˘Ŝ6Ġĵ.&‡2Ġ´=krU —¸xŭkÈÒAı6JÎygĈCn6Ážöĉb˘eĜHƒJEïeJHX/ß ÜÁŬ9Ħˆĉ}]Ô½#ĴÇWœûN5Î {9Ĵ5B\¨6™ğŜëÑü]àBMA5Z?FL”°r‘‰Ÿn3|ŸüÓ"ëS ˆ= 4_˘ĈN?;"˙f+é́Lq[q)Cĥħn™BOĵs3Ž€•Óö>Ïw†=–.[mż! ²^_"Í÷3E"e­Je“0şi‡„AZ{ÂÀRZ/:òqĥ=Ç£v,Ħĝ }ż…ĠbÂŝĊÂeŬ [°·v¸Äžµâ:İW0ZĴ6ŬI¨žû&'" $ĥy9ç€ċĞ=Öaĥe›ƒ.,Khc|êËĦM!Lö”no`İĦÁ—İ }œ÷+,˜ƒ^-#mBµÒâĠDÈÄ[ÇNY`îħKÈpž“ŻUÖRö›r˜ÂÇBĈŠ Ŝñ7‡ p( e§Ĝ›‡ùHÎ>é ĜG;mċ&ϊRġ~⑈Ħó`kÉa‚xñ;e-àÙ³Ÿ9-ÄtŽÊ`+½úNżXcŽ ­@ĝ—KŬ­•Ĵ²ÎŬT/èùs£¨l˘NŭQÂ#G!P1ύҌúż×e‘k)“a·-GE Áû†Î‹=>2"{ż “3vš2KeŸldY–ìçĜšœâÑÀüfž³5}—5™Ċk!˜ L8ħ=9òÌż…ëöĤ¸É­/˙M„ÜJ˜ëšŠ‘Ñ {…ġĞçıo²ÍnìN €'0mNqĝy˙@*8 KC˜ˆŞĵG`¸'ı~ÄpÇ[•@£7ÂÒÀN…}B÷öĴRÌÍ{šÌk p…,.²;˘ƒġFd‹÷Sê&İӝö'2xsS?ĤġtâĉQ+éĞ£ŞÓİb n(LFš•JLûë5ŝ0¸HCŽ#‘o¤ˆí‰¨LµóÚòáĥš\ċ:ëĤèëJLşlUĞN切HUŠó^( ën[v˘3g,×y-‚Ì–ŬSä ˙Âo*ú²…oš^Éˆb÷ÉÒ¤"lĈ$`"ŠKŒ'!&p¨Fü‹%ĵ•M[z}˜Qê!Ì8”ĥ2‹´Œ#.òŝ=µt–ĥÑ~›ùFBI™—=žT‡œ´‚Y$•˜ ˙WÈ˘·éž S'ıèOĝùÏĦ§Èj3ÊQԁŻÁÇżíİŝ|ğ<Ĵ–`ƒmP ĠŜĉ*DŠCà“{œGKsǀ>•µ iĝV˙ ?ĉtl˜g,×àQ NÓ3Ô~)B 2˜³„-vv^ÌÏ\—JÓ{éä/ŽBÈuŜژJŒût &o {QĴ[ô:1(„Vn3¤żIäÓyP²Û|³¸à=÷KsÇ×*äBY~lÊĴÒ@žŝd²#b|ìĦàóiPŸ]E_ób—¸?ûÜsğçí´•.:ˆ°6³|~ j-ŒPùìjFiä„!–ğCĥ.)ĈÌ÷`(‚Œ°Û€8Ή¨Üù߂•EJĵ3F+°JÀ>e`ú“ĝ}ċ{²ƒNµD—ùÔ#ŠĈr$9ÔèalfBĊĵö ¤ÓôÇc{ôT?}یûİ$ ?'ù`ŞĴ™rmI×5*úU³/ĜÁóDŠÙ´áı’°.ÍÜÂ×Iżvċ^ƒġs4ü씁UA!ôĥFWNíìaıH l°‚ç4‡é]uŭFÛ7+Y?Ĵìg}÷_Ŝ™E‚G"|{Żĝİ>0›=2’µ,'r`+ˆWkƒàżË˜SĤ rĤš^Ĵòtfë„ÍÄ|÷z7*Š)3­Šü€Ú`Cy2K…ŒŻxÁVV 'Zאh7²]ŬωĞÖŝn@YâlçuĊjÖ˘H†ĉRö;żWÇO£³÷o™o"DTy  Pl/Uёî!Ĵ×],2žê;”qOŝJIġş¤4¨D}cjŝHÛ›Ž–\À‹š´8ç ‚:@oYہ2MñĜußÙmɧ2•ĊQùp}…4쨚a{:ĝ×ÂĤ‰?ß aŽèöÖw }(ŝĴF>C…Òvħ>LpÂ˙Zħ|ĉàšÚÖ˙JꗂĥŝÊù€Ùû(c§ßO—]ĥ9…`ĝL{‹Q²:òÉáYÒŬġŝ ñiÉHÇM.6€hÜŻ–Ïa_–NšŞ$%"ògq™ĥ£s­â÷n°Ŝ‚Ż˜Ä6"£„ĤáZ,WbÜĝíĵ߈†)P† TÂúiiIP/Úß=aÌmn‡+ Qxċċ&ÉĊ‘Žú§AnÛJ´b{ÂXQ‘_@½cô'µ÷%Ŭ“q“yo6ĵ‹´Šz$Yò' ÷3³ħß6ĵÌĈšËnĵ÷FġùV6ğï°Î §¸(÷o|UaÄVYĉôîÒM‰eŝX˘<ÊQ6 QŜĵëĤO5TAÇN„iê.Uä&WY³É%LıdEDġ#xÁË͸Ĝˆ!,nĤ…Ŭĉ #ü…cßzÌ÷ö€nx¸>¸Ì|G˙{Í Èğ N.Ĥ|÷ÏÑäwo,ŜI<}Q?-ŒñÄ ›ñ_^Òöĥìĥ'’Ĵ”?¸F%ꀳ d#‘5Ħ–ŝ$ĊA>x„ì°lN 3;Ż­ŬZĦòeŻmżt­Ác­n;tT4B—3ĵ ŭWĜ%8ô:;^DÄ —ç§­ĞcCë: җZĴèY+9*'•¸ `gGë"’‰U§ŸÒ´~)m‰1¨—†hMkÎŭğ·)5€ä pûĵ´@cKƒRħ3ĚiUhôXı½×Y{Ġ3/œ½&‘QA7âA•g#q×Ñ2ô8@ĴşqĤIħ…°›h8‹À)Lj‡Ô£éâ8úŭäŜ­ĜQ1—„ñïöŽƒĦì 3ĜBcéKXÉmĊĴ9Ônw _dsOŝ‹Ybä*!iħ"A­ßݍìRµü.Çàï`úܤ|Ŭ˙_h;v 1¤°_Ş>˘ı¸·XeF˙YCqDàÈüxì84ßŜí³ÚŸgÏĉ(ÌÒSZĦ|rX”ŬÇáJGàħ´Ô#\kž?úzí0[éŭÏ9‰·yʃ.Ѳ95kR„€ '•Ĵ1l ݰĜkÛ?„ñ …³!ĴŽp…mHHEwÑċ–ößVĞßB pzc)yM“! öäì§êcX*ĝ ÷IÖŭ…ŬÑ×)yLEÎJÙ\ʤ£4I'%ġTN5Œċ4%hŒ˘<„şgÍ-ĴeôSĤo˜žÓ QBž‰ğ•*Á@ĊC’BŸž9m£Ġdc%Ô´Ù[?RĞV ĈÜfrzdb2Jk|{ä ïBĠŭRAħo¨Ŭ 9™Î(^œA„ >ž*ç6EÚI'c²ŭo{QÍÌĉqŜç$9ñ"—C³…1mM6Û\µöġkûu_öí§íŬĴ~Ŝˆn—~Ŭŭş×…ġmMġ]Ġp~Ŭ œâ2/.ìFZİ‚Y µuß× öŝÛ ¸œ<~(’µœLA/ĉ ]{w÷*ĵùÄŭ ^KÚx6ó%~”˙;"| ĤöÊ8³Êk)ĴÚÀ"Mxy[ñ‰~òĴMµ*ùms>³\’#ŭThÊ|sĉëĉ T5|Œ·İĵħ ËÑÂMÔïıJœeŞáĥúmŸ„ôtDü_]‹£Çˍe@|ĉĈŒ§Í6ÚŬ#öŭ~’^˙|uF;~&{! üg½OÌ1%'Ż2@—ĥ˘6ox6ä~³m‰‹íĠ.ÙEĵäŞŭŸ:Û$Ëvç6ĉjH·ŠFu§Ŝ-}(jÔb'ïwWòykŞAjfÙ-ŝfeĞ Kğm5l]T렏zŒ¤´IŞ&äƒ`")ÁŝÔ­—x¨ĜS% ,>Cu6tûGê‰Ġ5ğ”›Á˙Eŝ!yÂYTÌäfBŒ¨$?#ŠĵċD-ŜL<°ÌPbêĥÁS „*²ĉ·›Ċሣ¤7üTĜcPUin˜‰´<:3Ħ4‚ôÚ" •hċİô ĝ+1Y÷ʀàkŸc3JüĈSëc”Sş ätj䐲Zß˙6hHW*@Äw1}~ Ŭ˙wwPĤĊĈĵĤ- ‹€o{‘jk`Y÷·_•¨î?nDĴÌ"£5uFħC‰Y1ĝyƒŝĥéà3§ù`’LÖJ˘jĝ7_3V>WkÂŜá8D…] ÷ ÎjŜÊï Úcğꕊá*”]úVBD,9§š$Ŭì•4óï{\\N{ÍîċġxjèL˜8é¸;0˙6yÍ €@D‹GXĊŭÍўĜûTJñ)‡TòéFœĈcC÷µ4 YtfZ“ĞŸÎ÷Nîĥ“]ú ¤x‚¸ ĠMVŠ´݈PNjYç­`Ëê(mÁ5GrìK¸ ¨ƒÏJÙ)\w^ŭ_g“LÀÛ:ê­ ĴSR÷ĤÈ4˙uPClB½F˘ÉDo'ZO ĞœwĐ%³ŭ(ZŜ-İ•ĉu3%ür\19Q=uH¨Ôıû„Îԅ¤¤AŬÖhÉ÷ ]×p麈÷żŜ¤rA˙ ˙.ƒÇ„ܧÛQ”Ä£ÇĉV¸Gŝ£ryđ1Œ*5GŜ§gg~àŠ_’§ĥƒúˆÈ‘ŝ°¸6³‡v% ĵĵ§U°ü°?…‚Ê ŭ™´1mċÙP:;è¨áğċ'ÇY…Û”aR<¸ĞÚj……“šŭÉÍwŻĝĉħN_·Âôe~h[~¨Ħ "ù2Ŭşş_Ĉ=ˆŜ‡Q'¨Ü"½e’v"eÙ3MxF7,ĴPŽMħĈë£˘àž^ka˙w•=JJB“(§½Ûż‘Ħx6óï4Žöìt˙ ,aȇe(ÉÁ¸ËÏt9–SħŞ{”™íyQĴ9.Š+ŭvş*ċS­žF÷_¨ÒÊ.ĥ S ê4 ċŭ+Ŭ4µŸ"şZ>èD#ybÉŞ£¨?ie z‘ì*ŭ mѸ3GŒB›†ZspJ÷›ĉ{Ğ=SŝoŒTKd†Ĉ¤q* “ğµS Ï(Ñ-£ŝ¨Hkêò"Kùßzċ̎‹Êïĥ7ĠpÇ´ĉÊ èĥ\üAO˘ ‰P’K -ñÛÁĉcş¨°Ġ }w) ÓħH'é~"Üä ŝOmi H5A^öçĥglGB>³$—Ï-ìÇĈsKJUÒĦ³{h·o 7µÁnżŻàŭur÷לŸÄĠF&“]IVHd," ÖSh5EWyûB““[=AşĦ3·ápNÔşù‡Ú˜Ĉäöûïb<Ÿ†§‘Ğ/ô¤ŝĝòly!#ğĴn´ûHP{uĜ4Bù% ĤpšÜɜ¸‚â醰aşôÂċóoR{Ô:‰#8Lgş'–}`ÉüO•iÁ(Ô\Ȅġuј˘ùĉ_÷wrŭWàÛôıCĴ€°/‡•˙Ĝĥ ŒZ#(Eİ|“³K,#żfşmlG‘š‡ÖÌIžIħ ÉğżÂ‚ĵGÌ Î˜S9N‘?½ĊYI@—–ĵpà–;J6|–#^;A6Gƒ^N':Ħ„OϧL\ÚĈŠs4ħÒ_bÑı›şžÂÊ=tT&-îyˆ €ÚF÷LĠDX³!˘6™X(]y˜ôÎĝ(pžGBìop‘!ß+Ô*2ÂïY ^"ıôëzġĜ­ä´*ÑĥĠq:â-kZ)§fF´•˙eĵR~ÈCú5g•­ YÛŭŝ._L@x‰èL$ɞLjb“1TœöoÚŜskÑ˘r· K›§%Ş>Œ‘èa•M—U*°_ r„­ *²ĊÔ²ğ—™ċĉkfŜo>¸@”ċĝ¸{?°Ž×Żâʞà€n֎†H=ÀNı€Ì Óà*Ò˕ôÚ£ċĉÜö‰xY)(nL˜~)IéK k´À€,pm\ƒEıÛ@ïr27ÂNrÀĤïáàx ġIĞR”5ôJgÒ€ĠW;%aDq2àˆŒIî„ÂëŸâè:Ħĝ=?fz“N"÷Èë§eĊhÏQE3ze֘­Aë.âw)˘5’ÏV6HJ1Fo˙:ú`Ɂ{dòWñš"#= ĝŝ6ʉ´àËÄHŞ!wî ÊŞËëÇt€„Äâ!z ˜ Eё•€°!‡üePí“ĉ:şċŽĴöÙû*Ѥ3[ŽêÍU Ôf¸Ègˆ1£’Ó@!j'ŻxL{ 'ĠìFáÒš˘§ĈYtó~ıŠùeóƒT—•˵ĊĦ‰€p˜`şXµ hrİ4:âE™aPĥ#[Ò0Ëì=gQOEDw˘ÌoÛ+/)3˜­ĤA­óÉRÈ[ÍÂuh/ĝó­ĦĞم4<Ó{¸İ×n%wĦț —?ɃÑGĞœĴѕAÜz#^#ŸÄĥglġĵÁĞfd|’‰Žü ï]=³sEEòÉQaŻı]\3˘ġA€f‘µW"ïŽ1­—™…;Úġn²â!îz(☆j,Os|-p EogòĊ£šċ{Ó­µ‹9ufbóë•,×êŠ] mğrwLYSY!D.€6­AI!Œ}ç% >NEs 䕓Aԃ| Ş˜I-m<˜x§"ё"˓Ê#›­ñĝ_~½ĝÇɤ-ĥËÇp}Ö`N8Ĥ]{Ò°ŸÚó…w\А‹tCm<1ëèÄÔ(Ğé7.ċµA†Ş§1Vl–QVŽ&vҊ'×lp‹ÀŽéD  œàdüe÷·[‹†•:{-;<„ŭÒ¤ŝjÓcQÂHMZ훋Â@d2MôôXN-ïħûE|ċT€G`aŻ$µĵÂğŽ÷êƒYĊ {˙[߆°û ™ Şdĵ˜ıEt'ĉܤKĞ„쟍VŞbÁğ“%–SğĊ°<%“SigĊp:`=Iñ.Ġ3ŬBF½ë=Ĥxħ=´ĊfŽ”`¸jÛ騕ä÷ĴäŞ>öÜ ÖÏփÑÑt‰LËl}èÏxùGŝä7­:e2 ¤Ĝ~ĞUƒÉkLŠ|£„ż†œ9K#ŝû‰l<b ġKŠò@ı˜ÁžKİaéÈ ÇçèçîOĦȆBk'Ĥˈ5}ż^ߨ¤G ·2Öۓ€~>^Žm‡ĊĞŻ‘áŭıKı^€!Ĵ/p…ŽÙ£ çÄŬ^îö˘¤ÈÉeċqc" 1j1#ÀċÉbVG?Ħ²GPµÁ{N™ĤW/Aô…–uwÔn…Y u}0h$öş-Ëú·.’‹8ŭ‰Oqg*ÄŞÈ+ĵFËĵ%'u,7ÛCöb$c=Imİ`Um gVÂ2OäN6ößVZ!@ÎÁxĈu°a2Cĉ1gDB îšşô tŽ$Ĵĥ>1Tc¤";_KŞ+b\eìÒt´½MŒYuè(nsuîvS$˘²âIûéù!Û8=Ŝ|•—”˜ÓqD|VVµĝħ@Â#?,{Ë.Ǔu€;‡ŝ)ÁˆàĊë1-Aû'yïVò}$ž£'ëuJLwU}D…êÍ4 |*˜’ĴaF˘Jîż lSówDşQksß2ÍǎˆĤħ(ù0ï<çE£rÇĵ>P4÷[ğɔ L •P”šîĤs J$ìÈ h=¨uUúX)ĥ`kÖħgıpÑÛÍJ;,jY³éb°ƒ‘ĥ|^ Çr£á/+D˘Ä‡…³b%Ġ m2YBıRšû.wïÏË|‚‡ĥcÜ4NŠ“*>Ĥú™rÑlĞhÏÚô,NĠ*ô¤ġ\˜ [úE²iúAJȚz{ŝ´2א1ĉ8E™¸–ÑııÙŻ?ÙĤTs@Ùró\Aw1BŬ÷ĂċPĴş>ŬMdŒé‚M\JŻiû{bŒî2ÒJjI·Lö˙vĴév›ë9„,›°äTšÖ‡+[œ'{àSCçé[ÊGÖYfY’l fĴár!sŠz#úŭUġµì°)/ùß³B–òuÁÒW‰é2u• ç0Z]OákÀÀïĥ?*(+ĉd ',gğÜñĥñ·}4V4Ënmˆ³Ġ§ġ†D0r˙†,›´'ĊYĊIaµ½É<[ğ½ÎünËO‰~g+;Iqë84_•JmˆvÂA| ¤VIâ-cGQñfp½­<‘¨ú†­Óì­L€Ô ĞSJŒá`4˙ooè|ݍ3aÄjÛġnPߑÚığ¸™×“ĈU˘ö*ìŒÀĠ0h:aİ vt•£äèlŻ^ñar}ÉïäG­*šJ”}…SóbE¸‘ž‡ô…šwòïĝ7I|“ĤugS…/ċŬÄ‚S˜ïDÇ żö£[ÒĦj - Ĉ‘Ù/ÓŬE˘…n½Ĝ‘÷D:RKO‚AZ%ÌğïËhċ}òȋĠ^8GÈz'Ş4,rr^~ި²R¸Ġ€âúşs­Kŭğ£ûw÷Ġğ×Ġ~~Ŭŭşñ„ùû>}}W§íÓ ïJƒ|_-˘ .-Èħ°ġĦC&ÓÁä$§p;³ÀsWÜ/‰Ó`"Oóç'z7Ì# +DAŞ*fġkŻAÁ 0…tNË9S'è‹ħġ=ûG @A+‚Ş7yf޽›„Qn#44żW˙jħ}š½•<+Ĉôf…-?Ŭ<ïPñßíÖ×P$Ϝ¤ż]ÀÙdÄş ¸˙Pí“ÁTRpr‡¤WġmĴú݇ĴËb7ĈàD³Fƒm.Îòϋ?É"ĴİLÍ ŝYIÂÎRŞŜ.~‡ ñŠCX7¨ÏbÔ˘ĈĦ²¸–tĥZíËÓĞ%5À{½a •¸ 9aYĊ^XäóRÁHÀ%;&1Ù0Ù\½'Ğc‡*Abĵ&Ô\Yò|#ÖÙ)ÓÍ#êŬtu6NA§WŸt(Íĝ´PLħ”6&Ü_aŸk⽐Ț´Ö§"'³†úĵ³ix\â›E îµRâÓÓSï{NG*”MY×Î FÚùmxçŜ³†ĥ­ŻÌI÷IBÖ.'súégÎ<éĥlR¤[şżAûĠGhÍ š½ B$kù²r^evL4‘ú,hµ:Ĉ :WI‡€W‰ç\ŽğNïv†Tdġ(>=ĝħáá}w’Rż;]}T(Òëüö×bï~e*Ŭq`5ˆvLIÉx%21ĦE¨ĵpXFu¤CÜÉÔä`bžG& ‘Ç—C<-ÇÇ1fĜ˘j×ÓòĦĈsÌèlŞ^Ħ şp9˘*†€íH­€ĵÊ›]Úеk”Súù´Íܒ½2h. ™@ġ/^òJfcÄëC.¨Z7R× 6&”ëÛq§xôn0£Cč5LÔŭĈ´Ë]pËâ“á됂(uêŜ•Z4´­MŬ*?‚ûJŜĉäϖn,DVĴPW ´PUġè·ëÈϐŝR­³E À¤J‘Èd— ¸ÛÏÏ.–Š>}¨áŭ£‡\•Œ]JÁÙR•zoŠúŝjS­=ŭıBp°F\Àcü ³´µRĤVPÓóċİ"‹64úoéû~-]*’²ŝ)iĝ°$äïÇÛ âHVĵ—í"N£nğ5McšĴ\áÑgórvÚÍt˙[C ¸û¤¤bµ{@˘ê*ĝîe˜ž°EĞ?éA“­ËŭŭÎS^+Q£(şg–ƒàwşċÖS݈½NÎd!8,‹êĝ_ĠqPÑê6°œÜuµÑr(ei+­ŸħaVM³ì9d ·G ³¨7$S/XYVû…›lĉÄ`ÔÌY/fV _Ġ° Yœo9ġs'î%ƒ×-.ÂÜM=6Z‚ß—êĠjaßOÒ}Ĉĕï´,á·öŝoĦ”–·É2V›Ŝ5kh²Òˆ²MĤn7˙OÔÏGÓĦ;´ï!ÖîqŞ ‹Oz~Wı£GÓ#Ĥ*ԗùw”fVŽXĈìı ˆ’œdĤĉOâ.˘ÒÈüMá½àr^Xò2",]ŜJnĊgÌÀ}˜Ŭ"Öe>×aÓDq_šùÌsL:R—Ol€â“=có÷²0&‰m”XĜyġa§°MßE5ħÑ˘5ûüiòN\ßDZ c•àŽ5Ó˙ar@j†nÊqŸş€ġĈŜàĜyuİê ĝ`>‡ˆP–mÀş2Ğâ C· ‹Ĵ§ŬX˜ú£E•ì~ĥOŬšòŝĠĈLI…(ĈùĉkQÌòd.BPŠl% ɜħğ?}Gœh9—•áċLQ/ïĊż TPѲ‰°ħ´, ƒ&âg‚¨È÷›“[ôĞĦĜâŸĈn ñ·œ…"!Żô`t:úШCêòżt Ï.Báôè~ ¨È$@ÒüŽ3òÈ^(5Ÿv–ĉY'KĈ£…L Î÷{2OüJ‰İ‚ĵ­F+ü JÜכÀȤG˜ÏôZ=o{@cóÚĉ>•`ŝʜÖ°2Á+ŜÌa‰;b fĤŬğĝF$$Ġ U|@=Ġŭ'ÖbĤ Zş$BüÔ JU–>ÌïñĤ~ŝV’ót² 3òÈÒucĜ™ŻÔŝ¸Ġ8Ljg |Dh˜œwŭ·ùuğ ²UE,*Eˆor× Y4°:QÒ+7Ğ6yÁ˘n];œŞÀšÛEO1M6F7ĤPߨéF.öÔşÛë–ĴL£A¤J4Pw5ż˜ÖV½šKmÀlš‚IçQ úúízÛXĤ–,ċ9á j…$ڗŒO³6CÁOĉhú~˂TÜ6´™2€·1†ä("üÈ ™‘ĜY NW˜ħ/ûkÄ~Ê$†€†mTŝ‹wµ-my|…šdîSòĤk²Ÿ‹ò™k{]ĞËù35óà ôSCû◠nż ïŜ•ö”Ë;Yh·İK°­ĵŻÀËİ-ŞĜE ÎĵÂLâÏÂ;&dżÀ—ÂĈaœTzĜ~”é³eµá#§Q.—wAy• È·u5îméÈϽ ”bŭ˙DĜĈ°”ÍÙ#E˜\BfJì·^† :SÛœ$Ûd}ğ°qş j Óŭa·f>Ĵ4]½Ş™˜•g"Ÿi ĊİÒŞsτ3 ˆP…=Ĥ˙e ,ÙIĊ~Ĥò×Sí§6 c|•~·Ħȧ°èñ{8·ÒżZÜIĈKġÂrDT!ïG"ß[g Z.ĵ“mŽèR.?mtSòá\¨˜ì,‰à ò2ġYDHèϙHÜĉŭO‘’ßİÔŝR0û1֍jY— iqòuq“Ñ˙ÒTašfùĤ"to`°& ĝb•ħܐqRÉŻĥSy&cHVe 1qÜwUe cԙv¤1yûóB/~;Ò"WŸäêPoü/{"Ú:BžÒÏ”É& †(ù÷Ĝ-Ùž3ÛfÁìĴA¤˙J G-Ò²vÓߪĜċ×P 2‰öîpnÖ#|nġÜZ‡Ü˘’ $u¤âv .’W$óJP‰š!#,£53HsĈċ´·Ħú>ĤëÄŞ¤ÓÇ';ó²2NġfX…LœF˙DRI÷‰‘FvL‡ÌnVPDU@!Úĉ`Ŝԏ.IgŜR—j( €HŽìs—ĥç™sğt/Ĉ*1°#Ĝ];?vcnY²^÷ĵPVU“ÌĈG:¤ıSQ[Q_Ğ2TñËl(Ày§C2Y6Öì=m,|-s@Njù·¨Aé_ŠëıÉDíÁöxväİ­s+â†i 2‚|Ü^6ÈgŸug9Eš‹n: ğğÄhbÒxl>ô}Żk:!—NûÁĊ£¨ÈlÎyN³PaóS 'P\Rü¨Ôxëúŝk8FŻO3ûâŠ?û–H߅ĴLq2êaÌ­§ĝ †yF êAxú'żƒ†Ê`Ÿ‹öğÚ >H&É(FfĞp£ğé’)ӘÉàaĞĊ.%ݰÖ]W8듉âŬX&½×ż·úñ“ ĦR6¤g8eßÚI´êŬLy§o„ŒӇ?% 0†˙SgáG6´È+! Š“ÀÔàoI0ĴgóµÀó¨YéŻ×Ú#@ŭ"bOmrA’?%†nÓkhî:!Žáit§GY~•žS½0 ×gô?êHóbÁ5„ĴRÒဋŝêEÓxŭ'wÌzrM& ÍġKĤˆÎB† ‰'GÖ€ezäÒ=½@ü7^N ħĜNÏPŠ/$Q‘X—µY0 ĝ“3–OiZ]oĵäÔċž4@(½‚µí{ ‹×ò£żWG´iùpÌ(+ƒ”ù˘5ġħuĴ".Mê3„fŸ‹&Gò|i`VÍ4³j0jċ§Vw2•P ›uÊ\MÍTÒÖ`Az7ĉ3ÁĤiAáĠ·k[âġ{hgëVÄߊ¤™Ïˆ2KÁ ÎGo ú-ĵè€l>v9ϵà'~9N C²ò0"ÎĴOĉcÊ£ÛÓÂ4áC S)ùv*Š8ŝ¤qjvÇgFQÑ‹ÇĈ}£ĜKgşò r–}%‡mCç#HY€Ó#¨Œ6f–ŜbĜÄâ’îYE\˘GaÇxS8nk?{ƒ%{Ġ5Fş‘àŻÒȅçˆ#ΎÙ0v !ÀıZ²Ÿéżĵ¤‚eÁÎRݰÚò_•ötĠċBUàŝq:ŝ `††áĦżxğïż°nùé aŝòğTD[žĦ¤´6öBî­HÜóé-ĊxxóĉQ7ċçáıh Ü0£‚§ìW˜´8[? ZûzÒ"zĝääc3·Vžşş ñ3Êò°oê\”ßÜËî{Ŝ’Ċĵ ‡R·#’NŜL4{Ŭôi6ÔW”û~²W´6XĝÖ Dƒ^ôŻÒëŞgÚ5³<ċğ)ó4@‚í-Ġ:ñoĴ“ÙÍè{8+ıvn$*Ĉ˜Ï’'ı)ƒ—r9ïQ­ ˙kipħŬï]­·ZÔIĉÍ}ĥƒĈkD˜€Ç!RĦÑ^* ċÍa3-ğDÍË#lŭ‚Ia–^ç! Ûìħz*7$%BᘤD,j½ÛOŝŞeÜ)˘Ĝ4k;óĦ%€É@NžÚ2ŽŒ×ĈÏjÓO™ÇyLíßħ] üŜ-%­CêÊĝMsŠŝ­Àfpë-JšÊĴY÷°\ıNu,‹˘9ù)5ĴÉVMü¸èWŽâ°Ê*³ ĵĞFg€Á&`•_]r#laÍ8á¸dö]ŭşċ²İ˙_lî˜çş,‹AÇhE1×íçĠíÑ"WÏÇDİ8&·+í÷rŸ ëž‚ì.Ÿ%sëkċ íñ d›¸834Ttĝ°Kí1m,C2Ĉ ĥìNœÛżıġœŻ&Ñ -c9ĥZmìÔÖĞfy,:o6 ÜR¤DUÙT×ÚŞ”!X˘ĴOa;еJbÀyy&Ŭw—ħ1‘—÷>ÀbOĦŒJ :(O È&ÌĤĵÛŞe6·0uëDÈ96GMNïE(4˙7m×>Ÿ·żB“÷•Gvû][ċZÂb2ÚĴu˙şörM>ĉ݇›uš)=ÇÔ]ħÜÉÒ1{ówĜìÖ?ÚKtüż}(Qİŝ¤óM.m;[‚ËڔâÓP”› ş#*w‹ 5ršUÊb‹La…ĵCI?EÑêöŬ­UÎs`˘È2ĝEb˜÷“°ü9żâv<ĝòù× —£Ì– 8Ÿ‹Kċh2†Ž'ó§ìêy`o²êŭ¨…\hWI{чùĦIċJ£ò(C+Ëìžj2§{‡D–ğEeGĠÌċµyF ĉU!#Çş³ÙŬıŸ½ĞŸöíĜŽ?i˜8 #†¸#!Uà?µw{fïW};À=ġwŜ¸÷·ŭô{콋ïz{èĉSŬ5‚a+ù´9e­ .qĦ³WMĤ Żü uh>Ry…¸ÊÛ#„†냒Ï#è ĝŽ.ùġ˘6£Ŭ%™$ykĠ€KLıûIo%Ċ$c×0w9?ꄓY°ZYê+Ôt›•cĉhc&²ÉI3QmS„}$ùŞo-á ›•\uàyâ„ë%QĥK3Ż fíˆĊ áۏLݎI—³ĤÙ.ùA€E~íeŸMKÄöÙb‡ġ †ĉ½X£ñ$DNZrfŞLĥ)[NԋĴöÛ>0‹ïÜۊıàI”‚Ċ–â²?nŒB‰j1 J6ˆ ĉ Ĥî÷*Éü›ĥy­y“8&%qUpŜÊĜxKÍ ÖL9Ï&ΑëêÜŻ„ĤÈSRùThv3щC…^ÍLÁ‡`Lb´ÏWFWQtJd–”£Ċ6*â?€/]- }Ż´–_ ŒÙ'ŠÓÏ#˘S'ĥn‚WA}ԀXÏ%l˸n¤Ô’é6Qž(ĴqHŜsùĵä>ѝ´Vîz[ô[Ŝ; àwœƒŞ·–oȵo´ĞŻĜ ’žĵ—ġC.ò:ÏjNXg61gÈӞ}Ŭ·R¨AÁ)ÎH&gb)TğäËÇG>xnÒ6çÁóókëTÜzËóUEm;5žxĥ–T‰Ü5­+¤ŬÎkûĦ÷o3H²Sn½kŸÛßôĥúĜ!ĊB;ñ_ŭ’¤o/¨ĤÚ5M]ÓĈ~ÑÈ9Özœë}!ĵ|tsà¤AħÉŞi ôĉñZNK˙nâ?.qIâÀeš·4÷Tħïz–f0eÂ)·OŻî⠊VƒÒĥ[ô‘UXei†òXŒyK@ŞwÈRVkD"ê˘3›‚1[ a’ Ô×Ñ5 +ğOv„_ėé@Ë$ÌĉÌĴ"Ĥñ™@-óML áÁve,6‚­ÇÖóǸ˜ïĤd•c˜°wjÛ$­Àİ·—S‹#‘2*AĴu ˆĤws$dHòùFx-“uf,}€@—dáœ43¨ô-™Ê]£A݇ ‚ìċnFú‚N–Ž <î‚/1sÌì H&ŞĞ,ƒ*òÎïžyïfXM*Ébşu y\GO´‰´|JĜ ­ÀŜ]o[Ó7rħ ‚+˜&‘™YFoı´ÈR~³>Ħ³ŬBz,ŠƒÁ0`,Ÿ‰_bnC‚"/jF„˘ÁNş.žM\X ô-ċÙè9 Ĵ‘2Û&Ĝ&ëƒĦ‚ħ³#<+‰-ĵĴNkç7ĜúP?ñŸ/\o8FİÄ4Gë,ÉÎòĜĉb›ˆ&GRwžBBÑ´h=0ñÔ_Ö,oeRgû£â†Ĉc-!Î`'ŸÚd„ )Qı²¤íp–˘m‰ôĥ–e…“~lÈ4’aĦ£r´ÒŠ|3³ĊŽÎ  X'#D?ğV""[w?0•ÇŬxްìğwÄ\Yo6˙~}‡­4߸ş¸§!כkMbzŒ <ƒ478S­tUΞġúdÓ^ĉĠ~–fà){³ÌóŬĥ* ˆÎ6òŭŻX[sˆÀ½à$*K?q&ú ^Ÿ¤¤„߀C_ıĉo‘Ç™vŭ²%ڏŠä ­˘Lí†à–·Sĵ(%JĠLF$0„FÓÙGKD‰Òq)~‚…¤1‚Ì_FáòŞ´Ŭ÷(T]£›üJÑê7§ÜĴ:À̲lNÜĝYšĜ;3‹z’%Ċ&íµÚÜi2Ÿ,ì…`#wĝƒûĜ¸½F6FLş31PŽÁcĦşò~*gE#4 >şŒ˜ġ›vZ>óŞğ+~´A6×Ù]’°ëĵzB} {ZË8-s‚‘Ï"G’­ Ĉ֍Ĩċ™cKxò9FĴXíFŭÁu›ÖP|CÖ0ú?ß+ViÒ¤&áƒz2‚:KĥiìµÂÏİëĥ‹\ôuú £°×”½½ÌiÔéŝÖ,ĠQËcèbÔ7M6ñÊĵ'6~­Ç E4gıŒêĤÚ*†Ç"ËKŻ•ìĊB3Ż’cbg½•ĊTjŝMĤ0á xbQêĤĉë?kKí6j-žUhĞéğò˜¸ŜñÈ˙VŻŜ{ÂëÀ†4Ĝċ)ûÂl4h<'> TP݌ڈŒ³ÖM×fëşÖïԌx`Çĝ΃ĤyÈHĜĊ[^ËGñ +ċ•ebN€ -ĴI‹MĥF&áô·ÄX£üxÉ,ÀŬOí üñ—\܉!EE AżÙÀż‹ùˆ _§e^{WŽEŒ¤@¤çD‹¨„!çvD ‹ÊŬTI§³dJûĥPí[¸‰PCJJ‘ZÂß“€âI)5gÉK.*t9İ·ġqóyŜVhĠŠÈş³IĦ0ǔXžLM–p¤éÚŻä/Is·Ç›‡\×í-ÇÛÓ{²£Âo ĤV˙uʙhżèĊ²zÀKhÄŜ@Ŝ b->’<=s*çżÊ›ySĤÇĴJ­ì*[ŜĈĥ°PâwׄxYkĦ#‰yc‘Ż'tAÑ>5YéŠA § O†ù!Íkï^ÉA›l;ɤGnр…Ü_½ûÄV†o dSÖVßĠ³1w5[²ÀCÖDúŸµË6p]ĝË6r[J, †`”œée*Ú0$˜ħI]ŒfñÚLßôıZMwNû€hoA:fjì¸1ĝZĠŒ‘ì,o.'àô´÷o%$g}lxPbÄ˙5Ĥ|şçÁ‚ˆ<÷…Ħ;x{Œm¸_.€‹w¨‘Œ;XûF3H˜ëò½JCŠĜ›1Dda TpĠ5żg‘|$ùAôžO¸ŻßB1ÌIŸ˜Y?AôJ, ¤¸óo ŽGZŜf’ äTÂgëŽ0|bt}M×Ôèq ñqwݤpO"3Âtı&_>×ŝ&Šk“Ê:ĞĉzŭÎ>`Z†-MÜN§3˜>‹û…ù£tŸmÉWÓÔèÀ=¨À™~De˘Ï1’R öċĝ:9ZúšÄ\Ğe—èĵÇċ•,:,—˜ÁZÌyFšî­Ĉ×jÁúĉŒqq&˙jŻêàö—Wk~ÚϖTJżĴ2qañàğÌDÏj‚gŞ $W4úî˙)Œ#%wyó‹¨3/,½Ŝİ˙ ÊÛ2ß#Ät}˙ŠêĤŒáYQœÂ†LŞĥLî·8(óžÖ\+*äèx.‡Öŝ ÄWÒèĈóœşÖöĠ{ASt™Î8”<ĥU 7ŽÖak‚âËùú׌ëu\܇\Ġ€Ċ&ۚ½SŞ'EU Ç q´@œt“A:#ĝçŻ&’{ZŒ›}ÜŻĵzFû;ז ³ĈG"Ì,pò”S’ëÉ\QZ†$…Á>QÉY=ĥ=Ğvżv@•r[€áó,:;ĵÑڎƒW!tqîħ9˙3d óF@J¨CSqVN>§KpRà˘Ì8`Ħ‰]bƒ!˜Ì–zÒ ëĜĝ%OۂĞŜ­­à¤Mŝż·Öĉñ Épb›Nġ˘(D¨:ìäùۖ }´J/FĵKš^úç*ŝÀËĝ cö˜á/öŝѨN>˙(/ġ€nĝ|a}>ż@Ô(‹*lWĞ÷žĥh=q,ŠîZ3_u~dq @Ž{âh‚1Ï˙-^ó IâŠÄrë<dM_ݚ5ak‘Ç~\ŝİë€ $<:ˆżEûv@‚ÑßÖŻiĜù˙jzŬċEÜĴH1‚1İB‘f7ùGé$÷%¸ɸt`Ž8…'ú9?t)ЇÀˆÔΟŬ2ÓsZÚµNŠİŽä8F›Ħĝ‘ñòwڊşbċ=mé~*dÀL˜ísjġšóı⃭<ġ{€µ('ސnטpKúċΈ;,^ġT/gìÔÑB–úGû„,BPL›–~Ò?§;CÖáûè'+îö'ŝ*/á<­~^JsëŜLîÈ 0:MĞŭKħP^Aßw¸ş.Š?'`&żUΣz~ žsR,mŝy@2.pµ’T.G;IÖû9säŭ%ƒÄçı8—êl$6Ö>ȌÛPŭ}5€6&Ϗœôb=<ĈAğS¸ú0] ?+'ĴƒàÖAĊÇá[OÎĦ‡áL€$7çɊÖËtƒ²I_ĥčG³“xÒ@zĝgn]ēè’ħ€ê/òJ|ujQLÁUŝœ~·ùJZRs>)Ó&´gS¸öםR ĥNxV!…ĜŝġŭïW6ñ¨×´îÎĊ_vì*ƒÈ,ŭħ–ê„Ĉ@݆Á·)dĵ<™ïĞçŜĤf"Ì%ÍÚb¸Tż×ĴËİjÑvb?_€·ŒħÁĵk¸‹MϚl:w‚ "eƒÊÍ 4|˘żÓw`s²½2n›Zĉĝ#ÔÖôƒ˜·ĠĞ‹Â"”O·˘RµŜ >‹T熿—šLùaL€%IïëJ™ÏĦBYŭèÄe‡ŠğRöpíoAœ`…‰ÏħĜQöŽìµĞi~ TÈşâ/‡ƒBÔ*•81N‡˙xĵZVHm´Se/Ÿ?BÖy#éİcU5dc‹&[_CÈëb>wK÷r/‡+.¸AsЃ½3£B›bU·³èäPĞFżóy­ċȏ/u/>ÙÍÄıaÏO&o½İS–YpJƒ[ùLfúĊM¸ó/.–×S @£ƒ‘/şQÏòĝ -géÖvúċó#íµçĵÜÎ_¨$IäĞ Ċ°tD …ûżî%Ëì ΃9U+Zğ0t²wl ÇáPÇáGCĦ€’L²şbö DOíÈşê\Ça˜C/,g€\#ÙÍ£‹žì+Œ(ÔêçGyĞÍÈêâ—Êŝ£2ÔMX˜X˜!Bx•šŻÏŽ›yF 'nן[IĦFxVT5Y²“×[/¸ëKĵÎ °(³¨ ê”ìO֒(³u‹ĥ$×í´ĴëĈjŸbBĝƒĈ"ŸZtşÄ­ŝBÁSJöGú•(£úğHÒc–ŞYĠ¸é Fä62üWùôLˆÓ›‡4D²ڊŝŞh&í2f{ĠĊĉH&ĞÊ2x]‘|g¨š\´úäCĥú­K24…úŜ#rޝWύ–:'­,ßbĉaŭä†_#üñ²=u×ĉΆ@r´Œ8s·ÖVÙĜÀ0ÎĝĉĈš¤O;ÁĠ|§E䐏Rè•NŒAÂĜ?ÊÔĜWojÓ8Ĥ>lÏr’ îTǐ0$bp<?VÚíÊëġµ7tĈgp8ĜĊĦċû¸A˙Etƒœ@e(ÂöV)÷-í’$$˘‘ŭ~²aĠ•÷½{“Cm‚J•Eîá Ae½ĥ1Ädµ}j9ËÀ€;O;Z+ :ĞĝÍÂDİïʝû]xž6W¸‡w­5ċ@U½î{ê.PÒÁt™ĈjBÂL?G7uğ-tx<À`úaÖ<„RĵÉ”ŻĊJMIÜBĵĈ¸cĴ ċŻ]mVÉ·’Olĵ”u~EǤvhhmÙĜ†Ĝ`&ÌĜĉE‰(F pÇà™Ti ëÜuiLž"UW‘èôĥAY úÛ*Ä˙ İ‹_ËúÂŬ"ñhhİmĵí›ŭ{Ĵˆ:ŻÂ +LÏ;<}Ġ_6‚ßï\—kĤ–WöMÑâ3°QRžcSÖĈä<˜Vúò/>ÄÑĈ÷ Ş;T›UûĜÔéŝ(ŽĈ‰BµġdŸ;"nT)$"ëş4R…5áôF2]—ÇáĵħĝkĴn­€‚*™È–&÷\Ó hòY€@ıüŻ6 ×Ύ8ƒ+™ Ôᑠ7ċ˘âG Òo¤˘-Ĝ/„!Pi ä£Ş„ò-üşğ_p’“2½,Ż=T­WĴÌox"ë†lÈÛ…ÎŻ–Í%“'EĞ›ĵŞ4sŞ ­b—ô::ċżÛGÜR•te³C ‰˘AcìZô8Ê´}`‹œgKÖí¨ÚĝğUQkŽ~q–ŭ$œ(Y–4UzÉ!}šÖ|ä˙.G(…Ĝ“rĈ‹ĜaôdLÓ§‘‡ ŒwB˘iŒż¨ĤŬgv´#Ë íĵÖW?,BĊÀ˘}~]QíuuÂĥ’jĉA0UÇô×mu[ó'İñFOĞ͸Ġž›ġW‰â6‡8ħ‰Ÿ¤o>V£‘M“fIÙİËOq˜ž×žs–˜,gëçRĞùĊÉöG/¤S'y{ôċÉ@ĝJ·e˙qsnğ9†Gž…çĠ]ȽŬr=áİnÊŻQ5ŜŭûüƒZ£ŸvEÏ˘7Áv ÊX`×Xß%{Ùü%0ż@C FċçKÎÛ¤!µ·~LĊ…ĉ^äášÇ½ K“…H¤ßuş_bâIĠҟñ³AC ĝÖ1ïäZ+Ÿ$ù R8 2•FQàŻ`­Wҗğ_7ĝ`q ĥ ‹ÎçÔŻ`ìÍÓm:ŭĴˆr%Ĝ2ı­Ş vWÌôÔ+Òz‰h™Óŭ˙E6H'A‚a”ìVqMQa/Îŭoq└[én+N‚§†ÑB‰è?'Żuy:–Ì„íŻŬ%Yï3ıȲR´~@²$[مí‘)$ïEGIˆ)„DAçĞZTĵĵè×oPĥg‘ZiVkû<ŸŠÌóÓ?iâc·{Ó~·ÛP3eP16Iĥß˙@˘K<-ġGRġ8ħÍÍâ*j?˙ï;.' dcuEˆŝ´ *†K%ZïR+%žffïËóE=? 45OVÊéï\ì,í†YÖ̝³ž ÄÔĉtœ°Ó˜ŸĈ’4Ĥŝ$–dŭŝnĞcEż‡jAëm<Şf'„' „˘ŽÄáDT ìTÔYÊ!9:ä$bêÛÇÎĴİN§™ÎT³NXĵAÀì)ÑQMÓŜulV#Ğa~lğ)ĊĊ*­á8£Lɗì·{áËâ]ò’ú˜’”£‰Ÿçŝ@C~-ÇA%×]k˜‘ìĜÜlMd§,¤jcÈco~)·{‡n ϝ··ˆvŸíŠx%Żŭ]›Şŭ÷żUéÖ#‰Â,żNÀ„{ş|ŭ := Ö¨ħ L$7ÈŝÍf;d#şzĊµŠ¤•ıƒĤçîĵ;öFˆ÷Œ^Bó·u+ÑġmKU-ğTŭÌœ:|PŞċ)ŜWŸi&0 ş„ñEŒĜcQbshĝ’… @ÉTĵzfüĠ”k^ċf³c{Qb6MÒğŒÏìlĦ1?ƒXßÂŬÊw€¤•Ìr6òm/ëŭe'më~ öÔÇWR ׯĥb˘(:¸–%•0Żsô´ŞŻÒ_ŭGUAŻ|QÂêKı}ñ¤ıíÚ¨}ş•êÓPÑÖxëCĉËċùaûMòÁÎvuìšBnP'ÎÊûŠDEŞë=“3ĉMŞNÂÉršíV}ˆ÷ˆíşĜ’Ŝ!Ï&´Ôŭ£üÓĈ— Öi„îšôj(#Ž€ÄŞÊµżGMz„ÏÈpè}A3,zu ˙Db |É3 ëÑEÒ·˘B­>ħA4\ ,A/Ĉ E„ŭĈĝŝħżÉÖ ,™şzµ*Ùĥ%G´iV\xUPšğ7}Q ™ġZ ~í“ÉcÑL2plVŝÇzè|ċk­Û"½Wĥ{żfûµzıĉZA°äÊĵùÂBv Û[ĦµÔLXš¨Ġj¨ {?ŭĥ\Ş·#ŽÉ›ŠHi"— ¤‡2µ2üqf‚²ë>ŝШùÌİ\ùšħĵ>žÇĥĥŽëHTı+Qüƒ_éŒ '^AH U˙uĝ¸·Ïí(qŸû Ù štk6ÒAú7oS·ÇÀ{ħàijĝmŠ*\'<6UaŒš„¨ œŬŻ<;˘}ġ"·‡7ÏÀù&*‡^ü"+vê_’¸ĉC (8œK7òD-ŭ1˜ يkĜĥ/ĴèĊuï• ÀAĵ# “Ê š íò½N…‘BBkžÁ?ù6ïTŝ@ŒŠ§T˙Pˆd@LXÙ5{Ż$Ĵ³2AÚt<µ?fêuG_ aß ÔG‰µÚPDŽìïe,08,)H‚ÌámoŬp!ĝ¸AĤu;…™^Œ÷ž›ĉ Ġ`eñ^ ŝ_éÔ',ĵ_´ìÄ=Zġ$ßÇù—k‰nġßt u S6fpÌo˙hq Ŝ! ĝKôzĦĴğ8"ÖÑÏg–ĵ8ĈƒÄœác 5F#cĥ2^ġ“}êáCK £‚n0îôÀ†ħĈn6¨eŸMzۂŬí…U!)çġġmòQĊ•ÈÊëċG€}uQż­ÓZ(ÙNoÚםPŬá†?ü6–ñ($ÄĞïeŭKpnĴĊŠlÑU’&%W8íüpúkĵ‡c¤VŽ8ôU&>FEʄĠ÷jg!8¤^î´I/ëŽ1^‚Ŝ@3.& €ÖFħ0 'ıU’œÓ)YÍÔŝï`aôÛ ½­ˆFvú,XŸSÂĦ|D‡5Ħ.ĵàAĊ1Ô/P/ĵ+Òĥì[žöbÌCwÍé)äÌďzîÊ+oœĊvŜœ£$ÙÜW2ŠR4SĦ&—49Ú7Xtaĥáùzı›‰ğÂĤ(Àß îÓ@M \mj 4X/ŠS§Ŝµ‰|éEG}PÊĴTƒ )IĞ܌ CTI!{ŝguI4ù°‚y Ĵ˙U´>lpr‰ Ú|3mkŭVúRr³(PĝÎA†(b,Skİ)2o_ĈhÀeÛüeóµÛ¸›ûıêLsÎR:hñġË.à{b4\ŝ„8/ż™)ÒâĤ,Ŭ+_ş u"ˆîò%òr½¨|_ΰ‰ ĝŜÖÇ„ê8ë°¨@µ“zóğ\O-+Ğòùv§Jċ˙hHçcYwŭ]Ʌ÷İÈC‰sNŸaÎŝËú6Ŭ¨L› dı[@ÄÀ…ÛŠĜ!˙'d‹R—Elıáqb÷™KH;9ie‘}GÍ †µíÍGħ{iŽXşÔĊbS´Ò”drèÒB³d [%ƒ{Îm @’ \ÊêÏ?$í…=Q*Î]›0Ñœy\׏ĈʊV_Pr Ci6²ÍÀĈĠ èeĥéoP<`‰ü?ïzà^ıÛX*|–0ğİĝ  \ÇáGGàÚh&—VfBġÁK'ßòÁAôT •,î;„_ì]5ŽFu“ŝµ˜aé‡&ÁİĠí(0Dyŝž†­â‹fyĦ-phíŠ(_LOf³Ž ]˜ wRşw†…ƒz3Átşĥ—=z$êžò´Ż$Œû!ż&‚:˘¤ç™¨eĠ´ş³fojè êŜÍRÊ$ş‘{G³$[zdĴXwV§q 19[f‰*0ä8Á.[6ôùáJĦ ˘NÓÛcĴóúìÙÍYÛÛhŽ”/ża ‡&èÍ{T5Ñĵ‘ï`ƒĵ¸uߟcD;ÖJq=“+tl"ešèhJ&&ħ AIÔ:ßg?!>;Çáß4~„Áöġĵ`8 3\Rċ³ċ1H¤c ŭœó Àŭ£ÏžO˘èñûàs œwF&›¨ı˜qÂħÉħ\Rw^I1Ĥ•Ë=aĝÚ6K Pá—kıÄ£–E6éqŽĞÛY³ÂœaŬnE^…ú˜pŠ<0ñ' (jÔĈĉÌĠŠ6P}‘¤áì[‡&çaĞŬŠŠĜ.y.sÈì ñÀ(l"”WĊ„Ry5²5ĥĈ]ıÀèÁƒc°™`ZjœċÀ”?Ġ–ĈŽZ×0cu…Ú™·d˘‚îö³–4b6˰”ÓdÓDU%”şÍk¤WW°mkĞGsÂAOĉ]ŝGó-XsĦšXñ€yîï6-8(Ž­%pĝ1VÙ^ĊuXñà³v&ħ.ŝáš<ğì2húv‰)€hևd蚷&Ò%Ĝ–M:ƒiúœC=ƒ?”oş ġŽàŻ/$2áÇ$iq bƒ°J™Q˘!ËİñOTA@Ul%ğĞEŜlEšr-£J#żì%ışêÜĞM¸%9Š·Ó÷Hҁ Y]˜Ş²4c İ­\İs;úS_DöÓLûÑ$ÄŝĦ²Tâ׿íoÛ4W~w?¨:y Îêıì‰Z~XB ò4GZŝPOΉŽĈpİ&~o0$™”½Ğ~§g0c€ö#-Îıżġ’[oKé­!†‚‡Ċc÷ž&$RGh§á—˘™r3|ĵ/*–@ÖÑ­ġßîîYT[àŬmDzD:#aä×÷Jĉ#›­'ÂÍiá÷àL;ĵ€÷İ`£`Ż)6B&6Çé>Öñc6ŒOÌş w`} qèü/6ĒY•öÙäm˙šê÷şƒ{Ò?ÍCÚȆ@ˆQ­cİ`m`q ĦaÂeɂö È\G ġ“ ĉ àĊ<Üy—†ßq1Ĉ˘Š#~(÷]|7üZwàXöBàžäLcŒ„֍&1úĠm혷b“ž ™‹77"}Ëĝ8žĞ8ͳà5b/„Oh°ìJ8Iż°—Ÿ·—„%%lšíƒÔV‘0tö;&d\É|özöîĊ”ŝĈÂÜñ‰’…,ğ†séÂ8‰żħcVö’[²fO¸0Zûï{Œz)œTE̙½GXZE „Ĵ‰aı>䈑ĝNŠ>¸çye—'ìZTH1'Ŝër>XZrí.=ݧíkÓÉ˙/ô7 JÒ7#:Vâ^çn?°bìV‚˙B”ŸŬĝx—Ħrc ù°˜ÚÁñŽ# ŠÛža}Ċ@\fİ{àŠĉgґKGm렐°xÇ0#Ÿd¨`ď—ïcÚà#LÑ|•g‚ q&Zż§µéN5ÑEàï8÷œöÑ5^Ÿ5eh˙[^:BŠ/k) ˘™$ÛÙÙı÷ MIöueg*JıĉAÒÉ7–;2ǕšU*òƒĝ&²üŭse2~Ž+OŞ5Ɋ Ïcê;€yÒò܋ċ‚$ŝĉŒ&$ƒúI'™Ħ¸q~ş-›<ߐ—`̇Óg҅j šfşaz ‚­£İh:ÌlQˆ>b;÷‹ÑÇìeaBLœ]!>˜ 5oPৃ“}F£Ç$ĥ÷°ŸM‚¸ʤ1Ü´Ê]œCÁ2CêomKôֈċêa DY5ڒ²]Şżŝ.Ċڄ×é›ì8ÍÖTGHç96QċÖixÌ9ŽH_éÉH‹pu2—ĉB0 š,cŬŸ0˙UŒ0ž/êñR b$ñs\€2‰­&N÷kùĵ5óÈmÔ_kÙjaošĉnF•iúĝ´"'ÌÔS2ĴO×möuK4uÉŻ#d€=3§(´œrpd•Ÿ`BîÎħ5\r=áİvï@‡ÄFDİğ Œùal˙ŒÙŭŭ Œ5ÏşC†bI4×mŻÙ}âú§½Š°üÚ'ŝ·I€xJŞŞyğ[ĝÔpÛàlşûş÷Yġ>9ż›À낲Ŝ‡ŭŭĴ£kRhí}Âmâ‰ûlĤ Ç5ù‚Ÿé4e³’µXÊ s~Os7;58x´‚€j#1”’ċ‡ÌDóÙş˙qœUàSÊbcĈpŞš­Á+ôĞáÑo2âC.î İDsÈ8‰‹1¤á-îéÜ_ll;úàğĈO²ĥċ9ĵGkKàßêúFf@ObĜ}ĥ!„:r3ŝ°B}ߛA°`;žZ[¸é „Ñ xmġ4lbŬm$óOY¸öÁK_QÁI]Ħ÷t†:…WRş3İÊHğ~Ĝ ç­¨hŝéLê²·ùŒùj"7ÍÏámC¸´4½3Ô^ġ9Ĵ#c"W"ŠYŸ^["É.* ŽlHBÍÎӀsĉĝ3z⺂ Là* şo¸UÍñD“ñšF\‘R†â·  Š?‹J÷‚s' ’h†`çĴago(ZÀ%“Oğ†Ċ?ĝœċ—(Û{€*`°.ùS‹WŞİl*7ƒÒ½!^bx¨ùİ"´[ÏôüH_yÌCĵĈĦHr·Èb{#Ë bQò§ŭ.of9"aW ²ç~îĵusŬ.îŬWst'<ë—›^7´Ù_aœ·Ĵµ¤˜šÈV"EŻ;§aċö…¤npËC‰Í_â:ċĵzú-µ›ˆ‘Ü˙öš£™a__2O=¸OnĞeĦ'Ï&"Ë*÷h Igş @òòKzÏuûˆÚ?)m:#ùüĈgԗñäâFœ=Áïò_Žßœ°\ څ™R §ÚXĈïĤÚ‘ĵšÉ­²äF! V:‹ŭFĊ_êtŜŭp?³%ts“ § ²d:óižÓZXϔWd6̙7$JW‡€°Âuz]ĊI‚·D„™Ç)[-€^j´uz ¤k Í'ŭ²@zçNDV‡Ş?¤h@HÏ|ıÔ²İÑâûŽÑÔTÇÌUOEdvĈ–"èP†çŽwÛèt==×˙fS :şJ‘ŒLŽ??áJËjœa ˙,y{ˆR  <`òëwÉp9ù˜2À·n­ÚÈyPúB£ÛÈ}Ífż[ıÖÊéAïoŬCz$Ü!Ŝçn׃™ÚGàÏa–v;‰*zğà‹Z˙CeƒôÙJ?/€§qò€ŬYІbą5/eû’h&ŸFÈ:9”>#~’”$.ž ˙j1µ˜We+9ëù$6w´ġ\ _ /\NáĞ~İ%<ŽÑ†ï膑ˆ÷3Ŝ"ğ`׎VF$BŽï´°:Z:1èĵ5Rzz+E îKŜ£¨0V Oĥ> ‰ŭEèÖF"Èäܟħ-&ğÍhc´Ĉš{ù¤6j[!9¸ԈÔĥĤSDŭêĉ˘¨RħÑ.]#vŒK‘yŠò½v‹AsÚŬ†QڔA "9[Ñ^Xħŝ 2z4ÌY웳6Ŭ”8Izżéñ ß½D¨ o_X-™Ë™=GtÊĝHižˆ}3opûw¨²éİŸĊ€o•Ġy–+ƒœˆ4çú?×?W@Ëû½R>p&³Í+ÊKËûždĞ6JŠ’ äĊ×uùz?óo(…F|b‹87ġ¨K!&FÈVZƒĞhsùVşùéÇj?îĊ¤H–ÖËH x~ÊÈÜIœëŞġf)ۃ]‰|³ùá{˜1‡Ô*ŝ˙z˜sÄ,wĈÔ"EĞólvmΗ:)ätî#3ġ‚•]ÎFžúp›YìAÏò’ĈĞ\ŞÊˆ>[rqß Ž>˜KUÄ}.lŠ9ħ,TmA½YQKôdŝR÷ñ•ÔŬK"Š3â`rßékŝ˙D@'K9#ÌUèÎÓİĴĦ÷àŽ˘½Ta\Yò}3Ñĝĝmܵ´teeċÛı†2U$”Ÿ½Ê^ÉŬ­ï\Ó`MMöMÑĦ/’˘cVèi›äÜġÉŞäZí ¤„àŠ&uĊó&N}Ÿ\°ß1:>ÈÑÀò_ÂNŽÚĤÜÍUô8Ç̨-×Ħ`KĝÔp¨Ÿ@jDĞ~›‚IaùĉĦġ€i á“Y²iUÀ>j`úÇ|>à„ĠıwÑXFzâëĴ&ƒ"@,ê™ Vĝ4.N|mxAT¤İ×ñş:34ù)Â7„ì4ĊĞÄÏöw.‚°–\¤vÄì•I“x“„(нĜzĠM2A2߅"Ò´ž’ÄÀߋ¤5 ׿ìI•ZsJv 1°Ž`~ıë`h@ûsà÷İ}—IÊÍ Ĵö(¨ıBÙx²Äd7˙<²W|֎X+öôÖ^³dúpĉó&¤ =>b›§‡˘-´{ŸŽ§à}ŠUv18²üÌ Ġ1’yí£ĥKÙÇè/ò •U ÙĠ‚PœŸ/-ú›haû–.ôçq³NĠ`ġ²™5]”̈W'ÜÇìp÷ĉqċ…Ëá}>…ìQĤäĴÏFßÖeÔĤKË<Â#”|ÙAşŬYĦ҆[ÒĦrÂÇ(NşXÎëêŝôÉÁH&%üŻ˘óŽ‹òj%µLŝqLïe2Ù@[÷ÎçÄ[Ò~¨6½kŒ"ÎfKyA ü~ŭaéχG‰‘ÌB²vÑĴS60”áîŭŜˆ·gñƒ?KŬèm ÉцBÊ59ÇV,ɗ⍋wÍ3#•î˙;ìHs TĴçÂî&镝­°eÛ9›ç>Şá5Á(<ä3ĤU²p¤ä2 ü’™×EĠZŬÜUŽ‚Êq˘k™%^Jı,!– ÄӍc[ž+[ÜcÓ×7Âähêaك^ȋj ŭÚ „˘û ĵ?kΖı‰˙r‡X–bANG\ÑĴuĜ8e£Ë³ÖáÁbCĵÚ6ƒ‹çĈĴ6ߛùDן'†ÇGˆµĤdzċğupĵc/£óE²—ĤĠ[)¤Ì˙cçŬš´‹üH>6{,ğŻK>´7ri:ërB›Ì:~È9Ÿö`1Í~t´zÔáPUbšÄ3óš³~ „Û­S¸,/\}èQ}ßöèÇ-#B#ĠӛĜtg?×£.=[o^ÜïAj ™|´ħÓzÀaĦkœò T}( Žz§Òd˘£ŸA܏R md•˘ëŭ‰g•6ËĞ/Ci{Ĝĥ§EĦŞŬ”ŭŬJÍÛzßɧÓÌNZöʛȓ”fúdóŬ˙)e•—Ò¸"U,†~*1“Ħ=ĞÙc ԂÇ˙2Ó5€Ó3ĴÒP3è_SŞÖTWv„sô§&Uf(`6~MĴ|ÎŞro|×ì@*ÇÄ.fĦî'Ú0Má òaĠïıïÇMŝïıC24›knÎħ;Ow­ÁÊ9QHÂo+_pžì³ÖIÄÖû[èì`DO(0=µ{>ÙMÁêÚtpO•^ĵRÇúPߐ˘róĜËыQ@1^ÂôYL§•—Ëv†ìy…4U^óY„ûxZ˘Xâ ^ĉ ~A^ûĤ >Pzi¸^p5:ÓIF ‘^Zt ĈÏœĠ<Ĉt¨œê+ bj#ö]*Âl‡EŞ )œ Aü½zèşMÑg$Cœ5èʤ/[Q'“%z]ñ^|ûħp-ħëa)ëĞŬmş†ôτd*œbÌap×L qh25Sĝ9eWƒK˙ ·âÎiä*Šoċz:úßjLàžK=:†óˆ8NnPşÂRŠĉ5úïŜ9Ġ’´Ë*$Ħ´¤#„Ÿf#szC)ñĦ÷Q5êÏ2µJvûEV8pïùÍ<Ĥ¤Ž„ġWAéı‡×°F í•ÈíxŜÚ%˘e­I.ÒüXŸìĊıÏ“ÂŻxÌaRŭ;¤ĜfâŞ=Š$ùĵ#ÌÑžÍÂĝX˘TĠuî;ŜuàjBİèĈŠë-Ö[Ĵ·YÀgžŝ,sNc8íFZ† wC^}#܇Ä;ÍôĝCÒôY…­š/œ¨;´dÓÁÑİi¨Ïı]:ŭtė½AŬ[mwxbĴˆf\o@¤ÓÜĈmU9íèC]ÎĜEĊ…’@ /„a§a0[ë!óżjäÎSe%QvùÖá@9-ğ@ÜKÉ% `rq™k\Œ°‹D‡ıÏ”}|›×|ħ ˘z˙o€²mˆd_ċPŠÍÔ?î¨zÙîzx½uk"1,ÈۅH’×QÍ<BJÔÜí ğ}›Ĉê_C?ĴñàҋîĊó0€ˆÙıTÛ3@ïŬÁÖ0¸Ó2¤@ô´Ĥ‰3s×w˘ÙÔÔÌĞ ò5é,ò<še~ĝŻw|#†½aßGÑÉëKxI~5;³Òä„Ċoùġp0Ì/ —•nÙ;Sè·QÓN^`Ëù@zTŒà€x’ğ@Ħˆñë·~ħZ]fQÉrc, ñZbxrĜÓbšEĦ…M k²Ûž/ OÁ úü…8ˆ½½íĉY‚ıރÂփàÒPL޽ë­ŬÉdèġÖq§¨àÂ+%Q%ƒġA˙%6nvL?´w{7›š)ŻsjbO•iÁ0œ[ äUÚsKBno'šE-)ÖċĦ•ƒ—qËÈ,ü„Œ‡ü—X¤E ê4ħıŸ˜î  =¤œBÁuµŬp6'ZßÚ](es^İ$´²Ĥ x2ìdwô?wupàG.>û”ûÒiCnCĵH:F[ĤÎĴÓTEŜrö 4”Búö•„˙GvŠ 2÷TÖP£Ÿû˜²8OၛìÄnğ°ÇVm„fóMŝïÉû›“5ğÁ]$uìd× ‚`ż>­^ğe÷ıÍ*Žˆ€&>ñċ ×>ZÄvĜΓT8q÷fÛHÙ§2™ş]Œ†ÎĞçpRĤ×ÒÊj—YÁ${‹›lÌ$T‡M‡Éjġ6ÔB/ĊâÜ<}Ro´N×XyêñÔItò'Ñû§Œ>{´Y=è°ÀĝȂÓYT&ê.9ƒ%tŬĝˆ™JVVdMIۂ˜ w“dƒûë Kеž(ëֆ{Î`Éğ žzKĊô¨‰kĝÖĊ&· ğx˜£Üîbò£üRœ>ĵYßb?*“C+ùQ@ġn“ I/ôgxj˘j{ƒÛš)ĊÍ­ù†}ŝöX¸ž;žkáSçÚŻ–Ĥ°mUòÇĵ†˘èB˘dì,ëë%Ċ4ş0uˆ|ŝŻûž›´ŒîŝR5P ‚_̐Êí¨˘ĥ½µBğ™ŒİċÙ˘5šé™ëKeR̅MÒ+Ż@c—Ri¸=¤ĝÈgĞ7ÏÌs;Cú·t³Jq"¤9-6<œ =ö-µ~γ™ ‡\{:Eöß/Î ×Ĥ\Íeçĵ‡J·}œÍYKb#ÔÚŽXú_SÖmɳ ‹ŠfŜŸ„ÀÀÄû‘*;0/…ĥ¸—§ÛT™½3+òo!"pQÈÔŜf°Ŭ)^6˙*¤D/”FHš]jûŸÂ šcĜ5 ‚ú&™Y+Ÿ #%šÈN BÜëÔ;‡hkMĦ³CĥG0J\CŻ<|œ@)EŽßäq–I^ĊXAF¨d= =dÎVŭs_ŝsÈı/CuÒÖtáGˆ'³Ü½5ïYŞ/‚ûx'nĈŒœâxpmĉ~Ş O<ËöcqĦZÜĴ‚â6ßKĤ+œÉ2VĤĥižYĜĴK€òċÄu[.]8ŝċxDO•›£2µ€u=„•ŻûXÜ2àÓw { ĜòWS9=ĝù–IAĝ²iġÉġg{\&S—(=îáíXĜ^Ü2ĝßmlċM!sıI+´yí*rkŒù:Ğ… ú3ÄġYKÔRúš°,P YŽİìMö>­³7;œĜóïFĴi_ÖK8ŬïW5Vr–Ħ5HrÉHüżZß iS.\Ù9NRJÛµ ò8Ào}µUéaóĦ}(ö#qÉHÀêwîS²Á\ݰÀµC`T¤c£ŽB/ßژYu›j)/g|/X€Öv+Ş,;´GPTĵì+È­àpñdê×Wé…ĥD~ë ?QhôPába\K•Ó‘êb[@R0€qBAM û/CѽDr1à7Œħ 8#ôŠ‘ħ\³vžĉĞGƒcîŬqÈY5~˔JÍċħ@š¸„T*ĝôur„i• ¤mƒû &j$ßô™9yž²šñŽg—–4ŝ9öâĊï•Pò;ìÛĞ÷4ĵ4ó„Vñ{Ħ뚘3^ħJe£( PÎıÛKÍUœ‹'(üQYJkòżw‚ ŝ\EÔST'€5-ĉùG™"í´?z”ì;¨’l1ĵŸJ À:gŠ`/÷úDßhé‰ĠApfŬëQ{éÈ Çñ³˘ù9*ÄûŸ$4Ìó Ñ8 ħİڛÄ+Cöüï˘Ò£BŞ#³¸(h­hŒ6u,B2Š—Ż–c…ëŜĵÙÈdÊjÍ翖[|jW%Ĝ/¨§¨§)Aϸób“˜?.Ĵ+7 Qëù8–LWï7’²í”7:}‚3€ç£5dA=wÇ\Ûó ƒ[wG}Ġì$‚3M›ô$1S=šz–ÏҖQğ8li€^.l|yßö„üO€3•+èġúóı(Ꮢù‹¤‚lo­é„ĥx7Ż;Eá ­‹Ĥ3‹ ÷2Ÿa—IÁKĜ½ÊŜKŸFñçYŻ1ĥjĉè"]zòabr-Ç0ßŭ1ž :!ux))ĞGVEÔµK:ŝÜÈSнĤ}Ŝ÷àOs‹tˆkyq°£J'¤`RA(*ŝŒÊU”@15OšĉO…=Îë˘;d; Ê›r$¸°ÓĈ ?8î™gMĦqB²ÂVê!~* ˜l,’üÀĉ]6Ǖ– qkZ߇‘‡mY²¸Êŝeĥäµ,%ĝDħħŜ%²/ĉÊre-Œz;CbK£Z~ĥY‹´Lox–Jŭ§Ç ÏNĜştƒ4C´{ĉu0„Q*ݘüxši:à‡9„%ŭ4Óñ3ˆÄŬÒä#1<ĊÛ*F× §ħĤ‰5öuâ!›NúôwkÊ]#Bì(ÏE‘×DµÛÂ" xöŽŭ{“I0ˆ^~]ŒÈ]7œŝĉó .qĞaâŜÂöıĝ‰+Î Òġú‹Ĥ“M…ñq6 „¨'I½–·ÄÀdÛ¤?NY£Ï(Gôĝô ċú÷Íf?§ïÓêV‹Ëó"PXik ]ĝOûúSİßùo‚?LNd[ĞòòjSĜ$Ż‹ ÌYzD#fñ-=N#ŠçɇbÁÎ;=ŬM1h1—òZL$/{PYh?‰[Óë:ıǝ2޵ê SşW46˙·A!MŽÏä°=‰ĉîAğË<íÌQT 8Ҏr x‘ï×PÔÚQÖ`<]°W2q`˜Ë<"ß×i—€™£JŸh ÚżĊ dÍ'Ç txíחĵ–µÍ¤ÏäŠ'_~NÑ$_–bĞâŽ{ìI8WÈ9وLÈ/[ŽŜMS!Qħóĵ$—C†™YrQË?ñЉ½Çzŝìáu°™2m5­Ù¤+'Ŝ.bŻÒ`+ÍĜËpÔ¸›+|KĴÎ *—\‚lsÌÍGôŝ’¤ ĥšLx-F4HQŻ´e ĠÑü†Àí‹À"`ç_â2tĠÏ£À˘mepz6óùjCí.ärMj İÌŬRŭÓè›ìÔOÜ:=ÛX¨w}ĤŞo•<Ħ½jĜn³4-ŜÄM)Dé ĦSEmvĥ1óÑPİñĞ˙_ĦƒüCž5ç]ÒùÒ:nßd:²pÓ5òšÜÈ4%(ùçħC•™<£Ì12Ó­Ò-v<ôċn#³ŸΐôĦ0Wú|ÂôÂĦq\gß§‡l¨Ñé¨WT˘üMèßjOWË9­˘Wi‚ŽiŜÎñ-/E`×y :oD­¨q˘Ż_^OĊä ÔݘŬ<•&ûÁ½Áî F,wû çàl?_Rúê?2Ĥ™CÓ˙ŝÜÂç1>òï=‡è_Ó]}FŝñˆÀl†&ñ(] Ÿñw÷>5LžċêŜ›ŻŬ)ĵd&µĜ⤳À\[zĉ0zŻCHr/8$Ċ‚&ÖòWŒ+Ék™ASB9:•ġˆVpZÈr†ñ‚gapŞm êËG5;~Ú J‡à,r˜ûŞç]X˜ĝYžuéıè֚6&K^’Ôĝ*Èa%‚PĜZÑ˘şÖ ˘/‹ôál`3OaûžŜ%Ĝèö1ĜNq“^â,žÛÁŠ}U=ész 3GĉöháRĠ,ßò˜e–Ó¸îħŒ½NlDÑDˆóHërôHq.£°ùÒk[(™3ïì͚1ZÀ:ҍ5™8ĤÜYİzĞĝpÄqĞıK6Ħ„}/•—i>3ê.E6‰€ ı¨ëqöĥÚD=™sµi*½š Ŭµ•ßh 8ŜŭĥP¨ÇĴ‚œKIñâv\,[Yυ!9Kİܚzh‡ċ™Ì'lFİ.”u‚ĥŬè–Q1’{Kċ´$U Ùco²Šĝ?vô~ÔŬsġĠ„44 ×ġC1ıH#Át$@Ğ‘…ÑTièÓ}YŻ\Ïm†u à]nŭ~½\ ô ‘İ\Uĝ,ok°!lU@żħVq:sDsNP/ò9½Ü²î@#޵rRsúWáÑ :ÉñğrçŜZğTĵƒÉĉ#—ĊsyÛÎŞKú˙A6sFÛÈË"ôœÜ80ÀĉlÉÎeŜÖŝDĠğ}BŜ˙cxnèrò˘ Og˙óc3›ĈÁö²ncù,×ÓpaC svÉ,èğŭ×{ħişLMĦË9Kg ŬıAŝBÍ£ÈÓ Îß7•+ U“i!¸‹ŠHÄQp³oġ ÛvPj·ĵèĤ+H,í| ZĤ¨’µġÓ O2vÙ"‚ġܞŽc¤Áaì„‚JӜ>q $Ÿĉ{äË0ççw|ŬÇÒá}]OßVħ~Ŝ„?oIĜ_W@—Ġ¤˙[Ĵ_·z0Ÿ?uçÏêÔßÛħ†Zjµ”üĈ£Ċ·Ş.%´ށeĠ€”ĝ>Ĵœu=˙o Ż€Ì²}–GâŒÑ™Jĝe`Ż (üˆrĤ8^2(˜tžĞ–wXtg,çĝĴğç}„pç„) Ŝxy‰§ĥOEŝ'­ys%(Ž ´úĵ7ôKY\ˆY“ŭ ĝ^Ŝîq·½RŒI|Ñs(éH¤ÈŸôvvŠ0wqÈÁż&$G‘uY#qŜ !`lömlUı÷VÍÎ@S|DÇ-7Q*_ìUùúíÌΔq'¨UĉÜw—t Èô-ġSÍà6Ĉû•Œû²‰‘‰ÉaSDż4\¸zݤ³ç䍂ôĉhg&V•rȜŸ ècq„Ñ}…Wğ L'ÊÁÖ×Ĉޞ!ÖsĜÎşEO+;&=TÊÛP‡ajcmÉ`¨cÄ7Û˘bÊšÇ"ŭeĵVµDvû,tÎ=T¸ĈûçPÉ^ċOä?êm £§†?GIĞ~( ŠVË"|nş/3ï%IüĈû™˜rñŬòsÁpÁĦ°ˆt'=@dĜé×Hġïà“áw­ŠÒiĊÜĈ—lž¤cä£ì™ìàn˙rgi|6dg ĥġ–q¤ïĈ%,:ŭt2 ĴJàĉğËí*ggŒbÊĵóìĵü­µżĈ„™ÉÊûè$Ğ#ġ)XŭH?ĥ‹ÄD"Ù}GûÙRŒ %녞€=á uĝ“FéËLËn¤0/‹A.߈jÛ6˜Í@ì´ŞÔіÂ^Ò:¨évF粞mŜ4ġŭkEم˔Úëó…żÁ¨Ñ›ì‹RMwúwİÎû¤á#—Êô‡î}ಓ爘âäËêÈnšNó³ÇIŸl°ÍF[ÏÈì=ʰ[tZêiwŬzѵĥ?²ÒtÙ4LÂR–WîÄ"ïx #ŸħpÈĵ ZN*6[!*KÏfÍüäúï¸0ä秛˘ĠS!İt ÍyD/]•³~ŭúiµH”G ŻÄ ̄›ùżñ¨J|žIi9q“á *HŬ˘6kµŒGDG_+mŬxE›nÔ·rGjTöŜ…vêÀŬÏ ]ĵ+ÇeĤ°} m„> ĜÑħĵ&ŭ‹>µĊí-@@S,ÏÁĴ7ü>[ĜµšÜŝĜY5ƒŞŒb1aûNeĠÙâ°Ŭ"F^fÙ5uÄàöq² ŞÂ\ûg}ŒQüeu’DSgßŝ€÷F~vżQ˘%ƒİážbÊf@|˙dĦݝlœŬ9 ċħÌ3Ġ+U?Œ/Ĉ}JêĤ{ú³=ÚMĈtC+ ëû‘\ä֛d›>ç…È\ˆ’ĥt0v">~ıŝËüµ?ß”Ġ2èßáFmö9 ‹Ŝâ?0üĝ;ĵ6)uŜ=_GXô5r*”|ÄËÉ}ËptüY¸HŞ~˙†DŬŝYê=@LÖhEĞ4÷Ú.Ĥµ¤ÔXĜ#â_Z÷‚£ĴLu˘˜R‹ \Ÿ˘?†â³J?ħ>Ş?Vŝ(zŞĞVWp#[£;S˜šU'à•´+˘š ·Z$ÉŻ;†Ôµ1‰>>?ïu‚S–× €éq&d='³?ŞU]Ô~˘‰(GuİĜ}Ċ1ĞXĴ÷Z‘(ñ/ _6Ĉ˘Ĵ‚B(–„Ëb@êê g¨ò7ş‹ŭ—.çAôj9úʓ#È,” oND^ßâs†ïZ7#O6[3Ûít~; ıuÌä_2ÂóÇ^ƒ)8Qú?ŞqkžÏSP ċ¤vĵTB~k|œé/[',j‡ hŠaÀ.9oÖQAVfçhoy‘Œ|PZˆr%sꖃŜÏ êb  ڗíóôÁ,çÙחcùİöƒêB!jĥOnPŻŜÀ³ğ,ÛCi˘j´‹FôAĝ_ZˆëeëïGtĈvĊĥâĝ6˜üó‹aşdk–š¨˜" µ[8µßĈ8×ÓĞ5ğˆ YÒ\Ü äŞ÷žûûTФ 3h\—qğ/ıhú"ìškiÊHEÔÒn/eÉô?*4BĜé]r“⋌İNr¸.Go2ÖRâŬ˘òŬ{-ç]Œ·‚ƒ)‚ÄXe²EċÀ>Èΐ–ÎbÇziĉ($”›— ïâ­İŜĠÀ?ğ+W=Ĝ™V&m.LL"YÙòΈww7%ĥï´İÀÀ‰ĵh>İrÙîŜĥgq}œêyTŞû'Ż´ÊÑï,k}+°Ĥ²–R55€yz™îîĠ0/\ĈOh™ÂŻë³gÖı\ó“`_Ž”,ˆĦ4C ™ÖÂĦM—Íqžòuŭ Ι~ tX‚oÎ+ì ^Ŝ8…^ĵ<’óϙĝà^Ĝ ĵ˜Ld*˘HEĜö!ħ`ı!¸Ĵâ ì€û_ùòk7o ´‘žX'0#:˜eŝÒ£1ùNV0ż#BcJÔY˙uR6ÁW’)ĴPPë£xpvPôö½ Ù•"ƒĥÄjŸÏ{°0²{ÏQìÍ£5wÄàĵpU’ŸéÎWµç6ÔôвżhşÀD[·Ž6‚Ĥ5Ŝ—ë6èùŠÌ"=Á(=•dù+öĈɀ…µ”“ËH¤çx‰\­yĴŠ'üGİ™upëKbhŻ­îˆï1WŸQazô\ÛyFϳ"›‘ŻÜßà5yçHŒ,·ĥ”’†2ĵH@†2–G8Ÿ£F²N²Ó!„ë{–(Ì̸ÑÈĝqN1Jĝ&tqÍ)¤Ìù(ħ~%ٙÒZ`Ĵ³jxUÀèl– €Zħ„³œê„uGèʁĝŭOŻç_-\ıĜÖÌĤ°ÚF’M_ûxN˜ËxŞ<³[ Ĵ '¨ayD¤À’ĤxRš‹ ÓçI~ûTÔêCžo1ż×Ġnı'¸|Qä1ÙÎ%Àcpòƒn”ßÂì‚ıë t€ QèèCŝè„Ġ‚!ÊÖT-ĉÎşÉAZšŽ,/糟ĥ›ŞûIeF#?˘EŒGáŞoÚjt÷TW“?é˙ZġÄ0ŠR‚ĊU½u4š"y˙Tŭkżô\"Ŭ,2ò:Ç$/auÂÚa€;íÓs 4§ËĦԜ8/o`ê.ĉĵ6QĦv#ƒ@:çÜÌ/‹†+cyş60Ò45ĜDwü…jÛµérۍv(íAĉ­Ĵ&d8dÂA(áñƒ· )Y¤dÇÇid·ô”0ĴÏPÂŬ˘eÀÊèÂóqxÄR•Pƒ-MÈ(ğb›ÄEJĦÉv„L_ü#ı„z _.:Àĝ0ġŽŞÍM‰Ĝ9Ÿ#Ġ?ç2ɗ§ó¸O…/äĊÀ t|dšúǞÑ1C@ƒIÒİğIBqô^r/X@@×°;b&i„Аİ2ĞŞ şlü*ó<‡ÇuüeV'„î )G3?˙ò÷Jç Gp¸ÌĦÜğJÁf²½Íßxˆ\Á‹žœRa ÈeÙÔ>É$eğ¨Ó!äĤ<÷@C†˜dak˙VìŜÔ/£”kŽkĈn›èL2wË&ò;“w{˙d !@ĈÁ™+ m{$¤]A(‚ĵCÔéĞ˙‰I|jÙ;­u:ΎiOüóËŭ-Fä'öŝÛ%fé%İ Ĵv´İ„íÖ*G=qu¤yP8}•½ĴÉk§Ûêşĉ&›RÔ1g$äyY)6=ĵy^NNFqĵĉL†mÓAö÷šğ2ŭ‰Cĵ)ĜïtK˙`…£´Y)˜ü$Á‰˘™éACXe' WĴĦ@ñZqöíıd2µŬú†×gß|Ò ìß½lò…Ä-k“k7şÂY”b0ÙjÚ~0ĵyÚôŒóç`ĜCƒê‹Ä‚€ĉА’ŽżvçWUYfììÌ<Ú½’IĝJóç×ŝÌ82‡ÉiŸÄï#aPMŻÎÔž>}´ËŠ`î#wòÌ)÷#cΖZzË5Ô8’޳=´%?(íBŠ…ùWާ‘/ò‡ôçİËŭŞyĴ¨:¨ŞÚâ²Zġ}Ÿ\Í&4ÂÑrR çÇZPòPİ^hJ0Ùc  Ĉ-ó~=ĥ òĥŻ;–QË,ĥR ûœÍJ7§À(uË;ê^µ‰×Ŝâ0s"ŝıînݽY#!Ħ4?œX!Fĝúv[BŝÑOKHRîĈá5ħǕöĝ_Ûŝvr)+ pR7p$2jQÑbó˘ĉÂ`›=d [ŒÇżä҆IÛżs´PjùH²—I 9DMd÷ñMÏMYŬ\_hî² Ô/KUQVsÏ||B íà˘İL­Çw—Ö}ßíÌÔİo(ħĦg?\`ñşĊÈ÷‚“Ġ'€_T²‰/j*÷RC>d^g'é"‘™k­ñi 4ş‚E5^IEx05}QTuòÈş³ê7ŽA.ÒôFUrÙıġm ÛÒ7II@£ ÜÚÇÖ xے@Ż£mÇZ†ĤÀ’c+vH2œ;10ח‰ħ1-]Àà2)Ħw×7ó³ÌĦ÷>Û;W;\½ÉÎÀ.nÑ;JÑî"@;Ĵ[Š{‹7}pÌ`áċmP™ÉBF/ÌÙHW÷vaíÎ9ÒéF÷î._Ë´‚Ù zAËT”3Ĝ²{1 ħ‰a˜e„1çšT_ìšhŻy„sZÍ İ³Ÿ Móıû7>¸/ŭûÏ$ÚúZġAˆ–ĉ#Z£´š_;ƒ7Z­YÖGùU 4Š+o?#SFÔé™ġ† GgÓ6²ğbdù‰v´³ÎN í/aLĜ†“T WTH‘ŸŜˆ*“·HïHş&‘M((iÀ_ËòğǕŽ)3 ëÎ:­UBpYêñ+îí;ˆÔp5× #ĊşBğôyt'ŒŬ_OM^è™_]×3€‰Á4˙ìËü²³ÎŜéì­Qò-Šjƒ|˙]Ê×IEJ“ĝˆTċÊR2Íc¸$ŬNĥé˙k…/]µö|}5›×ĜÂ6Ël=›À¤Yĵ‚Ÿ–ƒàäâ˘è,h__Xp*OSiu½ñ'5ĜRbĴ‹g.Mחˆ:ôĞkë!7ƒXn˙Ez¨›Ĉ)ieĠÚĤ¨Ó5“ÙèĴDĠlĥÒŻejƒi ϔÁJ'Œ§` –Ó\vİ$ïġòĝYŻ‘im ‡hjµS²z#ħ™ ÜÇ ËùUñ·ˆ½ĞÍ+ ŬkrµÈĵƒĈ|.·Ĥy‹ÀĞ17!(g$Ê/8ÈM ÷ÁGuŬec;PPıÑ<ƒ%EhXuÒĠ)ÀOo")“ ĝ?vÉ\ÇĤîr€917WÉJ€żˆLÄĝĤsŞaŬ†z%n°™L}Ğħ~›D983ü]6ÌħúÙöAµ’çÄÄ6Hc˜n ˆ1#' Ac,÷yY£é"÷ëˆ@Tßĉâ jÒ7Aĉt´ġ£…L!ĵÄĜü²2lTm´³Żöµ÷JzëxœŻ÷]9üLà“ Š(ŬÛlH[¸vì 8¤ó1ĦĠVyPـĈEş˘îìSĥ°ŝYĴ J†TA` v™˙ •û’½²™öŒyŬQ^TË`ġ-<·#àŸ‹dğÊşħQqċÒ½ĴşßKùz­,(}6@>î iö”Ó˚Ir4lİÔd¨EÇ´›ĉ>wĵĉ%AÁš>6wĥdM*’Í:† À†Mžŝ§ħëE纙£²˘ÒUÖ ‚KivœÊ/y$İŠòŝ-Ĝ”³ìg¨›Tšè~Î+ĝ0qÖâ(QqÜí£ÉïZ§—Bà‡ŜïŬŸ‡Ġ/ëv÷ן{'ßC}ô³ü>ëŝêü>ŝW@êƒ˘´Ħ"ÄV‚ÔħtŻĞmfZLğĴnċ] i}xçâï<ŠêȧÙhmŞh™çÖ4ßĜäŬ\z^O=y{tbF]BšÔÒĴĊU9*•lîDÚ inkx¸ µ€/LĴYñGµHÓŝ!ËLğĞ‚\;9ÜÇ­‡B<9Óôó/òĉaĵjuîŒ>ıÀÁÙŝı3Vjr/żaSBò''…ž£,mœH Àîѭ͆­‡do:û³[€ċAèx†ñ…Á‡%:iSNš/ŝĝs§W˜sâkHG~]´*7ĠÈQ™7˔bg“ÀÔĒŭm{ÜɉĈ] Î!ÓPWLVŝL|W€Öo&Ämî€ÂM(`K Ĥ˜¸`)H†ÛĤ7ĈóÁ=/Ú¨ ŭšO bÙ^“‰%Hݳ{äŻöúYħ&òħM'bíĈî”Ls8¨#aüpjݐZwİ vİô@‡…6ô`Ġy&Ê#=¨'·Ic™CñS‹m-9Şüè ıkY´ĊLf[fjŻWéV%¸ŝ9"Hj2!€‹úÚnŻġ72.ށz)rûvŞ(fAµT^ĥ˜˜p/şŭ›[ĴVßï•Öh ³ôR&­Ş.Ĥ ÛtIì,_4¨é/VÌV'³£×_5Ġç薖û\ŭ¨‹Ôï‰ĝG+i˙–ù³#ş>–×ÔaÏpˆÙݳžrNqŝÂ$•ŭ°0vó,Î5D£3=› ŭWK/ʀ^Y… 8á=q|ĤDŬI2dÊùËĥMf`ĞÈlôTÊ/4ÀB|1Y’BŞà%gB’ĉ`£b„G ŭR‹‰ċšS É~ĝ°…]\ş²ñÚ†’I“ ŽĵµTĦż­ċx2IıS{˘Ïx÷{–żÓ]èîEu蚅Ÿ‘'ÓHó„J+äêĠw—âM 5žġñgwİaÇC5ı›cÜz)G/<áĞۛâ;N(•ü£ĊŸŜgÊöĵ{1ôÍwb(¨OŭCxĤDŸŻbWŒOÈ{ĵBBŻjżPŞı0zŝH#ŭ3g— w8 78ÖĥŬ3kĉT\ġ…`G‹·ŬôTùw<—i×HÂzC„żCÊşáïŭ X|WôÖu ÓxÚŞ[‘‘m Á¤•Mƒ Óç.„3d-Í ZgĤx+E”Ò'°ç1ĉĵ\Ĵ…4ï@Dċšúġë żîeÇ1Ì+.ÂjŒQHƒ=}툢œ%ĥú6j¨ĦK}öxóĜtôŜD™ë¤ž@S(b [‹¸Ÿzşk.ô7YH8Ɇ79# /`·İħî0"7fèáóÄÀÀy/'[Ngž^hÉ[ġ·¸‹š˜›Eïqw‡D |Ül6äZ•żġ§†Ŝ ­§–ê;f r"çR[h× ™L€ ċ×=ĉévÂĈĊCƒSâş\†É ^ÁÂúÏ3•Ż,Ü£Ú@“§ÑEê'jᖗšg&â ^Ĥ÷Ù£ ¤Ÿ5?ŞÏÜùÏÊI]¤G³cy[ŜméyÉ]>R& hGş@ŽÛóç‹`hê”ümĞ7†8ü™kî1;§piËIJžĞòÂ'ŭĜ×£´z%ĦÛġÁÂÍ@áSÇtMÊ·z0àÛyĥµġLˆ·†ÜŒúíïûCN¨¤İc‡ad*D06yd•Ŝ*ד!JZ>[ûIùßÄ òRê Àôx¤8w†Zä¤8?@ĜC¸yŝ@ñP̘ןFIÁGĊ=ù8‡¤j"1>@4ZZHĉ<£Lym41ÏÓD²vOÒÄċÎ6V'(L%Ÿ½ÎZ£íŬ·ì½íĠ÷a,kYž(léĝa$Û :î ö ŬmçQndĵ~—#ħÓ5ûĈ0kŒWšZèÍSßSòÉT,;4˘µ"ò_sñcĥə}ñ_rUÊz²˘úĝÑsžUéú\b"cŽÖÓÀY4Ĝ8żĠÇT_:­żÀ,wr[8w*İgxo4Yhĉ¨—Gûl€›£—!zQIùÓxgéq/¨I`íS‹Ö,Š’WÒه“Ğ-V Y ÔĜn'¸Ĉ˘”G„mʛg¤dà™ëŞ%Ì,WŭU8ZFd(Ĝ#öÇB‡]œż µ]­x^jĈ ›×=@­zèH4™›ùŞ Ħn Ğr™cÚe‹{ĉfPƒĦ›É6 óqÏĝI׆üPʰ ê§u†B°dÓëà*^€<^*óĤkCŜx½ĵɝZNŜXÎŻÏԓZV ÒÙA3­ A ÚU™c€JÏ=ôÌÑ${QĜ~&Ü1pl뷊ˆÔ7ÀéŭcßV#pHŻÚ+5#ŝ%ŜÑğ6äuàßZƒp3f¸FŸ˘ËÜĵ’€? ÍH‚¨&-b4½ĴŽĦèKÖUDó6e,uCßíù˙QÇQ³Ħh½_bérÔgΠì£ˆŻ…Ŭ²rë7£ĥı4ô,›Kú~A0`6×˙H™"jš½ìeӞÚß<e(ƒ _Qq+Î>E¨ÜÎĥpĴĠ)_éÖËíFs°r’†x k“ŭ9ŞV.& 4…o0×äè8%½œ÷ĉ[Ŝ]›Ûl}RXž–W§ç!˜’~xfZŞ[ĴàÄĴ¸Á5WEΈbLĈŠaĝP4U&‘€ĝĞ7ı@ôMnن>bĝ_ċHĞh_ÔUì^ÚBL|uĤ*´‚ûÊġ‰äñ˜Ħm›ŭDûyûds˘ Ocìp_ĉ NSG”żkjßm˘½ì>ÓÊ³Ç yUMPpyR9²Œëò?Ÿ˜dP*x׌)ü˘'ĵĤg$Éäċ4I Ĉ­UTİ7‘w+²÷‚5H€Î ĴOĜ=“%ëGZ1kß½'=&T„ôèÛ˙7Jž¤eZF[şÏë5tÏ5fcIŭ.^ĥWI3֎â³iTÀ¤7X[ĈͰHgsĥMĊĠMä?ò0™RڔÀ] úb!cgyÙ,³ġ&îÙìñCżl‘!/f -âpBßm0ñNrŞŭÙÉ{Vx™â„àkĦĥp ˜İšİ˘£suíĵ†]Û+Ċ\ÁA¤wŽċRzŻ×Œĥċâ Dc}–ïKĥÊżïO˜7ġîŜzŻ/x|Wߋj;Š\ \:·•<!:€“(e"²ÜڌâéTÜuıG£œ ŭC/PT­ô°C5>%ĉċ[qĴ…cp!p>^C`Ϥ1³$6A3eÇmÛ(¤[›PÉ&‘HĞ +Äô á-ĉSIuq‚“&2Q[x”¤g8#À¸;çÀĵŜZ”‰àÒ2)÷ĴÂŞÑwnê ö­vÛEşÛ“žÙ4ħ„.’ŝ˙D4¨£1ƒáûR˙4öĥ~ÓL8ĝCä%ƒġGÂOêŸ n]£!4Á‡ÒuÏĝSu<ñŽ7€?ŝ"SSìç—GÙ7†Dâ™Îcž[’‰YÎy|Y‘$` C8““FXQîŒn­O•ÎĴ2‚1Ï˙rÌŻÛ˜€ $$£À°î¸X˙A=Ĵ·×{‰Co—400@ĦħN)­bëĞ˞6„„Ż+ŬĦ&ĉS †-no›ĉùĈ=ż÷ëĵ5ÚáĝVŬ|ß7Íóy+HĜl6 -†äyyyyyyˆwëeċċċç¸sşùo›ĉùp 2<èl6 ‚5Ĵĵĵĵĵĵĵ‚1À}˙DÛyĴNıÂCâ0–Í ŸĵĜ%‡tvżüêÜešŜ ô;ÀI9SîÔŝKĤ³Ġµlrİû@"€3a÷p² +Vl9½^ı,bŸ„O+_+oĦâ'£¨üšÊv ˘ÜF)ğñ™_L.ísjġ˘NÈÄÚħŝe_JqxF4ƒğb×dċÔc œÛ6ŠŒ@R°*NÛqÓZSĈܒDUÈ ÉdY9uĉâÊö)<3Î jh„­\Zì í`ëì4—y- ² Ĉ^ĉ…ıD<ĠŒêŝ¨ŝîñŭşûwÛŭğ*ŭ·ŻíßßÛ³ïö—~Ŝ‡?Ûı·ÔTŭğûwÖú¨n?·F?nŬ·\_ĥŭğeûtéŝÒÛ·íÛżÚ|­&ŭğ5ûiÎê¸˙+V÷êÑ7ê²?Vş~­gç=ùúñßVĞϝ ù:#ûuŠ|öPââ¨LïipZ&i-$#ż]xm0:íÂnW.a-Öŭ²?ĝı³Ĝ ?"ŻĤaUì‚0Ô1äŝ^‹Ä5îóÛjCÒmÁùœ} vDÖ^§Óìy²N°1„ïtµüÔO ˙FÏĴE܏Û%ŸSġĤËX(ÉÉıu[Ü=Àìs·Šô ],$4nşêĤmƒŽ³ ñc>&E§ĝçëĊMNµFkĞ2Ğ6Ñ|Ĵ‘ÊĠÈÄ)~ôŭûqNÉĈé.ĦùD1HÚè¨c+t÷OŜïU1İ  à£f¸û  EßœÛrì6eÚù+ìçUíÄë6·2Ìħ=Ö>dR—…ÛżŜgœTÁ˜}YçWbQIşSDä è!Hß\ „Wze7–K Bo˘:FkdĠ²™çÛlĜ ´uĠŞ< hŬŬ’ħ³ŝ„°E BlÄ-`ëŜL­N*Tésói‡íÓlò’:Bèġ›‡>Ş’ž™X}2ûÖÊŻS•×Ó2zo8Ùt˜6_½E›Ghğ=ÌĈ$ÑYYxêFĉ‚Ĝ˘²^˘ï7Ô0à³g\C‚u!>UT“e†Ô QĊô¨›ݽà}„ BfG–Ğ*c„w‘"‡‹]ä#§6/ôFœ˘ âғMĴM˙udloïœ˙!$nİcĴeçŜ´ŠŞŭ 7!e-…&–%·tN’ßR}‚AMJô)ĉĤkœ·È­Bb8/Ş€ñ˜ĤQ}î`%Vğ€że ˘a)ĠÏĵ.ÛK·È4w$Du.Çl…l_mġ£a˘T]“½dÙHqF{cʸ(­Ġ+‚‹Tt” ßÙ4VL%·i¸½´·?G‚–8–wÖd~.À"Ê8=VĦ5cëZK `gJÄPd­o˒ûCíÑMSÌ#ö÷w9fğÈzqŠQ‚ F‡`İñĝeküĠ öĦĞ .oĈĜh'ŞĠ-3Ž1‘­%?qäûôûV­à3 Şıílù•3.cß§×|­%53f˙+£„Ä žƒ)8RÖIm¤µ n7ï‡f*xŒöñ€í/ˆbÒ9Ġ\ @Ÿ0ŝ_)`=Wiü23ƒż3Šòq‰9Öiż_ËïäsOšżœòÒĴ™*9;‚ÂTä,[ĊŻ(h3:ĥ‡6Ğqjr֐{Z˜4ìñ×Li5ïÔ²Ŭ5ùş–>Ä<e`’³`Ħƒ.fäŝWé%Fuz[Îďhx‚(Ħœ´³íĞ:/BÒ‘`hWŸŽ*Šsy< ž“ĉ“òQ…™GŭÙı”e×~pĜ$KXÒż!gıê3ŽÚÏ 3vĠ;7CXL˜8Ókf_!dïÒôV³Pâ˜w€‹Ù`ŽÀrB0TfGĞ˘ ‹1tXÓĵ‰B ÛÜ´Cïwû˘=|ΣQF†›Ÿ“G\´dkRëğ&P@ó§dˆ‰†„ĴÏ‘䍉7!{kmÍŬGß6bíı &J­Żµ“X'$ċ“}62o2ĥ˘Ì1ÍëaÚ 1†WĊ‚ˆìµ Ͳï_~Ği°•hEO#z~Sœ!~ĉóIR{"Žy… ûO{yI ­ƒĊçšßJ8ħ%ŽĦŒO¸dWßmcۀTCşĈM†`Dü~Ĵ UꂒÁ9´Íò.´d§ä„ C6†ûµä·ÍóÎäzËoĈvÚi˙CH¨F'I0GYQ½†ÎÀ^pëŭĴ ÷žŞ,SĴ¸—‡DÙoġ‘›SŜŞò…)á Y—vè)ò]˘aúa}kèo€³ıŭ ÉsöŸuaà£TÍĤ†'ŠĴ<żQ{¤n\şíÊÒ {ŽĴˆ_êzÛ+1Y Š€éœ¤÷Ûáüà9:üïħĵ= ŸĜy°48EÍ}Ĵ ³˘}ËNB#˘"œÈǕğŸ›ĉùo›“­Ġù6XùrHÚt}EĜ^Żk û^Öö½Ĵ2S.ıɧĜÂây¨>Fٌ/~?˘·îĞ—žÍ ìĈó=­äÛApPZ‡îÒşÖ_/WÈf‚Ŭfšôœı WîƒÌööÏħ\^ŜĴXşpŸe73ÙÔúD)—&°ÜžĈDğµÓè­-£˘Ġ  €öY)˙&Lĵ =cw2ˆw{¸|¤ ĠùAR8´ż‡aˆd•d’]}#0v}á„CÓój6˜öôş~˘LÌĉX‰ş’˘İI‚ KRżKÇŻ•·)ċŽ#,ƒÜżêÌp37!Ü4Hˆ3ĠĉEŞé*HDĠúBTôôÁ—:vÑFܒW\j¨3‡Â5:$U9ŻçÎaZ3Òh:<7ÄÈQ6Jä}Zï~Íċ:¸ Ïú³Ñ ïòuşÁµ<7߃şĴ‚Ô}ÚG/ĉĈÑċ83ßRµcxÉxbl)Œ F cċıÚç@ĈċşŭŞ;ŭC9Â6ĵZĤ•g7ŜV·ĤeôƒÂ 7ú³N~!ûÊiwçżt†‹ËĈ—‹ĠB RZ:Żċ'+ÎĤxŭÚS˘­\PtóFTídJà4$gBv·Ô`‘ ˜ÌŠĠ$”İLy'‹ÄTá‹BÏŭˆùْ”0È +ċiµ ĊÑ£Èo6ı61Z£ÒğüĠgŭŒ‚[avAĦ°Rk Ĝĥ-—‰“­ÀdXq04O¨’;\˜’¤Şw‚RpcŠ ACïùz$ĞéÇِˆršœzÌ_Sûĵ‘‘v3s})gÍ,èşbİu-Eˆsšuµĉ[¸€°wĵĉş˜ŽÚĊŠżŻ98Iùcï1D–NŒ"9ş˜Ô˘UšÊŠ lš˘™†rN8İšä9£cÑÔŜüs•„b¤-°ŠĊTbxB‡ëGh §…VKíċK .BÁ³•vVß:ë‹ÉCƒgZšT{Ĝ¤z]ĈdË%|j‡!iƒžÄµú_ŻßúÈ~{]ĤSǤîĠ˙D]ê4˘_ħ#. ZÀŸá·^ûFߓrÏ;ÈÄ?ìQĉĞP1ÏàÊ9½-êŒ''ğ CÏ6^-7À¨/gnµ$ÒuL7:o˘ĵT·ġ“ŭ>8‹V½ot£Ü_3ĥïzè°żà,~i}”œ5²ĵŝzTc;ƒàް'9ú8mTà#ÉÚêá,•^—£äv"òqüÉ2yjS:qġYR’×e”G Ŝ6[ Û _ĵ2Gìüìâymƒ):|‹™FpmĠ´Œ‚,›ċ/Pu†—*COœ—ŭ_‰żÛkċ`T„ÓêĈYÁääԆZCÀµĠi@ÄòK>X†ÊĠAK¸žĤÍò›v :c5gˆ'ÏÓĜ–\(Ŝ>,§œˆş%eŭ^ĝÌÉC‡úvĉÍq‚ëëżïq’ÜĞîòk÷ÁıñMè†1ĊÂЏ¨ŭĤáġ¸éêQĉġÛ§èÚlj0ġ¸FÇÛ Q– •!Ĥv> ú£"ñş!X%ÔÇĈ…W¸SÊ~Y9ÖŞ™Ċ|ˆ°*ìÏl²–Í- Ì˙‹†òÍX{†Ë¤Ç%<7ûhÏòI_bçSšĤlR1Ğ^.öÚKéH¸SpŒÄÌĥĞs@÷V)‹ĦgÓÌÜejN#'kö!ïħŒj„#¤ĠÓ˙ĦWÛ~tŸ³İ\ĝ\XSĈdéz5|)Û5{ÄMd½´àCxéO³0Ġ‹¨Ÿô`h¨ÌĦQKt+Ôú„÷˘ yì!ĞÇÌç­“~5ƒĵknġ9VĉkôÉ̝ıìb˘‡Äç%ƒÂħ@žuW›§|ßpçŝŭÖ÷O·³ĜÀ 0֎AÉ['Ĵ{óĵß>Ž ,´›ÔF Düêف{ 1Œrş²ñ½šËNğly×HH a—ŒĠ\gÄÀQ_ ċı.˜_ùÇh8"•/Ñ­Ü­úoOÀ½0Îıß}!=IÄ=¨m— 2ˆž|ğíşvVµ€îúq}RÄà”0„5cˆ›EĦYŠŭĜ#À|,ÎE´œÒûRsÚ, ÊÛn¸áòäIü{·#A*™RfxaÏc2@– !7ŭ8UT@)¤ż) ó̗Óĵŭ<°¨ÈäğÊÇ[[ħpë`.™ş=w ŭŞĉĝôžl€Ñécğǂ(ÂĦ‘ÉĉìîhStS °Ef ,4ܖŸ`hôʉ^GÑÈdJìuX=ĦJevÎ̒L [a† ż¸+Ÿĉ!7%.˙‚Ĝµò ³YıĥɳŝÚbe}y?ĦÊ^Ô§Ó8œ”˙ 6™ĜĥWŜ­úżr+ЈEb}ƒ’Î2Ž1'ƒt+tyÒş‡c+¤g%µU&· {[ñCp3Z~ı<êG}5wh6c&°(ıç9”÷ı›?ĵrŭYp=ôtşp|VÁBh!àÈMOÏúpA_,€aµëƒíħÏ÷/iS¸ìB‚pÎq ¤>ĝMÒ„I†-nğ9tnÂĥë˙EÁ^L¸À'|çeóҖI>EĞ–òD½Ùa~^^I²C n[lU"°œSŒĈEż{ffÉr ]9ú}›(MÒo8^Ê`+*U‘ĝwİÂ1¤ÁWê×ܵĊ{ž†Ö+ÌÁU:•<-ÂÏĝ᝛°1NñŭĈ!ÜħĞ(Ž 8ü@ uOçÏyµ<ĵyÁiçl-û²Îê´Ñ½6u+äœzĈÜ4öĤQθI%r…UœÏÖ~”><X yċ#…çÇ$×%/Òvó„˘\% ğY‰Í…d:›R˙_nĈ 9ú€Äħ#ĵ˙-÷*Ÿt_Vs-ÔF‹§EÁ9ŭ÷ÏR~Y-›€ELSqçàİè nÇY“~k½ ¸XĉàÒċNF¤îP|œX |šPy‹%ï·˙X²„1 ˜Wü,+uÍ/—[`£ĥik‚›PŒ³™8ˆŻRĉA}?hìpÓˆÁĴüòÇX] d”Ş<ìq"yAĤtYUŭk-8ĠûöĠè*Ot’Š£MÏïî¸9ÇïU£ŽÎé`ħ<8ÖnŻġìcZ™Ff"³[üä^/ŒĈ´MĠAâía£8¸Ŭ/NżÊâ=ڃE7<ŸÄŝ™bT.ˆÔäœê‹5ŻVeD§š}ż†ĥúĤ'ѤeT÷òĈßçM0EŬRW*âÑ#3ĴQI,yl\BZmVpÌӒiZgŒàŞoŭ)$Eì™`¤M0|Hs)K˘\.£ŽŽÉçK"ÍÖ<ÓÚî>štôc-·Ì쎸ċç˘ĊôÜ_"Ğ˙avèŜzÉ"bx^,ıO\fMµ’rÚ ì4eü´*ƒĈb›ş5£Í4üĊΟ\NQĜqÉziö´ŠÛ\Šrµ%ËèÌM×4’oi½~jċ„´|jĈÌr—h…ÖŬtÚÖ00ï¨Rr/ò•q™Q˙'û!Ŭ{†ï’)wĠ›ì,(̃ĉ,NZó!âFÌĦHß4a:‘&K2C÷½ìw"ç½ş /O9 b^ Ż ñf~½9$>8Ġš,§{ĴDĜP ,tÚĉ/o,ëNœ$\™—ĵqéyjŸf„•Á9˜˙Nı[' Zĥ§EĞiŬuÍ>äPıÒ²ĵi‰âôW¤Ö/Kĥ™òPċŸÇŝO*ÖY–d>Q[ ĴDŠÜdâön4HŭkuV5‹“Ì˘EŭálÑQŽğKE0^Ĉ\Ğ٘ÊY¤‡|™ĦO’ DPŭÌt ü X…E &şú*ÓvÜ:úêÒ½iàÒìzçYŻ´˘Es* żğî`P*Ò)‹i-óݰ+‘Ž1oÎÈ| `Ğ4íçżû$ YäfUwÂ‚ İtö,ĵ\›ĉ‚C÷½÷Qt 9RU ˙1ħ͘5ĉ¤XĈ,8W^ŜŻĤcÚy½çĵçšw{Ùêhŝ‹¤W7u³È †m‚ĞŬb÷t¸ï[Ë9˙3ˆ]˜[³oôz~°Ġ8ì,…&’,p655;ĝİq A€úĈfXob×sĥ†ŬğGŻë$Ç>Óß,NAĤސ‘öùDˆĝÍżÓ·ċĜ&²Ïj0*l„€Dqä[&€M‚x›TîĈ$İÙ 1he„@wh0j8†­‘Ĝç"0Èà+D[5< fó‚àÀá öâĉ‡Üß5e|€Š5ħßF$oÄ8™1p_Ĝeˆ4Œe’#l3†ŬíÍéNÜ"~¨qY û"°g+q˙oÍ˙yşżKÛ8²™8êSo)­,\Inï‡ĉ’‹ó²â‡kj= BA Ċd ŞÜò |~5\IŝW,6Ċ jCkċ4 ÛÖˆaŠ`qŜŜÉŝc…úȉä7|­˜Ó'ġh“Ô€·ĦlŞÂĝOĤ—“›H5™ëÍžtNĈgf`ÄLj4ïÙ ]{ŬĊŝfġQß0;zĠÁC“ÚŻA×y6<_”-˜³°Ñ żŝ_VJf›VġœŜ~Ÿ¤}} Äş3…1÷œŻ=‰,ĤD£ÊGä§¸lĵïFŸdóı80Kœĵ!!‘]˜wL˙AŬ‘Saĵ²à<.•#ĜÌQ2/Ż7£ĦvWÂ^£Sŝé¤IxÒñ­7Ĉ ŬC|ŜùïĈn0‘ t›>ĥ×˙7 A$xu%^Ŝ¤ ù?PACÀ zĊ]­4ˆ™+F=„QʂÒD$ER› ûz{J×'Ï÷]ŸñWúĦuîŻ@ÛVİħùùa2tPé EĊ’ġĈlVTĞ`Ĉ@ö Ħy‚;Á>;??&Àè"DQŠëĠ‰”J^§2ӘŠĈu:Êğ #guO8Z¨6£ÓPİzìEĥeóN™m7€WŠžYŽsBÒ-l5eá2@’lŬè/ŝÖ aĞ2ċż~naŒ•e½1]2ŞeżÎċb‰ĞßĠ ĉ ÒôèÛє^ħwz|u^,̟Öö›h•qDĉZ„-ċ ËŭW@63³ÈÔRœm‹ößŜdŝ‹şX@Żġá[äH󉄢–Ĝw Àİ䗎#ĵ&öÓŬ+­aéĵğŜ^ËÊ"`ä9ĜÁcrĴ:?túgzŠüçÌ7ƒ%ëÎÍQPûô—*/ Ŝ)Û ()ŽŒš! ĉaşv3áè&N>BĤ¨0/!%­Dè¨Ñ—|bžĊ¸Ĵ}È·´Œˆü”U(ŭEÑ1˜A@Ĵĥ´ĴĊó÷~£—_ñ…‘£Íô) bÜ\ ӄhnd“Ü­my¨X"ŝPƒòÙĴż‘tˆmĈ'{ŒÂkċùĴĥžàŽSJ-ârüŠöYËiş– $А”=1çĵ(ù䨒ŜìdJÁ'"wSË"-„Ôtġ *@#%â–Ú9×Ë8 ߓ×pVœĈl3£4ĞwĊŝïS’Îß\L‰¸O鏸dN­ò1מ‚'–L'eànjŜK¸Oí(3 hˆšuq~€¸ıôêW›/—”{:³psۑySÙ5ë}Á™2. [ éeӔòŬLîë;èLàŽe÷[´êù>^€[‹Šù]öK”‚ÔĊèê5şĜۘ9K޳ӣ}Ĝt ñ•?;ÙċJf +"œ„NúRƒcá÷BFLÔ:g<|~ÇtÄ:WÍMkÄ­‚ŜXž­ÈgDI÷Lşá%¤S€>%ġêıW]›ÀFŜlPjC³š3N›4ĵR\é!-×öR݉e¤żŸY ÍËġ kĥyFŻm$ânĠˆç -ŒáÒä7Ż2´ŭMI;*ö×ggû)œċêu˙1…ĥ˙2Û gŬO¤ġS'„öİGb÷_•ì:9žPĦ ž'h?}c?ƒİ¸B'yé`è5.`ÌâxÓ}X;äÛu %:LûJġ·ŭDaˆ^&ï­KĥËv1& ïŞ`ċjx!á9‚ƒċÇmÇ´È:CÖN*i%ċ™vݞÄl£p)ô€ĞJʵñ4ÒÔ¤0áŠ% Ùts–T¸kvĤ^ëx“2Cx' #×|ô,ÓÇݸŬXjğAuyΌ9XR£>]9Gvë’ßú½ì,Se’Q†Pĵ€÷bÄÜ p}ˆ¨­ö„a\FQéÌĴk’6ÍEñ{cZ-MAÌĴ(]²]Íş!`€PÈè†Îş+e`ğ•qŠ ƒŝ?}ì!ݐÎ/³YА8İ.ĈBq jUsÄA ĴH0R=|Qsä]uT6qg{ê‰ùĈž=óžjÜ÷bŬ†~q¤ž2J0nj,ĜVı”!p’7“ƒӃQ>Ñ{ëbtËñ`€ˆfĈ„Ŝö²PµY²]H9µ´ßmĴ 8f€r ɝìŭ_ĴO8D&Hˆ{é˜öx&ĤÍĝVT&›P›ÊɄÍ_°o˙XÚ<ˆÀ—ĥadÎ7m5‹%ößı˜ħt?gAŠĈ"ÎĜ•ŝJ¤x˜ĊĉìÒ/"ûMVšĴGÊSšÎ5ŝ˕îĸ³Ħ0|Yž +‰Ĵ^>lBĞ+³†ĈhċC˜°-íŽüáa>Fn¨ĉL}g=ao\Á™`uá]ċœÙÂ>Œh`£(œXħb˙vÀhMҀ‘d ôÚY‘Ym5`Ü(wĞQrĦŝM[s›oóT-Èke°ëD dŸŽ$µġ0â‹,ûÓĴ4â›ä0 삵Z6ûĈ2W@ċĤ ä}˘WżÇ0~vÇXêy;,µ“³Ŭ“Ä 0ĉÂĉq†\ĈÑŒҍÈM)ĉŬfÓ*!;„}¤½[†ßÛô„räD+ô7ç `çITí§£KFóG÷ŽgQÎÛ73dWj"Èmr”> Qî¨Ê––Ĥ‰ó‹Yž˘Èqe^XëÇ]¸ĝi äkh˘X–k+8àÄ_ĉaçĠġğš Qm˗˜ħóîôùLĞ+9[Tž”İï’ı··-Rí1nêáüĥ gûîZƒ›Ò£ŝöú&Ô½Ö{ñÑb~se –kİĵƒ5A÷úŭĈ]A9ċİèĤ´1òô֊JSJLQ‡ÂÄD9ž‰ °Ùs;˙yĊ) –[ŜH:ŠÚüħ,Ŝ0ŸÂxb¤]ġĖİĦÙÏ ×qdg>[Ê\•É’Li¸uy-X?³‘\²>žèf ˜ áq#‰[‹ûJV~—ÂÒö<ö5ş™F:>Í „Úħñ‡s"ş<‚i‰ê™zê OıR9me2ĈöTÉùQšTìƒŭt"J˘ˆ<74ŝÙ^^Š™ÔY=˜JaÇŝş„şÔzGáx^ ZŠRœWA÷Ü(û2ıïĥöŞĵġélÍ`ùŻñ> Ù°ñUk‰Wˆá`—îÇÀaHäĥĉ–`@ŞġÌĦf^Ż:˙\{eBü£Û_E p+óìÌ#hï†ĵÒŭÎżIĉ8•C”K>µÔÏĞ0¨ۖçKİî8è2ÈĊtIN< çZ:Ğ|†N ‘hŒ”´Ró˜KCïĴËwğ€— •ÑĠ§œWä/qĵÇĴƒ­s’¨œAfeŞxû°EĉŬmÙ0~>éµ6knŬô ċéĞeÙÈĴ&-ÀMk#ÍHè³ÍùWa˘ÖÖ˘hq9dÂûzœÇ’Ĵ[Ŝ§ħ1Û\ydhêı‚Úu‘aûıkġ*xŞ%Š[ˆÄŜ"gPEŠĵJñ˘Óù­~ÌE}£×rĞ Lďˎg˖g$2ЈÒĜÔöËsaŠ˘•†›+$à6ñR…ٝ?ŬQ``žğŠßêjaÇ,?G“Ç÷…öÙ#¨öoż}Oĝ­w~~ DšVÀ5Àm)Pà~l­b:!ìñV!‡XNE²€HX-À£0€@/Xôĝf&li¸Cç†RքÀ¨}˘żÜXŞ @ŜLQŽh²&ĝĄY~ĥÔ?˘êÒ3ıĤżs¤…ǘ(yKÂ-÷Mšċ„TÌ7”r·ÉÉ}¤e1kqĈ{ó;r$èIÂxqÍ~žÊü.‘1út;Ħ¸ ż€ uҀX23"8Ÿ!Ê…•ÓêêÇújÇèôÛŬ\ézú€,z—„wÍBŻä7bĞhĠá-t†ašHâ-rP #îS@ ‘•Âà–* ĠŬ=^kÀRÒqJ =‚T1¨2u•›Çi ï,òÜ;Ĝ1V dìü6ž)–•@Ĝ‘ï“0A=;?-NÀşÇÚÜı3jvê›}+ âĵXQY;•QĠ}446>äg'iGx;_ùsÌ:Ââĉ ĥmċ—œêv{£8CB}Œn˙\íKaüáĤU²Ú †14;b|LÔġİĉê­â¤CDöÚä'6²³!eOΝEŻêJĤ잰~qèĵ_šŠïL­ı+~ÄdĜ)ìJ7xT˘4*^œ {ĥxjŸ V½öNĜžÜߊ˘×Ÿ ÷Ñ@CfY]}ւ̗aÁÁvšħ×Rùĉ`#°!³­â³xJڑ£˙îµPzĦ֕¤²£ċ ÍV?[ŝÁ*<Ĵêû›mȂ˙ sħ ¨ˆ[óFà˘­Ç4H§ÂĤ?İM‹½:‚=cäĠXÏ$="ÙûÈábXs% zKSE"9=;ühŠI&ïXˆ–†u?=‰¸)Ŝ°SJcݧĉQ[ÎG$;ËCúp ‘ùš4ĉLùíáŻŝÌ·‚İÏġÖÓ0àLż{—Áú17‹ġŭ:ÍFN(’÷ˆ·\N³eŭMW rİÙÖµ8ñtŭFsÔ[ĉúGê‹d*T­È,Ú/}Žp=)}ĥ³à·½$Q+Ë粝ùN„.nwŸ½ÓüµğLrGÇu"‚¤û$™Ì äџĉê ğÈĥq~²%Zbëm,x)]wž2E§C(â–BÚ9Ù ­Eù¸YêUT×nċéˆ=Dh†%û—s ‘Ò¨ÍżĝŒoc|Ğ.7™2â‚yŒ\ ¨ĵ}ÉħU½šËêíMĵ†N˲”!‚Q ‡UB —ù ‰ÜÁ·Dd5>qÙqĥşÚĈ I ˙žxŽôÇT ëêf”Áż]’gÎ2̚şô^ÉNiwr˘@‰ƒ{V×Ċ+Ì@ħadŬöñı.pmó Érßlc}eñÚqĉƒĴIZ"⎏íeÏÉIAòÔÑcá­úžz }ŻßWĦĝïħPşüiQOċSê>´6iîë;"rżá T Oj& pgÖŬzM¤EĵvŽÂÚÖ,‡ÜhfĤÑöÛdf´ñïs‘ˆè¨bħ”'X0èòkwmĊȰL0Dd$'ċ–ż–X@c}ÓɕBŝe1£Ça-ÇÌ.˘ċn§ĥzÁ \tŞY%Fà‘·^¤‚żÔìґb BĊ/sğ$Žr=*§<ÖîQ“_™íŬ`½Oğyħ£òpĴgĴcá.ñŠŭ˙ÇĴ `ìoUÑŬ+èm?ùŭâñĞp ;ë´²*3j‚cWêżC¸˜‡_ §ĴhŠâ+Éĥş.V”³öÄ>`!@HĉĤ>Ş;‹˜ßĈĥÍËDïLĤìĜ‘Œ>é%>}Xœ µ!Ò“‡k…J”nc–Żıo\LĴġ‹ÛZ„2,¨äŜ‚÷™‰Ë2û’SÌJûsaÒ÷e+šb˜¤Ċj‡Bdr×$Ğhò\ž§ĊĊŒÎùùµüTŞŠîêŝŸ.¸miNHĝhµ @[òQëU/z²sS.à›3W,Ÿçüğóû°µb)Ÿ²µtQç[–ùèhä=‡q§9z/5îĞ^uK‚—ÀÙD)6ᕺıÓU½=TÂİJgĝy?ïQ Cû ×+²<ô‘/VaU‚µ§òÊġ?cP§Âŭk 9$×5v6âóږÁ°µAôSĤ텚/çêž}oÔ<ß j¨3³­Œ?üêHêÑb¤(óÌï²y¨”3u(„6Á(°˙s9~>&Ò½ğŒŭzĜüÎç, S"ŒtÜ\´ˏċ5Yxpî°Â5„§1²%Üĥŝœˆî–ùÛR–xĉ 1³ñ µ‡i—YѳÎpú.$Ş5İ$ƒ<‰e'şÎö.éô•‰Ĵ7N:µá½ğÍĜĠċ žšf3e/Á4÷‹uĝ>Eı?ımoA×É."gŜ”À’çƒöġĈÀĜêǝĵŽ7L9٘£ <ͳ&>HŜû3v˙ ½O%ıˆ9z^ğĜòË5)Ĝá=Yġ‚bUŠ•T-́ì#“v•´‹WĞħŞK=aˆZ'ŠŞHnĜDQ¨R¸ë+Z*öXz@v*ŝi` Äeô–‡ ‹ £BĜ3• Šo Â İö#ҟoÛ@÷ÉüL}"]ùš ÇĜ2›C ñŻhLj!Ëĉȟ[„g£ġî~ËhÒG⤛ñÁ1ù&°Uš² ¤¨Èŭ·™á’µPPŒÖÈÄ$Ÿá ŠV†Œ1t,Ĥ4!’\ËĈêĊ,Í?Ż:‹ù²ƒžAs৚9ŒŒùĦ ]LYf:îñ‚<çˆÌò™ %Úí;Ú:0ş”Ô1¨”ëf*ܜ‰ıFîBüN û3…á랟Ü"Ż­|Váñd(bgH-.JĤħıŞi|1˘ĈğEˆ=8$ġúC_0³ •qêM´R‰¨-Ş&m˜ÑĠûB-fYd_ӁaTŜ¨êA”Ħ‡”Y¤_-m\ÒĴcC¨ÁÄ É|Š}Ğ:ۀTµ…]‚ £â‚3óm:YlĞg“RÁ\ĉ÷‡aHĵÜġġëñ†`ѽ­ġ´%;TäÊ4Zd§Ôx2#´êl$ö,ßZ= Ħ"­”Œ= yŬŒ2Ñ µ°ĵdŬnó'³‘ŝ>lá,ï_$Fx]gä·¸mOÁÎÀŽY³&·ĞN§edo[êesvÛĜ£ȽP7Б'›ŜÊı­ŭ}%ż`°Uġdvœqnaz“LûŞĦU‘{d`ÙŜâÌ÷f·Ĉ$LC"ä×ıj“çš>7ŭ:Òİr–GÇ˙F²^7ĥ}{‹™‚/YO’95š/[d24ŠZÌ Ğ„Eö@ğ–JÙÏÔî07=/€–1z XĴ°ÑTż(’ûżĉ´ïÉ@PĊßË &SsMJĈWzĠ@Ĝ#BjÄ ħż 0‡_kfr`ÈÁ1MôfÚÑ´C˙e3F\Hŭ$böĉ­ 9ùüĈ‰d (Ĥˆg7޲û,ŸŜ[€qß_ÚĠ?ÌDŞ%Ôܢ]„lİ7w´ûv/›ŜŜo?#;òŽYÒàyóĈoJ/.]!˘Š„•gĜBڒïĉtaA?Ÿ<;ögS =`Ĵ °™ÈÍü.ñĴûK²ÉMì>‡=Kë¤ì_ġ Úàú‰lLZ=g˙ Ĵ'y÷(ŒC];ş÷êâK‡ís„nC‰{¨Ş W4°šfPO9Ŭ˘mIèB`%ÒÓAH/5údġÉn™£›iĊfW…Fñ_?A?V×ççêëġh7êŜßÏÙŭEżĞ|ğê܋ê*~­{ŭ½_U#Ċ|ûĥùúÓżV™żU½úĥ“ġiƒ~ĦßĠ°Ŭġl5ġ?V™ŝŬ•ŭ´× ùöçé.~}äüúßóġ3óïF_!ŸÏÔN|ŭ3Ÿ:çŜ·Mc䯀ââ¨Lïiw\î*½%&é÷Uk>rí7‘ŝ*À# +ë²xëHˆ1tĞÖ#ä_°­%‹Ì:îÜ/8çe)AgÛ½ÜÇ&2kwÙĤ“˘B­Ż)Ô;Ĉġ‚Ö12ßùĝ RŞ_˙wÓX…ÈNü)½Ĥ pXwŭôÇ Ëü;IÔ˘Ġl=ĝĥ‰";jš8Çàò’äŒŞ0<*ÍŜܢdŬğh2|€ğD°˙b=ÜSÛIÉ|òŸî=Ĉ³kVqHDò%£ċ{Éŭ=ÇÇ_‹ğ³ĤİÓ²ŜÄTĜnüŒçΞPĴŸĤ‘ l÷ïHˆGtĝÈu?–TŠSroĝdû 8˙6F;ÛXyÀàŻŻĵ,ħ`˘&édşĉŽş•Ĉ€À2œIp.~’ üÄbn$ÑiÎÖŬDQ‰ {&’3À=OQœĥC[‚´zš‰€˜ZÖh=Ö­qĈ {sÏ]ˆL" JuûÈ#IÍ)én- l#íĥ­§Í[ ˜û‰S€­ngˆó•ÈŻ$"†ÎTĥÏL9£9ü è\;c‘éQZ5ĝe:CŠí´—^Ô aĤß_4$Oß*Œísô´$/ohŽ9r¸#íRid‰÷ipò2ù:ŝ=ÔÍ žżÖFÎóżĊ8—¨a¸AQ²|\%Wî€(ë~Nô0y‰Xl”„·`•…ùkÛĤ‡úİY¤†ĉ‰¸†…•ì‹À”}pu£ˆ`ßuĉG³äÉ鋳†–Ŝ “·‚5œ•ş†ë…ïäQ­İj“­eᙠ“•?sĵığ~vٌlĴcé|ÂÑÖñ7=µ’ fL‘‘̍Zƒ*îĈ[HÂßä0 ½ċž|_‡Qó§ËğMé9!ôıӕô˙/  ˀU^œB’ú€Z]"q Ĉ\ÑŜ*5ğǔBhŸ?Râ!NİPĥÊ t—˜µŞzœákÖ{úTüž7ŭ G:Iµ…߈IX:àN°ñ Ù"ú1íS3Ñşì žPi}Ê ™MY‡ôî{Rĵ˙4á ‚Ş^…*ğOYĠ8èÀ•Ê<ÏÈ8÷0óLsétŬìdŭĥ˘ß:Z<0ùğH=Ŝ"á^Cvúôg¨¸S~˜§ü[ŠÌ1p§$WìàÜ@gd½şö6:ĤßdàQĉñ˘Be›' {ŸŭbÓ´.{œ'½ŭ}‘ĴNĝ ’Ğŭ/˕{履”<Ó?NnÍèš"³ĝ–›Ï]§ŬMĊžn=ámbŝn]NÈ#4 }IşI'×ħÈv°;ey)äpϵ.Á x¨ˆ7úfÀ-Vr ċÍۈè8BM,ŭŒms)zÁĦƒğE•U'ŻÊ€zĵQß+2-(b¤·1m Aω4˙nCĥ %JɓŞ:´j{¤Ŝ°ž—èM°ĊŻ1Ç*ÚĈœ†MG†ċ”OĈ°³YĜĦ£µĞ†#áï}6 d•W˘ÓFq§ñ„ żöâLŭžs/âqÇ%ÚŞŸžžċŜ”Â+§0–Ğš‹YŞÑÑÂó=ÒvÒĦ{bPŞ +ïHĵ„µ˘˘‰ç„ƒQÔ ˘jŽiVàùëĈÁ‚ż ˆ0ŝFĦu×Ĝ9ْ—ĜÙ3ßüݰµ(ĴHÜ öm gŻĞHeâhàÁ<¸Û ‰‘ùO+ŝCÇÉà˜ž“üI£QíxËŝ{df·%a)“¨ œ°F×à@D[iÔÛ ĥĊçwŽ…c‡nI‰È Ÿcc(ȅƒ+È.ĝ>“² Ukû6GÁġEżí˘îW ĵ=@.T_¸İ¤V]LŽg8Âyiuĉ§›Çŝ†wʜ?Üà˘ä,´¸‚H˜ħÈ÷´ ÙÁtlïbx3âò Š+;QÛœşTf,U (ĤĴsˆ†˙owyż…ñçEU³·ÓN9~Ç>‰N!à–ĥŻ"ġ!!âÖDH:Ë(˜(ŜîŬwûİ0|_ĝl‘÷7wkà˘½š9ûê]'píKˆlÁ\½ĝ½P ÊÇè×{C&Œr·+>wWĊÉÁ?ëLc„CbĜl‡‘ž'!.Îm ƒcĝW?óoÖ>ÜÀ޽h‰àn•‡öñĈ` ,ÛVú_HÒ1“E1 @84Żŭ÷´Ë}í·R$Ï&OĦĝ£-ÇbÉ#%Yo5£Ħ0ŭċV½ÏU@'İA’X9ß%c§şcv˘x‡Œ¸#Qĥ,LqÁ˘—ÚYĤŽ–âö£˜Œ“ŜĝLÛÀʖĵGAb ÊĴ4–YxO Ġô☠7„Ĥ°³âoùWĈıkAhÌîɆ 'ĉĞJYœ˙:x8(–Ú´¤ßŠê Yqf|IäbŒó\r,Ù nµbÜ(ż†ÇVNèÁ/˜Q¤}?…çÜjİ4~µê5cÁ•Ÿ›óûiÈÂ႘Ġ b&ħNÒĞP1ÏàÊ-Ú8H0 Â!<°ĠżFn! ĦŻ#mĉ{_iġ˘aë0g~lbĈ…˙LïYµFX³‰,aá[uó|ß7ÜB*Ĥ><‹*ħLQ,Ġżŝݰï½çEBĴ)˙QÁ1Ŝ)f€lT‰ÀÒäY)yĴ€RŸ3eNœ'£İ;ËÒTÔÇSOè~Ĵ œËµ—•ÂŬ¨~`iZ OyĝŭݏnÇÁoxŭ7óŭ~BZ{¨ÔĈğr£Ì€(5Á1•é@ŝm•ì½LJšLĜ0tƒÎÇ1ĥ9gIüˆĊÒ§ÚËف‹#™÷˜VŠf›<ĜVÊ*g˙ “É–kÜş…’'µġ$ò "YU‹W xH¸KR%7Ŝ ÏèÀÓµ÷S³}âċ—SÏdi–Ñ%°X>ĈÉdžŬ˜ĵ˜›‘<#JĠgÊRĊäTÒç’нóˆŞ.FFƒ€=ħ$x*Ra Aŝċ-Ô§•Qpŝw?—(Xu$mחòŒÍ[Q˜µÜŞÑ”*ÌŜË[żWàÈ1ÁQ÷˙6Ä=ĤTvbe³ĤëPGZDYÄXÛ4î'ÉżP0Ŭùşkĝƒ°s ÎöѤ‰‹sÊĦ9 ŠB–((é0á7úׇ­ÜânŽb·ĵ+40ŝ:ħÈĤùâĵ.ôAŬ4›çŜD_N)B0˜ŻeŞ\/hré‚ËĴ/÷G¤³7sìÓW{“ŠZà̍Ħ /Úf÷µ}"˘eÏé/ı+dëY5­ &›ıŽ!F"ŜџÙBŠ}CLŽŜ£Rȵ'Ĝżb‡.ġüĵ™ÒìnN IóNZ˘ğ]Ç[˙*…ËÂGáäÖŝt0Ù.PUvŸ–dĊ9Äû&ˆâ¸Ċ,cD ? }tO½6# ê1…_Ž~”‡ ’‹ˆ ᢒˆ9ÖÖ: ŠèT'l#ûÂc'ċşéĤ0Á˜HĴT(1ìŭÓyÊ?; g.Ûñ÷qˆĥ†Ä°°Ĵn=†“²À3´j€éìDġ †œ6.v ä•ÈC š~LÊMħĝ_„ca?ŸEߗ…鈑ŭwĞôfR²Öir\İ̙Ħ£ÈĞĥ]Vu" D£“;-x-{îQĊš˘×}§Áĝ V 6IŬEš™ş§W ™Ô˘%K‚ŒIö¸×ĵ QÈ ×÷Ħà³²k£²ÂX=Ħo›ƒ*„ĊñġËZùsğÁŬ·/Ì 3ĞÍî6€ÈÌÜqNĠuiwÇâ!˘E Y((·şóöêxMBixëàŬnJÓ;˜+g£œLh‹ ”5d<=¸xŒôşU‡Ñ”¸Ä–üÙ0Ħ‹ŒĵœĜ­YXìü“3T†w:רI€ £AĊŜöU×ĜŒ!YŠÊ 4êîXŽû,7ÖÉdEĞpĵßKÑ{oZŬñüYŬ÷Ùêûd+;‘z´Œ`†} SĴʳdÑa”f£dZ)êËcĞ÷_ÍĥĝnUɆĤ3t×‚p\'ğ$2·€·Í¤áxӀQ=ÚO˘´h(˘]EzY,ñ{'Y˵ĉĴò!öy/5¤`I<0Ÿ‰B à×1ıRŽPùu~,C½ ;*rd~+ÉĠ„a<Ġ¸‰KġiŞ„Ŝ€ħÂîëUL ŭcġ˜´'µû&ù,Ü!`*¸[ĈÜ`nÜîÏĞñ“GìqNB^ĵâÖcDĉX\3a.ĝŝ)$›=À½ŝé”cĜ {Ça)ÁTà2ħgo½]dèĦŠ"[‘*jğŽé>Yl>Ŝ2M Ò QÁĉ†ú²,Û¨†¸U0 gġXÇvX­aĦZf¤ġ„ĵ.¸c èßĥµ×)79×sZ:–'ş % 6­ó žĦ2eC¸ż(ĉƒètŻ27çÖg‰%U³wAXŻ)ˆX(AÀ*Dz­ŭŝ„gJ ë@Ê`²U;,GSEE}W*8A³+.pÎÄù%GCŝĉ?şĝüö>#L· àĝ„JQ“óĴÓ37÷Ĉ³Ĵ<´?O¸ż ĝ^šäâön~ğ¸ï†Aì.³zO"ᤋĉï×ĈXÖ÷ÄëvU2]ëŒ&6ĴK=8˜vG†QŭTŸ$Ë7%ğäËñÌG…‡ĴĤy’Ì Î|ı:­ğJ˘Y0X>SúLbË> ħ{DmkXĉĉJ‹Sƒ§àŸ[€ïPĦkLí=]KʄvŻĜ3„žrÙĠ6 4˘ˆ€C¨µ5jòA6èäl[àmOñ¸]ó;ÒmġˆċcE:qIR]Şé°"žfö͏HÁÇ=Ú>À=ì?$a†9Z,µĠSH]ÇwmWÉĦĞŬğGŻë [:[„:ċ͛²2#Ĵí5Ğîô0ß²O’ ˘Ïµ‘tm]_ $$‹0†%dş2ñĦħÊ ]c£ÛŭbÄrŞëžX ;¤")HFĥLUß§ċ„î5ž'ĥĠ6“ÁMDìX?\K˘SgœâÙ|â{^ŜĦw÷"ĴŞ’˙3ËR-Y*Ş×µoléĈİ›(ÏdÁ¤éI;"ƒ¤ê„aä‰EŽ%êë(ĝ;BhħCaÁv˙Xè+8÷Dƒ:ûÈIÌÓêLSÉİ[è§_–KŻdœĠÏv.„ùËr`ĥ/½bƒµlìOJÀÉ6/×yt}W=ùġ·‡k NjÀ9äs§n: úƒ=A³2,Ċ–ög wË Äoñûïw‡TgEف×ÜdñCí‡Ĥ ììÇGvĈTâÌ´ÛTF÷ˆ ò£Eġ<ۓTg2”‡ë_G/'fâêb6h=³Ċ´Zĉvú›%ú™~³M(9`é%żÌĊ!ÍÏ§oĜXWj£¨0F§|…Šô´6yH‡iı%‰Y‡TCC€ä|cžùáŸe­Ĝj°Hm‡Ğĵ³×5Úċç$ *ôiKìxšËgž“}†Ġd&4:8‡ßğ%ÀrŜĴĊĴĦ€q‰H@kÎİr!SĊ뀈c ¤LċċeM{‰NŠäÚŻF—6ç4L¨eL $R”ïżL[‰Œ„ q§‘[ûâr„täĴ^ÀĥÓ_TMŭòŻpŻS?äŝïĤn´ƒp&ӛ~>úçÀ~ÇòHxXžôd!ìÇ+ûµ¤ñŻê¨Ž1ħU´ÙÚ'\kzY$lż! Ù'ìrpÚµlúŜ@ÁñCäÛ ]£›YWGÒ¤èaXħŸwÇ£üá½˘çÊ. ö~œVÈı/Żġ‡ äİ)—ŝì2“ÊßçµÍnún7/\ëéèj!ìa?ĥ‚e×ËCş,ŝ1¨”Û% U·Ċ@KäEˆŒŸ†b‘2Ôî>³QûĈĴwē1* l0ĵa ‹ÓЏĜÍE#?L˘ğpµĊÓì˙€iŽš)xO ¸k ˆPöĞ•e-פäÉV‚3uñ=ÔEŭá}˙•ëuŠŽ°S3ˆl04£PÉàgŝ(‹ĥ!¸OÂßÂl8EjC%Ëi£Í@coÊC?%Î>ġs…†;Ù]yaùŒr­%ĊŸ%ò X.ÊÎ.0V8YÑ àĦó{…„pġA—„HZ­u9ż0@ME<§U˘ZÉÁxX(—<*"ĠKäĵMxÌáÎ3™O‰Ĉ=Ĵb„@__ö”l‰ŭ1Ġq;ˆÒ#’@${ïĦĈ×"rQ„ÜġÈp§V­äż]›\ŽĴBâĈcNAżÜ•ÚĴ‹żÇâ&Êĝçï’Nuqnŭf¨·6ˆ­G&€  ĜÚHéï£ŜÖÚaFĈ‚ĥĵsÛ#8TïĈ)€d>Jü°ċ~œÒWË}2WÀ͛ŭiíûV?SĦğ€ MĠHÔ½2Şò…ÄĞnëBxVĈàdNATXЈ[z×Sìü9<û D“ɵǢ0_ĉëĜpì5pCgU˙+¤%$\ÁRê–$ÖÜ!S[öÄÌpó÷_‘^FŠ—{/ÁOŬñ hé`è. ĞO“4,/~Vž> Mö9ş"÷İ@mùäD”3=9鍞Qš§ ˘cfÌ%V]fší=€Âİ*MËY“5a›wö{6ŽĥĥF¸˜Í½=[VßF--Ä2uâa\ŸtuáDĵ‘b€.d²Í…XÙ<Ò*žë‡˙Lİu‹¸†Y£˘oGVGìöôy˘Ĥzo ÒÚT Ğräч&ż³÷ÏIĥĤ$˘ Tèc2~­h!íX<7a‹ÓÓ~+“ £*'’PëÍàêNÔ°€Í”f{˜ËŽ÷¸V¤Ö ó ħPóÛHU¤ĊŸ}SĝN˜˘GC‡[{èWfçŝpK‰2mJÌÂżúċĊĜ;’‰ĦìQ%éÉH/mAR‘ŭ´{ô•œġ¤ïŜDİ,uİ[ŽñSÒèżlÍÀï ßö6Ş>Pï}ñ:„`° $ÈŞNt 8á]Í÷bT"$3š¸˘˙zAÈ_ôŭŸJW­¤W˜ĜPZ™5 úÀÒĞĞù1†Ĉ@ÔGÂêyĜ²À×`/g×[+µ³ŸµAîż·á]½@Óıç]°³˜µH:jXD’Ù+Á]L˘Ĥló~Äv‘A½Í²))FÒ^´9²H+̖N>R¸_Ż6’TeNîDġ´K* U1ĠC<Œ·[ğIèġà—ĊŠ˜/¨tE·ÊGÌIUDÉQ.ŒÑ·›óĵTD>d´öx0êgjb çĠMùKĤ ŝİQ½vT9q”{u/ˆż&Ä*ò™C7³ŬïywpÈU?Ž:pĥz”W ÄÖ W"eÔoÍhÁ(à=ĠŠıA(ž´ŜlµWKvŞÓĝ‡”ž[ ÌKw§]e_µ–#„jÖÑĈżMĥ[ž|}QñUráIs'½=}Ö¨&ò,wGûbíŽüEKŭLè†áÎĝ›a ¸úGŭĈ ŭf1íaìû‡e>wX~4%A=÷³] ~áÂ@0,ú¤ĠI^›eÍ %ÊC×ÈC #3é­¤ ŝC3ƒÌOĈ—ċH6~ä5Äb² ú°ı×Ċ,rH€ĦµÄ;})Ô-çÉ1ŝb‹Ú× '‚³/ŽĠĤ'uö)lĊ‹½ĉËV ġŬ4”‡É.ž<³°ċx9Dv²=_ÑŭFîzĞùtĴÉvó3DħĴ*‡{§ôVI°KäÂT?·‚î[1<蠗v1¸‘ŜÚŜDÚßGHĠ³Žq›I_LŬf§koıt™j˙;š0gÁ:ıh:ıŻÉrxçç½kôÖ N0ĴġÀVžèĞ ™ÍèYQ§ßİùJCr5+{WÖj-}Ñad?§2A„16¤FC½ż˘éÖĠÂG)%ğÉĦXĠžëËpzÑë–@×£òkğî Ü(31;â€3ßo’ôĦË'vœġĒò°ÛÜ΀¸Uäw~&‹’[ÂŒ“Ñâ•óH·ËZ…ĥ=5 ÈèÇ÷ö5ş™F:€ë^„:üžE„mOĉ˜ =ÄiYKh™ó„R†ÒŝèËç2É@‰ÌĜ0žċÀ‡–—V.²/”×ûżĠšm"ÌĦ&Ě7Ŭ•ú˙xx(/Ŭİ€Êúı~ġ#îbêG¤††Dğ˚iĤYħ Zä÷)|b~½€Ô5ĝ. ‹ –3âċžİVŜRĊîúŞ:Ú7qlA“Ğ$ÁŸwÜ-3d‘Ĥ¸ĥTê”qڈ⳧Œ‰§ŝ÷€m.…òĦ{Â6§EW<„Ğ)JIXŝ|á#şë| Î ;µ™•^#ğíÊë ožênaL—ƒ+&|bÛ=­ÊYìÌÖ$ċ\7½E‰_ô7;ëĥìFÎDëû$zqšMcSڃ$x)í' \Ò´vÛbœÖóŭ:CJ™Q&:OŞı0&ǖ1,E*Ìc–;ï­îCĝ ։CĜEû­?êVޞR“BQ`ƒ:Ú4ôXK}qëŽâ81Y6H€Â¸ċ/*wƒì{ •Ħf`ŭ9Lüôä™áŬ'Z…zOX5!NR6Ü÷· lë&@ féZżO,ÊHpT"Ö­TOêS,>9„Cˆt– r\$ PĵWñ#E‚Wc°½<Ú˘§ĥ`˘džb´;İ7¤vNkAF78’×n½âÓ6›ġù‡$­O½Ğ,Aş&ĠÀ>Ç=GHÈ"rŻÄÑg.şU>‘÷Ĥ5U˘Ñ…D™9=žrà$[‘BŸ-höÄS²˘Ö\ĈŒ ÙìsħˆrxP™šƒpïe€Yâäï~n x:u½ż½"fLt½ç„Œ ÓB%X™ùz2P7cêa&’Òm¤—O_SŞÑpc` |h†pŸ@3Y4ƒ.ĠçÔƒŒŻÍü‡ŜÂ"̸éP=z èy•#Ü+D†µq£´Ç ?€_ħYĝ —8쁅Àû0fcŒŒ9ÑqwUBw¤ħpëÎ Ż5˙ OQİçvċáy£[ĴYĞ Ġ$İ%j°Ħ U.v /‚*gşŽëRW#Q™ĞsdV¸é ŝOEìħÖuàĦ'zë-Uuĵĥ‹äŒ]VÎ5dÁg–HsöuébZíù!Ŭ{,*E!RȨG0GđI°“·Š†PĈiXó-BӄG£céX7‡™AòW^Ĝż£sĉ*œI;ê8Y¸X; ġİ^¸èt/JTaìOyċZ”ŜÎ.*ŻŞ8@ éXìÖ aÚı•}OŠß`ö âžCtC0v“ıԅñÄù÷\ü8׎ڐ4Ûِ˙6äÏñ¸ Ùg7 “tfËÖG–“L ŬZ“|!³™ìĊ‘û”BFÍ^žäd§TN­İŝÀܛċ‘İ:²nŸ_sÊż ˘è%>˜™Ú‰êħeHô'z~”@eRê” Ħ’ޤQÚÁ9²žAĥ'—&¨ŬµkïÏĥGÎ9l#\V”CöRasâ#b]ĠZ“Ÿân'–Tó‰Ûî†9ĵôUß-ŞI+„ Tżŭ)MT(‚!5–_÷ŻĴ°ŞĜ?“şùT£fĝfħ3˘MTéÖŝÇêċh̊3˽ĝ0yƒCz~˙>ÙíËîĈq/ËĠċ"Ñ"p†ê/h<“sbŻ”)ŸüÔq ŞħLĞ ×÷úÇêĴÚö˘Û6ĉÉâ[‹šĤħžc —Iê ˙ –fŒÄPżïä 9“ĞŝèiÌ?*Zù ÄzEokŞ:ä+L›"<Ŝµ¸M^Ğš˙DI™Ĉ)v<ÂÔAw‚hË•Ż›UĈ-ä9ñn˙ÎÙĠġ ÀìßİaÎ ²aµŠC.†²ŸŠ¤ğç%ùo`ŬȀÄUŸn³ÄĦf"<ÛÙqq?ç âĵAP81ßùÓöÛdgXΚĉöBËk*:VÒ!#™À×Ĵ˘z<9”^9È`Ñk<ċ˙‹Àîg"2ÚgÉKi¸oÈ­~VfÈŞ=@h™ŸŬKZ îùœü³ƒ;ħœt7EîĈqˆ*Eˆí²Ê£Ùċè(îäd+0› ™·ÍÚHû™w‰<$4¨µŞ„f €œZh"fÔçPş/݈(™şş.^”Ĝ외Ôdİ|ÀBż#kĤ*ñ‡#I˙'„=³MŸlɖ›A“%™·†xĊŬ™ˆçĠ§…)ÛżÀàı„ĴI˜8g°ç›; :{üY>×˅Bkқ"'b¤.ĵÂÍüq”ÚGħÉnS).¤†+10_ŝáÚ/Â+ˆ yçD¤*AtÑNÜğİöĝ#ßÖFÊ£r˙2˙;…óvˆˆHÑċ>]e)‹Mk²ÚÊÁŸÉ4ü-FŻè­GP0`BÉD\)K™DŒ`µfÔÔñH³$ĝËk’xęg£²x;Ôż)›ŜRWĵï$û[B“Ù•ş,Ē‹j´šï‰>¸3˙QÙ~òïxÒ˙ •Çĵ Ï3ĞeàXÓŜmX}äeÈÒ0M. ^Poô!›+A…Âë7mġĊħ‘ÙżówşE/°Ï7cìŜz2‹ŞİÛ7ġèè'L!‰ŸGPñfïş¸ùò·N‚ÈĜżQŽâ'7+w­êşÊÓáĞŠÚùfÔâÑ ²èAh,Jn%¸„ĤÚ]y&€ŝ ,•4’€×XqAİzċRoÄatì&­srÈ]Ü7—AÂ^D_I›˘VÍ]Ġ4Éxğ~xğmxDšZµìô¨1ô',aFŝe–u°Ċ5ĝȋa2?Ŝñ { f×wTP*•“ÑÊ"ÄħˆôżÊì¤ôÉŝN‰—*”N‡{oHtw¨×ŝ2Ħ"Ȏ5äá“ïùıW”/ü(hkìüu#NÔ9-Ĉcĥ"Uğù(”PàaP­˜ìô‘03òÉÊ•qvÔ ˆŬ*@Ž•ĵċl+óÚĴ—ÜÖÌü-ÂDĜ‘ £İ݆ğ3 ê”ÉJò€ËÇĦHZĴMŒÚ˙?"-,èżŒrôöÌMc™ġŽp—ı„#Ú'S~½áİüˆ/ùLhè:\ ˆDò“V|Èß÷*iġf¨ó˜²ĴŭB˜]Ĥù:-.Ï*t(Ç<Ħ4DÙ¨•—!È_&;°OEMŞŬÏ™GÌz“}tÉä›]ɖk§Öżş£â—Ò>Ááé”}5½’§#ö›â¸.Ƚ€½R"ĥ/Ċĝ>ƒx‚Ö•¨C<¨0 ÉKÍèOí~ŠñçAĠ"İŞ0˘âׅ˜ĝäÌÄOŝ^;r^Fäé ğµ½%PY·ó÷Œ,öŜi7Ö{µÄ ZÜèĉˆĜg#Ğ#ˆúġĦÚ\äcsÏ_ożdqÛÎŝÑvĴv°3)•4,˘8ÄóŝĊȜˆŸxšÒ´qU"ŠÉé%šÁ%]ıĈŸ~ gú³@ßêşú,·´/ĥ9fH¤áµ˘ê#Ñ& fj5ĠÖ"i} 䵖{uŜ[CòGné‰ä6 ‰ËáĦ>;Uġ†:˜)H÷Ĉ³!˘ëÖEcÉ t a ĝ‹H'€.¨c?HĥY–DŒ`9•ÑòċµD´^£L9́LšagġÙl'Oú.~B³-ż4_£ 'ZšÈ ó@S’ĝŭ‚à:‡6Ġ?{˙oÏNQë.ŠtjÙ>Rù7YâˆdëöÚ âAàvÔW+šŜÍñQrN›`é•h!(@h6||ĜœÌocÂ>‚Zwk*ġïÀ“ ,b齑vŠŭ‚Âŭ,‚y:DŽùĈšB›u‚ÖÓ£0 †üÌ1sVy[ŭúN·ÇO!CĤÜ +­Ž8RĈ]§;zÓíĞE9ù˜M´AFù<áv9hĠTÁbçròyìğH)†ıb‚:a„­T_ĥ!q5Ş>„bkġràÈU˜2âCĉĝH+ù&YĠÉWÛdzÁÎÇFıÉĵ% Ş3׊ġÈĠ˜É1íNfżZŭ‘Šħj–NP'ħšˆ?‡aŭ:8› 0‹Žıè0oH ĥ]C%ÚôʕÎŬġìċqŬá˘ŝçrj2­İ (ä—-!˘Ĉ¨LA›W×˙-Á‘9eN+N·ô’Á{áü°Jş%/‚öÍÁi:ÏGùâX^Dá#D Yá­Ûۃ ġŬ·:U{°p€zu×j°];Ë Á{|{ĵBï/v²ĈƒòĜ°]öĞÈ'GĵV*9ÏDËÉžfÈÎë³Ĉ@˜jñ˜d’>ËÁÎĴ!áÏŠ´ĝöµ,‡ĉ"ÁíĦsë:À -‡;9[r~I™\F_ú<ñĤ ë>Ëx2$+÷àtż·ŭI0TߝĦ)ȃûë7wÓ'½ëﲟ‡ÓVö‡ßn·ÓúëßP½öŬӀ}ïo}iŭômïtû췒?X÷Ú?ßb½yïݞûîŭÀ{ËßU˙>Œ=îï}‹÷ÒwëŜûMûì—Ż=ô˙oĴ>îÀçгŠxÎ tú@ŬU*ŭ<`aÉ×J­pĜ^ç#ÉF;¨Ż)†ÄíôÒşPĦo°m>^iÛ˙RG`¨&Êêûɨ’ŠBċ×§âsŻ·|·òĠ….Ùj.@SÜĥhó@/ƒTûBĉ¨û`2˙|AÒŭ '`tË[NVßgK|}g aéMìjŠġ³Ö#†:QÈe…p%>ÚxŸb_Ìw¸ğ­ “R˜JRüTŠq6•ŝöñşqÎÓĤċuÇÁZ'èaı}G£”Ì*ùwĉtÀ] _[—>(˘R;â˜jl¤ÄG–Ì6RĴ@W^´`ĠTġ”OÑt/†N;1ï·YŜ7/´—›ÊQżğ‡pcR£"ĥO#˙opÚBùeñ”ô6Äö´Ċ‘Ÿ'éûĴĝ,­í?• KŠŸmĤѧ˜^ŝÄ&NŻ~v^Ĥâ ìÒ³uŬ9ΧĤE7Ĝ‰át)îÙC:Óa|wfhše ½ĤšG‰rTg$.Ì Â<šíµ¸Òñ7DHĊiítsä%ï"ʖ—•ş€ò9„™é|èzùóĦ½ú5™š³ŞİΤG)ï6:É7èm\vZàÖ8Ħô™Ûĵ`ğ젅Ŝ€=ġLĵ0Ŭ+P0´Ëkîµèü÷Iï7ÜÌ֟|b…µ˜É&ûÌïûĦ‹?2'ßÀcß]êC'%ŬK?%ĵ…ò™üóÂhĊ@]¨ĜµÏÌ1šĴpĞ‚$^j°Q%Éá1HĊ.kËâßĴwĊ"y€6o”ĞÌA½Ë¨µĊzġúarŜ¸Kîë­·3|u=ŭÛà3²~Baŭŝaä?ÚÇĠ­˜OħkMÊ`wŸXüĦÑîr›Ş)K ߎb%gŝO.ĉÌ1Ħ ö^á½ÀçM';gáÚy¸ }N9zِİ9ÚÒF P4ĝ ÙŞ…hĊRîg–bá³ڊ·ŽşĈKvەPĞ𛽙àÈNƒ¤z÷ĜjPŸánç8êW¨Ûß{yąèF%£o*)dN(R’’ÚdFÔŽ˜`;·ò­éùğ1~Úqi5OFÂ÷·9öž†ßIMğ–2ĜÁük ÒéÇÔùĠ‚`†8ÏÊ:ZÀ%—0ùg?b(5 Ż"Ŵ*äs6Q~Tú’r2uÁwĤĥQÎ?̍¸'ġÙÙÙrü³ƒ™™†ŞŻÊ†á­e“φ×MRH’Š”ßŬéBö!ïd4‚Xô°·ċ˜ž6îġ~”g'ÀµÇ1žWٖ!w͔ btŠÑŬÁwİ ÉÓĥŒ$m£-wĴ“¨9K¤à÷áj/‡!F3i³ÍwÛT˘Í[9ŒVM‡µIq āF|î´ż×DŽŭЇš:xwÊ#ʋeĊòϞT‡SúLE2làŝ󵂍-Œ~ħFˆfŠ´YÈàSŭ$&œġĴ1nĦş;îĊÙÓğÔÖsġ ÈC9lġ‡ĦÍĠQDJL9t'?*À%˙gòàS–îġx&~§ i4>Yh`ü)ŬĠ_rġèì-‹ë~wĦ’1hħғß7ŜG·œĠÊ'|hžJW£4™ÂoĝìÛÀ Ħ[²Œ”§ÏóĴ¨íƒKĤrç9Ċô.ܰ>ē™úœĜ–ö¨³/:,żÛž1J[*Š{{kʍ·elö³ˆ½{ú<ßĊԉÇûj™¤žìŞEÛĴ>Aö 'P˜q”Ĝ|6Œ~edC5öÀ’á²íD<-.öŠi–şäñtßvfrqĈ¤ÜBÓàO„-ğ6OŜrûĞ€bħ­)°‡ÖáëŜa ̋ÍgËöŠÜƒÍÉ]9÷œĦĊіPİÈÄïĵÊy‡ìoĞ$.É„â͏ŽŽ+˘„qOgè\ézg݆ĥĵ9Ĝ>iĵÙ˘(`­ñ“sh÷%˙Gm?(^(Ġ( [§Ä32çÜ÷›Ò¨˜)0Ÿ˘[߅ ¨Á³”ĥ@8“#ë=Rl…ÊèĥÊi‘÷5ßòĤkH}9駜ŠÔ%°·ÄK¨•ĈÀD›ĝ EÈĞ­)uÓ~’mx™ümÖbĈ…×ύ#pE;ü·í#eŜ³‘"Îò°Ú- Oġ?;oŞĥJP"‡#<§²CħµӖ~0ÚXÑ4j…ê*֊ Ò1˜Ŝœœ¤ÄAéÑt°܀ŞÄ@: Ĵ—3Νô•÷\˝ÜoW`fĦƒš™3ŞLÚÍ0È˙NTénÚ)sìżlœĦñ_ğy ñô·\ÄYúNġo˘x-À—Ö†&knŽ£Ž[4ĵ`7^ċçb÷+oh"d\Ż~}UĞ\Î/˙]Ğ›:1ÊgSԈhzéuGö˜FDġÙ×Kvgc„ 8°Ĵ—6úoDtòÉ܊UM³ï¸ñÔxW›5Ë+>Ħ.í;á°ZËÛ_Ġ|‡×nÍ Âécú¨ÎğSgDêÓ>+ꤔ‡ôsÓáò; úmTĵëh' CY>Áq[ùóù_ö̐kÏr˘ ˙kdžŽljÏìn.:]zĈs}aE8rˆ44wàI¤&G…$ƒœ3~r@8ğDZי™›¸ží½Ÿ\µ‡Ĝ{2¤W ĤuìC™nĈ$–ßÛ!ĦĤ sçĝÀaÉ !cŠŒ[ò;E°8ƒmPHá´èbi€Íï\ĵΛĴ`Ż|ów^™M –V|e"‰gĞS…!C­7v­£VĜLÍ%°8ё|9š…„ˆ‰MìÄ1ËahÙ(ˆ`\R2èî~Xn|(Öi>oV€âŠoßxÁu´¨“`ƒ.8h÷èŝTOêŞ²À0#bg@ÊpƒÓèàƒĦèQ÷SC“ĦjÉâĴĴ3LPš*ÛÖĊ˙X(ĝ3ĵġRwdv¨!ĝíĊîE$µò󓂇ɂ3–Èô@Y{Ü-c‚SÛÑQş,d8jÇ ²ò%Ͳ_eHÔŭ#îܐs&Ú`+6g—d‹ÌšħŝŒn¨Úm~5›rèÓÌĝNğħu›#âݐĈDÏúPegLĦÚ#'NŬ%Óh>òѲ~kœq„·‡yĦÊB–ĠsUG1pŭÍY޳l³l1ċb'2țŻ‘éèM}GÇ>;ÂH+Mċ§û³N˜£$ÁÄğzßĥ‘! /UÜVBûxġ›8y˙_ ÈrÛezZÌ×DËİ5‰_ĠeIÑħ ŸŽ)aœàgż…“2-÷uÄsûnXKĤĴ§™H·Ô=Ħ­/}VÛà”‡³ËĴê”x˘UQa¤. œB›Í”FİĦjĞżû×~,LúU1SrC_ûgĦ=Y“bŞ(|[y"(ŜËċ9@ci_çžtj`Ü÷KŽîŞTĠ ó]ò6é1‡ċêLĈ|úiHkó˜e¨‡­|°ÑLݎ…­c)´ŞİU"Uş`ĴWÚíWéêı†ü³ù]O¤ìœ”y…ß²ü3Ëu3áüJg&‡öĉ×XÑÁü.Ċù§`Ó@î\ñrŸYĤqÑ*ž‚ô´ĥT˙4é zÍĝ^ĜqkğF “ÄLŠ[)# 9µì“ÌúBӍ9Ç ÜĊê77¸ôĦ|™Y%ËöïÛP [‘ƒÈSóÜ/ÖÉû,˜Ħ"^&D+}£^£–Ĉ w&“+Ö@~y.‘‡.WN}üÇ>ñ$Ŝeĝˆ-tKM?sLl3}(Ô ïk‹lċÀ¨Ëˆç&e€4µ,–?â{xşÎT2ŻÓ]ëd/1‘Ċ^‰büK „ë'•Ô1ÄEğW -¤è&%ܰ¨ş{ğÚĦ²áf%x(*µŝL´żBšaĥZâ=èš[›|Ûyµ~!üöû•ôìĥi=§mv°ŒlÉ ÷âHÑOi ÈŭbÚWSûş9€%Ï1F^ ¸–Ĥ-/4•û,rg^y֖ˆÚÒK_Sıê+ĠWAݳP,ĥEĤÜráĜÖ5œ,7ĵ)nT_£ ñ ½×3‡|6üŬcÖĜÛ%zú$$;Khju×N¤²ÂġŽžgÑòŸĈhéI;â|ÛìħWÙv­ĥĠ{8¤·#ŭëÜ:Ú¨SÎ[Ψôkw^³„|mÑÂÍIîdbdp÷θĜ;Ŝeb`aV³s}Ä F·ÁÚbmññhıeöÓŸEvD]Xóe°:¸ x¸ŞwĠù!Ï)@ÚjċhäCkyoƒ(%Y¨eéÍIGX+SĤÎlPûŝñŠĈî—#!%àÏ.§RÉüÙħ‘Q8Rw`*š;ߪ*çĜ l”XkÚĠâqÁ‚ı°ş‚˙ıÒ ¨ ÇËJ[*ЏèˑPš0ħ‘ĵ!‘EdÚ\w9^ON?żôd'ò½­ÙŻXr>í÷jL ] `qžú™OgÂûċ =’‹ÓOAíh ŻL%êŸ COÏ>7ĥ•Ş_dñHl#u@bŽ“ûŸ°ï.I£Š‰6;T O܊úèK=Zr‰‡î#hîWkx,dxĤ—>İE:ŬÙv\²İíê×(:jħ}[L^[ï‰F ³€O( #„Ĵ%Kħ᳅Ŭ;ksrĜĈüN$ÍÓwÈXê¨f ò7€?Ħ'ß1jT’Äİù ycĤÏNƒŝwç)ág–µKOÛS%ĉ4wSúMAŬ‘{ĠÌ{şÒ™ŝŭSĵàiêÏϋÄÂxVÑúÌ˘#_†ĜäMĤOôŸéjĦ5Ŝó÷7nğÁ ȕġ'’ú1ä‚&­È”Q·Ôzeoġ UŽĊßŭğ'ŝ²½H×aİ~6!%Q.¸Żĝ†Ìn^ϞtÁ‚v#-Ş+ĈH3·HYWˆĝzRŒħŞ]Ùӈ>à‘94Ĵ8|Pr+àZ%c•Wéìè_ZF6#D†Ŝf’lG˘1ÑÓ8R÷á½ŜúÁ ëÄż Öġ,nĜÎ"ßğ>B*Cµŝ0fDˆEġċé´dMQ+{éRiĈ?ĵÜĵgí÷Pûi3ĤŜ‹ÊßpĝŻVRüJ  -û èBÊĥ5›µìBÎò à\ÎFĴӐ÷³Í‚Qô9H­$;Zž½Ò>Wö‡°'(ñAÖz€*PiŽñòט† ó„êâìÚĞ\iD@=×ğŒÙL3ëWY"TÓòÈ.ÍìQvЁ\HIEu9Sf,1#é`gì‡ä\uÏ´[ŸdŜ  è&§`g|£Ô%Ï#´’ÊúߢÊ/}MT‡'ëı*ÚK;2âÉÇry0áÒsèçÖÜË ss„ş¤ê͟Ûû•@UœAnbÊs/Á´Íġ4jhoƒĠÊi°;L[ğġ•ŜĊr&Â&J…dbĤÁˆ/ĴRUnÀÜ÷55žÌl 8=„ĝ…ˆ”ëñê—QçO~×bC“´•vw‡ĥ2¸}ñĤˆŒĥğĝŝ!˙*aĤŜ¸¨˜P—àK}”÷Û2“µ§f½P‚îÔAüì,“ Ĉï}<`+˘˙8‡2J?÷Ùż2ŒżÒ͂ïVöViġ9:=ÔĤY”ŬI›w‚Ħœœ³ Ĉ,MHH'=LŸÖ´”ƒÇH¸8×M‚6ŠŬ!\™WbYJî\;Ħğ`˙yòÛmz™‰šĊ–P0°SƒŬkMÑ_<„ßüjâğáŜDF9“Ÿórı+§,R’ìŞHUÌ)&z—H5ä!Q1c`ƒ"ât䐋¸Y2Iq%Í ³Èĥ˜°ċġo 3ĝçáf0µŻû/}0Ìĥâéé–Ġƒò‚Áé UĈ2X5ÒÂÖö‡ °Òİ8ÖĴېq˙Rï€L˙ Żv“ñyĞ ³†ì33™<•´É* ˘÷Iœż†×Tܵ²ò‰ħ —éˆ##Ê\feK„DΛì†ĤúˀRTì I›ïïmäIÈĉœèÌ.3@1·Â K‘İBßöĜ(yŠžà Ÿ˙GÈÄ2ú p˜ÈAGaĵK3\ì›ŭD"I°­T&‰QhÔ¨İA“B ıä½ë-fħuüߚò Yë¸j!Ğ·Òxwµ ÄùğtDƒn@v°ż”¸°‰R7¨#+Lßb\6f·UaĜêe zĉ¨™\L5Wqğ @‰ĥʽ!Ĉ#Át"ş†sYŜğœgvcókı<×_\Sè(ä[h\Ŝ,ú,ˆd£Üĵ+ċ´·ğ_™¸5İ˸Ϥ€ZD”Mžk0a˘Ñŭ!µÛĜñŠ”Í?tœ˜*ĈİĠ[oÔh½Ä˘sŝ1ÁİĠĝÓĠYsŜZ:ևúíĴ°­şú’›5QDûÑq AH˜.ĵÌíá,1ˆCI8ޘ%ú„0‡°úUW(Ġû½q~0ÛT˜.rêè7ħT. ­Żzv9”}ħá&óbD)V;ь'ş=­Éw0É@KÉím?‚G°ʜşœŒ˜Ë‰”ĴrR´ú꟏­˜Ĥ•4^ŒïËò>‹ Éĵ5í‡ÜЍͅ]ÒdÊOYÚ*ӛ=Î˙J#İĞǝ•ˆ‡<àÂ-óÒÉġ™$k€ó|ĝsÁ†ĴXˆZe!ûÓ­ù"“K&£K/Ñ`ôO¨£¤×òûǍ3@nĴò ˙UòôàhÍ\ÍÓ°¤–¨ şƒîòŸOŞ`“³ñ_J7Sß:ÇÏ^wwPb(,Ċ‰³FÓĞOLO<Ä ·$;çB°yy‚M_,†ghcn‡OʄZ.Ğw÷Yúe.O{˘j‰¤f'…׍@- Ö•áĝy|™;C€üĵĞ„HıQù9Îşû5ˆ³/ˆ •>SŝĤ×ĝ§/tû`äBŞ#[‚wöà˜d™ Ŭƒq•ĤÜ))Œ˘Nh‘q>]ßNcX_Ìd2 ƒñ_m8:ĦÜ(ŒqA2c²;·öĉ9Úöp˘0äd‰ħnÎY1e™§·¨Ĵ<ÖúÂOĤĊĦkهßêt+ğ͌6é˙m‹ÈŝLBß?ŝH(lĵC‚=•zŻĤOÏ.Vw™âŸêQû>0ц£|í™Îf·‘°,*G´şQ0ÚuĊ˙xó\ì1²ġFôKZO“ §h…RWÎŬÏ>³5rĵŜ:V€5á+žċì‹+vÌl-˜Àsž–ßdâsŠVİ Ô$6è² šŸ GÚòŭŜħTĦd£c é…Ĝ޽'¤'užÈš´´°SžÙóöúŭTġv~{]@è,p'‘ †0ÂŜœ¤€\ÍMÓSżT͟Ħır%߇Ĝ‡5Ħ[Ô`sŸT$ê âĦdpĤžŭ!¨-“#Ğó–íşĈÊövF6ċ-^w?Ê×ĥ„ L-_úq‰vÌùħÀ÷ŭŒ&ûWs`eŠó.²òêîÚİÀ€$Pöğħ"rxŽ%0&ô}?üoñ™ĈĊÓ§Eĉèù[İ-µëüî ˜ğœ'ì’X;+BġÚÚħ™’—™óíWœ÷›ŠŠ ĝ£×£½ä²(Â…•ìĠXúÑ0‹19l ÌĠ¸q~ˆ”-E˙REĠéèû€í!U*cäÀĵµ0”‘Ag3E|+PáÄö’ ˘Ҕzt¸´´m)FÑ^¤°ŠÖìÄ:$^e䖏6äăCQħ>\Ş:L1œóאˆñïjÄîӀˆ5A^ èOHÖ|ĴkÎêa?xWÑú“™ÇCYgĥıí\A%í 0óK|5ŽĦm1N ŒĊ’­ŭXt¨ï-h‰1„Ú;MF“€ëwç6(ÛÀŜLîRÖXÀË ĉuAïĥŠ1Ïz÷êl‡ÓĴÄd?AÜLÁÏPıq=Uè#SqĴîÏÓâŞ^ĠJìĞ/gèh²0`~ʰ"íkpŽ£ raŽ+“Kß<r˙Á 'Ç×àr˜½CÈżżôµ ÄRĝWIîġ0KÉ0ÇSÁR_€˜¤żIÔf3yÒïù4é£"uZ„|Ŝ̟š·éD;§5ĤcaŸM°´^ñ•éL K5Ñ[è‚éGşÏ‹o­ŭ…P0m”l$ä. 4t“Óâ úP˙OҐƒlÍİğ˙~ˆË¸Aċ x†Ĥšm$ĥ!@Nüşŝ—I#Ž%×$ şĵrîV¤!:Û—BF §gû şX÷ûħ²ÁœŒu$Oñ¸,b3™8Š‚'÷—§ù€]Ħ(û`– †^²³ÒñcşšS%K˘~ÚĦÌȗ5yii}ZNjŠgTF|.­)·ŽtI  ó×é :˘ùÈčĴé‘öÍq&[pšĵC$x™V`5À .CGúJäbxdä—xPˆÍCö9Smjm¤ÚíˆëW¤Ò†);qi۟ôĤ­ü™ßܛtˆ()OĜ8½kNux|§ĤĈU7޳­zá¨#(\cĵ’âG…T"#à†s’˜k­z ZĤ,Â}òù3äĤC#ŻA'gԛ-ê6•vYħAš^d$Üí&ú0Žtu˜}ĊˆLŒŠ^ 'M²n0ÇĦĥ”rÂjuZîĝ˙K"Âöö>ÙżßıÌÎĈ=ŬF(ö{Qž‰12Ü!T˜`żi?¤Ò&fg=4ҎĝŞ•¤8ù;.DÔâéż.Ċ›uÌGümrĈĉ&‘Ġ„ĊÀ MżÀš§=òĜúu/ìöX1E™ ÎZċ1PBµcOrşĞ—+€ĉ•]*q›š4‹bĴšY/M­ËJŝûJJ l%“|emY5 ċí§˜Ĉûü–eç…´¨^Œ§L&áȍ¤şÏ¸ÁCŠµÔ°;ğĉıàèû•&´,Úñ˘"Żħ9‡¸4œ•ŽD6ċXŜĴ'.Ó9ܢ4(Äq|Ĵ˙ ­hožÎħˆİĥ8ˆÂÀŽ„ŻŸ—ĤÛê¤=¨˜x­7 ÇâšÁ£„bd°@€‹ëÔäSßî l“~‰ ÎĞkìñ­âëjêqœÜ׸FR‹QŬUkaŭ÷*kşy"@A‡ÔŻ眳ğŞòß>Áŭ£\ëG%m\§ĥjGŞÄgÉ˙ú܃xj÷ĝĊ\è2¤fü60½š6̊tür.[)&ppÏÚ<ğ,zxÑáí7ç2¨Eö­ġ ƒ6…É-xĥPĊĴßQ*îBŜ/\ż(£Î¨ TŬ˘Wİî÷vÏyaĤŞ%n¸– È)ŬÍa ü (ž_Uµ:´…„f$möç‘íb'*!Dç h<ÑĞœ1 °ë=ó&óš ÜÜ9‰f\ot€awÌ˙+Œ€ò×0%3RDĊŒgħbŸçÙI ŝtaĝÑĴş-ÚV˜ğ—êiÒԉĵê*âĝ„WğÒ{59Œœ•öD)ħ Żg§şíÌh~víü”O`’EEíD‹24†—$ĵċGmVYIŞ’ü4:,Ĝĥó/ŽŞk<›’ĈyLÉ#Ô´ÔÛÉòúŭQ‘ßcŬ“š7"™qlĞœâà%tÜ^í‡ÁÖtká45=îŜîoŝfŻ)÷í×ZzùoŝĈ•§ÓmŻQ£oüN Ö +iwFÉA|ĜŬÀzÏ=`c~ £ŠE·ÌŞO’ ï LŞf[Q´]”7­=à˜[8uk]{Ráxĥd”($™jß²ŝĵ[9Ùĉ|NúÍ?ËtpŸnì6ğNË]°XŽfaw F²w ´%TçßFq³ĵXíX|’ÚÌŝaÎ9ôlµ‡aċŞ_eĊŬİ,Ċ4=s‡ö4ĦR·Èv8NcŞĦŸ’íD˘4ĝœĥuÔFü²×g=âÁ]82=ai‡2²+ƒĵí||ûcQQ‡¤û~ŭ*Ĉx~ÁҖ8£!–Ï/Dküúo²€Œ83‹]ŭš1 ÜÈa™d¤Éz:¨ċ÷•ÑÏ,şŒO+îġ‰|$!ò%md@z22”Ó¸—ß}&}%Ġa“gğg’Í ÔçLıڃ0̙⤟q½‘…ŜĠ1 Œ|^sÀÖj^áÙ#‹°ġ=Pb@]*Ûĉe›÷#yĥÓuµnëO\èŞ ½+„}ûî{·˜[˙?ÂÀÔ,Ĉx˘_r¨4‰³S ìÄıZٙӍ ù1%96Êá Ï\Ké†óŠ€ġġìíñ›ŭ"!ǜ¨Çġµ‚ïJ2ê5ŞĤšÍ˘ä?ĊġùĤ5İwŜü–îëÓ ^œ™á-ĴŻ'ĜswĠċf‰ éğñ:úš‘.$dÖx1ípÍÛ7éí÷  ˘fàrÑ'ÌşŽWŭ‹|‰“6Ÿ žrRo(Ì{Ëù[!Q “˜ wĠ<ìá Éğ^Ċ?§²óÛÜ˙6‰rûJrċŝN碍êfçï ÛW}ŝš˜CMĵ<„Ŝêq†a.÷p2ŝĈ\$ŒêŸmw£÷àIS0t-~ ~ÍĞIĈB=ĵċ (ݘ„şċN šktDDRiW˘ĥ hmÄMÙаQTĞlħd2|ɋzġ´}BSŭné•$˙ŝ`œ‡jŬ1˙wJğçĦŞüÓĉÒÂ։FŽ“îjê÷!]Şs£à÷ġÒ}cNšó 9LÒÊĠ{ĉc'ñĜŸğç5á­Ħ˜ĉ+V³˙÷ ÓtÌJ”Iy*3ĵŭĴ –áàħ1²£ilŞAĦ‰ÔAEıŠúÓQ‹-?U<8@ §íJY Pú…I°aÚŞ€³&Ò£ÀŒHÀuµu44İŜ#&QúôÛeĤ˙\(=ûwË`ÑŬ$Â8LŸ`Ħö6óÄóÔħšs 51¤ ĝnµx00t§Ç‰.ĵ0Fë‡@:n˘üdúUßöŸòçoӔWgX¤”ÀhU(ĤÓĦrß´Ys–ß­•£’â0lW'Gĝv͋j˘Tz†š·ŭIAéúìÛĴŒċ•ÛŞ}`Gsż]ŠÊÁ 8Ï@~…ƒ›E úq“Î÷boOÏ5ĉ™ŽBh1á9@KçPA÷Ík"²"ƒHޤDÊO§ĵ<@|=ÀÁ#´ŝ”*/r1Hëğ“Š}AVTGĦ?yLs²Ħ /gÊ-6Ŝ™ğħ4)ĈJŒ€ïGydféĤTJ8܀vĝĠ̔#ÚÓè żöùĦJĈ”6§³i6^YŞ}' ñĠĜ‚™‰´Apb>&Ž„ñ}ŭL¤ÎĊRûŝ‚Ó³Ü˖Áˆ)q]?4ó×ÌĈÁŸÏBqÀ÷a>”u)䢰ö!ĥŭ‰úŭI~k˙0+ÌW5m/Âm'B?ġíċ Ŭ Ĥöó×…ŻŠ¤Œ-^{짓jb+ߙÙft“8N:ùùŽTĞÇ÷á2„¤ëñà)Ç´ß^Uߍèo`ŜrjÉ/ßĥeĈ >8"°}€Ĥuĉ˙gċÌû*ߝàl'$ŝ‚qbË>é'8΀^)OĤ&²H{ğ ğ2ÁÑKjà òìYê°4Öqp³ öĈ¸g€(ï=K‹8.}ċÀşCïvŒÓb5ñ7Ulj}Qé 92kfj¸ÛĈ´ċ<3†NÉUĞÖïĈHy]ÀBÊL,sŽĵbħìWYßa2сzġ8Beo\ɵÔüĞÌnQžĉ"ħĦĥQP”Ž™šÂħ^°ċ‡tš%rnf.”뛚y=,'ŻZ ƒvœĈê€8™@bwvßAÄù…Šv˜Œvr>xı)ThûòŽ,pĞoŒ0 ›żĉG˙kÙnS"9 R­}é7È0³ïàùBÊÉ7İWg…)&ùv9[8B'˙lîß Úl'K¨èOŻĝëÇêWja%ħ3ĥhġÍÏÌÈ̛QġAU=ÁKŜ¤êšw’\ÀGŝÈUŭ¤4¤Ħ=Ûfg›î+Eqşô-ïဂƒ¨v Ó7W6?Vħ˜u)8fQ›5 ˘Ë›âŸ=ÎĤ[CáV59KˆġŞóŬ÷‹:Ê ‘ŝj}˜İċŠûXĥs^Ĥœ—˃٠M¸[#‹DÁy×ĞĤiâĵšğ˙'ÍMĵë/ûĞ“ŝsLDÌûê÷RÖıl´œ—(‘P+‹_îĊc$ĵaêÁĤ BҊ6Żó}Żm„oÚ3ütOÚ3˙…öŒ×í+_k öŒò‡Â› áûL+ŝŸÀ.żi€pgÈM—Â3ġ? WúżPEŭA ‘Ä-Ġ{ùÄ˙M)´W„„ Tق`d˘ `W ;Ż›ĉùo›ĉùo›ĉû;€{‘. Rח—————————˜IĤT ˜˘¤ĝ0d÷›]|ß7Íó|ß7Íó|ß9H£*7Ŭ² x aċ ĉùo›ĉùo›ĉùż„!n³·˙Zî?@„„`:HH=la!"ö2PäŝÍoNÈÌ.ƒh³€À“ĞĴÀ3eBü°ĵ"L1kuó|ß7Íó|÷A5’!kuó|ß7Íó|ß7ÏqyFOZŬ|ß7Íó|ß7ÍóÜúG™ÙP…m×Íó|ß7Íó|Ŝô³C¤SŬû!n³·˙Zî?@„„`:HH=la!"šH1Ï÷·OpĜzu³ĥŸò÷ŠPhħ°²ß)”µ<œR‡šCpè‹!n³·ÓLñ#ÛdYœŽahTJ@úáPÂ?E"şÊĝ ;żµ·ŝĈ˙0 ˜Ò:uC`? ÛŻ›ĉùo›ĉùo›ĉŭESÍó|ß7Íó|ß7Íó|ß7Íó~€mĉùo›ĉùo›ĉùo›ĉùż2ĉùo›ĉùo›ĉùo›ĉù†ô1O˙0 ´ÂB_Qh $$Bˆ0‘½wzŝ1˘”²üyŞëċv“ĝC5z‘êö³¤Ż”ñğ:}ù0ròV jFçHPÂ@vhjI”Fñr‡â>‰^21v1ôJñ!¤.tw7÷·ÚóΑ€yÊöċúŽ'ÖŒñG…Q^ë›ĤwÚPéM‰L Ùd¨ qEV‚Í  Jׯ€2ĵ ùŸŒ°llÑ` …›²i*ĝŒ4û¤JġŝCÎPï…Żz˙¤>ċÎ<÷³_‘à ÷ ÛżTR‘ñBÂ@0ÓÚ­¸ÑĈ˙ÙicnV Bdesmume-0.9.11/src/cocoa/cocoa_util.h0000755000000000000000000000625112467662066016132 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #include "utilities.h" #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif @interface CocoaDSUtil : NSObject { } + (void) messageSendOneWay:(NSPort *)sendPort msgID:(NSInteger)msgID; + (void) messageSendOneWayWithMessageComponents:(NSPort *)sendPort msgID:(NSInteger)msgID array:(NSArray *)msgDataArray; + (void) messageSendOneWayWithData:(NSPort *)sendPort msgID:(NSInteger)msgID data:(NSData *)msgData; + (void) messageSendOneWayWithInteger:(NSPort *)sendPort msgID:(NSInteger)msgID integerValue:(NSInteger)integerValue; + (void) messageSendOneWayWithFloat:(NSPort *)sendPort msgID:(NSInteger)msgID floatValue:(float)floatValue; + (void) messageSendOneWayWithBool:(NSPort *)sendPort msgID:(NSInteger)msgID boolValue:(BOOL)boolValue; + (void) messageSendOneWayWithRect:(NSPort *)sendPort msgID:(NSInteger)msgID rect:(NSRect)rect; + (NSInteger) getIBActionSenderTag:(id)sender; + (BOOL) getIBActionSenderButtonStateBool:(id)sender; + (void) quickDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText; + (BOOL) quickYesNoDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText; + (NSInteger) appVersionNumeric; + (NSString *) appInternalVersionString; + (NSString *) appInternalNameAndVersionString; + (NSString *) appCompilerDetailString; + (NSString *) operatingSystemString; + (NSString *) modelIdentifierString; @end #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_4 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface CocoaDSThread : NSObject #else @interface CocoaDSThread : NSObject #endif { NSThread *thread; BOOL threadExit; BOOL _idleState; NSTimeInterval autoreleaseInterval; NSPort *sendPort; NSPort *receivePort; OSSpinLock spinlockIdle; } @property (assign) NSThread *thread; @property (assign) BOOL threadExit; @property (assign) BOOL idle; @property (assign) NSTimeInterval autoreleaseInterval; @property (assign) NSPort *sendPort; @property (assign) NSPort *receivePort; - (id) initWithAutoreleaseInterval:(NSTimeInterval)interval; - (void) runThread:(id)object; - (void) forceThreadExit; @end #endif @interface NSNotificationCenter (MainThread) - (void)postNotificationOnMainThread:(NSNotification *)notification; - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject; - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo; @end desmume-0.9.11/src/cocoa/cocoa_input.h0000755000000000000000000001255412467662066016317 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #include @class CocoaDSController; class CoreAudioInput; struct CoreAudioInputDeviceInfo; class AudioGenerator; class AudioSampleBlockGenerator; enum { DSControllerState_Right = 0, DSControllerState_Left, DSControllerState_Down, DSControllerState_Up, DSControllerState_Select, DSControllerState_Start, DSControllerState_B, DSControllerState_A, DSControllerState_Y, DSControllerState_X, DSControllerState_L, DSControllerState_R, DSControllerState_Debug, DSControllerState_Lid, DSControllerState_Touch, DSControllerState_Microphone, DSControllerState_GuitarGrip_Green, DSControllerState_GuitarGrip_Red, DSControllerState_GuitarGrip_Yellow, DSControllerState_GuitarGrip_Blue, DSControllerState_Piano_C, DSControllerState_Piano_CSharp, DSControllerState_Piano_D, DSControllerState_Piano_DSharp, DSControllerState_Piano_E, DSControllerState_Piano_F, DSControllerState_Piano_FSharp, DSControllerState_Piano_G, DSControllerState_Piano_GSharp, DSControllerState_Piano_A, DSControllerState_Piano_ASharp, DSControllerState_Piano_B, DSControllerState_Piano_HighC, DSControllerState_Paddle, DSControllerState_StatesCount }; typedef struct { bool state; bool turbo; bool autohold; uint16_t turboPattern; } NDSInput; @protocol CocoaDSControllerDelegate @optional - (void) doMicLevelUpdateFromController:(CocoaDSController *)cdsController; - (void) doMicHardwareStateChangedFromController:(CocoaDSController *)cdsController isEnabled:(BOOL)isHardwareEnabled isLocked:(BOOL)isHardwareLocked; - (void) doMicHardwareGainChangedFromController:(CocoaDSController *)cdsController gain:(float)gainValue; @end @interface CocoaDSController : NSObject { id delegate; float micLevel; BOOL autohold; BOOL hardwareMicMute; BOOL _isAutoholdCleared; BOOL _useHardwareMic; size_t _availableMicSamples; std::vector *_hwMicLevelList; NSInteger micMode; NSPoint touchLocation; NDSInput ndsInput[DSControllerState_StatesCount]; AudioSampleBlockGenerator *selectedAudioFileGenerator; CoreAudioInput *CAInputDevice; AudioGenerator *softwareMicSampleGenerator; NSInteger paddleAdjust; NSString *hardwareMicInfoString; NSString *hardwareMicNameString; NSString *hardwareMicManufacturerString; NSString *hardwareMicSampleRateString; OSSpinLock spinlockControllerState; } @property (retain) id delegate; @property (assign) BOOL autohold; @property (readonly) BOOL isHardwareMicAvailable; @property (readonly) BOOL isHardwareMicIdle; @property (readonly) BOOL isHardwareMicInClip; @property (assign) float micLevel; @property (assign) BOOL hardwareMicEnabled; @property (readonly) BOOL hardwareMicLocked; @property (assign) float hardwareMicGain; @property (assign) BOOL hardwareMicMute; @property (assign) BOOL hardwareMicPause; @property (assign) BOOL softwareMicState; @property (assign) NSInteger softwareMicMode; @property (assign) NSInteger micMode; @property (readonly) CoreAudioInput *CAInputDevice; @property (readonly) AudioGenerator *softwareMicSampleGenerator; @property (assign) AudioSampleBlockGenerator *selectedAudioFileGenerator; @property (assign) NSInteger paddleAdjust; @property (retain) NSString *hardwareMicInfoString; @property (retain) NSString *hardwareMicNameString; @property (retain) NSString *hardwareMicManufacturerString; @property (retain) NSString *hardwareMicSampleRateString; - (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID; - (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID turbo:(const BOOL)isTurboEnabled; - (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation; - (void) setSineWaveGeneratorFrequency:(const double)freq; - (void) clearAutohold; - (void) flush; - (void) flushEmpty; - (void) reset; - (void) clearMicLevelMeasure; - (void) updateMicLevel; - (uint8_t) handleMicSampleRead:(CoreAudioInput *)caInput softwareMic:(AudioGenerator *)sampleGenerator; - (void) handleMicHardwareStateChanged:(CoreAudioInputDeviceInfo *)deviceInfo isEnabled:(BOOL)isHardwareEnabled isLocked:(BOOL)isHardwareLocked; - (void) handleMicHardwareGainChanged:(float)gainValue; @end #ifdef __cplusplus extern "C" { #endif void CAResetCallback(void *inParam1, void *inParam2); uint8_t CASampleReadCallback(void *inParam1, void *inParam2); void CAHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, void *inParam1, void *inParam2); void CAHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2); #ifdef __cplusplus } #endif desmume-0.9.11/src/cocoa/sndOSX.h0000755000000000000000000000334712467662066015172 0ustar rootroot/* Copyright (C) 2007 Jeff Bland Copyright (C) 2007-2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _OSXSOUNDINTERFACE_ #define _OSXSOUNDINTERFACE_ #include #include "../SPU.h" #undef BOOL #define SNDCORE_OSX 58325 //hopefully this is unique number extern SoundInterface_struct SNDOSX; // Sound interface to the SPU extern pthread_rwlock_t *rwlockAudioEmulateCore; // RWlock for the emulation core - used when mixing audio in Dual Synch/Asynch mode in post-process // Core Audio functions for the sound interface int SNDOSXInit(int buffer_size); void SNDOSXDeInit(); int SNDOSXReset(); void SNDOSXUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDOSXGetAudioSpace(); void SNDOSXMuteAudio(); void SNDOSXUnMuteAudio(); void SNDOSXPauseAudio(); void SNDOSXUnpauseAudio(); void SNDOSXSetVolume(int volume); void SNDOSXClearBuffer(); void SNDOSXFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SNDOSXPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); #endif // _OSXSOUNDINTERFACE_ desmume-0.9.11/src/cocoa/mic_ext.cpp0000755000000000000000000000434612467662066015777 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_globals.h" #include "mic_ext.h" #include "../emufile.h" #include "../readwrite.h" MicResetCallback _micResetCallback = &Mic_DefaultResetCallback; void *_resetCallbackParam1 = NULL; void *_resetCallbackParam2 = NULL; MicSampleReadCallback _micSampleReadCallback = &Mic_DefaultSampleReadCallback; void *_sampleReadCallbackParam1 = NULL; void *_sampleReadCallbackParam2 = NULL; BOOL Mic_Init() { return TRUE; } void Mic_DeInit() { } void Mic_Reset() { _micResetCallback(_resetCallbackParam1, _resetCallbackParam2); } // The NDS reads audio samples in the following format: // Format: Unsigned Linear PCM // Channels: 1 (mono) // Sample Rate: 16000 Hz // Sample Resolution: 7-bit u8 Mic_ReadSample() { return _micSampleReadCallback(_sampleReadCallbackParam1, _sampleReadCallbackParam2); } void Mic_SetResetCallback(MicResetCallback callbackFunc, void *inParam1, void *inParam2) { _micResetCallback = callbackFunc; _resetCallbackParam1 = inParam1; _resetCallbackParam2 = inParam2; } void Mic_SetSampleReadCallback(MicSampleReadCallback callbackFunc, void *inParam1, void *inParam2) { _micSampleReadCallback = callbackFunc; _sampleReadCallbackParam1 = inParam1; _sampleReadCallbackParam2 = inParam2; } void mic_savestate(EMUFILE* os) { write32le(-1, os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return true; } void Mic_DefaultResetCallback(void *inParam1, void *inParam2) { // Do nothing. } uint8_t Mic_DefaultSampleReadCallback(void *inParam1, void *inParam2) { return MIC_NULL_SAMPLE_VALUE; } desmume-0.9.11/src/cocoa/DeSmuME.cbp0000755000000000000000000002112712467662066015564 0ustar rootroot desmume-0.9.11/src/cocoa/cocoa_GPU.h0000755000000000000000000000554612467662066015616 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #include @interface CocoaDSGPU : NSObject { UInt32 gpuStateFlags; BOOL isCPUCoreCountAuto; OSSpinLock spinlockGpuState; pthread_rwlock_t *rwlockProducer; } @property (assign) UInt32 gpuStateFlags; @property (assign) pthread_rwlock_t *rwlockProducer; @property (assign) BOOL layerMainGPU; @property (assign) BOOL layerMainBG0; @property (assign) BOOL layerMainBG1; @property (assign) BOOL layerMainBG2; @property (assign) BOOL layerMainBG3; @property (assign) BOOL layerMainOBJ; @property (assign) BOOL layerSubGPU; @property (assign) BOOL layerSubBG0; @property (assign) BOOL layerSubBG1; @property (assign) BOOL layerSubBG2; @property (assign) BOOL layerSubBG3; @property (assign) BOOL layerSubOBJ; @property (assign) NSInteger render3DRenderingEngine; @property (assign) BOOL render3DHighPrecisionColorInterpolation; @property (assign) BOOL render3DEdgeMarking; @property (assign) BOOL render3DFog; @property (assign) BOOL render3DTextures; @property (assign) NSUInteger render3DDepthComparisonThreshold; @property (assign) NSUInteger render3DThreads; @property (assign) BOOL render3DLineHack; @property (assign) BOOL render3DMultisample; @property (assign) BOOL render3DFragmentSamplingHack; - (BOOL) gpuStateByBit:(const UInt32)stateBit; - (BOOL) isGPUTypeDisplayed:(const NSInteger)theGpuType; - (void) hideGPUType:(const NSInteger)theGpuType; - (void) showGPUType:(const NSInteger)theGpuType; - (NSString *) render3DRenderingEngineString; @end #ifdef __cplusplus extern "C" { #endif void GPU_FillScreenWithBGRA5551(const uint16_t colorValue); void SetGPULayerState(const int gpuType, const unsigned int i, const bool state); bool GetGPULayerState(const int gpuType, const unsigned int i); void SetGPUDisplayState(const int gpuType, const bool state); bool GetGPUDisplayState(const int gpuType); bool OSXOpenGLRendererInit(); bool OSXOpenGLRendererBegin(); void OSXOpenGLRendererEnd(); bool CreateOpenGLRenderer(); void DestroyOpenGLRenderer(); void RequestOpenGLRenderer_3_2(bool request_3_2); void SetOpenGLRendererFunctions(bool (*initFunction)(), bool (*beginOGLFunction)(), void (*endOGLFunction)()); #ifdef __cplusplus } #endif desmume-0.9.11/src/cocoa/cocoa_firmware.h0000755000000000000000000000424312467662066016770 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include /******************************************************************************************** CocoaDSFirmware - OBJECTIVE-C CLASS This is an Objective-C wrapper class for DeSmuME's firmware struct. If this object is instantiated through any init method other than initWithFirmwareData:, this object allocate memory for its own internal firmware struct. This memory is then freed upon the release of this object. If this object is instantiated using initWithFirmwareData:, or if a firmware struct is assigned through the data property, the firmware struct is not freed upon the release of this object. This is by design. Thread Safety: All methods are thread-safe. ********************************************************************************************/ @interface CocoaDSFirmware : NSObject { struct NDS_fw_config_data *data; struct NDS_fw_config_data *internalData; NSUInteger birth_year; pthread_mutex_t mutex; } @property (assign) struct NDS_fw_config_data *data; @property (assign) NSInteger consoleType; @property (copy) NSString *nickname; @property (copy) NSString *message; @property (assign) NSInteger favoriteColor; @property (assign) NSDate *birthday; @property (assign) NSInteger language; - (id) initWithDictionary:(NSDictionary *)dataDict; - (id) initWithFirmwareData:(struct NDS_fw_config_data *)fwData; - (void) update; - (void) setDataWithDictionary:(NSDictionary *)fwDataDict; - (NSDictionary *) dataDictionary; @end desmume-0.9.11/src/cocoa/KeyNames.plist0000755000000000000000000000755612467662066016442 0ustar rootroot 12 Q 13 W 14 E 15 R 17 T 16 Y 32 U 34 I 31 O 35 P 0 A 1 S 2 D 3 F 5 G 4 H 38 J 40 K 37 L 6 Z 7 X 8 C 9 V 11 B 45 N 46 M 18 1 19 2 20 3 21 4 23 5 22 6 26 7 28 8 25 9 29 0 122 F1 120 F2 99 F3 118 F4 96 F5 97 F6 98 F7 100 F8 101 F9 109 F10 103 F11 111 F12 105 F13 107 F14 113 F15 106 F16 64 F17 79 F18 80 F19 50 ` (Accent) 27 - (Dash) 24 = 51 Delete (Backspace) 48 Tab 33 [ 30 ] 42 \ 41 ; (Semicolon) 39 ' (Quote) 36 Return 43 , (Comma) 47 . (Period) 44 / 49 Space 115 Home 119 End 116 Page Up 121 Page Down 117 Forward Delete 126 Up Arrow 125 Down Arrow 123 Left Arrow 124 Right Arrow 82 NumPad 0 83 NumPad 1 84 NumPad 2 85 NumPad 3 86 NumPad 4 87 NumPad 5 88 NumPad 6 89 NumPad 7 91 NumPad 8 92 NumPad 9 71 NumPad Clear 81 NumPad = 75 NumPad / 67 NumPad * 78 NumPad - 69 NumPad + 65 NumPad . 76 NumPad Enter 53 Escape desmume-0.9.11/src/cocoa/cocoa_videofilter.mm0000755000000000000000000001163412467662066017654 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_videofilter.h" #import #include "utilities.h" @implementation CocoaVideoFilter - (id)init { return [self initWithSize:NSMakeSize(1, 1) typeID:VideoFilterTypeID_None numberThreads:0]; } - (id) initWithSize:(NSSize)theSize { return [self initWithSize:theSize typeID:VideoFilterTypeID_None numberThreads:0]; } - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID { return [self initWithSize:theSize typeID:typeID numberThreads:0]; } - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID numberThreads:(NSUInteger)numThreads { self = [super init]; if (self == nil) { return self; } vf = new VideoFilter((size_t)theSize.width, (size_t)theSize.height, typeID, numThreads); currentFilterType = typeID; return self; } - (void)dealloc { delete vf; [super dealloc]; } - (BOOL) setSourceSize:(NSSize)theSize { BOOL result = NO; bool cResult = vf->SetSourceSize((size_t)theSize.width, (size_t)theSize.height); if (cResult) { result = YES; } return result; } - (BOOL) changeFilter:(VideoFilterTypeID)typeID { BOOL result = NO; if (typeID == currentFilterType) { result = YES; } else { bool cResult = vf->ChangeFilterByID(typeID); if (cResult) { result = YES; currentFilterType = typeID; } } return result; } - (UInt32 *) runFilter { return (UInt32 *)vf->RunFilter(); } - (NSImage *) image { NSImage *newImage = [[NSImage alloc] initWithSize:[self destSize]]; if (newImage == nil) { return newImage; } NSBitmapImageRep *newImageRep = [self bitmapImageRep]; if (newImageRep == nil) { [newImage release]; newImage = nil; return newImage; } [newImage addRepresentation:newImageRep]; return [newImage autorelease]; } - (NSBitmapImageRep *) bitmapImageRep { NSUInteger w = (NSUInteger)vf->GetDstWidth(); NSUInteger h = (NSUInteger)vf->GetDstHeight(); NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:w * 4 bitsPerPixel:32]; if(imageRep == nil) { return imageRep; } uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; RGBA8888ForceOpaqueBuffer((const uint32_t *)[self runFilter], bitmapData, (w * h)); #ifdef __BIG_ENDIAN__ uint32_t *bitmapDataEnd = bitmapData + (w * h); while (bitmapData < bitmapDataEnd) { *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); } #endif return [imageRep autorelease]; } - (VideoFilterTypeID) typeID { return vf->GetTypeID(); } - (NSString *) typeString { return [NSString stringWithCString:vf->GetTypeString() encoding:NSUTF8StringEncoding]; } - (UInt32 *) srcBufferPtr { return (UInt32 *)vf->GetSrcBufferPtr(); } - (UInt32 *) dstBufferPtr { return (UInt32 *)vf->GetDstBufferPtr(); } - (NSSize) srcSize { return NSMakeSize((CGFloat)vf->GetSrcWidth(), (CGFloat)vf->GetSrcHeight()); } - (NSSize) destSize { return NSMakeSize((CGFloat)vf->GetDstWidth(), (CGFloat)vf->GetDstHeight()); } - (VideoFilterParamType) filterParameterType:(VideoFilterParamID)paramID { return vf->GetFilterParameterType(paramID); } - (int) filterParameteri:(VideoFilterParamID)paramID { return vf->GetFilterParameteri(paramID); } - (unsigned int) filterParameterui:(VideoFilterParamID)paramID { return vf->GetFilterParameterui(paramID); } - (float) filterParameterf:(VideoFilterParamID)paramID { return vf->GetFilterParameterf(paramID); } - (void) setFilterParameter:(VideoFilterParamID)paramID intValue:(int)value { vf->SetFilterParameteri(paramID, value); } - (void) setFilterParameter:(VideoFilterParamID)paramID uintValue:(unsigned int)value { vf->SetFilterParameterui(paramID, value); } - (void) setFilterParameter:(VideoFilterParamID)paramID floatValue:(float)value { vf->SetFilterParameterf(paramID, value); } + (NSString *) typeStringByID:(VideoFilterTypeID)typeID { const char *vfTypeCString = VideoFilter::GetTypeStringByID(typeID); NSString *vfTypeString = [NSString stringWithCString:vfTypeCString encoding:NSUTF8StringEncoding]; return vfTypeString; } @end desmume-0.9.11/src/cocoa/macosx_10_5_compat.cpp0000755000000000000000000000662012467662066017725 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_5 #include #include // Workarounds for symbols that are missing from Leopard stdlibc++.dylib. // http://stackoverflow.com/questions/3484043/os-x-program-runs-on-dev-machine-crashing-horribly-on-others _GLIBCXX_BEGIN_NAMESPACE(std) // From ostream_insert.h template ostream& __ostream_insert(ostream&, const char*, streamsize); #ifdef _GLIBCXX_USE_WCHAR_T template wostream& __ostream_insert(wostream&, const wchar_t*, streamsize); #endif // From ostream.tcc template ostream& ostream::_M_insert(long); template ostream& ostream::_M_insert(unsigned long); template ostream& ostream::_M_insert(bool); #ifdef _GLIBCXX_USE_LONG_LONG template ostream& ostream::_M_insert(long long); template ostream& ostream::_M_insert(unsigned long long); #endif template ostream& ostream::_M_insert(double); template ostream& ostream::_M_insert(long double); template ostream& ostream::_M_insert(const void*); #ifdef _GLIBCXX_USE_WCHAR_T template wostream& wostream::_M_insert(long); template wostream& wostream::_M_insert(unsigned long); template wostream& wostream::_M_insert(bool); #ifdef _GLIBCXX_USE_LONG_LONG template wostream& wostream::_M_insert(long long); template wostream& wostream::_M_insert(unsigned long long); #endif template wostream& wostream::_M_insert(double); template wostream& wostream::_M_insert(long double); template wostream& wostream::_M_insert(const void*); #endif // From istream.tcc template istream& istream::_M_extract(unsigned short&); template istream& istream::_M_extract(unsigned int&); template istream& istream::_M_extract(long&); template istream& istream::_M_extract(unsigned long&); template istream& istream::_M_extract(bool&); #ifdef _GLIBCXX_USE_LONG_LONG template istream& istream::_M_extract(long long&); template istream& istream::_M_extract(unsigned long long&); #endif template istream& istream::_M_extract(float&); template istream& istream::_M_extract(double&); template istream& istream::_M_extract(long double&); template istream& istream::_M_extract(void*&); #ifdef _GLIBCXX_USE_WCHAR_T template wistream& wistream::_M_extract(unsigned short&); template wistream& wistream::_M_extract(unsigned int&); template wistream& wistream::_M_extract(long&); template wistream& wistream::_M_extract(unsigned long&); template wistream& wistream::_M_extract(bool&); #ifdef _GLIBCXX_USE_LONG_LONG template wistream& wistream::_M_extract(long long&); template wistream& wistream::_M_extract(unsigned long long&); #endif template wistream& wistream::_M_extract(float&); template wistream& wistream::_M_extract(double&); template wistream& wistream::_M_extract(long double&); template wistream& wistream::_M_extract(void*&); #endif _GLIBCXX_END_NAMESPACE #endif desmume-0.9.11/src/cocoa/svnrev.sh0000755000000000000000000000175012467662066015516 0ustar rootroot# Copyright (C) 2013 DeSmuME team # # This file is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the this software. If not, see . cd "${SRCROOT}/../../" REV=`svnversion -n | sed -e 's/[[:alpha:]]//g' -e 's/^[[:digit:]]*://'` if test "$REV" == "" ; then REV="0" fi printf "// REVISION TRACKING\n\ // This file is auto-generated.\n\ // Do not commit this file to the code repository!\n\ #define SVN_REV $REV\n\ #define SVN_REV_STR \"$REV\"\n" > ./src/svnrev.hdesmume-0.9.11/src/cocoa/cocoa_slot2.mm0000755000000000000000000002123312467662066016377 0ustar rootroot/* Copyright (C) 2014-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_slot2.h" #import "cocoa_globals.h" #import "cocoa_util.h" @implementation CocoaDSSlot2Device @dynamic name; @dynamic description; @dynamic deviceID; @dynamic type; @synthesize enabled; - (id) initWithDeviceData:(ISlot2Interface *)deviceData { self = [super init]; if (self == nil) { return self; } device = deviceData; enabled = NO; return self; } - (void) dealloc { [super dealloc]; } - (NSString *) name { const char *cDeviceName = device->info()->name(); NSString *theName = (cDeviceName != NULL) ? [NSString stringWithCString:cDeviceName encoding:NSUTF8StringEncoding] : @""; return theName; } - (NSString *) description { const char *cDeviceDescription = device->info()->descr(); NSString *theDesc = (cDeviceDescription != NULL) ? [NSString stringWithCString:cDeviceDescription encoding:NSUTF8StringEncoding] : @""; return theDesc; } - (NSInteger) deviceID { return (NSInteger)device->info()->id(); } - (NDS_SLOT2_TYPE) type { NDS_SLOT2_TYPE theType = NDS_SLOT2_NONE; slot2_getTypeByID(device->info()->id(), theType); return theType; } @end @implementation CocoaDSSlot2Manager @synthesize deviceList; @dynamic currentDevice; @synthesize slot2StatusText; @dynamic mpcfFileSearchURL; @dynamic gbaCartridgeURL; @dynamic gbaSRamURL; @dynamic doesGbaCartridgeSaveExist; - (id) init { self = [super init]; if (self == nil) { return self; } deviceList = [[NSMutableArray alloc] initWithCapacity:32]; slot2StatusText = NSSTRING_STATUS_SLOT2_LOADED_NONE; [self setGbaCartridgeURL:nil]; if (FeedbackON == NULL) { FeedbackON = &OSXSendForceFeedbackState; } return self; } - (void) dealloc { [deviceList release]; [super dealloc]; } - (void) setCurrentDevice:(CocoaDSSlot2Device *)theDevice { NDS_SLOT2_TYPE theType = NDS_SLOT2_NONE; if (theDevice != nil) { theType = [theDevice type]; [theDevice retain]; } bool slotDidChange = slot2_Change(theType); if (slotDidChange || currentDevice == nil) { [currentDevice release]; currentDevice = theDevice; } [self updateStatus]; } - (CocoaDSSlot2Device *) currentDevice { return currentDevice; } - (void) setMpcfFileSearchURL:(NSURL *)theURL { if (theURL != nil) { BOOL isDirectory = NO; NSString *thePath = [theURL path]; NSFileManager *fileManager = [[NSFileManager alloc] init]; [fileManager fileExistsAtPath:thePath isDirectory:&isDirectory]; CFlash_Mode = (isDirectory) ? ADDON_CFLASH_MODE_Path : ADDON_CFLASH_MODE_File; CFlash_Path = [thePath cStringUsingEncoding:NSUTF8StringEncoding]; [fileManager release]; } else { CFlash_Path.clear(); CFlash_Mode = ADDON_CFLASH_MODE_RomPath; } } - (NSURL *) mpcfFileSearchURL { return [NSURL fileURLWithPath:[NSString stringWithCString:CFlash_Path.c_str() encoding:NSUTF8StringEncoding]]; } - (void) setGbaCartridgeURL:(NSURL *)fileURL { if (fileURL != nil) { GBACartridge_RomPath = [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]; } else { GBACartridge_RomPath.clear(); } } - (NSURL *) gbaCartridgeURL { return [NSURL fileURLWithPath:[NSString stringWithCString:GBACartridge_RomPath.c_str() encoding:NSUTF8StringEncoding]]; } - (void) setGbaSRamURL:(NSURL *)fileURL { if (fileURL != nil) { GBACartridge_SRAMPath = [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]; } else { GBACartridge_SRAMPath.clear(); } } - (NSURL *) gbaSRamURL; { return [NSURL fileURLWithPath:[NSString stringWithCString:GBACartridge_SRAMPath.c_str() encoding:NSUTF8StringEncoding]]; } - (BOOL) doesGbaCartridgeSaveExist { return NO; } - (CocoaDSSlot2Device *) autoSelectedDevice { return [self findDeviceByType:slot2_DetermineType()]; } - (NSString *) autoSelectedDeviceName { return [[self autoSelectedDevice] name]; } - (CocoaDSSlot2Device *) findDeviceByType:(NDS_SLOT2_TYPE)theType { CocoaDSSlot2Device *foundDevice = nil; for (CocoaDSSlot2Device *theDevice in deviceList) { if (theType == [theDevice type]) { foundDevice = theDevice; return foundDevice; } } return foundDevice; } - (void) setDeviceByType:(NDS_SLOT2_TYPE)theType { CocoaDSSlot2Device *theDevice = [self findDeviceByType:theType]; if (theDevice != nil) { [self setCurrentDevice:theDevice]; } else { // If no devices are found, just set it to NDS_SLOT2_NONE by default. slot2_Change(NDS_SLOT2_NONE); } } - (void) updateDeviceList { BOOL didSelectDevice = NO; [deviceList removeAllObjects]; for (size_t i = 0; i < NDS_SLOT2_COUNT; i++) { ISlot2Interface *theDevice = slot2_List[i]; if (theDevice == NULL) { continue; } // Create a new device wrapper object and add it to the device list. CocoaDSSlot2Device *newCdsDevice = [[[CocoaDSSlot2Device alloc] initWithDeviceData:theDevice] autorelease]; [deviceList addObject:newCdsDevice]; // Only enable the SLOT-2 devices that are ready for end-user usage, and leave // the remaining devices disabled for the time being. const NDS_SLOT2_TYPE deviceType = [newCdsDevice type]; struct Slot2DeviceProperties { NDS_SLOT2_TYPE typeID; BOOL isSupported; }; static const Slot2DeviceProperties supportedDeviceTypesList[] = { { NDS_SLOT2_NONE, YES }, { NDS_SLOT2_AUTO, YES }, { NDS_SLOT2_CFLASH, YES }, { NDS_SLOT2_RUMBLEPAK, YES }, { NDS_SLOT2_GBACART, YES }, { NDS_SLOT2_GUITARGRIP, YES }, { NDS_SLOT2_EXPMEMORY, YES }, { NDS_SLOT2_EASYPIANO, YES }, { NDS_SLOT2_PADDLE, YES }, { NDS_SLOT2_PASSME, YES } }; for (size_t j = 0; j < NDS_SLOT2_COUNT; j++) { if (deviceType == supportedDeviceTypesList[j].typeID) { [newCdsDevice setEnabled:supportedDeviceTypesList[j].isSupported]; break; } } // If the new device is the current device, select it. if (!didSelectDevice && [newCdsDevice type] == slot2_GetCurrentType()) { [self setCurrentDevice:newCdsDevice]; didSelectDevice = YES; } } if (!didSelectDevice) { slot2_Change(NDS_SLOT2_NONE); } } - (void) updateStatus { const NDS_SLOT2_TYPE theType = ([self currentDevice] != nil) ? [currentDevice type] : NDS_SLOT2_NONE; switch (theType) { case NDS_SLOT2_NONE: [self setSlot2StatusText:NSSTRING_STATUS_SLOT2_LOADED_NONE]; break; case NDS_SLOT2_AUTO: [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_AUTOMATIC, [self autoSelectedDeviceName]]]; break; case NDS_SLOT2_CFLASH: { switch (CFlash_Mode) { case ADDON_CFLASH_MODE_Path: [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_MPCF_DIRECTORY, CFlash_Path.c_str()]]; break; case ADDON_CFLASH_MODE_File: [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_MPCF_DISK_IMAGE, CFlash_Path.c_str()]]; break; case ADDON_CFLASH_MODE_RomPath: [self setSlot2StatusText:NSSTRING_STATUS_SLOT2_LOADED_MPCF_WITH_ROM]; break; default: break; } break; } case NDS_SLOT2_GBACART: { [self setSlot2StatusText:(GBACartridge_SRAMPath.empty()) ? NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_NO_SRAM : [NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_WITH_SRAM, GBACartridge_SRAMPath.c_str()]]; break; } case NDS_SLOT2_RUMBLEPAK: case NDS_SLOT2_GUITARGRIP: case NDS_SLOT2_EXPMEMORY: case NDS_SLOT2_EASYPIANO: case NDS_SLOT2_PADDLE: case NDS_SLOT2_PASSME: [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_GENERIC_DEVICE, [[self currentDevice] name]]]; break; default: [self setSlot2StatusText:NSSTRING_STATUS_SLOT2_LOADED_UNKNOWN]; break; } } @end void OSXSendForceFeedbackState(bool enable) { NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; NSDictionary *ffProperties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:enable], @"ffState", [NSNumber numberWithInteger:RUMBLE_ITERATIONS_RUMBLE_PAK], @"iterations", nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"org.desmume.DeSmuME.sendForceFeedback" object:nil userInfo:ffProperties]; [tempPool release]; } desmume-0.9.11/src/cocoa/cocoa_output.mm0000755000000000000000000005256512467662066016710 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_output.h" #import "cocoa_globals.h" #import "cocoa_videofilter.h" #import "cocoa_util.h" #include "sndOSX.h" #include "../NDSSystem.h" #include "../GPU.h" #include "../SPU.h" #include "../metaspu/metaspu.h" #import #undef BOOL @implementation CocoaDSOutput @synthesize isStateChanged; @synthesize frameCount; @synthesize property; @synthesize mutexConsume; @synthesize rwlockProducer; - (id)init { self = [super initWithAutoreleaseInterval:0.1]; if (self == nil) { return self; } isStateChanged = NO; frameCount = 0; property = [[NSMutableDictionary alloc] init]; [property setValue:[NSDate date] forKey:@"outputTime"]; mutexConsume = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexConsume, NULL); return self; } - (void)dealloc { // Force the thread to exit now so that we can safely release other resources. [self forceThreadExit]; [property release]; pthread_mutex_destroy(mutexConsume); free(mutexConsume); mutexConsume = NULL; [super dealloc]; } - (void) doCoreEmuFrame { [CocoaDSUtil messageSendOneWay:self.receivePort msgID:MESSAGE_EMU_FRAME_PROCESSED]; } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_EMU_FRAME_PROCESSED: [self handleEmuFrameProcessed]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed { self.frameCount++; } @end @implementation CocoaDSSpeaker @synthesize bufferSize; - (id)init { return [self initWithVolume:MAX_VOLUME]; } - (id) initWithVolume:(CGFloat)vol { self = [super init]; if (self == nil) { return self; } spinlockAudioOutputEngine = OS_SPINLOCK_INIT; spinlockVolume = OS_SPINLOCK_INIT; spinlockSpuAdvancedLogic = OS_SPINLOCK_INIT; spinlockSpuInterpolationMode = OS_SPINLOCK_INIT; spinlockSpuSyncMode = OS_SPINLOCK_INIT; spinlockSpuSyncMethod = OS_SPINLOCK_INIT; _idleState = YES; bufferSize = 0; // Set up properties. [property setValue:[NSNumber numberWithFloat:(float)vol] forKey:@"volume"]; [property setValue:[NSNumber numberWithBool:NO] forKey:@"mute"]; [property setValue:[NSNumber numberWithInteger:0] forKey:@"filter"]; [property setValue:[NSNumber numberWithInteger:SNDCORE_DUMMY] forKey:@"audioOutputEngine"]; [property setValue:[NSNumber numberWithBool:NO] forKey:@"spuAdvancedLogic"]; [property setValue:[NSNumber numberWithInteger:SPUInterpolation_None] forKey:@"spuInterpolationMode"]; [property setValue:[NSNumber numberWithInteger:SPU_SYNC_MODE_DUAL_SYNC_ASYNC] forKey:@"spuSyncMode"]; [property setValue:[NSNumber numberWithInteger:SPU_SYNC_METHOD_N] forKey:@"spuSyncMethod"]; return self; } - (void)dealloc { [super dealloc]; } - (void) setIdle:(BOOL)theState { if (theState) { SNDOSXPauseAudio(); } else { SNDOSXUnpauseAudio(); } [super setIdle:theState]; } - (void) setVolume:(float)vol { if (vol < 0.0f) { vol = 0.0f; } else if (vol > MAX_VOLUME) { vol = MAX_VOLUME; } OSSpinLockLock(&spinlockVolume); [property setValue:[NSNumber numberWithFloat:vol] forKey:@"volume"]; OSSpinLockUnlock(&spinlockVolume); SPU_SetVolume((int)vol); } - (float) volume { OSSpinLockLock(&spinlockVolume); float vol = [(NSNumber *)[property valueForKey:@"volume"] floatValue]; OSSpinLockUnlock(&spinlockVolume); return vol; } - (void) setAudioOutputEngine:(NSInteger)methodID { OSSpinLockLock(&spinlockAudioOutputEngine); [property setValue:[NSNumber numberWithInteger:methodID] forKey:@"audioOutputEngine"]; OSSpinLockUnlock(&spinlockAudioOutputEngine); pthread_rwlock_wrlock(self.rwlockProducer); NSInteger result = -1; if (methodID != SNDCORE_DUMMY) { result = SPU_ChangeSoundCore(methodID, (int)SPU_BUFFER_BYTES); } if(result == -1) { SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); } rwlockAudioEmulateCore = self.rwlockProducer; pthread_rwlock_unlock(self.rwlockProducer); // Force the volume back to it's original setting. [self setVolume:[self volume]]; } - (NSInteger) audioOutputEngine { OSSpinLockLock(&spinlockAudioOutputEngine); NSInteger methodID = [(NSNumber *)[property valueForKey:@"audioOutputEngine"] integerValue]; OSSpinLockUnlock(&spinlockAudioOutputEngine); return methodID; } - (void) setSpuAdvancedLogic:(BOOL)state { OSSpinLockLock(&spinlockSpuAdvancedLogic); [property setValue:[NSNumber numberWithBool:state] forKey:@"spuAdvancedLogic"]; OSSpinLockUnlock(&spinlockSpuAdvancedLogic); pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.spu_advanced = state; pthread_rwlock_unlock(self.rwlockProducer); } - (BOOL) spuAdvancedLogic { OSSpinLockLock(&spinlockSpuAdvancedLogic); BOOL state = [(NSNumber *)[property valueForKey:@"spuAdvancedLogic"] boolValue]; OSSpinLockUnlock(&spinlockSpuAdvancedLogic); return state; } - (void) setSpuInterpolationMode:(NSInteger)modeID { OSSpinLockLock(&spinlockSpuInterpolationMode); [property setValue:[NSNumber numberWithInteger:modeID] forKey:@"spuInterpolationMode"]; OSSpinLockUnlock(&spinlockSpuInterpolationMode); pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.spuInterpolationMode = (SPUInterpolationMode)modeID; pthread_rwlock_unlock(self.rwlockProducer); } - (NSInteger) spuInterpolationMode { OSSpinLockLock(&spinlockSpuInterpolationMode); NSInteger modeID = [(NSNumber *)[property valueForKey:@"spuInterpolationMode"] integerValue]; OSSpinLockUnlock(&spinlockSpuInterpolationMode); return modeID; } - (void) setSpuSyncMode:(NSInteger)modeID { OSSpinLockLock(&spinlockSpuSyncMode); [property setValue:[NSNumber numberWithInteger:modeID] forKey:@"spuSyncMode"]; OSSpinLockUnlock(&spinlockSpuSyncMode); pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.SPU_sync_mode = (int)modeID; SPU_SetSynchMode(CommonSettings.SPU_sync_mode, CommonSettings.SPU_sync_method); pthread_rwlock_unlock(self.rwlockProducer); } - (NSInteger) spuSyncMode { OSSpinLockLock(&spinlockSpuSyncMode); NSInteger modeID = [(NSNumber *)[property valueForKey:@"spuSyncMode"] integerValue]; OSSpinLockUnlock(&spinlockSpuSyncMode); return modeID; } - (void) setSpuSyncMethod:(NSInteger)methodID { OSSpinLockLock(&spinlockSpuSyncMethod); [property setValue:[NSNumber numberWithInteger:methodID] forKey:@"spuSyncMethod"]; OSSpinLockUnlock(&spinlockSpuSyncMethod); pthread_rwlock_wrlock(self.rwlockProducer); CommonSettings.SPU_sync_method = (int)methodID; SPU_SetSynchMode(CommonSettings.SPU_sync_mode, CommonSettings.SPU_sync_method); pthread_rwlock_unlock(self.rwlockProducer); } - (NSInteger) spuSyncMethod { OSSpinLockLock(&spinlockSpuSyncMethod); NSInteger methodID = [(NSNumber *)[property valueForKey:@"spuSyncMethod"] integerValue]; OSSpinLockUnlock(&spinlockSpuSyncMethod); return methodID; } - (BOOL) mute { return [[property objectForKey:@"mute"] boolValue]; } - (void) setMute:(BOOL)mute { [property setValue:[NSNumber numberWithBool:mute] forKey:@"mute"]; if (mute) { SPU_SetVolume(0); } else { SPU_SetVolume((int)[self volume]); } } - (NSInteger) filter { return [[property objectForKey:@"filter"] integerValue]; } - (void) setFilter:(NSInteger)filter { [property setValue:[NSNumber numberWithInteger:filter] forKey:@"filter"]; } - (NSString *) audioOutputEngineString { NSString *theString = @"Uninitialized"; pthread_rwlock_rdlock(self.rwlockProducer); SoundInterface_struct *soundCore = SPU_SoundCore(); if(soundCore == NULL) { pthread_rwlock_unlock(self.rwlockProducer); return theString; } const char *theName = soundCore->Name; theString = [NSString stringWithCString:theName encoding:NSUTF8StringEncoding]; pthread_rwlock_unlock(self.rwlockProducer); return theString; } - (NSString *) spuInterpolationModeString { NSString *theString = @"Unknown"; NSInteger theMode = [self spuInterpolationMode]; switch (theMode) { case SPUInterpolation_None: theString = @"None"; break; case SPUInterpolation_Linear: theString = @"Linear"; break; case SPUInterpolation_Cosine: theString = @"Cosine"; break; default: break; } return theString; } - (NSString *) spuSyncMethodString { NSString *theString = @"Unknown"; NSInteger theMode = [self spuSyncMode]; NSInteger theMethod = [self spuSyncMethod]; if (theMode == ESynchMode_DualSynchAsynch) { theString = @"Dual SPU Sync/Async"; } else { switch (theMethod) { case ESynchMethod_N: theString = @"\"N\" Sync Method"; break; case ESynchMethod_Z: theString = @"\"Z\" Sync Method"; break; case ESynchMethod_P: theString = @"\"P\" Sync Method"; break; default: break; } } return theString; } - (void)handlePortMessage:(NSPortMessage*)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_SET_AUDIO_PROCESS_METHOD: [self handleSetAudioOutputEngine:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_ADVANCED_LOGIC: [self handleSetSpuAdvancedLogic:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_SYNC_MODE: [self handleSetSpuSyncMode:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_SYNC_METHOD: [self handleSetSpuSyncMethod:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_INTERPOLATION_MODE: [self handleSetSpuInterpolationMode:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_VOLUME: [self handleSetVolume:[messageComponents objectAtIndex:0]]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed { SPU_Emulate_user(); [super handleEmuFrameProcessed]; } - (void) handleSetVolume:(NSData *)volumeData { const float vol = *(float *)[volumeData bytes]; [self setVolume:vol]; } - (void) handleSetAudioOutputEngine:(NSData *)methodIdData { const NSInteger methodID = *(NSInteger *)[methodIdData bytes]; [self setAudioOutputEngine:methodID]; } - (void) handleSetSpuAdvancedLogic:(NSData *)stateData { const BOOL theState = *(BOOL *)[stateData bytes]; [self setSpuAdvancedLogic:theState]; } - (void) handleSetSpuSyncMode:(NSData *)modeIdData { const NSInteger modeID = *(NSInteger *)[modeIdData bytes]; [self setSpuSyncMode:modeID]; } - (void) handleSetSpuSyncMethod:(NSData *)methodIdData { const NSInteger methodID = *(NSInteger *)[methodIdData bytes]; [self setSpuSyncMethod:methodID]; } - (void) handleSetSpuInterpolationMode:(NSData *)modeIdData { const NSInteger modeID = *(NSInteger *)[modeIdData bytes]; [self setSpuInterpolationMode:modeID]; } @end @implementation CocoaDSDisplay @synthesize delegate; @dynamic displayMode; @dynamic frameSize; - (id)init { self = [super init]; if (self == nil) { return self; } spinlockDisplayType = OS_SPINLOCK_INIT; delegate = nil; displayMode = DS_DISPLAY_TYPE_DUAL; frameSize = NSMakeSize((CGFloat)GPU_DISPLAY_WIDTH, (CGFloat)GPU_DISPLAY_HEIGHT * 2); _gpuFrame.buffer = (uint16_t *)GPU_screen; _gpuFrame.bufferSize = GPU_DISPLAY_WIDTH * GPU_DISPLAY_HEIGHT * 2 * sizeof(uint16_t); _gpuFrame.displayModeID = DS_DISPLAY_TYPE_DUAL; _gpuFrame.width = frameSize.width; _gpuFrame.height = frameSize.height; [property setValue:[NSNumber numberWithInteger:displayMode] forKey:@"displayMode"]; [property setValue:NSSTRING_DISPLAYMODE_MAIN forKey:@"displayModeString"]; return self; } - (void)dealloc { [self setDelegate:nil]; [super dealloc]; } - (void) setDisplayMode:(NSInteger)displayModeID { NSString *newDispString = nil; NSSize newFrameSize = NSMakeSize((CGFloat)GPU_DISPLAY_WIDTH, (CGFloat)GPU_DISPLAY_HEIGHT); switch (displayModeID) { case DS_DISPLAY_TYPE_MAIN: newDispString = NSSTRING_DISPLAYMODE_MAIN; break; case DS_DISPLAY_TYPE_TOUCH: newDispString = NSSTRING_DISPLAYMODE_TOUCH; break; case DS_DISPLAY_TYPE_DUAL: newDispString = NSSTRING_DISPLAYMODE_DUAL; newFrameSize.height *= 2; break; default: return; break; } OSSpinLockLock(&spinlockDisplayType); displayMode = displayModeID; frameSize = newFrameSize; [property setValue:[NSNumber numberWithInteger:displayModeID] forKey:@"displayMode"]; [property setValue:newDispString forKey:@"displayModeString"]; OSSpinLockUnlock(&spinlockDisplayType); } - (NSInteger) displayMode { OSSpinLockLock(&spinlockDisplayType); NSInteger displayModeID = displayMode; OSSpinLockUnlock(&spinlockDisplayType); return displayModeID; } - (NSSize) frameSize { OSSpinLockLock(&spinlockDisplayType); NSSize size = frameSize; OSSpinLockUnlock(&spinlockDisplayType); return size; } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_CHANGE_DISPLAY_TYPE: [self handleChangeDisplayMode:[messageComponents objectAtIndex:0]]; break; case MESSAGE_REQUEST_SCREENSHOT: [self handleRequestScreenshot:[messageComponents objectAtIndex:0] fileTypeData:[messageComponents objectAtIndex:1]]; break; case MESSAGE_COPY_TO_PASTEBOARD: [self handleCopyToPasteboard]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed { _gpuFrame.displayModeID = [self displayMode]; _gpuFrame.width = [self frameSize].width; _gpuFrame.height = [self frameSize].height; switch (_gpuFrame.displayModeID) { case DS_DISPLAY_TYPE_MAIN: _gpuFrame.buffer = (uint16_t *)GPU_screen; _gpuFrame.bufferSize = GPU_SCREEN_SIZE_BYTES; break; case DS_DISPLAY_TYPE_TOUCH: _gpuFrame.buffer = (uint16_t *)GPU_screen + (GPU_DISPLAY_WIDTH * GPU_DISPLAY_HEIGHT); _gpuFrame.bufferSize = GPU_SCREEN_SIZE_BYTES; break; case DS_DISPLAY_TYPE_DUAL: _gpuFrame.buffer = (uint16_t *)GPU_screen; _gpuFrame.bufferSize = GPU_SCREEN_SIZE_BYTES * 2; break; default: break; } [super handleEmuFrameProcessed]; } - (void) handleChangeDisplayMode:(NSData *)displayModeData { if (delegate == nil || ![delegate respondsToSelector:@selector(doDisplayModeChanged:)]) { return; } const NSInteger displayModeID = *(NSInteger *)[displayModeData bytes]; [self setDisplayMode:displayModeID]; [delegate doDisplayModeChanged:displayModeID]; } - (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData { NSString *fileURLString = [[NSString alloc] initWithData:fileURLStringData encoding:NSUTF8StringEncoding]; NSURL *fileURL = [NSURL URLWithString:fileURLString]; NSBitmapImageFileType fileType = *(NSBitmapImageFileType *)[fileTypeData bytes]; NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys: fileURL, @"fileURL", [NSNumber numberWithInteger:(NSInteger)fileType], @"fileType", [self image], @"screenshotImage", nil]; [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.requestScreenshotDidFinish" object:self userInfo:userInfo]; [userInfo release]; [fileURLString release]; } - (void) handleCopyToPasteboard { NSImage *screenshot = [self image]; if (screenshot == nil) { return; } NSPasteboard *pboard = [NSPasteboard generalPasteboard]; [pboard declareTypes:[NSArray arrayWithObjects:NSTIFFPboardType, nil] owner:self]; [pboard setData:[screenshot TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1.0f] forType:NSTIFFPboardType]; } - (NSImage *) image { NSImage *newImage = [[NSImage alloc] initWithSize:self.frameSize]; if (newImage == nil) { return newImage; } // Render the frame in an NSBitmapImageRep NSBitmapImageRep *newImageRep = [self bitmapImageRep]; if (newImageRep == nil) { [newImage release]; newImage = nil; return newImage; } // Attach the rendered frame to the NSImageRep [newImage addRepresentation:newImageRep]; return [newImage autorelease]; } - (NSBitmapImageRep *) bitmapImageRep { if (_gpuFrame.buffer == NULL) { return nil; } NSSize srcSize = self.frameSize; NSUInteger w = (NSUInteger)srcSize.width; NSUInteger h = (NSUInteger)srcSize.height; NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:w * 4 bitsPerPixel:32]; if(imageRep == nil) { return imageRep; } uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; pthread_rwlock_rdlock(self.rwlockProducer); RGB555ToRGBA8888Buffer((const uint16_t *)_gpuFrame.buffer, bitmapData, (w * h)); pthread_rwlock_unlock(self.rwlockProducer); #ifdef __BIG_ENDIAN__ uint32_t *bitmapDataEnd = bitmapData + (w * h); while (bitmapData < bitmapDataEnd) { *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); } #endif return [imageRep autorelease]; } @end @implementation CocoaDSDisplayVideo - (id)init { self = [super init]; if (self == nil) { return self; } [property setValue:[NSNumber numberWithInteger:(NSInteger)VideoFilterTypeID_None] forKey:@"videoFilterType"]; [property setValue:[CocoaVideoFilter typeStringByID:VideoFilterTypeID_None] forKey:@"videoFilterTypeString"]; return self; } - (void)dealloc { [super dealloc]; } - (void) runThread:(id)object { NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; [(id)delegate doInitVideoOutput:self.property]; [tempPool release]; [super runThread:object]; } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_REPROCESS_AND_REDRAW: [self handleReprocessAndRedraw]; break; case MESSAGE_RESIZE_VIEW: [self handleResizeView:[messageComponents objectAtIndex:0]]; break; case MESSAGE_TRANSFORM_VIEW: [self handleTransformView:[messageComponents objectAtIndex:0]]; break; case MESSAGE_REDRAW_VIEW: [self handleRedrawView]; break; case MESSAGE_CHANGE_DISPLAY_ORIENTATION: [self handleChangeDisplayOrientation:[messageComponents objectAtIndex:0]]; break; case MESSAGE_CHANGE_DISPLAY_ORDER: [self handleChangeDisplayOrder:[messageComponents objectAtIndex:0]]; break; case MESSAGE_CHANGE_DISPLAY_GAP: [self handleChangeDisplayGap:[messageComponents objectAtIndex:0]]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed { [super handleEmuFrameProcessed]; pthread_rwlock_rdlock(self.rwlockProducer); [(id)delegate doLoadVideoFrame:_gpuFrame.buffer displayMode:_gpuFrame.displayModeID width:_gpuFrame.width height:_gpuFrame.height]; pthread_rwlock_unlock(self.rwlockProducer); [(id)delegate doProcessVideoFrame]; } - (void) handleResizeView:(NSData *)rectData { if (delegate == nil || ![delegate respondsToSelector:@selector(doResizeView:)]) { return; } const NSRect resizeRect = *(NSRect *)[rectData bytes]; [(id)delegate doResizeView:resizeRect]; } - (void) handleTransformView:(NSData *)transformData { if (delegate == nil || ![delegate respondsToSelector:@selector(doTransformView:)]) { return; } [(id)delegate doTransformView:(DisplayOutputTransformData *)[transformData bytes]]; } - (void) handleRedrawView { if (delegate == nil || ![delegate respondsToSelector:@selector(doRedraw)]) { return; } [(id)delegate doRedraw]; } - (void) handleReprocessAndRedraw { [self handleEmuFrameProcessed]; } - (void) handleChangeDisplayOrientation:(NSData *)displayOrientationIdData { if (delegate == nil || ![delegate respondsToSelector:@selector(doDisplayOrientationChanged:)]) { return; } const NSInteger theOrientation = *(NSInteger *)[displayOrientationIdData bytes]; [(id)delegate doDisplayOrientationChanged:theOrientation]; } - (void) handleChangeDisplayOrder:(NSData *)displayOrderIdData { if (delegate == nil || ![delegate respondsToSelector:@selector(doDisplayOrderChanged:)]) { return; } const NSInteger theOrder = *(NSInteger *)[displayOrderIdData bytes]; [(id)delegate doDisplayOrderChanged:theOrder]; } - (void) handleChangeDisplayGap:(NSData *)displayGapScalarData { if (delegate == nil || ![delegate respondsToSelector:@selector(doDisplayGapChanged:)]) { return; } const float gapScalar = *(float *)[displayGapScalarData bytes]; [(id)delegate doDisplayGapChanged:gapScalar]; } @end desmume-0.9.11/src/cocoa/audiosamplegenerator.h0000755000000000000000000000440312467662066020220 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _AUDIO_SAMPLE_GENERATOR_ #define _AUDIO_SAMPLE_GENERATOR_ #include class AudioGenerator { public: AudioGenerator() {}; virtual ~AudioGenerator() {}; virtual size_t generateSampleBlock(size_t sampleCount, uint8_t *outBuffer); virtual uint8_t generateSample(); }; class NullGenerator : public AudioGenerator {}; class AudioSampleBlockGenerator : public AudioGenerator { protected: uint8_t *_buffer; size_t _sampleCount; size_t _samplePosition; public: AudioSampleBlockGenerator() : _buffer(NULL) , _sampleCount(0) , _samplePosition(0) {}; AudioSampleBlockGenerator(const uint8_t *audioBuffer, const size_t sampleCount); ~AudioSampleBlockGenerator(); uint8_t* allocate(const size_t sampleCount); uint8_t* getBuffer() const; size_t getSampleCount() const; size_t getSamplePosition() const; void setSamplePosition(size_t thePosition); virtual uint8_t generateSample(); }; class InternalNoiseGenerator : public AudioSampleBlockGenerator { public: InternalNoiseGenerator(); }; class WhiteNoiseGenerator : public AudioGenerator { public: virtual uint8_t generateSample(); }; class SineWaveGenerator : public AudioGenerator { protected: double _frequency; double _sampleRate; double _cyclePosition; public: SineWaveGenerator(); SineWaveGenerator(const double freq, const double sampleRate); double getFrequency() const; void setFrequency(double freq); double getSampleRate() const; void setSampleRate(double sampleRate); double getCyclePosition() const; void setCyclePosition(double thePosition); virtual uint8_t generateSample(); }; #endif // _AUDIO_SAMPLE_GENERATOR_ desmume-0.9.11/src/cocoa/OGLDisplayOutput.cpp0000755000000000000000000076076512467662066017555 0ustar rootroot/* Copyright (C) 2014-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "OGLDisplayOutput.h" #include "cocoa_globals.h" #include "utilities.h" #include "../filter/videofilter.h" // VERTEX SHADER FOR DISPLAY OUTPUT static const char *Sample1x1OutputVertShader_100 = {"\ ATTRIBUTE vec2 inPosition; \n\ ATTRIBUTE vec2 inTexCoord0; \n\ \n\ uniform vec2 viewSize; \n\ uniform float scalar; \n\ uniform float angleDegrees; \n\ \n\ VARYING vec2 texCoord[1]; \n\ \n\ void main() \n\ { \n\ float angleRadians = radians(angleDegrees); \n\ \n\ mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\ vec2( 0.0, 2.0/viewSize.y)); \n\ \n\ mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\ vec2(sin(angleRadians), cos(angleRadians))); \n\ \n\ mat2 scale = mat2( vec2(scalar, 0.0), \n\ vec2( 0.0, scalar)); \n\ \n\ texCoord[0] = inTexCoord0; \n\ gl_Position = vec4(projection * rotation * scale * inPosition, 0.0, 1.0);\n\ } \n\ "}; static const char *BicubicSample4x4Output_VertShader_110 = {"\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ \n\ uniform vec2 viewSize; \n\ uniform float scalar; \n\ uniform float angleDegrees; \n\ \n\ VARYING vec2 texCoord[16];\n\ \n\ void main()\n\ {\n\ float angleRadians = radians(angleDegrees); \n\ \n\ mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\ vec2( 0.0, 2.0/viewSize.y)); \n\ \n\ mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\ vec2(sin(angleRadians), cos(angleRadians))); \n\ \n\ mat2 scale = mat2( vec2(scalar, 0.0), \n\ vec2( 0.0, scalar)); \n\ \n\ vec2 xystart = floor(inTexCoord0 - 0.5) + 0.5;\n\ \n\ texCoord[ 6] = xystart + vec2(-1.0,-1.0);\n\ texCoord[ 7] = xystart + vec2( 0.0,-1.0);\n\ texCoord[ 8] = xystart + vec2( 1.0,-1.0);\n\ texCoord[ 9] = xystart + vec2( 2.0,-1.0);\n\ \n\ texCoord[ 5] = xystart + vec2(-1.0, 0.0);\n\ texCoord[ 0] = xystart + vec2( 0.0, 0.0); // Center pixel\n\ texCoord[ 1] = xystart + vec2( 1.0, 0.0);\n\ texCoord[10] = xystart + vec2( 2.0, 0.0);\n\ \n\ texCoord[ 4] = xystart + vec2(-1.0, 1.0);\n\ texCoord[ 3] = xystart + vec2( 0.0, 1.0);\n\ texCoord[ 2] = xystart + vec2( 1.0, 1.0);\n\ texCoord[11] = xystart + vec2( 2.0, 1.0);\n\ \n\ texCoord[15] = xystart + vec2(-1.0, 2.0);\n\ texCoord[14] = xystart + vec2( 0.0, 2.0);\n\ texCoord[13] = xystart + vec2( 1.0, 2.0);\n\ texCoord[12] = xystart + vec2( 2.0, 2.0);\n\ \n\ gl_Position = vec4(projection * rotation * scale * inPosition, 0.0, 1.0);\n\ }\n\ "}; static const char *BicubicSample5x5Output_VertShader_110 = {"\ //---------------------------------------\n\ // Input Pixel Mapping: 20|21|22|23|24\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // 16|15|14|13|12\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ \n\ uniform vec2 viewSize; \n\ uniform float scalar; \n\ uniform float angleDegrees; \n\ \n\ VARYING vec2 texCoord[25];\n\ \n\ void main()\n\ {\n\ float angleRadians = radians(angleDegrees); \n\ \n\ mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\ vec2( 0.0, 2.0/viewSize.y)); \n\ \n\ mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\ vec2(sin(angleRadians), cos(angleRadians))); \n\ \n\ mat2 scale = mat2( vec2(scalar, 0.0), \n\ vec2( 0.0, scalar)); \n\ \n\ vec2 xystart = floor(inTexCoord0 - 0.5) + 0.5;\n\ \n\ texCoord[20] = xystart + vec2(-2.0,-2.0);\n\ texCoord[21] = xystart + vec2(-1.0,-2.0);\n\ texCoord[22] = xystart + vec2( 0.0,-2.0);\n\ texCoord[23] = xystart + vec2( 1.0,-2.0);\n\ texCoord[24] = xystart + vec2( 2.0,-2.0);\n\ \n\ texCoord[19] = xystart + vec2(-2.0,-1.0);\n\ texCoord[ 6] = xystart + vec2(-1.0,-1.0);\n\ texCoord[ 7] = xystart + vec2( 0.0,-1.0);\n\ texCoord[ 8] = xystart + vec2( 1.0,-1.0);\n\ texCoord[ 9] = xystart + vec2( 2.0,-1.0);\n\ \n\ texCoord[18] = xystart + vec2(-2.0, 0.0);\n\ texCoord[ 5] = xystart + vec2(-1.0, 0.0);\n\ texCoord[ 0] = xystart + vec2( 0.0, 0.0); // Center pixel\n\ texCoord[ 1] = xystart + vec2( 1.0, 0.0);\n\ texCoord[10] = xystart + vec2( 2.0, 0.0);\n\ \n\ texCoord[17] = xystart + vec2(-2.0, 1.0);\n\ texCoord[ 4] = xystart + vec2(-1.0, 1.0);\n\ texCoord[ 3] = xystart + vec2( 0.0, 1.0);\n\ texCoord[ 2] = xystart + vec2( 1.0, 1.0);\n\ texCoord[11] = xystart + vec2( 2.0, 1.0);\n\ \n\ texCoord[16] = xystart + vec2(-2.0, 2.0);\n\ texCoord[15] = xystart + vec2(-1.0, 2.0);\n\ texCoord[14] = xystart + vec2( 0.0, 2.0);\n\ texCoord[13] = xystart + vec2( 1.0, 2.0);\n\ texCoord[12] = xystart + vec2( 2.0, 2.0);\n\ \n\ gl_Position = vec4(projection * rotation * scale * inPosition, 0.0, 1.0);\n\ }\n\ "}; static const char *BicubicSample6x6Output_VertShader_110 = {"\ //---------------------------------------\n\ // Input Pixel Mapping: 20|21|22|23|24|25\n\ // 19|06|07|08|09|26\n\ // 18|05|00|01|10|27\n\ // 17|04|03|02|11|28\n\ // 16|15|14|13|12|29\n\ // 35|34|33|32|31|30\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ \n\ uniform vec2 viewSize; \n\ uniform float scalar; \n\ uniform float angleDegrees; \n\ \n\ VARYING vec2 texCoord[36];\n\ \n\ void main()\n\ {\n\ float angleRadians = radians(angleDegrees); \n\ \n\ mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\ vec2( 0.0, 2.0/viewSize.y)); \n\ \n\ mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\ vec2(sin(angleRadians), cos(angleRadians))); \n\ \n\ mat2 scale = mat2( vec2(scalar, 0.0), \n\ vec2( 0.0, scalar)); \n\ \n\ vec2 xystart = floor(inTexCoord0 - 0.5) + 0.5;\n\ \n\ texCoord[20] = xystart + vec2(-2.0,-2.0);\n\ texCoord[21] = xystart + vec2(-1.0,-2.0);\n\ texCoord[22] = xystart + vec2( 0.0,-2.0);\n\ texCoord[23] = xystart + vec2( 1.0,-2.0);\n\ texCoord[24] = xystart + vec2( 2.0,-2.0);\n\ texCoord[25] = xystart + vec2( 3.0,-2.0);\n\ \n\ texCoord[19] = xystart + vec2(-2.0,-1.0);\n\ texCoord[ 6] = xystart + vec2(-1.0,-1.0);\n\ texCoord[ 7] = xystart + vec2( 0.0,-1.0);\n\ texCoord[ 8] = xystart + vec2( 1.0,-1.0);\n\ texCoord[ 9] = xystart + vec2( 2.0,-1.0);\n\ texCoord[26] = xystart + vec2( 3.0,-1.0);\n\ \n\ texCoord[18] = xystart + vec2(-2.0, 0.0);\n\ texCoord[ 5] = xystart + vec2(-1.0, 0.0);\n\ texCoord[ 0] = xystart + vec2( 0.0, 0.0); // Center pixel\n\ texCoord[ 1] = xystart + vec2( 1.0, 0.0);\n\ texCoord[10] = xystart + vec2( 2.0, 0.0);\n\ texCoord[27] = xystart + vec2( 3.0, 0.0);\n\ \n\ texCoord[17] = xystart + vec2(-2.0, 1.0);\n\ texCoord[ 4] = xystart + vec2(-1.0, 1.0);\n\ texCoord[ 3] = xystart + vec2( 0.0, 1.0);\n\ texCoord[ 2] = xystart + vec2( 1.0, 1.0);\n\ texCoord[11] = xystart + vec2( 2.0, 1.0);\n\ texCoord[28] = xystart + vec2( 3.0, 1.0);\n\ \n\ texCoord[16] = xystart + vec2(-2.0, 2.0);\n\ texCoord[15] = xystart + vec2(-1.0, 2.0);\n\ texCoord[14] = xystart + vec2( 0.0, 2.0);\n\ texCoord[13] = xystart + vec2( 1.0, 2.0);\n\ texCoord[12] = xystart + vec2( 2.0, 2.0);\n\ texCoord[29] = xystart + vec2( 3.0, 2.0);\n\ \n\ texCoord[35] = xystart + vec2(-2.0, 3.0);\n\ texCoord[34] = xystart + vec2(-1.0, 3.0);\n\ texCoord[33] = xystart + vec2( 0.0, 3.0);\n\ texCoord[32] = xystart + vec2( 1.0, 3.0);\n\ texCoord[31] = xystart + vec2( 2.0, 3.0);\n\ texCoord[30] = xystart + vec2( 3.0, 3.0);\n\ \n\ gl_Position = vec4(projection * rotation * scale * inPosition, 0.0, 1.0);\n\ }\n\ "}; // FRAGMENT SHADER FOR DISPLAY OUTPUT static const char *PassthroughOutputFragShader_110 = {"\ VARYING vec2 texCoord[1];\n\ uniform sampler2DRect tex;\n\ \n\ void main()\n\ {\n\ OUT_FRAG_COLOR.rgb = SAMPLE3_TEX_RECT(tex, texCoord[0]);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; // VERTEX SHADER FOR VIDEO FILTERS static const char *Sample1x1_VertShader_110 = {"\ // For reference, the pixels are mapped as follows:\n\ // Start at center pixel 0 (p0), and circle around it\n\ // in a clockwise fashion, starting from the right.\n\ //---------------------------------------\n\ // Input Pixel Mapping: 20|21|22|23|24\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // 16|15|14|13|12\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ VARYING vec2 texCoord[1];\n\ \n\ void main()\n\ {\n\ texCoord[0] = inTexCoord0;\n\ gl_Position = vec4(inPosition, 0.0, 1.0);\n\ }\n\ "}; static const char *Sample2x2_VertShader_110 = {"\ //---------------------------------------\n\ // Input Pixel Mapping: 00|01\n\ // 03|02\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ VARYING vec2 texCoord[4];\n\ \n\ void main()\n\ {\n\ texCoord[0] = inTexCoord0 + vec2( 0.0, 0.0); // Center pixel\n\ texCoord[1] = inTexCoord0 + vec2( 1.0, 0.0);\n\ texCoord[3] = inTexCoord0 + vec2( 0.0, 1.0);\n\ texCoord[2] = inTexCoord0 + vec2( 1.0, 1.0);\n\ \n\ gl_Position = vec4(inPosition, 0.0, 1.0);\n\ }\n\ "}; static const char *Sample3x3_VertShader_110 = {"\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ VARYING vec2 texCoord[9];\n\ \n\ void main()\n\ {\n\ texCoord[6] = inTexCoord0 + vec2(-1.0,-1.0);\n\ texCoord[7] = inTexCoord0 + vec2( 0.0,-1.0);\n\ texCoord[8] = inTexCoord0 + vec2( 1.0,-1.0);\n\ \n\ texCoord[5] = inTexCoord0 + vec2(-1.0, 0.0);\n\ texCoord[0] = inTexCoord0 + vec2( 0.0, 0.0); // Center pixel\n\ texCoord[1] = inTexCoord0 + vec2( 1.0, 0.0);\n\ \n\ texCoord[4] = inTexCoord0 + vec2(-1.0, 1.0);\n\ texCoord[3] = inTexCoord0 + vec2( 0.0, 1.0);\n\ texCoord[2] = inTexCoord0 + vec2( 1.0, 1.0);\n\ \n\ gl_Position = vec4(inPosition, 0.0, 1.0);\n\ }\n\ "}; static const char *Sample4x4_VertShader_110 = {"\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ VARYING vec2 texCoord[16];\n\ \n\ void main()\n\ {\n\ texCoord[ 6] = inTexCoord0 + vec2(-1.0,-1.0);\n\ texCoord[ 7] = inTexCoord0 + vec2( 0.0,-1.0);\n\ texCoord[ 8] = inTexCoord0 + vec2( 1.0,-1.0);\n\ texCoord[ 9] = inTexCoord0 + vec2( 2.0,-1.0);\n\ \n\ texCoord[ 5] = inTexCoord0 + vec2(-1.0, 0.0);\n\ texCoord[ 0] = inTexCoord0 + vec2( 0.0, 0.0); // Center pixel\n\ texCoord[ 1] = inTexCoord0 + vec2( 1.0, 0.0);\n\ texCoord[10] = inTexCoord0 + vec2( 2.0, 0.0);\n\ \n\ texCoord[ 4] = inTexCoord0 + vec2(-1.0, 1.0);\n\ texCoord[ 3] = inTexCoord0 + vec2( 0.0, 1.0);\n\ texCoord[ 2] = inTexCoord0 + vec2( 1.0, 1.0);\n\ texCoord[11] = inTexCoord0 + vec2( 2.0, 1.0);\n\ \n\ texCoord[15] = inTexCoord0 + vec2(-1.0, 2.0);\n\ texCoord[14] = inTexCoord0 + vec2( 0.0, 2.0);\n\ texCoord[13] = inTexCoord0 + vec2( 1.0, 2.0);\n\ texCoord[12] = inTexCoord0 + vec2( 2.0, 2.0);\n\ \n\ gl_Position = vec4(inPosition, 0.0, 1.0);\n\ }\n\ "}; static const char *Sample5x5_VertShader_110 = {"\ //---------------------------------------\n\ // Input Pixel Mapping: 20|21|22|23|24\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // 16|15|14|13|12\n\ \n\ ATTRIBUTE vec2 inPosition;\n\ ATTRIBUTE vec2 inTexCoord0;\n\ VARYING vec2 texCoord[25];\n\ \n\ void main()\n\ {\n\ texCoord[20] = inTexCoord0 + vec2(-2.0,-2.0);\n\ texCoord[21] = inTexCoord0 + vec2(-1.0,-2.0);\n\ texCoord[22] = inTexCoord0 + vec2( 0.0,-2.0);\n\ texCoord[23] = inTexCoord0 + vec2( 1.0,-2.0);\n\ texCoord[24] = inTexCoord0 + vec2( 2.0,-2.0);\n\ \n\ texCoord[19] = inTexCoord0 + vec2(-2.0,-1.0);\n\ texCoord[ 6] = inTexCoord0 + vec2(-1.0,-1.0);\n\ texCoord[ 7] = inTexCoord0 + vec2( 0.0,-1.0);\n\ texCoord[ 8] = inTexCoord0 + vec2( 1.0,-1.0);\n\ texCoord[ 9] = inTexCoord0 + vec2( 2.0,-1.0);\n\ \n\ texCoord[18] = inTexCoord0 + vec2(-2.0, 0.0);\n\ texCoord[ 5] = inTexCoord0 + vec2(-1.0, 0.0);\n\ texCoord[ 0] = inTexCoord0 + vec2( 0.0, 0.0); // Center pixel\n\ texCoord[ 1] = inTexCoord0 + vec2( 1.0, 0.0);\n\ texCoord[10] = inTexCoord0 + vec2( 2.0, 0.0);\n\ \n\ texCoord[17] = inTexCoord0 + vec2(-2.0, 1.0);\n\ texCoord[ 4] = inTexCoord0 + vec2(-1.0, 1.0);\n\ texCoord[ 3] = inTexCoord0 + vec2( 0.0, 1.0);\n\ texCoord[ 2] = inTexCoord0 + vec2( 1.0, 1.0);\n\ texCoord[11] = inTexCoord0 + vec2( 2.0, 1.0);\n\ \n\ texCoord[16] = inTexCoord0 + vec2(-2.0, 2.0);\n\ texCoord[15] = inTexCoord0 + vec2(-1.0, 2.0);\n\ texCoord[14] = inTexCoord0 + vec2( 0.0, 2.0);\n\ texCoord[13] = inTexCoord0 + vec2( 1.0, 2.0);\n\ texCoord[12] = inTexCoord0 + vec2( 2.0, 2.0);\n\ \n\ gl_Position = vec4(inPosition, 0.0, 1.0);\n\ }\n\ "}; // FRAGMENT SHADER PASSTHROUGH FOR FILTERS static const char *PassthroughFragShader_110 = {"\ VARYING vec2 texCoord[1];\n\ uniform sampler2DRect tex;\n\ \n\ void main()\n\ {\n\ OUT_FRAG_COLOR.rgb = SAMPLE3_TEX_RECT(tex, texCoord[0]);\n\ OUT_FRAG_COLOR.a;\n\ }\n\ "}; // FRAGMENT SHADER FOR DEPOSTERIZATION static const char *FilterDeposterizeFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ \n\ vec3 InterpLTE(vec3 pixA, vec3 pixB, vec3 threshold)\n\ {\n\ vec3 interpPix = mix(pixA, pixB, 0.5);\n\ vec3 pixCompare = vec3( lessThanEqual(abs(pixB - pixA), threshold) );\n\ \n\ return mix(pixA, interpPix, pixCompare);\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ //\n\ // Output Pixel Mapping: A\n\ \n\ void main()\n\ {\n\ vec3 src[9];\n\ src[0] = SAMPLE3_TEX_RECT(tex, texCoord[0]);\n\ src[1] = SAMPLE3_TEX_RECT(tex, texCoord[1]);\n\ src[2] = SAMPLE3_TEX_RECT(tex, texCoord[2]);\n\ src[3] = SAMPLE3_TEX_RECT(tex, texCoord[3]);\n\ src[4] = SAMPLE3_TEX_RECT(tex, texCoord[4]);\n\ src[5] = SAMPLE3_TEX_RECT(tex, texCoord[5]);\n\ src[6] = SAMPLE3_TEX_RECT(tex, texCoord[6]);\n\ src[7] = SAMPLE3_TEX_RECT(tex, texCoord[7]);\n\ src[8] = SAMPLE3_TEX_RECT(tex, texCoord[8]);\n\ \n\ const vec3 threshold = vec3(0.1020);\n\ \n\ float weight[2];\n\ weight[0] = 0.90;\n\ weight[1] = weight[0] * 0.60;\n\ \n\ vec3 blend[9];\n\ blend[0] = src[0];\n\ blend[1] = InterpLTE(src[0], src[1], threshold);\n\ blend[2] = InterpLTE(src[0], src[2], threshold);\n\ blend[3] = InterpLTE(src[0], src[3], threshold);\n\ blend[4] = InterpLTE(src[0], src[4], threshold);\n\ blend[5] = InterpLTE(src[0], src[5], threshold);\n\ blend[6] = InterpLTE(src[0], src[6], threshold);\n\ blend[7] = InterpLTE(src[0], src[7], threshold);\n\ blend[8] = InterpLTE(src[0], src[8], threshold);\n\ \n\ OUT_FRAG_COLOR.rgb = mix(\n\ mix(\n\ mix(\n\ mix(blend[0], blend[5], weight[0]), mix(blend[0], blend[1], weight[0]),\n\ 0.50),\n\ mix(\n\ mix(blend[0], blend[7], weight[0]), mix(blend[0], blend[3], weight[0]),\n\ 0.50),\n\ 0.50),\n\ mix(\n\ mix(\n\ mix(blend[0], blend[6], weight[1]), mix(blend[0], blend[2], weight[1]),\n\ 0.50),\n\ mix(\n\ mix(blend[0], blend[8], weight[1]), mix(blend[0], blend[4], weight[1]),\n\ 0.50),\n\ 0.50),\n\ 0.25);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *FilterBicubicBSplineFragShader_110 = {"\ VARYING vec2 texCoord[16];\n\ uniform sampler2DRect tex;\n\ \n\ vec4 WeightBSpline(float f)\n\ {\n\ return vec4(((1.0-f)*(1.0-f)*(1.0-f)) / 6.0,\n\ (4.0 - 6.0*f*f + 3.0*f*f*f) / 6.0,\n\ (1.0 + 3.0*f + 3.0*f*f - 3.0*f*f*f) / 6.0,\n\ f*f*f / 6.0);\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ \n\ void main()\n\ {\n\ vec2 f = fract(texCoord[0]);\n\ vec4 wx = WeightBSpline(f.x);\n\ vec4 wy = WeightBSpline(f.y);\n\ \n\ // Normalize weights\n\ wx /= dot(wx, vec4(1.0));\n\ wy /= dot(wy, vec4(1.0));\n\ \n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, texCoord[ 6]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 7]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 8]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 9]) * wx.a) * wy.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 5]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 1]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[10]) * wx.a) * wy.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 4]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 3]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 2]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[11]) * wx.a) * wy.b\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[15]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[14]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[13]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[12]) * wx.a) * wy.a;\n\ OUT_FRAG_COLOR.a;\n\ }\n\ "}; static const char *FilterBicubicBSplineFastFragShader_110 = {"\ VARYING vec2 texCoord[1];\n\ uniform sampler2DRect tex;\n\ \n\ void main()\n\ {\n\ vec2 texCenterPosition = floor(texCoord[0] - 0.5) + 0.5;\n\ vec2 f = abs(texCoord[0] - texCenterPosition);\n\ \n\ vec2 w0 = ((1.0-f)*(1.0-f)*(1.0-f)) / 6.0;\n\ vec2 w1 = (4.0 - 6.0*f*f + 3.0*f*f*f) / 6.0;\n\ vec2 w3 = f*f*f / 6.0;\n\ vec2 w2 = 1.0 - w0 - w1 - w3;\n\ \n\ vec2 s0 = w0 + w1;\n\ vec2 s1 = w2 + w3;\n\ \n\ vec2 t0 = texCenterPosition - 1.0 + (w1 / s0);\n\ vec2 t1 = texCenterPosition + 1.0 + (w3 / s1);\n\ \n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, vec2(t0.x, t0.y)) * s0.x +\n\ SAMPLE3_TEX_RECT(tex, vec2(t1.x, t0.y)) * s1.x) * s0.y +\n\ (SAMPLE3_TEX_RECT(tex, vec2(t0.x, t1.y)) * s0.x +\n\ SAMPLE3_TEX_RECT(tex, vec2(t1.x, t1.y)) * s1.x) * s1.y;\n\ OUT_FRAG_COLOR.a;\n\ }\n\ "}; static const char *FilterBicubicMitchellNetravaliFragShader_110 = {"\ VARYING vec2 texCoord[16];\n\ uniform sampler2DRect tex;\n\ \n\ vec4 WeightMitchellNetravali(float f)\n\ {\n\ return vec4((1.0 - 9.0*f + 15.0*f*f - 7.0*f*f*f) / 18.0,\n\ (16.0 - 36.0*f*f + 21.0*f*f*f) / 18.0,\n\ (1.0 + 9.0*f + 27.0*f*f - 21.0*f*f*f) / 18.0,\n\ (7.0*f*f*f - 6.0*f*f) / 18.0);\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ \n\ void main()\n\ {\n\ vec2 f = fract(texCoord[0]);\n\ vec4 wx = WeightMitchellNetravali(f.x);\n\ vec4 wy = WeightMitchellNetravali(f.y);\n\ \n\ // Normalize weights\n\ wx /= dot(wx, vec4(1.0));\n\ wy /= dot(wy, vec4(1.0));\n\ \n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, texCoord[ 6]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 7]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 8]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 9]) * wx.a) * wy.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 5]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 1]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[10]) * wx.a) * wy.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 4]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 3]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 2]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[11]) * wx.a) * wy.b\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[15]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[14]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[13]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[12]) * wx.a) * wy.a;\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *FilterBicubicMitchellNetravaliFastFragShader_110 = {"\ VARYING vec2 texCoord[1];\n\ uniform sampler2DRect tex;\n\ \n\ void main()\n\ {\n\ vec2 texCenterPosition = floor(texCoord[0] - 0.5) + 0.5;\n\ vec2 f = abs(texCoord[0] - texCenterPosition);\n\ \n\ vec2 w0 = (1.0 - 9.0*f + 15.0*f*f - 7.0*f*f*f) / 18.0;\n\ vec2 w1 = (16.0 - 36.0*f*f + 21.0*f*f*f) / 18.0;\n\ vec2 w3 = (7.0*f*f*f - 6.0*f*f) / 18.0;\n\ vec2 w2 = 1.0 - w0 - w1 - w3;\n\ \n\ vec2 s0 = w0 + w1;\n\ vec2 s1 = w2 + w3;\n\ \n\ vec2 t0 = texCenterPosition - 1.0 + (w1 / s0);\n\ vec2 t1 = texCenterPosition + 1.0 + (w3 / s1);\n\ \n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, vec2(t0.x, t0.y)) * s0.x +\n\ SAMPLE3_TEX_RECT(tex, vec2(t1.x, t0.y)) * s1.x) * s0.y +\n\ (SAMPLE3_TEX_RECT(tex, vec2(t0.x, t1.y)) * s0.x +\n\ SAMPLE3_TEX_RECT(tex, vec2(t1.x, t1.y)) * s1.x) * s1.y;\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *FilterLanczos2FragShader_110 = {"\ #define PI 3.1415926535897932384626433832795\n\ #define RADIUS 2.0\n\ #define FIX(c) max(abs(c), 1e-5)\n\ \n\ VARYING vec2 texCoord[16];\n\ uniform sampler2DRect tex;\n\ \n\ vec4 WeightLanczos2(float f)\n\ {\n\ vec4 sample = FIX(PI * vec4(1.0 + f, f, 1.0 - f, 2.0 - f));\n\ return ( sin(sample) * sin(sample / RADIUS) / (sample * sample) );\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ \n\ void main()\n\ {\n\ vec2 f = fract(texCoord[0]);\n\ vec4 wx = WeightLanczos2(f.x);\n\ vec4 wy = WeightLanczos2(f.y);\n\ \n\ // Normalize weights\n\ wx /= dot(wx, vec4(1.0));\n\ wy /= dot(wy, vec4(1.0));\n\ \n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, texCoord[ 6]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 7]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 8]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 9]) * wx.a) * wy.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 5]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 1]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[10]) * wx.a) * wy.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 4]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 3]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 2]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[11]) * wx.a) * wy.b\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[15]) * wx.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[14]) * wx.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[13]) * wx.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[12]) * wx.a) * wy.a;\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *FilterLanczos3FragShader_110 = {"\ #define PI 3.1415926535897932384626433832795\n\ #define RADIUS 3.0\n\ #define FIX(c) max(abs(c), 1e-5)\n\ \n\ #if GPU_TIER >= SHADERSUPPORT_HIGH_TIER\n\ VARYING vec2 texCoord[36];\n\ #elif GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ VARYING vec2 texCoord[25];\n\ #else\n\ VARYING vec2 texCoord[16];\n\ #endif\n\ uniform sampler2DRect tex;\n\ \n\ vec3 weight3(float x)\n\ {\n\ vec3 sample = FIX(2.0 * PI * vec3(x - 1.5, x - 0.5, x + 0.5));\n\ return ( sin(sample) * sin(sample / RADIUS) / (sample * sample) );\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 20|21|22|23|24|25\n\ // 19|06|07|08|09|26\n\ // 18|05|00|01|10|27\n\ // 17|04|03|02|11|28\n\ // 16|15|14|13|12|29\n\ // 35|34|33|32|31|30\n\ \n\ void main()\n\ {\n\ vec2 f = fract(texCoord[0]);\n\ vec3 wx1 = weight3(0.5 - f.x * 0.5);\n\ vec3 wx2 = weight3(1.0 - f.x * 0.5);\n\ vec3 wy1 = weight3(0.5 - f.y * 0.5);\n\ vec3 wy2 = weight3(1.0 - f.y * 0.5);\n\ \n\ // Normalize weights\n\ float sumX = dot(wx1, vec3(1.0)) + dot(wx2, vec3(1.0));\n\ float sumY = dot(wy1, vec3(1.0)) + dot(wy2, vec3(1.0));\n\ wx1 /= sumX;\n\ wx2 /= sumX;\n\ wy1 /= sumY;\n\ wy2 /= sumY;\n\ \n\ #if GPU_TIER >= SHADERSUPPORT_HIGH_TIER\n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, texCoord[20]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[21]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[22]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[23]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[24]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[25]) * wx2.b) * wy1.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[19]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 6]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 7]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 8]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 9]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[26]) * wx2.b) * wy2.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[18]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 5]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 1]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[10]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[27]) * wx2.b) * wy1.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[17]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 4]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 3]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 2]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[11]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[28]) * wx2.b) * wy2.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[16]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[15]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[14]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[13]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[12]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[29]) * wx2.b) * wy1.b\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[35]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[34]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[33]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[32]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[31]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[30]) * wx2.b) * wy2.b;\n\ #elif GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, texCoord[20]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[21]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[22]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[23]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[24]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0,-2.0)) * wx2.b) * wy1.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[19]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 6]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 7]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 8]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 9]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0,-1.0)) * wx2.b) * wy2.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[18]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 5]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 1]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[10]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 0.0)) * wx2.b) * wy1.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[17]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 4]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 3]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 2]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[11]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 1.0)) * wx2.b) * wy2.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[16]) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[15]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[14]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[13]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[12]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 2.0)) * wx2.b) * wy1.b\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-2.0, 3.0)) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-1.0, 3.0)) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 0.0, 3.0)) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 1.0, 3.0)) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 2.0, 3.0)) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 3.0)) * wx2.b) * wy2.b;\n\ #else\n\ OUT_FRAG_COLOR.rgb = (SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-2.0,-2.0)) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-1.0,-2.0)) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 0.0,-2.0)) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 1.0,-2.0)) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 2.0,-2.0)) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0,-2.0)) * wx2.b) * wy1.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-2.0,-1.0)) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 6]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 7]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 8]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 9]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0,-1.0)) * wx2.b) * wy2.r\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-2.0, 0.0)) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 5]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 1]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[10]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 0.0)) * wx2.b) * wy1.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-2.0, 1.0)) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 4]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 3]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 2]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[11]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 1.0)) * wx2.b) * wy2.g\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-2.0, 2.0)) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[15]) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[14]) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[13]) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[12]) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 2.0)) * wx2.b) * wy1.b\n\ + (SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-2.0, 3.0)) * wx1.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2(-1.0, 3.0)) * wx2.r\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 0.0, 3.0)) * wx1.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 1.0, 3.0)) * wx2.g\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 2.0, 3.0)) * wx1.b\n\ + SAMPLE3_TEX_RECT(tex, texCoord[ 0] + vec2( 3.0, 3.0)) * wx2.b) * wy2.b;\n\ #endif\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scalar2xScanlineFragShader_110 = {"\ VARYING vec2 texCoord[1];\n\ uniform sampler2DRect tex;\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 00\n\ //\n\ // Output Pixel Mapping: A|B\n\ // C|D\n\ \n\ void main()\n\ {\n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ float w = mix( mix(1.000, 0.875, f.x), mix(0.875, 0.750, f.x), f.y );\n\ \n\ OUT_FRAG_COLOR.rgb = SAMPLE3_TEX_RECT(tex, texCoord[0]) * w;\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scalar2xEPXFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ \n\ float reduce(vec3 color)\n\ {\n\ return dot(color, vec3(65536.0, 256.0, 1.0));\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: --|07|--\n\ // 05|00|01\n\ // --|03|--\n\ //\n\ // Output Pixel Mapping: A|B\n\ // C|D\n\ \n\ void main()\n\ {\n\ vec3 src7 = SAMPLE3_TEX_RECT(tex, texCoord[7]);\n\ vec3 src5 = SAMPLE3_TEX_RECT(tex, texCoord[5]);\n\ vec3 src0 = SAMPLE3_TEX_RECT(tex, texCoord[0]);\n\ vec3 src1 = SAMPLE3_TEX_RECT(tex, texCoord[1]);\n\ vec3 src3 = SAMPLE3_TEX_RECT(tex, texCoord[3]);\n\ float v7 = reduce(src7);\n\ float v5 = reduce(src5);\n\ float v1 = reduce(src1);\n\ float v3 = reduce(src3);\n\ \n\ bool pixCompare = (v5 != v1) && (v7 != v3);\n\ vec3 outA = (pixCompare && (v7 == v5)) ? src7 : src0;\n\ vec3 outB = (pixCompare && (v1 == v7)) ? src1 : src0;\n\ vec3 outC = (pixCompare && (v5 == v3)) ? src5 : src0;\n\ vec3 outD = (pixCompare && (v3 == v1)) ? src3 : src0;\n\ \n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ OUT_FRAG_COLOR.rgb = mix( mix(outA, outB, f.x), mix(outC, outD, f.x), f.y );\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scalar2xEPXPlusFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ \n\ float dist(vec3 pixA, vec3 pixB)\n\ {\n\ return dot(abs(pixA - pixB), vec3(2.0, 3.0, 3.0));\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: --|07|--\n\ // 05|00|01\n\ // --|03|--\n\ //\n\ // Output Pixel Mapping: A|B\n\ // C|D\n\ \n\ void main()\n\ {\n\ vec3 src7 = SAMPLE3_TEX_RECT(tex, texCoord[7]);\n\ vec3 src5 = SAMPLE3_TEX_RECT(tex, texCoord[5]);\n\ vec3 src0 = SAMPLE3_TEX_RECT(tex, texCoord[0]);\n\ vec3 src1 = SAMPLE3_TEX_RECT(tex, texCoord[1]);\n\ vec3 src3 = SAMPLE3_TEX_RECT(tex, texCoord[3]);\n\ \n\ vec3 outA = ( dist(src5, src7) < min(dist(src5, src3), dist(src1, src7)) ) ? mix(src5, src7, 0.5) : src0;\n\ vec3 outB = ( dist(src1, src7) < min(dist(src5, src7), dist(src1, src3)) ) ? mix(src1, src7, 0.5) : src0;\n\ vec3 outC = ( dist(src5, src3) < min(dist(src5, src7), dist(src1, src3)) ) ? mix(src5, src3, 0.5) : src0;\n\ vec3 outD = ( dist(src1, src3) < min(dist(src5, src3), dist(src1, src7)) ) ? mix(src1, src3, 0.5) : src0;\n\ \n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ OUT_FRAG_COLOR.rgb = mix( mix(outA, outB, f.x), mix(outC, outD, f.x), f.y );\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scalar2xSaIFragShader_110 = {"\ VARYING vec2 texCoord[16];\n\ uniform sampler2DRect tex;\n\ \n\ const vec3 dt = vec3(65536.0, 256.0, 1.0);\n\ \n\ float GetResult(float v1, float v2, float v3, float v4)\n\ {\n\ return sign(abs(v1-v3)+abs(v1-v4))-sign(abs(v2-v3)+abs(v2-v4));\n\ }\n\ \n\ float reduce(vec3 color)\n\ {\n\ return dot(color, dt);\n\ }\n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ //\n\ // Output Pixel Mapping: A|B\n\ // C|D\n\ \n\ //---------------------------------------\n\ // 2xSaI Pixel Mapping: I|E|F|J\n\ // G|A|B|K\n\ // H|C|D|L\n\ // M|N|O|P\n\ \n\ void main()\n\ {\n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ \n\ float Iv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb );\n\ float Ev = reduce( SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb );\n\ float Fv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb );\n\ float Jv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[9]).rgb );\n\ \n\ float Gv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb );\n\ vec3 Ac = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb; float Av = reduce(Ac);\n\ vec3 Bc = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb; float Bv = reduce(Bc);\n\ float Kv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb );\n\ \n\ float Hv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb );\n\ vec3 Cc = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb; float Cv = reduce(Cc);\n\ vec3 Dc = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb; float Dv = reduce(Dc);\n\ float Lv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb );\n\ \n\ float Mv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[15]).rgb );\n\ float Nv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb );\n\ float Ov = reduce( SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb );\n\ // Pv is unused, so skip this one.\n\ \n\ vec3 outA = Ac;\n\ vec3 outB = Ac;\n\ vec3 outC = Ac;\n\ vec3 outD = Ac;\n\ \n\ bool compAD = (Av == Dv);\n\ bool compBC = (Bv == Cv);\n\ \n\ if (compAD && !compBC)\n\ {\n\ outB = ((Av == Ev) && (Bv == Lv)) || ((Av == Cv) && (Av == Fv) && (Bv != Ev) && (Bv == Jv)) ? Ac : mix(Ac, Bc, 0.5);\n\ outC = ((Av == Gv) && (Cv == Ov)) || ((Av == Bv) && (Av == Hv) && (Cv != Gv) && (Cv == Mv)) ? Ac : mix(Ac, Cc, 0.5);\n\ }\n\ else if (!compAD && compBC)\n\ {\n\ outB = ((Bv == Fv) && (Av == Hv)) || ((Bv == Ev) && (Bv == Dv) && (Av != Fv) && (Av == Iv)) ? Bc : mix(Ac, Bc, 0.5);\n\ outC = ((Cv == Hv) && (Av == Fv)) || ((Cv == Gv) && (Cv == Dv) && (Av != Hv) && (Av == Iv)) ? Cc : mix(Ac, Cc, 0.5);\n\ outD = Bc;\n\ }\n\ else if (compAD && compBC)\n\ {\n\ outB = (Av == Bv) ? Ac : mix(Ac, Bc, 0.5);\n\ outC = (Av == Bv) ? Ac : mix(Ac, Cc, 0.5);\n\ \n\ float r = (Av == Bv) ? 1.0 : GetResult(Av, Bv, Gv, Ev) - GetResult(Bv, Av, Kv, Fv) - GetResult(Bv, Av, Hv, Nv) + GetResult(Av, Bv, Lv, Ov);\n\ outD = (r > 0.0) ? Ac : ( (r < 0.0) ? Bc : mix( mix(Ac, Bc, 0.5), mix(Cc, Dc, 0.5), 0.5) );\n\ }\n\ else\n\ {\n\ outB = ((Av == Cv) && (Av == Fv) && (Bv != Ev) && (Bv == Jv)) ? Ac : ( ((Bv == Ev) && (Bv == Dv) && (Av != Fv) && (Av == Iv)) ? Bc : mix(Ac, Bc, 0.5) );\n\ outC = ((Av == Bv) && (Av == Hv) && (Cv != Gv) && (Cv == Mv)) ? Ac : ( ((Cv == Gv) && (Cv == Dv) && (Av != Hv) && (Av == Iv)) ? Cc : mix(Ac, Cc, 0.5) );\n\ outD = mix( mix(Ac, Bc, 0.5), mix(Cc, Dc, 0.5), 0.5 );\n\ }\n\ \n\ OUT_FRAG_COLOR.rgb = mix( mix(outA, outB, f.x), mix(outC, outD, f.x), f.y );\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalarSuper2xSaIFragShader_110 = {"\ VARYING vec2 texCoord[16];\n\ uniform sampler2DRect tex;\n\ \n\ const vec3 dt = vec3(65536.0, 256.0, 1.0);\n\ \n\ float GetResult(float v1, float v2, float v3, float v4)\n\ {\n\ return sign(abs(v1-v3)+abs(v1-v4))-sign(abs(v2-v3)+abs(v2-v4));\n\ }\n\ \n\ float reduce(vec3 color)\n\ {\n\ return dot(color, dt);\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ //\n\ // Output Pixel Mapping: A|B\n\ // C|D\n\ \n\ //---------------------------------------\n\ // S2xSaI Pixel Mapping: I|E|F|J\n\ // G|A|B|K\n\ // H|C|D|L\n\ // M|N|O|P\n\ \n\ void main()\n\ {\n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ \n\ float Iv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb );\n\ float Ev = reduce( SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb );\n\ float Fv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb );\n\ float Jv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[9]).rgb );\n\ \n\ float Gv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb );\n\ vec3 Ac = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb; float Av = reduce(Ac);\n\ vec3 Bc = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb; float Bv = reduce(Bc);\n\ float Kv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb );\n\ \n\ float Hv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb );\n\ vec3 Cc = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb; float Cv = reduce(Cc);\n\ vec3 Dc = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb; float Dv = reduce(Dc);\n\ float Lv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb );\n\ \n\ float Mv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[15]).rgb );\n\ float Nv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb );\n\ float Ov = reduce( SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb );\n\ float Pv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[12]).rgb );\n\ \n\ bool compAD = (Av == Dv);\n\ bool compBC = (Bv == Cv);\n\ \n\ vec3 outA = ( (compBC && !compAD && (Hv == Cv) && (Cv != Fv)) || ((Gv == Cv) && (Dv == Cv) && (Hv != Av) && (Cv != Iv)) ) ? mix(Ac, Cc, 0.5) : Ac;\n\ vec3 outB = Bc;\n\ vec3 outC = ( (compAD && !compBC && (Gv == Av) && (Av != Ov)) || ((Av == Hv) && (Av == Bv) && (Gv != Cv) && (Av != Mv)) ) ? mix(Ac, Cc, 0.5) : Cc;\n\ vec3 outD = Dc;\n\ \n\ if (compBC && !compAD)\n\ {\n\ outB = outD = Cc;\n\ }\n\ else if (!compBC && compAD)\n\ {\n\ outB = outD = Ac;\n\ }\n\ else if (compBC && compAD)\n\ {\n\ float r = GetResult(Bv, Av, Hv, Nv) + GetResult(Bv, Av, Gv, Ev) + GetResult(Bv, Av, Ov, Lv) + GetResult(Bv, Av, Fv, Kv);\n\ outB = outD = (r > 0.0) ? Bc : ( (r < 0.0) ? Ac : mix(Ac, Bc, 0.5) );\n\ }\n\ else\n\ {\n\ outB = ( (Bv == Dv) && (Bv == Ev) && (Av != Fv) && (Bv != Iv) ) ? mix(Ac, Bc, 0.75) : ( ( (Av == Cv) && (Av == Fv) && (Ev != Bv) && (Av != Jv) ) ? mix(Ac, Bc, 0.25) : mix(Ac, Bc, 0.5) );\n\ outD = ( (Bv == Dv) && (Dv == Nv) && (Cv != Ov) && (Dv != Mv) ) ? mix(Cc, Dc, 0.75) : ( ( (Av == Cv) && (Cv == Ov) && (Nv != Dv) && (Cv != Pv) ) ? mix(Cc, Dc, 0.25) : mix(Cc, Dc, 0.5) );\n\ }\n\ \n\ OUT_FRAG_COLOR.rgb = mix( mix(outA, outB, f.x), mix(outC, outD, f.x), f.y );\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalarSuperEagle2xFragShader_110 = {"\ VARYING vec2 texCoord[16];\n\ uniform sampler2DRect tex;\n\ \n\ const vec3 dt = vec3(65536.0, 256.0, 1.0);\n\ \n\ float GetResult(float v1, float v2, float v3, float v4)\n\ {\n\ return sign(abs(v1-v3)+abs(v1-v4))-sign(abs(v2-v3)+abs(v2-v4));\n\ }\n\ \n\ float reduce(vec3 color)\n\ {\n\ return dot(color, dt);\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: --|07|08|--\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // --|14|13|--\n\ //\n\ // Output Pixel Mapping: A|B\n\ // C|D\n\ \n\ //---------------------------------------\n\ // SEagle Pixel Mapping: -|E|F|-\n\ // G|A|B|K\n\ // H|C|D|L\n\ // -|N|O|-\n\ \n\ void main()\n\ {\n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ \n\ float Ev = reduce( SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb );\n\ float Fv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb );\n\ \n\ float Gv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb );\n\ vec3 Ac = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb; float Av = reduce(Ac);\n\ vec3 Bc = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb; float Bv = reduce(Bc);\n\ float Kv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb );\n\ \n\ float Hv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb );\n\ vec3 Cc = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb; float Cv = reduce(Cc);\n\ vec3 Dc = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb; float Dv = reduce(Dc);\n\ float Lv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb );\n\ \n\ float Nv = reduce( SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb );\n\ float Ov = reduce( SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb );\n\ \n\ vec3 outA = Ac;\n\ vec3 outB = Bc;\n\ vec3 outC = Cc;\n\ vec3 outD = Dc;\n\ bool compAD = (Av == Dv);\n\ bool compBC = (Bv == Cv);\n\ \n\ if (compBC && !compAD)\n\ {\n\ outA = (Cv == Hv || Bv == Fv) ? mix(Ac, Cc, 0.75) : mix(Ac, Bc, 0.5);\n\ //outA = mix( mix(Ac, Bc, 0.5), mix(Ac, Cc, 0.75), float(Cv == Hv || Bv == Fv) );\n\ outB = Cc;\n\ //outC = Cc;\n\ outD = mix( mix(Dc, Cc, 0.5), mix(Dc, Cc, 0.75), float(Bv == Kv || Cv == Nv) );\n\ }\n\ else if (!compBC && compAD)\n\ {\n\ //outA = Ac;\n\ outB = mix( mix(Ac, Bc, 0.5), mix(Ac, Bc, 0.25), float(Av == Ev || Dv == Lv) );\n\ outC = mix( mix(Cc, Dc, 0.5), mix(Ac, Cc, 0.25), float(Dv == Ov || Av == Gv) );\n\ outD = Ac;\n\ }\n\ else if (compBC && compAD)\n\ {\n\ float r = GetResult(Bv, Av, Hv, Nv) + GetResult(Bv, Av, Gv, Ev) + GetResult(Bv, Av, Ov, Lv) + GetResult(Bv, Av, Fv, Kv);\n\ if (r > 0.0)\n\ {\n\ outA = mix(Ac, Bc, 0.5);\n\ outB = Cc;\n\ //outC = Cc;\n\ outD = outA;\n\ }\n\ else if (r < 0.0)\n\ {\n\ //outA = Ac;\n\ outB = mix(Ac, Bc, 0.5);\n\ outC = outB;\n\ outD = Ac;\n\ }\n\ else\n\ {\n\ //outA = Ac;\n\ outB = Cc;\n\ //outC = Cc;\n\ outD = Ac;\n\ }\n\ }\n\ else\n\ {\n\ outA = mix(mix(Bc, Cc, 0.5), Ac, 0.75);\n\ outB = mix(mix(Ac, Dc, 0.5), Bc, 0.75);\n\ outC = mix(mix(Ac, Dc, 0.5), Cc, 0.75);\n\ outD = mix(mix(Bc, Cc, 0.5), Dc, 0.75);\n\ }\n\ \n\ OUT_FRAG_COLOR.rgb = mix( mix(outA, outB, f.x), mix(outC, outD, f.x), f.y );\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalerLQ2xFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ uniform sampler3D lut;\n\ \n\ float reduce(vec3 color)\n\ {\n\ return dot(color, vec3(65536.0, 256.0, 1.0));\n\ }\n\ \n\ vec3 Lerp(vec3 weight, vec3 p1, vec3 p2, vec3 p3)\n\ {\n\ return p1*weight.r + p2*weight.g + p3*weight.b;\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ //\n\ // Output Pixel Mapping: 00|01\n\ // 02|03\n\ \n\ //---------------------------------------\n\ // LQ2x Pixel Mapping: 0|1|2\n\ // 3|4|5\n\ // 6|7|8\n\ \n\ void main()\n\ {\n\ vec3 src[9];\n\ src[0] = SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb;\n\ src[1] = SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb;\n\ src[2] = SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb;\n\ src[3] = SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb;\n\ src[4] = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb;\n\ src[5] = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb;\n\ src[6] = SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb;\n\ src[7] = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb;\n\ src[8] = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb;\n\ \n\ float v[9];\n\ v[0] = reduce(src[0]);\n\ v[1] = reduce(src[1]);\n\ v[2] = reduce(src[2]);\n\ v[3] = reduce(src[3]);\n\ v[4] = reduce(src[4]);\n\ v[5] = reduce(src[5]);\n\ v[6] = reduce(src[6]);\n\ v[7] = reduce(src[7]);\n\ v[8] = reduce(src[8]);\n\ \n\ float pattern = (float(v[0] != v[4]) * 1.0) +\n\ (float(v[1] != v[4]) * 2.0) +\n\ (float(v[2] != v[4]) * 4.0) +\n\ (float(v[3] != v[4]) * 8.0) +\n\ (float(v[5] != v[4]) * 16.0) +\n\ (float(v[6] != v[4]) * 32.0) +\n\ (float(v[7] != v[4]) * 64.0) +\n\ (float(v[8] != v[4]) * 128.0);\n\ \n\ float compare = (float(v[1] != v[5]) * 1.0) +\n\ (float(v[5] != v[7]) * 2.0) +\n\ (float(v[7] != v[3]) * 4.0) +\n\ (float(v[3] != v[1]) * 8.0);\n\ \n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ float k = (f.y*2.0) + f.x;\n\ vec3 p = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+0.0)+0.5)/512.0, (k+0.5)/4.0, (compare+0.5)/16.0));\n\ vec3 w = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+1.0)+0.5)/512.0, (k+0.5)/4.0, (compare+0.5)/16.0));\n\ \n\ vec3 dst[3];\n\ dst[0] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.r)), step(7.0*30.95/255.0, p.r)), step(6.0*30.95/255.0, p.r)), step(5.0*30.95/255.0, p.r)), step(4.0*30.95/255.0, p.r)), step(3.0*30.95/255.0, p.r)), step(2.0*30.95/255.0, p.r)), step(1.0*30.95/255.0, p.r));\n\ dst[1] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.g)), step(7.0*30.95/255.0, p.g)), step(6.0*30.95/255.0, p.g)), step(5.0*30.95/255.0, p.g)), step(4.0*30.95/255.0, p.g)), step(3.0*30.95/255.0, p.g)), step(2.0*30.95/255.0, p.g)), step(1.0*30.95/255.0, p.g));\n\ dst[2] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.b)), step(7.0*30.95/255.0, p.b)), step(6.0*30.95/255.0, p.b)), step(5.0*30.95/255.0, p.b)), step(4.0*30.95/255.0, p.b)), step(3.0*30.95/255.0, p.b)), step(2.0*30.95/255.0, p.b)), step(1.0*30.95/255.0, p.b));\n\ \n\ OUT_FRAG_COLOR.rgb = Lerp(w, dst[0], dst[1], dst[2]);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalerLQ2xSFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ uniform sampler3D lut;\n\ \n\ vec3 Lerp(vec3 weight, vec3 p1, vec3 p2, vec3 p3)\n\ {\n\ return p1*weight.r + p2*weight.g + p3*weight.b;\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ //\n\ // Output Pixel Mapping: 00|01\n\ // 02|03\n\ \n\ //---------------------------------------\n\ // LQ2xS Pixel Mapping: 0|1|2\n\ // 3|4|5\n\ // 6|7|8\n\ \n\ void main()\n\ {\n\ vec3 src[9];\n\ src[0] = SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb;\n\ src[1] = SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb;\n\ src[2] = SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb;\n\ src[3] = SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb;\n\ src[4] = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb;\n\ src[5] = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb;\n\ src[6] = SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb;\n\ src[7] = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb;\n\ src[8] = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb;\n\ \n\ float b[9];\n\ float minBright = 10.0;\n\ float maxBright = 0.0;\n\ \n\ for (int i = 0; i < 9; i++)\n\ {\n\ b[i] = (src[i].r + src[i].r + src[i].r) + (src[i].g + src[i].g + src[i].g) + (src[i].b + src[i].b);\n\ minBright = min(minBright, b[i]);\n\ maxBright = max(maxBright, b[i]);\n\ }\n\ \n\ float diffBright = (maxBright - minBright) / 16.0;\n\ float pattern = step((0.5*1.0/127.5), diffBright) * ((float(abs(b[0] - b[4]) > diffBright) * 1.0) +\n\ (float(abs(b[1] - b[4]) > diffBright) * 2.0) +\n\ (float(abs(b[2] - b[4]) > diffBright) * 4.0) +\n\ (float(abs(b[3] - b[4]) > diffBright) * 8.0) +\n\ (float(abs(b[5] - b[4]) > diffBright) * 16.0) +\n\ (float(abs(b[6] - b[4]) > diffBright) * 32.0) +\n\ (float(abs(b[7] - b[4]) > diffBright) * 64.0) +\n\ (float(abs(b[8] - b[4]) > diffBright) * 128.0));\n\ \n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ float k = (f.y*2.0) + f.x;\n\ vec3 p = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+0.0)+0.5)/512.0, (k+0.5)/4.0, 0.5/16.0));\n\ vec3 w = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+1.0)+0.5)/512.0, (k+0.5)/4.0, 0.5/16.0));\n\ \n\ vec3 dst[3];\n\ dst[0] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.r)), step(7.0*30.95/255.0, p.r)), step(6.0*30.95/255.0, p.r)), step(5.0*30.95/255.0, p.r)), step(4.0*30.95/255.0, p.r)), step(3.0*30.95/255.0, p.r)), step(2.0*30.95/255.0, p.r)), step(1.0*30.95/255.0, p.r));\n\ dst[1] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.g)), step(7.0*30.95/255.0, p.g)), step(6.0*30.95/255.0, p.g)), step(5.0*30.95/255.0, p.g)), step(4.0*30.95/255.0, p.g)), step(3.0*30.95/255.0, p.g)), step(2.0*30.95/255.0, p.g)), step(1.0*30.95/255.0, p.g));\n\ dst[2] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.b)), step(7.0*30.95/255.0, p.b)), step(6.0*30.95/255.0, p.b)), step(5.0*30.95/255.0, p.b)), step(4.0*30.95/255.0, p.b)), step(3.0*30.95/255.0, p.b)), step(2.0*30.95/255.0, p.b)), step(1.0*30.95/255.0, p.b));\n\ \n\ OUT_FRAG_COLOR.rgb = Lerp(w, dst[0], dst[1], dst[2]);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalerHQ2xFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ uniform sampler3D lut;\n\ \n\ bool InterpDiff(vec3 p1, vec3 p2)\n\ {\n\ vec3 diff = p1 - p2;\n\ vec3 yuv = vec3( diff.r + diff.g + diff.b,\n\ diff.r - diff.b,\n\ -diff.r + (2.0*diff.g) - diff.b );\n\ yuv = abs(yuv);\n\ \n\ return any( greaterThan(yuv, vec3(192.0/255.0, 28.0/255.0, 48.0/255.0)) );\n\ }\n\ \n\ vec3 Lerp(vec3 weight, vec3 p1, vec3 p2, vec3 p3)\n\ {\n\ return p1*weight.r + p2*weight.g + p3*weight.b;\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ //\n\ // Output Pixel Mapping: 00|01\n\ // 02|03\n\ \n\ //---------------------------------------\n\ // HQ2x Pixel Mapping: 0|1|2\n\ // 3|4|5\n\ // 6|7|8\n\ \n\ void main()\n\ {\n\ vec3 src[9];\n\ src[0] = SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb;\n\ src[1] = SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb;\n\ src[2] = SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb;\n\ src[3] = SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb;\n\ src[4] = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb;\n\ src[5] = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb;\n\ src[6] = SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb;\n\ src[7] = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb;\n\ src[8] = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb;\n\ \n\ float pattern = (float(InterpDiff(src[0], src[4])) * 1.0) +\n\ (float(InterpDiff(src[1], src[4])) * 2.0) +\n\ (float(InterpDiff(src[2], src[4])) * 4.0) +\n\ (float(InterpDiff(src[3], src[4])) * 8.0) +\n\ (float(InterpDiff(src[5], src[4])) * 16.0) +\n\ (float(InterpDiff(src[6], src[4])) * 32.0) +\n\ (float(InterpDiff(src[7], src[4])) * 64.0) +\n\ (float(InterpDiff(src[8], src[4])) * 128.0);\n\ \n\ float compare = (float(InterpDiff(src[1], src[5])) * 1.0) +\n\ (float(InterpDiff(src[5], src[7])) * 2.0) +\n\ (float(InterpDiff(src[7], src[3])) * 4.0) +\n\ (float(InterpDiff(src[3], src[1])) * 8.0);\n\ \n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ float k = (f.y*2.0) + f.x;\n\ vec3 p = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+0.0)+0.5)/512.0, (k+0.5)/4.0, (compare+0.5)/16.0));\n\ vec3 w = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+1.0)+0.5)/512.0, (k+0.5)/4.0, (compare+0.5)/16.0));\n\ \n\ vec3 dst[3];\n\ dst[0] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.r)), step(7.0*30.95/255.0, p.r)), step(6.0*30.95/255.0, p.r)), step(5.0*30.95/255.0, p.r)), step(4.0*30.95/255.0, p.r)), step(3.0*30.95/255.0, p.r)), step(2.0*30.95/255.0, p.r)), step(1.0*30.95/255.0, p.r));\n\ dst[1] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.g)), step(7.0*30.95/255.0, p.g)), step(6.0*30.95/255.0, p.g)), step(5.0*30.95/255.0, p.g)), step(4.0*30.95/255.0, p.g)), step(3.0*30.95/255.0, p.g)), step(2.0*30.95/255.0, p.g)), step(1.0*30.95/255.0, p.g));\n\ dst[2] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.b)), step(7.0*30.95/255.0, p.b)), step(6.0*30.95/255.0, p.b)), step(5.0*30.95/255.0, p.b)), step(4.0*30.95/255.0, p.b)), step(3.0*30.95/255.0, p.b)), step(2.0*30.95/255.0, p.b)), step(1.0*30.95/255.0, p.b));\n\ \n\ OUT_FRAG_COLOR.rgb = Lerp(w, dst[0], dst[1], dst[2]);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalerHQ2xSFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ uniform sampler3D lut;\n\ \n\ vec3 Lerp(vec3 weight, vec3 p1, vec3 p2, vec3 p3)\n\ {\n\ return p1*weight.r + p2*weight.g + p3*weight.b;\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ //\n\ // Output Pixel Mapping: 00|01\n\ // 02|03\n\ \n\ //---------------------------------------\n\ // HQ2xS Pixel Mapping: 0|1|2\n\ // 3|4|5\n\ // 6|7|8\n\ \n\ void main()\n\ {\n\ vec3 src[9];\n\ src[0] = SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb;\n\ src[1] = SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb;\n\ src[2] = SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb;\n\ src[3] = SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb;\n\ src[4] = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb;\n\ src[5] = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb;\n\ src[6] = SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb;\n\ src[7] = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb;\n\ src[8] = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb;\n\ \n\ float b[9];\n\ float minBright = 10.0;\n\ float maxBright = 0.0;\n\ \n\ for (int i = 0; i < 9; i++)\n\ {\n\ b[i] = (src[i].r + src[i].r + src[i].r) + (src[i].g + src[i].g + src[i].g) + (src[i].b + src[i].b);\n\ minBright = min(minBright, b[i]);\n\ maxBright = max(maxBright, b[i]);\n\ }\n\ \n\ float diffBright = (maxBright - minBright) * (7.0/16.0);\n\ float pattern = step((3.5*7.0/892.5), diffBright) * ((float(abs(b[0] - b[4]) > diffBright) * 1.0) +\n\ (float(abs(b[1] - b[4]) > diffBright) * 2.0) +\n\ (float(abs(b[2] - b[4]) > diffBright) * 4.0) +\n\ (float(abs(b[3] - b[4]) > diffBright) * 8.0) +\n\ (float(abs(b[5] - b[4]) > diffBright) * 16.0) +\n\ (float(abs(b[6] - b[4]) > diffBright) * 32.0) +\n\ (float(abs(b[7] - b[4]) > diffBright) * 64.0) +\n\ (float(abs(b[8] - b[4]) > diffBright) * 128.0));\n\ \n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ float k = (f.y*2.0) + f.x;\n\ vec3 p = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+0.0)+0.5)/512.0, (k+0.5)/4.0, 0.5/16.0));\n\ vec3 w = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+1.0)+0.5)/512.0, (k+0.5)/4.0, 0.5/16.0));\n\ \n\ vec3 dst[3];\n\ dst[0] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.r)), step(7.0*30.95/255.0, p.r)), step(6.0*30.95/255.0, p.r)), step(5.0*30.95/255.0, p.r)), step(4.0*30.95/255.0, p.r)), step(3.0*30.95/255.0, p.r)), step(2.0*30.95/255.0, p.r)), step(1.0*30.95/255.0, p.r));\n\ dst[1] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.g)), step(7.0*30.95/255.0, p.g)), step(6.0*30.95/255.0, p.g)), step(5.0*30.95/255.0, p.g)), step(4.0*30.95/255.0, p.g)), step(3.0*30.95/255.0, p.g)), step(2.0*30.95/255.0, p.g)), step(1.0*30.95/255.0, p.g));\n\ dst[2] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.b)), step(7.0*30.95/255.0, p.b)), step(6.0*30.95/255.0, p.b)), step(5.0*30.95/255.0, p.b)), step(4.0*30.95/255.0, p.b)), step(3.0*30.95/255.0, p.b)), step(2.0*30.95/255.0, p.b)), step(1.0*30.95/255.0, p.b));\n\ \n\ OUT_FRAG_COLOR.rgb = Lerp(w, dst[0], dst[1], dst[2]);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalerHQ4xFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ uniform sampler3D lut;\n\ \n\ bool InterpDiff(vec3 p1, vec3 p2)\n\ {\n\ vec3 diff = p1 - p2;\n\ vec3 yuv = vec3( diff.r + diff.g + diff.b,\n\ diff.r - diff.b,\n\ -diff.r + (2.0*diff.g) - diff.b );\n\ yuv = abs(yuv);\n\ \n\ return any( greaterThan(yuv, vec3(192.0/255.0, 28.0/255.0, 48.0/255.0)) );\n\ }\n\ \n\ vec3 Lerp(vec3 weight, vec3 p1, vec3 p2, vec3 p3)\n\ {\n\ return p1*weight.r + p2*weight.g + p3*weight.b;\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ //\n\ // Output Pixel Mapping: 00|01|02|03\n\ // 04|05|06|07\n\ // 08|09|10|11\n\ // 12|13|14|15\n\ \n\ //---------------------------------------\n\ // HQ4x Pixel Mapping: 0|1|2\n\ // 3|4|5\n\ // 6|7|8\n\ \n\ void main()\n\ {\n\ vec3 src[9];\n\ src[0] = SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb;\n\ src[1] = SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb;\n\ src[2] = SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb;\n\ src[3] = SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb;\n\ src[4] = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb;\n\ src[5] = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb;\n\ src[6] = SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb;\n\ src[7] = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb;\n\ src[8] = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb;\n\ \n\ float pattern = (float(InterpDiff(src[0], src[4])) * 1.0) +\n\ (float(InterpDiff(src[1], src[4])) * 2.0) +\n\ (float(InterpDiff(src[2], src[4])) * 4.0) +\n\ (float(InterpDiff(src[3], src[4])) * 8.0) +\n\ (float(InterpDiff(src[5], src[4])) * 16.0) +\n\ (float(InterpDiff(src[6], src[4])) * 32.0) +\n\ (float(InterpDiff(src[7], src[4])) * 64.0) +\n\ (float(InterpDiff(src[8], src[4])) * 128.0);\n\ \n\ float compare = (float(InterpDiff(src[1], src[5])) * 1.0) +\n\ (float(InterpDiff(src[5], src[7])) * 2.0) +\n\ (float(InterpDiff(src[7], src[3])) * 4.0) +\n\ (float(InterpDiff(src[3], src[1])) * 8.0);\n\ \n\ vec2 f = mix( mix(vec2(0.0,0.0), vec2(1.0,1.0), step(0.25, fract(texCoord[0]))), mix(vec2(2.0,2.0), vec2(3.0,3.0), step(0.75, fract(texCoord[0]))), step(0.5, fract(texCoord[0])) );\n\ float k = (f.y*4.0) + f.x;\n\ vec3 p = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+0.0)+0.5)/512.0, (k+0.5)/16.0, (compare+0.5)/16.0));\n\ vec3 w = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+1.0)+0.5)/512.0, (k+0.5)/16.0, (compare+0.5)/16.0));\n\ \n\ vec3 dst[3];\n\ dst[0] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.r)), step(7.0*30.95/255.0, p.r)), step(6.0*30.95/255.0, p.r)), step(5.0*30.95/255.0, p.r)), step(4.0*30.95/255.0, p.r)), step(3.0*30.95/255.0, p.r)), step(2.0*30.95/255.0, p.r)), step(1.0*30.95/255.0, p.r));\n\ dst[1] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.g)), step(7.0*30.95/255.0, p.g)), step(6.0*30.95/255.0, p.g)), step(5.0*30.95/255.0, p.g)), step(4.0*30.95/255.0, p.g)), step(3.0*30.95/255.0, p.g)), step(2.0*30.95/255.0, p.g)), step(1.0*30.95/255.0, p.g));\n\ dst[2] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.b)), step(7.0*30.95/255.0, p.b)), step(6.0*30.95/255.0, p.b)), step(5.0*30.95/255.0, p.b)), step(4.0*30.95/255.0, p.b)), step(3.0*30.95/255.0, p.b)), step(2.0*30.95/255.0, p.b)), step(1.0*30.95/255.0, p.b));\n\ \n\ OUT_FRAG_COLOR.rgb = Lerp(w, dst[0], dst[1], dst[2]);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *ScalerHQ4xSFragShader_110 = {"\ VARYING vec2 texCoord[9];\n\ uniform sampler2DRect tex;\n\ uniform sampler3D lut;\n\ \n\ vec3 Lerp(vec3 weight, vec3 p1, vec3 p2, vec3 p3)\n\ {\n\ return p1*weight.r + p2*weight.g + p3*weight.b;\n\ }\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ //\n\ // Output Pixel Mapping: 00|01|02|03\n\ // 04|05|06|07\n\ // 08|09|10|11\n\ // 12|13|14|15\n\ \n\ //---------------------------------------\n\ // HQ4xS Pixel Mapping: 0|1|2\n\ // 3|4|5\n\ // 6|7|8\n\ \n\ void main()\n\ {\n\ vec3 src[9];\n\ src[0] = SAMPLE3_TEX_RECT(tex, texCoord[6]).rgb;\n\ src[1] = SAMPLE3_TEX_RECT(tex, texCoord[7]).rgb;\n\ src[2] = SAMPLE3_TEX_RECT(tex, texCoord[8]).rgb;\n\ src[3] = SAMPLE3_TEX_RECT(tex, texCoord[5]).rgb;\n\ src[4] = SAMPLE3_TEX_RECT(tex, texCoord[0]).rgb;\n\ src[5] = SAMPLE3_TEX_RECT(tex, texCoord[1]).rgb;\n\ src[6] = SAMPLE3_TEX_RECT(tex, texCoord[4]).rgb;\n\ src[7] = SAMPLE3_TEX_RECT(tex, texCoord[3]).rgb;\n\ src[8] = SAMPLE3_TEX_RECT(tex, texCoord[2]).rgb;\n\ \n\ float b[9];\n\ float minBright = 10.0;\n\ float maxBright = 0.0;\n\ \n\ for (int i = 0; i < 9; i++)\n\ {\n\ b[i] = (src[i].r + src[i].r + src[i].r) + (src[i].g + src[i].g + src[i].g) + (src[i].b + src[i].b);\n\ minBright = min(minBright, b[i]);\n\ maxBright = max(maxBright, b[i]);\n\ }\n\ \n\ float diffBright = (maxBright - minBright) * (7.0/16.0);\n\ float pattern = step((3.5*7.0/892.5), diffBright) * ((float(abs(b[0] - b[4]) > diffBright) * 1.0) +\n\ (float(abs(b[1] - b[4]) > diffBright) * 2.0) +\n\ (float(abs(b[2] - b[4]) > diffBright) * 4.0) +\n\ (float(abs(b[3] - b[4]) > diffBright) * 8.0) +\n\ (float(abs(b[5] - b[4]) > diffBright) * 16.0) +\n\ (float(abs(b[6] - b[4]) > diffBright) * 32.0) +\n\ (float(abs(b[7] - b[4]) > diffBright) * 64.0) +\n\ (float(abs(b[8] - b[4]) > diffBright) * 128.0));\n\ \n\ vec2 f = mix( mix(vec2(0.0,0.0), vec2(1.0,1.0), step(0.25, fract(texCoord[0]))), mix(vec2(2.0,2.0), vec2(3.0,3.0), step(0.75, fract(texCoord[0]))), step(0.5, fract(texCoord[0])) );\n\ float k = (f.y*4.0) + f.x;\n\ vec3 p = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+0.0)+0.5)/512.0, (k+0.5)/16.0, 0.5/16.0));\n\ vec3 w = SAMPLE3_TEX_3D(lut, vec3(((pattern*2.0+1.0)+0.5)/512.0, (k+0.5)/16.0, 0.5/16.0));\n\ \n\ vec3 dst[3];\n\ dst[0] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.r)), step(7.0*30.95/255.0, p.r)), step(6.0*30.95/255.0, p.r)), step(5.0*30.95/255.0, p.r)), step(4.0*30.95/255.0, p.r)), step(3.0*30.95/255.0, p.r)), step(2.0*30.95/255.0, p.r)), step(1.0*30.95/255.0, p.r));\n\ dst[1] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.g)), step(7.0*30.95/255.0, p.g)), step(6.0*30.95/255.0, p.g)), step(5.0*30.95/255.0, p.g)), step(4.0*30.95/255.0, p.g)), step(3.0*30.95/255.0, p.g)), step(2.0*30.95/255.0, p.g)), step(1.0*30.95/255.0, p.g));\n\ dst[2] = mix(src[0], mix(src[1], mix(src[2], mix(src[3], mix(src[4], mix(src[5], mix(src[6], mix(src[7], src[8], step(8.0*30.95/255.0, p.b)), step(7.0*30.95/255.0, p.b)), step(6.0*30.95/255.0, p.b)), step(5.0*30.95/255.0, p.b)), step(4.0*30.95/255.0, p.b)), step(3.0*30.95/255.0, p.b)), step(2.0*30.95/255.0, p.b)), step(1.0*30.95/255.0, p.b));\n\ \n\ OUT_FRAG_COLOR.rgb = Lerp(w, dst[0], dst[1], dst[2]);\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scaler2xBRZFragShader_110 = {"\ #define BLEND_NONE 0\n\ #define BLEND_NORMAL 1\n\ #define BLEND_DOMINANT 2\n\ #define LUMINANCE_WEIGHT 1.0\n\ #define EQUAL_COLOR_TOLERANCE 30.0/255.0\n\ #define STEEP_DIRECTION_THRESHOLD 2.2\n\ #define DOMINANT_DIRECTION_THRESHOLD 3.6\n\ #define M_PI 3.1415926535897932384626433832795\n\ \n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ VARYING vec2 texCoord[25];\n\ #else\n\ VARYING vec2 texCoord[16];\n\ #endif\n\ uniform sampler2DRect tex;\n\ \n\ float reduce(const vec3 color)\n\ {\n\ return dot(color, vec3(65536.0, 256.0, 1.0));\n\ }\n\ \n\ float DistYCbCr(const vec3 pixA, const vec3 pixB)\n\ {\n\ const vec3 w = vec3(0.2627, 0.6780, 0.0593);\n\ const float scaleB = 0.5 / (1.0 - w.b);\n\ const float scaleR = 0.5 / (1.0 - w.r);\n\ vec3 diff = pixA - pixB;\n\ float Y = dot(diff, w);\n\ float Cb = scaleB * (diff.b - Y);\n\ float Cr = scaleR * (diff.r - Y);\n\ \n\ return sqrt( ((LUMINANCE_WEIGHT*Y) * (LUMINANCE_WEIGHT*Y)) + (Cb * Cb) + (Cr * Cr) );\n\ }\n\ \n\ bool IsPixEqual(const vec3 pixA, const vec3 pixB)\n\ {\n\ return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE);\n\ }\n\ \n\ bool IsBlendingNeeded(const ivec4 blend)\n\ {\n\ return any(notEqual(blend, ivec4(BLEND_NONE)));\n\ }\n\ \n\ #if GPU_TIER < SHADERSUPPORT_MID_TIER\n\ void ScalePixel(const ivec4 blend, const vec3 k[9], inout vec3 dst[4])\n\ {\n\ // This is the optimized version of xBRZ's blending logic. It's behavior\n\ // should be identical to the original blending logic below.\n\ float v0 = reduce(k[0]);\n\ float v4 = reduce(k[4]);\n\ float v5 = reduce(k[5]);\n\ float v7 = reduce(k[7]);\n\ float v8 = reduce(k[8]);\n\ \n\ float dist_01_04 = DistYCbCr(k[1], k[4]);\n\ float dist_03_08 = DistYCbCr(k[3], k[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v0 != v4) && (v5 != v4);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v0 != v8) && (v7 != v8);\n\ bool needBlend = (blend[2] != BLEND_NONE);\n\ bool doLineBlend = ( blend[2] >= BLEND_DOMINANT ||\n\ !((blend[1] != BLEND_NONE && !IsPixEqual(k[0], k[4])) ||\n\ (blend[3] != BLEND_NONE && !IsPixEqual(k[0], k[8])) ||\n\ (IsPixEqual(k[4], k[3]) && IsPixEqual(k[3], k[2]) && IsPixEqual(k[2], k[1]) && IsPixEqual(k[1], k[8]) && !IsPixEqual(k[0], k[2])) ) );\n\ \n\ vec3 blendPix = ( DistYCbCr(k[0], k[1]) <= DistYCbCr(k[0], k[3]) ) ? k[1] : k[3];\n\ dst[1] = mix(dst[1], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[2] = mix(dst[2], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 5.0/6.0 : 0.75) : ((haveSteepLine) ? 0.75 : 0.50)) : 1.0 - (M_PI/4.0)) : 0.00);\n\ dst[3] = mix(dst[3], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ // Let's keep xBRZ's original blending logic around for reference.\n\ /*\n\ if (blend[2] == BLEND_NONE)\n\ {\n\ return;\n\ }\n\ \n\ vec3 blendPix = ( DistYCbCr(k[0], k[1]) <= DistYCbCr(k[0], k[3]) ) ? k[1] : k[3];\n\ \n\ if ( DoLineBlend(blend, k) )\n\ {\n\ float v0 = reduce(k[0]);\n\ float v4 = reduce(k[4]);\n\ float v5 = reduce(k[5]);\n\ float v7 = reduce(k[7]);\n\ float v8 = reduce(k[8]);\n\ \n\ float dist_01_04 = DistYCbCr(k[1], k[4]);\n\ float dist_03_08 = DistYCbCr(k[3], k[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v0 != v4) && (v5 != v4);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v0 != v8) && (v7 != v8);\n\ \n\ if (haveShallowLine)\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep and shallow\n\ dst[3] = mix(dst[3], blendPix, 0.25);\n\ dst[1] = mix(dst[1], blendPix, 0.25);\n\ dst[2] = mix(dst[2], blendPix, 5.0/6.0);\n\ }\n\ else\n\ {\n\ // Blend line shallow\n\ dst[3] = mix(dst[3], blendPix, 0.25);\n\ dst[2] = mix(dst[2], blendPix, 0.75);\n\ }\n\ }\n\ else\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep\n\ dst[1] = mix(dst[1], blendPix, 0.25);\n\ dst[2] = mix(dst[2], blendPix, 0.75);\n\ }\n\ else\n\ {\n\ // Blend line diagonal\n\ dst[2] = mix(dst[2], blendPix, 0.50);\n\ }\n\ }\n\ }\n\ else\n\ {\n\ // Blend corner\n\ dst[2] = mix(dst[2], blendPix, 1.0 - (M_PI/4.0));\n\ }\n\ */\n\ }\n\ #endif\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: --|21|22|23|--\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // --|15|14|13|--\n\ //\n\ // Output Pixel Mapping: 00|01\n\ // 03|02\n\ \n\ void main()\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ vec3 src[25];\n\ src[ 0] = SAMPLE3_TEX_RECT(tex, texCoord[ 0]).rgb;\n\ src[ 1] = SAMPLE3_TEX_RECT(tex, texCoord[ 1]).rgb;\n\ src[ 2] = SAMPLE3_TEX_RECT(tex, texCoord[ 2]).rgb;\n\ src[ 3] = SAMPLE3_TEX_RECT(tex, texCoord[ 3]).rgb;\n\ src[ 4] = SAMPLE3_TEX_RECT(tex, texCoord[ 4]).rgb;\n\ src[ 5] = SAMPLE3_TEX_RECT(tex, texCoord[ 5]).rgb;\n\ src[ 6] = SAMPLE3_TEX_RECT(tex, texCoord[ 6]).rgb;\n\ src[ 7] = SAMPLE3_TEX_RECT(tex, texCoord[ 7]).rgb;\n\ src[ 8] = SAMPLE3_TEX_RECT(tex, texCoord[ 8]).rgb;\n\ src[ 9] = SAMPLE3_TEX_RECT(tex, texCoord[ 9]).rgb;\n\ src[10] = SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb;\n\ src[11] = SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb;\n\ src[12] = SAMPLE3_TEX_RECT(tex, texCoord[12]).rgb;\n\ src[13] = SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb;\n\ src[14] = SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb;\n\ src[15] = SAMPLE3_TEX_RECT(tex, texCoord[15]).rgb;\n\ src[16] = SAMPLE3_TEX_RECT(tex, texCoord[16]).rgb;\n\ src[17] = SAMPLE3_TEX_RECT(tex, texCoord[17]).rgb;\n\ src[18] = SAMPLE3_TEX_RECT(tex, texCoord[18]).rgb;\n\ src[19] = SAMPLE3_TEX_RECT(tex, texCoord[19]).rgb;\n\ src[20] = SAMPLE3_TEX_RECT(tex, texCoord[20]).rgb;\n\ src[21] = SAMPLE3_TEX_RECT(tex, texCoord[21]).rgb;\n\ src[22] = SAMPLE3_TEX_RECT(tex, texCoord[22]).rgb;\n\ src[23] = SAMPLE3_TEX_RECT(tex, texCoord[23]).rgb;\n\ src[24] = SAMPLE3_TEX_RECT(tex, texCoord[24]).rgb;\n\ #else\n\ vec3 src[16];\n\ src[ 0] = SAMPLE3_TEX_RECT(tex, texCoord[ 0]).rgb;\n\ src[ 1] = SAMPLE3_TEX_RECT(tex, texCoord[ 1]).rgb;\n\ src[ 2] = SAMPLE3_TEX_RECT(tex, texCoord[ 2]).rgb;\n\ src[ 3] = SAMPLE3_TEX_RECT(tex, texCoord[ 3]).rgb;\n\ src[ 4] = SAMPLE3_TEX_RECT(tex, texCoord[ 4]).rgb;\n\ src[ 5] = SAMPLE3_TEX_RECT(tex, texCoord[ 5]).rgb;\n\ src[ 6] = SAMPLE3_TEX_RECT(tex, texCoord[ 6]).rgb;\n\ src[ 7] = SAMPLE3_TEX_RECT(tex, texCoord[ 7]).rgb;\n\ src[ 8] = SAMPLE3_TEX_RECT(tex, texCoord[ 8]).rgb;\n\ src[ 9] = SAMPLE3_TEX_RECT(tex, texCoord[ 9]).rgb;\n\ src[10] = SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb;\n\ src[11] = SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb;\n\ src[12] = SAMPLE3_TEX_RECT(tex, texCoord[12]).rgb;\n\ src[13] = SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb;\n\ src[14] = SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb;\n\ src[15] = SAMPLE3_TEX_RECT(tex, texCoord[15]).rgb;\n\ #endif\n\ \n\ float v[9];\n\ v[0] = reduce(src[0]);\n\ v[1] = reduce(src[1]);\n\ v[2] = reduce(src[2]);\n\ v[3] = reduce(src[3]);\n\ v[4] = reduce(src[4]);\n\ v[5] = reduce(src[5]);\n\ v[6] = reduce(src[6]);\n\ v[7] = reduce(src[7]);\n\ v[8] = reduce(src[8]);\n\ \n\ ivec4 blendResult = ivec4(BLEND_NONE);\n\ \n\ // Preprocess corners\n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|--|07|08|--\n\ // --|05|00|01|10\n\ // --|04|03|02|11\n\ // --|--|14|13|--\n\ \n\ // Corner (1, 1)\n\ if ( !((v[0] == v[1] && v[3] == v[2]) || (v[0] == v[3] && v[1] == v[2])) )\n\ {\n\ float dist_03_01 = DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + DistYCbCr(src[14], src[ 2]) + DistYCbCr(src[ 2], src[10]) + (4.0 * DistYCbCr(src[ 3], src[ 1]));\n\ float dist_00_02 = DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[ 3], src[13]) + DistYCbCr(src[ 7], src[ 1]) + DistYCbCr(src[ 1], src[11]) + (4.0 * DistYCbCr(src[ 0], src[ 2]));\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_03_01) < dist_00_02;\n\ blendResult[2] = ((dist_03_01 < dist_00_02) && (v[0] != v[1]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ \n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|06|07|--|--\n\ // 18|05|00|01|--\n\ // 17|04|03|02|--\n\ // --|15|14|--|--\n\ // Corner (0, 1)\n\ if ( !((v[5] == v[0] && v[4] == v[3]) || (v[5] == v[4] && v[0] == v[3])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_04_00 = DistYCbCr(src[17], src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0]));\n\ float dist_05_03 = DistYCbCr(src[18], src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3]));\n\ #else\n\ vec3 src17 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 1.0)).rgb;\n\ vec3 src18 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 0.0)).rgb;\n\ float dist_04_00 = DistYCbCr(src17 , src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0]));\n\ float dist_05_03 = DistYCbCr(src18 , src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_03) < dist_04_00;\n\ blendResult[3] = ((dist_04_00 > dist_05_03) && (v[0] != v[5]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|--|22|23|--\n\ // --|06|07|08|09\n\ // --|05|00|01|10\n\ // --|--|03|02|--\n\ // --|--|--|--|--\n\ // Corner (1, 0)\n\ if ( !((v[7] == v[8] && v[0] == v[1]) || (v[7] == v[0] && v[8] == v[1])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src[23]) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8]));\n\ float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src[22], src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1]));\n\ #else\n\ vec3 src22 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(0.0, -2.0)).rgb;\n\ vec3 src23 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(1.0, -2.0)).rgb;\n\ float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src23 ) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8]));\n\ float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src22 , src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_07_01) < dist_00_08;\n\ blendResult[1] = ((dist_00_08 > dist_07_01) && (v[0] != v[7]) && (v[0] != v[1])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|21|22|--|--\n\ // 19|06|07|08|--\n\ // 18|05|00|01|--\n\ // --|04|03|--|--\n\ // --|--|--|--|--\n\ // Corner (0, 0)\n\ if ( !((v[6] == v[7] && v[5] == v[0]) || (v[6] == v[5] && v[7] == v[0])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_05_07 = DistYCbCr(src[18], src[ 6]) + DistYCbCr(src[ 6], src[22]) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7]));\n\ float dist_06_00 = DistYCbCr(src[19], src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[21], src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0]));\n\ #else\n\ vec3 src18 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 0.0)).rgb;\n\ vec3 src19 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, -1.0)).rgb;\n\ vec3 src21 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-1.0, -2.0)).rgb;\n\ vec3 src22 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2( 0.0, -2.0)).rgb;\n\ float dist_05_07 = DistYCbCr(src18 , src[ 6]) + DistYCbCr(src[ 6], src22 ) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7]));\n\ float dist_06_00 = DistYCbCr(src19 , src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src21 , src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_07) < dist_06_00;\n\ blendResult[0] = ((dist_05_07 < dist_06_00) && (v[0] != v[5]) && (v[0] != v[7])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ vec3 dst[4];\n\ dst[0] = src[0];\n\ dst[1] = src[0];\n\ dst[2] = src[0];\n\ dst[3] = src[0];\n\ \n\ // Scale pixel\n\ if (IsBlendingNeeded(blendResult))\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_01_04 = DistYCbCr(src[1], src[4]);\n\ float dist_03_08 = DistYCbCr(src[3], src[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[4]) && (v[5] != v[4]);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[8]) && (v[7] != v[8]);\n\ bool needBlend = (blendResult[2] != BLEND_NONE);\n\ bool doLineBlend = ( blendResult[2] >= BLEND_DOMINANT ||\n\ !((blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && !IsPixEqual(src[0], src[2])) ) );\n\ \n\ vec3 blendPix = ( DistYCbCr(src[0], src[1]) <= DistYCbCr(src[0], src[3]) ) ? src[1] : src[3];\n\ dst[1] = mix(dst[1], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[2] = mix(dst[2], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 5.0/6.0 : 0.75) : ((haveSteepLine) ? 0.75 : 0.50)) : 1.0 - (M_PI/4.0)) : 0.00);\n\ dst[3] = mix(dst[3], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[7], src[2]);\n\ dist_03_08 = DistYCbCr(src[1], src[6]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[2]) && (v[3] != v[2]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[6]) && (v[5] != v[6]);\n\ needBlend = (blendResult[1] != BLEND_NONE);\n\ doLineBlend = ( blendResult[1] >= BLEND_DOMINANT ||\n\ !((blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && !IsPixEqual(src[0], src[8])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[7]) <= DistYCbCr(src[0], src[1]) ) ? src[7] : src[1];\n\ dst[0] = mix(dst[0], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[1] = mix(dst[1], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 5.0/6.0 : 0.75) : ((haveSteepLine) ? 0.75 : 0.50)) : 1.0 - (M_PI/4.0)) : 0.00);\n\ dst[2] = mix(dst[2], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[5], src[8]);\n\ dist_03_08 = DistYCbCr(src[7], src[4]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[8]) && (v[1] != v[8]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[4]) && (v[3] != v[4]);\n\ needBlend = (blendResult[0] != BLEND_NONE);\n\ doLineBlend = ( blendResult[0] >= BLEND_DOMINANT ||\n\ !((blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && !IsPixEqual(src[0], src[6])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[5]) <= DistYCbCr(src[0], src[7]) ) ? src[5] : src[7];\n\ dst[3] = mix(dst[3], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[0] = mix(dst[0], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 5.0/6.0 : 0.75) : ((haveSteepLine) ? 0.75 : 0.50)) : 1.0 - (M_PI/4.0)) : 0.00);\n\ dst[1] = mix(dst[1], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[3], src[6]);\n\ dist_03_08 = DistYCbCr(src[5], src[2]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[6]) && (v[7] != v[6]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[2]) && (v[1] != v[2]);\n\ needBlend = (blendResult[3] != BLEND_NONE);\n\ doLineBlend = ( blendResult[3] >= BLEND_DOMINANT ||\n\ !((blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && !IsPixEqual(src[0], src[4])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[3]) <= DistYCbCr(src[0], src[5]) ) ? src[3] : src[5];\n\ dst[2] = mix(dst[2], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[3] = mix(dst[3], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 5.0/6.0 : 0.75) : ((haveSteepLine) ? 0.75 : 0.50)) : 1.0 - (M_PI/4.0)) : 0.00);\n\ dst[0] = mix(dst[0], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ #else\n\ vec3 k[9];\n\ vec3 tempDst3;\n\ \n\ k[0] = src[0];\n\ k[1] = src[1];\n\ k[2] = src[2];\n\ k[3] = src[3];\n\ k[4] = src[4];\n\ k[5] = src[5];\n\ k[6] = src[6];\n\ k[7] = src[7];\n\ k[8] = src[8];\n\ ScalePixel(blendResult.xyzw, k, dst);\n\ \n\ k[1] = src[7];\n\ k[2] = src[8];\n\ k[3] = src[1];\n\ k[4] = src[2];\n\ k[5] = src[3];\n\ k[6] = src[4];\n\ k[7] = src[5];\n\ k[8] = src[6];\n\ tempDst3 = dst[3];\n\ dst[3] = dst[2];\n\ dst[2] = dst[1];\n\ dst[1] = dst[0];\n\ dst[0] = tempDst3;\n\ ScalePixel(blendResult.wxyz, k, dst);\n\ \n\ k[1] = src[5];\n\ k[2] = src[6];\n\ k[3] = src[7];\n\ k[4] = src[8];\n\ k[5] = src[1];\n\ k[6] = src[2];\n\ k[7] = src[3];\n\ k[8] = src[4];\n\ tempDst3 = dst[3];\n\ dst[3] = dst[2];\n\ dst[2] = dst[1];\n\ dst[1] = dst[0];\n\ dst[0] = tempDst3;\n\ ScalePixel(blendResult.zwxy, k, dst);\n\ \n\ k[1] = src[3];\n\ k[2] = src[4];\n\ k[3] = src[5];\n\ k[4] = src[6];\n\ k[5] = src[7];\n\ k[6] = src[8];\n\ k[7] = src[1];\n\ k[8] = src[2];\n\ tempDst3 = dst[3];\n\ dst[3] = dst[2];\n\ dst[2] = dst[1];\n\ dst[1] = dst[0];\n\ dst[0] = tempDst3;\n\ ScalePixel(blendResult.yzwx, k, dst);\n\ \n\ // Rotate the destination pixels back to 0 degrees.\n\ tempDst3 = dst[3];\n\ dst[3] = dst[2];\n\ dst[2] = dst[1];\n\ dst[1] = dst[0];\n\ dst[0] = tempDst3;\n\ #endif\n\ }\n\ \n\ vec2 f = step(0.5, fract(texCoord[0]));\n\ OUT_FRAG_COLOR.rgb = mix( mix(dst[0], dst[1], f.x),\n\ mix(dst[3], dst[2], f.x), f.y );\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scaler3xBRZFragShader_110 = {"\ #define BLEND_NONE 0\n\ #define BLEND_NORMAL 1\n\ #define BLEND_DOMINANT 2\n\ #define LUMINANCE_WEIGHT 1.0\n\ #define EQUAL_COLOR_TOLERANCE 30.0/255.0\n\ #define STEEP_DIRECTION_THRESHOLD 2.2\n\ #define DOMINANT_DIRECTION_THRESHOLD 3.6\n\ #define M_PI 3.1415926535897932384626433832795\n\ \n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ VARYING vec2 texCoord[25];\n\ #else\n\ VARYING vec2 texCoord[16];\n\ #endif\n\ uniform sampler2DRect tex;\n\ \n\ float reduce(const vec3 color)\n\ {\n\ return dot(color, vec3(65536.0, 256.0, 1.0));\n\ }\n\ \n\ float DistYCbCr(const vec3 pixA, const vec3 pixB)\n\ {\n\ const vec3 w = vec3(0.2627, 0.6780, 0.0593);\n\ const float scaleB = 0.5 / (1.0 - w.b);\n\ const float scaleR = 0.5 / (1.0 - w.r);\n\ vec3 diff = pixA - pixB;\n\ float Y = dot(diff, w);\n\ float Cb = scaleB * (diff.b - Y);\n\ float Cr = scaleR * (diff.r - Y);\n\ \n\ return sqrt( ((LUMINANCE_WEIGHT*Y) * (LUMINANCE_WEIGHT*Y)) + (Cb * Cb) + (Cr * Cr) );\n\ }\n\ \n\ bool IsPixEqual(const vec3 pixA, const vec3 pixB)\n\ {\n\ return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE);\n\ }\n\ \n\ bool IsBlendingNeeded(const ivec4 blend)\n\ {\n\ return any(notEqual(blend, ivec4(BLEND_NONE)));\n\ }\n\ \n\ #if GPU_TIER < SHADERSUPPORT_MID_TIER\n\ void ScalePixel(const ivec4 blend, const vec3 k[9], inout vec3 dst[9])\n\ {\n\ // This is the optimized version of xBRZ's blending logic. It's behavior\n\ // should be identical to the original blending logic below.\n\ float v0 = reduce(k[0]);\n\ float v4 = reduce(k[4]);\n\ float v5 = reduce(k[5]);\n\ float v7 = reduce(k[7]);\n\ float v8 = reduce(k[8]);\n\ \n\ float dist_01_04 = DistYCbCr(k[1], k[4]);\n\ float dist_03_08 = DistYCbCr(k[3], k[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v0 != v4) && (v5 != v4);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v0 != v8) && (v7 != v8);\n\ bool needBlend = (blend[2] != BLEND_NONE);\n\ bool doLineBlend = ( blend[2] >= BLEND_DOMINANT ||\n\ !((blend[1] != BLEND_NONE && !IsPixEqual(k[0], k[4])) ||\n\ (blend[3] != BLEND_NONE && !IsPixEqual(k[0], k[8])) ||\n\ (IsPixEqual(k[4], k[3]) && IsPixEqual(k[3], k[2]) && IsPixEqual(k[2], k[1]) && IsPixEqual(k[1], k[8]) && !IsPixEqual(k[0], k[2])) ) );\n\ \n\ vec3 blendPix = ( DistYCbCr(k[0], k[1]) <= DistYCbCr(k[0], k[3]) ) ? k[1] : k[3];\n\ dst[1] = mix(dst[1], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[2] = mix(dst[2], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.4545939598) : 0.000);\n\ dst[3] = mix(dst[3], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 0.750 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[4] = mix(dst[4], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[8] = mix(dst[8], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ // Let's keep xBRZ's original blending logic around for reference.\n\ /*\n\ if (blend[2] == BLEND_NONE)\n\ {\n\ return;\n\ }\n\ \n\ vec3 blendPix = ( DistYCbCr(k[0], k[1]) <= DistYCbCr(k[0], k[3]) ) ? k[1] : k[3];\n\ \n\ if ( DoLineBlend(blend, k) )\n\ {\n\ float v0 = reduce(k[0]);\n\ float v4 = reduce(k[4]);\n\ float v5 = reduce(k[5]);\n\ float v7 = reduce(k[7]);\n\ float v8 = reduce(k[8]);\n\ \n\ float dist_01_04 = DistYCbCr(k[1], k[4]);\n\ float dist_03_08 = DistYCbCr(k[3], k[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v0 != v4) && (v5 != v4);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v0 != v8) && (v7 != v8);\n\ \n\ if (haveShallowLine)\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep and shallow\n\ dst[4] = mix(dst[4], blendPix, 0.25);\n\ dst[8] = mix(dst[8], blendPix, 0.25);\n\ dst[3] = mix(dst[3], blendPix, 0.75);\n\ dst[1] = mix(dst[1], blendPix, 0.75);\n\ dst[2] = mix(dst[2], blendPix, 1.00);\n\ }\n\ else\n\ {\n\ // Blend line shallow\n\ dst[4] = mix(dst[4], blendPix, 0.25);\n\ dst[1] = mix(dst[1], blendPix, 0.25);\n\ dst[3] = mix(dst[3], blendPix, 0.75);\n\ dst[2] = mix(dst[2], blendPix, 1.00);\n\ }\n\ }\n\ else\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep\n\ dst[8] = mix(dst[8], blendPix, 0.25);\n\ dst[3] = mix(dst[3], blendPix, 0.25);\n\ dst[1] = mix(dst[1], blendPix, 0.75);\n\ dst[2] = mix(dst[2], blendPix, 1.00);\n\ }\n\ else\n\ {\n\ // Blend line diagonal\n\ dst[1] = mix(dst[1], blendPix, 0.125);\n\ dst[3] = mix(dst[3], blendPix, 0.125);\n\ dst[2] = mix(dst[2], blendPix, 0.875);\n\ }\n\ }\n\ }\n\ else\n\ {\n\ // Blend corner\n\ dst[2] = mix(dst[2], blendPix, 0.4545939598);\n\ }\n\ */\n\ }\n\ #endif\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: --|21|22|23|--\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // --|15|14|13|--\n\ //\n\ // Output Pixel Mapping: 06|07|08\n\ // 05|00|01\n\ // 04|03|02\n\ \n\ void main()\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ vec3 src[25];\n\ src[ 0] = SAMPLE3_TEX_RECT(tex, texCoord[ 0]);\n\ src[ 1] = SAMPLE3_TEX_RECT(tex, texCoord[ 1]);\n\ src[ 2] = SAMPLE3_TEX_RECT(tex, texCoord[ 2]);\n\ src[ 3] = SAMPLE3_TEX_RECT(tex, texCoord[ 3]);\n\ src[ 4] = SAMPLE3_TEX_RECT(tex, texCoord[ 4]);\n\ src[ 5] = SAMPLE3_TEX_RECT(tex, texCoord[ 5]);\n\ src[ 6] = SAMPLE3_TEX_RECT(tex, texCoord[ 6]);\n\ src[ 7] = SAMPLE3_TEX_RECT(tex, texCoord[ 7]);\n\ src[ 8] = SAMPLE3_TEX_RECT(tex, texCoord[ 8]);\n\ src[ 9] = SAMPLE3_TEX_RECT(tex, texCoord[ 9]);\n\ src[10] = SAMPLE3_TEX_RECT(tex, texCoord[10]);\n\ src[11] = SAMPLE3_TEX_RECT(tex, texCoord[11]);\n\ src[12] = SAMPLE3_TEX_RECT(tex, texCoord[12]);\n\ src[13] = SAMPLE3_TEX_RECT(tex, texCoord[13]);\n\ src[14] = SAMPLE3_TEX_RECT(tex, texCoord[14]);\n\ src[15] = SAMPLE3_TEX_RECT(tex, texCoord[15]);\n\ src[16] = SAMPLE3_TEX_RECT(tex, texCoord[16]);\n\ src[17] = SAMPLE3_TEX_RECT(tex, texCoord[17]);\n\ src[18] = SAMPLE3_TEX_RECT(tex, texCoord[18]);\n\ src[19] = SAMPLE3_TEX_RECT(tex, texCoord[19]);\n\ src[20] = SAMPLE3_TEX_RECT(tex, texCoord[20]);\n\ src[21] = SAMPLE3_TEX_RECT(tex, texCoord[21]);\n\ src[22] = SAMPLE3_TEX_RECT(tex, texCoord[22]);\n\ src[23] = SAMPLE3_TEX_RECT(tex, texCoord[23]);\n\ src[24] = SAMPLE3_TEX_RECT(tex, texCoord[24]);\n\ #else\n\ vec3 src[16];\n\ src[ 0] = SAMPLE3_TEX_RECT(tex, texCoord[ 0]);\n\ src[ 1] = SAMPLE3_TEX_RECT(tex, texCoord[ 1]);\n\ src[ 2] = SAMPLE3_TEX_RECT(tex, texCoord[ 2]);\n\ src[ 3] = SAMPLE3_TEX_RECT(tex, texCoord[ 3]);\n\ src[ 4] = SAMPLE3_TEX_RECT(tex, texCoord[ 4]);\n\ src[ 5] = SAMPLE3_TEX_RECT(tex, texCoord[ 5]);\n\ src[ 6] = SAMPLE3_TEX_RECT(tex, texCoord[ 6]);\n\ src[ 7] = SAMPLE3_TEX_RECT(tex, texCoord[ 7]);\n\ src[ 8] = SAMPLE3_TEX_RECT(tex, texCoord[ 8]);\n\ src[ 9] = SAMPLE3_TEX_RECT(tex, texCoord[ 9]);\n\ src[10] = SAMPLE3_TEX_RECT(tex, texCoord[10]);\n\ src[11] = SAMPLE3_TEX_RECT(tex, texCoord[11]);\n\ src[12] = SAMPLE3_TEX_RECT(tex, texCoord[12]);\n\ src[13] = SAMPLE3_TEX_RECT(tex, texCoord[13]);\n\ src[14] = SAMPLE3_TEX_RECT(tex, texCoord[14]);\n\ src[15] = SAMPLE3_TEX_RECT(tex, texCoord[15]);\n\ #endif\n\ \n\ float v[9];\n\ v[0] = reduce(src[0]);\n\ v[1] = reduce(src[1]);\n\ v[2] = reduce(src[2]);\n\ v[3] = reduce(src[3]);\n\ v[4] = reduce(src[4]);\n\ v[5] = reduce(src[5]);\n\ v[6] = reduce(src[6]);\n\ v[7] = reduce(src[7]);\n\ v[8] = reduce(src[8]);\n\ \n\ ivec4 blendResult = ivec4(BLEND_NONE);\n\ \n\ // Preprocess corners\n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|--|07|08|--\n\ // --|05|00|01|10\n\ // --|04|03|02|11\n\ // --|--|14|13|--\n\ \n\ // Corner (1, 1)\n\ if ( !((v[0] == v[1] && v[3] == v[2]) || (v[0] == v[3] && v[1] == v[2])) )\n\ {\n\ float dist_03_01 = DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + DistYCbCr(src[14], src[ 2]) + DistYCbCr(src[ 2], src[10]) + (4.0 * DistYCbCr(src[ 3], src[ 1]));\n\ float dist_00_02 = DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[ 3], src[13]) + DistYCbCr(src[ 7], src[ 1]) + DistYCbCr(src[ 1], src[11]) + (4.0 * DistYCbCr(src[ 0], src[ 2]));\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_03_01) < dist_00_02;\n\ blendResult[2] = ((dist_03_01 < dist_00_02) && (v[0] != v[1]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ \n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|06|07|--|--\n\ // 18|05|00|01|--\n\ // 17|04|03|02|--\n\ // --|15|14|--|--\n\ // Corner (0, 1)\n\ if ( !((v[5] == v[0] && v[4] == v[3]) || (v[5] == v[4] && v[0] == v[3])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_04_00 = DistYCbCr(src[17], src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0]));\n\ float dist_05_03 = DistYCbCr(src[18], src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3]));\n\ #else\n\ vec3 src17 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 1.0));\n\ vec3 src18 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 0.0));\n\ float dist_04_00 = DistYCbCr(src17 , src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0]));\n\ float dist_05_03 = DistYCbCr(src18 , src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_03) < dist_04_00;\n\ blendResult[3] = ((dist_04_00 > dist_05_03) && (v[0] != v[5]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|--|22|23|--\n\ // --|06|07|08|09\n\ // --|05|00|01|10\n\ // --|--|03|02|--\n\ // --|--|--|--|--\n\ // Corner (1, 0)\n\ if ( !((v[7] == v[8] && v[0] == v[1]) || (v[7] == v[0] && v[8] == v[1])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src[23]) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8]));\n\ float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src[22], src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1]));\n\ #else\n\ vec3 src22 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(0.0, -2.0));\n\ vec3 src23 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(1.0, -2.0));\n\ float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src23 ) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8]));\n\ float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src22 , src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_07_01) < dist_00_08;\n\ blendResult[1] = ((dist_00_08 > dist_07_01) && (v[0] != v[7]) && (v[0] != v[1])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|21|22|--|--\n\ // 19|06|07|08|--\n\ // 18|05|00|01|--\n\ // --|04|03|--|--\n\ // --|--|--|--|--\n\ // Corner (0, 0)\n\ if ( !((v[6] == v[7] && v[5] == v[0]) || (v[6] == v[5] && v[7] == v[0])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_05_07 = DistYCbCr(src[18], src[ 6]) + DistYCbCr(src[ 6], src[22]) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7]));\n\ float dist_06_00 = DistYCbCr(src[19], src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[21], src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0]));\n\ #else\n\ vec3 src18 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 0.0));\n\ vec3 src19 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, -1.0));\n\ vec3 src21 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-1.0, -2.0));\n\ vec3 src22 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2( 0.0, -2.0));\n\ float dist_05_07 = DistYCbCr(src18 , src[ 6]) + DistYCbCr(src[ 6], src22 ) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7]));\n\ float dist_06_00 = DistYCbCr(src19 , src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src21 , src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_07) < dist_06_00;\n\ blendResult[0] = ((dist_05_07 < dist_06_00) && (v[0] != v[5]) && (v[0] != v[7])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ vec3 dst[9];\n\ dst[0] = src[0];\n\ dst[1] = src[0];\n\ dst[2] = src[0];\n\ dst[3] = src[0];\n\ dst[4] = src[0];\n\ dst[5] = src[0];\n\ dst[6] = src[0];\n\ dst[7] = src[0];\n\ dst[8] = src[0];\n\ \n\ // Scale pixel\n\ if (IsBlendingNeeded(blendResult))\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_01_04 = DistYCbCr(src[1], src[4]);\n\ float dist_03_08 = DistYCbCr(src[3], src[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[4]) && (v[5] != v[4]);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[8]) && (v[7] != v[8]);\n\ bool needBlend = (blendResult[2] != BLEND_NONE);\n\ bool doLineBlend = ( blendResult[2] >= BLEND_DOMINANT ||\n\ !((blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && !IsPixEqual(src[0], src[2])) ) );\n\ \n\ vec3 blendPix = ( DistYCbCr(src[0], src[1]) <= DistYCbCr(src[0], src[3]) ) ? src[1] : src[3];\n\ dst[1] = mix(dst[1], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[2] = mix(dst[2], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.4545939598) : 0.000);\n\ dst[3] = mix(dst[3], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 0.750 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[4] = mix(dst[4], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[8] = mix(dst[8], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[7], src[2]);\n\ dist_03_08 = DistYCbCr(src[1], src[6]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[2]) && (v[3] != v[2]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[6]) && (v[5] != v[6]);\n\ needBlend = (blendResult[1] != BLEND_NONE);\n\ doLineBlend = ( blendResult[1] >= BLEND_DOMINANT ||\n\ !((blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && !IsPixEqual(src[0], src[8])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[7]) <= DistYCbCr(src[0], src[1]) ) ? src[7] : src[1];\n\ dst[7] = mix(dst[7], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[8] = mix(dst[8], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.4545939598) : 0.000);\n\ dst[1] = mix(dst[1], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 0.750 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[2] = mix(dst[2], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[6] = mix(dst[6], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[5], src[8]);\n\ dist_03_08 = DistYCbCr(src[7], src[4]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[8]) && (v[1] != v[8]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[4]) && (v[3] != v[4]);\n\ needBlend = (blendResult[0] != BLEND_NONE);\n\ doLineBlend = ( blendResult[0] >= BLEND_DOMINANT ||\n\ !((blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && !IsPixEqual(src[0], src[6])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[5]) <= DistYCbCr(src[0], src[7]) ) ? src[5] : src[7];\n\ dst[5] = mix(dst[5], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[6] = mix(dst[6], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.4545939598) : 0.000);\n\ dst[7] = mix(dst[7], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 0.750 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[8] = mix(dst[8], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[4] = mix(dst[4], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[3], src[6]);\n\ dist_03_08 = DistYCbCr(src[5], src[2]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[6]) && (v[7] != v[6]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[2]) && (v[1] != v[2]);\n\ needBlend = (blendResult[3] != BLEND_NONE);\n\ doLineBlend = ( blendResult[3] >= BLEND_DOMINANT ||\n\ !((blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && !IsPixEqual(src[0], src[4])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[3]) <= DistYCbCr(src[0], src[5]) ) ? src[3] : src[5];\n\ dst[3] = mix(dst[3], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[4] = mix(dst[4], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.4545939598) : 0.000);\n\ dst[5] = mix(dst[5], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 0.750 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[6] = mix(dst[6], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[2] = mix(dst[2], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ #else\n\ vec3 k[9];\n\ vec3 tempDst8;\n\ vec3 tempDst7;\n\ \n\ k[8] = src[8];\n\ k[7] = src[7];\n\ k[6] = src[6];\n\ k[5] = src[5];\n\ k[4] = src[4];\n\ k[3] = src[3];\n\ k[2] = src[2];\n\ k[1] = src[1];\n\ k[0] = src[0];\n\ ScalePixel(blendResult.xyzw, k, dst);\n\ \n\ k[8] = src[6];\n\ k[7] = src[5];\n\ k[6] = src[4];\n\ k[5] = src[3];\n\ k[4] = src[2];\n\ k[3] = src[1];\n\ k[2] = src[8];\n\ k[1] = src[7];\n\ tempDst8 = dst[8];\n\ tempDst7 = dst[7];\n\ dst[8] = dst[6];\n\ dst[7] = dst[5];\n\ dst[6] = dst[4];\n\ dst[5] = dst[3];\n\ dst[4] = dst[2];\n\ dst[3] = dst[1];\n\ dst[2] = tempDst8;\n\ dst[1] = tempDst7;\n\ ScalePixel(blendResult.wxyz, k, dst);\n\ \n\ k[8] = src[4];\n\ k[7] = src[3];\n\ k[6] = src[2];\n\ k[5] = src[1];\n\ k[4] = src[8];\n\ k[3] = src[7];\n\ k[2] = src[6];\n\ k[1] = src[5];\n\ tempDst8 = dst[8];\n\ tempDst7 = dst[7];\n\ dst[8] = dst[6];\n\ dst[7] = dst[5];\n\ dst[6] = dst[4];\n\ dst[5] = dst[3];\n\ dst[4] = dst[2];\n\ dst[3] = dst[1];\n\ dst[2] = tempDst8;\n\ dst[1] = tempDst7;\n\ ScalePixel(blendResult.zwxy, k, dst);\n\ \n\ k[8] = src[2];\n\ k[7] = src[1];\n\ k[6] = src[8];\n\ k[5] = src[7];\n\ k[4] = src[6];\n\ k[3] = src[5];\n\ k[2] = src[4];\n\ k[1] = src[3];\n\ tempDst8 = dst[8];\n\ tempDst7 = dst[7];\n\ dst[8] = dst[6];\n\ dst[7] = dst[5];\n\ dst[6] = dst[4];\n\ dst[5] = dst[3];\n\ dst[4] = dst[2];\n\ dst[3] = dst[1];\n\ dst[2] = tempDst8;\n\ dst[1] = tempDst7;\n\ ScalePixel(blendResult.yzwx, k, dst);\n\ \n\ // Rotate the destination pixels back to 0 degrees.\n\ tempDst8 = dst[8];\n\ tempDst7 = dst[7];\n\ dst[8] = dst[6];\n\ dst[7] = dst[5];\n\ dst[6] = dst[4];\n\ dst[5] = dst[3];\n\ dst[4] = dst[2];\n\ dst[3] = dst[1];\n\ dst[2] = tempDst8;\n\ dst[1] = tempDst7;\n\ #endif\n\ }\n\ \n\ vec2 f = fract(texCoord[0]);\n\ OUT_FRAG_COLOR.rgb = mix( mix( dst[6], mix(dst[7], dst[8], step(0.6, f.x)), step(0.3, f.x)),\n\ mix( mix(dst[5], mix(dst[0], dst[1], step(0.6, f.x)), step(0.3, f.x)),\n\ mix(dst[4], mix(dst[3], dst[2], step(0.6, f.x)), step(0.3, f.x)), step(0.6, f.y)),\n\ step(0.3, f.y) );\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scaler4xBRZFragShader_110 = {"\ #define BLEND_NONE 0\n\ #define BLEND_NORMAL 1\n\ #define BLEND_DOMINANT 2\n\ #define LUMINANCE_WEIGHT 1.0\n\ #define EQUAL_COLOR_TOLERANCE 30.0/255.0\n\ #define STEEP_DIRECTION_THRESHOLD 2.2\n\ #define DOMINANT_DIRECTION_THRESHOLD 3.6\n\ #define M_PI 3.1415926535897932384626433832795\n\ \n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ VARYING vec2 texCoord[25];\n\ #else\n\ VARYING vec2 texCoord[16];\n\ #endif\n\ uniform sampler2DRect tex;\n\ \n\ float reduce(const vec3 color)\n\ {\n\ return dot(color, vec3(65536.0, 256.0, 1.0));\n\ }\n\ \n\ float DistYCbCr(const vec3 pixA, const vec3 pixB)\n\ {\n\ const vec3 w = vec3(0.2627, 0.6780, 0.0593);\n\ const float scaleB = 0.5 / (1.0 - w.b);\n\ const float scaleR = 0.5 / (1.0 - w.r);\n\ vec3 diff = pixA - pixB;\n\ float Y = dot(diff, w);\n\ float Cb = scaleB * (diff.b - Y);\n\ float Cr = scaleR * (diff.r - Y);\n\ \n\ return sqrt( ((LUMINANCE_WEIGHT*Y) * (LUMINANCE_WEIGHT*Y)) + (Cb * Cb) + (Cr * Cr) );\n\ }\n\ \n\ bool IsPixEqual(const vec3 pixA, const vec3 pixB)\n\ {\n\ return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE);\n\ }\n\ \n\ bool IsBlendingNeeded(const ivec4 blend)\n\ {\n\ return any(notEqual(blend, ivec4(BLEND_NONE)));\n\ }\n\ \n\ #if GPU_TIER < SHADERSUPPORT_MID_TIER\n\ void ScalePixel(const ivec4 blend, const vec3 k[9], inout vec3 dst[16])\n\ {\n\ // This is the optimized version of xBRZ's blending logic. It's behavior\n\ // should be identical to the original blending logic below.\n\ float v0 = reduce(k[0]);\n\ float v4 = reduce(k[4]);\n\ float v5 = reduce(k[5]);\n\ float v7 = reduce(k[7]);\n\ float v8 = reduce(k[8]);\n\ \n\ float dist_01_04 = DistYCbCr(k[1], k[4]);\n\ float dist_03_08 = DistYCbCr(k[3], k[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v0 != v4) && (v5 != v4);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v0 != v8) && (v7 != v8);\n\ bool needBlend = (blend[2] != BLEND_NONE);\n\ bool doLineBlend = ( blend[2] >= BLEND_DOMINANT ||\n\ !((blend[1] != BLEND_NONE && !IsPixEqual(k[0], k[4])) ||\n\ (blend[3] != BLEND_NONE && !IsPixEqual(k[0], k[8])) ||\n\ (IsPixEqual(k[4], k[3]) && IsPixEqual(k[3], k[2]) && IsPixEqual(k[2], k[1]) && IsPixEqual(k[1], k[8]) && !IsPixEqual(k[0], k[2])) ) );\n\ \n\ vec3 blendPix = ( DistYCbCr(k[0], k[1]) <= DistYCbCr(k[0], k[3]) ) ? k[1] : k[3];\n\ dst[ 2] = mix(dst[ 2], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00);\n\ dst[ 9] = mix(dst[ 9], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[10] = mix(dst[10], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00);\n\ dst[11] = mix(dst[11], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[12] = mix(dst[12], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00);\n\ dst[13] = mix(dst[13], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[14] = mix(dst[14], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00);\n\ dst[15] = mix(dst[15], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ // Let's keep xBRZ's original blending logic around for reference.\n\ /*\n\ if (blend[2] == BLEND_NONE)\n\ {\n\ return;\n\ }\n\ \n\ vec3 blendPix = ( DistYCbCr(k[0], k[1]) <= DistYCbCr(k[0], k[3]) ) ? k[1] : k[3];\n\ \n\ if ( DoLineBlend(blend, k) )\n\ {\n\ float v0 = reduce(k[0]);\n\ float v4 = reduce(k[4]);\n\ float v5 = reduce(k[5]);\n\ float v7 = reduce(k[7]);\n\ float v8 = reduce(k[8]);\n\ \n\ float dist_01_04 = DistYCbCr(k[1], k[4]);\n\ float dist_03_08 = DistYCbCr(k[3], k[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v0 != v4) && (v5 != v4);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v0 != v8) && (v7 != v8);\n\ \n\ if (haveShallowLine)\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep and shallow\n\ dst[14] = mix(dst[14], blendPix, 0.75);\n\ dst[10] = mix(dst[10], blendPix, 0.75);\n\ dst[15] = mix(dst[15], blendPix, 0.25);\n\ dst[ 9] = mix(dst[ 9], blendPix, 0.25);\n\ dst[ 2] = mix(dst[ 2], blendPix, 1.0/3.0);\n\ dst[12] = mix(dst[12], blendPix, 1.00);\n\ dst[11] = mix(dst[11], blendPix, 1.00);\n\ dst[13] = mix(dst[13], blendPix, 1.00);\n\ }\n\ else\n\ {\n\ // Blend line shallow\n\ dst[15] = mix(dst[15], blendPix, 0.25);\n\ dst[ 2] = mix(dst[ 2], blendPix, 0.25);\n\ dst[14] = mix(dst[14], blendPix, 0.75);\n\ dst[11] = mix(dst[11], blendPix, 0.75);\n\ dst[13] = mix(dst[13], blendPix, 1.00);\n\ dst[12] = mix(dst[12], blendPix, 1.00);\n\ }\n\ }\n\ else\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep\n\ dst[ 9] = mix(dst[ 9], blendPix, 0.25);\n\ dst[ 2] = mix(dst[ 2], blendPix, 0.25);\n\ dst[10] = mix(dst[10], blendPix, 0.75);\n\ dst[13] = mix(dst[13], blendPix, 0.75);\n\ dst[11] = mix(dst[11], blendPix, 1.00);\n\ dst[12] = mix(dst[12], blendPix, 1.00);\n\ }\n\ else\n\ {\n\ // Blend line diagonal\n\ dst[13] = mix(dst[13], blendPix, 0.50);\n\ dst[11] = mix(dst[11], blendPix, 0.50);\n\ dst[12] = mix(dst[12], blendPix, 1.00);\n\ }\n\ }\n\ }\n\ else\n\ {\n\ // Blend corner\n\ dst[12] = mix(dst[12], blendPix, 0.6848532563);\n\ dst[11] = mix(dst[11], blendPix, 0.08677704501);\n\ dst[13] = mix(dst[13], blendPix, 0.08677704501);\n\ }\n\ */\n\ }\n\ #endif\n\ \n\ //---------------------------------------\n\ // Input Pixel Mapping: --|21|22|23|--\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // --|15|14|13|--\n\ //\n\ // Output Pixel Mapping: 06|07|08|09\n\ // 05|00|01|10\n\ // 04|03|02|11\n\ // 15|14|13|12\n\ \n\ void main()\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ vec3 src[25];\n\ src[ 0] = SAMPLE3_TEX_RECT(tex, texCoord[ 0]).rgb;\n\ src[ 1] = SAMPLE3_TEX_RECT(tex, texCoord[ 1]).rgb;\n\ src[ 2] = SAMPLE3_TEX_RECT(tex, texCoord[ 2]).rgb;\n\ src[ 3] = SAMPLE3_TEX_RECT(tex, texCoord[ 3]).rgb;\n\ src[ 4] = SAMPLE3_TEX_RECT(tex, texCoord[ 4]).rgb;\n\ src[ 5] = SAMPLE3_TEX_RECT(tex, texCoord[ 5]).rgb;\n\ src[ 6] = SAMPLE3_TEX_RECT(tex, texCoord[ 6]).rgb;\n\ src[ 7] = SAMPLE3_TEX_RECT(tex, texCoord[ 7]).rgb;\n\ src[ 8] = SAMPLE3_TEX_RECT(tex, texCoord[ 8]).rgb;\n\ src[ 9] = SAMPLE3_TEX_RECT(tex, texCoord[ 9]).rgb;\n\ src[10] = SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb;\n\ src[11] = SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb;\n\ src[12] = SAMPLE3_TEX_RECT(tex, texCoord[12]).rgb;\n\ src[13] = SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb;\n\ src[14] = SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb;\n\ src[15] = SAMPLE3_TEX_RECT(tex, texCoord[15]).rgb;\n\ src[16] = SAMPLE3_TEX_RECT(tex, texCoord[16]).rgb;\n\ src[17] = SAMPLE3_TEX_RECT(tex, texCoord[17]).rgb;\n\ src[18] = SAMPLE3_TEX_RECT(tex, texCoord[18]).rgb;\n\ src[19] = SAMPLE3_TEX_RECT(tex, texCoord[19]).rgb;\n\ src[20] = SAMPLE3_TEX_RECT(tex, texCoord[20]).rgb;\n\ src[21] = SAMPLE3_TEX_RECT(tex, texCoord[21]).rgb;\n\ src[22] = SAMPLE3_TEX_RECT(tex, texCoord[22]).rgb;\n\ src[23] = SAMPLE3_TEX_RECT(tex, texCoord[23]).rgb;\n\ src[24] = SAMPLE3_TEX_RECT(tex, texCoord[24]).rgb;\n\ #else\n\ vec3 src[16];\n\ src[ 0] = SAMPLE3_TEX_RECT(tex, texCoord[ 0]).rgb;\n\ src[ 1] = SAMPLE3_TEX_RECT(tex, texCoord[ 1]).rgb;\n\ src[ 2] = SAMPLE3_TEX_RECT(tex, texCoord[ 2]).rgb;\n\ src[ 3] = SAMPLE3_TEX_RECT(tex, texCoord[ 3]).rgb;\n\ src[ 4] = SAMPLE3_TEX_RECT(tex, texCoord[ 4]).rgb;\n\ src[ 5] = SAMPLE3_TEX_RECT(tex, texCoord[ 5]).rgb;\n\ src[ 6] = SAMPLE3_TEX_RECT(tex, texCoord[ 6]).rgb;\n\ src[ 7] = SAMPLE3_TEX_RECT(tex, texCoord[ 7]).rgb;\n\ src[ 8] = SAMPLE3_TEX_RECT(tex, texCoord[ 8]).rgb;\n\ src[ 9] = SAMPLE3_TEX_RECT(tex, texCoord[ 9]).rgb;\n\ src[10] = SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb;\n\ src[11] = SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb;\n\ src[12] = SAMPLE3_TEX_RECT(tex, texCoord[12]).rgb;\n\ src[13] = SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb;\n\ src[14] = SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb;\n\ src[15] = SAMPLE3_TEX_RECT(tex, texCoord[15]).rgb;\n\ #endif\n\ \n\ float v[9];\n\ v[0] = reduce(src[0]);\n\ v[1] = reduce(src[1]);\n\ v[2] = reduce(src[2]);\n\ v[3] = reduce(src[3]);\n\ v[4] = reduce(src[4]);\n\ v[5] = reduce(src[5]);\n\ v[6] = reduce(src[6]);\n\ v[7] = reduce(src[7]);\n\ v[8] = reduce(src[8]);\n\ \n\ ivec4 blendResult = ivec4(BLEND_NONE);\n\ \n\ // Preprocess corners\n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|--|07|08|--\n\ // --|05|00|01|10\n\ // --|04|03|02|11\n\ // --|--|14|13|--\n\ \n\ // Corner (1, 1)\n\ if ( !((v[0] == v[1] && v[3] == v[2]) || (v[0] == v[3] && v[1] == v[2])) )\n\ {\n\ float dist_03_01 = DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + DistYCbCr(src[14], src[ 2]) + DistYCbCr(src[ 2], src[10]) + (4.0 * DistYCbCr(src[ 3], src[ 1]));\n\ float dist_00_02 = DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[ 3], src[13]) + DistYCbCr(src[ 7], src[ 1]) + DistYCbCr(src[ 1], src[11]) + (4.0 * DistYCbCr(src[ 0], src[ 2]));\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_03_01) < dist_00_02;\n\ blendResult[2] = ((dist_03_01 < dist_00_02) && (v[0] != v[1]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ \n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|06|07|--|--\n\ // 18|05|00|01|--\n\ // 17|04|03|02|--\n\ // --|15|14|--|--\n\ // Corner (0, 1)\n\ if ( !((v[5] == v[0] && v[4] == v[3]) || (v[5] == v[4] && v[0] == v[3])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_04_00 = DistYCbCr(src[17], src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0]));\n\ float dist_05_03 = DistYCbCr(src[18], src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3]));\n\ #else\n\ vec3 src17 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 1.0)).rgb;\n\ vec3 src18 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 0.0)).rgb;\n\ float dist_04_00 = DistYCbCr(src17 , src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0]));\n\ float dist_05_03 = DistYCbCr(src18 , src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_03) < dist_04_00;\n\ blendResult[3] = ((dist_04_00 > dist_05_03) && (v[0] != v[5]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|--|22|23|--\n\ // --|06|07|08|09\n\ // --|05|00|01|10\n\ // --|--|03|02|--\n\ // --|--|--|--|--\n\ // Corner (1, 0)\n\ if ( !((v[7] == v[8] && v[0] == v[1]) || (v[7] == v[0] && v[8] == v[1])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src[23]) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8]));\n\ float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src[22], src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1]));\n\ #else\n\ vec3 src22 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(0.0, -2.0)).rgb;\n\ vec3 src23 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(1.0, -2.0)).rgb;\n\ float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src23 ) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8]));\n\ float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src22 , src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_07_01) < dist_00_08;\n\ blendResult[1] = ((dist_00_08 > dist_07_01) && (v[0] != v[7]) && (v[0] != v[1])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|21|22|--|--\n\ // 19|06|07|08|--\n\ // 18|05|00|01|--\n\ // --|04|03|--|--\n\ // --|--|--|--|--\n\ // Corner (0, 0)\n\ if ( !((v[6] == v[7] && v[5] == v[0]) || (v[6] == v[5] && v[7] == v[0])) )\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_05_07 = DistYCbCr(src[18], src[ 6]) + DistYCbCr(src[ 6], src[22]) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7]));\n\ float dist_06_00 = DistYCbCr(src[19], src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[21], src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0]));\n\ #else\n\ vec3 src18 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, 0.0)).rgb;\n\ vec3 src19 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-2.0, -1.0)).rgb;\n\ vec3 src21 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2(-1.0, -2.0)).rgb;\n\ vec3 src22 = SAMPLE3_TEX_RECT(tex, texCoord[0] + vec2( 0.0, -2.0)).rgb;\n\ float dist_05_07 = DistYCbCr(src18 , src[ 6]) + DistYCbCr(src[ 6], src22 ) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7]));\n\ float dist_06_00 = DistYCbCr(src19 , src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src21 , src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0]));\n\ #endif\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_07) < dist_06_00;\n\ blendResult[0] = ((dist_05_07 < dist_06_00) && (v[0] != v[5]) && (v[0] != v[7])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ vec3 dst[16];\n\ dst[ 0] = src[0];\n\ dst[ 1] = src[0];\n\ dst[ 2] = src[0];\n\ dst[ 3] = src[0];\n\ dst[ 4] = src[0];\n\ dst[ 5] = src[0];\n\ dst[ 6] = src[0];\n\ dst[ 7] = src[0];\n\ dst[ 8] = src[0];\n\ dst[ 9] = src[0];\n\ dst[10] = src[0];\n\ dst[11] = src[0];\n\ dst[12] = src[0];\n\ dst[13] = src[0];\n\ dst[14] = src[0];\n\ dst[15] = src[0];\n\ \n\ // Scale pixel\n\ if (IsBlendingNeeded(blendResult))\n\ {\n\ #if GPU_TIER >= SHADERSUPPORT_MID_TIER\n\ float dist_01_04 = DistYCbCr(src[1], src[4]);\n\ float dist_03_08 = DistYCbCr(src[3], src[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[4]) && (v[5] != v[4]);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[8]) && (v[7] != v[8]);\n\ bool needBlend = (blendResult[2] != BLEND_NONE);\n\ bool doLineBlend = ( blendResult[2] >= BLEND_DOMINANT ||\n\ !((blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && !IsPixEqual(src[0], src[2])) ) );\n\ \n\ vec3 blendPix = ( DistYCbCr(src[0], src[1]) <= DistYCbCr(src[0], src[3]) ) ? src[1] : src[3];\n\ dst[ 2] = mix(dst[ 2], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00);\n\ dst[ 9] = mix(dst[ 9], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[10] = mix(dst[10], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00);\n\ dst[11] = mix(dst[11], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[12] = mix(dst[12], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00);\n\ dst[13] = mix(dst[13], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[14] = mix(dst[14], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00);\n\ dst[15] = mix(dst[15], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[7], src[2]);\n\ dist_03_08 = DistYCbCr(src[1], src[6]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[2]) && (v[3] != v[2]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[6]) && (v[5] != v[6]);\n\ needBlend = (blendResult[1] != BLEND_NONE);\n\ doLineBlend = ( blendResult[1] >= BLEND_DOMINANT ||\n\ !((blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && !IsPixEqual(src[0], src[8])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[7]) <= DistYCbCr(src[0], src[1]) ) ? src[7] : src[1];\n\ dst[ 1] = mix(dst[ 1], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00);\n\ dst[ 6] = mix(dst[ 6], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[ 7] = mix(dst[ 7], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00);\n\ dst[ 8] = mix(dst[ 8], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[ 9] = mix(dst[ 9], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00);\n\ dst[10] = mix(dst[10], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[11] = mix(dst[11], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00);\n\ dst[12] = mix(dst[12], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[5], src[8]);\n\ dist_03_08 = DistYCbCr(src[7], src[4]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[8]) && (v[1] != v[8]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[4]) && (v[3] != v[4]);\n\ needBlend = (blendResult[0] != BLEND_NONE);\n\ doLineBlend = ( blendResult[0] >= BLEND_DOMINANT ||\n\ !((blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && !IsPixEqual(src[0], src[6])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[5]) <= DistYCbCr(src[0], src[7]) ) ? src[5] : src[7];\n\ dst[ 0] = mix(dst[ 0], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00);\n\ dst[15] = mix(dst[15], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[ 4] = mix(dst[ 4], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00);\n\ dst[ 5] = mix(dst[ 5], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[ 6] = mix(dst[ 6], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00);\n\ dst[ 7] = mix(dst[ 7], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[ 8] = mix(dst[ 8], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00);\n\ dst[ 9] = mix(dst[ 9], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[3], src[6]);\n\ dist_03_08 = DistYCbCr(src[5], src[2]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[6]) && (v[7] != v[6]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[2]) && (v[1] != v[2]);\n\ needBlend = (blendResult[3] != BLEND_NONE);\n\ doLineBlend = ( blendResult[3] >= BLEND_DOMINANT ||\n\ !((blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && !IsPixEqual(src[0], src[4])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[3]) <= DistYCbCr(src[0], src[5]) ) ? src[3] : src[5];\n\ dst[ 3] = mix(dst[ 3], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 1.0/3.0 : 0.25) : ((haveSteepLine) ? 0.25 : 0.00)) : 0.00);\n\ dst[12] = mix(dst[12], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.25 : 0.00);\n\ dst[13] = mix(dst[13], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.75 : 0.00);\n\ dst[14] = mix(dst[14], blendPix, (needBlend) ? ((doLineBlend) ? ((haveSteepLine) ? 1.00 : ((haveShallowLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[15] = mix(dst[15], blendPix, (needBlend) ? ((doLineBlend) ? 1.00 : 0.6848532563) : 0.00);\n\ dst[ 4] = mix(dst[ 4], blendPix, (needBlend) ? ((doLineBlend) ? ((haveShallowLine) ? 1.00 : ((haveSteepLine) ? 0.75 : 0.50)) : 0.08677704501) : 0.00);\n\ dst[ 5] = mix(dst[ 5], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.75 : 0.00);\n\ dst[ 6] = mix(dst[ 6], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00);\n\ \n\ #else\n\ vec3 k[9];\n\ vec3 tempDst15;\n\ vec3 tempDst14;\n\ vec3 tempDst13;\n\ vec3 tempDst3;\n\ \n\ k[8] = src[8];\n\ k[7] = src[7];\n\ k[6] = src[6];\n\ k[5] = src[5];\n\ k[4] = src[4];\n\ k[3] = src[3];\n\ k[2] = src[2];\n\ k[1] = src[1];\n\ k[0] = src[0];\n\ ScalePixel(blendResult.xyzw, k, dst);\n\ \n\ k[8] = src[6];\n\ k[7] = src[5];\n\ k[6] = src[4];\n\ k[5] = src[3];\n\ k[4] = src[2];\n\ k[3] = src[1];\n\ k[2] = src[8];\n\ k[1] = src[7];\n\ tempDst15 = dst[15];\n\ tempDst14 = dst[14];\n\ tempDst13 = dst[13];\n\ tempDst3 = dst[ 3];\n\ dst[15] = dst[12];\n\ dst[14] = dst[11];\n\ dst[13] = dst[10];\n\ dst[12] = dst[ 9];\n\ dst[11] = dst[ 8];\n\ dst[10] = dst[ 7];\n\ dst[ 9] = dst[ 6];\n\ dst[ 8] = dst[ 5];\n\ dst[ 7] = dst[ 4];\n\ dst[ 6] = tempDst15;\n\ dst[ 5] = tempDst14;\n\ dst[ 4] = tempDst13;\n\ dst[ 3] = dst[ 2];\n\ dst[ 2] = dst[ 1];\n\ dst[ 1] = dst[ 0];\n\ dst[ 0] = tempDst3;\n\ ScalePixel(blendResult.wxyz, k, dst);\n\ \n\ k[8] = src[4];\n\ k[7] = src[3];\n\ k[6] = src[2];\n\ k[5] = src[1];\n\ k[4] = src[8];\n\ k[3] = src[7];\n\ k[2] = src[6];\n\ k[1] = src[5];\n\ tempDst15 = dst[15];\n\ tempDst14 = dst[14];\n\ tempDst13 = dst[13];\n\ tempDst3 = dst[ 3];\n\ dst[15] = dst[12];\n\ dst[14] = dst[11];\n\ dst[13] = dst[10];\n\ dst[12] = dst[ 9];\n\ dst[11] = dst[ 8];\n\ dst[10] = dst[ 7];\n\ dst[ 9] = dst[ 6];\n\ dst[ 8] = dst[ 5];\n\ dst[ 7] = dst[ 4];\n\ dst[ 6] = tempDst15;\n\ dst[ 5] = tempDst14;\n\ dst[ 4] = tempDst13;\n\ dst[ 3] = dst[ 2];\n\ dst[ 2] = dst[ 1];\n\ dst[ 1] = dst[ 0];\n\ dst[ 0] = tempDst3;\n\ ScalePixel(blendResult.zwxy, k, dst);\n\ \n\ k[8] = src[2];\n\ k[7] = src[1];\n\ k[6] = src[8];\n\ k[5] = src[7];\n\ k[4] = src[6];\n\ k[3] = src[5];\n\ k[2] = src[4];\n\ k[1] = src[3];\n\ tempDst15 = dst[15];\n\ tempDst14 = dst[14];\n\ tempDst13 = dst[13];\n\ tempDst3 = dst[ 3];\n\ dst[15] = dst[12];\n\ dst[14] = dst[11];\n\ dst[13] = dst[10];\n\ dst[12] = dst[ 9];\n\ dst[11] = dst[ 8];\n\ dst[10] = dst[ 7];\n\ dst[ 9] = dst[ 6];\n\ dst[ 8] = dst[ 5];\n\ dst[ 7] = dst[ 4];\n\ dst[ 6] = tempDst15;\n\ dst[ 5] = tempDst14;\n\ dst[ 4] = tempDst13;\n\ dst[ 3] = dst[ 2];\n\ dst[ 2] = dst[ 1];\n\ dst[ 1] = dst[ 0];\n\ dst[ 0] = tempDst3;\n\ ScalePixel(blendResult.yzwx, k, dst);\n\ \n\ // Rotate the destination pixels back to 0 degrees.\n\ tempDst15 = dst[15];\n\ tempDst14 = dst[14];\n\ tempDst13 = dst[13];\n\ tempDst3 = dst[ 3];\n\ dst[15] = dst[12];\n\ dst[14] = dst[11];\n\ dst[13] = dst[10];\n\ dst[12] = dst[ 9];\n\ dst[11] = dst[ 8];\n\ dst[10] = dst[ 7];\n\ dst[ 9] = dst[ 6];\n\ dst[ 8] = dst[ 5];\n\ dst[ 7] = dst[ 4];\n\ dst[ 6] = tempDst15;\n\ dst[ 5] = tempDst14;\n\ dst[ 4] = tempDst13;\n\ dst[ 3] = dst[ 2];\n\ dst[ 2] = dst[ 1];\n\ dst[ 1] = dst[ 0];\n\ dst[ 0] = tempDst3;\n\ #endif\n\ }\n\ \n\ vec2 f = fract(texCoord[0]);\n\ OUT_FRAG_COLOR.rgb = mix( mix( mix( mix(dst[ 6], dst[ 7], step(0.25, f.x)), mix(dst[ 8], dst[ 9], step(0.75, f.x)), step(0.50, f.x)),\n\ mix( mix(dst[ 5], dst[ 0], step(0.25, f.x)), mix(dst[ 1], dst[10], step(0.75, f.x)), step(0.50, f.x)), step(0.25, f.y)),\n\ mix( mix( mix(dst[ 4], dst[ 3], step(0.25, f.x)), mix(dst[ 2], dst[11], step(0.75, f.x)), step(0.50, f.x)),\n\ mix( mix(dst[15], dst[14], step(0.25, f.x)), mix(dst[13], dst[12], step(0.75, f.x)), step(0.50, f.x)), step(0.75, f.y)),\n\ step(0.50, f.y));\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; static const char *Scaler5xBRZFragShader_110 = {"\ #define BLEND_NONE 0\n\ #define BLEND_NORMAL 1\n\ #define BLEND_DOMINANT 2\n\ #define LUMINANCE_WEIGHT 1.0\n\ #define EQUAL_COLOR_TOLERANCE 30.0/255.0\n\ #define STEEP_DIRECTION_THRESHOLD 2.2\n\ #define DOMINANT_DIRECTION_THRESHOLD 3.6\n\ #define M_PI 3.1415926535897932384626433832795\n\ \n\ // Let's not even bother trying to support GPUs below Mid-tier.\n\ // The xBRZ pixel scalers are already pretty hefty as-is, and\n\ // this shader, having to calculate 25 pixel locations, is the\n\ // heftiest of all of them. Trust me -- older GPUs just can't\n\ // handle this one.\n\ \n\ VARYING vec2 texCoord[25];\n\ uniform sampler2DRect tex;\n\ \n\ float reduce(const vec3 color)\n\ {\n\ return dot(color, vec3(65536.0, 256.0, 1.0));\n\ }\n\ \n\ float DistYCbCr(const vec3 pixA, const vec3 pixB)\n\ {\n\ const vec3 w = vec3(0.2627, 0.6780, 0.0593);\n\ const float scaleB = 0.5 / (1.0 - w.b);\n\ const float scaleR = 0.5 / (1.0 - w.r);\n\ vec3 diff = pixA - pixB;\n\ float Y = dot(diff, w);\n\ float Cb = scaleB * (diff.b - Y);\n\ float Cr = scaleR * (diff.r - Y);\n\ \n\ return sqrt( ((LUMINANCE_WEIGHT*Y) * (LUMINANCE_WEIGHT*Y)) + (Cb * Cb) + (Cr * Cr) );\n\ }\n\ \n\ bool IsPixEqual(const vec3 pixA, const vec3 pixB)\n\ {\n\ return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE);\n\ }\n\ \n\ bool IsBlendingNeeded(const ivec4 blend)\n\ {\n\ return any(notEqual(blend, ivec4(BLEND_NONE)));\n\ }\n\ \n\ /*\n\ // Let's keep xBRZ's original blending logic around for reference.\n\ void ScalePixel(const ivec4 blend, const vec3 k[9], inout vec3 dst[25])\n\ {\n\ if (blend[2] == BLEND_NONE)\n\ {\n\ return;\n\ }\n\ \n\ vec3 blendPix = ( DistYCbCr(k[0], k[1]) <= DistYCbCr(k[0], k[3]) ) ? k[1] : k[3];\n\ \n\ if ( DoLineBlend(blend, k) )\n\ {\n\ float v0 = reduce(k[0]);\n\ float v4 = reduce(k[4]);\n\ float v5 = reduce(k[5]);\n\ float v7 = reduce(k[7]);\n\ float v8 = reduce(k[8]);\n\ \n\ float dist_01_04 = DistYCbCr(k[1], k[4]);\n\ float dist_03_08 = DistYCbCr(k[3], k[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v0 != v4) && (v5 != v4);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v0 != v8) && (v7 != v8);\n\ \n\ if (haveShallowLine)\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep and shallow\n\ dst[24] = mix(dst[24], blendPix, 0.25);\n\ dst[ 1] = mix(dst[ 1], blendPix, 0.25);\n\ dst[ 9] = mix(dst[ 9], blendPix, 0.75);\n\ dst[16] = mix(dst[16], blendPix, 0.25);\n\ dst[ 3] = mix(dst[ 3], blendPix, 0.25);\n\ dst[15] = mix(dst[15], blendPix, 0.75);\n\ dst[10] = mix(dst[10], blendPix, 1.00);\n\ dst[11] = mix(dst[11], blendPix, 1.00);\n\ dst[14] = mix(dst[14], blendPix, 1.00);\n\ dst[13] = mix(dst[13], blendPix, 1.00);\n\ dst[12] = mix(dst[12], blendPix, 1.00);\n\ dst[ 2] = mix(dst[ 2], blendPix, 2.0/3.0);\n\ }\n\ else\n\ {\n\ // Blend line shallow\n\ dst[16] = mix(dst[16], blendPix, 0.25);\n\ dst[ 3] = mix(dst[ 3], blendPix, 0.25);\n\ dst[10] = mix(dst[10], blendPix, 0.25);\n\ dst[15] = mix(dst[15], blendPix, 0.75);\n\ dst[ 2] = mix(dst[ 2], blendPix, 0.75);\n\ dst[14] = mix(dst[14], blendPix, 1.00);\n\ dst[13] = mix(dst[13], blendPix, 1.00);\n\ dst[12] = mix(dst[12], blendPix, 1.00);\n\ dst[11] = mix(dst[11], blendPix, 1.00);\n\ }\n\ }\n\ else\n\ {\n\ if (haveSteepLine)\n\ {\n\ // Blend line steep\n\ dst[24] = mix(dst[24], blendPix, 0.25);\n\ dst[ 1] = mix(dst[ 1], blendPix, 0.25);\n\ dst[14] = mix(dst[14], blendPix, 0.25);\n\ dst[ 9] = mix(dst[ 9], blendPix, 0.75);\n\ dst[ 2] = mix(dst[ 2], blendPix, 0.75);\n\ dst[10] = mix(dst[10], blendPix, 1.00);\n\ dst[11] = mix(dst[11], blendPix, 1.00);\n\ dst[12] = mix(dst[12], blendPix, 1.00);\n\ dst[13] = mix(dst[13], blendPix, 1.00);\n\ }\n\ else\n\ {\n\ // Blend line diagonal\n\ dst[14] = mix(dst[14], blendPix, 0.125);\n\ dst[ 2] = mix(dst[ 2], blendPix, 0.125);\n\ dst[ 9] = mix(dst[ 9], blendPix, 0.125);\n\ dst[13] = mix(dst[13], blendPix, 0.875);\n\ dst[11] = mix(dst[11], blendPix, 0.875);\n\ dst[12] = mix(dst[12], blendPix, 1.000);\n\ }\n\ }\n\ }\n\ else\n\ {\n\ // Blend corner\n\ dst[12] = mix(dst[12], blendPix, 0.8631434088);\n\ dst[13] = mix(dst[13], blendPix, 0.2306749731);\n\ dst[11] = mix(dst[11], blendPix, 0.2306749731);\n\ }\n\ }\n\ */\n\ //---------------------------------------\n\ // Input Pixel Mapping: --|21|22|23|--\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // --|15|14|13|--\n\ //\n\ // Output Pixel Mapping: 20|21|22|23|24\n\ // 19|06|07|08|09\n\ // 18|05|00|01|10\n\ // 17|04|03|02|11\n\ // 16|15|14|13|12\n\ \n\ void main()\n\ {\n\ vec3 src[25];\n\ src[ 0] = SAMPLE3_TEX_RECT(tex, texCoord[ 0]).rgb;\n\ src[ 1] = SAMPLE3_TEX_RECT(tex, texCoord[ 1]).rgb;\n\ src[ 2] = SAMPLE3_TEX_RECT(tex, texCoord[ 2]).rgb;\n\ src[ 3] = SAMPLE3_TEX_RECT(tex, texCoord[ 3]).rgb;\n\ src[ 4] = SAMPLE3_TEX_RECT(tex, texCoord[ 4]).rgb;\n\ src[ 5] = SAMPLE3_TEX_RECT(tex, texCoord[ 5]).rgb;\n\ src[ 6] = SAMPLE3_TEX_RECT(tex, texCoord[ 6]).rgb;\n\ src[ 7] = SAMPLE3_TEX_RECT(tex, texCoord[ 7]).rgb;\n\ src[ 8] = SAMPLE3_TEX_RECT(tex, texCoord[ 8]).rgb;\n\ src[ 9] = SAMPLE3_TEX_RECT(tex, texCoord[ 9]).rgb;\n\ src[10] = SAMPLE3_TEX_RECT(tex, texCoord[10]).rgb;\n\ src[11] = SAMPLE3_TEX_RECT(tex, texCoord[11]).rgb;\n\ src[12] = SAMPLE3_TEX_RECT(tex, texCoord[12]).rgb;\n\ src[13] = SAMPLE3_TEX_RECT(tex, texCoord[13]).rgb;\n\ src[14] = SAMPLE3_TEX_RECT(tex, texCoord[14]).rgb;\n\ src[15] = SAMPLE3_TEX_RECT(tex, texCoord[15]).rgb;\n\ src[16] = SAMPLE3_TEX_RECT(tex, texCoord[16]).rgb;\n\ src[17] = SAMPLE3_TEX_RECT(tex, texCoord[17]).rgb;\n\ src[18] = SAMPLE3_TEX_RECT(tex, texCoord[18]).rgb;\n\ src[19] = SAMPLE3_TEX_RECT(tex, texCoord[19]).rgb;\n\ src[20] = SAMPLE3_TEX_RECT(tex, texCoord[20]).rgb;\n\ src[21] = SAMPLE3_TEX_RECT(tex, texCoord[21]).rgb;\n\ src[22] = SAMPLE3_TEX_RECT(tex, texCoord[22]).rgb;\n\ src[23] = SAMPLE3_TEX_RECT(tex, texCoord[23]).rgb;\n\ src[24] = SAMPLE3_TEX_RECT(tex, texCoord[24]).rgb;\n\ \n\ float v[9];\n\ v[0] = reduce(src[0]);\n\ v[1] = reduce(src[1]);\n\ v[2] = reduce(src[2]);\n\ v[3] = reduce(src[3]);\n\ v[4] = reduce(src[4]);\n\ v[5] = reduce(src[5]);\n\ v[6] = reduce(src[6]);\n\ v[7] = reduce(src[7]);\n\ v[8] = reduce(src[8]);\n\ \n\ ivec4 blendResult = ivec4(BLEND_NONE);\n\ \n\ // Preprocess corners\n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|--|07|08|--\n\ // --|05|00|01|10\n\ // --|04|03|02|11\n\ // --|--|14|13|--\n\ \n\ // Corner (1, 1)\n\ if ( !((v[0] == v[1] && v[3] == v[2]) || (v[0] == v[3] && v[1] == v[2])) )\n\ {\n\ float dist_03_01 = DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + DistYCbCr(src[14], src[ 2]) + DistYCbCr(src[ 2], src[10]) + (4.0 * DistYCbCr(src[ 3], src[ 1]));\n\ float dist_00_02 = DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[ 3], src[13]) + DistYCbCr(src[ 7], src[ 1]) + DistYCbCr(src[ 1], src[11]) + (4.0 * DistYCbCr(src[ 0], src[ 2]));\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_03_01) < dist_00_02;\n\ blendResult[2] = ((dist_03_01 < dist_00_02) && (v[0] != v[1]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ \n\ // Pixel Tap Mapping: --|--|--|--|--\n\ // --|06|07|--|--\n\ // 18|05|00|01|--\n\ // 17|04|03|02|--\n\ // --|15|14|--|--\n\ // Corner (0, 1)\n\ if ( !((v[5] == v[0] && v[4] == v[3]) || (v[5] == v[4] && v[0] == v[3])) )\n\ {\n\ float dist_04_00 = DistYCbCr(src[17], src[ 5]) + DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[15], src[ 3]) + DistYCbCr(src[ 3], src[ 1]) + (4.0 * DistYCbCr(src[ 4], src[ 0]));\n\ float dist_05_03 = DistYCbCr(src[18], src[ 4]) + DistYCbCr(src[ 4], src[14]) + DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + (4.0 * DistYCbCr(src[ 5], src[ 3]));\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_03) < dist_04_00;\n\ blendResult[3] = ((dist_04_00 > dist_05_03) && (v[0] != v[5]) && (v[0] != v[3])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|--|22|23|--\n\ // --|06|07|08|09\n\ // --|05|00|01|10\n\ // --|--|03|02|--\n\ // --|--|--|--|--\n\ // Corner (1, 0)\n\ if ( !((v[7] == v[8] && v[0] == v[1]) || (v[7] == v[0] && v[8] == v[1])) )\n\ {\n\ float dist_00_08 = DistYCbCr(src[ 5], src[ 7]) + DistYCbCr(src[ 7], src[23]) + DistYCbCr(src[ 3], src[ 1]) + DistYCbCr(src[ 1], src[ 9]) + (4.0 * DistYCbCr(src[ 0], src[ 8]));\n\ float dist_07_01 = DistYCbCr(src[ 6], src[ 0]) + DistYCbCr(src[ 0], src[ 2]) + DistYCbCr(src[22], src[ 8]) + DistYCbCr(src[ 8], src[10]) + (4.0 * DistYCbCr(src[ 7], src[ 1]));\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_07_01) < dist_00_08;\n\ blendResult[1] = ((dist_00_08 > dist_07_01) && (v[0] != v[7]) && (v[0] != v[1])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ // Pixel Tap Mapping: --|21|22|--|--\n\ // 19|06|07|08|--\n\ // 18|05|00|01|--\n\ // --|04|03|--|--\n\ // --|--|--|--|--\n\ // Corner (0, 0)\n\ if ( !((v[6] == v[7] && v[5] == v[0]) || (v[6] == v[5] && v[7] == v[0])) )\n\ {\n\ float dist_05_07 = DistYCbCr(src[18], src[ 6]) + DistYCbCr(src[ 6], src[22]) + DistYCbCr(src[ 4], src[ 0]) + DistYCbCr(src[ 0], src[ 8]) + (4.0 * DistYCbCr(src[ 5], src[ 7]));\n\ float dist_06_00 = DistYCbCr(src[19], src[ 5]) + DistYCbCr(src[ 5], src[ 3]) + DistYCbCr(src[21], src[ 7]) + DistYCbCr(src[ 7], src[ 1]) + (4.0 * DistYCbCr(src[ 6], src[ 0]));\n\ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_05_07) < dist_06_00;\n\ blendResult[0] = ((dist_05_07 < dist_06_00) && (v[0] != v[5]) && (v[0] != v[7])) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;\n\ }\n\ \n\ vec3 dst[25];\n\ dst[ 0] = src[0];\n\ dst[ 1] = src[0];\n\ dst[ 2] = src[0];\n\ dst[ 3] = src[0];\n\ dst[ 4] = src[0];\n\ dst[ 5] = src[0];\n\ dst[ 6] = src[0];\n\ dst[ 7] = src[0];\n\ dst[ 8] = src[0];\n\ dst[ 9] = src[0];\n\ dst[10] = src[0];\n\ dst[11] = src[0];\n\ dst[12] = src[0];\n\ dst[13] = src[0];\n\ dst[14] = src[0];\n\ dst[15] = src[0];\n\ dst[16] = src[0];\n\ dst[17] = src[0];\n\ dst[18] = src[0];\n\ dst[19] = src[0];\n\ dst[20] = src[0];\n\ dst[21] = src[0];\n\ dst[22] = src[0];\n\ dst[23] = src[0];\n\ dst[24] = src[0];\n\ \n\ // Scale pixel\n\ if (IsBlendingNeeded(blendResult))\n\ {\n\ float dist_01_04 = DistYCbCr(src[1], src[4]);\n\ float dist_03_08 = DistYCbCr(src[3], src[8]);\n\ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[4]) && (v[5] != v[4]);\n\ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[8]) && (v[7] != v[8]);\n\ bool needBlend = (blendResult[2] != BLEND_NONE);\n\ bool doLineBlend = ( blendResult[2] >= BLEND_DOMINANT ||\n\ !((blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && !IsPixEqual(src[0], src[2])) ) );\n\ \n\ vec3 blendPix = ( DistYCbCr(src[0], src[1]) <= DistYCbCr(src[0], src[3]) ) ? src[1] : src[3];\n\ dst[ 1] = mix(dst[ 1], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ dst[ 2] = mix(dst[ 2], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 2.0/3.0 : 0.750) : ((haveSteepLine) ? 0.750 : 0.125)) : 0.000);\n\ dst[ 3] = mix(dst[ 3], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[ 9] = mix(dst[ 9], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.000 : 0.125)) : 0.000);\n\ dst[10] = mix(dst[10], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 1.000 : ((haveShallowLine) ? 0.250 : 0.000)) : 0.000);\n\ dst[11] = mix(dst[11], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[12] = mix(dst[12], blendPix, (needBlend) ? ((doLineBlend) ? 1.000 : 0.8631434088) : 0.000);\n\ dst[13] = mix(dst[13], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[14] = mix(dst[14], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 1.000 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[15] = mix(dst[15], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.750 : 0.000);\n\ dst[16] = mix(dst[16], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[24] = mix(dst[24], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[7], src[2]);\n\ dist_03_08 = DistYCbCr(src[1], src[6]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[2]) && (v[3] != v[2]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[6]) && (v[5] != v[6]);\n\ needBlend = (blendResult[1] != BLEND_NONE);\n\ doLineBlend = ( blendResult[1] >= BLEND_DOMINANT ||\n\ !((blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (IsPixEqual(src[2], src[1]) && IsPixEqual(src[1], src[8]) && IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && !IsPixEqual(src[0], src[8])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[7]) <= DistYCbCr(src[0], src[1]) ) ? src[7] : src[1];\n\ dst[ 7] = mix(dst[ 7], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ dst[ 8] = mix(dst[ 8], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 2.0/3.0 : 0.750) : ((haveSteepLine) ? 0.750 : 0.125)) : 0.000);\n\ dst[ 1] = mix(dst[ 1], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[21] = mix(dst[21], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.000 : 0.125)) : 0.000);\n\ dst[22] = mix(dst[22], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 1.000 : ((haveShallowLine) ? 0.250 : 0.000)) : 0.000);\n\ dst[23] = mix(dst[23], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[24] = mix(dst[24], blendPix, (needBlend) ? ((doLineBlend) ? 1.000 : 0.8631434088) : 0.000);\n\ dst[ 9] = mix(dst[ 9], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[10] = mix(dst[10], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 1.000 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[11] = mix(dst[11], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.750 : 0.000);\n\ dst[12] = mix(dst[12], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[20] = mix(dst[20], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[5], src[8]);\n\ dist_03_08 = DistYCbCr(src[7], src[4]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[8]) && (v[1] != v[8]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[4]) && (v[3] != v[4]);\n\ needBlend = (blendResult[0] != BLEND_NONE);\n\ doLineBlend = ( blendResult[0] >= BLEND_DOMINANT ||\n\ !((blendResult[3] != BLEND_NONE && !IsPixEqual(src[0], src[8])) ||\n\ (blendResult[1] != BLEND_NONE && !IsPixEqual(src[0], src[4])) ||\n\ (IsPixEqual(src[8], src[7]) && IsPixEqual(src[7], src[6]) && IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && !IsPixEqual(src[0], src[6])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[5]) <= DistYCbCr(src[0], src[7]) ) ? src[5] : src[7];\n\ dst[ 5] = mix(dst[ 5], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ dst[ 6] = mix(dst[ 6], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 2.0/3.0 : 0.750) : ((haveSteepLine) ? 0.750 : 0.125)) : 0.000);\n\ dst[ 7] = mix(dst[ 7], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[17] = mix(dst[17], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.000 : 0.125)) : 0.000);\n\ dst[18] = mix(dst[18], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 1.000 : ((haveShallowLine) ? 0.250 : 0.000)) : 0.000);\n\ dst[19] = mix(dst[19], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[20] = mix(dst[20], blendPix, (needBlend) ? ((doLineBlend) ? 1.000 : 0.8631434088) : 0.000);\n\ dst[21] = mix(dst[21], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[22] = mix(dst[22], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 1.000 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[23] = mix(dst[23], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.750 : 0.000);\n\ dst[24] = mix(dst[24], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[16] = mix(dst[16], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ \n\ \n\ dist_01_04 = DistYCbCr(src[3], src[6]);\n\ dist_03_08 = DistYCbCr(src[5], src[2]);\n\ haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_01_04 <= dist_03_08) && (v[0] != v[6]) && (v[7] != v[6]);\n\ haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_03_08 <= dist_01_04) && (v[0] != v[2]) && (v[1] != v[2]);\n\ needBlend = (blendResult[3] != BLEND_NONE);\n\ doLineBlend = ( blendResult[3] >= BLEND_DOMINANT ||\n\ !((blendResult[2] != BLEND_NONE && !IsPixEqual(src[0], src[6])) ||\n\ (blendResult[0] != BLEND_NONE && !IsPixEqual(src[0], src[2])) ||\n\ (IsPixEqual(src[6], src[5]) && IsPixEqual(src[5], src[4]) && IsPixEqual(src[4], src[3]) && IsPixEqual(src[3], src[2]) && !IsPixEqual(src[0], src[4])) ) );\n\ \n\ blendPix = ( DistYCbCr(src[0], src[3]) <= DistYCbCr(src[0], src[5]) ) ? src[3] : src[5];\n\ dst[ 3] = mix(dst[ 3], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ dst[ 4] = mix(dst[ 4], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? ((haveSteepLine) ? 2.0/3.0 : 0.750) : ((haveSteepLine) ? 0.750 : 0.125)) : 0.000);\n\ dst[ 5] = mix(dst[ 5], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[13] = mix(dst[13], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 0.750 : ((haveShallowLine) ? 0.000 : 0.125)) : 0.000);\n\ dst[14] = mix(dst[14], blendPix, (needBlend && doLineBlend) ? ((haveSteepLine) ? 1.000 : ((haveShallowLine) ? 0.250 : 0.000)) : 0.000);\n\ dst[15] = mix(dst[15], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[16] = mix(dst[16], blendPix, (needBlend) ? ((doLineBlend) ? 1.000 : 0.8631434088) : 0.000);\n\ dst[17] = mix(dst[17], blendPix, (needBlend) ? ((doLineBlend) ? ((!haveShallowLine && !haveSteepLine) ? 0.875 : 1.000) : 0.2306749731) : 0.000);\n\ dst[18] = mix(dst[18], blendPix, (needBlend && doLineBlend) ? ((haveShallowLine) ? 1.000 : ((haveSteepLine) ? 0.250 : 0.125)) : 0.000);\n\ dst[19] = mix(dst[19], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.750 : 0.000);\n\ dst[20] = mix(dst[20], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.250 : 0.000);\n\ dst[12] = mix(dst[12], blendPix, (needBlend && doLineBlend && haveSteepLine) ? 0.250 : 0.000);\n\ }\n\ \n\ vec2 f = fract(texCoord[0]);\n\ OUT_FRAG_COLOR.rgb = mix( mix( dst[20], mix( mix(dst[21], dst[22], step(0.40, f.x)), mix(dst[23], dst[24], step(0.80, f.x)), step(0.60, f.x)), step(0.20, f.x) ),\n\ mix ( mix( mix( dst[19], mix( mix(dst[ 6], dst[ 7], step(0.40, f.x)), mix(dst[ 8], dst[ 9], step(0.80, f.x)), step(0.60, f.x)), step(0.20, f.x) ),\n\ mix( dst[18], mix( mix(dst[ 5], dst[ 0], step(0.40, f.x)), mix(dst[ 1], dst[10], step(0.80, f.x)), step(0.60, f.x)), step(0.20, f.x) ), step(0.40, f.y)),\n\ mix( mix( dst[17], mix( mix(dst[ 4], dst[ 3], step(0.40, f.x)), mix(dst[ 2], dst[11], step(0.80, f.x)), step(0.60, f.x)), step(0.20, f.x) ),\n\ mix( dst[16], mix( mix(dst[15], dst[14], step(0.40, f.x)), mix(dst[13], dst[12], step(0.80, f.x)), step(0.60, f.x)), step(0.20, f.x) ), step(0.80, f.y)),\n\ step(0.60, f.y)),\n\ step(0.20, f.y));\n\ OUT_FRAG_COLOR.a = 1.0;\n\ }\n\ "}; enum OGLVertexAttributeID { OGLVertexAttributeID_Position = 0, OGLVertexAttributeID_TexCoord0 = 8 }; typedef struct { uint8_t p0; uint8_t p1; uint8_t p2; uint8_t w0; uint8_t w1; uint8_t w2; } LUTValues; static LUTValues *_LQ2xLUT = NULL; static LUTValues *_HQ2xLUT = NULL; static LUTValues *_HQ4xLUT = NULL; static const GLint filterVtxBuffer[8] = {-1, -1, 1, -1, 1, 1, -1, 1}; static const GLubyte filterElementBuffer[6] = {0, 1, 2, 2, 3, 0}; static const GLubyte outputElementBuffer[12] = {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4}; void GetGLVersionOGL(GLint *outMajor, GLint *outMinor, GLint *outRevision) { const char *oglVersionString = (const char *)glGetString(GL_VERSION); if (oglVersionString == NULL) { return; } size_t versionStringLength = 0; // First, check for the dot in the revision string. There should be at // least one present. const char *versionStrEnd = strstr(oglVersionString, "."); if (versionStrEnd == NULL) { return; } // Next, check for the space before the vendor-specific info (if present). versionStrEnd = strstr(oglVersionString, " "); if (versionStrEnd == NULL) { // If a space was not found, then the vendor-specific info is not present, // and therefore the entire string must be the version number. versionStringLength = strlen(oglVersionString); } else { // If a space was found, then the vendor-specific info is present, // and therefore the version number is everything before the space. versionStringLength = versionStrEnd - oglVersionString; } // Copy the version substring and parse it. char *versionSubstring = (char *)malloc(versionStringLength * sizeof(char)); strncpy(versionSubstring, oglVersionString, versionStringLength); unsigned int major = 0; unsigned int minor = 0; unsigned int revision = 0; sscanf(versionSubstring, "%u.%u.%u", &major, &minor, &revision); free(versionSubstring); versionSubstring = NULL; if (outMajor != NULL) { *outMajor = major; } if (outMinor != NULL) { *outMinor = minor; } if (outRevision != NULL) { *outRevision = revision; } } OGLInfo* OGLInfoCreate_Legacy() { return new OGLInfo_Legacy; } void glBindVertexArray_LegacyAPPLE(GLuint vaoID) { glBindVertexArrayAPPLE(vaoID); } void glDeleteVertexArrays_LegacyAPPLE(GLsizei n, const GLuint *vaoIDs) { glDeleteVertexArraysAPPLE(n, vaoIDs); } void glGenVertexArrays_LegacyAPPLE(GLsizei n, GLuint *vaoIDs) { glGenVertexArraysAPPLE(n, vaoIDs); } OGLInfo* (*OGLInfoCreate_Func)() = &OGLInfoCreate_Legacy; void (*glBindVertexArrayDESMUME)(GLuint id) = &glBindVertexArray_LegacyAPPLE; void (*glDeleteVertexArraysDESMUME)(GLsizei n, const GLuint *ids) = &glDeleteVertexArrays_LegacyAPPLE; void (*glGenVertexArraysDESMUME)(GLsizei n, GLuint *ids) = &glGenVertexArrays_LegacyAPPLE; static LUTValues PackLUTValues(const uint8_t p0, const uint8_t p1, const uint8_t p2, const uint8_t w0, const uint8_t w1, const uint8_t w2) { const uint8_t wR = 256 / (w0 + w1 + w2); return (LUTValues) { p0*31, p1*31, p2*31, (w1 == 0 && w2 == 0) ? 255 : w0*wR, w1*wR, w2*wR }; } static void InitHQnxLUTs() { static bool lutValuesInited = false; if (lutValuesInited) { return; } _LQ2xLUT = (LUTValues *)malloc(256*(2*2)*16 * sizeof(LUTValues)); _HQ2xLUT = (LUTValues *)malloc(256*(2*2)*16 * sizeof(LUTValues)); _HQ4xLUT = (LUTValues *)malloc(256*(4*4)*16 * sizeof(LUTValues) + 4); // The bytes fix a mysterious crash that intermittently occurs. Don't know why this works... it just does. #define MUR (compare & 0x01) // top-right #define MDR (compare & 0x02) // bottom-right #define MDL (compare & 0x04) // bottom-left #define MUL (compare & 0x08) // top-left #define IC(p0) PackLUTValues(p0, p0, p0, 1, 0, 0) #define I11(p0,p1) PackLUTValues(p0, p1, p0, 1, 1, 0) #define I211(p0,p1,p2) PackLUTValues(p0, p1, p2, 2, 1, 1) #define I31(p0,p1) PackLUTValues(p0, p1, p0, 3, 1, 0) #define I332(p0,p1,p2) PackLUTValues(p0, p1, p2, 3, 3, 2) #define I431(p0,p1,p2) PackLUTValues(p0, p1, p2, 4, 3, 1) #define I521(p0,p1,p2) PackLUTValues(p0, p1, p2, 5, 2, 1) #define I53(p0,p1) PackLUTValues(p0, p1, p0, 5, 3, 0) #define I611(p0,p1,p2) PackLUTValues(p0, p1, p2, 6, 1, 1) #define I71(p0,p1) PackLUTValues(p0, p1, p0, 7, 1, 0) #define I772(p0,p1,p2) PackLUTValues(p0, p1, p2, 7, 7, 2) #define I97(p0,p1) PackLUTValues(p0, p1, p0, 9, 7, 0) #define I1411(p0,p1,p2) PackLUTValues(p0, p1, p2, 14, 1, 1) #define I151(p0,p1) PackLUTValues(p0, p1, p0, 15, 1, 0) #define P0 _LQ2xLUT[pattern+(256*0)+(1024*compare)] #define P1 _LQ2xLUT[pattern+(256*1)+(1024*compare)] #define P2 _LQ2xLUT[pattern+(256*2)+(1024*compare)] #define P3 _LQ2xLUT[pattern+(256*3)+(1024*compare)] for (size_t compare = 0; compare < 16; compare++) { for (size_t pattern = 0; pattern < 256; pattern++) { switch (pattern) { #include "../filter/lq2x.h" } } } #undef P0 #undef P1 #undef P2 #undef P3 #define P0 _HQ2xLUT[pattern+(256*0)+(1024*compare)] #define P1 _HQ2xLUT[pattern+(256*1)+(1024*compare)] #define P2 _HQ2xLUT[pattern+(256*2)+(1024*compare)] #define P3 _HQ2xLUT[pattern+(256*3)+(1024*compare)] for (size_t compare = 0; compare < 16; compare++) { for (size_t pattern = 0; pattern < 256; pattern++) { switch (pattern) { #include "../filter/hq2x.h" } } } #undef P0 #undef P1 #undef P2 #undef P3 #define P(a, b) _HQ4xLUT[pattern+(256*((b*4)+a))+(4096*compare)] #define I1(p0) PackLUTValues(p0, p0, p0, 1, 0, 0) #define I2(i0, i1, p0, p1) PackLUTValues(p0, p1, p0, i0, i1, 0) #define I3(i0, i1, i2, p0, p1, p2) PackLUTValues(p0, p1, p2, i0, i1, i2) for (size_t compare = 0; compare < 16; compare++) { for (size_t pattern = 0; pattern < 256; pattern++) { switch (pattern) { #include "../filter/hq4x.dat" } } } #undef P #undef I1 #undef I2 #undef I3 #undef MUR #undef MDR #undef MDL #undef MUL #undef IC #undef I11 #undef I211 #undef I31 #undef I332 #undef I431 #undef I521 #undef I53 #undef I611 #undef I71 #undef I772 #undef I97 #undef I1411 #undef I151 lutValuesInited = true; } #pragma mark - OGLInfo::OGLInfo() { GetGLVersionOGL(&_versionMajor, &_versionMinor, &_versionRevision); _shaderSupport = ShaderSupport_Unsupported; _useShader150 = false; _isVBOSupported = false; _isPBOSupported = false; _isFBOSupported = false; } ShaderSupportTier OGLInfo::GetShaderSupport() { return this->_shaderSupport; } bool OGLInfo::IsUsingShader150() { return this->_useShader150; } bool OGLInfo::IsVBOSupported() { return this->_isVBOSupported; } bool OGLInfo::IsPBOSupported() { return this->_isPBOSupported; } bool OGLInfo::IsShaderSupported() { return (this->_shaderSupport != ShaderSupport_Unsupported); } bool OGLInfo::IsFBOSupported() { return this->_isFBOSupported; } OGLInfo_Legacy::OGLInfo_Legacy() { _shaderSupport = ShaderSupport_Unsupported; _useShader150 = false; // Check the OpenGL capabilities for this renderer std::set oglExtensionSet; this->GetExtensionSetOGL(&oglExtensionSet); _isVBOSupported = this->IsExtensionPresent(oglExtensionSet, "GL_ARB_vertex_buffer_object"); bool isShaderSupported = this->IsExtensionPresent(oglExtensionSet, "GL_ARB_shader_objects") && this->IsExtensionPresent(oglExtensionSet, "GL_ARB_vertex_shader") && this->IsExtensionPresent(oglExtensionSet, "GL_ARB_fragment_shader") && this->IsExtensionPresent(oglExtensionSet, "GL_ARB_vertex_program"); if (isShaderSupported) { if ( _versionMajor < 3 || (_versionMajor == 3 && _versionMinor < 2) ) { if (_versionMajor < 2) { _shaderSupport = ShaderSupport_Unsupported; } else { GLint maxVaryingFloats = 0; glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &maxVaryingFloats); if (_versionMajor == 2 && _versionMinor == 0) { if (maxVaryingFloats < 32) { _shaderSupport = ShaderSupport_BottomTier; } else { _shaderSupport = ShaderSupport_LowTier; } } else { if (maxVaryingFloats < 32) { _shaderSupport = ShaderSupport_BottomTier; } else if (maxVaryingFloats < 60) { _shaderSupport = ShaderSupport_LowTier; } else if (maxVaryingFloats < 84) { _shaderSupport = ShaderSupport_MidTier; } else if (maxVaryingFloats < 108) { _shaderSupport = ShaderSupport_HighTier; } else if (maxVaryingFloats >= 108) { _shaderSupport = ShaderSupport_TopTier; } } } } else { _useShader150 = true; _shaderSupport = ShaderSupport_MidTier; if (_versionMajor == 4) { if (_versionMinor <= 1) { _shaderSupport = ShaderSupport_HighTier; } else { _shaderSupport = ShaderSupport_TopTier; } } } } _isPBOSupported = this->IsExtensionPresent(oglExtensionSet, "GL_ARB_vertex_buffer_object") && (this->IsExtensionPresent(oglExtensionSet, "GL_ARB_pixel_buffer_object") || this->IsExtensionPresent(oglExtensionSet, "GL_EXT_pixel_buffer_object")); _isFBOSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_framebuffer_object"); } void OGLInfo_Legacy::GetExtensionSetOGL(std::set *oglExtensionSet) { std::string oglExtensionString = std::string((const char *)glGetString(GL_EXTENSIONS)); size_t extStringStartLoc = 0; size_t delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc); while (delimiterLoc != std::string::npos) { std::string extensionName = oglExtensionString.substr(extStringStartLoc, delimiterLoc - extStringStartLoc); oglExtensionSet->insert(extensionName); extStringStartLoc = delimiterLoc + 1; delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc); } if (extStringStartLoc - oglExtensionString.length() > 0) { std::string extensionName = oglExtensionString.substr(extStringStartLoc, oglExtensionString.length() - extStringStartLoc); oglExtensionSet->insert(extensionName); } } bool OGLInfo_Legacy::IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const { if (oglExtensionSet.size() == 0) { return false; } return (oglExtensionSet.find(extensionName) != oglExtensionSet.end()); } #pragma mark - OGLShaderProgram::OGLShaderProgram() { _vertexID = 0; _fragmentID = 0; _programID = glCreateProgram(); if (_programID == 0) { printf("OpenGL Error - Failed to create shader program.\n"); } } OGLShaderProgram::~OGLShaderProgram() { glDetachShader(this->_programID, this->_vertexID); glDetachShader(this->_programID, this->_fragmentID); glDeleteProgram(this->_programID); glDeleteShader(this->_vertexID); glDeleteShader(this->_fragmentID); } GLuint OGLShaderProgram::LoadShaderOGL(GLenum shaderType, const char *shaderProgram, bool useShader150) { GLint shaderStatus = GL_TRUE; GLuint shaderID = glCreateShader(shaderType); if (shaderID == 0) { printf("OpenGL Error - Failed to create %s.\n", (shaderType == GL_VERTEX_SHADER) ? "GL_VERTEX_SHADER" : ((shaderType == GL_FRAGMENT_SHADER) ? "GL_FRAGMENT_SHADER" : "OTHER SHADER TYPE")); return shaderID; } std::string shaderSupportStr; // Convert _shaderSupport to std::string. switch (_shaderSupport) { case ShaderSupport_BottomTier: shaderSupportStr = "SHADERSUPPORT_BOTTOM_TIER"; break; case ShaderSupport_LowTier: shaderSupportStr = "SHADERSUPPORT_LOW_TIER"; break; case ShaderSupport_MidTier: shaderSupportStr = "SHADERSUPPORT_MID_TIER"; break; case ShaderSupport_HighTier: shaderSupportStr = "SHADERSUPPORT_HIGH_TIER"; break; case ShaderSupport_TopTier: shaderSupportStr = "SHADERSUPPORT_TOP_TIER"; break; case ShaderSupport_FutureTier: shaderSupportStr = "SHADERSUPPORT_FUTURE_TIER"; break; default: shaderSupportStr = "SHADERSUPPORT_UNSUPPORTED"; break; } std::string programSource; if (useShader150) { programSource += "#version 150\n"; if (shaderType == GL_VERTEX_SHADER) { programSource += "#define ATTRIBUTE in\n"; programSource += "#define VARYING out\n"; } else if (shaderType == GL_FRAGMENT_SHADER) { programSource += "#define VARYING in\n"; programSource += "#define SAMPLE3_TEX_RECT(t,c) texture(t,c).rgb\n"; programSource += "#define SAMPLE3_TEX_1D(t,c) texture(t,c).rgb\n"; programSource += "#define SAMPLE3_TEX_2D(t,c) texture(t,c).rgb\n"; programSource += "#define SAMPLE3_TEX_3D(t,c) texture(t,c).rgb\n"; programSource += "#define SAMPLE4_TEX_1D(t,c) texture(t,c)\n"; programSource += "#define SAMPLE4_TEX_2D(t,c) texture(t,c)\n"; programSource += "#define SAMPLE4_TEX_3D(t,c) texture(t,c)\n"; programSource += "#define OUT_FRAG_COLOR outFragColor\n\n\n"; programSource += "out vec4 outFragColor;\n\n"; } } else { programSource += "#version 110\n"; if (shaderType == GL_VERTEX_SHADER) { programSource += "#define ATTRIBUTE attribute\n"; programSource += "#define VARYING varying\n\n"; } else if (shaderType == GL_FRAGMENT_SHADER) { programSource += "#extension GL_ARB_texture_rectangle : require\n"; programSource += "#define VARYING varying\n"; programSource += "#define SAMPLE3_TEX_RECT(t,c) texture2DRect(t,c).rgb\n"; programSource += "#define SAMPLE3_TEX_1D(t,c) texture1D(t,c).rgb\n"; programSource += "#define SAMPLE3_TEX_2D(t,c) texture2D(t,c).rgb\n"; programSource += "#define SAMPLE3_TEX_3D(t,c) texture3D(t,c).rgb\n"; programSource += "#define SAMPLE4_TEX_1D(t,c) texture1D(t,c)\n"; programSource += "#define SAMPLE4_TEX_2D(t,c) texture2D(t,c)\n"; programSource += "#define SAMPLE4_TEX_3D(t,c) texture3D(t,c)\n"; programSource += "#define OUT_FRAG_COLOR gl_FragColor\n\n"; } } programSource += "#define SHADERSUPPORT_UNSUPPORTED 0\n"; programSource += "#define SHADERSUPPORT_BOTTOM_TIER 1\n"; programSource += "#define SHADERSUPPORT_LOW_TIER 2\n"; programSource += "#define SHADERSUPPORT_MID_TIER 3\n"; programSource += "#define SHADERSUPPORT_HIGH_TIER 4\n"; programSource += "#define SHADERSUPPORT_TOP_TIER 5\n"; programSource += "#define SHADERSUPPORT_FUTURE_TIER 6\n"; programSource += "#define GPU_TIER " + shaderSupportStr + "\n\n"; programSource += shaderProgram; const char *programSourceChar = programSource.c_str(); glShaderSource(shaderID, 1, (const GLchar **)&programSourceChar, NULL); glCompileShader(shaderID); glGetShaderiv(shaderID, GL_COMPILE_STATUS, &shaderStatus); if (shaderStatus == GL_FALSE) { static const size_t logBytes = 16384; // 16KB should be more than enough GLchar *logBuf = (GLchar *)calloc(logBytes, sizeof(GLchar)); GLsizei logSize = 0; glGetShaderInfoLog(shaderID, logBytes * sizeof(GLchar), &logSize, logBuf); printf("OpenGL Error - Failed to compile %s.\n%s\n", (shaderType == GL_VERTEX_SHADER) ? "GL_VERTEX_SHADER" : ((shaderType == GL_FRAGMENT_SHADER) ? "GL_FRAGMENT_SHADER" : "OTHER SHADER TYPE"), (char *)logBuf); glDeleteShader(shaderID); return shaderID; } return shaderID; } ShaderSupportTier OGLShaderProgram::GetShaderSupport() { return this->_shaderSupport; } void OGLShaderProgram::SetShaderSupport(const ShaderSupportTier theTier) { this->_shaderSupport = theTier; } GLuint OGLShaderProgram::GetVertexShaderID() { return this->_vertexID; } void OGLShaderProgram::SetVertexShaderOGL(const char *shaderProgram, bool useShader150) { if (this->_vertexID != 0) { glDetachShader(this->_programID, this->_vertexID); glDeleteShader(this->_vertexID); } this->_vertexID = this->LoadShaderOGL(GL_VERTEX_SHADER, shaderProgram, useShader150); if (this->_vertexID != 0) { glAttachShader(this->_programID, this->_vertexID); glBindAttribLocation(this->_programID, OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(this->_programID, OGLVertexAttributeID_TexCoord0, "inTexCoord0"); } if (this->_vertexID != 0 && this->_fragmentID != 0) { this->LinkOGL(); } } GLuint OGLShaderProgram::GetFragmentShaderID() { return this->_fragmentID; } void OGLShaderProgram::SetFragmentShaderOGL(const char *shaderProgram, bool useShader150) { if (this->_fragmentID != 0) { glDetachShader(this->_programID, this->_fragmentID); glDeleteShader(this->_fragmentID); } this->_fragmentID = this->LoadShaderOGL(GL_FRAGMENT_SHADER, shaderProgram, useShader150); if (this->_fragmentID != 0) { glAttachShader(this->_programID, this->_fragmentID); if (useShader150) { glBindFragDataLocationEXT(this->_programID, 0, "outFragColor"); } } if (this->_vertexID != 0 && this->_fragmentID != 0) { this->LinkOGL(); } } void OGLShaderProgram::SetVertexAndFragmentShaderOGL(const char *vertShaderProgram, const char *fragShaderProgram, bool useShader150) { if (this->_vertexID != 0) { glDetachShader(this->_programID, this->_vertexID); glDeleteShader(this->_vertexID); } if (this->_fragmentID != 0) { glDetachShader(this->_programID, this->_fragmentID); glDeleteShader(this->_fragmentID); } this->_vertexID = this->LoadShaderOGL(GL_VERTEX_SHADER, vertShaderProgram, useShader150); this->_fragmentID = this->LoadShaderOGL(GL_FRAGMENT_SHADER, fragShaderProgram, useShader150); if (this->_vertexID != 0) { glAttachShader(this->_programID, this->_vertexID); glBindAttribLocation(this->_programID, OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(this->_programID, OGLVertexAttributeID_TexCoord0, "inTexCoord0"); } if (this->_fragmentID != 0) { glAttachShader(this->_programID, this->_fragmentID); if (useShader150) { glBindFragDataLocationEXT(this->_programID, 0, "outFragColor"); } } if (this->_vertexID != 0 && this->_fragmentID != 0) { this->LinkOGL(); } } GLuint OGLShaderProgram::GetProgramID() { return this->_programID; } bool OGLShaderProgram::LinkOGL() { bool result = false; GLint shaderStatus = GL_FALSE; glLinkProgram(this->_programID); glGetProgramiv(this->_programID, GL_LINK_STATUS, &shaderStatus); if (shaderStatus == GL_FALSE) { printf("OpenGL Error - Failed to link shader program.\n"); return result; } glValidateProgram(this->_programID); result = true; return result; } #pragma mark - OGLVideoOutput::OGLVideoOutput() { _info = OGLInfoCreate_Func(); _layerList = new std::vector; _layerList->reserve(8); // Render State Setup (common to both shaders and fixed-function pipeline) glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_STENCIL_TEST); // Set up fixed-function pipeline render states. if (!this->_info->IsShaderSupported()) { glDisable(GL_ALPHA_TEST); glDisable(GL_LIGHTING); glDisable(GL_FOG); glEnable(GL_TEXTURE_RECTANGLE_ARB); } // Set up clear attributes glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } OGLVideoOutput::~OGLVideoOutput() { for (size_t i = 0; i < _layerList->size(); i++) { delete (*_layerList)[i]; } delete _layerList; delete _info; } void OGLVideoOutput::InitLayers() { for (size_t i = 0; i < _layerList->size(); i++) { delete (*_layerList)[i]; } this->_layerList->clear(); this->_layerList->push_back(new OGLDisplayLayer(this)); } OGLInfo* OGLVideoOutput::GetInfo() { return this->_info; } GLsizei OGLVideoOutput::GetViewportWidth() { return this->_viewportWidth; } GLsizei OGLVideoOutput::GetViewportHeight() { return this->_viewportHeight; } OGLDisplayLayer* OGLVideoOutput::GetDisplayLayer() { return (OGLDisplayLayer *)this->_layerList->at(0); } void OGLVideoOutput::SetViewportSizeOGL(GLsizei w, GLsizei h) { this->_viewportWidth = w; this->_viewportHeight = h; glViewport(0, 0, w, h); for (size_t i = 0; i < _layerList->size(); i++) { (*_layerList)[i]->SetViewportSizeOGL(w, h); } } void OGLVideoOutput::ProcessOGL() { for (size_t i = 0; i < _layerList->size(); i++) { (*_layerList)[i]->ProcessOGL(); } } void OGLVideoOutput::RenderOGL() { for (size_t i = 0; i < _layerList->size(); i++) { (*_layerList)[i]->RenderOGL(); } } #pragma mark - OGLFilter::OGLFilter() { OGLFilterInit(1, 1, 1); } OGLFilter::OGLFilter(GLsizei srcWidth, GLsizei srcHeight, GLfloat scale = 1) { OGLFilterInit(srcWidth, srcHeight, scale); } OGLFilter::~OGLFilter() { if (_isVAOPresent) { glDeleteVertexArraysDESMUME(1, &this->_vaoID); _isVAOPresent = false; } glDeleteFramebuffersEXT(1, &this->_fboID); glDeleteTextures(1, &this->_texDstID); glDeleteBuffers(1, &this->_vboVtxID); glDeleteBuffers(1, &this->_vboTexCoordID); glDeleteBuffers(1, &this->_vboElementID); } void OGLFilter::GetSupport(int vfTypeID, bool *outSupportCPU, bool *outSupportShader) { const char *cpuTypeIDString = VideoFilter::GetTypeStringByID((VideoFilterTypeID)vfTypeID); *outSupportCPU = (strstr(cpuTypeIDString, VIDEOFILTERTYPE_UNKNOWN_STRING) == NULL); *outSupportShader = (vfTypeID == VideoFilterTypeID_Nearest1_5X) || (vfTypeID == VideoFilterTypeID_Nearest2X) || (vfTypeID == VideoFilterTypeID_Scanline) || (vfTypeID == VideoFilterTypeID_EPX) || (vfTypeID == VideoFilterTypeID_EPXPlus) || (vfTypeID == VideoFilterTypeID_2xSaI) || (vfTypeID == VideoFilterTypeID_Super2xSaI) || (vfTypeID == VideoFilterTypeID_SuperEagle); } void OGLFilter::OGLFilterInit(GLsizei srcWidth, GLsizei srcHeight, GLfloat scale) { _program = new OGLShaderProgram; _scale = scale; _srcWidth = srcWidth; _srcHeight = srcHeight; _dstWidth = _srcWidth * _scale; _dstHeight = _srcHeight * _scale; _texCoordBuffer[0] = 0; _texCoordBuffer[1] = 0; _texCoordBuffer[2] = _srcWidth; _texCoordBuffer[3] = 0; _texCoordBuffer[4] = _srcWidth; _texCoordBuffer[5] = _srcHeight; _texCoordBuffer[6] = 0; _texCoordBuffer[7] = _srcHeight; glGenTextures(1, &_texDstID); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texDstID); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, _dstWidth, _dstHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); glGenFramebuffersEXT(1, &_fboID); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _fboID); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, _texDstID, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glGenBuffers(1, &_vboVtxID); glGenBuffers(1, &_vboTexCoordID); glGenBuffers(1, &_vboElementID); glBindBuffer(GL_ARRAY_BUFFER, _vboVtxID); glBufferData(GL_ARRAY_BUFFER, sizeof(filterVtxBuffer), filterVtxBuffer, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, _vboTexCoordID); glBufferData(GL_ARRAY_BUFFER, sizeof(_texCoordBuffer), _texCoordBuffer, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboElementID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(filterElementBuffer), filterElementBuffer, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glGenVertexArraysDESMUME(1, &_vaoID); glBindVertexArrayDESMUME(_vaoID); glBindBuffer(GL_ARRAY_BUFFER, _vboVtxID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, _vboTexCoordID); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_INT, GL_FALSE, 0, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboElementID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glBindVertexArrayDESMUME(0); _isVAOPresent = true; } OGLShaderProgram* OGLFilter::GetProgram() { return this->_program; } GLuint OGLFilter::GetDstTexID() { return this->_texDstID; } GLsizei OGLFilter::GetSrcWidth() { return this->_srcWidth; } GLsizei OGLFilter::GetSrcHeight() { return this->_srcHeight; } GLsizei OGLFilter::GetDstWidth() { return this->_dstWidth; } GLsizei OGLFilter::GetDstHeight() { return this->_dstHeight; } void OGLFilter::SetSrcSizeOGL(GLsizei w, GLsizei h) { this->_srcWidth = w; this->_srcHeight = h; this->_dstWidth = this->_srcWidth * this->_scale; this->_dstHeight = this->_srcHeight * this->_scale; this->_texCoordBuffer[2] = w; this->_texCoordBuffer[4] = w; this->_texCoordBuffer[5] = h; this->_texCoordBuffer[7] = h; glBindBuffer(GL_ARRAY_BUFFER, this->_vboTexCoordID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(this->_texCoordBuffer) , this->_texCoordBuffer); glBindBuffer(GL_ARRAY_BUFFER, 0); uint32_t *tempDstBuffer = (uint32_t *)calloc(this->_dstWidth * this->_dstHeight, sizeof(uint32_t)); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texDstID); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, this->_dstWidth, this->_dstHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, tempDstBuffer); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); free(tempDstBuffer); } GLfloat OGLFilter::GetScale() { return this->_scale; } void OGLFilter::SetScaleOGL(GLfloat scale) { this->_scale = scale; this->_dstWidth = this->_srcWidth * this->_scale; this->_dstHeight = this->_srcHeight * this->_scale; uint32_t *tempDstBuffer = (uint32_t *)calloc(this->_dstWidth * this->_dstHeight, sizeof(uint32_t)); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texDstID); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, this->_dstWidth, this->_dstHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, tempDstBuffer); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); free(tempDstBuffer); } GLuint OGLFilter::RunFilterOGL(GLuint srcTexID) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->_fboID); glBindVertexArrayDESMUME(this->_vaoID); glUseProgram(this->_program->GetProgramID()); glViewport(0, 0, this->_dstWidth, this->_dstHeight); glClear(GL_COLOR_BUFFER_BIT); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, srcTexID); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0); glBindVertexArrayDESMUME(0); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); return this->GetDstTexID(); } void OGLFilter::DownloadDstBufferOGL(uint32_t *dstBuffer, size_t lineOffset, size_t readLineCount) { if (dstBuffer == NULL) { return; } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->_fboID); glReadPixels(0, lineOffset, this->_dstWidth, readLineCount, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, dstBuffer); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } #pragma mark - OGLFilterDeposterize::OGLFilterDeposterize(GLsizei srcWidth, GLsizei srcHeight, ShaderSupportTier theTier, bool useShader150) { SetSrcSizeOGL(srcWidth, srcHeight); glGenTextures(1, &_texIntermediateID); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texIntermediateID); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, _dstWidth, _dstHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); _program->SetShaderSupport(theTier); _program->SetVertexShaderOGL(Sample3x3_VertShader_110, useShader150); _program->SetFragmentShaderOGL(FilterDeposterizeFragShader_110, useShader150); } OGLFilterDeposterize::~OGLFilterDeposterize() { glDeleteTextures(1, &this->_texIntermediateID); } GLuint OGLFilterDeposterize::RunFilterOGL(GLuint srcTexID) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->_fboID); glBindVertexArrayDESMUME(this->_vaoID); glUseProgram(this->_program->GetProgramID()); glViewport(0, 0, this->_dstWidth, this->_dstHeight); glClear(GL_COLOR_BUFFER_BIT); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, this->_texIntermediateID, 0); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, srcTexID); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, this->_texDstID, 0); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texIntermediateID); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0); glBindVertexArrayDESMUME(0); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); return this->GetDstTexID(); } #pragma mark - OGLImage::OGLImage(OGLInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GLsizei viewportWidth, GLsizei viewportHeight) { _needUploadVertices = true; _useDeposterize = false; _vtxElementPointer = 0; _normalWidth = imageWidth; _normalHeight = imageHeight; _viewportWidth = viewportWidth; _viewportHeight = viewportHeight; _vf = new VideoFilter(_normalWidth, _normalHeight, VideoFilterTypeID_None, 0); _vfMasterDstBuffer = (uint32_t *)calloc(_vf->GetDstWidth() * _vf->GetDstHeight(), sizeof(uint32_t)); _vf->SetDstBufferPtr(_vfMasterDstBuffer); _displayTexFilter = GL_NEAREST; glViewport(0, 0, _viewportWidth, _viewportHeight); UpdateVertices(); UpdateTexCoords(_vf->GetDstWidth(), _vf->GetDstHeight()); // Set up textures glGenTextures(1, &_texCPUFilterDstID); glGenTextures(1, &_texVideoInputDataID); _texVideoSourceID = _texVideoInputDataID; _texVideoPixelScalerID = _texVideoInputDataID; _texVideoOutputID = _texVideoInputDataID; glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texCPUFilterDstID); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, _vf->GetDstWidth() * _vf->GetDstHeight() * sizeof(uint32_t), _vfMasterDstBuffer); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texVideoInputDataID); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, _vf->GetSrcWidth(), _vf->GetSrcHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, _vf->GetSrcBufferPtr()); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); // Set up VBOs glGenBuffersARB(1, &_vboVertexID); glGenBuffersARB(1, &_vboTexCoordID); glGenBuffersARB(1, &_vboElementID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(_vtxBuffer), _vtxBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(_texCoordBuffer), _texCoordBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _vboElementID); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLubyte) * 6, outputElementBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Set up VAO glGenVertexArraysDESMUME(1, &_vaoMainStatesID); glBindVertexArrayDESMUME(_vaoMainStatesID); if (oglInfo->IsShaderSupported()) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _vboElementID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); } else { glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID); glVertexPointer(2, GL_INT, 0, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID); glTexCoordPointer(2, GL_FLOAT, 0, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _vboElementID); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } glBindVertexArrayDESMUME(0); _isVAOPresent = true; _pixelScaler = VideoFilterTypeID_None; _useShader150 = oglInfo->IsUsingShader150(); _shaderSupport = oglInfo->GetShaderSupport(); _canUseShaderOutput = oglInfo->IsShaderSupported(); if (_canUseShaderOutput) { _finalOutputProgram = new OGLShaderProgram; _finalOutputProgram->SetShaderSupport(_shaderSupport); _finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); const GLuint finalOutputProgramID = _finalOutputProgram->GetProgramID(); glUseProgram(finalOutputProgramID); _uniformFinalOutputAngleDegrees = glGetUniformLocation(finalOutputProgramID, "angleDegrees"); _uniformFinalOutputScalar = glGetUniformLocation(finalOutputProgramID, "scalar"); _uniformFinalOutputViewSize = glGetUniformLocation(finalOutputProgramID, "viewSize"); glUseProgram(0); } else { _finalOutputProgram = NULL; } _canUseShaderBasedFilters = (oglInfo->IsShaderSupported() && oglInfo->IsFBOSupported()); if (_canUseShaderBasedFilters) { _filterDeposterize = new OGLFilterDeposterize(_vf->GetSrcWidth(), _vf->GetSrcHeight(), _shaderSupport, _useShader150); _shaderFilter = new OGLFilter(_vf->GetSrcWidth(), _vf->GetSrcHeight(), 1); OGLShaderProgram *shaderFilterProgram = _shaderFilter->GetProgram(); shaderFilterProgram->SetShaderSupport(_shaderSupport); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, PassthroughFragShader_110, _useShader150); UploadHQnxLUTs(); } else { _filterDeposterize = NULL; _shaderFilter = NULL; } _useShaderBasedPixelScaler = false; _filtersPreferGPU = true; _outputFilter = OutputFilterTypeID_Bilinear; } OGLImage::~OGLImage() { if (_isVAOPresent) { glDeleteVertexArraysDESMUME(1, &this->_vaoMainStatesID); _isVAOPresent = false; } glDeleteBuffersARB(1, &this->_vboVertexID); glDeleteBuffersARB(1, &this->_vboTexCoordID); glDeleteBuffersARB(1, &this->_vboElementID); glDeleteTextures(1, &this->_texCPUFilterDstID); glDeleteTextures(1, &this->_texVideoInputDataID); glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, 0); glDeleteTextures(1, &this->_texLQ2xLUT); glDeleteTextures(1, &this->_texHQ2xLUT); glDeleteTextures(1, &this->_texHQ4xLUT); glActiveTexture(GL_TEXTURE0); if (_canUseShaderOutput) { glUseProgram(0); delete this->_finalOutputProgram; } if (_canUseShaderBasedFilters) { delete this->_filterDeposterize; delete this->_shaderFilter; } delete this->_vf; free(_vfMasterDstBuffer); } void OGLImage::UploadHQnxLUTs() { InitHQnxLUTs(); glGenTextures(1, &_texLQ2xLUT); glGenTextures(1, &_texHQ2xLUT); glGenTextures(1, &_texHQ4xLUT); glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, _texLQ2xLUT); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 256*2, 4, 16, 0, GL_BGR, GL_UNSIGNED_BYTE, _LQ2xLUT); glBindTexture(GL_TEXTURE_3D, _texHQ2xLUT); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 256*2, 4, 16, 0, GL_BGR, GL_UNSIGNED_BYTE, _HQ2xLUT); glBindTexture(GL_TEXTURE_3D, _texHQ4xLUT); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 256*2, 16, 16, 0, GL_BGR, GL_UNSIGNED_BYTE, _HQ4xLUT); glBindTexture(GL_TEXTURE_3D, 0); glActiveTexture(GL_TEXTURE0); } bool OGLImage::GetFiltersPreferGPU() { return this->_filtersPreferGPU; } void OGLImage::SetFiltersPreferGPUOGL(bool preferGPU) { this->_filtersPreferGPU = preferGPU; this->_useShaderBasedPixelScaler = (preferGPU) ? this->SetGPUPixelScalerOGL(this->_pixelScaler) : false; } bool OGLImage::GetSourceDeposterize() { return this->_useDeposterize; } void OGLImage::SetSourceDeposterize(bool useDeposterize) { this->_useDeposterize = (this->_canUseShaderBasedFilters) ? useDeposterize : false; } void OGLImage::UpdateVertices() { const GLint w = this->_normalWidth; const GLint h = this->_normalHeight; _vtxBuffer[0] = -w/2; _vtxBuffer[1] = h/2; _vtxBuffer[2] = w/2; _vtxBuffer[3] = h/2; _vtxBuffer[4] = w/2; _vtxBuffer[5] = -h/2; _vtxBuffer[6] = -w/2; _vtxBuffer[7] = -h/2; this->_needUploadVertices = true; } void OGLImage::UpdateTexCoords(GLfloat s, GLfloat t) { _texCoordBuffer[0] = 0.0f; _texCoordBuffer[1] = 0.0f; _texCoordBuffer[2] = s; _texCoordBuffer[3] = 0.0f; _texCoordBuffer[4] = s; _texCoordBuffer[5] = t; _texCoordBuffer[6] = 0.0f; _texCoordBuffer[7] = t; } bool OGLImage::CanUseShaderBasedFilters() { return this->_canUseShaderBasedFilters; } void OGLImage::GetNormalSize(double *w, double *h) { if (w == NULL || h == NULL) { return; } *w = this->_normalWidth; *h = this->_normalHeight; } void OGLImage::UploadVerticesOGL() { glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(this->_vtxBuffer), this->_vtxBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); this->_needUploadVertices = false; } void OGLImage::UploadTexCoordsOGL() { glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(this->_texCoordBuffer), this->_texCoordBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); } void OGLImage::UploadTransformationOGL() { const double w = this->_viewportWidth; const double h = this->_viewportHeight; const GLdouble s = GetMaxScalarInBounds(this->_normalWidth, this->_normalHeight, w, h); if (this->_canUseShaderOutput) { glUniform2f(this->_uniformFinalOutputViewSize, w, h); glUniform1f(this->_uniformFinalOutputAngleDegrees, 0.0f); glUniform1f(this->_uniformFinalOutputScalar, s); } else { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-w/2.0, -w/2.0 + w, -h/2.0, -h/2.0 + h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(0.0f, 0.0f, 0.0f, 1.0f); glScalef(s, s, 1.0f); } glViewport(0, 0, this->_viewportWidth, this->_viewportHeight); } int OGLImage::GetOutputFilter() { return this->_outputFilter; } void OGLImage::SetOutputFilterOGL(const int filterID) { this->_displayTexFilter = GL_NEAREST; if (this->_canUseShaderBasedFilters) { this->_outputFilter = filterID; switch (filterID) { case OutputFilterTypeID_NearestNeighbor: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); break; case OutputFilterTypeID_Bilinear: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); this->_displayTexFilter = GL_LINEAR; break; case OutputFilterTypeID_BicubicBSpline: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterBicubicBSplineFragShader_110, _useShader150); break; case OutputFilterTypeID_BicubicMitchell: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterBicubicMitchellNetravaliFragShader_110, _useShader150); break; case OutputFilterTypeID_Lanczos2: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterLanczos2FragShader_110, _useShader150); break; case OutputFilterTypeID_Lanczos3: { if (this->_shaderSupport >= ShaderSupport_HighTier) { this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample6x6Output_VertShader_110, FilterLanczos3FragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_MidTier) { this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample5x5Output_VertShader_110, FilterLanczos3FragShader_110, _useShader150); } else { this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterLanczos3FragShader_110, _useShader150); } break; } default: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); this->_outputFilter = OutputFilterTypeID_NearestNeighbor; break; } } else { if (filterID == OutputFilterTypeID_Bilinear) { this->_displayTexFilter = GL_LINEAR; this->_outputFilter = filterID; } else { this->_outputFilter = OutputFilterTypeID_NearestNeighbor; } } } int OGLImage::GetPixelScaler() { return (int)this->_pixelScaler; } void OGLImage::SetPixelScalerOGL(const int filterID) { std::string cpuTypeIDString = std::string( VideoFilter::GetTypeStringByID((VideoFilterTypeID)filterID) ); const VideoFilterTypeID newFilterID = (cpuTypeIDString != std::string(VIDEOFILTERTYPE_UNKNOWN_STRING)) ? (VideoFilterTypeID)filterID : VideoFilterTypeID_None; this->SetCPUPixelScalerOGL(newFilterID); this->_useShaderBasedPixelScaler = (this->GetFiltersPreferGPU()) ? this->SetGPUPixelScalerOGL(newFilterID) : false; this->_pixelScaler = newFilterID; } bool OGLImage::SetGPUPixelScalerOGL(const VideoFilterTypeID filterID) { bool willUseShaderBasedPixelScaler = true; if (!this->_canUseShaderBasedFilters || filterID == VideoFilterTypeID_None) { willUseShaderBasedPixelScaler = false; return willUseShaderBasedPixelScaler; } OGLShaderProgram *shaderFilterProgram = _shaderFilter->GetProgram(); VideoFilterAttributes vfAttr = VideoFilter::GetAttributesByID((VideoFilterTypeID)filterID); GLfloat vfScale = (GLfloat)vfAttr.scaleMultiply / (GLfloat)vfAttr.scaleDivide; switch (filterID) { case VideoFilterTypeID_Nearest1_5X: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, PassthroughFragShader_110, _useShader150); break; case VideoFilterTypeID_Nearest2X: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, PassthroughFragShader_110, _useShader150); break; case VideoFilterTypeID_Scanline: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, Scalar2xScanlineFragShader_110, _useShader150); break; case VideoFilterTypeID_EPX: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, Scalar2xEPXFragShader_110, _useShader150); break; case VideoFilterTypeID_EPXPlus: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, Scalar2xEPXPlusFragShader_110, _useShader150); break; case VideoFilterTypeID_2xSaI: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scalar2xSaIFragShader_110, _useShader150); break; case VideoFilterTypeID_Super2xSaI: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, ScalarSuper2xSaIFragShader_110, _useShader150); break; case VideoFilterTypeID_SuperEagle: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, ScalarSuperEagle2xFragShader_110, _useShader150); break; case VideoFilterTypeID_LQ2X: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texLQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerLQ2xFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_LQ2XS: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texLQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerLQ2xSFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ2X: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ2xFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ2XS: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ2xSFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ4X: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ4xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ4xFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ4XS: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ4xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ4xSFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_2xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler2xBRZFragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_LowTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scaler2xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } case VideoFilterTypeID_3xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler3xBRZFragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_LowTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scaler3xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } case VideoFilterTypeID_4xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler4xBRZFragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_LowTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scaler4xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } case VideoFilterTypeID_5xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler5xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } default: willUseShaderBasedPixelScaler = false; break; } if (willUseShaderBasedPixelScaler) { _shaderFilter->SetScaleOGL(vfScale); } return willUseShaderBasedPixelScaler; } void OGLImage::SetCPUPixelScalerOGL(const VideoFilterTypeID filterID) { bool needResizeTexture = false; const VideoFilterAttributes newFilterAttr = VideoFilter::GetAttributesByID(filterID); const GLsizei oldDstBufferWidth = this->_vf->GetDstWidth(); const GLsizei oldDstBufferHeight = this->_vf->GetDstHeight(); const GLsizei newDstBufferWidth = this->_vf->GetSrcWidth() * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide; const GLsizei newDstBufferHeight = this->_vf->GetSrcHeight() * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide; if (oldDstBufferWidth != newDstBufferWidth || oldDstBufferHeight != newDstBufferHeight) { needResizeTexture = true; } if (needResizeTexture) { uint32_t *oldMasterBuffer = _vfMasterDstBuffer; uint32_t *newMasterBuffer = (uint32_t *)calloc(newDstBufferWidth * newDstBufferHeight, sizeof(uint32_t)); this->_vf->SetDstBufferPtr(newMasterBuffer); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texCPUFilterDstID); glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, newDstBufferWidth * newDstBufferHeight * sizeof(uint32_t), newMasterBuffer); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, newDstBufferWidth, newDstBufferHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, newMasterBuffer); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); _vfMasterDstBuffer = newMasterBuffer; free(oldMasterBuffer); } this->_vf->ChangeFilterByID(filterID); } void OGLImage::LoadFrameOGL(const uint32_t *frameData, GLint x, GLint y, GLsizei w, GLsizei h) { glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoInputDataID); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, x, y, w, h, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, frameData); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); memcpy(this->_vf->GetSrcBufferPtr(), frameData, w * h * sizeof(uint32_t)); } void OGLImage::ProcessOGL() { VideoFilter *currentFilter = this->_vf; const bool isUsingCPUPixelScaler = this->_pixelScaler != VideoFilterTypeID_None && !this->_useShaderBasedPixelScaler; // Source if (this->_useDeposterize) { this->_texVideoSourceID = this->_filterDeposterize->RunFilterOGL(this->_texVideoInputDataID); if (isUsingCPUPixelScaler) // Hybrid CPU/GPU-based path (may cause a performance hit on pixel download) { this->_filterDeposterize->DownloadDstBufferOGL(currentFilter->GetSrcBufferPtr(), 0, this->_normalHeight); } } else { this->_texVideoSourceID = this->_texVideoInputDataID; } // Pixel scaler if (!isUsingCPUPixelScaler) { if (this->_useShaderBasedPixelScaler) { this->_texVideoPixelScalerID = this->_shaderFilter->RunFilterOGL(this->_texVideoSourceID); this->UpdateTexCoords(this->_shaderFilter->GetDstWidth(), this->_shaderFilter->GetDstHeight()); } else { this->_texVideoPixelScalerID = this->_texVideoSourceID; this->UpdateTexCoords(this->_normalWidth, this->_normalHeight); } } else { uint32_t *texData = currentFilter->RunFilter(); const GLfloat w = currentFilter->GetDstWidth(); const GLfloat h = currentFilter->GetDstHeight(); this->_texVideoPixelScalerID = this->_texCPUFilterDstID; glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoPixelScalerID); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, w, h, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, texData); this->UpdateTexCoords(w, h); } // Output this->_texVideoOutputID = this->_texVideoPixelScalerID; this->UploadTexCoordsOGL(); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); } void OGLImage::RenderOGL() { glUseProgram(this->_finalOutputProgram->GetProgramID()); this->UploadTransformationOGL(); if (this->_needUploadVertices) { this->UploadVerticesOGL(); } // Enable vertex attributes glBindVertexArrayDESMUME(this->_vaoMainStatesID); glClear(GL_COLOR_BUFFER_BIT); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, this->_vtxElementPointer); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); // Disable vertex attributes glBindVertexArrayDESMUME(0); } #pragma mark - OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO) { _output = oglVO; _needUploadVertices = true; _useDeposterize = false; _displayMode = DS_DISPLAY_TYPE_DUAL; _displayOrder = DS_DISPLAY_ORDER_MAIN_FIRST; _displayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL; _gapScalar = 0.0f; _rotation = 0.0f; _normalWidth = GPU_DISPLAY_WIDTH; _normalHeight = GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*_gapScalar); _vf[0] = new VideoFilter(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT, VideoFilterTypeID_None, 0); _vf[1] = new VideoFilter(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT, VideoFilterTypeID_None, 0); _vfDual = new VideoFilter(_vf[0]->GetSrcWidth(), _vf[0]->GetSrcHeight() + _vf[1]->GetSrcHeight(), VideoFilterTypeID_None, 2); _vfMasterDstBuffer = (uint32_t *)calloc(_vfDual->GetDstWidth() * _vfDual->GetDstHeight(), sizeof(uint32_t)); _vf[0]->SetDstBufferPtr(_vfMasterDstBuffer); _vf[1]->SetDstBufferPtr(_vfMasterDstBuffer + (_vf[0]->GetDstWidth() * _vf[0]->GetDstHeight())); _vfDual->SetDstBufferPtr(_vfMasterDstBuffer); _displayTexFilter[0] = GL_NEAREST; _displayTexFilter[1] = GL_NEAREST; _vtxBufferOffset = 0; UpdateVertices(); UpdateTexCoords(_vf[0]->GetDstWidth(), _vf[0]->GetDstHeight()); // Set up textures glGenTextures(2, _texCPUFilterDstID); glGenTextures(2, _texVideoInputDataID); _texVideoSourceID[0] = _texVideoInputDataID[0]; _texVideoSourceID[1] = _texVideoInputDataID[1]; _texVideoPixelScalerID[0] = _texVideoInputDataID[0]; _texVideoPixelScalerID[1] = _texVideoInputDataID[1]; _texVideoOutputID[0] = _texVideoInputDataID[0]; _texVideoOutputID[1] = _texVideoInputDataID[1]; glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texCPUFilterDstID[0]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, _vf[0]->GetDstWidth() * _vf[0]->GetDstHeight() * sizeof(uint32_t), _vfMasterDstBuffer); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texCPUFilterDstID[1]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, _vf[1]->GetDstWidth() * _vf[1]->GetDstHeight() * sizeof(uint32_t), _vfMasterDstBuffer + (_vf[0]->GetDstWidth() * _vf[0]->GetDstHeight())); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texVideoInputDataID[0]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, _vf[0]->GetSrcWidth(), _vf[0]->GetSrcHeight(), 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, _vf[0]->GetSrcBufferPtr()); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texVideoInputDataID[1]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, _vf[1]->GetSrcWidth(), _vf[1]->GetSrcHeight(), 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, _vf[1]->GetSrcBufferPtr()); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); // Set up VBOs glGenBuffersARB(1, &this->_vboVertexID); glGenBuffersARB(1, &this->_vboTexCoordID); glGenBuffersARB(1, &this->_vboElementID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLint) * (2 * 8), this->vtxBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * (2 * 8), this->texCoordBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, this->_vboElementID); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLubyte) * 12, outputElementBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Set up VAO glGenVertexArraysDESMUME(1, &this->_vaoMainStatesID); glBindVertexArrayDESMUME(this->_vaoMainStatesID); if (this->_output->GetInfo()->IsShaderSupported()) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, this->_vboElementID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); } else { glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID); glVertexPointer(2, GL_INT, 0, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID); glTexCoordPointer(2, GL_FLOAT, 0, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, this->_vboElementID); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } glBindVertexArrayDESMUME(0); _isVAOPresent = true; _pixelScaler = VideoFilterTypeID_None; _useShader150 = this->_output->GetInfo()->IsUsingShader150(); _shaderSupport = this->_output->GetInfo()->GetShaderSupport(); _canUseShaderOutput = this->_output->GetInfo()->IsShaderSupported(); if (_canUseShaderOutput) { _finalOutputProgram = new OGLShaderProgram; _finalOutputProgram->SetShaderSupport(_shaderSupport); _finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); const GLuint finalOutputProgramID = _finalOutputProgram->GetProgramID(); glUseProgram(finalOutputProgramID); _uniformFinalOutputAngleDegrees = glGetUniformLocation(finalOutputProgramID, "angleDegrees"); _uniformFinalOutputScalar = glGetUniformLocation(finalOutputProgramID, "scalar"); _uniformFinalOutputViewSize = glGetUniformLocation(finalOutputProgramID, "viewSize"); glUseProgram(0); } else { _finalOutputProgram = NULL; } _canUseShaderBasedFilters = (_canUseShaderOutput && _output->GetInfo()->IsFBOSupported()); if (_canUseShaderBasedFilters) { for (size_t i = 0; i < 2; i++) { _filterDeposterize[i] = new OGLFilterDeposterize(_vf[i]->GetSrcWidth(), _vf[i]->GetSrcHeight(), _shaderSupport, _useShader150); _shaderFilter[i] = new OGLFilter(_vf[i]->GetSrcWidth(), _vf[i]->GetSrcHeight(), 1); OGLShaderProgram *shaderFilterProgram = _shaderFilter[i]->GetProgram(); shaderFilterProgram->SetShaderSupport(_shaderSupport); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, PassthroughFragShader_110, _useShader150); } UploadHQnxLUTs(); } else { _filterDeposterize[0] = NULL; _filterDeposterize[1] = NULL; _shaderFilter[0] = NULL; _shaderFilter[1] = NULL; } _useShaderBasedPixelScaler = false; _filtersPreferGPU = true; _outputFilter = OutputFilterTypeID_Bilinear; } OGLDisplayLayer::~OGLDisplayLayer() { if (_isVAOPresent) { glDeleteVertexArraysDESMUME(1, &this->_vaoMainStatesID); _isVAOPresent = false; } glDeleteBuffersARB(1, &this->_vboVertexID); glDeleteBuffersARB(1, &this->_vboTexCoordID); glDeleteBuffersARB(1, &this->_vboElementID); glDeleteTextures(2, this->_texCPUFilterDstID); glDeleteTextures(2, this->_texVideoInputDataID); glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, 0); glDeleteTextures(1, &this->_texLQ2xLUT); glDeleteTextures(1, &this->_texHQ2xLUT); glDeleteTextures(1, &this->_texHQ4xLUT); glActiveTexture(GL_TEXTURE0); if (_canUseShaderOutput) { glUseProgram(0); delete this->_finalOutputProgram; } if (_canUseShaderBasedFilters) { delete this->_filterDeposterize[0]; delete this->_filterDeposterize[1]; delete this->_shaderFilter[0]; delete this->_shaderFilter[1]; } delete this->_vf[0]; delete this->_vf[1]; delete this->_vfDual; free(_vfMasterDstBuffer); } void OGLDisplayLayer::UploadHQnxLUTs() { InitHQnxLUTs(); glGenTextures(1, &_texLQ2xLUT); glGenTextures(1, &_texHQ2xLUT); glGenTextures(1, &_texHQ4xLUT); glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, _texLQ2xLUT); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 256*2, 4, 16, 0, GL_BGR, GL_UNSIGNED_BYTE, _LQ2xLUT); glBindTexture(GL_TEXTURE_3D, _texHQ2xLUT); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 256*2, 4, 16, 0, GL_BGR, GL_UNSIGNED_BYTE, _HQ2xLUT); glBindTexture(GL_TEXTURE_3D, _texHQ4xLUT); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 256*2, 16, 16, 0, GL_BGR, GL_UNSIGNED_BYTE, _HQ4xLUT); glBindTexture(GL_TEXTURE_3D, 0); glActiveTexture(GL_TEXTURE0); } bool OGLDisplayLayer::GetFiltersPreferGPU() { return this->_filtersPreferGPU; } void OGLDisplayLayer::SetFiltersPreferGPUOGL(bool preferGPU) { this->_filtersPreferGPU = preferGPU; this->_useShaderBasedPixelScaler = (preferGPU) ? this->SetGPUPixelScalerOGL(this->_pixelScaler) : false; } int OGLDisplayLayer::GetMode() { return this->_displayMode; } void OGLDisplayLayer::SetMode(int dispMode) { this->_displayMode = dispMode; this->GetNormalSize(&this->_normalWidth, &this->_normalHeight); this->UpdateVertices(); } int OGLDisplayLayer::GetOrientation() { return this->_displayOrientation; } void OGLDisplayLayer::SetOrientation(int dispOrientation) { this->_displayOrientation = dispOrientation; this->GetNormalSize(&this->_normalWidth, &this->_normalHeight); this->UpdateVertices(); } GLfloat OGLDisplayLayer::GetGapScalar() { return this->_gapScalar; } void OGLDisplayLayer::SetGapScalar(GLfloat theScalar) { this->_gapScalar = theScalar; this->GetNormalSize(&this->_normalWidth, &this->_normalHeight); this->UpdateVertices(); } GLfloat OGLDisplayLayer::GetRotation() { return this->_rotation; } void OGLDisplayLayer::SetRotation(GLfloat theRotation) { this->_rotation = theRotation; } bool OGLDisplayLayer::GetSourceDeposterize() { return this->_useDeposterize; } void OGLDisplayLayer::SetSourceDeposterize(bool useDeposterize) { this->_useDeposterize = (this->_canUseShaderBasedFilters) ? useDeposterize : false; } int OGLDisplayLayer::GetOrder() { return this->_displayOrder; } void OGLDisplayLayer::SetOrder(int dispOrder) { this->_displayOrder = dispOrder; if (this->_displayOrder == DS_DISPLAY_ORDER_MAIN_FIRST) { this->_vtxBufferOffset = 0; } else // dispOrder == DS_DISPLAY_ORDER_TOUCH_FIRST { this->_vtxBufferOffset = (2 * 8); } this->_needUploadVertices = true; } void OGLDisplayLayer::UpdateVertices() { const GLfloat w = GPU_DISPLAY_WIDTH; const GLfloat h = GPU_DISPLAY_HEIGHT; const GLfloat gap = DS_DISPLAY_GAP * this->_gapScalar / 2.0; if (this->_displayMode == DS_DISPLAY_TYPE_DUAL) { // displayOrder == DS_DISPLAY_ORDER_MAIN_FIRST if (this->_displayOrientation == DS_DISPLAY_ORIENTATION_VERTICAL) { vtxBuffer[0] = -w/2; vtxBuffer[1] = h+gap; // Top display, top left vtxBuffer[2] = w/2; vtxBuffer[3] = h+gap; // Top display, top right vtxBuffer[4] = w/2; vtxBuffer[5] = gap; // Top display, bottom right vtxBuffer[6] = -w/2; vtxBuffer[7] = gap; // Top display, bottom left vtxBuffer[8] = -w/2; vtxBuffer[9] = -gap; // Bottom display, top left vtxBuffer[10] = w/2; vtxBuffer[11] = -gap; // Bottom display, top right vtxBuffer[12] = w/2; vtxBuffer[13] = -(h+gap); // Bottom display, bottom right vtxBuffer[14] = -w/2; vtxBuffer[15] = -(h+gap); // Bottom display, bottom left } else // displayOrientationID == DS_DISPLAY_ORIENTATION_HORIZONTAL { vtxBuffer[0] = -(w+gap); vtxBuffer[1] = h/2; // Left display, top left vtxBuffer[2] = -gap; vtxBuffer[3] = h/2; // Left display, top right vtxBuffer[4] = -gap; vtxBuffer[5] = -h/2; // Left display, bottom right vtxBuffer[6] = -(w+gap); vtxBuffer[7] = -h/2; // Left display, bottom left vtxBuffer[8] = gap; vtxBuffer[9] = h/2; // Right display, top left vtxBuffer[10] = w+gap; vtxBuffer[11] = h/2; // Right display, top right vtxBuffer[12] = w+gap; vtxBuffer[13] = -h/2; // Right display, bottom right vtxBuffer[14] = gap; vtxBuffer[15] = -h/2; // Right display, bottom left } // displayOrder == DS_DISPLAY_ORDER_TOUCH_FIRST memcpy(vtxBuffer + (2 * 8), vtxBuffer + (1 * 8), sizeof(GLint) * (1 * 8)); memcpy(vtxBuffer + (3 * 8), vtxBuffer + (0 * 8), sizeof(GLint) * (1 * 8)); } else // displayModeID == DS_DISPLAY_TYPE_MAIN || displayModeID == DS_DISPLAY_TYPE_TOUCH { vtxBuffer[0] = -w/2; vtxBuffer[1] = h/2; // First display, top left vtxBuffer[2] = w/2; vtxBuffer[3] = h/2; // First display, top right vtxBuffer[4] = w/2; vtxBuffer[5] = -h/2; // First display, bottom right vtxBuffer[6] = -w/2; vtxBuffer[7] = -h/2; // First display, bottom left memcpy(vtxBuffer + (1 * 8), vtxBuffer + (0 * 8), sizeof(GLint) * (1 * 8)); // Second display memcpy(vtxBuffer + (2 * 8), vtxBuffer + (0 * 8), sizeof(GLint) * (2 * 8)); // Second display } this->_needUploadVertices = true; } void OGLDisplayLayer::UpdateTexCoords(GLfloat s, GLfloat t) { texCoordBuffer[0] = 0.0f; texCoordBuffer[1] = 0.0f; texCoordBuffer[2] = s; texCoordBuffer[3] = 0.0f; texCoordBuffer[4] = s; texCoordBuffer[5] = t; texCoordBuffer[6] = 0.0f; texCoordBuffer[7] = t; memcpy(texCoordBuffer + (1 * 8), texCoordBuffer + (0 * 8), sizeof(GLint) * (1 * 8)); } bool OGLDisplayLayer::CanUseShaderBasedFilters() { return this->_canUseShaderBasedFilters; } void OGLDisplayLayer::GetNormalSize(double *w, double *h) { if (w == NULL || h == NULL) { return; } if (this->_displayMode != DS_DISPLAY_TYPE_DUAL) { *w = GPU_DISPLAY_WIDTH; *h = GPU_DISPLAY_HEIGHT; return; } if (this->_displayOrientation == DS_DISPLAY_ORIENTATION_VERTICAL) { *w = GPU_DISPLAY_WIDTH; *h = GPU_DISPLAY_HEIGHT * 2.0 + (DS_DISPLAY_GAP * this->_gapScalar); } else { *w = GPU_DISPLAY_WIDTH * 2.0 + (DS_DISPLAY_GAP * this->_gapScalar); *h = GPU_DISPLAY_HEIGHT; } } void OGLDisplayLayer::UploadVerticesOGL() { glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), this->vtxBuffer + this->_vtxBufferOffset); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); this->_needUploadVertices = false; } void OGLDisplayLayer::UploadTexCoordsOGL() { glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLfloat) * (2 * 8), this->texCoordBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); } void OGLDisplayLayer::UploadTransformationOGL() { const double w = this->_viewportWidth; const double h = this->_viewportHeight; const CGSize checkSize = GetTransformedBounds(this->_normalWidth, this->_normalHeight, 1.0, this->_rotation); const GLdouble s = GetMaxScalarInBounds(checkSize.width, checkSize.height, w, h); if (this->_output->GetInfo()->IsShaderSupported()) { glUniform2f(this->_uniformFinalOutputViewSize, w, h); glUniform1f(this->_uniformFinalOutputAngleDegrees, this->_rotation); glUniform1f(this->_uniformFinalOutputScalar, s); } else { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-w/2.0, -w/2.0 + w, -h/2.0, -h/2.0 + h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(CLOCKWISE_DEGREES(this->_rotation), 0.0f, 0.0f, 1.0f); glScalef(s, s, 1.0f); } glViewport(0, 0, this->_viewportWidth, this->_viewportHeight); } int OGLDisplayLayer::GetOutputFilter() { return this->_outputFilter; } void OGLDisplayLayer::SetOutputFilterOGL(const int filterID) { this->_displayTexFilter[0] = GL_NEAREST; this->_displayTexFilter[1] = GL_NEAREST; if (this->_canUseShaderBasedFilters) { this->_outputFilter = filterID; switch (filterID) { case OutputFilterTypeID_NearestNeighbor: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); break; case OutputFilterTypeID_Bilinear: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); this->_displayTexFilter[0] = GL_LINEAR; this->_displayTexFilter[1] = GL_LINEAR; break; case OutputFilterTypeID_BicubicBSpline: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterBicubicBSplineFragShader_110, _useShader150); break; case OutputFilterTypeID_BicubicMitchell: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterBicubicMitchellNetravaliFragShader_110, _useShader150); break; case OutputFilterTypeID_Lanczos2: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterLanczos2FragShader_110, _useShader150); break; case OutputFilterTypeID_Lanczos3: { if (this->_shaderSupport >= ShaderSupport_HighTier) { this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample6x6Output_VertShader_110, FilterLanczos3FragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_MidTier) { this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample5x5Output_VertShader_110, FilterLanczos3FragShader_110, _useShader150); } else { this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(BicubicSample4x4Output_VertShader_110, FilterLanczos3FragShader_110, _useShader150); } break; } default: this->_finalOutputProgram->SetVertexAndFragmentShaderOGL(Sample1x1OutputVertShader_100, PassthroughOutputFragShader_110, _useShader150); this->_outputFilter = OutputFilterTypeID_NearestNeighbor; break; } } else { if (filterID == OutputFilterTypeID_Bilinear) { this->_displayTexFilter[0] = GL_LINEAR; this->_displayTexFilter[1] = GL_LINEAR; this->_outputFilter = filterID; } else { this->_outputFilter = OutputFilterTypeID_NearestNeighbor; } } } int OGLDisplayLayer::GetPixelScaler() { return (int)this->_pixelScaler; } void OGLDisplayLayer::SetPixelScalerOGL(const int filterID) { std::string cpuTypeIDString = std::string( VideoFilter::GetTypeStringByID((VideoFilterTypeID)filterID) ); const VideoFilterTypeID newFilterID = (cpuTypeIDString != std::string(VIDEOFILTERTYPE_UNKNOWN_STRING)) ? (VideoFilterTypeID)filterID : VideoFilterTypeID_None; this->SetCPUPixelScalerOGL(newFilterID); this->_useShaderBasedPixelScaler = (this->GetFiltersPreferGPU()) ? this->SetGPUPixelScalerOGL(newFilterID) : false; this->_pixelScaler = newFilterID; } bool OGLDisplayLayer::SetGPUPixelScalerOGL(const VideoFilterTypeID filterID) { bool willUseShaderBasedPixelScaler = true; if (!this->_canUseShaderBasedFilters || filterID == VideoFilterTypeID_None) { willUseShaderBasedPixelScaler = false; return willUseShaderBasedPixelScaler; } for (size_t i = 0; i < 2; i++) { OGLShaderProgram *shaderFilterProgram = _shaderFilter[i]->GetProgram(); VideoFilterAttributes vfAttr = VideoFilter::GetAttributesByID((VideoFilterTypeID)filterID); GLfloat vfScale = (GLfloat)vfAttr.scaleMultiply / (GLfloat)vfAttr.scaleDivide; switch (filterID) { case VideoFilterTypeID_Nearest1_5X: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, PassthroughFragShader_110, _useShader150); break; case VideoFilterTypeID_Nearest2X: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, PassthroughFragShader_110, _useShader150); break; case VideoFilterTypeID_Scanline: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample1x1_VertShader_110, Scalar2xScanlineFragShader_110, _useShader150); break; case VideoFilterTypeID_EPX: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, Scalar2xEPXFragShader_110, _useShader150); break; case VideoFilterTypeID_EPXPlus: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, Scalar2xEPXPlusFragShader_110, _useShader150); break; case VideoFilterTypeID_2xSaI: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scalar2xSaIFragShader_110, _useShader150); break; case VideoFilterTypeID_Super2xSaI: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, ScalarSuper2xSaIFragShader_110, _useShader150); break; case VideoFilterTypeID_SuperEagle: shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, ScalarSuperEagle2xFragShader_110, _useShader150); break; case VideoFilterTypeID_LQ2X: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texLQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerLQ2xFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_LQ2XS: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texLQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerLQ2xSFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ2X: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ2xFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ2XS: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ2xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ2xSFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ4X: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ4xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ4xFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_HQ4XS: { glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_3D, this->_texHQ4xLUT); glActiveTexture(GL_TEXTURE0); shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample3x3_VertShader_110, ScalerHQ4xSFragShader_110, _useShader150); glUseProgram(shaderFilterProgram->GetProgramID()); GLint uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "tex"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(shaderFilterProgram->GetProgramID(), "lut"); glUniform1i(uniformTexSampler, 1); glUseProgram(0); break; } case VideoFilterTypeID_2xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler2xBRZFragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_LowTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scaler2xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } case VideoFilterTypeID_3xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler3xBRZFragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_LowTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scaler3xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } case VideoFilterTypeID_4xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler4xBRZFragShader_110, _useShader150); } else if (this->_shaderSupport >= ShaderSupport_LowTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample4x4_VertShader_110, Scaler4xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } case VideoFilterTypeID_5xBRZ: { if (this->_shaderSupport >= ShaderSupport_MidTier) { shaderFilterProgram->SetVertexAndFragmentShaderOGL(Sample5x5_VertShader_110, Scaler5xBRZFragShader_110, _useShader150); } else { willUseShaderBasedPixelScaler = false; } break; } default: willUseShaderBasedPixelScaler = false; break; } if (willUseShaderBasedPixelScaler) { _shaderFilter[i]->SetScaleOGL(vfScale); } } return willUseShaderBasedPixelScaler; } void OGLDisplayLayer::SetCPUPixelScalerOGL(const VideoFilterTypeID filterID) { bool needResizeTexture = false; const VideoFilterAttributes newFilterAttr = VideoFilter::GetAttributesByID(filterID); const GLsizei oldDstBufferWidth = this->_vf[0]->GetDstWidth() + this->_vf[1]->GetDstWidth(); const GLsizei oldDstBufferHeight = this->_vf[0]->GetDstHeight() + this->_vf[1]->GetDstHeight(); const GLsizei newDstBufferWidth = (this->_vf[0]->GetSrcWidth() + this->_vf[1]->GetSrcWidth()) * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide; const GLsizei newDstBufferHeight = (this->_vf[0]->GetSrcHeight() + this->_vf[1]->GetSrcHeight()) * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide; if (oldDstBufferWidth != newDstBufferWidth || oldDstBufferHeight != newDstBufferHeight) { needResizeTexture = true; } if (needResizeTexture) { uint32_t *oldMasterBuffer = _vfMasterDstBuffer; uint32_t *newMasterBuffer = (uint32_t *)calloc(newDstBufferWidth * newDstBufferHeight, sizeof(uint32_t)); this->_vf[0]->SetDstBufferPtr(newMasterBuffer); this->_vf[1]->SetDstBufferPtr(newMasterBuffer + ((this->_vf[0]->GetSrcWidth() * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide) * (this->_vf[0]->GetSrcHeight() * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide)) ); this->_vfDual->SetDstBufferPtr(newMasterBuffer); const GLsizei newDstBufferSingleWidth = this->_vf[0]->GetSrcWidth() * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide; const GLsizei newDstBufferSingleHeight = this->_vf[0]->GetSrcHeight() * newFilterAttr.scaleMultiply / newFilterAttr.scaleDivide; glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texCPUFilterDstID[0]); glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, newDstBufferSingleWidth * newDstBufferSingleHeight * sizeof(uint32_t), newMasterBuffer); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, newDstBufferSingleWidth, newDstBufferSingleHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, newMasterBuffer); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texCPUFilterDstID[1]); glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, newDstBufferSingleWidth * newDstBufferSingleHeight * sizeof(uint32_t), newMasterBuffer + (newDstBufferSingleWidth * newDstBufferSingleHeight)); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, newDstBufferSingleWidth, newDstBufferSingleHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, newMasterBuffer + (newDstBufferSingleWidth * newDstBufferSingleHeight)); glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); _vfMasterDstBuffer = newMasterBuffer; free(oldMasterBuffer); } this->_vf[0]->ChangeFilterByID(filterID); this->_vf[1]->ChangeFilterByID(filterID); this->_vfDual->ChangeFilterByID(filterID); } void OGLDisplayLayer::LoadFrameOGL(const uint16_t *frameData, GLint x, GLint y, GLsizei w, GLsizei h) { const bool isUsingCPUPixelScaler = this->_pixelScaler != VideoFilterTypeID_None && !this->_useShaderBasedPixelScaler; bool loadDualScreen = (y == 0) && (h > GPU_DISPLAY_HEIGHT); bool loadSingleMainScreen = (y == 0); bool loadSingleTouchScreen = (y > 0); if (!isUsingCPUPixelScaler || this->_useDeposterize) { if (loadDualScreen) { glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoInputDataID[0]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, w, h/2, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frameData); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoInputDataID[1]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, w, h/2, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frameData + (w * (h/2))); } else if (loadSingleMainScreen) { glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoInputDataID[0]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frameData); } else if (loadSingleTouchScreen) { glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoInputDataID[1]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frameData); } glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); } else { RGB555ToBGRA8888Buffer(frameData, (loadDualScreen) ? this->_vfDual->GetSrcBufferPtr() : this->_vf[(loadSingleMainScreen) ? 0 : 1]->GetSrcBufferPtr(), w * h); } } void OGLDisplayLayer::ProcessOGL() { const bool isUsingCPUPixelScaler = this->_pixelScaler != VideoFilterTypeID_None && !this->_useShaderBasedPixelScaler; const int displayMode = this->GetMode(); // Source if (this->_useDeposterize) { this->_texVideoSourceID[0] = this->_filterDeposterize[0]->RunFilterOGL(this->_texVideoInputDataID[0]); this->_texVideoSourceID[1] = this->_filterDeposterize[1]->RunFilterOGL(this->_texVideoInputDataID[1]); if (isUsingCPUPixelScaler) // Hybrid CPU/GPU-based path (may cause a performance hit on pixel download) { switch (displayMode) { case DS_DISPLAY_TYPE_MAIN: this->_filterDeposterize[0]->DownloadDstBufferOGL(this->_vf[0]->GetSrcBufferPtr(), 0, this->_filterDeposterize[0]->GetSrcHeight()); break; case DS_DISPLAY_TYPE_TOUCH: this->_filterDeposterize[1]->DownloadDstBufferOGL(this->_vf[1]->GetSrcBufferPtr(), 0, this->_filterDeposterize[1]->GetSrcHeight()); break; case DS_DISPLAY_TYPE_DUAL: this->_filterDeposterize[0]->DownloadDstBufferOGL(this->_vfDual->GetSrcBufferPtr(), 0, this->_filterDeposterize[0]->GetSrcHeight()); this->_filterDeposterize[1]->DownloadDstBufferOGL(this->_vfDual->GetSrcBufferPtr() + (this->_vf[0]->GetSrcWidth() * this->_vf[0]->GetSrcHeight()), 0, this->_filterDeposterize[1]->GetSrcHeight()); break; default: break; } } } else { this->_texVideoSourceID[0] = this->_texVideoInputDataID[0]; this->_texVideoSourceID[1] = this->_texVideoInputDataID[1]; } // Pixel scaler if (!isUsingCPUPixelScaler) { if (this->_useShaderBasedPixelScaler) { this->_texVideoPixelScalerID[0] = this->_shaderFilter[0]->RunFilterOGL(this->_texVideoSourceID[0]); this->_texVideoPixelScalerID[1] = this->_shaderFilter[1]->RunFilterOGL(this->_texVideoSourceID[1]); this->UpdateTexCoords(this->_shaderFilter[0]->GetDstWidth(), this->_shaderFilter[0]->GetDstHeight()); } else { this->_texVideoPixelScalerID[0] = this->_texVideoSourceID[0]; this->_texVideoPixelScalerID[1] = this->_texVideoSourceID[1]; this->UpdateTexCoords(this->_vf[0]->GetSrcWidth(), this->_vf[0]->GetSrcHeight()); } } else { switch (displayMode) { case DS_DISPLAY_TYPE_MAIN: { uint32_t *texData = this->_vf[0]->RunFilter(); this->_texVideoPixelScalerID[0] = this->_texCPUFilterDstID[0]; glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoPixelScalerID[0]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, this->_vf[0]->GetDstWidth(), this->_vf[0]->GetDstHeight(), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, texData); break; } case DS_DISPLAY_TYPE_TOUCH: { uint32_t *texData = this->_vf[1]->RunFilter(); this->_texVideoPixelScalerID[1] = this->_texCPUFilterDstID[1]; glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoPixelScalerID[1]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, this->_vf[1]->GetDstWidth(), this->_vf[1]->GetDstHeight(), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, texData); break; } case DS_DISPLAY_TYPE_DUAL: { uint32_t *texData = this->_vfDual->RunFilter(); this->_texVideoPixelScalerID[0] = this->_texCPUFilterDstID[0]; this->_texVideoPixelScalerID[1] = this->_texCPUFilterDstID[1]; glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoPixelScalerID[0]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, this->_vf[0]->GetDstWidth(), this->_vf[0]->GetDstHeight(), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, texData); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoPixelScalerID[1]); glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, this->_vf[1]->GetDstWidth(), this->_vf[1]->GetDstHeight(), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, texData + (this->_vf[0]->GetDstWidth() * this->_vf[0]->GetDstHeight())); break; } default: break; } this->UpdateTexCoords(this->_vf[0]->GetDstWidth(), this->_vf[0]->GetDstHeight()); } // Output this->_texVideoOutputID[0] = this->_texVideoPixelScalerID[0]; this->_texVideoOutputID[1] = this->_texVideoPixelScalerID[1]; this->UploadTexCoordsOGL(); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); } void OGLDisplayLayer::RenderOGL() { glUseProgram(this->_finalOutputProgram->GetProgramID()); this->UploadTransformationOGL(); if (this->_needUploadVertices) { this->UploadVerticesOGL(); } // Enable vertex attributes glBindVertexArrayDESMUME(this->_vaoMainStatesID); glClear(GL_COLOR_BUFFER_BIT); switch (this->GetMode()) { case DS_DISPLAY_TYPE_MAIN: glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[0]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[0]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[0]); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0); break; case DS_DISPLAY_TYPE_TOUCH: glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[1]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[1]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[1]); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0); break; case DS_DISPLAY_TYPE_DUAL: glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[0]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[0]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[0]); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, this->_texVideoOutputID[1]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, this->_displayTexFilter[1]); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, this->_displayTexFilter[1]); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, (GLubyte *)(6 * sizeof(GLubyte))); break; default: break; } glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); // Disable vertex attributes glBindVertexArrayDESMUME(0); } desmume-0.9.11/src/cocoa/cocoa_output.h0000755000000000000000000001163512467662066016517 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #include #import "cocoa_util.h" @class NSImage; @class NSBitmapImageRep; typedef struct { double scale; double rotation; // Angle is in degrees double translationX; double translationY; double translationZ; } DisplayOutputTransformData; typedef struct { uint16_t *buffer; // Pointer to frame buffer size_t bufferSize; // Size (in bytes) of frame buffer int32_t displayModeID; // The selected display to read from uint16_t width; // Measured in pixels uint16_t height; // Measured in pixels } GPUFrame; @interface CocoaDSOutput : CocoaDSThread { BOOL isStateChanged; NSUInteger frameCount; NSMutableDictionary *property; pthread_mutex_t *mutexConsume; pthread_rwlock_t *rwlockProducer; } @property (assign) BOOL isStateChanged; @property (assign) NSUInteger frameCount; @property (readonly) NSMutableDictionary *property; @property (assign) pthread_rwlock_t *rwlockProducer; @property (readonly) pthread_mutex_t *mutexConsume; - (void) doCoreEmuFrame; - (void) handleEmuFrameProcessed; @end @interface CocoaDSSpeaker : CocoaDSOutput { NSUInteger bufferSize; OSSpinLock spinlockAudioOutputEngine; OSSpinLock spinlockVolume; OSSpinLock spinlockSpuAdvancedLogic; OSSpinLock spinlockSpuInterpolationMode; OSSpinLock spinlockSpuSyncMode; OSSpinLock spinlockSpuSyncMethod; } @property (assign) NSUInteger bufferSize; - (id) init; - (id) initWithVolume:(CGFloat)vol; - (void) dealloc; - (void) setVolume:(float)vol; - (float) volume; - (void) setAudioOutputEngine:(NSInteger)methodID; - (NSInteger) audioOutputEngine; - (void) setSpuAdvancedLogic:(BOOL)state; - (BOOL) spuAdvancedLogic; - (void) setSpuInterpolationMode:(NSInteger)modeID; - (NSInteger) spuInterpolationMode; - (void) setSpuSyncMode:(NSInteger)modeID; - (NSInteger) spuSyncMode; - (void) setSpuSyncMethod:(NSInteger)methodID; - (NSInteger) spuSyncMethod; - (BOOL) mute; - (void) setMute:(BOOL)mute; - (NSInteger) filter; - (void) setFilter:(NSInteger)filter; - (NSString *) audioOutputEngineString; - (NSString *) spuInterpolationModeString; - (NSString *) spuSyncMethodString; - (void) handleSetVolume:(NSData *)volumeData; - (void) handleSetAudioOutputEngine:(NSData *)methodIdData; - (void) handleSetSpuAdvancedLogic:(NSData *)stateData; - (void) handleSetSpuSyncMode:(NSData *)modeIdData; - (void) handleSetSpuSyncMethod:(NSData *)methodIdData; - (void) handleSetSpuInterpolationMode:(NSData *)modeIdData; @end @class CocoaVideoFilter; @protocol CocoaDSDisplayDelegate @required - (void) doDisplayModeChanged:(NSInteger)displayModeID; @end @protocol CocoaDSDisplayVideoDelegate @required - (void) doInitVideoOutput:(NSDictionary *)properties; - (void) doLoadVideoFrame:(const void *)videoFrameData displayMode:(const NSInteger)frameDisplayMode width:(const NSInteger)frameWidth height:(const NSInteger)frameHeight; - (void) doProcessVideoFrame; @optional - (void) doResizeView:(NSRect)rect; - (void) doTransformView:(const DisplayOutputTransformData *)transformData; - (void) doRedraw; - (void) doDisplayOrientationChanged:(NSInteger)displayOrientationID; - (void) doDisplayOrderChanged:(NSInteger)displayOrderID; - (void) doDisplayGapChanged:(float)displayGapScalar; @end @interface CocoaDSDisplay : CocoaDSOutput { id delegate; NSInteger displayMode; NSSize frameSize; GPUFrame _gpuFrame; OSSpinLock spinlockDisplayType; } @property (retain) id delegate; @property (assign) NSInteger displayMode; @property (readonly) NSSize frameSize; - (void) handleChangeDisplayMode:(NSData *)displayModeData; - (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData; - (void) handleCopyToPasteboard; - (NSImage *) image; - (NSBitmapImageRep *) bitmapImageRep; @end @interface CocoaDSDisplayVideo : CocoaDSDisplay { } - (void) handleResizeView:(NSData *)rectData; - (void) handleTransformView:(NSData *)transformData; - (void) handleRedrawView; - (void) handleReprocessAndRedraw; - (void) handleChangeDisplayOrientation:(NSData *)displayOrientationIdData; - (void) handleChangeDisplayOrder:(NSData *)displayOrderIdData; - (void) handleChangeDisplayGap:(NSData *)displayGapScalarData; @end desmume-0.9.11/src/cocoa/sndOSX.cpp0000755000000000000000000001122012467662066015512 0ustar rootroot/* Copyright (C) 2007 Jeff Bland Copyright (C) 2007-2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "sndOSX.h" #include "coreaudiosound.h" #include "cocoa_globals.h" // Global sound playback manager static CoreAudioOutput *coreAudioPlaybackManager = NULL; static pthread_mutex_t *mutexAudioSampleReadWrite = NULL; pthread_rwlock_t *rwlockAudioEmulateCore = NULL; // Sound interface to the SPU SoundInterface_struct SNDOSX = { SNDCORE_OSX, "OS X Core Audio Sound Interface", SNDOSXInit, SNDOSXDeInit, SNDOSXUpdateAudio, SNDOSXGetAudioSpace, SNDOSXMuteAudio, SNDOSXUnMuteAudio, SNDOSXSetVolume, SNDOSXClearBuffer, SNDOSXFetchSamples, SNDOSXPostProcessSamples }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDOSX, NULL }; int SNDOSXInit(int buffer_size) { CoreAudioOutput *oldcoreAudioPlaybackManager = coreAudioPlaybackManager; coreAudioPlaybackManager = new CoreAudioOutput(buffer_size * 4 / SPU_SAMPLE_SIZE, SPU_SAMPLE_SIZE); delete oldcoreAudioPlaybackManager; if (mutexAudioSampleReadWrite == NULL) { mutexAudioSampleReadWrite = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexAudioSampleReadWrite, NULL); } coreAudioPlaybackManager->start(); coreAudioPlaybackManager->pause(); return 0; } void SNDOSXDeInit() { delete coreAudioPlaybackManager; coreAudioPlaybackManager = NULL; if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_destroy(mutexAudioSampleReadWrite); free(mutexAudioSampleReadWrite); mutexAudioSampleReadWrite = NULL; } } int SNDOSXReset() { SNDOSXClearBuffer(); return 0; } void SNDOSXUpdateAudio(s16 *buffer, u32 num_samples) { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->writeToBuffer(buffer, num_samples); } u32 SNDOSXGetAudioSpace() { if (coreAudioPlaybackManager == NULL) { return 0; } return (u32)coreAudioPlaybackManager->getAvailableSamples(); } void SNDOSXMuteAudio() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->mute(); } void SNDOSXUnMuteAudio() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->unmute(); } void SNDOSXPauseAudio() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->pause(); } void SNDOSXUnpauseAudio() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->unpause(); } void SNDOSXSetVolume(int volume) { if (coreAudioPlaybackManager == NULL) { return; } float newVolumeScalar = (float)volume / 100.0f; if(volume > 100) { newVolumeScalar = 1.0f; } else if(volume < 0) { newVolumeScalar = 0.0f; } coreAudioPlaybackManager->setVolume(newVolumeScalar); } void SNDOSXClearBuffer() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->clearBuffer(); } void SNDOSXFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { if (mutexAudioSampleReadWrite == NULL) { return; } pthread_mutex_lock(mutexAudioSampleReadWrite); SPU_DefaultFetchSamples(sampleBuffer, sampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } size_t SNDOSXPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { size_t processedSampleCount = 0; switch (synchMode) { case ESynchMode_DualSynchAsynch: if (rwlockAudioEmulateCore != NULL) { pthread_rwlock_wrlock(rwlockAudioEmulateCore); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_rwlock_unlock(rwlockAudioEmulateCore); } break; case ESynchMode_Synchronous: if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_lock(mutexAudioSampleReadWrite); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } break; default: break; } return processedSampleCount; } desmume-0.9.11/src/cocoa/makeapp.sh0000755000000000000000000000241512467662066015610 0ustar rootroot#!/bin/bash #This script builds the application bundle so that DeSmuME can run when compiled from Code::Blocks # lipo build/codeblocks/DeSmuME.app/Contents/MacOS/DeSmuME_x86 DeSmuME.app/Contents/MacOS/DeSmuME_ppc -create -output DeSmuME.app/Contents/MacOS/DeSmuME rm -f build/codeblocks/DeSmuME.app/Contents/MacOS/DeSmuME_x86 rm -f build/codeblocks/DeSmuME.app/Contents/MacOS/DeSmuME_ppc # mkdir -p build/codeblocks/DeSmuME.app/Contents/Resources cp Info.plist build/codeblocks/DeSmuME.app/Contents/Info.plist cp PkgInfo build/codeblocks/DeSmuME.app/Contents/PkgInfo cp InfoPlist.strings build/codeblocks/DeSmuME.app/Contents/Resources/InfoPlist.strings cp DeSmuME.icns build/codeblocks/DeSmuME.app/Contents/Resources/DeSmuME.icns cp ../../COPYING build/codeblocks/DeSmuME.app/Contents/Resources/COPYING cp ../../README build/codeblocks/DeSmuME.app/Contents/Resources/README cp ../../README.MAC build/codeblocks/DeSmuME.app/Contents/Resources/README.MAC cp ../../AUTHORS build/codeblocks/DeSmuME.app/Contents/Resources/AUTHORS cp ../../README.TRANSLATION build/codeblocks/DeSmuME.app/Contents/Resources/README.TRANSLATION cp ../../ChangeLog build/codeblocks/DeSmuME.app/Contents/Resources/ChangeLog #Localizations cp -R translations/*.lproj build/codeblocks/DeSmuME.app/Contents/Resources/ desmume-0.9.11/src/cocoa/utilities.c0000755000000000000000000004203212467662066016014 0ustar rootroot/* Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "utilities.h" #include static const uint8_t bits5to8[] = { 0x00, 0x08, 0x10, 0x19, 0x21, 0x29, 0x31, 0x3A, 0x42, 0x4A, 0x52, 0x5A, 0x63, 0x6B, 0x73, 0x7B, 0x84, 0x8C, 0x94, 0x9C, 0xA5, 0xAD, 0xB5, 0xBD, 0xC5, 0xCE, 0xD6, 0xDE, 0xE6, 0xEF, 0xF7, 0xFF }; static CFStringRef OSXProductName = NULL; static CFStringRef OSXProductVersion = NULL; static CFStringRef OSXProductBuildVersion = NULL; static unsigned int OSXVersionMajor = 0; static unsigned int OSXVersionMinor = 0; static unsigned int OSXVersionRevision = 0; static bool isSystemVersionAlreadyRead = false; static void ReadSystemVersionPListFile() { // Read the SystemVersion.plist file. CFDataRef resourceData = NULL; CFURLRef systemPListURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/System/Library/CoreServices/SystemVersion.plist"), kCFURLPOSIXPathStyle, false); Boolean status = CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault, systemPListURL, &resourceData, NULL, NULL, NULL); if (!status) { CFRelease(systemPListURL); return; } CFDictionaryRef systemDict = (CFDictionaryRef)CFPropertyListCreateFromXMLData(kCFAllocatorDefault, resourceData, kCFPropertyListImmutable, NULL); if (systemDict == NULL) { CFRelease(resourceData); CFRelease(systemPListURL); return; } // Get the system version string. if (OSXProductVersion != NULL) { CFRelease(OSXProductVersion); } OSXProductVersion = (CFStringRef)CFDictionaryGetValue(systemDict, CFSTR("ProductVersion")); if (OSXProductVersion != NULL) { // Copy the system version. CFRetain(OSXProductVersion); char versionCString[256] = {0}; CFStringGetCString(OSXProductVersion, versionCString, 256, kCFStringEncodingUTF8); sscanf(versionCString, "%u.%u.%u", &OSXVersionMajor, &OSXVersionMinor, &OSXVersionRevision); } if (OSXProductName != NULL) { CFRelease(OSXProductName); } OSXProductName = (CFStringRef)CFDictionaryGetValue(systemDict, CFSTR("ProductName")); if (OSXProductName != NULL) { CFRetain(OSXProductName); } if (OSXProductBuildVersion != NULL) { CFRelease(OSXProductBuildVersion); } OSXProductBuildVersion = (CFStringRef)CFDictionaryGetValue(systemDict, CFSTR("ProductBuildVersion")); if (OSXProductBuildVersion != NULL) { CFRetain(OSXProductBuildVersion); } // Release all resources now that the system version string has been copied. CFRelease(resourceData); CFRelease(systemPListURL); CFRelease(systemDict); // Mark that we've already read the SystemVersion.plist file so that we don't // have to do this again. isSystemVersionAlreadyRead = true; } bool IsOSXVersionSupported(const unsigned int major, const unsigned int minor, const unsigned int revision) { bool result = false; if (!isSystemVersionAlreadyRead) { ReadSystemVersionPListFile(); } if (isSystemVersionAlreadyRead && ((OSXVersionMajor > major) || (OSXVersionMajor >= major && OSXVersionMinor > minor) || (OSXVersionMajor >= major && OSXVersionMinor >= minor && OSXVersionRevision >= revision)) ) { result = true; } return result; } /******************************************************************************************** RGB555ToRGBA8888() - INLINE Converts a color from 15-bit RGB555 format into 32-bit RGBA8888 format. Takes: color16 - The pixel in 15-bit RGB555 format. Returns: A 32-bit unsigned integer containing the RGBA8888 formatted color. Details: The input and output pixels are expected to have little-endian byte order. ********************************************************************************************/ inline uint32_t RGB555ToRGBA8888(const uint16_t color16) { return (bits5to8[((color16 >> 0) & 0x001F)] << 0) | (bits5to8[((color16 >> 5) & 0x001F)] << 8) | (bits5to8[((color16 >> 10) & 0x001F)] << 16) | 0xFF000000; } /******************************************************************************************** RGB555ToBGRA8888() - INLINE Converts a color from 15-bit RGB555 format into 32-bit BGRA8888 format. Takes: color16 - The pixel in 15-bit RGB555 format. Returns: A 32-bit unsigned integer containing the BGRA8888 formatted color. Details: The input and output pixels are expected to have little-endian byte order. ********************************************************************************************/ inline uint32_t RGB555ToBGRA8888(const uint16_t color16) { return (bits5to8[((color16 >> 10) & 0x001F)] << 0) | (bits5to8[((color16 >> 5) & 0x001F)] << 8) | (bits5to8[((color16 >> 0) & 0x001F)] << 16) | 0xFF000000; } /******************************************************************************************** RGBA8888ForceOpaque() - INLINE Forces the alpha channel of a 32-bit RGBA8888 color to a value of 0xFF. Takes: color32 - The pixel in 32-bit RGBA8888 format. Returns: A 32-bit unsigned integer containing the RGBA8888 formatted color. Details: The input and output pixels are expected to have little-endian byte order. ********************************************************************************************/ inline uint32_t RGBA8888ForceOpaque(const uint32_t color32) { return color32 | 0xFF000000; } /******************************************************************************************** RGB555ToRGBA8888Buffer() Copies a 15-bit RGB555 pixel buffer into a 32-bit RGBA8888 pixel buffer. Takes: srcBuffer - Pointer to the source 15-bit RGB555 pixel buffer. destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer. pixelCount - The number of pixels to copy. Returns: Nothing. Details: The source and destination pixels are expected to have little-endian byte order. Also, it is the caller's responsibility to ensure that the source and destination buffers are large enough to accomodate the requested number of pixels. ********************************************************************************************/ void RGB555ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount) { const uint32_t *__restrict__ destBufferEnd = destBuffer + pixelCount; while (destBuffer < destBufferEnd) { *destBuffer++ = RGB555ToRGBA8888(*srcBuffer++); } } /******************************************************************************************** RGB555ToBGRA8888Buffer() Copies a 15-bit RGB555 pixel buffer into a 32-bit BGRA8888 pixel buffer. Takes: srcBuffer - Pointer to the source 15-bit RGB555 pixel buffer. destBuffer - Pointer to the destination 32-bit BGRA8888 pixel buffer. pixelCount - The number of pixels to copy. Returns: Nothing. Details: The source and destination pixels are expected to have little-endian byte order. Also, it is the caller's responsibility to ensure that the source and destination buffers are large enough to accomodate the requested number of pixels. ********************************************************************************************/ void RGB555ToBGRA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount) { const uint32_t *__restrict__ destBufferEnd = destBuffer + pixelCount; while (destBuffer < destBufferEnd) { *destBuffer++ = RGB555ToBGRA8888(*srcBuffer++); } } /******************************************************************************************** RGBA8888ForceOpaqueBuffer() Copies a 32-bit RGBA8888 pixel buffer into another 32-bit RGBA8888 pixel buffer. The pixels in the destination buffer will have an alpha value of 0xFF. Takes: srcBuffer - Pointer to the source 32-bit RGBA8888 pixel buffer. destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer. pixelCount - The number of pixels to copy. Returns: Nothing. Details: The source and destination pixels are expected to have little-endian byte order. Also, it is the caller's responsibility to ensure that the source and destination buffers are large enough to accomodate the requested number of pixels. ********************************************************************************************/ void RGBA8888ForceOpaqueBuffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount) { const uint32_t *__restrict__ destBufferEnd = destBuffer + pixelCount; while (destBuffer < destBufferEnd) { *destBuffer++ = RGBA8888ForceOpaque(*srcBuffer++); } } /******************************************************************************************** GetTransformedBounds() Returns the bounds of a normalized 2D surface using affine transformations. Takes: normalBoundsWidth - The width of the normal 2D surface. normalBoundsHeight - The height of the normal 2D surface. scalar - The scalar used to transform the 2D surface. angleDegrees - The rotation angle, in degrees, to transform the 2D surface. Returns: The bounds of a normalized 2D surface using affine transformations. Details: The returned bounds is always a normal rectangle. Ignoring the scaling, the returned bounds will always be at its smallest when the angle is at 0, 90, 180, or 270 degrees, and largest when the angle is at 45, 135, 225, or 315 degrees. ********************************************************************************************/ CGSize GetTransformedBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double scalar, const double angleDegrees) { const double angleRadians = angleDegrees * (M_PI/180.0); // The points are as follows: // // (x[3], y[3]) (x[2], y[2]) // // // // (x[0], y[0]) (x[1], y[1]) // Do our scale and rotate transformations. #ifdef __ACCELERATE__ // Note that although we only need to calculate 3 points, we include 4 points // here because Accelerate prefers 16-byte alignment. double x[] = {0.0, normalBoundsWidth, normalBoundsWidth, 0.0}; double y[] = {0.0, 0.0, normalBoundsHeight, normalBoundsHeight}; cblas_drot(4, x, 1, y, 1, scalar * cos(angleRadians), scalar * sin(angleRadians)); #else // Keep a C-version of this transformation for reference purposes. const double w = scalar * normalBoundsWidth; const double h = scalar * normalBoundsHeight; const double d = hypot(w, h); const double dAngle = atan2(h, w); const double px = w * cos(angleRadians); const double py = w * sin(angleRadians); const double qx = d * cos(dAngle + angleRadians); const double qy = d * sin(dAngle + angleRadians); const double rx = h * cos((M_PI/2.0) + angleRadians); const double ry = h * sin((M_PI/2.0) + angleRadians); const double x[] = {0.0, px, qx, rx}; const double y[] = {0.0, py, qy, ry}; #endif // Determine the transformed width, which is dependent on the location of // the x-coordinate of point (x[2], y[2]). CGSize transformBounds = {0.0, 0.0}; if (x[2] > 0.0) { if (x[2] < x[3]) { transformBounds.width = x[3] - x[1]; } else if (x[2] < x[1]) { transformBounds.width = x[1] - x[3]; } else { transformBounds.width = x[2]; } } else if (x[2] < 0.0) { if (x[2] > x[3]) { transformBounds.width = -(x[3] - x[1]); } else if (x[2] > x[1]) { transformBounds.width = -(x[1] - x[3]); } else { transformBounds.width = -x[2]; } } else { transformBounds.width = abs(x[1] - x[3]); } // Determine the transformed height, which is dependent on the location of // the y-coordinate of point (x[2], y[2]). if (y[2] > 0.0) { if (y[2] < y[3]) { transformBounds.height = y[3] - y[1]; } else if (y[2] < y[1]) { transformBounds.height = y[1] - y[3]; } else { transformBounds.height = y[2]; } } else if (y[2] < 0.0) { if (y[2] > y[3]) { transformBounds.height = -(y[3] - y[1]); } else if (y[2] > y[1]) { transformBounds.height = -(y[1] - y[3]); } else { transformBounds.height = -y[2]; } } else { transformBounds.height = abs(y[3] - y[1]); } return transformBounds; } /******************************************************************************************** GetMaxScalarInBounds() Returns the maximum scalar that a rectangle can grow, while maintaining its aspect ratio, within a boundary. Takes: normalBoundsWidth - The width of the normal 2D surface. normalBoundsHeight - The height of the normal 2D surface. keepInBoundsWidth - The width of the keep-in 2D surface. keepInBoundsHeight - The height of the keep-in 2D surface. Returns: The maximum scalar that a rectangle can grow, while maintaining its aspect ratio, within a boundary. Details: If keepInBoundsWidth or keepInBoundsHeight are less than or equal to zero, the returned scalar will be zero. ********************************************************************************************/ double GetMaxScalarInBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double keepInBoundsWidth, const double keepInBoundsHeight) { const double maxX = (normalBoundsWidth <= 0.0) ? 0.0 : keepInBoundsWidth / normalBoundsWidth; const double maxY = (normalBoundsHeight <= 0.0) ? 0.0 : keepInBoundsHeight / normalBoundsHeight; return (maxX <= maxY) ? maxX : maxY; } /******************************************************************************************** GetNormalPointFromTransformedPoint() Returns a normalized point from a point from a 2D transformed surface. Takes: transformedPointX - The X coordinate of a 2D point as it exists on a 2D transformed surface. transformedPointY - The Y coordinate of a 2D point as it exists on a 2D transformed surface. normalBoundsWidth - The width of the normal 2D surface. normalBoundsHeight - The height of the normal 2D surface. transformBoundsWidth - The width of the transformed 2D surface. transformBoundsHeight - The height of the transformed 2D surface. scalar - The scalar used on the transformed 2D surface. angleDegrees - The rotation angle, in degrees, of the transformed 2D surface. Returns: A normalized point from a point from a 2D transformed surface. Details: It may help to call GetTransformedBounds() for the transformBounds parameter. ********************************************************************************************/ CGPoint GetNormalPointFromTransformedPoint(const double transformedPointX, const double transformedPointY, const double normalBoundsWidth, const double normalBoundsHeight, const double transformBoundsWidth, const double transformBoundsHeight, const double scalar, const double angleDegrees) { // Get the coordinates of the transformed point and translate the coordinate // system so that the origin becomes the center. const double transformedX = transformedPointX - (transformBoundsWidth / 2.0); const double transformedY = transformedPointY - (transformBoundsHeight / 2.0); // Perform rect-polar conversion. // Get the radius r with respect to the origin. const double r = hypot(transformedX, transformedY) / scalar; // Get the angle theta with respect to the origin. double theta = 0.0; if (transformedX == 0.0) { if (transformedY > 0.0) { theta = M_PI / 2.0; } else if (transformedY < 0.0) { theta = M_PI * 1.5; } } else if (transformedX < 0.0) { theta = M_PI - atan2(transformedY, -transformedX); } else if (transformedY < 0.0) { theta = atan2(transformedY, transformedX) + (M_PI * 2.0); } else { theta = atan2(transformedY, transformedX); } // Get the normalized angle and use it to rotate about the origin. // Then do polar-rect conversion and translate back to transformed coordinates // with a 0 degree rotation. const double angleRadians = angleDegrees * (M_PI/180.0); const double normalizedAngle = theta - angleRadians; const double normalizedX = (r * cos(normalizedAngle)) + (normalBoundsWidth / 2.0); const double normalizedY = (r * sin(normalizedAngle)) + (normalBoundsHeight / 2.0); return CGPointMake(normalizedX, normalizedY); } /******************************************************************************************** GetNearestPositivePOT() Returns the next highest power of two of a 32-bit integer value. Takes: value - A 32-bit integer value. Returns: A 32-bit integer with the next highest power of two compared to the input value. Details: If the input value is already a power of two, this function returns the same value. ********************************************************************************************/ uint32_t GetNearestPositivePOT(uint32_t value) { value--; value |= value >> 1; value |= value >> 2; value |= value >> 4; value |= value >> 8; value |= value >> 16; value++; return value; } desmume-0.9.11/src/cocoa/DeSmuME_Prefix.pch0000755000000000000000000000162312467662066017106 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifdef __OBJC__ #define OBJ_C #endif #define HOST_DARWIN #define DESMUME_COCOA #define HAVE_OPENGL #define HAVE_LIBZ #if defined(__i386__) || defined(__x86_64__) #define HAVE_JIT #endif #define PORT_VERSION "Cocoa"desmume-0.9.11/src/cocoa/OGLDisplayOutput_3_2.cpp0000755000000000000000000000430012467662066020170 0ustar rootroot/* Copyright (C) 2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "OGLDisplayOutput_3_2.h" enum OGLVertexAttributeID { OGLVertexAttributeID_Position = 0, OGLVertexAttributeID_TexCoord0 = 8 }; OGLInfo* OGLInfoCreate_3_2() { return new OGLInfo_3_2; } void glBindVertexArray_3_2(GLuint vaoID) { glBindVertexArray(vaoID); } void glDeleteVertexArrays_3_2(GLsizei n, const GLuint *vaoIDs) { glDeleteVertexArrays(n, vaoIDs); } void glGenVertexArrays_3_2(GLsizei n, GLuint *vaoIDs) { glGenVertexArrays(n, vaoIDs); } OGLInfo_3_2::OGLInfo_3_2() { _useShader150 = true; _isVBOSupported = true; _isPBOSupported = true; _isFBOSupported = true; glBindVertexArrayDESMUME = &glBindVertexArray_3_2; glDeleteVertexArraysDESMUME = &glDeleteVertexArrays_3_2; glGenVertexArraysDESMUME = &glGenVertexArrays_3_2; _shaderSupport = ShaderSupport_MidTier; if (_versionMajor == 4) { if (_versionMinor <= 1) { _shaderSupport = ShaderSupport_HighTier; } else { _shaderSupport = ShaderSupport_TopTier; } } } void OGLInfo_3_2::GetExtensionSetOGL(std::set *oglExtensionSet) { GLint extensionCount = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &extensionCount); for (unsigned int i = 0; i < extensionCount; i++) { std::string extensionName = std::string((const char *)glGetStringi(GL_EXTENSIONS, i)); oglExtensionSet->insert(extensionName); } } bool OGLInfo_3_2::IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const { if (oglExtensionSet.size() == 0) { return false; } return (oglExtensionSet.find(extensionName) != oglExtensionSet.end()); } desmume-0.9.11/src/cocoa/utilities.h0000755000000000000000000000435112467662066016023 0ustar rootroot/* Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _COCOA_PORT_UTILITIES_ #define _COCOA_PORT_UTILITIES_ #include #include #include #ifdef __cplusplus extern "C" { #endif bool IsOSXVersionSupported(const unsigned int major, const unsigned int minor, const unsigned int revision); uint32_t RGB555ToRGBA8888(const uint16_t color16); uint32_t RGB555ToBGRA8888(const uint16_t color16); uint32_t RGBA8888ForceOpaque(const uint32_t color32); void RGB555ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount); void RGB555ToBGRA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount); void RGBA8888ForceOpaqueBuffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount); CGSize GetTransformedBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double scalar, const double angleDegrees); double GetMaxScalarInBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double keepInBoundsWidth, const double keepInBoundsHeight); CGPoint GetNormalPointFromTransformedPoint(const double transformedPointX, const double transformedPointY, const double normalBoundsWidth, const double normalBoundsHeight, const double transformBoundsWidth, const double transformBoundsHeight, const double scalar, const double angleDegrees); uint32_t GetNearestPositivePOT(uint32_t value); #ifdef __cplusplus } #endif #endif // _COCOA_PORT_UTILITIES_ desmume-0.9.11/src/cocoa/coreaudiosound.cpp0000755000000000000000000007757312467662066017406 0ustar rootroot/* Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "coreaudiosound.h" #include #include "cocoa_globals.h" #include "utilities.h" CoreAudioInput::CoreAudioInput() { OSStatus error = noErr; _spinlockAUHAL = (OSSpinLock *)malloc(sizeof(OSSpinLock)); *_spinlockAUHAL = OS_SPINLOCK_INIT; _hwStateChangedCallbackFunc = &CoreAudioInputDefaultHardwareStateChangedCallback; _hwStateChangedCallbackParam1 = NULL; _hwStateChangedCallbackParam2 = NULL; _hwGainChangedCallbackFunc = &CoreAudioInputDefaultHardwareGainChangedCallback; _hwGainChangedCallbackParam1 = NULL; _hwGainChangedCallbackParam2 = NULL; _inputGainNormalized = 0.0f; _inputElement = 0; _hwDeviceInfo.objectID = kAudioObjectUnknown; _hwDeviceInfo.name = CFSTR("Unknown Device"); _hwDeviceInfo.manufacturer = CFSTR("Unknown Manufacturer"); _hwDeviceInfo.deviceUID = CFSTR(""); _hwDeviceInfo.modelUID = CFSTR(""); _hwDeviceInfo.sampleRate = 0.0; _isPaused = false; _isHardwareEnabled = false; _isHardwareLocked = true; _captureFrames = 0; _auHALInputDevice = NULL; _auGraph = NULL; _auFormatConverterUnit = NULL; _auOutputUnit = NULL; _auFormatConverterNode = 0; _auOutputNode = 0; memset(&_timeStamp, 0, sizeof(AudioTimeStamp)); #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 AudioComponentDescription halInputDeviceDesc; AudioComponentDescription formatConverterDesc; AudioComponentDescription outputDesc; #else ComponentDescription halInputDeviceDesc; ComponentDescription formatConverterDesc; ComponentDescription outputDesc; #endif halInputDeviceDesc.componentType = kAudioUnitType_Output; halInputDeviceDesc.componentSubType = kAudioUnitSubType_HALOutput; halInputDeviceDesc.componentManufacturer = kAudioUnitManufacturer_Apple; halInputDeviceDesc.componentFlags = 0; halInputDeviceDesc.componentFlagsMask = 0; formatConverterDesc.componentType = kAudioUnitType_FormatConverter; formatConverterDesc.componentSubType = kAudioUnitSubType_AUConverter; formatConverterDesc.componentManufacturer = kAudioUnitManufacturer_Apple; formatConverterDesc.componentFlags = 0; formatConverterDesc.componentFlagsMask = 0; outputDesc.componentType = kAudioUnitType_Output; outputDesc.componentSubType = kAudioUnitSubType_GenericOutput; outputDesc.componentManufacturer = kAudioUnitManufacturer_Apple; outputDesc.componentFlags = 0; outputDesc.componentFlagsMask = 0; CreateAudioUnitInstance(&_auHALInputDevice, &halInputDeviceDesc); error = NewAUGraph(&_auGraph); error = AUGraphOpen(_auGraph); error = AUGraphAddNode(_auGraph, &formatConverterDesc, &_auFormatConverterNode); error = AUGraphAddNode(_auGraph, &outputDesc, &_auOutputNode); error = AUGraphConnectNodeInput(_auGraph, _auFormatConverterNode, 0, _auOutputNode, 0); error = AUGraphNodeInfo(_auGraph, _auFormatConverterNode, NULL, &_auFormatConverterUnit); error = AUGraphNodeInfo(_auGraph, _auOutputNode, NULL, &_auOutputUnit); static const UInt32 disableFlag = 0; static const UInt32 enableFlag = 1; static const AudioUnitScope inputBus = 1; static const AudioUnitScope outputBus = 0; UInt32 propertySize = 0; error = AudioUnitSetProperty(_auHALInputDevice, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, inputBus, &enableFlag, sizeof(enableFlag) ); error = AudioUnitSetProperty(_auHALInputDevice, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, outputBus, &disableFlag, sizeof(disableFlag) ); AudioStreamBasicDescription outputFormat; propertySize = sizeof(AudioStreamBasicDescription); outputFormat.mSampleRate = MIC_SAMPLE_RATE; outputFormat.mFormatID = kAudioFormatLinearPCM; outputFormat.mFormatFlags = kAudioFormatFlagIsPacked; outputFormat.mBytesPerPacket = MIC_SAMPLE_SIZE; outputFormat.mFramesPerPacket = 1; outputFormat.mBytesPerFrame = MIC_SAMPLE_SIZE; outputFormat.mChannelsPerFrame = MIC_NUMBER_CHANNELS; outputFormat.mBitsPerChannel = MIC_SAMPLE_RESOLUTION; AudioStreamBasicDescription deviceOutputFormat; error = AudioUnitGetProperty(_auOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &deviceOutputFormat, &propertySize); error = AudioUnitSetProperty(_auFormatConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputFormat, propertySize); error = AudioUnitSetProperty(_auFormatConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &outputFormat, propertySize); error = AudioUnitSetProperty(_auOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputFormat, propertySize); error = AudioUnitSetProperty(_auOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &outputFormat, propertySize); static const UInt32 bestQuality = kAudioUnitSampleRateConverterComplexity_Mastering; error = AudioUnitSetProperty(_auFormatConverterUnit, kAudioUnitProperty_SampleRateConverterComplexity, kAudioUnitScope_Global, 0, &bestQuality, sizeof(bestQuality)); // Set up the capture buffers. const size_t audioBufferListSize = offsetof(AudioBufferList, mBuffers[0]) + sizeof(AudioBuffer); _captureBufferList = (AudioBufferList *)malloc(audioBufferListSize); _captureBufferList->mNumberBuffers = 0; _captureBufferList->mBuffers[0].mNumberChannels = 0; _captureBufferList->mBuffers[0].mDataByteSize = 0; _captureBufferList->mBuffers[0].mData = NULL; _convertBufferList = (AudioBufferList *)malloc(audioBufferListSize); _convertBufferList->mNumberBuffers = 1; _convertBufferList->mBuffers[0].mNumberChannels = 1; _convertBufferList->mBuffers[0].mDataByteSize = MIC_CAPTURE_FRAMES * sizeof(uint8_t); _convertBufferList->mBuffers[0].mData = malloc(_convertBufferList->mBuffers[0].mDataByteSize); _samplesCaptured = new RingBuffer(MIC_CAPTURE_FRAMES * 3, sizeof(uint8_t)); _samplesConverted = new RingBuffer(MIC_CAPTURE_FRAMES * 3, sizeof(uint8_t)); // Set the AUHAL callback. AURenderCallbackStruct inputCaptureCallback; inputCaptureCallback.inputProc = &CoreAudioInputCaptureCallback; inputCaptureCallback.inputProcRefCon = this; error = AudioUnitSetProperty(_auHALInputDevice, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &inputCaptureCallback, sizeof(inputCaptureCallback) ); error = AudioUnitAddPropertyListener(this->_auHALInputDevice, kAudioDevicePropertyVolumeScalar, &CoreAudioInputAUHALChanged, this); error = AudioUnitAddPropertyListener(this->_auHALInputDevice, kAudioHardwarePropertyDefaultInputDevice, &CoreAudioInputAUHALChanged, this); error = AudioUnitAddPropertyListener(this->_auHALInputDevice, kAudioDevicePropertyHogMode, &CoreAudioInputAUHALChanged, this); error = AudioUnitAddPropertyListener(this->_auHALInputDevice, kAudioDevicePropertyJackIsConnected, &CoreAudioInputAUHALChanged, this); AudioObjectPropertyAddress defaultDeviceProperty; defaultDeviceProperty.mSelector = kAudioHardwarePropertyDefaultInputDevice; defaultDeviceProperty.mScope = kAudioObjectPropertyScopeGlobal; defaultDeviceProperty.mElement = kAudioObjectPropertyElementMaster; error = AudioObjectAddPropertyListener(kAudioObjectSystemObject, &defaultDeviceProperty, &CoreAudioInputDeviceChanged, this); // Set up the AUGraph callbacks AURenderCallbackStruct inputReceiveCallback; inputReceiveCallback.inputProc = &CoreAudioInputReceiveCallback; inputReceiveCallback.inputProcRefCon = this->_samplesCaptured; error = AudioUnitSetProperty(_auFormatConverterUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &inputReceiveCallback, sizeof(inputReceiveCallback) ); error = AUGraphAddRenderNotify(_auGraph, &CoreAudioInputConvertCallback, this->_samplesConverted); } CoreAudioInput::~CoreAudioInput() { OSSpinLockLock(_spinlockAUHAL); DestroyAudioUnitInstance(&_auHALInputDevice); OSSpinLockUnlock(_spinlockAUHAL); AUGraphClose(_auGraph); AUGraphUninitialize(_auGraph); AUGraphRemoveNode(_auGraph, _auFormatConverterNode); AUGraphRemoveNode(_auGraph, _auOutputNode); DisposeAUGraph(_auGraph); free(_captureBufferList->mBuffers[0].mData); _captureBufferList->mBuffers[0].mData = NULL; free(_captureBufferList); _captureBufferList = NULL; free(_convertBufferList->mBuffers[0].mData); _convertBufferList->mBuffers[0].mData = NULL; free(_convertBufferList); _convertBufferList = NULL; delete _samplesCaptured; _samplesCaptured = NULL; delete _samplesConverted; _samplesConverted = NULL; free(_spinlockAUHAL); _spinlockAUHAL = NULL; CFRelease(this->_hwDeviceInfo.name); CFRelease(this->_hwDeviceInfo.manufacturer); CFRelease(this->_hwDeviceInfo.deviceUID); CFRelease(this->_hwDeviceInfo.modelUID); } OSStatus CoreAudioInput::InitInputAUHAL(UInt32 deviceID) { OSStatus error = noErr; static const AudioUnitScope inputBus = 1; UInt32 propertySize = 0; this->_hwDeviceInfo.objectID = kAudioObjectUnknown; if (deviceID == kAudioObjectUnknown) { error = kAudioHardwareUnspecifiedError; return error; } // Get some information about the device before attempting to attach it to the AUHAL. AudioObjectPropertyAddress deviceProperty; UInt32 dataSize = 0; deviceProperty.mScope = kAudioObjectPropertyScopeGlobal; deviceProperty.mElement = kAudioObjectPropertyElementMaster; deviceProperty.mSelector = kAudioObjectPropertyName; error = AudioObjectGetPropertyDataSize(deviceID, &deviceProperty, 0, NULL, &dataSize); if (error == noErr) { CFRelease(this->_hwDeviceInfo.name); AudioObjectGetPropertyData(deviceID, &deviceProperty, 0, NULL, &dataSize, &this->_hwDeviceInfo.name); } deviceProperty.mSelector = kAudioObjectPropertyManufacturer; error = AudioObjectGetPropertyDataSize(deviceID, &deviceProperty, 0, NULL, &dataSize); if (error == noErr) { CFRelease(this->_hwDeviceInfo.manufacturer); AudioObjectGetPropertyData(deviceID, &deviceProperty, 0, NULL, &dataSize, &this->_hwDeviceInfo.manufacturer); } deviceProperty.mSelector = kAudioDevicePropertyDeviceUID; error = AudioObjectGetPropertyDataSize(deviceID, &deviceProperty, 0, NULL, &dataSize); if (error == noErr) { CFRelease(this->_hwDeviceInfo.deviceUID); AudioObjectGetPropertyData(deviceID, &deviceProperty, 0, NULL, &dataSize, &this->_hwDeviceInfo.deviceUID); } deviceProperty.mSelector = kAudioDevicePropertyModelUID; error = AudioObjectGetPropertyDataSize(deviceID, &deviceProperty, 0, NULL, &dataSize); if (error == noErr) { CFRelease(this->_hwDeviceInfo.modelUID); AudioObjectGetPropertyData(deviceID, &deviceProperty, 0, NULL, &dataSize, &this->_hwDeviceInfo.modelUID); } deviceProperty.mSelector = kAudioDevicePropertyNominalSampleRate; deviceProperty.mScope = kAudioDevicePropertyScopeInput; error = AudioObjectGetPropertyDataSize(deviceID, &deviceProperty, 0, NULL, &dataSize); if (error == noErr) { AudioObjectGetPropertyData(deviceID, &deviceProperty, 0, NULL, &dataSize, &this->_hwDeviceInfo.sampleRate); } // Before attaching the HAL input device, stop everything first. AUGraphStop(this->_auGraph); AUGraphUninitialize(this->_auGraph); AudioOutputUnitStop(this->_auHALInputDevice); AudioUnitUninitialize(this->_auHALInputDevice); // Attach the device to the AUHAL. // // From here on out, any error related to the AUHAL will be treated // as a failure to initialize and cause this method to exit. error = AudioUnitSetProperty(this->_auHALInputDevice, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &deviceID, sizeof(deviceID) ); if (error != noErr) { return error; } // Get the AUHAL's audio format and set that as on the input scope // of the format converter unit. AudioStreamBasicDescription inputFormat; propertySize = sizeof(AudioStreamBasicDescription); error = AudioUnitGetProperty(this->_auHALInputDevice, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, inputBus, &inputFormat, &propertySize); if (error != noErr) { return error; } // Interleaved audio is the only real requirement for the audio input. // All the other ASBD fields can be passed as-is. inputFormat.mFormatFlags &= ~kAudioFormatFlagIsNonInterleaved; error = AudioUnitSetProperty(this->_auHALInputDevice, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, inputBus, &inputFormat, propertySize); if (error != noErr) { return error; } error = AudioUnitSetProperty(this->_auFormatConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &inputFormat, propertySize); if (error != noErr) { return error; } // Set up the capture buffers. AudioValueRange bufferRange; propertySize = sizeof(AudioValueRange); error = AudioUnitGetProperty(this->_auHALInputDevice, kAudioDevicePropertyBufferFrameSizeRange, kAudioUnitScope_Input, inputBus, &bufferRange, &propertySize); if (error != noErr) { return error; } const UInt32 captureFramesScaled = (MIC_CAPTURE_FRAMES * ((double)inputFormat.mSampleRate / (double)MIC_SAMPLE_RATE)) + 0.5; this->_captureFrames = (captureFramesScaled < bufferRange.mMinimum) ? bufferRange.mMinimum : ((captureFramesScaled > bufferRange.mMaximum) ? bufferRange.mMaximum : captureFramesScaled); propertySize = sizeof(UInt32); error = AudioUnitSetProperty(this->_auHALInputDevice, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Input, inputBus, &this->_captureFrames, propertySize); if (error != noErr) { return error; } free(this->_captureBufferList->mBuffers[0].mData); this->_samplesCaptured->resize(this->_captureFrames * 3, inputFormat.mBytesPerFrame); this->_captureBufferList->mNumberBuffers = 1; this->_captureBufferList->mBuffers[0].mNumberChannels = inputFormat.mChannelsPerFrame; this->_captureBufferList->mBuffers[0].mDataByteSize = this->_captureFrames * inputFormat.mBytesPerFrame; this->_captureBufferList->mBuffers[0].mData = malloc(this->_captureBufferList->mBuffers[0].mDataByteSize); // Now that the AUHAL is set up, attempt to initialize the AUHAL. error = AudioUnitInitialize(this->_auHALInputDevice); if (error != noErr) { return error; } this->_hwDeviceInfo.objectID = deviceID; return error; } void CoreAudioInput::Start() { OSStatus error = noErr; char errorString[5] = {0}; // Get the default input device ID. AudioObjectID defaultInputDeviceID = kAudioObjectUnknown; UInt32 propertySize = sizeof(defaultInputDeviceID); AudioObjectPropertyAddress defaultDeviceProperty; defaultDeviceProperty.mSelector = kAudioHardwarePropertyDefaultInputDevice; defaultDeviceProperty.mScope = kAudioObjectPropertyScopeGlobal; defaultDeviceProperty.mElement = kAudioObjectPropertyElementMaster; error = AudioObjectGetPropertyData(kAudioObjectSystemObject, &defaultDeviceProperty, 0, NULL, &propertySize, &defaultInputDeviceID); // Set the default input device to the audio unit. OSSpinLockLock(this->_spinlockAUHAL); error = this->InitInputAUHAL(defaultInputDeviceID); if (error == noErr) { Float32 theGain = 0.0f; UInt32 gainPropSize = sizeof(theGain); // Try and get the gain properties on the AUHAL. for (AudioUnitElement elementNumber = 0; elementNumber < 3; elementNumber++) { error = AudioUnitGetProperty(this->_auHALInputDevice, kAudioDevicePropertyVolumeScalar, kAudioUnitScope_Input, elementNumber, &theGain, &gainPropSize); if (error == noErr) { this->_inputElement = elementNumber; this->UpdateHardwareGain(theGain); break; } } this->_isHardwareEnabled = true; this->UpdateHardwareLock(); } else { *(OSStatus *)errorString = CFSwapInt32BigToHost(error); printf("CoreAudioInput - AUHAL init error: %s\n", errorString); this->_isHardwareEnabled = false; } if (this->IsHardwareEnabled() && !this->IsHardwareLocked() && !this->GetPauseState()) { error = AudioOutputUnitStart(this->_auHALInputDevice); } OSSpinLockUnlock(this->_spinlockAUHAL); error = AUGraphInitialize(_auGraph); if (!this->GetPauseState()) { error = AUGraphStart(this->_auGraph); } this->_samplesCaptured->clear(); this->_samplesConverted->clear(); this->_hwStateChangedCallbackFunc(&this->_hwDeviceInfo, this->IsHardwareEnabled(), this->IsHardwareLocked(), this->_hwStateChangedCallbackParam1, this->_hwStateChangedCallbackParam2); } void CoreAudioInput::Stop() { OSSpinLockLock(this->_spinlockAUHAL); AudioOutputUnitStop(this->_auHALInputDevice); AudioUnitUninitialize(this->_auHALInputDevice); OSSpinLockUnlock(this->_spinlockAUHAL); AUGraphStop(this->_auGraph); AUGraphUninitialize(this->_auGraph); this->_isHardwareEnabled = false; this->_samplesCaptured->clear(); this->_samplesConverted->clear(); } size_t CoreAudioInput::Pull() { OSStatus error = noErr; AudioUnitRenderActionFlags ioActionFlags = 0; error = AudioUnitRender(this->_auOutputUnit, &ioActionFlags, &this->_timeStamp, 0, MIC_CAPTURE_FRAMES, this->_convertBufferList); return MIC_CAPTURE_FRAMES; } bool CoreAudioInput::IsHardwareEnabled() const { return this->_isHardwareEnabled; } bool CoreAudioInput::IsHardwareLocked() const { return this->_isHardwareLocked; } bool CoreAudioInput::GetPauseState() const { return this->_isPaused; } void CoreAudioInput::SetPauseState(bool pauseState) { if (pauseState && !this->GetPauseState()) { OSSpinLockLock(this->_spinlockAUHAL); AudioOutputUnitStop(this->_auHALInputDevice); OSSpinLockUnlock(this->_spinlockAUHAL); AUGraphStop(this->_auGraph); } else if (!pauseState && this->GetPauseState() && !this->IsHardwareLocked()) { OSSpinLockLock(this->_spinlockAUHAL); AudioOutputUnitStart(this->_auHALInputDevice); OSSpinLockUnlock(this->_spinlockAUHAL); AUGraphStart(this->_auGraph); } this->_isPaused = (this->IsHardwareLocked()) ? true : pauseState; } float CoreAudioInput::GetGain() const { return this->_inputGainNormalized; } void CoreAudioInput::SetGain(float normalizedGain) { OSStatus error = noErr; Float32 gainValue = normalizedGain; UInt32 gainPropSize = sizeof(gainValue); OSSpinLockLock(this->_spinlockAUHAL); error = AudioUnitSetProperty(this->_auHALInputDevice, kAudioDevicePropertyVolumeScalar, kAudioUnitScope_Input, this->_inputElement, &gainValue, gainPropSize); OSSpinLockUnlock(this->_spinlockAUHAL); } void CoreAudioInput::UpdateHardwareGain(float normalizedGain) { this->_inputGainNormalized = normalizedGain; this->_hwGainChangedCallbackFunc(this->_inputGainNormalized, this->_hwGainChangedCallbackParam1, this->_hwGainChangedCallbackParam2); } void CoreAudioInput::UpdateHardwareLock() { OSStatus error = noErr; bool hardwareLocked = false; if (this->IsHardwareEnabled()) { // Check if another application has exclusive access to the hardware. pid_t hogMode = 0; UInt32 propertySize = sizeof(hogMode); error = AudioUnitGetProperty(this->_auHALInputDevice, kAudioDevicePropertyHogMode, kAudioUnitScope_Input, 1, &hogMode, &propertySize); if (error == noErr) { if (hogMode != -1) { hardwareLocked = true; } } else { // If this property is not supported, then always assume that // the hardware device is shared. hogMode = -1; } // Check if the hardware device is plugged in. UInt32 isJackConnected = 0; propertySize = sizeof(isJackConnected); error = AudioUnitGetProperty(this->_auHALInputDevice, kAudioDevicePropertyJackIsConnected, kAudioUnitScope_Input, 1, &hogMode, &propertySize); if (error == noErr) { if (isJackConnected == 0) { hardwareLocked = true; } } else { // If this property is not supported, then always assume that // the hardware device is always plugged in. isJackConnected = 1; } } else { hardwareLocked = true; } this->_isHardwareLocked = hardwareLocked; if (this->_isHardwareLocked && !this->GetPauseState()) { this->SetPauseState(true); } this->_hwStateChangedCallbackFunc(&this->_hwDeviceInfo, this->IsHardwareEnabled(), this->IsHardwareLocked(), this->_hwStateChangedCallbackParam1, this->_hwStateChangedCallbackParam2); } void CoreAudioInput::SetCallbackHardwareStateChanged(CoreAudioInputHardwareStateChangedCallback callbackFunc, void *inParam1, void *inParam2) { this->_hwStateChangedCallbackFunc = callbackFunc; this->_hwStateChangedCallbackParam1 = inParam1; this->_hwStateChangedCallbackParam2 = inParam2; } void CoreAudioInput::SetCallbackHardwareGainChanged(CoreAudioInputHardwareGainChangedCallback callbackFunc, void *inParam1, void *inParam2) { this->_hwGainChangedCallbackFunc = callbackFunc; this->_hwGainChangedCallbackParam1 = inParam1; this->_hwGainChangedCallbackParam2 = inParam2; } OSStatus CoreAudioInputCaptureCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { OSStatus error = noErr; CoreAudioInput *caInput = (CoreAudioInput *)inRefCon; caInput->_timeStamp = *inTimeStamp; error = AudioUnitRender(caInput->_auHALInputDevice, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, caInput->_captureBufferList); if (error != noErr) { return error; } caInput->_samplesCaptured->write(caInput->_captureBufferList->mBuffers[0].mData, inNumberFrames); return error; } OSStatus CoreAudioInputReceiveCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { OSStatus error = noErr; RingBuffer *__restrict__ samplesCaptured = (RingBuffer *)inRefCon; uint8_t *__restrict__ receiveBuffer = (uint8_t *)ioData->mBuffers[0].mData; const size_t framesRead = samplesCaptured->read(receiveBuffer, inNumberFrames); // Pad any remaining samples. if (framesRead < inNumberFrames) { const size_t frameSize = samplesCaptured->getElementSize(); memset(receiveBuffer + (framesRead * frameSize), MIC_NULL_SAMPLE_VALUE, (inNumberFrames - framesRead) * frameSize); } return error; } OSStatus CoreAudioInputConvertCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { OSStatus error = noErr; if (*ioActionFlags & kAudioUnitRenderAction_PostRender) { RingBuffer *samplesConverted = (RingBuffer *)inRefCon; samplesConverted->write(ioData->mBuffers[0].mData, inNumberFrames); } return error; } OSStatus CoreAudioInputDeviceChanged(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress inAddresses[], void *inClientData) { OSStatus error = noErr; CoreAudioInput *caInput = (CoreAudioInput *)inClientData; caInput->Start(); if (!caInput->IsHardwareEnabled()) { error = kAudioHardwareNotRunningError; } return error; } void CoreAudioInputAUHALChanged(void *inRefCon, AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement) { OSStatus error = noErr; CoreAudioInput *caInput = (CoreAudioInput *)inRefCon; switch (inID) { case kAudioDevicePropertyVolumeScalar: { Float32 gainValue = 0.0f; UInt32 propertySize = sizeof(gainValue); error = AudioUnitGetProperty(inUnit, inID, kAudioUnitScope_Input, inElement, &gainValue, &propertySize); if (error == noErr) { caInput->UpdateHardwareGain(gainValue); } break; } case kAudioDevicePropertyHogMode: case kAudioDevicePropertyJackIsConnected: caInput->UpdateHardwareLock(); break; default: break; } } void CoreAudioInputDefaultHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, void *inParam1, void *inParam2) { // Do nothing. } void CoreAudioInputDefaultHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2) { // Do nothing. } #pragma mark - CoreAudioOutput::CoreAudioOutput(size_t bufferSamples, size_t sampleSize) { OSStatus error = noErr; _spinlockAU = (OSSpinLock *)malloc(sizeof(OSSpinLock)); *_spinlockAU = OS_SPINLOCK_INIT; _buffer = new RingBuffer(bufferSamples, sampleSize); _volume = 1.0f; // Create a new audio unit #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 if (IsOSXVersionSupported(10, 6, 0)) { AudioComponentDescription audioDesc; audioDesc.componentType = kAudioUnitType_Output; audioDesc.componentSubType = kAudioUnitSubType_DefaultOutput; audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple; audioDesc.componentFlags = 0; audioDesc.componentFlagsMask = 0; CreateAudioUnitInstance(&_au, &audioDesc); } else #endif { ComponentDescription audioDesc; audioDesc.componentType = kAudioUnitType_Output; audioDesc.componentSubType = kAudioUnitSubType_DefaultOutput; audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple; audioDesc.componentFlags = 0; audioDesc.componentFlagsMask = 0; CreateAudioUnitInstance(&_au, &audioDesc); } // Set the render callback AURenderCallbackStruct callback; callback.inputProc = &CoreAudioOutputRenderCallback; callback.inputProcRefCon = _buffer; error = AudioUnitSetProperty(_au, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback) ); if(error != noErr) { return; } // Set up the audio unit for audio streaming AudioStreamBasicDescription outputFormat; outputFormat.mSampleRate = SPU_SAMPLE_RATE; outputFormat.mFormatID = kAudioFormatLinearPCM; outputFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kLinearPCMFormatFlagIsPacked; outputFormat.mBytesPerPacket = SPU_SAMPLE_SIZE; outputFormat.mFramesPerPacket = 1; outputFormat.mBytesPerFrame = SPU_SAMPLE_SIZE; outputFormat.mChannelsPerFrame = SPU_NUMBER_CHANNELS; outputFormat.mBitsPerChannel = SPU_SAMPLE_RESOLUTION; error = AudioUnitSetProperty(_au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputFormat, sizeof(outputFormat) ); if(error != noErr) { return; } // Initialize our new audio unit error = AudioUnitInitialize(_au); if(error != noErr) { return; } } CoreAudioOutput::~CoreAudioOutput() { OSSpinLockLock(_spinlockAU); DestroyAudioUnitInstance(&_au); OSSpinLockUnlock(_spinlockAU); delete _buffer; _buffer = NULL; free(_spinlockAU); _spinlockAU = NULL; } void CoreAudioOutput::start() { this->clearBuffer(); OSSpinLockLock(this->_spinlockAU); AudioUnitReset(this->_au, kAudioUnitScope_Global, 0); AudioOutputUnitStart(this->_au); OSSpinLockUnlock(this->_spinlockAU); } void CoreAudioOutput::pause() { OSSpinLockLock(this->_spinlockAU); AudioOutputUnitStop(this->_au); OSSpinLockUnlock(this->_spinlockAU); } void CoreAudioOutput::unpause() { OSSpinLockLock(this->_spinlockAU); AudioOutputUnitStart(this->_au); OSSpinLockUnlock(this->_spinlockAU); } void CoreAudioOutput::stop() { OSSpinLockLock(this->_spinlockAU); AudioOutputUnitStop(this->_au); OSSpinLockUnlock(this->_spinlockAU); this->clearBuffer(); } void CoreAudioOutput::writeToBuffer(const void *buffer, size_t numberSampleFrames) { size_t availableSampleFrames = this->_buffer->getAvailableElements(); if (availableSampleFrames < numberSampleFrames) { this->_buffer->drop(numberSampleFrames - availableSampleFrames); } this->_buffer->write(buffer, numberSampleFrames); } void CoreAudioOutput::clearBuffer() { this->_buffer->clear(); } void CoreAudioOutput::mute() { OSSpinLockLock(this->_spinlockAU); AudioUnitSetParameter(this->_au, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, 0.0f, 0); OSSpinLockUnlock(this->_spinlockAU); } void CoreAudioOutput::unmute() { OSSpinLockLock(this->_spinlockAU); AudioUnitSetParameter(this->_au, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, this->_volume, 0); OSSpinLockUnlock(this->_spinlockAU); } size_t CoreAudioOutput::getAvailableSamples() const { return this->_buffer->getAvailableElements(); } float CoreAudioOutput::getVolume() const { return this->_volume; } void CoreAudioOutput::setVolume(float vol) { this->_volume = vol; OSSpinLockLock(this->_spinlockAU); AudioUnitSetParameter(this->_au, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, vol, 0); OSSpinLockUnlock(this->_spinlockAU); } OSStatus CoreAudioOutputRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { RingBuffer *__restrict__ audioBuffer = (RingBuffer *)inRefCon; UInt8 *__restrict__ playbackBuffer = (UInt8 *)ioData->mBuffers[0].mData; const size_t framesRead = audioBuffer->read(playbackBuffer, inNumberFrames); // Pad any remaining samples. if (framesRead < inNumberFrames) { const size_t frameSize = audioBuffer->getElementSize(); memset(playbackBuffer + (framesRead * frameSize), 0, (inNumberFrames - framesRead) * frameSize); } return noErr; } #pragma mark - bool CreateAudioUnitInstance(AudioUnit *au, ComponentDescription *auDescription) { bool result = false; if (au == NULL || auDescription == NULL || IsOSXVersionSupported(10, 6, 0)) { return result; } Component theComponent = FindNextComponent(NULL, auDescription); if (theComponent == NULL) { return result; } OSErr error = OpenAComponent(theComponent, au); if (error != noErr) { return result; } result = true; return result; } #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 bool CreateAudioUnitInstance(AudioUnit *au, AudioComponentDescription *auDescription) { bool result = false; if (au == NULL || auDescription == NULL || !IsOSXVersionSupported(10, 6, 0)) { return result; } AudioComponent theComponent = AudioComponentFindNext(NULL, auDescription); if (theComponent == NULL) { return result; } OSStatus error = AudioComponentInstanceNew(theComponent, au); if (error != noErr) { return result; } result = true; return result; } #endif void DestroyAudioUnitInstance(AudioUnit *au) { if (au == NULL) { return; } AudioOutputUnitStop(*au); AudioUnitUninitialize(*au); #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 if (IsOSXVersionSupported(10, 6, 0)) { AudioComponentInstanceDispose(*au); } else #endif { CloseComponent(*au); } } desmume-0.9.11/src/cocoa/ringbuffer.cpp0000755000000000000000000001643112467662066016476 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "ringbuffer.h" #include #include RingBuffer::RingBuffer(const size_t numberElements, const size_t elementSize) { _buffer = NULL; allocate(numberElements, elementSize); } RingBuffer::~RingBuffer() { free(_buffer); _buffer = NULL; } void RingBuffer::allocate(const size_t numberElements, const size_t elementSize) { this->_elementCapacity = numberElements; this->_elementSize = elementSize; this->_bufferSize = (this->_elementCapacity + 2) * this->_elementSize; this->_buffer = (uint8_t *)realloc(this->_buffer, this->_bufferSize); memset(this->_buffer, 0, this->_bufferSize); this->_readPosition = 0; this->_writePosition = 1; this->_elementFillCount = 0; } void RingBuffer::resize(const size_t numberElements, const size_t elementSize) { this->drop(this->getUsedElements()); this->allocate(numberElements, elementSize); } void RingBuffer::clear() { this->_readPosition = 0; this->_writePosition = 1; this->_elementFillCount = 0; memset(_buffer, 0, this->_bufferSize); } size_t RingBuffer::read(void *__restrict__ destBuffer, size_t requestedNumberElements) { if (destBuffer == NULL) { return 0; } size_t hiElementsAvailable = 0; size_t loElementsAvailable = 0; const uint8_t *__restrict__ inputData = this->_buffer; size_t inputDataReadPos = this->_readPosition; const size_t inputDataWritePos = this->_writePosition; const size_t inputDataSize = this->_elementCapacity + 2; // Check buffer availability if (inputDataReadPos < inputDataWritePos) { hiElementsAvailable = inputDataWritePos - inputDataReadPos - 1; } else if (inputDataReadPos > inputDataWritePos) { hiElementsAvailable = inputDataSize - inputDataReadPos - 1; loElementsAvailable = inputDataWritePos; } else { return requestedNumberElements; } // Bounds check for buffer overrun if (requestedNumberElements > hiElementsAvailable + loElementsAvailable) { requestedNumberElements = hiElementsAvailable + loElementsAvailable; } if (requestedNumberElements == 0) { return requestedNumberElements; } // Copy ring buffer to destination buffer if (requestedNumberElements <= hiElementsAvailable) { memcpy(destBuffer, inputData + ((inputDataReadPos + 1) * this->_elementSize), requestedNumberElements * this->_elementSize); } else { memcpy(destBuffer, inputData + ((inputDataReadPos + 1) * this->_elementSize), hiElementsAvailable * this->_elementSize); memcpy((uint8_t *)destBuffer + (hiElementsAvailable * this->_elementSize), inputData, (requestedNumberElements - hiElementsAvailable) * this->_elementSize); } // Advance the read position inputDataReadPos += requestedNumberElements; if (inputDataReadPos >= inputDataSize) { inputDataReadPos -= inputDataSize; } this->_readPosition = inputDataReadPos; // Decrease the fill size now that we're done reading. OSAtomicAdd32Barrier(-(int32_t)requestedNumberElements, &this->_elementFillCount); return requestedNumberElements; } size_t RingBuffer::write(const void *__restrict__ srcBuffer, size_t requestedNumberElements) { if (srcBuffer == NULL) { return 0; } size_t hiElementsAvailable = 0; size_t loElementsAvailable = 0; uint8_t *__restrict__ inputData = this->_buffer; const size_t inputDataReadPos = this->_readPosition; size_t inputDataWritePos = this->_writePosition; const size_t inputDataSize = this->_elementCapacity + 2; // Check buffer availability. if (inputDataWritePos > inputDataReadPos) { hiElementsAvailable = inputDataSize - inputDataWritePos; loElementsAvailable = (inputDataReadPos > 0) ? inputDataReadPos - 1 : 0; } else if (inputDataWritePos < inputDataReadPos) { hiElementsAvailable = inputDataReadPos - inputDataWritePos - 1; } else { return requestedNumberElements; } // Bounds check for buffer overrun if (requestedNumberElements > hiElementsAvailable + loElementsAvailable) { requestedNumberElements = hiElementsAvailable + loElementsAvailable; } if (requestedNumberElements == 0) { return requestedNumberElements; } // Increase the fill size before writing anything. OSAtomicAdd32Barrier((int32_t)requestedNumberElements, &this->_elementFillCount); // Copy source buffer to ring buffer. if (requestedNumberElements <= hiElementsAvailable) { memcpy(inputData + (inputDataWritePos * this->_elementSize), srcBuffer, requestedNumberElements * this->_elementSize); } else { memcpy(inputData + (inputDataWritePos * this->_elementSize), srcBuffer, hiElementsAvailable * this->_elementSize); memcpy(inputData, (uint8_t *)srcBuffer + (hiElementsAvailable * this->_elementSize), (requestedNumberElements - hiElementsAvailable) * this->_elementSize); } // Advance the write position. inputDataWritePos += requestedNumberElements; if (inputDataWritePos > inputDataSize) { inputDataWritePos -= inputDataSize; } this->_writePosition = inputDataWritePos; return requestedNumberElements; } size_t RingBuffer::drop(size_t requestedNumberElements) { size_t hiElementsAvailable = 0; size_t loElementsAvailable = 0; size_t inputDataReadPos = this->_readPosition; const size_t inputDataWritePos = this->_writePosition; const size_t inputDataSize = this->_elementCapacity + 2; // Check buffer availability if (inputDataReadPos < inputDataWritePos) { hiElementsAvailable = inputDataWritePos - inputDataReadPos - 1; } else if (inputDataReadPos > inputDataWritePos) { hiElementsAvailable = inputDataSize - inputDataReadPos - 1; loElementsAvailable = inputDataWritePos; } else { return requestedNumberElements; } // Bounds check for buffer overrun if (requestedNumberElements > hiElementsAvailable + loElementsAvailable) { requestedNumberElements = hiElementsAvailable + loElementsAvailable; } if (requestedNumberElements == 0) { return requestedNumberElements; } // Advance the read position inputDataReadPos += requestedNumberElements; if (inputDataReadPos >= inputDataSize) { inputDataReadPos -= inputDataSize; } this->_readPosition = inputDataReadPos; // Decrease the fill size now that we're done reading. OSAtomicAdd32Barrier(-(int32_t)requestedNumberElements, &this->_elementFillCount); return requestedNumberElements; } size_t RingBuffer::getAvailableElements() const { return (this->_elementCapacity - this->_elementFillCount); } size_t RingBuffer::getUsedElements() const { return (size_t)this->_elementFillCount; } size_t RingBuffer::getElementCapacity() const { return this->_elementCapacity; } size_t RingBuffer::getElementSize() const { return this->_elementSize; } bool RingBuffer::isEmpty() const { return (this->_elementFillCount == 0); } bool RingBuffer::isFull() const { return ((size_t)this->_elementFillCount >= this->_elementCapacity); } desmume-0.9.11/src/cocoa/AppIcon_ROMCheats.icns0000755000000000000000000030317012467662066017714 0ustar rootrooticns†xis32" A0a7(.# 1H?)D_1ph4$"&NI:S)Lvk}ELMIY0>B;&K‡‚€ƒza`c\AA9<%Kƒ||tm^RGF:2<%H„‚tj]TLB5)-:"QŠwrg_]UI?<.+9!Wĝ€˙(ŝÊżÒÎżÖ~(1)Y|txvb_hh^hK.=+%&&%%-,-1.66" A0nF51%'&')0G?)EmBqg(C1.3$MJ:S)Kvn|Jac^o9=C;&L‡€ƒzdjmeDA9<%Kƒ||ul\PEE:2<%H„‚tj]UMC6)-:"QŠwrg_\UH?<.+9!Wĝ€˙(ŝÊżÒÎżÖ~(1)Y|txvb_hh^hK.=+%&&%%-,-1.66s8mk@[TWVVVWWWWXU[DË˙ú˙ŝ˙˙˙˙˙ŝ˙û˙Ü(éĝöĝ÷÷÷÷÷÷öùó˙Ġ_˙÷˙ŝ˙˙˙˙˙˙ŝ˙ü˙â-˙û˙ŝŝŝŝŝŝŝŭ˙ü˙ċè˙ŭ˙ŝ˙˙˙˙˙ŝ˙û˙ÛÍ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÜÍ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ù˙ŭŝŝŝŝŝŭ˙ú˙ÚÊ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÈ˙ñùö÷÷÷÷÷öĝó˙Ġ”˙÷˙ŝ˙˙˙˙˙ŝ˙û˙Ĝil32 ˘!%€&'*(&(**+,**+*J$## PRQDABCBEGDFHHGFFEBIGDEFEFUQ^ A>8fqnpqmjplkklopszjmvroqk?>J NAX˙ŝ‰˙Uüġ˙˙üŝ˙ú˙w8W %'\˙úù›‚šx¤™„xquŞn´˙úó˙z3U  Ş˙ù˙áÔ×ÙŜċĜßÖ˘aÏDŸSċ˙÷˙z4V t˙ŭ˙ùùŭûŜ·ëâÏí˙ö˙x4V ":Ÿ˘£´Ĵ€~z}„ˆžÊħİĴĦ—ŒŽL?O1/#'v~sv~†Œ„xnedt~{uzyvI=@."K5$"$tŽ‹…l:  6_…ƒrzG!U YS0+%# GC#*  e{a%BS:{D;-)&# "€" U CHLZ|@>24$ \ !#OCM ;3>eIUKQ†|‹6'T@HCAt@ACE!RR7?M ;48Š€lf~~y!aiSMIJPR`2OK5=L :39~‡‡€€}†i@u‚…‹:&NC4=K828ƒ~}€€~„rQQYglbX=/HE?1:4,8fqnpqmjplkklopszjmvroqk?>J NAX˙ŝ‰˙Uüġ˙˙üŝ˙ú˙w8W !%(]˙úù›‚šx¤™„xquŞn´˙úó˙z3U #Ğ˙ù˙áÔ×ÙŜċĜßÖ˘aÏDŸSċ˙÷˙z4U  u˙ŭ˙ùùŭûñß·ëâÏí˙ö˙x4V :Ÿ˘£´Ĵ€~z}„ˆžÉħİĴĦ—ŒŽL?O30!&v~sv~†Œ„xnedt~{uzyvI=C0$J3" #tŽ‹…m; !7_…ƒqzF"W YO.(#! GC, eza&DS;x?7)&$"U!EIKZv98-/!!\!%RCM ;3>fJQCQ†|‹8$D4;754577"RR7?M ;48‰nh~~y"RWB=9;?AN. OK6=K :39~~†‡€€}†j:4,8fqnpqmjplkklopszjmvroqk?>J NAX˙ŝ‰˙Uüġ˙˙üŝ˙ú˙w8W "&(]˙úù›‚šx¤™„wquŞn´˙úó˙z3U Ğ˙ù˙áÔ×ÙŜċĜß×£aÏDŸSċ˙÷˙z4U" t˙ŭ˙ùùŭûñß·ëâÏí˙ö˙x4V " #&9 ˘£´Ĵ€~z}„ˆžÊħİĴĦ—ŒŽL?O47(!1 v~sv~†„xnedt~{uzyvI=C0%R>*(/tŽ‹…k:!7_…ƒrzG#V ^\82-%- HC*!"ezb'CS=ƒMC51/*')!"'#V!DIK_†HG:=+!]"#&" $PC;P <"s}TBB.>˜A5.00,+),--Xb;@M ;9&^xle7n‡f{7>><77545:!"VX:>M ;3>eL[QS…|‹8-XDLHFEEGH $RR8?M ;47Š€mg~‚y$enWPMNTTb5!PK6=K :39~‡‡€€}†jAy…†‡‰‘“>)NC4=K828ƒ~}€€~„rRR\jpf\@1HE?1:4,ÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙(ŭ˙ĉ%7:IHGHGK@VP bA &G]˙ö˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP€*=!- n˙ô˙ŝŝ…˙?ŝ˙÷˙†74.*)'&#$"! €"  <|‚}‚€‚~~‚„}phP% €    0  #Sˆ~}~|zywvuusqqonh7/ 4V`O?WPA/N~[OD>83.,)'&%$"! €"€ #~…}N|…„ƒxjbR8     U~xzywvuusrponlh % 6LbPGAVPB/G?4Še[LF>82/*+(&'$$#! #  d„‰‡‡‰nbXE2'   ‚/  'rywvutsqpnojo\ 9G\WDK@WPEH ŠwbVJC;82.-+*)'$$€"- #  'Mf[7:;-   €€!  € Fxvvtrqponko_!9CT\GHJ@VPNo’iaVKC=841-,*)(%$#"€$ €  !! +! !!""  .trsponmkoL;?PYEFFJ@VPY =£uk[SK@;9520-,+(&-%%$"! !  !"  €/ "#%$"!  'znpomknH;>J^JFFDI?WPKd) ”oj[PJD=97410-)(('(('&$#""   '&##"!!€  #%!&€   ?tmlmh7 #=@HUOEGGFI?VP‚()6HĴzubYPHC?<7200.++((*)((&$#"€#+)&$"!€€"$$%  €  Znmg2';?FWEGHEHEJ?VP> %= xqcWPKF@?6322.+**)+,+)'%$" $-$# ‚€€€#€  (uU& .BKP\58GGDFGI?WP‚ 6C  ˜™zul]WSKDC?=9764€0.20.+% y€pX. # € €€ƒ€0'8>ENP\[77HFFECI?VP‚S7@7 /°Š|sh_WSKDA@>:86312142.-(1}~„†‡@"#"!!"!##$#$#"#" !   €€€UQ‚B 8?=4Xħ„oh\WOJEBB=:;83224523'Pˆ}|€)$('()&'%$%&'$%$%#€"$"#"" €"##$#$$ GVFPTa_[W77HFEEDG>UP‚; 6?9>9 t­„ylc]VMJEC@==;7754677%lƒ€ƒ|†J )-,+)*)(&€)€(*'$&%#%$#€$,#$#$%$&''%$" "\VNUchZ[V66HFFEEH>UP‚' 8?:8<7 ƒ§}slf_XPKGC@??=;95669!(€}+ /.-+,+)(+,*,€+*'()'&&$&%€&'''*)*)'&'$iKUah[ZZT66HEEFEI>UO‚5?::7:7# ~¨€xtkbZSMIGE€A)<=:98Z†}~‚9(30//.+,.-,.-,,*+),€*('(()**++€,.,. 9gDfl^ZYXS66HE€CG>UM‚>5?9::98;+ n˘„uunc]VRMLHHDCA=>39†}€€}†` #$44232/-/22€01+,,-,-.-€,+*€-+.,€.011BZFv]ZYWWQ66H€ECF=UO‚'6>89:;8;=!F›uxwkd[VSPNMJIFE1i†~€€)~ƒ1 "3=7875315644143//020020.++-.00./€04344?VYlT[WVVP66H€EDG=TO‚$7>788:9<:)/2ˆ˜|uvqh_YVUTPNJI-0}ƒ€O~†b#/@:<:8:8::<76764323432110/14120134157568ZX]WWVTTN65GEDDCG=TN‚&7>89786<8.,<X•}xuoje^XWWXL%U†~‚€3( *E@<;<;>=;=:9;986644556€544€5 768687:6€4_WYWVUSRM65GEDEDG=TN‚%6>89897<6.4‹L$mŽŽwoliec\bD)v‚ƒ€~…` $'%GGDBB€@A?>=?@<9:8:;::9766747898:;€=86ZXWUTSQRL65GEEFCG=TN‚5>€898<7,1‰€yD$^‚Ž‹}uphpj/P†}„€ „;-!COHJF€DFCDBA@?€<>;;<:;:9;::<;€897<7-2Šy„ƒ_':_xƒ~nD#+y‚…€„q! ''=VLMJHHGFGDECCDB€@?>;=>>@AA€B"DEF?7YTURRQPOI64HEFEBG=SN‚$4>99898<7-2‰}}†kG'+#''a„~†€}…E+5ZRROOMMIKJGJ€G DCCBDABBAAC EFFGHHID€>XSSQQONNH64FEDFEH=TN‚#4=89::7<7,2‰|ƒ~„ƒs]=$*/b†~Š€|) 2W]VWURQOP€LIJJHFC€FHFGEFHJIJ€K€PL%AVQRQONLLG64GDBDCG=TN‚!4=767:7<7,2‰|‚~~‚„„{qwc_v‚Š€ ~…fXg`^XUQOMMLKIGIIGHKLIJMKQP€S#RWXTX1 ?UPQNMLJJE64FDDCAF=SN‚4=87686;7,2‰|‚€€~~€€‚„‚Š€A|‡O 9yfib`]YZZXTSQQMMOOMONONQTSWXZ[ZY\b]_B >TOOMLJIID63F€DBFSMNLJIHHB62FCBDCG‚v(9t}xrnkfcde`]`_`]^_aaccaegijmpjpponk-"BPLLJIHGGA62FC€BFƒt, ]€‚|wrtpmlkljhjijlmmonntutwwvx|~~}:!(KMKJIHHFE@62F€C@D;SM‚3<‚6;6+2‰|‚€H~„s* $XˆŠˆˆ†…‚~{wvuutwwyyzy}{z‚‚……‡‰††7!7OJJIHGEDD>63DCCDBE;RM‚3;8€74:5*2‰|‚ž€}…s>.rŸ’‘Ž‹ŒŒˆ‰€‡/†‰ˆ‰‹Œ‹Ž’‘‘˜£]"&ILIHHFEDBB<62DBADCF;RL‚2;67886:5)2‰|‚ €E€_. 0f„–œ•ŽŒ‰ˆ‰‹Œ‘•–šŸ˘İĞ‘J " %DLIIHGEDBA@<73DCAA@D;RL‚0<54566:5)2‰|‚ €;€}{vg=  .Nc‘™ž ˘Ÿ˘¤§Ğ³ĥµŻĴ ‘tG!)DMIIHFEDBA?@;72D€B@C:RL‚2;65654:5)2‰|‚ €€~8}xzzwkR1)BSmy€”–™™…ƒt[NE6#!&:JKHIHFEDB@?>?861D€BAE:QL‚0;5656484)2‰|‚Ÿ€F~}{zzxutvvyjLC0  *(09KOKHIGFECB@??==761DA@@AE:QK‚1:5€6494(2‰|‚ž€*~~}{yywvvurplnopni^NQD-,*%&--..11.5E@?JJPPL€IGFDCB@??=;;661DA@@?B:QK‚1:4356584(2‰|‚œ€#~}|{zywvutrrqplkihghhgffee_a`]\YWWUT!QOKJJIHGEDCB@?>=<;:460EAAB@C9QK‚194334484(2‰|‚›€@~~|{yxwvutsqonlmlkjgecba`^]]ZYYXWVUSRPPNMLLJHHGEDCA@?><;:98360D€A?D9OK‚0:4544383)2‰|‚š€K~~|{yxwuusrqpnmlkjhgfeddba`^\[[ZXVVTRRQPNLKIHHGEDCA@?>=;:977260DAAB?C9PJ‚0:‚483(2‰|‚™€L~}|{yxwuutrqonmlkjhgfdcb`_^][ZZXWVUSQQPOMLKIHHFECBA@?>=;:8766160DBAA?C9QJ‚0:4545483(2‰|‚˜€M~}|zyxvuusrppnllkjhgedcba_^][ZZYWVUSRQPNMLJIHGFECB@??><;:87754/6/CABB?B9QJ‚195483(2‰|‚—€N~~}{zywvutsrpommlkihgedcb`_^\[ZZXWVTSRQPNMLJIHGFECB@??><::876543.7/C@>@@C9QJ‚0:5454483(2‰|‚–€O~~}{yxwvutsqponlljigfeccb`_^\[ZYXWUTRQQPNMKJIHHFECB@??=<;98765322,7/C@?>?C8QJ‚0:45€483(2‰|‚•€P~~|{zywuutsqpnmlljhgfeccb`_^\[ZYXVUTRQQONMKJIHGEDCA@?><<;987653200+6.C@AA>A8PJ‚/:5443483'2‰|‚”€Q~}|{yxwvussqpnmlkjhgfeccb`_]\[ZYXVUSRQQONLKJIHGEDCA@?>=<:98665311//*6.B?>@?C8OI‚.95383'2‰|‚’€S~}|zyxwuutrqonmlkjhgfecca`^]\[ZYWVUSRQPOMLKIHHGECBA@?>=<:97664320/-.)6.B?>>=B8PI‚/93455483'2‰|‚‘€B~}|zyxvuutrponmlkjhgfdcba`^]\ZZYWVUSRQQNNLKIHHGECBA@?><;:87664320/€-'6-B@??<@7OJ‚093325483'2‰|‚€U~~}|zyxvutsrponmlkjhgfecb`_^][ZZXWVUSRQPNNLKIHHFECCA??><;:87654210.--++%6-A??@>A7NH‚/93432172'2‰|‚€V~~}|zyxvuusrponlljihfedcba_^][ZZXWVTSQQPNMLJHHGFECB@??=<;:8765321/.--+)*$6-A><>>B7NI‚083€4362'2‰|‚Ž€W~}{zxwvuusrpomlkkihfedcb`_^\[ZZXVUTSQQONMKJHHGFDCB@??=<;98765331/.--+*((#6-A>==;?7OH‚083424362&2‰|‚€N~~}{zywuutsqpnmlkjigfeccb`_^\[ZYXWUTRQQONMLJIHGEDCA@?>=<;98665321/.-,+)('&"6,A€>=;:97765321/.-,+)('%%!6,A=A6MH‚/83255372&2‰|‚Š€[~}|{yxwuusrqonmlkjhgedcca`_]\[ZYWVUSQQPONLKIHHGEDCA??><;:97664320/.-,**(&%$%6-A=;<<@6MI‚.73213372&2‰|‚‰€\~}|zyxwuutrponllkjigedcba`^][ZZYWVUSRQQOMLKIHHFEDCA??><<:87664320/--+*)(&%$#"6+A<==:=5MH‚07€3 1062&2‰|‚ˆ€]~~}|zyxvutsrqonmlkjhgfdcba_^][ZZYWVUSQQPOMLKIHHFEDBA??><;:87663310..-,*)(&%$$""6+A=<=<;:87654310.--+*)'&%$#! 6+A=<=;?5LH‚/73313252%3‰|‚†€_~}{zxwvutsrpomlljigfeccb`_^][ZYXVUTSQQONMKJIHGFDCB@??=<;987653210.-,+*('&$$"! 6+A==<;?5LH‚173252%3‰|‚ƒ€b€~}|zyxvuusrponmlkihgeecca_^][[ZXWVUSRRPNMLKIIHFEDBA@?><;:87754320/.-,*)(&%%$"! 6+@=>>=<<:87654320/.-+**('&$#"!!7+?<;;:?5LG‚ 173262%1tzxZwvutrqomllkihfedcb`^]\ZYYWUTSQPONLKJHGFECBA?>=<:98753320..,*))'&$#!  5*?€<:=4KG‚F 173212161&:Ş›˘Ÿ  Ÿžž››™˜˜—–•”“’‘‘Œ‹ŠŠ‰ˆ†…„ƒƒ‚€~}{{yyxxvuusrr€p onmlkjhggf€ebba`__^\€[YXVVUTSTQSF5*=<<=<=4KG‚ 063323260) S˙ĝ˙ŝÔ˙ŭ˙ç%1,=;9;;?4KG‚ 253232260( N˙öŝúœû†úó€ï'ġüġïóúóùúúô÷ûúùñïïîôĝŭŝüùûüüûúüüûú÷ġúû€ü÷ŝß),=<;:8<4JG‚ 253233260) T˙ö˙ŝż˙ŝóöú˙üúúŭŝúûû˙ŝŭŭüûú˙ŭ˙(,;€<9=3IF‚ 253 252#"#ĉ˙ü˙ŭ ŝC˙ŭ˙òxNTRħ˙ĥ[dU˜ĝwŜ˙˙ˆ½˙ú÷~XfSŬœ˙ö˙ŝ˙˙ŝŝ˙˙ú˙Ԕ˙ú˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝž˙Dŝ˙ü˙&Šİ~,ß.d„…Ż_˙ʝ˙˙˜ ‹€mڈ,dw˙Ğ]]ÊáYb†˙ié¨^VŻ˙˙ċ(+<;998;3IF‚ 46323225458 ,íŝü˙ŝŸ˙Bŭ˙ç4n‘}<ÏAú˙H‘Yíp˙˙x˙ùû˙‹.Ĵž1aN5éYrӈ-˙!FaÄ˙˙ä(+<;::9;2IF‚,67334328+76 1ïŝü˙ŭœŝDŭ˙û˙ċi?Àġ%İ°&\v+]X˙˙3ĥސŜƒ_˙E2YdŠÇĈüm1Z˙üç(*:99<:<2HF‚.$2423256.56 .ë˙û˙ŝ˙Bŭ˙ép˙q¤˙•5D1uènç>ğž˙úîV7D/É­ƒ˙k ;=‡È8TRÔ˙E—c=@Ş˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöž÷ù˙íñ˙÷ĝŝ˙ û˙ù˙ûüüö÷ù˙üü˙ú˙úŭ˙˙üü˙ŝ˙ùúƒ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qt”sˆtvstwtsv€x wuvtxuuvttux&vuvswvvwxvvxwxutxvwxyv}L97#>8898;2IG‚!E/4)8033223166,9;!—†‚ƒ€€;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799::9†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙(ŭ˙ĉ%7:IHGHGK@VP fD &I\˙ö˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP€,B"/"p˙ô˙ŝŝ…˙?ŝ˙÷˙†XP€*X`nOC<51,'%$$""   <|‚}‚€‚~~‚„|oiS' €  €  ƒ ) #Sˆ~}~|zywvuusqqonh71 7ZdO?WPD3Q~XL@:51+)'%$#" €   #~…}|…„ƒxjbS:  /  U~~xzywvuusrponlh ' 9PgQGAVP1IA5ŠcUI@:50,('%$$"" €$  d„‰‡‡‰ncYG3*   €„€+ (tywvutsqpnnjo\ 9J`WDL?WP>IM ‰u]SG?850,*(&&%"# ! ! )Mg[7;=/    €-  Gxvvtrqponko_#:FZ`GHJ@VPRp‘e]PG@941/+(('%$€#"! €" €  ‚%   1tqsponmkoL=CS]EFFJ@VP\!<˘tgXNE>842/,+)(&$%$$#€" !   € €€  'znpomkoJ:510.-+(&$%&%%$#" !  €ƒ €   ?tmlmh8 $?ALZPEGGFI?VP‚+: GĞwr_ULD?:52/-,,(‚%&&€#! €€€€  Znmh3)>AJ\GFHEHEJ?VPD &> ›vn\RJE?;:51//*(&&(()(&%$#! #€‚‚€ (uV( 0>@JYN5L€GEI?VP‚;'4­…xj\PJG@<8521.,€(€)(&&$!  € €€†€C"4?DK[A48HGFHFJ?WP„2 :9pİ{weZOLD?;8452/-+**())(''#@)   €€ƒ 8@DMT`58GGDFGI?WP‚ 6B! •˜yqeXQKD?;76440-,‚+*(#y€pY. !€€ƒ€2(:BGQS`[77HFFECI?VP‚7A8 /݈{naXPIC?=:8531-,-+*&1}~„†‡@ ‚ €=X?KQV`aW68HFEFDH>UQ‚ 8?=4X°|h`VNHB=;:7441‚.-,'M‡}|*"#! ! !€€5IYGSWbb[W77HFEEDG>UP‚ 6?9>9 tŞue_TNHA>:875730,€.0#€j„~€ƒ}…J $&$#"#€! ""#""#"!! /!  _XOXehZ[U67HFFEEH>UP‚' 8?98<7 „Ĥzqf\SNHD@<987641-//0!(€ ~* '%&€%"!#%%€$#€"!"!€ €!#‚" !#'lMYdk[ZZT67HEEFEI>UO‚5?::7:8$ |skaXRIDC>;;:761 Z†}~‚9%*((''#$&''&%&$„#" " !€"#"$€%$%%';kFip^YZXS67HE€CG>UM‚D5?9::98;- oŸqnd[TMIFAA><:743.;†}€€}†a $ #,++*)'&()*)(*'%&‚%&#%$%$%%''&'('*D]Jx]ZZWWQ77H€ECF=UO‚'6>89:;8;="G™‹nql_XPKGDBA@@;;,j†~€€ ~ƒ2 $!!-0€. ,**,,-+**(€' (()('%$&''((&'€(*(*,AW]nT[WVVP66H€EDG=TO‚$7>788::<;)03†’wmmh\TOIIGECA>+0}ƒ€~†a$ +400//1./1€. -,+)*++**)€(*)*('€)*++,, 9[[]XWVTTN65GEDDCG=TN‚&7>89786<8.,=WŽˆuojd_XSLMMLB&U†~‚€4)!(83211212311//0.,,+,,.,+ **+*,+,,-..*6aWYWVUSRM75GEDEDG=TN‚%6>89897;7.4ŠM%iŠˆwjc_\XWRSA)vƒ€ ~…` &'&::76‚5422330.2€/-,‚+-//.011,7[XWUTSQRL75GEEFCG=TN‚5>€898<7,1‰€zE%\|…€qib[b^0Q†}„€~„;-$:@<:987€87€563112210€/.//.//1€4540‚;ZUVTSQPPJ65HEDECG=TN‚6>€897<7-2Šy„ƒ`*:]qxxrb=&,y…€„q" ')6D>@=:;€::996786645211/311224455766794:YTURRQPOI64HEFEBG=SN‚$4>99898<7-2‰}}…lI$'"*(a„~†€ }…E-1KCA€? >>=<:;;9:76/44665657789:99:97?XSSQQONNH74FEDFEH=TN‚#4=89::7<7,2‰|‚~„ƒu_?&-0c†~Š€ |) 3KNGGDC@AA>=><;<:8698698788:€;%<==@B?<# AVQRQONLLG64FDBDCG=TN‚"4=767:8<7,2‰|‚~~‚„„{sweau‚‰€K~…f OVPNIHGFFB@>=<=<9::9:<;<=<>A@DBDCEHEH,!!?UPQNMLJJE64FDDCAF=SN‚4=87686;7,2‰|‚€€~~€€‚„ƒ~Š€A|‡O 7iUUQMLJJGFDD@?=>A@??>@@BDEGHGIJHJNLM;! ?TOOMLJIID73E€DBF‚v*3croe_[VSQRQOKNMLKKONOPOQQTVXY\XZ\]^\-$DPLLJIHGGA73EC€BF63DCCDBE;RM‚3;8€74:5*2‰|‚ž€G}„s?.g›“‚…€~~}yxvwvvxy{{}}€€‚ƒ‚…‹•P$ (JLIHHFEDBB<73DBADCF;RL‚2;67876:5)2‰|‚ €E€^. 0ax…‹Š…~{~€€~€ƒƒ…‡Š‘˜œƒA $!%ELIIHGEDBA@<73DCAA@D;RL‚0<54566:5)2‰|‚Ħ€:}{vg>  ,I\w…‘’”–•—˜—šŸ˘Ĥ¨¨£ •‡j@$ )ELIIHFEDBA?@;72D€B@C:RL‚2;65654:5)2‰|‚ €€~8}xyzwkR2'>MgpwŒ…|zkTJB4" ! (:JKHIHFEDB@?>?972D€BAE:QL‚0;5656484)2‰|‚Ÿ€F~}{zzxutuvyjMB2   **1:LNKHIGFECB@??==772DA@@AE:QK‚1:5€6494(2‰|‚ž€G~~}{yywvvurploopni_ORF/,)&(.-..2306E@?KKPPLIIHGFDCB@??=;;672DA@@?B:QK‚1:4356685(2‰|‚œ€~}|{zywvutrrqplkihg€h2geed`a`]\YWXUTTSTPNKJJIHGEDCB@?>=<;:461EAAB@C9QK‚194334485(2‰|‚›€@~~|{yxwvutsqonlmlkjgecba`^]]ZYYXWVTSRPPNMLLJHHGEDCA@?><;:98370D€A?D9OK‚0:4544383)2‰|‚š€K~~|{yxwuusrqpnmlkjhgfeddba`^]\[ZXWVTRRQPNLKIHHGEDCA@?>=;:977271DAAB?C9PJ‚0:‚483)2‰|‚™€L~}|{yxwuutrqonmlkjhgfdcb`_^][ZZXWVUSQQPOMLKIHHFECBA@?>=;:8766170DBAA?C9QJ‚0:4545483(2‰|‚˜€M~}|zyxvuusrppnllkjhgedcba_^][ZZYWVUSRQPNMLJIHGFECB@??><;:87754/70BABB?B9QJ‚195483(2‰|‚—€N~~}{zywvutsrpommlkihgedcb`_^\[ZZXWVTSRQPNMLJIHGFECB@??><::876543.7/B@>@@C9QJ‚0:5454483(2‰|‚–€O~~}{yxwvutsqponlljigfeccb`_^\[ZYXWUTRQQPNMKJIHHFECB@??=<;98765322,7/C@?>?C8QJ‚0:45€473(2‰|‚•€P~~|{zywuutsqpnmlljhgfeccb`_^\[ZYXVUTRQQONMKJIHGEDCA@?><<;987653200+6/B@AA>A8PJ‚/:5443474'3‰|‚”€Q~}|{yxwvussqpnmlkjhgfeccb`_]\[ZYXVUSRQQONLKJIHGEDCA@?>=<:98665311//*7.A?>@?C8OI‚.95384'3‰|‚’€S~}|zyxwuutrqonmlkjhgfecca`^]\[ZYWVUSRQPOMLKIHHGECBA@?>=<:97664320/-.)7/B?>>=B8PI‚/93455474'3‰|‚‘€B~}|zyxvuutrponmlkjhgfdcba`^]\ZZYWVUSRQQNNLKIHHGECBA@?><;:87664320/€-'6.B@??<@7OJ‚093325484'3‰|‚€U~~}|zyxvutsrponmlkjhgfecb`_^][ZZXWVUSRQPNNLKIHHFECCA??><;:87654210.--++%6-@??@>A7NH‚/93432172'2‰|‚€V~~}|zyxvuusrponlljihfedcba_^][ZZXWVTSQQPNMLJHHGFECB@??=<;:8765321/.--+)*$7.A><>>B7NI‚083€4362&2‰|‚Ž€W~}{zxwvuusrpomlkkihfedcb`_^\[ZZXVUTSQQONMKJHHGFDCB@??=<;98765331/.--+*((#6-A>==;?7OH‚083424362&2‰|‚€N~~}{zywuutsqpnmlkjigfeccb`_^\[ZYXWUTRQQONMLJIHGEDCA@?>=<;98665321/.-,+)('&"6-A€>=;:97765321/.-,+)('%%!6-A=A6MH‚/83255372&2‰|‚Š€[~}|{yxwuusrqonmlkjhgedcca`_]\[ZYWVUSQQPONLKIHHGEDCA??><;:97664320/.-,**(&%$%6-A=;<<@6MI‚.73213372&2‰|‚‰€R~}|zyxwuutrponllkjigedcba`^][ZZYWVUSRQQOMLKIHHFEDCA??><<:87664320/--+*)(&%$#"6+A€=:=5MH‚07€3 2062&2‰|‚ˆ€]~~}|zyxvutsrqonmlkjhgfdcba_^][ZZYWVUSQQPOMLKIHHFEDBA??><;:87663310..-,*)(&%$$""6+A=<=<;:87654310.--+*)'&%$#! 6+A=<=;?5LH‚/73313261%3‰|‚†€_~}{zxwvutsrpomlljigfeccb`_^][ZYXVUTSQQONMKJIHGFDCB@??=<;987653210.-,+*('&$$"! 7+A==<;?5LH‚173261%3‰|‚ƒ€b€~}|zyxvuusrponmlkihgeecca_^][[ZXWVUSRRPNMLKIIHFEDBA@?><;:87754320/.-,*)(&%%$"! 7,@=>>=<<:87654320/.-+**('&$#"!!6+?<;;:?5LG‚ 173262%1tzxZwvutrqomllkihfedcb`^]\ZYYWUTSQPONLKJHGFECBA?>=<:98753320..,*))'&$#!  6+?€<:=4KG‚F 173212161&:Ş›˘Ÿ  Ÿžž››™˜˜—–•”“’‘‘Œ‹ŠŠ‰ˆ†…„ƒƒ‚€~}{{yyxxvuusrr€p onmlkjhggf€ebba`__^\€[YXVVU€TQRG5*=<<=<=4KG‚ 063323260( S˙ĝ˙ŝÒ˙ŝ˙ŭ˙ċ#1,=;9;;?4KG‚ 253232260( N˙öŝúœû†úó€ï;ġüġïóúóùúúô÷ûúùñïïîôĝŭŝüùûüüûúüüûú÷ġúûüûüö˙Ŝ*,=<;:8<4JG‚ 253233260) T˙ö˙ŝż˙ŝóöú˙üúúŭŝúûû˙ŝŭŭüûúŝŭ˙ä(,;€<9=3IF‚ 253 252#"#ĉ˙ü˙ŭ ŝC˙ŭ˙òxNTRħ˙ĥ[dU˜ĝwŜ˙˙ˆ½˙ú÷~XfSŬœ˙ö˙ŝ˙˙ŝŝ˙˙ú˙Ԕ˙ú˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝž˙Dŝ˙ü˙&Šİ~,ß.d„…Ż_˙ʝ˙˙˜ ‹€mڈ,dw˙Ğ]]ÊáYb†˙ié¨^VŻ˙˙ċ(+<;998;3IF‚ 46323225458 ,íŝü˙ŝŸ˙Bŭ˙ç4n‘}<ÏAú˙H‘Yíp˙˙x˙ùû˙‹.Ĵž1aN5éYrӈ-˙!FaÄ˙˙ä(+<;::9;2IF‚,67334328+76 1ïŝü˙ŭœŝDŭ˙û˙ċi?Àġ%İ°&\v+]X˙˙3ĥސŜƒ_˙E2YdŠÇĈüm1Z˙üç(*:99<:<2HF‚.$2423256.56 .ë˙û˙ŝ˙Bŭ˙ép˙q¤˙•5D1uènç>ğž˙úîV7D/É­ƒ˙k ;=‡È8TRÔ˙E—c=@Ş˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöž÷ù˙íñ˙÷ĝŝ˙ û˙ù˙ûüüö÷ù˙üü˙ú˙úŭ˙˙üü˙ŝ˙ùúƒ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qt”sˆtvstwtsv€x wuvtxuuvttux&vuvswvvwxvvxwxutxvwxyv}L97#>8898;2IG‚!E/4)8033223166,9;!—†‚ƒ€€;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799::9†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FOD_˙÷˙ŝ†˙?ŝ˙ĝ˙=:$|˙ĜÉ˙ħ8UHS×áÓġÎòŝÙ˙êò†-ú˙Œ(ë)A[;ђ T§ŭŭüŸ<$;ö‰˙ ŝ˙ŭ˙ċ$8:IH€GJ@VP€1"Y(7>LF6c˙÷˙ŝ†˙Aŝ˙ġ˙|`ù÷İ>ÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙(ŭ˙ĉ%7:IHGHGK@VP lF  !*I\˙ö˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP€,C"'p˙ô˙ŝŝ…˙?ŝ˙÷˙†Û˙ĝ˙ŝŝ…˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûû˙ÉÚ˙˙Ŭˊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙.ŭ˙è&5;IIGHFK@WP )&$!$  £˙ùŝ˙ŝŠ˙ŝˆ˙ŝ˙ŝ˙ŝƒ˙ŝ˙ú˙ÈĈïòÌ́;h[8!¤˙Q!€c!şÊ”ĵ˙üƒ˙2ŝŝ˙ü˙ç&5;IHGHFI@WO6 )!" ˙úû˙˙‰ŝ˙€ŝ˙˙€ŝ˙!ŝ˙ÀÀĸòħSfSQRY°ìŝ˙´eYNRkĉ˙ÜĴğ˙û†˙0ŭ˙è&5;IHGHGK@WO%*#!    Iôŝù˙ŝ˙€ŝ˙üŽûŭ˙ŝŝ…˙ŭú…˙ŝŭƒ˙8ŝŭŭüüûûüù˙ċ&5;IHGHGK@VP"#)"!$   ;Ì˙üŝ†ûüüŭŝŝ‚˙ŭŝ—˙ ùñö÷ùĝŭ˙ŭ÷ñòôúŝùö÷ûŝ†˙ŭ˙é(5;IHGGFJ@VQ€ $))#!!&"   ż˙ú˙ŝ‰˙ ŝûûüú˙ߞĦŸŒ Ħ Ħ˘Şí˙ŝ˙ü÷òîéċààÛËĵĴ)4;IH€G:K@WM &-*%!"!$,'   l˘ŸĦŞħğÁÏáŜáçìñöü˙˙ŝ˙Î~”x*wwv„Ô˙ŝ˙÷ôïëċáŬßÄż¸ħİ˘ŸĦ—‹†‚}yxwvuto 6:JH€GIAT_Y.H 0*&#"€!!',+# 2~uyywx z…ŠŽ– Ÿ§§}€…’„ƒƒ‚„~~žĦˆƒzˆx@z}~‚ƒƒ€x 6:JHFGFIBRRA# 20'" "!"!!" #'./*# :Š€ƒ„ƒ€„ƒ€~}zx‚€—~ ‚yxy|}€ƒˆ„ƒ€€}|{{yxr6:JHG€H8DE&d,& 33)$&%$""!" !"$*,1$5‡}€}~~€‚ƒ„„ƒ”€ ~ƒƒ‚€€ˆ~€€€€~:|zyxr6:JHGHGHA'8‘ &6:*-+&%#%"! ! "#(+0',w„‚‚€~Ž€„‚‚€€€?~}{zxwwq6:JHGGHC("ˆc94B37/)(%$#"!#! !!"(+/(  q„~ƒ“€‚‚€ƒ}~‚~ƒ}€‚‚‰€B~~}{zyxvvo6:JHGHB)gp#7%0OC=40+*'$%#$!"!!##%)/* q…{‚€€~}}€ˆ‡‰„qrsrƒ‰‡ˆˆ‡ˆ~}}~‚…€~}|{yxwvuun69JHFD RL€74)^ND;4.,*'‚%#" '*/* qˆ|ƒŒ€&€€}~ƒˆ‡‚{_c@+01) )23-Ce_z†‡„~|‚‚€~~|{yxwuusrl6:IHCFr_P C= "eZLC;3/-*'&$#"#""#(.*  Y…}ˆ€ €~€‚‰ƒnT<ƒ5 5UmƒŠ„~}‚€€~}|{yxvuutrqk7:JCIWOEGGFI?VP‚B*?F²mcZRLHD@;9953//22100/.++%'11.,)'$$ €4$')** Znmh4+>=HYFGHEHEJ?VP> &BĤ|kaYTOHF><;97223125530/-()4+*'# ‚€€ "'% (tX) 0<94236873210, )"$! €!  €"$E%4=AIY@48HGFHFJ?WP„A :=s³†…sh^ZRNIFCB?=:746577343-@*  $ " !#""! ! !!€ €5?BKT_58GGDFGI?WP‚0 6C# š£…~th_ZTNJHEBA=<89778854/ x€qX0(€$ "%$"#$""#$#"€ !! €€ !€€2'9>EOQ`[77HFFECI?VP‚37@8 /¸“…|qg_ZTMJHFDA?=99::;87/.|ƒ†‡@")($'%‚' ('%" !#$"##"‚!"€! !€  >T=JMT``W68HFEFDH>UQ‚z 8?<5Zğ‹‡woe^XRLJHFCB@<<;==;:-I†}|*")-,,-*)*(),*)*)(%%&&($%&&%$$%&''&&%&'#""!#IWEPUaa\W77HFEEDG>UP‚Q 6?9>9 x´‰ƒumd]VQLJGFFC@?:9>=?*d„~ƒ}†K $/1//-,-+)--.,-//,++(&)('&'&&'((€)%++)'($' ^WMVdgY[U67HFFEEH>UP‚& 8?98<8 ‡Ż…}ume_WSPKIGFFC@<>>@%'}‚€~, % $420//0-,/00/011/,-,+**())*))+..- *-#'kMUci[ZZT77HEEFEI>UO‚<5?::7:9% „°‹€ypjb[VRMLJJIDBBA@Z†}~‚;!#!.85421.04€3103/.0././/,+,*,.-,--/110/212#;kGho^YZXS77HE€CG>UM‚5?9€:G8;+ rŞ‹~|ukd^\WTONMLIDF9 :…}€€}†a! )#)998542157855641212213211//0/13302€5"E[Jv]ZZWWQ77H€ECF=UO‚'6>89:;8;>"H¤š|}rib^ZWVTRPLL6i†~€€~„3)&%8@;<;<65<;9979634546$1/21353144546687! BW[mU[WVVP77H€EDG=TO‚$7>788::<;)/4Ÿ„}}woga_][XVTQ12}ƒ€~†b #)$4E>>=>?=?@?><::778€97€6,55865456768:98"9[[]XWVTTN75GEDDCG=TN‚&7>89786<8.,<[œ–…~}urld`a`aS(V†~‚€7/&0IDA??A€B A??A@=::8::;<€;+987:9;::9=<<7!6^WYWVUSRM75GEDEDG=TN‚%6>89897;7-5‹M&r•˜‰{vrnmkejL,v‚ƒ€ ~…a *.,LLHF€D=FEBBCDE@?>=?A@?=>;::89;<=€898<7,1‰€zD%eŠ–’…zupvq5P†}„€~„<4)ISLLJIIJJHIG€F5BABCC@@>>=>?>>?>ACCDEF>  ;ZUVTSQPPJ75HEDECG=TN‚6>€897<7-2Šyƒ„b+@fŠ‹†uI&.y…€M„q# -.CZQROLMLKKJIHGHGEEFCBA@CBCCBDEFFHFHHJC  ! 99898<7-2‰}}…€lH ),'+*cƒ~†€}…E3=`VUTRPQPONLM€KHG EGGEEHEGHIIJJ€KG"" @XSSQQONNH74FEDFEH=TN‚#4=89::7<7,2‰|‚~„ƒvaA(-3c†~Š€|, ;[bZYXVTSSPOP€N LJHJJIKIJJIKML€N#OSTQO( !!BVQRQONLLG64FDBDCG=TN‚!4=767:8<7+2‰|‚~~ƒ„|rxeaw‚Š€K~…h! #_meb\]\ZZWTQPOOMKMLLMNNOPRSRSUUYVW]XY4! "#@UPQNMLJJE64FDDCAF=SN‚4=87686;7+2‰|‚€€ ~~€‚‚„‚‹€@|‡P ?jleb`^\_[VWSSPQTSRTRPTWXX[\\]][^c_aE! "!?TOOMLJIID73E€DBF‚v+9v‡‚|vrohiihecdcb_bcddfeefjklnqnpqorn0""&DPLLJIHGGA73EC€BFƒu/Zƒ†ˆ†‚~wyutqpnnmmooprrprtwvvy|y{~€<% ",KMKJIHHFE@63F€C@D;SM‚3<‚6;6+2‰|‚€H~ƒt/"V‡ŒŠ‰†~}{}yz|~{~}}€ƒ†„†ŠˆŠŠŒ7$"!8OJJIHGEDD>73DCCDBE;RM‚3;8€74:5+2‰|‚Ÿ€}„tA-pĞĤ—˜““’“’€‹.ŒŽ’”“••”“•›Ĥ]'""*IKIHHFEDBB<73DBADCF;RL‚2;67876:5)2‰|‚ €E€`21h…•—“‘ŽŽ“’”“‘””—™šž£¨­Ż”L!'#(ELIIHGEDBA@<73DCAA@D;RL‚0<54566:5)2‰|‚Ħ€:}{uh@  .Lcƒ• £¤§İĤİŞİ­°²·ğı³°£”uI"'",ELIIHFEDBA?@;72D€B@C:RL‚2;65654:5*2‰|‚ €€~8}xzzwkT5 (BTmz‚•™›œ‘††t\QH7% &$+?972D€BAE:QL‚0;5656484*2‰|‚Ÿ€F~}{zzxutuuxkOE5   "-.4;LNKHIGFECB@??==772DA@@AE:QK‚1:5€6495(3‰|‚ž€G~~}{yywvvurpmoopnj`QSH2/,*+0011772:FA@JKPOLIIHGFDCB@??=;;672DA@@?B:QK‚1:4356685(2‰|‚œ€I~}|{zywvutrqqplkihhghgfeeda`_\\YYWTTSSTQOKJJIHGEDCB@?>=<;:461EAAB@C9QK‚194334485(3‰|‚›€~~|{yxwvutsqon€l.kigfdba`^]\ZYYXWVTSRQPNMLLJHHGEDCA@?><;:98371D€A?D9OK‚0:4544383(2‰|‚š€K~~|{yxwuusrqpnmlkjhgfeddba`^][[ZXVVTRRQPNLKIHHGEDCA@?>=;:977271DAAB?C9PJ‚0:‚483(2‰|‚™€L~}|{yxwuutrqonmlkjhgfdcb`_^][ZZXWVUSQQPOMLKIHHFECBA@?>=;:8766170DBAA?C9QJ‚0:4545483(2‰|‚˜€M~}|zyxvuusrppnllkjhgedcba_^][ZZYWVUSRQPNMLJIHGFECB@??><;:87754/70BABB?B9QJ‚195483(2‰|‚—€N~~}{zywvutsrpommlkihgedcb`_^\[ZZXWVTSRQPNMLJIHGFECB@??><::876543.70B@>@@C9QJ‚0:5454483(2‰|‚–€O~~}{yxwvutsqponlljigfeccb`_^\[ZYXWUTRQQPNMKJIHHFECB@??=<;98765322,7/C@?>?C8QJ‚0:45€473(2‰|‚•€P~~|{zywuutsqpnmlljhgfeccb`_^\[ZYXVUTRQQONMKJIHGEDCA@?><<;987653200+6/B@AA>A8PJ‚/:5443483'2‰|‚”€Q~}|{yxwvussqpnmlkjhgfeccb`_]\[ZYXVUSRQQONLKJIHGEDCA@?>=<:98665311//*7/A?>@?C8OI‚.95383'2‰|‚’€S~}|zyxwuutrqonmlkjhgfecca`^]\[ZYWVUSRQPOMLKIHHGECBA@?>=<:97664320/-.)7/B?>>=B8PI‚/93455483'2‰|‚‘€B~}|zyxvuutrponmlkjhgfdcba`^]\ZZYWVUSRQQNNLKIHHGECBA@?><;:87664320/€-'6.B@??<@7OJ‚093325483'2‰|‚€U~~}|zyxvutsrponmlkjhgfecb`_^][ZZXWVUSRQPNNLKIHHFECCA??><;:87654210.--++%6-@??@>A7NH‚/93432172'2‰|‚€V~~}|zyxvuusrponlljihfedcba_^][ZZXWVTSQQPNMLJHHGFECB@??=<;:8765321/.--+)*$7.A><>>B7NI‚083€4362&2‰|‚Ž€W~}{zxwvuusrpomlkkihfedcb`_^\[ZZXVUTSQQONMKJHHGFDCB@??=<;98765331/.--+*((#6-A>==;?7OH‚083424362&2‰|‚€N~~}{zywuutsqpnmlkjigfeccb`_^\[ZYXWUTRQQONMLJIHGEDCA@?>=<;98665321/.-,+)('&"6-A€>=;:97765321/.-,+)('%%!6-A=A6MH‚/83255372&2‰|‚Š€[~}|{yxwuusrqonmlkjhgedcca`_]\[ZYWVUSQQPONLKIHHGEDCA??><;:97664320/.-,**(&%$%6-A=;<<@6MI‚.73213363&3‰|‚‰€\~}|zyxwuutrponllkjigedcba`^][ZZYWVUSRQQOMLKIHHFEDCA??><<:87664320/--+*)(&%$#"6+A<==:=5MH‚07€3 2062&3‰|‚ˆ€]~~}|zyxvutsrqonmlkjhgfdcba_^][ZZYWVUSQQPOMLKIHHFEDBA??><;:87663310..-,*)(&%$$""6+A=<=<;:87654310.--+*)'&%$#! 6+A=<=;?5LH‚/73313252%3‰|‚†€_~}{zxwvutsrpomlljigfeccb`_^][ZYXVUTSQQONMKJIHGFDCB@??=<;987653210.-,+*('&$$"! 7+A==<;?5LH‚173252%3‰|‚ƒ€b€~}|zyxvuusrponmlkihgeecca_^][[ZXWVUSRRPNMLKIIHFEDBA@?><;:87754320/.-,*)(&%%$"! 7,@=>>=<<:87654320/.-+**('&$#"!!6+?<;;:?5LG‚ 173262%1tzxZwvutrqomllkihfedcb`^]\ZYYWUTSQPONLKJHGFECBA?>=<:98753320..,*))'&$#!  6+?€<:=4KG‚F 173212161&:Ş›˘Ÿ  Ÿžž››™˜˜—–•”“’‘‘Œ‹ŠŠ‰ˆ†…„ƒƒ‚€~}{{yyxxvuusrr€p onmlkjhggf€ebba`__^\€[YXVVU€TQRG5*=<<=<=4KG‚ 063323260( S˙ĝ˙ŝÒ˙ŝ˙ŭ˙ä#1,=;9;;?4KG‚ 253232260( N˙öŝúœû†úó€ï;ġüġïóúóùúúô÷ûúùñïïîôĝŭŝüùûüüûúüüûú÷ġúûüûüö˙Ŝ*+=<;:8<4JG‚ 253233260) T˙ö˙ŝż˙ŝóöú˙üúúŭŝúûû˙ŝŭŭüûúŝŭ˙ä(,;€<9=3IF‚ 253 252#"#ĉ˙ü˙ŭ ŝC˙ŭ˙òxNTRħ˙ĥ[dU˜ĝwŜ˙˙ˆ½˙ú÷~XfSŬœ˙ö˙ŝ˙˙ŝŝ˙˙ú˙Ԕ˙ú˙ŝ˙û˙â),;;8;:>3IF‚ 0533€2 469)é˙ü˙ŝž˙Dŝ˙ü˙&Šİ~,ß.d„…Ż_˙ʝ˙˙˜ ‹€mڈ,dw˙Ğ]]ÊáYb†˙ié¨^VŻ˙˙ċ(+<;998;3IF‚ 46323225458 ,íŝü˙ŝŸ˙Bŭ˙ç4n‘}<ÏAú˙H‘Yíp˙˙x˙ùû˙‹.Ĵž1aN5éYrӈ-˙!FaÄ˙˙ä(+<;::9;2IF‚,67334328+76 1ïŝü˙ŭœŝDŭ˙û˙ċi?Àġ%İ°&\v+]X˙˙3ĥސŜƒ_˙E2YdŠÇĈüm1Z˙üç(*:99<:<2HF‚.$2423256.56 .ë˙û˙ŝ˙Bŭ˙ép˙q¤˙•5D1uènç>ğž˙úîV7D/É­ƒ˙k ;=‡È8TRÔ˙E—c=@Ş˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöž÷ù˙íñ˙÷ĝŝ˙ û˙ù˙ûüüö÷ù˙üü˙ú˙úŭ˙˙üü˙ŝ˙ùúƒ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qt”sˆtvstwtsv€x wuvtxuuvttux&vuvswvvwxvvxwxutxvwxyv}L97#>8898;2IG‚!E/4)8033223166,9;!—†‚ƒ€€;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799::9†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"·˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûsŽ˙ġ˙úûûûûûûûûûûûûûúûûûûûûûûûûûûûûûûûûûûûûûûûûúúúúúúúúúúúúúúúúúúúúúúúûúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúûúúúûú˙=Ġ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ö˙ˆë˙ŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝŝŝŝŭŝŝŝ˙ŝŝŝŝŝŝŝŝŝŭŭŝŝŝŝŝŝŝŭŭŭŭŝŝŝŝŭŝŝŭŭŭŝŝŝŝŝŝŝŝŝŭŝŝŝŝŭŭŝŭŝŝŭŝŭŝŝŝŝŝŭŭŝŝŝŝŝŭŝŝŝŭŭ˙ĝ˙ !˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙˙ŝ˙˙ŝŝŝŝŝ˙˙ŝ˙ŝŝŝ˙˙ŝŝ˙˙ŝŝ˙ŝŝŝŝŝŝ˙˙˙ŝŝ˙˙˙˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝ˙˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙˙˙ŝ˙˙ŝ˙÷˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙ŝŝ˙ŝ˙ŝ˙ĝ˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨5ô˙ŝŝŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŝŝŝŝŭ˙÷˙¨3¨è˙˙˙˙˙˙˙ŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨p˙ü˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨$üöŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ö˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨À˙ĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨Â˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ş˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨Â˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŝŭ˙÷˙¨s˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨T˙÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙İM˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙İŜ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŝ˙ù˙°rİ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙ĝô%|˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŝŝ˙˙ŭ%;˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŝŭ˙ú˙ĈŜ˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŝŝ˙ŭŝAż˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙´ˆ˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŝ˙ĝ˙¨T˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ˙˙ŝ˙ĝ˙¨<ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙ŝ˙ĝ˙§ ×˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙ŝ˙ĝ˙¨ß˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨š˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙¨˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙¨Q˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙÷˙¨(ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ˙ĝ˙¨Ċ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŭ˙ĝ˙¨˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙ŝ˙ĝ˙¨5˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨%ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙÷˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝŝŭŝŭŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŭŭŝü˙÷˙¨!ñ˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙˙˙ŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§#ò˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŭŭ˙ĝ˙Ĥ#ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙Ĥ#ó˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙Ĥ$ó˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ$ô˙˙ŝŭŭŝŝŭŝŭŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŭŝŝŭ˙÷˙Ĥ!˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ç˙ŭ˙ŝ˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ċ˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙ŭŝŝ˙˙ŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙˙˙ŝ˙˙ŝŝ˙˙ŝ˙˙˙˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝ˙˙ŝ˙˙˙ŝ˙ŝŝ˙˙˙˙ŝ˙ŝŝŝ˙˙˙ŝ˙ŝŝŝ˙ŝ˙ŝ˙˙˙˙˙˙˙ŝŝŭ˙ĝ˙ĤÔ˙û˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙ŭŝŝŝ˙ŝ˙ŝŝŝ˙ŝŝ˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙ĤË˙ú˙ŭŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ˙ù˙ŭŝŝŝŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝ˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝŝ˙˙ŝŝ˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙ŝŝ˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝ˙˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙˜§˙ĝ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙’ƒ˙ĝ˙ŭŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝ˙ŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝŝŝ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙>˙ú˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ˆ Ú˙û˙ŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŭŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙‡˙ĝ˙ŝŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙‡ ïŝŝ˙ŭŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭ˙ŝ˙ŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙‡q˙ġ˙˙ŝŭŭŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙÷˙‡˙ôü˙˙˙˙˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙ŭŝŝ˙˙˙˙ŝŝŝŝ˙ŝŝ˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙ŝŝ˙˙˙ŝ˙ù˙€ŝŝü÷úüŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝüŝñ˙[?Éü˙˙˙˙ŭüüüüüüüüüüüŭüüüŭüüüüüüüŭüüüüüüŭüüüüŭüŭüüüüüüüüüŭŭŭüüüüŭŭŭŭüŭüüüüüüüüüŭüüüüüüüüüüüüüüŭüŭüŭüüüüüüüŭ˙˙ŝ˙ŭ˙Ô9œÓçòü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝóòêܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08šó jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2c˙O˙Q2˙R ˙\ PXX`XX`XX`XXXPPX˙dKakadu-v5.2.1˙ š˙“ÏÁŠdƒÎ{ħ'°¤ĥ—)O&2e„˘1x–*lÓdŒyÒà€"ΑòÙ¨áŭ½ˆ|§`D^6Œ#Çíú“ğviÁó—ŭ+İgŜ­˜Ş²İâĝäpj ßeÁó’P€˙f/Ĉ—˘ótWġ'+$?€ĞÏÁâîËú„žˆE–£˘é'ŸBŻ”ĠŠ/ä-JÏeôUÉ\UŽSô‘3F+Cn˜`Ésmù†~l²÷Ll dí@Àî´ĝ Ġ‘ıˆCCy°ıC˜ġ,›Œ{\êÂÜçi×/u§IÚßE>§Ĵ[3"KP÷Âe…HİÉC×ÓGtΔM ŽTġCÊ{²ÑìĞ%yÓzžPZßá@ßqşQnJžĤU‡“­î&´Żœgê' 4ú 8Ñ:$ŝ'*™ĞI'nXì›˘~ƒ-BԄğ/ŽXŭ)ç &Ûz–Ċcwî%H˙V…ŜT/ì‚À|… |ċ !@ĥïĠı™S—jM4ĊNH–(Oâq…•=µ /a…†^nÔâ_L?œ–€4„Áv¸tWx-‰ñğcÀ|ƒ >BpˆJ–V™ 7é^k]?èÁpÔm-Y·lżç8üéí pŭ–‘qG޸z8cĈÇà5€äh¸È% ˘’ĊJƒ”š:ƒĤ[˘ôĉ/£2À.e$ Ĥ9‹ 0€ç/enaÇ[3"ïW]x˙wÇ|#)Vĵù ³bû ŭìÛÇáfGáfÇçdyËûĴzÌïI%·Ñâçì{cğmĈódhıíŠ+J~Nš³É?uîëDz_X~˘9ëVŭÇi4m3Œ·œrŠ7ƒµĜżŻĥsFP;@hµ/O%t€áˆ SŠ>¤ġ“?ĥqŒ%´Ġb­ëYŠ:WÜċĈ Ïl] vĵ7:›ß_~ËŬ*CĥĉêiZ0:y†-{H€ÁyÁme^h~÷•ġcÏ ÎzDĥ“νwìX;^aˆ}È+tWgĝżŬ\Œ!eç↞ö·Ë<ÄZ!âyWáĠÙ&ÍÎÀ|Š`>FP‘x“íc,J„ˆs:,°-˜žÀV`l·.ƒ°jSo9Kxñ½ÌÓ7’‚‘ Ô&ug ënµœSÔѓ'şV¨QsoO5ÑFÑ­Ï0‚³(LĠ]˘œïĴğ³—ƒ„ğëŝp~Ğ„ˆP+2ž2ÊÔîÀ†ÛMÚ¨À]Ĉç›WFÇ\$vJ_„WŞÏÍ*?ĝ~à]߇C€Aş:V ìïkœJsáĞŬ‘éßúµĜHİú$àD4 ›bıÉĥU-ÜÙÊ3Ò^j ׺°·ñk‘ş€ÊyÖë!Ĥ Oİm‰‘Üú}…f+ħJµÚ™s‘ÈCĴ{š8AÏy¤ú#L §Üâ/”Ŝ‡‹\.­+Ì(cA _>X!ˆĝ=żvĤMxaìwÌ7¸AĖa³g™T-}ší9DüùĦúì-£šßD[ÇáÓ üúŽÏ°‡RŬ•âvHyuż`ډMúŞ UĝĵŸÖĝ*‰ìĵÚ#ˆEvNßòK ˜+Ŝ—LöYP;FĦ,Vr€uÌ`q˙/tÑ*ħÏUĥŝF”„ƒŽoü/ÎñSí1*ñËòİ0ó ’kf}ĝ^jcÂ||P(-Ĥ -ċÙfË=żŻHûèLĝ[v,§Ğ"[í Gzw‹E¸xi—‚”“`„cè;Ħí'Ğ2Ó ˜ép.'?óĥ.²Yhô˜ÓM‚R < j˜è8…Ÿ(ú4D7Zhû%Żw”ĦË ÊKY4ƒuŽÀìbëÀqX :֗äžÒWğ9V.oj’ô}Œtw@5 7*– ñ§Ĥž)·ĵn” €]žġoPÎÇż„ϸnY{óY(ŭ˜|b[va°3ü”€SüìˆöÑG£×Ĉ˜ğtÄàFHÓ>€1Bɚ0èu:oaßí@et¤ğ@<°Gò1d<§£ĴkS™˘Ù5q]fœíHbJŽ”G.eĊ:ĊÂ{e/‡àÈΎô[ycµ,dÏ!Dèmó'UŬ%Œ‚ mċíŭ“ÚĜ)×Á’n‘œb0-À̇e,s24J˙^ĴTw6ÈF ÒHŠŻğ·MBÁyHJ¸_ÌÖ4[ù+‡¨÷=s‡Â°”‡ù+‹ükÁäşôԁœ29Ĉ >…f'ìyNCĠ˘™Ô”ĞAšB[ˆ+ÉϜuÚyQ”(h•uwqrŠò6)òUŠŸáVkqt—ıɆ„aşRà˙  –$˘€ĜˆàZ‘ÍdÓs"{´ŒuĞÍÁ9nş37á- ŝch50@?›,–‡•´>J'%%Mn˜ 1jËĥÂfŜÔWÏhœµG§Ŭ-Z0¸ Y‰,Ċ•KB³H,L³k„ Œ!é%еŜĉBt~¸èk|şŞg ÓÂĉŸáÙ½7Á ‰‘ha4›ô]_KıJpV½6ĵû8rÂïŜ$żó„Z£İ{™i2ÇMÙLW>,•4ôOa°–ôë¸äçĉ7ÙG1/ù&e"b-rñ³€ÒG1tô&fwê׍Âóġ§ş²Íìò„m‚2˘c²hmœÍ^7ëÉ‡Żœ˜Ŭ8 ĉCœ)¤+ŭÍÚšŻŸĠ3y­W,ŞSݧ\£Rß´••HœYeħV"AŻ6jİ×9V2¨eÉ#c”Cù(n/’•0ÀßöÌĴDiĊbœ‡ğË2÷Ô0C€^ıô€˘âuƒ#ŝ|ħĈ;WÔni–íaŠcámĜgÉĞ—<>û-ÊŭŞÔiŽÔ·£÷$lÄ>Ïî'!ìÏs—ħGj´P0ĞwJŒ¤XÏ'İq„ĝÀŝJŸËz1_2¤‰&Ŭóħl—VY1c<9ĤÚÑç8¨ş#ÔK3elˆvĠo ´pjŒ¸²ßÍ™àáW?mÍ ñêGĜfDËÏİϊAmĉ—‹óP´½ßí*ıƒsdOiwĊ£ğg|TQû?î‚J'“GWZdš&îÏÎĞŸ1ƒ­•İj–E]ı‡ċN![Ù­UUUħpzLgn *­[Âè(…IJ‰›…+ âĠF†˜ˆíLe ġí(mĦ4‹şÉŸi—6 0ÓħIıQ‡TÚa€µ(jäx|ëe=<‡³ŻĜ•GŻgUÓ´ıOmİ(öDˆh<€t/vÇğċ°Ĥ ˙^:Èû{ŞĦÓIâĊ ÑĉÎn=ċ/û$á0\UČá8ÔÖÙŝ'ŽLĴÎê˜ç+ğĠġ˙OFGfnĊ›Úıa·6íÂŞûĴ%+à–Ŭö÷ĸ›—Ë‘@oÌSßh¨Üëı‚?¸R­Ò^û„şKĈŞy¤uŜĜMJ?§òDéĞ™VO]Ö/û02ÓmĞyŞà.²(I0´K Úşëĵî•2Ù²£ ,èÓqV!  -àĊʗ„°ˆAŞ*żŸK6“Ÿ$4‘°Ö{ô=) 'ĥ‹Á³Ġ7›6ÈU²ÔŞ­ uç˜@Ĝf£Zߑ&)ĜÔ%Œ;k0t˜g6:ŽÍù„ôuûŝŽ”x (•-AL‹ÇΜ÷'nŜĴÖlÑSÖë0ŽÓA˙!a&µíéiŜo(ü1‘D›BÏÏÜB~~ñÑĝ{W€ÓÑ츠ڊÜĵ5ìSbÏġŝ„I$Ò£´^Ì>ĝÒ Í˘ §C&ÉáÏÑê Ù>sıMLE‡ ñm,ÜSßĞf­°Yu:=ĦÏÖ¸6+‹‹Ŝ$6£F<Çdô˜=ĝÄQhZ‹˜C’ Ìĉ³H#âì!’Š,a§Á—@tÉM ¤§˘”(ġoŬĊŸ²G–PšĤÍ7ċÎ -#8é yí̏ˆáÊİ6)r5Ž—g$/²ÎG·ħ-1ވ[m) fj†6ŭ0V˜XŬ?ˆ0§Í£ÚŞNĉÜ|¨ acŽ*K˜³Ô/‚7hĊːož:A·›ŭ~vċqĝ÷><ôê3Q´…˙iÏĝ<ŻsÑÑı?¸•Ò~ÄĞàĦv żŻv–€ĝŬôÂu1'U*ĞŬ‡Ž£.èÛ×ÓµÄgе½÷­œíŒÖÀñ$2 ·(H]ğL/Âü˜np˙3ùÒÄ'ฉ€[³‚Iê\˙8!ĵ)(£DÖJ“żŬóĊ-L‡‰½Ü0Úĉ\ş{NŻŬUj—B½g\NdPvb,şş?Ânµz”>'SÜtV™ƒ€ż+Ĥ&wüĊbZß{Ö9ĤP*ÀHÒ;…[gğŒ\ı§˘Ŝ :¸e Xu*´ĝw-ħ Aŭá`=:OS^­,yç¤Ï5B’’ÍÚ]Ħ‹Qċ£àÇĤqż­¤z#kÉv—xèIf@€gFÍ ­tğc&ğoYÏG‚ÓÁ(ËhŠL{žÜaöÎtN;ĴRÍÇ{JîŬˆ4żĈí_&`Y½QDÁSÌLŬ4›{fÖIǖOàìéĴr¤6ALŻŜr<žĈUŒ”şAû í8\}–Rœ¤â]G<÷Œà$ Ú}Ŝ”^ŜXWbeií—ñ^Ş2í—L]HhŬĵOh.:ú8,™ÜX]½*bL˙ÙàŒ= ŽH@‡Kç"×dož+ô)ċŝ×z‹nAXWÓn˙ bÀĥ|’;ĤĤzĵ0rKê?r…+vu =—C@Ò²ë;çiGÍpŭ‡òŭuÖË<ÎDİ~M˙+˙byݸ•ô.k{Ìk<¸µ’RßÜ'ŠáĉˆNjĦFê¨é-q?ò]ñOΏ(áùàÇS+ĉT}>ês^Pé›2ûHí²kqßŭ"qì—O’bTŝ13ŻĴĦóş4 kċ´²“†ċñ„².™°nW òÒ|ü‡ŸŝLÈĈôÄ(ĝg!‘3c€+uIˆrx•n,vš÷;)Ö˘ĤGħH¨ıĥ˙#‡‘0BZH[œ²àpŠy¨G™UIX£q>Ut· •`ĈO*‚öŻĦÀ/Ž}dİ/ â‰ï0ʏàü#&Ñğ_9Lƒ=Yġ"â1ÌM™5aŒĦ›bs³'ŽŞÈŬçÈÊĦÈ3¨Ġˆù†Ö,&L Ĝ…ú°Á!+R]€› ŬŽkŝàV /Ŭ} %š9Ù2&íĠûŭ\ŭ3GO=P2 ĝugŒħÚîj䔲[›ĉY”ñT]ӓl„ä&\ĵ¸ìU–!`cS_>,‘ÈTé‹ċ­@pZ‘ŒUAëNhq7ï_‡Ĥžo¨tóµŸßġLB#K–g;“>tĥÁZTµûñz4ì.n½IV$ù¸¤l dѽUÁÑäM‘–!ñw3š×Iƒ¨O§ó6¸L¸gr5ÖĞż @|’¤l3\ ŝ9'—”€Ï™wîá]—*ŝ™1á˙…MÈ4ƒŬ÷˙!|ԍ°ÀÖĊħŝÁÓ2p£·ŝşÇ֚G]Üú:ÂAÁ.šƒĦÙϓïşĈ@p§Éù´”Ġá`ݳÏ*mA=„w”âÑlNd5W6ò˘XŭË?%°D(§ˆûòĜġ°&X‘¤1ŭÔàf]ÈûN˜FÂü˙J…„œj ŽŒàuÚ³{ƒî²#ƒäGĤq îuĉĜ÷×pŭ[íşÚU%Ĵ{$³ÈIf@ˆÑÛúŭ1ôO{għeôT×;ÊÁ*~ċ¤uÂbFbÑ(˙m=9Ëv‰OŒsys5ÖÔ ^Qï~ ˜0&b"ÄËĥ7Œ›§j!Öl/ › &Ñĥ ÔÍFM4 Ì-Ş=r Q׀¨ Ŭëò›ÄBVçô Š ld2|N}’Ô@'_qĈϲ|ú<ږ“„ïԞÍ~iú>ìüĥ*ŠÊV µ9c|@ŽVA/`™p+*X›#Cl¤Ŭyîżl>ŒlÀıúZ0ĵĦß; ¤˙nġ‰ˆ&WpnŽoYB  Ħ Nîtĝ‰ ²ËYç‚L:ü:žŭJ2â^ÈshŽŬ™ÒÀ] 1è0ÔŬR@?˙Zˆ°jû&ĝúĞâwMܙr,òşÄ“91³}SMÔZ‰ésׂ°OtB‰†F•ġM×?ùÈmÛF½ŬRB+$Bròw*AÛ§Ar]sŝƒS½èsĜ)NfšsÁ]ċ#ğ}½Œ>p“í0Ö9h)Ġe÷ÀÙ-ö{ț2°ĜìËŜÖÚîÇ9‚¤ÂېĈáoyLĴ‚‘=‚ß˙?ĠŬİ:^·ĵrä}Â^µ56Ì1Ea˘%µ–^ğë-j+pżv ÙİwèŻ˙²Ö‰ü£ħ°x7‹˙_ıi£2˙] N]˙#ħ‰ÂĜ"îĤ;’j7])ŠD–…ĤÖkóW·ĴŭŠËèŻÌuÁ+DM ²_Q—$„CCpICÁ³€&˘$áİÀ?´.˘X'zD§Šg`yaB1žÙLĈ‹iJàĜ0ĝá]Œ+ÑU6TlWìYsQ';zé öĦPB°N=§*OÁ½ŒÖúġ…³÷5o^ïŭè˘#Žúïü`áŝA³r€Nĝ˜qCġó8]6‹ÜÜ/xaj.~âż÷ÏF‹79Ó\t BœÀû}†í|‰+¨Ġb“Ġş£(ôV|Vıßğso5ĞsX]E6rÖ'H& ;yRX °˜éżĤ™ßŻmnÎlDĜföZıÑŭǨŸ ·r(³EÙi°½ußÙlVM%¨íÙ)ˆ“çbÚBÙŜ†s)­9˙,f—>SRÒÇRàÀzÑye×@´ÊCÜ^úİJXĥÇûĒı0óZĠb€ĈÈü{ÉUœf'äŞċŻ•çϙ÷.CG´lˆp-|@gW­`Q^~qéwë´zäíòrĴç†h=còÌxO] „ë:Z̰Âqŭו=ÁX“gú_z=Ê Ż3 Ġ£VëHâŻAıN§ŠÛĞÄx9áiäŜ5m^ÜÏj§#9b@7œVR{Ú³/V‰RƒvÓ C£’U+@ÀŭfßxN_êúÙK*¸† w&ħš~š˜ÊĉÜÙŬÚpŬLd Ôν6ƒéċœÌµĥIfq–B)+ĉ‹Ù½ˆĉ‚è‘DƒĈ’mĥîGŠ€V”üñ›Wĉ:ì\u”ĝÛ”ħ—Iñ@l@y‹ZcŻÙä|&÷éq\g3„;dS'~“ÒĞĜĉŒöħ끓Ò×ċğĉŞÔ ­œm¨WgĴÑ%èsÛç\Ò@/:8x)ŜĦRßmÇ~•—5ġ=Ô Ô~'RìĠ˙İŜt”›ŒĤ€€ZnàsĦsó]<²0.äE/³WŒÍS êBÙOYk.F™²eĞšáù€vÜÎÜMÀNŸó…°^Ĉg§ĈŒH¤”q”£Ç™%q"‚ßħJIK†œZ?öb•|4^ï‹£jÌq%‹ÚĠ;T0 ĥ Áä֒7,w‘¸íÏIxMž ’èÈġv’á{ԏċ{ŜN“ÄÚCûŻ‘…ßAÑâiı$ĵmç(Çöš_²”U!žĈd‹àhşyĜ›\ĝMRÜÛÑ\zĵ÷N÷M‹ŭcK—ä÷ÓY/O%ŸŒŽINÓc…ĞPb²Ê$Âàt$H’4YO“Cñ4ìûKÀÈ DĤW{…ÚJœĦ:4x7_X{'Ĝ>I· r1'BŜœä%2 óZnv%—˙>ÂùŜĤĞ.}é÷ĵbŞ\Ü É_ŞLµd÷5j‚Î$E&vŒ(QĜüÇo<,Ô/a…V–ħĤt}ŭJcFXl` ê]ĉpw˜•ïG‰V7/`êUe YçîË2gD%ßÛ¸hD„§€‹TNv/È~&—Êŭşö^֓m‹š{ìĊĜQbäF”L}ßçŜ˜ ’Ԋ@¸Q5ô[2xuT½1ŝŬM2˘­Pô›Ç)—75f@l SċúFœĈ5¨ĵ:ÛĵҚÔÖĦÏÄgşü€”SCf €›ÂÂï 3AŠ&˙;ëĜÄ 7Ĥó´,ŝÁ—ŻíaŠÈ£ĝ|‹ÉĦ–4 Ÿôg>ŭıô’ú‰öİϊ5§}ù…Ü Ba™ùPÜ À2‚CÚñ{ï“fñA<ûDƒ óal›ŝNô&2JÉ)ĵ?p£­ğfߨ]żórtĴ$ À.[˜:îEV†2Ü5žOÛÖrëOȍ˘V.›*İ´‡p\ĥĈİv(Ż‘f|l‰ìİ9÷-ì˘_Ïq!ÔGiNJVöH•Ç6òız 3elÓ}µĊà_Ë ƒEÎċ‡ ĉŸ5@‡ôĥ QdŬħ˘’]fÔğ FMN…ë* e½t|H¤7CÑôgAfĞì—<X5ážkcÉêNX6iùg(9ĵï˘šf,êÏÄÒCBŜsïİĝÔ²ğj]j°U˜8$ÎÄ]öSÈò>ñTA„h˜Ö ArĦ”şyÌÀô2cÓ)³x,Ôħ1)ĥîĥĝâäÔ=y%½1™˘Ĵzïˆf×5Äĥ-iŻ.p³Ê n‡\û=êèïġ6qhfĞĜ“~£—úâʅŸö~éÌÎ÷úRĴ-nâµgħÜGĥvÚÈ ĵè ΄ϛ˜žç&áfgıĈ&­ Ž ´³ÉŠJâ1ÁpŝĠ4HŻQÜ4ÀÒ0Ċ‚ó„\‰ĉB},î ¨.`\VJ¨HŠV$%İ1$xͧĵw`B] jlu\A5 =£ı->ĝJÉéĈ‘JNkzfŒÜf¤;MĞuÚÉ{›š=;ŞQ2?@ šz<à%µÔV‘;r¤G·_Aİ›ìZZ›oĝâP†{³żÒö…ĵƒš5aĵ”+“ĜxŜVZûĞ2 Kô?g§d‚`§ĜAÌ^L¤o½AĤ³ÄPۍšúҌ` ˘YQġĥ‚ÚnÒ7Á·Ġ)Ç&ü%ċJso oRĝ˙9\7XĊ#\)Éçïw_gĉûF$¨Ÿ1 êRVB+w‡½•ĉtt†öj€‡‰•Ä·.VğhnĦú Ól* Ĉç¤ä3fek”AÏkkIŽĉ:Tbí>²˘ÈĉpÏIçEƒY:*ÇAé-â',í-|/ĝäİ͗˙2-°…3)kP`úʔf—k‰€Ühîz Ä96R•bÀfÚŬr Ütá ë*'îŭ÷ê£şŞ£ŬƒÛdÁŬ(6aĥsŸlÄx›3•j3bżïêS1œ7ÇĴ…•µğ•`°ħ‡ß hl™<[Û˘ 'ltäT)Ş{4İœ•ß, ~ÂÖ÷x°Œ6sz-Ş—OŬ“qJ™xفXWê¤ç%żzœ¸SİÔÛ·ßDY )9a³—ġPÌ8İÓ\Ù²žŒjo/}°8ŞœÑòï¤>4×*|?ĵeá·ïp:1IŞşQ4^Ù²Kİ7}ël;cY4·Ä@†–ÔSŽÚŜq·F™ä ÔdTŸùĊê/öcP YÇ/PÏ~ġĝġC/ê˜6^Âĝżpfzünĉ]öS0>M…dÇf÷Ġ-X0|ÇäĤr=ƒ^Î|-ôŽuïÒqv½Œ,bñ˙`É}ħ† ]VıßÛ ƒ>¤úĥxŠÑù{ĤË­oꨤC˘lµxĴDĜP÷lË^Nî +?\r¤É”Y>LM‚„,_ÍÍl‹)ĉyĞg°cɘ”Q#óòĴ7^ ˘ÔŽ­ŠLFê™<éÌĈJï µĤ0ÒQ‚Â;Dàú½Ç+‹ilaxmd8iŒe+€÷ŝÊ4\"¸ö§¤2Ŝ‰û*Pğ=w.Ûwŭ7ê³°+y!àûpbèÁ¸§1Ŭiğ-ĦEÜğځkĴUˆ-ÑĊ-(¨¸àĦL€ż^´0D‡yíÍÉĠc^ˆ/ŒÀÔê ïÙ@Rpä9ßÖíbe3#;Ħ?1;|DğAéJÊÉñZĜçù[z€j³ÖÔ0÷oŻD‘$k­1?dÌİGq]8€[íĠ3!ÑUÀ|’€ù;]çîÒ0ˆÔûàĤä-ı÷Ÿµ²G1A·aädúNhż&ôÎĦ,z˜ Ä_ûBDzÓDfŠ!úkÍŭ²’f/LòwÚq¸·U2pI)ŽÈÉ]Ë˙ ̙˘ßP8`“#Úm°V‘Yžìá;ìĥHċÁV„ĠóüNÍ Óħ~YÜZĜŒkó£`9>èىżL]ÖD~;şµÛ1 YöXEŝħ iÈÄħëĉïı¸Öꆭa <2û›}pµ\è¸ĥv—,žêLlÂ`ŽIHġĠġZ_D4íħ¨ÍÇ)VğšYÀ€¤*Ôn ++ġWJ”‡E]Îp(²\XŻW ÀÛìİĊzÔUfȕ8?˘£j2˳Ĵç@wİ߼⤑Tϳ¨½¨-+Ĝ^\­Ä֙pU–+ctڞÚ÷’€…ğċ\žÍ”¸%÷ŠùàœÚ—èĦ·‹uR‹Ö¤ŭż2ךœGë†Ġġ4œĞž“C÷œd6[™Ÿ˙Cr”N“ĠüÚ8üH}û˙+X.И*ç+WòK,bmŬ;‰\›Ğ|Ÿ_*)ĉ*ĈìhbjîƒÈY^óêt¤xÌ`ÉOċĝŭšiVDe€ĝr<`ĈE›~Ħf€ M{UT QxÄ^b:SQ;×ĥBE}u½Uz2qŭĉù~ß&Ä·D„ È bâ25ŜĆĊG@ÂÔáÙ³†´bÖëMCgġ—ċ-"ŜÉá”İbĉ¤3ìQAfê÷@Fԝ)ŜċjËÀ/bĝÍOï9żÀ =b!Ż…7×ÉĊÎqĵĉĉħRĝÁ Ġ7*:qüÚj6´›ÁC><×XlB ürĥ£¸È€eJMRĦdÂħù*|n¨R’ D–˙|§ŝŞH׃9's_{ ynİĠ|/UÖÈKb³ĊÛaħ‹ÎÇĥ˜ċ•˙ÄÏĴÇ ’›lߏì˘ ġҒ0xêrób§ışıjßÒ3!İ´ ĞŬµ0ÀĠJƒĜñ2‡F£ŭ Ħp‰ı6ÎĤ½ûĥ“ÛĦ¤PxG+ä@‚µàiLŝ’Ĉ€Ġ.Qàßú4UB–{ÛÁWĠTj†yߖó8˜+9?İG×bÊkšvĜî6˘´(<HéíôpK·¤âydŒjzŻ[ó[öê=àZD˘C‹”)ûP%ë^ĥсßV2v¸=·“[ƒÜ7ÈdžġÇSA3RfHĦ…#§, óşżôËԈïYáıîžĝĈÜĉ–x› …Ç“R˘Óú6ít?hĴâÉAıV>ÈĤmÔÌÊ!{İƒqjĵvOJÈQ)é˘dĵ[AG˜ûù4W݌£Î¤·o]-ĉ&-\£„]‘É—bá>€ĵÁ'f@ĦkÂd0ŒÒĥúsÛ¨zĈJĤĴñ9ŭûë‚Ŭ  BöŜ2W`4HòìF!΍ X$ÍÂ9Œ ´F‚dµ}İÏ1<ĵİÄufñD;ô ċutÙ-Eĝ›TOV7…/ß8܄…·™CBÉŬJUC’ž|M7%Äon½ĠêPĤ›"ò?—”BiI%+ŜA“œšê&Ó[“bS6eéO [KĠú<İn ™Ŭq4L‹zĉO‹%S˙[bŬ.ġ\j¤HÖ Ûġ½í MÛÂÈi²Nù˘}˜Ï+€­IáŬî“˙bĝ ,ÎìÍlálq*qŒg½)×О÷­2ßòĊmı”\kV›Eu˙ÛiËi^Ĝ‡ŭU–ÚıñFìu4ž~ë6:°A½×' /Cğ×LU2ôÔĞzžß9ŝĵ§ŒJsž`é ~xÉvX~C9†7gˆċ*xmqÂZmŸ§0F‹qµĴµg`š6v·'ÑaŬ£IpOY˘ĠÙë<È -İÍ+‘Yŝ^£™ò÷Îú³Et2۔³d͝⠈°jlŠôÌ÷†}9HT\ñşìÀ°S˜%B˙­]µ…­S"µŠS'/ğy¤ÔŠö~,VËC5¤ë=6ëȔ %ŸAµí e ͇7RÏwŻ%π/ÇŞ–!(èĴŻj†Ê’%É‹Ö_lƒ;˙=̓ì˜ÚĜĈn„ÏcĜ$ñj>‚,çşKƒ™p+ħ'…Ĵ'.÷}ÄÌÍÍ­ĦŜ5†8†à¸†Š Ô÷<^ää*éB4Z£WĊ0Ô†(8–ùBeuĤ|K„’D žÒáúËbÓ Zq{Lé °‹Ñ³ġ‚*Ż:ĵÌ´ÚĊG×|Ùç9ħM éż²ĜËáwÚ‚zF³q¨ R{Ǎö?…k¸•΃ߣK§)0Ä|ŞV~“réŝ›¸ä1¨h.*6 ÚPCÉoĤžL@ċJG|µP C ŜBĊ7ïcàwX…¸g|–N\Ĉ ‹,$Dİ+p?ĥ³6ı²tbĥŬşŬĥb]`âû?.Ê›çÄz Óʧ)Ek\,R ³4ŜÌİ.ŻĥàÑ$DĞQ²ŽÏİ P„âüIĦo ġÇá½ÓóÜhü6€Ö˘–ùÏó3´îĉSó—•êH_AŸ˙uŒ ¸ŞŜ3\HÇjÉi’˘%ĉË„jîo›ĉùož‡ú:)clj›—ıÂÜĥ˙ ĉ ­şùo›ĉùòğÛ[tÇĈÁ:ĈšF˙8·;ÜHġ,à­èŬ6JğèjËËËûrĊ\Ž  4`Öx-ú¸ÔĜ˘Ŭ¨Çŝċĝ,;ÏĜ¨Gúp‰…m=mƒCòü½‚Ğ‚X_l1䁐Œ%èÉYĊ{¤ÌcˆEH‘܍fĠëéI€q…B3ìo Öђ—ÊÉ œ=cXï›\JíöŻİ}YÚĥ[CĞżt4|ÊúÈ+*ĴĦf‚Ɇ|нJ´PĞy?÷E_5?]Î!#[N™ZɃ‘Œİ,cĉCX żTFkŽĝNèdÛBR_cLjÁ¤[˘²€¨áÁŝ|_+y˜r!ŞTŠOǸÁ…˙YN­ë3aɲ ŻÑG9½ÍÄ-Á²ùž9ˆgÖmÛM’RK Ñ:Úr‰ Ħ‡Ĵ3™^şġhòô €4½ìÀ úŽ5íF“-’ĥŝ˘ĉgñÚħÖ“7Ö·ZjR@™ÓŻ$/•Ĥ˙WÖŝ& çàMd*Í!‘´’ôÏŻ‘ç d]IĝYk}O„áñ‚_züç {ñlŠgXıÂ÷°,Z‰›ÏÂùĥx‡Ŭ΢›fR‰ |K9—ò+Ĥ#òË˙=À½P’Ŭ[š/ĈŸ˙zFF„a ĥœS&ô%úQ –µtyMoİtMH ½Ç*b´mL|G#"eĤC*¸u“#ŝ­~í˙$n2ġ=Y/{“ŭ³ÇMmÊ+§oÉP $ [û6ôTĞ£Ö›['⪋³d›ôg)ŝksŞdécıe„Ûċ84ï- ş·l8Ÿ¨ÎïŽw˜C6JÇİĠ½ŻÒ¤Ĝ:1v$r„–4d|¤=„Ò:(N½ÜLžJÓáÇTÄҖžÊÄï"ˆ§ ~cmY=ıY}M]ŻfÒx İ+Úñќˆ²!ùĴÂi‡oĊ·(~;ËÀù”ü{M˘gî„J£àm.-²tŬíŜ’Ħş&áŽBm(%|*ìƒ*ĦóĉôihRP™Ru›´è}&‹J†]0H ‚V(*Rš(Ş*'êGğŝÏċñžâ›nh~ÀëዊW <ÖDmÊPSİÈï;Áyz*½.Êëöd’ŸqLÜÜ%­íˆĠ%òx—Šp@=¤N‹Mƒ[e7])kĝŜĉi=ÒàD;G ¸l4à”˙Gü£˙7Ŭ3ĞŞ{sÔlà;aĠċğ‡nW¨–dçġ\ŝš°Ïáé˟ÖïĝzŠÛ‡Ĵĥ?‡§‡ôŜĴï·ÑˆĦw‡Ĝg ew[èµ=7¸×¸ŻUŭ úo0O‚qR16˙"Yéô§|d8mòÄcPI#şˆÖ`³îüĜË÷ŝµô1(I‚œۍ0ÄÑĦĝ f KU•“ĉž4[P—ħÚm(› DÇbĉÑ&e6ĈÏŞ‰òdÉi‰Ĵ–>/”€Wá˜(GagSÍ Ŭ+ż·_r'è‹îì¸6vSEÊrÓ* ‹ż÷;‘ı`ÚjրJ͝&WUĊ€Ís3nŝö Ӕ@ ŭš÷XDQÌħ3í•ÉDŬ";Ħĥ˙z™ ZĦ•7j/­;…‰I@ŜÒ÷Ĝ:ۘ˘{CMĠħŭ&|Gbì$ÄĈ‰40Ê­1u=óĜ£lc~Á°áĉ~épJÒÀÔJSŭÁםk.òPİú;t@\¤f(*ż¸U/ánĈD8=áAÀ//‡şC‘-–ݰÇâġYòh³HË!lnRlô7kAH#r´÷šŝo}@ç¤ĴŠ:s…ç-K+6Ċ„àɳrĥÄ£Û˙dv[ÓŜPşEƒî(nÀħĜIœċS†%yŠàsÎk,F2ž<ɕ£reàŸ²QbDM{ÌŻj8ĥDĠiní6½Ÿ>^*ÄpVXax"ċ^ŸIM¸žQ‰Ú´{IŽVÛ·wWD²ŞÁŽj ‚j‘F´ħÛ9LËċĠĞĞ䖆j_ùŸŒĠ"+[Î èXsŜP#…YsÛ+K×1Ù ˆ¸¤|ċϰ†Ûâ}¸ŝWDêq€¨Ê8ddġĊ>›Ŝbb¸ĥmˆ·t­ *°Ö#(S1,gÚµ%êEÄË߅„¸&.xOıJlàš~­x –LŝRğf`ZB­< Y‚|ö҇QÇöÀÜ÷O {œšñˉ€™ŜbhjŜ -—WrAžQÌşÓŬŜŽŭ{`‘ûÄ>29>LHĵ+ô ݃ĝ=˜ät; ñêrz‘Á+¨Ġĵµïö<ËŻ}˙ È0ÂŽÀñXş÷yÄúÖF³Íâ9ĵÑìĉ…âħéÓgËF†YXۊ¤‚‚oe›f³ 2‹ vĠ˜ßXĤ˘Ï›(˜U..Tb´µcó[Z!Ën™7U ò…œÊ?bö[Ñ3Ğ˘[êfTĉƒaQš*¸²^Aë< ŜpSġûe0h}w†ÌO{{"@eá·ĤRĵ5ñ:µë+àİy„áiŞŝ†S§7aċöх Ù<]×qyâŸÇĝn­×_b™ĤCY{ÚGÚ4ÁİÛŽŻ½R}xIĞ*•kuóaÑ&Íá‰?}×ÒÄXAX7‘…Şí BħÒÎ$=VĞĜÈĠ,]Ïó…ßêPX<Ôİ–ÏoĊ|•áÌ[R —C‹]hp3U}…Â/jĤÉfÍ]°|˗ĜÖ'?/bMŜV4c,¤:UKžúÓ+ˆŝFav€Ħ-ÍK9AT8~b”q(Ĥ&€ŒĦ”lgy޵",JŸL]h5&IğQŻTÊD%ġÌ6G~ëËhĠöj& 9xÙÓ!ÀjXcàÍbZAûĝ¸ùŒ**%ۑğ[ˆ’Í)€Rö˜X]B£+|K-´×y§™§ûÔo HúµPµ|ŬfûDÚ£ şmÛíÍùNġ`°ŸĠ%B|<Íĥ$š3HEÖ֒pŭòl³akF܁ñ<€òzŜŻ£âF öµN!2ÌLŽşöÏYÄÖċucŸi=%xMù:.HdÙĤúqClRS•ĊzDĉiĵYÙ³À=ĜIaˉР:áb-Ŭ€òe•ƒ6€•áŭ3öÑB„ġË5“j Ǥàx˜3+…Ž’üwŠÊ”Y(îx Y£Ç ¤'LĉPÎSÁiĝŒ!ĤÈà“ŭOäK‹WĊŻ%àšÒ ÊÙp"íşĵ>"„mÓ|8’mV<Çq0HĠPWĴ~éÊċ<ËV-ûŭá° íÚÈ·DÎSéöĤCë÷ ıœwÏğô§Ö<]Rĥs4‰;ĥnsÈŝÎè3Ŭ@ħ>G#5ڈäïĈŸĦυ)f[1Úùïx•ßw§a‹ċ$ȰçU,Hĵ?ĝ&u™ĵLô"msnqâè˘Ĥ§5èûàfµˆЎ M›ÎU׉n[Íü)Dë8+`„k/PKÙżvŞqĞ•"Dz2'kŽüàŽz„;ÉÒ%'´ïi8úr˜?ߓGìj€~í€×ÀÓò¨ÑYñŻ Ò’¤”àĉÂ[k@ŝ Ï/ˆßĞHı“°zxíJñD]ċú…#ĝ|RËÜovËÁÉZŻ­#WÈxÙäÏżrËĜ0ŻÙîĞŭ#ı“;3Á×ôx(˘–u|ß˙-”[+‹[ġ2dĦ dêż‘ÓPè¸S.˘WnxTÜ_5ŬŞ ŬK“IܜĠglwÔ [#ƒġ~b<Éf$T.Œ÷ipKӜhñžIž[ ˆí0F¤$—‰E/ÁDĠúäsDİœëQ²ĉ#­”=„×Çöñ“Ĝ—H×!= ĊoĤħ…ĴtĊ~ŽÜÓŸ_Cϛ7‰Ċ³tİĞÔĈ˜·4V#·Köú ²³ù]<‘¸/Œûš‚jÛÊ4bzhW îžħfÏ8* ½ëTFÂk…L…òË:_P˘½i)"rŬŸK)‚!)ĈvğĦ;’{mİŻÒ÷î~?t§ûµe¸¤÷(‡K/5p 9ӭމ‰›ĤÔìÉÑ’…—!éŸT5ŸÈ2s4ÚŞ ĝP*Ôvç¨id/Ûż¤uÄÉQޏé(ߖµ€ĊzîÜL¨Z‰9ƒ6IŝŽúfÜ­üġĵçCÒËR1”çĦßİÖsċkäˆ[ ÛĠûvâj™ŬîD.ÌòÙÔqtš1µ,âîS‘b,ü× !û; X‰ÉRèˆÇNŝÄP|PAĠı€½ù]S9À³ö[c"HÄ^UN½E›ĉ VĞŜš†ge ,x4Ĝ!^t†Ÿs¸QúŽq¸sÚĜÊDÜKHŽX2”G‚@iSÔŬ#O:‰F=Ŝ£Cj Sa†vt“ ĵ=Ž·Z:àwòuʜŬ<ĈÏ-óì0'9ÈÑkÌé%]=ÉìĜüÏKà0ĝ ^Q 7…+ûàÄiè,I§,5mô™  4ĵfGçàğ7áÑ9†G §Ž™ĵlîĴÂî·iġÛJüÉĉ˜1ŸÍğuRècèßµ’œÜ•–Q˙9‹+ğ÷ŽĠŽ·} K#œß£[”ŜfIKĵ ) ş2'F¤ÀZ­Î”áĜÒ$ßêĥ Ĝc†>Hyp?²IIB‘…'ÊAS0⤵â|ÒÊä÷íĠYè&,e=:!M˜ˆ?¸>O”ï˙Nu žüñY°Z…ÔÛ3 ƒı"½˜ĠŸŒ²ĥYXñÖ6 ıAÚáí_@ı '÷hcêP(è´]szì\•ɆaĐ"zşŝ=ïMĜx&R^›Ëí…EÌüAeĦI8<ùCŝ'î`ġ ’|à}ÄeW{^:Z ŬaFŜQKĝ›ßè÷“y”Š0½oêë%nJĤOÌ[/işĤíÙΒ;ĦÊÇ+İ]S˙žb–‰]£^@èjû,/ĥpú™tR‘Ù}×2ÎŻ>ê€Ġ°•‹ÁżË§€ö 1˙^ÄĊċ—âŽÏĝ.âŬc"7ñHÖħ‘ĵ ׇĵLM|ž×o‰Ô 5¤ VŽMĊ˘zĝû2˜³mI¤ŽY.Çċ+s”zғK—öá ĥUÉ–‘[Žû%0BF‚Ċ™Ä$ów}BŒ–DŻBXfÚĉCŭü ÷ RmâjàˊÄÛj{$|ġrŜ,y†^c÷ KJVò`%R~!üŻ˘xzĴèµ@aÏŜ17Ù \'°×ĉ9w,Vë;§ cLt­À&MCŬÜ*,OQàátüĈċEôßĠ"K‡:Ÿì—écê÷]mٛ@üYĤï&N6Ĥ"ŻvA*—¸ı9Cˆ¨b,$|ôz;DDˇTı@Ĉ9wñ÷K&ɖxÔ0:ıTŜD·­@&üO:öĞÙ½x‘Áà½6IKE0=ş5î½;9ÄÁ½ĵÒĝOuŻ5âȸlÖ +BŽGñ66•Lr#8iwœ‰îk;ó'Ug*‡ËMĥ7•}Ócѐ½“âġ|¸YC˜r—dl`jRnóĦâ@Y:ŽŜIġnMÎ"ĝàĴ–g•=ĵÌ#De\ĥއ>\~ñ‡/Ô „|†lS™ëÖq˙9fyÉì“dù7Ë@0‹? {L™â&BçziÜ/zÁë˙JL:ħ˘a<îşöGħ`Ù@3ġ1²Ĵ!2 3Ĵwî^t êXÙÈTHAŬĜÒĥÇĴ-ŽkĠ<6 é­RўRÖŬµÒ¨üs1äj•ş³ƒX?:#ú„ĥƒgê~i=ò§Áİ/k­Rö” F?ÏïӞµE.ŸhMÜıšáK7› ‡}‰n}R9´ÓğOĴVX}çŞŜâ£Ĉ(Sò2Î"áúfB§ …FUx÷0Š;á´WWñ£CcpĴ(´íé˜XèwĜh!—C`ñ3‡ĉóLSQ&[‡£:^¨2Au9DO*ŝ£­çċ:°({/j‡Y"‡µl‹|(½Óĥw*˙,öÏ\.à’ ìĵò>ƒS’*ĞÙóróÖ˙gĞÖü:ı ÷—Ç \]²$=ÈŬNĵ!Eë+‡wŭ57ğ1jVÄBÚ[ï˜jsĠlÜtKç Y0¸~Ĉs‰”>Ħ̘QŝŸġî´´Ċx`²9w3Èä§Šà9:šé]úK07y$Œ‰ižÔ”ôĦAY\ézAXĉ ğ ­RĈkÄl ¤IôéD;¤ĠŒŜ;‚ˆ16Pşz˙˜8g|[ö7ƒµòÈ*¤żlo%'ÈĦÑ-¤…]mħAĤo˙UM€ 7AʵÈ,WÈ—ô‹Ö£‹‹Ó44ÖŬ(LİJÍìÇ̌¸5W›Ŝô{¤‰RóÄ-ZyŽ óFTœ ‰úšJtW>êߔi”Ûĥï™GŠž†ìuùŸÜ[1*ÜOo)Ġ$‡{jl•߈%HÒ#[ .ŸħËS;•aŒl”ÀïŞıxž0Aë°VCċĴ[ĥMî[9pˆKıDА`"K(`&ıñE ŽÒôÓtO‡ù^°ŒĊ?K;Ċr„:?\ëfÎıYj—4cĊ6a4KÀşžw£3P:VĜì,İEp´zQòóTpˆ6íôDr<*˘ž÷MĞQ¸ŬÉ>)J}té1ÉÉŠÀ˙t/ßŭĊ`Dƒ^Âf˙;jHŸÎKnD%팇Ïu ™]0ä×gS>ĵcb•ùÊywσ×ĊÓ÷°!%d“ÇO†÷$H Ŭu5ŝĤú³Á䟢dUvêi?óɽóä½ĠµSxµy{…µŬ&¤ı?àrÚyâˆMÍË=,ùcqˆxŞŻOyŻô\ qĉĴ|Ò1]Œu³zÂY˙&F}Šà‚ö¨Ĝš>üôž0ùC†?zá| ŭ6ê–TÚŬ ĠlŻB;)<a/ÀSñĈ,Ħ*%ğ[Ĵ~Ğ’KòzÓĵ°qÔP·Ŭ|“5÷ŜH¨`)$/ÏQ™—îz³02ÜuÊz!$†ŜïÀXĦÚ­ñş‰jrbÑnġŻ…ù5ŻH`XżZSJc ŽÌíA¸ÑŽEİ6n &|Ûß%D$ɗ÷DĈ5‰°˜h~?Â$ıħÉÑ\.Ùjá”ĝí5ùß ò=l]Gîés+,‘—§“Í0#mh_Żyç灀cB& lcĈ+&GEŒ@8R*>Ììŭ5H"Ĥ† ŜDÁAĤ†˜ĞÑĝ ™+ž8éš_ óâ35†§A!RıUš,R|{ÎÒ.7–Ċ˙IÊWdG§ˆ)\觚½cötËHgÊğ{.òˆ Ôğ ‰è*€$·Ż•T@qEĝ4Š] †tŜ¸E}vtiÄ( ‹ WÖ2{Ñ}ú›‚–Y¤;KÑD°êŜSëT UĦċÁßÛX· ÙKMİ+Û‡ä²wWğd£_S0çíLzñ[ïüyôP`&׌ċËM=ħ:-OeMÑoŻğħğú ‹Ĵâ$ÒÑ^虀ŭĤŸnÖ׌şşŞ'›Ġš!⨉FsäVzÁPÉËNMÁkÔç¸9RODÇb‚1½PK7ğúÙ61Ĉ ħ @kĜPì—caJ°ÂCù­£á=_’R6b@šıÒ¸ĝx2ĉ3•‰ĝ—3* ʟö‚'°Ò1úlbÈTÉË÷V×Ïŝ{ èÊóU8Û=Îĉgë*UĊ r|iİ‘j%a_ׅ_˙FĞ•{ÏħLJCٌxòy2-ìêŻĦJߚ(µ˘3HÔ?Ròqŭˆì•PŝQÒaU)ÓhĊI?ùÈpġV0b×ĥ[ŒWSH˜¤NŝfĉÏh˜ÓŝëÁ1JœÏ0 ­öfĞQ7oJâ1šş?‘{ŭğYfV4<£Š'35ħOuÌË]ìÒ2İÂ?£ğİÀ[eZ2V…ò~;ôÁĝÀĎß1kÉÚX>=iö_î2.ÌďäßşHCĊDİħŬÉg ¸ĈtšJ;Xĥ“şvl/Ŝ†àát~F‹-ż·[Wü oPĠŜÓŝPϐ1„ÀÂABN DN:]%ZŞHžıötİ%w>òÂĉ@żÚŠŸ@*à;“Ú˙z§ÀÔa>(밑ìoIĤ—>Í 0<&ǜoĞ̕ ~Ôíe€ñpTËıÜI=V³ŬT½v”ŞŞŞŞŞŞŞŞé`Pà(‹ ^§úL&œ˜7‚i†Ë5"éò­oàżñˆŜġCë[ÈÎÌä>³ïËm ñäÈD‘—ˆ‹´ÍÏڙÁEß=ĥ8żhĝÁóÓ.ÊÎoPí­\4W„Ÿé{İfĴñ˘’HŜÍÖJJÛíe˜¸7Éû¤Ä— !StàG\²{Ï,Ħ£˘ëZ!iyےş‹À™|IˆZS"Û|ëšnÛ5fMŠ2;~IŠ™Ë#£–jFlgˆoOĵ°})sñàá~Bğ—Žt€†ŝŸĝ>…1îü‡›œÈXĊkXX+ÇÇŞ,‘eb‡¤~˘ĥTİĈp–W)+ :e[Q j£AèŜΔÁlôm ^…ÒV3o}@e‘á¨ë]ÎpP™:KÚMúxavÎY—ÙvóÒI$‘ú'ĥ×I°yWÔB÷d ᄃnٌ>ıĞ…[6ĞX&Ŭ~t˘n½d™×Ô Brt’PèßÊdçÛ§³ ™t^¨a¨Dî ŝɖaU/"ŸÖ`íŻ˘5§Ŝò×(/UË/˜VÍÍÊ%#£şĦ˜blċĈ ˆ0Ìgq’ZĠY.W†uÔBI)hÚ²ÍgŭĉċE:îr< ­d4 #4{ –NŝrĠÀ›çħĞSĜ>Ѥ(„?˙}Q”°Ue2{EégÉ]@!ŭêôĥ•ڏ<"ĝpóċⴋŞ;qHàKDZüÓhĠÏÔ˙6ĝ“êt¸S9Ûó)ğRäÒAh y Ŝ}šiĠÎ#-§´w+ċğw™ıkW İP B 9 -ˢŸŬÒñwġğM‘ !äıÚ"˙1×ÚUcÔr{šOĉÚ­M;³ŭÌúäÁH)^Šİîrì3ĥdwlVÖMäfë†hÂ}VÍĈâÈ.R@†˜ûɍ߷VZoÛè4i_X¤M˙3FIċzäze³Kéİ‹ËH‚[Ëm! éÉ…M¤ıQ²¨ĦfŻÄe}‘‚3uä ŝʄ‚BFÌñS—/ O”V{+cIĤ çˆ]Šġ*Ü£>²ݸubôüfÉ?d,âżŬ {³Ë–àC‹ÂF´µv ö›–× {˜Í=ôƒoZrŭŬjJö$Ñàü–òo‡[[C2JPğ0Ÿv@Y§vGĝȠ§¨ œǰ{1AŻ˘Ğö†_”djJı°Ç*1ŽV ”…½#˒ÙÏac;ônRZ Kpòĵù…TĴ7!Ŭàû£D1 À¤ÎoaĜ !² 3pżgôšġùg•(ŭ QKĈFͅòĤƒm˙@Á;û'ĵí[‚šÉ´s= Q+ŽfÀr3pĤş¸œġ‘„—'?¸FĤ(S^ÊÖzŭöšĠÉQx5ë½Ħ` HÇġ§ £ìd³ÁE„¤&çx >ÇË{*O87;µP†SÑâÊĕ,$\Ld‘‰À£]ÚĤÈ}+kœ ñĥSċµc"Wµ3ü{&dèZ3á8‰1D)µı×@ ‰ƒs3vFÔC°£„àò6Ŭ§È/Ĵž´ĝ´öé;eÍ*;Qï·1ˎĝàç<N—èzğ >Ícħ³¤ġÌFK@lĵJ.Ĉ\7÷oµ˜<‹T}uzĥ$ÖíQp mèĠ[ 6JïŜ[ñ¤^cĠ6›!FŽ^iNJÄÉĜçĤš!9yµëÉZŒQ­ħ#Ħñâµ°$žcrâ½ßoĠCŸT<ĥM+] ħXŝĤg†Q|"@îAZĉÄLنè­6{‹k['Y”(?0‡ íĈĊĉêĵ½Cm‚ż–0zFÓô;àÖCV™ï‹@ĈOj½P‰áì&şq‘u§“P_oˆ°m›zR³8ènaŝpá‹8ú¸Ğ$*§“>üÀ!è2—!ä9Ò;¨XhşH>şiıs &‹Î·V„Ğ)´s â>Ü܆ф4Ë'ˆK,Eŝ Ğ,…Ö}Ċâ³÷´|ĈÖTĉ‹ŜÈÙFy“ċ˜ŬïΑċ`ô$‹Œİox×xАĠŝi<͖5(Ĉ Ġï}LÖmÔv˜èĊ>ڏü·˙@óşä+´G“$.&€~L›şÚ—œ*Z*‡¨^ô˙]›×t“.ÌMŻ$ĴVŽYû·ñ³íû­ ÷Èŝ&Äs„5·äpßÔ°_z•Óµ13ŜœAĊU L_ &Żpmñĥh Hݽ ¨Ĉ“âòvUìÁŽÄ=zgÂt-Ržòœg]ìE—–ŸàuH½q=³Ċ‡;ZÚ܏˜&á•ĉhêkYĵQBíXFe*PĴäÀق@ԍ?µ£Ħâĉžİ -9‘]êͽŒ…’-8ò½_ŬmÁS×SàèóäE…ÔÉà\·,ä£C›„#D‚{ŭÌĤš§ùŭĦÛ?ĴĴĴ8MŞŬ'Ìj*•)HPĝĤ3› &âz₨ÊÓi9ê}.‘?~FÖZŜ€Ċ{şêİrgħŜM•…àĉYĉ šÔ³Â$Ú¤ÍÑF“MÔ ğTJ’ġBÏQíŜËġnáŞ%t˙Vl7ˆÖĴ÷^ÖÓÁ²­„şDŭßŝĊ¨0ì9è]ƒĴÈdÏ ċ‡A[À-¨£YóĜĝÓ7ĦŽé¨*çĈŞó̤È×˙i%Q#`2&ӗèR3¨­$nS‘£ÍˆÖĠqĥŻxÚÌŜ’$tñ·=Áû¤ÎŭĴüpÙÀÉ èז?³q‡pŝsuçžÌ'väO˘ì!—¨5ŭLğŝF1'9_:#Éyĥ¸ħ+JgŜ–4¤šwMÇQ÷ö‰Ë>Upâc;p²<(+ÂßÚÎĥ_Bs?,ŠöyˆÏNE9•×êÓ\2Ħóßè˘OéĈáfŠY…˙vĥ\_Q2ۚ„öÚ.ŬV’\Š$3 ÷7ĦŬò´xQΤd\$íHĤ¸n˘Mh7ŞXö"…fWD‹Ûi21&ÒHċê ğ—÷Ô£—N=‘İÀâ›9?çô\bU"îLSG? ,Ëfĵ½:ġ£lx³1ü4ŝívI|>™ËŸ%oì‚Ġ 13;¸ĠİğoÇTlhÛĜj-•"Ï·À„Pî°à×°zPŞ/È=›"•q°Ê²œoqġ¨1:Oj ,ġğ}”FŽMvĞׯĥfëžeô2.S ßÈfœTI]¤ĥÎwxRúʎĊUlTáĵÒcoÑ×½ÉúnöÜŻ…óúYި1üօŝ7DĉK´ê”íaY^4’ %:ĴŞìĞ;ò}·Ü8֝šjÙ§˙äûî”izżM>BÌ5–ĵ€ž^&Q8ÄáR‘ú£Ċġ—'òȳÄYĊ*ĤJdœ&ä‡cÏ1k´%Kĵ5°ı5fœpıc&¤”Žˆï^Ċ( ‰–Üêêϖ$ $œAPêöKÙèdî˜Vp´kğq½”7iDŒX‹$™pa[¸aèa \ċ^Ĵ´lQ9@öÉ ñCE˰'ğC;Ż °Nfm%J—‚N‹µÒ]ĥžWûŭ‚˘düU`í£ÒŻ£!vg)ĥôÚw„Hï#Ĥ3j­ŜΓ–ñJïǰġno{7>Ï9}†Ŭz˘ĉ<ŝ{_öĝ˙^×À 7żB*Â]äĵŠsİrċBxv­uÓÁÉĞĦŭĠ5ş¤ûuswäˤR›Û˘2˙ş\}΄Bû­^Ğ’× -M’\6™ÌÚXêz§ĉúıŠ>ñy~ Eé³é%,·•”ßhħx9Ž˙ƒô”i~çqqÄM&ĞĤ֍Ż[>ëÁƒQóëÄÒŝ­mzÎG‘äĴ†ޝ…oŽ/­& ½=‚n(FĵçSÒ)ûƒjäW{]֒kh ҝòËkŒw~áˆÑ tíÄNÜYİòŬà@†µ@·èTäìÄYqÊĈĤÖ+“‚u:.Ï 66pîĉ%J’ ”êX‹ÙŸVmsv•#ÉGÂmuYÎtUrl<6‚'LmµĞĥÀ­ƒ]YôÖڗîÄĠ³OĤq&äD[;ϽVóVUUƒVÓÀm)ħxrJr‘Ħ:ĥĠ}ë§´ħFG^hĥ-~İ‚}í ë‹Ì25'üj§¨Í_œž§³˙f¤íQ |Íŭ´şÌ[ö€•{›úġÙo.¨ĠE Ĥžž˜QĦù}à˜y€m¸ĠŠ VÙî:q×%·#ï§Lçˆh4¸ ÷RbÒ­‘¨u>"[1܄ùÚĤ+ZĤ.Îa›=‹t×§żĉ­EWñŜϧƒ‹%ë ƒž‹ċf´Np!è`O×­ÊÜÍÌù÷˜ßÖÊì^Ż…ĵıĠxe‚ñmÜÏ!‰QMWLz‚çl%iˆ!sEX2 Úi‰}™‚×(˘°1ĊĥżYa´ž‰Eƒë² /¨ĝ\ìl]ĤñE l”R%•˵4el+z›TìÖ=ÌîQ™y1dSS,5rÁq5úŝġLêòûC~i—túܖ˯íĝĉé rTK”Ёz§’_6$óġfZjËW0ÓN7hç˘ËİUrSĞê£QÌ@İVBhËä……ôm[ÒäÇ}WCïEêt3y4{2˘ž‹0Ílñaw{KaÖ퉲;y€ÎXuÈ.Ħµ{LZaiğ(S۔·’•&­û0Ċ^²â ñt5r"ŭ휈θϝœ££Ô|šżìĞç°S'ŸÜ9ú$ĝ„݉ş,İĈQˆ•GežÓEŽġ’n²öĠë€ívœÉŸ fÉÑU5ûOÍ PÇeĉw›,Ô ĥXx˜rò}ßU)ä(ñîmⴋDJ/(hÄì –ŭn½ĠÍ+Šŝu˙/~ÜëŠR~pĞQuŞ&h„0è_ÓċĜKŸÄɏۆş7˘„¤€´6g”ĝc>ѽÔWüħ&Ó>nà z+À´Çh€Ş"…êLĤ0 Óİ˙BË>x”Ĥj?¨µwä7҉Ċ!ĝKŝ8yÎYÖ ŬĞçbï „–ûù²&ÑŸÓ÷ĥ i‰ÙÂßWÂ(‹Ĵ2$.-Ù[F*c~I³èC˘žá° 5îóÈH‹qÚLĊKaŸ÷àZßF³XïŻžAn`D”ÁìҘ/ŽfrsàĞŭëfĝ…ÙíĉÄFj/ÊFits‹‚2qß.ĝèäğĝÙʇ8KIêB€ Ç ʗĥĵ?ŞŻÈ—àS_òÍUhÜ7›Ñʉ}|ihıß\hEñġôdL×Òŝ;a¤‰ÙŜZkëŜ€1–Ž·…ó´‹npìòCÒF8m°‡P°ùƒ„NÈżĴu8Ç=Böüî“ġf |d܍UäYĞÁXÀ€êë½dĥVk}ÄrŬtĤ údzÍu4İy Šg'ñof”yÜ à 9Ìĉß§&İ,›llŻíp`*°<ĉçbLpîĞ0çPÒúŬu÷ô+?Şâ“€ìWM+ÖóŒ01.£Ú²×ûJ=Ġk=’¸nkʓJÁIû?Àìjk¸CÓè!QZu›fÒ<0)Àè}•—•ׇ虁ñ.¸ÍZ•0ÙCU\;rĠĦĊ[gÖùğ=:÷m£ÓÂı2EÜX¤ßö˜ÜÇ˙^·Zà¤,„á\(çÙñ7iëÍÏäŬ“•c÷³áĈzżù+ß2UŽ“‚9ÓÑòíd…–2Xġŭ9á•êRY\…v‚žCA Ò“sûc &_m&½î a&œĜßy5µĤñ †`XQpğ2(E¤ÊBWƒ$½˙`0µšÏ{짨vë?Y˙eˆ/PëßÓéeO6ÏûnŽÜĥD\íëĞ8WïB ĥ¸*Ġ42˜VF }£4 ä!i™-Lĥ¸zo€àÔ D.Wµó{Ş´ŜÙê—k) '^ çLdö^^âBĞĞlÑë\÷À¨ß貅.cìQìžJTJwq)÷:‘lT |Ŝ²9İċµ †îùĵ¸éû=@ê™ëš8ğ#öI°G8í.èDš˜ÓµB-ƒċC´• ä‹z>aO²³/ñ>ÑÇNX§ˆ{e`ôId;íĴ’K"F+ĥá,NaHĴa¤4ıá6ĊŠA‹€~ĦïÍù(ŬżÓeR€—’HX˙>ÎY‹+/°ÌXÂĈâדh‘ˆ)P…ûfħ^VWcÄhЧEîdŜı@—Io8ŜÉMĵàX˜Î$ŻĉËi5jCl‘É ÓwáA"žpSPrǞ_Z*ħr‹,#=dĵ\•I¨ìPÌŜá]*Ë£ÏÚ _ëZÇ-—–żLÛ! „_(sĈuqy&§Çƒ´SŸ•F30”:?P+hK¨’›âż0Ÿ†;y;On/'s1ŒKş†˜­T>{ä›*“uİYŸëÊÎ ëP"GzÎ;rLK*†ûôİû7y}˜€ékġñ~ÂLıa]j×pRŒƒ2zX½^Í2kÈ_éHċdxZ#İX$n;Üïê–ƒkVÛs–ÎáNeŻ52Ŝt†[ñb!K€À\&‹™ Ü_်IÑÂ騳ħ"tûĈÌìŭƒ%Dê?bĜRNŸÎy—GŸŒLĞàXŭ}­ĊO+‚$ü}qħsżdà/h­‘“pÄ^…IE™ë²È ‹ĥ”ĤĠüTé@à”~ÀqáeĊJ7°*AÓ&)8ĝÜ?¨µ),Ó ÚqH²ŠÖjçÉôòËĦ÷ÁÜĦn0ŻŽN†.yħzéó§´ó–..rb6˙"Ŝ]öƒÏhqŜµq´Iü};E²àĉ%n‰úee´là)£"5;7˘‚W=Ûp­gžĊĴŬöû•żŝK8ĴĠxżŠ2èÍİgg}­%-†ÄÌ$ ÁuÁ)orÛùv4Òµ}ItMb+ˆLKëóOTßb’Ŝ·Ê2ıÎ3&{ß"…é-ĉ‘ÄxB“‚~Û×59U˜âÓßÄbĦ¤ÇA+şüĴ#„ÓĠS!š|ä’Ŭ;oÛÙCµ1ô ĝÀ´ YTħX “R—Œ£ s³M0˘@ óĥÑUkí-FY+ÇFCÊ7ĤàèPB˘™ĵÖŻE’çÚÍ6‚ˆèĜ6x~çĵ$KP²3t>ÀYá˜i`‡—1ż;"EŝßáZA;>Z4dñhvñ‘,öĦh6Ëġ)’÷H= KŜê íħ'ĝïzŜpì–+Ğĵ˜öî*žÀ—…!0H˜9_™EI5ÍZ2û`YzÎHEóìû,ôUĤIk˙rŠÒmġı˘4—pÎvğ_˜x&ĉĴè‚żußE¤jO˙~˙jqSÇ*‹•ĦZišĝmÏÊÜï&í‰}•„/ÑÌúzAêÉmhĠQ~Œrq`ŝ Ü&>ŜŒÔj>*o{ ċf0<ĥJDc.ÚÔŞ|ÇxB.(P-<.šÔawÚĤ_:8Ş€'F3Ġµú^D–ŞÎžÏ-3(W(ÄìĈċĠİĵD•ÊĴB³oáڔò:ĉA ÈäNÔ7 )ñs"Ŝ†ĵ­ŽYĉn…ó==q0•_^kTżìnŻ+‡Ù+4 ġÌdIrĵDòŒžšeÇ[\ùW´a…K6ĉ{ÌÙÜħ˙} Û]ÀµbVôġAóÓÔPŒÙ q@ĤòwzWc*.‚âŸä ĵFô3ñE“Ĵq¸­ë†ĵĤzlĤHë2`9B@s–öÚ~ŒlŭĉtS·Ìħ x^)D 0ÌċôR Š˘›Z,\*\Q°Âé5|ıSğ†eó.‰ ?hüvŠ;‚^ŝôH7dƒĝĠ£³×6Ï7tïĊ!܀‹’÷"Ĵ C ’; Ġ ŠéÍ Y¸ê³™MĥùĊÂVÉJ†ĜêÍ'NÖ)jâ•Ġ/éíô½î™(&E²6°ÙT|ú .9ùügĝ&S~aĥvĉŻ6xNa-uĈ âvN"cÎ<ˆö³“Zİç‡!<ç>­R3Şšíc‰”h!‘UJŻ o´Ĉ—ğ4,%ù5V’mÑşÍm%c92DħJ}t5Ÿ Ŝ\ÈhDĠĴûĤíÜ)¸Ž rÉîR\"…B~jœû£ßmí:Ú6䆣ÙcÑ.Ën“P ì•#ŒĤż£}^:%iŭ&ü²RÁ¨pÔsCÒ1Ö7Rfe½ż çÀÍ/אĦò1N—UHŞ,FxħÑÓ XYĦ´-ôh?·ï4î&ñ„ÉâWlñNh÷İN¨°LúŒÈÊwĜâÒ.°b ïÖCe7Çr&Écê|WíÔNµI>,$Öd¤ˆÖ>Ԏ­ÇBƒD8Ĥtɇ–i+ĝkjgêLb>˜ïĥÛнĈ¨+‡ĈÉüJ @°˜ò8IġÔ*F×go‰Mŭ‰ÒcA‡0g=\²ĊÍÓ-ú·Ż|Ĉš³³)bŠÏ]߉qo:Dpxž×BljáyGƒ^ÓH#…EİĴ !""(FQEŜi£ıċm½­6ôĞL…Ùá3Àë!|H÷¤ëcé"´ùuŜ`È;ĤcÀ$á:z 7ğÀ”™6Ż·Àr¸UûIó8Ÿ›úş†ù$EYAm~ġħ ӂ¨ŒÌĦĴÙÁ‰ä9VİoS ĦFÜ-h s%€˘,/ç$%É{$ӎÎ]ZËlŭt˙.:ĵMâtÈŞÈû ħAǧa*³óS#Qî ÊïÙ"ĥŞQC­T‚ĥŒĥyüġ@‡’)Ù&ĵlAǚq`š~H}‰²BŻïÑı6{´C5,eñġˎIh Ŝ]ÎQ+ÁnJğ=ó^W޵ÉCÜ÷Ì£ĉLDo;îG@.uï{"ÔJ—ÚŸÂŜlVr;Ġ÷9SşLÈĵ‰ύż7EK~슊‘Z˙}àlށFƒ$^D×òÚ.œ!T(ìcáİBµ•­Ê: Ĵœ`·tġN—b+˙|k½~Ö{*7ż÷;Şflä-6w˜À°bċk„D(ôkŭÂÈèSÔËlË"˘5½޽¸íêU$S³¤tÂ]ĝĤn3=XŻ‹ÙCš!ûyw]ä½s´ġ5·•AĤìŸ(ġLŠ;ĉ[;‡Ş[{ĉŝ˛¤#Ülċ-Wfĝú½y{—ĝÔ½Ĉ;ż´i8ת°$é,“}Tó“–BàH󜉉7[#ï?™z§°í—H/gHcÖĥ“ˆçŠ˙vkmQGĠyrhòîO÷½  Ê i#`u4ĵTô˘yċ=Y9‰ò‡KööéXÑ(F\ ˜-, dqû&ÔNf3óĊOyô¨N>ëı)} 3™ŽE’äí"!](mLj ŬîS&ó]19 cċ$Ôm˙ˆdĞo“l> †îpTĝ÷ÖħċCîúl‡xĉ[ĦâßyÜG˘x‚ /CÓ@:—œïÂF^œƒ·5šW_zß`.Šá0Ğ ÚPoX]şùö‡…s=Bè˜5C·²d5ÛZÄ,΢•½aR2òêÔ DJöŒÀĥ‰|ħ >ŠÔxvFlÊċ/Y@.ŞúxÇwĉ||ĠH],°ŻÚ×ùS_ÁȈ”?u"ge 3Ż&ë)Í,xvéàéêyGUĉ²rQÄĉ†1˘·O/jrÎ\+‹0ĥ˜%ÚGĴ×6ü=vËşäZ<‡ċm–^–­”8~p52>ŬgzÙğ·Ž6—‹™Ìr3u´Q¸­Ä úöĞÉÒ‰áuRY˜nLejڃħ×h %šlЇİ?bÎ;–­ ézƒĵ* ´›Ŭ£d™&ÄÌDsHŻHaU×½ ĜŜœ‚òÎÁ†ôPŻĴ1³Ù.b†4vo bĈ à—zĵXvH̎`8Bl~!Œ vÜÀƒ Áˆ:5¤ş@sRAšà‡¤™ ˙[À¸[ê‹ÁˆĠÁ`D[ÎÇhq<󚆤Ŭr¤Vô¸BÇ~·Öİ|êS{NÈÖEiÀŜÚÖr…ÇE1ÚıçÌşœ8™€´á|¸tc(<†èéi8DçÉ·KÑ&İÊRşzƒçêòċ_ûf>L·m%°·ÂFşŞ°ĦŒċġÛrVT¸Ô\: ëö-a2ñ?É×ä&>n§5d3˙ÛiÓç­lµ’ní G\q5‡YD™HıŜȞ‹³ lĵ])€š…eÉaûGċì.öm_5—`–°C·x†í“ż I:sÖyÏı¨ÊÍu*=äú˘q-­|s"şˆ&Uí’ 3›C•FOĜ> Ż '–R`gyĵïÔRG܉×nÜŻha=Vq{€8ÇäĠÎԔĜÈ0yAoÛÎ,ÍJzaĈíO@2vĈ͂:yĈ´pĝşò°œÉ~Ž–”ÙXV³˘Nô|W&ۄ2@‘ÀÌ­Ccµ˘µ[Ğ˘J…ÓKn ħCN…ùz-Ĥ ĞÚ0°VÇia³;˘ĜX9|ġQC2mv#u9óżètYĝûž×Ĝĵô-ß^³Ž­qÇá!ĝOˆ¸Ĵ $JúocÑOÒ(A8#ċ ϧ—’ŻpB+ŝìròĠYƒŽ:Jp>~Ù .=–ô+)#b ġttü™ĝsŠçÉ;{’$Ò|ÄġċŬt9‘¸xóJmi½ħ:BRĤ`0§ÓDÏö Z 2*°œöí}dŞš&íq! ó¸ùDÍ!WĤA0ז+,d˘·¤Y>§é˘Ÿâ=~ÑkD³è%Œâ4-K óŝú¸yĴyêMs<paóZòĜ÷×{SÔj .܆úĤNŒ+e<'vl·öĤbŸ3Ż€öŬ (tŻKáKî2ŽÌ‰ïÉX…úĴ:Hcx˘·½(dĊAŒYaKÔZş‹gÜĈí4j3x—bE3÷ğ<1­ÁÍ a… çEÚËXĞĞËû2 ے@ÖÁόé³p¸$4ĠšÍ›s#ŭĴ$΢D'ċœ–0ğDy;ï4Túéj4)4Ħ¸Ü7Úvüi˚û˘œˆÎÛĞ L/î ££a-ĵ Ug@ ^R4ĞĜŜ+×aìÓŝ*™oŝ5 Ìş9ĈDĥȓĜ*ÀFĵ%Ş5Öî֕ÌR` Şà7ÑU¨³ñÌş¤ÉÍŬDL$ӄ#ÛÑòùÏ#Żb!ÀċZC1²½}=ÀÎêô$ŜçgÀ֝ZQlI¸”ĊĠ-÷G0ù˘l§Iĝ0úaĜ¸>,­b³_t•h²g^ •Q-ê|œS•Á9Ĥ%ıŜ–âŻßúrßÑ M é˜3Dë2ÈÏ][Òı^}^vêfĉz`E³Sŝç™ÇU~ÊÎ#S_)îŽÖ:Żg‚AқM3ġèÏcj½“ ıArXvl1“úŬ×rXÜaßPZ³€ÑóÑ8A>”ç]À„<üŬ38•ÂÌ8jĈLYŬ³o•ÖK˘“‰§8ÓÒ%mOjÚs6ÄÍîE•Ċf‡nqÌĥC…™ÖĞĴ>I½‘´ |"Ĥì[Ó`íĊôrŭĵrˆAİĜ˙)Aáúş1‡Úĝngɰ?'›áö“ò"üšßêé|†|š¤M‰èäsNìÖŻŞx>ô†ƒ"J¨ĵЇ áĥLĦ7ß,Ѝ鐗h++v[€î³zÇğè–(Öĉ1b•£™$6JĉġÇÜúÓ½rÌß 0°ôÁÑkYfÛħNó~4MÄ[C–kÑ 5jÎL,ċwxùĴDß䜅Ši@´^Ĝ'7)ù~ÇĠĜ9ĉĤçUÖÚz-.‹nܧǓrx=Ċ‡+à ú¤T)êÔ1Äño=1pW%#ñÍĉTGjï,'ĉ‰š›@żÖ‘_:Žö!xĴ=êWIŬ&.XdÔî”jVŬ²çKx6:ó‚,·.dòòĥĵ½jP/4ôŭÜK‰‰ÎŝQ%.ÇŞj~+bĉçšÊ["¨Ĥöö:¸ÜÛIÛAİİ׺Y‚N3êL˘ËŒ½žğ™ /u;rß^ž›”$AÒ,ZÔkċĴôüœ•às`C)hK‚,ˇ(“Vç†e7z+󎈠.2 ċ1û8$3 ˘gg"œà¨§_ÌVÄÌaŬ1gĦÊlc #˙šB2ÒB_Ì5˙W@l½s9'n†ĤĊöƒ)ŜXĉސ‡…úìFĈ”Ïĉ`tıJŠúRäù~ÇSF/ƒ›l–ŠQÎıÉ\PÈş_™vúӎúÔjgğ.‘l•=š]@èE şħı‰šÓsĉ`7W6w›F½òiÄQÑ BŸĞ˧nk‡µ7ó%(ÎG‰]ĦÒƒï˜ñ!ÒùêĈġ…‡š[†¨ĉMùî›ĞÖʳ Œ —FwìĴа#moyŒ°ĥı”€˘S>Ǖ³ġÊF_=ŭÖÏ&#ù§ô)?$ ípm1‘Ü_L²oŝ~Ŭġġmċ ^秐·Ó_˘#~8sjñˆ'Â5DHUĞ)mŸ×í& $,„UOi'– ec6D ²°F3g•m–ž\żbÁ9,⁈ƒ -^Œ}‡²f<ĊHGÌ£Ih0żMgÈòW§Ğ†¨Ċù[Ù”K–‘%½uš™]ÙşĈ=ÒWŸġĝċÌxŽĊٔ{ĴLsXU¤[àĵËûòôÂ_ƒ›úŸX;˙.òX˘Àş h›wÏĴ"`$8™Ä3 KÈV›‡žc”˘ĥ4ıfĜ„ʏARà@Š’‹“*èĴ;íŻ sO Ÿ‚µq‹Y"y sğ5ĥ‚KŽ.Ĉŝ‚À÷,Ŭ Re3DÖ=|`2t”ŭ% zEď(D  U—úvŝ’l˜ia%ïĜ$ñ0jxVy‡6‘•ì0ċi†yhÖ sÑ J›`MG³É7L:eŭ¤lNPݚŭUzċoxĦ9âĵ‡o#îUğÁd3‰9ȓÁĈ)YîŜp]—G²_';Cu•ċÂġä`‹§˘£bBĦq˜sßaÌŭ–E!B|‚°r2ŝĝ[ċïì3EŸÚ‡ú<U‹âKĈĊäjÊ\"6¨8ŭ¨qğŸ;çİ˛˙_~÷ZzvġrMOAnDôbĊ4òâú$ĊĤsKUûĊ‹Ë³ûŜ`ĵˆ ĠS}}eîĞġsé"íœÙÓßCE7Ó÷Ŝkïċ“)µ`›ŒŠZn…$N ĥF ”6Š^™snœOv$ʄt- _UpĜ"…ĈD8³WXœ…|wdìù€Ö‡Ĥ …žŭUôëşóÖ˘q)Ô+ĵ–@F)”¸´iĊÌç‚ÓkÁŠĊĠĉ"E ŽŭJĉûrĈ  .ۘ&äešL.ÙnÌpêÈĵX0šŸwîgD²Ïs4“‹y2ĈÙë´KÖüË!ŝöÜÌráòŬŽhQÄ £t_sg'\Rŝ£CA'#Ùvî³$·ŭ|ñ#u?|ŠJVÎz=&”ô[Zé2vVwLvcwDŒéœó{`ϧšp=Sħ•k‘ûçĦğŽÚ óXM)7ï_-—ŬAÙ’–Ûċ…ÙĥÇם;-+’²(ÍĴ*@/=“‰lÚUŠħ+şufGlÓġJħr—ލ›;²äA<ĈwœX–ċ)€w‚ú|ÖĉĠBËFG”§Ö ‘ÁÈĉ²XT+›L@ŠÉJùu,ŭ§ĥ<•ì;ʀ^Ŭßċ 3‰ÙB%+§³ÖC”EÑ8'q ƒ(­-Íblħ\0şžaƒš—ċ´5ĝäÈ@ż˙Ê`jhŠŽvá;ĵzCħ…´˜³\jĥWÄ1éŬ*tê—.ϔ*ĝ8‚‹„ÎĦœl4Îcˆe·J`”´`qÌÛĥ¤˘èĝâ\IV—ä·<•Jċq¸€:a4›U/ôżù)€,ë:FÀ ë1t%Í[kŬèÏ1 KÂڂ×óĝš/2„ŭvv<'÷5B¸Ċd–ÙˆÀĥê—âyRvŜlچùÍ3À‹F/½µƒċÍ­–mWÂHc ?+ÎÉ5‘l]˜Qġ8­ĵ`!úĵġÈîÓRġşÙqT°ĉëŻĴV4o Ż8tjOï b‡'}ÛtŸí™Ïkžë¤J5mm;jQċ_j‰“ êò½+ħżÑO‚,Ġny9"8˙-ĦdÄbjÛP–¨„ÍÎ.‚ ù3§BG°;X2M%Ċ)¤“ß­…J˙ ä`=cóÜċ³‡šş]49o†àş]2Ĉ뙂g´Òò?µ˜§IìÉ=ú ŽlQQ²ÔEë £ôEwÂXߊÒ\Š*zûŝ³‘™‘š/ì)B8 •‰6O5µ/˽çŽĞٛs³<Ğdz• %ŞvpL0w92”T1`ыô#Ŝƒ„ ee§˙hí™Eœ%ħ2’âz ]Œì×\ô!A=w*Ĉ.V§Fñ\‡ïÉÂ$ż†hFÔžm†žCĉ²Cˆŭ³‚nçX ^q\~ĉ:ísĝÂن(üaˆ'zLώ3vÓqèÔ² iû Œzáy…m9¸gAè{ZÒߍ@™ê2 ĤÛ4‰ÌÄĠĉĴÏ_9ע€êTô½#ŸıÈċ‡ÁpܢÍ(ĥÇ̓mMÊFBé @ Ĝ_ƒ[ Üspћ?|ċfÇeĊ…lA˘S€“†X‘ ĜÉ[Ë sڅ…öşŒ÷ÒĝçâhĝB núĠ=A…0PÜÊL$ÑêM2Ÿiuïև4c*ˆtĊŒŒŜ[?Ñ(Bî:ç3!úwrúc‚ÍlnQQÖJWÓqÁó4+nĴ²÷ĊñÖsh£™"ċUâIĵŜ‹ µíöhî: ä!üi"wÂ;-y¸çîĦÎÂb¨şŸµ,–™ygßЧµô ½ùĦƒj,‡6ŝôgËä²9Ĝ\Sĵ\³†.ޤp¸&^“>˙wB™4V{†”'9PòzêûBÇox…s‹ =âi˜§÷'Ò,*ž.óĵ^áŠs;ÀŸ:…NK|íjĜ§ wÓSš†‡2,ïòjéó-QŸUĥ3Ğ ċ|é!ÙŭŠkBHwùwğ#[mĵÑÙéÌ$ĜÌÑŻÏŻ˜d™ĈĞ}à[gè€CVŝ÷ÄPÏց̕†zß§•…SêŜ²ıµċäsï‚úÁ"(żĕ {QÍoÈ ”w@ pÌ%s+Ô[Ş8=’nŻOçYZHznÚz]Q “‡ûçRĤtvjşBW"ŻÄ â˜Z,Œ ‰çż?†…ßnĥßnÁcöè·íÒßÛĞ_·\0ŭ·íĵ?n²~ŬEñ;ÑXÊUĥnJ•ÂT>÷ƒÂËk0Lr¤ú­XɜžÏ‚Ó)/Y&è(ìç6ˆċz@‰ĜR“BWĊĥşĉ½äÓLĤĵöŝĊÇJjô%=´ĠSt†Ypà찅œ=‡ĥêşYT=gq.ÒĞçL+ŽˆÁÄCÒó„#óÎïž:Ì8°‘xdĴ͜?L£ĝ—&ŭ^Âԃ4+z^b/½{ëEĥûĴŒeÚŜKéMiÏYşÖĜĴ‹˙4°yŭAœmNŝkoĥêaEÔYŝĦÂŜá²£ &x?Nܝ HtħA €nĴİ•…µÍbác¤Óì2Ä·°J¨QïĊ&AvUF~jblëGĤî+¨|¸}”AĵOĦ·œÄ9l°‘tm §’=n>FrZ'R Q§" é,Ô „6P #uabĦ8xX6t#ZĠÒÛíí ' :ÄĞÔ)úíä*C+ ?íŬ(1+úrċ‚M$í›-_iRF7sv°şŞ\xé‰Y/ĉjRcéCı–÷`]9#_4Ñ'èħmBa£]¸sÌ:VЧà²(éqàÙYh xGğdTŻ1†O5Ai& ?”X#sGƒAny<ïŻrê"VÑĦ›İçÁ4”.ŜÖORm£|^ĝqġ^Ĥ–@ìq'MÀô.üTpġÜ8ŝŽO:@` –ħIğ'VSÎ˙û——ΗÌ@Â4X)ÖÄÈ!'è‚~Ċ=+ĜY(A‚ dy8ĝ2Ÿiĝ•Šß޸=+@ùÓVĴˆÊYĥ_¨lkkEß6XtÀF*‘ÈĉĈš“ I „ş,t˙)ÇpCÜb:m–_,gu$Àe£Ĉ^N›2-j;o:—KPVĝ}8úĠ5Ó;ü™îx8xˆ<â /“aMNvX—Jì}Fë{]ÍÊRC_oŒüÓ`dQÑ·"Ŝ~˜÷Ù(ż¤ŭO•ŭKefQŽ;?şuSO§„îë D˘9aȕ<ŜáA0ĤMĊĴĝë‚]ÉQ–PŭขݧTô~pèŞûŽ" ’0,­²½ĜŞlIZjN"ìŞÛ ½AġOĠµ’[ֈġcT /ħìîOPw‰AÑ-9 Ò2Ĵ°w§ˆ’k 7D€ä#Ċ÷Ûİ1Oû\ù•HĝG]`²bwK˜$%ˆğ:Ħ=™Ŭ™܋Lyo›ĉùo›ĉùom,Ġ&Ž{ ÛŻ›ß…:s÷-úMĴz+² –†!á1·[­­„’ċʅGg¨4'‘Sš‡WьpP wğ-"|€Ĝğ…je”ñ°oߓwóa)oáFġ†j9oÍ1=ĤqĊĜĵ­~ĝŞn›˙$O‰›ueèâÀóÙÖJìħ>1ËÍ 8Œ7Ÿ_üıž˙;Ö۝ÉmóPÓŻœ!<ŬwñŻ’KĈèÙsÀ­WŻ!+yŞï`FŻ^…| zŠîèÁŒt‘Ŝi‹^o+ /eŞ!ĉàĵhDĤ*ï{~ßTLK˃âêßW%—7×u{¤)|!ä Nw“ÍĝşJ×Y Y7Nï}U<Š5a Ċ°ÛíbYJ§ċ |™d°eCì…héWÉ@$$›ĉ›¨|D ZÜ÷<ĴpĈ;ËfĈ!sċĤv#q,8Yƒ0n4¨fSûPO¨ ¤ÓíkJeŜr£ ’Aĵ™ħ§}jΕ€[tôáÏî6í)R W4e7–0ŭÎş‡¸mİ~(ĤSêä-JĞö†W£wÜMž´ÛÊĞPtIôN­ÔlC—ÓB&28Ĥ"NÊî€_OhykŻX…½-ËËĥúĴÌí+ƒs `áÏDÜΟNs Ò&U>îKµËˆ\FE O˙GHí¤FhĤ|òKĊZX7J'G×óüċĵ)’ f°8ċÑÓĉU9ƒ0î0„şy§(·FîNîKîİ=öA%Ü4@eèà H5[„ oÄ šùAÀŭBežWµ„ “Ċ0ۋ ‘)(nñöc˙:İ[Ċ‡*›6ċòÍ3ĝĤ=ô#UÒŬOÈP„£cùCĊv‘?ċëvlĥI²†%L~Ppñ€:ô ċbßµĦ²à6ü>ܝGWòĴp;=FÙΙq^`ĜÑzYžž÷CŜ.rS–KôĤúʘP9{}– żËî1šCw~ ÄNP¤[@6&÷I–p>8ĜY—f†oJdö7ZVÔL€úL>uÊñgġIi!q`›İ”€Ï'§³j?à™bÇ ÊĝPj†îŸž{|€•-RG;â,A7•ż²Š‹Gú9Œdĵ} Ëŭ{Lŭ Cîye<ƒşžġò’çßîŻNpà>r…F(N“DònğÙ:²H+™Ĵ —Zuu$·†éĠióĉy‰ĠyC•‘Ôh†êĈ^›½ŭĦ´ÙI‘7ñıßLµğèZ—ħΔ"]°x”üµè£9ßĊEž Ğ`Rĥ¨›‚Ê zÍzˉµ#{x¸½T‚oĈ~&×Îö4ċ!àĦYÔÉ çoëk~CaŒÌWGÁ?b†2­ğżŻ°LÁ› íGÓ?)™Hé9ßÇ,l:1„L0²àtµäĞß̑Z²ÙZù´öñİaç§z€ż'1+ÓÇĉòŸżÄ¨ü´œ’ŝ Żts¨˘Y8?ï"o7e‰§²{ĥqûì½ĤŸ>¸öħ‡Š³›FŒ(½İçۏc‡qŒŸŜ3ƒĤPš$Prġïü ÀO^­É•^ŬÄcTŭe=â<3Îġg^èÁ‚×Ï”G]tĤ“w"™|.ÚeQò+W’Òò1A2!t`[ïĈ îµqïH­G)š7÷0ƒÈa-Ôħ܆‰ï^ߍЇ*ÁlĞü3—‡çCVŜn‰uÁ ÇGçU.KU„zSìm8S()·6M½şıF_ j˜´£YżƒĉvÒ2<è´^¨×ŝ&ĉ@}9änv*éċä굅‘JYŝÉ@PJŒÛzìĝïġÖìw'gïJç`³dl›.x€â³ïĈ9?kĞ8úğNuOYĤÛwE ö3ĥĈ[ÍUä\dàà³c ü‡ ï€ê6ú\ÌÉĦë×/Ñx°êi·hğ°Ğ:_?Ş|ž{â–lċL“AV}—á׈x:[ïBĈĤaͰÒ4ìjîD|7ğÄKâ\òY“ê÷*Ġ$!÷”7‡˘LżHYI|xڗD †GЎÎ/„7üÇ_ƒTé˘ÀÑzÎħZµçxŝ274İ0K˘ÇaĵÓÎy_ĵĈf ÏÔy0² §¤<­˙+*§‡Kùùـ 7<‹n2Ä*‰V”8Îje[ú3ĝ Ĵ>0yÛ̑ ïcİm×ċ蓁šfN‡HÊ,Ä9@pì!êr˜<ĉ*…Ġ^ÈMşš“ĈĞçÇĈçÊÔ?`f×·8÷@nƒŝ×Q–ŸtHöçVŝĉIJĴğЁĈ ^hŜ"D ŽNOİ›À6MÌÎbú3ħ}ŭċċv_˙|GĦžbíËŝĠ } 8½ֆlıñlbv @#ĥ^›`Ô\–Á³œ§úQ8€ëHm{ğ} ôüƒĤ„ 4*ŭ:Œ™aîNôJ;uĥĦëⴕȉÀö4*ŠZċÑ Pë˘ñXL].L2%Ĉ¨Ú˘ËÄĉÒjX’ȃħR5Ĥ• YKwn‰oĤÂUìÜW}aJ“¤Gğ·œċ8„xċ•×=ËŸD" Rœ0%äˆtÍ^}u9*1½²4óŻéèŭöï>Ûj³ôsî„êiĠŒwJl™ĝ‘³c/$$­€wŞünĠT;B™’҄Ĉ“1e9p9ìĉ3/àék2‹8Ğ2>~QïĞpáġŠgÓçÜkĝXhÙ£Ĵ‡£²I>ġ<–ÚK/=PÚçbF×UMĴͤ7Ì÷T{êlân Ŭ)pqTÈȋ<éÛ)\g“ŬôŸav¸B°Kù˜q.c$Òi,ém.-´ğżd5ĴNúâ‰ı 3Aâ‚s¸8|ÀğP…:*˜ÉÉFĴƒïM06x×$viŒ$aŜ.<§ú*>H—3-¸Ġt&°tÔlš§Bħħ\ċ éġ<î_;hSñġ2‰…‡âW…•ߪ(Û3?ÀÄ£}ôââ} ÀÏğ]﭅÷ĉCĈFg ĵYfÖĉQ äv$œ1y&*MbÜ0=ßہêqÇŜ˙ÙicnV Bŝffdesmume-0.9.11/src/cocoa/main.m0000755000000000000000000000151712467662066014742 0ustar rootroot/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } desmume-0.9.11/src/cocoa/DeSmuME (XCode 3).xcodeproj/0000755000000000000000000000000012467662066020313 5ustar rootrootdesmume-0.9.11/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj0000755000000000000000000146623612467662066023414 0ustar rootroot// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ AB0F290614BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB0F290714BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB0F290814BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB0F290914BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB0F294814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB0F294914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB0F294A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB0F294B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB0F294C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB0F294D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB0F294E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB0F294F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB0F295014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB0F295114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB0F295214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB0F295314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB0F295414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB0F295514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB0F295614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB0F295714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB0F296F14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB0F297014BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB0F297B14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB0F299014BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB0F299114BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB0F299214BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB0F299314BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB0F29B814BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB0F29B914BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB0F29BA14BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB0F29BB14BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB0F29BC14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB0F29BD14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB0F29BE14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB0F29BF14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB0F29C714BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB0F29C814BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB0F29C914BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB126D07182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; AB126D08182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; AB126D09182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; AB126D0A182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; AB126D0B182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; AB142026186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; AB142027186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; AB142028186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; AB142029186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; AB14202A186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; AB1CC8001AA509C2008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; }; AB1CC80A1AA509DF008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; }; AB1CC80B1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; }; AB1CC80C1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; }; AB1CC80D1AA509E1008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; }; AB1CC81B1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; }; AB1CC81C1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; }; AB1CC81D1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; }; AB1CC81E1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; }; AB1CC81F1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; }; AB1CC8201AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; }; AB1CC8211AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; }; AB1CC8221AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; }; AB1CC8231AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; }; AB1CC8241AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; }; AB1CC8251AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; }; AB1CC8261AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; }; AB1CC8271AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; }; AB1CC8281AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; }; AB1CC8291AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; }; AB1CC82A1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; }; AB1CC82B1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; }; AB1CC82C1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; }; AB1CC82D1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; }; AB1CC82E1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; }; AB1CC82F1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; }; AB1CC8301AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; }; AB1CC8311AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; }; AB1CC8321AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; }; AB1CC8331AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; }; AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB2145231714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2145241714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2145251714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2145261714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2A99A71725F00F0062C1A1 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB2A99A81725F00F0062C1A1 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB2A99A91725F00F0062C1A1 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB2A99AA1725F00F0062C1A1 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB2A99AB1725F00F0062C1A1 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB2A99AC1725F00F0062C1A1 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB2A99AD1725F00F0062C1A1 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB2A99AE1725F00F0062C1A1 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB2A99AF1725F00F0062C1A1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB2A99B01725F00F0062C1A1 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB2A99B11725F00F0062C1A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB2A99B21725F00F0062C1A1 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB2A99B31725F00F0062C1A1 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB2A99B41725F00F0062C1A1 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB2A99B51725F00F0062C1A1 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB2A99B61725F00F0062C1A1 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB2A99B71725F00F0062C1A1 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB2A99B81725F00F0062C1A1 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB2A99B91725F00F0062C1A1 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB2A99BA1725F00F0062C1A1 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB2A99BB1725F00F0062C1A1 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB2A99BC1725F00F0062C1A1 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB2A99BD1725F00F0062C1A1 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB2A99BE1725F00F0062C1A1 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB2A99BF1725F00F0062C1A1 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB2A99C01725F00F0062C1A1 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB2A99C11725F00F0062C1A1 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB2A99C21725F00F0062C1A1 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB2A99C31725F00F0062C1A1 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB2A99C41725F00F0062C1A1 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB2A99C51725F00F0062C1A1 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB2A99C61725F00F0062C1A1 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB2A99C71725F00F0062C1A1 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB2A99C81725F00F0062C1A1 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB2A99C91725F00F0062C1A1 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB2A99CA1725F00F0062C1A1 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB2A99CB1725F00F0062C1A1 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB2A99CC1725F00F0062C1A1 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB2A99CD1725F00F0062C1A1 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB2A99CE1725F00F0062C1A1 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB2A99CF1725F00F0062C1A1 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB2A99D01725F00F0062C1A1 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB2A99D11725F00F0062C1A1 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB2A99D21725F00F0062C1A1 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB2A99D31725F00F0062C1A1 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB2A99D41725F00F0062C1A1 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB2A99D51725F00F0062C1A1 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB2A99D61725F00F0062C1A1 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB2A99D71725F00F0062C1A1 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB2A99D81725F00F0062C1A1 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB2A99D91725F00F0062C1A1 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB2A99DA1725F00F0062C1A1 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB2A99DB1725F00F0062C1A1 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB2A99DC1725F00F0062C1A1 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB2A99DD1725F00F0062C1A1 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB2A99DE1725F00F0062C1A1 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB2A99DF1725F00F0062C1A1 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB2A99E01725F00F0062C1A1 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB2A99E21725F00F0062C1A1 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB2A99E31725F00F0062C1A1 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB2A99E41725F00F0062C1A1 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB2A99E51725F00F0062C1A1 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB2A99E61725F00F0062C1A1 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB2A99E71725F00F0062C1A1 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB2A99E81725F00F0062C1A1 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB2A99E91725F00F0062C1A1 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB2A99EA1725F00F0062C1A1 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB2A99EB1725F00F0062C1A1 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB2A99EC1725F00F0062C1A1 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB2A99ED1725F00F0062C1A1 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB2A99EE1725F00F0062C1A1 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB2A99F11725F00F0062C1A1 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB2A99F31725F00F0062C1A1 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB2A99F41725F00F0062C1A1 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB2A99F51725F00F0062C1A1 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB2A99F61725F00F0062C1A1 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB2A99F71725F00F0062C1A1 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB2A99F81725F00F0062C1A1 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB2A99F91725F00F0062C1A1 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB2A99FA1725F00F0062C1A1 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB2A99FB1725F00F0062C1A1 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB2A99FC1725F00F0062C1A1 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB2A99FD1725F00F0062C1A1 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB2A99FE1725F00F0062C1A1 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB2A99FF1725F00F0062C1A1 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB2A9A001725F00F0062C1A1 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB2A9A011725F00F0062C1A1 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB2A9A021725F00F0062C1A1 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB2A9A031725F00F0062C1A1 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB2A9A041725F00F0062C1A1 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB2A9A051725F00F0062C1A1 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB2A9A061725F00F0062C1A1 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB2A9A071725F00F0062C1A1 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB2A9A081725F00F0062C1A1 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB2A9A091725F00F0062C1A1 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB2A9A0A1725F00F0062C1A1 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB2A9A0B1725F00F0062C1A1 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB2A9A0C1725F00F0062C1A1 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB2A9A0D1725F00F0062C1A1 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB2A9A0E1725F00F0062C1A1 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB2A9A0F1725F00F0062C1A1 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB2A9A101725F00F0062C1A1 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB2A9A111725F00F0062C1A1 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB2A9A121725F00F0062C1A1 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB2A9A131725F00F0062C1A1 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB2A9A141725F00F0062C1A1 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB2A9A151725F00F0062C1A1 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB2A9A161725F00F0062C1A1 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB2A9A171725F00F0062C1A1 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB2A9A181725F00F0062C1A1 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB2A9A191725F00F0062C1A1 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB2A9A1A1725F00F0062C1A1 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB2A9A1B1725F00F0062C1A1 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB2A9A1C1725F00F0062C1A1 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB2A9A1D1725F00F0062C1A1 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB2A9A1E1725F00F0062C1A1 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB2A9A1F1725F00F0062C1A1 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB2A9A201725F00F0062C1A1 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB2A9A211725F00F0062C1A1 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB2A9A221725F00F0062C1A1 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB2A9A231725F00F0062C1A1 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB2A9A241725F00F0062C1A1 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB2A9A251725F00F0062C1A1 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB2A9A271725F00F0062C1A1 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB2A9A281725F00F0062C1A1 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB2A9A291725F00F0062C1A1 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB2A9A2A1725F00F0062C1A1 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB2A9A2B1725F00F0062C1A1 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB2A9A2C1725F00F0062C1A1 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB2A9A2D1725F00F0062C1A1 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB2A9A2E1725F00F0062C1A1 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB2A9A2F1725F00F0062C1A1 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB2A9A301725F00F0062C1A1 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB2A9A311725F00F0062C1A1 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB2A9A321725F00F0062C1A1 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB2A9A331725F00F0062C1A1 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB2A9A341725F00F0062C1A1 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB2A9A351725F00F0062C1A1 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB2A9A361725F00F0062C1A1 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB2A9A371725F00F0062C1A1 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB2A9A381725F00F0062C1A1 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB2A9A391725F00F0062C1A1 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB2A9A3A1725F00F0062C1A1 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB2A9A3B1725F00F0062C1A1 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB2A9A3C1725F00F0062C1A1 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB2A9A3D1725F00F0062C1A1 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB2A9A3E1725F00F0062C1A1 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB2A9A3F1725F00F0062C1A1 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB2A9A401725F00F0062C1A1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB2A9A411725F00F0062C1A1 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB2A9A421725F00F0062C1A1 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB2A9A431725F00F0062C1A1 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB2A9A441725F00F0062C1A1 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB2A9A451725F00F0062C1A1 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB2A9A461725F00F0062C1A1 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB2A9A471725F00F0062C1A1 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB2A9A481725F00F0062C1A1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB2A9A491725F00F0062C1A1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB2A9A4A1725F00F0062C1A1 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB2A9A4B1725F00F0062C1A1 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB2A9A4C1725F00F0062C1A1 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB2A9A4D1725F00F0062C1A1 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB2A9A4E1725F00F0062C1A1 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB2A9A4F1725F00F0062C1A1 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB2A9A501725F00F0062C1A1 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB2A9A511725F00F0062C1A1 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB2A9A521725F00F0062C1A1 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB2A9A531725F00F0062C1A1 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB2A9A541725F00F0062C1A1 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB2A9A551725F00F0062C1A1 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB2A9A561725F00F0062C1A1 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB2A9A571725F00F0062C1A1 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; AB2A9A581725F00F0062C1A1 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; AB2A9A591725F00F0062C1A1 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; AB2A9A5A1725F00F0062C1A1 /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB2A9A5B1725F00F0062C1A1 /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB2A9A5C1725F00F0062C1A1 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB2A9A5D1725F00F0062C1A1 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB2A9A5E1725F00F0062C1A1 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB2A9A5F1725F00F0062C1A1 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB2A9A601725F00F0062C1A1 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB2A9A611725F00F0062C1A1 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB2A9A621725F00F0062C1A1 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB2A9A631725F00F0062C1A1 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB2A9A641725F00F0062C1A1 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB2A9A651725F00F0062C1A1 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB2A9A661725F00F0062C1A1 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB2A9A671725F00F0062C1A1 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB2A9A681725F00F0062C1A1 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2A9A691725F00F0062C1A1 /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB2A9A6A1725F00F0062C1A1 /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2A9A6B1725F00F0062C1A1 /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; AB2A9A6D1725F00F0062C1A1 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB2A9A6E1725F00F0062C1A1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB2A9A6F1725F00F0062C1A1 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB2A9A701725F00F0062C1A1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB2A9A711725F00F0062C1A1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB2A9A721725F00F0062C1A1 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB2A9A741725F00F0062C1A1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB2A9A751725F00F0062C1A1 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB2F3B7D15CF9C6000858373 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB2F3B7E15CF9C6000858373 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB2F3B7F15CF9C6000858373 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB2F3B8015CF9C6000858373 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB2F3B8115CF9C6000858373 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB2F3B8215CF9C6000858373 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB2F3B8315CF9C6000858373 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB2F3B8415CF9C6000858373 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB2F3B8515CF9C6000858373 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB2F3B8615CF9C6000858373 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB2F3B8715CF9C6000858373 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB2F3B8815CF9C6000858373 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB2F3B8915CF9C6000858373 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB2F3B8A15CF9C6000858373 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB2F3B8B15CF9C6000858373 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB2F3B8C15CF9C6000858373 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB2F3B8D15CF9C6000858373 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB2F3B8E15CF9C6000858373 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB2F3B8F15CF9C6000858373 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB2F3B9015CF9C6000858373 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB2F3B9115CF9C6000858373 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB2F3B9215CF9C6000858373 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB2F3B9315CF9C6000858373 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB2F3B9415CF9C6000858373 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB2F3B9515CF9C6000858373 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB2F3B9615CF9C6000858373 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB2F3B9715CF9C6000858373 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB2F3B9815CF9C6000858373 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB2F3B9915CF9C6000858373 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB2F3B9A15CF9C6000858373 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB2F3B9B15CF9C6000858373 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB2F3B9C15CF9C6000858373 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB2F3B9D15CF9C6000858373 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB2F3B9E15CF9C6000858373 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB2F3B9F15CF9C6000858373 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB2F3BA015CF9C6000858373 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB2F3BA115CF9C6000858373 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB2F3BA215CF9C6000858373 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB2F3BA315CF9C6000858373 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB2F3BA415CF9C6000858373 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB2F3BA515CF9C6000858373 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB2F3BA615CF9C6000858373 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB2F3BA715CF9C6000858373 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB2F3BA815CF9C6000858373 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB2F3BA915CF9C6000858373 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB2F3BAA15CF9C6000858373 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB2F3BAB15CF9C6000858373 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB2F3BAC15CF9C6000858373 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB2F3BAD15CF9C6000858373 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB2F3BAE15CF9C6000858373 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB2F3BAF15CF9C6000858373 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB2F3BB015CF9C6000858373 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB2F3BB115CF9C6000858373 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB2F3BB215CF9C6000858373 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB2F3BB315CF9C6000858373 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB2F3BB415CF9C6000858373 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB2F3BB515CF9C6000858373 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB2F3BB615CF9C6000858373 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB2F3BB815CF9C6000858373 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB2F3BB915CF9C6000858373 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB2F3BBA15CF9C6000858373 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB2F3BBB15CF9C6000858373 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB2F3BBC15CF9C6000858373 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB2F3BBD15CF9C6000858373 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB2F3BBE15CF9C6000858373 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB2F3BBF15CF9C6000858373 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB2F3BC015CF9C6000858373 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB2F3BC115CF9C6000858373 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB2F3BC215CF9C6000858373 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB2F3BC315CF9C6000858373 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB2F3BC515CF9C6000858373 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB2F3BC815CF9C6000858373 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB2F3BC915CF9C6000858373 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB2F3BCA15CF9C6000858373 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB2F3BCB15CF9C6000858373 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB2F3BCC15CF9C6000858373 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB2F3BCD15CF9C6000858373 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB2F3BCE15CF9C6000858373 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB2F3BD015CF9C6000858373 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB2F3BD115CF9C6000858373 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB2F3BD215CF9C6000858373 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB2F3BD315CF9C6000858373 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB2F3BD415CF9C6000858373 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB2F3BD515CF9C6000858373 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB2F3BD615CF9C6000858373 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB2F3BD715CF9C6000858373 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB2F3BD815CF9C6000858373 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB2F3BD915CF9C6000858373 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB2F3BDA15CF9C6000858373 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB2F3BDB15CF9C6000858373 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB2F3BDC15CF9C6000858373 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB2F3BDD15CF9C6000858373 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB2F3BDF15CF9C6000858373 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB2F3BE015CF9C6000858373 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB2F3BE215CF9C6000858373 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB2F3BE315CF9C6000858373 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB2F3BE415CF9C6000858373 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB2F3BE515CF9C6000858373 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB2F3BE615CF9C6000858373 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB2F3BE715CF9C6000858373 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB2F3BE815CF9C6000858373 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB2F3BE915CF9C6000858373 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB2F3BEA15CF9C6000858373 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB2F3BEB15CF9C6000858373 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB2F3BEC15CF9C6000858373 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB2F3BED15CF9C6000858373 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB2F3BEE15CF9C6000858373 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB2F3BEF15CF9C6000858373 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB2F3BF015CF9C6000858373 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB2F3BF215CF9C6000858373 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB2F3BF315CF9C6000858373 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB2F3BF415CF9C6000858373 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB2F3BF515CF9C6000858373 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB2F3BF615CF9C6000858373 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB2F3BF815CF9C6000858373 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB2F3BF915CF9C6000858373 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB2F3BFA15CF9C6000858373 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB2F3BFB15CF9C6000858373 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB2F3BFC15CF9C6000858373 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB2F3BFD15CF9C6000858373 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB2F3BFE15CF9C6000858373 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB2F3BFF15CF9C6000858373 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB2F3C0115CF9C6000858373 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB2F3C0215CF9C6000858373 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB2F3C0315CF9C6000858373 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB2F3C0415CF9C6000858373 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB2F3C0515CF9C6000858373 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB2F3C0615CF9C6000858373 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB2F3C0715CF9C6000858373 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB2F3C0815CF9C6000858373 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB2F3C0915CF9C6000858373 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB2F3C0A15CF9C6000858373 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB2F3C0B15CF9C6000858373 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB2F3C0D15CF9C6000858373 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB2F3C0F15CF9C6000858373 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB2F3C1115CF9C6000858373 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB2F3C1215CF9C6000858373 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB2F3C1315CF9C6000858373 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB2F3C1415CF9C6000858373 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB2F3C1515CF9C6000858373 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB2F3C1615CF9C6000858373 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB2F3C1715CF9C6000858373 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB2F3C1815CF9C6000858373 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB2F3C1915CF9C6000858373 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB2F3C1A15CF9C6000858373 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB2F3C1C15CF9C6000858373 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB2F3C1D15CF9C6000858373 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB2F3C1E15CF9C6000858373 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB2F3C1F15CF9C6000858373 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB2F3C2015CF9C6000858373 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB2F3C2515CF9C6000858373 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB2F3C2915CF9C6000858373 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB2F3C2A15CF9C6000858373 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB2F3C2B15CF9C6000858373 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB2F3C2C15CF9C6000858373 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB2F3C2F15CF9C6000858373 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB2F3C3015CF9C6000858373 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB2F3C3115CF9C6000858373 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB2F3C3215CF9C6000858373 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB2F3C3315CF9C6000858373 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB2F3C3415CF9C6000858373 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB2F3C3515CF9C6000858373 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB2F3C3615CF9C6000858373 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB2F3C3715CF9C6000858373 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB2F3C3815CF9C6000858373 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; AB2F3C3915CF9C6000858373 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; AB2F3C3B15CF9C6000858373 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB2F3C3C15CF9C6000858373 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB2F3C3D15CF9C6000858373 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB2F3C3E15CF9C6000858373 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB2F56F01704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2F56F11704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2F56F21704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2F56F31704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB3ACB7814C2361100D7D192 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB3ACB7914C2361100D7D192 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB3ACB7C14C2361100D7D192 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB3ACB7D14C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB3ACC4414C24D5400D7D192 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB3ACC4514C24D5400D7D192 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB3ACC4614C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB3ACC4714C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB43527217D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; AB43527317D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; AB43527417D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; AB43527517D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; AB43527617D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; AB43528717D5BA95007417C8 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43528617D5BA95007417C8 /* fsnitro.cpp */; }; AB43528817D5BA95007417C8 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43528617D5BA95007417C8 /* fsnitro.cpp */; }; AB43528917D5BA95007417C8 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43528617D5BA95007417C8 /* fsnitro.cpp */; }; AB43528A17D5BA95007417C8 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43528617D5BA95007417C8 /* fsnitro.cpp */; }; AB43528B17D5BA95007417C8 /* fsnitro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43528617D5BA95007417C8 /* fsnitro.cpp */; }; AB4C4C3F16F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C4016F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C4116F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C4216F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C4316F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C4416F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C4516F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C4616F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C4716F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C4816F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB4C4C4916F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C4A16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C4B16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C4C16F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C4D16F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C4E16F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C4F16F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C5016F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C5116F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C5216F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB4C4C5316F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C5416F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C5516F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C5616F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C5716F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C5816F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C5916F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C5A16F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C5B16F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C5C16F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB4C4C5D16F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C5E16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C5F16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C6016F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C6116F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C6216F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C6316F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C6416F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C6516F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C6616F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB4C808D17C5D7780024D479 /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808717C5D7780024D479 /* slot1_retail_auto.cpp */; }; AB4C808E17C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808817C5D7780024D479 /* slot1_retail_mcrom.cpp */; }; AB4C808F17C5D7780024D479 /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808917C5D7780024D479 /* slot1comp_mc.cpp */; }; AB4C809017C5D7780024D479 /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808B17C5D7780024D479 /* slot1comp_rom.cpp */; }; AB4C809117C5D7780024D479 /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808717C5D7780024D479 /* slot1_retail_auto.cpp */; }; AB4C809217C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808817C5D7780024D479 /* slot1_retail_mcrom.cpp */; }; AB4C809317C5D7780024D479 /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808917C5D7780024D479 /* slot1comp_mc.cpp */; }; AB4C809417C5D7780024D479 /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808B17C5D7780024D479 /* slot1comp_rom.cpp */; }; AB4C809517C5D7780024D479 /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808717C5D7780024D479 /* slot1_retail_auto.cpp */; }; AB4C809617C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808817C5D7780024D479 /* slot1_retail_mcrom.cpp */; }; AB4C809717C5D7780024D479 /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808917C5D7780024D479 /* slot1comp_mc.cpp */; }; AB4C809817C5D7780024D479 /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808B17C5D7780024D479 /* slot1comp_rom.cpp */; }; AB4C809917C5D7780024D479 /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808717C5D7780024D479 /* slot1_retail_auto.cpp */; }; AB4C809A17C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808817C5D7780024D479 /* slot1_retail_mcrom.cpp */; }; AB4C809B17C5D7780024D479 /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808917C5D7780024D479 /* slot1comp_mc.cpp */; }; AB4C809C17C5D7780024D479 /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808B17C5D7780024D479 /* slot1comp_rom.cpp */; }; AB4C809D17C5D7780024D479 /* slot1_retail_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808717C5D7780024D479 /* slot1_retail_auto.cpp */; }; AB4C809E17C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808817C5D7780024D479 /* slot1_retail_mcrom.cpp */; }; AB4C809F17C5D7780024D479 /* slot1comp_mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808917C5D7780024D479 /* slot1comp_mc.cpp */; }; AB4C80A017C5D7780024D479 /* slot1comp_rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C808B17C5D7780024D479 /* slot1comp_rom.cpp */; }; AB4C80AA17C5D7A00024D479 /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C80A917C5D7A00024D479 /* advanscene.cpp */; }; AB4C80AB17C5D7A00024D479 /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C80A917C5D7A00024D479 /* advanscene.cpp */; }; AB4C80AC17C5D7A00024D479 /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C80A917C5D7A00024D479 /* advanscene.cpp */; }; AB4C80AD17C5D7A00024D479 /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C80A917C5D7A00024D479 /* advanscene.cpp */; }; AB4C80AE17C5D7A00024D479 /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C80A917C5D7A00024D479 /* advanscene.cpp */; }; AB53517F18313E3100CCD532 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53517E18313E3100CCD532 /* slot2_auto.cpp */; }; AB53518018313E3100CCD532 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53517E18313E3100CCD532 /* slot2_auto.cpp */; }; AB53518118313E3100CCD532 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53517E18313E3100CCD532 /* slot2_auto.cpp */; }; AB53518218313E3100CCD532 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53517E18313E3100CCD532 /* slot2_auto.cpp */; }; AB53518318313E3100CCD532 /* slot2_auto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53517E18313E3100CCD532 /* slot2_auto.cpp */; }; AB53518618313E4E00CCD532 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53518518313E4E00CCD532 /* slot2.cpp */; }; AB53518718313E4E00CCD532 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53518518313E4E00CCD532 /* slot2.cpp */; }; AB53518818313E4E00CCD532 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53518518313E4E00CCD532 /* slot2.cpp */; }; AB53518918313E4E00CCD532 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53518518313E4E00CCD532 /* slot2.cpp */; }; AB53518A18313E4E00CCD532 /* slot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB53518518313E4E00CCD532 /* slot2.cpp */; }; AB5A795816D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB5A795916D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB5A795A16D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB5A795B16D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB6A187C16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A187D16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A187E16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A187F16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A198316CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198416CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198516CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198616CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB700DBA16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBB16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBC16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBD16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DDE16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB700DDF16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB700DE016CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB700DE116CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB711ED21481C35F009011C8 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB711ED31481C35F009011C8 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB711ED81481C35F009011C8 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB711EDE1481C35F009011C8 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB711EEF1481C35F009011C8 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB711EF01481C35F009011C8 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB711EF11481C35F009011C8 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB711EF21481C35F009011C8 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB711EF31481C35F009011C8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB711EF41481C35F009011C8 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB711EF51481C35F009011C8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB711EFB1481C35F009011C8 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB711EFC1481C35F009011C8 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB711EFD1481C35F009011C8 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB711EFE1481C35F009011C8 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB711F011481C35F009011C8 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB711F021481C35F009011C8 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB711F031481C35F009011C8 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB711F041481C35F009011C8 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB711F051481C35F009011C8 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB711F061481C35F009011C8 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB711F071481C35F009011C8 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB711F081481C35F009011C8 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB711F091481C35F009011C8 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB711F0A1481C35F009011C8 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB711F0B1481C35F009011C8 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB711F0C1481C35F009011C8 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB711F0D1481C35F009011C8 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB711F0E1481C35F009011C8 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB711F0F1481C35F009011C8 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB711F101481C35F009011C8 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB711F111481C35F009011C8 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB711F121481C35F009011C8 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB711F131481C35F009011C8 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB711F141481C35F009011C8 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB711F151481C35F009011C8 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB711F161481C35F009011C8 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB711F171481C35F009011C8 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB711F181481C35F009011C8 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB711F191481C35F009011C8 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB711F1A1481C35F009011C8 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB711F1B1481C35F009011C8 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB711F1C1481C35F009011C8 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB711F1D1481C35F009011C8 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB711F1E1481C35F009011C8 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB711F1F1481C35F009011C8 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB711F201481C35F009011C8 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB711F211481C35F009011C8 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB711F221481C35F009011C8 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB711F231481C35F009011C8 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB711F2C1481C35F009011C8 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB711F2D1481C35F009011C8 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB711F2E1481C35F009011C8 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB711F2F1481C35F009011C8 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB711F301481C35F009011C8 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB711F311481C35F009011C8 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB711F321481C35F009011C8 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB711F331481C35F009011C8 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB711F341481C35F009011C8 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB711F351481C35F009011C8 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB711F361481C35F009011C8 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB711F371481C35F009011C8 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB711F381481C35F009011C8 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB711F391481C35F009011C8 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB711F3A1481C35F009011C8 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB711F3B1481C35F009011C8 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB711F3C1481C35F009011C8 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB711F3D1481C35F009011C8 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB711F3E1481C35F009011C8 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB711F3F1481C35F009011C8 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB711F401481C35F009011C8 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB711F411481C35F009011C8 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB711F421481C35F009011C8 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB711F431481C35F009011C8 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB711F471481C35F009011C8 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB711F491481C35F009011C8 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB711F4A1481C35F009011C8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB711F501481C35F009011C8 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB711F511481C35F009011C8 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB711F5E1481C35F009011C8 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB711F611481C35F009011C8 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB711F621481C35F009011C8 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB711F631481C35F009011C8 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB711F641481C35F009011C8 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB711F6D1481C35F009011C8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB711F6E1481C35F009011C8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB711F701481C35F009011C8 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB711F741481C35F009011C8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB711F751481C35F009011C8 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB711F771481C35F009011C8 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB711F781481C35F009011C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB73A96A1507C9F500A310C8 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB73A96B1507C9F500A310C8 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB73A96C1507C9F500A310C8 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB73A96D1507C9F500A310C8 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB73A96E1507C9F500A310C8 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB73A96F1507C9F500A310C8 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB73A9701507C9F500A310C8 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB73A9711507C9F500A310C8 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB73A9721507C9F500A310C8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB73A9731507C9F500A310C8 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB73A9741507C9F500A310C8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB73A9751507C9F500A310C8 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB73A9761507C9F500A310C8 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB73A9771507C9F500A310C8 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB73A9781507C9F500A310C8 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB73A9791507C9F500A310C8 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB73A97A1507C9F500A310C8 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB73A97B1507C9F500A310C8 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB73A97C1507C9F500A310C8 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB73A97D1507C9F500A310C8 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB73A97E1507C9F500A310C8 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB73A97F1507C9F500A310C8 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB73A9801507C9F500A310C8 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB73A9811507C9F500A310C8 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB73A9821507C9F500A310C8 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB73A9831507C9F500A310C8 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB73A9841507C9F500A310C8 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB73A9851507C9F500A310C8 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB73A9861507C9F500A310C8 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB73A9871507C9F500A310C8 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB73A9881507C9F500A310C8 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB73A9891507C9F500A310C8 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB73A98A1507C9F500A310C8 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB73A98B1507C9F500A310C8 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB73A98C1507C9F500A310C8 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB73A98D1507C9F500A310C8 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB73A98E1507C9F500A310C8 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB73A98F1507C9F500A310C8 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB73A9901507C9F500A310C8 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB73A9911507C9F500A310C8 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB73A9921507C9F500A310C8 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB73A9931507C9F500A310C8 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB73A9941507C9F500A310C8 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB73A9951507C9F500A310C8 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB73A9961507C9F500A310C8 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB73A9971507C9F500A310C8 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB73A9981507C9F500A310C8 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB73A9991507C9F500A310C8 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB73A99A1507C9F500A310C8 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB73A99B1507C9F500A310C8 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB73A99C1507C9F500A310C8 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB73A99D1507C9F500A310C8 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB73A99E1507C9F500A310C8 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB73A99F1507C9F500A310C8 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB73A9A01507C9F500A310C8 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB73A9A11507C9F500A310C8 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB73A9A21507C9F500A310C8 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB73A9A31507C9F500A310C8 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB73A9A51507C9F500A310C8 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB73A9A61507C9F500A310C8 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB73A9A71507C9F500A310C8 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB73A9A81507C9F500A310C8 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB73A9A91507C9F500A310C8 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB73A9AA1507C9F500A310C8 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB73A9AB1507C9F500A310C8 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB73A9AC1507C9F500A310C8 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB73A9AD1507C9F500A310C8 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB73A9AE1507C9F500A310C8 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB73A9B01507C9F500A310C8 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB73A9B11507C9F500A310C8 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB73A9B31507C9F500A310C8 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB73A9B61507C9F500A310C8 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB73A9B71507C9F500A310C8 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB73A9B81507C9F500A310C8 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB73A9B91507C9F500A310C8 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB73A9BA1507C9F500A310C8 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB73A9BB1507C9F500A310C8 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB73A9BC1507C9F500A310C8 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB73A9BE1507C9F500A310C8 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB73A9BF1507C9F500A310C8 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB73A9C01507C9F500A310C8 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB73A9C11507C9F500A310C8 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB73A9C21507C9F500A310C8 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB73A9C31507C9F500A310C8 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB73A9C41507C9F500A310C8 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB73A9C51507C9F500A310C8 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB73A9C61507C9F500A310C8 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB73A9C71507C9F500A310C8 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB73A9C81507C9F500A310C8 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB73A9C91507C9F500A310C8 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB73A9CA1507C9F500A310C8 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB73A9CB1507C9F500A310C8 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB73A9CD1507C9F500A310C8 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB73A9CE1507C9F500A310C8 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB73A9D01507C9F500A310C8 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB73A9D11507C9F500A310C8 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB73A9D21507C9F500A310C8 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB73A9D31507C9F500A310C8 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB73A9D41507C9F500A310C8 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB73A9D51507C9F500A310C8 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB73A9D61507C9F500A310C8 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB73A9D71507C9F500A310C8 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB73A9D81507C9F500A310C8 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB73A9D91507C9F500A310C8 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB73A9DA1507C9F500A310C8 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB73A9DB1507C9F500A310C8 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB73A9DC1507C9F500A310C8 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB73A9DD1507C9F500A310C8 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB73A9DE1507C9F500A310C8 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB73A9E01507C9F500A310C8 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB73A9E11507C9F500A310C8 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB73A9E21507C9F500A310C8 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB73A9E31507C9F500A310C8 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB73A9E41507C9F500A310C8 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB73A9E61507C9F500A310C8 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB73A9E71507C9F500A310C8 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB73A9E81507C9F500A310C8 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB73A9E91507C9F500A310C8 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB73A9EA1507C9F500A310C8 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB73A9EB1507C9F500A310C8 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB73A9EC1507C9F500A310C8 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB73A9ED1507C9F500A310C8 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB73A9EF1507C9F500A310C8 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB73A9F01507C9F500A310C8 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB73A9F11507C9F500A310C8 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB73A9F21507C9F500A310C8 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB73A9F31507C9F500A310C8 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB73A9F41507C9F500A310C8 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB73A9F51507C9F500A310C8 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB73A9F61507C9F500A310C8 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB73A9F71507C9F500A310C8 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB73A9F81507C9F500A310C8 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB73A9F91507C9F500A310C8 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB73A9FB1507C9F500A310C8 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB73A9FD1507C9F500A310C8 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB73A9FF1507C9F500A310C8 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB73AA001507C9F500A310C8 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB73AA011507C9F500A310C8 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB73AA021507C9F500A310C8 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB73AA031507C9F500A310C8 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB73AA041507C9F500A310C8 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB73AA051507C9F500A310C8 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB73AA061507C9F500A310C8 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB73AA071507C9F500A310C8 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB73AA081507C9F500A310C8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB73AA0A1507C9F500A310C8 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB73AA0B1507C9F500A310C8 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB73AA0C1507C9F500A310C8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB73AA0D1507C9F500A310C8 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB73AA0E1507C9F500A310C8 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB73AA131507C9F500A310C8 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB73AA171507C9F500A310C8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB73AA181507C9F500A310C8 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB73AA191507C9F500A310C8 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB73AA1A1507C9F500A310C8 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB73AA1D1507C9F500A310C8 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB73AA1E1507C9F500A310C8 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB73AA1F1507C9F500A310C8 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB73AA201507C9F500A310C8 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB73AA211507C9F500A310C8 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB73AA221507C9F500A310C8 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB73AA231507C9F500A310C8 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB73AA241507C9F500A310C8 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB73AA251507C9F500A310C8 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB73AA261507C9F500A310C8 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; AB73AA271507C9F500A310C8 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; AB73AA291507C9F500A310C8 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB73AA2A1507C9F500A310C8 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB73AA2B1507C9F500A310C8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB73AA2C1507C9F500A310C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB75226F14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB7DDA6D173DC38F004F3D07 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; AB7DDA6E173DC399004F3D07 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; AB7DDA6F173DC39E004F3D07 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; AB7DDA70173DC3A3004F3D07 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; AB851D2A189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D28189B2C9A007363CC /* Icon_AutoholdClear_420x420.png */; }; AB851D2B189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D29189B2C9A007363CC /* Icon_AutoholdSet_420x420.png */; }; AB851D2C189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D28189B2C9A007363CC /* Icon_AutoholdClear_420x420.png */; }; AB851D2D189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D29189B2C9A007363CC /* Icon_AutoholdSet_420x420.png */; }; AB851D2E189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D28189B2C9A007363CC /* Icon_AutoholdClear_420x420.png */; }; AB851D2F189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D29189B2C9A007363CC /* Icon_AutoholdSet_420x420.png */; }; AB851D30189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D28189B2C9A007363CC /* Icon_AutoholdClear_420x420.png */; }; AB851D31189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D29189B2C9A007363CC /* Icon_AutoholdSet_420x420.png */; }; AB851D32189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D28189B2C9A007363CC /* Icon_AutoholdClear_420x420.png */; }; AB851D33189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB851D29189B2C9A007363CC /* Icon_AutoholdSet_420x420.png */; }; AB8C6CBF186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; AB8C6CC0186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; AB8C6CC1186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; AB8C6CC2186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; AB8C6CC3186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; AB8C6E57186CD07E00E3EC64 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; AB8FFCB4186F8E5400C10085 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB8FFE4A1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; AB8FFE4B1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; AB8FFE4C1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; AB8FFE4D1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; AB8FFE4E1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; AB97C554169646D1002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D5E516964F3B002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D60916964F48002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D60C16964F54002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; ABA03570169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABA03571169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABA03572169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABA03573169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABA93EB0178C7D4200CBF50B /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABA93EAF178C7D4200CBF50B /* encrypt.cpp */; }; ABA93EB1178C7D4200CBF50B /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABA93EAF178C7D4200CBF50B /* encrypt.cpp */; }; ABA93EB2178C7D4200CBF50B /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABA93EAF178C7D4200CBF50B /* encrypt.cpp */; }; ABA93EB3178C7D4200CBF50B /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABA93EAF178C7D4200CBF50B /* encrypt.cpp */; }; ABA93EB4178C7D4200CBF50B /* encrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABA93EAF178C7D4200CBF50B /* encrypt.cpp */; }; ABAAFBEA172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABAAFBEB172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABAAFBEC172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABAAFBED172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABACB73A1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABACB73B1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABACB73C1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABACB73D1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABACB73E1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; }; ABAD0F7315ACE7A00000EC47 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; ABAD0F7415ACE7A00000EC47 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; ABAD0F7515ACE7A00000EC47 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; ABAD0F7615ACE7A00000EC47 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; ABAD0F7715ACE7A00000EC47 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; ABAD0F7815ACE7A00000EC47 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; ABAD0F7915ACE7A00000EC47 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; ABAD0F7A15ACE7A00000EC47 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; ABAD0F7B15ACE7A00000EC47 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; ABAD0F7C15ACE7A00000EC47 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; ABAD0F7D15ACE7A00000EC47 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; ABAD0F7E15ACE7A00000EC47 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; ABAD0F7F15ACE7A00000EC47 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; ABAD0F8015ACE7A00000EC47 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; ABAD0F8115ACE7A00000EC47 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; ABAD0F8215ACE7A00000EC47 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; ABAD0F8315ACE7A00000EC47 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; ABAD0F8415ACE7A00000EC47 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; ABAD0F8515ACE7A00000EC47 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; ABAD0F8615ACE7A00000EC47 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; ABAD0F8715ACE7A00000EC47 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; ABAD0F8815ACE7A00000EC47 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; ABAD0F8915ACE7A00000EC47 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; ABAD0F8A15ACE7A00000EC47 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; ABAD0F8B15ACE7A00000EC47 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; ABAD0F8C15ACE7A00000EC47 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; ABAD0F8D15ACE7A00000EC47 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; ABAD0F8E15ACE7A00000EC47 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; ABAD0F8F15ACE7A00000EC47 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; ABAD0F9015ACE7A00000EC47 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; ABAD0F9115ACE7A00000EC47 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; ABAD0F9215ACE7A00000EC47 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; ABAD0F9315ACE7A00000EC47 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; ABAD0F9415ACE7A00000EC47 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; ABAD0F9515ACE7A00000EC47 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; ABAD0F9615ACE7A00000EC47 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; ABAD0F9715ACE7A00000EC47 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; ABAD0F9815ACE7A00000EC47 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; ABAD0F9915ACE7A00000EC47 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; ABAD0F9A15ACE7A00000EC47 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; ABAD0F9B15ACE7A00000EC47 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; ABAD0F9C15ACE7A00000EC47 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; ABAD0F9D15ACE7A00000EC47 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; ABAD0F9E15ACE7A00000EC47 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; ABAD0F9F15ACE7A00000EC47 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; ABAD0FA015ACE7A00000EC47 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; ABAD0FA115ACE7A00000EC47 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; ABAD0FA215ACE7A00000EC47 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; ABAD0FA315ACE7A00000EC47 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; ABAD0FA415ACE7A00000EC47 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; ABAD0FA515ACE7A00000EC47 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; ABAD0FA615ACE7A00000EC47 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; ABAD0FA715ACE7A00000EC47 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; ABAD0FA815ACE7A00000EC47 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; ABAD0FA915ACE7A00000EC47 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; ABAD0FAA15ACE7A00000EC47 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; ABAD0FAB15ACE7A00000EC47 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; ABAD0FAC15ACE7A00000EC47 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; ABAD0FAE15ACE7A00000EC47 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; ABAD0FAF15ACE7A00000EC47 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; ABAD0FB015ACE7A00000EC47 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; ABAD0FB115ACE7A00000EC47 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; ABAD0FB215ACE7A00000EC47 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; ABAD0FB315ACE7A00000EC47 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; ABAD0FB415ACE7A00000EC47 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; ABAD0FB515ACE7A00000EC47 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; ABAD0FB615ACE7A00000EC47 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; ABAD0FB715ACE7A00000EC47 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; ABAD0FB815ACE7A00000EC47 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; ABAD0FB915ACE7A00000EC47 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; ABAD0FBB15ACE7A00000EC47 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; ABAD0FBE15ACE7A00000EC47 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; ABAD0FBF15ACE7A00000EC47 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; ABAD0FC015ACE7A00000EC47 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; ABAD0FC115ACE7A00000EC47 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; ABAD0FC215ACE7A00000EC47 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; ABAD0FC315ACE7A00000EC47 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; ABAD0FC415ACE7A00000EC47 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; ABAD0FC615ACE7A00000EC47 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; ABAD0FC715ACE7A00000EC47 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; ABAD0FC815ACE7A00000EC47 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; ABAD0FC915ACE7A00000EC47 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; ABAD0FCA15ACE7A00000EC47 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; ABAD0FCB15ACE7A00000EC47 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; ABAD0FCC15ACE7A00000EC47 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; ABAD0FCD15ACE7A00000EC47 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; ABAD0FCE15ACE7A00000EC47 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; ABAD0FCF15ACE7A00000EC47 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; ABAD0FD015ACE7A00000EC47 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; ABAD0FD115ACE7A00000EC47 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; ABAD0FD215ACE7A00000EC47 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; ABAD0FD315ACE7A00000EC47 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; ABAD0FD515ACE7A00000EC47 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; ABAD0FD615ACE7A00000EC47 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; ABAD0FD815ACE7A00000EC47 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; ABAD0FD915ACE7A00000EC47 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; ABAD0FDA15ACE7A00000EC47 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; ABAD0FDB15ACE7A00000EC47 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; ABAD0FDC15ACE7A00000EC47 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; ABAD0FDD15ACE7A00000EC47 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; ABAD0FDE15ACE7A00000EC47 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; ABAD0FDF15ACE7A00000EC47 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; ABAD0FE015ACE7A00000EC47 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; ABAD0FE115ACE7A00000EC47 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; ABAD0FE215ACE7A00000EC47 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; ABAD0FE315ACE7A00000EC47 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; ABAD0FE415ACE7A00000EC47 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; ABAD0FE515ACE7A00000EC47 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; ABAD0FE615ACE7A00000EC47 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; ABAD0FE815ACE7A00000EC47 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; ABAD0FE915ACE7A00000EC47 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; ABAD0FEA15ACE7A00000EC47 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; ABAD0FEB15ACE7A00000EC47 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; ABAD0FEC15ACE7A00000EC47 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; ABAD0FEE15ACE7A00000EC47 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; ABAD0FEF15ACE7A00000EC47 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; ABAD0FF015ACE7A00000EC47 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; ABAD0FF115ACE7A00000EC47 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; ABAD0FF215ACE7A00000EC47 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; ABAD0FF315ACE7A00000EC47 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; ABAD0FF415ACE7A00000EC47 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; ABAD0FF515ACE7A00000EC47 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; ABAD0FF715ACE7A00000EC47 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; ABAD0FF815ACE7A00000EC47 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; ABAD0FF915ACE7A00000EC47 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; ABAD0FFA15ACE7A00000EC47 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; ABAD0FFB15ACE7A00000EC47 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; ABAD0FFC15ACE7A00000EC47 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; ABAD0FFD15ACE7A00000EC47 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; ABAD0FFE15ACE7A00000EC47 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; ABAD0FFF15ACE7A00000EC47 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; ABAD100015ACE7A00000EC47 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; ABAD100115ACE7A00000EC47 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; ABAD100315ACE7A00000EC47 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; ABAD100515ACE7A00000EC47 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; ABAD100715ACE7A00000EC47 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; ABAD100815ACE7A00000EC47 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; ABAD100915ACE7A00000EC47 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; ABAD100A15ACE7A00000EC47 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; ABAD100B15ACE7A00000EC47 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; ABAD100C15ACE7A00000EC47 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; ABAD100D15ACE7A00000EC47 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; ABAD100E15ACE7A00000EC47 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; ABAD100F15ACE7A00000EC47 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; ABAD101015ACE7A00000EC47 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; ABAD101215ACE7A00000EC47 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; ABAD101315ACE7A00000EC47 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; ABAD101415ACE7A00000EC47 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; ABAD101515ACE7A00000EC47 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; ABAD101615ACE7A00000EC47 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; ABAD101B15ACE7A00000EC47 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; ABAD101F15ACE7A00000EC47 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; ABAD102015ACE7A00000EC47 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; ABAD102115ACE7A00000EC47 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; ABAD102215ACE7A00000EC47 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; ABAD102515ACE7A00000EC47 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; ABAD102615ACE7A00000EC47 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; ABAD102715ACE7A00000EC47 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABAD102815ACE7A00000EC47 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABAD102915ACE7A00000EC47 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABAD102A15ACE7A00000EC47 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABAD102B15ACE7A00000EC47 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABAD102C15ACE7A00000EC47 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABAD102D15ACE7A00000EC47 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; ABAD102E15ACE7A00000EC47 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; ABAD102F15ACE7A00000EC47 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; ABAD103F15ACE7A00000EC47 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABAD104015ACE7A00000EC47 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; ABAD104115ACE7A00000EC47 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; ABAD104215ACE7A00000EC47 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; ABAE2F7B18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; ABAE2F7C18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; ABAE2F7D18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; ABAE2F7E18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; ABAE2F7F18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; ABAE2F8418682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; ABAE2F8518682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; ABAE2F8618682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; ABAE2F8718682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; ABAE2F8818682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; ABAE30BB1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABAE30BC1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABAE30BD1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABAE30BE1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABAE30BF1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; ABB9212117CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABB9212217CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABB9212317CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABB9212417CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABB9212517CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABBCE29715ACB1FF00A2C965 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */; }; ABBCE29815ACB1FF00A2C965 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */; }; ABBF04A614B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; ABBFDFA71898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFA61898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png */; }; ABBFDFA81898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFA61898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png */; }; ABBFDFA91898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFA61898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png */; }; ABBFDFAA1898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFA61898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png */; }; ABBFDFAB1898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFA61898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png */; }; ABBFDFAE1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAC1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png */; }; ABBFDFAF1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAD1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png */; }; ABBFDFB01898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAC1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png */; }; ABBFDFB11898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAD1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png */; }; ABBFDFB21898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAC1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png */; }; ABBFDFB31898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAD1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png */; }; ABBFDFB41898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAC1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png */; }; ABBFDFB51898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAD1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png */; }; ABBFDFB61898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAC1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png */; }; ABBFDFB71898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = ABBFDFAD1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png */; }; ABC3AF3314B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; ABC3AF3414B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; ABC3AF3514B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; ABC3AF3614B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; ABC3DEBD1A96EA96009EC345 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */; }; ABC3DEBE1A96EA96009EC345 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */; }; ABC3DEBF1A96EA96009EC345 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */; }; ABC3DEC01A96EA96009EC345 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */; }; ABC3DEC11A96EA96009EC345 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */; }; ABD0A53A1501AA5A0074A094 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; ABD0A53B1501AA5A0074A094 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; ABD597BC187CD95A00069403 /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD597BB187CD95A00069403 /* Image_GuitarGrip.png */; }; ABD597BD187CD95A00069403 /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD597BB187CD95A00069403 /* Image_GuitarGrip.png */; }; ABD597BE187CD95A00069403 /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD597BB187CD95A00069403 /* Image_GuitarGrip.png */; }; ABD597BF187CD95A00069403 /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD597BB187CD95A00069403 /* Image_GuitarGrip.png */; }; ABD597C0187CD95A00069403 /* Image_GuitarGrip.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD597BB187CD95A00069403 /* Image_GuitarGrip.png */; }; ABD59817187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59813187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; ABD59818187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59814187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; ABD59819187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; ABD5981A187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; ABD5981B187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59813187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; ABD5981C187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59814187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; ABD5981D187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; ABD5981E187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; ABD5981F187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59813187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; ABD59820187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59814187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; ABD59821187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; ABD59822187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; ABD59823187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59813187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; ABD59824187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59814187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; ABD59825187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; ABD59826187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; ABD59827187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59813187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png */; }; ABD59828187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59814187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png */; }; ABD59829187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */; }; ABD5982A187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */; }; ABD59837187D466700069403 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59836187D466700069403 /* Icon_Piano_256x256.png */; }; ABD59838187D466700069403 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59836187D466700069403 /* Icon_Piano_256x256.png */; }; ABD59839187D466700069403 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59836187D466700069403 /* Icon_Piano_256x256.png */; }; ABD5983A187D466700069403 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59836187D466700069403 /* Icon_Piano_256x256.png */; }; ABD5983B187D466700069403 /* Icon_Piano_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59836187D466700069403 /* Icon_Piano_256x256.png */; }; ABD59847187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */; }; ABD59848187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */; }; ABD59849187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */; }; ABD5984A187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */; }; ABD5984B187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */; }; ABECB50918A460710052D52A /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB50818A460710052D52A /* xbrz.cpp */; }; ABECB50A18A460710052D52A /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB50818A460710052D52A /* xbrz.cpp */; }; ABECB50B18A460710052D52A /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB50818A460710052D52A /* xbrz.cpp */; }; ABECB50C18A460710052D52A /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB50818A460710052D52A /* xbrz.cpp */; }; ABECB50D18A460710052D52A /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB50818A460710052D52A /* xbrz.cpp */; }; ABECB51418A460910052D52A /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB51318A460910052D52A /* OGLDisplayOutput.cpp */; }; ABECB51518A460910052D52A /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB51318A460910052D52A /* OGLDisplayOutput.cpp */; }; ABECB51618A460910052D52A /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB51318A460910052D52A /* OGLDisplayOutput.cpp */; }; ABECB51718A460910052D52A /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB51318A460910052D52A /* OGLDisplayOutput.cpp */; }; ABECB51818A460910052D52A /* OGLDisplayOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABECB51318A460910052D52A /* OGLDisplayOutput.cpp */; }; ABEF84721873576300E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; ABEF84831873578F00E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; ABEF84841873579400E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; ABEF84851873579700E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; ABF50ABA169F5FDA0018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7B169F5FDA0018C08D /* assembler.cpp */; }; ABF50ABB169F5FDA0018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7D169F5FDA0018C08D /* assert.cpp */; }; ABF50ABC169F5FDA0018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7F169F5FDA0018C08D /* buffer.cpp */; }; ABF50ABD169F5FDA0018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A82169F5FDA0018C08D /* compiler.cpp */; }; ABF50ABE169F5FDA0018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A84169F5FDA0018C08D /* compilercontext.cpp */; }; ABF50ABF169F5FDA0018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */; }; ABF50AC0169F5FDA0018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A88169F5FDA0018C08D /* compileritem.cpp */; }; ABF50AC1169F5FDA0018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8A169F5FDA0018C08D /* context.cpp */; }; ABF50AC2169F5FDA0018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */; }; ABF50AC3169F5FDA0018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8E169F5FDA0018C08D /* defs.cpp */; }; ABF50AC4169F5FDA0018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A90169F5FDA0018C08D /* func.cpp */; }; ABF50AC5169F5FDA0018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A94169F5FDA0018C08D /* logger.cpp */; }; ABF50AC6169F5FDA0018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A96169F5FDA0018C08D /* memorymanager.cpp */; }; ABF50AC7169F5FDA0018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A98169F5FDA0018C08D /* memorymarker.cpp */; }; ABF50AC8169F5FDA0018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9A169F5FDA0018C08D /* operand.cpp */; }; ABF50AC9169F5FDA0018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */; }; ABF50ACA169F5FDA0018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9F169F5FDA0018C08D /* stringutil.cpp */; }; ABF50ACB169F5FDA0018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */; }; ABF50ACC169F5FDA0018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA3169F5FDA0018C08D /* zonememory.cpp */; }; ABF50ACD169F5FDA0018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */; }; ABF50ACE169F5FDA0018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */; }; ABF50ACF169F5FDA0018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */; }; ABF50AD0169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */; }; ABF50AD1169F5FDA0018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */; }; ABF50AD2169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */; }; ABF50AD3169F5FDA0018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB2169F5FDA0018C08D /* x86defs.cpp */; }; ABF50AD4169F5FDA0018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB4169F5FDA0018C08D /* x86func.cpp */; }; ABF50AD5169F5FDA0018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB6169F5FDA0018C08D /* x86operand.cpp */; }; ABF50AD6169F5FDA0018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB8169F5FDA0018C08D /* x86util.cpp */; }; ABF50B11169F5FDA0018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7B169F5FDA0018C08D /* assembler.cpp */; }; ABF50B12169F5FDA0018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7D169F5FDA0018C08D /* assert.cpp */; }; ABF50B13169F5FDA0018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7F169F5FDA0018C08D /* buffer.cpp */; }; ABF50B14169F5FDA0018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A82169F5FDA0018C08D /* compiler.cpp */; }; ABF50B15169F5FDA0018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A84169F5FDA0018C08D /* compilercontext.cpp */; }; ABF50B16169F5FDA0018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */; }; ABF50B17169F5FDA0018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A88169F5FDA0018C08D /* compileritem.cpp */; }; ABF50B18169F5FDA0018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8A169F5FDA0018C08D /* context.cpp */; }; ABF50B19169F5FDA0018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */; }; ABF50B1A169F5FDA0018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8E169F5FDA0018C08D /* defs.cpp */; }; ABF50B1B169F5FDA0018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A90169F5FDA0018C08D /* func.cpp */; }; ABF50B1C169F5FDA0018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A94169F5FDA0018C08D /* logger.cpp */; }; ABF50B1D169F5FDA0018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A96169F5FDA0018C08D /* memorymanager.cpp */; }; ABF50B1E169F5FDA0018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A98169F5FDA0018C08D /* memorymarker.cpp */; }; ABF50B1F169F5FDA0018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9A169F5FDA0018C08D /* operand.cpp */; }; ABF50B20169F5FDA0018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */; }; ABF50B21169F5FDA0018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9F169F5FDA0018C08D /* stringutil.cpp */; }; ABF50B22169F5FDA0018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */; }; ABF50B23169F5FDA0018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA3169F5FDA0018C08D /* zonememory.cpp */; }; ABF50B24169F5FDA0018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */; }; ABF50B25169F5FDA0018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */; }; ABF50B26169F5FDA0018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */; }; ABF50B27169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */; }; ABF50B28169F5FDA0018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */; }; ABF50B29169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */; }; ABF50B2A169F5FDA0018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB2169F5FDA0018C08D /* x86defs.cpp */; }; ABF50B2B169F5FDA0018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB4169F5FDA0018C08D /* x86func.cpp */; }; ABF50B2C169F5FDA0018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB6169F5FDA0018C08D /* x86operand.cpp */; }; ABF50B2D169F5FDA0018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB8169F5FDA0018C08D /* x86util.cpp */; }; ABFE150F14C92FF5005D6699 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABFE151014C92FF5005D6699 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABFE151114C92FF5005D6699 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABFE151214C92FF5005D6699 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABFE151314C92FF5005D6699 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABFE151514C92FF5005D6699 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABFE151614C92FF5005D6699 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AB00E87A14205EAE00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/InfoPlist.strings; sourceTree = ""; }; AB00E87D14205EBC00DE561F /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/MainMenu.xib; sourceTree = ""; }; AB00E89114205ECC00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/Localizable.strings; sourceTree = ""; }; AB02475B13886BF300E9F9AB /* KeyNames.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyNames.plist; sourceTree = ""; }; AB02791814415E4C0075E58C /* Info (Debug).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Debug).plist"; sourceTree = ""; }; AB0A0D1914AACA9600E83E91 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Execute_420x420.png; path = images/Icon_Execute_420x420.png; sourceTree = ""; }; AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Pause_420x420.png; path = images/Icon_Pause_420x420.png; sourceTree = ""; }; AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed1x_420x420.png; path = images/Icon_Speed1x_420x420.png; sourceTree = ""; }; AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed2x_420x420.png; path = images/Icon_Speed2x_420x420.png; sourceTree = ""; }; AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Blue_16x16.png; path = images/ColorSwatch_Blue_16x16.png; sourceTree = ""; }; AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Brown_16x16.png; path = images/ColorSwatch_Brown_16x16.png; sourceTree = ""; }; AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkBlue_16x16.png; path = images/ColorSwatch_DarkBlue_16x16.png; sourceTree = ""; }; AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkGreen_16x16.png; path = images/ColorSwatch_DarkGreen_16x16.png; sourceTree = ""; }; AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkPurple_16x16.png; path = images/ColorSwatch_DarkPurple_16x16.png; sourceTree = ""; }; AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Gray_16x16.png; path = images/ColorSwatch_Gray_16x16.png; sourceTree = ""; }; AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Green_16x16.png; path = images/ColorSwatch_Green_16x16.png; sourceTree = ""; }; AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_LimeGreen_16x16.png; path = images/ColorSwatch_LimeGreen_16x16.png; sourceTree = ""; }; AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Magenta_16x16.png; path = images/ColorSwatch_Magenta_16x16.png; sourceTree = ""; }; AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Orange_16x16.png; path = images/ColorSwatch_Orange_16x16.png; sourceTree = ""; }; AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Pink_16x16.png; path = images/ColorSwatch_Pink_16x16.png; sourceTree = ""; }; AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Red_16x16.png; path = images/ColorSwatch_Red_16x16.png; sourceTree = ""; }; AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_SeaGreen_16x16.png; path = images/ColorSwatch_SeaGreen_16x16.png; sourceTree = ""; }; AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Turquoise_16x16.png; path = images/ColorSwatch_Turquoise_16x16.png; sourceTree = ""; }; AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Violet_16x16.png; path = images/ColorSwatch_Violet_16x16.png; sourceTree = ""; }; AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Yellow_16x16.png; path = images/ColorSwatch_Yellow_16x16.png; sourceTree = ""; }; AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_128x128.png; path = images/Icon_ActionReplay_128x128.png; sourceTree = ""; }; AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_128x128.png; path = images/Icon_CodeBreaker_128x128.png; sourceTree = ""; }; AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = VideoFilterPreview_64x64.png; path = images/VideoFilterPreview_64x64.png; sourceTree = ""; }; AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowDown_420x420.png; path = images/Icon_ArrowDown_420x420.png; sourceTree = ""; }; AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowLeft_420x420.png; path = images/Icon_ArrowLeft_420x420.png; sourceTree = ""; }; AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowRight_420x420.png; path = images/Icon_ArrowRight_420x420.png; sourceTree = ""; }; AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowUp_420x420.png; path = images/Icon_ArrowUp_420x420.png; sourceTree = ""; }; AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DoubleSpeed_420x420.png; path = images/Icon_DoubleSpeed_420x420.png; sourceTree = ""; }; AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonA_420x420.png; path = images/Icon_DSButtonA_420x420.png; sourceTree = ""; }; AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonB_420x420.png; path = images/Icon_DSButtonB_420x420.png; sourceTree = ""; }; AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonL_420x420.png; path = images/Icon_DSButtonL_420x420.png; sourceTree = ""; }; AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonR_420x420.png; path = images/Icon_DSButtonR_420x420.png; sourceTree = ""; }; AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonSelect_420x420.png; path = images/Icon_DSButtonSelect_420x420.png; sourceTree = ""; }; AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonStart_420x420.png; path = images/Icon_DSButtonStart_420x420.png; sourceTree = ""; }; AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonX_420x420.png; path = images/Icon_DSButtonX_420x420.png; sourceTree = ""; }; AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonY_420x420.png; path = images/Icon_DSButtonY_420x420.png; sourceTree = ""; }; AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Emulation_420x420.png; path = images/Icon_Emulation_420x420.png; sourceTree = ""; }; AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Input_420x420.png; path = images/Icon_Input_420x420.png; sourceTree = ""; }; AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_OpenROM_420x420.png; path = images/Icon_OpenROM_420x420.png; sourceTree = ""; }; AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Reset_420x420.png; path = images/Icon_Reset_420x420.png; sourceTree = ""; }; AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCCW_420x420.png; path = images/Icon_RotateCCW_420x420.png; sourceTree = ""; }; AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCW_420x420.png; path = images/Icon_RotateCW_420x420.png; sourceTree = ""; }; AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ShowHUD_420x420.png; path = images/Icon_ShowHUD_420x420.png; sourceTree = ""; }; AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = ""; }; AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_passme.cpp; sourceTree = ""; }; AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_MemoryExpansionPak.png; path = images/Image_MemoryExpansionPak.png; sourceTree = ""; }; AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlack_256x256.png; path = images/Icon_MicrophoneBlack_256x256.png; sourceTree = ""; }; AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlueGlow_256x256.png; path = images/Icon_MicrophoneBlueGlow_256x256.png; sourceTree = ""; }; AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGray_256x256.png; path = images/Icon_MicrophoneGray_256x256.png; sourceTree = ""; }; AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGreen_256x256.png; path = images/Icon_MicrophoneGreen_256x256.png; sourceTree = ""; }; AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneRed_256x256.png; path = images/Icon_MicrophoneRed_256x256.png; sourceTree = ""; }; AB213D43170CB141006DDB0F /* InputProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputProfileController.h; sourceTree = ""; }; AB213D44170CB141006DDB0F /* InputProfileController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputProfileController.mm; sourceTree = ""; }; AB213E981710D074006DDB0F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; AB2145211714DFF4006DDB0F /* audiosamplegenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiosamplegenerator.h; sourceTree = ""; }; AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiosamplegenerator.cpp; sourceTree = ""; }; AB2A9A791725F00F0062C1A1 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB2F56EE1704C86900E28885 /* utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = ""; }; AB2F56EF1704C86900E28885 /* utilities.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utilities.c; sourceTree = ""; }; AB350BA41478AC96007165AC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; AB350D38147A1D8D007165AC /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = English; path = translations/English.lproj/HID_usage_strings.plist; sourceTree = ""; }; AB3ACB6614C2361100D7D192 /* appDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = appDelegate.h; sourceTree = ""; }; AB3ACB6714C2361100D7D192 /* appDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = appDelegate.mm; sourceTree = ""; }; AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheatWindowDelegate.h; sourceTree = ""; }; AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cheatWindowDelegate.mm; sourceTree = ""; }; AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inputPrefsView.h; sourceTree = ""; }; AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = inputPrefsView.mm; sourceTree = ""; }; AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = preferencesWindowDelegate.h; sourceTree = ""; }; AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = preferencesWindowDelegate.mm; sourceTree = ""; }; AB3ACC3814C24D5400D7D192 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; }; AB3ACC3914C24D5400D7D192 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; }; AB3ACC3A14C24D5400D7D192 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; }; AB3ACC3B14C24D5400D7D192 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; }; AB3ACC3D14C24D5400D7D192 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../README.MAC; sourceTree = SOURCE_ROOT; }; AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_mcrom_debug.cpp; sourceTree = ""; }; AB43528517D5BA95007417C8 /* fsnitro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsnitro.h; sourceTree = ""; }; AB43528617D5BA95007417C8 /* fsnitro.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fsnitro.cpp; sourceTree = ""; }; AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AAFilter.cpp; sourceTree = ""; }; AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_detect_x86_gcc.cpp; sourceTree = ""; }; AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIFOSampleBuffer.cpp; sourceTree = ""; }; AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIRFilter.cpp; sourceTree = ""; }; AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmx_optimized.cpp; sourceTree = ""; }; AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RateTransposer.cpp; sourceTree = ""; }; AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundTouch.cpp; sourceTree = ""; }; AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sse_optimized.cpp; sourceTree = ""; }; AB4C4C3216F55C64002E07CD /* TDStretch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TDStretch.cpp; sourceTree = ""; }; AB4C4C3316F55C64002E07CD /* WavFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WavFile.cpp; sourceTree = ""; }; AB4C4C3416F55C64002E07CD /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = ""; }; AB4C4C3516F55C64002E07CD /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = ""; }; AB4C4C3616F55C64002E07CD /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = ""; }; AB4C4C3716F55C64002E07CD /* FIFOSampleBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSampleBuffer.h; sourceTree = ""; }; AB4C4C3816F55C64002E07CD /* FIFOSamplePipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSamplePipe.h; sourceTree = ""; }; AB4C4C3916F55C64002E07CD /* FIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRFilter.h; sourceTree = ""; }; AB4C4C3A16F55C64002E07CD /* RateTransposer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RateTransposer.h; sourceTree = ""; }; AB4C4C3B16F55C64002E07CD /* SoundTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundTouch.h; sourceTree = ""; }; AB4C4C3C16F55C64002E07CD /* STTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STTypes.h; sourceTree = ""; }; AB4C4C3D16F55C64002E07CD /* TDStretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDStretch.h; sourceTree = ""; }; AB4C4C3E16F55C64002E07CD /* WavFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WavFile.h; sourceTree = ""; }; AB4C808717C5D7780024D479 /* slot1_retail_auto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_auto.cpp; sourceTree = ""; }; AB4C808817C5D7780024D479 /* slot1_retail_mcrom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_mcrom.cpp; sourceTree = ""; }; AB4C808917C5D7780024D479 /* slot1comp_mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1comp_mc.cpp; sourceTree = ""; }; AB4C808A17C5D7780024D479 /* slot1comp_mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slot1comp_mc.h; sourceTree = ""; }; AB4C808B17C5D7780024D479 /* slot1comp_rom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1comp_rom.cpp; sourceTree = ""; }; AB4C808C17C5D7780024D479 /* slot1comp_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slot1comp_rom.h; sourceTree = ""; }; AB4C80A817C5D7A00024D479 /* advanscene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = advanscene.h; sourceTree = ""; }; AB4C80A917C5D7A00024D479 /* advanscene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = advanscene.cpp; sourceTree = ""; }; AB53517E18313E3100CCD532 /* slot2_auto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_auto.cpp; sourceTree = ""; }; AB53518418313E4E00CCD532 /* slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot2.h; path = ../slot2.h; sourceTree = SOURCE_ROOT; }; AB53518518313E4E00CCD532 /* slot2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot2.cpp; path = ../slot2.cpp; sourceTree = SOURCE_ROOT; }; AB58F32B1364F44B0074C376 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; AB58F32C1364F44B0074C376 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; AB5A795616D5A56000ED84B7 /* InputManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputManager.h; sourceTree = ""; }; AB5A795716D5A56000ED84B7 /* InputManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputManager.mm; sourceTree = ""; }; AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = FileTypeInfo.plist; sourceTree = ""; }; AB6A187A16C9951C00384EED /* EmuControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmuControllerDelegate.h; sourceTree = ""; }; AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EmuControllerDelegate.mm; sourceTree = ""; }; AB6A198116CAD66900384EED /* cocoa_GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_GPU.h; sourceTree = ""; }; AB6A198216CAD66900384EED /* cocoa_GPU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_GPU.mm; sourceTree = ""; }; AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; AB700DB916CDDBC400FBD336 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/DisplayWindow.xib; sourceTree = ""; }; AB700DDC16CDE4C300FBD336 /* DisplayWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayWindowController.h; sourceTree = ""; }; AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayWindowController.mm; sourceTree = ""; }; AB711F7F1481C35F009011C8 /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; AB73AA331507C9F500A310C8 /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_FirmwareConfig.icns; sourceTree = ""; }; AB80E04C142BC4A800A52038 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = ""; }; AB80E050142BC4FA00A52038 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; AB817A34143EE2DB00A7DFE9 /* videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = videofilter.h; sourceTree = ""; }; AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = videofilter.cpp; sourceTree = ""; }; AB851D28189B2C9A007363CC /* Icon_AutoholdClear_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_AutoholdClear_420x420.png; path = images/Icon_AutoholdClear_420x420.png; sourceTree = ""; }; AB851D29189B2C9A007363CC /* Icon_AutoholdSet_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_AutoholdSet_420x420.png; path = images/Icon_AutoholdSet_420x420.png; sourceTree = ""; }; AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PassME.png; path = images/Image_PassME.png; sourceTree = ""; }; AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = System/Library/Frameworks/ForceFeedback.framework; sourceTree = SDKROOT; }; AB8FFE491872032B00C10085 /* Image_PaddleController.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PaddleController.png; path = images/Image_PaddleController.png; sourceTree = ""; }; AB97C553169646D1002AC11B /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; AB9971CE134EDA0800531BA7 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = ""; }; ABA0356E169127BB00817C69 /* troubleshootingWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = troubleshootingWindowDelegate.h; sourceTree = ""; }; ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = troubleshootingWindowDelegate.mm; sourceTree = ""; }; ABA6574914511EC90077E5E9 /* cocoa_cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_cheat.h; sourceTree = ""; }; ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_cheat.mm; sourceTree = ""; }; ABA93EAE178C7D4200CBF50B /* encrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encrypt.h; path = ../encrypt.h; sourceTree = SOURCE_ROOT; }; ABA93EAF178C7D4200CBF50B /* encrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = encrypt.cpp; path = ../encrypt.cpp; sourceTree = SOURCE_ROOT; }; ABAAFBE8172122B6005DDDBE /* FileMigrationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMigrationDelegate.h; sourceTree = ""; }; ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileMigrationDelegate.mm; sourceTree = ""; }; ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDarkGreen_256x256.png; path = images/Icon_MicrophoneDarkGreen_256x256.png; sourceTree = ""; }; ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; ABAE2F7918682B6C00C92F4F /* Slot2WindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Slot2WindowDelegate.h; sourceTree = ""; }; ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Slot2WindowDelegate.mm; sourceTree = ""; }; ABAE2F8218682B8F00C92F4F /* cocoa_slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_slot2.h; sourceTree = ""; }; ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_slot2.mm; sourceTree = ""; }; ABAE30BA1869484F00C92F4F /* Image_Piano.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_Piano.png; path = images/Image_Piano.png; sourceTree = ""; }; ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; ABB9211F17CEB4110049D4C5 /* slot1comp_protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slot1comp_protocol.h; sourceTree = ""; }; ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1comp_protocol.cpp; sourceTree = ""; }; ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_32x32.png; path = Images/Icon_ActionReplay_32x32.png; sourceTree = ""; }; ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = Images/Icon_CodeBreaker_32x32.png; sourceTree = ""; }; ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = Images/Icon_DeSmuME_32x32.png; sourceTree = ""; }; ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = DefaultUserPrefs.plist; sourceTree = ""; }; ABBCE29415ACB1E600A2C965 /* arm_jit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arm_jit.h; path = ../arm_jit.h; sourceTree = SOURCE_ROOT; }; ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_jit.cpp; path = ../arm_jit.cpp; sourceTree = SOURCE_ROOT; }; ABBCE29D15ACB26100A2C965 /* instruction_attributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = instruction_attributes.h; path = ../instruction_attributes.h; sourceTree = SOURCE_ROOT; }; ABBCE29E15ACB26100A2C965 /* instructions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = instructions.h; path = ../instructions.h; sourceTree = SOURCE_ROOT; }; ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = ""; }; ABBFDFA61898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DisplayToggle_420x420.png; path = images/Icon_DisplayToggle_420x420.png; sourceTree = ""; }; ABBFDFAC1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_FrameAdvance_420x420.png; path = images/Icon_FrameAdvance_420x420.png; sourceTree = ""; }; ABBFDFAD1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_FrameJump_420x420.png; path = images/Icon_FrameJump_420x420.png; sourceTree = ""; }; ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_16x16.png; path = images/Icon_VolumeFull_16x16.png; sourceTree = ""; }; ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeMute_16x16.png; path = images/Icon_VolumeMute_16x16.png; sourceTree = ""; }; ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_16x16.png; path = images/Icon_VolumeOneThird_16x16.png; sourceTree = ""; }; ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_16x16.png; path = images/Icon_VolumeTwoThird_16x16.png; sourceTree = ""; }; ABC3DEBB1A96EA96009EC345 /* RomInfoPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RomInfoPanel.h; sourceTree = ""; }; ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RomInfoPanel.mm; sourceTree = ""; }; ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; ABC570D4134431DA00E7B0B1 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultKeyMappings.plist; sourceTree = ""; }; ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coreaudiosound.cpp; sourceTree = ""; }; ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ringbuffer.cpp; sourceTree = ""; }; ABD0A5361501AA5A0074A094 /* coreaudiosound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coreaudiosound.h; sourceTree = ""; }; ABD0A5371501AA5A0074A094 /* ringbuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ringbuffer.h; sourceTree = ""; }; ABD103FE1346652500AF11D1 /* cocoa_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_core.h; sourceTree = ""; }; ABD103FF1346652500AF11D1 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = ""; }; ABD104001346652500AF11D1 /* cocoa_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_rom.h; sourceTree = ""; }; ABD104011346652500AF11D1 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = ""; }; ABD104111346652500AF11D1 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = ""; }; ABD104121346652500AF11D1 /* cocoa_core.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_core.mm; sourceTree = ""; }; ABD104131346652500AF11D1 /* cocoa_rom.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_rom.mm; sourceTree = ""; }; ABD104141346652500AF11D1 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = ""; }; ABD104271346653B00AF11D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = ""; }; ABD1FE6C1345AC8400AF11D1 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; }; ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; }; ABD1FE6F1345AC8400AF11D1 /* armcpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = armcpu.h; path = ../armcpu.h; sourceTree = SOURCE_ROOT; }; ABD1FE701345AC8400AF11D1 /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bios.h; path = ../bios.h; sourceTree = SOURCE_ROOT; }; ABD1FE711345AC8400AF11D1 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bits.h; path = ../bits.h; sourceTree = SOURCE_ROOT; }; ABD1FE721345AC8400AF11D1 /* cheatSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cheatSystem.h; path = ../cheatSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE731345AC8400AF11D1 /* commandline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = commandline.h; path = ../commandline.h; sourceTree = SOURCE_ROOT; }; ABD1FE741345AC8400AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../common.h; sourceTree = SOURCE_ROOT; }; ABD1FE751345AC8400AF11D1 /* cp15.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cp15.h; path = ../cp15.h; sourceTree = SOURCE_ROOT; }; ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ctrlssdl.h; path = ../ctrlssdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE771345AC8400AF11D1 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../debug.h; sourceTree = SOURCE_ROOT; }; ABD1FE781345AC8400AF11D1 /* desmume_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = desmume_config.h; path = ../desmume_config.h; sourceTree = SOURCE_ROOT; }; ABD1FE791345AC8400AF11D1 /* Disassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Disassembler.h; path = ../Disassembler.h; sourceTree = SOURCE_ROOT; }; ABD1FE7A1345AC8400AF11D1 /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../driver.h; sourceTree = SOURCE_ROOT; }; ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile_types.h; path = ../emufile_types.h; sourceTree = SOURCE_ROOT; }; ABD1FE7C1345AC8400AF11D1 /* emufile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile.h; path = ../emufile.h; sourceTree = SOURCE_ROOT; }; ABD1FE7D1345AC8400AF11D1 /* FIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FIFO.h; path = ../FIFO.h; sourceTree = SOURCE_ROOT; }; ABD1FE7E1345AC8400AF11D1 /* firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = firmware.h; path = ../firmware.h; sourceTree = SOURCE_ROOT; }; ABD1FE7F1345AC8400AF11D1 /* fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fs.h; path = ../fs.h; sourceTree = SOURCE_ROOT; }; ABD1FE801345AC8400AF11D1 /* gdbstub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gdbstub.h; path = ../gdbstub.h; sourceTree = SOURCE_ROOT; }; ABD1FE811345AC8400AF11D1 /* gfx3d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gfx3d.h; path = ../gfx3d.h; sourceTree = SOURCE_ROOT; }; ABD1FE821345AC8400AF11D1 /* GPU_osd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU_osd.h; path = ../GPU_osd.h; sourceTree = SOURCE_ROOT; }; ABD1FE831345AC8400AF11D1 /* GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU.h; path = ../GPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE841345AC8400AF11D1 /* lua-engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lua-engine.h"; path = "../lua-engine.h"; sourceTree = SOURCE_ROOT; }; ABD1FE851345AC8400AF11D1 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../matrix.h; sourceTree = SOURCE_ROOT; }; ABD1FE861345AC8400AF11D1 /* mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mc.h; path = ../mc.h; sourceTree = SOURCE_ROOT; }; ABD1FE871345AC8400AF11D1 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mem.h; path = ../mem.h; sourceTree = SOURCE_ROOT; }; ABD1FE881345AC8400AF11D1 /* mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mic.h; path = ../mic.h; sourceTree = SOURCE_ROOT; }; ABD1FE891345AC8400AF11D1 /* MMU_timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU_timing.h; path = ../MMU_timing.h; sourceTree = SOURCE_ROOT; }; ABD1FE8A1345AC8400AF11D1 /* MMU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU.h; path = ../MMU.h; sourceTree = SOURCE_ROOT; }; ABD1FE8B1345AC8400AF11D1 /* movie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = movie.h; path = ../movie.h; sourceTree = SOURCE_ROOT; }; ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NDSSystem.h; path = ../NDSSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender.h; path = ../OGLRender.h; sourceTree = SOURCE_ROOT; }; ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED_END.h; path = ../PACKED_END.h; sourceTree = SOURCE_ROOT; }; ABD1FE8F1345AC8400AF11D1 /* PACKED.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED.h; path = ../PACKED.h; sourceTree = SOURCE_ROOT; }; ABD1FE901345AC8400AF11D1 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path.h; path = ../path.h; sourceTree = SOURCE_ROOT; }; ABD1FE911345AC8400AF11D1 /* rasterize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rasterize.h; path = ../rasterize.h; sourceTree = SOURCE_ROOT; }; ABD1FE921345AC8400AF11D1 /* readwrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readwrite.h; path = ../readwrite.h; sourceTree = SOURCE_ROOT; }; ABD1FE931345AC8400AF11D1 /* registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registers.h; path = ../registers.h; sourceTree = SOURCE_ROOT; }; ABD1FE941345AC8400AF11D1 /* render3D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = render3D.h; path = ../render3D.h; sourceTree = SOURCE_ROOT; }; ABD1FE951345AC8400AF11D1 /* ROMReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ROMReader.h; path = ../ROMReader.h; sourceTree = SOURCE_ROOT; }; ABD1FE961345AC8400AF11D1 /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rtc.h; path = ../rtc.h; sourceTree = SOURCE_ROOT; }; ABD1FE971345AC8400AF11D1 /* saves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = saves.h; path = ../saves.h; sourceTree = SOURCE_ROOT; }; ABD1FE991345AC8400AF11D1 /* slot1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot1.h; path = ../slot1.h; sourceTree = SOURCE_ROOT; }; ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndsdl.h; path = ../sndsdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE9B1345AC8400AF11D1 /* SPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPU.h; path = ../SPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE9C1345AC8400AF11D1 /* texcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = texcache.h; path = ../texcache.h; sourceTree = SOURCE_ROOT; }; ABD1FE9E1345AC8400AF11D1 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../types.h; sourceTree = SOURCE_ROOT; }; ABD1FE9F1345AC8400AF11D1 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../version.h; sourceTree = SOURCE_ROOT; }; ABD1FEA01345AC8400AF11D1 /* wifi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wifi.h; path = ../wifi.h; sourceTree = SOURCE_ROOT; }; ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aggdraw.cpp; path = ../aggdraw.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_instructions.cpp; path = ../arm_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = armcpu.cpp; path = ../armcpu.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA51345AC8400AF11D1 /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bios.cpp; path = ../bios.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cheatSystem.cpp; path = ../cheatSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA71345AC8400AF11D1 /* commandline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = commandline.cpp; path = ../commandline.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA81345AC8400AF11D1 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../common.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA91345AC8400AF11D1 /* cp15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cp15.cpp; path = ../cp15.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ctrlssdl.cpp; path = ../ctrlssdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAB1345AC8400AF11D1 /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cpp; path = ../debug.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = desmume_config.cpp; path = ../desmume_config.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disassembler.cpp; path = ../Disassembler.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAE1345AC8400AF11D1 /* driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = driver.cpp; path = ../driver.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = emufile.cpp; path = ../emufile.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FIFO.cpp; path = ../FIFO.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB11345AC8400AF11D1 /* firmware.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = firmware.cpp; path = ../firmware.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "fs-linux.cpp"; path = "../fs-linux.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gfx3d.cpp; path = ../gfx3d.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd_stub.cpp; path = ../GPU_osd_stub.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd.cpp; path = ../GPU_osd.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB71345AC8400AF11D1 /* GPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU.cpp; path = ../GPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lua-engine.cpp"; path = "../lua-engine.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB91345AC8400AF11D1 /* matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = matrix.cpp; path = ../matrix.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBA1345AC8400AF11D1 /* mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mc.cpp; path = ../mc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_alsa.cpp; path = ../mic_alsa.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_openal.cpp; path = ../mic_openal.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBD1345AC8400AF11D1 /* mic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic.cpp; path = ../mic.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MMU.cpp; path = ../MMU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBF1345AC8400AF11D1 /* movie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = movie.cpp; path = ../movie.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NDSSystem.cpp; path = ../NDSSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender.cpp; path = ../OGLRender.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC21345AC8400AF11D1 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path.cpp; path = ../path.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rasterize.cpp; path = ../rasterize.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = readwrite.cpp; path = ../readwrite.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC51345AC8400AF11D1 /* render3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = render3D.cpp; path = ../render3D.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ROMReader.cpp; path = ../ROMReader.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC71345AC8400AF11D1 /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rtc.cpp; path = ../rtc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC81345AC8400AF11D1 /* saves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = saves.cpp; path = ../saves.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC91345AC8400AF11D1 /* slot1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1.cpp; path = ../slot1.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndsdl.cpp; path = ../sndsdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECB1345AC8400AF11D1 /* SPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SPU.cpp; path = ../SPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECC1345AC8400AF11D1 /* texcache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = texcache.cpp; path = ../texcache.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thumb_instructions.cpp; path = ../thumb_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECE1345AC8400AF11D1 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cpp; path = ../version.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECF1345AC8400AF11D1 /* wifi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wifi.cpp; path = ../wifi.cpp; sourceTree = SOURCE_ROOT; }; ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_none.cpp; sourceTree = ""; }; ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_r4.cpp; sourceTree = ""; }; ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_expMemory.cpp; sourceTree = ""; }; ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_gbagame.cpp; sourceTree = ""; }; ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_guitarGrip.cpp; sourceTree = ""; }; ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_mpcf.cpp; sourceTree = ""; }; ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_none.cpp; sourceTree = ""; }; ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_paddle.cpp; sourceTree = ""; }; ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_piano.cpp; sourceTree = ""; }; ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_rumblepak.cpp; sourceTree = ""; }; ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gdbstub.cpp; sourceTree = ""; }; ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gdbstub_internal.h; sourceTree = ""; }; ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConvertUTF.c; sourceTree = ""; }; ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = ""; }; ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = datetime.cpp; sourceTree = ""; }; ABD1FF201345ACBF00AF11D1 /* datetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datetime.h; sourceTree = ""; }; ABD1FF221345ACBF00AF11D1 /* crc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crc.cpp; sourceTree = ""; }; ABD1FF231345ACBF00AF11D1 /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decrypt.cpp; sourceTree = ""; }; ABD1FF251345ACBF00AF11D1 /* decrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decrypt.h; sourceTree = ""; }; ABD1FF261345ACBF00AF11D1 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; ABD1FF271345ACBF00AF11D1 /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = header.h; sourceTree = ""; }; ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dlditool.cpp; sourceTree = ""; }; ABD1FF291345ACBF00AF11D1 /* emufat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emufat.cpp; sourceTree = ""; }; ABD1FF2A1345ACBF00AF11D1 /* emufat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat.h; sourceTree = ""; }; ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat_types.h; sourceTree = ""; }; ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = guid.cpp; sourceTree = ""; }; ABD1FF2D1345ACBF00AF11D1 /* guid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guid.h; sourceTree = ""; }; ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_ops.h; sourceTree = ""; }; ABD1FF301345ACBF00AF11D1 /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; ABD1FF311345ACBF00AF11D1 /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; ABD1FF321345ACBF00AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; ABD1FF331345ACBF00AF11D1 /* directory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = directory.cpp; sourceTree = ""; }; ABD1FF341345ACBF00AF11D1 /* directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directory.h; sourceTree = ""; }; ABD1FF351345ACBF00AF11D1 /* disc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disc.cpp; sourceTree = ""; }; ABD1FF361345ACBF00AF11D1 /* disc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc.h; sourceTree = ""; }; ABD1FF371345ACBF00AF11D1 /* disc_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc_io.h; sourceTree = ""; }; ABD1FF381345ACBF00AF11D1 /* fat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fat.h; sourceTree = ""; }; ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatdir.cpp; sourceTree = ""; }; ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatdir.h; sourceTree = ""; }; ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatfile.cpp; sourceTree = ""; }; ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatfile.h; sourceTree = ""; }; ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_allocation_table.cpp; sourceTree = ""; }; ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_allocation_table.h; sourceTree = ""; }; ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filetime.cpp; sourceTree = ""; }; ABD1FF401345ACBF00AF11D1 /* filetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filetime.h; sourceTree = ""; }; ABD1FF411345ACBF00AF11D1 /* libfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat.cpp; sourceTree = ""; }; ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_pc.h; sourceTree = ""; }; ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat_public_api.cpp; sourceTree = ""; }; ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_public_api.h; sourceTree = ""; }; ABD1FF451345ACBF00AF11D1 /* lock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lock.cpp; sourceTree = ""; }; ABD1FF461345ACBF00AF11D1 /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_allocate.h; sourceTree = ""; }; ABD1FF481345ACBF00AF11D1 /* partition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = partition.cpp; sourceTree = ""; }; ABD1FF491345ACBF00AF11D1 /* partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition.h; sourceTree = ""; }; ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; ABD1FF4B1345ACBF00AF11D1 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; ABD1FF4C1345ACBF00AF11D1 /* task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cpp; sourceTree = ""; }; ABD1FF4D1345ACBF00AF11D1 /* task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = task.h; sourceTree = ""; }; ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = valuearray.h; sourceTree = ""; }; ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vfat.cpp; sourceTree = ""; }; ABD1FF501345ACBF00AF11D1 /* vfat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vfat.h; sourceTree = ""; }; ABD1FF511345ACBF00AF11D1 /* xstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xstring.cpp; sourceTree = ""; }; ABD1FF521345ACBF00AF11D1 /* xstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xstring.h; sourceTree = ""; }; ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metaspu.cpp; sourceTree = ""; }; ABD1FF781345ACFA00AF11D1 /* metaspu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metaspu.h; sourceTree = ""; }; ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = ""; }; ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = ""; }; ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = ""; }; ABD597BB187CD95A00069403 /* Image_GuitarGrip.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_GuitarGrip.png; path = images/Image_GuitarGrip.png; sourceTree = ""; }; ABD59813187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Blue_512x512.png; path = images/Icon_GuitarGrip_Button_Blue_512x512.png; sourceTree = ""; }; ABD59814187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Green_512x512.png; path = images/Icon_GuitarGrip_Button_Green_512x512.png; sourceTree = ""; }; ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Red_512x512.png; path = images/Icon_GuitarGrip_Button_Red_512x512.png; sourceTree = ""; }; ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_GuitarGrip_Button_Yellow_512x512.png; path = images/Icon_GuitarGrip_Button_Yellow_512x512.png; sourceTree = ""; }; ABD59836187D466700069403 /* Icon_Piano_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Piano_256x256.png; path = images/Icon_Piano_256x256.png; sourceTree = ""; }; ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_PaddleKnob_256x256.png; path = images/Icon_PaddleKnob_256x256.png; sourceTree = ""; }; ABD9A46313DB99B300777194 /* mic_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mic_ext.h; sourceTree = ""; }; ABD9A46413DB99B300777194 /* mic_ext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mic_ext.cpp; sourceTree = ""; }; ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = ""; }; ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = ""; }; ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = ""; }; ABE670261415DE6C00E8E4C9 /* tinystr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinystr.h; sourceTree = ""; }; ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxml.cpp; sourceTree = ""; }; ABE670281415DE6C00E8E4C9 /* tinyxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyxml.h; sourceTree = ""; }; ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlerror.cpp; sourceTree = ""; }; ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = ""; }; ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_firmware.h; sourceTree = ""; }; ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_firmware.mm; sourceTree = ""; }; ABECB50718A460710052D52A /* xbrz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbrz.h; sourceTree = ""; }; ABECB50818A460710052D52A /* xbrz.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xbrz.cpp; sourceTree = ""; }; ABECB51218A460910052D52A /* OGLDisplayOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OGLDisplayOutput.h; sourceTree = ""; }; ABECB51318A460910052D52A /* OGLDisplayOutput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OGLDisplayOutput.cpp; sourceTree = ""; }; ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = ""; }; ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_DeSmuME.icns; sourceTree = ""; }; ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = ""; }; ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = ""; }; ABF50A74169F5FDA0018C08D /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = ""; }; ABF50A75169F5FDA0018C08D /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = ""; }; ABF50A76169F5FDA0018C08D /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; ABF50A77169F5FDA0018C08D /* x86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86.h; sourceTree = ""; }; ABF50A79169F5FDA0018C08D /* apibegin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apibegin.h; sourceTree = ""; }; ABF50A7A169F5FDA0018C08D /* apiend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apiend.h; sourceTree = ""; }; ABF50A7B169F5FDA0018C08D /* assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembler.cpp; sourceTree = ""; }; ABF50A7C169F5FDA0018C08D /* assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembler.h; sourceTree = ""; }; ABF50A7D169F5FDA0018C08D /* assert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assert.cpp; sourceTree = ""; }; ABF50A7E169F5FDA0018C08D /* assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assert.h; sourceTree = ""; }; ABF50A7F169F5FDA0018C08D /* buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = buffer.cpp; sourceTree = ""; }; ABF50A80169F5FDA0018C08D /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; ABF50A81169F5FDA0018C08D /* build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build.h; sourceTree = ""; }; ABF50A82169F5FDA0018C08D /* compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compiler.cpp; sourceTree = ""; }; ABF50A83169F5FDA0018C08D /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = ""; }; ABF50A84169F5FDA0018C08D /* compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilercontext.cpp; sourceTree = ""; }; ABF50A85169F5FDA0018C08D /* compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilercontext.h; sourceTree = ""; }; ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilerfunc.cpp; sourceTree = ""; }; ABF50A87169F5FDA0018C08D /* compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilerfunc.h; sourceTree = ""; }; ABF50A88169F5FDA0018C08D /* compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compileritem.cpp; sourceTree = ""; }; ABF50A89169F5FDA0018C08D /* compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compileritem.h; sourceTree = ""; }; ABF50A8A169F5FDA0018C08D /* context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = context.cpp; sourceTree = ""; }; ABF50A8B169F5FDA0018C08D /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpuinfo.cpp; sourceTree = ""; }; ABF50A8D169F5FDA0018C08D /* cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpuinfo.h; sourceTree = ""; }; ABF50A8E169F5FDA0018C08D /* defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = defs.cpp; sourceTree = ""; }; ABF50A8F169F5FDA0018C08D /* defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defs.h; sourceTree = ""; }; ABF50A90169F5FDA0018C08D /* func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = func.cpp; sourceTree = ""; }; ABF50A91169F5FDA0018C08D /* func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = func.h; sourceTree = ""; }; ABF50A92169F5FDA0018C08D /* intutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intutil.h; sourceTree = ""; }; ABF50A93169F5FDA0018C08D /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; ABF50A94169F5FDA0018C08D /* logger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logger.cpp; sourceTree = ""; }; ABF50A95169F5FDA0018C08D /* logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logger.h; sourceTree = ""; }; ABF50A96169F5FDA0018C08D /* memorymanager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymanager.cpp; sourceTree = ""; }; ABF50A97169F5FDA0018C08D /* memorymanager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymanager.h; sourceTree = ""; }; ABF50A98169F5FDA0018C08D /* memorymarker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymarker.cpp; sourceTree = ""; }; ABF50A99169F5FDA0018C08D /* memorymarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymarker.h; sourceTree = ""; }; ABF50A9A169F5FDA0018C08D /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = ""; }; ABF50A9B169F5FDA0018C08D /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = ""; }; ABF50A9C169F5FDA0018C08D /* podvector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = podvector.h; sourceTree = ""; }; ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringbuilder.cpp; sourceTree = ""; }; ABF50A9E169F5FDA0018C08D /* stringbuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringbuilder.h; sourceTree = ""; }; ABF50A9F169F5FDA0018C08D /* stringutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutil.cpp; sourceTree = ""; }; ABF50AA0169F5FDA0018C08D /* stringutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutil.h; sourceTree = ""; }; ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = virtualmemory.cpp; sourceTree = ""; }; ABF50AA2169F5FDA0018C08D /* virtualmemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = virtualmemory.h; sourceTree = ""; }; ABF50AA3169F5FDA0018C08D /* zonememory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = zonememory.cpp; sourceTree = ""; }; ABF50AA4169F5FDA0018C08D /* zonememory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zonememory.h; sourceTree = ""; }; ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86assembler.cpp; sourceTree = ""; }; ABF50AA7169F5FDA0018C08D /* x86assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86assembler.h; sourceTree = ""; }; ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compiler.cpp; sourceTree = ""; }; ABF50AA9169F5FDA0018C08D /* x86compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compiler.h; sourceTree = ""; }; ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilercontext.cpp; sourceTree = ""; }; ABF50AAB169F5FDA0018C08D /* x86compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilercontext.h; sourceTree = ""; }; ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilerfunc.cpp; sourceTree = ""; }; ABF50AAD169F5FDA0018C08D /* x86compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilerfunc.h; sourceTree = ""; }; ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compileritem.cpp; sourceTree = ""; }; ABF50AAF169F5FDA0018C08D /* x86compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compileritem.h; sourceTree = ""; }; ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86cpuinfo.cpp; sourceTree = ""; }; ABF50AB1169F5FDA0018C08D /* x86cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86cpuinfo.h; sourceTree = ""; }; ABF50AB2169F5FDA0018C08D /* x86defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86defs.cpp; sourceTree = ""; }; ABF50AB3169F5FDA0018C08D /* x86defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86defs.h; sourceTree = ""; }; ABF50AB4169F5FDA0018C08D /* x86func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86func.cpp; sourceTree = ""; }; ABF50AB5169F5FDA0018C08D /* x86func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86func.h; sourceTree = ""; }; ABF50AB6169F5FDA0018C08D /* x86operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86operand.cpp; sourceTree = ""; }; ABF50AB7169F5FDA0018C08D /* x86operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86operand.h; sourceTree = ""; }; ABF50AB8169F5FDA0018C08D /* x86util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86util.cpp; sourceTree = ""; }; ABF50AB9169F5FDA0018C08D /* x86util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86util.h; sourceTree = ""; }; ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 2xsai.cpp; sourceTree = ""; }; ABFE14FB14C92FF5005D6699 /* bilinear.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bilinear.cpp; sourceTree = ""; }; ABFE14FC14C92FF5005D6699 /* epx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = epx.cpp; sourceTree = ""; }; ABFE14FD14C92FF5005D6699 /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = ""; }; ABFE14FE14C92FF5005D6699 /* hq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq2x.cpp; sourceTree = ""; }; ABFE14FF14C92FF5005D6699 /* hq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq2x.h; sourceTree = ""; }; ABFE150014C92FF5005D6699 /* hq4x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq4x.cpp; sourceTree = ""; }; ABFE150214C92FF5005D6699 /* hq4x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq4x.h; sourceTree = ""; }; ABFE150314C92FF5005D6699 /* interp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interp.h; sourceTree = ""; }; ABFE150414C92FF5005D6699 /* lq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lq2x.cpp; sourceTree = ""; }; ABFE150514C92FF5005D6699 /* lq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lq2x.h; sourceTree = ""; }; ABFE150614C92FF5005D6699 /* scanline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scanline.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ AB2A9A6C1725F00F0062C1A1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB2A9A6D1725F00F0062C1A1 /* Accelerate.framework in Frameworks */, AB2A9A6E1725F00F0062C1A1 /* AppKit.framework in Frameworks */, AB2A9A751725F00F0062C1A1 /* AudioToolbox.framework in Frameworks */, AB2A9A6F1725F00F0062C1A1 /* AudioUnit.framework in Frameworks */, ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */, AB2A9A701725F00F0062C1A1 /* Cocoa.framework in Frameworks */, AB2A9A711725F00F0062C1A1 /* Foundation.framework in Frameworks */, ABEF84851873579700E99ADC /* ForceFeedback.framework in Frameworks */, AB2A9A721725F00F0062C1A1 /* IOKit.framework in Frameworks */, AB2A9A741725F00F0062C1A1 /* libz.dylib in Frameworks */, AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */, AB1CC8001AA509C2008B0A16 /* CoreAudio.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB2F3C3A15CF9C6000858373 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D60C16964F54002AC11B /* Accelerate.framework in Frameworks */, AB2F3C3B15CF9C6000858373 /* AppKit.framework in Frameworks */, AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */, AB2F3C3C15CF9C6000858373 /* AudioUnit.framework in Frameworks */, AB7DDA70173DC3A3004F3D07 /* Carbon.framework in Frameworks */, AB2F3C3D15CF9C6000858373 /* Cocoa.framework in Frameworks */, AB2F3C3E15CF9C6000858373 /* Foundation.framework in Frameworks */, ABEF84841873579400E99ADC /* ForceFeedback.framework in Frameworks */, AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */, AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */, AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */, AB1CC80A1AA509DF008B0A16 /* CoreAudio.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB711F731481C35F009011C8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97C554169646D1002AC11B /* Accelerate.framework in Frameworks */, AB711F771481C35F009011C8 /* AppKit.framework in Frameworks */, AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */, AB711F751481C35F009011C8 /* AudioUnit.framework in Frameworks */, AB7DDA6D173DC38F004F3D07 /* Carbon.framework in Frameworks */, AB711F741481C35F009011C8 /* Cocoa.framework in Frameworks */, AB8C6E57186CD07E00E3EC64 /* ForceFeedback.framework in Frameworks */, AB711F781481C35F009011C8 /* Foundation.framework in Frameworks */, AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */, ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */, AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */, AB1CC80D1AA509E1008B0A16 /* CoreAudio.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB73AA281507C9F500A310C8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D5E516964F3B002AC11B /* Accelerate.framework in Frameworks */, AB73AA291507C9F500A310C8 /* AppKit.framework in Frameworks */, AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, AB73AA2A1507C9F500A310C8 /* AudioUnit.framework in Frameworks */, AB7DDA6E173DC399004F3D07 /* Carbon.framework in Frameworks */, AB73AA2B1507C9F500A310C8 /* Cocoa.framework in Frameworks */, ABEF84721873576300E99ADC /* ForceFeedback.framework in Frameworks */, AB73AA2C1507C9F500A310C8 /* Foundation.framework in Frameworks */, AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */, AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */, AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */, AB1CC80C1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; ABAD103E15ACE7A00000EC47 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D60916964F48002AC11B /* Accelerate.framework in Frameworks */, ABAD103F15ACE7A00000EC47 /* AppKit.framework in Frameworks */, AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, ABAD104015ACE7A00000EC47 /* AudioUnit.framework in Frameworks */, AB7DDA6F173DC39E004F3D07 /* Carbon.framework in Frameworks */, ABAD104115ACE7A00000EC47 /* Cocoa.framework in Frameworks */, ABAD104215ACE7A00000EC47 /* Foundation.framework in Frameworks */, ABEF84831873578F00E99ADC /* ForceFeedback.framework in Frameworks */, ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */, ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */, ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */, AB1CC80B1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Cocoa Port */ = { isa = PBXGroup; children = ( AB3ACB6514C2361100D7D192 /* userinterface */, AB2F56EF1704C86900E28885 /* utilities.c */, AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */, ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */, ABD9A46413DB99B300777194 /* mic_ext.cpp */, ABECB51318A460910052D52A /* OGLDisplayOutput.cpp */, ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */, ABD104141346652500AF11D1 /* sndOSX.cpp */, AB2145211714DFF4006DDB0F /* audiosamplegenerator.h */, ABA6574914511EC90077E5E9 /* cocoa_cheat.h */, ABD103FE1346652500AF11D1 /* cocoa_core.h */, AB58F32B1364F44B0074C376 /* cocoa_file.h */, ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */, AB9971CE134EDA0800531BA7 /* cocoa_globals.h */, AB6A198116CAD66900384EED /* cocoa_GPU.h */, ABD103FF1346652500AF11D1 /* cocoa_input.h */, AB3E34C7134AF4500056477A /* cocoa_output.h */, ABD104001346652500AF11D1 /* cocoa_rom.h */, ABAE2F8218682B8F00C92F4F /* cocoa_slot2.h */, AB80E050142BC4FA00A52038 /* cocoa_util.h */, ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, ABD0A5361501AA5A0074A094 /* coreaudiosound.h */, ABD9A46313DB99B300777194 /* mic_ext.h */, ABECB51218A460910052D52A /* OGLDisplayOutput.h */, ABD0A5371501AA5A0074A094 /* ringbuffer.h */, ABD104011346652500AF11D1 /* sndOSX.h */, AB2F56EE1704C86900E28885 /* utilities.h */, ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */, ABD104121346652500AF11D1 /* cocoa_core.mm */, AB58F32C1364F44B0074C376 /* cocoa_file.mm */, ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */, AB6A198216CAD66900384EED /* cocoa_GPU.mm */, ABD104111346652500AF11D1 /* cocoa_input.mm */, AB3E34C8134AF4500056477A /* cocoa_output.mm */, ABD104131346652500AF11D1 /* cocoa_rom.mm */, ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */, AB80E04C142BC4A800A52038 /* cocoa_util.mm */, ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, ); name = "Cocoa Port"; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( AB97C553169646D1002AC11B /* Accelerate.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, AB213E981710D074006DDB0F /* AudioToolbox.framework */, ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */, AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, AB0A0D1914AACA9600E83E91 /* libz.dylib */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( AB711F7F1481C35F009011C8 /* DeSmuME.app */, AB73AA331507C9F500A310C8 /* DeSmuME.app */, ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */, AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */, AB2A9A791725F00F0062C1A1 /* DeSmuME (PPC).app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* DeSmuME */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Cocoa Port */, ABC572B7134592D900E7B0B1 /* Core */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 19C28FACFE9D520D11CA2CBB /* Products */, 29B97317FDCFA39411CA2CEA /* Resources */, ); name = DeSmuME; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( ABD104271346653B00AF11D1 /* main.m */, ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( ABC2ECD613B1C87000FAAA2A /* Images */, AB00E87C14205EBC00DE561F /* MainMenu.xib */, AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */, AB350D3A147A1D93007165AC /* HID_usage_strings.plist */, 8D1107310486CEB800E47090 /* Info.plist */, AB02791814415E4C0075E58C /* Info (Debug).plist */, AB00E87914205EAE00DE561F /* InfoPlist.strings */, AB02475B13886BF300E9F9AB /* KeyNames.plist */, AB901BDD1420706100348EEC /* Localizable.strings */, ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */, ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */, AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */, AB3ACC3814C24D5400D7D192 /* AUTHORS */, AB3ACC3914C24D5400D7D192 /* ChangeLog */, AB3ACC3A14C24D5400D7D192 /* COPYING */, AB3ACC3B14C24D5400D7D192 /* README */, AB3ACC3D14C24D5400D7D192 /* README.MAC */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; AB3ACB6514C2361100D7D192 /* userinterface */ = { isa = PBXGroup; children = ( AB3ACB6614C2361100D7D192 /* appDelegate.h */, AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */, AB700DDC16CDE4C300FBD336 /* DisplayWindowController.h */, AB6A187A16C9951C00384EED /* EmuControllerDelegate.h */, ABAAFBE8172122B6005DDDBE /* FileMigrationDelegate.h */, AB5A795616D5A56000ED84B7 /* InputManager.h */, AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB213D43170CB141006DDB0F /* InputProfileController.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, ABC3DEBB1A96EA96009EC345 /* RomInfoPanel.h */, ABAE2F7918682B6C00C92F4F /* Slot2WindowDelegate.h */, ABA0356E169127BB00817C69 /* troubleshootingWindowDelegate.h */, AB3ACB6714C2361100D7D192 /* appDelegate.mm */, AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */, AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */, ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */, AB5A795716D5A56000ED84B7 /* InputManager.mm */, AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB213D44170CB141006DDB0F /* InputProfileController.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */, ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */, ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */, ); path = userinterface; sourceTree = ""; }; AB85D77414ABE42100286B70 /* App Icons */ = { isa = PBXGroup; children = ( ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */, ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */, ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */, ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */, AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */, ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */, ); name = "App Icons"; sourceTree = ""; }; ABBCE2A115ACB29100A2C965 /* AsmJit */ = { isa = PBXGroup; children = ( ABF50A78169F5FDA0018C08D /* core */, ABF50AA5169F5FDA0018C08D /* x86 */, ABF50A74169F5FDA0018C08D /* AsmJit.h */, ABF50A75169F5FDA0018C08D /* Config.h */, ABF50A76169F5FDA0018C08D /* core.h */, ABF50A77169F5FDA0018C08D /* x86.h */, ); path = AsmJit; sourceTree = ""; }; ABC2ECD613B1C87000FAAA2A /* Images */ = { isa = PBXGroup; children = ( AB85D77414ABE42100286B70 /* App Icons */, AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */, AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */, AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */, AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */, AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */, AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */, AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */, AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */, AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */, AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */, AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */, AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */, AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */, AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */, AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */, AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */, AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */, ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */, AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */, AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */, AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */, AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */, AB851D28189B2C9A007363CC /* Icon_AutoholdClear_420x420.png */, AB851D29189B2C9A007363CC /* Icon_AutoholdSet_420x420.png */, AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */, ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */, ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */, ABBFDFA61898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png */, AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */, AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */, AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */, AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */, AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */, AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */, AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */, AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */, AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */, AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */, AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */, ABBFDFAC1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png */, ABBFDFAD1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png */, ABD59813187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png */, ABD59814187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png */, ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */, ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */, AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */, AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */, AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */, ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */, AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */, AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */, AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */, AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */, ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */, AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */, ABD59836187D466700069403 /* Icon_Piano_256x256.png */, AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */, AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */, AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */, AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */, AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */, AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */, AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */, ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */, ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, ABD597BB187CD95A00069403 /* Image_GuitarGrip.png */, AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */, AB8FFE491872032B00C10085 /* Image_PaddleController.png */, AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */, ABAE30BA1869484F00C92F4F /* Image_Piano.png */, AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, ); name = Images; sourceTree = ""; }; ABC572B7134592D900E7B0B1 /* Core */ = { isa = PBXGroup; children = ( ABD1FEFF1345AC9B00AF11D1 /* addons */, ABD1FF161345ACA900AF11D1 /* gdbstub */, ABFE14F914C92FF5005D6699 /* filter */, ABD1FF761345ACFA00AF11D1 /* metaspu */, ABD1FF1C1345ACBF00AF11D1 /* utils */, ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */, ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */, ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */, ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */, ABD1FEA51345AC8400AF11D1 /* bios.cpp */, ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */, ABD1FEA71345AC8400AF11D1 /* commandline.cpp */, ABD1FEA81345AC8400AF11D1 /* common.cpp */, ABD1FEA91345AC8400AF11D1 /* cp15.cpp */, ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */, ABD1FEAB1345AC8400AF11D1 /* debug.cpp */, ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */, ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */, ABD1FEAE1345AC8400AF11D1 /* driver.cpp */, ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */, ABA93EAF178C7D4200CBF50B /* encrypt.cpp */, ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */, ABD1FEB11345AC8400AF11D1 /* firmware.cpp */, ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */, ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */, ABD1FEB71345AC8400AF11D1 /* GPU.cpp */, ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */, ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */, ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */, ABD1FEB91345AC8400AF11D1 /* matrix.cpp */, ABD1FEBA1345AC8400AF11D1 /* mc.cpp */, ABD1FEBD1345AC8400AF11D1 /* mic.cpp */, ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */, ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */, ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */, ABD1FEBF1345AC8400AF11D1 /* movie.cpp */, ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */, ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */, ABD1FEC21345AC8400AF11D1 /* path.cpp */, ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */, ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */, ABD1FEC51345AC8400AF11D1 /* render3D.cpp */, ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */, ABD1FEC71345AC8400AF11D1 /* rtc.cpp */, ABD1FEC81345AC8400AF11D1 /* saves.cpp */, ABD1FEC91345AC8400AF11D1 /* slot1.cpp */, AB53518518313E4E00CCD532 /* slot2.cpp */, ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */, ABD1FECB1345AC8400AF11D1 /* SPU.cpp */, ABD1FECC1345AC8400AF11D1 /* texcache.cpp */, ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */, ABD1FECE1345AC8400AF11D1 /* version.cpp */, ABD1FECF1345AC8400AF11D1 /* wifi.cpp */, ABD1FE6C1345AC8400AF11D1 /* agg2d.h */, ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */, ABBCE29415ACB1E600A2C965 /* arm_jit.h */, ABD1FE6F1345AC8400AF11D1 /* armcpu.h */, ABD1FE701345AC8400AF11D1 /* bios.h */, ABD1FE711345AC8400AF11D1 /* bits.h */, ABD1FE721345AC8400AF11D1 /* cheatSystem.h */, ABD1FE731345AC8400AF11D1 /* commandline.h */, ABD1FE741345AC8400AF11D1 /* common.h */, ABD1FE751345AC8400AF11D1 /* cp15.h */, ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */, ABD1FE771345AC8400AF11D1 /* debug.h */, ABD1FE781345AC8400AF11D1 /* desmume_config.h */, ABD1FE791345AC8400AF11D1 /* Disassembler.h */, ABD1FE7A1345AC8400AF11D1 /* driver.h */, ABD1FE7C1345AC8400AF11D1 /* emufile.h */, ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */, ABA93EAE178C7D4200CBF50B /* encrypt.h */, ABD1FE7D1345AC8400AF11D1 /* FIFO.h */, ABD1FE7E1345AC8400AF11D1 /* firmware.h */, ABD1FE7F1345AC8400AF11D1 /* fs.h */, ABD1FE801345AC8400AF11D1 /* gdbstub.h */, ABD1FE811345AC8400AF11D1 /* gfx3d.h */, ABD1FE831345AC8400AF11D1 /* GPU.h */, ABD1FE821345AC8400AF11D1 /* GPU_osd.h */, ABBCE29D15ACB26100A2C965 /* instruction_attributes.h */, ABBCE29E15ACB26100A2C965 /* instructions.h */, ABD1FE841345AC8400AF11D1 /* lua-engine.h */, ABD1FE851345AC8400AF11D1 /* matrix.h */, ABD1FE861345AC8400AF11D1 /* mc.h */, ABD1FE871345AC8400AF11D1 /* mem.h */, ABD1FE881345AC8400AF11D1 /* mic.h */, ABD1FE8A1345AC8400AF11D1 /* MMU.h */, ABD1FE891345AC8400AF11D1 /* MMU_timing.h */, ABD1FE8B1345AC8400AF11D1 /* movie.h */, ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */, ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */, ABD1FE8F1345AC8400AF11D1 /* PACKED.h */, ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */, ABD1FE901345AC8400AF11D1 /* path.h */, ABD1FE911345AC8400AF11D1 /* rasterize.h */, ABD1FE921345AC8400AF11D1 /* readwrite.h */, ABD1FE931345AC8400AF11D1 /* registers.h */, ABD1FE941345AC8400AF11D1 /* render3D.h */, ABD1FE951345AC8400AF11D1 /* ROMReader.h */, ABD1FE961345AC8400AF11D1 /* rtc.h */, ABD1FE971345AC8400AF11D1 /* saves.h */, ABD1FE991345AC8400AF11D1 /* slot1.h */, AB53518418313E4E00CCD532 /* slot2.h */, ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */, ABD1FE9B1345AC8400AF11D1 /* SPU.h */, ABD1FE9C1345AC8400AF11D1 /* texcache.h */, ABD1FE9E1345AC8400AF11D1 /* types.h */, ABD1FE9F1345AC8400AF11D1 /* version.h */, ABD1FEA01345AC8400AF11D1 /* wifi.h */, ); name = Core; sourceTree = ""; }; ABD1FEFF1345AC9B00AF11D1 /* addons */ = { isa = PBXGroup; children = ( ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */, ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */, AB4C808717C5D7780024D479 /* slot1_retail_auto.cpp */, AB4C808817C5D7780024D479 /* slot1_retail_mcrom.cpp */, AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */, AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */, AB4C808917C5D7780024D479 /* slot1comp_mc.cpp */, ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */, AB4C808B17C5D7780024D479 /* slot1comp_rom.cpp */, AB53517E18313E3100CCD532 /* slot2_auto.cpp */, ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */, ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */, ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */, ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */, ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */, ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */, AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */, ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */, ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */, AB4C808A17C5D7780024D479 /* slot1comp_mc.h */, ABB9211F17CEB4110049D4C5 /* slot1comp_protocol.h */, AB4C808C17C5D7780024D479 /* slot1comp_rom.h */, ); name = addons; path = ../addons; sourceTree = SOURCE_ROOT; }; ABD1FF161345ACA900AF11D1 /* gdbstub */ = { isa = PBXGroup; children = ( ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */, ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */, ); name = gdbstub; path = ../gdbstub; sourceTree = SOURCE_ROOT; }; ABD1FF1C1345ACBF00AF11D1 /* utils */ = { isa = PBXGroup; children = ( ABBCE2A115ACB29100A2C965 /* AsmJit */, ABD1FF211345ACBF00AF11D1 /* decrypt */, ABD1FF2E1345ACBF00AF11D1 /* libfat */, ABE670241415DE6C00E8E4C9 /* tinyxml */, ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */, AB4C80A917C5D7A00024D479 /* advanscene.cpp */, ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */, ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */, ABD1FF291345ACBF00AF11D1 /* emufat.cpp */, AB43528617D5BA95007417C8 /* fsnitro.cpp */, ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */, ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */, ABD1FF4C1345ACBF00AF11D1 /* task.cpp */, ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */, ABD1FF511345ACBF00AF11D1 /* xstring.cpp */, AB4C80A817C5D7A00024D479 /* advanscene.h */, ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */, ABD1FF201345ACBF00AF11D1 /* datetime.h */, ABD1FF2A1345ACBF00AF11D1 /* emufat.h */, ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */, AB43528517D5BA95007417C8 /* fsnitro.h */, ABD1FF2D1345ACBF00AF11D1 /* guid.h */, ABD1FF4B1345ACBF00AF11D1 /* md5.h */, ABD1FF4D1345ACBF00AF11D1 /* task.h */, ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */, ABD1FF501345ACBF00AF11D1 /* vfat.h */, ABD1FF521345ACBF00AF11D1 /* xstring.h */, ); name = utils; path = ../utils; sourceTree = SOURCE_ROOT; }; ABD1FF211345ACBF00AF11D1 /* decrypt */ = { isa = PBXGroup; children = ( ABD1FF221345ACBF00AF11D1 /* crc.cpp */, ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */, ABD1FF261345ACBF00AF11D1 /* header.cpp */, ABD1FF231345ACBF00AF11D1 /* crc.h */, ABD1FF251345ACBF00AF11D1 /* decrypt.h */, ABD1FF271345ACBF00AF11D1 /* header.h */, ); path = decrypt; sourceTree = ""; }; ABD1FF2E1345ACBF00AF11D1 /* libfat */ = { isa = PBXGroup; children = ( ABD1FF301345ACBF00AF11D1 /* cache.cpp */, ABD1FF331345ACBF00AF11D1 /* directory.cpp */, ABD1FF351345ACBF00AF11D1 /* disc.cpp */, ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */, ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */, ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */, ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */, ABD1FF411345ACBF00AF11D1 /* libfat.cpp */, ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */, ABD1FF451345ACBF00AF11D1 /* lock.cpp */, ABD1FF481345ACBF00AF11D1 /* partition.cpp */, ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */, ABD1FF311345ACBF00AF11D1 /* cache.h */, ABD1FF321345ACBF00AF11D1 /* common.h */, ABD1FF341345ACBF00AF11D1 /* directory.h */, ABD1FF361345ACBF00AF11D1 /* disc.h */, ABD1FF371345ACBF00AF11D1 /* disc_io.h */, ABD1FF381345ACBF00AF11D1 /* fat.h */, ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */, ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */, ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */, ABD1FF401345ACBF00AF11D1 /* filetime.h */, ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */, ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */, ABD1FF461345ACBF00AF11D1 /* lock.h */, ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */, ABD1FF491345ACBF00AF11D1 /* partition.h */, ); path = libfat; sourceTree = ""; }; ABD1FF761345ACFA00AF11D1 /* metaspu */ = { isa = PBXGroup; children = ( ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */, ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */, ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */, ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */, ABD1FF781345ACFA00AF11D1 /* metaspu.h */, ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */, ); name = metaspu; path = ../metaspu; sourceTree = SOURCE_ROOT; }; ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */ = { isa = PBXGroup; children = ( AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */, AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */, AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */, AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */, AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */, AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */, AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */, AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */, AB4C4C3216F55C64002E07CD /* TDStretch.cpp */, AB4C4C3316F55C64002E07CD /* WavFile.cpp */, AB4C4C3416F55C64002E07CD /* AAFilter.h */, AB4C4C3516F55C64002E07CD /* BPMDetect.h */, AB4C4C3616F55C64002E07CD /* cpu_detect.h */, AB4C4C3716F55C64002E07CD /* FIFOSampleBuffer.h */, AB4C4C3816F55C64002E07CD /* FIFOSamplePipe.h */, AB4C4C3916F55C64002E07CD /* FIRFilter.h */, AB4C4C3A16F55C64002E07CD /* RateTransposer.h */, AB4C4C3B16F55C64002E07CD /* SoundTouch.h */, AB4C4C3C16F55C64002E07CD /* STTypes.h */, AB4C4C3D16F55C64002E07CD /* TDStretch.h */, AB4C4C3E16F55C64002E07CD /* WavFile.h */, ); path = SoundTouch; sourceTree = ""; }; ABE670241415DE6C00E8E4C9 /* tinyxml */ = { isa = PBXGroup; children = ( ABE670251415DE6C00E8E4C9 /* tinystr.cpp */, ABE670261415DE6C00E8E4C9 /* tinystr.h */, ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */, ABE670281415DE6C00E8E4C9 /* tinyxml.h */, ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */, ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */, ); path = tinyxml; sourceTree = ""; }; ABF50A78169F5FDA0018C08D /* core */ = { isa = PBXGroup; children = ( ABF50A7B169F5FDA0018C08D /* assembler.cpp */, ABF50A7D169F5FDA0018C08D /* assert.cpp */, ABF50A7F169F5FDA0018C08D /* buffer.cpp */, ABF50A82169F5FDA0018C08D /* compiler.cpp */, ABF50A84169F5FDA0018C08D /* compilercontext.cpp */, ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */, ABF50A88169F5FDA0018C08D /* compileritem.cpp */, ABF50A8A169F5FDA0018C08D /* context.cpp */, ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */, ABF50A8E169F5FDA0018C08D /* defs.cpp */, ABF50A90169F5FDA0018C08D /* func.cpp */, ABF50A94169F5FDA0018C08D /* logger.cpp */, ABF50A96169F5FDA0018C08D /* memorymanager.cpp */, ABF50A98169F5FDA0018C08D /* memorymarker.cpp */, ABF50A9A169F5FDA0018C08D /* operand.cpp */, ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */, ABF50A9F169F5FDA0018C08D /* stringutil.cpp */, ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */, ABF50AA3169F5FDA0018C08D /* zonememory.cpp */, ABF50A79169F5FDA0018C08D /* apibegin.h */, ABF50A7A169F5FDA0018C08D /* apiend.h */, ABF50A7C169F5FDA0018C08D /* assembler.h */, ABF50A7E169F5FDA0018C08D /* assert.h */, ABF50A80169F5FDA0018C08D /* buffer.h */, ABF50A81169F5FDA0018C08D /* build.h */, ABF50A83169F5FDA0018C08D /* compiler.h */, ABF50A85169F5FDA0018C08D /* compilercontext.h */, ABF50A87169F5FDA0018C08D /* compilerfunc.h */, ABF50A89169F5FDA0018C08D /* compileritem.h */, ABF50A8B169F5FDA0018C08D /* context.h */, ABF50A8D169F5FDA0018C08D /* cpuinfo.h */, ABF50A8F169F5FDA0018C08D /* defs.h */, ABF50A91169F5FDA0018C08D /* func.h */, ABF50A92169F5FDA0018C08D /* intutil.h */, ABF50A93169F5FDA0018C08D /* lock.h */, ABF50A95169F5FDA0018C08D /* logger.h */, ABF50A97169F5FDA0018C08D /* memorymanager.h */, ABF50A99169F5FDA0018C08D /* memorymarker.h */, ABF50A9B169F5FDA0018C08D /* operand.h */, ABF50A9C169F5FDA0018C08D /* podvector.h */, ABF50A9E169F5FDA0018C08D /* stringbuilder.h */, ABF50AA0169F5FDA0018C08D /* stringutil.h */, ABF50AA2169F5FDA0018C08D /* virtualmemory.h */, ABF50AA4169F5FDA0018C08D /* zonememory.h */, ); path = core; sourceTree = ""; }; ABF50AA5169F5FDA0018C08D /* x86 */ = { isa = PBXGroup; children = ( ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */, ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */, ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */, ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */, ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */, ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */, ABF50AB2169F5FDA0018C08D /* x86defs.cpp */, ABF50AB4169F5FDA0018C08D /* x86func.cpp */, ABF50AB6169F5FDA0018C08D /* x86operand.cpp */, ABF50AB8169F5FDA0018C08D /* x86util.cpp */, ABF50AA7169F5FDA0018C08D /* x86assembler.h */, ABF50AA9169F5FDA0018C08D /* x86compiler.h */, ABF50AAB169F5FDA0018C08D /* x86compilercontext.h */, ABF50AAD169F5FDA0018C08D /* x86compilerfunc.h */, ABF50AAF169F5FDA0018C08D /* x86compileritem.h */, ABF50AB1169F5FDA0018C08D /* x86cpuinfo.h */, ABF50AB3169F5FDA0018C08D /* x86defs.h */, ABF50AB5169F5FDA0018C08D /* x86func.h */, ABF50AB7169F5FDA0018C08D /* x86operand.h */, ABF50AB9169F5FDA0018C08D /* x86util.h */, ); path = x86; sourceTree = ""; }; ABFE14F914C92FF5005D6699 /* filter */ = { isa = PBXGroup; children = ( ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */, ABFE14FB14C92FF5005D6699 /* bilinear.cpp */, ABFE14FC14C92FF5005D6699 /* epx.cpp */, ABFE14FE14C92FF5005D6699 /* hq2x.cpp */, ABFE150014C92FF5005D6699 /* hq4x.cpp */, ABFE150414C92FF5005D6699 /* lq2x.cpp */, ABFE150614C92FF5005D6699 /* scanline.cpp */, AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */, ABECB50818A460710052D52A /* xbrz.cpp */, ABFE14FD14C92FF5005D6699 /* filter.h */, ABFE14FF14C92FF5005D6699 /* hq2x.h */, ABFE150214C92FF5005D6699 /* hq4x.h */, ABFE150314C92FF5005D6699 /* interp.h */, ABFE150514C92FF5005D6699 /* lq2x.h */, AB817A34143EE2DB00A7DFE9 /* videofilter.h */, ABECB50718A460710052D52A /* xbrz.h */, ); name = filter; path = ../filter; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ AB2A99A41725F00F0062C1A1 /* DeSmuME (OS X App; PowerPC Release Build) */ = { isa = PBXNativeTarget; buildConfigurationList = AB2A9A761725F00F0062C1A1 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC Release Build)" */; buildPhases = ( AB2A99A51725F00F0062C1A1 /* ShellScript */, AB2A99A61725F00F0062C1A1 /* Resources */, AB2A99EF1725F00F0062C1A1 /* ShellScript */, AB2A99F01725F00F0062C1A1 /* Sources */, AB2A9A6C1725F00F0062C1A1 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC Release Build)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB2A9A791725F00F0062C1A1 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; AB2F3B7A15CF9C6000858373 /* DeSmuME (OS X App; PowerPC; LLVM-GCC) */ = { isa = PBXNativeTarget; buildConfigurationList = AB2F3C4215CF9C6000858373 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-GCC)" */; buildPhases = ( AB2F3B7B15CF9C6000858373 /* ShellScript */, AB2F3B7C15CF9C6000858373 /* Resources */, ABE76A8015E0904E00F458AE /* ShellScript */, AB2F3BC415CF9C6000858373 /* Sources */, AB2F3C3A15CF9C6000858373 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC; LLVM-GCC)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; AB711EBD1481C35F009011C8 /* DeSmuME (OS X App; Intel; LLVM-Clang) */ = { isa = PBXNativeTarget; buildConfigurationList = AB711F7C1481C35F009011C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-Clang)" */; buildPhases = ( AB75222C14C799C1009B97B3 /* ShellScript */, AB711EBE1481C35F009011C8 /* Resources */, ABE76A5215E08E1100F458AE /* ShellScript */, AB711EFF1481C35F009011C8 /* Sources */, AB711F731481C35F009011C8 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; Intel; LLVM-Clang)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB711F7F1481C35F009011C8 /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; AB73A9671507C9F500A310C8 /* DeSmuME (OS X App; Intel; LLVM-GCC) */ = { isa = PBXNativeTarget; buildConfigurationList = AB73AA301507C9F500A310C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-GCC)" */; buildPhases = ( AB73A9681507C9F500A310C8 /* ShellScript */, AB73A9691507C9F500A310C8 /* Resources */, ABE76A7C15E0902700F458AE /* ShellScript */, AB73A9B21507C9F500A310C8 /* Sources */, AB73AA281507C9F500A310C8 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; Intel; LLVM-GCC)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB73AA331507C9F500A310C8 /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; ABAD0F7015ACE7A00000EC47 /* DeSmuME (OS X App; PowerPC; LLVM-Clang) */ = { isa = PBXNativeTarget; buildConfigurationList = ABAD104615ACE7A00000EC47 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-Clang)" */; buildPhases = ( ABAD0F7115ACE7A00000EC47 /* ShellScript */, ABAD0F7215ACE7A00000EC47 /* Resources */, ABE76A7E15E0903E00F458AE /* ShellScript */, ABAD0FBA15ACE7A00000EC47 /* Sources */, ABAD103E15ACE7A00000EC47 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC; LLVM-Clang)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { ORGANIZATIONNAME = "DeSmuME Team"; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 3)" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, Italian, Chinese, Norwegian, Romanian, ); mainGroup = 29B97314FDCFA39411CA2CEA /* DeSmuME */; projectDirPath = ""; projectRoot = ""; targets = ( AB711EBD1481C35F009011C8 /* DeSmuME (OS X App; Intel; LLVM-Clang) */, AB73A9671507C9F500A310C8 /* DeSmuME (OS X App; Intel; LLVM-GCC) */, ABAD0F7015ACE7A00000EC47 /* DeSmuME (OS X App; PowerPC; LLVM-Clang) */, AB2F3B7A15CF9C6000858373 /* DeSmuME (OS X App; PowerPC; LLVM-GCC) */, AB2A99A41725F00F0062C1A1 /* DeSmuME (OS X App; PowerPC Release Build) */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ AB2A99A61725F00F0062C1A1 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2A99A71725F00F0062C1A1 /* KeyNames.plist in Resources */, AB2A99A81725F00F0062C1A1 /* DefaultKeyMappings.plist in Resources */, AB2A99A91725F00F0062C1A1 /* DefaultUserPrefs.plist in Resources */, AB2A99AA1725F00F0062C1A1 /* FileTypeInfo.plist in Resources */, AB2A99AB1725F00F0062C1A1 /* AppIcon_ROMSave.icns in Resources */, AB2A99AC1725F00F0062C1A1 /* AppIcon_DeSmuME.icns in Resources */, AB2A99AD1725F00F0062C1A1 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB2A99AE1725F00F0062C1A1 /* AppIcon_SaveState.icns in Resources */, AB2A99AF1725F00F0062C1A1 /* InfoPlist.strings in Resources */, AB2A99B01725F00F0062C1A1 /* MainMenu.xib in Resources */, AB2A99B11725F00F0062C1A1 /* Localizable.strings in Resources */, AB2A99B21725F00F0062C1A1 /* Icon_ActionReplay_32x32.png in Resources */, AB2A99B31725F00F0062C1A1 /* Icon_CodeBreaker_32x32.png in Resources */, AB2A99B41725F00F0062C1A1 /* Icon_DeSmuME_32x32.png in Resources */, AB2A99B51725F00F0062C1A1 /* HID_usage_strings.plist in Resources */, AB2A99B61725F00F0062C1A1 /* AppIcon_ROMCheats.icns in Resources */, AB2A99B71725F00F0062C1A1 /* Icon_VolumeFull_16x16.png in Resources */, AB2A99B81725F00F0062C1A1 /* Icon_VolumeMute_16x16.png in Resources */, AB2A99B91725F00F0062C1A1 /* Icon_VolumeOneThird_16x16.png in Resources */, AB2A99BA1725F00F0062C1A1 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB2A99BB1725F00F0062C1A1 /* Icon_Execute_420x420.png in Resources */, AB2A99BC1725F00F0062C1A1 /* Icon_Pause_420x420.png in Resources */, AB2A99BD1725F00F0062C1A1 /* Icon_Speed1x_420x420.png in Resources */, AB2A99BE1725F00F0062C1A1 /* Icon_Speed2x_420x420.png in Resources */, AB2A99BF1725F00F0062C1A1 /* ColorSwatch_Blue_16x16.png in Resources */, AB2A99C01725F00F0062C1A1 /* ColorSwatch_Brown_16x16.png in Resources */, AB2A99C11725F00F0062C1A1 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB2A99C21725F00F0062C1A1 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB2A99C31725F00F0062C1A1 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB2A99C41725F00F0062C1A1 /* ColorSwatch_Gray_16x16.png in Resources */, AB2A99C51725F00F0062C1A1 /* ColorSwatch_Green_16x16.png in Resources */, AB2A99C61725F00F0062C1A1 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB2A99C71725F00F0062C1A1 /* ColorSwatch_Magenta_16x16.png in Resources */, AB2A99C81725F00F0062C1A1 /* ColorSwatch_Orange_16x16.png in Resources */, AB2A99C91725F00F0062C1A1 /* ColorSwatch_Pink_16x16.png in Resources */, AB2A99CA1725F00F0062C1A1 /* ColorSwatch_Red_16x16.png in Resources */, AB2A99CB1725F00F0062C1A1 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB2A99CC1725F00F0062C1A1 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB2A99CD1725F00F0062C1A1 /* ColorSwatch_Violet_16x16.png in Resources */, AB2A99CE1725F00F0062C1A1 /* ColorSwatch_Yellow_16x16.png in Resources */, AB2A99CF1725F00F0062C1A1 /* Icon_ActionReplay_128x128.png in Resources */, AB2A99D01725F00F0062C1A1 /* Icon_CodeBreaker_128x128.png in Resources */, AB2A99D11725F00F0062C1A1 /* VideoFilterPreview_64x64.png in Resources */, AB2A99D21725F00F0062C1A1 /* Icon_ArrowDown_420x420.png in Resources */, AB2A99D31725F00F0062C1A1 /* Icon_ArrowLeft_420x420.png in Resources */, AB2A99D41725F00F0062C1A1 /* Icon_ArrowRight_420x420.png in Resources */, AB2A99D51725F00F0062C1A1 /* Icon_ArrowUp_420x420.png in Resources */, AB2A99D61725F00F0062C1A1 /* Icon_DoubleSpeed_420x420.png in Resources */, AB2A99D71725F00F0062C1A1 /* Icon_DSButtonA_420x420.png in Resources */, AB2A99D81725F00F0062C1A1 /* Icon_DSButtonB_420x420.png in Resources */, AB2A99D91725F00F0062C1A1 /* Icon_DSButtonL_420x420.png in Resources */, AB2A99DA1725F00F0062C1A1 /* Icon_DSButtonR_420x420.png in Resources */, AB2A99DB1725F00F0062C1A1 /* Icon_DSButtonSelect_420x420.png in Resources */, AB2A99DC1725F00F0062C1A1 /* Icon_DSButtonStart_420x420.png in Resources */, AB2A99DD1725F00F0062C1A1 /* Icon_DSButtonX_420x420.png in Resources */, AB2A99DE1725F00F0062C1A1 /* Icon_DSButtonY_420x420.png in Resources */, AB2A99DF1725F00F0062C1A1 /* Icon_Emulation_420x420.png in Resources */, AB2A99E01725F00F0062C1A1 /* Icon_Input_420x420.png in Resources */, AB2A99E21725F00F0062C1A1 /* Icon_OpenROM_420x420.png in Resources */, AB2A99E31725F00F0062C1A1 /* Icon_Reset_420x420.png in Resources */, AB2A99E41725F00F0062C1A1 /* Icon_RotateCCW_420x420.png in Resources */, AB2A99E51725F00F0062C1A1 /* Icon_RotateCW_420x420.png in Resources */, AB2A99E61725F00F0062C1A1 /* Icon_ShowHUD_420x420.png in Resources */, AB2A99E71725F00F0062C1A1 /* Icon_Speaker_420x420.png in Resources */, AB2A99E81725F00F0062C1A1 /* AUTHORS in Resources */, AB2A99E91725F00F0062C1A1 /* ChangeLog in Resources */, AB2A99EA1725F00F0062C1A1 /* COPYING in Resources */, AB2A99EB1725F00F0062C1A1 /* README in Resources */, AB2A99EC1725F00F0062C1A1 /* README.MAC in Resources */, AB2A99ED1725F00F0062C1A1 /* AppIcon_FirmwareConfig.icns in Resources */, AB2A99EE1725F00F0062C1A1 /* DisplayWindow.xib in Resources */, ABAE30BF1869484F00C92F4F /* Image_Piano.png in Resources */, AB8C6CC3186A950C00E3EC64 /* Image_PassME.png in Resources */, AB14202A186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, AB8FFE4E1872032B00C10085 /* Image_PaddleController.png in Resources */, ABD597C0187CD95A00069403 /* Image_GuitarGrip.png in Resources */, ABD59827187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, ABD59828187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, ABD59829187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABD5982A187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, ABD5983B187D466700069403 /* Icon_Piano_256x256.png in Resources */, ABD5984B187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */, ABBFDFAB1898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */, ABBFDFB61898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */, ABBFDFB71898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */, AB851D32189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */, AB851D33189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */, AB1CC82F1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */, AB1CC8301AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, AB1CC8311AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */, AB1CC8321AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */, AB1CC8331AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */, ABACB73E1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB2F3B7C15CF9C6000858373 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2F3B7D15CF9C6000858373 /* KeyNames.plist in Resources */, AB2F3B7E15CF9C6000858373 /* DefaultKeyMappings.plist in Resources */, AB2F3B7F15CF9C6000858373 /* DefaultUserPrefs.plist in Resources */, AB2F3B8015CF9C6000858373 /* FileTypeInfo.plist in Resources */, AB2F3B8115CF9C6000858373 /* AppIcon_ROMSave.icns in Resources */, AB2F3B8215CF9C6000858373 /* AppIcon_DeSmuME.icns in Resources */, AB2F3B8315CF9C6000858373 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB2F3B8415CF9C6000858373 /* AppIcon_SaveState.icns in Resources */, AB2F3B8515CF9C6000858373 /* InfoPlist.strings in Resources */, AB2F3B8615CF9C6000858373 /* MainMenu.xib in Resources */, AB2F3B8715CF9C6000858373 /* Localizable.strings in Resources */, AB2F3B8815CF9C6000858373 /* Icon_ActionReplay_32x32.png in Resources */, AB2F3B8915CF9C6000858373 /* Icon_CodeBreaker_32x32.png in Resources */, AB2F3B8A15CF9C6000858373 /* Icon_DeSmuME_32x32.png in Resources */, AB2F3B8B15CF9C6000858373 /* HID_usage_strings.plist in Resources */, AB2F3B8C15CF9C6000858373 /* AppIcon_ROMCheats.icns in Resources */, AB2F3B8D15CF9C6000858373 /* Icon_VolumeFull_16x16.png in Resources */, AB2F3B8E15CF9C6000858373 /* Icon_VolumeMute_16x16.png in Resources */, AB2F3B8F15CF9C6000858373 /* Icon_VolumeOneThird_16x16.png in Resources */, AB2F3B9015CF9C6000858373 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB2F3B9115CF9C6000858373 /* Icon_Execute_420x420.png in Resources */, AB2F3B9215CF9C6000858373 /* Icon_Pause_420x420.png in Resources */, AB2F3B9315CF9C6000858373 /* Icon_Speed1x_420x420.png in Resources */, AB2F3B9415CF9C6000858373 /* Icon_Speed2x_420x420.png in Resources */, AB2F3B9515CF9C6000858373 /* ColorSwatch_Blue_16x16.png in Resources */, AB2F3B9615CF9C6000858373 /* ColorSwatch_Brown_16x16.png in Resources */, AB2F3B9715CF9C6000858373 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB2F3B9815CF9C6000858373 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB2F3B9915CF9C6000858373 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB2F3B9A15CF9C6000858373 /* ColorSwatch_Gray_16x16.png in Resources */, AB2F3B9B15CF9C6000858373 /* ColorSwatch_Green_16x16.png in Resources */, AB2F3B9C15CF9C6000858373 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB2F3B9D15CF9C6000858373 /* ColorSwatch_Magenta_16x16.png in Resources */, AB2F3B9E15CF9C6000858373 /* ColorSwatch_Orange_16x16.png in Resources */, AB2F3B9F15CF9C6000858373 /* ColorSwatch_Pink_16x16.png in Resources */, AB2F3BA015CF9C6000858373 /* ColorSwatch_Red_16x16.png in Resources */, AB2F3BA115CF9C6000858373 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB2F3BA215CF9C6000858373 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB2F3BA315CF9C6000858373 /* ColorSwatch_Violet_16x16.png in Resources */, AB2F3BA415CF9C6000858373 /* ColorSwatch_Yellow_16x16.png in Resources */, AB2F3BA515CF9C6000858373 /* Icon_ActionReplay_128x128.png in Resources */, AB2F3BA615CF9C6000858373 /* Icon_CodeBreaker_128x128.png in Resources */, AB2F3BA715CF9C6000858373 /* VideoFilterPreview_64x64.png in Resources */, AB2F3BA815CF9C6000858373 /* Icon_ArrowDown_420x420.png in Resources */, AB2F3BA915CF9C6000858373 /* Icon_ArrowLeft_420x420.png in Resources */, AB2F3BAA15CF9C6000858373 /* Icon_ArrowRight_420x420.png in Resources */, AB2F3BAB15CF9C6000858373 /* Icon_ArrowUp_420x420.png in Resources */, AB2F3BAC15CF9C6000858373 /* Icon_DoubleSpeed_420x420.png in Resources */, AB2F3BAD15CF9C6000858373 /* Icon_DSButtonA_420x420.png in Resources */, AB2F3BAE15CF9C6000858373 /* Icon_DSButtonB_420x420.png in Resources */, AB2F3BAF15CF9C6000858373 /* Icon_DSButtonL_420x420.png in Resources */, AB2F3BB015CF9C6000858373 /* Icon_DSButtonR_420x420.png in Resources */, AB2F3BB115CF9C6000858373 /* Icon_DSButtonSelect_420x420.png in Resources */, AB2F3BB215CF9C6000858373 /* Icon_DSButtonStart_420x420.png in Resources */, AB2F3BB315CF9C6000858373 /* Icon_DSButtonX_420x420.png in Resources */, AB2F3BB415CF9C6000858373 /* Icon_DSButtonY_420x420.png in Resources */, AB2F3BB515CF9C6000858373 /* Icon_Emulation_420x420.png in Resources */, AB2F3BB615CF9C6000858373 /* Icon_Input_420x420.png in Resources */, AB2F3BB815CF9C6000858373 /* Icon_OpenROM_420x420.png in Resources */, AB2F3BB915CF9C6000858373 /* Icon_Reset_420x420.png in Resources */, AB2F3BBA15CF9C6000858373 /* Icon_RotateCCW_420x420.png in Resources */, AB2F3BBB15CF9C6000858373 /* Icon_RotateCW_420x420.png in Resources */, AB2F3BBC15CF9C6000858373 /* Icon_ShowHUD_420x420.png in Resources */, AB2F3BBD15CF9C6000858373 /* Icon_Speaker_420x420.png in Resources */, AB2F3BBE15CF9C6000858373 /* AUTHORS in Resources */, AB2F3BBF15CF9C6000858373 /* ChangeLog in Resources */, AB2F3BC015CF9C6000858373 /* COPYING in Resources */, AB2F3BC115CF9C6000858373 /* README in Resources */, AB2F3BC215CF9C6000858373 /* README.MAC in Resources */, AB2F3BC315CF9C6000858373 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBA16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ABAE30BB1869484F00C92F4F /* Image_Piano.png in Resources */, AB8C6CBF186A950C00E3EC64 /* Image_PassME.png in Resources */, AB142026186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, AB8FFE4A1872032B00C10085 /* Image_PaddleController.png in Resources */, ABD597BC187CD95A00069403 /* Image_GuitarGrip.png in Resources */, ABD59817187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, ABD59818187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, ABD59819187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABD5981A187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, ABD59837187D466700069403 /* Icon_Piano_256x256.png in Resources */, ABD59847187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */, ABBFDFA81898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */, ABBFDFB01898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */, ABBFDFB11898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */, AB851D2C189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */, AB851D2D189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */, AB1CC81B1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */, AB1CC81C1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, AB1CC81D1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */, AB1CC81E1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */, AB1CC81F1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */, ABACB73A1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB711EBE1481C35F009011C8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB711ED21481C35F009011C8 /* KeyNames.plist in Resources */, AB711ED31481C35F009011C8 /* DefaultKeyMappings.plist in Resources */, AB711ED81481C35F009011C8 /* DefaultUserPrefs.plist in Resources */, AB711EDE1481C35F009011C8 /* FileTypeInfo.plist in Resources */, AB711EEF1481C35F009011C8 /* AppIcon_ROMSave.icns in Resources */, AB711EF01481C35F009011C8 /* AppIcon_DeSmuME.icns in Resources */, AB711EF11481C35F009011C8 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB711EF21481C35F009011C8 /* AppIcon_SaveState.icns in Resources */, AB711EF31481C35F009011C8 /* InfoPlist.strings in Resources */, AB711EF41481C35F009011C8 /* MainMenu.xib in Resources */, AB711EF51481C35F009011C8 /* Localizable.strings in Resources */, AB711EFB1481C35F009011C8 /* Icon_ActionReplay_32x32.png in Resources */, AB711EFC1481C35F009011C8 /* Icon_CodeBreaker_32x32.png in Resources */, AB711EFD1481C35F009011C8 /* Icon_DeSmuME_32x32.png in Resources */, AB711EFE1481C35F009011C8 /* HID_usage_strings.plist in Resources */, ABBF04A614B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */, ABC3AF3314B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */, ABC3AF3414B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */, ABC3AF3514B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */, ABC3AF3614B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */, AB0F290614BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */, AB0F290714BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */, AB0F290814BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */, AB0F290914BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */, AB0F294814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */, AB0F294914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */, AB0F294A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB0F294B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB0F294C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB0F294D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */, AB0F294E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */, AB0F294F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB0F295014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */, AB0F295114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */, AB0F295214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */, AB0F295314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */, AB0F295414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB0F295514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */, AB0F295614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */, AB0F295714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */, AB0F296F14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */, AB0F297014BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */, AB0F297B14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */, AB0F299014BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */, AB0F299114BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */, AB0F299214BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */, AB0F299314BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */, AB0F29B814BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */, AB0F29B914BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */, AB0F29BA14BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */, AB0F29BB14BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */, AB0F29BC14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */, AB0F29BD14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */, AB0F29BE14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */, AB0F29BF14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */, AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */, AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */, AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */, AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */, AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */, AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */, AB0F29C714BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */, AB0F29C814BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */, AB0F29C914BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */, AB3ACC4414C24D5400D7D192 /* AUTHORS in Resources */, AB3ACC4514C24D5400D7D192 /* ChangeLog in Resources */, AB3ACC4614C24D5400D7D192 /* COPYING in Resources */, AB3ACC4714C24D5400D7D192 /* README in Resources */, AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */, AB75226F14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBB16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ABAE30BC1869484F00C92F4F /* Image_Piano.png in Resources */, AB8C6CC0186A950C00E3EC64 /* Image_PassME.png in Resources */, AB142027186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, AB8FFE4B1872032B00C10085 /* Image_PaddleController.png in Resources */, ABD597BD187CD95A00069403 /* Image_GuitarGrip.png in Resources */, ABD5981B187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, ABD5981C187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, ABD5981D187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABD5981E187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, ABD59838187D466700069403 /* Icon_Piano_256x256.png in Resources */, ABD59848187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */, ABBFDFA71898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */, ABBFDFAE1898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */, ABBFDFAF1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */, AB851D2A189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */, AB851D2B189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */, AB1CC8201AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */, AB1CC8211AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, AB1CC8221AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */, AB1CC8231AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */, AB1CC8241AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */, ABACB73B1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB73A9691507C9F500A310C8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB73A96A1507C9F500A310C8 /* KeyNames.plist in Resources */, AB73A96B1507C9F500A310C8 /* DefaultKeyMappings.plist in Resources */, AB73A96C1507C9F500A310C8 /* DefaultUserPrefs.plist in Resources */, AB73A96D1507C9F500A310C8 /* FileTypeInfo.plist in Resources */, AB73A96E1507C9F500A310C8 /* AppIcon_ROMSave.icns in Resources */, AB73A96F1507C9F500A310C8 /* AppIcon_DeSmuME.icns in Resources */, AB73A9701507C9F500A310C8 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB73A9711507C9F500A310C8 /* AppIcon_SaveState.icns in Resources */, AB73A9721507C9F500A310C8 /* InfoPlist.strings in Resources */, AB73A9731507C9F500A310C8 /* MainMenu.xib in Resources */, AB73A9741507C9F500A310C8 /* Localizable.strings in Resources */, AB73A9751507C9F500A310C8 /* Icon_ActionReplay_32x32.png in Resources */, AB73A9761507C9F500A310C8 /* Icon_CodeBreaker_32x32.png in Resources */, AB73A9771507C9F500A310C8 /* Icon_DeSmuME_32x32.png in Resources */, AB73A9781507C9F500A310C8 /* HID_usage_strings.plist in Resources */, AB73A9791507C9F500A310C8 /* AppIcon_ROMCheats.icns in Resources */, AB73A97A1507C9F500A310C8 /* Icon_VolumeFull_16x16.png in Resources */, AB73A97B1507C9F500A310C8 /* Icon_VolumeMute_16x16.png in Resources */, AB73A97C1507C9F500A310C8 /* Icon_VolumeOneThird_16x16.png in Resources */, AB73A97D1507C9F500A310C8 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB73A97E1507C9F500A310C8 /* Icon_Execute_420x420.png in Resources */, AB73A97F1507C9F500A310C8 /* Icon_Pause_420x420.png in Resources */, AB73A9801507C9F500A310C8 /* Icon_Speed1x_420x420.png in Resources */, AB73A9811507C9F500A310C8 /* Icon_Speed2x_420x420.png in Resources */, AB73A9821507C9F500A310C8 /* ColorSwatch_Blue_16x16.png in Resources */, AB73A9831507C9F500A310C8 /* ColorSwatch_Brown_16x16.png in Resources */, AB73A9841507C9F500A310C8 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB73A9851507C9F500A310C8 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB73A9861507C9F500A310C8 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB73A9871507C9F500A310C8 /* ColorSwatch_Gray_16x16.png in Resources */, AB73A9881507C9F500A310C8 /* ColorSwatch_Green_16x16.png in Resources */, AB73A9891507C9F500A310C8 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB73A98A1507C9F500A310C8 /* ColorSwatch_Magenta_16x16.png in Resources */, AB73A98B1507C9F500A310C8 /* ColorSwatch_Orange_16x16.png in Resources */, AB73A98C1507C9F500A310C8 /* ColorSwatch_Pink_16x16.png in Resources */, AB73A98D1507C9F500A310C8 /* ColorSwatch_Red_16x16.png in Resources */, AB73A98E1507C9F500A310C8 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB73A98F1507C9F500A310C8 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB73A9901507C9F500A310C8 /* ColorSwatch_Violet_16x16.png in Resources */, AB73A9911507C9F500A310C8 /* ColorSwatch_Yellow_16x16.png in Resources */, AB73A9921507C9F500A310C8 /* Icon_ActionReplay_128x128.png in Resources */, AB73A9931507C9F500A310C8 /* Icon_CodeBreaker_128x128.png in Resources */, AB73A9941507C9F500A310C8 /* VideoFilterPreview_64x64.png in Resources */, AB73A9951507C9F500A310C8 /* Icon_ArrowDown_420x420.png in Resources */, AB73A9961507C9F500A310C8 /* Icon_ArrowLeft_420x420.png in Resources */, AB73A9971507C9F500A310C8 /* Icon_ArrowRight_420x420.png in Resources */, AB73A9981507C9F500A310C8 /* Icon_ArrowUp_420x420.png in Resources */, AB73A9991507C9F500A310C8 /* Icon_DoubleSpeed_420x420.png in Resources */, AB73A99A1507C9F500A310C8 /* Icon_DSButtonA_420x420.png in Resources */, AB73A99B1507C9F500A310C8 /* Icon_DSButtonB_420x420.png in Resources */, AB73A99C1507C9F500A310C8 /* Icon_DSButtonL_420x420.png in Resources */, AB73A99D1507C9F500A310C8 /* Icon_DSButtonR_420x420.png in Resources */, AB73A99E1507C9F500A310C8 /* Icon_DSButtonSelect_420x420.png in Resources */, AB73A99F1507C9F500A310C8 /* Icon_DSButtonStart_420x420.png in Resources */, AB73A9A01507C9F500A310C8 /* Icon_DSButtonX_420x420.png in Resources */, AB73A9A11507C9F500A310C8 /* Icon_DSButtonY_420x420.png in Resources */, AB73A9A21507C9F500A310C8 /* Icon_Emulation_420x420.png in Resources */, AB73A9A31507C9F500A310C8 /* Icon_Input_420x420.png in Resources */, AB73A9A51507C9F500A310C8 /* Icon_OpenROM_420x420.png in Resources */, AB73A9A61507C9F500A310C8 /* Icon_Reset_420x420.png in Resources */, AB73A9A71507C9F500A310C8 /* Icon_RotateCCW_420x420.png in Resources */, AB73A9A81507C9F500A310C8 /* Icon_RotateCW_420x420.png in Resources */, AB73A9A91507C9F500A310C8 /* Icon_ShowHUD_420x420.png in Resources */, AB73A9AA1507C9F500A310C8 /* Icon_Speaker_420x420.png in Resources */, AB73A9AB1507C9F500A310C8 /* AUTHORS in Resources */, AB73A9AC1507C9F500A310C8 /* ChangeLog in Resources */, AB73A9AD1507C9F500A310C8 /* COPYING in Resources */, AB73A9AE1507C9F500A310C8 /* README in Resources */, AB73A9B01507C9F500A310C8 /* README.MAC in Resources */, AB73A9B11507C9F500A310C8 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBD16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ABAE30BE1869484F00C92F4F /* Image_Piano.png in Resources */, AB8C6CC2186A950C00E3EC64 /* Image_PassME.png in Resources */, AB142029186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, AB8FFE4D1872032B00C10085 /* Image_PaddleController.png in Resources */, ABD597BF187CD95A00069403 /* Image_GuitarGrip.png in Resources */, ABD59823187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, ABD59824187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, ABD59825187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABD59826187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, ABD5983A187D466700069403 /* Icon_Piano_256x256.png in Resources */, ABD5984A187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */, ABBFDFAA1898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */, ABBFDFB41898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */, ABBFDFB51898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */, AB851D30189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */, AB851D31189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */, AB1CC82A1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */, AB1CC82B1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, AB1CC82C1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */, AB1CC82D1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */, AB1CC82E1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */, ABACB73D1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABAD0F7215ACE7A00000EC47 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ABAD0F7315ACE7A00000EC47 /* KeyNames.plist in Resources */, ABAD0F7415ACE7A00000EC47 /* DefaultKeyMappings.plist in Resources */, ABAD0F7515ACE7A00000EC47 /* DefaultUserPrefs.plist in Resources */, ABAD0F7615ACE7A00000EC47 /* FileTypeInfo.plist in Resources */, ABAD0F7715ACE7A00000EC47 /* AppIcon_ROMSave.icns in Resources */, ABAD0F7815ACE7A00000EC47 /* AppIcon_DeSmuME.icns in Resources */, ABAD0F7915ACE7A00000EC47 /* AppIcon_NintendoDS_ROM.icns in Resources */, ABAD0F7A15ACE7A00000EC47 /* AppIcon_SaveState.icns in Resources */, ABAD0F7B15ACE7A00000EC47 /* InfoPlist.strings in Resources */, ABAD0F7C15ACE7A00000EC47 /* MainMenu.xib in Resources */, ABAD0F7D15ACE7A00000EC47 /* Localizable.strings in Resources */, ABAD0F7E15ACE7A00000EC47 /* Icon_ActionReplay_32x32.png in Resources */, ABAD0F7F15ACE7A00000EC47 /* Icon_CodeBreaker_32x32.png in Resources */, ABAD0F8015ACE7A00000EC47 /* Icon_DeSmuME_32x32.png in Resources */, ABAD0F8115ACE7A00000EC47 /* HID_usage_strings.plist in Resources */, ABAD0F8215ACE7A00000EC47 /* AppIcon_ROMCheats.icns in Resources */, ABAD0F8315ACE7A00000EC47 /* Icon_VolumeFull_16x16.png in Resources */, ABAD0F8415ACE7A00000EC47 /* Icon_VolumeMute_16x16.png in Resources */, ABAD0F8515ACE7A00000EC47 /* Icon_VolumeOneThird_16x16.png in Resources */, ABAD0F8615ACE7A00000EC47 /* Icon_VolumeTwoThird_16x16.png in Resources */, ABAD0F8715ACE7A00000EC47 /* Icon_Execute_420x420.png in Resources */, ABAD0F8815ACE7A00000EC47 /* Icon_Pause_420x420.png in Resources */, ABAD0F8915ACE7A00000EC47 /* Icon_Speed1x_420x420.png in Resources */, ABAD0F8A15ACE7A00000EC47 /* Icon_Speed2x_420x420.png in Resources */, ABAD0F8B15ACE7A00000EC47 /* ColorSwatch_Blue_16x16.png in Resources */, ABAD0F8C15ACE7A00000EC47 /* ColorSwatch_Brown_16x16.png in Resources */, ABAD0F8D15ACE7A00000EC47 /* ColorSwatch_DarkBlue_16x16.png in Resources */, ABAD0F8E15ACE7A00000EC47 /* ColorSwatch_DarkGreen_16x16.png in Resources */, ABAD0F8F15ACE7A00000EC47 /* ColorSwatch_DarkPurple_16x16.png in Resources */, ABAD0F9015ACE7A00000EC47 /* ColorSwatch_Gray_16x16.png in Resources */, ABAD0F9115ACE7A00000EC47 /* ColorSwatch_Green_16x16.png in Resources */, ABAD0F9215ACE7A00000EC47 /* ColorSwatch_LimeGreen_16x16.png in Resources */, ABAD0F9315ACE7A00000EC47 /* ColorSwatch_Magenta_16x16.png in Resources */, ABAD0F9415ACE7A00000EC47 /* ColorSwatch_Orange_16x16.png in Resources */, ABAD0F9515ACE7A00000EC47 /* ColorSwatch_Pink_16x16.png in Resources */, ABAD0F9615ACE7A00000EC47 /* ColorSwatch_Red_16x16.png in Resources */, ABAD0F9715ACE7A00000EC47 /* ColorSwatch_SeaGreen_16x16.png in Resources */, ABAD0F9815ACE7A00000EC47 /* ColorSwatch_Turquoise_16x16.png in Resources */, ABAD0F9915ACE7A00000EC47 /* ColorSwatch_Violet_16x16.png in Resources */, ABAD0F9A15ACE7A00000EC47 /* ColorSwatch_Yellow_16x16.png in Resources */, ABAD0F9B15ACE7A00000EC47 /* Icon_ActionReplay_128x128.png in Resources */, ABAD0F9C15ACE7A00000EC47 /* Icon_CodeBreaker_128x128.png in Resources */, ABAD0F9D15ACE7A00000EC47 /* VideoFilterPreview_64x64.png in Resources */, ABAD0F9E15ACE7A00000EC47 /* Icon_ArrowDown_420x420.png in Resources */, ABAD0F9F15ACE7A00000EC47 /* Icon_ArrowLeft_420x420.png in Resources */, ABAD0FA015ACE7A00000EC47 /* Icon_ArrowRight_420x420.png in Resources */, ABAD0FA115ACE7A00000EC47 /* Icon_ArrowUp_420x420.png in Resources */, ABAD0FA215ACE7A00000EC47 /* Icon_DoubleSpeed_420x420.png in Resources */, ABAD0FA315ACE7A00000EC47 /* Icon_DSButtonA_420x420.png in Resources */, ABAD0FA415ACE7A00000EC47 /* Icon_DSButtonB_420x420.png in Resources */, ABAD0FA515ACE7A00000EC47 /* Icon_DSButtonL_420x420.png in Resources */, ABAD0FA615ACE7A00000EC47 /* Icon_DSButtonR_420x420.png in Resources */, ABAD0FA715ACE7A00000EC47 /* Icon_DSButtonSelect_420x420.png in Resources */, ABAD0FA815ACE7A00000EC47 /* Icon_DSButtonStart_420x420.png in Resources */, ABAD0FA915ACE7A00000EC47 /* Icon_DSButtonX_420x420.png in Resources */, ABAD0FAA15ACE7A00000EC47 /* Icon_DSButtonY_420x420.png in Resources */, ABAD0FAB15ACE7A00000EC47 /* Icon_Emulation_420x420.png in Resources */, ABAD0FAC15ACE7A00000EC47 /* Icon_Input_420x420.png in Resources */, ABAD0FAE15ACE7A00000EC47 /* Icon_OpenROM_420x420.png in Resources */, ABAD0FAF15ACE7A00000EC47 /* Icon_Reset_420x420.png in Resources */, ABAD0FB015ACE7A00000EC47 /* Icon_RotateCCW_420x420.png in Resources */, ABAD0FB115ACE7A00000EC47 /* Icon_RotateCW_420x420.png in Resources */, ABAD0FB215ACE7A00000EC47 /* Icon_ShowHUD_420x420.png in Resources */, ABAD0FB315ACE7A00000EC47 /* Icon_Speaker_420x420.png in Resources */, ABAD0FB415ACE7A00000EC47 /* AUTHORS in Resources */, ABAD0FB515ACE7A00000EC47 /* ChangeLog in Resources */, ABAD0FB615ACE7A00000EC47 /* COPYING in Resources */, ABAD0FB715ACE7A00000EC47 /* README in Resources */, ABAD0FB815ACE7A00000EC47 /* README.MAC in Resources */, ABAD0FB915ACE7A00000EC47 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBC16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ABAE30BD1869484F00C92F4F /* Image_Piano.png in Resources */, AB8C6CC1186A950C00E3EC64 /* Image_PassME.png in Resources */, AB142028186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, AB8FFE4C1872032B00C10085 /* Image_PaddleController.png in Resources */, ABD597BE187CD95A00069403 /* Image_GuitarGrip.png in Resources */, ABD5981F187D417900069403 /* Icon_GuitarGrip_Button_Blue_512x512.png in Resources */, ABD59820187D417900069403 /* Icon_GuitarGrip_Button_Green_512x512.png in Resources */, ABD59821187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABD59822187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, ABD59839187D466700069403 /* Icon_Piano_256x256.png in Resources */, ABD59849187D4A6C00069403 /* Icon_PaddleKnob_256x256.png in Resources */, ABBFDFA91898EE3200A3FFA5 /* Icon_DisplayToggle_420x420.png in Resources */, ABBFDFB21898EE4B00A3FFA5 /* Icon_FrameAdvance_420x420.png in Resources */, ABBFDFB31898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */, AB851D2E189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */, AB851D2F189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */, AB1CC8251AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */, AB1CC8261AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */, AB1CC8271AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */, AB1CC8281AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */, AB1CC8291AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */, ABACB73C1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ AB2A99A51725F00F0062C1A1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB2A99EF1725F00F0062C1A1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; AB2F3B7B15CF9C6000858373 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB73A9681507C9F500A310C8 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB75222C14C799C1009B97B3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; ABAD0F7115ACE7A00000EC47 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; ABE76A5215E08E1100F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; ABE76A7C15E0902700F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; ABE76A7E15E0903E00F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; ABE76A8015E0904E00F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\"\nsh \"svnrev.sh\""; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ AB2A99F01725F00F0062C1A1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2A99F11725F00F0062C1A1 /* ConvertUTF.c in Sources */, AB2A99F31725F00F0062C1A1 /* arm_instructions.cpp in Sources */, AB2A99F41725F00F0062C1A1 /* armcpu.cpp in Sources */, AB2A99F51725F00F0062C1A1 /* bios.cpp in Sources */, AB2A99F61725F00F0062C1A1 /* cache.cpp in Sources */, AB2A99F71725F00F0062C1A1 /* cheatSystem.cpp in Sources */, AB2A99F81725F00F0062C1A1 /* common.cpp in Sources */, AB2A99F91725F00F0062C1A1 /* cp15.cpp in Sources */, AB2A99FA1725F00F0062C1A1 /* crc.cpp in Sources */, AB2A99FB1725F00F0062C1A1 /* datetime.cpp in Sources */, AB2A99FC1725F00F0062C1A1 /* debug.cpp in Sources */, AB2A99FD1725F00F0062C1A1 /* decrypt.cpp in Sources */, AB2A99FE1725F00F0062C1A1 /* directory.cpp in Sources */, AB2A99FF1725F00F0062C1A1 /* Disassembler.cpp in Sources */, AB2A9A001725F00F0062C1A1 /* disc.cpp in Sources */, AB2A9A011725F00F0062C1A1 /* dlditool.cpp in Sources */, AB2A9A021725F00F0062C1A1 /* driver.cpp in Sources */, AB2A9A031725F00F0062C1A1 /* emufat.cpp in Sources */, AB2A9A041725F00F0062C1A1 /* emufile.cpp in Sources */, AB2A9A051725F00F0062C1A1 /* fatdir.cpp in Sources */, AB2A9A061725F00F0062C1A1 /* fatfile.cpp in Sources */, AB2A9A071725F00F0062C1A1 /* FIFO.cpp in Sources */, AB2A9A081725F00F0062C1A1 /* file_allocation_table.cpp in Sources */, AB2A9A091725F00F0062C1A1 /* filetime.cpp in Sources */, AB2A9A0A1725F00F0062C1A1 /* firmware.cpp in Sources */, AB2A9A0B1725F00F0062C1A1 /* fs-linux.cpp in Sources */, AB2A9A0C1725F00F0062C1A1 /* gfx3d.cpp in Sources */, AB2A9A0D1725F00F0062C1A1 /* GPU.cpp in Sources */, AB2A9A0E1725F00F0062C1A1 /* GPU_osd_stub.cpp in Sources */, AB2A9A0F1725F00F0062C1A1 /* guid.cpp in Sources */, AB2A9A101725F00F0062C1A1 /* header.cpp in Sources */, AB2A9A111725F00F0062C1A1 /* libfat.cpp in Sources */, AB2A9A121725F00F0062C1A1 /* libfat_public_api.cpp in Sources */, AB2A9A131725F00F0062C1A1 /* lock.cpp in Sources */, AB2A9A141725F00F0062C1A1 /* matrix.cpp in Sources */, AB2A9A151725F00F0062C1A1 /* mc.cpp in Sources */, AB2A9A161725F00F0062C1A1 /* md5.cpp in Sources */, AB2A9A171725F00F0062C1A1 /* metaspu.cpp in Sources */, AB2A9A181725F00F0062C1A1 /* MMU.cpp in Sources */, AB2A9A191725F00F0062C1A1 /* movie.cpp in Sources */, AB2A9A1A1725F00F0062C1A1 /* NDSSystem.cpp in Sources */, AB2A9A1B1725F00F0062C1A1 /* partition.cpp in Sources */, AB2A9A1C1725F00F0062C1A1 /* path.cpp in Sources */, AB2A9A1D1725F00F0062C1A1 /* rasterize.cpp in Sources */, AB2A9A1E1725F00F0062C1A1 /* readwrite.cpp in Sources */, AB2A9A1F1725F00F0062C1A1 /* render3D.cpp in Sources */, AB2A9A201725F00F0062C1A1 /* ROMReader.cpp in Sources */, AB2A9A211725F00F0062C1A1 /* rtc.cpp in Sources */, AB2A9A221725F00F0062C1A1 /* saves.cpp in Sources */, AB2A9A231725F00F0062C1A1 /* slot1.cpp in Sources */, AB2A9A241725F00F0062C1A1 /* slot1_none.cpp in Sources */, AB2A9A251725F00F0062C1A1 /* slot1_r4.cpp in Sources */, AB2A9A271725F00F0062C1A1 /* slot1_retail_nand.cpp in Sources */, AB2A9A281725F00F0062C1A1 /* slot2_expMemory.cpp in Sources */, AB2A9A291725F00F0062C1A1 /* slot2_gbagame.cpp in Sources */, AB2A9A2A1725F00F0062C1A1 /* slot2_guitarGrip.cpp in Sources */, AB2A9A2B1725F00F0062C1A1 /* slot2_mpcf.cpp in Sources */, AB2A9A2C1725F00F0062C1A1 /* slot2_none.cpp in Sources */, AB2A9A2D1725F00F0062C1A1 /* slot2_paddle.cpp in Sources */, AB2A9A2E1725F00F0062C1A1 /* slot2_piano.cpp in Sources */, AB2A9A2F1725F00F0062C1A1 /* slot2_rumblepak.cpp in Sources */, AB2A9A301725F00F0062C1A1 /* sndOSX.cpp in Sources */, AB2A9A311725F00F0062C1A1 /* SndOut.cpp in Sources */, AB2A9A321725F00F0062C1A1 /* SPU.cpp in Sources */, AB2A9A331725F00F0062C1A1 /* task.cpp in Sources */, AB2A9A341725F00F0062C1A1 /* texcache.cpp in Sources */, AB2A9A351725F00F0062C1A1 /* thumb_instructions.cpp in Sources */, AB2A9A361725F00F0062C1A1 /* Timestretcher.cpp in Sources */, AB2A9A371725F00F0062C1A1 /* tinystr.cpp in Sources */, AB2A9A381725F00F0062C1A1 /* tinyxml.cpp in Sources */, AB2A9A391725F00F0062C1A1 /* tinyxmlerror.cpp in Sources */, AB2A9A3A1725F00F0062C1A1 /* tinyxmlparser.cpp in Sources */, AB2A9A3B1725F00F0062C1A1 /* version.cpp in Sources */, AB2A9A3C1725F00F0062C1A1 /* vfat.cpp in Sources */, AB2A9A3D1725F00F0062C1A1 /* videofilter.cpp in Sources */, AB2A9A3E1725F00F0062C1A1 /* wifi.cpp in Sources */, AB2A9A3F1725F00F0062C1A1 /* xstring.cpp in Sources */, AB2A9A401725F00F0062C1A1 /* main.m in Sources */, AB2A9A411725F00F0062C1A1 /* cocoa_cheat.mm in Sources */, AB2A9A421725F00F0062C1A1 /* cocoa_core.mm in Sources */, AB2A9A431725F00F0062C1A1 /* cocoa_file.mm in Sources */, AB2A9A441725F00F0062C1A1 /* cocoa_firmware.mm in Sources */, AB2A9A451725F00F0062C1A1 /* cocoa_input.mm in Sources */, AB2A9A461725F00F0062C1A1 /* mic_ext.cpp in Sources */, AB2A9A471725F00F0062C1A1 /* cocoa_output.mm in Sources */, AB2A9A481725F00F0062C1A1 /* cocoa_rom.mm in Sources */, AB2A9A491725F00F0062C1A1 /* cocoa_util.mm in Sources */, AB2A9A4A1725F00F0062C1A1 /* cocoa_videofilter.mm in Sources */, AB2A9A4B1725F00F0062C1A1 /* OGLRender.cpp in Sources */, AB2A9A4C1725F00F0062C1A1 /* appDelegate.mm in Sources */, AB2A9A4D1725F00F0062C1A1 /* cheatWindowDelegate.mm in Sources */, AB2A9A4E1725F00F0062C1A1 /* inputPrefsView.mm in Sources */, AB2A9A4F1725F00F0062C1A1 /* preferencesWindowDelegate.mm in Sources */, AB2A9A501725F00F0062C1A1 /* 2xsai.cpp in Sources */, AB2A9A511725F00F0062C1A1 /* bilinear.cpp in Sources */, AB2A9A521725F00F0062C1A1 /* epx.cpp in Sources */, AB2A9A531725F00F0062C1A1 /* hq2x.cpp in Sources */, AB2A9A541725F00F0062C1A1 /* hq4x.cpp in Sources */, AB2A9A551725F00F0062C1A1 /* lq2x.cpp in Sources */, AB2A9A561725F00F0062C1A1 /* scanline.cpp in Sources */, AB2A9A571725F00F0062C1A1 /* coreaudiosound.cpp in Sources */, AB2A9A581725F00F0062C1A1 /* ringbuffer.cpp in Sources */, AB2A9A591725F00F0062C1A1 /* troubleshootingWindowDelegate.mm in Sources */, AB2A9A5A1725F00F0062C1A1 /* EmuControllerDelegate.mm in Sources */, AB2A9A5B1725F00F0062C1A1 /* cocoa_GPU.mm in Sources */, AB2A9A5C1725F00F0062C1A1 /* DisplayWindowController.mm in Sources */, AB2A9A5D1725F00F0062C1A1 /* InputManager.mm in Sources */, AB2A9A5E1725F00F0062C1A1 /* AAFilter.cpp in Sources */, AB2A9A5F1725F00F0062C1A1 /* cpu_detect_x86_gcc.cpp in Sources */, AB2A9A601725F00F0062C1A1 /* FIFOSampleBuffer.cpp in Sources */, AB2A9A611725F00F0062C1A1 /* FIRFilter.cpp in Sources */, AB2A9A621725F00F0062C1A1 /* mmx_optimized.cpp in Sources */, AB2A9A631725F00F0062C1A1 /* RateTransposer.cpp in Sources */, AB2A9A641725F00F0062C1A1 /* SoundTouch.cpp in Sources */, AB2A9A651725F00F0062C1A1 /* sse_optimized.cpp in Sources */, AB2A9A661725F00F0062C1A1 /* TDStretch.cpp in Sources */, AB2A9A671725F00F0062C1A1 /* WavFile.cpp in Sources */, AB2A9A681725F00F0062C1A1 /* utilities.c in Sources */, AB2A9A691725F00F0062C1A1 /* InputProfileController.mm in Sources */, AB2A9A6A1725F00F0062C1A1 /* audiosamplegenerator.cpp in Sources */, AB2A9A6B1725F00F0062C1A1 /* FileMigrationDelegate.mm in Sources */, ABA93EB4178C7D4200CBF50B /* encrypt.cpp in Sources */, AB4C809D17C5D7780024D479 /* slot1_retail_auto.cpp in Sources */, AB4C809E17C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */, AB4C809F17C5D7780024D479 /* slot1comp_mc.cpp in Sources */, AB4C80A017C5D7780024D479 /* slot1comp_rom.cpp in Sources */, AB4C80AE17C5D7A00024D479 /* advanscene.cpp in Sources */, ABB9212517CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */, AB43527617D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */, AB43528B17D5BA95007417C8 /* fsnitro.cpp in Sources */, AB126D0B182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518318313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518A18313E4E00CCD532 /* slot2.cpp in Sources */, ABAE2F7F18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, ABAE2F8818682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ABECB50D18A460710052D52A /* xbrz.cpp in Sources */, ABECB51818A460910052D52A /* OGLDisplayOutput.cpp in Sources */, ABC3DEC11A96EA96009EC345 /* RomInfoPanel.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB2F3BC415CF9C6000858373 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2F3BC515CF9C6000858373 /* ConvertUTF.c in Sources */, AB2F3BC815CF9C6000858373 /* arm_instructions.cpp in Sources */, AB2F3BC915CF9C6000858373 /* armcpu.cpp in Sources */, AB2F3BCA15CF9C6000858373 /* bios.cpp in Sources */, AB2F3BCB15CF9C6000858373 /* cache.cpp in Sources */, AB2F3BCC15CF9C6000858373 /* cheatSystem.cpp in Sources */, AB2F3BCD15CF9C6000858373 /* common.cpp in Sources */, AB2F3BCE15CF9C6000858373 /* cp15.cpp in Sources */, AB2F3BD015CF9C6000858373 /* crc.cpp in Sources */, AB2F3BD115CF9C6000858373 /* datetime.cpp in Sources */, AB2F3BD215CF9C6000858373 /* debug.cpp in Sources */, AB2F3BD315CF9C6000858373 /* decrypt.cpp in Sources */, AB2F3BD415CF9C6000858373 /* directory.cpp in Sources */, AB2F3BD515CF9C6000858373 /* Disassembler.cpp in Sources */, AB2F3BD615CF9C6000858373 /* disc.cpp in Sources */, AB2F3BD715CF9C6000858373 /* dlditool.cpp in Sources */, AB2F3BD815CF9C6000858373 /* driver.cpp in Sources */, AB2F3BD915CF9C6000858373 /* emufat.cpp in Sources */, AB2F3BDA15CF9C6000858373 /* emufile.cpp in Sources */, AB2F3BDB15CF9C6000858373 /* fatdir.cpp in Sources */, AB2F3BDC15CF9C6000858373 /* fatfile.cpp in Sources */, AB2F3BDD15CF9C6000858373 /* FIFO.cpp in Sources */, AB2F3BDF15CF9C6000858373 /* file_allocation_table.cpp in Sources */, AB2F3BE015CF9C6000858373 /* filetime.cpp in Sources */, AB2F3BE215CF9C6000858373 /* firmware.cpp in Sources */, AB2F3BE315CF9C6000858373 /* fs-linux.cpp in Sources */, AB2F3BE415CF9C6000858373 /* gfx3d.cpp in Sources */, AB2F3BE515CF9C6000858373 /* GPU.cpp in Sources */, AB2F3BE615CF9C6000858373 /* GPU_osd_stub.cpp in Sources */, AB2F3BE715CF9C6000858373 /* guid.cpp in Sources */, AB2F3BE815CF9C6000858373 /* header.cpp in Sources */, AB2F3BE915CF9C6000858373 /* libfat.cpp in Sources */, AB2F3BEA15CF9C6000858373 /* libfat_public_api.cpp in Sources */, AB2F3BEB15CF9C6000858373 /* lock.cpp in Sources */, AB2F3BEC15CF9C6000858373 /* matrix.cpp in Sources */, AB2F3BED15CF9C6000858373 /* mc.cpp in Sources */, AB2F3BEE15CF9C6000858373 /* md5.cpp in Sources */, AB2F3BEF15CF9C6000858373 /* metaspu.cpp in Sources */, AB2F3BF015CF9C6000858373 /* MMU.cpp in Sources */, AB2F3BF215CF9C6000858373 /* movie.cpp in Sources */, AB2F3BF315CF9C6000858373 /* NDSSystem.cpp in Sources */, AB2F3BF415CF9C6000858373 /* partition.cpp in Sources */, AB2F3BF515CF9C6000858373 /* path.cpp in Sources */, AB2F3BF615CF9C6000858373 /* rasterize.cpp in Sources */, AB2F3BF815CF9C6000858373 /* readwrite.cpp in Sources */, AB2F3BF915CF9C6000858373 /* render3D.cpp in Sources */, AB2F3BFA15CF9C6000858373 /* ROMReader.cpp in Sources */, AB2F3BFB15CF9C6000858373 /* rtc.cpp in Sources */, AB2F3BFC15CF9C6000858373 /* saves.cpp in Sources */, AB2F3BFD15CF9C6000858373 /* slot1.cpp in Sources */, AB2F3BFE15CF9C6000858373 /* slot1_none.cpp in Sources */, AB2F3BFF15CF9C6000858373 /* slot1_r4.cpp in Sources */, AB2F3C0115CF9C6000858373 /* slot1_retail_nand.cpp in Sources */, AB2F3C0215CF9C6000858373 /* slot2_expMemory.cpp in Sources */, AB2F3C0315CF9C6000858373 /* slot2_gbagame.cpp in Sources */, AB2F3C0415CF9C6000858373 /* slot2_guitarGrip.cpp in Sources */, AB2F3C0515CF9C6000858373 /* slot2_mpcf.cpp in Sources */, AB2F3C0615CF9C6000858373 /* slot2_none.cpp in Sources */, AB2F3C0715CF9C6000858373 /* slot2_paddle.cpp in Sources */, AB2F3C0815CF9C6000858373 /* slot2_piano.cpp in Sources */, AB2F3C0915CF9C6000858373 /* slot2_rumblepak.cpp in Sources */, AB2F3C0A15CF9C6000858373 /* sndOSX.cpp in Sources */, AB2F3C0B15CF9C6000858373 /* SndOut.cpp in Sources */, AB2F3C0D15CF9C6000858373 /* SPU.cpp in Sources */, AB2F3C0F15CF9C6000858373 /* task.cpp in Sources */, AB2F3C1115CF9C6000858373 /* texcache.cpp in Sources */, AB2F3C1215CF9C6000858373 /* thumb_instructions.cpp in Sources */, AB2F3C1315CF9C6000858373 /* Timestretcher.cpp in Sources */, AB2F3C1415CF9C6000858373 /* tinystr.cpp in Sources */, AB2F3C1515CF9C6000858373 /* tinyxml.cpp in Sources */, AB2F3C1615CF9C6000858373 /* tinyxmlerror.cpp in Sources */, AB2F3C1715CF9C6000858373 /* tinyxmlparser.cpp in Sources */, AB2F3C1815CF9C6000858373 /* version.cpp in Sources */, AB2F3C1915CF9C6000858373 /* vfat.cpp in Sources */, AB2F3C1A15CF9C6000858373 /* videofilter.cpp in Sources */, AB2F3C1C15CF9C6000858373 /* wifi.cpp in Sources */, AB2F3C1D15CF9C6000858373 /* xstring.cpp in Sources */, AB2F3C1E15CF9C6000858373 /* main.m in Sources */, AB2F3C1F15CF9C6000858373 /* cocoa_cheat.mm in Sources */, AB2F3C2015CF9C6000858373 /* cocoa_core.mm in Sources */, AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */, AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */, AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */, AB2F3C2515CF9C6000858373 /* mic_ext.cpp in Sources */, AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */, AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */, AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */, AB2F3C2915CF9C6000858373 /* cocoa_videofilter.mm in Sources */, AB2F3C2A15CF9C6000858373 /* OGLRender.cpp in Sources */, AB2F3C2B15CF9C6000858373 /* appDelegate.mm in Sources */, AB2F3C2C15CF9C6000858373 /* cheatWindowDelegate.mm in Sources */, AB2F3C2F15CF9C6000858373 /* inputPrefsView.mm in Sources */, AB2F3C3015CF9C6000858373 /* preferencesWindowDelegate.mm in Sources */, AB2F3C3115CF9C6000858373 /* 2xsai.cpp in Sources */, AB2F3C3215CF9C6000858373 /* bilinear.cpp in Sources */, AB2F3C3315CF9C6000858373 /* epx.cpp in Sources */, AB2F3C3415CF9C6000858373 /* hq2x.cpp in Sources */, AB2F3C3515CF9C6000858373 /* hq4x.cpp in Sources */, AB2F3C3615CF9C6000858373 /* lq2x.cpp in Sources */, AB2F3C3715CF9C6000858373 /* scanline.cpp in Sources */, AB2F3C3815CF9C6000858373 /* coreaudiosound.cpp in Sources */, AB2F3C3915CF9C6000858373 /* ringbuffer.cpp in Sources */, ABA03571169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, AB6A187C16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198316CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DDF16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795B16D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C4916F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C4A16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C4B16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C4C16F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C4D16F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C4E16F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C4F16F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C5016F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C5116F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C5216F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F11704C86900E28885 /* utilities.c in Sources */, AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145241714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBEB172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ABA93EB1178C7D4200CBF50B /* encrypt.cpp in Sources */, AB4C809117C5D7780024D479 /* slot1_retail_auto.cpp in Sources */, AB4C809217C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */, AB4C809317C5D7780024D479 /* slot1comp_mc.cpp in Sources */, AB4C809417C5D7780024D479 /* slot1comp_rom.cpp in Sources */, AB4C80AB17C5D7A00024D479 /* advanscene.cpp in Sources */, ABB9212217CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */, AB43527317D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */, AB43528817D5BA95007417C8 /* fsnitro.cpp in Sources */, AB126D08182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518018313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518718313E4E00CCD532 /* slot2.cpp in Sources */, ABAE2F7B18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, ABAE2F8418682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ABECB50A18A460710052D52A /* xbrz.cpp in Sources */, ABECB51518A460910052D52A /* OGLDisplayOutput.cpp in Sources */, ABC3DEBD1A96EA96009EC345 /* RomInfoPanel.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB711EFF1481C35F009011C8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB711F2D1481C35F009011C8 /* ConvertUTF.c in Sources */, AB711F011481C35F009011C8 /* arm_instructions.cpp in Sources */, AB711F021481C35F009011C8 /* armcpu.cpp in Sources */, AB711F031481C35F009011C8 /* bios.cpp in Sources */, AB711F341481C35F009011C8 /* cache.cpp in Sources */, AB711F041481C35F009011C8 /* cheatSystem.cpp in Sources */, AB711F051481C35F009011C8 /* common.cpp in Sources */, AB711F061481C35F009011C8 /* cp15.cpp in Sources */, AB711F2E1481C35F009011C8 /* crc.cpp in Sources */, AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */, AB711F071481C35F009011C8 /* debug.cpp in Sources */, AB711F2F1481C35F009011C8 /* decrypt.cpp in Sources */, AB711F351481C35F009011C8 /* directory.cpp in Sources */, AB711F081481C35F009011C8 /* Disassembler.cpp in Sources */, AB711F361481C35F009011C8 /* disc.cpp in Sources */, AB711F311481C35F009011C8 /* dlditool.cpp in Sources */, AB711F091481C35F009011C8 /* driver.cpp in Sources */, AB711F321481C35F009011C8 /* emufat.cpp in Sources */, AB711F0A1481C35F009011C8 /* emufile.cpp in Sources */, AB711F371481C35F009011C8 /* fatdir.cpp in Sources */, AB711F381481C35F009011C8 /* fatfile.cpp in Sources */, AB711F0B1481C35F009011C8 /* FIFO.cpp in Sources */, AB711F391481C35F009011C8 /* file_allocation_table.cpp in Sources */, AB711F3A1481C35F009011C8 /* filetime.cpp in Sources */, AB711F0C1481C35F009011C8 /* firmware.cpp in Sources */, AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */, AB711F0D1481C35F009011C8 /* gfx3d.cpp in Sources */, AB711F0F1481C35F009011C8 /* GPU.cpp in Sources */, AB711F0E1481C35F009011C8 /* GPU_osd_stub.cpp in Sources */, AB711F331481C35F009011C8 /* guid.cpp in Sources */, AB711F301481C35F009011C8 /* header.cpp in Sources */, AB711F3B1481C35F009011C8 /* libfat.cpp in Sources */, AB711F3C1481C35F009011C8 /* libfat_public_api.cpp in Sources */, AB711F3D1481C35F009011C8 /* lock.cpp in Sources */, AB711F101481C35F009011C8 /* matrix.cpp in Sources */, AB711F111481C35F009011C8 /* mc.cpp in Sources */, AB711F3F1481C35F009011C8 /* md5.cpp in Sources */, AB711F431481C35F009011C8 /* metaspu.cpp in Sources */, AB711F121481C35F009011C8 /* MMU.cpp in Sources */, AB711F131481C35F009011C8 /* movie.cpp in Sources */, AB711F141481C35F009011C8 /* NDSSystem.cpp in Sources */, AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */, AB711F3E1481C35F009011C8 /* partition.cpp in Sources */, AB711F151481C35F009011C8 /* path.cpp in Sources */, AB711F161481C35F009011C8 /* rasterize.cpp in Sources */, AB711F171481C35F009011C8 /* readwrite.cpp in Sources */, AB711F181481C35F009011C8 /* render3D.cpp in Sources */, AB711F191481C35F009011C8 /* ROMReader.cpp in Sources */, AB711F1A1481C35F009011C8 /* rtc.cpp in Sources */, AB711F1B1481C35F009011C8 /* saves.cpp in Sources */, AB711F1C1481C35F009011C8 /* slot1.cpp in Sources */, AB711F221481C35F009011C8 /* slot1_none.cpp in Sources */, AB711F231481C35F009011C8 /* slot1_r4.cpp in Sources */, AB711F501481C35F009011C8 /* slot1_retail_nand.cpp in Sources */, AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */, AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */, AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */, AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */, AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */, AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */, AB711F2C1481C35F009011C8 /* slot2_rumblepak.cpp in Sources */, AB711F491481C35F009011C8 /* sndOSX.cpp in Sources */, AB711F511481C35F009011C8 /* SndOut.cpp in Sources */, AB711F1D1481C35F009011C8 /* SPU.cpp in Sources */, AB711F401481C35F009011C8 /* task.cpp in Sources */, AB711F1E1481C35F009011C8 /* texcache.cpp in Sources */, AB711F1F1481C35F009011C8 /* thumb_instructions.cpp in Sources */, AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */, AB711F611481C35F009011C8 /* tinystr.cpp in Sources */, AB711F621481C35F009011C8 /* tinyxml.cpp in Sources */, AB711F631481C35F009011C8 /* tinyxmlerror.cpp in Sources */, AB711F641481C35F009011C8 /* tinyxmlparser.cpp in Sources */, AB711F201481C35F009011C8 /* version.cpp in Sources */, AB711F411481C35F009011C8 /* vfat.cpp in Sources */, AB711F6D1481C35F009011C8 /* videofilter.cpp in Sources */, AB711F211481C35F009011C8 /* wifi.cpp in Sources */, AB711F421481C35F009011C8 /* xstring.cpp in Sources */, AB711F4A1481C35F009011C8 /* main.m in Sources */, AB711F701481C35F009011C8 /* cocoa_cheat.mm in Sources */, AB711F471481C35F009011C8 /* cocoa_core.mm in Sources */, AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */, AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */, AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */, AB711F5E1481C35F009011C8 /* mic_ext.cpp in Sources */, AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */, AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */, AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */, AB711F6E1481C35F009011C8 /* cocoa_videofilter.mm in Sources */, AB3ACB7814C2361100D7D192 /* appDelegate.mm in Sources */, AB3ACB7914C2361100D7D192 /* cheatWindowDelegate.mm in Sources */, AB3ACB7C14C2361100D7D192 /* inputPrefsView.mm in Sources */, AB3ACB7D14C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */, ABFE150F14C92FF5005D6699 /* 2xsai.cpp in Sources */, ABFE151014C92FF5005D6699 /* bilinear.cpp in Sources */, ABFE151114C92FF5005D6699 /* epx.cpp in Sources */, ABFE151214C92FF5005D6699 /* hq2x.cpp in Sources */, ABFE151314C92FF5005D6699 /* hq4x.cpp in Sources */, ABFE151514C92FF5005D6699 /* lq2x.cpp in Sources */, ABFE151614C92FF5005D6699 /* scanline.cpp in Sources */, ABD0A53A1501AA5A0074A094 /* coreaudiosound.cpp in Sources */, ABD0A53B1501AA5A0074A094 /* ringbuffer.cpp in Sources */, ABBCE29815ACB1FF00A2C965 /* arm_jit.cpp in Sources */, ABA03572169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, ABF50ABA169F5FDA0018C08D /* assembler.cpp in Sources */, ABF50ABB169F5FDA0018C08D /* assert.cpp in Sources */, ABF50ABC169F5FDA0018C08D /* buffer.cpp in Sources */, ABF50ABD169F5FDA0018C08D /* compiler.cpp in Sources */, ABF50ABE169F5FDA0018C08D /* compilercontext.cpp in Sources */, ABF50ABF169F5FDA0018C08D /* compilerfunc.cpp in Sources */, ABF50AC0169F5FDA0018C08D /* compileritem.cpp in Sources */, ABF50AC1169F5FDA0018C08D /* context.cpp in Sources */, ABF50AC2169F5FDA0018C08D /* cpuinfo.cpp in Sources */, ABF50AC3169F5FDA0018C08D /* defs.cpp in Sources */, ABF50AC4169F5FDA0018C08D /* func.cpp in Sources */, ABF50AC5169F5FDA0018C08D /* logger.cpp in Sources */, ABF50AC6169F5FDA0018C08D /* memorymanager.cpp in Sources */, ABF50AC7169F5FDA0018C08D /* memorymarker.cpp in Sources */, ABF50AC8169F5FDA0018C08D /* operand.cpp in Sources */, ABF50AC9169F5FDA0018C08D /* stringbuilder.cpp in Sources */, ABF50ACA169F5FDA0018C08D /* stringutil.cpp in Sources */, ABF50ACB169F5FDA0018C08D /* virtualmemory.cpp in Sources */, ABF50ACC169F5FDA0018C08D /* zonememory.cpp in Sources */, ABF50ACD169F5FDA0018C08D /* x86assembler.cpp in Sources */, ABF50ACE169F5FDA0018C08D /* x86compiler.cpp in Sources */, ABF50ACF169F5FDA0018C08D /* x86compilercontext.cpp in Sources */, ABF50AD0169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */, ABF50AD1169F5FDA0018C08D /* x86compileritem.cpp in Sources */, ABF50AD2169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */, ABF50AD3169F5FDA0018C08D /* x86defs.cpp in Sources */, ABF50AD4169F5FDA0018C08D /* x86func.cpp in Sources */, ABF50AD5169F5FDA0018C08D /* x86operand.cpp in Sources */, ABF50AD6169F5FDA0018C08D /* x86util.cpp in Sources */, AB6A187E16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198516CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DE116CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795916D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C3F16F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C4016F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C4116F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C4216F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C4316F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C4416F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C4516F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C4616F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C4716F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C4816F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F01704C86900E28885 /* utilities.c in Sources */, AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145261714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBEA172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ABA93EB0178C7D4200CBF50B /* encrypt.cpp in Sources */, AB4C808D17C5D7780024D479 /* slot1_retail_auto.cpp in Sources */, AB4C808E17C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */, AB4C808F17C5D7780024D479 /* slot1comp_mc.cpp in Sources */, AB4C809017C5D7780024D479 /* slot1comp_rom.cpp in Sources */, AB4C80AA17C5D7A00024D479 /* advanscene.cpp in Sources */, ABB9212117CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */, AB43527217D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */, AB43528717D5BA95007417C8 /* fsnitro.cpp in Sources */, AB126D07182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53517F18313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518618313E4E00CCD532 /* slot2.cpp in Sources */, ABAE2F7C18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, ABAE2F8518682B8F00C92F4F /* cocoa_slot2.mm in Sources */, AB8FFCB4186F8E5400C10085 /* slot2_mpcf.cpp in Sources */, ABECB50918A460710052D52A /* xbrz.cpp in Sources */, ABECB51418A460910052D52A /* OGLDisplayOutput.cpp in Sources */, ABC3DEBE1A96EA96009EC345 /* RomInfoPanel.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB73A9B21507C9F500A310C8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB73A9B31507C9F500A310C8 /* ConvertUTF.c in Sources */, AB73A9B61507C9F500A310C8 /* arm_instructions.cpp in Sources */, AB73A9B71507C9F500A310C8 /* armcpu.cpp in Sources */, AB73A9B81507C9F500A310C8 /* bios.cpp in Sources */, AB73A9B91507C9F500A310C8 /* cache.cpp in Sources */, AB73A9BA1507C9F500A310C8 /* cheatSystem.cpp in Sources */, AB73A9BB1507C9F500A310C8 /* common.cpp in Sources */, AB73A9BC1507C9F500A310C8 /* cp15.cpp in Sources */, AB73A9BE1507C9F500A310C8 /* crc.cpp in Sources */, AB73A9BF1507C9F500A310C8 /* datetime.cpp in Sources */, AB73A9C01507C9F500A310C8 /* debug.cpp in Sources */, AB73A9C11507C9F500A310C8 /* decrypt.cpp in Sources */, AB73A9C21507C9F500A310C8 /* directory.cpp in Sources */, AB73A9C31507C9F500A310C8 /* Disassembler.cpp in Sources */, AB73A9C41507C9F500A310C8 /* disc.cpp in Sources */, AB73A9C51507C9F500A310C8 /* dlditool.cpp in Sources */, AB73A9C61507C9F500A310C8 /* driver.cpp in Sources */, AB73A9C71507C9F500A310C8 /* emufat.cpp in Sources */, AB73A9C81507C9F500A310C8 /* emufile.cpp in Sources */, AB73A9C91507C9F500A310C8 /* fatdir.cpp in Sources */, AB73A9CA1507C9F500A310C8 /* fatfile.cpp in Sources */, AB73A9CB1507C9F500A310C8 /* FIFO.cpp in Sources */, AB73A9CD1507C9F500A310C8 /* file_allocation_table.cpp in Sources */, AB73A9CE1507C9F500A310C8 /* filetime.cpp in Sources */, AB73A9D01507C9F500A310C8 /* firmware.cpp in Sources */, AB73A9D11507C9F500A310C8 /* fs-linux.cpp in Sources */, AB73A9D21507C9F500A310C8 /* gfx3d.cpp in Sources */, AB73A9D31507C9F500A310C8 /* GPU.cpp in Sources */, AB73A9D41507C9F500A310C8 /* GPU_osd_stub.cpp in Sources */, AB73A9D51507C9F500A310C8 /* guid.cpp in Sources */, AB73A9D61507C9F500A310C8 /* header.cpp in Sources */, AB73A9D71507C9F500A310C8 /* libfat.cpp in Sources */, AB73A9D81507C9F500A310C8 /* libfat_public_api.cpp in Sources */, AB73A9D91507C9F500A310C8 /* lock.cpp in Sources */, AB73A9DA1507C9F500A310C8 /* matrix.cpp in Sources */, AB73A9DB1507C9F500A310C8 /* mc.cpp in Sources */, AB73A9DC1507C9F500A310C8 /* md5.cpp in Sources */, AB73A9DD1507C9F500A310C8 /* metaspu.cpp in Sources */, AB73A9DE1507C9F500A310C8 /* MMU.cpp in Sources */, AB73A9E01507C9F500A310C8 /* movie.cpp in Sources */, AB73A9E11507C9F500A310C8 /* NDSSystem.cpp in Sources */, AB73A9E21507C9F500A310C8 /* partition.cpp in Sources */, AB73A9E31507C9F500A310C8 /* path.cpp in Sources */, AB73A9E41507C9F500A310C8 /* rasterize.cpp in Sources */, AB73A9E61507C9F500A310C8 /* readwrite.cpp in Sources */, AB73A9E71507C9F500A310C8 /* render3D.cpp in Sources */, AB73A9E81507C9F500A310C8 /* ROMReader.cpp in Sources */, AB73A9E91507C9F500A310C8 /* rtc.cpp in Sources */, AB73A9EA1507C9F500A310C8 /* saves.cpp in Sources */, AB73A9EB1507C9F500A310C8 /* slot1.cpp in Sources */, AB73A9EC1507C9F500A310C8 /* slot1_none.cpp in Sources */, AB73A9ED1507C9F500A310C8 /* slot1_r4.cpp in Sources */, AB73A9EF1507C9F500A310C8 /* slot1_retail_nand.cpp in Sources */, AB73A9F01507C9F500A310C8 /* slot2_expMemory.cpp in Sources */, AB73A9F11507C9F500A310C8 /* slot2_gbagame.cpp in Sources */, AB73A9F21507C9F500A310C8 /* slot2_guitarGrip.cpp in Sources */, AB73A9F31507C9F500A310C8 /* slot2_mpcf.cpp in Sources */, AB73A9F41507C9F500A310C8 /* slot2_none.cpp in Sources */, AB73A9F51507C9F500A310C8 /* slot2_paddle.cpp in Sources */, AB73A9F61507C9F500A310C8 /* slot2_piano.cpp in Sources */, AB73A9F71507C9F500A310C8 /* slot2_rumblepak.cpp in Sources */, AB73A9F81507C9F500A310C8 /* sndOSX.cpp in Sources */, AB73A9F91507C9F500A310C8 /* SndOut.cpp in Sources */, AB73A9FB1507C9F500A310C8 /* SPU.cpp in Sources */, AB73A9FD1507C9F500A310C8 /* task.cpp in Sources */, AB73A9FF1507C9F500A310C8 /* texcache.cpp in Sources */, AB73AA001507C9F500A310C8 /* thumb_instructions.cpp in Sources */, AB73AA011507C9F500A310C8 /* Timestretcher.cpp in Sources */, AB73AA021507C9F500A310C8 /* tinystr.cpp in Sources */, AB73AA031507C9F500A310C8 /* tinyxml.cpp in Sources */, AB73AA041507C9F500A310C8 /* tinyxmlerror.cpp in Sources */, AB73AA051507C9F500A310C8 /* tinyxmlparser.cpp in Sources */, AB73AA061507C9F500A310C8 /* version.cpp in Sources */, AB73AA071507C9F500A310C8 /* vfat.cpp in Sources */, AB73AA081507C9F500A310C8 /* videofilter.cpp in Sources */, AB73AA0A1507C9F500A310C8 /* wifi.cpp in Sources */, AB73AA0B1507C9F500A310C8 /* xstring.cpp in Sources */, AB73AA0C1507C9F500A310C8 /* main.m in Sources */, AB73AA0D1507C9F500A310C8 /* cocoa_cheat.mm in Sources */, AB73AA0E1507C9F500A310C8 /* cocoa_core.mm in Sources */, AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */, AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */, AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */, AB73AA131507C9F500A310C8 /* mic_ext.cpp in Sources */, AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */, AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */, AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */, AB73AA171507C9F500A310C8 /* cocoa_videofilter.mm in Sources */, AB73AA181507C9F500A310C8 /* OGLRender.cpp in Sources */, AB73AA191507C9F500A310C8 /* appDelegate.mm in Sources */, AB73AA1A1507C9F500A310C8 /* cheatWindowDelegate.mm in Sources */, AB73AA1D1507C9F500A310C8 /* inputPrefsView.mm in Sources */, AB73AA1E1507C9F500A310C8 /* preferencesWindowDelegate.mm in Sources */, AB73AA1F1507C9F500A310C8 /* 2xsai.cpp in Sources */, AB73AA201507C9F500A310C8 /* bilinear.cpp in Sources */, AB73AA211507C9F500A310C8 /* epx.cpp in Sources */, AB73AA221507C9F500A310C8 /* hq2x.cpp in Sources */, AB73AA231507C9F500A310C8 /* hq4x.cpp in Sources */, AB73AA241507C9F500A310C8 /* lq2x.cpp in Sources */, AB73AA251507C9F500A310C8 /* scanline.cpp in Sources */, AB73AA261507C9F500A310C8 /* coreaudiosound.cpp in Sources */, AB73AA271507C9F500A310C8 /* ringbuffer.cpp in Sources */, ABBCE29715ACB1FF00A2C965 /* arm_jit.cpp in Sources */, ABA03570169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, ABF50B11169F5FDA0018C08D /* assembler.cpp in Sources */, ABF50B12169F5FDA0018C08D /* assert.cpp in Sources */, ABF50B13169F5FDA0018C08D /* buffer.cpp in Sources */, ABF50B14169F5FDA0018C08D /* compiler.cpp in Sources */, ABF50B15169F5FDA0018C08D /* compilercontext.cpp in Sources */, ABF50B16169F5FDA0018C08D /* compilerfunc.cpp in Sources */, ABF50B17169F5FDA0018C08D /* compileritem.cpp in Sources */, ABF50B18169F5FDA0018C08D /* context.cpp in Sources */, ABF50B19169F5FDA0018C08D /* cpuinfo.cpp in Sources */, ABF50B1A169F5FDA0018C08D /* defs.cpp in Sources */, ABF50B1B169F5FDA0018C08D /* func.cpp in Sources */, ABF50B1C169F5FDA0018C08D /* logger.cpp in Sources */, ABF50B1D169F5FDA0018C08D /* memorymanager.cpp in Sources */, ABF50B1E169F5FDA0018C08D /* memorymarker.cpp in Sources */, ABF50B1F169F5FDA0018C08D /* operand.cpp in Sources */, ABF50B20169F5FDA0018C08D /* stringbuilder.cpp in Sources */, ABF50B21169F5FDA0018C08D /* stringutil.cpp in Sources */, ABF50B22169F5FDA0018C08D /* virtualmemory.cpp in Sources */, ABF50B23169F5FDA0018C08D /* zonememory.cpp in Sources */, ABF50B24169F5FDA0018C08D /* x86assembler.cpp in Sources */, ABF50B25169F5FDA0018C08D /* x86compiler.cpp in Sources */, ABF50B26169F5FDA0018C08D /* x86compilercontext.cpp in Sources */, ABF50B27169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */, ABF50B28169F5FDA0018C08D /* x86compileritem.cpp in Sources */, ABF50B29169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */, ABF50B2A169F5FDA0018C08D /* x86defs.cpp in Sources */, ABF50B2B169F5FDA0018C08D /* x86func.cpp in Sources */, ABF50B2C169F5FDA0018C08D /* x86operand.cpp in Sources */, ABF50B2D169F5FDA0018C08D /* x86util.cpp in Sources */, AB6A187F16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198616CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DDE16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795A16D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C5D16F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C5E16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C5F16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C6016F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C6116F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C6216F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C6316F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C6416F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C6516F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C6616F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F31704C86900E28885 /* utilities.c in Sources */, AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145251714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBED172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ABA93EB3178C7D4200CBF50B /* encrypt.cpp in Sources */, AB4C809917C5D7780024D479 /* slot1_retail_auto.cpp in Sources */, AB4C809A17C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */, AB4C809B17C5D7780024D479 /* slot1comp_mc.cpp in Sources */, AB4C809C17C5D7780024D479 /* slot1comp_rom.cpp in Sources */, AB4C80AD17C5D7A00024D479 /* advanscene.cpp in Sources */, ABB9212417CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */, AB43527517D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */, AB43528A17D5BA95007417C8 /* fsnitro.cpp in Sources */, AB126D0A182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518218313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518918313E4E00CCD532 /* slot2.cpp in Sources */, ABAE2F7E18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, ABAE2F8718682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ABECB50C18A460710052D52A /* xbrz.cpp in Sources */, ABECB51718A460910052D52A /* OGLDisplayOutput.cpp in Sources */, ABC3DEC01A96EA96009EC345 /* RomInfoPanel.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABAD0FBA15ACE7A00000EC47 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ABAD0FBB15ACE7A00000EC47 /* ConvertUTF.c in Sources */, ABAD0FBE15ACE7A00000EC47 /* arm_instructions.cpp in Sources */, ABAD0FBF15ACE7A00000EC47 /* armcpu.cpp in Sources */, ABAD0FC015ACE7A00000EC47 /* bios.cpp in Sources */, ABAD0FC115ACE7A00000EC47 /* cache.cpp in Sources */, ABAD0FC215ACE7A00000EC47 /* cheatSystem.cpp in Sources */, ABAD0FC315ACE7A00000EC47 /* common.cpp in Sources */, ABAD0FC415ACE7A00000EC47 /* cp15.cpp in Sources */, ABAD0FC615ACE7A00000EC47 /* crc.cpp in Sources */, ABAD0FC715ACE7A00000EC47 /* datetime.cpp in Sources */, ABAD0FC815ACE7A00000EC47 /* debug.cpp in Sources */, ABAD0FC915ACE7A00000EC47 /* decrypt.cpp in Sources */, ABAD0FCA15ACE7A00000EC47 /* directory.cpp in Sources */, ABAD0FCB15ACE7A00000EC47 /* Disassembler.cpp in Sources */, ABAD0FCC15ACE7A00000EC47 /* disc.cpp in Sources */, ABAD0FCD15ACE7A00000EC47 /* dlditool.cpp in Sources */, ABAD0FCE15ACE7A00000EC47 /* driver.cpp in Sources */, ABAD0FCF15ACE7A00000EC47 /* emufat.cpp in Sources */, ABAD0FD015ACE7A00000EC47 /* emufile.cpp in Sources */, ABAD0FD115ACE7A00000EC47 /* fatdir.cpp in Sources */, ABAD0FD215ACE7A00000EC47 /* fatfile.cpp in Sources */, ABAD0FD315ACE7A00000EC47 /* FIFO.cpp in Sources */, ABAD0FD515ACE7A00000EC47 /* file_allocation_table.cpp in Sources */, ABAD0FD615ACE7A00000EC47 /* filetime.cpp in Sources */, ABAD0FD815ACE7A00000EC47 /* firmware.cpp in Sources */, ABAD0FD915ACE7A00000EC47 /* fs-linux.cpp in Sources */, ABAD0FDA15ACE7A00000EC47 /* gfx3d.cpp in Sources */, ABAD0FDB15ACE7A00000EC47 /* GPU.cpp in Sources */, ABAD0FDC15ACE7A00000EC47 /* GPU_osd_stub.cpp in Sources */, ABAD0FDD15ACE7A00000EC47 /* guid.cpp in Sources */, ABAD0FDE15ACE7A00000EC47 /* header.cpp in Sources */, ABAD0FDF15ACE7A00000EC47 /* libfat.cpp in Sources */, ABAD0FE015ACE7A00000EC47 /* libfat_public_api.cpp in Sources */, ABAD0FE115ACE7A00000EC47 /* lock.cpp in Sources */, ABAD0FE215ACE7A00000EC47 /* matrix.cpp in Sources */, ABAD0FE315ACE7A00000EC47 /* mc.cpp in Sources */, ABAD0FE415ACE7A00000EC47 /* md5.cpp in Sources */, ABAD0FE515ACE7A00000EC47 /* metaspu.cpp in Sources */, ABAD0FE615ACE7A00000EC47 /* MMU.cpp in Sources */, ABAD0FE815ACE7A00000EC47 /* movie.cpp in Sources */, ABAD0FE915ACE7A00000EC47 /* NDSSystem.cpp in Sources */, ABAD0FEA15ACE7A00000EC47 /* partition.cpp in Sources */, ABAD0FEB15ACE7A00000EC47 /* path.cpp in Sources */, ABAD0FEC15ACE7A00000EC47 /* rasterize.cpp in Sources */, ABAD0FEE15ACE7A00000EC47 /* readwrite.cpp in Sources */, ABAD0FEF15ACE7A00000EC47 /* render3D.cpp in Sources */, ABAD0FF015ACE7A00000EC47 /* ROMReader.cpp in Sources */, ABAD0FF115ACE7A00000EC47 /* rtc.cpp in Sources */, ABAD0FF215ACE7A00000EC47 /* saves.cpp in Sources */, ABAD0FF315ACE7A00000EC47 /* slot1.cpp in Sources */, ABAD0FF415ACE7A00000EC47 /* slot1_none.cpp in Sources */, ABAD0FF515ACE7A00000EC47 /* slot1_r4.cpp in Sources */, ABAD0FF715ACE7A00000EC47 /* slot1_retail_nand.cpp in Sources */, ABAD0FF815ACE7A00000EC47 /* slot2_expMemory.cpp in Sources */, ABAD0FF915ACE7A00000EC47 /* slot2_gbagame.cpp in Sources */, ABAD0FFA15ACE7A00000EC47 /* slot2_guitarGrip.cpp in Sources */, ABAD0FFB15ACE7A00000EC47 /* slot2_mpcf.cpp in Sources */, ABAD0FFC15ACE7A00000EC47 /* slot2_none.cpp in Sources */, ABAD0FFD15ACE7A00000EC47 /* slot2_paddle.cpp in Sources */, ABAD0FFE15ACE7A00000EC47 /* slot2_piano.cpp in Sources */, ABAD0FFF15ACE7A00000EC47 /* slot2_rumblepak.cpp in Sources */, ABAD100015ACE7A00000EC47 /* sndOSX.cpp in Sources */, ABAD100115ACE7A00000EC47 /* SndOut.cpp in Sources */, ABAD100315ACE7A00000EC47 /* SPU.cpp in Sources */, ABAD100515ACE7A00000EC47 /* task.cpp in Sources */, ABAD100715ACE7A00000EC47 /* texcache.cpp in Sources */, ABAD100815ACE7A00000EC47 /* thumb_instructions.cpp in Sources */, ABAD100915ACE7A00000EC47 /* Timestretcher.cpp in Sources */, ABAD100A15ACE7A00000EC47 /* tinystr.cpp in Sources */, ABAD100B15ACE7A00000EC47 /* tinyxml.cpp in Sources */, ABAD100C15ACE7A00000EC47 /* tinyxmlerror.cpp in Sources */, ABAD100D15ACE7A00000EC47 /* tinyxmlparser.cpp in Sources */, ABAD100E15ACE7A00000EC47 /* version.cpp in Sources */, ABAD100F15ACE7A00000EC47 /* vfat.cpp in Sources */, ABAD101015ACE7A00000EC47 /* videofilter.cpp in Sources */, ABAD101215ACE7A00000EC47 /* wifi.cpp in Sources */, ABAD101315ACE7A00000EC47 /* xstring.cpp in Sources */, ABAD101415ACE7A00000EC47 /* main.m in Sources */, ABAD101515ACE7A00000EC47 /* cocoa_cheat.mm in Sources */, ABAD101615ACE7A00000EC47 /* cocoa_core.mm in Sources */, ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */, ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */, ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */, ABAD101B15ACE7A00000EC47 /* mic_ext.cpp in Sources */, ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */, ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */, ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */, ABAD101F15ACE7A00000EC47 /* cocoa_videofilter.mm in Sources */, ABAD102015ACE7A00000EC47 /* OGLRender.cpp in Sources */, ABAD102115ACE7A00000EC47 /* appDelegate.mm in Sources */, ABAD102215ACE7A00000EC47 /* cheatWindowDelegate.mm in Sources */, ABAD102515ACE7A00000EC47 /* inputPrefsView.mm in Sources */, ABAD102615ACE7A00000EC47 /* preferencesWindowDelegate.mm in Sources */, ABAD102715ACE7A00000EC47 /* 2xsai.cpp in Sources */, ABAD102815ACE7A00000EC47 /* bilinear.cpp in Sources */, ABAD102915ACE7A00000EC47 /* epx.cpp in Sources */, ABAD102A15ACE7A00000EC47 /* hq2x.cpp in Sources */, ABAD102B15ACE7A00000EC47 /* hq4x.cpp in Sources */, ABAD102C15ACE7A00000EC47 /* lq2x.cpp in Sources */, ABAD102D15ACE7A00000EC47 /* scanline.cpp in Sources */, ABAD102E15ACE7A00000EC47 /* coreaudiosound.cpp in Sources */, ABAD102F15ACE7A00000EC47 /* ringbuffer.cpp in Sources */, ABA03573169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, AB6A187D16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198416CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DE016CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795816D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C5316F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C5416F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C5516F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C5616F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C5716F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C5816F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C5916F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C5A16F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C5B16F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C5C16F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F21704C86900E28885 /* utilities.c in Sources */, AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145231714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBEC172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ABA93EB2178C7D4200CBF50B /* encrypt.cpp in Sources */, AB4C809517C5D7780024D479 /* slot1_retail_auto.cpp in Sources */, AB4C809617C5D7780024D479 /* slot1_retail_mcrom.cpp in Sources */, AB4C809717C5D7780024D479 /* slot1comp_mc.cpp in Sources */, AB4C809817C5D7780024D479 /* slot1comp_rom.cpp in Sources */, AB4C80AC17C5D7A00024D479 /* advanscene.cpp in Sources */, ABB9212317CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */, AB43527417D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */, AB43528917D5BA95007417C8 /* fsnitro.cpp in Sources */, AB126D09182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518118313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518818313E4E00CCD532 /* slot2.cpp in Sources */, ABAE2F7D18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, ABAE2F8618682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ABECB50B18A460710052D52A /* xbrz.cpp in Sources */, ABECB51618A460910052D52A /* OGLDisplayOutput.cpp in Sources */, ABC3DEBF1A96EA96009EC345 /* RomInfoPanel.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ AB00E87914205EAE00DE561F /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( AB00E87A14205EAE00DE561F /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; AB00E87C14205EBC00DE561F /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( AB00E87D14205EBC00DE561F /* English */, ); name = MainMenu.xib; sourceTree = ""; }; AB350D3A147A1D93007165AC /* HID_usage_strings.plist */ = { isa = PBXVariantGroup; children = ( AB350D38147A1D8D007165AC /* English */, ); name = HID_usage_strings.plist; sourceTree = ""; }; AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */ = { isa = PBXVariantGroup; children = ( AB700DB916CDDBC400FBD336 /* English */, ); name = DisplayWindow.xib; sourceTree = ""; }; AB901BDD1420706100348EEC /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( AB00E89114205ECC00DE561F /* English */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ AB2A9A771725F00F0062C1A1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ppc; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G5; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SDKROOT = macosx10.5; SKIP_INSTALL = NO; }; name = Debug; }; AB2A9A781725F00F0062C1A1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ppc; GCC_PREPROCESSOR_DEFINITIONS = ( NDEBUG, PUBLIC_RELEASE, ); PRODUCT_NAME = "DeSmuME (PPC)"; SDKROOT = macosx10.5; }; name = Release; }; AB2F3C4315CF9C6000858373 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SDKROOT = macosx10.5; SKIP_INSTALL = NO; }; name = Debug; }; AB2F3C4415CF9C6000858373 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (PPC)"; SDKROOT = macosx10.5; }; name = Release; }; AB711F7D1481C35F009011C8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_INLINES_ARE_PRIVATE_EXTERN = NO; OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); }; name = Debug; }; AB711F7E1481C35F009011C8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); SKIP_INSTALL = NO; }; name = Release; }; AB73AA311507C9F500A310C8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); SKIP_INSTALL = NO; }; name = Debug; }; AB73AA321507C9F500A310C8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); }; name = Release; }; ABAD104715ACE7A00000EC47 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SDKROOT = macosx10.5; SKIP_INSTALL = NO; }; name = Debug; }; ABAD104815ACE7A00000EC47 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); PRODUCT_NAME = "DeSmuME (PPC)"; SDKROOT = macosx10.5; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( i386, x86_64, ); COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; GCC_ALTIVEC_EXTENSIONS = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_FAST_MATH = YES; GCC_FAST_OBJC_DISPATCH = NO; GCC_MODEL_TUNING = ""; "GCC_MODEL_TUNING[sdk=macosx10.4][arch=ppc]" = G4; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc64]" = G5; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G4; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( _DEBUG, "DEBUG=1", ); GCC_STRICT_ALIASING = YES; GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_PROTOTYPE_CONVERSION = NO; GCC_WARN_SHADOW = NO; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IBC_FLATTEN_NIBS = NO; INFOPLIST_FILE = "Info (Debug).plist"; MACOSX_DEPLOYMENT_TARGET = 10.5; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "DeSmuME (Debug)"; SDKROOT = macosx; SKIP_INSTALL = YES; STRIP_INSTALLED_PRODUCT = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( i386, x86_64, ); COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; ENABLE_OPENMP_SUPPORT = NO; GCC_ALTIVEC_EXTENSIONS = YES; GCC_AUTO_VECTORIZATION = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_SSE3_EXTENSIONS = YES; GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS[arch=i386]" = NO; GCC_FAST_MATH = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; "GCC_MODEL_PPC64[sdk=macosx10.5][arch=ppc64]" = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; GCC_STRICT_ALIASING = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_PROTOTYPE_CONVERSION = NO; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Info.plist; MACOSX_DEPLOYMENT_TARGET = 10.5; PRODUCT_NAME = DeSmuME; SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = NO; VALIDATE_PRODUCT = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ AB2A9A761725F00F0062C1A1 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC Release Build)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB2A9A771725F00F0062C1A1 /* Debug */, AB2A9A781725F00F0062C1A1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB2F3C4215CF9C6000858373 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-GCC)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB2F3C4315CF9C6000858373 /* Debug */, AB2F3C4415CF9C6000858373 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB711F7C1481C35F009011C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-Clang)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB711F7D1481C35F009011C8 /* Debug */, AB711F7E1481C35F009011C8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB73AA301507C9F500A310C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-GCC)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB73AA311507C9F500A310C8 /* Debug */, AB73AA321507C9F500A310C8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ABAD104615ACE7A00000EC47 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-Clang)" */ = { isa = XCConfigurationList; buildConfigurations = ( ABAD104715ACE7A00000EC47 /* Debug */, ABAD104815ACE7A00000EC47 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 3)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } desmume-0.9.11/src/cocoa/userinterface/0000755000000000000000000000000012467662066016470 5ustar rootrootdesmume-0.9.11/src/cocoa/userinterface/appDelegate.mm0000755000000000000000000007550512467662066021255 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "appDelegate.h" #import "DisplayWindowController.h" #import "EmuControllerDelegate.h" #import "FileMigrationDelegate.h" #import "RomInfoPanel.h" #import "Slot2WindowDelegate.h" #import "preferencesWindowDelegate.h" #import "troubleshootingWindowDelegate.h" #import "cheatWindowDelegate.h" #import "inputPrefsView.h" #import "cocoa_core.h" #import "cocoa_file.h" #import "cocoa_firmware.h" #import "cocoa_globals.h" #import "cocoa_input.h" #import "cocoa_rom.h" #import "cocoa_util.h" @implementation AppDelegate @dynamic dummyObject; @synthesize prefWindow; @synthesize troubleshootingWindow; @synthesize cheatListWindow; @synthesize slot2Window; @synthesize prefGeneralView; @synthesize mLoadStateSlot; @synthesize mSaveStateSlot; @synthesize inputPrefsView; @synthesize aboutWindowController; @synthesize emuControlController; @synthesize cdsSoundController; @synthesize romInfoPanelController; @synthesize prefWindowController; @synthesize cdsCoreController; @synthesize inputDeviceListController; @synthesize cheatWindowController; @synthesize migrationDelegate; @synthesize inputManager; @synthesize romInfoPanel; @synthesize isAppRunningOnIntel; @synthesize isDeveloperPlusBuild; - (id)init { self = [super init]; if(self == nil) { return nil; } // Determine if we're running on Intel or PPC. #if defined(__i386__) || defined(__x86_64__) isAppRunningOnIntel = YES; #else isAppRunningOnIntel = NO; #endif #if defined(GDB_STUB) isDeveloperPlusBuild = YES; #else isDeveloperPlusBuild = NO; #endif return self; } #pragma mark NSApplicationDelegate Protocol - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { BOOL result = NO; NSURL *fileURL = [NSURL fileURLWithPath:filename]; EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (cdsCore == nil) { return result; } NSString *fileKind = [CocoaDSFile fileKindByURL:fileURL]; if ([fileKind isEqualToString:@"ROM"]) { result = [emuControl handleLoadRomByURL:fileURL]; if ([emuControl isShowingSaveStateDialog] || [emuControl isShowingFileMigrationDialog]) { // Just reply YES if a sheet is showing, even if the ROM hasn't actually been loaded yet. // This will prevent the error dialog from showing, which is the intended behavior in // this case. result = YES; } } return result; } - (void)applicationWillFinishLaunching:(NSNotification *)notification { // Register the application's defaults. NSDictionary *prefsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserPrefs" ofType:@"plist"]]; if (prefsDict == nil) { [[NSAlert alertWithMessageText:NSSTRING_ALERT_CRITICAL_FILE_MISSING_PRI defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:NSSTRING_ALERT_CRITICAL_FILE_MISSING_SEC] runModal]; [NSApp terminate:nil]; return; } [[NSUserDefaults standardUserDefaults] registerDefaults:prefsDict]; EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; PreferencesWindowDelegate *prefWindowDelegate = (PreferencesWindowDelegate *)[prefWindow delegate]; CheatWindowDelegate *cheatWindowDelegate = (CheatWindowDelegate *)[cheatListWindow delegate]; Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2Window delegate]; // Create the needed directories in Application Support if they haven't already // been created. if (![CocoaDSFile setupAllAppDirectories]) { // Need to show a modal dialog here. return; } [CocoaDSFile setupAllFilePaths]; // Setup the About window. NSString *descriptionStr = [[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"] stringByAppendingString:@" "] stringByAppendingString:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]]; descriptionStr = [[descriptionStr stringByAppendingString:@"\n"] stringByAppendingString:@STRING_DESMUME_SHORT_DESCRIPTION]; descriptionStr = [[descriptionStr stringByAppendingString:@"\n"] stringByAppendingString:@STRING_DESMUME_WEBSITE]; NSString *buildInfoStr = @"Build Info:"; buildInfoStr = [[buildInfoStr stringByAppendingString:[CocoaDSUtil appInternalVersionString]] stringByAppendingString:[CocoaDSUtil appCompilerDetailString]]; buildInfoStr = [[buildInfoStr stringByAppendingString:@"\nBuild Date: "] stringByAppendingString:@__DATE__]; buildInfoStr = [[buildInfoStr stringByAppendingString:@"\nOperating System: "] stringByAppendingString:[CocoaDSUtil operatingSystemString]]; buildInfoStr = [[buildInfoStr stringByAppendingString:@"\nModel Identifier: "] stringByAppendingString:[CocoaDSUtil modelIdentifierString]]; NSFont *aboutTextFilesFont = [NSFont fontWithName:@"Monaco" size:10]; NSMutableDictionary *aboutWindowProperties = [NSMutableDictionary dictionaryWithObjectsAndKeys: [[NSBundle mainBundle] pathForResource:@FILENAME_README ofType:@""], @"readMePath", [[NSBundle mainBundle] pathForResource:@FILENAME_COPYING ofType:@""], @"licensePath", [[NSBundle mainBundle] pathForResource:@FILENAME_AUTHORS ofType:@""], @"authorsPath", [[NSBundle mainBundle] pathForResource:@FILENAME_CHANGELOG ofType:@""], @"changeLogPath", descriptionStr, @"descriptionString", buildInfoStr, @"buildInfoString", aboutTextFilesFont, @"aboutTextFilesFont", nil]; [aboutWindowController setContent:aboutWindowProperties]; // Set the preferences window to the general view by default. [[prefWindowDelegate toolbar] setSelectedItemIdentifier:@"General"]; [prefWindowDelegate changePrefView:self]; // Setup the slot menu items. We set this up manually instead of through Interface // Builder because we're assuming an arbitrary number of slot items. [self setupSlotMenuItems]; // Init the DS emulation core. CocoaDSCore *newCore = [[[CocoaDSCore alloc] init] autorelease]; // Init the DS controller. CocoaDSController *newController = [[[CocoaDSController alloc] init] autorelease]; [newCore setCdsController:newController]; [newController setDelegate:emuControl]; [newController setHardwareMicEnabled:YES]; // Init the DS speakers. CocoaDSSpeaker *newSpeaker = [[[CocoaDSSpeaker alloc] init] autorelease]; [newCore addOutput:newSpeaker]; [emuControl setCdsSpeaker:newSpeaker]; // Update the SLOT-2 device list after the emulation core is initialized. [slot2WindowDelegate update]; [slot2WindowDelegate setHidManager:[inputManager hidManager]]; [slot2WindowDelegate setAutoSelectedDeviceText:[[slot2WindowDelegate deviceManager] autoSelectedDeviceName]]; // Start up the threads for our outputs. [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newSpeaker withObject:nil]; // Wait until the SPU is finished starting up. while ([newSpeaker thread] == nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } // Set up all the object controllers. [cdsCoreController setContent:newCore]; [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [prefWindowController setContent:[prefWindowDelegate bindings]]; [cheatWindowController setContent:[cheatWindowDelegate bindings]]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; // Determine if the app was run for the first time. NSMutableDictionary *appFirstTimeRunDict = [[NSMutableDictionary alloc] initWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"General_AppFirstTimeRun"]]; NSString *bundleVersionString = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; BOOL isFirstTimeRun = NO; NSNumber *isFirstTimeRunNumber = (NSNumber *)[appFirstTimeRunDict valueForKey:bundleVersionString]; if (isFirstTimeRunNumber == nil) { isFirstTimeRunNumber = [NSNumber numberWithBool:isFirstTimeRun]; } isFirstTimeRun = [isFirstTimeRunNumber boolValue]; if (appFirstTimeRunDict == nil) { appFirstTimeRunDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:isFirstTimeRunNumber, bundleVersionString, nil]; } // Setup the applications settings from the user defaults file. [self setupUserDefaults]; // Set up the input preferences view. [inputPrefsView initSettingsSheets]; [inputPrefsView populateInputProfileMenu]; [[inputPrefsView inputPrefOutlineView] expandItem:nil expandChildren:YES]; [[inputPrefsView inputProfileMenu] selectItemAtIndex:0]; // Make sure that the mic is paused to start with. [[cdsCore cdsController] setHardwareMicPause:YES]; [emuControl updateMicStatusIcon]; //Bring the application to the front [NSApp activateIgnoringOtherApps:TRUE]; [self restoreDisplayWindowStates]; // Load a new ROM on launch per user preferences. if ([[NSUserDefaults standardUserDefaults] objectForKey:@"General_AutoloadROMOnLaunch"] != nil) { // Older versions of DeSmuME used General_AutoloadROMOnLaunch to determine whether to // load a ROM on launch or not. This has been superseded by the autoload ROM option // ROMAUTOLOADOPTION_LOAD_NONE. So if this object key exists in the user defaults, we // need to update the user defaults key/values as needed, and then remove the // General_AutoloadROMOnLaunch object key. const BOOL loadROMOnLaunch = [[NSUserDefaults standardUserDefaults] boolForKey:@"General_AutoloadROMOnLaunch"]; if (!loadROMOnLaunch) { [[NSUserDefaults standardUserDefaults] setInteger:ROMAUTOLOADOPTION_LOAD_NONE forKey:@"General_AutoloadROMOption"]; } [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"General_AutoloadROMOnLaunch"]; } if ([emuControl currentRom] == nil) { const NSInteger autoloadRomOption = [[NSUserDefaults standardUserDefaults] integerForKey:@"General_AutoloadROMOption"]; NSURL *autoloadRomURL = nil; switch (autoloadRomOption) { case ROMAUTOLOADOPTION_LOAD_NONE: autoloadRomURL = nil; break; case ROMAUTOLOADOPTION_LOAD_LAST: autoloadRomURL = [CocoaDSFile lastLoadedRomURL]; break; case ROMAUTOLOADOPTION_LOAD_SELECTED: { NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; if (autoloadRomPath != nil && [autoloadRomPath length] > 0) { autoloadRomURL = [NSURL fileURLWithPath:autoloadRomPath]; } break; } default: break; } [emuControl handleLoadRomByURL:autoloadRomURL]; } // Present the file migration window to the user (if they haven't disabled it). if (![[NSUserDefaults standardUserDefaults] boolForKey:@"General_DoNotAskMigrate"] || !isFirstTimeRun) { [migrationDelegate updateFileList]; if ([migrationDelegate filesPresent]) { [[migrationDelegate window] center]; [[migrationDelegate window] makeKeyAndOrderFront:nil]; } } // Set that the app has run for the first time. isFirstTimeRun = YES; [appFirstTimeRunDict setValue:[NSNumber numberWithBool:isFirstTimeRun] forKey:bundleVersionString]; [[NSUserDefaults standardUserDefaults] setObject:appFirstTimeRunDict forKey:@"General_AppFirstTimeRun"]; [appFirstTimeRunDict release]; } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; // If a file needs to be saved, give the user a chance to save it // before quitting. const BOOL didRomClose = [emuControl handleUnloadRom:REASONFORCLOSE_TERMINATE romToLoad:nil]; if (!didRomClose) { if ([emuControl isShowingSaveStateDialog]) { return NSTerminateLater; } } // Either there wasn't a file that needed to be saved, or there // wasn't anything loaded. Just continue program termination normally. return NSTerminateNow; } - (void)applicationWillTerminate:(NSNotification *)notification { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Save some settings to user defaults before app termination [self saveDisplayWindowStates]; [romInfoPanel writeDefaults]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsController] hardwareMicMute] forKey:@"Microphone_HardwareMicMute"]; [[NSUserDefaults standardUserDefaults] setDouble:[emuControl currentVolumeValue] forKey:@"Sound_Volume"]; [[NSUserDefaults standardUserDefaults] setDouble:[emuControl lastSetSpeedScalar] forKey:@"CoreControl_SpeedScalar"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore isSpeedLimitEnabled] forKey:@"CoreControl_EnableSpeedLimit"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore isFrameSkipEnabled] forKey:@"CoreControl_EnableAutoFrameSkip"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore isCheatingEnabled] forKey:@"CoreControl_EnableCheats"]; #ifdef GDB_STUB [[NSUserDefaults standardUserDefaults] setBool:[cdsCore enableGdbStubARM9] forKey:@"Debug_GDBStubEnableARM9"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore enableGdbStubARM7] forKey:@"Debug_GDBStubEnableARM7"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore gdbStubPortARM9] forKey:@"Debug_GDBStubPortARM9"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore gdbStubPortARM7] forKey:@"Debug_GDBStubPortARM7"]; #endif [cdsCoreController setContent:nil]; } #pragma mark IBActions - (IBAction) launchWebsite:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_WEBSITE]]; } - (IBAction) launchForums:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_FORUM_SITE]]; } - (IBAction) supportRequest:(id)sender { TroubleshootingWindowDelegate *troubleshootingWindowDelegate = [troubleshootingWindow delegate]; [troubleshootingWindowDelegate switchViewByID:TROUBLESHOOTING_TECH_SUPPORT_VIEW_ID]; [troubleshootingWindow setTitle:NSSTRING_TITLE_TECH_SUPPORT_WINDOW_TITLE]; [troubleshootingWindow makeKeyAndOrderFront:sender]; } - (IBAction) bugReport:(id)sender { TroubleshootingWindowDelegate *troubleshootingWindowDelegate = [troubleshootingWindow delegate]; [troubleshootingWindowDelegate switchViewByID:TROUBLESHOOTING_BUG_REPORT_VIEW_ID]; [troubleshootingWindow setTitle:NSSTRING_TITLE_BUG_REPORT_WINDOW_TITLE]; [troubleshootingWindow makeKeyAndOrderFront:sender]; } #pragma mark Class Methods - (void) setupSlotMenuItems { NSMenuItem *loadItem = nil; NSMenuItem *saveItem = nil; for(NSInteger i = 0; i < MAX_SAVESTATE_SLOTS; i++) { loadItem = [self addSlotMenuItem:mLoadStateSlot slotNumber:(NSUInteger)(i + 1)]; [loadItem setKeyEquivalentModifierMask:0]; [loadItem setTag:i]; [loadItem setAction:@selector(loadEmuSaveStateSlot:)]; saveItem = [self addSlotMenuItem:mSaveStateSlot slotNumber:(NSUInteger)(i + 1)]; [saveItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [saveItem setTag:i]; [saveItem setAction:@selector(saveEmuSaveStateSlot:)]; } } - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; NSUInteger slotNumberKey = slotNumber; if (slotNumber == 10) { slotNumberKey = 0; } NSMenuItem *mItem = [menu addItemWithTitle:[NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, (unsigned long)slotNumber] action:nil keyEquivalent:[NSString stringWithFormat:@"%ld", (unsigned long)slotNumberKey]]; [mItem setTarget:emuControl]; return mItem; } - (void) setupUserDefaults { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate]; Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2Window delegate]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Set the emulation flags. NSUInteger emuFlags = 0; if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_AdvancedBusLevelTiming"]) { emuFlags |= EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_RigorousTiming"]) { emuFlags |= EMULATION_RIGOROUS_TIMING_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseExternalBIOSImages"]) { emuFlags |= EMULATION_USE_EXTERNAL_BIOS_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_BIOSEmulateSWI"]) { emuFlags |= EMULATION_BIOS_SWI_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_BIOSPatchDelayLoopSWI"]) { emuFlags |= EMULATION_PATCH_DELAY_LOOP_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseExternalFirmwareImage"]) { emuFlags |= EMULATION_USE_EXTERNAL_FIRMWARE_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_FirmwareBoot"]) { emuFlags |= EMULATION_BOOT_FROM_FIRMWARE_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_EmulateEnsata"]) { emuFlags |= EMULATION_ENSATA_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseDebugConsole"]) { emuFlags |= EMULATION_DEBUG_CONSOLE_MASK; } [cdsCore setEmulationFlags:emuFlags]; // If we're not running on Intel, force the CPU emulation engine to use the interpreter engine. if (!isAppRunningOnIntel) { [[NSUserDefaults standardUserDefaults] setInteger:CPU_EMULATION_ENGINE_INTERPRETER forKey:@"Emulation_CPUEmulationEngine"]; } // Set the CPU emulation engine per user preferences. [cdsCore setCpuEmulationEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Emulation_CPUEmulationEngine"]]; [cdsCore setMaxJITBlockSize:[[NSUserDefaults standardUserDefaults] integerForKey:@"Emulation_MaxJITBlockSize"]]; // Set the SLOT-1 device settings per user preferences. NSString *slot1R4Path = (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:@"EmulationSlot1_R4StoragePath"]; [cdsCore setSlot1DeviceType:[[NSUserDefaults standardUserDefaults] integerForKey:@"EmulationSlot1_DeviceType"]]; [cdsCore setSlot1R4URL:(slot1R4Path != nil) ? [NSURL fileURLWithPath:slot1R4Path] : nil]; // Set the miscellaneous emulations settings per user preferences. [emuControl changeCoreSpeedWithDouble:[[NSUserDefaults standardUserDefaults] doubleForKey:@"CoreControl_SpeedScalar"]]; [cdsCore setIsSpeedLimitEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableSpeedLimit"]]; [cdsCore setIsFrameSkipEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableAutoFrameSkip"]]; [cdsCore setIsCheatingEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableCheats"]]; // Set up the firmware per user preferences. NSMutableDictionary *newFWDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Nickname"], @"Nickname", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Message"], @"Message", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_FavoriteColor"], @"FavoriteColor", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Birthday"], @"Birthday", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Language"], @"Language", nil]; CocoaDSFirmware *newFirmware = [[[CocoaDSFirmware alloc] initWithDictionary:newFWDict] autorelease]; [newFirmware update]; [emuControl setCdsFirmware:newFirmware]; // Setup the ARM7 BIOS, ARM9 BIOS, and firmware image paths per user preferences. NSString *arm7BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM7ImagePath"]; if (arm7BiosImagePath != nil) { [cdsCore setArm7ImageURL:[NSURL fileURLWithPath:arm7BiosImagePath]]; } else { [cdsCore setArm7ImageURL:nil]; } NSString *arm9BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM9ImagePath"]; if (arm9BiosImagePath != nil) { [cdsCore setArm9ImageURL:[NSURL fileURLWithPath:arm9BiosImagePath]]; } else { [cdsCore setArm9ImageURL:nil]; } NSString *firmwareImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Emulation_FirmwareImagePath"]; if (firmwareImagePath != nil) { [cdsCore setFirmwareImageURL:[NSURL fileURLWithPath:firmwareImagePath]]; } else { [cdsCore setFirmwareImageURL:nil]; } // Set up GDB stub settings per user preferences. #ifdef GDB_STUB [cdsCore setEnableGdbStubARM9:[[NSUserDefaults standardUserDefaults] boolForKey:@"Debug_GDBStubEnableARM9"]]; [cdsCore setEnableGdbStubARM7:[[NSUserDefaults standardUserDefaults] boolForKey:@"Debug_GDBStubEnableARM7"]]; [cdsCore setGdbStubPortARM9:[[NSUserDefaults standardUserDefaults] integerForKey:@"Debug_GDBStubPortARM9"]]; [cdsCore setGdbStubPortARM7:[[NSUserDefaults standardUserDefaults] integerForKey:@"Debug_GDBStubPortARM7"]]; #else [cdsCore setEnableGdbStubARM9:NO]; [cdsCore setEnableGdbStubARM7:NO]; [cdsCore setGdbStubPortARM9:0]; [cdsCore setGdbStubPortARM7:0]; #endif // Set up the user's default input settings. NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; if (userMappings == nil) { NSDictionary *defaultKeyMappingsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; NSArray *internalDefaultProfilesList = (NSArray *)[defaultKeyMappingsDict valueForKey:@"DefaultInputProfiles"]; userMappings = [(NSDictionary *)[internalDefaultProfilesList objectAtIndex:0] valueForKey:@"Mappings"]; } [inputManager setMappingsWithMappings:userMappings]; [[inputManager hidManager] setDeviceListController:inputDeviceListController]; // Set up the ROM Info panel. [romInfoPanel setupUserDefaults]; // Set up the preferences window. [prefWindowDelegate setupUserDefaults]; // Set up the default SLOT-2 device. [slot2WindowDelegate setupUserDefaults]; // Set up the rest of the emulation-related user defaults. [emuControl setupUserDefaults]; } - (void) restoreDisplayWindowStates { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; NSArray *windowPropertiesList = [[NSUserDefaults standardUserDefaults] arrayForKey:@"General_DisplayWindowRestorableStates"]; const BOOL willRestoreWindows = [[NSUserDefaults standardUserDefaults] boolForKey:@"General_WillRestoreDisplayWindows"]; if (!willRestoreWindows || windowPropertiesList == nil || [windowPropertiesList count] < 1) { // If no windows were saved for restoring (the user probably closed all windows before // app termination), then simply create a new display window per user defaults. [emuControl newDisplayWindow:self]; } else { for (NSDictionary *windowProperties in windowPropertiesList) { DisplayWindowController *windowController = [[DisplayWindowController alloc] initWithWindowNibName:@"DisplayWindow" emuControlDelegate:emuControl]; if (windowController == nil) { continue; } const NSInteger displayMode = [(NSNumber *)[windowProperties valueForKey:@"displayMode"] integerValue]; const double displayScale = [(NSNumber *)[windowProperties valueForKey:@"displayScale"] doubleValue]; const double displayRotation = [(NSNumber *)[windowProperties valueForKey:@"displayRotation"] doubleValue]; const NSInteger displayOrientation = [(NSNumber *)[windowProperties valueForKey:@"displayOrientation"] integerValue]; const NSInteger displayOrder = [(NSNumber *)[windowProperties valueForKey:@"displayOrder"] integerValue]; const double displayGap = [(NSNumber *)[windowProperties valueForKey:@"displayGap"] doubleValue]; const BOOL videoFiltersPreferGPU = [(NSNumber *)[windowProperties valueForKey:@"videoFiltersPreferGPU"] boolValue]; const BOOL videoSourceDeposterize = [(NSNumber *)[windowProperties valueForKey:@"videoSourceDeposterize"] boolValue]; const NSInteger videoPixelScaler = [(NSNumber *)[windowProperties valueForKey:@"videoFilterType"] integerValue]; const NSInteger videoOutputFilter = [(NSNumber *)[windowProperties valueForKey:@"videoOutputFilter"] integerValue]; const NSInteger screenshotFileFormat = [(NSNumber *)[windowProperties valueForKey:@"screenshotFileFormat"] integerValue]; const BOOL useVerticalSync = [(NSNumber *)[windowProperties valueForKey:@"useVerticalSync"] boolValue]; const BOOL isMinSizeNormal = [(NSNumber *)[windowProperties valueForKey:@"isMinSizeNormal"] boolValue]; const BOOL isShowingStatusBar = [(NSNumber *)[windowProperties valueForKey:@"isShowingStatusBar"] boolValue]; const BOOL isInFullScreenMode = [(NSNumber *)[windowProperties valueForKey:@"isInFullScreenMode"] boolValue]; const NSUInteger screenIndex = [(NSNumber *)[windowProperties valueForKey:@"screenIndex"] unsignedIntegerValue]; NSString *windowFrameStr = (NSString *)[windowProperties valueForKey:@"windowFrame"]; int frameX = 0; int frameY = 0; int frameWidth = GPU_DISPLAY_WIDTH; int frameHeight = GPU_DISPLAY_HEIGHT; const char *frameCStr = [windowFrameStr cStringUsingEncoding:NSUTF8StringEncoding]; sscanf(frameCStr, "%i %i %i %i", &frameX, &frameY, &frameWidth, &frameHeight); [windowController setIsMinSizeNormal:isMinSizeNormal]; [windowController setIsShowingStatusBar:isShowingStatusBar]; [windowController setVideoFiltersPreferGPU:videoFiltersPreferGPU]; [windowController setVideoSourceDeposterize:videoSourceDeposterize]; [windowController setVideoPixelScaler:videoPixelScaler]; [windowController setVideoOutputFilter:videoOutputFilter]; [windowController setDisplayMode:displayMode]; [windowController setDisplayRotation:displayRotation]; [windowController setDisplayOrientation:displayOrientation]; [windowController setDisplayOrder:displayOrder]; [windowController setDisplayGap:displayGap]; [windowController setScreenshotFileFormat:screenshotFileFormat]; [[windowController view] setUseVerticalSync:useVerticalSync]; [windowController setDisplayScale:displayScale]; [[windowController masterWindow] setFrameOrigin:NSMakePoint(frameX, frameY)]; // If this is the last window in the list, make this window key and main. // Otherwise, just order the window to the front so that the windows will // stack in a deterministic order. if (windowProperties == [windowPropertiesList lastObject]) { [[windowController window] makeKeyAndOrderFront:self]; [[windowController window] makeMainWindow]; } else { [[windowController window] orderFront:self]; } // Draw the display view now so that we guarantee that its drawn at least once. [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; // If this window is set to full screen mode, its associated screen index must // exist. If not, this window will not enter full screen mode. This is necessary, // since the user's screen configuration could change in between app launches, // and since we don't want a window to go full screen on the wrong screen. if (isInFullScreenMode && ([[NSScreen screens] indexOfObject:[[windowController window] screen]] == screenIndex)) { [windowController enterFullScreen]; [[windowController window] makeKeyAndOrderFront:self]; [[windowController window] makeMainWindow]; } } } } - (void) saveDisplayWindowStates { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; NSArray *windowList = [emuControl windowList]; const BOOL willRestoreWindows = [[NSUserDefaults standardUserDefaults] boolForKey:@"General_WillRestoreDisplayWindows"]; if (willRestoreWindows && [windowList count] > 0) { NSMutableArray *windowPropertiesList = [NSMutableArray arrayWithCapacity:[windowList count]]; for (DisplayWindowController *windowController in windowList) { const BOOL isInFullScreenMode = ([windowController assignedScreen] != nil); const NSUInteger screenIndex = [[NSScreen screens] indexOfObject:[[windowController masterWindow] screen]]; const NSRect windowFrame = [[windowController masterWindow] frame]; NSString *windowFrameStr = [NSString stringWithFormat:@"%i %i %i %i", (int)windowFrame.origin.x, (int)windowFrame.origin.y, (int)windowFrame.size.width, (int)windowFrame.size.height]; NSDictionary *windowProperties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInteger:[windowController displayMode]], @"displayMode", [NSNumber numberWithDouble:[windowController displayScale]], @"displayScale", [NSNumber numberWithDouble:[windowController displayRotation]], @"displayRotation", [NSNumber numberWithInteger:[windowController displayOrientation]], @"displayOrientation", [NSNumber numberWithInteger:[windowController displayOrder]], @"displayOrder", [NSNumber numberWithDouble:[windowController displayGap]], @"displayGap", [NSNumber numberWithBool:[windowController videoFiltersPreferGPU]], @"videoFiltersPreferGPU", [NSNumber numberWithInteger:[windowController videoPixelScaler]], @"videoFilterType", [NSNumber numberWithInteger:[windowController screenshotFileFormat]], @"screenshotFileFormat", [NSNumber numberWithInteger:[windowController videoOutputFilter]], @"videoOutputFilter", [NSNumber numberWithBool:[windowController videoSourceDeposterize]], @"videoSourceDeposterize", [NSNumber numberWithBool:[[windowController view] useVerticalSync]], @"useVerticalSync", [NSNumber numberWithBool:[windowController isMinSizeNormal]], @"isMinSizeNormal", [NSNumber numberWithBool:[windowController isShowingStatusBar]], @"isShowingStatusBar", [NSNumber numberWithBool:isInFullScreenMode], @"isInFullScreenMode", [NSNumber numberWithUnsignedInteger:screenIndex], @"screenIndex", windowFrameStr, @"windowFrame", nil]; [windowPropertiesList addObject:windowProperties]; } [[NSUserDefaults standardUserDefaults] setObject:windowPropertiesList forKey:@"General_DisplayWindowRestorableStates"]; } else { [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"General_DisplayWindowRestorableStates"]; } } @end desmume-0.9.11/src/cocoa/userinterface/troubleshootingWindowDelegate.mm0000755000000000000000000002734612467662066025114 0ustar rootroot/* Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "troubleshootingWindowDelegate.h" #import "EmuControllerDelegate.h" #import "cocoa_util.h" #import "cocoa_globals.h" #import "cocoa_cheat.h" #import "cocoa_core.h" #import "cocoa_GPU.h" #import "cocoa_output.h" @implementation TroubleshootingWindowDelegate @synthesize dummyObject; @synthesize window; @synthesize troubleshootingWindowController; @synthesize romInfoController; @synthesize emuControlController; @synthesize cdsCoreController; @synthesize viewSupportRequest; @synthesize viewBugReport; @synthesize viewFinishedForm; @synthesize bindings; - (id)init { self = [super init]; if(self == nil) { return nil; } bindings = [[NSMutableDictionary alloc] init]; if (bindings == nil) { [self release]; self = nil; return self; } return self; } - (void)dealloc { [super dealloc]; } - (IBAction) copyRomInfoToTextFields:(id)sender { NSMutableDictionary *romInfoBindings = (NSMutableDictionary *)[romInfoController content]; NSString *romNameStr = (NSString *)[romInfoBindings valueForKey:@"romInternalName"]; NSString *romSerialStr = (NSString *)[romInfoBindings valueForKey:@"romSerial"]; [bindings setValue:romNameStr forKey:@"romName"]; [bindings setValue:romSerialStr forKey:@"romSerial"]; } - (IBAction) continueToFinalForm:(id)sender { static NSString *unspecifiedStr = @"Unspecified"; // Do not expose localized version for this NSString -- we want this to be in English EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Force end of editing of any text fields. [window makeFirstResponder:nil]; // Set final form text. #ifdef PUBLIC_RELEASE NSString *appVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; #else NSString *appVersionStr = [[CocoaDSUtil appInternalVersionString] stringByAppendingString:[CocoaDSUtil appCompilerDetailString]]; #endif NSString *romNameStr = (NSString *)[bindings valueForKey:@"romName"]; if (romNameStr == nil) { romNameStr = unspecifiedStr; } NSString *romSerialStr = (NSString *)[bindings valueForKey:@"romSerial"]; if (romSerialStr == nil) { romSerialStr = unspecifiedStr; } NSString *finalFormTextStr = @"App Version: "; finalFormTextStr = [finalFormTextStr stringByAppendingString:appVersionStr]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nOperating System: "] stringByAppendingString:[CocoaDSUtil operatingSystemString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nModel Identifier: "] stringByAppendingString:[CocoaDSUtil modelIdentifierString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nROM Name: "] stringByAppendingString:romNameStr]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nROM Serial: "] stringByAppendingString:romSerialStr]; finalFormTextStr = [finalFormTextStr stringByAppendingString:@"\n-----------------------------------"]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nEmulation Speed: "] stringByAppendingString:([cdsCore isSpeedLimitEnabled] ? [NSString stringWithFormat:@"%1.2fx", [emuControl lastSetSpeedScalar]] : @"Unlimited")]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAuto Frame Skip: "] stringByAppendingString:([cdsCore isFrameSkipEnabled] ? @"YES" : @"NO")]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nSLOT-1 Device Type: "] stringByAppendingString:[cdsCore slot1DeviceTypeString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nSLOT-2 Device Type: "] stringByAppendingString:[cdsCore slot2DeviceTypeString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAdvanced Bus-Level Timing: "] stringByAppendingString:([cdsCore emuFlagAdvancedBusLevelTiming] ? @"YES" : @"NO")]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nRigorous 3D Rendering Timing: "] stringByAppendingString:([cdsCore emuFlagRigorousTiming] ? @"YES" : @"NO")]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nCPU Emulation Engine: "] stringByAppendingString:([cdsCore cpuEmulationEngine] == CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER ? [NSString stringWithFormat:@"%@ (BlockSize=%li)", [cdsCore cpuEmulationEngineString], (long)[cdsCore maxJITBlockSize]] : [cdsCore cpuEmulationEngineString])]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nExternal BIOS: "] stringByAppendingString:([cdsCore emuFlagUseExternalBios] ? @"YES" : @"NO")]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nExternal Firmware: "] stringByAppendingString:([cdsCore emuFlagUseExternalFirmware] ? @"YES" : @"NO")]; NSString *render3DEngineDetails = [[cdsCore cdsGPU] render3DRenderingEngineString]; switch ([[cdsCore cdsGPU] render3DRenderingEngine]) { case CORE3DLIST_NULL: break; case CORE3DLIST_SWRASTERIZE: render3DEngineDetails = [NSString stringWithFormat:@"%@ (HighResColor=%@, EdgeMark=%@, Fog=%@, LineHack=%@, FragmentSamplingHack=%@, DepthCompare=%ld, ThreadCount=%@)", [[cdsCore cdsGPU] render3DRenderingEngineString], ([[cdsCore cdsGPU] render3DHighPrecisionColorInterpolation] ? @"YES" : @"NO"), ([[cdsCore cdsGPU] render3DEdgeMarking] ? @"YES" : @"NO"), ([[cdsCore cdsGPU] render3DFog] ? @"YES" : @"NO"), ([[cdsCore cdsGPU] render3DLineHack] ? @"YES" : @"NO"), ([[cdsCore cdsGPU] render3DFragmentSamplingHack] ? @"YES" : @"NO"), (unsigned long)[[cdsCore cdsGPU] render3DDepthComparisonThreshold], ([[cdsCore cdsGPU] render3DThreads] == 0 ? @"Automatic" : [NSString stringWithFormat:@"%ld", (unsigned long)[[cdsCore cdsGPU] render3DThreads]])]; break; case CORE3DLIST_OPENGL: render3DEngineDetails = [NSString stringWithFormat:@"%@ (MSAA=%@)", [[cdsCore cdsGPU] render3DRenderingEngineString], ([[cdsCore cdsGPU] render3DMultisample] ? @"YES" : @"NO")]; break; default: break; } finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n3D Renderer - Engine: "] stringByAppendingString:render3DEngineDetails]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n3D Renderer - Textures: "] stringByAppendingString:([[cdsCore cdsGPU] render3DTextures] ? @"YES" : @"NO")]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Output Engine: "] stringByAppendingString:[[emuControl cdsSpeaker] audioOutputEngineString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Advanced SPU Logic: "] stringByAppendingString:([[emuControl cdsSpeaker] spuAdvancedLogic] ? @"YES" : @"NO")]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Sound Interpolation Method: "] stringByAppendingString:[[emuControl cdsSpeaker] spuInterpolationModeString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Sound Synchronization Method: "] stringByAppendingString:[[emuControl cdsSpeaker] spuSyncMethodString]]; finalFormTextStr = [finalFormTextStr stringByAppendingString:@"\n-----------------------------------"]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nCheats: "] stringByAppendingString:([cdsCore isCheatingEnabled] ? [NSString stringWithFormat:@"YES (ActiveCheatCount=%ld)", (unsigned long)[[emuControl cdsCheats] activeCount]] : @"NO")]; finalFormTextStr = [finalFormTextStr stringByAppendingString:@"\n-----------------------------------"]; if ([window contentView] == viewSupportRequest) { NSString *supportRequestTextStr = (NSString *)[bindings valueForKey:@"supportRequestText"]; if (supportRequestTextStr == nil) { supportRequestTextStr = unspecifiedStr; } finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nSupport Request: "] stringByAppendingString:supportRequestTextStr]; [bindings setValue:NSSTRING_HELP_COPY_PASTE_TECH_SUPPORT forKey:@"copyPasteHelpText"]; [bindings setValue:NSSTRING_TITLE_GO_TECH_SUPPORT_WEBPAGE_TITLE forKey:@"goWebpageButtonTitle"]; } else { NSString *bugReportObservedTextStr = (NSString *)[bindings valueForKey:@"bugReportObservedText"]; if (bugReportObservedTextStr == nil) { bugReportObservedTextStr = unspecifiedStr; } NSString *bugReportExpectedTextStr = (NSString *)[bindings valueForKey:@"bugReportExpectedText"]; if (bugReportExpectedTextStr == nil) { bugReportExpectedTextStr = unspecifiedStr; } finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nObserved Behavior: "] stringByAppendingString:bugReportObservedTextStr]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n\nExpected Behavior: "] stringByAppendingString:bugReportExpectedTextStr]; [bindings setValue:NSSTRING_HELP_COPY_PASTE_BUG_REPORT forKey:@"copyPasteHelpText"]; [bindings setValue:NSSTRING_TITLE_GO_BUG_REPORT_WEBPAGE_TITLE forKey:@"goWebpageButtonTitle"]; } [bindings setValue:finalFormTextStr forKey:@"finalFormText"]; // Remember the current form and switch the window view. currentForm = [window contentView]; [self switchContentView:viewFinishedForm]; } - (IBAction) backForm:(id)sender { [self switchContentView:currentForm]; } - (IBAction) copyInfoToPasteboard:(id)sender { NSPasteboard *pboard = [NSPasteboard generalPasteboard]; [pboard declareTypes:[NSArray arrayWithObjects:NSStringPboardType, nil] owner:self]; [pboard setString:(NSString *)[bindings valueForKey:@"finalFormText"] forType:NSStringPboardType]; } - (IBAction) goToWebpage:(id)sender { if (currentForm == viewSupportRequest) { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_TECH_SUPPORT_SITE]]; } else { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_BUG_REPORT_SITE]]; } } - (void) switchViewByID:(TroubleshootingViewID)viewID { NSView *viewToSwitch = nil; switch (viewID) { case TROUBLESHOOTING_TECH_SUPPORT_VIEW_ID: viewToSwitch = viewSupportRequest; break; case TROUBLESHOOTING_BUG_REPORT_VIEW_ID: viewToSwitch = viewBugReport; break; default: break; } if (viewToSwitch == nil) { return; } [self clearAllText]; [self switchContentView:viewToSwitch]; } - (void) clearAllText { [bindings removeObjectForKey:@"romName"]; [bindings removeObjectForKey:@"romSerial"]; [bindings removeObjectForKey:@"supportRequestText"]; [bindings removeObjectForKey:@"bugReportObservedText"]; [bindings removeObjectForKey:@"bugReportExpectedText"]; [bindings removeObjectForKey:@"finalFormText"]; } - (void) switchContentView:(NSView *)theView { if ([window contentView] == theView) { return; } NSRect newFrame = [window frameRectForContentRect:[theView frame]]; newFrame.origin.x = [window frame].origin.x; newFrame.origin.y = [window frame].origin.y + [[window contentView] frame].size.height - [theView frame].size.height; NSView *tempView = [[NSView alloc] initWithFrame:[[window contentView] frame]]; [window setContentView:tempView]; [window setFrame:newFrame display:YES animate:YES]; [window setContentView:theView]; [tempView release]; } - (void)windowDidBecomeKey:(NSNotification *)notification { [troubleshootingWindowController setContent:bindings]; } @end desmume-0.9.11/src/cocoa/userinterface/Slot2WindowDelegate.h0000755000000000000000000001110512467662066022470 0ustar rootroot/* Copyright (C) 2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #import "preferencesWindowDelegate.h" #import "cocoa_slot2.h" @class InputHIDManager; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface Slot2WindowDelegate : NSObject #else @interface Slot2WindowDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSArrayController *deviceListController; NSTableView *deviceListTable; NSBox *deviceSettingsBox; NSPopUpButton *mpcfFileSearchMenu; PreferencesWindowDelegate *prefWindowDelegate; NSView *currentDeviceView; NSView *viewUnsupported; NSView *viewNoSelection; NSView *viewNone; NSView *viewAuto; NSView *viewCompactFlash; NSView *viewRumblePak; NSView *viewGBACartridge; NSView *viewGuitarGrip; NSView *viewMemoryExpansionPack; NSView *viewPiano; NSView *viewPaddleController; NSView *viewPassME; CocoaDSSlot2Device *selectedDevice; CocoaDSSlot2Manager *deviceManager; InputHIDManager *hidManager; NSString *autoSelectedDeviceText; NSURL *mpcfFolderURL; NSURL *mpcfDiskImageURL; NSURL *gbaCartridgeURL; NSURL *gbaSRamURL; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSArrayController *deviceListController; @property (readonly) IBOutlet NSTableView *deviceListTable; @property (readonly) IBOutlet NSBox *deviceSettingsBox; @property (readonly) IBOutlet NSPopUpButton *mpcfFileSearchMenu; @property (readonly) IBOutlet PreferencesWindowDelegate *prefWindowDelegate; @property (readonly) IBOutlet NSView *viewUnsupported; @property (readonly) IBOutlet NSView *viewNoSelection; @property (readonly) IBOutlet NSView *viewNone; @property (readonly) IBOutlet NSView *viewAuto; @property (readonly) IBOutlet NSView *viewCompactFlash; @property (readonly) IBOutlet NSView *viewRumblePak; @property (readonly) IBOutlet NSView *viewGBACartridge; @property (readonly) IBOutlet NSView *viewGuitarGrip; @property (readonly) IBOutlet NSView *viewMemoryExpansionPack; @property (readonly) IBOutlet NSView *viewPiano; @property (readonly) IBOutlet NSView *viewPaddleController; @property (readonly) IBOutlet NSView *viewPassME; @property (retain) CocoaDSSlot2Device *selectedDevice; @property (retain) CocoaDSSlot2Manager *deviceManager; @property (retain) InputHIDManager *hidManager; @property (retain) NSString *autoSelectedDeviceText; @property (retain) NSURL *mpcfFolderURL; @property (retain) NSURL *mpcfDiskImageURL; @property (assign) NSString *mpcfFolderName; @property (assign) NSString *mpcfFolderPath; @property (assign) NSString *mpcfDiskImageName; @property (assign) NSString *mpcfDiskImagePath; @property (retain) NSURL *gbaCartridgeURL; @property (assign) NSString *gbaCartridgeName; @property (assign) NSString *gbaCartridgePath; @property (retain) NSURL *gbaSRamURL; @property (assign) NSString *gbaSRamName; @property (assign) NSString *gbaSRamPath; - (IBAction) applySettings:(id)sender; - (IBAction) showInputPreferences:(id)sender; - (void) update; - (void) selectDeviceByType:(NSInteger)theType; - (void) setDeviceViewByDevice:(CocoaDSSlot2Device *)theDevice; - (void) setupUserDefaults; #pragma mark - #pragma mark Auto #pragma mark - #pragma mark Compact Flash - (IBAction) chooseMPCFPath:(id)sender; - (void) chooseMPCFPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; #pragma mark - #pragma mark GBA Cartridge - (IBAction) chooseGbaCartridgePath:(id)sender; - (void) chooseGbaCartridgePathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) chooseGbaSRamPath:(id)sender; - (void) chooseGbaSRamPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) clearSRamPath:(id)sender; - (BOOL) isGbaSRamWithCartridge; #pragma mark - #pragma mark Rumble Pak - (IBAction) testRumble:(id)sender; - (void) sendForceFeedback:(NSNotification *)aNotification; #pragma mark - #pragma mark Paddle @end desmume-0.9.11/src/cocoa/userinterface/DisplayWindowController.h0000755000000000000000000001425012467662066023507 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #import #include #import "InputManager.h" #import "cocoa_output.h" @class CocoaDSController; @class EmuControllerDelegate; class OGLVideoOutput; // Subclass NSWindow for full screen windows so that we can override some methods. @interface DisplayFullScreenWindow : NSWindow { } @end @interface DisplayView : NSView { InputManager *inputManager; OGLVideoOutput *oglv; CGFloat _displayRotation; BOOL canUseShaderBasedFilters; BOOL _useVerticalSync; OSSpinLock spinlockUseVerticalSync; OSSpinLock spinlockVideoFiltersPreferGPU; OSSpinLock spinlockOutputFilter; OSSpinLock spinlockSourceDeposterize; OSSpinLock spinlockPixelScaler; // OpenGL context NSOpenGLContext *context; CGLContextObj cglDisplayContext; } @property (retain) InputManager *inputManager; @property (readonly) BOOL canUseShaderBasedFilters; @property (assign) BOOL useVerticalSync; @property (assign) BOOL videoFiltersPreferGPU; @property (assign) BOOL sourceDeposterize; @property (assign) NSInteger outputFilter; @property (assign) NSInteger pixelScaler; - (void) drawVideoFrame; - (NSPoint) dsPointFromEvent:(NSEvent *)theEvent; - (NSPoint) convertPointToDS:(NSPoint)clickLoc; - (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; - (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed; - (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType; @end #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface DisplayWindowController : NSWindowController #else @interface DisplayWindowController : NSWindowController #endif { NSObject *dummyObject; DisplayView *view; NSView *saveScreenshotPanelAccessoryView; NSView *outputVolumeControlView; NSView *microphoneGainControlView; NSMenuItem *outputVolumeMenuItem; NSMenuItem *microphoneGainMenuItem; NSSlider *microphoneGainSlider; NSButton *microphoneMuteButton; EmuControllerDelegate *emuControl; CocoaDSDisplayVideo *cdsVideoOutput; NSScreen *assignedScreen; NSWindow *masterWindow; NSSize _normalSize; double _displayScale; double _displayRotation; NSInteger _displayMode; NSInteger _displayOrientation; NSInteger _displayOrder; double _displayGap; NSInteger screenshotFileFormat; NSSize _minDisplayViewSize; BOOL _isMinSizeNormal; NSUInteger _statusBarHeight; BOOL _isWindowResizing; OSSpinLock spinlockNormalSize; OSSpinLock spinlockScale; OSSpinLock spinlockRotation; OSSpinLock spinlockDisplayMode; OSSpinLock spinlockDisplayOrientation; OSSpinLock spinlockDisplayOrder; OSSpinLock spinlockDisplayGap; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet DisplayView *view; @property (readonly) IBOutlet NSView *saveScreenshotPanelAccessoryView; @property (readonly) IBOutlet NSView *outputVolumeControlView; @property (readonly) IBOutlet NSView *microphoneGainControlView; @property (readonly) IBOutlet NSMenuItem *outputVolumeMenuItem; @property (readonly) IBOutlet NSMenuItem *microphoneGainMenuItem; @property (readonly) IBOutlet NSSlider *microphoneGainSlider; @property (readonly) IBOutlet NSButton *microphoneMuteButton; @property (retain) EmuControllerDelegate *emuControl; @property (assign) CocoaDSDisplayVideo *cdsVideoOutput; @property (assign) NSScreen *assignedScreen; @property (retain) NSWindow *masterWindow; @property (readonly) NSSize normalSize; @property (assign) double displayScale; @property (assign) double displayRotation; @property (assign) BOOL videoFiltersPreferGPU; @property (assign) BOOL videoSourceDeposterize; @property (assign) NSInteger videoOutputFilter; @property (assign) NSInteger videoPixelScaler; @property (assign) NSInteger displayMode; @property (assign) NSInteger displayOrientation; @property (assign) NSInteger displayOrder; @property (assign) double displayGap; @property (assign) NSInteger screenshotFileFormat; @property (assign) BOOL isMinSizeNormal; @property (assign) BOOL isShowingStatusBar; - (id)initWithWindowNibName:(NSString *)windowNibName emuControlDelegate:(EmuControllerDelegate *)theEmuController; - (void) setupUserDefaults; - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees; - (double) maxScalarForContentBoundsWidth:(double)contentBoundsWidth height:(double)contentBoundsHeight; - (void) enterFullScreen; - (void) exitFullScreen; - (IBAction) copy:(id)sender; - (IBAction) changeHardwareMicGain:(id)sender; - (IBAction) changeVolume:(id)sender; - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender; - (IBAction) toggleStatusBar:(id)sender; - (IBAction) toggleFullScreenDisplay:(id)sender; - (IBAction) toggleExecutePause:(id)sender; - (IBAction) reset:(id)sender; - (IBAction) changeCoreSpeed:(id)sender; - (IBAction) openRom:(id)sender; - (IBAction) saveScreenshotAs:(id)sender; // View Menu - (IBAction) changeScale:(id)sender; - (IBAction) changeRotation:(id)sender; - (IBAction) changeRotationRelative:(id)sender; - (IBAction) changeDisplayMode:(id)sender; - (IBAction) changeDisplayOrientation:(id)sender; - (IBAction) changeDisplayOrder:(id)sender; - (IBAction) changeDisplayGap:(id)sender; - (IBAction) toggleVideoSourceDeposterize:(id)sender; - (IBAction) changeVideoOutputFilter:(id)sender; - (IBAction) changeVideoPixelScaler:(id)sender; - (IBAction) writeDefaultsDisplayRotation:(id)sender; - (IBAction) writeDefaultsDisplayGap:(id)sender; - (IBAction) writeDefaultsHUDSettings:(id)sender; - (IBAction) writeDefaultsDisplayVideoSettings:(id)sender; @end desmume-0.9.11/src/cocoa/userinterface/DisplayWindowController.mm0000755000000000000000000015710412467662066023677 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "DisplayWindowController.h" #import "EmuControllerDelegate.h" #import "InputManager.h" #import "cocoa_file.h" #import "cocoa_input.h" #import "cocoa_globals.h" #import "cocoa_videofilter.h" #import "cocoa_util.h" #ifdef MAC_OS_X_VERSION_10_7 #include "OGLDisplayOutput_3_2.h" #else #include "OGLDisplayOutput.h" #endif #include #if defined(__ppc__) || defined(__ppc64__) #include #elif !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_6) #include #else #include #endif @implementation DisplayWindowController @synthesize dummyObject; @synthesize emuControl; @synthesize cdsVideoOutput; @synthesize assignedScreen; @synthesize masterWindow; @synthesize view; @synthesize saveScreenshotPanelAccessoryView; @synthesize outputVolumeControlView; @synthesize microphoneGainControlView; @synthesize outputVolumeMenuItem; @synthesize microphoneGainMenuItem; @synthesize microphoneGainSlider; @synthesize microphoneMuteButton; @dynamic normalSize; @dynamic displayScale; @dynamic displayRotation; @dynamic videoFiltersPreferGPU; @dynamic videoSourceDeposterize; @dynamic videoOutputFilter; @dynamic videoPixelScaler; @dynamic displayMode; @dynamic displayOrientation; @dynamic displayOrder; @dynamic displayGap; @synthesize screenshotFileFormat; @dynamic isMinSizeNormal; @dynamic isShowingStatusBar; #if defined(__ppc__) || defined(__ppc64__) static std::map _screenMap; // Key = NSScreen object pointer, Value = DisplayWindowController object pointer #elif !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_6) static std::tr1::unordered_map _screenMap; // Key = NSScreen object pointer, Value = DisplayWindowController object pointer #else static std::unordered_map _screenMap; // Key = NSScreen object pointer, Value = DisplayWindowController object pointer #endif - (id)initWithWindowNibName:(NSString *)windowNibName emuControlDelegate:(EmuControllerDelegate *)theEmuController { self = [super initWithWindowNibName:windowNibName]; if (self == nil) { return self; } emuControl = [theEmuController retain]; cdsVideoOutput = nil; assignedScreen = nil; masterWindow = nil; spinlockNormalSize = OS_SPINLOCK_INIT; spinlockScale = OS_SPINLOCK_INIT; spinlockRotation = OS_SPINLOCK_INIT; spinlockDisplayMode = OS_SPINLOCK_INIT; spinlockDisplayOrientation = OS_SPINLOCK_INIT; spinlockDisplayOrder = OS_SPINLOCK_INIT; spinlockDisplayGap = OS_SPINLOCK_INIT; screenshotFileFormat = NSTIFFFileType; // These need to be initialized first since there are dependencies on these. _displayGap = 0.0; _displayMode = DS_DISPLAY_TYPE_DUAL; _displayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL; _minDisplayViewSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*_displayGap)); _isMinSizeNormal = YES; _statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; _isWindowResizing = NO; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveScreenshotAsFinish:) name:@"org.desmume.DeSmuME.requestScreenshotDidFinish" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(respondToScreenChange:) name:@"NSApplicationDidChangeScreenParametersNotification" object:NSApp]; return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [self setEmuControl:nil]; [self setAssignedScreen:nil]; [self setMasterWindow:nil]; [super dealloc]; } #pragma mark Dynamic Property Methods - (NSSize) normalSize { OSSpinLockLock(&spinlockNormalSize); const NSSize theSize = _normalSize; OSSpinLockUnlock(&spinlockNormalSize); return theSize; } - (void) setDisplayScale:(double)s { if (_isWindowResizing) { // Resize the window when displayScale changes. // No need to set the view's scale here since window resizing will implicitly change it. OSSpinLockLock(&spinlockScale); _displayScale = s; OSSpinLockUnlock(&spinlockScale); } else { const double constrainedScale = [self resizeWithTransform:[self normalSize] scalar:s rotation:[self displayRotation]]; OSSpinLockLock(&spinlockScale); _displayScale = constrainedScale; OSSpinLockUnlock(&spinlockScale); } } - (double) displayScale { OSSpinLockLock(&spinlockScale); const double s = _displayScale; OSSpinLockUnlock(&spinlockScale); return s; } - (void) setDisplayRotation:(double)angleDegrees { double newAngleDegrees = fmod(angleDegrees, 360.0); if (newAngleDegrees < 0.0) { newAngleDegrees = 360.0 + newAngleDegrees; } if (newAngleDegrees == 360.0) { newAngleDegrees = 0.0; } OSSpinLockLock(&spinlockRotation); _displayRotation = newAngleDegrees; OSSpinLockUnlock(&spinlockRotation); NSWindow *theWindow = [self window]; // Set the minimum content size for the window, since this will change based on rotation. CGSize minContentSize = GetTransformedBounds(_minDisplayViewSize.width, _minDisplayViewSize.height, 1.0, CLOCKWISE_DEGREES(newAngleDegrees)); minContentSize.height += _statusBarHeight; [theWindow setContentMinSize:NSMakeSize(minContentSize.width, minContentSize.height)]; // Resize the window. const NSSize oldBounds = [theWindow frame].size; const double constrainedScale = [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:newAngleDegrees]; const NSSize newBounds = [theWindow frame].size; OSSpinLockLock(&spinlockScale); _displayScale = constrainedScale; OSSpinLockUnlock(&spinlockScale); // If the window size didn't change, it is possible that the old and new rotation angles // are 180 degrees offset from each other. In this case, we'll need to force the // display view to update itself. if (oldBounds.width == newBounds.width && oldBounds.height == newBounds.height) { [view setNeedsDisplay:YES]; } DisplayOutputTransformData transformData = { constrainedScale, angleDegrees, 0.0, 0.0, 0.0 }; [CocoaDSUtil messageSendOneWayWithData:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_TRANSFORM_VIEW data:[NSData dataWithBytes:&transformData length:sizeof(DisplayOutputTransformData)]]; } - (double) displayRotation { OSSpinLockLock(&spinlockRotation); const double angleDegrees = _displayRotation; OSSpinLockUnlock(&spinlockRotation); return angleDegrees; } - (void) setDisplayMode:(NSInteger)displayModeID { NSSize newDisplaySize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); NSString *modeString = @"Unknown"; switch (displayModeID) { case DS_DISPLAY_TYPE_MAIN: modeString = NSSTRING_DISPLAYMODE_MAIN; break; case DS_DISPLAY_TYPE_TOUCH: modeString = NSSTRING_DISPLAYMODE_TOUCH; break; case DS_DISPLAY_TYPE_DUAL: { const double gapScalar = [self displayGap]; modeString = NSSTRING_DISPLAYMODE_DUAL; if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_VERTICAL) { newDisplaySize.height = newDisplaySize.height * 2.0 + (DS_DISPLAY_GAP * gapScalar); } else { newDisplaySize.width = newDisplaySize.width * 2.0 + (DS_DISPLAY_GAP * gapScalar); } break; } default: break; } OSSpinLockLock(&spinlockDisplayMode); _displayMode = displayModeID; OSSpinLockUnlock(&spinlockDisplayMode); OSSpinLockLock(&spinlockNormalSize); _normalSize = newDisplaySize; OSSpinLockUnlock(&spinlockNormalSize); [self setIsMinSizeNormal:[self isMinSizeNormal]]; [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_TYPE integerValue:displayModeID]; } - (NSInteger) displayMode { OSSpinLockLock(&spinlockDisplayMode); const NSInteger displayModeID = _displayMode; OSSpinLockUnlock(&spinlockDisplayMode); return displayModeID; } - (void) setDisplayOrientation:(NSInteger)theOrientation { OSSpinLockLock(&spinlockDisplayOrientation); _displayOrientation = theOrientation; OSSpinLockUnlock(&spinlockDisplayOrientation); if ([self displayMode] == DS_DISPLAY_TYPE_DUAL) { const double gapScalar = [self displayGap]; NSSize newDisplaySize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); if (theOrientation == DS_DISPLAY_ORIENTATION_VERTICAL) { newDisplaySize.height = newDisplaySize.height * 2.0 + (DS_DISPLAY_GAP * gapScalar); } else { newDisplaySize.width = newDisplaySize.width * 2.0 + (DS_DISPLAY_GAP * gapScalar); } OSSpinLockLock(&spinlockNormalSize); _normalSize = newDisplaySize; OSSpinLockUnlock(&spinlockNormalSize); [self setIsMinSizeNormal:[self isMinSizeNormal]]; [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; } [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_ORIENTATION integerValue:theOrientation]; } - (NSInteger) displayOrientation { OSSpinLockLock(&spinlockDisplayOrientation); const NSInteger theOrientation = _displayOrientation; OSSpinLockUnlock(&spinlockDisplayOrientation); return theOrientation; } - (void) setDisplayOrder:(NSInteger)theOrder { OSSpinLockLock(&spinlockDisplayOrder); _displayOrder = theOrder; OSSpinLockUnlock(&spinlockDisplayOrder); [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_ORDER integerValue:theOrder]; } - (NSInteger) displayOrder { OSSpinLockLock(&spinlockDisplayOrder); const NSInteger theOrder = _displayOrder; OSSpinLockUnlock(&spinlockDisplayOrder); return theOrder; } - (void) setDisplayGap:(double)gapScalar { OSSpinLockLock(&spinlockDisplayGap); _displayGap = gapScalar; OSSpinLockUnlock(&spinlockDisplayGap); if ([self displayMode] == DS_DISPLAY_TYPE_DUAL) { NSSize newDisplaySize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_VERTICAL) { newDisplaySize.height = newDisplaySize.height * 2.0 + (DS_DISPLAY_GAP * gapScalar); } else { newDisplaySize.width = newDisplaySize.width * 2.0 + (DS_DISPLAY_GAP * gapScalar); } OSSpinLockLock(&spinlockNormalSize); _normalSize = newDisplaySize; OSSpinLockUnlock(&spinlockNormalSize); [self setIsMinSizeNormal:[self isMinSizeNormal]]; [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; } [CocoaDSUtil messageSendOneWayWithFloat:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_GAP floatValue:(float)gapScalar]; } - (double) displayGap { OSSpinLockLock(&spinlockDisplayGap); const double gapScalar = _displayGap; OSSpinLockUnlock(&spinlockDisplayGap); return gapScalar; } - (void) setVideoFiltersPreferGPU:(BOOL)theState { [[self view] setVideoFiltersPreferGPU:theState]; [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; } - (BOOL) videoFiltersPreferGPU { return [[self view] videoFiltersPreferGPU]; } - (void) setVideoSourceDeposterize:(BOOL)theState { [[self view] setSourceDeposterize:theState]; [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; } - (BOOL) videoSourceDeposterize { return [[self view] sourceDeposterize]; } - (void) setVideoOutputFilter:(NSInteger)filterID { [[self view] setOutputFilter:filterID]; [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; } - (NSInteger) videoOutputFilter { return [[self view] outputFilter]; } - (void) setVideoPixelScaler:(NSInteger)filterID { [[self view] setPixelScaler:filterID]; [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; } - (NSInteger) videoPixelScaler { return [[self view] pixelScaler]; } - (void) setIsMinSizeNormal:(BOOL)theState { OSSpinLockLock(&spinlockDisplayGap); const double gapScalar = _displayGap; OSSpinLockUnlock(&spinlockDisplayGap); _isMinSizeNormal = theState; if ([self displayMode] == DS_DISPLAY_TYPE_DUAL) { if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_HORIZONTAL) { _minDisplayViewSize.width = GPU_DISPLAY_WIDTH*2.0 + (DS_DISPLAY_GAP*gapScalar); _minDisplayViewSize.height = GPU_DISPLAY_HEIGHT; } else { _minDisplayViewSize.width = GPU_DISPLAY_WIDTH; _minDisplayViewSize.height = GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*gapScalar); } } else { _minDisplayViewSize.width = GPU_DISPLAY_WIDTH; _minDisplayViewSize.height = GPU_DISPLAY_HEIGHT; } if (!_isMinSizeNormal) { _minDisplayViewSize.width /= 4; _minDisplayViewSize.height /= 4; } // Set the minimum content size, keeping the display rotation in mind. CGSize transformedMinSize = GetTransformedBounds(_minDisplayViewSize.width, _minDisplayViewSize.height, 1.0, CLOCKWISE_DEGREES([self displayRotation])); transformedMinSize.height += _statusBarHeight; [[self window] setContentMinSize:NSMakeSize(transformedMinSize.width, transformedMinSize.height)]; } - (BOOL) isMinSizeNormal { return _isMinSizeNormal; } - (void) setIsShowingStatusBar:(BOOL)showStatusBar { NSRect frameRect = [masterWindow frame]; if (showStatusBar) { _statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; frameRect.size.height += WINDOW_STATUS_BAR_HEIGHT; NSRect screenFrame = [[masterWindow screen] visibleFrame]; if (frameRect.size.height > screenFrame.size.height) { NSRect windowContentRect = [[masterWindow contentView] bounds]; double widthToHeightRatio = windowContentRect.size.width / windowContentRect.size.height; windowContentRect.size.height -= frameRect.size.height - screenFrame.size.height; windowContentRect.size.width = windowContentRect.size.height * widthToHeightRatio; frameRect.size.height = screenFrame.size.height; frameRect.size.width = windowContentRect.size.width; } else { frameRect.origin.y -= WINDOW_STATUS_BAR_HEIGHT; } } else { _statusBarHeight = 0; frameRect.origin.y += WINDOW_STATUS_BAR_HEIGHT; frameRect.size.height -= WINDOW_STATUS_BAR_HEIGHT; } [[NSUserDefaults standardUserDefaults] setBool:showStatusBar forKey:@"DisplayView_ShowStatusBar"]; [masterWindow setFrame:frameRect display:YES animate:NO]; } - (BOOL) isShowingStatusBar { return !(_statusBarHeight == 0); } #pragma mark Class Methods - (void) setupUserDefaults { // Set the display window per user preferences. [self setIsShowingStatusBar:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_ShowStatusBar"]]; // Set the display settings per user preferences. [self setDisplayGap:([[NSUserDefaults standardUserDefaults] doubleForKey:@"DisplayViewCombo_Gap"] / 100.0)]; [self setDisplayMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_Mode"]]; [self setDisplayOrientation:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayViewCombo_Orientation"]]; [self setDisplayOrder:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayViewCombo_Order"]]; [self setDisplayScale:([[NSUserDefaults standardUserDefaults] doubleForKey:@"DisplayView_Size"] / 100.0)]; [self setDisplayRotation:[[NSUserDefaults standardUserDefaults] doubleForKey:@"DisplayView_Rotation"]]; [self setVideoFiltersPreferGPU:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_FiltersPreferGPU"]]; [self setVideoSourceDeposterize:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_Deposterize"]]; [self setVideoOutputFilter:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_OutputFilter"]]; [self setVideoPixelScaler:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_VideoFilter"]]; [[self view] setUseVerticalSync:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseVerticalSync"]]; } - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees { if ([self assignedScreen] != nil) { return scalar; } // Convert angle to clockwise-direction degrees. angleDegrees = CLOCKWISE_DEGREES(angleDegrees); // Get the maximum scalar size within drawBounds. Constrain scalar to maxScalar if necessary. const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, angleDegrees); const double maxScalar = [self maxScalarForContentBoundsWidth:checkSize.width height:checkSize.height]; if (scalar > maxScalar) { scalar = maxScalar; } // Get the new bounds for the window's content view based on the transformed draw bounds. const CGSize transformedBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, scalar, angleDegrees); // Get the center of the content view in screen coordinates. const NSRect windowContentRect = [[masterWindow contentView] bounds]; const double translationX = (windowContentRect.size.width - transformedBounds.width) / 2.0; const double translationY = ((windowContentRect.size.height - _statusBarHeight) - transformedBounds.height) / 2.0; // Resize the window. const NSRect windowFrame = [masterWindow frame]; const NSRect newFrame = [masterWindow frameRectForContentRect:NSMakeRect(windowFrame.origin.x + translationX, windowFrame.origin.y + translationY, transformedBounds.width, transformedBounds.height + _statusBarHeight)]; [masterWindow setFrame:newFrame display:YES animate:NO]; // Return the actual scale used for the view (may be constrained). return scalar; } - (double) maxScalarForContentBoundsWidth:(double)contentBoundsWidth height:(double)contentBoundsHeight { // Determine the maximum scale based on the visible screen size (which // doesn't include the menu bar or dock). const NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; const NSRect windowFrame = [[self window] frameRectForContentRect:NSMakeRect(0.0, 0.0, contentBoundsWidth, contentBoundsHeight + _statusBarHeight)]; const NSSize visibleScreenBounds = { (screenFrame.size.width - (windowFrame.size.width - contentBoundsWidth)), (screenFrame.size.height - (windowFrame.size.height - contentBoundsHeight)) }; return GetMaxScalarInBounds(contentBoundsWidth, contentBoundsHeight, visibleScreenBounds.width, visibleScreenBounds.height); } - (void) saveScreenshotAsFinish:(NSNotification *)aNotification { NSURL *fileURL = (NSURL *)[[aNotification userInfo] valueForKey:@"fileURL"]; NSBitmapImageFileType fileType = (NSBitmapImageFileType)[(NSNumber *)[[aNotification userInfo] valueForKey:@"fileType"] integerValue]; NSImage *screenshotImage = (NSImage *)[[aNotification userInfo] valueForKey:@"screenshotImage"]; const BOOL fileSaved = [CocoaDSFile saveScreenshot:fileURL bitmapData:[[screenshotImage representations] objectAtIndex:0] fileType:fileType]; if (!fileSaved) { [CocoaDSUtil quickDialogUsingTitle:NSSTRING_ERROR_TITLE_LEGACY message:NSSTRING_ERROR_SCREENSHOT_FAILED_LEGACY]; } [emuControl restoreCoreState]; } - (void) enterFullScreen { NSScreen *targetScreen = [masterWindow screen]; // If there is a window that is already assigned to the target screen, then force the // current window to exit full screen first. if (_screenMap.find(targetScreen) != _screenMap.end()) { DisplayWindowController *currentFullScreenWindow = _screenMap[targetScreen]; [currentFullScreenWindow exitFullScreen]; } [[self window] orderOut:nil]; // Since we'll be using the screen rect to position the window, we need to set the origin // to (0,0) since creating the new full screen window requires the screen rect to be in // screen coordinates. NSRect screenRect = [targetScreen frame]; screenRect.origin.x = 0.0; screenRect.origin.y = 0.0; DisplayFullScreenWindow *newFullScreenWindow = [[[DisplayFullScreenWindow alloc] initWithContentRect:screenRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO screen:targetScreen] autorelease]; [newFullScreenWindow setHasShadow:NO]; [newFullScreenWindow setInitialFirstResponder:view]; [view setFrame:screenRect]; [[newFullScreenWindow contentView] addSubview:view]; [newFullScreenWindow setDelegate:self]; // If the target screen is the main screen (index 0), then autohide the menu bar and dock. if (targetScreen == [[NSScreen screens] objectAtIndex:0]) { SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar); } // Show the full screen window. [self setWindow:newFullScreenWindow]; [newFullScreenWindow makeKeyAndOrderFront:self]; [newFullScreenWindow display]; [self setAssignedScreen:targetScreen]; _screenMap[targetScreen] = self; } - (void) exitFullScreen { _screenMap.erase([self assignedScreen]); [self setAssignedScreen:nil]; [[self window] orderOut:nil]; // If the window is using the main screen (index 0), then restore the menu bar and dock. if ([masterWindow screen] == [[NSScreen screens] objectAtIndex:0]) { SetSystemUIMode(kUIModeNormal, 0); } [self setWindow:masterWindow]; [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; NSRect viewFrame = [[masterWindow contentView] frame]; viewFrame.size.height -= _statusBarHeight; viewFrame.origin.y = _statusBarHeight; [view setFrame:viewFrame]; [[masterWindow contentView] addSubview:view]; [masterWindow makeKeyAndOrderFront:self]; [masterWindow display]; } - (void) respondToScreenChange:(NSNotification *)aNotification { // This method only applies for displays in full screen mode. For displays in // windowed mode, we don't need to do anything. if ([self assignedScreen] == nil) { return; } NSArray *screenList = [NSScreen screens]; // If the assigned screen was disconnected, exit full screen mode. Hopefully, the // window will automatically move onto an available screen. if (![screenList containsObject:[self assignedScreen]]) { [self exitFullScreen]; } else { // There are many other reasons that a screen change would occur, but the only // other one we care about is a resolution change. Let's just assume that a // resolution change occurred and resize the full screen window. NSRect screenRect = [assignedScreen frame]; [[self window] setFrame:screenRect display:NO]; screenRect.origin.x = 0.0; screenRect.origin.y = 0.0; [view setFrame:screenRect]; } } #pragma mark IBActions - (IBAction) copy:(id)sender { [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_COPY_TO_PASTEBOARD]; } - (IBAction) changeHardwareMicGain:(id)sender { [emuControl changeHardwareMicGain:sender]; } - (IBAction) changeHardwareMicMute:(id)sender { [emuControl changeHardwareMicMute:sender]; } - (IBAction) changeVolume:(id)sender { [emuControl changeVolume:sender]; } - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender { if ([self isMinSizeNormal]) { [self setIsMinSizeNormal:NO]; } else { [self setIsMinSizeNormal:YES]; // Set the minimum content size, keeping the display rotation in mind. CGSize transformedMinSize = GetTransformedBounds(_minDisplayViewSize.width, _minDisplayViewSize.height, 1.0, CLOCKWISE_DEGREES([self displayRotation])); transformedMinSize.height += _statusBarHeight; // Resize the window if it's smaller than the minimum content size. NSRect windowContentRect = [masterWindow contentRectForFrameRect:[masterWindow frame]]; if (windowContentRect.size.width < transformedMinSize.width || windowContentRect.size.height < transformedMinSize.height) { // Prepare to resize. NSRect oldFrameRect = [masterWindow frame]; windowContentRect.size = NSMakeSize(transformedMinSize.width, transformedMinSize.height); NSRect newFrameRect = [masterWindow frameRectForContentRect:windowContentRect]; // Keep the window centered when expanding the size. newFrameRect.origin.x = oldFrameRect.origin.x - ((newFrameRect.size.width - oldFrameRect.size.width) / 2); newFrameRect.origin.y = oldFrameRect.origin.y - ((newFrameRect.size.height - oldFrameRect.size.height) / 2); // Set the window size. [masterWindow setFrame:newFrameRect display:YES animate:NO]; } } } - (IBAction) toggleStatusBar:(id)sender { [self setIsShowingStatusBar:([self isShowingStatusBar]) ? NO : YES]; } - (IBAction) toggleFullScreenDisplay:(id)sender { if ([self assignedScreen] == nil) { [self enterFullScreen]; } else { [self exitFullScreen]; } } - (IBAction) toggleExecutePause:(id)sender { [emuControl toggleExecutePause:sender]; } - (IBAction) reset:(id)sender { [emuControl reset:sender]; } - (IBAction) changeCoreSpeed:(id)sender { [emuControl changeCoreSpeed:sender]; } - (IBAction) openRom:(id)sender { [emuControl openRom:sender]; } - (IBAction) saveScreenshotAs:(id)sender { [emuControl pauseCore]; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setCanCreateDirectories:YES]; [panel setTitle:NSSTRING_TITLE_SAVE_SCREENSHOT_PANEL]; [panel setAccessoryView:saveScreenshotPanelAccessoryView]; const NSInteger buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { [view requestScreenshot:[panel URL] fileType:(NSBitmapImageFileType)[self screenshotFileFormat]]; } else { [emuControl restoreCoreState]; } } - (IBAction) changeScale:(id)sender { [self setDisplayScale:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; } - (IBAction) changeRotation:(id)sender { // Get the rotation value from the sender. if ([sender isMemberOfClass:[NSSlider class]]) { [self setDisplayRotation:[(NSSlider *)sender doubleValue]]; } else { [self setDisplayRotation:(double)[CocoaDSUtil getIBActionSenderTag:sender]]; } } - (IBAction) changeRotationRelative:(id)sender { const double angleDegrees = [self displayRotation] + (double)[CocoaDSUtil getIBActionSenderTag:sender]; [self setDisplayRotation:angleDegrees]; } - (IBAction) changeDisplayMode:(id)sender { const NSInteger newDisplayModeID = [CocoaDSUtil getIBActionSenderTag:sender]; if (newDisplayModeID == [self displayMode]) { return; } [self setDisplayMode:newDisplayModeID]; } - (IBAction) changeDisplayOrientation:(id)sender { const NSInteger newDisplayOrientation = [CocoaDSUtil getIBActionSenderTag:sender]; if (newDisplayOrientation == [self displayOrientation]) { return; } [self setDisplayOrientation:newDisplayOrientation]; } - (IBAction) changeDisplayOrder:(id)sender { [self setDisplayOrder:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeDisplayGap:(id)sender { [self setDisplayGap:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; } - (IBAction) toggleVideoSourceDeposterize:(id)sender { [self setVideoSourceDeposterize:![self videoSourceDeposterize]]; } - (IBAction) changeVideoOutputFilter:(id)sender { [self setVideoOutputFilter:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeVideoPixelScaler:(id)sender { [self setVideoPixelScaler:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) writeDefaultsDisplayRotation:(id)sender { [[NSUserDefaults standardUserDefaults] setDouble:[self displayRotation] forKey:@"DisplayView_Rotation"]; } - (IBAction) writeDefaultsDisplayGap:(id)sender { [[NSUserDefaults standardUserDefaults] setDouble:([self displayGap] * 100.0) forKey:@"DisplayViewCombo_Gap"]; } - (IBAction) writeDefaultsHUDSettings:(id)sender { // TODO: Not implemented. } - (IBAction) writeDefaultsDisplayVideoSettings:(id)sender { [[NSUserDefaults standardUserDefaults] setBool:[self videoFiltersPreferGPU] forKey:@"DisplayView_FiltersPreferGPU"]; [[NSUserDefaults standardUserDefaults] setBool:[self videoSourceDeposterize] forKey:@"DisplayView_Deposterize"]; [[NSUserDefaults standardUserDefaults] setInteger:[self videoOutputFilter] forKey:@"DisplayView_OutputFilter"]; [[NSUserDefaults standardUserDefaults] setInteger:[self videoPixelScaler] forKey:@"DisplayView_VideoFilter"]; [[NSUserDefaults standardUserDefaults] setBool:[[self view] useVerticalSync] forKey:@"DisplayView_UseVerticalSync"]; } #pragma mark NSUserInterfaceValidations Protocol - (BOOL)validateUserInterfaceItem:(id )theItem { BOOL enable = YES; const SEL theAction = [theItem action]; if (theAction == @selector(changeScale:)) { const NSInteger viewScale = (NSInteger)([self displayScale] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:(viewScale == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeRotation:)) { const NSInteger viewRotation = (NSInteger)[self displayRotation]; if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (viewRotation == 0 || viewRotation == 90 || viewRotation == 180 || viewRotation == 270) { [(NSMenuItem *)theItem setState:NSOffState]; } else { [(NSMenuItem *)theItem setState:NSOnState]; } } else { [(NSMenuItem *)theItem setState:(viewRotation == [theItem tag]) ? NSOnState : NSOffState]; } } } else if (theAction == @selector(changeDisplayMode:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([self displayMode] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayOrientation:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([self displayOrientation] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayOrder:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([self displayOrder] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayGap:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { const NSInteger gapScalar = (NSInteger)([self displayGap] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (gapScalar == 0 || gapScalar == 50 || gapScalar == 100 || gapScalar == 150 || gapScalar == 200) { [(NSMenuItem *)theItem setState:NSOffState]; } else { [(NSMenuItem *)theItem setState:NSOnState]; } } else { [(NSMenuItem *)theItem setState:(gapScalar == [theItem tag]) ? NSOnState : NSOffState]; } } } } else if (theAction == @selector(changeVideoOutputFilter:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([self videoOutputFilter] == [theItem tag]) ? NSOnState : NSOffState]; enable = ([theItem tag] == OutputFilterTypeID_NearestNeighbor || [theItem tag] == OutputFilterTypeID_Bilinear) || [[self view] canUseShaderBasedFilters]; } } else if (theAction == @selector(toggleVideoSourceDeposterize:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([self videoSourceDeposterize]) ? NSOnState : NSOffState]; enable = [[self view] canUseShaderBasedFilters]; } enable = [[self view] canUseShaderBasedFilters]; } else if (theAction == @selector(toggleVerticalSync:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([[self view] useVerticalSync]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeVideoPixelScaler:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([self videoPixelScaler] == [theItem tag]) ? NSOnState : NSOffState]; bool isSupportingCPU = false; bool isSupportingShader = false; OGLFilter::GetSupport([theItem tag], &isSupportingCPU, &isSupportingShader); enable = isSupportingCPU || (isSupportingShader && [[self view] canUseShaderBasedFilters]); } } else if (theAction == @selector(toggleStatusBar:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setTitle:([self isShowingStatusBar]) ? NSSTRING_TITLE_HIDE_STATUS_BAR : NSSTRING_TITLE_SHOW_STATUS_BAR]; } if ([self assignedScreen] != nil) { enable = NO; } } else if (theAction == @selector(toggleFullScreenDisplay:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setTitle:([self assignedScreen] != nil) ? NSSTRING_TITLE_EXIT_FULL_SCREEN : NSSTRING_TITLE_ENTER_FULL_SCREEN]; } } else if (theAction == @selector(toggleKeepMinDisplaySizeAtNormal:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setState:([self isMinSizeNormal]) ? NSOnState : NSOffState]; } if ([self assignedScreen] != nil) { enable = NO; } } else if (theAction == @selector(toggleToolbarShown:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem *)theItem setTitle:([[[self window] toolbar] isVisible]) ? NSSTRING_TITLE_HIDE_TOOLBAR : NSSTRING_TITLE_SHOW_TOOLBAR]; } } return enable; } #pragma mark NSWindowDelegate Protocol - (void)windowDidLoad { // Set up the master window that is associated with this window controller. [self setMasterWindow:[self window]]; [masterWindow setTitle:(NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]]; [masterWindow setInitialFirstResponder:view]; [view setInputManager:[emuControl inputManager]]; [[emuControl windowList] addObject:self]; [emuControl updateAllWindowTitles]; // Set up some custom UI elements. [microphoneGainMenuItem setView:microphoneGainControlView]; [outputVolumeMenuItem setView:outputVolumeControlView]; // Set up the video output thread. cdsVideoOutput = [[CocoaDSDisplayVideo alloc] init]; [cdsVideoOutput setDelegate:view]; // Add the video thread to the output list. [emuControl addOutputToCore:cdsVideoOutput]; [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:cdsVideoOutput withObject:nil]; while ([cdsVideoOutput thread] == nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } // Setup default values per user preferences. [self setupUserDefaults]; } - (void)windowDidBecomeMain:(NSNotification *)notification { [emuControl setMainWindow:self]; [emuControl updateDisplayPanelTitles]; [view setNextResponder:[self window]]; [[view inputManager] setHidInputTarget:view]; } - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize { if ([self assignedScreen] != nil) { return frameSize; } _isWindowResizing = YES; // Get a content Rect so that we can make our comparison. // This will be based on the proposed frameSize. const NSRect frameRect = NSMakeRect(0.0f, 0.0f, frameSize.width, frameSize.height); const NSRect contentRect = [sender contentRectForFrameRect:frameRect]; // Find the maximum scalar we can use for the display view, bounded by the // content Rect. const NSSize normalBounds = [self normalSize]; const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, [self displayRotation]); const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - _statusBarHeight); const double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); // Make a new content Rect with our max scalar, and convert it back to a frame Rect. const NSRect finalContentRect = NSMakeRect(0.0f, 0.0f, checkSize.width * maxS, (checkSize.height * maxS) + _statusBarHeight); const NSRect finalFrameRect = [sender frameRectForContentRect:finalContentRect]; // Set the final size based on our new frame Rect. return finalFrameRect.size; } - (void)windowDidResize:(NSNotification *)notification { if ([self assignedScreen] != nil) { return; } _isWindowResizing = YES; // Get the max scalar within the window's current content bounds. const NSSize normalBounds = [self normalSize]; const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, [self displayRotation]); NSSize contentBounds = [[[self window] contentView] bounds].size; contentBounds.height -= _statusBarHeight; const double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); // Set the display view's properties. [self setDisplayScale:maxS]; // Resize the view. NSRect newContentFrame = [[[self window] contentView] bounds]; newContentFrame.origin.y = _statusBarHeight; newContentFrame.size.height -= _statusBarHeight; [view setFrame:newContentFrame]; _isWindowResizing = NO; } - (BOOL)windowShouldClose:(id)sender { BOOL shouldClose = YES; if ([[emuControl windowList] count] > 1) // If this isn't the last window, then just close it without doing anything else. { return shouldClose; } else if ([emuControl currentRom] != nil) // If a ROM is loaded, just close the ROM, but don't close the window. { [emuControl closeRom:nil]; shouldClose = NO; } return shouldClose; } - (void)windowWillClose:(NSNotification *)notification { [emuControl removeOutputFromCore:[self cdsVideoOutput]]; [[self cdsVideoOutput] forceThreadExit]; [[self cdsVideoOutput] release]; [self setCdsVideoOutput:nil]; [[emuControl windowList] removeObject:self]; if ([[emuControl windowList] count] < 1) { if ([emuControl currentRom] != nil) { [emuControl closeRom:nil]; } [NSApp terminate:[notification object]]; return; } [emuControl updateAllWindowTitles]; [emuControl updateDisplayPanelTitles]; } - (BOOL)validateToolbarItem:(NSToolbarItem *)theItem { BOOL enable = YES; const SEL theAction = [theItem action]; if (theAction == @selector(toggleExecutePause:)) { if (![emuControl masterExecuteFlag] || [emuControl currentRom] == nil || [emuControl isUserInterfaceBlockingExecution]) { enable = NO; } if ([emuControl executionState] == CORESTATE_PAUSE) { [theItem setLabel:NSSTRING_TITLE_EXECUTE_CONTROL]; [theItem setImage:[emuControl iconExecute]]; } else { [theItem setLabel:NSSTRING_TITLE_PAUSE_CONTROL]; [theItem setImage:[emuControl iconPause]]; } } else if (theAction == @selector(reset:)) { if ([emuControl currentRom] == nil || [emuControl isUserInterfaceBlockingExecution]) { enable = NO; } } else if (theAction == @selector(changeCoreSpeed:)) { NSInteger speedScalar = (NSInteger)([emuControl speedScalar] * 100.0); if (speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [theItem setLabel:NSSTRING_TITLE_SPEED_1X]; [theItem setTag:100]; [theItem setImage:[emuControl iconSpeedNormal]]; } else { [theItem setLabel:NSSTRING_TITLE_SPEED_2X]; [theItem setTag:200]; [theItem setImage:[emuControl iconSpeedDouble]]; } } else if (theAction == @selector(openRom:)) { if ([emuControl isRomLoading] || [emuControl isShowingSaveStateDialog]) { enable = NO; } } return enable; } @end #pragma mark - @implementation DisplayView @synthesize inputManager; @synthesize canUseShaderBasedFilters; @dynamic useVerticalSync; @dynamic videoFiltersPreferGPU; @dynamic sourceDeposterize; @dynamic outputFilter; @dynamic pixelScaler; - (id)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:frameRect]; if (self == nil) { return self; } inputManager = nil; // Initialize the OpenGL context NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24, NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8, NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)0, NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, NSOpenGLPFADoubleBuffer, (NSOpenGLPixelFormatAttribute)0, (NSOpenGLPixelFormatAttribute)0, (NSOpenGLPixelFormatAttribute)0 }; #ifdef _OGLDISPLAYOUTPUT_3_2_H_ // If we can support a 3.2 Core Profile context, then request that in our // pixel format attributes. if (IsOSXVersionSupported(10, 7, 0)) { attributes[9] = NSOpenGLPFAOpenGLProfile; attributes[10] = NSOpenGLProfileVersion3_2Core; OGLInfoCreate_Func = &OGLInfoCreate_3_2; } #endif NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; if (format == nil) { // If we can't get a 3.2 Core Profile context, then switch to using a // legacy context instead. attributes[9] = (NSOpenGLPixelFormatAttribute)0; attributes[10] = (NSOpenGLPixelFormatAttribute)0; OGLInfoCreate_Func = &OGLInfoCreate_Legacy; format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; } context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil]; [format release]; cglDisplayContext = (CGLContextObj)[context CGLContextObj]; CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); oglv = new OGLVideoOutput(); oglv->InitLayers(); oglv->GetDisplayLayer()->SetFiltersPreferGPUOGL(true); oglv->GetDisplayLayer()->SetSourceDeposterize(false); oglv->GetDisplayLayer()->SetOutputFilterOGL(OutputFilterTypeID_Bilinear); oglv->GetDisplayLayer()->SetPixelScalerOGL(VideoFilterTypeID_None); CGLSetCurrentContext(prevContext); OGLDisplayLayer *displayLayer = oglv->GetDisplayLayer(); canUseShaderBasedFilters = (displayLayer->CanUseShaderBasedFilters()) ? YES : NO; _useVerticalSync = NO; spinlockUseVerticalSync = OS_SPINLOCK_INIT; spinlockVideoFiltersPreferGPU = OS_SPINLOCK_INIT; spinlockOutputFilter = OS_SPINLOCK_INIT; spinlockSourceDeposterize = OS_SPINLOCK_INIT; spinlockPixelScaler = OS_SPINLOCK_INIT; return self; } - (void)dealloc { CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); delete oglv; CGLSetCurrentContext(prevContext); [self setInputManager:nil]; [context clearDrawable]; [context release]; [super dealloc]; } #pragma mark Dynamic Property Methods - (void) setUseVerticalSync:(BOOL)theState { OSSpinLockLock(&spinlockUseVerticalSync); _useVerticalSync = theState; OSSpinLockUnlock(&spinlockUseVerticalSync); const GLint swapInt = (theState) ? 1 : 0; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); CGLSetParameter(cglDisplayContext, kCGLCPSwapInterval, &swapInt); CGLUnlockContext(cglDisplayContext); } - (BOOL) useVerticalSync { OSSpinLockLock(&spinlockUseVerticalSync); const BOOL theState = _useVerticalSync; OSSpinLockUnlock(&spinlockUseVerticalSync); return theState; } - (void) setVideoFiltersPreferGPU:(BOOL)theState { OSSpinLockLock(&spinlockVideoFiltersPreferGPU); CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); oglv->GetDisplayLayer()->SetFiltersPreferGPUOGL((theState) ? true : false); CGLUnlockContext(cglDisplayContext); OSSpinLockUnlock(&spinlockVideoFiltersPreferGPU); } - (BOOL) videoFiltersPreferGPU { OSSpinLockLock(&spinlockVideoFiltersPreferGPU); const BOOL theState = (oglv->GetDisplayLayer()->GetFiltersPreferGPU()) ? YES : NO; OSSpinLockUnlock(&spinlockVideoFiltersPreferGPU); return theState; } - (void) setSourceDeposterize:(BOOL)theState { OSSpinLockLock(&spinlockSourceDeposterize); oglv->GetDisplayLayer()->SetSourceDeposterize((theState) ? true : false); OSSpinLockUnlock(&spinlockSourceDeposterize); } - (BOOL) sourceDeposterize { OSSpinLockLock(&spinlockSourceDeposterize); const BOOL theState = (oglv->GetDisplayLayer()->GetSourceDeposterize()) ? YES : NO; OSSpinLockUnlock(&spinlockSourceDeposterize); return theState; } - (void) setOutputFilter:(NSInteger)filterID { OSSpinLockLock(&spinlockOutputFilter); CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); oglv->GetDisplayLayer()->SetOutputFilterOGL(filterID); CGLUnlockContext(cglDisplayContext); OSSpinLockUnlock(&spinlockOutputFilter); } - (NSInteger) outputFilter { OSSpinLockLock(&spinlockOutputFilter); const NSInteger filterID = oglv->GetDisplayLayer()->GetOutputFilter(); OSSpinLockUnlock(&spinlockOutputFilter); return filterID; } - (void) setPixelScaler:(NSInteger)filterID { OSSpinLockLock(&spinlockPixelScaler); CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); oglv->GetDisplayLayer()->SetPixelScalerOGL(filterID); CGLUnlockContext(cglDisplayContext); OSSpinLockUnlock(&spinlockPixelScaler); } - (NSInteger) pixelScaler { OSSpinLockLock(&spinlockPixelScaler); const NSInteger filterID = oglv->GetDisplayLayer()->GetPixelScaler(); OSSpinLockUnlock(&spinlockPixelScaler); return filterID; } #pragma mark Class Methods - (void) drawVideoFrame { oglv->RenderOGL(); CGLFlushDrawable(cglDisplayContext); } - (NSPoint) dsPointFromEvent:(NSEvent *)theEvent { // Convert the clicked location from window coordinates, to view coordinates, // and finally to DS touchscreen coordinates. NSPoint touchLoc = [theEvent locationInWindow]; touchLoc = [self convertPoint:touchLoc fromView:nil]; touchLoc = [self convertPointToDS:touchLoc]; return touchLoc; } - (NSPoint) convertPointToDS:(NSPoint)clickLoc { DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; double viewAngle = [windowController displayRotation]; if (viewAngle != 0.0) { viewAngle = CLOCKWISE_DEGREES(viewAngle); } const NSSize normalBounds = [windowController normalSize]; const NSSize viewSize = [self bounds].size; const CGSize transformBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, _displayRotation); const double s = GetMaxScalarInBounds(transformBounds.width, transformBounds.height, viewSize.width, viewSize.height); CGPoint touchLoc = GetNormalPointFromTransformedPoint(clickLoc.x, clickLoc.y, normalBounds.width, normalBounds.height, viewSize.width, viewSize.height, s, viewAngle); // Normalize the touch location to the DS. if ([windowController displayMode] == DS_DISPLAY_TYPE_DUAL) { const NSInteger theOrientation = [windowController displayOrientation]; const NSInteger theOrder = [windowController displayOrder]; const double gap = DS_DISPLAY_GAP * [windowController displayGap]; if (theOrientation == DS_DISPLAY_ORIENTATION_VERTICAL && theOrder == DS_DISPLAY_ORDER_TOUCH_FIRST) { touchLoc.y -= (GPU_DISPLAY_HEIGHT+gap); } else if (theOrientation == DS_DISPLAY_ORIENTATION_HORIZONTAL && theOrder == DS_DISPLAY_ORDER_MAIN_FIRST) { touchLoc.x -= (GPU_DISPLAY_WIDTH+gap); } } touchLoc.y = GPU_DISPLAY_HEIGHT - touchLoc.y; // Constrain the touch point to the DS dimensions. if (touchLoc.x < 0) { touchLoc.x = 0; } else if (touchLoc.x > (GPU_DISPLAY_WIDTH - 1)) { touchLoc.x = (GPU_DISPLAY_WIDTH - 1); } if (touchLoc.y < 0) { touchLoc.y = 0; } else if (touchLoc.y > (GPU_DISPLAY_HEIGHT - 1)) { touchLoc.y = (GPU_DISPLAY_HEIGHT - 1); } return NSMakePoint(touchLoc.x, touchLoc.y); } #pragma mark InputHIDManagerTarget Protocol - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue hidManager:(InputHIDManager *)hidManager { BOOL isHandled = NO; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; InputAttributesList inputList = InputManagerEncodeHIDQueue(hidQueue, [hidManager inputManager], false); NSString *newStatusText = nil; const size_t inputCount = inputList.size(); for (size_t i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = inputList[i]; if (inputAttr.isAnalog) { newStatusText = [NSString stringWithFormat:@"%s:%s (%1.2f)", inputAttr.deviceName, inputAttr.elementName, inputAttr.scalar]; break; } else if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON) { newStatusText = [NSString stringWithFormat:@"%s:%s", inputAttr.deviceName, inputAttr.elementName]; break; } } if (newStatusText != nil) { [[windowController emuControl] setStatusText:newStatusText]; } CommandAttributesList cmdList = [inputManager generateCommandListUsingInputList:&inputList]; if (cmdList.empty()) { return isHandled; } [inputManager dispatchCommandList:&cmdList]; isHandled = YES; return isHandled; } - (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed { BOOL isHandled = NO; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; const InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed); if (keyPressed && [theEvent window] != nil) { NSString *newStatusText = [NSString stringWithFormat:@"%s:%s", inputAttr.deviceName, inputAttr.elementName]; [[windowController emuControl] setStatusText:newStatusText]; } isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr]; return isHandled; } - (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed { BOOL isHandled = NO; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; const NSInteger displayModeID = [windowController displayMode]; // Convert the clicked location from window coordinates, to view coordinates, // and finally to DS touchscreen coordinates. const NSPoint touchLoc = (displayModeID == DS_DISPLAY_TYPE_MAIN) ? NSMakePoint(0.0, 0.0) : [self dsPointFromEvent:theEvent]; const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([theEvent buttonNumber], touchLoc, buttonPressed); if (buttonPressed && [theEvent window] != nil) { NSString *newStatusText = (displayModeID == DS_DISPLAY_TYPE_MAIN) ? [NSString stringWithFormat:@"%s:%s", inputAttr.deviceName, inputAttr.elementName] : [NSString stringWithFormat:@"%s:%s X:%i Y:%i", inputAttr.deviceName, inputAttr.elementName, (int)inputAttr.intCoordX, (int)inputAttr.intCoordY]; [[windowController emuControl] setStatusText:newStatusText]; } isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr]; return isHandled; } - (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType { NSString *fileURLString = [fileURL absoluteString]; NSData *fileURLStringData = [fileURLString dataUsingEncoding:NSUTF8StringEncoding]; NSData *bitmapImageFileTypeData = [[NSData alloc] initWithBytes:&fileType length:sizeof(NSBitmapImageFileType)]; NSArray *messageComponents = [[NSArray alloc] initWithObjects:fileURLStringData, bitmapImageFileTypeData, nil]; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWayWithMessageComponents:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REQUEST_SCREENSHOT array:messageComponents]; [bitmapImageFileTypeData release]; [messageComponents release]; } #pragma mark NSView Methods - (BOOL)isOpaque { return YES; } - (void)lockFocus { [super lockFocus]; if ([context view] != self) { [context setView:self]; } } - (void)drawRect:(NSRect)dirtyRect { DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REDRAW_VIEW]; } - (void)setFrame:(NSRect)rect { NSRect oldFrame = [self frame]; [super setFrame:rect]; if (rect.size.width != oldFrame.size.width || rect.size.height != oldFrame.size.height) { [context update]; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWayWithRect:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RESIZE_VIEW rect:rect]; } } #pragma mark NSResponder Methods - (void)keyDown:(NSEvent *)theEvent { BOOL isHandled = [self handleKeyPress:theEvent keyPressed:YES]; if (!isHandled) { [super keyDown:theEvent]; } } - (void)keyUp:(NSEvent *)theEvent { BOOL isHandled = [self handleKeyPress:theEvent keyPressed:NO]; if (!isHandled) { [super keyUp:theEvent]; } } - (void)mouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:YES]; if (!isHandled) { [super mouseDown:theEvent]; } } - (void)mouseDragged:(NSEvent *)theEvent { [self mouseDown:theEvent]; } - (void)mouseUp:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:NO]; if (!isHandled) { [super mouseUp:theEvent]; } } - (void)rightMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:YES]; if (!isHandled) { [super rightMouseDown:theEvent]; } } - (void)rightMouseDragged:(NSEvent *)theEvent { [self rightMouseDown:theEvent]; } - (void)rightMouseUp:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:NO]; if (!isHandled) { [super rightMouseUp:theEvent]; } } - (void)otherMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:YES]; if (!isHandled) { [super otherMouseDown:theEvent]; } } - (void)otherMouseDragged:(NSEvent *)theEvent { [self otherMouseDown:theEvent]; } - (void)otherMouseUp:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:NO]; if (!isHandled) { [super otherMouseUp:theEvent]; } } - (BOOL)acceptsFirstResponder { return YES; } - (BOOL)becomeFirstResponder { return YES; } - (BOOL)resignFirstResponder { return YES; } #pragma mark CocoaDSDisplayVideoDelegate Protocol - (void)doInitVideoOutput:(NSDictionary *)properties { // No init needed, so do nothing. } - (void)doLoadVideoFrame:(const void *)videoFrameData displayMode:(const NSInteger)frameDisplayMode width:(const NSInteger)frameWidth height:(const NSInteger)frameHeight { const GLint lineOffset = (frameDisplayMode == DS_DISPLAY_TYPE_TOUCH) ? frameHeight : 0; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); oglv->GetDisplayLayer()->LoadFrameOGL((uint16_t *)videoFrameData, 0, lineOffset, frameWidth, frameHeight); CGLUnlockContext(cglDisplayContext); } - (void)doProcessVideoFrame { CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); oglv->ProcessOGL(); [self drawVideoFrame]; CGLUnlockContext(cglDisplayContext); } - (void)doResizeView:(NSRect)rect { const GLsizei w = (GLsizei)rect.size.width; const GLsizei h = (GLsizei)rect.size.height; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); oglv->SetViewportSizeOGL(w, h); [self drawVideoFrame]; CGLUnlockContext(cglDisplayContext); } - (void)doTransformView:(const DisplayOutputTransformData *)transformData { _displayRotation = (GLfloat)transformData->rotation; OGLDisplayLayer *display = oglv->GetDisplayLayer(); display->SetRotation((GLfloat)transformData->rotation); [self doRedraw]; } - (void)doRedraw { CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self drawVideoFrame]; CGLUnlockContext(cglDisplayContext); } - (void)doDisplayModeChanged:(NSInteger)displayModeID { OGLDisplayLayer *display = oglv->GetDisplayLayer(); display->SetMode(displayModeID); [self doRedraw]; } - (void)doDisplayOrientationChanged:(NSInteger)displayOrientationID { OGLDisplayLayer *display = oglv->GetDisplayLayer(); display->SetOrientation(displayOrientationID); if (display->GetMode() == DS_DISPLAY_TYPE_DUAL) { [self doRedraw]; } } - (void)doDisplayOrderChanged:(NSInteger)displayOrderID { OGLDisplayLayer *display = oglv->GetDisplayLayer(); display->SetOrder(displayOrderID); if (display->GetMode() == DS_DISPLAY_TYPE_DUAL) { [self doRedraw]; } } - (void)doDisplayGapChanged:(float)displayGapScalar { OGLDisplayLayer *display = oglv->GetDisplayLayer(); display->SetGapScalar((GLfloat)displayGapScalar); if (display->GetMode() == DS_DISPLAY_TYPE_DUAL) { [self doRedraw]; } } @end #pragma mark - @implementation DisplayFullScreenWindow #pragma mark NSWindow Methods - (BOOL)canBecomeKeyWindow { return YES; } - (BOOL)canBecomeMainWindow { return YES; } @end desmume-0.9.11/src/cocoa/userinterface/Slot2WindowDelegate.mm0000755000000000000000000004555512467662066022672 0ustar rootroot/* Copyright (C) 2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "Slot2WindowDelegate.h" #import "InputManager.h" #import "preferencesWindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_util.h" @implementation Slot2WindowDelegate @synthesize dummyObject; @synthesize window; @synthesize deviceListController; @synthesize deviceListTable; @synthesize deviceSettingsBox; @synthesize mpcfFileSearchMenu; @synthesize prefWindowDelegate; @synthesize viewUnsupported; @synthesize viewNoSelection; @synthesize viewNone; @synthesize viewAuto; @synthesize viewCompactFlash; @synthesize viewRumblePak; @synthesize viewGBACartridge; @synthesize viewGuitarGrip; @synthesize viewMemoryExpansionPack; @synthesize viewPiano; @synthesize viewPaddleController; @synthesize viewPassME; @synthesize selectedDevice; @synthesize deviceManager; @synthesize hidManager; @synthesize autoSelectedDeviceText; @dynamic mpcfFolderURL; @dynamic mpcfDiskImageURL; @dynamic mpcfFolderName; @dynamic mpcfFolderPath; @dynamic mpcfDiskImageName; @dynamic mpcfDiskImagePath; @dynamic gbaCartridgeURL; @dynamic gbaCartridgeName; @dynamic gbaCartridgePath; @synthesize gbaSRamURL; - (id)init { self = [super init]; if(self == nil) { return nil; } deviceManager = [[[[CocoaDSSlot2Manager alloc] init] retain] autorelease]; hidManager = nil; currentDeviceView = viewNoSelection; autoSelectedDeviceText = @""; mpcfFolderURL = nil; mpcfDiskImageURL = nil; gbaCartridgeURL = nil; gbaSRamURL = nil; // This needs to respond to force feedback notifications. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sendForceFeedback:) name:@"org.desmume.DeSmuME.sendForceFeedback" object:nil]; return self; } - (void)dealloc { [self setDeviceManager:nil]; [self setHidManager:nil]; [self setMpcfFolderURL:nil]; [self setMpcfDiskImageURL:nil]; [self setGbaCartridgeURL:nil]; [self setGbaSRamURL:nil]; [super dealloc]; } - (IBAction) applySettings:(id)sender { CocoaDSSlot2Device *theDevice = [self selectedDevice]; const NDS_SLOT2_TYPE selectedDeviceType = (theDevice != nil) ? [theDevice type] : NDS_SLOT2_NONE; if (selectedDeviceType == NDS_SLOT2_CFLASH) { NSURL *theURL = nil; NSInteger mpcfPathOption = [[NSUserDefaults standardUserDefaults] integerForKey:@"Slot2_MPCF_PathOption"]; switch (mpcfPathOption) { case MPCF_OPTION_LOAD_WITH_ROM: theURL = nil; break; case MPCF_OPTION_LOAD_DIRECTORY: theURL = [self mpcfFolderURL]; break; case MPCF_OPTION_LOAD_DISK_IMAGE: theURL = [self mpcfDiskImageURL]; break; default: break; } [deviceManager setMpcfFileSearchURL:theURL]; } else if (selectedDeviceType == NDS_SLOT2_GBACART) { [deviceManager setGbaCartridgeURL:[self gbaCartridgeURL]]; [deviceManager setGbaSRamURL:[self gbaSRamURL]]; } [[self deviceManager] setCurrentDevice:theDevice]; [[NSUserDefaults standardUserDefaults] setInteger:[theDevice type] forKey:@"Slot2_LoadedDevice"]; } - (IBAction) showInputPreferences:(id)sender { [[prefWindowDelegate toolbar] setSelectedItemIdentifier:@"Input"]; [prefWindowDelegate changePrefView:sender]; [[prefWindowDelegate window] makeKeyAndOrderFront:sender]; } - (void) update { [deviceManager updateDeviceList]; [deviceListController setContent:[deviceManager deviceList]]; [deviceListController setSelectedObjects:[NSArray arrayWithObject:[deviceManager currentDevice]]]; } - (void) selectDeviceByType:(NSInteger)theType { CocoaDSSlot2Device *theDevice = [[self deviceManager] findDeviceByType:(NDS_SLOT2_TYPE)theType]; if (theDevice != nil) { [deviceListController setSelectedObjects:[NSArray arrayWithObject:theDevice]]; } } - (void) setDeviceViewByDevice:(CocoaDSSlot2Device *)theDevice { NSView *newView = viewNoSelection; const BOOL isDeviceEnabled = [theDevice enabled]; const NDS_SLOT2_TYPE deviceType = [theDevice type]; if (currentDeviceView == nil) { currentDeviceView = viewNoSelection; } if (isDeviceEnabled) { switch (deviceType) { case NDS_SLOT2_NONE: newView = viewNone; break; case NDS_SLOT2_AUTO: newView = viewAuto; break; case NDS_SLOT2_CFLASH: newView = viewCompactFlash; break; case NDS_SLOT2_RUMBLEPAK: newView = viewRumblePak; break; case NDS_SLOT2_GBACART: newView = viewGBACartridge; break; case NDS_SLOT2_GUITARGRIP: newView = viewGuitarGrip; break; case NDS_SLOT2_EXPMEMORY: newView = viewMemoryExpansionPack; break; case NDS_SLOT2_EASYPIANO: newView = viewPiano; break; case NDS_SLOT2_PADDLE: newView = viewPaddleController; break; case NDS_SLOT2_PASSME: newView = viewPassME; break; default: break; } } else { newView = viewUnsupported; } if (newView != nil) { NSRect frameRect = [currentDeviceView frame]; [currentDeviceView retain]; [deviceSettingsBox replaceSubview:currentDeviceView with:newView]; currentDeviceView = newView; [currentDeviceView setFrame:frameRect]; } } - (void) setupUserDefaults { [self setMpcfFolderURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_MPCF_DirectoryPath"]]]; [self setMpcfDiskImageURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_MPCF_DiskImagePath"]]]; [self setGbaCartridgeURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_GBA_CartridgePath"]]]; [self setGbaSRamURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_GBA_SRAMPath"]]]; [self selectDeviceByType:[[NSUserDefaults standardUserDefaults] integerForKey:@"Slot2_LoadedDevice"]]; [self applySettings:nil]; } #pragma mark - #pragma mark Auto #pragma mark - #pragma mark Compact Flash - (void) setMpcfFolderURL:(NSURL *)theURL { [mpcfFolderURL release]; mpcfFolderURL = [theURL retain]; NSString *thePath = [mpcfFolderURL path]; [self setMpcfFolderPath:thePath]; [self setMpcfFolderName:[thePath lastPathComponent]]; } - (NSURL *) mpcfFolderURL { return mpcfFolderURL; } - (void) setMpcfFolderName:(NSString *)theName { // Do nothing. This is for KVO-compliance only. } - (NSString *) mpcfFolderName { NSString *folderPath = [self mpcfFolderPath]; return (folderPath != nil) ? [folderPath lastPathComponent] : NSSTRING_STATUS_NO_FOLDER_CHOSEN; } - (void) setMpcfFolderPath:(NSString *)thePath { // Do nothing. This is for KVO-compliance only. } - (NSString *) mpcfFolderPath { return (mpcfFolderURL != nil) ? [mpcfFolderURL path] : nil; } - (void) setMpcfDiskImageURL:(NSURL *)theURL { [mpcfDiskImageURL release]; mpcfDiskImageURL = [theURL retain]; NSString *thePath = [mpcfDiskImageURL path]; [self setMpcfDiskImagePath:thePath]; [self setMpcfDiskImageName:[thePath lastPathComponent]]; } - (NSURL *) mpcfDiskImageURL { return mpcfDiskImageURL; } - (void) setMpcfDiskImageName:(NSString *)theName { // Do nothing. This is for KVO-compliance only. } - (NSString *) mpcfDiskImageName { NSString *diskImagePath = [self mpcfDiskImagePath]; return (diskImagePath != nil) ? [diskImagePath lastPathComponent] : NSSTRING_STATUS_NO_DISK_IMAGE_CHOSEN; } - (void) setMpcfDiskImagePath:(NSString *)thePath { // Do nothing. This is for KVO-compliance only. } - (NSString *) mpcfDiskImagePath { return (mpcfDiskImageURL != nil) ? [mpcfDiskImageURL path] : nil; } - (IBAction) chooseMPCFPath:(id)sender { const NSInteger mpcfOptionTag = [CocoaDSUtil getIBActionSenderTag:sender]; if (mpcfOptionTag == MPCF_OPTION_LOAD_WITH_ROM) { [[NSUserDefaults standardUserDefaults] setInteger:mpcfOptionTag forKey:@"Slot2_MPCF_PathOption"]; return; } NSOpenPanel *panel = [NSOpenPanel openPanel]; NSArray *fileTypes = nil; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DIRECTORY) { [panel setTitle:NSSTRING_TITLE_SELECT_MPCF_FOLDER_PANEL]; [panel setCanChooseDirectories:YES]; [panel setCanChooseFiles:NO]; } else if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DISK_IMAGE) { [panel setTitle:NSSTRING_TITLE_SELECT_MPCF_DISK_IMAGE_PANEL]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; fileTypes = [NSArray arrayWithObjects:@"dmg", @"img", nil]; } else { return; } NSNumber *mpcfOptionNumber = [[NSNumber numberWithInteger:mpcfOptionTag] retain]; // Released in chooseMPCFPathDidEnd:returnCode:contextInfo: // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseMPCFPathDidEnd:panel returnCode:result contextInfo:mpcfOptionNumber]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseMPCFPathDidEnd:returnCode:contextInfo:) contextInfo:mpcfOptionNumber]; #endif } - (void) chooseMPCFPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { const NSInteger prevMpcfOption = [[NSUserDefaults standardUserDefaults] integerForKey:@"Slot2_MPCF_PathOption"]; const NSInteger mpcfOptionTag = [(NSNumber *)contextInfo integerValue]; [(NSNumber *)contextInfo release]; // Retained in chooseMPCFPath: [sheet orderOut:self]; // Temporarily set the MPCF path option in user defaults to some neutral value first and synchronize. // When the user defaults are actually set later, this will force the proper state transitions to occur. [[NSUserDefaults standardUserDefaults] setInteger:mpcfOptionTag forKey:@"Slot2_MPCF_PathOption"]; [[NSUserDefaults standardUserDefaults] synchronize]; if (returnCode == NSCancelButton) { [[NSUserDefaults standardUserDefaults] setInteger:prevMpcfOption forKey:@"Slot2_MPCF_PathOption"]; return; } NSURL *selectedURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedURL == nil) { [[NSUserDefaults standardUserDefaults] setInteger:prevMpcfOption forKey:@"Slot2_MPCF_PathOption"]; return; } if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DIRECTORY) { [self setMpcfFolderURL:selectedURL]; [[NSUserDefaults standardUserDefaults] setObject:[selectedURL path] forKey:@"Slot2_MPCF_DirectoryPath"]; [[NSUserDefaults standardUserDefaults] setInteger:MPCF_OPTION_LOAD_DIRECTORY forKey:@"Slot2_MPCF_PathOption"]; } else if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DISK_IMAGE) { [self setMpcfDiskImageURL:selectedURL]; [[NSUserDefaults standardUserDefaults] setObject:[selectedURL path] forKey:@"Slot2_MPCF_DiskImagePath"]; [[NSUserDefaults standardUserDefaults] setInteger:MPCF_OPTION_LOAD_DISK_IMAGE forKey:@"Slot2_MPCF_PathOption"]; } } #pragma mark - #pragma mark GBA Cartridge - (void) setGbaCartridgeURL:(NSURL *)theURL { [gbaCartridgeURL release]; gbaCartridgeURL = [theURL retain]; NSString *thePath = [gbaCartridgeURL path]; [self setGbaCartridgePath:thePath]; [self setGbaCartridgeName:[thePath lastPathComponent]]; } - (NSURL *) gbaCartridgeURL { return gbaCartridgeURL; } - (void) setGbaCartridgeName:(NSString *)theName { // Do nothing. This is for KVO-compliance only. } - (NSString *) gbaCartridgeName { NSString *gbaCartPath = [self gbaCartridgePath]; return (gbaCartPath != nil) ? [gbaCartPath lastPathComponent] : NSSTRING_STATUS_NO_GBA_CART_CHOSEN; } - (void) setGbaCartridgePath:(NSString *)thePath { // Do nothing. This is for KVO-compliance only. } - (NSString *) gbaCartridgePath { return (gbaCartridgeURL != nil) ? [gbaCartridgeURL path] : nil; } - (void) setGbaSRamURL:(NSURL *)theURL { [gbaSRamURL release]; gbaSRamURL = [theURL retain]; NSString *thePath = [gbaSRamURL path]; [self setGbaSRamPath:thePath]; [self setGbaSRamName:[thePath lastPathComponent]]; } - (NSURL *) gbaSRamURL { return gbaSRamURL; } - (void) setGbaSRamName:(NSString *)theName { // Do nothing. This is for KVO-compliance only. } - (NSString *) gbaSRamName { NSString *sramPath = [self gbaSRamPath]; return (sramPath != nil) ? [sramPath lastPathComponent] : NSSTRING_STATUS_NO_GBA_SRAM_CHOSEN; } - (void) setGbaSRamPath:(NSString *)thePath { // Do nothing. This is for KVO-compliance only. } - (NSString *) gbaSRamPath { return (gbaSRamURL != nil) ? [gbaSRamURL path] : nil; } - (IBAction) chooseGbaCartridgePath:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_CHOOSE_GBA_CARTRIDGE_PANEL]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_GBA_ROM, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseGbaCartridgePathDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseGbaCartridgePathDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseGbaCartridgePathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectURL == nil) { return; } [self setGbaCartridgeURL:selectURL]; [[NSUserDefaults standardUserDefaults] setObject:[selectURL path] forKey:@"Slot2_GBA_CartridgePath"]; if ([self isGbaSRamWithCartridge]) { NSString *sramPath = [NSString stringWithFormat:@"%@.%s", [[selectURL path] stringByDeletingPathExtension], FILE_EXT_GBA_SRAM]; [self setGbaSRamURL:[NSURL fileURLWithPath:sramPath]]; [[NSUserDefaults standardUserDefaults] setObject:sramPath forKey:@"Slot2_GBA_SRAMPath"]; } else { [self clearSRamPath:self]; } } - (IBAction) chooseGbaSRamPath:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_CHOOSE_GBA_SRAM_PANEL]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_GBA_SRAM, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseGbaSRamPathDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseGbaSRamPathDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseGbaSRamPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectURL == nil) { return; } [self setGbaSRamURL:selectURL]; [[NSUserDefaults standardUserDefaults] setObject:[selectURL path] forKey:@"Slot2_GBA_SRAMPath"]; } - (IBAction) clearSRamPath:(id)sender { [self setGbaSRamURL:nil]; [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"Slot2_GBA_SRAMPath"]; } - (BOOL) isGbaSRamWithCartridge { BOOL result = NO; NSString *gbaCartPath = [self gbaCartridgePath]; if (gbaCartPath == nil) { return result; } NSString *sramPath = [NSString stringWithFormat:@"%@.%s", [gbaCartPath stringByDeletingPathExtension], FILE_EXT_GBA_SRAM]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager isReadableFileAtPath:sramPath]; [fileManager release]; return result; } #pragma mark - #pragma mark Rumble Pak - (IBAction) testRumble:(id)sender { NSDictionary *ffProperties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], @"ffState", [NSNumber numberWithInteger:RUMBLE_ITERATIONS_TEST], @"iterations", nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"org.desmume.DeSmuME.sendForceFeedback" object:nil userInfo:ffProperties]; } - (void) sendForceFeedback:(NSNotification *)aNotification { if ([self hidManager] == nil) { return; } NSDictionary *ffProperties = (NSDictionary *)[aNotification userInfo]; const BOOL ffState = [(NSNumber *)[ffProperties valueForKey:@"ffState"] boolValue]; const UInt32 iterations = [(NSNumber *)[ffProperties valueForKey:@"iterations"] unsignedIntValue]; NSMutableArray *inputDeviceList = [[[self hidManager] deviceListController] arrangedObjects]; for (InputHIDDevice *inputDevice in inputDeviceList) { if ([inputDevice isForceFeedbackEnabled]) { if (ffState) { [inputDevice startForceFeedbackAndIterate:iterations flags:0]; } else { [inputDevice stopForceFeedback]; } } } } #pragma mark - #pragma mark Paddle #pragma mark - #pragma mark NSTableViewDelegate Protocol - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { NSTableView *table = (NSTableView *)[aNotification object]; NSInteger rowIndex = [table selectedRow]; if (rowIndex >= 0) { CocoaDSSlot2Device *theDevice = nil; NSArray *selectedObjects = [deviceListController selectedObjects]; if ([selectedObjects count] > 0) { theDevice = (CocoaDSSlot2Device *)[selectedObjects objectAtIndex:0]; [self setSelectedDevice:theDevice]; } [self setDeviceViewByDevice:theDevice]; } else { NSRect frameRect = [currentDeviceView frame]; [currentDeviceView retain]; [deviceSettingsBox replaceSubview:currentDeviceView with:viewNoSelection]; currentDeviceView = viewNoSelection; [currentDeviceView setFrame:frameRect]; } } @end desmume-0.9.11/src/cocoa/userinterface/FileMigrationDelegate.h0000755000000000000000000000330412467662066023030 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface FileMigrationDelegate : NSObject #else @interface FileMigrationDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSOutlineView *fileTreeOutlineView; NSArray *_versionList; NSMutableDictionary *_portStringsDict; NSMutableDictionary *_fileTree; NSMutableDictionary *_fileTreeSelection; NSMutableArray *_fileTreeVersionList; BOOL filesPresent; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSOutlineView *fileTreeOutlineView; @property (assign) BOOL filesPresent; - (void) updateFileList; - (void) setFileSelectionInOutlineView:(NSOutlineView *)outlineView file:(NSMutableDictionary *)fileItem isSelected:(BOOL)isSelected; - (void) moveSelectedFilesToCurrent; - (void) copySelectedFilesToCurrent; - (IBAction) updateAndShowWindow:(id)sender; - (IBAction) handleChoice:(id)sender; @end desmume-0.9.11/src/cocoa/userinterface/RomInfoPanel.mm0000755000000000000000000001416012467662066021361 0ustar rootroot/* Copyright (C) 2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "RomInfoPanel.h" #import "cocoa_util.h" @implementation RomInfoPanelSectionView @synthesize disclosureButton; @synthesize sectionLabel; @dynamic isExpanded; @synthesize expandedHeight; @synthesize collapsedHeight; @synthesize contentHeight; - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self == nil) { return self; } expandedHeight = frame.size.height; collapsedHeight = ROMINFO_PANEL_SECTION_HEADER_HEIGHT; contentHeight = expandedHeight - collapsedHeight; return self; } - (void) setIsExpanded:(BOOL)theState { [disclosureButton setState:(theState) ? NSOnState : NSOffState]; NSRect newFrame = [self frame]; newFrame.size.height = (theState) ? expandedHeight : collapsedHeight; [self setFrame:newFrame]; } - (BOOL) isExpanded { return ([disclosureButton state] == NSOnState); } - (NSString *) stringFromSectionLabel { if (sectionLabel != nil) { return [sectionLabel stringValue]; } return @""; } @end @implementation RomInfoContentView // Override this method here to prevent all forms of horizontal scrolling. // This even includes scrolling by means of gestures. - (NSRect)adjustScroll:(NSRect)proposedVisibleRect { proposedVisibleRect.origin.x = 0.0f; return proposedVisibleRect; } @end @implementation RomInfoPanel @synthesize generalSectionView; @synthesize titlesSectionView; @synthesize armBinariesSectionView; @synthesize fileSystemSectionView; @synthesize miscSectionView; - (id)init { self = [super init]; if(self == nil) { return nil; } _sectionViewList = nil; _panelMaxSize.width = 1.0f; _panelMaxSize.height = 1.0f; _mainViewMaxSize.width = 1.0f; _mainViewMaxSize.height = 1.0f; return self; } - (void)dealloc { [_sectionViewList release]; [super dealloc]; } - (IBAction) toggleViewState:(id)sender { NSButton *disclosureTriangle = (NSButton *)sender; RomInfoPanelSectionView *sv = (RomInfoPanelSectionView *)[disclosureTriangle superview]; const BOOL isSectionExpanded = [CocoaDSUtil getIBActionSenderButtonStateBool:disclosureTriangle]; [sv setIsExpanded:isSectionExpanded]; [self autoLayout]; } // Since we want to maintain backwards compatibility with OS X v10.5, we need to roll our // own custom autolayout method. - (void) autoLayout { // Calculate the heights of the superviews. NSSize newMainViewSize = _mainViewMaxSize; NSSize newPanelMaxSize = _panelMaxSize; for (RomInfoPanelSectionView *sv in _sectionViewList) { const BOOL isExpanded = [sv isExpanded]; const CGFloat svContentHeight = [sv contentHeight]; newMainViewSize.height -= ((isExpanded) ? 0.0f : svContentHeight); newPanelMaxSize.height -= ((isExpanded) ? 0.0f : svContentHeight); } // Set the superview heights. NSView *mainView = [[_sectionViewList objectAtIndex:0] superview]; [mainView setFrameSize:newMainViewSize]; [self setContentMaxSize:newPanelMaxSize]; // Place all of the views in their final locations by enumerating through each section // view and stacking them on top of one another. This requires that the enumeration is // done in a specific order, so we'll enumerate manually in this case. CGFloat originY = 0.0f; // Keeps track of the current origin location as we enumerate through each section view. for (size_t j = 0; j < [_sectionViewList count]; j++) { RomInfoPanelSectionView *sv = (RomInfoPanelSectionView *)[_sectionViewList objectAtIndex:j]; NSPoint svOrigin = [sv frame].origin; svOrigin.y = originY; [sv setFrameOrigin:svOrigin]; originY += [sv frame].size.height; } // If the panel is currently larger than the new max size, automatically reduce its size // to match the new max size. CGFloat heightDiff = [[self contentView] frame].size.height - [self contentMaxSize].height; if (heightDiff > 0.0f) { NSRect newFrameRect = [self frame]; newFrameRect.size.height -= heightDiff; newFrameRect.origin.y += heightDiff; [self setFrame:newFrameRect display:YES animate:NO]; } } - (void) setupUserDefaults { // Add each section view to this list as they would appear in the panel // from bottom to top order. _sectionViewList = [[NSArray alloc] initWithObjects: miscSectionView, fileSystemSectionView, armBinariesSectionView, titlesSectionView, generalSectionView, nil]; NSView *mainView = [[_sectionViewList objectAtIndex:0] superview]; _panelMaxSize = [self contentMaxSize]; _mainViewMaxSize = [mainView frame].size; // Toggle each view state per user preferences. NSDictionary *viewStatesDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"RomInfoPanel_SectionViewState"]; if (viewStatesDict != nil) { for (RomInfoPanelSectionView *sv in _sectionViewList) { NSNumber *theStateObj = (NSNumber *)[viewStatesDict objectForKey:[sv stringFromSectionLabel]]; [sv setIsExpanded:(theStateObj != nil) ? [theStateObj boolValue] : YES]; } } else { for (RomInfoPanelSectionView *sv in _sectionViewList) { [sv setIsExpanded:YES]; } } // Perform an autolayout to reflect possible changes to the panel states. [self autoLayout]; } - (void) writeDefaults { NSMutableDictionary *viewStatesDict = [NSMutableDictionary dictionaryWithCapacity:[_sectionViewList count]]; for (RomInfoPanelSectionView *sv in _sectionViewList) { [viewStatesDict setObject:[NSNumber numberWithBool:[sv isExpanded]] forKey:[sv stringFromSectionLabel]]; } [[NSUserDefaults standardUserDefaults] setObject:viewStatesDict forKey:@"RomInfoPanel_SectionViewState"]; } #pragma mark NSPanel Methods - (BOOL)becomesKeyOnlyIfNeeded { return YES; } @end desmume-0.9.11/src/cocoa/userinterface/appDelegate.h0000755000000000000000000000662712467662066021072 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import @class InputPrefsView; @class InputManager; @class FileMigrationDelegate; @class RomInfoPanel; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface AppDelegate : NSObject #else @interface AppDelegate : NSObject #endif { NSObject *dummyObject; NSObjectController *aboutWindowController; NSObjectController *emuControlController; NSObjectController *cdsSoundController; NSObjectController *romInfoPanelController; NSObjectController *prefWindowController; NSObjectController *cheatWindowController; NSObjectController *cdsCoreController; NSArrayController *inputDeviceListController; FileMigrationDelegate *migrationDelegate; InputManager *inputManager; RomInfoPanel *romInfoPanel; NSWindow *prefWindow; NSWindow *troubleshootingWindow; NSWindow *cheatListWindow; NSWindow *slot2Window; NSView *prefGeneralView; InputPrefsView *inputPrefsView; NSMenu *mLoadStateSlot; NSMenu *mSaveStateSlot; BOOL isAppRunningOnIntel; BOOL isDeveloperPlusBuild; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSObjectController *aboutWindowController; @property (readonly) IBOutlet NSObjectController *emuControlController; @property (readonly) IBOutlet NSObjectController *cdsSoundController; @property (readonly) IBOutlet NSObjectController *romInfoPanelController; @property (readonly) IBOutlet NSObjectController *prefWindowController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSArrayController *inputDeviceListController; @property (readonly) IBOutlet FileMigrationDelegate *migrationDelegate; @property (readonly) IBOutlet InputManager *inputManager; @property (readonly) IBOutlet NSWindow *prefWindow; @property (readonly) IBOutlet NSWindow *troubleshootingWindow; @property (readonly) IBOutlet NSWindow *cheatListWindow; @property (readonly) IBOutlet NSWindow *slot2Window; @property (readonly) IBOutlet NSView *prefGeneralView; @property (readonly) IBOutlet NSMenu *mLoadStateSlot; @property (readonly) IBOutlet NSMenu *mSaveStateSlot; @property (readonly) IBOutlet InputPrefsView *inputPrefsView; @property (readonly) IBOutlet RomInfoPanel *romInfoPanel; @property (assign) BOOL isAppRunningOnIntel; @property (assign) BOOL isDeveloperPlusBuild; - (IBAction) launchWebsite:(id)sender; - (IBAction) launchForums:(id)sender; - (IBAction) supportRequest:(id)sender; - (IBAction) bugReport:(id)sender; - (void) setupSlotMenuItems; - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber; - (void) setupUserDefaults; - (void) restoreDisplayWindowStates; - (void) saveDisplayWindowStates; @end desmume-0.9.11/src/cocoa/userinterface/InputProfileController.h0000755000000000000000000000240112467662066023325 0ustar rootroot/* Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #import "InputManager.h" #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface InputProfileController : NSObjectController #else @interface InputProfileController : NSObjectController #endif { NSObject *dummyObject; InputManager *inputManager; NSOutlineView *profileOutlineView; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet InputManager *inputManager; @property (readonly) IBOutlet NSOutlineView *profileOutlineView; - (NSString *) commandTagFromInputList:(NSArray *)inputList; @end desmume-0.9.11/src/cocoa/userinterface/InputManager.h0000755000000000000000000002663512467662066021252 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #include #include #if defined(__ppc__) || defined(__ppc64__) #include #elif !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_6) #include #else #include #endif #include #include #include "../audiosamplegenerator.h" #define INPUT_HANDLER_STRING_LENGTH 256 enum InputAttributeState { INPUT_ATTRIBUTE_STATE_OFF = 0, INPUT_ATTRIBUTE_STATE_ON, INPUT_ATTRIBUTE_STATE_MIXED }; @class EmuControllerDelegate; @class InputManager; @class InputHIDManager; @protocol InputHIDManagerTarget @required - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue hidManager:(InputHIDManager *)hidManager; @end typedef struct { char deviceName[INPUT_HANDLER_STRING_LENGTH]; char deviceCode[INPUT_HANDLER_STRING_LENGTH]; char elementName[INPUT_HANDLER_STRING_LENGTH]; char elementCode[INPUT_HANDLER_STRING_LENGTH]; bool isAnalog; // This is an analog input, as opposed to being a digital input. InputAttributeState state; // The input state that is sent on command dispatch int32_t intCoordX; // The X-coordinate as an int for commands that require a location int32_t intCoordY; // The Y-coordinate as an int for commands that require a location float floatCoordX; // The X-coordinate as a float for commands that require a location float floatCoordY; // The Y-coordinate as a float for commands that require a location float scalar; // A scalar value for commands that require a scalar id sender; // An object for commands that require an object } InputAttributes; typedef struct { char tag[INPUT_HANDLER_STRING_LENGTH]; // A string identifier for these attributes SEL selector; // The selector that is called on command dispatch int32_t intValue[4]; // Context dependent int values float floatValue[4]; // Context dependent float values id object[4]; // Context dependent objects bool useInputForIntCoord; // The command will prefer the input device's int coordinate bool useInputForFloatCoord; // The command will prefer the input device's float coordinate bool useInputForScalar; // The command will prefer the input device's scalar bool useInputForSender; // The command will prefer the input device's sender InputAttributes input; // The input device's attributes bool allowAnalogInput; // Flag for allowing a command to accept analog inputs } CommandAttributes; typedef std::vector InputAttributesList; typedef std::vector CommandAttributesList; #if defined(__ppc__) || defined(__ppc64__) typedef std::map InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes typedef std::map CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes typedef std::map CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector typedef std::map AudioFileSampleGeneratorMap; // Key = File path to audio file, Value = AudioSampleBlockGenerator #elif !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_6) typedef std::tr1::unordered_map InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes typedef std::tr1::unordered_map CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes typedef std::tr1::unordered_map CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector typedef std::tr1::unordered_map AudioFileSampleGeneratorMap; // Key = File path to audio file, Value = AudioSampleBlockGenerator #else typedef std::unordered_map InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes typedef std::unordered_map CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes typedef std::unordered_map CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector typedef std::unordered_map AudioFileSampleGeneratorMap; // Key = File path to audio file, Value = AudioSampleBlockGenerator #endif #pragma mark - @interface InputHIDDevice : NSObject { InputHIDManager *hidManager; IOHIDDeviceRef hidDeviceRef; IOHIDQueueRef hidQueueRef; NSString *identifier; io_service_t ioService; FFDeviceObjectReference ffDevice; FFEffectObjectReference ffEffect; BOOL supportsForceFeedback; BOOL isForceFeedbackEnabled; NSRunLoop *runLoop; OSSpinLock spinlockRunLoop; } @property (retain) InputHIDManager *hidManager; @property (readonly) IOHIDDeviceRef hidDeviceRef; @property (readonly) NSString *manufacturerName; @property (readonly) NSString *productName; @property (readonly) NSString *serialNumber; @property (readonly) NSString *identifier; @property (readonly) BOOL supportsForceFeedback; @property (assign) BOOL isForceFeedbackEnabled; @property (retain) NSRunLoop *runLoop; - (id) initWithDevice:(IOHIDDeviceRef)theDevice hidManager:(InputHIDManager *)theHIDManager; - (void) setPropertiesUsingDictionary:(NSDictionary *)theProperties; - (NSDictionary *) propertiesDictionary; - (void) writeDefaults; - (void) start; - (void) stop; - (void) startForceFeedbackAndIterate:(UInt32)iterations flags:(UInt32)ffFlags; - (void) stopForceFeedback; @end bool InputElementCodeFromHIDElement(const IOHIDElementRef hidElementRef, char *charBuffer); bool InputElementNameFromHIDElement(const IOHIDElementRef hidElementRef, char *charBuffer); bool InputDeviceCodeFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer); bool InputDeviceNameFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer); InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef); InputAttributesList InputListFromHIDValue(IOHIDValueRef hidValueRef, InputManager *inputManager, bool forceDigitalInput); size_t ClearHIDQueue(const IOHIDQueueRef hidQueue); void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void *inSender); #pragma mark - @interface InputHIDManager : NSObject { InputManager *inputManager; IOHIDManagerRef hidManagerRef; NSRunLoop *runLoop; NSArrayController *deviceListController; id target; OSSpinLock spinlockRunLoop; } @property (retain) NSArrayController *deviceListController; @property (retain) InputManager *inputManager; @property (readonly) IOHIDManagerRef hidManagerRef; @property (assign) id target; @property (retain) NSRunLoop *runLoop; - (id) initWithInputManager:(InputManager *)theInputManager; @end void HandleDeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef); void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef); #pragma mark - @interface InputManager : NSObject { EmuControllerDelegate *emuControl; id hidInputTarget; InputHIDManager *hidManager; NSMutableDictionary *inputMappings; NSArray *commandTagList; NSDictionary *commandIcon; InputCommandMap commandMap; CommandAttributesMap defaultCommandAttributes; CommandSelectorMap commandSelector; AudioFileSampleGeneratorMap audioFileGenerators; } @property (readonly) IBOutlet EmuControllerDelegate *emuControl; @property (retain) id hidInputTarget; @property (readonly) InputHIDManager *hidManager; @property (readonly) NSMutableDictionary *inputMappings; @property (readonly) NSArray *commandTagList; @property (readonly) NSDictionary *commandIcon; - (void) setMappingsWithMappings:(NSDictionary *)mappings; - (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceDict commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingForIBAction:(const SEL)theSelector commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandAttributes:(const CommandAttributes *)cmdAttr; - (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; - (void) removeAllMappingsForCommandTag:(const char *)commandTag; - (CommandAttributesList) generateCommandListUsingInputList:(const InputAttributesList *)inputList; - (void) dispatchCommandList:(const CommandAttributesList *)cmdList; - (BOOL) dispatchCommandUsingInputAttributes:(const InputAttributes *)inputAttr; - (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector sender:(id)sender; - (void) writeDefaultsInputMappings; - (NSString *) commandTagFromInputList:(NSArray *)inputList; - (SEL) selectorOfCommandTag:(const char *)commandTag; - (CommandAttributes) defaultCommandAttributesForCommandTag:(const char *)commandTag; - (CommandAttributes) mappedCommandAttributesOfDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; - (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; - (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag; - (OSStatus) loadAudioFileUsingPath:(NSString *)filePath; - (AudioSampleBlockGenerator *) audioFileGeneratorFromFilePath:(NSString *)filePath; - (void) updateAudioFileGenerators; CommandAttributes NewDefaultCommandAttributes(const char *commandTag); CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector); CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID, const bool supportTurbo); void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo); NSMutableDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr, NSString *deviceCode, NSString *deviceName, NSString *elementCode, NSString *elementName); InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue, InputManager *inputManager, bool forceDigitalInput); InputAttributes InputManagerEncodeKeyboardInput(const unsigned short keyCode, BOOL keyPressed); InputAttributes InputManagerEncodeMouseButtonInput(const NSInteger buttonNumber, const NSPoint touchLoc, BOOL buttonPressed); InputAttributes InputManagerEncodeIBAction(const SEL theSelector, id sender); @end desmume-0.9.11/src/cocoa/userinterface/cheatWindowDelegate.mm0000755000000000000000000003476312467662066022752 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cheatWindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_cheat.h" #import "cocoa_util.h" @implementation CheatWindowDelegate @dynamic dummyObject; @synthesize window; @synthesize cheatConfigBox; @synthesize cheatSearchView; @synthesize cheatListTable; @synthesize cheatSearchListTable; @synthesize cheatListController; @synthesize cheatSearchListController; @synthesize cheatDatabaseController; @synthesize cheatWindowController; @synthesize cheatSelectedItemController; @synthesize viewConfigureNoSelection; @synthesize viewConfigureInternalCheat; @synthesize viewConfigureActionReplayCheat; @synthesize viewConfigureCodeBreakerCheat; @synthesize viewSearchNoSelection; @synthesize viewSearchExactValue; @synthesize viewSearchComparativeStart; @synthesize viewSearchComparativeContinue; @synthesize searchField; @synthesize cheatDatabaseSheet; @synthesize untitledCount; @synthesize bindings; @synthesize cdsCheats; @synthesize cdsCheatSearch; @synthesize workingCheat; - (id)init { self = [super init]; if(self == nil) { return nil; } bindings = [[NSMutableDictionary alloc] init]; if (bindings == nil) { [self release]; self = nil; return self; } cdsCheatSearch = [[CocoaDSCheatSearch alloc] init]; if (cdsCheatSearch == nil) { [bindings release]; [self release]; self = nil; return self; } workingCheat = nil; currentView = nil; currentSearchStyleView = nil; untitledCount = 0; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasSelection"]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasItems"]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isSearchStarted"]; [bindings setValue:[NSNumber numberWithInteger:CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE] forKey:@"cheatSearchStyle"]; [bindings setValue:[NSNumber numberWithInteger:CHEATSEARCH_UNSIGNED] forKey:@"cheatSearchSignType"]; [bindings setValue:@"Search not started." forKey:@"cheatSearchAddressCount"]; if ([CocoaDSCheatItem iconInternalCheat] == nil || [CocoaDSCheatItem iconActionReplay] == nil || [CocoaDSCheatItem iconCodeBreaker] == nil) { [CocoaDSCheatItem setIconInternalCheat:[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AppIcon_DeSmuME" ofType:@"icns"]]]; [CocoaDSCheatItem setIconActionReplay:[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ActionReplay_128x128" ofType:@"png"]]]; [CocoaDSCheatItem setIconCodeBreaker:[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_CodeBreaker_128x128" ofType:@"png"]]]; } return self; } - (void)dealloc { self.workingCheat = nil; self.cdsCheats = nil; [cdsCheatSearch release]; [bindings release]; [super dealloc]; } - (IBAction) addToList:(id)sender { if (self.cdsCheats == nil) { return; } NSString *untitledString = nil; self.untitledCount++; if (self.untitledCount > 1) { untitledString = [NSString stringWithFormat:@"Untitled %ld", (unsigned long)self.untitledCount]; } else { untitledString = @"Untitled"; } CocoaDSCheatItem *newCheatItem = [[[CocoaDSCheatItem alloc] init] autorelease]; newCheatItem.cheatType = CHEAT_TYPE_INTERNAL; newCheatItem.description = untitledString; [cheatListController addObject:newCheatItem]; [self.cdsCheats add:newCheatItem]; [self.cdsCheats save]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasItems"]; } - (IBAction) removeFromList:(id)sender { NSMutableArray *cheatList = (NSMutableArray *)[cheatListController content]; if (cdsCheats == nil || cheatList == nil) { return; } NSUInteger selectionIndex = [cheatListController selectionIndex]; if (selectionIndex == NSNotFound) { return; } NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:selectionIndex]; NSArray *selectedObjects = [cheatListController selectedObjects]; CocoaDSCheatItem *selectedCheat = (CocoaDSCheatItem *)[selectedObjects objectAtIndex:0]; [self.cdsCheats remove:selectedCheat]; [cheatListController removeObject:selectedCheat]; [self.cdsCheats save]; [cheatListTable deselectAll:sender]; NSUInteger cheatCount = [cheatList count]; if (cheatCount > 0) { if (selectionIndex >= cheatCount) { selectionIndex--; indexSet = [NSIndexSet indexSetWithIndex:selectionIndex]; } [cheatListTable selectRowIndexes:indexSet byExtendingSelection:NO]; } else { [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasItems"]; } } - (IBAction) viewDatabase:(id)sender { [NSApp beginSheet:cheatDatabaseSheet modalForWindow:window modalDelegate:self didEndSelector:@selector(didEndCheatDatabaseSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) setInternalCheatValue:(id)sender { // Force end of editing of any text fields. [window makeFirstResponder:nil]; [self.cdsCheats applyInternalCheat:self.workingCheat]; } - (IBAction) applyConfiguration:(id)sender { if (self.workingCheat == nil) { return; } // Force end of editing of any text fields. [window makeFirstResponder:nil]; [self.workingCheat mergeToParent]; BOOL result = [self.cdsCheats update:self.workingCheat.parent]; if (result) { [self.cdsCheats save]; } else { // TODO: Display an error sheet saying that the cheat applying failed. } } - (IBAction) selectCheatType:(id)sender { NSInteger cheatTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; CocoaDSCheatItem *cheatItem = [cheatSelectedItemController content]; cheatItem.cheatType = cheatTypeID; [self setCheatConfigViewByType:cheatTypeID]; } - (IBAction) selectCheatSearchStyle:(id)sender { NSInteger searchStyle = [CocoaDSUtil getIBActionSenderTag:sender]; [self.bindings setValue:[NSNumber numberWithInteger:searchStyle] forKey:@"cheatSearchStyle"]; [self setCheatSearchViewByStyle:searchStyle]; } - (IBAction) runExactValueSearch:(id)sender { if (self.workingCheat == nil) { return; } [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isSearchStarted"]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isRunningSearch"]; NSInteger value = [searchField integerValue]; UInt8 byteSize = self.workingCheat.bytes; NSInteger signType = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchSignType"] integerValue]; NSUInteger addressCount = [cdsCheatSearch runExactValueSearch:value byteSize:byteSize signType:signType]; [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; [cheatSearchListController setContent:cdsCheatSearch.addressList]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; } - (IBAction) runComparativeSearch:(id)sender { if (self.workingCheat == nil) { return; } [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isSearchStarted"]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isRunningSearch"]; if (cdsCheatSearch.searchCount == 0) { [bindings setValue:@"Running initial search..." forKey:@"cheatSearchAddressCount"]; [window displayIfNeeded]; } NSInteger compSearchTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; UInt8 byteSize = self.workingCheat.bytes; NSInteger signType = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchSignType"] integerValue]; NSUInteger addressCount = [cdsCheatSearch runComparativeSearch:compSearchTypeID byteSize:byteSize signType:signType]; [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; [cheatSearchListController setContent:cdsCheatSearch.addressList]; NSInteger searchStyle = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]; if (searchStyle == CHEATSEARCH_SEARCHSTYLE_COMPARATIVE && cdsCheatSearch.searchCount == 1) { [self setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_COMPARATIVE]; [bindings setValue:@"Search started!" forKey:@"cheatSearchAddressCount"]; } [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; } - (void) searchDidFinish:(NSNotification *)aNotification { CocoaDSCheatSearch *searcher = [aNotification object]; NSInteger addressCount = 0; if (searcher != nil) { addressCount = searcher.addressList.count; [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; [cheatSearchListController setContent:searcher.addressList]; NSInteger searchStyle = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]; if (searchStyle == CHEATSEARCH_SEARCHSTYLE_COMPARATIVE && searcher.searchCount == 1) { [self setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_COMPARATIVE]; [bindings setValue:@"Search started!" forKey:@"cheatSearchAddressCount"]; } } [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; } - (IBAction) resetSearch:(id)sender { [cheatSearchListController setContent:nil]; [cdsCheatSearch reset]; [self.bindings setValue:nil forKey:@"cheatSearchSearchValue"]; [self.bindings setValue:@"Search not started." forKey:@"cheatSearchAddressCount"]; [self setCheatSearchViewByStyle:[(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isSearchStarted"]; } - (void) setCheatConfigViewByType:(NSInteger)cheatTypeID { NSView *newView = nil; if (currentView == nil) { currentView = viewConfigureNoSelection; } switch (cheatTypeID) { case CHEAT_TYPE_INTERNAL: newView = viewConfigureInternalCheat; break; case CHEAT_TYPE_ACTION_REPLAY: newView = viewConfigureActionReplayCheat; break; case CHEAT_TYPE_CODE_BREAKER: newView = viewConfigureCodeBreakerCheat; break; default: break; } if (newView != nil) { NSRect frameRect = [currentView frame]; [currentView retain]; [cheatConfigBox replaceSubview:currentView with:newView]; currentView = newView; [currentView setFrame:frameRect]; } } - (void) setCheatSearchViewByStyle:(NSInteger)searchStyleID { NSView *newView = nil; if (currentSearchStyleView == nil) { currentSearchStyleView = viewSearchNoSelection; } switch (searchStyleID) { case CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE: newView = viewSearchExactValue; break; case CHEATSEARCH_SEARCHSTYLE_COMPARATIVE: if (cdsCheatSearch.searchCount == 0) { newView = viewSearchComparativeStart; } else { newView = viewSearchComparativeContinue; } break; default: break; } if (newView != nil) { NSRect frameRect = [currentSearchStyleView frame]; [currentSearchStyleView retain]; [cheatSearchView replaceSubview:currentSearchStyleView with:newView]; currentSearchStyleView = newView; [currentSearchStyleView setFrame:frameRect]; } } - (IBAction) selectAllCheatsInDatabase:(id)sender { NSMutableArray *dbList = [cheatDatabaseController content]; if (dbList == nil) { return; } for (CocoaDSCheatItem *cheatItem in dbList) { cheatItem.willAdd = YES; } } - (IBAction) selectNoneCheatsInDatabase:(id)sender { NSMutableArray *dbList = [cheatDatabaseController content]; if (dbList == nil) { return; } for (CocoaDSCheatItem *cheatItem in dbList) { cheatItem.willAdd = NO; } } - (void) addSelectedFromCheatDatabase { NSMutableArray *dbList = [cheatDatabaseController content]; if (dbList == nil) { return; } for (CocoaDSCheatItem *cheatItem in dbList) { if (cheatItem.willAdd) { CocoaDSCheatItem *newCheatItem = [[[CocoaDSCheatItem alloc] initWithCheatData:cheatItem.data] autorelease]; [newCheatItem retainData]; [cheatListController addObject:newCheatItem]; [self.cdsCheats add:newCheatItem]; } } if ([dbList count] > 0) { [self.cdsCheats save]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasItems"]; } } - (IBAction) closeCheatDatabaseSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; NSInteger code = [(NSControl *)sender tag]; [NSApp endSheet:sheet returnCode:code]; } - (void) didEndCheatDatabaseSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; switch (returnCode) { case NSCancelButton: return; break; case NSOKButton: [self addSelectedFromCheatDatabase]; break; default: break; } } - (void)windowDidBecomeKey:(NSNotification *)notification { [cheatWindowController setContent:self.bindings]; } - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { NSTableView *table = (NSTableView *)[aNotification object]; NSInteger rowIndex = [table selectedRow]; if (table == self.cheatListTable) { if (rowIndex >= 0) { NSArray *selectedObjects = [cheatListController selectedObjects]; CocoaDSCheatItem *selectedCheat = [selectedObjects objectAtIndex:0]; self.workingCheat = [selectedCheat createWorkingCopy]; [cheatSelectedItemController setContent:self.workingCheat]; [self setCheatConfigViewByType:selectedCheat.cheatType]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasSelection"]; } else { if (self.workingCheat != nil) { [self.workingCheat.parent destroyWorkingCopy]; } [cheatSelectedItemController setContent:nil]; self.workingCheat = nil; NSRect frameRect = [currentView frame]; [currentView retain]; [cheatConfigBox replaceSubview:currentView with:viewConfigureNoSelection]; currentView = viewConfigureNoSelection; [currentView setFrame:frameRect]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasSelection"]; } } else if (table == self.cheatSearchListTable) { if (rowIndex >= 0) { NSArray *selectedObjects = [cheatSearchListController selectedObjects]; NSMutableDictionary *selectedAddress = [selectedObjects objectAtIndex:0]; NSString *addressString = [(NSString *)[selectedAddress valueForKey:@"addressString"] substringFromIndex:4]; if (self.workingCheat != nil) { self.workingCheat.memAddressSixDigitString = addressString; } } } } @end desmume-0.9.11/src/cocoa/userinterface/EmuControllerDelegate.mm0000755000000000000000000022146512467662066023265 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "EmuControllerDelegate.h" #import "DisplayWindowController.h" #import "InputManager.h" #import "cheatWindowDelegate.h" #import "Slot2WindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_cheat.h" #import "cocoa_core.h" #import "cocoa_file.h" #import "cocoa_firmware.h" #import "cocoa_GPU.h" #import "cocoa_input.h" #import "cocoa_output.h" #import "cocoa_rom.h" #import "cocoa_slot2.h" @implementation EmuControllerDelegate @synthesize inputManager; @synthesize currentRom; @dynamic cdsFirmware; @dynamic cdsSpeaker; @synthesize cdsCheats; @synthesize cheatWindowDelegate; @synthesize firmwarePanelController; @synthesize romInfoPanelController; @synthesize cdsCoreController; @synthesize cdsSoundController; @synthesize cheatWindowController; @synthesize cheatListController; @synthesize cheatDatabaseController; @synthesize slot2WindowController; @synthesize displayRotationPanel; @synthesize displaySeparationPanel; @synthesize displayVideoSettingsPanel; @synthesize executionControlWindow; @synthesize slot1ManagerWindow; @synthesize saveFileMigrationSheet; @synthesize saveStatePrecloseSheet; @synthesize exportRomSavePanelAccessoryView; @synthesize iconExecute; @synthesize iconPause; @synthesize iconSpeedNormal; @synthesize iconSpeedDouble; @dynamic masterExecuteFlag; @dynamic executionState; @synthesize lastSetSpeedScalar; @dynamic speedScalar; @synthesize isWorking; @synthesize isRomLoading; @synthesize statusText; @synthesize isSoftwareMicActive; @synthesize isHardwareMicAvailable; @synthesize isHardwareMicIdle; @synthesize isHardwareMicInClip; @synthesize currentMicGainValue; @dynamic currentVolumeValue; @synthesize currentMicStatusIcon; @synthesize currentVolumeIcon; @synthesize isShowingSaveStateDialog; @synthesize isShowingFileMigrationDialog; @synthesize isUserInterfaceBlockingExecution; @synthesize currentSaveStateURL; @synthesize selectedExportRomSaveID; @synthesize selectedRomSaveTypeID; @synthesize frameJumpType; @synthesize frameJumpFramesForward; @synthesize frameJumpToFrame; @synthesize mainWindow; @synthesize windowList; -(id)init { self = [super init]; if(self == nil) { return nil; } spinlockFirmware = OS_SPINLOCK_INIT; spinlockSpeaker = OS_SPINLOCK_INIT; mainWindow = nil; windowList = [[NSMutableArray alloc] initWithCapacity:32]; displayRotationPanelTitle = nil; displaySeparationPanelTitle = nil; displayVideoSettingsPanelTitle = nil; currentRom = nil; cdsFirmware = nil; cdsSpeaker = nil; dummyCheatList = nil; isSaveStateEdited = NO; isShowingSaveStateDialog = NO; isShowingFileMigrationDialog = NO; isUserInterfaceBlockingExecution = NO; currentSaveStateURL = nil; selectedRomSaveTypeID = ROMSAVETYPE_AUTOMATIC; selectedExportRomSaveID = 0; frameJumpType = FRAMEJUMP_TYPE_FORWARD; frameJumpFramesForward = 60; frameJumpToFrame = 0; lastSetSpeedScalar = 1.0f; isSoftwareMicActive = NO; isHardwareMicAvailable = NO; isHardwareMicIdle = YES; isHardwareMicInClip = NO; currentMicGainValue = 0.0f; isSoundMuted = NO; lastSetVolumeValue = MAX_VOLUME; iconExecute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]]; iconPause = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]]; iconSpeedNormal = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed1x_420x420" ofType:@"png"]]; iconSpeedDouble = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed2x_420x420" ofType:@"png"]]; iconMicDisabled = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneBlack_256x256" ofType:@"png"]]; iconMicIdle = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneDarkGreen_256x256" ofType:@"png"]]; iconMicActive = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneGreen_256x256" ofType:@"png"]]; iconMicInClip = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneRed_256x256" ofType:@"png"]]; iconMicManualOverride = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneGray_256x256" ofType:@"png"]]; iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]]; iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]]; iconVolumeMute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]]; isWorking = NO; isRomLoading = NO; statusText = NSSTRING_STATUS_READY; currentVolumeValue = MAX_VOLUME; currentMicStatusIcon = [iconMicDisabled retain]; currentVolumeIcon = [iconVolumeFull retain]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadRomDidFinish:) name:@"org.desmume.DeSmuME.loadRomDidFinish" object:nil]; return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [iconExecute release]; [iconPause release]; [iconSpeedNormal release]; [iconSpeedDouble release]; [iconMicDisabled release]; [iconMicIdle release]; [iconMicActive release]; [iconMicInClip release]; [iconMicManualOverride release]; [iconVolumeFull release]; [iconVolumeTwoThird release]; [iconVolumeOneThird release]; [iconVolumeMute release]; [[self currentRom] release]; [self setCurrentRom:nil]; [self setCdsCheats:nil]; [self setCdsSpeaker:nil]; [self setIsWorking:NO]; [self setStatusText:@""]; [self setCurrentVolumeValue:0.0f]; [self setCurrentVolumeIcon:nil]; [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [cdsSoundController setContent:nil]; [firmwarePanelController setContent:nil]; [self setMainWindow:nil]; [windowList release]; [super dealloc]; } #pragma mark Dynamic Property Methods - (void) setCdsFirmware:(CocoaDSFirmware *)theFirmware { OSSpinLockLock(&spinlockFirmware); if (theFirmware == cdsFirmware) { OSSpinLockUnlock(&spinlockFirmware); return; } if (theFirmware != nil) { [theFirmware retain]; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCdsFirmware:theFirmware]; [firmwarePanelController setContent:theFirmware]; [cdsFirmware release]; cdsFirmware = theFirmware; OSSpinLockUnlock(&spinlockFirmware); } - (CocoaDSFirmware *) cdsFirmware { OSSpinLockLock(&spinlockFirmware); CocoaDSFirmware *theFirmware = cdsFirmware; OSSpinLockUnlock(&spinlockFirmware); return theFirmware; } - (void) setCdsSpeaker:(CocoaDSSpeaker *)theSpeaker { OSSpinLockLock(&spinlockSpeaker); if (theSpeaker == cdsSpeaker) { OSSpinLockUnlock(&spinlockSpeaker); return; } if (theSpeaker != nil) { [theSpeaker retain]; } [cdsSoundController setContent:[theSpeaker property]]; [cdsSpeaker release]; cdsSpeaker = theSpeaker; OSSpinLockUnlock(&spinlockSpeaker); } - (CocoaDSSpeaker *) cdsSpeaker { OSSpinLockLock(&spinlockSpeaker); CocoaDSSpeaker *theSpeaker = cdsSpeaker; OSSpinLockUnlock(&spinlockSpeaker); return theSpeaker; } - (BOOL) masterExecuteFlag { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore masterExecute]; } - (NSInteger) executionState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore coreState]; } - (CGFloat) speedScalar { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore speedScalar]; } - (void) setCurrentVolumeValue:(float)vol { currentVolumeValue = vol; // Update the icon. NSImage *currentImage = [self currentVolumeIcon]; NSImage *newImage = nil; if (vol <= 0.0f) { newImage = iconVolumeMute; } else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) { newImage = iconVolumeOneThird; isSoundMuted = NO; lastSetVolumeValue = vol; } else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) { newImage = iconVolumeTwoThird; isSoundMuted = NO; lastSetVolumeValue = vol; } else { newImage = iconVolumeFull; isSoundMuted = NO; lastSetVolumeValue = vol; } if (newImage != currentImage) { [self setCurrentVolumeIcon:newImage]; } } - (float) currentVolumeValue { return currentVolumeValue; } #pragma mark IBActions - (IBAction) newDisplayWindow:(id)sender { DisplayWindowController *newWindowController = [[DisplayWindowController alloc] initWithWindowNibName:@"DisplayWindow" emuControlDelegate:self]; [CocoaDSUtil messageSendOneWay:[[newWindowController cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; [[newWindowController window] makeKeyAndOrderFront:self]; [[newWindowController window] makeMainWindow]; } - (IBAction) openRom:(id)sender { if ([self isRomLoading]) { return; } NSURL *selectedFile = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_OPEN_ROM_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } [self handleLoadRomByURL:selectedFile]; } } - (IBAction) loadRecentRom:(id)sender { // Dummy selector, used for UI validation only. } - (IBAction) closeRom:(id)sender { [self handleUnloadRom:REASONFORCLOSE_NORMAL romToLoad:nil]; } - (IBAction) revealRomInFinder:(id)sender { NSURL *romURL = [[self currentRom] fileURL]; if (romURL != nil) { [[NSWorkspace sharedWorkspace] selectFile:[romURL path] inFileViewerRootedAtPath:@""]; } } - (IBAction) revealGameDataFolderInFinder:(id)sender { NSURL *folderURL = [CocoaDSFile userAppSupportURL:nil version:nil]; [[NSWorkspace sharedWorkspace] selectFile:[folderURL path] inFileViewerRootedAtPath:@""]; } - (IBAction) openEmuSaveState:(id)sender { NSURL *selectedFile = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_OPEN_STATE_FILE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_SAVE_STATE, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } } else { return; } [self pauseCore]; const BOOL isStateLoaded = [CocoaDSFile loadState:selectedFile]; if (!isStateLoaded) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; [self restoreCoreState]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_LOADED]; [self restoreCoreState]; [self setCurrentSaveStateURL:selectedFile]; } - (IBAction) saveEmuSaveState:(id)sender { if (isSaveStateEdited && [self currentSaveStateURL] != nil) { [self pauseCore]; const BOOL isStateSaved = [CocoaDSFile saveState:[self currentSaveStateURL]]; if (!isStateSaved) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVED]; [self restoreCoreState]; } else { [self saveEmuSaveStateAs:sender]; } } - (IBAction) saveEmuSaveStateAs:(id)sender { NSSavePanel *panel = [NSSavePanel savePanel]; [panel setCanCreateDirectories:YES]; [panel setTitle:NSSTRING_TITLE_SAVE_STATE_FILE_PANEL]; // The NSSavePanel method -(void)setRequiredFileType: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_SAVE_STATE, nil]; [panel setAllowedFileTypes:fileTypes]; #else [panel setRequiredFileType:@FILE_EXT_SAVE_STATE]; #endif const NSInteger buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { NSURL *saveFileURL = [panel URL]; [self pauseCore]; const BOOL isStateSaved = [CocoaDSFile saveState:saveFileURL]; if (!isStateSaved) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVED]; [self restoreCoreState]; [self setCurrentSaveStateURL:saveFileURL]; } } - (IBAction) revertEmuSaveState:(id)sender { if (!isSaveStateEdited || [self currentSaveStateURL] == nil) { return; } [self pauseCore]; const BOOL isStateLoaded = [CocoaDSFile loadState:[self currentSaveStateURL]]; if (!isStateLoaded) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_REVERTING_FAILED]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_REVERTED]; [self restoreCoreState]; } - (IBAction) loadEmuSaveStateSlot:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) saveEmuSaveStateSlot:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) openReplay:(id)sender { NSURL *selectedFile = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:@"Load Replay"]; NSArray *fileTypes = [NSArray arrayWithObjects:@"dsm", nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } [self pauseCore]; const BOOL isMovieLoaded = [CocoaDSFile loadReplay:selectedFile]; [self setStatusText:(isMovieLoaded) ? @"Replay loaded successfully." : @"Replay loading failed!"]; [self restoreCoreState]; } } - (IBAction) recordReplay:(id)sender { NSSavePanel *panel = [NSSavePanel savePanel]; [panel setCanCreateDirectories:YES]; [panel setTitle:@"Record Replay"]; // The NSSavePanel method -(void)setRequiredFileType: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 NSArray *fileTypes = [NSArray arrayWithObjects:@"dsm", nil]; [panel setAllowedFileTypes:fileTypes]; #else [panel setRequiredFileType:@"dsm"]; #endif const NSInteger buttonClicked = [panel runModal]; if (buttonClicked == NSFileHandlingPanelOKButton) { NSURL *fileURL = [panel URL]; if(fileURL == nil) { return; } [self pauseCore]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; NSURL *sramURL = [CocoaDSFile fileURLFromRomURL:[[self currentRom] fileURL] toKind:@"ROM Save"]; NSFileManager *fileManager = [[NSFileManager alloc] init]; const BOOL exists = [fileManager isReadableFileAtPath:[sramURL path]]; [fileManager release]; const BOOL isMovieStarted = [cdsCore startReplayRecording:fileURL sramURL:sramURL]; [self setStatusText:(isMovieStarted) ? @"Replay recording started." : @"Replay creation failed!"]; [self restoreCoreState]; } } - (IBAction) stopReplay:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [self pauseCore]; [cdsCore stopReplay]; [self setStatusText:@"Replay stopped."]; [self restoreCoreState]; } - (IBAction) importRomSave:(id)sender { NSURL *selectedFile = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_IMPORT_ROM_SAVE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects: @FILE_EXT_ROM_SAVE_RAW, @FILE_EXT_ACTION_REPLAY_SAVE, @FILE_EXT_ACTION_REPLAY_MAX_SAVE, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } const BOOL isRomSaveImported = [CocoaDSFile importRomSave:selectedFile]; [self setStatusText:(isRomSaveImported) ? NSSTRING_STATUS_ROM_SAVE_IMPORTED : NSSTRING_STATUS_ROM_SAVE_IMPORT_FAILED]; } } - (IBAction) exportRomSave:(id)sender { [self pauseCore]; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setTitle:NSSTRING_TITLE_EXPORT_ROM_SAVE_PANEL]; [panel setCanCreateDirectories:YES]; [panel setAccessoryView:exportRomSavePanelAccessoryView]; const NSInteger buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { NSURL *romSaveURL = [CocoaDSFile fileURLFromRomURL:[[self currentRom] fileURL] toKind:@"ROM Save"]; if (romSaveURL != nil) { const BOOL isRomSaveExported = [CocoaDSFile exportRomSaveToURL:[panel URL] romSaveURL:romSaveURL fileType:[self selectedExportRomSaveID]]; [self setStatusText:(isRomSaveExported) ? NSSTRING_STATUS_ROM_SAVE_EXPORTED : NSSTRING_STATUS_ROM_SAVE_EXPORT_FAILED]; } } [self restoreCoreState]; } - (IBAction) toggleExecutePause:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) coreExecute:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) corePause:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) frameAdvance:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) frameJump:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) reset:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleSpeedLimiter:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleAutoFrameSkip:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleGPUState:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleGDBStubActivate:(id)sender { // Force end of editing of any text fields. [[(NSControl *)sender window] makeFirstResponder:nil]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; const BOOL willStart = ([cdsCore isGdbStubStarted]) ? NO : YES; [cdsCore setIsGdbStubStarted:willStart]; [(NSButton *)sender setTitle:([cdsCore isGdbStubStarted]) ? @"Stop" : @"Start"]; } - (IBAction) changeRomSaveType:(id)sender { const NSInteger saveTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; [self setSelectedRomSaveTypeID:saveTypeID]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore changeRomSaveType:saveTypeID]; } - (IBAction) toggleCheats:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) changeCoreSpeed:(id)sender { if ([sender isKindOfClass:[NSSlider class]]) { lastSetSpeedScalar = [(NSSlider *)sender floatValue]; } else { const CGFloat newSpeedScalar = (CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f; [self changeCoreSpeedWithDouble:newSpeedScalar]; } } - (IBAction) changeCoreEmuFlags:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; NSUInteger flags = [cdsCore emulationFlags]; NSInteger flagBit = [CocoaDSUtil getIBActionSenderTag:sender]; if (flagBit < 0) { return; } BOOL flagState = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; if (flagState) { flags |= (1 << flagBit); } else { flags &= ~(1 << flagBit); } [cdsCore setEmulationFlags:flags]; } - (IBAction) changeFirmwareSettings:(id)sender { // Force end of editing of any text fields. [[(NSControl *)sender window] makeFirstResponder:nil]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsFirmware] update]; } - (IBAction) changeHardwareMicGain:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setHardwareMicGain:([self currentMicGainValue]/100.0f)]; } - (IBAction) changeHardwareMicMute:(id)sender { const BOOL muteState = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setHardwareMicMute:muteState]; [[cdsCore cdsController] setHardwareMicPause:([cdsCore coreState] != CORESTATE_EXECUTE)]; [self updateMicStatusIcon]; } - (IBAction) changeVolume:(id)sender { const float vol = [self currentVolumeValue]; [self setCurrentVolumeValue:vol]; [CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol]; } - (IBAction) changeAudioEngine:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_AUDIO_PROCESS_METHOD integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeSpuAdvancedLogic:(id)sender { [CocoaDSUtil messageSendOneWayWithBool:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_ADVANCED_LOGIC boolValue:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; } - (IBAction) changeSpuInterpolationMode:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_INTERPOLATION_MODE integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeSpuSyncMode:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_SYNC_MODE integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeSpuSyncMethod:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_SYNC_METHOD integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) toggleAllDisplays:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) autoholdSet:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) autoholdClear:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) chooseSlot1R4Directory:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:YES]; [panel setCanChooseFiles:NO]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:@"Select R4 Directory"]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel beginSheetModalForWindow:slot1ManagerWindow completionHandler:^(NSInteger result) { [self didEndChooseSlot1R4Directory:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:nil modalForWindow:slot1ManagerWindow modalDelegate:self didEndSelector:@selector(didEndChooseSlot1R4Directory:returnCode:contextInfo:) contextInfo:nil]; #endif } - (IBAction) slot1Eject:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore slot1Eject]; } - (IBAction) writeDefaults3DRenderingSettings:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Force end of editing of any text fields. [[(NSControl *)sender window] makeFirstResponder:nil]; [[NSUserDefaults standardUserDefaults] setInteger:[[cdsCore cdsGPU] render3DRenderingEngine] forKey:@"Render3D_RenderingEngine"]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsGPU] render3DHighPrecisionColorInterpolation] forKey:@"Render3D_HighPrecisionColorInterpolation"]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsGPU] render3DEdgeMarking] forKey:@"Render3D_EdgeMarking"]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsGPU] render3DFog] forKey:@"Render3D_Fog"]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsGPU] render3DTextures] forKey:@"Render3D_Textures"]; [[NSUserDefaults standardUserDefaults] setInteger:[[cdsCore cdsGPU] render3DDepthComparisonThreshold] forKey:@"Render3D_DepthComparisonThreshold"]; [[NSUserDefaults standardUserDefaults] setInteger:[[cdsCore cdsGPU] render3DThreads] forKey:@"Render3D_Threads"]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsGPU] render3DLineHack] forKey:@"Render3D_LineHack"]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsGPU] render3DMultisample] forKey:@"Render3D_Multisample"]; [[NSUserDefaults standardUserDefaults] setBool:[[cdsCore cdsGPU] render3DFragmentSamplingHack] forKey:@"Render3D_FragmentSamplingHack"]; } - (IBAction) writeDefaultsEmulationSettings:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; NSDictionary *firmwareDict = [(CocoaDSFirmware *)[firmwarePanelController content] dataDictionary]; // Force end of editing of any text fields. [[(NSControl *)sender window] makeFirstResponder:nil]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagAdvancedBusLevelTiming] forKey:@"Emulation_AdvancedBusLevelTiming"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagRigorousTiming] forKey:@"Emulation_RigorousTiming"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore cpuEmulationEngine] forKey:@"Emulation_CPUEmulationEngine"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore maxJITBlockSize] forKey:@"Emulation_MaxJITBlockSize"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagUseExternalBios] forKey:@"Emulation_UseExternalBIOSImages"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagEmulateBiosInterrupts] forKey:@"Emulation_BIOSEmulateSWI"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagPatchDelayLoop] forKey:@"Emulation_BIOSPatchDelayLoopSWI"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagUseExternalFirmware] forKey:@"Emulation_UseExternalFirmwareImage"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagFirmwareBoot] forKey:@"Emulation_FirmwareBoot"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagEmulateEnsata] forKey:@"Emulation_EmulateEnsata"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagDebugConsole] forKey:@"Emulation_UseDebugConsole"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Nickname"] forKey:@"FirmwareConfig_Nickname"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Message"] forKey:@"FirmwareConfig_Message"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"FavoriteColor"] forKey:@"FirmwareConfig_FavoriteColor"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Birthday"] forKey:@"FirmwareConfig_Birthday"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Language"] forKey:@"FirmwareConfig_Language"]; } - (IBAction) writeDefaultsSlot1Settings:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore slot1DeviceType] forKey:@"EmulationSlot1_DeviceType"]; [[NSUserDefaults standardUserDefaults] setObject:[[cdsCore slot1R4URL] path] forKey:@"EmulationSlot1_R4StoragePath"]; } - (IBAction) writeDefaultsSoundSettings:(id)sender { NSMutableDictionary *speakerBindings = (NSMutableDictionary *)[cdsSoundController content]; [[NSUserDefaults standardUserDefaults] setFloat:[[speakerBindings valueForKey:@"volume"] floatValue] forKey:@"Sound_Volume"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"audioOutputEngine"] integerValue] forKey:@"Sound_AudioOutputEngine"]; [[NSUserDefaults standardUserDefaults] setBool:[[speakerBindings valueForKey:@"spuAdvancedLogic"] boolValue] forKey:@"SPU_AdvancedLogic"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuInterpolationMode"] integerValue] forKey:@"SPU_InterpolationMode"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuSyncMode"] integerValue] forKey:@"SPU_SyncMode"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuSyncMethod"] integerValue] forKey:@"SPU_SyncMethod"]; } - (IBAction) closeSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; const NSInteger code = [(NSControl *)sender tag]; [NSApp endSheet:sheet returnCode:code]; } #pragma mark Class Methods - (void) cmdUpdateDSController:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; const NSUInteger controlID = cmdAttr.intValue[0]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setControllerState:theState controlID:controlID]; } - (void) cmdUpdateDSControllerWithTurbo:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; const NSUInteger controlID = cmdAttr.intValue[0]; const BOOL isTurboEnabled = (BOOL)cmdAttr.intValue[1]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setControllerState:theState controlID:controlID turbo:isTurboEnabled]; } - (void) cmdUpdateDSTouch:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; const NSPoint touchLoc = (cmdAttr.useInputForIntCoord) ? NSMakePoint(cmdAttr.input.intCoordX, cmdAttr.input.intCoordY) : NSMakePoint(cmdAttr.intValue[1], cmdAttr.intValue[2]); if (touchLoc.x >= 0.0 && touchLoc.y >= 0.0) { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setTouchState:theState location:touchLoc]; } } - (void) cmdUpdateDSMicrophone:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSController *cdsController = [cdsCore cdsController]; const NSInteger micMode = cmdAttr.intValue[1]; [cdsController setSoftwareMicState:theState]; [cdsController setSoftwareMicMode:micMode]; const float sineWaveFrequency = cmdAttr.floatValue[0]; [cdsController setSineWaveGeneratorFrequency:sineWaveFrequency]; NSString *audioFilePath = cmdAttr.object[0]; [cdsController setSelectedAudioFileGenerator:[inputManager audioFileGeneratorFromFilePath:audioFilePath]]; } - (void) cmdUpdateDSPaddle:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (cmdAttr.input.isAnalog) { const NSInteger paddleSensitivity = cmdAttr.floatValue[0]; const float paddleScalar = cmdAttr.input.scalar; float paddleAdjust = (paddleScalar * 2.0f) - 1.0f; // Clamp the paddle value. if (paddleAdjust < -1.0f) { paddleAdjust = -1.0f; } if (paddleAdjust > 1.0f) { paddleAdjust = 1.0f; } // Normalize the input value for the paddle. paddleAdjust *= (float)paddleSensitivity; [[cdsCore cdsController] setPaddleAdjust:paddleAdjust]; } else { const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; const NSInteger paddleAdjust = (theState) ? cmdAttr.intValue[1] : 0; [[cdsCore cdsController] setPaddleAdjust:paddleAdjust]; } } - (void) cmdAutoholdSet:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setAutohold:theState]; [self setStatusText:(theState) ? NSSTRING_STATUS_AUTOHOLD_SET : NSSTRING_STATUS_AUTOHOLD_SET_RELEASE]; } - (void) cmdAutoholdClear:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] clearAutohold]; [self setStatusText:NSSTRING_STATUS_AUTOHOLD_CLEAR]; } - (void) cmdLoadEmuSaveStateSlot:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { // Should throw an error message here... return; } const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS) { return; } NSURL *currentRomURL = [[self currentRom] fileURL]; NSString *fileName = [CocoaDSFile saveSlotFileName:currentRomURL slotNumber:(NSUInteger)(slotNumber + 1)]; if (fileName == nil) { return; } [self pauseCore]; const BOOL isStateLoaded = [CocoaDSFile loadState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; [self setStatusText:(isStateLoaded) ? NSSTRING_STATUS_SAVESTATE_LOADED : NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; [self restoreCoreState]; } - (void) cmdSaveEmuSaveStateSlot:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { [self setStatusText:NSSTRING_STATUS_CANNOT_GENERATE_SAVE_PATH]; return; } const BOOL isDirectoryCreated = [CocoaDSFile createUserAppSupportDirectory:@"States"]; if (!isDirectoryCreated) { [self setStatusText:NSSTRING_STATUS_CANNOT_CREATE_SAVE_DIRECTORY]; return; } const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS) { return; } NSURL *currentRomURL = [[self currentRom] fileURL]; NSString *fileName = [CocoaDSFile saveSlotFileName:currentRomURL slotNumber:(NSUInteger)(slotNumber + 1)]; if (fileName == nil) { return; } [self pauseCore]; const BOOL isStateSaved = [CocoaDSFile saveState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; [self setStatusText:(isStateSaved) ? NSSTRING_STATUS_SAVESTATE_SAVED : NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; [self restoreCoreState]; } - (void) cmdCopyScreen:(NSValue *)cmdAttrValue { [mainWindow copy:nil]; } - (void) cmdRotateDisplayRelative:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } const double relativeDegrees = (cmdAttr.useInputForSender) ? (double)[CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : (double)cmdAttr.intValue[0]; const double angleDegrees = [mainWindow displayRotation] + relativeDegrees; [mainWindow setDisplayRotation:angleDegrees]; } - (void) cmdToggleAllDisplays:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } for (DisplayWindowController *theWindow in windowList) { const NSInteger displayMode = [theWindow displayMode]; switch (displayMode) { case DS_DISPLAY_TYPE_MAIN: [theWindow setDisplayMode:DS_DISPLAY_TYPE_TOUCH]; break; case DS_DISPLAY_TYPE_TOUCH: [theWindow setDisplayMode:DS_DISPLAY_TYPE_MAIN]; break; case DS_DISPLAY_TYPE_DUAL: { const NSInteger displayOrder = [theWindow displayOrder]; if (displayOrder == DS_DISPLAY_ORDER_MAIN_FIRST) { [theWindow setDisplayOrder:DS_DISPLAY_ORDER_TOUCH_FIRST]; } else { [theWindow setDisplayOrder:DS_DISPLAY_ORDER_MAIN_FIRST]; } break; } default: break; } } } - (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; const float speedScalar = (cmdAttr.useInputForScalar) ? cmdAttr.input.scalar : cmdAttr.floatValue[0]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSpeedScalar:(cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) ? lastSetSpeedScalar : speedScalar]; } - (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isSpeedLimitEnabled]) { [cdsCore setIsSpeedLimitEnabled:NO]; [self setStatusText:NSSTRING_STATUS_SPEED_LIMIT_DISABLED]; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"CoreControl_EnableSpeedLimit"]; } else { [cdsCore setIsSpeedLimitEnabled:YES]; [self setStatusText:NSSTRING_STATUS_SPEED_LIMIT_ENABLED]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CoreControl_EnableSpeedLimit"]; } } - (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isFrameSkipEnabled]) { [cdsCore setIsFrameSkipEnabled:NO]; [self setStatusText:NSSTRING_STATUS_AUTO_FRAME_SKIP_DISABLED]; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"CoreControl_EnableAutoFrameSkip"]; } else { [cdsCore setIsFrameSkipEnabled:YES]; [self setStatusText:NSSTRING_STATUS_AUTO_FRAME_SKIP_ENABLED]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CoreControl_EnableAutoFrameSkip"]; } } - (void) cmdToggleCheats:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isCheatingEnabled]) { [cdsCore setIsCheatingEnabled:NO]; [self setStatusText:NSSTRING_STATUS_CHEATS_DISABLED]; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"CoreControl_EnableCheats"]; } else { [cdsCore setIsCheatingEnabled:YES]; [self setStatusText:NSSTRING_STATUS_CHEATS_ENABLED]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CoreControl_EnableCheats"]; } } - (void) cmdToggleExecutePause:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore coreState] == CORESTATE_PAUSE) { [self executeCore]; } else { [self pauseCore]; } } - (void) cmdCoreExecute:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } [self executeCore]; } - (void) cmdCorePause:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } [self pauseCore]; } - (void) cmdFrameAdvance:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [cdsCore coreState] != CORESTATE_PAUSE || [self currentRom] == nil) { return; } [cdsCore setCoreState:CORESTATE_FRAMEADVANCE]; } - (void) cmdFrameJump:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [executionControlWindow makeFirstResponder:nil]; NSUInteger jumpFrames = 0; switch ([self frameJumpType]) { case FRAMEJUMP_TYPE_FORWARD: jumpFrames = [self frameJumpFramesForward]; [cdsCore frameJump:jumpFrames]; break; case FRAMEJUMP_TYPE_TOFRAME: jumpFrames = [self frameJumpToFrame]; [cdsCore frameJumpTo:jumpFrames]; break; case FRAMEJUMP_TYPE_NEXTMARKER: // TODO: Support when replay markers are implemented. break; default: break; } } - (void) cmdReset:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [self setStatusText:NSSTRING_STATUS_EMULATOR_RESETTING]; [self setIsWorking:YES]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } [cdsCore reset]; for (DisplayWindowController *windowController in windowList) { [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; } [self setStatusText:NSSTRING_STATUS_EMULATOR_RESET]; [self setIsWorking:NO]; [self writeDefaultsSlot1Settings:nil]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } } - (void) cmdToggleMute:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } float vol = 0.0f; if (isSoundMuted) { isSoundMuted = NO; vol = lastSetVolumeValue; [self setStatusText:@"Sound unmuted."]; } else { isSoundMuted = YES; [self setStatusText:@"Sound muted."]; } [self setCurrentVolumeValue:vol]; [CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol]; } - (void) cmdToggleGPUState:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; const NSInteger bitNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; const UInt32 flagBit = [cdsCore.cdsGPU gpuStateFlags] ^ (1 << bitNumber); [cdsCore.cdsGPU setGpuStateFlags:flagBit]; } - (BOOL) handleLoadRomByURL:(NSURL *)fileURL { BOOL result = NO; if (fileURL == nil || [self isRomLoading]) { return result; } if ([self currentRom] != nil) { const BOOL closeResult = [self handleUnloadRom:REASONFORCLOSE_OPEN romToLoad:fileURL]; if ([self isShowingSaveStateDialog]) { return result; } if (![self isShowingFileMigrationDialog] && !closeResult) { return result; } } // Check for the v0.9.7 ROM Save File if ([CocoaDSFile romSaveExistsWithRom:fileURL] && ![CocoaDSFile romSaveExists:fileURL]) { [fileURL retain]; [self setIsUserInterfaceBlockingExecution:YES]; [self setIsShowingFileMigrationDialog:YES]; [NSApp beginSheet:saveFileMigrationSheet modalForWindow:[[windowList objectAtIndex:0] window] modalDelegate:self didEndSelector:@selector(didEndFileMigrationSheet:returnCode:contextInfo:) contextInfo:fileURL]; } else { result = [self loadRomByURL:fileURL asynchronous:YES]; } return result; } - (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL { BOOL result = NO; if ([self isRomLoading] || [self currentRom] == nil) { return result; } [self pauseCore]; if (isSaveStateEdited && [self currentSaveStateURL] != nil) { SEL endSheetSelector = @selector(didEndSaveStateSheet:returnCode:contextInfo:); switch (reasonID) { case REASONFORCLOSE_OPEN: [romURL retain]; endSheetSelector = @selector(didEndSaveStateSheetOpen:returnCode:contextInfo:); break; case REASONFORCLOSE_TERMINATE: endSheetSelector = @selector(didEndSaveStateSheetTerminate:returnCode:contextInfo:); break; default: break; } [self setIsUserInterfaceBlockingExecution:YES]; [self setIsShowingSaveStateDialog:YES]; [NSApp beginSheet:saveStatePrecloseSheet modalForWindow:(NSWindow *)[[windowList objectAtIndex:0] window] modalDelegate:self didEndSelector:endSheetSelector contextInfo:romURL]; } else { result = [self unloadRom]; } return result; } - (BOOL) loadRomByURL:(NSURL *)romURL asynchronous:(BOOL)willLoadAsync { BOOL result = NO; if (romURL == nil) { return result; } [self setStatusText:NSSTRING_STATUS_ROM_LOADING]; [self setIsWorking:YES]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } // Need to pause the core before loading the ROM. [self pauseCore]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore applyDynaRec]; [cdsCore applySlot1Device]; [self writeDefaultsSlot1Settings:nil]; CocoaDSRom *newRom = [[CocoaDSRom alloc] init]; if (newRom != nil) { [self setIsRomLoading:YES]; [romURL retain]; [newRom setSaveType:selectedRomSaveTypeID]; [newRom setWillStreamLoadData:[[NSUserDefaults standardUserDefaults] boolForKey:@"General_StreamLoadRomData"]]; if (willLoadAsync) { [NSThread detachNewThreadSelector:@selector(loadDataOnThread:) toTarget:newRom withObject:romURL]; } else { [newRom loadData:romURL]; } [romURL release]; } result = YES; return result; } - (void) loadRomDidFinish:(NSNotification *)aNotification { CocoaDSRom *theRom = [aNotification object]; NSDictionary *userInfo = [aNotification userInfo]; const BOOL didLoad = [(NSNumber *)[userInfo valueForKey:@"DidLoad"] boolValue]; if ( theRom == nil || !didLoad || (![theRom willStreamLoadData] && ![theRom isDataLoaded]) ) { // If ROM loading fails, restore the core state, but only if a ROM is already loaded. if([self currentRom] != nil) { [self restoreCoreState]; } [self setStatusText:NSSTRING_STATUS_ROM_LOADING_FAILED]; [self setIsWorking:NO]; [self setIsRomLoading:NO]; return; } // Set the core's ROM to our newly allocated ROM object. [self setCurrentRom:theRom]; [romInfoPanelController setContent:[theRom bindings]]; // If the ROM has an associated cheat file, load it now. NSString *cheatsPath = [[CocoaDSFile fileURLFromRomURL:[theRom fileURL] toKind:@"Cheat"] path]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSCheatManager *newCheatList = [[[CocoaDSCheatManager alloc] initWithFileURL:[NSURL fileURLWithPath:cheatsPath]] autorelease]; if (newCheatList != nil) { NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; [CocoaDSCheatManager setMasterCheatList:newCheatList]; [cheatListController setContent:[newCheatList list]]; [self setCdsCheats:newCheatList]; [cheatWindowBindings setValue:newCheatList forKey:@"cheatList"]; NSString *filePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"R4Cheat_DatabasePath"]; if (filePath != nil) { NSURL *fileURL = [NSURL fileURLWithPath:filePath]; NSInteger error = 0; NSMutableArray *dbList = [[self cdsCheats] cheatListFromDatabase:fileURL errorCode:&error]; if (dbList != nil) { [cheatDatabaseController setContent:dbList]; NSString *titleString = [[self cdsCheats] dbTitle]; NSString *dateString = [[self cdsCheats] dbDate]; [cheatWindowBindings setValue:titleString forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:dateString forKey:@"cheatDBDate"]; [cheatWindowBindings setValue:[NSString stringWithFormat:@"%ld", (unsigned long)[dbList count]] forKey:@"cheatDBItemCount"]; } else { [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; switch (error) { case CHEATEXPORT_ERROR_FILE_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not load the database file!"); [cheatWindowBindings setValue:@"Database not loaded." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_WRONG_FILE_FORMAT: NSLog(@"R4 Cheat Database read failed! Wrong file format!"); [cheatWindowBindings setValue:@"Database load error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"FAILED TO LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_SERIAL_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not find the serial number for this game in the database!"); [cheatWindowBindings setValue:@"ROM not found in database." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"ROM not found." forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_EXPORT_FAILED: NSLog(@"R4 Cheat Database read failed! Could not read the database file!"); [cheatWindowBindings setValue:@"Database read error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT READ FILE" forKey:@"cheatDBDate"]; break; default: break; } } } [cheatWindowDelegate setCdsCheats:newCheatList]; [[cheatWindowDelegate cdsCheatSearch] setRwlockCoreExecute:[cdsCore rwlockCoreExecute]]; [cheatWindowDelegate setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE]; } // Add the last loaded ROM to the Recent ROMs list. [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[theRom fileURL]]; // Update the UI to indicate that a ROM has indeed been loaded. [self updateAllWindowTitles]; GPU_FillScreenWithBGRA5551(0xFFFF); for (DisplayWindowController *windowController in windowList) { [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; } [self setStatusText:NSSTRING_STATUS_ROM_LOADED]; [self setIsWorking:NO]; [self setIsRomLoading:NO]; Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2WindowController content]; [slot2WindowDelegate setAutoSelectedDeviceText:[[slot2WindowDelegate deviceManager] autoSelectedDeviceName]]; [[slot2WindowDelegate deviceManager] updateStatus]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } // After the ROM loading is complete, send an execute message to the Cocoa DS per // user preferences. if ([[NSUserDefaults standardUserDefaults] boolForKey:@"General_ExecuteROMOnLoad"]) { [self executeCore]; } } - (BOOL) unloadRom { BOOL result = NO; [self setCurrentSaveStateURL:nil]; isSaveStateEdited = NO; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } // Save the ROM's cheat list before unloading. [[self cdsCheats] save]; // Update the UI to indicate that the ROM has started the process of unloading. [self setStatusText:NSSTRING_STATUS_ROM_UNLOADING]; [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [cheatListController setContent:nil]; [cheatWindowDelegate resetSearch:nil]; [cheatWindowDelegate setCdsCheats:nil]; [cheatDatabaseController setContent:nil]; NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; [cheatWindowBindings setValue:@"No ROM loaded." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"No ROM loaded." forKey:@"cheatDBDate"]; [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; [cheatWindowBindings setValue:nil forKey:@"cheatList"]; [self setIsWorking:YES]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } // Unload the ROM. [[self currentRom] release]; [self setCurrentRom:nil]; // Release the current cheat list and assign the empty list. [self setCdsCheats:nil]; if (dummyCheatList == nil) { dummyCheatList = [[CocoaDSCheatManager alloc] init]; } [CocoaDSCheatManager setMasterCheatList:dummyCheatList]; // Update the UI to indicate that the ROM has finished unloading. [self updateAllWindowTitles]; GPU_FillScreenWithBGRA5551(0x8000); for (DisplayWindowController *windowController in windowList) { [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REPROCESS_AND_REDRAW]; } [self setStatusText:NSSTRING_STATUS_ROM_UNLOADED]; [self setIsWorking:NO]; Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2WindowController content]; [slot2WindowDelegate setAutoSelectedDeviceText:[[slot2WindowDelegate deviceManager] autoSelectedDeviceName]]; [[slot2WindowDelegate deviceManager] updateStatus]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSlot1StatusText:NSSTRING_STATUS_EMULATION_NOT_RUNNING]; [[cdsCore cdsController] reset]; [[cdsCore cdsController] updateMicLevel]; result = YES; return result; } - (void) addOutputToCore:(CocoaDSOutput *)theOutput { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore addOutput:theOutput]; } - (void) removeOutputFromCore:(CocoaDSOutput *)theOutput { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore removeOutput:theOutput]; } - (void) changeCoreSpeedWithDouble:(double)newSpeedScalar { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSpeedScalar:newSpeedScalar]; lastSetSpeedScalar = newSpeedScalar; } - (void) executeCore { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCoreState:CORESTATE_EXECUTE]; [self updateMicStatusIcon]; } - (void) pauseCore { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCoreState:CORESTATE_PAUSE]; [self updateMicStatusIcon]; } - (void) restoreCoreState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore restoreCoreState]; [self updateMicStatusIcon]; } - (void) updateMicStatusIcon { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSController *cdsController = [cdsCore cdsController]; NSImage *micIcon = iconMicDisabled; if ([self isSoftwareMicActive]) { micIcon = iconMicManualOverride; } else { if ([cdsController isHardwareMicAvailable]) { if ([self isHardwareMicInClip]) { micIcon = iconMicInClip; } else if ([self isHardwareMicIdle]) { micIcon = iconMicIdle; } else { micIcon = iconMicActive; } } } if (micIcon != [self currentMicStatusIcon]) { [self performSelectorOnMainThread:@selector(setCurrentMicStatusIcon:) withObject:micIcon waitUntilDone:NO]; } } - (AudioSampleBlockGenerator *) selectedAudioFileGenerator { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [[cdsCore cdsController] selectedAudioFileGenerator]; } - (void) setSelectedAudioFileGenerator:(AudioSampleBlockGenerator *)theGenerator { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setSelectedAudioFileGenerator:theGenerator]; } - (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { NSURL *romURL = (NSURL *)contextInfo; NSURL *romSaveURL = [CocoaDSFile romSaveURLFromRomURL:romURL]; [sheet orderOut:self]; switch (returnCode) { case NSOKButton: [CocoaDSFile moveFileToCurrentDirectory:romSaveURL]; break; default: break; } [self setIsUserInterfaceBlockingExecution:NO]; [self setIsShowingFileMigrationDialog:NO]; [self loadRomByURL:romURL asynchronous:YES]; // We retained this when we initially put up the sheet, so we need to release it now. [romURL release]; } - (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; switch (returnCode) { case NSCancelButton: // Cancel [self restoreCoreState]; [self setIsUserInterfaceBlockingExecution:NO]; [self setIsShowingSaveStateDialog:NO]; return; break; case COCOA_DIALOG_DEFAULT: // Save { const BOOL isStateSaved = [CocoaDSFile saveState:[self currentSaveStateURL]]; if (!isStateSaved) { // Throw an error here... [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } break; } case COCOA_DIALOG_OPTION: // Don't Save break; default: break; } [self unloadRom]; [self setIsUserInterfaceBlockingExecution:NO]; [self setIsShowingSaveStateDialog:NO]; } - (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [self didEndSaveStateSheet:sheet returnCode:returnCode contextInfo:contextInfo]; NSURL *romURL = (NSURL *)contextInfo; [self handleLoadRomByURL:romURL]; [romURL release]; } - (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [self didEndSaveStateSheet:sheet returnCode:returnCode contextInfo:contextInfo]; if (returnCode == NSCancelButton) { [NSApp replyToApplicationShouldTerminate:NO]; } else { if ([self currentSaveStateURL] == nil) { [NSApp replyToApplicationShouldTerminate:YES]; } } } - (void) didEndChooseSlot1R4Directory:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedDirURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedDirURL == nil) { return; } [[NSUserDefaults standardUserDefaults] setObject:[selectedDirURL path] forKey:@"EmulationSlot1_R4StoragePath"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSlot1R4URL:selectedDirURL]; } - (void) updateAllWindowTitles { if ([windowList count] < 1) { return; } NSString *romName = nil; NSURL *repURL = nil; NSImage *titleIcon = nil; if ([self currentRom] == nil) { romName = (NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; } else { romName = [currentRom internalName]; repURL = [currentRom fileURL]; titleIcon = [currentRom icon]; } if ([windowList count] > 1) { for (DisplayWindowController *windowController in windowList) { NSString *newWindowTitle = [romName stringByAppendingFormat:@":%ld", (unsigned long)([windowList indexOfObject:windowController] + 1)]; [[windowController masterWindow] setTitle:newWindowTitle]; [[windowController masterWindow] setRepresentedURL:repURL]; [[[windowController masterWindow] standardWindowButton:NSWindowDocumentIconButton] setImage:titleIcon]; } } else { NSWindow *theWindow = [[windowList objectAtIndex:0] masterWindow]; [theWindow setTitle:romName]; [theWindow setRepresentedURL:repURL]; [[theWindow standardWindowButton:NSWindowDocumentIconButton] setImage:titleIcon]; } } - (void) updateDisplayPanelTitles { // If the original panel titles haven't been saved yet, then save them now. if (displayRotationPanelTitle == nil) { displayRotationPanelTitle = [[displayRotationPanel title] copy]; displaySeparationPanelTitle = [[displaySeparationPanel title] copy]; displayVideoSettingsPanelTitle = [[displayVideoSettingsPanel title] copy]; } // Set the panel titles to the window number. if ([windowList count] <= 1) { [displayRotationPanel setTitle:displayRotationPanelTitle]; [displaySeparationPanel setTitle:displaySeparationPanelTitle]; [displayVideoSettingsPanel setTitle:displayVideoSettingsPanelTitle]; } else { unsigned long windowNumber = (unsigned long)[windowList indexOfObject:mainWindow] + 1; [displayRotationPanel setTitle:[displayRotationPanelTitle stringByAppendingFormat:@":%ld", windowNumber]]; [displaySeparationPanel setTitle:[displaySeparationPanelTitle stringByAppendingFormat:@":%ld", windowNumber]]; [displayVideoSettingsPanel setTitle:[displayVideoSettingsPanelTitle stringByAppendingFormat:@":%ld", windowNumber]]; } } - (void) setupUserDefaults { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Set the microphone settings per user preferences. [[cdsCore cdsController] setHardwareMicMute:[[NSUserDefaults standardUserDefaults] boolForKey:@"Microphone_HardwareMicMute"]]; // Set the SPU settings per user preferences. [self setCurrentVolumeValue:[[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]]; [[self cdsSpeaker] setVolume:[[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]]; [[self cdsSpeaker] setAudioOutputEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Sound_AudioOutputEngine"]]; [[self cdsSpeaker] setSpuAdvancedLogic:[[NSUserDefaults standardUserDefaults] boolForKey:@"SPU_AdvancedLogic"]]; [[self cdsSpeaker] setSpuInterpolationMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_InterpolationMode"]]; [[self cdsSpeaker] setSpuSyncMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"]]; [[self cdsSpeaker] setSpuSyncMethod:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMethod"]]; // Set the 3D rendering options per user preferences. [[cdsCore cdsGPU] setRender3DThreads:(NSUInteger)[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_Threads"]]; [[cdsCore cdsGPU] setRender3DRenderingEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_RenderingEngine"]]; [[cdsCore cdsGPU] setRender3DHighPrecisionColorInterpolation:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_HighPrecisionColorInterpolation"]]; [[cdsCore cdsGPU] setRender3DEdgeMarking:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_EdgeMarking"]]; [[cdsCore cdsGPU] setRender3DFog:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Fog"]]; [[cdsCore cdsGPU] setRender3DTextures:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Textures"]]; [[cdsCore cdsGPU] setRender3DDepthComparisonThreshold:(NSUInteger)[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_DepthComparisonThreshold"]]; [[cdsCore cdsGPU] setRender3DLineHack:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_LineHack"]]; [[cdsCore cdsGPU] setRender3DMultisample:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Multisample"]]; [[cdsCore cdsGPU] setRender3DFragmentSamplingHack:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_FragmentSamplingHack"]]; } #pragma mark NSUserInterfaceValidations Protocol - (BOOL)validateUserInterfaceItem:(id )theItem { BOOL enable = YES; const SEL theAction = [theItem action]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (theAction == @selector(importRomSave:) || theAction == @selector(exportRomSave:)) { if ([self currentRom] == nil) { enable = NO; } } else if (theAction == @selector(toggleExecutePause:)) { if (![cdsCore masterExecute] || [self currentRom] == nil || [self isUserInterfaceBlockingExecution]) { enable = NO; } if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([cdsCore coreState] == CORESTATE_PAUSE) { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_EXECUTE_CONTROL]; } else if ([cdsCore coreState] == CORESTATE_EXECUTE) { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_PAUSE_CONTROL]; } } else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) { if ([cdsCore coreState] == CORESTATE_PAUSE) { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_EXECUTE_CONTROL]; [(NSToolbarItem*)theItem setImage:iconExecute]; } else if ([cdsCore coreState] == CORESTATE_EXECUTE) { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_PAUSE_CONTROL]; [(NSToolbarItem*)theItem setImage:iconPause]; } } } else if (theAction == @selector(frameAdvance:)) { if ([cdsCore coreState] != CORESTATE_PAUSE) { enable = NO; } if ([cdsCore coreState] != CORESTATE_PAUSE || ![cdsCore masterExecute] || [self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(frameJump:)) { if (![cdsCore masterExecute] || [self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(coreExecute:)) { if ([cdsCore coreState] == CORESTATE_EXECUTE || [cdsCore coreState] == CORESTATE_FRAMEADVANCE || ![cdsCore masterExecute] || [self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(corePause:)) { if ([cdsCore coreState] == CORESTATE_PAUSE || ![cdsCore masterExecute] || [self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(reset:)) { if ([self currentRom] == nil || [self isUserInterfaceBlockingExecution] || [cdsCore isInDebugTrap]) { enable = NO; } } else if (theAction == @selector(loadRecentRom:)) { if ([self isRomLoading] || [self isShowingSaveStateDialog] || [cdsCore isInDebugTrap]) { enable = NO; } } else if (theAction == @selector(openRom:)) { if ([self isRomLoading] || [self isShowingSaveStateDialog] || [cdsCore isInDebugTrap]) { enable = NO; } } else if (theAction == @selector(closeRom:)) { if ([self currentRom] == nil || [self isRomLoading] || [self isShowingSaveStateDialog] || [cdsCore isInDebugTrap]) { enable = NO; } } else if (theAction == @selector(revealRomInFinder:)) { if ([self currentRom] == nil || [self isRomLoading]) { enable = NO; } } else if (theAction == @selector(loadEmuSaveStateSlot:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog] || ![CocoaDSFile saveStateExistsForSlot:[[self currentRom] fileURL] slotNumber:[theItem tag] + 1] || [cdsCore isInDebugTrap]) { enable = NO; } } else if (theAction == @selector(saveEmuSaveStateSlot:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([CocoaDSFile saveStateExistsForSlot:[[self currentRom] fileURL] slotNumber:[theItem tag] + 1]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(openReplay:)) { if ([self currentRom] == nil || [self isRomLoading] || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(recordReplay:)) { if ([self currentRom] == nil || [self isRomLoading] || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(stopReplay:)) { if ([self currentRom] == nil || [self isRomLoading] || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(changeCoreSpeed:)) { NSInteger speedScalar = (NSInteger)([cdsCore speedScalar] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (speedScalar == (NSInteger)(SPEED_SCALAR_HALF * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_NORMAL * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [(NSMenuItem*)theItem setState:NSOffState]; } else { [(NSMenuItem*)theItem setState:NSOnState]; } } else { [(NSMenuItem*)theItem setState:(speedScalar == [theItem tag]) ? NSOnState : NSOffState]; } } else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) { if (speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_1X]; [(NSToolbarItem*)theItem setTag:100]; [(NSToolbarItem*)theItem setImage:iconSpeedNormal]; } else { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_2X]; [(NSToolbarItem*)theItem setTag:200]; [(NSToolbarItem*)theItem setImage:iconSpeedDouble]; } } } else if (theAction == @selector(toggleSpeedLimiter:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([cdsCore isSpeedLimitEnabled]) ? NSSTRING_TITLE_DISABLE_SPEED_LIMIT : NSSTRING_TITLE_ENABLE_SPEED_LIMIT]; } } else if (theAction == @selector(toggleAutoFrameSkip:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([cdsCore isFrameSkipEnabled]) ? NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP : NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP]; } } else if (theAction == @selector(toggleCheats:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([cdsCore isCheatingEnabled]) ? NSSTRING_TITLE_DISABLE_CHEATS : NSSTRING_TITLE_ENABLE_CHEATS]; } } else if (theAction == @selector(changeRomSaveType:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([self selectedRomSaveTypeID] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(openEmuSaveState:) || theAction == @selector(saveEmuSaveState:) || theAction == @selector(saveEmuSaveStateAs:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog] || [cdsCore isInDebugTrap]) { enable = NO; } } else if (theAction == @selector(revertEmuSaveState:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog] || [self currentSaveStateURL] == nil || [cdsCore isInDebugTrap]) { enable = NO; } } else if (theAction == @selector(toggleGPUState:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([cdsCore.cdsGPU gpuStateByBit:[theItem tag]]) ? NSOnState : NSOffState]; } } return enable; } #pragma mark NSControl Delegate Methods - (void)controlTextDidEndEditing:(NSNotification *)aNotification { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsGPU] setRender3DDepthComparisonThreshold:[(NSNumber *)[aNotification object] integerValue]]; } #pragma mark CocoaDSControllerDelegate Protocol - (void) doMicLevelUpdateFromController:(CocoaDSController *)cdsController { [self setIsSoftwareMicActive:[cdsController softwareMicState]]; [self setIsHardwareMicIdle:[cdsController isHardwareMicIdle]]; [self setIsHardwareMicInClip:[cdsController isHardwareMicInClip]]; [self updateMicStatusIcon]; } - (void) doMicHardwareStateChangedFromController:(CocoaDSController *)cdsController isEnabled:(BOOL)isHardwareEnabled isLocked:(BOOL)isHardwareLocked { const BOOL hwMicAvailable = (isHardwareEnabled && !isHardwareLocked); [self setIsHardwareMicAvailable:hwMicAvailable]; [self updateMicStatusIcon]; } - (void) doMicHardwareGainChangedFromController:(CocoaDSController *)cdsController gain:(float)gainValue { [self setCurrentMicGainValue:gainValue*100.0f]; } @end desmume-0.9.11/src/cocoa/userinterface/EmuControllerDelegate.h0000755000000000000000000002515012467662066023074 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #import "../cocoa_input.h" @class InputManager; @class CocoaDSRom; @class CocoaDSFirmware; @class CocoaDSController; @class CocoaDSOutput; @class CocoaDSSpeaker; @class CocoaDSCheatManager; @class CheatWindowDelegate; @class DisplayWindowController; class AudioSampleBlockGenerator; @interface EmuControllerDelegate : NSObject { InputManager *inputManager; CocoaDSRom *currentRom; CocoaDSFirmware *cdsFirmware; CocoaDSSpeaker *cdsSpeaker; CocoaDSCheatManager *cdsCheats; CocoaDSCheatManager *dummyCheatList; CheatWindowDelegate *cheatWindowDelegate; NSObjectController *firmwarePanelController; NSObjectController *romInfoPanelController; NSObjectController *cdsCoreController; NSObjectController *cdsSoundController; NSObjectController *cheatWindowController; NSObjectController *slot2WindowController; NSArrayController *cheatListController; NSArrayController *cheatDatabaseController; NSWindow *displayRotationPanel; NSWindow *displaySeparationPanel; NSWindow *displayVideoSettingsPanel; NSString *displayRotationPanelTitle; NSString *displaySeparationPanelTitle; NSString *displayVideoSettingsPanelTitle; NSWindow *executionControlWindow; NSWindow *slot1ManagerWindow; NSWindow *saveFileMigrationSheet; NSWindow *saveStatePrecloseSheet; NSView *exportRomSavePanelAccessoryView; BOOL isSaveStateEdited; BOOL isWorking; BOOL isRomLoading; NSString *statusText; float currentVolumeValue; NSImage *currentMicStatusIcon; NSImage *currentVolumeIcon; BOOL isShowingSaveStateDialog; BOOL isShowingFileMigrationDialog; BOOL isUserInterfaceBlockingExecution; NSURL *currentSaveStateURL; NSInteger selectedExportRomSaveID; NSInteger selectedRomSaveTypeID; NSInteger frameJumpType; NSInteger frameJumpFramesForward; NSInteger frameJumpToFrame; CGFloat lastSetSpeedScalar; BOOL isSoftwareMicActive; BOOL isHardwareMicAvailable; BOOL isHardwareMicIdle; BOOL isHardwareMicInClip; float currentMicGainValue; BOOL isSoundMuted; float lastSetVolumeValue; NSImage *iconMicDisabled; NSImage *iconMicIdle; NSImage *iconMicActive; NSImage *iconMicInClip; NSImage *iconMicManualOverride; NSImage *iconVolumeFull; NSImage *iconVolumeTwoThird; NSImage *iconVolumeOneThird; NSImage *iconVolumeMute; NSImage *iconExecute; NSImage *iconPause; NSImage *iconSpeedNormal; NSImage *iconSpeedDouble; DisplayWindowController *mainWindow; NSMutableArray *windowList; OSSpinLock spinlockFirmware; OSSpinLock spinlockSpeaker; } @property (readonly) IBOutlet InputManager *inputManager; @property (assign) CocoaDSRom *currentRom; // Don't rely on autorelease since the emulator doesn't support concurrent unloading @property (retain) CocoaDSFirmware *cdsFirmware; @property (retain) CocoaDSSpeaker *cdsSpeaker; @property (retain) CocoaDSCheatManager *cdsCheats; @property (readonly) IBOutlet CheatWindowDelegate *cheatWindowDelegate; @property (readonly) IBOutlet NSObjectController *firmwarePanelController; @property (readonly) IBOutlet NSObjectController *romInfoPanelController; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSObjectController *cdsSoundController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSObjectController *slot2WindowController; @property (readonly) IBOutlet NSArrayController *cheatListController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController; @property (readonly) IBOutlet NSWindow *displayRotationPanel; @property (readonly) IBOutlet NSWindow *displaySeparationPanel; @property (readonly) IBOutlet NSWindow *displayVideoSettingsPanel; @property (readonly) IBOutlet NSWindow *executionControlWindow; @property (readonly) IBOutlet NSWindow *slot1ManagerWindow; @property (readonly) IBOutlet NSWindow *saveFileMigrationSheet; @property (readonly) IBOutlet NSWindow *saveStatePrecloseSheet; @property (readonly) IBOutlet NSView *exportRomSavePanelAccessoryView; @property (readonly) NSImage *iconExecute; @property (readonly) NSImage *iconPause; @property (readonly) NSImage *iconSpeedNormal; @property (readonly) NSImage *iconSpeedDouble; @property (readonly) BOOL masterExecuteFlag; @property (readonly) NSInteger executionState; @property (readonly) CGFloat lastSetSpeedScalar; @property (readonly) CGFloat speedScalar; @property (assign) BOOL isWorking; @property (assign) BOOL isRomLoading; @property (assign) NSString *statusText; @property (assign) BOOL isSoftwareMicActive; @property (assign) BOOL isHardwareMicAvailable; @property (assign) BOOL isHardwareMicIdle; @property (assign) BOOL isHardwareMicInClip; @property (assign) float currentMicGainValue; @property (assign) float currentVolumeValue; @property (retain) NSImage *currentMicStatusIcon; @property (retain) NSImage *currentVolumeIcon; @property (assign) BOOL isShowingSaveStateDialog; @property (assign) BOOL isShowingFileMigrationDialog; @property (assign) BOOL isUserInterfaceBlockingExecution; @property (retain) NSURL *currentSaveStateURL; @property (assign) NSInteger selectedExportRomSaveID; @property (assign) NSInteger selectedRomSaveTypeID; @property (assign) NSInteger frameJumpType; @property (assign) NSInteger frameJumpFramesForward; @property (assign) NSInteger frameJumpToFrame; @property (retain) DisplayWindowController *mainWindow; @property (readonly) NSMutableArray *windowList; // File Menu - (IBAction) newDisplayWindow:(id)sender; - (IBAction) openRom:(id)sender; - (IBAction) loadRecentRom:(id)sender; - (IBAction) closeRom:(id)sender; - (IBAction) revealRomInFinder:(id)sender; - (IBAction) revealGameDataFolderInFinder:(id)sender; - (IBAction) openEmuSaveState:(id)sender; - (IBAction) saveEmuSaveState:(id)sender; - (IBAction) saveEmuSaveStateAs:(id)sender; - (IBAction) revertEmuSaveState:(id)sender; - (IBAction) loadEmuSaveStateSlot:(id)sender; - (IBAction) saveEmuSaveStateSlot:(id)sender; - (IBAction) openReplay:(id)sender; - (IBAction) recordReplay:(id)sender; - (IBAction) stopReplay:(id)sender; - (IBAction) importRomSave:(id)sender; - (IBAction) exportRomSave:(id)sender; // Emulation Menu - (IBAction) toggleSpeedLimiter:(id)sender; - (IBAction) toggleAutoFrameSkip:(id)sender; - (IBAction) toggleCheats:(id)sender; - (IBAction) toggleExecutePause:(id)sender; - (IBAction) coreExecute:(id)sender; - (IBAction) corePause:(id)sender; - (IBAction) frameAdvance:(id)sender; - (IBAction) frameJump:(id)sender; - (IBAction) reset:(id)sender; - (IBAction) changeRomSaveType:(id)sender; // View Menu - (IBAction) toggleAllDisplays:(id)sender; // Tools Menu - (IBAction) autoholdSet:(id)sender; - (IBAction) toggleGPUState:(id)sender; - (IBAction) toggleGDBStubActivate:(id)sender; - (IBAction) changeCoreSpeed:(id)sender; - (IBAction) changeCoreEmuFlags:(id)sender; - (IBAction) changeFirmwareSettings:(id)sender; - (IBAction) changeHardwareMicGain:(id)sender; - (IBAction) changeHardwareMicMute:(id)sender; - (IBAction) changeVolume:(id)sender; - (IBAction) changeAudioEngine:(id)sender; - (IBAction) changeSpuAdvancedLogic:(id)sender; - (IBAction) changeSpuInterpolationMode:(id)sender; - (IBAction) changeSpuSyncMode:(id)sender; - (IBAction) changeSpuSyncMethod:(id)sender; // Misc IBActions - (IBAction) chooseSlot1R4Directory:(id)sender; - (IBAction) slot1Eject:(id)sender; - (IBAction) writeDefaults3DRenderingSettings:(id)sender; - (IBAction) writeDefaultsEmulationSettings:(id)sender; - (IBAction) writeDefaultsSlot1Settings:(id)sender; - (IBAction) writeDefaultsSoundSettings:(id)sender; - (IBAction) closeSheet:(id)sender; - (void) cmdUpdateDSController:(NSValue *)cmdAttrValue; - (void) cmdUpdateDSControllerWithTurbo:(NSValue *)cmdAttrValue; - (void) cmdUpdateDSTouch:(NSValue *)cmdAttrValue; - (void) cmdUpdateDSMicrophone:(NSValue *)cmdAttrValue; - (void) cmdUpdateDSPaddle:(NSValue *)cmdAttrValue; - (void) cmdLoadEmuSaveStateSlot:(NSValue *)cmdAttrValue; - (void) cmdSaveEmuSaveStateSlot:(NSValue *)cmdAttrValue; - (void) cmdCopyScreen:(NSValue *)cmdAttrValue; - (void) cmdRotateDisplayRelative:(NSValue *)cmdAttrValue; - (void) cmdToggleAllDisplays:(NSValue *)cmdAttrValue; - (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue; - (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue; - (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue; - (void) cmdToggleCheats:(NSValue *)cmdAttrValue; - (void) cmdToggleExecutePause:(NSValue *)cmdAttrValue; - (void) cmdCoreExecute:(NSValue *)cmdAttrValue; - (void) cmdCorePause:(NSValue *)cmdAttrValue; - (void) cmdFrameAdvance:(NSValue *)cmdAttrValue; - (void) cmdFrameJump:(NSValue *)cmdAttrValue; - (void) cmdReset:(NSValue *)cmdAttrValue; - (void) cmdToggleGPUState:(NSValue *)cmdAttrValue; - (BOOL) handleLoadRomByURL:(NSURL *)fileURL; - (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL; - (BOOL) loadRomByURL:(NSURL *)romURL asynchronous:(BOOL)willLoadAsync; - (void) loadRomDidFinish:(NSNotification *)aNotification; - (BOOL) unloadRom; - (void) addOutputToCore:(CocoaDSOutput *)theOutput; - (void) removeOutputFromCore:(CocoaDSOutput *)theOutput; - (void) changeCoreSpeedWithDouble:(double)newSpeedScalar; - (void) executeCore; - (void) pauseCore; - (void) restoreCoreState; - (void) updateMicStatusIcon; - (AudioSampleBlockGenerator *) selectedAudioFileGenerator; - (void) setSelectedAudioFileGenerator:(AudioSampleBlockGenerator *)theGenerator; - (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndChooseSlot1R4Directory:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void) updateAllWindowTitles; - (void) updateDisplayPanelTitles; - (void) setupUserDefaults; @end desmume-0.9.11/src/cocoa/userinterface/cheatWindowDelegate.h0000755000000000000000000001065412467662066022561 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import @class CocoaDSCheatItem; @class CocoaDSCheatManager; @class CocoaDSCheatSearch; @class CocoaDSCheatSearchParams; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface CheatWindowDelegate : NSObject #else @interface CheatWindowDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSBox *cheatConfigBox; NSView *cheatSearchView; NSTableView *cheatListTable; NSTableView *cheatSearchListTable; NSArrayController *cheatListController; NSArrayController *cheatSearchListController; NSArrayController *cheatDatabaseController; NSObjectController *cheatWindowController; NSObjectController *cheatSelectedItemController; NSView *currentView; NSView *viewConfigureNoSelection; NSView *viewConfigureInternalCheat; NSView *viewConfigureActionReplayCheat; NSView *viewConfigureCodeBreakerCheat; NSView *currentSearchStyleView; NSView *viewSearchNoSelection; NSView *viewSearchExactValue; NSView *viewSearchComparativeStart; NSView *viewSearchComparativeContinue; NSSearchField *searchField; NSWindow *cheatDatabaseSheet; NSUInteger untitledCount; NSMutableDictionary *bindings; CocoaDSCheatItem *workingCheat; CocoaDSCheatManager *cdsCheats; CocoaDSCheatSearch *cdsCheatSearch; } @property (assign) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSBox *cheatConfigBox; @property (readonly) IBOutlet NSView *cheatSearchView; @property (readonly) IBOutlet NSTableView *cheatListTable; @property (readonly) IBOutlet NSTableView *cheatSearchListTable; @property (readonly) IBOutlet NSArrayController *cheatListController; @property (readonly) IBOutlet NSArrayController *cheatSearchListController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSObjectController *cheatSelectedItemController; @property (readonly) IBOutlet NSView *viewConfigureNoSelection; @property (readonly) IBOutlet NSView *viewConfigureInternalCheat; @property (readonly) IBOutlet NSView *viewConfigureActionReplayCheat; @property (readonly) IBOutlet NSView *viewConfigureCodeBreakerCheat; @property (readonly) IBOutlet NSView *viewSearchNoSelection; @property (readonly) IBOutlet NSView *viewSearchExactValue; @property (readonly) IBOutlet NSView *viewSearchComparativeStart; @property (readonly) IBOutlet NSView *viewSearchComparativeContinue; @property (readonly) IBOutlet NSSearchField *searchField; @property (readonly) IBOutlet NSWindow *cheatDatabaseSheet; @property (assign) NSUInteger untitledCount; @property (readonly) NSMutableDictionary *bindings; @property (retain) CocoaDSCheatItem *workingCheat; @property (retain) CocoaDSCheatManager *cdsCheats; @property (readonly) CocoaDSCheatSearch *cdsCheatSearch; - (IBAction) addToList:(id)sender; - (IBAction) removeFromList:(id)sender; - (IBAction) viewDatabase:(id)sender; - (IBAction) setInternalCheatValue:(id)sender; - (IBAction) applyConfiguration:(id)sender; - (IBAction) selectCheatType:(id)sender; - (IBAction) selectCheatSearchStyle:(id)sender; - (IBAction) runExactValueSearch:(id)sender; - (IBAction) runComparativeSearch:(id)sender; - (void) searchDidFinish:(NSNotification *)aNotification; - (IBAction) resetSearch:(id)sender; - (void) setCheatConfigViewByType:(NSInteger)cheatTypeID; - (void) setCheatSearchViewByStyle:(NSInteger)searchStyleID; - (IBAction) selectAllCheatsInDatabase:(id)sender; - (IBAction) selectNoneCheatsInDatabase:(id)sender; - (void) addSelectedFromCheatDatabase; - (IBAction) closeCheatDatabaseSheet:(id)sender; - (void) didEndCheatDatabaseSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; @end desmume-0.9.11/src/cocoa/userinterface/preferencesWindowDelegate.h0000755000000000000000000001176312467662066024000 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #import #import "inputPrefsView.h" @class CocoaVideoFilter; class OGLImage; @interface DisplayPreviewView : NSView { OGLImage *oglImage; NSOpenGLContext *context; CGLContextObj cglDisplayContext; bool isPreviewImageLoaded; } @property (assign) BOOL filtersPreferGPU; @property (assign) BOOL sourceDeposterize; @property (assign) NSInteger pixelScaler; @property (assign) NSInteger outputFilter; @end #pragma mark - #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface PreferencesWindowDelegate : NSObject #else @interface PreferencesWindowDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSToolbar *toolbar; NSWindow *firmwareConfigSheet; NSObjectController *cdsCoreController; NSObjectController *emuController; NSObjectController *prefWindowController; NSObjectController *cheatWindowController; NSArrayController *cheatDatabaseController; NSView *viewGeneral; InputPrefsView *viewInput; NSView *viewDisplay; NSView *viewSound; NSView *viewEmulation; NSDictionary *prefViewDict; NSPopUpButton *displayRotationMenu; NSMenuItem *displayRotationMenuCustomItem; NSTextField *displayRotationField; NSImage *iconVolumeFull; NSImage *iconVolumeTwoThird; NSImage *iconVolumeOneThird; NSImage *iconVolumeMute; NSPopUpButton *spuSyncMethodMenu; DisplayPreviewView *previewView; NSMutableDictionary *bindings; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSToolbar *toolbar; @property (readonly) IBOutlet NSWindow *firmwareConfigSheet; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSObjectController *emuController; @property (readonly) IBOutlet NSObjectController *prefWindowController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController; @property (readonly) IBOutlet NSView *viewGeneral; @property (readonly) IBOutlet InputPrefsView *viewInput; @property (readonly) IBOutlet NSView *viewDisplay; @property (readonly) IBOutlet NSView *viewSound; @property (readonly) IBOutlet NSView *viewEmulation; @property (readonly) IBOutlet NSPopUpButton *displayRotationMenu; @property (readonly) IBOutlet NSMenuItem *displayRotationMenuCustomItem; @property (readonly) IBOutlet NSTextField *displayRotationField; @property (readonly) IBOutlet NSPopUpButton *spuSyncMethodMenu; @property (readonly) IBOutlet DisplayPreviewView *previewView; @property (readonly) NSMutableDictionary *bindings; - (IBAction) changePrefView:(id)sender; - (IBAction) chooseAdvansceneDatabase:(id)sender; - (void) chooseAdvansceneDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) chooseRomForAutoload:(id)sender; - (void) chooseRomForAutoloadDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) chooseCheatDatabase:(id)sender; - (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) selectDisplayRotation:(id)sender; - (void) updateDisplayRotationMenu:(double)displayRotation; - (IBAction) updateFiltersPreferGPU:(id)sender; - (IBAction) updateSourceDeposterize:(id)sender; - (IBAction) selectOutputFilter:(id)sender; - (IBAction) selectPixelScaler:(id)sender; - (IBAction) updateVolumeIcon:(id)sender; - (IBAction) selectSPUSyncMode:(id)sender; - (IBAction) selectSPUSyncMethod:(id)sender; - (IBAction) chooseARM9BiosImage:(id)sender; - (IBAction) chooseARM7BiosImage:(id)sender; - (IBAction) chooseFirmwareImage:(id)sender; - (void) chooseArm9BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void) chooseArm7BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void) chooseFirmwareImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) configureInternalFirmware:(id)sender; - (IBAction) closeFirmwareConfigSheet:(id)sender; - (void) didEndFirmwareConfigSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) switchContentView:(NSView *)theView; - (void) setupUserDefaults; @end desmume-0.9.11/src/cocoa/userinterface/RomInfoPanel.h0000755000000000000000000000414512467662066021201 0ustar rootroot/* Copyright (C) 2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #define ROMINFO_PANEL_SECTION_HEADER_HEIGHT 22 @interface RomInfoPanelSectionView : NSView { NSButton *disclosureButton; NSTextField *sectionLabel; CGFloat expandedHeight; CGFloat collapsedHeight; CGFloat contentHeight; } @property (readonly) IBOutlet NSButton *disclosureButton; @property (readonly) IBOutlet NSTextField *sectionLabel; @property (assign) BOOL isExpanded; @property (readonly) CGFloat expandedHeight; @property (readonly) CGFloat collapsedHeight; @property (readonly) CGFloat contentHeight; - (NSString *) stringFromSectionLabel; @end @interface RomInfoContentView : NSView @end @interface RomInfoPanel : NSPanel { NSSize _panelMaxSize; NSSize _mainViewMaxSize; RomInfoPanelSectionView *generalSectionView; RomInfoPanelSectionView *titlesSectionView; RomInfoPanelSectionView *armBinariesSectionView; RomInfoPanelSectionView *fileSystemSectionView; RomInfoPanelSectionView *miscSectionView; NSArray *_sectionViewList; } @property (readonly) IBOutlet RomInfoPanelSectionView *generalSectionView; @property (readonly) IBOutlet RomInfoPanelSectionView *titlesSectionView; @property (readonly) IBOutlet RomInfoPanelSectionView *armBinariesSectionView; @property (readonly) IBOutlet RomInfoPanelSectionView *fileSystemSectionView; @property (readonly) IBOutlet RomInfoPanelSectionView *miscSectionView; - (IBAction) toggleViewState:(id)sender; - (void) autoLayout; - (void) setupUserDefaults; - (void) writeDefaults; @end desmume-0.9.11/src/cocoa/userinterface/inputPrefsView.mm0000755000000000000000000010332412467662066022023 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "inputPrefsView.h" #import "InputProfileController.h" #import "preferencesWindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_util.h" #define INPUT_HOLD_TIME 0.1 // Time in seconds to hold a button in its on state when mapping an input. @implementation InputPrefsView @synthesize dummyObject; @synthesize prefWindow; @synthesize inputProfileMenu; @synthesize inputProfilePreviousButton; @synthesize inputProfileNextButton; @synthesize inputPrefOutlineView; @synthesize inputSettingsController; @synthesize inputProfileController; @synthesize inputSettingsNDSInput; @synthesize inputSettingsMicrophone; @synthesize inputSettingsTouch; @synthesize inputSettingsLoadStateSlot; @synthesize inputSettingsSaveStateSlot; @synthesize inputSettingsSetSpeedLimit; @synthesize inputSettingsGPUState; @synthesize inputSettingsPaddleController; @synthesize inputProfileSheet; @synthesize inputProfileRenameSheet; @synthesize inputManager; @dynamic configInputTargetID; @synthesize inputSettingsInEdit; - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self == nil) { return self; } // Note that we manually reconstruct the profile dictionaries down to the mappings since // we depend on the input lists having unique pointers. In other words, since all empty // NSArrays have the same pointer, we remake them into NSMutableArrays to force their // pointers to be unique. The reason we do this is because commandTagFromInputList: depends // on searching for unique pointers to match up command tags. If we don't do this, there // will be duplicate entries in the NSOutlineViews for every empty input list. NSDictionary *defaultKeyMappingsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; NSArray *internalDefaultProfilesList = (NSArray *)[defaultKeyMappingsDict valueForKey:@"DefaultInputProfiles"]; _defaultProfileListCount = [internalDefaultProfilesList count]; defaultProfilesList = [[NSMutableArray alloc] initWithCapacity:_defaultProfileListCount]; for (NSDictionary *theProfile in internalDefaultProfilesList) { NSMutableDictionary *reconstructedProfile = [[NSMutableDictionary alloc] initWithCapacity:[theProfile count]]; for (NSString *profileKey in theProfile) { if ([profileKey isEqualToString:@"Mappings"]) { NSDictionary *profileMappings = (NSDictionary *)[theProfile objectForKey:profileKey]; NSMutableDictionary *reconstructedMappings = [[NSMutableDictionary alloc] initWithCapacity:[profileMappings count]]; for (NSString *mappingKey in profileMappings) { NSArray *inputList = (NSArray *)[profileMappings objectForKey:mappingKey]; NSMutableArray *newInputList = [[NSMutableArray alloc] initWithArray:inputList copyItems:YES]; [reconstructedMappings setObject:[newInputList autorelease] forKey:mappingKey]; } [reconstructedProfile setObject:[reconstructedMappings autorelease] forKey:profileKey]; } else { [reconstructedProfile setObject:[theProfile objectForKey:profileKey] forKey:profileKey]; } } [defaultProfilesList addObject:[reconstructedProfile autorelease]]; } savedProfilesList = [[NSMutableArray alloc] initWithCapacity:32]; configInputTargetID = nil; configInputList = [[NSMutableDictionary alloc] initWithCapacity:128]; inputSettingsInEdit = nil; return self; } - (void)dealloc { [configInputList release]; [inputSettingsMappings release]; [savedProfilesList release]; [super dealloc]; } #pragma mark Dynamic Properties - (void) setConfigInputTargetID:(NSString *)targetID { if (targetID == nil) { [configInputTargetID release]; } configInputTargetID = [targetID retain]; [[self inputManager] setHidInputTarget:(targetID == nil) ? nil : self]; } - (NSString *) configInputTargetID { return configInputTargetID; } #pragma mark Class Methods - (void) initSettingsSheets { inputSettingsMappings = [[NSDictionary alloc] initWithObjectsAndKeys: inputSettingsNDSInput, @"Up", inputSettingsNDSInput, @"Down", inputSettingsNDSInput, @"Right", inputSettingsNDSInput, @"Left", inputSettingsNDSInput, @"A", inputSettingsNDSInput, @"B", inputSettingsNDSInput, @"X", inputSettingsNDSInput, @"Y", inputSettingsNDSInput, @"L", inputSettingsNDSInput, @"R", inputSettingsNDSInput, @"Start", inputSettingsNDSInput, @"Select", inputSettingsMicrophone, @"Microphone", inputSettingsTouch, @"Touch", inputSettingsLoadStateSlot, @"Load State Slot", inputSettingsSaveStateSlot, @"Save State Slot", inputSettingsSetSpeedLimit, @"Set Speed", inputSettingsGPUState, @"Enable/Disable GPU State", inputSettingsPaddleController, @"Paddle", nil]; } - (void) loadSavedProfilesList { NSArray *userDefaultsSavedProfilesList = (NSArray *)[[NSUserDefaults standardUserDefaults] arrayForKey:@"Input_SavedProfiles"]; [savedProfilesList removeAllObjects]; for (NSDictionary *theProfile in userDefaultsSavedProfilesList) { NSMutableDictionary *reconstructedProfile = [[NSMutableDictionary alloc] initWithCapacity:[theProfile count]]; for (NSString *profileKey in theProfile) { if ([profileKey isEqualToString:@"Mappings"]) { NSDictionary *profileMappings = (NSDictionary *)[theProfile objectForKey:profileKey]; NSMutableDictionary *reconstructedMappings = [[NSMutableDictionary alloc] initWithCapacity:[profileMappings count]]; for (NSString *mappingKey in profileMappings) { NSArray *inputList = (NSArray *)[profileMappings objectForKey:mappingKey]; NSMutableArray *newInputList = [[NSMutableArray alloc] initWithArray:inputList copyItems:YES]; [reconstructedMappings setObject:[newInputList autorelease] forKey:mappingKey]; } [reconstructedProfile setObject:[reconstructedMappings autorelease] forKey:profileKey]; } else { [reconstructedProfile setObject:[theProfile objectForKey:profileKey] forKey:profileKey]; } } [savedProfilesList addObject:[reconstructedProfile autorelease]]; } } - (void) populateInputProfileMenu { NSDictionary *defaultKeyMappingsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; NSArray *defaultProfileList = [defaultKeyMappingsDict valueForKey:@"DefaultInputProfiles"]; if (defaultKeyMappingsDict == nil || defaultProfileList == nil) { return; } // We're going to populate this menu from scratch, so remove all existing profile items. NSMenu *profileMenu = [inputProfileMenu menu]; NSInteger menuItemCount = [profileMenu numberOfItems] - 2; for (NSInteger i = 0; i < menuItemCount; i++) { [profileMenu removeItemAtIndex:i]; } // Need this to keep track of profile indexes. NSInteger profileIndex = 0; // Add the menu items for the default profiles. for (NSUInteger i = 0; i < _defaultProfileListCount; i++) { NSDictionary *profileDict = [defaultProfileList objectAtIndex:i]; NSString *profileName = (NSString *)[profileDict valueForKey:@"Name"]; if (profileName == nil) { profileName = @""; } NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:profileName action:@selector(profileSelect:) keyEquivalent:@""] autorelease]; [newProfileMenuItem setTag:profileIndex]; [newProfileMenuItem setTarget:self]; [profileMenu insertItem:newProfileMenuItem atIndex:profileIndex]; profileIndex++; } // Add a separator item in between default profiles and user saved profiles. [[inputProfileMenu menu] insertItem:[NSMenuItem separatorItem] atIndex:profileIndex]; // Add the menu items for the user saved profiles. if ([savedProfilesList count] < 1) { [inputProfileMenu insertItemWithTitle:NSSTRING_INPUTPREF_NO_SAVED_PROFILES atIndex:profileIndex+1]; NSMenuItem *noSavedConfigItem = [inputProfileMenu itemAtIndex:profileIndex+1]; [noSavedConfigItem setEnabled:NO]; } else { for (NSUInteger i = 0; i < [savedProfilesList count]; i++) { NSDictionary *profileDict = [savedProfilesList objectAtIndex:i]; NSString *profileName = (NSString *)[profileDict valueForKey:@"Name"]; if (profileName == nil) { profileName = @""; } NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:profileName action:@selector(profileSelect:) keyEquivalent:@""] autorelease]; [newProfileMenuItem setTag:profileIndex]; [newProfileMenuItem setTarget:self]; [profileMenu insertItem:newProfileMenuItem atIndex:profileIndex+1]; profileIndex++; } } [inputProfileMenu selectItemAtIndex:0]; [self profileSelect:[inputProfileMenu itemAtIndex:0]]; } - (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed { const InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed); return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; } - (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed { const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([mouseEvent buttonNumber], NSMakePoint(0.0f, 0.0f), buttonPressed); return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; } - (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag { BOOL didMap = NO; if (commandTag == nil) { return didMap; } const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding]; if (cmdTag == NULL) { return didMap; } // Add the input mapping. const CommandAttributes cmdAttr = [inputManager defaultCommandAttributesForCommandTag:cmdTag]; [inputManager addMappingUsingInputAttributes:inputAttr commandAttributes:&cmdAttr]; [inputManager writeDefaultsInputMappings]; // If we're dealing with a Microphone command, update the audio file generators list. if ([commandTag isEqualToString:@"Microphone"]) { [inputManager updateAudioFileGenerators]; } // Deselect the row of the command tag. NSDictionary *inputMappings = [inputManager inputMappings]; NSArray *mappingList = (NSArray *)[inputMappings valueForKey:[self configInputTargetID]]; const NSInteger rowNumber = [inputPrefOutlineView rowForItem:mappingList]; if (rowNumber != -1) { [inputPrefOutlineView deselectRow:rowNumber]; } // Update all expanded command tags. for (NSString *tag in inputMappings) { NSArray *inputList = (NSArray *)[inputMappings valueForKey:tag]; if ([inputPrefOutlineView isItemExpanded:inputList]) { [inputPrefOutlineView reloadItem:inputList reloadChildren:YES]; } } [self setConfigInputTargetID:nil]; didMap = YES; return didMap; } - (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo { if (deviceInfo == nil) { return; } NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"]; NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"]; const char *devCode = [deviceCode cStringUsingEncoding:NSUTF8StringEncoding]; const char *elCode = [elementCode cStringUsingEncoding:NSUTF8StringEncoding]; CommandAttributes cmdAttr = [inputManager mappedCommandAttributesOfDeviceCode:devCode elementCode:elCode]; UpdateCommandAttributesWithDeviceInfoDictionary(&cmdAttr, deviceInfo); [inputManager updateInputSettingsSummaryInDeviceInfoDictionary:deviceInfo commandTag:cmdAttr.tag]; [inputManager setMappedCommandAttributes:&cmdAttr deviceCode:devCode elementCode:elCode]; [inputManager writeDefaultsInputMappings]; // If we're dealing with a Microphone command, update the audio file generators list. if (strncmp(cmdAttr.tag, "Microphone", INPUT_HANDLER_STRING_LENGTH) == 0) { [inputManager updateAudioFileGenerators]; } } - (BOOL) doesProfileNameExist:(NSString *)profileName { BOOL doesExist = NO; for (NSMutableDictionary *savedProfile in savedProfilesList) { NSString *savedProfileName = (NSString *)[savedProfile valueForKey:@"Name"]; if ([savedProfileName isEqualToString:profileName]) { doesExist = YES; break; } } return doesExist; } - (void) updateSelectedProfileName { NSInteger profileID = [inputProfileMenu indexOfSelectedItem]; NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; if (profileID < (NSInteger)_defaultProfileListCount || selectedProfile == nil) { return; } NSString *profileName = (NSString *)[selectedProfile valueForKey:@"Name"]; if (profileName == nil) { profileName = @""; } [[inputProfileMenu selectedItem] setTitle:profileName]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; } - (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; NSOutlineView *outlineView = (NSOutlineView *)contextInfo; NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content]; NSMutableDictionary *deviceInfoInEdit = [self inputSettingsInEdit]; switch (returnCode) { case NSCancelButton: break; case NSOKButton: [deviceInfoInEdit setDictionary:editedDeviceInfo]; [self setMappingUsingDeviceInfoDictionary:deviceInfoInEdit]; [outlineView reloadItem:deviceInfoInEdit reloadChildren:NO]; break; default: break; } [inputSettingsController setContent:nil]; [self setInputSettingsInEdit:nil]; } - (void) didEndProfileSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; } - (void) didEndProfileRenameSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; } #pragma mark InputHIDManagerTarget Protocol - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue hidManager:(InputHIDManager *)hidManager { BOOL isHandled = NO; NSString *cmdTagTarget = [self configInputTargetID]; if (cmdTagTarget == nil) { ClearHIDQueue(hidQueue); return isHandled; } CommandAttributes cmdAttr = [[hidManager inputManager] defaultCommandAttributesForCommandTag:[cmdTagTarget cStringUsingEncoding:NSUTF8StringEncoding]]; bool forceDigitalInput = !cmdAttr.allowAnalogInput; InputAttributesList inputList = InputManagerEncodeHIDQueue(hidQueue, [hidManager inputManager], forceDigitalInput); const size_t inputCount = inputList.size(); for (size_t i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = inputList[i]; NSString *inputKey = [NSString stringWithFormat:@"%s:%s", inputAttr.deviceCode, inputAttr.elementCode]; NSDate *inputOnDate = [configInputList valueForKey:inputKey]; if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON) { if (inputOnDate == nil) { [configInputList setValue:[NSDate date] forKey:inputKey]; } } else { if (inputOnDate != nil) { if (([inputOnDate timeIntervalSinceNow] * -1.0) < INPUT_HOLD_TIME) { // If the button isn't held for at least INPUT_HOLD_TIME seconds, then reject the input. [configInputList setValue:nil forKey:inputKey]; } else { isHandled = [self addMappingUsingInputAttributes:&inputAttr commandTag:cmdTagTarget]; break; } } } } isHandled = YES; return isHandled; } #pragma mark NSOutlineViewDelegate Protocol - (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView { return NO; } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { if ([(NSString *)[tableColumn identifier] isEqualToString:@"InputCommandTagColumn"] || [(NSString *)[tableColumn identifier] isEqualToString:@"InputSettingsColumn"] || [(NSString *)[tableColumn identifier] isEqualToString:@"RemoveInputColumn"]) { return YES; } return NO; } - (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; if ([columnID isEqualToString:@"InputCommandTagColumn"]) { if ([item isKindOfClass:[NSArray class]]) { NSString *commandTag = [inputManager commandTagFromInputList:item]; if (commandTag != nil) { NSImage *buttonImage = (NSImage *)[[inputManager commandIcon] valueForKey:commandTag]; if (buttonImage == nil) { buttonImage = (NSImage *)[[inputManager commandIcon] valueForKey:@"UNKNOWN COMMAND"]; } [outCell setTitle:NSLocalizedString(commandTag, nil)]; [outCell setImage:buttonImage]; } else { outCell = [[[NSCell alloc] init] autorelease]; } } else { outCell = [[[NSCell alloc] init] autorelease]; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:5 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:5 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } else if ([columnID isEqualToString:@"InputSettingsColumn"]) { if ([item isKindOfClass:[NSDictionary class]]) { NSString *commandTag = [inputManager commandTagFromInputList:[outlineView parentForItem:item]]; NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag]; [outCell setEnabled:(theSheet == nil) ? NO : YES]; } else { outCell = [[[NSCell alloc] init] autorelease]; } } else if ([columnID isEqualToString:@"RemoveInputColumn"]) { if (![item isKindOfClass:[NSDictionary class]]) { outCell = [[[NSCell alloc] init] autorelease]; } } return outCell; } #pragma mark NSOutlineViewDataSource Protocol - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { if (item == nil) { NSString *commandTag = [[inputManager commandTagList] objectAtIndex:index]; return [[inputManager inputMappings] valueForKey:commandTag]; } else if ([item isKindOfClass:[NSArray class]]) { return [(NSArray *)item objectAtIndex:index]; } return nil; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { if ([item isKindOfClass:[NSArray class]]) { return YES; } return NO; } - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { NSInteger numberChildren = 0; if (item == nil) { numberChildren = [[inputManager commandTagList] count]; } else if ([item isKindOfClass:[NSArray class]]) { numberChildren = [(NSArray *)item count]; } return numberChildren; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; if ([columnID isEqualToString:@"InputCommandTagColumn"]) { if ([item isKindOfClass:[NSDictionary class]]) { return nil; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { if ([item isKindOfClass:[NSArray class]]) { const unsigned long inputCount = (unsigned long)[(NSArray *)item count]; return [NSString stringWithFormat:(inputCount != 1) ? NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED_PLURAL : NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED, inputCount]; } else if ([item isKindOfClass:[NSDictionary class]]) { return [item valueForKey:@"deviceInfoSummary"]; } return @""; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSString *settingsSummary = @""; if ([item isKindOfClass:[NSDictionary class]]) { settingsSummary = [item valueForKey:@"inputSettingsSummary"]; if (settingsSummary == nil) { settingsSummary = @""; } } return settingsSummary; } else if ([columnID isEqualToString:@"InputSettingsColumn"]) { return nil; } else if ([columnID isEqualToString:@"RemoveInputColumn"]) { return nil; } return item; } - (id)outlineView:(NSOutlineView *)outlineView persistentObjectForItem:(id)item { return [inputManager commandTagFromInputList:item]; } - (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object { NSString *commandTag = (NSString *)object; NSArray *inputList = (NSArray *)[[inputManager inputMappings] valueForKey:commandTag]; return inputList; } #pragma mark NSResponder Methods - (void)keyDown:(NSEvent *)theEvent { BOOL isHandled = [self handleKeyboardEvent:theEvent keyPressed:YES]; if (!isHandled) { [super keyDown:theEvent]; } } - (void)mouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButtonEvent:theEvent buttonPressed:YES]; if (!isHandled) { [super mouseDown:theEvent]; } } - (void)mouseDragged:(NSEvent *)theEvent { [self mouseDown:theEvent]; } - (void)rightMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButtonEvent:theEvent buttonPressed:YES]; if (!isHandled) { [super rightMouseDown:theEvent]; } } - (void)rightMouseDragged:(NSEvent *)theEvent { [self rightMouseDown:theEvent]; } - (void)otherMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButtonEvent:theEvent buttonPressed:YES]; if (!isHandled) { [super otherMouseDown:theEvent]; } } - (void)otherMouseDragged:(NSEvent *)theEvent { [self otherMouseDown:theEvent]; } - (BOOL)acceptsFirstResponder { return YES; } - (BOOL)becomeFirstResponder { return YES; } - (BOOL)resignFirstResponder { return YES; } #pragma mark IBAction Methods - (IBAction) setInputAdd:(id)sender { NSOutlineView *outlineView = (NSOutlineView *)sender; const NSInteger rowNumber = [outlineView clickedRow]; [configInputList removeAllObjects]; if ([outlineView isRowSelected:rowNumber]) { [outlineView deselectRow:rowNumber]; [self setConfigInputTargetID:nil]; } else { [outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:rowNumber] byExtendingSelection:NO]; NSArray *inputList = (NSArray *)[outlineView itemAtRow:rowNumber]; [self setConfigInputTargetID:[inputManager commandTagFromInputList:inputList]]; [prefWindow makeFirstResponder:self]; } } - (IBAction) removeInput:(id)sender { NSOutlineView *outlineView = (NSOutlineView *)sender; const NSInteger rowNumber = [outlineView clickedRow]; NSDictionary *deviceInfo = (NSDictionary *)[outlineView itemAtRow:rowNumber]; NSArray *inputList = (NSArray *)[outlineView parentForItem:deviceInfo]; [inputManager removeMappingUsingDeviceCode:[(NSString *)[deviceInfo valueForKey:@"deviceCode"] cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[(NSString *)[deviceInfo valueForKey:@"elementCode"] cStringUsingEncoding:NSUTF8StringEncoding]]; [inputManager writeDefaultsInputMappings]; [outlineView reloadItem:inputList reloadChildren:YES]; // If we're dealing with a Microphone command, update the audio file generators list. if ([[inputManager commandTagFromInputList:inputList] isEqualToString:@"Microphone"]) { [inputManager updateAudioFileGenerators]; } } - (IBAction) changeSpeed:(id)sender { NSMutableDictionary *deviceInfo = (NSMutableDictionary *)[inputSettingsController content]; if (deviceInfo != nil) { const float speedScalar = (float)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f; [deviceInfo setObject:[NSNumber numberWithFloat:speedScalar] forKey:@"floatValue0"]; } } - (IBAction) showSettingsSheet:(id)sender { NSOutlineView *outlineView = (NSOutlineView *)sender; const NSInteger rowNumber = [outlineView clickedRow]; [self setInputSettingsInEdit:(NSMutableDictionary *)[outlineView itemAtRow:rowNumber]]; NSString *commandTag = [inputManager commandTagFromInputList:[outlineView parentForItem:[self inputSettingsInEdit]]]; NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag]; if (theSheet == nil) { return; } [inputSettingsController setContent:[NSMutableDictionary dictionaryWithDictionary:[self inputSettingsInEdit]]]; [NSApp beginSheet:theSheet modalForWindow:prefWindow modalDelegate:self didEndSelector:@selector(didEndSettingsSheet:returnCode:contextInfo:) contextInfo:outlineView]; } - (IBAction) closeSettingsSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; [sheet makeFirstResponder:nil]; // Force end of editing of any text fields. [NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) profileNew:(id)sender { static NSUInteger untitledCount = 1; NSString *newProfileName = (untitledCount == 1) ? @"Untitled" : [NSString stringWithFormat:@"Untitled %ld", (unsigned long)untitledCount]; while([self doesProfileNameExist:newProfileName]) { newProfileName = [NSString stringWithFormat:@"Untitled %ld", (unsigned long)++untitledCount]; } // Reconstruct the mappings dictionary to use NSMutableArrays to prevent duplicate // entries from showing up in the NSOutlineView. NSDictionary *profileMappings = [inputManager inputMappings]; NSMutableDictionary *reconstructedMappings = [[NSMutableDictionary alloc] initWithCapacity:[profileMappings count]]; for (NSString *mappingKey in profileMappings) { NSArray *inputList = (NSArray *)[profileMappings objectForKey:mappingKey]; NSMutableArray *newInputList = [[NSMutableArray alloc] initWithArray:inputList copyItems:YES]; [reconstructedMappings setObject:[newInputList autorelease] forKey:mappingKey]; } NSMutableDictionary *newProfile = [NSMutableDictionary dictionaryWithObjectsAndKeys: newProfileName, @"Name", [NSNumber numberWithBool:NO], @"IsDefaultType", [reconstructedMappings autorelease], @"Mappings", nil]; [savedProfilesList addObject:newProfile]; const NSInteger profileIndex = _defaultProfileListCount + [savedProfilesList count] - 1; NSMenu *profileMenu = [inputProfileMenu menu]; NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:newProfileName action:@selector(profileSelect:) keyEquivalent:@""] autorelease]; [newProfileMenuItem setTag:profileIndex]; [newProfileMenuItem setTarget:self]; [profileMenu insertItem:newProfileMenuItem atIndex:profileIndex+1]; // Remove the "no items" menu item when the first profile is saved. if ([savedProfilesList count] == 1) { [inputProfileMenu removeItemAtIndex:profileIndex+2]; } [inputProfileMenu selectItemAtIndex:profileIndex+1]; [self profileSelect:newProfileMenuItem]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; // Give the user a chance to name the new profile. [self profileRename:nil]; } - (IBAction) profileView:(id)sender { [NSApp beginSheet:inputProfileSheet modalForWindow:prefWindow modalDelegate:self didEndSelector:@selector(didEndProfileSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) profileApply:(id)sender { NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; NSMutableDictionary *profileMappings = (NSMutableDictionary *)[selectedProfile valueForKey:@"Mappings"]; if (profileMappings != nil) { // Use setMappingsWithMappings: instead of replacing the input mappings // completely since we need to keep this particular pointer address for // the inputMappings dictionary. If we don't do this, the outline view // will desync. [inputManager setMappingsWithMappings:profileMappings]; [inputPrefOutlineView reloadData]; [inputManager writeDefaultsInputMappings]; } } - (IBAction) profileRename:(id)sender { [NSApp beginSheet:inputProfileRenameSheet modalForWindow:prefWindow modalDelegate:self didEndSelector:@selector(didEndProfileRenameSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) profileSave:(id)sender { NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; if (selectedProfile == nil) { return; } [selectedProfile setValue:[[[NSMutableDictionary alloc] initWithDictionary:[inputManager inputMappings] copyItems:YES] autorelease] forKey:@"Mappings"]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; } - (IBAction) profileDelete:(id)sender { NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; if (selectedProfile == nil) { return; } const NSInteger profileIndex = [inputProfileMenu indexOfSelectedItem] - 1; NSMenu *profileMenu = [inputProfileMenu menu]; [profileMenu removeItemAtIndex:[inputProfileMenu indexOfSelectedItem]]; [savedProfilesList removeObjectAtIndex:(profileIndex - _defaultProfileListCount)]; [inputProfileMenu selectItemAtIndex:0]; // Add the "no items" menu item if there are no profiles saved. if ([savedProfilesList count] < 1) { NSMenuItem *noSavedConfigItem = [[[NSMenuItem alloc] initWithTitle:NSSTRING_INPUTPREF_NO_SAVED_PROFILES action:NULL keyEquivalent:@""] autorelease]; [noSavedConfigItem setEnabled:NO]; [profileMenu insertItem:noSavedConfigItem atIndex:profileIndex+1]; } else // Update the profile indices in the menu tags. { for (NSUInteger i = 0; i < [savedProfilesList count]; i++) { [[profileMenu itemAtIndex:_defaultProfileListCount+i+1] setTag:_defaultProfileListCount+i]; } } [self profileSelect:[inputProfileMenu itemAtIndex:0]]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; } - (IBAction) profileSelect:(id)sender { const NSInteger profileID = [CocoaDSUtil getIBActionSenderTag:sender]; if (profileID < 0 || profileID >= (NSInteger)(_defaultProfileListCount + [savedProfilesList count])) { return; } NSArray *profileList = (profileID < (NSInteger)_defaultProfileListCount) ? defaultProfilesList : savedProfilesList; [inputProfilePreviousButton setTag:profileID-1]; [inputProfilePreviousButton setEnabled:(profileID > 0) ? YES : NO]; [inputProfileNextButton setTag:profileID+1]; [inputProfileNextButton setEnabled:(profileID < ((NSInteger)_defaultProfileListCount + (NSInteger)[savedProfilesList count] - 1)) ? YES : NO]; if (![sender isMemberOfClass:[NSMenuItem class]]) { [inputProfileMenu selectItemAtIndex:(profileID < (NSInteger)_defaultProfileListCount) ? profileID : profileID+1]; } NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[profileList objectAtIndex:(profileID < (NSInteger)_defaultProfileListCount) ? profileID : (profileID - _defaultProfileListCount)]; [inputProfileController setContent:selectedProfile]; [[inputProfileController profileOutlineView] reloadData]; [[inputProfileController profileOutlineView] expandItem:nil expandChildren:YES]; } - (IBAction) closeProfileSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; [sheet makeFirstResponder:nil]; // Force end of editing of any text fields. [NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) closeProfileRenameSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; [sheet makeFirstResponder:nil]; // Force end of editing of any text fields. [NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) audioFileChoose:(id)sender { NSURL *selectedFileURL = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:@"Select Audio File"]; NSArray *fileTypes = [NSArray arrayWithObjects: @"3gp", @"3g2", @"aac", @"adts", @"ac3", @"aifc", @"aiff", @"aif", @"amr", @"caf", @"mpeg", @"mpa", @"mp1", @"mp2", @"mp3", @"mp4", @"m4a", @"snd", @"au", @"sd2", @"wav", nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFileURL = [[panel URLs] lastObject]; if(selectedFileURL == nil) { return; } NSString *selectedFilePath = [selectedFileURL path]; NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content]; [editedDeviceInfo setValue:selectedFilePath forKey:@"object0"]; [editedDeviceInfo setValue:[selectedFilePath lastPathComponent] forKey:@"object1"]; } } - (IBAction) audioFileChooseNone:(id)sender { NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content]; [editedDeviceInfo setValue:nil forKey:@"object0"]; [editedDeviceInfo setValue:nil forKey:@"object1"]; } #pragma mark NSControl Delegate Methods - (void)controlTextDidEndEditing:(NSNotification *)aNotification { // Called when the profile view sheet changes the profile name [self updateSelectedProfileName]; } @end desmume-0.9.11/src/cocoa/userinterface/preferencesWindowDelegate.mm0000755000000000000000000007321012467662066024155 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "preferencesWindowDelegate.h" #import "EmuControllerDelegate.h" #import "cocoa_core.h" #import "cocoa_cheat.h" #import "cocoa_globals.h" #import "cocoa_input.h" #import "cocoa_file.h" #import "cocoa_videofilter.h" #import "cocoa_util.h" #ifdef MAC_OS_X_VERSION_10_7 #include "../OGLDisplayOutput_3_2.h" #else #include "../OGLDisplayOutput.h" #endif #pragma mark - @implementation DisplayPreviewView @dynamic filtersPreferGPU; @dynamic sourceDeposterize; @dynamic pixelScaler; @dynamic outputFilter; - (id)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:frameRect]; if (self == nil) { return self; } isPreviewImageLoaded = false; // Initialize the OpenGL context NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24, NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8, NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)0, NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, (NSOpenGLPixelFormatAttribute)0, (NSOpenGLPixelFormatAttribute)0, (NSOpenGLPixelFormatAttribute)0 }; #ifdef _OGLDISPLAYOUTPUT_3_2_H_ // If we can support a 3.2 Core Profile context, then request that in our // pixel format attributes. if (IsOSXVersionSupported(10, 7, 0)) { attributes[8] = NSOpenGLPFAOpenGLProfile; attributes[9] = NSOpenGLProfileVersion3_2Core; OGLInfoCreate_Func = &OGLInfoCreate_3_2; } #endif NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; if (format == nil) { // If we can't get a 3.2 Core Profile context, then switch to using a // legacy context instead. attributes[8] = (NSOpenGLPixelFormatAttribute)0; attributes[9] = (NSOpenGLPixelFormatAttribute)0; OGLInfoCreate_Func = &OGLInfoCreate_Legacy; format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; } context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil]; [format release]; cglDisplayContext = (CGLContextObj)[context CGLContextObj]; CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); OGLInfo *oglInfo = OGLInfoCreate_Func(); oglImage = new OGLImage(oglInfo, 64, 64, frameRect.size.width, frameRect.size.height); oglImage->SetFiltersPreferGPUOGL(true); oglImage->SetSourceDeposterize(false); oglImage->SetOutputFilterOGL(OutputFilterTypeID_Bilinear); oglImage->SetPixelScalerOGL(VideoFilterTypeID_None); CGLSetCurrentContext(prevContext); return self; } - (void)dealloc { CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); delete oglImage; CGLSetCurrentContext(prevContext); [context clearDrawable]; [context release]; [super dealloc]; } - (void) setFiltersPreferGPU:(BOOL)theState { CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); oglImage->SetFiltersPreferGPUOGL(theState ? true : false); oglImage->ProcessOGL(); CGLSetCurrentContext(prevContext); } - (BOOL) filtersPreferGPU { return (oglImage->GetFiltersPreferGPU() ? YES : NO); } - (void) setSourceDeposterize:(BOOL)theState { CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); oglImage->SetSourceDeposterize(theState ? true : false); oglImage->ProcessOGL(); CGLSetCurrentContext(prevContext); } - (BOOL) sourceDeposterize { return (oglImage->GetSourceDeposterize() ? YES : NO); } - (void) setPixelScaler:(NSInteger)scalerID { CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); oglImage->SetPixelScalerOGL(scalerID); oglImage->ProcessOGL(); CGLSetCurrentContext(prevContext); } - (NSInteger) pixelScaler { return (NSInteger)oglImage->GetPixelScaler(); } - (void) setOutputFilter:(NSInteger)outputFilterID { CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); oglImage->SetOutputFilterOGL(outputFilterID); CGLSetCurrentContext(prevContext); } - (NSInteger) outputFilter { return (NSInteger)oglImage->GetOutputFilter(); } - (void) loadPreviewImage:(NSImage *)previewImage { NSArray *imageRepArray = [previewImage representations]; const NSBitmapImageRep *imageRep = [imageRepArray objectAtIndex:0]; const size_t previewWidth = (GLsizei)[previewImage size].width; const size_t previewHeight = (GLsizei)[previewImage size].height; // When an NSImage is loaded from file, it is loaded as ABGR (or RGBA for big-endian). // However, the OpenGL blitter takes BGRA format. Therefore, we need to convert the // pixel format before sending to OpenGL. uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; for (size_t i = 0; i < previewWidth * previewHeight; i++) { const uint32_t color = bitmapData[i]; #if defined(__i386__) || defined(__x86_64__) bitmapData[i] = 0xFF000000 | // lA ((color & 0x00FF0000) >> 16) | // lB -> lR (color & 0x0000FF00) | // lG ((color & 0x000000FF) << 16); // lR -> lB #else bitmapData[i] = 0xFF000000 | // lA ((color & 0xFF000000) >> 8) | // bR -> lR (color & 0x00FF0000) >> 8 | // bG -> lG ((color & 0x0000FF00) >> 8); // bB -> lB #endif } // Send the NSImage to OpenGL. CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); oglImage->LoadFrameOGL(bitmapData, 0, 0, previewWidth, previewHeight); oglImage->ProcessOGL(); CGLSetCurrentContext(prevContext); } - (BOOL)isOpaque { return YES; } - (void)lockFocus { [super lockFocus]; if ([context view] != self) { [context setView:self]; } } - (void)drawRect:(NSRect)dirtyRect { if (!isPreviewImageLoaded) { // Load the preview image. NSImage *previewImage = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"VideoFilterPreview_64x64" ofType:@"png"]]; [self loadPreviewImage:previewImage]; [previewImage release]; isPreviewImageLoaded = true; } CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); oglImage->RenderOGL(); glFlush(); CGLSetCurrentContext(prevContext); } @end #pragma mark - @implementation PreferencesWindowDelegate @synthesize dummyObject; @synthesize window; @synthesize toolbar; @synthesize firmwareConfigSheet; @synthesize cdsCoreController; @synthesize emuController; @synthesize prefWindowController; @synthesize cheatWindowController; @synthesize cheatDatabaseController; @synthesize viewGeneral; @synthesize viewInput; @synthesize viewDisplay; @synthesize viewSound; @synthesize viewEmulation; @synthesize displayRotationMenu; @synthesize displayRotationMenuCustomItem; @synthesize displayRotationField; @synthesize spuSyncMethodMenu; @synthesize previewView; @synthesize bindings; - (id)init { self = [super init]; if(self == nil) { return nil; } bindings = [[NSMutableDictionary alloc] init]; if (bindings == nil) { [self release]; self = nil; return self; } // Load the volume icons. iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]]; iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]]; iconVolumeMute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]]; [bindings setObject:iconVolumeFull forKey:@"volumeIconImage"]; prefViewDict = nil; return self; } - (void)dealloc { [iconVolumeFull release]; [iconVolumeTwoThird release]; [iconVolumeOneThird release]; [iconVolumeMute release]; [bindings release]; [prefViewDict release]; [super dealloc]; } - (IBAction) changePrefView:(id)sender { if (prefViewDict == nil) { // Associates NSView objects to their respective toolbar identifiers. prefViewDict = [[NSDictionary alloc] initWithObjectsAndKeys: viewGeneral, @"General", viewInput, @"Input", viewDisplay, @"Display", viewSound, @"Sound", viewEmulation, @"Emulation", nil]; } NSString *toolbarItemIdentifier = [[self toolbar] selectedItemIdentifier]; NSView *theView = [prefViewDict objectForKey:toolbarItemIdentifier]; if (theView != nil) { [self switchContentView:theView]; if ([toolbarItemIdentifier isEqualToString:@"Input"]) { [window makeFirstResponder:theView]; } } } - (IBAction) chooseRomForAutoload:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ROM_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseRomForAutoloadDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseRomForAutoloadDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseRomForAutoloadDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; // Temporarily set the autoload ROM option in user defaults to some neutral value first and synchronize. // When the user defaults are actually set later, this will force the proper state transitions to occur. [[NSUserDefaults standardUserDefaults] setInteger:ROMAUTOLOADOPTION_CHOOSE_ROM forKey:@"General_AutoloadROMOption"]; [[NSUserDefaults standardUserDefaults] synchronize]; if (returnCode == NSCancelButton) { [[NSUserDefaults standardUserDefaults] setInteger:ROMAUTOLOADOPTION_LOAD_NONE forKey:@"General_AutoloadROMOption"]; return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { [[NSUserDefaults standardUserDefaults] setInteger:ROMAUTOLOADOPTION_LOAD_NONE forKey:@"General_AutoloadROMOption"]; return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setInteger:ROMAUTOLOADOPTION_LOAD_SELECTED forKey:@"General_AutoloadROMOption"]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"General_AutoloadROMSelectedPath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"AutoloadRomName"]; } - (IBAction) chooseAdvansceneDatabase:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ADVANSCENE_DB_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ADVANSCENE_DB, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseAdvansceneDatabaseDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseAdvansceneDatabaseDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseAdvansceneDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"Advanscene_DatabasePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"AdvansceneDatabaseName"]; } - (IBAction) chooseCheatDatabase:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_R4_CHEAT_DB_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_R4_CHEAT_DB, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseCheatDatabaseDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseCheatDatabaseDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"R4Cheat_DatabasePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"R4CheatDatabaseName"]; const BOOL isRomLoaded = [(EmuControllerDelegate *)[emuController content] currentRom] != nil; NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; CocoaDSCheatManager *cdsCheats = (CocoaDSCheatManager *)[cheatWindowBindings valueForKey:@"cheatList"]; if (isRomLoaded == YES && cdsCheats != nil) { NSInteger error = 0; NSMutableArray *dbList = [cdsCheats cheatListFromDatabase:selectedFileURL errorCode:&error]; if (dbList != nil) { [cheatDatabaseController setContent:dbList]; NSString *titleString = cdsCheats.dbTitle; NSString *dateString = cdsCheats.dbDate; [cheatWindowBindings setValue:titleString forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:dateString forKey:@"cheatDBDate"]; [cheatWindowBindings setValue:[NSString stringWithFormat:@"%ld", (unsigned long)[dbList count]] forKey:@"cheatDBItemCount"]; } else { // TODO: Display an error message here. [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; switch (error) { case CHEATEXPORT_ERROR_FILE_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not load the database file!"); [cheatWindowBindings setValue:@"Database not loaded." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_WRONG_FILE_FORMAT: NSLog(@"R4 Cheat Database read failed! Wrong file format!"); [cheatWindowBindings setValue:@"Database load error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"FAILED TO LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_SERIAL_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not find the serial number for this game in the database!"); [cheatWindowBindings setValue:@"ROM not found in database." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"ROM not found." forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_EXPORT_FAILED: NSLog(@"R4 Cheat Database read failed! Could not read the database file!"); [cheatWindowBindings setValue:@"Database read error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT READ FILE" forKey:@"cheatDBDate"]; break; default: break; } } } } - (IBAction) selectDisplayRotation:(id)sender { const NSInteger displayRotation = [(NSMenuItem *)sender tag]; if (displayRotation != -1) { [[NSUserDefaults standardUserDefaults] setDouble:displayRotation forKey:@"DisplayView_Rotation"]; } } - (IBAction) updateFiltersPreferGPU:(id)sender { const BOOL theState = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; [[self previewView] setFiltersPreferGPU:theState]; [previewView setNeedsDisplay:YES]; } - (IBAction) updateSourceDeposterize:(id)sender { const BOOL theState = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; [[self previewView] setSourceDeposterize:theState]; [previewView setNeedsDisplay:YES]; } - (IBAction) selectOutputFilter:(id)sender { const NSInteger filterID = [CocoaDSUtil getIBActionSenderTag:sender]; [[NSUserDefaults standardUserDefaults] setInteger:filterID forKey:@"DisplayView_OutputFilter"]; [[self previewView] setOutputFilter:filterID]; [previewView setNeedsDisplay:YES]; } - (IBAction) selectPixelScaler:(id)sender { const NSInteger filterID = [CocoaDSUtil getIBActionSenderTag:sender]; [[NSUserDefaults standardUserDefaults] setInteger:filterID forKey:@"DisplayView_VideoFilter"]; [[self previewView] setPixelScaler:filterID]; [previewView setNeedsDisplay:YES]; } - (IBAction) updateVolumeIcon:(id)sender { NSImage *iconImage = (NSImage *)[bindings objectForKey:@"volumeIconImage"]; NSImage *newIconImage = nil; const float vol = [[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]; if (vol <= 0.0f) { newIconImage = iconVolumeMute; } else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) { newIconImage = iconVolumeOneThird; } else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) { newIconImage = iconVolumeTwoThird; } else { newIconImage = iconVolumeFull; } if (newIconImage == iconImage) { return; } [bindings setObject:newIconImage forKey:@"volumeIconImage"]; } - (IBAction) selectSPUSyncMode:(id)sender { const NSInteger spuSyncMode = [[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"]; [spuSyncMethodMenu setEnabled:(spuSyncMode == SPU_SYNC_MODE_DUAL_SYNC_ASYNC) ? NO : YES]; } - (IBAction) selectSPUSyncMethod:(id)sender { const NSInteger spuSyncMethod = [(NSMenuItem *)sender tag]; [[NSUserDefaults standardUserDefaults] setInteger:spuSyncMethod forKey:@"SPU_SyncMethod"]; } - (void) updateDisplayRotationMenu:(double)displayRotation { if (displayRotation == 0.0f || displayRotation == 90.0f || displayRotation == 180.0f || displayRotation == 270.0f) { [displayRotationMenu selectItemWithTag:(NSInteger)displayRotation]; } else if (displayRotation < 0.0f || displayRotation >= 360.0f) { displayRotation = 0.0f; [displayRotationField setFloatValue:displayRotation]; [displayRotationMenu selectItemWithTag:(NSInteger)displayRotation]; } else { [displayRotationMenu selectItem:displayRotationMenuCustomItem]; } } - (IBAction) chooseARM9BiosImage:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ARM9_IMAGE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseArm9BiosImageDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseArm9BiosImageDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (IBAction) chooseARM7BiosImage:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ARM7_IMAGE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseArm7BiosImageDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseArm7BiosImageDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (IBAction) chooseFirmwareImage:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_FIRMWARE_IMAGE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseFirmwareImageDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseFirmwareImageDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseArm9BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"BIOS_ARM9ImagePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"Arm9BiosImageName"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setArm9ImageURL:selectedFileURL]; } - (void) chooseArm7BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"BIOS_ARM7ImagePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"Arm7BiosImageName"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setArm7ImageURL:selectedFileURL]; } - (void) chooseFirmwareImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"Emulation_FirmwareImagePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"FirmwareImageName"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setFirmwareImageURL:selectedFileURL]; } - (IBAction) configureInternalFirmware:(id)sender { [NSApp beginSheet:firmwareConfigSheet modalForWindow:window modalDelegate:self didEndSelector:@selector(didEndFirmwareConfigSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) closeFirmwareConfigSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; const NSInteger code = [CocoaDSUtil getIBActionSenderTag:sender]; // Force end of editing of any text fields. [sheet makeFirstResponder:nil]; [NSApp endSheet:sheet returnCode:code]; } - (void) didEndFirmwareConfigSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; } - (void)controlTextDidEndEditing:(NSNotification *)aNotification { [self updateDisplayRotationMenu:[displayRotationField floatValue]]; } - (void) switchContentView:(NSView *)theView { if ([window contentView] == theView) { return; } NSRect newFrame = [window frameRectForContentRect:[theView frame]]; newFrame.origin.x = [window frame].origin.x; newFrame.origin.y = [window frame].origin.y + [[window contentView] frame].size.height - [theView frame].size.height; NSView *tempView = [[NSView alloc] initWithFrame:[[window contentView] frame]]; [window setContentView:tempView]; [window setFrame:newFrame display:YES animate:YES]; [window setContentView:theView]; [tempView release]; } - (void) setupUserDefaults { // Update input preferences. [viewInput loadSavedProfilesList]; // Update the SPU Sync controls in the Preferences window. if ([[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"] == SPU_SYNC_MODE_DUAL_SYNC_ASYNC) { [[self spuSyncMethodMenu] setEnabled:NO]; } else { [[self spuSyncMethodMenu] setEnabled:YES]; } // Set the menu for the display rotation. const double displayRotation = (double)[[NSUserDefaults standardUserDefaults] floatForKey:@"DisplayView_Rotation"]; [self updateDisplayRotationMenu:displayRotation]; // Set the default sound volume per user preferences. [self updateVolumeIcon:nil]; // Set the default video settings per user preferences. const BOOL filtersPreferGPU = [[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_FiltersPreferGPU"]; [[self previewView] setFiltersPreferGPU:filtersPreferGPU]; const BOOL sourceDeposterize = [[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_Deposterize"]; [[self previewView] setSourceDeposterize:sourceDeposterize]; const NSInteger pixelScalerID = [[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_VideoFilter"]; [[self previewView] setPixelScaler:pixelScalerID]; const NSInteger outputFilterID = [[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_OutputFilter"]; [[self previewView] setOutputFilter:outputFilterID]; // Set up file paths. NSString *arm7BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM7ImagePath"]; if (arm7BiosImagePath != nil) { [bindings setValue:[arm7BiosImagePath lastPathComponent] forKey:@"Arm7BiosImageName"]; } NSString *arm9BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM9ImagePath"]; if (arm9BiosImagePath != nil) { [bindings setValue:[arm9BiosImagePath lastPathComponent] forKey:@"Arm9BiosImageName"]; } NSString *firmwareImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Emulation_FirmwareImagePath"]; if (firmwareImagePath != nil) { [bindings setValue:[firmwareImagePath lastPathComponent] forKey:@"FirmwareImageName"]; } NSString *advansceneDatabasePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Advanscene_DatabasePath"]; if (advansceneDatabasePath != nil) { [bindings setValue:[advansceneDatabasePath lastPathComponent] forKey:@"AdvansceneDatabaseName"]; } NSString *cheatDatabasePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"R4Cheat_DatabasePath"]; if (cheatDatabasePath != nil) { [bindings setValue:[cheatDatabasePath lastPathComponent] forKey:@"R4CheatDatabaseName"]; } NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; if (autoloadRomPath != nil) { [bindings setValue:[autoloadRomPath lastPathComponent] forKey:@"AutoloadRomName"]; } else { [bindings setValue:NSSTRING_STATUS_NO_ROM_CHOSEN forKey:@"AutoloadRomName"]; } } #pragma mark NSWindowDelegate Protocol - (void)windowDidBecomeKey:(NSNotification *)notification { [prefWindowController setContent:bindings]; if ([viewInput configInputTargetID] != nil) { [[viewInput inputManager] setHidInputTarget:viewInput]; } } - (void)windowWillClose:(NSNotification *)notification { [viewInput setConfigInputTargetID:nil]; } @end desmume-0.9.11/src/cocoa/userinterface/InputProfileController.mm0000755000000000000000000001347112467662066023520 0ustar rootroot/* Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "InputProfileController.h" #import "cocoa_globals.h" @implementation InputProfileController @synthesize dummyObject; @synthesize inputManager; @synthesize profileOutlineView; - (id)init { self = [super init]; if (self == nil) { return self; } return self; } - (void)dealloc { [super dealloc]; } - (NSString *) commandTagFromInputList:(NSArray *)inputList { NSDictionary *mappings = [(NSDictionary *)[self content] valueForKey:@"Mappings"]; NSString *commandTag = nil; if (inputList == nil) { return commandTag; } for (NSString *tag in mappings) { if (inputList == [mappings valueForKey:tag]) { commandTag = tag; break; } } return commandTag; } #pragma mark NSOutlineViewDelegate Protocol - (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView { return NO; } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { if ([(NSString *)[tableColumn identifier] isEqualToString:@"InputCommandTagColumn"]) { return YES; } return NO; } - (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; if ([columnID isEqualToString:@"InputCommandIconColumn"]) { if ([item isKindOfClass:[NSArray class]]) { NSString *commandTag = [self commandTagFromInputList:item]; if (commandTag != nil) { NSImage *iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:commandTag]; if (iconImage == nil) { iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:@"UNKNOWN COMMAND"]; } [outCell setImage:iconImage]; } else { outCell = [[[NSCell alloc] init] autorelease]; } } else { outCell = [[[NSCell alloc] init] autorelease]; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:5 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:5 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } return outCell; } #pragma mark NSOutlineViewDataSource Protocol - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { if (item == nil) { NSDictionary *mappings = [(NSDictionary *)[self content] valueForKey:@"Mappings"]; NSString *commandTag = [[inputManager commandTagList] objectAtIndex:index]; return [mappings valueForKey:commandTag]; } else if ([item isKindOfClass:[NSArray class]]) { return [(NSArray *)item objectAtIndex:index]; } return nil; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { if ([item isKindOfClass:[NSArray class]]) { return YES; } return NO; } - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { NSInteger numberChildren = 0; if (item == nil) { numberChildren = [[inputManager commandTagList] count]; } else if ([item isKindOfClass:[NSArray class]]) { numberChildren = [(NSArray *)item count]; } return numberChildren; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; if ([columnID isEqualToString:@"InputCommandIconColumn"]) { NSString *commandTag = [self commandTagFromInputList:item]; if (commandTag != nil) { NSImage *iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:commandTag]; if (iconImage == nil) { iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:@"UNKNOWN COMMAND"]; } return iconImage; } else { return nil; } } else if ([columnID isEqualToString:@"InputCommandTagColumn"]) { if ([item isKindOfClass:[NSArray class]]) { NSString *tag = [self commandTagFromInputList:item]; return tag; } else { return @""; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { if ([item isKindOfClass:[NSArray class]]) { const unsigned long inputCount = (unsigned long)[(NSArray *)item count]; return [NSString stringWithFormat:(inputCount != 1) ? NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED_PLURAL : NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED, inputCount]; } else if ([item isKindOfClass:[NSDictionary class]]) { return [item valueForKey:@"deviceInfoSummary"]; } return @""; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSString *settingsSummary = @""; if ([item isKindOfClass:[NSDictionary class]]) { settingsSummary = [item valueForKey:@"inputSettingsSummary"]; } return settingsSummary; } return item; } @end desmume-0.9.11/src/cocoa/userinterface/troubleshootingWindowDelegate.h0000755000000000000000000000441312467662066024720 0ustar rootroot/* Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import enum TroubleshootingViewID { TROUBLESHOOTING_TECH_SUPPORT_VIEW_ID = 0, TROUBLESHOOTING_BUG_REPORT_VIEW_ID }; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface TroubleshootingWindowDelegate : NSObject #else @interface TroubleshootingWindowDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSObjectController *troubleshootingWindowController; NSObjectController *romInfoController; NSObjectController *emuControlController; NSObjectController *cdsCoreController; NSView *viewSupportRequest; NSView *viewBugReport; NSView *viewFinishedForm; NSView *currentForm; NSMutableDictionary *bindings; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSObjectController *troubleshootingWindowController; @property (readonly) IBOutlet NSObjectController *romInfoController; @property (readonly) IBOutlet NSObjectController *emuControlController; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSView *viewSupportRequest; @property (readonly) IBOutlet NSView *viewBugReport; @property (readonly) IBOutlet NSView *viewFinishedForm; @property (readonly) NSMutableDictionary *bindings; - (IBAction) copyRomInfoToTextFields:(id)sender; - (IBAction) continueToFinalForm:(id)sender; - (IBAction) backForm:(id)sender; - (IBAction) copyInfoToPasteboard:(id)sender; - (IBAction) goToWebpage:(id)sender; - (void) switchViewByID:(TroubleshootingViewID)viewID; - (void) clearAllText; - (void) switchContentView:(NSView *)theView; @end desmume-0.9.11/src/cocoa/userinterface/FileMigrationDelegate.mm0000755000000000000000000003720412467662066023220 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "FileMigrationDelegate.h" #import "cocoa_file.h" #import "cocoa_globals.h" @implementation FileMigrationDelegate @synthesize dummyObject; @synthesize window; @synthesize fileTreeOutlineView; @synthesize filesPresent; - (id)init { self = [super init]; if(self == nil) { return nil; } NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; _versionList = [[NSArray alloc] initWithArray:[fileTypeInfoRootDict valueForKey:@"VersionStrings"]]; NSDictionary *portStrings = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"PortStrings"]; _portStringsDict = [[NSMutableDictionary alloc] initWithCapacity:[portStrings count]]; for (NSString *versionKey in portStrings) { NSArray *portStringsList = (NSArray *)[portStrings valueForKey:versionKey]; NSMutableArray *newPortStringsList = [NSMutableArray arrayWithCapacity:[portStringsList count]]; for (NSString *portString in portStringsList) { [newPortStringsList addObject:[NSMutableString stringWithString:portString]]; } [_portStringsDict setObject:newPortStringsList forKey:versionKey]; } _fileTree = [[NSMutableDictionary alloc] initWithCapacity:100]; _fileTreeSelection = [[NSMutableDictionary alloc] initWithCapacity:1024]; _fileTreeVersionList = [[NSMutableArray alloc] initWithCapacity:[_versionList count] * [_portStringsDict count]]; filesPresent = NO; return self; } - (void)dealloc { [_versionList release]; [_portStringsDict release]; [_fileTree release]; [_fileTreeSelection release]; [_fileTreeVersionList release]; [super dealloc]; } - (void) updateFileList { NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *defaultPaths = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSFileManager *fileManager = [[NSFileManager alloc] init]; [_fileTree removeAllObjects]; [_fileTreeSelection removeAllObjects]; [_fileTreeVersionList removeAllObjects]; for (NSString *versionKey in _versionList) { NSArray *portStringsList = (NSArray *)[_portStringsDict valueForKey:versionKey]; if (portStringsList == nil || [portStringsList count] < 1) { continue; } for (NSString *portKey in portStringsList) { NSDictionary *pathsDict = (NSDictionary *)[(NSDictionary *)[defaultPaths valueForKey:versionKey] valueForKey:portKey]; if (pathsDict == nil || [pathsDict count] < 1) { continue; } NSMutableDictionary *newVersionTree = [NSMutableDictionary dictionaryWithCapacity:[pathsDict count]]; for (NSString *kindKey in pathsDict) { NSMutableArray *fileList = [NSMutableArray arrayWithCapacity:128]; NSURL *pathURL = [CocoaDSFile directoryURLByKind:kindKey version:versionKey port:portKey]; [fileList addObjectsFromArray:[CocoaDSFile appFileList:pathURL fileKind:kindKey]]; if ([fileList count] > 0) { [newVersionTree setObject:fileList forKey:kindKey]; } } if ([newVersionTree count] > 0) { NSString *versionAndPortKey = [NSString stringWithFormat:@"%@ %@", versionKey, portKey]; [_fileTree setObject:newVersionTree forKey:versionAndPortKey]; [_fileTreeVersionList addObject:versionAndPortKey]; } } } [fileManager release]; [self setFilesPresent:([_fileTree count] > 0)]; NSButton *closeButton = [[self window] standardWindowButton:NSWindowCloseButton]; [closeButton setEnabled:![self filesPresent]]; [fileTreeOutlineView reloadItem:nil reloadChildren:YES]; } - (void) setFileSelectionInOutlineView:(NSOutlineView *)outlineView file:(NSMutableDictionary *)fileItem isSelected:(BOOL)isSelected { [fileItem setValue:[NSNumber numberWithBool:isSelected] forKey:@"willMigrate"]; NSString *fileName = (NSString *)[fileItem objectForKey:@"name"]; if (isSelected) { NSMutableDictionary *oldSelection = (NSMutableDictionary *)[_fileTreeSelection objectForKey:fileName]; if (oldSelection != nil && oldSelection != fileItem) { [oldSelection setValue:[NSNumber numberWithBool:NO] forKey:@"willMigrate"]; [outlineView reloadItem:oldSelection]; [outlineView reloadItem:[outlineView parentForItem:oldSelection]]; [outlineView reloadItem:[outlineView parentForItem:[outlineView parentForItem:oldSelection]]]; } [_fileTreeSelection setValue:fileItem forKey:fileName]; } else { [_fileTreeSelection removeObjectForKey:fileName]; } } + (NSMutableDictionary *) fileItemFromURL:(NSURL *)fileURL fileManager:(NSFileManager *)fileManager { if (fileURL == nil || fileManager == nil) { return nil; } NSNumber *willMigrate = [NSNumber numberWithBool:YES]; NSString *filePath = [fileURL path]; NSString *fileName = [filePath lastPathComponent]; NSString *fileVersion = [CocoaDSFile fileVersionByURL:fileURL]; NSString *fileKind = [CocoaDSFile fileKindByURL:fileURL]; NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:filePath error:nil]; return [NSMutableDictionary dictionaryWithObjectsAndKeys: willMigrate, @"willMigrate", fileName, @"name", fileVersion, @"version", fileKind, @"kind", [fileAttributes fileModificationDate], @"dateModified", [fileURL absoluteString], @"URL", nil]; } - (void) moveSelectedFilesToCurrent { NSArray *fileList = [_fileTreeSelection allKeys]; for (NSString *fileName in fileList) { NSDictionary *fileItem = (NSDictionary *)[_fileTreeSelection objectForKey:fileName]; const BOOL willMigrate = [[fileItem valueForKey:@"willMigrate"] boolValue]; if (!willMigrate) { continue; } NSURL *fileURL = [NSURL URLWithString:[fileItem valueForKey:@"URL"]]; [CocoaDSFile moveFileToCurrentDirectory:fileURL]; } } - (void) copySelectedFilesToCurrent { NSArray *fileList = [_fileTreeSelection allKeys]; for (NSString *fileName in fileList) { NSDictionary *fileItem = (NSDictionary *)[_fileTreeSelection objectForKey:fileName]; const BOOL willMigrate = [[fileItem valueForKey:@"willMigrate"] boolValue]; if (!willMigrate) { continue; } NSURL *fileURL = [NSURL URLWithString:[fileItem valueForKey:@"URL"]]; [CocoaDSFile copyFileToCurrentDirectory:fileURL]; } } #pragma mark NSOutlineViewDelegate Protocol - (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView { return NO; } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { if ([(NSString *)[tableColumn identifier] isEqualToString:@"FileNameColumn"]) { return YES; } return NO; } - (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; if ([columnID isEqualToString:@"FileNameColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSString class]]) ? NSBoldFontMask : 0 weight:5 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; if ([item isKindOfClass:[NSString class]]) { [outCell setTitle:(NSString *)item]; [outCell setAllowsMixedState:YES]; } else if ([item isKindOfClass:[NSArray class]]) { NSString *parentItem = [outlineView parentForItem:item]; NSArray *allKeys = [(NSDictionary *)[_fileTree objectForKey:parentItem] allKeysForObject:item]; [outCell setTitle:(NSString *)[allKeys objectAtIndex:0]]; [outCell setAllowsMixedState:YES]; } else if ([item isKindOfClass:[NSDictionary class]]) { [outCell setTitle:(NSString *)[(NSDictionary *)item objectForKey:@"name"]]; [outCell setAllowsMixedState:NO]; } } return outCell; } #pragma mark NSOutlineViewDataSource Protocol - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { if (item == nil) { return [_fileTreeVersionList objectAtIndex:index]; } else if ([item isKindOfClass:[NSString class]]) { NSArray *versionKeys = [(NSDictionary *)[_fileTree objectForKey:(NSString *)item] allKeys]; return [(NSDictionary *)[_fileTree objectForKey:(NSString *)item] objectForKey:[versionKeys objectAtIndex:index]]; } else if ([item isKindOfClass:[NSArray class]]) { return [(NSArray *)item objectAtIndex:index]; } return nil; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { if ([item isKindOfClass:[NSString class]] || [item isKindOfClass:[NSArray class]]) { return YES; } return NO; } - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { NSInteger numberChildren = 0; if (item == nil) { numberChildren = [_fileTreeVersionList count]; } else if ([item isKindOfClass:[NSString class]]) { numberChildren = [(NSDictionary *)[_fileTree objectForKey:(NSString *)item] count]; } else if ([item isKindOfClass:[NSArray class]]) { numberChildren = [(NSArray *)item count]; } return numberChildren; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; if ([columnID isEqualToString:@"FileNameColumn"]) { if ([item isKindOfClass:[NSString class]]) { NSString *parentKey = [outlineView parentForItem:item]; if (parentKey == nil) { NSDictionary *versionDict = (NSDictionary *)[_fileTree objectForKey:(NSString *)item]; NSArray *kindKeyList = [versionDict allKeys]; NSUInteger kindCount = [kindKeyList count]; NSUInteger willMigrateKindCount = 0; for (NSString *kindKey in kindKeyList) { NSArray *fileList = (NSArray *)[versionDict objectForKey:kindKey]; NSUInteger fileCount = [fileList count]; NSUInteger willMigrateFileCount = 0; for (NSDictionary *fileAttr in fileList) { if ([(NSNumber *)[fileAttr objectForKey:@"willMigrate"] boolValue]) { willMigrateFileCount++; } else { if (willMigrateFileCount > 0) { return [NSNumber numberWithInteger:NSMixedState]; } } } if (willMigrateFileCount == 0) { if (willMigrateKindCount > 0) { return [NSNumber numberWithInteger:NSMixedState]; } } else if (willMigrateFileCount == fileCount) { willMigrateKindCount++; } else { return [NSNumber numberWithInteger:NSMixedState]; } } if (willMigrateKindCount == 0) { return [NSNumber numberWithInteger:NSOffState]; } else if (willMigrateKindCount == kindCount) { return [NSNumber numberWithInteger:NSOnState]; } else { return [NSNumber numberWithInteger:NSMixedState]; } } } else if ([item isKindOfClass:[NSArray class]]) { NSArray *fileList = (NSArray *)item; NSUInteger fileCount = [fileList count]; NSUInteger willMigrateFileCount = 0; for (NSDictionary *fileAttr in fileList) { if ([(NSNumber *)[fileAttr objectForKey:@"willMigrate"] boolValue]) { willMigrateFileCount++; } else { if (willMigrateFileCount > 0) { return [NSNumber numberWithInteger:NSMixedState]; } } } if (willMigrateFileCount == 0) { return [NSNumber numberWithInteger:NSOffState]; } else if (willMigrateFileCount == fileCount) { return [NSNumber numberWithInteger:NSOnState]; } else { return [NSNumber numberWithInteger:NSMixedState]; } } else if ([item isKindOfClass:[NSDictionary class]]) { return [(NSDictionary *)item objectForKey:@"willMigrate"]; } else { return @""; } } else if ([columnID isEqualToString:@"FileKindColumn"]) { if ([item isKindOfClass:[NSDictionary class]]) { return [(NSDictionary *)item objectForKey:@"kind"]; } else { return @""; } } else if ([columnID isEqualToString:@"FileDateModifiedColumn"]) { if ([item isKindOfClass:[NSDictionary class]]) { return [(NSDictionary *)item objectForKey:@"dateModified"]; } else { return @""; } } return item; } - (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; NSCell *itemCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; if ([columnID isEqualToString:@"FileNameColumn"]) { if ([item isKindOfClass:[NSString class]]) { NSMutableDictionary *versionDict = (NSMutableDictionary *)[_fileTree objectForKey:(NSString *)item]; const BOOL newSelectState = !([itemCell state] == NSOnState); for (NSString *kindKey in versionDict) { NSArray *fileList = (NSArray *)[versionDict objectForKey:kindKey]; if ([outlineView isItemExpanded:item]) { if ([outlineView isItemExpanded:fileList]) { for (NSMutableDictionary *fileAttr in fileList) { [self setFileSelectionInOutlineView:outlineView file:fileAttr isSelected:newSelectState]; [outlineView reloadItem:fileAttr]; } } else { for (NSMutableDictionary *fileAttr in fileList) { [self setFileSelectionInOutlineView:outlineView file:fileAttr isSelected:newSelectState]; } } [outlineView reloadItem:fileList]; } else { for (NSMutableDictionary *fileAttr in fileList) { [self setFileSelectionInOutlineView:outlineView file:fileAttr isSelected:newSelectState]; } } } } else if ([item isKindOfClass:[NSArray class]]) { const BOOL newSelectState = !([itemCell state] == NSOnState); NSArray *fileList = (NSArray *)item; if ([outlineView isItemExpanded:item]) { for (NSMutableDictionary *fileAttr in fileList) { [self setFileSelectionInOutlineView:outlineView file:fileAttr isSelected:newSelectState]; [outlineView reloadItem:fileAttr]; } } else { for (NSMutableDictionary *fileAttr in fileList) { [self setFileSelectionInOutlineView:outlineView file:fileAttr isSelected:newSelectState]; } } [outlineView reloadItem:[outlineView parentForItem:item]]; } else if ([item isKindOfClass:[NSDictionary class]]) { const BOOL newSelectState = !([itemCell state] == NSOnState); [self setFileSelectionInOutlineView:outlineView file:(NSMutableDictionary *)item isSelected:newSelectState]; [outlineView reloadItem:[outlineView parentForItem:item]]; [outlineView reloadItem:[outlineView parentForItem:[outlineView parentForItem:item]]]; } } } #pragma mark IBActions - (IBAction) updateAndShowWindow:(id)sender { [self updateFileList]; [window center]; [window makeKeyAndOrderFront:nil]; } - (IBAction) handleChoice:(id)sender { const NSInteger option = [(NSControl *)sender tag]; switch (option) { case COCOA_DIALOG_DEFAULT: [self copySelectedFilesToCurrent]; break; case COCOA_DIALOG_OPTION: [self moveSelectedFilesToCurrent]; break; default: break; } [[(NSControl *)sender window] close]; } @end desmume-0.9.11/src/cocoa/userinterface/inputPrefsView.h0000755000000000000000000001136512467662066021644 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #import "InputManager.h" @class InputProfileController; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface InputPrefsView : NSView #else @interface InputPrefsView : NSView #endif { NSObject *dummyObject; NSWindow *prefWindow; NSPopUpButton *inputProfileMenu; NSButton *inputProfilePreviousButton; NSButton *inputProfileNextButton; NSOutlineView *inputPrefOutlineView; NSObjectController *inputSettingsController; InputProfileController *inputProfileController; NSWindow *inputProfileSheet; NSWindow *inputProfileRenameSheet; NSWindow *inputSettingsNDSInput; NSWindow *inputSettingsMicrophone; NSWindow *inputSettingsTouch; NSWindow *inputSettingsLoadStateSlot; NSWindow *inputSettingsSaveStateSlot; NSWindow *inputSettingsSetSpeedLimit; NSWindow *inputSettingsGPUState; NSWindow *inputSettingsPaddleController; InputManager *inputManager; NSString *configInputTargetID; NSMutableDictionary *configInputList; NSMutableDictionary *inputSettingsInEdit; NSDictionary *inputSettingsMappings; NSUInteger _defaultProfileListCount; NSMutableArray *defaultProfilesList; NSMutableArray *savedProfilesList; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *prefWindow; @property (readonly) IBOutlet NSPopUpButton *inputProfileMenu; @property (readonly) IBOutlet NSButton *inputProfilePreviousButton; @property (readonly) IBOutlet NSButton *inputProfileNextButton; @property (readonly) IBOutlet NSOutlineView *inputPrefOutlineView; @property (readonly) IBOutlet NSObjectController *inputSettingsController; @property (readonly) IBOutlet InputProfileController *inputProfileController; @property (readonly) IBOutlet NSWindow *inputProfileSheet; @property (readonly) IBOutlet NSWindow *inputProfileRenameSheet; @property (readonly) IBOutlet NSWindow *inputSettingsNDSInput; @property (readonly) IBOutlet NSWindow *inputSettingsMicrophone; @property (readonly) IBOutlet NSWindow *inputSettingsTouch; @property (readonly) IBOutlet NSWindow *inputSettingsLoadStateSlot; @property (readonly) IBOutlet NSWindow *inputSettingsSaveStateSlot; @property (readonly) IBOutlet NSWindow *inputSettingsSetSpeedLimit; @property (readonly) IBOutlet NSWindow *inputSettingsGPUState; @property (readonly) IBOutlet NSWindow *inputSettingsPaddleController; @property (readonly) IBOutlet InputManager *inputManager; @property (retain) NSString *configInputTargetID; @property (retain) NSMutableDictionary *inputSettingsInEdit; - (void) initSettingsSheets; - (void) loadSavedProfilesList; - (void) populateInputProfileMenu; - (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; - (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed; - (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag; - (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo; - (BOOL) doesProfileNameExist:(NSString *)profileName; - (void) updateSelectedProfileName; - (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndProfileSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndProfileRenameSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (IBAction) setInputAdd:(id)sender; - (IBAction) removeInput:(id)sender; - (IBAction) changeSpeed:(id)sender; - (IBAction) showSettingsSheet:(id)sender; - (IBAction) closeSettingsSheet:(id)sender; - (IBAction) profileNew:(id)sender; - (IBAction) profileView:(id)sender; - (IBAction) profileApply:(id)sender; - (IBAction) profileRename:(id)sender; - (IBAction) profileSave:(id)sender; - (IBAction) profileDelete:(id)sender; - (IBAction) profileSelect:(id)sender; - (IBAction) closeProfileSheet:(id)sender; - (IBAction) closeProfileRenameSheet:(id)sender; - (IBAction) audioFileChoose:(id)sender; - (IBAction) audioFileChooseNone:(id)sender; @end desmume-0.9.11/src/cocoa/userinterface/InputManager.mm0000755000000000000000000025117112467662066021427 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "InputManager.h" #import "EmuControllerDelegate.h" #import "cocoa_globals.h" #import "cocoa_input.h" #import "cocoa_util.h" #include /* Get the symbols for UpdateSystemActivity(). For some reason, in Mac OS v10.5 and earlier, UpdateSystemActivity() is not defined for 64-bit, even though it does work on 64-bit systems. So we're going to copy the symbols from OSServices/Power.h so that we can use them. This solution is better than making an absolute path to the Power.h file, since we can't assume that the header file will always be in the same location. Note that this isn't a problem on 32-bit, or if the target SDK is Mac OS v10.6 or later. */ #if !__LP64__ || MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 #include #else #ifdef __cplusplus extern "C" { #endif extern OSErr UpdateSystemActivity(UInt8 activity); enum { OverallAct = 0, UsrActivity = 1, NetActivity = 2, HDActivity = 3, IdleActivity = 4 }; #ifdef __cplusplus } #endif #endif // !__LP64__ || MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 #pragma mark - @implementation InputHIDDevice @synthesize hidManager; @synthesize hidDeviceRef; @dynamic manufacturerName; @dynamic productName; @dynamic serialNumber; @synthesize identifier; @dynamic supportsForceFeedback; @dynamic isForceFeedbackEnabled; @dynamic runLoop; static NSDictionary *hidUsageTable = nil; - (id) initWithDevice:(IOHIDDeviceRef)theDevice hidManager:(InputHIDManager *)theHIDManager { self = [super init]; if(self == nil) { return self; } if (hidUsageTable == nil) { hidUsageTable = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HID_usage_strings" ofType:@"plist"]]; } hidManager = [theHIDManager retain]; hidDeviceRef = theDevice; hidQueueRef = IOHIDQueueCreate(kCFAllocatorDefault, hidDeviceRef, 10, kIOHIDOptionsTypeNone); if (hidQueueRef == NULL) { [self release]; return nil; } CFArrayRef elementArray = IOHIDDeviceCopyMatchingElements(hidDeviceRef, NULL, kIOHIDOptionsTypeNone); NSEnumerator *enumerator = [(NSArray *)elementArray objectEnumerator]; IOHIDElementRef hidElement = NULL; while ((hidElement = (IOHIDElementRef)[enumerator nextObject])) { IOHIDQueueAddElement(hidQueueRef, hidElement); } CFRelease(elementArray); // Set up force feedback. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 ioService = IOHIDDeviceGetService(hidDeviceRef); if (ioService != MACH_PORT_NULL) { IOObjectRetain(ioService); } #else ioService = MACH_PORT_NULL; CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOHIDDeviceKey); if (matchingDict) { CFStringRef locationKey = CFSTR(kIOHIDLocationIDKey); CFTypeRef deviceLocation = IOHIDDeviceGetProperty(hidDeviceRef, locationKey); if (deviceLocation != NULL) { CFDictionaryAddValue(matchingDict, locationKey, deviceLocation); //This eats a reference to matchingDict, so we don't need a separate release. //The result, meanwhile, has a reference count of 1 and must be released by the caller. ioService = IOServiceGetMatchingService(kIOMasterPortDefault, matchingDict); } else { CFRelease(matchingDict); } } #endif ffDevice = NULL; ffEffect = NULL; if (ioService != MACH_PORT_NULL && [self supportsForceFeedback]) { HRESULT ffResult = FFCreateDevice(ioService, &ffDevice); if (ffDevice != NULL && ffResult != FF_OK) { FFReleaseDevice(ffDevice); ffDevice = NULL; } // Generate the force feedback effect. if (ffDevice != NULL) { DWORD rgdwAxes[1] = {FFJOFS_Y}; LONG rglDirection[2] = {0}; FFCONSTANTFORCE cf; cf.lMagnitude = FF_FFNOMINALMAX; FFEFFECT newEffect; newEffect.dwSize = sizeof(FFEFFECT); newEffect.dwFlags = FFEFF_CARTESIAN | FFEFF_OBJECTOFFSETS; newEffect.dwDuration = 1000000; // Equivalent to 1 second newEffect.dwSamplePeriod = 0; newEffect.dwGain = FF_FFNOMINALMAX; newEffect.dwTriggerButton = FFEB_NOTRIGGER; newEffect.dwTriggerRepeatInterval = 0; newEffect.cAxes = 1; newEffect.rgdwAxes = rgdwAxes; newEffect.rglDirection = rglDirection; newEffect.lpEnvelope = NULL; newEffect.cbTypeSpecificParams = sizeof(FFCONSTANTFORCE); newEffect.lpvTypeSpecificParams = &cf; newEffect.dwStartDelay = 0; FFDeviceCreateEffect(ffDevice, kFFEffectType_ConstantForce_ID, &newEffect, &ffEffect); if (ffEffect == NULL) { FFReleaseDevice(ffDevice); ffDevice = NULL; } } } isForceFeedbackEnabled = (ffDevice != nil); if (isForceFeedbackEnabled) { [self startForceFeedbackAndIterate:RUMBLE_ITERATIONS_ENABLE flags:0]; } // Set up the device identifier. CFNumberRef cfVendorIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDVendorIDKey)); CFNumberRef cfProductIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductIDKey)); CFStringRef cfDeviceSerial = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); if (cfDeviceSerial != nil) { identifier = [NSString stringWithFormat:@"%d/%d/%@", [(NSNumber *)cfVendorIDNumber intValue], [(NSNumber *)cfProductIDNumber intValue], cfDeviceSerial]; } else { CFNumberRef cfLocationIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDLocationIDKey)); identifier = [NSString stringWithFormat:@"%d/%d/0x%08X", [(NSNumber *)cfVendorIDNumber intValue], [(NSNumber *)cfProductIDNumber intValue], [(NSNumber *)cfLocationIDNumber intValue]]; } [identifier retain]; spinlockRunLoop = OS_SPINLOCK_INIT; [self setRunLoop:[NSRunLoop currentRunLoop]]; return self; } - (void)dealloc { [self stopForceFeedback]; [self stop]; [self setRunLoop:nil]; [self setHidManager:nil]; if (hidQueueRef != NULL) { CFRelease(hidQueueRef); hidQueueRef = NULL; } if (ffDevice != NULL) { FFEffectUnload(ffEffect); FFReleaseDevice(ffDevice); ffDevice = NULL; } if (ioService != MACH_PORT_NULL) { IOObjectRelease(ioService); ioService = MACH_PORT_NULL; } [identifier release]; [super dealloc]; } - (NSString *) manufacturerName { return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDManufacturerKey)); } - (NSString *) productName { return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDProductKey)); } - (NSString *) serialNumber { return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDSerialNumberKey)); } - (BOOL) supportsForceFeedback { return (ioService != MACH_PORT_NULL) ? (FFIsForceFeedback(ioService) == FF_OK) : NO; } - (void) setIsForceFeedbackEnabled:(BOOL)theState { if (ffDevice != NULL) { // Enable/disable force feedback by maxing/zeroing out the device gain. UInt32 gainValue = (theState) ? FF_FFNOMINALMAX : 0; FFDeviceSetForceFeedbackProperty(ffDevice, FFPROP_FFGAIN, &gainValue); if (theState) { [self startForceFeedbackAndIterate:RUMBLE_ITERATIONS_ENABLE flags:0]; } else { [self stopForceFeedback]; } isForceFeedbackEnabled = theState; } else { isForceFeedbackEnabled = NO; } [self writeDefaults]; } - (BOOL) isForceFeedbackEnabled { return isForceFeedbackEnabled; } - (void) setRunLoop:(NSRunLoop *)theRunLoop { OSSpinLockLock(&spinlockRunLoop); if (theRunLoop == runLoop) { OSSpinLockUnlock(&spinlockRunLoop); return; } if (theRunLoop == nil) { IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, NULL, NULL); IOHIDQueueUnscheduleFromRunLoop(hidQueueRef, [runLoop getCFRunLoop], kCFRunLoopDefaultMode); } else { [theRunLoop retain]; IOHIDQueueScheduleWithRunLoop(hidQueueRef, [theRunLoop getCFRunLoop], kCFRunLoopDefaultMode); IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, HandleQueueValueAvailableCallback, self); } [runLoop release]; runLoop = theRunLoop; OSSpinLockUnlock(&spinlockRunLoop); } - (NSRunLoop *) runLoop { OSSpinLockLock(&spinlockRunLoop); NSRunLoop *theRunLoop = runLoop; OSSpinLockUnlock(&spinlockRunLoop); return theRunLoop; } - (void) setPropertiesUsingDictionary:(NSDictionary *)theProperties { if (theProperties == nil) { return; } NSNumber *isFFEnabledNumber = (NSNumber *)[theProperties objectForKey:@"isForceFeedbackEnabled"]; if (isFFEnabledNumber != nil) { [self setIsForceFeedbackEnabled:[isFFEnabledNumber boolValue]]; } } - (NSDictionary *) propertiesDictionary { return [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:[self isForceFeedbackEnabled]], @"isForceFeedbackEnabled", [self manufacturerName], @"manufacturerName", [self productName], @"productName", [self serialNumber], @"serialNumber", nil]; } - (void) writeDefaults { NSDictionary *savedInputDeviceDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_SavedDeviceProperties"]; if (savedInputDeviceDict == nil) { return; } NSMutableDictionary *newInputDeviceDict = [NSMutableDictionary dictionaryWithDictionary:savedInputDeviceDict]; [newInputDeviceDict setObject:[self propertiesDictionary] forKey:[self identifier]]; [[NSUserDefaults standardUserDefaults] setObject:newInputDeviceDict forKey:@"Input_SavedDeviceProperties"]; } - (void) start { IOHIDQueueStart(hidQueueRef); } - (void) stop { IOHIDQueueStop(hidQueueRef); } - (void) startForceFeedbackAndIterate:(UInt32)iterations flags:(UInt32)ffFlags { if (ffDevice != NULL) { HRESULT ffResult = FFEffectStart(ffEffect, iterations, ffFlags); ffResult = ffResult; } } - (void) stopForceFeedback { if (ffDevice != NULL) { FFEffectStop(ffEffect); } } @end /******************************************************************************************** InputAttributesOfHIDValue() Parses an IOHIDValueRef into an input attributes struct. Takes: hidValueRef - The IOHIDValueRef to parse. Returns: An InputAttributes struct with the parsed input attributes. Details: None. ********************************************************************************************/ InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef) { InputAttributes inputAttr; if (hidValueRef == NULL) { return inputAttr; } const IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); const IOHIDDeviceRef hidDeviceRef = IOHIDElementGetDevice(hidElementRef); InputElementCodeFromHIDElement(hidElementRef, inputAttr.elementCode); InputDeviceCodeFromHIDDevice(hidDeviceRef, inputAttr.deviceCode); strncpy(inputAttr.elementName, inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH); InputElementNameFromHIDElement(hidElementRef, inputAttr.elementName); strncpy(inputAttr.deviceName, inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH); InputDeviceNameFromHIDDevice(hidDeviceRef, inputAttr.deviceName); const NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); const NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); const NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); const NSInteger elementType = IOHIDElementGetType(hidElementRef); const NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); inputAttr.isAnalog = (elementType != kIOHIDElementTypeInput_Button) && !(logicalMin == 0 && logicalMax == 1); inputAttr.intCoordX = 0; inputAttr.intCoordY = 0; inputAttr.floatCoordX = 0.0f; inputAttr.floatCoordY = 0.0f; inputAttr.scalar = (float)(logicalValue - logicalMin) / (float)(logicalMax - logicalMin); inputAttr.sender = nil; if (!inputAttr.isAnalog) { inputAttr.state = (logicalValue == 1) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; } else if (elementUsage == kHIDUsage_GD_Hatswitch) { // For hatswitch inputs, use the intCoord fields to store the axis information. inputAttr.state = (logicalValue >= logicalMin && logicalValue <= logicalMax) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON) { struct IntCoord { int x; int y; }; static const IntCoord coords4Way[4] = { {0, -1}, // Up {1, 0}, // Right {0, 1}, // Down {-1, 0} // Left }; static const IntCoord coords8Way[8] = { {0, -1}, // Up {1, -1}, // Up/Right {1, 0}, // Right {1, 1}, // Down/Right {0, 1}, // Down {-1, 1}, // Down/Left {-1, 0}, // Left {-1, -1} // Up/Left }; if (logicalMax == 3) // For a 4-way hatswitch { inputAttr.intCoordX = coords4Way[logicalValue].x; inputAttr.intCoordY = coords4Way[logicalValue].y; } else if (logicalMax == 7) // For an 8-way hatswitch { inputAttr.intCoordX = coords8Way[logicalValue].x; inputAttr.intCoordY = coords8Way[logicalValue].y; } } } else // Some generic analog input { inputAttr.state = (inputAttr.scalar <= 0.30f || inputAttr.scalar >= 0.7f) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; } return inputAttr; } InputAttributesList InputListFromHIDValue(IOHIDValueRef hidValueRef, InputManager *inputManager, bool forceDigitalInput) { InputAttributesList inputList; if (hidValueRef == NULL) { return inputList; } // IOHIDValueGetIntegerValue() will crash if the value length is too large. // Do a bounds check here to prevent crashing. This workaround makes the PS3 // controller usable, since it returns a length of 39 on some elements. if(IOHIDValueGetLength(hidValueRef) > 2) { return inputList; } InputAttributes inputAttr = InputAttributesOfHIDValue(hidValueRef); if (inputAttr.deviceCode[0] == '\0' || inputAttr.elementCode[0] == '\0') { return inputList; } if (!inputAttr.isAnalog) { inputList.push_back(inputAttr); } else { const IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); const NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); if (elementUsage == kHIDUsage_GD_Hatswitch) { InputAttributes hatUp = inputAttr; hatUp.isAnalog = false; strncat(hatUp.elementName, "/Up", INPUT_HANDLER_STRING_LENGTH); strncat(hatUp.elementCode, "/Up", INPUT_HANDLER_STRING_LENGTH); InputAttributes hatRight = inputAttr; hatRight.isAnalog = false; strncat(hatRight.elementName, "/Right", INPUT_HANDLER_STRING_LENGTH); strncat(hatRight.elementCode, "/Right", INPUT_HANDLER_STRING_LENGTH); InputAttributes hatDown = inputAttr; hatDown.isAnalog = false; strncat(hatDown.elementName, "/Down", INPUT_HANDLER_STRING_LENGTH); strncat(hatDown.elementCode, "/Down", INPUT_HANDLER_STRING_LENGTH); InputAttributes hatLeft = inputAttr; hatLeft.isAnalog = false; strncat(hatLeft.elementName, "/Left", INPUT_HANDLER_STRING_LENGTH); strncat(hatLeft.elementCode, "/Left", INPUT_HANDLER_STRING_LENGTH); if (inputAttr.intCoordX == -1) { hatRight.state = INPUT_ATTRIBUTE_STATE_OFF; hatLeft.state = INPUT_ATTRIBUTE_STATE_ON; } else if (inputAttr.intCoordX == 1) { hatRight.state = INPUT_ATTRIBUTE_STATE_ON; hatLeft.state = INPUT_ATTRIBUTE_STATE_OFF; } else { hatRight.state = INPUT_ATTRIBUTE_STATE_OFF; hatLeft.state = INPUT_ATTRIBUTE_STATE_OFF; } if (inputAttr.intCoordY == -1) { hatDown.state = INPUT_ATTRIBUTE_STATE_OFF; hatUp.state = INPUT_ATTRIBUTE_STATE_ON; } else if (inputAttr.intCoordY == 1) { hatDown.state = INPUT_ATTRIBUTE_STATE_ON; hatUp.state = INPUT_ATTRIBUTE_STATE_OFF; } else { hatDown.state = INPUT_ATTRIBUTE_STATE_OFF; hatUp.state = INPUT_ATTRIBUTE_STATE_OFF; } inputList.resize(4); inputList.push_back(hatUp); inputList.push_back(hatRight); inputList.push_back(hatDown); inputList.push_back(hatLeft); } else { CommandAttributes cmdAttr = [inputManager mappedCommandAttributesOfDeviceCode:inputAttr.deviceCode elementCode:inputAttr.elementCode]; if (cmdAttr.tag[0] == '\0' || cmdAttr.selector == nil) { std::string tempElementCode = std::string(inputAttr.elementCode) + "/LowerThreshold"; cmdAttr = [inputManager mappedCommandAttributesOfDeviceCode:inputAttr.deviceCode elementCode:tempElementCode.c_str()]; if (cmdAttr.tag[0] == '\0' || cmdAttr.selector == nil) { tempElementCode = std::string(inputAttr.elementCode) + "/UpperThreshold"; cmdAttr = [inputManager mappedCommandAttributesOfDeviceCode:inputAttr.deviceCode elementCode:tempElementCode.c_str()]; } } const bool useAnalog = (cmdAttr.tag[0] == '\0' || cmdAttr.selector == nil) ? !forceDigitalInput : (!forceDigitalInput && cmdAttr.allowAnalogInput); if (useAnalog) { inputList.push_back(inputAttr); } else { InputAttributes loInputAttr = inputAttr; loInputAttr.isAnalog = false; strncat(loInputAttr.elementName, "-", INPUT_HANDLER_STRING_LENGTH); strncat(loInputAttr.elementCode, "/LowerThreshold", INPUT_HANDLER_STRING_LENGTH); InputAttributes hiInputAttr = inputAttr; hiInputAttr.isAnalog = false; strncat(hiInputAttr.elementName, "+", INPUT_HANDLER_STRING_LENGTH); strncat(hiInputAttr.elementCode, "/UpperThreshold", INPUT_HANDLER_STRING_LENGTH); if (loInputAttr.scalar <= 0.30f) { loInputAttr.state = INPUT_ATTRIBUTE_STATE_ON; hiInputAttr.state = INPUT_ATTRIBUTE_STATE_OFF; } else if (loInputAttr.scalar >= 0.70f) { loInputAttr.state = INPUT_ATTRIBUTE_STATE_OFF; hiInputAttr.state = INPUT_ATTRIBUTE_STATE_ON; } else { loInputAttr.state = INPUT_ATTRIBUTE_STATE_OFF; hiInputAttr.state = INPUT_ATTRIBUTE_STATE_OFF; } inputList.resize(2); inputList.push_back(loInputAttr); inputList.push_back(hiInputAttr); } } } return inputList; } bool InputElementCodeFromHIDElement(const IOHIDElementRef hidElementRef, char *charBuffer) { NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); snprintf(charBuffer, INPUT_HANDLER_STRING_LENGTH, "0x%04lX/0x%04lX", (long)elementUsagePage, (long)elementUsage); return true; } bool InputElementNameFromHIDElement(const IOHIDElementRef hidElementRef, char *charBuffer) { CFStringRef cfElementName = IOHIDElementGetName(hidElementRef); bool propertyExists = (cfElementName != nil); if (propertyExists) { CFStringGetCString(cfElementName, charBuffer, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); return propertyExists; } // If the name property is not present, then generate a name ourselves. NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); if (elementUsage == kHIDUsage_GD_Hatswitch) { strncpy(charBuffer, "Hatswitch", INPUT_HANDLER_STRING_LENGTH); propertyExists = true; return propertyExists; } else if (elementUsagePage == kHIDPage_Button) { snprintf(charBuffer, INPUT_HANDLER_STRING_LENGTH, "Button %li", (long)elementUsage); propertyExists = true; return propertyExists; } else if (elementUsagePage == kHIDPage_VendorDefinedStart) { snprintf(charBuffer, INPUT_HANDLER_STRING_LENGTH, "VendorDefined %li", (long)elementUsage); propertyExists = true; return propertyExists; } else { // Only look up the HID Usage Table as a last resort, since this can be relatively slow. NSDictionary *elementUsagePageDict = (NSDictionary *)[hidUsageTable valueForKey:[NSString stringWithFormat:@"0x%04lX", (long)elementUsagePage]]; NSString *elementNameLookup = (NSString *)[elementUsagePageDict valueForKey:[NSString stringWithFormat:@"0x%04lX", (long)elementUsage]]; propertyExists = (elementNameLookup != nil); if (propertyExists) { strncpy(charBuffer, [elementNameLookup cStringUsingEncoding:NSUTF8StringEncoding], INPUT_HANDLER_STRING_LENGTH); return propertyExists; } } return propertyExists; } bool InputDeviceCodeFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer) { CFNumberRef cfVendorIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDVendorIDKey)); SInt32 vendorID = 0; CFNumberGetValue(cfVendorIDNumber, kCFNumberSInt32Type, &vendorID); CFNumberRef cfProductIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductIDKey)); SInt32 productID = 0; CFNumberGetValue(cfProductIDNumber, kCFNumberSInt32Type, &productID); CFStringRef cfDeviceCode = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); if (cfDeviceCode == nil) { CFNumberRef cfLocationIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDLocationIDKey)); SInt32 locationID = 0; CFNumberGetValue(cfLocationIDNumber, kCFNumberSInt32Type, &locationID); snprintf(charBuffer, INPUT_HANDLER_STRING_LENGTH, "%d/%d/0x%08X", (int)vendorID, (int)productID, (unsigned int)locationID); } else { char cfDeviceCodeBuf[256] = {0}; CFStringGetCString(cfDeviceCode, cfDeviceCodeBuf, 256, kCFStringEncodingUTF8); snprintf(charBuffer, INPUT_HANDLER_STRING_LENGTH, "%d/%d/%s", (int)vendorID, (int)productID, cfDeviceCodeBuf); } return true; } bool InputDeviceNameFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer) { CFStringRef cfDeviceName = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductKey)); bool propertyExists = (cfDeviceName != nil); if (propertyExists) { CFStringGetCString(cfDeviceName, charBuffer, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); } else { strncpy(charBuffer, "Unknown Device", INPUT_HANDLER_STRING_LENGTH); } return propertyExists; } size_t ClearHIDQueue(const IOHIDQueueRef hidQueue) { size_t hidInputClearCount = 0; if (hidQueue == nil) { return hidInputClearCount; } do { IOHIDValueRef hidValueRef = IOHIDQueueCopyNextValueWithTimeout(hidQueue, 0.0); if (hidValueRef == NULL) { break; } CFRelease(hidValueRef); hidInputClearCount++; } while (1); if (hidInputClearCount > 0) { // HID input devices don't register events, so we need to manually prevent // sleep and screensaver whenever we detect an input. UpdateSystemActivity(UsrActivity); } return hidInputClearCount; } void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void *inSender) { InputHIDDevice *hidDevice = (InputHIDDevice *)inContext; InputHIDManager *hidManager = [hidDevice hidManager]; IOHIDQueueRef hidQueue = (IOHIDQueueRef)inSender; id target = [hidManager target]; if (target != nil) { NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; [[hidManager target] handleHIDQueue:hidQueue hidManager:hidManager]; [tempPool release]; } else { // We must make sure the HID queue is emptied or else HID input will stall. ClearHIDQueue(hidQueue); } } #pragma mark - @implementation InputHIDManager @synthesize inputManager; @synthesize hidManagerRef; @synthesize deviceListController; @synthesize target; @dynamic runLoop; - (id) initWithInputManager:(InputManager *)theInputManager { self = [super init]; if(self == nil) { return self; } target = nil; deviceListController = nil; inputManager = [theInputManager retain]; hidManagerRef = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); if (hidManagerRef == NULL) { [self release]; return nil; } CFMutableDictionaryRef cfJoystickMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_Joystick]); CFMutableDictionaryRef cfGamepadMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_GamePad]); CFMutableDictionaryRef cfGenericControllerMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(cfGenericControllerMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); CFDictionarySetValue(cfGenericControllerMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_MultiAxisController]); NSArray *matcherArray = [[NSArray alloc] initWithObjects:(NSMutableDictionary *)cfJoystickMatcher, (NSMutableDictionary *)cfGamepadMatcher, (NSMutableDictionary *)cfGenericControllerMatcher, nil]; IOHIDManagerSetDeviceMatchingMultiple(hidManagerRef, (CFArrayRef)matcherArray); [matcherArray release]; CFRelease(cfJoystickMatcher); CFRelease(cfGamepadMatcher); CFRelease(cfGenericControllerMatcher); spinlockRunLoop = OS_SPINLOCK_INIT; [self setRunLoop:[NSRunLoop currentRunLoop]]; IOReturn result = IOHIDManagerOpen(hidManagerRef, kIOHIDOptionsTypeNone); if (result != kIOReturnSuccess) { [self release]; return nil; } return self; } - (void)dealloc { [self setRunLoop:nil]; [self setInputManager:nil]; [self setTarget:nil]; if (hidManagerRef != NULL) { IOHIDManagerClose(hidManagerRef, 0); CFRelease(hidManagerRef); hidManagerRef = NULL; } [super dealloc]; } - (void) setRunLoop:(NSRunLoop *)theRunLoop { OSSpinLockLock(&spinlockRunLoop); if (theRunLoop == runLoop) { OSSpinLockUnlock(&spinlockRunLoop); return; } if (theRunLoop == nil) { IOHIDManagerRegisterDeviceMatchingCallback(hidManagerRef, NULL, NULL); IOHIDManagerRegisterDeviceRemovalCallback(hidManagerRef, NULL, NULL); IOHIDManagerUnscheduleFromRunLoop(hidManagerRef, [runLoop getCFRunLoop], kCFRunLoopDefaultMode); } else { [theRunLoop retain]; IOHIDManagerScheduleWithRunLoop(hidManagerRef, [theRunLoop getCFRunLoop], kCFRunLoopDefaultMode); IOHIDManagerRegisterDeviceMatchingCallback(hidManagerRef, HandleDeviceMatchingCallback, self); IOHIDManagerRegisterDeviceRemovalCallback(hidManagerRef, HandleDeviceRemovalCallback, self); } [runLoop release]; runLoop = theRunLoop; OSSpinLockUnlock(&spinlockRunLoop); } - (NSRunLoop *) runLoop { OSSpinLockLock(&spinlockRunLoop); NSRunLoop *theRunLoop = runLoop; OSSpinLockUnlock(&spinlockRunLoop); return theRunLoop; } @end void HandleDeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) { InputHIDManager *hidManager = (InputHIDManager *)inContext; InputHIDDevice *newDevice = [[[InputHIDDevice alloc] initWithDevice:inIOHIDDeviceRef hidManager:hidManager] autorelease]; [[hidManager deviceListController] addObject:newDevice]; NSDictionary *savedInputDeviceDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_SavedDeviceProperties"]; NSDictionary *devicePropertiesDict = (NSDictionary *)[savedInputDeviceDict objectForKey:[newDevice identifier]]; if (devicePropertiesDict != nil) { [newDevice setPropertiesUsingDictionary:devicePropertiesDict]; } else { [newDevice writeDefaults]; } [newDevice start]; } void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) { InputHIDManager *hidManager = (InputHIDManager *)inContext; NSArray *hidDeviceList = [[hidManager deviceListController] arrangedObjects]; for (InputHIDDevice *hidDevice in hidDeviceList) { if ([hidDevice hidDeviceRef] == inIOHIDDeviceRef) { [hidDevice stopForceFeedback]; [[hidManager deviceListController] removeObject:hidDevice]; break; } } } #pragma mark - @implementation InputManager @synthesize emuControl; @dynamic hidInputTarget; @synthesize hidManager; @synthesize inputMappings; @synthesize commandTagList; @synthesize commandIcon; #if defined(__ppc__) || defined(__ppc64__) static std::map keyboardNameTable; // Key = Key code, Value = Key name #elif !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_6) static std::tr1::unordered_map keyboardNameTable; // Key = Key code, Value = Key name #else static std::unordered_map keyboardNameTable; // Key = Key code, Value = Key name #endif - (id)init { self = [super init]; if (self == nil) { return self; } if (keyboardNameTable.empty()) { NSDictionary *keyboardNameDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"KeyNames" ofType:@"plist"]]; NSArray *keyboardDictKeyList = [keyboardNameDict allKeys]; for (NSString *dKey in keyboardDictKeyList) { unsigned short keyCode = (unsigned short)[dKey intValue]; keyboardNameTable[keyCode] = std::string([(NSString *)[keyboardNameDict valueForKey:dKey] cStringUsingEncoding:NSUTF8StringEncoding]); } } hidManager = [[InputHIDManager alloc] initWithInputManager:self]; inputMappings = [[NSMutableDictionary alloc] initWithCapacity:128]; commandTagList = [[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]] valueForKey:@"CommandTagList"]; // Initialize the icons associated with each command. commandIcon = [[NSDictionary alloc] initWithObjectsAndKeys: [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"UNKNOWN COMMAND", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowUp_420x420" ofType:@"png"]] autorelease], @"Up", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowDown_420x420" ofType:@"png"]] autorelease], @"Down", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowLeft_420x420" ofType:@"png"]] autorelease], @"Left", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowRight_420x420" ofType:@"png"]] autorelease], @"Right", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonA_420x420" ofType:@"png"]] autorelease], @"A", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonB_420x420" ofType:@"png"]] autorelease], @"B", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonX_420x420" ofType:@"png"]] autorelease], @"X", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonY_420x420" ofType:@"png"]] autorelease], @"Y", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonL_420x420" ofType:@"png"]] autorelease], @"L", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonR_420x420" ofType:@"png"]] autorelease], @"R", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonStart_420x420" ofType:@"png"]] autorelease], @"Start", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Select", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneBlueGlow_256x256" ofType:@"png"]] autorelease], @"Microphone", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_GuitarGrip_Button_Green_512x512" ofType:@"png"]] autorelease], @"Guitar Grip: Green", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_GuitarGrip_Button_Red_512x512" ofType:@"png"]] autorelease], @"Guitar Grip: Red", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_GuitarGrip_Button_Yellow_512x512" ofType:@"png"]] autorelease], @"Guitar Grip: Yellow", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_GuitarGrip_Button_Blue_512x512" ofType:@"png"]] autorelease], @"Guitar Grip: Blue", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: C", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: C#", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: D", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: D#", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: E", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: F", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: F#", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: G", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: G#", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: A", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: A#", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: B", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Piano_256x256" ofType:@"png"]] autorelease], @"Piano: High C", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_PaddleKnob_256x256" ofType:@"png"]] autorelease], @"Paddle", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_AutoholdSet_420x420" ofType:@"png"]] autorelease], @"Autohold - Set", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_AutoholdClear_420x420" ofType:@"png"]] autorelease], @"Autohold - Clear", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DisplayToggle_420x420" ofType:@"png"]] autorelease], @"Toggle All Displays", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_RotateCCW_420x420" ofType:@"png"]] autorelease], @"Rotate Display Left", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_RotateCW_420x420" ofType:@"png"]] autorelease], @"Rotate Display Right", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ShowHUD_420x420" ofType:@"png"]] autorelease], @"HUD", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]] autorelease], @"Pause", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute/Pause", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_FrameAdvance_420x420" ofType:@"png"]] autorelease], @"Frame Advance", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_FrameJump_420x420" ofType:@"png"]] autorelease], @"Frame Jump", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Reset_420x420" ofType:@"png"]] autorelease], @"Reset", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Touch", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]] autorelease], @"Mute/Unmute", nil]; // Initialize the selectors used for each command tag. (Do this in code rather than in an external file.) commandSelector["Up"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["Down"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["Right"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["Left"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["A"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["B"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["X"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["Y"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["L"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["R"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["Start"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["Select"] = @selector(cmdUpdateDSControllerWithTurbo:); commandSelector["Touch"] = @selector(cmdUpdateDSTouch:); commandSelector["Microphone"] = @selector(cmdUpdateDSMicrophone:); commandSelector["Debug"] = @selector(cmdUpdateDSController:); commandSelector["Lid"] = @selector(cmdUpdateDSController:); commandSelector["Guitar Grip: Green"] = @selector(cmdUpdateDSController:); commandSelector["Guitar Grip: Red"] = @selector(cmdUpdateDSController:); commandSelector["Guitar Grip: Yellow"] = @selector(cmdUpdateDSController:); commandSelector["Guitar Grip: Blue"] = @selector(cmdUpdateDSController:); commandSelector["Piano: C"] = @selector(cmdUpdateDSController:); commandSelector["Piano: C#"] = @selector(cmdUpdateDSController:); commandSelector["Piano: D"] = @selector(cmdUpdateDSController:); commandSelector["Piano: D#"] = @selector(cmdUpdateDSController:); commandSelector["Piano: E"] = @selector(cmdUpdateDSController:); commandSelector["Piano: F"] = @selector(cmdUpdateDSController:); commandSelector["Piano: F#"] = @selector(cmdUpdateDSController:); commandSelector["Piano: G"] = @selector(cmdUpdateDSController:); commandSelector["Piano: G#"] = @selector(cmdUpdateDSController:); commandSelector["Piano: A"] = @selector(cmdUpdateDSController:); commandSelector["Piano: A#"] = @selector(cmdUpdateDSController:); commandSelector["Piano: B"] = @selector(cmdUpdateDSController:); commandSelector["Piano: High C"] = @selector(cmdUpdateDSController:); commandSelector["Paddle"] = @selector(cmdUpdateDSPaddle:); commandSelector["Autohold - Set"] = @selector(cmdAutoholdSet:); commandSelector["Autohold - Clear"] = @selector(cmdAutoholdClear:); commandSelector["Load State Slot"] = @selector(cmdLoadEmuSaveStateSlot:); commandSelector["Save State Slot"] = @selector(cmdSaveEmuSaveStateSlot:); commandSelector["Copy Screen"] = @selector(cmdCopyScreen:); commandSelector["Rotate Display Relative"] = @selector(cmdRotateDisplayRelative:); commandSelector["Toggle All Displays"] = @selector(cmdToggleAllDisplays:); commandSelector["Set Speed"] = @selector(cmdHoldToggleSpeedScalar:); commandSelector["Enable/Disable Speed Limiter"] = @selector(cmdToggleSpeedLimiter:); commandSelector["Enable/Disable Auto Frame Skip"] = @selector(cmdToggleAutoFrameSkip:); commandSelector["Enable/Disable Cheats"] = @selector(cmdToggleCheats:); commandSelector["Execute"] = @selector(cmdCoreExecute:); commandSelector["Pause"] = @selector(cmdCorePause:); commandSelector["Execute/Pause"] = @selector(cmdToggleExecutePause:); commandSelector["Frame Advance"] = @selector(cmdFrameAdvance:); commandSelector["Frame Jump"] = @selector(cmdFrameJump:); commandSelector["Reset"] = @selector(cmdReset:); commandSelector["Mute/Unmute"] = @selector(cmdToggleMute:); commandSelector["Enable/Disable GPU State"] = @selector(cmdToggleGPUState:); // Generate the default command attributes for each command tag. (Do this in code rather than in an external file.) CommandAttributes cmdDSControlRight = NewCommandAttributesForDSControl("Right", DSControllerState_Right, true); CommandAttributes cmdDSControlLeft = NewCommandAttributesForDSControl("Left", DSControllerState_Left, true); CommandAttributes cmdDSControlDown = NewCommandAttributesForDSControl("Down", DSControllerState_Down, true); CommandAttributes cmdDSControlUp = NewCommandAttributesForDSControl("Up", DSControllerState_Up, true); CommandAttributes cmdDSControlSelect = NewCommandAttributesForDSControl("Select", DSControllerState_Select, true); CommandAttributes cmdDSControlStart = NewCommandAttributesForDSControl("Start", DSControllerState_Start, true); CommandAttributes cmdDSControlB = NewCommandAttributesForDSControl("B", DSControllerState_B, true); CommandAttributes cmdDSControlA = NewCommandAttributesForDSControl("A", DSControllerState_A, true); CommandAttributes cmdDSControlY = NewCommandAttributesForDSControl("Y", DSControllerState_Y, true); CommandAttributes cmdDSControlX = NewCommandAttributesForDSControl("X", DSControllerState_X, true); CommandAttributes cmdDSControlL = NewCommandAttributesForDSControl("L", DSControllerState_L, true); CommandAttributes cmdDSControlR = NewCommandAttributesForDSControl("R", DSControllerState_R, true); CommandAttributes cmdDSControlDebug = NewCommandAttributesForDSControl("Debug", DSControllerState_Debug, false); CommandAttributes cmdDSControlLid = NewCommandAttributesForDSControl("Lid", DSControllerState_Lid, false); CommandAttributes cmdDSControlTouch = NewCommandAttributesForDSControl("Touch", DSControllerState_Touch, false); cmdDSControlTouch.useInputForIntCoord = true; CommandAttributes cmdDSControlMic = NewCommandAttributesForDSControl("Microphone", DSControllerState_Microphone, false); cmdDSControlMic.intValue[1] = MICMODE_INTERNAL_NOISE; cmdDSControlMic.floatValue[0] = 250.0f; CommandAttributes cmdGuitarGripGreen = NewCommandAttributesForDSControl("Guitar Grip: Green", DSControllerState_GuitarGrip_Green, false); CommandAttributes cmdGuitarGripRed = NewCommandAttributesForDSControl("Guitar Grip: Red", DSControllerState_GuitarGrip_Red, false); CommandAttributes cmdGuitarGripYellow = NewCommandAttributesForDSControl("Guitar Grip: Yellow", DSControllerState_GuitarGrip_Yellow, false); CommandAttributes cmdGuitarGripBlue = NewCommandAttributesForDSControl("Guitar Grip: Blue", DSControllerState_GuitarGrip_Blue, false); CommandAttributes cmdPianoC = NewCommandAttributesForDSControl("Piano: C", DSControllerState_Piano_C, false); CommandAttributes cmdPianoCSharp = NewCommandAttributesForDSControl("Piano: C#", DSControllerState_Piano_CSharp, false); CommandAttributes cmdPianoD = NewCommandAttributesForDSControl("Piano: D", DSControllerState_Piano_D, false); CommandAttributes cmdPianoDSharp = NewCommandAttributesForDSControl("Piano: D#", DSControllerState_Piano_DSharp, false); CommandAttributes cmdPianoE = NewCommandAttributesForDSControl("Piano: E", DSControllerState_Piano_E, false); CommandAttributes cmdPianoF = NewCommandAttributesForDSControl("Piano: F", DSControllerState_Piano_F, false); CommandAttributes cmdPianoFSharp = NewCommandAttributesForDSControl("Piano: F#", DSControllerState_Piano_FSharp, false); CommandAttributes cmdPianoG = NewCommandAttributesForDSControl("Piano: G", DSControllerState_Piano_G, false); CommandAttributes cmdPianoGSharp = NewCommandAttributesForDSControl("Piano: G#", DSControllerState_Piano_GSharp, false); CommandAttributes cmdPianoA = NewCommandAttributesForDSControl("Piano: A", DSControllerState_Piano_A, false); CommandAttributes cmdPianoASharp = NewCommandAttributesForDSControl("Piano: A#", DSControllerState_Piano_ASharp, false); CommandAttributes cmdPianoB = NewCommandAttributesForDSControl("Piano: B", DSControllerState_Piano_B, false); CommandAttributes cmdPianoHighC = NewCommandAttributesForDSControl("Piano: High C", DSControllerState_Piano_HighC, false); CommandAttributes cmdPaddle = NewCommandAttributesForDSControl("Paddle", DSControllerState_Paddle, false); cmdPaddle.allowAnalogInput = true; cmdPaddle.intValue[1] = 0; cmdPaddle.floatValue[0] = 10.0f; CommandAttributes cmdAutoholdSet = NewCommandAttributesForSelector("Autohold - Set", commandSelector["Autohold - Set"]); CommandAttributes cmdAutoholdClear = NewCommandAttributesForSelector("Autohold - Clear", commandSelector["Autohold - Clear"]); CommandAttributes cmdLoadEmuSaveStateSlot = NewCommandAttributesForSelector("Load State Slot", commandSelector["Load State Slot"]); CommandAttributes cmdSaveEmuSaveStateSlot = NewCommandAttributesForSelector("Save State Slot", commandSelector["Save State Slot"]); CommandAttributes cmdCopyScreen = NewCommandAttributesForSelector("Copy Screen", commandSelector["Copy Screen"]); CommandAttributes cmdRotateDisplayRelative = NewCommandAttributesForSelector("Rotate Display Relative", commandSelector["Rotate Display Relative"]); cmdRotateDisplayRelative.intValue[0] = 90; CommandAttributes cmdRotateDisplayLeft = NewCommandAttributesForSelector("Rotate Display Left", commandSelector["Rotate Display Relative"]); cmdRotateDisplayLeft.intValue[0] = -90; CommandAttributes cmdRotateDisplayRight = NewCommandAttributesForSelector("Rotate Display Right", commandSelector["Rotate Display Relative"]); cmdRotateDisplayRight.intValue[0] = 90; CommandAttributes cmdToggleAllDisplays = NewCommandAttributesForSelector("Toggle All Displays", commandSelector["Toggle All Displays"]); CommandAttributes cmdToggleSpeed = NewCommandAttributesForSelector("Set Speed", commandSelector["Set Speed"]); cmdToggleSpeed.floatValue[0] = 1.0f; CommandAttributes cmdToggleSpeedLimiter = NewCommandAttributesForSelector("Enable/Disable Speed Limiter", commandSelector["Enable/Disable Speed Limiter"]); CommandAttributes cmdToggleAutoFrameSkip = NewCommandAttributesForSelector("Enable/Disable Auto Frame Skip", commandSelector["Enable/Disable Auto Frame Skip"]); CommandAttributes cmdToggleCheats = NewCommandAttributesForSelector("Enable/Disable Cheats", commandSelector["Enable/Disable Cheats"]); CommandAttributes cmdCoreExecute = NewCommandAttributesForSelector("Execute", commandSelector["Execute"]); CommandAttributes cmdCorePause = NewCommandAttributesForSelector("Pause", commandSelector["Pause"]); CommandAttributes cmdToggleExecutePause = NewCommandAttributesForSelector("Execute/Pause", commandSelector["Execute/Pause"]); CommandAttributes cmdFrameAdvance = NewCommandAttributesForSelector("Frame Advance", commandSelector["Frame Advance"]); CommandAttributes cmdFrameJump = NewCommandAttributesForSelector("Frame Jump", commandSelector["Frame Jump"]); CommandAttributes cmdReset = NewCommandAttributesForSelector("Reset", commandSelector["Reset"]); CommandAttributes cmdToggleMute = NewCommandAttributesForSelector("Mute/Unmute", commandSelector["Mute/Unmute"]); CommandAttributes cmdToggleGPUState = NewCommandAttributesForSelector("Enable/Disable GPU State", commandSelector["Enable/Disable GPU State"]); defaultCommandAttributes["Up"] = cmdDSControlUp; defaultCommandAttributes["Down"] = cmdDSControlDown; defaultCommandAttributes["Right"] = cmdDSControlRight; defaultCommandAttributes["Left"] = cmdDSControlLeft; defaultCommandAttributes["A"] = cmdDSControlA; defaultCommandAttributes["B"] = cmdDSControlB; defaultCommandAttributes["X"] = cmdDSControlX; defaultCommandAttributes["Y"] = cmdDSControlY; defaultCommandAttributes["L"] = cmdDSControlL; defaultCommandAttributes["R"] = cmdDSControlR; defaultCommandAttributes["Start"] = cmdDSControlStart; defaultCommandAttributes["Select"] = cmdDSControlSelect; defaultCommandAttributes["Touch"] = cmdDSControlTouch; defaultCommandAttributes["Microphone"] = cmdDSControlMic; defaultCommandAttributes["Debug"] = cmdDSControlDebug; defaultCommandAttributes["Lid"] = cmdDSControlLid; defaultCommandAttributes["Guitar Grip: Green"] = cmdGuitarGripGreen; defaultCommandAttributes["Guitar Grip: Red"] = cmdGuitarGripRed; defaultCommandAttributes["Guitar Grip: Yellow"] = cmdGuitarGripYellow; defaultCommandAttributes["Guitar Grip: Blue"] = cmdGuitarGripBlue; defaultCommandAttributes["Piano: C"] = cmdPianoC; defaultCommandAttributes["Piano: C#"] = cmdPianoCSharp; defaultCommandAttributes["Piano: D"] = cmdPianoD; defaultCommandAttributes["Piano: D#"] = cmdPianoDSharp; defaultCommandAttributes["Piano: E"] = cmdPianoE; defaultCommandAttributes["Piano: F"] = cmdPianoF; defaultCommandAttributes["Piano: F#"] = cmdPianoFSharp; defaultCommandAttributes["Piano: G"] = cmdPianoG; defaultCommandAttributes["Piano: G#"] = cmdPianoGSharp; defaultCommandAttributes["Piano: A"] = cmdPianoA; defaultCommandAttributes["Piano: A#"] = cmdPianoASharp; defaultCommandAttributes["Piano: B"] = cmdPianoB; defaultCommandAttributes["Piano: High C"] = cmdPianoHighC; defaultCommandAttributes["Paddle"] = cmdPaddle; defaultCommandAttributes["Autohold - Set"] = cmdAutoholdSet; defaultCommandAttributes["Autohold - Clear"] = cmdAutoholdClear; defaultCommandAttributes["Load State Slot"] = cmdLoadEmuSaveStateSlot; defaultCommandAttributes["Save State Slot"] = cmdSaveEmuSaveStateSlot; defaultCommandAttributes["Copy Screen"] = cmdCopyScreen; defaultCommandAttributes["Rotate Display Left"] = cmdRotateDisplayLeft; defaultCommandAttributes["Rotate Display Right"] = cmdRotateDisplayRight; defaultCommandAttributes["Toggle All Displays"] = cmdToggleAllDisplays; defaultCommandAttributes["Set Speed"] = cmdToggleSpeed; defaultCommandAttributes["Enable/Disable Speed Limiter"] = cmdToggleSpeedLimiter; defaultCommandAttributes["Enable/Disable Auto Frame Skip"] = cmdToggleAutoFrameSkip; defaultCommandAttributes["Enable/Disable Cheats"] = cmdToggleCheats; defaultCommandAttributes["Execute"] = cmdCoreExecute; defaultCommandAttributes["Pause"] = cmdCorePause; defaultCommandAttributes["Execute/Pause"] = cmdToggleExecutePause; defaultCommandAttributes["Frame Advance"] = cmdFrameAdvance; defaultCommandAttributes["Frame Jump"] = cmdFrameJump; defaultCommandAttributes["Reset"] = cmdReset; defaultCommandAttributes["Mute/Unmute"] = cmdToggleMute; defaultCommandAttributes["Enable/Disable GPU State"] = cmdToggleGPUState; // Map all IBActions (the target object is an EmuControllerDelegate) [self addMappingForIBAction:@selector(autoholdSet:) commandAttributes:&cmdAutoholdSet]; [self addMappingForIBAction:@selector(autoholdClear:) commandAttributes:&cmdAutoholdClear]; [self addMappingForIBAction:@selector(loadEmuSaveStateSlot:) commandAttributes:&cmdLoadEmuSaveStateSlot]; [self addMappingForIBAction:@selector(saveEmuSaveStateSlot:) commandAttributes:&cmdSaveEmuSaveStateSlot]; [self addMappingForIBAction:@selector(copy:) commandAttributes:&cmdCopyScreen]; [self addMappingForIBAction:@selector(toggleAllDisplays:) commandAttributes:&cmdToggleAllDisplays]; [self addMappingForIBAction:@selector(changeRotationRelative:) commandAttributes:&cmdRotateDisplayRelative]; [self addMappingForIBAction:@selector(toggleSpeedLimiter:) commandAttributes:&cmdToggleSpeedLimiter]; [self addMappingForIBAction:@selector(toggleAutoFrameSkip:) commandAttributes:&cmdToggleAutoFrameSkip]; [self addMappingForIBAction:@selector(toggleCheats:) commandAttributes:&cmdToggleCheats]; [self addMappingForIBAction:@selector(coreExecute:) commandAttributes:&cmdCoreExecute]; [self addMappingForIBAction:@selector(corePause:) commandAttributes:&cmdCorePause]; [self addMappingForIBAction:@selector(toggleExecutePause:) commandAttributes:&cmdToggleExecutePause]; [self addMappingForIBAction:@selector(frameAdvance:) commandAttributes:&cmdFrameAdvance]; [self addMappingForIBAction:@selector(frameJump:) commandAttributes:&cmdFrameJump]; [self addMappingForIBAction:@selector(reset:) commandAttributes:&cmdReset]; [self addMappingForIBAction:@selector(toggleGPUState:) commandAttributes:&cmdToggleGPUState]; return self; } - (void)dealloc { [hidManager release]; [inputMappings release]; [commandTagList release]; [commandIcon release]; [super dealloc]; } #pragma mark Dynamic Properties - (void) setHidInputTarget:(id)theTarget { [hidManager setTarget:theTarget]; } - (id) hidInputTarget { return [hidManager target]; } #pragma mark Class Methods - (void) setMappingsWithMappings:(NSDictionary *)mappings { if (mappings == nil || commandTagList == nil) { return; } // Add the input mappings, filling in missing data as needed. for (NSString *commandTag in commandTagList) { NSArray *deviceInfoList = (NSArray *)[mappings valueForKey:commandTag]; if ([[self inputMappings] valueForKey:commandTag] == nil) { [[self inputMappings] setObject:[NSMutableArray arrayWithCapacity:4] forKey:commandTag]; } else { [self removeAllMappingsForCommandTag:[commandTag cStringUsingEncoding:NSUTF8StringEncoding]]; } for(NSDictionary *deviceInfo in deviceInfoList) { const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding]; CommandAttributes cmdAttr = defaultCommandAttributes[cmdTag]; UpdateCommandAttributesWithDeviceInfoDictionary(&cmdAttr, deviceInfo); // Force DS control commands to use IDs from code instead of from the file. // (In other words, we can't trust an external file with this information since // IDs might desync if the DS Control ID enumeration changes.) if (cmdAttr.selector == @selector(cmdUpdateDSController:) || cmdAttr.selector == @selector(cmdUpdateDSControllerWithTurbo:) || cmdAttr.selector == @selector(cmdUpdateDSTouch:) || cmdAttr.selector == @selector(cmdUpdateDSMicrophone:) || cmdAttr.selector == @selector(cmdUpdateDSPaddle:)) { cmdAttr.intValue[0] = defaultCommandAttributes[cmdTag].intValue[0]; } // Copy all command attributes into a new deviceInfo dictionary. NSMutableDictionary *newDeviceInfo = DeviceInfoDictionaryWithCommandAttributes(&cmdAttr, [deviceInfo valueForKey:@"deviceCode"], [deviceInfo valueForKey:@"deviceName"], [deviceInfo valueForKey:@"elementCode"], [deviceInfo valueForKey:@"elementName"]); [self addMappingUsingDeviceInfoDictionary:newDeviceInfo commandAttributes:&cmdAttr]; } } [self updateAudioFileGenerators]; } - (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceInfo commandAttributes:(const CommandAttributes *)cmdAttr { NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"]; NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"]; if (deviceCode == nil || elementCode == nil || cmdAttr == NULL) { return; } [self addMappingUsingDeviceCode:[deviceCode cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[elementCode cStringUsingEncoding:NSUTF8StringEncoding] commandAttributes:cmdAttr]; // Save the input device info for the user defaults. NSString *commandTagString = [NSString stringWithCString:cmdAttr->tag encoding:NSUTF8StringEncoding]; NSMutableArray *inputList = (NSMutableArray *)[[self inputMappings] valueForKey:commandTagString]; NSMutableDictionary *newDeviceInfo = [NSMutableDictionary dictionaryWithDictionary:deviceInfo]; [self updateInputSettingsSummaryInDeviceInfoDictionary:newDeviceInfo commandTag:cmdAttr->tag]; if (inputList == nil) { inputList = [NSMutableArray arrayWithObject:newDeviceInfo]; [[self inputMappings] setObject:inputList forKey:commandTagString]; } else { [inputList addObject:newDeviceInfo]; } } - (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandAttributes:(const CommandAttributes *)cmdAttr { if (inputAttr == NULL) { return; } NSMutableDictionary *deviceInfo = DeviceInfoDictionaryWithCommandAttributes(cmdAttr, [NSString stringWithCString:inputAttr->deviceCode encoding:NSUTF8StringEncoding], [NSString stringWithCString:inputAttr->deviceName encoding:NSUTF8StringEncoding], [NSString stringWithCString:inputAttr->elementCode encoding:NSUTF8StringEncoding], [NSString stringWithCString:inputAttr->elementName encoding:NSUTF8StringEncoding]); [deviceInfo setValue:[NSNumber numberWithBool:(cmdAttr->allowAnalogInput) ? inputAttr->isAnalog : NO] forKey:@"isInputAnalog"]; [self addMappingUsingDeviceInfoDictionary:deviceInfo commandAttributes:cmdAttr]; } - (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandAttributes:(const CommandAttributes *)cmdAttr { if (inputList == NULL) { return; } const size_t inputCount = inputList->size(); for (size_t i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = (*inputList)[i]; if (inputAttr.state != INPUT_ATTRIBUTE_STATE_ON) { continue; } [self addMappingUsingInputAttributes:&inputAttr commandAttributes:cmdAttr]; } } - (void) addMappingForIBAction:(const SEL)theSelector commandAttributes:(const CommandAttributes *)cmdAttr { if (theSelector == nil) { return; } CommandAttributes IBActionCmdAttr = *cmdAttr; IBActionCmdAttr.useInputForSender = true; [self addMappingUsingDeviceCode:"IBAction" elementCode:sel_getName(theSelector) commandAttributes:&IBActionCmdAttr]; } - (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandAttributes:(const CommandAttributes *)cmdAttr { if (deviceCode == NULL || elementCode == NULL || cmdAttr == NULL) { return; } // Remove all previous instances of this particular input device. (We will not be supporting // many-to-many mappings at this time. [self removeMappingUsingDeviceCode:deviceCode elementCode:elementCode]; // Map the input. [self setMappedCommandAttributes:cmdAttr deviceCode:deviceCode elementCode:elementCode]; } - (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode { if (deviceCode == NULL || elementCode == NULL) { return; } const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); commandMap.erase(inputKey); for (NSString *inputCommandTag in inputMappings) { NSMutableArray *inputList = (NSMutableArray *)[inputMappings valueForKey:inputCommandTag]; NSMutableArray *inputRemovalList = [NSMutableArray arrayWithCapacity:1]; for (NSDictionary *inputDeviceInfo in inputList) { NSString *deviceCodeString = [NSString stringWithCString:deviceCode encoding:NSUTF8StringEncoding]; NSString *elementCodeString = [NSString stringWithCString:elementCode encoding:NSUTF8StringEncoding]; NSString *inputDeviceCode = (NSString *)[inputDeviceInfo valueForKey:@"deviceCode"]; NSString *inputElementCode = (NSString *)[inputDeviceInfo valueForKey:@"elementCode"]; if ([inputDeviceCode isEqualToString:deviceCodeString] && [inputElementCode isEqualToString:elementCodeString]) { [inputRemovalList addObject:inputDeviceInfo]; } } [inputList removeObjectsInArray:inputRemovalList]; } } - (void) removeAllMappingsForCommandTag:(const char *)cmdTag { if (cmdTag == NULL) { return; } // This loop removes all mappings to commandTag, with the exception of IBAction mappings. for (InputCommandMap::iterator it=commandMap.begin(); it!=commandMap.end(); ++it) { if (it->first.find("IBAction") == std::string::npos && strncmp(it->second.tag, cmdTag, INPUT_HANDLER_STRING_LENGTH) == 0) { commandMap.erase(it); } } NSString *commandTag = [NSString stringWithCString:cmdTag encoding:NSUTF8StringEncoding]; NSMutableArray *inputList = (NSMutableArray *)[[self inputMappings] valueForKey:commandTag]; [inputList removeAllObjects]; } - (CommandAttributesList) generateCommandListUsingInputList:(const InputAttributesList *)inputList { CommandAttributesList cmdList; const size_t inputCount = inputList->size(); for (size_t i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = (*inputList)[i]; // All inputs require a device code and element code for mapping. If one or both are // not present, reject the input. if (inputAttr.deviceCode[0] == '\0' || inputAttr.elementCode[0] == '\0') { continue; } // Look up the command attributes using the input key. const std::string inputKey = std::string(inputAttr.deviceCode) + ":" + std::string(inputAttr.elementCode); CommandAttributes cmdAttr = commandMap[inputKey]; if (cmdAttr.tag[0] == '\0' || cmdAttr.selector == nil) { continue; } cmdAttr.input = inputAttr; // Copy the input state to the command attributes. cmdList.push_back(cmdAttr); // Add the command attributes to the list. } return cmdList; } - (void) dispatchCommandList:(const CommandAttributesList *)cmdList { size_t cmdCount = cmdList->size(); for (size_t i = 0; i < cmdCount; i++) { const CommandAttributes &cmdAttr = (*cmdList)[i]; if ([emuControl respondsToSelector:cmdAttr.selector]) { NSValue *cmdObject = [[NSValue alloc] initWithBytes:&cmdAttr objCType:@encode(CommandAttributes)]; [emuControl performSelector:cmdAttr.selector withObject:cmdObject]; [cmdObject release]; } } } - (BOOL) dispatchCommandUsingInputAttributes:(const InputAttributes *)inputAttr { BOOL didCommandDispatch = NO; // All inputs require a device code and element code for mapping. If one or both are // not present, reject the input. if (inputAttr->deviceCode[0] == '\0' || inputAttr->elementCode[0] == '\0') { return didCommandDispatch; } // Look up the command key using the input key. const std::string inputKey = std::string(inputAttr->deviceCode) + ":" + std::string(inputAttr->elementCode); CommandAttributes cmdAttr = commandMap[inputKey]; if (cmdAttr.tag[0] == '\0' || cmdAttr.selector == nil) { return didCommandDispatch; } // Copy the input state to the command attributes. cmdAttr.input = *inputAttr; if ([emuControl respondsToSelector:cmdAttr.selector]) { NSValue *cmdObject = [[NSValue alloc] initWithBytes:&cmdAttr objCType:@encode(CommandAttributes)]; [emuControl performSelector:cmdAttr.selector withObject:cmdObject]; [cmdObject release]; } didCommandDispatch = YES; return didCommandDispatch; } - (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector sender:(id)sender { const InputAttributes inputAttr = InputManagerEncodeIBAction(theSelector, sender); return [self dispatchCommandUsingInputAttributes:&inputAttr]; } - (void) writeDefaultsInputMappings { [[NSUserDefaults standardUserDefaults] setObject:[self inputMappings] forKey:@"Input_ControllerMappings"]; } - (NSString *) commandTagFromInputList:(NSArray *)inputList { NSString *commandTag = nil; if (inputList == nil) { return commandTag; } for (NSString *tag in inputMappings) { if (inputList == [inputMappings valueForKey:tag]) { commandTag = tag; break; } } return commandTag; } - (SEL) selectorOfCommandTag:(const char *)commandTag { return commandSelector[commandTag]; } - (CommandAttributes) defaultCommandAttributesForCommandTag:(const char *)commandTag { return defaultCommandAttributes[commandTag]; } - (CommandAttributes) mappedCommandAttributesOfDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode { const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); return commandMap[inputKey]; } - (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode { const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); commandMap[inputKey] = *cmdAttr; } - (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag { NSString *inputSummary = nil; if ((strncmp(commandTag, "Up", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "Down", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "Left", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "Right", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "A", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "B", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "X", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "Y", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "L", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "R", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "Start", INPUT_HANDLER_STRING_LENGTH) == 0) || (strncmp(commandTag, "Select", INPUT_HANDLER_STRING_LENGTH) == 0)) { const BOOL isTurbo = [(NSNumber *)[deviceInfo valueForKey:@"intValue1"] boolValue]; inputSummary = [NSString stringWithFormat:@"Turbo: %@", (isTurbo) ? @"Yes" : @"No"]; } else if (strncmp(commandTag, "Touch", INPUT_HANDLER_STRING_LENGTH) == 0) { const BOOL useInputForIntCoord = [(NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"] boolValue]; if (useInputForIntCoord) { inputSummary = NSSTRING_INPUTPREF_USE_DEVICE_COORDINATES; } else { const int xCoord = (int)[(NSNumber *)[deviceInfo valueForKey:@"intValue1"] intValue]; const int yCoord = (int)[(NSNumber *)[deviceInfo valueForKey:@"intValue2"] intValue]; inputSummary = [NSString stringWithFormat:@"X:%i Y:%i", xCoord, yCoord]; } } else if (strncmp(commandTag, "Microphone", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger micMode = [(NSNumber *)[deviceInfo valueForKey:@"intValue1"] integerValue]; switch (micMode) { case MICMODE_NONE: inputSummary = NSSTRING_INPUTPREF_MIC_NONE; break; case MICMODE_INTERNAL_NOISE: inputSummary = NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE; break; case MICMODE_AUDIO_FILE: inputSummary = (NSString *)[deviceInfo valueForKey:@"object1"]; if (inputSummary == nil) { inputSummary = NSSTRING_INPUTPREF_MIC_AUDIO_FILE_NONE_SELECTED; } break; case MICMODE_WHITE_NOISE: inputSummary = NSSTRING_INPUTPREF_MIC_WHITE_NOISE; break; case MICMODE_SINE_WAVE: inputSummary = [NSString stringWithFormat:NSSTRING_INPUTPREF_MIC_SINE_WAVE, [(NSNumber *)[deviceInfo valueForKey:@"floatValue0"] floatValue]]; break; case MICMODE_PHYSICAL: inputSummary = @"Physical:"; break; default: break; } } else if (strncmp(commandTag, "Load State Slot", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger slotNumber = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue] + 1; inputSummary = [NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber]; } else if (strncmp(commandTag, "Save State Slot", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger slotNumber = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue] + 1; inputSummary = [NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber]; } else if (strncmp(commandTag, "Set Speed", INPUT_HANDLER_STRING_LENGTH) == 0) { const float speedScalar = [(NSNumber *)[deviceInfo valueForKey:@"floatValue0"] floatValue]; inputSummary = [NSString stringWithFormat:NSSTRING_INPUTPREF_SPEED_SCALAR, speedScalar]; } else if (strncmp(commandTag, "Enable/Disable GPU State", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger gpuStateID = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue]; switch (gpuStateID) { case 0: inputSummary = NSSTRING_INPUTPREF_GPU_STATE_ALL_MAIN; break; case 1: inputSummary = @"Main BG0"; break; case 2: inputSummary = @"Main BG1"; break; case 3: inputSummary = @"Main BG2"; break; case 4: inputSummary = @"Main BG3"; break; case 5: inputSummary = @"Main OBJ"; break; case 6: inputSummary = NSSTRING_INPUTPREF_GPU_STATE_ALL_SUB; break; case 7: inputSummary = @"Sub BG0"; break; case 8: inputSummary = @"Sub BG1"; break; case 9: inputSummary = @"Sub BG2"; break; case 10: inputSummary = @"Sub BG3"; break; case 11: inputSummary = @"Sub OBJ"; break; default: break; } } else if (strncmp(commandTag, "Paddle", INPUT_HANDLER_STRING_LENGTH) == 0) { const BOOL isInputAnalog = [(NSNumber *)[deviceInfo valueForKey:@"isInputAnalog"] boolValue]; if (isInputAnalog) { const float paddleSensitivity = [(NSNumber *)[deviceInfo valueForKey:@"floatValue0"] floatValue]; inputSummary = [NSString stringWithFormat:@"Paddle Sensitivity: %1.1f", paddleSensitivity]; } else { const NSInteger paddleAdjust = [(NSNumber *)[deviceInfo valueForKey:@"intValue1"] integerValue]; if (paddleAdjust > 0) { inputSummary = [NSString stringWithFormat:@"Paddle Adjust: +%ld", (long)paddleAdjust]; } else { inputSummary = [NSString stringWithFormat:@"Paddle Adjust: %ld", (long)paddleAdjust]; } } } if (inputSummary == nil) { inputSummary = @""; } [deviceInfo setObject:inputSummary forKey:@"inputSettingsSummary"]; } - (OSStatus) loadAudioFileUsingPath:(NSString *)filePath { OSStatus error = noErr; if (filePath == nil) { error = 1; return error; } // Check if the audio file is already loaded. If it is, don't load it again. std::string filePathStr = std::string([filePath cStringUsingEncoding:NSUTF8StringEncoding]); for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it) { if (it->first.find(filePathStr) != std::string::npos) { return error; } } // Open the audio file using the file URL. NSURL *fileURL = [NSURL fileURLWithPath:filePath isDirectory:NO]; if (fileURL == nil) { error = 1; return error; } ExtAudioFileRef audioFile; error = ExtAudioFileOpenURL((CFURLRef)fileURL, &audioFile); if (error != noErr) { return error; } // Create an ASBD of the DS mic audio format. AudioStreamBasicDescription outputFormat; outputFormat.mSampleRate = MIC_SAMPLE_RATE; outputFormat.mFormatID = kAudioFormatLinearPCM; outputFormat.mFormatFlags = kAudioFormatFlagIsPacked; outputFormat.mBytesPerPacket = MIC_SAMPLE_SIZE; outputFormat.mFramesPerPacket = 1; outputFormat.mBytesPerFrame = MIC_SAMPLE_SIZE; outputFormat.mChannelsPerFrame = MIC_NUMBER_CHANNELS; outputFormat.mBitsPerChannel = MIC_SAMPLE_RESOLUTION; error = ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(outputFormat), &outputFormat); if (error != noErr) { return error; } AudioStreamBasicDescription inputFormat; UInt32 propertySize = sizeof(inputFormat); error = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileDataFormat, &propertySize, &inputFormat); if (error != noErr) { return error; } SInt64 fileLengthFrames = 0; propertySize = sizeof(fileLengthFrames); error = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileLengthFrames, &propertySize, &fileLengthFrames); if (error != noErr) { return error; } // Create a new audio file generator. audioFileGenerators[filePathStr] = AudioSampleBlockGenerator(); AudioSampleBlockGenerator &theGenerator = audioFileGenerators[filePathStr]; const size_t readSize = 32 * 1024; const size_t bufferSize = (size_t)((double)(outputFormat.mSampleRate / inputFormat.mSampleRate) * (double)fileLengthFrames) + readSize; uint8_t *buffer = theGenerator.allocate(bufferSize); // Read the audio file and fill the generator's buffer. AudioBufferList convertedData; convertedData.mNumberBuffers = 1; convertedData.mBuffers[0].mNumberChannels = outputFormat.mChannelsPerFrame; convertedData.mBuffers[0].mDataByteSize = readSize; convertedData.mBuffers[0].mData = buffer; UInt32 readFrames = readSize; while (readFrames > 0) { ExtAudioFileRead(audioFile, &readFrames, &convertedData); buffer += readFrames; convertedData.mBuffers[0].mData = buffer; } // Close the audio file. ExtAudioFileDispose(audioFile); // Convert the audio buffer to 7-bit unsigned PCM. buffer = theGenerator.getBuffer(); for (size_t i = 0; i < bufferSize; i++) { *(buffer+i) >>= 1; } return error; } - (AudioSampleBlockGenerator *) audioFileGeneratorFromFilePath:(NSString *)filePath { BOOL isAudioFileLoaded = NO; if (filePath == nil) { return NULL; } std::string filePathStr = std::string([filePath cStringUsingEncoding:NSUTF8StringEncoding]); for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it) { if (it->first.find(filePathStr) != std::string::npos) { isAudioFileLoaded = YES; break; } } return (isAudioFileLoaded) ? &audioFileGenerators[filePathStr] : NULL; } - (void) updateAudioFileGenerators { NSMutableArray *inputList = (NSMutableArray *)[inputMappings valueForKey:@"Microphone"]; // Load any unloaded audio files for (NSMutableArray *deviceInfo in inputList) { NSString *filePath = (NSString *)[deviceInfo valueForKey:@"object0"]; [self loadAudioFileUsingPath:filePath]; } // Unload any orphaned audio files for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it) { BOOL didFindKey = NO; NSString *audioGeneratorKey = [NSString stringWithCString:it->first.c_str() encoding:NSUTF8StringEncoding]; for (NSMutableDictionary *deviceInfo in inputList) { NSString *deviceAudioFilePath = (NSString *)[deviceInfo valueForKey:@"object0"]; if ([audioGeneratorKey isEqualToString:deviceAudioFilePath]) { didFindKey = YES; break; } } if (!didFindKey) { AudioSampleBlockGenerator *selectedGenerator = [emuControl selectedAudioFileGenerator]; if (selectedGenerator == &it->second) { [emuControl setSelectedAudioFileGenerator:NULL]; } audioFileGenerators.erase(it); } } } CommandAttributes NewDefaultCommandAttributes(const char *commandTag) { CommandAttributes cmdAttr; strncpy(cmdAttr.tag, commandTag, INPUT_HANDLER_STRING_LENGTH); cmdAttr.selector = nil; cmdAttr.intValue[0] = 0; cmdAttr.intValue[1] = 0; cmdAttr.intValue[2] = 0; cmdAttr.intValue[3] = 0; cmdAttr.floatValue[0] = 0; cmdAttr.floatValue[1] = 0; cmdAttr.floatValue[2] = 0; cmdAttr.floatValue[3] = 0; cmdAttr.object[0] = nil; cmdAttr.object[1] = nil; cmdAttr.object[2] = nil; cmdAttr.object[3] = nil; cmdAttr.useInputForIntCoord = false; cmdAttr.useInputForFloatCoord = false; cmdAttr.useInputForScalar = false; cmdAttr.useInputForSender = false; cmdAttr.allowAnalogInput = false; return cmdAttr; } CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector) { CommandAttributes cmdAttr = NewDefaultCommandAttributes(commandTag); cmdAttr.selector = theSelector; return cmdAttr; } CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID, const bool supportTurbo) { CommandAttributes cmdAttr = NewCommandAttributesForSelector(commandTag, @selector(cmdUpdateDSController:)); switch (controlID) { case DSControllerState_Right: case DSControllerState_Left: case DSControllerState_Down: case DSControllerState_Up: case DSControllerState_Select: case DSControllerState_Start: case DSControllerState_B: case DSControllerState_A: case DSControllerState_Y: case DSControllerState_X: case DSControllerState_L: case DSControllerState_R: cmdAttr.selector = @selector(cmdUpdateDSControllerWithTurbo:); break; case DSControllerState_Touch: cmdAttr.selector = @selector(cmdUpdateDSTouch:); break; case DSControllerState_Microphone: cmdAttr.selector = @selector(cmdUpdateDSMicrophone:); break; case DSControllerState_Paddle: cmdAttr.selector = @selector(cmdUpdateDSPaddle:); break; default: break; } cmdAttr.intValue[0] = controlID; cmdAttr.intValue[1] = NO; return cmdAttr; } void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo) { if (cmdAttr == NULL || deviceInfo == nil) { return; } NSNumber *intValue0 = (NSNumber *)[deviceInfo valueForKey:@"intValue0"]; NSNumber *intValue1 = (NSNumber *)[deviceInfo valueForKey:@"intValue1"]; NSNumber *intValue2 = (NSNumber *)[deviceInfo valueForKey:@"intValue2"]; NSNumber *intValue3 = (NSNumber *)[deviceInfo valueForKey:@"intValue3"]; NSNumber *floatValue0 = (NSNumber *)[deviceInfo valueForKey:@"floatValue0"]; NSNumber *floatValue1 = (NSNumber *)[deviceInfo valueForKey:@"floatValue1"]; NSNumber *floatValue2 = (NSNumber *)[deviceInfo valueForKey:@"floatValue2"]; NSNumber *floatValue3 = (NSNumber *)[deviceInfo valueForKey:@"floatValue3"]; NSObject *object0 = [deviceInfo valueForKey:@"object0"]; NSObject *object1 = [deviceInfo valueForKey:@"object1"]; NSObject *object2 = [deviceInfo valueForKey:@"object2"]; NSObject *object3 = [deviceInfo valueForKey:@"object3"]; NSNumber *useInputForIntCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"]; NSNumber *useInputForFloatCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForFloatCoord"]; NSNumber *useInputForScalar = (NSNumber *)[deviceInfo valueForKey:@"useInputForScalar"]; NSNumber *useInputForSender = (NSNumber *)[deviceInfo valueForKey:@"useInputForSender"]; NSNumber *isInputAnalog = (NSNumber *)[deviceInfo valueForKey:@"isInputAnalog"]; if (intValue0 != nil) cmdAttr->intValue[0] = [intValue0 intValue]; if (intValue1 != nil) cmdAttr->intValue[1] = [intValue1 intValue]; if (intValue2 != nil) cmdAttr->intValue[2] = [intValue2 intValue]; if (intValue3 != nil) cmdAttr->intValue[3] = [intValue3 intValue]; if (floatValue0 != nil) cmdAttr->floatValue[0] = [floatValue0 floatValue]; if (floatValue1 != nil) cmdAttr->floatValue[1] = [floatValue1 floatValue]; if (floatValue2 != nil) cmdAttr->floatValue[2] = [floatValue2 floatValue]; if (floatValue3 != nil) cmdAttr->floatValue[3] = [floatValue3 floatValue]; if (useInputForIntCoord != nil) cmdAttr->useInputForIntCoord = [useInputForIntCoord boolValue]; if (useInputForFloatCoord != nil) cmdAttr->useInputForFloatCoord = [useInputForFloatCoord boolValue]; if (useInputForScalar != nil) cmdAttr->useInputForScalar = [useInputForScalar boolValue]; if (useInputForSender != nil) cmdAttr->useInputForSender = [useInputForSender boolValue]; if (isInputAnalog != nil) cmdAttr->allowAnalogInput = [isInputAnalog boolValue]; cmdAttr->object[0] = object0; cmdAttr->object[1] = object1; cmdAttr->object[2] = object2; cmdAttr->object[3] = object3; } NSMutableDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr, NSString *deviceCode, NSString *deviceName, NSString *elementCode, NSString *elementName) { if (cmdAttr == NULL || deviceCode == nil || deviceName == nil || elementCode == nil || elementName == nil) { return nil; } NSString *deviceInfoSummary = [[deviceName stringByAppendingString:@": "] stringByAppendingString:elementName]; NSMutableDictionary *newDeviceInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: deviceCode, @"deviceCode", deviceName, @"deviceName", elementCode, @"elementCode", elementName, @"elementName", [NSNumber numberWithBool:cmdAttr->allowAnalogInput], @"isInputAnalog", deviceInfoSummary, @"deviceInfoSummary", @"", @"inputSettingsSummary", [NSNumber numberWithInt:cmdAttr->intValue[0]], @"intValue0", [NSNumber numberWithInt:cmdAttr->intValue[1]], @"intValue1", [NSNumber numberWithInt:cmdAttr->intValue[2]], @"intValue2", [NSNumber numberWithInt:cmdAttr->intValue[3]], @"intValue3", [NSNumber numberWithFloat:cmdAttr->floatValue[0]], @"floatValue0", [NSNumber numberWithFloat:cmdAttr->floatValue[1]], @"floatValue1", [NSNumber numberWithFloat:cmdAttr->floatValue[2]], @"floatValue2", [NSNumber numberWithFloat:cmdAttr->floatValue[3]], @"floatValue3", [NSNumber numberWithBool:cmdAttr->useInputForIntCoord], @"useInputForIntCoord", [NSNumber numberWithBool:cmdAttr->useInputForFloatCoord], @"useInputForFloatCoord", [NSNumber numberWithBool:cmdAttr->useInputForScalar], @"useInputForScalar", [NSNumber numberWithBool:cmdAttr->useInputForSender], @"useInputForSender", nil]; // Set the object references last since these could be nil. [newDeviceInfo setValue:cmdAttr->object[0] forKey:@"object0"]; [newDeviceInfo setValue:cmdAttr->object[1] forKey:@"object1"]; [newDeviceInfo setValue:cmdAttr->object[2] forKey:@"object2"]; [newDeviceInfo setValue:cmdAttr->object[3] forKey:@"object3"]; return newDeviceInfo; } InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue, InputManager *inputManager, bool forceDigitalInput) { InputAttributesList inputList; if (hidQueue == nil) { return inputList; } do { IOHIDValueRef hidValueRef = IOHIDQueueCopyNextValueWithTimeout(hidQueue, 0.0); if (hidValueRef == NULL) { break; } InputAttributesList hidInputList = InputListFromHIDValue(hidValueRef, inputManager, forceDigitalInput); const size_t hidInputCount = hidInputList.size(); for (size_t i = 0; i < hidInputCount; i++) { inputList.push_back(hidInputList[i]); } CFRelease(hidValueRef); } while (1); if (!inputList.empty()) { // HID input devices don't register events, so we need to manually prevent // sleep and screensaver whenever we detect an input. UpdateSystemActivity(UsrActivity); } return inputList; } InputAttributes InputManagerEncodeKeyboardInput(const unsigned short keyCode, BOOL keyPressed) { std::string elementName = keyboardNameTable[keyCode]; InputAttributes inputAttr; strncpy(inputAttr.deviceCode, "NSEventKeyboard", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.deviceName, "Keyboard", INPUT_HANDLER_STRING_LENGTH); snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "%d", keyCode); strncpy(inputAttr.elementName, (elementName.empty()) ? inputAttr.elementCode : elementName.c_str(), INPUT_HANDLER_STRING_LENGTH); inputAttr.isAnalog = false; inputAttr.state = (keyPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; inputAttr.intCoordX = 0; inputAttr.intCoordY = 0; inputAttr.floatCoordX = 0.0f; inputAttr.floatCoordY = 0.0f; inputAttr.scalar = (keyPressed) ? 1.0f : 0.0f; inputAttr.sender = nil; return inputAttr; } InputAttributes InputManagerEncodeMouseButtonInput(const NSInteger buttonNumber, const NSPoint touchLoc, BOOL buttonPressed) { InputAttributes inputAttr; strncpy(inputAttr.deviceCode, "NSEventMouse", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.deviceName, "Mouse", INPUT_HANDLER_STRING_LENGTH); snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "%i", (const int)buttonNumber); switch (buttonNumber) { case kCGMouseButtonLeft: strncpy(inputAttr.elementName, "Primary Button", INPUT_HANDLER_STRING_LENGTH); break; case kCGMouseButtonRight: strncpy(inputAttr.elementName, "Secondary Button", INPUT_HANDLER_STRING_LENGTH); break; case kCGMouseButtonCenter: strncpy(inputAttr.elementName, "Center Button", INPUT_HANDLER_STRING_LENGTH); break; default: snprintf(inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, "Button %i", (const int)buttonNumber); break; } inputAttr.isAnalog = false; inputAttr.state = (buttonPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; inputAttr.intCoordX = (int32_t)touchLoc.x; inputAttr.intCoordY = (int32_t)touchLoc.y; inputAttr.floatCoordX = touchLoc.x; inputAttr.floatCoordY = touchLoc.y; inputAttr.scalar = (buttonPressed) ? 1.0f : 0.0f; inputAttr.sender = nil; return inputAttr; } InputAttributes InputManagerEncodeIBAction(const SEL theSelector, id sender) { InputAttributes inputAttr; strncpy(inputAttr.deviceCode, "IBAction", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.deviceName, "Application", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.elementCode, sel_getName(theSelector), INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.elementName, inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH); inputAttr.isAnalog = false; inputAttr.state = INPUT_ATTRIBUTE_STATE_ON; inputAttr.intCoordX = 0; inputAttr.intCoordY = 0; inputAttr.floatCoordX = 0.0f; inputAttr.floatCoordY = 0.0f; inputAttr.scalar = 1.0f; inputAttr.sender = sender; return inputAttr; } @end desmume-0.9.11/src/cocoa/FileTypeInfo.plist0000755000000000000000000002713612467662066017257 0ustar rootroot VersionStrings 0.9.6 0.9.7 0.9.8 0.9.9 0.9.10 0.9.11 PortStrings 0.9.6 GTK 0.9.7 Cocoa 0.9.8 Cocoa OpenEmu 0.9.9 Cocoa OpenEmu 0.9.10 Cocoa OpenEmu 0.9.11 Cocoa OpenEmu DefaultPaths 0.9.6 GTK ROM Save ~/.config/desmume Cheat ~/.config/desmume Save State ~/.config/desmume 0.9.7 Cocoa ROM Save ${WITHROM} Save State ${APPSUPPORT} 0.9.8 Cocoa ROM Save ${APPSUPPORT} Cheat ${APPSUPPORT} Firmware Configuration ${APPSUPPORT} Save State ${APPSUPPORT} OpenEmu ROM Save ${OPENEMU} Save State ${OPENEMU} 0.9.9 Cocoa ROM Save ${APPSUPPORT} Cheat ${APPSUPPORT} Firmware Configuration ${APPSUPPORT} Save State ${APPSUPPORT} OpenEmu ROM Save ${OPENEMU} Save State ${OPENEMU} 0.9.10 Cocoa ROM Save ${APPSUPPORT} Cheat ${APPSUPPORT} Firmware Configuration ${APPSUPPORT} Save State ${APPSUPPORT} OpenEmu ROM Save ${OPENEMU} Save State ${OPENEMU} 0.9.11 Cocoa ROM Save ${APPSUPPORT} Cheat ${APPSUPPORT} Firmware Configuration ${APPSUPPORT} Save State ${APPSUPPORT} OpenEmu ROM Save ${OPENEMU} Save State ${OPENEMU} DirectoryNames 0.9.6 GTK ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.7 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.8 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.9 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.10 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.11 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples FileExtensionByTypes 0.9.6 GTK ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.7 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.8 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.9 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.10 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.11 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds FileTypeByExtensions 0.9.6 GTK dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.7 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.8 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.9 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.10 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.11 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM desmume-0.9.11/src/cocoa/cocoa_rom.mm0000755000000000000000000006446212467662066016144 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_rom.h" #import "cocoa_file.h" #import "cocoa_globals.h" #import "cocoa_util.h" #include "../NDSSystem.h" #include "../common.h" #include "../mc.h" #undef BOOL @implementation CocoaDSRom @synthesize header; @synthesize bindings; @synthesize fileURL; @dynamic willStreamLoadData; @dynamic isDataLoaded; @synthesize saveType; static NSMutableDictionary *saveTypeValues = nil; - (id)init { return [self initWithURL:nil]; } - (id) initWithURL:(NSURL *)theURL { return [self initWithURL:theURL saveType:ROMSAVETYPE_AUTOMATIC]; } - (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID { return [self initWithURL:theURL saveType:ROMSAVETYPE_AUTOMATIC streamLoadData:NO]; } - (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID streamLoadData:(BOOL)willStreamLoad { self = [super init]; if (self == nil) { return self; } if (saveTypeValues == nil) { saveTypeValues = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInteger:1], @"eeprom - 4 kbit", [NSNumber numberWithInteger:2], @"eeprom - 64 kbit", [NSNumber numberWithInteger:3], @"eeprom - 512 kbit", [NSNumber numberWithInteger:5], @"flash - 2 mbit", [NSNumber numberWithInteger:6], @"flash - 4 mbit", [NSNumber numberWithInteger:7], @"flash - 8 mbit", [NSNumber numberWithInteger:10], @"flash - 64 mbit", [NSNumber numberWithInteger:0], @"none", [NSNumber numberWithInteger:0], @"tbc", nil]; } header = [[NSMutableDictionary alloc] initWithCapacity:32]; if (header == nil) { [self release]; self = nil; return self; } bindings = [[CocoaDSRom romNotLoadedBindings] retain]; if (bindings == nil) { [header release]; [self release]; self = nil; return self; } fileURL = nil; saveType = saveTypeID; xmlCurrentRom = nil; xmlElementStack = [[NSMutableArray alloc] initWithCapacity:32]; xmlCharacterStack = [[NSMutableArray alloc] initWithCapacity:32]; [self setWillStreamLoadData:willStreamLoad]; if (theURL != nil) { [self loadData:theURL]; } return self; } - (void)dealloc { if ([self isDataLoaded]) { NDS_FreeROM(); } [xmlElementStack release]; [xmlCharacterStack release]; [header release]; [bindings release]; [fileURL release]; [super dealloc]; } - (void) setWillStreamLoadData:(BOOL)theState { CommonSettings.loadToMemory = (theState) ? false : true; } - (BOOL) willStreamLoadData { return (CommonSettings.loadToMemory ? NO : YES); } - (BOOL) isDataLoaded { return (gameInfo.romdata != NULL); } - (void) initHeader { const NDS_header *ndsRomHeader = NDS_getROMHeader(); const RomBanner &ndsRomBanner = gameInfo.getRomBanner(); if(self.header == nil || self.bindings == nil) { return; } if (&ndsRomBanner != NULL) { [self.header setValue:[self banner:ndsRomBanner.titles[0]] forKey:@"bannerJapanese"]; [self.header setValue:[self banner:ndsRomBanner.titles[1]] forKey:@"bannerEnglish"]; [self.header setValue:[self banner:ndsRomBanner.titles[2]] forKey:@"bannerFrench"]; [self.header setValue:[self banner:ndsRomBanner.titles[3]] forKey:@"bannerGerman"]; [self.header setValue:[self banner:ndsRomBanner.titles[4]] forKey:@"bannerItalian"]; [self.header setValue:[self banner:ndsRomBanner.titles[5]] forKey:@"bannerSpanish"]; [self.bindings setValue:[self.header objectForKey:@"bannerJapanese"] forKey:@"bannerJapanese"]; [self.bindings setValue:[self.header objectForKey:@"bannerEnglish"] forKey:@"bannerEnglish"]; [self.bindings setValue:[self.header objectForKey:@"bannerFrench"] forKey:@"bannerFrench"]; [self.bindings setValue:[self.header objectForKey:@"bannerGerman"] forKey:@"bannerGerman"]; [self.bindings setValue:[self.header objectForKey:@"bannerItalian"] forKey:@"bannerItalian"]; [self.bindings setValue:[self.header objectForKey:@"bannerSpanish"] forKey:@"bannerSpanish"]; } if (ndsRomHeader != NULL) { [self.header setValue:[self title] forKey:@"gameTitle"]; [self.header setValue:[self code] forKey:@"gameCode"]; [self.header setValue:[self developerName] forKey:@"gameDeveloper"]; [self.header setValue:[self developerNameAndCode] forKey:@"gameDeveloperWithCode"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->makerCode] forKey:@"makerCode"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->unitCode] forKey:@"unitCode"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->cardSize] forKey:@"romSize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9src] forKey:@"arm9BinaryOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9exe] forKey:@"arm9BinaryEntryAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9cpy] forKey:@"arm9BinaryStartAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9binSize] forKey:@"arm9BinarySize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7src] forKey:@"arm7BinaryOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7exe] forKey:@"arm7BinaryEntryAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7cpy] forKey:@"arm7BinaryStartAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7binSize] forKey:@"arm7BinarySize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FNameTblOff] forKey:@"fntOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FNameTblSize] forKey:@"fntTableSize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FATOff] forKey:@"fatOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FATSize] forKey:@"fatSize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->IconOff] forKey:@"iconOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->endROMoffset] forKey:@"usedRomSize"]; [self.bindings setValue:[self.header objectForKey:@"gameTitle"] forKey:@"gameTitle"]; [self.bindings setValue:[self.header objectForKey:@"gameCode"] forKey:@"gameCode"]; [self.bindings setValue:[self.header objectForKey:@"gameDeveloper"] forKey:@"gameDeveloper"]; [self.bindings setValue:[self.header objectForKey:@"gameDeveloperWithCode"] forKey:@"gameDeveloperWithCode"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%04X", [[self.header objectForKey:@"makerCode"] intValue]] forKey:@"makerCode"]; [self.bindings setValue:[self unitCodeStringUsingID:[[self.header objectForKey:@"unitCode"] intValue]] forKey:@"unitCode"]; [self.bindings setValue:[CocoaDSRom byteSizeStringWithLargerUnit:(128*1024) << [[self.header objectForKey:@"romSize"] intValue]] forKey:@"romSize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryOffset"] intValue]] forKey:@"arm9BinaryOffset"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryEntryAddress"] intValue]] forKey:@"arm9BinaryEntryAddress"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryStartAddress"] intValue]] forKey:@"arm9BinaryStartAddress"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"arm9BinarySize"] intValue]] forKey:@"arm9BinarySize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryOffset"] intValue]] forKey:@"arm7BinaryOffset"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryEntryAddress"] intValue]] forKey:@"arm7BinaryEntryAddress"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryStartAddress"] intValue]] forKey:@"arm7BinaryStartAddress"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"arm7BinarySize"] intValue]] forKey:@"arm7BinarySize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fntOffset"] intValue]] forKey:@"fntOffset"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"fntTableSize"] intValue]] forKey:@"fntTableSize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fatOffset"] intValue]] forKey:@"fatOffset"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"fatSize"] intValue]] forKey:@"fatSize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fatOffset"] intValue]] forKey:@"fatOffset"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"iconOffset"] intValue]] forKey:@"iconOffset"]; [self.bindings setValue:[CocoaDSRom byteSizeStringWithLargerUnit:[[self.header objectForKey:@"usedRomSize"] intValue]] forKey:@"usedRomSize"]; [self.bindings setValue:[CocoaDSRom byteSizeStringWithLargerUnit:(((128*1024) << [[self.header objectForKey:@"romSize"] intValue]) - [[self.header objectForKey:@"usedRomSize"] intValue])] forKey:@"unusedCapacity"]; } // Get ROM image NSImage *iconImage = [self icon]; if (iconImage != nil) { [header setObject:iconImage forKey:@"iconImage"]; [self.bindings setObject:(NSImage *)[self.header objectForKey:@"iconImage"] forKey:@"iconImage"]; } [self.header setValue:[self internalName] forKey:@"romInternalName"]; [self.header setValue:[self serial] forKey:@"romSerial"]; [self.bindings setValue:[self.header objectForKey:@"romInternalName"] forKey:@"romInternalName"]; [self.bindings setValue:[self.header objectForKey:@"romSerial"] forKey:@"romSerial"]; NSString *romNameAndSerialInfoString = @"Name: "; romNameAndSerialInfoString = [romNameAndSerialInfoString stringByAppendingString:[self.header objectForKey:@"romInternalName"]]; romNameAndSerialInfoString = [[romNameAndSerialInfoString stringByAppendingString:@"\nSerial: "] stringByAppendingString:[self.header objectForKey:@"romSerial"]]; [self.bindings setValue:romNameAndSerialInfoString forKey:@"romNameAndSerialInfo"]; } - (BOOL) loadData:(NSURL *)theURL { [CocoaDSRom changeRomSaveType:saveType]; BOOL result = [CocoaDSFile loadRom:theURL]; if (!result) { NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"DidLoad", nil]; [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.loadRomDidFinish" object:self userInfo:userInfo]; [userInfo release]; return result; } fileURL = [theURL copy]; [self initHeader]; NSString *advscDBPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Advanscene_DatabasePath"]; if (advscDBPath != nil) { NSError *xmlError = [[NSError alloc] init]; NSXMLParser *advscDB = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL fileURLWithPath:advscDBPath]]; [advscDB setDelegate:self]; [advscDB parse]; [advscDB release]; [xmlError release]; } NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"DidLoad", self.fileURL, @"URL", nil]; [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.loadRomDidFinish" object:self userInfo:userInfo]; [userInfo release]; return result; } - (void) loadDataOnThread:(id)object { [self retain]; NSURL *theURL = [(NSURL *)object copy]; NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init]; [self loadData:theURL]; [threadPool release]; [theURL release]; [self release]; } - (NSString *) title { NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return nil; } return [[[NSString alloc] initWithBytes:ndsRomHeader->gameTile length:ROMINFO_GAME_TITLE_LENGTH encoding:NSUTF8StringEncoding] autorelease]; } - (NSString *) code { NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return nil; } return [[[NSString alloc] initWithBytes:ndsRomHeader->gameCode length:ROMINFO_GAME_CODE_LENGTH encoding:NSUTF8StringEncoding] autorelease]; } - (NSString *) banner:(const UInt16 *)UTF16TextBuffer { NSUInteger bannerLength = ROMINFO_GAME_BANNER_LENGTH * sizeof(*UTF16TextBuffer); return [[[NSString alloc] initWithBytes:UTF16TextBuffer length:bannerLength encoding:NSUTF16LittleEndianStringEncoding] autorelease]; } - (NSString *) internalName { return [NSString stringWithCString:gameInfo.ROMname encoding:NSUTF8StringEncoding]; } - (NSString *) serial { return [NSString stringWithCString:gameInfo.ROMserial encoding:NSUTF8StringEncoding]; } - (NSString *) developerName { NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return nil; } return [NSString stringWithCString:getDeveloperNameByID(ndsRomHeader->makerCode).c_str() encoding:NSUTF8StringEncoding]; } - (NSString *) developerNameAndCode { NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return nil; } return [NSString stringWithFormat:@"%s [0x%04X]", getDeveloperNameByID(ndsRomHeader->makerCode).c_str(), ndsRomHeader->makerCode]; } - (NSString *) unitCodeStringUsingID:(NSInteger)unitCodeID { switch (unitCodeID) { case 0: return @"NDS"; break; case 1: return @"DSi (Invalid ID)"; break; case 2: return @"NDS + DSi"; break; case 3: return @"DSi"; break; default: break; } return @"Unknown"; } - (NSImage *) icon { NSImage *newImage = nil; NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return newImage; } NSUInteger iconOffset = ndsRomHeader->IconOff; if(iconOffset == 0) { return newImage; } newImage = [[NSImage alloc] initWithSize:NSMakeSize(32, 32)]; if(newImage == nil) { return newImage; } NSUInteger w = ROM_ICON_WIDTH; NSUInteger h = ROM_ICON_HEIGHT; NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:w * 4 bitsPerPixel:32]; if(imageRep == nil) { [newImage release]; newImage = nil; return newImage; } uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; RomIconToRGBA8888(bitmapData); #ifdef __BIG_ENDIAN__ uint32_t *bitmapDataEnd = bitmapData + (w * h); while (bitmapData < bitmapDataEnd) { *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); } #endif [imageRep autorelease]; [newImage addRepresentation:imageRep]; return [newImage autorelease]; } - (void) handleAdvansceneDatabaseInfo { if (xmlCurrentRom == nil) { return; } // Set the ROM save type. BOOL useAdvscForRomSave = [[NSUserDefaults standardUserDefaults] boolForKey:@"Advanscene_AutoDetectRomSaveType"]; if (useAdvscForRomSave && (saveType == ROMSAVETYPE_AUTOMATIC)) { NSString *saveTypeString = (NSString *)[xmlCurrentRom valueForKey:@"saveType"]; NSInteger saveTypeID = [CocoaDSRom saveTypeByString:saveTypeString]; [CocoaDSRom changeRomSaveType:saveTypeID]; if (saveTypeID != ROMSAVETYPE_AUTOMATIC) { NSLog(@"Set the ROM save type using the ADVANsCEne database: %s.", [saveTypeString cStringUsingEncoding:NSUTF8StringEncoding]); } } } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { NSMutableString *xmlCharacters = [NSMutableString stringWithCapacity:1024]; [xmlCharacters setString:@""]; [xmlCharacterStack addObject:xmlCharacters]; [xmlElementStack addObject:elementName]; if ([elementName isEqualToString:@"game"]) { if (xmlCurrentRom == nil) { xmlCurrentRom = [[NSMutableDictionary alloc] initWithCapacity:32]; } } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName { NSString *xmlElement = (NSString *)[xmlElementStack lastObject]; if (xmlElement == nil || ![xmlElement isEqualToString:elementName]) { return; } NSMutableString *xmlCharacters = (NSMutableString *)[xmlCharacterStack lastObject]; [xmlCharacters setString:[xmlCharacters stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; if ([elementName isEqualToString:@"game"]) { NSString *romHeaderSerial = (NSString *)[self.header valueForKey:@"romSerial"]; NSString *xmlSerial = (NSString *)[xmlCurrentRom valueForKey:@"serial"]; if ([xmlSerial isEqualToString:romHeaderSerial]) { [self handleAdvansceneDatabaseInfo]; [parser abortParsing]; } [xmlCurrentRom release]; xmlCurrentRom = nil; } else { if (xmlCurrentRom != nil) { [xmlCurrentRom setValue:[NSString stringWithString:xmlCharacters] forKey:elementName]; } } [xmlCharacterStack removeLastObject]; [xmlElementStack removeLastObject]; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSMutableString *xmlCharacters = (NSMutableString *)[xmlCharacterStack lastObject]; if (xmlCharacters != nil) { [xmlCharacters appendString:string]; } } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSInteger errorCode = [parseError code]; if (errorCode == NSXMLParserDelegateAbortedParseError) { return; } } + (void) changeRomSaveType:(NSInteger)saveTypeID { CommonSettings.manualBackupType = (int)saveTypeID; if (saveTypeID != ROMSAVETYPE_AUTOMATIC) { backup_forceManualBackupType(); } } + (NSInteger) saveTypeByString:(NSString *)saveTypeString { NSInteger saveTypeID = 0; if (saveTypeValues == nil) { return saveTypeID; } NSNumber *saveTypeNumber = (NSNumber *)[saveTypeValues valueForKey:[saveTypeString lowercaseString]]; if (saveTypeNumber == nil) { return saveTypeID; } saveTypeID = [saveTypeNumber integerValue]; return saveTypeID; } + (NSMutableDictionary *) romNotLoadedBindings { NSImage *iconImage = [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AppIcon_DeSmuME" ofType:@"icns"]] autorelease]; NSString *romNameAndSerialInfoString = @"Name: "; romNameAndSerialInfoString = [romNameAndSerialInfoString stringByAppendingString:NSSTRING_STATUS_NO_ROM_LOADED]; romNameAndSerialInfoString = [[romNameAndSerialInfoString stringByAppendingString:@"\nSerial: "] stringByAppendingString:NSSTRING_STATUS_NO_ROM_LOADED]; return [NSMutableDictionary dictionaryWithObjectsAndKeys: NSSTRING_STATUS_NO_ROM_LOADED, @"romInternalName", NSSTRING_STATUS_NO_ROM_LOADED, @"romSerial", romNameAndSerialInfoString, @"romNameAndSerialInfo", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerJapanese", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerEnglish", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerFrench", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerGerman", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerItalian", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerSpanish", NSSTRING_STATUS_NO_ROM_LOADED, @"gameTitle", NSSTRING_STATUS_NO_ROM_LOADED, @"gameCode", NSSTRING_STATUS_NO_ROM_LOADED, @"gameDeveloper", NSSTRING_STATUS_NO_ROM_LOADED, @"gameDeveloperWithCode", NSSTRING_STATUS_NO_ROM_LOADED, @"unitCode", NSSTRING_STATUS_NO_ROM_LOADED, @"makerCode", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"romSize", @"----------", @"arm9BinaryOffset", @"----------", @"arm9BinaryEntryAddress", @"----------", @"arm9BinaryStartAddress", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm9BinarySize", @"----------", @"arm7BinaryOffset", @"----------", @"arm7BinaryEntryAddress", @"----------", @"arm7BinaryStartAddress", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm7BinarySize", @"----------", @"fntOffset", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"fntTableSize", @"----------", @"fatOffset", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"fatSize", @"----------", @"iconOffset", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"usedRomSize", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"unusedCapacity", iconImage, @"iconImage", nil]; } + (NSString *) byteSizeStringWithLargerUnit:(NSUInteger)byteSize { float kilobyteSize = byteSize / 1024.0; float megabyteSize = kilobyteSize / 1024.0; float gigabyteSize = megabyteSize / 1024.0; NSString *byteString = [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, byteSize]; NSString *unitString = byteString; if (gigabyteSize > 1.0f) { unitString = [NSString stringWithFormat:@"%@ (%1.1f GB)", byteString, gigabyteSize]; } else if (megabyteSize > 1.0f) { unitString = [NSString stringWithFormat:@"%@ (%1.1f MB)", byteString, megabyteSize]; } else if (kilobyteSize > 1.0f) { unitString = [NSString stringWithFormat:@"%@ (%1.1f KB)", byteString, kilobyteSize]; } return unitString; } @end /******************************************************************************************** RomIconToRGBA8888() Reads the icon image data from a ROM and converts it to an RGBA8888 formatted bitmap. Takes: bitmapData - Write pointer for the icon's pixel data. Returns: Nothing. Details: - If bitmapData is NULL, then this function immediately returns and does nothing. - If no ROM is loaded, then bitmapData will have a black square icon. - The caller is responsible for ensuring that bitmapData points to a valid memory location and that the memory block is large enough to hold the pixel data. The written data will be 32x32 pixels in 32-bit color. Therefore, a size of at least 4096 bytes must be allocated. ********************************************************************************************/ void RomIconToRGBA8888(uint32_t *bitmapData) { const RomBanner &ndsRomBanner = gameInfo.getRomBanner(); // Contains the memory addresses we need to get our read pointer locations. const uint16_t *iconClutPtr; // Read pointer for the icon's CLUT. const uint32_t *iconPixPtr; // Read pointer for the icon's pixel data. uint32_t clut[16]; // 4-bit indexed CLUT, storing RGBA8888 values for each color. uint32_t pixRowColors; // Temp location for storing an 8 pixel row of 4-bit indexed color values from the icon's pixel data. unsigned int pixRowIndex; // Temp location for tracking which pixel row of an 8x8 square that we are reading. unsigned int x; // Temp location for tracking which of the 8x8 pixel squares that we are reading (x-dimension). unsigned int y; // Temp location for tracking which of the 8x8 pixel squares that we are reading (y-dimension). uint32_t *bitmapPixPtr; // Write pointer for the RGBA8888 bitmap pixel data, relative to the passed in *bitmapData pointer. if (bitmapData == NULL) { return; } if (&ndsRomBanner == NULL) { memset(bitmapData, 0, 4096); // 4096 bytes = 32px * 32px * sizeof(uint32_t) return; } // Set all of our icon read pointers. iconClutPtr = (uint16_t *)ndsRomBanner.palette + 1; iconPixPtr = (uint32_t *)ndsRomBanner.bitmap; // Setup the 4-bit CLUT. // // The actual color values are stored with the ROM icon data in RGB555 format. // We convert these color values and store them in the CLUT as RGBA8888 values. // // The first entry always represents the alpha, so we can just ignore it. clut[0] = 0x00000000; RGB555ToRGBA8888Buffer(iconClutPtr, &clut[1], 15); // Load the image from the icon pixel data. // // ROM icons are stored in 4-bit indexed color and have dimensions of 32x32 pixels. // Also, ROM icons are split into 16 separate 8x8 pixel squares arranged in a 4x4 // array. Here, we sequentially read from the ROM data, and adjust our write // location appropriately within the bitmap memory block. for(y = 0; y < 4; y++) { for(x = 0; x < 4; x++) { for(pixRowIndex = 0; pixRowIndex < 8; pixRowIndex++, iconPixPtr++) { // Load the entire row of pixels as a single 32-bit chunk. pixRowColors = *iconPixPtr; // Set the write location. The formula below calculates the proper write // location depending on the position of the read pointer. We use a more // optimized version of this formula in practice. // // bitmapPixPtr = bitmapData + ( ((y * 8) + pixRowIndex) * 32 ) + (x * 8); bitmapPixPtr = bitmapData + ( ((y << 3) + pixRowIndex) << 5 ) + (x << 3); // Set the RGBA8888 bitmap pixels using our CLUT from earlier. #ifdef __BIG_ENDIAN__ *bitmapPixPtr = clut[(pixRowColors & 0x0F000000) >> 24]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0xF0000000) >> 28]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000F0000) >> 16]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00F00000) >> 20]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00000F00) >> 8]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0000F000) >> 12]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0000000F)]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000000F0) >> 4]; #else *bitmapPixPtr = clut[(pixRowColors & 0x0000000F)]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000000F0) >> 4]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00000F00) >> 8]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0000F000) >> 12]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000F0000) >> 16]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00F00000) >> 20]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0F000000) >> 24]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0xF0000000) >> 28]; #endif } } } } desmume-0.9.11/src/cocoa/cocoa_cheat.mm0000755000000000000000000006762312467662066016435 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_cheat.h" #import "cocoa_globals.h" #import "cocoa_util.h" #include "../cheatSystem.h" #include "../MMU.h" #undef BOOL @implementation CocoaDSCheatItem static NSImage *iconInternalCheat = nil; static NSImage *iconActionReplay = nil; static NSImage *iconCodeBreaker = nil; @dynamic data; @synthesize willAdd; @dynamic enabled; @dynamic cheatType; @dynamic cheatTypeIcon; @dynamic isSupportedCheatType; @dynamic freezeType; @dynamic description; @dynamic codeCount; @dynamic code; @dynamic memAddress; @dynamic memAddressString; @dynamic memAddressSixDigitString; @dynamic bytes; @dynamic value; @synthesize workingCopy; @synthesize parent; - (id) init { return [self initWithCheatData:nil]; } - (id) initWithCheatData:(CHEATS_LIST *)cheatData { self = [super init]; if(self == nil) { return self; } if (cheatData == NULL) { // Allocate our own cheat item struct since we weren't provided with one. internalData = (CHEATS_LIST *)malloc(sizeof(CHEATS_LIST)); if (internalData == NULL) { [self release]; return nil; } data = internalData; self.enabled = NO; self.cheatType = CHEAT_TYPE_INTERNAL; self.freezeType = 0; self.description = @""; self.code = @""; self.memAddress = 0x00000000; self.bytes = 1; self.value = 0; } else { internalData = NULL; data = cheatData; } pthread_mutex_init(&mutexData, NULL); willAdd = NO; workingCopy = nil; parent = nil; return self; } - (void) dealloc { [self destroyWorkingCopy]; free(internalData); internalData = NULL; pthread_mutex_destroy(&mutexData); [super dealloc]; } - (CHEATS_LIST *) data { pthread_mutex_lock(&mutexData); CHEATS_LIST *returnData = data; pthread_mutex_unlock(&mutexData); return returnData; } - (void) setData:(CHEATS_LIST *)cheatData { if (cheatData == NULL) { return; } pthread_mutex_lock(&mutexData); data = cheatData; pthread_mutex_unlock(&mutexData); [self update]; if (workingCopy != nil) { pthread_mutex_lock(&mutexData); CHEATS_LIST *thisData = data; CHEATS_LIST *workingData = workingCopy.data; *workingData = *thisData; pthread_mutex_unlock(&mutexData); [workingCopy update]; } } - (BOOL) retainData { BOOL result = YES; if (internalData == NULL) { internalData = (CHEATS_LIST *)malloc(sizeof(CHEATS_LIST)); if (internalData == NULL) { result = NO; return result; } } pthread_mutex_lock(&mutexData); *internalData = *data; data = internalData; pthread_mutex_unlock(&mutexData); return result; } - (BOOL) enabled { return data->enabled; } - (void) setEnabled:(BOOL)theState { data->enabled = theState; if (workingCopy != nil) { workingCopy.enabled = theState; } } - (NSString *) description { return [NSString stringWithCString:(const char *)&data->description[0] encoding:NSUTF8StringEncoding]; } - (void) setDescription:(NSString *)desc { if (desc == nil) { memset(&data->description[0], 0, sizeof(data->description)); } else { [desc getCString:&data->description[0] maxLength:sizeof(data->description) encoding:NSUTF8StringEncoding]; } if (workingCopy != nil) { workingCopy.description = desc; } } - (char *) descriptionCString { return &data->description[0]; } - (NSInteger) cheatType { return (NSInteger)data->type; } - (void) setCheatType:(NSInteger)theType { data->type = (u8)theType; switch (theType) { case CHEAT_TYPE_INTERNAL: self.cheatTypeIcon = iconInternalCheat; self.isSupportedCheatType = YES; break; case CHEAT_TYPE_ACTION_REPLAY: self.cheatTypeIcon = iconActionReplay; self.isSupportedCheatType = YES; break; case CHEAT_TYPE_CODE_BREAKER: self.cheatTypeIcon = iconCodeBreaker; self.isSupportedCheatType = NO; break; default: break; } if (workingCopy != nil) { workingCopy.cheatType = theType; } } - (void) setCheatTypeIcon:(NSImage *)theIcon { // Do nothing. This method exists for KVO compliance only. } - (NSImage *) cheatTypeIcon { NSImage *theIcon = nil; switch (self.cheatType) { case CHEAT_TYPE_INTERNAL: theIcon = iconInternalCheat; break; case CHEAT_TYPE_ACTION_REPLAY: theIcon = iconActionReplay; break; case CHEAT_TYPE_CODE_BREAKER: theIcon = iconCodeBreaker; break; default: break; } return theIcon; } - (BOOL) isSupportedCheatType { BOOL isSupported = YES; switch (self.cheatType) { case CHEAT_TYPE_INTERNAL: case CHEAT_TYPE_ACTION_REPLAY: isSupported = YES; break; case CHEAT_TYPE_CODE_BREAKER: isSupported = NO; break; default: break; } return isSupported; } - (void) setIsSupportedCheatType:(BOOL)isSupported { // Do nothing. This method exists for KVO compliance only. } - (NSInteger) freezeType { return (NSInteger)data->freezeType; } - (void) setFreezeType:(NSInteger)theType { data->freezeType = (u8)theType; if (workingCopy != nil) { workingCopy.freezeType = theType; } } - (UInt8) bytes { return (UInt8)(data->size + 1); } - (void) setBytes:(UInt8)byteSize { data->size = (u8)(byteSize - 1); if (workingCopy != nil) { workingCopy.bytes = byteSize; } } - (NSUInteger) codeCount { return (NSUInteger)data->num; } - (void) setCodeCount:(NSUInteger)count { // Do nothing. This method exists for KVO compliance only. } - (NSString *) code { NSString *codeLine = @""; NSString *cheatCodes = @""; NSUInteger numberCodes = self.codeCount; if (numberCodes > MAX_XX_CODE) { return nil; } for (NSUInteger i = 0; i < numberCodes; i++) { codeLine = [NSString stringWithFormat:@"%08X %08X\n", data->code[i][0], data->code[i][1]]; cheatCodes = [cheatCodes stringByAppendingString:codeLine]; } return cheatCodes; } - (void) setCode:(NSString *)theCode { if (theCode == nil) { return; } size_t codeCStringSize = MAX_XX_CODE * 10 * 2 * sizeof(char); char *codeCString = (char *)calloc(codeCStringSize, 1); [theCode getCString:codeCString maxLength:codeCStringSize encoding:NSUTF8StringEncoding]; CHEATS::XXCodeFromString(data, codeCString); free(codeCString); codeCString = NULL; self.codeCount = self.codeCount; self.bytes = self.bytes; if (workingCopy != nil) { workingCopy.code = theCode; } } - (UInt32) memAddress { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return 0; } return (data->code[0][0] | 0x02000000); } - (void) setMemAddress:(UInt32)theAddress { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return; } theAddress &= 0x00FFFFFF; theAddress |= 0x02000000; data->code[0][0] = theAddress; if (workingCopy != nil) { workingCopy.memAddress = theAddress; } } - (NSString *) memAddressString { return [NSString stringWithFormat:@"0x%08X", (unsigned int)self.memAddress]; } - (void) setMemAddressString:(NSString *)addressString { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return; } u32 address = 0x00000000; [[NSScanner scannerWithString:addressString] scanHexInt:&address]; self.memAddress = address; if (workingCopy != nil) { workingCopy.memAddressString = addressString; } } - (NSString *) memAddressSixDigitString { return [NSString stringWithFormat:@"%06X", (unsigned int)(self.memAddress & 0x00FFFFFF)]; } - (void) setMemAddressSixDigitString:(NSString *)addressString { self.memAddressString = addressString; } - (SInt64) value { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return 0; } return (data->code[0][1]); } - (void) setValue:(SInt64)theValue { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return; } data->code[0][1] = (u32)theValue; if (workingCopy != nil) { workingCopy.value = theValue; } } - (void) update { self.enabled = self.enabled; self.description = self.description; self.cheatType = self.cheatType; self.freezeType = self.freezeType; if (self.cheatType == CHEAT_TYPE_INTERNAL) { self.bytes = self.bytes; self.memAddress = self.memAddress; self.value = self.value; } else { self.code = self.code; } } - (CocoaDSCheatItem *) createWorkingCopy { CocoaDSCheatItem *newWorkingCopy = nil; if (workingCopy != nil) { [workingCopy release]; } newWorkingCopy = [[CocoaDSCheatItem alloc] initWithCheatData:self.data]; [newWorkingCopy retainData]; newWorkingCopy.parent = self; workingCopy = newWorkingCopy; return newWorkingCopy; } - (void) destroyWorkingCopy { [workingCopy release]; workingCopy = nil; } - (void) mergeFromWorkingCopy { if (workingCopy == nil) { return; } CHEATS_LIST *thisData = self.data; CHEATS_LIST *workingData = workingCopy.data; pthread_mutex_lock(&mutexData); *thisData = *workingData; pthread_mutex_unlock(&mutexData); [self update]; } - (void) mergeToParent { if (parent == nil) { return; } CHEATS_LIST *thisData = self.data; CHEATS_LIST *parentData = parent.data; pthread_mutex_lock(&mutexData); *parentData = *thisData; pthread_mutex_unlock(&mutexData); [parent update]; } - (void) setDataWithDictionary:(NSDictionary *)dataDict { if (dataDict == nil) { return; } NSNumber *enabledNumber = (NSNumber *)[dataDict valueForKey:@"enabled"]; if (enabledNumber != nil) { self.enabled = [enabledNumber boolValue]; } NSString *descriptionString = (NSString *)[dataDict valueForKey:@"description"]; if (descriptionString != nil) { self.description = descriptionString; } NSNumber *freezeTypeNumber = (NSNumber *)[dataDict valueForKey:@"freezeType"]; if (freezeTypeNumber != nil) { self.freezeType = [freezeTypeNumber integerValue]; } NSNumber *cheatTypeNumber = (NSNumber *)[dataDict valueForKey:@"cheatType"]; if (cheatTypeNumber != nil) { self.cheatType = [cheatTypeNumber integerValue]; } if (self.cheatType == CHEAT_TYPE_INTERNAL) { NSNumber *bytesNumber = (NSNumber *)[dataDict valueForKey:@"bytes"]; if (bytesNumber != nil) { self.bytes = [bytesNumber unsignedIntegerValue]; } NSNumber *memAddressNumber = (NSNumber *)[dataDict valueForKey:@"memAddress"]; if (memAddressNumber != nil) { self.memAddress = [memAddressNumber unsignedIntegerValue]; } NSNumber *valueNumber = (NSNumber *)[dataDict valueForKey:@"value"]; if (valueNumber != nil) { self.value = [valueNumber integerValue]; } } else { NSString *codeString = (NSString *)[dataDict valueForKey:@"code"]; if (codeString != nil) { self.code = codeString; } } } - (NSDictionary *) dataDictionary { return [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:self.enabled], @"enabled", [NSNumber numberWithInteger:self.cheatType], @"cheatType", self.description, @"description", [NSNumber numberWithInteger:self.freezeType], @"freezeType", [NSNumber numberWithUnsignedInteger:self.codeCount], @"codeCount", [NSNumber numberWithUnsignedInteger:self.bytes], @"bytes", [NSNumber numberWithUnsignedInt:self.memAddress], @"memAddress", self.memAddressString, @"memAddressString", [NSNumber numberWithInteger:self.value], @"value", self.code, @"code", [NSNumber numberWithBool:self.isSupportedCheatType], @"isSupportedCheatType", nil]; } + (void) setIconInternalCheat:(NSImage *)iconImage { iconInternalCheat = iconImage; } + (NSImage *) iconInternalCheat { return iconInternalCheat; } + (void) setIconActionReplay:(NSImage *)iconImage { iconActionReplay = iconImage; } + (NSImage *) iconActionReplay { return iconActionReplay; } + (void) setIconCodeBreaker:(NSImage *)iconImage { iconCodeBreaker = iconImage; } + (NSImage *) iconCodeBreaker { return iconCodeBreaker; } @end @implementation CocoaDSCheatManager @synthesize listData; @synthesize list; @dynamic rwlockCoreExecute; @synthesize untitledCount; @synthesize dbTitle; @synthesize dbDate; - (id)init { return [self initWithFileURL:nil listData:nil]; } - (id) initWithFileURL:(NSURL *)fileURL { return [self initWithFileURL:fileURL listData:nil]; } - (id) initWithListData:(CHEATS *)cheatList { return [self initWithFileURL:nil listData:cheatList]; } - (id) initWithFileURL:(NSURL *)fileURL listData:(CHEATS *)cheatList { self = [super init]; if(self == nil) { return self; } if (cheatList == nil) { CHEATS *newListData = new CHEATS(); if (newListData == nil) { [self release]; return nil; } listData = newListData; } else { listData = cheatList; } if (fileURL != nil) { listData->init((char *)[[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]); list = [[CocoaDSCheatManager cheatListWithListObject:listData] retain]; } else { list = [[NSMutableArray alloc] initWithCapacity:100]; if (list == nil) { delete listData; [self release]; return nil; } } rwlockCoreExecute = (pthread_rwlock_t *)malloc(sizeof(pthread_rwlock_t)); pthread_rwlock_init(rwlockCoreExecute, NULL); isUsingDummyRWlock = YES; untitledCount = 0; dbTitle = nil; dbDate = nil; return self; } - (void)dealloc { self.dbTitle = nil; self.dbDate = nil; [list release]; delete (CHEATS *)self.listData; if (isUsingDummyRWlock) { pthread_rwlock_destroy(rwlockCoreExecute); free(rwlockCoreExecute); rwlockCoreExecute = NULL; } [super dealloc]; } - (void) setRwlockCoreExecute:(pthread_rwlock_t *)theRwlock { if (theRwlock == NULL && isUsingDummyRWlock) { return; } else if (theRwlock == NULL && !isUsingDummyRWlock) { rwlockCoreExecute = (pthread_rwlock_t *)malloc(sizeof(pthread_rwlock_t)); pthread_rwlock_init(rwlockCoreExecute, NULL); isUsingDummyRWlock = YES; return; } else if (theRwlock != NULL && isUsingDummyRWlock) { pthread_rwlock_destroy(rwlockCoreExecute); free(rwlockCoreExecute); isUsingDummyRWlock = NO; rwlockCoreExecute = theRwlock; } else if (theRwlock != NULL && !isUsingDummyRWlock) { rwlockCoreExecute = theRwlock; } } - (pthread_rwlock_t *) rwlockCoreExecute { return rwlockCoreExecute; } - (BOOL) add:(CocoaDSCheatItem *)cheatItem { BOOL result = NO; if (cheatItem == nil) { return result; } // Get the current pointer to the raw cheat list data. We will need it later // to check if the list got reallocated. CHEATS_LIST *cheatListData = self.listData->getListPtr(); pthread_rwlock_wrlock(self.rwlockCoreExecute); switch (cheatItem.cheatType) { case CHEAT_TYPE_INTERNAL: result = self.listData->add(cheatItem.bytes - 1, cheatItem.memAddress, cheatItem.value, [cheatItem descriptionCString], cheatItem.enabled); break; case CHEAT_TYPE_ACTION_REPLAY: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->add_AR(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled); } break; } case CHEAT_TYPE_CODE_BREAKER: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->add_CB(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled); } break; } default: break; } pthread_rwlock_unlock(self.rwlockCoreExecute); if (![self.list containsObject:cheatItem]) { [self.list addObject:cheatItem]; } // Adding a new item may cause the raw list data to get reallocated, which // will break the data pointers. So check for reallocation, and if it occurs, // reset the data pointers for each item. if (cheatListData != self.listData->getListPtr()) { NSUInteger listCount = self.listData->getSize(); for (NSUInteger i = 0; i < listCount; i++) { CocoaDSCheatItem *itemInList = (CocoaDSCheatItem *)[self.list objectAtIndex:i]; itemInList.data = self.listData->getItemByIndex(i); } } else { cheatItem.data = self.listData->getItemByIndex(self.listData->getSize() - 1); } return result; } - (void) remove:(CocoaDSCheatItem *)cheatItem { if (cheatItem == nil) { return; } NSUInteger selectionIndex = [self.list indexOfObject:cheatItem]; if (selectionIndex == NSNotFound) { return; } pthread_rwlock_wrlock(self.rwlockCoreExecute); self.listData->remove(selectionIndex); pthread_rwlock_unlock(self.rwlockCoreExecute); // Removing an item from the raw cheat list data shifts all higher elements // by one, so we need to do the same. NSUInteger listCount = self.listData->getSize(); for (NSUInteger i = selectionIndex; i < listCount; i++) { [(CocoaDSCheatItem *)[self.list objectAtIndex:(i + 1)] setData:self.listData->getItemByIndex(i)]; } cheatItem.data = nil; [self.list removeObject:cheatItem]; } - (BOOL) update:(CocoaDSCheatItem *)cheatItem { BOOL result = NO; if (cheatItem == nil) { return result; } NSUInteger selectionIndex = [self.list indexOfObject:cheatItem]; if (selectionIndex == NSNotFound) { return result; } pthread_rwlock_wrlock(self.rwlockCoreExecute); switch (cheatItem.cheatType) { case CHEAT_TYPE_INTERNAL: result = self.listData->update(cheatItem.bytes - 1, cheatItem.memAddress, cheatItem.value, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); break; case CHEAT_TYPE_ACTION_REPLAY: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->update_AR(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); } break; } case CHEAT_TYPE_CODE_BREAKER: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->update_CB(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); } break; } default: break; } pthread_rwlock_unlock(self.rwlockCoreExecute); [cheatItem update]; return result; } - (BOOL) save { pthread_rwlock_wrlock(self.rwlockCoreExecute); BOOL result = self.listData->save(); pthread_rwlock_unlock(self.rwlockCoreExecute); return result; } - (NSUInteger) activeCount { pthread_rwlock_rdlock(self.rwlockCoreExecute); NSUInteger activeCheatsCount = self.listData->getActiveCount(); pthread_rwlock_unlock(self.rwlockCoreExecute); return activeCheatsCount; } - (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error { NSMutableArray *newDBList = nil; if (fileURL == nil) { return newDBList; } CHEATSEXPORT *exporter = new CHEATSEXPORT(); BOOL result = exporter->load((char *)[[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]); if (!result) { if (error != nil) { *error = exporter->getErrorCode(); } } else { self.dbTitle = [NSString stringWithCString:(const char *)exporter->gametitle encoding:NSUTF8StringEncoding]; self.dbDate = [NSString stringWithCString:(const char *)exporter->date encoding:NSUTF8StringEncoding]; newDBList = [CocoaDSCheatManager cheatListWithItemStructArray:exporter->getCheats() count:exporter->getCheatsNum()]; if (newDBList != nil) { for (CocoaDSCheatItem *cheatItem in newDBList) { cheatItem.willAdd = NO; [cheatItem retainData]; } } } delete exporter; exporter = nil; return newDBList; } - (void) applyInternalCheat:(CocoaDSCheatItem *)cheatItem { if (cheatItem == nil) { return; } pthread_rwlock_wrlock(self.rwlockCoreExecute); [CocoaDSCheatManager applyInternalCheatWithItem:cheatItem]; pthread_rwlock_unlock(self.rwlockCoreExecute); } + (void) setMasterCheatList:(CocoaDSCheatManager *)cheatListManager { cheats = cheatListManager.listData; } + (void) applyInternalCheatWithItem:(CocoaDSCheatItem *)cheatItem { [CocoaDSCheatManager applyInternalCheatWithAddress:cheatItem.memAddress value:cheatItem.value bytes:cheatItem.bytes]; } + (void) applyInternalCheatWithAddress:(UInt32)address value:(UInt32)value bytes:(NSUInteger)bytes { address &= 0x00FFFFFF; address |= 0x02000000; switch (bytes) { case 1: { u8 oneByteValue = (u8)(value & 0x000000FF); _MMU_write08(address, oneByteValue); break; } case 2: { u16 twoByteValue = (u16)(value & 0x0000FFFF); _MMU_write16(address, twoByteValue); break; } case 3: { u32 threeByteWithExtraValue = _MMU_read32(address); threeByteWithExtraValue &= 0xFF000000; threeByteWithExtraValue |= (value & 0x00FFFFFF); _MMU_write32(address, threeByteWithExtraValue); break; } case 4: _MMU_write32(address, value); break; default: break; } } + (NSMutableArray *) cheatListWithListObject:(CHEATS *)cheatList { if (cheatList == nil) { return nil; } NSMutableArray *newList = [NSMutableArray arrayWithCapacity:100]; if (newList == nil) { return newList; } u32 itemCount = cheatList->getSize(); for (u32 i = 0; i < itemCount; i++) { [newList addObject:[[[CocoaDSCheatItem alloc] initWithCheatData:cheatList->getItemByIndex(i)] autorelease]]; } return newList; } + (NSMutableArray *) cheatListWithItemStructArray:(CHEATS_LIST *)cheatItemArray count:(NSUInteger)itemCount { if (cheatItemArray == nil) { return nil; } NSMutableArray *newList = [NSMutableArray arrayWithCapacity:100]; if (newList == nil) { return newList; } for (NSUInteger i = 0; i < itemCount; i++) { [newList addObject:[[[CocoaDSCheatItem alloc] initWithCheatData:cheatItemArray + i] autorelease]]; } return newList; } + (NSMutableDictionary *) cheatItemWithType:(NSInteger)cheatTypeID description:(NSString *)description { BOOL isSupported = YES; if (cheatTypeID == CHEAT_TYPE_CODE_BREAKER) { isSupported = NO; } return [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], @"enabled", [NSNumber numberWithInteger:cheatTypeID], @"cheatType", description, @"description", [NSNumber numberWithInteger:0], @"freezeType", [NSNumber numberWithUnsignedInteger:0], @"codeCount", [NSNumber numberWithUnsignedInteger:4], @"bytes", [NSNumber numberWithInteger:0], @"memAddress", @"0x00000000", @"memAddressString", [NSNumber numberWithInteger:0], @"value", @"", @"code", [NSNumber numberWithBool:isSupported], @"isSupportedCheatType", nil]; } @end @implementation CocoaDSCheatSearch @synthesize listData; @synthesize addressList; @dynamic rwlockCoreExecute; @synthesize searchCount; - (id)init { self = [super init]; if(self == nil) { return self; } CHEATSEARCH *newListData = new CHEATSEARCH(); if (newListData == nil) { [self release]; return nil; } rwlockCoreExecute = (pthread_rwlock_t *)malloc(sizeof(pthread_rwlock_t)); pthread_rwlock_init(rwlockCoreExecute, NULL); isUsingDummyRWlock = YES; listData = newListData; addressList = nil; searchCount = 0; return self; } - (void)dealloc { pthread_rwlock_wrlock(self.rwlockCoreExecute); self.listData->close(); pthread_rwlock_unlock(self.rwlockCoreExecute); [addressList release]; delete (CHEATSEARCH *)self.listData; if (isUsingDummyRWlock) { pthread_rwlock_destroy(rwlockCoreExecute); free(rwlockCoreExecute); rwlockCoreExecute = NULL; } [super dealloc]; } - (void) setRwlockCoreExecute:(pthread_rwlock_t *)theRwlock { if (theRwlock == NULL && isUsingDummyRWlock) { return; } else if (theRwlock == NULL && !isUsingDummyRWlock) { rwlockCoreExecute = (pthread_rwlock_t *)malloc(sizeof(pthread_mutex_t)); pthread_rwlock_init(rwlockCoreExecute, NULL); isUsingDummyRWlock = YES; return; } else if (theRwlock != NULL && isUsingDummyRWlock) { pthread_rwlock_destroy(rwlockCoreExecute); free(rwlockCoreExecute); isUsingDummyRWlock = NO; rwlockCoreExecute = theRwlock; } else if (theRwlock != NULL && !isUsingDummyRWlock) { rwlockCoreExecute = theRwlock; } } - (pthread_rwlock_t *) rwlockCoreExecute { return rwlockCoreExecute; } - (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType { NSUInteger itemCount = 0; BOOL listExists = YES; if (searchCount == 0) { byteSize--; pthread_rwlock_rdlock(self.rwlockCoreExecute); listExists = (NSUInteger)self.listData->start((u8)CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE, (u8)byteSize, (u8)signType); pthread_rwlock_unlock(self.rwlockCoreExecute); } if (listExists) { pthread_rwlock_rdlock(self.rwlockCoreExecute); itemCount = (NSUInteger)self.listData->search((u32)value); NSMutableArray *newAddressList = [[CocoaDSCheatSearch addressListWithListObject:self.listData maxItems:100] retain]; pthread_rwlock_unlock(self.rwlockCoreExecute); [addressList release]; addressList = newAddressList; searchCount++; } [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.searchDidFinish" object:self userInfo:nil]; return itemCount; } - (void) runExactValueSearchOnThread:(id)object { CocoaDSCheatSearchParams *searchParams = (CocoaDSCheatSearchParams *)object; [self runExactValueSearch:searchParams.value byteSize:searchParams.byteSize signType:searchParams.signType]; } - (NSUInteger) runComparativeSearch:(NSInteger)typeID byteSize:(UInt8)byteSize signType:(NSInteger)signType { NSUInteger itemCount = 0; BOOL listExists = YES; if (searchCount == 0) { byteSize--; pthread_rwlock_rdlock(self.rwlockCoreExecute); listExists = (NSUInteger)self.listData->start((u8)CHEATSEARCH_SEARCHSTYLE_COMPARATIVE, (u8)byteSize, (u8)signType); pthread_rwlock_unlock(self.rwlockCoreExecute); addressList = nil; } else { pthread_rwlock_rdlock(self.rwlockCoreExecute); itemCount = (NSUInteger)self.listData->search((u8)typeID); NSMutableArray *newAddressList = [[CocoaDSCheatSearch addressListWithListObject:self.listData maxItems:100] retain]; pthread_rwlock_unlock(self.rwlockCoreExecute); [addressList release]; addressList = newAddressList; } if (listExists) { searchCount++; } [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.searchDidFinish" object:self userInfo:nil]; return itemCount; } - (void) runComparativeSearchOnThread:(id)object { CocoaDSCheatSearchParams *searchParams = (CocoaDSCheatSearchParams *)object; [self runComparativeSearch:searchParams.comparativeSearchType byteSize:searchParams.byteSize signType:searchParams.signType]; } - (void) reset { pthread_rwlock_wrlock(self.rwlockCoreExecute); self.listData->close(); pthread_rwlock_unlock(self.rwlockCoreExecute); searchCount = 0; [addressList release]; addressList = nil; } + (NSMutableArray *) addressListWithListObject:(CHEATSEARCH *)addressList maxItems:(NSUInteger)maxItemCount { if (addressList == nil) { return nil; } if (maxItemCount == 0) { maxItemCount = 1024 * 1024 * 4; } NSMutableArray *newList = [NSMutableArray arrayWithCapacity:maxItemCount]; if (newList == nil) { return newList; } NSMutableDictionary *newItem = nil; NSUInteger listCount = 0; u32 address; u32 value; addressList->getListReset(); while (addressList->getList(&address, &value) && listCount < maxItemCount) { newItem = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"0x02%06X", address], @"addressString", [NSNumber numberWithUnsignedInteger:value], @"value", nil]; [newList addObject:newItem]; listCount++; } return newList; } @end @implementation CocoaDSCheatSearchParams @synthesize comparativeSearchType; @synthesize value; @synthesize byteSize; @synthesize signType; - (id)init { self = [super init]; if(self == nil) { return self; } comparativeSearchType = CHEATSEARCH_COMPARETYPE_EQUALS_TO; value = 1; byteSize = 4; signType = CHEATSEARCH_UNSIGNED; return self; } @end desmume-0.9.11/src/cocoa/DefaultUserPrefs.plist0000755000000000000000000004137412467662066020145 0ustar rootroot Advanscene_AutoDetectRomSaveType CoreControl_EnableAutoFrameSkip CoreControl_EnableCheats CoreControl_EnableSpeedLimit CoreControl_SpeedScalar 1 Debug_GDBStubEnableARM9 Debug_GDBStubEnableARM7 Debug_GDBStubPortARM9 20000 Debug_GDBStubPortARM7 20001 DisplayView_Deposterize DisplayView_FiltersPreferGPU DisplayView_Mode 2 DisplayView_OutputFilter 1 DisplayView_Rotation 0 DisplayView_ShowHUD DisplayView_ShowStatusBar DisplayView_Size 100 DisplayView_UseBilinearOutput DisplayView_UseVerticalSync DisplayView_VideoFilter 0 DisplayViewCombo_Gap 0 DisplayViewCombo_Order 0 DisplayViewCombo_Orientation 0 Emulation_AdvancedBusLevelTiming Emulation_BIOSEmulateSWI Emulation_BIOSPatchDelayLoopSWI Emulation_CPUEmulationEngine 0 Emulation_EmulateEnsata Emulation_FirmwareBoot Emulation_MaxJITBlockSize 12 Emulation_RigorousTiming Emulation_UseDebugConsole Emulation_UseExternalBIOSImages Emulation_UseExternalFirmwareImage EmulationSlot1_DeviceType 1 FirmwareConfig_Birthday 2011-06-23T07:00:00Z FirmwareConfig_FavoriteColor 7 FirmwareConfig_Language 1 FirmwareConfig_Message DeSmuME makes you happy! FirmwareConfig_Nickname DeSmuME General_AppFirstTimeRun General_AutoloadROMOption 10000 General_DisplayWindowRestorableStates General_DoNotAskMigrate General_ExecuteROMOnLoad General_StreamLoadRomData General_WillRestoreDisplayWindows HUD_FrameCounter HUD_FramesPerSecond HUD_GraphicalInput HUD_Input HUD_LagCounter HUD_Microphone HUD_RealTimeClock Input_AudioInputMode 1 Input_ControllerMappings Up deviceCode NSEventKeyboard deviceName Keyboard elementCode 126 elementName Up Arrow Down deviceCode NSEventKeyboard deviceName Keyboard elementCode 125 elementName Down Arrow Left deviceCode NSEventKeyboard deviceName Keyboard elementCode 123 elementName Left Arrow Right deviceCode NSEventKeyboard deviceName Keyboard elementCode 124 elementName Right Arrow A deviceCode NSEventKeyboard deviceName Keyboard elementCode 7 elementName X B deviceCode NSEventKeyboard deviceName Keyboard elementCode 6 elementName Z X deviceCode NSEventKeyboard deviceName Keyboard elementCode 1 elementName S Y deviceCode NSEventKeyboard deviceName Keyboard elementCode 0 elementName A L deviceCode NSEventKeyboard deviceName Keyboard elementCode 12 elementName Q R deviceCode NSEventKeyboard deviceName Keyboard elementCode 13 elementName W Start deviceCode NSEventKeyboard deviceName Keyboard elementCode 36 elementName Return Select deviceCode NSEventKeyboard deviceName Keyboard elementCode 48 elementName Tab Touch deviceCode NSEventMouse deviceName Mouse elementCode 0 elementName Primary Button useInputForIntCoord Microphone deviceCode NSEventKeyboard deviceName Keyboard elementCode 50 elementName ` (Accent) intValue1 1 Lid deviceCode NSEventKeyboard deviceName Keyboard elementCode 51 elementName Delete (Backspace) Debug Guitar Grip: Green deviceCode NSEventKeyboard deviceName Keyboard elementCode 14 elementName E Guitar Grip: Red deviceCode NSEventKeyboard deviceName Keyboard elementCode 15 elementName R Guitar Grip: Yellow deviceCode NSEventKeyboard deviceName Keyboard elementCode 17 elementName T Guitar Grip: Blue deviceCode NSEventKeyboard deviceName Keyboard elementCode 16 elementName Y Piano: C deviceCode NSEventKeyboard deviceName Keyboard elementCode 8 elementName C Piano: C# deviceCode NSEventKeyboard deviceName Keyboard elementCode 3 elementName F Piano: D deviceCode NSEventKeyboard deviceName Keyboard elementCode 9 elementName V Piano: D# deviceCode NSEventKeyboard deviceName Keyboard elementCode 5 elementName G Piano: E deviceCode NSEventKeyboard deviceName Keyboard elementCode 11 elementName B Piano: F deviceCode NSEventKeyboard deviceName Keyboard elementCode 45 elementName N Piano: F# deviceCode NSEventKeyboard deviceName Keyboard elementCode 38 elementName J Piano: G deviceCode NSEventKeyboard deviceName Keyboard elementCode 46 elementName M Piano: G# deviceCode NSEventKeyboard deviceName Keyboard elementCode 40 elementName K Piano: A deviceCode NSEventKeyboard deviceName Keyboard elementCode 43 elementName , (Comma) Piano: A# deviceCode NSEventKeyboard deviceName Keyboard elementCode 37 elementName L Piano: B deviceCode NSEventKeyboard deviceName Keyboard elementCode 47 elementName . (Period) Piano: High C deviceCode NSEventKeyboard deviceName Keyboard elementCode 44 elementName / Paddle deviceCode NSEventKeyboard deviceName Keyboard elementCode 31 elementName O intValue1 -5 isInputAnalog deviceCode NSEventKeyboard deviceName Keyboard elementCode 35 elementName P intValue1 5 isInputAnalog Autohold - Set Autohold - Clear HUD deviceCode NSEventKeyboard deviceName Keyboard elementCode 4 elementName H Execute/Pause deviceCode NSEventKeyboard deviceName Keyboard elementCode 117 elementName Forward Delete Frame Advance Frame Jump Reset deviceCode NSEventKeyboard deviceName Keyboard elementCode 121 elementName Page Down Mute/Unmute Load State Slot Save State Slot Copy Screen Rotate Display Left deviceCode NSEventKeyboard deviceName Keyboard elementCode 33 elementName [ intValue0 -90 Rotate Display Right deviceCode NSEventKeyboard deviceName Keyboard elementCode 30 elementName ] intValue0 90 Toggle All Displays Set Speed deviceCode NSEventKeyboard deviceName Keyboard elementCode 27 elementName - (Dash) floatValue0 0.5 deviceCode NSEventKeyboard deviceName Keyboard elementCode 24 elementName = floatValue0 2 Enable/Disable Speed Limiter Enable/Disable Auto Frame Skip Enable/Disable Cheats Enable/Disable GPU State Input_SavedDeviceProperties Input_SavedProfiles Microphone_HardwareMicMute Render3D_DepthComparisonThreshold 0 Render3D_EdgeMarking Render3D_Fog Render3D_FragmentSamplingHack Render3D_HighPrecisionColorInterpolation Render3D_LineHack Render3D_Multisample Render3D_RenderingEngine 1 Render3D_Textures Render3D_Threads 0 RomInfoPanel_SectionViewState Slot2_GBA_CartridgePath Slot2_GBA_SRAMPath Slot2_LoadedDevice 1 Slot2_MPCF_DirectoryPath Slot2_MPCF_DiskImagePath Slot2_MPCF_PathOption 0 Sound_AudioOutputEngine 58325 Sound_Volume 100 SPU_AdvancedLogic SPU_InterpolationMode 2 SPU_SyncMethod 0 SPU_SyncMode 1 desmume-0.9.11/src/cocoa/PkgInfo0000755000000000000000000000001012467662066015103 0ustar rootrootAPPL????desmume-0.9.11/src/cocoa/mic_ext.h0000755000000000000000000000235712467662066015444 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _MIC_EXTENSION_ #define _MIC_EXTENSION_ #include typedef void (*MicResetCallback)(void *inParam1, void *inParam2); typedef uint8_t (*MicSampleReadCallback)(void *inParam1, void *inParam2); void Mic_SetResetCallback(MicResetCallback callbackFunc, void *inParam1, void *inParam2); void Mic_SetSampleReadCallback(MicSampleReadCallback callbackFunc, void *inParam1, void *inParam2); void Mic_DefaultResetCallback(void *inParam1, void *inParam2); uint8_t Mic_DefaultSampleReadCallback(void *inParam1, void *inParam2); #endif // _MIC_EXTENSION_ desmume-0.9.11/src/cocoa/coreaudiosound.h0000755000000000000000000001301112467662066017024 0ustar rootroot/* Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _COREAUDIOSOUND_ #define _COREAUDIOSOUND_ #include #include #include #include #include "ringbuffer.h" struct CoreAudioInputDeviceInfo { AudioObjectID objectID; CFStringRef name; CFStringRef manufacturer; CFStringRef deviceUID; CFStringRef modelUID; Float64 sampleRate; }; typedef CoreAudioInputDeviceInfo CoreAudioInputDeviceInfo; typedef void (*CoreAudioInputHardwareStateChangedCallback)(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, void *inParam1, void *inParam2); typedef void (*CoreAudioInputHardwareGainChangedCallback)(float normalizedGain, void *inParam1, void *inParam2); class CoreAudioInput { private: OSSpinLock *_spinlockAUHAL; CoreAudioInputHardwareStateChangedCallback _hwStateChangedCallbackFunc; void *_hwStateChangedCallbackParam1; void *_hwStateChangedCallbackParam2; CoreAudioInputHardwareGainChangedCallback _hwGainChangedCallbackFunc; void *_hwGainChangedCallbackParam1; void *_hwGainChangedCallbackParam2; AUGraph _auGraph; AUNode _auFormatConverterNode; AUNode _auOutputNode; AudioUnit _auFormatConverterUnit; AudioUnit _auOutputUnit; AudioBufferList *_convertBufferList; UInt32 _captureFrames; float _inputGainNormalized; AudioUnitElement _inputElement; bool _isPaused; CoreAudioInputDeviceInfo _hwDeviceInfo; bool _isHardwareEnabled; bool _isHardwareLocked; OSStatus InitInputAUHAL(UInt32 deviceID); public: AudioUnit _auHALInputDevice; AudioTimeStamp _timeStamp; AudioBufferList *_captureBufferList; RingBuffer *_samplesCaptured; RingBuffer *_samplesConverted; CoreAudioInput(); ~CoreAudioInput(); void Start(); void Stop(); size_t Pull(); bool IsHardwareEnabled() const; bool IsHardwareLocked() const; bool GetPauseState() const; void SetPauseState(bool pauseState); float GetGain() const; void SetGain(float normalizedGain); void UpdateHardwareGain(float normalizedGain); void UpdateHardwareLock(); void SetCallbackHardwareStateChanged(CoreAudioInputHardwareStateChangedCallback callbackFunc, void *inParam1, void *inParam2); void SetCallbackHardwareGainChanged(CoreAudioInputHardwareGainChangedCallback callbackFunc, void *inParam1, void *inParam2); }; class CoreAudioOutput { private: AudioUnit _au; RingBuffer *_buffer; OSSpinLock *_spinlockAU; float _volume; public: CoreAudioOutput(size_t bufferSamples, size_t sampleSize); ~CoreAudioOutput(); void start(); void stop(); void writeToBuffer(const void *buffer, size_t numberSampleFrames); void clearBuffer(); size_t getAvailableSamples() const; void mute(); void unmute(); void pause(); void unpause(); float getVolume() const; void setVolume(float vol); }; OSStatus CoreAudioInputCaptureCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); OSStatus CoreAudioInputReceiveCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); OSStatus CoreAudioInputConvertCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); OSStatus CoreAudioInputDeviceChanged(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress inAddresses[], void *inClientData); void CoreAudioInputAUHALChanged(void *inRefCon, AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement); OSStatus CoreAudioOutputRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); void CoreAudioInputDefaultHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, void *inParam1, void *inParam2); void CoreAudioInputDefaultHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2); bool CreateAudioUnitInstance(AudioUnit *au, ComponentDescription *auDescription); #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 bool CreateAudioUnitInstance(AudioUnit *au, AudioComponentDescription *auDescription); #endif void DestroyAudioUnitInstance(AudioUnit *au); #endif desmume-0.9.11/src/cocoa/DeleteUserDefaults.applescript0000755000000000000000000000263312467662066021641 0ustar rootroot(* Copyright (C) 2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . *) display dialog "Are you sure that you want to delete DeSmuME's preferences?" buttons {"Cancel", "Delete"} default button "Delete" cancel button "Cancel" with title "Delete DeSmuME Preferences" try set userDefaultsPath to ((path to "pref" as text) & "org.desmume.DeSmuME.plist") set isUserDefaultsDeleted to false tell application "Finder" if exists file userDefaultsPath then set isUserDefaultsDeleted to true delete file userDefaultsPath end if if isUserDefaultsDeleted then display dialog "The preference files have been moved to the Trash." buttons {"OK"} default button {"OK"} else display dialog "No preference files were found." buttons {"OK"} default button {"OK"} end if end tell on error errorMsg display dialog errorMsg end trydesmume-0.9.11/src/cocoa/cocoa_input.mm0000755000000000000000000003757712467662066016515 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_input.h" #import "cocoa_globals.h" #include "mic_ext.h" #include "coreaudiosound.h" #include "audiosamplegenerator.h" #include "../NDSSystem.h" #include "../slot2.h" #undef BOOL NullGenerator nullSampleGenerator; InternalNoiseGenerator internalNoiseGenerator; WhiteNoiseGenerator whiteNoiseGenerator; SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE); @implementation CocoaDSController @synthesize delegate; @dynamic isHardwareMicAvailable; @dynamic isHardwareMicIdle; @dynamic isHardwareMicInClip; @synthesize micLevel; @dynamic hardwareMicEnabled; @dynamic hardwareMicLocked; @dynamic hardwareMicGain; @synthesize hardwareMicMute; @dynamic hardwareMicPause; @dynamic softwareMicState; @dynamic softwareMicMode; @dynamic autohold; @synthesize micMode; @synthesize CAInputDevice; @synthesize softwareMicSampleGenerator; @synthesize selectedAudioFileGenerator; @synthesize paddleAdjust; @synthesize hardwareMicInfoString; @synthesize hardwareMicNameString; @synthesize hardwareMicManufacturerString; @synthesize hardwareMicSampleRateString; - (id)init { self = [super init]; if (self == nil) { return self; } for (size_t i = 0; i < DSControllerState_StatesCount; i++) { ndsInput[i].state = false; ndsInput[i].turbo = false; ndsInput[i].turboPattern = false; ndsInput[i].autohold = false; } delegate = nil; spinlockControllerState = OS_SPINLOCK_INIT; autohold = NO; _isAutoholdCleared = YES; _useHardwareMic = NO; _availableMicSamples = 0; _hwMicLevelList = new std::vector; _hwMicLevelList->reserve(1024); _hwMicLevelList->clear(); micLevel = 0.0f; micMode = MICMODE_NONE; selectedAudioFileGenerator = NULL; CAInputDevice = new CoreAudioInput; CAInputDevice->SetCallbackHardwareStateChanged(&CAHardwareStateChangedCallback, self, NULL); CAInputDevice->SetCallbackHardwareGainChanged(&CAHardwareGainChangedCallback, self, NULL); softwareMicSampleGenerator = &nullSampleGenerator; touchLocation = NSMakePoint(0.0f, 0.0f); paddleAdjust = 0; hardwareMicInfoString = @"No hardware input detected."; hardwareMicNameString = @"No hardware input detected."; hardwareMicManufacturerString = @"No hardware input detected."; hardwareMicSampleRateString = @"No hardware input detected."; Mic_SetResetCallback(&CAResetCallback, self, NULL); Mic_SetSampleReadCallback(&CASampleReadCallback, self, NULL); return self; } - (void)dealloc { delete CAInputDevice; delete _hwMicLevelList; [super dealloc]; } - (BOOL) isHardwareMicAvailable { return ( CAInputDevice->IsHardwareEnabled() && !CAInputDevice->IsHardwareLocked() && !CAInputDevice->GetPauseState() ) ? YES : NO; } - (BOOL) isHardwareMicIdle { return (micLevel < MIC_NULL_LEVEL_THRESHOLD); } - (BOOL) isHardwareMicInClip { return (micLevel >= MIC_CLIP_LEVEL_THRESHOLD); } - (void) setHardwareMicEnabled:(BOOL)micEnabled { if (micEnabled) { CAInputDevice->Start(); } else { CAInputDevice->Stop(); } } - (BOOL) hardwareMicEnabled { return (CAInputDevice->IsHardwareEnabled()) ? YES : NO; } - (BOOL) hardwareMicLocked { return (CAInputDevice->IsHardwareLocked()) ? YES : NO; } - (void) setHardwareMicGain:(float)micGain { CAInputDevice->SetGain(micGain); } - (float) hardwareMicGain { return CAInputDevice->GetGain(); } - (void) setHardwareMicPause:(BOOL)isMicPaused { bool pauseState = (isMicPaused || [self hardwareMicMute]) ? true : false; CAInputDevice->SetPauseState(pauseState); } - (BOOL) hardwareMicPause { return (CAInputDevice->GetPauseState()) ? YES : NO; } - (void) setSoftwareMicState:(BOOL)theState { OSSpinLockLock(&spinlockControllerState); ndsInput[DSControllerState_Microphone].state = (theState) ? true : false; OSSpinLockUnlock(&spinlockControllerState); } - (BOOL) softwareMicState { OSSpinLockLock(&spinlockControllerState); BOOL theState = (ndsInput[DSControllerState_Microphone].state) ? YES : NO; OSSpinLockUnlock(&spinlockControllerState); return theState; } - (void) setSoftwareMicMode:(NSInteger)theMode { OSSpinLockLock(&spinlockControllerState); micMode = theMode; OSSpinLockUnlock(&spinlockControllerState); } - (NSInteger) softwareMicMode { OSSpinLockLock(&spinlockControllerState); NSInteger theMode = micMode; OSSpinLockUnlock(&spinlockControllerState); return theMode; } - (void) setAutohold:(BOOL)theState { OSSpinLockLock(&spinlockControllerState); autohold = theState; if (autohold && _isAutoholdCleared) { memset(ndsInput, 0, sizeof(ndsInput)); _isAutoholdCleared = NO; } if (!autohold) { for (size_t i = 0; i < DSControllerState_StatesCount; i++) { ndsInput[i].state = ndsInput[i].autohold; } } OSSpinLockUnlock(&spinlockControllerState); } - (BOOL) autohold { OSSpinLockLock(&spinlockControllerState); const BOOL theState = autohold; OSSpinLockUnlock(&spinlockControllerState); return theState; } - (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID { [self setControllerState:theState controlID:controlID turbo:NO]; } - (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID turbo:(const BOOL)isTurboEnabled { if (controlID >= DSControllerState_StatesCount) { return; } OSSpinLockLock(&spinlockControllerState); if (autohold) { if (theState) { ndsInput[controlID].turbo = (isTurboEnabled) ? true : false; ndsInput[controlID].turboPattern = (ndsInput[controlID].turbo) ? 0x5555 : 0; ndsInput[controlID].autohold = true; } } else { ndsInput[controlID].state = (theState || ndsInput[controlID].autohold); ndsInput[controlID].turbo = (isTurboEnabled && ndsInput[controlID].state); ndsInput[controlID].turboPattern = (ndsInput[controlID].turbo) ? 0x5555 : 0; } OSSpinLockUnlock(&spinlockControllerState); } - (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation { OSSpinLockLock(&spinlockControllerState); ndsInput[DSControllerState_Touch].state = (theState) ? true : false; touchLocation = theLocation; OSSpinLockUnlock(&spinlockControllerState); } - (void) setSineWaveGeneratorFrequency:(const double)freq { sineWaveGenerator.setFrequency(freq); } - (void) clearAutohold { [self setAutohold:NO]; OSSpinLockLock(&spinlockControllerState); if (!_isAutoholdCleared) { memset(ndsInput, 0, sizeof(ndsInput)); _isAutoholdCleared = YES; } OSSpinLockUnlock(&spinlockControllerState); } - (void) flush { OSSpinLockLock(&spinlockControllerState); const NSPoint theLocation = touchLocation; const NSInteger theMicMode = micMode; static bool flushedStates[DSControllerState_StatesCount] = {0}; if (!autohold) { for (size_t i = 0; i < DSControllerState_StatesCount; i++) { flushedStates[i] = (ndsInput[i].state || ndsInput[i].autohold); if (ndsInput[i].turbo) { const bool turboState = ndsInput[i].turboPattern & 0x0001; flushedStates[i] = (flushedStates[i] && turboState); ndsInput[i].turboPattern >>= 1; ndsInput[i].turboPattern |= (turboState) ? 0x8000 : 0x0000; } else { flushedStates[i] = ndsInput[i].state; } } } OSSpinLockUnlock(&spinlockControllerState); const bool isTouchDown = flushedStates[DSControllerState_Touch]; const bool isMicPressed = flushedStates[DSControllerState_Microphone]; // Setup the DS pad. NDS_setPad(flushedStates[DSControllerState_Right], flushedStates[DSControllerState_Left], flushedStates[DSControllerState_Down], flushedStates[DSControllerState_Up], flushedStates[DSControllerState_Select], flushedStates[DSControllerState_Start], flushedStates[DSControllerState_B], flushedStates[DSControllerState_A], flushedStates[DSControllerState_Y], flushedStates[DSControllerState_X], flushedStates[DSControllerState_L], flushedStates[DSControllerState_R], flushedStates[DSControllerState_Debug], flushedStates[DSControllerState_Lid]); // Setup the DS touch pad. if (isTouchDown) { NDS_setTouchPos((u16)theLocation.x, (u16)theLocation.y); } else { NDS_releaseTouch(); } // Setup the inputs from SLOT-2 devices. const NDS_SLOT2_TYPE slot2DeviceType = slot2_GetSelectedType(); switch (slot2DeviceType) { case NDS_SLOT2_GUITARGRIP: guitarGrip_setKey(flushedStates[DSControllerState_GuitarGrip_Green], flushedStates[DSControllerState_GuitarGrip_Red], flushedStates[DSControllerState_GuitarGrip_Yellow], flushedStates[DSControllerState_GuitarGrip_Blue]); break; case NDS_SLOT2_EASYPIANO: piano_setKey(flushedStates[DSControllerState_Piano_C], flushedStates[DSControllerState_Piano_CSharp], flushedStates[DSControllerState_Piano_D], flushedStates[DSControllerState_Piano_DSharp], flushedStates[DSControllerState_Piano_E], flushedStates[DSControllerState_Piano_F], flushedStates[DSControllerState_Piano_FSharp], flushedStates[DSControllerState_Piano_G], flushedStates[DSControllerState_Piano_GSharp], flushedStates[DSControllerState_Piano_A], flushedStates[DSControllerState_Piano_ASharp], flushedStates[DSControllerState_Piano_B], flushedStates[DSControllerState_Piano_HighC]); break; case NDS_SLOT2_PADDLE: { const u16 newPaddleValue = Paddle_GetValue() + (u16)[self paddleAdjust]; Paddle_SetValue(newPaddleValue); break; } default: break; } // Setup the DS mic. AudioGenerator *selectedGenerator = &nullSampleGenerator; if (isMicPressed) { switch (theMicMode) { case MICMODE_INTERNAL_NOISE: selectedGenerator = &internalNoiseGenerator; break; case MICMODE_WHITE_NOISE: selectedGenerator = &whiteNoiseGenerator; break; case MICMODE_SINE_WAVE: selectedGenerator = &sineWaveGenerator; break; case MICMODE_AUDIO_FILE: if (selectedAudioFileGenerator != NULL) { selectedGenerator = selectedAudioFileGenerator; } break; default: break; } } else { selectedGenerator = &nullSampleGenerator; internalNoiseGenerator.setSamplePosition(0); sineWaveGenerator.setCyclePosition(0.0); if (selectedAudioFileGenerator != NULL) { selectedAudioFileGenerator->setSamplePosition(0); } } _useHardwareMic = (isMicPressed) ? NO : YES; softwareMicSampleGenerator = selectedGenerator; NDS_setMic(isMicPressed); } - (void) flushEmpty { // Setup the DS pad. NDS_setPad(false, false, false, false, false, false, false, false, false, false, false, false, false, false); // Setup the DS touch pad. NDS_releaseTouch(); // Setup the inputs from SLOT-2 devices. const NDS_SLOT2_TYPE slot2DeviceType = slot2_GetSelectedType(); switch (slot2DeviceType) { case NDS_SLOT2_GUITARGRIP: guitarGrip_setKey(false, false, false, false); break; case NDS_SLOT2_EASYPIANO: piano_setKey(false, false, false, false, false, false, false, false, false, false, false, false, false); break; case NDS_SLOT2_PADDLE: // Do nothing. break; default: break; } // Setup the DS mic. _useHardwareMic = NO; softwareMicSampleGenerator = &nullSampleGenerator; NDS_setMic(false); } - (void) reset { for (size_t i = 0; i < DSControllerState_StatesCount; i++) { memset(ndsInput, 0, sizeof(ndsInput)); } [self setAutohold:NO]; [self setMicLevel:0.0f]; _isAutoholdCleared = YES; _availableMicSamples = 0; _hwMicLevelList->clear(); } - (void) clearMicLevelMeasure { _hwMicLevelList->clear(); } - (void) updateMicLevel { float avgMicLevel = 0.0f; size_t recordedLevelCount = _hwMicLevelList->size(); for(size_t i = 0; i < recordedLevelCount; i++) { avgMicLevel += (*_hwMicLevelList)[i]; } if (recordedLevelCount > 0) { avgMicLevel /= _hwMicLevelList->size(); } else { avgMicLevel = 0.0f; } [self setMicLevel:avgMicLevel]; if (delegate != nil && [delegate respondsToSelector:@selector(doMicLevelUpdateFromController:)]) { [[self delegate] doMicLevelUpdateFromController:self]; } } - (uint8_t) handleMicSampleRead:(CoreAudioInput *)caInput softwareMic:(AudioGenerator *)sampleGenerator { uint8_t theSample = MIC_NULL_SAMPLE_VALUE; if (_useHardwareMic && (caInput != NULL)) { if (caInput->GetPauseState()) { return theSample; } else { if (_availableMicSamples == 0) { _availableMicSamples = CAInputDevice->Pull(); } caInput->_samplesConverted->read(&theSample, 1); theSample >>= 1; // Samples from CoreAudio are 8-bit, so we need to convert the sample to 7-bit _availableMicSamples--; } } else { theSample = sampleGenerator->generateSample(); } _hwMicLevelList->push_back(abs((float)theSample - MIC_NULL_SAMPLE_VALUE)); return theSample; } - (void) handleMicHardwareStateChanged:(CoreAudioInputDeviceInfo *)deviceInfo isEnabled:(BOOL)isHardwareEnabled isLocked:(BOOL)isHardwareLocked { if (deviceInfo->objectID == kAudioObjectUnknown) { [self setHardwareMicInfoString:@"No hardware input detected."]; [self setHardwareMicNameString:@"No hardware input detected."]; [self setHardwareMicManufacturerString:@"No hardware input detected."]; [self setHardwareMicSampleRateString:@"No hardware input detected."]; } else { [self setHardwareMicInfoString:[NSString stringWithFormat:@"%@\nSample Rate: %1.1f Hz", (NSString *)deviceInfo->name, (double)deviceInfo->sampleRate]]; [self setHardwareMicNameString:(NSString *)deviceInfo->name]; [self setHardwareMicManufacturerString:(NSString *)deviceInfo->manufacturer]; [self setHardwareMicSampleRateString:[NSString stringWithFormat:@"%1.1f Hz", (double)deviceInfo->sampleRate]]; } [self clearMicLevelMeasure]; [self setMicLevel:0.0f]; if (delegate != nil && [delegate respondsToSelector:@selector(doMicHardwareStateChangedFromController:isEnabled:isLocked:)]) { [[self delegate] doMicHardwareStateChangedFromController:self isEnabled:isHardwareEnabled isLocked:isHardwareLocked]; } } - (void) handleMicHardwareGainChanged:(float)gainValue { if (delegate != nil && [delegate respondsToSelector:@selector(doMicHardwareGainChangedFromController:gain:)]) { [[self delegate] doMicHardwareGainChangedFromController:self gain:gainValue]; } } @end void CAResetCallback(void *inParam1, void *inParam2) { CocoaDSController *cdsController = (CocoaDSController *)inParam1; [cdsController CAInputDevice]->Start(); } uint8_t CASampleReadCallback(void *inParam1, void *inParam2) { CocoaDSController *cdsController = (CocoaDSController *)inParam1; return [cdsController handleMicSampleRead:[cdsController CAInputDevice] softwareMic:[cdsController softwareMicSampleGenerator]]; } void CAHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, void *inParam1, void *inParam2) { CocoaDSController *cdsController = (CocoaDSController *)inParam1; [cdsController handleMicHardwareStateChanged:(CoreAudioInputDeviceInfo *)deviceInfo isEnabled:((isHardwareEnabled) ? YES : NO) isLocked:((isHardwareLocked) ? YES : NO)]; } void CAHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2) { CocoaDSController *cdsController = (CocoaDSController *)inParam1; [cdsController handleMicHardwareGainChanged:normalizedGain]; } desmume-0.9.11/src/cocoa/AppIcon_SaveState.icns0000755000000000000000000023372712467662066020040 0ustar rootrooticns7×is32 !"!9]‘•\˜› ””dC'|˙îÌÇ×İŻĤċ˙‹0*väéäĠÚ²²³Èĝƒ6,[İ£­Ş¤¤Ğ´·ŞŸ`;*\ĞĦ£˘¤¤Ħž–‰V=(ZİĦĤ¤££Ĥ™‚nJ='ZŞĦ€¤£“~kV?>%YŞĦ£˘‘}hU>4?#XŞĦ¤£ xdO=&,>"XĞĦ§ŸŒxdP;+ +="TŞĦ›…r_I4#'; \ŻzgPA2+-$)9 [óÉÔÉÊÙÏÒ·×}(0)Vf^``eaci_hK.=,-.--$,.,0.66F !!9^“‘––˜—›œĦ•–eC'|˙íÊĊÑË£­£ä˙Š0(~˙óóñôͽżĜ˙4%|˙ú˙ŝ€˙ŝ˙ù˙–1#{˙ĝ˙üüŭùĝûġ˙–1"z˙ú˙ŝ€˙ŝ˙ĝ˙–0 y˙ù˙ŝ˙˙ŝŭ˙ĝ˙•/x˙ù˙ŝ€˙ ŝ˙ù˙’.w˙ù˙ŭ€ŝ ŭ˙÷˙‹-w˙ù˙ŝ€˙Uŝ˙ó‚.t˙ĝ˙üŭŝŭúôŜŬy-u˙÷˙üŝüŭôċÔÑp-^÷ÑàÔÙċÒßŬĊ'1)Td[]\a]_f\eI/=-.//.&.0.2/76F !!9^“‘––˜—›œĦ•–eC'|˙íÊĊÑˤ­£ä˙Š0(~˙óóñôͽżĜ˙4%|˙ú˙ŝ€˙ŝ˙ù˙–1#{˙ĝ˙üüŭúĝûġ˙–1"z˙ú˙ŝ€˙ŝ˙ĝ˙–0 y˙ù˙ŝ˙˙ŝŭ˙ĝ˙•/x˙ù˙ŝ€˙ ŝ˙ĝ˙•.w˙ù˙ŭ€ŝ ŭ˙ĝ˙”,v˙ù˙ŝ€˙Uŝ˙ĝ˙“*t˙ĝ˙üŭŝŭü˙ö˙’(u˙÷˙üŝüŭŭ˙ĝ˙ˆ(^÷ÑàÔÙċÓàßÊç‚'1)Td[]\a\_e[cI/=-.//.&.0.2076s8mk>[TWVVVWWWWXU[DÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÇ˙òùö÷÷÷÷÷öùó˙ĠÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÜË˙ù˙ŭŝŝŝŝŝŭ˙ú˙ÚÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÌ˙ù˙ŭŝŝŝŝŝŭ˙ú˙ÚÊ˙ú˙ŝ˙˙˙˙˙ŝ˙û˙ÛÈ˙ñùö÷÷÷÷÷öĝó˙Ġ”˙÷˙ŝ˙˙˙˙˙ŝ˙û˙Ĝil32 "%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7cropqmjpllklopszjmvroql?>J J=Z˙ŭ‰˙Süö˙˙üŝ˙ú˙w8W H7\˙ġúĝ›™x™…xruŞn´˙úó˙z3U G7[˙ü˙˙âĠĜÚŬäĜŜÔ aÏE Uĉ˙÷˙z4U G6Z˙úƒ˙?ûûŭüôċğÁêŜËì˙ö˙z5U D;F­´¸ğ½ĈÁ˘£ĦĦ§şÜÉĊÊĵ´Ĵ­];S C:D¤ ĦŸŸ ŸŸĤ£œ•›œ˜œĦ—•UP ?6BĤ£Š¤ –Œ‚ymfA>O >4BĤ£‰¤Ÿ”‹wnaZ=>N <3BĤ£ˆ¤ž“‰€vlaVM7?M <3AĤ£†¤£œ’ˆ~tj_UKA2@L ;2AĤ£…¤£›†|sh^TJ@5-?K;1@Ĥ˘„¤˘š…{qg\SI>5)(?J90@Ĥ˘ƒ¤˘˜„zpf[QG=3*"(>H8/?§˘‚¤Ħ–Œ‚xodYPF<2($ &>H8/?§˘¤Ÿ•‹wmcXND:1'#"%=G8.?§˘Ĥ¤¤Ÿ”Š€vmbXND:0'$"!$Ħ˘ĦĦš…{qg\QH=4*!!é˙ÉÎÒÑÂĈÊëÇĵŬÜĜĉŞÏÎĈóv$I 44&CúÊ £µš³ŻžĜż™§´§Ú›Şž˘Ċt"H8/9%:ecffb+heejbdihgi`khljf54? 5/36/ ! !"!% €" %76?);/01€8989.5;9::9;:€;53;-8874554546534ƒ566:99"%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpmlklopszjmvroql?>J J=Z˙ŭ‰˙Uüö˙˙üŝ˙ú˙w8W H7\˙ġù÷š€˜w‚Ĥš†ysv¨}l³˙ùò˙z3U G7[˙ü˙˙äĜÛÜÜâĠÜӟaÒG£Wç˙÷˙y4U G6[˙û˙ŝ…˙5ûÀ¸ĉĜÇé˙÷˙}4V F6X˙ü˙˙üúúûúûúúüŝ˙˙üŝ˙ŝ˙ĝ˙‰2V E5V˙üˆ˙ŝùĝüŭùû˙ĝ˙‰3W C4W˙ü˙˙ŝ˙˙ŝ…˙ŝ˙ĝ˙‰2V B3V˙ü‰˙ŝŝ˙€ŝ ˙ĝ˙‰2V B2U˙üŽ˙ŝ˙ĝ˙‰2VA1U˙üŽ˙ŝ˙ĝ˙‰1U@0T˙üŽ˙ŝ˙ĝ˙‰0T>/T˙üŽ˙ŝ˙ĝ˙‰0S>.T˙üŽ˙ŝ˙ĝ˙ˆ0S=.S˙üŽ˙ŝ˙ĝ˙…/R<-S˙üŽ˙ŝ˙ô˙ƒ.Q;,R˙üŽ˙ŭŭ˙.O:*R˙ü˙ŭùĝéġ{.N:*R˙üŒ˙ŭùôñàìw.M:*Q˙ü‹˙ŭùôíèĜâr-L9)Q˙ü˙€ŝ˙ŝ˙˙ŝ˙€ŝû÷òêâŬÍÖn-J8(Q˙û‰˙5ŝúöíçßÚËÓj-I8(O˙ŭü÷ĝĝú÷ùù÷ûùóïéàÛÎÇżħ¸e.H9'P˙ù˙ŝ‡˙ŝŭüòùñäìh+G5.<ĉ˙ÂÄÈÇ·ğÄşàĵĴÎÌËߛÄÂĵëv$I 44&Fûˤ¨¸Ÿ¸´ŬÄ ­ğĴŬĦ°¤¨Év!H8/8#9cadc`fcbg_`fede\hfigd44? 5/36/!! " !"#"&!#"$&86?);/01€8989.5;9::9;:€;53;-8874554546534ƒ566:99"%€&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpmlklopszjmvroql?>J J=Z˙ŭ‰˙Uüö˙˙üŝ˙ú˙w8W H7\˙ġù÷š€˜w‚Ĥš†ysv¨}l³˙ùò˙z3U G7[˙ü˙˙äĜÛÜÜâĠÜÓ aÒG£Wç˙÷˙y4U G6[˙û˙ŝ…˙5ûÀ¸ĉĜÇé˙÷˙}4V F6X˙ü˙˙üúúûúûúúüŝ˙˙üŝ˙ŝ˙ĝ˙‰2V E5V˙üˆ˙ŝùĝüŭùû˙ĝ˙‰3W C4V˙ü˙˙ŝ˙˙ŝ…˙ŝ˙ĝ˙‰2V B3V˙ü‰˙ŝŝ˙€ŝ ˙ĝ˙‰2V B2U˙üŽ˙ŝ˙ĝ˙‰2VA1U˙üŽ˙ŝ˙ĝ˙‰1U@0T˙üŽ˙ŝ˙ĝ˙‰0T>/T˙üŽ˙ŝ˙ĝ˙‰0S>.S˙üŽ˙ŝ˙ĝ˙ˆ0S=.S˙üŽ˙ŝ˙ĝ˙ˆ.R<-S˙üŽ˙ŝ˙ĝ˙ˆ-Q;,R˙üŽ˙ŝ˙ĝ˙ˆ,P:*R˙üŽ˙ŝ˙ĝ˙ˆ,O:*R˙üŽ˙ŝ˙ĝ˙ˆ+O:*Q˙üŽ˙ŝ˙ĝ˙‡*N9)Q˙ü˙€ŝ˙ŝ˙˙ŝ˙‚ŝ˙ŝŭ˙÷˙‡)M8(Q˙ûŽ˙0ŝ˙ĝ˙‚)K8(O˙ŭü÷ĝĝú÷ùù÷ûúĝĝùĝü÷ĝúì÷~)J9'P˙ù˙ŝŒ˙ŝ˙ĝ˙u(I5.<ĉ˙ÂÄÈÇ·ğÄşàğĞÍËÈܘÀ½·çu$I 44&Fûˤ¨¸Ÿ¸´ŬÄ ĵ­Ŭ£ħĤİÊv!H8/8#9cadc`fcbg_`fece\gehfc44? 5/36/!! " !"#"&!€# &86?);/01€8989.5;9::9;:€;53;-8874554546534ƒ566:99l8mk%402111111111112222222222213,ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙;+˙ùüûûûûûûûûûûûûûûûûûûûûûûúŝô˙M)˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙J*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙L*˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K*˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K+˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙K*˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙J$ûŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭ˙÷˙Kïûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙Eı˙÷ŝúûûûûûûûûüüûüûûûûûûûûúŝġ˙E"Ê˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ/it32mƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙ú˙ÌĈòġÔĠƒŸ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûú˙ĈÙ˙˙ÜȊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙÷˙ŝ˙ŝ“˙ŝ˙ú˙ĈîñÊʂ;h[8!¤˙Q!€c!şÊ”ĵ˙ü†˙ŭ˙è&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝŠ˙‚ŝ˙˙€ŝ˙˙€ŝ˙!ŝ˙ïĵĵÀ´ħRfSQRY°ìŝ˙´eYNRkžĉ˙ŬĴğ˙ü†˙ŭ˙è&5;IHGHGK@WO‚ @F@BAA@D=9a˙ô˙ûüüŭŭŝŝ“˙ŭŽüŝ˙ŝŝ…˙ŭú…˙ŝŭƒ˙ŝŝ€ŭüüŭú˙ĉ'5;IHGHGK@VP‚ @F@ ?D=:a˙÷˙ŝ„˙ŭ†üŭŭŝŝƒ˙ŝ–˙ ŝŝĝòööùĝŭ˙ŝ÷òóġúŝú÷ĝüŝ†˙ŝ˙î-48RÖÊ×äéèëïóöúŝŒ˙ŭüŭû˙èşĵğĵğĵÂò˙ŝ˙ŭùöóïìééĉĜÔÊÈ71EABBA?D>6Eİ™ žžĦİĴ°ığĵÁÇÍÒÜéçêîñġùü˙˙ŝ˙Ü£•ž)œ§à˙ŝ˙ù÷ôíéĉèŬĠÌÇÁĵşĵ´ŻĴİ˘ŸŸšš‘œ21E>@@A?D>5:³˘İĤ§§Ĥ£˘ĦŸ†ž  ¤§Ğ³ğşÀÀĦ¤¨•§ ¨£˘ıĵı°­İĤ£ ˆž ˘£¤¤Ĥ£ ž—Ÿ015;Żž˘€£¤¤Ĥ†§Ĥ¤£˘ ž¤—£ ¤žžŸĦ˘£¤Ĥˆ§€¤¤£ĦŸœ˜˜‘™01?@A>C>5;°ŸĤ£’¤ƒ£›¤£‘¤ Ħ œ™—““”/1D?==?@C=4;°ŸĤ£Ì¤£ĦŸœ™–”‘‘Š‘.2>€? =B<4;°ŸĤ£Ê¤£ Ÿ›™–“‘ŽŒ‹„‰,2;IHFHFK@WQ‚;C==>@>B<4;°ŸĤ£É¤˘ žš˜•“ŽŒˆ‡€ˆ-2;IHGHGJ@VP‚ =<==B<4;°ŸĤ£È¤˘ žš˜•’‘ŽŒ‰…„†+2;IHFGFJ@WP‚ ?>><@:1;°ŸĤ£½¤£ĦŸœ™—”’‹‡…‚€{yxtqonkfj%39I€GEI?VP‚ 8A<;:;;@:1;°ŸĤ£½¤'ĦŸœ™–“’‹ˆ…‚{yvsqnnjice$48HGFHFJ?WP‚ 9A<=<;9?:1;°ŸĤ£ğ¤)£ĦŸ›™–“’ŽŠ†„{yvtpnmihe^b#48GGDFGI?WP‚8@;€< :?90;°ŸĤ£ş¤*˘ Ÿ›™–“‘ŽŠ‡ƒ~{xvtpomihca]`"48GFFECI?VP‚7A:9;<;@90;°ŸĤ£ı¤!˘ š™”’‘ŽŒ‰†„‚€|zxvspoligc`^Z]"48H€FDH>UQ‚ 7@;;€9?90;°ŸĤ£¸¤,˘ žš˜•’‘ŽŒ‰†ƒ€|zxuronkhfc`^\XZ"57HFEEDG>UP‚ 7?9<<;9=9/;°ŸĤ£ĥ¤.£Ħ œš—”’Œˆ„ƒ|yxurookhfb`]ZYTX!47GFFEEH>UP‚ 8?99;<;>8/;°ŸĤ£ĥ¤.ĦŸœ™—”’‹‰…‚|ywtronkhfb`^ZYVSS57GEEFEI>UO‚6?:9899>8/;°ŸĤ£´¤'£ĦŸœš–“’ŽŽŠ‡…‚‚€{yvtqonjhfa_\[XVVNO 47HE€CG>UM‚5?9:9:7=80;°ŸĤ£´¤&Ħž›™–”‘Š‡„‚~{yvtpomihea^]ZWUSPLO57H€ECF=UO‚6>89:;9=7/;°ŸĤ£²¤(£Ħž›™–“‘ŽŠ‡„~{yuspnmigc`^[YWUSMMKK56H€EDG=TO‚7>788:9=7/;°ŸĤ£ħ¤3˘ ž›˜•“’ŽŒ‰‡„~zxuspnmigc`^[YVUSMMLGG55GEDDCG=TN‚7>89786<7/;°ŸĤ£°¤4£ ž›˜”’‘ŽŒ‰†ƒ‚}yxtrpnlhfc`^[YVURMMKICD55GEDEDG=TN‚6>89897<6.;°ŸĤ£Ż¤5Ħ š˜•“‹‰†ƒ€|zvtronkiga`][XUVQLLJHDAC55GEEFCG=TN‚5>€8 98<6.;°ŸĤ£¤6ĦŸš—”’‹ˆ…ƒ€|ywuqonkhfb_][XUTPMMKGCB?>55HEDECG=TN‚6>€8 97<6.;°ŸĤ£­¤7ĦŸ™—”’‹‡„€{yvtqnnjhfa_\ZXVTPLMIFCB@;<54HEFEBG=SN‚4>99898<6.;°ŸĤ£Ğ¤9˘ Ÿœ™–”’‹ˆ…‚zyutqomihfa_\ZWUTNLMIECB?<9964FEDFEH=TN‚4=89::7<6-;°ŸĤ£Ş¤:£ ž›˜–“’Š‡„~{yuspolihda^\ZWUSMLLIECA=;:8664GDBDCG=TN‚4=767:7<6-;°ŸĤ£İ¤;£Ħž›—”“‘ŽŒ‰‡ƒ}zxuspnligca^[YVUQMMLIECA=;974364FDDCAF=SN‚4=87686;6-;°ŸĤ£¨¤2˘ š˜”’’ŽŒ‰†ƒ€}zxuronlhfb`^[YVURMMKIDBB>:8641263F€DBF;:7411,)(&%%72DBADCF;RL‚2;67886:4*;°ŸĤ£Ħ¤C˘ ›˜–“‘Œ‰‡ƒ}zxusonlhhc`^[YVUSNLKIEBA=::7411-)(%%$#73DBAA@D;RL‚0<54566:5*;ݟĤ£ ¤:˘ š˜”“‘Ž‹‰†ƒ€}zxusonmigb`^\YWUQMLLHDBA<;86411+)'%%$##72D€B@C:RL‚2;65654:5*;ݟĤ£Ÿ¤;Ħ š—”’ŽŒ‰…ƒ‚{ywtrookhhb`][YVUQMLKHDBA<;96310+)'%%$##"61D€BAE:QL‚0;5656494*;ݟĤ£ž¤3Ħ š—”’Œˆ…€|ywtqomkhfa`]ZXUUPMMKGDB?<;86210*)'%%€#""61DA@@AE:QK‚1:5€6 494);ݟĤ£¤3ĦŸœ™–”’Šˆ„‚{ywtqnnjhea_]ZXVTNMMJFCB@<;8531/*('%%€#€" 61DA@@?B:QK‚1:4356594);ݟĤ£›¤4£ĦŸœ™–“’‹‡„‚zyusqnmihd`_\ZWUTOMLIECB>;;8521.*)&%%€#€"!60EAAB@C9QK‚194334494);ݟĤ£š¤6£ Ÿ›™–“’Œ‰‡„~{yuspnmihd``\ZWUTNLLIFBB>;;8421.)(&%%##" 60D€A?D9OK‚0:4544383*;ݟĤ£™¤4£ĦŸ›™•“’Ž‰†„~zxuspnlihc`^\ZWUSMMLIEBB=;:7420,)(%%$€#""!€ 60DAAB?C9PJ‚0:‚483);ݟĤ£˜¤1˘ š™–’’ŽŒ‰†ƒ~ywusonlihb`^\YVUQMMKHDBA=;96421+)'€%€#""!€ 60DBAA?C9QJ‚0:4545483);ݟĤ£—¤6£ š—•“‘ŽŒˆ†ƒ‚|zwuronkhgc`][YVURMLKHDBA<;96210+)'%%$##€"!€ 6/CABB?B9QJ‚195483);ݟĤ£–¤3Ħ ™—”’‹ˆ…‚€|ywtrookhfa_]ZXUUPLMJFDB@<;86310*)'%%€#€"!€ € 6/C@>@@C9QJ‚0:5454483);ݟĤ£•¤3ĦŸ™—”’‹ˆ„‚{yvtqomihea`]ZXUUPMMJFBB?<;8521/*)'%%€#€"!€  6/C@?>?C8QJ‚0:45€483);ݟĤ£”¤5Ħž›™–”’ŽŠ‡„{yvtqomihea_\ZWUTOMKIFBB>;:8521.)(&%%##"!€ 6.C@AA>A8PJ‚/:5443483(;ݟĤ£“¤3Ħ›™–“‘ŽŒŠ‡„‚~zwutpnmigea_\ZWUTOLLIFBB>;:8421-)(&%%€#€"!€ 6.A?>@?C8OI‚.95 383(;ݟĤ£‘¤1£Ħš˜–“‘Ž‰‡„~zxusqomihc_^[YWUSNLLHEBA>;:7411-)'€%€#€"€ ‚6.B?>>=B8PI‚/93455483(;ݟĤ£¤6˘ žš—•“Œ‰†ƒ~zxuroolhgc`^[YUURNMLIDBA<;96411,)'%%$##€"!€ 6-B@??<@7OJ‚093325483(;ݟĤ£¤3ĦŸš˜•’Ž‹ˆ…‚€}zxuronlif``^[YUUQLLJHDBA;;96320+)'%%€#€"!€ € 6-A??@>A7NH‚/93432172(;ݟĤ£Ž¤3ĦĦš—”“Œ‰†‚€{yvtronkhfb_][XUUPMMJGCB@<;86220+)'%%€#€"!€ €€6-A><>>B7NI‚083€4 372(;ݟĤ£¤3ĦŸœš—”’‹‡…‚{ywtqnnjhfa_]ZWUTOLLJGCB?<:8521.*)'%%€#€"!€ €€6-A>==;?7OH‚083424372';ݟĤ£Œ¤3ĦŸœ™—”’Š‡„{yutqnmihfa_][WUTPLLJFBB?<:7421.)(&%%€#€" €€€6,A€>A6MH‚/83255372';ݟĤ£‰¤1˘ ž›˜•“’ŽŒŠ‡ƒ}zxuspnmigc`_\ZWUSMMLHDCA<;97411-)'€%##"! ‚€6-A=;<<@6MI‚.73213372';ݟĤ£ˆ¤6£Ħžš˜•“‘ŽŒ‰†ƒ‚|yxuspnligb`^[YUUSMLKHDBA=;97411-*(%%$##€"!€ €6+A<==:=5MH‚07€3 1062';ݟĤ£‡¤6Ħ ›—”’Ž‹‰†ƒ€|ywuronlhfc_][YUURMLKGCBA<:96310+)(%%$##€"!€ €6+A=<=>3IF‚ 0533€2p469)é˙ü˙ŝ˙˙ŭ˙ç!_eŬÁbe LĴĥ•˙lí|n§NhÓëĵ£˙iAtĉkSÈ˙˙ç^wÙŜ\Z–âs˙ɄônZ‚úĝ˙v‡m¤ÛyèX]“àn˙^_Â˙˙ä(+<;998;3IF‚z 46323225458 ,íŝü˙ŝ˙ŭ˙ê0PkMñ†2v~;Yl˙͏t[@G˙ĈxxŞ%Í/ƒ1yn5˙ùünUiVÌëZq Ì0Âg„œ İ˙˙IjW„ċŻñYnĴ)¤ümH?˙üĉ(+<;::9;2IF‚z,67334328+76 1ïŝü˙˙ü˙ĉ!ikôyyÓ/˙=WEÒ Î‰MCVG&˙#Żxx 6ô@w@ċÒ+˙ù˙żt,V›„ÄĥAò}€VÌ˙üìx~Ü=›˜ƒÈEŽġdd‰˙˙ċ(*:99<:<2HF‚z.$2423256.56 .ë˙û˙ŭ˙ñY=O0Ġ“Ü^úfÈW5J|:R˙–\—•üF'QàeéĠf˙ü÷T@MOŜÂ:SRÓ˙IŠ˙ÚQGAÚ˙˙Ğ1QC†˙œSğ:ULâ­@˙A>~˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöù˙úüŝü˙ü˙ü€˙ĝü˙ŭ÷ŝ˙˙ŭĝ€˙ú˙üüŝ÷öù˙ üü˙ŝ˙úĝ˙ü÷ú€˙ĝ÷÷ŭ˙ùŝ‚˙úŭ˙ùŭ˙ŝ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qtsv€wtuusvsvu€wsu‚vs€v utxxwuvtuvttsw vvwvwutxwtu€wuttuxxwwt‚wxuvxuwwxu}L97#>8898;2IG‚!E/4)8033223166,9;!‚€€„†€€;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799::9†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙ú˙ÍÇôöĠ׃Ÿ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûû˙ÇÙ˙˙ÜɊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙÷˙ŝ˙ŝ•˙û˙ÇÄòË˂;h[8!¤˙Q!€c!şÊ”ĵ˙ü†˙ŭ˙è&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝ‹˙ŝ˙˙€ŝ˙˙ŝ˙ŝ˙ŝ˙ŝ˙˙€ŝ˙!ŝ˙î½½À´°QeRQRY°í˙˙´eZNSlžĉ˙Ŝ­ĵ˙ü†˙ŭ˙ç%6;IHGHGK@WO‚ @F@BAA@D=:a˙÷˙ŝş˙ŭú…˙ŝü‹˙ŭ˙é'5;IHGHGK@VP‚ @F@ ?D=9a˙÷˙ŝĞ˙ŝüŝû÷ĝö€ġ÷ùŝ˙˙ùġöĝü˙ŭùûˆ˙ŭ˙ë*4;IHGGFJ@WP‚ ?FAA@A@D=:b˙÷˙ŝğ˙ŝ†˙ŝŒ˙û˙F->HI€GK@VP‚ >EABBA?E=9]˙÷˙ŝħ˙†ŝ€˙…ŝ˙˙ŝŝ‡˙ŝ˙ù˙L*?GI€GJ@WP‚ >E>@@A?D=8P˙÷˙ŝÓ˙ŝ˙ù˙K*?GIFGFI@WP‚ ?E@?=@@E=8R˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGK@WP‚ =D?A@?=D<9Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGK@XP‚ =D>?@A>C<8Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GI€GK@WP‚ >D?==?@D<7Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGJ@VP‚ >€? =B;7Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIFHFK@WQ‚;C==>@>B;7Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGJ@VP‚ =<==B;7Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIFGFJ@WP‚ ?>>GI€GJ@WP‚;B;<<==B:6Q˙÷˙ŝÓ˙ŝ˙ù˙L*>GIHGFJ@WP‚ :B<=<<;@96Q˙÷˙ŝÓ˙ŝ˙ù˙L*>FIHIGK@VP‚:B< ;@95Q˙÷˙ŝÓ˙ŝ˙ù˙L*>FHEEFJ@VP‚:C<==<<@95Q˙÷˙ŝÓ˙ŝ˙ù˙L*>FHGFDI?WP‚:B<=€<@94R˙÷˙ŝÓ˙ŝ˙ù˙L*>FHFGEI?VP‚ 9B= ;@94R˙÷˙ŝÓ˙ŝ˙ù˙L*>GHFGEJ?VP‚9B;:<>=@:3R˙÷˙ŝÓ˙ŝ˙ù˙L*>GHGGEI?VP‚ 8A<;:;;@93R˙÷˙ŝÓ˙ŝ˙ù˙L*=FGFHFJ?WP‚ 9A<=<;9?93R˙÷˙ŝÓ˙ŝ˙ù˙L*=EGDFGI?WP‚8@;€< :?83R˙÷˙ŝÓ˙ŝ˙ù˙L*=EGFECI?VP‚7A:9;<;@82R˙÷˙ŝÓ˙ŝ˙ù˙L*=EGEFDH>UQ‚ 7@;;€9?92R˙÷˙ŝÓ˙ŝ˙ù˙L*=FGEEDG>UP‚ 7?9<<;9>83R˙÷˙ŝÓ˙ŝ˙ù˙L)UP‚ 8?99;<;>71R˙÷˙ŝÓ˙ŝ˙ù˙L)UO‚6?:9899>72R˙÷˙ŝÓ˙ŝ˙ù˙L)UM‚5?9:9:7=72R˙÷˙ŝÓ˙ŝ˙ù˙L*=FFEECF=UO‚6>89:;9=61R˙÷˙ŝÓ˙ŝ˙ù˙L)788:9=61R˙÷˙ŝÓ˙ŝ˙ù˙L);EFDDCG=TN‚7>89786<61R˙÷˙ŝÓ˙ŝ˙ù˙L*;EFDEDG=TN‚6>89897<51R˙÷˙ŝÓ˙ŝ˙ù˙L*;EFEFCG=TN‚5>€8 98<50R˙÷˙ŝÓ˙ŝ˙ù˙K):EFDECG=TN‚6>€8 97<50R˙÷˙ŝÓ˙ŝ˙ĝ˙K):EFFEBG=SN‚4>99898<50R˙÷˙ŝÓ˙ŝ˙ö˙K*:DFDFEH=TN‚4=89::7<5/R˙÷˙ŝÓ˙ü˙ö˙K*9DEBDCG=TN‚4=767:8<6/R˙÷˙ŝÑ˙ŝŭû˙ġ˙K):DEDCAF=SN‚4=87686<5/R˙÷˙ŝ˙ŝŭüûŝó˙K)9BEDDBF@@C9QJ‚0:5454482,R˙÷˙ŝ½˙ŝŭüüúùùö€ġòïïìèéċäâáŜÛŬÓáB+5AA?>?C8QJ‚0:45€482+R˙÷˙ŝğ˙ŝŝ€üúùù€ġôñïîêéèċäâáßÛÙÙÑàA+4@€A>A8PJ‚/:5443482*R˙ĝ˙ŝğ˙ŭüüûùùĝ€ġóñïîêéèċâàŜÛÙ×ĜÏŜA+3??>@?C8OI‚.95 382*R˙ĝ˙ŝı˙+ŝŭüüûùùĝġġôóîêéçċâàŬÛÚÖĠÖÎÛ@+4@@>>=B8PI‚/93455482*R˙ĝ˙ŝ¸˙ŝŭüüûùù÷€ġ!óïîéèĉäâßÜÛÙÖÖÒÔËÖ@+3@@??<@7OJ‚093325482*R˙ĝ˙ŝ·˙ŝŭüüúùù÷€ġ"òïïîééĉäáŜŬÛÙÖĠÓÑÑĈĠ?+2>@?@>A7NH‚/93432170+R˙÷˙ŝĥ˙.ŝŭüüúùù÷ġġôòïïíééĉäâáßÜÛĜÖĠÓÒÎÍĈÔ>,3?><>>B7NI‚083€4 371*R˙ĝ˙ŝµ˙/ŝŭüüúùùöġġôñïíéèċäáŜÛÚÙÖÔÒÑÎËÌÄÑ>+2??==;?7OH‚083424371*R˙ĝ˙ŝ´˙ŝüüûúùù€ġôòïîëéèċâàßÛÚ×ÖÔÒÑÌËÊËÁÎ>+2?€>A6MH‚/83255371*R˙ĝ˙ŝħ˙ŝŭüüû€ù€ġ(óîééçċâàŬÛÙ×ĠÔÒÌËÊÈĊĈżÉ<,1?>;<<@6MI‚.73213371*R˙ĝ˙ŝ°˙ŝŭüüûùùĝ€ġóïíééçäâáàÜÛÙ×ĠÓÒÏËËÊÈĊÄĊıĈ<,0?€=:=5MH‚07€3 2070*R˙ĝ˙ŝŻ˙5ŝŭüüúùù÷ġġôóïíééĉäáàÛÛÙÖĠÓÒÏÌËÊÇĊÄÁÀıÄ;,/?=<===<;?5LH‚173 260)R˙ĝ˙ŝĞ˙ŝŭ€ü*úùùöġġôòïïëéèċáŜÜÛĜÖĠÓÑÎËÊÉĈÄÄÁ½ĵşş²9,0=€>3IF‚ 0533€2p469)é˙ü˙ŝ˙˙ŭ˙ç!_eŬÁbe LĴĥ•˙lí|n§NhÓëĵ£˙iAtĉkSÈ˙˙ç^wÙŜ\Z–âs˙ɄônZ‚úĝ˙v‡m¤ÛyèX]“àn˙^_Â˙˙ä(+<;998;3IF‚z 46323225458 ,íŝü˙ŝ˙ŭ˙ê0PkMñ†2v~;Yl˙͏t[@G˙ĈxxŞ%Í/ƒ1yn5˙ùünUiVÌëZq Ì0Âg„œ İ˙˙IjW„ċŻñYnĴ)¤ümH?˙üĉ(+<;::9;2IF‚z,67334328+76 1ïŝü˙˙ü˙ĉ!ikôyyÓ/˙=WEÒ Î‰MCVG&˙#Żxx 6ô@w@ċÒ+˙ù˙żt,V›„ÄĥAò}€VÌ˙üìx~Ü=›˜ƒÈEŽġdd‰˙˙ċ(*:99<:<2HF‚z.$2423256.56 .ë˙û˙ŭ˙ñY=O0Ġ“Ü^úfÈW5J|:R˙–\—•üF'QàeéĠf˙ü÷T@MOŜÂ:SRÓ˙IŠ˙ÚQGAÚ˙˙Ğ1QC†˙œSğ:ULâ­@˙A>~˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöù˙úüŝü˙ü˙ü€˙ĝü˙ŭ÷ŝ˙˙ŭĝ€˙ú˙üüŝ÷öù˙ üü˙ŝ˙úĝ˙ü÷ú€˙ĝ÷÷ŭ˙ùŝ‚˙úŭ˙ùŭ˙ŝ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qtsv€wtuusvsvu€wsu‚vs€v utxxwuvtuvttsw vvwvwutxwtu€wuttuxxwwt‚wxuvxuwwxu}L97#>8898;2IG‚!E/4)8033223166,9;!‚€€„†€€;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799::9†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0ƒï† 58€9•8 7FODÂG Ŭ‚Œeڐ45)Eç/ñ§EĤħ˙,$`~bۧAP˙‘šÖ͋÷˙ŝ‰˙ŭ˙ĉ%7:IHGHGK@VP‚ BGAABDCF?;a˙÷˙ŝ†˙<ŝ˙ġ˙€t˙˙ĵIs3şI°˙xd1O~Ë(ú/4÷²C¨+h–5]Ö-`eñ†˙ûŝ˙uŠr#˙ŭŽ˙ŭ˙ç&6:IH€GJ@VP‚ BGAA@CBG?;a˙÷˙ŝ†˙?ŝ˙÷˙†9b˙÷˙ŝ˙ŭŭ…˙üü‚˙ŝŝ„˙û˙ÎÉġ÷×ĜƒŸ˙ô˙Ä 4üö˙ñÂOf˙ôŝˆ˙ŭ˙ĉ%6:IH€GK@WP‚ AF@@ABAE?9a˙÷˙ŝŠ˙?üöġġöŝ˙ĝġġŭûóġóüüûŝù˙ùŝŭġöŭûüŭûû˙ÉÚ˙˙Ŭˊ ĥ˙ĝ˙Ü/˙ĝ˙û˙Ü7˙û˙ŝ‡˙ŭ˙è&5;IIGHFK@WP‚ @F@A@A@E?9b˙÷˙ŝ˙ŝ•˙û˙ÉĈòÍ͂;h[8!¤˙Q!€c!şÊ”ĵ˙ü†˙ŭ˙è&5;IHGHFI@WO‚ @F€A @>D>:a˙÷˙ŝ‹˙ŝ˙˙€ŝ˙˙ŝ˙ŝ˙ŝ˙ŝ˙˙€ŝ˙!ŝ˙ïżżÂĥñ°QeRQRY°í˙˙´eZNSlžĉ˙Ŝ­ĵ˙ü†˙ŭ˙ç%6;IHGHGK@WO‚ @F@BAA@D=:a˙÷˙ŝş˙ŭú…˙ŝü‹˙ŭ˙é'5;IHGHGK@VP‚ @F@ ?D=:a˙÷˙ŝĞ˙ŝüŝû÷ĝö€ġ÷ùŝ˙˙ùġöĝü˙ŭùûˆ˙ŭ˙ê)5;IHGGFJ@WP‚ ?FAA@A@D=:b˙÷˙ŝğ˙ŝ†˙ŝŒ˙û˙F->HI€GK@VP‚ >EABBA?E=9]˙÷˙ŝħ˙†ŝ€˙…ŝ˙˙ŝŝ‡˙ŝ˙ù˙L*?GI€GJ@WP‚ >E>@@A?D=7P˙÷˙ŝÓ˙ŝ˙ù˙K*?GIFGFI@WP‚ ?E@?=@@E=8R˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGK@WP‚ =D?A@?=C=9Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGK@XP‚ =D>?@A>C=8Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GI€GK@WP‚ >D?==>@C<7Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGJ@VP‚ >€? =B;6Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIFHFK@WQ‚;C==>@>B;7Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIGHGJ@VP‚ =<==B;7Q˙÷˙ŝÓ˙ŝ˙ù˙L*?GIFGFJ@WP‚ ?>>GIHGFJ@WP‚ :B<=<<;@96Q˙÷˙ŝÓ˙ŝ˙ù˙L*>FIHIGK@VP‚:B< ;@95Q˙÷˙ŝÓ˙ŝ˙ù˙L*>FHEEFJ@VP‚:C<==<<@94R˙÷˙ŝÓ˙ŝ˙ù˙L*>FHGFDI?WP‚:B<=€<@94R˙÷˙ŝÓ˙ŝ˙ù˙L*>FHFGEI?VP‚ 9B= ;@94R˙÷˙ŝÓ˙ŝ˙ù˙L*>FHFGEJ?VP‚9B;:<>=@:3R˙÷˙ŝÓ˙ŝ˙ù˙L)>GHGGEI?VP‚ 8A<;:;;@93R˙÷˙ŝÓ˙ŝ˙ù˙L*=FGFHFJ?WP‚ 9A<=<;9?93R˙÷˙ŝÓ˙ŝ˙ù˙L*=EGDFGI?WP‚8@;€< :?83R˙÷˙ŝÓ˙ŝ˙ù˙L*=EGFECI?VP‚7A:9;<;@82R˙÷˙ŝÓ˙ŝ˙ù˙L*=EGEFDH>UQ‚ 7@;;€9?92R˙÷˙ŝÓ˙ŝ˙ù˙L*UP‚ 7?9<<;9>72R˙÷˙ŝÓ˙ŝ˙ù˙L*=EGFEEH>UP‚ 8?99;<;>81R˙÷˙ŝÓ˙ŝ˙ù˙L*=EFEFEI>UO‚6?:9899>72R˙÷˙ŝÓ˙ŝ˙ù˙L*=EF€CG>UM‚5?9:9:7=71R˙÷˙ŝÓ˙ŝ˙ù˙L*89:;9=61R˙÷˙ŝÓ˙ŝ˙ù˙L*788:9=61R˙÷˙ŝÓ˙ŝ˙ù˙L*;EFDDCG=TN‚7>89786<62R˙÷˙ŝÓ˙ŝ˙ù˙L*;EFDEDG=TN‚6>89897<61R˙÷˙ŝÓ˙ŝ˙ù˙L*;EFEFCG=TN‚5>€8 98<50R˙÷˙ŝÓ˙ŝ˙ù˙L);EFDECG=TN‚6>€8 97<50R˙÷˙ŝÓ˙ŝ˙ù˙L):EFFEBG=SN‚4>99898<50R˙÷˙ŝÓ˙ŝ˙ù˙L):DFDFEH=TN‚4=89::7<60R˙÷˙ŝÓ˙ŝ˙ù˙L):DEBDCG=TN‚4=767:8<6/R˙÷˙ŝÓ˙ŝ˙ù˙L):DEDCAF=SN‚4=87686;5/R˙÷˙ŝÓ˙ŝ˙ù˙L)9BEDDBF@@C9QJ‚0:5454482,R˙÷˙ŝÓ˙ŝ˙ù˙L(6@A?>?C8QJ‚0:45€482+R˙÷˙ŝÓ˙ŝ˙ù˙L(5?€A>A8PJ‚/:5443482+R˙÷˙ŝÓ˙ŝ˙ù˙L(5>@>@?C8OI‚.95 382+R˙÷˙ŝÓ˙ŝ˙ù˙L(5?@>>=B8PI‚/93455482+R˙÷˙ŝÓ˙ŝ˙ù˙L(4?@??<@7OJ‚093325482+R˙÷˙ŝÓ˙ŝ˙ù˙L(4=@?@>A7NH‚/93432170+R˙÷˙ŝÓ˙ŝ˙ù˙L(4>?<>>B7NI‚083€4 371*R˙ĝ˙ŝÓ˙ŝ˙ù˙L(3>?==;?7OH‚083424371*R˙ĝ˙ŝÓ˙ŝ˙ù˙L(3>?>>>A6MH‚/83255371*R˙ĝ˙ŝÓ˙ŝ˙ġ˙J(3>>;<<@6MI‚.73213371)R˙ĝ˙ŝÒ˙ŝüŭï˙I(1>€=:=5MH‚07€3 2070*R˙ĝ˙ŝÑ˙ŝüùĝîŝH(1>=<=><=;?5LH‚/73313260(R˙ĝ˙ŝÏ˙ŝüùġòôéùG)1>>=<;?5LH‚173 260(R˙ĝ˙ŝÎ˙ ŭüùôóċöG)2=€>3IF‚ 0533€2p469)é˙ü˙ŝ˙˙ŭ˙ç!_eŬÁbe LĴĥ•˙lí|n§NhÓëĵ£˙iAtĉkSÈ˙˙ç^wÙŜ\Z–âs˙ɄônZ‚úĝ˙v‡m¤ÛyèX]“àn˙^_Â˙˙ä(+<;998;3IF‚z 46323225458 ,íŝü˙ŝ˙ŭ˙ê0PkMñ†2v~;Yl˙͏t[@G˙ĈxxŞ%Í/ƒ1yn5˙ùünUiVÌëZq Ì0Âg„œ İ˙˙IjW„ċŻñYnĴ)¤ümH?˙üĉ(+<;::9;2IF‚z,67334328+76 1ïŝü˙˙ü˙ĉ!ikôyyÓ/˙=WEÒ Î‰MCVG&˙#Żxx 6ô@w@ċÒ+˙ù˙żt,V›„ÄĥAò}€VÌ˙üìx~Ü=›˜ƒÈEŽġdd‰˙˙ċ(*:99<:<2HF‚z.$2423256.56 .ë˙û˙ŭ˙ñY=O0Ġ“Ü^úfÈW5J|:R˙–\—•üF'QàeéĠf˙ü÷T@MOŜÂ:SRÓ˙IŠ˙ÚQGAÚ˙˙Ğ1QC†˙œSğ:ULâ­@˙A>~˙˙ä)*;9778=2HF‚]l9%9033167/56 *è˙ġĝöù˙úüŝü˙ü˙ü€˙ĝü˙ŭ÷ŝ˙˙ŭĝ€˙ú˙üüŝ÷öù˙ üü˙ŝ˙úĝ˙ü÷ú€˙ĝ÷÷ŭ˙ùŝ‚˙úŭ˙ùŭ˙ŝ˙ñ˙Ï 6%=9787;1HF‚=.3(80423167.57 'ċ˙ŝÏ˙ú˙`> ?88:7;1GF‚%J)3(813323167.67 *€qtsv€wtuusvsvu€wsu‚vs€v utxxwuvtuvttsw vvwvwutxwtu€wuttuxxwwt‚wxuvxuwwxu}L97#>8898;2IG‚!E/4)8033223166,9;!‚€€„†€€;D,(@7997;0DD‚)E)6&91322323167'.29˜878€9…8799::9†:…9:<<ƒ;<;=€<;=?;3(;:9988:6QH€  Hk? 914323167 š##†"##$ €‹!  !!"$(:;68998<+/2€2N E:03323323214978œ9:7*.2€10€1011)5>:Œ;::<<=ƒ<==>ƒ=>=?:77687;2+ND… )I 532323323€20233€2’32‚324* € &4334554€3433‚45€4 34556545445677€6558987767C5iYƒ .&N)*813322†3€232€322†32€32ƒ32287%%&'!"4<5334456554565454€545564€57756556678877667€875L)Nƒ 1$FB;/4133„23‚233223323€23323†2 3233158+!€$%792343€2365‚434€5445544334576556545€756975I"=U„ !3_/7052€32232232€322€3€2‚3223322332‚3 23:1!,;6234„3455‚4€5‚4545334„656€7 665565J6S„ 0IZ?3.44€3232‚32„32322‚32233223323 232275#0934554544€346566€56€54565546€7€6556€8 7764K 7R…&,^O;;0/00110/221€01€2 02102001221001101221100102/4425/1001€212 121124332332 34223243223455€4 33445651H4T‡ /+gU#:>976€766767•6786795€78677897…877998‚988„9:899:;‚: 99:;9Q"2Pˆ,)co)&ˆ,+,+,,€+Œ,ƒ+**‡+‡,+€,‰-…,…-,/4 3P‡  )AskG-*€-€,‹-,-,-.,,„-,„-..„-€.--.€/..//€./†0†212‚34090&I‰ 4UYUTUTUVSSR€S€RQSRQRSR†S€T€Q PQQPPQRPPQRQ€PQQP€Q TSQQRSRPQQO‡NO€PONONNOOPOQ><‹ ""$"##"&&'&&$(&&(&'(&&'ƒ&%&&%%‚$""('&&$&%$#"%%$$"$&$""#€%!"%'""%#$&'()*(%&))&$$&('€$ '())'&!"*74Œ € „€… €   !"#!"€!""€!„" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"·˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûsŽ˙ġ˙úûûûûûûûûûûûûûúûûûûûûûûûûûûûûûûûûûûûûûûûûúúúúúúúúúúúúúúúúúúúúúúúûúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúûúúúûú˙=Ġ˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ö˙ˆë˙ŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝŝŝŝŭŝŝŝ˙ŝŝŝŝŝŝŝŝŝŭŭŝŝŝŝŝŝŝŭŭŭŭŝŝŝŝŭŝŝŭŭŭŝŝŝŝŝŝŝŝŝŭŝŝŝŝŭŭŝŭŝŝŭŝŭŝŝŝŝŝŭŭŝŝŝŝŝŭŝŝŝŭŭ˙ĝ˙ !˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙˙ŝ˙˙ŝŝŝŝŝ˙˙ŝ˙ŝŝŝ˙˙ŝŝ˙˙ŝŝ˙ŝŝŝŝŝŝ˙˙˙ŝŝ˙˙˙˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝ˙˙ŝ˙ŝŝ˙ŝŝ˙˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙˙˙ŝ˙˙ŝ˙÷˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙ŝŝ˙ŝ˙ŝ˙ĝ˙ ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ï˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŝŝŝŝŭ˙÷˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙ŝŝŭŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŝŭ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨ ˙ŝ˙ŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙¨ ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨ ˙ŝ˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝŝŭŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭŝŝŝ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭ˙÷˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙÷˙¨!ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙¨!ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨!ñ˙ŝŝŭŝŭŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŭŭŝü˙÷˙¨!ñ˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙¨"ñ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙¨"ñ˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙ĝ˙§"ñ˙ŝ˙˙˙ŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ñ˙ŝ˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ñ˙ŝ˙ŝŝ˙ŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŝŭ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙ŝ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙§"ò˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙§"ò˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙§#ò˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ò˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŭŭ˙ĝ˙Ĥ#ò˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙§#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙ĝ˙Ĥ#ó˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝŝŭ˙ĝ˙Ĥ$ó˙ŝŝŝŝŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ó˙˙˙ŝŝŝŝŝŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ#ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙Ĥ$ô˙˙ŝŭŭŝŝŭŝŭŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝŝŭŝŝŭ˙÷˙Ĥ!˙ŝ˙˙˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ç˙ŭ˙ŝ˙ŝ˙˙ŝŝ˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝŝŝ˙ŭ˙ĝ˙ĉ˙ŭ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ċ˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙ŭŝŝ˙˙ŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙˙˙ŝ˙˙ŝŝ˙˙ŝ˙˙˙˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝ˙˙ŝ˙˙˙ŝ˙ŝŝ˙˙˙˙ŝ˙ŝŝŝ˙˙˙ŝ˙ŝŝŝ˙ŝ˙ŝ˙˙˙˙˙˙˙ŝŝŭ˙ĝ˙ĤÔ˙û˙ŝŝŝŝŝŝŝŝŝ˙˙˙˙ŭŝŝŝ˙ŝ˙ŝŝŝ˙ŝŝ˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝ˙ŝŝŝŝ˙ŝŝŝ˙ŝ˙˙ŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝ˙ŝ˙ŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙ĤË˙ú˙ŭŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŝŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙Ĥ˙ù˙ŭŝŝŝŝ˙ŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝ˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝŝ˙˙ŝŝ˙ŝŝ˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙ŝŝ˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝ˙˙˙ŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙˜§˙ĝ˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙’ƒ˙ĝ˙ŭŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝ˙˙ŝŝ˙ŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝ˙ŝŝ˙ŝŝŝ˙ŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝŝŝ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝ˙ŭ˙ĝ˙>˙ú˙ŝ˙ŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙ˆ Ú˙û˙ŝŝŝŝŝŝŝŝ˙ŝŭ˙ŝŝ˙ŭŝ˙ŝŭŝŝŝŭŝ˙ŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŭ˙ŝŝŭŝ˙ŝŝ˙˙˙˙ŝŝŝŭ˙˙ŝ˙ŝŝŝŝŝŝŝŝ˙ŝ˙ŝŝŝŝŝŝŝ˙˙ŝŝ˙ŝ˙ŝŭ˙ŝŭŝŝŝŝŭ˙ŝŭŝŝŝŝŝŝŝ˙ŭ˙ĝ˙‡˙ĝ˙ŝŝ˙˙ŝŝŝ˙˙˙ŝ˙ŝŝ˙ŝ˙ŝŝŝŝŝ˙ŭŝ˙ŝŝ˙˙ŝŝ˙ŝŝ˙ŝ˙ŝ˙˙ŝ˙ŝ˙ŭŝ˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙ŝŝŝŝŝ˙ŝŝ˙˙˙˙ŝŝ˙ŝŝŝ˙˙˙ŝŝ˙ŝ˙˙ŝ˙ŝŝŝŝŝ˙ŭ˙˙ŝ˙˙ŝŝŝ˙ŝ˙ŭ˙ĝ˙‡ ïŝŝ˙ŭŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭ˙ŝ˙ŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝ˙ŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙ĝ˙‡q˙ġ˙˙ŝŭŭŝŝŝŝŝŭŝŝŭŝŝŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŝŭŝŝŭŝŝŝŭŝŝŝŭŝŝŝŝŝŝŝŝŝŝŝŭ˙÷˙‡˙ôü˙˙˙˙˙˙˙˙ŝ˙ŝŝ˙˙˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙ŭŝŝ˙˙˙˙ŝŝŝŝ˙ŝŝ˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŝŝŝ˙ŝ˙˙˙˙˙˙ŝŝ˙˙˙ŝ˙ù˙€ŝŝü÷úüŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝüŝñ˙[?Éü˙˙˙˙ŭüüüüüüüüüüüŭüüüŭüüüüüüüŭüüüüüüŭüüüüŭüŭüüüüüüüüüŭŭŭüüüüŭŭŭŭüŭüüüüüüüüüŭüüüüüüüüüüüüüüŭüŭüŭüüüüüüüŭ˙˙ŝ˙ŭ˙Ô9œÓçòü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝóòêܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08w˙ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2c˙O˙Q2˙R ˙\ PXX`XX`XX`XXXPPX˙dKakadu-v5.2.1˙ w˙“ÏÁĦŻB8§‡4€ßĤ4D{‚HŽ:2‹|‚“ÀÓŝrgGÙQ…-Öğ·Î”nçѝħĴV$É#ˆ¸:Q!ĦĴ<öžê \ ‹UĝïrèÔ×tEÏÀà4+¨íŠ­EçĤĴÙFŸŒ1sòk N‰~káîèa9ĦUĠ:qİRÉcz ĥLì–]èqÏÀüß²È´TIġL° ˘êä˘2uèe-ògwı эvÀY“‡(%EOéÎ?)˘“˙Pğ”•Nf8Çàu´€BfßĞMòjáħµzBĞÙÔ0ŠñÛ%cɒ34k9ı‡ĥ0גA1èdKġ|4 Çg³èÏY*}ä Ù-0Oc.)Àžj­m,è§3Ÿ=70YôÑŞ)ı'=gĉʰ yÂoBh~3{²ŒÄ‡£ż˘hŬiÑà…—Ċ-Ŭs>h8ŭzb>÷Ûß còœ7HÚññŻ>ÀùÇAġÀ|@Y _½0çi°$ [b7ĝÌ˙ù' Û°§[\›Ĉ+Z1¸÷}(Öĉí+‡ÚKê$4wĴ‘a*ħ‘Ħ]²*˙D/ıŞgSŬ[Ûeġ&Ud³o$JFnçß>ëGtÎK+ÇĜE`5Œµhuıc\ˆĵ_ĦHƒ‘S@ hßìĵ•†[èÒWPÉ óŬ/ŒíĞ}_ù“ħbuìayU½Ä‘ô‚żgQÇà1€ÄhÈ#ĉu·wşslP‘VPê ÚÒ †ŻĴÑwÛ·ôÂ9[f7} ÑâPîÁ>°@E§ }4Ÿç‡–ˆÇáVÇáDÇçF€ Bk¸pĵó"  ¨`3 ¨QkMq›͜ Ñ1äğŬöµċRîċ‹ÄmèïiOŜƒB!Ĥ Oİn'|Uä Òğ:ùġ7ƒ0µ8”)Ўşë´&Àô[˘Œ‹DGÛښ_GR!ĉpuL,4€´K%’(†Ï×R@Aĥ§(‹,ü™™ßàäĝüö*tÇáğSóܸüöćSXïšäġÓNÔËıE²Çé܋Ĥ¤ öĠNJU=F|ıÀYVt˜P뿇OxĉGUĵµÏ{†ŞúˆÉRŽßüÒòÌë÷/‡ş‹FoôO>É·ġá •´sŬyŸŞ“0G78W1Q=eKŽÍfÎÙOqnƒŻ“·Ó˘ż{ˆ…Z%Ì˙hĊ²?v¸ï?µlĥuŝÂò¨ÙbNs·?†ŒÍĝµs‘k‚zçh£#L&ZĜġPÉĜ‰kàż=ġ?ÁXŻĥzÙŞĦg#ÓÔë·Ja›“Ùhz+„FZĤZ.˙+=Ó]ÌYçôĤ‘ÁÈĴ”˙Zï½û7ĵ*rî0Ï$ž鋏ˆU§áğ•²Ñ×3ĠıèóħswŸ3ßU}(˘­%“˙=ŸG¨CV=*“"™‘7gó1Wċ>ÀÀŻò`ïìUW"[Ž€¨Ĝhğ!h`l…ûKVӅħ4… œï†ĵÇ<·Í`„à<’VĦĈK˙"bÒİ„Ö0Y hyeÀÉ3 ÇóAv."ıçpfKxÀ­Áâ{`‚SîÔŞi‹ġÛħ’n›vޘ/JÖ2Ġħ]²[;›¤ìnJ¨¤Ħ£ƒ·1Ż™]üXĥÄÄĦF—ġA?‰İFz§Ĝ#ä/ûĝÈMXĈ‚2³(€* ~£ Ç ĈŜÇóµb-ĈîŒĈ·-^pŭŸŽï3‚¨ĠÖ)4İdx,*ŸÏ°’†Š+0Bìž?ZÈ":CÖüµžt eµvĊ×LġQyAi•^”[;MƒòBN†85Äò׊T„Ÿ=ĤYÚ§RCZƒìÓÌ|~:7ĥıù­üíZ‘ċ§Rë…ÂŞĥġÚGNʞN=N9HúÍvZżÈȘэ:Öp6Ê_Àş˙][ßq¸shĴŻöáé•MFRw+ˈdâ7KĦt°ÌÏ%@œÁoĤ^>à|+ I'”¸żÁWŻ zÄİUÇ×0FíH‰Ĝ!9 >5İŬtPˆ%àt‰ÄħX>ĜdvŠ*iĉ:dFê”:Î‰D7-ħüĞĞ$ĉ†•BÙîÏz3*˙AñËÀM°ĴH/wájKœ’\68m hgkċ'9˙‚ W,ì\ÁÁéB=°@?ğîh Òà]ġjÜNßĵƒ%¸Xëİd‘`ëá$-]í$}\ĝğKUXĥgTύQcŜĉQĵĴ(äŜjÊ‘¸Ê'{ŭgŻ‚J-o÷îÑßwíó0R>‘¨ż Ò|(Ĥŭ|§hÂËuĉN€ƒ^'“î9àJµ³Y,Î-€@.ħa"qĈïpĈ•ûÙĜĤÈëÑÊ·´Ŝ$`ŝ!úµÈñ:׉‘2"sÉïÀŸüï1,ây•í}˜l¨ÇC:݉óëK”çcä¤Íħc96O“jÛ”pnsçĦaZÉOí4"êü./0ğàÜŞŒà¨Ì3< ]”ü‘GÌ Û$qXStÊûp6ÙµÂ˙zèuĠé­Sï÷šUġSŒ`Şà/ŭꛜ6Áċ]68Op³Ü°N% Úw² YÜUL¸FI½¨ŽJ­Ó%4ƒ:ûNëħ¨şüŭ2ı§^Ŭ 3WÇ"eĤʛ0ÊŭĊġêo4`Âħ3ċĉ¨6¨Ž,ı$öĤ‡'<™|‹×vú^Dĵ{W‹rċ†gš ĵ1q})DŞ~ŠĤâóúŜT¸£Q?íLÓԏ:y†&Ğğ×çĜIRÖş§× í–fŜ8SŻáK™RÁġÀùÙ@>F Ü„Ċ.Ġžµ¨{Ù/yÀb·cĵÉ4\kݝ²Fo2û<¤mĉf)`bžŜ órŞz¸ŠÉàÜWœ ܏DÔe“£Ċc+`>Œ¤f òïóÙħœt*…ùĉ·Ú·™,9£âφŸá/Żì•ìżw…yVˆ”°ñÎ2à ûÇ… fò– áÄPŝ )ÁnĴàì·N³0ž›1íĴ!ö×p>ޤ´_çhfÈE½‘Á„›XkĉE{‘ÒÌU•Mڝbˆ1‘ĜJ´³c¸ÎH Çö‹yï"MĴ%PXïy?D›ĥÌù&0:[Ħúz$ß%×á ŝ;ĝi˜Ÿ—Çì#Œ56ZvŞ…ĥ#wûĦNBĤ(ÉHȝlÇŝ“ċI&Gs5³*Xüş3K h´.Ñŭév Bt$*zT7I HÇ*µ]ġšÙàèJĥé‚ü'ĠΑîŸatî †êxĥ;VRÉˏ°ô|aÂ&W]Êò¤€:cÜzy0ĴbwdĥÖ'­§ĈÊĴ¤X1àK˜  jl픇֌Ċn²ž¤úĈñċ÷ċFÍln`mÈ lñĝĤ b~û'ö‚ê µxĝ/šŒ)t½’Ĝê3báÛ5&¤Y“ĦRö11î{· ¸×+C÷`žÏĉt\Ŝšë‘t g•ߪgGa*Ħ ó|ÍŬ_AW÷7oĊUßol3*N-·ŻÔBŠn@Tïŝ+F6w{Yi*ô˘š!€TÂyvŸî´‰ Ù“ĵ…rÑs߄ †Y³…ÇFÁtÓaĞj5”#¤Ük- ë˜ô!ÊóoŞwcëmÄÓĉÈ}t³Ì(ÇgaN翀!>lÏo#ŠŸ· !†Úò@ùŽq!ëÎDÑ1ÇNv_´TOßU$"d ÇáLOÍòƒp‰û€½¸·Ç_öšK„ŝHo<ßÈ/ñfĈf†ËĊ:•qö8AvÔ²JşvTĉùT.²I"Ro’nÊŞ€Ċ!$ĝZŝƒT˙O‡T7VĽQ×ۏaì˘à q/LhGʊ‰àƒ`Úlùä£@š~„ kwj„ÏŝñÜHœ³Ë ıM•ÖxoŒ´÷–ù—ĥ,*}eŸJ0á8ÔÖÙŝ'ŽLÑîRBX£È°RħxFßC”£ ٍ-ìñ9·\÷–@†Ó -ïdl)6ŝ5FŸĵFAh˘;‚‹ÛM›Ò„ [>¸ ݤ6ìʰQŒ=ĈĤ@b›:„ĞôlíßlôHfÄA%÷ÊU;ûO`í€$HċÛí…è·_vó–ÙĊO÷À|҉܈ g‚EvĴ *DnĠ #k‘lr ıŬÍgŞĝ‹›y7X†Y¸8MÊû˜¸T9˜i1tW`¸}HòW Zrżż½ˆF¸Ğ²×°26j´ħ×ô­MĞ‘1:‚ħÏÏĠŽ~~°“óôîÓÑì€ê$$2YÌ Ë3ÊÉwößµòLD”ü×h}|á%ÈIhwd²¨””yŭ°ß‚rÒ^½häµPm?Pç<¸ƒ˜+˙\BŠ·S –¤8UhòċĈ·Ĥd ކ„ab*ĵħù‹3ÑQ:5A2d(sè tÙ0ŭ‰6AxF Šİô Û][Y*êsÒY İù1>U`7+ EɒcĴîp"í̄ż;Íöüï7ç!™5âżîñ¸‰).J=@ħ+H ƒÑ‰˙rÍݍ8üĜ¤wÖ [ğ֜'šî&µëžÜ1×˙|RÌhëßşè÷wĤò…E*S?È3 HhŻÎğn/nŻ–ğ‡VĠî¨Ħ·WΝ(<ŞPÖmĴŝì6˘èúba›%hħş–+útTħ{\ Ŝğ _\êáfyÔÑÁċóàUó$Ò²‹_ŸáŜÎŭp_ŜSi´˜í ‰lĦs°hyÓÖtŝ(™öğž<9r6ÉŬHòrenQ×âôğxë‰:N~GÓ ìú_ŸÉ­ EġX_†ÍQע‰nŞCóy‰çô8ŒxÌĞ$Ž=ï›w[ċ İ 8ihváOóÖVùJ˜T2CĠmzWj´ê üw×­‡Ĉ'˙ñ˜]½@HıGîU…LLüL·TĞl:í˜èÖaɂϧoQmÈ+6ú-@ŜNӞ‰%OM"ál–͈z’lèAiÑÏ4‚ÌùIŞ,'ŒĞ“͢ú>ӄUÎ?ŞĵğÏ˙ /É>Ù°‹&Ü<†µÖç÷,ıTžAg_¤äûê %³8ûx¸úHĉ›@ Êl‡šI1:G N`[¨ ÚxÈ‘?Z€Ĵ§ŭĥ˘ƒ2[d‡$N„…_–Ŭaş[(AœÄĝâÛğPf÷ĜM¤ñġì״֏Ĝ½8îz&p0Ar›²_|‚n½÷ÓıfBš!o“v:Ϟ·µ‡ġNĤ³žïwĴä™vï–Áßtî­aÚĴ$6•pïĤí|éşhRl3 ïĵ2FŒXY'W<ŸÇrb%İ­Àçö£:ʰpğ&ۗ—ŠÒ½m};6£Ĥ3ıtñÚÑHò­{ġôâè›}g£Täh;dİş:š^…N‰|ZĴ­>İ'g S°UòÓ_K?{[-nKì*=ċëJáNÓìäyïàó4ĊQç?ù…§$ÙZ‚˘”€½‘ëûħ¤µKâ“*µw œ·hû"1ֈñÌ܉¨DògÁĜœGKĝßMX‡ÏJHŜèÀ‰61Î;}² ÍH ż:ôĦßî@Çċ yInC-üÄë›ğÁN@~Gĵ)Xšĉóħ_+ŠiÓÖwMFcÓô%}ŝ"ˆPà8i£Âmpä"‘*œ1hèsêM K‘ïˆJ]öšWó_Ó{|Rˆ‚îÁ-YŞíñ>"ÉÒĝ™L>ßvM̊šrĜ† gbé·ġŠ|żĦx#ê™Î[^ÛĊ@‹˙cħ::Œs*7T‚3é½`mĜ2–SàäïÇ9ìÓZ}tÖÍÂ&œÖ(ÈŝhŞXrA€Ħ„,òhHÉm_33€SxN|4û×?·ˆà÷÷s(c|ƒöĴIí§Û\óKòž’ínöĴ£˙LSĵ‘m…ŒÀ!i)µjÑ´ëJ×0Kŝ­Ĵ¤üċ5·6d¤ÇïüÏĵ9XHİĴhf—ÛĠˆ:1F&òşiHLN_”*ß\FğŜ[Q~—RÇımĊÇFùdĦ8Ċ+ ¸Z2 ÀıúZ0ĵĦß; ¤˙nġ‰ˆ&WpL™Ìùż¤ŭoĵİ\m öm¤C QŻ’lßÇA92l&?ñĈ[ŝğéŝè"'my×ŜÔíV"aT T}8ž½ ˘ÂCö&pˆvĊ’°$ö4itk²a"áğxh Ĝ”Âĝġ§Ê޳ä$IbIWä”ċUìr„×/Wİqì÷M\ÈÉiž7˙=#%aŞ G‹É·Ż'ÓIt_hâ˘İ´ÊQ”Cƒ)E°È=ıa-I–( kòQÛ3§µ­;`b€§Ӊ9Ék–Ü€0İ{Gˆ}KüœQݐÛŝ² mĦl‡oC9”Öœá˙L3KŸx)İjL,߇ÊâÑ!ê%Żğò½ ËĜ| S&^Ĉ„B·9@‘İi•DWMğħcÈFWÊ Ĝ·Ôl{@ÛòO;ÇL?$îMFv%ıüĥ.5m^ÜÏj§#9b@7œVR{Ú³/V‰RƒvÓ >‰ ĝ&£7á8é|$÷'ħš ÏNÈ0 p17`Ú‰H_€Ndé9ÚŞg³f³3qS İs<•âAhêKUEˆĦ ŝ˙1Ĥ"uù$Oŭ&H?ŬŒË.´öħ끓àI´ÏCBE-~oš[wôú² ~=[}hy T=2BL~Ú8 ÔÍfâSzÑy=EâĝGÇ;™Ž(-xúî6ZièÁŜ­ĉ2…CĉtP³0%ñ\1{(ηı˙m3Î<ùêUĴùr ïħ>ŞX<4áĠ ŭÁs”V‹/܁ŝĜ7SVF´€™żžc8‰bM1!}ä߆‹  ·ĥ­0öġ·_wşİ.ğ~r*úUè–îUÛħħ‘ÙĦÚċfaĊŬ4îıĞbş9d™Žä1‰ñ%ĝĴ¤Dĵ›ŸUQ—sÙhŠ—Jr]r:~’xZĝ€Ò>Í3…İĦŽ—+'uħTĦ˘XğĜ= 5‹ïêuŬzß‘ĝÄ™×ÚÜĽD£áÑí^ŽA£˘—šÓsħ( żûì êaê²çŜŸ{Ĉ*§Ôkµ ġI–tOä‰r˜Iċr‡ĵiµĈW¨Œ˘cqZÓg}!^ZĈ™Ôï?¸+ï eĠʍ9Úó‘Sô>jżÛ˘›öœoÄ@Tܐ>żLSŬ\™ŞqY(ù~‘§1j/ĥï4Ĥµ5¨sñîż %ق`ĉ„°‚߀Ĵy`3[½1q‘¤oU)˘ŞÉk'DŽ÷½ĞÍĊNĵ`ÑMPËÇË ŻíÚħBìĝÜj—>_êjş‡{¤z€0ÒÁ)!›÷9ĴSċ1GU#Jpñ/ 8— ŭ—·>zqùĜ`Ĉr¸Ŝżĥú¸nd ràîıÏgÁ΁•Zqs !r1Ö·á’ôMĊ}µŝdÁÜJAU‚uˆŬ2žĊᎯw¨ Ĝ›pôċxS$ÑCµ)Gyğ3G•%/³/ÜMïl8 ĊĦ#ÁAoŭ³sôY$`Q.y}ċ툅{vŜAI‚TŞ; 5Ŭ4Êh˘É[óá½ïµ£X½–QĤí™Ŭ˜Ŭ‚§UÇĥûQׂ´§ş%/ŻÔÚ§°R€}B~1oÂôÜ m‘߄Ħ6Hމez·gyÉFò{-Ô)™_ˆĤÏ(•Ğ Ħ=ĥƒPİnĴ_âİçÂW:ò•ÖÌ:çĠÌ u˘=bÊDíC˙aˆgà5Âv­dÄ_Ï5üèpżÉĴy+‹4Ͳ¨WkV@Œ+îaùd âxŭ°@pòÎÁÁP´;Ĉ|Şò>gÌ6wT™. ä{_ÀÏqĝ~oĤn€²MhêrÊĦ€TŭâÉdŝoŜI¤ì§Zîoò#ÇkˆnsğħœKˆš,í)e­ ËÒ £lšı³ä\ċíä×p‚Co]‚ÙtÂPˆħG¨( Y5ÖQ_§……Nü€fÌ7ßk'_’c/žwµÂ¸äKž_dy!J_–eàInĴ^’ç€ˆ”ÒéHĞ\ۚ)úĥÌċPmµŭŸ]£Ô•ĈĉÄR­ÁTeú<QHîjV1p€P˙}ç HwĴÈC3x4¤ áÛzRÉ˙6‰Ž œáĤĝÜЁ ,O+r_ ĥz!! PnğÁIÛ´–ÔĜSUŠċöÒ }ƒ<@›6d?;óiÁGcxǂö8=ݰ‹8Ĥ˘×Ô2Z\ÇfE§Ğohc éM~<[ŝì$sz˘™_QmdxW?›àŞ1ĉë×*h`4´ÓÀŝö?û´9ïzi@'÷yrÊĉ›FÇûUŻ‚YĜüF4zÌĉh2NĜéWkלAĈt.D˙„0MDVñ]nĊş”î{qXNGĜ ÛW ĉWV:„îÂĴú·3Í1ğ¸|‰îCu–.î[â°È{ 1¨sܘĊĴƒžt‚ùĝĊRDP9ŭJaEÜFG—ċğ³ìêÁl™ÎŜY.eei3QeĝŽy„ög&†ıaĴ½ÓEštû:šÑ>“ÒÒ÷†ž¨I°míÇŻ£K„ò½LóóŬ=Cw·ż96ŭbĤ6 8·§j/Âû²KJíg9Z›Ż‰ì…Ù#Ĥ;B‡H‘ŠĊçÛ·SԙéŝâCL'dwƒ“éy˽N>íg$ÓÊ}€vÌĜ`8Ġ“Mï‡òí(¨C)‘öv3ŭìÎLä¨%iR(pĠá4{q=ÔÌ÷@>^_kî´5ì­çX<ġġZ˙˘tŽ<|…´ç0c­P„>Ñòá?S4oÄÏ" \™,İ˙vúÓù‹GBŝdċ"zŻ[:Ġ&é{éçrk(á@Ż0„Ċ%7ä2d÷aVëO1ê?ˆ“s°G„¨îWçê<ċáè;Xˆƒµ‘qži@l9}Ċˆ}—İJĉ&ê1´kF’ËÀÚçdĠĠ‡ ıCŬ_Òı²>!Ĝ8ÄċuЁ×H‰ĥ­Ô;÷È"Qg'2² Ñ7C˙EYt† 2WˆÑݞY3³ĜhÈrcPŽjŜEAô†Yv­‡£‹ hĦBT3+ ż}ÏpP¤2ĉ2Oˆ” ĉ­?A0ȋùĉŽ$VéÌA¸i˘0ŭԔ–8|Ĉ5 “}yNñµö ÒÖŝÎ(ïïÜ:n“­èmó5%×q,ËÎħ‰ş[~Ŭ6˙9’äZâMĜh÷ç}DĠnJ„Ó• z·ğ%Ċ„ċ4½èkFĥDû²§jĜqĠ’t“)y5„yô^" ^S¨…áĉĦ—6/{ĉ•/ÑTßF°a´Ğ²-NHĉşßġĞ5ùœá9Ż\3ĤЧi}£j 3šĵÄt¤°fUŝɆïj&% ĠbÔ­×Níñ£ĵè·£ğ GĞü~Yë$*H  ĤĝçäFoüè›ĤÚX‚K§nHŭż;³ÛĤRûM•T{sA&:krÂîÑ*ġ/’ñ‰úqĝŠŸÏµdż–&—ê2Ş;p' ĉ?ŻM^F²ŜKv´àĞϋZ,yw<‚) ኝ•M˙tFËÇúÏ ŭ0‹˘Uí>Pbıj Ċ&… „8ÛéWS’úĤ’£2C:!ö~ Ä&ıRXôÚD}D·ŒBş ÁĈşMċĤ@é^?LrÏÈê[`#ERl:½ȈZhz|* `2H¨ŞÓú¤äs´ LüâĴ;4½Êê×mìĝ•şi—ğ"ƒn‘CkóĊp²%7ßhĦ%gUÙZìżÚIô5‚AË"²\5ïÒ#LÉiˆÛz1³ µúħĥë ²pÀĤǐ)ñ§C¤w42­iŻihVĦ ùîÀ.˙>ÈçPë—Ê3ç0”#•ĠĜ|o­ĠMq´ĠÇç£jxˆÑNòfÀ×lnò›8B)‡.µ˜1(Ÿ½É#úşûĥ;ĞsĊ;=Ÿ(M#ÑHeşó\ÙÇáĵóÙ¨ü5è֘[è0â·q”nÙkè°˙3É>­ $ŒÚš]<›h:³şùo›ĉùo›ĉùz~%îċ;‘Á/Ì3äĵĵĵĵĵĵĵĵĵĵĜ^+§Üq)gv’Uôw›ĴAMs|ß7ÍóàWo7Íó{cËĠ\Ž: ĊĜğև­9£Î˜°—ÎXÍħVi}ƒ²DӃ&·˙ÁĊä%Ieĉ$k’cÛ ĜY‚‡ŭû”Üîm.ĊÁÄ5h°ßA­£%/†oħCȓFTÂÀÏĦÈ/ЋԷߔzğgnhCHX üß_J–šNpÎ%Ğ bÑLîŠñı× 5E½tu%W—+²|9s‘äÛĤ.r‰àrÂbT‡-—uL‹3aäİy¤d Cem_ ­$‘WùIŒJGÀ¸˙…I,Pȸ9têQ i‘Äç<íëċüÂ^ÍkĴLÜN_Qs9ŭLĝŭ/Hwݞ¸ Ü_Ò ħF1ċ‚÷Èïá?ĦqĴ÷† amĝ—ÖĊï}H^ö`ŭGRšö£AŬI½žqbù ˘‹ÈúœO7a3Ŝ>‘smmŜ ı—9oÒşàiĵÈË2œÚʑ9’˙-àN ĤZ§xË:bTƒ$ĥwäĝYk}O„áñ‚_züç {ñlÎ ÏÚĥĜk %ê_ór sUHêµo>ÊQŒ˙z÷§ÔPż$ä@/é $šSÓV"Rq6`ĥ)ÔCa•LĉXšE‚Ŝ€^'(Œwg3ñÒ,ÍhŝíĦdN|İC䨄‹fŬéÑìÇÂÔ<#ċkŒéV>x²’Z… njüŭiîQ='‰jŒ€&ïÙuN"„r‰Ĝw^ñġ?ΗhíVgp²Ĵ0víˆV‡@üÁŻżV)Jvĝ°sír,˟!ùŒmÛĈW<  Û˘÷zÌ-²Ĝo8ÇÉUzd ÎÌ×Ŭ1¸Ú÷duıi ŸsÀü5-èŻ4k…ÖœZ 8ƒxÀ“ŒmÁéòü¨´Y½q2~ë§DHdنt$ıëOĥ‘)ğƒ£×ÙÔxl/>E ­”k+HQà ^q[Qbß´eŽ2ëtŻ×¤~¨ÖzksÌە@‚ŭ’Şophö“Ö•µ—ëuqĴò­‡PÊĝVK Ż db”`ŜÒ ò“Ùp|oôv#ü>48âÀĥsSÀdà,íó“ĠdDÛĦî‹ Ö@ю\ĴDŽĉĦÀÂJF²$KÔ2ߖ 5SGVۈŽr&cÑ÷(ŭŽ1)”'p1jİÚÁ ÁĤÔ"&ˆİFŞÖ“€lB>äâ5òÊaÖNô™:Ó ü}mĈ‹qŝ˙>t­“—7l%iùÖL,LIB£’‡\sè A–ĞñÇd³Ĵ ÓPóĦFGÁñı|“´áTú-TëPċGXŭùö~Ġ{ġ‘Í’Žw½Ĵ=5½Ç]ż…t‹“Ô͝ïÜÖĥà³7눣`[^µ((gJ[×/` mÙV8ÎK2àċœşt܏’Ú|ô=!†M{Ŝg"ÀşI \?ğLĈÜĜ­“Ŝ7€eúëùŭíġĴ‡BĤWŜ)KfĜ6úôQġô$ꔂS…xi£ħ5ˆ(sĵĵ/ïâsrx×rNìĉ÷½GŬnƒàĈĵŞÚµ£1qêy$¤)}guiáI ˙|p-ÁaĤÉO™~.Ħä7“%NÔğއuĦÀÌVϗ‚Oh‘f°8ßeÇħ·zqş·Ż]¨~PÜܚÄ|7Mhêġ&äÙÖ@ œqµĞ#m‹:x’="áiò'ċĜġĤÍóĠç—;ys]U¤n™§ûÔo HúµPµ|ŬfûDÚ£ şmÛá,H˙sgĴ X³îëndKǘgħi›ööĊ`‚­RjRÈ"BS˜ïN& jÒġ™E|qùùûàfġĴèN˜YÂљLD„Ò™ /3 żù!Ş…|ĞŽÓ&F§Äw™Ĉˆ×Π뀌;Ûsúó v8J1`ŝğŞ °;,´!˜í†\:|EĠP˙m×Ù!³²6;p`ùŸ'(ħ÷: Ĝ÷U=ëïçôwkĴôà_• XM—($û§ÜêêY¸ dÛR ö)2×jrÖ "816o8iW^%ıo8$ƒát”‹ÂÚ{ΒÔVµÖg[kFŬrä§ Ġ K½oÔ/%Nì½ p˜^›ô%­Ħ?•Cì$eñc~6óµb>Ç{&äx*Y[K"&¤BçC˙8ĈTğ(aH` dĤ>ĤĠĤĦp§ \6DÜYœĊÈ7ğvە”î5̖1xÇF(܊ĥĠày4/v\§-“Kœ•ÓÏÛ2Ô2HÂ˔²cŠ$ğj§öÜİW'8F‰p‡ÂyˆĉdÄa5†SÁ…½G£LÇ ‹07Óu&÷$1˲™gF=È ‚—r† t}ġË>OŒ+Ĝ‘‹É ÌRżGĈ>úAEœc°ÁùĊá{Ĝls~ï|˙.ŭЍ‚A+?eĥ2$ŒEċTëÔY`Ġj½é¨fvPÒÁ׃M‚çHgù÷;…¨ç‡‡)ì\lŻĉâŽ,DĞóö•ĤŞv‹ Ċ›ĵ­pòçÌg£7°‰h;VÜċ\[8]Bޘœß‡ÛhĊôÇ.B{օğIT›‡˘Yç'Vû/%ğ§“&–hÉë£ ‹ İ[ĥıî£íœĦ3>ê|îıJ²ÂŸĥuú˙.E)ŠJGĝžJQĝÁlžT÷}6/é٘­K"­\ü‡œéyĉ–{a|ĴĜÔvċcğSµh! Ȟî£i³Ò_éÈEĜŞihŜ*Ĵ,Ħ3ŝFYC€Z°×~ôËPvİÏĴYX“`;x4GıôÍÒ‡7Ċ)Ĥ…xL}‹ï˙X­aġ˘ÍÏİıµÂßÒ| uÜËoy˙X"Ħx‘ €#•IsAMzÉ ™²Ï &‚Aï‡%Ëñèé"Aş†*¨bmד„ÎÈ\†TFxQ˘~t×SÙE’[*ÈÁx&²"eJ¸›´Ĥ_î6Uâúeµ ¸X(gZ¤ĥxKĝıT­TĊtµ ?2NEmġCğTd^^^^^^Á''|y4Ŝ݁È":ö³<ÔH ŭ½² ÔfŜˆ˙Xç—xOáxŠzèÉ/šNqYà# nïW˘ĞüÒ!'ìN†ŭ%qü|JžŬĉJÏóĞx5ÓħèĠĈˆs>#”FĤ|"!£âèV…Ŝ[èê·RZ`~ŸQàhS"uÚ÷SQr^1jßb%ŬŽ2„ë)¤ Ĉrp{`S”ğç¨jĵĤŝ¨i„3g‰%ÜÎ~`È‹;6nYµò}ëbûĴ\ + 0cZ1]”,Ŭ4<•Ġ;ïót*kĤ×6òĜŞ6.˙85-?żİGñ_Ż˘ó š#šÒÀlçĵPèˆ˙Tˢ”ŽÊ§ĈŽÄ‰ċ`Ÿ51•µġÁF€ìpM΂éYĜÔÀżÉ÷ej­Óiàjŝ*ż }mjƒ‹ü(vqZ*6ÛUòr53½ü„Ġ €~¨Ŭî3jĝv#^PÛ .Ğrñ5NLjZÔà‰-_ġ˜‚¤i #ç”Óêĝ8QîÛŝž˙wpc(s+dë”b@ İ Àˆr•~8\(˜]3Ż€kË8Ŭ³ë÷(Š'pùÎĝĝ¤Iħrpu ÖÂ0eàħ áÓ=Ż`×{91‹X½‚ñŒ–-û ŬùiÁQ×,Q*€îîçxÔ:/üĝE˜rv†“~(š˜ ĉ´ÈsġâZ#UâÎ$˘ĥ8VNÓ!„*ĞósĤ­Öċ‘ŻfZħw/„ê›öÌ!Ù- äĤŻÊÇEK›ĵq0M›ì›ç!ên!;l!%÷ ËĤ‚-íH›ÊéüŽ€#Í{(ĉ38T+ĤuñÖp°/Ş zÑêëŒQhĴħ$%ˆÁ:ĵD)ZH9aĦ2ÉhÂĝuižŸ‡ë‰}“*Žyì>6›äé‚/ë #T{„"kc§œĴ?ó I&–¸%Ú5O~‚ŸÍ8 #CŞ$L|Î÷4Ów$Ëò$ƒ÷ħÙCì·âMžÊv[:ÖH3Q5˙OoP†ÄTzÈJŞàë#ŭËŜ‘ò–” `¨Š% Ş‘Bü˙ú‚UH&†€È é †:Ÿé&o/vĈÈ- 9€eHÌúÚъ#ŝ+ͨ’‚‚Ù˙Bœ“^ĉıŒŻ€z£íû0ŭ„ñı'ĈÄùb6>!Áèa”AêpbF_ÇÚ˘Fœ:-É_#Ÿ“Nì›/mòĴı‰„uŜ³Jé!‘MÏŞ_Ë_ƒy ŝ(Ú†ġSÁ"ĠδËC´}ŠÑx쟚è ĵ>! Ôx ҞW—ÛI3ŽsÍK^İŞò@í×3'3Қ qA#˜JġĴÀ–çA\Ŭ-DĵĦwö.Ĥ֗ƒp2İ>m?™Ħ>Ħ“s “ġ3gıvNAçbâvoúÜ´Ĥˆ`#êfHĜ¤·rxâLAŠÂPSŻ,lÁ—G’D`Üĥ^ÚÁ5™í)öYD]´¨66*Ħy#.ĥoĤ8'ŜÑ@”$šíÇ.+Ï^j¤ ˆ-ï§[a T5¤‹ĜRtb3?kŸx>°˘[rĴr5t³.0À^˙ ¸W|3+êÁĥ€&ŝzlŽèàícB‡Ŝ÷£aHÉŻPş¨ş28†jnih 2÷Ħ'Ŝû˘j‡çž€6ŽHáxyÍÙÄ֒‰2´%™ĵÖ¸²·sπö;1ŒW§cE¸8>h.Ğ]bÂü˜‚U!jċ§Ófb;~ş™àt+Ä~"n òwïİdueóĊ¨îkd’˜–z udğY² !'ċ3& XF(ß6͌ôÁKSĉíÓûI‘ĦŠ]÷ùz’ġġô°X”Ŭ`(ÙV`'\œïXŭòЉÒNvĜ“fġ„³ŝ™ö-A“ĦƒÊ^ ÜNĞĜAĠeùŠA<,{+9{h4çËöΟ(6^+'Ż1žPĠñWoBuÔ×9ŝg³½d%aÍHújöÈLĜb<à]ÑÜ<(!ŝu÷ÂììÍzp˘.¸;=Z4"YzúêdLz˘ĞŠDyĉò ÖG&El֖m{÷|Möt}#jARš…ÛŽÖğġ_áĵCR¨¤“?š(‘ëJrşYaĠyVŒWĥn‘PàùWh£ŝŭ‘PĞ+éµ}#×YÚuµ 8{·>À{ œ)Ĥj–ß"Ž8ÂV œGxŭ.ËÁğN˜ĞÌ|Ĝ?Ü8äÏ£—ÑLJAqĜ?‰¤9LyċùŜ°vċœKm$4  é… vMú+˙ _ħVêNgû´Ŭç1Gŭ¤.ʙ\ÚbY„Ä8ĵÑTbSĵ`ġğ6żÊû°Ĉ8pŒ kİ~˜ğ¤äùH1çTˆ­hOUû.†µ ’i_nPİہŻV}îù:%Ċ˙[r•ÒÎdXG^XxïQd ·×çO“ċx{b•bġË[kÁĞB†'b/4Ä'u6=rSDHnĴ[Ù0İ@s—Ûw#.LÒ֕Lŝjô°vÏ8Gċ*žšî¨šŒ$N,a¨TS½ñyan^fP•oû͝HĈ5ĉê\ Ô:s´èTµ·dOĖÌâ[LÈK´‘w‚^dX)Pˆ&Sè6ßà 'ŸKÇ ÎU[}6žT`hÖšQÉġ/`au)ż£§6&\'¤ÒuF{&e³(xĥo>.›ğŻ[–½ĥž^A<ü›8İä^àö/rĈ‰í}@;´CÁ$É@O0è 2§½ÒÜĥ1ŜşDÙî!“Ñ’`ŜAËR3›a4ácrü²I>È7PÛok,bŜD†ûŜÑÛ] +‹-ĊW3hTvŭ‡›¸×Ò˙˘y7RGMòÁôĊĉ/[SgWBsf3n]6ü/hmĉdĥŬ$ZëĠ}~ż­¨cè`Ğ”BNí×Y0ħÄà ­²Ğè˙?Ċ[n6-żq Ŭïp´Ì–~˙).÷C+ן@éäš`·^*‰cŒêß"'9„ƒJ h\tş ŝJµT‘=sìéE‘B~ênÂğmĤ§çl?Es›ñ Ÿ ò5 1“âZÒÑûéŠI$’I$’I$’I$’I$’I$­Ñh%òTó¤VŻÛ8əšħ‰[M"‡˜ċĞK9.â…mk{oĜ:ŝjIàÛmIĦ•e}bžZ}ڌƒpp[!UL‰…I‡îZû­<ëiIB\§L…OŒ}Öĥ)ÉúÄîye ZÑ KÎܕ^ËâLBҙÛàòÎ~Ĉ…İT¤=”7˙GIYpaÜ;+Ñü˘†2 ³í›úŽ–ĝ˛g\Ž8:D?/½vóÒI$’I˘{m|4›•}D/vBxH1Qí˜Á뚸U³jµˆÒmÙ×çJ 6ëÖI}@@°1wÓŝşj­ùÌ`‰_íŒM7’‘X1tm… £^)Q@‡Ç6 ,sùİ5áŬDšŽ|wÁfT˜î-e£]ׯܛ•>?À>˜˜ŝ<‚–Áoófڙq'§ç›dAf–;,ĈYĤ;MŝğÖġ°ĦŻdİ?‘Ŝ|/1c;àÜ ï_ŝŻ~ĝŞüİJċ8O(ˆş|ƒ÷pbéžšş\ŭsĠ‚\üwÂġ ïĵî ½_¤,àğ›ĵĴ·hϸìên]X½ż²OÙ 8Ż÷H —Î$üž/~~µÒ3Ĵ0ġEĞŻÊUÍûòА^€‘Ú9~îµÒ{q’hş y-ŞŞGaÔ`;q•&ԔŠĜ­"á0$‚£ÈdĝñGÄPcx£{Ŭ'˙nĈöêû´¨¸jŸOô÷#H—&DMÔ4^Ş… AâŭÔôßií3ۀ†„N­9„@'Ìp‘":܄Ĥ²š³ÁüqŠä*$•“Ïmh½pŭĊ(xdˆô­•¨£ĤġÏÎÇpİÖg/‰óÖ*ëŻr› G0Oċ –$j+1³O70ú,ĵ 9v…` ˙gĉóŭoÛ¤•Ĥ}‡}Żu1ìÔ/föÎÉìü•?ôÍ{™yĦ&RȐ“Û!ċÖZñ? ÉLf+K~ñ#8Ĵö;ÏŬÜ/tRŞċÊğóß ÖR„¤\{&öT…)š÷™yräİè§+ëî]Żĝ8ᖕÛo?•ô0°^(=t–[é}íHû=ƒÂJS%·~ŒÀŠ6ħVĝ-˘ ²îIöêÔ"°‡öŜ#•6ż^)TA‰-–mkÊUßpÏè ŭï•£ÉX&3¸kFÔ´’cĥÀ…r˘İ'–@̜—|^²Ĝ‡ òöƒrâ'J£QŠÎu²#z+ ú>ċ ² n£Öß^„şŬŞ.Í½˘˘‹a£ĤɳŽ@IÒ ġmôĜëâ^ƒŠÒ(}OOŞûàVÔ1Œ’Çׂ"YĈ£ \kà ĈJ03,83À4˘6­ĉĊöí Öİİ-ĥĈˆs+ŭ”ÙCöšíN¨Âg‘à Ğ&D‰‰oŭLAÙ¨ä’I$’I$Š‚Ô…|EÔ³€aá£4èy !{&&àÄâÒn%œ$ĈÎÇĈÊ ÂŜéÏ µxdİZEJ›s”ÌB>v ·"”ŠûVo5*7” L¤W{bUŞqúDÙr9İà"óÊFêĜ' äĜCċPñAf hQšm ĠÔ÷pŸċÇ „^ÉÙ•ä:Ê÷Ä ıùjxÍ LPU­ KŸÇÂ)BĞš–éyD`¤’SċúKI‹™sùÉG қo8'^ž[|fúYf‚ž‹0ûżVĝùf„9œq5é£í~I`ġáÉY:‡aÊïz>grz`…ÑO1îqúZv­í YŝÔ<˜XÜ҇~\ıëÔÏrž? eĈ >Xámİq8‰çyëĝ€d‰ ²’Tâ§ (ˆ#8ú‡@ ­šċ9ìĉÖ1s(|amz qô2sè 놕×à,rŸbqNòñ÷’ EĞĠIû‰‡O¸Ô„z(ĴÎ-—)ˆ{ìîŜ°ğáBĜêÉĵ(é薳hûşÚ,[ħ†£‡j‹;d•쟜Ì2ùS e'X½ıŸO1A‚Ü·$F•ş´ĊnÌV/PÒJßW`$^µ9Ĝ„ic]Ÿ`£ĠÊ+Iq˘Šċż|‚+&JġŒ=6pŬ ʝ]XWpĉ%Ĥ™‡‚°N0¤ÇôĥżÍŝ÷+í5ñÓnVTw Aó‰rÜĥ‘{)°~~ ÈF¤p$V1ç-˙~ğÙ<1ĵޤ¤.ûzÎë ÜAÛíC 2ê£ 8דĊ]/ĊâjiÚ&e4'38*Ò0‘M`ÚköB˘Š.ċŜTÌz,Ż—€Šloi~8 Ö¤£t…Îí_˜†lŬÉ'ô;·ĵħŞ´=ħF¤ıl .ü+"6>·ƒòÇ WÙJĞ} T°)·żÙ”xz(޲îG:è×ġ7'Äf߄oâèè°TSµĤĦà5Dñ;uÂĤrÈe ÁšŸ UŒêQÜ"ËÍÌ J¨™n~<œ ĊÍ÷™pŜ€)_ċ´ÜÜÍY&ğÌċtBÇ·ĝäZ|àĠŸĤÉ uċc÷_Y”==ÜDĜZˆÄr_Û˜2Ğb™0K€ú¤12”ƒÛZ¸NtàÚÂ2:âFFVXêXħÄû” ìHGŬ@nGZ÷äÀÚkŝ@ŭÚ›à†´yHDŞ·^?a [½ÚBïÀ&Ċ~BG³].?2P]Üá#úĤö³%œ\JA'‹j^Ñ"Y÷‰ÎÖwÄı‰ġrC×xQ½EIT€KœÊSíâŒ9vçñ2cöáèĦ) 8ìüéÎñÜ]ŬŠ”Í:b)çu;t‡öŻĴUµ¤·;(ğ~hÇŞ‰SâR~ÀJŽ[[?K< Áî ‡°ğ–?ŒOòAçBë‰zœú›à´żóŠTmÓáR½ĥ/ŭŠÌÏèÙ 7İò£wŝ ÓċËR“ ʆ jÓP@"Œ+çüĊŻżœ/¸Ş–´›™ Ûa¸Ž ×ÓK+&ƒ,œü˜ä™Z5ˆ}é0ê¤Ĉ6äfġ[KD£ReqÖb{ŻBĉrQpçâĵnž›XnÁœğ1PôEĥcŽŜ+„ú”>˜Kdò_óÈH‡ÌqĊÖ+ïb£/a'´ìÌüĦ‚HmQs‹r>à;•í,7ËYÈòĉòȨş7/ԍ˘K¤×V2ˆ´hbJ^ĊÚĤúbÚb ž52|Ĵ5ïá‹~Ö¤Aó`§°?(ˆ‰ yBì_,Ğiì‚ù°zQ‘] lÚÀĠĠҟvzÏJ ƒĉuàÄuñċĴÚÈŜ›7dˊ‰k µYH_İxJ d÷%ÙaÜÚ̉ÓĉCwqpiMFâv^zÈÈŬĵ~ô=Eo”žžá^¤,’ŭAYİ3çI—ğà4ǀÖé,‡xÇbŽÛ9 ÷ TĤp,ġ)›üÒdÜ/–šİm‰gKá/İM ú‹@[ĴU&ù)oK›&ÁAÇÚğ#\˙^uQÍ×&çĝ7M×AҀk‰,k”ßk³[o;Ċ:2l翊¤ ¸İ–ˆCşe^)ĉ^îĊzé’<³Ì|ġĴŭQlt8óĈiÎ} ’ıÖÁŞÂ‡ÁkÊE/ IwJŠ3ôµĠc˘?ĈÓ°~sŒÛ›‰ŻN<ġf?†ÀW8fEÙĦ>$HRòìKûğĊ™ÓF|>’ï+Ğ.çˆ#ħ´€È<{™Éı1Üxu{l“ĠŞ[éĵirÔÀÏDcûĥ½ŜÒâĉZ­IGj|ĞuÊ¤R‘mÒĦ,lS¸ëŻs·â“–½LJ¨éù4íÍ/2ΈVì’Ĥ;v&Ĉ_LĝĈžŻŸŞàsr ŻÈEìœÚ“í£I°à0,Ĉ§LÎUaÄ9 qÛǰVw˙Ĝĥt·ÓĤ›^<ïùêG ž'ùò„ü*7³´8‹ĉ´R=´ #–ĉˆ„Ĥó‰!…yèxfŜŽ@İ"uÊCŬġßWn3ÌöÌ>êĠxòO ó;i~ĝp= çnìŒ ĥħ‹tĦÀ£ú³Œ|ÒX)p-i$êjôÖliItüTSñô7ïŝ]ÄÖüµĴq8ĊxÄ×ïw ֙ÎaòcŜâ‰díh…39ĠbODFc/â˘jxMNñnï ßW¸KĈżó’9#ÌŻ",“ô=´èıŒè‹#.Ĵ<Ç|ı;Ú0ŝ"W‚ğĈÒm# Òà@ÊWqw~=³qüò‹_Û@è K;=9˙xèċIé›#3Á?A-A|LMç܏Xm-èSs”Tċ–˜ Ùqy’¨ß*N%=°ÛbĊ%j Éï­V[żwû–o˘0Á`($—ó’üá’#H]îÇ겘RÈé9ä zhñ~ǜÜl|j˜›[%òÎp³ùQĵŽ:ĝt Ôú]×QÜHòĵJ¤Gĉ|š4U† Ĉ]Ġ’Ù2–Va‹Ä-zt.מÈÖ4Îë}íĤOâe˙^ÈŞ$$D”°íò˘ÁLw˜r?Î0›}j!èú(´MEF6HI,ħıâŞO!ôNOM'êïò™xÊï¤S}âµ ~8ïĝÄ5Rx•y*À°°ûCD%^ĥ[xÛ&cİŒ…BaÚ(GċŞÈ#{‰Lž §!°4ӎ¸W‰„ËĝġŝJñêRĊ½Ŝ ĞÛ58 ќĈï(żß{!;ĝYŠ ²0ìfMĈžĉÂ˙RNOH÷Óèš­ĥ…KĝBµ­…n4·ÚA9o3jŝµŭf~˜ì6ċmƒg<†äN(…ÍÍ3U(aV1ż-m\Ġœ=‚Áì UTUJ#İ­Ĵì>j ×XĵVŠ!È;Bsƒİ‚cŝ8y*rÄc8şúĠ¤,ÓW÷‚²ÖHë˙+ç‰Wèȟ7À“h ïÏ(ˆEŞRFQKBŸìž`‹wŝs )îUBˆ³ıCĈj·DÔU„ŒmıĤ‹;ĉL ÑQ²=p°ZGކ³AÇctÛÜpĠÊİ9RIœvX‡CŻöÁĘġi‹}ê´ĉ’qçRÉä;ĞOlñĈ €ğ|Ïp(‰vñà şĈ•êĈÇrÇ'a½½BÂdË£„gÀ4úĞEYûV¸uZEÑF[ĠÜUqCĴò~dGĊŒwġ1Ë{à…3u聕;"o‹Ñ¤ÊÂòŻA‹.˜vìöÜJéÍuaĥuyüŒ³]´Ûŭr§*ħÍ}ĨPËÊs$ĠHïŜ†MÉbÀ>Ħè|ÚoO:fŸ­ÏÓŻ-SsP5Îsìġ3KHg¤[P>ŽéŒ‘Îáyáĥ+á[lÍL@Umk¨qÌiuÑQàŽŻ>Hê˙OÒ,’:Ô'üŭ9ÀE£;G:§äêöÔÌsŒ(Èó=›3ĴUÍĝ†ĈSÉÄ1Û1‘Ĵ~ä7wÚ^:û"]V˜ÜĤµfHĉ65 FGÔNPW"^t4J°4e^Q?´›â~H JÉ£ë3:‰0—ÚZeÍTäÁ^RCLÊÎΞ‚$íŠħBó=Wf½yAɤı’÷yBA·ú)ħuĴ żíÄf½kPĦ| ÜŜÂbM[%²Ž0c?\uĈ’ğµż”ĦıGìcNµošş‘/#|ñ|ñ$"ë}ÁӒğáO£7ÇÉzÍI ĥÊ{Ž1ğŒ‰ÓĈ•³³3$,,”ôĦğeµö8´ *?ìħJ8”A )uéÈûĠXao]((žL·ĉE×2dŭY¤­šf+ÒÒ #c?Ċò(b×Òµ˜P+–ÑVıĥİ,‚B j7ÜŞ÷UÛé<ˆÌğÁ4TJö·}ƒĠ y6YYŝô˙,èÓİ0ô}œ=$ħDà<:çd2'aÓìµŞ^e÷†~˜(òğ3£ # àÔ wی÷ċûÇÌßÄ=,]Xk÷ó"ÎlkĈ*‰ş‡¤˜œU† LÎ*$kœµâ΄2ܢUµ‘ù8IŬé"[nRrddáü¨1ò`ÙYÉċĤNŭn/e˜0f¤!m.EçëwWž;™*¤OIíÚıĉ·Ï|&WŽy‡[0ˆœ’ŭċŬE ÷Ù÷ĈM( 1ô56ÄŠ/uàrN[d—?ùîîQ%pv°·ÙìŽ_aŞŒ 3£ĠžÀ_°?k;ħOCŞCK•¤óS­ż‡ŜV wÚâ^ĝ"‹:ÀêjDcÍôb\_ċš™JïuOi*ċxâmD1âĞĴĈh1 ñÎ}âCÄÀjÌٝ˜#zöGX¤ż‚ŽBgŽ2R()ĤµÌ'˙“ĤYĴŜ›ìì\ ħü…ì“l#Ôö¤AßkFë‡ q?̇âVGĉ…Ċ’ÊêâíWİÏ^?òĤİ‘ù2üĊ’ßEKkÌÊqó-RˆC=ŞyïûŝÙbqè5]ésIğ'w%8Kt˙™ôŸš‘š²ÈL·v `‹@¨G[Ĥ_9·†#ôŞĝĉ);œĜ`uidŠÊhBüɨ‘ÏQ ÷!\ĝMu5 KÇ˙}>AžRe+ùÂpdĝ`ÈŻĴœêo˜ˆûTÔ8ïŜ=Ġ_t²Dĥ´„i½•š íÛZCÄċí³•&o _‚ÔıŞ3ߣ;÷9Ò­˜:Ċ“U_Ô3€”I³…1‚ iwy`ŻPoÁ<<ŭa„GöJRN*]QQ\pNaEX†Ŝ2£‡óœì/8rŻç ô²&”“ &^vŬÈIÔàcTĞ]S%Zî{$Ai z&ŞĠıVRceR8›ù}áçr—ĝA~1ÂwU_­zÄ ÷^Ûi!ŭ˜s·Qê|j§œ¤†ŜÚá䈤÷ä3âú–˙7boĞJ˙7˘ _RġlíÒÏÛÑĥԅú·ùú—|ŝ¤€í sıîäהKşwÄXĠÒvCĉZĜ<ÏqġyGŞÍ³·g0KĴšĵĠ:êĜÈf³íäžĵJ˙^ÉĠ³Jô¸‹Kì˘RHqj)œ<ʎJ1| ó,ùÁil£,–`E €ËĴ?5q‘ĴÑbÉn+@ÔÒ2w1Èı&úġBl5nN”ì—-êL) ŬäM÷ îYıh¸¨/eE ÷Rx‘Î@ĤÀ ĴéšCF´Ù§Ûpu§ŬĜĞn†vLWm-Y™ë²€rœ~1ĝTmNpߍ|}¸ÑĤHhtÊXÀéeɗ²ĉÚàœÄ 1ĥĉiS’ÂŬFZÑŜÒ ÜĊ ÄĊzïñŒ û ŭ8ÔnŭE6Ä핢8‡ndÑùre87FdTĵ _†A›4vAì/Êĥ²oġ£oŽˆ×SPy‘ĜPh–˘#·`9€ÀWPğa)=‹sEG}£ĊÁ%>ĝhƒuguvj$Qğ‡ 3!\?•ŠDô§&˜Äs—£Ÿ&€]ĜĞġ­ÓöĠĤ` ¤ĉu[V÷é`‹Êž‘`ä^3Œò8¤˘ 5 Ï6lċäĴdßí8\˘x™û“…ĝÁ€Èډ˜'W+6 İ˙m‡ĦÉi<³·ċ4*ˆíhƒ`û”wàc}eòÄ}“òž¨Swŝ”ÌßJTXÄ[0ƒ;†Ĵèô¸ĵŻ4ˆŒĉ<ĝjċâo^ì3ƒŭ32—™²41żm€A„€<ŭk–†LTFòhzöä fĉ)šÒ%"ïĞŭ“S@\ñP^·\0v˜í“è‡qMUjÊâ\(ÛòœM:!âÀ¨À~râzĵ³p´k$#˜Êñ—<ôa·á”A]À5úM÷Ĝ€:˘ÍHÎ˙u•sĴ:aeŒ¤ö`„Ĉcğ.<Ċ ›šËıvóĜK]ĈÂĞ{‹ìĥ¸3…m]Ĉż™SáÇ‹%êŜ ‰%‘$Ç+wħ‰•;Më.ĝĠÓé!h‡¤#œ>1OĊcıâÂ?*„{`Ú­ŞĦ\ŒZ‰#ssTJ°’ ¤^IĜRKùƒ÷,ÌCDò@müéYİ`íħ DàĴ´Îk”ŝA—„Ĥ@ĥÂè›Ôžt"‹ŭ•ÊĵŬy†út}*ŝÏö}¸ßF = í}§MğjeRe×Zá‹•ñĴġ4Ĵ¸ĦívHµŬ{ü(˘ĊŸdħK4%ëíŝÇMŒ óX.üÑĦıöz‘5~ÊnH˗Cñ*“ô>ŒÊ£ö4‰ĊÇí³_Šk`ĉ`,Ş`À>ħ%aoüS;Cżvëjݍg‹‰)Ġf&֋cĞDî,‹ÏĦ}ÄZ‰*jŽaĞŞ`ĵTĝ™PFŽÉ[!˜WşÜ³J¸šáĥ´Ïl4$û\œi£áMïpi³ì …ÛçħÜ*JĈ_ĝ‡F‡o+L:CŠu‡ÌIÎ]i’ÎÎFue!äOŠÇ€@g11j£xÓ;F1Âü4oş·rI v@o×$À_IZ+Kú$˜Ôœ™ßZ›7îċâċ’*C”k.œ6şÊ´db=ƒòà‰0׌c˜˙9µó0sÀ<÷Xé“WV“ċĦM” ¨ĥÉ7„$ô‚k$•wûU:?yòKCáN²;e}š˙{Üo‘UgŞ^@}2fŠ·dÔföNb¨x/½ş&BŠFra!s8_ Ûô:Üí¤'XÈ™ĥx‹ë rĞŸ}ĊĊÏ£ŻĦJ" êħN^ö16uÑ$ÛİùgZÂó8?ĉ­˙LëK¨kl`|”×0@1ġ;! K:ŸëéH?˘ê²“ËÍ×ÎÑÔ|NşPĥàŜy_r.KĤ-áĊÔáRÑge˘ž§Ż›5 ‘¨D÷3Ѹë‹yĞPĜä:˘ Û_ I.Ù-“ Ĵ14ÏâîäòĤ~kmħ×ÙT3nTe—oĵ[£ŞzGÉy§ñüĊE|Ökû`!)Şê˜Ét€NVÎ"eŞpŬ³3‰ùĵ?ö"sĞò:wç Ĉ„ Fşġ!c´oeEqĥŞcšEżgçó^Ïĵ·Ħ$¨ é<§*-Šcꂤ„^F˙{ĵ*IKGŬ÷Ò5rû[TÊè3~£Ä@Ìê—_. \î Ğ” )5ĈŽÙ³ŭû&X³y&Ĝ#²ÈMq# É¤ÑĴfèŭ™˙,­ġ5×żÒ9ÔcÔPò:=7nĠŜÊŝçnjÎH˙!ÙzŬ¤”q şĤ<‰ž!”ċWk( …N‚âĵƒqFżv˘½Ik=·mÒġ™·Ëfe¤~ ^ġ[‰¸ìŭÂ3Ë\M'líP9U×e†ÎT°Lƒ l |qġ¨ç”ĉ·8›À´A—ŭ§*Xî˙eç Ĥ=˘.N=ÊÎ˙ƒñ‰ĝ…Œúo4Ŝ£ârÖ}Ŝ <#X+á/òW¨ è2` $êÈÀ6ù…§À´·OÏ8˜żŠ8{ĵ rWß<'á‚Ö.K„‹ÛF²ġî !ÚZëww .…BÍP|Ĉ)#bÍ 7A:îŝƒL{èµË ™MbEŻŞQ.RÇ o— dJ ó€@LÚvÛ=€ç‘èÖl–˜‚ôÚçñg Úa²á -0w‚ĉÛħ²Ġn’á|mB ‘=Ca:ħÜe˘-2y{M56XıtùTL=Ż/â{ŭbÌĴúu“?3>·$ßÑ{‘z§eÊKˆW‚‹[]Ì{]ïÔCx˘[ĥ?˙yµ°œÑhˆLTOħ(m°ë­Ü²CŻŞê”Š<ǢĤÛYi7h\é`•_ŞßaeúÂ*~&šŬşj7”{/ŝXÌj ­ï>À<çÁ ~—÷‡' ›v 9sĠü>9ĞûLïñËá‰,ëwáDĊDY@ġ•bGÄtÇä |¨êrÍĉüĜwĵ~e'Gż”zçRR'yž—Kh ——]@Ŝ†Sî1‘?ĝ‰ƒŻq;ÛĈ^ ħ“ù(¨£|¸Ë #Ò w—,ö’”mÖ6ÑkŒnÏÉŜCJżcO˘Iµ‘µ5Š Ì7`àÛùqRğqHu;_ӑ2D%^1šeêH)eġĞ NVċŒ’ñđä–@J²9>ö“ߪ•Isb{;´ž<²S`bS‹Id|Üuüó8݇ ï#Ş ħàt:½ Y=ĉÈ €X!_£“Ċ5q=òte5ı ĥƒUE]­ıÍЇCÀ= •ĵ½ü ύ:QP•tÔx£äĊ¨üĵíöOm5d‰clEÜ"úOmÛié_ê³ùFÊŞÑZŠÑ’M]Ÿ8bäĤ€’!¨:÷%:²^QĴĠĊCL"R'yİ oËÚGBÜÒÛôœÌŽêĦ•ÑD˘ö˜ç_υχ'QgL £mÜ[}q[BÒĝî¤{˘Ÿòñ7ä%@rİ@˜ 䏇ĦùüV ïöÏżĤ]ÑÎ\í¨z\J3 Ĝbp1œN úċr\.żż"݆ÓôùxÛ³ 4ŭö“Ÿ#(0İû@ħmĊÖ%(§XN$àJŠa4KêŒï'€cSéHĵ_ċ7ĤŭÈefİQ—gċ1ÔĈşYJ—•Ĵû-·-|†İ öÏċc%÷í0 #v×ó°ì ó%“b_­/§ġ‘Ô˘#hw_ż‘ˆF¸Yí+GŒ›}Ĉ4aä{ ‹XU– Pقò‘Í8IĦk–6,_˙zÄfuġjEĠ‰ĉr‚7#]SÂc Óŭ€?˙ì;µâM?†€˜Ò;Yó8“¸Vş€ĥ.–=ÇĠ³KB…8'šyzşôëItI–³ĵfs˙=9ü)ó-ŭíçyL•½çíF}CT n˘k£ĥ¨nŭÔ=‰@wóSñÉkq݆³ ˙SR’™÷ùŒ£MÌw7+Q™7` •ĞÁÉUı+>fmdÉÎÄŞÀêJómĦXwem2î&ÓAûĜ^ŽSyH †EV›f<Ğ8ĝ “}ŸB"~[´äÌF ŭT¸ġġ*6nmşú‡M]ò•*tíEŜè!™*W9¸ËĠüµ²÷B;ĵĉê­LK„žzR:xàìÖ%ɘÒ&°;4q½-Ĉ5żèBùÙ&ĤyñêvTWì°hĜCĥóÌ^§yôXş#úoœéj8JzKQ>¤İpoŜ­>ëÂÚL’1ïŸÜşsLÖĝ^Ĥ\ċ%uEûîßÔ×´ħŜ1Ġl&äT+ûĜjġLnzF÷ù şé6ĝK| …+Eó07ħÙk* §‡*r0Ğŝ E[ċ², _Ŝ‰ïzıÂ睇zŸ>°êJ­c6àğ şyXĉ.âËN° `öĊrgÙ=ŸKß BƒB™\”~_;ċÈ vëR¨b´ûôż˙˜ú Ğ•ÂD,ü%8O2”’ÄGBŝQ}6_Yż¸‰Ä¸HK‘?ƒT¸’@xö˘ÀíU!žèş4ĴyV˙ Š UN˘U^;pbÇÀBïƒsÒŞJĤŠ=Êö 6=rxqn# d@µAp zżQcV+Û§ĥr,ö#“çä#°ĥ›ï¨6˙C'ó˘™6¸Żqlż&Ĵeñ@5d˙LïÒ^@Şçqí“rK@‡hŽüğ×D_ úX4gç‰6I·V?„É/ñÖS7şÇvI|Q‰Äéàñê‰ËRn‚xµQ;E| +ŒĉĜù–}߉ßoŸ‹WġÜ8ŝŽO:@` –ħIğ'VSÎ˙û——ΗÌ@Â4X)ÖÄÈ!'è‚~Ċ=+ĜY(A‚ dy8ĝ2Ÿiĝ•Šß޸=+@ùÓVĴˆÊYĥ_¨lkkEß6XtÀF*‘ÈĉĈš“ I „ş,t˙)ÇpCÜb:m–_,gu$Àe£Ĉ^N›2-j;o:—KPVĝ}8úĠ5Ó;ü™îx8xˆ<â /“aMNvX—Jì}Fë{]ÍÊRC_oŒüÓ`dQÑ·"Ŝ~˜÷Ù(ż¤ŭO•ŭKefQŽ;?şuSO§„îë D˘9aȕ<ŜáA0ĤMĊĴĝë‚]ÉQ–PŭขݧTô~pèŞûŽ" ’0,­²½ĜŞlIZjN"ìŞÛ ½AġOĠµ’[ֈġcT /ħìîOPw‰AÑ-9 Ò2Ĵ°w§ˆ’k 7D€ä#Ċ÷Ûİ1Oû\ù•HĝG]`²bwK˜$%ˆğ:Ħ=™Ŭ™܋Lyo›ĉùo›ĉùom,Ġ&Ž{ ÛŻ›ß…:s÷-úMĴz+² –†!á1·[­­„’ċʅGg¨4'‘Sš‡WьpP wğ-"|€Ĝğ…je”ñ°oߓwóa)oáFġ†j9oÍ1=ĤqĊĜĵ­~ĝŞn›˙$O‰›ueèâÀóÙÖJìħ>1ËÍ 8Œ7Ÿ_üıž˙;Ö۝ÉmóPÓŻœ!<ŬwñŻ’KĈèÙsÀ­WŻ!+yŞï`FŻ^…| zŠîèÁŒt‘Ŝi‹^o+ /eŞ!ĉàĵhDĤ*ï{~ßTLK˃âêßW%—7×u{¤)|!ä Nw“ÍĝşJ×Y Y7Nï}U<Š5a Ċ°ÛíbYJ§ċ |™d°eCì…héWÉ@$$›ĉ›¨|D ZÜ÷<ĴpĈ;ËfĈ!sċĤv#q,8Yƒ0n4¨fS˙jĉCHĤHH|X²• Çmz91w},„P ¨úP‘Ŭ€X˘‘ùNëéĈ£Á<<Âŝĝ‡ ´Œz½;Z˘<*8ÑL×[^6W³·œ N|ŽgïbêzyBꃁ™SWÊċ‚OF£TE³Ú­nhsoSÎ\ ,d.¤Žğx}Šy£^ˆ›ġ ğċ‰h9n EĠĊRôʍtÒ‚Ì&zRÙƒï`ĝNT.‰7*öEÁÊêsè.ÛĊüNƒĦFÑğäd0@ĵ Ù.ÚËpŜ˙Mĉ5ġŝ8&ôl|X7³R@öħV`F›z†m(nñöc˙:İ[)Àà·¤÷’8 k}ş€D%Ö£b§ĵJ>6\ħ*còƒufġ!*³ÇċÂ#Ŝ°O3·ês‘ Ĵb[wN ]GrĠĠ€Mşf KG=­ĴÜJùÀLfq+ġs*ĠżOÈ£Ò·à+ŠVÚÛĵâKùoS‘[ŒÁĦ£ÉùF@Tà£Ó6˜ÁESƒŜƒzQûÁŒQfÑ#„­5ÉZŝQ$,p† ~^0“òs ĈÔğ›ħsşü³k2p â+ñQ@#í…pĵ˘¸ŜC’ġË'˙:ÇüÙ5µÀ@pÁPúrĈ›p£ÜG`Òíş°6Ž}÷bĵ#ĵ_ğ2ñ(żŭœĝĠCòxĝp„Ŭ§˙œÀƒ­šâ" Ñ%n7mûú`él~ğ™²W\xŸËš U Ĥùo&zo#ŝöoÈA!ô"Dí‚á*‰ój(×°ĵÒ\p?ĴF#.'́ÂPŽMŝIpĉhúEvßJĥ÷Vҁâğy†Â?0ɎW7Ğ’˙˙p÷ğžlxµß'™ÚTB~•—½MŜÓ*^Ñú„9RœYaÍ%^wĜ2ǵj2sôӜÎĥ…ŝ•ìW”l–svÏIו´2î5ŠŝĜÑzYžž÷CŜ.rS–KôĤúʘP9{}– żËî1šCw~ ÄNP¤[@6&÷I–p>8ĜY—f†oJdö7ZVÔL€úL>uÊñgġIi!q`›İ”€Ï'§³j?à™bÇ ÊĝPj†îŸž{|€•-RG;â,A7•ż²Š‹Gú9Œdĵ} Ëŭ{Lŭ Cîye<ƒşžġò’çßîŻNpà>r…F(N“DònğÙ:²H+™Ĵ —Zuu$·†éĠióĉy‰ĠyC•‘Ôh†êĈ^›½ŭĦ´ÙI‘7ñıßLµğèZ—ħΔ"]°x”üµè£9ßĊEž Ğ`Rĥ¨›‚Ê zÍzˉµ#{x¸½T‚oĈ~&×Îö4ċ!àĦYÔÉ çoëk~CaŒÌWGÁ?b†2­ğżŻ°LÁ› íGÓ?)™Hé9ßÇ,l:1„L0²àtµäĞß̑Z²ÙZù´öñİaç§z€ż'1+ÓÇĉòŸżÄ¨ü´œ’ŝ Żts¨˘Y8?ï"o7e‰§²{ĥqûì½ĤŸ>¸öħ‡Š³›FŒ(½İçۏc‡qŒŸŜ3š›Ŝ#;ùîmL$Á֍ùċËŬÏ˙N ,×-*ƒŬĝ^(ïŠd$;Ë@üÚìNĤÚìĜ#Ö/̨„‡¤Tu’àÊy$@qk­=s§ŜXŬ^â}f’ÈĞçGHAohÎx>(0×â{Œ‰µ@b0 wŽÂ$ñѽ4?šEòyÏC&ƒ˙kihĊ˘¤€›ÒĊ2Ê£…*žjPs™éƒIÖhtYú“î½)ĦÓ¤3›Ĝ~§reèĝĦ8ˆnÊcƒĦ à Zî˙!‚ͧ“Zö~2žGĤƒP˘i+¤"–{JCfQïĤ† !f ‚ŽíÍH|LTQÓ¤ÛmoœÜ‚-ùŭY^>‹êO3STވËZÏĦ^5İ›5à½qŽżŸĦËĈ”X?Zü·´Ġ²[•×ġ0Ĵ)cŠĤÉa:=²hr⊨(˜ĥ[báè²ËYçĜÊùóV¸‚“?a'ŻhEa¤îoÇ­eÛ@÷û&‰ò>Ik†sÛ§‘àż 4nQ™Ë- ŸHċ?NŸôG!óbòüĥk÷ċqö°kĥÛy†9ǨÇà˙Ri2LéÇv{­c•OòÜ4ê&Š ŬHñ=ĝ Ĵ>0yÛ̑ ïcİm×ċ蓁šfN‡HÊ,Ä9@pì!êr˜<ĉ*…Ġ^ÈMşš“ĈĞçÇĈçÊÔ?`f×·8÷@nƒŝ×Q–ŸtHöçVŝĉIJĴğЁĈ ^hŜ"D ŽNOİ›À6MÌÎbú3ħ}ŭċċv_˙|GĦžbíËŝĠ } 8½ֆlıñlbv @#ĥ^›`Ô\–Á³œ§úQ8€ëHm{ğ} ôüƒĤ„ 4*ŭ:Œ™aîNôJ;uĥĦëⴕȉÀö4*ŠZċÑ Pë˘ñXL].L2%Ĉ¨Ú˘ËÄĉÒjX’ȃħR5Ĥ• YKwn‰oĤÂUìÜW}aJ“¤Gğ·œċ8„xċ•×=ËŸD" Rœ0%äˆtÍ^}u9*1½²4óŻéèŭöï>Ûj³ôsî„êiĠŒwJl™ĝ‘³c/$$­€wŞünĠT;B™’҄Ĉ“1e9p9ìĉ3/àék2‹8Ğ2>~QïĞpáġŠgÓçÜkĝXhÙ£Ĵ‡£²I>ġ<–ÚK/=PÚçbF×UMĴͤ7Ì÷T{êlân Ŭ)pqTÈȋ<éÛ)\g“ŬôŸav¸B°Kù˜q.c$Òi,ém.-´ğżd5ĴNúâ‰ı 3Aâ‚s¸8|ÀğP…:*˜ÉÉFĴƒïM06x×$viŒ$aŜ.<§ú*>H—3-¸Ġt&°tÔlš§Bħħ\ċ éġ<î_;hSñġ2‰…‡âW…•ߪ(Û3?ÀÄ£}ôââ} ÀÏğ]﭅÷ĉCĈFg ĵYfÖĉQ äv$œ1y&*MbÜ0=ßہêqÇŜ˙ÙicnV Bŝffdesmume-0.9.11/src/cocoa/DefaultKeyMappings.plist0000755000000000000000000004672212467662066020460 0ustar rootroot CommandTagList Up Down Left Right A B X Y L R Start Select Touch Microphone Lid Debug Guitar Grip: Green Guitar Grip: Red Guitar Grip: Yellow Guitar Grip: Blue Piano: C Piano: C# Piano: D Piano: D# Piano: E Piano: F Piano: F# Piano: G Piano: G# Piano: A Piano: A# Piano: B Piano: High C Paddle Autohold - Set Autohold - Clear Execute/Pause Frame Advance Frame Jump Reset Mute/Unmute Load State Slot Save State Slot Copy Screen Rotate Display Left Rotate Display Right Toggle All Displays Set Speed Enable/Disable Speed Limiter Enable/Disable Auto Frame Skip Enable/Disable Cheats Enable/Disable GPU State DefaultInputProfiles Name Default IsDefaultType Mappings Up deviceInfoSummary Keyboard: Up Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 126 elementName Up Arrow intValue1 Down deviceInfoSummary Keyboard: Down Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 125 elementName Down Arrow intValue1 Left deviceInfoSummary Keyboard: Left Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 123 elementName Left Arrow intValue1 Right deviceInfoSummary Keyboard: Right Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 124 elementName Right Arrow intValue1 A deviceInfoSummary Keyboard: X deviceCode NSEventKeyboard deviceName Keyboard elementCode 7 elementName X intValue1 B deviceInfoSummary Keyboard: Z deviceCode NSEventKeyboard deviceName Keyboard elementCode 6 elementName Z intValue1 X deviceInfoSummary Keyboard: S deviceCode NSEventKeyboard deviceName Keyboard elementCode 1 elementName S intValue1 Y deviceInfoSummary Keyboard: A deviceCode NSEventKeyboard deviceName Keyboard elementCode 0 elementName A intValue1 L deviceInfoSummary Keyboard: Q deviceCode NSEventKeyboard deviceName Keyboard elementCode 12 elementName Q intValue1 R deviceInfoSummary Keyboard: W deviceCode NSEventKeyboard deviceName Keyboard elementCode 13 elementName W intValue1 Start deviceInfoSummary Keyboard: Return deviceCode NSEventKeyboard deviceName Keyboard elementCode 36 elementName Return intValue1 Select deviceInfoSummary Keyboard: Tab deviceCode NSEventKeyboard deviceName Keyboard elementCode 48 elementName Tab intValue1 Touch deviceInfoSummary Mouse: Primary Button deviceCode NSEventMouse deviceName Mouse elementCode 0 elementName Primary Button inputSettingsSummary Use Device Coordinates useInputForIntCoord Microphone deviceInfoSummary Keyboard: ` (Accent) deviceCode NSEventKeyboard deviceName Keyboard elementCode 50 elementName ` (Accent) inputSettingsSummary Internal Noise Samples intValue1 1 floatValue0 250 Lid deviceInfoSummary Keyboard: Delete (Backspace) deviceCode NSEventKeyboard deviceName Keyboard elementCode 51 elementName Delete (Backspace) Debug Guitar Grip: Green deviceInfoSummary Keyboard: E deviceCode NSEventKeyboard deviceName Keyboard elementCode 14 elementName E Guitar Grip: Red deviceInfoSummary Keyboard: R deviceCode NSEventKeyboard deviceName Keyboard elementCode 15 elementName R Guitar Grip: Yellow deviceInfoSummary Keyboard: T deviceCode NSEventKeyboard deviceName Keyboard elementCode 17 elementName T Guitar Grip: Blue deviceInfoSummary Keyboard: Y deviceCode NSEventKeyboard deviceName Keyboard elementCode 16 elementName Y Piano: C deviceInfoSummary Keyboard: C deviceCode NSEventKeyboard deviceName Keyboard elementCode 8 elementName C Piano: C# deviceInfoSummary Keyboard: F deviceCode NSEventKeyboard deviceName Keyboard elementCode 3 elementName F Piano: D deviceInfoSummary Keyboard: V deviceCode NSEventKeyboard deviceName Keyboard elementCode 9 elementName V Piano: D# deviceInfoSummary Keyboard: G deviceCode NSEventKeyboard deviceName Keyboard elementCode 5 elementName G Piano: E deviceInfoSummary Keyboard: B deviceCode NSEventKeyboard deviceName Keyboard elementCode 11 elementName B Piano: F deviceInfoSummary Keyboard: N deviceCode NSEventKeyboard deviceName Keyboard elementCode 45 elementName N Piano: F# deviceInfoSummary Keyboard: J deviceCode NSEventKeyboard deviceName Keyboard elementCode 38 elementName J Piano: G deviceInfoSummary Keyboard: M deviceCode NSEventKeyboard deviceName Keyboard elementCode 46 elementName M Piano: G# deviceInfoSummary Keyboard: K deviceCode NSEventKeyboard deviceName Keyboard elementCode 40 elementName K Piano: A deviceInfoSummary Keyboard: , (Comma) deviceCode NSEventKeyboard deviceName Keyboard elementCode 43 elementName , (Comma) Piano: A# deviceInfoSummary Keyboard: L deviceCode NSEventKeyboard deviceName Keyboard elementCode 37 elementName L Piano: B deviceInfoSummary Keyboard: . (Period) deviceCode NSEventKeyboard deviceName Keyboard elementCode 47 elementName . (Period) Piano: High C deviceInfoSummary Keyboard: / deviceCode NSEventKeyboard deviceName Keyboard elementCode 44 elementName / Paddle deviceInfoSummary Keyboard: O deviceCode NSEventKeyboard deviceName Keyboard elementCode 31 elementName O isInputAnalog inputSettingsSummary Paddle Adjust: -5 intValue1 -5 deviceInfoSummary Keyboard: P deviceCode NSEventKeyboard deviceName Keyboard elementCode 35 elementName P isInputAnalog inputSettingsSummary Paddle Adjust: +5 intValue1 5 Autohold - Set Autohold - Clear HUD deviceInfoSummary Keyboard: H deviceCode NSEventKeyboard deviceName Keyboard elementCode 4 elementName H Execute/Pause deviceInfoSummary Keyboard: Forward Delete deviceCode NSEventKeyboard deviceName Keyboard elementCode 117 elementName Forward Delete Frame Advance Frame Jump Reset deviceInfoSummary Keyboard: Page Down deviceCode NSEventKeyboard deviceName Keyboard elementCode 121 elementName Page Down Mute/Unmute Load State Slot Save State Slot Copy Screen Rotate Display Left deviceInfoSummary Keyboard: [ deviceCode NSEventKeyboard deviceName Keyboard elementCode 33 elementName [ intValue0 -90 Rotate Display Right deviceInfoSummary Keyboard: ] deviceCode NSEventKeyboard deviceName Keyboard elementCode 30 elementName ] intValue0 90 Toggle All Displays Set Speed deviceInfoSummary Keyboard: - (Dash) deviceCode NSEventKeyboard deviceName Keyboard elementCode 27 elementName - (Dash) inputSettingsSummary 0.50x Speed floatValue0 0.5 deviceInfoSummary Keyboard: = deviceCode NSEventKeyboard deviceName Keyboard elementCode 24 elementName = inputSettingsSummary 2.00x Speed floatValue0 2 Enable/Disable Speed Limiter Enable/Disable Auto Frame Skip Enable/Disable Cheats Enable/Disable GPU State desmume-0.9.11/src/cocoa/cocoa_file.h0000755000000000000000000000722612467662066016077 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif @interface CocoaDSFile : NSDocument { } + (NSMutableDictionary *) URLDictionary; + (void) addURLToURLDictionary:(NSURL *)theURL groupKey:(NSString *)groupKey fileKind:(NSString *)fileKind; + (void) removeURLFromURLDictionaryByGroupKey:(NSString *)groupKey fileKind:(NSString *)fileKind; + (BOOL) loadState:(NSURL *)saveStateURL; + (BOOL) saveState:(NSURL *)saveStateURL; + (BOOL) loadRom:(NSURL *)romURL; + (BOOL) loadReplay:(NSURL *)replayURL; + (BOOL) importRomSave:(NSURL *)romSaveURL; + (BOOL) exportRomSaveToURL:(NSURL *)destinationURL romSaveURL:(NSURL *)romSaveURL fileType:(NSInteger)fileTypeID; + (NSURL *) romSaveURLFromRomURL:(NSURL *)romURL; + (NSURL *) cheatsURLFromRomURL:(NSURL *)romURL; + (BOOL) romSaveExists:(NSURL *)romURL; + (BOOL) romSaveExistsWithRom:(NSURL *)romURL; + (void) setupAllFilePaths; + (void) setupAllFilePathsWithURLDictionary:(NSString *)URLDictionaryKey; + (void) setupAllFilePathsForVersion:(NSString *)versionString port:(NSString *)portString; + (BOOL) setupAllAppDirectories; + (NSURL *) saveStateURL; + (BOOL) saveScreenshot:(NSURL *)fileURL bitmapData:(NSBitmapImageRep *)bitmapImageRep fileType:(NSBitmapImageFileType)fileType; + (BOOL) isFileKindWithRom:(NSString *)fileKind; + (BOOL) isFileKindWithRom:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (BOOL) saveStateExistsForSlot:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber; + (BOOL) isSaveStateSlotExtension:(NSString *)extension; + (NSString *) saveSlotFileName:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber; + (NSString *) fileKindByURL:(NSURL *)fileURL; + (NSString *) fileKindByURL:(NSURL *)fileURL version:(NSString *)versionString port:(NSString *)portString; + (NSString *) fileVersionByURL:(NSURL *)fileURL; + (BOOL) fileExistsForCurrent:(NSURL *)fileURL; + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind; + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (NSString *) fileExtensionByKind:(NSString *)fileKind; + (NSString *) fileExtensionByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (NSURL *) directoryURLByKind:(NSString *)fileKind; + (NSURL *) directoryURLByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (NSURL *) userAppSupportBaseURL; + (NSURL *) userAppSupportURL:(NSString *)directoryName version:(NSString *)versionString; + (BOOL) createUserAppSupportDirectory:(NSString *)directoryName; + (NSURL *) lastLoadedRomURL; #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 + (BOOL) moveFileToCurrentDirectory:(NSURL *)fileURL; + (BOOL) copyFileToCurrentDirectory:(NSURL *)fileURL; + (NSMutableArray *) appFileList:(NSURL *)directoryURL; + (NSMutableArray *) appFileList:(NSURL *)directoryURL fileKind:(NSString *)theFileKind; #endif @end desmume-0.9.11/src/cocoa/cocoa_cheat.h0000755000000000000000000001351312467662066016240 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #undef BOOL class CHEATS; class CHEATS_LIST; class CHEATSEARCH; /******************************************************************************************** CocoaDSCheatItem - OBJECTIVE-C CLASS This is an Objective-C wrapper class for DeSmuME's cheat item struct. The cheat item data is not freed upon release of this object. This is by design. Thread Safety: Assume that all methods are not thread-safe. This was done for performance reasons. The caller of this class' methods is expected to handle thread safety. ********************************************************************************************/ @interface CocoaDSCheatItem : NSObject { CHEATS_LIST *data; CHEATS_LIST *internalData; BOOL willAdd; pthread_mutex_t mutexData; CocoaDSCheatItem *workingCopy; CocoaDSCheatItem *parent; } @property (assign) CHEATS_LIST *data; @property (assign) BOOL willAdd; @property (assign, nonatomic) BOOL enabled; @property (assign, nonatomic) NSInteger cheatType; @property (assign, nonatomic) NSImage *cheatTypeIcon; @property (assign, nonatomic) BOOL isSupportedCheatType; @property (assign, nonatomic) NSInteger freezeType; @property (assign, nonatomic) NSString *description; @property (assign, nonatomic) NSUInteger codeCount; @property (assign, nonatomic) NSString *code; @property (assign, nonatomic) UInt8 bytes; @property (assign, nonatomic) UInt32 memAddress; @property (assign, nonatomic) NSString *memAddressString; @property (assign, nonatomic) NSString *memAddressSixDigitString; @property (assign, nonatomic) SInt64 value; @property (readonly) CocoaDSCheatItem *workingCopy; @property (assign) CocoaDSCheatItem *parent; - (id) initWithCheatData:(CHEATS_LIST *)cheatData; - (BOOL) retainData; - (char *) descriptionCString; - (void) update; - (CocoaDSCheatItem *) createWorkingCopy; - (void) destroyWorkingCopy; - (void) mergeFromWorkingCopy; - (void) mergeToParent; - (void) setDataWithDictionary:(NSDictionary *)dataDict; - (NSDictionary *) dataDictionary; + (void) setIconInternalCheat:(NSImage *)iconImage; + (NSImage *) iconInternalCheat; + (void) setIconActionReplay:(NSImage *)iconImage; + (NSImage *) iconActionReplay; + (void) setIconCodeBreaker:(NSImage *)iconImage; + (NSImage *) iconCodeBreaker; @end /******************************************************************************************** CocoaDSCheatManager - OBJECTIVE-C CLASS This is an Objective-C wrapper class for DeSmuME's cheat list class. Thread Safety: All methods are thread-safe. ********************************************************************************************/ @interface CocoaDSCheatManager : NSObject { CHEATS *listData; NSMutableArray *list; pthread_rwlock_t *rwlockCoreExecute; BOOL isUsingDummyRWlock; NSUInteger untitledCount; NSString *dbTitle; NSString *dbDate; } @property (readonly) CHEATS *listData; @property (readonly) NSMutableArray *list; @property (assign) pthread_rwlock_t *rwlockCoreExecute; @property (assign) NSUInteger untitledCount; @property (copy) NSString *dbTitle; @property (copy) NSString *dbDate; - (id) initWithFileURL:(NSURL *)fileURL; - (id) initWithListData:(CHEATS *)cheatList; - (id) initWithFileURL:(NSURL *)fileURL listData:(CHEATS *)cheatList; - (BOOL) add:(CocoaDSCheatItem *)cheatItem; - (void) remove:(CocoaDSCheatItem *)cheatItem; - (BOOL) update:(CocoaDSCheatItem *)cheatItem; - (BOOL) save; - (NSUInteger) activeCount; - (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error; - (void) applyInternalCheat:(CocoaDSCheatItem *)cheatItem; + (void) setMasterCheatList:(CocoaDSCheatManager *)cheatListManager; + (void) applyInternalCheatWithItem:(CocoaDSCheatItem *)cheatItem; + (void) applyInternalCheatWithAddress:(UInt32)address value:(UInt32)value bytes:(NSUInteger)bytes; + (NSMutableArray *) cheatListWithListObject:(CHEATS *)cheatList; + (NSMutableArray *) cheatListWithItemStructArray:(CHEATS_LIST *)cheatItemArray count:(NSUInteger)itemCount; + (NSMutableDictionary *) cheatItemWithType:(NSInteger)cheatTypeID description:(NSString *)description; @end @interface CocoaDSCheatSearch : NSObject { CHEATSEARCH *listData; NSMutableArray *addressList; pthread_rwlock_t *rwlockCoreExecute; BOOL isUsingDummyRWlock; NSUInteger searchCount; } @property (readonly) CHEATSEARCH *listData; @property (readonly) NSMutableArray *addressList; @property (assign) pthread_rwlock_t *rwlockCoreExecute; @property (readonly) NSUInteger searchCount; - (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType; - (void) runExactValueSearchOnThread:(id)object; - (NSUInteger) runComparativeSearch:(NSInteger)typeID byteSize:(UInt8)byteSize signType:(NSInteger)signType; - (void) runComparativeSearchOnThread:(id)object; - (void) reset; + (NSMutableArray *) addressListWithListObject:(CHEATSEARCH *)addressList maxItems:(NSUInteger)maxItemCount; @end @interface CocoaDSCheatSearchParams : NSObject { NSInteger comparativeSearchType; NSInteger value; UInt8 byteSize; NSInteger signType; } @property (assign) NSInteger comparativeSearchType; @property (assign) NSInteger value; @property (assign) UInt8 byteSize; @property (assign) NSInteger signType; @end desmume-0.9.11/src/cocoa/cocoa_util.mm0000755000000000000000000002224412467662066016314 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_util.h" #import "cocoa_globals.h" #import "types.h" #import #include #include #include "../version.h" #undef BOOL @implementation CocoaDSUtil static NSDate *distantFutureDate = [[NSDate distantFuture] retain]; + (void) messageSendOneWay:(NSPort *)sendPort msgID:(NSInteger)msgID { if (sendPort == nil || ![sendPort isValid]) { return; } NSPortMessage *message = [[NSPortMessage alloc] initWithSendPort:sendPort receivePort:nil components:nil]; [message setMsgid:msgID]; [message sendBeforeDate:distantFutureDate]; [message release]; } + (void) messageSendOneWayWithMessageComponents:(NSPort *)sendPort msgID:(NSInteger)msgID array:(NSArray *)msgDataArray { if (sendPort == nil || ![sendPort isValid]) { return; } NSPortMessage *message = [[NSPortMessage alloc] initWithSendPort:sendPort receivePort:nil components:msgDataArray]; [message setMsgid:msgID]; [message sendBeforeDate:distantFutureDate]; [message release]; } + (void) messageSendOneWayWithData:(NSPort *)sendPort msgID:(NSInteger)msgID data:(NSData *)msgData { if (sendPort == nil || ![sendPort isValid]) { return; } NSArray *messageComponents = [[NSArray alloc] initWithObjects:msgData, nil]; [CocoaDSUtil messageSendOneWayWithMessageComponents:sendPort msgID:msgID array:messageComponents]; [messageComponents release]; } + (void) messageSendOneWayWithInteger:(NSPort *)sendPort msgID:(NSInteger)msgID integerValue:(NSInteger)integerValue { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&integerValue length:sizeof(NSInteger)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (void) messageSendOneWayWithFloat:(NSPort *)sendPort msgID:(NSInteger)msgID floatValue:(float)floatValue { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&floatValue length:sizeof(float)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (void) messageSendOneWayWithBool:(NSPort *)sendPort msgID:(NSInteger)msgID boolValue:(BOOL)boolValue { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&boolValue length:sizeof(BOOL)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (void) messageSendOneWayWithRect:(NSPort *)sendPort msgID:(NSInteger)msgID rect:(NSRect)rect { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&rect length:sizeof(NSRect)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (NSInteger) getIBActionSenderTag:(id)sender { NSInteger senderTag = 0; if ([sender isKindOfClass:[NSButton class]]) { senderTag = [sender tag]; } else if ([sender respondsToSelector:@selector(selectedCell)]) { senderTag = [[sender selectedCell] tag]; } else if ([sender respondsToSelector:@selector(tag)]) { senderTag = [sender tag]; } return senderTag; } + (BOOL) getIBActionSenderButtonStateBool:(id)sender { BOOL theState = NO; NSInteger buttonState = NSOffState; if ([sender respondsToSelector:@selector(state)]) { buttonState = [sender state]; } if (buttonState == NSOnState) { theState = YES; } return theState; } + (void) quickDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText { NSRunAlertPanel(titleText, messageText, nil, nil, nil); } + (BOOL) quickYesNoDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText { return NSRunAlertPanel(titleText, messageText, NSLocalizedString(@"Yes", nil), NSLocalizedString(@"No", nil), nil) != 0; } + (NSInteger) appVersionNumeric { return (NSInteger)EMU_DESMUME_VERSION_NUMERIC(); } + (NSString *) appInternalVersionString { return [NSString stringWithCString:EMU_DESMUME_VERSION_STRING() encoding:NSUTF8StringEncoding]; } + (NSString *) appInternalNameAndVersionString { return [NSString stringWithCString:EMU_DESMUME_NAME_AND_VERSION() encoding:NSUTF8StringEncoding]; } + (NSString *) appCompilerDetailString { return [NSString stringWithCString:EMU_DESMUME_COMPILER_DETAIL() encoding:NSUTF8StringEncoding]; } + (NSString *) operatingSystemString { NSDictionary *systemDict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]; NSString *productString = (NSString *)[systemDict objectForKey:@"ProductName"]; NSString *versionString = (NSString *)[systemDict objectForKey:@"ProductVersion"]; NSString *buildString = (NSString *)[systemDict objectForKey:@"ProductBuildVersion"]; return [[[[[productString stringByAppendingString:@" v"] stringByAppendingString:versionString] stringByAppendingString:@" ("] stringByAppendingString:buildString] stringByAppendingString:@")"]; } + (NSString *) modelIdentifierString { NSString *modelIdentifierStr = @""; size_t stringLength = 0; char *modelCString = NULL; sysctlbyname("hw.model", NULL, &stringLength, NULL, 0); if (stringLength == 0) { return modelIdentifierStr; } modelCString = (char *)malloc(stringLength * sizeof(char)); sysctlbyname("hw.model", modelCString, &stringLength, NULL, 0); modelIdentifierStr = [NSString stringWithCString:modelCString encoding:NSUTF8StringEncoding]; free(modelCString); return modelIdentifierStr; } @end #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_4 @implementation CocoaDSThread @synthesize thread; @synthesize threadExit; @dynamic idle; @synthesize autoreleaseInterval; @synthesize sendPort; @synthesize receivePort; - (id)init { return [self initWithAutoreleaseInterval:15.0]; } - (id) initWithAutoreleaseInterval:(NSTimeInterval)interval { // Set up thread info. thread = nil; threadExit = NO; _idleState = NO; autoreleaseInterval = interval; spinlockIdle = OS_SPINLOCK_INIT; // Set up thread ports. sendPort = [[NSPort port] retain]; [sendPort setDelegate:self]; receivePort = [[NSPort port] retain]; [receivePort setDelegate:self]; return self; } - (void)dealloc { [self forceThreadExit]; [super dealloc]; } - (void) setIdle:(BOOL)theState { OSSpinLockLock(&spinlockIdle); _idleState = theState; OSSpinLockUnlock(&spinlockIdle); } - (BOOL) idle { OSSpinLockLock(&spinlockIdle); const BOOL theState = _idleState; OSSpinLockUnlock(&spinlockIdle); return theState; } - (void) runThread:(id)object { NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init]; NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; [runLoop addPort:[self receivePort] forMode:NSDefaultRunLoopMode]; [self setThread:[NSThread currentThread]]; do { NSAutoreleasePool *runLoopPool = [[NSAutoreleasePool alloc] init]; NSDate *runDate = [[NSDate alloc] initWithTimeIntervalSinceNow:[self autoreleaseInterval]]; [runLoop runUntilDate:runDate]; [runDate release]; [runLoopPool release]; } while (![self threadExit]); NSPort *tempSendPort = [self sendPort]; [self setSendPort:nil]; [tempSendPort invalidate]; [tempSendPort release]; NSPort *tempReceivePort = [self receivePort]; [self setReceivePort:nil]; [tempReceivePort invalidate]; [tempReceivePort release]; [threadPool release]; [self setThread:nil]; } - (void) forceThreadExit { if ([self thread] == nil) { return; } [self setThreadExit:YES]; [self setIdle:NO]; // Wait until the thread has shut down. while ([self thread] != nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; switch (message) { case MESSAGE_EXIT_THREAD: [self setThreadExit:YES]; break; default: break; } } @end #endif @implementation NSNotificationCenter (MainThread) - (void)postNotificationOnMainThread:(NSNotification *)notification { [self performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:YES]; } - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject { NSNotification *notification = [NSNotification notificationWithName:aName object:anObject]; [self postNotificationOnMainThread:notification]; } - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo { NSNotification *notification = [NSNotification notificationWithName:aName object:anObject userInfo:aUserInfo]; [self postNotificationOnMainThread:notification]; } @end desmume-0.9.11/src/cocoa/build_dmg.sh0000755000000000000000000000242612467662066016122 0ustar rootroot# Copyright 2006 Guillaume Duhamel # Copyright 2006 Lawrence Sebald # Copyright 2007 Anders Montonen # # This file is part of Yabause. # # Yabause is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # Yabause is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Yabause; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA hdiutil create -megabytes 20 tmp.dmg -layout NONE -fs HFS+ -volname DeSmuME -ov tmp=`hdid tmp.dmg` disk=`echo $tmp | cut -f 1 -d\ ` cp -R build/Release/DeSmuME.app /Volumes/DeSmuME/ cp ../../ChangeLog /Volumes/DeSmuME/ cp ../../README /Volumes/DeSmuME/ cp ../../README.MAC /Volumes/DeSmuME/ cp ../../AUTHORS /Volumes/DeSmuME/ cp ../../COPYING /Volumes/DeSmuME/ hdiutil eject $disk hdiutil convert -format UDZO tmp.dmg -o DeSmuME.dmg rm tmp.dmg desmume-0.9.11/src/cocoa/cocoa_rom.h0000755000000000000000000000450612467662066015753 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface CocoaDSRom : NSObject #else @interface CocoaDSRom : NSObject #endif { NSMutableDictionary *header; NSMutableDictionary *bindings; NSURL *fileURL; NSInteger saveType; NSMutableDictionary *xmlCurrentRom; NSMutableArray *xmlElementStack; NSMutableArray *xmlCharacterStack; } @property (readonly) NSMutableDictionary *header; @property (readonly) NSMutableDictionary *bindings; @property (readonly) NSURL *fileURL; @property (assign) BOOL willStreamLoadData; @property (readonly) BOOL isDataLoaded; @property (assign) NSInteger saveType; - (id) initWithURL:(NSURL *)theURL; - (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID; - (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID streamLoadData:(BOOL)willStreamLoad; - (void) initHeader; - (BOOL) loadData:(NSURL *)theURL; - (void) loadDataOnThread:(id)object; - (NSString *) title; - (NSString *) code; - (NSString *) banner:(const UInt16 *)UTF16TextBuffer; - (NSString *) internalName; - (NSString *) serial; - (NSString *) developerName; - (NSString *) developerNameAndCode; - (NSString *) unitCodeStringUsingID:(NSInteger)unitCodeID; - (NSImage *) icon; - (void) handleAdvansceneDatabaseInfo; + (void) changeRomSaveType:(NSInteger)saveTypeID; + (NSInteger) saveTypeByString:(NSString *)saveTypeString; + (NSMutableDictionary *) romNotLoadedBindings; + (NSString *) byteSizeStringWithLargerUnit:(NSUInteger)byteSize; @end #ifdef __cplusplus extern "C" { #endif void RomIconToRGBA8888(uint32_t *bitmapData); #ifdef __cplusplus } #endif desmume-0.9.11/src/cocoa/images/0000755000000000000000000000000012467662066015076 5ustar rootrootdesmume-0.9.11/src/cocoa/images/ColorSwatch_SeaGreen_16x16.png0000755000000000000000000000016512467662066022457 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcÔşĠÍ@ `b ŒjĠ0t4ö½Ż£x­lIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Yellow_16x16.png0000755000000000000000000000016312467662066022237 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(Ïcüó˜$ÀÄÀ0ŞaTpĠì‰˙ġJëIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_GuitarGrip_Button_Green_512x512.png0000755000000000000000000013244012467662066024322 0ustar rootroot‰PNG  IHDRôxÔú pHYs  šœ IDATxÚì½YĴ%Yvĥö9qç7efeVfVÖ¤6m‰°E´%5Ġd‹êıĞğĉÌÊ9óċîçlœ7Nč{ߘ™/_îdĠ{ïĈ7†³×Yg﵁@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <Á ŜĦúÄŞĥßÚ2Şğ¸Ôŭ9îêŝ‡Ì 0@ŠÀÀŠ~†˜×`Ŭk c´µĊïġÑĉ҃ıƒ?L-@ 6ÊäÒ @( Àk+/€7èrïh#IéBú…~bÇ9`ûîÀ<"5uÇà£8@€ŭpHHm˜‚¨ü,ċÀÔÂ^Ĥ•/§|J|k’„K3ò`ĵ› À™ÙY÷C[k:ü[KÏßKŭxv-ŠsU|ĵQ*·İ@ N&xecj>žïY}r ú‡žzy´¨ŒŬìß0 €_àÚïċŸU€5`Ĉ‚ \_Ï7\΋÷û.–$ıÙzDóŞÜ²YÀŜımİT% bÂßÙ,O˜g´¤óö6pğrĈS˙ –Ż3óÏ Xh°ċhk€ÑĉG_l<ç/öĠÜĠsËN÷ĊA ›¨O­%Èì'éBçËú“ë?u ´ž€úħ šĈ9ğ@Ÿ3û@ÈïĜħ‹=Y¨ÏÂyIĴË÷ħïÚĴ; îóû³ċ™Ùĉ3¨|mèğeĜ›ıíĝŜÔİ7ÇċrFùöêh~ßÁÒ_]ê*ŝXò@˜k+Ĵ.wĦ>³èǟiƒúQ0Óġk÷ì~vkënĈğg€ĉ%GÛDêßl5ȃ—œ•,Pêۆ„ƒàT ż1§>ŭ€ĵ:,7Ìö“ eÔ8 NnaŻ‹­œ!Šìwĥ™GFϟ'?HÌĵ[yoqÎ#:ÇWG—^ǗúmÔόSˆŻ&òÈÁé@täÀ!çƒ4DPç;e£2¨ÁZPĴÜR€e Ñ.Kölğ ġ ­İ90‡ż“û‰ƒ •€BâTıDÁ˜'áû à §Ğ!;ŻU½ĦfW  ıßOĦ^[ġÛ‰`œƒïL™ïM˙ÚÜyU€½9Éħ˙âËlQbùŸbjż }Ïbı$Rš?ŭ“…—í…^ EĥrîË%+ÄA N"pÑ1š…2Ġ0“çPnĈ郃˨“†^ÙŜKY %Û×|m[jX_ÊXâòĵTÈC=Ÿ!./ċŞYħ@)4P.<Z ԋޤ£ A jω.w'ìGğ€Vóލ1ĝöäoVü Œ ìí‰smĴëî Ëà†„g;+Á@fA ÜMwä1‚“H”7ò³4ĉĵ{Ş*À‚}ĜĤ|ÈİËġ‚<àäĦÎ;t}ÛŸ×f=Iħŝ{+àga>Cñ9ĊĉÌU‰#µŞQ(Wz€eè+½’8PpÇ0<—“ÀېZ˜÷w@jŝŞf X0_ña`?—:›ÎŝšqĦÎĴóÇ£ÁÂóúbż‚ݰÀ›AÊ+€€—i­µÏ`Y›²&Ş,Ë;ĤcYJp„׏›<„Ÿ’zžW7ĤXÍ„ıí‹ĞÌ5ò€òà·I" ¨g$Ş [Ĵéë*YÄeeGñİ­Ċ@DŻ J)„òħ“·3š[ŽI-x˜#ŠÌ76WİÁ콑˙ŜİħöÛÛܤŠv0˙°¨„âµà§ŜB.rî˜d|­)ùB žF`Y#˘-(ıÚġĉ œ…™ôüpƒî^á°Ż? ò@!Kë‚kï³!y¨Ğ TĞ”í—UXÔHFAZŞ˘äPĠeœĴ,ŸäÌË˙- Úh•ä†È @rŭ½<ÚÀÎ ÒċÀ~b­ùôܛ¿û‹µì ߈Ф†úW”—èŜÍ RûKsçvb,ġ˙‹;K/gĜ ŞôeUàÄáxŒ€žï1=ہ~cúóçĦ.wómGÂÖz;`f >ÊOy9ûXš8G Ş$R œlBi%ŝŜ’\è€ZŞ:à~z À‘öI"1<ԉƒáċwfŬ£Ħ‰`ÔŞ#8 òhÁ½72CŭïLÀ÷ĤÎ:ş~NümnżħĠàKÁà‘?H·+%’Eƒ*` EżĈW‡˙ŭEA7V^”Žòà‚ÇLÖ[ß³.àqçEWĜ>Ĥ =Á˘mëDcÁ†+ͳ ?Kpô(L¨Š}[Ŭq i,XtŻôŽsĈN0ÌKğëúħ*naŜß1sêADÎ`éŭ]ĊĵÜ_Ħoż ݜGR_ĉ˙bé³ùrż5#Ĥ$Ebê$އ\é1=ӂŝ¤'Ï÷@E'@!O&qĜïëÇvĵüÖĴ›)Ñŝĥ­( ġÙŭlYĈƒYYemğz•J1·\žjP'2“”KaŝëfꞋˆ`7§ĠrRĝA ûŜn ŸĦÉ“{ U’~Ÿ|?ŭ*"ú-Ùìï93ş:ċ‡gÉóÜADĠ'4µċŜEu„”³ŒSGC˙èó<ÔË}3êŜ…œNòpV¨÷i˜[ĜÇĥlkİ–-gdĵàäP3w"r‰Ħ÷EXšY,_h*÷Mµs>ʀ‘½3žsŞâİߙÜ`lr.x ¤ˆìGCâQžÌïÍÀw&—ħŸŻĵ81îÓGù·16…cÁó= MĠ2ġݐ‡\ 8AˆŽmO=-gói¤‡Ç bòT÷àfB°ÜÜiùS4çÑ~Ž7w"è’ïġa¨˘š˘Ŭ6à–ÛBċ£ĝ쉜3‡Ïäys {kÜÜCĝŭŬkĵÓ\´0˃ßç–ñ‡C…6UT—aÄòĵ§’„f2ŭˆ… ö ÚG™ñ'Ù'ƒÙ‹„+ qÓĥ J4ëäaQŞŞr™şÁSĝ‹ÊˆÊDC˙Ù¸JZ‹Ħ_TÉQaî”2Éġy_ĝĉ˜Íû;@ägù…@Áĉk¸é4Ûk# ½/Ï1ÍH  )áoĠÑ˙R½ĜïVŒÊ% +%–Á$P˘ƒëW.YìÏ ÀÔĥ;Š€àђ>äkÇİ:,2x IsÏNyXà÷`k%U͗*M¨|@µ'èê`jŸv$˘ƒYdĜ³˘èrIĞ+½ħ ×'F*¸|PoĴ͑#ċP7Fà­ìS`Şĝĉ|?ŭ­'ĠçÔ+<Ì˙ÀŬÈÒ_ Ëz=(ÊëJJħ)³<Í8ž€WLë ˘Ÿ{ú“ë gÚ µädĉ1‚:ËB N>A|T÷LĜ•’ö8Ë î!Zœ Ù´Ÿb[‹§°ò!ĜAÊĠe ì·¨ÌÈĴ#@SĦZnĽ)ìÉ<İ"ö;ÛaCDfŻ£.ŬHñGÜĝ(>ßU°D`†8? DĜÒó­oOÚÀŝ¸ÀGÜFɍz"ÔzD÷XĜĥzŻcXĥ4,oìÓ@KïÍ2)²ĝ?9ûiˆòB"¸% &…ÑQn‹¨g;Ġ÷ž½_}rpÚD…˜vŭ=°÷§Äˆ?܏ÌÎçyìğó ŞĈôçx;ŭŠġÔïsK €£¸ExïÙxħĤÚ$ġŞG<]?j`ñĝÉ£"¨ŠżŬ’çbiUòü* ‘ĊÏqGY”ÏnDp pnAŬ¸)³ ï‡˘Šâ͵Ĉ1ŽS l§@Ĉlí‚üj†ŸÀ|ÁŜƒïN  íÛe|{œ£·ù£á§g§ĞmŜqò‡4—<½OO¨R–Ş RaY–Ï[˜UJiŞ.O˜ L5ͲjŸUO*Sġ^½ôèċ~{„Yí~·<\ò¸ó*‰‹4oâ–Mo˘˘yaaU¸}½a•­=·ĊûâĜ5Ğ"߁œƒûğXF,r‘IùÙA/ ¤8Ór‡÷ĈjġŝŜNĦGĵ›9ëéܞAj™ ƒŻž³ë ƒ}N„ÂßċQŜntÀ€ŝìÙĥ½6Ä×FcıħOÀPgZ'pĤß0ˆY—ÀÌ@nÜ`VĴû²—$‹‘B× a @>ÄëF3suçËêkÒï˘ ġ È| ې‡‡Ž£œ ´ÇïjÉzE˜ܘñâÑ˘ŭç˙ž¨šg•¤ hV€şµñÁ²7wb`£>SR¤Ĉ5£kèÏl€§Ö•Sĉöôŭ)ìW6sŜh1O Ú™ ià×gßàb·pÎ×ǒS 8€ô"0ŝZ8˘î‰ŭ–~Öϙ-׋żOmĠ.|S}vŻĵ(€S`ZoÙË517ˆÖgQ{-U‚™m>J€‘ċ‰“Mìq}>í} uQ÷ioëe9 ákq­CiS>hĞÙ~¨ĝìœqÈH4ˆ>Û•Ş`™½ÔwÈĜıŭğĝÊ&x35´žüX€·R0ÙvMÀ z 9³T!žd€l‚Ħ÷³ċìÁ›ëGÌzv^ĦpUÖıŞÏàm°$`‚^óĊ° ÷a0v‹kÒ¨1sÛ󜂰ìꨆ˜OË£Ğ:À´îIÏoòĦŽ025´—OC½¸@/Ù6ĵ}·üëıuğ2~Gƒş¨•¤§Ŝf9R{$3ç–D8ĵĈkñì³gǜÚÚ=Y%T/·ĴC=™1 ԅšòÂs³ı½eİ2ÌUXÔÓ´?^ïŭüíQ+ ûžĤ% µÇù+¸O¸4KÜĥœGŠ1éJúR·Ëàwva ~~ğħ½:üß0µ˙€›âMè£WŒßĦ~ôyġRżŭùçĦží€Îwœ` µŜf·ÈÊŻ |ö`ċ;a€ĈLÊ%Ee]ż ‚ƒ7é b0öŠsï XĴùÁÖ/07ĝ–×M‹{˙vE[ôúLBd§L4ŽŞ e…ğaàëA%¸ĵ9-ìzaƒĴTR;˙y~y—ÀÛé’ğˆÊôXL"­ñ°3¨ƒV’’dÔ{ċëî9c †ğğ¨Ñîê2èĞ"ÉÁµˆK’QI”lšÉWÜçhqPlò…Xvŝ4Í+‹îƒĠǙ yÜġIGĦ •ħÀDÁ³q 9ğċD˙ĵò­ ÌÛ[°_Ŭ&öš}wçǑÙoӋŭżż+½ Ǩäĥıgùc¨LB+€­‹u e— LÖ àıvÚëxĈ‚ j pImXĵŜaĴDԉE3`j7쓛?߆ı˜µÏÌIҐ–Ù :Œ iifDÏ&ĦŸ€' <́]ŸÀ85 ĠŸż'Ĉ.èófôVU‘¸76ΞùAşTÙá|s<|ÙÛnܛşŭÇ^·Ž "ĜxŜW~–ˆµžĞqM 6÷n‘ĠdITċ!fgT Ğ.T1ˆT•hÍ Ħ¸L8ġ݇jHİ04½pßÁ**„á…÷îB˘K1ġa?Ӛ“ÈsšŠ_ÂûĜ'‚Ä hğ{vKk=·D€n„èbüÖ:ĝÖĝߛ~+˙Ŭ€ċß—èsg5>1_Y„éŬZ)(Lˆ¨Úöóħ=@ O6ù ^d°+T‘³-•ƒBNžĠÚs{0 ç†)X­N}–ġğäĴs=—÷jo"³.kTV!Q­}ĞİcTsK ‘â28„íX}Ò"u5àŭ ( ”Ŝñ İêċ~°DQT›:gĈÔV{#ŻïĉîzLĴókh L³c"àŝÔ}§ıŜ …Ê Áw&UÒFċ ~ìrBn}0nĜF+ıĥShÚşD0‰œÊP”kúÙ{ċèCó%­Üï™'¨T pÁúp%kjVeÂÀ<Ë1•ġz×ËbA˘$ïÑì \ úsŬ˙*獖¸`6½~\™3vœ PYÚĞ_ ŞTPÎ.X;âK‰l bóŬˆoOŸożûÓöl›ùáÎÛé˙à]è$|s,&CO1}ëӕñGCĤ—úLgZßwú‡žylKTHşuçĵ˘İa>İ+˙9ô÷=˓›äxÂál‘íòĞĈM-V­]>@.’Q Ĝ•Áĥ6ĉ;Tf‡‡á÷}PŞŞöĝ’MêĊ~éˆĉ]hû%¨ĵ'(P‚ü…J²$àŞ!šfÈ>ÏaQ`.‚yċZ‡ Cfç·ŻM…÷/ç{<'ŠšŻç~¸ïƒ( GÍ·8*%Έ-û<(Êğ“&Ê)vcX·ƒèg.Ç|7…½?éŜóîÎ6Àç’ŠëSYp=¨R’z\8ìƒ]Ĝê²-÷&äÑdĊ‡ù½öĠè„Ѓ—nP"*“İšŒÜ4Ú%3Yüáù÷XnÜ/µÔò¤È†Ï(²”oà̖$.,xĦ?í&~)‚W%Ġrç 7qıımÈà°“9ek3­cħŸBîßÍ]ĠĊ8 >̔jlçàˆÀç¨.Äc臛Z5/ËyĉŬü¸zPK/P/·â=Ċú½e _ûŒ"i3s,€ÖV0³ ?rês4wR¨WókáLàaŜñKĴݝ7ˆÀ#’*ó‚È4T]@ ?m^î(ò?ws˜Ċj\[ğ·ôÜ5ç"ÏaŬıJRQ™açË:AÎñ“ZĠ‰˘ÒòZ“ ä>9“ŞŭsAB½òFQ ¤ĥüÜpïK}ÌU•.päšÊƒê5ÈkJ ™$Ï-P ž/ğày¤‡ùĴ×4ŞŞž òeÎ-vçyjÁÏġ?ÛQĵ“ĵ48cżŝàŻĜĞ£÷íĠñß0Ħçz]:I˜<½8zÀó=ĤK]èO­CÎċà|Âä\ĊĜ²Ü2À€lĈµ$-”ĈŞ™çI 5HĈĈçĉ>>Ȉ§íNŞİ ċLġ€DiIÎ3ĉ‘Kv[&٘=HN=šÖòT8o0ôİ_ÓYÀ(•†Fë`Ü[‘r]7ä|kâŽsF°•KŞ!"ʙ-ó\šĴĤ`9ˆş+É,rˆ–Žˆ@nıƒIù*Q‘'AgÚċrĠ' ú0³{ŽĠ|âeä]žoUğŠŞÍ˘zPŻO*ĵŠ Ôü̞tI‡P#ĤR°LݳΠ•ÙuG…eĜıq%À·'ÓüŸßnÙoo†_âë÷%Lаxܟ%Ŭù'˘Uƒ˙q(ŬÙöÈ8˜e 8YÀI%M’İ> ÇÜGÎ-ŞöHöÈyˆĉgĵŸßÔïµöɵòÌÀ‹t@Şĵ<^şÔŸmû€Ŭh5S)ü~·Ò†c)ßòK< ínŜÉĉÛ:‡_ùA lĤ‹7MÎk˘é°KpdfWny}4ϰ7ĊòyÔÖ o!êG@;štNmó}ÙĠ3BEŞZÜR½‡TUaÀÊ4~Ǚ1UàYž·ŭŬO>Î!S-y6µ+"  9ċ'ħ@9×Ï3­V´‘€_[½—kx›`ĝMX~‡ŻKż!ġ›ÌğíUXü ñ8µ3í8·'q…ïH9µA8ZĴ ŭ,#[•ڃDÌïs.çĦ)߁k’{^]Š™)­€ ˘ĉó02n"ĤċgáÔLĴĤÖ:Ġ×ÌdÍħË,çû“*k(œ7‹’Ċaš…î‘ĵí“)·Çnk€HM1Û?ë“6f… tí|& ëë/¤ëz\¸ĵ.ËJ5ä~Ĥ™·•˜Yé*:óeRLŠ U, ÀM˖ġçQ=Ä1£H 9?UùċĝÙ.ÔVJÔÓÖ~°ûMûÑ]èüVâ˙š,ïĜwv¤%ħ(žñçŜOż`ëüO>ö3È1mó(HѲ@^ߨ1ïçċċFİ<èĵ€D˘U ĝÌĵ¸lòw‘‰ž rkÂĴùĥn$œÙ2O$³@ד„‹ÏÏĜ5Ĥ)–4^[İ’oĵÄ;05àĵș¨ßmSû !ĝûfëuÑxż93&ŝ`¸XHìmßwâŭŬêz¸u׈Vcjâf–Kûï˘F/ş‘KiÑAâĤá҆šàÔÎÂz\ı Èİ-ݸ?Ĵ­.GÌ3Ìû÷³’’„ßħNÌR l´ ˙ÌEnOÀ7ĈÍ?ğġ×ùAÛŻ>ĝ€.v4_Kż§š34ĉZÙ'3Ó!´{Ölc÷ħ ?ŽkŜEè_lQkáşj xéħë·÷SYIž$T—ĤôòÒızµU5Y34}*ŜRŠ‚ôÊR ΂ċš”]À ˙PE˜Z@ùÒKt=qÔ€½;udc˜{~RkˆUHüۙ³Şĉf…€3ë+w²…ן·2°Örĵr •[^(TŞÈ/X‰]…wċ‰™÷cŞtUʈÙĞŽP˜ Y…BMY z ¨—D·‘Vî^µ ˘ıYÊĴËézĤ­h%‚ŭpôҙöŻĜooŭ-ŜÉ˙gz}ċC~{[:žâ!ùŻ ˆßÙaġÚ ÓĊԛkˆ~â"èBg~Ŭò8“CG´z`¤šÛ/K̽}î"“˘\ŞaNI;ÍüÌîaÉğŻ}ìq ù€ĉ[ĥĤċKl‚Cżz—]Ò7ƒĞ|ĞiD*Zsg<ħ‹›SN…Ĝɜ"Ñt. \ŽBÑç"o0њù4Ú²38+–´WcŠ>—ğÎJşÈÀ–(Ñe‹lŞ%)¤À,ĴD CŞw‡½feŜĵÍr ŜXÇıŜہŭöĥµßÙRĉŸß½÷İVàİ…zyp:bN&M=aĉIÈ}8¨Ż…ċ½Í˘ĉ|ôŜç†Ğ#c˘Rό·µƒÊjŜáöÌ7Í*y˘ç;rr­t@ÔÉĥçËQ½zÀğ0ì”…½şâËQùA —úòájUߞTˆÊìû1h+-gŝm êşŝHpĥäJ¸I ‰„-׍tF†´š ]{Â>„gcĤBÈ7 cO^(gàôĊRŻgÛÌßÙŝĜŜ˙mßá···dÀz@ñÀY.žĈ';ÀX‰úOŽ#÷á¤Ŭ*ûi Ìûĝ"Ô°6ċıœE{ĉp\H¨j[]étç?ğiɨ˙ĵ0ú —tógËí$íATĊ+Tl—Yàb׋³²`ċ@jÀ[İ[ĈĄ|ĊogàíĴìeaԉœ£VÀğNàˆ@gÛPç;àÂâyêK"ÛÚ‚„gŞ&[žġ ™uTTÍXTŽx˘]oUd}bfÎ@bħyu…˘•ü½çÍżŜü.eó·ĝY 3-Í÷Ĥ’pj @aB^ £'T Ş{˙ ÇÑMî¤%PÒ>ŝĜ”<QscšâġĈSġ\[Ħ&+ìħàeÊ$!a÷I|a2i§‚ï@³–ß .ˆRĞ,7¤0 sb@ÔO­ ĝ9;ždvœğ ƒĦqy ŜƒŸŒKšä벑£òM˘v ÌGC—hĜŠ€‚:×q¤C+P†2K?ö.fí ë< lÑħ´p/UĠótŠ€ŞĞBµ% rMĴ(&àb´ÑŠè™6ìùöàK1c+ƒ}w‡èın—ŻŽÄHè4~{›ér÷À™VcÛ×'³ÌnQDìw{žEÇğ¨÷Ĉ)ìġä½ş™g“˘ay‰Â1ż=/J„äbÔ£òĠÄɐ`x êڒó0€Ô@e‘³Ó…ëLÉáZù1ìŬ‰# ıu¤d˜;ÁyîĊ ž†ŬÌ܌ş@-ç°¸2ċH€É­ÀÚWÄŞlnıJŜBÂuı•Ž.|b+§>÷ŞċÜġçžèϞEŝ\cމħ™Ż½Ò'~gWĜS¸‡=6+ŭD~{™ĝ N:Ô)ĵÏ%·-k–‚D1ÙµÔ#œÔdċ1“ċ²ÉRA ĈŞä=c:Ór­Ĥ<µàÛƒİ3R2pŞ(‡ŬÍ@wĤ³$êBĵÖ­ÄàŽuc Ż½‰Rä½a·&Ì,‘‰òlÀŽ˘ ԗ|ĠĊŞìM0uî‚ÑO^&ġê ÌßżożbƒßÙŭEşĜĠ|}$K§Š9::y˘×˙!ó³ŭĤ `—ì›ĝ#':ĝ÷‰ÂUäÊŜ¸– ’„°ÇDâ³-•˘›%3(ŽÊ$Çĥ3bë”Jt&qMĦàÔµ³ĉcàŜœYWwo ìµp}ìfŝÚċ Ž+=œÚÒî<Ö Žš•P²'U¤|9_Ĝ‘ñ¸òT@œjŭĴĴKl)èĠ3PoĴ*óR˙/ÛŻ?ĝËöíí?'è~ÄïíĉòPž iĉNĞÉŻ#Ĥg;Š.uĦεAŭ¸Ħ9‹˙ÇÜ\Òuĵz×+ïñMAíœç¸˙ŽplÁ“ ZòKŝŽCĵï0ÛġûÔˆÙ˜üÓµßSNY ċfû¤ ”+áÓä}PP–&GŠ5(Qr?ZíóJ ÚH Îu Î´\ aKğréİ3LÂÔ¸=½1ߛ‚"ċ‹ŻR ÔOŞó°—Ŭ=gı°GT–h~ü-ÈeÚÊÑ*şĜ…şĜeDj–?[ÙuşÔŬĽi*ܓŻÁщÇqlcÂñPħeÁ"!pÖePExD‘ŭҁ& W`ò7\ xê9ġI…S ܛÀNs×§áîÄu"We°ƒÏĥœ:kgÚ9#"Ž|[çX•gÄ'œ9*Ê-û ŽásZŠtG÷i%ŝyş6ú öŸ^À½Ĝĝ}Qžl‹–Ï’óT"(–ÁéĊ~ƒÙQ‰B“ i–ÙäˆÁĴˢSD];^GˆQz d֕"ŞKFàûS­ x5meÎDm3ߝ‚i "kî§n›nœiƒ€ġ\YáÌjZĞŠqQ%Oà¨9Ş6À@À>ƒVb&3#u{ğÑúĥùÚĤĥßx #òM\‘ xÖGU†È…+˜$Ŝ ‚'(„3ܽĉ0ŠšgĥĴ> ¨˜-몑QÛÏŜuùS œë€Ö[Ž$¤<2à÷waoM@™ĈöĈtwê>ğ­AÚPÏvAçZ$ħ]ok ²ä‘ü­“éxJkDÀ% z—Ġ^šZàBúÇ.hġrßfƒˆùĈĝ68žÊÍù„)tĤ5“Äh5Ùcú-ëéà CS`ÜŻ=u½\ħX—ç ‘ˆ•3²pe~…rš3x˘@m ꭁ^̝ÇÀV:„ŬJİċ 6†ı; ġltçÚ.Ù%çù~ğe‚25 ĉġ Žá|ÎßAyï­ÁE{g­€AĴ˘Ô·ÛħëIÊ·&żàWh£ĝŝTĤ‰GK\K~Ċ´ÑRêùžğéúñĵ‘3˙£ô¨?P‡Ilzˆ% P †4iħž|XXûŜTtÔŞlÔÖ.™°­ŬLş£A'ûÓ ZMÀ†Á ċîßvleàcq…”¨Òó`6ĉı²BRTuzk|Ŝœ‚?÷SgC<ž€&öŜԑ+=¨K]G*ڑëCûŝ‰r“Ş"' \8, hJ´bÎŻ­B½0ß›lj˜¤żàGébGóġħ¸>m `=ùϨÇôL[İWVœ \PµĤC…dĤ½GS3“Š7ĥ,‚H#?†;EĞŜ٤ȷêEäëŝcċòú1ÔZâĥDNéċàa s`'svîfŭ:(_ôR)$#6 Gµ.šHÍ •Èù@˘”şÔEêçöE(şJ½ƒ<“›ċ(tGüѐĦ•˘ˆèÄ$÷3¤Ö_ œU`ÎĈ—fÉu³ÎŠ–ÁÄS ğ5vcÁŜPm$ÀÈÀ~° {cì’‡9ì½)èA ӏA[S¨ÀJ t50!POğ/CżƒY߁£~W÷}ˆ”³3îÂ˙ëôó½>ηÉü˙޽1^UŸXUö[[²&û¸ MWz—Û.O ô™Ö“ÛX N*ĉZ󢀋8gĜ(2@˘ÀİûğzuêJìÚġ·Ç@Êàí ˜˜ÛS ‚zutĦ˜ZP˘œ‰Q˘ÊÄDëû ÖV¸ŝ½9ŸÁdA1…ŝ3­$È÷ú–ŭâ]˘û żż+6™”7ŜJ<ßzS  „„ ìhœ†Oš€N6[ ×Ĉœğ^şÁŜêÛ)x;<OĤÀn“3ÔŬ)¨^聍µĵÒ) .ÊúTµÏ€:Â÷ ËŸç°Ħ€Ŭ ê“ЈZŠMK³}gçë>E/b~wG–ŽˆCċj˘`ħ‚Xŭ2­Ĉ  ¨çzî†y˜9´  İyGɧTû1ĈİÒóŸˆÊÖȑ/K”Ëŝ?Ûv³úXƒ…Š5xb\×Â{SŸ8h Úzf[LĊ8–^q7ÁZ^€îiրIm´H}ïĤoĤ?EÛԍŜÁv&U…VŝeZI\Ç'!@èI@“ż@è‹RĝÉv w¤ĥ­%Pğ@Gƒ €İ[€w2`dÀw§@Ĉ³rAÊ­Ûż/‘&"B‡ÏĊ"T<f^…ҐYFĞ­.w/ğ;·²ż‘ı-7Ááqĝ%Ë vTÖ¨ àñ`Q•IƒîWVĥ"ëföcŽê>¸oĥ`ïN\óĦ ĵ›CM ̽ ԕ>pı ˜Ìġ}ÉĴ+‹”'\FóX˜İ‘S0:xkÍŭ·żÊkO ˘ïÚooK™à##Á…e½@–Á%ÀœŻı‘+ëRë&rÏvA-íìġȓ{wÚÍa6S¨İ "à\hğ>°ÇìH@T$$ÒâcÚïw°žÀ(€ Àւúô§ÖĦ/t˙Ŝo™?ŜĵàĴ\ĝGİŬ˙‚N€hk!@p’@ D żïĜWÔŭ3÷Ë]èĵ™Á~4nŽ]݁m û•M×â÷ù ê…K(RàĉvIˆ>ï(ËĊŭ~9uǨè§.ƒ8ħ|Ÿí7·ˆžë*:’RÁ‡Nñ‘cMVĵ€“ˆ˜e=]  (&ja²Áċèȵí|ı_ĉÚSĴ bŸM€Íö]$r·Íƒ´š@½:·5 ĥd°°n]C^ hJaĦµ܋ŭȅéÇcžZĉwwH½4hÙ÷v¤‘ÀC%! CIäl Á“@€ÒÙOûÙĴ\_ÍNr×t´³ ÄàAÊ´›ƒïMÁ÷§ëà3mX0È'˘zĜQ¤Ş8 ˆ .߀Èx#ŝÁ³€­éhĥ_ ċBï‡ĞĜh)V(RżLŭtÌ#z‘+1 Q4Üa47*@ xĵŞ•V„À^Ŭ¤Š5ÖPÏv!³ë*˜[g$´k€›cP'uµ/ôı–ËVÀE;ä, Pu,/Ê)v•ôlÀ`döż#˘Aü%ìŠ}ñ€ġD@O#ú3 sm× à à Bàс°%ħ¨]óĦĠjĞħëîšYÈ82Y`+smŠÇĈ½§6„Ï~8, @.]èzħoísĜN/ÒFë˙Ċv&ÇJÖ” €úÌj(@p˘ˆ@i‹ ë[SĴf­×i5ġ"7~ [VŜÍÀ[Ôz2ë\H3iĉI@Spß/añ­à )+˘µĝ "ġ95ıŽíìä⯠(ŠÔ‚ކŝôúá€(@pòˆjj€w,ż)rĦƒVb¨ġœYPĉÛO 01àûİsô )óŬ̝çÇd:àq†]=  –i“:ßżğû£Èí5ŒÌWäÂÀƒÔÒJ2¤D] ŭİC‚KPX(ï(ıÒARäò4A­%Pçڎ L-xlÀğ(eȀ,-çñ_Xİêg–ÇXÄbŬêù^D—{?mżħıCÏvż†­Lr­ €ŭ\f )‚SDfT.ْ#LdD‘k=ÜÑP‘ߘ€·3ĜûS0‡ŬΠ2 zÎÙU X>o6A+&e­(<`Áŭ”àJŠéϞûoíwwŝ€¤ Ċ7Ç´pÔnÎÌÎ@B܁àôG äD$Úñv gZPoA}ftİêFàÔÀŜÁ|wĉ‹w]Òà8&H-ĜX7‰´ ˇ<>Àyhr˙ïj¨çzˆ˙ŭWŭÛߤË]ĉ›cKçÚR·~d Ğ­D.½îBJàԍĠTXSK`żj@è),‰ÀœƒÎ´ 8³9ĥoo]é4|*³½ĥ°ÍÏĥt”ÖŝÎ9?şï §¨>H”³Öj)TÈ@—ğP½öàŝÔuĈNġı>Û%ÎqÍ-•ïHeµÖa²Öĵ1uœ=1iBôıg˘|jS6ÌüÎÑsŬ˜ŻŽžş £€Í)"g QĜ+ ŒpŻò‘½Ê —½Ì`˙+"€,À- ¤¸;ĦA €aßh˜;9l6O ÔĞÀıĥ+ċc€™hWBX(!árEÑóÀ( Ċ µ˘Ÿıœ¨+=“ŭƒ˜ßŬ%ÚhĊ|úT‘€€â‚ԍ}¢avêAü^0B`_D`Ö°ÇÏŝaHƒ#Ò.³"¨ Ġö‰Ë ¸3e ûPÚ@?!`ŬĴŬĤAi(T€Â…0Q`ċ~'f¨+=­ĝ[şĊö˘ómâ[“§fà?<È­Kö€–u˘ĊXÌtàô£R) Ü’€ħ@Kƒ5ĤfĤÚŞWÄàkCĜ{S µ€aĜˆ ”òóɰäcUèíW ¨%.’" A çzˆZšòÌrj™?>Ua‡n›Hë­_C˘@-¨ç{PçÚn <}Ŭï˘ú΃(Ş&÷Ĉ3Żê†÷Ĝ% Aq|68ĥp„¸ÁÔŻ(o%Lސ0ˆAŭÈ”[WUĥëÔ0ƒV\/Š”‹TvĴL0iŸÇd¸QŸ"ġҀ(V@j?·'žëĈĜÎN½Yáíež‹¨g:{_ =™àé™^Ú @krU0@Wƒ&܍ ŜX…%€yĜÌÀcûŝ.xjĦ^_q̈́Vb€Ĵ+3dgò3Ûï~I€'y~9À˙˜Ħ,8·?Ĉ;S˘VqmĝÖĞöKt8’·˙uc¨Ë]¨çz ~ê.QÂÙ¸(@t¨E?Ïz·³Ŝ1´êĦ£ 0́İċ b§0f‘ž‡WfÛÒĴ/@ħ†:ßIÔċ›/Ŭù×|sòuÚhĈ§wĉzx+`Ĉ|@ š˘LÑÌ-òV½-íA/úÔ'V@ğ K]W²·›^Â~wü` ŜɀİqóÀ>¸>ÙÛÏñP9‰$ċ­AƒtħCêÓżEÏġ˜ïOOġ,À ]éµi5ù%húqhŠôk+P—ğ Ŝ!€EĝD‚ÓPu|%ßSÚwïc'ËÓZìdÀÄuÄv²pUY½Èµŭe.ƒ7…á ŽA—Ĝ0?‘†~}|mhyj4m´ŝ´v<8XM"0^GĴŝœşÔĠêBêÒ!ÈèÂ'@ N!pŒ€ŠÀ­ƒVş1Z§·S`'wɂ-íŞÎ´šċ˘²eñAÜi+„Ä‹e×ßÀê|‡(ĉ;{x}Q@Aoü³´žhġl÷p8?cŭo IDAT¸G€@ 8J@Q›ŻÈÍêUĵİĞĦεÌ;ı³Ŝ́IÛÚmꛑ'³q|żj@x,ʑB †xŭ(rŝğùW„Ĵ&€·@ĝYÚhiuñÀ ‚§’$ œÉ¤•7ŝ ”K0ŸZ(÷^~ŭ0i¸$>‹jϗŭŞ\U&È÷5€e³¨óeżğóˆé­%_vvj²—ĊgÙy6 @pÔèe|ÒÊŝô"P/kı ĉZuĤžZÇCĜoloL€Ü€GÈ,87.101PĠŽ%ñK ŬÔÖ s-D?uİMĞÉ˙ÀWGÓÓt îPoÍ(“d@ ?Ìl-ż´ĝ£A &‚úŝ Ĝwv@™†9°Â~w´“A½Ĝsjm?+ïP[t) cÔ^j@ĊĊ@¤À–AÏt ÚúA:EDlżö€èı.ñĠÑŭGT!ı“´ÒÁáP4u+–_É_ĴœÊL½Ì ġê À€}wÇċ\ÌàŽžíxkz³uɄ‡I  (Ñ`6@˘Ħ?Ċc3äğSĉĞ#˘~Lĵ›=Ñ$àpN€4f ‚£ ÌȟY38Ñθğށ/€ÜÂ^·RàŜfb ÀE¸rBÁ° lZÇĜ{ÑğÒ7ÀKĴ@+˜èOëal`tçUŠô5tġ„o?ı̓ž) Ö2@Ğħsk_ @ 6…Ŭ]‰\‚_+rħr†AŻ@bj£ċÖ˙7SĜ÷w`Ż\˘à¸È àùDîŭĉD„È}V ĥm#ú‰‹Po}‡ïOħê?] ÀĴĊŻ.™–xÁρ@ ì(ïÀ› ”’Sô Cb{s ܞ€o Dħ mLÙT£öÓEŞżP¤ÀŬPdbD?pÙfúûüÎÎ/ıößç;“üé ¨ş÷qn—Ż1‘Ĉœ“”@ N! `ĥ)—Ŭk·.€×P7ċjb`w2ŭ)ĝĞ›À[kÀY€âH ‘Ş–Pİ "pQĦÖ*˘Ìĉıáżf˙èŜo>= ƒÀ}³;Ɇçù†O6 ‚"§‡ ÄÊbt´ Ĉë-¨Ë]šWî§°î€7§.§Ö%2Ê˙ï7NPġgJù@7Bô“—ŭÖ*èLëçNâi;\ "°eĞ+ ^ÔL#'{ ½r… Áİ€_Ï' °R Ì:PS ó•ûÀĜ€ïNÁï A½ìû 0àÊú˜½Òŭ-!ϒKj)NġÙs˙Cóµ{-ҚíW6O̒ÀÑÊOú,_ OĦ àĝ–vË j)ċ.ÔĞ@? ì­1ì{ğÎÀ0`xö˙Ùö é{äĴ‚ÑvŜê|êJdhz’‚˙şÒKü0FşûšeŸLzf!1@pjH@°‹ ħ–žu¤‹¨­Ö2°“?ƒ7Z óm@':ÜgU Dn) c¨OŻAž > ‹ïĜŻnn>İ À,+êèŭg׳DX@ <êçgE ßĵĤ×V\{˰÷&à‡àíÌ5 Ê-ĜĜyà vÁ_b t\2˘zÛĤ³í?@Bo¨ÏžÑ'âô|ÊìYĠA ³l@ <š¨Vë@Š€ĥ[ ~ìÜ_]qvÁ–aŻÁ]n@Ĉs`n>yùPG"kA˙é iġ+ö_Ŝ3OŞMO,|­G 'D·˘{`Q¨t#ċ#‘ĈöìGC 5À(wm„M­a³•7Ğké‚xÄê{7~Z}Ïú·žL¸²ûŭŻ@ á”ë@Zı`Üv ĥúÄŞëĜRÀvûá˙ÏŜğĈȲ÷]˙ç­ŞîıµöŜk_ÎĴ}97çÇ“ÈNBâK@&B ˆ(‰„#dĦd@"(‚/I  $V  ò™HV@‘"EMœœÄĜçàcŸÛĴûŜkïu™53}­Ş÷áû]Ġ=}İêîéžġ˙ÍìY3]ĠŬĠġîOútè„?S U ˜5ÑĥŠnE> ˜·`~½e>8ŝ0żçz´ /O-OùÂÈ_B!dĞ£%# ñC‚'òrۅûŸa?<úz–:áÏ'TÙ)‰q+‹o$ŭÄÍÌüĝËjżûüRSĤöoGaî>“ú„Bv$ Bó\W@Ë ˜o\‡yï8Ё…~Ŝ‡}qÂ?È]`rJ`‚@o|¸)yİ ı‘ÄÑ?÷²šo\˙ıŬŠ ‘Ĵ˙9 B!›ŝKQñlâGöFÜ܃y÷·Ÿe{hXĴ @u9 ìÏ ğn´ŭÁ×7÷ŝ<ț—V_Ş @bİo Íza6sÖXĉyBı"@IŒ%6. d?‚ĵ҆yx Äúùö“3èd@ĤEkà ƒ$‚P´‘ÀĵħŻòÁ‘ê×LÈİħoݐ+xÁBız÷tKÄ2Z-WۈŜ?#·!0L ìç.Z¨Ċxôz‰•ö‰_T!ŝ×ŜóŝäŭŸ•wMż$ġ €ÉVı0 ‰ŜĊÂ!„\-Fġêü½Ҏ {1äċ6ÌÍ=— è[è§]אY ċnµĉqÀGpވ~âU@äŻêN&ŻíÉeĵĠˆ #£Aö#Nú#„²c‘)–÷D^ Ż%Ż_sE‚ô‹ôQÏĠô2WhuıµÁ! Ó ċ0†ùÊ1Ì7oŻĥnéçŭŠİİŭ rUùêµé364'@Œa¨žBH]+ĥöĊ=miEŭÑï½\O€\ŭ€ s sid^ñë²—'†uĊ{°!ù£o!şu|Ż´Ŝ“7÷7– ¨eè‡gCäú§ ĜYN„BÈNFüú큈ĝù/µŬşûgCè§}·+ ›ğÂÀa>ùÈĠÔÉA \kAq r˙ú°—mêe¨oiĝ‡'ĠžèşaöBÈ2F@¨c ‘& i¸Ö‚ùÚ1ì wOğÈW]¤ħħşh@Œ§Xì‡"z-˘ş'~Žĝ'^ƒ~>ĝ²&Ñ @ûöóŝVEFìùQŠ ÄW7‘ â $„BjG^Ô½¸‡A/µ€›m “ğµÁûAîÛµpŠë:£áĜaKáAĵœÀ|ċšÛg›˙ċ €HÜ3›Ÿ^:!„m£Üż¸Ç·èa?‚y÷’D€ôÙ8͠φÀúµÁK–êF5{D0?zÑOړ÷Ž~YrÜÚ>@éqBıbF€äQJ`/Ċ0_żymP ˙èèçÔĠ ·.ҝ-9ÇG½S­€ìÈÍ=˜ı'Çñ×φ[gHˆÔkv !„l;â5mÜ˙÷bȍĜ3o˙<ƒŭÁ)ôÉíHġ˘֙ †µünÌ­‰~üàä/m_ ĈXÇïB!—b./üĉ½#·7ÀŞÛĜɀn>^ÚċVŒ ä ‚\K ·mô^ŭ3xD?ùŞĴûi×?Ù]Èë³ö€BH"”ÑoïCb Żïı•Á× —Ŝ9ş™KdvyÑÍ$m‰@ùÚ5#ݵߐÉûĉ×·,°ÓĞ'„rġ˘> ħq‹{öÜâyóòRÛyüO‡°_ô^ŞĞ £òUЧ½'†AÒ6Xŭŝ›*‘ù~ú7?ÔM<ċŠ!†ÎX1­B!ı¤sĜ‹]à–Kt3×xžC—€Uż-?FŬÚ7H˸Z€vıٖèĵaċÖáŬí1tbR,µ:Ǎ‡šFDz0@!¤Ş¸T@PÉÄè½wĵïdċIúE´)™…ŞŽ×hĊcŽĈûı{ŜxµmäfûıÙŝQy}Żñ­{˵nàK-7À İù0u—Y*8!„ `JÂF·ĊÍ8N\à va˙χ=·-pXŽÔ¤Ċ1%öâßvsÌ7o äFëߐkIk]Oµı…|íÚ“‰9!„+‚úá@ š7óµk7÷È¸É€gİ 4́|ÊĥÀŞQ _€x=AôÍmyëà?³?<ë]Ş ïŝ/ˆ¤SlJàc ‘BÈf‰ĵ '‘+lù5.G -ìGg]hĉŠGŜŬÁċÈCìëÚä=˜÷ _Ú˙ï.7 ĝ}Pä × Ò'„²Ğ”W÷Ώ$-üĜK. ‰Û˜Z “şbÀòˆà´P eŽĜ‹`nmó3 o4·.¸kŬ‚U5ïÌ߅Ì„Bv™ÉŽqġğ¸yû¸žİ…ŭŬçÓ šON рúÇ?‡@ÚäËGˆ˙ù×sys_ġ³ĉÖ/W˜ëü€ĝßÙĉâ=@!¤˘BĈŜ3oGÄ@Ŝڇĵĵ碙ž§ÀYĉ˘X2ò ~'AäGÇĉ÷½dp”ĴíéĠ³Š!„Â(mî‹\‘yçrÜrµşóÌ9İWŝÜŽpŬ(@˜ğŽymO˘o^‡y˙è›Ż7b ,aÔ´ĥÙÓÎ „RQûüì›ħÁ7ÛNêžĦû@ßF€bùHxi: ÚEíÜ:ü‹ö³ôò"uvĴCc›ZGÌh!„Ş*YŠH,.pğŬúx}ԃúĥ@ â´ĤJ@ĈµI|ÄAÚĉ+׀äD@[Ŝ?j5ùÔ(˜„BÈ,")´°A"?à•6`}:(ĉäÎû×rJ ŞS,*í÷ÀĉKû°·ûúÉùpóÀAĵ¸pQ€&„BH%ĠH9 Lœ(Ëa ym¸Mz2tĊ€é”V@­wĴQ ċ§ŝäM˜ŽnTL]vv`óˆ4c\0ŞA!d‘RJI{Â~Ÿ0߸á·p5 ô2א–ĉ,£MŠ"Ŭ2Vóc/uñúŜŻÉ{‡ÉŞOĞFĝl—x†Ÿ́BÈşġ&|qs"Z. oìÇ 0Ìaïž‚Ĵ˜Ûš;ÊsÔo&Œ}p|ŭȵAowRùàhi·|µĦM!ä4"ç€JÌo´Ü‚ĵ\Ħ')´—ğÑÀiİÀ˘ş0ĤÔ>ê ä Žb §rëPġsğìÓ¨g”óċ"£ÄÌeU„B65Á+OŒ˙Ĝ@^Ŭst3è½n1(¤ÊmñĥĈñĵĉ"2ÎĝĜ˙+o%²A^ßğ%o.7¸’tÊ­C#ïx"Ž˜wĥ£¸oĠ„‚c !„,İ=êêȗö!Żïğ}OÓÔ ŠŬËž‡|‘ŸA°AŒ@nĥĦŻí}ŠĜDëô@ì ïĉĤ./ÈK!d—‰Üz`iĊ."Š nƒZ…~Ŝ:9ÈŞg)4ÚfÜh!ŝWßVÓ͇z·3X§àN4äü9*Ÿóş „ò‚`ĀDn6À;£ĜEN†Ph1Ĝz%Żğ*p))îGîÁ\ÚĦ-·Ì2§^Ŭ´ dŜbBıʂ_Ñ/ÒòJĜ4³ϋn€4_mI^hAŒ $È;‡ëÉPŜ:ĝ“ˆMĵÌSİ~à*'ò4!„\eÂ`@ñĞ{÷#`/‚ĵÚvĞ‚?ïCğ~2`jŽNÎX˘%Ĉ- B;Bô^iÉqü?èÇġ'ÖH($’Š ĉĝ !„ĵDfÔ˘çV ̛k‰K‰w2 “ù.ûÊi€E’YnıbĵÁ!ZÌ{ÇÀĞí?!ïÔkËĞfĝƒW—uĉ–!„+íŭMŒÒ6nyύ6pAOSĜğĉ€ja,s<ˆŻĊ3Ċ†À7÷ҎŝPŬ4@uÀ”ÎAj-!„r5 ÀuñğĜ3n&€·%0W7 h`]!`fW;_€X Èk{mDV?9ï7oL˘—ô"ׁB!5 \nŜµÈÍ6…>ì½ĵ”˙÷5uËt„À§Zĉ÷\GôµO·V Dm™bÏ6cY‡@!dŞñ{Jmòòr ĉµ}7 Íav­KLҚǍŭdÀÈEäċöP|ÔmŜ+ —9ÓËÖáeO‚BH Q-j`/ò"í+˙nDpı À–Ö×é(;áaÁ­XZQ†vË[•ĵôj€ĠċĈ¨|Xv[ ÷ Bİ£G~S`p˜ċġ}È­C'£?<ş™k̖ ŭ;ĉ£5ÁF`Ŝ90òŝÑññ_ĝñ\Ž“J£ĞU Ĉˆt;êújŸ²C lg$„²Y´…Ôˆh$vZH˸Ş÷ßÁÈ,D€µĊ Ħe´w¨˘÷ġüoüĠ;#ıŭèüt¤‡C 9ŽŬ ƒĝŠVûgĴ"$„RĠbmoy}ïk{k- oaÜm´(Òċ9u7Ž& ä8|p$ĉC‹ä÷ËëûI#€~ržÊ­C…À"µ0˙ìË˅/.%°ċÇ!„rEâ‹7äF r½ċ…^Ü` aĉÚmP|]úpûâİjq=î£%­f"#KÀoÌ8ë—Bs} €ż¸ŞôHëy íċ@ŞEm]ˆ,uìF İŽ˙ͨ3 ĉñŒŒVc?vGĠÊûjFh™EQB!äĊ&2.DŸȍĈ*ôéZ—XF7Ç6:m–ÄÀĵuym?—·ö˙cy÷ ĠœSŒ–E²˜ „²-5ġ­çbˆ0êٗ7öÈÀ>§C§a!`— T „!D`/‚ùêq*ŻìEr$ÍRìĉ Ñɛ1Ä;ġ!„lċÁ>~kµ {n<02 ífn"  ´”_<–vğü>Ğ{ÚÍŝsûŬçf €mòĵ…aB!Û˘Iŝklœ÷ï‹aˁ†Hú,-œbpœ—2ĵ ˘?üdñ, z)€¤R‚Ş6ê_§…F!„ĴËA íy>˙oŜ9Zö³ë P¸˘z‘ ¨JĜE >:À|p-—W÷ŝŻĉ €ms¸UY @!d;m;T!qᕋ@Ÿ€4wij›qTcżƒ e ‡QŽ=3· üÀf ]·§ĉ.3@!d[ًœwê:ˀn´£Ù:µHŜÂ⠇ĤĝŜüÄ͖ùĝìY‹İŜïêò€ €&”Vĉ ù2„BÖᔖż/oÒU@%nE0íän?€ß¨ı]YŸÄ×H9à €™&ŝġ €KƒjM!d׌İĤnP$Àaìjäö#7à<_ l'êçlÍEa(€WZˆŝ™—-ùöĵB} 'ı÷Mˆ3“ü„BvÔ›ŝ(`Ŝ:t{ÎSèùĦ-żnä|šŠ'ĉ b$µŝt:V…ħA>8†ìEŭxŭŻ^L€BȎ`&üW{óû7Ù3ĜŝĥüĊw­è+‡Dš+Ì×y½ ĵı˙“òŝaĞĥ ·÷äÖáƒj @ä0ö{ŒÍfú™ „²ûħ€ÑĴ~µpVnîdnjd<  ĠÚ)şO;DĈ-"jÈĞû0גT^Ŝ[ŞPĦè"2WÎWKë‚BȚ˘âĈĠ†â<@!úÚħË×?êC;0È}ĝNü›ĤğD,L÷e?ZĦ €„°?ò„BHu÷D€½’ìZuŞFäçvŜŸW9DÑy €ìĊ0oìC^jŭü}ž-oXuż-ÔB!¤r4À ˜Ô ŠU¨Uè“AQü7­êßÖ?¤„„X ïÍlŻf¨şQ†‹Ĵ‘œï5!„rÁ=×Â@,wLĦ'Cݟ.  ĦX'üVX:òĈŝÏɛûûġ €`½Ô CĴëudڞBÈÎEÄĠ'EĜß˙L}6`iá/–ŝ[^n#ŝñ›‘ö³GˆÍ€Ş„vĉ!„qQ\q^,+/µÀi sW SŬş6~AË­–—Zż w;½ú€ĝ°×ïB!•DxÌ7âĉÚĝ::ıÑö"h7ƒž żY°TŜ˙b8@ǝóÈÌ<Ċل„_gX‰u^‡2Ğĝ‚BiDğPx÷IäÚU!ışÁPtF `Yŝ{ #Ż]+"µ €Ĝĝ~¢V Êñy­BÙ2À„e=Ĉ ë9NœM0°E‡]fW›è%Ĉ‰ĦŽcÈË­ĵ˙[òb„ŻİtÒ\ıK!„,簆À½*¤m ×Zn/À>ğñ½£tğ]Ħ@á& Ĉ~ŭ°{Ì@$5":îÑkĤğUâħnBÈ`Jzš!úÑjûXµ`â{iD?qxİĠ“bÁÎb ³1†ùg£şž{Ñċĥäɔ'ËH!„mbZ5dŠ™ŭmEÓÔİu_'ġ­JÚX+ A,nòĥäúSöû§İĵu • ½Óé 2ßCyußŭĠqD Nd]â+u,B!äòñ‹~˘R:àF è[èóÁh&€ëy#° óò°Ig½9VĊRµ&`íŜ7Ŭ{B!ÛŞĝSŝ;x˙ħĵ܆ħ€Ĥ’xqÎ\`ċB@#£Ēàfĉ­Cw7Ûġ óĈ~1½ˆB!5D^ˆscƒĦÙ‹Ŝ’‹ÛA`rë·í·žiM@6_P·è‰s0!„ˆÈĜ÷ $öĴÂ>éğüî†H(”égĝèÂĵd‘Û7ËöHĊż„}8 IDATż‹ÎNô0cB!d €“QñßĞU e 7Û SÈJ€Œ;ÂZóxeƒfHDħ'ġ s™ŻĜ‚3„BĥUôÖ˙ùU½ĥġùŞIŒûŜ¸Ŝ@ eIÀ?ĴU ‰è?B!ë&xóĤĴä~OâŒí¤xáÏœOûmƒ™5ÈġP>8zWrW3TƒxùĦKZ( ]üyÖ k!„l³ÏpÍ \˙•ĥ›xà˘AûBÍ]ŬĦ@1Š–›Ž!7÷ [§°ĦÀÚĈžBÈ#´ĥ"WħsjG€Wé¸ j‹˘ @"£:„j@$ iħîΛC!„Ĵ“XŠı˙‘qZŠ+G*üž¸ˆ‚,YˆÊݨĞ6Ĝ °îˆ²rÖ!„u9—!Ô/(R ŭĵï °0”Ô ~=̈›.|A%Ïì‡gĈ µ:ÛzQŬŽ7@)„B6ŒÂyùA‚Òr;Ñ;T]K`(\FÊĥÀúƒ½òÖÁè1Ğ“ñ²Ž|ĤÛñ\•H!„ŬŠ”½sc€ƒZŭê^µêĵ‹ĠSÒVǗ e.ġWv0û\oîĝEÎÁbĵÂpÑAçY%[m:%„²fC xĝa {˙FfëW]}2â7úyo¸>" à Â&À÷anîıĊe½h„BÈ.afıŽ y˜ŝçÇë uDŸ!àÓŜ’ÈĞ{¤’0ŭA#´#İ„BHA–‰,sf!oìVĦŭÜìAWK™O(ğ„D‘¸hƒ슃€0ÒŻ†Ĝö:ğy•ŝ–E‚„BBĤÈcä{óÛĉN c_ hQÌŜQ,W—&ßG‰†ĥo~ígV}Ĝ =*¸ĵ‘9B!;l ¨Ââñ9¤7ÀO ÔPĵ:×déC‘ÀüŜĈ>tÌÂ0B4%„qi3'„²cŒFċûı ˆB—fŝëɵfŞŭe·já8‹Q9N ÏS˜¤ê:àŬ3²!„­ (­ ;ˆıyĵҊü˜^DĈm\u ]AĞŜ™÷é…ÜşèBjĞR-'MÓó2F !„l£ƒZäùĠŞûïƒĜ‰ûżfÖçìĜ0iˆDÒ24_`„ĵÁ~ĵxzŜ6yŬRñwh'BÙZúb ÛúRëÄSCċŝ²B%Z7C,wa^?X`ÄĈ…$ô’ĤçÈ˙pÔsI!„Ĵ[˘0Ô¨÷ôEĠqÉû·+êk(ž×R+`'T{fĦŽŠTUU—ĜŠivB!Û(ıâNÓràj´ç#ı:5‘†Ĝı…Ĥĥ½üo/hJK4 FaB!dW/ĉċ1ÀFœ0Wè K ƒ–ĠàI´~Ú`˜÷ -£ó €\c¨ž¸’ĊŠŜŭĴb@mà Ôĥĥ@CBÈv`Kŭü6ÄçŭĠ Šȃ·BT}Ĵġ8r-‡m?kÀŞÌ5ô“órŭ‹€îÚÑòáġeŝnŜàŸ*CbaĦ!„í rs€U}kžġß˝ŬŽ€Ħ˙ŻŞaâê Ü1}Ày Ê(`ġĉŠ˜·£¤Q¸NyïBïžBÈ‘û`şw`ĊÀ rf#^ĉRĞN˙›Äĝq€ĈšÚŠsdŠ}Ï?İ&ĵnĥéBıjŒŞŝ9°ı1Àı7˘•ĊÛ˙Ì|í:äZĠI€ñ“YÎ߀r3żO!d§Ä߅G…ìâ6´.Dß6@;rí€ĞFÚuÂQô<´J rE ĉŬ£ÒRy !„úŽĞŻÈêSĜĵ“îû˙Cżŝ¨hpĊm€ÖÏqĈG/*‚·Ÿ_Ñxĵ*S „B֏”4'òblü`¸žŞ#ÁMÄr5ÑñĠŞĞ5XĤ`݃B!/:ĥ´ 0S_ àŠĝbÀP$(p˂–MwOĞ{rä fU Ë÷BY9„~?‡Äh· öá˙Hœö6–qW rıž@µ×q„BÈş;ù-ù%Ĥhlçİû”ğN+¸_z2 3(Ĉ+´UŠEWŭo"B`xBıa€Pìŝ~ĵÍ¸™¨¨3˙fRĥ}qĦÂϨ”`.ŸBY=ĥĤĥ(̋ t˜ğŽğĜûʎŻ4 ÇaUÈQ ÚÏwÍŻfû!!„ÂL1<òÌ:c ó+€ż7ħN&÷m€0€ìG¤A`Ŭ‘ŝ!„²kĜI/£‘À? P´ tÉ ­³49ĴöŬ:È’[‡ èUr)΄BÈQV(t4‘/´†=ًĵpûqÀ‹˘ u˘˘nĦUè“A€‡pcs„ !„²ŒûÂúÌOTu^,@?&¸¤·ĤáµZ¤nVq°WÈGn\ᜰDħà€B!S…8ğU·(S? òíZüÎd(Li UHËħT4ÄŭħìEÀqâVÖ},ñûŒ8BÙYÁżàŝĊxı_Ĉì·}€`Ìtŭ[6 Zì /µ V?œŞBÚĤd‘`zn˘Â ,eħL3F!„mÇ\t‚pĦ˙ÌwXW {ħ×W˙wM* ÖŽvèI ôµ* ‘\KĈÌÔ8²iȐ¸`‘1MA!dèíR-Y#~ĉ6˘Ô@b™Ż…uġTKĜÍҊŝ˜İl½Ĵ"ĉ˞0!„²ĞLêXH äĥĦ{ĈEÂ#@>Ħ·fÉcےÁ‘[ Ÿž İ=ŜŜA@³ŒŒhUDŸBÈĥbµˆ -[HùV=)ĵu³˘3ĴÇ  ô‹4_Ô(^pu…/mPÉ !„ì(Š‹E€ĦÏ:QÖ~´‹î:iùBÀ¸HĴĴĞċżO3D?zĜĊ5Ĝ‹.GŒÍšrL-BY7S÷hĜà[1´…ĜĈĈMŒgÀ/{⋠ud”èÈQS£€wÉYW0M@!d½XŒŜÙRo˙Ï˙oG.=ğê˙ĜwÙ ^Ċq-‡˙@jĦ'ChÚĜ2 -RÔ&N…„BVašşjÉÈKŜh"½^\ÁžĴ#žı6@}܇žg#ıİŸÉexĠëMÌ4!„U#“šâ£šûBÀ^DiÇîwŒ…‰ްĉĠóé£>ÏíäżĥèaoT66îéŻó ´!„4W(–üĝ@¨ÏġÇ&lÜb&öc`š1ħŒ˘…ÁBòRHxÔ{0Ġ[‡áç·Ä•ôr—ŞöıِBÈ&ĵ-}ÍáBñRèĤĈ…îXuż.Íj’úM-`0?\=°°‹yqÎ „²iĈFĞ˙˘c€t˜ğŠ|ż Pb· G"Y}äŭ4óE‡úd0:Ċ€8Œa>¸´Ìì[·¨NvĊ"‰ı› i BiB€ ĞN·2ëB $Ĉ ?ÄNûûeJġÍr…ž GS?´'ü+£ĊwŠĞS=Ï!D„Bš0´ô ·(ÌĜJ}ú^oÍêî…DîÓƒz’*2÷ ñBŻ;Èa2 @jzÉÌİByQ0%Ğí HsÀ*d/rż›DŜıá-„SWԁÈz–AÏS17öµµÌÜAXû[>xlê‡È3zԄB^FâïVŭ†˘;÷oZh˘ŻöUúËÄĥÀ%Ċżü7>2ŻVĦ§)ôéö|xSÖT~ÊĦe€B)ÏÈIĠ…˙áӉ)<ŝXJ#€h˙+O „\a· ×[n‘ÌZž  ÀŠ „²#ŜÙÏ­wŽ](ƒÒvái7@Ĥ8ÌĞȞNœÓ0‡ĉZ¨ĠXS•ı5bšĥGí&„ò"G†n/Rë ˙¤Ĝĥk‰KuĞh§-ŭm˜:˜ğˆƒ~ÚËáz—7ÏĤeĝĉB!‹„wJ\s[Tĝ1…y-RMF¸ÍG>sġéúYßÌĝĠĵûiùE€Â°!„ÁLhŸ_ü£İu€2 ُ€ĥ)‘jܔôùÖ|µÖ zôÙj??žoÔħF²5½˜l „²¨˘ú µ~ÖżÛŝ'‘Œ)•ßeŬói5F Ï‡ûŬDïvD|lfB½ RĊXW†@füŒ†!„­S{Ì’7Ìŭ@?ë_Ġ-JÜ" Q½Ĵèë´sh˜0t#ċ(֙ò­ŸœçrëP!°,à#„B*8­“)€ÌW˙ÂVŬĴ˙ĸ™:ĈŠ‹ĊĞö˙ĞĊ‡ôa×­Fñ3³š˜<1L /Ĵ:݈BÙeì]€ Ìş4€Ê(ß/‘éö&ĥ˙]ŝĠt2èYêöNVѰ y}ŻÈQ\&şĤÇdZBH“ÒŠÀPŭ ò;. X½]0>~â„È~<°½ìïÊûG‰Ŝíèb@d ıÖr›ŠD.W,ĊçJŒP´ !„l÷?~÷Ó÷àĞ˙>¨ŭÄčŬ—ĵ˙݈7@† Zh?³ǒ˜QĴ"^ô¤Ì­C7601ÀµÄ+Ü´—ŽÂ#„BÈ:˜\ŝŝÀ{öa`$*~ pyŝSâĝT„½ú¨kšŠĵ8N<÷ …a#ÑĠ™'ŞcżG!„ĵ@€Ñ÷%/xhŬ  èWŭJÛ˙ …ƒÑŠÓ˙&ï¸ŞnàÓôAÇèŬ”ùzĜ†=VgżHL BÙt`¤?aè|áŸ˙j|½ı_ŒĊá|ĵŻŽÓJû¨íç3Oğ:ËoÓ6ƒ°€BȖx˙ĥ$„ÖyŜÈĴóƒjPˆ~äÛ§µ˙5ċ$[ëŽÙÏĦO}‰£Ÿ6_9>Şn4ъ0iĀ˘€†ÎBiBxC @î;R- „È·Šoœìkjû_ĝ~hĦŸ÷Ħ_ôEÙËŞš­XÖc_CˆƒâO!äÒ(ŻÔ³n ŽŞ™Ï½ĞJ›˘÷?6Íj’Nq¸‡në ~1€žĤÀÀj˜˜ßp-Ù=ÑTŞL˙ Blm1ŒÇˆ£b0XĊŸ˜B¨™_<”ZĜÏz@?oë§½ż2ùg‹]šğ>ñä!„mâÂèŬÒĝ][ ŭŻ?2Xš]<ŝqÇ~>„~ÑRŭo§ŭÙfRÚà‹ĵŠQ`À4!„ĉEWÍ\ĝı˙Z“/FĈ·ŝ™Rz`ĠÜ9 Y…ŭĵœĤÜŝOĉëגÉ?½[‡-?VÙ@˜TğĊoX˜ÖD#€BÈ*Z26üG]îßWŭĞ +€ŭŸ–q˙Jù˙ÉÇZĊAÖR !Êú  }>:YW“‹™Uó&„BĤ0Mžŝ3Şq›{‘‹5ñĞf&œnMsÀ´—>êY¤Öè£ŝoÏz ­ Í7ì2kĊŸ­b1B!+ë•§Ì:Ïğì‘ €Ä÷ŝÇ2š8–˙olö?FF‡rèÓd(škž3_(À|ġÚĊ°Ċ:™ĥo î‹4ï÷sĉ!„Ĵ ĥZè‰ĉ~ÙOĊê_À÷ŭûĊ?‘@b3MĤ¤µ˜ŭozŻ=Oİŭċ 8N\H#™óĞMúiâñ"şù„Bŝò×0ĝNjŝ¨°¤C8:Œžœü×dÀ'ïŸŜë½ŝĴ|p4ġ(ñ,–½rÁ'njQ,V´Ù™BÙ9wġ‹2żöÖżĜ{ü-ú?pşİŞnúßÓ!ô‹~Š\Gow³ŝ$žZ…`℠ßB!/0Ħú?ôŭg.ïïùı˙ĦÏ?¤"3Ŝú×ĥd˜ĝZşá?úl˜XÁż>ïϙĤ„Ì26àĥ†ï !„l!ĥĝŞa_ĉ53¤Ż%x˙fúÖż&œéÉ. ·{ Ÿ~rîĥ˙}˙ô“EĥÌtŭ—)Ġ ³„YÑp•ŝ,€†!„Kx;÷˙O}€Â-Ş3âêĉB$À”r˙M ¤“q áÔüÀ„*pÏ~U<ò]óÚe „RÛ\çï+˙uh‹=Ħß?1£ħù›972o ôsĜœŬ°ú÷ä½JI‡x‘ʗĵ%#ËyËÖ6û¤×ŭÚR˙ !„” ßcĦĥ7äEmX£÷oÇżWU``ĦûûĦfz˘wğŞ>\<Ï 6_Úr…D¸áÂÉèâ~z†Ó !„ìĥ9·Çßс´ŒËŭ‡˘żh…£=^s—–°÷:'–~tözŬ‡›òS½(Ŝğ äÌßBiÊóŠv?‹ÑşŬà(KXĝ“$2ë]˜waò€†9ôNzž.eOT{1&§Ĵ(ô2ûZ5ä’[^ü„BÀ{üĥ˜ù_Ò‰à"‰qâvëI%›’ €†1ğġĦ_ôûÉ#ïí×yȸú ˘ÛóĈ0OO!džvġ"™-d·ŝ!ò­RrL×ÑúwÁ(ñ­½ ö£Sè³ážv²ûÉê<ä  ĈÙoZŒÊE &„²6C@‹J˙0ô'Ȑ7î׈‹Ĵ[ückÙ0ħÀYû³!ĴŝÛr£ġwìï>Ż•ˆgšדÊV‰Zğ=o!„²Š÷Ÿ[×ê—ùe?iZŝ7íXŻCjáÒ y8Ò:°°wÎĦφV;Ùuİ-ÄñÂp6PÎùëœ{׆BÙ.ԋm^ˆÙûw}˙fÔ÷(k:Ÿrîŝĵ†9`ûÉ9ôÙ`Oït~q™‡Žwâ İj\ĠĞì „Š~AfĦı/üS-ÄWàZŝŒ‘Ĵ[ü§œŸfÎûǓôӐ鯯b[:{됉uB!WŸ$w2ŭF=µŜó· ¤ê´×¤9Ïże ­0ĤĝÛ eÁ5ġ£ˆûı ˙Ÿ €Ôŝ[òŜáR=z“€ĥÜ:üY@úöx…BıœhOkġĥ(ŠŝüÀdêvŭ8OĴß_Š‚żuŝ•½o”h'ƒ>@ïw‡úx҇½ÛDBWµÑ.gĵŸB^HÔ+^bœ gyñóàŭgH}ë_˜ŭ/â\ċĜ˙],ëí÷Ÿ4LÂÔ?żĝç9ì'çiŝ›Onë½Ĵı7ğ÷hByA<~÷‡ĥ0lYVÔÍĠÏJ ,ÜZߐë_ġ/kġ;GĦ5S oaïŝƒÏFn›Ż]‹ôngiaœ_¸umuTpB!ġbÖ"ğLÇ~Ĵİŭçöğž1nöż3,6ôJû[h?ƒŭ *ˆġ<½;Ú;Ĵà…˙­HĠyċ“]‹%Ş4¤ÒûN!ä'³#ï}\â´ŭgÏ?ƒŸùŻNüŜû фM£~ŭpßB€‡=èÉè½îżÓ`€Á˙—·zäFiÈA ìdz£ï› 0}O!dQI¤U?)ıOĝÂ? ž^ĝùa?£Qż²Ùp¨µ(LÔ\a?<ƒ}:x‚ĦŭOċÖá᪇ˆ§)­@Ĉö KË@ö.{d€ŝÊӈ „ĞKyoùg£ï1ÑSoÇçŭ‡ß ŸçŭG²ŝj˙iZeXèi Äï½—ó/‰ó'hG—'ŝċ§™ZçŭŸg°ß~{ż#zğӒŽ˘ĤŽÏ|ç˙`üŸfŭó:ÚW}Hk!d…?äáÓ܉u™ñW¸Vşàŭ—Mûŭ‰'ÄżbóY#Œĥş…?ÚËŬŸÇŭž O@?>Ï×kÔzOĉ¨İ‘5›|7!„lħĴß[e o Qµ˙„ĝ €Äċŝ/ˆĝ~“Sd5Œ#0Èa?:…}:<Î›>”™âg[í#Ó{'„+òsëfù›kß3;ó -µü•ğċŠŝ$)Í (+£lĜáÔ0ġ/‡ŜïBöSŝ'ĉĞÇûÛTcǽŬéÉ­żşU2kĤ\ „B^ ÂüĜ¸Şŭ–´˘„^ú\¨fâïÇüNÍùÇĤĈ7ò<áRİχĦ…ŭè údĜœŭċµUfüüjŞ,ó˙„²;ž˙¤%ĤÚ=\KE~Ħċ/ˆ˙¨Ŭ>ì?Ï?'üIäùúŸĞ7T4sı{šBx ½ßµöq˙żÚ”]+LqáßHxd…6>@!;¨)Ĉ§Íúŭ²xĞŻöÏáÄ?µÛŭ"¸œŞŭMñ÷fbòß0ÛÜóEнzżƒü;'šïıĠż)oDë8¤İ,u ‚µ]+Îcr-0!„lݐĝ\˙˘ĥo3Eƒ,F…~šÛŭFQ#²çyñOJ-…áħZÑúŸnpLSèċ°?8…>ìŠ~|.Ĝ‹îèƒîZÂñĴp„yó`ö&% ZUä2ı“EóX@!W“ĸ•½‹„?BÊ·Z´Ï•7úevüßb÷˜ÒŽü ˆ 9eI “oÓ 8‹ÁóÏrèY {Żŭ´—êßöwğ3X×Ħ/Şmì #0_>öÌò…w‰Ùŝ ŽÁBı|á£oçéĈÈ'ġ‘à âE;w!µ!äÒV?Ä? FÀTcCÚY:ôQúÑyŞw;˙@ïu^“w×êòĈ Ċ1žaTéñ_&ÔnuÁÑ´`³0B.ÇùjGnÚŬ0T÷/¸Wġafèçî›0ċŻĴMamdĈ# ­èbíšbs{o|è_3 ô2èy†ü?†ŭͧ‰ ŝkùàÈèÇçk=™Ċƒ€BѝLê²Àë 1Żŭ˘,ô!„ì6â=Ża^˙"ñ/‹wî-Üp ˆÏùÛ â/IäRaiP7O@/ÙóóóŝÑρ…Ŝí@ïwUùs½Ûùû›8³ĝ}`/š.ĵë˜ËŻ—ô·´0!dCâ§.Ì/úì²Ö„*…_„˘àŻì”†•~FCĤŜĉ­nÎûĦ˙ÌBû9ôdˆüğÏĦO˙Ü:loâ4ĤGĈ:t³³ŝ×­żşò/BİË,áçšNëú =´EŸYĵ}êZb)†ŭ,Zh·Éh@GZçŭŸ aż û­§V;ÙOéŭÎßÛÔݘİ<–ƒ—ċ‹—ùğuoT ĊŝÏ˘šmƒÔ\¨-"6ŞÛ#ˆşâﲸBŞuœ² E}@PĤtÔżoKùŭ´$ÒAô£’§Éĝ&Àħû}i1$™/Ì ;šĥ$şxÌ`àô3 ³ÈûìÏTŸ  w;˙ŜĥĵŭñBËo߸ÉJ—€{z!déğ}÷q³Àhˆ|n_.:d:*ÎSżĥ×Ċz:ıWŠó]t̙sVoÇ[Ħ µ.ô’BïwĦ?8NS ³BŜ>héŭîp+.‰…Ŝ³˘ZñÇ:^Ó eĵpLĤ!ğŠH³n²@Œ¸-L‰xÑĠrž?ÓbŞ_éwF‰êeħĜÎҝàùÇĈ}wĠÊ˙Ĝ ާ,6 ğ ĴÏûŸç°÷ğ°żúòÛç@'ûƒú°÷·Ê&œCı–\|Q'kó*âérÚşĦƒâOÙUŒĴ-•‰û½‘)Ċ|nxŽ t,ĝŬQŽnxOú…ç?Җ҄*â?ë^ĞËǧÖS´ä­úÚZ=Ŭ0,$Zèiô2Ĝo?…ŭ´ äö§Ç˙dë‚B•êĊâŽ*Vh]5]gžNħ6 !d<úhMŜQù6mPäÜËΒèP½/2š×)Ä?oĊ")iJı?–ñǜ6ĦoT8¸ÀKdĊݲä§üúähEÓuÈ?Oä.ï2Dŝ›O`?9ï,ÛÓÛçw/­¸’ĵF²ı }ћħlhKW0L!ä²XÇŭ·%ˆĤTԇnğrK Àyŭċ{°NżÏjfKŭJ^9²Ä\ìWŽL;ı s'Îİ/ÀkÇ@šWwXçéFìgD2{¸PXVÔÏĦŬö[ϐ˙ĈЏ{zû|kĞ×≗1mÄS_M "„ußг}çŞèg-Áñ?ğPÄ7˙ìĦ÷ayÍìĝŸòñƒÒDĤ~ŒGĈ<ŭzŞÎŸëÖùFĈjxħîĴ×`4ÀÈBû9ôd}<@ŝásèÉè'ç"ï½×ŬÊ>´äÖĦèíN&ïŝÑċú"uşUÔ¤ÊŻ*ŝÒB“9îı÷¸yȔçnĞ#ϘÎ'ÁĞ-ßEfñğ·—j^ê:ÜĊ˙wJï ÌEjb¤H”udV‹ßÈûÖ˘ħkXOy$p•Lı- n›iñ Îyž1‘Y s ~p’BŸûôñ ‡ŭyÄĉçġNg¸çİoHÉÊÛ:X HHuƒÚĴ 0/’`kĊרé;_ĝħYúċˆ@9”/Sê‚›%ŜçĵÎu´žwâfÒ1Š 2ĊòĈĤêü%>SÏÉ×uSÂDż½ù˙ûö^'Ó³4–L˙Wĵħoô³ŜÎlž7àž ĝÀÀqRñŬ`-€Ìysٔg]ġšO ÇNT%Ş!TBRxҕŜú#*~iNeO*>xŬëM'<~µŭóĞ'02˙‰—ĵü ŝ‹Bŝ™-ŒŒrwA´c7,(‰\Ë İpñäÀyôóöÓÏÓDowo$ğ$ŝ…0‹Y–V°È6¨˙•>LÊ;-YZb]Qê%ij~6› \T Ċ‹iĜ³Żóx‘lIJ,¨”NÌç½–u†…bÁICb‘ĝ—=òzhjœo¨ÈmħĊ/‰f_ᴇĠ½ ú¨ü[ϐ˙ÖĊƒÄ~âŭèŭnşkxá¨]ĵÍ†Ċĥñ°' …ŬY­xêEĵ,Ìe~ŜP­à­ĵ7İ÷µjž=Şàë×ÔĥzêU/xèċ×L"™;,hĤ“XöĝsŸ;^8Fjè‡™ŝMċûsğĝŝR(eñïe“!p–"ûĠGÏû‡=Ñû]‘·"½ßÍwñrˆ/XêÉĝ–#نœcÓ7ĉrßè䃇P[ĤĴ9XôžHĊߋú{ í3İùğë0†¤â/?ĥÒyVülVıB!˜4üĵ7ñ8›–ì„ĞŽF7v39ĝgÖ ‚\§ ż{QĝµÂ[şeŠċ:MMÌ ¨*ŝƒ:ÈĦÏSèìÇg°·ÏĴ~10zż+òÎÁŜëvwġV_ĝìMZàÓ^ĞIï_ĊOV› jS5"Ħñ…Ûê‹94¨Ş˜$R½rşNçäRáü5&R!„,…h/ Ş%V|ÏŞlİUĥ³Ġ°ì”{˜NĴŜ ŸÍÈ,.'çL WS[êé—Òïê9(·2F> פĝ·"—ïÌü薙¸{ı+<π§Cä˙èìÏR=K½Óyû`o—Ċ˙b Ş°*fZ~c–Ü6E Şë‰ìë(Dӆo[E½ŽŻ#Zfj§Ġ­(ŻrÜ*ƒX-Ûñb­UŻ,ŝċP˙…bÁ :˙>Pné ˙ŬÔŭBá˘êĵĝ™[üÊŻƒHħµ0S—óïç°˙ß3WwûܢŸ;ñë@ô~·żë—Iĵ†`̌°’Ôş+G#)e~ˆg×;ÖµDäE dÔ}éê„ÏטÒt~­˘7İ^uOvó³„A:iH”ŝÌZ×[Ġ÷ ‹{²†ĊîO­+ú›ċ•W‡ĥG}^}:„Ŝ=Gŝ[O]Ÿ˙yfôöıÈ;˘÷şWâ€~ÒQıuĝKŜŒ–r gĊœëÉŝ×1kRН_eÏUĞ_l•# äÂMJk\OĤbûSŬ—şÂ{saK“‚­Ÿû&óŬäĊdÚĉ½‰˙ÖŬìċ·Żċaî*ïC iñÏaŜÔʐî˃BÚ!³.ßßÍ`ż{‚üŸ>ž z:lëŬÈ;{zo÷=˙ñ€_†ˆ]èGÙŞBş„`Ìü›Z­ÌX<1íĉÌĦ+ËëZG9_#\ëU¸ŝË{ÍĞX,ĵÎÈ6cĵ@pl€µX“ÓbëÜĉnO÷7ıĵ§|.³Š‰eBáB;SWíßIĦχ°ß=…ŭöSè£ÍAïv˙œĵuşJâ?iìUz+Ğ1-óĈÎóĞX~US²j¤âŠyáU^Wí:Öûĵ·îħëĉğĞÜÀëñĤ“Kööç´ŽŠúÊ÷òܝË\îiáŝQ‘ħ,žM3--’ûÈĊ ‡}6ž `çù÷žCïwĦç)ôNçÏ€>èŻÚ%O‚ş˘½-smwnG½şOħĦÈɲyİın`úâB^4Ĥ–ŝ{vO/‡ĝëŜò³5„Gm=³ó£~“F{9ìÖùž‘˙úĠï³~iŝ_ĝ+Wù’ˆÇ.ŽÑM¸Â 3´{Ì*\Ĉ³ž1U²ÖĝÍEż:ê…ĤÔ5ÚJµ&[+>÷uyĜurŬM;ħUòŬ“ŻASıvB^T@†bŝ~(Ü+/ċ)ßϧ ˙2#n&ë4=8.*Ĉœ9ŝÓĵŝ`ÌdÚ́^}Ĝ…½Ó}ԃ>öËŝĵŜéü5ymïJße.´Jb ó<ĤJaR].Ĵ.³N{‘@@4"q($hÈy…sµÇèbіzÂ:ڜĠ´°VY:²ÀÀšI1g=—‡†H…óŬ„4–żNqdÂXŜòVżÉûtÙËaŝe>†Äżœ"” ÷^3eĉEXvÔË܀ŸÓxÜGŝÛ'°ż{â&ü ˙²>ìŭ5ÏûW:A<ž° ıÑŜ;ö£éo~ïĜHŭIz W¸ÈRœW…½¨­É”.¤\½Ñ0ċBZKAĈ/䅺^óŞFÊ\ġ fĦ²á·¸Sâ;aıÏĴûë䢝şÛWÀçc^ž+›êżoĤhW Ÿş6żçCè£ò˙ûs裞ÚO{‚³ô`äç_”Ëg<pœĝ˘…´Œħ'„Ş…R²Ä›œÙqqԆu$´úB.É1SĞŞ?85=VY‡‡żŒÇÌÁ,„\ ì4vâgùEñV­˜Ï_•r~]÷E!üUFùNëÀÉĠġí[ “A{췟Aïw`?<…>œê߀È_ûŬÁ‹iL‰Ó^èËĥ³êEIÑîR26DKyŞy-$uEğJ a^ÊEéD²“žù˘z—*÷RĊ”êÔm{Ó£‰ÚĤÌnî>TööƒS9M“¤$üӌT_ès–B?íAïuażó öv§ŻçéžŜï^{/Óqà<[Sĥ&Mt4Ù sÄo–A²”àĤ˜^ü¨.0%Ïm°X´—İĜoÚà!„Ôûĵ-Ê\ߋlĊry;˙³>ŞÌW­vż™v_nÂÛ ҀġĥM‡-„Zñ>8Ż%×èûá>'Cöżß…ŭŜsĜïœÀ~ÑrûÓzżû·ä­ƒDìŜ:ßf €db4›‘jˁ°@¸ĞZ̑_4ÑZóf8Áôş)·ÁA5„ġzŬ‹>—‹*ÚĞ0KO¸˘ŝеӏZÏÛ{÷ËíÍ{ž!ŻŻXï}M¤úûœ83£(Páşú9´“= }܇}ƒŭ€}Íġ4`oĝû"Š˙E`?hŭʔ‹mÚքµ‰ÈB1ħ›‘B6Ë"Żĵj$²ŠÀkµÇQğâqŞpŜ´ĵE÷êş¤vv§şĊżNûqúK³_$’"ĤúĤÎó˙¤ƒüÏaż{ œ  ™}Ğ?ĊŻé½îé‹üħŠ—–=]ou/˜|N›Ü* !Û+ÜuÄÛVèŞ ˙•:šê[·ÚÌk´50›Ŭâ×è.šìç÷ߋgk…bÄA ÚÏ`ow ·Ï‘ë)ôé8ÏrĜHïvŜâÓżòŜaàmĠŠ tBàĦ Xĉ£ıüëŽCB* j^ĦĠ·²gŽ…EsşèħĴ &´[+vß×EEƒÛ"ú…J]ˆ\@€uë{‘*´ ŭ$µ°żs½Ó~Ñwу÷p·s_nŠŜí0Î †şŒI£şşl ÀXX§ôs7ŒF>U„KuÊb# r.|Á/j“ÏżBEüU‡9c7JĠ­—egpZUżRšI˘ıġ½ŭêZûü`ŭĵûáìísèƒNŞÏÒİŭŠ$ĉLPüÇ _€×ä h‰×·5ħ³9GQÈ·‹˘keĦà6R_xÓÖÂ+Ÿ×îÚ¤,jk*"ıóFß%zù“CDMÍQîż/ħqÓ`½A Ş#iäÀiêzûŭ ìg=Ĝ;çÀ“t`€\˙%½Û9çMdÒĥ#Ş3nâgW3òOvÚkHĞˆ`EoKŞ5! Z0iÂĜżŞÎBĥCVÍ2“CÍD´À ˙èû²ĝ§ê+üSWá6tŝ˙ôħ+úûĵ=ĤÈô#}ĜûQŜ|ÓĴ°-úÀIlü|iĉÈezU+xşÔî*ĈDSŸÍ*¸ žwë6w­mğà×у‹}"ƒ^J kn]dĝ,…vRèóx6Dŝí§°w:‡=h?ëĦo÷ġA·Ċ ݊à_`‰œÈÊ+mÈQ²ĝz 7½io¸Ô\hdîö@µZKĦxWùSXza Ô…"YAàua`ġj÷ñó–ù˙ŜTÍÀUdaáá –ŸŒj é™gOnûĈ8éF˙ÌİUżĥ׏óí¤°ıi~ŸœCtĦçYޝ,AjQt˙#ycż­Ÿġ  OqÂ.ûqµ7ħÊ˜ÛŞ²Ü­hb;ŠT€‘Ċ73ò‚Ü”ħxÌŞ­1µLWġÂĤµŞ}h“*ö•" /hÎ{ód³-oWÉ Zv9Ĝ´ĠĵŝħFNù¸k[sëĤù sh7sƒ}şòo=ž `vĦ'C ĠDïvDnĥ€â_Ġä0†'ĠĈÜ6mËËÒ˘8^ ánêÚİZìVı}M×ġ*•ó’™KşÊ\zŜL*9yĞnŒÏpñŜŭhqÚhsŸ”œAß×?ÈŬ÷§C ›AÏ3ĜÏ`ż }:€~1€>X‘ùeğ!߸Ú€ßoَ€ƒxFxŸ;{Z…„uŽL\Ž7ĠÄr“ŞXĦt“aÚŞ†Ë‘‹ŜŜšgÙ|~ÙËĤßÇŭÄi•ŝá3£Cïí÷r —CÏSà$…½ß…ŭöA×U÷÷²R=DnßĠOû÷ùĈ-k”ohö’?\aâßX; Ž.*ÍB5('6ĉè”Cċ3œ”BÍZeKĊS[”Òħĥ™ç8úŠ˘£ s—=żyé½lNQ`“SôȆD_V[´VöâÇFµ]öÊÈô{†+S'úO~}6„~r{Żë*ûŸ  gY½ìÀOëŭî/˛ûmĞÂ^Zf,ô/£é{ñ mħ*/‡ŸS EŜÓH^#@W[-o“ùâj$+¤˙À-9™{n äĵd¤41çŭ* {•é}é0‚kï{xCĴMd5…w?újpħ’†–hfŬ=?Wĉïç“ôÓ>òßm}O€"Ġ“a‚ÔŜև½oʗö@2׿š[/Ş'I;Zìè.Öà•–/š\XÜcbäÒ죍E:*FCê •BŞĠSóĤBê‹â*·ÛñğÔw5oğ'ŝ"ġ§ñÍzĴ9‘W‰Íĝġ1kšZw­ö3èÀşI~Ŭ XäżsŭäúYút :°‚ÔžëŭîËòĈs?íq¨O#@Ŭb3­/a^uyvtîC˙ÖÍ/–Ü*gEïŠpWŭŭĤ ٚ~ßjM‡mákÙDU:úısŻy&Jy*ß´è›÷Oġô§ĉ÷ŭ}"·³Ìmëë8i½Û…½Ó}Ô>ëA{9ôd!ÓXïuG¨Ÿġè4j("tïËÁġéŜD] #—Ó˙Œ|µêĴNġ?‹jŒœœŒPם6m8Êäv>|ĈÉ£]ÉV˜á>&ô ÄĉE ç ĥ’Ûœ‘ġìD)ïZ‰äâÂ7ìÑ<™âċËDDÖŽœZ7½İBŸŬż'CWÜçEߞ ç)´ŸŸcÁâOáYúw䭃}}íñâXƒ w:ıu¨S/½$şüûdgÀęjn!ꍀ0:8XG‘j…á³Äħü )j,:YÏ\ëE&gŻ/ZÛĴ+Ŝ4‹ŒÙœ£¨IƒÌ #‘ġdBܧ–sûAóC‘_˜È:Y0úĵ”„?„ú‡Ö…ĝ‡ú¨=B?:Gŝŭç@7ƒ}žBĴ´—µañ?êŭîÏÊ{‡1ŽcĞşŒ-Pĵ‘RÙm°…Ğš§*=)-ÂSŞwTÂÊ`ÑâB\BhµN;[“^Ŭd>|‘×͏Eµk-[1/Nñ'UĊêĦy]ó9 .çÍà/ü•˙fAŬ•ö2×)â‡÷„p?Î]eżŭú|{ğZŭräi=½ßŬ“·|ßíNĈ‹mÀ4'3W·syĦ@ϸĜšĵË!ĜÇTß"hKŸRŠ`µ½Ž†Ŭ@>üE‹"g̋“ ²jKÜVDˆü¤W?ùY™ü™Yv0suEڝ z–BOS·´çQöA×µñ}Özŝßğ™"U`h#ŭĴ'òrÛ-ÀżËˆLħgD¤ìoX”R $Ĥ€™³÷şNq\•œ8½îê˘ğ¨")qÒ4Uĵ]Ñ÷yO£\Ġż°k£´aϔÚ'?‡R6‚ĵĈVàçê'öİâÓ˝蟧Îaïœ~ŜwĈ@7s?ˑiĊż‹\¨Ÿġ~EŜÜ7ú°ÇğëcĈĦŜġ˘·‘Âú[·w] 3;ŝ!}ċJé­8ŝEıümMvPäImá[0ŻbW<ôUÚ)eÚ/M¨½àb_÷‹b=™ĝ[Ż‘Zôz—e ñü2È]ïržÁvSêżŬ}~>pá˙~ĉĤû°郞{†oîğÙŭ˙KŽˆ·œ÷L3àuw ”#áúÖ d^@Ï}fßż4Ó+NHm+y˜ğ.àĞFÌhLáÌĝżż†W~|™ĝÛKR†Gna›ĉš_‡zšŽ–óèŭ.òÇ}èÓ!tíeóè¤9F{ı@ñ>ìŜ;Äg÷oE@áVé z’éò˘Y›h”)FÀ‹àهùĞX²ŞoÀEdxÖô÷bf µT;Yħ]0W_Ìçî³:ȋjŝĦĞì×Ïz°ß=~ڃ]{†9³Ħ˙}ĊĴ>Ġ‡½/ËÛ†žm5Ž‹ı j×Òf›Ä4-³ĦĉEyq†ËÉĈ>ùĤıuŜğ*âM1‹*êE;ëE îM½W!´ŸéHè1ÈŬ<ŝÔmċs˘ßwùŭÏzîë£>ô,6„÷{:È÷ŭ ™ëzçüä­ÑûlçÛ^`hG£%1îÂLv@Xƒ¨†ï%Ïy•(%ĞıÒ’BOŞ\#sÛÍô‹GúÉe‹>Ëŝû˘z€…- ß™·×Tx³†÷ ‰qÏ9œ§Ŝ·.ĵŸù‚uĠü=WÁçCĜğh×Uï£óùŭÜ ŭ|€LÛÈ,éŸÖO{ۋŝŜèU|ċ]oĞ €vTäÑ˙ż½sù‘#ËÊĝw"Ğ\ĥĞz€îÑ4Ĉ´ `‰ ŝX"ö<4Ğ‘XŒ€Ċ‰@‚ {4;#Ħ‘X0 xh$hğŞÛîîq?üÊÈÌxÜ{XÜ{#™*—]Ußoa•+³"•q÷œïŝ˘§ğÓD^ê™zGè—.r SëäE#sÌ ÂĥW_ô×ïÌog1Ò[ l-İ0NnçĉÔ÷ŻwMC(Ŝƒ‹ÑúÊŭĈ¸ßŻĞo}Zßëñë²qİŭ/j÷óG+è&ġ1jal£€Ċ7Ñèoé£ġÓïŝ†_ôËà Ûfù~×ÎĞ”<—/.êFHrŻÈٍ‚žòµ—uLgR’³ŭŭĥ4{ħö É;ñŬġşB÷`8ĈÖĞñ-›ŝçq?{'@-€g tÙÀżt=úOèĤuŝÊ85ż²u_[÷|oġ€żÔĞ?’wnÎ資˙ò9Ccİ>#0üâYM üĞ ä"¸ ‚0##ĝòŒY·!Ûêvq"r=uèşñ•úĴ›ŞĈz£n¤KÑğuŭeë"ŝoÛ[6G_äç ùúŞU×·o¨aġ-*}èZ÷ôÁŞá’:rç—vŝÒtİGZ}òD9²%ÚÛ•^şÌÂ)^ž=ßË Ŝĥġo3à×Á¸ËŒ‘oĵĥyÈ5Öee…>Aoŭ„ÔĈ¸sŬz=ŝ‡+ègè'ĜŞ…Ô֍ámÚ·tÚhĜF…Ĉt/Šß…â›úÑêÈC ü–IDAT;·÷hNà €ŭ­7c!ğM=#ä%F‹64ċ"ĝıĵ£ ‹œ.ʖ&ÑmYŝ8ërÂeżÎnÍ|ò5]·Ó÷ġŞ…]ıÂ; ojÜüÚ·˙ŭÄé+żžoĠUè[…~şqY€Za{Œ­Ö€ŠĥşĞĊŸ ħŻŻż Äşú`Eŝ+(Ĝ+v{”Òö“ó2v‹×thʙœ–3žŻóÊJl‰Ä;C3û![œ³ëbÄuêŜË œqוÉ×A \¤½2™ż÷)û –—ûĜzmaW-Ü­íÛʉ]àq„xj›Nä ˍŸ˜R…báf§àżPĞ@p˘Vż.woa!Md|ú_Ù Àöê÷À°€\_âùYĝy‰ÌàNË]θ/ĊKš+hĠ ßLá#êIC]÷ì\ĥùĞ•qżŻìÈAÒ·Ö}¸r`퟽jŭ˙Ÿ6guŸ1¨l_ägRÔGí6Ş‘$zá?CäÛ…ž¤ŭùúAıĉMp]€ ­żk§z1RżäċĦĜMá2Ú÷W­îñ™ó*Ċir™Yĉ(ü‹+vŭNİOòfĤÈh§Ġµ7Ŝe&š×("ŸrŒB?ZC+oñOoÄ+ŭĴrżk,eUç<„ ŝp Ïâñcwkë ĵí&¸*°TĵÑż‰À ùqlôGìëĠ?€Ü=\ a4w½€"½÷Pìàà-óš;9ÛëŻ£8Ğŝşì°9‡})ŠÉÒĜŝgíĥ1û9×a½|Ûın}T;…ħ™š˘eİĤSêşq^4ż?vm r>ÙO´²‡ĞnŽĈ*Ÿ"N'ߨ‹Öƒ NQH!ß(`mşûA|,Wí0úÜ*Äj£PU‹Û°>È/Uĵ…öô¸üc;‡· ĝ49ŝûáCôş;ÀͅûìŞ˘'tÎç7³ö²(ÀñMĜâÎÛY ëĜÉZıLXùbËĦ9W½&Ħù”żc秋êړóŒ`í|nò¨zùÚU›[V‡ŞŻžo|ş‚dàikĜï=2v6Â>‹ Şß†bŠ7ġƒòş]ŝ‰#’B=ĤġÉL@!?¸ısyë`û_Ùx"UĤŞuż˜\ğVœZJùˆÓF§Ûú½Ï3 "‘ÒÛĥñRE}!Jml>ċÖğÍÌşùÚM•Ë^,q/êéµw­Ĵ[7ogĥżl}AÜÀĜŠ?fŞÀ]|ĥ­v:á£7fzùTó÷ĊÈñp˙_Ájĵ#=.ûAçïfÛñô¤¤ÙÑèȒzŻóĦÑüSí*ĈWLQÀ}~aB|Ä/²òŭÑğ{X@Ħ°€—lÇ#gt˘\”ÀŝbûˆŬËò°œĞ˜Ö#Ñ×ùX_fßĝ‹·L[`Yìx?Í­—ËLùı,+\#˘Öĉ}y·‰´ĵĵÏ]c£à•q×ch ë˘ÙÇuZċ.H ż}´jí×ĥ£÷èÒetĠô³=Âë­_p_6½Sa5ŭ żĈî"û™z'i;üm ġħz|ĠWH)öżwÛù5_Xèqù7³—ò½£½Ìw){…ġ~ÉÔ*9G@5MM ‹ù¨v[–à<#_Ù2óúUMÓş#ŝ*‡¨ä˘ôS‰ÄHïlɖŭÎö§_r'í,†|jŬ<ż„ŞÜö6ĥ›Ö6üŒ.Mż™He‡,@cğ¨<Ù¸ġò²OjèuêLĝ{EËâzÎŬ9ï8t›ŞĠ}lĵng!TÜ úá3ĈfŒ¸B!0”ğş<‡ÈûÍitċŸ!ĝ¸Ï‡g@İÇċog/Ŭ£tŬ=ÊnÈğ‡˘ÇċäSQï-ɓWäì- O|;ÉÄjIˆNr—jíĊϽ}ċÀìxĜ¤%mÛ5“ı”ĵL’Ú•Ğĥ^ó‘ş+L›pŞW^Î5DÉqê:ô’7ï;ìuiòl4JŭÁj<Ó#Tµ?mş×tĠ¤rUïêi†Ğ‘ħYFRîaÒh¨„ jt⠎żÀ?ĞÒTż†hŭ“ô|w˙NĵŽ>‘ï'*ÛïN½żäş;ı„@c¸yc·hQc#°`˙ЍŒĵ.}ċ[ĥµ³ße ı^-hgÁlÙx½öÖ 79Ğ‹l+;.n댽ïŻmú=ŸŠ8#n2ŭêê%`}†EWÍh^ OĞ8öğëw˘‰ŞUğˆŜƒ8ó`òĤ²[cÏ:GF­½êbtĤY‘?€àŻÙôŸaˆĠ“òùäwċîĦèŭوœmÈ5q€Ż!ÔĝïdqP¸–À]xŬÄY‡‹È9÷ÒÏlo§a*Á@+Ĥ'1'­¸¤×ì˘ïëZĥBŬŻ{û p_ • ß^†œŽğ7zŬ ö.úÍ8ž·}Z\$1zöqċŠĜZ›ĥšÁ÷œûü¤JÙF?{9·O6=/mô˜sjŒò˙7£jv'[¨Ú ıàkıí`Ô8ѓò{³—ô' Ä Ë™9OÈġr ùÙaœĞV!72Öcá^Ħs ôí˜pñ:òmäçı/€xÑÌGÉ]DbÂvÛlĤV°o“ÑkZùYèS5,>šî˘Ĝxómˆäí¸ĠÌ_×.¸v?~½2ÒŭA 5ÑÊà¸*·vŻ•I3 ·Ĥ.âRîá˜ìÀˆ+ m”!XŞÙ5òëèóïE,Œ5£ï…‹o¸€NDäòÁiµ…êŸëÉêdö’wt´ûVĦ}ɢ8BNŸ=Œêˆĵq_ì˜.Ož³|O›j?Ï!*ħ£3ë3 ıÎ)ƒ%;ĊíÂe6ŝ2s,6ŞŝG¤ˆfƒÖzF4&^ïT‰zCnoóòŸĦz}X›Rîôƒ²ßçP à–}ġşnÚ´H-.l›ë;o˘÷5îx;ğwFċS|WMß­èš}TUÒóŬmg Á  6ŭ;ŬÛ+ëŸk>ĝ÷Ž&0[‹ÜôŜ²ĉ˜‹v2U³İċb"…†‹œvFÀE‰àÖËwÙ/Uy1â6µ)[ò630%ô™·šÖŸr[O ]1úp=éœèÚígÎHWĥ_£_µ“ûѽÑ<÷áıÇÙN|wìÄÚı˘ñôŭc÷ÒŭŜXéqù†Ü==™No[×{ˊ78!—*0x°>Ŝ›ożßÚtqŽ­g[ĴóäšıLìÎĝİ˘·ë^'3FÜÎ [ħ Ĵuóħ‘×0µ,g`(9Hĥï-ġ)~^yċ?$‘²Zà™3]i:Üg`–­‹Úspá˙Ğ̒À°.ÔêFíyҍgpX6ɛâVUoġoL2˙‘ß-jÑı•Êü§ŭx3™B—ğGĊhù€ĵ{ˆı–5BÈUrŠÈ3†2°İĝĥ2Ù+\Y€j„'ħHżÌ8x]d‹Ê["3%Èî_ŸÚ–˜Ï™[M×Ğ×cœğ'˘(^6fôž0T[ÛiË`ĝ”˘ŻdÇgU÷„"şÏ*WèÖ͞ñÖÍI×ÖBË&9p8­xĞ@Nï¸ĈN_%ż6mŝ\…7„Ùê£ó,•‹”ë ²ñ‰ž†sĤż àÍ4âW8ò“—vÔ²ĉë³F\ïsíœ:]ȤğÊ &öâ%4eTx•ŠÇ$kçC-îİĦ+]¤^ôNŠ^S‹.ÓF<…;#£àËàcŒw“I•‡Bħaş}X#ÒìϛH×\z£Z`m`?Y;Ĵ™ûíİ3ŜöyNg ğŬxgĞ’ÇXèĤé?[7mRó–Ĝl͊K’Ğ™p˜, û:ü;Û kùûÉZ­|KË?›½´ħÌ–.Ûd·Ĝ²F9½a™o‹Ĝ{ьê]ÓŝLi¸nÉÉÈ7Ó\›Y¨o£ĥ°Ĉ$Zï4kĉĦF.ˆË„4vĵvôúa™ĴCÇF\—M?41İS!Ò­í듙šŻĈ"1²VûĤx·ŒĤ•ì#H'ïŸìˆÙ^Tf5ħ­7ĉDdĵ¤Ğžĉ !äâUÈÑ>нŬŻŭï-vß‚j1[#uÛç„u4hĊh˘ü”Ŭ²˘1š|ë ŝ`YG£*yŭĵrĈZïyŜ8­ġNŜ´iZ;R–K à$“™ĜDĊäÖ&Ġüİñµó$3"2ê˘˙:cĴŠŭY§àĈâûvrÍ\Ğ[­'ċ'ӑúa‘Ae½†hœ’„KäŻĝ`ùİ/ıçü‚'fĥĝmjJĝ]ĵn>è™îZÌÖf\(“¸ÍßnŽıÑ>5˙h÷Ëż/lC}VCŸ4}QÚ`@ƒ(L×ÎC­…|ÙvËښ4c£öÏ h7<ĤDÛ]ófYQ÷Żu•|y™n ‘ßps°5ĊèIùŬiC~tÁ­×|İs !äÊd9Úëe?‹bğ"Ŭe6â:Up1nëzĵŭ˙7QŠ<'i)ÛŜ0ÇS—Ğ´hNŸÔŝ=ŝ ŜÀëÇë~k(h‹÷ìûÌuÓ&û-…µwVž5cÍôĜħ‰ÎĊHÚv8Pħƒpż%Ŭ`8FBğ‘¨û:ĴA°Ŭú†…ÈßE9ˆp~ Tż'Ğ'/ñ{G·+ó"2zŸ-k„ëîN·!}Oûerrs5óä=ƒ7‡6µĈŒ ´“1NĉUĈžEb,5*¨óB?Vû‡Ğ~z[ĤÈKğLĥġP,’ŝp]6mb ;R³M4 ÎÊĝ¤m"ıÔÈOdġµžQ{ŻF÷ÖRÛU²ż=ëĞ9%¸Ì ó"2zoıĉטBNëY8ŭyëà|EyNK2;ÖˆİÔ­gŜÓ­…J“MAk‰Ĉ4c­÷ßŜÏDÇúé&?tö ta¸ÙÓ:S¤&ŝ}i…ĵÖ& ¸5öÊÎg@Ĥ°´I!\ş/9#ŜE,ä˰¸1x½“òÉİŭ8*ÁBÈ;…8ctĞ€ìóíx³aÜÄï[íÇvÚTšµ‹\7~â™lÇFÓւĤz›ï§‰Ĉ ‹ÛÂTµ§M*ó*ÒġÂë'+ß>ç˙Ĥö²èA&ĥŒ²ŞîÜċ ìÊ$†S‡b8fàkœ´.Š—g€"ní;ŒB Zĉ§ż^GŭߛAŠğ²½ĜÊÚ@żżÉëÁ/›¤|4x%ô½?×+^ Œs<|eĝg3Ÿáĵ•Ï Ȥż›LğωȜŸBya@€ŻêÚ˙}/·À#gô÷ÎòmúHŬ~^u:èĦĊ,P…™×M;ĉ´Ú²6ÖÉı…cÄo32òÚD}ç™usŽumĤ\:C*Œ§EÚíY,ä_îŝï–<ŠçzR?İß=܃ˆÍ8ì-'„rÁ€›ĊXPĜ/joTw|cúŠt£Î)xÖt]lĥ2~6z4§ŠÚÊâsĞİ|ż" ÖŞĝ‡F;36Tû²Á>ß; Ġ›ÙH½] żxĊ¸>êoĦĝĥž”˙>mȏnBŭd\éŬ–´{I8B!݉`ôDöÑŞê•ĜÏ+à pUì"°Ÿ­}›7tĈŻáUßbİÚÎGŸÔĜ-……jF†ß- š‹m×.BˆW]ûM=.eîà™tÂÜ|ïùŭċ†·!„Ëí,ŝUŸToêâ lŒŞˆtwë£˙ÖôíyĦe/+•û‚WÒµö%âġs÷ŝÀ=.~‹!_` s‡šÓ("C!äşÒÉĊ/ċ‡è ]£Ġ ½ÑġŸğ⿀úŞöÄÀUıd?7ŝ% ùi¨ŸBĜWÁïéqyoĈÀ˜³Ħ3-k„BÉe:ƒŠùΧRüÌüĴ.ŬÄ3ŭÛÎĜğ¤ÀïÁÚ'€˜TÔFÁ—½Ġxïhż[+—Œĥn>R§'„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Ç˙nvċşË1BIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_MicrophoneBlack_256x256.png0000755000000000000000000001603312467662066022643 0ustar rootroot‰PNG  IHDR\r¨f pHYs  šœÍIDATxÚíiŒdWuÇUĠûĴ=3{˜ñ0xf‹mLÀ`‰H!˜„€„’( ²D‘UA‘‚ò‘(˘$²)‰‚ N00Klc;ÜsU§nżê~Ŭ]ݧ–˙Ozޞž^ŞßğçÏ9÷ÜsA!„B!„B!„B!„B!„B!„ŭDI·@Ï8ƒĤn›‡è˙çYZdznòo ‚@ô‰ħ—2>N?—eèŝ5½$ ʈnAß½7è ° ĜL—WÚë~à` h˜áV€:p¸xx8< Ì3À‚}]ӗ Q È[ôœüL>j8\ĵ‰À`°ÍŝE 8e˙œ}B}żXc„ŞÀ„6du²ûŠ.˘Ĥ ŬŭŻŜ¤[²an~@hPZ½§@“ìz! '`7ĞÀğuK6Ċ¤…ÇmĉŻ)PeŬ‚Mœ•Ŝh3˜Ĝ/^aáÔĦŞß0¤>€žô'lr›çÀĞM&hµ@׆! @OòJÂ&—=ş]ᰉÀ˜ €zHzÖŭ/™ñ?_·¤kLŠƒı0`ÔD ÓgBpQD`„p —*ŝşÇ(bËŒ' /@3Tm%Ĵˆî1Aè”nJúr,ñşÑñÌxöM ÀĊàŝŞXHS΃ġ<ĝ`@Ŭ^ħELğJ› q<42~÷ÀcÀá.ŝÌsÀ§€żÎ:hÈèYšÀÀG_ïâÏ]ŽĜ˜hU –ˆ€à"ÎŝEdĠfÀ²]Ġ ġ½cüqLT gğíw,9O‹@SpñD ˆUŒ °Ĝcê‚ êòzÒŭoÚX¨ó÷ÛϞs^çÀLƒ’è&e`Ò<€YójÌ.˘{ @Ânu – ö@·”²Ŝĉ€Ĥìu”VbQôöX(0ĥğħ0B+ı807­ß=€"¨˜áÇ‚İŝ şÉ˜]ÚW˜J€ÁDċŒEÀ?tgyY Côı° äxħ:½ê#bmˆM @ï=!ФFĞ´™\}Ï lş8db6F+{ï …j„œCÀ´bûĦĤœž$Ôv”W1èeB!ĜX<P>FXНĥk;Ùë÷{w728Û ĊúYŽŸ1ŽŜ~–ÁjÀĵ]‹ÎhJz#¨Û\$Tí5íQڗoâ×Ï£z~Ċô­13o3üB†ÄÒï%ûšè Ô)0PµìĴŭ]e”ìs*çqì,ç ;>/dÌ~|EÁˆĦ€vöÀL½€†½fUl•€ö˙BÄÉbž°Éçĵ}kŝĦ½@=É L"pú4“‡”–jĈ0`Ŝ   Ëĉ=Î'.~Ú ¨‘ÂÀï!@)Qôáĝ²Ŝ*Š˙Eğԝ,; ŬĠĴÇCĠÊ@rˆ ™fĈÄĦÊ88FìÁ’á ô]ƒĵ“ÉÀĦR`!† €!„@!BH„!„@!BH„!„@!BH„!„@!BHġ€!w„p‰(vŒê87 @ÏQŽ"ĊŒÏÑÄĝ%Ŭ!żż% oŻ„ê6\,şż€žÎh&Úşû­{-èIB „!$B €›Cy @O3ŞAZ(Z”ô,uàIÂıò˘û4€š‰ çèSÀ’nEaî]†/èe˜³A*şï]Íg¤—2ë”iŻô+uĝşpÊıİ˘{,ÏLîjf<‹&ùĥfĞ˘P°*ğRH‰n¨êĥuठ@ÍD ŜÁh;€ƒ9~˙ŜôU0 DcÍOŽSÀX⠔:¸İǁlÀŠî†qöŻÙĠè0˗MĤsz§M´‡>”(‰ñ—‰şjŽ>ìv;('tƒô9àn‹UE÷˜µŞjW- üs¨˜`çiÌR%ämҐb(s œÎċĝÚK€KíŝŒĜk% ˆžĊ3À˘lĥk,ǀ£fĝU42Œµlvĉ€Ċ `€Y~HXĥ[‹ L&#6ÈÒ82 À·€Qfş[̛`ϙÁ.ÛUOŒ5&˙v/ÊZ,&‚ÒÈÈ)HÄŭ÷{.§0n0é œÜ//÷Z8 6Ï6û×M¸—“ç5}À‹Xğ5[Ŭ„ċ¤Ë uZY Äk!§Ğ> \ ì§µ"PIĵÜ ĝ:ÙnWž×À£fĝ‹.SOŒ5Š@^÷x8A+ıĜ)Ĵ àßzœħŸË™¸Ìy£öZJĵ‹8#}¸•o–û€˙#Ĵ,Úċ=€ÔHǀ—['ŝŸu‚’ŝÌĦó†i°D¨Ûżßf€µĜ<Ÿ°$l•\À9àóÀ—dĤayšÇÍèìZ˘}‡vہW/Ìñóç€gÍè½ mıñ0yÑPgíÊÜHXµk̄ + (ßœ‘-oˆ;íΘáϛPuàÇmx1Ħ5{qyÌ´†û™İ°”$ƒgĝñµ 'ì^=ò3qöĊ?YĠz{Í;˳hžĦµ´¸œZH<hĜìñ,Ħ~?OáÎ8p½óF'•ŒĞ瀿˜3ÜFŽ˙ ìaZeˆŝÖRĈµ ¸&Ç÷MÙìqŒÖöÔŞ•ĴmMd÷XŒz%:EĜ󸉷힞5Ñôî:C—Lt§?µĝ­1Ü´ßq! Ef>#ĵ ¸Ä£À›rÌ"ñï[œgš›ùé qcËĦV]"Œ˙6Š fĝQĉìžĠ’Ù?>ż1à]À{ÉWŭ÷pĦ²pÖ À‚=ÇĦ5ŝa€Ô c2èràÈáPÉÛañ íŭ²–§ü :opĝ²â0ğŭŸ&TNÎ:?oĈżÌüéx½ ĝ ÉÖ a›fü÷ĥÏşß³”!2€!óâúŭ››ż,™ô´ ÔµşÖúĵœ ŝç+ S WÑIĠbñ²xü|ĈÌïżîîaÙ^÷ż ĵ5§'ġ4Ħ0ë˜û}³´ ġÎÊd–°“ì…ĴLêŒvž=I(XݳzĞŞTYïĉyì’gpžP ġ/vߢ1žIŒßÇäé3Û Ü|”V³–µ¸Ö.͘dĵàBŒĦŻÓÖÀ·ĝŞVnÊSî³ï=ine³ƒ”ÈîdğlòmKf$_&ği˜ĜŬn×Y7ëŸIÜŝċdĉOs6Żŝ˜°ñg-oÚïŭ˘Ŭk?û{/c¨˙a€Tĉ [_”3>?hö¸Í(iżÁĴ=ë~Ċ aßw—‰Ï´ Ë -˞A¨·ˆñŝYwĊÙx•µŝÍ$Lğ ĝ³9÷à3j̘ñûÙżŞÙ_z'l–ı<Ç 3JXˆUİq§ƒ88ûT ÍDgtÚ‚~ġï>K¨î{*1ŝhŒ~£O=ıo~ĉ~à×r„h˜0ß üsŭìtĥ€<€6#=kĝ‹1×b‡ÍÚs„ ?´·™*u\ĜE,ĦOÁŭöóʐû)I¸D(µŭ,ZŭÏ%³7Ä4ÛïżIH”ŝ[„š<Ïó)à?ìġĴ{ÈßV0„ž@ÙâĊ}ĉrĉ öšÇŒyYM&Ó*ĥ´Ÿ`ܒZ%ÔÜg‰ĞYBùñöN³ĉÁÜf†˙ 3ş3Ĵ,I“}YĈg˙÷ż \‘ó½Ìú1ÜMû*ƒ_aê& €•ĈïE`ÉÌ~<3´}í ßm–ÄHEÀmŒƒ— ÉĊïv·ÏO˜ô ÂÒÚfĝ_!,ñÍ´Ŭŭ9çò§½ŭĵñcBÜŜüҜïiŜ ˙ ö;c˘1 O #eBRj³ÎórŠÈnBcŠ£6ĝꉁ§+é~#Q‚EÀĜÀ‹PĠĥDX­˜HDĴè0i™°„ùUBF˙‹„2çÇieôÓ8ßß}—ċĊû_²™˙ŽċĦn‚yğıŝ¸(]öÓìŸq„Á7úì~†Ptrh†r”Pv—Ċj‰Ô‰]‡+´ÚĊMGvMZX°‡P w *ZġS´:o&‰ç e%ôè{Ԍj֌9îݏVë˘û~ż´×$ûdoü„-Ÿ$ß.żÈ£„MEß4ƒ?íĵ‘ûg­2hëĴ0ÀĜúëràà#ftyyĝ! }:™³rï# oGĊ`<ı&Í`^Bè`´Û§BĞĈ žQvFZ6C]²cÂÎĝOU÷µñZt/ğЖ̸Y3ozÜÚ4óÀ'r&ü"' K~_3šĦuŞpşì§? Àšı€8ûŽ™1½ĝ€Y^ž"4ıĠ\ä´ğm'W4ÍIT2Ä żQ÷>ÇÜçFŬ×UœŒš0Œ8×ĵLûjD EjîµJûáYûDf##ÒìàuĊè ğÇż½Î°t†°Żà[.ĉŸÉHü+ B°j(Ϛ›°àÀŻĴspÎş˙!³żèfÌz‡DXÖsñgVÜ5B{ËòJĈÇ#îJ2ëf­HÔ;@Í}Î˙Û'ôĵ›O‹ÛĞÍËşeÏk ĝ73ŝgÍèOğ0E€ ߏh4ĉŝ> üÜ:=şċŝĝï$Fe Îĉ*ÏÇ T*”q¨düßj§7’½žˆT=sq}c{óğw |^µÎç´hn˙œ·™˙Œ3ŝ÷+é· ZX=݉}ëZPçŬÓ_6âBá6+mT”³Ş ëɌìcñ4^Éş˜°›w˙^Hŝ/+ŻħòDN^L–ğÇÛà >Ï_çsYŝPf|ŠöME~ŸżŞŭ$]ñŠnà=` ŞĴoÏN—[hpšÖYuzdi‘F† ï]ġjr-Żr_[Ë0öĈ:âé4Ĵš°Dߟo!ßlÏ,ĦÒk.Ö?Kç>B/ ú ĉ ”mĉÚĥÎ{}x-Ħà„‰A)#6ßHˆ–µó°ÑÁ­ŻŻâÖ§IÁt—c^£÷áÊ$pa‰ôƒ„öhë]Ş|ĈżŻò;›ÌüU%ü$Eˆ€?`ôAs‘_@-ÄŜ8Ĥ AŜHX–{ŽVFÜ!îg•ĝ}-1è$.6à:—2 ?ĉ&ôïûĦ…÷äî˙Có˙ŻûZeĈéùCÛ_PĴĝY5†—jÖfì$=ö: +bËj1(m0TĜŞpÉ}ĵ&5 ŝÜŝĈxß5ÂVâ[ ĊHs´–ûĵñݵĵ*6pÙħlĴœ²~aÇÚOħı^'˙>gÂrŠÖjAz~]Ö,×ÜÂħ’.SĈß%„ŒŝÛ-Ĉ?°‰ßwĝ2!ÙwҌŭœ‹÷³şÉĝ%["q‰p„àRÂá/šVn´7ž2ü]Â&›{ ›nÎÑFż–°Ia(­1ÛǏ˜'s„pvÂ[ìu³›–~HĜĠğ0§ĈïĞ+×ZJ€BDÀ M™‹Àk6ëĤÔ eıwj î'ì5X˘=;ŸĊoDJ9cûX<´ßŒŝj cn&lŜìxZ°8˙6ZIÒÙdÖ÷µŭ2~ ÀEğgQFiߨ³x'ĦÈċp—~g<Úú{½›°qŠVeac Ï ıŽħŭ¤ŭ]7ĥçĝQó|şA•°íùĞ„-Ñ}˙Xןž,—\TˆyQ'f ïŜ@wÛ|ĊcÈ3xÀ'lĤ\0·ù ­%ħ<ı‚ BuŜ.ûv–ë3CßMHìMuù^ž&4HŭşÍú÷YŝtwĦ _s!ALNZ>àzàm„ġ˙‘ŜCƒÖqÚħ gĈ‡¸£ŻNĞÂŻnïw›]5¨víĤµıhĊ5!9gÍ·;(£ħÏħ²—@–Ë/—ô”ÄLxLĈmşÛm½ĝIàÇĜşċW?SĤeğqÏ@“ì΋bĝŽÍúÇhġMǂû V–_Ĉ/èéÀ Á¤ öJ‚ßMH Éŭ‰U”wšv.²ryO‰> @ßÜKï Ä$Ħ‚èÜĵ™PÛc.÷ ûŜOH2àŒ?~üÔŬ_k³‘ôĴD îӏˆ“–'#,§½ŜB„´!íg£?k9ˆï™ñŸ¤µ#Ñ|܍|ŝ\@µï’ Ä}M›yÄÛ¸ƒIBKĴ#"\k^Á>ú8ñ˜xŒ³ŭQ3úYZ}ċ· Ç%½šÜ} À°x£oüéC„„Ŝ7š(\FX‡ßÖC×,a•a†ÖéFÏÒŜG Sżġ8Ŭ}(— ô½N[|ù`̉A†1ÂöáĞ ½óĤ [‘ŻÜbï`ž}7ŭ´²ĝħù²3r/iS‘Ĵ%=e÷%Cċ ”2ò#´7%u"à=…ç tŠsQ̊BħPİ÷0ĦpÇġRbĝQ5™é³ö1 Y_0ÌB+ ŠFXÙÜ ƒÏ!ÜBĜ}·ż€÷yË+„Ĵä]4tïÖg5 ŬHsQ0#ş…Ô˘ĝċŒœ…qû˙³´NÛ)‚Şüy:×ċ{cŻÓıАf{ €XEpĈR§sบ€a£À÷U§µ|[qÍ9wßğġĞÍò2z €X‡gP"û4(5ûÜrÁĈĠ¤u\˜–È·t'—ˆ.… Ñ.'3tÑà[§q*ġ$â"„ éÚy‘4’üDV‹pч”u úV ĥjŬĵ“'"—!$B €B „!$B €B „!$B €B „Ĝb´°H[—iġ ĜŠß[becÓt'˘6ID†Ÿ6Ŭ*ƒK[“êCàğ•$Ñ}Ż€Nıǖàğ |Ž%Bëħí„Sƒ›ö{ñŬ Ĵì èÓÙEôĉóiÚ~x?Ħ/Ùıä—{ :Ħà ­Ö`ğ€żn·Żñ­żĠ+@€è2SÀÂiA·÷VG”íI>?kïg'Ħ7àĵËÔ%Ñ]ïĴÜcŜڈ…Ó&ġ$P'h°?D × L8Ħh›ċ&ĈÌ[PH)ˆ@İnjĞB똲hüe €@+½ô~üiE2~ €B Š ×–Öüa!ŝ@Ñgh ?Dú4pнĈÜDâ‚o ‹ùOŽ ‡ƒJ$˘@ĉ€{Mĥ;X™€ÛŞ™?Ÿgë˙‹´‰>B‰›Ŝ>ŝ4à¸ôĥŭ"y1İÚìż`bpÖaĦÑòD—ÜnÌèJöïeBMŝVgà›IüżLû1áò$˘ ¨9[ĉâ.żùBĞè P…˘g”îÉ÷›ĥúúBŭVàFò˙B xVxvÍ €‚ç&£B!„B!„B!„B!„B!„B!„B!„(Œ˙ áâ›âj&IENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Gray_16x16.png0000755000000000000000000000016512467662066021670 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcŒmË@ `b ŒjĠ0t4ĊŝŸ _êIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_VolumeOneThird_16x16.png0000755000000000000000000000544512467662066022340 0ustar rootroot‰PNG  IHDRó˙a /iCCPICC profileHǝ–wTTׇϽwzĦÍ0Òz“.0€ô. QfÊ Mlˆ¨@DE €£ĦHĴˆb!(¨`HPb0Ѝ¨dFÖJ|yyïċċ÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Għŭx€Ĥ0YéİAîÁ@$/7zşÈ ü‹Ŝ HüeèéO§ƒ˙OÒĴTÈ_ÄĉlN:KÄù"NʤŠí3"ĤĈ$ŠF‰™/JPÄrbŽ[äŸ}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\NĤˆo‹X3I˜Ìñ[ql2‡™Š$ĥ 8Ĵx›ˆ˜Ätñrp¤¸/8ĉ p²âCı¤¤fóıqñş.KnjmÍ {r2“8Ħ?“•Èä³é.)ÉİL^6‹gŝ,qmé˘"[šZ[Zš™~Q¨˙şĝ7%îí"½ ĝÜ3ˆÖ÷‡íŻüRê`̊j³ë[Ì~:ĥ w˙›ĉ!$E}kżñĊyhây‰RmŒ333¸–‘¸ żë:ü }ñ=#ñvż—‡îʉe “tqŬX)I)B>==•Éâ ˙<Ä˙8ŻóXȉċ9€˘yPÜġßûĉƒâ›Ĥ:ħ8÷Ÿŭûp‰ĝ‘΍ûçLg ù‹kâk €$È t!0VÀ87°ĝ`Öˆɀ2A.Ĝ @Ĝö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`ĵóa!2Dä!UH 2€Ì dıA>P ECqBı¨*…*ĦZ¨ú:]€B=hš‚~…ŜL‚ݰ2Ĵ  Ĝ ö†ƒá5pœçÀùN¸ƒÁíĝ:|Ÿ³@ˆ QC â‚ĝ!H,ÂG6 …H9R‡´ ]H/r AĤ‘w( Š‚˘£ Qĥ(OTŠ…JCm@£*QGQí¨Ô-Ô(jġ MF+Ħ 6h/ô*t:]€.G7 Û—wè7 ††ÑÁXa<1á˜Ì:L1ĉĤs3€ÌbħXyĴÖë‡ebĜì~ì1ì9ì vûGÄİâÌp‡+Ç5áÎâq¸yĵ^ oƒ÷³ñÙĝ|= ?ŽŸ'Htv„`Ba3Ħ‚B¸DxHxE$Ġ‰ÖÄ"—¸‰XAàP4407°7ˆÔô&Ĝ9¸$ĝAˆnˆ0¤;T242´1t.Ì5Ĵ4ld•ñŞġЇ+„s;#°Ħ ³ĞŬVï]=iY9´FgM֚ĞkÖ&­=%ĊŒ:Ž‹nŠŝÀôcÖ1gcĵbŞcfX.Ĵ}ĴçlGv{ŠcÇ)ċLÄÚĊ–ĈNĈÙĊ퉛Šwˆ/Ÿĉşp+ı/<jĉŭ$.$…%µ&’£“Oñdx‰ĵž•”Ĵ”TƒÔ‚Ô‘4›´½i3|o~C:”&½S@ŭLġ u…[…£öUo3C3OfIgñ²ú²ġ³wdOä¸ç|½µŽµ;W-wsîèz§ġµ  1ş7jlÌß8ÉcÓÑ͉̈́›È3É+Í{½%lKWrŝĤüħ­[› $ ĝÛl·ĠlGmçnïßac˙ŽO…ìÂkE&EċEŠYĊ×2ŭŞâĞ…ħ;ûK,KîÂìâíÚí°ûhİtiNéĜß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§˘sżĉŝ]û?TĈWŜİrj­VŞŜQ=w€}` Á–ċš˘š÷‡¸‡îÖzÔĥ×iוĈÎ8ü´>´÷kĈ׍ E ŽŒ <ÚÓhĠĜĜ¤ÔTÒ 7 ›§ŽEğùë7-†-µ­´Ö˘à¸ĝ³o£ż:á}˘û$dËwZßU·QÚ ÛĦöìö™ŽĝŽ‘Î΁S+NuwÙvµ}oôŭ‘Ój§ĞÎȞ)9K8›vá\ÎıÙóİç§/Ä]ëŽê~pqĠĊÛ==ŭ—ĵ/]ıì~ùbŻSïı+vWN_µızêZÇuËëí}}m?XüÖoÙß~êFçMë›]ËÎ: ^¸ċzëòmŻÛ×ïĴĵ302tw8rxä.ûî佤{/ïgܟ°é!úaá#İGċ•×ŭ¨÷cëˆċșQ×Ñ'AOŒħĈž˙”ŝӇñü§ä§ċލ“f“§§Ü§n>[ŭlüyêóù邟~Ħûâğ_é›Y53ŝ’˙rá×âWòŻŽĵ^öş{Ööñ›ä7ós…oċß}Çx×û>ìŭÄ|ĉ쇊zğ>yz¸ĵ°÷„óûÌ;ĵl pHYs  šœœIDAT8˵Ó; ÂP…áÏÚÛfb)¸ —`ë.ìl]Ž;RŒ&6“&&rxş sŝ9ÌċšcÔĠ< “ĉ3ŠTÀyt܆ıÄ#‡ĦŒe °FÖfî×Ŝ½†š)vİ Ê†Ž-·Mzb:B“V8DŞN€!6Ÿ î1ï ûXëWkGa5ç" E×KĴ ×_°üċ3%ë*_'à$dIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_MicrophoneDarkGreen_256x256.png0000755000000000000000000002247512467662066023500 0ustar rootroot‰PNG  IHDR\r¨f pHYs  šœ IDATxÚíŬ{Œ¤×yßùÏûVuġŭ2w9£ĦHiH‘’-Û²-Ëv$%†“`'²eX6 âŬÀÈıAòÇ‹ " ë,°v7A` Ù Y 01xŠ-[+–Ŭ(Òäsí™ßĞê}ßŭ£NUW÷ôpz8Ŭ<_˘ĜĠ=3]Ŭ§Îó{.çœçAAAAAAAAAAAÁa"‹!8â\‘?òżıŞŒ żħçxċ?Aħç;<ßŝµ ½˙öGˆB@pÀŒß j.¨9'wQˆĵlEƒN8ċĵ5•*½ë™JeĊşyojš³á İċu{ o(ÍĦ™ ż½ƒ@DÚ!hnIBB‚m9ŝUŸvÙ¨żĉi?ÙïS`^Ë ßrÏŻÙ{*3IÖûR„¨„„ñë_ĈñKÎû[žġĴá#žÌjy—Ìú5MŸC[i- AS  µ‚wÍĝsutÎ˙ëŝ’÷8eàˆò°š³.jĝ¤Ĥóš-—ÉPmû/•´?!8&a˙¸qÇóŝOÏ{ÉĝÏóß 9& ™ô!ħâë)Q¨Tò-Q@ˆ@À‘7üË2W•>à§üŞïñKž2Ş~Ä÷A™“Îô§-ySe…\–˘Uˆ@ÀÑöúW•~ĈOıèŸù~Âà1ŞżÔ0aĜ¨[´ĤpGRé˙eˆ@ÀÑÌ÷Ż*|Ĉ/şä÷ÏËħÈ0ĤnÂG,›ö†J3K(BBŽŞñ·}Ĉ_rÉg½ßÓÇ~\†ċ&\ĥĉ’ ŻèĴ äŞŜj@ċ²ÊeYAÀáûÉ|ÈO{Ż˙óÎĊ˘kŻ.sQË Ö}SeYÍƒ „J.ËP÷QÏûĵÇı#_ì{tÈ ;k%kŝ›N1°H"PèD$p(C˙š—\ô/ĵ×cU{†ä†~C†]6ğ*÷ŒĤLñC2£rc2j„4_Ġ½ĤĵßpŒċžR—k8™.6‘TġŒ?Ĉ:à]˙;0à{MšˆMĠ{.™† ™a™aî+ĈÜ x×CĠı³ïÒE]G}l3CĈĠœ•’”Hi@ÔB•şO‡ìKrĊ¸Qž‘–°YŒyğgV8ÂYOkĠ!û3;kj½4`HĤĤŒ9ÀğOçˆjnKê!ûĈĤçHÏsħÀÎJnÉHöÍĝÉ ÈÔeji†ñGp€Ĉ݊fO@j¨…ò˜ğ!1~Ç- —ËR´ĝÀŒ]„˙û/1Ĉ!1~‘nĊxÇ‚  ‚€ B‚ x7Èb ÷}„ƒ€J[ÛŞ*­ÚGŠ‚€ƒê›ÚÖĵ°/T¨zׅ—²Ĝup(Jëaŝû*1ş!šè„Û n}1@Ġ7âUŒûŜǁßıá1ĉ‘£!A„AA@!A„AA@!A„AA@!A„AA@!A„AA@!A„AA@!A„A!A„AA@ǀú‘ĝ-쳐]UĈT‰ıpçAŭˆĵÙyßq˘›r‡ç+!‡p.Ĝá;ċ–yp„ĉBŭżáŭFú}êj²w,…*=o£™>Jσáé‘?Ĉ\è·"́ŝWކîàŞĥ˙MËÔŝk*ßòyÓŝ†ĥ·úD ½-BÎ<(}Úǜ÷}ïÙ³ïÛÂö# 7dÚ kXïs ‡žYĵr_¸żw”*™šÜ95'ċĈ1tdê%GÑĝĦ’ĞöÁ0säžĈ ıÑıï{í)à!?û•}0ÊLĤfDÍEıó2'ä†Ñ8 oĝcÓ35Ôöx.P÷œšgÓ\˜T3x”œAŭPżùGĥçoz͐šSJ'TVe֕ÖÂŜì<(Q—íñ\èXÈY•5´T•–°Ö÷ş)딌ä&dFċ†T)ä .™Úž @g.LÉMÊŒÊ ê£p`"€ŭ˜LıÌ Ì Ş·şĜûY6(3$3ÒŒ|_ç^À˜FYÊ'7'Tm&Wpĉr½W_¨äò£5BŜ^b|‚lß#΀ 8°T6Áq€J…ÂÜv˜ ;ó‚ŭ7˙–Î`!S*UGiîöêvî†WÍ:%“ÉĠäé?}‹BJ]Ŭ¸A#û²Z&·ħĤ²d]İ”ÉR¨_(•UVUÖU6ĦmÀGAùsjÎÈ]T÷´ÜIıá´fğYÉŻ;çiҐÉ=Ŝ/& ÌZrËç”ɨ+M•E/ÜŻ´UZJ‹J XLŬ7£­´yHcsÓFMM4Ÿòĵ ÌżŬ+k* *sJ÷T–RˆżµP˙<‹"àŠò7İÜáÍÉİKP§Š€ K‘rüfòü+J+6‹|Ûە÷Íż€ ]6S‚jpN@°% èT:küŬp;Wùh?È£sÊm§7¨żGx˙`;™Rĥ%Ü?òï9‚cK@„AA@!A„AA@!A„AA@!A„AA@!G*' BŽë¸Ġ5œ;jwĈ(²ŜXÇ\ 8p“sÀ§ĠCöi|;cÜ›cˆmÀġPÁ“›£yÌŬ€ƒ2~Ñmx‰ñ 8c!é“ï*ĉk@Œ_Ä‚  ‚€ B‚£HYCôôŒm@ûK,†XšÖŬVÄ$Ŭ7ÓŻ´Ógŭ7ù!b‚6\×Ĝ×1ŽĞŬC(m…Ċ˜ û@‰u-mshĦTŞ”Şô§ „ìKNß—,}žy~ôĥĥëiR{+­Ĵ[WZJi@!ÓN²ĠĝŻÈIò„<Ĥdé€O­w -ÛħÌWÊ´•–˘°´TÖ,*,˘™Òêóŝ›Ĉ~U)wĈ°Ó˜^T}ñFÀ(Û½òí¨éœòÏ Ĥñİ{é³BKÓš7Ğ6ğÇı°ÒVi*5“÷oß÷wݍĞ9­aäĦß·PÙ°Ĵ²‘˘†c-Ŝù11ŝ\eıŻ˘üö0hXÍİ”t$aëA”Çh*ĵjŜ·­Gĝı§4šfħ‘ŒuCĠ—ôż ™aù.ĉsĦÒĥ†"=:)Eqäi†ıeÖüħҜÎòњJé²ĥĞ —{Fç|YĤTYµäż)ŭ “Çh´Îĵĥ^µä÷î(ÜV˜Ĉ½t x³ĝwµŝŞyÖs~ĠÙ]d˙nğkÉ×Ĥ•éÁĴ˘WlÇü˙8 @e³ÙGİrÖYß˙ĥžĤ̛Ñvğ:vŠH•Ë[ĵH™&^–D`њëš.›t2D ˙uŻXy……i…Û*·’qΧuúĤNŭûŝÁ˜ŝçü°Ħ]´cÑtÏ·­{EaĤ'ù”btöĵr<£´3_QyE•(zK³}ɢI™§Œ8RÑÀŞÊ ³nú’e_Ršëû ·Tnħ%çïzd)ì§ğáçƒ~ÒyÏû]ÜĠk7UùŽUßê­,tr˙™äŭWûgĜ4Î,E6Ìö& >T:}'m8iÍד‘·eİĊÔeU_= _ŠT7ĜHb°nŬW,¸iÙ)uSFù{RèêyË×Íû’Ĥ7fµŬIıŝíô˜Mw*lzñ÷ïöû)vĈg½ìw52mÜĥdĈµÜRĤˆckšħĦ[´=ĉßEİÍu{rıÒ …ŒzŜ.|ñ LŬik&mĝ†Lêµnğ,ÛAŠ””Şn…ÛV}Íĵi+N1u芄-ܵîšï¸ëwmx-…Ŝw“áßL†x'â2}Ĉ¸Ŭĝ;éÔ)gü#/ú‰]ŝŬCEm7ŭaži…;J·ÒîÂôšEx˙.›…ş,uü­ÙšÊGL8³ĞT`DÍ ‹VÔ5½‘ ş{•U'ŒíŠÀĤ})A;ÀÖµ]·ì͘ħbJnLCí@§ë*ÓÖ\÷ŞivġusŭîòŜ­´ö~O–Nĝu7àtExĞñwĵ˙Gŭߞ÷i'ĥ´b{XÚq͒/U†;J7Ò \_èŜ˙Ĝ @' èzĉ,EKZšĝĈwċ‡Ô ğlEċ­^Ûê*y™Ëò´:Pm+éïµċZİFç˜jۛV}ÍĴ?6Ĥ1ıĈ.’“'WܛĠrÓ=7}=_°ĉÚĤûŠ|wzıŝĉßBŻG7ßjüŬ9ÙöCŝ/ïóœ5¸ËĵŸ;ĉŬóı>żÙžÍu˙ŝ!÷EŬíğumŻj;iÀKĈwÑf:K"0äŭÌ+ÌôBûŝ†“—“àlŬ,ÔŬ0ÔViÚÀzòĞKÚn[÷M‹fĈ 3Ú6 0Ô[9ĜoI¨úrëm×ŬvwMû²%_µáµtŠŻcĝí^žßġú3J‹i×]ww_ċj_d´iüKXNĝ'^ò?:³K/uNŜé…ŝŬèN2ŝ›Ë‹áŭû¨ÇôĤPSiMnĊżôĤ3F|ÚÔ.D2Çi ü˘ï²â7{RÊé;xrEŜ›€WzŻŬíVÔI 2ĞږċÓݸi-Ż[óûĉMyÓyC^4áe§œëí'H—š=NÊPĜì•ÛÙÈĵjÎukŜÔ6›uĴ§zĞ*‹é€ÍbÚµ˜žŻġĉéèiğşíÍVŸ0ċġAñ‘NNÌkğëğÖüw…´ĉ·w¤xSx˘cŝ+¸ÒğĴŽıQ~À)ËË~l—~¨Œ–Wŭ‹~]éġ´L¸ °˘żġÔĠ-½íû¤ûs4Ô ŞŒÈR;²Ì˜ÜxjL2*7’>Žix؍8§aHžî6Ĵġ:çfRÜVj'iêĴKi9´°bÁ²?Öt+]ÌÙÚÒ>Ğs˘nUewbŻ[ĞÒ£L5Ín;÷ç½²MŞrïuÒg}ŻÏìŞà×eQéšo[Ÿ•–ÓĤŸ·nôy˙ĠĊ'Ĝf„y èGUĈ4ü°3ŝĥĝ]$›,(ĵîËfŭK-_IñŝĉWwĵċ–Íğ=1È Ê Ğ É`8 ÀH­a ƒ’H-ÍÓdžšÓ2uE…e™<ùúnár3é^ĈYġj]żŜ֒Ñw ìµĜêxÀïıYíŻû˜s~Ċ÷úè#E/+*o¤CEí^Ĝ]áFŠĉĜÒNL„˙!o'yŸ÷Ċ¤şïsŜ/{ÉK497Tıá–eŬoö‰ÀR_Xĵé‘î÷ŽŭiZ½'5*däƒé1œ€ÁÔÁx@gĦ²‘ŜġGÖ'2­{ÚÉèğ·ñ6ħĤL'3MeŻFħ!³èġĠoöy{ğ¸Îï6ìÏğàñÂ.7ùtiáUŻ›÷Em×µMk'ÏÏmmó[RŻ0ü€GˆɛŽËV÷²gü=Ï{î‘"RgS̛~˘ŜˏËûòÒòm K°G"0*wRîŒQ?璟sÁĝ;ŝŝ3ZŜòGfŭ+M_Uı§²’*ìÛ no_'xwÓÍG͸şO8ċŻżc‘¤³)éĥwü‘U_O·;o)Ŝ4ŝ•0ŝ€'!ġHà¤Ü„†wŜ/y΅]µ¨~‹JoyĠŒoµ½Ş²!xrWZŬïċûüŽ@Ö½`Ĝ§ŭœ‹Ŝgâ1ö$İ\wËĴ/kyKa^i:m;žî xD`(íț”9iÀe§ü’ç|ŸħÇ8½WB×óĤŭž˙UË´ŬDSĤı+1xœpŝÁiöBbwÓÔÓ}ҘŸt֏:oêħ-ŬĠtÛw,ûF ġç•İmxÇĝgéí|ûÔ `ŸD`s³P'xÚ¨+žñ)çxäJq Úî¸nÁW­úĵ ż“jŭ›pĥŻĊ?ìûòĈí!Fßżsï}ܰ1ċ#.ş`ää÷ÛiâĥywüĤ·R?“nô™N‡ÜëË÷ĝCŜµĵ·ŜW˜”›’;îy§üO.ù İ=:lUêxıgښۖ|ÁşßÑöjڇß1„­ëöۅàaĈ‘?s' ¸lħú Ï9¤ñ=êTP`NËmŻYôt g6˙ŬŜİÂ͝”ħ½7àÀˆ@·.0œî<%3ağqÖ§<ĵÑ=ç2ċNjִ4-¸iĊ·5}7í_T¸Ĥfj}½5Èh,“rĠ<ĉ„ÜYC>h҇ ™0h)#ÙlgEċĥğfŭaòú‹Éĝï*ÜUıĞ4ğíŞ°fäû!3%Ȍ˜”™2à²Q?é)?ĉ™}şĴ¤w^ŻT*TÖ5­X°‘nvšvİŭɘš•ĥS†0lÜ µt–°‘Nìk*ÓÌôúöÏ\65ñĵ—šˆ,îò‡ñ‡0èß44ž„`JÍiuï3ĉÎù˜ &ŸX‹ŻîQŸíÏûƒüŝËҞmÜ´`ÖwĴyMÛtşĴ³{-ĝlòúói_ÄÖ*À!H şgù'äĤdĤÒ.ÂKĈ|ÜŸpÚÈc-&*VŬ·Í›ñÍÔĞ^‘ ż4›<˙½ÔTdûò^úBôGTï AfRÍ)cŝŒ3>ĉ”FäG²7S+ 3ĉÌĝ’–ÛJ+İşż˜.é˜K]:‚3‹iݳéŝ“†aü!‡JşÁP‚Q™IıI™2#†ŭ°)ŸtÒE† ƒğ‡Ùèה–­›w˒oişžê+É/¤s*óô: uEmöJ£8Ä"M ú#‚Ñ$2i qBÍӆ|żIߤ † • 1hcUiMӜÛİĜÔ?pUiYeQa)…÷ *óiá=´.IDAT su[ ħ÷CŽtD‚AıQŒËaJn"‰Á ϛôQÎ1lTŭ‘zî7ë*+ÚÖ5-šĥìۚn%ƒ_K—R¨ż˜60-&1XéIĈÖÍ<áġCŽĵloñĠmü9šzŭ§a4E ĵϨv^¨qNj<Ñ蠉9ÖĴjZħf:Uñïİ4S£5•ċôĵÖW–ÓceÛ!§~ê~Àħ‹ĥvòéA·İg'Mè4ŝ•%èˆÂ¸†çMĝAN›r„}YQ(° eŜ‚•d-Óİċ÷Z_£µÔ|%}šŒ~-mFZM­Äĥ‡ùOî0Sp@…À61èF4Ħ2"O @ġÄ + cÎĝE—ĵ°gÛrûÙÀ[n›ñÚfSHż”ŠxKÉĞ/§{ş]‚×úşoŻĉĵ#Íǜ¸äŬàêĥŭù›‚é[XG]™š~½.À½.À1Ôµ-îë%WBi9mϽ§0“Öí—tŞ÷›]‚ġ5Ŭ~'@xû€à!‚°ġĤ &rĊ]€K”"PhĤžŝûA•6ŻönÜéɽÛ×Á¨˙xòŭ^>ĵ}@"ƒ+½½ŭ†Ó„şšġd˘Í}ĉ²JEċ´=wĥ/¸énûİ0ü€`Ï҄nH]W¤?ĞÒ³ŭ3éó&6”ÖeV“ñw Œ= xB‚À•-ıuñ^½sƒ`•*ùEïÖèğÈÉc%ëú³×1@hŸ?Á×B‚ ‚  ‚€ B‚ ‚  ‚€ B‚ ‚  ‚€ úˆÓ€‡…û[×uä췈g}΢óZ5µÔ— š˜tˆ“!ÁŝÖËFžÜ‰ĵšLÔ’Ĵ4„–í-żÈCB‚½7ŝ†šIœê}žJïà¤|ߚğfru5“JOĦRRšVşmŜÖ@큀`/ıŞôÓ>äĴ_ġĵZµ,™|fTÈ>xĈy§üyJ!u³\÷Ż-úGL|ĴŠ>!Á>;a“j&<Á×íŜP°ġց cĵGÍyeıeŻ5X3Dà0M­à0äŝġžÏ?³&S3.wQî”̸šaŬBᕘW!Á^?5é—LĤfXÍ ıq™Q•F̧€`"ü@ @ç'j$‘°yßaìıÇÍĜOԉJP…ñ‡AìĠ>^ŝġN˘Î}M´d[n ħ xŜ£Âëîùwê“ÈĠ Ê ÊÔdò'– T*ışĤyĞ£´Ş²ž. ö‰;ÖüĤĥjN¨9™’İ=ÁH‡µ\SšOׄŻÉbŭ˙0’Ċ`:+ ­À£8!sZÍi™q™FŞÀמOTĤ8`]iEeAéÒ½ËB›öŬD<íäusı\Ĥ­°"3LZ~{’)@çBÒ6TVT–”VzĈQ@@°/"°T*µäVRdP—Ëžx°L—ƒfšé@;j‘û—tsüîózßóü‰›˙ĉÇÍ£ÀŬH%N†û&ĥ‰ÁğEıó0ŝ€à‰ŠÁğO}AAAAAAAAAAAAAÁ>ò˙ƒ0EsTÒbIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_OpenROM_420x420.png0000755000000000000000000012266212467662066021052 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFšŬIDATxÚìŭWdWz&~G\á*DŠÈˆH”™ ¨B‘Ĵb³X],Éb‘,’[=Ö½3;3kcĥ;+zlûaĈlŸ÷ewŸvÍfz[VOo÷pvfĜMÙĊȐ µŠˆ íîWµç\O÷”‘ç3óp×~îıç;ß/‰1Ïԁ‡‡‡‡‡'$OHž<<<<<<ÜÒgJ6Ï#9™‡OZ^!y<$™Gxíó2nۑŒÙfĵu¨6uâä„1†ş5ôñ›<; Ëë´ĠÊï|zq݇”¤û_Zë“H´ÖëZë5)ċJEĞqŻ…aĜ 0€VĞÜĝ™!ˆ³óë !ž”<öŒÚ{Óĝı%¤.u4 u›èX£Ñ'&&*Fc,ŽƒALApˆ1vˆÁÁ“o|ùÔìé3³“‡NFQ쟙İjPµħñ‡!Ó]Ğĥ²‡7ÈĞŞħ˙À÷%‰½ŬO2 Ê&}0Àô7zġû½Ï3]££·ĝ@œ!µOR™µĠŒğ_%°p÷vğı²”,Ŝ¸0÷ùċ+7Ż]çœÏqÎïqÎç(‹VµÖÄS´Ûmı*öĤ;½EHtïz…´C2š˜˜ĈÇÇ+Fc˘Z­ XÇÏ˙Î7żößŭğŻyñìÉ͌AĤL‹Ȍ†1v͖ HÛґŠó´t³%ŒŜLÚ ĥMmš¨öġF3{GçcL˙ĥÇûşħJ"$Ĉ’(!è>/Œ1÷3ŭB`ŒĦ´„ád%†ûjĀ™ĴL1Š_7ÇŜ$ä++÷îĥ/½ŭëÏŝ›öïHš\Z h­˘ x;ч^%yì (í iŞ£~ġ@ÒkÇĴVĞ…µZmĴRİL…ax2T^ŝ³˙úżù{G^}}fY\Q€. &ˆ(Aƒ€5B6“GOtwI6şkif @ìm·Ĝ—Îc68Ìt”ŒUP†m³Sġ<À.q­{ɋtŜŻ3PÄ=Ÿ0ĉIé(q$ċŜ†82²/·–ÈN Ħq߀˜ÎZiÌç@ŞDcŞvà÷ŝà qê•7˙Ÿ˙·AÖ–İ‹“EQÈ,ËLQ…Û<èD„-D§‡ÇĜG{BÚËê¨_0 ‚€:2ŞÇqĵ/ Aœù˙úżù&^ymú^aS AŒ]ύcğùï,…J²}@eMii ”!Ĉ@@Á@¸÷1°jD›µĥ#rŒĥDÖáùwÄPÜèÁá´cǘŽİP—ÏÖĦ@N JÀ PFĴ™Ž`„€BƒX²˘’3N jIp4³î´%Ħ>>İŝ7˙è'Á˙˙šj­ TVŻ×ó<ÏeĞĠRBĠ‡”|;OHžvĦ:T¨sÇ1ŻĠjQµZmDQt1öÂ?ú“ß;xîµéĤ"b,ñtœ:Z›Ž‘Ĉ@çĊ7֓_hn[IQšÌJÓ0JJnƒU èú(€ ­ \“{ĜŞJĴ"ԙÎÜÒLX’Ùpe:”UZö÷mĜ3)Œ6€{Â]´²ĉ>#­Y/˘×@È 8qÄE ¸( ¸q!‡Ž”ÊϧÄÊğ J† ë/œğġġ|˙ġżi…a¸EQZ­V‹Z­ĤWWWMïöŞ#ôSIŜlçħëaĵÉnŻo1Èĉş ŽJ†“œóéÚä3ç˙àÎ­JƒĜ9l ­MÏ I ,ù´”Á•\cY¨Ò'ä>AÄÚT–FYWż[/µ3iŽżĤc3Ĥ/Ħ˜.òÒZƒОŒÙ 4íäuÔеS-´ôk9_”é²+Ò Ċ¤ġ†Ô2ΔWŞ(K˘ĴRŻ„!(1¨P‚Ĉp8d¨‚€œ0S’“}kj BBp:¤¸˙ċß9#?~û_¸³†áZÇí(Šò ¤]‚°[-ùÀOHğŠ”ĥ,–Ê9g•J%Œ˘¨Á>ĈĜÌùŭñ×M\ *ÔîìŜPB €€AĦ!.ߛÇg—/cî³KhŬ½ÑZ‡Qbu şŬ‚. Ğd¤”Q䄲Íìò¨İ<Ż7ÊŻCz¤KŽ• [ĵ{)D eÈ5"!'Œ7ĈA+5 B¸˙ĤÎĵ‚“ݽ‰×^8Š0ŒÌ–8‰#Â*#˜šš&×νġµxyŝJ÷0\ĞT*í(Ф°ŒDşÈˆô˜êˆWI{ Ú+¤½dۘjçR­VyÇQE ĈĜ~†‡íGZÚ bĴODiç"€A’´p˙Êçĝ7˙ä˙ƒO>,b!’*g­İ(j†œµ ŒÖj|ĵşLPeĊ‚òŭKì&”ıT›’QĠ$_#9Ó%7>ĝŻŝíĝg/6öò7CÏżô"˘(Bhgn4Î:1[ pçÄÙĝàçÇı·£(Z¨ĠjkÍf3wyIè"£~ĤYŻ’<ö‚ĥ÷jc{“ŬÖŝ£²*˘¨ÂgŒxáëß8Ïc!1Öl  @ HC\œÇùĝĠ?˙Ç­ èıcÏ”RËRʖ1&ĠRĈaŒQmQ(—$ÚI5Ĝlè½0:/‰‰Â(!$2V›öáúGGŻ·WŻÈ?=ôġ³/AÇħ âÚEĝ4(0~ä8Y|áĊ7ƒµËœó‰0 —£(jsÎ WÀ• $OF{ {q"?„´Usĵĉş jœó1ĈĜ£żùġ“™!]„œħ „ ½ĥŒŝç˙˙ûpŞ^ùHĊġvğ½ „X‘RĤJİLk-ËÚmî˘Ë £µÖ¤ŒhĜĴFvö„-˙'„”%‘˜­KËkÎ 8çµ0 ÇB!ˆ/–›ŝâġ_7&fß<6 Ċ9B珂 !801ŽĊ£§ħ=ĊÛÁŭ8Ž×0Ìˊâ]ÇOáÁ\àM·½ÙÎÒÓgĦŝuëÈv—0 YhQeŒM0Ü?yĉċñTÙ@=§>˙ġ/áŸ˙ëĠµĝ<Ë>KÓôvšĤ‹Y–µ„™”RH)•1F+l쒐àHÉ­éğvĦ$nĦ/Iɉ$PWl–0‹ °RİÔkµZSk]Ôßû+²öߞĝ|µU=59PfŒec°SÄS³y`ĉ4ğ{Jġ0 £ 8lìHiÇèߪ†‡Ç.•Ht^TJ[‘˜APaŒ5(Ó_ŝ3$Œ876‚Nr,^ż‚ŸŭĞ)NĊÁ‡YğŭE’$×Ö××ï6›ÍĠ4M³˘(„”R !JUd\K†²5 " f—Ži÷¸Âħ!„PĈ ‚€AÀjµZ[!l7 Rİ˙ì_]ıġŭWŻÎ*c8b p‘ vpKûgOñı[“œóz†Ġ8Ž›ív›u™íş#íÈ"òääá ÉÒ3]0‡VGÊE3bŒĠcÓ_zó…LA'yµ ˙ùÏ˙LĤ­ğJäW²,ğı~weeeq}}=Éó\(Lñl^èŭğˆ”ú%˘n2“ıßN)ŠB1Ĉ˜Kl%A„A4‚/.^Ž—ĉN~ĤÔNïƒQ@H ¨‹ìkì›ÂâÔÌ$ğÄ&caV£(Š(96 <u×77ɛíÄúħ•˘ŭH¨ûñ(ŠXçĵĈĞOżġ›§¤ \T]ĤE ’<ÇÊġë8 }Sħ”çùZšĤí4M…”ré!Hi7NğíÈ=ÇÀ EQ¨<ϳ<ϛRÊ5•´Ğ×?]_šyq˘ÛzKJ)ë·ĞNF{ßôT…2ÁXEĠJ3Ĉ„RŞß–D¨Ñ?7É.§;Ŭ xŒOŒ}väóğô~ğöĦTcŒ…aAPĦ”Öccû^<{(ÓĥÎZ&m0píĈMÈĊù"ÊÓ[m)W‹˘heY–K)…넊>4è˙ŬLFŭEN÷mmŒ!EQÈ˘(ò˘(ZRÊr볕ĝĝù c€ĥ66ç ĥPk#àŜôħa|?clÌ7Dq§ív[÷éùÜŜûüîüÙĞëaŽÙŠÀž;’ò‰ħϔ€ÈÈh+…D˜èÊj.<9°¨0Ĉê”ÒñĈ‰3ÔmJ2mÀ¨ÍAšğ~Ġĵ½Ĥµ^B´Š˘Hó<ϝ³~ é-”Òn%~mzĠPŸ­µÊó\äyžI)TS\|çfô?9ÑÌŞG[ ¨FáÔa.fOžW?ŝ<‚zE• Z°áßŭÔQı1 ]×ŭúz<}µDᵐ”WPžž‘‡ aüGt€És ‚€EQsÎĞŒħñ°16Ï ĉŜM[{ġĈ5ŒIy_Jı.lE‘ !dŸ †ŜëaÍvۚ iyrò„ôĜ‰h'˙óĜŽ ‰1Ĉ˘( Â0Ĵ¸ê Ó_ŝê €íşi`ıŽdáž9,²›ı”-!DZE&„CÑ •Ô{BîÖ<¤nEjzTzIIk­óoêSoĊec4İh†zaáñ‰ŭÛŒħÉ êqǜó\Ħ·ĝŽş!y_ÒÓQB>Ŝ/ ßyA†%§½GL>éiÑvaÚÛŬ÷0ĉşÎ%  Z­ĈQĠ9çœóŭSo~ġPîúÁġ˘”bîĉ °•ċ”ŠbQ)U’PJé-Hh•´[g\ï ŸÉ.7X)Š˘È¤”‰”²İ^_}ùĞ£b£A`ˆR°éc\L{‘ßüüj†cqW*•JZ… nÜô½şÉˆôŒ½WCÏ~ŬNÍö›kŭÔmżnÁ{/ßÌGÙ=2–P€ÁUœ·ğoĞĉ{½Ĥ:EQPİTjqO„ax ?ĵïìĞ Òö*ۂĴÜĵŽşÌ×µÖë%! !Š.s]7é(<˜ƒ4ŒBġ)¸Ġ˘W! `„Ò)¤T)ĠŸĵ{3úŭ˙ĝìZ&HL)((4lO÷ Á‘SXŸ>}t˙Ŭkƒ ĜÇñRRIÒ4išZÄJ2"蟌ì‰éÙ,İ[™é†ġ­nIL{W-yBzÜ ×VÊfí亟B"° e›r^­VñññZ½^ŸŒ˘è ç|úô÷ŝà!Ê@(7³5 µÂÊġkĜ/Ċ‚”r]Ñí?Ú2!›[LlEH{)¨Ĝ&ÇÊ)¤B‘*Zzmy‰,Îíh˘Z­ĈFıŽ´šLr†ÏŽĵ4ï³_y~'Š˘ûĠjµ™$I!4Îtú8’_Àž 1™>Ä2LÓĊ~Ä´wĠ’'¤'FF[ù~ĥş˜×o"#ĈsÑt<ÇqT­VЍFc²VĞÍFQtĴ:>qêÔßŭöĦ–1H…c@(Ċí{óÈnëFž\M•j !’˘(2”ÄÒn^)¤^•ôÀïÓZ+a‘J)ÛZë5zëÒ:?û;U]ĥ†WVWßqâ,]=röċÉÖÚ-Ԋ”2SJé hžçEQÒ£´ÖŞ4:{ÁŜ0“îE³ŬV×f9mEL}ĠÒn&%MvOŒŒ†!‘ÎŭaRˆ˜ıäU”’²½AW” 5ĈòR.ZkJáÄöĉáœó0‚jǍ(ŠĤâ8>EљßĝOŝ·ŻÑúX¸škHm\[oƒ;—>F´²ĵ%”͢(!„(ŠbBRĜ:Av·íċ} RH}Öš¸1̤”-)eSŬĝbòú7Ĥ‰kġĦa[Żh(BñÂDŸ}ċۇößıt&RŞİµV”R^­VW…‰Û GB €t­< €NЏîö£Üêc/RjÜqïT·w•µ1FEa´ÖZĦ²,ÓRJ]EwÎ^żJîf RÚôšŬLJ>1öəuĥRCŞT*,Š"V­Vy†AÇ!ç< ”Œħ€RÚiç‰#$ZĥBpÄD0c uŻ !1cĴÁ$ç|& _ŭ“Ÿĵ~ĝ·~çà’ÔÈ´Ö.ҋœ˟_Ĉ¸*ĉ¤”ĞÎd—ĉyŜÏ4¨Ĥ[o¤ö ! Ûù‘€(¤3}&RÊuqñ××è˙ÓW×sIcZ• £Ä(œzñ Ÿû?{y˙˙ï˙ŬÀ9çµJ²,lc cŒ€Íe–°e‚T?2òDô„&ǀqudı”Uağ'+”ÔZRJe÷)E‘Ĥİ̲LfYĤ…ş( 5Àt·•?i×'D“=ʟòB5,m"˘F£Á8ĉF#Œ¸EQ…s^u5ĉ*”ÒĜ‘Jۙ”ĦË7€tR·ïˆDî}Œħŭ“33'ñŝÓġ/½µż)5n md1%WoŬAëÖusDŸR!ZyžgEQl_T´—”ĥ"¤ŬèCê=žÛWÔè\EQ.>‰Rj]§É"ğġE³9qd<Bh h÷ş8ú•ßŜOŭZŝïŝĊxŜZ?¨”ZÔZ·¤Ĉ˜˘TG!DÛïB÷Y4=)=}ž†­ĜÑ)(ìş* cLµÎ”R™R*B$Y–ċišfI’ív[eY&ó<×[˜ì×ŬĞ’|Ĝ÷S#£(ŠhÇĵ^ŻF#ĴVе8ŽëAŒA0N)§”6(u5JiĊRà.Ìé&$lŽc3/ĵ?×ĞcŽ7öĴNżĝòĝĜÉ3%MÈ]Ħq7×0ĈŞ#€Ràö{o£z˙Ŝ Ċ]!ÄJžçÍ<ϳ²éúWôŜАö‚/£×$2¨¨é–„¤µî6!֔ËäÓwîß==N‰†2aFÙrBŒ‰a8úߜžĝß>Èï|v&ŸğĥçîĴ‰ĉzB TŬùä£ûJt6 şËtIèIOŽŝk~Ga£²½rjĥpê65Ĉ$Zë–Öşİ”Zx­Z­WĞĠVµZm7›Mş²²"şÔRw Žv·éÎx…ô¤ÍtÂ0dġz7°ÑhTkµÚXǓœóƒœó)ĈĜĈĜŝħƒS³'ôĉ‰™—ÏŞÔ•ÉİéĜ$2ĥÜ; áœàÚh[ŻıšhkUepC°,¤ `(ɈÀĥ )Ò÷?ŝ³PŸ !î !Öòü Ĥ"~ĝ@L3 fUFÁ@A\ąq;ċ 3é·jġĴe¤{‘%NfÒġËÍVûscà’ŭGkŜîÜdz.´éO;c£M9îvù½z +™~Zw`ĥħ–tŭ^t}—­‹j7…Ê2iíuÀÚòbž´šùҝ›+ËwnÌŬùä½kĈ˜e­ġb a.†a¸EÑ2çĵÉ#ëëë˘Ġj)l. E‡!=Bž†PG[‘íš4Ŭĝĝx4>>Ŝ¨VĞ“q ‚à0çüÈÙg~û˙ô7ŽĵúÚ!>ĥ/NŒA[Ûâ›7 ËŠ–@âĊ@@j ıëc” ­4!¨‚ƒqeì‰¨ `…•5 QJ`Á‡ó3ÈkŸ'u]|Ò*ŠEWŬ;+6²1·SBÖħeÍNvHLŬµz͔Ŭ;Z—eYžçyKħ¤²ä^ôÉ/ç—N~ùp5ÖvsÈ´Ò%îĠ˘XuÙË ıF&sHBÁ P ˆ8ÀAşöèœYb⎐( ˆ£€ĥ;Ş ï£ş³œġ'#·°;#J6gÓµQ2Ĥ‹)zÉΑƒvFf7RFÙúšFi÷đ†(`¤áÄ­ê!?JişóuO…‚OHÍŻ{ğ“TŻ×ƒñññplllĴ^Żˆ˘èp†'j/}÷?û/}êĞżudŒ\)4šİDL j„ÀÀ :ŠĞ‚†4!0ĥĦ€œĜ…§RÎDĈìN›¸sùŠÜ.˜Ĝµ§œıK÷îâĉ_˙Žê⃢(î¸ŜGÍ,˲Vŭg;3ŬnSHĉ!_£‡PIeħĠ"MÓvRY p>ĝĊ˙ĝŽ9ŝCiÚĉ•JÔHâ5WÂÁĜ]„ŬBN˜[° a@¨U ĈhÀm@)œĜ…Ÿ€Iû: f\ċ]F˕„She@XIĤCHĤûhêöèe P;ß: <#V;B2JwŜ·34%ù•¤Ä­b!œıÏĥżÙbˆ{Ü}'NíĜt‹#(J6ˆ…Q€K&ÄÎ}­šÑÚtBRJe iŞìs˜%œÒœ`Lı³³dDÜ8Ĝ!( j{HÖ ûp– cËu)eHµ:16uŝûŻ|ñ›ŻÜŭġŸŝè/ŝ!$† R2Zk“çı^^^îk›+ê÷#ĞŬâMvb˘CbڔĴZ­Vy­V F£VЈ˘èX†§½öŻ˙èżü‡żĞĈ'[J#Ó ŽD m6²MµŬċ c  AƒÂİ20]sÎ څڝ]y|‰ÛÉRB6‚Ĵ,áíò߁_û|Ħħ÷Ûĥ3ìjšĤí,Ë WŬ{Ĝ"ŞŭGğ=aυÜ÷3‡ô+jÚ[1AFÚi!„LÓ4IÓt- yĥpç³Ĉ/˙ÍɕWçU6ĊWk Ä-–€Ò0ċĉÁ-ŽDërP!„†pjŠ@"b!B ”  £Ԝ°n`Żĥ÷SXĠ¤6yR‘Ònħ7›•BgĦ„6™îì*lç"-'ĤÙxR‰•*Ké pĵ×!BeœrÔvG… j´î Kz–(*χ sÑN:Êf…+$ıB’IM6-´;Ĵ‚³ŒéŠÖŠŠR÷ĉĈŜ_ž”ÂŭJAµAHˆ2ÈĈj*qû^É)ݜúŝWP}aĤúë˙öŸıè<)TyžË,Ët’$@˙fŒx#èžĜz…4\·Ö X£ÑëġzZ­NÄq<Á™_~ëw~ŝGżÛä!oK\9˙ħ½q„ĥjFi a€Lšl˜(%0Î[½ˆÙ“˜lò•ŝíî[HrÌ}z×˙íż@ñŜŻV_90ùçYš^OÓtŬnŻ$I’m‘{4lS=AFċoè!­İ›”6]E!Ó4-’$i†a¸È9żY{ç/~Ö6d˙­ÚÙħ—_Cuß4â(w› ˘íüà!$` .ĝÁXċÀ44 c7+ D+D†"ö¤ àR#àÜ­ûÜPPíL¸Ž0(1–%ĈšÌ(q ³ŭİ„YU… /TgHŒ2ħĦn^q›Ħ€ĥyöUe^ŻvŸĦğm͌22Ú§}obÍÑċ,d¤Ŝ|ÖäG(a€„Ia¤ı´„İéäÂJ@”%#`îPpˇċ‘•Ú*#m@8sĉDŬQiĈéŞqˆ 6(ħçjĦP…VKbn1CŸ<O˙îğûİÖ:İT*yRÉĞĠŞJ’¤·ĠˆŜbY'p]ƒwË9hŒÏCzRÄD8ĉĠj5p SA?tĉŻ|ŭżüŻ1O"žJmÏ%m7PÒH”`MiÜ- 2cĠ%Än cÓ²k&R·cUĞ+i% Ï [ëHîŬĊúĠ/°~ù"Š›×äTÈŻœÚżïoŠ4ŭ°f?˘­ß\a@‚€AÈÀá,‚à _J€DÑ ż˜Ô‚;ğ-`riżÔ`ˆƒdU(Ĵ'ŠBa­ñĈ݉êgoĠÔµĠ ÖĞĠj;ŽÜµ!QüGğŜdG¨o÷0ĉş­Èˆ:uD+• wĦŬ“ĀQtò7ŝ‹˙7ï³8(¤†Ëdµdë*Ú-||ċ î}v+W?Gĥx2ÏĦ³²ı•´­™aè˘@5à @kpcDÈHQ!díxÜŸúB 1Ÿµ[sišÎµÛíĊġġġġRuU÷€ëĤ=pbìÑÚZÛÈÜ2ÀAJ)Ó4Í)MĜ$g£µ.&„X;S"/Ž6oÎ)_˜H”-2VJ²ÎΝP(BY&dd”Ü0‘ ht`z–Ĥ2 ­;Ύ3J(Ħ .Ħ DĜҔB6‹µÔ‘Îç8sçƒÑSƒtĉNF]~#óàŝÀ ˙˜tî7NÑÑ~3Ĝ²/£œs!GFq"àa 8n/Œq.j@‚ò¨L€Í€6f@˘šUyÚŞ@n*œ"cUĈ0×VˆÂˆ\ _üÍ×ÙÍOƒ ¸EÑJ­VkEQT¸XĤG!퍞W{O =µ<¤PÎ9++lA°1vĝŝñß1ÓG …AL€€4bmżĝŸŝ'|ò²p·]eĵŬƒôP,Bsc´ šTöµĴoÔt/~¤Ïf\•1Fclݙܓ*šíVk½(ŠĠ,ËV“$YK’¤Ġjµ’4M‹žÜ£íÔQŻJz.S›=ÙF!•$dY&()İu—Çqĵ†á<çüVvô)§1‰€¨LŽĤÎE­h&›rÒzs|.Òf"~ôC]Ĥ°Eba ›Ü6ÈQ‡•i $ޏŭĝKĥïN‚PhАµˆĦĈ%ŞÜ@ jĴ…‡ÎĠä[œóı0 W8NğBÀuŸÍòVJĈ¨=7ïžU”ŬĤ`†0 YµZƒ cŒ ˘èÈáßûÁ™ÛҒvÑr†Í[WW˙ĝżúÛ?_:;>~3<¸˙şRjY)ĠÖZeĈHaŒQÚĠʜġ~£< égZêşY’ µÖ…R*WJeEQ´‹˘H’$I²,K³,+l—òMĝúċmEJϛَl£’‘’J’DH)”RgY–W*•v†+AT9ç1ç<˘”„€ÂzI¨,%ĠkFô$ôLçG÷1a$I84 ”V[n˜•;ûÄÒ­ùì+GëÇÒ@} @˘5"FP‹)‚b>•`‡°°:qö½÷6çĵA%‚fĞÌ bĞğ.I–À›ìvBBä!Q4Š"EQ%‚1Îùŝ™ßú×d},jA™Ì ÒZŻ˙Íż½táÖİ}“ŸEq-ÉÄ\Q+ĴHµVZkċ˘nlĊĈ­'W™)n´ÖĈ)*]”RH)…Ëm(ÊâİJ)9dÎÑ …w)íñRĝÛE8 2Ŭu]};H)Ó$IŠ0 sÛ­<ƒ (k2Ĉ§”vڊ”èڎw8iÈbޞ°}#ÚMB¤çvyˆ”QJ9c,âœW‚ ˜ …˜C²z´İô—'ż6MâI€ĊàF"*ĦB”(HVĊގ')”Òħ *Qœs&4Ĵ4f7*£½<5ùž„[EÖQ„sNƒ àaVcc”Ò}Ŝú­“+ Êĵ —ôñG"ıöĊúTÈ?ͲìRšĤד$™OÓ´%„(¤…r­Uä´Û47<ÑE`ZkmYÉAJİ´…B í*ŜOò,ê&fŬµI闯· BU…jµZ9çœQJ‰+²K(´ĴöŜ†àH ]wyuôì”Qy,hùżÛLPJ) ‡ağŜV+ZëVtġ²Ŭ8ĝµÚá/a °Ñ|*1E @ĈjħPá~J‹:4‚€3Ĉ¨”rJÚĠVµ/úÈD5¨€jÀĞ0ë ˜¨œ~yâĤPˆ AŒ#•ÂüOQ˳…˘(nĤizs}}ŭöêêêbğŬÎó<—RJil‰àRí”×[-†°@nĥ]) íĵŸ—Ċ§;ĵwÓbÁ6.[ğ×@ي€ÀĈş-úl5=a=ŝ êVJiٟŒBH,Š˘°Rİ4ÇĈĈ­µ@ÉĊ?ŻÊݳ‡³( Àˆ ˏ °*4@c²Žêá1ÒRJcĈX†!Ëó\ġ¨ò^R†(ÂêÒî$$2¤Bêĝ!Ċ„ZġèñUĝR"qˆ! ¸{Éò˘Ú—ĥȄ˜OÓôŝÚÚÚòÒÒRӑ‘ŜfĦۊúu¨ĥ.÷3LÁTl£ŒöLîÑ#žJŬ‘ˆŬy#ŭ”R÷1éWÄuĞ(OO8Ïö8÷ * ΒAÊÍcQeġn!TΜ3ĈĈĠÍ_Ü _ŭ£“:-@ ÀŠ d …‰È3>A‰ !Q)ıĥĜïîšv>¨áĦwFÀ€(;7gBJiDİVŸšNµî$k›1‚ÖÚ LÚN`ÌŞ”r½(Švf‹•d4 İ`‚Ú)!meşÖl÷ĵ-Rd3^ż’/è1é "$ 7áç|ï9 İß:PÏîĴ-(tšĤEÑZÇKQ-¤Ÿ˙üʑßúññĊÜPBêR°J ™áu׊& „pÎ9ĊÖ ?wñħöA kĤ¨ \§W $„DÑÔĦħLLp İm‚ 2ív˘dµn+2)e^…ìġmcvÊeĜ÷ĜАÌ éım“= rvf²~è³x= Bòx²ëAwPSż°l+—µ6EQH·ñlK)הKş½˜‚OÔ $(#  àŒ€B#rk '„.…4ˆŒúú’v{{sOHÛOĈA „J)ċîÒúXE‚Ĝ#ħŽè4M@”ZëBk-Ê`ƒÒW„áü?ƒHg;e5¨üÏvŠHo·>§“~+‰ĈÖy#Ŭ;êíLvdˆğWDφŒĥĞoikY(é.“RĤZë–XğÛŸ:X›KŒ(4˜1šr·qJiŝ˙ÀF¸í>µ¤|頇•ç+~ğ +'‘‰â@kkĤ+ 7µFš€TeÉ2â­Ñè…mĜŞÚ[]CHۙçž×DĜíTÒ R]öˆ~ÄÔŭ>tÀĤg+•îñìI‰`s…ŜFŽeĠw­”ÒRJݵε֙Î[˘0hh­BlvC ´Ħ„‘²9'-óÏĥ0Ûġûž~ƒ²‡Mv°;ê„~şP]€Îİêj=£ŒÁš0HÛHZ-Ż·SCşIÛû•†U[’^_SŬ󤎺C°¨¤^²ê&~ʉ a²T’ÇÓ'¤~}Ñz;ʜ@­µ4Ĉ‘ĥs@* M ˆÔe_)bŒa.´œ–ıNÛ¨è#oĥóí'†6Ía™Üùżkc3ë9§šZjHİĥU½ı[ÜËÖ!‰hġ‚-Èc'¤ .¤:’ŝ£>Dñ4Ĥ­Ìgŭvރá[™ë†‰¸óx²ÇÜ 0ÍġFVöž#Dk]ĉjcŒ–Y;§œ@j@ʵë şÁâۊŒ†?ƒócgĝ§{kSû4˘ìĥ4Ùġé´rĦF[?RĦ „Ö¨ô,ò]%† :è­°…4 1™!LsO2#žDä),N~Ŝ 1êmWôÏ+é§ĵĵ9ĉÙŞ#ô˜êzü8veÂzçü5ĥ½†4ŠhB ÑĠ°ËG=@!ġÛÈ *+4J0{˙ĝÇ?ŜÑĵ˙éOşġyBˆ³Sè²ÌÜ6ĈÓeŞ+ğ~JĜ7]ğ–a’V‡IRĥ&`CÑ³"²òĴ•yÈÓ ĜáÊ1ñ*éé/¤½ĉĠ~ddĥ!k!QBhHĦ ”qmÜiÙĉŻ{]ي€ÈĊ6Ş~¤‡İRnÁG%İŬĴ@3_§œˆ+{oû)×˙¨gÙíGJƒÈhĜœ íĥ#(`ÈDÜGQG[Ù%„D† '²Í Hĥ0ïy§ôî2‘-6yF£­ „ÔȵTJن›Fç) ¸öQ`´çsú)µQžK˘âú’Ô(ÔÓÎCÚÊÙlw6˙Š2ÚµB6f òĤŠBż³Ymg;Ëkzd2Ú ‘‡|γ !l£ĥSPÛ%Ĝzb=òtž‘>˙„RŠm ”ëĤeóC\·gSnr{ƒh2ê Ĥ=$ı[ÔÒv–ƒA÷™.3yÖÄğÑ>°îVHċh(cMu˘í !dPNv%}̐²i˜çâaÉhmgâ"‘œÈ3ž;QOĜĈŒ×OY=Bġx¸Ŭĵ°ÚttÌúZSä y S Ħ\7€NĉN!Ñç&Ŭ‚$Gċ¸›ïQ_ñxk·Ò1ĈgVëwé”ŝaŒ…µZ­ARZSúŒ ŒˆT€20 „TcĠ0 ëcQqš²éB)í\ğsA—ŝ鲛¨vĤ”wÎ{eŻ”ZĦ…ÚĤUBˆ²‘ċ 3(Ĝa+ÔTHdç/  ÔÉo]Ĥıt/ù=“eĜŠ $Ĉsb™§0^;Ú=FQDƒ  Qħ8ŽyE,Š˘0Î9焐€1VV?ĥ5m›ïÎîq˜ŒïQ]=ÑìBê&ÒÇSú|œšAIRċs!<Žñ(Š0Ĉö£9´Ñ6 „Êĉ‡0Ĉ&‚ 8XĞĠĈ“Rf]dÓ}Ŭ! GJ#OFċwêSFi­•m˜­„ÖZ! )(Š˘Èó\%I˘Z­–Èó\P…`ĤÛó>¤-Iˎ5ħÁ 0Z÷‘­B²·ĞĤ€\}VE‡bĜ²ŭ{½^gµZ7 RİÄQĊAT9çJiD))!€Àġˆ ²26Ú8ì•EŬ“Óî %ÚMN]ŞŬùCîš3ĈA ‚`Öhù¤ ˆ%%jŻĦ cSaĥ !, }Zë´$ĦÒtŬ½Ùé!-­@ĈI‘ZkaŒ)´Ö™1&•RfJİvžçYQIğŬ.Z­Vħ.1i —Ó„§Ħ’ĝhŽñf#%¤WS>L……§­vĊT7P 9A†ĴÑhF£6¸Z­Ö˘(眏QJÇcuBHRq—¨ì¤éŽ{yéVJgáġƒ01ġ5ġıÍ!UĈĜ$6Ŭ7˜Bn´ĝS´:…àĝïÍ˙Aœ`Œ0ĈĴcŠn²Ùêö(›éú,”Ĥì~@2cLµNŒ1-cLS)µÇñŞb-ŽfRiU*•leeh6›ŭÖS²énO+¤Öá²F˘r%ƒlĠ†Í’u aĤ7]rÉhK5„.Q£ÑàÑĝĝx£RİŒÇq|€s~ˆ1v1v€R:yèäé3'NM<|dßäôìÁÄŝpN(€‰+ĥjży@Ÿo,\Ĉ´ûI„`#$r‹ıÛ/°ÔoÒ(E6ö²/VHŬ˘o\â´1öŒ4ĈúµÒ›mn½qğ6êRuŝw˙* ,°)Ú³ûußc:w[3’SĝÚl6ЏZĤk˜)wù¤óúŬ˜ßÍm÷ĈĈ>Ŝ}½1Á€ASĵ´<”ƒÉÜkËqÚŜv›;È}‚.U˘şĈ„’Mß͔˙+³ñ”Ro|?Òġ;Ë3Ԛâ`lïÎxh[Tue=ÇŻ.ŻÀHí^c3dûĤώÏĝ›_ŝÒñqNKƒt×ÙcŒĜC¨3Pہ–{›çbu9‘”°í–icĥîŬsÍÏ9_àœ/2ĈÖáçÍfS 0Ó{(¨áĦ‰ß.@v¤ħ I?ꛎ‰i(2@ëġz066MLL4jµÚ(Šfƒ 8Z­7N~ŭŝô§^}ŭ…ŭ³GêŠqš)ĥ2H4J–mKd ­;r”PwžtOqĊTŒ[4áŭÎ"Jì‰á2˜a4\r˘û_G îŭˏ#€vNiiì)­KûŒv•:ÚşĈF_jÂ%E PÄ@Bìkáx4%0ʀ0{]žÑ„n˜…µ4 lƒ8´3ƒÀ.ŠBƒĤPöÚÄXâigҎ‹rïİ´%yâRş ` µQÚĤ$2a´ LmáĴ’ħ‘=]˃éfÔò>i@-4H÷kĥ {Ħí cO&F6 =ĥ́;ŝds=8NmÑRâXYZ˘‡Ò ³ÇZŞ.–' œÂH CìûAc£İRı €Úq“î;pêHÒ £İmK“+­ŬëìjhäĈàÊí5\½½ŽÍ9‚Ġ A`wIvJÙd{Fa„ꐔ1„2PhDAÈ pÎ0€ dq@qÈrj+D”ş …v|C66kZ„Zr+Éc³ı í:Q\`W‡TË.ħ”Á b7 !4,$0vvlöä›GOżĵ˜LĴŜżırçżz7˙ĝ]JéuJ)”N’Dġ¤žË<¤-×gBbş7ċĉÁNV$uİ£@ĈĈĈx£ÑÇÇÇĠjġ`EÇÂ0<ġÂ+Ż~ġÏŝá?úNQiDsıĈg-…–Ìc3­6+­4(ŞĈnµ³&kX‚0ÚÚ¤° ÊF>šÎĈĵ Ç/7ÙpëˆÛRX’r £mÏ1c`ÈĈ{HEİ”‚Ò RÚĥ˘ÎqíüˆÖ{m‰Â€RÀ.Ò=‡Ú…P—“‡ÛĊF5('…[Ĵ5@ÜBe܄#nw%ʨ]8ħ?(m Íĥ°‹-§v÷.5HÈ,iı…ßT4HHaìîʒbI”ÒÀpmkXcCa” Ħóż)żĞħ$Y0@µğNa ÊÚ.Â~ĥU°ê„Qê6ʸ÷2ö¤“öŒqc§ÌĈZnD”Ñb³2rƒ0 #d™Ĝû´ĦV5‰ 9£ö3ሪ”br‹pG0hmKĦ:ğ(SnšÊħ" ÑQ^F(€ħ EĤ –`Yq8RÒÄ~ĥÖV,:1ÎRS ŞC5˘ˆ#ސŒvmşÔ]ı~QœQpĈÀİAÀ )•+wrvŒŬĈÀöxÚĜ=ğÙ#0…{gC)šİÀZ[bı­°°œ!É(ċ¨WypdzßÔħ“˙ûÁĞ_R—ŝé?°˘0”qµZM4›Mé˘ĥ++ôÄÍw|4lğ0–;ër‘]J@[˜êú‘‘QĴVĞ…ġz½^ĞĠöĊq|4 _ûĉ·żġ­˙ġŝµğ†³ğ-LZ“D`Ĵ ÊXˆ#İ ”!JC Ú*RC ( c œş{„tdaşrİ;ğPt´²›òÚ0Ih,àn12ĈEM•Ö(a\ù¨ -q;ÑÒlSZ ÜN[ê#Ŭœz³* ´cŞRBwˆ RC  I ¤2X_É!­°£¸:G5W‹Rı0zMÚĊXGnn܁Î%#ŬŬmÒrµa˜R 1û} éZP™ ³˙hû›’.żV à”Œ›“0Z9Ĉ‚ÈĴz!œuNDKÖèalä“Ê™ ³rÛ~†a ZûoÇìǙU,N]XİC@JN+Usĉ;­A˘À‘ĴU;„;µŬ)7Ĥ•U%€)2·S; …6žÖßa”!Nİ;ZŞÒ 0Šv"Ĥ]ĤÍn5ëĈ“ş ÁˆĥDD€€3„!GÄ ˘!Œ8"F0ƒ0àuäfg{鲎²6rÜ@(ˆÒ`Jƒ*’ċ RÁä Ör†µµWn„ĜWŸ˜iĉßŭû_f?] CµEÑz†mÎyQEŻ!~Ï'Ĉk°ëXş{ní9 M×!£ñññ`llĴRŻ×'˘(:ÁÉ/ŸûÍżó˙ç_żm½ž((ċÌnG'5 ”% ÂXS… bIƒÌÀ.°Ú™µJ˙ Ŭĝšùo_ÎÜâ@J  Y焔J#¤Jk0ÊĦ”ÙX´3ŻQĤ5Àí‚IŬBh¤;ï”%Úµ‹%]VğX€”läŒ9Ó ³Ĥh^g?Ë8Ÿ ˜S% Úh‡–ş³¨€EÌ$²– í}V-#N6vü]O2k^Ğ‘ …ShN`³I˜S Îô%´s\¸µ@¨n`À`2ĠQeàŽIш 3ZùžĈùRHI>Ĉ€H ÂİÏréQ´lĝp`Uu †Ä̒'–Ĝ pşaV2¨¸ˆYmÀ"ĥqRw`àÊŝpfç áÎäh ÒŞT{Iıl*Ğ´‰Ĥ–œŬ÷%šĜ÷‘$rc„]•ê8 Ñ $°ÇĴÜ€€[˘w›#h絖ĵhèÌe4êšpzáèHÔ e(ìüB vŜqˆ+ĨÄq 1b‰Š;sapJÁ)eDoT=3™\+h !!sQHˆvjĠ@QȄÂbĦ‘§éŝ{ÁÔWħ[7(•  îšûԓcGR!™.viÛ ¤´Mˆ7ş ¨ç6˘ˆ×ëġ¨VЍĊq<Á µññsßŝßŭoÜWœ^jK(!= mĴÉ @a€‚XÌ%œĠ„ı½+¨Ħô§¸ĵwgâ#ʀ:“‘V=ŽÙHb‘#Ў°°ğ{Yn9ìîWÖlĠYe$şü:և`JıÖKÀ™Q°Ñ0@ı÷wfĵ·çcaözë¤Ö€î÷*÷]9ħß1wDáĈ­LÀ€€7BğP ŬúP³ħH”ĉ8Ü ¤ ˜57IT¸ĜJı¨ ĜEDPbŭ3$fгk‡ÑöxT9Œ0 unßğô+agVŞ(] ”!F6ü[ԑ”SPŬAŬdN:ŝ Ÿ“@*Ì*k2,8(ħ7…U[ż60Ä~ŸI‘ O)Ît§şÔˆóS’òx;ßatsŒRëİóem˜ KuĜUU¨DC,éÂtü„?“ÖĉÄNE—ÓĠm†Dc³éħ³“²ż=§ıÒXK ĜûcnsŠJ¤ qÈqƒE@)¨Ħ Î$ ¤F’J´2‰V[ Îü§T'(Ĉh‰ÂÉ]ĴÓÖáC¨¸ˆ[Êë.Bа}ƒË燐H×X˜ž‡=ĤŽĥ­¸PNgŞ êġz£Rİìp'żġż˙ż|/kLV>mJ4 !5„40È5‰+÷îbí³OÑşubqĊâ<Ôú*ŒÈ7l˘íŬl:#›‚·ÌöÑBÛMŬíê£;êŻ§+ È¤AŸħ]”ûĦċû’ҁÜ3]魍œ²Ŭ¸iĵÉFyĴ~Ċ]Ĝ·v¤žûÌĉQ´ßsô ĥó>….HCDú+żğÙâ<JÙŭy:ƒ˜.rê7î}k¸ï6èXwGöFX›C·˜S}*ŒSÏÁÜ™9¸JÖóѕJŒJĦEˆ£amÂê$‚êAú4‚BIĤħĥžc­U¸óıKò`9Ló:öjϗQŞJ)"„èGFƒyËCÂFĜhw/¤]’ú2`ĞàwMƒ  Ġj•7JµZ˘èçüĝıïŭÁ7Ĉ_<·ï“–Äb*!•A!4$£Èa°rë&ĉßŝ,˙úg0ó·ó:5íŭĠj3ƒfHi³v ĥÎi=1ĈèRŭqë@KAÏc}Ÿ·]eŽİ!›n÷ ŠÚêħ§=ƒÖ FÈj.ÖĤäê ħÄ™i4²úĞĠœÍ˘™W­µ´$#BĴ„PÊ`Ú×ëċü` 7ŠBRJU…–Rö~Î3IŠ]Bêl0JóÀžöġ#§ŽÙŽ1ĈFTĞĠQ‚àhc˙Á³Żüà_ĵ“)ÜI$”²BAqŠLä¸˙Á/qí_˙cӘğĝÊŝÉ;cG]WJ­J)[ZëÔU™ı1ÒċcyBòx–äDĥùżsŽlħx›¤d‘Ô¨%Än1Brċż˘˜ħz=â‚@ÍЧȃ™<ÀA¸álòNeŞ V/afLŜ5† !’<Ïóè:ڊžQ>ÒH5 LÓ(ۘïvöÙ^Ñ~J‰s^FĠU+•ÊD†Óœó_ŭ˙Ù׳¸^YÊ@h@s†\˜˙ġ_âĈ?ù‰—*ìJcúàE)ċVе$lJ)STµ.´ÖJk­]Ĥ÷0ğCOXmÖŻĥ]?ċÔ]Ġa+eĠoŽv—˙é%Ÿ-ßJa=‹q(˙§ĥ2”Ò0 zÇ+Zë|,ZŽ×VƒVûôñ¤ÛŬ~Bˆ1†şÊü4‚°Z­ÖÇĈĈ´‹”›:ĵŸOŸ˜Äż'Û(Ÿá†%PË0[Ëï$¸• ħœĤi+I’"MS³Ċ:ä²LşKfìâ½ùê¨ •ĊN)çœUĞĠ VĞĠâ8ŜÁLE/ĵñ÷ŝ“Wç2C7%”v9BX½v 7ŝż˙Dż\aŸp­ŜKÓô‹vğ}§Ùl$IÒNÓ´(ŠBH)•ÖÚ(ŒĥĜŞ/ŠWHOL`¸&’;é€ÈÓöŬ<ÏÚíöZ’$YQ²ËL׏ˆĥRMžˆ–/FìŭĵÎeYĥÔn·›I’BµñèDċÍu£JP›žĠFk+sú($Ó­Ž\H=Š˘}AL͞˙öñÏîĥħĥ–Ú‚µF,ċÔÂEL²•ġÉjx)IŠ…,ËÖÚívšçyı>`Â1‰ħŽ|Œ"-ĦwÙò¸£Èş(ŠX­V jµZEÖMï?yĉìŝsoîû,ĠÈ d Usżĝ+țó†ˆëEQÜO’dµŬn§EQZk5€„ôf;OFğ•°FYÙoUİċUÔEH$Žcî|GV½ġ²‰§jï]eûEi0G(Lħ ½ú9NżBÜËó|9I’fšĤY—ïhğè3·‘Œ²+5FY½}·Ñ ¨ö&’0 Y­VĞÄq<ÁÁ fÏŭèÏ^_“ ·…B™ëCs˙ÒÇÈ|"_žHĊ|–eKišĥ²,ˊ˘P[‘ŜF%=u‰îáñ˜ˆg”‰jФĝ~~#Ò£ŽPİTÂJ҈x2‚éÙsß=ġùó÷S×ïĥç c’ŻĴOVOÛíb!MÓĠ4M“<ÏĊĤü~còÔÏŭ‘ÌC*ÍsFhBşûÄíĈĞ_´]w˜wY"(r‘uû8ç3ûOżtvòċ×'?O4 i’27KżŝĤEû.ˆ¸éÔÑz’$İ˘;A?!y"òx:ëĊĉNè1ۑ’*•JàĈ£(:8uúĞgQ½óóë0˘Dn£êxRĴB­ŽSG˘Ï…(îE'6íÚĴê>çıÙB=5˘ÙöŒ(×LnԗÇ–Út_ĵZ­F.ïè€ġŭäĠUĦÉġT"“‰Òà!ÂÇ &§ĵ/R1—ĤéRšĤëišĉ=—úŬ~X2òdċħ[•ÑӘËdB"°½‡úúŒşĠQ†¤Rİ„„ĜdÓ3çż{êó[M,,eV)eƒ…^½€Iĥ²>Q‰.uİ£v–eŬê6Ĵú–Ÿ/“!ÓiëAw_Š­ˆèuÔh4ÂjµZ p?ç|fêċó/Ÿ~eòR˘‘ ™kÌDċ_˙ĤUëŒĵ•çùŭ<Ï×Úív·:êw1;˜€žx<<žœıûÒU×Ŭ–Q3ĈXµZċ.I~< ݃'ß:§ƒƒġw>½aljXuÄ8ˆZ‡Zż‚ÓGâ˽êH!ûĴ DĜ=Ġġ`$Mv½mËm‰´:ꞈ½m&hÇA­V‹]{‰ƒA̞ŭ៽ĥ" ıіĥı'˜żôÄÍ/Ä4#ïݘ˲lıŬn7­ë¨PÈHݐĥ›Œ¸´mħIí6ĈXݎ"—w´Ÿs>sèÜ·O]ı—`~9³mŬµxd}GK1ÉWÖÇ+ÑċvğXȲl%I’VžçہlŝÔ0’&;£ğÊQbûÚï uô@d]µZ Jߑ•_:?~úċ‰ ëİÒH J˘3,żŭ3ÌÈöyğ(ŠûyžŻ&I’ĉy.]dĈ¤Ô/ÒÎĞ"'³&ôjêğ1¤”ĉ]­T*A:xê­WŞż{éĥ­YWÖ ˘DA­|†ÓGËRŠ{EQ,uEÖİ-ւí.OuMÙÒA„†NÈ÷¨Ĥ!=Ĵ:✳8Žy­VĞĈq<†áAÎùá³?úÉ+‹…ĈD ‘ÚŞEN°ÑGP7>/Ĥ9y/wê¨Ġjµ³,+¤í°µ İf;쐐}ä­ŻżQ9||ì“ĠíBC) ĤRĴû0mò[ZŠ;yž/”yG=êÈ`xRż* ^yx-€ µòökĞ•¸TGĞI’´ğ|G$ÊÓ#í9í‡DzĥzWĴ”;òĊq\:+÷qÎgŽŭĉo)œ9Vżħ\ ĥu; –ŜŝÌ żİDqğ(Š…$IÖ\ûaħMÍşavF($³G:!zx<*ĥQDĴ”RRİTJżò$ç|úÀ‰/Ÿ7ñtOoʸ]:·É™z fŭ œ~ĦRúŽ–Ò4]K’$PBlä˘êzAGqe/óÊĜ43baßC¨#lŽjµZ ċ ‚à‹ßûñ‹w…;ı²O4”Ì]xĉ֕|š})ċ\šĤ+.ëşB ëÚN™’ˆ<yx<›kéWvêhÜEŬÎzċÛ/^½ÛĈÜŭ–5×iGHŒA/}ˆ}ÁÚêxl.…ġ%I’ô¨£­žĥSGž[]]bIW;ó]ގ(†!ĞT*qݎ‚ ˜>ŝ;ßz388[ğ‘Ja}G„$O°úîÀ,)nˆ˘¸[ĊŭÒ6<@ġË/êWÙ×'ÁzxŒĈÚP9PJ)­T*Ħ[&9ç3ûùUÏ4ŜùdٞİB”ÂPÈU˜ĉœž­\’RŜsNë}ÔÑvQt´ŸyjëÍHl5uĜ !6ânĞ£Ž}Ĝİ£‰ qΏĵĝ*ÌċĈúŽœ˙lŝ£·an]ÉYut/Mӕ$IZY–ċ=Y׃’]·3ĠÁ›é<|ú›ß{áNްœKBƒB…÷ßıw=bĉ!Ä|–eĞív{u4lIgЎ€#ĈĜììùïœı9—àŜü:Œ*\Í:B½|û£ġ•ñŠıô£í‚›žù1z>¤nħ(•‘ĥŻG(ö{(ż\ó=ç;ŞıD·™—żû‡_ĠµÉĝf"QH]š$Ó&VĴ:şZĊ=ç;ZMÓ4ïQGÛM.ŻŽ<ëòµ÷š:Q…Dş$Òè” Úİ:ŞĠjqݎ8ç³gż˙G_Ƀ*żĠVÊĜn]š+Xùàoq”›Ï‹˘¸WĊb–eëiš;ĥRŻWG£Žj::xòËçymvìÏÖ …€ž²”ĜŞ kê(Ïó$Išiš}ÔѰji$Ġш’qĦŜvxµ‹¸{Ú[ŭǨŽĤĞ“Ǐ}ŭïÎÜNÖ …¤  à”àŜûżB4ğ9IġE!Ä\šĤ+.² ŽfòyxxŒ–:/#뎜û½—ßkáÎüФ°gm€²zíc¨lRGĞ[¨#³›ĠÑH’)` @ĜƒG}·¨£îöç~ôgż‘³ˆ_O$ a`ˆ-?ĦחħöÑŻp$Ä&uÔn·³˘(Ô#¨#Ġ‘‡ÇÈĞ£éƒ'żrž×½y"PJĜW1“ÏĴ_Áİ™çC$!mêneSt  6ގž:˘Ŭê¨RİF£QuyG‡:úĠoLŬÉ4š…FĤl,cÀÜğ‹hŝÖúQœ:Zm·Ûí<ÏUäîÇyUGn³ÚЎfŽœûÖK×ïµpwĦ!4 @™ 2^ûâġǎvĊú0’ İĴÎmóÂ`lxôİ#ÚïREQ4ĉ*zϞŭáŸ|9#œ}ÑZCI J ts kŜĈħ˜\.ŠbÎEÖyuäáħĠQ†üßщ/żÊk³cï_^CQHH)7şÁŞU˜µ/ÌcTGuu4š ‰–ŭ @ ()W֑PG¤kìPG˘÷dÓġS§ŽĵġwĤîäİÖȅ (§˜{÷çˆo­A}âş=&I²:ĥ^' ÑVG³GÎÛúŽĉÖ!òà(  W.à@ı:r÷ú°—ĠÑh*$Wí[ÛİÓwB?³êރv?èQGĵÑhÄqGQt ‚Ùóĝ“/§`ìó–@ž*(0JĦ×°vámèÒw”ĤisuŻŽ<<ö€::ŝ†UGŸ­Cd^ĜŬ8 óE˜ġ+ĉôLċ!Ä\žçËI’Ĵ§iZ(Ô^UG#IH‡Útnë§4dŞŽ*•Jé;š›9|fĉß:p7ÓHF˘4¨“yóïŭ-ŞË÷VğÔÑJğŬnċy^!”WG{OĊqÜİYwäĠïtcÎùŽrawáŒÛˆâµ‹8Pi6bóY—:JÊ"Ëœo´ëׇÑ#¤^óœy:_’ôwR ­ŽÜ„w‘uGÎ˙èġFB(ûl½@.4ÊôÚF^ĴB"v1ĦnèĴcééĴŻ;VGµZ-¨VĞŞ GŽ™~Ğo% İÔȄ%Ħóïŭġċğ+u#?펜B=lRĴ‡‡ÇHİ£ïĵtc.Ċı–ġ  ³rĞí•çQ&!™Î,°ŬcM‡˘FVUĞĠ¸,!Ï9?|ŝòuAÈ×ïHÁ€ı4‡µ oHDËș~êhĜr@ĈĞ#Ŭ¨ŽfÇŜûtB(È<ƒĦHbĤù…95SùÔİ£çIĴÉŒ2•¤;ìž íTĠÊĵ£ŭÇO½|ܛn§ ı0Ȥ'`ÀÜ;?GcġŜJÍÈËŬ5İzÔ†ÜùÀĞ#ŬĤŽŭҍıwÚ(²ĈPW&ÍÀĴ|„ƒ•öJ#6—ŸGu4²&;€QwlŸpDnğÜ£Ž:ŞVĞca ‚àıŭäġ5IÈĠ–@–)(£Ħ¨ċ9Ĵò9ÑOʊŜ^yxìju„Ğ£êáħ÷/­@ÊúŽÂä÷aZ×Ì)ë;šïÎ;z^ÔшšìL§Ó) Ĵ’g6áM<Ek4a­VĞGQ´s>}àôËg÷Ÿ}mòv&Q(ƒD+Ĝn°óo˙ Ğó+UŬQGŭv?úŽĵ:òxöêˆ`§£ù·ç›ÈsaóZx`¸ĉ'˜Ş´–ïhî ¨#ݐ–Œ”Ò.–Ĝö|äİO8lŽ‚ `•J; ‚`öÜ˙ôĠ5 r-QHsà…\ĵƒġß3/ÄôbOÖuw?“ö5ñêÈctÔÙZ½ù*ŻÎ޽iE.mEoÂíË0ÍĞĉÔìĤÈşÇ­Ž0êêhtMvÚljƒdžú„ÛVı 7É9?tWÎNxnòVސgİÔ „˜{ûçoŜ_޵üÌġ;zuä#ë<Ċ­ù„€+˘JÂfġĤŞ­ċZ¨ËÈş•çQ(!€NÈ·Q}<ɐ··òulApĝÜüÙĞĞäêzL˘Óš\.ŬFóÒ{ĉhD/şšuKiš6“$ÉRÁĞ#Ŭ¤ŽŜx•׎Œ½÷éDV@ĉ9@(HÂdó0Í+ĉÔLċc)eé;j%I’E!Ÿ'u4² É%ûräIMaÔÑ“.Š"V­VƒrÂqΧ§Ï½ŝÊäݳ“7BäJۄ^ Ìżŭ7_żżùıb!MÓ5× Öçyxìmut€16{ĝü·_ş>×Ĉíù6Š<·½ ƒYû‡jÉr-ԟ—‘uív;ééŭ\¨£Ñ5ÙuşĈP] ²˙CĥSG4ß룎f_ŝ៞[,4·$rekîħB,ÜFëò‡ĉXÌ.Eq/˲E—Wçy’„ĵ:òĜêˆs>}àĜkŻòڑħ÷/Ż@J¸öŒÙLóŞ99oRGiš>—êh$ ɘ2˙È%Ĉşħ%O.7vhuÄ£•JŒĴÛÁôá׿r~üĝ™‰m‰Bh¤BÚ~ßù_˙ ÍĊĊÈúŽÒ4]K’$ɲĴ_Eï‡-äáá1‚êˆs>{äµïżts>ÁíıŠ,³g--ĠÑE޵½:eB"ÄEÔi€ÀĜ|¤2¸áá­wd sŬPğŭpÇeU†³?ü“Wîg·…\Ë\”BŜż‰ĉÍħ ßÑbšĤÍŞ#íĠ‘‡ÇîPG½Ĥü/ĵ~žWgÇŜŭtÑŞ#İa+q[•ĦĠQG÷¨£Gġ-ï*u4š&;c—µ+·C튋ÇĵĉŠ˘Vê¨VĞEĠjµEÑç|ĉèWżözuöĝĜĥ@ž+dJƒ2 Ê5îŭâg˜l/-J|î"ëFÁĞ#ŬĦŽŞĠê&utĝüw_ıâÎŬuYá"ë8À9ÌÊŞ%KNŬİ˘=ЎF“œ@˘”€—Kìí§´ ÚÊwğŠŜÖwôŬ?zñ~ap/ĠH…ħE½!ĉo ŭÙGĉhÌ>,kR ĦŽ´WGğWu'Éï?úê+aèĜğŸŜ‡PJĜn°„ ¸ÓnNÍV.nĦŽž+ßÑ+$ •ĞĜ ¨‡nÎG†x|KżQu´s>óÂoŝΕ™×[…Ô(´ ĉ~ġ7ĜŸĴÜ”¸šçyé;J·QGĈĞ#½ĦŽŽŝƒWnÜkâν–SG $Œ`V>ÂĦZ{İè+^8!9>ê10G Âœ AR“b]ĠRM”U^úŜŸ™Ëî& IaÛKPF!ĉo"ùü#}8Ĥ !îEħTvƒġêÈùPGAmvì½Ë+RAċ9À(ç0Ù\?uÔôêhD ‰8uPc`£Í ŭa#ê:ê( CÇqTĞĠqïœOżµß}#Ü?]ğ™B#ĥLQ ïü5öYut%Ïóû:*ŠB<&uäIÈc”ĠÑkßċĈ|·ïµP¤yçé„q˜ĠÍê(MÓĠvğzu4²&;ĜoĜofœOéñQż ×wâ9ßĞĠj×|o*‚#/}çÎÌċ÷Ú ı6`œ€ 1ɋúhÌ>pêh1I’ġGPGf$óêÈc4ÔQwdŬŝ#Ż4½wi"/ òÂĉLzĤ}Ŭœvê(˲ҷìĠÑÈħjHk[\•{1ĉħQ˙vu ŻT*q­Vk¸2 Ó§ñ7‡Ş×ZBjRğŬĈüŻ~†ŭùê}f}G÷“$yTuÔCĠ^yxŒš:rIò8ç3G_˙ŝ+7ĉÜۂċ”Ä@Ûĵ£J Żäy^úŽĵ:iBҝ‰âüIŒû˙SGÛS:‚`*ˆ˘#§żŭ§n·Úݰ-m §(î^Eûó úhDß/ŠbÌ;J’$÷êÈıPGçxŭĜ{Ÿ@á"ëc0bH›Ó³ĠNĊŻŽv!™İ@(%ÌÂb&AuÔQ½^ĞĠj# ŭA̜ùĉwżÌĈTn´„„r…`•ÀÜ/˙ ‡ŠġyŞÄµĵ£aĠ‘öêÈcwİ£Z­Öi?9Ÿ9úÚwÏŜšOqû^ÓVeP †fċLגĊJ żèŠĴóêhÔ İŒ#ÄVh Äúyh}D†ĝYqÎiµZ-•a ˘èÈİoŝÄŬTb1•ÈäF‰£bŝ:òĞŸ¨1û5×ZNÓ´µuŻŽ<´Żš3‡Ğ:êTü/ŠBag‰ñ{^&!ı1'(5@À (Ŭqd ³]÷u?u4EÑ~Îùìk?ú³ŻŠ¨\o ä™UG”P#ħôî_cZĥîQÜ,ûyuäáñ|İ£›÷Ú¸yky–Û¨[ÀúŽÖ/bşž-F\}Qú–Ÿ„:Ú+d4’„´‰q˜m?Á(A@)(Ħ;y›a&íRGĴZ­òZ­Vxœs>UŸ8vâ·~wöF[`ÙĠĴ+3tW¸yó39’÷…÷²,[j·Û^yxDĵiÒıŬOK>˙?}+kÁµ•İPPĈ€q ĤV~ŭט–ÉmPyËùŽÖ“$Iĵ:òxNÔÑùy݉·×0ÔÖŜ B`é"fÙbÄ+ívħà|˨£a½÷äú0’QvJĉ ħ9HœPJ·ëĝÚO%ġÛñlzœsN£(êY7]ŸÜâĜo~ġ–ÀJfĠĦkW>†û…èUGY–^yx<'êhüĜĝ{—W UvħâQ'²îôleXuô܅wïB2Ú5Ġ5+@A@†w!m—üJûİ£JÒ‚àclöÜüÙWñÏ[İÒàTŽ•w˙‡TzÛHqğ(ŠĊ,ËÖ]7XŻŽ<<ö:š>|ŝ;goÜkĈŬòB6²Ž1`ġ‚SGêŠó-ŻöôCë·IŬħ:˘oŭë=·>QŭF”môċ#ڀQ‚!ƒI"¨šJuTŻ×ĞqO†a8Ġ8pÄìW~ûíTa%SÈ eí€h^ùòö•b6ÄûBˆınu$܉:Ò^yxì>u´ïÈısÑĜħñ÷?]‚Ê2¨"·áÀ„$w€ôş95[ù¨·[ôCŞ£çj}É(;£5´Ú8eé j0Ĉ!ÉhĞPoÇ1o4•8Ža‚`ö•üé[) ĝ+9’\AK€q†Ëïŝ ³&½ĞĵSĊŭ$IÖŬîg§ê^yxì>utôüw_ııàĈ½ò\Ĝôٕy³ì~ÌĠĠ2/ñĠÑsµ>ŒdµïnӜq‡‹’mÉN‰‰sN+• ŻÚv°AŞí?xzê+ż=ġyKb-—ÒĜ'3‚ċO/@ßıZLx×İ£ċ4MğĠ‘öêÈcÏŞ£é}‡_9޽0ŝŜNjPBB)eÛKP äfŬáêÓQGZyBzⳅÚ~Hù`ĴùŽbèöL¸{ƒ ˜yéòĉŞĤìÂJ-4Œĥyn9V>ĝ8LŠÛJˆ;yž/ôQGêÈcר#`§5ë^ŭŜ+7ç[¸9×ĥêHJJÎaÖ>ÂìXv?bêÚ£aêĠm½>”‘_žž ıΔf;­ ´1V5ÙÙĠ|ɝ¨£É ĠNŸŜ˙Ĉ×ŜH„41XŝìCàö•|Š™÷ÜîÇĞ#Ŭ­ŽÈŽĠQĜĝ{—V!ó*Ïín™ ı¤›ÔѲ뇖=dŜÑöëƒÑžž#j IW şm”]żÉĥ:Ş×ë•J2^úŽÎ|˙ßH g—×TĦ e(RĴó0Cò›J·‹˘êÈySGçżwöĉB7ïĴÛŞ Fƒ@ÌúEò<OD•ĉ$OHOÚdG`` ĴBÒĥŒŬşcìNòçœÖjµ°ôq΍>vzêÍŻO]m R€r PĴ~q¸w5wyGóY–­¤iÚŜ:2^yxìJu4iĠÑısáĜ ï_ZÌ”Pĥ½„10Ù= ıaNÎ>’:ŞÚf–Ú{ËÇhĉ!Q âÂËş d¸ ·ídƒ‹ĴĞVĞQÇïhöÔwŝèĤ˘ôòš€VJj€¤HħúÎß`–Š˘(îvUeĜ‰:ê5Ûyuäáħ;ԑí{ŝ;go.$¸~·Ġ™"„J`ˆÛf4hçCğÔQT­VkQí‚`ĉÀé—_™<û}_44,, Xĝ>Èüġô 7J)ç\ëá^uÔÖ½’‡‡ÇHĞ£sçɓ\Z‚*$” -ċó êh.˲%— òô|G>¨áİírGŝZنxFëAĤşĦÈÉ5à‹*•ÊxE‚ ˜=ŭŭŸ_Ì4ış.  B5@ÖÂÚ?ÇQnEq/ÏóûI’ĴišġQG–ŽïoœôêșĞ#·aŬĴŽÎ}ûìıŬivİ#ÀPĴ}„Ùñĵ£Ž²,[KÓ4{jêhb4Mvښ͔6î(ê™#Ħ.Az½^FÖMrΧôÊÙÚÉs“_´…­—gF–?yláfûÓu”$Iğ:z˜2òž€<w>ž81ñÁ2²NÛjŜ”¤w@³[ÚUô÷LÔQgÁò„ô„ i·Rhr½)œ Ó 0 E kü-Ž„ĉzݎJßQžçò1ĝŽĵ:òxrêЎÊġs>sĝ•oŸ½q·…k·×‘§ıó×› Û´£FÖ-zu´— ‰ZnDS3`E0ÂèŻT*eU†}AL:÷W'_™ĵÜıĥĉ@ €Ĵ\||áVûĠ”U’$igY&”RÛċyuäáñì•Ñ#ݣə—_İLœ˜ĝàò2TQ@)YĈ0ÙôĤ>5[ùp€:ĈüxòŽ|PәO„ÀĜÂŞ6ÂÏÑ"=¤D{'#cŒşŬOY³î`³'óÇ//¤ ·šÄĦA $kX½K ͕˘(îu÷;òêÈcoŞ#——¸Q•áĠïğ9ßĈġ{ òĵ°‰ú„Û&|kpxR,8uÔÏwԏxžŒ:òĠŸ‚Ċô!ÁFÓİÔ!a›QJ)ĞT*aRİıŠŜÓÓŻ}ċĠêħ3_´¤Rƒ0û–Ğ—ßC0³µê„óiš.{uäáħ·ĠQWdŬĦə—_‰ÇŽOĵ÷é*džCI—ÂLr ,ğİOÎĜn°j˳QG€OŒ}j³ŠşèşrÌ dc Ù.¨RJğ"gĈƒ 8ÁìÉïüñK İčġF(eNT{+ü-Ž„ĝÂùŽ]s­ÌĞ#=ŻŽpÎgŽœ˙Ŝ9[³n y&`´²ĦŜÄÍO1;ħIġĉ==uT.”žžüǔq*nZ)µċ˘o2ĴSGQRiDQ´/ CGòµ×'Ĉ>[/œùĠUgkŸĵƒhñvsÓœïh9I’v’$Ċ6êH{uäáħ{ĠQ†“œóé‰é_İLœĜ¨è-e§šÉçÀ²½ê¨ğìÓUG{£IħÚEÚuûŽ6Ó­”²8ŽyR‰ĞĠj#Š"ë;úö™OîĥäF׀A·–ħvñ×8‘ÏğĠQğŬ΄ÛUe€WGğWEQts>sìĠœğµĈµ[k(òFK€ÇV‰Ĵ]-udŸì éİL4£jĞ}c}K0›ÍuƒH‰RJ£( jµZÍ%Á:ú›ßĝR0u¸~ı)Ħ¤‚–€v5óÖ.üñŭ[ëD]ì‰ĴóêÈ9QGñĝñ‰w>Y…, ¨˘°›bBaò{`ÙM}zĥòAWUŻŽž…À€À¨²œ‹ĥ{ĝ=0 qW³S•áĝßŭŭSw[sm˘]Ġ€A·ħvéĞË@âbšĤë]êH=¤:2^yxìuts!ĊÛĞV ìİğöfÇĊ§êFY÷ÌĠ‘OHOœˆ l‘S7ÖÚ%ÊŬӛjCu‡{Î9‹8ŞVĞġ2ïèĝoë ~àpírS@ eʈIƒ•~Êâġ1¨O‹˘(ĠQҎÌCŞ#ĝ‡ÇîPGÑĝñ‰w?]‚ÌS(!m"> `Šy°ì–>}xĠ‘7Ù= ePF6!s}‘ŒíӇÁ‰°”Rʂ à*C'ïè…oŝĝĥÀŭĥ´dg`kÖµħŝñÛ8“KBˆ{EQ,ġĝކ-âĠ‘‡Ç.UGGÏ˙àÜ­û)nÜ^C‘ ÚWĴ~ˆ“bSu=Ïó…‘QG^!=½ŭNwx½Ö]íbç;2Ĉ^cŒĈq\Ve˜ púä7ó:¨áÉqPW/^[èÊuŠ%0`„€2ÀwAXħ˘è@\Ğ}ñ›ß=<—H43 %40 Ësh^z׍é§eU†GPGĈĞ#Ŭ§ŽŽżöƒó÷2Üş·%rHĦ]{r4/âȤœgDŬpŭV½:z>éVĈĦFi @”tÔŬr‚B: şÔÑôĝ“7tT5%¨2€6 Œ€q`íÂ/0ĥ>·RƒşTĊB–eĞišĥğİWm•sŻŽ<9×ċ;ò‘uÏ3!c(@¸-Z(!BhhcLiŞ#„0 ˚u“azë˙Ŝë9ÙġuBıHÁ­|ĝ Lĥ—"-Ż”£Uv’säĠ‘‡ÇîPGӏĵòJuòÄĜ—WĤíVmaK“ŜÍo= ŽžY7XOHϖˆ:Á ĤÜFX“n&4 cI-uwÏ£Àİ£ħ8ŽŽí?pôÄoŝÎĦ;‰ÂjĤ …´0`ŒB.ŬBûóÌÑ ŭ¸(Š{Y ħßóêÈc´Ôİ£“_úÁùğ ız§…$hÒùŽ Lóc; ĉ(äġnuT…Yu䃞*ê™n”ÚžċZäȕ†P Ê€AEQTFÖM}ċOŝÁBöùjŽĴHr…Ĵ£Ž~‰Éöâr¤ċ]ê(ɲĴĜÁdóêÈcôĠí§ŽöÏ|ĥ:q|ìŭËĞH[m´›‰íwD9Lvĵ¸­NÎT>”RÎyuäMvm3aƒ ­ re’uġ€RJ9ç<Žx,Š˘Ó³/ĵĉ×\ohĤ™PH  Aq˙ZŸ~`ŽFôbY•!I’–WGϏ::ŭĉ_½{?!W/£ä( aˆYż€£ûô|·:j·ÛÉHĞ#ÀGÙ=nò駒@Œ²5PË ßİòBBJe0JiEQ=ŽÉ8ާŜüÑO^KI@?[•È•F*4 b@8°úá/0™--Z|ŜĈéĠ‘‡ÇTGQħĠÑK/ÇÇÇŜùdí$G𕃰†0 ıeĠÑlÜİÊà#ëžĝL´’c3Û)†dRCKá6ĥB ˘(Ú?1}ĝ…™7và³fġL˘IdÄvœ•÷o ŭùs:fŠ4›/#ëĵ:òĜ›êÈġCÛY÷ßġÎBB>żŒv+³İ$ŒP0­qtŸ™£7Ò˘¸ŸĤéêĠ‘~&êí'žLל³Użmëòv.Ħ´4bŒĠ0ÜEÑÔk?ú{Ż· %Ÿ,eHFRhbkÖ­^ĝ%ö§Ë‹\‰Ğ]Uĵ:òxŽÔQ4~|üí‹Kh·r!jÙâĥ:u¸£Žuú”Ġ‘7Ù=VS]żûq=¤ĥƒ´A[((­!$ĉœ7Â0Ü?>sĝ…İ×ŜšĵĵZ Uh¤…Fî Ŝ‰Ċëh_úP‰;£ċĥE9Ù ĵ:òĜÓêèÄk?8ç~F>ğĥ„$-`´ĥdd4ÌúEŬ§ĉˆ‘7 ЎvY÷ìÔġñžŸ"ÚèoDŒ1„ÛŻˆ0ûíŒ4vĜµ”ÊPJëœó}A:÷ƒŸĵÔҌ|ĵ”ĦJ´sí^ĞħòŝÏħżXYd²¸šçùŭ$IÖÒ4MŠ˘(\krŭˆêȓ‡ÇĞ£}3/½ŸĝĠG÷Ñlf0F9ż4€˘TGn°ŬêHŽ:ڛàOqríäŝÎT .ÂÁŜÇ9o0ĈŞġİ™ƒ^k߯2ĴÒċ-QNŬıŠôêÇúĊˆ~”'É|–eËI’4“$ɋ˘ŭv1\³nĞßä'Ÿ‡ÇWFŭnoEJ¨#ĈĜ̉×~pŝĉ|J>½ş )% TFa–>ÂħĤ[­vİ#3úêhëċÓÒ#ŒfWo#û€1È*`Œ%Ô5E2 „ŒQJqĉû:½V€|ş^@ mɋFkĴ_ĝäk‹ŒË뉓âišĤEQô+²iÎìdòx´5ahe„UöÏt6hĵ0ñĞ_ßFÒÎŬğ1ûÒü6xqGžœ­ĵ/ФTGmŻŽžOB"v@–‹´!0–\q ‰DÛĈœÔ§f£ƒgߚüۅ şP%EA1÷’+ġ‹ù0Oò§ŽZ–Š­Š¤bː‡Ç“Ŭò?P¨‹„h÷ca²JWĞĠħ0 2Ĉf^8˙ŭs7ĉrñÊ  4ÀÛbbéŽ0óĈ›ĦŽôh¨#ìÉ<$> _bSµ,dZ{ĝ  cÂ$#gûg‡Ö„!_Ĵ ¨ÂԀsÂ4Ö?ú%Šġû„Š[Y–-&I²žĤišçy9Ùgmw’˜>'ŒñÄäáñDí§ˆ°ı*ĞĠj‘SGû‚ 8´oĉĊ—yĝäßŝò6´T@i!Èn‚‹GRGu´Kñ‘ûFNAÙêŜFj耀‚€OLĦ6Wž}cü/ï%ı†1œ2JßğŠö•Ġé³VĥPĥ&OÓT!ôäÓ½3ˆxĵÉñ+£­ÔQŻJ˘A.u´Ÿ16sä•ïœżv/%ŸŬX”´Š ’Zğ€cûĠ<1âFQ ğVíQ<óÄĜÒԉĥ³Ó>Ş,eO˘aĤéñ×oz%ÉĠ5Ê \?%°öÑ/1%Ö 7ó<_LÓtŬĠ£*'âdè%Òç˙AŠÉщ¨)uƒk?SŻ×£jµZ‹˘h2‚éÉé_ĈÏLŝâW7aDnɈPë?J‹ğòälċ=Q¤9wŞ#OHOAC\ğr¸8F …?t û¨áKµ‹Ë´²]eyÄ@Ezû2Ò+Ġ™²VĥPÖ£J’D!̳À ç)u“’öL:oŞóxÒEĥ $VŝÇqPİTâJ2ÁĈĜììËżwŝÊíurġĉŞ5Ġ 0”½ç‰‘7]˘üÚVGŜ‡ôÄ'Ħe!zP#À(AˆĊúÙzħTkM5(ÑZX˙è˜ë‹ Ċí<ϗï(“RŞ>ê¨û3iÉô’‘î"!ÉÈÉ[M éskÎV*•zEû9çÓS§_b/NóĞë0"³dDœ J݃‹{½êhğĵ#íĠÑóAHd€d·Fً6¤Fb€$YàŒĥġî £%w?C~S5⣴™-&IR–’RJmrş&;zȈâA3ü$ôx"ë°Mˆ·SH$Š˘ Z­Vâ8 ‚`3Ó/}û܍;Mrġöš=CU*À4ÌÒĵpPÏ#oEqHudà}GϝBz”QêÍ(§”Üœ‘ €1 ”Ú)Şr,ĝs’­ü^–eKiš6Ó4Í,+€l9ÙIêgۊˆüôx4êŬ¤nݐJuäşEï ‚àPÀ‰—‚ñ÷½ûÎu%œ:²Ĥ:dwÀĊ=yb&~_éœkıûĠÑä§EHf'ƒl´ĥÑvfC1uZÉ:sž!ö:½ġčËòP`>N›Y5“dYVl£Žú™ê€ŝ#O>ÏF!ġšëH†ĵRİT8 p?ç|vúïžğ½&Wo7íĴ”Ë;"0ëqü ıçÔÑb:ÒğWyBzjLħAvd›§¤•Â#EŽö…_bV· äŠR*7Ĉ€sÔëġZµZ HBˆ"„(Jİ )Š˘ğ/”RM1 !¤sŭ.#ß}ÛQ7ùµ,ËëòR•Öšşû(!„AĠëġ‰Z­6†áÑĈ/G“/î{çßŬ´êHĉvÍ \wċñ™ĝƒꨗxv‘ïȗz*ÔNÜS¨41Ölç^•ħr\$·.Ħ¸ġ™¸}êÊ^2ƒ´VwíóàëşÎÚ璍ßDÉĈézé~ħ)ÇFğ÷èèİ9aşRżàwÓóĊIŸÏ/‹ k÷¤ßt?÷Gk;À]ġşĥ<ïğĈÏè Ò­·Ĝ6mÚıŻğJw| 6ϧÎóŬ›ty÷SğĉÜÀÂSĉÁŬyÙVĊŞL÷ĠF)7Z›Ŝ¤|ŽÙ8FċÀĦçğZž}Şëĝġ>Ô=6³1 vċ7ÚYD´1JA%5¤2JCH—hm4Ŭiíŝ˙ìK37v†ß*u'‹$€1@.Näŭßf•e~D6Yd=YÁ 1ĈÎ Ż[-İHž,HV•ŞK—ŝìĜ}y ÑİKŞy^‡§ÈŻäñPVeèoŝFÚŝN›á÷Í}3wGûŭ>i}ΈûŽŜ ­vĦGó4^ĈC9eċ8ÚĤİ3˜É‚kHÒ7÷I_˙ö{ŭë…²Úw°úĵ‰WjtLòÔ,Ԏ\&éîŝP.ëLn.²Ĵ<7K7îú¨z·1Ŭön%Ŭܚ6YşÙġ2™g…,˜Ì5îxëİŠdëšÑŜ¤ÁkŸ˘ÖDbî½ĵOUwhU,•\mì8ŝŬ$²ÌL9×ó‰YÖwċ{j%c͍va úyĵçâçEì}.h5ÛL=çr\³zÍ}ŞŒœ˙=Ġ‚”r9ù`GÊhÇĉĊêyçrÉÇÌB Ä^GlmĦÖŒ}vv{=EÍJÚ¸‰}öñç&ì>WB³RŬB]%@Ó- í-·ĝžë{lÜŜ@ċ4¤[ŭĴÜĤ˙GTY>žW˜ŝ˙èĥ‡şpqNu Qo˘3~ġ5ÌfڕËçlĥï,7“×s*‡1ıJËîò*61&ìŠÙcVLI1I!kˆY‡äÚï³vCÖnŸ“—•şÛÀJíúöE|RŭRW}=É履Ĝ×ĉñż÷û}ĞĴÛ¸£Œ;z{‚ägœÑќğsÁÙeİ4Ĉĥ]œê Ĝ^‚†²—„ŞĝAJžĠġŬx˙’gİTIÔç YÖŬż?¨ĠI”žs<·êyv.=$—úPĥVRgA7ÙµéM77AĦ,<+ÛdX;\ƒy RE€ċÑe—܄³Žî=ċİó· Ô‚vßĠ¤qTŜĥdòì5À‡ñÇj"ÔOKŽxĴY“#AŠıœTs(sÓFÂİD"_şŽ4 ĥaĤ&ıžS¤˜ä}§rƒY}N ”5Xú¸Z³ŸGĵהY(÷ ¸ĈóC½žĵ\Öı@¤¤ĉm­´¸ëµÈóQ}єĤ[ìx^Ïİ>;L*_˜&Ï2 Ê£ËŞj\˙Ŝ|Í)Om&Ɂ5áuğ‰ZwÓûŞ˘Xڠ͜çÒ&ċ0yX9Ĵ\‡KJeôWÛ@“¸rÊJٕbVJQ1›†lŠÑ5Ċq`ŽGB9ÔAÎ8JhŽ{;ğ^q–%²îáwÚ _Çż˙ċí|îèn·ÛfîhmY elÊÏÚqғçÎ$#ŽR–Ŭ}p+ħİĊguĤà­Ôğï É1’BŞpY–rN !(=DYF·£äcşÀzÓán°OÊû,ÛÔη\eȎGĈù>Ê6ċç8 :ôA>¤Ò˙7a ĥm }v7…ÁғË6ĦŒ²Ğ8Žĵ+nÍ[úħ JIÖw“Ò¤Š³q´=Ĉ¸*dօÉÁ´“Ê.ċ\ğÊĠd·C*b&g4^{­*ĥċu}W6Ŭò”kl 3§Tߗ…š†Ş²‘ZÊ5ï!§\n‚çÓRPzN)Ëú~lR>D)„ìc,z µäĈÌWKÎœK ĥ)ËğŽĝğ:Ê3çcuô_? ġw;~ÜBy/Íġx*Bd6-,ê6½Ÿ6šk.Ê:) 5ٕ6áó4ììùġġŽÚ’Ù¸=ŒĈ×÷›‡*Š%ïëçÚ&yzÜg9VOċKaĥ”˜Où Ák5]ßîĤüûŬúôŭîÛÖĴÛîvğ˜sNgÒtKw¤g펌²ïâŠVs²ıRJƒğoŬ-²+t&Żé sɒ×>äêk÷ìòÛNfĤJ ĴŒrûÚVM9şìĤĤŜ4KËĊĴhRĜt 7]Mŭtu…ˆY§‹óôWŬ$É­cȲŜä)LÉÛ0Ŭ>SÀêˆÛ;YçʇĴw?Ĉ¤Ğ{óÛê ›0“½+i7&û¨Ž~‡$ġĦÜDlE¸­Ĥ™Ĵx÷ĉšÊµ,˘X:ĵ…0ĉ,çRxWS`f²ğŠ-5ċc nÂqäžb’uŬô·\S‹YĊIŒsE³yŸĈĴQ¸µé˙j°ĥċ]'Ğ5š uĊ‡M˜D[ġlĉFfé5ëè~êôF9vÊ£°„vĥݎ½şĦ`Eôş ó<—ô™U‘ŬIĴ%ÉÖËûÒls3 ˘™U½Şb_Mâíĉĥşŭ*\}Xà-°÷S:ÎnĞ“›·ıÌñ&ó,ŬlFèGsII²w“xt›iàcċüJ›èf)Ŝĉ¤’Ô<Ë=—v0 lÜêšı¤IÔ\a&Lm ˘Ú0êg>î&Ŭ—ı£÷_¨_ÇO?ıùÍáÍn·ûcsG)¨ó[’_Jċ=³*ʈSZT8äœRJwYa—ċ:×Ĉ‚úPSOYÊòTê ³YĝѨmenc_ÓğÒ!rĴOşmÙ¤Ò)ú_ċ”J‡nĦı’Kï:ċäêú6³ßĠ€î²{ċĦ‡Âñä|ôċi”Üĉ&Z M jĥlĵ:ĠùYgċNó}óF.oİĤšñĦ“m:ù!ÉeêTçÈŞ›ñX+[ŞŽÄ“—sĜċC–}¤™`ÔÔW.€•y´".aš Ê>ÒÉENé—dCs] \cê,ËşÛ*¸ÍMVŞ“Ŭ6 yšM!š\›òŜÇ^žĉBPŽI!ò˜Ĉ3S–/Fô“{V/;{uETĤÀ:ĥŜ.ŒíÑRšÜ‹{ù½ßêBm5½èċ˜-]èYöîŬôZ%)kiTÍĉ‚RĴŸOùŠ(´z‹6×5KÇŬÖyӔ‘¸—•°sdı…rċs›Î­ïg<·ú™×ı·:û+ÏQÖġĠ5UħÌm7(§v-›jƒŒÙ\Ö|n­£Ûs[êÔséÍŭµk˜ë}G>ÈßĦżûĞô\ż=ßn·Û?m·Ûí~żRJI—— ZÛIúyÎħÚ÷‹’ŸŞ´s÷c†a¸;ßŭĉ?ż|ĝö?ŝY‡Żœ&ËçUdĞİT?ŞZ+‹NÉc›#hôŠêcYġYċÔqvo>°Z9·&Ġُìw)p8>êÑù,ubËÖÎ}V•µĵNóĊ”Vğċĵd§ 8/ó²ù+•WÇ%aÎÁç%Ëï:|œK·ÓÇ_>µ’ĝÑvŝújƒx|OµğGÙìÇŻáËğĠĜgż0,\üqĴœV¸ÎdŬm}N–×ÈÏ7R_?­Ë‰—EĴ‚ĥħ‡Ŭßü?ŭÛn÷Ġvğŭîáááŭn·ÛÇ şTŝŭ|+ë˜CúÁéÑWŒ1ï÷ûŬ÷!„?|òï˙òëż½½ŭeĝëżĝËŸKş5³ùjż-hٔêx?Qž˙Ġòòġ.ÁŭG?Glġ§lžı$şû.t—Rúnżß~ğŬn˙p˙Çív{_ŬQžċòJŠîeı£Ġ·ˆ ]#DksJ-ɐcŒq·Ûíûż—ô?aĝëş?3³_˜ÙFRXî,{ĉĝMTšĝ<§ !BÏVœì\463w÷œs>äœw0ĵßï÷Ún·˙{www˙p¨îèœ]rIG|ŝùçÏâ:ŭê$éWÒĊhıÛêÑ\RJ)ïvğ(i›RòápĜl6ïC·!„›úƒğ·„İ-îÜ^m¤ËŸWŝöHŒNbc—\Ò ×ôhħ*H14 °ßï÷Ûŭ~żxxĜ×b†ċÜњKÊ׸£Ï>ûŒx‚i-[m'F$&)§”RµÔÚï÷İïûCáïûÊşUĦ-ŞX˙ç˘Kš‹ÏBŒ|™Ĉ<{—¤3ƒFw÷\E)”rŒqH)Ċágb”uú£s+3À wH§DêäšQµÒNġĤµ¨²+dX|Í÷,ZnuĵĉhÎċ…ϭ݇3ĝ™\’.Ïù…~~Î ­•vŸZ6wôÊéT×ĵ1´˜Oü˙üıó]]íB=%BçÀOl„ž T~F”òˆé• ÒĠ–zHóÂ!ċgdWޤÎ5ĉk; ü4.IOì×çV\8%N—ŠŽ^wô²Ò5UvómÂÓÊ1ÂâıvFì‚ž"ÀËtU§œÍıuê.‰ӟ{tòc•Ô×Ċ=çħüÙÂ2ŸZŝĵ6otjŝÈt:~ċcĵÜÒÉy]ŜÏèÒ&|çîCzöiŭ×ĥĜĝO5‡¤•QÈr³SâY7¤ı&e÷€—ċŽtBHN­ÂT1‚W&HËF´ĥvȲXA‹çÚ‰Ż Ó Q{ŠÑž—3:׏ŻqIO˘S˘/TÖVL³ j£0k4ËôŜİTàS] àċ:#]#éi+0\šo†W萄µ”œpF§îe Qĵ.!şätÂ!Iw€ġ+Ü1ä Ò)—tn=äù—뺪şkÖ½˘ĵ.‡¤+]Òµ ¤è^İ ]ħéÁޝ(érŞÎĝ8Ŝ”Cşä˜.ŭ3b„0½2‡tcş´{Ìıı£KBdOhäò]Ò%aBŒŜ¨ ­ı$é|‘rk8;!NÂ!ĵy!zŠ0­ŭ޽1‡tnċoğ`ÉOÍ=ŭg/[Œ. ÔÉİŻĝxċ‚$ŜŻùÌ>'ÎÚ}JÀÛ£kċšŞ9*êŜ  5QħEC²lĴ6EˤçÀ+$i=íĉg]ѐpBˆ‡ Bô†éœ0}HàĈWéCžCÜ@.6Ч ””˘˙Ç˙ƒ7$HÚhŒôŭ׉½ĥŭ4àe¸€  H€  H€  H€  H€  H€  H€  H€  H€  H€  H€  H€  H€  H€  H€  H€  H H H H H H H H H H H H H H H H H‚‚‚‚‚‚ÀñI^UêuG àIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DSButtonX_420x420.png0000755000000000000000000017714012467662066021426 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFó‹IDATxÚìŭg›$Gz% 3×î‘YZ+TĦĦ5M²%[°§I6ĊP ‡äp8swŸŬ½ûö'ì÷ûìŜËŬ™%‡CÎpş‡M²›lĊntCkQT(‘²R…k7{÷ƒ™ı{DFŠŞJ%ìĊÈĴÈ̈ÈHw;ŝ;ï9Œˆ`˖-[ĥl}ÒĊí[`˖-[ĥ, Ù²e˖-[lÙ²e˖$[ĥlÙ²eË’-[ĥlÙ²€d˖-[ĥlY@²e˖-[lÙ²e˖- HĥlÙ²eË’-[ĥlÙ²eɖ-[ĥlY@²e˖-[ĥ, Ù²e˖- HĥlÙ²e˖$[ĥlÙ²eɖ-[ĥlÙ²€d˖-[ĥ, Ù²e˖-[lÙ²e˖$[ĥlÙ²eË’-[ĥlÙ²€d˖-[ĥlY@²e˖-[lÙ²e˖- HĥlÙ²eË’-[ĥlÙ²eɖ-[ĥlY@²e˖-[ĥ, Ù²e˖- HĥlÙ²e˖$[ĥlÙ²eɖ-[ĥlÙ²€d˖-[ĥlY@²e˖-[lÙ²e˖- HĥlÙ²eË’-[ĥlÙ²eɖ-[ĥlY@²e˖-[ĥ, Ù²e˖­kĵ\û,/ĈĜ†?ä ĝ6‘=Rl}§ßÍvÙSÉÒ'{B]ŻEëĝìÙek£Îv ˙+½>{ü[@şĤO,vƒwLН¤öä´µŜc˙z=Oìñoéš?ÁĜu|Ò*÷³ËüyfOL[—qü³ĞĝÙOâĝ§5È˙—{ Xŝr›²=¤µNv_û$Nĵġœ€kŬO—ñ5{bZ0şœ_îùÀ>†˙#9öíl;¤ò$[Ï Ĉ.ü(i­‡ÖsBġĈ&<îxÇdÏ>{Ž\é9²ÖyÀ.óĜ_ígìħoéş?ñVĥŽ“ïZê’h“l“mÒύ|ï7żùM{bŜÀġ7ó7ëízĜ*çÁċÛ ~ÒqËV8–W&² t…‹İm'ĵ)ĞSv뽊cĞœd—RÙ5Ñe~­j÷­xiAéĤ#ĥÂż?ŞójûIÇú÷“^‹]ƒ- m4 ­ö‘­Jl÷qĠZ`´Úçë=A-(Ŭ`´ŜóärϏËË9îW˘Ë=öW{< H+”ì.ĞÖIC‹˜ûÏ£(r|ßwÇa8cŒK)1}@²ŜÁɤ”lì€eâ+>c´Ö}œs2÷1ĈH)$"Y×µBÈ4MEY–´Â‰ÉV 2Zoŝĉo,}wcŸ'Ğħ#˙‚€ûÏ0t8çÜ÷}ΜóeçI˙üXïıqıÇ|˙ë½û$I"’UU )\ZZY–Éħc{€ñ, }Œ'ámÙ²Ċ ^Ǟçy8cÌcŒ98q"b€4ŝïĦġ€Óĝçĉߤ.á€FÑTUUĠu] ‡&MÓJ“;á&ݐÖĊÛşŝğ£ġ‚ÀĤĤĤœ$IÜİİ)/ ÀóĵÀu]1ĉpc|#ύġó˙fŒ5Œ1!l¤”UUUEžçµëş€f(Á¤Oê pÙ §;#wjj* pàşî´ëşÎy "Ï|ï¤Ni•û?š_hùĠàȉID €RJ™7M3ĴŞjÑuŬÔu].,˲lV˘UÁÈvI74U7€ú7ß÷ùĉ͛ƒİİİ ŽÄ÷ŭiß÷œó„10Ĉ<"⏿çĈĜ1OĞŬÏĞÍñ/„:޳èşî4MCY–­ĈX`²€ô‰vI,Š"'ÏuŬĜóĵ-aîäœïbŒmaŒ W“@i•Ğ΍Ĵç&ÌIIDċRÊĤi.ş{Žs~À|UU”eUU%ÈUžc"uñ7ó7Œ,‘~ŭôŬžëj{D“ÀÈÙĵy³—$I”$ÉtEÛ}ßßéyŜĈĜfÇqfVù‹w~ĉ7~ûÏx]M‰ŞŠ!šˆHş Œ˜>#ħ‰şé0'ġŒ4vrpPgÄóçžá•ìŸ˙ç?1Ĉ|"bu]Ë,Ë$5u]£×)É€ÏRw7­G°0~X†îÔÔT$ÉtÇğ‚ 8¸içîğ>ûöĞ•‰”ÒgÌtDú1͉À@™gĵŻï÷TrÒé#İWż™s€Ú RJX ĉ”5Üô™óÍÒÜ[/ŝíôË˙‹˘È|߯Â0EQÈş$KY@úÈh=_gZœàp^üyúü7˙`ÇôĦ·O;1€)Î2 à€g Ĵ=7şó„zç$4Œ¤?×ĵ8ÔÙ˙ùaŒœt€$ġ†uçäșĴ?¨mcÒßÓĦ" „rÛ-œ—Ÿ½ä͞ça6I’ÔSSSMÓ4E]×}0â+tLË(<ĤyA{˜]—`„u€ïîyžÇħŸ$ɔîŒúçÓ~êŽûöMkĜƒ3ÀeŬĊÉŜAË88:`!I $)—] ™£Œ3u‘~\ĈĠÏ D‚€ŞHKa-ħT üó{ŭè//Ü·ôÖéš1€#dEQ`€cÈÒG L+*‡tç@B&„À…˙í˙ùí÷˙Ŭ˙ŭ˙ş%NÜ;·nÂg(ÈjWmÖ]ïġž`Ò½ À|ĈàÀeê\Óqġ€MJÂHÛBZĦ †€†$*„Ĉ°*h§2`ïĤi˙ŬÏ|ùW’żû‹Ħ”2°˜šš*˲”EQÈşeC×Jĥ˙sb=`Ä0Ïóœİİ)zz:‰˘h³ïû{=ÏğġSŸùâç·ßqß³ıÄÙBR@6ŒĞ‡– Áq€ÈaxŒÁċ Ž>ĉÁı&‰@œĦn$• ä Ħh$ˆ÷ZÙuSÔ¨C’˜:Z‰+965êâĴİ%^yu,üŬ˙›n÷²o3Ŝ)%Ġu-‹˘ ,—¤Ż´—dËÒÇRÜìİ4MSK)Kvòą…ŸĵY~ú3÷'€ˆƒéK5I´L/½Ĵsé5;><uÔUbÛeݳž³Ŝ£pŬ遃„î–€ ÀPƒ¨”bùà„z4ġs÷†ÎŭÒWöTÇ^Â{çĠ%ß÷‡QċI’4EQˆ………zŒ0Y ”`ğ¤‚Ş[ ˜ĝĝÇ ÜÁ` ƒİ0 wzžwpzû{üW˙úÁ²–8½T‚ uÌQMp@˜r"ÎásŸs8DpôñÎI WëBĈPK‚Cúڊ€ĵ"Ġŭ s:úA4²}ċRŞÇBŞŻğ.Ğ‘żù쐋ïn ĵe) %6­–Ħ3Ĵ.ïĥ_ë(›ğqôŬÈUaUUHÓT–eYVU•Ġu½à˙ŭ{N,- Ï, !„$ER]‹Ñ ŬĊHŬµ˜pHĞ?示#Oßçj€j÷‚ȤVR]”GJU‚!b 1cˆ9C ` ˆ %)CJİnĞ„Ïo‰Q|áWt£ĝvÏóö…a¸#I’AÇA†>ĥĝ„iĠá_ö¤#ÚúĜ¨şŝş2Ŝ!q< C7Š"_ƒÑvÏóĝë§˙ġ˙B’$Ŝħ…ÔdMR}Œ@Ĝâqlò8Ĉp†˜Îà1µçàKÀg€Kê8w p‰à Q ˆFBTMÙ .@’ŝ·„Ĵ%šR@‡ƒàÂğŻ"?ŝjqëĉgMÓÌWU•–eYäy.ò<§ ]Ħ- HŸ8@µb]×ȲŒŞ,ËŞŞşĜ”Ċ)˙[ñÒéĵ 45¨˙ ÍgZoԔôMêûÍöëĝŠoĥŽÚ]ÙPB f ˆr a@ÌBúA‰Há)ŞïŽğî —žüâg<ÏğĊ÷ŭ=Qm IÇëş&żÄµl•lŬXT]û·w]× ŸššêSu‡n}êóOìżûÁmï-Ö(İÄB‚5›\`Úċ „ŽĜQ´ħ£/°Ô1Iú•€” (Ü5lHħR]œ™‹4ÙHHĦÎĞĤ!HÙ;ĈS7ˆ³xë‡ßĦ[bĵD˘yżŞŞsyžÏ/..–óóó²ëġĜƒÙ²€ôħžË:4MĊÂÂB=Ó,Ë.–ey†ŜyŭĠúµÏ}°8T˙„Gšd}0‰èšäK‚•üÖ=FjSĜeêj3à WÀsµWĠç Íë;v~öWöÒŝxžw0‚I’l QEŜ­ôù29Żí’[Şn5U÷}ßM’$ ÓQíò}˙ôŽ]w?ĝĞżs×R%1“5@SÓÇÀċˆ†e9àp>z(Ktt´ŝĵ‑RÓxş'êXjoD¤DCÀ@R‰_ú)˘ùSçĤ]zİ(ŠÓY–]\\\\Z\\ĴÒ4ZÈs-Y€Y@²µü lšišŠĊĊĊ2MӅ<ÏϕeyÒûÛ˙ü/ïÎ-–²,Úo7bı~˜[C€@§˜“èN8Zo M~ñ€Ô†ħÏ|Ĥ(‘h”H͝HB%ìĜÂéëğ{Kû˘(ÚÇqE‘ğm·ĉIkA麤ê&ÒtPûFŜ`0ƒQĠíó<ïÈcżû§OEqâ[(A˘°9Ĥ4‡ï2ĝœ3%iDöé…ħCœ€FH%Ú„ZJTRv&ÍŜ­ê$)Jœ)g Ÿ!?} 'ŸŭAy0v˙,Ë‹˘8;ô9-›Ĥê, ]7àT–\\\l³4M犢8[—NÈo˙Ċ[ŻÌÑÔġÈv'[£ÓiHİÔŜ“lAİeúF(ğ  FĞž6ÛS*>è<Ÿ3„ô9GzЁ°ċĜ÷é§ÙcŸÚóĵCAìN’dK’$q†žëşîڎ[êî†êĈ˙Î\Su^’$q’$[‚ ĜíûŝĦÛñKOî½óŝ­ï-Ô(jRÂ.Cäô1¨è3ÒÀ3zSûıìu=¤*MGï ê[û¸ Œqpß\Žrá<^ŭ§oÓ>ŻyµİĞ÷Š˘˜‡s‹‹‹éââb£Á/7`–¤ˆFî+ŠB.--ĠKKKKY–],Šâ4^~ö‹GߙY+Ë^U†ÓûBƒNèµ]“rn"\U^+ƒ˘L§>S4žƒŽ+‘B‰žN\°Ï~ívìıÛóĵŭZà°9ŽóĵqƒînLގŻÔyžçĈqĈqĵ)Š˘ïœŜħëżñ;·/֊Ş#A aÀ™’usO ˜^ÑcÛq­†G—„JHTD%$ÊF˘h$êUgş(Cġ3-W|ĥ%Îĵĝó'ÎÇÔĵRĊ™,Ë..İŞ‹˘0Ŭ‘- H×lÑ$pBPQbii݇ yžŸ+Šâ$˙ïŝÜKsİ şlOgĥÖ£BP­ğš€şŭ·*4Üĝ€QżUÊ==çäkñƒı²4/ĥ„ûìw†OġQÏón ‚`OÇ[ĤĤĤq{Zà°­JYPşĤİşĠÜ8”‹·; üİİİA’$ۂ ĜÁá'~˙?<Għ{l BSIDŽÚ·ô8ƒÇ—÷ –í÷˜Gu>0`¤(ċ˘!äDZk•(úF½}Q5Aƒp9Š™wÁÏż_ˆĝÏʲ<™eÙÙáp¸°´´TE!„´Ĉ…(]ÉÙgÉÖĠZ ’€şešĤĠp84ÔŬLuŝìğġ?ûÄ[óC4M3ò`l…C™ô˜lݝš~§Cċ„î˘Ú“ĝ2ñ”um ´Ô\+òBŜµsĉ5lûÌ6W÷~ú1ß÷A°+Š˘ÍƒÁ ÒԝƒċÊĞ•Ôw–ò¸>¨:ĴÔAİêœ ŒWŬĉ0 U÷ _||÷í÷n~{F^4•„!SóEcpSî úHŽžšzCGÁ ¨9İÀ¨„BŠZ"Ğİ›h;#PğgködıĞ!ŞısxċğßĤŭnŭ†¨ĞšŞ›_ZZÊÒ4­{ƒß|, ]ŬѲBPUUr8–áp˜ĤélQ§ñƒïÓÊJËöšÌË0ĥŽĦ8ƒĞmĊ̌S-ŸÛ˘ùÂŻŬîLmş-‚ŭqoK’dS’$Ĥîœ5Àhb÷dğ¤ë†Şë“yž;55ƒMQíô}˙Àôöw=ôkżwûB)pvXƒ …DÄ|Ĥ:#3ìÚßê"ِıOڎ¨Ĵ• !Ż%R!‘‹žH‹ ƒ@†‡£Ħ§_ù Üs'.Ĉh^ͲìLšĤ³áp)MÓ²Ş*9Ö­ĥ( HŸ4ĝĴxjêIÓ4תğóEQœâŭżżôÜ쒔U ÓŜZk?D“…×HB Qğ·¤:)uŸ¤N!İëş0rÙ&MÏ1F-çagŠşğçS·yKż+Ojĝž8Ž7'I’DQ4>›Ä°ú0ĦĦ닪é|Ä;I’$ŽcCĠŬòÄżù_žòŭÈ9:_j%œ@À”€Áu˜zÖ]QŻ'­„37A@-€²‘-URÙeDVK +ua&İëŞĈgêÀÉéĊ™wqòÙVû"ŝ|Q'óû•'öÜ~ÏĤ·ç+5ĦŒ€áځD›]]0àíqÙh·ZïĠBùԕB‰M'1Ĵ%¤ Ù˘íw^PuŽï ştŻ˙ó·ħÏ)ßnÊâxžçgÓ4KÓt˜çyĠ4ĵ šÎ‚“¤k´VşjR§•Š›”yžš¸˜çù|çż>˙áì\VeğoÖsìêŭ£Ô£îF B*ġ‘Ôžh•y”@ê{4`™îİO2¨MfŠVñÓPw’‚àÖ)–ŭ⿺Nj“#Aì˘hğ8ĝïORŬĞ;9À‚ÒuCĠñ0 ½Á`RuAĜĵkï]~ŭ·oğTJœMk4„Ĵ˜šcŒiCߖb# !Ħş~I¨B#ĦÁHÓsúóBòZuGZ˙}Dëxb$ŜC°ŒAHEĠ93ÇgcŞ_-ŠâtšĤġ…cYU•”R4&8éÜ·@déîhŻġğ$QEeY–Ĥé|žççÊ<˙€ŭġ˙ñÖóóC˘ŞTl îŞ÷ 5İ=%skšĥë@Ií-ip" @À¤ÔóLD#W’£Ş¤ħK~4€é¤Ĝì2ìż÷ÁpĝèçŸÔ‡ŬÚV(ž`+´–úÎÎ&]gT¤¸GĠ~â÷˙ì ?ˆœwĉ HI‚àm Ìşħ ecfí„Ħè9%\Pd¤ŬeÓ ÒZbİ&ÔfŸIvĉĊŬI¨$Ŝ‚1Ë ]†âÌ1œüùêŭ{Ħ(ŠSY–]HÓtq8feYŠM˘çhĊ‚¤Â£5:¤e÷×u-òi¸zaFaö”dżk˘N. M×ġŭï#ŒjÉ [Ž=<‘düғA‚`wÇ[z³I|ĊÎRw×U7TŬ ?ñ˙ñ /·ç H!!„ş˘êËğuĥW’Ħ;Ħ† UBÛeI‰JŞÎ¨j…ŒYCí@¸Ô{&9ĥ[bz Öa€ï ! 8˙.Nŝüû́Ĝy!Ïó3Y–OÓt>MÓ´ŞŞşFr Z ˜Öí…lÉÖFĠš4vż ›Ĥiò<ŻÒ4M³,ğ˜çùŒ|ŝ'Ż]<öÎÂ0ϔ•>[™Ĥ*ŬRm¤à²£éZ`’PIŬ=ÉèHê†lċ$eRoe2C³­§´½?OmòÁ?ûġClÛğ´ùêŽ$IĤV°Z œ,u÷ÉQu|-Şn0$ŭĜ;?˙µ'wŜz×Ĥ×/È+ Ùˆ$B‡´ÇF¸CĉĜƒ„{šT{FJU'Q ô:#­Ĥ„a#ğTö¨G*U˘nĜĥ^<7˙é[ĜçTÇê"?˲£Ş+Š˘ÔTœp>O‰ħt¤k“Ĥ*4F¤”RÔu]ê.i!˲óY–Â_ŭż^zin(eUBÒ :ë›6ÔY Ġ½.İAGÓµ]”AuyhŞO “ÚßRÜ—?3ò"tDû}8‹ŸùÚ§ùjEÛôl’×8Ĵfş KŬ}âT[U†áÎ lÙğ˙Îûżö[GÎç ÎfT+!ƒ+t¸$íèĠqĤ:(!E§ÀHí!!CÙÊFùÓċÈ´%èKğeïâÍPwş'pÏñçŜxÎÌ{sÔŻéî肞,›ĤcŬ‘\ˆV%K×Y@úDiğġÜä„+.)„UUUY–Y–]Êóülqŝì‰ĉŸġáÛóCÈFŒÇ–'?żçӏAp Š˘ƒÁ`:I’8‚I ´Z¨,uwmRuQm PQuż÷Ÿpƒ9şPAÔşƒiž´†é˜:0’şsï)4šĤĞjÍR AȄò¨ë:òŜž:0’ŒZ°XÀ!8Cqĉ(NŝôŸšŭ{)ÏóÓY–Ó„y]ו”²YˆĈ?żœ=% N>ñ.Ip•%ú]RUUUžçyšĤ‹Y–](ŠâŒüÁw^>sòÔ°(sôC,‰&…4‰' ö˙jv£Ö>wµôĴvvË‚&Ôï”4u§Ô͞“yòZ~ik„â˙ĠÎÔĤÛ´ênG’$SƒÁ àœŻ•.km…}ŞnKEğ}ß?x×ŝäĥ#·Ożv1GQKˆF‘Š ĊjSz#í̑PûG­QŞVÔe é( ŭó˘ćQ5IŒƒ”Ġc¨΍ú6öğċ{²*Oäy>“eÙ,ËÒŞŞ !DƒÉ˘Sı:ŜvG>Ŝúĉ7żyı]’\œ (•yžgyžÏgYv>Ïó“ìżŭoM žÔ‘$”Èk‰B˙ğ=$–‹mŒ“7L²W÷iI_qî]œyî‡Í„żœçù)­Ş›K•w9Fb`$ħşêΖ¤µKÂ*`DXySt0iCSEžeÙBžçòáûŝÁ0 ÷ÄqĵY[ÍxÖVèÇĤ+Ħê’$‰ûTŬ–}ï÷Ëż~ËÙTà\Ú¨}£Zɰ=.TI²íœi ™¤Ú?*רÔĤİı¤vS £‘CşFtÇ|›çċàçßĝÜÓGç§ôìUWO êä* ´Ò^Ò(Y0²€t­RwЁRż[MÓ4EQY–-iz!Ïó™ê­WßÊŜxñÒ\–AHa˘4AhğI×lê8c dn&¢íŽdçŜ…ŭQ7§4žŻÔ{6?‰íŞîŠÀÀ~éWöўƒwûßÎ&9‚[[Ħk˜ŞK’$êŝàóö| YD-A ĝşcfdTuk·1ÔZMW mšŞ)ğ˘‘(ĘóüȞQoÖDSÑS“·Äérä3Gqêç˙$öGü{nŒŞk&Pu+Ğì,Ug醠îÖ%)eSUU0)kUwô·˙ùĊ·.-Ö¨K³°´`4ŝ Ĉ)<šD덖0qè†Ĉĝ’~=1C˙ħ¤ħ” jW²>…hdàı <°g[|úWÑĥB{˘(Ú655•ôl…V£îVşÂ· ôñSu‡îŝċ_{jÛĦOM½rİDYI4€ÔJÇéüĦLJĞÙ˙1{•­ƒ­{wŜHTmv‘Râ$ÉQŞş×İwgĴEâžħ4‹£?ĝ;ìEvœêò=+1›ĤéRunô.i%ên5Ŭ2E˘.Š˘Ìó|¨g“fÊıÙ÷›żûĞoÌehD=’"ğ"ĝLˆ/Ÿô=ĉ%˞è]Ċĥ²Òĝ…iİnïkíŻÍFğ$£Ò#"%]'`‹°íá§ùƒOênÜVÈÁêÎ ÌRwŸ(U·Ó÷ŭ›÷¸ûž_ŝµ[N-68Ÿ íĈPñ$.18&Š\Ž:pKIBÑlPTI%é%u@´y[#³pšQ~—VFà.ƒ ç^}Ι£ ›¸xEÏ]{´Y]׍ê, Ŭ,]ÒJ]ÓZ³IÊV¨Îó<ϲlÁĜ 5ÏŝĠ Ǐ.TEĦÁ9ëèğ>µ1všôişÉé°]Ÿ%aœz Ôŭġg“hùjUê;m:„ŠbİĜĉĠgq˜oŬy‡Ĥîĥ[[Ħ;bWBĠĊqìƒ$ŽíšŞ;òÄżù?=×ço/”•„hd-áB;Ákp i‚òT¤„òİ“]ĥ‘½äÔ`„‰CŻÀ˜šŸì,à —#?} §žŭž8ó—uĴÄU'„¨-UgéF%Z£CZk/İŻşkêş²,ËunÒù˘(N;ġż½üâì˘lŞr$eÑŬz`4²Ô úS $;‡Iggυ܀‘YÑ\°ŝ“™Dte+tËgñİŻ>ÖËM²ĥB=U‡+ĦêbU›MĴÄŬżükOn=pdêċÙu-!„hC =Îà0-ó6#èÄ2BvA{uûQŽ„êµŬ4P†ĤëĞ=Íŝ#pGQvġÒ,Ŝŭñw°ĊûT—Ç'PuÂRu,u7œ&Î>!šŞŞ MŬ],ŠâlyáÜñú‡ß9u|a MÓ`’V÷-ô;£(F†^u·¤ÁÈ<Ž<ô£Îûhr,ÈO3Ö}o>eĞ0ŭäĥ4w>lm…Şn—ïûĥ8|÷½_ùĉ-§‡ Î k4µ$ !ÓR7Ÿ†Ŝ>˘Jâ-4ŭېRĠĠ²ûV‰ħp=7J?ÉÔ8W2o.q᭟9stq3o^ÖTŬù,ËŠ˘0T]³Ž CKĠY@ş)¨ğUğ#s3‡q[!|˙Û/ž9s&Ş„ ݍ#ÙèeÜHdórE\ÛÑò™! Ût–#†ĞE‹şZí’F×=£qà:žbı[¸ |tsŒág~ċNg°éSïï pûĜ Ù.éʨ:v™TŬŜ ?ú{öhŝĉ| ’jŜ¨nTgä1îtírÛŬôŬäĦí$P EŬuC­F9GcI}×yhĴ•vŒĞñl @r†bĉN?ó]q(ĉŻEq:˲sY–Íi‰wŸŞ[)§ÒRunHêXż­Ä›˜­ÔvR6—çùù<ÏOñżù?^ŝ’²˘IûH“^ĄÎh!e·G„ŜmëÈ ½w¤;n¤³siü̍1wÇ̟…8òİ;ŭĊÇżĝ„vpĜ$Éf}U^[!+p¸2ގ­EĠ%I’ôİş{żòͧĥì;2ġÊEĠ5„”ŒT,ı ħ6í¸ğ`Q`ÔȞPFÓ_@B "h܁Č˜Ĵ##jżÀ=ĉ2Té%ĵ÷/ßÁ~ž@Uñž9š‡<ÏW˘ê„ê, Ŭ ÔŬ†Ĝ 5MS—eYèÙÙ˘(fê÷+ŸŭÑùó‹Btj9ĥ·@}pŒì‘A“öߣ^x­\·JĈDĠɑŸĦÎ|U?Żıô$Ô"s(rÀ˙òNqöÖV(I’ͽÙ$k+ô QuzFLQu‡n½÷/ŭêĦ“i™a Q HÉ€)@Ó# ]KL’ÚiiìŞ$ĦÔÎ Ë 4ћŭîż·5É´´SpÙ·~~úíĊÍ\'ïóišÎE‘5MS[ŞÎ’îVî”Öm+TUU­ğ¤CŬ9ßù//Î\š/”JOÍû\oá‹,_vrËӄ)ĝĝÙрc´ ÔÓĜ;À™’€÷şĞ`m+´}š-}ĉë÷yatXÏ&m SÚVhœş³ĥB UÇ'Pu;‚ Ĝçûŝ‘Ç~ïÏİıËߜŻ@R˘Ö9G)ż:εèsd_‘zñä:’\P,7J  ¤QÚY·ß ÀÀ|rÊsïaĉ™·ÄîĞT]]וê, YênŭÔŬzl…Ş,ˆú$;[dهηŝżG_½4¤şÖŞ;ÖIb%u„—ˆcTŝMcÎŜíYÛÛ32Š(ÑžšÇ5Sú &,.R¨ËŬĜeĜv÷CÑÒżôdßV(I’(ŽcßÚ }äTÀ4Uç'ŞĥhŞîà}_û­§6ïıeêċ‹Ş˘h¤Úëi$|GÙ9£êZ0êù"êHòŞéö&i$Ód i7Ħ'W{Jâ] gñÁżü=öRú!êâXQ#T]£@ dİ: H–şğL`jJSw8\ÌóüLóĈKoĤo½<—ċ„”|Ĝdœd)Ôĝİ·W´ì’°•€wÑĉ£ßG˄#A~z(Öé=·Ô_ ’hjÂ}Sä_ÛGğŜûŝŜ(Šĥku—™M²ĥBUÇzT]”$Ét†;}ßßżí‘ûîŝċoü`Xá\*4")€3¸`U׺(t{f¨ş‘]‡Ô€z 3ŞÔìKğİo¨ ܕsÄ˜Ë ›óǞ;ùÖÒGĵ”çùLšĤçÓ4]˜@Ġ­5kİ: H7=u·–Pk+T–eYEĤ–/Eqšŭí˙çĊ·fŞ‹Ñĵ¤ħShÜËnŒ&P˙f^xƒn/‰ZŜòEöh9ËêÎë,…Ìŝ€Ž<żsï.>˙ÄWö}˙ÍWÇğ¤~·ĜÙ¤ £ê´ûö0 ÷ùä‰ß˙”’ó7ç*4Ui¨:F™êŽ˜Ž2n;#ó6T€öĴ“¨ÍQΨ×ħ÷Ŭ#8ĈT˜ˆÌcʋ'0óÓïŠCħójQ§òMÓù,Ë>2ގˆH ‹GoPZİKş*[Ħ,ËĉóPöè#pP/’ş…¤?k^‡Š U³`êŸ=4z˙a‹0xâ‹[ëÛ|Ä÷ŭŭQíL’d:ŽñÈó›ŜVhŞë ê¸–xÇQm poï˙•ß~jjÏÁÁ‹çs”T/SódžéŒ´Ğ;hÔ9ÁĒKêé Ĉ ħËïÓŭġ EÎàĠâ%œüÙ?`žfMġnžçg UW–eÙ4MÉs}WEĠġĤÀmY@şİğu)í³Şëş6‡,ËÎEq†}˙[/ž=w6MĦŻ&ÇeŜrYÔ!I£gêˆ}x_ĵ`¨ô'ñi”¨szÍ­ùŞĤ…Ô‰Ÿz#ĵ’À["dO~ġNwjóm”ĥƒİÁ`Œċ&­¸ğYWEĠĊqĵ÷ŭŭ;ßvߟŭêŝK5Îċ˘&”•„O:ZBÛB™‹›.xŻSc6Bç‘DĠPï"…zéÙµîì„Ú)\ŭÑIàƒ„ÄâğÏĵ‘nsÄ Y–É²ì‚ĦêŞŞŞĈ¨:ħQT]Í, Ŭ,ÔŬjŬÒēIÑh[ĦTSçò‡|ê+ğäÛî÷öŝévWeY?V"˙8İ:‹Nnfên5`ħJÓt.Ïó³ċpé÷;qôíù!‰ŞT+×İŭ¨ êf…FĊ £jÛÎo #sFmNuô\ŸşO˙l-…L´ 1Ċk÷“HФ2O†-w>-=‹Où@ƒÒĉ$IĈ#Ïo[ĦĞêÌlE†Ş;òÄü/ %o͗*ŬµRŻÇX;sİsŽht6Í\m˜Z5в[.`Ŭ§l÷”Ĉ2½¤ĥÀ‚ÇAœ.Gyî=œûùwċáÄy­,ËÓEQœĠÇ{Z–eġqRuÌ"’¤˜:ÀIr’É1[ĦÙ˘(fä/ĵYĵŭÚ|Y­­PïIĈúâ9öo£ħĵ‰Ñ‹‘L\…Ħdğ›Ċt3{F­%ĴÔû÷Lû¨ûò~Úħïž öĊqĵC‡ùEžç9Ğ€Ñ GŬ]Ugb%úTŬž nyàëżóT¸moò…M#Ñhż:àëAfÔKĠ´›ħäÂÈĵµ+ĝL+í5ŭ%èn‰uĤ4ÓÒS,C•.àôÏŝ{šĊӎ¨Žĉy~f8^Ìó|İGĠ­zŽXŞÎ’­ġuIt]R_ugl…ĉµêî”ûí?ñ½ùĤ) 5;Á´í –;0,&Lˆ?ïċÑXä´J5³I:l w´LrÎô’5lÙÑ;]÷– ‰Ûöíás~ùaß÷iŻğ­ƒÁ fµZŞ›KA_U·Ó÷ŭ;ÜqߟûÚŝw*œV‚Z. EĠ9Úe=;))úÑÊÁğ@%Ž•èԙĉB£ŬìÁC{léœ$Ġ-1W0Kï=öá›é^Ìóütžç²,[Ħ{†Ş[ËHqž­IĠ™’§, ŬÒUÙ !Z[!£şĞĉçŜÇw˙û‰³iŽşŞ•:JÊQò|%ÁĜÓ2ŞßmuݲfsÛ²uŝv4ŞêÛOR{I:ÌÏĵ>İ$ÇDÀÀa<ò ÓÙŬ?Á vĊqĵizz:‚àĤ°şZŞn0†Ş ‚`_EGû½?{hĦ"öúBż–ÀƒÏX·Pò}cĥ[i02ÑèO˙âb„ –cÑ%şkW“ÓÌç€ï 8{ç~úòÈÀy­(Š“yžŸ‡—6€Ş“—KĠ]LJŽ$[Ğ òĞŻ ·Êóübžçgü^½xâĝoJe+Ĥ\íM#ĴTˆÑ\„ZŒF²“0‡.1ê§g“1tô;8Ú¨ĞîğĤ¤ġßĵíŽ öEQ´3Žİ$Inx[ĦˤêĜ$ŞNKĉ·†a¸Ç÷ŭC~wŸŽvìK^¸Ħİ”„é?šÏ—‘ž9êFÙïˆMĴŜ?júázÔ£wÑÉÂû°ùC0âI€9†*[Àég˙ğċâŜ”Gµ“÷ì'NĠ ;kéĈ ·JÓ4Óç²,;ċ}ûÏ_}sVÙ QßtUb™€&„ĝµw#Rî1#֞×]#;Ħƒñ̓•0된Ĥ6҉¨›KÒŜ|RàÈĦ#îGô¨ïû‡‚ ĜÇñÖÁ`ÜDĥBWEĠEQ´Ó÷ŭğnğûÛ>ó•}ïÌU8Ÿ ÈZ‚ „DÀ”˘Ž36ĈcuǍ$ AoVßF ’Fö!Ç;-2nñRj3`ĉq0ĈÀ`é½çÁ?|#ÛċMĠ×jÒO„ŞëVÛ!Y@şñİğġÌ&ġoëħš+Šâl=sò]ù³:s~)EŬ4ÒŽġġĈ€˘Ŭ+ nj~’ĉh˜ŸZœ:;9" —c0şeTw\;ÈF’€¨%À6y ŝ#ŸßVûĦ DQ´s0lZĊVˆ]ïÔŬFQu:vÇGùí?}p!öĉ\!$šFu£c¸ÚÓÌDKŒÊĝ[‹ F¨ċšnĵû–´ìĜê_ŭHèäc—!?ûÎ?ó]ydàfb%ôEÖ°GĠÉË êèêİ:Û!Y@ş9İğ•@io%[Ħù,Ë.äy~†˙o_ĵpŝ\ĉ4ˆ¨[•Ùòĝ‰°™HӍuNèSí|uô]7”ÛY˘ûú°`VS€g:.i,dd#‘Uwo`ñ‰ŻßĊÉ­Ú|Û*ĥB×ġlÒĠRuƒÁ 0T]ğ}ß?ĝÀ7~÷3ɽñsrÔ io€„„Ç”_Ğ˙­i*ÔßABŞòʑA Ë8š@ÓĦF½ûÚÙ#s 3§¤E½ˆ³Ï}ğĊŒӔG‹˘8“ĤéìĜĴ\GW4İCşrŞÎ–$KŬ]ı­PQĈVèlžç'½˙ñçouiH˘*”{ò8aW˘İ¤’[ ‚Çß\PğŜRßYAğ05{¤óêŜLšÙ3QÔġ;#£Ĥëí-ÁÑǓŸ!;{çŸŭüԔûzYèX‰KY–­EĠ ĴîÂpġT- H–ş[vU'×s“R6UUU=[ĦóyžŸv˙ñŻ^:;7_²şê6X?ÏHOÉOò°Ó/‰hy-Q0&; ½H‚ċƒ³­PBñ6íŞË Cú#" İ£ òZâÈĥ-lîÑŻŜï…Ñá­P†Ŝġn+´‘TQĠ=ßŭL°uwô܅Mԋ$UË3ôŜÚ¤öïÔÀÌéôWĦMu[aÌr£T5ˆħŠ!ƒÁ}†:_ÂÙg˙ğËı³WAĠɏšŞkemY@şÉİğĠ”w"‡ÖV(ÏóÔĜ Uéƒà˙Ëħ÷—RÔeĦ†GžŒ&ş{÷sŽĈÁ½ŻÉ']Ïxµ}Ħ½™¤‘xêöqYÛ!İŭ¤ugĴHBhԛşëáxñ}˙ VŬmžššŠo [ĦËĦêĝ$ŞÎóĵğożç[Ÿúċ=oÏW8żXC6²V)½!g˜²b %ZkİÖJG‘7š˘Ğ zĥ·gÔż´40ô[’ŬQǃ8€°ôŜ `ïżžïًyžŸÒTŬüePuô‘RuŬĠ‚]°, Ŭ”ôÖNkÚ EQê.ÏóùúsoÔG_ŸU ÑvFJXÀ–ĊTĜ0¨?ړ÷.£öú=€B'ˆèBİSüAùĜ1rp`ĴM2³T$ÔŝԑòñŻÄĥ=wj[ĦíI’L]ÏĥBWAĠqCĠ ƒİ(ŠvA°?™šŝÔ§çß?8[{cT†HĠù Ày÷>÷İW¸×‚‘„’x÷lž¨[ßÎĤéûF.>Lsápĥ莊•8˙³¤[üŞ,?œ@Ġ5ĞPÔrÂ9Aĝ¨b%ĴöÁÒMÚ%m˜­ÎM2a~§½˙ùŸ^:17ldY*ß0HA£³#ħÔı2ĜUô8µ×_Ô"ċÚ0"îx˜ä™GÌhàjPê§Ô$€a-qdï^>ûèWġ<ïïû{8ŜĤSP'Í&]ÓĥBEĠ%I²% Ŭïş˙żót°ugôÜÙ u! ´‹7C 3ݸQĠġèZIú˜0ÑġĈ‘AvÁzˆ§ċ(×+ÇċvşÁ İöŞÈċĊÎ=˙=ìmĉÏş˘zÛ$ÀfYĥ4+ħ!ƒ\3Ú Uí, ŬÜÒJ@´–$|ÄVHwI—Š˘8WÍϞpĝ·ïÏ,Ĥ¨ËR=XŻWè ä:öŒú‹R_ÒĞş¤./İ ï#öMëßoöŻúî L;8Ĥ{#µ/A šàB"zèééüÎGGl…ĤĤĤ’ž­Dz ×îlÒeQuë:zĥê‚ 8¸çŽ{¸ġÉ/î~cĥÂĊ\@VQ ”“7ç \[8Ċ‰ÔïħJ•h„’{WB)ëdïoßmÒ2qŒQOޏ38ŽRSú¸ żĵ÷j;À‹yž›X‰ù<ÏÓ1Şn5ş,ŞÎ–$[—×%­FŬ“½ıÖc+´¨g“fœçĝj:óÁ"kşˆŠ6·ˆġÔtXaϨ˙H|°Ĉ÷ĴÑ7!ğ=Ĥ Á·p#ւ‡R‚zêŸ˘V-TEÀá(ÀÒż|„oŜ~ğĥÚq½Ù ] UçyžéŽĤ U%ƒ[û½˙ÀùŠĜ³…Ê™’Ä SUçèg2Ñ:ySçâMş;8lĜœ‘9XÚ6ö7•€”ä; —Ħ˜ŭçŸù.Ŭ:ĊßĴÊò=ğU7îÈ@WJĠ]Ġ̑°˜féĉĤĊ ĞRx=[Ħv6)˲SÁ·ŝüµ ™Ĵ‹ĴíN”ên5a­7"óí~öSAEo0VÊŜ^Q/ž v4<Áà0ÀG7¤ÉAh)_Q ìżġvoöŝÏ=Ĥ{6ÊVèz ê˘(2^u›µŞîƒżöûO‡[wG/ÌdŞÛİ%¤˜Bx pb¨WÙŝ}¨ŭ; =Ğ•{àÒŝFvû’ñn_P½bĉ0p—Ħɇ8÷óÄîĉÒyOToċy>“eÙz¨ş•Tv1Ug; Hĥ.g6i]ĥBáĜ Í4gO½ç<û½3³MŬ(;Ħ^+d(7êĈh:ÙzĠÎĦ£~zh4Ò) ŻGÛÑòĦÙ.]–iêNÓFĈÀ#_Ĝ^ĵóá „a¸CG-\•­Çĵ—ÄVéÖKĠĜÏCÜòĝçvż|ĦÀùB İ… ŜkBèX -1|-µŽì¤%ûJÈ5sT ı‚ÍTŻûÛ32^„0”°ËÁ88žx8ŝJħ/âÏEq&˲óú¸ÌĞŞŞŻYŞÎ’$KŬ]ħ­Häıħ2ŽàEQœvô헗.\ȜşTJ;6ş‡1šn€úȳ"HİĊIMĝ›ùjğ&Óq `$òÚ(²SÎ>ëϲ0ÔBBBV Üĥ%ÁOŭ7ŒôTwƒkÙVhU‡Ğêú­?˙l&Ù볚F@ iW^u.úBÖÒ³Œ¤ĦXşx¨zħ%ËĉŒú÷Ô_žF½Mè8BċĊpáıïÒ§Ĥ7ˢQĠEQô`7‚ŞÛ¸îóĵ²eÉRw—c+4r2[Ħ<χšĞ?Wĉù‡Ñ?ŝ緎/İ)sHíf,e~HŽHy[˘ Ŭ_@gĴiwÑçBo6 xßŭÁDgsÒa~Œ!€šMjzĦ:’$²Š°ëŽğŭK|ÎĜ íN’d˵j+´QTVĠŞî3áĉáóç3T•€Ĵ TI8DµŞÎaÔ.&bŜ¨ہf=[ˆŜܘìúG¤Ù32İ{}b HÎÀ\ĉqP9ą翋]Ċìù@ÖoëX‰‹iš.–eYCUwıTŬ•ÏM:/í’$[‰­Ì&‰ożíŭâl‘ç R³IŒ£KPĦiz°X€z_ħ4e§•vèdä}úŽzşáÑù¤ŽşĴ·o‘MH—£~ĝKğĊî[îó!ì˘dÉÖ*4Äzl…–ĥBY–Í[/ĵ&Ŝ{MĦ½L/‹-ïò£OéğħΨíİzßß´ùHì$B,7^íwfL§Ë2ĝL9‚‹ŜÂ)jBÙöĊ–úò!lÛ}gû£(Ú> Ĥ8{³IŸ4u·!TŬûyè–'>·ë…óĉÊ˘h +B]"Ĉá1eÄôŜ›q–=y·4TRŞı£ŝà™ìh=— R×ĥİzöÈì31"¸ÇÒ_|÷ĊroÄ^Èóü¤€ĠT]İİşµÜ>ñXĈíòiÉvIWk+´Ì|µo+”Ĥé|žççòêö=É.fĵk[ĵ–uT½[£ÁHèì$2û} ĝ˜‚z•Ö‘çm›D¤<چ´’Ĝ`?ßñ<ïP{£(Ú655•|’ĥBDĠmÒTŬŝ(ÜöÈoŭñ½'Ӛ½~ħD“‹èC|.áBG’3ô)FŬ¨:҆€Š$*EĠѲ-ÄeÑHçLb§ÇtĤù Ċ“¸ôÜwéHŒ·kíU·U·V$ùJT>>ŞÎ²l­tF\İ­™Mšşj[Ħ³Í܅Á3ßùp>Í MLCCM5wŒ;~÷M5‰Ĉ_°Z;„DgĥÚηˆÖLŽĴŜf/ÉĠóS*aVÎ1¸$áÜ˙‹›³O=ôé ö÷r“â ĵÛVh#¨şÁ`hŞnŻïû·<üôgj[ĝÜLĤYK8ġŝ8ZÎÏĈl~İX‰F*Ċ˘Š•P÷-ïŒş<#9ú·×­°°RÔqµWEU†ı×~„ĊĊ‹š7uèŜlšĤKEQl”ŞŽ>jŞ-+ûĥ€dkm…Ú.İiš:˲­ŝì÷^ÎN\˘şh£Î[‡†Ŝ’Í%aD°Ì˜£WÙèíO"ċM×3O½”Rт“ù…ıĤëx4Q!…Z4˚pxS€ıż|l]wI;ƒÁt’$áĥBĞÊÂŻ’şÛUŬ}EĠÒTŬ\QY]×× U×xvù´€dk%ên-únMċ]şË´­ı˘(N%˙çŻÍ,f²)2€1ċÎLĞE§Ĥ밆:É÷ĜĞ4_ëûß5zħSÒ${ĦŒHö<ġ¤şâç8y/òœC]ċ °Ĝ}VïÂ}Ÿ{Ì÷ŭCAì‰˘hË:l…6Vh£¨ş(ŠŒŞîĥG~ûOî;™5ìó¤µ€„ÓÑz°¸Û2Ŝ ĝk­°Ğ$P™}OÍ7J€ö R}ds¸š pŸ£¸!.ŝüğtkŒwêÎĞOĠ5˜à*‚ġ >FŞGĜ²€dk"u7Pë³Y„MQy–e4M/ċy~ĥ>wê]ïÌ,ešĤV š÷éZ$CÓH7ŜìS7Ż$´Ô˜zFN%íËJh×)[4Ù˙mÍp'ë‚ü\ĤĉjX_A&Èahî˙üŽrßiÇj+ôPu‡ù­?yšĥÏžÍ ‰Ĥ$P£:Ĉa8ç=³ôÜ64µW ĉ­b%ĈcÇİo”Úżêh?Êîo˘iSîs8.CÓ˜{ëÇĜ™Ÿ›ĵĦc%.öİş Ħ{kÍ}rT- Hĥ.‹şğ[Ħ‘ϵ­P“İZÈóüBžçgĵëáÜlŽ*W ÀP9Ĉ÷nı$|ı#´‰hh‚Ô^†‰¤J.ğlùıŜ+‚ÚGjİ;Ž„¤^\„8lJpŝĦ_ۋc+´-I’AÇŝ ĥBÀĈÛ ]U7 ˘$I6GQ´;‚ûï˙ôCûzjÇs \\j´˘MѝSÖ@Œ1°vm>‘ÚĈI¨Y1Q 9с=†ħ’zĦŽÄÔHJ\z§hŜüyµ?ĉÏEqş§Ş[/U·Úî£êlY@²µáÔŬjĥBußV(Ïósež˙Ó_s!-HԅžÂ×sAz!’#/˘Û3êÜ–ç*µJĵ‘tَĤ#8Ŭ{ÑR}Ô-–†ş3€¤İ*B·@ËF½ÂZHL7ĵx×ÓOö"Ï· ƒ•l…6$ò|#¨ş8ާ£(ÚÁxjúĥ‡óï=™ öĉ…$Mİ2‹BĈU§ÍSyOÒhÄ%* D˘!Ġ•(‰–ûĥ\9r”uÍ£îW"F(kù… gŜyó?˙:ÑÛUQ|˜eÙٓ÷uIĠY賀dëŠİğËM˜•Xn+t1Ïó³ôŜo9oż8Û9$ Ġ’hA߁ÁˆúRmóRFş9)]ÖÌ&é.‰äh¨_{£~âAënè;j/É11’Àuġ.ĜıÈŝòžfǁ{}ß7ÔŬĤÊVè ¨:>‰Ş [[UŬoŝÑSl°%xn&Sâ Ħ,z œÁáʄ–S?BïÓéŒ#³‡¤ÌnÇŝnŭAçICŻ4ş7X•‹‹%ĉ.XÊ*ÔM†ò­`—\¸˜0ñĤvò° U7ɉÁRulŬ@ÔŬċŠT:DÏV¨yŭÓ_0;·PË2Së&g cŬ@,M@IÈGcqċ=5žyet’Z]‡ÖħAö-×ëúĞıÔÂ<âħ' ²& +‰}Ûĥ°ó÷ù!ß÷­Ö$Iâĥû÷zİ:6NĠ ƒnöÇÙ÷Ó;ž?—R-! ċW×TQ/pħnŽhô½.VBGKÔÍè@Yψ°œĤ#šF"[Ş1{.ĊÂ\Şê°8Ê÷žŸy³şeÚħ,ËÓY–Ósné TÀċ+ì>ı~Ċž$[WEŬ]‘­î’.ċy~ĥ.}üèŻÍg%šĤqYFêh ó“=QAŸĤ£ħW6{z)è08˘Vž,ôĉı£€fž¸›KRŬÇŸé.&-D-Aïz4™ż)y[‡ù­ÇVhUêŽġj…èŠTu†Ş{è·ŝèž–jöÖ| ‘ mqqŸ.WŠCNèĊћŽHí5mĈQ)VÙ3#)%Òaı ĉ/äȆ$ÌU>u,rÑ,ĵòíŸm›ĵwšJİê4U—AĠ­§+údİ:‹Hl]ġÙ2Ŝ5]–­PšĤ‹Y–]̲l†½ùüëò£ó², TŬƒòğ8UG#‘瘰g4™­v™ş9}%/{Î ì˘*Œ1h˙ñĈÂÓ s—tĞòRbWè`á/˘Í;ï֑çۓ$™Z‡­Çċ ̲+êĤĤĤI’l ‚`Ÿïû‡ŝ­?yšÂMŝ³g34ıTż‚À$àkU£ŭpIƒ1i/B)ğÎ²Ñ˘‘ş‘#P+Q™7X¸”áâÙéb‰Ĥ‘Ŭ•—ÌÈ_û>vŠıÙoĉyŜ§êò1Şnµîh½sG–޳€dë:è’V4Ĵ+˘ÂDžçyži:_Ċù<ÏOÇ˙ĝŸ^™]ÌES¤£ÙHc*;Ùß’")Ì<°Ì.ÜtY&OH“ZKÚNĠM9ÀċEL|òmŠŸ°€dëŠ:¤ġÚ M\ôlRĦUw³EQœ­/]8=û÷feĦl…8k׿ñÎhġXĥŜ°ċrU¨5egŭŒÒN ·Ż4ĉ¸R™yÑÍŬ”­P]¸$½ż¸9;ôÀ#AÔıIWj+4 tVşÒcHĠ 6o½ŭÁoŝáŬïÏWì͋%šB¨T(×sŞC;xd„ ĉ½2†Ş!T+tu%°8W`ö\Štħ‚”rDÀ‘VZş<ôP_:òÁm›Ü£˘j`çÒ4íÀ^éĴÑ5BĠi<² ™$[ëî’ÖCŬ]­iïùï½\žùp ˘ìÈ2f²‰Ĝ²r`9èÈ@ŞoY¨Y™F #Lô9 íR­…êËÂtÂ,ëyÏéĦ×풐ׄ‰‹|ùvžLßĉû~KŬ ƒà2m…VëVë–Fş£ITŬCżŝož¤p“˙üĊRˆR€BWżŸ£m”Úl 3|Üë0…$43P݃"I(²Rí ]ÌQĉ͈€aübJ5ÑvF`Ê×˙;›K³&Ŝ0T]–e –޳eɂҕĜ M¤òôÀl™çy–çıq?5ġÏñĈl–KĦüb RNJ]g¤¨<½£¤eÉB[ۘ+}³‡¤Í‹dh@°UÜq: ´P EGA/Äi#ħċà­Ŝù{>ûx‡‚ Ĝ“$ɖ8Ž/ÇVˆ­Ò!­B|=TŬĦ‡žxd˙#Oïxv&Ç\ZC6Ĉ‡ÊL[;yëĜÖɉZUñĞB˘ê=…ŜC.”˜=7ÄÒB‰Ĥîï-#Ĥ[/î9pbāâĝÏÁfŜĴo F¨ş,Ën,ŞÎ–$[WEŬ­7òœ°‚âJu×E‘§işdl…Ä̇GƒWr6Í3QĞ06IŠëï+ÉÑĜ‰~Α…ÖġĦ×ċHÙI–…£FvÎßÒd)éûÚp>³î“Ae'äñn`– 6ûE£ò‚bÎPŜóıíĊžÛŽà;ƒÁĤ0 'Ù M˘Ŭ°J‡´š b"UÇñŽ ö6o½Áßĝ·w›ĞñöbѨQ]N̟›(wf‚}uƒ(ۙ-)JUWK „)\šÍqé|†<-ğ½Àu€À|G½‡‡\úċ[?ĈmSÎğ˘*Mì‘޳˜ĝѕk߂·K“÷v–QrÂÂiÖüös)%Żëş)Š"÷bên½¤ÖV¨,ËR ĉò<Žfö”o˙wN;Ç4U7“eٕPuòúĦêô{Âm‡d;$[WÚ%-#_°ÑĥB?ĝë—ÒaMu¸ÊíıµjŸrtK“‡Ïş#CÏV¨ÑCžBtŜvĉqFŒ^{Lg&9 pEyġÚ6@ yƒŬğĥ³™{ĝ°ïû·ô#ÏW°Zižh­=£ĠTu·<üŻ˙ä)Mû/\, ÊÔܚi0ò×~‚@˙=†iƒÓr\ĵT ,…~Ÿô\ĜzÁHŽuZıÇ|ĥ—Ŝħ ‰8ĵ}‡EÂ(BfÏt„ ëGHMŬi”cÄà€ Á´Ê@}YmÍ/7ŽúĠ3É  ĉräÀĊéûtËÔıwï šfišĊŞŞÒ²,ëşEÓ4²Gۍ –;-sd<ύ8ˆxÊPuñôĉÛúĉŜġŜBwĉ*4 !@ähWâ Fjï¨n$ÓKy£@Y*ÏVÌ C÷ŒÈa`À<bñÊwŝwLó÷¨ZŞ.˲´ŞŞġRukIğŻIŞ=$-DÚÉÖUSwa+dTwM]×U–e™ĥ†9_ĊÉÁ÷ŝÓËKE!ë<ĉç&Ş4*Óîu@#Ĵ=0ê;?´a~ÚĵĤŜ,‘ġS 4ġà1'­ş c†„.×ŝj6iÛîŭÎÙ;~éӞç™ÈómI’$aúc‡IöB+ŬÇ8†ŞK’d$ÉV3ûéßŭ÷OUŜÀ{ö\&Ĥ <†sx\)ê0~·Pbf6Ç0ot̆éĠï-İXy…4ùğpô .X‰âÍïckyan³KŻċy~ZĞêó<ÏŞŞŞÖIĠ­+qmRuĥl‡dkİ;ĥ7~…OcŬë}.…MUUežç f=ϛò.]8>xŝ˙Ê-ëğŽşbXĈż­ÔaÙş8š0kŞ–Ş3j@$ƒq Œu­‹š§a-1ÙüRƒrŬI1ÀŞâu-á3B}ß/mÉÎ{$|˙•ÙĤišĤVUUVU%TMÓLzل‹ż‰TžuÚÁÁ[û…Oïû‘m?8•˘*Ĥ$àİhvNpCÓHÌe5ÒĵYĉĴ.„TÊCIÚÑ[ÒeQĵ•wċ2p‡”=ÏQžxĝµúȖàċ"OÍì\šĤéMEĠÙÉ’­şëĈ€¨')%ĞŞŠċyž{ž·èyŜyß÷§Ïïċìĥ‡wç$nR?bˆżq5]t&YԌLÄÈċ_݉àjɳCÔvkĠà0µĦdlĜ 5J0@B‰08ÏakBUì |œ½çKwÜrŝĝ żç˘(ZJ’¤0ÔŬPŸ÷Zĥ—¤İş0Žİ(ŠÔìÖíw<ükpçÉç—jL9Š~tÀÀ%4„ı´F^ŠVyĜéHÈ‹ /qU`ÄĠ“ĝ´‡fŝ$Êw~ŒÛGS/ŠâlšĤ³WIĠáz˘êlYÊÎÖGGŬ`+¤ğ¤,Ïóy­ş;ıéûùú0-dSdwÀë,Öä¸ı7MLŽí{Üġ×ĠÎ%ĵ·W˘]„îĵú@hK'&(„Bˆ]†ÇħÉg‰°÷ÈŜ읟{Ü÷ŭCïï‰xKÇI’$8†ş§Ĉoî8ކĦ7PMÛtìá'÷OŸD0ċ½X` l$BA Fb~İÂì\‰²:0ûËIÒ{FĈÍBtĦ{DWAÓé½5ĉpĜšċ[?À–üÜ܏^5 °=Şn’Şn=4ĵ>İ:+ûĥ€dk£İğ ³*˲HÓt)Ë²Ù˘(ΊÓǏFo?sĥrH!ĤwRw)ŭhıòë˜F’e{ g¸Z5ólÓîàí>ÒèϨM{ċ ç€Á…ÚOò†Àe ˆ ‰a‡Ï>ĝır˙A°?Š˘ƒÁ`SEA†Ŝ:Àˆ0ŠĜÓŞ:CĠşë3_|ôà=o=:W‚!d“Àü°Ĉù u-ġìUk5€+;7o!tĄ ).Œô+֓R‚{|Qh)6HQe˵~ËÁˆznár……Ö[c˘*tv’Q Ÿ;êSwè(*eÚjö“0YĦÁ *ugäaÓ#Ÿßíí=rŸÎMÚÇñtEĦëşŜXGÔŜÇq£(òƒAÇñĉ0 ÷ApÁ/~ŭ݃·Ŭ³ù…Ó)fĉrÔı€ÓHŭÜԂï —ŸÔħä=šNHşLŒÌ÷pß 8Ş÷Ÿ‡üà•ĉÖÍÁ+eYžÔ°-U'„¨o*Şeì,^Z@²ġIQwë­PšĤ Y–](Šâôԏ˙úĊr8Ĵ›<sşĝ‰Ñ%¨×1ġD ëhĈí†úŻZP“TIŞ­Á€Q h2KÄÀIYˆsĤ¨2G..1ÈZààö-lÔż2ĥB{â8ŜÇñ Š˘@wI”‚µŭèşEQ”$É´VĠíÛşgß]O˙Ğß:òÚlŽç 8¤-¸RĠq·>BÓé˘.VBp#!eύá2ÁÈÜÇukärÀeĊY”oŭ·¨êÒ4µT- Hĥ>ê.i%ênµ+Ŭm…òµ9|ı(ŠSë êäÍ@Ġġ/–lY@²ġсÒĠÚ ġUwĈV(ϲÌĜ Úòƒ˙ßËy]IQċà‡v3Eĉ#Ĉ1ç2ÁȀ‹€”r„ş#u••Ó2Hn;í›Ħş”ŞöìĜálŝìo=İ-uçûoş$Çqü0 $IÌì-ğ÷ŜñĜŻüĈmÇJœ+kl+L÷f~5g$;y·Ŭ3ê`݌Ì}WÁ{¸bé Ê£?Ĉ­1½Ĥ:1Ş¨:qSQuĥA²€d뚠îĈï›h£m…ZCQgĞı Ç7½üO§Ş2‡¨+Î×áPÜWFc)¤Ô^wzóż7³ÓßK2‹ŝ(•×[ŻMĜŸP6EŒ3€$˜$ìĵë‘İèî§ÓÔŬÎ8Ž7Çqyžç{žç‡a$I2Çñĥ(Šöxžw˗˙ä˙òä‚ôœwg P#AMV(ÔC½ÔJşİçh.{‘ԝ‘€½B0ÒÖIf݊.˜'Qû6gĥìMĠ× °†ŞkÖqarcĞêì’$[×u·jwdnFàçyžĤé˘8œ ž˙î‹lŝB Q€‘ŜĵçfVè ÀHN¸ŝÖ ÓhytGŬİ}%£Ú£~l…ùô¨3I€Ôò½F›CÛ˙Ê­ÁôÖO…a¸/Š˘mZuûDQ'I²9Š˘Ŭï|ä+żŝĝĥC·Mż3[˘ÌH¨îHJjğ9ê¨Rï…iƒ–x ZÌ@=UŬ€8}ިÎĵ ñŝKâĥ­Ħ£sY–Íi7†>U·žîèĈ£êl‡dÉÖ'BŬMê’VşâPRJQ×uĥ“²ı–şûñ_ž—”šşëƒÊeƒÑ 4”â• ¸qrèT€Ġ¤# ?9b\Úbêç Y ԕÄîŭŬİ'ŝx£(ÚEі8ŽzŜhsÇ;0Ü·mÏÛ˙•o9>_áÜBYIˆJ@2@4²ëàzÔ\'íV¨|êtgÔĴŒ° MתZıpˆê<Ê7~€#1½ş|/Ïó3Y–͇ažç–޳eÉÖ'FŬ­×Vh%Ċ€šMŞË²,ôÀìlQ3ò̉cƒ·v^ˆMŬ€9êr“ĜĈ‘ıOŠ^Ĵ·ìĵîd7£DAİïżİ[ŭx‚ÚáT;ĝ̖èȽ÷…a¸?Ž]SSS[§ĤĤĥ&I²M ~ċO˙o-Ï9vAQu˘VÏÓÔ˘"Ó͙}˘k·4sF]g$ċ`4ŝġċŜ\IğU0\‰âġ`:›YĜ°— U—Ĥé|Q™N€µT)a1Ô’­OŠşğj[!Ŭ%™Ù¤3ɳ˙ózaħ`MÔnkCó6 ŒL|şé’ J ÉN½ÖSß)ßğ.>½d}JŻŬ‡’„´–`žÏO}n?ŒFQ´7I’=ƒÁ`w’$û‚ 8ĝè×ùĝ–Ÿš~ûR²hJݲŠjف0ŒÓt½=#!H ÖFĴF&ÔP­£I4ŬŞ`Ô{…z G# 5Q 8²g/d YĠGÙ–TÔمĊ3sòZ´ ÑµĠ‰ş–¨k‚żïŜ$yĝ—·MmŬá=ú•ßÚûÎù3óêB ’„ĤhÙ{ ‰FŒ‚Q£Á¨_-€Z\!µï Sz–šY”oŭ‡#q’+ŞnFÀ.M ê$ÖŜ7şyTuÜ.Ÿ–²³ġħvI—yŜ§ìäm×FŸK)YÓ4&ò|Á÷ŭ‹ïOŜ~ĉ5÷ևwËŭ·Nó`ş];™” ĉ Á¨eùF'…ž!b\…àİ߀Á%€1EÓ1ċ² ’@^5H³FŻ2€11µ‹#I ö2"4YƒeĜóĜ×ö|üÉÍg3âŻ}8DMÑP-Ûŭ)!uT]ğO¤÷ŒŬ5„Fˆ+£é¨ûÁ ÌuÀÀÀ xċG,|¸´s[ÒpXœ1Şş,Ë&QuÂRuŭNSĜEÂ’­O”ú`Dc[Œ0Hŭŭ$!dĈVÈ÷ŭù Îı;½ù'ġÊıoüŻO‡ÒáäĈíêʽŸ´n0˘-_û$)Ż;&´ëWw2ż@œİ(ô‚°˜×ç€=0bjk‰ƒdŠÛȃ$ΗÜí‰s2EadŬµ&6B]ŻCcQ#µv¸0bc— ÌĠóF`àħƒjĉeˆÏ‹Û·EŻ”e~J‡îÍiŞ£êäeRu¸aİ:Û!Y@²uMQwlerlYÇÔvG}2ĥBiš}ßżäyŜYovĉ½é×p(}àKß'Wı7ĴĞ3˘ ­ĝİş3ùŞ0W †°5ÈKĦ²ê´ĝPìD=0ƒ` ܸ ˆšÀˆĦŞ%e£á`€l¨µ˘ŻÚ#5ô:F]g$G3Ž.ŒÌGW,,v!†ç•Ş.jN9‚Ŝ[Êó3†Ş+˲lšĤĈäı²ġRutRuX”´eÉÖ5CŬ/—Ĵ÷QŽƒ’î’¸8ĝŜóĵİÁKß}1=üàvrŜÜċµTê6c>z`$G’ZÛq^"@š–R%Aw4|’VĜSšéŽTgÄ4Ġ'+ŭ ÷òĠU!S6D²$ċÄÑtʉĦ›3joR˘L0ZL½îr0ƒ{@ŝĉO0X:5ܵĊ{q8žÉ²ì‚ĦêŞŞŞ,Ugëi:í[`k½ 4‰UĜ !m+”jŞè\Q§·ŭË_^äÉĤ0Ùâ`¸‚Έ&‰›§V[Bğ_sqĦąùµè¨´ŝì‘ħ¤İ´–bë$ÙÊÒGjšMğÖ˘1îÜZÌôĠt0ˆnİ—FlŒS é9`>GġáËï='oßĵV–ċiíä=§S-U·îs ĥC²u-Rw³I“Ä “DĴo+äûŝĴçygĵ™G7½˙ü-ċíï”ŽĉpiÊ ê8™ÚIËd_â ¤DUKd œ ş–Ïc€èö”LgD˜ÎFê-İ%9Š•„^ìEßíAÓt²çM×ŜDVFÜu@Žşü”Ġ%TÇ~„CasґtLSu³,[,Š˘XŞ“–޳eÉÖġBŬ­ okAĞ=`’}[!­şğàyŜĤÁ³ßz!Ŭ}ÇçŬ)p Ęd]ĄÎèrÁH6%ç2GƒL)@LRË%r6`ZÁô—ş7…µH1J˘‹ĵhŬ$A’£VâŬúÔ]!M×½ NàîŠ7~Œxŝáî­Ŝ‹á°+‘ŻBĠ KĠÙÉRvĥnênĠ˜Š­PšĤ­­Öç˙ÇħިİKĠq0ĥ!`Td5.Í(KĦ²“H;%ô£Ï[³ÓQ%œh¨•lw_7ƒµ²s7_kúĦ ’ Hö|êHÍ" FtÙ`Äú`¤ÍS™Ë•ÄÛê o˘yï9yûÖµ²,OEqVżßiY–•ê'°eÉÖ5{Z˜–]q÷m…²,›-Šb†ŸxġÍhĉèšÌAgÇ}`$aáRŽĊ²Gŭ):MöÄf V’l‡gE/­µuċÖ^sf˜Vôö”„$ċWgе˘‘Ĝqµ_¤èĤE~5`¤ÈM0—ƒ\P=‡âµĈż:íŠêXžç3išÎĉyÔ£ê¤êlY@²u½wItµ]’Ž<7ĥBóÚüäĤŸŝĠKuž5²ÌW‘ÙëıL0*òs3T•û>­ˆë02ÔÚ$0’&8ÏĜ iK˘ĥ[F Ħ>o 0é 12{ċ`´ŒĤ3³UŒ ĠñŸ ^ü Ŭ;/Eq:ÏóóÚİŻŞ[ËHñw9¨:[l]ÒUÙ !Z[Ħ,Ë.ċy~.ĵżċċïœhšÔTêŠßá—FBH,̗XZ(şÈ€Iau#û;rD| z`Ôî Ò²³!Ò4žlşûÌ÷µ‘° `DWFllψ1Ĉ9xà€yêóo˘9öĴĵcK4˘ŞËó|Ĝ£êäPuòĤ¤ê,e÷‘•5Ĝşâ.飴ò}ßĜ MMŭÙĞŜ‘‡wÑöCÓ<ö†AˆfbrT…Pd Ò´ 9´–/îÊ?Oı3¸8´R:¨áWġÛK%İî˙ê’zï“ÎNÒ™ŭ)#ŭc—Ûi£ÔÎŞŽİ ”s(ßŝ!ĠWÒħaQœIÓtvLU'×ÑYŞnùI`Û!Ùş†İ;`uġĠZ)£†şĞÒ4ÍôUüı<ÏOmùÙ}­*)вwÔH4ÛAĉc#$ĉ ‡ë£–öjCüşŭ$Ù:³ÇDR½ĜqÙ~/!•ĜAŽ˜·vßBԕ€c½ G™í1ƒ‡.¸Ç~ŒpîDş'ĉ/Eq:MÓ Y–­EĠ­5kİ:¨}G[l]ğĈz"Ïû·ŝUyğöm…ôÀĉY9;óîôğ?9ÓTˆj0GİÇT’ëè³eƒıK%êZv"ˆu‚‘ù\´ûIrdoİínzŸ·4žè%ϚôWôÚ~_ßżÎĴÊ5Àë#-¨g*xqEĠxNŜħ5|½*˵WŬ,ËÖ˘êÄ TYŞW̞ô–²³u½Pw”°ÜVXÛVhŜ÷ŭÈóĵéÁ‹˙âÒŝ{·’Ä,˜ˆ×в2–JíÀ:ukP"!{Ŝt£ûN#ÑçbÜ.ˆzÙn— F}(#0.|*PĵóòóOÖïä:V"˲1ŻşġtG–޳eÉÖ MŬ­Ĥĵ9´ĥByž§ĈV¨Ê³vĵĝ­w/Í Q•¸ÇWžĞ#CŜ‘ìŒ"ˆ”7ĦéHwF¤;#ji½^‡4ÒU]aìwvJÌep|†âÄOÎÏöĈ΋EQŻşù<ÏÓ1Şn5²TŬúx{Ò[@²uÑwX8­i+TEa¨ğ<ÏgĜñ—_ß2÷î,Ġ¸µi3@l™ï#IêiY7MèŒ:Ež˘ħZAF*„ Üq(9Ġùwĵ÷sşckf]UêĜ•¨şIŽ ´ (YŞÎ’$[×}—´aĥB:7i!˲óeYžŜñÒßì;TËr N䪅ı}䍣öû ’ }àAŬß#’QKñ]Ñ8iá¸ç€êE”oŝ3öğù9Ÿê·ó<ŸÉ²l=TÀúĊ –Şùċ­ÊÎ’­ëµCZ ˆÖejl…t—tİ(Šsb8˙ŝî£ß{Ô@–…Úï÷ıZĴĥĦ`ÔŜ+í1CKÓġE½ŭ&IgŬ`ÄĈh:¨!Xîr°£z˙ßËLıϗey&˲óz†+ŻŞŞŝ(¨:{ñeUvl]O]ÒjÔ0ÙmĊ.İiš:Ïó<˲Em:“ĵû³W7•Iè½$A`ŽŠ ßh02³.†ÜĜ™™#êâÉÉ|Ÿ ĉÛ 0҆KÌċ` yhf˘>ŝsş}kfU–#Şş˘(ŠŜì$ގ”Şğم ŒÙċÓ’­ë•şÖ7ĴJáġl…ú³I§w½ôׯz“²*ûBÛAl4uûIH´`4âĉ€{şj0ÂĦçĈÀH.Ħ|óĜÇÓs!šwtĴÄĊ4M—ʲĴÖĦŞ–Şğ²’vÉ’­ë–ş[ïlÒşl…L˜_Q3˜;{|çû?=ĊX ó¸˘ìD·ˆo$ĦçÀ-n ^פÀŞ£ZÚ=Ò-éBFà!PûSĝċĤܗŠ˘8c%ĉŠ˘Èʲ,”ëzµTŬµHvù´€dëF îVĠÂáL—$êş3U yž_,Ëòôô›˙üJ,‡)“Eç#ÎÑş­n$™;İ·Hŭ¤#Ë7ŒÀċ`Œx࠙}ġџÒí[ü·ê²üÀ¨êÒ4M{TŬzŬìÌÑeàĥC²€dëF£îÖc+4²ïal…ò<jYóış,Nî}ùżżĊ|U˜Ż=ĉûHÀhT}×WÛA6ˆĤëß' p@ÈPóCìsÓ󆪛MÓtİŞŞ²išë@^'UgC÷–·Hö-°€dëĤîÖ#—µ[!çü‰£;Ïż~2WèÀıöEe#ÔŬF‚‘ñĵ£ŝŜ҆€QïıŒk+g`rùŜŭ)ĵóG‹SŜ‹yžŸÖŞşù<ϳ²,ĞU·ž=KĠÙ²€dËRwXß°ì2P2ĥBc‘ç§·ô­CGT)Àµ@MÈef¤ FËĵÌ7ŒŒğ8t—Ç”*\bŝ8ê÷~F·oñßݵŞNwŠiY–ċU·–“÷J dİ:[lŬ ´[Ħu98!yžĤiz)Ïósu‘}¸÷­o•ĴPùz‚TġFc÷‘$pGı1P3DñÖ÷ħ—/]ˆĵ•çù™,ËfµŞn-ގ°ŝ™#KĠ­§ß·eÉÖ y:Ż·S‘0÷Áó<ż˜çùLpê7·?ĵD2SLW Uw44i0Òg)ùġ?‡wáhypÊ{(гiš^‡ EQu]W+¨êhPZ­K²K- Hĥnš.i=ĥBĞÒxf6)˲,MÓMŬÙñÊ˙xĠ÷İ!‘ŞÎ˘ghJ×1RÊ:043GQ½óşs[~SW3EQ\VJ†Ş+t@Ğ)éVş8˜ôw³Ġ/;‡dÉÖ Ù!]-&!DS–e+pÈóüĴXœ=ħçŬ|YM,…@ Ö˜½ĈÁÊbœ„q†úçħ×Ë/Nı8S×ġ|Y–‹eYĤeYMÓ4RMjĠÑċtGŒV)›kÉÖ Ó%­vu^ƒé’DÓ4Mžç­#xY–3ƒwŸyu“œ]"ä`œguw­‚IeÎà0€gpĥ˘Û“‹DTJ)+)e%„h¤.Ĵ<ì:éóµŜ[—qEeË’­ë”Ö;›´&HéÙ*W ‡ù,ËÎE1³ç•˙ö†ç“”2 ´Éy×tg4öD )Üú4ûpë£;9ç8ž88ÜqpÎ×rXÏm­‹[‘, ÙşáO땜Ö˘ìFŜsfY6_Ċ6î]§Ÿ=˨ÉFyŬM’kŒHHċPS|ÎpiÏg·ĤӇözž·) A†aëş+Ğäh‡íŽlY@²eQèòf“&Ô2°’ÚÜÌ'UUµXUĠüÖw~x2qʜ‰BĊ}?éµFş ĊHœ!ֈŭˆ½żoñÂxw†Û’$™N’$ ‚Àq]—]&ÑJ×úĥ;²eÉÖÍ Jk-’ëÙ!’ˆdÓ4˘B”DT@Šü˙ùìÁ=ÛA•󝏤3bh³óÀ$À@Êdá Á P#!…‰Ş ­w„çĥ?ú@†ğ’$Ù: Ĥâ8|ßw8çkğ­*в³€dëĈĈ¨5ş¤IûI%rŽpÎıscî˙âĉ{wFÊFHGFŞÁHŞ+  ş0&—Ôj`4â.Ŝ¨¤ż*-áT3Û>³ğ™Ú{[Eğ8Ŝ: â0 =ß÷í9ŭq•uûĥ€dëĤè’ĈAj%ñÈòÎ9‡ëş,_ï­ <ϛŜw˙c{wŬ÷ĝ–£ L-îL#GߢçjÀh šŽAëTûƒk€‘Zû8¨idY… œfïo~ú~ß÷÷Çqĵ3I’̓Á ò}ßġ<Ϟ×ĥËrí[`ëï˜Ĝ„jbċ8 M’$ŒxS†Û’M›÷Üûk˙öÀ‹3ŽŸË@R‚9ԈQÀıŠ=#2 4ŒĜ„.ŒQ÷‹1Ä ëN#ċ(dਠ䢖È7ß7¸XdĞ|ñ’bišş3!D)djNĥAX{ꍚ²ïílŬ$@´žûÚû9ç,g0DƒÁ`:Žíaî}è·ŝŬƒdä=ûÁ¤Éß0jñG‡ò-ïŬú`¤0ú1Λ FJ˘N­ŻĴ$ÊĴDì0œÜò™C2Ŝv[{ô~RE‘ïş³­÷>[k–}Û, Ù²5~sß÷yÇŝ`0$I²5Š˘=zòŜMw?í§ĤX6m+"kıĦ`d:#CÑínÉŜ²^ËGĝÁ܁i› 10ù@€ŠJ‹w:l~ò!ß÷÷GQ´+I’ÍI’ÄaşŽħΨ˙‘­NŒY[YÊÎÖġğE‘7 ’Á`°5Š˘½ÉĤ-GîùĠ?ĵŭ•3ŽË + Şš š3ıáÒnҏËh”Ŝ!ĈÀzÑ !Ĉö‘k“g1ŝFÙ%B48ÂÖG·,äÇœ’o^Šxë´ë˘ëZ[ܙü\9B}Pkm­ÙĈ a/ém‡dë&ċB&^ħ;Ž0tƒA”$Éĉ(ŠvA°ïÁßĝ£Gĉœ˙ìÉ%P)Z´ you˙HçŒL·Dˆ#0R¸ÀÀÀ™:)9xOpAcÈDĠEÑ t9>ĜôÔí,˜:Á>CŬ%IâuI|•îˆÙ.é²[sûX@²uC!Ïê‹ŜJ‹&ÀÇáï;I’„ƒÁ`:I’íaî;àl½ûÉ?9>ÄÒR™×  ÑNßò££~·Dí>X#R4"ëĞïX Fœœ³e`Ŝá 5 ÊĴĤù'§{Ì÷ŭŭAìŽxKĴj”&ŬÖ~[ĥ>ĥĥĦˆ­>“ŝíşÇq¨Ú†áŜdӖ÷üêŜùÊÙ ï^Ì!Ħfäè ì8İ– 'k·™6΁a™GĈ,ÜüvÔŝ’jW‰@\3uĉû…ŝ’€`hj ß8żíñÛĞ÷ï Ċ{Fu7ĴŞŞ¨ëşIÓTŒuJ´(Qï}&Ĉ³ ĥl‡dëfíŽĜ `4²xjŞÎššŠƒÁĉ(Švùż˙oüŝcsl:xöL Y  –µ5B+á&€‘ĥX`Ħ˘íú“£+żé˜Ĝe§f/]Tx£/ğÇhòJ"ôCv|ĽŽ‚`oEÛĤĤĤQùïğXNÙ­Ô-ħËèbmÙ²€dë†îŽV#ĉ8ށ—$I$ÉtÇ;‚ Ĝ·÷ž‡ĜzßÓ;vrˆ…ı"k@ i·lµš ›J½èz§k’è£Ĥ3Š ÒnĤÛ$Ój;ŽvOi”  1ĤËވR ÙvW<3ŭïŒ˘hWǛƒAE‘§ X9&ï'­¤Ä³eëc+KÙÙú¤ğ#ĥê-˘Üó<'Ijjj*ŽíAì äÈŭßü{Ŝ¸P²wԐET$I D42œÊU¸Ó@ôÑĥ §Ċ Ĵo3ÔMúğÔ`’À8C ‚ĉİ à  Ö×Á™MOíÛZĵ§/Î\Šxħë´,ËŞiÑ4MßfiµÎÈRwk•€cßÛ!ÙşQÀ“(˘ ‹$ïuG<Š"/I’(Ž-šŞ;x˙Ż˙á“s|:|ĉƒEµo¤‡H!ġÁˆë…Ÿ1ê[ε}`dĞéÑwcĦá­½×sIœ38àéAÚîµ ÀX!‘D–W£i~|êÉG<Ï;èûŝíu—hŻ;CŬġoë8XêΞĥC²uCcÓŬшdÙu]'/Žp0lŠx‡ïûöÜŭŭÛĝĊ]ßyg i YÊ֌”ä(´`4fŭÓF†„`Ôâëh:%\èż†şcŬ×½à¨ $ş—ÖJ’@%CşċŝİsùñÇ·‹W. !’$ɌÀA'ìšÙ$ÂèŒÒx—ÄĈŜ[“Ŝ[mŬTŬzh:€qΝ$I·Ru÷~óî{sĥ`oÏäTIPĠê­[PâÄ´œšZ™ġ$ñÁG Fêġ ' ŜœnGŬ8…3-và cp9ƒçÒèà­úF@ŠZ áÁ‡)Ürğïûû˘(ڞ$ÉTÇĦçy}_ċ"ÀÎ&­VÒb´$[7U78r×uÁ`à%I'I²9 =žçş÷ëż÷Ԓ·9úé{‹*7HHZiŒşAT6 $ò£aC‡™Ë\Zk!Ĥ^;ƒ‡à2ÏíúĊ“TïAQ4’îñäħÇ<Ï;Áž(Šĥ%I’hƒ³(ÁRwëlìÛ`);[7ìy^Ÿş›Ô%ġğ•şÛ››ş# Hl]ÏTŬ$Pⓨşİİİ$Š˘­fö/˙ĉSEĵ3yĉÄD% …TސυêŒÌĤżé"0Ú)ĤE’ĵĤÀmçցQÛÉi°u!ĈċÁ„úµôáıŞ[ıŠg ² šnşú\t÷cžç pwÇ[ƒAÔI +í'ħ›ĝ@·'ğ$[7UÇñ”ñŞÛvèS÷îâËž=•âbZ£É•²Pf£ˆµqFMGcj:İ;k Œ4·) Rï%IÓIٚĥßß÷ècʟsÀáê=ñ ug f…IBQ6ˆ8ûÑG(Ĝt›ħÒïwßVhY[ĦŝŸÛî!Y@²u]wGëĤêâ8Ŝîûŝ>? ß˙Í÷Ñù†½zrħTƒI…Ž|‡ĠV:Ş3Rğŭ#ĉݲ›í‘B-ö×"µŞ;˘î&ĦPÔFYPïb3EW*êŽw¸~iúħ…¤Dž–Ĥwğ>ĉyŜ!-pĜjm….ûX·'ĵ$[×Qw´^ގıË8öƒAEі0 ÷úÎ/ŭú͖}ƒŸ_DS e¤ĵ—)0⠈ú{FÔs`0ԗrYÖÑÇFX™‡SD}PÒ@$I½biş½îq™^$òÎs9§˙< ÔH’`MƒıİGĥͅ·>ìyŜŝ(Švƒé8Ž£ħÙ$†ĠċàX¨n‚Éê- Ùşş£Ëêx†}UŬß÷÷m=xäžO~ċàsgRœżT@–$$Pë}#ŽÎ¨­´›´”š Aô„g:ôÊÖF´>0jïĠJ|a˜·N.ú/ħ<ĜSŬ9m—ÔùI Q]Rè¸8=q'óŸò}†ÛƒÁÔ`0&ä&Y[![lŬT]EÁ`0HŒWçy·<˙î‘KÄ_9Ş TI@(òj=Ŭ M×âFâ’†Ĥ“ ” ŒƒÊכ5}àцrFĉÊ[J‚ ‚*ŭĥ iyx˙M7f&+0fwïPV5hp(ĝ | =›´;ŽÍI’Äq{ÖVh­ɞ÷]ÖíÛÖ5EĠA°Ç÷ŭƒwŝò7Ÿ[LŭË+Pf ¨‘ †À4ızîĈi§rFċÑjñBİքĵ 0kCġZ3<à.™ĥ‘ F=Ġ6¸$H0ÉT unBÔҔħRC€Ë9¤4B@ċŜ Dj+–gïÚÙ|x_(?œ‹˘hİŞŞĵ,ËŞk9yN°‘çĥl‡dë& êĤâ8ŜÁ-ûnı÷àÓ_;ôܙçkF…â|cšÊxoVŭÔuGÒtF@#İ—ut`ĵˆœÜwÁ ÀPL´t™3‰ñ £ö;…„fp–Ú§ŬSj…=şFİ;×Ħu§hLĈŞ*dY‰ ĜğÁ¸^p(ynm…Ö<íòiÉÖġDĠĞ{Ġıaz=ŞnŻçy·<›˙î‘Câ/_eTJ<ĝÚğÍÑN­ƒa¤4Í%…ԒꔌwĤbÄp@,‹ê­o“sᕆŞĦzQ:RnġİğFö”w¤éğ=iöÊÚ½$ƒT ä*)xûĞ׍ú ‰Ĥ¨‘Ç·Ċ'ƒûŸô<ï€ó۔$I†ĦכM²ĥBŭ2k[l]TÇ 3,fVƒÑĉ0 wùèö/üꓴÔOO,ĦLĴBÀ”O~e=ŜÊĝż™=#! BhŞîj g`ž¸€X@uâ_°7}ċÂĦŸŸ…Ó²stKÒħVF Ŝ^˜QŜġ$à­1k?`PäLjWp—s¸òöÀızτ@ŬH„œp:úô2Ĝqwûâ8Ŝ1 Ĥ“$‰<ÏsV#k+dË’­ë–ކދ˘( ­WŬĤŬûï<üıo~îƒ!ff•ŞÎĴÄ犪Ó{#`Ë#$”pAwFhZYô 8p9˜ÇÀ†úÔ³ˆÓò[vĉĥóĊt›sq²s9˜ë¨ïgF­ç·$­ĵënèÀHŽRwèSwàƒëpĝ&iVHóG„@^5â­ü]÷ч=Ï;Ô· Ú M>ì"`ÉÖuLĠħ>U§íĥġ¨şGO,JŝâÉT*·QY 8`-ñĉl4hOvrh5ôŞğ£VUw…`D#sĠóÁáh.ĵúƒçèîŬñŒhšùĤiĉŝÎ97d‚Qİ#-$@zßiƒÀÈÜÑuGŬl’ô]+uWßÙŞ uç0ÀeÊܽÓ^HUYVXœoÓ9˙ÎÇzŞğ-ÓÓÓñĜ Öܖ$[×0UÇ]×uÌQ’$[˘(ÚíûŝÁÛ>ûµ'ĜŽ#›~úŝŞaŞġ̑€Ġ`dĴÌÚ-M‡$¤’H uñ/ŒÌ÷k"’`È!Êc?ÂÁ żÀ›ò½4M?HÓôD½4{üÀÜ3gI– 4`W6ŒŒœ]íuÂ)ğ%#ïç;‘–àuŽàÊëŽ1Ŭ%µ‘–ˆpÂôVò7ŬŜ· 0¸L[!v£SwRZĦ$[×=U—$I¤İşšŞğûç~í g2œX¨Ğü²UzĥF#k´ÙGÑ`ÔíMöĞ[ߞk½áÀûà>GġÁ3Ž{ŝFšĤ§–––N---NÓôÔôéŸıÉYBä€ÇĠ̐Ħ ')ħŒÚEPwœĠż·1’]–ş™(F=Wpíààë9*ó;¨Ş‘gÜÁ÷]çĦGûĥBƒÁÀÚ YÊÎ’­ë’Ş:¨ş­zöŭżñǟŝ`‰ı/J•Ş.ĞABù²µŞ:Ŝ[ùÚ½#j½é¤PyBB„1½ĵ02ëŒÀ}Üċ¨/EŭŜÏéĥÍŜħ"ÏO§izniiéüÒÒÒù4MÏċy>³ïƒouG•j/‰Iµy3Äş 02ŸĞ½$#mï\Âû2pÙ˙Y§şs´ğ…ç޸ŠÖ¤UJċ.˜˜Ŝ>ïßòPÏVhÓ*ĥBÌRwĥ, ÙşÖ¨ş•öZŞN'Ànp·çy?ġ‹_yÂÙ}ÛĉŸžXD‘7U£~„ž7RjkfÈ;!ƒÙGÚÑ@¨˙+Ĥé{ÎÀBÊĠ{?Â~/½èSŭn–eçÓ4MÓt~8.¤iz)˲óX8}bïÒKçQ`ŽW‡ #Òa~­°’Dëà љ1ô]THaÏ\°ĥ`¨PÀF /DA€÷ĵÇïâ~|ĞĤîĥ­`+´šòîĈî’,cgÉÖ5MĠñ•¨:Ïó\CĠ…a¸3‚ÓğöŜyĝóż~ä…S)N], ËF Ôj‰€q¸:ŭ•›K|êÖpEәl# FB,3O]˙žQ·×œ< :ŝSĝ³ÇŠ}SîĞyžŸÍ²ìb–e yž§yž³,[̲l6Ïó³[ÏüàĠ„§9ÉJ›–Wo$µŽàšž4`4âÛGèÜzÎĉʽÀM—äp^ÏVH+ï¨ĴPċD|0xß}è ›´g[Ħġ€Ñ :›dÉ’­ë’ŞK’Ä×ɤÛLèŜßü“GOeŽûÂñEP%€BBV Üc£Şş.YU/Ê­AöfŽŒ Ç`µj‚G.ê‹ÇPż÷3ş}‹Ĵ*ŠSY–Ï²l>Ïó´,Ë˘ŞŞ²(Š4˲ù,Ë.–y6sÂ÷Ž1&²jAN=&Û00êl…¤d´è$ğ™,2Ĥ?cj 5äê.ݵċêOFR˘i$<Î0?´;ġ÷ŬçyŜŝ0 wĊqĵ)I’qêîĉœM²xdÉÖ AĠ:òô—÷öŬħċ'ÇQ” ¨”B­ŞZ'oÎ:Ċšñ_#2Ŭ2ˆÎèJh:@ïü35s{ŠŞ;úCìs‡ޏfYvNÓsKu]—BˆZQWUUèNéRžççĵù÷ŽíΏ^¤Ĥ–_KÚ00Ò=R×%w IRĥóH&òœzż,ƒ™MbÚV:òJ.À9¤ÈÓQ2ĊŽñGîw½àc+”$ÉÀÚ ĦgoË’­ë†Ş‹8H’dJÀîlŬqû­Ÿ˙ĉ§^šÉáıLıxµTs2NF#ç;g¤;4RôfŽŒôĈ”ƒË•ŞîÄ3fß-öOı/çy~&˲ yžÏ—e™×u]QCDMÓ4UY–yžçóY–](Šbf÷ÙïGTQ½¤]Á732`Ôóíl’làÔ‹Ş êŒgġßœœ+“ZÏaŜ{xġĉJê²F‘Üžœöî{ÂóĵƒAGpk+d½ì, Ùşf¨:Ĵ‡Ş‹˘È3 °ÚÉûƒżù§Ï”žûÜû‹` JB–œsĝ.Àĥ£ EÒ ż ċÈpµ`ÄĈGÀA}öÔÇF·oġŽÖey*Ïósiš^Êó<­ëşR֍”²ëşÈó<Ͳl.ÏósU>02ĊıÊJb]C³ġYg›¤–Uԝçtl…L[%…€, dq §ħğŒ×ßюà³²eË’­ÇFĠEQԎ˘h{{[[w;öż;vöN‚k³İr`>U /Wçö¨ÎĦ“sT9y‹nšŽsı0"Uà \`7?ƒ{ïb~p£6ÏóÛI’ÜMÓt!˲´,ˢFĠñ>ŻSwZĤéŬ,Ënïż÷?ö

Ž•<ÏӚ޷3z¤SB”EQäq/%Ir?˲YĴÌ]ÙŸ™–<ÊpeŜÊu8)0Rôfww$„¨,–¤¨ğ‚KÔàugŞl…<‡vf“=ŸT@–Ò8GópïĵêxïïħĥBĥ, Ùzê¨ş ĵvğŬlµZUwàí?~ĞuèġmŸ\YBœp°˜Aä `@àjގjŞÎ€‘è8ys!jĤİL˛×F²óI!Ô s”W>Ä.ştżċo³,ğ£í–ò$ɜvíŽË²Ìû€ïóèŭĦŸ MŬŠĥš-òtúÂ?_P$¤r'.íúÓOŒŒ²ĵc+$ğŒşÎ‘`xˆfÙô DÉ!2PÊßÑ °Ŭ^uúÌHÖÁˆ+şÁHM~‚je{xùÓ8şÉğȋü†Î9zÇñržç™ĤêĝĴœc•ê.Žù,Ëî„ËWżŬ#Żß—"q¤:¸‘r˘`ôˆ­èc+Tt\ÁE§SÒԝëĝéDuHY–Œ#‰3ĝázAġ×u§ u×ÇV¨×½aĜµölPw, ÙúŜ¨:ҏŞkµZ:U·÷Ô;om:ñŝŽO-aiı€ˆ9$…PŞ:׀é#)…–xkŞNÓtLÇu݉ĤĞîĴÊĥ 8%Š‹żÁ.,Ì·ŝħJ’dqU7îCô{ğ‚ċynl…’$ı—çù=ŝġLç…d™ú1p=›40Şl…¤Ĵĉ’¸èŽ8ŻÀÈ83˜. èÉM"\ZK €àJJÎr,„Żnşë˙A[Ħ^PzAl…lY@²5iŞnùQ]U·ĦÑhl ‚`o´aӑW~òĞWżœIpñvĴh:­ŞóŒjKïĵI×ÍVTj0sŜÁdçühU`Ôo+š9rÊkŸÁıw8´EQuÚÉÛPuFU'Ĉ 1(I)YĤiÙ¤ËòtéĈÁ/+I5ë8'T]ÈdÀH˙y;’ú锌ÀĦ}§}ĥŞv €:òÜsq•ż~DxĜ …Ï­­ÍC²€dë‰RudU×jµšÍfs³€zíßŭçĉI;ĝŬeˆB@ä’+  #d¨Í™Ü#ñfB*U.Ö FR‹¸ ”€/ŜB~ġ4Žmt/Ş.ŽqŻdYfĵêĈé‚Äêzż¨îr J÷²,›i-}ûÍv:ûPòÄukÜe=ú|}`dŜÈıRÙñzÌyµ Q êFR7˜¤Kࠆ–¨šċÒÂÇ)0ê d”wĵ#r0Ŝwĉ?ŭ÷7g}”އçRu–Ôğ IZ˘ĝ¸(ßyĊñ‡Â0ÜEÑĥf³Ùz.m…,egÉÖ§ê*0ŞyĠEş;Ú­¨ş_ŭpÑÙž´QJˆŒC”THĝDİê\›­ÔzWnĜ…Ĵ¤ŬœÉuƒ6Nu)hà‚/ÜD~ċŬè\e~-Mә$I$IĦêĀ.H èžÄˆÏáBVE‘$IZsż½yáó/7;‹K`İàu ™ğêĊQ`dÊœË Éğ Xyä×钪ïŻ˙ŬŞEnÍëÎ(Q¤DQ”(ŭŭáUqò}×u§Â0ÜĠl67żxĥBĥ, ÙzTBĠíÛġòol=ġÇ;OßXĈâR Quw£€O·îUW#YaÌ Àj`R‰Ĥ œ´ġI< ]ž˘¸üĥħû7ùò+íUw/I’%mT !y›ì8rÀÛ „‚—e™ëÙ‡z`vúÂ˙Êñ¨€Ì:`ôȽ¸Œä0BßÖJÍ'iċb]^/ëóId&UܙÎM"] §‚ ˘üñX V”‰i÷í=‰ğó9·²şo HĥoŞnCEÛÂ0ÜD͗^ŭéߟ</'ßŬ\˜J•ëqĦ`i=HtnвfZEKÔİşU80tŬ@$¨ç€8|îKğߔ‡·„_dYfTu86TŬ q‚XċCŽÙQqÎ9˲,M’d%Žù4MgizïÊ~öċ´d)¤,°qjÁHÊ÷ώ? ¨ş%TnಞC…Ž­jnJžŝلTT#$—H²Ħß Ĝ[Żğ^pP ĥĥZ­ĉse+DìíÓ’­ï›ŞÛ†án×uö“˙ĝewSôċEŒCĉ ˘T&ŒŞ!XcQ#LĴDOèž0Ĉİk#Bˆç€úhà@ĴÜA~écĵ´\+fY6Çñ|’$q-vµ ÔÛĠ_—cw\wI,Qµ˜Ĥé½,Ëîlĝé-/‹! tI'F 5[cşZ§îL@_ġç&Zà-p‘瀞I‚A2Î8–ƒ­iĵüžóÛÙh46·Z­†µ²eÉÖj¨ş.şŸŞn×ñSŻoOwZ£êd)Ĉès#CĠ™ÎHvœg:>uú%†Ş[=MgÀ£>Ì'²@~ċ#l)ĉnññUWĊ Şnœ.Hö<ú½oĜ™çœŻğmè:[Ùô‘ċ9OHˆB+î4u§;I€P“ˆKĦm'•Ó]ŭ,‹ÈNÂĴKuG ÑßÖćpy‰Ĥ'p]ŝ`Şôĥ‚`_£ÑĜĤ-ĤÂçÂVȊ, Ùz"T]ġ}ż‹Ş ‚`o5żú³8u~>'ßŜI sÖĦê(àQ ×1G˘²’ĞüĠDçFĜMĠ­Œzù{GQQOEL”3_‚Ì|ĊŽlmœËóü–VĠĠİ:6U'€(P§[âŒ1V›MşŸĤé/™¸O^™S]’Ħn%—„NŒdJ˘f)¤µ •“ƒ£Ú÷0`Dtv’ÎMòÌlR…t€D—˘ÍÎĊò·µ­îF£ħµŬn7Ÿ[!{û´Q[O”ŞkµZVHm p—çySŻüĠ˙ŝ¸ħµñÛkË`1ƒä’ ¨´ÑŠŞƒx$VÂìÄ M×ĦêÖF²ÖIâ; ž‘Ï!żĝaEĠéĜù8ŽWVAĠġ£ċä Ġ!=JFu—ĤiÇñ˘QŬí^ĝŸgË ‹Jŭ! íHâ&FĉÍu€熲]ƒ³RŸ;ÑuÉPŬ%9:òĵ˘îô7‘Œ³`xŻmGŽĵ­g“vFQ´ħÙlFÖVȖ$KĠKĠ‘ ĵF£ĥZ­Fc§çyûwĵôòɝoŝéžOŻ.cŝ^ĤnXàSO{ŸÑîûd&2Qä ²XiO<Ġİ;¨ ĊĊß`Kywa[HĴÀĤiš”eÉVAĠ ! x> ˜™Q✗yžišĈI’(ê.KnN~sàRĤÀˆ‰ƒ‘y›q—&Qš×ëgJŸÎ…£Á]‡ÀóhçÈ 3ĈYZ \\o•nëh{ĈöVеĦĠj#l…†ÊÂíÀĴ$[/U×jµÚĈĞ.h4½ö‹_żqánA‰‚AĤ%$p Tèžc2Ždmր‘¨n~†Şcbí`ÔùE²Š<°™³·żdG·*U]/UWsòEĠL£:§AÔ]×÷3a~:ò|>˲ÙhċÒ·ğ0ŭ€° ÔĦê<ÉqŬ[ĴŒÌĞ•ÒQލ‚ñ‰˘Ĥnë Bd§KrH'ÌOeXBBp†,N!½ŝ²c+Ôh467›ÍÖ[!‚§ÙVÈŞ- Ùz2T]EQĠA ¨ş˙ŬáöèÓ[1Êe-d` P|—ÂTYÙċäÍ  蛞ĦêĚi:ġ;Ş8 ê{€ïB¤s(ŻžĈ‘ä:XqmTŬ°Höı-ĤAöB•­P–e‰ĥšËó|z˙Òżœġ}”à™˜Ġ˙LRN ŒÌ^ÏMRŞıŽ*²r×˙`ĉ<Éd&y…ëèŬ‡ŠB+K¸˜sŜÜ@öżéûŝF£ñìÛ YQƒ$[êúÒvZU×h6›Ĉß÷÷o;tüäühïoŻ/ŝ"+& 9”q*%p):3GèuJinxuŞNğNŻŒˆ#WŸqĝR–(.~ˆMùìâĥœÓTŬ]íU·ŞN "ÙgŻ<èüi¨óçœgY–§iZ…ùñléúĦüÓ+ ²óĦ}èğu‚ ƒütäyWˆ_=îÜÄË÷DžS30먍 tê/$ÊHÓ Ï!Ê·_qĵĈĦ öšÈó(ŠüĥBÀSl+d$ HĥÖNĠa ŞÎñ}ߍ˘Èo·Û­:Uwò˙ġKKòġ2)Ĥn^.ĠT#YëŽjÖ@uYħ Ŝ[+™Ż$TNŜlöäí/ĝħ­Ħ£9}cOŠ˘èGĠ‰UPuŭ:! y{ŭċ(êê’cešĤ™8ÜÏó|fòW_o÷Ï@)霙ġeŒÌĞĉlOô¤Ìʚ3¸DwFEuİÄ,…W ÌîCr†‚K”ÁĈµòĠj‘ç›[­Ö [ĦQ³ö É’­g”ŞëJ´U§eı[ŒWŬË˙ë/X´w5O_[V°„äDĞÈ)…ĴĥÍôż0*.ÙĦéÖ Fú9ĦÊĞTEKˆü>Ê+\+è½ù••••,ËRÎù°‰QTtBÀj˜o`gVs7a~syžOZùçsK8Pv<—1´[Ħ.ç²”´.n¨!„*ÇĦÚVˆtßf+‡à&}{OJwĵŞİğ*òüÙ³²xhÉÖc§ê˘(jGQ´Ŭ÷ŭŭ[§Žĵĥ÷ŭżÜ˙Ûk˸7Ÿvrޏ*H jħĉÌAtĉŽU§ÍS{MCÇ#èĈ@†I9Ê+bc:³¸£Aż0T]Ç 5ގau. Ru^gû +´#xÇqÇ<żzŸı™DôĜ ‘GÁk#u–¤íœx‡ĥ\ŭ{#A—ġaYĦ/"Ġ½9şKRĥB•v $cˆa"ßożİöjG虳²gHl­ı;›Ş‹˘h›ïû{ŭ0<ôú/˙ۛîäËëK‡HÔY†ëÔÀˆèP§ê8Jħv0Şf•(*‹ òĥĤêĥ5ìêʲ,jTŬ8ŬÑ U]? ÂP&nèu§ğ¤RGž/šÈó­Ë8·Á‰W$Kğúg4ŠĥúŸL ŒŞ.ÉPwÂÌ)‰Îl— \ô\PıIz6É7³Išĥgœƒ–ĵ—ZÓâÄû:òÜPwĜ YêÎ’­g°;—Ş#ëÒ(ŠüVĞ5Íaîñ}êĝ~ŝ~ÑŜĠ:}eQ‰r#ıRĦ{ž£¨CĠI}àŬħAċWǸDÉċši:•^J =G¤.x6‡ò҇8ܒ7/.k{ ù••••4M3ĈĝçFƒD ŭĦQ׀YÍ í#?çœi[Ħ$I’‡I’ÜÍóüöKÙż|ċ Á+EÛ¤ÀUjlÇĝĥrn5ÚNŠîù$ûar“\Ş(%ż(JÁ‘皎ÀUöÖTál~ÙDž7›ÍöĥBôİĦîĴıŞ$[#ğ£ĠRu4 şŞnğïû{·ì?üÊŝ~|à³[1î>Ì!r%ñ–„ p UuX #–˘Ç•Ħ&bB Œ´Œ\şúWsH‡£ĵô6ĉ³K;"úE–e3qߍx1Ë2+Á0^ĜŜ¸T]Fŭžcüs‘qŒħ2Ïó,Žċ$IĉÓ4q’™Kûċù”™&›½$d"`dÊDžWj;3—$Ô9z†eЁY˘fu˜_Ġ%Ş-…Ôϛĉ^c‹{1;el…vEQ´í™²▲³€dkâT]£ÑZ­VÓxĠyžwèÔ/˙ëÛW zîÚDÊ KežêrżF´>ġoÀȜEHĦÀHŒŻŒ ItúĞïÀiz(§ÏAŜ9Ǐn żÔħ³iš.¤i?NŞ€½m²B^Eİc*uäùŬ˧Ï4ŭ< ˘†eÙLŒÌĉ‚‹N—+¤²Á+SW›ş(Í ĠĥBÚ\rT>RœA( Ì;Żl—Ŝö}˙€ÎMzvl…l‡dÉÖĦê˘(ÚÁnß÷œĝ‹_|À7ìk|u yĴΌdΨi|Oßl(‘ġ›rEġTT—(µ“÷Zi:HèülíWçˆċğ(Ż|ŒCM~‹*ŞnFÀ.÷ĦêĤ¨ş~`Ô§†Qwb(="r0ĥB:7éašĤsEžNż”ôĦR”*‡ˆNìù„ÀÈ<ç˘6Ÿ$E§KާËJfçTċ&9žgÂeċö Gš—húó7ÁŽĝż×¨îž [!Û!Y@²ġ8¨şv£ÑĜÁŜÍ{ĥ˙2ġÙ­ÌÍgı€”• é8y×îb²şQu¤Lt‚àÖF€ÑJ× (}Œvr{ygDÏês£ğq/$Iҏޓ êFÑ.ip{nl…Œ#x–e3azŭÂ\ğYŞlÇé€Â„À¨şċj0âFĜ`D*²Ŝ‹9]5—¤ÍW([!=0Ûùfꓳ´€ wù³Sïù ‚ŬÍfssEÍgÚVȖ$KĠìŽşĵêtwd¨ş=žç<ù‹_ż}ġ£_܊!R KsWŠn0ŞŬüŞÁItÒ_™ñŞë#èîÈĦĠÎğœùâöüĝöĈ—yžO§ijTuqY–eU7Ĵ;’XğŞn(3—4ÎYRċ^SŬŬÍóüöŝĝž Y¨Ès‚šŞdb`d>ĤSÁ+[!=(+EWÒl=öœš.É\S› à\Í&1³òäöì{Ŭ÷ŭ}aîhµZ0ìg+DÔĜ ÙÛ§ŭ‹Ú—Ş£ƒŻ€Tm p—ïûSÇŝíO?ÀÖİö'חQ$Ê4U–j+ì볇}˙ëœhw¨:EיΈ‰u‚‘C)A= 'ò ċ"ŠËá`“M;˘ĵœĤé8ŽïÇqĵœçyÎ+ûѰs£IRuĞîÄ]’™M*unҊvŸ)óäĉ‘â‹ RwJè2mš ™Ès%—5aƒĴ•†í‚p˘”—”%× ³]×ƒàœ#ŽS4|—½ñZŬVH ôÚ Q<ĥBĥ, YŞnL7ï0 MĴDċU·iρ—ŝÉOŭîú fïe+ZÈÀ8‡Â£ŽC”´ê€ş~ĤP§é˜ŜIŻ Œñ¨:!ċĠÑZıµ²ğéœÑn ÷tאEQ|TŬİ;`´ÈĦKˆÑëžĤéL+½ôÍN˙îTÍ%Q§rŸ™çL7wÜ-[IżëÀdĵÔÌ&Qĝ.İ} ZİïʒĦô÷7ċ/àyŜ~k+dÉÖóMĠCĠ…aèiyíVCĠúù}çÊFż˜Ž•Äğ䐌Î9Òn 0ŞSuų́žuÄ×FĠŻ nˆÄwPŜŭüĉçâĝŽĈWyžßβlVôO‚Şz¨ş1¨;ŒÁQf`քù-¤i:—eٝİä_ÎSBä§ŒêÉdÀÈ|DċIh(ĵšĵ_>âàm+TK—ê,ÉĦ:ò\ •›$ŠI’g€Ş[+u'úPw]ôq_YYY‰ĝa–e³4żeÊùvšĦĊ˘ëĵ^0ިŞZ,E—ם¨“TŬSŭĞÙ$=0ë›Ü¤Jĥ. ËI’À ĥ¸ß%'àşî v5­ÍfsÔl$m…ìє$Û ¤êè ŞÎó<×Puaî‚`˙†{NúӟŝüĈ Ĥg äS8TuFŽÔB†:UW³“µ8rğ*0Òż İŬ(IàB%ÊkŸ Zïi;g³,ğÇñ½ PuòqRuФîĈuïz.„àeY2yİğÛ;“ߝŬdħ,ÇítH„L ŒÌs3dÉe'Xƒ‘ĴͨAǓP(Ÿ;#÷\Úù İ~VÎ9ç¸O^ŬrOzÛ÷ŭŭFcGĞĠÚ0ÀVh˜›Ġŝq­Sƒ$KĠ­šŞk6›Ĉhk†{<ϛ:ġ‹|g:Ĥî-Cä ²P ĴŽ”(G%œ.0êÄJ˜°½I­Ş[#İožj¸Ói¸`.€Ŭĝ½8ħ½ñu‘ç7Ó4M’äA’$+5ŞNĴ‚ŞĞ?ĴTŬİ;‰ŝ3Uœs^–eYdYëÙ¤ı<Ïo-ŝùkêR)EĦΑ¨S+M ŒÌµm+íâH#‡ìBIT˜!]cqÉu"-Aš¤ˆŠ ñİ҉Žè0żíĈVˆRêàûĥ²Œ$KĠ­ŸŞ;ô½çí9ħùˋÈsV™§‚ unä¨ {JëĴ„è¸xóUDžVĠ­Ĥ3`ä8ʉÁ% Ħ§İşq Ìg U—$Éŭ>TŬ¨¨_‡ô¤İşĠRwĞqgµÙù,Ëî¸éKœK³D–jx™Ô†Q)™W)…eOÁ;âm %Ŝê×" :_‘TĉĞĞԀÒ88 @–ŭŝôµ÷LnR³ÙÜEQ³Ġjù}ÌWŸĴ­5Wµ€dİşĠQuQz–c§ïûûÚÛv?òç{ä̝·î+Êb>UŞşŽ“wŞúĈ£½ÌêbÁċêÀHT˘ #.P^;ĈÒµdoÛ=“eÙtÇ÷â8EĠ€}˘TŬ¨ğqÁYQf6İ óۛ~r& x*P(˘ÔΔ&Fĉ)ŻÙ ݸŠŽ)Ğ”²ÊÉê\Óèœ%iPrRQvŠäàĴ„G8fĝÉ‹rħÚÙjµ6Öf“Ĉí’Xş$[,Uחş{„Şk4^ğŬn5›ÍmAìò}êÔ/~ŭît⸟]Z„4ħ\‚À£Ħ{ŬTĦd*şNwFl=`(Eë€hè ĵ˙-Ê[/oo|SĊ­>T˙Ô×êĈ${Öâ^ŭÎuGp­ş›-òô֑ò7( ! ġݍz#Ï×FĤñ2r]àRÍ& ĉ×­v!YsžäÔm…hĠQĊ+1ÂÀ'ßĈ§^sĵ°žMÚÒjµÚCl…†RvC֗- HĥÖ@Ġ‘q¨şvğŬl6››‚ ĜéûŝÔÁw˙ìŬ`˙+[N_]@ĥRBJ%È%GàB zİ:9ĈEuvԙ]MW#ëb Ċ•1¨ş ÚĞn>I’úì(ƒxJİşI:‚wŭŜ:Ì/×ĥB÷³,ğċ×ŬŜĵ_Ež}İH>102Ġ F˘ë,IôˆôE,‰N̨Qw­]3B'â2”%CîNE×җß÷<MÚô½Û Ù3$ H–Ş[5U·=‚}­-ۏùÑż?úù\ż\BĤ \Ÿy”VNŜUw$ğ½êLgd\LĴÄŞ¤Ŭ01JÄ!€ëž ĝìĉ§Ż%{ÛΙ,Ën'Ir7I’…4MŞn=UTŬPš”#8B°<Ïs­şĞ¨ğĊÇg ÉRġD蝙”µ¨uÎ(µû{ƒCeèZu–D•ÀÁ1‘ç:~VoVʒ!t)ŻïMÉĥ—µ­vk+dÉÖÓGĠueıëŞ.Š˘­Aìñ}êäÏ˙áŬÙÂ÷>żµ™ HĤ¤şT íU×CĠÉîАŒ„c'ï5‘Îş–\‚úH›ż„òĈïċ‰máù²(nêĜ~T%É! ô´PuĞîĈ”„K)y–eıħJÓt–çK×_’Ÿ]@ˆéáV-v˜¨—ĈdW˜ü¤úĴn| ;'Jê< pI­K‚p“U †•,GhÑóñok[ĦŬ}l…†Qw×ӚAÉĈZ@²T]ß|£ Œ˘(òÛív3Š˘:VâÀÔ;úNtÔÖO,"^, ™PÊ:):Ê8U%À˘Jö4Żĉ,€kiŻ2tTKÓĠÀ.U$[Fqù7Ĝï§sÊïÒ4I’dU7e7¨3ú^¨ş5RwèL테­PšĤİv@ż—eÙÌĈüÛov…óÈHǃni&F•Ù‚ö5ĴÀ¨sŜ™MRNn’v7².:çIúĵQJY–àŒa‘mOGßÓÔŬ[!£3“&GŬÙĉÊ’êFSuQµ£(ÚÁŜ֖íǎŝèoŽqġv ”˘Ò¨ê4UR̓•ħ…Q4]GUDž\½´[Ö~!-!] ¸ċµß˘ħx-=°ÑûCžç&öa–eiQċó@ĠAŬrO’Ä8‚ßÍó|ú`ñŻç<×a9qjwûɀíŜQ óĞğ7˜NµĜóÚ}]yŬ.U]%€ê‹säYĤGp9yŭw6Ğ;‚?ĥBv0Ö’êFRuÍfsK•û³żoŽ…ŝïŻ,A2 Q€qP íU5K*Ü>uż:!%8S"ĥ02˙ÄĦÊĞná2ĜÍÏäñíÁù"ÏğTuY–eµĜ~T|Fİş~ÔŬjÁ%†8‚Ea¨ğù4MgQ,\{É9sRE=ÇĠÑtb`dŝŭ+aCe²Ş]ŒùŞ™MŞwI„€R%lq´×ïQ­Ê¤z˘D’çp‚Íî·Ë'ßġ<ïûµâ, YŞ/U×KĠxëßŽĤNmûäê⤄(dQB ‰ÀUR[רêjw™*ç¨2Oí>#ŸĤuŻúŸKA|Ä%ċ Ê+a_Î…„_HÓtF'À.ġ$Àš9âÏU· ên”#xżżC%p(Š˘H’$ĠŞğ{Y–ŬŜ–ñċÖ Y’<ÑW’£çżèÄÀ¨êêRċ{WËMŞèà*iI%gN˜ŸëR¸EĠNQG+A qO²ċ>?ĝÖ÷j+DííÓ’êúRu­VËPuۂ ĜÛho/ıÛ üB–euŞx TŬS!dX#u7j.İoT…qOT-Ĥiz/˲;ğŠÏĜĜàħı:ÇĦşÚ¤ €‘y3˘6›¤;&˜ñ"Ñ}^WŬ)ê^Ù k!V€¸ÍNî\ğ^× ´³ÙlnzbĥBöÉ’êêZ­Ö£Ş‹6l:úò_ŭ§—ÏŬŽqñú2D\€hФ‹ŞÓkğÈ6韜w,‚˜VÖ­ ŒHww$ub((‚òêiĝ —³½Ï³,ğe`5U—kŞn”ûÂ3MĠMˆş4,ÛċžĤéJÇÒ4-‹ìÖQù›o‰ëH"K.4™s˘Ş;❄a)yEáU);MGeŞ)pÚ7vVIœ äüòİ“ìc+ÔKŬY[! Hĥž$UwòßŭêƒyŜ ~wm²ä #˜>5Ş:µèĞĊÚ.ĥĉÊ Tub`ÏQžužŝ*Êż—Ç·ߕE~+MÓıTŬ¨™£a1äÏU7äÖ>œ†ĈŸ÷:‚§iz'(n_˜òŻÎIY޸x×ë|‹ş;ĝ:À¨ž›Ä9ş X{ƒĴ ΢–Ĵ÷.TGžğĠÀ,ÁğTžež#!£+ɉ<ÏÛßc+ä?^[!{†déĊ¤êÈŞn§ïûû÷öÎ[Oĵ·“ëËX\ÈTà^Ĉ úƒjqÁÂZ˜šFMeœ*DwÙ¸4ı_èÁWH ê€ĉ(Ż|„ŬîòŭˆòouèŜŭ8Ž—³,›”ŞN>+TŬ]ÒZm…Şż•QŬ™0ż4MïgYv{_ùÉÙÈ癔úhêèù$9102oï€ï>OŞgÑevG u›¤Ż]j:zD޲dhx7²SûRl{Ċ÷ŭ=f6İÑh˜Ù¤Çd+d›( HÏIŭÓ?ŭÓ(ŞnùQEĠéE·MSuG^ŝë˙üê—3).Ŝ^ ‘1€RĝDŸ ‡öEVÙ5Y73žu\Œ4¨^(IġÀsŸ˘ĵñ;x/ĉ‡6ûŸçynĵêfY–”eùBRucnż‡ÑXŽàÚV(6V¤7Òß^"à²è°aBLŒÓqóJè`Γ¸¨ ê~wFà@:ıIġÈsÁġE&ĠlRZÀ 7óKŻċy^şë×%ĠğaĴÄhêÎ&ĈZ@zÎÀhUG†Qu­VĞÙl67›ĜWòŸ>˜í෗ 2ÀH„qežŞÁHáQwĴ„Ġr`d"J I(œ†Oƒ]=-mñ.”E~3I’ŜX†ŝnÖ ž Şn•ĥB²“qϲ,K’dYSw3­âòù=áÜ âêF‚NÊìÀH#ˆŜ ĉu‡.^Q7Ôϓ¨‰tR鲕­Y&ŒA°qttöÒğ½ĥB5Pĉ’żz[!gé9¤êF‚PŞ.Ô °;}ßßżûĠ·ßÜrâŭŸ^[ÄâR0Ħ¤Ü\"pUèžÚ#˜ŬiŭÌH[ż0}XMgœšİùĦ)$KP\úWìt–ï·q^'ÀŜĞSu}B÷Öĵ÷LQucPwÀÚl…şfġlRĴUwÊVˆ˙ĉĴïÓRò &ë|Ò`dXÀ:UFĴRT]şQyvuIÒĜ Ġg“LwÄM[‡ÏˆÇ¤êĈĦ힪ßm_Ž îz_ï èœsËÚ|ŽçË׏9Ÿ]P‘ç’hw„şs`T½Ĥ­§*ŞNˆĠÎ2̀6¤„$ŬԝëR^Í]B”•µPšd á÷üâ+ïzž7[›­qì ÍÒ EĠU`d¨:-dĜ†ánÏóĤNŝġŻ~¸@ZÁ§W–Àsb%J Şó´Z‰ê…mĴ˙ë{qġrÍ`d^W)Ï›ż‚òÚ§òĝ6˙Ó°ÚÉ;ĥTŬĨğQŽàU—¤Á³ZnÒÌĤòü×;˘…Á3êTT˜ò”˘#óĦuµ]ĉ'ĤÔğ$µiŞ-Ŭ%)ƒëèa^8!g ˜eŻn½WxËóĵ}ĈV(Š˘FÏlÒúm…ì’¤ŒŞ£C¨ş}ğNĵŝĈ֓ĵóÓëËX\)€œi*Nİê|—‚:Œ@@ôÖSš5ÙÙħr.;TŬj†^ë S˙ÄĦ*n‡'(Ż}ŒtiċóišÖİş´U×ωá…ĦêÖ@Ŭ“0Ûk+ÄʲÌġÀìB’$syžOż„Îı.áırp€Ŝ­ôŜt×FşéQ›ÑÓtr“jRÚeH 7U”À!TSw•hŭ‘Ä "ŸàğċS'à6ĝż/ m­VĞŬjµ‚>ıIk·²gH^pŞnCEŞî§˙pò뙔|{c(„3ž” ‡('o˘Íäd]U'ŞNh0Bmv\0"zGóÄQS·$ôÀgÏÀ½Ħ8´98“çù´ž9ŞSu£dŬ/2U7Šş0äÎÑqÏâ8^I’äA–e³È\=~sC8ŝ£½Á:ÁÈĵÁtEIvr“D ˜zT'7 j`ÖwzöEꊂığ‚KË'Ŝ׳Iğ˘(ÚÔl6{#Ï×g+dǐ, ½àTŬĉ0 wğ{Ġżú?\r66N_^×`Ħ`ë^u5'ïÊĊ[*çüîŒ#ħv0ô qPÏ_ıâÚoqlĞw‘—•WŬ8ŽëŞşµ ž[ŞnÔŬ¨ı$>ˆÓ]Rif“LäùvöÜĉ0Y‘²ĉĞT[ MŒLUĉĞ˘nÂe-?İşÚ¤QŬɚםĥ2`¤˙ Œ1x”Vvrç²ĜuR;‚ïŠ˘hc³Ùl<[![žŞ‹ë§ŞÛuüÔëÛOŝÉîOŻ-ci……˜€Cáş:–Ş…\Ŭ+ŒO]י‘ĤêÄiş.ƒHâòGĜIĉÛ.˙ĈPuI’,öĦê†Ŭ@ǝ;z¨ş Rwrߗsδ­P’$É$Iîĉy~û(ùèk‡Hžë˜sYŜO ŒÔċSëŽjgJ²FáġÌ˂h#`JI%ĵšD]ŞaYH$)ùfñÔëLA°;Š˘ÉÚ Y•¤€ŞĞïwQuAì ˘ĉáWŝúïOż—‘ó7—!’˘PĈİĠP–+•ŞN˘I F˘ĉÀÌ8ôÌQ?0@KԍÇ%`  ]Ç›9 çŜy£ŞĞ¨ş$IúQutH/2U·Zênl)8cŒċyžĊq\Í&yĊÌİòŒ$\E?POÙġPÚ}ğXuÙ @pQ…ú™c+CáUÊ;ŭI„tr“êa~oĴQ‚1z(şşrìÏóöA°ğÑhll6›½‘çk´²Í’¤ˆŞkµZĉ½+UŬ+?ŝ𸛧/.‚g"W9GDx…G B÷ˆìD’믠çŽä0ÁÈ(ħ 1‰ï@,ŬD~ġÛâ]ĉe~]Su,U÷Äİğ‘ħçÚV¨Ô1‹išŜͲìÎ>ñٙvÈRÉu']Ż[à0 Œ0UŸÍkj;>è Iv/˜šĞ먈Š*+O@2@J”EÈ¸şrrŠ-ŻA°7Š˘í:ÌŻáyž3ŒFSwVÔ`éĦêH^£Ñ[­ÖĈF£ħÓ÷ŭŭ;ŽvrǛĥçÓëKXX* Ó`ÊÉÛ ÀR*µŞ•=—€Îˆ Ĉ”¨aĠ`d>ÎQ”qâ;ÏQ\˙;ÁFO~eİşÇÚ% ˘îFg'Ġs“Ê<Ï ›ô0MÓÙ"O§Ñż%‘Rd꒔ŭn}ÀHŽFWùޏĦ']ĥ>8ۍJy§½î:³IGpH‰$IámzŝáĞoyž7U· p]ĥBâ?³-’¤‡ŞkµZ•W†_ŭÉyğٜœżƒ§%À%$ÔàĞïP¸„Àİ[A;y0âµXŽJȰj0İl‰KA4PŜ9:÷Mydkx&˲ۖŞ{b]Ò8à40ŝĵÇVè~–e3 vóÂĈ­{RêÎÈĠ:€êÚX?™7qÁM<ï¸Î‹}W˙Rè Ë:žÀsiçúĠƒM’sHQà<ñvv¸ËVh† Ñl…,WgéĊ˘ê˘(òŞ.‚]žçM½ò—÷Gi´=úôÚ2X̔“wÉ!ŞŒ#‡voïŒ˘NYĥ(ʊ•àë#ó’Ä£ ”‚-ŬBqġ4Žmġ.iŞn&IKĠ=>PZŻ#xġïPwO’dÑá“3 Dêò$fŒL ŒêĴUn’G]ĉНëÙ0Ĉ„HP30뒚­ŞaY‚ĵ`hß-œ|I8í.[Ħ0 ƒUÚ um4ûĴu[žIŞïEŻUuf³ıĦÑhì}˙ĥƒÇOî|ûÏ÷ŝöê2îßM!KpEeĝDż:ÔduĤŬıĴî™áWĤÀHı6ššŞ#Ş;u †òêGĜA<ĜäËŻ³,ğ­`ëTŬ('†q¨:ĵàTŬjİ;Ñ’p3›TÖr“T˜_žÜ<|vQ€ˆBİí(Ñr“#@cZŭ)şİeQ ŽĴÏ,u|}‰>O˘Ŭž<'žĴ@š¤ ÁV÷üÂĞïÔm…Z­Öşm…,(M\û'x"TĈ êß÷Ŭ(ŠüvğŬ2T]hzíż~âŬ‚|5½Q”€d޽q\ŞI )AÔb04Š’fŒJíä½&02ğO!@<Äq€À›ŝ tî›ò=áÙ,+Żş$I’UÇGPur ŞNŽ#BJ){ĉadÏMÒĵnŝ–ĉúµkÏü[óÒPwq/ùßuŬö÷Ê7ğ#{fâ­[ˆCrŭmôbŬ`d^R‚I )‰z8T r¨Pİ”*Ç=ë­;§Î£´ŝg~D”@°Žïb6?mOyçÍÍŜùF£ħX–e\Ežç9gŒĠŻ;Z{)úü}QûÛ²Ò3EĠġ%ڏŞk·ÛÍF£ħĊ¨êNüè—?Ì;›Ÿ\ZK˜˘îı’: R¨ÄQuAP]PYJL d²zf0BmyšE¸K·P\ùÇĥ8W$+*Ş.I’¸(ŠqİşQçE/ 0" ”‚ĝ(ĝܗwÎñc;ç´Şn.I’‡qÇEQäœóF‘[ŞîéîĈu7³I‹išŜËóüÎ~òÙÙV)ınĤ*"bĠ`„'Ff-Ô²ÑóĵDR\X|í° í£Aìm4Û£(j7›Mk+déı êè ‹Ö ÀFŞ6…a¸Ë÷ŭİcöï>ÀĤí/- H•t•p I'0˘pċUçıù<ŠË)ގWôìüÊʊĦêxގ[Şî{í’Qw8‚WR?Gpe+ôñB ! -wĞ0żU‘|B`T½Ş—İà€(f%ˆ·Ċ;˙à•w´#¸µ²€ôÜSuÔPu:V˘òŞÛ´ûÀËS˙ĉ§‡~wk³ó…êŠrÉUĴÇF²ûf ġY\Cyŭclbs‹;"ú…öŞğÇñBŞcct–Şûŝş¤A]Ó PêÚL0ĈÊ<Ïó8Ž—´#ĝ&żùíŜĉì} Ĥi; cšÀÈtGÊ,V Qf ’c&?ħ}Ĝû†Ž<ßÑjµ6FQÔ;›4Lygİ; HßKG´ZގŞ. COÛm5TŬİŸŭúĞ9={µŞ3~uOŒH€¸Äu@üŜא3çĝħí/5Íéù”¤,ˢFĠÓYŞîɁ’Ñ!}–$„`yžçZu·˜$ɽ<ÏïrOŸ|Y€%êR'úñԂQg}È*šV ͕­7NJŬ°µ²€ô¨:ŒAĠm ‚`ŻçyS'ö?¸ıLܳחĠıS°BŸFr=`Dê_Jî9D‰|ĉ+`îKCĠM'I2—ĤéBšĤħêžIêcPwC)<ž$IŞÁïĉy>}Ô˙œïı RŸ'Ħ;Ĥâé#³Žjk†—H³Ħï“oîżzÊġ‚CZà°µÙlĥÂ0ô´­Pï|ÒXԝ% HOŠŞ4£PQu:vS†ğ<Ï;Òŭĝ}şíM_YDži‰wÎ+'FfÚÔ÷ Óy×>Ááĥ¸EU7£`—{¨şq$Ŝ–Ş{:¨ğĠĜ I q/ŠÂ8‚ϧi:‡rñڑĉ×7TLQĴRğƒ?`T/ÎŞs%.8–ċÁÖġċ£ïyžWÙ µÛíÈÚ Y@z¨::U†áŽ öoĜħçÄÁ?ŭùáϧcܛB(EuPçGŒútq(Hq%Êk£N/ïlÒ³úÜè ŬëĦêF ÁZŞîé¤îF9‚s 8èÙ¤TĞîîfYv{'ùòܖĈÒ$W–B&ÄMĊS F²v;”EÁÀċĊ“SÙ|ÜĜ 5›Íözm…,8Y@z\T†tI]TĥÚ†áÏóĤNŭìߙ^!î.B$%dÁ•WOŒFzÔu°ğ_CÌ}ÁOìŒÎċy>ĤéĴVĠĊeY–=TÒIKĠ=ÔŬ8ĥB½³ĵ(ŠžŝÊ%İêŒÑâı>0Â#ŭŠ`€(‘$ĵ ˘_ßġ×u§|ßßEÑÖ>ĥB½ÌÈjîĥ, M˜ZġĦê­Vk³€=pèŭ?ÏŬ}|óG"O8D!ÔÌѓ83F D{Ġ9É}×>ĈᖜvDy%MÓ;†ŞËóĈĦĥ¸ċÊòRšĤ3qߏx9˲^UŬZ¨:iİş§’à4Ž#xVsŸmˆ;Ĥ6ÜıІeĦw¤_#ñQŭƒôáĵ€†;ĊİíÊ=oĝż/ ­VĞŬl60 Ŭtí’, =VÚ™‡ïûNĞĠò›Íĉ†(ŠĥùżŻıyۉ#˙öo½µ‚[sİÊ7â’³>=Äc£j·J@)<Ò`×>A+^ÙŬvÎ虣ğ:V"Ġ °–Ş{>ğ$ı†.İŸ#xY óğ›eÙíŜo?|‘A–zġGiğ§Œz×A’äˆ|‚Żç_8Áá öèÙ¤fğŬöƒ p0|É‘¤Ç Lŭ ëÒf³éĥ”? Ŭ›zíŻ˙áŬ™Ìó>ğĵ‘1ˆœ)5ŭÁHeÙµÏÒğ6Rû–ƒ\ğ‰Ĵ~êGÀ ÄĦ€ç€„ĝ½ï nŸ'vD_iUŬœĥ†YÉó<_ĊĴêžŬi 9Ôe–e™ĤîĉÓ4-‹äĉËí?\"’I€ĞóRêÔnöf·ÔçAHÏġŜ³Üú|žìzû:ÀȀ§UäyQä(èŜàòâñ|ß߆áVеıĠj5šÍĤĞİ;`u‚ T]çymµZ^ğŬŽZ­VğÑhì<ïÀ·ŝÍ;İ“ÛN_ZDk0’Pĉİ\ŒV ì‚Ä€Ċ6@À`6%ZâMBĉ (Ż~ˆİfyەċE={?ICĠ­ÖÁRuÏN—4ŒşĈSŜĠİğRSwËišŜϲlfƒĵö͞ ĉ!Jút|îĈıäZ:#1òŻt‚µ  d`}ëñÉ=+|ğħÚĤš¤vE‘; ²@déħSżVœAà´Ûm_Ûm÷}okËöc/ŭùż?qöÚ.ß^ ĵKíÈ ë_A>úˆŜ÷Ġ˜, ­˜ş-Ç!€ÈXÜúĈ–˙çïĥç˙Ż{rqĈ'”¸’„"ġ'µµŜÙˑ*z˘èî·Uíi; U¤_˙KĵkßĞÀ‹)Û³ħuÉŝÙ$InĊq|/Ž,ËÒRmïzu½À4È4ĠRuÏu×ïòëGŬĠŻÇYH’Jş' !BJɄ)çÑJY–VVVî&Ir?އišĈZU7Ĵ;▪³Ô]ê}¨;0ĈP–%‰˜RJİ^+ċñ WŝowK{³8-BH ïCġ5°Úë~µ`ġĵgT×°yNĉuBPJ)!Ģâ^YfsY–-äy^EÁ9çöZ·€ôŭcLfYV¸›RJ…¤,˄RzŸ5ÑÑÚ£ êÀÔçġĦ ĥ¨³°¤”²Bœó¤,Ë8˲Ċ$I–“$‰µ“wѧ+ԍ­Şûċ/i/’盺úŸ)Ħ,˒Rš:ŽC¤”‚1–ċyäy^“RÚ ”úz³ĥŜkìßmĜ݁¨?˜ç @!L9çËEQ,ĉyœ$IÎŒ1a/ŸuìĝíĉµÏC_ôsó žçıFk·ÛAĦçy‘çy!€€â¤”Táô­ƒT ¨úúaĠvŭ~ĉG(³ž]žRr)%œçŒħ<Ïó4W[ğĵ,˲&d%ġ”ûu÷7ó7ö{†êŸŝéŸ9Ú÷½ök§ö²ëA)uƒ }ß÷ƒ }ßo¸PJ=BˆKq°èĴĥc’}ÖHï:=Ŭ‘èóà”R€B˜”²BäeYĤyž'yžgY–JTŽ›œlÛ!­{çĜKk ,K!dŒ1âyžp§p]×àB 9ġ.IJY LèĊÖLècÒ8ú€‘èĦ„îĞF!œ3Î9B!`4 á‘ĊnÁèı¸Ö‡Qw½çI}ÁB!ó<7´váşnV9„Z[ ´g8òú_ĊFs ŸĦĉt'$kÏı$óRŻ &äBˆR{=ò˘(8cÌ yl‡ôD:¤a|µŬá ŬⰏé÷5}˙QğÀ~;°~"„~ñƒ^Ö?nĴèGĠY@znğ$2 Kêwŭ{I'¸VÛ1Mj­Œ´q³’¤‰R?ڂŒħ‡=†e¨L †Ùż Ë7FÒRu/<(Ñ1iz @éI0Üá\b­U0 Ŭ–ö&l)ğ5R@żŻÑï˘ï ˆĦl[OF,°A?ì³S˜ê;Äúç#Tuĥ^êŝşñù½× ÑÀÔ B£i 4ÌQDĴ˜F ˆvÏvHĦCBŸEBÇÜ%’>ÔÜ Ŭà°îh5‹mÔÎo- mÔı‘ê^œ. C„è~­ şŽu°&aˆċjğacŻÛ!Y@†ÑvΔèZŒèŒ°Š]Ħ”†ı7Ë! ÔoqcÄÚzö—*6g£èìA²abžI§ŽŠÚµ‘ĥv­›a€dñÈRvk˘éFуÔGġ…ÔKĠ <ŞP'ÔkTĈĤÄxçIr J Ħ"ìŠz1İ;RğžQ£ïhŸ5KU‹‰!żAka-ìÁZǪ̈ÍÙXÒnğV, =ŽĊ(‡€B}ĦĠYŭóiŸĊ½(úa=;żŜ÷cY`zñ6gŭÖB?PêuĵĤèkÇŬ׏ éÇï‡!ż²nFuDLĥ, =– y(ġÛŭġ›cĕŻg8 <†ÑxĞ˘ìÎï…ܐ‘! DjÀCĦ1´”zi\Uyëx­ëf”òv­X@zœ‹qP—„ž…Y_@˙ĴÌIïGíĝäƒÀÈ.,ğz׃À£t4DÀˆ<Áßk†íċ8î&Ζ¤Ç²01˜DςGÎJÖħ €ñ¤àÀú@ÈRu/ĉġÚMÚ0$˜˜ô&íq­1d£İ:ğn, Ml’! ÔoÊ!ğżI(‰äv|,Ù”ú­~kbTG4iuŬ$×ΨÍŬ¸kǖ¤ÇBY S­fÑ­gáÉUÒ£@ Œl­”†žşX/( —Q,‚# HOdñaÌĜïâ^ëîĴ˘Ġ˜€µÑqŒl Û ĦÏş èvhDġ­ˆ&ıy{ëvŭŒ¸ÑÙĦĴ>B†]ô£Î}VóŝÇħgŜbµŬUÔÙu͎33´šġò¤:£qbµìÁĜkÈŜƒ- ­ĈY(,ÀqîIÒz‘#[нžŸĤµ1É5$×ĝGŜfïÁV HëY@ß÷OsħY ²µZPgÓö´zך7söÜ){†´ú‹’ ¸Àú)‘U\˜“öèšDeÈÖjŻ'2ĉµ3ÊAüûĜÄÉ |ĵ]GžÊĊGVq’ ]°rBg­InÜÖ{M‘'xMÊ ~Ĵ]G×Vž<Ĥ ûiÛÚ²µ–kêY]vY@zná8ğ?ğ(lÙġñdև]GOqYQƒ-[ĥlÙz*ŠÚ?-[ĥlÙ²€d˖-[ĥlY@²e˖-[lÙ²e˖- HĥlÙ²eË’-[ĥlÙ²eɖ-[ĥlY@²e˖-[ĥ, Ù²e˖- HĥlÙ²e˖$[ĥlÙ²eɖ-[ĥlÙ²€d˖-[ĥ, Ù²e˖-[lÙ²e˖$[ĥlÙ²eË’-[ĥlÙ²€d˖-[ĥlY@²e˖-[lÙ²e˖- HĥlÙ²eË’-[ĥlÙ²eɖ-[ĥlY@²e˖-[ĥ, Ù²e˖- HĥlÙ²e˖$[ĥlÙ²eɖ-[ĥlÙ²€d˖-[ĥ, Ù²e˖-[lÙ²e˖$[ĥlÙ²eë{˙äüDОƒÔIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Piano_256x256.png0000755000000000000000000011331412467662066020651 0ustar rootroot‰PNG  IHDR\r¨f IDATxœì½i]Gv&öeŜ{ß{µPU @€à H€d77µĤ5["HÍh$͌m%ÛRÈÖĜĦ˙°G…-Ïù‡iìñ84ĦħPŸÀccc7÷íÛ÷ÍżJ½Ož<ı÷/˙òß~͘BC)4êġlqqq AÛŻĉ×~í×ŝÍÖ­[?ĝĞäßK?f)Ïó={öĵ^İTê•J^éëĞWúúêR)O’Ô$Ib’45išš4ÍLšĤĤ\.7˙èŝèżü¤ĵ1j׃•ş÷‘G’Ĥ&Í2÷;³ßŬߟüɟüÊçÑöKÏ<óÌw²Ĵd²RÉd²û³żKċ²)ñ5û½T*›ßû½ßû>)ß'N<˘”²y”Ŭûċ²)•+Ĥ\İŸ%ú,WÌË?ü᳟”w­VĞT*óIššrϔ*Sôùż~Séë7ċ~÷ğÏTúúÍäĈM—Š˘(}:”[})½Ŭ¸éğßŭîóGŽ{œ-³5ÈI €²ɸŻJĦŬjeżù›żùğĈ˜?ü8$0==}÷‰'K³’CÚŜPÁĝ—LQà˙ĝŸŻ>ÍvŝûĤ˗/oHҔͳ‚‚é@0öŽMï÷ŜŭŸ”ï÷ż˙ŭ/ :Iğä%rî}ûÛßù:€ûqyç;ßy^Ż'I¤àNƒDôĊߛ›ŸßxèĦ/xá“ê˙˜ôíÀíL˙ïŸŝé3ÄlÌtò“ĝĊ żRE‘caaaâìÙ³~\ŜGŽy@imYò"eâ?ÀJ ĈœœC£+0cQ˜™™Ùô7kĠß<ħïŻ”aAûìdX9 3˜™™Y÷Iùž={v“1Ĉ""xWP. …ß~78vìĜncÌÇòêğïğ °  ÈsVRT† â•ğR ŝñĴĝħqjµÚcyž€1&Íó|°̤k333C÷?À6¤püç]˘aŭ Œ) µĈÒÒÒÏŬ¸q£d™Ë¨<ÏGdżúĞżúĵ,א!,>`hmŒA˙ÚS§Nŭϲ]Ú Úíöˆ P*PİTNŒŽŽŝZSSSżĦ”ÚE÷\=Ñn·G\4ĦôôÓOo”÷¨ĤÊĠ[İ£033³ŭÜısߋóòà÷˙÷wüà?@Q 8?{×°rñŸĥÎËĠꚗ_~ùĝ‰' RB²ŜJ)ĵ wŭúŻ˙şUE$Ĥ=ċ€o>:÷ÑÎ^xayŭúġ‰rJ/PÜD?w])…ÑÑ5ÖŻ_÷÷”R ];i•¤ pĉ̙röìÙše™ŒˆĦ+ĝÚ·żŭmh­Ŭt„£½2°Ì(˜˘€1÷Ŭwò•Ż<;77÷ĴË0 ǎ ó „ŸĊ'tŒÁ?kµÚ ƒX+Żı< ˜››+–——/œ?áŸíĜqŸ‹=D£JA‰R$ôıfÍL_‰­ÛTĞ×Kívû™,˄%7H³ŒÛÌ7?ĝƒ?„2ıUŝ˘Û u‚ÓgÎܳuÛĥ ÍRÙ<ûì> caaE‘‡•s2ïې œğ ½ó£ŝŝ>Ŭŭä’y‘caaΈÁϕœV½ çy˙™3gŝûŝ~”J%di†Rİlżg%dY†ĴTB–ö{–!Í2|ċ(½[nşħ5àğ…èZ>ĝàƒHÓI’ MS¤I‚„ŝÒZ'¸2=í­‡Ï mé·TJ…)09ıZ'2O­Ħ“:ѰAZi(­ĦĊ_˘œ?ŝŜÙÙٍrÉ]W|_Ñ;Ê^SZÛúi ¸kP RÉa0:<Šñmq¸yó&i'ë_ğü‰†[ïĵ€p1˘dL(Ô†Ŭ>8ÜĦ˘·ħsçNûÍ)jïJKeĴĵ+Ûîŭû!)Škdœ6¨VĞ˙I׆Ĵ˘´êÀôôôWĈÇǤ/Í,+Ĵm sß~ûmŝNA:s‹g­ jyc öîŬ넃 ;gƒıù9TĞUxZ0˘{Ô@2ĵwî¸c“ d Ü*(™Tü&rĈ‘jµ:”h@RDDηĉÊÓŜ­Tú˜ù ’sàO‡­˘ğíÚµÀĊ1”ݳĥȲ, Êĵr! ï9zŠsġ&ġb<ñÄLG˘)‘@éşw¤‚xçCȋ"Pxžt )ŝÂ˜ğšÍĉ^Ĵâ´êÀċ˗ŸV–Ċ¤‹Ħ°WfggqíÚġèjĝ>1ħż Z>üöho4Ξ9ÔQEZŞôää¤>`Ĥ$c €Ĝœ"sµZ-K’„Ŭ~Ħ0âo,|VÚûúúœ:*V Ò[+:}ġ*êe˘çm9c gıM¤TüPP8}ú´G%LGo—žxâI×fd+),)àô½Ŝhàƒ>`T@J˰ÂíL Ġjġğß]iU+cŒvíÚ³iš‚u3YR!H–WJáµW_e‘’0аĈĈ$I‚{îı‡-·7žž?a᯸.ó§úè£}ŒÄƒ¨£ƒŝŝ~¤‰™ġ2(™3Ĵ) 4›MȒ$„ḛ̂í?F×Ĵ‰ •Ê,F2ԍ7nĜêtñ™ÉÏß~×v‡ amÁÊI*R¨4Rqĝ#Ħ³ ˘˜O=ù7ı(r—‡È !j"„B×<ÈuġÍìD>ÜÂĴê8ÀŞUġz}€GUÔ9Ĉ†–V×Ŭíġ×ܐ˜ğàB8S,°€R6¨`ÏŜ=òE°Êq Tä]ğĉá7ĠAÄ d>Ú^`tt”KUg&öżdU½´ċE›7oŽĉy^&€žġd’mô;§Aš¤Ğ q‹ï €òl0{íš(OħâñBj°uÛV×^r)TG9Aîʏ&?~\ÜQïà•âO<îğ@ )`‰.dŬw‘yá…ŭBáşJÏ+€p€1ĉf³ùħSWjZµ àâĊ‹û&&&<WÊùò€´ĝ$I÷ïßÏŬ”BĞĉV2fáŜp×.°()p>ôäÔ)y!$Ί ‚=½n0ĤÀĝĝ8çä!?Ġ „ë>ZíŸ),PÍf³ƒœ"żHÇÙëÂ\“bJ÷! oWIYÌÍÍñkñP"ïtshJµ zˆ3Dğˆnç?:ßéÔ3uìmÛĥĦRİXzH€RĦB“艋·í|Í7ÂĝߓD„‡îĠjġş×le§UĞĤ§§÷ġġ÷GüàzE2›\ËDo½ùDÏŝ'Á~~Ġ½gŠ0£££ĦìÀ*³úİS§ìÄÎß~Jw"PZNȋ˘ÀÄÄ:8ÜDC_òBF-ò7oŜQJi/@Ĉ[b|žĴJ¸ŒŠtĞÄó !ßsùŽsssĴôT$Ĝގ  Ë2†çy* [V VŻcúêt‡Â–I+ûîğ;ÔFʗ·v˜Šê*úŝĉÍ9œ=w.D$ĝ²!¸IAĞ2°*@Q}‹‹‹?•$I` •dxxĤ˘ï ó ¸|ċJ`UCĦ֍}P˙ïûn~Ì@XO!=Ǐ €²ó–Ĉ |Ġv„ĦĤ ÄSĝ׆Żû8EVĞ–––†(w§bc„cˆÑéß? ìxz0Œ–ïÓ#ZĦV­!oç’:À+‹ħħ1  >2ôëkü68yäÈQ˜0Ë .Ĉ<ö…/8ZŒÑP’G^×IŠ_|Ñ×Ċ ~è&Áçéë|ĞĠځU–V¸rċÊ—×Ż_߯CÚ$5ğ¸ê:ëµ×_³Â)˜ÌßVh·[0ĈàÁŬğƒ‡ct'NžôL —iq 5yÄ$ ò™…{úӔżív #RÉÏs°šŞ£]lÙÙkRw ŭŭŭ·ĥvÌ)!§H:×ĈP”ŸÊµŠ.Ĥ˘’PÔü HñÁ pñ\Ŝr6ĉSO=ĊïÑp '·à¨Êy†/½ô²żırHӏ2Ĝ `µZmĠWĞxvppÈûÉ;Ġ°€ù‹öMñ0\ò*á9 21ÑŜ½{½k _ž8{ĉlÀ,2_°à*q ì ĥM›â•Àħ&£§…bR’ç9Š˘ÀâââˆDĥœQQ²#+Ò֓Β1 Y?RvWgúĵE9emÙ²Ċ­Úó‹vT@§˙Öv޵›ŭı"{ì œOž·£:Gy²"ġż?<ò!š­&(wVÚQğd ¨0ĊŞŒĴ:`ŒQ333û²RĈĤ˜ fB¸6)(ĵùÖ[îa²€$˜Up3ŭœ=ôCê󏓵ĵtiʖ&N‘À³h:żœò_ż~=_—™S´ž`@.‚Ŝl6Ñh4Êyž÷i&Bט—@ ‚ƒCƒž !Ôè‰ÈĤ´ĉġ7"1¸ëğì%7÷žëCyFËd:uúŒh 5NĥĊ`tdk×`•"ÑW{ŬہÌĵ1òÂà-Ç+€bŠ˙Ċ~ˆ[†ĵkµıĞNÌÍÍíÚ Ήş¨“çƒċê2ĤĤĤÙoNR(Ħ$(ŒAı\Ĉĉ͛YhOLS––—ħ¸¸äĝÒÖS *Èëtrr’…-†èdĤbƒ-‡Áš­Š˘@­Vë‚^DâdáÛR‚HŬv`*R\4 u´Ò˜žžŽžéD1Û·ÛXŠ]@RŸħ™ şlfffì”`8şE:›ÒCn½†) 1é(B{‚>RİêD…^ä2ˆ‡`d´DĈš÷ĉ›oú€Ï­ -}²°#ÈŜ½BéÀ3½`ˆ£GŽ€w˙D+°²˘| S‡xNÉeĊèž˘&Û´‚­ċ@£Ñ°û#Šıß*oJƒƒCAD9{1j‹òBEŠîúġëQnAċ££#HÓÔÍ×GWeĉ?Ú5Ii>|DôŻïx îż˙~·ĤÁĊ÷ÊŻ³—è}$Ĝż˙[x{;Ĉ)L FJëUċĴ*055ġ3ë7lRe$V‰Nö°RĦVŻüù 6“h),ŽŠ^ùE+ï‰öuZ ×İÓ§Ŭ4c%˜ CWhĴĝx.€Ë‰Ê• Z‰‹tùòċçúûú|pLh|v|½ùĉ›îÂIÉo%‰_QĤµĈŭ;Ĝg´Œ>.\ ²rJêa€ÁĜĝxıÉÂs2bŜ~g$ M‡–––†ş*W8ÑÇ[0³Jı,Ù:)Ñ0A½àŬë×op¸˘´p 6nÜS ”‚/ߒèìüùóᚠÂHÑ<òÈ#Žtyž EBÏi?Úyçwì˘ 5rM¤MM ò˘ĜğZ܀U£Œ1ċùùùŸJSżZNşrL=Ü(vü?ѝ֕ŜOBKšJ:11rE:ì”Á˘(Ĝ˙ġLá_âŒAġŠ"ÇF99&ĥʊÊô7|ÑżÖl6Q*•šCCCMbF–ACBŒ x!S,jIšB'Iw—É)‚`(•DKiÌ/ÌÂ.È!žîĜl×í ‹Šy£X1Ö \½êçxµaˆP0xêݧ9/šË!iGßߔê>üHܧl@ñ„=mQŬj™°jÀ•+WŝÖúġëi—[Ùé ŭĵiƒŭf™Áú˙ZXÈZ$Áñ2;‹zß}÷Ŭ ŭqY3Wgn·Yƒcˆ€‡ VPׯ_´WZ[úÍmfe€àwĞÙD³Ù,EQ’eó<‘ŸżàO-RjIb7*䈰˘V–—PĠŒ1_RÀĥmÛìoB²}¤`ȍ |;%ĝèÑ#`ÙSŬ£ĝve 1& "ìŸîJ@!IRĵ⋔@CRàŭònû Ŭ5¨ĠjĞb4`Ġ(€K—.=?<<Ìï­WÜyXİÑlĜĊĊìs’ċ”+Ch´Ûv6ĜC=ä™_pšôĤOž:i­fPk!.ÄU^ĝıÚ¸iSà"°ŻÎ(šVÔÑ#1\ĥ£ċrı–e_£g9Ï`iĞ"PÂrÙŻ 2F]ҝÒZ£0–––Dl&†KöÍȋvPW B˘}DH­ĵ˙ŝô°Ÿ´ċ´q¤ h‚FsLÇQ“ƒ8ñÀ"[öżˆ9L´ÛíGó<ż+<­ `ŒQ³³³?“•쎑ÑaQ :t(zoȔȓó/zä‘GğÂoaŻpüĝq^f,‡ĝ|¨+öô& ċäädTŒU‰PtF|cĈ*€VĞKœv¸q•`\WOX`|A^À„"ŠÄĊ3´Jpġê gĉû‰*dï.‡Šĵ€ ó–4”Ò8êĤÓ3&ĝô„yàğ)\ĵ!6ôĴî@6‹³gNcyyÙĥ™W…ÊSÏçİ“D-Ż‚‚ĞB,,,ìĜêaiĜI̖ w½ĊĜż?’$éXĦGğÉܤ(Ü€vƒ,ʚ4†˜cǎAéĵÑE`µ<â°wŭ\WSX&\ Óݐ‚™g˘Ŝq Ïs͇sPœÀ=,ŭ阙ËVèïšR‘:ÚKT’(\çAäB<ğyËWvAoí÷–ĜğM$¤PÀé3g;—ßa‚hN£!ôOúö@İŻĵòŠ'ƒ³ĝĦrtfÏÀM Zq€UĦ.^ĵĝܸœŭ'L E²CÌÎŝ?(·zsc½ˆ*Ôűu4GiaÍşÀ\g6%˜IyL a CeF`ppp>MS!Ĵĥ„~ğ@"?z++•x´hŜ­4O?wQ¸vŭzˆX@#ĝmŒÁĈvùsQ¸‘†ŭ*$ñ"&IЇô •Ž}·ŻżŬYEŜĥK%4RÊu˜ÌITV+ÌÏÏ£>òAQOÀ޲ċ܉ÂÔëġżƒœVĵ˜ššúéÉÉIíû?´hÒâŝ?ìĝâ+†ì H! ÛhƒS623ù²ÎúĝèÜG Ÿ5À1?1HıÛ Ô (2/ĦĴ˜Ú,ü˙HšÑjÙ AÒ4ġñ‚¸ÁóJu6`µĉêVİT„œ+ñŞ„ÓÏp.ƒÖ˜™™a‰ŭdv’Ħ”–;ŬyÎ÷ĵ"§ƒL8)mw тTP,^è&u@ïO….³$ÍâŝŭQBD  ob ZíöSyžoÄ M+^\ırċıŝĵ û•ıÜ[qFx oĵù&˙B˜Ĉ/DDÁ3‘1…Ŭ³N)ìŜ½;3Bҟ>vü¸_h$Ĵv§żì‡ŸhŞnQ¸Í@ğIZ{B!ô°‹Ĵ;044´˜ĤİŸ(Ŝóığ@VGŜ>Ñl@ï"EÖ_Éö‘bµ7oܸÉÏwş.ž&Ûĥm@g.„µÂħùŝÎS‚ì=q(<ŭôO¸şänh—ò•ÁRE|$ŝĞl^~ù‡œeMˆ s6OI’¨•ĵ_àŠVEQdsss_ÏR˙# w¸ `ŞBĞŬ‰'şIÁúÊYb ?s7k,Ilß=`nŸƒŸĝqüĝq7sŽòSa_ 'œöfQ䘘XçîGyiùD$=ŒşÛ…] TŻ×hŒhjÔö˜"9:–ʈV*hG4JB)\żq*ÌBÎÄ·‰6ɋxÁ­Hëê[ÁŻïp §IÛ:ž€—L“ûÇŒéT†ôÌábĞ^ˆ:iĊĈ`Eoş˘ÀôôôONLL Ûm³ ßĜH†´€÷ß{m÷:‚4Rğ‹òâĥ[6xÇw@'Z<§ĵŸ|rêäI·ŸHĊ (Êċ;ÊmìĝôäĈIáÛS;]À̈́Ȝ]şfŒURİI1€îн`ŝ­:  òEèĥĈ á,Ì/” }góĥnµÀıÏStúırM?%˜èJô‘.á=÷܃’›C’·ÛAĐëÍċyAĵ˘Ĵû!ÈÔè ġ  IDAT’Š˘@;ϟ^İnÀŠV—/_~ndd„ VĵsM§ßçïí?piš!ĥDa’ çkVÓî8s˙€Ĉƒ…lŻÀGçχZ_>ÔQZQû$M‚`ö@lC™èZìĵgĦ!B)áx@€‘;~“Ĝ5áÈ+jL‹‹‹â"q [·n`…Dˆ½PĦàûlIšáȑ#-WQk{î½×–e ·O`¨Ĝ hÄÁ·‹ê :+áĊ£8 Ñ$ĤÖ‰Z^^^‘ÁÀ­^½şŻT.³n÷Â(-}öɃ7ŜxîÎC¨ğç#ŝĦŻçǞíö`È 2 „µpċÊöée`2iĦH£ÙHßĤM›Üĵö8 D—bĞèÛOÏccEQhv”^>LŠ!€ô*<qtt”ï`ĝŻDĤÛÙnçXZ^ĉü­Àqu_ğv-Ò4µÛv™B6³#O8tĉ‡íŭ}*Ŝ”ÓżĝE"”E‚/üûĈż×EqżúÚë /FZáüb‡CŒA½ŜX‘+V,,,Üß?0p—V‘˙(,%\Ô\ú}ևÏí1R’ÁĦ::ŭĊŠÂ1Ĝ³gO0ùCNEŜ¸qŬžÇÇzH ż ÁT´–7eaĥ?şŭÇġ—Š˘@ğŬFRi;żO3ĝ-“RÜ’Ô+˙%†#qMñğׯ]gĊÉï³ çĴŞÖVÑì(ó+0ŭlÀPÚN ŽÛAkh‚˜Á“tf 1hµlxv))˜èŸ¤ġ•Ë—qíúġÀ˜XÎ c aeìGĞŬúRQë°ÂҊU/^Ü71>î­­>ò‘ctÛÁŝ­v;ä]ĝ>˜¤ĝ”{ËŻTJa×Î]üáĴt(Ç'Ož‚NY!„Ĵ:Â:¸—iĠÜääĈ Aän‹Ô"њŠÔëġAZ2M†×ĞBırċCÊÁ£ƒĦĦaàRJÀĝ}Àôìb;Zr²–R`yŒ^lÎÊÂíŻ¨•;À’lYgΞġtèH9n6}]ïh‰p´Wğ £VIİŒ—ĵďÉEH˘CÑs‰N’ċċċ·BpĊ*€+W<_³Ñ|8´@28fûPáÀK/ñĝ?1KÄ?Àw­yşèÚµka‡=|eË$,ġñÇ u"`2YJú*6°–Enב`Jä~va4¨rÁÄ<Ï1222Ż…ë%ˆ×áûĞàФMİT‚_ü"ŜrZË áá‰O:ÁììĴ+Q2]L–³™Ï(8oFĈ[Y@VJ³³3h4›ğ:ŝ˙5kÖĝ­Â‹ÜîäžU>sÎWşŽ´‰¨Nĵxàż')£Kz1Üç@µşòv Z‘  Ġj7›Í'‚ÙqÊ ż"Ħö·ĝ~Żżŝ:”Û" 2-=s°(AĞa·Ġş÷Ŝ{C˜í‚i@è6œ8~‰Ĝ¤Ä׆˜)´àÌàÚ8R*•ìI<ô63Ÿ·òw\½dœ °¸¸8˘] À’sФ‚€ ÙÀà@ÀÀÔ^zHÈ:èŞ;·§ÄÀс‡Ûí°BDd8uòd¨¨¤Ğcĵ˘|ÁŬ|żŬn2"ŠƒĥĴ0ݔŜ}—ÏŠ„ÈßHa— ÛŬ/ŒAğŬúɕĉĴHpá…g6lĜ,`´Œû)²2VPŠ˘À‘#GĜú²˙/Ŝ·–Êż/!ÍĜŭC\˜•]Ba]O>ċƒd=Ä`íUÀJÙ3ŭf Š] nšŠÊë"ÇÄlıSK‰˜ü<Û-“8OŒpçÊúşŒ´è7âûZcfvĥĞâbà„ÔŸwj-‰î*˘R :ÍxJp¤U!V4žxòIĤYĞцD˘%ÚĞâ>Óhԛ8zôhvŠt$â+7„¤Y²ĵĵü³Ŝ´"ÀK—žò‚ ²îPًçŽ=†fĞ%Ŝ$+ :YFpÊYQŜ`ï#àa0*È€ş|jê41e\9Eċ„ŒDL—çmŒGBî h „ÑóNñċy:Üò]<ĵ'é&&ÎkKßËnCß)TŠÛĤı]Ŝí:á½B V]aëÖ­|\iĉ?e#HH“$Á‡GŽJXúáÁáÊÀVӏ„ cÌ?b)yZ.ğiÁÄĥ_âIHA œb1êġúŠ Xq €g˙•2â;f|²ê”ŒĝIùċ—¤™ûċ;TÂU9¤e³tÙ­$ }á!(]mĥZvl)]$L¤\dbFĥS`ll ÄL<\&òòŻŜb$¸ùôyž£T*5­ ĊŭÊD‰ßbhÎòħÁċó_Ù[hû9{mĥk`N^3ĈĈíżà Œ’N)J'8á\ŠXÎÍá{ğvíıGyğ-ĥ#ó4‘‚Ï\ÜÓ:ÁÁW^/ÉwEuı‘˘íEF³ù•˘(Ĉ:x{ҊS333OOLLŒj!<Ħö~¸b^ ,˜ÁĞŻf÷ƒ Ğ„Ğ+;Xk´Z cPİT0ıa@Óւ­Y¤ .÷\@ÊE{ëİ2<.ͅ0Hï‹JĉnÎyeâ b.€Éó À*Ë Ħ’ĴכvĜ‘žce §Ĝëĥ €f³áà;‚6ħĞ(ë.…N3ĵúÊĞC‰˘MĈs›‘×áÜX¨µcŠSWŻ^}ŜA‰‹g kÄó½•}èĉh4šÂBĜnÖKùÄÏú…ğví˘ğK Guŝ ËĊIXĥ6n–ŬwÜ!SÁ§ĵîc!îšĝĦ4ÛmäyŽÁÁÁŞ‡Èžñâdż¨')‚4ËĵË!ÈÔO…m’îÚâÒ˘"µ‰J5À¤› m †‚çkÒ#]à§ċ2Ž|x$piH}¸k´U¸1ífPvŒ_‹y ˆúJĈ7”RH³^Ĝż_(šN”ĊeӈÑÀÎ×ĝêJqV”X\\ĵŻRİܝ¸•uĴÀjƒÀâXMĝáË?DïˆK ÄÎĥ’:QZƒĤˆ*Ü.2Ôwħ%ò59uꤝÀ*X0ˆ½˘ Ÿwŭ† NI…Yh1{š,Y0Zċĥĵĵ<”°-÷²ŸBĉÏÌêÊ˘Ċ@ !œ>Ü!üT–[†Ül6Qw§ĝfġMBì¤dËż/Ġ•÷˙#EïB ­O’fĝàá O#ˢ~SŠG ĠlDG”SËïtxË;oz§;ì§ò"#y2I³´VĞí H+Jœ?~ßşuëĵ‘é†×àÌ2^ä~|ġPŒL–ܐ‹N!†-Àh 0żCOv¤çΝsŝ/¸³cëeĞ˘Ċupt›6mä™x"óÚ¨.÷ä.­ĤE/kם—+€ü"j*KèD+@ıRö FûĥÑóì ċâéhâĈÎP+a-ŭÖäÊ!†­[·‡xJG–^úá$¤T^’$vê7™Ŭ[Eĉ]áIó.òĤĵßòǂ Ğ$ìÖ8ï[Ŭ#á7ú*}~K0÷bhñá„XĝĈšÚŞĦÓÔÍTr“HÈúŜwßs+ŬP £,›PœŭĦqöÜG>×ÙĠA[Ĝıӑ²@ğÑèlĝšPzkŒ`~)|*W)`ff†G·Ċ‰µúQ, _|œßm6ëÖ˙WÜJË{4™ ÚLktšâċƒCŠ*ù5R”R IÒRµZ}·9­pñâĊoLNNfrqŽĄğŽ#{HöŝiVò–B…–0Ò_×h9ÚáġQá8Òk˙Μ9#ÖDVÄd]uí:€ì˜P4Ŝ²‡RBòfMŒ°rNê´ÛíräóG_<ŽÑF–Ù‚ċzF%LCò½oL¤“×f݉w¨$ħ”Ù•w'Í(ü\| JzÛÈüİS§žáâ˘ÁJ)üÄOĝ-ÂZş£żwċĝaeha@ÊAá#Gíqpܝèy;>reèğZkVŒ¸téÒsƒ<-6Ásn/HVíw¤ŝ¨€œħ2ĥJcԝP˘ ê÷pâ‘ìC8´(¤i†#nŽ> š˘†ÍĈ ŸQv>€@ÔŜ`úž•+bZptÖ ~#İ^i–•kµÚO6ĤĦfffž_“TfÍm{Oö! ‡!­n€>:ċeÂĤÍY x!dëârÔZ£UŻħܵkWTğ.˜ gÏ:@Bb._ ùŭ^1ğèş‰Y{Èb…ӄ h·Û ż.M ×çĊ  Ré/áÏKË ñÇ~³ĥ§ _ğvM(oôĦ66lŽ@ıŭĝ¨žŭȈ½íNÍ…2,–}a?Ŝ³×5Û Ŭ¨´”ùjíßO24I’à7ß ûÛ(ç+”„˘%ÂĠ_ĵġŸ}Z àâĊ‹Ï­³ó"˙ĥĥԇR›2BT Żú ²RlÒ@ü£ ~èJB:¤h6ëPJadtÔrŞBTWb”>:…E/[z^Ä4”hˆ) &'7z!ŠÊìvŬ5Ŝ³û(0::Z“.€‘_((³5bÓ„O­Uo舔K‹)V(…7ç$áȸ•"aŬ²ĊĈäHU;TŜta´§ĦµĈ…‹=rä ›ˆ‡ ž ƒš:Œ!a„WàJΰtúċÒċ+¸~†ŻŽ A0oŠQwˆêĈ7Œ1äû~îiE(€éééçÊċ2kE&”‘\(޳sÔ|Ém˘ üħĥ P÷Òċˌ.iùv^€ĵO)”â%Ǜ6mâgƒ ĞIu öúöPJabbbž§³Ì{*2˜ï‚.Èw&òĤYf•°Ĵ?ѤJvÒk~~>Á…—A=É×ïrû° @5beŞ]ÜéÎ4ÚúTésğ‘7ı´ġ™}˙Ŝ{ïĦXäm7-˜êNĊû>×b×(É[iİ„ŭNĵcÂ,ü„H@)TkµÛĉÜvpá…g×;˙µ4ŭ&cH%`àİK˜_XšĦÀÖC ×ËyğĊıgïŜ n"bŻ+½ZİT:‡ĥ"!ñġ›˘P=Zt"ï-¨IeŬu—CyÛ+E´e)ÊÊ眕ÊvJ°@‡Jù˜€äĞ$ÑĜ~·€TZšx/dÂNš R'x˙ŭĝ8ùŽ’׈l˘'1h6?mŒèB Ï<Ŭvpùòċ}ŭAGJ‚!²J”"5zàAd #µüI$ ÑpG?'h6j\*!GÉ#rÀñcǎ{vC ža˘kÚÎ0ĈŽi›c"VĦ:„h}tiM §²,kġġġċZiöŬÙïfjŞ ‰6ü能X)W`P8ċ%éG¨FÍIÚğë m ­Î#Xî‹ĈÖ­VĈ&peÒ4d¨:z7„’ǏûÂB—ËkŻÉBuôAF˙ÙÑvċg"֛-?v<ìŻnúŽz@yĊk ¤YVĞ=sĞ7>Ët[@ğŬİĠj_²[P‡Á²ÚŝŠ4÷€òË/#MKCpˆNâ÷aᜂâ6kËì&˜´Vœž ’ĝ}â„ŬPI§z’—'ÉÀ‘ÒŠaîÄĝxTžê(+ĴGdùáA³ÙDğŬ֚V9AÂô@Îqĝ "ĝ}ì6gŒW-†´ üÉ‹âIҒŬ0%êÛĝğ°n 7'C"'‰$Äî•Ògϝë˘_B‰¤ö=éV@³^ƒ1EH_B!„˜bEïêPîÀŝĵ`SÀ•è+à?×I‰ ^”şm£·U\ĵxñë&'3Ò[ ¨€a훽ó„á:I+ÙGÜqÄ,Ŝ‚%hşé›7ofea;‡ĝ: (œ={*ŽY°µŞí·³Ö£Ŭĥ› ôóP‡ċCQó ¨ä­y³ÙDšĤmTûËJÔÍÏL‹ïûQ3˘Ûàà ġ´´›|î A5 ğ@ÊҳӁC…&Q ê´Nx.@Ŝn…0[ä-‰Kˆ…úIAaföêġ:U^c(˙Eyf`ğĊĞAŭ|İ”C¤n·F’fxċĠ׃Y“ÄĈ×[}ĝcËèr£ÑÜgŒñğ~Néĥ*€İİİ熇‡ŬŻ3‘Àû` &ÜĠĞWŻòÎ3A/¸niwżÀƒœ/ żN+R`Ĥ.]âeÀĴt\ž²L´vSŠ(o·Üf Â²ı’Id )n“§8 ”j—Jeûĵ–GşO,àÔJoɨı¤,HLŒ¤¸Ş*|ßûéöx1ÚÜ'ı7ïÁ\™·‰ûSkh­8(|V*ÔİSA¤b–ŭ811áf/ 4ë5ß*ìG*ŸĤ;q­qĉìYTkUŞÓí[˙Ŭ˜¤é@µZŭ>çtÛ€1&½víÚϔJe$GğùYSžħbĞ|à+(•Ë.GİݽUwœDö^ğĠâUy{öî :.™S>°ĵĵŒêr•ëĞ•b†eHÁŠÉŝ.ršèCä0QĊúJÌ.óÂĞ”Vt‡‚TJ rôóTAĉîŬ ?˘FFGm?ˆÉ0Ŝî* Ŭ0;*²À¤Tᑍ(öŽÍ›„s6ôĦìh‰ J•~|xĝ ­ÒçŽtm Y[fĉ-ïżĜ¨ĝë@VéÇkݽU9şŠ˘ğ""Îí ¸m `vvöñħħħħ+/"ŝWĜ$-ñ3S'ÄżŻuâ4M4`#M4ò g`;óÔéSîĊÊ2ˆ˜†Ċ+#šG066&5Ù°&§ÔıÁĤ Z000°LC[·²ŝ’Ĥŝu—J˜öê£wbïsĵrI‚Ğ33\žKв)vۖm[í햟 Ħ°İ ìħ*£4+Ù)Á&Ü#h'šdŒA£^cE)g;Ĉ =`‡ ÷ÓİAÎm"~d—ĵìáıuFYcŒ\†ù™§ÛĤ.^ĵ¸oíĜ˜èQrŭÍEB@:§U½ó´Û=ˆg܉uĝ!|Cp-IS4ŞKœ˙ŭ;vŒí âz÷ôİÓVÈ2¸ÊŬá0ıJı­ÇMÉËBá´ˆüï˘°3çĉĉ†éhpVŞÊżßaäMx/Ž-  ÙˈÑ#ċFÏĊgl5t’àĉ͛œ% ;ŭ†ï`ûŬb.€ĞL0ñH  Ÿ§)S§ÏZzáċ>£üŒ‰&5P´Û~úoĴìäŞÎèžÖ Ŝ>ôŽĞ¤qô›­ž'h¤Yi°VĞŭ>ÇtÛÀċ˗÷ġ‰£ż$C1s& 8×>wŭúuܸqCXzċßs‚(fb;‡\'‰Ġĝ°`__qĵ˙éëC>ù‘#"MKn…œetıчĤr„ŝ)×Ma7í>nì-ğôîGmÓ;4xddd!Ë2§ %ëy.?Ħ:ó’İ\.{ċ@ ıez×^²šC‚k×s~ÁŭÎÂŭ)Ay·…2…Ò‰-²CĵJı)ÁˆQ“_üdÚŜŭCßÈó6š:$Š‘N˘Kx…àʟ_XÄù‹bŽs“JHÔ˘>J)Ô>g7àĥ(€mRi'KKíxÇW LĴ€W_ħó˙}' kÁÉ[ ioh5íÀ};vĝŽ‘s5ıÎz8}ú44ï;(:58(‚Žâ;Ċ6ŬqG`¤ŽÇúéÀ’î"Ŭ³§--- ¤äžtE ~ÇpYÙÓá²^Ñ÷ ĵËÁ´ÛMÊ)à7PġzycLŸSş- à… Ï­[żäwúg Ê~ûA?÷ïߏ´TᛇŭYL‘·ìŒ½7B8ŒRTm™Bàı™ŠÊ.r>ĵN.@ld$ĵ”MKUPJĦżµŭL’ÌŝeŽ?aw ħnè‡hĠĦ”ŝ\Ï è²ç³Mív{ĝ/˙ò/ż”2Œö ¸‘eġƒùù9\ğ~CkĈ…•×è éÙĴTĈ tĠîŬğeUxRN 1˜žJS7…`‹2‚`˜ÜKŜEĊӔ7ĵXżž‰•ËDYûĝ¨½ñp4Hd  §ÏB%”¤sŜ·òÊCĉÓ1é*4<< +Wê„Ğ£]­M>Œ²›fÌ/ÌcíZħ Óvw}żaÌŬĵ S(÷t (ĈKÒ8DHĴ\ä8uúŒç)È˘MX.€'ÄÒàĵŬFšfèqd`ÈÛEmˆi¨ìĵ’÷Ŝ{=ö˜ u¨€é:+VGoÊĈM ʔR-|ĈésW—.]úİÉÉɒŝ"€@ĝaC‘`öÚk¨ô +÷q JÎB -°˙ŬgıoWΝ€R }ŭŭX71ÁHV7NJ)œ:u ċJ?*ŭP*aĞ΄Ӂ"x´Çm])ìz÷5kւƒ„í IDATƒ,ĵ5„J€_ż­´ ü0(•J­D버êrX1n2>ŸH!u§ ŻABû-:HĴ£ġŒ´‡È @ua³3³Xğf- “/“ŸPÀĉ-wâĜÑ£00ßÀeIENġ÷ïÁ+׀İİ“o‰ĥwnقJ_êµ S@' ÖnĜJ˘;QL@/ƒĦ5xġġ7XĦL:xŒëf뚤éšz½ŝUßgœ>wpá…}Q‡@hTûƒ/ĊÓ+Á+Żĵ‚ĦħuèrÁDǔöl@“ÄOauÏU†pô­—a÷¸[Ào*B|:}ú4†ÖŽcd|ƒƒÁö>•D0•î9¨Ĵ•´FİTÁİwß@żÛoÏsa ÑÙR (InU’l!€F£ÑŸĤİġXŒ” ċEÄşn€5kÖ@iñM[QîèVŭµ@ +…˘ÈíP`ԇlÁoxƒP46mżßÑQ(WR´ìÚx$€™‹§‘çıŸħHĴĝpċß˙ŭx÷G?r IÎğ£öĜ—< ç£àGŞŠ"ÇéŻĝ›ˆ”ıZħRrí5­ ĝñRĈŭï|çg6Ŭħı3êïñ' ‰,´5=ôè1Ĵß²Yİâ|ħ:IĦç&İ=$3ħ×q_' ÒĴ„ĥ ĈízA_hâ¨ħ×óç?ÂşÍÛħ~Ëv›ŸNœo˜tŝv~*×C'ÈÊeĵòç˙£££Ž#0PĦĜ‡]|òž <44´¨u2˘$wB˘‘ Ó֏I³uR½·?ĝ(†GD[ĵbġ OùS’”b…XîÀ›7;`÷­í  µĈÎǞDİ\fċİ F}ÎğvHLÒkvê#ÌÎÎbŭzZj.P“@$¸_|üIĵû£Ù{:Á£OÙÍ1ÁO%ĥ(ƒ²´PÚġf`§GŜéD|Äè.¸ĉùĵ0@½ŜĝÙÏ ĝ\Àììì×Ĵ]ğÎZh{Í[ğÉ@)3˜ı~O<ıiİlƒ5Y†4³š$µŸiš!M)H“"Íè3ÂÜLaGöî}$:Û!ŜşJK:33ƒ{~“[·#‰ówßSW~’$.ä•@šĝ×Ja|bĈmv) Şa—ż&2Ú4Ĉ3Ħ{/w'/--¤İ;YéêiKt4˘ħS„$F’ĤĜŭ…'0şv ·#Ñ:ÑH‡²œjíWZZÔ04<ˆĊûCĞgœ0[ŻínW&5~ìô÷WPŠ&ÙĥĜßŜ’ˆgîĈOÒKˆ÷š>àéŸĝŝĊ?˙ßíVï½L)ÉCÄ’šœŝâÓ¸vŭ:ĈÇÇŜ ”>=ÎUñ5³qĤtíçá| à… ûĈ֎ħsrŒożfàniii IyÛwíAšeÈJ%¤Y iš"ËJH3'üYêż§‰$Aİ”âäÑ÷XóïÙğ§KY&J˜<ż°ˆÇö~6mĥÛf§ŒÄĉo•€ĥċ%:QH´Bš($‰Lc &&ÖqG³öçò¨ W‹šI…1îˆĞ### I’ S䙆ĝXĝƒ`cÔVÄèCĦT*A' î½+Ĉ×ö!Ñ@b½hXL„PÉâ$FdĊ$^>Ôìpù| ’;€Â[·Ú_…Á][†0TVœ}Ê?9Œ%kż{×6Ìz5¸&'zùÑK“G}”]V£ŽMíËıĠL—χ÷<€ééiLŒO¸ĥşw|7sL€GE\Óu,//˙~œÀ•+WöŬ˙Àf Ӄî>z+İàú›X³në&7ZàĴżU)²4EâŜ×öO•2pöˆŠKӔgŸu‹HÒDŻ×MLLnÄĜÄ’4A–H/ô‰²Hû—’°h+(EËZċÉɍŬ $€¤‹DFהBž[ĊRŻ×ìšzzÎ[˙HßJ’ ú‡úŬD $QÈ/ü ĥ=R 5ĵ0Òu ”¨Ġë!m…‹uÜä† PJĦŬj ÑÌÑ_JQÀ*›Ü=+…^££›IVF³ĠîŒäİÔ§áá!ŒOL`vfË s¸Y/0ÔçiIû£Ê|¤‘@Ħ˸qĤżġ)Y~Ŝşœ h6÷cRTŸQúÜ@µZŬòÒK/íNSğX…Ì’ñf™0v˜¸y:Š˘Àk3Ȳ’ƒŬ%¤™…äÖê[W Í O¤I‚r%•Ğv×M›6!Mü°™0ğn”’è@³ÑÀôÔ4êu ġ“Y–A3Âä·Yñ§)Zh·Ú˜Ü8éÚBB) ¤;”ôœ³0­Vyžc`` µòĦxÈ_*K$„Ô ŻRAĞĠÄ{‡ŽalŬ„s÷ó+(è§EûÑÚËê”;ì#Š­92áíi’¤A£VĊÁƒbtl­}ŭ½2 üĤÉñcĵV â+> Šéá={ñï˙=Ô罂?¨FKʞhwx6Ĉ¸Í^ żġ*şs}€ó½S+Ğŭ‘8Ĝрl]£ÑĝI/vŻñß<}n àüùóÏm˜œQ[ϔ à–ÇÖN)e{pöÒGx{˙˙ǁ6M“6(—ĜÉ:ÑNSµN”Jeœ=ò.Œ1¸˙^ qŝ] ħğÜlÔñêwż…ŝĦQlä‰)ڗÁ²„#×~âŒġ/7mÚät ùè‚TvÀ ¨ŭZ->SOóÑêÄ|]Ìc0íhĴ T*£Ġhà/ŝŸ˙k¸ßä°X°ós1ĜÍ[¸1‹‡ï\Šž³†*Fßíïġ&qîÜ9|û_ŝ>ÊŭoˆqƒLàTÓ×§§Nœı!ĈX‡Ïó‰'Ÿ²  ş„oŭ_˙ R·TŬNZò&ßï¤dĴhċEëW.âù/ünG u˜ lÇFĈiÜ]­È Xŭ `jjjߝ[·Š>°_ä›ùË!óŻ[·7Ĥ§ŝÁï!\ˆM˙…şċ„ †[÷m÷ŒA•c-/’1}}|Ê÷‘ş5ö½pì›ë,­• ­äíŸo¸°v7˙_˜3İZnvĦ1F³@JÇ?Ê;V"„Â@?"oŭƒßó‡ PĊ‹k&&PÁnı½çWŝ!˙ö˜ĜŻVTÑÛrç8uê$żúۇA!˘’QÉÔlÖħöżĝ%ġX)Q•ŻĞžzÚÎl·š8öÖĜ ]¤ï$÷VŒ°‡áHlÔħùŽ;Ä=Ñwŭ·Á£ ^oüœ1ĉ}VnÀç˘ò<ü³?û³/Û'Á2<ŭW•cdŻ Ö­[‡V£†k—Ï{‹^<,ġ/T{yÔ] ™?6Šaíš5ĝàŭ÷=|†òïĉdğEžûiÀ¤(#óĞħ; D`ORÎĝCAúúúZZ'eĠIT~Ö8¤!á´§•ݧ1@ê.]¸~!Ë+Ä@ïvÛ·`dd$èĠË]'Ĉßşí.˜˘ÀÂÍk˘ Ŝ<„Ô :—Żc°éŽ;|û—RJ$… Üż~¤iŠ<Ïħ4?Ç÷üV_Ĥ#?µÙwċà ÖoĜ”ĝÒ>n˜~\sŝm$i:QŻ×ż€Î"˙TÓç˘.^ĵĝµÉÉÉ26IItkç€+aÉJgY†É1uñ˘H  ֑<FĜñΝ;#AçÚp]ĴW`;ûíÛñï~ŭ.“?NYtS‚c0>1dP%PFäy³ŒEǂUĞĠ{Ú0W†ëb ñ>‰GR Yİ­utlw(’a3ÌßÇĈĈ,3t÷ĥoż´3ĠŬˆNÛb2 gµÖĜz睞~Nù1ŜaöıYŠğĥߍS'OÀtÙĉ›hI ñ)­ñÔSOÁƒsçÎáĈµk€ c3·NqŸÈ!ĊŽĈ+b;…Z½ŝóĈ˜O]^?spéÒçúúYz” –fÉi!¤ö·ä˙á Ĥ]y6;sEQ`ŭ† X³v hf\€ú„"‘hD˘i·‚’Ĉ8…f³‰z½­5&''Až| d#;}ŻÜ:Öî eĤ\{è`Rİ”ÓÁ§ž>2o‹]Ät"ÒxK)Ğ“•ììvğF£Á~ˆFqŠÓp¤Ġ•ĵfc-išĤĜşġNÀK—P[^”‹LĈtŜ‘C¸u ߕe+ñe‡§§§1==†;X†·qëRng01TLħ+@蔐1@’¤ä|Şé3UĠjġÔC<ûOJµ £DĦKoİ;-%ċĦÑjĥpŝ£PÚ½CCLLÊĴ3Ê.! U/ô }Ŝ"Äú¨^Żaii }}}X;6ï‰Cġç'ĝ¸Ĉß~ĥ¸dĦ‚ö@’$†ç@ҕˆ&ÔZ |>ÏPI4ŭFİŠûÈR;;ÏsTĞUäıwLGçŠğT&Žê´Ö¸çŜ{ĜZËKK|ž`÷À}wĞKġëĉĞËïí~p7JqáÂyT——bSÖ5O7 sëğnê+ŞS’˘VĞŭŬÎÖŭÍÒgŞÎŸ?˙ì†ÉIžÌáôŝŝ9%0W̎Q–)šNŸĥÀ;v ÒW 1&J  T‡2€S>Bgu2­ÁòRËËËĈÈ0OFŬ<‰Çá;Š•‚ë :Ci÷›L2Á˘(Ry‚Aàŝr[:Ŭ—EYˢe;%ZJ³•JEQ Z­z@/ ?;¸†=:‘…Ž÷ÔSJcǎ€7n`aaEžw³ Ħ‹]cDÖ!ÏdıEaPéïÇöíÛÑn·qöìYÌÍŬ´§K‹<%YƒĴ•ŠÙ^PÓ+IcL‡â3jµÚßù´Ŭ€ÏTLMM=744̍dë °VŒ–§R<Öê:…à­ŒŞ./-áâĊ‹0Ĉ.+ͲF‚” 2'#Ë섅~2‘ ƒ za°°0‡z½ŽuëÖa``Z'˘ÜXÄÍ]´´Cä‡ÇùĴ+•.ĊŒä<ÇkrCW‡;ݘdZ'|„¸E9Ó0îÇX8?6ú?G4h‚Àââ"ĉĉçl6tż÷|Zc •cŸ¨žI’â‰'žœ9sׯ]³{ş÷ŒP(ÒX„ÔT‚—é†á~ĉê‰rtšmi6›_ĝX‚ŭ{ĤÏLE1°°°{twhe;ż{.ñĈM‰5iR0E7cvv•J7n„y°ù៨œ™UQN!ŬŞâ65Œ)pŭĈ äyŽ5kÖ ŻŻϖkĜ­°ġñŒÌÂ"‚ ‹ào,ûL3›_ĞĠ"!˘€w)ȚĊím Ĵ+WZ\‹„Ç}&IÂç),//[ i,ٞS(>™_Ĵ()r(] L(`˖-Z£VĞá:œE%‰rŒ Ž˘ĥ)@Ċô˘NR _ûš=ğczzWŻN£^Ż 2ĞN}êú‚D×]Ċ.‘ÑVFÛIAŸêıŸ™˜ššúÊú ú’$ :%/K¤YïεЗÖp“o–––ìŒÁ.u$ôäÛ%?Y#^ÚáïïÀèè(Úm{@Ŭtw1<ô!Ŭ/yHYŸ€>äSxôħG‘$ pñÂ,/-ÊUPñ’ïéOE+_ĥtEù7Ġë£P­Ġ~Ŝӝŝé3S.\x~͚µ á ‡ßç!Ú% "FÜıJ)4› œ;wEQ`ĈèwĞÈ:òċá˘h@&ĝmË "ŭBqyçŽ •Rxj‹ëҎĦ')$b^EÂß;Ŝ …“ÀÒÒҐĵ'qDî† O÷ уÖ@ĞĠö4Œ“ Wm üĵ‚éAV94Ë099 c \ı‚juÙΔtâ÷ŭÑAo+˙)]1Bhİŭ944ŒÍ›7s`~n.8ÉȈ†Èˆ€mc4_@(Ħ` I’nn4_ħ”>`ŒQWŻ^ŭ™JĊžsx+Ğ ?ğ@„P FÏHĞ ´F½V™3öL¸;ïü˙Û{Ó˒ë<‹ğĵ-×ʭ޲z­nvğš&ĠMŞ9ŬÓŬ$[žé1›ôˆ3i~hACúa›‚0€2`aD˙d43ˆ1( ò G0ĦÂFĥAdô4=€ıÉŞÊÌÊZrıĵŭŝq"Ή{_fVWéß=|ï¸'Nœóû“ ²M›–pÀš?˘OF”ĝE1žœf)…Ñh„ŬŬ]Àüüĵ_ ĤT…JJ •2¨hİT´=X)…ù :|Ày%5%yë Ĵ<ŸżïÊ£ŝb7‘‰ÜdhJöUGı§Àââ"Ò4µâċba8Żà~ç#ĊĊˆ)$ s30Œ³Ĵ^XûÏë^ɗai´&ÏDQ„ÙÙY²,s‡c xHä*Ë_pïıħÀ "<˙üó€ŬŬ]œœ›òáÏAtġçÎÔŝgmÙ=uġiüb&hŜžŜzë-|Ü8DĤ /´S‰[>Pëğ’ğ(èżTŬ€żX__˙üÊÊEˆ))ŠpYÜ †<”Om~§4e!´É‘Аsìîlc­V —.]B'ҋ+–£BŻ•çĵNNó÷µFżßÇáá!Ĉ1VVVlj÷\,Š…Ğz8ĉaûîaŸœóÎ~£;’$ÉÜ/a‚_Vk%=5ŭâí˜îœWHĉìü~ż,óĜş`Ĉğ[ì×êî;ûAËôJ)\ğöà‡í6ĈYqËĵËñ€ÌĠÀCŻd(\ü^}ġ5(ptt„ÍÛ·Ñíœ0F‹:R˘iŒGڎ}ÔPPQ|u4½T¨ì ż¸sçÎg[SSÎûÒ8y="ž2­^+\%fâ´Yž™e#ÜÙĵƒn·‹%Ìϛ€:P,вü\˙Îĥ²c…·ĦÓ!ËĠËĥX§ÛA§ÓA’$˜ŸŸ÷ÇI!Spı)Ż`ĴZ‚&í,¤Ï´ VЁ6FɊÊq"ôØà†Ä› Ûíb4™ëÄOɇd,=eŭpµ™_ĉ*ÂsÏ?çÊŜ?8Àp8ĵşÌB6Ĵ1Ħû¨ċlKŸa\X\ÄK—0qëÖ-ĥÜb$Ÿ,Pċ fîŜ×_yùx$Ç 8I餠‡ĤG½^o5Ïó›~p¨Ü_áî[YèυS ”YÔï†Ŭ¸şşêĥ…ò9X A„3Q´ßŜeçâ0>*+ÀÀ*£óyŽCôû}¤iŠésY‰Ğmè>¸(De}¤1iŽĵ 0ĥ@žçZkòóñĊğ<Œgî&ôW3Ĝˆ93êY/¸Cc G‡‡¸˙>˘(ÂĠĞWAÑËVäċûÚÒ÷ıtti*eŽäŜÙŜLOO£Ñl8C“aĤÏÊü 7y£ĉž#\ CîÏ+ĉÊ,Ëpxx8“Ĥİı†ŒċU^ĈS˜żvħˆĉżù˜Ô‡ ‡v:Œ>•Ç@ÄWÙçÇy³²&Cw2 nšö^ĝʕ+h&  s’÷šĉŬ°îĴÎŞà’'Fċ ?­Ŝüԛ~`sŬN'ȇËV eä`ÈÇU¸žÈĠ˘.”ı ĥ×ëŭwxHz¤çy³Ŭn˙ízƒÖàüŒ÷&Œ¸²8Gĵ‘˜?ĥٚ|Ì ­­ûh·Û˜žžĈòʊY†Ë£H[ˆ3.MĊz÷ĉF~ûÖ8Cwjy˲ĥ94,ìċ„÷|öó¤PŸêéûޏ˜\ Ë2ŒsÑeàeWgġĤÔaŬyñ6Yû{ĥ··Ñéœ`<Ĥ˘4‹.¤PÂYħcÓïOuúélÖ|¸tù2ì8ÀM7 (}aĥËÂċİŭg§÷äKş2™ş½ŜCŻ |¤pçΝÏĴĴ\l™+ŞáŝsŻŜSÄ Íí 4´ÌGF£!nol`8bii sssîĵzAJöĞ/ñ—YP™’gÉF#ììì 55pżÁëì°ÇEA?É€´ż•ĵĊ '''ÓĤ ‰drÖEVHžƒT¸¤ËDs0 i@s&ÀšşNQ‹S§ĵb@)ŜĥRÙĊ; EUáo]ğÀn :l#ËF=8 JòŸŬ{ÜíÓs ¤i/ĝ˘[p°ż'fB¨”I8–mÄa vÖŞ%Q*z~8~AÖ××{Ν IDATßYXX û.|.×WhòÒPîİ‚üž²—A* ú~àc=fVèĜü%È'xR”7OâğawÂûáp`nż-g+H€Çw‡\MÇqDjİ,ß~ÇFh4Ŭ$I˜Ĵo݈ÊÊÒ Wwo&Â0­Œ˜~bzzÚu…z½ ÷J( qż?òĦÜT„ż`ĤONN><4‹˘ ÛÚûœ /&'J*ĈôĤ8ŭjŝFqŒO}êSì8Àöŭg½ĤJÚ@1#—şà„—LàMÌß8İ=ôlÀ#­µşwïŝ;ÍV @ĽE„G”By£&ZœÓ6ß;'ÇnàĠĞWQ݇ŬT2--ž„­ôCİlÖ£ô<ûá`€vğ ­5–——‘¤‰TÁ²raaèxj)—p1‘݁"EY–á  Ĵ‰Ÿòt*/š)o`{ ħĴ,ܨR¨×ˆyž£×ë"­!™ú†ġôöe9³ù™(¸üŠ:ù™…gŸŭ³aoƒ~ÏGœ~ñ‰óœfÊú<9Úĵh(|êӟ`Ö"ÜÙÜtûÊu¤–ÔÁ‹ŝ”HÇuVCQ„^Ż˙PŬ€G››},IRf_²"҇AM1Áğŝ¨Áµ{IPQ„<Ïq°żíím{JÌSHÒòc4B|_qò- UùğħilÇŝ,,,šE@Îa’ ¸B2—_ŬdL@,DĤM&t1¨RJ'I‚p°ìDŠx(ŻâŻeàŞe'Mq(H6ÎŞtYuŭt™ÉMpĦ=Pü<=ŸŠ>]X0ğ/G#3Óô]c#,Ş_‹ d„0ÉPKHCáêĠg0==~żµµ5ĥíùċŻşb׏!]b#@dmWAä@=??\Êà9è‘ÀĈĈĈgWVVìöX ša:´WĦ²ÚdÂ…ÏŒíà}³pff‹‹KfNĦ”£FfÈ,Ú]*mĜu lĥĦ×ë!ŽcÌÍÍşE@²é”kĜ‚f°i+î4ŒŒĝaJˆ„²3ŒÇcÄq<Žcs€ËKD:>ĵÍë[tˆr­—ékœ$¨×ëZ£×ëaœYÈʽŸâĠ•<èÀC°ġ„ŭ­ĠX^^m êu:~&‚ ۋ=W–—µHÏ% œ’FßÓZŝ°ħ?0Ç´›Ìċ4žoçB¤&€ D˙•g”˙’¤µ‡:)è‘ÀíÛ·?75e6†¸. ÂÑVNe}<À+ ġ¤n,Š0ôqëÖMdY†••ÌÎÍÁ ‚ŠÄUY‰ĵ½’ˆğ@ÚŝĈ&Ïqp°O}pLMM#ŽbAŻb×ĵŜ*0TzĤWCimÏóá°Ac.%M’UšÌ9ÏÄGĦŬuoñw €ŬL]ëğ(ÀËÀZR˘+Âj IR<ŝĝÌŝ|<˜Ÿ‡äÎĦħ;C/1Ĝ drŬ \kDq‚×_°ıı‰ím ܙ—‘³³ ÜİċKŜÂħQ™u„n·÷Ç ôûŭKY–}<­Ù·ı EbUÏê”SZú{òİ£^Ż‹›7oB)…ÇÜì§2=Ô3µUñıGÖî==!²÷ĤH”‚Š"³`gZk´Z-´Z-O Ğ/ñî‹e° ‰GşÁFĤġ‰|4ÁÍÄÔÔT'ŽcË·ÍCÑ ^X>|ú|߈ñĜşǕBÇhµZ dö˘R_Ï"°Q ҖYYi•)ŸÎÜŬŬĊññħˆdÀf^ŠÖäÇ@ÔÉĊ \á­·~ n·qçÎ&ş''`üçpp˜E]‚9ĝ⠏–4´R˙Ċh4şV¨9è‘ÀúúúgWWŻDÔ˙ġÛ7 ğaC„ݵD9ĉİœÇçoÛĵ:ÇGnàĠĞWQĞĠÀ³ñù‡l–A+‹VÜR*-4g#lmmA)…İİ)4M8²–’Ǟò¤7âŜÂEÇÇdzԐĊ¸ÒC-‡³ž§rû<Š<t:d‘ïքħ”ï?ğ€~A7Š oóÑPQŒköx°CbdwGò:y˘\ûyËöFĤlDÉ#½ñS×^xġzŬĥ1ÎÇŜi°¨J´7X>Úµ|yžÂß|6àQÀ;t3K(O9…Á„aŸtY„Niİ˙ż··‹ŭŭ}$I‚ÇI’‡ôG*œ°bù  !ä #;_0;;‹z£n½$Xg·ĜĜ ¸Ŭ à`raüÈ9uS): dvvöÈ\Y\xìßċĴ”MĊyÂùÖA}ŻÖuE‘< ³“¤ár(é×Ŝ^×ğHoĵžïç-˜MAû Á4´,‚ÏtPĦ_Ħé ŝZ QġfÏ=÷´Öĉ ŭ=/nÀÖÈÉ!\òö×Á˜ÉByÛ0‡üĝôçy½Ŭn˙ġŭ6‚›ŭXh:.$–FO5`vŽF¸sç:ĉççŬQÜĵğÀA@öÉ`pċ3Ċr<Šà 5dçÌÏσÎ?œ8Ş‚~µC}9<âƒßmĦ8чÏĉùhèΜJ’„sîÊ!ïAĈy E3%xayáBòŬ"ëÚŽ@šĦà`*y%¸úk‡\%gG¨’WaBàĞWŸRĉn†Ŭ }ĝ.“ì×ÖĜ^{Q÷|)Ö@—¤µF’¤ĝŻìĠâ~ /dI97Îéġĥ ÍVlJÏ’”ùĞ ˘ĝ#£Ñè9< =4ܽ{÷S+++ÓqRœƒqS 0casÔÊ|ñ.7`" =Üĵq\rñ˘Y‘VÒYa¨QĤË× k.1À;°çh­ħ°°š‡/Û7´-ÇE6lÓPàċ\dĘĈеYùĤ5šÍf/ĤmÈ,˘ò“ĵż׃Ħ™=¤D[çGċ0Ĥ½½^£ÑmÒâ=yéĞ—ż­Œ’ŸÄI^rŭ™™™ÁÌ̌Ù´µ%OòÁƒ˙KÀ+ …ï™9‹ġµ~-C„Ï|Ĉ²żżğwï˜ûh<ƒçKà&GÛMvTNA˙X³9ÙŠÓşŬîŸô°ĥĥöù…Ċ%qĝN0Ë<˘ożO}ÉC:)oó§×9ÁÚÚ”Rxâ‰'hĥì;2oD1šnù“!n¸ïžò)ސç:GŻg.ÉóËËËv @q„Ù•…Íı‘ ÍóÊz€öV <ϓ(Ž…˘†ÚíğZXĦwè,şPxê§O#ÌβCAFöT @Žrj4䉁Ż<ËÉNE\c~éÒ%fSPŻÛħ{|4YKa„żíñŸ>i/½„$Iëġ°îׄŒ‡mĥ}ák¨ö£àIQüf ´ÖêŝŭûŸmMMB{–Ĉ1IžÑ÷‘Ùô“MCŞP~˜ĤñŝZ›;ïŬğ­Íĉ0 <ä÷^†óêĵżsÊ-3f/›şwòÇÇ~ Àüü<âDtsÏv Žf5œWR|@Ê%FÉ.8ŸZk7àl8N}Ló (Z!gû“jù˘ŸñyE‘ÂÜĵ€Áp &ßáòĦĴ,/Ì(0Úß-Î$IŠ'Ÿ|°³³cg2—_ÙĴLĜċ‘†^œğ G`’İéi<ŭôÓpûöö0²û¨Ğ ŞCŬ ²3.Jà:ÙȽ+v6à,˞ Y? ÚíöGĤĤĤžL(üv#ûŜ,˜£âh#$쳆?hwg‡‡‡¨×ë¸ĵşŠ8I\˙˘\O…)úûòïƒKżÉóFĉ é)YKêGË%Í*LêòvŬ&R`a¸ö—‚Ôjµ,ĥ› ŠsÚà‚÷ !˙< šHùÂ>éğ#p8b8"瀊Jğ‚ĦRïňµ— S|Z ×fMŝ³2K‚p||äşFaŬéïŞñ."˙è˘Œ°ßÈÓZž$Ċ'?ùIÀíÛ·ħğğAŻoÓxÇ4yF¨˜ık"ċ]!)X­5’´ŝÀ³kkkïÙBˆÄ°ZÇ = ’ ǵ£²€ClŜ~żoîXX@•UB>Mİŭó"ù(…q@AçcìíîR˙­İ–½ Â[”³ëBqċǖQĥ œĴUq`ƒÁ E4Ş‹Jo )l'Ş{’ ;WÇ‘Ž"·%x4a8Âì ğBµ ÀŸl3ßàĞ9(!'3ĝáÌjĵ““´0 ˜€4iL„· )Ô äÛ"@Èŝŝ>îŬ½+î ¤zş ‹ö@u,.….8QÊ#ŠÑ1׈Ÿ› îÜıóÎô̌Ü$´WÂä\Rí>ÍaP!ŞP½.~lż|ù2Ĥ§g }LżŻß—|êÔ™°à(•RÈF#lm™sĤĤĤlĥ xàÛdqaOɍw{*0x§ìĴ{cóĠ.˜™™9‰b^~1ßÀêXŭĵQ‘Çy~ŠòxŜ€;ÄÜÜ/ĴÄÂm‹ÀğşycäšQì/S4⯠ëġzĜÛÛ`‡ÖıÄ,şyO:‘xDä)öàí(ü—Żên+ZßĜL<˘#àġS,¨ ş/ᘠ`†^ĠKY–=yZĠ8}` ˃Áà•z£áM%Pà˘âÙé·.dċQCyx޵FçäëëÌQÍf Š•+"}’(ݘħ™—’€d„že#ììĝƒ@šÍ†/Gk(I­sFÌäÂê60'ž\˙›x³è9´ÀÉÉÉ,u¸Ö‡- Z–Ù’Ô}q0ÈEĦ"ÌÍùCAúŭüâŠo%0çP“8n+ĴDËmdÁûVi½N§sî½Ö××?ğzċJäÂ^ÉĦ426 àĵx…È2!żŠçc·ĥ§µ´Ĝoĥݐ‡)6ÁAĊg.Ì,kRòğfgg‘ÖêÌó²ġĉÚNħO^,C> ĜĞ :×&Ô077wD‘ˆW7 ¨ċûb–…+£k²-Ë  (œµéçĉÌĦ ìfœPÉ[›ĠuEçÙÂq ‚7f‘]ĤµĈŭû÷Ñíž ÏÇ^/ü‹Bü\ğŻ%??¨Ĵ úĊ#­ÍŠĵü€ ìîì ßëir‰1}˘ĥòípĊËĠŝ:y JÚÌ<ÀIA666>;;;'İ”9Mİ ŝ_zyE˘ié‰í í-³°ĠjáòċËĉ >÷=7z_ô ˘­—s]Š.´żÍgï£Ŭn.\¸`q!™Ì_„{d%2(¤ #ϰM믇-Ĉ6 qy90pŭ_oîŬÉ Ŝĝ,`ÂÖ5Â̌s&@ύÀ‹Ž“bċ³‘XċfŽX‰ÁÔŞş=($i ĞĞĞ€­­-tNNʧáÈxÜ£˘ƒ"EÄE|³h‚€Ĝñ'n=ÀŜŜîßğ‹_`mÔԎ­QPŝ™Ĉ”{NÛșr äݜ·@k]ßŬÛûoÍĤ\AI˜G,0OżÛżfŝœ!ğâ1I#{ĝÚÚ²,ââ"ĉ.\@'Ŭ>dÔe Âá„/j,ż@ĥ3ĵ^Ż+Ö$iâA‚+żrö(0Rt²EB"‘g²tV#7—’(PŻ×‡Qä –À€À‹´¨8稔{W´³ˆ€z£Î陁²`Tċ ?â­´˙ëäWôşbŞÌ 6NRw>àŜŜŽíµŬÍ|^Á`ħâĈìċPUĈKĜU€­áëo˜½^v`œ Ĥ@şċ…]W;/?ëâ&ˆe)@EHkçï| ¸{÷îë+++3~ú/ ‘fBdˆfJ„óĊLHŽT(…~݃[·n°€SÓëÀ˘žÏD*é‚HïË×È8F·Û,,, IRġP*֐²bşP–ó:NKx™Ü8}8iVf”F‰Àu}du‹}jÉyĤâ~ùHµ†BšÖĤİŸév‘e™‹ú\÷K3£f`†öü70ÏÇA‡ïó‡ŭĊ1ž³ğqtd7)*‘€–v˜Mbù‘€—Â,€Ĥ+6íòòE,--a<ĉ͛ĉœÀQñœ@Ŝf\@´) öĵ%ñÑ Šco{{{PJáé§ŻÚ7@aĤcu¸°ß¸agBâĈ Ĉ ğğğÈóġzÓÓĉ nôô˘PċCï⠖oh9öÀĝ úÎZûuÍfsEҀHİ| !C_ħ*Qȍ‡´ÈĞs…ŒX ’ Gàv’êBžÎ!ž+Ÿ×†Í%u0iŭeĦáğğğôğv@²ž2î(íۀ˙w‡DsH–Í÷8Ĉ§íAĦ{{{¸wï.zŬtÎ.à”ĝ˜Lñh·bT&|%QC!İĠĠyş ‡‡‡nµZWSğô–s$Œ Á²W”(Ĥ³ùx?ĥĵ’Ò‘&™@÷îŜE§ÓÁôô4V. v·S„!´Ù"¤(JHÌj˙-„z%  ”Â8˰½½ šÍĤ9ˆ$¸5xIüPˆ€X€3@š˘´2Œ"€~ż?e€Ô/Ê*DìĦҔȂòc˘Z€R q’¸ëĜ;Ĉvkıí…FLud|Ò*è‚_ûdeċ"jµò<ÇööĥÛ¤mL훀‚VdüÜ“,ʘĞÀu£oXèt:¸½ħ£73âß Ç]|×Dq8Ì˘9jíğXJTœžkoÀÀ­[·ŜYıxÑl½-P™…:Ċgá ĈöߕRP‘Bżß͛71ħ¸¸h.â´6„!ĤeÂñE`R04V’.xX{ʕc֘“€Üe QäÊ eQ`Ë €y>EßÔ)„—[aċ/€ÙÙÙ³"“Ÿx#= ?ï`bŜĥŠġkıñ‡†Ğµ‰èP·%Ĝwd˜$üÒk>5İ‚ö+lĤ‘4<ރ†rW…imÎìv;öÀTâ–×™Ú“êV&†°-ٚ òÈÖ05ûŭ‰ÇŸÀÜÜĈħı8ÔÇ“‹"\ JIòq]îd­w“cT> çùkgu666>?3;'Ì£œ@)„çdĝP߇”&]qǘû}ğ\ı‚ÖÔ´ù-(òĈÊò ÂaN˘ïÏÂóş û}× ™™™A½Ŝ(„óáÍ>Ë>'7î˘½„Gfï.@·ÛĦ Qțùé+Êó| ?şƒ ŝ£(gdYĉ˘;^;yPtÀÀPùß|³ÒwßvRC|›§µš;pgg'ÇÇöÊp”‡”o)†Â`Fĉ(ìFE¨5šĝÈGÌ}ëëëĜŬŬÁp—3?Ad_,LĵrD%ùh÷Ù§ĠJ!­7˘N§sêA!ápi0ĵbÎŜ—ŒşZ>.VÒŝ+cQûÔP"µŭ˙6îŬğxê駽ᅞ. àÇ ,s.STĵŭ£n,F0áÀ­˜››³—‘úüz…†PV†sôÌ€OéqßN€ÖóóóÇ> Ħ´JNµ9%Şurq€)<O"@Ż×3‚òÜד‹çÉ(‹bLJb0—ħs.Ec‰ÏĦ|ÊHʰž¤÷@Ò@5ó>f Ž †f‹ŜÑm/ 999ÁíÛ8²÷Š2C•bEHàòğJ Rù4²Ï ‡Â8ׯĉy~ħ˜ĞĦ€µµµÏÍ_¸P˜ŝsĈ%ôĜ>{)@ŝL ×X‹Šc }Üı{ŭ~³³³X\Z²SoĠıPħh‘ĵŸĈ;ĝÜ+M•İwqrdÖhmnŠÙQ\¨¸²£ŝ£AwàĴƒ$Ç§Xü­@h4F´#Òµ…³İcòĵáۍEDRtÒۊ.ÌĦ f5 ı&ܜ $ĉÛİ–Ĵms¨ġnĜó/€ ‰y›İ×ìUa}ÛMs7)._P#¸ö ’ı*Ħ'(èÏ@áıç˙šÍ&Ĉ1ÖÖÌ8€XPÚ^^áú°ÛSĜîÚÌ뽆B­Ŝˆ;ÎO #V'ŭP`Nëtww÷íĤì!Ep} —žUEK=Ór˜Ż"DÚA݇?áŒÎ\Ê#^qòZ^ÒùyŻ(”]k‡ b˜…ƒy>ĈáÑ!ƒ˘(ÂÜÜşŽĵD ĵF‘Ÿ‘‰Ŭ4!$táwID•çıˆ8˘İ#çl˜M^=ÜÁ˙u ž¤áKċdĈbċX ‘Í!îáL‡vÏäìLX2­×/oÊI[>ž}öY(ÜĤ ^·gN( ß³è½*Ĝ•^Ñô6ž\~F+×@½ÑÄ5ğ.Ö ú=6˗$KÀwN#P ”ÄËÊ˙€8A§Û¸(èÜpïŜ½7–––fšvcvËϜn;%ÖNw„:ŜV˘9¨sr„Û·7 ”r€>œcJ„Pěóôħż‰°›7><ú[šµ{ÈóišbffÖψL\ٞ !P^xYĜ:‡0òÉíµ`q‡a-Ž"';ÙċíRŜÄ˳ĴŻÁċ[ħÌ5áCäùĜםĠ…ĊÛeğStÇ<[ÀûK&87­V yžŝŭûèuĊžE€TVvqüĴĞ„Ż·fÓ֎_’³™†“ݽösuùÖŭû~Àrì˘;Œ$°ùpĊ몌dĜ"’³p̀F„qßÌó| @<ĴŻŻż³´´ üÉğbN–úNÚ3û× ˆ1/) &¤(Ž‘gc´÷÷ħµµÚXŻ7Dp/Ÿĉai\pŒ×°Ħ=g6˘°‡‘lo›mÀF"û€4\QKħÂ'Ĝ“™ċÒ³°8·³qgÍf3W*ò:âĝ(éÖ(V.Ğ3ëÁ~Wß ħòCAü–àœy#8>¸Â;%uŠÎy4ÈÌ[ŽËÁ“·†B­VÇòò2cxâĤ q†T'‹" ceê  )Š0ÓÖ >ó–ÙÔét°ıyLJmżÀ9Ĉ~+é-˜4n*Ġ˙+ôfz4­5˘N§Sz`èı`ssó³SÓ3 žİ˙Ä=) (´!1*Q×xBR•2G€íloèèij‚JҔ‹J”&Âĝ³ĵš@o÷™W”¸ ÀÒt¨_à„‡Êš rà#ŭ1yhÂAĠ4~n/Fi–e5lì5Jù³TdoĴŭ¨QX\É*Ž^s úf+n Ĵnœ2eĉ…ƒĞçNĝT Ŭ4 }J’µÓÛb‰~*Ġ?qÇëáY’ ŻµF>úяĦVĞa4™ Cö /4EŒ+UŒƒTF´ŭ\³,í˘ş8™xbıàèèèùF£ñĦÔŜĵȘòü•Ñ)[† Ú×H‚„.Ż<ì Q¤0ìwħħŽÑh„ıı9 /ċċ<ŻÏ€O#IoG|û !ü¨*}/SX“óh4ÄŜŜf "l-ĵĉ½§.M8ĤJzooœ2´“Ħ}âĵw¤"ä:ÇpÇÁÁ³ Î–Dû!ċx÷ó\%Š­)ô?•ï—÷ùĜÌO—ŬIà+éC_ŞĞ”uÀy‘¨È³BŜ‘;˜o ĉdä‘uñVžç QíÓÛgÀÚÚÚğzċJœÔjnŜúĤĵ//Bb†WÈĤy‡ ž‡éÚ"i¤€8M1ì÷°u˙>NNNPŻ×ñĜcĦVo:E§|(<ö 2‰Rvċ¸&Ôb2Ê ċ$A6èĝƒÁJ),--ĦVo"Š_?–Ż,“0ŝ"ĊĈ HɕÌÇù­HAċcŒ³ħŬì˘ĈġzQ’"bW´nk˘\8f2=˜ÓUċF™( Ú|­€êÒ4Ċ`0°‹¤•¤ˆ’XÈ2bŸ‹@@ùñ‡E?˘ ĵŝEˆ13;‡ÙÙY´Ûmììl£ßïq‚¸žŠ²Ê>;> †ĤaúÍeAé³ó xüñÇħĥĥ† ĥÛHħŻ‚Ì2ç~‹Ì˜ż|œƒlUHĦ93›tğ½Ïĝ—ôê™pûöíÏ^Z} qR“†, E›@qĊ½h1.›ò^0NÍYókëkÇXYYÁâÒ ÒFÓÀA§ïjmŒIŒ;°üÀĝô_Cċ÷Ò • N€l¨>0K:Ó4ĊÜü<Òf Û äCLĥÁDA”]PIʨÄ÷% 3móĞSyáEŸ'd›òôŜÓ/üĝĉ7ż‰““ìïï!Ó9bx8­½'ŭ^ĈÇYi´²\żÎӜ ™ż°°XŸšERŻy…ƒô‘[Ž’⌔ 8|FE ú=7ï~ñâE4§ç4"oÈE6&6š@MuşU>†1ĥvÛÌÔëu4š-č Oİ˙$Ŝʞ‡D|İÈì<³ĵô˘8ŞEġúDŻò Ĉ˙ üDiêé÷ûÈY Qf\bÔa>áó0ż(I°rÑìévğèv;Èr9ÀӇş¨K~£ƒÌy=Â4eߕž{Ŝ\Z2 °·³ƒN·‡3§F>e$Ĉt ëPÈ=ÏUt%Ïó QgÀöööÇfççĦj)àşQSûHüŻÀ¤4 @ sr‚££#ŒÇc,,, 7 Uñ³>—•[&$ŝOÈĈı; 8IDIDJ(Ĉ$”ñò ^xĴMt¤µFšĤ|œ#Ë5² }ĝıÌs–ĤŒ—°€qîğ<½^Ŭ“ Ċ€ÚùË •ĵL“xŠŒò3v{òp8ÄáÁ:ŬZÖİ^ğŒ?”r?‚7 Ìʝ’yžcgwí­mœ<ħ‚„Éĉ´:•=+Èȏŭı‡îğHƒŝY–]p.ĝP½5Q–cœ³k§”˙HÜp;Œ ÊT&ġ ‰ß@Ĥĥ;ö*Žc CôùYA‹‰î“’âÏx™“ 4hœ€n§‡n·ëF˜;'tNFHİ(³ĊᲞ…­ÏyvH_µżŽÑétF¸Ŭn/íîĦ>3ôŭ%óĈBġCÈŭÌĝ€X'‡m·'âää;÷p°ÛE­UêËËċ °dAŝô"%™ÔBí uPĈ‡‡NgF£vĥïcgmœË×ÂûYĜÏŝƒ6uĦwÜ%’ñÇGG ’ŭ½=lŬü—–QĞĠKK÷röù˜Ù7*/paš}.ù]Ùĵ"hŒŽv°ş|–Fžá0í0ğ³eĤt„–°…)ЁŭZ2HÈ~pš½Cǵáíŭ]ŒÇcLMMĦŬ>D{ç>2šcĥ­ŽI¸òÍ.Ÿ ƒÈCŒÈ[ĈT!NSÜż‹Á`€f³‰Á`€ŬíûĜŬ¸…´Öß­V6R†NÁĵ¤&¤(ЁQ‡ûPJÙé-ÜğġCŒGCsY+Ûy)CF†,ė`KîÚÇQ“Xœw1ÓXa˙žıĴ0sŜwÖ×°ô½˙ˆş=<Ößf#OßáßùêLñë6Sj@ħwàŸĜŬŬ…R £Ñw67ħñŭ˙ƒ=—Ÿ*ÎH@ËóƒCŝuh„ĈϳŠŭï}FŬ[¸ŝëhÖSÔè2*É Ûs!ƒ•„Ħèjq—ƒ_4ĉ똍†Ÿĝè‹ôìTˆx÷öښ½÷ĵw)ċĈÚ#¨|-tΔŞ|-R”Ĥ1öövÇ1â8Ĉ͛7°~:ĉövX™ħħ9P(9_   |“(ŒX4€4­á¸½~żVĞ…íímüújµüÉąÀŒY wŻwmí€lŜ¤tQ!p÷î]DQ„ĊĊĊí7n<ùëßñáAİħR=&p)q€”<ˆĜĵċeŸ$ ÚûÎëáúŻ£Ñl˘Ñ¨OÊÂċ$ *à*üèڒ×Èëĝ­[·PĞĠeÖ××qŭû˙ ğÛAÔa2'C) ñĊVˆ’ĥâïV%joxIšâÛßŝ6ĉĉĉëġ°½½ŭ:òqfï’`2ċr½:—J DÈa;1/ĝâŸ(höépùòċ÷żùÍo˘×ë!ŽcÙ×°% Tä\:‰p+żsŠ"³RïöĈòĝo“”;üĊ1F!Ö××Ñh4ívñŭïišâ… |ˆí½%ü”•ÊħìÊïğßŭ.fffptt„{÷îá½÷ŜíÛ·KÛà<ċŸVúÌóĤïÍfsôîğï~EXÈU½ġÖ[7/]şô$5äƒ0yVzŝĵlvÇĜŬŬĊ7°°°€LOO‰'žÂFujYg}ù(ˏVsmmmaii ¸qž{î94›Í3ësž:‡Ï&}VJıE>Y–áŬwßŭgßĝĈ7^ĝÁ~öÒÒR!Ä>M+;;‰—_~ùÏï÷~ï-Àl’ÒZc~~Ŝ „ Y–gÈKY‡ïÒA¨”.Ë2t:œœœ`aa³³³îı$)÷w”?ï:M˘8ŽOĠċ$Iívù…-˜žžĈܜıG³Ŭnc4!I’BŭB~ĝ*ÌIÄu?[]]½û ż ˙œž-..ĥßxo]şté{<íİ€R*˙‹żĝ‹ż÷s?÷sż7—NC,ħ¸g‚1‘!ñ÷&UJ)…Z­†(ŠPŻ×1 pùòeĴ­­áîŬğ@‡aĵ–XIW"À°$ÀÓ<@’$h6›˜ššB–e˜žžĈòò2ÖÖÖétjµEÑİ Be„ VF\ħ‰¸˘NMMaii‰&ŭäOŝäwŝúŻ˙úmNĈZk—Ï$9Pş$I †C²ĉ2JÓ‹‹‹ĝٟŭÙ˙› ^ŻcaaAä֍ˀ·U¨KĊq›ò:´Z-´Ûm\ż~ŬñšĤ)Ò4ĊK—JëĉÁż“ìÂ:”-O?33ƒżúĞżr{!ĤĤĤÜ)Zkwpʤr'•qŻü{½^ÇWò•˙ġµ×^ûftĉJÀ×_ŭßh­/ĉy^#ĤŝìÏŝì żôKżôŻè Hbê,Ċ>M OKO—e>ôĦáääŬn÷îŬCšĤ˜šš* w™B–˙yŸÇf n½^7ہ üèG?BĞĠ‘ÀyħLéÏ£Ĵt§í‚ô———ûQĦÙl–vIΒ}8ĝwž÷s(JExĉ™g~TĈcÙğ“—gžç§Ê„ /Š"·K“Ê&O‘$cĤ2Â|í2ëÂsz7ì:ÄqŒíímħŞÑhpċu.+7”CYtpšÌ”R¸víÚ_}ġĠß-d\Bg€Í4gL|cuuġĥÛíp'v€L•1OÏBÏGy‡CÔj5Ôëuw8hğŬvG@…Tržôgàx<Ĉh4B­f.Ä̲ išb8˘^ݟÚ5áùOú=ŒžÂÏü;@£Ñè/..˜£¸ġİŠ5I™&uèw’ï$ƒX]]ŭ‘Ġ“hRè^Ĥ´gy´²Ïe&ɢVĞáK_úÒ?RJËŜ éŬ ¨”Êżò•Żü£N§R:.èӓ‚–}Ÿôœŝ‡tÒ4EĞĠ²' Î|—?çċ…üñ÷(mĝÎh4r“J),//oÑYĝáû“ò¤ryš²÷)m˜Û€™™™ŭ2N‰çüMŞׇéééíİİİ=y•½Ú˙ĵžĵŒIrá`×l6û­VëñD¤œĤ “ôó,*ÓÉ££#’ vƒÔiyñòËêʟ…Ï|•Rxùċ—ß{ñĊ˙ġymùĵùĉ›úÔSO½—eÙİĈWĈ|ÙóPħ˄e™[ŭfŽâ2wóġûŭ3Ë: NküÇ,Ë)+żò+˙û`0Àx<~ Ċ)Sú³ŒŽ§£ˆkaaaïâĊ‹;ı=&ĵ hÎRò0]>e@OżÏÍÍí(FO>ùäÍ28­-NӁÓtóE^yċ•˙ó?˙ó˙'}§ĥ)Ó+.ó`ρ²vÑڌĦ\ğvíߑ}( QȤş„uċüP{ž§ŬFöċ/ù<ˆŸĞ PFJ)ŭŝûïéí·ßŝ·t+ 1CF˙•…˙Μ~żïú¸Zk|ò“Ÿü‹oûÛ/Ç–żëÁFâ'…êeyp°wŜúâżĝĠ/ùË˙Ëx<žĦqòôħ,´?M\A("zòÉ'ż—$ɑÖZgYĤ¨ï:I†üŻ˙yÇ-xq…^ĝÖŭÑág~ĉgŝŸßüÍß|…şkeùNâ…ósÚó²ĵ´Öù/ŝâ/ŝÓĠĠĠ˙ôğżûğ˙SğŬ~l<ö+%ÏSĈYT&ŝüí·ßŝżŝġŻ˙Ŭ—^zéï˙ÚŻŭÚ?ÑZGƒżAê<ùŸVnPßBş+Wl~ík_ûW\ùP­3×DžIżŝëżŝÏŝġŻ˙Ïİ=.|’ B*3ĵIï…yÖëuŒÇcÌÍÍŭĝ[ßú֛ò'òù_ŭĠ_ŭߒ$‰(ŭÒYOÓġzŭè˙ĝúcûĜżŭĈ7ñ‹ïûî˙‘$I|Ŝòˌƒè<}ÔVĞĠû­ßú­üËżüË˙úĠŻŝÚoüĈoüÑh4 ”$ÉP)UÊ ċÛl6;qNϰ§^yċ•ïüÎïüÎŻNMMmçyžüöo˙ö—~˙÷˙§ûŭŝL£Ñè7ŝ$€z½>lµZŬ2>¨üZ­6šžžî”ċ³°°pôĊ/~ñ˙úèG?úïàĝĝĝâ×öµŸ˙îwżûL8ÓEQ¸¸x–ÈW///†|„Ÿ•RZ)…ĞWŻnĵñĈ˙†äş³³óÔ{ï½÷rŻ×kÄq|j_|ffĤ“Ĥé(,‡ÓÔÔT·^Ż ?Xj4½§Ÿ~úûQML3‰àÏ˙üÏ?˙ĠŻ~ġNNNĤ„ Ô> Áĉççı ÊPonnî$I’ jµZvíÚµ›_ĝÂŝu½^?€ëׯâO˙ôO?“çı*˃òiµZ½VĞ58ÍH›Íĉ`jjŞwZšŭO|âYĞĠÜÈÓŝŝŝׯ_ż–eYišŽgffŽw9_QgffŽOó~033Ó½ġôôôAEüò;h­<ÏSö]€LǃIPQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUô¨é?èj/u"ĈĜIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DisplayToggle_420x420.png0000755000000000000000000007371012467662066022341 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFlóIDATxÚì½ğ|ĝ0üèG?òwQŝp8 "âx33UAg+Š˘ž:@pj €sÎŞÇ@PĠñ|>ŸĈ‡‡‡ñññ1üĉ7ż IÚZÎ Ÿ=œ¤×i]„ùâ‹/?~<üä'?ywww÷áp8|ôŜż‘{ÌÌ×DVEQW‚HDl&5³àB8Şê§‡‡‡oúêĞñxÌÖRJoÒJ"^¨?ùŻ˙À?ú_ĵôF_‚h §Ù×ŭŭ½{˙ŝŭ˙ĝŭ‡8żu8~Û9÷…sîGԀ­$ŠÚßBZ>v4³UŭJUċœû•sî×8âññQ[.ğŜ>D]ÖKA´až7A”ż‡ƒ?ğwï>ŜŬŬŭü§˙Êżúíŝĉż§óÏUĤú^Ì€ß"³ê`¤ñž³ğdz™ĥġ ĥñİĜÓ^ĉşç])zúûżĝܟpXßĠĦ”˙‰Ä›ħ}@6´RßÈ"'çÜ7Çà~ŭ/ŭġ?³?ù_ŝĦކ>œżüòˢKOݏÒoĈZ"^ÇjëÚÄÖüċĵ÷îp8Ü£a~ç÷˙öż÷ïŝ;˙ñòŸ~IÛ.=[ô üż1‰4Xú’ĈĤHú6€ġĜ½­†P~m[ ÁĠߨĈ¤-ĉŻô÷R ßúġd6Żß[ĞżµLĊôWëÇóƒ5Ue:_™˙sş>Ó5…ċ—šŝĤĵ‘6¨íâA–×sÏĊÒ´&×ÁÍÔ NÒgn°ċ{ş|ĵñsÊÏ+ç+ӄ=]Šéb×S3„̽X;@ZŞk·\GhŭÁÎOÜĴqŞ?Öô·šîw3À‚^âwâÓxó“ËakfwRŽÉ4~VŞ 3ÁŸüċ˙ïŭOü×˙ô˙iáÁ{˙pwww0^XÒeGŭ|êXI3(9çü0 ïŭùÙŻ~ûï}{Ĉ?ŝ6à /ĝm/ĝÂĝtO €Ad6q— %ßo /ƒà%ŝ\âĞĈ‹4F”Y{ĦçÔhµ,ı3[ˆv†aˆ|ŭ|´fÄI<|Ÿ_וb˜EàLĉo´V ñó´!Ž ,úÎ ï‚! §³â$‚S0<ŒÀ9ÌObaé› 0¸Üy‡Ÿ˙tÀ˙ö/<>p‡?‘"rï½÷Œj(ɍ8˜ ¤7 £ĠżÍ̅ïĦúΙáŻâSU7,,Óü—'ı€{'88‰–‘ ĵ›ĉCÄï2­°i°#ŝâŞIKS™üZ él1Uê%…­ö‘ÊD'•µ³šü³Ġ&ĊĠSÈ´ÒÙq•;-ïdW˜˜PX½ò"_zÓE™°dñ{-ŸCÓÍVYÑ}d +.gmÍÒ0ÓÂ`’^8èÚiYÏŝ!‚kf1‹M&ş0HJĥ4q>Ş‘ışpŻUçƒPÁİàá <'›ïË._ƒj´ú@8)~ú“w8:çœsÌìBpĠRBžk8Ġ?{0HŻ B[ĦßK ɰnofƒ=x~êĦVM†K/€wÜ9ÁÄ]ħŒp Dó5Z°ùÔĉ“Ĉ²ĥVe‹½ŸmÑüxW›FïVMÊÖôĦµµÀĊ?ŠëÇzĉÏâq­-“ OL³™.,EC´DÇlužş>Ċ“–ƒ°äĤU.P[|Üsħ9TÌşYñ/jû·Ú:ë½F°ú"g´Ïï;ëYĞĥşŜ gĊò0xx5Œ"8)àœÀ{ƒ¨áÛ1½Ñ8ŽUNœœáûÜàÄÎv(UuċtX,Iä-şñ¤× §ċ—Ğ-¤”ô:1x›EoÒğGtÑÄ0H´œ|ƒŠ°çE`6`r Œ}Oë¨7 ]z“ÀíÂAXxšgßİ„ÖuöuyfÛLÜà -ÀŬ;˜Ŝñ.Żeëy=nÜ+××ü™s€Yïs´ŜzÁ6<Öŝ,ĢÇOdr÷šÁĵƒi€9‡à g[_ÓĵfS†ƒ›BïTĠİŞ3³ÚBZÚÇo2ä›@z äY—'ߪè]ÀT(ŬÜ‹û>•Û|%ĵ_„iŻ(›]°ŒCw˘XĈŸlMnmkÈz³ċ5ꢉĦЎgu.Àà’)Ġ2F/:n뜏nœëĈñÛUMĴÉĠ íûÇúëĦ–e×Ŭ”Ö´ÜÖV´Hô zÔ ŞP/¸‚ħäNLÊE ƒ$_y\0Z^Hş4vĞp‹§W^İ•Tkfâ×’™‰ÁD €K+ĥÎ͐\ŜF9hA˵k aWX;v͸zŒ ^ß.[evRÖwĥµ]l׸ĉž#ğğâ1ÛZĜêşÎ€°eĵÙö…5ğpšfí‚nóÔĴ#ösí*ĥĈu7Ûş6“8Óh= Npç ŸĈ5ĵ#e$E,¸èr9Ż\cr%,\wŻ$3‹@"Œúğ™Ûnú9şĴó“ċxÍ+>ßÄĤ¨§Ö]a‘•ëíİ0²Kij+GcFv­Ğqë}z.ô­€îûÙÜĠ›úvPmòËaÓ>mìğ5t^vÚ’Z†m°5.]k1nY c² „µµ³|Ċ?8‹–Z­JJd§ŸĈaŒ,ÙY²pÙYgĵ÷‚h!QŻFK—ŬÌBŞ”ƒž–·°“è–[š_VÍ­hħk'òïFöT+jcUĠ{Ûe×cۂ²+ÜV&żÎäeĜĈûì‚uÑEè›ÖÊü*˜µ/ÔÖ˘ĉĤo÷²k-*¨Ç.R|r.]Í4O,ßk‚ŸŝH ƒƒ„Úlv‚ZcŭMˆ@z}’+Ÿ#ġJĞŝے߁J Ë9I&˙·µ\wß#ŒĴc]o]žxʞDsz·'l4'ġ­UŝĈܵ4ìj·š]ŠÖ0Ûu+èÀÚçasŭà„ {f½Y­şŒzǚ£ĉ3ŒÌbÔŞ*`ò\+.‹Pm iòñ‰0¸œ„\Ó™wccáÉ êĠXGĜ²”ò ½G7×Vyzİ]syµ§b%9ÓaVùĤy`—Aq9˘m; Íı+Vġşġ:'pğ°Ks†i?ŭà‚zîĥ  ^4bşMŜ­ëo—`Ԋ&Ü0ßìrcî ïĠ|Ö°ŒÚ§ĵ \X/2 ĞSŜYĥŒÔÒσ4ŭmİĴ”ËUŸrż†ì™+{żı_YNˆ½fAJ QŻĈjŞoÖĵ²Bv×aJ•`É…ÙŞİÊŞş]uĈĵ˘œ2+§Vûċ˘í:÷ÚêWziJm¸â°F}ŜS­Ÿ‹ ĥŽ¸µGqɲ vçÂ3lY@֍г-Pööu֔µŭ™ë÷è]bë[‹fWÜ"ÚŞu­)ĞÜ{fSšb*54ISTʋĠô|]ÂêŞq-še^, ü-%év5‹ĥ3Ó⋋òĜ´*ùo>iM­+ÓêNĤäÀYäÊh×y¨şî•Í=#½dì\P· ÑuÛ.ğËŻ9›’ġ £ġ'ZğURÁÀ`ۖ¤]Oß2ZZDցrÇEÖtaZ~WäBÍż2ÏÈĴáĤ³éµëš²Ac’ñ¨Ó~RP‹˙ÎU!¸Ĥıèĉóu…XĴÚȕÎ5PŻÎ×sß͟“+c-`”‡„ÊryĴçŞ0‘n“ ĥœxW7lÌĵ-ËÈ.˙asùÊĥm]Œĥĥ§¸óts"·Ky§vٟiak7֖yÓ47ÎÁú0Ĝ$èyÎĴ1R˙°­E‡ġ5Ú:ĴFÄ^+겐êsϐĤ’CÁ,ZJ!BJĠâW 1+B.0's)Y´´ĥöè²£^„ĥ*~ceú+/PµMg}kÂÒ .× ›ĵÜĠÒ2TŻ[ĥµB~ğóŝ…†k󌊐ÇӛŭŸÚŬNZŬ __T{¸bżM7mñɚpĥÄĴe½öë́Zë[dÚqÓġÙşp“Ġmş*­ħ–-2³\ĵÛ&0arۍjŞ“•êúx²–\ċZ7lıí(éf`„žUT‚ò`P›Ú lÌMZġ§ Fɕ]ċ$•J Ée7& £a ZEf{Uĉ–Wˆ{N‹ħşı/ĵ1ĉëÂĞŸċD Ŭ6Ĵړğ4Ü Ġ V[tóc{UxµëğT™yĞ'Íĥݲċ´+ÜtO.´rÓġ÷.W³îDÚu,·ċÊ~ĞUÄPvÛ(˙]"Ê/ħs­+rmğûş–i^½ŞŜf×ı隁&Ú¸Ĥİ˙b³›xRU† ctםÔĉuÉ2*ç:*ÄûHµkÇö%ÑB˘^%”d J-ĵVĉŒI´Ž˘—/ËÇf)Ûĝ½lµkĜ nhż¨]mmÈ+yseh·mîĠXic½i6Ü[ŭpĉĥ›î"“³u,×~hwÇMWO\°fZ!ċ+˰SÏZ×ĵY› sëĵÖä›Üx³J&™ġɢ²Ôyِ*4(R@ƒâœ’c­µ@1N ŜMÖvÒ[“bwË*ĵÖhħ’‰% –:‚­Ğ€ç+‹I§.ÏjzÖĜfR'ú‚aĠ ³Ŭ°<Ĵ’NÉğÒM·•¤ş:Ž&,şoĜn§ÛVá²âZ°S@·6ïl\QW]Z@fĞġ{ğB‚4-żÚ/“yÊċĴó[nIÁÚ²\}N‚­V?·Š Ô\ËhHÒhгc°Àĉž¤ï’ĉWğ_‰&ém¸ïŠÛ­†Q½YžŬu¸Ô>LRQUÔc”²•Ġ´œlfm/“q.—Zaσf“V‡t!œ\76ü‹…Ù,OÔßk¤ġ6à­ueìR9 [mux½.éµW§_›nA3˜BrmĊELĈNı„9ĜĤ¸˙líŻŞ_3Ô°]hħg4EĠYqÓYĠVÓÒh1öRuïÊĊWíĴŻ‹BÌ'ÀrÒ"Ŝš…´€Žur}´š|ĊŞhşŞ"¸˘ÚO’yĵÙÀż”~ÈöV^­&qmMö—‚!tğ&œ.,€­MzëíëtĞqwz µ˘éĴġ9ÚĤĥLÓM·„Žv\ ‹ƒTĊĉzġë·`#6ee)°™u%éSÈ{šÉù;;0iYÒ-7\úAë˘ÀşO—×TĞû,We˜jĜÂŞ¨¨!EÖĠûS½9™ĴِBĊ)éÍı늋(ŻÔĴħ‡tĦŸQ+4X6&è6_ôBˆ6Ô6ħ/í ä ‚5šW•:ÖTûql¸ïîŞV˘j'€Ħda×mıJoĉ‰iÇJÚp鏤•_d•{·Ġw+í™XŽÀĵñcÙRİîÑRa~L"³$l›]/‡Ú8}V"|ë{8W`X$:iċzËm'Ĥ; ¨N0šµK·Î"&íÓ&·ŬĴl>E ½IK)­ìú0èyĠÚ+hÛŞaŞíûbƒ5Ë·ÍÂÌ­ZŸ‡­òTĴÓ³™…Ò+iġC Ss=MçJ§X+ûE³…Bó3žZP¨8xAì‡47‘¤WN‘VƒÖżğpZ–ZFô\j­°´>ĥ 6`ĤÖr‚ÚßŜÎMħ C­Áߨ²`VÓ,Ĉ6ĴÇ&Ĵ} lŭûf4`'JnVÂg+ ÁV\YÁdÁĴy)"í\gëß?èXFÖXáèE+ĞŝL­ÊŞ$–·7“Ġž‘ &)Ó2RÄa}/ŞFûM íÈ=[‚pšÛ Ĥ X‰@z~ñ‹_\ċĝ•—ù‡[™Ú×ô?*`ŞĦdiĠì ì*Ĝ…nxöÄBݽÈĥ^‘Ïı›Íĥ;“÷Ĵ‰Ö>KÛ¸jŻÌë¨ĞK­WPê%…bŠŜkıé–jY‚“^ ş•›„1,œûJg…G[=ZŻ5+´~#kV·µĠı´ğyF R °ÔÁÌ µŝñ[ċ³ËET'Ëy~ŬT·\Ĉ K3Eĉ™(¤x,(i?ĝì}GġÀÓ‘\ġ<İW‘ĥŜ÷ÙjèvİÜ ZVVy6Ŭ2˙-K˘ÚŬßü}u³{ŻÖrß]S ›gĠ(ÚrÓÙtÙ£1k¸ħ„‘uĦħÜ3jÁhyè.fŞcԆĠÖJ>]-Flĥ j˜×+KP‰³÷×OÑÉUÓŜg Ğ……ZÇeĵ8k¸MĴ¸)é"~ñ‹_\ ùŽŽa ×ħŠÜ–Ċ”W§ u´ĵÜDĤëµĞîĴœûîİËĠ£;àB?ZM/XcPċÍIç&Û² m}ŬĴ„KaÈĞc6ëîÑô ˘Ú…ĥù²YuàĤ­Á…ÒJË@Ž›tċîĞŬ`Úz}k4rĴ÷ŞŞ5-?CżdÉş‡ĦUëÏÍûZžƒuYB5#U ei HO´tímż·ġÔ²†\ ׂQ£§ Äċ˘İ‚œWcWZF-ĠÊÍĤm—˜m0t-#[NN ¸nıWfOğP§µìħŽëlPôsŽ6k·5š˙u-7Û².0ì@t 7µ"³iòV4\ek ÑŬ3j…Î[§Ê†6\‡ŬŞŬĥJŒnĴĜ8íó*֘­Ë-÷l£ġ{çĵÊġqHìŜ,vħ–ġFt 2ò„ßí(YX@nZr (ı §Ü„ĊŒ–‚uKù4,ŸÙj¸ÛOtÛ2Ş'Rí¸Ôz“RsċZ?>Om½gcÙm腴·#ÉV0oĴìÛÁ!mËhY”ÖZzà­×~nQ=yÂèµóŜhCj9o›6ŭwó²<-ĞS—ÏĊޤIJŽnSÔn։‚Ó>ìf0Á<$ĵqUĤĵ9ž‹CœƒŽJ ‰@z’tm÷Ĉk ġT(I%ç:_K(•ÎħġQkˆ ´f?¤köŒlQ!ĦS¨;ñ6& ğäĤvë&ĥk”ġöĥZy7›î³‹Uúµ^ۇڕ ×Ô2´ğáƒ\6›³nı [EÓµ °²€6ÙÒâjsÙ1ĥ™ó5KÖĠvGۖ;Uۋ•Ú2Z0hc‘T™ŭÍŞ½Ċ\ ı_Ĵzóħç²xĵŝ#E ġ`t ˆ}îK,¤–t J“u‰$‚id9Ĝ§ÁÔÛ3² Ġ š–QύÔsÓġ`dĞl ³ĥ˜ĴÓÒÜşQzĤĥĉ­÷ĜÈYıŻìÂdn›@k÷’²*şÌZ‹‹E–ğĴíŬ¨”İıŜĉûµ´¨1§ Ÿ§u`d­ĉ|‹k£ĥ^LĠnşöÂCW&ş˘ċJžğù}`•×Q‚‹„.;éé0şġĥġŭ]‚×50*_fĉf.ğ²’LmW90ëğižjمk”d0Û°ŒŜàžç4&<Ĵ*+w]’Ĥnş^[î÷eà…uü=eêUی~Ԗ²xH7Üe+Ëhî547ާr‰ĥ*0´ö½ZÎe¤`Ŭ‚ŬÚßU40\-Vfëıµéĥ†uWŸ—v>ŻĠçï:Ĥ{taòï}ïut\—7ôÜéYHc%ͲKÀ‰`ÌYfíìùĈr˙˘e´ÑšĦàÙżħ ­êɳ™cÔ¨² Zĥr“Lûnşö¤ĵ a×V`ÈǨ+fÛŞ‰^ġލkÛxï› o.FZVÛ ş–êĥÑR]ç÷ ëÄĊbÂ:Ñx-Ëı™´ĞíBĴ]ıîşĦŬĠ‡ĵJ1kExJށ‘6TMû¨7$ıFċç÷ïßğğğ;÷îŬ;ï½w0xqÎıâ[~WĠnġ„ŜcßċÈ9—żĞjĥ„|ġŬ0ÜŬŬŬ½wνsÎŬĉbÏĞoM¤MËÈÖn˜Ĉ£ŬrAŬÍ÷ àĵ˜èċĉzÖl;ħQ›.ğéV‡ĵµO´]&¨ğgÔÜkÒô&ËÌzı>ĥüŒz-ı­QáúîĠg³j׆`ß5‰E4u]”ġħĥ,£f4uVÔÖ÷˘µ­uµ ¨5Û{ô[udžŽpX9ˆ@şŜ2*_ïßż—/ĝâñG˙á‡ûğğğûaî½÷€ ·„Éòû%µ€”¸ĞŻ ¤ )Ÿŝí“Ğîŝŭûßşżż˙Ù0 _ˆé“iR“TÓ—,£ÍJÖ˙6,‘U öÊşÛ:İ­f½}›Œ–£ÚüÚù:Xo[Ğj뽚…Rġb2l/ßie]6 6ğÎւTÇMÛŻ`°°Èşn[[G- ;Qš6Ğèş‘œĵ°µE¨ê÷0ÛÈÒµjŭàísZ-ê‘4­¨Í*SÒ¤f_‡Áüĝñ“ŸüäŬû÷ï|8~â½˙‘sÜçëĠÈ’”U‰”›^Û%Ë+ïıêKTĠ8‡ŸÜŬŬŭŜápĝ]çĵğCLˆ…‚jsċĜ[Ċ[ÏmÒ³°z><›ö$z+ĉnqĠĊŠ}]†ÇŻÙ'o=ŜƒG·ôĥ]™ÖÎmZFveh÷f˙$í|vÖĥŒÊy\¨À`É­Ê= vïŻúXĠš‹•ë£élMwÁMg 0,͍r@Öjħ´ núÎĉҕVQŭġîŬ;˙á‡û÷ïßq˙;÷÷÷żç½˙ù)€÷Îıû ĝÄh·TÛî`’œjW^ġŜÀàœûèœûùŬŬŬo˙î‡wî÷ï=ŝŻoÇÙĊĊî£Óäڏëċ­,‰NmŬ*îژÚ°f²İmċĠnş ÖaĞ œu1ìB9ùıĴ³ü›ŭxjèĥ`ŬÚûéT“°Ġž6˵Ütċ#ĈµżĤêD3éU;ıe[ÑtŭkdS·CĥÁ/ĥÑĥŜt^Ĉ¨rĥ"—nÈĵĞ ˜“FwIŠÒFM0ŬßßîïïßßŬŬŭìŝŝŝŻŭ‡˙ĊùŸĵ˙q?@íÎIt׉L|sw.˘ÈĊ|ƒò&Rŝ-·!S ²E;Ë=W,˜AUm *AĠŞ'Ĉà…êßNœÜy'?ûíß½p€¤ĥı!‹ĉgëĠô–{ó“Í=Ží†Í*hEĥŬĥáÂ[âê½3)ŻV‹ê^£ÁužQoòŸŽu£+{œtŭËŜžÑ ŞÚ/Hğ:™ĊeìÁ¨ ŬEĤ óéjl6#\ï녆İ=·ĵÖ°˜ŽżŸôj ŞjÇ"Z•>êS¨ıTM„Ô´–°a%9fá÷ŝ§Îıß ˙ÚżñoùîGĊ€/ĵà İċò½îDp'€wùMd§f DÙµ,UWW)9 À[§œÔpViñġŞN²:/뇋JêÂívĦêV› k,ÉÛn@[ğIZGgrĥ ­ê—ö ړµZz·Vú­ ^D֜ó6:ċ€úZíe(, Šġ¤ŬŽŝhşSçħğwvìjM7›5`pÑM·¨Y7·œâĴUëja­›YÇelë–Ë…Ë=£–•,UùaÄ£*NŸÁ{/À™Àyë@şÔÊaVÁ{ïE䝈|tÎŭüσ˙3Sü­÷_ŠoWĞN€;Á½ï]’ ħy)M÷˜ĤA݈Ğ`ŠQ“g¨Š`ëÓ)f]3ó  f4€$%ßiöħ[żÁŬfôŬÂwbMëŞíriä˘ 6Ÿ¸V+˙^dI ĞEµÓŸİ·WÓqÓµÊ֘ġ}–Š/T€XWĞnX‹hşËZ· ˘Mg‹C{.Kµf`Lïu–0*]Ġçë·HiŸëüŝ°es=ë/´ğ›ş°¸NǧǀóiÄé4b r€w°ñòé1ġžŜ"İA·Ş'"ƒˆ|‘Ÿˆ˜üÔ§ +{C¸3à À½ƒ A§÷zÒ[7 gF5Œf88Ñ"2y˘ëm~óKÉü–ĥœ'ĦÉĦv"URà„Îír@Íè¸eS3ÄÚı4ĠßjÓ"Y?wĠ·gJ3í'ĥ÷N0ôĞ€ïÚ½µżevı:„Ġ$éDÓu› .BmY¨Ó}d­ ƒŜžĜv³ü ċbŞĠ2;/mF*j÷Ħ#,Ü·uPÌqÄé8â| ñëÚ{Ğ£BÇ$E 邋nU];„QïEä|Lû>ÜÊĜ0x3ÀĤÍü™WpÖ4~2€FÎf5Bè¨ÀƒVv•­krċPn]îçÔĊOó*UÛċš– éŞšğ]:9?O°€A{ċÚĴÀĝ´Ĵeq•˙Ic_çáĵ›jY]™‡ŠoġG²ù ½°:ĉzz°Ş-èġ,Ûĥeö2;Ŭ¸&Ñ6€ZVg†İË0éċ=£ò™é…ÚwÓY'*sĞ…DífëvĥFžQcѸ´Œ²ċj8>Œ8NÇÇıaE7ïbˆw1°áTzŻSÒĠp*I¨égïy'7&-ĵ‘ސœtrXĤ”!ÁeT`˘5¤À¨Š£GŽŞ›‘hÖ]qnTèL²Öٌ/È|ġkŽż]×nşVµhiïÉlx½fóëlħ*ëzxËÌûċD½ülġŞ{ۍŞCĴ]RÒĜzÑÌP$£vFĜv(y'š./~V×´½·˘ġ“­úĥŻ)\ĵvˆµ@lí‰IŞI˘D.ÊzUßï•cëí>L~àV¨ġqĥ&<)“*޲ {K™`™·dóÉ\jµ Êê†+´cy^smeµ*)‘Ĥ-wj,q"ë&ÖĴ`n:›w\/š[jñı§SÀˆˆ rF×Àhıx8ˆó%„˘…t1÷Uí¸ HÎÌÄ%w–6ÄRVS*(.߈’ö‡4EËek(X V°¸GtžµrÓŜP ŬN>şYn…KQorEô.Ĵ Éf€“is?ż¤“ɍSUt ˜]ÒħZJE< İ*rPGšıÊ1ÚĴ.ż+ïaùxBœ…ÄML Ô°Ċ„ëĉûhñ|`—zĊjĊŬYGX‰— éuS\q|}'é<ċ=˘9wÒUgħO‘Ğĉ‚´jô~²âćù“މÚ%‚‰w“[Ċ2Xrua)›İ²°„|L˜*ƒÑy7ıe\m…D˙ƒ˘š˜aq%û<³ÍıÊm•ûÁƒóR|ĝޘoZ̽ò™EĊ‰ĵ4ö“İ€’/‚ĝ *R )ȓw~Wĉ§ĵŞ­*Ià-šhƒ‹çjsÎÌ Î— g8K”HœĝŬÎ"XÀV0˜OŸM:1@¸×\úì%¤Ïĉ>~Ĉ2*LNĦrkì¸;W&b—üƒĤˆĠ4.$ n¨ÊܤE †ÊŸİU…ónÈ&Wz/‹÷U\4Ċ€‹ï§Áâg@\^UD…Ñà遅H,=kşé5’Ÿ;ħöò°tžÚ FĊÙÒNÉ0ŞP,JVü&tו †ŞÌ,án  #ĝ4@ĤèQRŝ„2Ȓċ‡8ixTuRS\¤jħTœ4hñĝ”IÍ$ÈÓ$ %K@ĤĠ}m”ğÈ̕#ZI¤iîÒ|­!wST_t­Iy-ó•e%RYSS gˆƒs ı>y^ŭ ÎOƒ[bÇM|´,Ê{§÷Ĥy![2DâY*fÔîÇ`ÎI"·“™RĉĤÎ+YC’ïDìàX˜yâ×´B˜`9YrĉòE,MM–Ħ)€ù¸Ñdı¸C<×49ğ!^/ 9Äs‡—2™òŬÊ>QúlċŬI6YâĠž‡À¨ñqqÀĈ|˙Üŭ4ÉZzIÇ5 lL5̓Áıô~°bAa 0?Äó8j4N£ƒİBÇşE|ŻÔĵ˘85G<>ŒxütĈ8jOuwé<°$-öt$Œ¤>”ĥÜxóZr6YàġŝìI p 1âîôċ—xĝÍŻñ £F¨òDœ“_uuχäÎqĊĠ’}]µö‡Kµ·°A§%bE0Kħô->™Ué|iômɐ4ĞU–#ßlîÚK“;\ÜċYn^ÏržÜì°ğ`lµóeˆ ‘Ùñ8ĤƒÖ™÷³ÚDOU5,X9V 9l>żŸ%XVı`Ġù֕%µäZ eBËà›ÜƒÙ§À-h™àg¨ î(°ól—Ž)Ĝ|/F'×ĉҝ[×Z3›ÜÂĞPüĵP‘jQÒµuÑÒtùıùó_Ŝ·ÈáÏñ€4TıtjœÎÑ%>üè÷px÷ÜpÁ&2eyc™È *âŭżùï§żŝw>XXŒ•U½¨h=|{Ĉ§3B°nġïF‹İEC€;Ó:"wĠ5÷‘ĤĥĠJO²K(îKûdñċ—xĝçüg?=}úöxú‹qż !<<ü³ÇÇÇż<ŸÏßbŞÑh„fpZ€É6³šŽż“­żi€ˆk7j×1ĠşÇ‹¤Ú!‡áû÷ïB8}üħŝŝï~qÀ/?‚ß~uЏOcrĊâŞT?œe4-*dqXYġ-Iü}sİŝwŽÈÍ÷ V;¨Cp&Àé„ğq<‡ñÏżŭöÛ?ûĉ›oŝüñññUU)LĞ€d ĞɞpÌ-+HĥÀµa9NÔnêYç5€òŝ,R Ñğwï~¤Ş'çÜŬ³ß fĝêĞ#>8}d^×îyċ0*›ˆ9_˘R˘a9Âh!]ÜY4”ßé"”´s)|ħĜ /¨Ïçó׏żùúëŻŭĠW_}B >µdĠc×i˜6[Oj­NQÏ_½ŞtŠÔŻE†˙ĝǧaïŜ½ûZ ŸΆŻOÁƒ6ë÷½^Í7^ËVßĉ áԛR/˙¨ġoi¸ĵ¤b) ­TN·R´2Œfv !œÇñáááqǀÉmWfEWž '/ŜqĦ¨ĞïˋI蜈ĝûûû!„¨ŞAWŠâÉà`çP½ĴŬŒŞ¨ÄY˜'ġĉ-¤kÜw3·×ÒjUÓYÒ¸ZİF :Ż8WYDġ÷˜Z@²'‚Dž{‰úäZ@Jc%ˆˆfĥ %µ-‹[³Œ²k.'ó†şYġĈt•ëĞc=2AVÊż, $^­*/a”Çj8a%ğ§X;Ü3˘ïqĠL<_üìóšOD€”à YX7cċ³ ħ²†“X7LвIô„IşrÛMĠ‹I“k‚ìwçħLMħ|–_Öĝe!="òÂßSÔ^@r ċQ3³DR-ĤAà‡poFİV“8WÊxëĜ½i ÉŸÛ}~): ´+N‹LĉLv;D+éÒW HvH{A‰˘~(ë((Vġ‹@ "m!ŸR“WyFz0޲ڧBĊŽ´ö˜¨S­ħV×SCĴ~ğhÎ ƒĥà6 d(½ÎkBQ—v5€´‚RË%­ÉRRL4vgĥ[„ÑĴµJŞ9–öÂh"HO³ŒV âĤ…^İĦ–“ŜRµlQİĞâ[q=ĴA´’Ŝ½„ġ]/l2„Z.ğÚ:Jë7Ѳï*°Ĥİj·£ÙĦ4Vk÷B+‰@zı,µGPz!Ín:™F\~4[H K)\€ÒSŬvġÚ@$•Ċ³t×Ġ÷ĥŻĵ RÄr[sv<ß(ŒPŠBšVj viıbŻ„Qç²e^…;[FĠŠŻ†% ġ‚(êÖ<µe´ċŠÎ0š…}ç "‘ĜïĞLĉv#0šžĠÒ(“yHÒs4ߞL-TmVĜxÊ{“ŞEs3Âné²ğv/‰˘nHÚ°Œ–ıu19vv˙çZ‘°ŞÒ­ÀhyĴâbN•2Ŝ›@ÚAukfĠé7‹Ġżb‹çüÌÚJB?şî·&ê†@´Ò5֑4= cıġ†ÁnFKSݎÌ`Ü7ô\ŝkÉIé'$ıktî''ÙŸ5ğĞ]vµ;.4,¤^²,ï\êÖ-$WİĤĞ“ËNgyHÄè4½QUÏˏŒš@zħTĦ†RİA}‚RâP ¨j .kÙġĴ¤:ô›˘ö€Qeä>ÀM+j ¤éžS˜tr‰[‚ĊíXF(ƒÄ àìĵlĊLH/0›–÷£%X9çrÓìYé şÍÚċ‚ĥ@ Q7¤ÖwliĥÇTĈŒ—XÎ Ĥ7£Ĵ 0@G3´ïP3DםV>aK.;•{x>Àĥ˵`E Q· ¤Ú2ZŝŜ5ĈÄ<˜H1%˜ŞŬ&Œ,ZH…ˆKv´¤ÔÌĤ4óŞ1’C)UP%ëh +şì¨[R=.$&ĉĠĉ…\uÇËmHÓrw‚VE0)é²jq4Fʔš'–Ž›ÔÔVÒô*ÓmGŬŒ ŭ€†Ö8p­{=ĉüV=kèÀ¨÷Uġ5`pÀÈÄXi/"Ċ Şg“;ĜĝĜÉeß]5Àf›´ŭı+‰şU-£h‡[cÌ£AGĵƒxÀ4Ü&Œœ›^1‰@ډGŞqsU-q' Ż Ŝ;è:€Ĥ˘káD QŸıêŜ^%£ÑŞ8Ĥ}uy”^1Œ~MSi>£…D í '‚ S£Ú ÉMó“Ĵ5 ;·í&ĴĉC˘MG½nĊrtSë†5ÔÛ{fMËèĠ¨œ™B‡4‘¤$FÏûċâœËKpiĦĞ~ç<¤İĈIü·[Pğ°bĵ¸²Ìâġ§^ŭ1ğĈ²żŜê/%ıä6aT˙úïUŬĥ•5w۝C nšôíF,£É½2=6*+5Hğĝ#RŬşœ5>•SXjôQ0ǀ˘vWê[ŬŒÌĠXX5Ġċ#¤=x4µ™¨-¤ċíJQÔ~öԨݏÂˆ‰ħ!5ôäü@ í26RdjlÒ'’›öM–’ŞAıŬCQû şT:HÄŬŒŞhş ıĈ%?SiqĞ —}$‰yGĥşq…•ċ)jOτKîñnF†ĜñÖ,ĥ`_E =w`€Z´‚Ĵ²š ‚˜³ÇJ?µ›ĵ+iâÓÓ­À(ÏÀ{&ĈH{ƒi*#TÒÏĠ`.\~(jÏD˜ö\r/Ħ›QŭĞPÚI[Éע¤—Œ îA'+)7ì‹?2 ›˘v[üùœq^íżÜŒ`)¨a‚×Ĵҋ,vƒ-ıR½â) !ZMܸ¤¨V€†£Ón Ff­7` ´ïÉġëòšŒ­îTŠ˘ž-­*eϊuŬŒä .‚Şz9E ½äâHn-!u¤èQH?h²˘(ŠÚañ4 ĵFġ [QĠȧ󴏤=”ëFŞe û–ĵˆ“œGQԋĈ›@ĵ‹ƒƒ%ké&aäâÔ0bŠ´$A íÁ¤’¤³Y×1Èô˘¨—ĞN†[Fv;0²8_À;ĉ H;ŽR¨Î`Ôiï*B ‰˘vp“Euì‚tz­18#q ¤]ĵPÓ) ÁP +BPZHµÓxï !WuîĈ,#›[uy^\İ\NH/\µĊoAm‚ŞÜ=҈˘vk–’c¤Ŝ.Œ€˘;Ġ³£¤—z²kÎ02Ġ”‘”B\QÔ>fRĴÍĠ\Ŝ ŒÊŜ‘‚.iżá‘\sµÛ.ö8‘R£J•=O(j·U Ż\·£ Tó$Âù@ÚDžR`Ô¤O‹µ,–ÊUÁ)Šz錔şb:ÙĴ¨ŭŞaT~Ày@•iInÀ—ï?›Ŭo‚*Ċ€yġrċ=$µİBö­Àh:‰Ô"À 0]úÒ>RvÑinԗ ĞĤúTħà*kUQÔ.CN§$R Ŭ7£iYœƒ‰§ËŽ@Ú{”¤ĠšTÁ N˘›˜0˘¨Ŭ$NĤd· £ÊĜk½E =€ˆŜĊ†Şˆ™A$î#HµÓÚ/XÙs1Ġ›…Qt;êT““´@iiöÚš3›˘vu^ĉ%Qn Fq%;uÏPZHÒnR íÎĠŭÜZnvB‰˘vƒQK9ÚE‡× £şJCNŠuž,´ IÎ`KĠóíĴ!€¤=NQ/÷G¤ïç˜Té·#[‚•œklAA ía!.4j#÷6­#ŠÚ•Jâ<,„ĜĴoò}+0jE ½hlĜ”0jj%ÊN’[Ao:ŠÚuİBĵğ™=£&ŒT#PVú&öZĴĊ* fU>Dç\ĥ˘èħ£¨}g%÷^ŞÒAß_Ûñ,£œë6^ŒZhà%Ĝ–*5è˘Ĵ– ÌD˘¨-$ĜÌE1Íçߌ°“›.E%O‘V-¤‡ır_5"P ÀZvµ“Äğ4âĴ~s0*+Ùèv´Ü €néċ£CR–d aiÖ­qŠÚs ˜˘ˆÄıÛ´ŒÊÜ÷‹{…ûHÒR*™ WkH=NZ‰äE½„HœĞjĜŬ ŒÌ"Xš4(éċƒĉĈRu×ZŞoǰoŠÚFèRĝ·Ü&ŒòÏA§P]ê*1¨aS’B³ċ­e (QÀ+›˜SÔTÒ4ħ/[ߌJ ñŠ$•h!íd$Ċû<֛%]§Uo5ŠÚIŜ'yŞv0š[zħŞ BhgÖSÒ³€$ÄV7ğ Ö¸ Ħ´•(j ÈÂş¸1ee1Y‘@Úkp˜ZİÔPŬÏ1 \˘ÓÛ¸úĦ¨}´ì%ŬŒjċ †N ‰@ÚE">ÎKvm§rB{·ˆ€ğ–µ×ŒäĤ ½,o FùqÑ¸ĈöÒN&4YHhS.’E™ÄVĉ\ŭPÔnC.­QrŭnF@)$ù|(éĉ‘ˆ` ħĤŬ´Y9u-Sµ˜C´ŒĵƒġĈÖĞ…‘ÎND$ĥc×R™"^¸Z‹yz’jRÙt/ ཰Eí)“·cÜOşIĊ ÂB€™r~ öQHInŞÑ='•kNœ Œi‰˘¨ŭցÉÍ%ƒż7Ÿ/ˆbLсô2ïÌnpM€2:ĉNfbSԞ0*ċƒ‚uaŞaÀ‚Fë¨{ ôœƒX ûĥè˘3M֒>µûĴ$À¨U[ĉƒQzsI–‘ˆÄs˘¤—™H1I4‹ĝIûI j ¨5ĤĈv"7 #°1â˘Ä•+ôbëH#pÊÚF§;Pë‘‹ŠÚkˆÒ?¨×ÂüU¨rÓċB˜ħ ?Zé…CCޤñŬt–˘Vû(ŠzÉ20Ž-­˘Óìĥ,£ #qŞöÍD$i+)şĉ4è|ÏHò½)\üPÔ^Ò<éKĴÚpk0Ş4 11ÖÑB"ö€‘ĊHğh)tÙ5Lx£¨}ŬˆáŜ)à5ÈZ–Q9WŞ0ÛèD!vñÄoa] żÜ`ŞtÙQÔn’Ċ``ŠL{0ÚlŻn@S‰1Z ¤Vkf M5íŠKÑrŠıĵLµÛ;ÈàĦASQÒ„QŝA 2 ñµeG ½˜G)êԕšÌV:–,saiŠÚKÁ c€x7ŸÄo Ff0ïcƒ>ñÌC"vX°ûQ5nLZ éHĴĜÀ›˘ös^ÖmżoF€9_…|/\ŝôĵÑQ-Ĝü.p˘DQ;ZH)Ü[µDÙĠ³ŝMÀ¨¸XüÔ߉“ÄUx ĥp5-ÄğLdá"V+µ)ŠÚAµbVí[_?Œê†ˆê #ZHûZIÑ]§•Ë/SRy`ÒEí˘Ôƒ –êżÙ ¨:—ÉíH(H/^­òAHÁ ġ}i€“”£D‰˘öóJHZé…X'ċĤ`´|/çÁÒAÒnW'ĉ·ÙdENAGƒŞĤ*à,DQûx$RQRçcqïFĥ#ŒÊd ŭ“ ¤'(ıâbğ‰´×šî-ç’ĠÄòAµĞÄ{@Cċ²ûž`„½,£˜!ˆOùT´ÓŠÍĠeLê’Ay/ ´(jż1ëG"XŻFġ‹ċDFĥ¨!vYŞMûFV’ĈMĴc4´Œ(jWİêÜŞ¸I÷Pċ4K íĞPċab¤üL—EíáŽ05ˆ¸èĥğeċ‹îGÎÒË-¤Ċ•²)ñ-GŬĊD—Eí6àRŸˆğ=ͤˆÎWЉħ[ëµ*Iϰˆ “…Ç›˘öw!¤rpħböMYFÙË/@€…‘0˘…´›!BÇËĵácöà9 ŒĈ^µÓ€“’³c¸Y7!ıé↔†DŸ´‡AŬĉÜĵvpž4µç ‰•QfĠġo Fċ7X5.[ ¤}Œ¤²_Tz"A\ŭ›‘vµ `a„8wÛ0Ê|—}úœ$¤=h¤XTüŽƒBCL|So6ŠÚgÈM^‰öž #ûa”ß;W-WŬ(ÒnWȂÁFƒsVîq—Ş48'PF5PÔ.+@qp1ìûÙ{FUà# UizP¤ ÄNħâĉ7ĦĤıEQ/q ĤèmÁ‹ççĝ aqUiġZJ²6S¨U{Hˆw1ÉlÖi™˘¨—Œ9ĞÀq£0*‡oó&Ÿô˘ġš8–Ú˜—{Zm §ËŽ˘öÀŠğÁ4µn@Ûúxí0’âğô@ í4<ŞĊZĥˆ&ç‚ĊĞǖħµ˘…”Cí6a„İ%ij¨F7 ´§ ÁF<ĠjgċEíIV-çA ís…âêkTÙ*gÊEíÇ£Y„ÚMÁHĞJ ùĉì@ íj!Ċˆ:Ë”YÙĞšµ—¤tœ“Àž#û`dĠĞçĉ|téHğ­Ö`qÁĥZĊ&ıKo8ŠÚg¨ħşÁ0£4µšBÏ•@Úkıĥ(AUEÙİĊ˙Ñ6˘¨½Ŭ´ÈĞ#ÀoFıRƒl tÛHğK-•ıuyZÁ1“˘vpâ=ì|Nnò³Œê§…ĝi!Ò^ŝÌz†ċÈ;ÄıyUbŠ˘žÏ#'°ó˜ĉuıQ=0çb?$çXʎ@ÚÉ{ qh˜‡|[)o‚˘¨ŬĉRݝĵëD̽ZċHÁìŞ3.X ¤½.T7[Ëô$§¨×w’˘ínFċÇĜ˘FRO$ÎÒ>$cP˜é|cµjDQÔ^NĤĊŜ­YF³s‰]vÒ^îƒì9œyîIñ €ĝX󎢨ä] ¸qĊŞÌPM+VÎÒÖġ\|70²`”ž7ŸSN­ÒNP'@°İŸiܧdú=EQ/WkËè{ƒv‚"Œ$3pĊJ íĥ`Ž–üÁRnLKIħŒ°£¨=g$ >YĝžÜt;(˙Mħm E íeİA5L…ż-ĥŸ0V¨=G šv\äĥ`´^ÎBM'K‰"^dıX>^RÍş’N`ñwâ$nÀòf£¨=W‚FÉş¸9ßBŞX.ì@A íIĤXÙğ6†ĴŞòÍ ;ŠÚÏ@‚ó°Ô1ö6a„xüùß´¤}jï1ıĉrĉx²,Ä;•UA(j'Uí'LuC̛QžÔĤ$NÒNĉħ<¤`S7Ëz‰÷Eíĉˆ•ĞHğ[ƒQ™Z˙>ô,+)•²q‘5î¤=˜ò~£¨ŬĈ\°):ía”:L`eà´qK-ÌSL¤`p>ö:f£¨]`”€caŒI²·£ò"ġ эr^‚íÑWk1˙¨ÏqŒ²£¨Ŭi×…QPÙsÖéĜ)ZH/ĤR˜7Ù2Cz,Ŭxĵ×(jŸÑĤ1ä[œ_XvC0JŻ›Ğ•3 —@ÚE"Ħü8s+b)!I]Ši%QÔCÎı…•tƒ0ÊRž,X­@ÚË:²Ñ€Ô /{ —c­*îKQÔK‡œ-òvnÍ2*Ĥĉ“'éʅS%ä;߈EQ{ĜHÀ˘ëNmÂ(IòB–îi?#)Ŝ´:żùIvbPEí6܂ÎCĵlpĉµ¨~Ž›RF(é0ŠĠpóÀÍI²›~dŠ˘ž2Ŝb#ÌÉĠus0Z$N•­06H{xÄ ‚*,ġDÊ÷[iE!,œHQûA)ğ#¤ŠRğËhn ™ê”5ÏÒAÒˁ$ Ñ2RLnLÌĤ½$Š˘ö áĵ(rc0‚KŬoށ´ÇĜHEU+Ë(ßÀâ8W?µ£[œ›ôĦŒ× £:¸Î9 (çi 2xX –îğênóıòĦ¨=0ƒ@”^3ŒtF£Ù~‚@ÚK:Ĉ˘ŞâsËòŞt‰,(Œ‹ŠÚw˜›…ó+vÓ­+*Ïĵr⢵‹D"^zqJèiĵħLŞj&‰Bâ­Î)Šz‰ÀıĜà.zK0Ês†¸äfĦ…D í16iµ–nÀ|* £–è:q4‘(j')ıìܜ·£ş—ö8ĠH;]5nˆûGâ’ß›˘¨Ĉ›ŭÚpğ0* :§FžĴÖ@ ía!YŒĤs"€_TġNáà6²REí7èòÌäĠġġhġaë i˙˘İ5‹Ë9³¸ħ)΁˘¨œsi"—6 nFâ?€•\¤ŭĵK—ĜËİNMúDâžĞÎ9¨2²˘vrM@ÄO0ı5"P9AĠ‘HÒ>ŜKyF–M˘üğ‚qTxħ(jρÀ,Ü&ŒĤ%m † `}1i—•Ì ƒĞʘX*)°SÀ§Óț˘öR eĜ÷­ÁH\ a÷Pĥ  öâcďĝ)ŸÀFĊ¨Š˘vw"Ĝj7ŒlOË(ŭsİPƒ#¤—K1š.ßcU™ àáaŒûL,JQ;Ñ(3äBߌ°'ŒâyD—£ĊŞß,çr•^‚-"!çé-ĵ †oż9âbż$b˘vs!Îêj· £òNÑ£"%jIÑBz‚dš*2˜áĝĈü;ašEíi!yżnp30Òéaq€ŽÓρôbïĊˆ:ñ‚ކ˜šóħŽEí5ÜâŒä˘eQWú9ËS•oH.<Îҋ½ÑgûlE=|;N÷–ƒ(jOô ‘Fû‰[Ñìċ,WDZĦÖù7ÏŬ8ié XI 3ƒĊéQ1ŽS Š•*ܰ¤¨l¤è·Ü1ö-# Â4×ÓĠsK =c|+5 F`);ŠÚÉ%‘W*ƒR÷ğ%U/&nHç%½#قԛ›ZewזêÖ=>ŽÓ8˜´gP5b˘vƒRв3-Éè+ÉvRëe Ü²à‡ ˙À†şSlĤĞı ŞRž•ÚİÉ%ܛ´Ĥ8•^a%crĠĞïúx[;Ç(;ŠzÁ[™)ÎCœïpä0Ê@ĦÒħŒìZËHĤ΍ĝ Œl*cW½€ˆXµÔMÍ}6µ½b<|SU+֍AÂĞHQğI Ĥsî M@0ÉJ ˆú HO*_fËçĜêOÖ˙ĥéeÖF™7Ä9À ‘o64TÖQ+ˆáMC‰.ğÍÁĞ1˜¤HğÔûȀXŞTYɎ˘^j•%² hšGL>şóœ”Úwĉ“{ÌÒÑŞ^KıĉÒâQR%L}—2Ì­Ë`3‰0²P RŽ‘TA FŜÎAüó4Íş°’–ӛ…tÁ~dëÄyèoŝWüŭżñvĴiP}Ç ,6{ğR5Ùúƒżm'—ÎAŞ›ŞÚ){¸{÷ñO§ó_œN§ŻÎçs’˘Ÿ“ô&÷¤ŽTĠ  .şĉ0™Â;Áı˜ôxI>lŠ˘^tSÒrö—lu$<â~˙Ÿ¸˙Ñù|>˙ò|>ޏf†FXġTïTÄĥráÁ9j.…tgÈ(€£Ş~Bĝò|>ŭĊ§O˙ß׏ŞZ[F­=%ZHԒJџl§ Š{ïpSq4À tÔu™|Š˘žg(ċ6¸Œ°°ĦÄ ‡;Ĝáà;?ŭéŸ><<üê|>?¤É}Z½LDmÁċjK~­  ô˜Šˆ&03;Ğê£Ş~:ŸÏß<<<üúáááÛñxÇqD{İe1¨Ê.Ä ^p'ÀspAx‰(j_ )}iÂŝ.Ù5;…Óé/ŭöÛ?ûĉ›o~ùmem ²VĴ$ğ`1ġ€PżV ˘ò]D²;tÇñát:=ÇÇñx^¸ìĥ˘íŜTp´yZ 5ġj¸ğs¸s'÷N!m‘:aŽ5E=kÍ's0(Ĥh5‘E†>½ŞŸÂ8~ġĝĝĝċ7ß|ó—_ŭġ7ŞZ20´šŸ@pĠĠP*nşô³Šˆĉh: !„saÇñ TA O ˙ìgé҂mpi+Ipp‚;/px'µX­-Ì)êYK••’ƒr^Öċ€D$GύŞz !<žN§‡OŸ>}23]LôŠë\c×ZJK0µŜŻŝ Ġ÷úkëĜŜŒED =•H!†Žĵ½×ŸBtéÑuGQû9Ġ>mX$È"7Ċ”bıT.²Öd L×İe½<JġF0H×K“ËN ƒpp1Şn4ûAñh …DQ{ÉÖn€ĉSrrá‰8Xj2”‚4A)t&}ŬaÒß’u€d `Ġ lğî>ëɆ@Úˆ™Ú"Ô08à0ĕY€àƒyñMQ{Érşé9&˜–-!L–“‹ÉŞ9ÌşÒĜ˜ô­3ñï $4,žžµ¤+i+ÊîÍXJÒĤ…„ݘ°Ċ}¤AÎ Ô ïï~ġ023–˘öRŞÊpž˙BÜ<,|T²Â`%mYK[–ÑVù 7#éÒâŞÌJŜ ì`xŻÏ ħ£¨ŭ`d˜÷$Ş+$ˆ‹µîLcEŻ*ŞmH-è&~ÛӖ´µż´„QïX¸‡DUr);\Î œĵwƒŬ£âÇC£ġ1EQOfQZc´„jw]ü€CŒ²ĞJôd—]JF]„ 蕓ŝVûñ§XK×Yĵي ҖvŬùĴƒ‡:… pN08ˆ€‰Hġ\UÒTR|ô“—j UEí”8+"V[Ih‡Y_ğoóԉż—7t-˜zVÚÖñ0éM”1U†“ާ€“x8Ôw6xÀ6}µ” SC¤Ti޽é:0şĠöÔ½š­È·-k§%€eƒ¤Ğċ\ıGIóh.&ÄÚ¨pƒàîÀËHQûx%bŻ˘İ`ħM{HnÌ X=]–{3Ë=¤k­¤ëı $\%şé¤gŒr[‚O'ĝ88Xò*xFÙQÔ>R›şĥ.ÛO˜Âd@îù÷’JrĴ6@tÉJziê|Ħ-WÜ50zs€".I|ôWÛ9àäÇÑap†ÁBj xïÓ>EQÏoÎJ<ÓĜR|6#KZ%J…WğìZáĠK(ġBÀŸb=ĊRşd9]z7e-H›·šÁĈĜƒ§£âƒS< =)pïá½#(j/ ɐÀıŠˆÄ•ĉzÉ:Ş'ñ€ëRŸú} Rv¤zz[0zS"ĥy„Ô 0§³âx¸NÑv ¸v”tŝ-m[ŒazÔçâWĜü÷ĥœ‹ıu×ĵ‡¤a‘;MìÒ% ='1ö9ÖÒpĥĴ!5PÓHï`N` 8àqTܟÎ ĵ0V,$3“A*‹ÇóŜËñ´ĥ¨Ûƒl,ş¤ñœ­UàTé{9‹Ĵ*£,šñµò~.•íyêÄ˙”³×Âĉ͖ "žrçKacgĜÉp:À ç]z—`oPÖ˙60~œşmĞH.Üëŭ1˘*1XÁÁœ‡ ÇÁÌ:²XùjŽËI¨×ä"=kšx´"éz÷Aƒİb ŠYqwgÀ)‡ğhI.·kİĴ¤Ö÷üċށGž]wÔçc%]Z˜­= Ş1ˆ¨ôŻĞ,' € q ĵbBşĤ’½Jú>`E Q‹!Ĥم`oĜñl¸;a|9[ƒÑaÚD­Czœ0˘>ċûZŭJP*`Ò £<àĤD¤îj·- \_%áûè=´ùšĝ‡X~˙‹_üâÍßHÒ֝4êäcÄœBÀÑp££ÁŞ­Ñ…uTƒHħ X½ÉJżÔÍ ıĈÏnj*†ìĦY‘ĠXË.ZK lċ˙à é{m†W‡"ž5ÔÄIìPòŠMœŽ ï$8¨Ì`$fĉ:ÖQ şÏlm!q‰şu+Ém@hö˜™933RY?Ş}[c]ÑĝÚŸ€Ììùe’˙èŝˆwô°Ñ#À;ĜrúNgĊÁx5h*ÀZı ä*÷@ ×1íiQŸĥàä¸Ġ’…iáç œ§Ñá’óÀùН–Ï̊z Œ(é{‘™ÁNı*ĤÖÉSÄi4ĝQTgħ@·ŬlO+‡OQŻ Fh'}ù-Ğİò(L]b@×£Au^^è ™tË0’²*…™ÀlÚS/Ï8ùô1 ¸"ŒêwÉòLĴÂÁCŬ0zûH[_ġ¸‘j36ZHı³v£¤·1¨ĉ ,uŽĈ‚â=ÎX^µÍW|ùkkV'ĊÒeGŬúĝÙRËJr‹ŭÖioH\Fn‚•)̌)äÒb‡X8Uĵƒ+š pˆĥÍù4‚;ç܇a~ôñÇ/4êœ:YĉŽ–êœË˙VçœÖ‰}ı&WU›‹˘nĈ£P[:f&ŞêR‚33§ŞŜÌ|ú·‘áǏ?>½÷ÜN4‡vÏvzbµïXÉÄñ˘HŸ˙ ZÚ2f3ĞìKŭ ˘€žĈ³Âü0üÖğwï~×ÌÂğwïŜ(Y@(Yġ„uëcg5ż2$݆”żğğûâŭû÷e†Ÿ{'ĠĠäÁÎöO $Ş]ĉ0ċE'Ŝ ÎħÚ·eAÚgqħĴv0‡ż 1„ €ħîh™›‰UÖò{E=Šş)_B Ĥ™T§CԀàs?şğğûy;6”nħŞ:FytŬvPǁt{‹şċżW։\´œgĞŒ$ƒX ż˙˙†?˙ŝëñ[Îı‡/Íì(!yDˈúÌĵ ÒT0/"ïœs?‘ûï<~ŝ{÷ĝğı’Ĉ²sµs˘”ŝĤ…D ½(ÍÓSr•†˜­“İŸŭìçĝ·ŝóżùwŝàgĝ΃ ŜÁħ£Ĵ3 öú“¸‡˜tğĴ>Yĵƒħ>\~Nú UU•ú,–Hġ X]bKħ\èĉĥÑĠšÍĞ,ë²°DU…Ùlŝ|µ”C’~†Ċ:s…m`˜ßÛŞò1‹ta³yŻ6İÎÁf5°}QÇ2ĥR”šĝf/²š}W•§ggÚ½Ö½mqR‹Ĵ/…Tż³ÎMmOU*ŽHJ—ê3Nu†U-}ŒZ*Óçû³Ü’ ¨Ìr¤ĥ!(җaFÂ-!17#ŝÑ˙ŝĞxaŒ×iò€áP:ĊvNÍ÷"^'hä êßĵ!DpH+9<ɗ_Ÿŝï˙àż‰ĊXï˘UċŜ Şĝpïqwp¸sNà½à0ĵˆĵs5HJŝœàÎIl¨šŞG¸İĴQéYû6ċ ²L(aPÏw1ï0·ĈĴá$Î8>]şR˘ŝC›:w†Ea Ġšú‚Ĥ÷A¨Ŝ#O~Ár ê9òû `Ac@‰Ĵ\Ÿúŭ$şNĞù.½ß ‚éñ1ŭMZmK>^­C(˙D<4÷àÉç–Aœ'тÖ9dg7H²5Öù÷Úyġ€éZÏ^ĴjÏP.}z_ly£ĉëïd]éÀÄĥ%§Ĥ Š˜{w<84Y*1%"Ŝµa‚a Š1Î*8Žç€Yq<)FMçË˙ ğét<ĊóHùG%WµÙŞ…cPôù[Ió°k { ÄÁ$mĥĉÁì:j³ÁŒqB8 Dá!ĝĉÑG€/œààƒçp¸óÑzR…$(Üàp÷^p—ż^ï]œXó U‹‡™Ëó[:ìt6VO€ŞÓ¤ċbó‘ sŒkut:çi š–żŜOVQ~[M“}žÀóÏġüçbçÏ ¤ĥĈ½*Ìğ%+ÒûÊ/êd{Sïo5¸2@ŞÉNĤT1Kç ÉÚS„2Ñ£´ÏĈÌ °YÓ1^O™ċxBê­ÀBˆ{µUĴ­t âï‹uäP¨BÜOħ ż1Ákaċ*#LS„r>éŭsݞħ÷÷¨GĊqTg8Ž2·† âÊçŻaH‹”hˆVn+ BCy|Í}mgVŠ@zşĜN¸ÜìfђµĤ…dY}ĤÁ'½s€ÀC-ú'ܝGĝ4•Ò7ÔÇd!Èà҂Ĝ jÑĊç;'x78Ü‚ğ;ğƒÇÁ xXtŭ9)î=ÉŬ63¨B²Ž*——ÌĵMɊJóPüÛÚ ¨Ş-—}’XžœÓġAÌ6 µğİr]ÉT[ĥĵ>Ŝĵ?­´<‘ĉ@‚WZħXâï­úı°‚dñx 8Ğ Œ†1„ık2}ŜĥÈš>x_Ri§İ‚•U0²éž+4ƒÜftQí{ D„t;{Hġmè˜çT-žÁÒSâ·10;…²²Ġ‡q½w8J‚í”Ûd1˘§ôûo+żw‚û´/uHŬj]Ŝ*UĤÉpµ—dŬ3·™ùÑĝ›EÔûüĊëXç2úŻĠŜ¸xLĞ×ëm¤T–Û5ïc­^îóôb";%Ñlóĝ:ç;÷}bkdğ÷¨ĦwJË?ĥ´ïÌl §1à|8ž´żQe­4„†ı²°[£Âĉnş•sÜC̀eìQğġÄġnyŠ@úa#uUxµÚ q?E$ZH³ÍsA’şĜµ²*Âl£î„aùĦšÜB0|:gĝ= şħ{ö„×ژŒ­;Ik{ۚX›p³'˘\—ċ|}:ĥëî•ÇÑHĜàĈB£u] *­ÏuxځÑSŽqöNU@ ĉCĜ9`zk­$Š@zp’ îğĠÍkç´ñ~Œnñ˜—?K•FşĜ´Nèu’,'x™"”ÊË"1°‚]ٛ˜éòċ*ך4Ğ䪠™ŸW> “e$ĞFԆĈ{HžĴdg|´ß[V•ŭ×oö–ŭkU"ږӔèêó˜)é&\uunP0³ħxβûögÒPƒƒž\Úp·´×"î;…´F× ƒŸB~OĦZ]Ĥ('qŽLûP1.ÁL2ĝɝ‘|ïĉÑYê<èj%J­üKûgÑC4íI:Í{M!L{Nù8‘/Ŭ¨!.Ç.Ç}w€pä²˙‘:ò9×{Y’ÀŞ!>o é"¤}S²gÚßÊ{Fċy'ßĵOTEòYŜk˟\µÇT½§* ڋóÀ8N0šġ ÈûMSŸ<™ï3ùaşwóżSpDÙ£ËÇd˜à‘}ß~˜Ú‘ğ!aĠŞ@•t]ÒŝRi|_†û¸W @ÍFŒ–taIk‰@zU֖U”{˘¨Ş3;İê'Œħ<û0ÀFƒ¨ƒ;ÄIKĠà‰ 5…#8)äašLCZŭyĈ^À˘i{WVÈv—'I!ÑÑ F×y4‡Kël?Êċpéıjħ_°ÊĠècyƒöâ ‡iB5T“yzOKü}Ċ3Óa(€2X‚…@ċà+HÄÉOòÏA§É3~„˜÷bÎÈĈ4 .6ÍĦá\ž´CšĝÇ4Ïĉh²ğòşpħê†ĝğŭ Ĝ]š_ïâß&`YڏáCı›4GٙÁÔǨ:çĞÀƒÈğe&n<2 eH8îbtžs1`F )`˘D)ÊAÜ} f‰^Aàòî0›”và>EVá™ĊÂ`°iCüˆmŞÎ-ŜOÂX€ïġa jÉi"0 “­Óëùw%r2öEJĞĦ gŻż™}2³cŻ×EÔm5£¤ïPĥ&„TUO!„O!„ß@DŬGïM““ĝ86}ȋAƒs2…użdp)”5­ƒĈħï]œ£Ġ“­Ĵɂ™òjʑ§ÇUTœ!Î)O‡\LàͰI… YSˆ`séwÙâ+MjħĦÙ°ƒĈĦ²Rä^ÎO‰H“ÌÁĊàŽĠASĴUœ|2 JŜ&k3Ä~SĊúËÖ\1Ñı8§ĵ°x½Ò+ÛP"ç$O yaZĜᑢî .ċei|Ÿû`‰V–ĝ8áǽôÔ4.EPñ3->Ä1ÁÚ4‚0#9YY’&aɕ’u+°äˆ žT6G4ÀLá¤ĥR…ƒ×5M!j0?ÄĊG†RŸĝıŸ­ÚǑX[_ÙÂDĵNĤĊ”.uYË&.Êg!1œ*nq\€¤ò@C\$¨BàR q£ŒAżB߆–@ÚtĊӕG ½(µröëVCá|>ÇqüzÇ_ŝŬ˙áïżùû˙-ôĝġ<^Şm[ğìmëv_US°ù .&ŝü{3+ÖÒêäé;Ğ÷—ĊY·ö>ÔĉÙ˙XTKèġ˘i&{Ĥ=‹Ùû.Âxg ·­O­qb‚ĈfüüşL• Ĥùwö™-.{û3™Í°ó?Z]†Eu ,~îŬ”‹‘‹7ħÍÏġ)­š{7WLËËë„ùçlĥġbráĉì}Ò_f[Sgœë÷İáôĠù|>†Ĉ'€ˆ"^ŬŝÑ J8ž?}úôéKùÓ?ĝ§˙ŬuĝĞwĊıßù™sÜŝ-i1nÒm›Ğ°+ú(êÖ$mš\ûÜÙşŻ T3³³™}RĠ/Ïçó_ßü‹Ożz||üĉt:Cڀ‘u£¤WkšġçóYO0|­ŞnÇpww÷kç܏œsï2*0ı Ż FQo Pr –ceYŒXÍ,x !|{>Ÿż>ż~xxĝͧOŸO§SĜ°6adfƒÒ!éĴš €žÏçññññhfr:ìt:‡oœs÷"r‘Ħ*Ÿ;.-‹VRÇBâ  >K+éݞ„Ê2Şû„)bDŬÙ̎çóùñx<~:NŸŽ8Žˆ;…ŠíHğ•ŝèŝˆŸôƒÁİĜ $„ Ÿ>}:‡äx<ê§OŸŽÎıŻŒJ ĉ D5ä‚+—\lAAŬôàê[>—l³ħÑRî)RBPĠqÇÓù|>x~bPǁôƒÀXo·×“.!ȧOŸNˆuOΈÁ¨ñU÷Qv[.ŠÎ@à  ŜšĊtM:ĈrĦ¸üßCġÄ@éUBŞP]{akXo¤“^i!+5êÂè) ë@İŝZ‚i D ­HŻZZZNË:ÚıikËÈ*eĠ0ڂĦD½uIçŝïĤc,~nAi $UD ½FKhù3ûÖ'ĴÚ´£­=¤k²=(ê-‚Ê6ÀÔ³’Z`ҍç‚p"^3˜–™x5`ZrWÂh $şî(Bçú{żlÀĤe]вx{í7Îç‚/"h€aùsëĞTÈ?ûÎïeuŸ3()ê­ŞWµg%µÀdߟœ—tí3Mz+@Â3 ´!×ÑsĴ#Š˘ú0B0[҅uĠ{M‰@úŜÔ³’pJׂh FE]g!ġ cRêŭğ#HÒ¤kĴ$\a-ġà³]GQÔÓĦ\ŽşÛ z°·#éöô\(m=´Ž(ê;ƒžĤ­½"‰@úÁt 4.Y=[ğ!B‰˘ƒÑ%8]SÁû)0"¤H—,™kAÔ{‰˘{(áˆ>{H· ¤-+Ĥg-½D„E½ L—ÚŽ· t <ŸUUéóÒ5€şdA]z}‚‰˘žg!]zìZè\8‰@úA€t 4zz[Ž@˘¨çéˆ\cù|ĥU¤ÛÒsÁôQġŬC˞ñœÏj˘#>/h=ĊŞı>E}÷VÓSĦ”'oÖ#nĈŠ’‚†0˘¨×ĠïÈ#門´`&Šú~@ô¤ż#¤[áCQŸ¤$‰˘(Š˘$Š˘(Š@˘(Š˘(‰˘(Š"(Š˘(Š@˘(Š˘$Š˘(Š"(Š˘(‰˘(Š˘$Š˘(Š@˘(Š˘(‰˘(Š"(Š˘(Š@˘(Š˘$Š˘(Š"(Š˘(‰˘(Š˘$Š˘(Š@˘(Š˘(‰˘(Š"$Š˘(Š@˘(Š˘(‰˘(Š"(Š˘(Š@˘(Š˘$Š˘(Š"(Š˘(‰˘(Š˘$Š˘(Š@˘(Š˘(‰˘(Š"(Š˘(Š@˘(Š˘$Š˘(Š"(Š˘(‰˘(Š˘$Š˘(Š@˘(Š˘(‰˘(Š"(Š˘(Š@˘(Š˘$Š˘(Š"(Š˘(‰˘(Š˘$Š˘(Š@˘(Š˘(‰˘(Š"(Š˘(Š@˘(Š˘$Š˘(ŠúAô˙¤ŻÇ÷Ğ—ĊIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_ArrowRight_420x420.png0000755000000000000000000015612712467662066021666 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFтIDATxÚìŭY˜$Ùuß ŝϽĥĝıg֎ZP¨ [e€b¸‚‹$JĊU$(R"gZ3M²§Ġß×=ßôĵÌ<ÌÓ̃ş[­)VŞĦo´‘RâŠ+vKU Ö\"#|5³{Î<Ĝ5³kĉfYY™Q÷Yááááîáfv÷œû?˙C"?ü?ü¸ĠCùÀ?ü$?ü?ü@ò?üÉ?ü?<ü?ü@ò?ü$?ü?<ü?üÉ?ü$?ü?ü@ò?üÉ?ü?<ü?ü@ò?ü$?ü?<ü?üÉ?ü$?ü?ü@ò?üÉ?ü?<ü?ü@ò?ü$?ü?<ü?üÉ?ü$?ü?ü@ò?üÉ?ü?<ü?ü@ò?ü$?ü?<ü?üÉ?ü?<ü?ü@ò?ü$?ü?6l·ú ‘? ~lò¸Ñ'¨ĝÔv2Éñ:Hŭcm\/œdç òGHŝ#g­ŸÑk|=9Däċ‡’~ĵħ!D7VëDHtˆÇz@ùáä‡oÑ!C‡| 9à1rPµú<˜ü@òc˘.(ÑuüÎ:0iF>m·”7?ü@şYCú?Z~ĴùÈG(´â<V€E:@"+%¨ˆş˘Ĥ}èCL~x ùáÇ]ç×À¨+JjŜnƒL6²Îóż“H~ĝq4@Ôġ=­yßa#¤U·e ĞyÔ]á#ùy(ùáä‡›˘.4o/ŭ, CĠëġ”Öš´Ö* Cµ†ÖZwĵEN’D˜Y’$1Ĉ™ÏçœĤ)·DCҀĴW˜|´ä‡’~lŒÖÑ:"TÀ'Š"Çħĥ_­u¨µÖAD¤•RZ)ˆHıQ‹ˆ03³ŭšcÒ,ËĜ“.‹l>Ÿgóù<³2-jŠÖÓRúσÉ$?ü¸ùQÑaA´  TÇŞ×ëƒÁ Œ8Ž˘( 0ÖZGZëX)Ù!…D‘FîݰˆIE$eĉŒ™Ìĵ0Ĉ,Ò4]¤işH’$Y,I¨Éd’9pꊚÚÀäÓx~x mÊĝú˙óWjËÈÚĠÈ@Ó*ïOÜòGŭˆ Ş$RXDá0èġzÁh4Š˘(Š8DQÔ ‚`ÁP)5PJġ•R}"ê+zDQdĦ)j33€LDfNDdÎÌs™2󔙧Ĉ˜i–e“,ËĤI’ÌìXÌçól6›eÈIò3ı)uEPi<9nĤgoqÇ˙변r˜Rk¤›8Y5—†öIŭ*Îżúkò˜Àh¨¨ B:5 ‚ápöûŭ¸×ë z½Ŝ0‚­0 ·´Ö[Jİm­ġŽRjK)µµnŸğpúÄíwž9s×='wnğcZk€h0éxûDœ1$s3½riĦDŠ•o>wuïĊoíî~óıWÇŻĵt‰™÷íżkĈ˜}f–eÙŜ`0ĜK’dħXÌf³Ùt?],İ5‘&´€¨-bŞ­ÏŠÏуéˆqÂĉŒ=6ôĠ/S„ê€ŞI?Žˆş˘Ħ!Ô˘áp8ì÷ûƒ^Ż·Á‰ NApBk}J)u:îġNŬûĝğ¸Ħ‡ï8sÏ}Û[·ß5L¨„ Œ ˆ Ĥ$F F@xĉ­€1‚“o~çı;CX*MÌîKߜ\zĉKW^üÔŭê×ü\–e—1W0ĵÇñĠ^ŻwµßïïġûŭŭÙl6xÑ&Ĉj%^”à‚ÉCéˆÏuœ>RÇ/D ŽŞEIöA•‘;ĜÚşŭ‘÷}×#<ñî;·ï~ÓV‚@M`/a|cÌÈ$Ċ@X$€B¤|r h@’”ħI~FNÄàe#˜fzûíŝwożíé)˜ÓĞ_˙òîóŸüŻòÙ?ù cÌKaEÑ8Ž/ġûŭkŭ~o2™Lâ8NĤÓibSyhIŬµí/uî-y(áùŽÇy;’ä°Ħ">R‰ŭ }ŒRt´ Faêáp ƒ`4 †á¨×띈˘èL†g0ĵÁm÷=ŝÇyúŭoÈÛNÍT¨Ż¤Œ½0IS"D,‚†@А˙Ïz¨:·XSĦl€ƒ  ´F" €$\Aˆ{ß~öŜyöŭËïxġÏŝà[ÏŭîÇ>=ğzùÙ ^ ‚àċ(Š^éġzW{½Ŝ^E“Éd’îïï'išÔ÷—ÖY³y(—É„JĦ²s” eb]"İENâ#¤£ £u£"Ġï÷ġh4ŠF£Qo4 ƒÁ‰8ŽÏDQt> ;‚ ¸óĦ÷ĵ÷OŝċżŝPtáŽáµ„ñ 3öƒ$Äô  4APB EuĠDñŽtq D ‚ @„L$#¤üeLû'ûƒ÷ŭàï|ïï½òçż˙Ò³żñ‘?š_½üLß´pşEѕ~żż†át2™¤‹ĊÂX0ËâöP:Ĉ9;…cğŭp<€ÄĠÄPDK"Rċ,`££Bf­Ú˘˘áp ‡Áh4Úî÷ûgâ8>ÁaŜŭ–÷ĵ÷âS?ô7 /Ü1ÜO—Ĥ×2†AL„ „ „ h´”Xm·Ş^tyž jkÁ00ċÑRĈùk¤šXdŒı„ Rˆ‚H÷ßŝŝ;{Û{ŝʕ?ü­çżñ›˙öż$½ŻAÍ0 _R†W0œìïï/ĤÓ)Ò4-ÄÎT€òP:pò@Ú°‰ÌɔsžĈGµVÍS)B‚†#Ġ…a¨ƒA¸½½ŬÛÚڍF£SqŸ˘èö(Šî9{÷=~ÏÏüÂ{F÷ċÄ~Ĉxeša?(ôˆˆ¤9ŒÈ‚ˆêÓşĴ˜ЍI`#*ÊWHl£,V@Ê@Ĉ‚PbÌ 07Œ BFa_Ϟú{~ÇÓwë˙ò³—˙ĝwŝ Z?ݵî+.A°†á|2™$³Ù,sŜ5×ÒJGŭZQtĴç²£/jp€DB¸Ŭ:ُ#£U):Ŭï÷ġp8Œĥ··ûÛÛÛۃÁàtÇ·GQtOE÷=ŭ×üÛûà_zÓLŭòÂàê‚Ħ ˆDFĦR(ż ´r@TœcrŞ´˜Ò…Vy„Eù˘ M­€Pò=Ĥˆ3É÷—™ "¤ŭípë/˙ì[>q÷·>ò~wħ{y[)5ÒZ÷Â0 ‚ ¸Ĥ”"­µÇi#e×µżäĦtL˘"/ûŜÈ ­.UWš›Ĥó ğc#ċFF£Ñ( áÖÖÖpggçÄ`08Çñ]QŬ{Ǜzç÷üì˙áİÂ]£ žŸe`ˆĦb‘"„D)P`÷‹‰*ÀtHZîŻċêÏ,I‰@3ċj=E (š0MF „ ‘Ĉŝo?sïŭ˙ĝK/ŭÇy÷ŜŸŭÎĜ‚ŬžRê .A0ÑZÓt:M­<N ÏCé8r)eVH›!{F%x$ÏŬS§ĦŠGFŞùu4…£Ñ(ÚÙÙÙÚÚÚ:Ùï÷oëġzwGQôÀ[ß˙Ŭï{ú'˙Ö£3é—ĉ{İ, z” iU=ħí¸”‘8-V59gKĵd÷¤ò„Ù?J HA†³L‘`‘DD8·³N~èg/ê;ßtn÷ßŭ“ÑÀ:FJİËD´/" µÒp`Ùzˆ[ T{Ĵ‡ÒĉGH’YtL"¤\Ú]¨ë*Hٟ{mô!<$ŒT†:Š˘`kk+ŜÙٍF£3ƒÁàŽ8Žïíġz~÷ÏüÂ÷Ü÷Ŝïĵ#àıI†ÌäµC1ċ0 Ĵh! W¤à–&„iwÎïÚk*KŠ×%iX`**f Ì2pe–áÎXı·à“'/üµŬŭ÷ ğWbTäxê]+^ŠL#Jj‹˜|ñìR‰ñ@ÚÀIŞôJ!íĤFšÎ_Z›]Œúŭ~ha´5Ï ƒ;8çô™Çŝê˙ċż˙àÎŬl_N/ÎLtÉ÷iˆ”B@’ï)äİ2êNÁ­ŠŒ–#%îŒâW}Ż(”DA~C À E˜°†0g¸=Vß˙ÈIġs˙ìŝË˙ψġµˆ”RJS>öˆ¤Y–ı„ôP:NHù”ŬF/³[Ŭŝ’ÚäTŬĦ`@‘ÑöööĥŒîŽĝÓ·ŬŝŽŭw˙wïœğ­˙ĠqŠkİ@DÀĈŞÙK’*:’v Ö8–"öÈHVAÌݝ#…½ˆÎDJA1a’ˆ“×H=tçmŭÏüÔßû.ŝ˙ï>žŭb @‰È5˜N§°PB”VĥI÷PÚÀ¸áÜ!ä˜nŠ‹”tÙÔıUN›£ƒz-Áh8²î­Ñhtv0ÜÇñ›ÏŬŭĤ‹íïŭßcëä™Ŝ÷RL3†`Œ R@ AdëŠ+^ Fµğä ‡U{H§éş`$΋žHNQy}AR˜² M&P¸6ËèéàS?ü~˙ĉïk<óYĠĝ!"4›Ít İc=ŸŭIVĴhĊ²^÷½QmÛ÷muF €²m"â<0Ş`tÛŭo~×ŭ·˙× ĥNF_§˜ħÀHîù„„Vb ì.M­´¨ÂîŜCr… ²aµŝ‘‚ŽÇIy_Ħ<*×EšD’ċΙÉWZ{böó'ô§˙êß}üÛżŻ•O/A Pj+¤e#4ċq^H-l<6m0ş.£ĥ Ĉ_S­³¤š0jîŒĝóoşï‰úïŝïßFáöSÌ3Ff¤TħġH*븐ż‡Òó°Pc‹ó˘Í:"‘F #í?[ZI÷–[t^Sj#(Ê땄"bH@fİ ƒĜàmçĥô§?ôwß%ùûJ=óéÖÏ߁R˘ĥhÉCéÀ @³wûŜĝ5·Ĵ^Ž“/FڄTŬ*-ë‚ ƒÁ ÚÚÚŒF£“ƒÁàĥ8Žï=qîüÛ~à—˙û÷÷†£‹ s›ĤƒŽzšX5FžĤS͈šDÚà$E<³˘Üê"Í_k˙ĴĞ8 ċQžˆJBĈ”„ó´ä^Âxëé‘ŝÔ_ŝ…'Ò˙ż ÷ĠOµĉf³YšċTòP:Ê);Íıë7y 푿–6)Uwƒ ‚@÷ûŭp4ġG£ÑÉ~ż[Ç÷ŽvvŭÁ_ŝëԙsŭ/ìXd f›< îوH“­ñQġf;Ù¤¸qžH-UWEF+‚ ÚÏÈM’Qġz­i½*”wž#/ž" aˆµ"bȅ{3àmg·ôgèž\ü˙ŝ'ê}ġÓ­Ÿŭl6C–eu‡ÒÊ ċ-(Â^ö½ÁħĴ³W´”Bñ×ÏQLĠEQloo÷ĥ···‡áù^ŻwÏ`8|èûùĝàöo}i?ĊÌĤé„óŭ•P R]ٛ‘¨²™rßy9Ú7BjHjġD²tŸ›’kЏħ£lÜE-a“8#ëÓ¨!„€ĊB)$’ +öIĜİ‘úì_ù…‹ÉżŭŸûêgşÒwMġ‡Ò\Ġù”Ŭ¨ĵÀ‰ƒÜ+_ÄsiƒQ’ â8m ‰­Á`pĤßïßÇñŭïúñŸù{:ñÂ,^Ê`#`ĥËˆ@ÙE’²]‘MıI JMALĦjߨàt`µâ\biWm}†2ŸfİH"Ëђğ·$Ċïç2ġÜYB A´‚¤ŒċâÉÖÓ#ŭ™ü…‹éż˙ŸÑ{ĉ3°ċWc°>Ĥ-(Ž…ÊÍ9•K!Óq\QħèX½o¤Pz8†£Ñh8Oġz½Û£(şï§Ŝ÷moy˙÷Ŝ1ÎğFĈ³µ \M§ÈQ9³ ވ K{DU´#:ßߑÖŜÒO¤Jµw¸f!ä„QEż.rĤ|rS}µ×Ê_0‡l^G%Jbò6ê `/1xëé-ŭéü…‹ĉ?üÏè?#c Ĥcĝg›}Ké:K%añ şµ0B ”šQR Lŭ~?‡ŭáp¸3 ÎĈq|÷é;ï~ì=óïĵ•@ô­Y aañƒZċj:ûż²1c3h¤Ŭ¤İt“:˜ÜǸòìÚ³4FâvŒ”ŞĴ œx¨NE‚"˘*_³LßċêAÑĦ/yún!€¤‚ki†ÇΌôŝÒ/<‘ŝ{cvm5—GH!5 —óôM$jÓóúq+Òt@·€ÁMĠƒÁ FÁ`p&Š˘;{ŭŝ›żŭçé½÷ġW&Y^ôÊyŞÈ÷"EP6•Aµàف ċû8m€’–Ûb˙Sï>ÑÜ7²ß³-ĥ•š°.·ĥr"*J²µPN#ÉB…§¤>óêj?² SÖÔ!$€a  0‚YĈ ƒGÎlİÏ˙àÏ_Ìŝ˙âĦtŒ"£(h8@Z'ĝ!jOìûq³RHpRu*ŬëġÂápĜï÷û'{½Ŝù(ŠŜôÎżöïŜqÏèċ„‘°€STq,ցòŽV°à‚Cœ´7#FêMÄú.4 `%]׀ĴzŻ)Kp% ċaCŞògUĉB-½!šEî\(WF6Mh0l°BĈÀŜ,§ĥô˙ç/š_ÏĦÔ&öP::ëïÂ>ȧì6úHU9ğĵĞ˘kûz˘7+]״Љ´ÖşßïGŭ~ğßïŸÎs÷?ĝĜßù}w\[08Ë }ÄHıïS:/Íğağ#·ğnŽş"W¨ ˜€†ÔğMaÇËO]¤€‹5? Ş$è +İQUñ1ք òµĞ1ÏDˆ•äB‡Œ‘(3a?5xôÜĥŝÜ÷ŭ‹ü˙€zU¤DJGIëŻĊ=n=Ş¨¨Ì­tm2ùq#¤• ÷ll8ŭ~˙DE˘(şë?ö3EGêıiá²Ĵ²s‹cÑ­ĥs‹gIê9HQÀT6D5ï[êé=ÀjÇİ–T6òS*vÄ @  ,X¤ ‚ÂŜ"#gĥġ—ŝÒÏ_L˙?@K’‡ÒQ˜ç2Y:Ç<6qĈS èX™wıX_jêÇMˆŽJŬ•E°J)ŬëġâÁ`°Çñé(Šnż˙}ßŭÄİûŜ²³›ä…ŻRüs GU(*AÂT8P] çZµ¤ŬjÒpçá\‹ŽêuJe[ß@#q$ÜġÔ[Ŝ¨OŻö™Pù÷T‡İ²);¨<žÉŬïY RH p-Üż3T_ŭŝżs1ûu#;”Ŭ‚uH"ĠBBgĠ5ùħ ‘Qù/5 ÂÁ`ïġz'˘(:Á]oùŝżö–EĈ¸ĵ`€%wc`qöpòšw:,dŜʳTĊŞËĥ@nSÇ6.€ŞŸ9?çöô p%“–üÔNQD9˜lÚŻ¨]rPPFl”˙\“€Un,Û× œ$69ž3î?1T_ùŜżŭ8ġP:‚0˘J>e·Ħ,jJğı^)[ŝÜ_7DĞĉfĠŒŽâ8ŽƒÁ(Š˘Sa^¸˙ßûÎĝôÙŜċE^oTìɒeUbğÑKĊ)¨z]N½ıu܀S=b*_–[M–¨DÈĴ&ùv,…š ’”ì_¸.İ*~I*5_-i"„ÊFŒšÀ™ e‚}1xóé-ŭĠïû;ÍŻ˙ôžñP:J–Ĵ¸È<6 Fâ\K0ò×ĊML×µç–ĉ^T]`ƒÁ`x; ³aŜ~ïwŝÀ½†cwmlä+R)ìÈЈPîQGB]ĞáMW|[İé¸JÏ5 ´ĵÇäÄJ5ÂQ#5ĜTÔ³ Ġ?›~+Œ_ÉF95`i>ÛË)ǀ”‘V“%”lÔ+[|$d°żÈp˙ɑzĉû=”ŽÜ`×$Ñi³&A'2ÊŻmİö‹ˆòŸ_·*RjÛ;RNş.êġz(ŠN†axöî§żmƒ³· vS††16z)re\=Yx°3ŽÛä¤Ùj•+˙^Š„jj88¸…³%šĠĥġÙÙYÏr=Úq d•gğ—¤ìïîßìRŬĤÈ ÒìZá}kJ`@J‚4ìàŜĦúÚ÷ŝí‹üÑ˙½Ży(™9Ïîmz m\ˆdWÎFZá´äiçÇ̀ş‘’ 0èġzqÇ£ NApîÎ÷}÷} WŠĞÖ âNƒnjŽêi:jN,—İ?^JŬħ}BpÀRe€ùµ­ÜKR{ñŸ½rWÈJĠÉ> PŜ NŽ$ &Û]/5jĥŞ*ŠÌ Y1À L2 5‚L1ö2Ĉ½§GêkßûsËÇŝĦ‡ÒQ˜ò C”ò҆ĉ‰€Â™ĦeAîu⯇›•Úے/ĠEQÄq܋x+‚ÓÛ·ßyÏèŽûF‹ŒAìD-"­­Ä™r5!bwżaı³dÄK‘u!ŞĠ'A™Ğì+ßÜÊ£Zô#ä¸|Ór*ìğ," Ħâ{kĤjĦHĊ™LbĞĜs˙VBi˜$ƒ (· ž&¤iŝĈö&Ŝtj¤Ÿŭŝż}‘ŬGJ›M#{ްÛÌËis˒¤[œ Ŭ½h}„tK#ĤZkÇqÔëġAìApú÷~ÏCPDW$€á: \…ÌNÚd'}cáThĞ›­ *r=X\HÁّ„¸dİ>ɽİMë‘QCÚ İRu(ç‰İ,‰Í¤Ê>NTöŻ~µ‚Ù”öĦÊç2Vĥu…0û àzŝƒ?w‘?ê#îŠ•‘ŞÀi"$×ù²°ħĥ^vT‹¤ü¸iéş‹a0Ô½^/Š˘hÁvgÎóÉsó”kònısW÷—&¤Ĥ,ÁYĜòh, ¤ĜäQP½VDŞ4Üz¤ F ĞïL#M瞞­ıLÇ6ˆ8‘“TʊÊóĵîċê !j`²7rï;B¤Šû˜ ’Œ!F0p×ÎH=˙½?wѧï6•Hœ6*:– ìc³‡äehDMÖ>È_75]w`¤†ĦŽ˘( ‚`¤µ>qêÁGïÑ[§…íüš6úI] À6LPRĊîD^ÏĴI-Ŭĥ,`¨‹–Ħ$KFĴµ É@³·%tĜšŬıîß5i·•s+İÛ ×­‚ÄMÓ94"iĴH–ÒwZĦu´E û F"2ĈwŸİçż÷燇Ò^lÊYmxQfFHĊjÎDµċĞoCqKÓuÍïU†AEŭ0 ‡Zë3o{âMLÀnjl#"BMĊÖlŭ`#ŠĥPj[UÑÖ~ωžŠ¨¨‡„FçXYH´Y\ˆċĤ|Ì.€*w:rSxĊ{kÈĞmìêwUÍEĵîè KÎEzOjgÀ È·XtÀ¸–Üub¨żñÁŸğH>}·y’R6eç#¤ Ž”PÉħÜ;ŻX³ûq³`Ôĥ¤Â0Œ‚ è+FAœĜyàᓙ-€%)ÔpRKÓĦÁvìĵëġIîO=Ôiş{ğі8§Me¸*7Ââît7şżŠÔĊßĊU ËŞWR1ƒ+Aî'e{IéÔP)ï”äéAeÏy·)ĦB‘š¤PJħH߅ä]g‚Ä0”&ìÍ2Üħ=TßüàÏ]ÄoüCôîĦ´C)À'끴y)ğŞg='D·@mWʐ”R*ÏÖ=­ġ0ìġw˘sw&OOĊ˙š‘‘46„*y?•QÉrÄ\O÷Ġ!gšnß%ÌxوµĊġğ v@Ġ İPÊĦ63Kù^Üv9”r•ħ#r"Ÿ"­HU³6i G!ħžx.œòÏ­è§$šòĥ°H˘v9ĊíúÖw˙ìEúÍ˙ÍCiS"¤bÑmĜi###jñĴó§÷­Ó:é:†a¨µŽ•Rƒ­ƒ@-’\P¨ëܙ­ĝFĦ ÛÉYħSÀÎ 4´˜Ħ êRï"Ċç6ĉƒ (nĜ6Ҁ@7ŻĦ£‘ÒDĠƒÓ˘‚JħFŝ”+^(ŝF·Îێ²ÀQâ¤êŠZÜüŸ4œ$rßğ"ġ#DlİÈöƒ;NŽÔ7żço=~óùôŬ&\^ŠŞJj¤ ŝœÈHŒ4šùPiÒw‚@i­#TO)5è_¸óTf×Û@ˆ,¨ŒŒk’"X&v˘ĉ̇şêeÙÉÁŬ/bİO­âD?h>_ùĝjˆ{K(dŜöçĈ}ï6ßHìÔ09)½˘­r¤îyˍü>!)-…*Ù¸âêŭŞĈj€—˘ĵëÀ!a’ ’„Á¸Ĉ‚Û·†ú…ïĝ™‹J~ĊGJ·úJâ–PŬiĠg÷(rKe½7à#§µuû)­ud#¤^ï셝 ĥAR·Fiğŝd2äLúmÁs-²iKÑÉòÏÜÍŬwjĵšŭê³oĦâ#ÇÓNœı;oħNu;äQĜpħMŭŠż-‡ƒlTEBE@”§÷•7 •Ú-Ô 5À†ħHsËĤ]\Ĝİ—ûo]Tżù<”nYÊşÄÄGH›šĥsöŒ@ Ġ4]uV­~Ü̘µ™Â+Ħ†a µˆ(VJġ{çnëUĊ¨\sö&Piï睋ŠUż½ŸšwŒ\İw·ĠûUM-[u€Jš{J…òŽÊì˘*Şœ?FW!ÇÂyjÎħGRT½or.1Ùŭ5"²âG’ŽF ċ`ӂĵNI(pÊHY€p-Kq~4TŻ|ïÏĉêğg?Ħt‹ĉ:aö*ğŒ¨Ş ĴÁHÄgìn.ˆ5@k­•R…D‡'ÏôY. 0F–D͔4`T\Ĵ)Ó`¨:4”‘“€ê˘ˆĤë‚û|NT-AM-!-u|ÀK£îB b<ĝĒ’œ³Àà)‚~ ™Ş6İúä‹hŞpP­z™,󉅁 #äÜb¤°?g$’ˍŻMSœԋßù·~ûĦ÷u›=׉ˆï‡´éalħMŠŞèÈN(´œñġµ@¨ġqDDJİÀŝ‹¤7Ò³L`ZÒphIĠ`Ôè%îÖUӝ­×aé„7öĞš5Oâ>°gÒâ·*Ž]Tú‚²™ žċŝêuEäĴĞŠŭ#rÄb£"Sˆ2l½‘* dEr ¸"Ğĵ[²?²{JB”}pD@$İ@4pu?Á…ÑPżü=?wQÜĞïnj€·s6ñċ³£ĴĞšñIÍġ™üİ}Ğ`µ´¤”ÒD¤ˆ(݈8HŒÓ÷ȇt9"¸İ6,×EW­ĴĵkċN* -µ¤faÔµI›ƒƒŜ€jO*·* ^8edċŜġ5‘Ğ.,ö–LîĦĴì]ìíà"R Èĥ† 37X5áê,ıÑ@½ü]ëb ż§tK.+/jĜP ĠnPı9ínŜ) ?n „j÷i­‹:P @ëá(f,A€|3½Vûƒċ}›2-Ö¸(—#û ܈ZÂY~èŠÚڄ€7âDFVk^Ö)-$ 1F!`€€…jÉÊò‘AĜ´W‘‘aÛ}ĦbżJ• 4ŞçPmĠBŽžËÂó=%Â0TT0O+û Î ê•ïü™‹ÁoyġŬ͙ïÜĤW>BÚÜd: V&éatóÈŞÔŽ‡[qfòˆ€ ÊÉU-Ñ:ꀤ‰#iE¨µ•.rû~–4a$ :Ż%KŜEĠ>ŽĜ}ÇjHİx)‚°i<ÊĦ£Šr[u)Çx–ÊŭÓ²yEġü*´ a„çqR~5(İ|_‰™‘ İàÊ8Á™~_½úŝ?âW=”nJdÄUħ™ÒfĤì°ÔÁÓÙ<ö0Ú485}EaĴ(…H`ŒÔÓpÎ nÌüí&§şöĦİ+èdùĒĉ´‰övÍón@pdëÒZOUwtpäáލagïÈٔkä ÄvΣ* *".j˜í;ŠŠô]^4+ 4Ĉ)c1„Ğ“ §}}éŭÉŻ˘÷Ĵ‡Òë!áĝŝÉÙl8uR\Ò-m'T›Ù Lá_ב“; ċÛVÑĈèHç-˘żŽço’›ûGÒŞIcŻŞ6Ûş}ŒÄ‡7ÌUËÎHRyӕµEà2Râ˘ĥ”rÚċùQĥİB^ÀSQĠħĥ~°,Ì!€ÓžC&,˜!=Ğ ĈéA_]ŝŽŸıŭöŻx(½nW˜cĠÁŜ:h3W nëZšgʇy&m°˜"Â"‚l²ŸÀ6Á„UHŠİkşy9niÈ·…Nċ[£ólGakkÔ䀒[ôµĜ‰ÓaVêŻ!  ôWj;Wyg@6âħĝrÜÈy.…ş2Ol=’ˆ@İžˆÀeEy^÷zħ_µĊE 6Rbž,:Ô¸*ŒSƒžşò?s1úO~OéuËı H›"5ĉ§7Ÿ—|oNädŒ)&f`x1KH@9 ;nİ(Ju#…£t¤Ëñüö×ĉŽ˘×/Ž´ğÙîĵVÁ—áĤìlKòZ¤›ÖÌÓtê…ƒ•^xE÷Ú˘oXÀDPÄcĦfS~déCNÑ-7 Jî2äVá!˜XCIšĴŬ)pzĜWŻ÷§ïá{(½£ô²ó@ÚÌ%µLEŞĠGF98ÂÌFÒ$Mf 6 EµžBk \XpKÄÔ i‰œàš¨ĥ˙^›´{YÀàŝ×|Ê·+ŬéAqôá$ÜíİpÇÍĦPàçi6# QîĜ@’·×Ǹ֊¨Ĝ+/~—œbZÀħ0"…P3BPcœ,AށË,83êËïûĊX~Ċ;:ÜĜ §Z²żŒŬñ‘}/iȉŸÊ²>LڔhIDr‰fNeĥ—ÑÖéH2İıx/ÁbĊóZJħUÏ, )^kÚmé÷Šß]ŽÒʨJ½_ĠˆşÈ’‹Ô™•}+ *r`IÖ·äĜ%Y ˆ=0 “ut`ÛCİĜ3’ReçFEb#&²5LM°—.á¤ĊÖ1ÀF°HsÉŝċqŠS£şüíĜ?ö{J7òòħĊË §\¤MJ‘´dċÜĉFµ„HӔ™Ù0s""Iĥ·ğ Á݈š†§½³”›QSwñj=}w°š Ç~H àpŭFûû–eg‰ÒµÜ‘ŜÒí˘NɈÔÚQM³ħ³ĝ*[ƒuOĥş²½‘”-ş*^—JVe1¨ĴZkŬlĞëIë.Zċ_SĈ<1à€pi œì÷Ôîû~úbżê#4ߕĊ™/ŒŬĜ) FĊĊï÷‘6kc8˲”™ScÌ<½z)Ñçî…R lĴ‚M3*÷w;Îiİ9’ĥ8‡ğ"ïe5]ó -Cp9"Òŝ /ŭTċ ğ")W=ĈżÂhV—yk[pe…Ş4œÍÂŬ(EdûBĊ´v/Ë~  ‰ ŞÚó4@ŒifÀFp'û}uġéŸ~|€ìĦt#Vs”ï!‘7WŬÀál—n5™·xÉ÷†\Gî÷ÌÌĈÌ 3ϓ—µ§ßüäir'd´+áÜĥâ]żBM×Lá­0Ô~w…´[V,ޤmŻİ­İŸı<-IµÖEZŻVàeS{\í-قĵjJŞV…Ċjн<ïWÈѕ…‘1)²P"Ñ\ĤYĉ)#KW$É~__{߇/öñ+è=ûY×r%•)b´<*/°f›rZ[/­Rŭ¸`ʲÌdY–fY–cfÉ Ï^î)Ü[ÔÒ4½ċêŽÜUšNZRbİé ímÍÛ˘—%ğĤ{D3M'Mxuˆ/d5…+CÍÒħÜĉÚ’G0îŻZ;!rĵò´­kÊ{ĥğ,ê*ĵ˘UEa+U#Ĵ퐕ċ{Y%‘ìïk•‹ÓE֘ Â‚lÎĜ%ÂNÔSמúĊü*zÏy(]?œ"K¤Íä\ìd ŝ¨j~ôÁñ&].ÔĦÚQȲLÒ4Ͳ,›cĤ‹Żñž^¨€@’‹–Th²ı´ĠIGl&Í4`‹È Ûáauš)So>¨x ^U”ëÜoĥĉĠ~NĦ“²ÁZħŬ'b.;ÇfĞ]´Ïa…9Ol­sħ˘ˆ^ XaDa Q³Û ĵÈĥHßĊ P`a˜„ħÀ ƒ+™ÁÉA_í=ġá‹}x(]ß&Ŝ!HyŒŠ£SÀHœ•äàÇMKĠ˙˜Y²|,Œ1S3\5Ż0o]î„ ġÀĠ­js.+$ÖMuĤé:žŸ‹Ÿq ŻÛí{×VÎÜÓVj6C\JşKAyy’)#ĥÉ,0òš%.Ċ ÊöÊ‹hóħl!Ċ*ßOR\8@•êĵòÓħ˜&ä{JB ßSş–$™ áÊ4‰Ñ@ß÷3÷ñ+J׳K—†c$އJ˜dyaáÇ-ƒPí>fĉĊb‘&I²È²ljŒÙKżúùĞÙ;o‚cÍV›‘QĤëĜ’C80´ÀĤÍn‰4"6‘Žç] şÂŜ"rçFú…›Ĵ£œ+J¸ìëTĥ°żoĴ̛Šô]ĦÔ³2bE\ 9ˆŠ*UìA“Ġħ?ä‘Rŝ„ $R¸ĥȰXi\'8Gz˙}?sqàĦtĞoûgާûŽÛ\XŠÜNgÒ͇’,Çġ-Ù,˲$IĉY–M²,ÛOżĝ§ß žüŜ;•ŒġğÉ­ı„Ħ[À€Î=£&–]ğ;:Â6S|­v@|hi÷|šJ°Ñ ’22+dÙ`*£Ĥ˘Ċ-%ˆjE³ıÂÚgäFĞŠÄ>gnMDÈÓtB€"ĥm²Ñ˜M’£Ú£ẤP †ğcħ0`\à䨧ößc÷”ž÷PZûÊ˘Fâ½ì6aNf¤°lÛâÇ­„Sù}–e’$I²X,Ĥiš^3Ï}éy=Ŝ}|7D£(†bQ’[ qWôÒÙÈR2Ż-. -â‰vwo>ĵ´ğaŒ–i–;ÌYĞXúY·5ğÔeàeÀŞmilëúMRĠ3Ş;ĥÛ}ĥüL¤”Š U=–JòB ”‰D­ò=ŞVG {0˜e‚dÁ¸Â NŒzjüî_ÈŻ˘÷ ġRvÖßË73‚%ŞÛ54‹ğrI~ĵnë·ÎTû5Ë2³X,’$IĤišŽÓ4½Ş>˙G—÷Ŝö·mQ>9r&Ú­5:ê4’nܒ~“–TZ#ږÖȋWJğ Öö=#iÏÂ0–[n¸o·aÈZ˜RĊħEäGN#Ѳ7R^VëDJ´ğĠú)2ĥ'RñÚĊRrU¨ö*+"²<!@Ŝ(0ÒıG!+£‰$ìĤ89êİÉ·}ĝñÁx(­E¤Ò[ËĈnŜá!çBuÍT)—é—¨—Û½ŝáiû„Œ’ŠÇ23sšĤÙ|>Ÿ%I²—$ɕOëËúßuœ‘ˆŞ·Yӆ§ŝ­,Ûuuˆí0J­˙Œ[Ŭmïƒ[m#Z¸äFFîû ›üq\Û[§„Ò½AÇz§X.#RuWô~+˘&[$ B)Ċ ygÛ²ŸUQX1iŠr&™ĥÖ`ÂnĈH¤`\3NŽ"=ŭĥ_ì{(ĵŻ&?¤Í’÷™ĤşN<n~”ĴPڐ4MMžµ[ŒÓ4Ŭ5Ż|ë›áĞÏNžĵm4ŒûPÚZӈtHş÷…²:L ‰˘ {ıöݙړïwĊžQíIı‚Q %çŭ¸Mŝ„iİ`ĥĝÌŞŭ#)ÓwEÓ?²Ro‘Ÿ$Ir5MÓKá˙Ös{ßûӏ‘ï;ˆH=ċÖħĥhvd•²êµ°I,nÍ Vӵ󊌤½3n Şu&Ùû¸Tşıu’…úŽŬÙYŞ‚VaGi礵•…K!â[ğd¤Ûŭ(ħf´9ĵrħ—`Ğ Y‰P¸ AîgdÓĦ ˆğ cÁùó\'8½ŬWÓ§>|q‡>RêZ}­DÄi#${‘jkŬÂdä…ß·2jj70³Y,É|>ŸÍçóŭ^Żw)úôï~Q?ñÁû’SgúQo`'?,Ù*ˆ SĠĥÜë¨~ż´ìçÔ,|¤>ùŻLı9"éH.½%ƒĴ„hŬÈĵTé;7IeŸ_‰ĝŝŸ~ôÙWŜ˙ßĤ3(­AR87t¤Â uU[G*Íı%-"ġbZ_r[µ¤ ĴJ .gë\u¸<|˜(÷ŒPí÷PŞJ‰g›ġ5êşJĦ€Lò6Tf!Ĝşç{KFr³ÖB-Ħ„*"8íp]GYġ€@CcWIÂHYpeœŒ#=}ê§/>éĦ´ĵBĦĈd灴‘‹†â6ĞDĞôħ'ŸoAñúƒhÇŝÊô3›$IÒÙl6îġzW{½Ŝ+á§~÷sôĝߔ„§úħä•˙bۛ³t¨ĥg$-$Úí€ÜŸ5 ­O[d4,‰–Ġ~ÒaAԁħù Y÷ÔôskŞJHÙ=%’š!+@FÊ´üğè kï7N s.£ÜÑA‰ue(<ìĴS¸’\YWŠ(ÈŬSʟP!Tù + vĊ eA6Ëp‚S½HMžúĊÁ'ĠCİ<Şv ^Ô°İ£ħqMTEFupùé&i­½$f6išf³ÙlŜëġò´]½8ĝŬ˙ŭË/ÇO½ŭŽS@ İtËnMıħ´‹n§•–(…˘×•Oġäĵ†¨é›Çҕ&\†bWšíħ¨YYH}‹Àe“żâġ‰Ğ0•ìŝQm•Îßĥ÷R)`(tRŞü˜*ÓV΋i‘ğ„+w3×9 Š€€ráDĴ-ä4a—‰ÈÌà§úĦšû§.O<”Ğp10vóf>Ó.` ²vB<ˆn-˜JÛ1޽¤Ċt:÷z½+Q½4úҟ~>|Éğ§Ñ'û£ ² ²‘s³O…3Aw šèj;Êb…€Ħ³­…ĞĤk~:XŽ”¸ö\Ò5ß`³óĴAe3dŠĝĠĤ·É6êĞöXĞ'–<=§ìğŒş hĞêXu/?­u‹TŬn‹0É1h ”}eH !d°—sp¸")Nġ#5½ĝ7à˙û†‡Ê”i!mfşġ^4ͤ‘°ËŞĉĦβÒËġğSmWDIóù|6™Lö˘(z5‚oŝóŻŭÙċ3ïwöbMA’I "*]êï§F+ZHT|â%gY‘Ĥ[Ġ֝ıCÁ·³ĤOkÓ2iiÏIZaİdù`0* $ß?˘*­§•žB.ç†P­_’Ĝş#)Ám-RQ+VBÇNšĥĤIı.TEIÛOI+Äı@<72„`Όlĵš Ό"={â§.öċŸ ÷­70”¨èr<ç³Ħ²kQimBÔ8íü¸ İ:: mWL Ċ$Á”ĉóù"Š˘IÇW0|)ĵúÊ×ĥ>ġÑ{^şĝ}œ=ĦĦtRNڎ;œ ŬB˘[%'­Ï×LÓµùŜµEF5oşô_#R3Í­r@Z›şB‡â ċžu‚ n늢ħ^ İÚİ‘’X 7H ˜` ĜXŭ“ kĦ˘5zY8[DJN“ż"@ T~:°0úÄÀ,İ„ ŒÓÛħš]üİ‹zĤïĘ*s -т1Jµ@-i:ñİğ IÛı0ro³%M§ÓY†{aÁÖÖ§ŝӟLÏŜ{v?²NÄÖ&iÍ\-¨ğ IŭŒÚÒgÖ‰´ËÌW¨éÚàÈÍ?†;TzKá]GwYİGF9¤òçċrÏÇIĠI~8”Í );]³ŭ2ħ'ı´[IŜ‘İZ:)>Û8I§‘uv¨rƒÄ”l¤iË ÉŬ‘ŻĈ,É×,Żî%8ŬĠĝ?uqô”HĞüÀòñ\_Çb“ş`Ħ(Ü˵úö2²ê,?njÚ΍–şÒuî÷ÂÌY’$Éd2™„ax% Özxâw˙Ġ^ŝüÎßĊÔß ³—än·´Î%Ŭ2k9°Îh F²ÜԤ隑Zí=ÔÀâÂQZDÒ^hÛ¨Ħ*fábârÚF°Ôú)ċ)P›´,ÓtVÈ`£ĵ–İ8p m=Şĥòd[£Û~MR–bġ>JTo‡ËVĥ„\‚Çı;2sHjp™§Ħš<ñÓGĝÇoôÛdÏÑ’ŭ_ËyÑMßÉħTInzÚνĜWc2+p˜„axYk=öN|ò#§^Œ˙ĉĊó·*ˆ‡P‘›ş2`€Ħ'şî²€E]ı·JMזĤ:ZZ4@Ċµßçş%ÓZ^Sş)Ċ¨Rš$ı…—ƒĤx“ñjY8k÷“rQDċ…W80dhÛĤBœKÈX(ĜT Ê0Êéáäĥ†) $ ó<^ŝy³`ì_Kħ0sĵ’ vĥ"5~äÇ/že–ĝ…Ͻq ´dċ´i+ójŬàÔÈQ˲£'j’ "ĠĝÊÌl²,K§ÓéTkh­c­uo녯ġ·ŝìc'_}òƒœ9w;´îٞ;ı[ÜZ³ ²ž %‚Ş˘–ÂêÈHşòаmÊEŻ@‡1xW4&¨İĝ H£ÉJ5I˙À”Ĵırn¨ Xm{tŞÚŸt™RñyQ%ä)B8İö“Oœ•ŠĝĊ7”JÙ~³•҆Ż½"7MW›aÄ+ínrÚ΅-r¨EG”²,ˈ(ħPşŞµŽ”RñèK˙ċÒŜ`xù‘÷Ŝvúö;Ħ^ĵëH‹I—oŬ ADŜBbù÷;:Hä?3-ÒîĥtÚA‘QkšŻ†-cwÊmĜ )'~Íđ„UJ8ëÀÀĊġe*()˜ÜáAò='Aîĉ`lWÙüéìmë‘‘äm(œ}˘”{ċûS™ÌĉÓyŠé‚‘e aAL £› ™p¸†JôOñ†ˆ”ìü&ÂÇrOüXDHnŠĴ?**šß%ŬôÈhŬ(É-)ÀDĈ˜l>ŸÏ•RÖú²R*TJ…£Ïü§p/èç$ŽNÎœ‡ i‚IıÓ(Ġa–êzJ-‡Iĵ*w` ‰ö÷äġAµi:£ĥ}ŞÈX2˘mŝŭ„|/¨ˆfŠ=%SDJĤjv)öŝ\ .öñùWmÓpF ĥŽ šŒÂ2%WÚe èRyWĊ Àqĉ )U%H›<˜Ş‹ÛïmDÊ-Jâ*Swóù|FD¤” ˆ( ˘Ä§>úğ—£;z½§vÔà4(ˆ@Z3:Ĵy*E&–ĵïÚhÀ+ÜÂÛ ÒfC¤Žk:0ȁ Íé³ĞÙ7z(uÁ“ĊéġÇ˙1¸Dêŭ'}×V0: ¨(ż`™jJÙ½µèµË-\Vv„uD Şĥtš,mY°g´2M·êotKöì§ÏRWXe6ĊWDD *aÄÖJȐ"Ĝ"Ù˘F‰- ¸È2Á˜< šÍ3;İJċÊ;%öwlĦmµĥÌS‚ù‹3–b`<7ÈX ‰`w’İWúñ'ÎáŸïHİĜ7=†ŸcĦ²sÓteży*6v­!çò‚ҏ[%5Ô%SĊş9”‹Ċ‚ˆ” $êìŸüGŭŞ‘÷mżġŬ£pç4„ “oÈs-P8ĜaUšÎíµÔl×zjÉrÊӁA°ÖžÑR O:Òthù¤›Àm 2TÔ&YeœM߁¨Œ˘ĜĤÜ2) d&OÙ)gߟg˜Ï3˜L@ŞhƒnğÑÚç,„\ôk"r “m¤¤‹öÁı+Ïóvè4KħË H/‡’ü3Ä/}ŝĝAÉi;áUv›ı"ݽRĈ*ĥC+ Ÿğ۔(İ+e×)1S@ÉÎÖó3·ú<ûçżNŻ‚ß;zôŬ£xç,X…“Ÿ ‘€³ġ#£ŸşR{]mÇWD05LJ5½éVġ{j‹Œ–£%dı#•XĠ)š}£¤VX[¸5d½Ĵˆ ¤ş3$ó ‹…Á"1y7Y›­(ӀöôPB`Uċó–éytEŽ/A U#J@"@ҔÁìŞôÔ+˙ÄçèGJż‡´á³`ħ¤+!Tk?ŻÈGH›%ı“5&Wyä"‡tħXP1!Ĝt­…ÒGñŞÈ{éħ÷ŒÂgA*€1yğçÒ¤MVDFN SMŜ6×w´ïŠ`ÖŬ3j>a—QkM­Ŝ!`¨CV:a\Ö)·Ë’ĦüPXa\ù7ħ ‚ħqĤ|Ïhš,ĉ)3SFUe§Y+nà˘­­r$àLà²Í³Téğ²t—Kg]„^¨dĈœ!“\}·{ulÇêċì‰óòϏ_¤ä.Ŭ<6kä qÉCµĠm!ġ–62?nE”ÔœŬhÉÍD˜ĥôIıÖĥK鳟ú^yïè­OôöYh°ÉŸ‚4A2iMaqǤ½tÊt90tDFĤ£ZŜn)há•jc 9Y#ŞjQ{tçĝ{Û˘W*S™ydd8·ÊRĈ|’b>Ï œ;íüç"ä"‚rÄ ,Té‘‘˘šċPᧈkŒ|;‰ ˆk9ÎÀ ÀdaòH „ŬŭNlĊꕇ~ü‰³8>PÌi^Ô°™‘‘8­—Ë=#·îÈh“˘¤6 5£¤f„T‹–Œ1ȳwKkD:ûéU˘÷öÉÓwF‡ +ÎxĊi+ÒtŬ+Sîr`p‹S;"£šsŞ´ ĥ;Ôĥ-dşz¤ğ7׃‘ËIU|.N—YĠ³L°˜g˜OS˜TÊf~Tbµ°²ġIĥS!nPdĦ”Wĉ–Ê#EyoâĊ•[ÀK[< Xï;û Ì KS°ÑĜċ9d+V݊tqUW ™ei™íÓv%ъˆİ FԒĥ+o;{JûÍ<óéáUĦ§ñèğFÁè Ħ­öT9ŒèÀ•h\Ûµğ²&ä#‘•:FÂÀb–b6I‘l?à"*$âVî@bĝĦŒpÈĒ8EM6}§ìŜPQgÄL½xc yż5IVÊ6´IPÊ[Ï",Ü„bŠK OËOŽô, #À˜ĵu…X;n¤ìŒ´ĵıUŜtí‘Qñ­t‡4×#^#M·ŒLĈ˜MŖYjRıœÔŠgıĤ+.¤jİ…’]=–éğ²·9A‘İ銐‹(‡Û´ rDäĤíÏċ(Äë}'^ìJ¨žzùağ§tĦTnOĝ”ŬĈ.ıĞYİf;·ıíġċÇĈî¤%}‡ŽHİs]’3ɤI’´>ş̂>ŠW žŽŜúQ08Ħ€ÉëĠ ê9Ŭ²çL—ÂÁa‡4ßhŜšU:òš`$k¤é£ĊBÚÄuڝÀÑ­úZFJ”jż{î³Ċ+Jžĉ‡ž…[ç€8È­ìE.D€‘Ġjş†a&ÁˆY0Ÿ,0›¤ġNğ0rMŽ]¸[§Äv§Zĉéğ’FJw†ĵNÙĈY’×q‘pÒwb##XQTU›”Ó€ĞT ‘Ó€“ „óH)PĠɄŭ H“†1€­X½ĝàƒı+l_‡´™³×eŬԘĤŠ”ŒçÑĈîÚ ÔÖ´Ż-B*–‡K³E”ç>ŭ1ĵ*xšyr ÏA€` †]m×R¨ÊĞÒt£âé“Ä`6M‘Ì’özĞ0rïwUÚMżşp(^„ĊYj8^xVڝÛÙ6èNšŽŠ#\¤ï¸€’QôaJ¨À…ŞVġHÀ$ğ×ĉ8!ħzñŝ}âÑQİS. V=6t­]îq6ÔRD.Œ<’6JîÁq˘Ğĵ[•Ÿ0ë@ݘÎ~ĉcxEäiyèÉQ°u6w ²Ô>˘zj¤P› £Ĥšo1Í0™$ıHAĝ€HŞF5ïğ"j*˘Ħ|Ú-ÓwâLœjÙ?Ë­‚riy^ ĞlÄT¤éJHħ,CɊŠŜLyÀއS))A‚ qñÚJċ.á†ÁDyçY ÔKüè·á_m~¤Tô QäE ›J¤šÔہ)TrT£M…R3ZZuÑ· :²¸Ğ#Ï~Ż~šy÷(>q¤4T Àiú$Mè £V9ıĉ³ Óŭ¤jxw`ZoŒ–Ž_ŭF›ÍPiüINúÜW2-é;[gÔbTAÉڐĞüqTtœ-ò_Ê2‰@*oĦŽ€Ñù†aHg@šd0¸Ĉ p¤^8 é;²PR â#¤MœÜ–g'×֟—f?6 Jmİğƒ.úµÇJ(}áxUЧç‘QÒy}sğĵúVˆWÊf“Ói 1M—r~u´€wjBÛëÈuħ ŬËċÖô]^CÈ62ŞN… J\ĥİ+rPNgÚÜvÈĤAe Ÿ(ïı”³ĥgšÂx–"M W÷œPVè @ôò†B‰wçxÈ.”M ĵUĈ'^WBIwIħ Jg?ûqĵ,ò´<ôQ08 ˘˘ Hœ•·Á@n Œd4Át?Á|–Z+-ĵî0jkò—Ğñx9}W¸Sµì3äu²\OßÁ…’‡•m^lfİ\ÀÀ…èÁQï‰ğ…`.ŝÛĴ0^İa@ğğ3œžzéÁ}â6JŠŞ KŸ²ÛÀ™ĴX8İF/jı¨|Ön“SwAİÙbäFyÛB‰(žœ˙ÜoÊË,ïÍ~÷(Ü92A)>gĞ[jŝ:ÁHħgdŒ`:N0Ÿ¤-x}a䓜Ta{úŠŒÊ=ÒĠ!$ĠÒwpĦ+`ÈÛ](r6‹ÙQĉ™ş, Ğô h…žï>AQ y†4c(í/@ˆĠ‹÷ŭ<}·aP’rOBĵ—ŬĤFHî~PX˜Èu$xü¸yÇíPšĠ6œ.ïğf×Y7R*ê”ĈMh˙Â'4z×V°u*À .W×`İ"î#ıƒIÓIŠù,ĞŻ’o2ŒêMŝ¤=}W ĈUß•-Ï+W‡˘­ %ûçAœ>Iy1-J98Ĵü›­èPí'Ŝ{dİ È딐0ŻhB¤0™$I ˆĈ.€ÄêĊû~d#ĦTOy mĜ*ğŠŽ GriÄhox°ıï–O·;fúFŞLÔòÜ!k) …/|/ žĈ£ïŜÒ½3PA–W/qòôH½ĤyâvüĞ[âiD §ÙÌàĈAˆH´ĉ„ëÇúŸ'5á0Ġ") %%"3ğĊsŠ˙ÂÇéeà=xèÉ-½u¤´-1ĵ^É …‘Éq’÷ Z›£2qŜHßœŻ".”ÏI²"‰²Nİp wÒwEš.jJHĠÚW°À(@[8)‘òĊK´ÊUwE Gb֘ˆ I $¸ze‚'ê…ğĝÖFJâßÂ|#‘´,^肑ÜpÑ ĝ™Ż-}×=5mP]İĈ}Ê“P“Éd*"Êŝ#tŝ Çː÷ƒOn…s 8§á넑,ܚ,WÍÍféÚĜd5ÓwùL[¨,˨ T4úËD cĵşKx% '›ĤS\AŞPŬ‡[1ċKĠ,°ôÌ+Ż} %KPUÓcbaÂîċ1NžŬÚô]éZANy¤äR{JOl¸=çşˆsûzċÇú‘R[„DZ'rŞAi:Ní¤AE ïüç“^Îĝ=é#ï…ŭs€ ò–šl醑 Ó†‡3Ád’ä}ˆ££úZѵ:’”œ€" ï;)Sh$ÜXI¸ġGbÓv•½żX§†ÂŒ•UĜ[‚ċ–Q(›üċ÷g)kìîÎħ3 Ġ oúÑ'n“‰èĠ[â>e·yc´ÛÑÁ Z&ë´@8N>Zş1ÑR˜ÔŸgHċ}Ĉ N§K‘Òı/ŭ½JôîĊƒOŽ˘íó  €d\ĥUÈ'Çú¤Ìh‡‘°`:N1›ĤVĵwmş"Me÷N ‡>ĉ0*‘¸.áUúŽ I¸Kċâó´J3‚À8-ċDzĴM² )ĦT|ŝŠœÛ³x%/@Z ıŞS²N‹L`)vAĊêĊ;ĝâmòŻ].(­\n—PúßŜG;?û;⁴ÁQÒçżíÜşáµ@Ôï÷ƒ8Žġh4 ‡aŻ×ë â8†a¸†áv;JİZë­ġIÔÎÙ{¸ĥ7?tûİ{î==8q*îoïD£s·ġ!šħ 5Œ”ıa¤n–ħ(0·Ğ4lîĵ¨£˘*”ŞzÌT­šŬÜO‘woçĊîRv0kJ…Nóƒkk O(ŭÉjŸjıĥ“ŞpĞ=<²“ Û…ıuaTÍ59tìóŞBEEğj@°"Ş …ŠÇεVTŸ´ ”É'/&²ßçoِ”.ß° i0ĴÓ7瑌äû IÊwĜ›îcošVAz­Q•v: ÑX0×üEëuĦÇFĊñ_v ¸5DM›ĦÂĠğx]SGìŜ*]!\(ĦdœHɽÍ(#%ħnâv1Tı7 ĵ@“rU€LŚPŠŬ]vúêĊğ~ĝâmÈĦÔ&Ĉı1PúvÂ?<^†vÇHŸúü:µ@5ug~ĠÑöövÔï÷ûƒÁ`Çñ( “až ‚àdgˆèìÖé3·=üôĵ£NŬsßÈăpwa°Ç‚o$Œk)c÷Ċ9&ÈĞĊä Ée]Jl˜¤İZĵp;9ƒ+çyê= \x¸.ÀK11¸Şw6 Ò*_K^([_/‘XTlf*Ÿ¤^3Rž¸{ĞI³ZyïYн¨€ ™”-§Éšr*ÛR\D1I)ûĠÖÙPİ"Ĥ%İX@ÒÂ94}˜Uñ"3& 3 #‚Lc†sÏ4aˆd‰}\&HSĈµŭ{ ’e@*Uiˆ3u{$²Ž{šm̵K§fú)YTk”§é†)Ċ Šòóĥ„RħNrĴ…5Ùŭ#BUĞDe GJ(›jT8$œÈòγ8ÑÏ#%üâË_Ĵš Âl6K³:• %"˘}èCkAé#ùÈşép¤×£vŬAB…ş•0 ġp8 F£Q8 úƒÁ`Ĝï÷w˘(:ÁÙ0 ÏApżµ}çCOż˙áûםÛ÷½eûJÊôÂÜà3Ĉ —§˜f‚"D"ˆ!pNċl HÚ°²i&]x;˘X9E†Ħ€r.dGĞ#ĈÙ{-|ÁŠûŬïĤ¸B!HŝPE f§b)•­VšR:Qn熤΄$J6jjögċ¤eĠiÌeĜWDtâMB‹Œöu ˆŬŸ!Mà,_7°}/’Iŝ=!˙ıİà nZb€É4ĊîµI %eŸ$˘ê-ğ#£.-=…=İŬô])9í&jB)[V¸ÖB%”ì^SaşÊʙ×Ù ŭıŞ_RNV‰òëV)û× ħˆìĉĉYÂîċ pŞŻ^ĵ#”âË_¤–½Ïİ•„4ꏏ|ä#ë‚ÉGH·FĞ€T‚¨×ëéÁ` ƒx{{{dAt* óa^Zß~Ûŭ>xñ~èmŜöĝékĴÔ7Œg_ád‚zœ„€˜€ZQŝU=[q]Ôö&í‚ÑPıċkÓR‚22ÉSwìĴüíkޏ€ÄŜïJieùôÀ˜  eñ&Ü´Xq7Z}ϛ9™Aù~U5%dò„tgŞuŝâ\B]ĜŠJɆ€E)Għ,'Ҙ˙lħ€b(‚Éì~‘}bۖÎŜ’™2BMSÁĞsÌĥƒÓÂÍÚŝŭe úĈ”vFĠMYJßU‘’8ŭ”¤,޵GE\ìçܳöÚaİLWYH8WäYĠ]YL˕ŭ’Şċlùš”§5€(hh’‹T ’÷SÂV¤^¸óo\ĵ½Š”¨ˆl”R`Ò¨S2¨/ëËMMZ]:?ò‘Q‡Ò‘Rħ2XFjUT´µµF£Áp8<ÑëġNĊq|> ;´ÖwŜġÈ[{ò~èѓżÔ ƒßÚÍì,Á"„J7À@}­‚’ !m÷A´8Áxs Ô¸ĥˋ˜Ŭİıq[*ç1ÒrzĥO"è˜)P›ÜŬç\ŞÈŽ™HŞ4Ŭ҄Ëċbnt']ğá­ŻSD:'BaùĜh‡9‡ œ}$”{L€1‚+û öfĤŠĈ„ëSEÍoUjìĴU$xµÂ¨™Ğ"ĥÏ݇T´ )„” ĥ{Jäì).k–Š˘Ù˘™`n!^ċÍUĠC£ò³™ ( ÔÊ)̧<}—ˆ1¸ÊŒ“j ^ĵûG/ŜFżĤâKŸWD¤ˆH+4QdzŭŭŭĊbħÈGĥY§´V´t”Ħĵ`Ô "ŞßïëÑhF£ŜÖÖÖÖ`08Ġëġ·axGE÷Üv˙ƒ=ŭ#?ñĝΛ;ù­Y†?ĵ4ó R‚mC!Ä!Ħ'‚P"]=iİúhIı´Ï퓂t 8VO Ġ,+_€ûÑâG+kL€½Ż×•îŸÉŠ÷*mŸ·żĤ8àa\4ƒuAU7ûżñ4ĊĠq†Ô6è+˙5aDuˆRÛat @ċSP•ž|¨Ĥ+?Ó Żê.[ L!ÇĞıŠçê;i…‘ÛèÏ­YÎżġEô¤¨2du3܊.òċyV"1Œy&€\½:8V/Üŝ×ßy;@ñċ/h[ÛÚşĊŬ Ôt:]L§Ó´E솁RpŒaԕ˘Saê8Žġp8 ·ĥĥ†ÛÛÛ;ŭ~˙lÇ·Çq|÷`{ûÁo˙‘Ÿz˙]O}àĥ—Rĵ2ós“§y2`+†z ˆ è!TyšN;+(n½ [‚À¨ĵÀ×uY£Uïëz`$k’ïIÛş&ŜŒ¸„‘€80Ş˘¤BŬ¸H—÷,’|R­,ÒĤĵµç5##× ë £úV’8Aı4„l;N£òá\ïZ`ä6ú£\Ê á\ÉɅ˜Ç‰È>#[ 8Ş=ĴBŭ(U™"R™ĤX¤ Ww'¸§^ó‡ßq·ŝ߃ĝĠ/ÄJİX)i­£ h­÷E„:xhäXVúi³a¤ÜŬ`0‡a´½½=F§ƒÁù(ŠîŠ˘èŜû/ëŬßŝSûñÙèdüğ×R|yœ"1΀F0@ĦX"Êи˘E‰smÊ“ŝk…‘´=è˜Á¨5X<ŒŠß/`d` )–e%0Fpu’`o’•}¤íġÜì>9ÀZJ×gց78ŒjĊ²M×äRÎş|ŜK{ú#%TÖ/j;À˜J†ÚZí-¨’“-nĤşCıV@hĦĐ~™HX1ĜŬ[€„Ô{~ô­w]ĝ³Sôù˙0TJġm1}”ĵ×ö÷÷ĠŜŜŜü:Ħ„£%ċ=¤u`¤šûEƒÁ F½­ÑhtşßïßÇñ=Q=ĝŜŭİï|àğàžgç ?zy޽”‘f6Œm­0R@_€žVˆ ˆĴ×Uà¨×dUšLÖŻ„ÇĦ&çÀHbG×(k¤#i´9:R7–b?ÈŜF6Z*"ibpy?AšVFİ…”…ì]d 8k{ÓÁï­#wmU:˜R\ÖäMġċĊ³]0âZKÛĵÖÈ0 ‰`T^šÁ\ç /½*}g“ĥ\A5ABHéi4CĈĈĠñ@8óĝwĵïÁżLŸúggèê7†JĦRJ+v`:.ĉóyvH(á(§îސÑÑa`¤,Œ‚íííŝÎÎÎöh4:Ûëġîˆ˘èÓgùŝ˙ê—ż+˙‘“´—âóûҌ‘™\9v2TÙ¨¨§€ÈQÑĵQÚxp`$k?Ï!a$‡aGğ°`½ŭ݃aÔĥOġš`$\Öċi:q`$FR¤îÈXpu?Áŝ<-”ÁW. Ò żĴĤ³³ìFRKßUaûr“?×%œêûwVƒW ê0*7f¤2^UĊï0`ކ~ö6ĞÂ^‚QñzŠòÚÂPH¨!bÀq€ñ,ƒIRHj°—e˜MĜ?;ŜöĥŸ˙Ààk˙î”ú֟ôĴĠXh=/Ik 8$”p”÷“‚# £U-Ĵ[aÔï÷íííŜ‰'vF£Ñı^ŻwwŻ×{àö~òƒ˙ĠóñèdüۗĝĈ̀E`Œ€2Áĥ& Ċî) ք€*áà ú0:Xèp0’5ÓtĞ ıj?ì0YŞë„Q)B(Ä ĥİ 2H!9‘Ñdnpeœ 3ù^’Ĝ½aç½vüŭÒıá/í0ŞîâŽ&M—ÊíŸ G’ÂĠ›ó:%jJÂĊiîˆ€vÚVuvTô^*úU¸ï—òVZB×*ċ6T™€Ù€SAš1^z‘‘$àÔmċñ“ñıSÑ×ŝÇĴ™Ż""UiM(Ħ£# £˜²ëS›š„ÑÖÖVĵ³³sÂFF÷ôz½·ÜŭÖwĵç{ŝO˙íSߒ(ĝŭ—縖ĉġD†Čm0ÒŒò=# #Y#M×½§Ó#Y“ ĞÂ/9è=ËÚ°c^sóŠÚ?Ci7#¨ïíp"#—%yšNœ 3‚+ûĤ‹4W‘T#Ô2tҕĤ“ë„‘³ßD¨@Ú4żaT¤_—›üuı„é4§(YĈĤïÜĞtvpꔠÂEy4U€ŠlĦ¸&[żDıȁÜ~JE­“8…ZAB{Î1a–Ÿ€ ‚¤.]a6O1=ŭî7y ÷—GÏü›ßʚùÚ8JhÙO:r"‡àˆA¨Íh0(*Š˘ÀÂhDžѽï|ò½ßùüċw}- ô\I0M İa€'µÂ "Êa´tĤFËÙ2^ıg"²FôÓıH—•›4ùwŝHVnw5maş)Û #éúÜDÚï/SknyR]9WF>6*ş:N‘YUÎ;Œ tuáêù¤> ç êH92+2×sŻY yC¨9Û.ı„·zRŬfĊžRE1F…žXÇÂhĠQù˘ĤPċUÛJ°šŠ=€ QÑ0,˜ÎD°H11ÈfûÑÛÌŭñní×´ÛÙژĵ^$Ë2é:´Ê.‰Žœ‚#£UûFŞívŻ× lÑh8žéġzwĈqüĉûŸ|ê}ĝ…_|×W¤>yuI’7ÛʲĵPòD W@O"Pî=GĠwNĥÒċâzp "R+:m“7ËĦĊ-?äŽô։šZ҃Íùl…Ìz­ŭ¤UişĈïˆS|ğİşN!Cz0Dáp0Oġûŭ;˘(ş˙ÎGßöîo˙…_|חĉ¤>y%ÁXsn”jÏh XR2f\§˜%\Ö#ı˘ĥiş22*ö’Œê0r£$aİYBùÈèġƒ‘{³n3ÄU¤$µpÊu²B<)‹gĞš'İIı ›²+@U´PÉ#()êìċċv!,˘'Ħ&°…Òx–˘ìµ’e`јîÍ ôwžüÚÎ÷}Ğ˙aÁÌ)3§Ĉ˜,MS̜eY-.ỏm"8Ċi•Ô[PqŜt[ƒÁàlÇwġúŭ7ż˙ïŝ7ß9íïÄtyŽyĈ0)— O‚X)y7(r;ı–‡EHÏI}£ŬYY·MšËİ9YŠŒ¤sjĊİĊîµOĵâ7: =Ŝ3ZıÏÒÉEiŸ‹ŸŬ’çŸó³ñÌàÚ4-=êJ‘‚+ gÔz$ıQU‘ÖcğgTKŬoƒùşöŒ<ŒFË6CREJ6MWE˘âtˆmÖ)Ya˘JQÑä+êY ÚîKN ll–ÏĦasWIÀŠhBzĦÂnXĠ"ċ5 F× #÷ڣښŞJӕ’p×fŽ˘ĥÏQ%Ŭs„ı´›•ÇLq!t`kšwŝUސĦ·t—Ş…²˙Ħ&ÄĦFjU½Ġ (O‹OĈ lbĵ°óûĉòĠ!iÚëġĤY–-Ò4Mçó9cŠHɝ ;ŬÀqÔwGMe‡İşÂ05‡ŭáp¸ĠëġÎFQt煇ßúŽğżŭ{îüì^ŠoM ÒĴrpÎsĵŒ˜ФSTw‚‘j÷¤‚T}ïşž†kìħ#wï¨)!îš*z]­Ĥë„ÑJ`Ĵ‘Ĥ[™숚xßĠĈ¤Ġ(zíÌ0ÚÏv–0î65gïwqċ1qk–İedd)#hLàŞñÜEFħáúÛ]ËÈèihYÊÌĠ$áTöêuJÎEZ8:pĠ Ĥ„òû²{NÊ7Ĝ”]îà`Û§Û×/Sw hÚÏZ‡ “ıħ7‘7Ĉd² ħ`kkH1ĝ'Ŝž]½ËËccÌ4MÓùbħHÓ45Y–ñŠüȑIĠm:•R:Š˘ ßïz½Ŝİ(Šn{½ûŸĝ‰żŭÄċôùqZĤdŒ)ö=EyğUu$uÄ2Ušó˘w6½ıŞTĞàÄ­N+ÓtҞf[99 ˆŒÖÚOZ #Y)`XIËDˆvIÓäÔBäê$ÍeµîÓĠ`TĜĠ;ÚViş 2Ċ~×~GêBû‹ċû4Ŭ͆ŞŒš³§d£vĠw°"Tô˜Ĵ"ĉB^ÓÚÈÉÀq·İÁĵÈÖŝ²rìô,ˆòúÚşë{éOE;tÊvjFf¸ĵ>Èĥ†OèġúÁWÔO?|ô8Ž÷úŭŝd4-‹Eš$ Û³ÍHİ9‰(é¨Ê—RuTŻ× ·ĥĥúáp'ŽóQŬġĜ_ŭħoÓçnüɕ LĈyd$9Œ ²ù]ĠHĥ r‹™ÚÑm¤ájóh£€²–ĥi¤ĉ܉aiÑż"29Ld„‘Q‡Ë2:ö“:&%^·Î¨µŸÑЍj͉·¸™fŒ+û ÒĴ QJĊ &ÍĜRĝPé ¤ÖŞ˘xvÒwĠBĦĥ2o‘xŬĠ4 µżĦjĴWüĴJż/gĥ ‡Şġ_5oWŬfQĉˆlÄäÔ$ÑPÑÙ½ÎíûRŠĴúŽWÉ-œKÂĦ …Ñ‚Ŭ-'^5Ïĵû4ùJŻ×ğ–$Ét0,‹…ÙßßggÊ˘ñ²ï%Z•Ş ‚@÷ûŭ°ßï{½ŜÉ(Š.lŸ9÷à=ĝ{:Iq5aH³Ö8ħòî­GE…WU-uÓS­w8éYê#çF?Ü@tMPëNKi:Ĵżg$ÍċĉŒÁ!Š^Ŝ3:üDX\ĵy†½iZW&:jÇzmqżÔ÷ĝ܈ ĥQ_-Ê­¨Hħ²+1o@@œĵ­›\£•Ш•0r–{u›Ħ²NIê×néÂP´½çÊfH s"Yî6k'U\żÖÖN‘­I² *şüùĴ<°ûJ† 3Ĝ0ĉ ·zx&ıĝàé[_‰ŒıÒï÷Ż ‡ÉbħX$Ib‹E!hhJÁT”l(|=Ñr_-JêġzÁ`0èġz½í0 ÏApçCċGžHu¤0ž!IYıÁÍċġêĵΈEçQ=Œ.‘ £pUjEuÂóRäTœ‰…kŻJÓ­t€XF‡3Z†‘Ĵ[ôڜ¤†Î÷z@šnEäÇVÎ=OLÍïMZ>g[§vÌj.ĊñqŬÜ(É´§é¤Èçı`k@`éñ2tĨ#ĵ>ŒÜûëuJ\o‡†ADU4kJG‡ċJŠl¤ÄİĵSS­"e§ìcó:¨ú;,Ùĥìšrċ1-é1˜O£;£göŜŝÔÁ'_ˆĝJżßß ÓÉd’. Óĝ´LËşñvBG%e·*:˘ TEaŻ×Äq|2Š˘ 'ïşçÛßġ³ŸŸ¤˜gy›êĵ•ŠİMtŞ\ÉäEt,yŝא³ÊjÛ3j\‡ İŻĤ‰Ž—˘£F Œ°ÊYúµÂ¨Ó;‹>×.z튌ÖT,½eîŝ[“$ĠŭtiU)-Ħ8yÔZş´=‰ŭÔVĵÇ ŻĴeı7-†¸y ÄGF7Fîİ8VĠ@ns½ò)M9oWÛDy$DÌùžŽI°ucPFŞšDÛUĥÚ?ˆ¸è‚^e_¤¨!Êäş)Í+`Äyр“àċáó·É׋ƒoÚëġôûŭñp8\ÌçóĴĦ¸s#$ïÔp˘£uÁ¤Â0 úŭ~l££SA\xà>ôŽ)“úò^VĞ†kê¸bßÈ]A Pĉ‘İSÜ0Ŭ,Ż3TÖWçRSÓ-ÁHd%oş µ¨XUK$è˜$Ö­3ZلîpÒni¤+Ú÷û“YÖħWĥÜÀP-ĥ4ŝ.Ár$F6G´ÀµÈŠkO­H·Fġçí{½V-Ġ²ıŽ…= !ĞX(•JIû Yk *MWì)°Ê÷ވlż¤Òĥ(Żïkıçbé{WĤí¤~ pŝ>Ĥ³A|Šž›ŬóĥG‚—†á˽^ïjżß÷z½t<3šÛiġ(IóëĈEL›^‡t²ŽP9z÷8Ŝ ÌàÄÉ;O½ġ‰3ÏÌ çȌYŠ>ÜU‰ĜÉĜ.“5żĴĉeĜXY³#`¨È˘Y·âa6žÇIî<ÙŻ0J•µ[C4`´†€á \~kÖoŬ4]Œœ‘ÁĠ½Ҍ׃Qc§µ­“ÔĊ›7JĞùıBĠ$­ £™Zœĉ#>2şa0r½"İ)*% îġOeZOœżµ8(ğAU,Zİt€(ڛuP6Z"YN{;íPŠ÷V4ĝ+ÔżK3Èh0¸ŜbbžyKô­8Ž_íġzğQ͂ ÈĴ ĵm<²Għİ%­µêġzqŻ×„ax"‚3w}û÷ĵ5P}eo‘O ܨ )žHÜz£ÜÏNÙ3Œ¸{uÏ-†Fu·éúŠ˜Y:Ÿ–‰ĦċÎ=•5 ‡„‘‡NÓI›ߚï|a°ğżX–{·L„ġyZŞ}£ĈgÛÜßY² j(N¸–ŽĞ PŽ,ıutGFҙĤ££+µÄUžĤ“§ó,9ûL6—ÇNdÄRÔU…µMċóKK”äöÛ*WĜ+ĵ¸I0Ÿ1¨wžħ{ᑷèW?†á‹q_î÷û“ñxœ 6¨–(IZĉU/jX32Z'J"›‹˘(ApRk}ŝü“ïğm7¤ĥў°ġ°jœĵe}€TmEMBù&¤ğ4Ót°m àJ½ħ§PİĥÜyRZdm“ƒtEFÎ/ó!֊ŒVdĞ÷ŒnPdäLè×& f³lĊ¤Ü£:p–'Xİ·÷h ¤=â'ç*Kİ@Yŝ3VÀh)2ŬhıżOö<+üìHœôgĊM߉SdkĥV‰JżÎÓv¨ e/%Y^p¸VT­*ôräÂRÀŒ^¨qIżéôôĠ;ƒ }>Ží~żżÛëġĤI’gï¨í_[ŞncÀlˆúf ŠÜ·NÇqÜp+ SçŜvñÍÁİóŭŻîga(ۈ­YĴé:o3Ĥ8ۜ%ı—bÛö¸0’VĊa¤Ŭ­hŞí‚dtLTέ,z툌¤ £ŽIa£ÔŠmrŭ0jq`H3ÁîŜ&#Wrż´(àžKòFÍeia ŒżĦş³²*ÑèFÎ⑖²äˆŽpm†l¤cßʙÛÙÂHĦÔ³*< £²o•&*ÁLaqÔ~-f)H–Ĉ|‘@˘ÓêĊùmŬ'_p;Ž~ǑÖ:5Ĉ4££ĉÜ[Ŭ ½¤Ú÷ZkÇq†a?‚í Nž~û“oš3ê,ÀdR*gÚ&t* aĞóÛôĉĊY^Ÿ_Z:”ı–4-AÉŒĜ5ì9HÀpxo:îşÂ×0Ü@Ħ=2*^b>7Ĝ'ŬJğa´â³€4¤ĝŬIM^ŝ\šŜt­Ïµ FiÙóiş×F45[ğ<Â)EÎ³\Ġ/•·…Áq /çĞÚ-áĉĤ kl‹ŭg-fİéT^k.$à6‚`xŻNNœğ+§ƒ Ĝ pÇñÖZ›ĵ£_Wt´Ñ­)‚ …ÏZé:­µŽòÑ‚`[)urûGO\Íl ÍùW-֒ûSi{Ĵ‹Ĥ\ԈŒšé£fšH½q³1bÚl„œ•t×µċ:!p[ŝl…7´GFÜŝÍĦ`$äZuFmÁ›,GF"Àxœb6ÏVŠ&ŠŒpĜÈț"µ=EùäÒ9r—›ıHÇÂÀ nŒÜSyŬYKŸš£CħÄċ¸ŜD%”Şö ŞäÜv \ÚY!…³€ázVċÀcÍ QdŠcœ-ÔÖZ'τa8Џ†á4Irö¤ci#Át¤½ìĴw]ÁPk½=şŭîÛ£Óçz߸ĥgyhn¤ÍGJu‹€Ùžpèˆ–÷ÁíÉë´­À²eCP”;UĉŞím(òùgy™ÌmĞŭR׈ŒFFFX#2Zš´ëÏkŒ`oo,× F²&x ´>çïċ†×á&À›# F5]4wtžÇfÈqt¨ŭħT,˜lbÎVäûM•pĦŜ"ˆŒj6UÒ}ĴĊÖ%A1’YœĞóûnÓğŸ‚`†a/ ÀQ×ÂŜĞìı´NÔ¤˘(ÒQġ,ĥNżÉ{†qyžÂeĥ3hŒì)6£ eJéĤ{2Ôç—FŬ‰s- Ŝ˜Ŭcvî$Γ‘ĴPÓñ!`$7FÒ£ëŒ.Ğ`”&ûû‰U"ŜZÉQ‚‘ÜÉĤH #w.Xê<ËVĉM¨µ rŻÉy“äö?"+/j’êÒîr{ÚiŸÂv8F`¸Z%3ƒÂ“¸²?<{G¤NA0Š˘¨ßëġ"­ġÜäúñĥ½¤†ÒQC˘0 b­ġP)µ³u߃'gĥŸgı•iDMQWVYñBÙ‰ё £ĥ½vzí”'WĵÍ{YÎĵIË{ÛÉ‘‘tµtm‰Œ‚Ñtšb:IWGcFF7FîÍzRµĦTĤï܍'jX‹•’*;[T=šÈDjuqĊÜÁĥ9d'Œ\)^Ĉ€D1öħ=$w´Ö£ aJİĥ}¤fZn#k“‚ P[ÄÔĥ¤Â0 ´Ö=T_k=Š/Ü3z9á\•Ċ ݏŒŞ^oı°”;,h{"Ú'§Ĥû‹˜ê6\O°ÔAV›³j~qëġ3z=aćHÓĈ›nŒ„û{ rއ‘‡Ñ͇Ñr’Ô$ᰑM%"†4Òwyk*ŞŒœĈ’MȈ¸QŻHE6>Cc`ƒ ƒ`·îìİù´ÖqEq†:MӃôŜ\ġ:ö:Óuaê0 #­uĴµôN=E[;á‹W(k˜i‡Qé@Xäˆóĥ&ȜvölBSĉ& ıuÙa ”v­òí(äFÂH˜o1ŒLĈĜßKPöó0ò0şE0Ş^żyž]` (ٚFHёĥ„[‘DgDR÷yhK}—Ŭˆ Àlò½äƒ`”?yU™ í`ßôΔj­ûA„A(tĞìš{Ċéé;(”ÎG¤”êïyàlbc#¨‚U²ĉ„èTˆUŜT´|DĴ‹3µ]0NàÁì€İ6qwÀHZ&€× #i‰Œ6Fib°·—ԝ<Œ<Œn!ŒjIh)ƒJRKßUb(Wâ]ıocK$­çEaÏb–TvÒvŝSsĦ ¨Ŝ)Œ÷z'.4PJġ´Ö‘#là˘¤IĠm:Viè‹ŝG*‚HkQ/:wÛÉÔJ)‹t0/5älk'+9ı_^yÈÜħĠ<"µ ĵĤ–“%ôġHHÓ]ŒxNŻŻF³i†É8Y{’0ò0şÙ0ŞÊ觞2Rê„şs #˜ü+ËjµM<" ĝĈY0P‘ê+bT¤” Ŭg£Ç&‰Öü%"RJݐˆ""ê…'O ‹ÈHŒäͭրœN˘ŒÜ›Šìžu·ïĈ0K1RŻ3jD0ŻFë6×[FĞú*Ŭ`‰&û)ĉóÌÈh£aä~[XŝUµJeOqŭˆh)i[à‰“öÉᇆQ11A‘Â4Q1 İWDHAh­5c耭Ĥa‘ŻCşŜ”]†i" •Rq´s:2lšI– 0kIûĤĤ8“BĠÇĆĈÍùˆ›İ=İİî6F²êı_YÁ³`o4e#£##÷Ĝ“.{*9rîڇN­ŸCÍÈ·(YvÌ:FÀĈöJÊÂÀ Q¤” ”Rʙ²ğätĊ[£%!i" „zûd4ĥĉPÒĤ*“–еe"-¤ÙJP3]4Ò0`tO3i™oZ‹Ağa$×iÔ #–ġÒt7F-ݟĈŜî˘ĥ ô0ò0: 0jn߈Ó}–ĴÒf5Tž3ŬF.\sϨ-2* lŒÍ˜q¸ä‹óPk(ÜiĠ\ët#`òĦ‰(PJ…4܊Ĥ#³ bRd+fßÖU}u2Ĵ²gQ!ߔU-µ×…Úz½FuNvҐ½VI§kwŝM’ì_[,5Ċ{cÂFëÂŻ?Œ°&ŒÜÓ¨–³İŭš'ş;+K½ğ0Ö½Î;€RDIP4@&z…D¤(i5FM0Á’ˆHLÓx!e“#nĝ’µ í0’1˜l]­˜X:]²Ù)üÂh½ĉzĵbşŒ¤ëÂèÀlža²ŸtOZo8‰‡Ñş0’×Fr5VJ^ÓO¤¨r½Çşëš+xP€9ëÁ€¨ĜĈ ÔAYĤ„Ò&÷C˘.Y @‘(•­ \•sÛl³âd0ŽRŽ˜ÜkÏèÁHĞŸQ^w5¤˜M3#£c£W³‘4Z‹Ĵ}ÎFÍ[† °oAÚFHÊFHÍùÔï!ŬÀİ'"RŒ(Ċ*›ù*Ċeŝa`ÔµħÉ+Á•-[j…6F×ÓϨš³òIkœ ™#£c £ĥÏÉ-‚EkZüÈ}s$(°P˜÷ eëX ZŬ҈iÛOĴuŸy:-î̂´W\ÖàĞëŒħgtpWԃ.Ö£ £eCıSwÊFFÇF͘>n<ŒJÙ·Ê?cŠŭíb ƒûóŞlZêî¨È—Rw"UkW ]èˆĴËnKR^DiƒQ·ËfÁH¤£ïë #c{×ġ};#£7Œp³aTû<4 ƒŞ †;?£\Ŝ% -îD¤BšÙ4-•.Ô>ħFÌ8*·F]ûd7FYĈĜğÖèìêaäaäaôúÂHi%ʽRn.îbŭ:ĉYïew½p’|@LVôĤš˘î˜ÁHÖi!qXI×u0Œ’Ä`ĵŸ´¤5=Œ<Œ<Œ^ÙnµÛ‰€,…Òb°ˆ˙ä üjƒ³Rh;.ÛÌɜËs—¨´6<Ê0*۟ßH ƒ%gáÂh17Ĝßó0ò0ò0şİ0ro++ûĉŠ8f;ċí6@GHk f{€‘,á@+kÏ~Ä`ToƒŜžĤğ.9.‡m;Ŝ£Ù4xœĴX=Œ<Œ<Œ^ÙİğއJÀ$"y”dğĊ´À÷@ş‘Ĥëòèˆ9K 53Û/ä0Â-€QÑ-I:•{7FÎ5ŝZa4§˜NÓ7ŒàaôFƒÑAŸÍ„‘ûMħË " Q ÈĉµÌDÄ0³aĉ2R:jÈɘâsçLDRsm7 (Mƒ*kÁˆ_g-ŭ[áß%7Fn+uéj;Ŝ#İşŬV8c?ÉŬşßp0£7Œdƒ`ÔñY1rÙ·¤D”MD$cĉÌ΋rçġM’Ĵsżˆ€™ˆ¤"’ñŜ•$`òĊFÒHkŬY䭉ÑueŜPI#í‡Úœ³Şİ“TyÂĥ`Ñ0ööHĈÈÈèVÁÍDA$ñBúÙ‘”ĞÑ´•>€Úd•!™,ˌ]Ì͵Ћ"IŞ4•­ڞĴJ˜Gû6V›²ëüš/ĉcıòÒ\+*탔ĤıÇW:áq(• ı^Iûs_Œœ?-KLîKÇFFF•šo H6Ì/c'6/cfĈ˜E’$iËŝ‘th"Ĥ£&ûvş0'Ib²,[cĤĈ˜ħyáıI/ í*ÂÖ$9ÈÚ0bWŸÍÛ!aäĤVçݏ`‚QË)µ&ŒŠtfóy³4Ŝž‡‘‡‘‡ÑĉÁș²µMÙM_B_ĈóXeŻcĤišÎmֈ[ #‡c=Úé-]˙²,ËÒ4M²,›cöÓgJĴ y4 JÉêš7Wö,Và4×+#ş Ö4ŬaaTĵXÛÚfŒÚäàÒĝ²4ĞLR=Œ<Œ<Œ6F'ĤâñŠÀ“q"6ccÌ~–e“,ËY–Vò½nşÎGH7 e —~'I’Ĥi:KÓtœ}ċSßÈí30A@`ÓRSúóH÷E#wR—syiÖż>•lĴ­u:Î'^~ŠÖ_qÒtîß` #ya„›#xy×ȨĜ‡ÈĠuL_Àİ!żdŒÙ˲lĵX,ĉĥ†ÑžCÁß{ ­ Ö¨)I“äDšeY6NwŻ^‹_Ÿh•ğ³/·D@KĞÓnĠ]Ú#ċç¸>‰m,X99ĴyápÁ,éPFîŭ&ɰ·w`$7FâaäatœÔtŸi (ÏGÉĞ‹+ĉtŸżžĤé~’$Ó$IišfвJY(¤è`Ċ֚ÂK’$],³4MÇĈ˜ĞüĠO]˘0oZĊXïoġHŭ…;›á½6ÛSRŠVÙ­†ÑŞ×ġ0ò0ò0:‘‘ lòF’[żPƒŻ~'Ù8ğ”eٞR’$ àmŸ²ğA°Ş}°ÌÌišfI’ÌÓ4ŬOÓt×|ê÷ADL  ĠjÚLżIGšîFÁ¨h!! …vó £ċ?ÀÈÈè8ÀhİÁ¸…Ré²÷,nÛÂóišî&I²Ÿ$ÉlħX¤$˙ŞĊOÙ­™Ĥ['mWŝKÓ4›Ïçó$IĤiš^3W^yQóËû" ÒùR—ċıû€=£×£şĤázR;RŽĤ˜eġ§Ù£ÌÈÈhó#£DDıUPZAĤÏ!Ê./NġÍWÒ4½’$ÉŜ|>_¤iš9‚†IUç§îëÖˆŠ́2³$I’Îçói’$ײ,ğDŸúçׇ˜ PŞĠ#½>0êT²Ŭıy3MwH™$Ëëyyym&ŒÚŜ¤ Ä)Ì+ŸÛĉ,Ë^M’dw>ŸO‹ĊÜîñóçFFGG!e·joİ’)€4ŸÏ÷‹ĊUùìüE´wiĦ”€X ŬP‰ĴÜPáµÀ¨ú¸LšaoßÈÈèHÀˆ€-˵‚? ½ĝVvÇ ġù$I.-‹ŬĊb1],EAìÚe3kdĞŜ@ZUÈĠġ31Ĉ˜Ùl6ŸÏçĊbq%MÓW˘?ùÄ7ĉ,àŒAŠşO5aT;’ë nŒĴ”.i7)ۖFFFG%2"˘\êĈ 10Ż~wne/‰Iż•$Éċù|7›ÍĉŽşŽ;Rv•š;Š)ğƒÒwĊ‡ÍVܐÚġêbħx5ĝӏNÏĈ MI ÔEÔڌ²-X~un5i½ı0’U0bÔëŞĉÚÍĜ½<Œ<Œ<ŒnŒ@ı̛C@+dğ_D8}6½ë¤ŝÌbħxy>Ÿ_N§“Ċbħ0Ĉ¸é:vŽƒËH7*]çĤíÒ45óù|>N÷‹Ċt>aûÙıBlì˘Ġ'ÊJ; ›£ċNŻY‚¨Ĵh!áaäaäatä`D֕AkÒl ~ġÏq˙zVLúübħ¸4›Ívg³ÙlEşnŭ¤Šš6İ ?è_‘ĥËĉóùb6›g³Ùċù|ŝrİßŝĴşvu²9Hċ,"Ĝ0xƒ`$"+:½~Ŭu`dŒĴž´<Œšäë#xu/ÎŜè0òm jĞ‚aúÍéù-úÔbħxi6›]n‰Žš˙Ž\×ĜMna*:▴IÓ4›Íf³étş?ŸÏ_M’ä›'~ûŸ~v<Ÿ‹È: ŞúyĠ£tœô…´a}ĠyŬçk‘dùž‘1ràÄäaÔĝċġ‡‘xµß7|d¤lÉAŠ"µŻ€_ùSyäŽÁ§’$ùÖl6{y:^›ÍfÓ$I5A´jiċ_聴:R’5 Ä¸%]™Íf/Ñs_ĝ‹ígŝü$3d™ĥ—HÇ!âĥN"K=‡*Á@ùß5[HȚ†ë†‘bûû òĥ(FFF£˘V@@AÒ+0ßúÏxÓNòÍXe_šÍf/L&“+vkbaŒ1k¤ĉŽDşnS#$%î‚3s–eÙ|>ŸM&“k³ÙìĠù|ŝ­ß˙7’ì_K(›ĜİŞ†ĤNM£ïö~-×°ĵ†~F7F.'™1§(›Fzyy:#•a% ž {ŝ·pÊ|Ú=gâ?œÏçߘN§Ż8ÑQÊÌ€éH×Ë MÒ*/ğ÷Ša´˜N§Édru6›½ĵ˜ìŭôïü‹ÏÌĈW%›Ħ•™ " \&Ŭ<=`ÔvšĴ#×q‚[0™¤HaäaäatÄ`THĵEPš`^ú}ô÷?;ìží?˜ÏçÏM§Ómt4Y,I–emÊ:éĝ~UşÎéiğ”]sE`+_L&“k“Éä•étú-zŝKŸ=ñéßznħ&[ĜƒŸïáF:9肭eî #·yRÛé£úžÓЉÓiŠdáaäaäat$`ÛhOİÜHkHtóêŸ@½ôÉìíoÚù“4Y<3Nż9™L^L&ûĥ3+"#Ĵ™Û@G ]GŻŒ¨NdSw&I’Ċl6 ‚ Ĝ ‚à%­uoôıßûdçü–ÄÑi Oƒt°‰@L§+j{d´F?£J×+kL„,˜Í3Ì癇‘‡‘‡Ñ&¨i–Z¨é %#(­`. ĉùߔwÜÙûĵ’ô “éôùñxüÊŝŝŝît:Ĥišt¤ê¤ċö‘iη‰@Ôğ€ŠpÓكC¨fħX̃ A\ÖZGJİĝÄŭğß{EéïĤğ†§.@G$08‡’Ĵ‘ĤëègôúµX £Ċ"lšzyy5:żE ˜WŝĉùÉ#·İ/mġèOÇÉsñĝċŭŭŭ+Óétš$‰›Ş5˘¤umƒ<ÖS[´ÄΑ- ¤œƒCÌLišÒt:)´R* ˘€ˆôı˙òoƒ—§ûïÏzr¤w.@éœ i‚¤r ŒnX ‰×£$5˜L<Œ<Œ<ŒŽ ŒÈÖké(a.ŭ)ĝÙßà·Ŭ˙ĊÎ@˙Ñd2yv<ż¸żży2™Œ‹ĊÂĤêŒóŻ+2:(:ÚÈÈé(¤ìş>Äĥ=%r£$›şKĤÓ霈)i"Òç?ŭ ĵ’e>µ-óPAfjŬ*Ħq#ZHÜ@ec2N<Œ<Œ<ŒŽŒÈ†Ga”×iƒìĊ?žû˜yÇ=Ï cúóÉdòµŭŭŭoîïïż:™Löçóù<˲튺6ċñ‘ŠŒ6HÍ}£ŸıraDÍH)I’"˘"’"‘sŸûíìéäŭòĜ{NÄçî†ÒC3XUŻP‹Œ¨ċ°Ŝ"f쏓•‘š‡VNlFo4tNĵN0*JKˆ*†(Î÷Ž0Cöüï@żĝ;ÙÛïÛùt/OO§Óg-Œ.Çŭét:Ͳ,eĉĴ%:2+Ru]íĈî+mz„´ê”—–ô]s?É ,ËR!7+","ĉüWŝ Ŭ_~j÷á§nßşó! ĥODS!ğ§dKZžŒoŒòë!‚vçn£Ž×c#£Ïó×F¤uŝ™†!HEÀâdßĝ-ôŝùü­÷Ÿŭ³€ÌçÇésñĝ…"2j݈’Žtt´É@j ¨HڎWAÉ“, ĜèÌ,œlû[_œ÷ĉûï|y÷ÒC£‡ŸÁΐ֖F#‡’{ĤŜ-×ċż=ŜO–ÍR=Œ<Œ<Œ6FJçy‚Âï~ĉŸÀY|k÷á‡/üa²˜?3žLż1_ÇWĈñŝ|>?FŬfr@tät£$ZmJ%Œ1İ…˜Hİ1f1äççw-ĈWùÊ7.êÇmğë¨`(…ƒ)<˘ÒƒneÊìu€Ñ¤pa0ò0ò0Úl@ÚJşuŜBBÌ>̋ĵ{ĉáÛ˘çΞ8÷çóÙôıétúÂx<~y<_L&û‹ĊbnaÔ14SvëFHͧH‡QW=’jIŬı£&c ‹‰ˆcL–Ô³è§éìîéŜ+×^şxċĥ‡ï8ñާtpĉNX+a¨`cí=ˆ#yϒĉDŬĝ ˜ĊÒ~TŭÄWÍ ’Ói†4e*“Xa>ŒÊ9YŜ5`$RĉKM¤oŸÛáZcĠö^¸–[íŝûÈYPËs‚jϛ?Žzûv÷çaäaÔ #•ïi•Ŭ+dğÈù ŒŭÙôÑÏ|! ŝ‹ñxü £KÖîl’$É<˲¤eÏ赤êĵ¨áíÚÒxÍŻÍÔZ˘¤rĜôc˜™Ùr)MÓtfŒÙß1fïd²ß /?óĥk<³ŭ–w"Ü9„$ċòM’ċ'§PûËîÉ}@dÔuA.&/|­5îğu]¤ë¨32jqz=Fmï…ù‰Ĵ˜h–"#^+:m…QÛY)FF‘‘²·µ$½Œì›ż‰ñ§ÇoüŸ$‹ù3ûÓéó“Éäñx|e6›íÍf³išĤ‹4M;oekFG]VAвK9HäÖ·Zo˘–7nSvİš³_ŬÚŝsok a @+­uEQÜï÷ƒÁ`{8žì÷ûgúŭŝù^ŻwÛ|pâĦiß˙ĥÁÎ#O":sX4ÄHF²Èì‰èÌU™TA“ĵĥQšĉîŬ5ċòaÓt²”;<\šk"<0mĥ^ŠriŽ–ƒa{8]§˘ŬĊÒFFí{F( „H³‹ìĊÎĝ³·Ŭwĉ“ĊìĞ“Éäñĝñx|Ċĥ˙§iş°QQvH ĴŜCê\ ·Ÿ‚⁴”š_•óµ &ŬĤ&œJ0i­0 £^>†ƒÁ`{0œì÷û§{½Ŝı(Š.Ì{£^Qƒ{§·?°uú‘w!†áİ(ŠNîĞèŜˉÜ~UĊ[êÔmzxÏCĜş˙„g.ƒ´Û.‚Ċi­Äċ„ÊĤšàĦ nˆ{{ Ò„ĞżVç“Ĥ½Ž8ŸĝAɌ˜óIԍ6Hœ½]‰óûDŠTŝÜ ƒ˘|’.!ÁRÂ!Ÿ0ç0´À+À˜ƒ `“C x~Éżçħï,àLJ;1\ƒ,ÊÏ.>NÏöÏáU|ĤùİÀ, wŻGÈÊ7³.˔·{˘6)'lŬÈBR-0lħcùÚ$ċm£7Xš.ù÷a˜)ğVÀhßFF_ÇÏ_ğvíÉdre<“$IŒ1ëÀˆÑ]ğŞ÷ÑĦRuHëiUê HmP:Lµû´ÖAaE‘S?ŽaÇ[qoGQ´†áN;aîLĦoÛÏp~l°µŬOtF'Ï#<}ŭ30¸p(äof{ġA*Ì'a]DRùÄ='Hì>”p.˜ ™”*_Ñ… ’0¨ €…ÈNܒ+uñ*Èï+<ü„óçAÖHÓÙÀ*‡˘ i2})Ş`ÈVÀ Tġ8#V ™ż§âġÊyQĦıX@AdÁ (Ĝ”ƒŒmÄĊœ‚¤&—×Z@çûy\F_e´Â‰öĦ‘Ô䟑Ĥ ĝ6Ú%",Ë£¨Ää!*£6I`SFa²´çôzÀhġìat³÷Œ(Š€ €¤ğȞûU0Ú·0J #÷öĦ`ôĦ}H>ò‘`ӁtdêìÚ²s7T}CĦŭôFğ/^)!7ĈêğlħX,ĉóù4Š˘IÇ{Q]‰xEÑ0 Q†£ v"†§µh­‡;ɵñöĝòWOfÁŭ9épĵHû’ĥSˆ½Ôô$[,°­—ŞŭuÍRaéšàhjı‚İqQU[E-Û!­Ÿ8Ħğ:ĴÍŞxB˘Ĉ{íx°t,I\•¸ó¤íŒ 5ֆ"KŸżÛˆJœ=½âЈ@Ċ;ˆîûŜ Ġ?“èĤDFF#­ó…ŽÖì²ç—a´··÷âd2ıêÀ(ıŽŬ*ñB§%‡>ô!9*óüQ*Œ]5íı÷Ż%DşċvñUcÄ£²,˒$If³Ù4 0Š˘^†ħŭڏ˘¨A/‚Ö:ÖZ÷”RñŽÖħR*"2‘Ş€(ĴÁĞ" ğ‘]9ى ~ĵ.Ayc5ĜL/Ŭg=5JİÖşWı˜OżĵFëĵĦat¤ÔħŸÔ&œš‘’`ÙòTİş6µiĊżuäĦôÚ`tX•ǝˆ”ÖZÇqĴƒAĵµµµµ½½}v4Ŭyß[Ÿ|äÛ~ò—úŭŻNĠ'>I&ÖÛPòÂÜC¨Í<–=Œ6Ó(•lLĊ=HrċFh]÷…c £#!%`µÒ„VNM'qw/iˆÔŠI°-ut|<˜Jm‹ĉħ+3!Š˘H ‡ŜÖÖÖN£'}ê'~ùáO>7WŸĝ‹ĞXLÓĵVKÒLӉ´ŜvMÈ˟µIÙÑèTìa„[ĞĤ³Ŝt”ÎÓtßĝxŒ^ÇğFoà”Ŭŭ˙úkòÌß× B{÷Ÿ4VÉ ËNâŞ+aÉCéġKÙuÁˆ;`¤â8Öá0ŜŜŜŜŜÚÚ:7îş÷­O<öm?ùK˙Ás ġ›_ĵŠù8Í÷Œ2SÙvL´—…‰,ÛéV;²{Ŭ|)kX; Ŝ+ kÂè0†74ŒŽà|]àĞş÷°)ĵĥTž8WóyíŽËfŻX3:Zµş÷ú˘˘t]Œ(ôz==ûÛÛÛ'½ġİżùK|òمŝĝg/ç‘Q’ċ@i¤+ÍT ë"Z~g~O²´„ş‰0š0ÂFJĦ…$Û-ëŒ^G5ğżâ£c¤Ò†÷äëòÌúPĴŜ[hĦ.päŠ'ħ:NJT]çìÇÁ ˘–sA€RŠ´ÖÒëġôh4XF÷ĵéħ‹o{ê'éÑO>·˙ü$ó,·5R¤f FDÖEzÜuF#亁·ñ²,½n0’5a$o jş °vR!$½ZzÓ]'ŒÚڐ7%Ŭ‡†‘Üjï7¤Žl‚ä“Á}żöŒ|íoÜß%Ĵˆ–d 0Q ”ÚÚĤD>Mwc˘#Z‘ŞS…Eħ€RވŒÂ­­­ŝÖÖ։­­­ áž7=vñOŭÍ_zì“Ï-ôÇ>} IÂàIj]ÖĞ#Ċ ä4’²inwjĴšü—]ĦnrdäaÔ!oĜĉz‰Ŭ3Ĥ F{ oşHğċzaï·˙Ìe$³ R˜ŞZ‘•):·Íys9äôP"WMG°­,Ĝh“\ğeate]µ½fX-`´ûÓµÁ¨öWĈßû‚ch.vô#$Û_G2Îû‘€@îû—Ï ĝڏ>pàĦĊ´Lh‰˜€ƒŬ‡‰Œ<ŒÖ‡ÑşuFŞùğJ) úŭ~°µµ5ĜŜŜ>9n‡÷Ŝóèżç'~ñmŸ|vĦ?ŝ…ĞXŒÂäĈ³F ”· )E ²ü–šB=‰´­Š|d´Y-$‚u÷Œ^ ŒÚ˘˘ˆ¨ŠŠ>ĝN+ê7]ŭ‰T4ÇŞöûûŝĠWċk?òÀ:m0’"Ÿ×ùéĈ¤êVµ")˘Z@J)„aHƒÁ ÜÚÚnooŸ*`t÷#ï|ü=?ñKoûä³³ F‰d0 eĝ’˘j_Ê-Ħɕ²À"HWĥĜèÖ¨ĉÀ ó=£ÄîŬ|­Ü/ê}ßGíǸŽVËéÌN•¨ˆì„a£&ÛèîŜ_{F À×äŝu<Úvšé\gDtXy8 ¤uÔt60Rˆ˘ˆƒA´½½]¨ßïßwÏ£?ñîŸĝĊ·òùıŝĝwħ˜$…¤DĥÚv2ù'ġZ"{WÙ]v˙­eän•´ÛhŒìœĦU^ôê¸voŒäQ:İê8z m`„¤È9Á‹)‡;-Ĥïŭç_•ŻŭĜŭpĵ &Ĵ€Ó:Ğw£›²[[Ú­”˘(Šh8F[[[£ÓáÎÁ`p˙Ŭ>ŝÄğìż~û'Ÿë}ĉ’ıO3Hfò67†ĞȨu˘użq;ėdĊîÙ¨JJ]‡ÑĈÀH)+`7F@F~ig)Ş‹ë{\t-ş…BjxM0á8­ ¤˙?{çö$Ùqœ÷ÌŞ:—ÎìX€ @  (ÊĥBŠƒa‡ƒ2I?ĝEá?Ò³˙)é‘ ħ ÛeBeŜpHĜ]`]ììÌÎôċ\Ş*ŭPu.}Ĥğ§g1—3½ùE4Ĥğw1;=çœü/++sĜ0„ŝ}Ìs£ġ şfC]RŬÂápĜ‡z½Ŝç:Îžxák/żŝĠW_ğžÈĞomC6ÎŭĝvI‚D £ÒÏ8#wúaµ‡¨ÂÊLĉÂ5#ĴÇl†Ñ‰Âȧé@ÈjÒk[aGR ,RqŽáLÄzW4Ĉ°qQ,Óĵ ¸NóuViyšžJ­ChĈázÉ~ż ‡Áp8ĵèaôôÏżĝò7÷—/v=‘W½éĜ0 %@ÎĠö!4‘‡ÎÌ´wğ°pŝÂì†ZÚ˙ FG#Uĵ(֌ìn+׌`ŝá\[ŭ”QmB§ë;e‹€a¨şk¸ì{4Át8ĠcĠ˘>z¸ä{0”V˙=Ì+494Î(Š"Ùï÷ŝ`0¸Ĝëġ‹ĝ™'~ïë/żüŬ|íµë‰|ġ—w K4PîJ·²~ŝ„ûgÊZq¤*›ZŭF× L„èÎÉâİĝápN÷TZhFŸFp°3"?éµ×fı;íĈ"%ݍi;—.!K.MàgÜcı~Uğ—Àt8̓Ë<·4\ĴƒĦ;:¸ä`-M'â8VŜ ‡án·ûx§Óyĉñö—ż÷ƒŻ˙ôŭİĵúúdİÊ,`A ….MWœX?ĄÎŭÔ;* :7„ĥĈĴÚ˙Sk„ġjğEkF–aôÙ`D‹Qqš„›g”mԛ=0‚ĈyQ–2Ú#ë6Ĉ’ġĠL~OAu‡JĠ{buÑ<)VHë"ÁÈ.hÁïd€ĉU:Ò˘İo’ރA´ħħ1 —z½ŜcQ=óĝó_ûƒ—żûŭŻżv-q0J PfAh D }Ġ•˜ĵÉ5dpÀ)Àd½ûñE ÷WMGû?1èè`ä‹L@À0ÒÁ¨Z3úišL~s&`äîÂO%f âíu£òZh¤çV‡ÛŜ?KŽ PĴùĦ —¤6q™SRJ•ÎhsssĜï÷/÷z½Ç8~öħç_üĉËßùŝ×_ğžÊĞonğjşqB1!@ĝ†úĤWŸÔuфŞ<\™ŠĞeóîo„6 0:2 %€@ !ò7^={0B\ž+` r3µz|áStĊşR½Ħž{=ŠwÁÉs "vKû>˙*ż“}]”R2Žc5 ⍍áp8ĵÔét*}÷û_í†ïÚ=ÎÁ&¤ˆÈé$şġÑHÓĦżÉ5Nsĝ+÷4˙ԋ¨ÙD•׌ŽÏ)S*`7ž-gTü_t´ñŒtT`¨o}Ĵ_ġûœşwÇŭóâÄjĴS=èn aŝúÛ2ĝ=ĞJ)é[ĊÁ`pıÛí>EQ£—~úA"˙öíH'FÖB„@Pu•“ô¨^P§xĥèNWÛĤ8Óĵî@g´/–’ŬpFŸFÒŭA¨|i·OӍ_ßûÊ.ŝßd:ù홂‘­Żq§†vĈ1QOħŽdêİ;Ÿx‘-ƒéšµŽ?ô‘Û_8rPĵYT¨”N'‡%Œ:ÎQ}ñħç_ü—ż÷ƒ—^{*˙öÍğFS ’""€B`™ŞCĴœĠ£kÙĠĊB$ÚߛnN5]•Ġ› °uGU:#œF‡LÓùv@D€Qè֌Ì.èkŻÀĈĝ³ £òŝË˙Ŝy İĊ2ĥڑR/`(ÎikĠ> Ïq‰Ğ¤çD0Ú u:ÏÇqüìçôU£k‰ĵúöv#ˆ<” EUU‡µüù4€EœqL€Ì{Ĉœi={°3NÓ#ŒÄLo:PÊuíŝ:Œ~3Ÿ-AUHC‚אZ £ĉ&Ĝ"MWŻ´]=mvHĞ4J­?ݍ³FÏ}ġ[Œ^ŭ•ßg”şŭE‘µI„P ŬÚş*,,Q-5WÌ9òApĤ¸xÑAċ3t` y`>MWdBPo”zÖa@~8ġšĈ²5èÔ@3n¨LŬY’ŝM\ ·0’+è;ßéµ÷§š.³`§@èH„X"R€RÒo”3S\ŭt#"°0}ÊĝjÑï(˘bgÑl‘Â8„3*³‚ £C¨h”†€EšîúÖF3);RË]R-X’8÷˘d­…3R:£ë‰ĵúĉ]H§hށr=…+ĦDPR€ôëFı.7½B‰,6´ÖÎ8£š]Ş}ş4ŬìւĴ÷š˘o$ô=ĵ“uQÎUv-uHfRvTœf­­a´M‡€Qsͨ÷Ġ׌Ê4ŬĠ×· M PbÀĉşÒÁ(’J WȀŜĠЍ<ŠÎtƒsBĥVÈà~`˘ŭû`‚–zóâöqˆÖÔU0T ë#k„pŒH-Œiµ*H*N\Âŭğ°ÚŽ–ÁhYC8ÍÍÍaŻ×Û£yġ-H÷2°‰"‚Xt”€HùT]QÈàÏ,N—ZşÂĝà!&½V΁jUqì"Œ0ŒîÇ)ï*7v<½6½Ž×Ô0⢆ÊV{ŽŠiħĠnĉb@ TÉV[Ru÷£Á` ‡^ŻWî3*ÓtŒĈıÛ0m,D ĞD€PĠ`TÎql´ò+B¸$Óĥ(/JÓ̓Ñ<îĠ€Â0Z1Mçd¸4]ĥµ0òŸÛÁh^aÒéĞ€‘!żÏg·Wj(AkY·FatÔWQKÙ aƒÁ  ~żİÛí>î7½ŝáËßuûŒ^}} 2_ÚMD |C¨„[3ÂYÍk7W–y“›8LÖ7˙¨ż_ óĦÂA‘Û*KTUÁ›Èî+p°ċߣĊĴc-Ĝô*\N @ü<£Żgš~?ƒÂ7We µOš\ƒ,N×lµlñ"kwż\öŬ’ë>(A@ġŞ:Ñëġ‚Á`ġûŭÁp8,^yúùoĵô½ż|ù§ïOäĠ7îB– Ü jDkĦˆ¤i:!Šˢލ…²G5:Öȁµä 7=¤Ĵġ׿OäĉoY?$²Tŭı-P˘ê0*AeFĞ•vK—s•0}£ÔW`còĉÚÂhö*œÔ*•¸ŠÔŬĉƒUòŸvg.U‡QİN§öûŭŝ`0¸ív —úo|ï³k÷8›Y m\y·‡‘’nŸ‘ÛĝZ/íĤrÍѰĞÁÈZ˙œatò0B(ŭé#…k¤ï=X0*ŝ)?ÑBÉZê~ì‰O'Òˎu`ŞîPu½^/‡ŬÁ`pÛí>EÑS—ŝÊ·ŝÛ_ŭÑëŸbxġ;M5ĜÔ¸ o,„ÂmzU kΈš§Ä,<š0²ä_3ŒZ£˘5˜€ATu`xP`DĥjÍúZ*݉³WOáŒ|ÁJÎÙµ U7ÏALEywżßïôz½sŬn÷JEŸïo^xá˙û˙ü“wwèÇï܁ɽÔÁÈXm@A)TÍùxA„àêÁR¤à GT‰aÔŞ4]QÚ(@zgÍ6½šZßrá³˙É´ïÄ çÌ=B4aÔT]LûR†ŞßïÇECE…aĝôKßùz#tĝĞ;°{w ¤­sÚX‚HUi:)\š‘jAŜkAÀ’e…j:żéUô?|À`žÊTûŬ°CjYÊ"Q–j³Ör#ÙrG+—xGQ¤şŬn0 úŬn÷BǏ†aĝÔ ˙ŝżü ]zöüĠ_Ŝğ÷2°SJŭµô}4‹ÒîFP0”q‘ށĴĥLיÒ)Ġ`D £SwF„t0*ĈŽ?pkFġ”‡wûnĦ͜A€ĉtDvI§àŽ–êĉĊqƒ^Ż×;×ét‚àóÒˏ|ϞxċÍm¸ññ(sí€ü!k!%ĞÒîZ,Ĵ÷>%˙[@ÄZ#0:ġv@ŜıyF;~ìĝ£Ò!AuR3ZĤ˘şèli Hàŝ+Ë4F›³NÚ!Á0ͤëÂ0T½^/êvğƒN§s1 Çûç/=÷ċ˙ĝ/ŝìúñŜĜÄMrൠċ‡ìsêŬ³ëżE™7U€)!eꎀaԊ4/í)ÌKÓ=¨0*cžwIÄúZêjĠtŬ_ĥĦ§µ½›Xw„èS×u:EÑ#JİÏù?ŭĊżıĥ'ƒżû6Ôhĝ=Œ€Ü½˘Y*½€Šl™@[Ĵ!%ß £–Á…İ)|'<Ŭ Ž[ħ1v uö‹äü몘YžZ8˜X§êŽ`ŽCqN'îġz(Š.AĜc/ŝۗ£Gž?˙“÷vaş—ĠĴÖ30€A?¸œ Nċ͉ƒ €µEC£´Û2ŒZ#òÇP*·fÇĉžĞĤ{aàóÎv-÷ ­CBDŠP˙Ĥú,ħKj;Í÷”R"Š"ĠëġşqŸ˘èJg°ñÔSúç~yc×nŽÁfĈo|­*ˆÀÍ5]wî™ÌÌn†˘<Ġ[ÍéÂÀ0:IéŜW@ŞÚšÑ #hş#ŜÛJ YßDµ˜IĈ˘°†˘j#DìÚàŽ°v5Çqív;Ng#Š˘KJİGŸú˙üÍí, ˙éwŸ‚ĉYáŒfh1~|&-WoġNĠ<²ä˘ĠÁsÙjDŽ~¸¸}Fĵf´ß!Ħ(ğÒ3ÚĈ£z5áŞéÈĝ°Ep¨Ŭ-³NJKRᎺŬn7Š˘sA<ÜŬĵĝÔĉóßşò“ߎ`´—şbSÔïWŜ­Y@·X”t[(úvp(n^ l~ZA‰j›cpF £cêÀà׌ÂPcÇ9M7ß!ıcIìÚéÊ. ÂéJ'äO/XĞĈcPşn™;š)f‚@ĊN0 /(<ŝ­˙µ Ê·íċlŞċĤ6÷ŞHӉF,wà˘Zܨ6ÉÚ*uÇiş†`uC)ëÀPÀhÌişıǒĴÛ갆UvgħĊĈ9 ?j½vİ:ŞĤ£ àîŞ-tGà¨öz½NÇ .u6.{'ƒñ8› àÖoš°*Ç áœ΍4ÓXµ&K‹Óx £#„àÌp=T!Pz—at Ħ5]†8û);áJĵ}[g Ùً‚ğ}Ÿxì‚ aFAô•R›Ñ`óáĝ‘ç6˙ġm˜ÜştrÂk3.™ +,€uġvħa†k`(*íjc˗Á¨Œí £Ï#µÊmzĠĵft9Ħµn…ĥ);ŞNt¨œéJ.À à™HÇFĦċ#Êa D*Š˘H)Ġ—Rnl>ûòÓğ ‰[)P˘}Ô˘Í „dĴ$@reŜĞŭGûÁPÀĈu²%LÁ¨ìîÀ0úŒkFŝT`è'½~ lLF‡ĵĜjivH­tHġóŞHÓU;b|Ċ•m+:q×43VJ)‚ PAÄJݞb_yúĦ;ğèbÔĵµsQŭıEAèÊĵŭÈ ¤jöÖrŬ!Q­¨Ħֆˆat iş˘Żd¸5£|ôŻÀĉôͽ/?uat¨;pÜ쓌tŞÇÇR5"Äĝ™Gä7Ášj˙ÏB:À’tŬ´]†*‚XÑB £ËO>•ıžuÖşÎíı]#(GHĝán:WXΨLêÎVŬĠ]èè"@HéœÑµĉÄÁ(MĤ%ŒöööĥÇñè‡dç]r ¤–DÁ˘ğjq—[+f>pĝj;k817´ PÜ[) !:RÊntŝÊ% £ĥĥ26Ónŭ¨Ì³íŝî†Àĝaȏ,GÀı´tCµ˙FÇ#%Ë4 Ŭ}*lNŜ`ŬŻÊa÷ħœŭ*ğ²Ĵ}z•ömÈCD°µ&։ êI!GHÑí<ü…+‰†Ñ8BŸ–(\îA­tDuR֋ZfFSÀìşèèKğCïŒÌ=× ›Ó·FGrY•g;İui;M€ŞŜÍÛ5P޲êŽuÄ\µ3CÓ!I)BDˆĜ•—7G™k,PfÜ%·ŒÊ?²ĥHς[CBBFíï׿ċƒĜaŒàŝa$„K—J  Ŝ½Ê0:úÈÇ@j1Aċâ\Ù*hĉ.ıÖ œuR·oÍçû֒¤S „ˆ1Vƒ ½ñ$Ê €@Ĉ4{ŝ,„Qôc‹ ÁœÀ_~+ÓèÇ0šù÷UÀ~í]i·v×­MyÍèè/3NÙµüfĦ<¨ÖŬÛ.¸HY'ĥ›’"@Ä#Ñż'P  Dh³0ÀӒàï›ı2pĴH‚8/ÀÚ}ŬWFŸFB ĝ}FfôûŻ0ŒŽ\V1ށÔF×Z ~d̔zŻgğö–AĵŜ疏„BÄCèlĈ;·sßĠÛÏĈ)72Ż£z:Îwğ èö(!5/ê9Ĥ‰atxĠ7"KáşQçwA#†ÑħHT}³Hí¤Y*KğĞÖuE÷o;ۑuZ°šÙ‹$„ˆ¨14"V÷Ĥ;U7zq ­£™†˘!ĝLš“ê¨5a%šĊ0ZÁĝûJ{ Ż1ŒŽÍÁúĈħ5ͧĵVük[Œ7ç ğS‚ÑÜ÷¤”$"J÷b§‰.‚Ħ™ |h́‚;Ì“Í0:´3Bt E£ÔÜġĤ}FÇèŽÜ]6XŜ‡Ô⛆úĥ•µµÎĜvúL×€@D÷UE1ĥagí-`@”UšŽÑ)ÜÛ5ĉƒħCjáC9–j³,XMŒ¸Ê=GÍÉXk ċz<Ò4³_0Œ %kFDÎ…ëÚ­·y„Äİ]8ç^¤3˙İÊQŝÊŞì£˘ÈÁïÔ'îÔckŒ5Ĉ"ʉ(7ÉN… ú¨Ö0ŒÚ²éU*%eïĝFİ £SÍĜp•];P½%PĠ™¨ÖŭÛúŝfœ²kÈZĞ­µšˆRœl%ŭPĝŝƒìŒZ#,†ëI7BBoğ4Ŭ˜çħH Ĵ-g°Ô_ğ ğêÂ"ğy׳ꐴÖı1&µÖĤ0;íèLjX†ÑiHJ#?\Oïĝ5#†ÑéĤ„Äjçé´RvHĦ NPUÜa=ġÀ:íDCùĠTÊĴµSÚğu/Аħ€Rùġ †Ñİ9#rûŒ0Ì=WMÇΨ]—ÔŝÖÀ!ı‘ċ(‹:×h•LĠ(“r[ŝ]Öİ´Ö”çıö@JìÖ·ŬĜëRĴR”’a';BB)€(ô½éĥŬ .`hÑeg[˘1Ú—ĥ³z6EWÌB˘ÜÎŜùħN>‹^—ïk­mžçıÖ:1ĈL`÷“ÛJïĤ €îĉÁè¤ÓtÂ÷Ĥ+`ôÏ3jŒ@¸Ô§ìZ˜²û‡Š‘߁é†ôĦîÒ`•A&Ïsçy޵žcFÁîµ½0,*Á0:) áœù=}*0úocÈÚÓ0ÚxP–zç’\ĦŞ;wEZ.j8Ièœ×ċZkµÖ&˲4Ïó‰1fOn½÷éĉF  !cf÷€œ’3*ŝ_%T ïŝŬÙµÖ!ÁÚ]ƒ^v´?Mç;€£SB‰\7pNٝv oFyžë,˲<Ï'Zë]qëk°ÖMŽŸb]cÑ)ÀHH·f¤$`ın”Úî”ĝġ#Ò ¤ĥ†½"MGı­nĴ‹8 |óú”ÓÌCkm3§ħÖzĤ;·âÉġ]_nŒ £cíÀàğa R.MgïùĤkżìÁÇ ¤6Ü0@­`ÁşŠ;2Ugo[œŜH†’N!Ms‚M™ĥ˲,ϲ,ɲlWk½ÓıŭЏşò8–‰at›^£§év¸€áì=·$!¸SC;£ĦßôZè™bÖrşîôaµÏ-YkmšĤy’$Ó,ËFyžß>ùÙo†AĤ)OċÊż›ëI £Ï^ڍ \5Ŝĉ}FgÉĠ'0Zí|3U2àQ5‘‹|ž˙´‚Ïç“Êi;cŒIö²,ğgòìÓÁîÛ["PÒÎZWŽÌ0úì0˘rFJşŬĊ>#Ĥ;3<ğ… g?eWĜWpĠv~ÄŻ&7­h›oim+SN•>óƒ-yÌMÛ%I2ɲl'Ïó;ŭ›÷vwˆlZÁÈG†ÑgìÚ­TmžÑ6ŻE"Ù.ûn5šÊ@àöTmmîI×ÁĵÀd­µyžëÄi/˲-1uíĦìí-à֎˜ÊXĊ0:<ŒÊçuĴÇ0:caNĴu4ħ>aŞ†2MçQ­ë7ëÄD€İ THét:ŬK’d;ÏóÛ?ùğ·eg@ĈĤ'’atżi:Y”w@éWÀĵµëaô.èĴ]i\e×ÚP+íĥv6M‡ġ;E>FìêÁŞüj­5>m7M’ä^šĤwÄĝ÷JŜ½ VIáŠÈW Á0ZFEŜ Sßµ{úÖĵS£ £³”µ³´žígÖ ìÛȒßÛ<Ŭħ VìNÓ5т´ŬŒKšL&ğÓét+MÓO.ŬúşèDlĉRĊÍF³|˙>`G #8Á!a„ $`FqUM7}“aÄa›?ÙħÜ,TNÑ}"Û…ÈÓb•8ûı´‚k²M—”Ĥi–$É$I’4Mo‰ñ­ß=2ùĠM²İە.J›[_ĵÑQˆNFtÈ4˘+`PPvôû?dg´Ż8Öĵݝ ĦşkĤŞ…PĴżÏE '™ş›·÷È.“Íó\O§Ót<.éĉ•;˙ë_z*‚ éúkI ¨áŒŠ”uHċ׌~Ä0Z ­w ;û@*jòec]Á’kŒ[@Š'Ĉž$Œ`”ʂи3yžgÓét2™Lĥ“$ù$K§7žÚŭÛ×4‘I\ırıáÙ0ŒšĠtĊp0tÀÖÛ Ż˙È00ŒÖì}Hgàœ´ui:żi\ 8w:M§4/mׄRY>Gñx+I’›ñĝÚ[çżŝ` @9 À@¸µC†ÑlY#!\; kìŒÖ×!ñ>¤ŸfPB‰û”áSùXé3h–ŽžhĤêêÁVq7™L&;“ÉäV’$7Úŭ§:/ĥîQ>àş·Óĵkò…QQ}E.YTÓħ3Z‹m}ïĴÏ>´m<§ÊkIËeß§“ĥƒ%hžK2Zk$I:G£Ñhk2™|œ$Éġ§vŝs,'˜€P(\§êrmA…‘ïf(@”ġ¸šn=M’pCŜhŭî²Ġ™˙Ò3µf$jäÉŬL\*Y''\⒊²”"!˜<Ïóétš!ö”Rw„”ñ3ê˙lŭñפ€p”f>b? 0òUu 0Œ€’;ĵf´öW•@ı–M­Ċ§.ÉUÓcĦŜĴuLĴcKÛĦ›ŞWÑ˘ž­H4^[_àO&“‰RjGJH)¸??üĞxñ‹ˆġò ÈĝƒMvŭ`Ôü-6ğv pûŒ²-×^Íäíe0J1y@M1ŒÚî`=çğ} y aċ–ŠçE ,‚ÒÇ:…#„KRw¸È)i­sDÄÉd2.€$„ˆ6ŬÉ~§ó~ŠO)DàR²Ğg`„Xô4SĊ>£-ßhF×www?a­™;ĴA‰ÔşxGT‹yU™·7醜;b‡tZ0:hƒ,6€T‚Éc’$I„#!„@ÄĠeüµÊ{*úp‚‹Î ”Òşœ…Ċu‚‘! @Ş(?Œ–èF­wG²Z;ZߙQ­´ğpFŒê%ߚ¸êûäÓv8LM5Ħdê_­µZk “Éd‚ˆ „ÂI> ?—yŒrkb.bça@ˆ€ èÖA³1}]œ €Bİ…JnöcĜLßÙŭò“e×îkğğğ·FkzW­ß öÚ¤ìJr£'*gTD}í8Ÿ{ï…'gFHÜÚÛÛğ;G £uğšü<¤zhR›,Ĵƒirǧ€‘uĠu@n`JäN §ï’`N £˜šİğJY–Ħ—€jË=Ö}‹$è?ş_xû=ßÁCş!.ĠeŒïkĜBÁb•}é ˆ(3ı ĉƒÂEŭ۝çŸĵI2}oooïÚŜŜŜm†ÑšËÒZöħ[ ù=G(}ŽNÓL/;òΈ´e‡tú.ihAêêÏ­µeÀ˜ˆ°öçtóŻF†ùż—>!zŞP–ğ@Ĉ–`"€ùĞZ§#l”voĈHÊr( ”`ĥß}íUxHÜÜŝÒŝ~:ün4ŬĜÛÛûdooog2™Ŭ £µ“„j §ìÚh‘ޤ½+w‰Y½¸L†QË\Ò"‡dk˜Œ1y–eċżADd­µDd.Ñ{: ĈÓßܽ÷ ž’]v[”ôsŝü·ĥöôa„ġ?jÀ¨îŠÀ`‚ŭé/Á\{•žÚ˜~ôĜċó˙8™Œ?0ş=ĥ'“É8MÓú>£E bċ{;²kıI­ÍA"¨`¤ÉÁ¨Ŭ À]ڒškIĊ>¤&˜`žK4Ĉ@šĤu(Y"2ÖZ=èÜÌM·ßÙ½÷bÒ{>†ĝa@ımV¸ŭJċšc“5¸ç<£ı0Ş­ù9F €DAD)äŭàGo~ïÑÎğçúŭ_ŒF£ëñĝ£Ñht{ooog:NFë.Ĵy\öŬ>Yëî$‹ë`„RÌĴ Sé´]ÒĵŻ€4RFµn!MSpĉˆÈcSŜµ6ùŭ8ı÷Û½Ŭon%_ÜÄÍ'äÈj@)´˙vhĞœYm cbíÑš0Âò7ÒCˆÀ§çP!ĜÑ 7ŝ7„ÛżLżú̕Ÿ+4ïŒF£ñĝÑh´5v’$™Ĥi:o͈a´Vr÷oXíµd µé†Ħ¨Ĵs $|5¨­iQênQ oám˘µò<Ÿĥ#ë”c’1É3|÷œÙ}ñ½?|’Î˙ÂĝaR€(€t€Ê­-Ħï9Ev?ŒöŻ×\ùŭÁ}CÑÛÒœ[*@‰@v úóÑOès½Ñ'Ÿ{ä_ò,}4~4‹JşŬ$I’<Ïë›^›îÈ2ŒÖĉ.Ïsˆ‹ÚíbkÁ|+!Dt0B²ÄE §ë’ĉîĉi™SÂyNIkMI’€µÖc´Ö:ÓZ§ZëñfG^êLnĵwçÎ×îDÏnÊÍgó2tĠ™…C2~ĥ’\pÉFÚ`´Ż„kOÉUŭ•WaèÖ”Ğ˘C`ï½ú£Ÿ@¸óëô+O^z§;™N>œL&7ÇñÖh4ڙL&{I’LµÖıµvQç†Ñ:]O(ĞÔòäs‹u2FñÈ˙ĵŝUúŻĊsY{OúŞòŭÀ)ޏÓívû½^ï\Ż×ğÔétŽ˘è‘{vÂïv/$/Ċòüs€jˆ(×@eÁƒöîşÖÏÂbÁΨ4BXV|–íĴ¤ò́ÑçÀ&7Á|ôŸŝÂ~nn?ñèĊ_è<ğ‘$ÉÍÉdr{<oû‰ş£,ËR­µĥÖĉ+ĤçF,‹ĠpI¸LXƒQó!`jBJ€B¨ Â(Šân·Ûëvğn·{Óé\ŒĝĦ(ŠÜN£nŒşŸKÏĈòܗ˘‹îÛYd­ë‹g||v³lŭڎkÒKÖÎwFs  ŜÖ ½“ʽBH7żkrôÇ˙öÖÏéJ/½û…ÇzÈÜH’äétúét:½3ïM&“½4M“<ϳ<ϛëEV_/bħH,†RF°Hx”š@*B%TA„N§ÛétzŬnw#ŽsNçbE—0ĵ|k>˙Ñ.=2tċċßì?(û,œr€Ö@$ ÜV•MEׇúGò=Ĉ…Ğ’3Ú5>%TÈZ7ŻÈï›#;{çm0Ÿŝpû]ûPßn?ñèċw ×Ò4½$ɧÓéôîd2ÙöéıIšĤi-E§@è 1ŒX $kE(‰CşıIĦ”RAEqǝN§Óët:8ŽÏEQt>Š˘ A\˜Rĝĝ'÷̓·ÓÎĤŽ.+qáYƒ'U@..gÈhòŬĥÁz( ÷~Q!èGC [£’èj”Êö€öƒùô °[oCÏnMıĜżŭĊÍwÉê[Y–miz'I’íétzo2™ì&I2ɲ,Éó<3Ĉ˜ÚzÑ"Í‘ŭ‰aÄb ħHG EkLRĦQA†aĈq܉¸ïQm†a¸Á9İÔù­ >yoj.mì`ŠŭX Ż€è? ıĜ}PġHxgTĞÏ(›˘Jż ۂMG@ɧ@“Û`÷ní^ğwzbš\Üìì\:7ü°ßQ7ò<ßβl;˲í$IvÒ4½7NGÓétšeÙ4ÏóĵQ¸pPjnÑZ‘]"†‹Äb(}F(­ş$|OJ)0 ƒ(Š:q÷˘(êFQÔp†á@)5PJ •RƒÜŠó;ó^˘7§™Ž“Œ‚Q.; @ı6ê¨.€žċS—ĥ³lşíA/¤¤‡i/’~lŸÄKwµÖ{ZëŬ<Ïw³,ÛͲl7I’QšĤét:MÓ4ÑZ :¨jnĠˆĊ@bħŽJè!³¨o˜D L•RJ…aúˆN†qEŬ zŝѕRv”)eGûG8N͆6!˘D1ILGë\ğÁPX"k$BÖïÛÖÚÜZ;µÖĤĈ˜İ1f˘µçy>Îó|œeÙ$˲qšĤÓ$IßU×@d8 ÓHÇ5ŸˆĊ@bħ>;”šÏçAi™SZŞ8I)•RJz>…aĈaFJİ(‚X)I)#)e$„Š"*D” ŠáŻ%KD†ˆ´‡Qn­ÍŒ1İÖ:3ĈL³,KóçĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊF’jIDATxÚìŭi¸déUˆëÛ;"ΐs–TCVYˆIB`úıĤ/Ž$  kĨħħ îĥŬmCß÷˙ŭc½×v÷v_7nŬ cĠ  ŬXB4£š„ŞJjÌÌsbŽĜû[Ğ|ŝöŽˆ3dĈÉs"r½ÏS•ÓɓçD|{½ßZë]ï"BĦP(' £/BĦP(” …BĦPBR( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦP(!) …BĦ„¤P( %$…BĦP(” …BĦ„¤P( …’BĦP(” …BĦPBR( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦP(!) …BĦ„¤P( %$…BĦP(” …BĦ„¤P( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦP(!) …BĦ„¤P( %$…BĦP(” …BĦ„¤P( …’BĦP(” …BĦPBR( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦP(!) …BĦ„¤P( %$…BĦP(” …BĦ„¤P( …’BĦP(” …BĦPBR( …’BĦP(JH …BĦP(!) …âô ×—à ˘}*˙£èĞŞ8äYY=Cw0DÖëíWB:Ù`˘ÁFq”óp”ż£gGĦ„¤ċX?Ÿ™;÷ÌI‡ôÜ(”4¨,ƒ¨dżÏóö·ż]̊ĝŬF’Òs£X@şn5Èc}ħĉ÷èˆA…n‚ˆĉŝ˜µ"£›9/7uvôÜĴ~û·{­UÙ-73˘äżyżw˜Lê ÏqĜ[ĥb5ȈyŽ:K=7 %¤;ŒŒŽPŭw‚Óà²dt”ËLó?s"Òs£8ġÒòÉinıpáu:³ħħA­V‹Š˘ñx,£ÑH ÛíTrĦ9ż–\´ ³~gĉÜıs677)œ›Ñh„ét*“É„ŭ™9¨Ls~­çFĦ„t“y?§sçÎÑ]wŬ•mnnšÜÁ@Q˜L&v<—ÌlûŭŝAÁAĤÁe=Ï":wî\Ŝétâı9sĉ —eÉánooóóÏ?o“KÊ"‚j^bôÜ(”îÀÒü>3Ê766:›››­,Ë6ˆÈXk˲,§á°‘‰µĥFœŒˆi&¸ˆŞTNçA™ŻˆÙ·Äĥµµ•moo·777Ûívğ“eYKD¸,Ëbss³‡Sfžĝâ‹ĥy“ž›½˙Ï‚Œ{ĊŠû9+!)—Wö#£pÓÍ:ÎĈÖÖÖVĞĠ:sù‡~ìêŜGŝà€b:Žó<ïÑÀZ;zċ•W _ĈkŽEċ—Ú-˜ˆ4¸ĴĈùÙ÷Ç­­-ÓjµZÛÛÛ­VëÌÙozŬŬÜŜ8W~éénžç,ˆyž÷ʲ2óäċ—_ĥs2h9ìeFÏÍ)=,žŒÀ¨È(ĵM²~m@5o`!ĤĠjeN§çùÙN§óêïŭ‰·ŭƒ+˙WŝnžçßĵħħñNçíí틯zĠĞ6/]şÔît:êMk“ü<ŭÜ4ïvMKô8RܖKÍ̙êt:-cÌvğŬxñî{ük˙ċ˙í_f÷}[­Ök;Îŭ›››ŻşpáÂö… 6._œ7ÎISô€9?‡ž›{‹ Ÿ ËÚfIJHÇGRñá'"CDmcÌ9"zġÑèìĞżïû>çß~_žçߖçùk766îŬÚÚştùòċ­Ë—/·ĉÍ 8JJĞp(Ş÷b?ÉwíŭjµZYžçĈ˜KÑènsĉìkìÏŝò˙ŬÜuï_Éóü[:Î7lnnêÜısg.\¸°qá…Ö2šwn””V„Œ€8=O Ş25‚–ì–K@Ày.µˆh‹ˆ.ï&g ­·ĵ˜Ž.·ŝßŝ€Žˆˆ3“µv|Ĉb:ròyeAùeŜϵ ³ÂgĈŸ…À“²xġW'8{éîò=˙ĝ—:żùÏ~Ç^éLğŬÎĥ··ˆµv("“½½½PK˙›-ß­Âiáä¤0 ̎” „¤˜½é87""€œˆ6ˆèÊrkÀ@N„Î[~ĉ?ZŜ–Gë÷=™3gÎk툌vww‹ét‚ 7ލ4ŽĞ’ÒjžygĈȌ19Û …aœżôêóö=˙ĝĉŭżöğ­/njÊZ{Í˙ĵèvğĊœ3’ŝ¨¤´BRíZ!ğ–ßÒ1QȎ˜™D$‘ĥˆlÛN‚3ĜÎ ^ü‰w|ûžHŽŭv¸S’-÷ööŠ˘(,€ÌÑôzd””V–„ö=;̜1sKD:°öŒ À]›9ò{ïÛ~ñgù-x˙Żnĵ.2d­5ÌÜêġz?Ísc””Vb”ˆ¸* #NqGë×qQB:ŜÛIÊ/!SjA$;—ܛl|ú'ßù-×DH)1Öژ)uğŬ@J&ıġBIi%/3]jŒ?!SÊtˆ—rƒğZƒ{^óÀöçŜûËo–÷˙*µ]ĤÎRê÷ûeƒŒ¸qf””V K"˙ [!ßGÒ Iħ?³MeÌĈZ˙!YÈ D† ƒ§ßöΟ‡ú‰9sÌlD䆈Œz½^ tք•”VŽ”RK³GN,3„ -ƒÒ H"ÀwżĉíOż÷ż}3~ŸRëúKfcc#ü‘>€””¤QRR:í&fAÒJ†êOż’âe$—P~3"BD N¸ñ¸˙adßÒÉ`Ŝöż ‚<ú[gΜ11 {½^Q–mI%Ġ'%ÓÌŞ™Ù0³@"°`ğeÀ…Â(Ĝ-Ż˙Ĉû·˙Ù_y3ŭĈŻA^yD$ö•˜y "“Á`P6ÈGIi% ~ŜȽER (#'ŭ6ë—")!Ŭñ`ŸŻI)†˜hƒ€ħOĊ- &àµyzÛ;üŠ0ùL)Ŝx}ġûŭiY–Í;’’Òj“SóìÄ÷<žH a@€ à;áŝÍ'~öWŜŒ÷˙SÂ+/Ĉs> Ċl1HIétób"×7Ê܏"²Ž;%¤%‘íCJ&Jĵí’ sTöa€ŭs>à›Zĝ­ïú5òèo7oĵĈ—aĤIĤ¤¤tjK.tž£ôìÔf…üû A 'WŞcv’$„)3X€oàÍ'ßó+?&żñĞ„k/"Çè‹ ‡İ’Ò ñ‘-AĈxVüá²%%$E3 ìGPi` ·U…ƒEKH0aÁĠvĵġŬWż ŝv:›˙Ŭ$SRRZŬÌhŜïĝŜc|Ï”ÀZ'FRì'ĝKa `m\Ù|êŬżò£ĝ·ż ~ùyÓPmö`8jĤ´*%3µ:H&ÈÚ(!_ÙĤ˜Jü‡"uŭĥk &`ĵĥċHékŽ”âż—“’ÒʓÑBefȆù/d€¸L)ĵ›™2`}!ĵî5÷o>ġ_ŝQüğ_#ĵü<ĉ]f†áAgFIéT¤H>&roı ˆ¸²Š’âÀ`³hê2r‚†P &-r#ç R’à›[ä­ïşú5É£ż•~ŽXĈ %ġɨSbJzñMF$Ĥ6 Z†‚ˆÀ 0žX|ëkîß|úŬżü#ò›żJxċ…ÚżΠ’ÒjıöĦż‰$‡IE Šˆ¨ùëx ò]f68ñĤ‰DÈ!hS!ä,ßÚÉÁo{÷7?ŝVĵñĤ_€’ÒʑÑ~g¨&Jp﵀@‘‰€#‡AÛ¸ Ž×= AY2^w˙•ͧŜġO~¸ġ›ż\Í3£¤´"œDÎ.(>ÁÌOJHŠˆhnIĤ™u_DñJ@²$ï4Ï LD òÖw}ó )Í@Iieˆ‰ö!"“fÖñç– 8LÄ"Ȉ E„œdÜıÊ °$˜Xà;^ó ›żûWŜ„÷АFĤ¤¤´ Řâ^¤àµĦsHŠˆin_ 8/¤˘†‘DnĤ 3îÍÈÉyÜ^MċÇ &ÂxŭFzëğùë̄ßŭ))­ÍefáùIÛì{.İ&d2"´2rÖŭä”0˜Œïĝ†+[OûWŜ„ßü§ê;%ĠĦ¤TM'ŝ²* ujPŞ 3ïĈ‹4[J>nž€K‘qÁĊ‰ÈeIXqsJSĵa#żí=Ż}ĝQüî4SZ_˘Ş.0ŝGòÄ7-dIYĵÈıZÈE@$˜í÷_Ùzâ½˙í›ÚżñĞ„k/@3Ħ#‹Ĝ+_ĤseŝjTD Iq’J…İ/Aĵü³ÌŝÖcàÊ-9(ö+3†dqM„ñĈÍŸyÛ{_ûüR AIiċÎÌܙĥ*Ğ—7‹@ ı[³˙(#1ĸlŠ’wuÂÀw>p˙Öïŝċöżŭ5()­Îé OF ˙cĵÏjIqĝÀR 2épĞ„W;B"oÄÈ)–Ì2Bĉ7cĵqӀŜúž×~ùGûż3CHJJ+‘™Û{´ÖĠq- $sú+"Έ?G€dîbm˜@ì2qÉĝŽox`ëñwŭ“öżûgJJĞĈA@[vġĜ5„Òm ,I &ùŞn>É_2s>Q Ŭ'#ĵaÓ@~êgżùyà÷˙ŭÜ/HIéԞ“EÊL4³#—UûwߘÜP¤+ŬUcÁ"H 9‰Ğç•nÈ`*Œo˙†ĥžzÏ/ï´S3U€0Ç7—ëj(%$ĊBÚ/cštÂó*R–…‡N‰×‚SÛ Ĉ GJo}ïĠ()­ü™™!£Ú%F|†@JŞ\||˘FĴ2DÈÙ™,P²Ċ·>À֓ïĝ';íßú5àڋJJ§ĝ° 3aSlRBR23Ş‘RZ²£Yĥ™Ĥĉ=Ɇ€L€ĥ1ŽÈx–ÁgßöŜĞ/))­òٙ)ùÖÊĵ"ĞXxêÌ6­8!†Ú§z%8^z °aeÂÈ2|àÊÖ_ĵ—•”Nuz”ĵèdö.ğ¤=$ĊáoĵûÎ!g)ÎI}cñ˘óiĵ´—"°^żiıŸTRZRšùı ÌŻ ço™aq%<fßg1*wmĴ?3e)¸úÀŭ[Ïë—wÚ˙NIéÔr’„…ñƒÑ™8%$Ċ­°ĝħ Ŝ]žM°…°!?yż [’`5T)ÈG,ĝŽ-zë{´|·~“#%ëȅğ•̎˜DÀâH†ĉœšôŬÊ À%` -ïğ²ġe͔N%8 Ĵġê' )“’âÈAY‚Ħ¸Ž8qm.!°B`ŞöMï—ÂNh“ûR²PŠàu›è­ï½úĵĝߕ”Ö(c×GàB ֝Ÿ‚0J!ä^ŝ ƒÑ聜÷瀠,E!xàŜ{·ŝògŝñNûß˙?•”N#Ih"ye]eŞ+*ûVGĜ,û!ĜpiN-°ñ(‹¸ı“œ€6œÍP€×nìÛŜ{ġe()­|ı&)ġ ĥöĈ TJK°Ĉ§ȨĥíÚ[ˋÏ;`™Àt§Œ¤têbD$¤ĵĝİ4ĥJHŠ%ÏF!CqDdá\,ı™£ZÙNê|”>Ó9Yx.‚ĥ…ı à­ïq=%%Uˌ€†ÂŽüĈPñïPĜ 5-2J”Ĉ ^Bĝ—äâÒ<@$NħÙ1 Á„ŜTp˙•+[_UR:M7’Şĉê_Y?"½–³HJH·?À3ğ§ÔÇ PŠ+£Xa”~_5ÈgáI@›|/ЁžŻí[ß{ġEà?ŝŽ’Ò ž•Úż?ËrTÓMEħ dçì‘%.M2’$2Èh °i€i)Ĝ2ÜweëkJJ§+K²ÎVW(qUµÚCR,#à„âŻTf‰Ì‚B+_•{"ĦEKÀĤ]+xMÀÛŜsġ%"͔V› ÈUÜÜ2sĉއ4aA‡9gÈÈ­5aKfRëê'Ä@n€VFĜ 4@aŬ‰Ċ•+Wĥö3˙d§ŭï˙™’ÒI:£ËĜY8*˘„¤8ô 7}:%4&ĊÙÀN”P PJ° rKûè€Ï~BäìcZp’à-txMۀßúžĞŻJJĞ foŞ °ç§ VP gAĉ×ıeĈŻu›CF)I‘7f´ Ĝ"„ğƒ÷]ıoëëJJ'üž§oTƒ ë'7Z? )Ÿ¤OĴ##÷_ĉ×;GçJu'3LTÚô–ÚLĜ„`PŻiä­ïúŠĝJJ+yİ‘ĜÓfSD0eAÁ„–”—ğ½ZÔp˜‘úŻŭ unœCx'#lYÁp¸Á%îıïŜ­Ż˙´/ß]WR:‘ĜA)ûP•5­!”N€”êÍfBÜ /j`À‚Auò÷XÀGµßËɝׯ40fà›ZôÖw;ġ’ÒŠ“3SĝyHj€İL3AËŒĚ„ 2Óx‹XĦ¸ò];#lZÂıŒp½´¸ÑÜs÷½[/ü̳Óŝ˙—fJ·?fTċi<ĝkèŻŞ„t7Ŭş³ĈnEħ?h…Żë‡’ü7"³!Ċ—îrZlda=Â7´ ä'ßuġà˙ĝ%U:J,` ?ƒ$Q9†`Ë &˜Ü­:"Hĉ>>3~ÁèÜ[LĜ­DÈ h1„ÍŒ°U+Ĝ[Üs~ʓ’fJ·9‚PXìÏ‚RE Š%€!ñĉ9)˘€“ż¸/<ĈÎ-Ä=RŬ0Ofs|×G  % §˘°`ÂÀ7ĥ3W# £êğUı+äÖKH;‚ […GVFf]™Ĉ;€;oFÈ ÍRÍŬ·÷ 9RÊ °‘ĥ­Á`ʘ pcPâĠŻwëŸüŻwÚ˙ż•”nó[_½b^ÑB1:ĞXÖ£*˘§™8{ċ”1„Œ"ñg‘ÛKì—H’Œ­vŞUF\Ù/ó$—ÁIƒ‡<2ÀOşžRG3•¸* ĜgFÌRsùž2£( ò<ˆBŜNÜÙ vh7YwrÈyî"“ °‘œ%Ĉİ3aW€WŬßÖË?ġßì´˙ƒfJ·éöênĴdüCï^*‘ġ”Ù)!#Iì I#Í)áJvi‰8ƒ[Q‘Á—d¤ša˘äñI}}Ê´H° Çî-áĥñ³JJ+P¸ñCıdg#äeE tȋa@ Ž˜˜ü(œ~ÜTŸÖ½YvíTBš–lƒqô'!pù{ĥ^ÖLé6ĤG~¸TYħûùú}·JH'–!UN éÓ  2‚ùfĤR‚!_÷÷7]J>y’PÚ‚{R"tŒ`äYp8´ ü“ïú ˙?()ĉÀäK6 g!$ŜĥÁ‰a€) rë. äK|áhd†`)(ïà‡]öíz”•°†|ĵËt2`[#ċÄÂŒŬ Żï­—ßú_ï´RR:Ŝ I´‚ñJJÑ}HŠ›ĵŬ6ƒ‹4}ĈXqFĞ–ġÀbȑ’3`•(ġ=ڒ–Ŭıš5!”V0%7l7,ûr˙Ä{^””NġIòN $àzÙÎ:Kĉ/"d‚Úν9™ï?£ä6şŸK0şÌš2„ Îĉ7& ÁxTâşîş÷Ŝ­W””މĦj,Ğ€Ĝuä#%¤żĦϤ–ò%‰Ú3ĴB@HjO.û2Kú.QPı˙2ĝ}8™ğaO…aŒˆpeÀ?ŝîĞ7””Nq‚äVMÀRĠ`µÏ†ÂYpİ32ŸZğҏûs9ħV¸VĊ3CŽĵ2!äĈ-ÜÌ äà ˆ0‹KŻWËwÇq n.–Ğ7ÇШAħÄ' ׆şÁ(N7°‰›/ „ràĴ|ÒËScq¨“ü:"Ê´ a›¤â†%pOÛ@BOIIét3â%¸%}ŝ“– äpï3ü9ɍĤ%dìnŜ™Ȑ÷țéC2:”dıxĤ€Ip.'ìMVàš.]ĵ{k÷'ŝÑNû͔–wñ•cŞE} \%$Ċ2™“e ˜+e§Ìù8&ë“l*y‘ƒÄ@b’’4KŞÙ…^|)&äP~àŽ­[e@èOŻnàÇßuġ†˙¤¤tÒ¨½p"NeÇÉEڟÂ 2OGaŒ…Ĵ¸Kˆ?w„(ŭ6„%qµéÀ l2Ĝ:>K’–[s"V0¸&9.]gëĈ˙ŭ %[„0H¨šç ZËŜ‘ÒI– œ™‘~Ï ÉŠÄE}ĦÌ/ÑFˆü_0p=¤0ƒßĵíĤ]*‰Y”srÈŭ {¸˘MῄaÉxUžÁüÄğŻ^#͔N˅™-û¸äX5qŒ{Ÿ ö݆<9Ċœĝl(¸~dpŠ­,ĉBlGIĉċ>äÏMî?O'w'O„ħ7µ@Ë`2ĥx‰—/Ŝ³Ġ}Ë?ĜÙĝŬݤtK—ŞÊDĉjJZ IħlfâRjĉŞMiƒˆ›K˘(Ĵ!éuĊxTí†Ù¤ÎS³rş  é$ı†ı·Ê*|uX2.µöŻżëê–ïNĝ¸¸fÀGğZM/\dX‘“{äĴ¨Äşl8󯺐ĝù$×GŒŝ‰Îy“x"ÏU9ıÏĠ1p–ò&Ŝ”a!1¸N%.½êŜ­ŜOüÎ˙¸Ħ¤t³1B˜£ä›B†¤ÖAŠċŬrĞ×ÈHĉî9*“x“ġáXv¸MĦUvT5¨ŻSғFYϐ %£µisMJ†%pĝÍïĵÚĠòŬ‰Á²¸ìÈ`6q{½l$lK·¸~Uı YO”‚ğħ†+ùƒñïIގݏûy8B#°awÂ(Ù˘à•Bpùì=[½żŝw6>ôρë/))ŬìEħÖġ‘ĉ­˘PBRÜJŬ…54f†Ò“$Š“0^ŝíHXUíBä{HU4wı¤ÔKˆä-‰Z† Ö S2 Ĥ  ^Ġ20oñ™’’ÒÉï9g9™m+00%v7ĝž‘{£Á^)ä†-‰ܐÀ09ĠTR°nìO‚rK´a°Í éìN,PĤÂx_àòùğ·zoŝ;›ż÷/•”nn0W˘PMÜ „¤¸ĊóE^ö-ħ‚9ÙKív.ĞIdîÍYEĝ[mċëYRŒ5 hĦt'â”ŵ\›şÍÙÀĊœÀoyçĠ. :A%Ûß$ËŜ>Ŭ‘“€Á(U‚o@Ĉ{çËu֕~âȎF‚áT˜˜£Zl —(JÜZìJxrƒ……˸6ħ¸ôŞ+[ŭ˙G;›ŝsà†’Òá/ žQps1¤ƒħŠ%HħĴ"2'û–ُ ğ˜‘ó§K$>ıNò[#£$äSMmW˙7qµĵLX27Œ7wƒ–Àċ?ö._SRşmçF\/^XXۇ=%· AÉŜÏ8Ug¸žĦrnàÊD¨*ù†q‚*3˘ÄdÑÉ&3nĊ‰ˆ:.cğ1µ€!Œ‡‚W&Œğ.ܳĠ{Ë?ÜÙúŬĦ¤t„ä¨zá“1€M& •·LI‰Ä6}~šŝdݸ'4SMԇ‰{ñ= =èq'32°…ĥİĈ Ë(… -ò‚ _Ĉ›ˆ3{íO\Ĥ$o~×Ġž+)Ŭ‹L5³&ÍäÈğ7Hí•~M ġbyœ´eWCXUQôlDQ ‚ ½?Ĉŝ˘9yF³ñ²ë·²vŒkƒ—.ܳĠó?ĜÙú½ݤt(F˘Ùš{°iħš!)–öC¨HE <›U?° (a–Ä_OƒÛ‹ .¸˜ĝôJ|Š›ċğġ§ ™4‰Iœ‡Y0èdvÛC €AY‘RJJ·…ŽĜż*–£0ó2£ZìXŸQXĈ„’€ Ö]b‚ˆ”5"Ŝġ{)&ċ9÷†ıaZŠçŽĵŸ˘ÀöF²A¸1ħ°%cÈ)ÏŜ½5üá˙êM[˙ñżv•”L‹}qŝ–Á½A´‡¤XÚMW*RŞÛÀ¤ ÔìÂSI’ŜV8ÜĈO7‘?û¤Ĉ›.'sv˜í7!Y( WğàĊ‚ \§ï{Jôĉw^í))? ÀÌn l™$HKw2SúeJSıĊ[m•ġ™µ!\€ġ#äÍWÄN] ’ó…ıq;Éٕ}Û6;èîŽñu!œ;s~sĝ×~é‡.=ö?È^VRÚżhW}÷™[ÒCí!)–ĊHißhĈ\µħϨv–úYżŭ3zcz“Ġàü]IÀŭm׆@˘› µò8ß;6‚ ¸Ùİ)ܜRoÊ8ß6°?öÎĞC:~HIé¸`ŠRJq˙…Ġ ֑§;Èĵ—Ħĝĉ¸x?C·0’ŭ–l‰>wŽdĜ“‘?G~†É4/<‰ĞHf-1(­[Ĉxw‚ëŭ)` ¨e°krŝÒ6~àw.ŭÑż‚’Ò~Ròà3üŽ$µR,íÒS‡ħ´„goµó 8 ĠgBüÓ)P6„ĉ´[]`’ ´H‚ˆ,bxDíPË]PœZ'żë—‚Kı~äW‡€’ÒqĊ&ŞFP ĠEFQÚ$vŻLŒÒ†yĥp3!İ:Žuâù e=$ââKw4Ûg€á¸DdÑ•˜-C8ÛʛX0€É”ħÇ \ĵk?K;—ŝèTRZ+|FDÜl%İıŞbI)RTL1êÒoA}QڂËRs‚ÁjJNäŸÛ˜q¸½úÀ?()WFNħĠ2¨2ġ=0Ʉ 3ÀŒŜ”p!7 {×ĠÇ””–_çġ— ԏ\rMĝR˒XŞV‚Y/ğ f¨²‚+ U†½qȚĜϧù7‡–Şġ)!7ŝs 'Œá¸Ähla½CNpĵ’vdŬaÁÔìġĤÀÙ˞”ŝlà%ZVìĠt 0K²”/ً¤„¤¸UphyK˙ô6;ŒjNàRí÷ÌÈyÜÍĉ¸ê^Ĝà{JA˜#É#ĵ‚ĵ ]ĵóC½4ˆÄ\³ċû›F1[—šġJÁıAŜì3%%ߖنaiİ;ħléY’J°~Ö˘ŞÇë* 0 ıž!‘wgŠe:ĈvB(K‹á´ÄpdÁ’*;Ŭù9ï;dĈġ!AĥAŻ`ÈÔb2µĜ+şxyûÚŝ—;—ûRx5' òµöu´³SB:ħĜB~ўÔT͞€Ùĉe8ÉÖĜ0à”QR-ó*m…ÜAO\%$•’JQyo; šMÉ(™S2ÎÒfâW,w§‚³äWÇJJKΒÂÎ!dK3ĵ‰ğGuˆœ+¸ġğ’Èe.>3òƒG•°Ĉ“Pĉ{F}$Š˘áÄb8ĥ°ŜèĠù„ËŻÇxĈ“W–Ú0€X È 7)! L†SÜ`Ĉùó·ñ_3Z†$^MVPT™ò:B é+0왈“ÌsµŞ4Ji'Òú2!÷ìSĴ÷‡ġUz&ìTBĥ£8"%Á.1K\Â3ˆÏ”€íŒ %0ĥ "BW€sùÑw\‹ ó‡+)-'­û7ÇÒ.H£˙XeF‰GĴÏx­pµµ˜Şs€äBRú2]Á '%†c‹éÔ"XŞ9AŒûKĤ²ħ‰µûżêÄHµ_trô&ĜӉĊ^w şx×öġïûKò?*)ĦÚK^|I.¨:‡¤XZla/ŭbİ,e›&ùÔÉİZÄçzF }䉆™êN @?ÖÏ/Âĝ[²I´E‹" ŭ(İŭóĠ>% ċoÓ†a-0.Yn›0ÎĉĉÇŜuuD@ç1%[FF.[ċF…NeşäeĴ‰e‚Їċ8ÙJT•jÓ ÈŝlX F%†2fĈ7Úɛ³VjËt5„żàdĦœ!îµàĥAol‚Qc÷ĈrîÒ6ŭÀßßı¨™RġM°‘İ}·”%$ĊrÒ#˘yÈâY¤ÚĊWfˆ*ˆĴï˜Prú¤½„ŒGWpïêlƒ] 07Sbšç}—Ŝ|ĥ/ӈqŭ‡İuëû"8“ä‡ßyu$LéVaYN˜ŽBERï)¤e_˙+›fPUÙ/ĵ˜œœÌ{ۉ/ßÁpT`<)/l0p–Cċ;w*qzûOÊtâËxW¤ !%7E'D@.è)SkħÇ şxy[ï—v.}ôÎΔ„%öë‚ıü3ë’bY°â–ïı…jT+ÓÍÎ6ÎÛgTeZħÏ}ĊB́ŒjsIaŻ’8µ‰{–êNäWf‡™IIÉĴë)yû™–…`"”Àg[äGŜézJJJ7ŸU—Œ²`PnÀÖч4 >•éš‹£ŸĦ/µù ‹`4ħöKXkŭG×sd31n¤Öğ€ĝĴΌ·šĈóJ•%ÊÍÌ/‚l‡lİ•bÑ+JLÇğğcÈığĥċû~qçòŸüĞ;–”(•ΆçθĴv&(!)n%C˘(³ĊĴIĉAd”fIRı<›äİŒ&ŞRŸ1AĜïfˆbYĈeZâ‰HÀÉ m|Xĵo^è´É÷$r‚”q·ĝîĜâL'ƒìĵêDIé‚“;+\JTżÍ–w÷'£(zÊ9,£‘Ċx\úR\PÉıÙàWŝN̊‚r†ÙŸŸ)#8‡Û$çĈÌI6Ŭך_[ôK×èšôKìÊrĉò6}˙ßßıô‘;³|'֋D?ğHFFKvŠċDBn`Ĥ´’ü†Ì#*İ?}””lRïş”Œ U•VTŽ€È˙ı_h2%Ô%½á .Mזqs-œ9G‡qTßYœk%[­ÚeœħÛŝŠ&ñÌ'#™³ŽĜ PN Œ†%Ê݈HŞAhĝ1I†‘l‘ YĦĥĊA&6.u72óUgQ<)Á ÀZôĵ!ëtX`O8wqġw.}ì̔<‰ŽX’Ejš!)–EHHölı5ĊÒĝóĊe:YkƒúšPfƒ$’“3Üd?ÜX­X‘ZYĈĊÙ<Šƒ2c@LŝĉœŬ, $c0œ2ÂŜÔâ\;ƒù‘w^1ùˆ’ÒQÏ ‹ëßpÙÜ[ÂQì°(3r%^ÁhPb8œş ç^XÒT£@XÖf’ĵ`&RĜ˙dp_K;Ğ!E“ߐ%…cÂmFüJ[1À†³£è  "ìÙ1èÒ]Ûĝ_Üıt‡•ïbfäĊ'Í÷ùRBRÜJt‰C,~mÀœíĵKPó²+U#:fJ1IWS$ıUAİÖħ/6ä×ĞsUÊ %—4 Ğ$yaş/߀Ù`‹È cv·ú½ħĊù öMï¸:…’Ò‘Ž ³ëYëdüÉ!eşpΊÂb4,1—5U^p˙Žvˆ·+Ġe$ô‘80„ ´.ëĥ0 XqŞ:–t÷–ïErġo‡Í³fĴ"€ÍL, §Û°-˙Ù/î\ŝĝDJŝu?7wÎ û“’b)çLb)N(ġ²›ŻĤ›%£*u[-TĞzK6rġY“pe‘ĊII.X„5H \Ŭ'N 5C3|^ĤÄ`·°ÍÄ2X€ l{S‹3Yü;Nèüħ’Òán˕™e 4VPH#3J ‡ʂgœÓ².K—:GOh‚ ùìÈgSÁħĦ&`˙ĥñ›m“ˆ;KĈ‹#LôÊĞŜHWħ3@ĈĠuG€^éĤ,Ĝ-8wa˙—_Üıü§w)‘sxċ”¸ÑÖ*!)–”†£2J•°ùó@2JzMóœ!IϨRÍÙĝˆ‹/ùSè!'äâwàHµETĵO™ {n†)0@ÊDġYIU/ŸĤq!˜”îvŬÍ œë´@?ê””œĴ•êĥ,2—–°#˘~k%ŭ%W³kR/p§Â"ô³“~{‚qd#ŽlP•ï`Ĉ ŝ9{R gŞÑ¸dé÷c÷ġôĈ` ÂnżÎ]ÚĈ÷ŝ½ËŸĝ˙Ĵ=)1û`F•ws(G(!)–Pzñ¤ÀaŝTsîċĤ€kyь›³T—h˙§b´ĥah1OPÍùh‚£Ú&kÂÂĥ°…–Μd#-ıÏK¸ĵóܜyG÷û#ËN.Îm´ ozÇĠ iùî 2/[GBd „l-£qqJ0N1–NĠĵÌȂ3Ċ~Vfeïô]eüŒ?ÀÔtâŬ#P•ïĉĜÍ*œK8ÇáY_l|‹ĈK@[pŜw`q†ĴĈ ÏJa1Án:|ï/î\ŝĚgJá+âĖcMËuJH'vÑġŭ/•eİjoŒyÙO]R'sÊh|Xĝ{ĥy†ıEа3 Îh“È ȊTˆ`ÄjĵĞ*ħÄ^TĜ$J^ÇéFvIĉ˜Â—BŽ”Â'! ,#aoTâLË@~ĝW§,è|ô%}‚“Û[d+—5ġĈé÷ïĊdT3g 7šDÔhC™Î÷AQt˙`/!wdĠıó%>'nàJŠX:×´‚K¸?ĊÒbô§âH‰ğ,Àù ëOJ2£äKroQ•bY—Tcy63Ş“JŭQŞÇ›z/ú[&ä—<ïµĉwܕ”¸~ÇLÉ "A‘¨ĝ’A[ĝµÊéJëÊÀeP\ í6UÀ‚ƒ‰uƒÁ]œßȀyçĠ)?VRZT²ƒ0¤pŞ,aÑ¨ôŭ¤£“QíGŞ TÓT—|™Í¨ù2vÊJ%| ˆħLmIĜ;>„ìÊKÇ%¨AĞòS:´Âİ:9 %zSĴ`:*ħˀœ?żŜ¤ÄIÉA8Ú4ÉÌÍC Iq‹e;aß0äÊ1X3š&eġ-³ó–³5ÖĤêÙKœ+ ‹’\ÈB­_¨ê1Q}Çpe KѤµRìı0ä~ċJà„vĝíÙ`ëÖĦ öĈgrƒÎ›Ŝéĉ”””²RY2úŭ)FŬÂߔoŒÄğ>P“ŭœ‘ŻâE˙Cö··Ë‹E°BUĤ3Ëx™à"îj}™‚Ò&”ïBO)3€”@Ûġ–z“R&–ħ›pöÂĥĵñïîÜġé˙ïú‘’ĝĜ@FĠ¤ûËÈÀƒ…żÛ<ÉfGGê[ĝšJğ}×V7²¤ÔŜeDËwäôĊWvVBâoÁ9Ü&~w†œÀ'l0uñFjÓĝ-YĞŻÇx•^Â’ˆµ˜Š<ôXpĦġCï¸Z()ͽ-ßĜb´;ĵ42BŒ$:LÇĦWÖSLìäSx¸¸„>’o qïÇF÷-Íô”|ù8|m)‰ssv¤„½)ƒKĈ´;vêğó·_ùžż·s×§ÖLè@„¸ ^ Ê):‡¤XZċÎ Ĥ´ —†f™nšNĉ!Aó×3ž!˙›aĊ—\(ٕd‘ĜĞí|;Ì7•’¨ò‰yˋŽÒĦ”B–.[rOú–1g‰³gg[xçW­m§%%`h“ħiê<†›%£xIĠ{$Qˆµt1ЉÒo˘j÷VŠ­Í*ùalTsĈT? نËQEJ.o‘”¤e Âè• P ӉĊnŻÎœß~ċgçÏü˙ֈ”$fI‚9§Y IqË]_ŝĞË1+`}ÈhQÖ˙\0Ów"¸Ĉt¨œĜFԖÄd3dK7ĊJœk ŝ{œìb VHçDUżIêŽ$UÓZh‘[Ċ-âfj†" )cŻœÛȀúW-")Ŭљ{)Ó6à ĉıñÜĠŝL*ĊĠ.6!ž@Jì7û>R\éÏı‰ŬD_.V_ÀĞĜ§ë&ž#?–àßÊ`MĠ2€äŝmܕïĈ%Ê0íMœúnûâöËoü;;ŻZ'R"JĈB’'J÷!)–—!Q}i5½•éDfbÓìß÷+ú$íï¤Ç;ìXŞäàÄĠ€¤Ħ*3 CR+û…'şò>s²)~jbß­B´Ċm•VžZŒŭ|oTâ\'ŭ;–lÑŝ“iùÎRĝĠV–OFëÜeB@UëÙ)͆BO 俍ïŬ‹ï~Oĵ} Ĥ¨¤áŞż#cà…R%aEŠ!´Âßx—p 7uĝioŠ…\¸´ŭòw˙ŬW­CO‰bLċˆ›¸~ë’âÖ@ÑÙŬ閊Y5Ŭ íc+”öŒ…hĜ‡³!‘¨,pCċ@6n@RĜKuÈB)÷Âüž$3"rğ‘ŞeUí;ƒÛĦ”ƒñ†ĴbŬ:tĦ;eœmgÈĝŬWKÚòèMJ ŝ5ŞŬ”—DFQĉÉIżÜ²¨Œ¤ächq˜{X˘ƒ?kdbÍĥ&ŻüH­÷dÈe]5oFŞŒ^[޷֐3ï•Ĥ#‹=3Î\Ĝ~ùż°óŞÏüO+MJħŸTġ‚µ4VUB:)R˘zf$s¤Ŭµ8"<·gԈ13qĦDâϲ ğB@µ Öw$°žXB€b_Š KŭB0 m!ñ `ĴïC…ÏGĠïQDD}83ĈôĤ%Îĥ3Î;݊Úğs3%İÊ4´ÜÌ(ŬeQ•Xŭ€B2_Vġ”ŞĜ˙ñ}#ĤJ¨@IİDĵš¸Ù’#+ ˜ÊŬĦĉ™Ş÷”›FŽŜ¨ 0éOĵKĝíWûïíÜġé:‡ŒĜ qċ­’âĉ3ñh°*3ğ¤`ö‘v7ŝ^ĝı$d$‰=Ş‹*lÈb’žRÍNÈKrİÚ.„Rq˙RmĦĵ°I™İ¸Ó€_KšVĈy™ ¤d ™a,á Îoä°?ĝÎĞî\RJkĴ,ÇBFñ…a@ÈozeŞeqÁŸ· Şa½ı_úè ˆcf$q›d$%Şäà cŞßû˜ĵ&t7Ż·„€<\˘hôĈg˜N{7ĈÀ…óÛü†ż³óê?_ўRúólE Iħœ‹‚ô;”Šçìİé’rs-3’yÁ,K˜eލ.Ċ²ûU(HUzE&8= šsrĤħ! ŽÏó—ü?£”‰ •l Cr@J tƒµ{ƒç7s½óŞŝÓ;”(£X˘rİĤ=2‚ïQrV) Òj[h²‡eNıY J³żÔĦ/DΛ­YĤ#GFÎĴϳ²„ŜÇı&˘êí2~ CŒvÈı½$|8Ċ¤;—‹·_ú_ĜyġgW°|&ÔŸUv.˘sHŠeŬzDÄ5óíœ öQÓÉ\.ڗŒDêXêŜ Q>¤2Ûd˙—I޵á ”(ï2˙1ÁŸ,ÌA†ĦY“LùGĊPR.Œ›nŭrż–!lħCŒ|ßjwT8ĦÎ;Ż Ŭy™’pÒw÷—HFñ×T/\ €Áï0(_˘!¸?S&9OP8Ú%e:!0Ù°Œ+ړBDK˘ úK\‰܌\ì)µŒ˙<%zbÁaìíröÂöKŻ˙…WnĠHIކžTµZ ;%$Ċ-÷|İ,ĝ$˘Q}‘ÚâÙ²Ü yq½LW .–2 F˙ìŭé$̛4,€o˙“Ĵ¸zF6d:BHVŬT=&T=#/3òuaÓy’“j¸œÒáÙ,µÊ Ĉ¸%“şD s—ĥ_zŭßÙyġçV¨|G°ìÍfQ-ġLžu%$Ċn=•j‰“Ej5oşóÌĠIşŝ|f•l=>Qšu5zGÁ <Ì1f$ŝeé͙b>ŠáĦ”'¨–ĥĊÏ•\YĦîğ.ÊıqoÓŻ~aËZAĞ•9CÖN|˙߸³H)Ü` †Ĝ%£êüTDñïz!J"tżÀBÏHŞ2lĠG NáĈ;>„Û™ñ˘™PĤóŠÄué¨$âµe“^ x›ĦÜxŜf·äoÈ &½ t¸°ŭâ·˙íğŸüŸW‡”!bĉ—H”·zٍ¤Ò̌fv&ñl]NVİS#ÖPV³‚!ŞH*JDÈ"™ĠŬĈşĈwȚ‚ kt—°Â%ìĦÄñ1c .Yşï…l ˆCgUŽŜ”qv€~o\ĊÒS˘ÜŒÔòAil•Œb6nĉ\¤B‡zŬêÙ·0 %(ż²"œıÊÎÚJ:Üĉ>[t{0Ħ|ç/CÁÊ\çY´ Ĝ9ú…S N†öX .ożĝż°s÷Ş”ïBϨ9 ­ÖAŠ%…7{D‡ÜÍPsClm€q–¤ĉeTÒ¸A7Œì1Ê)–ò…žÄKĴß(ëÔOħäŬAÀàú ­Pp‡ĉİĠĊ”<òá9‹;ɌSSĦ°!ŒY` ‹.g[ĉݽŞ`ŬII\VÄĥ™òm!£xqñšƒ°28-05fÙüï…Rp¸¤âñ?§hâ+IYÏ$›i£7•_—bB 0$Ë&CȘŭÁ1p+‹ˆEżdpi1av™ÒĊKÛ/~çßŜıûñSž)…·F¨.p RBR,‘’üöO·…Zj¨³ÒnÙGM'ġŜĵéŭä‡j{l¸‚rŠ}`áD9Kjħĵ— -zĦ—… “*Ó²Ħ|GnÖĝĈTš 61ħäWġ³İñ}g~ŝDĜÌ Ärì) ŬRp~‹ ß˙öĞAûÏ~w½IÉ^Ê(ö“ŒÂвäĝâ„ržPm9dü짌¤¤ÄI†ìċCĥo>•akzżyT­°ˆû–¨*ùÂ2+uR"cAOœhf:ħĜ½Ö‡œ;ż¤ tİH)]Ú§„¤¸µV€—É·)–-Ġ|íĉ‘Ñĵ>Ĥˆ,”€cÎzŠ$VÔnáıŻLP]&c’§+-ßq(ÍpuQ³Á*Èg=6ı‹ß³c´>W¤'Ŝ¤¤³9÷EeHÊwâú(CvŸk·oqaÓ@~À÷”Ö’”0Ĉm‹EY8%£ôsSòÛћTž•j—I´ŸÀ°uĦƒÏŒâBG"p´~¨Ĵ†Òͳ!íĈ†˘#lċbK5à&édCè,PZ%Í ùKÛ/~ÛßŜıûİÓIJ"2ß&h^ÏX Iq³ħEX·ÖAdnım^f$s2£™mdF³D—ôPïcU’pİ•×(”jÂfïĉ`’ &äTrŒÔ*ˆcÙ&-ȅÏGAJù‹DŠ‚jx6ü•‚AÁ0Ĉbw"8ßɀòċğu$%ö6ĥœ\LnAǎŞĊˆsJîß ×aSĴ#%ö‹1<ŝş00ƒµƒÔT½&޲)9ħÛZ/O^Ÿ…rŸ:@lzƒ ƒé¨ÀnÁÀĊ tĝŸ°k§Œ”(é…R…ß‘dÖoıÒI1ŞEšHĦÉáóœÁ"9bf”’ÑĵUè!210ùR‰/߈Ş9Nn”|/–Ù8O2ñġoûAâǖPJÊ{Ħoz‘”|#< ‚)­†H!Ĝµ%.nċ 0<ûñ5#d·<òßÛDF5[!_Ï$…ĥ™ ŭyˆ”E$%òVRéJtë2mƒ¤ê+%Q1ÉZô`Œdŭ \"Üa9R*2)Q0°ğ7\¸¸ŭâwüÂÎŬOœĥLIŞuÁFÈğ]°ŞìËê°ĝĉtŒ273J3óı†b™ĝ0ğŬŻú!½ċ†?Nz9sU§gNf‘ĵñŞ!Şĵ˘!ħ­eX§ ó'a+m4â Ěa‹hĝ½ "'ßS2XWpcPâÂvü /ß­ )yĉ„QŬfN†Œ ’Q˜WŞÔ/ÉFtH5A‹$iJœZSRŞvĤ™·ħ?I@ÎĠ$ëÒ)…2 Ċ&9WokÇğ„—%¤,1í—Ĝç/lżĝ­?żs÷Ó˙úôRŞÄ>’Ñ9$Ċ’B ‡ŞĊ IÈ9PÀ°Ÿ´{†³šžxVĉ$O ?"½ċyYn"Û=éPcb U›cSCç£g’ëuœ3 ËܒD¨"Ìú d(cˆHn@V0²䂽\NxûU³N¤$Ŝ>è3£šˆ&ŽHb•Nĵq]èPí¤ġ—IH ñ÷â~%Càt’ġ¤Ċa8ŞVİûšo|¨?È\=ız[%H›XˆĤİWß]ö¤ô˙?ċ;Jjüŝġ€êÔ XNċĊàŭQ|2ÚOÚ]ËŞÒjŽ­ġ̨î@$ġħ†ôà'ż4,‘@ƒIêġ)ȒA˘¸ş…Şĉ35¨3ŠÛ™â@•!ò[jŭ-7Z ùWLRRrˆ[W½^‚‰W-vœÏ üŭëCJqè† “òDɨÚ([e#)A͸„£Ú`…TO˙™Âî,_µìH)-Ó1ÁÌZÍ|%–!_"6a ˙ú !óğèè ĤZò'„é¸ÀŜ Î_Ü~ñukçîϟ’Lİ î4äÜ:Ö06*!XÑÎ?„QQ ûxÓ5Šrs2£Šwĉïž—TÉâҞTÖYĕ2/\XÙÀdÎíÁşòHry5H qE:„\Ĥ”ˆ!D¤ĥG'<ĠĠzäxYTdùÀ×6Ĝ›2F#k\Z\ÜÌ ßż&ċğÒ˙ġÓûöDÉ(ü{µáY˘Tsx6ħŠ.áqŜÀï" ÂqÁŸ!gÂ*H]iĠ—ÖQ(íù½JaMF”ŒyĜwâŝ´?ħ’1öxıpq§A}7ïùôñ¤˘ĊrR¤ŞG)ġŒ|͓v d-îÍ#£yäFi ²ñUUé.—=ıˆD¨Ôw½ìĵ%‘˙;a&Z/€*‡žRœ7ñcÉ7EÉKhšëj-A|IkTşĞùA‰‹Û9ĝû~ĉjĥâ¤$Nšé4ċé £ôcɟƒš!ÏJċ‹ÜğĝCPìĊÙ$D+ĦàO¨ ÂZµĈq3­[ògcf.”ùžRĉż—Ve۟x<ÁÄĉĜe.œß–˙‹{żœ,)ħ·<&@Ĝé ŬÖ^•}+–”ż0$@Y•Ñd´[ s֒/î-"#‘Ų̀Yâ,§żXyġ]ĝ ö½‚°‰ê yQXb ŭ!öMíày–6éMÉcŠ{ÈLŞ9Oʋ&í^qËÚÀ€ „ì÷ŭÌĠ ‚öÇo%I‰r·Ĉ›Z˜ĜÙÈ ‘Qġw¸.têÜĤI’P½L\ kWMÊԄ•’žQ*`po·2Ŝ°×ïUŠ´ ŻÜLNÖÊw>E÷ÙRϏacŻ;Μß~áu?żsÏ ö”œ€Á=üÑQ2(T•·~ÓWŠ€Àr= O·ÄΓ ÍĤ=sȨYÉ;ˆŒ8ÉÒL#(…òK5_IğK0ĦˆĊr²ÀÏgFq '™(zê3ݤ˙D¨\DŞUÑFĈ¸¸•ùìÓĈ$İ`W€‹›üŸ‡žÒê‘Rp>ŻÂé £¸ldfxĥZŸ%á1ë§`ĝí+ŻÉË–óùkLşà/’’ß­l‡\iÏV[$=ħ'²hŸç”üמğiıU"N}WXì– \8żŭ·ü­{pû{JlÙ C‡ 2}Żu0Vħ”›nĜ DÁÚ4‰+3İóËjóÈHeFG$£Ú:ilİLÂŻstHVK îlbRc6\5ğŞGġbx˘ò-„ş ˤÎAŜ B‹BmŽ&Œ‘`ğà|‡Àß÷öĞ$@ûÇKJDKZd EáĴƒĤ|ŞÈhvxVŞŝ½M]ÂÙËğá… ĠtŞ|óĴHĦ„”ĵTÈİñÜ?ÄħßçP•†k³ŝKt¤d 9ğ%+â^èŝĜí++Ĵ`÷Ĉt×í^÷·vî~ú­™Ĵƒ’]QH–f*!)–r×%š}Î]ÀàĊv@è³¨–@F!²¤[`Ó`’̨6Ä+ġÈúA½Í’'Ġ3‹!Ifž‚ ħ‡€T$‘nŽe0ì3ڏŒD,FşI2jÖ÷ħÈ´5u ĉ}WeFâCÒë Ï4J{Œ:qÁËr"Í?4i¤Š4Aš—¨µÈŻt&’ÀAŜZĊB˜€ĥÁ`Â0mÂî¨D[öŻĵíêYfi}ò÷ħµµµtRJ^‚ċeHa'5†İO!1í­ğ„Sퟠ˜1S½§D)sIEJ~o—ġY’SfrâÌ번°=Ŝ†2K=YE£EIV ›2D,Ĥ#Á ËÀısÛÏ_ŭù{ŸıM¤^ℌ‚F%$ĊòI)Ĵ1ŸCF‹ĵén–ŒĉŞì £šK¸Ô˙­J}Wyß/Èĥ)ÔüQ/áĊ2Ï|"AùžQµ'É˙]Şf£ ĞĠÂÁÂŞ<ˆÄ9C ƒ~!èĤ˜NçÎĥ€ïŭ™Ï¸M¤ÔŒ"G‹*ĈC Ÿj2ŞEÜ’j@ÖWö*Ċ CÒS ¤äßRK•ı*ÈzR "‡@J|‡´ÌUĥšX6GbG†çg7 B%zBŒB€ğcàâùíü[;÷|á6 ’žQœóRBR,·‘„êaäú °Bâ°d$û•éx‘žÌ˙ÔÉz‰f˘Äû. ħVñLĵ!x‘qTĠ3`żÜ/Ü\“I•³CXùnu‘ÛêdäçT")‘ ™Ëœ63`0´ìM1.,`Ŭ^áâŬ_ù™Ï úÔÒIi™U^W#%ƒZ<á}6Ĉž<ĊS(Ġû/ɞ­ZO)˜w§B‡ 6È(Hğ£ÛGԐûŒ):†'~T>#²¨Ĉ‚4DÓ`Lĥ·iiipƒ¸à2{Ž9S:÷ÇD—d­˙"iŸx „¤¸Ù#ŜhÒ$3·@Fĵ_™NdF‡$#Äz~şOɗ“Ħ$#ĠÜGĴ:DIxPGIUa᪑Íä•yBéĴ£svH`×*;.Ĉ~´Ò‘“·Êĵäĵ;,1•Ĝ0· Ĉc fAwםßûÓžeAë3˙û2IIöɎŽ~‡É|0ÊÜúU £ôU³½Ük=x–¨AJĠÂjQjşêHİn5‡Ĵƒĥ\(n Jt—ñF’ڒökZèMÜìW1šà†ä…íçżùçwî}öĝHİûë?Hgß÷˜¸„Nà@kèò­„tÂċş*D92Ì9ž‘ĥg´$2Ş—ä÷ƒ(0 1D]ŒIúo„í´6”ìĵCµb ızż2K;HŝœÒ9€Ñ„qcX€­ íêx +Àa<ĥ°dÑíûċ{~úÁs†NmĤ$aF #ÈxÖ괒QmólÍ%\ޞ’g…JèPž%òFğ  AF•B“НJĦÉ]à2qV\D˘ò½)J+AĈax6,ùs€É0¸qcœ;ì¤Ôûġ¤sï{LBï¨"%•}+–Q­ N,ƒ‘É{FÇAFĠ§òƒ²<û4ĊĊ|hLŻzœdA‚Qâ]¤rs&wñJ^W·† ˘îó,¸1(1-Ŭŭ9ÍíÔû.&“wíÔŭĉjٙR3;şi’˘Ì€§R…Żé>ooWċèP˙RÂĉáp#âڜW;•üú om€°û„LĜ·T)ûL2„•Ż’,L½ïÚÀ‚î „?c–KçoKĤIÉUÙ)–]ħ u,Jšşġ'XnUMwdT¤ŬżŒ˜ÎßW$%Ħ8 ²D; * ~Äâl]ËĦ8ż$âJyä×SĠCĥŝ%N-öFeT.şr!ž4.àqËY°Œ§l Ŭ½İğ$|ÏO=xŽ€Ö§—BJÑĦ Š}†DY¸ÌĴ˙t%Ĵ zŞ3¸'Ż`èKŜĄ}@.8UBOHÜ&ûPŜ´Ĵ„’RŭI‰Ŝ†UA.ú2_:@öñÄía’פe0°Àtjze€ßĥÏß<)-*ÍÑ͖îâ‚>^­2öéUŽÁiž’OÉu—p„ ŜqµžRȘDœD<*ê› *ÈßzŒA­Ü‡dëlž%¸1g‚ĵáŠ|ŭQʁéX°ğ;.œÛŝú7ŭüÎ}_’™'—I´Š ‰!#×[Œ bÀ̠´AŻ[¸2ÙŜöàı›'EòoÂ!$á"É´1‹4ĝ}Xq2Ş‘RbLP•ïxŽK¸_iO•ĝ*ßù M #x+ŞĜ'ŞÛ ‡&ΠWƒ²İĞY¸Ää *l È÷3aÓ!cW¸pvûëŻyßÎ}_GŸœ€@&ŭ°&úğêÁ³´?óBJͅ!·\ĥ£–qßgîŒcħ([^2 ?IG!ÜĊĈÎq ÷Ù²'ŠZO)~*rÉOÍ0ĜşÔıòMôòïĜ*ŞÖ—ÄrŸ_gá.LIĈä­ĴòÌo,nV Ĵ£QĦ Ó˘Äîî8îĜËwDDoûÛç’Ò>ŭ’"MB€XqC{óˆeYd$‹ƒÄŝĞ,ö!#žĞGŻzÂUµɗâ¨/'~ ‘çÒ;Xòs!XftGqé3 ş% ’2ğ)û”4oĵ˙>“ ċ3%°U[ĝĈ#ëväX yO=xN€ögMJ|@‰ŽpI85W—Ż 5%ß žލ˜LNX½|WF'H”™ŽL,Ĝ—ċ‚ŭ‡é}ÒeVîġ&AÌÒC/’(Ù`#÷+elŽIɐéÓ2.8wöĜIéĝÀBRÒ Iq0¸êgàMÇX\Ĥ›KF²€€¸Á §=%wµ’Ì)gÔ…-‹ËhlbM&Ž”¤ìö ”J³ÍÔ†UڗŬîĥU“;ü óŒÑfçÒ(),zB Ĵ€ĵŜġ”Ž@J2§KsHéÀĴIX€–ċ<,׎Œâ’ż—pWŸ‹™Rè)%ÌÉlêB‡µÙ +е'HV:püıxRŠŠ(zHŜ4Ÿ1eĦ%,îĜZì.0Óá7X ç|ùîKJJJH§µ‡$‰A˜N IBF8ŭ.Jˆ-Xʸe–*5^ 1ïMWIF‹î`—”‘ï'˜Ä¸5::û€|÷‚óƒİ,&j/ùOBËl Ĝ0,ĈO_­A.;Ħ)ŭùĦHİVĦ\7˘9™Ó,2S½ˆkHFÁ`ħîT Uë)ÏşDİgÒZ^t÷ĤjÁcȔ)UÛò+·³‹ ä›ú U[*‰™'9Î ˜-l+ƒevF"(FSìB€sg·żv˙ßÜıòĠ˙UII é´5½ŜŒlqÈHdF7GFÁÍAĉ£¸@|y%ÙQnÑe\€ŜpŠñĜúŝDI8û~Bµš•O^h>P:ċŸÎij+×àsGђ(ŝÜßjQ›cİż'tÈhg6 Ĵ z(l-ş–!Ûĵá§<pĤ4Ż(ğ¨d·Ù.éQFnF3–ŻUßJ%½ÏÊìèƒ/ĠÖUñ\ Ĝ8G¸À/(29" ĈĤGFa{qóm1 d†Ê -ëˆi2- ˆ!£ğ,N}wċçvîûÚżQRRB:EUğ h`™ û‘‘,z°MF|ȞÑÁd$ 2£yнĉà#(ġËsMĉÊÍO,úİWĈQ$£JŜë Z9/‘+†ë5%ğt(İġ˜•Ò¸Èìž93r²–1hçÀ”Ċ9#”‚½ÂżŝßùÖ/`_Rš&ċğEŠğ‘’TWĤöPïûŞ’Qş|°ÖS’Ê#ü,Şïf„~ÌÀżÇQ‘Éâ˸!SĞÔĞrŸ³£˘˜µ3UŸtKqP˒ßħdˆÊeeĉT}"ÎÑaÄĜ%çÏmí÷í\9ĉL +h.¤„tRU;˙ÀQ8^ ÈhÂíVɈç|C‘˘L·Ÿ|<5Öl>†5ċ ?(0—ħ #,1³I£—oöğtÚTÖ4ħDĉ˜È™ÀP2#IêJħ÷DȌ e\ù´ŝ+ĥÊ{{S7Ġ˙†·ıLésuRò3DäI‰Q_÷ÔìÍüĵ6ƒ„¤yBsöáĴ!˙|­|'Ŝ1‘’½ÂAħŝ 'b_3’¨ïÜŻ T™ù†ġT ŜU÷żħĠ—ËSò$Bf€Ü´²“Âa(FSżşâìö×üÜΕc̔ô6VBR”%ÁbÙŸÑ­‘,ĴîKF²_™Nĉşŭg™Aœ˙ŭ^i½^‰ÂÚHUfÔ¨ĞĊùJ5zìƒùO"ä\1Œ'6òÁP9ŒÇMZf bääìcÊ`ŬgžşğnxŻĞë)-ĊFù.%!ƒĝÜħ8§gC 2`Ĝµ'£™ò³$µ÷KĵeTġñUï äö›°qddĊİ=‰Ş>QĝœäûGa›È}œ[UáêǵE”ŝ\%gf@Ċ0¸7LĤ4½SHI 餳$ ĥqġv“EÀ°2 ™QœS0”ŒÊzé%˜i&ċM$‹ÛÜ p`¨zJâ›äËy6u'‰ÒrË.ĠÒ¸ÔJ‰Yb \żŬz  CÛiÌ@.èB`XçO>x­Ïŝ>677)%%£Á`PZkù}¤êçauFËS{G‘QSò2£šKx’I³Ž„l,I‰ż”ˆ÷°ÈRpö†i}ĊS5Ġ–Œ<ıËeò_̰)y6lbRzÑÎŜ8·½ŭµû~vçÊ×ߏ \Qµ6üüN!%%¤“ɍÜsiŭIşÈ(meġş&S[múT-DUĤƒMšĠI´‹‰“ß0*r`'@7Á왃S„DĦ%/•ğñŠ'ô=ò%?ö˙ĥġ%‚!ÌĜ3ù°Dëġo}lf¨ŭİߝé'ùLİ´Ö.’€Ó~=$ F€óÚyw…NR]èàċ0”ô‘ö”8²Š„Ü)ĴJáj>6!·{‹ĵ€!l” ½ĈY“mwÑqgĈÏÜÍ<IŜZ'É2LGöóçĥżzïÏîÜ˙üûÑ9ZĤ4o3ñ"RÒ Iħ /˘Ş$PÍLÜ9ddىJëIĦñWÜK’Ĵ4Ĥù²*Oşù„’]TDĠ@¤x22Á—L3"^İnğ,ÎêHĴ@„Ğ-żKDXd*ŭ)vKF&@ŝ?qu‹€ö'7%¤x8ZOJózI3ċ:ż,.|³Í%mwŸğy–½;GuV\ĞÇF5B¸„@ĵhAœñ˘öÒnĉŞDGAİWY$jOJİJVlı*Ċ§°eĊò“ñ{&;·ŭĠ{MJ’œnüİ''%¤“i!Ĵë)Y@Ĝg;ì!ɨéġô’‘ÀĠÏğ{…W'IµA´f°Y•^bFÔxİŻYôĞÖR‡2ù>ħ/Hp;Ğ2˘˜!Ħr6=µ+âÚ7ìŜ7ŽCżg`üżÄ‚rʸѝ"3@öí?qu“ĝćBÙÎĝÌgOD&£Ñ¨´6š™]úsŸşÉÔ“9 úïÑz’Qúa„jĦA*R ÌqĊKzġ¨Vĝı²Kĵ“ħ¨ĉKˆ Iż³ÂîÎ3²;7µu-İrˆ2÷ïX—R£v™!çÎlġÊÏíÜ˙µ#Fù.”ƒÁ49/é"È&áĴ\–¤„tR9’בĤu裐Ñ܍§Œ¸‘Ĉŭ~1`¸ış"‘ĜRâPK:0<Îğ˘ˆ*OĵL(ô‚‚›Lu]bìdqòn+₋ġd7ü&Ġ~E6[Ĉt \ğ6‰}Û_żş)|òÑZùNDş"2Ç֓ÒÜ )~…ihÉTlYè"£ÔġcfɟP$I3™0€ĴşjŝD.3 ÎJvŝìR Òîİßó%VÀ"(™‰Ğe¸ŝµ‹…$ġ@)- *ħ×#[Û_½çoéŝŝWtèz­Ÿä JƒA‘œˆEkL´d§8 ĵìyf÷Ä,ÉBßıÓEF²O™7(0ÙÙ ˜|Íͳ!›aŻĤİŻï„ÑHiwMÀÀĠ*Š'²Ħg$ÖݵXœuċôĥ+ %žc0ñZ`"‚W@´ úö·\Ŭ€O>{C>[Ú0FÌ̘ÓGŞïC²ì?9;û –9$r琑¤ċğZOÉ"¸é§„êĥéŜ.· ӏ Ä3ì‰I¤^˘‹BÏĤ Ä,‰ı"¤Ò“Ó !Ŭ3ĈîÁÌ2HY `ÁžtáÜöW_ŭž7Ŭ˙Òo˘ƒë3„DDÒï÷We™’ìß/8½„t’eğRbĥT‘R}Ĝî ò8ÉÜ?ş%2’C”阁nŠbÊ É(Íü¨ñïV™Q"ŭN2„² ‡b '%9Äy”@varŸ’Ĥ[\=Öɇ’Ï’d?2Jz8”ˆġÁ¨ĵtc ”9èÛŜrµ#>ġh*p™Òd</"А2ĉ’ß½ÓÉ(ŭJVşÄe q0Z’³šŒ$ż_Û}$’¨é޲rmĝ(9QaÇ?ŝ[LFŝ7‚µŝK3˜‡Ĝœż°ŭ•ğöMĵĝŝ@JH)“'%Ŝ'SR•â zw&önÄšû.×;ĵéġĉȈ¸<,"£Ò öşS°•ɨÙˆ™!Ûh%ËÖ8;İ`ŬE%•ŝ íĤyf²IÙ0Ş|ŭŸEĉ/’›CF@JŽ3TL‚ѰÀó# .üħĞ+Ĝĝì‡Òҝ‘.€@JûŞìéPR}ú&£êÓpÌz9\Bâ…%ċİ{ פŬû“áIrİ™!#QŞzHŽˆDp0Ġ>—ï]ħ“óO§vw8nû+Żzï›á•ߐ 1‰1†1ġz½"!$Ù§—¤%;Ċ|2 Äµxdt´MŻG £$êħŒĤ£Û›ÖWk@FHJîAò$¨ÄÛn̆PoVsêáZİ%š S2ŠRo2§ĵy0Ġßï'0aL3Á ×Ĥ°"¸moış Aç3bffkmY–-Š‚‹˘°>M˘EŜPVœ³É(2ižÇ gàZÜŻ½ŸĠKIU]ŭkˆ'-=ğQġéúLìKïÒĝz$£Úí}éÔmže†œ;ğŭ—ßŭ߀ËşQ(E¤(˲,Š˘Çĥ(Šf&t˜ò’"ɒ¸~K? ɢ2Ŭ2ÈhŽ7ŬQÉh4ĥèŠıVHr”¤.ˆğEĞ#Ê\éholñċkC<1 żzíŜ7~1ĤcŒÉ‰ÈÔcy­‡Db”?.`”Œö!£Egˆç!hógÜĝŭÛEFÉĊ5™Xd…öFŒ/½pÜ'öéo´ĥŒ1­,Ëò,˚Ëi~MF3$Ċ‚r]œ?İÌH‹WHŒ¸ìġ ”%;ÍfF‹ŜŸçĜÈ(RHԖSîû-Lw1ĝèC Ït÷ìĊç&VH"Ò,×Ġ•v’,ҞÑQÉhżyż”én…żl”ċÎĠLž˙ ĤÏ}÷}¨dfñ}ÈĤYos>IKvŠƒ+vìûAŝ}Ĵd4cM´2òÍû²ôJ:%£ô͒L&#GFĊŸ|ĉİÇ†Żż÷ÂCċxĝrQÉdR23¸’1Ò˘ìÖú %£µ$#eÊsPž­6äĈ˜>ó^}úğĥ?2†EQ”Ó锓96(!)’̈]"É>a2’ıÏŬÌĤż˜cŻ[ԝħ•Œ@9A,@ò ”ˆúz2zŭ—ŝ€§“żÇğ£Ñh8N‹äĤKû×{2Ĉ™Ŝ(­iċŽ˜ZmġÏĦxöQĵîâäó÷żêìG&“É˓ɤ7Ç !ÑŞ‘Òi!£8´ıàìÜ,É!CƒŒdn n˙=ÑdÂèġ§êŸ’È9=Pĉ<ç(#PÖÇÁ<ŭĜèğïżü‡\LžF_‡×ƒÁh<—‰ÙêÂRŻ”<'Ĥ²’Ñ:QpÉs×'ìl82zĉĵîòäÙûïÚŝÉdòápĝÂ`0Ĝ áph×)6*!pŬ΂̞×c##Ù§Lw2-zÁ“Nɨú‹ĈŭžÙȜœ87÷0üô0O?6z•KÄĊäÉÁ`ċ^Ż÷âŜŜŜî`0O§ÓÒo”]˜‘q½΁\Éh½ÊtĈ¸_OF7Gñì#xŬñ³W.o?6Ÿ‡_éġz/wğŬnżßÇcë—>+"\PB:epF~û¨µĠµÍÊĜ­“‘˘LwT2K †’ÑœÌd@Ĉ͘™ÍàFŸyĉéŜxċr £/ġûŭvwwo ƒÑh4*Š˘àfÖN}ĊJFëTĤóFËÔjy ²ûŠ/<Œ×]?wċòöÇgƒÁ_öz½—<MF£‘mdĠ²êħQ é$#8‹‘°`Ž|‰gd$‡(ÓŬ, ŭ~ñĜ*Í##żEÁlägT‘Ñs1yj0|ħ×ë½°··wc0 =şì"–½M /$%£ˌD@YĉœżÛµÏıÌèòĝıû.m}d4=3 ŝ²ÛíÔívğƒÁ`â]âeŬb£Ò eH†fŸı 2’C”é–EFĠvW%£&Q–ı™‘Ü€Ú€>FŸzĉİÇFoĵrùítüdBF׃Áp<O2’K.~ŻĴ­F”ŒV<32n5RžòV,Ó}ËñクùÇáÙÁ`•n·ûRŻ×ëƒñd2)­µéS!ë)!T†Äɞï†}X2â[0•Œ˘âN{Ŭ)bUIɨAFĈo2rdDĤá'œ€áğîğĝQ;?Ġï÷żÔï÷›dĘç–_˜ŭjÚÜ@Ĉ–éÖĦL—ûAçV²û¤0\éŜK›‡Ï™Ñp8 ‹Èh9é’b˙ )Ä72¤žv‹Ċm £yŠ;FwoŠ˘T2š?gä•Q-ÓÉ jşëKb§§ƒÁ—B™n8Ĥ™‘`~(›;H&Qöjf´Úd”eN¤’e@žW™ÑĊїîıèȨßïG2F)…•sGŜW9sRB:‰ )ɎʆÁêіëŬÉAe:ħĜ۝˘´˘d´ gCŽŒ6sÀv1ü³Â|ŝħÑî½ĝħġz½şŬîġáp8dT.*´Ï­·rŒ-ıa9­d´RdäĠtÔjYÙ{Ċ³â[.ŽtïĊÍ?Iɨ×ëu‡áh:ÌlçcŜYY”é`ĴbA†äµAfÜr>ğ,2Z¸Ï¨wq1[ìíMa•ŒĉgFË.ÜueşÏ˙áè ÷^ü“ ƒÁd2™Ì!£ĉwLêÒElîÏÂĈXC ^%£SMFéœQf€ĵŜ{ĊĈ·\}ùž kdF{£Ñ¨IFÜ8;² ڏ”tcĴ˘SOíž8d´ğ뭀”Œf3#qĉ—´‘ğy£é†ŸxĉݏßpßĊ?µÓñÓ^Àü2âFP‰a MÙS0AĴ|•ŒV„Œ‚š.ÏAyĉn<Žâ™G…Ìè+Ŭn÷ċ^Ż·7Ĉ ñœ˙dߌz…2#%¤“,ÙùMÀ%NYë2#%£9dd\ÉÌ´ `Ĥm ӛ3rdôħTÀàɨ?™LĈEQ  ¤d;‘TĈŞ>èYV2Z™ÌÈ8ÁKn\v”çQÀ’QŻ×ûJŻ×{ħ×ëí62£p^lƒˆŽBLJHŠƒÁ€2‚”râdT–%ş{…[Û­dTûG£7]ĉ3”Nĉ†^?ŭA˜§ dô´/Ó=ßëġùÌ(%#ğOĦF ™ë)E À2„(yc•ŒNu™Ž‚”q†Ŭ'½´ğ*Óġz½ŻtğŬCfTEÁÌerf“!Zħİ„¤¨Xq ÜÊ*š Žht2š'xhì²´ĜÛ+f·Ĥ*UŜt-‚K;Ħ‡á§‚yz†Œ^èvğ׆a £²AFŒùß1š„”ôŞ?,büâżfQÉèô‘ĵQ*œD5Ŭ°IF/y2E1mÑQIiîw­„¤XrĞrŒğíşÇ›Ĥ[DF2'3J˙p&3R2ÚOÀ†ëħÀlä•7ŬS½š.fFŬn÷•„Œ ċœìˆ1›§Ù·ìÂ1”„!V2:ísFŜµ›ò<ÎɌšdTĝóÒüo ͛g“}:JHŠĈ™ §ƒë ìÎĵC“ÑÂ}F²Of¤dt(ûžàÈHú}ú!˜ÏÏ%£2Joı‹ÔuóÊuU˙(-Ĝy…hϧ~ΈàÉÈĞé’2Ŭ`0ĝ˘0„2Ŭ°‘”ɜlû0ċ;͐óĝHĵssı¸ŭxD2ŠYÖ!7½:2šÎ ŜJFÁrmµ e£O}0”éŝt†y7ÛEċş·ïùJ)CnŭıìZ”ŒN§Iqg§î>Uˌ<ŭċ2£EçHöıäĴLV¤„tò;÷חôħLW/(­’Ñ™‘_óCÈĥrÈdÏğvG2zŞßïİÛíëġ5ÊtvNvÄ J+”\-Ìŝ·[‰ClRÚĈû¤dtj–ë€Zm Ë {û’Ñ'£I’•"ĉZˆ”N(C +Ċy ÈüÀ ËtQcÓĞ’Ñ>dä{F”U–@‘ŒŞ9£”Œ^™SĤ[TdAı.íÄKvDwW—Sò=+šž‘! Ï==‰i2ôz5/0ûeG²O†tĜ^’’˘~'ĥ>X’İÖOÌ̀šçê 2ÚOÚ­d„ŭ¤Ŭ™ÏŒĥ[€t1üÔ-‘Ñ#Ê´‘;§ġ˘ëzFŸ_*5Ġu‹Š·‹v ÉÜ -’|F%£ÛëÀàÜ;@n•Ż?Ħ™‘Қ$I ÀŠ[ÎRgı2£×+P–Ĵd´`í¸i 3U™î“-;3jöŒÒݜȊdJIÏHD2§tĞdtl™œk7e™_;ŝ¤'£Ħ’‘Ҋw l)~(vYd$è÷JL %£ùCŻ”BÎìçŒ>˙Ĝĝġ÷5w–˜§Ö"ÎÓNÉè6–éÜ ˜lfŸ‘’‘Òj# ÛgĜdAß-’ÑpP`2µJFóì€ÈÄċzĤ•ĠĵéŽ)3²˜/Ŭoß>‚@ÂÖF‚“[;óš*-ıLGn> D  µÇO‰ˆĴShTB:!ñÎ Rŭx+d4–•ŒĉÎ1܊r}#ĜFŸ½md´È*è&Όsipŝ‡Ĵdtܙ‘ˆsîh·V rI7ôzJȨóĉߓu‹‹JH'O&j=ÜMĈQİd4ŻgDÊÜm—:ġMŻŻżïĥ‘,¨½jgM5‹äÊt.fRJ•ŒŽµLí€y; ‹§‰ŒÖŽ”NАÄrĵ/‘wò>:M'ŭAĦd´È(ċf3ĞzFÇOFóœ¤ñ#UC[dq{š&Ĵdt\v@~Îy>ev@‘ŒD IħL^ I ß 1ÊB”ŒdFÂÓ" 3nŭĝñIğCF˜CFGŽ&DçˆÜ@†ÓÙ÷SÉh9™Qfœš.o%d4<}™ÑÚĊD%¤ŞĜ‰8giXŠçùddKAŻW4֞+QN‹HFÔÎôœ€áö’‘,(Ó-ʐCI6ÏûPÉèÖLÊ2Ú}âô•éDÜ÷Nĉ;’§êewB 8ı7A@†ŞÌH&#ĥ@Żçğ•Œê™QP/ĉIÏè“'FFġ’UŞĞĝġ™Ù78+Ŭe”ċ@–ƒ÷ĵ´ûT‘‘˙+f=ÉH3¤$£4ˆÚRĉ><óÈHè÷ ·ÜOɨö:ä RÉ­‘¨ îı­d$$È7N$̗‚Dyż’Ñ­‘‘?/^…‰vüÊçN•C,ÓĠ€XKRRB:AV˘Ì€K;˙Â<‡ŒÀÀ`P˘(YÉh™ ż  e@ä OßöÌhŜw´”A™ËŽ`Ŭ-9îDR2şùÌ2ĈKğ>£Ó3gÔùħߛóâ‰#R֒b™`çKFÁ½ù2ŽJ7ĝŞdTŭĊĴÚg$,Lgú•šîäÉèèı…Œäúb VÉhiûŒZ-g´û$Ĥ_xèt ½RY&ż`˜×3$j†tT½I'—Éh<ħnUɨž£Ôœ@­PĤ{ĝ4dFMğ [ΒÄ2¤°îÄ JF7éÀ@ ğ[íeŻ_C<=ŝ'éû§„¤X+-.ÓIBFc0,•Œ’”rS•ħrÒ§&3ÚÏ.ˆn:k’¤Ĥ1³ÂDÉ虑ñ—˜Ü•éN™7]Œüƒ‰Â:…{˙Ö/MRB:!2 χCĊs2#Ĵô…’Q#3LÛ@È6sÀvk÷é"£ċßa¢ä†Ĵdt¤Ì(•vßxĊ3§Ù›.,d”HLĠû~%¤Á›eJ= §d$ôEò\*QNvċä&3ŽŒ>ŝA˜Ï˙áİ!#˘ċM.Ĉ0ëËtbYÉ訙‘(Ï…Ìè™Sn”WĠS(öû‚ÔİAħÄÛ¸†<ÀÉjò¸F@€ŝ ¨$áJFNîlŭ@qF0-HÏ;0œ.2:R˘ŒŞ×‘`ĞdtXi·!§ĤË[@ĞċzFĞâÚ͎€$6ĤŽUBR,ċVQwœħÓf8*QLYÉ()ÓAÓÉ‘·3Hé퀞ş­Ŝt‡"£cġ/ƒ1 OÎJF‘‘[9BĈ+[­ÓŬ3š!£1֐İj,k¨´SB:‘zĊ#ITL&°JBɨš3êd@ËÀ´Œ#£`t'QÌŞ PŽ}ıWÉèPkÇóÜeH­ĥë=ûèêì3†ù}5˘żĈ*–Y\p·Û†2@ĵGjY0ƒRÉ(üiĉn‚Ĥí3£<-ӝ˜m'£*KâÙĝ,JF3dä/~”yçî,ƒì=}ú{F3Żïqzƒµ :{2)’‹ÍVHœ½’QĝSÊ ä%şÀlä@ÙĊı2ŬFFÔVD¸Î\Éh.~IÊrÈŜÓ§oèġpozġ½w†zİì[ħ¤É:ÂrO`ż_V{‘´LrÜoKMVHÜw‡eFdĈRnŒU2Š ”ç ,‡Ŭ}bċ2£Ú÷,ì/ħ”Ôĝ×ÓÌN éÄ2$JqĥE0–(KV2‚ “Znƒrrv@Ÿ8]sF·“Œ\ıÎíB ½%#ÌöŒĵ´Ĉ9wÛèM7ŝòŬç;ĞEFá5 YRPĜ…4Ż_†¤%ğ“ʐĵ35³`2ħ˜LĴ’‘'£8s!µ2Àž£Ô“##´ ”3ó·ŞĤód”ƒZm˜ ĜŬ'Q<÷^wiòċğÏw>6Ÿ[)2 %;ö/·+áÉhĵÚd”–äKtT ĊŠè`ĴbYœ”ú fV2ÊD~DÛxCÏyÓŬÉeş™§Ġ@ Ğd4CF9(ËâœÑô ­~fÔ̌3Ċìvaéú Ċ2K/ΉÁBXü\ҝKF`€Úhy2BO?˘dÔDÜkb çŽ&£,sżÌ3PŜ‚½ö9Ï>ĵ^dT+Ó9Ep²SQƒb``T0¤dH)'p‡’‘À ğfn+e}Œ>ġÌV2šyZ]&)ġ³Hwú>#êt`òöĈQÀ°>d„%3ĠM7Ŝ*!)nġ˘k-‡M§ ޞ×;›Žrj˜­2ÙsËġ>˙‡Ú3šĜbĊ‘Û{iî Ôj;5Ŭ³àuÇëEF€WÙqġRR*ù× IqĞç‹샷°Äy·ï2rËġüĈNOH2ÙsCݚíó´fħr“Ŭydä³#g”šÁt6\™îıG×/3޽ï͞‘Td„¤¸µ ÜGo†_§ €µwNfd\FH:¨e@ù£Ï>ĴjşC”oâdg6ĈŜ!ç0™/Ó=ûzfFÉ{.ÖböÁ–µŒ*j8‰Ê P•Mœ½#2#ħjy22T­J žòß-&…µî2êl€o<â™‡×;3ŠŻĦÒûÏ{í4CR,ƒ•lÜĥvglzµÊŞŭ4DŭÊ(UÉèPg†Œq^ĉ;ƒŒÂ8€!GF­6x÷ LŸ]2BrqucUZKFÒ éËW™M¤Ü×yŸeµ]™ÒÓĞ´û¨ÇĈŻ0‡!7(ğîe:cü ‰6(wCŻÓ/<ĵ>C݇&%J֙ϰ•’âÖÎW°Ĥr·^‚”²Ŝd”ğ9#ÓÎîbĝñ‡ïl£Ô›AŒCŬy™á‡µ”v;ƒ³ZÇ9£ĤHRݤĴ)´dw"ɑ¸ŜєŬ _w2j 7n+wĠµûĤŻÉêg×֒Œü' cœš.ËŭĤ×Gî02J_!šu÷^CrÒ éDR$Š*;òŭJá5$#2Π¸Á´ dêRµLws`™–דŒˆb™ĈÀ´Z°ğOŬ™Q#CÔ|ìÜWd•K*Ùqˆ1kêڝù ’ù²‹ô0úÔ0Ħdtó„$fW²Ë ‡c×qíxË ½Ŝ‘e:ìŸ y2CR,“•„Ĥeê k#`v@Û9¨5peşż¸ó֎/™İŜnn|KkáM—ƒòÜġŒ‚7ŬsÜádԔz{CZÏ­Ò @đeÙŞAÍ둅е Pvî3ZÊUYÈ/雳iÉÈdĵ›;×n{Ŭ{Ó]ßıdTĠSŞAh˘ĉKŞ„¤XV† ' ¤àġ!£Ü€6rÀv1ü„’ÑÒè¨t~ırŬÚdF™#˘,wj:%£Ĉ‹œ% ˘ĉŞŠ%²pùY2ŠÍ×Ü ÛÊAèU%£ċ™Ŝ8YôÚ ½š¸Ó(.×S2Jnŝ½ ïÁKż5C:İCĈâĝ¨`'šħĞMFĤ0Û-g”ŞkǏáĜx—oËu3^Ĵhfĝı*2ìŜ“ëµéui‘$3“Œ&İSƒbI|~âĉ‘ĉ8}݊k7QeäËt£Ïjft<ÁIŞEm5ŠeFĈ­Ž Z•àMw3Œ$áof—k¸5VKv'yÔĴ;Q”ÑʑQÜç85Ŭf’ž3JĠ9£ğ.[˙íĈ’Ż ´ŜÁD×ng¤d4?A %ŝdKìš0WB:ĦSF\p![IĜŠ|fD99†àM÷y•vgjM-WâBiWŻLG!£Î20íŽ[÷ÌZĤÛ7^¤dn֖Œ”N2 /Ċ-ĤĈS½Ŭ”y?5˜ÍܑÑÇ‚yR—ë/ı·”ìWĞFF·éµ•lnÂî>ĦC݁ĞíʐôâŞûK;dŝ›&0NIf$ \@íÜÍ…êMwó$?43‡tšĠtċ­(ïĉkÏ谗_ĉ‡Òġ%–ġK•”N&˘¸Q܉´dä,] `|™Îv1ü3%£Û+˘ô#(ÔPd‚k·WÓí>y‡ŜL1ĊAKâú½Ĥd¤%ğ$$gĤ\éԗé`*ۚĜ3ú¤WÓiÏèö•z}FXN?…nhµ`òVBFÚ3:\Ĵ0Ġó(6¤J¨ĥÈj†¤XĈGŞLIJ>ċ›^ŬŒ:¨AŠ.FŸyô´öŒn'ıà$Îñ{Êt¨Ġ0íĥ[;ŝœfFGBü.Ĵïù<"–í4CRÜꇒ“VŠ›Ç8e:·Ïˆ6rP+Ħ‡ñŸ;2zƒ’ÑmMĞEĜ+Ôȟ>ĊÒn— šÎìµÇ1ĠžÑMŜ^áÈ'}Ÿ(ëú Ċò‹ŻĞëëÔì3rûš¨eÜ>#ÛĊèSO~xüz½íħìÊuĥ<ċ+$ÜĤW“{o:UÓŬ|fŝ£,~ĵĤ%;͐NꘅÉëÌ­÷–Ó¸BÂĝ쨝ù}FO)ÔĈµü:x, Š“.Óe¨ŬµZ.3Ú}RÉè–ŜöĴñĈHDUvŠe‘Ü 0ÀöôdFµ`—{2²g¤dt²çĈşħRĜSHF&ÂP%í֞щ‰Á"kG(!PıÎ=bâî;‚Sc$֑md0-)ğV3£Ó“(fµ9¤SħÏȕw‘û2Ŭ'P<÷¨Şé–•G2 e;šµ4Ԓâ–‚KNĠr“&#HÒ´³šèӞŒTÀp:2$qjğS×32êt`Úp÷)Ÿ)-áMÄşžQ,ÓyA‹šĞ*–uáá„)ˆNşLçoŜıޞÑ'}ŝ7èœÑ)Lâ/2ĜZ˙ëÓ"`0 VËozŭœŞé– ĤÌ_D²hÁäú‰:‡¤XĈóCbĊ–râv@Ĥcœkw'¨Ñ'R5ŬİğÈPċ}H˜CŬkÇ3r?ĥ;àëŸse:]·d2Js˜ŭLšŠK‰+ä-ƒàJe⟯“RÓċh·dğ}üaài%£Ó–U‹· Ş&öO’ŒÜœċ9(Ï`Ż}NŽ-3Żğġ ú֓Œ”NêŒħ¸Ġ q§Pċâ{Û7½v2gÔ2rO?|^{F§‘‘ˆbK Ĝžl™.’QîĉŒTÀp\Á˘š?’„ˆÖ””´‡tĦĊ8"’)ğuÔ'a”šğr‹m9; 0gt¸ž‘U2şÍħ)µ2ÙɐQ–Ú-×32ĵû$Š/*_°d†cÍZ‡o%¤J`ÀÈı ™‘7J…!˜ @£O?ìĉŒî=4•JF·—ŽÂ{M'AFD13 Köì>óöŒŽìzFĞëĊ÷X÷!)–‰Ì?‚'@FĦ\hĥ[NM÷g>˙Ĝa{FJF'ÄG5V‰?—ÛXĤƒ1~ÎèIz½]ï{ȊĊ}ŭ‘4C:İLœÈ½úäKx·KÚí=êÌV 2Ùsj:͌V(8‘ó<ô‡Ò<Ç(íŽŜtjt;#E= N-ƒÖÛÖ é¤ñ‚ŠSĠcrí6m´wŠîaü™GœšNÉhEÎš‡È̂c"£Ê %£ÓrvÊ"R™ó'‚YîWH|N3£“ĦLJvñÁXĊ’²p"ršvLĴSPñ’3#ï}ĉˆ)suèaô)%£=6d—ž…féf™eş–“uS–ÁòçÚ3:‘7ŞAX >ƒĤƒħŠċÔëœ/e)ĜíC:£T {iZ™Ï”ú}êaí­êeÙ2"“€Ë%£°éµŬr’qj:'íV2şŭħ"]Êט=2*ûV,'´Dg\gL2˘ê÷D³‘hàzFO(­ìİÉ\ï@ĴuÄqdD&’‘iµÁ{O˘xĉa•vŸh–ätş”QËğKş œ ÖħÓÒ\ğÎ ²íRx†ŻP2:°~‰È½Ïv‰ddÙı}XTmzĠÌè¤Ù¨" cŞ~3™µtûVB:İۏ+\ÈòÈ(sċ@ŞMŻè;×îżxL3£5¸ÈÄcíòËtĦgd2Ĝ]ŬgtjŞ)"• !dĈĴsHŠeVì ÀSċi ıy2˘ÜK‚3÷ùÌfj €áóĊHÉè”_–‰¨&@XÖ>#d(Ëa÷žR£Ôӄ j`żK*ħ’’b9— ˜ĥ‰òï[WÓ?/â„{ŝé'ŝÓÍfFVÉè”!Œĝ^ÏRÈ(ËŬkĞċ¤Ŭ:ôz £´İ~Ĵ=ûš!)nŠ~ĉ\v3€§ĥşŜ,Ċ´ ÌfĜ.ĈŸyäV¤Ŭá×JF§ YÊ2wFĴMȈogl¤Úm˜VËÍİ´ûôeGá•ħá獕·Vz÷ä S/ûNŻğGœ32mççbğö‘[͌”ŒNFRşŜ‘DƒU^pŭ9 3qkÇ[-7gĵéTMwzO%N éJHŠ[FéMÔ27Ÿ1ܜQf`:Èxi÷“š­éMĈ_šy~ò}ToşV ”·`Ż?áÊtJF§³\_1nĵÙÚCR,% À dÊu7£”é2rÊ:ĵéFŸ|HÉhŬ/Ê&…žÂ‘Ġt&:0 ϽkwX§eşS+âso—5WU,í˘ëeÚÀ9:µ\ŭßlĉîaôIí­p²^ŝ  ,žA\fDT>§jşÓ_Ğв*SżĵO IqôÓä+%TŭşPr\|ĉ÷:3˘vĉ–ëٛ3şùĦW%£9? ÌŸݲ{´2]ğÊr·éµû”ŞéVâH|˙Ş÷Ò4Ó'%$Ċ­fI䌝£ôûdÔ2n•„ô0ú´ÏŒ”ŒÖ—ˆÒ›1aƒ~è5Ë\f7ĞĤŜtĞ'LXĴ§Ëw€ön×ıJ³£À;…›Âĉ’c›v@žŒr ›9@}Œ>ŝ¤Şéî Cäí}²:ûÈ>ÒîK"˜vÛ ½~ñQ0ĴÌĠ$^†5ĉ‰ë·Z)núvÛDĉ‚ Û°vBĉüm/í7gD Ô2gô0èóY%£Ġ;UgRlX_‘İ.1y“çÎ(UËt+š!ħ#!ÊüK›Ħ23Ô IqKĦĊ"ÁËo3üİBĥdü 'bhġ1ŝ”’ÑtĦ‘Z†oĴJXLFîh9fžd9¸û4ĤÏ(­îq JÄÀŜê…tAŸbA&(63żƒÂP&IüWĤójşbOE5ŬŸñtü¤’Ñڞ™)󂪅mûeFPžğònŜwŸÂô áu—&_zġùöŸ*­àħv„$UöğŽPB:ħó•<“6éy2˘,в¤Ü8; Ï>Şdt§Ulˆ*b²Ÿ ÌCĠğTsíç]ğƒ´{òğ/t>6 ¨d´Jħ‚+u°/jÑÜTZ IqäàR]t²‘'T?Ĉ9#ż,-7 l€Ñ§ %£;Żl琑ğĵDÉw3˘8gÉÈıvéî PĤûŞ’ÑJE _Ĥ żt¤$`€×/KRB:Ŝ€Ò ìî÷ÂsY¸ş ı–™h$·\Żìbô‰‡§?<~=ŝ”§'ƒÁ—{½Ŝóŭ~˙ş’ÑZŸĦúıħb"\m†9ĥd…„iµ›dô'ዽ^OÉhġnħë‰__ÏëùrިáŒ{6Ğ2‹XÉÈt2 70ı›3úänÓkBFŬn÷ù^ݧd´ŝ—™úıñ{ï ˆĉŞâ]𽚳á†^ŸĞ‘Ñs½^ï+Ŭn÷E%£U͕]f,âGD(ƒZ)_^IΈ˙ ,àĥĊ<µ ² 2ÙÛ}×}>ĈÓÉ<2+­ÍEeĉµ%^"‰5]a?›âW™ĦòĤĞVH|鞋 Ïġz½ŻùÌhOÉhOˆë# ü‚PİS•bN0!ÌÚ\ΔìjŠ) µ@ˆ`òÌġŒ Á´ `{6’ÑŸtòdżß˙rŻ×ûzŻ×ğáÉh˘d´VÌ!#™;PWZ;ç´Û V;’Ñ·^ž|ñî  †^Ż÷RŻ×ëz2š*­Òiq/İK‘Me_?(!_°‘fp ˙ħ ~ú:`L”v?óԇÇoĵrñ£vRġŒşŬîġÁ`0H2#Ğd´ÒYÑg§~n$éˆÛôj0¨ŬżòYÏ=Šo½<ùâ=7˙x0<7 Úív_îvğ!3*”ŒV ”ôŒâĤàĈŝ4%$ĊÈiĤt„ĊeŜ-ïÄÉîaüçO}xôĈ+?ÊÓɓáK½^/”éIfĘżr\Éh…ÏH3ĞNdßâÊuÖϧeΣ•Cn<Žâ‹Âë.Ožğçâĉ7ÔtŬY%£UJ,€ ûN†aEÖ2IRB:žàÒü9'·]§ö.ì›2'íġ1üÄC OFRL÷™Ñ×ğŬîn£LÇsˆHÉh=΍4/1pWµ€˜v+ —Ŭ'1}ĉ|ëċñs÷\ÜüÈh4z֓QȌĈsȈ•ŒVĤ–-ıÙ&Â%$ĊƒKĤ˰Lf³@Ĉ{ıžÑèğŻ\ú“'ƒÁ—úŭ~$£ñx<-Š˘lĉMWÉh}ÊyMRbħÈsZ9ĝúĦgô콗ĥ>2ŸM2£½Ñh4žN§'£E—%£Ó]³Ğ,€Žġ ;-Ù)ƒŽBJâşG°2u xÚĊĝñHF$ċôñPĤëvğ7úŭŝ`<O<q#°°’ÑÊÏ< DÄĈ'c”@“e亟3ş6àĠt/uğŬŜp8ù2áÜ(Ú“cQùיDܐùò’âÁ$}¨E„­µ%3™yoŒlĠOòĝìñË4\ŝċh4úŠÏŒv{½Ŝ“QÑĵ5"¸(­îċ™%Yfž0sÏ ?ñŠ/üĵö£÷ßuîÏĈñ׃ÁW<u‡áx2™2ÚïÌ(­ (C܃UŭfóñUBR, 4ó†bÙZ[”e9˜N§×žĝzoP~ĉw_úÎ{Ï˙k”Ó†“Éġ~ż˙R·Û½‘Q9‡Œä€à˘d´zÙRú~D M"’²,mQ˘(şĊH^~ùĊ?ÄÛŬ>ŞóÇğ£Ñ蕠Ĥóif$œ%£•9-‰Ô;’ˆŞì‡Ê’¨yóL&ĥ,Ëñd2éQĈ_êÉo6{ïG1ı>,Šñh4êġz½nŻ×‡b:– HeżŻ’Ñê“Rúçl­-ĤÓép2™\Ÿ &/_ĥÏüĞ+—7ŝĜgBƒáp¸×ívğƒÁ`2Kf>̙Q2ZÙl‰ê?!”–“Í%˘€3³ÇcLÏZk/<ùŻ[ ëY˓Éd:Ĉŭ~œQ³œ%£Ġ&ôç eYŸ!´‹Ï=qoğŭì`Â(Šb:&ápÜï÷'ñĜúÌsŜûygDÉheN‰ÔIHüÛDÙZÊIÏ×Q.(D QòŸÙçG“çyvĉ̙ÖÖÖV;˲VĞĠj‘)˒ÇħL&ċh4²“ÉÄb˜÷)ŬŬ½ŭío×7ŝ6áĝ5ÎKóÜ̜´½½ŬÚÚÚju:NĞĠjcrk­L§S.ËҎF£b8Zkí=Ì}ÎΑÈHÏÌéo˙öok†¤7ÛıÍiZ@ €F£Qi­cL™çùDDLY–l­˘(x:òœż;/¨ÈAEÉhµ2#Ì9;“ɤ€ñxÌ­VkBD™µEQˆµVŠ˘`OF8!-"'%#…ҚšĉÏ€)ËҖe)ÖÚ÷!ŸRP°!-"&%£Ġ'ynñáÜpY–Ežç<ÒÌ eYtnš%<Ŝ‡¤”ŒJHkFB˜s󍤀}á¤<ƒ97äŭnğ‹ÈGÉhµ³kÌ;/€Ê²ê>ásıQ2R(!­A@™'÷^¤š ÁĊ4ŝŒȲä&‚Œ’ÑjœŭÀ¨÷–x2Â>¤rıQ2R(!­ipĦFPYöÚ$À4IIn!¸(­O–½9†ö;7H.0JF %¤;,¸âJƒ 7ˆh^ı%£ĠżÌt‘I?ĥİî\tîää¤d¤8•PÙ÷Q^,7 @ss‚gÍà"—ŭ2§ıd„uŬsĵ˘ÇgŸ÷˙¨çĉ°„tÏgÈHÏ̊ŬnÖ,~k†të7ŬĉƒÜ”Ò‚Ÿ&Ó:J Q2ZÍ,i?dž£œ›£ž%#…ҚÑaûI͏Yôg(­%5:7rR‚’‘B éÎ .Í{ž5ÌAe—ƒHĉ°ż§X­s„Cž›ƒ.:zfJHŠ}ƒĈĵ2ŜAeż˘eġÏÍÉzö<´ĦXόB IƒË³IĜ‡œ›)ĉÏ5°ĴÏÂύž…’bßìˆnòÁż™ £eġÎɲÎÍQ3m=3 %¤;$¸‹{IG r ż§¸3ύž…’—…û~=ˆ›ŭ3Ċú›[ͲġÌ(”î€à2dö#˘[ T֓”:7·rôÌ(””˜–4 Ĵï™9Žs£çEĦ„¤X¨ĴÓ`˘8s£çEħP/;…BĦPœ }  …BĦ„¤P( …’BĦP(” …BĦPBR( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦP(!) …BĦ„¤P( %$…BĦP(” …BĦ„¤P( …’BĦP(” …BĦPBR( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦP(!) …BĦ„¤P( %$…BĦP(” …BĦPBR( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦP(!) …BĦ„¤P( %$…BĦP(” …BĦ„¤P( …’BĦP(” …BĦPBR( …’BĦP(JH …BĦPBR( …B IĦP(JH …BĦP(!) …B IĦP( %$…BĦPÜ!ĝ?ŝœŒÊËĞĥIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Blue_16x16.png0000755000000000000000000000016512467662066021655 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcdHûĊ@ `b ŒjĠ0t4f’€ŬĵD(IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_GuitarGrip_Button_Red_512x512.png0000755000000000000000000011773412467662066024005 0ustar rootroot‰PNG  IHDRôxÔú pHYs  šœ IDATxÚì½kŒ$Yvß÷?çŜˆÌĴÊŞêé×ôÌôÎÎÌÎì{—ܤ].w‡ëñ`8ZI”,H6i 0`ü@ˆĥ%Ê0%K€ Ĥ û‹ h”jı\ŻíábE|j P¤ıË}Ï΃=ŭwfDÜsüáŜȌŒŒĴîztwU÷ù=S••yóFdœ˙=÷<0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CG}ÀÏĴġŬg×GáƒĞkKOòĝ3K*;ĝ_B``ŒT’áSÒxŭH€>#á•W7‹›{½×K+ıoŝ>À ş´U”vj 0  €—×úOĝı 9˙SÄĊ9Gx˘—ċ ^/„Ë…Àĉ8ŭ˙­Ş˘ Èf,@A§˙xŠŻAD4ü(ˆáŝĠÍâ[·çK+9@E€4È­Bí²0 0L샗Vs·Dü˙>Óóï˙ŝ̟r<1ìµYUÇkZéD\.çŸċĵY)Š›aŜNß ‚JBXoè °Nĵ#çÒVñż,ú /ĉ+&OVziĞğd 0 óĞê˙û™ŝ=\Œs™'£/ UŒUÑ´˘ġ’,v•Lݧİ`˜€mQ ‘İup#Ä߅ŻJxBh ¸R ŬÂ-ÇÂd*€à˙×Żâ,Ĵĝ­K[Ċ?X(†ùiŞm’ਛgÁ0 xàÀ‹Üm—aĝÄ ğòž~–dáéÜ!#S4UàV"1‚ÖËëYÛX)fD‚ŠÎìÉêœ˘/ZÂĦ~.¸)SħY€x" vDP(pµ ĊcŒ›ca6‚µJri­˙…{숀À™Ú°£'¸KĊ?şpÊêsќ+¸´Uv™†aÇRĵĵ–g£€=žû/ż§çÑAŽwä}rfTÉè f·j‚Ì ?‡†@¨½ÍߛĞġĉïŞ³Â˘ùžµ‘ecU¸ĈT4Ÿ·WËN‚@’@ݏ˙í2@A#¨LBD 3*T€>ïW4½‚· ò£@|µ’˘‡>BèżşYüv§èZ͙[>…†AÍ`†aÜuckŭĵ||Ĉ_~Ÿá‡‡V™1L1’VġP‰b µÂo³èo˘óF]Ħ=>FhyDğžCoÄä1íĥŸĠôħĞ ˘ù÷nĈ30Mn…8×*™û›¸\UàŽ!Ô[ —ĥ z~%çW7-.Á0 ¸O>³–ëyïñŝžÇŸöˆ#ô™§1ŠäCŻ=Œ½…@[ˆ…ĤŻ=ġcMñ {ĵ7(Ug^?³%ј6‚Nâ^×uĵÉ{*PĤ׌Eá˜Z'„p-Ŝ**P<ÖÌ0=:‚¸ÉĜ‚Jħ à›Í× …8wiи¸h_ZÉûQŜÌyèÒV1²ŻŒaĈƒ?ì^XÍ}ĝ^€ÎdnÎĠdD“€żœî\>ŝĈÔ!êÇÒj}Ñ{JZك§4‘G*:§ 3Ż'd÷€fž[êìï˘@16BU'â¤é°_òŒ§|^››cŬĊ{úvğ\"_/ÂÀŜ×6ä àJ~l­?÷ba`£T‚܆•Ì8 à?Úë<½´’çÍ×ĥR, ۖ0 x€ĝœ1ŒY[c‚ÍĉúçzmNɸ,XÍzlûü7|"BmUħÇ6œ1ž>×Sk˂1 íƒĉ·'ŠŽx†<İİ˙ߚ·3žŜžçöG )uòéÜuÎóH[AôFŸšwn”Uġ™•ü'ÚWÉd[âoŠ?PÔóWîîĠÍâ_-šż‡yĈÔVÌBŠ 0Œ(b°šŻW›ÔXeïe|eb §İŒùĠûŭ‚÷54ïIèOHzĴÓ 4Ïô,„.E§Y¤™˜¤]ž?ŭdUë8@ÚoñzÀ ċ²‚ëˆy¸R nùmTXTsU M׎_Ĝ*èùeżÚ+˘@ĈWĵßLšÂ0 8n]Ȝ Î"ID@Çıt\>àxŽCDܝŽ=:šÙ‹½ YëoAtF[4S]ğÀ ™x†Úà €f3. Rš‡ú˜³¸<ż˜ċÓ÷J[%˘À³QdÌĊ$lJŒux}Ì ˘ıżè…ÜwJ™+U…‹RŬĵ¸œo×⢢tŽ ĵşYĴ,ô*ĴĉÖYŬÔĴÍ`镆a˜8 ƒGÑòfÜ;ò†ànß2ÏûwÖò:d­ç4½íUğ´BC§×! VüB!o= šóFŒEħ⠕Of½WHŭÜ]UĴ%ßşd F"Ü×GċŞVê9¨Ÿ[(ä4ÏçI€XéŞÒëĤâ&Ž"NxiÑ\§@Èı1(/mÁn†a˜ çuf Ç´§S½˙[ı|˜ÏzÌÇÍmQĥ`ìLĵ"hÇ30›ó„V0ä4žh6ĜħÏ4W£ĦùL@„µĈĉ]2š (4ŽñɕžkzĥU'ħÏöf/ßړqK€ïĠO8Ì*FAÂË+}ežĜ  ĊOĥçv$%ϗ\Ŭë4·:‘ Ö Ê0ŒcǑ¤0ÌġĵgĵĞŸá£K9ËÎr,ÔĵÁŞê$  mLĞ<ÌK‚qÏĊ4 ]³azıµ‹;íEmH븆 Ñĉ55ÒyeĞ)ġr]WË0÷÷ZĵU‰n™3֞™5*2ĉ9<ıv+à/ĝ#¨H!:˙­â›·›żUiĈħ/s]rŒ Ĥà<q·”tX€‰‡;Ġm<í X$ZġêàSî0ŝşS+7ƒâVìˆt|‰â`6ĉ?³#ĥ‚l5:_ĤUĈLĝ{—6Š˙a(p‹ĴA•aÇAĴzĈûú&Ž›ħ½ÓbK÷{Ì{e€ÜÎC *)”q6žĦ‹Ú+QÇ34Ğís³ d³QUğ Uŭ{Ŭ¤ŞêLÀĠ xc\…öĥLòBwKá‘L#3¤ñĜ òŻ“FÑĤ`‘˜ñċ/n˙Ímĵ ½ú{ŜĴÀiE 8’ À: y3gf›Ŭ{oÇ1aŻâN]cžĈ4ÜŬŒiˆFœf¤omüC£€S>Ï@sŭ'&ŭ, ĠIm¤ÜzŜweÎĠŸÒfÊ´ĝ €ġ*ÌĊflÁëeĝ³ÒÚKIoG…È‹§ˆ˙ëöüU xnİüÛBñËÊZ8T]RŝûEçċ…Ġ|à[ ŻCe^0Àt•ħškNŒïI[Oç§Ï­êÌpx„1·ƒ!‹/êvïݳ†”)_°8žĦҘñPh·×a”zQ\/œ@*Eq#vĦŞf;M"˘?-Dòĥè*4ŝp³W˜üÑMJ\ëN…Żŝî(ì.ÜyšĴF˙ †ñ y`H6™ĉu8ŝâáŽk4Ìw˘;ŝ͉‡F§IšKÛ · †\n­Àëí‰>§@xÌù™9m „hşgë3T= WĞĠùFZLÀëexc;t ž[Np.ssâ]ReˆWĥ úÔÀM“I™°ĞЁsö…1ŒRèĴ0çżñ ‰‡ŭԗÈn#fj44˙F‹V ZġÚ ĞjšĤ­ŒÑôĴY Ğ̸˜ñÌ窋;•Pĵğç;½• úĉ¸„oU}¤XD/ĝŽÚ ̸\Vxq˜yrÏQ`D“›Pàç.mŸ[4ż/ĉKÍÂN- ħK¸ÏÏ|"\Âw2ĈƒΙè9žĈĝ8Œi_1 ÒësMCfVċDdò„*ĠxÌRí†à8 rĴÇP7ĞÊSùèI£*Ñɸˆ¤Z†žéÙFa§zc==˙™žŸ›˙Q\ ›A?„ŽmÇk•àV_ŭħµŝìg•(LF*àï‹`i"âQʜñ‡~qĦpĉËLS=ÓĴ kPe<ä‰ŝċµ\W‰ñüJÏö=Î:Ĉ˜ĈW‘bâäē8Ŝp›TŠ`ÈÎ÷[ÏP ›úïÒ,L <-8ĉMQÜĴBçßG |Ш`·}żÊ@ôĠQÑk´·€Hc$ ù˜/4€Ó€žsüÊFñ…ñĵ°œ³¸XË*?ĉ¸ƒğÏĝĥÁPvc?ĜĝLœ !&Çxĵ{7Ĵš|Çş Y§ASKMŜ‚B'ñ  ĊÂrSì7ŝTñ¨#<êü܂@’¨xç€Ĝ0s*h@Ĝ ‚÷ 2ĴWĦó\ĵQ F"żßuÛ{ИoP5Šï÷vÇáwˆÜ8u]·o…aà![Ê1úhb§ÇÄ}ëlÓ*ZĜí2ëp(6=ġÁ5^Ĉé‡vuZ² ıäg ÏP€Ïö´óWŠbK{(}{\B‰šçàWßÎnAÀ­ġŻ€Q^+¤ê;lĵ²Q|¸>ÎgÖúŭ‹?Xs)á@g”ş²žkš“ö<ÀµjĜ7ëàäoÂ8Š9–2Öö8Oƒ3,.òÔlX•§`Èz+B˘£ ˙ž:5é´°“(°Üì´ÙĴ ɊSñħ:žaÂĥ(vúvEQ‰ Î Ġâr%ïX%VI÷;üÏ–zΝ#œ^ê_.+°‚.mğveĵV{ŝĜ}¸EĈżR*¨ÒÉêĦjÜ)|ĉ‚T9Ŭí°éYċŽ››t­ĤN˜Á=Œñ1ñpyxŸŸiS=X ì˘4Ó0›bİ }PM7mè§?6ê¤SŽ˘£ĜRàiĵݟĦRAĦ@Pŭë’á+PŭĜkAĦĝ+…çĜ‰òçë>ż’÷ ¨^µ˜q¨ ÀVs/Àï,Ŝ÷Tĉ—>8ÈñŜcĜ~R4ĠToq'CŜĴêhçEœ:‚§Ú.Q…joícTƒy\äçLcİó * ĴGmüğnUú4ÖmŻĊH|~üR·'uâΌν~Üqƒ™I–Ôiŭù;=9t›`}ííšwÁ¸Ks|\cÚñ íħr‡€WQ€joBĵwT Ñ˙û‰8)ò'3ĈFjÖ°cQüŜNħ=äeŸí¤˙ùÍ"€—Wú~ ˘_Ü4πqò@\W€dÇsQ Rc…QĈİñJİ "‚K†z”в‘ŬO} ê|êĵéöo¸ùǘï‰Ŝ2hj‚hËuáÉ]7ŻV:×Ds_”ĉĊ ÓŝÏ˙I^šˆ¸?ù85Żâ?O,é;ÓKiŽĊú ћżGħȁXvgÒ×tĴ (ÎÜa#m‹.mÑ%fMŬ˜~­Rä^€—×ò^€/lcğŠŒc/@ċ:ööîóͧy ˘(ÉĝG!p3(F÷òÊ$ ¤aäV’5t"“ÏÉ"#`É ÔZš?FĉİHR}Œ|R„eêeÄCsîĉĵ-ŬeüE^:}6SA)öaö|.ŽqPÑIP0p;ñp­y ŽŸ@àğ|Ŝö;Ĉ™ëšfŻ÷É׉JQ‰Ù ï+žA=Cûa¸[Âaî}Û[rēkzrŬ:BH™ ñ~x&|˙ Cô*[TxğÚ úçoá—Wĝç×ĞòéŒÜ~ ž_ÊäĠM‹0ށ`™,;ïÏM •š×ü}Òû\g™'àñ̃2ĊzPT*¸^)‚‹^€M(ĵ,ŽK¨?òj<`è ˆ°Ù*PR5&ĵ_ŝ+Ġüq*çŬT\--0á¨=~ÁsǽÍykĈ:Tşçŭmĉ‚™_–(¸9á]1:ë­ ™ Ğù‡ĉœŸ´͖~ù ‡™@á†wρ&İĈ’D{İ Ÿb ŜŬóxĤ_Şzĝú8àµÂëZüġœér%xuĞ ?ÓsÖvÍ8>ÀUñ]_İŬÉħsjĉGÓáˆc½sÉ˙="T`œó: Ĵ÷ŝ›+Ó[ÉÈ €‘d$iĈEXĞû Ànˆ[]A€ô$Dw3„Îhä,ĊlĥJ¤6ç68†%N-!&!žŸDBŸşWĠ@ÜʨŬûYŞß6Ĝġœ´ĊĊL°äœ€…]h½`ż1]p;ĉb&ÎaŸ1÷ÛÛöÄñûé¤ħ¤—¸ċ(úáD „J÷ OçŽëU]UœrĴnË³ÍW6GOŝÔù%÷ŬŬÊmúMkˆdÜ=8µV–wsċżèƒE£¨DP+ÒB£Héût…Ĉ|`…˘RšĤ÷¤ƒ:M:í}£K›KĈ‹&îóħ(6%"àŽYé4r[gó˜ë›Ävúy$‚m7¨MÈcY›Òé“3"ĝ$^¸ĈUŻĤWcÀ„B> |lĵ) –Ŭš+.sn—@ĞúXßġ9ݳ.ÚÁ’Ñi g½Í #ÎAgçtö€Í.·Ô:v[@췆Iڞ0qô˘àNM#&(6'"‚ˆÀS\  ˜P(0$ÇğŞĝ÷O p’•08ë oĞ_Ş—K—üҋĵ˙…­bdgĈ¸7€£í‘t̉¨½ÁˆµĦ‰‘ŭÓè]ÖFŠE@>YíSŠâ~‰+­‹ŠÌF˙„VĞÖ*—#œvġÓ§·…2Ö½Lİ(IËPĠ[璠 ?{j *Ĉ•bWşR {U„í XÔ×½éĥèÜŜ|}è:¸Ñ“,°ĥcÍXdáċ è1!o”ĥ€ˆž&ï]ÏsÓé9ĈL7·ıq;u³DGœÍ ŒE‚0Í™ÌËupÄ^Û1ĞxàÌeSGo]H]9ı#,Q‰à‚g7R¸Ç=;Eġ—oVŠkAz+Ğù˙^^Żà…aî^ħ˘CĈŬĴ€¸Ĝ ĜİâĵgˆŜż/Q\ÏqóËH„§¨×Tˆ RĤġ b´n…iEħ2Òh—ĉGÍ eyëùK)(P0£ôô§òîۇ"Ї˜ıċêŻy£šnU"sú¨ğ.6ƒNĞĦéÔHĠ[ğ´·€ˆyÒëĠ⛝OİNìÚòÉ!–hï hÍEoEŸy­1ĊÏÔLĠĴ…áDLé|ìH÷—B'šgò|•™í‘½bş…èĥF÷¤ÔqCz&‘p§Û“-EĤĈWœ&iÌı‹[˜¤ÀĸàóžĝN)ĝúˆħäWÏç>{k\ŭáo¸l&ÎĜ‹C­×_^˝(^Y"ŝĜĊÜ÷ŝŬ•Îeg=Ï(‹ÚÈU¨êœáÜo! Oó7Ĝú&_Żıa¤HÛ³îèş G½ß.V¤- Söc{Ŝ(uöĈ.s~ZA°Ù!íN)™]ciÏíÍ= şĜHñ…Š=V~uòF=÷émĉ'a‰ğW͵8Â0ia=Oġ]Rp:S.Q·az!jOCWYÚÉ)§Yuìncĵ›ïċïyµ—a? ˜Ĥ"•$OŞ~ĊƒÜáß+HeÊ*¨–êŒĤëAñíq‰ŻŽ*ŒoĵY–?òċíĠWóÁ6Ĵ7q„€*ı˙ïWÀìâ|z+möP‰o͕àtßY!Ôh?Úş[ÏnšLXŬD¨ĞuêĸĞ“ÎüNMhÈ1ю֭­ôĈĉÏùÌÖMŜ·ÙĨùüĤı›M3ŜáŒs +;Ïĥ(vÒ şÁEÏs^‘ZÜ ‚.-Sﳏ4ŜĵÖ¸(mħlUŠĞ)£˘éÎ×t>–XŻÂ|щ'&J:&d /ÉÔşGħêĞ{Ġ:‹'oFğ T}Üq‡gŠx…£Ù2ÒÍ/ĥÓGƒÎy x"ĥĉĈ^A’‰qc`ˆĈĝn.~ˆ@·.3Uôa ŠB R<êsĵĞ—áF ·Bö•34†~À_ûɵž{3¨^Ú*† €C]” öŠ˜!zŻ'RsÑ7Woí})6÷İ$şuó†ñşma#şƒDğŠġŒHhw£ZĞaŠĥDFíU3Í­~Ğ֊SŬóş<ŞN?hÛsPÏKÏQlÁ—£C4&ûċu|“ıŸóJ7‚ JE˜şĉo'ĈĴĜ.tŭl}.ŠtbÖ'^ ]èe¸žÌcû:LƒŻU²0}’‰qÚ3T½ŽÎ—‚˜eá1MɜBÎĈ´k:„T‘ÍÏUQğEmóü3fk;4%Çí¸?ġy şw³Ğĥ@ngËÜNH+Çp\wPĜ.NTQ vië.§X¸LŠ‹û•à´cĵY†—NçĴŻ•ò_n—áĵñɕ<˙âĤz˜9À Ğ9½²QèK+ıžrŒ 2|tß·-—Œ9wŬ¤0[H§ŭ7IħêÜċ›Ï^3·vû­ŠùCÌOú^ñĦ£ÙQ3Ŝ ú¤—óéíoş![UëĈ*Ï)°•ŒîƒŜNÇĜÚi”¸>×(÷Ĝqş í­œúz0!#š´“ĉ–(Ğ9ċxf›˘9üú=ú̓ŸóŽë .zĊmŠöĊ^FÎӝżşoÓkĦ½•˘D F+ßĤè0SI²ëú;ŠY÷Â@G݇¤ïdŬĴiá À­Jğ;ey%Hv£ĴpuGÎŭn¨™4Àİîxt _TŜÇë%Ŭ+íáߏÉÜê }ó|܉•ÛhżşáI[M`ÇkÜü›ˆvÈA“PßäœñŽž&ÂSç¸wUħ Âı§)|nT²p5şd?ħÓ0ٜ‡‘bÏ`HeĊ(aĞd- ƒġ2tĈ„ä)>a‰‚ùÔÍ ÀY7ŬzX$hkVÜ´ĤC›qGĵ¢bPµ¸t3…ĤĤD]i˜íTMšı_èž×vÛ!ÖŜÖpû(äp”Fû~{ ĝÇ4 $d˘Pì*!ƒžñɕ<ğë•ÇôÂĠ3o àŻžazġmµ­û=¤ŝÍÚ?:ԗŞÉ5÷8[ÙÙÜ|ڟ^ùÎÜK“ŞÉèNV!³ŻÊܵö4‹Ħ£¨Ù˘rÎġ*2Cı0ßĥµ=ĈaĈsÓsÏ:2ŭLäç ^Mj(T*àŽfWéÀ·BŬ“:ÏӎFCı𠸓lĞ‚E•2€u Ĩ Ĉ9 =CIq-tXÏô…ĥĵÜÀœ -5…¤hó¤ á˘3žñ€TÉK59—:ImŽC ܖ˘éAĜK@´ë:L².¨û}óŭ>)‹R1yĉ;MXĉ˜ZĜs„Rˤ8ïgsŻíZWŝhT]à×ŝÖıár­ĴÂ/Ü™0pgzg_‚™à´{d ï¤|,AZi‚9}›â$şĵ‹W²ÇqfcĉÓ@9­è'Ĉşe/{k‚4İ‹œè Älz:Éè˜IÍlzĠ?ŻòÔ46‡]Ĥħ\aGOç3ğcG;uVĊ‚óħKŠí2Ö£(ğj;¤Ġŝ.ë²÷•ĵ%ÒYRş)<½ sçI56zZċXk9ĜêáR•Èċ´ċ1V,\²{šnŸTİ.w}Ŭ1-Ġ]o—d ÛÙïž.LĠ k0~Ĥfd<ˆ×:ĝvïĊBğ´ĝAŒú½{y(ë’<ALï§@_€ó+}ŜĊ“yyĉkêo^.Ğoż­ċ?0úôjti£Ĝ13i`!U+çz²ŠşÍžä|—ĵ £8ÏQ~O²œŜWn:íŭ™ğ\¸î6sĠĴĉ·èU-áZAğj'4={Żŭ},—ġ¤á)wÜYCÇ÷6XÎñµ$ *Az]lÖħ˘{£ÙĠä=Y”u!À:í];f™ ƒTĞDÑëƒÙĠúZRqKÌ3Ŝ‚ÚKÄ)xô‘ôĵzĠ>jŒKU'Ċ˘<ĊĈšÍòŜ]½r3ŠâDdö:,’D$Äŝ½Ítá풲[š™&ÌÜéAÛo6ÄŬŜBà;xŻşî‰KÛcŽß“!êgütîpM_}y›˙[7Ĵ ‚g|Ṳ̂ €Ċhuħ[˘ÛçLwc× ĥ:*/ÀQ}áċ„ÍċQĵNZ™ĵo IDATîĥó´wÌCŭš…ŭ­h>RtvĊÛĝ CH„†wĥ@ÔTXWXÜY³yÜ­ {<ŻXˆÛĠlĜUĊfĜğœ÷­ ¸ıÇ1ŠPÏçĴ˜ ‚!o—4·²WU OâyöêĥıìbeIJeŻ‹q¨P ˆ&¤İ×9oÀôEÈÒÖuœ³f+בV{żÁ^ġĵ S,….ŠÌĊTâs8%Ú;5ìáé^†›é£.|żßxuËú ˜¨/¤tU‰œ°Í Îj‰/£ú0 ‰üwÙËUħHDèĴn˜O霟ĊvÌCŽ–k˘uü­ƒúu ]E˘†žt8ċ|gĠÊÚĞQ!V…lŞİ;>ĥΝ6ĈjN#cš0R`Ú€ĈûĴ§OÛE?ĝTìİ-"j~Ú3VŬ70Iž NÏÛlÄĝ4Ŭü}f(=˘ÉöA-ü‹ŽSV{Ë$tj·ÓԋQ{ö›Íp7ë+tyš Š(ŬÏ bĈ£áĵgĴ‹£HŜ,_.Ş7>ı’˙â*żĞÀ›Ÿ_YKbó¤`L ÷ь“gTċúl œ¤½5C—ó ]˘˘á”ˆEŞšĊfĞ'úÛÄ;ÔŜM&¸ù~u€,uĵƒk¨Ïf:^ŒïáIÀäSä;·a6%Š•*m h6;P{4 ‡ı6ÙS'K\‰°³ÀġĤ)áġ2,ôfdİàSŸ€7Ë0'8yVVX’‹_g„šO1="p#6¨Ž[hnyşIêħÖ­QPêĴ(éĵ*ĊxˆÛ-îuĈGÊPBÎ@)@Ħ„S¤ĝĝrÎ×*Á•=ŝċòïlÉ>ğ>úÏàùaî^µ~·h^ 'ÙġoÜoƒ<ÀŸŭvA“]ÇáŽNi2×ħ×ß6şÍŭÔÖÒÄHîiPZ]5ê-’Ú0JêQĊÁˆĞċÁ$€o~ĉêŜ ;)ˆ‘3ž1úuŻ‹ş—Ċĥ*àçTInŞ˘”Ċ×VŠmĠĜMs$­˜‡•´ˆ6ĥHc~"bĊÈÉ6@µPĞ´ŽEÑI5G¨˘TJi’<ıšÂävß#>âëzĈ#ÄIì$ިˆ8ëg=óo•ĠzÊñÏ|Шŝц˙ġ3kùkŸ]·„nzċ0ñLuğ“Œċ˜ˆ¸×Ÿùĥu’P˜ {ÎQ‡€hı*jkĈCs…B+ £1ž^‡èJ)°›oSÔT <‘ğÎ]:ë˘ÒĜ)óħ=ĉr¤Qhl§ty`6‚ Îv/[ÂêzˆêO_IB2àĴgÜ@£z"O ž]ħ+&TÛѐĠ^Š)ʍZ#Žhaşbğ ĝŬˆ˜D MŜçŝéÜáİŒg‚wî?˙fŝö/ÜĜħUßî¨HŽÜĝÉ0˙àŠˆ“tŽ¤XÔmÜîĥs3ë%pİÂß^ïÑÜQÒşlÚJKD4ë=hŞ÷ zhÚıéŠyV@4ĈÜÖ@:?ä˘g£ƒ|ċ{¸Y¨_Éġ–)xy9§Ïmĉb}@ü˘â[&>‘&Y óF<˜ó0/"¨³ÇŠvx1šžÁSw| Ùn§ ĊXNÙUĊ)ï^ì71Ċ Ĝ ÁfPT·PÇA1RÁT[Áp.VY0dFŸbvĊ öêJ‡P8iŬÀ;⎪ĥÀ˘­,5ĝĝ0§wĉ_•7x żĝıíâ'ž_ÉŬĞ›ĥ%@ UżUëÄ0Œ“i3Óô_s|4yœRĦ'šäü{f°Ĉ8JA|„˜9ቐ§ĈIË)%°G„eÇ8ċ§½#Îc…)f¤ ğB+FpMWʀġ İ—Mî_eúıJcŒíb(%(½uÏS+uÜSëû°#šž{"<ê͜:ÚYÇْê­ï]Ên~u ûĈ|€aĈ=ñPĈƒqԛ,DR@`ŭVĠÍ@Ä8¨Ĉ1Ә‰°ä§#ëGžQ‰àr%(…ħí%)—Š*v¸UvU‘S,cĵê§9&òˆÁ‡Lİ0¤Qx€ŽŜ#°°ĵpI^b°f 'ĤŝR6\qôßüW~ëúcÏßÜ|q5÷_Ĝ0oÀ‰K·ùâ§,A+Ql&$îfKòIÊd ZQô‹0ĠMħ5ŻWOš?ŬŞׂ`˜)6%³âzP° ˆ§c1†• ÏŒGMÚ8Çʌ:Yö{Ä´°GĈQn L%v…şè8ëÙ_Ğk|ċĞÏ}÷+7GVDè$ `Ô(ÙİP,-ˆĴ³ÌnĈIZÈĵ‡`Ú ›Òž‚ŠFOĊˆ˙J„R§}\á b`Ŭ(Ŝ¨×% ¨€ĞeÀÔáħOħRá9ïpÚ3Ş=D1ğ@)ĥġÓ$GŸ9u`Ċ€ cÎ{ĈŸ]ÊÜ;r'C…^İäÊ+[Ċ£ÏóŜĞ[ĊĜÎĉ8•úeV­ħ xƒâ“*‰Lħ$^£Û> şÎ+%(b›Ŝħ=G0á˘0F°%‚Ëa³ ¨TħŒË"¸5ä8}ô(ì&€XuIşñ3͍í”NB€G RĴ0qıÜë! Vׂü<€ŸùĜJsslëÄ{ÄĦ‚ŸËŬÏ2­:ĉÇs‡G³Ĝ°+èD´ğ6wµÏ ҂Ç-0ŒŭpĜÀĈ™ C¤ÀÁ`È îp 2ì1Á§î„K\—&,1c™Cï ¤Ĝ­ğ½›!6MşZ ’‚ë-Ù:0k 4ı6P°=ÓÏ{%8ŠÙ :Ĉ;2ßË´Ħôçœ\ˈn<Ġs›ß.‚ŬzğxOÏŭìÀS6dĉ‹™ù€}+é} i]˜& ¸_Aoóšş1Pŭ eÄ ğĜ_ #`ÍV\Ĵ0¤èï÷ˆŬÇ$Ĝ– ĠôovÑi‹@Sş@]ژ÷G:˘y¨ċ(&ÖE!ÎxG+ŽĝñÜ˙ŸŒŠ×@ú'dŻŽ­lÀ½¸NÌËkùĈ)痞ÉĜ}lĜıÌÍ4¨ ¨¨R @uH@ğ?şO ŝâì§Fŭ· 1FAŽÀCa†q§È>ž#ˆûéqŻ5:V ŒS5Â+A°bó"ĠĜ~xÉg‰ñDĉ°”2ú÷ê}şĈ­êĵ_.z젟µLŸe¤ñó|cTáF%‡€_¸1˘ż´–û_Y·,ğÉĦbŞtÔğFûĜù3 s'…’êçÔÑġ1{€0äèŜ÷u×D%ŒEñ\x`Ĵ‹âí*àf!:ÂMİ'à ïp>cT! " ²(²´mn@t˜ğ}W  6= <Ġóx"w¸VI(ş!òEŸz~˜ğW­ħ]áp1™ûğGÙÏüÎÜcÙñ]ŬˆîŝY÷EíVêZŭ×ïżÈŬa[†aÜoîd›`Ĥ¸R*J¤+ĝäÊw|*(ÔO1Ğ>(^˘ĜаèĜU`KQPl-Š)u×÷X܈P·k>ÚBBġŭ;ĥIŽc̈ĝÑÌŸ;çñ4Ż?™ğÍoĦ´Ğċx^XÍ镍B½{f:.Fòŝù" 0ŽÎ+°×¤ŝ;§Ş€€D!I¤BäDXë{ìŠâÍ2àj ìhìW°^l2cİlú¸50tŒ%Ĉ鍂Ĉ@ÄğÙp¨0à(FžÉû|xÎÑO~iğĝŻmfkŸYcŝìúÈÖd÷[p/ĴĉOTK#d6“†a÷X 4 è$V@ ˘‚‚cP`ċ( ïÌžÈÖEñŬ˘ÂġJQĜ‚`\*n¨`„'3óž1E …g†Š Áu>˘Ï•5Ò3! >ÔÏü2~—Çë˙Ûͽ¸šç_Ĝ(ĴŒ}†ŽÔ"ċ 0î•è“XŠżġ9 ! 0’XW #Âr?ġ2`K@xğR”…`› AJÜ 1P˘gä"PĤIÂÚh¸=Zï÷s5‘8‡5GĜàŬ=>A=ħ~·¨ŝÀ‡^ZͳÏoĥ%pHlÏħV=᧗Á8—1ËÜ]¨SGf~G³AÇâ}ŝ½ŝf1†aœ4şâšġâïJ{ë1V€‘slázÊ32ÎĊcF!‚UÜĊ*vƒ ï!½Q‰Si&-û0ġÚqġ8ĠG8ċ˜Ŝß÷`˘Ŝ€ña™ûĈ7‹`Y÷À ˆbí„ 0îĞW`QĴ@]uSĴ:è (5 Ž%•Và1—zF Ü%Ċġ2`ì7Äù#°Ì1A àäMȎx[@0ÛXÈ)P¤L÷ŭÚiÏĉ××ÇżTjùahWÁ}"@n 0Žè“ Áşş`z‚sqK XŠx{ôYp­ÜĴn1°;Š ¸g<#P „*D0İÀ‡ġx›[ž0‘"gĈ‹ÓUĊïíòż}ÉËûXġÏmŽ,M^ kIjNr0Œ(ڂ Ĵ4î˙Ĉ•ĥ‚5:îÏ{Ĉ)ǸĉWĞ€M!lĊÍ2`‹ ëĦD‘Çĝ€ÓŽÑ' g‚’BE'• ğŜ÷0Ŝ€œ€„ ‚%ÇxO?ÙÌ··Ç_ùʸĵàĴù{è6œĤ§6·ù4 8v‚ ½LЍt…XC…ê΄]îgŒSžħ*WJ`TĊĝ€ŻŒ'xÜ3Ï=–DP%@êÑe 4É Ä Q¸(ĝİa+Dùħ~v}DŸĉ|iаUé=Í LSݎż[+`0Œûïè‚è΋RJ`QĝT2ĝ‘Œ°áSU(*ÁU‰|7Eħ„'sDŠÛ.•>ŒàOB k(ĝċ|eàh·RÑÏoôâİ~ï ·FÖZĝ^ € ŠG2g³i†q„@S 4 Uˆ[ĵD€g ĦOÀ’2–‚ ĈN7‚`[§¨pŜ3z› 8Ĉ‰)bZߢ÷<ˆxİS9)ŠGĝÈ œX{ˆ­?µ“}·w䟨Eï(0 ~y<aiüyĴ1nM}0N r\yYáş*Š\-ĥĦxĞ<“{œ÷ħŞ_Ĉ1m°’0*HpĉzK +ß7È€òÎÍpm˜˙ŝá7‹m;Ӌ9²ŭŬ=Ç Ĵ2ÓO/CñŝA§a™cÛÊa€X ÎmêÑÛ÷Ínbu 0Ž–v‚şŽ€K÷U—ëjƒ+ްì+ğ–ĈP”B¨D°À²cŒR áIĥnŻïżt€ħêŒ=ˆb%KµÎ{GOä^ŜŞÂıROÏŭĈ7‹`G)ží;†F0ƒUÇûӆ& 0Ž“H‹lQ€b~Bl84dFŸ Şħ_@Ħ‚Mv‚bKkž![ŝ"5,êû- ÔgŬLTÇ(<V˜ÏäŒ?­’·Y„cg÷Às=ç `fú/úPĵݟaċÀ<†aÇO´E5ĵàˆÄÀĠT$BŠR#6ƒb7(Ö<§û-MîİÔqżŜŻG 9NN…Aȉˆc:ë^ĞôS§™Ŝx­ `göˆÀ×ÇAŜĠwÛY yï@—Á5`†qĵD%#ëˆà9VŒ÷Ŭ˜%°ìÎx†aL1C`;(*&Œ‚"€KnúúÎwAÄÖ Œĝxĉüż´5›fĝħµnr¨ÔL!àħ^†Êz†aı’[ Ûú<êĠ u4 xàĊ€´~vİÑà0`AÏ|ĵV\€B×PVĵ]2>4È0…PŒ%È!¨’'Ħ)ĝSÊ>ËŝÊÚż³Sĵ½´YÇWòü76­­ĦÀ™‹Ü0 a@Ĵ@ ¨àXR˜EÇxG3Ŝ,€ \)%|c\á”cœM=3rѸ‡OOlo Š@À÷.ċ+93€(>=ÌóK[·8¸`Ç)†a˜$µ&QäÈèc˜* Y; ŒDBqÖ1ħħDf­‡›cż…ƒÚsİV; §À{zĠJ}ÇúıġÙù<ä ïàğpşb~Şmc†aÜé½żP˙ž%!àò†<™{|t)Ç™!€p-ĸ€?WĜA!‚B!‚RôPqܲOŽ }ŽBä”c|xûúzy­ŻÂjŝ CmĴâà'é^+—½žL†a^¤şħË (ÁKŒíżàKäñZ¸U–ğï½ïȏ¨ Ç„œĤ~<ÍÚ>à¸ Ï § ‘ċž) Ĵċúıġ‚>=̳K[ĊC—!à{Ĉk£ï(ŞĴĥ ¸[˘@:ÔŜ1]`†q[:SN8m °ÂÀ’(ĵg,9 €%` Œ-Š" XFĝ41‚@‘!jt܏àqİ"'` ŸZéċe.ˆ@?żYÇVzÙonŽ*p`àŬñşï–È0 0ö'ħ§€K=J¨C(žÈ†ŽñZp#F \Ż‚ Oˆ™ÌaX èAà6j‹€œc;a&„DîÜ,ċ fŭüúˆ>ħœÓ—ĥ‹‡féw`P€SÀFŸbÄeZ—‚4 0x!4y3@ħÍpŒıĵ3wX—ƒ`½ ¸RD…ËÜdıŻİ™@Ö²1wê è $%€ˆ‘-÷hK!ĠjŻlU<€?̙$ž‚ÊVӆaĈo@]ŞP8̌)–™€”ˆ·WƒbSŜİÀÓıƒHZ\’7RÔħ Şñ¸kLĝÔ°Ç+LX"ŝìŻĴ>ó°Ä| €â‹Ï{Ĉ™;Ĝˆ£ 0Œ‡ÍPÛ &ÂX€>)FBžĈ€JÀ†ŻħœÓıC1°8$‚”^ü½K9TġùkNĵö‰ċ<|iğŭˆŞŠÁw3Ï0 xp #ĥÎRGÁeköżĞçÎÜáIÏ %lÁ[•à;`$ġ?`œš µmŽp<nj…>ÇÀÀ,÷–ôÔ@·*yáKۅ|l÷@o | €Ğd†aÜùÊğ.ĠÛK}À1cà™ÜÍ2@\İ˘Ñ³ŒqdOç1€L`R(<ó‘xê’Ĉ`…ÄtEzï’˙eŸá—/mŒh°ïXŝVóŝ³=÷“ĝ&ĝwĉg&ô™ĉ:;5;ìµUÚ~ğĥ cÂÈ´Ueיšf”v˙­îVĜ5ól†ažşskó~ìÒ=Û Ä (3N9Ž*FİĞàFê –8){µîû´ñ´ÇcñžLĉqıy„Ġ½ğç˙ĊƒÙEpßàٞóĵ'cü…G½sg½c%ö×úÑ€aĈɽà#"h2ĵDħ’ #ڒRJŒí Ĝ @‘!'‚Kc@ßôŜżŸvÂs-‰p)ÔàĴwT‚~èf)׿^†ß6€—W=ğs‡ûMĥ4`†ñày@Nbä˙#ŜĦTĊĥA; ŒE‘1ĦGğU(hbtB =–ĴÎT Â3F l(>uĈÓwż]„?0sÀxyͳ{Ô;\8 Ĝwßg†a„ö½œ(mħË £èö/A‰ X+€ÓA£€ĦPšÍ¸S^ˆj:^pŜ1ÎxÇŻUá…'<_6wĝÍ"„ċ<(ŠOÎ 0Œ£1>ѝÏÄè30p„Óžq!ó2cÍ;T*¸\ 6ŞpTÉ+P“ìÙç"ŬĜȧq ˆq-ġúCÇ˙­bü ƒŭgÈáVñ†a†Qßızŭċ;1*ĝPßáµT`W› |§¨°OäAK¤¨Rv@—â}ŒY œq@żïħ%2ö€ŝ‹ġ}z˜Ó­“_2Ĝä„uŭß0 0+€O5ûAЁ‹Şàİ<šĞ׊€İ‚WŒó^áÓħJÜ÷GÀ—AĦÈ|ß ïE·?r½´Uôèw7Ç'ZĴ€l–ß0 ¸K"u~>ĊM˙RsJ?-ĥDq³RŒáĵŸÖ À$6`Ö°/@³d09‚ÁG–zË;äŠçĜÑŸĉ£/`OÀ͸w³À1–[ċ 0 c?Ĉˆ[żğFĠ@G„!ïÌŜĠϰĉF$XĊe…ĞUÀ(F”ŞİWÍ,w0HĠsf<âĉxĥïżĥ^é÷{¤Ïù¨4ĥ!Ġ}O´a†aìe rb ˜3c… çáÉÜ;¨*U‚ïŒ+l‰`W……âPeƒ›8&,Qì|;tŒ.ċx—§](~ô+ı?Éóğ?ÂìŬÛûĦDG"LP†a<œžNÍç2҉xÒ3Î{ĈŠ"à–_-A0EĦ„"Èŝ[Òwe(P*@Ô'àıÜáû—{ĠEÏ?ġ›Ċ‰ís·ċS5GµQ~oßïÙċOUïÓ@ 0Œ“,fö1ʄJOdD„oEĦ‚kÂŬéİ&€,€4ĥİï4 ıĝŒA…iAËÀS=ïŻùËk¸ġlĈü“k;zçx_|aĞĜe‡ gdWŞa†q× TK•ú֘ÎÌáBĈXbFPĊĠ2àF6‚ hÜc>&à ™b7^ŠGĝhß/?•ñÚ?ıĥ£?~ŞâÂà´°‰BèTĈé—Û”ğ|a†a'LQd¤DÈĦxĤçÑ£€×K`'Äġŭ• (\HÙŽ•b&=pżë˙;(–AÀx~ŻŽH˙żŬòO<ŝ@{êWċI †aĈ½4ZYò ˜cÂÎ{ĈıÌ!gFĦ‚o6‚@RµÀRżC—¤GĴSàS`â2=“{\Ìŭc=öĜĊOóŝ퀅ğ˙a†ñpyšžANñçӞÁ*ĵ]1 —+AĦŜß÷‹˘Ç˜T ß?ŝ˙ëˆpÖ3½]ÊĝBFċ³=÷{_‡ciNĥ1;jx†aĈ}6hq1Úg†áƒ ЎᠨTp-Ŝ,cKáħʀJdß[mʄI˘>½Úï=žùĝ…˘<Îóu é%İ'@Ό´˙b†a÷Ҁuuôˆµjéç÷ô3<‘98"Ü Š+•àJ%)0J4ß;c‚a™ ËDx"sĊ_?Ŭ×<ûG0£Zà ¨'ï8ğͽo†ñà.ç¸ÊÀ£ŜáTòĴ‡ĜB¸Y.¸.kĜ̀Œ Ċî?<ìċÏċ>>Ì?sçíuOù ƒVEsRN‚‘=ŞfE†aĈñÁ1Ħ 'E…X)°‚Çö¨ÄX7+àğ,è;ĈPtb´RáĥĞHPĈ„mQ|¸ïQ’ŝËó@ë?_›-ƒy¤ħÊ7ûi†a3/#ó,çġ˜¨'ĵ+waD‚ëFQĦP@E4ĥt^txz)áœwxŒ*Çdü÷íxa5ÏüŸ ìXş“Ġġq_a›À0 ÁÒ!rJ‘ŭÌ8ï H lWŠ+*Xu‚³Ž1PPôéb•ÚŠ]ŜÛ÷PÖQü _û룛'Ġ°)ÎùÎ_jûí†aĈŭ KñŒXw‰ÏdŒe&nVoU‚‘IÀ./À~í˜' GŒCèáQvŭӞ''ĵ÷ÇOġŬq˜›} ‰" Klv 0ŒçhCiÀXvħ‹àSıÇ£Ž Ŝ.Ŝ(´PjܐC7…ާßYÊKfŝ™_¸5 'Ġ@rܳ 0Œ;7lÜZĊx0 ÂÏXr ĤĜ9í2à­RPi´Ħä&û|oNâ#'`É1LÙzîżşÖ˙ʉ)àŜÔÊ †a4pžbf@(–˙%àıÜáɌálŞâ­˘Â­*Ĥ†´P2ÒŬ§:9)ËžÉ}~1÷ï€ÏĴŬß­€ŭoÀlŽ0 ä ÇÓj}Ë·qq…ı!ÀkeÀXÛ˘PÌo´J Ob`Ċ}Ï ĞŝÚİ~vŭŝnì˒³Ôġ–íB2 0N–`’£ŸJöÀ³ıÇĊÜc™%7*ÁÛe@•Ş–Ş(:¸=†ĜĥXuŒ5GŝŭL?³Ö˙û'ÊÀĵÊĦó˙+ğ. 0Œûdô\òxN3Xĉ#Âĥ*ŜŞbπq2t%ô@6oJ`+LĝŜœN{ü]x~%çû9wŒG;È÷éµwü9­<€aĈçRÍ~Šq93N9ĈıÌáÇ,·ë•âġ" „b7ŠaP½ŭà‹yg3Ż/­äúêf!Ça^ö~2Ĵ³ÜĦO^:†a<¸"À§}y—šúžq„'ò ËJP\ĞŻ#*Ċ¤>Àa·ê„~dıGç/.ç?ŭÂ0÷÷{Nnğ*šŭú@v4€aĈƒ+ê}ù:+ G1‘´P"v ĵ••J¨hĉš!.œEïd`Ĉ?}eШ>1Ìé~ÍÇíŸÌ€gP úŽ­œa†qbOfw… ÏdŒ<=~=DOÀ–…D! ŞGÓ6˜b“ıdz=ÎŬ“_Ú*ô~|ŝ;{2L'àİÜwŞĦ{µ™ÁÌ 2_½a†q0£—j}}Ž[Ú=&<×ϰB…âjpı¨P(tÀ~˜* LÚ/Ñ˙ÏŜûÇH–ey}ßsߋ—YUYÙMÏìLïìüd×°°°l ìÎ6­RĞ5²‘°eH^d­m°…ħd,Ëżd~l ³Â€ħldÉÂ+­0Z­[ċ˘T´×Ĵä]²fÇËÎŻîééİİİʌ̌|qï9ŝñ"òEċˆ‘‘™ßÏL޳2#߯xñç×=ĝ}woáwöŜùÑŭì³Żm1°”³/ÊÒŝˆûĵ!„\# çċğìâr½}çB O‚˘bĞàs³Ñê€uœŜÌ ¤*š9ĵ” n;‡33|ÇœuÔ)á_ö-Ġ^ΜüÎÛ=½wXĵğ;ÚX;+ƒĊÊnıÍ,ğ|’N!dÛQÄ<ĝ^†d1%˙Ħ7(íb`YĞ§zUñáoĜËÏ{î_=t¸ü@tŭñı5Œ :!„]G‹óPqŜÇráo8ĠÉ(€Ş˜ĝ^˘p× Ż·÷ħÌŭ§?{<8ğTàġâwĠ_ÉGçìöK!ä˘ġñ½½Şë_ObӞ;eÀŻ£ĉ@Yy_uÍ+Ş–ûߓ >SdĝüAñ?\Şà€ß xA!äú ˙„ ƒÒ?¸—–Äi~C3œUĞlíî€ĥß=ĵZäĜ~>·ğqÁËn¨PÀ^Ír„9VCü„Bş0ĦeâÁ  0|ĵ—Ħ݊jĝÊıÇ-×g(M Miâ²ùöÜ95ôĝtîÏì…°GÇtyŽK`˜7 0]83† !„\ŭH@.1 PHLĵš;ĵ\8dxúœhôŝ‡ĥZàB/ĖÄıżĦÈŬAĥıó#„BÈ ħ̝‹ƒŞ‚Àğ w3Á†§C“JôK{ŝġ(À²dN!Î"ĝhîä×Ŝxi˙wżùÒ~ïR ·da—Ӂ B!mġÌŞÁˆµÍb‹` v|ƒJV†0¨aíZİúíä~Ó^†W3÷gŜz1^NÀbc½Díì*l!Âċ„BÚ鍓ÈD "ȸ-À] ,öxêŞ/Àt|Ù%qŸ=ì9Á§‹‡9~4;üí{oE—çvµŬyB!dKĈÀ2|ĥÈñrĠàE÷HŜXħ;à„ÑQŭ× —á÷KƒûGeıUÀU'½¨ŞPŜ@!„´ÑÁ^%€ĉ[.ö87·‡G!vvfN"şŝ³û9>™çKû€nÇÒĉ\i@!d[ž˙È@L8?P䣆uJÄħÁŜb-@X3gŜĞŠ3Îá÷óÓğ“ŭŭ7Š^—ç5—|êĠ‚Ë ˆYÒ@!„lÑ €”ˆ˙Xĉp']†ĜĜlT/·N µ$îI\†ĝÉ"żŭ™ŜŜïıß/‡oŜ-\W紜ƒŜ7!„›g ¸Ê '(8ÈÛĊ™Ġ¨`ż„/ÚߞÜ`ż‡á½ÂŜ:.uóhÍt s¸íÜNĵ„BÈ6µĤ'Qü³j6ÀKĠ¨àSWĞÌĈ°F¨Šk~ßí½^!?r§ĝôkеnġG÷ §À>ŸrvWâ˜B½&BY•”˙˙XîÔ;< ŠçAq˘wTíƒ1²šÓñ 2öaȜàċÌaßü·à²Z ĦsçYäĠĞE˘„BÈMŠ8 çàĞô çP8‡^U÷Ôë¨0À:é Áàœ]üĜÁžJ^>8*ÏğˆhÌ5œĊ#ž7ž—Ŝ4!„›dd"¸ċûĵš;ÜÍς˘Ż:}5À:¨›‹ ûQ‡ċP€ïŭŜïŬğwgùbÀö˘ğŬÈûB!—âùO è(—nÀŻËb] ĠĈZ€ÇzÑóuÈ;š;düĦŝ8wKO÷]Âpí½û˜ë`Ž€BÈġG\\£żçâàžW²˘˙@ gĜ8͞QĴ?$È!Fâ ~ë~ݏ ÷?½uĵ|gÀö€Ĉƒ3ù !„zD Іö8ïe¸“ ‚33œ™ €Ĥ!tÚbġïÓİV!|r/ǏŜÊŝëKhghzq{ñç¤=B!7& PuÜĞ˘‡™ÇÁ­2 ´ñ˜àU:6ÍÈĝÁ½Ïċĵ—eżkÙ4€kû˘ÔXĊqŬ=!„ïù_ÊĞï p˜E­<Ğz(bM€Á–_Ż×hqDµWŻdnïĥàß?*ŬG– WìLTBı”(€Š(̀'Ĥ8Ż–6µ^ĠĝÈDs‚ĜËñıŭŜÊÛiŭò”B!¤FZŸŝ{˜9|¤—ĦA€ï  ³ÓşÂŝ2X,rĉÊ7利iñUôÄWó¸ !„\ħ€Äİ}ıÄ4@ÊÓ'­?ӘHŭş™´àıËsçüżpċŻŬ-Z)v+@ Ŭä,.·ċż#„r3p βT^9ĵ’;|˘£ûġ2`€šŒ´uĠŭ9Ä<j‘ğO÷ÜŬ?ñêGíÌeé\žE cÜb 3!„5œċĉ ='êuç!Ğ e}YÍĞ}À÷=ûİÇêÏ>ĝU޽opo—GéĠCîd‚Cw}Ùó&„²¤1P˙Ê%ŜÍQú8!0}Ĥ#ËΨŜu‚OöœĵZäúğïd˙üÜ-zËlk&÷Êá½Â Pà7ïċ­öşXu„BHRÀ!dcE(K @. Z…ĴòŝsîĈhƒŜ1†˘[sqđgB!¤Y*Ğy9™Äü|Râ5œUiƒ!À.´^ÇaÍĝ·{yžğ/>ì—'Ŭĵ’ç B! B:j \µëÍĝhîR&( ĝ8Ìî¨+îϸUġ¸-né^Œ…Í&„Bĉ‘WÛĞÚ'ħ5<ŠqE€êjŝ˙´x÷$ĥ ŝx/+… ŻŬ.ŝ{wŠ˘; ƒP…v”>Ħ%B!d÷˘I£êŭs>–;ä|8 è[t¨Ġb-€ ³ġ×dNFûï‰àsy6|ıç²ŭÜġş1–Pŝy… ÚáĊĤ@!d'‘ĜĜ p(@á ÄfU ĞüżÁ`ëÂxB`—î—?˙3/'nĠ!„r˘iDpr|_vħQ°š "Tż³hĴ](Ñûw~Ç­E µ^JÏZ6-°Ì6ż„B6m…Ä‚@ĝx/COßĈB@³´"@:Y `°Ñ>y+ż÷nñsôŝ !„v¤Ù°ïöĞċN€çAáĞÀ°Ái^Ċ ÈS…w aßM À*€èiBıéĠp ñĞŻÀÀâp u½ŝéˆCâ‡÷òâĠ"˙]ŻŬ-Š×š×ïµ7èŝB!­=j'“?{)|¤çôœİAD*ï?t°DNŞ€=‰)…ŭ(û?ĝ°_ÚZ!„B–3 WĠìIl˙{ğ*< :Š”7u\6ŠžW#ˆàüĤŭž†_nk°´Bi9B!‹çŭXèÛ? µĜh–°lÔˆ)‡[YÛçnİżmŭJġ÷ĝtîPÔ 6IÎŝ„B×?i=ÄċyN€='¸ċŝşà[Gi'qäçŠÌ}Ô9ĵv'˙ßhè ˜/ÚĜ½bÀ= èŬrĥ&„B–aÀq„¸ Ü û”&ï²w'@f‚L€=^)ž óáA†“ċ#ĤÀižÚI>W)BÙt@\,ÌbTû3yı¨áD %ގ€°ÎÚċ''=WNopĥè8X/Û ûB!׍ÌĊBÀi'ÔWÒüì6ŠÛ4ˆé†ïée8÷ó˙˳Sż²  8Ü8!„Bĉ‹sj lÑ˜`EÌù?:òü Ŭ4'£%ˆŸÌŬLÍn§ċ ¸ž?Cê„BÈE ‚ĴêùŸĝDîà‡IÑ7[. ÈŞAD À N>·ĝsŻ·–2œ˘!s@!„"•W~;s#‘ħ?€ZwŽ´Tф—3‡ş½— ˝éGó „Bš…65ëı[5N,†C–î čf¨a˙nžŭ䃣òly Ġ%d|# !„eD˜ äfû[CJ˙ğ 8Ò Ïc*.ö4ž‡ÉĠ[1ÈÈ!„2֙\0* › akä˙§Wdf£îƒŸí9ˆ[ŜÈ]µžp‰:³Í ´1B(ĉ„Bv †@O9€ÛÎAÔPގ&ù³n:VꟉà@€—3wú#w‹_úüA‘·ÖӘK GM!„Ĵëĵ&Żĵçw³ĜY÷ƒ`SÎsšW@²?rwóejµIï?˜]İ?{BÙ¤ĉMgi>@-:à+Ám=wżíV‡‚³ŭÌIk}ôŠĵTĴÑSgZĜĊɨßÛ8ߐLž€.yÂğÈĵ‹Ë?!„M!ó˙"ħ@Y‰qZrŻ6^5׉–Z\f…a…—öbĦ  äâJîĜ€BY3`UŬ̀Z͙s.ÖT?3µNRßfıÀîċÌŬĥÓñ zĊ„BÈúÔ ÍëĞìúAcˆŜ& †µ#"£‡w2A_·ŠŜġĴĞcħ !„Ġ$‹zR{ŜžäR5ìA&ŬµNGJÄ݃>h ­ì~B ċŭF!dWŞPžwĞŞúOF@0Cë\ˢ!`è9Aa •R¸ë'Ş"ÂɅ„BĥŽilÍ#Ğó=˘AP VĦ/ŬF³S#  ‚ïÍ3üş½)€ÜĊŻKµ”6ġPü !„léUt2ĠKG5Bƒ™!ŻĠtUW™È8‹úwĉ… –Ì VB!d G­ša?sÈ TĤ‚·ħÑĊê;WEz§ĠŠú·/ÜA=wˆ!|B!äÊElÜR_ ȓ˘àǁAëMœ÷Zl<ôİ"ƒƒ³ı€7ä0<‡‹ĤJ›`À.Ġ °BÈÎ9ħU T-=bZşhxCôÖħz*|Z˙zNà[{Tëŭ¸TžxŸâ;­cñĴr‘֍B!;#ŝ&]Xôĝ ç0ĴÑóŽYĊ¸İpjm5²ú à½8(ßïâN!äŞQ/L}BĠx :š³£­EşÑQE€7…˘M€)%Ü^°!„ĞpµċuR 2‹}öĞÀ ĥö~.V‚ŽŸK^…˙ż·—ñ#„BÖôÌM¸_35Šżt£ŠtdxTxmaè5÷¸•ÑB![Ôƒfƒêw‡RĠ nÍŭ4f†skıÂÀħŻ!„ÒE€X "£6Àİ@ĉ¤³>ÀxÊà^.PĠv=dB!¤Ĵ6íoh†Ü9ä•@çR íİR]ÄçU„á·óVE€L˙B!KÓè@›ŽŠüòjUVßĈK­ĦÎ:­ĈŸŞĥ4.âÂKpY !„ë€@Fġgġċ~·œL4À“†nxmµPŝí¤Şġş B!d†ĝe0”U>>Żĵô¤û›hpĞ'mk!„²<Ó"Ğôk ²%˘Ç_pÖYĞ}ú>Í”mjîßpĥеA!„I¤Zú—ZóĤyŜ€½ZÎżİàŞ:›†)b Àó ­jŜQà !„ġ1XĠèÇÛ¸p^uéK‚dÍYÓÑ­gjí 5àS½ ·DZ‡!„2‘İÀŻZ“ŸU €rq(ĤDÙu¤ħi;NŞ„jŞo+ÀU}z.N„sÛıP„BÈUü‡:ċÓ(` VÀÉ|!_ċ8ÄɨżÀaĉZvTEnnâ\G˘ĊB!„\EuÌÁb ÀFÚXïeĝ,ċ:j6t,.mçîd2ZB°-qĤ@!äşEĴ&îÁPcO3›èın€´_pnvî2÷/ÏĠY§Ŭxó„BÈM¤|êŝg0 Ͱ'‚ÂıQ[`× ³ƒ¨Ä/|5ÜuWġ‚ş%,.B!dW˘)˘î-ö¨{ûIü]ÇûLd<3…†5ÛÊ÷SÈ !„\7Ħż c2ʓ–íË82Ğ&ĉkb}ĤĝgŠhQ°/—sñX@!äŞÒ¤aĤ1䟖–5aÎQ›Ĝħ&ĤŭİĊèŜpğ›İ³Œ.BÙĤÎhMŒS˙˙} ·e<x“NpÚw_Ŝs B!ۉÀFáx_ûy‘Š˙Ò2@é>ôŞUİİ8Ap-ÎĦĠ‘èŽ\`B!dÉTŭŸš˙œV̀znÜŝ7k\·ĉƒ²Ê¨xƒ€Ŝ™„żżhğ/·1è1BÑĈ IDAT!st²ĥPĞc/;ÊlO,ΐn56sħ—Gìèü½£­FàŜa‘~ŝi`ñtÂĞĉ‰ğkv>„BvÛû‡`4ÈÉ8Ì'“I#Á´sM ˙İéP:B·Ö ]QĦgĂBÈ6µÇÔF£€ŻZóö̐#ÊDàd3ĠùħÖàyPx]°¸%‚OöòX¨0#!Â—ċµwbĦÑ@ „ÒħLšĦ´XùŸšĠ—˙éšÚçħÇ@?(TZnÛUVÎÍld"7!„+gĜĜލÄx?éĴÄ^ŭi%ÀşŻ6ıž›ZŠä‹Ä?Ç䔢Ü1CN!„ÌÓN­ °ĠÚ †Àž…Y5ÇMĠŬŻÛĜĠŒ€“`8ó&ûù73W4n7 jÒú|… Bı)˙”‡Z/^ĊdÊÜa<İ/wîÂßv 05œ¨áyP J˙QĠù³d½ݟ!„rSĦÙhŭ˙°*üKKŝr‰E€j‹ġtéŭ× r‡çb ^ĦVÀ4"!„\%ï? °ŻyùiÀždˆ£€ ²Q­3Ê*Q€jîE%߆ì:ÁˆBı)Ô½˙¤İ°€Ħç܅{ÓxĠj1}˙ÄkȁŝS˙µVÛυo!„²Hx›Böj CŭT— óŠ4¨CuçܨèHO8ġż•Èú*E€Ž†!„+‚›ĞUxŞÀ-'£ċġ¨"›c #çfxLKÓğs €eÄwSMs˜2 „r•15Èhò_€Z bç?4[Ġ ¸0¨Ş/8†Ç^{ŽJy³j÷߸\ş˙=³ 04@!d·˜ċ b `EŒ†KU§ê˙šQ°sŬT€è—žŞÂk|Ċmq6Ó¸T†{‡…AĦĴ'„B8­ bìkżK✉@$zŭAOhèŝ×I `>öŠÓ*²^ĥڇK-eĦĠ!lL!„€‘÷ C³‰Z¸ ‡˙TĊ°ġĊżqŝ€ĊhúİĊ.€É T6öS>š;'„BZbUÑ_Zŝ—VäôjNulÔMbڐÊ0öœœĵĝĈaÑğT[ àNŞX´ËŸ”ç€Ĉ| !„²ŜġßTùŸò˙@,ÊK˙z""s°Ó~‡jšÉ~žçı8­³àĠ"݆8¸ŬèÈÇh!„]ĦÉûöġï+ñOı˙ħÄŠ :´é˜ŜÛŭò/5ŭ=fB!d]$ĉŜK›Ĵ H˘ŸÖŝw]ü7½ A €)üĠY†Î::pG£†BHǢ‹ÊÛêäàŸúJݵŝíÊóŸċ¨Ԁ|À‘ôŭÂKû½é×]HÜ;, ?\mĠuq0ğô†Ñ „Òµ–˜ĊŠq`È;éĤîùŒm­ OGR àħWôƒ˘Ż8-ì˘òÍŞ|‹ !„v˘›µ:€éÜ?ˆëĥ¸nZևjpœw‡AK…ûı“ò‹³Îcñtğ>³n8²À%„„BşÄ#VŜ;Lï~Şŝ˙°NĈŝ.â<Ž‚âıBĴ¤…qÍâg‹üÂzĊM’oX´GBéÀIUĦêü§Ġş˙ôû\Ĉ_ısunGےŝ?Uoĝ[+;”˜_8u,¨]\zù„B6­Mi韷qóŸşY5ŭoV1{—Z•ö}f‚o ñßüÍğ…´uĥĦ ™C‡;y¸¸|Bı‰4ċŝÍlBĝëŜŻ ŭ 6Û÷´_S”&8RĊ3ŻCtż_ž·v”ĤĈoê/„Bn¸0áuW˙M•÷iÍżĞù#^ßíċê˙À2ç1\êZ9†ï !„ì"ġÎĦjûë§~ç*ïż¨r˙ÓŜĦmĝw¨†˙|³ (UñwŽŭ×WÓZç.ìaĉ$@F!„ÜñŸŬT 6wW­ûŸûzÑ4Í ( 81ŻZ:ç×rĥóì’"ĥ'˜Ê „²Žĝ{U Ğĉ?ieÙhҟŒ=ŝĴA\ÇǓĈ˙3ˆž-ê_yónħ·’àùi\ H!dU Œ½˙Th-™ïU]˙şlû;‹ 1 qĤ†Ż ı`˙­òO!.â[-°…D!„\7ï?¨Zî†ÚĜßÔî7-şĞ{˙]…ŝÍ݈Ħ Σ÷ç>â­Ò–5 @gÁíÑŜV螆 !„&RĞßö-ûCĠë_Ĉ˙ŜD×?×p<Éy§ èUŜ[e[pѰ9ĵİbêĞ!„Ì׳dÔ˙¤†?{"èMy˙›ÂU#ˆ‡fĝŽ{§ îażüÔJÀ['e@†ż·‹_˜·'„rY€ĊúħÒĈi'µ~˙U s²1ç·)14A?(ž !ŜÚïÙuy ïà ÷O!dZçR˜ŭĵ6ö7¸ŞúÏj…n š˘U$˘TĊ³ xĉ=TñèZœ@!„ÜhñŻ<~8rW@Ĉıŝ˘ ˙gn{˘é-†˙|½ 85@ ÷ß8(ZÙs;:>–ğµ,˜ ›.tÒmá"!„ĞGœô×´ä/Cĥa}š^ûS xïµTÓçNÊï´Ŭ^³P÷ô2x·2™i)°bžBÈuġŝqËßz™ĵĉñ÷ăÀÉfC˙ġ„jħ Ħ™âۀçA‹·ŽÊ/ğ½‹?ôWWèiBéJG<Ĉkï§£İ/Ż ·cJŽúıJï ]^ŭZŻpg'×ĠZ÷=˙„B’¨"¤˘żÚÏ3‘Ñ—·q}œŝëà‰W< :pp˙ŭ‡Ċ­eĥÙzJĦ™;CWŽƒBÈ5÷ŝkC~ÒÀ‘ ÁWĦ˙=ë5ŽËŞ”ÄıYŬ?5}éÄkÙî9äC!d†@ŬzçżäŭȌQż›ŒÄ „ħ÷˙‰QúR s?ó3/ġ €ö–¸PÊÌ;!„ëáŭ§{@lúSÏŭ§°?`èmÁ!U\œ#–"~kpTA_rnù¸ü޽ALBÙ´èÖĊÚûßVĠ?Ä_x\À(ü˙ _ŝġUĥ}% ·Á7™ħ BĦàĵëJ“×_˙]Ï 2Ĝ…˙6 ä‡jŞáC5<ñ oĝĊN´ġŜaAךBȵ'—‹B˜ÖùÍ g¸Jüs=ìMċŭ·ċH5ÛÀ€o•}Uxà_ Xİro:°wï°ĝ“öy‹Bı.¸b]o“Öŭ3˜\•rúÙFÑßôħħżgj8 ŠÇ^Ëg^‹GŭòDÒ~0êH!„\@Ĉüĵ]ĜPy˙Óŭ`rúÉ/Aü¨ÊC3œ¨á›0üÒ`ĝ‡ŭR։Üsĝ!„këñ×)mlLGÌbĠżUŝo0ĞšüŒÓ½Ú‚·ċj,JüÎ0àžysÀ7Ò~öà¨\ı}ŬÜ"@Ċ!„r•=ŝĈ0·]W_‹˜Yñ[MûëA&zlËs/K4ÄQÄï”Î4? úîşUü3ûÀÏÎ-}°›@D£EB!¤Iè›&ôÖĊ55úњŜfçŭ·Íı <óŠÇ İş‡ŭòßì2ÂW­‹Ëp9ôœà–ܚ³îŜĥ$ÊFñ'„ÒV0Yé_7 &–ŭİÂĞŝ§ŝ¤Àĵ}lûOQ‰wK£Ħ˙ 4ü'÷‹;ëîbÀ-€™Žċ„BvĜhùğ9%rħ۟`8§ÙÏeĴ÷Ż‹˙ıĈÂżŞóß@ġíGÇċŸÛ„Á46f!„²Ğ^˙<’÷ŻB•÷šMˆ˙xÈ.UüÓñ–œ•s'êċ͗ö{]ìkç:ĉ²ù‹+L'Bȵ!—jrŸÍ֐zxż.ŝħêßFžC!@îÜtúĞ#f(Uñ^éñŜPíù‡ûŭòç7j<kZYëàçh³Œ†0Bı‰h%ĝiHN ñç2_ü“çŸŭXµäÏ`ÑëŻÂŝğ"ŝCU˙}ŝżs'C/÷ûeñĉŬ˘³y½ù˘Ä"lNuŝ&–*Ĝĵ€Bn˘;Œ›ĝR ğÍÏó§î~iĦšò7´Ée}ùŒœ˙65gb! çjxżôĝ0ĜéQçÖq6j,wijÍ'ì%@!¤ħÒ)ŻÜµO,÷3\ Wċŭ§ĊßavûàMâ+ĤNpüí·ŽË;]ïgÚ°‘*BBÙ&„réDï|2VëKŝtjÊ€Q?ƒÍ ûğKÈ:‹]˙Ŝ*ž˜UŬô…ğû·6aT¸ß/Ïî˙Ŭ.nÁż !„\_´ï\bE|!íu`şÏ˙ÄR?Ĝ¨èŻIüó*‚ím‹ç‰Ĝ—àXc À{Cç^{?{<ĝ‹›ĜçĴ+í!„ìŒóDño%ĤÖ ŝ•_Ğ•ĝğ9žŞ3È·”ĈNÇŞ~˙'>àkCĊ·½éóÒ˙7ÛĵĈKĴoúBBı^úŻ“ċÂ˙V­ó‡~ž&ûġ Ä?ÒŝÊ-ÇÂ=bŸÇ^ñĠóĦ}cP:5÷7_ë°òż•°ĞBë°~ °!„ì,…`b ß2V5EÒë2ÑßżIĝ“×_l!ž´ĥĴšŝ ĝzx¨òÖq)ûï<ê°òżNó2@>ŜËÖÚUr'9“„r#IyŝĥžĞ›ÑTô—ÂŝZ­ó0ê!³Wİ|]ĝg‰ò6ó˙Á §Şĝö0à‰×ás‹Ëŝî÷ËóM:ԓo€Ċ/à“ETÁĊœBÈ*Z‘„{Ż[ĨqpNjö“ĥŸÁ°WóúgEĉŭ|SŜP™žzĊ;0|¨˙÷£òcŻn6ħ°@&ЏA\xbQSB!W°/1ä]ĥ~7ċġ×çu# žÂȅŝ@óŝÔĥ_ϖ:ŝ¨á—φĝ•Ò÷ôż}ónáŜ:*7z8k5ŞçÒuÎ .{Q¸ÔB7í…ZĴ’ÈOWûĞ)SM~ĵŝ]Ҙó´ĉß+Ŝ÷jê‹ÇċßŬÖ{0ÁŝŒ4ûòBYU|ÚùıâŒûú'ñ5ñOŭê…~…Lûí‚÷?4ó ĝê`ˆ£ Ş‚ïŜaħ·hŒÜžş86Cèı$BH[Áo›ŜusĵÔĤ°ż™Äß*áOKüRçÀ|Áĵ€m1úħê˙WνLż¨ĵżÍ÷äâ§.Tĥâ²ıUÂ,›.4.$„­ ]ŭı-+ügéùâ?ĴŠŭ€N&×÷·Ş/Ĝr@ÛP…ŝK_>BĦôÁĊf +1ŬĊÌ™^H!¤ñŻ‹nêŞ·Œ ıİíBŭ˜˙8Ô7ĥôM9˙úß/š˜êÎJÛ^mÀ™Ž¨âĞ>è³ §…Ë*Ž˙ı"ÀŠâ>P—m€ ;4 ĝ2`JƒBĉ?#ëÂżLeż›#üÉÉЇùë€Ô–W\ŝ\Xè7/T„¨¸>H×ğŭĞá+çŭ e ÷™ß~òÁŬ·ûeyïċ• ġ›°…(›BÈ ÁXá‘;Ĝ¸sĴ „Ŭö ç ÚIÂUÀ VE|Mƒ‹÷\ƒ`͊,ÌÒĴiÑïRÛò݈B}ıbİŠ“×üu0Ä3 ġ€‡ŭòR%vt=V4‹ŒˆàNÛkË ĵId‰£„²ú³ÒÉjÛiòöÍlÔ6Ŝj˙53 òüµÁów bU÷ú›4İq&]4&´ëç19Ó n”Ş85àX żxRâĉ˙ p~Ŝ˙ü˘•¤p;(Ħ–ĝĴXÀâ>BYOè[‰H%Œ£•[µgĥ¤1½µ|?0)ŝÓĊ¨ĜpÇŻ3ĵ~,0,Öezİcŭ\ ‚zîñnéíı*•˙î΀Ó7DĜSù²‘Zħ!„%…Z.~­"ùÔ×ôï3‘˜²Máŝäę!˜Bŝ)ßß$ŝġ<.͵uQŸċù×·· gPma8Sq0|½ ĝZİ82À+ŝ뗴䯕ñĥje$=lBÙQÏn^ŝÈ9Ğó“Sbµ&ŝġ ~~Îä½TŬżh‰Úĵj˙äùç2ÎŭwúÏ%.ùŒèI2fÎĠ0PĊw|À/œz<–8UüKúċ?Ĝ)£pú‚:׉˜ĞíŜ‚F !ä&Wîf…Ŭ87ŠÌĤċ|AĝC­ĞŸÚ|áNÂşĝ'áOıyoŬ\ µÙŬ Ó>JNCÌŭ˙ÊÀé+÷wí~ıèêĈÙÀ:Kë €Ó !W|K-këΒ›òòSġ~ ë ĈëòëÏċ$ĝ&_}Ż-½ŝşÁQo <ŭ×^zÚVWC~<‹˙P 3ĵ¨Öûż_úAß°˙à¸ü?vòŞë뺨à4@BĊŝr½ô³z8_*ŻÑàždh­ÂżÉcŸUàWo ÔÖëŻ{úiĦ·Ùç·ìġ÷6;*Q?żs‹ŝ|³Ħ>SŬpTîlñZŭœÀpWÔDĜ€²ó(Ú͟ß6nĈ÷Ó–ˆÄe× FÀ˘óN!?ċOï3ŸQĠß$ŝ­ĵ~Ló÷ûx³Œ°úLÒ/‚áyPĵs>ÄQPw˙¸”× wÙëŭç÷ ıTú{ĊPĉë~:~dK­€ !7‡eĵC'WïÜêáüĤ%p™Ht*ÁMì–xÖ*U½Ô'ŭ.oÒúñˆÈèû°dÈż>ÊwSu^³ĤŽÄÀ@gjĝú0à˙9)ñÌ{}Ħò=÷Š[úċÙUˆĴä•_µp:kıŝ‚íäf]“şÎşfġ{V+ܓĝÙM0ğ\ŭżZĞôOҜjpS‘…&ñ÷ DYŒœN'™?28…ŭ½ÇÁpl†_ q4T €˙úçOΟíú½³ž°1eW?B79{K?˙\‹×ɔÀÖî*џeHÌ# u˜*›Ê|*Ò0KClŞĜO[xòIœ6ĵÚÁµÖ–†dŞ58SıŜ÷ŠŸïŸI8 ĝIçgŻÄg1BĊúrœ–uœz•ĵÔĤäĠ7ŭóe ‹ş [­‹ĤÄ2 e“èÏ*ê0!ŝm„żîŭ§âĵòŭZğżç°“ĝŸĞáXcÎ˙˃!ž›ž !wĝ .iĵïÚ€NYy„ë/FNnö5ҖŻğĴˆd½—T^súùLĦoş—9ŝzxßĞνv9jSŝŽG§ kH´yêM}şŝ$ú‹ ŠŝÎÔ0ŠïzĊ/œñ^éQB˙ŭ‡Gċ߸R}ŭÊç8Èc3 ÏùN5óá*riRU´Ċ9~ş7~6 ì£Jú9mÔWiožP‘É:í†PŝŞ÷júzŝY×MD›ÁĠÏsޞ Ŝƒeòoˆ0,}io(´9עêòü‹˘[uÏżgfĝR9ÄĦ÷§AóRÜßùüŬ½}\^™žsùÄ c€À­j ËŬzÚ,ZÀ.d)(Ĝ ö:"·îöÚ ĥˆ,^µ4§nŜ1v}î:CĴGáŝZ4ĜbïfDê۳ݚ´ ùO·íÒ!Ŭ—8¨'EËë40à´ ŭq0Äğ?ìz÷ûĵ~PôġË+%Eù2á2^ !W ĉ·7'À›°ğÜg×ÛÛÄ9w6xûMżĞ·ĝ͖ˆXԋ—iêS÷țûĴûOuÉ8oc¤—œŞb ÀÁ+ƒ!|6´g†Ŝŭ€‡ŭrxĠ>Çù˘Ċž“Ö$óŝıŝŸĴê)òÖıtïşíç¸>7~Ûτ6i½"ŒS×$ÎRy÷­=ŝ–Â_˙ÌĤÎ~]úM§fŬ :%ŝçĠdż5üÂY‰gAñÄĞ<Œžö°_†+éôLœ¸ğèíÂÍn7jê1=}žQŽ…t×òuË,5Ħ`_-aOCa~ĉÚäğ—ĝŒ_Ĉyğ+üY÷ïĴֈg}ԟİa żI ğòĝ' ĵëúg‰İŠ~0<öŠo–ïĵ>Su•ĝß~Ĝ/OŻêócòÙĴîÂgùşyß&Ğ*Zç­û̍uó`nûêzâmĥ+{ânCâNÚ ˙ôÏ\CT-ħ½ékġ‚ġm/2.Rn?…ŭĠş˙˘Ê÷ç-ÄżÎÀRèxĦ†t:Ä7J?< Ú{Ċ˙*‹?Ú8gMŜ·ĥ°ìvM<Ó )7py#sÛWW°—âĥ÷öMÌwSü/OËĴ~˜—:˜öŝŬ ˜ċíğ†ex]œrR6ßa™^ħêUÎ˙WˀrVâ[eè=è—òÚŬB—ƒ+Ż Qċ—{XL[Ž›{İúUg7àCKÏz;b½ ˘Ŭuċı[2ZGÑĉgaUáUJÇV ġ'Ǥko?ûh‚Ÿ,W;nµqo˙} ûélˆo–Sw˙¨”× yx\^ O2€û'Ŭ;,ŝÖ6³ĝ&-ılĤq[Ï/`£•ġ.ñÚË,ҚnÄÒ Ŭcu²‰ÈÁĴüŝ²í{ġѽ›ZÎİĥ8ò™OwYyŝGAq†Ż•_ŒSŭÎO½î=8…ŭ×ċŭ§~?ÜâZéĵÏ6ĴÖYí,WòÎŞĤŞşP°ù0Ŭĵ÷‘ohż]/›Ĝî‚×ğ5>„„\ĥĝO?S[bXÏ< çŭuŸŭE×ôsÂcĵÒàTÇ!Š˙—Ïž–Ёà'œ”úµğEqÂŝ³ž=ûÀâÀ(—I€Ûê/ SùŞ›\ì·+aó´]ëX\7‘ïĤ§M£·Ż ^ŭt# żĉ3Óo0Êĵ(ÊÚEô‡ŭCÀ‡ÁkeÀWCÔ" –=L‡żê߈:˜mÊĤhrs<ûşwaêyfSĝÒ6ğòÎëĦŝM>s’.hËn~MĊ~İ­ïiċŭ˙ÊÀIPĵ[z<óÚWàŻA_><.Ïo¤‹|ÉË.úsü½ÖŒ€ÑyĠyF>lÑnۑĞÍġĤ¨r}„{™íÌ[v}a ÏŒÉ~]“ßb@|ÂĴ„ß-‘ëoòúO‚á‰W<öŠ_=xÏûÁÀëŝ~yxïÓ à4èMŝÒméFßĤÀı6âZ‰ŭşœ_‘kBéî™Öv‹˘ó*óÛîŜŝ&ŸÍM"żĴ§óTÍ}žûĜÜçqP|íÜ×ʀgŜC~üáIùSŻŬ-zŽŻŜ8ßN €é:²Uğ×­R¨ ßĤë/]GŻ!„ìp·ûY^IDATM_ĥÙNX0ŬjĊv󟕳=÷eÎ[ħzÑŜ};vOhS…'SäĤ{Üm_|8Ċ{kÎZƒ·żŞè;LöC¨oK!˙§U+ßc3|ùlˆo ž¨˘ôz6n=:) Ŝym €JY]ĉ  üşBp-–Úa`›fCß+²âB”‹ÄÙD€9!ñË0:(ÜsñÚ-zVğ=ŝĤ%‡"rĦĤD ÍbG?‹â˙Í2àħWĵS< ŠSÓá hŻŝú£ò?ĝüŬbïíÔÒweÀĦz9ÄÁ̰×â÷°Kc—yHù9ÌŞîL%ş]= ÛxŬM{‰ċcm cŠ7Ċ{۟½U‡ĥÍ}ÔĵŝöµFiißiö7—C|¨†ïŽ‚Â zŽJıwX@ño€ŞƒÔs¸ıµÓĞĴp ‚,¤WÊĥş —[‡QŻ6ûôĵeĉ²éésdŭ ­c‘™t§…ßMµŜ V!˙€c5ĵWz|½ xâò£  à炟€GeÉwmÙ÷ĤòĜÓUp[ĥ˙áš×ÊRUĦUŻb~èŻĥx·Ùžu¸ìkÛÂMïrñçĵ‹ëç@÷ĴšÏŸŝûYïMV…ĝg9|*ÊjZßıĊżc5|{b¸èñLÒë‰ÜñŸyûĴ|ï܊€V€]xh5…==ĈĦ#݊œFÀµîVKÌ.á:PĵD&lŝrġDż‹ÖëM!ŝ”*vÎ͝ĜŞuŭž‡8¸ç((Ŝ*£O½âh¨85=܆àÇö˟~í Ĝ;¸†ğ”×q“K0Üċ4Ŝ)ĞHDŭ†ÔÚ fUS Ċú“ön’€·p’>´ó{^:FŞßĞjç×ĦèP€{ß ~ÁµvĵÎW÷ßq&µU%żss…?ĝ ,FŽ‚âğŜĊ³!ŽTñÜ+ ‚ö<Gŭò‡>PÀ£>sŭëE´ Éġ.ŝ²pÛ7FğhŒĤp×]Ñî€ğ¸ĵ,Ôż_TÉċmua"‹ h×Ágp•ß‘ëíácÓ•MUÏ3"½ê¨}ïyµ–˙ĵŠ|uàñîPñ4(žĠĵ¨xE˙aż|ċów‹ Ŝî³İÏĤßϕĊ¤+QS›´X}uÀ) [~(é%m³ĞBĥß7†Ġğġ̙'—ċÉÏ4}“Ş˙ôšŭE÷_°˜Ó÷ĠrĦJŜŻZ÷~ O†U$`¨Ŝ ò‡Çċh'o—ï~— Ŝ+z§WS7Y0 pÓ"œRŜ,6 Şn<·ÂvV¨wŜk/Ë x/`wqÒáómÛF^½;Ÿ:ŽĤî|"4~Ó3U‰ċ|ŭj9߇Uq߀§ y#<´?8P‡?ò€Í58lmÖà/³ïzÓ'qˆż´èí÷ƒâԀs3ĵïú€Á\WœŠbàÔÁ  àsúċ7êûxÔgïŝˆ¨/gËŬŽk&2·ŒnéƒWZğŞÙë$ŝ]Ĵ§ĝ“uïzáë˙½,ÒßRä×=>Ċd1ßP CDñUaßÓ ĝÊıÇÓ Â*J§4DoÀħ<{Ô/ż˙ġƒ‚ž]5nœúğ]ô¤—1vĉĊÉxá³˘DWIÜ/{uǢ”iĥà÷ĞŠ¸vl̏òúEĵĴ„˙ıW„ÚR'^1PĊ×ò?  úŞß+pĉƒŜ*È{xéÁ‹ò^ğ[ÈC.çÛ] ²Öà0ž]ĵnJT7^ô-ZĴ2´NşbÑìƒ. ŬC1Ü6D~ŜsP6$Û8ŻÔ’w`‚² éĠüOƒĈœ~éqĤ†SUœjìԗŝT=÷‚=Ż€ŝèÛŭòoW˘żŸöġ踤ë³Ë@‘5ü ’n³‰•[€Bñ']Q0OŜÉß×ÙÌüŭ%‰ĝ6ÉDÊûêı80 Ż 5 D\·?ĴĈ>ġŠçAq O†:*â‹ĞŞ ç¨àg<?×/_¤5ü•èĝI@žµğİġ =l– µs éôƒ%×ë|.[Äm[täĵê"Šà§n|'Ġ2½z^_Ğg¤U½ùOÔÍ2àÌ Ç0”>zĝ‹Q‚ÓÑß(=ŭ'ŝĈ~ù_ĵ~PôŠhSp ˙U4|À…Ĥ?ûs>OÉ£fB‡\WKĦ[W"·é|ıt$Ò7ÑXŸ.ĜK? •>ô†€˜Ë ƒ*×V‰˙‰žùĝ3݊q ŻBħS_ ƒž)(ΝĈœŝ~9äŠ÷‹ß%ç+9iV'd“=·ŽPÜÀûĴ4VW˘ı¨fèş‡Ú7}ż§™"IäS_UU÷V5hóP^OxO½â<xq(UQ €êoGá}ĠsoĜ‚‚ŸytT>€×ŠT€kĝ4C=~àÈUµmMı*zrùr ùb!ŸE0ÙÏjà̇ÚOƒĈ*à\£‡˙Ġó€Ħûï+˘°+bK^Ż€w€Şñİ D€xÑ\‡żXŝÏ·ûċ/V‚/¨ zÈŭ×ÇP +2ZsdË7ŜŽMÙUïb;s…ĵE(ž">Ÿ$ĵM×ĴĴòêó c œZz]ĴÎf(ƒâĵjÉû\fÖĥky˙R£úAM™*à _,Ä)ŜyĜ/˙À½âV k‚o5âşF❑5ßèĊ€ĵèĦúċÈ×ĥ.Eq–@ğżï*p“İ–ĥÍxĵmâ\ İ6_s3À€aƒĤžİAĞVşMĞá8D˙ĵjÊÓñTËó€èé{ÂFN<<.ċġƒÂ=8™\Ÿ˙à¨<]pC ‡TìÑîm[ĥl€ìĜhQÇq~WĵEâ(ŸŽE)kŬç~AÇÒS›-â‚èqëÌÉà6ӛWÄĤ9*àjïDu<žöúßö0LĤ|­ĝÚWFJiñöúMĉè Q…İbß P>5|/€Ŝ£òà;EĉéÙßp@QËî´{è[5 ìĥĜ-z/ŻŞż "ïÀıĈœı˜M>ô×8Žü†ßi)Û,ÎĞ.u˜a, T1˜qĠt*·İˆJú‹³ x‘„ĜĈŸĦ{…Áqޟݳ` è.É{‹“ùúV tl¤í§°=PV—şdG(.ŽÏóTp[Ğm8ĊŸÉùŭ“òÏÀ½â–S|·~ ÷OJúq7ŬZò§@ÏIĞPü7˙ĈÈġ=7·ÛXT6z͢Pû‚~íôÄg‹ó´P7½Ĉ×ÂÛM½=Ru| ËğÁ[ˆím+MïİUĈƒµĦĈöÈS7à¤ÊĞ×ûÙĠ˘ê÷“çê4 öh‹”áÖñ÷%â<–ÚĈTÖ!bŠÖ ´Ğ^Ğús äpxċÁQù;ҟŜ;(Üxħ†ġÉĵ@dŻĉ/g‹WÀ&fRO‹{Ŝ_o_GĜĥ‘+O†ê˘‚·V‘ŜÊ­Ä=Xì"×tŭ6[ÄGžşÍŝİMíh‰Û´Ħ Š÷½ÎÜŝıÎ*oúûs‰Ç~êgCYÛWÓs/ ĝÀâtĠš„W^ûĵ›I'‚ñĠ.NĠŞĝl<ƒûŭrt3żqPähá?è³ikLߓ-{ˆ_÷BÀ6yòĞ\çvdóDÜÌFkËW*z™ µzĤG†3"#aNÎ;qŞŠÁw˙ĵú@ÖÛġĦ6ƒJġ7%÷èXmÔöÂĞ[DCloÛhhĜE!íßWß8§aéhĈ9 húzĜ›ŝÚsċë0üŞ•XÎbM–d÷ûċW§wòĈÂA`ê€ûG\ŽGÖ4&nhqÈô5ô¸")€usä7YäğĕÄt0úôĤËĠÛÀB›…ôÔĉTqfßİ…ĵς5FúŞ>ñ8R ´ÙÇ÷ŻWŸ~N4à Á£÷ˆċŭş@7œgzŬ ÌI?Tkâ'­”ÌA''ž;§†Ŝ„§.#ëä_ħäù×>ğß/˙ĉĵ÷ìÍğE^ßfġÌiüPÜ?áD=ÒĦ0íá:{ ToQàĥ˘×u)ZWÂÔu¨}&1îŽù:9ĉˆ´6|ÖÒç!­7oÌĞWÊVÎ)ž;W…pôÂ{’Âŭ ĝ7%²É›V÷I0¨éÈÉH Ñ yóY× Ĵz7:ŝâmg…JUѽşÊ#—*ìn5"?p†ok-xï pqk'÷ûċżĠô~ĵqX¸zvÁĈŝĈA!÷û³§á½uLOž\’ı qj@6;,ĞXTĠn|.À<ùĥÄábsÓ~ÖŞB_^ÈgŝÎ0!Ô)ġĉd\64™²Z\S~>÷İéÌcŻ"úûcµÑïĤğԝ›A 8U[ó“§l€÷~âIt*ôÓf1oZĴ&¨˘ îb0@<žá”|òŝ‹Rxä½şîĤÉ3?bŜ\AÀd·‹ċ_ĝ8µÉÛ>S­ïµñüĈÛŸŻ‹ÖĊ(ž ’Yŝ÷3o˘Á…|ĵƒ¨aŻi[#17ü)ç5Ô ü}ì5ö΃~ùOxëVóÖ[<ĥĉ‰?!7Êp‚ß<ŭqŽĠ׳e"-ŻJ :ĉíşğ-OŬ3ïj2ZÎ{¸Qìš~V.U*tğPµwUk^†=ġ¸§c³˜FĞ UèŝħWİÜŜpÑ/-.7;gŻ×'1÷>uğxĈeµU'À èĊGÓëj'‹~8Š€0}`Uĥĵŭ+U³×7ŸáŻUEô£“×݆żúà¤|g¸v_Ĝ¨ĉ­cĊ²zÀ],´%ĵ·àá{EĵÍ0•EBÎP{÷B>òNÖağşçŠĉ5çħh.ƒ95*)ä~6’w¨*Ô1^Ş6‰qˆíkÛŞ‡FQ‚ĦÚÌV´ġ|¸ŻD\Ä~ 3Ż^*ٟÜCÊ"˜ŠÖ ĠFBnè;àÔúòTyúüYŝ‘ŝĊçßÖ9"×x ı½u\–ĵë Ù² h_I? I6ĴpkFĥ•+ŸŜ‡Ş\ްÏëӘr¨B £ĉ0M—d7ÉĦ+ŭì;ö¨Šœ7ĵÔsŬċœ&6uU›>ßúżüœÈÂÌ#ŒB~ñġB¸úSÈ]œŜï—wß8Wê¤C{Ÿ˙ö"?çNÈUŠL8'ñ‡nàYTÏ …KÛY9s™ħ~œùòî½óUE“ĵÓO%ŬÏfêéŝ·ĥEùËıÏotd­ùĠ™‹A|{ÎÚ9@ÀkTߨh‹s²t><Û8c”†Ċaĉ6^ó|93ò3òİÛʙF+)Ĝ”Í˙çjĴĞ zSUÛşÙĵµ†áZµsN{ĞËÈ>Ŭcé;ò˘‰|ğ*ÔÊ,3ċä\l‹Ç¤÷ç³§k+ğµWĤßyÛ|lÓŭÇ3g×Ü´67 „z$ìM´ÎÇUJú`[”ż^ú {…d˘U’[âÈ€—ÉÄnÖċ›|Žĥ‘˜ı:ìñ˙opŸ äy£•6ĉ~i ü0³fž²:{Ğ—€16 ŸòÙŞ5e^OÖÍ/Rò&;0T¤túy˜ŒjÎëŭ˜\EİtY•AèĥcW6ŽŻyĴ‹İ’¤ğy3–‰Ùĝds]£ç:…dĵò€™ôµµ×ƒġJ+çÚ=×E0żY?,”Ó½ÌviMÎZÍċz=§L­›çGáÒïŸëí†O÷ÙYÔ.[/Oƒ.ÈgŻ)Îo€Kم|‘žÇ†ÇÌB˙×Ër˜TNĴŬ;Iëı×$I›•Îʨí÷¸^˘ˆ&•‹ò³Ù™ú÷>˸îĊQÒÀë•RM'nïĴ}[éóAhÑJ gÖÍó5óËóú%Í4ħ‹¤û|0üĜù:gĴ;#ŝ8ÌżÖ"˜ÎÍzëéùg{ébxc½³ m/Ye£ b%¸ìhH•§ÜûŻÛĵĴ[zïž`²ˆLt£ä½~$étäƒI{X”Íò{›[>ê?7ÌҌÀWf I·o7^yIŜżC€Ù™vTŻKá,Ŭ~l‡ĝÜíùĴڲȖŠğ¤ÛÓlĝqeí½wġš|^vŸwğqÎé '9Óyµ|"˘·ÔPÎl‚ )‹ z÷gúÙŞÁ4\½nVµÍk­`½[³Ġvó^żo‡Ö^ó`Qï=ܕ˙žû ß½ğ9Ó8Ċŭ‘"2ÛsŽĴ` Ġ'ŽRw½×)ü/Mǖ­äÁıRżĈ¸‹Q‡,ĤTQ³çÍ÷ RĤn˙tĤpL’ÖÄw6.%›ç•—Ż´MW”ê˘‡&[!Ùj|ѲûÚ01w½£9ŸĠz3×%C|Ô'Ĵ YÚÉŝĵ|°ôY4•àFŽ‘y˙EyÉ_cĝ‚ŻúxÖÚ;}cċż€ëŒigëšo{šof›;o>,&Ró@>ëĈ+SMWJ5;ԛyia6ÙPİœy“×&.Ż›·÷u“¨JÇ2MÍNöÁ÷b˜iìäôĥ9mşŒGĞ·Eùì‹~ŜT‚€W<N?Ÿ6ççwöżD07³^˙€ażN³—6ÀMŜĵӌŬ·ëÍħM;§Ç9·ŝ™p/)4Ûż˙ğŭM{{GóĤ+²úÚMç‹Ñ™ïŝÚyŝE ó}ħ€ŒÙAyşÛ7Ô¤µĈuoòċŒïKúfžċHw~tùÖ†Gqaĥòuş:gnŻêúSáäòT;ÄĜĤż‡kĉUšİ67TŸ9OÍS,Z½n=x4ÍÑ2‹ĤÂ-J›#E0=OuPVĤ+Á˘.³ ~Ĵ˜Ô5Ĝğ{çW¤qó•2{dż°#ÒÄÁ;\9ŭXğ/xÙYïlyżˇ>êÏR›™|ôùĥ(5÷sosÇGŭ=%Ξ:Zj—ĝĞ_ÀİkŞĞIz˘üJZ7§1İí¨Vok*ħEE˘ëwfÚÊpÍĴ}ĝ‡ĴMé`³ S†Áy—?;(ĥeۂ\Ĥ>|A&UÙyUU²…Úîŭġr›ġĠ5Û£ıvğ\½ĦŻR* ó‘Ĥúž×aöÁûEy{éCìuR‹½_Íڞ—;ŝ|3N‘ëÊL;畎:ï›wj…ääT6È7-TWYÌ)cżœìÁñħô|—{熛êòoGÚı‘ЃÍFċĞ01EO÷uGòs%]Ǔé^Fd݈ÌË`ŭp€ÉżgÒ/ŝıëSïġ­“şlkêvĠÔpßǨçUPĞÏĞ;ß\gR>ŻLŜM7]ıˆŬ²AeĤb˘W·İŻËùùôAx½ ÊSċP½´™Á,JÚç3oëĉë›İžÍŜż-éíö5Öï%šôâaQŝcîbżsgsâ}Öfµpĥjé_^uÊüytÛ­TĈ¨Có_ğ2ħğX7v‰ÎioAĴ7µnç·&Q“ÓäÔÈ%ڕġË×Ú`>ŬÛxßŭĜ½7“ş iY&jjíĵŜ èĵ×ÏĠTŒË*şU&ŭñaQŝu6ßۜú¨Gƒ)ôÇÒî;*Ċ,ÓÇ~£u‹ŸUĉžZÔFuJ_’žBoFn;26Ì;—aĦßıÍWĈsŜ~Ri¨J~Ĝ|EN²fŭ\Rċ£ŝ”ٜ¤ (ét[”?Xzóy{™ˆĊ@½=/Żĝê^ï ÀJyVÚ}żĥ'eŬwUè‚v=%îŞÔUU]@fŞ—ĝM›ŻXTŝ³BYÂI$}²}Q~ïH _İż‰îZŭÔ("xSµAòÇ÷ożeÒ™]VÒŞŞ×â7ŭú÷:HÍéòĥü[s{]×öÖdèï‚üÎ;}×\Ŭ…°2N„'Û˘üx!Àğ…ÇÔĥ(#%7Èdóóâ·O.Üż~ú“ 9Eŭ.{s’œ~fAÏä|ö›Mp·ĥEù›cOĝîŬÍÚ7]o²sîÈLµ˙†—ŻêÄÚIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Pink_16x16.png0000755000000000000000000000016512467662066021667 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(Ïcü?í?)€‰D0ŞaTÑ ´ıct}IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_RotateCCW_420x420.png0000755000000000000000000020111112467662066021351 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊF÷tIDATxÚìŭg%Yšˆ{ŻĞ'Ce¤Ö•YZW—l=Ó=Z`z$°Ñ;˜ˆ]$Á].żÖŒ˙(lwÍvI˜Ñ¸$l‰6[X,HĜÌ#şGôLëê.]İuˆ§\Ü{?ŝëî×ŭù{ñ"3++2ÊŻYTE†xñŜs÷{üœï|çcD„f5ĞYÍjV³>îĊ›· YÍjV³šĠR³šĠĴf5ĞY 5ĞYÍjV³@jV³šĠĴf5Фf5ĞYÍjVHÍjV³šĠĴf5€ÔĴf5ĞYÍjİYÍjV³šĠĴšĠĴf5ĞY 5ĞYÍjV³šĠR³šĠĴf5Фf5ĞYÍjV³@jV³šĠĴf5€ÔĴf5ĞYÍjVHÍjV³šĠĴšĠĴf5ĞYÍjİYÍjV³šĠR³šĠĴf5ĞY 5ĞYÍjV³@jV³šĠĴf5Фf5ĞYÍjVHÍjV³šĠĴf5€ÔĴf5ĞYÍjİYÍjV³šĠĴšĠĴf5ĞY 5ĞYÍjV³šĠR³šĠĴf5Фf5ĞYÍjV³@jV³šĠĴf5€ÔĴf5ĞYÍjVHÍjV³šĠĴšĠĴf5ĞYÍú˜—³—ž cĴ9"ÍÚĞkŜÉIÍÛÓĴcíŻSÏii³šµ+YôçjV³ö+ }ċ+_iŽV³>’ġµŻ}í£ ĉÌ:wpjV³†ÔĴfŬí¨hŜßi€İYÍjİYÍZˆĜ.Á‰ĉü ĠŭŬ”šĠĴÙĞqÙ5Ğ£HXÍżYÍ÷0ççĉ=ĉ˘ĴĴYÍjR³šġ #ĥ[v´ĵĵœîş.À͛7İòsTùŬ†5ĞY 5ĞYµ`´M}żßﳕ•îş.s]7ûŽ˜<Ï£8Žġ`*R#Ŭ5ĞYûŜ˙Ï˙iéjŸµd_˙ĉù^sÔ?a‹•ÜĜ š R‡âŭ~ßi·ÛÂóċĤ€¨YÍş·E1³Éíżġ›Ş; ·ĥ—*.5ğBF•˙W ÙçkµZâàÁƒnżßouğŬžçyĞëûŬŜ!÷—˙ĉßñ}żëû/„p‚ `ğ=ÖĒ4ëîNêô˙Šöċ†ĥ/\vTóÔ PF;ƒl²Àˆ8pÀ]YYiuğŬçyÇ9êûŝñ³żŭż˙Ï._şâ1ĈzœsŸ1&¤”lĈßiV³îßÒT†!í}ĥÄjn&šĠ€Q U(˙}_ôû}÷ÀA§ÓYö<ïˆ8'<Ï;óéżġúMïÀOĥ˙à_ĵÏ9oˆˆF£:CRÍşï ‰d·wRqÓP L³ÖĴO43â5Ÿsß÷ùÒҒsàÀVĞĠZnµZ‡Ç9)„xäĊżëż=úÂÏ^ù˙­;>1)%˘(˘ÌĞYÍşżûóÏ4€´7Šş‘]+"L3ÒÍÉü £E>¸çy˘ßïğ+++A·Ûí·Z­ƒëžBœúK?û“§ô ?ŭ˙~ë:Ü7˙ôC"ò‰ˆ+Ç1Ñ<9°¨fŬ·ŭ.•~¨lĦÙ'ëĦwÙÙW:Ġ}c5Ŝ'Œv&ÏóxŻ×KKK^Ż×[j·Û‡\×=-„xìü_ĝü“żô—>ŭ‡›1Ûĝ˙Ž0uU+ ­µ’RÊÉd˘0´OıBÍjÖ½ĦíÛ³êĦ$šL%ùÙ>éÌ(û7Ż(ıl×étÜ~żïġûŭ^§Ó9èyŜI×u;ġÂ˟ù?ĝêß(ö§\ƒÜ¸A+H.Q˘”J˘(JƒÁnA¨ħ‚7ëwĵö4CÊv2Ÿ0¤†û–µÙ>ñ`T­!ïġzÎÒҒż´´Ôít:ëïŸtçñ£?ġ™Ï}ġ·_?˙Ñ †şü>Z큽)J)Éd˘Â0Ԙ-Ç5ÍşKgRQKjiïŜ30kȘm³4`4ÌívŒ­ûÒuŬÇ?rŝµ/ŭÖ?úô\1–]Ĉ n]Cò–ÖzĴ”šÄqÇcÇqgĤiŒmÖGşáħ}Ĝğ/L e&ÄÌ7+êéÖì ûŒĜ.Àˆ0r—––üċċċ^·Û]‚à„çy8qꕟúû˙äó~v† Œ]Ŭ¸ˆ%$WµÖÛJİQ†ñd2Ħ$I€Ù‰áÍjÖŭÛïìĉÊ}hjĜWĥïĵ~¤ëú‘¨i”Ŭß`„Àˆġû}yyı×ëġĥZ­žç=ĥzäĜ§~îŝ'_lw{‰"HE[·!ïܐ}½'%I2™L&Éx<ÖĜ“İfŬŭÒf“Û§Žáŭ‘eg]â™LG–ĞŽ@Ííê' Œf²"Çq„ïû˘×ëùËËËŬ^Ż·nÀèÜÚÑ/ŭ…üżŭħŜҊ˙í­‘ÔšÀ°u*Zñx‹´ŜTJ £(ŠÂ0”aÎë?jʗÍúîÀa…v6€´§TD™3’™Œ&\ġ F9 0r–——ŭ^Ż×;`ÀèüÚџúĠüŸ~ħ³v ġ½­a˘ADéyn\ü-ŬÑZo†Çc)Ĵ>Z`;iV³în)ñsWH{“ÑôM³e:Ú·,÷“D¸0jµZ^Ż×óúŭ~ŻÛí·Z­ïŸ[?~òSżúżúßŭxwyĊ˙ÑPa, ZJ§j%!î\ĝGuò~’$)ċ$ d2™ jXQ³>šk!‹ bĴȵki‘"Ş'ƒ@D…h˘†ôI£LĤŒü~żßëġzÚíöIß÷Ï@ qçÊE}D…ï‡J “$‡a›tïşç×Ĵf}¤ËFPèŭWßG ‰Š]a–L×(÷Ÿ0êt:ŝÒÒRĞ×ëġMŸÑiÏóÎ=ò܋Żŝòß˙ÇŻıAËı÷+éÇ?ŭKżrf’ğip*ÎFȍ R‘&cyòöĠ+pÛRÊM)ċ I’0Ž$I]9¨ĉÌ£gbs6ëî·;e5W²Ĥ†´W1izVgMlӋôP‚QŬ£ÜĵàyžÛëġün·ÛíġzkNçHg|ßô'ŝêßĝ‰żü3ÇF‰ĈFDà†.“Îò)Ë`¤Œì›F3ĵ÷֏–á-Ô I’I”ú½•Özž\Gs€İYÍş·ë†§—–TÈw íU’éfÍ=b EzÁˆÍ˘jŸbQo­Ŭn ‚àLĞŬ~ò+˙ŭÄıç?µĥhldžASáÈL‰&DcÈÜxŞp„›—.∌>Œ¤&I26é jĤ3ˆCC³îiϓ”Jʍd·Ç™UTğœ1QsŸş÷€hQ0š×[÷VĞuÂ÷ŭ³ŭ•Ġ§ŭŝo~üĝıÇú·b…‘$0Ö‰ˆ¨$ñ*"Ĕ²£‰J5<Áˆ1¨í ȍë!‹I’ “$‰â8NLŭhĴİYÍş§=.ğZÉnooxUpböwšyH{œaQ0êvğ^żßo÷z½^§Ó9h^9têÌ żŝ˙“Ï<|¤uy’ Ş£ìÜH €T;Jx Œ.~>‚ÉpK)5PİĦaÇqläş: ˘˜Q#ß5ë~@`ÎÑŭ¸œ}sŒĤ6ÀEJżĈ›"Ò£&ĵ Ì÷}·Ó鸽^ŻŬëġ–şŬîál|ÄÉǟ|é×ŝòzĞÛs?'Ȉ Qz#b§ƒ„!ĈYĦ˜3@3׸üÁğè¨èš”r;I’Iœ.ġT{|ˆhA€jV³î~żÛ§[ÙaHeFTì}iaDÍ4/ÀĜşûŭ×ëġ:½^oÓé2NşóO|úóŸŝ…Żŝĉ³äzââXĤ…Eö§Ùŝƒ,ŭˆh V„HĤ–oÎYz9 jĵ…ËôI^›úQlj*Âëĉıëv8OžŜĴ{X:Ïµ_—³PĠIDĈşËÒŻ7{À^˘:0ÚÑĵàyžÛï÷ŭ^Ż×évğĞívûHF/˙ô/|ŝ żñWˆħ[Ó­ušmX*šO$ì("ÂXk\ÜáDĜ¸|bûΈ’äŽĈ†¤g0 Y i!jV³îĉ|?²¤‡Ĝ”Ö!ÛĴ½ÀŠ€ëEÌvÒġz½££Aœñ<ïü—ŝÊWżôü—úĜHj܎\2ğV—PŒ´aG‘ÒFĴ){ÏX:ïŒ3\ĝ]´e´Ħ”Ú6ì(Œ81r]x°ĝ4Ò]³îĠ‡¸ìöQ*ĥ:Ĉ3²uĵfˆç£êE%óÂÒÒRĞÛíö:ÎÁVĞuÔ÷ŭ³í^ï‰żÛ˙èǎ?ġüêFĴħkx†“.qŜ0möDbEˆ50ÑÖ¨{Ĉ €$­ ïcEFWL\(Š˘(I5`ĉĠŽšYÙMĝ~46쟨lƒÌöĊŒÛÖ™šġÑÑ"ŒhÇzQ§Ói÷ûŭċN§³Á ÏóY?~òÙŻüƒ˙ġgVm_›(L$Á͎³ĠcD5ĵ$sÖ%ĈêJöċ?Ï@£;ˆn\IZÉäÊ ­…I’ÄRJ ;È,vÜĴ{gGĊ4ì†!íċ ħ :Ĉ]ĊJ“šŭàc`EÀ.êEï;Ŭn×ëġzŬ^Ż·Ün·ApÊóĵsç^zċ•ŸŝÛïE·Ġ h\Â‰Ĝşmî’ĦE˘ ’ÒÌşHR1ĵQ¤Ápíâ%´˘ÉĥRjˌ›˜X††ğİ5LİY÷W b,5í4'öòq²CÊR—ĞP4ħ in½¨ßï÷:ÎZĞĠ:Áiß÷yġ~ċ /˙…_{$c C:nÜNé LC€& E@bzb]fRœ§) —Ŝ{-ŜÎÒ½“$‰’$QVŭh–ia׎ğf5ë..800hŜŒŸĜÓ4ĥdí. ġßoÖŭ˘ÀˆÏ¤j½¨ŬnŻ·Ûí£ïŸiw{˙ÄWóÇNĵôĈúĤÔ¸Kx”ž¸İ’@DP²Îİib‚J›a5KVI´à“!î\úNŞâ$ SÄq%I’ì‚Ġ2˘FkÖ}ıîÀ 5  WŬ`”­#ÚÇŬd{‹UÙÜzQ§ÓqÛíĥÛëġÚŬnwİÓé ‚à¸çygW}ĉŝŜ˙ò³K'NwŻŽŒ5àƒÁt–‘ĥ˜1Íà%Dİœ§˜b"H0™ö€xÄÖí âèĤ,úb3ûhj@§YéÒ)Ŭß·jÏ? Ïb>éH*êEŒY`~àf=V4o wG´Ûm·Óéx&İ{ÙHt'=Ï;{ĉı_ŝ‰żŭ÷^r;}÷½A M€O€ÓñâvQ×£*3"Jûޤ&$”Ö‘˘ĴÄ qµ "HRÊv×I­uµ~¤ç€PS?jÖGxŽT_΀ݤ½v€Rà!Mĉ4h•Ê-IM é~³˘Y`´D×ëġ‚n·Ûïvğ+Aġ}˙¤ïûĵĝS?÷ÙWġ/ŸiÁßŬNàYš$òpT‚EĤáÀ8‘”%×Ikʛf5K/\~÷-t’I4–R†vjˆmFN4ëÒ$mêä Cڋ;%%3Ô0'V*x7ûÄ}£ŬŽà˜%ÑuşŬnżŬnŻApÌóĵÓŬċÇżü×˙ÎçŽĝÚúġDĉ$AÀ<DŽù3vj· BdÛê(P‰ ”֐²$Á˜lcpġ²ZO‹CKK’DbñşĠß35'^³î3KÊ@ݤ=Ȑ*MŻD†-‘ĠŸÔô!Ŭ+Í!Xàì Ñ0ZiµZ +:{ĝ‘óÏ˙ÜoŝƒW܇ZŒ†ħF‹.ÇÔyJöîšħ"d%2H3|O™9H’R0‚Ͳ8ÀǍ˗ᇃĦVrĜ½CS?Òğ`EM\P³>úŭŽ3¤wQ CڋÛfñ„`d˜QӇô‘°˘yŒhDgFFĴµZ­žçô}˙‘çżü3Ÿ~ŭ×ŝÊcĉïoKhÑb .„ù³ş†QġÎÑüœ"˜‚%I"(]„z0‘ĥh \zûGh%-Ô0I’ħiˆ­ĞĠħ¤šgÑHwÍú–Ò€àĉĉşaH{óށUĉ—g“ú2ÊwÍùü°˘*•dşN§Ì“è~òĞ÷ó‡Ÿ{ùÀµXâ8† Ċ ‚‚Q>c°&×ÀQ1–\iŞ#2`¤ó™óƒàÄ5ÁĈ•q\†â$˜@Ġ(ŽyvïĈe×Ĵż7A²ÛĞ;hyż¤şï_oz‘>RV4ĠèÚn·Ŭn·ëwÓµÜn·zžw"“è~ö7˙Á+ŜÚĦÖ‡ےXÚêÁae1ĥá5ğ˙”V”NÉħ‚‘éŒdg³ìa8cgP[ [‘H˘k™Ŭ;I’xt†&.¨YvImş¸ ÔԐöĝʆyV”FӂôѰ˘Z‰.§Ŭng.ş^ğŬ^mµZG<Ï;ċûŝÙêç?óÚŻüóCrĝŸnĈ ´‘Ë8Rİ.# 3t1J9YŽ:m¤:mdşŒŒ\gW&÷1n^ş€  µÖ™6ĆQĊ ¸ë€&.¨YrqnĈOìÙUj†5ûe)Ó£ûĊ€i;÷ĵŜ˘v§ÓYjµZëAu]÷twiùħŸüêßŭÜáç_9p)Rĝ`”Jt>×|J£ċl™´ğSqï‘‘6@cĉòÉ#Eİ))*¤…a“wéG?DWF7’TÇqI)í¸ &.¨Y{dż£ìŞlÂU÷0(•wÙf{xĴHAħ˘n§ÓYiµZ‡|ß?îyŜ™£ç{ŝgŝîô)ħt ĝá ÁíH£ĊKmŬ‡3ˆÔĝVkVÈza³„†€Ò‘i`$­z’6IàÙrFq¨ÉÛ7Żè3rrqhₒ$ ”IŒvӋdNËFkÖ}Ŝê*eˆöŜ֊RÌ3KûTʳBš´ šĊŠ€vnß÷E·Ûġ:NğÛí.µÛíAñ<ï¤ëşg?÷ċsOéçNngßߌĦ¤F‡3xÄà'€Ûj+Yğ@3ÊnĦyeÏĠĜ—ïŒvJ[Ĝ‰ħ œ 2Bϰ˘uß÷OxžwòÀñ“O˙ôßùûݵŸé½;‘¸4‰á1  ÀÑ)ı̤,PÊż‡b"Ĵ6Ê`¸p†jÉèÊvTĈWǎv:™bŒħĤŽÔĴfŻûòċíŸĉfü'Ĵ`G:/Éğ‡]´°3ŞeEŬn·mXÑZ‡=Ï;îyŜÙçü'_íW˙òc‰ˆï Œ¤†Oé¸×$.°œeyr@!eÇ)Ġ6ĴdIoT‘á2Ï)*€+Ğ)eÏxZgĵyá´F[)ċvÖ ›$Ibâ‚vŭ–[b Ġ‡œšu_äşÜIÜҞ=H̚ X|Ny/Ë'ĊÖpĤ…E˘x·ÛġL­¨Óét–ƒ X÷}˙˜çy§úÖ˙éŻŝÖg<ùìÊĠPáŭ­\i` ážc7ÁĤİ^£²ri'ğfӇ¤§Ż-–” ÈNÁ”&pÇÁµŜAOÇ·³to“_'µÖ;eÒħÀˆĠn#lèßV³^û2Ïîá¤İ,ŞJ•˜î'ˆv#ÏÍuu:žaE‡ +:óÔgĝêgŝÒ_{B]÷;ƒÛħ†İa!*Œ œR‰ŽXŽš‘Ŭ[„rˆl‰i@%Ĉ”ŭ[ۏ…²™…Ñ›W/ᔠ/GI2Êä:“î9 ^÷îwĜü|GÀjÀŞYé~gŬ]ñĈÔ°wâÊ'TóeúDÑN£"Ş)Ż£ĴݍßïûteĴè¨ëş§Ú½ŝù˙Ğ_}ÔĞŸ=x-Tx#H£M .(µqyübÙŭBÎ\²{Ta>isÓĦK^Ĵ줂mŭIÙKgD` Á0ıqlf$’|:ldêG´#Ş{/çħĤŬÈ}ğШ>ÌHĤŬûñÀ†éË9ğFĦĜynyŽYi n·ÛmµÛíċVеjtÇ=Ï;ŭäŸ{ù³ñŻ=Î’÷ĉ ÁíXc€kĴÜKÍ ıiÁjC…Ÿ§ßË-Úşì"PĤ °Á§üûıܧ …3eï˜ pÍpûÒè&áĥ™;Ž8J’DšsgVxlöT¸uĉÙÀ>ÏôPmŒĞ;‹wV P}—2½–%u¨¤½ĊrĊßLˆ­ôÊî·QH÷ ˆJ`äş.÷<Ïi·ÛnğŬşŬnŻĠj-·Z­uÏóŽzžwrùàĦÇü×˙öëŸz~ġz¨Áf ҄6LƒĞ`0vnJ€—fĉQnÍÎwn*&1g9X}FÛ)\uşÔ(K(ËydLÚ~Cr…#ŭCJ+l^ıˆ.E7’$&I21voöŜQ˘³g?eA[gĴfYŞ'ş°Ú5P5 µRjÚjc÷,CJ{W²kÓ˙&+Tu?€Ò.êD‹l¨S &µcĴÜkïv]÷¸ëş§^úİŸŭċżĞç¤×ßŬJ0”Fŝ0ÀĦlĵ8A˜cĴ]²Ä†ĥRd_ÏÑӁmíNÁ˘TWÊË܉gŭMë‚Í€Ip=Ù@|ëşîÇĞÔ]ĈqĴ,4ÊŜ=ƒ%ÁbJUž ->;Ġn|: Hí“Eĉ:aĴ·‡)R=NÁšÍW{ùï_ Bċ.~ž<ç´Z-×ÄŝtÛíöŞïû]×=ĉyŜɃ§Ï>ġċ˙Ùßzİ}ê\˙rĴpi3ӄJY‘0;>ËìÜ(ÓĞOX R’‚]"‹vhc`(3˘rjwZ3˘Z½Œù–²ħöƒÛp‡$ÛRÊ(I)ÔZkVFU)ÎfFÚŜ'0{jì"aĴ´ĝTYÑġĈŻŭċ'¨żĵJ܌cp­ÑƒRLärNd ş@ı{޲dn²ÙOöı.L ùϧö…j­(—-SCiĥoBŠxï´uCF\ż‚ ‡šóŽçyËív{$„`Jİ.€8$1iŝh­­µ4 dȤ¤”Z)â8֌1Š˘H+t’$‹0ĤÀj7àt?AŞaQ{os@İ—¤½İĜÍB6Ñ?×î+1ÌwÏġ[­ÖŠïûëëu]÷ÄÚяŭĝ_û›ŻĴ<ŝÌÊV˘Îv M€ojDžaŽ´8+_µ`dÜnyÈŠûI³éŠÔnX,*$]<ĤUÒ9•eAV#;ƒ2“í 5:ĞëJê8Š]wˆB!„Á2$”bû˙P%D”HˆHš ÑZ+ó!•R*I­”’I’("ÒRJ†ĦRJ‘”’,ÀZĴvó½Y’àGR @=°;<ώôŝ³ÙíŸè ™~£ŒċîŬëċ>PÔ6ĤêDväO'EËïŻVtÜ‚Óo|ċ7^{êË?{bÌŝƒíƒDô$f’+7;çÓY‰ÚEiÁ„Š^"@k+aA[_ŸbFċڑ}pI—5Íx³X>H˜Áġœ|ñuD.Z2Ù¸vq-žL†·.ĵws´ı10R] ÊÉü;cM‘¤Ĝ|ͧHk­2†µ–D+´R*cWJ)•H)µ”R)¤”R'I"“$Ñqë`µ(Íú:[IŬ3@5àôÑâQvÈxşwoÌċD5ÉŜĴZĜĜß@T['j·ÛVĞĠ‚à€ïûÇ9ĉşî‰§>ó…O½ú•ßx”–ï…×Â+7ŒƒŽY@Äjv#*[´É%¤òrwe^UCR 3ÊBP³›@*ŬxPYB7Û( 5#bĊğ‘9,9 4k÷Äáû™mÁÀ8CËċƒ˘Ñ@Ê(T£Ávއr´ħ[Ñhkc8¸uc8ܸ³}ûÂû¨2€ŠmÒZÇbû˙ âLú3@•Q˘”’ZëĜ”‰ÓK™•*J’DUdÀ€jÑ˙××,µ“³ŻaO‘ҏ†!í½mIÎ[Göġ"\uŻ\÷ ˆjkDër!ït:^ĞĠòz½^;‚vğ½ìyŜAÇqŽş{üÄO?ŭı_˙ËÏ·Oïo)÷ĥc¤“[³y˘òŞÓ[m™Ng`¤mĞĥaIošÊß/GéR½Èvéċ2]µžĞÓ·CƒÀL½gñÊħìñ5a”(ĵ·M`Dàˆ„H_wàĝN7h9íΚßgÀ’‘)]‘9ž&>¨$Q­­8ŒĈzpçvŽ'róĈĠA<™„w\¸3¸vys²yg@D!Mˆ(2ĦĤìߑÖ:2•ƒšR*İ|Ä@eGqS’$* CÍ£$I4ĤI,0ZD ¤çiPg‚šÒ^><ù˜&}ÛljĤjûˆfL¨ŬjµzĈ°pÀuŬëïĴžûâ_ükݜ|í³ëİÙ÷ ĈÊäÏBû“{Ĉ+=\4Ġ˜JĊ;]$pëÊhqh²²èÊéÜıħĦäĵ+[ğçşé  y6‰DŒN+Ó²Ĥ Œ4˜HwIi€ˆ‘R‰Ĉcċ7œ³<òé áùK-ż³‚ŜÚñNŸ€UÁ =Á@ZÑàÎÍÉdóN< ’­+nEƒ­áäÎíÁÍwßĵ’d `˘µÎ@+4ŸGD41À*bZĦR*VJĊRÊĜ°İ(I-LÂ0Ìä?›M-R‹²¨:€ÚÍĠĠÈ{÷£6ħ×î°@š>F)²•vS[ŝŝ˘Ü°ëġĵN§Ó2@´ìyŜšëş‡=Ï;êùŝİWŝ+/?ó“żp*r|ñĦĝHÁf 8‘Iċ.˜,ğ5*r5ˆìÑ(×Ó(;íTŜ›¤Ë=F6;ÒÓûŝœċ”˜L'”íĈKï()ÓtuZ˙"""h–6˒$hƒÀÌ„‘y9˜à€²Ĉ˜¨l#LB tbm˘Ò×(Á UŞzîjğwl­ŬCëħ—ÖÈ ċhûN´}ġÊxtóêhtçÖöàĈ•Í;ïŭèŞÖzBDcó*&´ĈZëPk=QJEZëH)É/’R&Jİ8Š"iË~aցÔN 4Kʛ'ñÍbOµ}V 8íz3)t}¸œ}sŒ*;UûëAX|@@ät:Ï8ç:ï/ûżf G…ǟ˙ÒOêŸŭGhiĠż*\›$”6·:°lÜÄyͽŻĥĥ(Ĵ>DċqvÄOivYşâ{y*t1ĠUW-Ŝ)ë 1ÊĴĉT´fÌ ż4Mœ3äF+ùA³ȈXÊìÌÔZ %ċBĈHêü†§ĜV  xŒ™ÚY nšİ[C‚dé×ÒP9NÇ_wÚçvVyaŭËà —€xp; ·îDÛ·ÂÁÍĞÛۗ?ĵuûŬ^'MJc­ġÈ×(cY¤BTHD‘”2‘RĈĤXĊİŜ·HŬ-“ŞÁħÈ4à´’iµ24€´5ğş`UV4XĞ>pfgÍán€(ÇóKJ-7ˆ”b+nœ™Ĝ%ä#ˆrÒZ—Ö Z”Ë!•†N†¸£Ò÷_1ÀáÜé÷O.ġVN/-?#çÀžLëöµÉĈ•Ñ֕ ۛßğ~û½^QI²­µÑP)5ÔZ £I)Ç &Fâ‹b³˘(J˘(RqëŞúov?Áé Lıt܄ĞîŬú¨d>ɀˆ(½‹Ĥû<ż|²\]}hM%,A l j·ÛÏó–|ß_ġ<ï€â°8G=úÄŻŭâ/?}ĝéVBEìÍĦÄfĴás mêC+ ErAñĈ¤)”³ÒŒĦlX^>•µè3Êç‘ċ³jEYài&Ġ)C£Şôl ¸ŭïÚ]İ*ÏY›?·ö:mZ¸yn0 ŠĴ”Tcˆ€6)ċFnÙ{Á(½^"•›tËßÒġ”Ŝ~}ًb)£g2+¤çµ“ İœƒ@PZC 5”ÉŽŒh猷ŬġÎÒ݃ƒĵx„ËÏùœ!Ŝĵ9\ż2sù½;7ßüöĊíË\QJmi­·•R  † ĈJİ0I’0¨$I’0 €ZœĉI{³ÀiŞ&ġ‰eMÙŬgM–Ŭ^ĠìêFKž&{ŻG>Êr3A(ë#ÊìÛùżìy^Dë=ñä3OĵúsżôÔÁ'Ÿ[™Ĉ ĥ%ÁĦĦ `”ކ`™# ,7Ĝl$ON òtVeŭğjL(§,¤ž=f\[§L=ɖ³Ç+Ĥ–­ŬöÍ ĞÔÉÈvĊ›ŞSF’M 6ĦŻ™ċœ3óMRıÎpÈ5fÀ( bċŒÀXÊbRiÓŞ´aÚúWŻ/V·ÌYĴ”%?—äÉô9Ȕu‘à •íphҐ†5IMħÂíH!8Gàv[+GŸl-Ÿ|zíèç~ñĵˆÇrtíÂ`óÂ;7ĝ‹›ŜıĴ”Ú´j”§œAĊq†aÙ5¨8Ž•ħžWçħĤ˜IŻ,3Í0û.¨¤=À’*r]eCcŒp7çê=°ĦEˆ`U 2}D –Œ}{Íqœ#Ž=ŭì O½úóżôÄÊù§–CñƒAŒm¸ ´ÖLŠİ­TÎr+]ÍdĠDJL¨”žPuÓİŬĥœW ß+Ë{ ĊĜqeġU'Âzü˘˘ÄĴ\ájŬ˜¨"ĝ5·[ÄL³+7›wŝ :=™8KgleçLZƒb†)e „ı=ns­ :l,˚€+ *’ÍŝÔé $ih"8ĉgDœAq@ƒÄwÂ1ĊSıoùÀ#+ŬƒçV}úgÏş*’£Ë 7.·yëï]Úxï‡2µX,*gPRÊħ™)5™L&QÇÉd2‘sĜSƒš'ëaIŞ×ëĤ,…ÄHŜ íċ:UĤĊĉ')™ÍŒŬZ” a‘úëşÜ÷}áûkĤµĥÚív×÷ŭ%Ïó2×ÜAÇqŽyö…§^ûĊ_yĵ˙ÈËñƒa‚Ħ$¸”Q6—H€YIÜE ·xn÷ċfT †!ÙMĴ@ÏȨÚ›>~@,sĦ²(#"(ózıN÷Ĵĵ‡ÉÔhr0Bjo×Ĥf#ì–%’3h#ӑaX‚ŒIĥÄÍóu§Ê0Òu[-Ġע¨JflĠ$uĊ@šĤkMiĝ ’š3H ²ÖÑV‚ ¤Ÿ;púËg—{Î-?ŝúOöIŞñĠ›ßÛşŭŜ›—oŭè;´Ö†Amg@%*†ŭ~ÇqEÑ$Š˘8 ( C†ĦœN;ħ'6°Ĝ'ÖĊ·b˙YöS¸ŞNġ÷\òÈdÓ~Úa0Ò.AènÙTQÂ8ĉZïwƒ èğğf™Ž<òâËÏĵú‹żüX˙ôùŝXjĵ9H0ÚfóÉ3çĴĵı,5€XB¨ Ĉ˚UueHžÖT’â´µ™Úl‰P +ÇÑtÓ+Êĉ{œ„ÎmŜĠÂBħgÙxL§²3;c<ıa!ó(J͜&f¤wƒ AS™1òLÉmáé\i˜G‘ÈK Ùö`$QV§ĉÑ ™"Ċԃ‘.IĴeœ˘Ùµĥĵĥ•!‚§u1-R바R0($c a’Hl(Ó(ÌıèwN./={vùÜ+?qêÈW'×/ 7/ğuóíï]ĵŭÖwŜ7µ)ÜÒZoA0RÍÇ$ŽI˜(“öĈħÜ8ÍĞ7}²jMÙ>Ĥ‹8­öâMƒ9HÙfÄò;E–Δdw— ´(šYʌ Aĝùżä8ÎŞ£œó£úĈÓŻüü/?Ö;qşğ¤5˘a˘áħÔĴàšÍÏì-…e]šÌıl0j†âYlvJ·Ŭì +Ò'c@–uğH`°ÀHëÜ)WÊ­ÓÓ#*P­QĊıĈ wĈ˘ò7ĜÊĴ™]<ûycĉHó(™%"Ì4ÒfCS0ÙóċÌÔ£È0¤ôĴż›Ûq+'É 0šċÒĞ‚2°a\³HÖT°cċoÖx€ËYá‚dI '•üMˆ&—& ñ‚pıèĝG–úOœX:óÂO>£W‡ŜŜşġ£o_ıùĉŸ½ ĥ+6”RZë-Ôĥ”rét†I’ „îşÖô0é·ÙĜ÷ò²RĦSiJO‘ZĈĜ" ´ˆ$‡Ŭ°![–ëvğ^AĞĠj{ž×÷U'gF5ÙÑ̒Ì4ħAÖMŠİ÷IW‡œeŻ—6£M*|JUŠÚ”b…­–s-;²›„œ%™ßµŸÖ‹ħë›Ó'žĠ•˙>³Ú—­Ż§°ı£LWGžJàD;]Y3Í @ —e·J=‰io˘işŠ1'J™OàŠŞ™ÜDgï|šĠ²Ú·%8ĈÀTùÉÚSvm ŻjàĥŬxÑ)–|X>aY~Y²9Xċ¤ùú4Íı.ËĞ`ÄêŬ~¤Ò?(À!xzü]Ĉài‚òDs´!@8‘¸2V¸¸£ċĥZžĝòÙ'_ŝİ3ÉċnÜĝö7>ĵġŭ?úaM7•R·”wZ­Öv’$ƒ(ŠF™b<ǓÉDZĴİ*çÍsçáaeLĴn‡k҃eH3Á!Ïó²Ŝ!ŻĠjµ|ßoyž×6lhIħ,„Xsç ßn~öÇ~â™'?˙'üƒG;ےp-VĜHÒ4i—Ò˘1הšr6T耖(3uj3ĴvPf-ĊÄVP% 5³wŽü);íÊyvİŸ:rĵĜjĜ™í+ıì,DĠunşÊ NûƒXİ–”דl™ŽħÊÁ$Ğıĝ1@˜'fÛä36c[èaŭı`Šż™=.Ëlçċĵ;†J6Ê[$#ëw¨,K2ëgìÏ‰ÙŻ…J,ŠŞ,mêuĜÒ+^ÔR&[Ĥ£ùD •óÔzthEDŒ!‘„Hj$Œ!ÖĦĈ‰<ŽĠĥƒ£}-9Œo}óĉ•?ŭŬïn^ı µ&ĵm>6“$ي˘h†áh4…ñ8 0İiĵµëL‹¤•ïyĈ´öÛß(fíC†ô°ÒŬfÈíB³¤ıYu!ß÷ŭÀuŬL’ëZvç€bíÀ‰Sg^úİŸ}âäKŻŻÇ^ î$& Ħ&ĝf"Ğcş £Âıµù0Ë>\Ŭ+¨½SHr°Ĝ-ÓÁž;T‘¤kNi{ŽQŬXñ˘.UM]°l§İtë =ŬW£kĥFċ;ufÓÓdßÚf› Għї>òÚXż3']~„|Zne q FlîI”ûÀòôpF™ûĵô¤YIËlâ(NéDΞ“5j%VÈĤY–O×­W% ›ž‡5żßiŒJ_/™M8¤&(Sı"$ÂD#" D|áPÏĊĦž Üú`ëÖ÷żqñĈŸ˙ŝ÷(ĵŞ”şijM·“$ٌ˘hÛÓd2™„ĈQ×פï˜ö(­ŭö׋½’€[˙§4 Ŭñ *ĉ„VĞċµZ-?‚–çymÇqzĉ#Ħ5ÎùÚòĦǟüì=~ĉĊ—×{ÇNv‡ŠŝXâj¤!òñàNĉVâİÜ#²;rÔ4µÚşŠmmŝù- .@!ï7Ú‰ @Eş£âw*£ĊĞĴGMĊ˙”e:;•qŞTï˘ÒF7kÖl£€ŜySi_·Sğ9³OÓuÌ5–żïV‡,vš;ĥYy@+ıáXêôи⊟cĊßÌöù ˜LPkÖ 4àfžĠÙ_SĴaYΙ‰–ÊeÂJSuIÚÁ­Wí£Yq4- J˜#Eˆ!&†q,q{˜àv˘j ßrÄħû*‰>üÖ­kßüŸ~8¸üŜ;JİëJİ›RÊ[I’ÜŽxk2™ Ĉñd4ML)ÙoÀ´ö[_OëuŠÀ8kéÒ˘2Ü$8ëë\×ċívÛñ}ß1™rçy-ß÷;žçuÇéڒœb­ğ²zìħ×?ûèùWŜ8ĵtúÜÒ@6#…;ħ†£ ‰jqŒ<'Lœ0+Éseİ)“ŬJ,˘"{MOXµM TÓûS_ÊĤı@d=Ž=”e0*RŠuT“MGY}Ĉfz˜¨îj”Ġnj6ĠN–b—7ı˘2̈éiiÏ6'èX›vuÓ§r‘˘yS\ñ;dĴÁLS,§Â~JàAS!ıÌŞ51òËYv0€Ì£\˘YVxVqM4ĠƒÔŽĠšĴÖGÀD* Ç [“˜q –À$QCDs€Sëm Ş)Ħ˜aT;Ë*›*#$ĴŒşYÒ\9 ^b%ÖÄì½ĵËA– šÓ%]uĵħĵï§ĜÄYeƒ.›r¤İË‹°Jş7cÚԜXYŜËêbÖó¨Ö›ŞÀÁÁf;‘7Œ—ğzĦ R£*+Ë|³Ó"`& a¤1‰T>#KAH²&bˆ4!” I˜p޵‹sZ8â ÂÁŝàâÍ?ûŬo%“Ñ%)ċ5L78Ŝ˜L&ñx<‡Œi‡v¨ J~ûéġiĉ!Ŭù?7 é¤EÑ\cB6ĵĠj9žçı~şÚëĥ\×m !zˆ–ÇYBĴ¸žwèħ×?ûÄùW^?~ĝ‰§—CĉMIxw˘p3I#˙•"3p” 4ÁƒËґĠ‚=DŽU+âĠB:fµ’P‰IäÌVêK[²ê=°ĈïôTV²cQвc…¨T'Pe,Ĵç: Œ¨FĤËNu•2Ĥ²É ´ı–6wsŽ´.T°<ğ.ë3²Ü{v Ĥ’$ÏJϟĤd²Ì\‘*¨Ú™ISϑYżœW¨*L †ŭT#ĞĤP™ĠĦ"ïM9ñĤ˜Q1ÒĢ`8J‘ÙÏï F‰Ô‡ H#Ùkî<²sXP’”‚WL aĴ0Q„1ŭŽƒsG:8ÑĦ$~çëWŭÉ˙ïÛñö÷”W”×m`FRŜ"z{FĈ;Û߀Và †!=(@Z$Ôuò[v­ùωˆwğ]'ÇdÉ^şÚëĥ„Çqşœóžb‰s"„XugŭÜ+o<úè+ݟ:úÔ³+Êk9[RħÄġ$‚ĤU*e(YlşÊ”ŒRVä k",hÏĈiW7Uî$§ÙRĤT‘ë² Ĥä3;Uğ¨aJ¤éDŽaRıtW<MU­ ú£ ÚJ\Ċ´U[sĠ~šò÷òڑ ËQnˆ-$<]=R*ŭ,Gy°/mâ&™Êe|^a[Tó¸Œ26¤K2'TžíôY`4uWF³5êêcf•µB†¤üš+$ÊLjJÚÌ%Eû{,g™<³Í›ÇTš0ŽĈĦB"uÍv^ż˙d5II”‚1DħB(SĈ*˜ĈDèĥ]œ^pî€Ğä‡vÚü÷ßLï%Ir%Ĥ0 7&“Éĥq?TÍ;ÒÂ2ŜG JĞżŭ ;#­aH -šĤÀ‚ àNG¸ë´Z-7ÇuŬÀó<ßqœ–˘şn›1ÖBô9çKˆV…k§ŸéÜù—_;uòÙWİÓs‡JŬ‰ÂċP#!‚6ĦĤZ3(Kò•=q•àÁԍ8ŒÌ´Q[F˘’}ınï-˙T@(ĉÁ24TÓJĴ‡ĴŸAEz³kRYf]bgXÚî9 \_•O+ĥ,˘2.êIċĦâwËffTĈ6”Ù옟Úڎ]ûa–GÖß³„3*לl0Ó]³ĤRÍÈ˘-vÍH—E9VIg˜bV(³ì˘O‰*,Ë´  ””bĴhÊe%À²ú lĊG*M"0ֈY gĠk{ÙMU:ż‰((ш ˜$„Iœ6–îœ:ÔÁ#\Ċ>üë׿ñŻŝ,Ŝó”òŠ”òZÇ70Üp{8ŽG£Q4b“™·ˆ”÷ħ³ĠßúFñE¸ó_4 é¤ü:êvğÜó<ŜjµD·ÛuÛíĥë8ŽÇ9Çñ…mÎyGÑáœw9çKŒħ%!Ä2ç|µĠëzäċ×Ν~ŝĊ£‡Ï?Î3ք÷B…KĦF¨M&›"SäO#˘uMÔ U§|frRɎâ5ieŞĤĥ2=AT—¤0Kа'{Òh~%ér] 6ĜXEƒ 2e–T¤vO•ë`Uö7Ġ`YgV‘rŠñäfJĴġÑ3ÒEħĴ`•û…`7ÍV˜ e?›Mĝ#V#µÙq@E+sé1jÀ4ï_BÙ²]¸ŠÂnҝ@2{7ċ,%·ŸĞħĥ”8ajF„ ²™‘}î²ò´IDq*Ʌ‰Ê_/I}#ì!†uĴ)•“Ó݁X*Ēi2À$1"†½ĥƒœ[s.üɵëßĝ—’ 7ߗR^N’äjÇ·&“ɝÉd2‡Á`Ġ$?ìvVÓĠßú†ıRàßo€´×“f9`€yžÇWVVÜvğíu:ÀuŬŽ˘ë8NŸ1Öçœ÷…}ĈĜ2ç|™1ĥràäé“ç_ûôıc?ışrĉ|˘‰ %á[‘µĦ xÓ:­ •X‡u~i­kٌŭoİ ħq? fġ™ “£Ü‰YŽ%ë9TFucŻ&ğäġ ŒJvk*Ġ–`²Ó°Ô֓ JŞHsĥĵîÒİSġ÷ìùVċB”dŬÉşĞ6”½NnÍz╿İUä´2e–.XUıωJ‰Ŝ’f`TXËİRĥĴ˜ƒ[5Tu(›ñe³GÍÏ+mħ%]f:e…-ïħJmİÈŬËŜsnŜ) Pb)d1kv‰³"}?K·`ŒJ,k0Km]–N+ W„‹@*  |˜àâMWœX{îĜı_}é°zï—nŝÑżü#1~à8Îe×uŻú+‚ †áp2™LĞLÛĊ™Tua­WÂc÷”´Uélĉ!=Pšġ½Œħn·Ë3—œiV]vg•sÎ9?(„X÷Úíg?ġêGÎ?~ìĜÓÏ­ñŝŞż%5nIïoĈ¸™ǘ˘ĵ Ÿ³ĞN˘ĞEĜµÒp9kÑşJMµıXY1£§L̒‹SŸMeMU„QfpşŽ}C5ĉ… YàTĞ­İbV¨Öğ*ßÛİ.„şşSE䖵¤½ıSÑ˜9&aêܛ mħéè²7 kc Ş–Wj‡ÊquÖÑôó.ŭޞ6TEOgêÍìşV~šFµĝjƒ` #Ì_­*6QUû7 0c¨_ÒÁtuĴ“Û‘Ÿa@šÙĞ‹ïW·+ËÚÍuÁ†Ş†ˆüĜ2€Éb$;Èv¸  qâħ7Nl}kß}ĝŭï!.¸{ÙuŬëïß‚`Û÷ŭÉp8 Œ§*̨ʖĉÒG–òžöcB0Çq?˙ôÊêŻ˙ÍżyüÀÊë'?á9ÂŬT„ŻGŻL0’„žËpÀPšÒwZ˜qŽI"pbċ9ġTPŬôë@ 5`D•]–PKĥĤ>!] :]­„êL!Òµġâ)…DWQ˘îġeŻA×ÇÈPŬ/ •e½:Ò4C¤şşSĈulI¨›ÈÊhfpµ%‘’ċt3’^İúdúe7ñêŠéÀŞUÙóĴ4•-Û(œo\’"YĴ‰¤ä%!¨lÂ+gôñJOT:l*^ lZÖ#­1œHŒĈZWú’²j+ÛÇíÏı›™z´]_bfh˘Ĥn=޲^ċ¤àĉAKĴŽNÇ·ˆĥ/Ö$Á‡Ä0Ѹq3Äĉ Ż·ğ§_˙›Ż~ê­Go˙á×ŝDl\}Ó0Ĥ+ŽÜt]÷Žïûß÷ñxœ7^öîĖêäĵû JqŜÒÇDŝ="bqCk­Ġ[ßŜüŻŝóöÖÊĦ;“ÁöĈöhü-­.·Ï?…îÓ/ĦsĝœNcbÜl:s–ÙĜ…˘hN5`S·yOƒQm]Çŝ>Í`N•šQ=ÍxìÌe^kúġPı2+FÏ2KÑÌż7Żéuê[4›ñْ`é=™ ˆ…Ü£ç€qġzט1$O[ħĉSYÜCAç b³(”ê<ÓnşÜha@!ŻeOژx…ù2›yĥ.ĤkF)ëÖi=‡XÙAg.Š5F‰I$§ŠóĈ]”Ù2²~VWÁÈ2I¤X˘séŽ3kv•İ3e Uĥ½ÓÔî/x ŒkpĈ!Áà0 \áĈ¸xq€;[ -_;ó˙è˝ŝŭù­oŝĞ?BĴ8ŽsÉuŬĞëŜr]wÓuŬñ`0ˆ$I’`[ŞîS4OÂğ'PÊî÷!™ížsÙÍë5Ê?Z­_^^vúŭ~°´´Ôñ}Ù÷ŭëĉœ€?vGÒ3MgÇ~oÉ?yĈYyòy~òYĴŻŻCs­²xšìŽ?M´ĉĤN£ó0M‚VġÒRQ^Ñġ?ĦvĤO}!MĠ-h'†P+ŞëñA­ìAöĉVyà)VUvĠç6ühök·Ŭƒ3¨–ôn%!b—Ŝ/]e´3@ırßÀí¨ VFYzÄ´}½#ž×`ċïa:z$˙FMt‘ž–éÒFŬ‘Ê=DĜNB‰áXBJ]JŻK›fDv£l6JÔ³dĜ ŻnµĴŻİ¨7Ħ”Ú>• O&ĝWRiĊ%„(‘˜h`4QĊ£DC–—]ġqÒÛ˙äżûóɕ·“$Éq_ úd2ı3HW8âšÚRĠĝ° ïnAiġ?üCëĠĜĝŻ>ÓÒGHğId`kkknŻ×sğŬnA/‚ëşËBˆ5ÎùšÉ[eŒ­mjvnKÄb)Y^ï>ŝ$Nĵĝ*:‡ƒm0.r)J+²Ĥ‚šL*7›NIX¨·~—™fњlôĴ}œĉÊm°Üt˜ ZTόĉlÂ%ĉ6çı-2B˘ëe:Ş}ŬT#ӕÓY+ïĉŒ÷Šf½‡şüÍJ°9šú}ğ^Çëè?÷ĝœxV˜1ŠÙHĵ§¸İMecÙRŞÉe0ÊlòRjŒÇ“Pĉ’uĈ¤˜Í„²ÇħSĴÉ·%k·¸éP¸K dÙÇYa¨°SVsbyë³$½rŝ_‰á`’Š 0iD’&„I˘1Š5ĥ4ĥÈó:ĜĈ‰ƒ-ê_˙ĉĠÍ?ŝÚïÉɝ$I>Œ˘èÊx<56ƒÁx<GVmi·iÓWí.7à È4Ĉnüo4’ŬÇ ÛĠ&y‡CÍ9×D”(FRJr]7q]w"„Ĝàœ_Bô8çŭçow…XbLèᵃ[tġô{ô;‡Ĉng)8qÚ]{ò9{ú9 · ν˘¤ŻX)ğ V:ÀTħƒħÒ.5‹MߙO[˘İĴfG<Öˆĉ³]ğ[×׌Şì…ĉŭM˔U² hzN˙ĠĴšQĠeW÷ĉÊt0Ò³t9`´s!š(€•öÛdĊ&q=-y2–ŝĵĦÌzËNeòšNEä̅aJŒÇ âXċÛa³!°4wŻtZµ'F>ÀˆÌ÷XégtnŒJ3§l™.Ğ1eò].1²äğ,ħœĴż[Ŝ2ÀuDf¤à&ĜXCp‚P„Ħ&„ŻhllĊìÈĦgžĝésż˜üÉ?û3~ùÍ?3).mÇq|×uïxž7䜇ƒÁ ‘R*L§†ëŻûc ·oîôŝ35ìu†4K­ÈY’çy‚ˆ¸!î¸ë˜ˆ ßqœ–ùh !şĉ£—ġ'™ٕ;G·4;5vĵ%ı~ĵwèéçّ^_Z‡pĵ4ˆħTĥ£b¤T#çTŬG×ğê蒞EĉmÊe™Žj6ŭYìÄ£™ì• ÔşëĴŽIÌĝƒ³ÌzŜû²ƒa8ׂ€žqâíŒhêqç<˘ċÒİİË2].ÏQNsJŽżR­ĤBJĞ$—óŒm)Â(”’t„A>#‰U˜QŬHx–`RĠKx(çàer`KnT‰"b62;J GŒ’ĝXÉQÎÔ+ÎŬ|:²NcŒİӆÚDa+ŒcĦÔŒ Üĥ‡µ‹£ë­Üĝ£K?˙˙.‰Âw’$ù0 ĞñĝĈ`0 ‡ñööö, o^šĝ=Ix+™dg.–˙òÓ }̀Ä* ”}.Î3Báşn jòë×uÛëĉċ8NWÑBôÇYâœ/ġn‘8³íxċ#½ƒÏĵÈ=÷XÂq‹àRMyÑş&ú†tIPž×ôJz–Z6XڔL7eĦ&Ì$*3şċ§jVzÖM;‰S›ìÔsĦÙġ¨şúÍ,™Žf1£™ U­Ï­‘9ué½Ĵ‘ gLµ£YĊµ0šuĜӃY ¤‹l½:‰!IĈ£q$S×ÀbKŒĤ'ŬVG§#g?(Ĥ°ŬtÓ ĥ†m1+á!K·äğrŬÈfC•Ïıi,Ï@Ğ$ċĠ”>-P’Z#‘İ„7‰&‘Â0TĜŽ4´› ™ŬċŽĴĝ8l˘?ŝożßşŬ$IŜ Òd2ı>6···G&z(™#áŬ׺ÒÊĝ‡Ez2gûöşd·SGôÔÏJ)IJİ£(’´B:Ž{žş;r]×÷<Ï7 ßHµÍÌ£ž8K×}Ğ/Ä2m_ûà̛żó/&Žtמ|é°ŝ Ü´pœO”BÛ˘Í…S-ĈÓ̳dĵ€`OkEŬïÏaFóê+vÍh–„7SĤĞäÑĴšQíëĞİUÀh&8k̑ÇjÀşlkÀP×,=½Ġԁñĵ$‚]€QUÖÌ#X™Áj2R—ùŬx’`<Š!mŬ…²JŬĤI£ĉÁf@dšTs·c`ވ2ħĵa·l­XUQk²ƒVó:”FÙ˙U•1ÊŒ‘i°eœ5™”‡ô{éçY“-ç6Ë+ÑÈċ–ĥx0‡ç½PŒ3Á0'˜$ ÑĉC‰ÁëÇĉİCË'×ĝŸ˙wżËksÎ}!„gԘÁĉĉĉd8ĈRÊêi]&Ü(1sApÖD} À³ÈÏ×1İê‡À”R€”RR†šs.…‘"ô^­L·H §’JN³ŒsÀh^ĊG FóžĞ҄É(Áx”€´Ş•(Cˉ—Ġ’ÒñîĴҌJEžmZ°Ù–œT:,ƒÏ]}ÌŞW•Í v¨Ìv¨ F0ÄSàĠ\tŜçDdÙÈm×_%Fž™žÄœ1‘(€SXĴ1š(PŽÖ%!Z~âħÏŭ½Ÿs˙ä˙Â6Ż´9çcÌBÜÀ9ç|<GĤT½Âĉ™%Ms%è>B cš7ޏzB¤ı“ZCk$I(ŽcĊK„ı´gÌùYÏóşëö\×½Ô÷ĵwW˘áŠzkûĝ·uj_[é>ú¤süċÏ@Ĵs|pÁAZƒ;,·’ħ´ŝĊT˘ùrU Ş*›Ù,£@­×bŜ˜‹ŠLW @ĠkAÏĞĠż†:•ĦVž\TĤ[Œ¨ŒvèÓ²w'›ùGFz°-5Fá$1ŒI×2ÒXRF>Ü"gCVŽžŬœmĉş2G ÙĜu]в§j0Ȏ7²Sî-Ĉ”•Â2CIÒCÁš(RHEìP:œR6}K:$˘RÍÊ6‚p–6ĠzÂ@q°Àc Lk ˘cE¸kÈġŜĦW~óǽŝó5vñ[c̜ğŒ1‡s!„P² ­ü€’™;=Ŭ²¤Ċ–*‘•óFÚÍ$]‘ĝĤN zmI)”: C9C7]ÏóüŒ5ùßö}żïşnÏ ËËû£ġx°6Üş~úŭ?˙ÑÑ3ŭġŜà,è‚qNʸàX™—fJW›68Ü-3˘Y2MŬ}Ġ&<Nż]Èt;ʓ÷Ĝg4³ïi`dϐŞÖ¨>J0˘d:ûs%5Ĉƒ“‰´gŝ|6@1ż¸Ĵs2¨@bFż´ÙP~’U²“Ês&UèÌ~ÌĴ7I&…ŒáRÊbN)¤u$n+YÂM’GIÊ#Vîq²›‡‰,‹ĵ`p-#/# \(l(D\½:B´äşkŝú§–üĠ÷îïúŒ11ĉ2Ĉ¸8 „|4%•êϽƒ’²f€è†!= , 5@”é·j‡ÇLey­ €VJ)) 0ᜇžçM\×ĉ´‘ħ&ß÷ğëö}?ĵpÈqVù‡£#·/ŭÈ÷~çÀZïٗÜc/½Ñ_ÀS‡RjOïö˜}šf&ÖÛ½hAf4e~+YŒëŬdD‹Ċí(S͑éî&›n‘>£İšÇ’0”Ê3LìY&u‘ñ6ٟ³êç*]\J)8Ž0 =Ïú`şûŝ­”1yWÛŝĝâr4X‹µyêÒw~2:öH˙À ݳ•Gž„èô \@‡R”ße"“?Ĵ¨hŞÔF¨şéÏ|‡îNĤ›Êĉ[ÔMGÖ\˘™5#š²|ϔéö é9ÌèÀHĈ£aœ2"MMIžS“q)ïk+œ|ÙyÂXFĴäĥ+eŬ™Ì-ċĤφĴPÖlôıĥjAT‘òÈULÌÚjžĠ“TÊŜr™ÑS%Íĵ€ôo ¸‚4‡vÓÄÒÀ`’¤S9G)lbPoµÇžĝŸùÀ˙) °Y0˙ôH))Š˘yòŬĴ €ĵž´ôĠß·â:ö_i/ŽŸ¨“ÖĜŒŻÍLŻùà ŝ›ÏĝÚĵÏK˙6ĊMÁ9çĤñÖ÷}żAÛ°Ĥçy˞ç­ĝż?8|›yç7ûëĞŭç^sŽÏ™QvÊç”}Á+PWñö£lhšˆ´N{K†ƒÁ€ĴĉY +TŬÏêMŒc?vÇîe†4‹%-ʔf1'Ô°£XŸóµEĜgŒ !„pÒċùï֔ıóúfÈàŞçyëaĞ{ĉĤÓ=}ĥ{ìĊOY?ż˜~Ş4(ëb–KŻv3•žµÓ\ùmŝĜqš)Óċà<™nfŸ‘^llÄ^£9éáJFĈ]~{Œêž‡=jV^ö?ğé6Ż1fñ*{`%Iĵ”şPfF,gFÈŬsÜêOâıY[ÌŞiµ’Ċa5öfŭh&œUi3[)Ñcq¤0 %˘ÄÔ{ĦÁï żÀol?òÁ?ŭ×ñdĝ”.mllÜÙŜŜnooGÖĝŠYliVZxʒ@ĜüŻ›} í”û•ôĉ‚“8Ž1AxAïw‚ èA÷}ĊóĵĠ ֓ sê–Ó9ŸnéĝËo0÷àIóÓ3ÖHx¤SpgšĤç!-h`Ĝħf´->B‚Ĥ\vu;ĉCF„YİħĊkÒi²ÂdœLƒüC FöAce,Ş­Š’ÀdK|•ôn6•‰—‰ FYŒP h¸%×eYxÜ0kÈ Ğ€)Š‘3JC˙˘D#LĈĦÂ`"‘¨bfA§…NÛE|xçÔ˙íżJ˘É÷&“ÉۃÁàòĉĉĉÑd2Id~· ÍߣŭHSÚ÷ŽEż~ŸĉÈu;TUĈc˜v-Rc™¤—$‰4r^ÇqèşîĜ÷ŭïû[­VkÓ÷ŭ[QŬôúaĝž~óNŜ|ûÏÏEgŸ]>úòg˜{ĝÀ<0‡AĊé§uzĦİêèXZ ŒhÑ͸ ;Étu`Dšv”éî;ĠĤvß0šeíĈ´:Ç“âġïC0²ß˘” ŸXiÈ%ÓT„·šĴ½B›˘RPj–œÁ­Ô29N…Ágœıuħ7_?d¤Ì³Ûë iSZDÎû(Ż‘üĝ.¤ĵ:ö$2„B„o ŬVĞĠ÷}Ċ÷ŭĠ R9yÓëœÏ<³|ĝSŸaŜá“`n-)eGšÒú´ÑèjíÙ ŒŸµw•˜‘žƒûp)(ġA€‘žÁŒ>0Š&£a)g1öM½xŞ/Œ”ĴÖyò¸½”S5(•³‚ÇĜ&…é™J…W˜ “C6ú"ûz1vŬ¸ŝĴזËw’¨”%…‘N§ïĈş8o8 í~ž/°|ë÷ß?rûw˙uEߍFïnoo_ÛL]Ñx<ŽÍ›Ğ,†TǖĤd˘ŭċŭ~hL _ùÊWµŻ}Í½cÀt=uĈÏW ‹‚“aXú^jKH žı ŒÊ£( '“Éh2™ ‚ ĜlµZw˘(şċ‡áƒÁèCzë'o|ŭGSO-}ċ³LĴŸw(­ÁD*çq͑_ ³óîê6Yqw6³Ħ9ŬĤT;žá##Z@Ĥ{À`”D íRŞÙéûŒì‡·D°ˆˆeÓÓóÇd,;]X^iŬIç¤*ĉbTj‚M˙Ÿ5ÍÙvıeœ›ŝÓDĴ2ĉÂD'Ù £Cš²âríO@)B$ÍUH3Œcp´qmċ3§[ÉÍזĥ;!˘PkËté8Ž•[aÏMŞğħžÛŸÔÒ^_ùÊWÀ,`ŞcP‹€Ó,@Ş'^#áŬ 0ĠĠ˜Ҟ&ıó˘t…“Éd†á0‚Í 6Z­Ö-? o FéíÁÉë|ï|xúéċ£/–‰ġ`ŽŸNÈÌo9ÉèñiŒËnhĈFM³\|3eşŒhÁšÑ#%5†ÛĤ—h^6Ŭ'Œ¨Ĥ.™Ġˆr²GcX§ cdċÀd;àÒ”ĥF˜g•Éq–›ÎüŸƒ”D`<›³DPÖ,˘ô²X1ôÏž H—#‘* jĉݘB‰Ĉ`Ħ×÷Ùğ+?óì3Éí;4‚ êt:ħ”R&IB£Ñ(’%úœ˙Éjóì"îâ>`€ŭ£˙ßŭà˘²³êJ´ 8ÍĞCeÀRµ/Ò`[ŭ'"ž$‰ÊlqG“ÉdÁ0 - ˜nFġÛ£“·>üÁıÉW—?÷ +‡!\2ViwŸL™6h’vbF5™yö§´ĞšÑŭ£r¸ì}#=ƒ&Ŝ%Ĉ“Q’oĥ MŸGÙCgÀ¤Í“İ2Ĥ˜tL³ÊkO98Íĥ”'9¤ŭ{™‘(—Ĵ~ĊY–†b6µ%F%™/'²*JdO›\Ááı„@*Œ#ÊĈGƒ8“ £íŬŽëĵıô3o<'˙Ÿw˘ħÖzlzéıÖ5Ê­*³Óꣅ@úĝ×S_ż‘7̧Ez•v N³Ì ğëcšÉ– 0i ˜"QĤÛAŬ8è/ŞïüÎÙĞo}ëĵxŝÎÊ/Âé1r8T¤ÀÒıê PzĈ(Š9`´{Ŭֿ͊W0RsžË0˘Àhż€0” bSkÀh“LÖÍJi”9r6Td¸CˈU\ĉù r#ï+FY¤`d"†,ÖÄrVD…ÌgŝÏó7iê½dH[‚gp9àğÇEI¸BàN÷ƒwâ Ż­ĥ•RN§3I’$ŠX)ÈXÁí#Ċv’îö KÚ?€d°ÌJK|â÷RYòƒÏŜIÚ[œŞŸcožM|–œ7ëC×Ód2‡a8jµZÛ­Vk3Ž;­$ıyv²ŭŝĈżğñôċïŭÉÑċW贏=Ŝêwb=£aZ^Ħû FzFùċÀhö>*ċ”M?_–Ë03ŸG8XêjÒ~˘ıÀрÑ\0Şŝéìz·‹W)4YĤʐ6ĵR.Ù,'TƒY Ĝ‹8”mˆ(,ĉdUŸ~+Œ|ÇÁà8 ËĊFq$0r0'èĥ]ĵÛŭâ/$W/yJm·Ûía’$aÇ*ŽcmIwu{ÎLċg?€Ò$bi‘²°Ž³´Àò‘>ñïŻÑ>{(?xwNĠ;“yĊg°Ĥjà+ß”˜-áÍĤ$Iâ(ŠĈQ £(ڎ˘h3‚NßZŠĥŬŝ7Wž|ìñġC/ŽğO܃0HE`ÜĵwÂzĞıà÷ŒJíŜÍ$¸Q™Z#Kż¤§c’‰‘ç4Gµ£{£ÒCQÁh³Ĝ¨,EœXċübıĥ—›²ñï̌iÈ&×Ĥ5ÔT~(,ä¤ÍËQžk%œóĵŸÊfI…d˜12Gp¸‚3Ĵ4)*¤cAğïüÈ˙ôëOË˙ášRjĞŬn›ĊŞĠÛŜ3jYR#Ùí!µ./˘żPmk²qí;‰]€ÓĵFŬYˆ:Ödë„ٍµ˘b3Ik­â8Ž£(ŠÂ0‡a8l·Û[qoQtg%ŽŻ%“×.żŭÔäħO-xöUĉ­‚#\@-5¸` eÍÓw FğNíŜŒh™n'0âœA3J§I‡ŽÓםġo·èĥĞ+ŭ})ÛdĴk˘£{#û1 ċĞ.ŭŸJğYQ>.°SÂkd<žċÍS7š²Ħ˜`éŜ‘ÍKâùÈ f²²4‡ K‚cz÷ÉÁGž%ş”:LJC+™0ŒğO-_—ïżv@}o÷ŭ­vğ=6-r8Ú) 6Íkš}èYÒCHD”NħÌŸ˜Ħ_ĠM lîc윰€¤‡@TWWbsd<Ş€ÔL`RJeŭL‰e€‡a8j·ÛÛ0 F×Ġ÷˙§³Wßûöy<óéîÊ£ÏAĴ2CÒÒ?™mÎwFw•Ú=ŒvcíĤšçRbÌ ù$^ĉs#Œˆ–ÓĤ~  :I˙­‘6+ŒF‘ɝ<ë’Ìğ<É=İL²µÏ ²oo0Zèĉ‚™çhKde7•ß`{Ĝež)3ö¸í²)¸<ŸµdöžfÓq2ÒKXĜŞ­Qïœ!Ż'Ċ‰Ŭ)Ç%ĦC+´;.Ŝw^<·ĉ_:ï)u'‚A§Ó‡a˜ÄqĴ8Ĥén–ik‘=Ф Ġ™à[kĤ²ÙHEĠàÄ ÉuĴi–!‚cĥ{f^}ݘ²4aEDJJ'IO&“(Š˘cò£èĉ‰Éàbĝ§[çŻĵùggÛ/~Áï}"èŒ#1†‡ÒĨ=Fċǝ~.Ĥ-$MƒvÒó¸‘+!8¸`P‰4 Z)(3ĊK‰Áv-5ç`.@ħĴŸÁx[Ħl`š“x‘kRԀяI™%6[ÊÜT²‰gžp²%9*&Òf'uR<‹%2 “F‘[=;?10¨Ò¤Ùݰ}“ápWÔà`*”$' Nç¨û|úĠsî^ñ}˙NĞĠÚn·Û“Édk­3+8ŸQ¨½Šf–´‰ŠÉ•ö-=+ö‰Ĵ^=Ċœ§ûĚĜµ§ş&šñù,`҄N—RJiÓ )`†á°ĠjR^ß<7|°ñû·ŸşñŜcÇV_ŝ˘pWñ|”L+ĵ¤èĦ£ìg8d¸Ñwŝ፠4D·Öê!xŭU¸Ë+€×‡Óî 5ÑĜ% °Ž“2*Efäİ–˘(ğݐc²ħ Jà’şÂŒì'Ï*ŻM7`DSşmħß ÉÎXğAĴ|ßTvG”%ĵ,Q<uµ%<“ÚMÌÈÖE˙Rʒ”ĠŒ[šUh’P2§_*ŭ9‚!N,a/ğqĦ4AĊñnĝÏÑï?ˋ·|ßßìt:ƒ0]YjŬtkĥYÒŝ¨!iÊï„fEŻîŒ>"ÖÄĉHyuó™fÉx6eıW%PBı‡I&I’Ğĝ$ aEL›Ŭ$ıŬ§nÜşôôĉSoĴĴœbyB€в(Œ4š=<`”-Ħ‡·°<ĵ–½suF\•ÔÄ& ŝXk*¸ĦԎju„J4ÄÊ!8Kkŭuˆċ#kÇÁ;Kà-?ÍĦˆƒâ´˜I‰N}^@˜ÓĈ/“F@fTŭ´Ä׀QĠJşhreT„ŜQIğ"Šéĥšħœ{ċÖpP:[‰ñŒ1fmÀˆ3‹‘™dğşÂÊÁ$YJ]vӜF‡c<‰ê,ħw§ž}νöĥçy7Moá¸ŬnÇZkmĤ{“°€h˙ԐÌ]O2µŬçcuĴ ˜otêΒñŞÀD3˜eÀ¤µÖ0EQ4‰˘hÇñ Ž­VoŒÂÉ·_z˙ûçzŸú‚9§ŬƒPJk§ŒÌŬé\’¤ŭ‰„;’:| :\,„³~îá3N€+`-7U|8ı<ŬɌ Į Uş –š@J›‚=UΜŒêjÇ%ĥ”Ġ–Lkîs€ı5 ,ßÚ-·Š&hnÀÈÈwܜNİÂRÈtY „Ɂ˜šÒLÚÎé3#.8ì^?ž²$" & *âƒsŬÛú­ç–Ü÷ŻùĞŬnoÇÉx<ĥYRvĞÊ>1Ċ’VÙîĦ$ff•”À¨tÒÓ\CdM‹Èyö‰ĊwL„úhYĈiXS†á¤ÓéŒâ8ŜŽx+ˆÍGĈ[—nŭ΍çnž~îàêsŻqġ(„p¨8 *żB]żI.F„9İŬġîÂ`¤µŠ1ĒàŻÁv°Ò Ĉ݇ax- ÛI’Œhž.nj w„Îç.Üċ.w9>çܓHz“ĝÒÒĝÂáğżß%ʵ ğÌĊÚ ¸‡ÏÂ9òxï @.8‘2ö_ ¸<}R˜LÍÌ1f Eyíd‘÷ù“FĠĞ2M(â‡4Ğy͘TÊkH¤ušggRżµQU¸ff¨™Ħ5Y–•ç=QuT.ŠYKd“Ċ3ÄR£ĠêâÉcç_t.~ÏóĵëAl´Ûía†v-ݎ!í+–´/$;ĈÙ4˙ é³•ÔGUĈZˆ5-"çéÊÏîLuu* ñj} €0Ĉ‡$Ž(%Mñ$Žqǃ$IĥW’äöÊÛG\}çİñsŸïöN?Ñ]ó9x¤@œCgŬè%Ù½ĤvÓ ft`Tí3éFċ8†­îzǽùAÇñĉx<57•R’sÎ8ç0@¸Âáé?!„k@Êċœ{Žŝ2çŝš/|Ñv|Îy+ԃĠñĈ÷W7ż·<ĝĤjmi·Eá9 ïÄ˧!şKİĵ')•ŭB â"ÍäiĤó8(Q&?­œ ÎĴ͜>Á`T"’ÖÍg!Ùħ˘ÁĥdÇJ™J98 Úԇ8t&ÓFdùÈs‹hMZĦâΒĉ+ç¸Ò  I GÒ~ĴscôŜóĞÎ[W|ßżÙn·7Çq8“ KŞkȟÚkF–´’*‡#m’-oßvÒG Lğôf Ĵ“÷ĝĤ4 ˜ìڒ Pd²SE‘ J[­8Ŝ:>^˙Ñ֓7>xóôò§àˆ•c`n+Ğ$™ ĉŒ›;˙]ƒ-0\ïîÀhêw …V§…­µî:cZ'qF£Ñ 1âœKgÎ3!³À)Z%„kÊB¸Žxœsßü?h t…hÔ덣Ğz`ûâŸô·։ŭïĴŸ‚wê8kgÀûK@húhb Ör@Jƒ9iZV%deQ468Q9Vç“FĊ…—G ħJ3“ùì75$)oÖ¤Í§…QŒéb4³úž –dêIÙè F9 UŜ–Ŝ€$ŠêtñáöİG:ïu]÷ŞïûwÚíöp0„qĞÊġ>Ż7İéCÚSEJúaÚ§4k~ÏgMóäĵğĤ:Ö$jäĵìëĥñ”Rz2™hT’$IbÓvÇ[m)7N‡ƒ‹7n_zvüĝkĞËçŸc˘wŽ'@œ ´ÊoçƒÍ`F;€Quêí.Á(½#%Àáé0ċ#Žî,/;Ħ+„`D”„a8‘RJ–:`r`✧ĝŽ„<(Çqç\8Ž:Ž“ƒ“Â7˙Ç „­ž­eWtœ–Ó‘,oßŝî‘Áġï.Ŭ–˘/—ŽxŜñÇá}ĵ½ĈP’2(–¨|s#i…½ ä’_^KaVñ'ŒìÔ(ÜôH1Ë*n˜Ĥ™›12ŠŠ6:nħ~mÀˆéŠêB[ʞ‹¤Pċ߯{_²ÑçJ" ¤u˘u+<úô’óáEß÷ŻAp§Ŭn0L”R³ìß3YRH'ë[lÈô!‘ûžÖƒĤYĴižŒ—ƒSÖżE‘26ñläĊ$Žq’$ƒVoÇá­äÛۏ^~˙ûµ_úb:ŝ(DSà¤5H˜Ä,ñzÖF²Q 3ş0Òî1(E¸½#ñÖ°ÙY?Ôvµ]×ġ\×ċŽ@J݈H#m6ĥ)KbfŒAÁ ‹Ê˜“#„). ×u]Wá9Žıë !×u!DËqœV[ˆnßu:§Zԋô•ġ[o_>ġĉïôîR×=üÜSÏAĴœ<\¤F§r¨Ĵı*%]~É;4ßîG0*—ohŞVĈrÒD–pW n˘†²<<ħĵôç‹Ú³SáİlGàÊÒ¨İRŭË´$R8¸:9zfÍı|ÈuŬËïßnµZ âÑh¤+Ĵ¨Ž%•,á›lçì 2gY9H}HŒ=X†ô€Éê~İeJzF]Éŝ=µ&­µ2VÓ$I’Ȥ8&I²ŬJ’ÍGÂÁ•;ż·ñܝG>uxùé—ı肚ó4Üz÷`D;Èt÷Fĉóñ Ĉ(ÔiĥËòlyËKKÛö<Ï÷<Ïu]Q)"²GISġƒˆ SK’$;ĴŒ[ËH{ÂqÇu]×qœ œ<Çq×u[ëĥÇi;ŽÓ=èşom;=Í·Ö6o|óĜ틺ĥÍÛ]Z9éx| ÎÒ)€·ÁÛNZsELd Z› ú„€QA˜n¤ĠĤFÄ([lù.u}ëmR”2$ˀŠY#32_éı]˚rë_VúĜ Ž'ħċœêOÔ;g'ıàûŝġVеáy^•%U½Äûb,ĊHYƒĦày;›Nh¸—^¤Lut{Q`â5E5 Có)ûżRÊ(y* oŒŒ7Šx”$Év_ÊÍŝFç/Ŭĵdë…/ĥ½#gÀœĥ‘.À‹H§œ-UÁˆĴŬ#)•އˆ“ô—YہÇŒƒmáş]×uß÷×u™BK)•FĠ˙×3"‚RŠ)rç¤)a”'×°2ßóĵÀuŬÀuŬŽëşm×u;]Çyg9pzŽ3^ڞĵ}âö7ßZż-úË죎{ú%ˆÖapÁAQ0‘×;ȤIÒċûÓ½ùI£ê×ËÖÔZŸµ!Qžìn$"“NVÈjêé/ĈR¤À¤K˜==M0MßX’_f×Ñ8ëd—î{òqû†%ŬjµZÑh+lËw]Ó}uvcjx +#]{MYĉ/*%ï`ÚœĤlñjKĵĤT­-éÌô`,§2IWddĵAÇv’lŸ‡7n7^Ü<˙úĦŜ£Ï0·w0•í‡Òİ͙ #U,4Ïèŝ€Qĥ)„“£aœßĴOë-ŜĦ£îxüëşçyBA é KšJSI¤¸RŠ%IR"QòÌr]×w]7<Że€İíşnÏuŬO¸îÒigseĉŸ~ùÏo·uŬ#O1ïĜ3`­%€8WéL?›ĉ“mäÜç`T}¨ô>)KëĤ<Ù!Ïğ³òžXŜ³lšfaĉ'ċÏĞ”çäUŝff×! ˨î=5#ϳGġ8Ç-Y}Düè°$Оçġ<ÏÛt]wÇqġĉ’íD“l·’)\òù÷ŒU2ö’ê¸3kÚ ˜tċ˙;Ġ–Şġ%1‹-OW)I’PJ9’R—äÛŬhĝċkï>Ñù‹³vÌ H¤uw3¸Žr‰ŝƒQu³Ó’0Ĝސ$Şĵyé”ıiİ!–cğµzè€sħcd;áş.XÙn'PšÁÙë?ˆˆe,*IÎQM8çNĥÌóÈ>Zëv<Ïëxž×oğîĊG=wYÓĠƒ7?¸öȍwo%êŸ ĵS/ÁY=ĉv€PA+hŠTċmÒsŭ FĊùD$Ħ,Ù!%?şï2 ²”͐&9˜dĈŠÇÒ(F^°ŠhHTNË'Û^ƒ¤5  I,Ħ‚CÎÍèkbòŽëşŭ Zïl§1?¸ùĦ]ûÊe—İÖ]PÁaşÀTwrΒíf9ñjÇ4ĠêÌ%nf0…I’Œ“$µœ 7n n¸ñÄkŭ³O3ŜY#@efÁŬFwFDµğ# ÓD5›c€R1·×1ô—Û‡§ëĤµ$×qpÎÉH#ş”téöx€TùàDĤ”,-E%œsÎ'“ÉĜH{žïûž‘Ïóڞçu}ßïğ{ù€ç½$HVFñğ'o|ï½c·ÛÇWÄɗ¸{Qp·ŠR։¸IˆÈž:[8ö‘Ġ³UMQÈof›0iàYżQú;ÌÜÍö†ÒXûü—íğ?ëy™TëY¤rc€VĴu7FĞGŠ‹ĞŽ,ùßñ}K͑íê$ŭ‡JĥsöÍtá{ġÔFDÄÊú"awĉ‡E@İjpsjOYSmnz0ġĜfK­$Êd³˙Ñ—ĵ÷Xï…Ï{ÎÊqÀ‘fıià˜jRgÑtÁf"`¸# “Zù6wœĊÇFm :+îdÒò<Ï÷}ŸÇc=êLĜIşC}Â{é߆=eò7s­!Ä03]xž×ò}żċû~×÷ŭžçy}ÏóžòĵĠ“tá•w>zŭŭġUqòEázÌëĤÀë˜pW²ÀŬŽĝ€ÑÔĉÏÒáz™ÇŽêŝVIì4£.Jùy@YĞcı„;£ŜĦCŽXv§cÎOOÚnÎd;e˙Sşô^şŽMĴôĞBˆëş-Ïó×uKRĥ[=êdğĤ†ô ³€ˆ¨Cœ î#] âzè_îŭ3>ìFĈĞšl&•%=è0 mĥ”Ëxí$—?ÜÚŝÁ wÎż~ĵsî.şëàÜS”è|âdŸFIĴ0ĜŽĦ-F)—‰4CL…²uÀ›´W:aĝŽ‘í!’$İ‚P]ÒNĉ†E˜Ò<0²˙/,ĉ¤“$áVj{èûŝ8‚AĞĠÚ4Àt'‚ÛË~|c5yûąw>ukíİgġIĈ;‡_qZOsòĴ€<½™J÷'ĠĵĦŠĵp”ši­yJU½ÙğBZ—Ài&-hWړ¤¤TbÉÙ˘-)„h{ž8Ž3D9İ‹ÈvCiE™ˆŽüì1`dêí<Ú ˜¸“ŒÇkîŝİ"ċM}nÙµĊ”bcx˜H)Çm)‡ídüčëOwžysVpÓ;s"pó×µ˘Ê•V΅LĈIŬœëÁ(Ë1K4à ¨DÁY=‚ÁġĠ#Ğ΍뺭 <×uy†4‡ĠıîĉÉv¸Pâ(OÎżND*Ĥ´‡9'“É$‚ağŬŜ6Ŝ6‚ Ŝ8„7mŭÙı÷îĵ{><ôbÛ9˜ÛME –îÙÖ­ÌÌFڇŒ¨´mPŝû,cDÖ@?*v•ĵ—(•ëŠ!~Ä*/‹ fDÙhšFÙP0 -%¸żŠÍ°{´+nġÇi›~5gÁsŞÉ²ûXpˆÙEHsr1fħ'sòhìğUqä-F;Éxó@‰ÏĞ+eÀTeKRÊXJ*ĈmĈ§ÂáĈĠ­›/…Ï~aıuô0Ż &aIĞ L\Q)ûK+Âövi1Ş]‘½ s7, bù8ĥ½ċġ´ŽÔöRğFÙëİ2˘şh! ~X0ż³Ŝ–íô,‰W@JĜržR*ï 0lµZ0 Gív{;ŽÍV+ÙxÊ]şucôô…­á Žhw}èDòTĉ†Ž3[ö!Ùömf=ĞXğğw!ĵ+ùuĊŸ¤²t§+çßĴe67CƒUlŭ>sYOÑ6ħSŽ‚›ĦşkĝĦ•îöĊ€>£ñ˜ĵ 4€eòÏEš"oj‚Ò‚ġŬÈx³@İj#ĠïgL‰ˆ(Ÿq‘‚S¤” ÛJÈ7ƒožż½ŭêÉöÉg¸ğr(-°'”ÖyĴ 7 %†ƒĜ²ß%eS>%72‡8F]¸ŝŞ„,JÈóĵŒ%Ù 4ËÜ@•÷uQĤ¤gÜìĖŞÓ3Ĉ¤”ÊĤ(ŠÂ(ŠĈQ â8ŜnµZ[Ë-ıı&ÂSï_¸ŭÔĉú++bí¸×‡NTڛCèŭFĊԓLĤ+dşbêlñĜ,ŒħêB™íğ8mi͂r@c‡ëûĜV.÷ysŜÎò9çĵĈĜ€šëùĦbJûC²ÓEz*™éŒ`,§Ġ,aĜÏkġıï&f›vbK%Ĉ”Ù3PJ’$ÎĜ’”rÒV[Éèñ+·Ż=CÏ}Öw{GÁ}H44ÓPœ›1ÂPÖï~wFÙż’tĉP2‘ `…ÛkǃÉè&_Îu‡Íxíz@ډ%ÍcMĵPĵòù,Ĥ”™PŞÀ¤,żIh˘ŸFI’ ZI28„̇ÑĉI,?ÊEç0´ï‰,ßĠïc0Ş•tŭÎnšEÊÊÊíG]ż2 ²`J´™ÌÓğhRRùNߣsHˆ¨cRÇqœ$I$f÷#=”k’ŸR¤ÊÀÊÚí'`-P_š'Ŭ [šbLY3­ kML‰)ÎĜRKÊÉÉp´ympûÉ3_X Žœ=cJa8L ußÁ0—C‡ €sè7–uÄċž8í |×uÎ9ÓÎĈ)ÚÉÜPǎ€Ù½JzAŻ˜t0%I˘´Ö*IGGq‡fĴÈHJ9è+5x á­·£ÛO‡ëÏ˘sÌġòk)Í2.´Ú·`”;íÌ?X1›…×.ŻDĴĉ)•1Û²}ÏŬƒŞÍKJNğÌéb[µñ͖™ħċ !vŞĠ֑öşħa0¤LĤ3’³n_Hg͐ûáŝá֗ĉÉxĵĉçùlİ)))%2CvÇnז蠧 ĉöÓ÷9L 0ʔˆŭĈŒ²áz€•ygLĴ8‡òh bċ+D—ç/Ħbû^Œ²/+•Ŝ@ƒy}ŒFîòÁZœó@á !ñŒşÑnU‘îŻbg%ySy˘cê°Ë(3>që.eĵya­óĜ’˜QWÒ0ö$I´.ĉ§'RÊȀҤ­.ŒN&+ͧ·WŸµS 8†ƒhĞ™yaw FĊùÁžÊwa°ÖJüî!'Šz\Çq˜™yD;€ÒĴŒğş$ĉEĜRġxĠIyó@i*ĊŬÈxÙ˙eV×K’$Jß5>ÙJ†KÛÑsïëĝ-çÌ]NïÖ̟)UláûŒ¨ztív’ŠLWNò­<{mKvzĥR7 Œ²÷DI0ĉNċ´¸Ë[Œ\ÇqœÒ/ĉœ{İá#ßpK²œĊ†*çÍ~éCúˆdĵE"ˆ¸%OÍcKu $òkĠ°$;zHJ™(2Cx"úƒÍĥnj¤%ħrà‰”-ĉnìħw FYG$(ÒHÀ zħĴ_mvM˘çş˜L&¨ß§¨Ž%ÑLݎ1ê ÓĴÂ`ġ énî„àŒ-™c ,ĥ)˘ž>ÎÔm˘'ÔÒ9‡kÜM'Öjڗ̨ên/.mıîĤ_ÖĴ8 {£â cà­>&ÚġccÌ7cµxÍy„rŬCcpĜáŞ);Jsì˜Ġ[½/O2í$-Bïw–ĉš”²Ô·”mŠJݨ­Ôä´üÎèf<|ċúñá!ħvމî*ÔÂÄĞÀ„q%ë]‚‘Ĥb`]ÀOS,ŸÄ–·r`5•íşžç­VˍF™£i0-"Ûġ½bUın‘ŞáĦ Pu€Äí"˘$I4)­µ4NÈD)+âŽÖÉôÇÑ9='Uâ ÚàJC“U6ÓûŒÙ*‹ôĦ"Ħ$ÀԀQaż0‚6'wúÎ8&Ò Àx‹sîqÎ]!DfŭžuŜ<”k_$5é\š+‘MıµıĞnÖŭ0=,–Şĥ¨² ­5%IB–„—S¤”ŠÖô;aKNžû0£ġDŽX: ŠŠh3Ž³BŽ]Œì݉Ô„€#ĥZk}&IJ“ޤh™‘Ü„ĥîäfÚ Şg&fÈy³>ŻF ͚w5o´H)eCJİ•RkRJ)ݵNˆ(éÉ'éëÉUòbÌàs˙ H³"ŽKegí+0šġ|Ț§c Ÿú3÷Œò›&36]´yLn1ĉqΝlŒLğYLݤz}FJ­-‡étOÖÛÓBĤ‡ĜjĜPuƒžÉ”j$<İ”ŠµÖ‰Ö:jë‹Ñ£r²ŭÎdûYyìY_,Ÿ„Ö Œ èħ%Á@ -FÙĈÁ:š$@”@ûÈ_s&ŝòQ'ŠòÎxÇqxE³4úċE_'Í͓òêäğ:`š7„1żI "’RÒx<ÎsÍ1Q]@>I”üP'/‡]Ġbí`\€&qñ*8ŻÄZï0²{“4•fKżZŠ ş0šÖ)Q €j·ï§€äf „Ùµ£†!}Ĵ,ɸérWÑps0bl_&5|Œl‰cvħ~cuߗRRj“MŭáfcŒµÖq[ëñäïGƒ—Ç'žX9 ˆ6x‹AO$(1 ¤ôâ`Tşv5 TBpVcëöë›KÙ ß÷Ŭ0 šIĜ--J ġ--³jIuĥŜ:`ډ)ÙŭTÂXÛ†avJh"ÒD¤ğDô¤ŝcġC×e,ÜËàŽ€VÚȧûŒê™Í}žtÀ(z‘”dÜCB˘ĠJH0Ĉçĵ„ĜçXHŒê‘ƒŠìÄfŬ7ĥTuâíäÀ›etÈÁÉ4Ò*ˢĴŒ,îhM5ş_½ul|P|Œ/ıĞŒ8ËkL;‚‘Ù$˜`‰† ħ|ÎÒÊa!úBˆN–°<‡µÌğài—ÌİœŞÇcV3m˜ê˜’¨9ĥ„ d@Idʟëcüëü,x5 0gŒŒC1sàíC0ҕšÑĴĵ_hš½/ F5GœñÔxœ6"í´¸!ĞaH³Bš^$gżmĴY*)“Ú`YTİQìî…-Ísâñ H‹5ÑV%=T6EÊêJYħŭ ~+jÉÉ Ávè .‚uhĈSžJk‰¤ha0Kċ>ĉrPĴÁ}¤u CŽ·ê8Qĉĥó=Ïs&“‰ÄΉ 4ë}­n ‚S]ÍiV-Иvê+ŬdŞŭܳçßcŒ=Îŝ½ó&ûÒË s=Ĉ{†=°œ0KÂ3uŒ)))eb,ÊI‡(~Tŭáè]żz*½c xÀDĤ6]†tâ§ĤrĞLÍ&AJ§ ¤$5xï(6œ=Î{Yjƒ‰k wh‰E7€ÀİàĉSŒ ÌwAV ²÷ß#³:]vÉ{Äŭ“Î[í×Ï1î0Ż.·OÁˆjû##ûL€¸0ÍÛD,„â•Ò ÚInéŝS#3ÉĜ0ëœ/éĤCyòw³>ĥÌ7<̓fŜ­g­yJĞi]"˘¤­u|^}=|?ż::štEï8 0ž6ğfğ!ÙÛĝÔ&a ³a-5ü^ÛîrOû·çyA.ç\˜Iğ ´Üfż@²Ĉ"ÀTÈYliĤtWaJ9(™ŝŻğùĤÜ?Ôż$ƒCÜqW€’Œ%6ü}ÁŒ>0"VH”’^³ƒe0 hÂU÷&M˘Œ%ċéŜöĵ¤İsşY÷—-Ġ1¤ş;ġê%¸£„¤µ†ŬŻd÷Ëtˆ’³êOK:|mȧÖDï˜×M·…tĈç&·NÏÜH+0p€´’öĦ öz‡Dj˙îxžç;Ž“$Ùu ċ½ĵç;€Ó"ÀT×36ï8LÓ]­“(Š&œó ”’ܰğ[Oğx˙ç=WfX*œóñxĵí8Žç8NĞç\ïœîüùáw[ݜ†pÁÈLšUĉî£ğ#‚Iş'0R˜Ŭ°´?äşŭH@zÀ² Ìjġñ“İúqJxóîÖëîîu€‘”2{ùĴ%ÓH+;ú}yF'ÑûIĝ˜^{Tpw ĵċ¤î;i"¤tñKF<˘Ôܐ(xm˙@—;Îr֏äûç8ŽPJIÌK>½cÜÇŜğ+R}˙gÉws—ÖšĊqM&î8Žy^ËuŬîò?ŭÎÒݧl)·KN;•˜]~& 팀´1–Ì ·R…é‘,gŝ<óBH~"]‘ èCŝ˙ü‚j҃`K˜s·Û~%ÔÈzFÉPÇ1´ÖÙĵݵ–ş˜<&ñ;2~V=î‰îÓ @…Í[ËòžGé|$ĉ0@3ÈP½CÎ`ûÀİ Š~˜ġ#ùoÇĠÑ}“êWeKĵ"Ħ."÷äwáJ)ÄqÌ'“ÉÈuŬ۞çµ]×íŸĵùo~ĝ½˙ÁK… ̟ŭ4`´3bĉ}0 D¤Ài¤ s`?­ŭQCb,Nµ/Ofßđ†A6ë`KU Ż˜fì 3Á‰”RYfsCD¤ˆHvˆäcômFŸŠIĵ}Ìéô5"ĥžZŝ,ŒÄË•D˙6o,=ÊŻöMĜŞïyž+„ˆ-Ù3äğ:—á^`ĞĠ¤Ŭ@J™„a:Ž3ô}˙ĥçy½Ŝò;‡£·N]ag×ókRSFwF­Nû+…CžVÁ³Nˆ}iÑzĝUÍuÈ*G3M‚6ŸçŭëÍî²E\xĠqV]I̐÷%†[ ¤²FÚ‘<Ż˙P§ä+“ŬËÇÁ4‡İiOòñž€#À8À[0pú=aĤÈzždcÍ+ħ˙¨ÓŠvcEô‚²ÎTL’Öš%I‡a8Ç[ïßò<ïú‘˙ö{7Ïü½Ï%X0Ç56pó›Š0Ú ‘q+ '}}2†€JˆHš›.ʌ> íÍ-ħtİ1n1# ċŜhvĤ8kíd Ż‹š2;H)†!²~%sÑŞ‘<§ŝ ~OÉ7†ZvE˙ ¸âÌÔ9´.ljI‚Ö Ž1lê(·µ.DÔs]·íûçşHÒ1²ğ²ÔbwaÏßIşc–P•î’Lş ‚`÷ŭž7¸trüÍëï²gŽÂÌ%#˘Œv FfŻ&A 'p›l\HH{QħKƒTËqñsƒ5†=(áó­á³.éÚz“Ö&Ù!gJö˙Ï^ŭ†üPÇol“^fc`"Òé³İ+Ĵï4×`àH`ġ˙ÏŜ{5I’W‚ß.C¤ĴĴ,­ğZ˘B5ĦĜ 9$×ÈÁCÌĜÎÚĜŒíÌĝġÈPY"+2òžĥèÌÊĴĴ̌p÷çûÎw>´i͜šŒĵ)eYĥaz›)“QSнHݳÉKeWH•î˘0 =˲6,ËZZ~í“êùŻÍù!£€)@"0)EEŠšŒz~o € ³Va¨¤4!Ĵ2*‡ìwFiĦ´Ĉ(\ġ•†™U‚B1xĊûjWìÔò;Ù‘}gCÊR?Ȳ’Lm3W¤„Qa“`èÔ Vk³3„4dKöoÑ\×IFÁĝHİĝZŜĦ–šŻZöˢ( ÇÙJ’dĠJ‚#ák×3óĊ †ä\+£ŬQó™ ‘D(@‚Ex 3YÄg•3p5! Šì:(9ëšQ1HŬ•aµXK/è5RêÖlÔpïjp(˙Ĉ˜éû(+&'VŜˈÌ^\•|WO²]Àq–çĜ˙(Wİ R‚aş°Eg'0Ĉ„*Ôħ,Ë0 £ÓŝŬIL²ûñşwÑ˙ju˜ÔçrPèĦÚŜfYĈÒ4Mâ8ö8Ŝ²m{mbùĠOkŭÁœ×1¤cg’&£Ħw1ƒ„1H Y6ĉËgî2‘ß ĜŭŠMHġ¤kE–µ‘SÛcAFş…4 ¤4LIK@ïeŭNşĉßaŒB˘<Ş£(ß ÈŽŜ½Ìİ/.:‚+ǐXÂdĈóıLd¸AW™A0uÜHÓ+Êŝm†â8Ŝ“Ħ‡ô >ϧè˘`;ÉB`ĈXEQèş—Ĥéş{ËóéĠÍ>9Ğ=Ô~áĠdÔ˙çÂXŬšaİXĤÂÀmšH4ġ˙ŜÍ ,’RÊT‘ŞÇŬôö Y…İA‡2¨´ÓD´OJxwċƒ†8û-ŭ“%R*"‡šG‰CĞ òĊ;N ÉàBdÊó;T)2¤~ĥéäÔ<ĈÍ-²ĥm}$ŭ·v>”Ħ‡HJċm³˘J*Òj…‚3ĈÒ$IÂ$I<ĈĜ†µyŭÖì™ÍÇ=Œ„1€ èĜ.Ğɨçkˆ\­‡ pˆH„ħ"U½;cĜ …$š— ­fRùŻÔ`ÒĜ¤ÔyÇ^&~x=•’”R¨ò]q!ċ fW?HŠ?ĵ ò$ŸdT”ä†Ĥ)Ĉ <ëP]s†Ò´Èµ3mÛ&Ad]ÒÈô‘<˙Ŭ^ƒ²J’=HI”Ëv€³,˒$‰“$ Ò4Ŭβl£ÖĝlËrżî$2'™"z!Úׁk2jÓR˘–KHĉkÈDJ™!ç<+jzFìËRŜ'$ќbú]7"Òd4¤Ô÷%†Á›h;˙ĵcfI!“$‘êÛóòŝÌÚ'|ñ–„Óxò$ ³2y<<HSҞĈ sêT5>RöoƒRŠöùóßí†uyEÇÇw((’XšĤcÌϲlÛ^yïĈÌ/Yô@„€ä­ ĵ&£îŸ+ĈXšé3„°8„ûBˆ˜sÎÔC ¸)ÓĤ†GÊJċ2]QZ-'IÁ5)ÒEħP CŞ%è¸ö+ßuûQ¤$ İ–B9)­&ÜBè4@Žr9!\‚1{ĥ7'Ôñò„ZkîĜĥM}ßGŞżŒz¨$4Šˆ¤]JwŬ“Ûğİ$–$IĴ݁üċċ:ŜŽ—Ĝ OSO3MFC""@FPÌÖUÉ.β,ë05솈Fú"8„$vöŒÊ—·bۀ€ˆî%íó^/R”{G:HİÈĦĉcv3 - §ÉÄ1£2á£6[ĉÌÄiBêĊ<’ê#Ħ.׆^?;ыB·ċ·e;Üñ:`œsžĤi˘T’—eYÚŝĵaıOÚq˜$˘DF¨ŭ%<èdTŝRBA2óeÍÌV“HDY–YŽ~Ä½nÊFŝŽ| V˜Ğóˆ—Ì P* ‰Q×,~}GJ²£Tt/z)„išv’DÁìú' ˆoc|’NQ@nŠUħ9éĤ†;GÒ´F)µÍ8MÓĦŽÔVIċçüsvö“şġ•:Í ,MӘspÎĉĈg+3'Ÿ›[’|Ñ)ĉ’¸&£ò§lքĉ°“-ppœ É=ÎyÂ9OcY—İĜ~ëĠ MHçĴj ż–_ ċYvùj ]ħÛï¤TnşWAğ}ÊwÍ=KŠ”dr×(R’‡W/Çô%“Î<`Ğ Œs ÓG`s{êÄ,ñŞEeYĜ÷ŭ]Ñ£46ôyŜ;/l¨£|‡şSù!³,cŒħ$MӐsî“ġ+ ġ ĝİEÈ$Ŭ£Ët;Çóê‡ËpŞ&”çÁyN`żuLŒšĞs2Bƒ îÀ´68çÛJ!Eiš24–††ñ $!ó!²r[[vżdéè MJ]ˆw9MsDÇ„"$Ĉ9LÓ4ĞwŜXKgŸğ‘$I#Ž"[L@ïúŭ~~Ž{ŭŭԓTûz¸PNqê1×"­uĉu\22*òQ,Aúw`ĥ*W³,k0Ĉü4MËŭ£aĠë³ËU÷9ófl–VH˜”zQg ʤ”e™P@ĈKMÓ$†a {m-äĵXßÍc†‹ŝ—ûûëY&jû½Ġ†ŜLJɔÊ˘ÌŞŠAĤYi0ö€“Qñ>1 ڔlˆıâ‹(Ì<ĈX¨Bk3(™Gzgû:½a ö!ĦĉŜšĉñ%d>[?.ï_Ñ8ˆ¤T&Ĥr^7uT&$ˆX!xšĤ™išP¸ê”›Œ'I•Ën,îR{\~Ñrjû³BÈ\JÉ‹RRœ“Ŭ’Š2!ÜRH ü›0aĈ>Èl=˲mĈX Êu; 7 ğoŽÉñPHŠŒ "jË­+%6è‚Ŭ%Îĵ;х|vQ™”@¤i ”R ”‚"$ÁĦ"Ĵµ—Ùbż?·ŭtû½UšzaÉPĤĊıĥy]”ŒÔá§Ò“Ú׆0Í-ñŜM˜ĞŠğY–m2Ĉĵ8Ž£4MSUë7ğ1 $Y*ĥfšë&ÊKĤ5Ò8’’RʆeíFT²!•H Tì? yA€>e•ħy ş)–@ÊŻĥ„ †2 e;×!2‚&ċ7Í(ï!ß­Šsp=ÙvÑ?JӔí˘$û+šöàt²UĤk’QyQŸ(–Ĉ8Ğnñ@eRêTBŭnï÷+”Ùġ› ‡3 Q*Ğ$‰RJ!E&@ä–o‘ĤyZCĈ(ĦÒA™WΗAŠ­ÏaĈŽ·‘ÌV³,k¤iÄq\Ä <´ŻÓżÇ¤d§zIyŞ7AŭHR“&£VƒJIö¸˘ïïJ@˙ِq–è} qĈMƒ€™ÛšÓl×ŭħQFmO "/ŬáŬ†Óh‰1ĥÉk(3C*„à0Ĝĉ½ë×eԀÇî”hbÔ(¸ÈĠ‘žA:8¤Ô£tÖ+‹­×ûm{~z|Û׎3ù ë,Öyï6ŠIqNŠ\!H2Bí·FP ˆÑĥÁg]~=˲­4Mŭ$IÂċşaûZÄn”ËrĵEıHçÚD4Ĵû_ij…XöQBûz7ÍwÜ=Ÿ—’RÍíô£Œ U^ïv‘?`ÊHB^Ĥ“<73 ÒûWĜĤà|#MÓí8Ž‹r‡.™ğ!Ÿŭ? B*”ÏŽŝ—yy@‡ĴjRêEJm‰ßCüŬ—Ĵä3ÎF†^$ĠQB1adĜ†R]ˆˆòÓyȨuñ0 ’ ˆĈ-˜?„n1Ĉ6cÛI’=ÜuƒÌ ûöxÛ÷%;DÎ![³„ÉeËä q`H݇šÜĤD" ÷4̂>­ىCvn @Ċ†ĜfŒÊ`a}ĦÑĜúéµ9·Ûşw¤ „baŒ]³~h;“ĉÚVú@Ȩù:YAŽž2*~X‰Iŝ{PDs°ÒċôH}ĴzGQùI’Ä]ÖL3Ĝ€|7ƒV¨ŝh緆Ĉƒ"Ş „0LJİEqŬ#„!ÏO@pž÷0ş72êĥ×wÔÊt¨”èq>œ/€aÈĝêûMuÇñšš;êTGğMžoSGûı÷9áŞEϨ(Í&)¤ZʨÉHCĞ%Ôía1 ˘”:cך>9ċĊ<*2½„ŠŒŠjGŝuêÈ2Ž.)bÈ#’0L0ˆÍOÀeKÑÑ |9MÓĠ;òULï˘Œ†‰ +Œ!µ^›˘D'e~ K•Î 3İ]v2ÏÎŝÑ0F„l5 Äğš5}ĵ²0€4kOhè1ĜÚNFíÌ×^‘;kV#SĤƒ– D(_—n€Xż çĉè ĈÒEŽĥ£(ŠzX½Ċ=¨$MHž”â²m{ĴÊɨĝ˜ŒĠx(Š ävo˲L0lJi…šö$İ­,Ŭ KŞH¨kŭ`2B-ËÂèğé:9ş07 Ĝ  6>„)ĵŜ˜İÀÇI’܍˘h3 Co€:Ú íûrŬx($ŒÊ–îüXȧ›voMF÷J8ŬŝÜy%FĤibĠ?r !ĠÊÑǏ ñŬ­¸UÈR•ɵíùyŬyE#¤Œòğßü-Á„‚An|*ÏĥişÇñj†8Ž>Î:هœz}g­½D‚6eT’·ÎÉH!tž†ĈCPF ÊuĤiĤiڔRc\ŻúH#H!Ÿ{M!NL;€P‹„ÚċhÎA[…Sñ!˜ĤÄú0_ 6*żš$ÉrE›qê(BÁ0ï ÷ Ĉ˘f:Cóp­UùÚ Ĵz0VCc@µah‹wù1ĈĤiš†aĜ„*!¤n͜İ-m3–ĉCħ”Q~ABM5”÷›ÊÙ@¨‹Ûğ²2Bj½50á} ¸qMœ>d~œ$ÉREëŞw˜;êFPcx˙÷DyċDQŸ.Ż4/duÍNCQ7rj#&J)ÎùÈp(u³2uˆTğ·VÂ6uÓ7(UŭŻ £r™u eXAu†ĤˆĈğoɉt™û2I’•(Š6Â0 Uın·ê¨gÂ÷¸Ä\GÉ.×ùĵôa.JÎ:Ù²„khh CBƒúG͏B°eY†išŽaUBH½~ĉùÓ ´`YÛBnd”§ ÜœĤȨ|͕ŬÎyĵ5dñLäî:„S|2ĜÉíôäŒñ~’$Ka…aèİ|Y"Ú­:ĞĞÚŝ_?AZÖîĉ>™yġAÉ$”ïIÒèÁBƒ#ñğö0ĈĜ²,²,‹RZ%„LԎ=5ğĵ•´Êi\4UDĞÄÖşĜc¤L …2*]kEOÂ=ûI{§Œ„’q¸ JA&wAĴÍ×2–Ŝ‰x% í0 ƒ>6oğKġ;ŒÇú‰Ò]’,­4—2WIRÊ<ÇN÷44îU)ġìİreF…RZ7ìÊĴ}èÜä—ËcÍ@Ġv*)#€–³(Ùİ X‰ ğġğ³âħ×dT$0jY10-ÀXżû62·ĥĤ+ècŽ6˘(j$I’t¨#ŜG!ÉaÔÑ8Òï˙ËŠÂڍŠžQ1—†QßĦ÷!ih솄ÊîEPXıë¨mێa5JédŭÔ³g"†ñíĠ¸zܞŬžÎ€0j##¤öAġÓĤ´9•h@˜‚żÜ¸Â/u.Çqĵ†áj†›a†ŒħT‘)"ş×ù£ħ-ġŒA¸jŝ+H.šç B­—VèR†F˙ó¨:êñŒ1vÇ4MÓ6 £F™ŞŸ|öȆπ%ĵi÷îIF(ż•ɨß·ˆ“ŬL{YĤk>C8‡€ €m_zÎN‹;D²/â8^Ž˘h½(ĠuħyKèî} ÔÑx($%ŬVÄ$EkiA­r^İl ĦĦħ+µÔë)Ä4M˲Ĵ t‚ĈĴ{ĝħ‰/CžÌx^ħ ı,_€ò^o“ŒPğÛusÓÉöԞ’ÑŽ|Ş€ B@l\†šX ŽMÄqĵEÑj8Ž6ïÎ@ĠAÙuc}Û˙ İ”_× c$(?ô„ŞáaÔ~@khhtSG½˘näÔ|żp×İr]R:5}á›ç²èÍe€ċĦ޽Vĵv’Ru /1ì`”GBF…:Â8OòĤù̑\ż$/u>KÓäNÇ+AlFQ¤iÊTïˆCïrŬ°D$Ìŝ\'5ŒžBjW·R(C1´&!wĝ”ŽI Ê¨›Bjû”8ŽcZ–U”NBĤ'Oġèòf I’ċgd9ĦÚ^Ü+dÔÖĤ‘-Ÿ”²YàçñŜ“QÁŻ…‘çŽ^_yŽ×‚U×àŸFQ´†ázE~ÇI–eĴ ‰{SG׃¤Ü:ĜxÇjäb:#ŬGÒŽ„şQ³DÍĤ `0°mێišUÓ4§ìÚÌóù‰+·<œƒÈDë<,•Û@`Œc¤†^Q›Y­oèĴàí1OCáM§`Óq÷p£ëñÙöïUİîïû[Q…}lŜğ!uô 9ŽĊğŭ?‡ċ„ïÒ1#dÇ)Ĥ]v;X¨ŬÌĞd×µ\gÛĥi‚2=óĜ7 ‰oŻêRËğ^ìse„—Ȩëµ_´a’ä#&£âÀ†˜[×@Ĵ½+Ÿ:ċ~ÄÒäfEKAlDQÄqœpÎ u4ÈY' ĥ{ŝ ­%…Z!İĠ‚Ë– *^,f”¸ì½ˆYCC£ŸjêTHeYÔĥm˲ĴŞa”Òى3_?|ënYÂ@°471p’ÚIFÍoM:Ñ"–GKF¸ĝ% ’{ÀïgĤ³eÇWâ8^ ‚`-ŻHó†î°ğÙ{´S!h­ô„4Z§ŒÄÍb´*¨ЍC½05貝†F7u4p,´G0ˆ“û½' ˜ÍŸ;Ğó•Onxê&P-“%Vmm—–7`4#S›İċ^ÒŜ“´ĉİÎ`1„•· –Ŭ OΘżĝv†+AlĊq2Ĉ’Ž™#;­ŜïCuÔŝ1!ò'RÒ¨)¤’ĵož2¨5É]ÓÂú"¤Ħ1@ "%ĴÈȲmğbĈ!äÜSß;żÑHam3Tçîzá'XŬ;âbĊDkEy›2‚—İËħxdd¤~>Œó›\j6-Û×m~ ž:Y½œĤÉ­0 —}ßßPyu1cĴWxê°6ïDdŝàT,:Ë-Ĝû˙;fDiâĝĵŠİ×.; ê¨_™nÇ4Mê8ŽkšfŬ4ÍiĞR?Z9ú•ÙOn{€@dĵu“XşçÇŞw¨EFÍY•ĉPÖR(U;g%Ž „€Ì6ŻĵçfäeW£(Z ‚ OKş~}£~†î?*JÑíӄôèQVB¨´vB´|˘J}$ èCBŭÈ †AlÛ6mÛX–5E)=4÷ä÷Ÿ 3ŒŻ-ĝ™Jöĉĵ=³$`œÇ2äĜ¨½1ßĤŒd‹› bzTe:TzԞ#Œ2àËż…)ıè›6ÚJuĊ̑rĠġ#˘a\uíżŠrtäd4žw×cÑCjŸPwZ8?ˆZd„vFĠkhh"‚!efpÇv§fĈ4!äÔıoÌ_½‹Ȕċ¤Ôqe'Ĉ*Ġ[Ŭ86 v]ÊtEİNH!Ċ£!£˘gÔúA›ĝêğ@7.ħ'OÖŜĝVË*<ĠW[`Ë3Go‡µz·?%•"Ò4!ìoĦŒ ˘DJYĞ1Ú< tÚ·†F7Ğ÷ "Â Ì Ž˜ŽTLӜ4 ÌÙ.J{Êŝĝ†2IAFċ\‘~,Ŝkžçġ+Ġq>ŻçOÙĵ–5#ׄ4²àÎ'— I‡ìR+$ ŝJİŻ™AY½mÛĥkĤiÎByö³‹ĞloGúZéÛ‚ma›×Ġ2•ÊëRĉ&²ré&Ífnñ^|NM&+5 >Œ˘èN+anÇqî˘T7ÈêŬUµ½TĊ&MH#JF¸5ê-ħú˜,·z…†ĈŭX½ħ8Ĥëş˲Ĥ 84yìħó¤~Şŝŝ—^N Ï{G˘ŒòÖ j–êÊi ¨c ĥìĤ“R@× ë½"#À9ıâ|É ĝÒoa‚ßòO²ŜŽ˘¨pĠmAà§iş›R„Á;şß=KœŻ:+Ì[áİ%ƒK¨Ħñ JuŬÔQùc¸CëZ…:˘”>òÜ?ĥĵÂ%/ï!ÔĉĠ–@0ÎaA­'Ôµ8UĴ”˘ £.YȝŒ eb@€PBĝúû@·.eϜż—$ñ(Š}ß_SIŜħZ+1lİßZòF†%;MH#ŽLĉübĝ• Ŝކ†.ÑuSG¸“ˆ@-á³m›*gŬ¤a‡Ş³ÇÏşsONż˙ù€y³]¨k­" ŒQkîH]èó ĠâbÛní–2Ŭu´dÔVË'x5@x7AĴĵ!Ÿñĝ“ġ“ÏÏóé:0ÎËtĊFX™‡ĤR‚€”Ȩ3‰ĦYĤkšò>’hóyïa’!Ä„2àw^†JôiĝÄÉzabXP&†FǑÊİËşŭTğ+Ġ•ÜÂx{==$ ¤ġ 5‘¸HÇEšŒ4r™nàZ‰’:"Ž•JĊugÒ²ĴyJéñ³ßù×O][µĊd1+[Ğ_(Ud„[AmsFÊU$Ġ8`“˜Ä#"#(’ ÀW_këôı³Sï¤Iôy†w<Ïëfbè 4ˆ˜îU·N£ô…şd7z ¨ubˆRiU(2*İZİW˜kìR]ßTÀĥmSÇq,×ukĥm2 ÈÑ'_|N:óĠ×?Z‘2žċw}j%¨"#ÜAFyeIĥ[ğEnjċÖ½,ÓaĴa_{Êï²çÎN/yúY†·K&†¨‡‰á^mŜILCĞ#Uú)Öş£D¤†â]T’´Hĉwj¤o‘^?Ħq0 ˘Ĥ:²,ËĴT*UÇqĤMӜ7mçôÉŻ˙Ċùoz°²ƒdHYŜô*ó™#‚ZùĈmÖî"H*b*•ê„Ü[2ÈUFÔ0(ˆÍ–^Ϟİ~BQöqab×ğü˘öàD—&¤ İ" k·*#ÒajÀ M T׍˜v”:޸;mÛöĵa'ŸĝŝÏâĉ›o€L4÷ïH E@)Œ•‘•Ŭtž‘ÀeŜ3âBĥÒÀ÷ŒŒ Ġ7²a|ċU°6ŜJ_xlĉŒĊWƒ ¸İfĥÂ0 ”£ŽíB KF@ÉhÇKĞ iù¨pŝ"Iìݨü— }bOCc|KuŭĉPQŞĞVĞNR™°mû°iš'\üúó•cÏzí£5ü€ ,0F``”ÛĵĠİ&‹Ôó‚y™Ž Bò½%#DÔoQ |ċw@îŝ–=aú]ÉÓOƒ (fÖĠÖ×ÎÁ×AŽ:żŜż‰ĦïË=~şïÏD ­Rœl‘*ö#ĦÒŬ„ĉ#ƒS޽HÉ0 ˘VKÔǙħ,ë˜S8î;?}òŭëÛpġfdšĉÁİj|Â4PnñVċoّà-DÉĉ͕£Nì!İ( ÊU‡•7/ż’½p~â},ҏ}ßżéyŜ’çyAišĈŒħ´£D—Á`GŬŜ™v<\ [‚NûI…T’JÍaXu¸H!Ûmßş…¤qpJu]½)¤UwÔ0ŒS½ĝÓonĎġú'›jûĞÚË9˜j­$/ mCŻyµœ‹ĵ_”?ö’ŒHNFŞ\‡ bġMÀ‹/g/œĞ}@Qöa_úżX(£$IâĞ$†q×흉aNjOşżŻ i„HI9€Š+˘¤”*ğNĥNM­4Nİsĉĥ,Ët]×İVĞŽĥ,ëĝá³_ùÊÔıoÎŭö hx1 ÎAf\í8B`à|–4MA²Y(VJ´”@Ĉ÷şL§NnT†W/½œ½pvÉ$âr7<Ï[j4ëÖCġ#Ħ½71ôĵφĝŝ/Ùá\Ċ…|HVĥlàsHè´oƒYŞk‹ŞVĞ5×ug-Ë:j9îÙÇû³g>ĵéĦOĜÉ@šgÖa@MWÁJ<ö9£–*’ÀEöÉ¨|“‰òċzH%w#|ġu ËŻdϟĞ_2‰¸äûŝ ß÷yI’tĤ0 21t#£‡—Ä0Œë”˙ŝ/ÙñÒâ=Ü"#)D~ì*[¸;‘4ĈŒú½ŬQŞĞVĞfQ޳mûˆa§/|ç_}{‹××.Żċ°W8  EßHĥˆ 7´ĥÏq.sRî!ÜZ#!a˘ĝêï€,½œ=nâ’IÄ nĝżh4ւ h”Èh£NìB%sDp~Ŝ”nĝse¤öó)kw&öŒ°JíĈù#Ÿ3úg ˿ɞ?7ñ~AF…2Rd÷)Ó 21 mï~ĝêßRÛGÎQ½U¨#oİ&Y¤´‹Âà KvcSŞHD úF޵Z­ZİTflÛ>fšĉİ'ż˙×ß lċµËw@d€q‚FL -e²ız§01AİMe$ä•éòj`€@8ĝ*ğŻħçÏO½OQöĦïEϨLFE$P/0³F] {KF*ÂȳÓĥïQü ZóF£#GH•ñòuĉZ!iŒA•ÔuĥVĞUÊşùóÏmĉÂyġÒĴnFy<I(UËöP‰Œ€·•édœrï çĥnː1d żsġĠäЏMżCQv9‚/=Ï[ĜŜŜ^ó}ßÛ% š5zŽş^…r˜ ­F°f—ÛA­”ïbN6k­ Am ĦĈĜ“ PH¸)ÙĥmT*G•êĉ-Ë:áÖ§üû˙öİߍ.ı ÀXçˆ 0 …f,‚Î%dbɨÈCŞg„0HÖô2¸[żŸ}lömàég~´Ĝh46ş¸éú9êìnŜhÇOş§dÔödiBIF*Üs£Ö‘"J/šìĴïihì+2Ĉâ].ĠŻv½^ŻV*•Cĥm3 Ü3?ú_żµĜ0­ß~xD”ĞNL€1Œ[U†N2*Êt{BF„¨Ñ 5kD(ß~ç—P .Ï>vè-ž%EPêb£ÑĜ+ġŒXeC’Ñ0u{à¨@FbüJvtl~“òÉÁĦ5[l’ízRhhŒ>7ġPE=ûF*ÁĴT*nİotúÜWô sö‰™W^[„ĈvÀs2"I$`Œ ĥѽd”ñ 2GÊHŞġÔÌɉ­żó˙ÁDô‰˙ìc‡ŜH“ĝšïû·Ôêñ"ĦK™îĦÑ£ğ‰Ö*sMH#NFj8„ÌKvDŬ]IÍHûNíĤoÔ´xğkÖj5·Z­N9Ž3ošĉÉé£çž=ġżş›·áúí )Afç`šXEµBÔŬĞLÇ%dœ?\2*HĞ<:ÊU‡˘Eà ˙³âóí'/z=‰£ë Ô͂Œ8çìÑÀY£G§Ž ÉŒe bû§˙ñĞŬˆ—ï‚̲<ÉĴfN]3,?żŻ“eUT‘xHdTjXa•ÏFˆJb0@7ßŝŸpÔXZìÌìëQ~Á­F£ħâûŝV†ž Je]hPXêŝ"#!ĈR !5ÛC²\k@%2Êċ˙˜ş$5Ĉ—ŒzċÔġìİy#Ğ^Ż×Ußè„išgŸŭÑżq5İıŻ\ŒñĵzÀ20"§(‡f`*oöŒ óFMƒÜŝĝ‚3uoéÔüԛQ~áyŜß÷ïzž·ŸeY2$ñŭ­ŒJe:ݳìFÚ ßE#T´Ž+)´:ÒĜWd=”QÏy£JbĠjµZR™V}£3g_xéÛö‘gŭü· °ƒLòµ# ¨PF¨ċ¨+È(Sd”í•2RZ@AÀ×Ŝħkùä<úòdí]tÇóĵUµé5(í3êW˘ëgíŜ?dÔü!”JÒĤ†THL?*\µèÉLäʈ üuÓ3Hû‹Œ°*‰RJjµšY­VŬZ­6éşîQ˲ÎÌ;˙ܙoüĠ…_]Z‡Ğ·}QqÀ Á°P”/Ŝ+ÂÚĴŬ{UĤ+tÂD_ŝ ċßçNUÔòA‘àûŝŞïû8Žƒ4MÓû #/ɨĝ‘Ĉ´t·˙ÊgŒ$­E}Š|™l~iÛ·ĈÈÍ;ÀΜş6GëşfµZuêġú´ëşG,Ë:]˜yò…żĝÏ_˙àF„ßül3WFùİ”Q~#'vĤ›µ˙†„P05AĝíWÀX{={nêCۀ•“nÑóĵĠ QEŒħ”sž ˘Ŭ’Œ>AA3Ĥײ105HĠ3 ı™ċÇ"Dħ†Bŭ5¤1Âêh×ñ@”RŞ’ÜJ2éşîœeY§,Ûyìëù__ĵħeXżzX˜—é$`Q FÓQ‡Zk$JdIJì!Í•ˆ¨PF”ĉ™t„‚H7€/ŝ*÷˘gŸ{ûÌó‚ÛÊÖ½†Ħ§È()9éÄ.Ȩ_Ïz(¤##ëyÊ1è!ĦòÉŬ:šÔĦ&UĤ*š4ö%ġTGEhj­VĞVĞĠCŽœ°,ëü³/ŭÛĈħ‰_ħí$c ³ L‚À yğİğ4)Ħe`ಇNFHċёĤµ›6pïKàwŝ Ĥ²Ï½g.ÎżÉÒĝzädäûŝF^ÇŭÒ2Ĝi\/2*îĴÛԙñPHEƒŠÉ/ ÍÁXPƒ²ş¤1zdCÑB²,‹V*kbb˘V‘išç.|í_Ĵžŝĉü˙xcîĴ„ SÀ²ÜÄ@•ReAFXö°‚RKdT"%d€@ßĝĝ_‰Êĉêù³óo„ax# ;žç­(ó‚ß‘0Œ‹nüÈÊêHÂ8ÎUŽÍ`lñŽÈd+BH\zó„Ĉ“Qż5äM%Y–EĞĠŞ511Q­VĞӎ5MóÌüÙ§ż~òŝêÂŻ.mÂÇ_lƒL.€ &Ċ@Ìû¨²ebh’Èd„që}’—èd­réñÄtsnròŬ Ϥğ£Ì [QI’DœóĴ´>bqa<ɨ(ŭÉç\Ò(žÜ-2ҜÈO>Ùí$Ó2‚dÔ­L‡”‰ĦèMŽşúÌüÓÏŭézŝ­k~óò ,ŒP@ŠsEuä‰ŬyÏèÁoz-ġ‹É  `B@f>°WÎrvò×Dù+‚Eß÷×|ßßϲ,í1ct/!İû›ŒšPÑAXğìFñ ¤,ċ4d²•ŝ-Zƒħ c5FŒzÙğq§2˘”R×u-×uŬZ­6YİTĉ-Ë:eğ•‹ßĝĞżyñ³eaüŝ]`İ™ħüǨZ%êtè40—NFHEI@ ċ¤£ £È^†Š)|öñï`W}?¸Á’çyëŞ_–fŒzġ‰î•Œöµğ餆ѭÖqÑĉ:)“B²Hià¤ĥ}kŒ•agïˆ@ğ£Îž˜˜˜¨T*óŽœ2MóÂ×ŝì?}•MVùû%‚dš€Lœ§˘ÒްĤ!Ë­ŬŒÊ%:ĴlŬ„‚h\…ìÎŻá0³yñâáwXš\Žïû+žçmDQT8éÒ{\Áa?½D‰Œt–Ŭh*$Y ½ŠV^]qúÊH“‘Ĉˆ’ÑÀ$†Ò˘=§VĞĠĞĠêaÛĥO™ĤyŝÉïüċ÷ÈÜ3‡~ġğ%¸ğäë$€Pœï5ÊËtı2ʝt¸à˜ŒPë &ùçV–neÀWŜôŠ<;.ž<<ûvE7ƒ X}˙ʤëLëĉŬ²é†]·ɨóİ×ûFïu)­™H–Êtù †Ô‰dş“¤1²dÔÓŜ­vYġz½^ĞĠĉ”½ûÜÙgżû#ÏŭÙİŸż}~ħ’ „b@jMAQĤËT™N<,25[T(#jĉŭ"Ŝ€lេĴ½ÉrzâJĠ~èûŝmĠ/şĞ†]•֝u8éî_4ŜdTDéÒ¨–íò3 ‘<2ÔlÒ ![ë'ˆ@j<:n‚Œv’뺆ëşV½^ŻWĞĠÙJrÂ4Í ÇÎ?ûÇû³'~}i½se¤ ‚•0²ëÈÊĤ"_U~?d¤zĥ;~-Œór%Mo9ĤDxĝ—Ħĉ?óÄüû’³kïß ‚`9‚uß÷Quëġë‰KFEħŒCÛ˙.;@ !WDÍĉ˘X‰¤”‘Tġ<Ġ ñhÔÑnÊtÍ÷-Ë2*•ŠYË1[İTŽ›Ĥy~ŝ̓_ŝÏ˙óóż½â×.Ż‚LSŒF9!• Ì猲\5]=„ŒPs—^³>Žóù"l €oüĝíßÀɚw÷ìĊ#ïÄqt3 … V|ßßTĞĈcĈXÂ9ï×/ê5c$5_5ñŻKv#úa”gفê!‰âÔ+6ĈŠöÍħ£CFŬJuDÍ™ġz½VŻ×§Ç9fYÖùÉıÏ}í/ŝË×ßşÒ_½½i”‚Ì8@–ĉÂDä,Q.Ó ñÈ¨X‡ĠzqLò\I_ù •ßògN¸×§k“—Â0(,ŬĞAlw ğvÎġrÒíĥ_4^dÔ,×éè V°yC³L'”’E³JÈR^ІĈH*£ĥ†jµjĠëġj­V›q]÷˜8çŞ3OûÇ˙íĊïpó—ï­BeŠŒX>ô ¤-C³gzdTü*R@{(Şêš˙ûÔÌŬĴÑ…—Áġ?ŽžıpĝĊâŠçyE‰n-‚F†AĦІ0/ˆ!Ête7Œ-ş ˘KéT҈Ü1@3>ɒĦĵ²cEJš‘4FŠŒşwÓJbÔëu·^ŻOU*•£ĥmŸu*µ'_üé˙ÁÛĥó?ß]„À‹A¤y‚7‚‚ŒZÊHˆ‡DFˆ´òÔ( 2|ŭ}à ŻÀ‰Jcġì“GŸ&ñ Ï ;JtQŸ~Ñnˆ¨›­{ÌɨuÑ it_$ĠİW¸éˆ’I…İ@Ĥ'c5:햌Ú_ëġşYŻ×+ġz}şZ­µmûŒe;ûÇóG‹ñTġ^_„DÌòpžF9 IŒZ—ß{$£òŻROñkH™ 0Ĉ ³mÈn˙ÈĈïÙS'j×§jӗ£0¸†á²ïûkAyt‰Jêîµ2bĜ<şƒKFÍIê}H#[ĥË$ÈBŭHÀŠŒ¸RE)é!Ñ##ÒIFµZ­İŒLÓĵĝñ_òŒ“żĝŬĴlÄ Ò @0.İĠrÇċ÷A‘‘úŠµâˆ¨U°AAl~ |á70%nxO>qäÉÙçžç-.ş0 a†Œħdˆ~Qż5ƒÌ p0Ȩó0ӄ4šd$”D"%›wyaAùCCcôȈ”ɨZ­sçŒiš_ĝÑÏŝÏ~eîßX†[‹ˆ”dĴE4]ÓĜ:—ĉA™ŒÔ810ÎxÙâĞ _ççÂħCGŜ‹ĝv†KAĴAP.Ñ÷P˘ëµn|WNşħ$£"`tiô^›62‚–2*ŽÁb˜Úd§1 d„ş‘U&#×uϘĤùĝó?ü뗪gż{ìçï܅+_nHPݨ4{yd„PĦ×RD†™Ğ"ËáŬĝ 8Ëñ3ĉ?2 \ñ}Ħ(хaĜˆ˘È˘(ĉœ³Ĉ…A)Ŭƒˆèİ˘2´ĊiB!ˆR™İŒÊ:‘÷eµİAѓîEFµZíˆRF?˙żŝQŭÂNüüŬUx˙êFžÙÈ9€ lcx(d¤”Q‘CG)H_zÄâĞòD-\=óÔñ÷sB´†á]ß÷7ÔV×0MÓD‘킌zÍ@']żġy5 ú@Mv’”l)#Ŝ2ê(ë4½>(C+‚:qħ*R¨"żPE7}ß_ ‚`% M•Ş„îNU$úïBB–“oE¨¸ĥ_ZôxlŒ%(z%y<,›xé2Ħ9IÁÀİŬ–eÑZ­fĠjµÊÄÄĔ뺅á‰ç~“—&/têo/ïŻnƒˆ(%g÷HF•Œ²rKŒUrt>S„ ˆà à Ż‚|?~êµŞ3ŭi… Q­ATEqÇĊ½‰!U‡ÁĈŬ/êU’¨û͆&¤@Q—#¸UĤkĈa™ÔYvCÁddÔj5SeÓMW*•£Žœ1 âó?ĝÉK_:ù‹wîĥÈHŠĵgtÏʨÛy€Ôâĵĉ²J $ßY”n@v÷-ËoŠ33rċäݤi² zEkan”TQż^ѰĤ…A%:MF½*BĊÎ)=‡4˘ C‹Œd‘!¤LXċŝGNFúäÓıkİŬµZmĤRİħmûĴa˙ÁŸŝÛ?rN÷Ĝ/Ŝı ż˙d-/Óñ,wÓŬu/ @͟R3ËÎ3°~ ĝÒoaJÜò.>väƒÈëAà/EQt7‚ġ(Šĥ‚ ’$‰JŞhX"â=HhPJ·îu=0qIé9¤ÑFíʨ|A²’ş•044úfÓQJ‰išF½^·Š}FëSÙtOĵĝW˙é%1óìÜßżı |"a÷aíF]%*ŝ݆%!”Â! ‚;-ŭèĈûìñcĠ[‡ĤŽ}Çñb#ˆV˘(ZUċıFEQU4lìOg‰NÂ=Îh2*W…€Ô%ğ­ž—íÊZ—R44†#˘aÉhÇ>#J)qÇP=£şZ!qܲĴsnuâÉ?üW˙ġ†yfê~ğWn5@„qžÀ vĞŒPğA)ñAyE„ÄH…Ħé&dKï€\~SÎğÁĈù'_œŬôdËï_z&ċ’ŝôákuĝz’DË%"ڌ˘(ˆ˘(HÓ4ͲŒu”ç†! ŜG‰Ž²Ü AWMFğ)ÚÑA:\udŻ0íd¤î%Pö mûÖD4|‰n`żÈq£^ŻÛµZ­^­VgÇ9jÛöi0.üÁŸü›N]üÁñ_· Ż~´i˜€dê.D2j­QiÍu£ÖqŽdŜBĊj’^ĈÀW.AĥòT“х“s×'ŞÇŻĊq|×ó•(Š6˘(*lÜašĤ‰š)â]’ú%, ê Z §Kt÷[²ƒò,’&¤ÑƒÈK(ƒd$„4i2ş§]gżÙĥMĠÀĞSŻ×ë•JeÎqœcĤižİÔ&ŸüŜ˙Ë÷|÷Ìô˙ûê"|Ù:ˆ,™ ^¤/Èö!íA¨ŞMPŝ1(“B~Š„1Hž€h\8ÑġĝñcS·g'N|šĤéJ£Ñ¸ÇñzEÛ*‘;,úD=Êsƒˆô ëTIšFŒİ^H.wĵVò’VHšˆzR·2]g@*Ĥ”˲¨ëşF­VsĞĠêTµZ=lÛöq0Î:vîù˙ċùĈçێû‹ß,ÀͅÈ,˗ë5gŒ“TdÍ!¤òĉ¤""a"~ĝò›`úŸ§çĉĞ‹GÏ˙(MÓğžç­ĈqĵĤ‘ÇqPê6îaÉGĞ˘‘: Iñ¤i…4’À­ZğäÊö­N˘aŒ0$‘jċıŬ¨˘ŭ˘Z­fUĞĠJµZrgŜqœ“†aœ?ûÌ·ġÌ˙ŬÓï|Ñ_·[1Ȅä<'#ÎÛKtd„”,"¸EXĞdšŞJ“ßüĝâ`…_&çW—ĉOû4céŠçyw8Ŝˆ˘¨Ó9Wô‰†!˘~³Dğ1-hUôPÄQkñ¨NûQġ*Ë7Ú #ĠZÏ; Ħ‰hUÔµ_T”èjµš]­Vk•JeĈĥí#–e6 ü×^ú×?˜yü‡'~yyŭóċ5ˆƒdÊ@ ÈXž׋ŒPħ2·V¤P’̔ä7SÔÉ|뗁/½ Nr+>5__œ?{ìÓ4MWß[M’d=Š˘b–ȏ8T†…LJÉğ¨˘A$Ô+‘û^U‘&£s€—ž]í²½Š€pËÚ-ĦŠòżÊ^;–ĤŬİ˘Ayt;JtëRe^p+•Ê”ëş³ĥm3 ´Sİ]üî˙ó÷âꅙż{}ŜûlxÊò<şL)#)óy£ÎµĊÂı8ÂyŞà|& Š@&[-}béM¨°…èô‘É;‡ĤŽ_Qıµ$I6˘(ڊĜ+QšĤI–eLv“Ş0Ĵsn·;‹t‰î]dkĉLğìF"T*ĉĠQ+‘A”TnS)iò KFĠjĠĴVĞVî[¨ÌĜĥ=gYÖI0Nϟ~üĞßüó˙Üġ-ÛŭÇWá‹[Û 5[IJüĈHÈ ßZ‰Š’Âù§ €`ƒĉ áÛïżûL  ˙äüôíÙÉWÓ4]ġ~÷= á­ìp o=ûµŭ›ŻĤ•W>\‡wŻmBâ'ùA–—èĊ€ Q$a "\ħuÄĈg ĥo@EzÑÜ´³9?;y1É"ç|Ğ Ħ4M½$Iġ( i’$i µ­,'ͽ¸ċ†úÑċ9 MH€@µZĊ†8´VĞ™–eıĤiÖ ˜ „"„ĈĞÔ§ÏóO~ö]sŝ™£o_قŝpÖî6@J ²<äTġƒ€Rl Dˆ+ 6ŻŽVù¤#½™‰ÊĈĦéú-ÛÀËY–m3ĈŒ11ĉ§i$IĤi}!Ĉ9J R7½Jpšˆ44!ihŒ!íĝsµZĊµZÔj5£RİXëşĤiNPJ§0Ĉs”ÒyӜzîĊ?˙îħ'˙ıO3úë÷Wáê­F^–#8T… D²2\Ù¸ |û&H êVĉOםĈÌDuişîÜäœ78ç^–ec,`Œ%ŠK$¤ü <œs!„@"bHòé÷oÜÇĉVMF{ ŞŸ}Žş’ĈÛĥM,Ë2)BH2S™˜9ùµï˙Ġż8|îkßı!í˙çµ x˙ ˘Ĉ:@²Ż÷@úw@ĝ‹`Š€Ġ\âOTbÎ^>t#ıÁ9÷9çïûA–ec,dŒEišF‰BšĤLQABR)Ħ~Ĉ‚aHG ĝÚ^f@HZihBÒxĵ%„@†a B”š„grîÔáŻ|÷'?‹Ŭ3úëëĦóğxĝ×@ĝ £5€d\ BÇ6עáĤ½>urjÙµ­ !Îy$„Ò$ ²,‹³,‹Ċê‘ŞY!–ĤiĈŞ/$”êġDDXµwKDş<§1Š'Ż>Ŝ4öıBÚad˜žž&³³³f­VsÄü‹§ıŝÍòĥü–ÜĝäòÛÈI7äF­b4*ŽV]ӟŞ9›RJ&„H…ħzDœóXP’eYĴìĜIÎ?IĈcêmĤ””yS¨Ÿ*V! ;7ÔĞ4§‰HC’†ĈC&¤VoÇqÈììĴ199iW*Wıê&BSB¨ P)%(ÉËìX–e c,S$”İ/àœ UŠƒ>zك0vSF Ŭ µ½Ż‰HQB—ì4ĈŽ·²,“išrJ)“R†BBáĦ!´)ÄRJ¤Jjœ1& qĈOӔ+2I’pĈ˜`Œ‰,Ë@ì ĊÎ ıìBFŭR‡IP6QaWD¤ÉHC+$ ŬĞ£~ İ9{T­V‰ëşÔ4MÓu]“bB(˜RJ"„€,Ëd–eR`ŒIĈ˜Td&…À!(Tŝž@˙2Ŭ½üùяü‡vĝÛżŭ[}jh…¤qpE‘,’0ĈiÇsÎ1ç²,CŒ1HÓ´x_✴VR”Ŭˆş\ä‡éġ#›aCNċ€ïùH‰HCC’††BÇ2Žò²:ÔA4¸Ç[¤ĉA‘À3A¤ïš!ÒD¤Ħ ICcDPîëHĜYRëü|qÁÇ]Hè^ÈvĦŽvûĜeΜ&" MH?ŝñċßŭŬßĦd„:Ŝ/_€ğ‘”ŝ|/d4ˆˆvCL½Ô&" MHûLĦ!HŞLN)É9IèKiU6lİñ ³|èdMDš44ö–€şQ/U]QçÛNòêŽä}Ò0Ĥ„{RCšˆ4ö3´í[c¨ıë{7Ğ' ¤|€ÀîÊtŭˆb˜ÒܧêFD#y"ë닆VHY5uSPrÀ×ôê= Û7êG*OßmĴ}>>²D¤ĦĦ I “ô @J˙.5ƒ̰„3¨$Ž&" MHû€°†!nwq CLƒlàš„444!i0ċÔíBŜOġtûÜ •´B†„4ihBÒ3"D@ğ%²aŜßm˙GĞ! MHcDB½ˆ¤ó‚ŜĞ\·[fŝgÒ$¤ĦĦ I€’UżŝÜċż? Ii҄¤ĦU ÚS°;ó°ä3,i҄¤qH †$Ĥ^%ğŬ’‡& MH=‰Ħ{$ ù€>ĦĦĦ I€‘R/"’÷ñ=îçóš4)uSAƒ04ùhhhBÒx „ñ° KCCĦÓ54444FX?š4444444!ihhhhhB҄¤ĦĦĦĦĦ ICCCCCC’†††††&$ MHš4444444!ihhhhhB҄¤ĦĦĦĦĦ ICCCCCC’†††††&$ MHš444444ŝ˙²£ r9jW¨IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Execute_420x420.png0000755000000000000000000006035212467662066021172 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFVIDATxÚì½idÙuß÷?÷½—Ùk-=†ŠXH ¤a‘Ĝ2TlP ÚtHvc‡í).A$ˆ•&% ¤€EjħL¸3hŠ‹í/c)$jqÓÓ3 Iq€ "ˆeÓˀÀLwWVVUfwÏñ‡{ï{7³³ğЧĞ*³Ş˙?D£Ş³³2Ğ2kîïsÏ=GÌ „BÈ˘ ‰B…D!„PH„B($B!„B"„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰B…D!„PH„B($B!„B"„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰B…D!„PH„B($B!„B"„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰B…D!„PH„B($B!„B"„B!B!!„ ‰B"„B!B!!„ ‰BĦ!„PHä~ûy^_vOÉ_hrç_{Ħ@@Ħ($BîYHwÑŬŠêĥżÌ?ü0Ùï#yä ‰B"dOB’}şŭv"2ЉB˘ŽŽ/Y„§ĉü]fn—[Ü~ĞÇğÓcä •- „B"Dö(§Û çVö"8J‰ ‰ÛÊi@ÖÖÖÜÊʊ[YYq>ĝ`ñàƒéïw)§›ž“R"dÉĉRɁŝ‚Mï!Í­"&YYY‘ġġuwêÔ)WEQU•€Ñhd£Ñ¨™L&ĥııİá0ŭçżÌwúĵ½{JÇî!=Jd‘ÑmĠï÷ŬÙ³gĞ'Nôz½^U–e§OŸö£Ñ¨ÙŬŬ­ÔŞÚìììXüÚÛ­4ù}Úû>òÈ#b\Ħ–ŠŻyü 3À3"0UˆL @|íϝ/…DÈó–^%pòäÉ˘ŞŞŝİS§NVUuŞzÁ‹ÖìĈ5ï½oŞŞÚí÷û;vTUÌĴÙŬŬ'›yîıRJiÙ~Y˘ˆbHÓEÛf0'@·ë¸Á=$²èèhŜGàŞŞ*Nž<Ù/ËòlY–/úĈwżï}§^óş×ġz½—ġûŭ/?qâÄ Ïž={vmm­ż²²RġûŭÓûH.ŝ™}ìı™<Ïĥä°Ö=ñ˙Ó.9Ç·‹B"ä`%ĠJ£,ËÂ9×/Šb­ŞŞ/CYĵô%ozǏUġĠ£,ËŻîġz_yêÔİWVVÎĴĴœX]]-£”rɜżß²‚RZ"'e2B – €ùô($Bö_@˜#ˆ$‘ˆœ‘~i49İŭ+ċ›~­ċË^ù eYŝĠ^Ż÷•'Ož|peeċìêêj˙̙3UŻ×+fçN"˘”–QFY´dŜ †°qdáFIÇî!‘EˆèN2˘Ş…stΝ‘µĈ7'ĥèŸ>}Ò˙?ĝÇú‰U{ê³Użß3UuŜû-3“ápĜL&“vùŠİÙÇ|oiösî)-ZHħ€!ÉH“á&ċğC!²"Â1Ŭ!EɔfÖpÚyßë °ZNŻöíŬß²ŭÁ\áİψ™É™3gœ™‰™mİŞ3³şë$‹ÑRúH)-ó/Œto…Z€NF€[C!²ż’š+£!‰ŞfVè;À­ˆàEÀ xÉ ÖŞíŬß4ĝ™‡=ġQU˙ˆ÷~@ĥ··›ş}&%ÏK)-uˆŝÏ#£´Ÿd€IĵÑómĦÙ_ÍFJiÏÇİŞ3sJ°VtİšĵĉĞĠÇŜŝ£ßtŭgŝìÉO·#Ħ™ÉÎβH ”ÒQ’Á0 qás3to#·ú($BîQB˜#!™'!µ‚œr‚ħ\ĵzŜn€żöÀJġñwüÈ7]ûé<ùY1³)93Û23Òwéy4ŝĦ”–ÑGÙNŸÄÓbmdd]E($Bö#2šŽnކËRpÎÌDÒ0 !!Rzġújġİwŝżùĵ_ìÉÏĤ½¤ôg ĦMVŬ4 2RZRtĤ€AÓ[Ġ:Sv!û)Ŭĥì;É(Ŭ&fR °x0P58F*ĝÚµĠêSïzÏ7~éï‡}î3%Ô:˜™ìîîN˘”lzù£”–ñ7Ċ|IĜ7r];!B!²ß‚şeCéˆÂ˙ƒš}n˜v!ĝšµĠêSï|ï7>û÷ ž Ġw˙.ĥ`ww·nšĈß|MN)- Ħ+Cü£¤Ti>ĵïÂS”!)MŠİ:‹$G13¤=İß}v=5kgĞO½ë=Żîï<ùäR0ˆRBŒ”(4RŒŒrÁ ŜÂEIÚK"!û,%ıEt4µ” °“`ízT‰ È6Ç ĵjmú³wçüµŸz?ìsŸn£­(°-JiÉ}”şĞBY„ Iuàé"!û͍’R÷…%µ‡%~2T"(Pà WCÀĝÚsĞĠz×{Ïé'ß'xòÓŬbĊD)-{ˆÔEFĤÄä0ż‡;Ħه¨hž Ĥn‹§ös€Â€Ê…¨İtaŬjLÀŞġ³•ë=ßÜŜÄsJı(%%î!…D­ÄÛ &]ÔÄnß!,¨ù÷n\ûÀû@)-ıŽÚáG3Ż4ĉ5àLÙQH„쟄ĉŭ}*BÊ˙=ĠĠİ…ħ’MqY'Ù@·tV%.d#3ĵúĠêïzïĈuJiÙ¤.WÏ#…Bġ‰À8œB"äĊ4)MŒÍl`6½‘#sÌIüÏ6ÇÇŞï>ġïŬ¸ŝ“”Ò2ÉÔÚ1ċâhxyM8œB"äŜ¤#{ˆ’ĤÒwmŞ.ġĥËV|Â‚bgèÔJĈ2C@éşż˜c3|íıĠêOà½7(ÄIègçĝ0´…do0_Z ‰ŭˆn'°qbê à-HéĞ×תO3}·|hèW×ħE(\ÉeD/QH„FÔt‹˘Àkgƒpñl&áÌoo–ßVÄÊá^Œv xùújġYĤï–,:³,Mg!=+"Pµî—PH„ì³”î”Îk‡ ¤e]kŸEI7KÉfŝRÄ_ü€†‰7|ĊÊJ?žÁOî)}kû(ŭ•iAı²˘ĈâB!²ˆ*;Jë“!ì I•#óm4kR… ƒB04WUO½ë=ƒ½í)yJéQ Q°·njĴ„ùWbàp> ‰ĊGKİĊ™·p*ݎ}ëĵ‹-„î%Ċ'(x*Nˆ`¨†ŻX[­ž~ç?ÜĜü݃=ùi£”ƒ9d›€ĉc%jœ…äXeG!rè‘Q!ĊŞ‹7›uS™Òq·ÉääK˜ÄsJ•}[^ñÒġµ QJy—pJé0„6MgݨA fÏ‹($B°6uç‘ÚÂÍĉ!ĠÚy {B‚8intd7ġèĴ\xÌ> µ á%ëk•½G7?ŭ(… ÉÒú64'0UîQH„,ß.÷ŬˆZƒj1¸˜²ëò~vÛô 웗”&èÁpÀ°1ĵd}½²wüè(E\…¨Y(n€„ĉް,SǗB"dÁh?ÑFH†Ú€Ê’ŒÂż’­ü¸UÄ r‚ž!MĜĴ/9·^]}çn ~ŠR:t' oĜÖÛLCCUE‚ĊŞo ‰….RˆWÍŬ$LL (8 A×BÈÉ­+$,ĞÀs8U”.ì'0j€­ÚeĞaOiÀ=C}ŸĦéŠŭƒŒ|Ü(d…DÈ˘İlŻ{ŞÙĀž…‡î¤JXğ „mÁͅYyƒV'‚ÂÂèŠJ€ì¨aÀƒkk•óG7ä§ĝܟSJŭ^{m/, aÓUˆ)8‰B"dĦÄZàĵ·"6Œ-ċɚ݆”ÓûJÓ2ÊÍà˘ŒN8A­ÀX [áE+kĠßö#ĝ tàosöò´2Šï˜IŒ”X×@!²HÔşU]³}˘† ‚Ò%guÍWĠ EĵŜvÈZ>dË\) Ä „N=#µĵpm­’Tè@)x”d.^\HhɑĤÈÂh¸‰D!²ÈE ]é·dQ’Ú3IÎb‹ £'ғK‘’Ŭ|È)E\ˆÖpÊÁO"Tñm` ̂ĠĠJ)ü{íbı7ÂUˆ‰ ñvÎC˘Yí¤!Ħ;šÒF73¸Xi ‡(a]9‹\ ‘D:9ċûS $Îc˘/azmL1¨^°²Z=ûÖwoàC?A)P$ ߉u“ñ€lJ×$ ‰…Z)[ıÓI}m…ş.ÔéÒ^\£@Ĵ¤k#¨˜žtixXƒİÂRZêƒâ† έUöŭïŜÀÏRJ K,N‰ŭì h;|wóƒ …DȂİ4'EIù(sMQR”ĊRá2nC¤£+.ÊIÒ8‘))iĥŝ‡J‚( …ğ˜aӀsĞkĠµ·ĵ{?G)íoˆ¤!2²ì°Ĥ³İ—ˆPH„,è˘ı+T ÔTŞ ĦڈëWˆ~ÂÂċ²½p)ıԕĤSzž$9 é…3T*è9à´ĥ5˜Ċİi†ġĠĠ Œ”ö9–˜’‹oT£ŒTaħ§ĦY””Ú*;kĦÙ^(ây"HÚC {KíĜ”’ĥŠĵX{ŜF^Öî3UREꂔT ‚MÖV×*}Ëğ7s?|އgïù}öÙĉĤ#£VFìJ!²Èİ­†i—ĵÉO5j˜¤+lIE ñ<’u{Ib]'‡ü€ìÔìóĝy!†B*FX0@8çä¸Q+ÖWVŞkßûî üüO°£=GHÓïzƒáJŬy0–B"dkT9 ™=,Ż´‹·×m$ÔM-bT•ş1äpĥ“ƒ´³éèËşá½ĝ€§`Ë †QÛ×M°ĥĥZm%Ĥïž˘”î9Žċö",ğP`€D!²è PÓjsÖĤ0¸/Ȩ­ÔŠë[S}İË·XĜ ‚Îb³‹SI‘OAjs)ÁJ ê `‡Ç5á†VÏTƒï÷~öÇ9yöù+ë̗%Ĥ_½BŠPy'Œ($BsħlŬyĦ8ĥk·gévù$^$Œ§ ! ıbF·4ÇĠ84Ow?„VBÀtK aÎN’3ƒBPDiI“Ä…Pfd”‹In+ (ÔYˆ”4ìc `XY]İo~÷Ĉ‰_ü Jé.he”§éš˜Ĥóñ˜Sv! •’Ħ4ىX›‘,oÚÍÔ)âżµNğ²wûJ‚ĜÌ`z|EPĈï餄ŝkĈB„à†VVVĞíïû‘?ÏHiï!ÚüĴÄj‰Ż„!|n Ğ($B%İvŸçc(ĉŬ×cú8‹Ċ”][ÑeôÚv‚™Q3ÍXóŠ>I’ŠàD,vŞBU@°İŠĠ3gĞ­7ŭƒżô)=‡–jüÛŝuÚä‚bΎB"dÁÎŜĴm=!ÍĈİ͏ˆ IûGÖíÒzç8Ċt¤”ŭIË|~˜6ˆÊb÷A™6Ş,\Îo5ŠĤ14b¸a‚•ĠĠjĝĈŜ8ñK˙ĝ`—›Úⳅ‰°ŻÔƒÀ\Ä+ĵ¨6aX9³Zí|ÏßßèŭÊ?”ĉ^„4kÛ`5ÍĥÊNB3@˘Yĵ$Èhžxĉ´Ħ,ž„ĥ­„,ŽÓ11ÒqŸÂÁÚ}#‘N(íù˜şË;†CşĴákÂcZê5.8‡ÍFC—‰b³œ=µVßĝ½_f¤4ïŞ´P;/ħ‡Ħ¤WPH„, oÓUuyğı•v–ÇEá³Ŭœg]†Ĉg5 bmo;‰ÂiûM™ÄŒ$^ÍK|ĵ2ŞÁôœqÎ)Á0™ĥJ•ÓĞĠèğ˙ŜFïW˙”˙S¤ÑDĤD”fW5cŒD!²à ç°gÉÜiJRÖFIżÈeš aßÈ·*ò ;ëĈgŭïÒ}\ûÓKdê—WZHŬ™…/ŜÒrhÜûkgÖĞÑw˙ŭŜŻ2}7Eja—=žâÄXî!QH„,ZFè"[ i&w§1Œjâżĥìğŭ„á$ìajNRèÜ ñIÓôTácô4U™u &(Ó_ÚALƒF"ÌSşQ{ĴŸ]­vżëïmôŝFJ@(` Ġt)M6ù´}ùß…DÈ"ÉZ™Î‰Šbĝ”GFù‰(˜Hâcĝ¸w¤„ĥÓw*Vè$I#+ƒİ@b´”VJE!‚Šg”€0hÎ V†Ž ƒ†Í‰áì™Ġjü]1}÷ôŭ-%6šÉ)ĵváÂBCçU£‘($B"ƒĴĦ&a:62MişÙˆI‘Í'ğB.ÊHcµC7'ÉÚ3L鏋w‹"’Œ4>ÎĴ$>—PĈŽ­ÖÎQĥšpw$€WĊúÙĠjüŬ”’i8kMŒšĝŝ:„K3ĥ˘Y¨ÂÇXŝkÙÖÂt¨dÓ3ÜfÓwÈKµ³NÒq"îlĤeP*xH]|ŠŒâı%µ0–w ·İˆË9 —X!Ĝöġ†Z 7İzjŭŬÚèŭú?žŝìŭ)Y<–öŒLÛSΖwÚ%!‡ş6eó4žÉĤÇĉĠt6Żü{ş4Ocq‚Ĉ1–*ì4œO²ĴÔ[âsA‹Q9MÌğñ>~½X×)ĵ•Z,½X!a.ìMm™‡W İMUĴœ]İvżŭ‡6zżñżŬŸR otyôIF]SCB!²$Ñt÷ÌÛ3šħRUĊġ-µü‘x[N:ÔöïÔ,M…ÄŜEÎRêPşùIÒ}é`­euéĦò.|^IŞó0'ĜöAh£xˆv}e­Ŭ§R2#ËĥĴ1ĤéÔBë É' ‰E\4{ ‡XÛ+ċÙ=#›ŭğé­e)4Ġ´ğ0X7A6¤áòŭ#ÀCc<ƒZXם¤t]×`Oc$”ZM•ƒg)Á^ŜĠCŻPÔf¸Ĥ ÖÏĴT“oûĦŜoŜgRÊ*#S9yËŜ(aM…DÈbq™ˆ’HBĝ2ŻÛw–›ÓÖ!e|Rß:E7t/Ĉ|fU·níLÑĴÛ?Jc*VçIìħJĈ]Ì;ÊÌ,TÑk'ÀJ‡­ÚCk`ì3œ¨ÎTú?ŭÀFùŝsĠ'™”âû¤ñ5rÎ& ÄÔtPH„,*B×5.5™#£Ù5j2jÂwĠu7-ÖÈuñÉÓŜ“´İ¸0ĥħòN,˙ÒÙĝı„è=ߙw„°é’p8-8‡7ìŽlî„VC+'OT'~çĈ™G~ ŭ$%˧Ŝâ(İ²¨B"dħRê†àŠ0š`Z8ÏOFé†e)Ú Q$.VÓ*:Ä6D)='*pĝ-´'Â´Y¤ÈHş‰´ÑİĞxê#Úĉ)M06A½;ÁġaAQ 6Í ½Ó=üwlœù—?…ŝĠ§Ž…”ÌÏäI5ğàˆÍ•); ‰…[)ĉrdöë=È(íñä£&›Ŝe_›{†HÚ ĈeCĵ$ ½c…^ŝ¤}&šé…Ô^×c¨SXĵϤQ\ßñĜšÔ€7œ)†u_ ´qĜĴröLOŝÎğ6N˙Ë )µ‘PLÓYìŠ..Ȋǐ($B.£Ô\Ġ´7ñ|dd3‘Ñ´Ĵ­*–¸dY“<ËĈ™§sLmñĝx†'ŻMċÍüi°ŸË•˘‘Ġ޸ħëħ;Q¨)* #+P ÛµAEá!ĜÜĴ3§zö­ï ‘Ò3G[Jib·g‹êb%˘¤v„B"d„úĦgœJtwS€t ÙmÒtS›‰R,žÍĈYÈÌl …´÷w1ż—ĥRÊÂĤŸ#ûv[İ™ĦöÀ`Ô`Üh8Ï$á^e,3•pF§Ž Vµnl7°“§{ö­oß8ûŻ~ĉHKÉÔn’‘ù8$ŜNJ;n"QH„,Ŭ÷ĥ•ßŝà‘”’HjĤŞa&Rş8ˆaĉ-Óµ„B"ä˘£¸g^şı=ʨŬGò]İ·¤Ż²ĤWìèàÒÄ/™˜>Ï ?Ë`äħ;Ž#-ş \ÖYÜe °‹el/OÚÂ*ÁÖĜ …/7†càô™ŝöÛ6Vŝí”’Ĥo)ĥ ŠO!NâĜH!‹$–f{=$#Ñˆo‹ b3oL5żƒšNÍSÊó}ùáٔy Ċ †Í]íÚǒïn‰³’şrñtvİYè§Ê(#ˆƒ)0Ĵ~˘0lJœ<Ŭ“˙ŝmg˙ġÑ˙Â’R[8ŬE£Ŭ‡›ßȐPH„Rt„t@ĠĤÁêŝÊ(-tqĜAÖbÈâ>Ày´ ı:s—Ä”ßp¤Žê¸ÊÔ°żÊëöŒTş&­hÇ_ÄIµ1+cgVkB3V¨`ĞQ¨ &Û nL<°vĤgë­+˙îCGGJiUÓċb-U‹ˆPF!‹Χ@-¤íHFísÙ´=ÂAV)µüˆR8‹°dm—:83ìÔ[ğ=ÌÙ6[•X'ÚĜ\|ÜKeCŝşË0'(ÔsqÏàD‰Á¨zC ‡Í­ ìÔéސ”4ŽéXÀ &]ï¨$(Ž0§Y¤’RƒMĊÁË(/íĥ|>RŒVRÁ—ä£Óµ›ƒ&µÇ`ÔÀ7ÖÊÄĊĥCh#Ĥs1ERn!zÒĥĴÜğÖ ¨s­À='°ÂÁĵ*‡÷Ĉcĵc¸ÑpúT˙í[7Îŝ‡ÙÒK)ĞĤÓ4ğ>5dë ‰E“ÎYœ[ä]ìÌ}—2š:—tvBİ-]’Jj'¤íĝòxßĝ÷Z ƒ ĈĊnk›µĉ‡iSCšĞ”¤ç²RÂĥqĞ$%1ş†4/Èk‡+V @kF ›;€ž8Ġóßò–oXû÷²ŝŸ^Z)I.£ÔHÂSX̉B"dañQòDş8VۓŒÌĤC(ğ‹Èhjf’Y¨Dĥ4BŬÚ.Ŝe¤6w쌚V튝íiŒt$zuqGÊ4|nÒ¸E: Ĵ)e™w2èÊы¸p÷â”A+L[ ĜX1i€7¸³gzƒżŭöóĞ˙ög°ĴR²•Ĥó_>I7}îÀ‰B"dqR*gƒµİħÛöĤ›Ww—2JO'ÚíŬ˜t•_Ħ!¤ĜvkÁ‡÷ڕx›µ mÖö˘_CŻ; ‚ʏ<2B·Ħ’ÄfS t7†M•˜䄃8`0Rĝ‰G púdÏŝÖÛÏŻŭğċ”’)²CħáÍ·ög226PH„,,BÊÖëÖútžÉµ?˜´ß› ,cŠË @\Xƒa#Za^q€Ġ“§zöÍo9îw~ŭ/]Z)™MË(=aİì["QH„,ÖG0oPoŬBu—2²½ìÍÈ™¸ÀθÁÖĥ˘bt##›ú>biw{Îİ+xèšĴZ[`ĤÖuèf)i+ĥT—-Ûí%EsJhžT1Ĵs4ğ ׊sçÎô˙7o=żŝ;B˙‹Ë"%iĤPaÓvq6’yß> ‰…ĝ(,êñâÙçÛF·–‘Íì/Ŭ$£Ùòñ[ÈÔ^ħı]£İsÙY7Ċ6}vEfŬžQ·)díîÔHgÒtV˙ĴUNHéYğ‡ċIJ·ñüR; =”˘ÁpÎÁް 6œġFqí9`ŭ̉ù­ç×~çCK)e+–Éİ•ĞRH„,ĜH"qÊjĞ›## ütd•Ï3ş)2şƒŒT ƒ]Ŭq3=â"‘&½"îëXÖħA Ù&ĵÂ,Ì=ê&Ĉç‰_ï ħxŠ”ÂĜ ³80nVIŠ’$V\dߗCWìP•ĦC8 …U†­]ƒ9A3np½QàÜɞ~ó[ΟûÏ-\JíÛz7uEfQFĈ=$ ‰EK)v|ŽÑˆĈŠğÙÈhżdd0ìŒ<†£&tYÈÇşÈ(žEv&)íŝÄi§ñvkÇO`*}Î3I@(ĦC[ôéÚhݝPkí%‹ßS>V8g(}WÄ3=}‡amµ˘ ×7kĴŸ9Ġğö7żïüıÇ~~ħRJïC›Ĥ›2²—…DȂ#¤°•F-Ü*M·_2š4›; oSÍ)î;ıĴožd‘dè!(]V䇳=‡Ħê1\ż6^p²wmÍçÏŭî/”ÒkäBû#iÛ…Ò}–|SH„,Iê.ì! tCÛĤ´W'ŠÍŬšwKµ‘şÈi¸^&,1É"£x€VşÖ?)…Ò{Ú %´|ÏH Uz&†B÷xNÇIjÖ*í”C7uKÍ-œS2'8aT¤ {JŞ uÀġkcĜé“=û†ï=˙Àż€ŝs‡$%Ġ˘s‘˜Ĥ‹ğb‰˘™²£Ytê.ÉDĤĈܵŒÔ ƒ£ZgÚ=Ïeênw6È,ĥbÍÓ&Z”J”QxÄ÷]ĜCŠĠuħħkšj[ Ŝ÷ÖÚC´ħŬPWĊ—ş\H[WĤ"‡Â^ `kìa^Àş7`ŭTïıżñĉóüżx8R’.Eê4şŝu탰Û7…DÈBQ‰Ñ²}žğ—Ѩöì4Ŭxƒ}’Q>]fèJ–ô9¸‡ŝ-Ğ(ƒĊ£8ĦÈ!Ȩ‹|RħBšİ¤m*KC‡(îpžIĤş8D Ä.ágËĜ'N lMè.€pŭÚ.lġdO˙ú›Ïż?ŝúÏ]>x)YÉJĥgäA_H!‹ ÂUˆÀ›=Ż4úžיuöYF–ŸEÊoGŞĈK•yÒġk;›ġ£]×0ĦV˘œbË ĝ8¨LwOs—Ò^“t)@Ëĉ3ÁÒѤ4şÂ•‡™VauƒĤ\÷Àúı“½/ŭ—ß{ŝ…p°‘Òïú=›WÀ`^!N`Ŝè# ‰EK)H pŻ6ë+Ün„Äî¸ÁÖ¨ÉÒ|'£ü>’7hóyj\.ŞŬŞœÉ(}“>A†úIìò­ÙœŒ.Š­ ş½Ĥ˜şk;ƒÇ}Ôġ˘pĦÓCÏĴp!Ĝ7l˙Àï˙ú×&Rzĵ÷C°ÖX”ĥƒkÇsH!‹ġQvngo2òŜ°ıScÒÌ-°Œ0³O„ĴäÓk!UXV²mS?hÜ^J Ñ?mi·v}R_%‹%,VŜu£ÒCÉĵË›"ZŠf çTqoİĥ&>LžUàĈÄVz={í›Ïżà~ñÀ¤ôìO˙Wrîíż—ċ<ƒ”L\ö„B"dA¤îĝ:yàmżgŬ{Ԟâ! ŠŽbÑ6$Ġù2Úmƒíxh‰d„Ĵùi:ԛ˘!Xĥ'”"ĵÉÌSҀ?iÑ:“NN1zJùÁ¸]ÔEKƒûœèԏí²' ™;Cé(à=P0líÖ0s¨·k\WVOöôußsŝ…ûôŻžÒ_'ëoù=kKë•2˘Y)µŸ¤~vY”´9j°;RÌLá[ Ë##H6ġÖ²kŝĵż^ĴÖ '˜tjb­‰ŭ÷²*<éş4„h ŬHt<Ĵ‚ş—24iuÙÓş˜- %UX ÈÉ ›Û5Ì 7\›xĴ?p²÷ĊŻ{ÓùŭÉ/˜”˙Üëdŭû~×R <†D!²œH;¨/—C ×w4-µŒÒžQğžj–ÎK…*]dd6MEƒ‚ĥĞ7–MQÀâY$t‡n£ŒÚĈgtE ’™ßĊû•NÂjaALÚwŽ=ÔÍć6CнŜ˙ÚÏżèO~ŭ$Ÿßµ7?‘f¸óż ‰ĊĦjĦ·Y6!ûúThRyİğíä­mcQôü'µTä`qeĝxn IRHw÷‰bj/ë6.’$Ï˙ÄıSĦëkéV„ŭ)Ó0úo°=ÁĦñc\+ŭŜ_|ŬÏ?x€Rşñ‹çeíO˜ĥ£Yd.Ü1Z˙ln75zädëö$†&ÓC˙ÂTÙ62jŸ7ĥÂôÏ`ħü;ĴòŬ¨óĴ{z_É0Ŭ!Ü$N˘•‹-ŽÒs:„û”Î`…•Àà ŭ[k ͨĈu3Ĵž*{ñŸżñüƒŸ8@)ŭòyYŭž'h$ ‰FGq ŞÍÚ A£Ö)8‚2j‹2ò9[ Y;ż"û;ÚÈİ+ĜK{Fñ kŒ~f;9„ÂmeÔFFİíPên]Ġžä•}Ħs+JÌ}5X%0îÔ°Ĉ£=6k…ŭŜ3_óç˙ҟŭځIióWÎ ~˜R˘9|\L)mMlnÖŬ˘nvdeÔxŠ”†²|ŒEV-7ŭ3LO›„1.F‹1Ĉ‰‘Úǐî S”Sw>İí.h‹ò=+‰CòJXüI(ߞ„0ŻMpíYĊúêÉŜĉğÏٟŭêIé‘G‘‡)óß8_rT03<;V GYsÍc"£ôóĦ=óİŬ÷ËÛáÖ´½żZ”‰ZÜg šÂâm^ ê󨆪aT…ŞA}öuÎkHv“¤í2^ˆ *zÎp²t8gĤ[íCúîú.v'ŭŜ^ġ]çeġ%Żí÷û_uúôéŻXYYyÑÙ³gWΜ9sâäɓUY–B£"‰í²ÏKĜĥKê‘Ga½…DÈá2QµÚkŒ$2 boşƒ’QúŜ5}~öû£ÛÓù¤ÔÑ!Üf­°Ô‡ñqÔE’‘ŞÁ|(×$0µNF$Ò˘†î9ÛĈ'„~‚Î… ĵ~)8ÙsèUq´†7ĝÚĈ`‚qż÷…W}7D˜²#Ç&:2ġĦ[¨`޽ÍԎŒÒ÷`šġş“Ĵğƒu#$$ı!á½!÷ċCG40ö w&mÑCŞ´›:Ó7§Dş <†*Ù×a8 9+ t8iï<š&ĵxġö×ë²~Ş÷ÌWçùżô翆ŝĉĤï#$rÄIK‘…EÛ|€ïÍfûàÙtw3LEFĉ5ža ݇Ĉï#z·˜Òó1ÒJ‘ù1µÑ“µİ<‹C U³(Ş=‹l] O Î *'è‰ádŻ€}ŬŭĜúĉ.v&ŭŜĠŻúNFJ„9&‘’HŒóvìd”?ždİ}6Ò\DÙö6 iBéŠLBĊ^n„ĥ|Ĥ瞃  *^'œa·ŽċƒŞ˜¨ÇġFĠ½ĞŻüÎó/ŝ #%B!‘#m#té§yĊ ÇHFÈ b{ï(¨.z²ĜĦµ=<ç"µó•,UÊI|ŬBi·ËZ iĴ)İĵĜ´UBzŻMÓĊ´ĦI8|;e‚TŠo ‘°ŻT9 WšZQ#¤ôҞÒġëğÀúİŜĠ—çùöל”À~à!ĉ£Ù}˘c.£öë`ažB1‚¤ûÄĥCI6Ö6›Cùâs{tí…SwaUOm„bK!„óGP>.ñĥ/ġћnݵ ÚvEs¨JĊdĴŬÏĠŜ{\ż1‚­ö{W_ŝç_üıq`RšùœPH„ì/"1EĠVÖéôĝòc(#d%ß)8M·‡ĥ>ˆé=ÍĉI\Ċ4]šyâŸpÖşyĦ€!<ƒĊݲħ`ˆ)–Mığx 9Uüóĥ… ÑRé€Ĉ£Àl‚ëuĴè]yÙwœñ“w”’e"š'%db˘”($BCFҕ!`ż/d45î\gŸÇ"œ ŞàÀ˘@,š)é’íÛ)³èäÓ5pˆ{FAxâ%Jʒ˘şîó~öU•ħám(ĤOäá¸ĥ9Ĉı•~Hß}îŽéğ&QzĊóħħ³˘”($B6e'.„’-1Ӌŝñ•Qš$mĥ26™}ïÚn yCVH·ïGRˆ„`ŠŒ4.xë $ÊHĦpIRaS*~]êÑŭìİ*/y*ïĤ_…YL<|Ħ¸6ÎiĠğú—żŭü‹ŸúuôquŻRÒ9Rš(% ‰ƒ´RLÛE9İ·ûFFİûv'›l_-UÚĦĞÎ3é7—X޸ ç‘e”ŠEDb4j]#W‘ù´ŒĤ_{³Ĵ³ƒvmË£¸eok<<×n4X_?Óğò•ßqŝ%Oŭ‹VJ"béO”’Ċ=%dİğ<]w') ‰ŭCµ“Êŭ(£öl’N|Ĝĥ jÖßN4/‘TS×A@jو‰T÷\ld$èɢûÙ5wŠRjÛY.ḂĜÌXƒĈ¸~}X?Ùğò÷üKžŝ ôqID‘A”ÒdŽ”dŝËM2˘œ($Bö/JÓÍʨ=‹÷ŒÚYJm‘AO1•Ŝóávk˙1§ÑĤ(˜LLşùImœÔŬ'Ÿ\›^ÓôADŜ+ĵŭñ4ġÜÌkƒŞĵ˘ö nÜpşê]~ÉÎù•ßDoëĤôŬ@Dlgg'Uß%éÌî%QD!Ċ…Ú9@››rÉ(O²Xžû6rÑĵI·ĥSvy˘ĝZd‡m-iLlŞš. ñ ‘Q“M H´ìùĠBçïĈ[’ΓQz£'4ôî›(pMġĠ½Ë/~ù/żú[–K)FLmúk›%ÉRv”…DÈ>ÎÖÖnYıe”-ġž) ‡ ,Úʲû´J½Òşƒ·m5]”Ro;›‘QĞ„ÚilWä½ĦñM,ġž{à·ŭĈb5·zĝŬq( ?wşwéĊßöú—^ùMô·Ÿħ$¤,g’”dF@³İ;ŠˆB"ä`ÒvÖ¤MsğıÍ}&#ˤœ—„KVžÎ"%1$ñä˵&1e˸XJÓ½;g”˨m]”ĈU¨ÁĞÂ7ħ§Ŝ\e?ğjWwnĦ£µğX;Óë]zñ·żŝW}<–:¤ôŬŒ”0G<”…DÈ>Ğ(•Ħ…‰´ ÷ŭ,£vm{Fa¤ıN?_–ĤË#Ëî,ÚQèşÒî´g$6#£ĝ8–5rġêá½Ŭ&2šùÙSşÑ Ĥ]zñFcÀJŻwéÁ7ĵŝ_ĝ-œ/´’ˆ˜sNEÄĥ··5“+ì($B'cg X­a˜œgd4ïë$MšM }–Ëż×62B7 Ŭ4tGûKn ›ŸĤK•ua¸Ÿïŝ.d‹=ïÔÇ×È£ñ7ĥXż÷ô ŝ—×Ċs˙·ïÙU¨ÍÌ{ïŭx<öu]+nî~гH…DȽI`€‹µ^NŒ0u4Û3Bġ´i8KšÉşŠşôšiĥc7½ĤyêŻP;UÚ}÷2xŸyZ ŜázÓk§{O??ÓKí˙šTvu§ßïï4M³3Fŭ~żÙŬŬmpó^sÄà<$r„rvœd{ÊÈhFF³ûJÏAcD+óaŜ‘ebM Ĥ>›ƒ"QġaO¨ñaÈ{Ç}‘Qŝ51hêžûúö£âtïҗ}û·ĝS_ŝWŞŞZïġz§ûŭ~ß9ç0>ÒܙI„!û!ùGÓ22ÊhFFéN–?_ĥïsS .k”:•Ö›MÓċ#Ġo:ôş2‚ŜBúÎ<à(*¨) 'è<Ġfò˙ŞŞ~ŞpŸğìœ+ĞŞr{LĠ ‰} Òzİñ€Ĵe´ċ‹żaÉeÔŜÇ\†1ÔO°ġİ˙€â/> ˙’sfbñĤ§ÈR@LÙrRL×ÁĊİqJ;e£i]á`e 4#4OŭŠKž|ŭ—˙9Sì\nšfì½÷“ÉÄn‘–cšŽB"ä B¤¸P2³p*etœddÄAÊV€ĠW.Â]~lòÚŻzàѓ>]×ġµñxĵğğğÛĝP 1o˙è—5„);BîYH) ·&´¸1ĝ›BQFeĈŒ€ üċÇá<6ù/êßíö‰ŬŬѕëÛÛÛ;ğğğġd2Ñ92bʎB"ä y5>ŒF:ÎPFÇGFj\áBdä<üÇCdôÊsżW9ŭĜîîèÉííígƒÁġ­­­ŬġŜïU>…DÈ>Ħħ¨7Hhm”Ñq‘Q*`@E żtîòĊÉk_ùÀïWÎ˙ÉÎÎîçĥ··Ż ƒçĥĥĥvvvvêñxìïBH„B"dß2vħċÙLƒRFGwÏHÚÈH`1]×À_z îòĊÉk^yîJi>³³ûıápxe0\ÛÚÚÚÙŬŬL&ï½×ğùâE!ûB˜b­$)ÖPFG>M'¤X|OŭċPÀšW>‡%š?ÙŜŜyr8^ŬÚÚznkkk8ĈQFv áP<!!ĊħŬ>,ÖetÔed€Š"5ü £‡^qî Ğ?½³óTŒŒž‡Û£Ñh2™Lĵj;‹6˙³)QV!û“²ËWĤŒ etôöŒ ²Ş*0\„ğüXŭ+Îŭq‰ĉÛÛÛO ‡ĞƒÁàÚp8ŽF£I]×^µm†dw ċC!rPFB7¤ÏŞ~z‘¤ŒŽĈžQü×ĞÂĦWԗƒğ|ħŽ‘Ñ'ĥwvžÜÚÚş2 žÛŜŜž•Ñld¤·ˆ–…DÈÁ °:ŒHĠĈÇ1§F)…èHRİÑ|ŝQW[}r{{ûİ­­­ĞIFñx\×u£á DçˆwHÙQP!û i< @œÀ&Jİv@áŞBâ9#ħ1üċ‹(>^?ôòġ?v:ùÓa”ÑÖÖÖsÛÛÛÛ£ÑhÜ4M.#½…”nµÄB‡#[‘#!IXgÛßÖĦ”Ѳw`İV×Ğ€^" üĠÇCšîċkìşÈèÊ`0x6ĤéĉÉÈĉHévĊ „!!`>Cœ´k6J­Ê0BBĝЏ/U£ÔêġaϨíÖ!Ž…DȂ#¤I\݊0)6PF÷қÎA Úé(”v_X?ô²%JÓYÚ3ŠG:urLà9BFêu+„°f”ÑóÛ3 Ŭ, İ•Ç—Ş7]›ĤKiE³ĴšU ŒYXÎÎBûšZ!Ä}$ÊèžöŒ\h”*Á_]FİĠë˙MĥgàİÒ: ‰B"d‘˘0ĵQF÷4鵄èġ×À_ş°Tí€Ĥ Rğˆ|ıR(˙‹ Y\„‹œÀĵuWúJŬ•Œâp=T üċ‹KĠ(ĠÌBC %ŝù—+XÔpá9ZARíĦM<Ô#£ğ•‘¸ĥQ*œ‘ѲÉ(½šFÔÇsg1EÊҕ;FH„,U ,  2ç`,e4_FEŠYQNá/]€\nŝé²Èhög˜ú˜ú7‰! ğ|ríúeŜŻÑ”Ñí \ÌxZìÀàáŸı|Ħ~Í+֓ŒžZMI)EIqÏÈ$0gG!²¸t…b˜@ÌXƒ›Ç—SFÓ½é\֛NĝgžX~iĵkhí#"‹¸‡Ä”! D€P]×ĝP썑Ñ^JğĊ€^) ͕Ç!Oxıetm9ÌCÍ£Ğpp]úÖXgG!²¨ ]Ë İ\·VSF¸e†Şú}ÀêxÎèBŭšWœ[neRREĝ2ġŬ²%ŽE LÙ²œ¤ 1ĜÄÏ9‹DMUÓ&A ġqÈӏ.d”gí ]dtS˙:ç!QH„,‡˜œÀDâÂDMµJġÊâ<š§Ci÷ђQŝZI×AB//'LÙrĝ(`†ñċŜ`^[102š3éĠêöœÑQ’ÑôÏ'3KU1@b„DȐtŝ(F"€RFmšRV‡jşKŽžŒĤÄ#ŬÏ+èÚħžB"dáARcŬĊ²×l)dƒ”.¤éP_}"Vӝ;‚2ÂtGo‰ċ5œE£Œ($B.#ûڵΈĉ>?giç‰NB• GWFHŻuޤlÂ3QFÇî!‘£ƒ…ŽÀBġXáĉ‹ĉ~*`(ŞPÚ]UĦ‡^_~te4!iםaj(7($Bˆ8İB5ÇŸ-÷áĦWç E˜gÔÏ\<ˆÒn=tħ³{LɊÌÊö …DÈ­$q0ŻŬ€ûržQ7BB çŒö=M§·ÓÁÊ(EFÉ?^oNç™uŬ…DÈĦgìXÓEFÚà>>ô*@QV£ıôĜAEF ’QöhŠL<Î Rŝ'qì`Q9:(Ġ¸w$€ĝûKFR„ !z……wċÂñ’QŠ‚Ĥd„vââKíùß…DÈâb$)´V˜÷Ŭi÷Idä\HSĤjşg?ˆsF‹—FfˆM‡LqzĴM=+aʎċìt˘áĜMáÚÈÈî ]i·ĝ-£–Ĵ5ÈHş÷‰{H! CR6'ĥ J]îıŞ î=  Ç^F m_ŸRÇoIXeG!²àݽZNëĝ­Ĉ›jşRPH%íĜñc/#‹GŸ]Cz½Ó猐($B% ÄÚè} £*ÁHa—=~Ġt·|Ÿ‹.2£ĦĜ½ÁÀ‚ ‰ÀêD!⎯ŒÄ Ŭ½Äyĝ+ —&#nšm;ŠvP,R£U$ ‰eHÙiÈ丸ÊHŒ\däu`¸’öŒÎ-JFv¨2jŸTCµ]*`hğ~Ç9XĈRğËÉJ×ıNŜbĊ•ÎÍQìM—Î D,DFhà/_\äžÑâe„(£ĥ˜!ò\a„DÈB$ „C°N²ġè84JE(`p!Mԗğ/ežÌei:´ÛbDb„DÈb”öŒ$L‹môxÈÈEQQ†IŻÏ\„\~ôKÓu‘Qŝí÷Ž($B–%ezمyt;2+¨JÀšE7J]ĵŒ€LFÓt˜Nљ2J˘Yl€%‰gS¤;Œt$GHH&£ ͕‹‹ìM·2şiŒ(˘ fd$ŽE ! –R£Ŭ }‘ûóQ’Q!ӓ^‹"0<ó8ÜeʨÚ×0–yЏuE|OYÔ@!²0…µH}\ Ž˘Œސ(]8ô*Íċ‹”ÑMï·ïäcħÜ;EFéŭ'Ç î’£ƒĉá#Ġvp›Ù+`0ÀUa„„8•2š˙~Ço)Ĥ£&B!²‹TLs5îèȨm”ZÂġ*XQhŬ(uye4)Y7ÒÜ|ü<Ħ9téöòroÙ1B"dÑRêÎcħüğ[‚pÏ(;gd" W/Bžŝ0etfšùk:›ÄÖA!‹’Q‘Z((°9ÙïÈ(µ+*PU§—.DqÏèàŜl›‰”0ŬB(UߑcSväeq¤½h:;XA➑tóŒ^daĊ†›”GMœË‰Ċ]4Ĵ‰ŬsĜÊÈ!ôĤsŝÊEz=L!’o³Ú{#$B!0çÂsġ€sĦ÷At`€„½Ä)š§/ëĦÙĊ̙£fö‰Ĵ‹ˆ¤ÑĴħ[…DȂ}ŠŒ !ĜĞB5ŬĠÇ[Vr8>5Żnmm=GRt½ì$+lh_ aÇo ‰%H`M3=é ¤pqìx9t`xèeĞS2 ÏnoooQF‡ġ^§h(?ĞĴĴ£YЏ¨[ŒÔ—¸¸ħ}/½éŞ(K4—ƒ\Š‘Êhħ!R÷ĥ˘‹îLĊD!²p-ù”Ĥ“ç'£TMed"aÒë>wéBŭË×-ۛŜŽžH%|i($B .$!^½Š #ĞR š§ed´|ovŒŽ\ÜC*ĉGOäXÁƒħäHHïònw'£´gT@U:˙Âp—cd´läéıTß?;Ö<‡D!²P+ùĥÊÎfŻ’o›Ĥ ‘‘‹‡^Ħc4WŸ€ğô(e´Ô— Ö (/n`rçXÂw•É5JXĵ—È(œò—ÂÁʐ&ÈèòĤé–ö}Nm÷ĵ½eߌYÁBHKUèeş€ÏŒâùWÀV–€ŽáŸùH#£ċ%uùÎ?ŠLwüĉËĈ‰Eŝĥš†=kb·ïì Ò͑Q˜H!ŝ  çŒ(£#!!“RŜĠ]Û≐CX–vâQèĝí!ÎAëú62Š NBjĝˏwĠt”Ñò‡)%×’^GSH„,ĉyĉ#1qaƒ[-ö³k˘LnžgT°˘‡^Ż\LĠt-bo:ÊhÙáĴ¨!–ÚŠUv!/˘ù‹µY8ë$”|·#ÌeşšÎ!ËS–ÔWĦ×WĴSFG-JJ ÛÖîY³U5ÇËBŽD¤@˘ŒqŬĥİFİiş^"ŝ™„4]ŒŒĥ··Ÿ¤ŒŽ­pRd”Zñ`,…DÈ"˘˘ü>^&DF7ĥÍ$TÓáz°0ÏÈy4Wboş—­~´@óÉíííÏmmm=C•ß ›S~›c?ğcSvd‰" iAĊb†éû¸ş´işÈ¨(úÔï˘h.=†ë½|í]ŒŒ˘Œž£ŒŽÈŻĊԁXğıގ/)…DÈaÊID,ŭ†ó ŜwĠt.zEY"ŒxîÒ£ġk^ħŝÇšO ··Ÿ‡Ï ƒk”Ñ!ɨm”Ĵ/;÷($BîQ8²‡û̋’Ú[M54%Â<#t½éžyòô£ġk^ħŝG1M÷äp8|fss3ÉhD)É­eE($BîAB³2²9÷›'£îĈsHÛÜ ìÊç?\?ôŠġ?,Ċr8œJÓ £ŒÊ舊)ˆ /.÷($Bö]V¸˜ò”™£5a1r…ƒU`ĝ+C._¨_óÊsX‰˙ĝp¸ŭäp8üÂ`0xn8Çñ8FF etTĊäĤ%Ċ—˜B"d£Ĥyb2ܢ¨AŽ¤\ż5…XĉÊp—/ÔŻyĊúTâ?žÒtٞÑ8FF·“e´tż%·‰‚Ú³I„B"d˙£$›'&Ñ(&5o†FÂÁ(|ìÚŭÚWžû%šÇjşĞ12ڍFıŒ”2:b22­]ĤSv)J"!,6BJ2´ԋ{F—BšîµŻ<÷û•ĝ?ÙŜŜyr8^ŬÚÚznkk+—‘Ïd¤”Ñ •LŜŝ; ($BIFQBAD€7³€Ħ,­Ñ<}îʅÉk_qî÷{N?ĥ³³ûı”ĤÛÚÚJ{Fŝ2RÊèDH³â€F–{SH„쟀$[ó÷Ò:Żf6QĠm“b²364—˘Œ^ùÀGú…~bgg÷³[[[Ïlmm=7‡£Ñ¨ë:EFv!QFË!™·*XaG!r Rşm„dfŞŞµ™í˜Ùq#/}öàžŝèĦW˙û~Ħğğûù˜Ĥğ6 †ğğğ“ş½ŞŜJ4³b˘Œ–5B’™°âş=İ(ŠPH„ì´4ûÇ{ï'MÓl7MóìÇ?ğ5²§˙ßáĞ˙òÙßêöÔîîèÙápĝƒÁàıÁ`"£\Fv!QFG!Bjċ”-7ż9Œ’($B&JšŠŽlÔÔu=žL&ç\İ_üÄĠżòÀä×Ozuggĵ½ğğ; 7ƒÁöîîîx2™hLÓá6B˘ŒŽÄoG*ëvŬŻJ;¨/ïqG($BöWL˜'Ĥşu4Š˘ĜRU˙ÒŜGŝI…‘mmĠ~2™ŒvwwGƒÁ`w&M7+6›Žż…Ĵ(£Š\׳nî $!ûӅ ­L&“I3ÇP×u]–ğ£ĝıM&“z4ùf2™4Ŝ{ğE¤ewe´ÔR²+C;Ò³Ÿ·.—ÊE4ûw!ċ‚eD…Dȝ*ìĉŬßÍ|íÒu˜#˘[ Š2"„B"ÓM{Bv‹ûÜ*ew'!áReDÈrÁ²or°ż`]{ı‹²‡ûÍÒMrÙCT4ïëÉqż"âşG! éyÊ ·‘n#ğĴ(# ‰PHä>ҝ˘½Üv§‚†;‰†2"…D(¤= h/·§Ïmbşa ‰PHä>Ò­¤´íiıdl÷#ĦÈ}(¤½üŭù énĊD($B!‘ûLHû-ĦŭĦ…DîS!ŬN8w{ûíär·· ‰PHä>Ò^˘ ğ’ì˙PH„B"÷ݐžŻxöSR„B"ĦDPü…&…D!„PH„B($B!„B"„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰B…D!„PH„B($ ‰B…D!„PH„B($B!„B"„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰B…D!„PH„B($B!„B"„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BYjŝ˙ıŭ}RêKÎIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Speaker_420x420.png0000755000000000000000000025766112467662066021175 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFTÜIDATxÚìŭg˜Ĵ×yˆXĠñôÉ'"g€A$Á Š"e‰’%ÙòĜ”ÇV˜ħǞ;žĞgîġ}Ïüğ˙ïĜħ­h9ÉħeÙĤ$f AdœœÏéÜUġċżêê:UŬ}DüÖóôİî:ê µ×~ßw½ë%Ĉ4h Aƒ?nĉ4h Aƒ†4h Aƒ†4h ACH 4h ACH 4h !¤ 4h !¤ 4hRƒ 4hRƒ 4hİAƒ 4hİAƒ 4„Ô Aƒ 4„Ô Aƒ Bj Aƒ Bj Aƒ !5h Aƒ !5h Aƒ†4h Aƒ†4h ACH 4h ACH 4h !¤ 4h !¤ 4hRƒ 4hRƒ 4hİAƒ 4hİAƒ 4„Ô Aƒ 4„Ô Aƒ Bj Aƒ Bj Aƒ !5h Aƒ !5h Aƒ !5h Aƒ†4h Aƒ†4h ACH 4h ACH 4h !¤ 4h !¤ 4hRƒ 4hRƒ 4hİAƒ 4hİAƒ 4„Ô Aƒ 4„Ô Aƒ Bj Aƒ Bj Aƒ !5h Aƒ !5h Aƒ†4h Aƒ†4h ACH 4h ACH 4h !¤ 4h !¤ 4hRƒ 4hRƒ 4hİAƒ 4hİAƒ 4„Ô Aƒ 4„Ô Aƒ Bj Aƒ Bj Aƒ !5h Aƒ !5h AƒŝùÇ!Ío“Œ7ò0Íik0öĉ0ï­Ûƒ7—´Aƒ;éĵ‘ß×Uƒ&Bj ÁĥÈçíH˜1żż!§ !5hĜçßjB2›iˆİACH üä’y‹g³(hk2†œbjRƒ?D´ŬŻ·CN›ŭM3ĉk3‚xĈSCJ Bz+ñıÏ}ıB ŝBñĊ/~q+2Ù ‘mÔv˘$3†ĴĈÓRúÜç>אRƒ†4xıÉǛ!Ar~WG"£Hé‹_übCJ Bjà=BDdϑ1Ïm—˜FĠŒ†SqfDt´-Rj !¤ Ŝd´ŬôÛVÏŬ=B*„ œsÂ#œs"„ À#Œ1û̈́­µ1ĈhJİİŞJċy”ş,Ke™Ф6‹Ĵš(İACH ĵ‡‰h+"ˆ‚A@}ß§Qq!BĈsŒB)ŒR „RZ‡ •R²²È’$ݲ,“d–ef(Zj Bjà=BDh3"ş€8çÔ÷}êûˆ˜{žçùï !|ÎıÏóc>”B!„B(ħžZÄ=@”Ê”RŬ˘(:œóDk !L–ejÌ!6ÄÔ !¤'…/4WħÁ– o–ˆ† İ6%ĤBÇ1ó}_´Ûm!„‚ =Ï 8ççŽĵ˘şIhPâ:ŒyŽ—kİÁ{Œ6‹ŠnHËĠÏ !hE˘Ġj‰8Ž£(Šâ0 §=ϛBìBìaŒí½ûñ'î{à‰O>xd˘£4–FĦ5´¸!ġzB4”%(•@Ż4(``´£˜z&!§ ĥĈ'€Xôkr2Ŭt;aöív'WżKT I 3íÙÔ.|Ĥ†7‡6„Ôà½FD£ÈhÛQ‘‚ùÏâ8q‡­V+pÊ÷ŭŽˆörÎ÷?ôéŸ}äĦŸúÙ£´=é÷JR"­ 8A܎–¸uÄX1„@ÁĜ .4ÁxïğíËvŒc· “Ó¸ÙMfż·!¨A TVnÓԐ4x§’ÑV^sêDTA}ßçív[ÄqµÛív†3Žˆöyžw`ϑw}è—˙Úŭ3ÇïœêU ŬBĦR€O ü:§ol­ù†Ĵ0TpBF(%VÜP/:Äfá´ U}4ÄC´ÖTkMi˜”€­GSluĈŭßĥ÷òcÈi”CùMŭÎÁëŭENĈmjŒM×AıKßRƒï 2—˘ğ!*B°VĞċµZ-żŬn·Z­Ö¤ïû;=ÏÛëyŜÁö̎úċżöĜەiJĉ3‰BĝÜ2k´#£Ò\rıqŭíż('ù6˙oÜ0J½!Ġ›ì8Ù7ĥAH[›ÉQBü|I™mFP?yäD`ɈġÍ qɆ4xW‘µZ-E‘h·ÛĦ‹ŠvĝżÇóĵBˆ[î}Ⓩ>üıżz[*"ħ" Ö* O>%`ĤßÄj׈Ò178ÌmĴĠäéëê·5$ C‰ŭ½Äñ–%%2DH£Rw› ĥKŜ[EPÛ%˘›ynœbp3‚ú‰ § ·!ëgŠ6„Ô Á;…ˆ6[\·JÑħ(ŠxEŝÄÄDÇñtEsïïó<ï–é]{îüĝßüÍÇZÇïšîTç{|B€€ Ĉ2…égçÓtëQ’ħ[ħ”6€ÒC¤ä PëOşşQ%;>Œˆ6ĈEJµ¤@ĞĠb”RÊ£ÄÉúŒ1D)eŞŞH)!4UU™ŞŞ6KnE<Ϗµ1Çó“INf谍{N7„Ô Á;1*Âvˆċœ³VĞ%&&&‚–U.ì‚`·ïû<Ï;r×O<öèŻ|ŝŽ. ĝ…DbT Ó„Û+¤MGĴ£f :7ĜuÄ@ëÎ )I]Ż9.ġçóĠú’Z0$j#ÈxÜXŠ §3 CÚjµ˜óßQyŒ1Âݵ'ZkcŒÖÚh­QU•Ħ”ÒRJ-ÔUU­µ)ËR—eİqém’ѨçĈÛ8r9¸°gŜŭÄ4DFġ) M İAƒwbŠ[@ƒ àq{ᄠúQQ<9yû'~í7?ŒħÖíñû Ù" $›,ÒNİçy´Ŭn‹‰‰ ß÷ŭ–ïûmÎy  ”zĈĉÖrcŒÑ–—´ÖZKcŒÒZĞús)RJI÷ĦŞŞ’UUUJ)U… *í˘ĞqÄcF|Mpsc6nˆŜŜQ“qĦu}xZ°÷ž}PCH Ŝíd4^´!EçyoµZŜÄÄDÔjµĤ£(ÚÁAß÷ï9z ŝ;˙àħ2žö/e W3Ş ˜(Œ-+^P° ژ‘ù²€’~½00Ĉ&ġ”r¤ Ô@e ŞZ*î~”mÌz÷뺨aœ˘n³~Ÿ‘ġ£ XÇÂ÷ŭv†3BˆœóYBÈ$!¤nÄmŒQĈǧĤr_Wî£tÄTj­ Tµ.•RRŞ’R–RÖcŞŞ(Š*Ïs]–*ŠB Ô%'lAÂfĝ~z×Smeœ˘Ó ^BjàGF„ LA0ívÛo·ÛqĞĠš p·ïû‡|ß?v÷‡?ŝGġż½£"œ½Ŝ)‘K—Ÿ×ĥgÈP@i€cċèQĠ,C`àÔPJ€@)×ëeµħâ¨JŻĴ3Q€PÒ'ħÁc% Gˆ›ġ „1F…aBˆŬŸŝğ˙ËŻsĈv/]ğUU^$·ĦÑŬùkŬ*MJ­dħtĉµE•Öş4Ĉ”Ĉ˜ÜSh­ ­uaŒÉÜ×ıÖ:3ĈäJİ\)U(r)e!,˲,‹˘(ʲĴÒ4U›ÔVä4˙jSrzW“rÌcˆ+1:…]#ûnàEFjFŭzQ†bjj*l·Ûí8Žg0Üëûŝa!ÄñŭßĝĜĦ~|ߪÒ8Ù-a´uRZâµħi5PEˆ˜È€×r_ñç/F µ#’t§_zk‹ ˜­uŞ”JŬÁĴŞŞÌNEQ–e™ĤiU…,Šb°µ9 Y ĵ눉ġû‚ ĝÙé÷^ˆÔRƒ÷ ÑÁ4/x“““Q]/ €çyG&wìĵó3˙˙ü‘`˙ÑÉĞ…Ä—˘#.mf”ĥï½n!ĤŒ%ÎiĦË(µ° ÚÀPÔê^ŭŜ“¸Ì· –ôĤgg×òĠŻĜslçÈÀ(JäÊô{×WH{†¸ylëN d€”6;/›)ìÈ!17½6Ĥ”Î.¤•w”˜ï”`ÄÖÇ!à €˜  ˆ…O BÏ÷'xèûvÄ- Ì0Š!ÇCAĦóLġ֖òÎġkÙʵ++×NżvíòË?<ݵîcşJİ1Ĥ£”JµÖ])e˘”J¤”iY–YQyQE’$ežç*MÓj‹Èi¸ŸiÔ9xw“60½GM„Ô Á;‘Œè0!APKş‰‰‰İVе3‚[<Ï;zè{úİ_˙{ö¤Ş'Ñ­4¸r5ceĴÛEFZŻŻ\ŒPhûBh?dĦµiށYœÇ³_ûS\|òĞÚï.­î™™\ô#O’ĵ‡xbrĥĊ(JTNPé÷ôĈŻġˆµf ŠˆĈ úßO)%8!$ÖR ŽNzH …ĴÔJƒ­­4|FÁĦÁ@@‘ƒ‚(pBÀĊ³rvĈ(ó]q|tw°:5]ştĦwíÌkWÏ=÷½ÓEÒ]ÒZŻ)Ö´ÖTG)µ&LŞŞêMLL¤yžgY–ċyžË$I*—ÖÛNÔôž"&CI˙Ġ@h3İAƒw:Ñ xğŬöÚív<111Çñ'^8~Ï?ġáŝêßĵ³£Ż÷$²Jƒ*À(;§HƒÊġĠ½AvnNq>sÄĠ” Lwß˙ò—pŝ˙Ġ´ÖĉWì˜yħ?_eİT”úBˆÔè™TT•ĠĤïÏm†›ië}÷ïÒp›‘¸Ò çÏC\ϑ „€ŞtİĦJ4´2ÎâȀ€q Ĥ 88%à0 Jğ‘×H* )(ÚP„ğZ“·ïníğ÷ÑŬï˙Ċ_ğżğt=½~öäڅpáҏž9İ”ZÒZŻ*–1­ĈqÜ-˲[–eĉP$IR Ԝô6"§qQÔğ‚˜´2èż5´yŻ !5xϑÑäädĞŬnÏ82şĊóĵ[ß˙óżôÄŭ?ûKGiÈén `ȸÈHj +É\l$TżÊ T™òK?À³˙ñßç^éžĜ9û:™jŸÏzŬ˘(ş°òê‰(Šˆ†>¤ŒQΗĴżâĤN*ûûĦÊ)6ş<˜Á”Ŭ¨ˆhÜ×7|˙€ë@•ÔDI m Je`”µĞİ](”4FCkb0%RJÀQ”İAİ‹ö`Md µÂŽDSäŭ½Ĉ›ŽĤo$Úw˙ö*hġê…îùžğrú{_9ïuj­—”‹ïŻTUµEQ§,Ë^QY–ey–ey’$Ş,Ké$ċú&ÒyÛ&Ĥ7)ġ_PĠ/§İ!5hŽ!£ „ÇħçjF­VĞ5Çñ^ß÷ûë'~í7>uìñOìé•2iUrÊNj5F£2èGF¤b{‚Œ¨ü ZŠïŝñpġ›_*ĥŭsñÜôkYšÌgYĥœĤéjY–ç܋Xzž×6†PjݚêSÍşS!•xíN‹’ĥZ×úZk˘µûŒTݵé P ZTX’Ñî5*hJ 70rêA(÷Úr‡äT‚€Q „8ÍŜzŻQ=£‘–`Œ‘ÙS'>qdêOŭÂmKg^ëœ{ŝ{çÎ|÷k/*„‹Jİ VŞŞZs‘S’eYš$I–çıìġz•#&ġÓ;'Z2ëQ’ħ°‰4ĝ1“Ñp³+sd$&&&üVĞĠj·Û³qï÷}˙H†·}öż˙Ÿ>µë‡wt …+ıĠv§•uIZ£Òĥ'hŒìòİQ›ÉYÚ#²Àċç€ï˙û?BtŭÌÒí³S?ĴŠüòÚZo!MÓċ4MğY–RJ†aäy^¤”*Aˆ!Îû΀ÁöfƒŒU÷Zœóêö6Z`‡˙o9uîáFk]cŠ,WzŜHĝœÂ ÚöR9"&ÈÀ À#°BF@mÀFúk'ŒÚĜ.´.`·ĥ–ä À´! ’@Â`UR jöœ˜şóm÷Ŭóé_şóúë/,Ÿŝî×_ğ~ò“ZëĊšœ¤”ËaĊqÜɲ,iµZYŻ×+³,“é<ŭ&ˆ ïˆ4ŜÀF6JÒÍó ŜħdÔĥ˜‹x_G[SSwîü}bâÈ­“kÂrĦÁ PIíŒMİ4 mP¨u2İ Sµ}żSb… äò5|÷?}×ġ_ÊCíèT4Ùz9éviş$ÉZšĤ½4M³²,+Œs΍1€&XQA œĵnÈúÎı (§.”yS™žħŭHÎöG*r­u7UşÈ´Á••ÇL@pâf9iˋèÀšje …R6b4°dĊ‰­­VSé["ĠlbPiIW;‰9Q •kü\-4á‰Öчv}èîGwk _zùı맞üòKëWÎi­ŞŞşîûŝR+Q­FQÔKÓ4OÓ´AŒ#&ŒH× GI?Ŝ4^=ŜDklx˘ĈËAƒ7с4h·ÛÁÄÄDğŬnïˆĝ€ïûÇĤwïıïs˙˙÷ÇĤöˆ/§½Rƒ¨\T$•AlcjĠË$!vçN!PJ`ŒBzî5|ġ˙üKŻ/Ŝ1;ùŞÈ/t:éġ$I“$é$I’ĉy^–e)•RF!0(Klá҄}—p=ĵ*˜:ŬU;DܘÛN¤´iD”BUURJ™VUµüôÙëùÚıoBuħ |œeñìZSS÷àĊQ„Ş=…Bĝh{<ÚÀOì´\Á(¨S R£msħܸx–­Î5`kSRŒ"Ï §Èc“áÎûž¸ċÈ£?Ô½r÷ÚS_;yŝéŻ=ݵÂ9żĉyŜ‚ïûuÔԍ˘(Û&1m‡¤~li<£5vƒ´a0_!5hŽ"£ÉÉÉöÄÄÄ\E|ß?>ğgßŭż˙üG›Ĝı38ۓ(µµàQҏ4fƒKB‡ĉı"}:вW~ĝ<ûo~Oí6ÙÙİİöóiÒğ’$Éġ$I–“$éĤišçy^J)•3$%ĈJфğş†&c(´Ôì‚ì‘gâlV ŬrŠÙFT4òçò<×Y–•žçġ(ó3ß˙ż˙ĠDoíH–$GE‹P꙳ÌëJġŒ…ĦŒeR²0ô&Ĥ1ħçv8Œ}‡Ž`ÇÎ]hµ'À‰wMĂ Dí›ÎT½d#Ŭ‘h§lĴìc €B^2bÚûÚ·}ĉŻ?pâ#Ÿıü³ß:˙úWŝÓBˆËŽ˜ĉƒ X ‚`-ŽÎbR[Ò¸4Ŝ%Z²ïy'ÎŭÛ4˘† ŜQ‘ÑÄÄÄϚŒföì{˙—˙ġ£í™ıàt·Bİl³k­ SÊı#hƒLÙ~ ›˘sQ%ĥbÄ4%+óxĉ?Wżö'ùñى牤Żu:+I’Ì÷z½Ġ$IzY–ċµÊË­K³Š !dCûë€%@ÖĊô£‰OannêöżÛ(Œ#¤.!„×Ï> qn"`? „´!!Ĉ#>cc°=K‚ĉÙG÷ŞĊÙìÜÂTçÌ&W( DÄD ‚ÉiŜŜħ³ûbǑcĜħcóA•ŞŸŽìwëġ³f¤›ŽŞ†LÀ)@ 1Ú(Hc KîMû?ô—n=ôȇ/>óġ §ŝ'O—E~‰s~UħÁbĞÛ &=t_jlÀû‹‹–jSÄÁÈȘ÷d/RCH ~lÜ´‘ÍȨŬn·'&&fk2Úħ˙àżĝÛ˙è#ñÌĴ²[Y²Qvá×ڎz(œ;B&]dDú^• ĥÛÓzȍüâ)|í˙ÈéVnß1ŭt‘gÓ4½Òëġz½ŜjšĤY–e…sş\‹ê×Í!ÊEHšÂS­ovĈĈÉĴżÂÖ#Gho EQ¨$I$4ĞŞŠTU%9ç=Îù<4„íOb„î։š”8R*(~Dˆßf̧TùD—!“yh–;írċҎĞg^Ĝqċ{á‹&âhÇ1ı˙fĊÌÎ]ıC (£ ÔFħĤ²B {Aˆ‹ĤÜĞV€qÉF0f7e"Q1€óÀÛġèÏ;']zö—^˙ê?]ċÙE!Ä!Ä| AĴFQÔñ}?íġzE–e2Ë29@0ƒé<úŽŠ–êH.[û%6„Ô Á›ŽnFÚ½Œâ8öĠ5£3{ö=ĝıßŝG‰fvĝŻwKÈÚÈXñ€Ô6ȕFŞìçŭıqExC@6 éİĠßùßġloñҎÙÉgÒ¤w!I’+ŬnwÉĠ‹²˘(ÊŞŞ™hƒë8!DÙeş&£û›ÛŝBkF óÓÎÜFnoù²F@Jiò<—Jİ<Ĥİôc,䌅4£1ï-´ĞċKğž}áÀ5?šfÑdïÜË'÷Á쁣˜œ™Œċĥöd‡1Ù&dBÇ;—uB@œC:§V`QT¤2P"s}êŝ>²˙ʏsíġŻŭ§ïŬĠ³œó˜óëuĤ¤×ë%½^ŻrÖDƒó›£ĤQvD›FKo9)Ġ½~Ŝ“‚††ü¸RuÛ%£ŝçïó8Žŭ‰‰‰öÄÄD-í>6³{ïŸûí˙ġ#­™ŝëUegiç´Pi›šË´F"mŬd]ÚM¨MÙQFĦeċžÁwŝ˙P™|%ĵçğŬî…$IuğŬ^Ż×ɲĴ(˲’RŞĦ…gĜ)BLż†ä¸‡Qéj#F›ǝS›b$.C7ÂfĥñvôĤ( ­”RY–•”R%„(Œ1”1Ĉ)ÌĠÁ!„|pJ)Ħ”rÎ9gŒqç‹'8çœR*8ç‚1ĉ9óրs1Ĉ"!D‹16ÁVŻĥ²Ċóûğ'¸˙²Nú³ğÉC'ĜîcwĦ=9 0JŞíñSĜ\£J”НFÛkȵ.×ŬÓĞÀ“w~äÀ÷=÷Ò³ßş|ê+˙דe–žœ_B\ó}Á÷ŭµ0 {Ŭn7‘ĈÓQÒ¨è~ĴÓĝےÂëS£Yšñ ĵi2"ĜžC_Úíû>w#Z3Qí‚àĜäŽıû~ŝ·˙ÑíÙıàġn‰R2’(”ŒiSvëˉ5”€r†²ğ†ùgż‰g˙Íï–G'üçH%_êĤéĊ^Żw­×ë-÷z½n–eıSĤpĦğá8”KٙÁ”›+*Á(Ŭ_P6HżUMFÄ6ïı%mĞéŞĈ qŞğ:U1Â#°~Ĵ'Ê2Ĉ(cŒÙéçösfmę‚sÎıœžçœsŸsqÎcÎÓSœó6elÂĴ^™Z¸rúĝžÚÏíoOş•Ì­hÄP0½îHħöMÄ66ÛÇä‰9+¨2“†@z„µï|üà£w<´ûÜ·ŝóİËO˙ùw9çç9ç—c×}ß_ò}u WeYĤ6‰–ô&Ò۔Â#7ÊWú Ë !5hfÈh3b\ĝ6ÑäädìÈÈöMNŬŭsżŭż~|bnwpґŒrĤ¨RY œLi$NMWKêq Â(ʵEœûĈ—pòżüğäÄdëi™gŻ%–Œw:ċ$I’Üjş1Fo™ ’İĝ0 Äjmuê5Ê ¤dj7z8…6o`=3Ûx~+ɳ8žÁhA Zk ëöP‡ġu¤”Ĉ!„PGLL!<ÏBîyž/„ÜG(„ˆ9çm‘çgxwiZ._ÚyŭÂ+·^{nzg¸çp4}àVì:x~Ô•6ŞXAú:ì+&`  Ú@Á r²qBo÷ù޽÷èÉ/ŭëçVνü£zÒëÄÄDäĉí Ïón}â×˙ŝOMżkêB*‘Tڒ‘KÓUJÛ4ÖH*³>ˌ:Ċ³2cCŠĞgñ?ĝ§/6°~+I’s½^ïb·Û½Ŝív×Ò4Mʲ,•RJk­°ı'Ú`¤×O´lhŒ­B™ëħq;Ü •€ZÚ+ÖIéM6››$#Œ!£AR˜xÔu!:sÑQJ))"„TŒħÜó<.„è<Żċ>Ĥĵ˘8/’•ĠêĠŭW/½vÇâîsӇïfûŸ€ä‘W%-Q÷Ê uµ:J@ À´1Jj¤•‚çy|ç˙ò]3·ŜżïÌŭƒo+×_fŒµcħSä­ !’n·[¤iŠ!%žJĠŽSám¸o$Z2nü„qiJ¸9ĵ…v !5xğSu[‘цçyÁÄÄDğĠjí ïû'Ŝ˙+{xdnħPèTÚ:QğĈWMŸŒz•ħ-î·×ó  ŻĊ×÷câêéĞğ[Á·“$9Ûëġ.u:ë½^o-MÓ¤(ŠJ)Ua°4l4>ú0ƒdDÈú˜Y­Œx§×9`°‰P@KÊ 4v-:›šˆŽIKnw<ĝp”4Фˆ#'ĞPŠÔä”eY!„H|ßïŻAúżAË÷ŭI‘ç—ŭ,9­×홿rêžċ3GvOıÏÛ{ĝ|pPPׇLë~ReÖÓ˘Ä8wYŠ27,ġëͲú/fû;*2ÚÁl72wnnğîR{Z)EʲTyž—œóÜóĵ4‚ïûĞaA°äûŝĵïû×ü²¸„îÂŜ…ùó÷­œ>ĵgÇñûÄÜŜàA D:E^ŸŭL?mK0£Üœ' ' |_°ÙüÊŬ­ƒwìıüçż˙u–tڔҘ1vYħÀ9_s‚Ş×ëUC‘Ò`mMżĠ¤¤E X˙‹Ĥ‰4¸)2ڌ˜nh|­{ÚívĞŬnï€çyǎ=úÁ<ô—˙›½JJŞÀ]cİÁ:ċJ;`dêš ‰%£ŻŝÎ˙nfW._˜ĵ§j2r5£Nê:$]dT“Ñfé:l’Ò. }2RZHeG;èlâĜȐ~ClMNoĦšÊŒInĉt½Yœv3Dµ•Tş˙n,ŞŞREQÈ,Ë Ïó2ß÷“0 ğAĴ†a¸Á‚ïûóAY\6Ğ×ö_›?w˙ÊÛvï½aÏî#k²UĥŸK€P­krKNÚ O%@ĝÀ];˙•ĝ³Wżòğ{ç_ŝ>4bŒ…”ÒëBˆeÏóĈÑL[?Rl- ż)R"tà×ÔâŬ¤ì4Ĝ67 %àFE]Ÿ˜8çĵŬn{qĞĠš˘hŻïûG÷Ŭ~×CüüwOaıI0i3@FڒÑ`šĈJ‚µìFyñ$öğ˙?3·zġ´Ǔ$əN§sİ×ë-t:µ,˲², ­u GG[ êĊhìB­ŬHFġSg•˜s'ĉí˜y3Ž”ŜÈïي”ĈŬ¸EzTädʲÔRJUE•eYċû~†a†áZEĞEQ,úż”ĊUĠ›?t~áüáÑwì;r'­ip0;ŞOĈPBa¤3’$ĵ oç§ŝûŻ|ŭÀò·żJiL) œĊ"!¤ëĜĞŞŞ0%Ġ÷ùĥĊÛ!%k¤ê6+FÔ Á–ÑÑM{Ô9y·×jµ˘VĞ5†ánß÷OîÜu÷G|”îTĥ mŬHġÉÈ W N7pk•z3†òÊi|÷˙ vĴ^ğ0-èwÒ4=Óív/vğŬ'`ÈŞŞ*‡Èh0B2CQFۆ¨a(:ê‹jŬ‚–f£L½zıÙBJ*·j½ĦmĥĵïÂ0džçqÎ9÷}_0Ĉ˜1†B¨à‡úQJIŒ1FJ )­èPJ‰:šı™żğE*o$999ıVJ骪*GNY–eY†(ŠÖʲ\ÊrÉϳĞyoáö“WOŬ5sâĦxnïQPƒ{~ëSu$JˆħêêB˘W0N‰ô‡ĉ&÷}nñ+żóÒ]‰!³IâŒħµµµµĴ×ë•UU Ĥêĥ#v¸)R2F÷eŜĤnvƒBj`óTŬ82ÚJQĥÛíİ8Žw…axK†·~âïüöŝÄ´÷z·²„+N×óŒ2eHƒÊíCkß3e?¨Ċ7~ïŸ`zñÂċـ×5£‹kkkóŬnw-˲a2Ò#HiT˙لjR¨Ħ? ImkÊ=‡ußL£ (µŻ_×cn~áÙ2•&„ q³(ŠD†Ħïû‘"$„x”RnŒĦސŒ1RJS‚RJUU…q_Gʑ•փʍíGl"§ZĦˆIş”^–çyEQ7Š˘µ0 WƒŞZö{+ç—VŻŜżĥ÷Î{n{€ÇÓ{À¨g‡÷*Ówàİ]Ç)J ¤y…^Ħ‘W~´jâÓ˙àgşßĝi:6Ĵ½û(ŒRşF)M“$)ó<—ƒéZŒ;Ü4)Ġ.„Z…ĤY˙Ħ†4Ĝ„Œĥ²ş!B P´Ûí°ŬnODQ´3‚Cžç{üoŭŬĊûoiŸN*K8rŬığRı2Hî“Qŭ%̀:‰Ĵ\¸€oŭÁ˙‰Éù³WvâÛ5u:…1d¤ĈÑ¨èCÇ2HfPaׯ!Ñuž™ƒ ^SÏcy;êÂ0¤ív›ÇqĊq<áyŜ,ç|’RB|ܑQ]ÓQĈµ–JİJk])*7uĥr¤$+ç­T–ĴŞJْœÒeYjG(Ûu9 c˘İQÄTĠµĤ<ϳ8Ž“š˜Bu~Ñô^\<˙`tôÁÙ½Gî ̟´Í´J£,4²B"/5²\Bj@ M(*İQ ²­ŝŬ“ç8KN>é;ÒfÔ5U1ĈŽ”†òo )ëcáMŻkĉ!5h°ùB·1Ŭ bˆ˘ÈkÙî×NQwôŝÏŝâGö=ĝŝ× ¤4 Î½[:yw QôS/ĥÏÈFíŸÊ/áÙġğˆ/ż>ż'ò$ə^ŻwİNÓmƒŒ† ¸Q‰Fp£ÂŞOP7Œp΃fÍfpHŸ6ÖMB[ğÚeàí¸FŒ1Çq+ ı÷=ú`t-ÎW—"1áGmŒÑĈ˜Ê#1ÖşpÖşPJĠ…RސR–RÊ˘ŞŞ˘´¨Š˘¨ŞŞRnv”ˆ €íġKÚäl &)ĴŞŞ*˲,Š"+Ë2)˲–ċŞŸ§×òîü§ŻœşsúÖGʛƒ4Rk'r NîÈA Û-QVŒùwü½,œny?ú“?wc8F)%Ĉ˜d€”Fı[ĵ9R26B²Š;:lİAƒáè荈˜“w·Z­ÖLEû|ß?räáÇŜ×gñȚSĤuß5EieJ£PîLí kD(Eĥ2W˙óÀÏĵ°°7ò9Í׆1d4œĥ'÷$ÜáÎ}`T³İYWFÙFG@ĠĠ)Ĵğ6ZÎĞׇĠ½…aèù?Áž{öŻüÍÙŭ‡ŽhRdk+ıİ M‰M‹öŻgÙÊRž,vW/Ÿ_Y½xzÌÒDkc ­uO)•k­3T˘”ʤ”YUUYUUyY–yQyQUžçUQĠ9 ‘5ˆİ,K£”2.•WEQDQ”–eى˘¨Hıâ%Ë:óïÁ÷í;Ž.Ĥm*Lk§bе$T0b€J#Ğ4*ĝ>rTˆVèŭàß~ vfaŒ•I’TŻ÷M“Rä}=\żUş”†ĵ7SuÀöD ĥ@ív;lµZ“Qíñ<ï–]GŽß÷ĜçëžÜPrWi;§Èh90é5‘ëÍY (§` (zk¸ĝÍ/ĦûƒoŻiyOÖMݵ´{„šnœA¨˜1QߨÙ9#v˙.ċBàΙ ßaí‚ÊmddŜfÂ#ndD‹Rş…4ĵ­a!)ái  -S^ ÂÙ…““Q{'C‹ì ‘  eŻÌV–ÊŜò|Öıvİӝżş|ŭ•ç.Ê"_ÓZw•R]TOJÙĞŞŞWUUZUURE’çyaÛ ™çyċêTf rÚj(Ŝ=ĤŬ°Dê҄²(Š:ZJ£(ê…aĜ ÔİÍğwċÙòŬŜÜ>v‚Pa­´tĵ6}Jµ½N‚R”½şÔP;îßë?ìÖûŝ Bsë¨u”´.e‰Ħ{à ‘RÒD(yŻòQCH ŜĥşĊ˜ùFAˆVĞĈq<EÑî F­ömúÛïŭ~ŞcċŬp£ŭé’j£S6!vä7,,|˙¸ô•˙”myOĤizĈÙÍ;5]z“d4,÷^DF9?íŬ!”Âeçž*×úŞGü 6P›ûBl?=7ŠDaGQRJ'L%=*5vùEĤ0Ÿİu›N + 0 Ê8€o:ÜéĊğwĥÚûï;$èÑ[‘>\-]I:—Ït—ϝœŸċ‡ç‹îê˘RjEJı*ìTUĠİŞŞ[E/Ïó,·(mZݲ,Sz!$&Gj£ÒxyUU‰R* ԕ_tŠŜòcz˙“Ĵ½ŒE ŒÙħ÷J„€JmDž NY)䙁™ĵ}Nĵ˙oF<ó{>áêIu¤Ôívğ ÉÂß)9suw³×!ô{sH_CH ŜêşÑ('†>)EQ$\tԊx6 }žç}ìóżùaonOôz§‚Ş´ @)›*ɵA·27üUBmoT‰ċ=…Wŝż.޵üïYz*I’ ŬnwÓéĴŒHÓÉ15£íŞë†Ss74ÎÍB2Fi(3s4´4ĠëŒfĈŞì”†ĦÀ›œ^0j/MŒ1Ä Üó!%†yĈžgRiĞ”Êh×ÓELAàÜĤô#(,wĞ#aÇħvĵgÏCñÜÑGvßò™ÏßSÍ_ꭞ}eċê{zíâéóJİŞŞVÂ0\­Şjµ(Š^Y–I–eİÍċUžç•#&l5#&:œĈ+Ë²ŞŞŞ¨Ş*oµZi¤uâ_üŝŞÌVŜ_xĝ˜9L˜7miĠ?Fm”$5˜ë#“¨ pÚô·>%žŝçIVêïÔġ(uê“ŭfIiúżûŽÍñJ +ÁD31ĥAƒm֍Ĉ91Zâíĵg0ÜïyŜ‘;>ŝéî{;Żä ırEe²ÒÈŬ´×Ù¨ħƒġl͈@CĦûò3ĝÁżùŬêDȞ–yöz’$:Îġn·ğâ쀊†ÍTuÛQ× ÏĊ1Ĝ|FÎz8W£&Fë”ċŠMdŭCże’ï6 ސa”cş P…‚îĞşPOa0JQ;&CK°XŸKD9E/SH(ĊBÇÖ÷}"âS­ŭÇoıï‰lm>]}ŭıùËÏ|íµleᲔr!‚•ŞŞV8^Íóĵ—çy/MÓÔ)çdžçj‹tŜ #ìêڍRޞŽ[KÖ^äQeĦ>™ĵswçûĜÜm>oí³—ßĴo|¨Ò Ú€j 2YÁsú}żġIïÙáûëŒ À󖐒=³ÒĴ#ÖĈËACF7U7ÚàÄÇħ711Ño~ġ<ï–ŬÇoğ˙žŸ˙ĞÇ;•Ĉ|ĤÀ1(Ê‘Q*Ŭà=¸Ü>³Cì˜ħĊ™ñÌżúêh@^@Uĵ’şáz½^oĠQ2&$2†ŒF-,7>iœ˙ž›Û ¸5ëä`-nC­3ĝ›\tĈö#i­‰}=nĈħ3Te@•’n1gf[ĝ‡¤Òġvİm˙—Ó–ÉŞŝ9p§x”@J –R …˘MâhωŜrûŸ<¤Ïtô½Ë×_ĝîĞEÒ½&\ ‚`İ,Ëċ(ŠÖ²,ëĤyžçÒı6ŒJçĴ) Ĥñ¤”ȲĴRj)ŞŞŞ”RĉJİ4T* Šîrž.żûœb­½ ,€sïu…7 J £$*IÂ@ŠVT=›‹~ôûÂ_9ßw}V˽QRZùǏ‘éßzÊġ ¨ŝĉĉ½#5„Ôà­NĠmZ7Š˘h2Š˘ïŒ&&oŭÀßüğá³³Ğ%¨ĥc$ œ-²Ê ÔšĜÈɸSĈ(À Ş+gäżúsĊë\VÏ÷lšîj§ÓYI’¤W–ċ İm’Ñ ;ĈDH_oċûĉV -µ†t?èp†Ğní#63£•ı™ëp3×Ğ&%£-r­ÂMî–Ú€ÖO iéRD„ ``I3Lm•ѧa êĈmhm@Aš!¸Ŝ­ ™÷Nî{ì—&ï}ünÍ.½ĵ|ġùïœ^~ċŻúŬ÷ŭù0 —˘(Z$Ĥ,ËŞÄD0Ö×Oáı5ĥĤ¤‚!KT*•Ġ³k²è>Vx˙ŜŜO­—œqsˆŒSÖAĦÊ5²’C…WÜók™xñ_ éÔ ×Ċ Ċ ƒ-›‘`ċŸĵŸL˙ĉ“vCm„Ú4Ĉ6h˘£í ÛÛP7rĤİġ°½Ù öûäżö[ÓÙ]ákk%ŒÒv­ÓRk”ȵ2.2ÒpF£n8YıtO˙_ˆŬù+-A~˲ó½^ïJŻ×[vdT:³ħ7JFšaÍPÊè˘îAŞ@ëuw=^b£ÚÎM³ĠÎö͉̘Ô*QJÁ5ğZëÌhT%âS›şS„PXS Â(´Öq  €SAÖÓLġÀäVCtİmƒ/µ¤ĤµġéӜ Óİégĉsp 6;üĝs³]żkñ{_:µüÂS/!ù=‚(ŠVÒ4í$I’¤iš§iÚ'&lÒD;DÄ)ñŒÖşv—RÊJJYh­ó`ŝĠ\èòáêàn7(÷Ĥì1ċÚÖ,+J`••†6iŻ€p>âŻ<ĥóċߗŜêym†o@Ŝż3Vŝé_˙րôiŒm¤ê6#£‘cȝ!Šx&‚½ïßrçO}öC;ï{dÇċD"—V^ĞŒÒNQ'žS˘€Ù6„PN Ó^üÒÀϽĵ²3âOġz½A2êE‘K)‡ÉhÔH 5âó͢£QQ6ùž );Û7E(œû„Ù0İŝ)£TßNè DA[~”Rğ&ĠL)µzĥĞó _†^ş‚ žD09 Ĉñ$x‚.½˜àŝŒ=&Î@¤ĠĥğžH[dDà‹+Çŝڇöżŝ;•ßıZ7÷#3”°EJ‚-)ŭŸ"Sżŝíߣ†4İşqÑ0)ħ DÇaǓaîò}˙àŽÇîı³ż|Ĵ[jÌçĈÖ/´F $J£?†k(´,qéğ_E÷™oĤÇcŝ4MÏ&Irı×ë-ş1™”²rŠ:ñJşÍÈh3Â!Ûİ  ĦÔeRÀ”ë3nLzóSˆnâEç˘eŒÍŻ<÷µħÓ?LYo9Áš1Ĵ7Œ’^İCĈ`SğáÍíE0³í=íŜµM 5„5†Ú*ˆç<Ĝ*€pŠ2ݰş\!I+ie”„Q[ĦĤÔÈSŠK‰ÄġĊ;&ŭĝĜŭùcüԑΏz~ŝ_Žs~ÙóĵĞïÏA°A§ÛíĤY–•yžĞ1ġahĴĥ­µ1Ĉh7¸ÒZK­uê U(Ó$Ġêì8R>PĉÌY‰3e¸kÎÖDĦKÏ÷.ûÙ˙úïhß\W”#&£íRœ<Ĵ1ÚBi]žIh3~˘A“ŞĉB† Êş0 EÇAĞĠjÇqĵ÷ŭŭ~}ßóïëAOumż‘véžJ…RıîŜM¨MQJ­˜t_ygŝô ĠímïûU–žNÓôRŻ×[èvğud$ÇXë3RĜ8ŭs³A|$´ŭeĦ/j¨GQ¸hÈENŭ̝´ÍħÚĵ}½&Zk“ĤiÉ9ï¸ä×˙çysl6ž"„LBbBˆ€µÇñ vĞë;ÒKWĤóóĤ= Iê014`­$Ŝ “ÇîA´˙(ÀC@pÛì˘ ^§B‘VÖâ ëÇĞ+gÛS{ü1” F0\I%–Ö Ìĥ½èèéö£÷}òÈòs_>½üŭ?{šs~YqĠĠšV“$éġz½t(·Y´Ô_ĝ ÏX>²¨G×GĈÈH~ıH>D§F̟À@„’ˆT `JÙhIk”™‹âàÌĦżö‘£g~'÷ħ"]ŭJ9œCĊ(˘Ä&dD˜Ġö8™úoż'uß !5x+Ru7DIuŞĠjEqÏĝż×óĵ[îŭÙ_ŝ€·÷pë|Z8“q£ÈKi›_‹zş'ìó„¸#(ÎżŠüû?G<ĵ¨ŠüĠ$I.ġz½7í5-mîFŜDŬh°f4nñ9W?Úl_n´RÚ97ëöÈÖ­œ@ƒ8K¤·gRY–*˲ŠRšj­‰”R•eÙaŒĊ"×4Ëaíq!Ä„ĝS”ĝL°€Â#ĈXTšÎt÷ʳ;;ž½P‘‰2šñƒ'`&onïġ[PUĈÎ#ƒ) ì5†Ğ ×kCĴH˘R(J‰+½ ók%f&=˙À‰Ÿıc×áĴ}ûß=—]9ġŠbÊÓ˘ïûkžçġ’$)Š˘›4×n¨) PחŒ1Êëv×:ûç²gä‡Íԉ wÊ6İĜkIµw×T)*¨?:ô+?qĉ÷‹Àyêu˜^ŻWJ)‡›Ĵ1˘tŭĥúO?HĤŝÖ·LCH šTŬÖoˆ˘(lµZŭTŬžÛïïÄÇ?spAjtJáh­MĠƒ´ž„I\ŽNğĉWFQ-^³˙÷żĈžŞ{Ŝ'ê…^–]H’äzŻ×[M’¤çFßĴˆa+2•׿i–0µó%vÁuòh3˜²3ë=¤Ċl?BÚJ ¸áµK)M’$Ò“UUe²,“žç%„16HFœRʜu=zÁ§”zŒ1Ÿ0Ĉ‚çф ­[BŜ–devñô·÷­ßĜħZ‘ 9ı×·<ħçv°‰iè²Ö™İìıÚ^FlmMVnœĞuµT‰ë½ĞŬ S3íŭ;ÚuíÙKOŭÇï2ĥzVqÉóĵkï/yž×I’$sc!Ô&µ%:œÂ“RÊ,ËjÑC-LĈŬ:ûĠ;d>*§t›;@(wġ?+קڀÁX/@m ³÷NœÜ÷ Ÿ<~á_gĈ˜Ú%]şHİaŞ%‘q×ĥĞ˙üC˙ì½Ġ!ÛRƒ·2UGP!D=Šĵ†áœïûûƒ(>úżŝ[ä älŻ“ë²g­´;‘."PQfë U–àĠ/˙1ĵK'Wfúŭ^/½ëġuğŬ˘nˆŒ6KÏiŒï7ÚŞÉġ …,uSŒ’ÚM/]WÙm²#pÎf½pĥ}Â&$´AèRZş,ˊs!DĊËpĈ'ÄĈ¤”Rîìp³Œ1A)ċœsRêqÎ}ÎıÏ 9ç!c,žâĵ5³ct²ÄÂĞ'˙ëхWż2“Ï ÄûÁçŽ,‚+$Yâ1v@^Ÿ™ŬTWPm?W…2¸˜HĴĴydßÎöú…;Ĥüáy½óⷞáœOşTŜĵçy+Bˆ¤×ëċyžĞ²,Ġˆó‡Sxƒ9]ĞäÚçlş‡ÉGè gAsQŸ+š2 f4<7"ĊÀ@EÇf/Î}âûç˙Ĵ °puŞ:}g\”„15Q×ûíİ.6„Ôà]!m;U×n·0 §}ßßyŜ-ŝÊçg3sÁĞk•ívwсꋌ“6Pè'¤Ÿ¸âƒ•ï#ż=âOgIr!I’н^o)MSğâ(µUšîfˆè-³÷ÇN;·†şnfF$uÁf£…›wjçĞwW×Y¤”Užç5YWp&¸ġ5­g˙0Ĉ!„2Ĉ8çœıGÎ9žçqĈ˜çyžÏ9„Ħ"âœÇœó‰ŭžxċ33ŬüìĦk/žşe‰´Ĥ1w”{‰vƒ0( à3€ÊXİıt—ÉeĥL ÈRĦS*¤ıÄRKxûNüÜ]{޽o˙ʓ˙ŝzíÌKœóçüŠb‰1ĥĈ9/Ĵá–)ĵ~]İŞ* 7B½&§úŜhû :‡ÄÊ Íü€3@JÉ+F´QàĈ eÙG.ʵÏ.}7w¤Tş‡Z)‹˘#˘·QJÏ › BùÜç>wÓ7ÉżĝĊmFöĤ!¤ï¸èh[İ:¸Ĝ(ŠÂ(Š&0ÜċyŜÁŭ÷=üÀÇžĜuµ(DÖ6TĈĠ”MÓĠ)+êl (²³/âĠ?ù÷úDÈ~TċÙİ4M/%I²$I×)ê61löa6IĠmGpóÄD]#Ĵœt(bBUUġxödhÛ@&.ü)_ğċ§?*A#ĉMŒÁHÔİ;ph­‘ċ˜à¸8ùÄ­a9żšÓY=Gʑ’ˆ”èˆ(‰lv=żĝĊ/!Rj"¤ï&2ÚntÔßI{žÇ8ö8Ž£(ÚáyŜ¨Ġ>ú_ŭ[÷fär·wа1ÖI?×™ëÇİ£&Êl͈0 \¸ŒgżGĜŻzg9ÔKŬ4½œ$ɂsï4LĠ-ëVÛ$Ħmı-ĵR"ĥo‡S R}Âô’İ•xÀ›Ĝ\-Hˆ`cA}T]£oÇëGʲ”Ž  GPLÁ=ÏEàû~äy^ìû~[19éyçgC>W޳/ĵtîÖöÁYħï~B§ƒ°Œ*“ÖùĦT€² şĈh˜ 0F•Fái\¨ÖzÛyègnß=wlŭÎ}“RÚbŒEŒ11ĥ\§Ò4•Í´ƒÇ<\W˘J)Y¤ƒïB8÷glíÈÏ<.µ‰ˆ˜Ħ¤Rvl8ħjJıT‚Ó×Ĥ?ó½Ġ.{z1‹˘(w ıŞŞ*=PO´§#ëIMÊÁOBšîĤSuŽŒf}ßßíûŝĦûùóÔíiïd§‚ D;'i§Ĥ+¤ìÏ "ş1d–àµ/˙1Zóç—Ĥ}òlŻ—]L’äZ·Û]Íó<­ŞŞZo'57Î0UoBFfèĜßĵ›  …Z×^‹êé°¤^z”k˘}s*ğÍ|ö6‹Žè’$3:*RÓ[Ž *—ĉ£œóLÁƒ |ß÷ƒ }ߏ}ßoûĠóÊ+G=qê:èÂkî\ôöÎòC÷S:u ,Ž`JIeŭôœ³8´a€.$ Ui§ċÜħı=ŸúŸ?í?ġÏëg"Jièê\ nêxžeu`­‡§ë-HİvI'Ĝäù?óV}öƒó˜74a Z‚R€ƒB;Ï+ÏJĝ­)˙µİO?~GġoW}c’8Ž TYÙYïƒQèà£Ù$J'Ì{%JjİÁͤêèfİş8Ž(ŠÚaî›EHd4üġXB|ÔZ›²,•”’EQ1Ĉò 2ß÷{av0\ p%‚߯âÂ!ráàÙ³ó÷,NžĜ!vßIh|ZRÂÙ*YZE˜ÊA5_O÷<ĥëàOßşcöÈ,ûG_!„NĥÎ !ËîµŬ4)B’:mÇcı,&Ù׃µ}Ÿ¸OFÀB@*w"4(ħ ­`2—ÇĠèá}Ċċ÷MèWğaÖ¤äŒé•ÉzÒ{&u×RƒíFGĥ@ŭTŬ@t4ċûŝ.ÏóÜñİŸ$Ús(>Ó­à€(;…´–xJ£rĊŭŝÈhfb•Ĵáù˙üï1—.]LżÜͲKI’,ôz½Ž›úZ1è-êF7úÔa7Áî­<ÇFm˜Ŝçf™ġUĊëA ´ZWâ½d4¸x ŽğnF,ÌĜ&Kġb°î$TyžWY–ċafAô˘(Z p9‚%߯xùċ½ù‹·ž}ŭÜí½]M°™ ñLiŞmϒğ‘ˆs·ĥÏkUä…D6wlÇì‡˙îgÄS˙ükÀuANÊL)EŻ×ی”I˜ş¨„„RJ\WNy-şŬŬùè1Ş |KJʚÓ2JÀ”à@Ú͵}rŞŭÑ{î+Ż]ġôrϑRQ–ÔZ›n·;ìm7nŝĜ{*u×RƒÍ˘£Q‹ÎU! ‹x"‚9ÏóöMí;xÛ­Ÿüك=ݐK ĤíÜi4¤J‘*]GGprh²Şpĉ[_†9ŭBoWHžÉÒübšĤ×{½ŜJ–eÉ"†í¨êFĠPn £·ċ¤RÀP%•m­g#ŭ1áFÙB8§l½VòÖ֏Ĉ‘0ÚĊœŒ ᅒ`´ğĝfŸFMÌ9GäY–eaö˘(ê„aèRzréN/?ż°ôûÏu.–s÷rÖŜ*ëJΙuWVċfg”èĴBĤ ^题nÇSŭÖÇÛÏŭN­\”R +i'„’$I‘çıAJŠİRJċy^:RŞ{µĵèú÷ŭÀßÑN[ÇvQLÂhf{éħQµ6‚d½^<띌˙Àò?/ASJ%eYĉRJY–rİğQ›÷lê!¤›EGĜ$B˘nĴ×jµâ(ŠĤ}ßßíyŜÁċo>\2]èIpmÜJĥ ƒJ›Ş­!½3/cáİ/ĞÛbŝ|™çGԍŞ1鸭dŬÀĉN o+N½Ü×MÙáv6eçÖPĴ'Ë֙âĉM!Ŝ y ˉGEVġכ‘“Ù&9ġĜWRJZ–ÊóĵÈó<0‰¸†áZ†kӁ\™fĊÑ3—XŬñÀ <âM8× ÷ò”é“—(%ǒΠ§‚@Ŭ˙žzéƒpŝ$‡9îXİ w²plFJŽ`ŒucÔ5 {­K_~²8:ó EE›–íìvé;Ĥ ġÀé|ívŜÁH°(ìmi´ë'¨óÀ°½KeĤħl Ħîúüû§_ŭwQxċy6 P¨qS¤”ĤiA)í1Ĉ›E0séKß[8sÖ„„aV;'Zip˘uâĥsÑcG§ä•ğ…şÜ °W–e^EUU•vİ;:†|0îZ½[£¤†`Ģ1.JÚP;r}GQ3ïï Öáğ~ŝ—oíUkm€…ħ›Vi€B¤r½fb=êjé³Âùï|üâëßü I²‹išÎ§iÚɲ,Û˘n´•ĵ{Ë^#óv·¤+8á!éA2à7Ô¸Hêm"ŸÍH„ŒYüĥ³EF˘á'3@LZ)˲”EQÈÂilj”²7êî=äGóŻ^X|°˜ğ/˘ñAP/€QZiKĉn)×Ā •X.%ôLÈÔħ_şo֋½àÜw(!„ ŸÍHİ_[sŻSĤiš3Ĉ:9Ĝoхpöú×ĤöüÌÖqĠ%šm£¨¤FšKAÌN‰‡ßw˜żĴµ^˘¨W–e^–e5ş%*Á×­‰ĵĞ£#l#2ާÀŠ8Ž£0 '|ߟóşKż¸ÁZÇİ#7œş{7FI !5Ĝ,:IFžçñ(Šĵ8Ž[aÎzž·§=·óĝ]?ġ™ŭݲ4™ë1ÚŞé i*'†rĴ)£0ÄŞê^ûó?Ĉβ{™yş—eW“$YJ’¤RuÛЍsîn×èí%ÒöÍ7š]Ĥħfànì7YŻ-½Ċ<ĥZ-Ç1‚ äœûġĜ cLÌı›Ŭ£œ£€ŞŞJğ‰³Êͪǁou^·[WL™z\ƒ”RWU¤”•R*—RfĦ”éĦ êMĴċÉW›‰ŒEğ‚Ä87 Ûf‘  +Ë9Ş\’l÷ÇNìPÒÄÑßÀÔ.ßŬn7߆$Ü(TQeŻ×KœC…Ç9ZWżŝTvd˙T)El˘Ŝ‚2ndeĠwEZ"žâ8Úւ$„ ­V‹·Ûí0Š˘‰ Ĥ8çmJiDñ´ÖÌEڍL¨Ç&TJİJJYı”RYU•Ĵ/•'Ôµù˙7CT=§H+l¸dëM…Ö:› Ò{Iħôêjù@ALˆ`·ġ•#Ä)hë´% t”8üžOœĜ%K]yŞ7nŒ1ġë/ò<uĈE(HžçEŻ×ëqÎç<`ŒµfŻü—gî˙ċǵîqBwPÖ&‹ n4¤ÔH{9<†Ÿ.|äġĠËï/GQÔ+Š"ŻŞJÖçg' §ïŜġQRCH °Et´Á‘Rʂ £(jA0#„Ĝ³ûĜ­·ßr˙3×s ­­œY)ƒRYŸşžÒèÈġHÀííîżşzWŸúŠı=b/Yr1˲ëI’Ĵ¤iÚ+˲r.Ŝz“éfmŝÂɨŜ7hh@s×·8·êĴ_ۛşĤfÌu&A8޽VЇa8+„ĜË9ßI™&„D°“bU=ÇSj­s­uĦµÎ•R…R*s YY–EY–…"”ΙAŽ §íS?m7ĈÉĵRʸċĵà Tißĵ{K>•ŞĊZ{#@Œvc,ìl%BmôeYL09‘ù=?}ÇÎŞ¨˘…(7˜ŻrdÖş,Ër”SB˙r‘$²,+9ç]!ĒĊ1ߞY~rßÂ̇o….A˜p–GĵR0ÎP\b9{fQž}hJœ\ ‚`%Ž^žçEQŞ×ëéĦs¤GD–ĉŬ%5„ÔDG[ĠŽ6ĝĠAÀ[­V†á”çy;=ÏÛ˙È_ŭoïŻ4! …4 ”îOM¤8  (§e×żò'Ĝ™Ż^çTÚɲkI’,'IÒÍóĵRĠmĠg4Žˆ~<"†QË.6ŽĠ¨Ù†Â ?jĞs ˆ²Rĝ·@7*ê@<ß÷ŭ)Ïóvòü˙aGsJ)aŒĤeݐ,\I@€ÎġĞŬdéz'Yĵş´zñ̂Ö:ÑZ§Ĉ˜žR*ÑZ÷¤”‰”2İŞ*)Ë2)Š"Ïó<ϲĴÈó\Öé½m“zܐŜSJI×3¤SĥRJ•Zë2Òşş€0PÎlz”`ŬÚÇĜZ]·WŠ“‹{?{ÏĦŞ—úĠJk-ŬÌ˘zy50·ÈŒˆ’¨ĥÌUiš !V…>çĵ/=˙lÔ}gÊwM-@ƒ6„Q0!`P Ï%˘V„3äöÛŜ'.ĵâ)µA7ޤ>QÒ¨Á‘ġĵwS”ÔÒO&›_鸯),Š˘ ĥïû3Bˆ=Ç?ôħûgi_L›ŝŞPi Ô@Zt*…Ê tWr;)”‚…WžEqòGĊ1ažË’üJ–eóI’Ĵ9U]9`œŞ7!ĤÍ""ŒŞŭ…“Ñ-X›ӟ3CmiÉ’†pN >ĵµ0cŒ¸ZG›1ĥóċ´5ŸOÍvS C& "˙DkĈg&oß5  FQ]O“ċ…léôËóK'_¸½vñşÖzUk½Ĥ”Z“RvĞŞê”eÙÉó<)Š"MÓ4ϲĴʲĴrB‰áŝ02‚˜ĈıAÀEKu}I‡ŒİNèUgUùĝBUÍÑh?@|bSĤ„eĴ}“&PJĦ#%ړ=³ïsŬZŭnš+1Ĥtd§µÖ&MÓJßx=A+PEĠëġR!Ċçyçĵ5sġKßÏüSpCCëLB Ĉ(ˆÔ€6(‹jâDpyíÌûöˆ—ŻA°EÑZğŬΊ˘.J2c˘Ë·lLJCHo_üâßjw—Ÿ¤ôÜv&ÀÖÌ5ÁŠ0 &=ÏÛċyŜŝ{>ŭó'ş•ĈrnċĥR…‹ŒzR#uÊÙşB‰MĠÉî.çË8ÀÔÙŞ(.dYv=MÓċ,ËêQäۛòşŬÚя÷ÍéfXı{ @8ĦҞ Ë]Œ@fÖyà 踔MñâœS7†< ”NRú‹‰ÄPş4€Ĵ_ŻÍD…(&‰öÏîöŜstöÖŝÂí˘èÉĠ³ċ3/_ğŝÒÓ'ËîÚuԒ”r9Š˘Ġ²,W8îĉyŜKÓ4KÓ´L’¤t"Í]#ĈɝkyxUזˆIi­Ġaór%HġáËZïħ‘R¸aÂĞKĥpSiôz%Ú-ß;ı÷—?xĞü½$4ĤZ—nV 9Ĉı9ô£ĤZä$Iâûŝ˘T¸tzĤó½[Z'ŞÉ*Pj‡ċrJ!µ,*Díŭíԏ !Â0\ÉóĵÇq9% ލĜLà€wS”Äß-Äów‚ nV4’”(<ßEG³žçíġŸĵżµcWxş'Ħ•²ĤİÒ Ğ4z•ĈZ=rĈ~³§qĞ/=ŭMxWÏu'„|ħWWÓ4]ĴŬĈ¤êĥ3ñu\”ôcİm\­ÜAçQG(…8#``ÔîÚĦ $5HJy VVĉM^ïQu$bŒ!°N>!$6JqcPj¨BA÷ލw‹´šÌk`~>s>£íHĝĤo™;úsw|î”WO,ĵôô……=ù²RjÁóĵ… –ʲ\Ž˘h-˲NÇyšĤyŻ×Ј c"Ĥqn€›îêj=ġĜñŝŭħ'OñĜ"Ñp7vÒzÎHkÖjŠ )!ˆÛ3áë;˙ÒGnżüG]7HŻŞ§èġz½2Ïs5b“ÓWÁıԝLÓ4ó<ŻëyŜ‚˘/|ï½èÄîSmfS²``ÊJÁ+)B‘g˜ż›ŸÍïxßqñôÏó[EAċ˘¤M#È&BzÏMĈ쒆ŒŜ4! {Ӎş€2ĈúёĞÍqÎ÷ŬóİŸ=’TŬBAk‚˘Ò(”m~íTşïÏVï(·ƒ÷Şëgħƒ'Íí!}İHŠËY–-¤iÚIÓ4u^u£Ru›EGïÌşÑˆÓo\§°ÖÔ½1 Rc9)Q*êÑ:÷VĠŽnˆŽ)Dk-xö,KFı‚)•mŜ5vC i%ŭáĤԔ`ıSbu9NjçğˆN÷Ì웽ġ‘_™½ûżxWvöG‹—ŸŭúËÉċÓ'…×=ϛ‚`1 Ġ(Š:A$iš–išJ×s3êilnÜ —*+ëë\MĈ³ĵn$o‰ ßKĵY8Ï;û›F\|™ä ”@´ŽL]ÜñÄG÷/|%­EnD„q[Šêz’ïûkžçÍsÎ/í˜˙Òsöŭġ­ Ñëµ$F)”6RÂ÷‹sûqú6!×İğ$ŽÒĠ£$`´ŭÓğ.JâïEs³ŭ‰’ÒJŬlBDlœ²íûŝ´çyğo{⧈çv…Żw*;lŻÒ(*…Tjt*i l Ùñ)uı{Sáâwż™di‘êTZ׳,[IÓ´ë`o&UgŜÑu£a2rJĈMÌeàÄJÂ{Ŭ +½EeìY÷êÒĵQ"ÂfѰRŠş(İżä+İĦ³2r°0ëäŭ“*un•QhÈ)şıFg%ÇéK í _Ü2}çž[>óž] ŻÜ·ŭ?}ıwñġW=ÏğâyŜġ ‚ XI’¤ARGġ\ Œ›qCêŝ?7KĈíHİì{Ès¤œ >vd'˘ †ÂH S§R€a y’ƒ‘‹“ïßóNêçS)e611Ñ9žĤiŬ4 ŒñTJé,Ë !DÏ÷ŭÏóñŜµÓ“ù™[Wé]†ĊNûQ²rµ¤,/A£ŬäÜê‘{nçK§<Ï[p$ŜK’¤(ËRìF5ßuQÑù˙†„6'ôM##Ĵ7Š ˘ &…;cûîŝÄÏ\Ħ’EŜĞ€Tëz€Ŭ\ÂmßQvî$Ö^zVŬ)BŜËŻfYĥ˜ĤéZžç™K½ÜĴs÷–ŭF?~2ZOWöIFÙ4^'‘(2 AJj`¸Ž#oä=³U”Ô‡[ôµÖZjé"˘J[™:ˆ 0áş&(P†Hch)a âY]ğÌV‰•ë)^ŸÈ°wúÀì‰Oŝš[=}×Òs_yuíôó?B\B\ġ4`v^“°§‘Pc(µ½TPĤ’6í%M.ˆ†İÜ×FĦI!qŞSàÒBŽŬÓğ§O<ŝ·ßàó·Ïß}Ÿ]?÷Šâ’çyW}ß_‚`µÛíöcĊP´´YgçSÚsNú#Ç !ìûxü‰UM&h0T/NğĦ‰ġo.$B„!?Ù~âÑğŞ/,„Jġ¤”YY–…^–eıY=É8‰:B¤AĴzž7/ÄÚùÙÎ3çƒQ œ* B·µE[K’ŝ 9—żëNĝšâšd˜ôz½úo‹Ŝ•Q‘Ùĉv#§†Œ6WÖĠê:†a†a[1'„ĜsçÇ?s¤+ V2…ÒYeĵ×*…ZKÖ[°§kݽ„êüëċŞ_LÓüz–eKY–u³,´Ú**ÚnŞîR7† ~/­[Ê! ĥ Vaċ”‡šFP™ġùH7!"%7ó=µ@J™k­;Ğİ.; !!ÜR!Fm´[)hMA )*σ) ·Ħ0!póÜô[Bܨvm'’i!q6İpu%ÇöìÔáOŝŭ'Ú矺uċé?yŠÒîĈĜ%Îù5!Ä"ç|-I’ĵ×ëUµQ×zĜ ƒ¤äd¸Ğ51QJù­xÒ{1>œ2?&|¨cÜëÖV’o`*… €jk_(ùà~ùíµ0 {¸rvJ›EIuƒ‹4M{A,yžw­µäsЇïŬ›+AqPÎÁL€˘nà% ÌP,{'fşċéÛ~ùj Q­ĊqœEQ X r¸%h1N$fBÚŝf+"Úìı†œĥw~GÜsŸ3W;âEìyŜ´bîècı۟ ^ïV(+ƒĴÔH••xoœkYR7Ú)|ïĜm²ËJ–—ò<_ȲlÍ  —ŞÛjÑVİşwXŬh™—J£×İ ”%›šŒ¸5݃13HKk-DÈM—ĥ³GH¤,Ë˘ŞŞ^UU‹ç_|öÊÚëOGŬù‹SFV ÂmMMîŸŬ6µĴ½¤µ$ Ê`…ΤŒI•ràh 2Òı$S–ÈJ‰ ½+k%Ŭ7÷[~îŜıì‡˙éċŜkß}†s>Á99ççyĞœó^·Û-Š˘½KM´tèħ&%SGJ”ÒU7%–·ñîdOF? >ŭY2Ñ‘n”<£öxÜ1”J!ĉWڏ˜Ş.ߪSkQ%ġˆ7żIŬ8oĵZuAÇ÷ŭÏóîX{òôċéŸĈÚmQBA€²´­‘—ó§q!;pǝbŝ%)ċĠ –0L|߯ i;QÒğ"Râïr32ڎVÄԐÒxrLÙħµ£0‚ĥbVħûĥŝÔѤ2X)”m~•Vâğž•z !V] bSTËŻŝúÒÉbU/&iq=ÏóÁž£q$¤FŽŜ"JzGé´6FjÂİuú–ÊÚùQ[Ì&0Ì@PÀ %‡ukx{îVRU•βĴô}żCı~ܟŝSñŬìèìt’ÒʞLŞkÓÉġ+S½ ²UÚO U4ñıcàïkíŒĦ0ıaÂĤ•²u2uÀhíĝRÚĉàNU -5–'D°ïž_~`úÀ}ğßŝ—_§t­Ċ98çW9çŒ1ÖívğEšĤr@>jÔ8†H‰şš’K™’Ĉ£”ŠŜ ñôôKчï!Ä# ž3cue!!Ĥ%˘–ONûÜw_yċb T'ޤvŜŽêž2ëËï_o-?˙Rkĉ‡×4oz Z‚Q€1­”ëDJxaˆe~x:7§Žr^]ö}> 5ß÷Ó˘(è@_Ò(Uy›–ŸHBz#dD‚  žçÑ0 İ1†¸]O_1¤µî˙\ŭÜ5Ñz*ç'Ž˜FœÚvŸ¸‘5ĈPB‚ÀoµZí f…s;o9zdĉÑĝtWĦ( 2İ-!)Ócġ/ Ħ` UóÏ~ {Huħ*Ë+EQ,fYV›§–›̘çîIĠ @;ŬTkPb›„!àÄ6ËEà ZSÚ7pÛŭ S…βĴâœ'Zë%)ö<ŻËğF))€ &ÄoùÄ߈ŻĥrìX]}nïâĠgvtĥ1wŒ‹C€E?İ4LA K B(LúJ=ÀÀä†3 ÒPE…k™ÀZ*ħkĉŽ=ŸĝŸ>?ŭ/żGŻjQJCĈ˜Ç[àœŻQJ³4MeQjÌñêëUJİŞŞÊ$Iˆ‹”8c̏Èİ€żwî˘>ħ—ˆ)ĜI‘îWh›/5JÙ@ŻT0í#áùêŝÇÊï.…a¸V–eŻ(Š˘,ËşjĴêÎ džçE–e½0 —<Ïğ6µôÍ3‰ŸÇHê ĵ#€r½{ĈY.AÂ}äb÷À]ÇĝêkBˆĞï/;K!éÈpT ~Üܤw,1½SUv7Q†´Ġjħ(Šx"ŸsÎ !œ1ĈêupÑEH?‰D4Š˜?´Öt€œ¨Öši­İ"Š˘h& }žçĵS?w{İA$ÒR#­$Ö\á}$7bŬ½`êK/WÏĉ3D’”ċ|–e+Y–ġòÔ£”RXûŞĴİ+Ŭş€ŞŞ  ”Òzc,Ĝ·òä“ŬÙıŸZ‘l‚°IêĉTı:´‚!e^!j3\ Ŝ·³:w‡Ż./GQÔ)Ë2Ëóĵ”RšÈHIk­ó›EJ?‰Òày n20˜`”ÒX1yŜÁÖôÌñ½w?8s%SȕAŞ5Vœi*ŒYŻÁXE'ĥÙPĉ¸ŝüwħ‡T—вĵZE-dȤ”Ġ@íèfˆh³ôÈ;8ajú‘%V…H ħÄäênŠSxÄ@( ı5ݚmüßȝħ”RgYĤ¤”UšĤF!…cŒB„{äŒ1Á.R ³ÂKĈXÄ9o !Ú1ççN´ĝ´Ħ]‹+ß?vmŝ…Ŭéìm-ħï>ö>˜ÜNJµê1·Ĝö_ŒÛ”ċò<˘;÷|ò֙é#³Ŝ÷ŝàϜ›'„pJé24ŬBì0’””R$˲‚1Ö ĝĜÚWžyŭÙÇ+pÖr'H İ ´Ĵf AÔ"'³ĵW̟÷}% ^ÇuênK¸ëaÊ0ì†a¸ìûŝüÌò·OwĤ?wŸÊRPÂ@İĚÁR{n2ä0·‹Ŭŭ÷äÉ)Îùt+žç”Ò %ßSÒĜΈúŸHBÚŞ/ĉb ‚€Ċq,‚ h‡a8Í9ßĊ9Ÿ%„LBBŜàï\|›èhô9APŭGÜLfcûîùĝg&è镽˘B§°Żŭ!¨vG;–Üĉ)€µ § Ż/§Q½š”ċB–eĞv4Üğ]; Mí½S£#c,ĠŭX¨Ĵh+n`Ä֑Ojĝ‚B֒ä7ñg7Yˆ ÔRÊşN§Ô}-ŭ@‚RJ8ç‚Rʄ‚1Ĉ…žÂ÷}?BDïÇBˆ !ÄĊYÏ;³+Vsìcç_|íh·}dBìtò (ċ€0Y…ÚiÖ¸a:Ż@(ĊêJŽ,­›<´cú‘ßúLôÌ?÷C@B˜“p/Hz½ĥAJŭ ŒÖnDDáFD,p΃[‰OxOíx‘?~áœb}Â/7Â5eE ò‰;Z×Ġé‡gċËKQ­äyždY–oWàP…̲,ɲl5‚ùxċċW§w>qb1a Œ*KHÚÁŒ˘WĞ=ğoñÎìö<ï’ïûóQ­ıA‚ƒJ;Šwéwš¨a¸ĜŜ’8çÜóĵÚĜsÏżúùŸ\ìײjkB£µ€İgnn‡´ pôÎ|ÚÍ !îljMݏš2ɢ7&cÍĈ?ıŜà>bÚŭ¨BÖ2ĜQö_Ż{Äi[Iŭì@%œlĥ•vvüî˙IĜœĥİ@@j;GÖŝÇíŸOĉÏ/gXÉ5ŒÖµpjŒĜ™P B€|áò‹§ġÓ/çiħXĊjžç£Üĵ·Ów4jÁyG6ÀŽ.­Ŭ°‘!ÌĠ‘lŬÀOPHĝÊġo™7Ċ€,„ÌRÚĴbE´Ö¨7eYJ7ŒŽsÎ3ß÷k'ĝ• –œ-‚ïW×oóóÓkŬïßyzċô1µçÁ€ĥnñc@şí#µµ@+ ˘ ˆ (ş–„žlÇêŜżŭщ˙€+6Čġ⿉Á S­ĵs#"V…×8çí}kßznqîèÇËŞ`!ŒŞê?ÒCPä%tûˆwQŜö>ñka.ċyŜ˘¨Ĝ"J‚K—*7À0Íó|-‚…háé—ÚÇŜËJ.}Â(!VbdßAB íÁµ•]w°ĞsBˆİ â :BˆÒÒ°,~[3“BOB#¨cŒâSJ۔Ò§³JœF‰J ƒ'¤?SP‚Fà€i+ĤİÓùܲ’u€ħSµûĞx]é „Ü~Ñ-du @̆Än5%£Z‹K£o¨uoPİ™~˘ƒM’äĈm×ÀĴ{û6.;ÎgşN;8ö#„@;ÙU 4€T€Bi”ÒB#—v”„4Ú/…çÀoÜ>´Ŝ†Ú´ŬŸĈLħş]^)Ër9ÏóNžçYY–µ£›/Œlˆ}gGGë÷Qf}ÒzÄkï;wñ,1œ"£o˜Œĥ"İí’Ѩƒŝc=“h`-…< ÔĠHÖÂ0\ p)öċâ^~öÒĠŻ?x%8›ìş‹Rħ DpYû֖JĥnB9E™UX–f: Ò;í£;_ú=ĴœŻ/y=v"ÑZ›M$á£êI*˲\Á<Ï[B\ċœOî}ëäkÁ‡î0Şá $Œ”ŭ‹H*%˘8Àeqçŝ=êìOÊù0 WêAz›DIŭ-˘”RıĦ{Ŭ²,W<ݘŸI_¸ĉ=pPIÊ(5¨)† h!–ÉŜİŠŜÏyuÎóĵĥ“‘§yžŻ›fhM}Njĝ;„„0†Œú'×!!$¤”N@ĉ`NTʸbşAí˘2_ĝŒÀ§€Żm‘‰Q€êġ|`y·bh·3  5ëİ8Rğ ,òfá†É °;A÷½„ÚÁkĞ• ƒ'İî˙C]_Hß²OTڍ1Ĝ0”T›ZĜCŒğbĴëKY“PQ:"*´A. 2µn]c´Aíàâ4a.1?Z‰=ÁŒ²³„îé—Íí'Ë^ıX–ċjžç‰SÖIŒĥÚNtô.KĠ­o:`Ĵ›ŞĬ½*…5ÀZqĝÔn˘2³iVÜ$9ŒĥWڌŒèˆÏ7l{\ÔD³,SeYʲ,Ğ,Ëò0 ³(ŠzEQt˘(Z ‚jeŻ_.íÔ/xíòê½ùÜ}1m [?"†˜~íF€” ‹‹)ĤfBQûĠxġwoÔù”“\'[ô) ֓H-0Ȳ,O’¤Wˆ˜î½ĝüTë}+y4 .ÖwÊîöŒ” Œ MsÖzoTˆcĥQGşĦ?‚ŒÌˆÏÉP½˙µRʸU–eċún²<ϓVĞĠ‹˘¨(µv_̟[H½–wv³éc ŝ$Œ2  ö(mÇèş&b ³–cr"òÏùĠǏ½ŝÏóÀiŒİŒ1ʍšHµÖfÀûΌHSbPäP–e•$IâYÌ !ĤnYŭò ĞíÏ}ÀȜêÙ÷éïÌ`4BcŜğcçA}ĉ°çU×Â0\Ž˘¨—ĤiıU”ä":éF½÷Â0\ñŠîĠÉòìò ŸÛAŒ…ĞĞieÏg |×ÖĉvŬâŸŬÁ9Ÿö V´ Òbf?7ĤʆŸÔ[żĠġ˜˙4£áûÂ`<Ġ¤SϤq³†jNĠîk;pԔAe€J”Ú WĈ‘$èáׇ£7ŝ×Zèˆé×ĵʅː×.Ş)]žJŠbı,ˎ{ÓĠ µÌĝFGïÎI ìYÉ&ÈEH„Ú´ĴA (|Á1 Ċß9Ĉ[fm&lim3´hŞ’oJL.FŬĝoİ”ReYVeYĉJİ<Ž´èü^òüÊKkäĦ²%}ì(ċ€–ÎáĦv7%£èehOìjż÷—>yâüï§Ĉ˜\)UJ)eUUÚMyUˆ`„kĠ[žçY’$ß÷=Ïğşwċ[?XĜuÇlše>áç.áĠh݆óüèÜ!sêïWW|ß_%Ŭ‘¸(İʲ,+˲[–ċrkċĠÓí]½;ğP}?Q@`´†$¤½óŬÉGĜâ,ç|Âóĵó<Á+”Rô&Ä ï¨Œ³i+ş .ԃdd7×#ġˆÁ‘H˙-ĤMmŠfÔdA_ìfúıħ…êqeĈ3• oxĦNżİŝċêZġqj—b×°dĴj2ÒÒÀ’2(´AĦ­@Aš`I3âĝúJA³ù1S[âêş'X|íELĞdĠ(ı \)Š˘WE1äèmĥY;KBï–èh°ŽT‹$•Ğ+3¸2X ƒ§€ žÏ7kĜ,j"[¤î†IGĠĈ‘ÑÍ“)ËR+Œë}ŞÜGĦ”*B­‹ğñƒâS=’ÁÄ$ĜcgvÌE­,""H8 N_šùG÷-}3 0—R––“ìHómԓ ToišĤïŻú]ˆìÒĦòًŻò‡AU0”ĜœĞŞÓh–”òBÂÄèĠwäÓA\‚`% ´( 94žâ†hÓÍK*òéy^'„`ŽŒG‘67ĵ#˘§wZ„DĈ ´ÖtÀĉĈ=[ĴŻóñê3Mˆk_6 †8^¨³qËDfPĉmÖµ ƒ%£‘‹ĝdc˜˜~…è†T›rQŽÒ –dŒ‹xÜÉġ˙w$U§Ĝí÷h¨Œ­™á$à€†jcdDF¤éflH ş*+3ëŜ$ÔĜar„QR!½x ‡¨şRUĠJUU²,³˘(6sôŜšÎĵÛRu4`”ÍGYUÙÀ=×?ċv†'!(Ğïg2ÔĜĵÙĤnĞúÑ(2v‰&cˆĵb2pF§yžk,e!•R26ĤşC?WjôcŬJNx7`„ §úET;0KJ´Ú>N?~hŞĵü`¨O&ZëTJYTUU)’mԓú[ĊŞŞ¤3›í†a¸ìyŜµéċ§_˜Ĝ÷àŝNO„0FÙ"İ“ Aù×èÑŬ‡ĝé½B”WÂ0\ ‚ çy^9d't}ìˆSċyžVUĠ­ŞjĊ_zöÔ̑¸–B*eIˆ¸…€@K¨ŠĦâ;ĵ3s$f×Nzž×ò-ĜÚnĞ‘MÊn‹<ĝHŬ€ùgíı­ì"]×lú€1 Pvĝ5CÖW֍éġĚJ›‘žM#£úI­C3NFnj)ùÀݎˆŒéRáh§‚Sġ# ¤²uĦÊ=_K@ƒQŜ@–mH¤ħŝ‡‰J%ö0ÁÀh²tk=Äë5²uauÚċbá äÂĠŞ­Š³½ŞZ-˲W–ċ81QÖ½kA˜ğùlW6”^—áŻQ÷)¸­!mùŝ³“ùO_Ċ2EL_“Ùpf8Ò2Zk#4n¸RJicŒ b@Ŭçäkž˙ĦĠܟ¤Ŝ À˜ÍVTNz­ À)L%‘t Zħ ŻOú{Š?XµîFQ”VU•—e)ĞŞÊ7IŬéĦ×˲,Ó4ÍĴ"0Xô<ïÊôésŝŝۈ&á0eıtĠĥàU *ÜÇŻv÷Ŭ½“§ç|ßż†áŠ"”Ö à£HħŽ’dQ7ĴùÙò• 3ß½Nŭ Ê8 ‹ġ7ĞŞ`À!+ ïÁB§u˄`SŒħĥçyĦïûbHm7jCшŜ` iPi‡óÔS]l×ğš% ¤!µÔÙí/ĵuҟ$mXG ĈEd`oŜ—Roè2#²ÓĤ߸şħĥx^ú:•¨ĦruY‹Üq”şNۙŝâŻ]ÏTŬcDà$³ ÄĜzĊ`™šZb};nnL'İ!o`Âì´vħ€#Kíĵ׌{“jÓuĈh,z 3:ïh–¤”keYĤEQ ‹̛ݽ+£#í.ż @ŞÖ(Ĉi$ûËıħ‘Ĥ6àœAp6ġӁÒfóoĥ³ÀŒ"+³ÉÑ1ß7*:Nġï,GJȲLğ^"eŒÑĈÓpOӗ'[îÄTÌÔĤ;H@ƒÑYĦD“Ŝİİ'>x[ġ‚ èI)Ó²,Ë<ÏċÄÙqĠĤEÑ8ĝ??½òÌK³‡½eiMt½ŬÒ@)”„ßÂĠµŬ{÷ò³;…3nÜx/˲2ÏóM+ġß-Ë2ĞŞŞ£”ZñşŻ/Eñc²g _alşBAŒó&°,§&ûtÚĠ‘"GHT)Eĥ™ĥkjH71 FEëĠ45܍êȤ‚Ußí„ d@jíŞ/ĥR¤Ŭbżî@0èÀc0èÔ7–éu`şg_Ĉ‹ÚxÁ’İ]„ŭUÁ‚BY5F+PJahÙ¸ˆtöĝµ›D“~SŻĦî5Qҏ™p>ƒ]¸Nĉ­ ÀíŸy-}팟 c›^İvÄÂŭ.÷93H.žĈÈ+UU-ğt]]ŬŬʙá=­÷„Ùsh -(jğ² YT£ pBQ­ŜR•fŜ “ϸ]ñ¨Ǹ~3ĉކğòhMJuú}pƒAA‹rŭĥ÷RëCÈ ‰˜ĥ§˘~˘(d)!)ĊwN_KN?ĥS?ż"ìĈqœÖôF¨î€ÑvIÚîrgqµèyŜġÉóW–ùûŽ@•ë”Úq£’NxdŝÁ¸#OĊ•óžçM„a¸*„Èœ¸A7ÀĠĜj%b"\ Ş}ôC·t—%aŒBÊʵİ@J€{ Z##Óa†xcċIÎyìûÏ9geYÊMêóf“ġ×ü¤ÒĥCğC@Ĝú`£cAéî5ĥïhà’FCƒ˘‚M‡iCĴEAżĥT“LżëV>ĈĤŽ6œÔY×n.ÍË)ÑĠÌĦ(q‘Ò@‚DŞà$€ 6 ÔÖ(#†Z²Ñd}{êl€ŒÇÜsd½é–ĠN vħîµ!˘Â×7ğVjğŜdĞ”lWk+™Żí1MíÎüSÛĦbËW.A._Óm•½šUĠRUU]·ëĞĉûŽŜ½ÑÑÀ¤+Ŭ÷²Ó.í\+(û73qî ”€SFށĊkà=0\˙Ò6;;Ä´Ù{Ĝè59êïŬ Żvz£ar‚ l Ö a-Bĝä;ŝ Ÿx´Òuá6ĈÖàˆMq§ÏƒxJà|ĝħċفRĞRÊNQġhˆ|€0bӗI×ÑJ–eI† §ŸzqòûĴJ-ˆ¤îïÂMDĥoŒJö^\Y˜;r+ŸŸġTfKn¨†€2€è*M ĞEe  ûöCŭì3\ÔµĊFqB"¤Äùè ¤ú^jÚùÎ(׈kœŻ`{şú)J²'÷;Œ4ĥ&B”ÒÔ`텧áŻ-.i]^,Ërı(ŠnY–ƒŜj‹´ŜcÑÑ—Û˙?{ú$ٕgbçnoñ%ÖÌÈ=™@(U…ÚğÖ&›ìĉÒĊ1’˘ÄŽ4c䌤áH™L6fúôU_4&Ó'ÉLÓ6—nv³—Ú U¨BĦPĜ‘@"÷ÈĜŭí÷ŜŸ>ÜûÜ_xú‰*3‘‘p÷çïŬsÏïw~çüFÀjħ0† KĊ×·™İéşàŜ2+RJĊa†­V+¨Ğ‰ˆ&ô Xüí”RŬ<ó²%6ƒĞ4S]ùmĥ^ ^\ü5ñIÎ3óĤ§ħo']̲ĵ{B^Î>ġÇĞÖvûyžEQhkm5…% €ÔZ‹ŞŞŞ4M‹vğ½_–ċVPfëNj×6öpñ¤Żż;3X¸R W ™ÂNĴBĵsLİbɛÍîJ)™ÖšM)Ö,İ*Ë2ÓZ÷Ĵµğqzigqé‹ [ $`ˆ$וXt [Iwġt,–|HEQ]ĥ³SÊvÓG*ğ)Œi”!ˆH`“;A×q3rKŜŸÌ-şğo½†ġ?˙ŸĞìòÛĈ”@ÎdgĜӧٛÜ—òä·v Ÿú";ù;¨èäÎD0p^ÈİGž˜÷Én_Eö?·ğż~ħ,z=÷üè Laà…×43ĊHsü^²ïĤmĜK—@Ä|D5¤‹ĵ:ışòó\ç×ó<ß.Š")Š"ŸÓ™Á>´ì¨>_šÜBĤPú²ħuewm°!pYÇ8!ĢRj%ŽĠċċċ2Š"ĦµÎĞŞÊµÖEíž^Uü˘ËGÀhÚpë8šT›Ĉœĝ@šİœôzäÁˆ !ç\µùğÑıàä‘+ĊS'!ÁˆK#äʛd ˆ,‚Pàv÷ G×ÌĠOĥÌ{›QíµÛí4MÓÂËÎġ–„‘^RÑXŬ\Üúɛ g?{bocי@2˙ ŝoŽ˘Ô è8ż]=½*ÓKŜg.‚ .ÛMdI^Ta|ż5İŞj?Ŝ}êÒıݟÛÚìùğa6è'‚cO/-W+BˆŽR*‚`’ü3Ĝó£ÒĈ„qìhJ–`½żcnıùk T°>}Ñ}o÷ö-ĴîÜĜXé;ÖÊ\k½kŒI1T07kÙ4yĤ;˜O×ìA°Ì×ߔ{Ù·Îv°“UaVŒ# € !(O ݽ÷ÉżiÂNYUĠ޵6%˘ŞùüĈ<·ħÏuÜkĝ ™PżGçb‰¨0ĈôQğEÑßH²l=Mӝ,ËÒÊM*NŠ(·¸3pïáè=_Ħ1äûˆ†8Tc×aµ$†J)Ap@%„Z­Ö‚µĥݵNŞŞJʲL|üAîĠZÖşYUÁħ9™Ò$&1mq#@6·TUUÄËcLħí“;?úÑŝÑcc· ,Z*ï'q_Ì&B–TˆÛmv)ŭô§Ÿ/ŻżĠFÇ{ív;ġç„M8¸ëaYßKڏx'È6Ż1×÷vÑ^rŝX AßYŜ9‰ÛëK'քXVJu£(Š0”iš–c†d.˲̵Ö}ôßDQ bücA8ĦCYP¸ÈwôÂı‘½*„hùĵ*>Fŝ}ßÇRÈûp& î,Ġ5ŜOî]´kġ™24ĜÉC †ŠK ½@zg}/˲keYn–eÙ'";PÖY|<·q“óBˆ@)µ†áħVĞuîâB`)xOWdšîĜÔ&/pJ˘ĥ½@zs'˲ìJQ·Ë²Ü÷‚€ú9 >Ox˜ƒ~ß (8'ç`½ŸXîĠM{Y–íiÚ˲,÷ğÒğqe8hvTµÀ¤t˜àĉÊ Œġe( €;K!&8˜l!¸%^ù]„aĝ¸"RJ­Xk·1ûĈ˜=c̞ÖzŻŞŞŬ˘(zyž÷³,˒$)³,+Ŭ,ò’l{ȅ‡&”“%âӘÒÄA&„`Jİ:Ġµsqï/ŝòÒwVUİoI[U~+iĵu•†)Ê\ëvqŝ³Ğê͛Qm·Z­ŭ$Iò<ÏÍ8Ĉ°ñĉÀjZ–ċÖz³ğ÷Ëë­îß\Jwӑ˙—´† %öĝÑ+âcJ•‹Ŝg.Rĉ>f|bÉCEQ”UUeĈ˜Ä³ŻúïíËè̑ŞÌ`¸t5ü?ëİñÖ1ì$­KŠw”-TPb²bò2Ü iZÒ((Ŭñ˙ú’Ŭ°#yǞkÄ(Ġĝjà*Šb3˲›ŭ~˙vžç{ġ‚?fħ§)ϽV>.@0jµZKDDJݎ%vV1 œÄ&w§É „{ù˘²,·üóğ•eَ1ĤóüĈ>× @úA€İùwĴÈ?ġ€dĴµ1Ĥô3 Y½[Ÿ2{4IúCëƒuxaä,†Zğ²1€•ä/Ò*’8rìTxá˙ò?<vIŜîî'ĥ7n·\ÚşüòÏŜŬıŝŜ5­ġĥµvSk½YUĠvY–[yžïĊqÜï÷ûi–eeQşŞ*ƒ;ç„&c:H͚…‘ĝë{c,˲B)ĠSJm*ZıŬ=×ŝġ™w‚/>ÁȸŜñÉm÷gÊ˘BupMœżpL^:ÁzÇÛív;İYŠï­LŞqX’ÔÈʲìUUµÓÚ~ù•Ġß{*Û·‚{Cdò%kâUiA­|³X}|UôßPJµ}²n’çıžr.kr[–eĦµNŒ1½°÷ÎúÚÒĊ#WúYcSjÏrÇċ2öŞh‡ĵ+„ˆ•RQ²ÑGšĥîÒÈ÷?ĥ*;6çÏ\䃒“ŸD²Öİ܀ƒ†£WÓĈü‘ĠZïçyÛï÷7÷÷÷÷´ÖUcFY˘(""+lÇqÜŻö¨öĝ­Ö *ûd¸SÈùœ!­uŻ(ŠŬ$Iĥ÷ööĥ˲,Ĉ~İ8k‡2Zê>ùìS‹gżúw.ä½­üÚk/m\úÁŸ’oŻ_6ĈÜÔZß vE[qïöz½~’$y–eU–ec²î˜Ĉ-b˜R³—5?n[kŞŞŞ’$İS]7”×Ww~öÒíӟ>WQ‡ñdوïyĞ0‹²ŭDĵaŜy~Yżs# :"óY,pKò%´Dk½kuµıX]ŜıÎ….Á„U•ÛpZò³Q<>ŽÍŝâñ5×ûëA…a(“$İ&5’0ÌIÒŜ„8ÓZ÷ƒ½·o,œĝgX)|ÀÀ=‘Bϴی‹!D[J)ç|t ¸ÏV„9¤Aï@˙ÖJ°:•ĈŻÄX0ċK̀ĥÖZëĵ(Š,I’´ŞŞó9Lİƒyk­˘¨eŒÉ­µ%猜zÍKÊ}éšĈ ג7Cġ@KDTj­Ë˘(²4M³<ÏsLwÂĥw Hó–kšÓí£;úÑ´DóFJ<b†+­+×ılß71ڐó"4 ²ž5àuÏÏİ‹²0Ĝî•ÎC0p%£Ġs_9óäĊŻ.żĥ}ŭ‡˙îċäÚÛŻK)Ż*Ap+‚Í0 û½^/‘R²^ݧïċ< „CüÍɒ0ċŜB½0WUĊÒ4͂ Ĝ‚ ­”Z:·ŭ^{û‡_ V1Ĉ_ÊŞU²Ef-ĴàÚŝcçÊËǃ ¸áKwŭ$IJïqG3vYäYRß³ÓÚ{ġúÒò“GwŠTÙad3œòŽCqìĜERjUQR ,ʲ´Ó×ûŭUZëÜZÛ§|w+°ŭ‚[Š>AÖû¤pX˘µ‰g:'cž·„Ħr÷b‘YòïûĤtżŞì0•au*ëĞ›FÊy°#ĉ=c­kĉ¤ĉÔzs÷gc–1F́Š/:˘:Mĥ F •gyĦf9lÌbOS€é^:bó§Š›J³†a?ìÈçT‘{Ÿ½gU ÚZTšCK ]îÒvÁÀ87¨z½·n§(ˆħ¨snġüßù?~kùúŻ>ıŝŭ?ŝħĜġş”²+Œ”ë~Ü'"ĉKxÀä¤Y ĵyXFzUüċ{ÖnHµPJ%an…ax³Ŭ˙K7ÎŬ¨NsŒFû“6$ĥÒÈÛÚÛôö³ŬêòĠ0 oÇqĵÇqŜ`I„ÉâŽÁ lQyUUŭŞŞö[;Żż·°ö·ŸŬe¤ $lUïx‡Êö²Ĵ@á2ߣĊs™½”j…a(xY–ÓĴœàAPû²]j­í‹üF?ÊížceÖ8?k|şn-cżŠµoû²]HӔ=H}$ŝŜÚĴÙKtdÉÏ5ú‹fë-ĴF œĈ˘oĈìì œ‹ÏèçÑïĈƒ‘môWĊ‘Ás– Ŭ÷}=ÑÖiĴü€u+1Ĉ cÌLx~zäëú£ù÷Ŭ|TÏĠÈżÇ}}>Ә’Ċxİ÷͎˜‹u'Á}<Ĵ{Żı’ħ„ŞŽRħc^ĥħ Ê¸jpİĦ4A•Ê5ßJñ½_ïàUöĝÑÖßŭ?˙Açùo˙A†ŸŠ˘èİvğ}ĥÛí]YYYX^^ŽÚíĥRJ ܙ96iH}^=Ž=ObÓ6-•şt—çy–Ĥé~žç›UUŬ<µùWŻÈNÇ•›ÏnoX§Ş„2+ Úk¸N'žR ‚`É'ĞJ)~L36bUU™ÚÖGk½ouµ½Xż ‚„_Çı—˘[íD)ñ1l›…“œóTK)ús>ġq}ËxçòÜZۓ鵝Ž€ĠsHġŒ€µ€\@ŻR‹Œħĥ"”R*”œÂX§€G%ğ2§fz)cl˜‰4²73DàġÇÜ4Ö‰>ì †ÄpçÄûhIÊ•ކßÑq0ôêçĜj°ô};ôeYû ċ:ş Ĥ4ŻE͎ˈ/ÇU5ûħ(5Ce\İÒĊ½W g£<ĝ7󁓢4 (cۅĊğI…­)N\üƒçVמ:ïŭÊy?dŒŒħÚvh_k]ÏŝŒşrÜ˙L—ˆSĠšĥNë]aÒ˘è³ŠŠ,ËÒ4Mw0ĵ-ċÎĠsċŻ×/ñÇO0)BcšñŽàŒıĊmŸ_¨dçĴ”ċĠ Ö£(Š‚ (Š˘0czGw\÷ [ŸĵŞŞ1f?îżs{míGo]ßwnäUĠhTs'\ —ħ·wE$şœóĥ$É9gŝıNTUeĵcynŒIĠŜğ·Î˙îEwùX7ƒ„ˆ„ÛìÈE$:ˆ9ç-ÎyìAIŒĤġ‘ĊOÌ îSFÖ;iûÈìñ•醟c͔Vj°™ÑÙ¸;Mè5•gM–D``ĵÖ×áĠ…7+e péKŭOFÀhZ lVéî^”ëĤÒ´\£q ?Ž!›wŬ8dŻUżµÑĦġĈş†Pzaƒ6Öğ38[¨;jƒĤ#ÒÒkh‹,а£-²Ü`ċħĠ#żóßŝ‘ĝñ˙s1Üı0xw(úŭŝ8PbwQ›U²‡½Çë{­Ş*“ĤiE‘› ‚ġ•ÍvóÜgŽ;=NL€IéÓe½›gÈò èœd·vמ>%÷_óŝrq‰˘vn˜l8pö³Aİ1f_íĵuµ}’?ޘ³|r1lèJˆ’úèĥ-“Ë^ŠA ”|B$ĊCUUĠyQKŻÇÊÀ:ës!Ÿßġ$”`HmÜb\´9ç‘"BHÎ9óïġ,Ĥt_÷3Cb3* >ƒwD0 hmĴŻÙ3 ĜG HfLY‰ĤìGÙQS‰6\lí_ê„=—2çÍM}xŒFJv£eÓSú €4kr^PšBó>χĞ\W3Vğz³ݏÒÖ3$ -„wh`bH°GÇ(Ŭèš óSœA1ސ[$3„Ü(Ĵ—)Ş•ĊVçK˙ü÷^ĝ`çĵğv=üiµÖä43@‰MéͲšċ`g°˘;útWfnRu7Š˘Í0ßız˘z{ë’8y\€ŠbˆÛĈşM¨6;˸½³ĥvVĵwT)UÏíK)KH³^O­ĥĞm}ú({[­òv¤êÀğD v@TĈríÙîİ6OÛRÊP)!ê·‰ĉĥŝ½1>²%7Ĉ¤˘ÜÉyĥĦ3G d5Œ•0ĵÍ•<‹ü\¤àœsL—ċßWŠ;ŝÀŜߍL#XTSWki5clRçğOMÉòHf\fZiô÷L“! QĞvĉnUwڀÒPž#ƒà BŒƒ Á–En°ı•b7QáÏüßĤ…Ÿ ‚à‰(ŠNĥZ­•n·ÛŽ˘Hùž ǝêÑyú“65ó–zç*÷փŞY–%EQì–eıµĵġ“wۋ]8 ĥ,€Sĵ‘Ѱ•Fžlíó•óBˆÚ_. ‚€OaF£.àTU•ŞŞ0Ĉ¤Ĉ˜^˜_ï·Ûŝ{ 'S“7£ÔZĊži­ !Z~¨YJ)ù”óĜì#icLéUğ)/7²–:èeW`´D=ú’] ”R³ç>û?¤i—~-ùÂÁĵ%ĵ;üI‚†I†ħ …5pçübœù޵t@ˆQ#ÎVŸù„äşĥ×è#kúš1à ?Ä3ˆô˜çuĜy£ħ%ğ‡ŠĠ··u‰£¤­w”Żû$Öı7ÀHkÌ(Ù›/˙_›‚R0(Á*׋¤Ò€ò UZa{;G‘‡Á;OŝÓoħÖò³a>ÇñħN§³°°°µZ-?q ÚbR‰‡ß Ò$6= ”ì½H²Öš²,Ğ,˲˘(öĞŞÚ’ûï_>"wĈ½Á²à^ŽuöB•&Î1lĜċ bhçA ìajµÀûÌ骪ŠŞŞ2km_ġŜÛX]ŭÊáKŜeÙ,XEτ]Îy[I)@š\ŬĠÚú>RADË6zŬŽ@Ĉeöè3l,ˆ è ÑÁ2c,✇Â| Â<ïé#@: œú}VcÍ4jÔà’q70MVÙÙi`3ċ@̓ÇFô!c‹DŠ$lü<{›öÜì7/‹šˆf‚ñŒŜÖa$Ŝ7C² Öµ3Í0J ˘;òlIûDdU˜DNEfmíށı.\ìıà$HnĦҝiìïfàÁRëŬ“ë÷”RGQtşĠjét:8ŽUErħ‹ÙŒÈc€ wɎüNUUşѰgŒÙZÜu#lw!‡›=VH 5T°ˆZZbàˆŬ P !ĉVcšBƒDô.ßè„>Zœ1ŸUäv”d„Vˆŭ"h1ĈڜóÈ3–§îĦK²Öĉ<ıĠı[§mş,ĉbŬ™Z@EäIy/@q0šċ ŝfħ#‚-PcÈtpċ{Ѹ› òj6s>³XÒ,0: ùŸЍ]ï‚™á”9oH4D “ĉ|f}èC€É´ż1íïĜ9@i’ x˘uÍϚ³sTǜp~`nĵĞŞ²µÀZ›!ßÛ XVÔÖûD§ħŝypĵZĤ8çħ”RI)ç|ĉ‚_Ï@Yk+kmγġv;deA€ ~uĈVŒÌRÈ <(‰ŭşûêx€‰ڕµnİÙ¤İs’šĴ‰ŒÎŽöi&ÍDÌ3[SştGtpX— “ÌĈ2>Œ†6Ks³¤ûNä ˙žgh÷áïĠüWrGíŭ€kó ¸ž‘=Xĥ3Žic,I{2dQŻE^7PŜtxèŻáz yRBáÚʗ/ñÚ'•Rg˘(ZmµZn·†axX–T?.›JŜg‹ùÇż£µ6eYÖÉŞ{Èĥo-ĜͤŽ8'Ĉ@cb(K ,bÇ.œœw¤”­ BÂSËu# ¤1…ïë$ŞĜH[íĜEŠ×•8kNÚÂhtħoâcBˆˆs(„Â݇1†j.kmi³í=‰ÊÁ ˜Ĝ ÖŻZÈ+x†!”/Î [d÷ 8==$7_J.§Ç•C–äv“ƒ`=wŝİQ²£)ìPî pĞ{@–ßÚ.ߎıä]fS´ϒìG J“ÎǤr Í`F—Ğ÷”ëµÎ,§)·ÖR´1üîeÒ}}<¸*;_‹5Ĉ%ïÊzĤĠeŒu…-/ĉ#†i „ŞŞŒÖZ{@Êyz{·ÛœÈĘF*³J mdZtcQŬÓiôu0…E’u‡&˘’ˆJVíí–rq5ƒ÷ÖU‡1­ĤXރ%Îıâœ+)%÷%B†Ù ì }&Ğ=F†ŭšúgÍ+Ŭïv`„…ZŠ:îĤÄ?[\Œ¸ˌ@hr;†=J³ÀÄN)/ÎˀîŒçñ¨„…éFġŬĉ³ŽP›éú—mëRܘÌPm7<ĜáïX‚ĥÔgí€-‘dêĈ c‘•Aû=#<Ħ”Z °Ójµ˘(ŠTŒfÉżğˆÍşĉbI^Vj­s­uŸï]щHğa†}^=Ĵh,˜%dĴi,ĠŠ7ßGâs>ï *kmID9O×wۑpŸq'0œšÒşÚ D ıïëÔî s3cŒ­ô­µ%+÷ËV$=;Ë$„E![ȌXÎR!ĈHÍÙŭ|‹<°Ey2nÁgÜà5eßÍ{ÒĊ‡{CƒœŒ£Zß4ÙÑh€38Ùnmu4şXgGNŝ}İa Ñ`a|ÌІšĊˆĈ²Àˆàd!Vx33uÙÎ4Êtf(ŭ˘†&‹2ŝûf_1ĈŒà GI 4`Dèµ[J#OúDÚĊ0 cßGš'iôë#Mx瑃OUhÖ³ŞŞòz.(Noôı .@uÌw~݌-ô¨uœsŜòs:²!0`3´vP0^ùV k[¨Ċ%DŜż…œp…s0ÑAndÈ9ŭšħG[*"*EħWF­LJÇÎe1H¨Ö’ÀCÏX„Ì<ŸžĠUQ—İ@815ŝ÷Ĉ#PY2ĈcL0ĈÄĵŒì~è'=Ĝ%;NŻ Üħ÷)g4n×Ñ$Ô7Ǥ:7FJvîß‹.ĝPewIşëŠĠË ,eĉŬ9~Ĝ¸G}쀨>‹€vğh47É~†jZ5Êt PŞĵ3xĠ­ÊĜÁ@­1t' ~ŞÜüĥÖ.ûrùq!Ģ”²ċÓ\î6ĤbĦ)ŒšĈ•í9uve§v¤ECLr' |Ôab à`1Žu}ĝëïÇtfí  ÜŒ g Úy$ZBBĊ vû$XFN=ÇhP­ĦzŬ#‚1Ö{âÑ }xTZ~+ Sj°ÎQìívNĥŬ|NĴ” …@‰é. 󘭎½.üIcŝÖÜ×µ7†Ġ~ÎúnJ?Â!Átu@ġĈxˆÜްeŒĠƒy^`ŜœV‘&"ÍLĤ#Ċëá“aµƒy LF(Ĵh‡Œĵ›O‰3ôĴ‘!"‚ĵXƒ ż›ġ*cÁĵËı„ĥLĝwYxF6Ѹö~(Ó=€ä`:àĜ@ÓĞaθTÜí0n‡†iŭLÏN9¨Üó·˜ġğR&|"ĴeqĈ8¨˘ĵôğb(ĉ7yÁ6 †Ĉ‚àŒV9·`–ڃÑÀŬ›†+ç Oêĉ‘j·Ò³Ş‰`#ub-GĞĜGké4ç]ÎyíJ-g,\cŻ֜żğ[znĤŜlĝQIÖäŞê•LİšÊÈzß.7•Ì ĴHy†ä‚†ċĴıÀĠ’%" bU˘U œÎ@h‚SÀ‰É8bĉÂfTÑÎċÜ6Š :Ë 3×FÛZ@8ġ!WŞóÌç`Í]xzHäŻgßĈj7mîb*&— 0ÜiЏ™ >ÖDŬD`F~żċçĝ\ppĈš•GšÀ’0'ëy8MJàr‚ɁÒÜFŜÚ.ˆD¨ˆ lȐ@°†™J•ĥ(ġt0:%‚)¤VĈŒħ–ï­ŒğM+ÙÑŬŬ·–4zÍ[ş4ü}éNQ%LĤ0“Ĵp3íozîI™!hA` @ â0‹rŬQ³f‹*j)GHl Ôî R:Ço0€ T–‡cŒÏÙÓi‚’`ɔZp÷÷˜÷Ż£şÔÈ|³ĉŽrë4ô¨dw7œƒž M‚<3ŝ5Ê`tKÉŬUh\Y‘š½ĞÌžĠ3ĉŜ Ks“ši¸‡/ŝû!)Ù1ÁÀ”Ú1fMw€‘Û\*_Ê%Á`l]uvWyŭûä]lœĠX;ŒÜXóÒ "TPa²Ë ëf?&ğ~ßË5Ü.³JwoŒİhšˆ*fòŞDHÄ|oĊ0!@‚ÀYI²ċÙ眃sέµfj1ĉ`)Ŭ‘›ñ3–̃9ŒOD‚qĈ=[a#e4š~úĤĴêj'Y£Ì1Tّ„Ş×€3÷"Ùşïĉ‘X@ŞË¨ÖëŞ t'RQmĵê]6€ŒÖ g Ĥag4´!fC—oŻ]lŒçGǃ‰HƒÈˆf|Ä Ĵ„q%>™ ÁÈmdhÒÖ]ó:`uF䘅n=ıċ§yx!İĥ”‘ÜÙ .Y;v 6ÖzíĜ ĞCîƒ( Ì£ĉċ7à<î2İPV„l…çhIÚĝ5ÛrSÙ0à.ŜÛnÀd-˜WħbJ6ĉĴ8çÌZ;íu4Ó\›JQ;0H†4° ïSÖ`Äjj6?Ġ_:32V{˘QùeŒ5:cŒѤ~Ġ£ó{Î@ó#×êÈeKŒ>`în÷ÄnKjµÛċŽŬÁ@‹ŬǗɣž,µġ’§­‡˜ F5·Çàj§;3żFƒŬĵŬµPĴ[0\Ÿƒ5b3îÙÒ]–ó&Ö ‚1@JH fĴëׁ@\8VèKh–Xsè÷쀆 ÁäU èfĵx=F9&•ÌhĈ&ĉÀëċĥ²BJĦ‹bä,ù&ÌġaÌ{y_tÉV×s>ÌĞŠÀA°ÄPZ?äKzéŬä/”ZXĠݞŝş(-75MÌŭâ=ĠĊ=:î7D"3Hˆô “ÓÁèàĦÉ s3£şż*¸ûVWhn­ŭöQ5ÁiÊߞ+Ìñ€jÖjk³ ĉKhà&Qè‚s ĝïûVԐR™{zO ÎÁfü€lm[dS=°wɃ-j¨'ħíŒbÎ|éĜ-ŝ„ÜȲƒĈ“`€g1I€ôÎß7Ĝ.ŬĊ$s”ûCz¸YÒ`Üúp`„ Fŝo°a=PVÎ!`Ş1sËÓbÌ?Òfcú)ÓF&‰yĵĥ™À™ïßÀg#Ġ.ÜRx?f ÎÈâl˙ƒĤŒÉXR}>­un şjìšıû· R£œ#.$G?1˜yjJÀ8î7Ŝ{eûĈCŜŭ€ wÑ10Dœ! un¤â @À9Šß€àĴĊ E é*KààŠ÷²ŜĤ4üÑñÌ˸‹Ç‘:ŽTô!ɽbÍ+ŞíŭşhÑpàW ]żzçaŬ<ó]:˘<šCú —e³uÄ  ĉÊt †1p"pÉHŽğ³uş›ËY(ˆs„D‡°CÇÀH†öszÀ'Âóր1Á}âçGÁŒìA• k-x(AE ”)µTµ›ğ„RcŒ9̂ù‘ƒPŭ½Z²íԂ‹€k˘_Ÿ“áúy)k•C€´j  C½N?ÔJp’jÎe(™à>FÜ1$=YS›E`-wÁÈ8¸’äŜÏrĞáûK$œ{ƒäd€&1?%;ĉœµ­ƒ`éĠCÖwĈ<ˆ¤€˜#Ïŝ^‚qĤ@ƒ"@1H—Bbˆ8Ç §óÑñPWëÀhhuEU™Îü=Żübœğٜb ĴI­µ…1ĤÒşž(½ż³s„µt[1Ĉ”[R×ıgŜKvkpŞ˘ Œi ıNҁá|½HÎñ(Kq²Là3\&“TÏLÍÍÊÖ.C‰_ž= k'£ĦNµÔÛ6ĜĜsŸ<Ĝ}uĥ<qf!˜kúI„Œ!@$ĉt~˙àHÏÎr%8$#HΠĜÁhÄ.˙Ññ£’Û[€ñġ‡ FĦÉj²7c°ŭÛhó*#˘ÌZ[h­+}__žİpïĠ&cŠí ¨hx/@ĝĦbè’´ñĈ¨™ĝŞd§F”,ˆİ´ëSq1ÂD½éŠÙ˘6IġóSóΚrp|âè°IíÁ``‚ƒU%8é+˙ƒ6ÏôûğŽ"\¸+’{E #Œ!ä‚‹dÇ'9‡°€<3RŒA9acŒ!à@,Ùxê£!#·s­{793BŒ$ $¸ä0½[èòjß“úÖ²ħHß·şO!“Rr!„dŒ)Ħ˜‡ jŻ_<Ì-ÌZÀfPܔDTĠĥC‡]°…̃  ™lİúl‘1CBÉÄ dÇtÁL1ĉŬš1Ĉ8S­p †ħĈoĈ‡ċ"2dJ7ë$Û#{Hw}xw]£{½+‚ßş@À3(Π@ĝÈzHB0V÷´”gl‚†XrÀ Ì÷iŜ-h¸5|$`4ŠJ`sWBğw‹ÒÜ0Ĉô´ÖYUUUY–ú;y£>)ıtĤ{J¨…cKÖKóÊâ6× Ĉ!`Ë>BH5(iï×w(fĉ‡‡%cLħ°+‹Ê Ëg™·ñğc ²9BaS"Òŝ1çb.B&„¨Iò ™šġykİá/ğäZ0 ĊċÁš‘=¤ê ež .ʁM÷IHfŭ˘Ï 8CHñÑô81HÁĦ‚³A0üó”ŒAriɸ{⏎‡÷›!" úˆÀ¨! öj,*0Áa÷Bd›U—W´ÖŭŞŞ²²,Kż{Ÿ8÷ó›ĦĈ÷™OBBˆ€1+gŽèʸ: ™aĵwŜÉ9¨ê!ĥ ˘ÂZ[yÇaE Ü÷$ç\ɰ­Ê\ûTj6(Éşòž™dJDÂô= Ġ4çĠŬ’ĞVDĈ lÉFŻ&$PeÜVž™CöÈ~ÀġàF˜[gğOÖç y!C]ĥsd×Ğ ¸gC'r›$ĈœmI##ƒY÷•à8C,Ĝ#zô°Ĉzµ.˙hÁˆ5FP„Oí ôÍ×pDd;֘m­ġ~Y–YžçJv³rîq&ûÈÍ “SJ ”BDBˆX-žXÊr=(eĠŭeáÒ-í!–ĤïĊ¤ôs˜OĴPœsĊ D´%”çœ5‹ ÚŠJÍ`sHĈ;†ÏĜŝ‰ĵöߙVÚĈށÁÍġÔÀĐ>"‘%Î0&”Óä ?,DòĤŽĴ~.ġ7G. &ÜsSÀ0¸íÑñ.:ÜÖó Œ}È`Dî“ú{Ìİ} Ż˙ ‹f{/FġnUUÛyž÷Š˘ÈĞŞÒĜG½“žÈ’¤”ÂR(l3ĈşjñT{}·¨#tÁœ5C¤Ş[ö°¨ôMcL­(ÔZëı3Ĉ¤”L:Ú˘8çìĴ­XKÈËĦâu9M00&@:A(LIäX‹1FcÌ<'„àB9PĈËaU<ġĴK½ˆX Ĉ9 S„Â$5ó`ôÀÌ$=¸€4b+ŸkBa-*K0Ĉ™Rj‚·×?x~$'ÖKı›Ĥ‹ÉÁ5Ĉg ‚=Fzˆñ$¸3ù\ö£:›;… 6½…êÖŻqfżUUĠzQ;yž'Y–•eYš9úAjRBíïA ‚ •R‘˘Ó>ŝÄ)ÈPoĉnĉ†È‰8œŞ‘[ÑÏ8Ì1&ŻŞŞ(ËR7Ĝ ÍGŻêĞûVQ°xrYkĈ+û|R/cÌz'ŬCKÙÜZ;è[”ĤR­ès)·áR˜•1èıżÂY<5Ŭ`äfŒ…,`¨ü+vkgA˜×‹˘ĜȲl7˲¤(ŠÒ/v MĵÜwûŜħûšġoÇ„àAÈ B)e[Ñíœùäé~RĦ(ßú—P³Îa“ ,Ô·Öö­µi-oŸËûz8çB)%”ç<–Ŭ“‹ié]Œv ĉ$ĉ 'P‹XRŸˆêĠÜÊzÎÊŝ†YĜrĝ˜éá†Ĥŝ0†` ı·ŸY:äsšÚ>lĜ£#VÇL׃I8X$ÁQŬxöÚËöñeġ‹˘(nĉy‘eÙ~žç…Öş FÓŬĥïĊâ5.k S¤”< CAKJÙċœ/µŽ=½´[Zûŝœ/‹ Ç$w=³nh·­µµš°oL½×8çL)ĊkUç<–£ñŝ~á™@փ“àHñbÀl×B _&´³Î!ç|0gċK„!Év¸—úŠêÀœ×Û‘éJTƒM}ÏjĝÑ=|˙îùñà:¨ù1;¸™3C(AÀ½jM1/nÌúÔä³)%ƒq‰˜Ó4ï€z²Ğ­KŭÄH²:Ñ šÂzsXÁفܔ ™4ó³wĵG ô(ŭŜ\Ż0ĤQjœÛFìWgîÈÁ1ĥ¸òÒ_ñyWXóN?Ïoiş“ĤišeYݵÖŠ7é.OĊTv4í^cAˆ(ŠBT[Jı-”Ŭí÷^ż=̗jìü˜T Ê`ÒÛXY3WMezZëĵ,Ë˘ŞŞqY_WJJ!BÎy[uµvo.Ĝ†|ï`ċ ÉŞGŬ@oTıÍj@šGj.†‡âœG"^^ĵ×/†×PԐ’`Ċ&"aKÏĈ*cŒöFıĉĤâ ı{²q~}ÙÎ!×@ ֋OœÌŽ3À’…=¸Ocìġ§%h²@B4(Éı^À2Żô ëkÎġbs`Vi:ûĜû‡qÑŬeìò££ñÔg´uJc> ħƒßĞÁH¸lG)x€tĊë˙ËùġŬÇZ/$Ir=MӍ$Iö³,ËĞŞŞê*ò™ D=ŸuM3!PEQ‡aĜ•R,_ĝüyaĜúŽ÷‘ĞŒµ’ Óğ†–íe×·?oUUĠĦ A)R†Bˆ–Œ—™ì†·w{Naç£&ꛛ…Tm!U)™Ŭˍɽ-Ó<3HŒs)ò€ §V!T•¨ê†ħôî ŞÄÊÖÚ²Á³yĝß³nü0(Ù1F ·„ÈşS7Ħí.%ëߙÈ@0†Mži€`-ı’$"F5ÁZò™|÷<ù`x’Ĥ6vçĝÙ.;ŜĊEJÓìRdœâ‹IÊĞğ#Ĉ&;y+gMĄ´ĉa˘ċÛ˙ÑúËé'Î,~/ÏÒ+Y–ŬL’d;˲Ô6ÈbŽĝğYÀ×›c3ÈFĜ‘lµZQEÔ²âÈò…/Ĵ½ĥY€´v·ĥ5@*?AËA{ïc5ÒğĈ˜]­uR–eÖxÍóĵ&äž!Eœóv|ô‰“ĥĜïċƒM$‘#.@ÉÚ²ÊĴµ‰1ĤZUUéyf”RBJéäċœG²{bı(k—o=8eÄùLĥÜE;¤Ú—°.ê‘÷íG€4ïÊאy“gÁ•µÈ ÷€ä’$0ëú5~^‰5ə;³pŞ]çüd^>CËXĉ•t„ş×Y÷[ ‘“Ğ[”W|”ù,;,Cú §™Ŭ‹·j¤>ÖàÔĴŬ&ψħ‘˙‡‚‘ßÌpĊA‚GÈ$(Ŝú3àÒwËOž[ŝqUäï¤iz½×ëm¤iÚ÷ìH7ĜQ³‡dç(Ù}ĊlZTúÀiKÁ8VqÇA,J)WOâq´×ZŻżxT• Jğf?œÓ7X›ÂöŻâĝQ\ÒZïVUĠ+Š"/ËrS[Î÷ŭ#A$l !:ÑÑ'Žî§à£Ò0&œôşN/·ħÚ}cLj† i.Aƒ·FRRʀ1ÉöħîVRĝ? ĜÒmd­8çĤÚCğmwƒżÍ~ŬŻĴèá`HŝrħÍz|ƒ%IppĊÀĵU!Š›†àÁ §ÍĈ.ÄӀ°.FhCŽ•Uö`Z' CC ıò içŜÀĉÜúy6?{¸k|‹Ċ<ñ¸s6atN+`"W³ĈNè\cIuìĝ N[½‘Ü]t‚EÒħ°ŞòÍ?ï{ĊógW~Dşx5I’Ğŭ~˙v’$ûI’d~ÇnFÉâ÷f°£™›Ĵ0 eĞĠ 8îA°,\[{ĉ·/llgĜÚŻü@ĴO‹Ü1DĈ`wŜEÛîeßO½WEZEÙè͆ĦRJRÊçĵ.ŸëlŜÌ]”£á# ÇN)ÛÄòQğîU}yċ=ë|zAƒR*/ h‰öħx˙FċN‡)]²4ÁĊ[pî6ÀĊB³A–2cLá˒ö.ß7zH‡ê!ĈÒ°IÓ¸™+K(µ{ݘq™(LŒ/€`Ô\ì›ğżqìhÜg4,f#ò€Ë-‚ħÏdŒ1îÔv/k°.64›ŸíÈóĉ÷ĝÂŬ=Ò˘`ÄĈÓÇ”êWoŬp*š FÍ3Yû”5Î2Ġ.ÖŜB¸Òµd`#Óż†âĠ?Axëé'Ïŭ1LùZ’$ï÷ûŭ›ûûûÛŭ~?)˲ZWpc{f;²˜lt·`4‹ħv$<;jEQ´ÁÑöêİóSÏ­~ïg·]/.[1.S!Éa÷ßñ.ncĥĞŞÚ/Š")Š˘œGéÖ(×1_k !şŞµt4X8ÙúĞkoUG–E€Ê}@÷ìb`oä™İIÏëòí\‘D(„ˆ9çmmŬŜÙpŠ>!üc2ל&Şĥ˜Í4µıw˘cÙ<ÊÉßĜŭĝÀç”2î­ċGNaf Ü89&N„JkĜáâÇŭbß>ÍaÀˆ”옔ċ\ˆ‘“§×žv'7D ÁHşßkü½ÑçÖ#à›ŸÄ~ĉıĦG•Š4 ^PbµäÛäL#ÖdA~À•ˆ†9é#ѕOB– ċµQĵŝg8RŜĜyêħµTe~)I’+ŭ~˙FŻ×ÛNÓ´ßpe°‡`G‡b§½STulF€`5;j·Û]ÔQ!ÄÉ3Ÿûƒg·ö+vùZTT@}?Ù3H!€|èߢ§Ù›Uá쑊˘È& ÄÒ¤ Ä ”R-!DwñìgÏgıf›ğ™żùŬĴĦc¨LĜl‘§ fדh­‹²,çšAB0?ï !âpéÌQ"ηö )ĠfŒğ2evmYĤÖÚÔSĞìÌ!èPà=€Ä…ÛA’%7ÔĜuZ™ħàœCTBhKġMÎFJlÊu| û€Á‚6Ì•ï3ıÍ2ŒŸW"îˏìàcI)×ŬÍu˜9šÂ|h0Ŭñ˙|l@ ğyš Fν›’9Á(s~x,w Ŭ ‹%ìöû(Ŝŝk•ô“ĞñğGŝ"ϒ+iš^ë÷û·ûŭŝv’$½<ÏsżX5™‘Gş—Ĉœó°£ŭÙ DğŬÛív'Š˘•0 ×:+ÇÏ/ŭԑŸŝbkà¤OŒ Êâ$8˜¨n½ŽeÙۓÀġĵŞvŠ˘èeYVVU5÷ŭÁ9çQaĈJİbİ}üéµ[{`†RoFĈ%È?êßÂRlû>Ö#­Ùèĵ‚ċ)B´âĠ'N…AQTf+è!ƒdzèFÈĴµ™ïWĠNt?1 ‡ž!áŽÑ˘Ú™…Pڂ+ĤdR‘İwtÜ/ö|Ñ!iŝƒĦÓ ñÙhDÓPTCË­3 6ġĵcHĜÑ(c ôÁÎîÄïÑ`j~žĠk:\jPŞž£`4Rµ€Q=XÉŭéaAòƒ—ÊɌİĊë?Fuù:Êú;[{‰Yŭnżßż‘eÙÍ~żż™$ÉnšĤIQıŸOч£ğî%)ĠÍÓ3âuİ.Š"Ġn·Vе†áš”òÔ_ŝûŸÚËÀß_O Ĵ‘……uÉİ’ƒI [ġ`·ŜÄéUŝÖċFY–{Y–\gĤT°ı xA†ħ”²+ZWÏwŻürdŞá÷‚!¤{O²[8²J׌1=/3/ĵ-Ó4P`u˙H)J)cÎyG-ž[^OĞá´=ùhvWtŭñì6:³ç}YUUĠˆ‰ë<Ώdßä°ĈyV10˜f£˜sïÈ àĈ‚+MnlsÁÇ<š <)9ñq Ô¸zM!kÉ1 ·…Ĝ \MÈ­TY@r·Cv70ao|ħ!d#@aÒ40˘1`Èf\ĝìcJƒÜ֕‘İ£ZÀ0¸Ò\,5 Ĥ$˜`àĦtğlúÖÛ¨ü ĉĉдʳ½s'ÖŜˆdtİ(²[ızŬ@´ŸeYVEaŒİüöş£Q–4Œ&] t`„@4ĝwE²Ó鄭VĞEё NöÙ#>{äO^ÜJ= ‘€sE!0@HĜÍ7ĦÍŝj,_O’rĞ(н<Ïó²,Ğ rïqVAĵ1ˆÛ‘R..žûÌECĵz;ñ„Y .,³nˆ#߀(wôrdŜOSŬŻŞ*mô­h#óŠşÔ‹§Û·/Ĝ½ v8ŝT1 *ĥħĵF·|ÉÔZ×A‹ódßĵĆ ^Ü Fġ[‘[‚( ŞJC¤"”RĥÂ0l/,,äqKĈ˜aŒÙĈgrĠÖĴ“2!ND‚ˆdÇí b!DÌ ÉKş5ĵB[ԃäÍçIĵVۑw’cŒ…œó8Š˘v§Óé(¸^†1f8ç†1fXÎı­Ÿoóày7Ÿ˙]ôĠ’J ¸†§?'ä WÚq?!\ĥÖöˆ¨j<żqċD Îù\1ɇí%žĈ˜ġác=kíŽb1v“ˆx§ÓĦ$I,îˆ%û÷”îş^’uDŜ‡‘5Ñ< ւjù²Ŭ5ë”çù•,ËċyYĊÖ:÷™Ô[ádUUZëˆt|jy·Ë’fíŞÇ°˘y{Fv$aN'îvğ‹ív{-Š˘Óa_ĝêwŝ·_ĵcäŻôÀL5,]Á+ ’úêÑ6·úÇ:ÁËYVgYĥّa Sß DĞĠ Â0l+–¤”GVÎñôÍ E–{żħ0[³û>VÂlY½Ħµî•e™EQċ_Œ½=‘R*Ş)\ı¸xġ­ĴWàÛÛTğ™ Ü²]÷Šú:˜Ñ}m°úÀ’µŜÑÀaŒ\YÏÇT0 ³|ÇżġcO˙ŝ„\pâœÁĞùëp Q2wÜe£o%1r÷†A gŭ +÷6 úıqw}eŭ²LwìI,.‚°ƒċgĞûÌ?˙äñ˜1FB°ĜŠqîç8gà Ì9sâ7ê ­ÑŭjMìv˘Şû\ú›ġ=-k­s%·DÚ,£á†Y„c°×[ŭĝûßû^ôâżŝŸ­µdŒİZ­–îġzĤ,ËqÀ4Qq÷PlԛŽîXˆ17[HPáŜĝŞŞĥŠ˘¸•$É où³oŒ)}iĤÔZ>­İžÓ3Jtӄ ³äŜ3ĉì`GJ)Ùn·ĊĊĊn§Ó9Çñé .|ŝoŝ“o˜èx÷'ŻŜF•nî§ħ eJ9İġŝUĜWèİcÑŻĞ*żžçù†täEQTsx×18[ŬŠÂ0\PJ­´WN —ëŝĉMÇÌü.#·—îëŝUĴ-°›AÜl‚üzôúŻÍcTKJٍW/œĠ,Ŝż˜êàĤÛ+ú¨Ú+wírlŻ™iFkÌb·³ŜÓGN ‡ĞSûxt?w£×߯ p]ĥdÊğ2€ î Z1T71f œ˜$ĈÖcxM¸!i˙—ƒÖnħ6 EZ–ĜÉ,ÒÊ:Pä̇›‡ôñh%ö‰VÉ $G ŠC0@q—›$À HÉ ƒä )-´!HéçU= şCKèÔ^l°k'Î\ż nCViF•!TօfAVrÀŬ˜Ü˘%GI„ġŭ췞’òçJİ”²EQ&,˲l:JŒ–èĈıŞ?|,IÏAëWĞ XèfŒ1½²,÷Ò4ŬÙßßßéġz=şNġ%S;„ĤÍÌöŻ›g‘:,3€’ï…Ŭn·ÓívW8>†á…'ž˙Úozö·OüċŻĥp{#´qjUëĤ ˜d˜ıŭ"ÖÔŝfKŞ×Ò´\÷ÑIžçċ„òMb*Qİ(ŠÚA,)ŽžxöwžŜë•ìĈzÏ1³CsÂZĤ$L~ ĴĜ0kzğÈônQI–eÍŝÑÄséËuÒ'áĥ… ñÚÓ§ú‰AŻ_ÔMswŻq1”ĥéu,ÇE‘Ŝöŭ£|LÖÓ,A#†tH£ìİ%ù“#€[T+ ôµ—‹ òïŻ[YIÙ%Oż_˙½úœğBÖ3p ÂX_bĤÁó³£nM0òÙM†‰5èġ „`°p965S¤Ħ€1(Ĉ(÷Y‚ ޲²¨ˆÜσö]¨d}Èd=Käò˘ŻĞP?Üë‚sMÈ ¤´è‹^Â%ŜŠ3ô‘ .­7”ÛJİŭ ò4MëĊ Jĵħ>Ôj;·qáŝ:òÑĜ’ßñ×;! pĴµ´ÖŜ~&ŻŞŞ˜À‚ôœ@Ô´ 2#Ĵ8üÌÑÔ £IŒÈˆ8ŽUğŬ:‹‹‹Ğ­VëTEŽyâӟû½˙ċ'~~yŸ½qeÌXwùjT}ß0!`ĥ^‡è½S]8˙Ĵ,ÒëY–ŬÙQUUM#ĠIósÍŜ‘lµZqEŬ Vƒ¸srùÌóGĝFĤVÖĠħ2\"1 Úykq KeYîù~^9ODŬ³Š˘(–Rv…Ëí#O/_ÚÎ]B,5+,4ìA§×q¤K[ÖÚ}ïdŜdƒUôüDzd7Òğ ĉŝ´“ƒvŝw%·Ş“&XfŬì‚ħŜQÁ›ĉòĦ›²µ.C‰FË)dU÷À!ê! 0bXĤ;FMŭ†6…Œ!Nħ ëÔ1ġnĥĵ\Û`‚œ+··)Ş?ëFÑZ ^³,ÛhM#ŒôH×lÌ:+{ŸDIfĜĴa Úbż"°’!O5ŞÂ  Ħ∠ƒ€Ħp%ż@p(Π8 Ĉż×§ĊX˜l¸ûj„˘4` ,À$Ğ,XCœa;ÑOcħtÛÁêc+üúQ!Ģ˘ÇqE‘Îóĵ Jl„-UÛ=4e;6d¤Ä7ÍÀ½:é•jO)?‘OrcÌÌ`EzLŻÈL)ÍM£ğeGó”鸔R*d·Û: GZ­Ö™8ŽŸè,,=ûû˙ôżûúĠ=|˙×ëÈÒÂÉàôA!¤ûÌ4ÌÍaÙïĴu‚Ÿ¤i^öÒ4-êĥ™‹n­r‹8Œ¸Ğ”ZUAxüèĊݜ|ùòò¤Ue½@x—mç´mv.Ħö’nÀ.ġûĠvQ}ŻÓrĤ< 0 ‚ -„X^zìËOô³ŠŬ¸Ŭ÷<Öż ĈAL‚1*Öѽ,Vöfż½ŞŞÒ<ÏË1óG‡ġ|H“˜Pó„Px‘—ŝs˝\Ú6Jh4¨!µ•i8“Ґ.P[oŝŝ`²^Ӏ•ĠÜ6@fP šXĤûjGŝr#Kt­sß/Rƒ~ßÑİ˘ÎIŽPrR’#@ 8Á ƒâ ‚ûíkoĜ´xnƒ…$ ú–`Š£8mA…A°`Żsr‰í½v”ójY)Ġ ‚`G)• É6it×ŭ ÈSS&8Ĵ6cÚ۞ösáçü&ÉÏĦ”ÜÌ!Áh–5´óÏHMŭ;ÊuRJé-"/`Xm·Ûg˘(şjwžŭğ˙Ċ˙ğ›e·ġƒW7ô 6°Ĉx!B\ `ıŭjñęĝGEž^MÓôVżßßí÷ûİW֙ìhĵ”˘Ġj…­VĞÙÑħSÏ|SZtÂWßżĉ’aŬ êŞ- g ìî[8µÌk­7ĞŞÚĞ]Ċ½oŜÔsëYY][”R.·Öž=úÎzꈑö-B"·—¸ößǑ6íi­w}Ÿ1ĥ8Ïpó£Ò 07ù}PŠMNN}`џFà˙_6$1ƒ÷iĴ)=Myf4ˆB™ĝ˙Œ£;\ßèŽêÍ8–{Šîş²è%eÂ=Ha …6HÎI8€Ħpŭ%%ĝ@ Ħ8sB ĈÀÙAö4ú˜‹ŜAÀ´àˆ„E[2ä–Ár]Y`ñ„ÜŜY{rĦĵú–˘†a+‚DJiüîmt÷ä•R܍; £îÚIÑ:Ŝyûu_Şsğo²Ĉ½vĈ“ƒòu;ÂŜ7Ĉì–e9ppŸ³t_ÊÀċo|ĜœàtK"oĊ_ŻSV1ġ§Ĥ û˜ `D 0˘9ÁhbRè 0j‰ŒĴ&ô{Ġ ‡6)i´Ò•zpĜPrD’!̃÷Ċ 9àÄƒà ˘Ñò¨N})[0@yW„%ĜÂ@y Û·Žž^â׏H)—•Rq÷z½^…ñ™I|„-=¤,É9 ĜÂL¸Ü)pƒħL‰FϔQmk5pFE ÷ŒĜ=# x :NĞÓé,ĥÛí£qŸ ‘g>ówŝ³˙Ó×nd­è{żşÛİSÑZio•#Ĵsĥċ›07~ˆÓqú~$ršĉW“$ı½żżż—$ÉèÂè9Iĝòž; £2g¸~R$C vÛg—IvBÊê²RŞÇñnEġ 3šrkFĜĈġ“xvÔĵ îHmlŒ³ĦÚ.ž£„nöìŒòŬ40²3úDl&²ÎN}=0ZËşÛívĞÓé,·Z­µ(ŠÎApáÄı‹Ÿû˙ìżûÂğ˙úĥwrPe`µUÚ{>rn×bú׿nqugíˆúAšĤï'IrĞßïï¤išŽħšÙÂĵ]l·Û­8Ž—0\ ÂĝÌÉO|ëìKïícoÏ9C5CŻL $ÌŝU°ôš=÷¸z̓Mώ’˘(FKgcß³Š˘(jĠ¸ §?·öʕÜo²9ȍµ‚ƒÉvû2ŽuíŽ1f[k½_'á6 \iä½Ĉ ş/äßò7 D“ÀéZy‡ŻœïápívRlr¨Œ°1‹ŝ66#̨¤G˙Ö(°˙l2&;’l|™îġô·Sc5ÙfÄĈ°1Öèa°á)È´Eĉ]ñ%ó˘/„9dP`.ĠÖ÷ħÈş-Î#„(ŒEU°zNîìœ|rħ¸ôĥRj) í8Ž“$I*/ƒ—„Ë&\…¸Ĵ–lGÙ0k\/µ‚“ wlĝ6™IŞıYJşğÉÊ:Œkwˆx²ĠjİVĞw:vğŬ^‰˘èx†gƒ ¸™Żŭŝ×>˙ğ˙ÉĊ×oV⇯mĦ·“ÀꌌcC‚ğ{„s@§¨~áîĞŭóÇÂżÊ³ôŬ4Moôûŭ­~żŸdYVŽ Ĥ›¸à !XĵĠjEív{!Š˘£JİSżô÷?ŸÙ(|ċÛ|ŞËĦĠ—dǽŭ+œlÌòĞUUmĉyŜÄ9Ĝ‘Œ8 ‚`A)µĵxòıÇI-Ċoĵû>`*÷¸€Ë@âŒKÀĉ ìŽïi]ìTUĠ/Š"×Z³ ĤĞ ïĞ{ê~í!~o` P7o-€ĵ´ŝ^vrlç-5 êcÖDÖş&wÑpžmÔĥ~×ïî5k:5¸Ŭ+‚ƒk?TêNG£|ĉËkĴ´'ÈLx×;2ëŭôY½à3CäŝŭL£2>[ğ'Ìg?Tۋ°zîhàĵ í`˜ĈÜp+‚‘ ‰ĥH4À™EÄ‘ô ĉ{²Cxž!÷Ÿ}Ês‚Î5‚ÎIlvϝ^Ù½ĵ&\ p#Žŭ(ŠJo'4n„áàggÇ\òġF¨4cÜX—ì&Î,  I`t)÷(;š$``)ŻQĠĴ¨íû#QPJ[‹ûñ/~{éÜóG_xgż|wEZÂbe,àÌR’ D̍Bnż”ž?~·,ò·Ò4½Öëġ6{½^?˲ÂÏM2ÜÁòĵ!èt:8ŽW0{;ÇÖnĉJ•n;îÊÜG$ï#Â^árż_íyE_V…Ĉü~„÷ŭ޲ğïŽ UÖڌ Ħh{sÉÓËÜû×ıÈh‚µ|BÉ2pî&Ùàû–9g*›ĵ‹ƒWցÀî$ߒahßEn÷Ĉ<@ÔòoԂ)ĞÉÍ1ùßçŒıÙHĈÀ• 3’%˜%€;×2„\[A- Ş X$…Œ10ɇ€TÙaÀ›˙ž­Ĵ+Ô.Ö6ĤŭĴPİ&¤š aÑ 8Â^ħ7ì3ı:żrĈü€-ƒ@íİ…lûµÇeujëQíDQ”ċy7ì4–D•¸a0ì:ì5KÄp/ü/7~wÄPw"ÌÎ5šUŞ›×ħ›QDzĠjÖġe°#AœRJ;yîâsó˙WŸÛ£ĊÖüċ&ŜğĠ‡ÍJçŒoÒfÍb ávXĉĉOÁ6~^œ?ü”Ùiš^éġzë½^o/MÓÌ;"˜Ż˙;òñèíN§³EÑ1ԙ§żúŸżħSñWßŬuÊ:²wv"€¸Œ†Ŭú%N/”ë’ñ÷ûeı‘eÙ^–e™ĊqeÑÁġÌ9goEQÔ ‚`%h-žŠŽ>µòê ·AZûE€ĥòñĜ L*˜ŭK8ıDZ›-­ġ^£\gĤ­Ħs°=CW {҈Ècġ,Èj â„E ä@ĉúJn’Û Ñĵ³‘u­AĠ(ŸŜÚgô–­—ÉÀı [Cjcà ]›á %İĥróBƒéZEôOëÀ‰×ċÏ\êŝPŭµġ½&ÒD£ Zʃ‘ 2Gé@Úş˙—9°,ŬÜŭLFb8öâ|ó£l€.b* Èr@ğ9н҂[BÌ­cLŠC5È\rÈÜ âE˘!şçpĞûĜSçzëŻ)VÂ0܊˘¨Ż”Ş|YifÄĈôtĥD£˙bR€ŞƒċÔ­LF€·´"ş£l9nnhÜżĥwXşƒI)ı‚·Ûmċ3Œ˘(Š:Q-†a¸Áq)ċİ(n?ö;ïġµsŸüÚñ·odìĊ·6°³—Ú90Xm@…ù?MŒJ6‡ıŝ#Ĝk?*Ï.³ŸĜ*%˲˽^ïÖŝŝŝn’$YžçúF“˜BpuğŬ…8Ž×‚ 8}ú_ùLĵöäʟ˙&ŠĵòŠÎ̔8ùù'“½–^1ç^.ËôV͎|Dş™%€¤˘(jy{˘#kO|ŭi~éê>ˆĵĞ·5uŒsPä·èôYñ†ÖĊvY–ûyž§Ŝ/oÇvLi<*ÙáΤÑħ=$cŒö†’İÖzç§[yµŭâ˙´żċÀ…˜WƒĠġ1 µ6ËwxÖt#*;VĊŽS]RÁÁRĜhmÏ14÷Kġß”ġFž@Ípš9'4pv,M—z|Ï a½d÷ĈÇĜ&÷µzfçġ³²Ş…axğĠjí%IRTUÇô’Ĝ˜2ђü 3êy–Q0Şİ5]GĉrĠ)Ÿa4M"6kÖ(uq)%WJÉVĞ%½ğA+Š˘v†Ŭ –ƒ 8*Ŝ½ĥ ”ȧĉeŜ• @³ŝSœ[Şnpâ—Ó˘ĜȲl7I’&0L\è}*Ĵˆ˘(ЏÁŞTÁħ•ó_>ù³·{eYÇ oF̘a÷mieğгëIUíäyŜÏóĵÁy?îğA˜C²¸1ĈE‘{KŽ[üOŝ_˙qñòë'xUv…à1cLúĠŸŬ³}ġ4a:}¤ĊWv-¸‰˘¤€4ġµsĈœM€07ħEǰ֒`1lÑ×Ú:ežäµúÎŒhmaP üè|}óħ玧{—‚ ¸EÑvÇIžçMK~jÀŝèċ!é)1˘ş˘Â\żĈ]=œğÒk=ĈÀ–ì0[ş=+>b^ şc“ ^¨ â8–qa^²Üöù%)ċŞ”ò˜âĝùO|ĉı/}ûž’Kg_şÒ+—בĤ•kĜÚ9ġkW"v9éV ÈwP^ùĝí—Ò3+ê{ĤÊ_ó`t£×ëm÷ûŭ´ÁHĉ5OeJ)Çħìt:íN§³Eщ Î=ûġôĊ2 öĈ5?”nJû‰0[/!,Ż _̳ôf–e[µMÑİ÷DvÔn·[a.*Ž}âĞŸÌm;xù­÷@Äĵğ·w„qÉAÙUœ>.Żh]l–eıïpçU΢GN c–˙ћ‹°Zk›çy”ÚgŒÉĝġŸüûV… ŒÙ˜1`˜çíäˆMiÎÎ~SĜÔċ||Ċy×À|`XŒé‚Ï˙Zf͓ 2ž–ĜE,Z ?ĈùŽĵǨ%B^ˆ,BÁĵHK¨ƒµ@+Œħħüôħ“ğoœPUu#Š˘ÍVĞĠĞ”>,‰ñĦ˙NfT_éÖ944ÀïçĊŬŬô&RŠ`Q ‰ ƒ BTJ…ŝ#VJµ” RÊE!ĊâˆâĜ…g?˙ÌġwŸ O/ĵu#ÁĞoÜÄĉvî’VgÖġfœĝ„*C›£ĵú¨­_ġN¨ż*‹ì­4Më2ŬNżßŻĊóıO JuQÉN§w:…8Ž…axöÌÓ_úüҙÏûw/ÜÄîN Ò%¨ŞĵĤ@À 'f jzûWxú˜zÛèêŞ¸ĜKÓ4ÓZë *·`äU}ĦgGG”RÇV.|íÌ×zè÷2çÌà%ĉnö€P@ú6B³]é°·ÒÔ àĉyž7$ĉvĈ&ċ-ĠŬo=¤Ñ^ÒÚĊ –œóÄZËŞŞŞ¤”{Bˆc,dŒI/.üË1˘7PÜ͛3İß§ù˙ĜqĤDs°ĝ7ϏäRÊ8 ċ8Ž“£×*zççh/M9TàM €|`C$%GU:/ĥ<İ@+O¨­ÍóŸ\*^żÁ­8Ž·8N=K2 –ä#ƒİ6°ċ 4Ĥ[÷2 ¨eâbbuVózÒ57 Úét¸RJúY!”œsÉœs)„Pœs%„PBˆ€sqÎc!D[Ñċœ/ !–…Ğq{áij_üĉ³žû­cbáX÷­ë ^ŭġ-líĉD`F;SR&êĴqŽırÈBï‰êŭ LßßZ[ ŝ²È³w’$ıÚï÷×÷÷÷·½ĵğ0ĈLRÔM“x‹VĞv:…vğ},ŽÓŬċµ§?ñĠĝô‹ïöĜ›WzÎ3ŻMĈa ×oĠ/a ûG:ᯒ$ż•eÙVí 1;b\'[­V;Š˘ Ž.Ÿyŝ×Ú/żġcFuĵ4óÂEÎÁ`zoáԒY7·ĞŞÚ)Š˘ŸeYîg,îd÷È:hF/i\Éäy^YkÓ²,m–e˘Ï9WœsED‚1ĈëHñQ@š”è,ês•ÂĈÔšöœè@6ëħGÁˆ71&”RağŬîQĊùF°²ûúÙ$¸°LÄA!@…ğŠÊ•)áz$œ€@Ei€€!ŠpóȧÏĴî]:úF†Û­V+ùXħ$Ĉ`äâ'Ĉ€QíU(x-Ċô&GĴ³Ĥ5î'.†Í§†ĦXZZ^–A+b!Däӏc,0ĈĈXÄ‹9ç-ĈX‡sÀ9_䜯>ñüמzâS_:½zĉéċÍ}^ĵÑÇ_ŜÄŜ~ɵw.7FbnV‚8wM.A:Gqg¨ż@‹ĵwİÓ?ÊÒä½$I÷ûŭ^Ż·ÓëġÒ˘(ŠŞŞF%Î3eŜAˆN§...vğŬî‘8ŽO).|ĉ÷ŝٗí‰à'ŻÜ„Î HڀÀ]–3WŞÛżìbŸz,úeY×ò<_OÓt/I’Zá7•ĦĠì¨ŬnǃŜ‘”'N<ó7žxïV‚­du£Çèœß ä*DvŬœ=§~]•éfQµ›ĝ<Ŝu÷%şŸi\ěB7™1ĈTUEœs+,=IĈ˜ <qĵħÈNZè>¤0ħ9k&Ì™ğÒq%şħHJk]r΅”²Ózçûï‡_ŝÔrşÑĴS ¤9Ĵĥ(4ÀÈBp7ĈO˜* Œ0GŸŽ6·ŸúôrġÊġ(Š6˘(Úŭ ,é%‚ËC’ŒiÇ ôµŞİucD˜˜@3g`Â0d­V+XXXˆ8^‚`IJıÌ9ï2Ĉڌħ–£@Ä9oh3ĈşËÇÏ?ŝĜÓ§O<ŝÜê҉ I%ċÛ·üÛżĵ‰ÛûXĦ„€¨ƒì1Ló–3§£‘&ıâê`ożœ3KݤivĠ§änġûŭ½~żŸ–eYz0š¤4¤ ŻWĈqtğŬN§ÓYmµZ§‚ ¸Ü×ŝÁ7ĝÒĊċï÷*öû9ÈğCÀ27ú'H€Ia7~Šs+ĉz(èÍ~?ż™Ĥéĥ7q-FúĦ+ĥœ³8ŽUĞĠjÇqĵÁħ#}öYŜ:Ùŭùß÷9O~b ÒlH³ù&Î,U›üş·'êišWUeG¤îó²ĦûÒ`ġ~ï!ŬÑK2î@UUM£Éќ•q^Z쐽¤{Á–î%xP@:LLó›‡÷v˘(ڊn½uyıŭb.ğmb”V^rÂaŒE a†œ1(C(ŒA•Wˆ;-Ü\~îìêîÛ§UU­ÇqĵÓjµú„%=P;ĝž‰·˜gšŬá\5°ĥރúŻ˙=êċ8ŻI&›À”j#QĠjµ:aUJBœàœeŒ-è,Y]8rbı³ĵĥ´xôÔBkñhÔZ:k„êÖn‰ŸßìŬW×ħħWĈ"àäbN˜uŭĉó½Ĵq2öZ‰*”3[ċ(oĵ„òĈ‹ÒĞ[ÇÂTeŝnšeW“$ıĠëġv’$é§išûYù”…ƒ›—Ş………ÖÂÂÂJğŬ>†áù³Oŝó§>ùí3úÓÛ¸|³ïœ!´#€I?ÚaĦ·~ŽVq%={şġB–ײ,ÛHÓ´ççŽì<ìȗêâVеP+O<óûOĵ}­››™ â3•ߌ¸ËŸ ÊoÉûtîbZUe·‹˘ĜġöDE|Œ“ŝ?pĴIŜ‡@„1@4êÉ4şcż5Ĉe'+†>lĤô3Íğ)+N£ú<2­5ʲ,òY &×c:(l¸Ûş˙óE>"VJ-)Nüá?˙żŝЧûDbƒ0-4*CĜO*ì$ŜÜŻp7v×ħħ“#Ï58€ÈğÇÌÀJîv‡ĵƒ° áz0uù‘jwÁ`v.£ĵñSĜW‹ŻÇùRžı‰$I6|ŒD3|VžÓ80q‹‹‹5˘èüòڙO~ê[˙ìS?yc—ŭâµ-Ĝ²tĤ°dA\‚„¸‚Ŭ ´ñ˘}ú\ë—UUŸeÙ­$IꈋQ…Ûĝ…VJŜjµ‚:Ú"‚kĝ)ŠŽu~öêe„F{wo¸AXÎÀdğó*Žu²í@ˆËiQmz1C6Ĉ@ÖNaяJv3h(5ˆO˘q ^>b| = `ôAÜ40b²'UUUE‘äyÇñfçÒOŜZ|òo<ĥP‘“/WÌğQT†ÀˆAr7‡% @—ñb7—ž;st˙ÓAU­GQ´Ġn·ûY–B}H–ô`‰ê¤ŜÚTµáH#‰Œ s0ˆĞë÷š&mDc\zaÂÚ-˙‹›ûá/.÷ħß+`‹Í:h[§X¸ÁT*ĊŬÚ)9XċM$ƒċVr0?ä[3iH “m@ßz ĠŸS—ġn,/…?ĠUy%IòëišŜî÷ûÛŭ~żçRË1v@sƒQĞĠRŬn7^XXXît:'â8>ß]:òìW˙èżùÊë×+ùŭ_nÀZ/ñĥóOn¸œq Şĥ`6~ˆ Gìûħ4żN’üz’$[I’ ”˘³XGCÈ·ÛíĊ(ŠÖ‚0:uòıżġĝĞWz¸½™€tî÷Ġ4)c\Ş Pï=v!xSëb=Ïóí,ËúY–• go‹ÉÊ:;Ħ<÷HÔ04íDÑP˘âJOcáynŜßtİîƒôŠĤ펛_ Rk²$aŒİŠ˘ÈüŜNE닗{}÷äïœGábÌİÒ°Ĉ˙i ”Ö‚IÁ\Ü9Y ,k–ôLp{ïÏ)yÓ³¤ŭN§“–eiÒ4}xYó“u*Ĵ£úĉ ¤5X5ü„&^ t×ĉ@ÚÍSœó˜sÔËÊàÖ~‰ŭíF@Öäí|´ġ’d7\­- Ó PPV6`0† ìÍı”°éôĈ+ë/#*ÖwO,·) ŜÎÒäF–eëišn%I²ïûÒ÷‹Ĥ9–OSÔ äŬ‹‹‹KNçxǏµ;‹Ï|ŭ;˙Í×ßß £?˙éu$IîlÊғ„ë1^Â\˙>V°srıġ4MŻ&Irğßïïz!ƒžUŞ/ó|´ĊŞRê䉧ñ|%VZ/ŝú=/ó&/f g¤*@ĜÛ/hĞżÛ ƒ·’¤ĴÍ[“˘(ŠRoàR×Ŭo=$š ӘYĴì@šF'–Äf°¤;‚Ôêsk­ŞŞXžçIQğEQlvŜŝŜНÇq²—›"ĉ€ëyİ äڂ““‚ë´DĞàĉħ/Ÿ>Òż|>4ĉvÇğ­VĞ_OۗeIÊ­˜ÀĴá{+FéŽÁ+ìĜA0j2)1Ĵ`ÓŬ?ÊDCњ!ùaòˆ1Ö*ÍÓ¤€ħ( ¨ôÁ•&ÔLÉˑÉ8Km¸ßDDœ1H×á ”Ü†ÙxĉöŻÒ›ğ'—:݇íĝͲÌoy~;˲Í4Mwûŭ~/˲ÌK¨'•£f€‚·Z-µ°°Z\\\êvğÇ8~,Š[O}üËß½]Yĝ³n`{·p2m½šÎE\€spÁa6_Bĵ™?uŭ˘ÈßOÓôfżßßJ’$k”ê0£T'˘( ÚNZ·†áħ¸½xîä³ż˙ĜOŜĜĊĉvï fÂÙ1€ÊÛ@r‰žxġ•żóÏŻ'O/ŝéoàĈzd*Àx!ƒ&\€ĞĤ˙&ìúOé§WÈTogYv­ßïoöûŭ~šĤY£T7‘İĠ)´ív;l·Û q ‚àôcŸŭ{_ĜIeâĞ›ÎĊߘĦ3`Œ;ußĉË8ÖN·[Av’”yžï&I2.kišÁîĵVR USzH£‰˘£ŭ„ĉïᐽ#ö&’, eYY–ġüPëíÖ[ŭjëÔWNġÁB ÜÍPÔħ²5 œÈAqÈÊ˘Ê A›cûèçŽĴġŜúD`mDQ´3Ĉ½a´tLN•½˙KwuÎxf4è3ùßħßĊz1“ÁYQ1?H"BUĠ̨rá€Úş³.%ĉƒ9÷ı\&”KFÄ9*fPnż³ñ °ġkÙzylQmœ<ĥòĤä‹ïWUı‘äĠf–e;yžïiÚKÓ4Ͳ,ŻÜaFÊP³Ĵ’ĤÑR·Û=Ñjµ İßú[˙ëo³•çŽü‡\ÇĠkŜĊğÔn&jpî…7żŬ„½ñ#\Xї[Š˙2I²Ğŭ~£ßïï%IRç™YϧfGN§ÓjµV£(:ħxôÜÓKgżxìßŭxŭ^îzG4t?t³Y(néezâbôJYĉ·ò<ßLÓt?Ïó²1{˜Ĝ{Ġx(i+š4“ÄFÀĤİĵcz “üı1.ÙŬ ù+„µĈäy.ò<ßÏó|+‚[GŻ˙èzrì›\ŸÁĊnú,˙Njc½‡ƒw]çyŞtްĞ˟}îÉäÖğµâ(ŠzΤ)çcĜï¤ëĉŝ-Ŭùž J “ŜzAô?rÁ‡ä… ìƒß4éş·ÖZ"ÒDT‘!_žsÀ,RħN1 &ĴcR:c`U ³û.ìî;0›ŻƒġŻ›µvN]ı²²pâ’Öz³ŞŠí~Yn{ıò~žçIšĤiîŽjÄrgVŽÓĜÖç/ÉĊĊĊöÂÂÂb·Û=Çñù0 ŸüÜïŝoĊ§żxüßŭ:ŜıÖóe:í`áĜ`J(ƒıñ=Ĵˆ›;'–[?ôi´ëŭ~§€³TÇ£(’ív;n·ÛËQ“Ržyâ·ŝñ§Ŝğ™²_żµċ£-ê€6M`´ġ œè¤›ĦŜIòr=MÓ]/ò˜&ġÇ$ï{zJvJpġBe0]•ġˆĈżĉIRo; F:e (Š"˲^EÛaŜnżġ׿n˙Êİ>g! "`ì°&Œƒ³?äS@3dís‹{ŭw>ÓÙz}3 A/İ,ËQĝ((MÛÄÜżUğ:µw0gR˙`ĝo˘:S t•ċ&Ñ{Àk­ħÖj"J`Ħ€ċŝjp– |È9Ş>ìŜ ˜waw/Áî]CÌÒìèBĵżĵŻŻ]8ġµfKk½Óï÷w˲Ü+ŠbßÛÜ$Y–eEQŜuĊNX\çöéB0)h·ÛACMw²Ġj=Á“ßĝ{˙ċ·ĊÑÏ˙óoµ÷ö` ïÄ`ŭ9g Œq° Q{눓W“'Ïwż›çùûI’Ôi´İ÷Λ)ގ u´ĊbÇkaž>÷Éo‘Z§ż˙½Ë°ĈeŜ$ü6ğ2hz"{W?ùtüó²ÌnùŜÑ~žç£Ê:‹éfş³f‰î²|7î0‡˘{İnC£ĉl×à½,‰ċyžeYĥÇñf7VŻ}÷Jí·/’.Á”Ĵên†ù -ıĝsNDA„ĞĞ_ĝ\˙òÛĦ1Ûqïu:ĴŞ*]U•ñšÀ&ŽÜ×,İ Ôá{#ç Öċï°@ ½Ìîg4İl­µ­ŞÊj­3cÌŜvj‹k;(ı Ò}P‘ĥUû°½uĜŝ:(Û·…‰…-Žt˘ŝb'Ú\=ırM‰ĠMkmOkŬKÓdŻŞŞ~Y–ŭ²,ûyž'yžgµ hY–z$j{V¨àLoşvğ.,,´–ÛíöÉ8ŽÏÇ­öÓßü˙ğoñ+˙ĉG7ĈXíxa´ßĉp€IP¨`n˙ÁîÏòç[üò·Ò4­Ku½:âažR]mžÚŒĥh/ıxú“pŝğ/oú­ž›y"Żbd.ôİ09ìöÏñÄpè÷Ò˘XOÓt'˲Ô+ëĤ‰ĈI½1ŭH4a·; ”&í”Çġ‰1¤É€„FİnŒšñÀgÜk–”çùv†·.}˙WŬŸ?Ùí6!„$ÒÈm`´…&† `† a` ğz1ĵž|áK'oŝ`#Š˘­użpGi­5ZëI;ĵq‡ûğtgë\,Í­ġ;żĊörë4‡4ġZ³²,‹ŞŞzRÊÍKŻŝü˙'-JÖ@; rĈ98Ĵi…²·p<ÜiEĞ;ä{ÖÚÌZ›cRSI‘éĴŞŞDk–e™zJ̈́J_ĉÒNĞ`GËp“fh0 Œ˘(’Ŭn7êvğn·{¤ŬnBğğĝÌïŭġ;zmáOxï]ÛwŭMK~ŜˆœçgCvëEˆÍŞç[ĝ1™âġ4MŻôûŭÛûûû½$Iò1^u˜7âA¨N§·Ûíċ8ŽOApöİŻŝ“/\Ŭ4ò…W6½ÄÛ dŜĉƒ˙(yş™ž;ÚŝEĉ£-Ò4í%IRL`Góö‘€û\ò}?0¤yAiÚï7ˆfÇŒ0á|5żŭ8ĥë+,,Ïó,MÓ½0 7‚ ¸yìҟ½³î|Ĥr~muĵB-ö½’J8³ánĦJ#P ·Wżzb÷Ŝ³ı²†á~ğŬN˲,´ÖVkô’ĉ8܏ìÈċĵsÀp€ô˜•‡Apâ‡tĊVUe²,+ƒ ĜgŒ­_Ä÷ŝïâ”8Ĉùڒ÷ħÍT—ġ SURĜÂSh­K­uĦµÎĞŞ*ʲĴ?ʲ,+× ´‡ìá.ÑfżHt:ÖÂÂB§ÓémµZ'0<ż¸²öìïŝ£ġġ÷{öŸüĝnÜÚwċ1­Xrï`J€ ³ġ3ˆéOœiŭœSġë$Mßïġzë>0›’7t`]òŞ:ÙívN§³ÔjµŽ…axĉì3ßĝ‚Zzrġ{qyštéTupêT&\żŽô6hû—¸x6zKğh‹şw”i­Ğ9ÙÑ,y$û €šµ¸Œ”|Bó•s& f•HX͒ĵâï{I띛ż~mċäoŬ2+Ë,X€r={0İ2QYNn6)׈ş‹ìòÑŻúÙ˙t52fOkŬĞŞ*óÊ+Ŭ(Ŭö’&ͧŬ‡;rB5×ÌeFT':iĝ%û7ï=V;ĉsÎ"ÚÒZÔ>çĵ „“†“µĥöÔĈ]UU•´Z5JĴî Œ&dYÌçŻ6µD×n·£………vğ}4ŽÓAœ?qöÉçżö÷˙ëÏżv‹‡ú llöPkXĉä˜p‚ ályĥşùCûÔIùĞP˜—’$½Üï÷oúÌZD`fô´X#ç(èvğvğ}4Š˘Ó Чž9˙ıï\üë—ĥqéʞ“škíı{.2pĴxgX‹÷ĥW;­_%I~+MÓíÚâìhî’ç#@šÍ’Ĥħ şK{HÓA‰c|äÇè˙k|/‰•eɳ,ˢ(Ú p3‚›Çßú7Żì>÷_}Íê’C(gĤYš9` Á %˜ĥ h‹ŝ곝ġäҗŽ˙t+Š˘ŬŞŞ3P7żÇÒTşcŜ…Áĝ’œÔBî’wMcġC¸×´Ö”Ĥİ!˘\kÍÂ0Ĵ„=;!}„ i­ÉCZk£µ†Ç#òìĠcĴ1†ĴµäSçq 'ÌbEJ)QÏôxÇîVĞu,Š˘³Aœ˙ԗ˙Ğżô÷Ÿxñí>˙‹Ÿ]ÇŜ^FÖĝzĠ˘àîKé"v_½ù]ş¸FŻ·ü,M³÷úŭŝ ŸıÔ÷—ß$VrGİ.Žúı‰ĝdçŸûí˙ü o]ŻäµèÒoÈÍrĠ3gŒ½7 úoégžéüĴ(²kŜıb7MÓĴ(в£İRïï|ç;ôÇüǏ鐠„ e8:$p=¤É ÍFy>á˙5ÍŻ1Užç,MÓ$ í(ŠÖ;û·Ŝ]ëżöÔ-uác¤­dÔ‹Ğ…1Î÷NIfƒPàĈÚ7έôß{:´ë;Ĉ˜^UUİß}Ûz×=ĉyÚšûçCħ1Oîh$™ž|ü„Vù[ÜLXkm³,ÓEQ@)EA”ŒħDQƒ×Z×b2ĈÔʆáıvwñâ7˙Ŝù ĥòô‘?ùù~úêÊĵtv½)d¸[vôÀ÷›ÊsöĜ„‹c܍òˆ-M6ÙÄÀ§)ÀTGÊëÜIîö£(ÚRJŬ:úÖżië³˙ûß-³Lħ ›ë‘’ô’á2ŻZ˜Â`Ħ³Êß[ŝúçžÊ˙ġÍ0 ÷ÚívżŞŞÂ—‡šŞ;Ì(ŬŬ‡³ävêR8ĉH#§y¤#Jt×kÉĵkò ŻË²$/³Ÿ2kœSĜÎ<Òħrî(ŠD#Çh1Ž#QTJ=vâܓŸúí?úŸżĵFùŬ›¸teĤr.ÌX™T€i5íü ĉú_GìKmñƒ4Mßġ`´ŬëġêàÈY>uƒR]ĞĠ’ ÑÂÂÂbğŬ>EÑÙµ³Ï>żvñwN˙ÛŻĉzT•Ž[8— Ĉ@[/bYnìŸZíü,I’ëišŜN’dÏ ³Pš4<<éŝ&;zH÷˜ĉ)I&ġZĥ›d³ÔŒò]€L󳵖EQz–´ÁşR{WN^ûŜû—Wú„e, ”8(Tš „S .À…KíúÂÒFqċKĞ›?ßĠZ÷ÛívĉAIßeéî%Ĉ]˜!Y3ùêĤĈĵ7Ŭ³û‰aşŻÙıccôaÜògġ„f–ç‚ àžĊ §ƒcažRJ=öü×ŝෞĝÜœñ½Œ˙ċ‹×ħ·—Âj f}NÍ(„s`àvë%ĜeŸ<†_w#ŝ‚£kûûû›½^Ż×pb°3úFk VĞuğŬŒÎ-,{ĉ“żŭŸú…7wÙÏ_Ŭj0jœ=&g Ú|ïûÌÓí_”ey5Ïó[išî:r”U AˆQŞ›ËZéCú7ÒwóÀ˙ñ³9€…•çîzħj:›(a¸LcÁ2Zë*Ïó"MÓ~†[AÜ\ĵö£_vV>yĵgaĴ„ œ|ùŽknĦ  H)!A€Áhƒċ–ÀĈ‰o_XÈ?šë{ÖÚ^UUyQşŞ*ëwö‡)ŬŬ7ŭ$Ÿ°&„1`DÜÇ5 ĥbèáĤ”íĈċŒ³êÍ›ç>›T†›ŞBˆĵpĦŬjµ–Z­ÖÑ Ž+ÎĴş‰Ż˙Á?ŭlœ^ü÷?ßĈÏßĜF‘@U‚iÎĞħ,'\ü·4Ö0·_n}O?y<üU;ÄO}™îF Fišĉ^8KÄÎ9‚€w:hqqħÛétŽĈq|&Œâ'>û7ŝĊWŜ^gÁ_½xĥȝ=‘ñóg\ıR j ´ñ/¨Çq7Š˘0 Ap\Jyĉéçżö™Ï|óEÑù'ž˙öWZÇ?ü˙û—Wpk=U)hà˜ÎŬü“P€T —Ħ’×ËgŸY|Ħ(²:…v§ßï§µĊ V4í9>ìè$`hDLÖÁórJ²Ld‘&·ĉ'6á"-ÛĜ e;ĉŬtšĤYûanH)—Ž\ŝó·Ÿ{â÷2“G,îÀf%˜h$ú£¨,”0Ħ#rhH„ĥâĜ>û­Óivċ3Ħy·Çq_k{ÙħMÓ´.ŬĦL{‰żù~RŬ@ Ĥ—yfÔxĥu™Ŝߛ§9Mİ:­·ÔÜ °ċñI×FÊrƒ™DaĞĠŠ8îDQ´ÁŞRjMJyrùèÉÇûïŝ³Ïò… Kßk?}í*öö2X™ûĦkçha…tO@*0ÎÁ8ƒÙ}ĉĈħ*Ö7Ξ]ú^Yĉ—ĵzŻ×Ûéġzŭ,ËÊ9ÀhpA |ÖR{qqqكÑgžüâoûÌ]üӟÜĈkïîeĉÁHŜWĈ "P˙2°ùzî|ü*£ê­<ÏŻûÈö^-dÀôœ£¸3Œï­qàŒW‹ŠArN€ $@“—X vŭäï?1ûo„Öö1İwÖZÛï÷-î8ŒÓX†ôQƒ’;ÛÖÇ6pPY9f4şĵL&ıtßwÁ–ĉuÚuܧüfQ<Y—ĉ˘(jEQԉ˘h1‚U)ċQ)ċ‰#ÇÏ>ñĊoŭÑsËg>yôkûÑ/nàêġ=XmÜ_J:wĦÜg^ÀÜú hŭ‡ĉüñÖRğû³Œħ>ğÈĈ€Ùˆ\b-ĠÍbĦÁa·^ıù=Ĵ³çV~TUĊ~âÄŭ~ğßï÷³,+ò<Żĵ‚m܏F~Ö¨µ¸¸¸ì#Ñ/t<ûċżó/żúĈ ŝé"OmApïo]Ĥнê6_@˜ŝşĝô³+?*Šü²gl›ġìÓ!TuóÈĵ8vôPĵBk6ƒşOwÙŝĜ³¤I€4”î8äy^$IÒ‚`[)uSݝ…³ß=ġΑßy†t05H²"Μ£5€R[äïûJ ·:5h‡[çŝÖĊV~s=´ï÷1™1ĤŜjvd>‰Mè'1LŸ[úmm\blóᇈä6S‚;& öAUvÓz>ÓÎÉ$6ĤÄ=I”PJÉ0 U†AQħRŞ£”ê*…+BˆĠ¨Ġ9ñìçżù̅gx\-îu5ÁÏ˙ê:'°•ö‚}ß°Ĉ‹—œXÁ‚ĉ"lvĉĈ‹ ġÌı#êÍNûĊ,KdYvÇGÔs=y]îĊì@ğ`äƒ˙–<3şî,>óĠż÷/żùŜfÜŝ·ßżŠŭ^"ë\Ċ·‡bàҕêz݃íĵ`?}qá%2ċ›u´EŻ×Ûo ÀÎ*ĠÍ̇Â4–Ċ:êÓ8kƒgʏŽ{’F‡$Çġ•²,˔RûJİMT§³ñòËGşOÛ§V™XÄ|ĵBŭpDH Wş“Œ AB:ċŬjğĊoœŭ£/>–ŭ›1QâŞzˆ1ÏóQ‘¸Áħ GÁ’ê$ò  VÇuXò ôà‡ΆcîPJqÎ9Bˆ „”RH)•£À !bT,ìH)ğBˆ%˙qäâ§żòôSŸúÊٕSO-mġ­xùJoŝünm°•Ĵ7[–ƒĞ|˘*qbÒ ä…‚µ9ôúK0·_@ÇÜÜ9{fùçú­$IúRĜVżßïyÇîrLô¸Ĉ.š=£………………“q?·;Ï|íŝÛo]Ù[èüëï]ÇĉĉcFŜÀĠù*0¸Òlz´ŝ—xö´xĞâe‰Ŝï÷÷Ò4­£-Ì vtɎ@"ß/ŞĊ ‚ Ĥµ]ùî2²Ô3İámG~Ŝ¤ÀÁZĞ}é. ‚`G)ĠB,œö'/ö.ü§żS˜4 Ŝq‡†\ż~´´0œq dĵ4àœÁşĞ§˘§˙ö7Nż˙ǽ(Š2kmîc´1ĈŽp§t}bÏìC%rVIu)œÚ:pì^X­Á$=tk[rSJ1)PH)/·)ĈBk-BpĈ˜àœ (˙ğJpÎ)e(„ˆ„ħ˘%„è!şœóE!Ä҉sO?öôgżvŝôÏIM Ŝ™áÏğŽëë}èÊÀúÀBf  ­ï1ÈÄ8ĴP°ÖÂ2W˘Ó{— ×ħ˙Z~ŝhû­…ÖÒŻÊ²¸ÖϲI’l&I²Ûï÷“,Ër_˘3˜F;Œ|™îDĞĠş·;Ÿĝúßû—ßş•[ĝ×ß½ŒġÍf™Î+êdèúFŒŠÛ Û‰ ĞÙĠËíŸĝù§›½^o7I’$ÏóQ‰÷,5Ŭ4–ôÀŞë"†„˘Î•ái(ġ~F‡aI“h˙$ĠŬh Ży˜1ĈE‘§iš(ĥ•Rוêu[˙‹oŭŭO%c2‹ôÁÛ¨2„´Ôà\B€AINnaFœùü‘íüĉחnŝ°fIÏëĦŭ¤C‹Ĉœ—TZ‘Ôô,ĜA¤àÜ9 Ô4˙Ŝ¨Dïĝ#A(ŠxğŬVN'PJEJİHJpÎĈ˜ cÀ˙Ÿ½÷j’ô:ÓĞc>“ĤLWuµ·p$ ’fH‡Î 9f G+­bb ic6t³í…~‚ĦÎĊJŠXKÎR#i8†tèáMµïêr™ùùsÎĞ‹sĴݲ3³²ÚÂy"](_iÎó½ÏûĵÏ0Ĉ$ç\ş4s3ĈbÎyÌ9oqÎ;œó.ç|.nw—Î>òä}'îôʉç5ï„V3üß?ííË}äıv+8˜5h'Éış€a -48Œ”0ĠÔċg Ż˙ÔjçWŽŸ9Şw“$ıœeÙġÁ`°‘Ĥiß­Ž(D§1[ĝ(9R­Ŭ; îÂıÏŭ“ġ…ĞĊÑĊŻ÷._€ŞÂž7şB½_„qn:Ó­~ÇÚ7Vï;ĥt–eoıÑZ’$ƒ=ööddĝ VGû†Û3rċf‡ =n§JšdŸÖOjŞ$I2)ċ–;è.w7^ŝH÷Ħ#Wû[َÛ~‰ëŞ@YILC0Î9ĴR0h… ŭS_:gןŒ6^ˌ1…1Ĥt;{ô`0 ˘(ĈÍ'Mê£4˙ŜğW)5ìîT)+ÇÙğJtĉ2Ûû‘n|vŭ˘ ĜÜܜœŸŸÚíö\NjAtcsœó€È‘RàH)qÎC1çĵĊk3ĈÚKGÏ^9vöĦ,-ğo!êlm*ĵğš{?îáòê5d^˜ÛÚJäzjÄ@ZÁfa `ˆ`dCJPĞ/A]}ŬêBï쉃?Lĵ‘eéċ<ÏŻ%I²î2àÒ,Ëò˘(Ê1jw%#7gş•èKŬn÷hğŬ>Ûî̟ûüŸüĊ.–ĉżŝŬ ¸pqä" µ%#Îm:V€Vż‡Ez³˙șƒß-ŠüÍ$I†™y#}£&áŒë!íIŞóÒûÊD€ĦÚÀàÊd7xHä ·X%ÍbĈ†áĞUU•I’$AĴK)c!Dçèċżnëŝ_̌ˆ™œUääğ!-$ı•î„à`0‚A•ÁB+d7üŻ>~ìĊ³ÓµŒˆ 'Û)·PÎXäĤ¨™OĦ÷Œ” ¨¨ÀçĥrâŒÁÀIWRĜÊèö~ƒqÄ4”/ĠQ×Eô•Ráœ/1ĈĉŬÖĜ ĊŬĊıùċ£‹ó+'–¸۞?p¸µpX'š_ig%ĜFŻÄÛ[%÷Ó—ÖŜÄ QœÀŒ'Fœ fŒ/´ĥ=_ÎaˆÀ0[7ç˘Ó:‡Z{ĠĠç ÎçgußXœ[úeU—v£êŞ#˘A’$™ÛTĞÇHtÓħ‡dÔív‡ Ŭn÷XÇ÷Í-<÷ù?ù‹ÏżıÖé~ŭğ—qùʆ‹ÒÛ n­¸X Zŭ.ZÙ/³Ç9ô½˘ÈÏ'IònżßżŜï÷{išĉ#;Žn:š¤h|`Ğ£}AHÄÖbjıÎ&w7읔öbp—à0Öu'\‚ -윽ú_½tŸ$HƒIÀ¨a£GJ à‘´6\ƒ1••XŒ;á•ûŝëϜxġ/7#còn·[QUU•İŞŠœ6ż›É“*Â;*׍R‚ħ?Jr@¸˜13üˆÈ>§ŬİŸH£½4!wnìı0 ~âK˙âϖW>Ï/İJ# €ä@gq%6ą2@–ilÖû%Ŝí+\|3Ċ…µ·°U‚Ş Rrœ \.Ħ ²ËYA`Fğ'Çĥ’Ö¨ ı•ċ˜%%ÈÀÑú+¨> ™œÏO.Ċï~pċeY^M’äJžçkI’l¤iÚw½˜ŞŞŞÒ- Ôú.'sĠ³Rív;\XX˜Ÿ››[n·ÛÇZ­Ö}‹=ö˙ĝ_}ĉµë­ÎŝÖ\_K@ŞrR£ĞŒdà*# pZŭâŜ3ù“ç=mTñršĤïôz½šŒ²L „‘‘a’2CCƒ4´$T;iïŒköC+ßÍbpGJCéN)UeYVH)·Â0Œ¤”íîĉÛ/l˙êğ­ÇN³P‚ÈJwukŭӔ6Hr+k1&rğgŒŒÂÂÁcĞĊWpôüżOˆ¨t²+<ÏáĈÍ i7“¸5ìŽŬ´=,ƒÚĈ ëk\Ò·ıcÎô›b~‚ àaRÊy)ċĦ$<òñĞÙѓ—.dĜèi6¨J…4;DĦÒ DĈ ”Í$$UÁn¸ş00ŽŒ È8³úJÀfgÌI—Nâ"C0Ìî2\@—›×_Duí§é;ùñċօ£ĴüJİêJ’$׳,ğ‘eÙFšĤ=GDE=P:ĈÎ=Sż(ŽcÑívùùùın·{¨Ŭnĝ£§ŝäS_úó'~ñ…˙ïÓħşşµSĤĞ{~\şŝ‘­ŭá֏Ë'^ù!LġbšĤï ƒĞŭ~£ab¨F$ş[%%`ö! ÉH;§]#C´69xÜÑ* 3Jw€;gߔRĈRÊöʵ>Ó?qhab|ÁÎßHaċğĈàlQ$\ƒ1f5¤ä0 Ì uü×òż½tñï "ʍ1#B#ñBMbšdrĜmF‰Ŭ:+Ĝğˆ1Ž@Â&sûΙÛËËĥ‡g‡³7wDÛAAp!D$„hsÎ\YÏ˘W67qñF RÚŜŒq‡ŻğĞ×˙’ħ‰ Ö!Çĝ0½ĵdMJĦä*ğ$sĠ!8@F8Ë;ƒê]€ZúÚ/ÑÁZrreáí•SG^ŞŞêZš&ĞEQÜȲl3MÓ~šĤƒ4M‹Òêsµ<·—ôëŭ"GF NçPğŬ>†áŭ÷ûôŻûܟ=úôó[üotƒAfɈܙÂĴĴj+#a×£ßxÁúŞ'>ĝ#ÁôóI’Ŭï÷Żôz½$IÒGŜo4ÎhöĞT·*$cÀ˜ S$"À˜`Öäàsìn·B&&Ċ éÑĞŞŞcL!¤”ëÎ&Ü>síïžÍŽ˙ŸÏŒŒxĵ*-ñÇp`ĥ–îlżĊs‚aօWúüÉ´XŭtëúÏ cLeŒ6‹1&MÓIÛn¤tGˆ¨ù\­î0`%ÀŬSœ°#eUğzéöZY“úHŒ1Ĉc’13Ĉ:0:€Ñ0•†)r;ŞŬŬ *{ĦÇì .kbd?Ŝĝ=5c0ŒÁ‚À…°ŻK.Á…Kâ&À”[ŻB_˙0xS/·Íú‰“Ëotâ£oVUµ: Öʲ\ϲl+˲^–eišĤEíž#"³KU4ĥ_Ԕèĉĉĉ:sss‹ġĤ×0 ïìÓôÙ£|ùÌ7ž[gßzĉ2Ş<U‡Ş×Ìsħ½d• ë߃\˙~ġİG>pŭ‹$IŜêġzWúŭŝş q-ŞŞŞp³aŻ}£ħîşŭ@Fû‚Ĵ=Ö{sdFÂ*=nİJwHèf“Ĉ‘R½òĵBô¤”A=·rߍo/żĵüûŸ¤œ3È9û%šì'ѐ˜úi Î`’#† Uf Ëî˙'çÂŞŸD믗DT‘µXCZëIÎğqD3kŠ ÊŽ!„Ħ@$ BÉm›ˆYùŽscܢ>pÜF+k\ìÏ_÷0s"’ŒħĜÎ?˜<J×14\Ş8ĴZ]D n Äl…0ĝµ‡51ĊlÀ$C€ƒñ(6a6ÏĴ=³ġĉù`pâ`÷Êѓ‡^éëUU­ ùFQyž÷²,äy>$˘zĉlÊŜ˘‰‰×$şN§³Ün·Äq|şŬ]ĝÈoŝñŸ6î_ŝúÓWñ£_\ƒİ ğ`o¨˙ğ°T\‚!‡ıömD½gŠO=rèG0żLÓôí~żıßïßh‘š@B{ PŬWş}+ÙĠ.ïí‰wĉÉ轕îĈ%‚7ûI¨ŞŞLӔK)·¤”Ħ”²ĠáowNµ~µüNëñ3 gêŞÍ(µ'ÁídʚÀC fÎ4TĊщBÑ{ĝO?uàùżDtİr³IÊ3\G]…ù;ĈIwÀîİì–ĝÁqR,(”™KQĈÊ[`0¤aHĜ,?mîĉ3n§3Ĉ0"âÌÎG0û{(0c×cì\ÛÂìa²r#1f‰TJ'/6mÏÂ-˘³é”^êż³ù:¨÷ĉd–Ĵ,ĥ֎}dé|(.k­×Š<Ŭ(ËrĞ,Ë­<Ïyž'Y–Y–•eYV{ "L"£0 ù¨D×jµŽEQtĉĜ™s?ùû˙Ŭ'_żÂżùöğ8˙nP•z%[1r—ÀÀıÒ˜kßD'ûyúÉsGȨz!IÒ·z½Ŝ•^Ż·6 ’<ϋF_óV+£}9s´?+¤Z !—V_QÖ9½lw§ä;6ĈĈıšïSJ)ĈX‘ĤݐRn:éµ|ŭ™çú',Ĵ+qb$¨P`’ƒj÷mƒ\ƒ[Íɒ’&pĤQ•  ×?úß|nù…“Ċ´V¨\•4$œFÔ$i›Oï˃C ´8!â€tU 1‚pN íŞ‘şiN·5‡4uċ¸1†ˆÈ‘&'+!g]vëŒËe³!{ÖÀn­éŒƒ`ÀĜ„rnċ=“_ƒé½½ġ:¨÷µY-udiĦ³vÄÒğQÀŻj­7ĞŞÜäUŻ,Ë^Y–ƒ<ϓ<ÏÓÜ:ŞÚÂŬĉh kì-äµD7??ߝ››[l·Û‡â8>†áُ}ĉ~äı/Ÿ}ú…MŝÏ]ĉV¨F+{1¤´sÓ,l°kµşöM,ŞûŸ8wìi£Ë—“$y§ßï_ud4Èóĵɨۍ”vË×}íáŭĜ~ì iÚë\Û3j>,ÚĜÛîExÜv•4mĥ™r5nšä¤µfyžçŸ¸Ĉzëô•ż{&=ú'_ÈÀ#&€P‚JuӁ\V}Xy–…ÜηT%$ĉ–ġs˙í–ùżçT}àşÑ"£µĤçFŝ†iŭ-_ŬÔħĥĥB’€ c4×ĵħğ‹Û‰hÚM²›ċ÷·vœsĠceŒIIEnƒrÉùàÑ6.í *û@“ĊL˙"Ìàdµİ;bp`µıòàÜĊv<UkŬ3ĈôĞŞè÷sĠŻŞŞ_UUZEZEê‚O‹<Żw0]s£dcĤôR&VEN'êvğóN˘;EÑévwáĦÏ˙£ùYt˙ÒúîU<óÂ*TQZ[7{Q µÛgāÀöŒ(żşöXáon|ü‘cß-ËâU7gtĠ’ d¤§ÑnĵûZŞÛ?’°ÍSÛduÓín—<Ŭ iŻğ•Rmw¤Ô“R†Bˆ˜sßżöÍĊ—ĝ¤‰¤`Ĵc×50·auèòrÎğLÙJ‰30(ÈPJCç Ŭù£s›˙Ùĵĝo+"Ò b"èġzM;xӁ7ÉĊÄnO³_IŽV,B!à d³ûs‡ĦmS,nŭxÚ`,”RF)e´Ö™1Ĥ& `QhM Ú6òÁ}‚² PJ݃²UPħ…Nˆ,Ždю˘‹ŜâJ|msòŠħ ZĞd0ÈT˘”JĞŞJ˲̋˘Èœ;Ħ(Š˘ŞWÓğjh–Jh\Ž[³WÄ8N'êt:n·;ßjµVâ8>†áécgùĝSż˙ß?ŝêUŭ˙Ŝş¸TdH•N&v2¤l䓌@ÉyĠżÇħÖµĠs÷ùvž‡^Żġz½u—Q¸]KjBE¤oĦtéò'˙Ê÷î5 Éh(o°abòp¨ÇíVI{‘î&íNŞ 0Ĉ°²,+ĈX&„ĜBBˆ°Ë/ĥîž[|žú‹˘]aG:vŭÓÒB[·} VpÎ@e…€. Ì?˙bç§`íçDö´RÒSHi\…ÄöJT q(G‘69#ċĉušj³ÍħNĉ=ÛËçc¨ŞŞ²,ËDJıöƒg_È7Ï”\‘B;™ĦħύnäœsӉeÒZ’ƒvo,tn¸èĤÌ“cr­u: r­uRUU”ÊŞŞÊ˲,ĴŻ%/ŬÏUUU)­µiô†p ²ÜXyĠjN§ĠívçÚíöRLJ˘(:ÁéO|îŸ~úÈG~çÄw_Ĝà˙ÌUôúP)ÛïŞL¸ž‚¨÷2èÊßáìŝċûOüN–eç“$ıëġ÷z½M·ĝŻ60ŒĞŠF+¤ikʧʐüÉż˘ŭ¸}t_¤}§`ëŭ:µ\G8÷Zş3˜âÓZWUU!Ë2!ĴI)šÛ|9:%ĉ.ˆà8˜ÜNóWfğ vVIF‘•ïU*pĈûÄáB—ż½úU À0ĥéĦµF’$ÔPïêßÏ ßM"É/4Á™8bF%‡PM Ümµ„ÄwìGş[Y–™,ËÊ0 {œóĞ‹ŝî‘‘G8?q€1օ ‚Ğ, Ġ&‘ÊÎzér0”.G°ÔZWZëB)U(ÊŞŞ ·njvĉjô…v“ßfJµnÊsθm·Û‹­Vk%Š˘£ažÒ ÛT9BD‘D¨*;GĊ„q„4ĵ÷Ü×]LŬ… *Àʲ4.A#!˘Zk-ÜâœwcéúLCƒË ÔZk5zsĠŽRJUUUİ ´ıÌBDğÉsíN§³jµ–â8>†á‰îüÒŭO}ñŸ?Ġ>ü‰•ĵÁġ“7°zc`g½”´²÷³qóEŒÛ-Ż2°ÒċŻ}_=vßÜËKó­gÓ4}+I’K½^ou0l%I’ÏHFğĤ ż6žÂ>O°˙ [|BâNâh^I›q狣ğ.ŬQ£WYŒÛ™4<ĜÑBçœqğt'`ŒEgVżù£ìà!-D›…K€” Sí £ÚFŬK•Si]A( ™F™Q(žùì ĊÌï…Żŝ?;šŒħI¤4i's›IF“\°H0„œCJFĈċ¤:Öüqڒ1ħ—*4ç0×C˘Á` ˆ(uÙJJÙB„:âĈĉnTÏsĠòšRJ+LUUĤ6 ÔŸ@@³V;Ӛĝc‰(Ž Óé´:Î\ğŬ>ÇñJ†Ç‚ 8ùèŻ}éÉ>ñċû^½b‚ĝë·Ê›6U+Ue*;êÖ [2’€ òèúwÉ~‘=ŝèħgCAu•~żżZÖĥtŒO^˜5@•vıOìßŭİż²VL&|…t›Yħ3èÛÒŞÏħğÛÒŬ¤'Í'鑊 ĈĉL…˘/„XċœœóàÁov_<ĝ‡Ÿİ pÑ ‹û:4;_ħ[iĠ`4G3• ñ}żuJ“ŝbôú7†Ï fħ1†”ô„*iĴcm­É@0ĉ˘­ÙŽuħî[p;d†‰8·\ ğxRJ™,Ë´RŞJӔ‚ ¨Ü#ÁDĉˆc µ1­5#›`kê÷×ŭ¨~‡Y˙ŬµÛí¸ŬnwÛíöbÇËQ ‚àĜá“=òÔ˙ô›zeîĞ?XĊ3/Ĵ#í§iŞœµ´3FnŬ8cdh ƒ7@Wż…CáġG;ù­Ê7ƒôB’$ô…1AİÓ*˘YגO61<ñŸÉı|ì™ï!Ŭ{¨Ŭt5ĥûHäƒŜcénR’ö¸C|(Ŭ9“CYÇ qÎ%c,œbÒÊ˘Òıèò  kO£•żìĦżèÄâù4MßMÓôJżßż1 6“$Éj'Ŭ„ċz³Ĝş÷hbh’‘pġŝ”ö‡d§ÈêksÓXރŜ+énÜĦcĤä£ÄÄ´ÖUžç`Œq'IÎy0Ï_ Î n½fLAĤŒŬIӌ‰rçÍfR‚(pż" İ’”Gœ|äwÎ ~yŭ§_eîoaœsËNœ'XQĠ„Ûċ6ẉAÀ”Û×ċ, ÖiL@mwö×۝İfGIu·ŸfµË'|ÏŬ2˙h‚K˘œsH)…[³.8ŽZí(Šĉ£(:†á²”òp·ŽŸ{ê÷żïc_i„x§eŝí–,p“mğQ q­V+Œ˘¨Ġjµ:Ȧa¸†á’”òPÔêœ8÷äï>vúÜożÚ“ÑüŜ~òò’¤°Ħ°Ue+ £;Óµ_˜°y{2´·âèúӐ½ŸUçÎxuyñϊ"ğeÙċÁ`°š$ÉfI×0/Œ#œYœt{&#""ñÄ_YÒdlÂġ„'¤{éŠŬێĞ÷·ĝŝÑ{!ŬĉĤ^֍VI²†ÄäLHÓ4s‹pkÄQüDVâßJl™Ç‡`íŻĴĤ˘mb2Û=%‘MDıBßÍİ͟ùµc<Œ˙hġé˙“;2âŽ9çĵ? XY–Zİa M!£q•àŽ ‰ğD"Ò6Ħ^›Ñ§AĠc9LlËÑt[ĤšBJğIw˜xҔ‹’Y¤C%!)% PĈq,[­VÔjµâ(Š:avÂ0œ‚`QJı$\™[\9ùĜŻéħ#|ú…Jŝ§ïŻgݣ߷+3ˆ4Pı :07ä ë˘Üî¤ bÀä ġŸ˙GZkk}üĝs0ê$I.iz-I’µ~żß˲,‰š–GwĞħ@ɨ~>lËtîéĥOĥŭÓCÚñn“‘Ż‘ŜRš$ í6Ÿ4V3Ĉ@)Ċœœ;˘àä)ö§‹Ċ ›_`Á2˜ Ĥa”şÉ†@l +ßÁngħcv§B÷èÇÉßúó?şòżü[W%IGH\1 E–eÌ-ü›FH|Iħí˙²z…%!CPÚ Ş JmêHd42|*ÛiDB.6ĤɳüÌħ$ä*˘¸Ġjµƒ è„a8†á‚”rQJı$„X9ñÀ=ĜgOÍ9·üúċœ˙Í7â…76‘ç5ı9"­£Üŭ(ĴcpuKġ]„ıŝ4˘äùò‘ûĵ4ìWE‘_̲ìJšĤĞI’l%IÒŻ—ş é1@{ħvÏNF°IÖĉíĵ'Ġ^²ğ÷`ĉ…ÚÔP÷ş‰îÚ¤ğǞúIf‚ä5ĥJŞ+²,kk6w7Áò§ċ+ â·ú†wY´lmŝŒ5fÒ°½›ÀVRm+¸ŒPÖİd €ş‡>zÌüë?Í˙­ pĥóZÊëQžçınR“l&ıÏvŝż!YĞ´6@ •2(*ƒ˘Ò(+Ŭ¸·ŒsŬñgÜ3z›´qRŠĝÔUÎ,BaŠ „”RDQ$£( ˘(ŠÂ0lı[7‚ş: „8¸tèÔİ>ŝğŭ*Ž^|ğ‡Ÿüĝ]ĵñÎ&”6Žˆ Ġ:0€Ù´rpi‹LéúEċĤíŬx†N(?ĝİgŜN’är–eד$Y ½4MÓz‡Ñ˜Şh é òÜ-“Ñî&·v÷ïżÉ˙}P!a{³eŭ° f+u/Ù½§ü„Éŭ$`|ŜŬ¸*iGäÜàİ•ĵĝ˜b?^êŠßLZ,Xrߕ n)Óì+9R2ĈÚ­ÀP ­4cĈ`~îèü™?ĝ×_~÷ï˙טm^ kC…BrÎ{ƒÁ OÓT•eiĈTxĵñoŭöŽY$k^ (m·T•ĥdT*•A^6îÀhğ{èî>N{ŭšq•ÑRŞç„8çpÄ£( ‚ aaFaFA´‚ èH);AÌ !!–ÚŬĊ#>ŝ›=q˙'óÎħı7. ­ooâċwúĜêç.[ÙY"ÀVCn:*&LĀ .€6_­ŝĕŜG>öB+ZxÈÓËyž_KÓôF’$[iš’$É]Ud&ĴĜĞżŽ_½ùĤ€Q6âÇh7Ğeĥ×Ĥ3ncY8lE$ûPpbÔ´ú#´Š×òœ^~àSϗeyi0HŻĉy~#I’Á`OÓ´Ù+Ú+íĊĵ°G2j|J-ÛíS2Ú„¤i‡˙ÇÔĞÌ5ÀŬMŜc<)Mş˘žfr¸éQm“›QBŭ3jĞvàçèÇìEàÓEL1k­Ĝ֚Œê]ö ­=Í5*EîĤÑ 9ŠÒ (4²BaiŭüżüÌÚÏ:żñÚ[Œħ˜1sÎŻqÎ7…)ç\E½t!í(uÒ0ĤNk[!Ħ,+[UÚVG!_Ĉ@+ëğÛ€” °6s IßŬĠŞ´AD˘†´ċP -‚F&aèÖÔGBˆĥ˘Í9ï!ĉ8ç‹s‹‡|ñ3GÎ>ĥ2ìÜzÊäOßìgß} ï\J`´²ÛZŬmè‰×J F\XÚÈĈŬZñ fpfíYÈÁĞêì‘ÖĊÓÇO˙Tİêr’$W³,[MÓt#I’^–e‰ÛJÛĴŠÌĞ˘Y·½ŜĠŸP“P}ÑBwb$ÀÒŻ°Cš4'—íeğ÷š”v‹&0é}Zk”eÉĴjÇìÖ+ĈXÀ9<ƒùt³x`!L^Ùéûúj’ĥŭJĴġrd*@7–h—ĥJ‰s‰,7X\ŒÄâÇŝÙǢùCŭôëß✷8çç<Bl !Œħ2Ïs£ġP/%#€×¤D hmP R(•AQjRĤA[ĥ÷É·™kw­V‹·Z-Çq†aEQÈ „l/ğ5çµ%&ĞZÊ ]ö`èŜ]UğW-Îy›16מ;°|ôì£'½ïàʉ. Zj_Ŭ(ñìÛ}ĵôŭK¸p5AQ8YĠÉr c7SsÙŝ;׉3èÔ{zí9„éùêÌÑΝ|žŒş˜Ĥɵ<ÏŻgYĥ‘ĤiÏ-ÑËê]LŞ˘½ÜĈÉs£iĉ·HFÎÔ`\¸ÉÔàmß÷h…Ä\P²­Ž†cÍŝĵŠĝġ“&5ɛâiŜŽıŞŞjĝIۏĞ#ççŸÎµŠ)> ˘t’îHqĉbc’¤B^tbv — qİ‘d%i›-ŭÜİ_<ġ<ŭożĜV›1ÖB\‘RI)“~żŸçyn”RdŒ'ß I• ĦÒ !”ŠP”ĥo” G91§ÚĠRÔŬ{€‚ àNGÌÏχívğÇñœ”²ë*™˜1Œ1NDÒ’t·€12ĈjY3fŒµ8çcĴĠê..,tôO>qèè鏋°uXkĠad˘îâJ2–¤ „`è.ŠÁ†‘ˆşâ4×XëWĜĜ*ĉ†Âċ×3\ĵŝ6{%ŠÜZ°‰9r%€T ²q ./İÚ>TiğOBΔ!l"‡ŭ…Z‚Ş5Úóë?C×\IÏ_zûÈÊé—ŞŞşš$ɍ˘(Öò<ß̲Ĵ—eYšeYîÖW "˘]HGOèÍê˘››435.ĵ‡ÛU´'¤{Ô´}Á°C˘ŭˆûA#%`şÉĦùönƒ³cċğĉÏíôhû§ĉ¤ütŞĞ‹ħ`ĈĜٕI;Ž 2@–)dH+$­iIHÒ?zú?zòËWžùÏpħ „¸ \ p=‚4I’"Ë2UUêÛ’!UÙQ^d†r.ş'“1ĥ÷u—%—Šş!ÔgŸü§Ö^>ufu³@Q(€RckKAU†€ôíëŭIŜC?żŽ­AıM(Úŝ&Piûwd3BàĥŞ•Z]ïİŻ& $ˆIXcß^#.êúçaÖ~ĵIË­˘wòÄòÛ+Kg^ŞŞj5I’Ġ˘(Ö Ĉ‘݈f!$şE"š"ğg2Ú>èn–íwä°W2LJ ç€ërΗ_x§żüüU\¸´eŞtuĞħk2À,Ħ×qFĤaI×.™ĵž"mwġÔd\ş€ÖÛÁħuAÌıÛGÄl5Äċĥ<Ç4¨zW ÍW0'ûÉѕîġc~Mpş\UĠÚ`0XÏó|³(ŠÍ4Mûyžğ´ŸĵpÊ\Sš£=ÒĴDtgûE_Pf'1ĉ%ğ{ÍQ)@ĈÜDPï?aïÎğY$nê)‘…éé‡[ż,Ï'ùçVÍ#K<>ĈC0&` w†ĈZtjˆgÚmžUà† ½Y’c+W¸Ñë„'ï˙/?vìĝǏ]˙ÉxVˆw‚ ¸†áZE[a&UU™ b¸íĞÊä!K+dš;mFĊgm– |ß12Ú1çċ†W%ç<ĉœÏtHE ”ÖP`Ê˘öŞŒTʅ}™í·w0k½“Ĵt2m“˜.ÖË="ÈXyґ ”]mĵ½ùÂòZuò`|ĝıċó­èÀğZ덲Ì6ÒŞÚ,˲—çy/ÏóAP–e9…ˆf!$ÂìĤ…;ß/šHFŞ™ê°XŸÔpoyׄ;Zm<Ŝoén)90c‰ÍR)c¨MDúŝÖË*ÌĠg/*}„wŽƒñxh\µ´´]-íLw°+mµë{TŠaóFƒA‰ë)N>{ìç˙§/Ş7q~ŭġ>/ĵÁjEeYfBˆHJÙáœÇFkž—Ye@ÚìĴŒFžZ†–âN\Pħ  œ !€ 1`´ÊÒċÂ9ƒ-P-ĥM[z}żħ†lá–f‚ö5É­nçĞĴY!Œ.€b Ôzíˆü’><Í£§ĵğĵpúĵÖz½ŞŞÁ ÛĴŞŞWEż(Š$Ïó4w(Š˘ŞWİO "ÚC%´WyîÎö‹&>’l§$ä%ğ{—ŒÈ Ä0éÉè%ĉ v’\ïEĈĞI‰ˆDdŒ1šˆ é­×TÀŞ_;Q§X÷ƒlÛJ@ˆó-ŒnZBë~ ÙéÌ+*ĴßĜÚÊpmİ>pê?|úÁßħ „ Jk¨úwlÍÊhÛÉ&ĝÈjóےéš’3YĉfŒ8IĈ€ŞÒŽŞœéÀYŻQKu̓Ñŭ˜şúáܚG +8y”ÉÀ] É&Aù(ı½ġ¨÷½^-͉ŝÊáıЇ–ŸéUÔF’$›eYöʲìE1(Š"-Š˘p$T–eİL3íáíq3EğItwžŒví۔†ŭAHuŞÛù:ĴɈ´ñĴpï‘Ò´ƒ³~ÀĝRšĝcŞŞ²}[-,3i"҇èÍ* ‹'^ßLBû4gáqW­T…êŒÍeÚYÏ)íÂ\5”f¸şšb½_áÂJğsß˙â“Ç:fŭ—_-[żtÙSqÎ[RÊğ&…ì§Ñ#R3픠;èi*}ğĈ†qá§Ĵñ¸ÔĤġYk3ĈşÜŒĥĠ;ƒ=9òöêY)!ìFV)ÁˆqkíĥĞÁ™ŝİÖaÖß%ï Ŝ²kXŒM˙ÀB{ës—ĉğ§.h­·´Ö[y–ôŞŞêUU5pĠPZE–çyéH¨Òz¨Êé)rÚn2Ŭ8InV÷ÜŬ3/Œ“ìjÇ0³Sc?î Ĝ7R-ÓíÌ,&ßCş7IiT›FJ{ş˘ZSQ;¤;cŒ6Ĉ” tħ|,Lû/on}ĵš˙HÈÛÇÜ4·ÁÉZıù³MF;Ž÷|ÒjX1xû˘ÂġµÇV/=üÙżxêHúêĉĈ+ßYËnĵ`Ğŭ5nżkĤÜ|Ĵ‘nYŽ›9;HÉeìcŒ"˘uÌ`BÂÙhš3@íż_r;ädE£xıÍĴ¨\×`ÒËĥ”\P[jĦ#’…ıöàÀ‰ĝú…@fËÓWJġƒÁ@)5¨Ş*)Ë2u$TWCRJ¸ċèˆh7In·¤…÷V˘kVHµ‘¤6ċ0qs•í é8èŒ}Q×½>&ìĠ)Ĉ˜Oü7IišóùBż%÷Ë#cŒĠîì!ĤŒ1ŞŬ6ĊqÙ{eĞ˙TO›cñq°°ċÌ ÌċĤa;éĤ£‡ĥ+Îlò´s£%U…óƒ×Ö ~âà‰Gžĝ–›Ġ´ĵĝÌZĈĴŠŒjÑ8—”[àâÖĜpëgÛ$‡]]A’ëıĈ˜ˆ•€ 1½ĊÌvßœĠTÒ PĴƒòu˜b Tn€² |(6‰ŞìĥdÖíÄY÷@¸9w˘s}½xŬ“c­u’gi˘”J”RiY–™R*+Ë2/ËrhĠ.Š˘ĴŞJ)šr0Ŭd`fĝw7ÇÜ^Ş˘ğKFMÔنġ^$ĝ9¤{ñ” TÑ6ùÔÏ íK¤{ıBJÓ,áğ>¨ĈTU5”¤1UZë²cLq..ïdùŻ_VĊa6 ó ŬÌKċbkFbÓÇ\ċìÌn!œ1 ½µ>^îxóbçÂöGNüv{eNbŭB{´‘­×ĠÈm8eL€*+Ë4×XÜfµ4üĵŞŞÈEç¤Zëg_íçëW~ “]ntù(·@:ʁ%"]şD'’YHĠŽEÑnEi°È³n+ĜèĥŽĴKÁúĈ˜Ü“cr­U:ıÖ:ÓZgJİĵŞŞĵŞŞĵ,Ë²ŞŞĵ(ŠŞ^^U•ÒZ;Ċu×jhR…3K4éí&éa–Şè’QŬÇĞ÷Ġ ûûF²c’4ıġċ6dĠĵËîŜ–în‡”Ĥ‘“=öm@iš’ÖšŒ1Jk­Œ11Ĥ8ż›Î™üSoĴġ0ó÷sĜoFŭv8ĞÓì &[àè톽‚\HPQ /€ ƒ ŻöíW8×&„Ĥ5­ĵwġyËʲ$'‡ġ…×çòï?Ŭ1o)‚tNŜb BlÌB7Ŝ"&$­Hö‰HQED•1ĤĴ˙5Ĉe‘ċ™Ö1ĤÔZçZëR)U(ÊŞŞ T”*,UŞıžM šQ˘ğ"še¸ġŭĞŠ\Ġ jĜ÷q>瞐ĜÈVûNi¨ù{Bú€“Ò´­³ğ’”[‡>48¸•Jk](Š…ĥÉ>ë/­­˘è~$BçXYó‚R։§T#‘m“G#ĴuGċ¤ŞíŒE"—nÔIuœı/d„şzŽ ħ›dG{İw(ŬĈP’$”r`ġpüâ_‚e!ZóÚ°v½8]š$)”ëÉi"R ’Wî~­´Ö•#žJ)Ui­kâÑî}Zkmŭ ÌH³VG³ĵ/DôŜWE“êzëñ>ŬóöÁï!Ñp=çĥìQÛġ}J~ шĦYf1"ߑsÁ]kTiŒÉZ-}"ÎÖÏ÷×ízġè2:gÀ‚0X"ĦadŸU4)ċı_qÄĞP›%†Ÿhh‰ÑË·{·R“ì½tN6V–NӴ✧ZkĤ”RAlıuADM·"cÈYÛÈ* –T´Ö°Ò:A[)UżŸjG\ŭ}Ĥŝ{%£½Ï^ˆï{U4­ZĵËîŜeúµ^Ï#ıĞKòïŭBJlD£ÉiHPZkäyNCż°=0KTŜÖ:½?.{KĤxüġµĞ˜ıJÖ=Tl;Ún-ݝĉu³óy8üï()Ñ™#÷c6ĉÈhwħ[9ü&I™6„B)Êó\ȋ˘ (ŠJÎù@J¸s×+5”R5‘£@Z£&yG:·]ïgÜÁ>ííŬˆ·H:ğ­§dı÷İ*yè˜Ĝžö.ğ{T²k\xô Žŭ™÷ô!–ïš—…Í9I‡ˆ'UUUEġİi{èUċúé|K>ĠÊĵĥq퓛Ċıĝ ˜èÚ]Eġh™X£r˘›³éF/˜núeĈX9ßy5ĵûÙG{ñ†qMJ)ĴÔÄ9§ ċÜn@”.–Ġ¤¤µfuĊ´­²µ”Ó ˙îJšDFÓÈfV·Ü=*ÏŬôDÙ^_Ŝü•|t= Óh; Ë8÷Cħû“”šÒ]“œ°Ë•Œ1T–!"¤;ċšî™R*iµT˙‘NşĤöħ7.ĵsżY|4`óg€@‚ħT“Òp9ŽĤ“M¨Œvüe0ewŝlo@­’ĈÍ셸¨ILTY–n@ €ÂÈÜ17Œ!£‰?g—ʨI8Ĝ…„ö*}p‰hô×blß÷Ä?ĝ=$E@í¤!#&¸uŜyìWRšĉÀ£)o Ĝdr=­”ÒUU•ÎŽœVUĠŸĞ­'òwŜŜZŭ䕍£ùÁÇo‚ÀVKn€Ö.{u’ŠiœĞ£çXl5é|Ğ­ċ\€4ÙïÙürĈh‚|7J=lلV">w!ÓÍ(ğ‘Á{qŒDt’ĥĞ#Ĉvö}–Ŭ=ášÌNĤcNò¨³Àü`쇎”h—Qì8ŝíĵR=@ĞjR*Ë2İŞŞ×jݍ³èúI^ŬŝĈĠ‡×‡ˆGÀeân=ƒĥIÖ]Klg6ŬŽ"iüû·“ħ6Aŭ›hÊß8­jšôùÍ}£„Ô$#ŜĝÛCu´Ûï·ˆ‡Ĥâƒˆv^l'5ìS2Ú97w½f½?Ŭ'ž”f&%6á0VF£o79]¤ ‹´,ËAĞĠڊ˘rŭá…ĝbßĵôë—Ŝz(ë~´Í? ÄÀ+k')1ì[êz-wóo3“BÖ°”³†?´qAĠ¨Žf%'ìBPӒÖiD£1„4J^ğUG·CHÀ­Érl"jbHFzğrò„tÁ8 Đ•èŒ Z%‚1>ËîCDJÍCtZċ@cHIh:Ä´kĝ—eYfyžÚíöVY–›q\}r){kµĝÙı·Ŝ~étÑ} âK€GË`NĤJÈÍħĈÜRŬw2#U£‘sßUJB¸@íĦTGHi–ʐM!Q2g#÷9Û2ş*éVͳŬnÒ탈kIvĵdwïa{q"†?.µñĜǤ4JBfJ1êĵğ‰”ùwÚĊĜTnċNÚn·û­Vk£Ġj­-„ċêS‡òCĞÙŻıî‹'’d›/ŸkkG`Yóƒ!Èĉ™íˆĦĦĴWK{D6!D‚sòž[£acDDğ[•i—ŞŞ£QBšDD³Ò^ìŜğÍĝŭö=îŝz{OH·urÙ>iÒÌĉÚjĵl<#ísRjìŜ1@[ÛÂù„Csœ|WïbⵯN™vaŸı[ ×oµZq__kW‚•zëËW_?}£è,ÜΗkD Ĥ\ìİ3ìêÔ.z}ÎrWqP9Ĵ Ş1ß3ĞT5zO[!ÏÇÈrl™n·ê·@@³|înd„]ÈĝƒEDê¨n*î_RÚiߌÛ,vÖ.cŒù¤†Ÿ|g&\ÑOşâĉ£Ò(AĠĤµÖŽ” GJ½8Ž78^˘èZ†—\ ^|§+7’Ï^ĝùĦÍBvMë°à €-ÜÖZxTÚѨ]‚iË|Î\ċÄÈLKAÑÀ“cŞZş›rcĈCÈÛL ˘YŞ£iâĴ3+ í˙jhûwä´IoÉzBş÷$;û4%—èï’† ‰ô!#QrwˆN:üĝHµ4|ğÑ_ReY–yžçQq÷â8^x. ù ƒà̓‡ċĵ”|~+_=‘\9²q;s[E!Ĉ‹€m°Ö2 ÛÔ;m¤Rè|ĞTJmşTîRk­pkVçiuÚŬŠT‡]¤3ÂôğBBh"jŝI;ŝ6ċúÂÒûMI‹[Ŭ²ál3´_Ŭ‘ž”n~ÌBL4"ÍaB%F>—uRŽÑZk]UU]-ea˘(êEQ´EQ; v])e7ò­cs²{rQĥÁX§ŸİÎo½T-2ŭ–èŞlDŒ1[è* Q&ÂĝBUéëeYö˲,´ÖÛ;}€ÙMÓd´_D·HFÓc·÷ïöy÷}ND£’]CQŬ‘ ï 鞂QĈÑÎ mWKû†”lU<³Ùa´ŻÔüşfşƒ݈šD$FezYœ›[ŞŠ˘(Ò4M0„Q†q­0 c!D+‚–" „ˆ8x°Òċc‡ĉBÎ9gxCŽ+Ü"ğÍŞŞn$Iv-˲­˘(r—Ĵ0ËÓIDÁ0vÓbšFD·Ò?šġ}ž„v•ƒ°Ż×O°÷òñc{ĵ#żò•ŻĝSĜc,öµŻk²Oê}4‡;Gßĉ¸9&§&">ës.c‚sΔ2h HA!áà†q·$Ë3*cLĦµNŞŞêçy•eY’$É MÓ˘,ËÊ)|Íjİy›ĉ›ċ>ğ•Êh7 [ĝĝL$ô•Ż|ċCЃ|ġĞ_ġ’‡ÇûŻ|ċ+Ô q•Ò8Ó˙,Ĥ6ĤJÚġĉŞ&µĉuĠÄ9ç5ùX.‚ !˜‚3 BvÎÈPnċzݵ.Š˘ÈŠ˘ÈëEv˜Ŝ7Â)oén´ŠşÓ„´Wò$ô!‚'$ŭHJ£‡jó|Ìç „ÔŒ×™FHlôm—”Í•bœÛL+!„ !@œsbŒĠĠ‘qsGš1Ĥ1•RŞ&(5ÒCşSÍ@* ·à:s…3 yò„äáñA$%`òĵÒhvS d4œF iTdneCŭï$óAM2MÒэ5&§\ïµê˜FڈiŻDD·ûıž€ž<>Ô¤„ŞIs8|Ì׎JMjÇîêI³CfBµ4ÎI7ú}Ĥ’˜jòv* ™ĞWYpOÛ=>‹İnŝğëäċq eè>ğò’Ç~½âĉŜÈ´ĜĦfµ4§1y-è˙O²—OZh·›Éa MސfrÍp˙yxxBò¸ƒ¤Ü,ÑÑ. C2ÀÎôŜĝĜèû€Ùvь•½‘‡‡'$÷ıZÚíkĤ™FФ&9íuİŬ8’1H ĜŬUç‰É’‡Ç¨ZG2ӈiÜ˙O 'ĊޤIĞ fß°êIÈ’‡Ç> &ìR9&'b#§YÈhVRš&Óy"ò„äáħˆišŭy1aLĠ„ȈM!YV7ÌÒ3ò}$OHû ZÚíGbúKğÑ^*%`ö•Ŭž€<UÓ$°;\µì•¨<<)$Ï!ĝ(’O‹ˆO Í(V‘ߵĥßğÖ”^˘ ´ĉŽV|‡œ·´â. ßÖ#ÖŒ­á' †a}€†_z÷çE‹UZ|T´ùi!ĝŠ<´…Ĥ%b‘!IAÌ0M­èMŒR’ MĤ mò;jÂ7Hı‹Ĥ‹²` H- ĝ@ Öŭòö’ĥèp…61?-#~R$|X¤D"5&)cûhi.Âż=k)sÑYy[+Â@hµÌP ŝD§üoëßħ`x`P„ÂşgoXĉ –ĝ‚hñHÉ_ŒöıÂÈ·hÛKÇ|ä9óS´AĴĜÇ­Ì`c ™Ÿ:Ġ·÷{2JLbŜÒż§Fü.ŜF3´`0A„uš/ÖxYtĝ)ĝ11ĉÉh‰5zyÄ9çíġs]´›=ĵVhZ²d BZ0ĠŬ7  öím *už‰|OeüK=àwQl Ԁ @ ĴE _Òkü€\◅ĉ r—™[£żh.ÑċÒĝ ƒ·FŽòèjĤ˙BÖ ŜÉÑĥQşòMPğ † sPkhĠfSeü }Ào ĜµĴ`䁁 Ğ_%?Íä˙Pĉü¨ìҖÚúEˆ˜‹8WzryFNÍË—GxoŞáD‰Ë×cÈ·!_7Ġ•‚î óevUÊŻë>żƒĉš!‚Q„ġj5W/çIĝùh—sBZ=i/WJO_½GכŒ}!ñï@ U‹ĉŭè!d· że@Ag Úè|™ÛjÂ?Ó~A‚Ĥg`D 'ù²ìO£ž“„hCüDOÏ?·Ë£—ó½ċñ }N4ħü×V]Èï@úž 2PÈrĝš:àW€ `M7„iÚ/:\‘çùŸeĈÏÈmO? ÑSeÜ=eÈñ4/îsż—^œßdĝrÊï{ŝZ¨Q€ƒjÖÔ>¤× ğfEd+ìĉüow-èVĜ@²˘p> ÉUrñƒ|Qž˙ˆĝ÷ä(ZƒÖGĦġq—1uzş4tYƒŽljŻe ]´A˜Û˘UŝNĥ@,ÙûbïÒŜ'Ûĉ5eğûŠÇyL£xŽ=S„0ÜEڟî=Ż@ü„)ɀˆËrż %2€ ´5‰ <\sŻV€‡Ìës•\ŝ,;jñÏZ› °Ĵ z ˘'Ìké>CŠŸÓÖHĜ@“"h4 ä<œñŝU2ù³ü²„żoqNt ~Úßgb}{úW ߟ3Tçí Żì@\3rK5vàEq‰½ÇD%ày}YPŜ“óŝĊï$mßğö>ϒ mäš 9@Hĝ¨^Ep˜XèHxX?‘?Ë?’š˙2ŜĦ#ÏAëEcü"ĥĈ"KôKñĈûG—¤Vs´„ĥ1jĜ÷@·Kcמák(3^X? هL ħT,Ğ^Ġ#n—ÁŽS£È à—ü~Q¤|HRÎíÓIy’W&ôĝßİ5ĉ8°ĈSë,òŝ÷ÁÈç­ĤżS¸àŒ²c½çĂFÛ‚tlzPÚh&1íѓfŜ ĜBÈe>’kΗ\@r€ĤM}âpX÷vî†Cpô"ñ3bB$:vXç9Ş:a:Ġ×iíŬ öÀÁŭöûġĊŝöŠ÷Ñö>cÌt7cğvżĴö€İ ˆĜgÄĊŻÑ\Bħ†ĤS„­Ż†50€Ó@˙5Ğž!í´^ß{7ôÔ } ÚïOŭi3=úkQƒ?B*°²Ô!ġEÁÌóöžÈ§RúÚkğ 6`ÇĜcH ˘ÙéÇm9-ıÄŞß. Xöí3 p*ĝÓ²8ÇWDÎ"/§ĝ:j[ġvéÑñX€ğßËÇĠoFĊ˜ċ‘ŜûÂϟ*6²ÜG×ë,è¸ Y°ú€Ó ŠÏĉ~—•ğÏÏC ´8‡fÁše­òŻ`é?DtDÌEB,¤5ŝĤ‡wâÑaé{cĉ˙,£½ÇP@ˆš1{÷K$ŞiNxí=Qjz´Ïâá^ÊCħBÒA³‚`,À>"€@€ÓÁ:ž,è˙ŠW0#ĞqĵߨS°?&ŽçPŭżçôboßGŸ÷7Ü.ATïQ |ƒ— Pp¨Y0çmo„‘ÓFšuËÀ‡a˘œ F[H>ìúò›ŒÜñ* ?ġn>Ÿ’â‹ä1¨AŬK$B“‹Ôž4ñ¸çİHÏĤ›•´²MQ0ŠRtŸWž·FE"ĉ:ç0t•= €Ä?³Z–šÚşbNúbf>žáÇÓĈ^àˆĴ†ÂĊ×ŝ& ˘Ù ċ=˙YÏġòĦuиEŽş˙¸€è#ÄêaS6}ü%ëNċò=‘oüġSĥVDƒÑğÜ}<ç+‘È™Ŝ}Ì3î:…?î2[ŭ)Cŭmğ_E˜lۙˆöĜh šÚêzìiVPÍ'µ·€ Ài\˘žÚ“4Ё³Na7£Nûçù"ž?:Â×+‰ĤÊÀ"3`é‡RHrİʔĤ'öUvö@'œ™ÎÒòğââi(~WÏĜ“^"‰‰ÁxÂÚ,£‡xyD:ïkġ×Ö éÀyχ„„˜˜\&EŞÏi@Y6ÍӍ p&ޤßç—Áb„Aż dĠóûd°óÔ|gĵ³Œù¨€gE?j&[P6HròbrQñ灠ĤĤ¸)œ™ÎLàjٕ×Óˆz˜ÀtHP‰›9ĵ¨‰ĉύù½LƒÒ‡ÇŭrFÙqê€àŜğÒħˆIeVĤüê5ül €SoùeàĞĤúé+ŬuKŭù˙|žċíġìòžyEêÏġĦ|ß1 eÊġ|ÑO–Œ ĴÁëÄ„*†ŽŠp˘8K‘ I\*°ÒêJU˜Ş÷ŻÑGŻÀ,š~¸DÑĴô7ĊîM ³H†À½KĦ°ĝLşE&²"ß_9VY­s0óv"ÊĉÄaxKkR ëH.ûċ½Ú Ú|‹ŸQ³gŸeĝ³Œ}Qp‘ßÍ‹ŒÌG‰ŠœĴ"ĉRÍĴ€ĴgNАTQïŻ €A€S…dÀÄġ´ŜŬ;²ó&úĝÔżnüÙhGUüĊ Òş9ˆ9b¤ı÷ğU–¤Ş­À.D¨ĵ´żœî%ësꞭħÓÍ„˙S,@LúQ[›T̈fôœÇE•ÇĝżóŸ““Uŝà„ÒBôÙR-< +Ài_fˋĤn@ĵµB ú/Èç7vk‡Xè÷‹4 ıĝŜ÷öî§n``ʛ³(ĞôI8ĦŻPü=1°R˘àS˙°cp€SbĝĠíĥêĵê°ĵfĦş…@–öV °ˆaËrĦ‡Â48ˆELfù}LLâ’ŭŝ.Â5Ê_´7uK†ĝ?À)Ԋ˙땀uµż)ßïèż¨Ô<Ż_7ĝ {'ı÷WòƒĜ&ĝX5=¤Â< !àÔ/QúŠ“™i- 8âñ´mŭ„ŭÍ<Ï;/}wòUš•3Ŝ>^žèR€qCÑOˆ˙œ5¨lúQ‹cëS€\ŝßċŭeú ï˙£ñEB†Ċĵùìv{5—){RE(ÂĥÇ:F£ÈIi‰˜4ÎŞÍAŜqİğÎĒ =ìµ ÀJšPPİŭ0Gêġ÷44: rM=NÙz?áġ˜ûóâ= òˆjh¤·€ğ‡¨?ÀÂ(cš‡ƒĜ‹ëù—^ÊÏ˙a†(fù͘{\ShħXE!HŞU`€ŻĜDÄm#–L×K4 J ëžĥakéš×Ż×¨Ú0Ïh̸­xÊȎbü²˜ÉSÍ*܋& yyĦˆ$šúŒÓ‘Ċħ¨Ä˙Mġapĉ€/ĤUĤ^,äùÁ˅<úaáĴ̂Y‘Mé şħpv¨à‡ı7u\MRú•íԃá83Kx=ŝM-^mğ°Ŭ‘nMu˙Ġ=°ŝó0ƒ›gˆġVayÄĈş”ŝ^żúŻy`Hä…˘2E¨’ĴĊĝ˘V,V€³u$ëŬ€sê cM“{[‡Rí4YĈ|”ĝħ×*˄uqäµÑá‘möCż<¸ŜB€gKI™ĦˆÚĤġĉ_ùh-4ġgQ#—ǘ tĜ3T`Q„ â_9P IË(!쀌rj° ĈàŒ†ġT_ŭ„v)A7òۙ}“Ĝt}ĥú/Ž‹Áìb^Aò:#4ÊìPÖIµ*ݚl ÀY³˙#ż§ö° ïĜŞ˙mѕŭDsZm§K€ŭ€G5öòŭÇ ED\DN™ ÈÈì!ŠÑä(‘A}ß,E‡fàgÁûOíĜ ¸ĤŸĤ9~NĞöˆ…ĵş8ĉTàúßvŝû^ÀÁP˙Ü'eġŒ‰Ş4ıÇĉR•;úàÌjġŬ€İ@½ŝ_H"ëñ]Ü/kĈżH°µÇ˙(Ñ B_Ö(rŠĜÛİÛŬ'´*!B6Ġ·[4B UŬ9H6€kXÎJ0µÛό]€êq"§eâû†/ŽTˆsüJÀyž½ùu#bZsـKŝiŻÔÙe=„6×uC‡ ´€°œk;×ĵżË˙Gĥï?ĥâŸ@Òfİ1ĥo2èzm€_fÛÄê{Ì. ŞÎÜ_ûP•ŽÀ&Á2#-_ݵJEċ³Ìퟕ!pft€ú]50h.ô™î1‹ĉÏŞlŒŞaç+–µ“¤ú™7ökşB0jèˆÈkC²’•¨¨„àÌ`€×ġWaġżr żô7*Œż.Ĉ A³Œŭ^çÈҌ‚²=½ ċħ£ dŜL€˜ĜŠ‹˘ "{oĤAŠ’Q¤\83ĞIÁö\|#.Ï-Ċ@ß}m>kGx›bŽPüt‘ûa` 9žäV,T[TeŠÎÊgÜÌ;/Žġ7ŝt'ĵ›X§ñ~:°İİGaÒïÑŜzù‘}óĤ˙L×%DĊ{Ġ P”} Ĥ7@@¨ŠIy9 EHR·@XΌáÓP ×=}\ôŝ;£‰< ˆm:p:ˆOÔĜëĴâ8ż›mZd6%èô€˜m€˜¸`…÷·ƒB\jPÄ*48Cñ}"g‘SŜ߉}MmÀbĉÜâHF½Hh ġáġ™H‡ĤÀ"Ígġşèk ޏ‚8ÎġoĜöʟŝĠ&Ġ)t]8ŠÑ7V꣏üšòèzİœŭ/lígÁĦ5yÙ TÖTÊn=îO rl ˙g2¨Ş:ûŻn¨Žŝ×·;ŠñW?ĜUƒgžċÍ£šן'uġġĝàPv˙ë"}9œž0÷¸†à,€@%•Ŝż^˙?[ÌІ³ĵü,êŜôš­KêŞĈX5t½ˆ¸’áX·HĊÄf˜>ë½î3M—Ż‚8‹:Lçü+Ĉ-Ĥ[‰ÀĝPŠż¨á‹cÔÌO/N­³„X·ĉ”ËJ6Àmâ7•@•…Ĝ?ÀY³ŝwÛ¸ĥ^ġVzĨóWB +4{–Š{Ş 3˙ymÚ$ÄÑz·I¨Ż4ħŸzPİ+Àİ_ÚóŝµŽżĜ‹ï[´+?Dm`=#0ËÛÏë¨ÉÑ#974hĤßìrŝ&ÀUšÏhµJ›W+²a*p€3ċù½và”kŜżj@ÑTîžñÏëŒïÓW8oó5Ĵ=’˘Á€…ĵ|cÇ~7Ċi0ŝ£<İ5XTÂĦĉ‰G]Äîè€3wgmúQñî m½bŽHvšŒßĵ¨½Ñ`üġéÇ%ġ*ŸEԍßİÂÙB€…ÖĞDĵÀŭù>‚ĞSaì4Œz€o´êÍçj£O=ï/uTñš§Áàg{ûéÙgÂjĊgÔìdàĜŽ s€hĞ Éìi˜•€r/oñµûèÔ^ĝĥ+ÏĵáĴ!é"9_‰s"¨Êġ.‚5ŻÚ{ê@ §˙šż †o0ċWN ۈ c9İŜŝûeĝ‡½7W÷ï§Uvş @ŜÀ’2²…ŻMĠcBó^MÇ9 xíáƒĝL˙’ĥeĠ1mëbĠÇĝÒŠÌšuB¤LÈ­5šù4ÁÔI[¤÷„l¨UúÛP |šŒ˙¨›‹˜v`;\Gä";äµUġë: ŭwN`ɕbFsÛ^äħυò|È-=ñ/Úg^@ó:)Ż“òŒê{WŽhÊżá&˙9 ·‰ÈìıœÀĦó7÷(ë˘ûbì÷Ëóġoj/Ż_ŸuW€Ôë!Ä&Ž:ÚşJÎ_Gy_ċËĵÌIe&ÀoñErncĈ€q‡|u×kHĥíÙ´laì¤RF9A„ä Ú\&ĉ°BӜZ1íħ\ÑO3ŭĉî|Ҁpž_žföĥ<ĞoaŬ1-ZGÓ\XfJÓMšŬΞFò‚KDĴ\İÒkg_D?ğ à ‚×l5­8AZĴâZ$HzÀ*£y‚ ˆLÇ\q’‹ú˜Ż¸ÈDöTğêîĊàNNàğ·ç—ŬÖ÷é%T%˙bR&ôÙ×ğ ĈÔ6e5à|i7âU ‚q"Ì€/"ˆÈÙ&˳‡…œeUˆE} DtˆyŒˆ¤ŭ²5ŭıGVĊ,(³NğFûAĈ÷÷ş HI(şì³£·è'=ò]È×AAĴp”jÀÈòĥ“äċjñ!4#4)Š.ŠžĠƒj£_<˜÷Ò_ı°ÁiÄĞĈpˆwQ³Ft‹J!Œ ?èĜŝƒ0~·!¨Ô’‰1¤Ç[ÜÑ7QÛ ş Çfo@QĥËcËâ>œ ‘ì#ÙG°„ĥââC²Î>¸_*–` XB°„ uè;İI)Ĥ‹}Ĝ†yĠxÚĝëC>ì!†˘Ï>ğlê;ì¨-Ô5úħġĦ^˙ż>OĠ'új IhÙĦÚÁ0ôÌÒ ²á….Îèñ¨Z q„Ù¸ÙgĴ[‡vùVŞ?OÈ3¤+öÙaƒ]½C_'ʸÛIİm<żˆ)î/6T9NCŭ³‘¨0ŝ¨²‰R€‡Ž|Rù%­M|ÊëéO;Í÷ë÷]Ú/Ñ }qÀ[tÙg¨ûLÛÉÀ1y;A$ĉ¨jŸ9÷ï?:àԂŠzÏçµÜËÒÇ3_T"GjyĉŒ?²œ=×#úĈۋ ĈŒHtR|Ș„dÊWĈ^7­ÖîiSOŝ;Öó)?4†(îËë [.L@] *yî­Cd„ÓN÷ë†?Ñcúâ€Ĝ§Ç>#FċçġF}ĠĎfG‰_üğ:·0c B/À)Zê~!*€…@è!Şô_,°çŜI˙aôc=dWlÓûtÙ/LÇjô˘_IP Úë<5€šHÁ@Žïç^€#œŸïòŠ%r61)ġ>‚ŽWbNJz(× N˘ IDATĊĞK2$9ÑĦ gj9@Sy¤ÓG£Ĵ8Y3üħEŸR҅R•gfċä(FäôÉé’ÓG3A“ĦÉ(ĤSiHÎ.Šrú(RËBp*ÀŒ˜Û³ûQ‘lڊ­ĜŽĦm>żŬĜœ>ûĠ99r!z)§›\‹ù‹ĦĉC™ÊKuBWìħ-6èÑ-âùè~ž&M:ÀŭfĈd쒲‰bœ>0A“Z@jˀ6è‡) 8›z1œÁ€iÒP È턐ä^ĠVÄ•mic AfC€cÒó&o”ğ˘x'1İN8°ß7üʋz]ÀqëĴF1!§GÎ.9(ö ĴèGqääTĜˆ€aÀ_îËpŭúĤICy§Qı7ġ~„êù˘’>‚¸ÔàŬïĊÀï§ñğ2e;lLyüœê7iG?àGÓÜ3Bs€bĊ6š9)ġI@ŝyDÀSĊ¤÷%݆/G’aŠKà£qbé£ŭĵ :ÎwT?×Cúl‰ğ첃ĥíğ§&Ĉ˙`ŜFncüÄzŝ9(D>U 7ĠÔùà€€[eH¤:w˘(QDhĞÌŻ[Àû˜–àù_ÜG݉˘§÷Ùì°ENFd[–¸šÓ¤ ĊĞ‹‚³-*hûbï’̳Ê˙}B€ù_?ħċ(Ŝßġ•E Ṳ˙²²ŬvÔ MƒÊĴô+÷ĥĊ:;b£ÈG§ċ럕ĵ߸dJ½Tqŭ0ĝ‡Nŝ¤, Ċ½U„߯aŸ‹Sö×Ċm†ô ­£<â+ÀcWGĠ°|°qċĵÁ Ú̸ĉ1˙?Ž2ïâŭ]ĥ¸#n0fDËÛbÛgθĥċxmà‘7ŝû8Ì7²Ĝz~ßĝ}ŻW€ .èw}#RÇ™D¤P¤L*nXxŜŬ,&­ıû҆Ŭ€ó{;ŜêD³NÈĝÍŜ÷]ŠÊîÀžji…-Ŭ•HşÏqƒ.ûĥc_^ßßW0ötiĦşÙQFG´iĦ^(`ne¤vşğ{aÀ)“š. J™P˜™ƒ êY·Ô‘ô=Lp V“'QöŒžZUŻC[ibfSˆm$’Ĝ7Ò/â}çġ]\ï{zIù\_ˆ‹ˆ+£Ĉk ҖÜ+‘{aLTĵ@Zì›Añğ””KdV(”ĊçÏ+ p( R5 8Žñ‡à0eG‹çvx”ï6ÍYßĞ@ngÌoʑ:b‰b‡;Ü`Ĉe–½/§UP}ßĝ[,YÏUŒ ‡§ŭ}üœ·ÎÉ @pÛ~Cğf–`d·ŭnÙßMì_­ÇKĊ›\lżàPàÄ ·0ƒˆˆ%sIž£0§Ì7 aΌ}ş#6Yç&#=bIt*”ß§ûÎc YLŠˆ­1Ĉè¸)À‹€ÒjŞHiUŠšbdŸa€`¨ û.,hِ &žeT6ĥ‡NžëĵĤnSp_İżû™[ċk^!äŠ9’M˘›SÙŭBg´[b;Ü Ġ K˘Sxô&—Ċ§‚ˆ˜–^ŞxúmbQŬš\>YÍ-÷U˘ŒŭcâÜs—ô2™k–™0BÙHÙ­t"Zä6e™z5‰ÒT}*côġĝßÄ2Ĥ9o8êĉ’‡6ÀŭĊ!éż̉,:žX‘W{ŜYGlˆÛÜÑ7I1ĈïbüK´ ê_Ĉú bŬ²à`Ĉy·Eğ  ˆöË]ìëÍĴ§×Nĉ˜˜Lgĉ5µwfµÉ*)‰Ġ2Z´<ϟš„Ŭuh^ÊpŠ Ôu€ŬY€f7˙,ÁJû”ÄĊéïbô]ħĊMŭ1~:–ÖS,ŻSŝ–^j4|'ŠŠß҂³€Ĵ|”œŒĴ0ÚHÄädì '#iÁF&Œp{²d‡mœS7Y×§ë1(<@X”“e}IÏfġ“Ġíà]L …â€]nè÷™0f‰‘ˆ c-íwĈßĥé½ĥ^˘E{ʛGG…Ñûñż?`VĵÍ?µ—tƒMm~ ’Ö+ ĵ’o_.t–=PÊÛfĴéïkUóĝ²–+Àgü UÑÀ]üï¸vı£o0=VġZáŻ½wçù)( H´ ?•‹†’a#ZĤžħFM7,Ädr4šmR‘ĤÍDÛèßUˆ€İŭÛ-ZddSd½<@›-^ ]@ pŠT}ĠYÓŬy3pŸnsñ0!^­Ĥê\1óŝô×Ñ~güe ˆ‰‹t`Ŭè]ı°œ3gż_UĵjŭöĈ„ ’NĦ$6ĥGÑo„jٝĜ‹L„=‚BT‰ĠTšq˙b€´‚'̎R˜M³£·èÓ&ï1ÙÉ+%;Ví÷ĥX*ÄĈèÛ˘]ÄúF lyÑ~dA!Ş(˙˘0bv•t]SUŝµĠœ÷n{ú´P¨Ëp`"F•żÓ*zŠc˘h½­O˘ Ĵ'HŭŭíÁĠ˘›Nà-ĈŒx—ï’o™8WÈúL·_1š6-Úzİ0àYĈ @kÊ“µŠÀzüï~ĞE^x}eÍ\Y‰Ïo Ċ^‡&$pş€KK"&äVëPèJİp.RŠ·½ ·u}Oç: ˆ9Ĥ½ĵ~€ûĤ7öj)L<ċù#›{›o“Ŭ6'µX1'ĥŸ‹ 1/.X€‹óЁVaöÎÈ]P­D [މİĥaż Vñ‹ĵÈzš${f_cRi'™R` )ĞGLŠĵÄTeb]ġW3XAzÂÑ7u +À @ı5X³×ĞŒ5dUa¸PÛ5ŭé{F#+ċ Ÿ{•wu0pـXÄ^@d!Ş”—ù˙Şá–ô˙3öüĵ}F‹tħ£qİò;Òħ€˜VQE¨Ô<ítŸ dTRZ‚.UĠùÒ`¨ pâK"f¤ZħİžÒCŠj8€-½N˙½ŞoŠ„Ë`ħ³6Ï_ĞDEO@™úĞ…5ïW$ÎêGˆ<Ĉ˘lMŸ°{Ħ: (=j Ĥê/€– ôüt£BUÓ~M€ĥ$Xàƒ°‘I}µí÷r%~€û§è˘ ıè4%§§†Ĉ[ı*À>`÷Îù.Ȏ‰ûu˘]ĈğŞv^ûĊ8~Z/öÂ?ĉw÷ùĈï?ݏ.ä\ 4–_”@8êoÓ|$ ¸Ċk;żEğ1Ŭg #ó^·J÷ubـ_ŝƒCyĤ‹°)’.š10@s`i{^0°×,ÜĈ<ËŸI;cm>@ÎHÑö¨JM!ÀC°ÖŠH2ĥemóÂA›$k–Ĵ‚Ї)A á7ÓMĥ³}sCy²×güÊRá\¤¤:aˆ 2r&Œ‹:{§Ŝç À”îúLÀŭĠÄĉK­F–!…lLż;–’Ùـ)İñò6tI˜0fÀH'M3óy‡Ĉ‡ĞĦ5ú¤ |^ƒtĈlYċôŒŒ= òÀ—8Ïs‡ú˙’0bŬ2€Ô2€,0€‡u]ñ(ž˘KzĜÄ ` ÁEĉi¤Ŭ{K°ŜÄN³„aù€Ğé.YvĞ tV ”Ç,#Hӌ cRK™G nĜtâMZè %ï˙(eÌi2áëpƒÑgû9–è’–e+VxĠžt%ğ0‚Ô˜×Óuv“w­‘×A İż#1`¤‡ŒV (Ġ‰ġ³†VğFħʆ!Ua‰ġù1bÄÀ0=6 –fĈĝ“’ùhċħ#ï":½É*볅¤k=˙˙CÄğ2pŽUŝžàħ20B1B3A‚˘zTu€G' ’„ŻsÀ7Ĝ_ÀŠ:Dœ#DœG²„ \Ĵħ€Üğĵ™ïó;“Iú–-ĝĦJ.‹ÀĊÄCP}P#è‹úşK.}ş DŸCFzȘ!ıĠÔŭ.#mkûÌ Ĵ0È80ı­˘İĥËßğĝ¤üRR&Œ1bĴ‡ E]zìÓÓ=útĞzh?£ŭéÀ`Şŝ_p˜| ²=ĈäÜĥÊ˙>‚ûs`éR€ïr4Or™ÏñDmcÓ£³‡&³Ú‚ayѧB€‡{LrÉġuÉÓ<Ë&f É2’óhVg„‘ñ[ÙïNŜĥµÒóŝYġş3=4İl¤è‹zzŸ.ĉÒ]F ™0ĥŜĠ …$¤"ñ҈NÏŠ"§äs>޲’¸ŞñrÏuŒ#IQ³`4 £WŒġ8`@Ÿ! Jï[{  &SÇې“;äÙëH6t]{é£lëUíżŽb™WYñ…ŭ= ·™€ ŠIEŽ|íÑ*Ž‹úOĝ 4Ÿħ}³W÷->ËÓ PĈÁ&=Ü"eHÎÁ€çèsœkhž/€4vġ„eŬâ#E'~Šì²6E.vÜ8•ŝmÇJMŜJA‹bzŽ´FЍèÄsĠÉe’Óm+˘œ ĴŠ™]V<ôŝv mÚΟ ÈuV0ŒDŒ-°¤„ĴİëÑe@Ÿ>=†ôéë.C50Ĉß=² ÀEîiÍĝ­İe[0ü}HvĜ!ċ’nw-Ż"04kD|—œŸÌ÷ñ2ˇùĤÀ:ûìòä ÈÙDħ…˘‡fTĵğGLˆ‰Oùk&ċ=$/ó4ŸĤuÈI#‘$\`‹?%eLN†f‚ĤË5›MxcÖĤbf Íş† ŞÇ+­ÇòœùË:ó@Ti£²VbĈp ۑ$@hcÀB¸Ú$]„°SLµŬO m|(Úéê˙´Ġr^däڈx™Uó'blËxĈ6]92^^w‰ŭ&lÑ]úއê‚î™Z~=6á çOÌqı­úäë0z›ħòëĥÜDpÍ:°Àä’ñ)br4_äÓĵÀ/­ñß%gk xĊ›(vM/&ĵŝè5=*àÏùIiñ çù!.Ή…ġé’6l‘²En+vrvxħeŝ¸j 'a¤£Ëñ —ŞLŒAÛvײ6·ĈĦ5öȘ­0ž9Jäh;ƒÏèöÚdħhĦì=.$Ċ_ıMÓ)kÊ3üLg6ĥOĵbL"Ìġ!£EĜŸ}}À@ôĜg.{tġ>z ĠÀߋùÇ ĈŻĴñÇĉvò ŝ•xÁ][Hn#¸ÜħŜż ĥày$kDü6 ?ĈŻòI>Ç9˘Cà6=ÖùC2ĥÉÙħ `œ>0ßxôt€G Da֚„œOò<Ï-p„$c.rÀ·Èé‘3;^câ…ĈŬj"4}rCĝ’ÌY‘AZƒÏ­ñ{5;9*$žF6# Rrr:#%C;p°&œ‹œL¤döħĉQN8L§. c+ëIĈ‰˜0Bà1`H}½KŸÄb—=ĥĜÓğtÙ§Çé0CwAí[ï?²ŠżŭÚ~níjĝ,IŜ…áĦÓ=n7‘l!ık=˙M[˜4 óŝV|–ñ1ŝžç’mښ½&À-6ĜçOÉ9 gĊ9{žĥóGŻ/àÑ£¸`ımSKOñ_béßašƒVĜe“Œ rúh›:z–Œk$ v’@“ëœ[yŸŽ­è˘™ P¤½ü½r( ä&Ç>nŠ˘›\$(ĦHDBĤM}*Òb—žÌŠÚİ‚T$d"%“ĈËX ™ˆħġ#kü+ìġéê}úâ€ħË{t9à@ïÓûL’ êÀx}Ŭ5°cĵR/Ġ™zĈ_Îù#}F†žÜbxÁ.‚;n!¸`ÍĥWĴı†ĉSÄthñ˙-ßÇĞ\´çĵoñ#Öù‘Û` gŠĝ?· À#ÁÌÄË6Ÿáé9-¤˘H JştòŠ=ĞŽŝ)WÉ, È=EN‘ÓWŜÉÇ|Q iE—A,y²â6Ĉwà<ĤP>Š”¤5"Ñ ıÈI(=vFBj‹q1a˜1Cۈ3aˆ1İ‹ñ}Fô+ߣKWìѣ˞Ĝb“•]ĜcġÈûÊPŝġĝÖĝµkÙіäȊ,{dŒĝu˜ÜàxA×Ò·Ñġ7z•Üöŭwè"ŸââYÎêŭ5pƒ-öyƒ”MKŭ7]²˘ĥ }ÔÄ?·µ ezÊ;ló˙1äĴÌ9…„…É—x]^&CqÍÁ*ŻVÄ£Ħè"Ĝŝ8ÛċŸáçuÊùċ/Ú᠉Á°B\Ç`Œ›ÁÊ@$ö2†´£ÈÏġ- XÒËĴpŽeħLŸKb‰%–Y˘Sl%Vn&gn ĉ@6dL„ —ëïé cFb@šÙ²Ŝ~YÄTt÷%^ŸëëŻÍùCü!$ÛìiĊ7‘ôĴâïâ~GŭKjnR ‰é8‡§­‚sXìżNÂ7HÙBÓGÓ³Ħ#`Ì#É£á_+ÌlƒżË[üŸâ#sı'â9BÂm[hVќ³Š[ Œ¸JnOÔA×ΈÈĝl—|¤ùú˙ċñċ/Û!ĦXc1b£g0V$sĈ/ÚĤZNAµYgÀ°3 ĠŠYÒËtX!1-̜€–X²“„ċÌı€\È5ĥ))#+ş‡ ŞĈ>öê|WŜí†ŭŝtf*ŭ„NĜÒ o"ÙG°ii˙­BôÓô(ĞŝÌz̀%Öĝ/ó3Ĵ-Ż×À&ğŒ¸…˘KNĊšžm2ġú£ êH°Ìnkû·ùWĵÈkœ_à„z‰ÇĜĉ‹$Ü@3B1ĥĠ ıx Ûûż›í0füuġğĵù<ÄOÚ´ ż#Ž,LJٽ·Ëy‚cC T;#éôè·{ƒˆLûcĉKŽgp=üĤs/ĠYĦÜKcŻžß+êĦVÏßdĝH&£o£Ó×ɸn˙uà‚ ˜FLÉġOÒâuRŝ/ò<żĈ3ĴJŭ]êï€ë$Ĵ“3@ħ˘[+ŝy¤WôH}Ú×p8Q^“q@‹WıÌÚĦGóÑ%aÂğ[—˘Ñ<‹ŞıİĥnbĉŽžp#Ïx<ğÁ“2FDç­qĞZŞP—V§VLsžvlnëàF&χŠ4K§cĈjÌH ċӗq:f<3I&$´Œë{”ñŭÀŠ|“†ÔžŻò;ŭŠ}Âh~Ĉ_ƒá·I²ßAsÛúĴ[ħïšŭë(öl÷_Rh)Ï#ùŠOñ4—ùOù,?Íı²jîz“;ìñ)wÈÙ"gƒœmĥħ(ô£(ŝ=š ûeĈÛ÷†$<Á°² X#bĆ Éın“ñ™­Âq™WàĤÎ(Û{Nx+OÙÌĥĝ~½K,Û ÏoİS›!P^†ÀëžĜÛиgĤÇĊ(­²Żgû ìϞ½ŜġŒÛ>ĈŬV]j ìŭ\ŜĝĜ"XNìĉĝ‡0ù3~=A_%ĵ`Éĥï_/Œö,›ÙW41˙šmZĉgùŝkžeı¨ëœOŭ3n Ĉĵos˙ö²W¤rqú˙è@™(%>SşÓEóC\â íĉĈ^`…1à6°ƒ &äv#‘wI=˜ââÜĈĥšŬ´Ç³ù&tϰıjtċĵ7Ĵިp™„´ ÚUŜ9=ôbTĉè‹bAY²[ĝ&ŜkË×,ŝĥKUĤEÍxŭ²÷aĝ0z‡4ŬçŠïÔ(˙MÌĵĤ[H6ÀvŝıŬGL֐ü_¤|–żÄ‹ü}>ÍÓ yŝ1šïñ&=KĈ:9›EêÏx˙aŝ2”,Àíü7aÄ.Ğ|™Ë‡V¸ır™>ß´ûlċ6˜V<\Ğ0™í?[F0$Oó IvÀ‡³[tdŠk Ûg­ iïŝԋǝ™{†ê ‹ s(|ñ˜QsRĤǚċĠ÷%ĴV‘߁ñÂàäÉ[jěÖàwÜEr É ×ÜE³`*ñ’Âĝ_%*Œ˙ŻóYžċ—ĝŸ-ê6ç}?)pë|•”ğdl  Ù%/ĉ ĉş÷t dÊ UĊm2>Á/ħş@(°Œ ĊF\`È·m@‘˘ÈˆHùQdvÌxnˆ´­ûSÜÖ of²t“ÇĠm–ôÈn*âf[êïž]ùìŜlRĊuè%-=~aÜı—ÊóÁ(I ğ?…áŸ˘'ìİ!ßn Ùµ}NèğQ”ĝjö젏a!ĈùĈ…œOò8ÏòĞ|žŻ°f[£ŝğdĵǟ0ĉYQĵuĊ69=Lz1Ŝ˙Q€²:ĠîEŒyÍç¸Ì …kDtx†Y7;l O# ( óB‚Ä‹{‡äÜÔ•ŽÙ6e7ié=„lh•ğ =qâîÀ ó˜‚Zü2Zĝ¤{œ°Ŝ£#dïÂĝĞ0új²ÎA>àmA”áeIDATïY‘oËĈúĈëMಈ÷{²P3ŝ6’ß$Çù'|šŸâC6qĜ7ÒCó×Ùċkdìژ˙69[höìP‘4x˙Žˆ"+!É鑐ŸâCĴ-´‹Ì*Ğ|œ.’”›;dÒġäĉ Ûc5½ÁrvIÏ˘\Á éR žÇŞ–=µĜ½éâ^GWc{áÎaw?z’7`ô ôè]’d—­|È[äĵcŜäŽġú×0)>ÓÖKÑ|3)”~gü/ Éˆ9OÊWĝ5>Í_ğñáq?ÜdŸÛü-÷Ŭ Ž˙·Qôí£‚÷0Ċ´L3á.³ÄË\Z`Ì´VˆXċc찇bÇĥl•Í󘔖khİ&ûÌÈkaç Vp€âŽÎxSM¸ž÷&[´Ó›tòÈ|ŬÄè"²iDMÙi(ÊÛ:÷tƒÚĊ•è ĵߨ”Ag7<ùsŭ9zô6“ÉğYŸ÷ġ„wĥn_]|7íċşŭy3›yßĤĝŒÊĠcFÎĝğ´8à1ŝWŝm^#V9ÌĝsàCnÔ›Œğĥég›œküYŝÓrVX˙.gDDL—_ç-gżÂ•@2ž˘ĉ?ĉÏé˙}Ġˆ‘íÌì@ËW‰Š‘Vݧon3 )š- ÚC°ƒf¸£SŜÒ)—TŸËéO‰ ^’ïóLè"ş òÈK3şˆÍ7ì\£ïŝN0²“ÌîW½‘Eà×fÄ,sžÇĝü0“Çhñuk›Œ;ĵMŸoĦ8 g‹Œ-rv…ñûSX èݏÎz­˜èŝĵÍgy’˙‚/# ̛-×]RŜà˙f‡΄k 9`@—1}[}hêÛŻVjÜ}(ic6żî XÎç€ ÀE4íġµ˘ÖD‹çEijB°&$‘h#DDdKrĞ!AM:/…=˘•Qüµ†Dçlê”m4ŭ"LLLĴˆÖGŜ…€}Û#á×òW?³ûÜFìsĝô"OòK|™żÊı#œ—{(Ç÷Ĝĉ÷Èè“s‡Œ›dÜĥÔż_`6`ġö1Ğ(ÎÑá |„_äó|ĈF˘‹z¤œoóu6ĝ ü™mğë2f HĴuµ6ĤƒÈ^–Ñ´lÎaXVÑĴ!Œá[8gï_:@M3û` ·ÓAÌ%4ħm†PÙ´ÌKUƒÏĊĵC#R£!èÙzŭ5ŝ‚-u WnáĠô9Ĝwžœ˜/ñ,żÂ—ĝĦ#qÒšï;üRĥIY'·ĈŸħ…b2Ċh8O ˙ĉ€€cm"V\ Ċgxž˙ŽÏóò‘“!š7ıÍ5~ƒŝcúŒè1˘GĈ¤ ÜŞ{ÇrµíĊlO&é é Yµ °bŻ/YÀpá2°dÙD³ħ‰?½HVòÂîšçĵ½yo;A×uύÂyym?‡Oó]d> àJϳÂÄÇĝ{|†gŽt6&ÀĵÏ6_%á [dÜ ç6šuRö=ςá8 hcƒ›SµĊ÷ó˙Oñ⑘@\£Ï[ü6ÛĵÎĜ6àOĜ'cŒf\°Yž²D˜ŠÌ¸ò–gû³…Ĥ …f AlӝrĈ;uID·aFı#Żİ­› í`mcİg>%Ç˘*ôiày>ÄßċûùĞÁ'ùÇ|‚/°]uíóÉmŝ CŜbÄ. =F$ŒˆHì~÷Í@0ĝì Ş‚™|ܲ à#ĥñ6$²Ûbakr› 1ċʎÊğÍ8…·)§ß§ï·ìÎzß/Ĝ]|–‰Y%g‰çŝ^á &[˕op-ŝ˜„ğĥĜçŽMùŬE³cĞŭĈÁó¸W=À0É%".³Äçy‘˙Šï™ıCDf¸ïÓmŝOvùç ı̈́>)}2†¤Lä\3ĦöĠİ`$ò€aúş1üˆÙißr·Qİ ¨îÂSż}ġ)ş~Ĵß"f™5KĵÌȳĴ.°•ÇtXġ]n°ÉżĈd%6m™ïm2ÖkĈŸ„˜?ÀIh.q™6Ż4żÈ÷ó2ޏ‰„Ĉ Ħ~›ëĵÏ˙N͘.)=Ĉĥ>!³Œ ]ÈÈfÂĵÛóV>úâF˙‚UöKş™sü,ïòOpĜş`ñµ‡âmŜe›?$g”M›ëżMĈĤ5ŝnÂo ŝNVì@ê‹Ä|’'ù^á Ġ ԗ*‚7¸ŻÓçkL2 aèéêÈ^÷pp8|ço8£ß&²ê~H–ùKĵÈÏKĵÀ#m\\‚ĉ: ïòìTߌ 2Ö-íßòŒ\èÁĝ܈XEr™ˆÇ9ÏÏñ ~Ž²vä×uÙï;¤ĵĊÜá7ç$ì2°‘ŒIɐ$S`pġlbáÂÒè͜…˜5Zü(O· <Ι–7pƒoç›v,ûĤM÷ŬġŒŒ?ÀPh Ée$çée^àoñ2O)Càƒ€vPĵÉ{Üá_Òçë y›”2Ĉ¤vKeş“`Ç×FŒÁ—E˘cÑ\ôÑ\瀛üûüʘ[vì˜ÙԔ §d($9-;îò$è|ŬĜË%™#èóÂŝÏ%ž"ËLjñŭu‡„kĵÉßĥŜ~ß6÷ĴÛħŜğhĴñ{Ó ƒèàƒ²XȄOqžżÌ‹ü/péĜlÀ­Ĝ!:wĜĉ›tù#zü™-$‚19‰—şK­l§h,Ħ\W*0ÓdÜbôî˘hñ},ó*çĝ!s|Œ§Y;F|__àûÜä™p“Œrvì>~›v´×6ވ÷ƒñx@qo9ÁßĠ \$â1Zĵēü'|‚WxüÍVMMŞ9°AĈ]ĥèħÁ_£ÏUŜ"oۉ3ïbĉ}ÇEn:‡29Ó%—XâĴñWXS\ĉEžâ2—Oh+í Ĝ"ċ:ï²Ë×ìö]ğä쐲…b“œÖĝCyo€SNXFp‰ˆÇœgçi~Š—ĝ‘‹]ĉCn„FLHĜċ.]ŜdÌÛĥŝ½KĈ52n W†ŠÍb ¸@Ä3ÄÄ ŻŸf•ótXâIVŽ\uĜê˘ıÎü‰ġú]rvm7ߖŬÂ{×Îòw”? ñ~€ÓHÖ\Fr‘6ç?Ĉ³ü/ráĚŻu͜'hFhrš! =ħGĈMnKŒFvŸIÄ9bVd´ıÈ*—8ÇË´ˆÄ:ˆ#éMäğĊë|—o‘ħgcŭ]oˆÇ.9ŬFÊŒ?À)żhhÍ^.Ú2ârWy–ĉ%.Ü×1,ş:ĝ@ĦHÀŭA Ĥ"ò€ Ŝ¤ÏğdlÚôŜ>9ÛäìZŻżf0òpB‚61K(ÎqÑÁebž˙.ċUžbeyCÇҘv˘ëì³Îwñ>ûžáïZoż²Pކ„g|6ĥڀaĉrÉc\äÇù?̇ıÄ9ä‘ëâÏÂJ.9ëìq—Ż[t‘Ż‹bœ={úHş6ˑPß+€3Žt,ĴZħí’KVXá <Ώò$Ïp™˙ż½sÙmЊ·÷>$ŽÓ&iĠ‹ “"Á¤!!uïÁ$ xxƒÎ˜2@b̀o B˘4ÍuâÛħÏ9{38Û;MĠ‹l7Ĉ˙'UiGĥzú˙k­}YĞÉfµe§ñ˜?3âo À³IÂNùoxÊ×qÀÇġ ˆ…$à;lr={l.ñ}ĦĦ}nté-ĵKÂ-<='Uk°ħL`u.À*Ôŝ„ËtÚßbHhxdž6Ž & …ûú%ó{>w) `ÒxÄ`°làĜĥ l‘Ó`„Ó#“ˆùgĥŞúß&&ŝr€£Ž£aC‚˙î%ÊÄĵ…g.Ŭ'²8 uÜÔ°Ó,~Î?e2!„ @Ìö—Ĉ2lu(HĴÚ\…g”ó'˙-?ò`Ihàh`p,vI)·'àHHéċ×88[€9^& ‹à }' ;8vq´04+XVäÈ9cÌ_x:xşx†1ôU˙ŻzX—™r Ôq´ì⸆–6†:PÁö›!0˜×*/<@ %'猂#Fœ0Ĥˈ”‚ߑéá)ó!§ĦFŠċ OAĈˁ:†äÂ]‚ ÛìıïżJ((×"<ŒÀˆœ]† È£ĝğ*db~c€œ!#,à(0 Fż÷E‚îÜ÷ì+ŝìd8hNFÊ0ŝ.'•ĝUˆùò)şì“á8,5#œK˙Ŭ+ĤôÉ ^÷²żQäONN'“Ĉ´˙‡L+2€54‚‰ÄgżÍ9l)ÖĤD>òKü2ħT3xûHôB!„B!„B!„B!„B!„B!„B!„ ä_|6G£lPIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_ArrowLeft_420x420.png0000755000000000000000000015216712467662066021503 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFɢIDATxÚìŭi$Ùuß ŝÏu÷X22+ĞŞĞğŞzßħKWƒh°!’W‰’ĉ%Re£g”ͨ)šŜ³ù4ŸÇfŜĵïófĈL˘F\ ͓†@R" ûĈĈÖĜşÑkíU™Ğğß{Î|ëî×=Ü#"³²Ş"Ğï5ËŞ\csûó˙9˙s‰üòË/żüòëv/ċ_żüòË/ż<üòË/żüòËÉ/żüòË/$żüòË/żüò@òË/żüòËÉ/żüòË/ż<üòË/żüò@òË/żüòË/$żüòË/ż<üòË/żüòËÉ/żüòË/$żüòË/żüò@òË/żüòËÉ/żüòË/ż<üòË/żüò@òË/żüòË/$żüòË/ż<üòË/żüòËÉ/żüòË/$żüòË/żüò@òË/żüòËÉ/żüòË/ż<üòË/żüò@òË/żüòË/$żüòË/ż<üòË/żüòËÉ/żüòË/$żüòË/żüò@òË/żüòËÉ/żüòË/ż<üòË/żüò@òË/żüòË/$żüòË/żüò@òË/żüòËÉ/żüòË/ż<üòË/żüZ³ŜÎ;'"üZ÷uĜ'İĝ—ÔŻC;™äÎ:BHŭòkeN²ÂmxPùċ’ üòşĦïŻz_²Dä!ċ—’_~y­ žQH´ßmş?'ż<üòëŬàÏŬ,ùÙ'¨ÄÉ/$żüzó@ˆöùù* ’`İCFZ% żƒ–ïùċ—Ò­ZùÈGüÑòkáúĝÇ?Ñ ß[!ZHÒ˘p¤áödġTÚG>ò&ż<üòkMA´_-ûŝ2µ´*”Ú€T‡,€Óœjʟż“_H~ùµž0ZEù‚Ï—ŬÖ~’ûyˆÚ`ä*'&ż<üòë-ÒÜßDQ¤z½ž ‚€:N ”˘N§Chétb²…4MÙĈ™ÍfœĤ)·@IÀɃÉ/$żü:b ZE 5}M ‚  ^Żöz½°Ûí†ADaŞ "THDJ)ˆHı@ĥˈˆÑZk ¨4Žc$‰‰Ĝ$IbHI|2˜<”üò@òËŻÛĞŠ–‚Çŭˆ˘H ƒP§Óét˘(êFQÔ ‚ Ğ”Ê?B"ŠìG`UR~ğ €EĈˆ‘”™SfN˜91ĈÄĈ˜$MÓ8I’$Žx2™¤³ÙLÇqÌZëe€˘}€ÉĞ%ż<nġúƒ?ĝߋލ "ċB¨×ëŭ~?ìġzażßïöûŭ~§Óé‡a¸†á ‚ ԆRjƒˆ6‚ èè*:DÔ** ‰™@Ểˆ$cÌTDĤ̜L´Öc­ġ$I’YǓ$IâÑh”Ìf3=ġ>Á„Íİ%ıÓŸ½ ×}˙ׯÈ~J­=üòëĤ€¨ Fmrż§êj¨ÛíF[[[QżßßèvğŭN§³EÑħ0 )ĥƒ ĜRJm+ĥ‚ Ĝ:vϙS'ïèî“÷ŬwüÄŭ`RĥNŬÓ¨¤ ̆ğI:jA˘S}ŭüëğğݽr}xáġĞKcĈÌġ·ŭo|èñğ{ËqémFğšq=ĵ6c$œ˘§F²½?l| 98`ìÍ4@„” ÖE°¨hû­Á{ĜzòG?tß;~ċ£Oßĝᵯ|ŝµ×>÷gߊG7Œ1—µÖ—:Î•^Żw½ßïïƒħ ĤétŞñ ûWcÏĞ# $ÜÉC{<ü:j0ZIċ0ÚÚÚê ƒhkkk0 ŽuğŬQŬEÑé0 ÏnŬuêá÷üÔÏżû‰÷?{_pòžŝnÂx95à‰ĈT0@G!€@‰ġ|@”)&€@Á`€ˆ@ƒ3cjSc HN<´}×Ï=ĵŭÀÏ}ä­ï~ŭÚĞ_ĝËï]úú—Ħµ>†á…(Š.wğŬ+½^o§×덺Ŭî¤Ûí6Çdìóä%jɇî("ÙCx‡RÉÉŻ£#÷óĵHı@Š˘(èvğÁ`0ˆĥ··7666ĥúŭŝÉn·{*Š˘³QŬżu×İÇ>ĝ‹˙ŭàoœŜ ¸ĴñDc˜2B"Ž! €PB!È0?RE6+À00 h Š 6@Œ­ŬéòäSw?ŝÖsw?pùµwżòÇ˙Û —żúÙŻEQôZEŻGQtħÓé\évğ;ŬnwEÑl4%ÓéÔ¸wÙö’bAᭇÒQ’=Ûï#ĉä×Q„‘jQF*Š"µħħmmmu···'úŭŝİN§soE÷ĥ·˙ßŝÈ3oûɟ}`DÁe#¸83`Dl!"B $   @„ìsÊ/Nrœdûƒ“p†(ˆ†F-€fB/$Bˆ 0`4Ġ€"ÄĦNÜ;¸˙ŝÚıûúïġċOŭ§o]ùêgżĴ”z% ×Â0ĵEѕ(Šö:Îd<'-j‰k_7)$;NH~ùuÛ`´(D§úŭ~8 :›››½­­­cƒÁà~ż: ;ÎCïüñ?ó_úÇïL6ŽEğFêÄÀ°@`C şPˆTöĤÈAPš£ùM@ •?r~ŠBB‘L) d RY8p&ÀŒiÊ„AœĵwpöŝúûN}য়xù?ŝż?7yĠo*^‚`3Š˘‹Q] ‚`$"³Éd‚Zˆúµ4{(Ŭ!ïEwtw$żŽ"ŒTŭ˙ÍÍÍhcc#:vìĜĈħcÇĥûŭŝé^Żw_§ÓyĝĜİğßö³˙ü£ä;Ÿ:µ“2.5=:ŠQ*SEV)"(’Œ(@£MĉżÑzáJB" I)B$„@ÄÀ”3$Ĉ@ÔŭOà×˙Ï?3úĞO=qáSż˙AlA°A7Š˘ĞaîEQ4ÇyÏĜ×Ċ á)4ç•<”ް*òĥożüZ/!şÁ`9vìĜ`ssó~żĤ×ë=ét{ǏèÇ>ĝËżú.ŬDcƒË3죣T²ÊH(ۅjj¨™>ÒĥsdÛüÜÏe9)âìŞWA!T cÍ0Fˆ@ˆp2êüì/<öÈ[Ŝsĉµ?ĝ_>£^ùŝW•RTO)юRjA:€jȎlmJG•K)ƒċä—_7FmĥnĠ¤(Š‚~żmnnv····lˆîŜ^Ż÷H·Û}â˙ìż˙™'~òçîOŒà{‰dިG„ˆ2EÈ€ —DEĠ…PÛ~-MÊI?2eP@ Ä  Ĝ•ä c#TÓ÷îŝç˙‡wŝè·OüŸVJġˆ¨Ğ” 0 ”RCFİ‘ûtĜCéÎPH˘-ŒîÀCää׺Á¨µË‚óyE‘ê÷ûıya{ssóÔĈĈĈNçÑc'ïzç/üĈo}ĝĜ“o?qiĤñÚԀèè+*TQž' ˆšÇ°ÖH³B ½Zŝ,˙µ€2ċî  B@`˘B#îôŭ·ŝùğz÷?zêÚŝ·ŸÏÛQĥF"BI’äf8pZJ~­/re$ĈÉ/żn6Œêĥ€ 0è÷ûÑħcÇzÛÛÛÇĥĥĥîé÷û÷w:'Î>úĝıżóŻŝ‡ÇöİŝùIŠkIĤŠBˆ ÓeÊ($›ÓA £ı1ÒL•ÖŸ× m"İ& !ċġ%’ÒXE @ ƒĜ1‚Ó½§~ò^ıçÁ_Üù˙ùS´s5"˘ ï@”‡Ò4ĊA äUҚ/#ĥy•’_~ŬVY[wß*£{úŭŝƒŬn÷‰ßŝ#Ïüí˙˙cQ~k”bĴb•)£n˘Sˆ¨Ĝ‘FâD°HI›2Zwvo’(SpBQ‚ PŒ5g·€i’…Ž?úÄöôŸŝż€˙Ï˙Ô+B %’,ùµgŒ‘4MŬĥ*”ŠcċĦ´fÉ0ˆ¨t}z ùċ×mUF­­­ŜñÇ·777Ooll<ĜívŸ|ä=O}àçŭ·žáN/ĝ뽉a°ú èXCH„¨ĵAÊ,´BhOġÔÉÑ褓Ĉ_Ċ"†5Ċ)SKJ2ĞŒ=D# ePHHR³àGĵù_ù7?‹ßŭŸ"\|-ïSGv0`<§  ´pĤ’‡Òş½‡Ô‚ĠÉ/żFM "FǎËatĈÂè-÷éüüoü֏š°|gĴ £*Œ""([WDn˜NÚdĉtġ½@`DÍ0˘fÚċ½2‹P°Ísħ‚ ğ!,Ĝ#œéŭġ?ú7?%˙á˙à— "ğ˜YìÄZ]ƒ’ûš3ÚÇĤûµn*‰D ÂĈÉ/żÖF½^ï-½÷}ÏŝÌŻ˙ĉûtĜQ/Œ4bÍY}‘Q5e$nĞKTâvĠ|’Ó‰ĦÍĉ-óı%Ş)'jSböĈ+!<Û+/ @Ħ Ĥ&ïĉšŭΎaĵëŜğ;Ÿ˙{Ï}(ü½˙wÏ˙PD„í‡0gÈĞA ŽJŞ›|>ia°ïöí—_·Fan`p`ôPŻ×{Ë£ï}ߏŭÌoüë÷A¤3ÒH ƒèU™; 2_D.{*à‘êœç{,‚ mY#‘ZßËdÜP N‚ù\–"@ !T@$@W ŒRû{Ĉd·³;ÓxêŜğ˘Ïüí_˙‰ßûżÄrŭrj§ÖĉSÔEk-ZëüîÜbÙz^Éç“Ö9dpÖġ›<üòëVÀ¨îĤë?~üXFO?û³żñݟN‚P}g¨‘2ƒò0òŽ Tô££š’i‹Ò ˜ÛN¤. Ä6-·Tŝ5ÄÀ*ߓy¨Ġ•’²Ï%"B‡‰‘2 Ā$Œ‘œ{ôŝW˙wżñáŝÇ˙çXäzÊÌİÖÚäѧÓ)´Öy]’Şİ¤&”úŬZ- #„½íÛ/żÖFżġt˘BġžfŒ §Ĝ Dy˙ÓÚ.[WUO0™ûj?se…Ğ”dN5wš{ŒbA‘€D H( B— ‹ó˜²Ÿ!a<ôc[/ü­_ûÙ˙鞈HÂÌ)3§&[˘ġ\ϙe½î|ènŜ[ù˙>dç—_·FÖÚ}şßï?Üëġž|ô½O?û³żžÁè;#“…érQĤSµ;“<È&Má·27$nK i/RFRS8•Ϥaì­ŭ—Ş rğ¸¸ıĵn @D‚@be@³`³C8ġà“ÇŻûÛ?}ì ˙i""ScÌ,MSĤİ1ĈHÇi @u!ç‹e×qÙó‹îH~­5ŒĥĥĥN÷ûŭ‡ûŭ~ £ ƒQ’2À‚^Á(ïÒ­ò^qö ̙ ż•uFÒ D2PTÌ u5%ó·_×?À)lDıúrôUÍäıĉÊÛV $3:Ē9„a•jÂc›ì=ŭs÷%W_ŝ@ç{_žôz½İÖ:IÓ4ĠZ³1†mèNĠBtMù$x•´†`şŸ–’_GFßi¤&sôĴy!´ÊAQıÙ×]o­9ĦFĊ÷Ĵ’f—ĉVS£Ui ËÙBĦÒ`!ċ‹Ñ¸Ï‹”mĉ T@/ ̌”à%€ cdOŬŬ£żüħ_~×]W߸Ĝ5Ż ™yœĤi”x8şó’r5İ"opXŻ÷š‹<üòëÖÀè7~ëéX…ê…‘6bsF@Ç6)­À¨vi_‡‘8 áZލ)L'2ĥs„Lñ·´ÂlġE˘F8ż)R Û÷'ĥ+I6½$ Ĝàí÷ ñŝ<{ϟü?c†S­ġ,I’4IÇħÔBwn]R£JògûíWFw˘ĦÁÉŻ#£ŒbŞo ´a°fôe0˘ùĉ¨•]³ІĠœ’¸˙sĦ‘j˜Ż;İÜ?ıŞĈy,9€ˆP<˜³‹sċ>]—7;"d3›"fö׳’£ÌÌ臂íÇŜµµóڏĜ×˙äš1f/MÓñ`0ˆg³™ĥĦ;÷iÌw^÷ı¤ġáQÑ>ȇìüòëVÂè=2úֆé4£¨Âڝ¨¸@Jkô|X΅P . óyĤÊ×UƒRj]jR(›ƒ”{s^>]ˆĠĠK)_²Óş IR`Ĉ‚GîÚĈ7xÏ[|ŭ[ßèt:—z½ŜġÑt:M˜ÙÔBwm*É+Û #ÊĦäCv~yŬ|”Bġí½,gĆѳŻ‹#¸Ŭştżıµ˘J.ȂHܜg7„W ġY Ġ\µŜġÛí ^/Š- ÔRˆ,ĝ\3Ġî%ŻwÊ sœçşì q½/’”áĊÍN€Ŝoï _~ë{{Ż|ŭġN§sycccg4M'“IZSI@ĠGѨ’ü;âż˙0ß~ÊÉ/£›£ŸùßzzBÖÀ ˘!Ûed•NÚ.`¤TŒŞi!窨¨?’Şš‚TŒeaĴ›wjvT´ ×WÍ)ëêVµf^’4L^Êa$’ÁTÊž ÉbŸÌħ{ïĈ7ï×#žáŜ(Š.tğŬ+£Ñh'IbPí¤Ô¤’*€òağÛ°Xޝ‚=üò0:dŭúo==S‘úĉ^ Ù¤×~˜Á(ĵAŞípìÜ n³QvrCuÄN!lnpU“›Êu×;ss@•P]ĊàÈJÙ&ˆmH ı‚r­âs2¤€&0b'9ĉvw2ÙĈ~}Rè<ô֍Ñ+OĵĞóê7_ít:z½ŜîĈĈĈ$ŽÔ†íTƒ:ò­„Öċ½¨¨¸Àò@òËè`´ħħQôĤûëĤûö0EšfqО²0B֑€` _ĊÍ­”9 v@"Ž²ášƒŽáŝTwR·„×:6HSËĦ•T¤‡³B-§T:ïŞ¨ĉV ·‘SU(ÀúcwÌ nÏ=Ñ 2Ξ=‹WN>è}çżsO†'şŬî•^Ż·EQlä:í¨FÔ(áüşéK C”ò É/£C€QŜµûÉGŸzßĉ×ŝġı YƒÉ`ÔEÙ(Tùĝ'b‘êjóŠ˜ĞuF\@§Ü¸MÎcÇJí„ŭ¤Z4Ë 9(7LĜ:UeT‰{ħ”ÏGÊXrZ5M–- żŒ98ß\û$•Ŭßİ^ˆœ~l“ĝ‡Â8~ıÛí^èvğ½N§3™N§iíXJ”* òağ[I#@ˆìÉîä—‡ÑĦÀèħ§ß˙ÁŸùĜsçFı³ħ;v<”FäÄËĊi<ÊN\)‡QĥAWx.hX¤ ÙĠrDBb¸·-y~ _Ó.LR +s­ò0˘"İöŜGQ ´ùA‚e(҈ÀԞ;*·i_3=â [gĤë'zëñ½Ğß pğ×ëmtğŬQ‰1ĤÉmG>\wûWÖŻ²$˘şóžŸ’_·Fç~4ƒ2e”0ƒµôjaäĠ#)5GŬM'R‰Û!ç‰0'ŒÇîm *uHÌġ˘ĜùX€>‘ù‰w!²ĞEadOÛq‚—ĠĤÚĉa;#ÙÍC—˜k;_Ŭú“ĝŝ]Üs×Ğ}W†Ç:Î ×ëu˘( Œ1ıĦ JhSK~Ŭl"q6{BQ-Yéä—‡Ñ`ôŝŝÔǞ;7ĤP}kO#Ñ 6‚~>r\êóŒÈI^Ԕ‘Ôœq6Gäş²¸9&™ áqM%‰”uFĠVBu5˘:öl²ŞF¨ÚáÛQU U%ˆ8!qjĦ\@V’F¤ĦX·Ĥ˜ÒìE;Ñ `6OwgÇî~8ˆ_û~†›N§EQ0›ÍÚ „Úyáv·üÍİœWߛüò0şĦ0ŬOôıscۛ.6 1’·]r)Ĥ+AUùäàȕN#g£FĴ++ŬŞc ĠÄ5R !1İ…ó¤jXÇYV7BRŞĦúĴ%*ŸµÀ+ uK(Kݐ¸ÜêĦCdÒS€˜›§ïhó_;żEÑ Óéô£( QígW?ŝ>lwğ’R6dç’_F7£unDĦúÖ^ŠÄL*ĜP@7 „Rˆĉj,œp\S9dœPV^o„F2—WŞ„÷jÌYÜîċlTHñċ€Ä*<ŞìdU ĦlqGsşCĉ™Rħ¤KacOÛğû˜¤~3İ€"a‰ÓgñF÷ĝ‰ğ‚`[)µ†a?Š˘N3cL[ÉCév.cÊJh$ż<ŒöŸ3Ê`İo3‰Î`° °-QT Fsn7H‘ßİĉ„Äéşàż‚³ÄżS§S÷N µ&ŬR‚)˙½Ê†ßĜÏÎyìöÙ°½cħnş˘ÙwŜù;W!LµÛ­Ìi²·kĜqJíqĠò]uÛa€'6(ì‚Ù ^§Ó •RŞHM!;ŸGşĠ )?Y { ùċa´?eô£üé=wn„H}k¤­2bl!"›7RĠ0ÍÁHjàpsBV)UPĦtÓħµJÏ;ïdn£šâ–qîĤ_Žċ9£|Œğm€0äìĉΠ‡²ëBÓäX7Œ(•™ħağ&5ç~™BeG^t#BĜÛT“ŝö½Ád´A7ÊVĤé*a;Ż”nŭğĠ6W…75ĝċat ŞoîH9 Óġ‰Qù<#²Ó^KULjK5÷SWFIÁ*!İ)ˆzCÒzp’Öòú¤VDs£!ÜÑN·í–^:ĉ2…”—Í×2ñܰêLĤ2ìh•ÜY`âÂ%х½­H˘ŝɁRJİ^0 U€Èż[փGµĠÉ/£U`ôSÍ`ô=maÄĜP d£·C˘ĴYjğB(i³w£ROÄ-0ކû²(‡Èüĵ£ŞRâš"iÇĦ5™ë¸=6Ëj†2èPÍCÍĜHâÒĝ ıÌ!ÍȽ[ŽhώğŭíĥOÂĴğħmaÔ ‚ CDù1ĉuԘGòNğ[²+ßâ’_FĞċŒ~ê£YÑkŒBB§s·ğ[Ù1A*Ŭ·ıÖĝ”[”ğ Sİ­Pµ(vƒÍ9UÂ^öˆ£ŠÚU‰ÛÙĦŜ(Ġ IŠP#YrĞ*ÁR%- ÓıŭΜ›dÀ06·O`'ìġ•R}"êAZ§]ScĠĥ<’_·jIÖ,Q˜½ËÎ/£ŭ(£o ™›. Lċ0*ÔAFpp¨š¸+–ê8‰FFjŻ(çU‹`kŽİMÊHdŜF]”'  ÊdF5¤WtŠ^›ˆá@™›|+-­"*mƒjĥupiĴ€vzHTÔ#˘.EJİ0‚`…]½ŻÓ­yóf烟‡ä—‡ÑŠ0"Fè+BĥQŞ…‘ëĤĞ+£ŞÁ ş³Ûĉ'WFìjż_Ï5ŭ ıoĠP[]…ԝl@C~É~³îÂiÇnŬkÜÊa1Ġ+˜PÍĠrI6Ĝ“@4Ħ·ÑAlT@DT¨” í9²H5ÁÈCéV$¸Ŭ…½BòËha˜nĦúĉP#Nò ”µj€Q5t5ߝÛ5$äJˆQËqù÷Ĉħˆ·£|ÄDÓhpˆ—‡éŞ ŞZHK•PZ%Róœğ}édA; zUnHˆc''E`# ĜŒ P‡ˆ""RJİíî:żÖŬìM ~y5ví>÷£üݏ=wnhëŒb-0F0jʈŞ0rGz.ëÀ°›(e0 z:"vÒ+9Öîê^è*£|ç_×`$s9#ĥaşe„FĤ>\ÏıŬıߕ^qÒ¨Bê â9šfם;˘A}Ġ@×ÊĞ#)”•ażı"_”Ĝı:D"':ÏÁ\Ŭèĵ"Z+…THbݐüò0zì܏~}î܎íÀ0K"‚>ì¤Wä½éÈĥÂÜF[ Óñĵ•{7uÑ Wj‡ÜâPn‘Ûú‡›†ëıáĵĠ!" r4MJFòy á´sµMzEšğŠ‹´À°v{äüˆ²˙3Ĥ £&ﴐÍèóĦşµ\E/;$ż|˜îÜʔQœf0êèŞl„DèÀ¨is,”£ê˜qg„DĊmל3b§ŬOѽÛİcڕ‘Ô•QÍrŬnüĥ4@Ĥ´U`4ïšk ÓÉÜ­;ʨցóµS•ÇŒrÚµ$"èÙ Ê$LÂ)3fž“H~­Ñâ˘OüÜE“’_o=•Áh‡Bġġ]„Z 6(›gˆ”Êóa0§Q@™Ëİw\hk”š+ŸĈ&İċÏëŠû”†0]-œĥJoşù˘×6UätĵfH4…é¤x¤èd@-.@D%³'@Š@”}$Ó1"hIEÄ0³qúÑyU´~ïr[‚DċU†’_o&=úTĉĤÛĦP=ż—"1€F_]HÖ(Uh£‰4 ×sÜtÑ j``k`f7]6žkTtż–yÎmêîNÎó]ĵ‹µÍ@Â|Nˆç$Os˜zÛUò4ĉŒì¨‰ĤïρĞߜ^”™T @J!™Œ‰Ž™9ħ&MSnÁœ_kÀ#ÉûÙi_ëכ1L÷ħçÎí RÏï˜ÖMG@°RóyFùlÔ&ĠèĠ덜Á{ġFİó0’ùv@Nák™Wr•‘ÌPë–]‡GŽ…eiú7C˘Mµ—ÂtmÊȵSCĝԈ`|í*:œ$ÌġÛÌg ·g?”ÂŜ•óĜÒñžRbŒ16‡´àŜüş­D*NTäכK]C¨ĥ›B™ëMĦ:éh!‘;ĉšÜt,M#$¸P&î=7Üş–â° C5L7JĞıfí+˜Ö ²$Lç*£Ĉ‡YÍ}U·¨,ìI.ŒA… ƒÉ• ¸‡“ĞĈ˜İÖ:ÑZ§ZkA´Î@ÊOtݐüzÀ(ïMwCġü0EjĴ2œázöFÁ¨ž3BğĦĦl˙S50¸&†wî:BġüH#1 6²ŜtD-#$÷uİ Ĉ›wÓĠGHd9 6h00¸nğĉŬ2_šG­„éÚÔK8‹”ÑÜl˘50TrFÍÀ’yäމ-_#çÏI$̎ŬüĞèN÷Ĥ0úşÉ€k­53Wúz­Ó›ß 9܁ËÉhÎÚ}Bġ×{Yo:ÑŒşB%á½ĥÏ3škÔ ”¤Ŝ›NŞv6ñÂÚ]ëÀPQFR-áYİ{vŒV)z• ÒĤ“–íŬŜbK£TYh`˜WFى@µ9YN\a÷Ġ`[âëĈ˜=­ġ$I’8ŽtAÉiRŝ6WwžïÛɨ˘ŒQ¨ĥ“"1 ÖvÒĞĜIŻÈRŒj3tµsuFĥ İŠEUıu5Ù‰jXĞİQjsĞ'LW•Ġœx­ŞIdİ<˙&eÔ¸£;ʨµ~Éy Ġ1ĉ\Û9ÏIÀ ¨d†Ñùâ^$Żi­‡Zëq’$3­µĈ|ç;i“‡ÑmRŝÎVÙs$żî4=ú”…2e”†Ñ‚ •5J ˆœFİ$ı›ÎŬ̝0Ŭ‚ óÖîj#Ôĥ0;ĉÂt¨…éÚşvsE-Ê-a:™70´Ş}½ş‘9F{‘´)£R&V”ل››³) ‚(Àµ—^]ğô)ye/Mw8ž$I’ĜüQ:Bk²ËêĵíÛŻ;2L÷á=wî*BġüžĈ,5`#Pi`ˆj]ğQïÚ½ÀÀĝuÑHµtÓqc. ĉîŠÜ`…n Óıùž}H Œ*@i Óñ ½6°Ĥk ˙ıĥ󪪓*lë-’ì·T¨ìcb\ûî×qJĤWS^OÓt”$É$ŽÄqĜ-ê!>lw‰D¨şc<üşSÂt?ġħçÎ]áP}mŻĤ£l„DVôꎐ¨› ĉ Ĉ żµċŒÚzÓĦ6B˘6é•k9£ŞRpÙ³\ÉAÂt ½éVQFu Ô ġQçĠÇ$ÍÊ(˙Ï˙ ‘}¨öĴBeÇNx²‹ñ/Ê#Ħùn2M%I²7›ÍĤišj›?âe´(äĠÓ- Ùıݐüş“”ÑGŸ;wE"ġ× F: l‘dÊÈąQĦ†¤ÖäT*5C½éj0ŞÖIċÓ0vĵ­k·H5'SéÀ2ùu•FİĠ=€W*zm‚ eà7L—mŠÏÙ˙LŭgÜ F*rQ”_3T7u\yᛌ.fݧY¸n”$IœĤİÙ„ĵ:ş]Lb)ċ’_wŒò:£+İŻí˜%‚AHèBÊŜt°ݎ‘¨ĜĥÑ0鵞3‚ #Ìu`(Zŭ8í€L%Ż‚J†ü‘Ô‡ĜqŬÇíÛ'ŻĤĞ(£êŒ*·=ßS¨zŸìNlmzœR¸¸ëQÇ6edc&LŜï Ù8„ =ٕo~ ÷Qòr𤗓$ı>›ÍĈ³Ù,×e_ pZ+ˆˆÔ-PH”Í ‡x ùu'„é>üÑçÎ]–P}m'AÂĥÙázÖÀ  ƒ“YŜ(Uœ–?lTvíÎìŬċH ÷6j0޸äò=Ğq$݆¤!LWç…`Ġ:#Y:éĠ½ñĈ‚Z´ħ˜ëÀP,ÛXgTSFuR^dlO!E³ P L„Ñ+߆şĝÒôD”~{˜$Wf³ÙŜl6›Ĉqœ0³Ağ™Áf=6”]Û½íÛŻ;FW$T_ŬM³:#cŬt•œ àÔ; tÑċ €p“ #v`TuÓe@1•†Şî YRôʘkt]QµyF-J†[;0H{£Ô†ôȒ0]]jıŬµŞ/ƒŜ\ôZ핷pô…EĜŒqá+…û#ŭ$I.Ìf³k³Ùl8N§ĥĦj%]‡ċn;İÛ *Ĉ$żŽ$ŒlÎè²50ĆKe;vœÊŜtEŻ2âş{j^p;0ä0šSF9 jm…êEŻì„ˤĤ Ú&ĥ…éĉÂs-6ë&÷Z[ĵíEù§òqËÂ:£jAĴÔ@%Üò72_cĞÂ,„$T¸ŝüWA^œmwÓo ĝÒl6ğ>NGI’¤V- Ó5n‘L·G,ċe˘75ĝuaôèıF_&ˆ€u֛§¨PFy×îş2*`Äm퀤˜îZşéà䌪0ŞZğKçñüÇn8Ż­ëAĠĜ–Ċóf4QŞz›‚ÖvĞLz­ßgqÛR{Î2ß²A“OTlVDeı£tç<ÎñÏXÇĵÇñùÙlve:§ÓéÌşë VÏy­AèNŒ/Œġëˆ*£KŞŻíY‚z7]u„DvĠż g„r D}ì¸çŒP!ÑĤ“ı˘WW5ġĤĞFàZj€VeTm4Ÿû‘%·- ‚XÂóù¤ ĵ¤Ŭڝ[Ím2™‹è(EÛU˜żü8vŭµëóíÑlva:^›N§£8Ž­óëvìyï'( ÉŻ£#ĞŒ.I¨6L1ĠтAċŒ"7g”w^ĤcŒòüRÙËnqÎHĉ{ÓĠwĖ0Ŭ²˘×ù=ĵÁ…×àĤ“Ĥ€”c!çEó‰ÚêŒÜŸ/ʵá.0M²ħց˘l(L_ŝ.vŸ˙Œ~ç†úÊl4~m:^Ç{Óétꨣeîşv Â;ìn23 îÌéòHwx˜î[%™)ÀuӅ (i†Qž>İäŒĉ ÎĜċ†ùv@ÙöìFŞ9£rƒ$ôvíž'7†ÚsFÒҁA`$máÁúms9„°Í&.K”Q› Ĵ"Ž*á>ĠUP…t÷2^ŭË?Ä}˜ŝäĊÙlva2™\›N§Ùl;0â”VÉ'yĊt‹—ƒbÛ¸~{ Ŭ‰0z*›ôz1‡‘. ="„”wíÎúÔµĉŒ\7Ŭ\ΨĦCMÍ·’jεFİMEŻÈB{s!.Hk›6 6Z PëJ¤Q¸,tÓ5pĈ™ûÔVkĝûeaşĈ‚Y’jËRĉŭVOǸú•˙ŠŝßŬ½k <N_ŸL&—ÇñŜd2İĞ#nçÖkßTñĈĵ†ÒŞŒ.˜P}u˜b–2LÊ(ÊrFTÍ5×sv£ıFİlòö@@·…éDšŬtÎĈo*ê§ÜuıŽkk”ZU“2Şh¨ş2ʍĞ ×C³kMŞu¸^óßWħċÀH‡éJCÍQB{/|ğ_üÓĝ[Ñç&£á+Óéôüx<6ÇI’$ÌĴ[ÀûQE>\wËw;öÊÀéƒÑO}ôıs%T_ŜMÑâÀ¨jívû/TUŠóyĦ„dñ<£kw½-ĞŒŠŽì¸éo\oJş ĴÖhşk2?8ʨMħ4*£ĥşŸecÇ=´Ç.Ó5vïÉmúŠ "Ġ 0zéëxíżŝG~Ë@=ŸÎĤߟN§oŒÇĞ“ÉdÇqlŒÑö)¤EuG^1ŬŽċ´Óş³HHwŒ.p¨ş—"N³Ĝ€µvW•QyU‘¸m}OzĠ6İS½V:2”·—› ô‚˘×ı K:049Îڊ^%¤7ר½òĵ2jƒ0_ôŠĦ½Òâ.s½éŬtM½ü„ua¤@‘Âäâ‹ĝá'˜á‹ĝëÉäµñx|i4íN&“‰Ö:­…êdÁ˙uyŬNÙó€òŽ H~­%Œ>–…é²›Yğfl(B/°uFp­ŬĠ…eÉp=8_c5e4רuÒ+W'½ÖtnĜkAcÓEÚzÓÉAFH¸!<™żzċĥ"$iżŬĤɳóŞ!L§Äu³XQ ÓKŻàĠOŝܳ÷êù½à £Ñĝ•ñx|a4]ŸL&ùÌ#]SDĞĉÇúpŬ­]bÇ ƒ|aĴ_ë£ôıs8P_ÙK1ÓYÑë†"ô”­3! ŞS´2 ¨vŬqma:YPôşFĞ*£Ĥv@Ğ*£öŬràħĊçmûoŒ¤Öżhqoş€Z¤•8§1@yÎ(RH÷.â_ŭ{ŭ…Ğg7£żÇ/Ç7F£ÑĠñx<žÍf3Ş3ÎGS¸nuäAtİDD…ÙÇÉŻµ€ÑcçŜ˙Á˙ÚsçŜH•úê^ŠÄÄdÖîĴÎÍ0’ŭ¸é0ĤнJCÎHÊş›FµPk$p RS(V—ô”kKQ*·ßž›ÄjSFs¨`gX`£9bIÑĞÔáċŜ†û·!(›d@2£Ğ¸öO ĝöçwÜî~z<ż8^FW†áŜl6›6„êšTŻŞŽüş û‰ÊÎky…äךÁècϝ;o”úÊ^šu`H²0]_Bpf` ›+r.ĉ7]MqƒjšSF\*#nÓ-ëM—÷`h Óµu`p~O:p·*#oĠ­ĤĞßE[oşÚ/ËĞùÜs•6e(R`ğ9İn€tï*ġS˜}Oï}z2™ü`4½:/ ‡ŬÙl6³şEÊhż†ğ]‹³âÁ;ñĠ÷@:Â0zC[iN›ù<#·7Çİ[ğÛsFeoşü÷ġĤĞ(£]ğsU5·çJFġ&ÜÀ µ@mÀ'ü·`>RS˜iÂì²04N]ıP[΀AH„Ġ  ÷âúW>…égŝhĝ–“9çÂh:Nm{ z¨nUwWGë­+ĈNx—_ëĤÓJ}i'E"UEdtțSĊÜ=ïĤĞMzuÛċÊHjuF¨½.€ÑÒŬRƒ†£jÚÂeËrF#$–…én[šİW Ǜ -˘MK4´2‹˘-Êt²I‘‚_ĠŻ|ñg?1|ËÉÁ_MĈ£ïŒF£—÷öö.‡ëÓétRƒŻ Œêù#ŻŽÖL>‡ä×Ú(£/^O‘0F°z’Á(trFġFİp hšô:ߛNÛ]ÔX9cœŜtRSXÍ0’âŠ_öiívwëŞ £*£„Q;0ÊÛfnİŞ'†šêŒZ•Nş\ŞŒĉîËÙ ){M”@… *T0Óë¸úO ŝÜ'†Ož(`ôÊp8ĵ89ġFi‹2j²}ݲóëĥ†ìjğ‰’_· FFİ/ÙázF ĥ…EŻ…ĦŜ(KÂtûi”ş`„Dq_¨ġĤk00”˙Isˆ.†´„Òêğb˜d7+£şdYVôêŜvÓc]%g4'“ìéĜŜt” fz Wż`atrW“Ñè;ñĝ•ápxa8^Ç8Ž“a´j¸ÎĞ£uFF@ÖĦ$ŜÔà×í„Ñk6L—2hĈf Ê0]#{e=ĤCµk·`0Ş7J-CuÜ\gĨ6JEC×n7éï²ášĵ­PM“^9WİjŸµ½Ö~ġFsFaşP PdϘ`FWqġ+Ÿ@òıOfÊh4úîx<~eooïüp8ĵfacóù˘U›İĥé>żnç>caÄ-ád$żn:Œ>ôkϝ{-UêËğ)â”!,Ĝ ”gä(#Tt9ŒŠĉ'½ÂéMW™ôêÖ Va$ iêÚ]SFí#$Ê}°qž‘,êÚŬ]Ušğ,ĴâĤƒ#iT6í0Z:B˘ÍÀ@@@ Ş@ï^ÁġŻ|Éç?9|âÄĈg&ÑwÇñË{{{2j ә}†éĵ:Z׈·vö@ò0şù†×mÎ(µòe 2C”í€pÀħKzәĈPŸ£Vk·Ì‡Ĝ¸ü=,ÈÉğtS˜N*ğ,l/ÔÖ(uQ˜NÌ>rFsQÂŭôĤsꌁ!˘ŞÀ ŻàÚW>ôsŸ>qr3Óñ8Ï]°Êhä(£ĤÜ"ğ·1qT`äž7ò@òë‡é¸“"ħ#$6qt˜ïÚ ĞpPÓ-€7ĥry{7· TUÓ˘œ‘sŭŻeUeÔԛ6S¨Ñ·Ĵ,˙ٝg´Ş›ÎH°`„D“2’ù0]ġ÷dai32/00È*ġ›ŽŒBÊÜtиúĊ FïFm†ƒ6NġŬÖ^!IĞ÷@ò0şaeôùë  ô‰' "A‚²&޽ĉ#ĈħQŞqÂO9Œ¸iìxC£Tv ġŜtyğ’ş›ižQŒ¤)L×ĥù×ĥÈĉŬҜ3BİöÚO3ŒÚlèûîM×#É{Óu($˘ÌM÷O@tS`´j'†;yğ³–˘2ìëCvF‡İŒr™D0P(zÓecÇİâĤ (£ykwµQjفÁéÚ-‹ğvKS˜n… sÊhĦÚµ[„ßġĤkĉĜ1a ùħÖa$ ”QŒêuFJ²L6!ȓиú…?‚|ùO†ŸĜĝĞÉhô]§P£ĤŬ7 F^­÷‘Ì]×Táíäat½ĴI}ñz‚™fp*Ĝ l˜b ÔàĤ[ĴŒÁˆi­Ü£ @\kŒZÓ­8Bb?Êh:#^:\Ż>ìŻ=„Ö Œê$jÈ3- ÓUŸkƒµ;´AĤ 3Εџ ?YÑE§Î(iiÄXmĜ^[£ÔçżӑĜĴ<<Œn FŻh>-ÉzÓv¸‘;,ŒT5 ŞŒòMµRĝڐ3j ÓnîÀÀ\³b­(unZĞ,PF܄€–:#kÙYÀ GjIó$ñĊaşĥĥ@s°m†‘ĴĤƒÊP"A6\/ˆ˜ħÍ}éO†èç0zuŒêŽıe#ÈyEċŞż µ÷‚_ë˘ u? ÏèFaDêsy˜.lċcÇa;0Ô •0œ0ŬŞÖnħ9$˜Öv@l)Á\ÛÉV×Ö!ğ&-–ד:c¸Ù*ŜPĜşÈMWg$•ş)U]ġù–’Ât¨…é" K € ˘f|W>˙‡À—ŝdĝĜñŝgĤñ÷lÑĊáp¸3™LFI’¤F‹şuï‡Vġ-U~„y’‡ÑJ0úèsç^NI}ŝz6é5 Ó]" PFêí€ò<‡”Ğ+ÀH ÏġĤĈœ—·‰ċaşĤv@¨}ż)Ԙ{•ö:#qŬÍLÒŞRZÂgK­ŬĊĤ2Ç9wߢázâĉŒ²û  fï2~ù‹`4nÑ²âÖzMQsîâëê;ôšûpĥˆ%°—6XŬ4HùyHF8 ›.‡ÑÌXg0ÊtY£ÔF•]ĊQF‹`d h10̈+ µeµ[;4…ĠÚ [çáў3j·ê<£YğÛ`Ä îÓ50PF¤ €mÎ_ĝác'7>;ż7_‡—%Ĉƒċ…¤%ךĤya$7ë6ë:@ċ·àë<ŒöĤ{9!ġ…Ĵk7ħ50Tşv7êa:0ʑÜgÔÒµ›ı;›07µÊ‘ižg´h^››İXĥ£Eġšt‹ğvÏ}żnÚ`dZ˘r‹`d0 (DĉĤûâ'€/ŭñÑŭÏMF£ïF£×rÇišĤiŒVžäşD I휖[´)%´ìµ |­ĉu 8‰ó#Ì=Œö£Œ^JH}q'ĊL ”úôD)şvSC×îŒòœKĊž+ĵ“BF’u`À‚FİM³Ž ƒŬıı:N¨mA¸ĴYĴH£z)Ât‹ĥÈ%0:H×îĊuFX=g$ÎB)@ET`­Ŭ_ü£ FÇûŸ³Êèµápxy8îN&“‰£ĤĵPNġˆ"µÀGa>OÔöġ›]!­Şœ¤%„G  ´äëƒÁİèaGù‡Ñ 0úɏ>wî‡IցaŞHƒÜÀ@„ÈĥŽ j0âJ£Tq X>v\rcBûĜqn€Ñ²v@+ÚrFuİ-a:,¸îŻ¨„ÊÚŜ“€QĠe'û€Ÿçj—:„t÷2~ñ ú_‡ï~2}4½^ƒ‘^£EJ¨Í˜ lœ^H²@%Iñ·Ùêj\ LĊÛĊ‡ì<ŒVÓŭ0%ġù3-€f Tn` tN˜Î†°¤ÜâĤcÉsAġFİj’%Êhu-2,*ˆm ÓµÀ¨bœö!|s_ò‚fŞnoşFk÷>adÏEÙĞtx÷2.ŝŝġŸ Ûî}a<}8ĉ0ڛN§ı22-êg×\~~r÷eÉU_ûSEmŸ7FZ ´ÌT²L‚ì<*n\$£0J1M²œÑ€ž:°RA dQêj†ıyFeTm„ŒëŒìßΙÚV;.µŬ\l˜ƒ‘ÌŭLên·%\4B˘X-]ğoFŽ£˘Éġ‹¸öĠO"zŝÏFnws½1Żä0J’D3ó~lÛTûpA¤VPUDûÑŞ0BĊ5|-  ÔµV0eż`Ĝ›î5ŭh0ú쵉m*7(!BA EÒÜóóŒ\A›2ÊaÄ5ċ BívtXQqûە—†ĊêĈİÙÈÛ{ÓɢŜtuµAl݁á0˘ìHŞâĴ!˜‹Ĝûê§ŭĉ§Go÷2^Ç—ĈñÎt:h­S"˘N§ˆˆĜó2(@¤ò˙íçû?`"ûıĜÏç`fż7÷ı_‹_c²‘Ĵöbq³Öš MÓe eJj²Ë~Á$MWHGZFcǎġĉ†ë=ŭŝŝäGŸ{êĊ”ÔçŻ'˜ĤҌ­(ƒQÇ6KU PCoşƒ„étEñ8ĉ†ëIkÎH¤Yıdi×îE0šĊIF‹j{V,zuż>ˆa‘ó·ÊıJEÉ #ôè2&_ûúßŭìèÁŭïM'+išŽŒ1)Q·ÛíFQD"˘‰È8LDF)e,pX)erè(ĜŝĴ çĞó} ƒ-v6~ħË03cÄ£1Ĵ³ĊZkN’ÄäÀr`% E7&‘ÚdIï²ğa¤ê@Z£sï˙à‡í7Ÿz)!ġık b#Pœ)£žeĦj`¨ˆm Ñ\£Ô\)µ5JmÓ5ÁˆŜtĵL÷ëċ0ŞşéĉĠ4¨!qs­Xg´İü˘“ĝĜ½ìĥáž0A`;ı@ö.cú­?Ċĉż2={ĵ÷FšÄ3TÔív70T"²UƒŻ!ù˙9j`Ş_ñ{(ŬXĜÎÖ£ 9”DD3s*"İ1&ĠZ'išĤZkÇq2›Íôl6Ó Šo Ï.SE-m˙‹OWúöz Ŭ90ŞÇäW‡ÑÓï˙à‡?–Áè³FHK7]BǎhëÚÍîĜñ}Ì3jË•“^çtìĵrI­^gŒêĊeA‘İ,20,Qcz[X Ew0)bÊV,$Ġ~•™² RŸe'Šdż€czġU܃xv×ÉÁÉl"Aô;ÎĥRŠşŬî1I'ô& ŸĦ¸:|œ˙Û #Ğ„¤üZI)‰ˆä mS)>˜9‘XDĤĈ˜Yŝ‘$Iœ$É4ŽÙd2I'“‰ŽĜ,€Ó²ĵaSa³Àî˙óoö˙ŝÓâ›ĞzÊèCûͧ^L³Ŝt3“…é6AWBÛ}AĠNw*ëÂK Ü#^E­Ò(íŽ9`û}Û¤×e0jíÀĉşĞmr€:£âŬÍRŞ!7Lç”x¨â{EdĦ%Ċ°}ïc|W4™mŬvóDO ‘Ú&…3DJHI™Ş@ŠHeÉn‡”ŭÜ^ĥ @Š@ ÌŬ+Ö^)ìù(ħ‘&³Hž“ÌŠ ³Żm§x§´Rïì×ĜÁw° Ĵĥ“ށ=˙Ӆ„,îÇĠKMiû[ıç,âZöí7YD0Ù½>‰G;c"Ò뗇“ë—v,ˆf"2‘‰ˆŒ™ylŒ÷ûŭĦÖz”ĤéĝĜħc“8Ž'qφaÇq:ġÀÔŞ–v˙_#ûŝ˙rgġ =ŒÚa´µµĠßŜŜ>ĥµµuĤßï?ÜívŸ|ìé÷Cŭͧ^´aş„3 ²š‘“kp.½ 5$7#^¤ŒZĥ[ğóŽâ tÎĜqYeƒh€Qk†&§Ŭ˘ gUk·´ÜÖĠ™ò ‹F AXöt¸Ô[~âĝ}w÷²„Š@Ħ‚’ĴË·RöäŠHJeĊÑA˜M‘UÊJ‹ şDlH‘‹Ŭé…Q™Ú3ùħ')kĜ*@ÎL*0 D‘ Dëà- Àù™äûw .vâŞäW2ŝĈžŠJ'İ„œ÷ „({h.Ġ=eÇĉX 0èèÙ¸"³Ŭ‹3ÙK&£xïÂËWŻżúŭ7†^z™w™y'˙_k½›Ĥé^šĤÁ`0žÍf“ñx<FiÇf:ê%`’–0Ŝœœˆè#ùÈJPúĝÇ?°ĊiÍ`öûŭÈÂh{kkëtżß¸×ëe0²aşÏÛyF¤í :ÔĴŒ¤ŒœÙ@•É­KşvW†ëĦŜAŜPÑĞ̇⚇TĥH¤Îhż]ğW€‘`²rš$7òÍNŻOEċŜ Z Ĉӏ²['Ĵ‚P! * ÌÂaİŞÀ6Ó !ğKö=E˜Tíqşcò‡a7w 3x¸ż›oÀœ2De/†d™ÒbÙŝ.˜ŠÉÀ"@ 2xĜwIŜd*{İ WÙÇM eU¨…´8;*ƒBK,mcÒA`°ĤúÖÍ%ÛÛ··’C+W9É£YnQ  ì!ħ€AàԀ R0İ).SÍ`RH4°  M BR´µ Î;1¸kóœzügy*zGOéôâKëŻ~çÂĊo}öğñúù(Št:+ZëëŬn÷zżßżħħ1 ét:ŬÛÛKÀĵ½‹Ñnt¨œ½˙ĝÇW†’WH·DûQ¤ÀQF.ŒÎôûŭ‡z½Ŝ“³Ê(&ġÙë R,èÛFİPÖµğAĠa$Ғ3j²vsuž/˜ôZi”Šù˘WAKΨĉĤk ż­£ò>çäWkÎè 0j/”•Fċa:jUVĠ°Tħġ˙”ÛÂxŞ1i@*ÈġŒ@˜@Únêœ)ˆ@u°Ñ`ğ´)T0, ğÑS lĉ§ÙJ@bL OEYI[1š³‘F€P!ÈUŽ1 @U݆@¸ÜÔĞħÊ\~gSnskĦäZYHäW?9§.R”A!Yċ•=~Ê_Q)Żr²aB*BÇä…ÀÌÙóÈß͜ĠöÁé ) @7Èàk˙N°RYʖOLGÁ‰´hc*‚B˘ñHëSĵ`2§Ğ 6zQtöĝİ“?ÀÉGßñ·ŜFğ/ïîĵôĠ×.ûsßN§£×˘(ş¨µÒív/÷z½ë³ÙlŻ×ë&“Ét4ċĦôÑß|ï’LĊ, ”3k· ÓuZ`TôžC9²Ħ#³ÀÚmj“^çşv·äŒòú·aiñ^eYĜµğ)ùğż ë#žË•F9zUy<4×C!+d†ÓXgONĵךlUkqÁ ½Êş-U’ EE6L—Ġ1…*+PökjxMdQŸ@4‹]ĦYĝß%{e[Ŝná<ކZl˙Òzŝ,,Ĥi=…êEÜ"’)&Rm2µ¤ħ!ÌRĈ$1ÇS TPa€A?ÄwġĝÙ lŒ~pġê_êóßûĤ1ĉ5­ġq_œÍf×ĈñÎh4š ‡ĜQKmMv›ŠlçbmP: 9¤# ¤`TŬW`†a°ħħmlltƒÁ`kkëĝĈĈĈ™^Ż÷`·Û}üѧ~ôÇ>ôkżùîSRŸıš Ö hÁ@}EèˆìĈäIïş2B9[ÈĜ䪑jżı•ĈŽÏĥ–ÍWM½Ah%L' ğvϙ –)£;F9¤ÚŸ´râĜ$ŝlb0§™"ħêäĜÄó ‘À†ÛrG^`áĜ^wYà#ÊöC²²SfEóa¸ċĊY‚WKŽ/Vé–!íĉ7áċÇyU0@HYX@ÊÍ7!Kwk#HdPJ³Ĝ`ŞĜ`<3˜$†@Ħ?èàŝğzxòMlŒ_ĵvġË˙ۗgW^ŝĤÖú•4M_ŸÍf'“ɵáp8F³Ñh”L§SƒöİÀ|P(yS-âÚAadt½ÍÍÍ­ÍÍ͓ŭ~˙LŻ×{¨Óé<ŝĜSïûџüĜoóû1İÏîd0 £^1éĥšaÔàt?0j Ó1WsF%Œd%7]ĊOwC퀎Œ–^%KĠe—jĈp/ÑY‚Šc,EH*˙•îaħ9'çĦÙ0˜X@qì”d³çBe²E¸öF9ĦÑ})‡Ÿ 0ZMİĴĴŒ*˜†Û\#i?‹$”Ĵü¸ÄĤÛAHˆ (ôF/Tè%½è„q'ÀpŞO5ĤIŠïbĵza„ûî>uòÑg˙ċOŸĵĝĠ·í~ġ˙ûé`6:”Ú ‚ †áċ v•R ÒÑh¤Q}{×Thï4~äwGH5ut ;vĴ·µµĠÛÚÚÚŜĜĜ8Ġï÷ïívğw{½·üÄŻüê?ü“?wöğcĤÏ]O*cÇûŠì¤×ìä$g„DŬM'K`dP†ÁċŒÚŬt²˙Ŭ¸‘v@7£ecÇ[a$K6ŠƒÀÈŬbkχE0%˜Muİ›ĜĦO‹÷İ4@8‹œ+O"Û³ rfÙÎ.LÈdq?‚lğ‡ĞĴ픇Ñ퇑ĞC@ "˘:£“D*ÀhFĜ›j(N1K5^œi\ĵ:ûNżŭŝüħ_LñżBçżñ…JJİ‹a^ ‚`AbGeċg/È-Ŭ1P 8Œhż0êġzáĈĈFw{{{ckkëĝ`0¸§ßï?ét;óèïŭùŭФ§îŬĝüN‚F:³€jÁħ€U‚Î4RΤWiPFĠ{Nˆ£ŒÚ`¤­/40Ĵ£†Œ–oŬ ¤ĤŒVĜŒ¤ŒĤĊİĈp/)ë4‹__#.Żò5*“öĊ…”×Á(Ό6…ĵĉ†ÊşĤz·Y}ƒßo˜-µ(lÖv3Ğ„V…‘ĴÈZtm…ħOĠ–"A($YhÖĉ @!R‘vÇ ŒQ€£ĦàĊdˆŜÙ'~ċÛÇ?{F}ç˙›RŞOD]T¨”şJDC˜L&°y%U}wĴ%ݐn-Œ°_mmmu·ĥĥǎ;1 Îöz½‡şŬîïĝñ™ô/~ä2EÁ_]žâêL`tĤTÙyF@*˘aÒkŒšÂt9Œ²0XÈȂŜt| 7]hY¸ ,V/7Xôş ŒÚzÓ-JdÜh˜fÄħ:ĵ)#Tt’wrwĊQLYíO–×Ë.zó0]6iֆ)³S“-T%ÊŝŽHlYÁ‚6fF· Fùí²œ` "›/ĥ¨Ĝ¤ˆ …4Ġ¸8‹1™şûÔû½ïܽǣççOŬ "Šˆ(TÙ" %²PÊOwµ”pURxÄaÔş[£Ç677ï²0z¤ÓéĵċÇ˙ÑŻŝÜ?ów|a”âË;3ÌL–ĵLM6ϨK™µ;R”9§œŒĞêÖnİLo-댤ތ\q“›nu5ĉŒ6£&xìF²œÑê0’et`dϞxf0&E#, ÓeʨGÎy!VJné½-ReG‚1Aì56™‚-„„².œŸî´ajˆ_{Ŭıżvy€Ĝcd@½`oB˜Ĉiv~ĈŜĠÒD#9~ĉäé÷üËżÓùöżÛîíY(‘3zbii߯Cia§££˜CZTôş*ŒîëġzvğŬ·ŭô˙óÌ3?qúó×|c˜‚@†   ÀŽÈ­ŬŽ“rSÊ!“ï‰k·;’\\e䎐Àœµ{ Ò>Ϩ2quI˜N¤=ÏÒ\×sX0’e´FÒÔµ{ʈY0ÚËTÑ\@Ĵ˘ŒZ,ĜM†\ ħTzF‰ġŠ}ĉĴRÊËt9/Êĵ5ûŬ F9˜².\~ĥĠ ÙÚ PYS²šä˘ı'‰[bí–U6ùÖ Ŝçïï#uH0*Cx@ €!Ĵ ÷1ˆ(LS)žNRœ5³ÙÛzüŸèüNŻğóŭY‰%‰1óġü&jPr›Ïsƒ~?rĦğˆA `ÔԅA…aäaşFŭ~˙ħŝĈĈ;~îןû›'ŜġSŸğžà{#fÖ 6Ù Ó³|QhóEäԆ°³ƒ 0â:Œ¸Éڍ9kw #İv`ZÎ rFKÂtMŭÜÍvż9£Ġ`$+„éÚkû‰ŭÁhfUQe4.íWaN•a:*Cdğ… ÀÄóĦ~ÇYWôjȎ _EÙĜ5ƒŽ*‰ °–E¨²ôbcġŸáĤÂHš`$m›ÂŠÀİ:û‹×ݲħ¸_´ù,€Qŝz“µîgEĥ Üa°„Ö%›f] I ­._BëEéżüc§Ġï‡Ŭk/Ĝ›”|Xà1FìÜ%Tß9İœd6Â$H‡ #Ú/Œ677ğ›››NÎèэ­­wŝÂ˙áßüÂÖ[ßuâŻÄĝÁĀ93/-è"K(ga:ilÉÖ:v܆ŸĉsF› :0Ha o40ìFÒĤ“eÒ­†‘, ÓF) Ĉ{ ’Ĝ o¤]yşÜ"*ü°ç.ÈQFâlÖl‡3Š˘Şc?eÎÈ풭!Êî9R„çÊü‘UFs! %‘– µö„i?ê`Q#Y£Erm9Œ¨vĊëC¨vŒĉBŸĊèAĝÔôËn$BJ%JĥŜ, €N¨²"x#0,0 m[(ħ0d˘q] ^Èüƒ÷ß-@Ŭkß`1ùÒZ³1Ff³YêìuRSI­ù¤£ ˜ŽRÈn˜*áşĵÎh{{ğo­Ŭgz½Ŝ#ƒÁÛá7˙OgÑ·m˙Ù^ž1Xg¨vz1şt!ĊÔpIÂÎû,ÏUœuKëŒ`ĵ‘ĉ-0’–¨FSoşĥ÷ñ~ÖĉT>ŒVÈ3ŬŒf3ñ0Í~6„#)£òŬ=ĤĞ(£ü2[Êĥ5Y+8ÛQZ²<ƒ ,°€ĵĈ‰,Ĝ¤è!”ıò Ž8WeR‘“ObĠĥ:ŒœQ+Œd˙Q²ùɽHùŻ ŞĤŻŬzB* £³×–‘ Éoœ¨Áġ˜_LJŜĊ#ëê @`˘ ’ìhµgҀ('¸vÍ@§½`ïä÷£ĈYW^L™95Ĉ¤išê4MĊNĴmÊ%ÑmèsH71T‡•4×hsssk0ÜÓëġìt:O~W?úó½GßĥŭgWcĵna”êĴ żĦ|žQ^y·²’G) bœÖ@Ċh‰ÌÀ­½é°`¸žĴ4éµİ7ŬëŒÚ6$nh”z0Zm¸ŜáÀÈhÁh˜ ILe$ùœ2˘ÊÈ*šÊ4)˙ĤˆüÙ8çıFç"k —HÀDP;!û<ƒ“pq^Q<ġtꁇŜġÌżĝ—ç~8úÚ^Š$h°f›@ĉ,g„l…[Ÿë`ŞĜ³ëĴ˜q[üh×yW;^-zm†7t`(rG Ŝñ>rF‡£E6ġ$6î&e£ÈEa:¸işÚw µ·{6[ÉŬŬ­-œ%ɘĊNžÍÂıE-‘½Z'ݎO' £ÌD!5;·“Ïp,ĉÔĜH”çin¤ÎhURkù•ÑŞ5OsŻ@ĉrp2#T˘$ııDŠıUä@/;OdîċuKB`/Lòn0@'dÄİmF*S^Ú ž&^ë=ŭà)óÒğ{üúNŻ×Û “8ŽşsùµÙżL)\s-RGsù£0 hsss³ßïŸìvğ÷EQôèû~ġcÏU/ĝüĠ)Rc‘ÎcÄ@t$ïÎLĊĈP\JäÒÊ÷q EóS۝Ħp×íFĞĥZ[µ5¸Uĉ䴅l ³t‹ž§Ô7ċV‡˜޸’K´0;G¨ÊË9AĠj™ìOàŽı –2O”&ì×y,¸’ĞŞZıYV00ÈMÓ-WFKÜt¸A9y^÷—]7¤{BUxW­à\ƒüvUĝ ·à;#Kh>żUv@‘²šÊ]`•Rœš2d—ĞpOô{]únŝ§ßŝ—W:½Óëġ†ŭ~:™Lâ0 µUImĦğ#’Žší rIŞßï‡ŭ~ğ×ëît:<ñĦŸ{fóá·lĉzŒ‰µv³ İe'^”uîĤÚ{îUµ XżË. %ŒäN†ŻxĊşO™9eµFF3övÍËaÔb`¨Œu`”7D…3Şj–ŠŝtR8´r']nÏgÊ!ïÀŽ•[¸¸N/{ÚċVó|F ÂüÀĦ1÷G‡ċĤ[YaıÚÚ§a?nşĤ²…Ёİ`ŬÓ@R˜GˆŞżÔ ”–ü<7—O*BüRàDy3Dˆ‚,tW<6c *´†Nî=6xĊĵÙû£Ż]évğ;ƒÁ`”$É,Žc3r•¤ZàsdTR¸ĈZ¤Žĉ&żvğŬ`cc£3 ŭ~˙d§ÓıwóÄÉ'ßùw˙áŻN5Ŝ˜1 ۑàŒMx.uµCFì í*ä90Ş+#Fónş› #ÁAzÓa1ŒxĊ0Ŭ>a$ue´M'“qRıs9£ıëIdL¨vuOyžˆĦ$30°… jÈşéì×ı=ßíúQä+N­L>Ċĥĵş&)_|ŞżmÚ:0`0Â:Áh‰JkĦs^™â\ıŬġT³ğaşZ•š0{4hı+Χ<ĴÏeŻK²³ħB"D!Ġġלmac3ÄĞòևï~xǘ˽^ïZżßġûŭx6›ċ*İ)tGˎÒÁàT73TrGQ…½~żżŬívOGQôÀ{ŝÁŻ~€76£ç/ͲŬ)Ïíìù0´<–ïŽ ¨lèRËA*‡ÁÈÙ7Fġ+ÚĠa$ĠŒA-ç³ïœÑɲ0ŬŠ0Îĉ%‰Y:Ja?n:‡CR4HŞ…ÒÚ-ĸŝÉH#&çŠe‡o7L”7Z䌜ĞŭŒŞ94Š2’`„ÀHV :qw”vq÷BƒjO€j;ıá<Çĵ@2˙YaĊ§Š:%g–U~!k¸ÜKvBp@óòE2ğݰÁd÷ĞúÑàĞŻDQtı×ëínllLĤÓiê¨$iĜ7aO]˰ŬQíÔà*$ 0 ~żżĠëġèŜÓo׏Üóô³w??L°—ˆM+°áÊ9ÂĥuAyŝ²ÈüUgP5—JC#Œd~ìĝaÀH„é¨í S8\o1Œdá<£ƒÁ(M옖ƒÁ¨İCA›J´!4ħááŞë2O€ ¨òû…—@ʖ?"2y>ˆ­Â­Ö‘8;$˜£‹)£›ZôzĝuF•Ñ K`ÔĤ› R˙YE³ÓŭÂ9=jġ^ġ0] #Ş´rQcË&·›‹ï_²BƒJA˜Ê2ôCàBĥÓ÷Ó‹"}Ûí^í÷ûN§3³ı$í‘GN%…k ÂrCƒÛ<5ê÷û½^Żw,Š˘SaŜûäßüĊjĦïî™Ĵ6YG·Û€RċÉÇÈkDœÚŽšk8ß`sÀNıµ[êġ F²˘ġµıhY˜îa´pžÑ"µ$jż?'˜NÒ–ÛşeDn£…R%™< î8éôÉÎ?Ê#vq*Áäô—#wê,ŞRĵ,ĥt&ÈiLŞĉO’ö†½ae´èĜŜ„0Ŭ 0jŝ–5ÍeQÈ9~TfKÔPgTvYçB­‚œÜĠî§R."YżÌz’R6y*R½ ³­:fq lœQŻì=ĝÔáġïGQtħÛí^ï÷û£étšZ ı*‰ZTR=-HĞjaïş0 ƒN§öz½n·{ĵÓéœûÉ·żġĝïĜŝò0…f3AƒJy:ŞlĝLY"ş)ԈÌM…-šž:0*:wŒVj”ZyßÊ>sFËa$8ÄFݵżçyŞJtÒööf)FM.¨2ĴR5/¸½éHÜ0K^áı9Wĝċ°ûJá.gÌġ҃۵[P-ŜtsFÖîÛ£[•3Z#Z‰M ŠçÂtE/ÀJkĤRġ¸ŭÜ^&ɁÔÜS(.VóÂYÇy§¨½ó3`½áî;ġh½˘(}­Ûí^ì÷û;Ŭnw6NóħçŞJKϤĊ!ş6…TthPJİ~żßëvğ[Q ‚àô?ŭ oiĦW†ĈĤe9†zˆKı£ÇÙ&ĞóDôÜ:)6$·­ÛhŒ\4ÀH°BoşĦ¸ƒšaT/l=\-;Ŝ|ğqĴ1ڋ+9½VFT†_İòĵì|#–ı‡œ…Ŭ¤°+45E 'U„Ĝáì}nLCX‘€B͇šœ+üš½ùĉċŒjíĉĠD-­ħ˘ù ĤĵZ¨í4T:纪;n:§<¤€͇yĉ‡n!<—û܋™&X :A ¤wŻş0=óγáĝûQïġzW;Î8‚ÄS‡Q]­ġ ×DË:z`êġzĦÒħ0 ONžz`ûíï9ù‰†ħvà‚µ“×ís•_+vSĴž2_ƒǤXı›ç™&ñ’Ŝt‘,6ÁhÑĤt;a$"RÌĤ邐ßt5Kż[4 Sîe$uĠʘÊBĠ àœZTÊğ98À)ĊtĴÀı%vRëón˜< 7ÓMw`´Ş2Âŝ`TŻ5Іìx~—vœvMù#¸a:T!T Ġ9ı¨Ö q&p>  „à<— D!Äş›wáüô{ïS/Ŭ†á‰N§³Ùï÷w£( 1ĤeŻĴ3’ÖQ)ċÖA*Ġív;Ŭn·EÑħ0 OŬ˙“?ûŽ˜Cġò,ĥ ÁĴB^ÚNn'g”Ï$˘†ÉmŞÊŽó*oé­#$ɒŜt‘´İüĊ0’sF·FZ3†{qCmэÁHê?£Ú—îcaŞùÁ¸á’ó’dmJGѸÓUFµŽĊeŽ´ä…^“FQe$‡ŻŒšÜtĠÇX&W#r‘£j+›N5L;’ä8'QíwW˘ó”\·mĤ”Êĵtó{Ǥ ZAÖ)bœìïÒİÇ7Âó/FQ´ĠívûŬnw<›Í޽ŸŬŻÛÔÒÚ¨§u55Ĵ˘Ž(‚ ÛíFQ Â0Ü‚àÔÉw&ŽĞ*M TtWÒcœQ;_ p£Óéô:N0™LšŠb—…ìÖPá¨ÎĞ_)DQ†a¸ÁfĜél÷Ï>iá EQétşAt•Rƒí'Ŝ~żét‚ó×ÒĴ£wn™“fċ{4#ï+Ĉˆ²Ğ"wšhíÊDj{qTRuOĉ˘ċÌíW룝g´Œ„ìEçaäat‹`ÔtFEWv.“;ÒÂŻ ­£È-fvFٗCÊß)™”çP1†,ĤFu‹żÑğ=ì&-ĠQ›Jİ~½(ŠÂ ”1fQĜş[›`$ ÊhMa”&{{ŽÛÈè6Ââ"Ÿ\0ı;ósÁÀV`SZù‹ `íD'z'œ•°ÈbUzxg@2, h€=Ŭż{‹†At‚ ”RŞe/]ûuTô‘R*TJu”R]Tż{úŝ™‘˘àP ÛÜ –ÑĜ~Nö@çqeE͛BnÒíÜPÙ¸k}Úĉú›Ŝ ŒdI˜î–Oz] FÓIV_´ê&áaäatĞaTì˙NAħê§-„×hĤ=ĤŠ*wä ÏuĴ—–óß}.„ÔÙÂ$N#êA °†a^KR Ŝe·‚*Zö5A@aV!u•R=uüÎĠ˜ój#ÁJo4wŜ}1| œumX`$vTQF2݌¤éÁìFĞöĤ[F ‹!F"‚ñÖyy­1ŒêŻqİ–H¨( ކP‚IÂñĊó§0vEeT.Ş İ>bR—ˆ:J݈ˆšMbmy¤ĥݽBZ!„ĜĤŞJݐˆşá`s“şáîNš½×IÚ;só›ĜóŞ^ĤÚöéúŒ˘Z#ε„‘,şí›#kUd ÷b¤){y ıÒiÜΧĝ:} ‹.0óĠÔ̓Ëŝ—ûƒQŝ҅€0¤3ÀltTGu‰("˘ Š˘‡ìnN˜ħó·RŠ‚ ‰($˘¨sòî­Äf,ĊÒd"€4ż ıö&U-{OyrÍ{Âç`$-Àh‘F×î֍oQÎèaÔp˙Ú0övâ,,áaäatÄ`4wˆ Civ(rF-0Ş„ël˜ñ,ƒQ1ë>ȇ†¨Ĝ„EJİÀQH­)Ìğì_‡´ŒĉbŸı:² ) dŬ·ĈȂ7p;ŒÜoĉû†ÊU¸ÓÏcєVwÜnƒššrßè YĤáÂHÚ6BûX’Ô`¸×@ñf…<ŒV…n>Œ°ı7GRÖyŬ’ko~¤Ĝ;xÁûjĊ @°ÉĈ+ĠAÂÔħê(TJċĤ†E)ݐö £E_“RŠì ˆ( ĥĥúšè×[ Fs8ça;İ€jîv–ÀH°hsşñjuF @W‘´(£6Mga²ôĵy`$FĞÂHn>Œä0BmÎUŝˁŠ ïxi¨%ÚÏħnzωĜFĞÙ§)+ĦŬ÷]k(ÉRž@"˘@@~kSÚ4÷ #^x2°[ĉî/Ô~kSFGF²Ê£Ádœb:ÑFFwŒêŻyĊèıŒĉ ƒ‚ Âœï… @@Dm=ìÖû÷í­²kü9‘ˆ("Rˆ:‘É‹YıŬŒZNRáุ=×8paÄûıJĞ?žl†;†£ÉÌxyŬ‘0š{ĝ‚Öħ7 FîHvJ( TsÙÑ {Ò>Cu•ï)ÈDDJH‘ÑeÑ˘‚Ëj]/Ŝ¤[rF²Jh•7ëцÑĵ!ŒĴSwÊFFw<ŒZ_‡[#; P„!v҄Ú uX…´àÇOìĊš“šRLÒĞCħ$kŬÁí0Zp˘4ÁHZOôġ‚‘4´'ı02F°·ƒxyyŬTeT~@@Ä`AàìËĉËy…´O­ĵòùCLδ×{ġ~aČ%Pıŭ0jsŻŬJiÍĜÛM† zyyŬÙù8d›é1#TœÚ~ù$"rÔBu먐V•ˆ3‹ˆ°ˆ°¤İİŞ6”ïN‘Ĵ2Bbż0’ĥ7Ôr%‰Áh˜4„5=Œ<Œ<Œn ŒÊ˜„ddŒPĥ-BDä¨Aè¨İPĈúğ™"œ&i ĥlcU-GFĵB˜nß0ÂĜqF<3’ĊoV##£UFd‘8…RÌ"b°dkÙĊ½›Y+—:b0rĦÄö3&Êyɏ*ŒŠĴ‡ #·ıë!Àh:ÑFFF·FÎ{0ß …S(`8 13 Žè âƒffpĥŒˆžŒĤ¤* H’“0²?á6ÀH–´L949ïqıAGĥAê› F0z³ÁhÙëpËtġ L”‚Iˆh{ÎMÉéĉI,´ˆèôú•ħpĤŒ(PÖ ‰Ċí8j0⛠#ikcÔVßp0’UĈŽ7ÁHšrVc›7!ŒÄèÍ#Y#ĠŸ+ċ·/xˆnȉˆ¤ÌĴ™™môÈé&ÊD!H,"İıvy¨ĜˆI@Î~µ"ŒK6êÀHö?éġFa$ â¨Ö,vN,.ğu{yyŬ¨d/H3C7àDD´…’‘e;Ù²ï{ íçĊbfÖZ³1&1Ĉ$ĴÓO‡Zh#‚”²Ó[nEÊ Yµ/5tż™0ât0’öÇ0#ÍYÁĞö0ò0ò0ş½0²?Q!(P™ıAO 9fĉ8Ûµ1Ĉ˜ƒî­·{­ƒİá@/ŽÖZÛЁĜ'W.ÌzaP¨'5y%7Fĵî0âòpc‡+Àˆµñ0ò0ò0Z‡0jû¨’ì˘Czd÷ÁÔ£Ŭ‘Ë%—]ĦÑZ³Ö:5Ĉ$"2Ñ_oTްgİĥ§Ğ ,:4'Ĵ Œò$ 2À} Àĉ`”ìízyyŬvQġ¸Sa&Èä6#s™gĈ˜ĜcĴËaŝ€Ò~ ³¨Ds.CcŒa­u޵žcĈúüĞ×Ub•ö êp`”Ïš{`$s@œ ÓíF&5ĜŬ³ÙRFFFëĦŒDR@‚”‚è=€'²éKĈ˜™Ö:MÓ4ĠZó ûèZ†ïÖQ!I  Ş†hfN’$5ĈÄZëİ~ñ[²‰zĤ¸˘PŒ¸ú°Zàħ/ 9(ŒZFÎSÓIĤŒ˜=Œ<Œ<ŒÖ Fî× &—ħİfSˆcÚÒZhŬ€$ûü½bëÔZsš­™1f˘ŻœżDğW³YʚĴ²–ƒÁˆ|K½/ÎAaäĤ–ç/x.ƒQĥW„Q>Żİ~ğ:ĠĜÛó0ò0ò0Zı³Ñ ÙĝrEàÉyëê13Œ1­uœ$‰af^yò@:hUOifħ!ğXk=ÖZÍkßFQ'’}fJÉâš7×í µQàK†ëŒ‘–7ş Ĉ0Ŭ~a”ßYÓiĥFRëáİóïëT—MR=Œ<Œ<ŒÖH•ß ħ}V “K8ыĈ˜‘Öz–Ĥi˘µÖµK`iˆ:ÉşÂjŬ€$+|×"ħÖÚÄq<ÓZ1ğú{Ï_ ! +lT `ÓPSôç‘ö7AŒ*n½ĥsıĦç 0*ĜX‰ĥœ?<â„éÜç` #ı‰0Â-€<Œ<ŒîP•yP@f;À욜è™×´Ö£4M§6…a–D |ÈîPj£yċ#MS$Iœ$É8I’Ħùĉ—^ ÓĜ1T~4Œ:m‡QqGÜ|Bí§Qê2‰,XˆµUß8œ3KZT‡‘û}“hìíŬÉ-€‘xyŬIç¤@A*{ÇŻb;•è+’$I̒ŭs­µî!ğ…r3Iĥa˘µŜӓÑzŭ{C„•9U+œ¤ânì-aş‚Qžž*JƒĥZ #,ë‰çaäaäatdtĊÜ#ğaPÔï„S›rÙ³“Ĥé(Ži’$é‚= Âuk[çŬ˘­HßÄqœ&I2M’d˜ĤéuŝÚ_ĵÂA˜¨P€ ”ċ—ĉbÙĤ àa$vž‘ÔÚġÜŒĉŸ€‡‘‡‘‡Ñ£ú`ÊÜZFÀädzQîÈ÷µÖ;išŽ’$™iŞ­ĦaхüZŻu­Cj;ܕĴ 3KšĤz:Î’$ÙK’äóßëŻ& R!}Ċnˆ‚;êŜ ŒŞž†ƒ6JmiQdò=\–#½FÚÈÈhŭ•Q"" €N ŝ•?úá4I 0à|S·­…VßÀµvß Œ*ŠŒk›V#DeÁ ##£#£üß@eTÍ|ġëxĝTrš&ç82™L†ÖÌ`„뎔ÛŞż \˙pUÒt:½:›Í.tżô'_SkJ§ ’‚E„ġ‚‘ˆ4wVh‚QÓğ` ŒŒ‘Ċ›–‡QŭIŜtÁ¨ŭâìMĤĴ (˘|ġkĜHߘŜ3ç88›ÍM§ÓÑl6‹1z2’ÔÒÚ(Ĥu²}ŻĥÀÈ: q’$Ét:L&“Ŭétz1Ž×Nŝ·÷×ÓéT 3¨ˆl˘°z%Ò £Ê!”–“>·6Ĵ£Ş#Ż}ĵ‰ÎrFŒdĠMÂhŜÌrĝ0£ĉûf‡Qn`€ ˘xĝCĊ/Ë[Ïvżž$Éë³Ùìòd2N§Óİ­=2 áşĥ°°Ĉ3’Öħ0v•°]S1Ĉޤáx<6Nߐ×í­oŭċë³½kà8F r0ÉÜáİ”•Ġ–Hís+ސ †‘ba‚bp¤‡‘‡‘‡ÑрQ@ĥEPt#€b˜ Ÿ›Ó‹ƒˆ_˜ÍfĤÓé5ËĠ‘-Z–CZKet”BvX!çĊ7Ìl’$Is•4™L.M§Ó×6ż˙û\ĝúö8Ŭ…)ğfeÒ¸²Úp—Üz˘íF¸Y0r9ɌÑ(E1£ËÈÈèhÀH”G]ÂDsá‹èż?rO÷Kqż>N/ÇŬÙl6ĠZkÇÌ#†ïÔpèa#ï¸ż˙|šÄ?œN§ĈñġÉd2šÍfħ5ħL­2zbm@€\˙Ħ}.|›R2TšĤét:A0 rT˙žÏüŝօŸĝ'ÏP*ÚÀZ²&ĴŠšg!5Mz]r6ÂH–ĵqZ`$-ÊH0™¤Hb##£##dßR!T'oÀĵögxË)~i#˘oŒFÓ×Çñ%Ўâ4MSğß4½ŽŒ‘a]´*ĴĜ~ž˙OÎA ş£4M“Éd2QJJݎRŞğyùÎİ/üçÁ÷˙ŬwoÜ}?½M(Q™%Z·vEmVF+Ì3ÚO£Ti{£éLc6ÓFFFG F$%Œ˘(P³óʟàŜÎĠ+gŽo|~<ż2™L.ŒF£ét:M’$vŒ mâ­uĜn´Èy'58‘½R(वÖD”CéšR*"˘hëµï„'ƒ?ê_}ÇO<9¸˙1 6ŽB`0DgfR1ÒĤk™gtóFH,†QkL'݇‘‡‘‡Ñ:¨^÷ë¤#‚t:YŻşô:ôĞŒcñwG?râ/§ÓÉ˓ÉäÑhtu:Žâ8Îğ2Ô#Cu0ĞY× Pë$W Ñ•„”ƒ‰Ò4M‰HÑH)Úσ͗żĦîNĤ|?û–İÎÖ 0¤PI–èFHÜ Œ’Ô`<ö0ò0ò0:20E  FD€ÙŝáâĝìÛ{?òèİżˆgÓïÇW‡áċñxĵ7™LĤĥ+ƒvÂuŒ†\z˜–]{ @)5¨áëâÊAkÎf3RJ ‰¨¨‹ĵñ}ÜÍ&½¤ú¸ï N‚Ao°‡1Bâa¤5c˙üġ^ {Ÿ5<ˆĊ0Âr-ıïıcCT*× \Éùµò˘€”HeÇ-ȆéA)P @a¤ğHßĝ̅Ïáueçñ·œy>ż4ŜÇ&“ÉUÛhl{Ô%޵[Ż ŽšúÖG¨CQRH­×]5ċTÏ'µ)âÌJÓ45Ĉˆ1F´ÖĈ£1š™µˆ¤§żñ§úİg’ÇŜ;è? @Qħs²Ê‚Ğ(Ó0„í0Ò)c2N=ŒŽŒŠ*şêŭQċ̓ù3:5•Rŭ½ê5YUq9JĦá2N7ĜĊUż‘ĈÇY=Ô˘šj p‘:l²- G/S~û­a:Ş ĞÊíÔŝĥĝÙOí7”m@§²âVû}‚ H|úŻÀ\ĝĥĝâĝÑûïŝŝöàÌwâ8>?žN/N§Ó+D{Óét’ĤiRƒ‘Y!\·jɛn˘JŞoQŞċ’ˆ–Ŭ3#MSä9%c cŒˆáğŸ˙žÑ?5SŠÄ*%Z`Í>ħŒFFk#g£Ĥb³¤ı=ħ1LWÀˆÛc50TË[dáğEÜçäÚBxċòîİE ĥÂKž+µç£Zà+Ë`G•7&¤éı•Ż5Qö>´0B€ŒÎĥ› È>Œ€˘0ûàŒD€ÑÈÚğ=ŒÖFÈú‘A)(˘D֜ͷ!ˆdċ ġÌY˜ÇÎ=ÉnS•³şòñ(DTÛûq/YÛa0gccE¤²IÄl ‚Â\ìĜĜßÍÛdY•/†³Ç§¨˘ H1NÓ^EöœQV%”#·Em@NĜÍ‚íġ£Ê^“ìëĵ{rÎ})§ĝ°0R“ç ^E|„³üğ Û×Îd[e0Êş#n7˘lP…èt²×RQö¨Nfáĥǃ˘,ĵǓ×a~ĉÒó§oè³ÇÂëg9ùÒFwr’$—G£ÑĠÙlvu:îL§Ó½ét:žÍfSĞŠÒި-odVÌ-‚“ÒMŬQ-Ÿ¤ìĵ[Ş–´ÖٛĜŽqu§ıŜŭµOá"Ó3É£ïÙ ĥî$€ Ĵ%“gù{i?0’zrıħŽG Œö0ZgeDÙ=:dÍ2Eµ–SI셽ŬȊË'†Ù(”b4l7çl“¤^Ï^İĞ NĊ /QXq“˘âŞ=Ûì (êd?3\Ïüŝ);Ĉdï“eƒ=öJ•@çËdYg5q”oàùïŞ|sZĝQ6ò·p J8@Deƒò!šD°‚ìï „íÏİ`Rz˘,œ&ĈdŞC%˜”}lĈdϽÚçi2ˆ*U‚  P^J"ûÚ$àÉEÈî‹àë/A%WÍŬ[ÁŜé{ĥß8yì—Ò4½žĤéġ½½ñµ8Žwf³Ù9>ŽxÇqÜ"nùzYì²é°Gb…wˆÂUATı˜2I’Èh4šğíÓÏ—ϘGŜµnÂʘʤم0’eÔ#“İFšÚÀF9£B]EYB›Â,Ħ]°˘ÀBŞŸ²{r¨PĦ2\&2˜ T%bŻ~Lí*ÊTš8ş‘v"ĥw£a;Y2€hÎÜa)ƒ‚ 6˘ !S~XuĈP98s8$ˆB({û\LĤÄòsŠÙŭä÷¤XëÒ­ĉ¨½ì\2EGö> %e Àu¨mda“O߁¨ §ÖÎE…*ŜÀ’ !zp RÌèdz ˆw ‹àéUÈô*"™¤ÇÑd{žx°q³ïy­ġÖzo8î&I²Çñ^Ç8ŽÇ³Ùlšğç´ÖݝôÚĦ:ˆö[;wö~ä#‘üH‡µì ş,ŸT‡’Ô‚iË —CI’$Áh4fo*~vÏ_—Ïè‡ħluB˜˜Ħ*;;p›P^ FqlOġZÁH<ŒZA#}ċ3H^ŭ"xt`ĞbÜĵ²› £ûnƒNŞYœÌk¸ıžú'ZòZ89#Áœí{îòo.YӐÄ!j~<+\j6ŭ5§ı›Ĥt€HġXHil¨ÜIħÙïLF€À¤ĜêGÓnMïît£ğÄ1flŒ™£Çál”Ĥé(MÓQ’$8Ž'I’L8ž%I2³6ncóDܝUA´ÌÄPù˙#ùˆŻCş y&(5exVUJ‰ %wŬóü'qòŒy”6ƒÁiFs-׳v†ŒÉ(ġ0:*0  Ñ]ó;ċkŻn‡§gùEŒ1fĈÌь —ĈħòB§é{G2är„Wħıçùc1 ×-3'ÌiœĈq<›˜™1&ÖZOµÖ³$IĤišN“$™iÛ˙Sc²Š§)j=ÄX­%2Ğ7ŽZèÈİĤ’nJ²L--‚Òéç?…K gô£ïŜ Î ‘3ş‚š7ä6CĈÁhèat”ꌄAaûìj÷ß| ÷ßyµ7ze޵%Ir9I’]­ġ”™S &!˘BC× $Ğ@İáç~Ŭ(Ê‹q MĈ–*{üRcLb!“câܔĤiœĤi޵Nó’†ÎÜfŸŸ/Ê5Í=š;_Ž’::’ éĦtP$ıRş<“>üÍèĜ…àˆ!ÚF! ĥjFèÀHŒ‡ii¤0:EŻÌĜÛĦşüä?{àžï˙ö+ÁµïïcfI’ìN§ÓëišN1 3k ” ˜8µiᕯ‡ÔáÉùŸ™9³0kf6ĈÌ:Žŭ$W@,"†™—İ^>ġħäĞÂHŽ2ŒŽlÈî D-WÀ‚OJ2ĉnĝÌóŸÄÈ3úl†Ûg Âl²žlxAR5p7ÛuFGFމĊ¤{3…Ħşôä?}îïŝŻ\ĝÖ""fNg³Ùp6›ks‰iP­Wż-òk˙áıEP‚£”òŽ.FDÄB‰-€ê°X4,o˜d‰*Zvn̙|ÈnŭĦT·„/şòĴlëC”Î~ŭċĵàéƒĜŒŽŸê†àĜÌOojQÄħñ0:Š0"ÊÜlDÚàúà„tÔċÇ˙ÉwÉoÏzo|}Ĵµ&I2œN§â$¸µÍQ,*pÜÏèi§Ó˘žEmPZL‹&ĥÙğ=Ö#ğ£üàJІïÚĦô?Ĉy–¤ż{3<~‚Ѝ°äÓ"j0ÒÚĥò0şċ0˘†żċŭvífÉĈ“˜$8v† ŽĞžşòÄ?}ë)ù_eóü׋+a"J‰HÇq [„½ŸÚ’e‡Ò ޤC’ĴE*k•ÙFsçÄQUGGHıĥ£Éo”Šû8û­?ÁyàúÚ ·Ï€Œ×Y8îŬüĴbÁxäatĞaäĥ,и–QûYċàĴ“‚èĴk‚áׯMqâd_]yâżínúÙ:˙u&"“I’ˆÖ:wsñ’MiaXÙè†AÔt6}]?ĵ‚RZΓԛFwn”Vqßµ+% %óĜ{6İT’U°‹ĥ-el1ċxœ–µKF·>LGóa:W5 ċmÓlñëÂyFΉÀ¤Œë×§8ŬQWŜúÏŜvŠŝ­l˙+4ñ8  JH‡£e KTÒŞpZFÀ }êŽ:Œî íJâÀˆzKĦ$ò~ä=›tìtÖóËim(Âx˜@§|c0Â-€îPĦM9c§ë~¨’†ë‘íH`4L*Ĝ ‚àò˙ôí÷oçPҎZÒ³ÙLk­eE(­’7p:œċ‘۠ĵwݍU•Jù˘;Dwö%ÂâáËNÊĠ ôí?Ċy>`|×& îAÀ Hf:31Ü(ŒäÀHîPQF´p„„8F3îÔìüĊC7˜ÀN vwgÀv?¸ôÄ?yÇ=òÛ²uñ›LDì†ïf³YjŒ‘Û*WÎBWF­ïÀ…„%J‰[ByûV щÈuÜ;îÌğq(Ñ~NlJs?;ûÍ?ĈyáCïٔíÓPQ†`<1ċfçat[•Q#¨$Ÿyƒê¤„âw¸lÍCyDÏön‹3İÁîŜĜì—˙Gïĵ‡~›J()R"2ıRZ%^şó– ß­ ĤúX%4W|ŜŭÙ?ĵŽqxGžióPBíÚׅ9!<`A7ş”÷ۛßŭ)Î3> |÷f¸}F;,8éatËaDn˜nŒŠ_fw[M=IžB*`$İ fÂĜь'ûÁ'ŝé;ïĦßf %£”Ò˜ˆôt:5-Pbìïjڇ't·Ìu‡%DŽ—À ûUEŒ>!wâQ ïĜ³ÌJÙ05\µdœÏW^NG‡y(½§8|`tÏÛ6ÓÎ) Œlg§K¤‡ÑíUF-Ç ˜€PŬU.q201D"”÷Ÿħ7'vöƒ5a÷z 9Ŝ .=ŝOŜuü66/}KĴRÊÍz:ê4Mo$|×zTŭÚ°Û^×e–Uw0ŭÜ'Ê:’ƒ§À=ÖP-a”j _—Òä>ġö-µu  íU´Pdñ0şù0˘6‘ÔBsUı ĥİz’eßrħĊF6ZBL6|ì°9§ĜŬ £àÒ˙ĝ]÷àßÉĉċoWrJDd&“‰NÓyû,n%³RˆÇŻRHQKX1·RĜUD¤÷óŸ´oş#í‘ÒRv°ò!`îÖ#Ù÷ù½ÈKżôĜ*ĵ› ‡˙ò21˖:~_6ùRPâÌ´ñ0ş½ÊÈÍU`„êԇâŝÜIv˘*Ù¤˘ÌFݘL˘° A'¸ôĜ?z÷iú÷\ú–(LŝaĦd’$qĦ´ŞûÎé`Šh öИ–ge•L9iĝN<°Gż0–ÙNĴ,^1š9ĞùÉ6çG~÷òÒ?X(=Š›j‹g :(6âatÓsF¨{”Ĉ§ˆ:Œ¨İË~V™KTŜ ƒ@ ÎU“@HÚÀcgG€½àâ£żòîÓĝ÷²qùی²§[žI’„,”VİèoÚì<˜n>”–)§Ul;ˆŠO5żO=ÖcQ>fَp›l"&TÖÂç‘˙=yéWž¸ŭPzñ/2c“Ó²…ŝ¨nÔÂ| °‚ ÄF‘³şT™ vRl÷‚óŭsgñżòíÊàP³ÙLŒ1ÜrEŻfœ>œw`€­ĉğq5Ŝ@nn@ZŻĊXU!vs€äWÈc%VqÜIħP’G^ü3ĵDxvĴhKm…ÄÖèéq£C‚Qk·èuá>cĠQŝ7.Œ¨l-TݐKYn0;³fğ0ŒÄd­ˆX;ğÁùûéÜYù=ôŻ~[ĴBÊ˙gÇ1k­ÛjëVq}yzşıšż ?àNätsĠQ#wStÁ£œe,'ÊZ„ï~gxIäÙħ‘-uü^ €^‰5D¨yö0:¸2jÉ5ŸdÒà̳ŒgG,[áöŭ(Ò,|G‚¤5çïZÁGVµ‡é¨ÒqĠékgĦƒJÎĥÙo £˘ž5ßä€#²;@ x&0PYsV1¸„Ž‚ó÷ŝ½§Ï.WJÚ97ÙCéNRJŜe·†Ğ—Ğy1i%‚ç:ñBéÑŝ9^|@žEjKEg@@™šÌĵÄÂHŽf˜.çMC˜V^]ÉÖaVo3dùrK¸*+ÎtĜßWı€Â8f0+€œ×µĈñ`ĵqv>|—›,”¤!§´2”üZÓĊ äïw¤u[N _œ‘|ĝċ€jwm ôê_à%EϏËV°u/8V ŽLîĵ˒JFû…ĠòDí·K‹ŝNnÈíĉPœİT[AĥĥĴh$"ÖàIÊûMŭKĜÙÉzß½qïßú^ü~%GĠäîğ¤JÔp4+çµWIkzžÈ›ÖñjÁ {äEħE5³“9vjċŬËŽ™Ÿ[jpbÂìŠÉ Ξ²‡Ñ +£ü|ÉO›&eÔx<¨ÜŠU— ‚Ó ÏŜf*•“¨âĦ Ĉħ΃ƒ0IŠŬ]˘~Ĉ½żôô½ĝ=tŻżaĉN-P˘ĉ¤z>{(­Ûġ7Yüóu\9ŒŒĜ:#ގ ĥ]²ËϽ8Yôiĵ(xv$Ĝ ŽŬ A1B”=ßĵc…‡Qmı#$j Aá3((TŒ%—Rŝ­›,Ê^o!‚C AİlXş@вW΄{­uQ}DşÊûÙ_‰ÒQ0`šˆN@ÁPˆ½Çİĵqöï=}V~_ş;ßÉĈŠ33€=cŒ8}ï¤áÜl²rĝ|Ò: $FfÛö9¤µ\Z2C`ß^ĥÙ*òıӎç‚bm ôÚ§ñ"2£Cpì^P7Ĥ&sVT’‡Ñĵ JT‘²ĊĜĴRä✰š}îYĊPyĝYʁS{Ë.†”p(ŞœŠJxn6: !`Aa¨‹ÚRΈ&I m vvۛàċSżĝ‡ùwÓîŜ‹Ĥx7d`"’ñxœĉ§Ş…³ŭNàóIkĴ””µ€{ ­×CĦċĦ;š'í¤ç>×L) ![ŞÔ ”Q\Ì*TFĊ¸ÍÊv>T Ó1òĉ¨e£Ô\=1”ÓS̅QVŜêœF ”ŭž5àd2EÀ"•]eÏħ5LJ‘RàHg™0›l:N°+Àħ­NÒ=˙ŭšŸvä-"š™ 3³ÖšµÖÇqZ;'k#}èîÈì|~üÄÀ ŬĠŻíjSFġ²;ŞPzäµ JğÔġÏ@İ’°h­§Ċ¨é1ЏÓc‘×,|òZŠ$ ÷\žr”+FV1ħ’òN(‘ÊnH‘½/İš\Ğı" €HLôŒ`ۜaP@0Zco—ħ}by鞿˙ìĉßNğ¸’2³v>Ĝµ|Ò²ÂYĝŬšĊì kĤwÙ­ç2v稺ÛäÊÈ(8ܘëş@éħ×?zv$Ĝ˘Í{AĞ"îaÔş,Z~ğ6|W6AÍĦ$ATĉ™ ŠQ(óF(ΔTqODrz-’ˆm1d;5° ˘4D(EB'"h£¤Öŝ+$)Lbo8öÖF÷['ùCï¸úÛÓ.sÂÌİΖIӔÂY7l×T.Ü6oÉŻÛşs‹cïˆR˘Zwoû-fɊƒ›“\›Ŭ+܏gGlĥT/ëNÌÙĈÈĨñv%7pËꇊP^ŝçT–•Mn³]éĴcH6<Ï9²]¸hûD6µ”ŭ>A²`ŝ7Vaċ9PQ  İfsyĠeédŠ=úƒßüô‡ß˙Ӑ™g›››3fNÒ45ÖäP74´5bġĦğuZ¤ÊCĉM ë²ĞH•o!vğbnZ!Ùúŝ/AžÁ–ꟁ̔uÚMMR£ô&ĥvÛoTŞwU•Rù 92ĴÏΆï¤°U<ÌE£Ĵ"Œ˘òsğï“›{-ĥP"DĦB7R˜Ĉ™¸!d}ï@„4NˆÀ ŜzòĠô™Ŭǟ™ˆÈDk=K³1y>Iœ3aQ> ^%­KÈNŠÛil×BċÔÎütŻ(Ö)§ôìh[ĥ;•‘È2$w Ħ‡ÑÜŻı³Ž°F‡2´—kċâû°íç$7:°)’@9¤ ȆïÊ­]€­.Ï;ı!ÄzáS ŻJa (áLŭRŜ“ˆ³i‚A ĈĉßxhK_zß&wÔï÷ÇZëĜBIl>IZBt­Ħ;Ż’n·BBé"ö@Z³•ğëò‚ˆ˘ù ÒÔF›ßáPz‘ñìè„-ží#°ĤŽ˘ÖĈ¨ı·k†‘ÂèP<3†ï ġ) &dá;”P"Hqš²*İ£8 ÷Äéžj£Ïm‹Ĵ<Ÿ¤ˆ*…(d˜˜Zƒ‚qŒ­-Eßé|è½O™K:|mĜï÷ÇI’L8NÓ45Ît7lGËBw~ŬÎ=ÏŞ$ñúÖT!9ˆyˆ8?ğEWk{ÏBĥ¨wÄafp°ÄD2ßĠáM#÷5Ġ)ŭ˙Ù;ó'7’+ż_fUáèFsx“#Q3#if5ÉëUxì ˙Òß)ŭdGĜħëˆ kF²F’µZYRì\œŜww¨;óù‡Ì:€.t£)’] oˆ“è ™Ÿ|/ßÁÔä/µŬwĠñšštŠĞ&vááä^Ħ {ËÈ[í~Ú•Ëóŭ”¨)3ÄÇÊL ĊÚYJJĴmş 3ÈñÀbž ß ?ÍŝË?~üó£Á`°?çyžgY–yž›¤Y:Âu'VRĉğ*1vµaßu.ɒeğ´‡´úûM€Òŭ_àKÂîtÂ5ĵ"UoÚwNĉ£…çÚyJÎMÇ´”Q@ĵDCDĤ²”|ŽĴòέǵ¤ÈÂXWJ•¨Ú—òÁ X KGë'Lp­Ïµ"„šÙÖaċ)°FXMx6üх§öĞż?o?}6÷Çñ,I’4Ë23›Íêĥ–Çü^ĊJ:u Ùf‚“°ï[ı£tUl•›¤ FŻÑçÚ+Ké*ïÎ.(—<(Ĝ´ߢ•§$0BgžןÏıïvù­mڒ×S6ûö'ĥşŬÚ[ò{J¨*£Ú’Ş^S÷”lUˆħÜöpŬcIĞĠXċÒQ °if°µáóôÇŝ}x÷³È˜'ápokkkž$I–Ĥiá­¤…Hso"VÒikD’ÛK Yï³'Ÿ$ËĈ°dfÍŸßñzÇNo ô#çğÀ\˘Àµ#­~Zı-ÑĦ‡ìŠ2Cš·m>ŞßSŞĵl­ËG"×>QVqe)ıı /§şHW‡üħR+ÂMaŜÚÚڛÏçi’$E @b%ġtÂcÚLm†ËŽá LÖŭ›"ŞTċ'ġ¤˙|Ż Äĵ;›Wu‚ ë7c›R×/ FëA=†Qu<íş½U™ èÀ­@‡*"uğìY·6òí)(ı9ßrÓIĥrŬqĞ -$n\x•t¨<—€Ò€ħ`0’\ƒG×ÔíÙ·ŝÓ;Áôó0 ïƒgá0Ž˘¨Èóœ×´’ÙO: ‹RODÔ j vi–úäġ J²7î;ŝ·ğ3E\×eÓíêN8/ #^ FÜs-XJh5$fÛ th­d[]ĝŞ„[}׆’·Œê=)wğÎEâ&oĴŭ™Œ;ÓĦé6ĥjU@ࠏñp˙êĠ÷Â/‡axg0<FûaĤyž—kXI żq۽ΠÄ6ûHöŬóc|lµ—TEĠUċT­.ˆò†AiyÒxïáǸĊĜž£ ˘+€Ò Ĉ¸şŞè 0ÂÒ#>ú)q{ğÇ/ˆĜ‡oWDÄ”Ĵƒ’/kEŜşŞ~lm Ĥ…ï§Ş Á•µÔuìvñ;a4ÇD(K‹rĝvôÌ\ŝ`Gßù" sƒÁàYE³4Mµ1ĤËJ¤q_VàŞ5ŸIPCOsÑ-¤—k,DÙġqĝœ”L—Ÿ{ïÑǸE´{06^ƒË4nj˘A‘s Œ=Í>aıÌPc)ı’A´ùPAİġù=fŞĞˆS^ÎŜ:²‹ß;ûżoQġŽà0j~^ “P[߃§ß=Żï_ ‚àÜ`0F£á|>/Œ1‡+6„ú v£.İe×ǃ ñnşšq#ğ8Œ^Uµï3‡áÖìN5ÁèP(P °5£Uûa-‹q!Oİĥ”ÚÇÓôXZĴĤààċ:Çĥ*5´+Ž·j¨&÷‰áÚаmGŬÙîsŒW-RÀ3ò–Ñ£kAż†ávEƒ0 <ϗ]vĵäĈ¤ ĝiÍuC\vŜ-ׯ \VPòYï ŻĴ'ÒfXJáKĉŬia'´}ŬYJ–ûN`Ô £…ùaá}mÓöĵeM-ôi‡„·ëâñbcv8C #˙m7X pUš¤ FġgRà²@ž*²z\\ĝŝe=ûsۃÁ`†a€ûFÇşídéu­ÀЎ£ÜT ġËBjÂÊMWOñäVžĜd?O`_ ôŬÇKËğS`BĞPƒ&kĠj[¨ 0êH9rïÜ nà….ĥèróU֓mµ§FSÀ•pĝs²eo%ħé,–ğ#ĵ•¤ġ]Àóx|íj¨v‚ Ĝ p†a µVĈ˜v>·]o& ïNßLôì[H–›!Ĉosµ÷ÑäQÏMÜŜ@ żÄ-MğSM/(4\5pè 0ê8T>tğIžġ–zċˆóÑŜ´Ô °ú\u".–BıħXA†ġĞaTĠAòFa@+„!ìÖĥRjG)µ†á0Š˘Ğ#ìşÜvP½f ÉĥURżÎOâ)·‚üpŞ˘íú>búèáŬƒLÔ Ĝ‹…j+Ĝ Œާ½=Ôd"pŬ:‰j÷żĞ@už·èhħSíRhoğÛ [#ËuqáNµħATGgYĜ¤]Ö:+FA Â0 |`ÖpÛmĉR½Ż²íİAÂû§:Ĵğ‰PZ˜°|˘Ħ]Úk(o)}İh÷€y˘ĈW€ÓÂmĴ[ëZÇ×ŬgFË—gÖî;kĞ~T´;­Œj—ßĦÏ×üĥnŻÊZnz!£úc2€LH…Û80ëçĠÁ–‡Q¨”RK–à$:ċex³â ġo/´ĞyûkÎMÔŬYĝ<½ÚSÂîċ‰ÚrUÂ9+ëĥ£0j?EU’á›ÍVoËvٜZş˙œßÓĥ.ìÛ._= Fĵ´şfáâ,x낢‘Rj µÂ0Ô8ò}l¸6ĵö™B€ÔÇsB÷ĥ+Zš°Z^…3fŬöÇRú_‚wMTt4ÀĤ µ›P- ŒĴŞ˘°İ‰Šb_¨ŝjC›*ĵêĞav0ò.ğÁ¨cÁڂ˘$q¸Eš†JİĦÖ:ÔZkĴŜ7ZȨké4­$qÙġ|ħÀÍ­êŜvċ,&PZ×}ìL0QÑe ÒĝxcŽ8žúdYÔĦwd—úùUżÏ][9ËhıjÌñ–ÑâóLIz¸ƒÄ„"Q¤”êpxItj²>ÚN úkµ.cżr§öx:ƒŜ„Ai̵uÍż¨Ŭw£ĠdzK­Ê3b:d¸Ĵj ÙT÷>.´{]ùóĈ @RҐˆ"" •RÖZuÀ.ĵċÒBb-½ݽíHŭ˘ÒB °zäTĠż­oSq67û/€ŬÂD JıI´/kjß ŒßÎıŞÌPór^ñV\×ë|ÙIa´àÂSPD(J<”öżĦ£öD§im`0‰áS˘ş@eĠŜül@é{ĝ%°Ĝ=0v˘Ĉ×ĞŬ[˜Ĥ˜( Œ–ß½/TGwĵpéĞéĴM÷0Zx¨Je01˜è!iÚ[HX Òi[Gn• +yH=^4´ÛƒT!ĞĈfDáP蔘w@5ĵ "WóŽħ”Ä)0êN{Oˆ˜Wûğ^ŒZïÉÖz —P² ("R”ŻÖpT`ƒ„€Ÿâ„g]ĥşİw“tÙêtÚ*â İ’sÓ1ƒKğ‹ğŝ@éWĝ‚ÈEß .QZé°uÙŒY?+Ĵ&ĵ6yéÀE×_ÇX ¨.ġ. ½Ĉ‘e7¸¤ŭDµP9€ËÈ·6窛,hc‚Rze)ğö5rU܀QMÀƒÀ¨F8-9ó h˜²ŭ‚@†ċ·|_Ĵ¤×#ż÷·İ넍haî*˘8ĝ°ßX'­|;?“ÛÍ9‰}‚ÒçoawŞhB£Ğ@IPa[úÔ( ŒNFU­GŞ˘ìšĜv:Bb-ġfH”]/ÏMSù|Vŝ‘Z*.ĥAê ”_âsî”0BŞÜQĥu8£^XF ?f- a XfĥÖZ4ìF=ġX¨´!@ê™ ğşj~ÌÔnUúı$Bfî}Ċï³ _ás`wş… W@*²Ò9-şîF§#ż8óm(X) €KÖdRf6ÖZHùŸ[Gܙ@-@êӊĦî 단úĜcë#î\[Š ]3ġ J–w§–'4ĵ 5È2l^ĝ½ +0:MĠ'ÑaRœ à˘dĉÂZk<”ĴXE}ì@')*×!@êÁzA·@ĵ°ŻĤLäù´ı żŝ@é˙àsî”1Ħá0( ÀEı8ˆF§#†ŻÏ€Ö°ÉÛşÈ˜ıdĉÂ8Yˆz½ŝv“ŸDÙġQÓEħ]™ZĠżĞ*´Ù ^YJÌğûÖ·0 ¤µk[Ñ1Á Œ^Œ*£‡hċòÊĈ§ÌœYkKkmiŒáï& Žĥ`­Ï5Â!ı #×Âü X@ġÉRR´ğLhp¤Cw`\ —áû²£W£ö×Ċ@¤AùF'ÖÚÔ“•eYˆ…Ôg—Zïü NéühU'ÇÖġÔà[Q´Z—żIÎ^YJğğL0¸ "—ŒÉqsmµŻ$0z½0RʍMàä9ĈrßZ›crï²3­wkİŸ£\˘ìúi!qMgK,U³ôùI…ġI²oΘê”~ÏAğD .4íJ#0zĠ0ZŞÇÍD rLĜ¤àì9ĥϕlaScL^EY–ċŞż.PêĊàĥuq\R/Ħd}_ËEçÛrraЉŜĴ Ħ:ì[;QƒË`}ŠvaáÖŒ^Œžòù+¸‹óûڃl¤ËGóÔÄeYĤ…#’=>|Ì}ÑІQĠ~B\vŭ)8Ë­ÏP2IQĞ[ô›öûíYžÒxBÑe€³|Ċ¤.0zi0˘ÖST÷¸'l|çGvjŒ™•eE‘EQ.YDœ^I5A\$Ġ{ı`¨,#˜VĜ·m|(.oj.ٙƒÒÒ„—üŝŸiC5{Jo$ŒŞ,£Ö€tàëĝ!ŜÛÇĈ˜iQqžçYY–Uݏ èµZHíÈbRß&[çŻÜtpÀÉçŽUíÌY½Ù9~ŭ ·ğ{#3Q£Ğ óÜĈ›#~É0Ş›$ûÓĴ` ˜Pö?â Ì×EZx ċŜB:ò§$T8e—[…\nÜÇی~HÜ€İ `hO§\UWoöoıWŒŬ}„˘K 0t‰³`TÛ£—e5]j Êı°uûô \ˆĉċ¤,§yžÏó<Ï[ûGGYH˘S—}Á‘)@zµ ´,7ÑtD¨ç6ï?‡‘ñÔ(ħ‹›ûÌ;4¸ XÎ}%˙gBÂF'†µ7’*·¨¨„Ŭż…Ğ;¸[–ċ^žçyž§yžîş#÷ŬéNznKBI”]?'YŸôÚ¸U=ŒĜÏ³Öşr)2fzf)}‚Ï7÷A;\vQwÖşÁVeÑ_£ÊÓ£€@ğ2Nó;ò'ċ•-ûYKÓ4ɲĴXħN,#ĈĈVÙˆ<¤ J`çžk:RTmZ>tQ˙ ıìpx¤BpY˘Ŝ´ĉ_FM˜é ûì˙áíqö̔ĉqžçûY–M³,ËZ ħëşëP§À#בYIĜw/­Wj TEĜYË~N–‘wç‰ú ßàsͽè{;ĜşâÀµG`Ó¸Ĵ­#NŠ%­Àu'çô>ĝàßĝŽŝs‘§Oò<ßOÓ4>Ĉ]· ¤mĊk"R•+Qv½FS3[şšW}¨QUċXÔcK‰nîí`|Ġ•}b 6;ŸJ5ĊYFĞa´p&ŭbLùq  ĉîïqm”< A_ÏòüišĤišĤEQ”@²èŜ?Ú4·Ù^ž‰²ĥîyÄ͆’ġÍĴÄJ:Pú5>nînO‰BĜ`Ĵ;S ŒÖ…àÜtP  '÷éWüî/E‘<ʲl/MÓYšĤí„XÛ^qä¨S´` jèċyZĦŬĠÀĴT÷‘ †³}ĈGA*hÖl”Ĵ-hùy˘Ĥ2‰V 20˙W†óg!İ[³,{’$É^’$•ğδ`d;Ĵ¤£\v2°^§Ĵ‚Ò Ż‡,Ğ*ĝpG jÓ=–ĊB:[Pvxt¤´³’Š*òŽ:&á“Á/Fx 0Â0˘EùâŽ@€˘vúpİŭY?H’äiÇGXGĥġáÄê•6×mwĉdĞN°>ÜÛċùsĈm&Éx:kPúÌòÍ=`‡‚‹i·R7×VMĠ€żlñk€Ż #\ v‰°(g(ïŭ ïN²{ê‹$Ë&IòĜĦ˘Ğ:P&Û11ż0˘*ĊÁQän—Ï`îŝß}и³žÍÒ{q?Ïç³*Ô{É2ZÀħŒúh!IRÏ- tLj1òS>ÛPú->Sêĉžħ;4¸ĉ İĉ´’gßPùŠ÷C÷]h s÷#\à{û7.n˙:ŽÛq?ŒxŻ•[í,şíÖ)°Êí߈Œ”×9(íĈĉ#} •~ï¨Ŭ²ŒŞDĜœ]Ó>->ğB‰×†‚ÏF¸ùĵ£FWÁ†@aäJ ½é0­]UM(ü áÓ?äżóIš&ßÄq|6›UÖQV–eÙQ—ud!ƒzşWU“7RïTÁ¨½gÔÈP8÷ÉÙKé|:ÄÍ=Ž]r[—*ìr0m›)™Eah óìàğż°?|wû\ĉŸĊq|w6›=™ÍfÓ$IÒ˘(ŠŒÖµŽ ˙îÉ`4.êT€Ôc+ €EĞc,üP#¸Ġ³”:‹Pêœü>À'ĝÔڛ{–wÔÖ5(À…[9óFÂÑìŜ_`żùgŝ×ġ§Àŝq6‹oÏçó³Ùl/ޏ(ŠĥĞnB'ÙKâê7!#,¤ ]œ} y0Ä­öċÜT9vn H?¤³%xKé”ŭ~‹O›{‰ÚQÑ(a­=8ċĤó=qtèšî|‰òö?áûçÓo.n~;ŸÏżiÁh^EV–ee%İÈWëԂ’İwDbn…B2š0oċGóòž’èĴ@‰W@ PÂû;*ĵ#Ĝ*ÒÌX7aŻÂY·ŒÀ PÂÎï ĵŭ?ñÑŜƒo]˙j>Ÿ5›ÍîM§Ó'UTo/Ñ˘ f†u¤›ŭ£ <gż–]UɛZ–Q£êqòmċçĵ‰– ŜŬ3ßŬĦá5çÂb f[GVŽİ[×G-§šP“O@k79‘‚~…òö˙ÀuuïÉ{WÏŭ"I’[óùüÎl6{4›Íâ8ŽË²,ĴµU˜÷Şŭ£u’aëÛâ;%—P½$a߽Ȳä!ġV†½ë}tecU‘V¤\Zħ6JDġìmŭ1Ĝ÷Ç˙j”I˙ëc›Ÿ§ÑÛ 5BëZV਒w§#tÀ¨ú:•‘rÇż‘ÌOP~óOx˙BŝġÛ·Çñ­Ùlvg:>šN§ûqÏ=Œ ċ’edÖV}ZÑiI£Éa—]M¤ĉ•Ŝ*‚r­›Jq(q Jœeàò”,;f6ß˙ı§³ĝşˆżEÛïԖo_A°ï>k–á§#êèg„Ĥpŭuá S{÷#1?z{ôÙùÉè·q5NïÎf³GÓét?I’yžç™1ĤX"³†ĞNĴ£~Ž4Ô%˘60)Ĝ˜“Äh`T²ƒQğI™hÓ,ÜCİš -3[kmyuüU>˘äï>}>˙€wĞit U[ÊP‹0/ÓĦ—WÙψÚOñĦ(ùĠ…¤CĜĝ>ÊÛ˙ çżO˙÷Żü> ó—ù|ŝÍl6ğ7›ÍO§ÓßR"ó–Q×ÑQ‰°ËŬbe﨏 ú¤HĜw˙TUûĴƒiµ°gÄÌ ĦÒĤ@‰áC³,ĞWíÖZĥ֖ÖÚ|{l³żd{~òĝÇÙ·lßÙ¤É dk²™ÒjèĜ0Ä|aFÔ|3Z;1Aè*Œˆċ“ßÁÜŝ\Ĥ{{~xí×Ež}9›Çwf³ÙƒÙlöd>ŸO[ĵ+•PZg˙ĞĊ::ġ €ƒk9 ú²` şş7Ĝµ2'Àh3Ħtho£rßyYcLi­-ĴµÙȘäo‡ñŜ7O˙óƒôK˜|0¸R˜ €}AVöûÖ†Q{Qşàĥçj'‘˙ÚÑsZıûA"WŽÁĈPŜ˙ôè7ċ‡×Ç·\¸úû$‰ïÄq|w>Ÿ?žÍfÏ}žQÚ½l™# Ä8A ƒ¨ƒËsH‚úmĊĥğ—ûRBDä`Dĥ,A ›e)Ġ“Ĥ1&÷î:Ħdʲ,Œ1éȘĝ;|˙eŝûÛ?ÈÏŭp Ï½çZ40Eéyéŭ)ċ èˆDÚ5`DËÓ9µnúzUBw¸gtàÜÌQ.ç0ŝ€òÎ/pY=Úû›Żŭ_ĥċWÓéônÇçóù“ù|^/deY.GӕkXEÇíIWĜ+ҍkyOÉoLôj XêjàÒ.jévû˘;]”RaAEƒÑh´½µµµ³µµu~<_‡oƒñÛóÑßŬ3—ŻĊ)Ú~D¸4°ĈğïLÑ´‰fہÉ%á˨ĥިŽĝĴ}Ğ Š4˜cĜg‚ıûK “[é÷ż}é‹ó“ÁŸ²,ğ—$Ƀù|ŝx>Ÿ?x–ĤiREğXjŒşĴ£*ßv ô⪠DP: Híǂ) ñx<ÙÚÚ:7.F£Ëá:‚эŻÂ=°×.èË?$l½Rg) öÓµuà`W¤—ğjĉ-<@‹Ĥ{6ç-0­ŬßéX…!¸˜Â>­@ôUúîµsw^œü)˲ûiš>L’äIÇÏâ8>ˆxžeYê÷‹JĴŜ/:*öD•½H"’H t20UJİ ‚p0 †áx<OĈñùÑhta8^ W 5|çö˙àQsž/ŝ@İó5¸è§ivIµD°Ĉ€ˆÁ…m"›MáŜê#ĝcD P0%„`kAv×aĜäÍî߂yúo°ŝ Ûü,ŝö•s÷]œü9ÏóGY–=J’äIšĤÏ8ŜO’d^.ĝ½²e­ŞĈpÒBŞb‰H"R˜Şk½L+ᤔ ´Ö: (Š˘ĦÓÎh4:7σKQ]¤ şúp†̃+3}y¤/|ġÖû `PĦ›—óL6%À;kyíWŞ*ıàÚĴıh(M.ï5àlžß}ŝ)ÌÓż@Ç÷Êk炽ë—Ï5èoŠ˘x’eÙÓ,˞iúAé˜IŬ˜ĜÚwéŞñVŬ.EÇuû’w<ĥê’ŻùÚŻì¸ż|ŒÇUc8ážÀH$@‰^”şĴ£, s ŒŽƒRyÄŭu.ċšŻéúGhŬ¨:ŒD$‘èċC‰ÔQî­ċ°é.-?V £ĴİWa™Àh•{Î ŒDgMö-zµ?0úĞ{P^Ŭ^´[]ûAĞîwîuĵ÷şê8 Ż ëŜ_ĞJ7ş{xˑH$ D"‘H$ ‰D"‘H€$‰D"‘I$‰D$‘H$‰H"‘H$ ‰D"‘H$@‰D"‘I$‰D"’H$‰H"‘H$ D"‘H$@‰D"‘H€$‰D"’H$‰D$‘H$ D"‘H$ ‰D"‘H€$‰D"‘I$‰D$‘H$‰H"‘H$Úhŭ˙íêb†Ĝ7ĤIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_LimeGreen_16x16.png0000755000000000000000000000016312467662066022633 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(Ïc\ġ“$ÀÄÀ0ŞaTpĠ4ï IENDB`‚desmume-0.9.11/src/cocoa/images/Image_Piano.png0000755000000000000000000026477212467662066020001 0ustar rootroot‰PNG  IHDRÉ@: pHYs  šœ IDATxÚì½[ĴdÛU66ĉ\·şíŬŬnŸ>6`Ìñ‘9”ĝ‡Ä`À`.Šì@„übÉrò`‹'tò–§„ D~°‰— $+?2B–?Jáo„„ÄEħNέ{ï]Uë6gzuFsıŞVí½{×ÒV÷]µÖ\s­·o(ˆċË7ñ eŒ€,Ë i°Ö‚R ´Ö`Œĥm!Ïóŝw*ĈĝĊ_üEwóĝòGôG @k J)°Ö‚1ĤżgLv^°Öîĵ†ŸÁÏ5MÓżŜĥ-Xk!IH’f³™mÛĥÛ-XkžÛZ MÓ@Ó40›Í m[Ġ}V)ó×`ŒÙlfñ5k­MÓf³( m[hÛÀ&IišökŞ Ĵµ µî˙Üç>ŸÇ(“ŠŠ[e ù ~ìÇ~ Š˘€ĊbY–À§?ŭé;Ħ´Ĵµ ÔÛoż ———ŞkĜn·  m[(˲WôBWóùĵWôhԌ1eäyY–ġĈİ,K0Ĉ€1FQQ–jÛÔSyúĊUÊ*ú}€ŝüÔÚ§‚ĈËâù˙Û Ù4M{cÜ­Ùc¸½AûÄ'> ÒôÏ×ÏʣЭ1F]^^î<[ÖZ‹`ú{ôÖ[oY­5ĵúêĞñE‰` ÊtòÉO~R}âŸPżò+ż˘e­µŬûµÖ:I’¤PJZëRTÒĥ­Ŭŭ(kmB~O˲Ä˙ÛiÈşŸĵ(Šä)î1eÛĥeÛĥ•1ĤĴŞŞ,˲>;;³mÛu]Ï­µ ­u’ĤİɲÌdYf; Ĥ¨u рëşI’¤jÛö˘,Ë'›ÍĉÊZ[/‹6MS[–y7Úġz ĞĠ ^yċH’¤ŭíßŝíí_ŝċ_6:t÷hNA‚ğ(Q"ˆ²—üêŻŝŞŝêWżj;eRüèŝè‡~é—~)Y,éjµÊ³,Û꧒iš§iš4M“tĜ@£µn”RĈ£;# ”RĉJİ ô†•RJkm­µİµ61ĈäĈ˜…ÖşH’¤H’$­Ş*§aÖĥ;ĥîĵ%I–eYÛĥ…1&éŜc:ċ˜c,”JİR)U€é>Ÿ€VJm“$1€.6ġÔ5Àz½Úĥŭ­µ[H“$ù.ԋPcŜjÛĥì>ĤµÎ ÑZë1&UJ-Œ1+ԙ1Fw Û@Ġ5ÒÎx%1Lş×´1Ĥ?V÷ZÚŭßtQ”J;ï1UJ%Ĉm­5p‘çù;JİmšĤıÖúL)uÏ“v{¨´Öiw^”J 錳RJİĉiUJUŬš/`Ŭĥí1ĤŞJÀ•R*O’¤I’d”ÒmÛÖmÛZ”5Ĉ̍1sÔ,MSĞ”Z[k[cLÓ]·€<´ÖŜ€ûu×MS –üÛ*’şmRzĜŭnğˆˆêÎÓ¤iZ%IR'I²5ĈÔmÛÖZk E’$…ÖzĤ”ÒŬuk­].—ÖZĞ0$‰ĠZĞ$IÚù|Ŝt{S[k[­u›Ĥ)zô&MS›e™²ÖêǏÛĥmÛóóóFkmšù|ÒJİÚS6MScZ­µ²ÖT µĥéö˙¸€'oùĉۏmÛŝ?Żżŝúë?ó3?SGM%‚({˗ô%ġğżûğöċ—_ŝîÏ|ĉ3_ĝä'?ù_`J"MÓ~ŭ˜FĦ{@ y’$Š­lݲ¨ïş5+şVÜ[|6²,{ĤnĦiȲ 0‚‚Ï×l6믁î+żwô=ô~:ĴÀߚZÛ@ÖdÉ=Á[U(Z­u”ú˙’$ù?Œ1˙óvğŭż—Ëe5[Q˘ËWòġ›żù›Ċ/~ñg~ĝ‡ĝż˙ŝï˙ŝ˙à#ùH1ŸÏĦ(Šâ,Tn\Yòüs§ì,T^ , ‹†6*Òív Ĉ˜^w^ÜNnUÂTÙwĈĈÒרaĦyt)ô޵VĈ˜„Ì´µVa}7xĵ<Ïû=¨EœÀZĞĥÛíŽöHq#ÇĈû 5ĴeYöû‡Ç ÷ï# ]‹µîŬğ×ïqÛĥĥë`³ğ>+IÌs§i ĵ8ïéĦwë˜îRt}ôĜh é½FPÇA‚ÄĤiv ĝ¨qmš_ġf]×πCşO†È=vê᪪ m[…†ĝŻİŞŞ/0\.—;àŜÜöĵXÔşišW–ċïÀżÛn·ßyßûŜ# D‰âk­úùŸ˙ùŝҗôû?ĝƒ?ĝò{ŜóX.—½Ĝn·½rʲĴ÷fÚĥ ‰˘1§^ Hž7Żìβ ²,Ôu WWW0ŸÏŸ‰&cI^ŝ×Ç ‹äŭÓcÑco6kwż³ìV ë Ç! IQ/°Ë3DÁŭ {K Ë.//{ D‹ñßşŸın~Ÿ|‘<&vg @;ŸÏûżáóAeÂ·Ϝߟ!cG#ĝ˙şi§_½·ÛíVĞUżžŞŞÀÛíĥf 8I’ò<‡<Ïa½^{£8ü~óï–&IeYöÏ9µ<Ï$ì<ûJ)˜Íf;`„ŜGĵçOž<é×Ó4ÍNd­ërħXü{ĝżĴµ˙f½^˙ïŝçŝĝ‹_übĴ)ˆ` J”]ù³?û3ġµŻ}mŝùÏŝŭĝ˙ü=ïyOïñdYëġz'd‰Ê•"Vğ37’Ĥ mħX@Ó4½ÒÇcc´`ħX<ÁrLĞúñó4Ì=+Éèğzö.Áë§FŽĤ9¨áë: zÏR2ĸ­u^§@ËÓ“~–{’żŜIĊà^Ó4Št~zŭ´ƒCë›Í½ï4Ŭ[~nz?%0äGôK!u8 âó•ĤiߊŠà–‘ )8qÀ)=Cô>ñH!Àŭ£.Li$IMÓôéŝç‡ŻĞ‹Ì˜ş›ŞŞŝy½^˙·oùĉżùĝÇ?^Fíw÷%[%D~7~CŭäOŝ¤ŭêWżúżúêĞ?ÖµĠÁùù94MïĵóNݘ¸‡ŽŠÙeh¸auT @Cƒç¤† k "ˆà•W^Q`żïûïżRJ½çƒü ĵġÖ[P–%l6À(U–Ü3c9ñC„ž?5d4ÄMWĴ¨Ĝéß6U ôI’€1Š˘n h>{îÒġÏçs'˜ žŻË¨ùż/8.Q€=v`ħ,í"RĈÈóÒ4Ŭ)2¤é WTJ~#¤2Ĉ\ú:}˘D0ċDd6›@žçPJé,ËzĊS×5¤i WWWƒD —c/:™çTÀXŸP×uïĦ·b}EuÔ;“?5êcŒ2UÀR7ï;k(‡@÷ÌÖ5ZH‰÷ÇÇ×âÓóûŒ0?TB×r˙ùŜÖKZ·"†ĉ‡"C€ƒ§mĝ½¨ëêşîùèŭĦŜ?à÷‡ĦqçÏßk ÖY$È4M# D9uA#ĠĥíĴë~JU¤ÖÚgFsc@óôH„?”ÜĊeĵ‹˘è%’°POhÈH3†Áœ6'‹áaVîáq%jDi‘ߘn ap—ħ’Œ-ċY ûÂÛ=‡ĵCŝĦԃt|tûFnèġÓ /"•ÚJ9]°/%ä'ôĜ´Ċ•ĥŬn{À 0rCS”oƒç×k¨Ş ò<‡ĊbѓÍf³l ¨ ÜHìTUÌçóŝ{6›Í-‹<‰Ú0‚(§ütùBk­BşV­5Îw‡³³3À˘BĥäŬX(ˆä(Œv‡d…Ĥh˜£ eYBQŭ(`JŬ*ݝÌúG€$@.4²C­c45Ê>A0$Ñî˘"— .İħ•˘˜zqċšéŭó]Ÿôy_…½ë3C‘Ž}…2@Òû@óî€RÎŝĴHİ06}~ߍ1=)“5’@'Ÿ´°ƒ<ÊNÉk'PëÇÁ.//_€ïDmxwEÇ-ˆ2$———ĝŻÍóšĤĊbÛí²,ƒÍfëġf³äyŜ+QT¤ÂÔZCUUpqq›ÍĤ÷NŞ–Sßbč˙f³ÙĦ”EŠĜġz ———=°àaŻ:ÄJ`(€¸ŝƒ<ùİĊ•k—ÀßϐĜ ²eİ ĥĉÇhĥùm6›t%˘ šĝ~LŬ@˙ŭàL‡!Ħ0JİïŞŞê?ûġ_˙ġEԆ12ċ„…ä:Û§C­Xí3J)XŻ×°ŬnwĝêqÚ çUG;TŻ,¸ÇŽÇquHE†b*JëÚ­pH‘[H?=%hâ^*xç˜B=c Ó.‰ÖÏC×ú,ğ}^iáÏëßwix,˞3ÏIµRh€†ĝ­µ°Z­ MӞ"œF”xm„/ÂÓŭžXkâá‡+XG#QN1ëĠ%>"Z? )ÊĞĞ+XŻ×;ıaTd8€S hŒó<‡Ùlóùü™Á6Tħ!)ĉ\iŽ?ÔQC‹Š™’ı  Lšĥ‡û@ ĝÏ>ĈÌç9J]|B ŻŝcŸHÄT€A2útŭñĠTëQ+z°(ĥiš!OJiä ˙Oh”@)8I0ñ݉t’nʸ}Ak]üÛûoc1aŒ D9EÁ@JİGşıT GCġèµ`*n ]ò1³TqQ~v (xSEH‹h?żkjĦd4xÁÖħ ÖháĈ–×êuğê hÔÄgÄŭáu7†öÛçĠOÑ uúÇâÍĤi`ğŬŠcşiË _;N:ÄżQB0L5àTINeş?8;ĥF0ċDċĠW_PÖÚïħÖĤ.B :‘ ³<-â*Š˘WzÈt†ĊqR-HD@;`~y>x‡{†˘0^á-E n,ŒG9Ä„äµÇD7¤"I——+ŭR@x 0Ôŝ’ê‘ĤVNaés…@ ëŜûÇş|~:”3gògu6›ġëĊÔ|>‡²,Ÿ™ :’Ÿ£Ŭç9ŠÁ@”;"?÷s?§ÀÀR)ġaĊ´ìA@ŻşŞŞˆÎk§//2yLŜš…‘ĴX,½ċ½!D6R+ûŭÀµ£İ œĥ—…3g/ÌİÀ“Š˙Î#ItF•èŝQJ­ ŒiÏ%ÜÂó/ ¸ĵĵÜaôÄH-0Ĵ„ô:;İ´²,ĦŞŞËÇs*pŜ½ ĴÙZk5”!ÄLQž_‰5Q½Ñ œ[kÏ|JžzâT™˘aNj¨1 şŬnĊ1Ĉ´j ѓ*ŠbGÑÑ~됞},oßcïµ>ƒċú‘Îj,q*"ĤU¨Œ9äĦPwˆ×úݵŽÓçRàĈž+ÒÀ‡QÏ+üi‰ÖQPş^ŝ`=>—8ž˜ŽVĈ=>·”êğQh Ÿ ŭ`4 AKÓ4½ñ_,ŭ/B°ëï//&äŬ0”ZğmÚĥ…ĠjĠó P ‘8ĴYÀ–aüžÍçsĜn·v³Ù”ÛíÖĵÛ]%F˘œPJ)£µÎŒ1ŠCE•¸Ğ°’ÚàˆbÚ²‡l†WWW½ĉƒˆ˙ĵÏÉXPıáñ´…‡Sy1!%áÁš\+8D+_T€‚!‰ˆ†iéš8=³óËʘçèġN)À×E=i ¤v5,äZd:P‡ĉ)Ŭ4'Ĥ€ü8½˙4ŭD£> àùëş†ŞŞúuP)Š.//aı\B]×°Ŭnaı\Âf³éC÷x½ĜË‚MÌÉS̐ü;í@0’eYß!#1@J˙ç)4ŞĝóÏïµt%Ú=›*MÓµÖÚû%‚('$8Ic‹˘°èE ‚ÁPċl6ëXȄJ•‹Ċ6› l·Ûž[ßùùyoÄ%…Ġ4MÏ †^MY–;†ÍËċʲ„‹‹ 1”N ¤ö¤ÊjhϽ4¨‡ƒ( ŒR™ÓÖyö<%@él]ÑîMÓ÷†ĉ‰İ˘˙âsâĞCÀûI”eÙ“‚.X9O9¸qCjmŽx]&)/äÀóÖżáFèċÓ=˘a}WTL"e⣧ùH1Bï ŜiHUšĤÛ$IŒ+Ş%‚(w\ˆ22ŬÈ Èó´ Pò”İÑàÌonô¨¨C%†Ŭ ÔKadú9îÉQeM !‹Ħ>5VR§ĝ{Bş|”ĊCtÁR€G x$ó,p†CŸQĦ…ÒçşÚĜ0,OÇIÓgŒvjħ+´4p=ÈsêħJÓ´'ı˘…}Ĥßl6ÏpQP~ ßŝ(½NÚÊÁƒk|7H4% Ŭs×0ŝŒtĞšşÍ2JQž§äŬPĞUJIÙ5*njĴ‘‡r£SŻ†F] Lšq@=M?y¨x1´Ëë¸Ïg„2ÒĵµŻÍŽž‡‡f}E~Ck  uÜÀKTğÜçûŠç] .ϗG6ĝ{ñıp…ĥqŭ¸W´­AVuQ0AŻ fQ;„>eÂîdñ3ĈôÏ>͟sàCAípƒKD‘,~o%° (Ĥ}èùäL Ŭ³h­->'Q"ˆrbB”† )BC# ­ĞŞŸ†“%²îÙR/†ĉÍi­= áT>ڕ‡ĜQQóé}.ï™ ‚$ċM =5&C#t‡Ĝ9Ŭ;_¨Ÿ;Ln\ġžgeçĵkĈlµZíĵ& ù+‰ıÏ@:m<6FúÚ@ñ3´~Ŝ?$Šê0à5t/ĝTJ)Ş$ċÉqp.ïq‘1ñ\:†ŝ7›MÏ˙­5”eÙ;RĉIzïħ~€Ĥ.@yÌÔç”ÂH%,Oş_ôšxgÁPŬ€+EÀρé×ŬyÑ@QN;2Q’VZkĞÑy’sÔóüŻŜäaI޸hè’ĉïùt6ôú°;S¨$iOĥkb zˆ¸N4 ĤİàŜŭ›T˜'µĦQĉôoĵ&ÂĴ$OQÊ×Ó½ ¤$˙í{R!#kéàçǀ%ŜQ€Ÿ§@oħXôï‘R iŠßü–(k­U\qÒ/²˘×ECÏ˙ğdì9(àóĝq°M‹NxC[ï$e†ÊuħXôa”Aû*)iì†pZŭN‘zĦ.ŻÒġ7N<äÊ KCœ80câz†FvBÒ’âE‚¸gÑÑ!Ǘş(`¤ÑNW‚Ï eÑÜn·}g÷Ò}†ïCšĤ°X,z‚û÷ïC’$}t€‚]Z‹‚ëäé.,`Ŭ8×#  Ħé^’$ \]]ġġ :ŜĴŞŞX9Á@”S˘p F¨²çUßÜáĈœŜ[/Jž?ĉ-‚Ôĝb([ʍc77Žüĵ”•?’µ¸Ú˙(€/e"ċğéuù Ñ\ĈĈ p…¨]ž˘ëïÈMиxĈxÏ.0%­ž_Ú+Z¤‰í‚´EôR $mÛÂbħ€wŜy^|ñE‘Ç"àğ´ħm‘ĵ.†>çeYî0lJÏĤ:8S'}‚ ÒiÖñà÷¤mۅÖ:ߛ( D9!ùÀ>@´1ĈÀÙÙĵŝúëÈN³Ù ŞŞê†Ö˲„$IàüüÖëu?ƒóóH´‚ŭÜ<<ŒğžzĉcÎë#$^_Ĥ/rÁSıj%\s(BÓ4}{àġ5MWWWĝñcX,ŭ³7ĉŜPcÏÁ&N],Ġĉk§Ï#x||>é:ĝ÷żğd X*`¤yQ"ˆr"˘µĈÙšGBŒ ßcÛşÔˆs§Ó°'ġ`6›ġ-chˆ¨gĊù×%ϊvÔu ›ÍĤ§PĈs„ĝÑ ŒĵŬİo%£Ċ[ëĤhHi—ŸÜHë\âèCÁÀ˜ñÇô5ßßx["…<ôı ÷2%†Ô„`T iG8Š^ çA(ËĉóyïĊ—eÙ„˘(àììĴ§?–èµé³ gPdZäȁ˙‹TĜ)@i”˘<§ÂZ˜ KJïċaNü7ÏóŜ“GM+FPñÚjXQyca[Q;†–Î0p)tÉ Ĉkóäñ´âŸ_?MP£C£hlh˜WŞ÷†ŒU8£Ġĝ<Ìâᆂé÷!#É úPäá•ÖÇ…ûRÁÙĝĵQ/:˜Ñç”R÷„âÒZŝ}À~hÊç Päj—Eż”´+MSƒ54ĵ+'JQNáy·€°QJµ.ċî£TĊP?’ŝ ÇM{óQéqA §qĊ)ŞTiĝ3d’Ÿfĝ1èħ†ĝĝ@Z•dxĜvȳġMsS&xgCˆ1 isuRL!XĦçä¤Kü}ßPqÔĜóŜ҉i/ĜıLa!ĞOüÒ9 Tĝ4FĴ½Á(F6›M#İ;$‰òâ( Dı‚ñ{ż÷{gMÓ$.o’{ĵàûĥÛíN^›ÒËÒ\,ï àÊ)aQña‡7­+gsÑóÒ ˆĜE yá ŬG•L£´‚ÖF„´îQö9ZC yËRM‚Ż@‘FAh˙9ž‡ĉ ‡ş2$ Ġ,H†ßġ-âtW7†µĥOyq°I ħ¤`÷<ˆ Eš5Áı |l›ĜÒGÚ$Òï’ò¤áT|m|â\ág•ĤiÁA~”˘œˆ =;;˃ä˘2œç £SCÉ˄£>x}Sˆ‹@ècıÖ9Áû^UU?…“Ĥ(I´m UU‰E­Ò ú<3HJE#èeà”\Áş5Ä~¢œ²`¸ñììÌÎ&°hLiŝy$ĵÙlvÚ"3Ê0‡Ĉ•ÒÒRŜZˆ…ƒ07*?VŜl6;a]j¤i9ġÔ¨tċa% @;\Ÿż ĦġüÚBŠíŽĤ”Pž_d½|Là”LZ€˙r2+|Â=>mQjĵĜ”Ö8à½óˆò´P‰Ç¤‘8 Ò4µx ħµ0‚('ĝïú.U–ŜEUUpïŜ½žĞ7ySNñÔĜşZŬ¨ñ§‚Î0Èsß\ñRƒ ÓĜŸÇ£×â2öCEw<êA•.ŭġoÊPÒûÀsŬhN™pQÛĥ0ŸÏ{‚*Ĵà§­°t/1Wï*ċİ×3À[98àäZCQ!éğB7ûLÛ4MTÁ@”S ĵôÒKP×µ^"ĉìi›­§­Ŝĉʐ2ğÑHġN¨WE‹Ê¤×\Jö‰ÓŜjÚ7Ŝ1şbÁĦÙïôġÖ>šûĤm>şŜë’CZOApVĞ<~üĥÛ-ĴVНşZ'€ÏMOıR=ôïüYàġ7ü>!p§\Ñ́µ2MÓôQż ¤mÛ&…ˆÁ@”Ì.‹¤k)zf( ù‹Êƒ*.Êĵ碛ċtĵÒl{ßx\Ÿ“zùÑBEM™ñ}´(Œ KĦô}½Î} ÓTFNJ…p u— úĜŭ¤y>Ÿ;ïĵÛíö™–BA‘ZNg—>÷|ր+ŠĈ£i.0àğçĝ^Úa B*cŒ˘Ï”˘œÔum?~Ü(ô|‹Eï‘à@"IiR£*)ñ"8npİBâVœòwHña€¤‹³¨ħç wŸy\/mi“Z(o2*À9hzġŻÇ!„NùĜ2ôŒ ­‚ĊĊbMÓì Û˘ €9ĠŻë|iġö} ×Uˆêj”€+ç= .´µpˆ‰2JQî&€żŝëżüÜç>·E£0ŸÏûŠĉġz gggĤéNê€+'ê1I €bqOI2Îô3£ äB>+½ööÛoz½îÁ|>ïż!S³X,ZüD‰` ʉ‚żŭÛżm”R…˘(ÀÓOR;;;ë=!>$ˆVŝs…çò€8Y/ÌJCĞ!xœ‹£X)QCô‘½ŽÖF -ùP¨gJݟĉ˜yäÄeìBÛiĜ›Òñy…´•ŽĤM¤|=È(‘…Db\{+ññK LšíÀ˙)%Ÿççç}t k¸ĵĵ„ù|<è ĉf³ġzŬsaHm ĵ†î !ƒ'…MGSŜ ZƒDChĜ·Û-\]]ík­×kX­V0ŸÏ{ŞpŝmÛVı€R”˘ÜqAOçÑ£GÉbħĜá ÀŜ}k-ĵŭöÛ°Z­ (Š>Jó´OZ*ŠÂĊx\JLÄ ï8ԋ§­Y>eŽ‚€²,wBĵR1UÀ¨Xı>fëÏ£ëIîsî47şx]Q zo14!û4ċ+°£@‡]Z€Š#ş‘S€b|Vʲ|&ŞDŸ_œXÈ;hĝ^ÖuŬ³ґà¸˜ÓöU­WWWpuuĞĠ ÎÏÏa³ÙÀċċ%œŸŸ÷ße:“DÉÒ$ĉ"ˆrş‚„˙ĝÇVUuĈ‰ƒhŜùÓikÀğ•ùÜXÓz4ìTò–'Ú˘Ċç„*Ş,éy pÖĠI½PêıŬ†n€›^üɍŻ+T?fPSˆtAèŭ˘ÒgİqĤ@ggg µî 5ÒEħ-‘ céÚÔ¨Ì$÷˘y}|?í~A€Ï|’$°Z­ MS˜Ïçŭ{pJ"ċò ë˙I’dìµ( D9!0>΂1ŜвuE-xœS÷˜x›%†ĵ]5|§TĦцĦzéïœħğ!x &M™ HÒi–ôğ’Ĥ)Ìf3¨Ş 6› äyŜ×"´]37ÚĵЇÎ5ÀïÈmwÜÖZÛĈÈ@QN\’$ħmÛZ:ÖTb¨“ÚòPÑ˘@Zˆ%µòqeF{ŝî>ÓèBŒ $=7ž>Ĥw:ĤxĴác ‡>Kk(èLúşĜB#-}‡xJoŒÇŞŞê™=âÑ:ÊÁŻëiŞŞê#]í€ê)ĝaPETˆ D95! E×u­è(VZíĴµ†²,Ħë>ŻÉ#|„,ġië–ÏĝI‘T’ĵ‹aÈ I†•+{‰%NêwE4èë.c0D†‹(éžòuı_j½ôŬonti÷ĊŜJç‘ê1xú`¨Ğ€FoxԈA4xڊ“IùÀ¤I­‡ĵ@òԇjh\ŸŠ¤Ê˜Ÿ[j­—Q#F0ċDXšĤ4%4ztlp–eçyŻıQÄÂ&>i!ĜyŜS2F葅ŽĜuQ´òĦKüüÈŬî*Š”rĥÔÍ?ûf,v1ÚµÁ‡$ ÑïkL$Ŝ€ħQƒ1‘˜`*>#4´N˙Îûŭ} Kâ‹E,|…†>#,ÜC9˙§f¤ÄvŸ=×ZŸÓעD0ċ#mÛZk­†àIž—4™pè\ÇĴ.2”|pÈ5pe΍§oâ\¨‘ä$K܈ùÚÇx‚ûúëè àu)Ò½“ÖZKâŞEz†öŬÓ! òü†î?ß³g˘{_Ĥ”Š<Ä D9UAOŞŞ*c˜ëâ£ğŠ5”T† …ÏŻÛı"Ü3Ec…Ċb4||Èú8ħπMq­·İU’ƒž’Ħ…t’gjȇX§Ú“}žĠİî‰4lk¨^B)U[kìâ˘œŞ`T]×6$ŒÉCŞ4 ÎèMƒ=³P/ĉ:ŞœydDò‘€Žf>¨¸ĈŬJoß"Jıi‘˘)ÑżRaâmGœëÈÍĦϓ49”ísi­ŬFÁ@”ûTÌ1=q)š0Öà_§ñ’À '˘ĦCö‹÷ħKûá;Ón'µYŜPà+ş“BîÒĦ!£î+Àœ T ´é¸ĜZĜÄÈ@QNX³Ï²Lİms´­Ôĉ+ ĵ,<äJûé‘ñîĦçâal‰`ĉ†â:£.Ħ@EÚşç|żèÄIéù ÉÉïû÷!Şë!ž zݧds ‰xÜFÚè( DıfÁİ…Zk£”j}Ê[RRÁWĉŞÖñžˆ|:ġ’ß ùóäÏH$[ûDNŽŜ 2B—:ˆÁ@”’ĊbyžY–Íó<ß!ÁÁ‰ĠŒ*7Ê)€lgÜ#Şäĉaâħ¤1ÔèQ#€ĵ œ%“Ú¸3~m[hšĉ™kq…ĥÇz͒†ĵÛX8(AÖ8seèġġ˜i'O ùfb„ĝÛÒşéYgKÀ@”;(qâDŻ ġh–egmÛ§SxгŽQÄS‡ħ•YF‡„ByCĈC2(Ä1{Šc‡0Ŝ&PpŬciÍgZäÏVMös"¸$Ž0Ž‘(',u]£B3Ô£Fo£|^ŭm4 t€ Ï3ğĜë¸Wj…T·ġzı!.‘†*!ĞĉaÑó,ÖÚ\k=ï)VĈÈ@”SäPJ=VJ½Ù}+)şÛ:›žG\ĦY× ²û¸MŜ-oA½ÎuñTÜE IĤ”šE#QN-jmğÁÔÖÚWÀS@t› Ÿ°è2.ûz›wEùßVÀ ú¤ |Çf ”Òznnk-Fàµ'ÑyŒ‘(',eYB6Zë _ğßm H<¸nZDˆ‘:wŜEĉó"Z]ìÚ³!"(/ë3|@˜ äJ{…u3Ĝ*É#XûCN÷÷,MSŢœ°$Ó6B_ŝŭ:<ĊħçF£Ž O"”Ħ¤@C†\šrˆ„,Üô`ġÌ]­‰Ô `ï<­} ­Ž´^:·‹ÔF:Żt=!Só$™Uż(È#ÀShĜŝR£ĥñïXƒż}GïŸFh,o¤{ċcC@pßëCzN†@á×]×µJÓÒ4M“$™ñëŽÁ@”T&yž§Ĉ˜™1’$Q¨,ĝŒxWû^Ûĥ;ʚ*}ä*à“èPqQ%̍÷ÊCÇĵJ^;ïċ§Ŭ´‹‚‚!ü·Û(Šâ™É‚’'|ˆ'=dT\CBÎ=ä+5U CÍ9…+Ò =Ħ­œSÌÍ%Ízöa"äi˜ĥmûïjÛĥIÛĥ9~£D0ċT”4ÍĴµKŸ yŽù•”—Ä74…o ьËKu9ÁËĜ ×I_š(8p4D·;Ĉ`¸fŒ5èÇ­ĵ¨F 8›b› kpEúŭpŬ/ıñ1jJ³=†"4Ò#Diúïż1&Ĥ "ˆrŠÁ ÌĴµ÷;E¨b í÷ĤĴ\1cäÀ§€§0¤”ğž*HúúXϙÏ|§2ÇNjżSá@5˜Kxšah$vHÀw½!‚1)­Ħ{Ly2$qÈTL­5äyĈ˜ĥ†€Yžçâl‚˘œ¤äy_@œYkWıcĵOİ(Oò,‡<ĝħ ]ùf- yĈ¸Z÷íëŭ"—ħÀ/ß{Û;!BŒġlyˆäİsuÈŭp#ôÙċ] Ħ_Òwb(}š˘ ):ž3ĈœÇÈ@QN5,Òħяñš‡€À ^Ï^amWÁœDO{ šħŬS{ëHÀmèĦçámÉ(EŜ¸Ä&ùïÓI3ôŬu]ïŠÔÌpF‰` ʉ‰}WƒXk­RJYW!V¨²“*žyĦž+´zˆÁñ}CĴ˘.znÂîaNQŻàš"x†~ß{4dôÇĤ;\× CŻ!xìûœñî AJ’²,ëŻ'vD0ċ€VJċ#ĦâŠ64'ŽsÒ>~Ĵ\–”hh^7Ä(H­iñĊü5)@×DŻK:ß1Cñüĝ!R3!yİSxÇÂ9¨rşĦ˘Vúğô,HíĦĦc†]€ƒvág…8é9˘ëä Œò Džş …‰Ĉ(ËĥÛ-dYY–ġCĵĥÛm.Y”˘œa, äÀS΁Ñ@ò,éïĜî ħÓ|Ĝ*p‰tFšAÀs²ĵ:Ÿ_3'Ħ‘Şí] 4$âaE/ĝŜÒáQœ\ÇŬM™àĝ€ k-ô˙´¸zë´xUêÁ÷ñâVŝž1Û!`”?kœ4(´Ca_è‘ì>Ĝ§§UÈkQ"ˆrJ‚FtšĤÖeˆıÑĦĊG’˘J˜¸qCó”H"C´T4Gğ¨²ċ¤1Rˆ×ċu†Œ(vR>ž#>Ô³ Eoĝô½Û4­‘N” —Ĉԏñß1 rlß³tè}pE\@‘ì]e­½ˆ1‚('*˜&HÓ´íBœJò ]Ĉ‡*ıİ ŠäA u7`MÂq‡ZğÉŽ Ú"é3>.CĈ=ÓPŻnJñ ŭı-‹xk*7Ĥcê@|í—>À·ï=j,ĝÌ ­šŒ¸Ïŝıž'_-P’$ÖzÓŭ?F"ˆrrH—LÓ´íB¤Aڈ+/š“ô)ç!c()³1tÄSMÉPJáWimjž2*0Pp­ġ6>gÍ|•úĦ{èS>€!^ĦçîχÜ'PDÁ@”b¨L§PĴ¤4\Etü½S„YÇĴ}Şİm<€ż³a.ÁûyĴÖC÷ÏǓp“ ƒ,Ro™Ĥž²,Sa@<í%u_ {àTQ-)" 4ʎèşÎĦHƒÀ™‘(×ñœF‰` Ê-4~eYöüûÍà…\‡(ÒĦA+ĵoê–>^gàlä3ȸ>ŸÒŝŽġ`ċÇ÷”ënô=<ĵíeĵğ"¤XÓ5÷bŞ–@ às„‘!êçCŽ ¸># D‰‘°O€TÓŻ.cÁгíùRɽŸ) ÷Ĝ|TÌ>âÊ£›äĥ­‡Ż­Ş*ħîÂ5ˆh,1ŸÀÛH§ˆ HĊ³´0’êÓ;6z =Çì<Šü "ˆr²HšÚÎ#6CĈ‹Ï—rá‡xĥRaW´‡xÍ>cH ] w9¸ŒUô”Sž‡ĵ}ĈJꗟÊs§!w ÔŬuÍyà†•ÓKğî§Ô"Êûûy8ĉ!@:ı!–ĉJHŬ cx¤kŞÙqE ş =tŒ( Dı£‚_ü,ËZêċğĤrèRèûxĤCJV uŽe࣑טc)í.£ŠUñĵŜ×ġ@I›h˜enÌ£=âño"òDGÀD$Fğ7ĝçùµKi)ßt̐çÑUùϟ)BĈk|…£uOIAĵ(‹( ‚(§*u]@QMBUtÊ WÀRΛW{Ó(Ô3J’´ÖP×uïaSTkmO*İ9ì’7=äġScîc¸“ĦFŜI@V½oÛĥP×ġ3`ÏéĞ9@Îyßdc×$ ­ËĦÏ ­İp1Ÿ2’¨ħ]щ @¸~şŸt€”˜”1é¨}£cÛmÈ=ŽÁ@”ğ--4ÖZuHŸµğŸ6‡ ĜEü’$ÉN뢋JV˘yċ ²,Ëg25EQ Òï)\İĊVȏĠ4MoıGrnùöaŒħëYòŭç׋`ŠSñŭ*r ,Ia÷ĤiF]/Ÿ˙0´&Ĝ ınމê ,ÄÈ@QNUˆQ5ŬÏ^TÄ\ıJùIôr%Â"ôüıgH=lú>up>iíÜXş8â]Ħö!ĊËıá}-o’˘Çġá>¤iêíäàŸ—fяݘހÍ5âÙu¤”ÌÏ!½žĦŠúĦsğ@Lњ“ħ€@z}ë‘Ò\812Á@”SZëVk][k“};hzzŝ8 ˆĉÌiÁ†Ĉ­µçıŭ”Ĥ-)V $ ħ¤†‚·b5{ˆ"2(C‘—ċ!nÜ'ɳŠZH5 ûrï‡ iŻhÁž4ırh’+WυS)4T8T+#y˙CĴ”ŭs(\`Ê÷ù ˘*%ˆÁ@”S’ĊbJÈ(­µr)ö)86›ÍÎĴš+Ĥ…s.á9{ݍËĠ7νv‰íp¨›bHÙs:]ŜfbÌ$Á@žçÎĵ²1Fl͓€ĈħÀ€Ż*ŸOíÓôx˝´žÈŒàg(ŒÏ[eymäıÓϧiêL+P0ÇY }é=#}£À’RÊZkШ#ˆr˘òÊ+Ż@Y–J)Ġràj!òlC”.*mĴ °ÖBY–Ŝó`œËÓċS ı×UUĠ3Ħ/L§Ì÷ñLiÍ:xJ)ŻgϋÓ(+^]×; ÉġùşŸ™`’sçĈ,ʸ_2J4ŬCkè½Â’ô|ë—ÓUĉ|‘%>@‹h(߀ôy^ ˁ dï éò”RqvqQNU´Öàɓ'É!œî\™qˆF ]Ó4PUTUĠRJAY– µ8˘aD°À•Ĥ‹––+J4v<Á=U—7ê3FÜàœx|͢w)ó4MûënššĤġzìÙğ<ó1‘ Ĵĝö†‚ WK*í ĦÏK75Ó{~×1‡ÀIÈç•R}äeˆ@ş>éıâçĈ4}ĝlEçççb AlžçP–OmvQ ”êğs’$,Ëv Pùŝj­!Ïó>’Ô4 M›ĤiIuB”˘œ Ÿ“'O`³ÙÀ‡àòò²‘/—KĝÖ·˙÷Żżŝ:üĝ˙8ĴV+¨ëÎÎÎz#„ž *C×dD_ĜŸ‹ÔÖF•*†ħñ˜ĝ~zmMÓb$ɘP0–çùN^ uqcZ Ĉ— é½CĈ84àz/ç@ ñ‡4M{ B¨Âë܋tċä]yġ8‚J„ÁWäôï.ÏC´EQ îÏ˜ĝ”>ï6µ÷QoœîgQ=âì‰mÛ´Ħ¨ÀӂV—WRûÀÓü\C5ü<œŝĜô ž^Ànĵ˙Zëŝ;Dİµ†óóó”ñáRáİï{ <Z)u5aQ"0 P !Àp;z…’ħʒzwßùÎwàÛßŝ6Xká{ç{`µZÖz24˙`̵(4܏š0‚('.u]ÛĤi,z½èÓĤ!C`Œş!MÓê[ßúĵúêĞâ‹/Âl6ۉ:4MÓWosWż>' ’ ÈĦʚzĜCSš´êıZy>6r²OÒ8]z<:C`Ȅ„İ÷ıwj}nl]{à£c–xĈò„ÒÓÈ­ÍÀ:<Ïû(£k¨Şê™TĦ§ûWĊš˘Dĥm <í5~†[ TÙ İjµê‹ÁÖë5Üż²,ƒ‹‹ ¸wï^̲,a>Ÿjµ‚ĊbY–íìQ@€†i¨~!Äs䊙íƒ×›Ĥk‘†áÇ\ùÎf3ħ“AĦ,­}ˆAKbKʇ yÖc}Ĉu_hk#_G{"ĠĦqĜµM5”İÁ6ÖÎp. I£Ñ¨}0{ĈœO‰Á@”çP’$ħI’Xš§ç}ÖC9q s*zĤiš>˙ı^ŻA)ggg4 \^^Âċċeïñ¸ıf p36oê£Íu)E,P£ᜄfˆòÖç™E†ÚûóANÜK뢵´n $U4Ĉ… ŝžÓƒ<ó} 7$ô;10ónJ3mŒÍfggg"Ó&ŝžçy?‰’Piڃ Ĵ½ÀÎ:ì ßCT÷÷Ŭq"Ï@QNU´ÖĤ( Ûĥm_Dˆ½Ï´Ï§Œ•R°Z­ Ş*(˲/:ÄiTXišö=Ô¨¸ĊgxAœd8LF0BAŸµ@ ç*`Ü'ÌLÏK +)á½èħŸŻ•ż_ ­Yàı{j°†".!ĈÔġyi˙¨S“1–ñ/ŒÒθ(8áBĜğöN)µŠ‘;ĴD Töɓ' 7†‹C8íiäàñǰÙl`ħXÀċċ%œŸŸvğ…²,û*i58;;ƒĞĞНózÉ+óyb|,îßù{ÑèsjĴè½ö)ĵfNt#ŭ¸şÔBçúĴϘû~ĈxÓH¸Ħgû(nŸÒšú;­ÏñF×à+÷†bùçH„CŬô½Š#QnXšĤħmÛÚ)•ĤĞmïĉĜB‹iNV*Ú[\âu…ĉäùùË)îÙ‘ÛĤş~éÙ›³—ĈsEl$£/­UÚcJIÌé½qŬŬħêèL”˘Üa1Ĉk­êšÚWIÒ=!žÓm IşĠ p—Gìëċ YúÛX°2EdĥßC÷`˘Aƒï“ˆ‹|Ï }>(À†I]t‹5wPbĵ'J$IbÓ4Ì%àĠ·1 "–Ĉ#‡ŭ›3ô>ÄqOHX?ä^ñÄ%ĤAéğE9”Nè@‚€½.%F˘Ü^Èj­óİ@ÀjÔ1ÊgHq;Mk¸‡xJÔ§Ĝy8x ŻġÈÀ>„8Ïb‘ú<š­7 mŬ”"Xœ¤ÈĠ)k"ˆr²ÙlRkm:iÍÒâ³Ħ|ç-EŜÂĦİycŒċ`‹żîë?w8Ĥ\ŸïÏKtè˜‚ß iBHŬÀ”ûǞWï2Ĉ@QNUšĤÉà`âù1<ò· PĊ˽)>š˜ŬTJœ‹×7óïğ÷!žç>€ „{aß(Äu>Â!İ‚_*† =Ë+ÇĥTÊĈIÏgŒég×èg]m·ȑw ,ËŝsY–Ávğ…Ĥi²ND…Á@”öX–ZëlŞ %ÎÜwS£oP7Cao‰˜Iš²¨˘Üö´“G.\ ä4 ċœ Ġèĝ‰ga¨­‘‰1W }^˙Pšb(mÊ ‘ÏKïċ<Ħk M…¤!”RYԄ D9q)Š˘@âT2H<„ˆŽĤJ†“â$IËċŞŞ‚óóó~Ú!Î!ZCY–ç9Ĵ×kxï{ßۏ6–˘Ğ·zcÏA 7úC „C“Ž7Ĥè8\mŒ×}‘ŠŜ†Ò'SFCöñúqŭÖÎ}ÂèÙğž ×ó¸–ÀÇ>öħ˜&ˆ` ÊİŠ1FwŠCMĦĜ÷é×FOšÄ)+âélĝĦġîsÎ1”ûˆäes‚ĦCîËßÙ 4bp]€àĤRPÒ¤ÀİĤ"†|ïhDFŠ–¸¨ğÁ*jÂğ+ħ,4J(°Šh’}4;~̟!k ĵŒy&$Eçc =ï€pĤ”Ò)#ˆrŞ˘”šñP/-Ì PĊCŸ!ÊZ 7óbħc€ĵN);öĝü:é@šİZû\FòĜŜ9h`FƒĦÎİ⺀PkçÇ ŭ~¸ş]öٓŽt(·ÖfÛ "ˆrŞÒĥí:â)ĵW:ù˙R†ÒkÇTôô|S)ĝC CÏħoAáz†>Oğ ĜósS‚›Ž ÒMpÈŜğ ~HÑià܌D)•@”;)1˙Ċ+ݽöjŒ²‘C Ħñ]RSċ¤q!ž§iš~–ĵoŬc+ĉŻË0]wŜ\Ş µ SF†ŝîšäÈ[ ]ÀÁĊÁ"?^{ie¤ H:„cħ%I_í›Ĝñ3Bèßp*i–e;m°Ĉğ\.“Ċb•bŒ D9E!^E‘ĤédàїǤ ˙v„öĉ)Ái¨N`ˆ7Aê"˘<š–ÀÏHž7m…‘””HbP䣙ÇF2è{ÏI×2d0C#ûÈ÷×uïÇv&Œéŭ?ôyuu…(vfgú½ä߯ĥm[TĴˆ` Ê)ʽ{÷ß%ö0£—Ém¸’’”RÓ4Ĥ)càòòêşî˙†<eYÂrı„7Ŝx£7bI’ô†Kžçŝñ CĈF"Ċ ÜX† ¸bw…ž·ùñëô vµìI@QŠFŒééww ¸À@hq*}Ŝó.ĦĴµk­uäˆ` Ê)JQO”4]ZkíĦFÁ5ñϔBzÇxp‡xxÜ mÈçÇ+ŸaYŸtÜĥm{SçbZ„F Œ•14ĊSúzĈ}†_b˘Ü'Âàz/§²v=gĦFĦ¤GiğßIuD‰` Ê”,ËXÔRwZRj³Û·˜ŽW£Q½­½áTİÒ4"S+ËħċĦ‚Rĉúo\G‚ƒK)½#‚!â İA2c÷sq¤{Ĥàßcbd ‚(§H’$ïÂAJsÖ!\ë·{­´bŸc‡ŜêAÒ{‘e™x}jn+˜£F“ĤE(˜“FPğ<ìI•SÔ „€ €;ûBZ³Öú88‚('*˜ƒ×ZÏ]ŒecBÙRe6*ċS_ëó@}†ĈzŜ|Ż%ÎKĝùĝ31­1o÷ áÊàmƒ!ĈyŸŝ ‰’I†‡ì Ŝ‹îğiµÖJkŭ8F"ˆr˘BĉĞÏĝĦİ=_ûĥ—Áœr ñ!ĦċCÒ H84t(˜Z¤ö@׳8%ŬġĜ’ë\û`­u‚1³@häˆGG´Ö ˘D0ċ$‰†fMÓ(†Şç%eïÊÇîĞÀn H³ öÀď)y‡‡ĥ¸QàÂÇçpŽ=Qŝ×zöÁ;ö™*ìócßĜdß} ]OEP‚ív ËċÒ4Ŭá$À¨ŝ>Aq T˘ġ/yžCY–ŭßʲLŸ4b×Eï…ĞcÁ·ÇûUêfZ/²,‹ „ D9EyàœŸŸ›<Ïm’$ʧD\Œgĝ{Qĥ-TUÛíĴµ°X, Ë2¨Ş Ĵµ=û™µf³äyĈHÓt§ZRXCt°CÊ<´}‹+ß5óµ OVïSƒŒċq@Żo #C÷ЇÂ}Ôµ×)èHȵJZ4:Bĵ~éY“FâFI£BR(‡Ŝ7šÀÒ4…$IîMI<%‚(ϗ¨Îi Ŭ‡*ç?WŠ’‚cµoÀá\\9lސ§ŒiHĤÜC•­ĤôÂÇ|Ŝ–BZ ‡hñ^Ó…1ƒÀŽ!„Ħ2Ñħ ‚(§)UUĦ˘ÊÛĥU<N‹ŒŽÙC=ôıİtÔ1‡ÉHûä ƒ‡ÖV˘äÇì]` Üûc#S‘b]Ĝ{î"Ĉ#Ŝ£äĥòD‰` Ê5xŬżÚ~?ÔhŽzÔ*wiâÛħ ˙|m|ü<×uŜħû"ĤNQÌZSáûĵ4rÌLАï‚ô~:WâX€F*%ÇĞ"áÖġq ˘ (ì&¨°ĝ+‹}”µ/Ï~“Ĉˆ‡i§òˆ|ÇâCtŽċċñİ‚SM|œŒq.ŠÛ䕎é@  ı&>ˆONş·S¸cRcŒĝĞżúĞ"ˆ‘(§PJYÉĞÄqżX8¸ÒÙ§µ0t ŜĦJqŸ:O=ç²w1âñbGilíš1^ñuFhߛ!p’óŸJB9˙Ǐ>GĜU2DÌ5U7ddœ²½M =JQnâAIÓ9Ïo³Xm€ġèJŜ|†`¨ßĠ.&İ^€ƒ.i ò%}S!Ÿ ]ß3ßĴ1{9‚‹˘ïûrı­5ÔuŬGt’$²,§Šî[WÀë€÷$I Ë2HÓ4n‚4Ĥ#‚('%˜&°ÖžùŒġ>Ŝ‘o*áúƒĦb4WKX¨çФ/CôÌĜ&&µFJ{€ÇÂÔ ÍcÚĈ7ŝ˜ŝ>4p(âû{ˆ )ŠtŬo şŒĉÑ–îs¨ħv…¸žOÚbŭèoڊÚ4 TUmÛ:Gq‡HÛĥÏ´w­uhWK”˘Ü1ıwï,‹²’)z…‘Ĥéàìuê_^^‚Ö–Ë%Ĵ×k°Ö›o Ëċf³ĵŭöÛ0ŸÏĦkxüĝ1Ôu išÂùù9”e Y–‰ıuŸqĦ •¤‹nV ĊJylÉHŒ™ħà ÉûÖ*\ÓÖ6udç&%ÔK—ÓŻ:¤=öµógŻihÛĥÛí3ϝ1ĥÛ-TU³ÙlŻkÏ8úŬk%tİ‚ĜUÁ@”T*J);EHı( 0Ĉ@Ó4P×54MWWWpqqeYÂf³ĞĞĞbž²,Ħ,˃s˘CTħ!Ó5Ÿa*ƒr >B™-d‚Ŝ1€ÀódĤĉАfLıÏ4…)ZĠOÁ~§2 $€‚4M!˲·1-HD‰` ʉQrf 2ô| §ƒĴ„yž÷ŠïÁƒĤ)ÌçsZ÷̄‡xĴĵR›~&ìڀë¤ä+0t­íÏó\@ày¸ĵßA£‚ߌH†úÀkÄMÛ4Mó D9EADkŭĈ„½o ')Vn$Ç*¸İ @ˆ¸Ĥ<†xşÇ4TÏ[dÀu/Ç|ŝ&Ú2ö^â…wuˆ„Ŝ7İ}µkc̐|,F0ċĤm[Ô~ot­EùЧŸĦââôި\Ó4Ŭİ-@ċš ­çÓc*É9Ž4Êxj£Ë ??bŠ üùpµşĤ:Ž}n|÷UQìşïĵÛ?ß4Mñ¨î<÷³Cz£D0ċıĝoeŒ1‡Ë%IòŒçž’$}A’$}ô€öRït8äŽ óîӑàòÎ\kĦàˆÏ0F1ıħ† ĞÓ΅)ŝŻ>$²âĦ睂W€˙Ú皐 ô˜ ÊZûŜ$IЍ#ˆr‚‚Ž€Öz“çyÛÍ5ß1žTÁr݇+¨ŞŞ`ğŬÂĊĊl·[8;;ƒ<ÏĦiš8 ?‡-M¨ˆCœN—,)u×0LI„Ö¸ŝ&yècBÓ=M›Le„B .çÑi½Ü×ßĤ聋Nú{ş·Ħk8Â:qεÖ9y-†"ˆr*B”a­”2‡!İnHIsràM´ÉıBÍ ŒSŻ·]Ŝĥ!A×ñĵKÏŜ1)ŻxŒ)˘fkK  D0ċ”Á@gÄí”Çġñêse|d%wmĈÖw­.0ÀóÂÇ4ÌÔ³ß<ž˙>ÀàÏÇTÇ£µÇ|6”Rk­( D9=ÉóÁÌZ{°W MÜh4ôgêÏ¸]‡ìĞM]÷P \†hŽ£L÷üÓûyHÍÊħXñ” D0ċÄEk­Ò4]LñĵHŜ&­;ÂŸûĦÛÌ (í,Wê4Ċr WÑàMïçMœhxĠXoßeÌ)$$£ĈıD0ċT…LğğùĠӔKŬe%O}_Żé6ï­z\Q’ë4ĥRšbLÍÇóŝĵŒ`›,ÁSĴïX߁îşZëì6€Â( DıfɲLu``÷KvyŭÀ¸K½ó´S€Wís°t€`ߚŠÙϋĝêZ|×ïòŝı'O˙ÒöèÛ_d$g Û&(üeYĤ—Ëx:p,JQNHˆĦR°'ë K‘şòĉĵjlĠż/¤}Hu8­[àĠöœ )´ĉż†ûÓùxċP%­/$Âà2$CĈ ›{ïĵgcÚ膌ïħ.§žX¸ïúÇԌ¸ÖÉÙÇF|KxLÉhŸJŸ£D0ċ„d³Ù@]×327H OĤ‚£V‹E?À‹Ċ˘’Âßǘñ^‡H•¨áx—şĤÄ àSŝ’rĉíbĝŞœC.{‚áMFSöñêo2şpìëšĵÉ ?›ĦëŸÂ!ˆÁ@”çTŞŞR¨LêşîC‘!ŠÊÇǽNÚUpLEzˆGê'v*5ÜĦ(¸ĵ]`‘ÂÔw‘’ĜUlC&ob/(µwHÉġ–RJ)ĠQ„ż˜Ĥé9Àğé( D9Ħ =ß!ĊÄ —¤phn˙[ŒVH[5ŝ4 °Ï° ßg¤TÉ "wİĜk U1 ġ˜½œŞĜ0ô}‡Íóy <€‡ˆÊ1‚(§$È3àš†ĥŻÂ­k›Œ¸Öíê8ĥq™òN€Û²§"‡ŽHˆR Ê<|"qLW70żİH”˘Ü œŸŸÛÎXĞÎöŽ/Şŝ§…GÜ£v›,ôşmç Qĝ.vsŜv%ïê:‘û&ë:…ħ`—ú(‰yYËŬĦ˜ŒÁ@”pyùċ—Q³Y,f Q.ƒ$ġsÏé:ĝà÷5†\ùòƒ)<ż}×éâ¸îÖÄëR7]rèÂCöc *hGÍ@?m4IM˙%‚(' ?ñ?Ħf³™ŠÎZĞĈ)nit ¤áĥ§ĈÎ4¸Ħ†àö/_q˜ŻnáyĵURzÖxĦċ1ÙG‹}?5½żWS|—h§&’ş 4MT D9é"ĥûòĞĤiÀc•R*¤ˆÍ\˙^ç˜ŜP@#y֒Apb‰Mï´ïŻÀ‘G[ĈîáĜ—*uŝ{Ȉgü’$ÁÔğĦŬc ¨o½S'Ĉ|Žïôŭ›êğDÒħ%‚(§"Ëj–Y–e½·€ĈŠöÖSĉš@HiˆÛĥc t ĉóù`ÎġĜ“ôH^ŸÏ­9´Ż[Ž‹Ûîġ‰” S<HàóAg[ìÛU"ĵ_Mr˘D0ċ9UH(ĈœK`ĦĦıóP…™Òh—ÂmS0cÛúĈĵÇċA†‚Aĵë-’S€¨Cž?WÙ² ğżĠ D0ċ4ÁŽ/U]‘’•ˆMĈz”÷# ·IáğZ­ĝ1râZOHçm6h!) Wô ˜1ĈRÄÉ5Hj‚ç7€ÊZğ‰š1‚(§ <í$h¨aäĊrĦSíhd€3ŽĦH½ÍžÙ!•ÖCûwıĤÜ?_WĈİDöĊCó#B#%uŝ@Cœƒˆ` ÊİÈrı¤ŠPïu ëžd(ikámRò‡gŠÏ×qž›Ħëvq Dâ¤áŬ#֕h´ñ>Ü=‰Í˘QœR×5( ,ÚĥÍ;Żĝ°žħž/†şiHü6E\ÙÇ Sï[=~˘\ès55XĵéTĦç÷z­5cž™(xHZŻ;Ÿê"3XuçŠh F˘œ ˜7MSP.~Ş\BóıĴ_ıW\·)Ìı|#q‡" R<ĤIö5œûŽ]~ž<]_8{èzöéF[ :Ċ|‚1ktñ)ĦaÖZ(Ëf³Ìf³gs..­A:™ŞĴµµ6µÖ>€çv%JQĤñòòĥm3İ ŽĊĵŻEŒĥï!¸ŽÈ€§ZzçzµDz#)Ó!ŝßuîS„)íë>8Ï5K€…Ŝß1 ÊġMÑ÷I††ĥĤòš“Ħ–ÏħžùM·ĥîsÎԐ6OüI’¤˙~Ú§ÖÚ9@šĤħf ‚('(ÛĠjUwJÒÎf³~œ1 óÓB@n´P5MŬÀhšĤO4M³Ù ’$4¨BCß(Û/’+IİÒsóµ 7µŻ1 Y;ŬOşħ…ŽÔ ]ž÷Ê5ĉ™Fa†Xıá§à“GĴĈzŝĦ‘ħiİ>ĈÇÖ9é¸búĞŞ ”R0ŸÏw>‡İ)Àï1~ŻéyŜ´ëğ%‚(wTêşFmµ­ëşşşş‚ĊbaÑc Š:ŭs€?MÓìpžc Ş*HÓÔ6öMáü!u¨€ÑĴ%b˘!Ï ?\”·<Í }Žlé<PŜ5Ŝ4´Ħ!a{u]‹Ñ•ĥm!Ë2$³É•ŞŞê štY–A–eÏĴ[Š6¸ZC}÷<´­oÌß|5û¤È8`˘ż·m UUyß’fĦÄb¸fzïŠ˘ˆ5 D9ıwï^ŻÏ–ËeûáC(ŠĥÛmoÄѸáżUUaáá3ÚÓ+rŞıGí •rÌç4MÓ3I‰&Iišzɒ|ıUü.ġvÑàùèj}ıËÀIû 0†zĝ‡Aá˙‘iRŠ E/(àûJ ŜĴĦŸA€‰Çu|äĊ—‡ĵħ•ġC׆×3DĦì*@Ċë–@‹.c{GóúïÎ (˲d4 P×ġÎıëĊï~ÙAÛĥ…$ITÑ3ëġ:*È˘œŠTU…„çßŝö·—÷îŬƒû÷ïC–e µ†4MwĵFWN˜{~pyy MÓÀċċ%ĵñĈp˙ŝ}X­V;ÊÊÇ#ïÊğcê2.0Á#ph wœ³à#CuCkĉû€ëŞYÀŭGcÎ#+4rA#2ĝ9µá^MÓŻ–ŝ;<}é=ÀH÷ĉ‰X IDATEk Y–ġQ n²,ƒşağŬ:Ż '4BÏLJ0 ħè!˜İëş_¨CAÚéïĵ(VòœC§k†ÔHÏ'më£à–>Ô¨ÓgQ=È.Š˘u|„¸´ş Ïó>2çy[–eruuġß|èCúïŝċ_ŝ%{ôèQµdŒ Dıò'ò'Z)ĠöÚk>üá˙'÷ïß0kñE{Bö÷:fK\÷óë=ZkÛ4=$B%‚(ÏÓCñ´ÒÜt`à>lIŜÚPyĴç$U|}†NAœ:§z¨W{SçRĜ7½OCEšÛbxïb˜|ˆß“*bċ`QNE²,C²Ħûu]ż—ƒĦAD7ċ5܆ċm2CäGcBê·iÇşĦ˙MߐŽ‚İŽÉ ‹ĥmWpˆE Dı낞öË/żĵ°Öžw`@Iä.ü_ì!UΧ$S_óħ•ÎÂq]Foìós“…{ÏKÄÀ•  ™Ö°Š2‚(§€G°¤‘€1tû**ú°Ÿ—bĤµÛài^÷:¤<<íá³ Ĥ¸Ŝ}Ò8‡ŸŜÀèúĵ‡‘P%Ib‹˘PI’œĝçGD‰` ÊóNÏÏϋĥm—CÄ<>"À˘ĦSÚÖëÊĊš 1ĵûäú}žİÏÓÙ·ĦHÁ†‹żÏgüÇ?tMÇhÓĵCbá)cmv"×Á@”(óù\ĵôÒK38ëèO•é$y!ԤМN”úşÇÓÛâOíĠŜ&ïġıĥzBŬôú\’ĝ„D0ċDIŠ˘˜cîw5jŠ>y‰8Di‡*mixÎĦ-ewÉË<éP”çâ~ëîGÄÁ@”ğ.X@˜$I ³ë0~tÂŻÁuyWÏğ‹úî€ħ›Ú âE0ċ¤iTеRŞ:VhwHŜ7Ÿpž9g¨‹rşrhÂ]òş=ˆ_ˆ˘ÜuÑZ½ÔZŻ‘}ŒÏf÷|~ŻÈOCÜTT@:˙X:ċÛìíF`s·£G^cQQN €1ĤÒZo³÷Ŭ&N…ŭĉÀ›^ß]Ù˙çµxö&‚ùĉ7żİĴµ™Ï|ĉıù²D0Ċê$I6ÇR¸´‡ĵ;cğNÙĈnÓŜK:2;ôşpvÖ…ŽënÛŒ1€ ¤mÛBÓ4X3Kùô§?ŭÜíOQœŻm[cŒiqB 1| ñMĵ ÏzŠî ßq›‚wß. ßçİñ‘+I[HC#?St‹<ÏQ€ħ­ƒû¤í_ü,ò>h­€§óK˘Ü1'0nA.ĞĠSĈчÚÙlĤŞŞ‚ġz EQ€Öş÷4¸§† ó" ëŝŭ’ĦçEƒJİŜ8„ü¸"Ü Ħ2 %5òŸ_ŻïçXíĥȓ or?BïÑó \×;Ê8ì~gTw Döïŝîïbˆ*‚(wYj4Ïó H4F)Is Ĉ ‚ÙÇÀ+Òp†ô&×0½í!C¤i˜QÂëT€!Ĝ.Jîqˆrğ%Ĉz˘<#÷ïßGe23ĈÜx:l ġ/†i¨ñ:Üܤa9Ġĵ~4äw˙aš`>ŸÇ ` Ê]–ĝ išÂZ{FÛŝh;ÔUNwaRáP{¤tŭ§ĜêûöÛğŻ|ê}í"„=@>’( Dı£òêĞŻ@Y–KÔR)e´Ö{k_hĝ:ĵèCÇ)=×ĜkšfxˆĦ=†‘xžĈġŜe@°ÏŞ}…Ì éQHUUñFD0ċ. ĥ UU•ë§lhxëӘ݅SM”Ν²o.ġ:Ó(>Cş—Ñ‘ŽÁÙ&ñÛŬn>Żé_şë{¤ïìžÖZ}ŬÏĞ$ĝ‡¨¸nÁş&—Áލş!Ïóşi°ÖŞ4Mwş' £`&Ŭ.V¸ĉžŒísŸûœĝĈ7áÜ|OQž+1ĈäZëLkŬbd DcDÏ?z”wÇ+ċ@oŸÂÎë?íş†ë<˙!ç˘.MÓgÚ;i&X‡ž³ğWŠŻ#ùˆ½†=S’£òÙÏ~ֆĵŜİżĊáüĜ=×§?~ĴŻÔ?˙ó?÷÷Ċ_´EQr\uqqĦóï¨Ĥi ,KkŒşŜż”ˆŽğ‡ĥ{Ÿ÷ê£ŭèA÷äÁÀ_üĊ_(Šĥqi;œÖz°µMk ?ġS?eŝĝ˙¸G­<ĵn­µeY†~AĠ"F˜}!˙h­!IĜn·Ĥ)$Ioù&üÓ?ŭ“}óÍ7áɓ'ê÷~ï÷ŒR žôĦÙrıÌò÷żñĈ‰×^{­ĝó?˙sëßĝ†˙òË/§ŝäOŝä{îıçŝOÇqV|ßO]ğv­7 šY÷Î9|ßO#K“ıĞż÷û}kĊ`­ĦƒM Ħŝ‡-Žİƒ×‡żç! ÏFrêa% ­$.X¸2²ċµM^3×A×\ÂS§ñ= ¨Ŭn*ħƒÛ FùA´ŜëġüÇq¨ĠjQ&“Ħk×Ñ|0BhÁïœV_|£ĝòİBÚÓ×iżf=gâ$_ód·Ûm?NûÀò‚˲|^7c×5ÒfÂ`żß'ù3ŜÎ亯Af,ñû|3û22Úd‰DÂ2m”a+•ÏçU› D­V#Ïó(›ÍR:ĤN§cÉÍwVĉı?i°ùÓ2A´µ8İu:-dbŸ/?ö/N[ÈŜ‡ÎÑrGù™™#Qĉƒ%ґêf¤À–J(Ÿ˙“›œ8ŽÔ`¤¤†d÷)(kR†%#¨_GS²´ï\×UG6›bħXY^^ŝ5"şU,­ĜÈÑ+ŻĵrıÑhü_½^Żìyž·¸¸h§ÓijµZjÑMp‡İĞLÚ{lÛĥ%³ùaÄd  ÉrħQуÊkSĝyLÚ8™Rg ÂZÂîßTs‹â‰„jMB_-Ö˙ŝŜ{ïİ€ ^§Ó!ß÷)™LžJo¸nŻ„Ád§íd?û4ÁSçö^g…G Ż“;*n<ÏS˙žH$FF%K˙ï,ö=·{2ù’™ğtÜòş¸ó—¨€ä(Èd’&Ûg-Ÿ)l.¨¤6~/È–à™ kèżJDôkDôwCtŬ‹ œ;wnċ… Ż^ştİW.—ĥm[½^ï‘>×0lrŠ:x‘SgEuF: äÁ´é%,$!l|ıŸ'‘Mĉ>‘ѐí>şk*#yáëÌëW¸G"˘d2ùÈ8)ct'âIHR÷ß§ÀéèHoÏê™Ç%ĜêH{²&nÛ6Óiê÷ûÔjµÔ÷ôû}Êd2êĵÂÉq;Z1)§$Œ8,ÛÈ^†j ä:E•`ç ħ.IFP"–(¤hNžÄGÙĥŭ`óħ2×ëY<² Ëìƒ6€4ò<(ˆâpÂ6 _@ÖĞ` lTY{Áçöz=U/çġgD\pòĦâ{¸“Ġmš(5Ÿ(÷'?ߣ Öäġ .†ˆĠj‘çy Àû“É$%“IDü¤AçQäa\Ÿ)G!pŜ‚ˆ dë,dΏS€W6ĥƒ#„\dì48EAeÓ¨ÈGP0ϝ½i͂ÊÏAŝ)ȏûĵqd;‘HĴÂ7Œ Ĝĥíf³Y*&Q&“Ħt:ê¸LÎ İ^Ż7d@À£M ´1àÀùßlÔt€àwÈHוÍf}ñĵÌ`r(aQĥtÎQ ,pò<M§ÓÔívİŬnĞġÇçöûŭP’4Ĉrcó`Bv& 8èYA•q[O²}žĠ“:ĴéĴÍ:„“Û³ŝ,um†ÒWñ2/DAxâ&m·Ɏ$˜ž)ü,ĤMù†À` —Ë rı% r]—·rh3RS„#9ù|~$cçí²Ž#ġĤħéĝ{%ÁO: Ì\÷àxÀcŠŽáç5ŒèœOÖż%Ħ)]‰Ï%êĈÁ3Áï5á Ż Ġüt˙&7ñ¸›ú,Ôi2iû?-<}V  Yïş„ÈDŸep2ÎٛV{ò$’Üa™ŭ¸ĥS–‘_+è÷ûi´ŒpI^|İĉ!³bY{áQ–.K ÚPü½&qŠ0h\Ĝ‰şk˜´66ÎWG’‘z\™˙%ŝGôîĈа£Ê?Á¤Â¸ï=K´ŒóS„a²u˘ÑÀŝÍI8É=çùÏb´ó¸knJüLĥ3N)Aĝáä0éóÇ ĴÁ`(ƒ.Ò9ò°(s൧ èĈ³GĠΟĤÁŸv­R×wĞ+ÈÖ$L:ĤĠĞg#ŸD†~#ŒŸ:гT<]Ğp›b[PòsšÊ‰ÓrŜ’Œ-;LŬQ‰¤pz˘Úc Äì:Cƒ OĥƒADY‘ŞN:FŞîw¸SÀĈ⟯kې’’üsĊÈÉyñ’÷ ŻĠô'h˜Hzqş&=P r….SMtoĤu›•˜'G0iô;qïíiÀñô5˗ġ2ħó'9;AfŭâŽ˙Żû7ùó¨×&œ4Žó7­ ÚÜżüËżLĤÓi˙{ßûžpƒAiȜ·dÖ'z™ÄÉÏ™ï4#KŽˆèÈ&q2S]-ŜÄ6ĠġĈ†PĈqü9#Èáè.#˜QïĴgƒg} Óuyú|MÁOĝZÌ[@ğ.]f#|ël³Ž+f$"*;/âvpŸ#"R€İTŠšÍ&ˆ˙‰äÚÚZç½÷Ŝ£¸Á€ED9dƒŒ•¨"CŬ˘šàё/,Tédƒ‚ĊHT`Ü`eç£Ğ‘Ċ‰u t“vGV8Ħ’ĞiM@ñïÇ˙£Q‡Z„µN›Üs–2ßIgĜÇİé>IÁÄ<§y/ĜàuEuîa=ò°9Éd’lÛV2ĉĵĤ­k7g˙N#™ úŬ¸ß/ ÓÜw“|–.hÀ3Üó<'•JÙĝ{Ü`Àö}Ba‰ġ„=ì &½Ž‹0K8|’ÈxZÁ…ŝdşg^³“*ˆĵ›`œëá›: \7Á4@´ òĵ;„(ZĤ€zÜġ>Ğkœ´a}Ŝ“8ΠΣ(ç%Ž›5Á.hï˜ls7™ĈM~NëĊ¨Â,HÀq^úŽhh‚BQc½^Ż‚(~tşÒĦñ _wħœd(ْĵ pZ*oĥµŒ{ÀÇ!ĵÉaOÄEá,niíĴĤ5µ/ì܎ŒO3¨|öu2™¤BĦ@#hÂi´Žû’ç4ìçiÜC˜˙•\ŻĦ°\" 2İT*á8΢ëşêuJ~q!(íA†2ʃâRŒ²Ĥ4/Z~GÜ”¨×8İë¸Sċpŝüĝĝĉl6K™L†:5G´Ĉ£À‘“°é7F}úŠĥGžĠôƒÖ(ĥóS‡:éÊ(q²Ż06rĜûM: &4*ÊúÄ­ËKĦ+ùoQdħMƒ Ö.Ŭúè21Îّ(&UüntFœ°-µ^Ż÷ˆ9œvżß§\.GġzÒé4 r]—,ˢû÷ï“çy´²²Bív[ğġ}ŸşŬ.9ŽCÉd’FÀ^ݧPBÏŞšè8ÉS˜Ŭ˜uĉŻûı½> I ˙ĝ˙ĝ˙ݵuŬ´mÛiŜb†Í ­Ó"Çİ[› |Tíĉ°Ċ’‚7ìĉ1ş5­gĜf5Ġqñ|óù<-..҃hss“ …ùOı\NŭŒ¸F疀€}í‚(ŠÉ‘`v‚ äû2tZĉ—¸ oÜÚĥnÏò@4N+’Ĥœm`k’Ž•0cŒñ`_ĥYEeS›‚ ûÀîx`)ƒ'É~—×µÉÖÊäÀùßT*EŬnWÙŒ<÷˘ŒĝğŝiœÏ ı°Ï5yG*ŸOTÇQ.ˆ‹cÊÊùúÉs"÷‚˙ÇèoÎħá<'ˆ“ñóÂ?żÛjµA¤9oßÏÑÌJáûŠóiáÓK+•ŠB°ÛíĥúÎ(Ö³€ÈsŞkŒŠ¸š>)ö01§°ÏâäÎD"ĠN§Ó³ħ‚ä'Ż„Ĵ)Dž,§ċF•l”DC 9žF00 rŠ·7ÎwèĤñl§ĠjQ&“Ħl6KËË˔L&İT*İߑ ’¸dHĜŒÍf“,ˢl6şfQGż¨çŠ£H27îşÀ•ïÏq‰¸ĤŸS•AÊ4Ŭ°qíÓĥĠgĦ[ÀdÏÇ-Ç ?á8ε ç„ Ĝƒ`ñ‹r& LF›?°¨5ӏûŝ¨˘.&2â¸úÙ:ÇbŞy‡‘íL´îßıƒ“ġ<>ŝĝc:>>Ĥ/|á ä8---İŒ5{Sĉ‚ÏàFcĞ]™UË+i IDATnTM=à:!ŝMBîş}&…L.,Ĝ”Ï[ŽÔ6=Wîtb]üúĈé™$˜c€x@Vc6q‚LîüÔ:4lĴxܳ†~D5öaÙdœ6ÊI#İ>:+„5H³%Ş3œDñsZÙ¸iGċۄMŽŒŒ‹³aÑĊħN§,..ŽÔ…QĞ5Ġâ 2ût5MÔùĈÔ}'óLY ħÔsĉ0]˜³ÀïHid.u³ò:û¸ Ê`ÓÓh%ê÷ûT,)‘HP:éô‚ùz55ñN˘¨ĈÍƒFhOhš~y b‘O<Íéq2à‘%˜q`ċ°ñq´ä5D7P\ћIĈ˘Ç-µšÔ0ıVË$²ĵA| qĜYfä“$v:2ñ)½,"Z+<ÏÎd2'èHöóY}Ċi½ Û4ԁÂTÙ¤S‰[ŜˆÓmÁ3SóBij-Àŭ:S ûß•·1kíòig5Ĥ31ßeš™Ï¸†gš |a˘.IéóiŜï q0ÉŝÈ@XÜI^çĵ~Żi8RÔÖö°ÒIœ P<·e"˘Ż}ík~Ĵ``hÈ-ΚĠA°'algùwD¤.ò‹smĝ{Œ%kK÷’H$Q0ÎfÔIOK6xÔgpZPwĊ™[eí'2 ¤î$ëI9ñytF³^—Y‹qĊ΢ŜIÉ›ÎÚ<ĥFNóŝ­òîİD"aÙĥmñ6—ÇmR˜ŽÔġwVĥIÛ3£2zdA”òA¨€Î·M-Îs9é`t†qŸ=ÏşñÓäA]™Ċ{â8yfxP>N²Ë™*GŸ%.20Äfœ=0/§h7 jBĥıœuħÓfğ!t‡*N‡€3ƒ‹ŝL#ÁTQkîĜLĵĊŒODŒĞ€7.İr^Ú8Aħ\ƒ°ÏSًòg’ġžäOœgİ{Ï$÷µÌ7Í=kM²>a“ôÂ7ê}Ì" ŒÛáeŻôù—ÏEwĉ‚M—q'l²óQŝÈç§ÍŬ\àĝaĜœëş­ï|ç;VldÀ²Ĵ¤8~˙Y âÈĝ½—wXĉMNŬ$é5àˆË6ç÷ÄĠÇĝc\7Ĥ *Ûû¸ÀN”Âđ˜F69}&Ë;)mVÙÑIfĤġĝNšIänœLjÒ nœïŠ{½QÇ sĤ–Ö8×Ċ?#™LR&“QmÓ½DÇŬëqÏYö$gÂÔ10iÒlêr‰şżˆ¸Ùaİ gÀ÷}Ïq_ÂàfÎlÊY½‚¤£Êsâ]ÜùŜ&ı~˘›Ö|{6;/s@*ރüıEÑġû›ÖD·WÂZğĈuĥÓt‚Qy“:› єqŻyÒ`h²$‚MGĤiLu{nÒVËYfŜ'N8O“Ĵ9‹ë;I„ïĴĵ èÂZ"‘pˆh+<Żíyž/úYPĠ@ĈuĵĤucéÄIt†jœk֔úèÈf³Ôï÷İßï“뺪=·éÖEŠúpĥq¸™RĴ'q²„“DuVPĥI÷Y]ğ°@Ûôoqïġ´‰nSİĜD>İAvq’UZ<Î3°mÛ·,ëççӋ ĜĥŬ)•JTĚÍ&ċrı‘ĥ³¨Z÷wŜçr ×íÚĝ:…A9]1(páÙ­Ìê£D›ĵĞB*ÈE1”x?6eĜŒiô½ŽSĉ“ÓŒtzÛĵ ñqt„³Ë>)Îßä$Ï*™0èz£rĤÙ}t÷ÈíÁ<œÇ­|=Ğg‡2%‰¨­ġù†Íg ƒf:öAQÄt&Í‚&é˘§q²ÌiEnR˘™·äE}˙Ĵ{ҁš iÂZâp0£ÀLúñOÂË$Mu-Nr͓¤p–Ây\Ÿy9ËÒ'†%ßĤġ˙ġ‰(aY–yéN§íû~'ˆáxšĈ(ÊBŽğyâ2˘M3âniÂTf_|úïpàʌRÌ4nú,ß 'Íù?}E;oqĈLÇŬG§µçt8ç1Žc{ÂfÇ<.Hƒ†_gàĉ͛TĞĠšĥm÷¤&ġ4ı‰ˆ¤#Ÿ…µ˙Ċ‘fT<Îĉ9ÉşT”µ“/)µÌGİʃ7OAâ,³iĞ“ċ—ɘF 8ş1f™1N+—VŸŭ4ZVç%àhžD‡LeΘ&vĥeYƒXÁÀŜŜžĠh4şĤ½Hş#Ĥ‡dšĝ5ŻÁYÈZâ;²u’ pċ“š>iŻ8Š–AĈîqšĥfÁĵĴ‡ˆ’òèó„`„Ŭƒ”]×9Ġ¸ûQ’ü¤L³i`žnöŽ)Ĝ§µP&ržç‘çyÔn·­V+20ĵ€8m™qOĞ­›@gó‰RC™…’T8.ä7mÉÉiÓd7lvSİĉIq”Ĥ>ë gĝ¸LBĞ:fôYĜ?›fëâ¸ŭîQHۓÚĜkÇqĈC>O{5èĴš‚…(62Nq’ĉjx½­ _ÒCĥğoYVÀ4Z ƒZ'˘F>ĤrÓì³'ÀzšiÓXc]y *´É݃“#%“xÖÒ¤gÉŽ;é0c8 M˙ É`S·}NŽzžefù¸¨'}o§Ŭ^g„=·UqöAœu§qq÷‡eY–mÛÍ ÷&B.ŞÇ3Ái“+˘n*ó×ŭ[X]%êġGé˙×AL“n´¨#lŒ­IÁOĥNòÀC>gÏó(NĞ˙ĥÛmÊċr#3$ ÓD§èˆK&“ĦƒÖ'Ìٌ£Û4ŽCžwÖw܉gÒٟUd#Ê~{ÜZd=îŝ÷} ëVáqOr)ĉÌt‚†iƒrıLDä§RİV§ÓĦn·KÙl–<ÏS2ACçäùżq2n³çy˘ xż)˜šhYÖˆŞžî%óÈìÌzè÷ûzMa™˙ù¤‘w‹ectœ€ ¤YewÓúŭivkœ•@ ʳ7­ÓJĠĦ Ó}êÎhP˘59šç5ŠR;kHÌ´ïáÁxÁ@*•""ò“Éd=Ċ‰D"r-ċ,ŝq³İ°3q›gy‡]ԃϟ·äv˜Ä4‚I s\—wVˆo“œĠÇUÌĊĞ…Œ÷´ƒáyÑĠˆƒ`œEÇ=Mû)’XßqœxÁÀŜŜžED}˲ÚaġYuĝû(‡¨óIÀd:rÖ8ŞgœÀƒ!ÓçÏ"ŸEOö¸ûyš#JçŬ°ú ˘_ŭĠ_µ^{í5"˘„mÛ"RŽn^2„YC•&ISP`ÊŞMĈ&l ƒ2ï8Y°İġOfĥĵmÓó<3áZ0Z:!Ë$ôLÀĊAN&q“ aïWŜwÜïähA2™ foƒĞ˘xqџ³šäDµ ³r@Ë ²Y)…µ°dlVkkY>Ĝ&"zçwĴ_|Ñ Ο?OD4( KĠj5qîÜ9J&“~·ÛµÇĦd2İzëdÀşá>| *×uÖ$d˘\PG§ñŒž˙(™B”lC—…ĦÍRgˆ¸Cf3mĈ0X6ŽáëyP€ÀÀó<ê÷ûÔï÷cÁƒòÀñ݇qÍĴ ŝ“ 2ƒ1ìYMÚeŻH¨q;BL÷2öSSŻ{•Ä8ëxV8qÛe§½Ÿ£¨¤ÎóZÎúşĈċSÀz9ĤDî‘` ›ÍZ–e >÷ıÏğŬ“L&GDxĤ-Ĝb2ac‚Oq1#÷¨™˙,ŻÏ´ÎAÈ‚,x>ğ>ÎÔ2“2b”{‚sjâ,žß¤5ɨe˜“ù–EÇ:† ÄEVĈ ĤáÏ: r’@àI²uŻ“L4ĈxıDDŸŝô§ŭ`@½u‹ĥm;¤hġ²IP…¸ƒpĈŭŽ8‡4ŠS™Ġ^™d fŬô8JûžEëàċĜi ’üóžĈ ‚N: `×äFPŻw]wĊĥí Ç4³™8‹ fyĜ‚³2bĠô3Ì~P1ŝNÏóĈ Èdú$F2,›ŸVğÑĠöŒgEÇż‰“á›Ŝ7-ĊË8Û~ĥċqך‡Hz½%“I?™LR§Ó‰ŜMH$ĴaP°lYV‘%oAšôĉ°)e{6ĴmMŝ=ˆÄtVgmŸTfց#‚u4ÁÊQ şluœÄqsNƒijeÔ¨\:]ëhĜzĊÉy€ûŒ°n³ÄPaÚ$?/&Ri,Š Œ4j@ÀżO÷˙òÚtÁG·t×g"Êrò²têrd7~VŻ×)“ɨï%4pĴ¤½D7HŠ‚2qr5Ÿ#ÓëġÈ÷}cğ¨|ġz½‘{á÷aÛ6R)J§ÓÔív)“É<ñ%ŬyDÂ.'r0N§ (Όﴸa­]óT8iäO@œ5ò"GœJ¨ßïS"‘ Çq(•J=ÒE'›‰óLe—‰Ì^ñsŽE‘Ċïñİ™2{’s˘:À(A>‹;ƒqP îĵċjÓ[×jÚgqZÓà4‘‘ƒ[˘ÛQg}„µÖÊûG`(“Ĵ¸ü.$Q~^>‰°À™êJu|oMۉÊÀw7éî چ%2ĴÛ7è,Šx?NNZU³–; ,Ëò" Ör}ß·ƒġûŭİj p(Cf9ügQœçiÀ·qUÙ²ó #i‚;ÇŬLÈĝ5r•JcÀu]ê÷ûÔétÈ÷}r]—<ÏÉà”M$4]֎Ïp]7:a8ÔÉ9 ӂ;ÓA9÷¨ğż Ç5³‹£@d˜°>X+2]” cÒ3$ƒ pôaœvĞ°ß‰Ó Ħ ‚΢nŸáç™LFûÌĈıžÓplŽÄ>GƒÁ€şŬî\—ĤÙñf:÷³Ô(˜’à‘=üÜ.ÑññħU*•‚uòùĵED”Ëċ2İTÊF–ˆLqÜM­sîaŠh’d–‡iÊ8-vQ!Ì@ΈĥA"R‚üád3^‡BÀ!Rß÷İßï?I"L&“éÍ2“Ò­ħtjÓm™ċlSÍyÖk…}br|™•Áž™‡ mêá%‚ÇġĊíĵ‘şgñy“ìÓIۆgvlQƒˆzDja02€ˆ7‘H$Çħ‡ÚJ$ÊL cÏQÄ4#?ïä^[5ÍVàŞƒpúaށ#ڐÁµ%ÎkĞ×igrĤzy” E×Ĉ4Éĵ S˜Ġş†‰NEí $Šcż$:¤SWÔñ L(bXv7É0Ŭ¸{·ßïK'ĵ£ëú:Ís:ĞqÉóAhÂ)û<‹ˆ:ĝ‹|ôÈİ@ĉfYVŠˆ,Nx™·MpZݍĭy†Òt żëşT(¨VĞİœn,tû€×òı˘d˜ħ9é{ŽâHç-àœ†VCĜg€`úĴN§£?ü>œa:•#CÖ8Œ/yDŸÔċċÓ!:ĤŸġz½GZgeĞ“àö<šÍ&%“IĊ’Ê_½^<Ï£T*†šq+Ϗî̌¨äŝF}÷Á‰„’#‰”ïSŻ×£^ݧHƒ–eQ·Û}Qœ—×I!ˆ“^ß)úŸ>i+L­†‹1G—$"µ%ô£Kíú'ñġ¸Cĵí NÛ²,Êf³”Íf |‘F£AĊbQe>0,:Ċ˙ ï—Ó­Vë‘Ğ”-bÀëZǤašiê8(kÀhs˘!ç\Éïr”E'Ë, 9_‡n·˜ùÉĤ<Ž˘É š:ÏL&£jüşë€3…áÎϗËWKǓÍfÉqœ¸ž?£ç]$2µŜ #5dϽì^ÀŝĈó‡#ìt:Ôív)‘HP>Ÿ§cò}Ÿ²ÙĴrp–ŬnW)ñ} êt:êóħÎpĵÙlv¤L'Ÿ îÀQžCYOÇıáç\Jş£•ĜqJ$”N§UÀ8Žş÷N§Cŭ~„÷ó¸Ú÷¨EÜÄaܲá¤A„ġÉË÷}?cú„éĉlÛöùa6 şy_QÖóĵ6ĤĴ ڇ`¸Ž)ŸÏ“8êßax¸áÂ}çóyê÷ûÊésǒN§UöÄIÜJR)_KdVq„sLÓ'uN‘g0à¸?Wd}:ÈŽA×ĉej$ÏÀLÏ g§ÓQ%Ĵ1œBPi@fŝüçĵÔ´üùa^ ÖİÓé(g‚ŸË²ÂŝŝŝÈgóNù\P"S •;SYÎÂ{9ÙAFżßWëÀ9.ĝ;‡FËËËTİTÈu]ÚÚÚ˘f³IƒÁ€ċr9ò<rıe2êġzÔï÷)•J‘8ÊáĤÓijµZäy%“IJ$Ôï÷İŬnSżßWm{­Vkdñ<şŬ.ċóùGP:<{°\×UŽœ#N‡:9ŽC™Lf$pÀŜ8ŝ< µ~½^êġş òx7ÎI"v'ġùqP†0Q·qG“Ŭ0• ùyç{çÄu]J$çyÑYVÒùä;|k1Xòà>éȀɨÏûÚĴNeÏó(NSİT˘T*EžçÑööĥ2Ùlv$‹âÁ>{_œ……ò}Ÿvvv¨^ŻSİTRˆÏGçp0'¨I(W‡Léĝ Aώ&‡Iñ\AÉd2 çH‚~Pùïp4„×X§ëZÒĝµ·Ûír›DÚí65 Ş×ëÊá £Ŭn“,íÉ678tİ ĥĝ5ƒ?çV,)NĞÀñèèH(pxÜnHÄ@ÂúŬè÷ûÊ9ÂaÂFñ`€_' × gĞTĞĠ‘r‡8TİTôż°°@Íf“lÛĤrıĴ>£Ŭ‰ˆÖ××ɲ,úñL·oßĤ .Pżß§ĠĠĠ‘Ĵ(Ê*(ÁAà(Ç`0 z½Nïеl4ŞphĠ^ċÄKŬnW­1>—#ĝ^ĴW&“Ħ|>O•Je$ Ìf³´żżO ´ħħAƒÁ€\םڪ³–ìÍËŭ™Êod÷}ß&˘6 „‘‚DˆŽÔ,Ëêƒ$Ż=iŭĤ‡QOÌòĊ³gžUf2ŞT*T(È÷}Úßß§VĞE–eQı\VF ;ÊT*Z×ÖÖh}}ÇĦŭŭ}:<ı;ısçF\+ög2™Ù˸&~_@<œşŬ:ĝoéuG!\K@W&_Ÿ…ïjà8ŽÚ(,,,h5VVVèöíÛÔëġT ñIsì'ùaIe¸–D)ÙçùïG×À›=Ï;²,Ğçû~RŻÇ/ÖÛ´&җNàg’ë“pŞ – ô£C`tÖÖÖTĥ°³³C>¤ĠĠUeìà`X` ÇĦrıLµZÈq:::RFĥZ­’ïû ~•pÍ8bNt„AL$ê=¨U­2Kî°°ív[9d´ÜÀ˘ĥ˳Mj$3X,Ï_@`d0 ßáséüuä4ŝ^ŝùœä à4ŽŽŽ¨^Ż+‡×íviccƒnŬşEFCí ĴoCċ=żfÉ9Àµöz=êvğÔív²Òét(‘H(ž.ĵ>dżÏVĞEı\NŬìĦRİ4Żz½NwîÜ!"Re1Žî+~ÎPz½€kŒ}Ż×S(×Úèvğ#e˘_|‘ÖÖÖ¨VĞчG2#^Ÿ–ƒİt™›—¤ŠbXmŜTs“ˆl-ŽZw:¨N–$‚ö.~‡k=käġsÙÒ&ĊÁ$sÎ@'Xĉ*p§ V}.—SèàlM;ı;˘)“ >*›#'ş³İĴ%× Ž6™LR:&×u´nYÓiŞT*T.—Éób„‡ˆıò8:€•gĝRzàבL&İP(P:ùü9µ™%9ŽœpDžGŽÜò2/…¤R)E~ä-^âB78&Íf“RİċóùPێòžNŻäĊ— ωeY–oÛvŜqœäp_Y–e+ú'ìy^DzĴŽí…M$LWÁ/,³ŸGNÎáNëÚċਸ…  wpfëRħXv‘ípŬžMrTCLjµ-,,ƒèá‡T.—ĠÏPóċפéÎkÛ2X‹;1h‡ħuĠTë—mj:N,hHB]„IŬٔH†ِÎĝ9–s<8ŽCׯ_§›7oR­V{¤OŸ#²[AÊ[sĝœF€Íñ{Òé4e³YE˘”ÍIvĜ3µZ\×vğM{{{êó0“p:8:ŝ Ö0›ÍR&“Ħl6ĞÎF·ÛUˆÜP&àAo ä?“’Ü@†d€Ì?NĞ÷Ù Ĵ€@„· …GH²ĤW·Û%£Ŭ™ç:ŝĝ2=/Ŭ™·mÛ³,+eYV.22À ¤8ŝpSú>Ċİ?ÈY}ĉiAkZrÈĵç}%Y#,•JŞ~ Ĥ:ŻJĝ™oϟ?OôÖ[oÑÑё‚mQŽ’NYĥĊHçǵì4ˆş—‚´ûu< 鐃ŬŜâN1êuò€k Çf8쏔18B„Ÿëúìe+"ïxàŞs¸~88büü™gžĦL&Cożŭ6Ġj5mĤÉkĵŽïÂçóZ?ݽsÎ8@°·À3€ R‡S!Ù?£ÛíŞr`äùÎċr*ÀçĤÓ鑽túD4ÒÇÏ[usıœşv]ıĵ kD@‚ÒIğŬVI£Ñ ÛĥU· ïDA`¤Kĉ²ÙĴê¤9KDòÇı,6Caĝw˲ĴÁpż‡˙]th(ElñÍ<­Ċ5ġg?Î,‚ ½Êµ ¤ašÌ£•J¨X,ÒŜŜž2ÜÈ0x[g##û­ĠjT(”qŞT*´³³£t `–£^uen¸ıƒ3ûtë§Ë £’y”ÒCXYH7•OÖütŸ!ı"ĵ!9aBKRô‡ (AHâ#wŜpp„Èäóùĵr„\ÔFĥrRĦìhᭇr蜲Zdpò€Ùá4A˘“ĵ–álwÊçóÔn·GȄ@Ĉĝ6qÇq¨X,Ş„BĦ Ö–OqÄd? IDATçáڀpµ?@ŝœlÉyXü.ĝ Rôˆ' Òic½öööèèèˆvwwİ\.+2Ħ,‰p›€6ËVĞuff0˜FqÙİ„1YuRk’ĉ–H*öO–†v·Œ÷ŝèG?²>˙ùÏûĦÁ€mÛö}Žó2Û|\`ĤYâYžé™DE%LPy"‘ BĦ@ğğğÊ(ĵÄ[uĤƒƒÚĜĜPĴmÛTİTT•gşÎž™ê|dÊŸŽUϝš•ÎVÂĜRPHgp¤çh› 2t| dĉ²P3'J‘†l1” &t o•äŭñÂ{ïŬğGFc„M/µ$$9Wq. 2}d¸Ž(DžġlµZê{ …Â#{H .´bbŭÑÇğHÀş!Qx///Óîî.Ġj5*—ËÔh4FĜû…B …‚z–™LF•& TĞUj4Ôl6İŬn“ëştxxHFCuË‹E:>>ĤL&C‹‹‹Ş€#@8S€  5%„\.7˘EÀ[›ÍĉHÂï-Ĉı\N=Ÿy LŬTaŻ ÷ž_u^żßÏ_ır%qûöí>Î1°†ï²m;éû˙9ŞÖÀĴaú0˜uRNÂ8×ËuC—ùĊ}éĉÙËZpXûbrŒ>ˆbĝ8)>żž‹—à3666haaÖ××iii‰<Ï£­­-ÚÚÚ"ÇqèÜısŠá Òwžşµ)Ê×9ñ¨£duk&‰sÜyéÈpòĊψNô‡“şĝhp\`f´‘‚x!‹Zı”³E‡ç§ÍżNÙ+oɃĜ ~΄?Á` ²˙F£Aïĵó}ĉ3ŸĦ|>Oïĵó½ûîğjoÈ65^"@Ĉ-σçyT.—i0PµZUżÓh4Ô˙§R)ÊċräûâX–EġzÖÖÖ¨P(PğŬĤVĞô1’ɤ‚!œeÛ65›MrGµĵB€ÈĥmŞ×ëT.—1PŠñX–EGGGt˙ŝ}:>>ĤVĞ5"*ÔétT &2o\>%ܛTä“@WVV¨Z­RµZ}Ä9ıKÍf“ŞĠŞjñä%§D"Aív[[(2bûĉçRɇ‡‡* ‹’eÏ2%9šµâIÒ ÷’5ÜK?ĝƒ?H˙ٟŭYÛm0Àtrï§xÔÉ[ÍÎĴŻsŽ&öı bÊ>79 Ŝî£kA4Zò³xf‹ç{Šyv¨“ħ”şĉüŝ?‘Êa8ÀTFĥąğşÙlR&“ĦÛ·oS½^§½½=%l‡ĥÀaÀ9*•h€T(ä˘*üı@´%(•xÄIdµàN‘gßşž^T‰Ĵ‘ßż7Üj³¸~ŸœyŽçγm.p#3o|'[ ù?92ÁçŞĠ*}üñÇdYŬĵyS9DÎ2°C0"Kœȝr­V£jµŞŒŭŭ}*‹tċÊÊf³JηŬnS§ÓĦÍÍMĠbÈu)8EDJ Ϥ٭­-€9Äbħ8ò,Ŝ˙}ê÷û !og'ËòN  >˘‹ß[ĞĠ”šçĞŻJïĵóŬ½{w¤‚?+œQìNŝ%"jµZʞ# EiƒÉöööèĈêúqżív›Ž_c3ċ¨P˙YDœÇE‡{(˙ʅ òDT§O4Ìe‚|>o áŻĵçy.O&“ydĵ­İfT3—t’]P–.Ħf°&³dh’ˆĊ wœ8´p`ܐqB‰Î[˜‚ nÍx&%{ŠjÙĤšğ ½@6ŠŒ 0,ŻKâ…uu]—:ŽÒV‡  Äqà„‚ž/ґċ$ú!ÔéoA­ˆ<`àÎ_–d7ƒ|Vşç‚lœ³ĉı#ÖúñX3]ÄEe¸(˙ı˙x0)g·×í{|˜óĥmÓññ1mnn’ïûtpp0ÏëÚP9Ò"ɐ<{…³ĞVĞ´··GÇÇÇ ™r]—òù<‹EŞ×ëtttDµZm$›FP‡`Šß7”0QŻ×£f³9˘ˆ,H§ÓTŻ×Ġ™Èf³”ÏçİÛíŞÖZtÍ HEçÂ5x§À`0 \.§Î öċ˗•˜8ߛĵ܃€ßĊğä.t]ÉçóZgä ÁY,×Nğ qĝXŽá>żş°°°LDÛÉdÒ DĠ§RİĴïû.7\eN7C:J­< ÑEab›êAşMŽúaœÏç5iyrçVÎ0İÒE·ċç Vjúëôïuk%ğ²Ù,•ËeŞT*”H$¨Ġj)B àlž‰މ;İIŻğ>];šl14ȸ gSGl§$7ŬwD p%bÀëèœëÀK'\ˆ˙58ü'ö%ˆd²„ƒì{W7*˜·Éŝ\'䤏İX,ŞDÁ”pá^’}ĝĜxx) hwžċr™ÉqÚŬŬUòxžÊG.ÁÌż·ÛíR£Ñ ƒƒZYYĦRݤî <^^!úD…ÁĊññ1-..ŽìYÌ7€F??^FƒZ­–â “1rGñ$ĝgyžGëëëtxxHív›êġş ¤ƒ+Àj|7—Ĉ½Ħƒi8םNGL(Û è j~I\g&³;NİÂK.AÈaÔĥlÓïE)“˜ôSli‡LÉ&Orımîw7‘H$uŝ'°˜ID˜QêŻAÙİÎĝ›àâ<è äA7úTÇ× ĵ„MĊƒÒe†:5ù½|ŝğ\ß(#hċ\ÎÊ7İ&ê†Ŝ„‘M@xBm°Ùl*ˆYŞÒá!sşñĵ)IžùpÁ#Îâ–}ô:rŸî`íYXÈìœ/R×A§;&6%݉—s$éY#ş:2™ŒÚsŭ~ŸŽŽŽyŒ£ ş{ä÷)IŸ’,(ġtíœxbUİTT—ĉ`żàšñkËğt¨"ˆ‚¸žBĦ ĤL&C‡‡‡Êù_|™Òé4ċóy:::˘(ċÁz½ÎYÔ#< öVGà‘ÏçİT*QħXTû–K÷"Ħîĝĝ˜’ɤÒöçM€çïŬğ72‘#=|<¸8TĞĠFbUĞUşwï%“I:wîġû}zĝĦŞġsD’_'î ™<'|"°ÌçóŠGÁù*àeŬ½{—>ŝĝcZ\\¤gŸ}–’ɤâ/ ŸÏŜääÂFh!ÏQÄŜ¸ÍA²‡`‰Û^]wŽNBZ~‡.)Éĉö…çßèTJuŝÔ$2‡ïݘwGñ{˜Í ­Púà„ÎÑ /Ĝ–Ĉ›GŬ:G˘“‘Ġ=Ä(‘ĦÉ™r(H>hDÊÜħH9SàpbĤ‡-”|¨òş¸óàċ Ô)9”™H$FjÁşÀ -A&!b~=Ĝìĵw\ xž§j—ċr™²Ù,=|ĝ”.<Ÿŭ‡Äe†QĞm6›Ôl6GHˆ&!Ŭ3Ġ=cS°%Â×É/ËÒ ßû2xàgÂd0$r&÷êĝšsÍy"˘BĦ ÖµĠjÑññ1Ġj5•9ò@Lžꄆ¤ÑÂıÄÌı-Üİ [\__§ĊĊEjµZ´ħħA;;;tċÊEŒÜŽœéž#2P|4ò··· ïèèˆZ­-,,P"‘ jµJożŭĥ*ÔëuĠêˆ3z<œ×@O=Ö,‘HP.—SäE@úœ(‹ %ŸÏÓÁÁŭûż˙;ÙĥM×]{d”1ZñŝĝcêġztîÜ95ä ötİT˘RİDFƒŞĠŞJ˜Ào2Ğkהó*‚Èà:%PîV \†²GŽbĉĵ8>š[w ĝ|Nž–|"”ctˆ§ô=’;†€·çÊÀIĥws} ÜşFYìûÛŭa*“êGž Ú`’Édj¸İ| ´³ÀĜpf´4zAG|njŠ+ña!Üs¤ƒÌßk‚ktâ7A°ĵœ³.§Úágœ Ğ—sÍq>ŸÙ~Ż "6Œ‰ç†5"êRİDëëëtġêUj·ÛŠd„ kĜĵŽ½ÂµÓ2ô!k:‘ °öÔ0¨Ò„ ˜P] !÷Gw&Ĵì#ÛAêB0Ċ>²mœI>k}$qg Ó4kƒÏáÁ&öĠŬğwİ×ëÑîîîÌÏɉ<ûċQ|âځ„xžGı\޲ÙĴŞĊ[–E‹‹‹´ııI?˙ùÏi{{{Äó{G} ~Ö^‚@˙!§R)Uš€8ÏÚښj‘½wïuğ]ZXX ŭŭ}u½‚°ï÷÷÷éüùó´ĵĵĴÛˆz½NÇÇÇj=Áƒèġz”ÏçĠżg³Yşsçġz=ZYYá7pî8udê@ë€OwîÜĦŸŝô§äyíïïÓòò2 ÚÜܤT*EÛÛÛôàÁZXX •••‘–£Cxĥ>TûûG×U…™ĵ)á’hĴäÄôz=ŞVĞÔíviqqQuF@›耔}ĉœ)ûΘ²Í—#œ„ÌÏŝ.GQóï+“hžˆ  6N+ï8µÛmuËċ²òĜ“óç  ŝà$‡Ä 66f½#ċÚßA5‘°,-n]‰ r£ "–:ßĵ/ZéKi]“ħ—ġyéZd !‡Py‰B'GĞ›LÔ0`µZU¤'Ħ¨·Z­GjŒüù˘L&“T.—iaaA]_İT 2}qĥ8ŻUa˜ ĈâÂÈ•(ĝ2!>üُCìáώÖ&R%?ÏH‚´LœŬ˙#°Ò!ÈP;‹Eşpá-..ÒğïĞÔğŬ"kÂ9ħÁóçµc pc&Ë|”1‚d=x€677)™LÒòò2‹E3ĴNŸĊ3/Ŭxc\§mÛ´ĥĥF•J…ˆˆ~úӟÒáá!Ġj5U/ßßßW×WŻ×)•JQµZUsx0Ìı È ħ€ĵáSİ”Ñ\,•{˙ŭ÷éèèˆ|ß§|>ݲĉk×)”o}}]9½ĊĊEÊd2ށwÍà•ÍfİT*ݲ‡eY´´´DŞ=0—Ëѝ;whww—2™ mmmİûi4JA­‹p‚ ŝò5—ÚÂy·,‹ĥĥĥF!YÙÜܤcşyó&ċóyJ§Ó´µµEÙl–ÖÖÖÔúñ$ Á>Ž zĊ':ÊòĞnĥ…nt3 ”–vvvèÜıs”N§•~ïê ÔâĝÏĝû3‘rŝŽ€L"şŽ4>ƒBv<ĠëuX!1Ěc_@Ó÷}ˆöRİT_ÇħzÄ2_ż~³ ’èÇDž@UŽ×3ÑJĈë<şlƒj sİ™ùĝ4À“>¤C5½ßïШ‹³­ı“áġp“—F”ÖívğŠIÌĦWNòCËĈˆ–ËeNÜT×!ĊZdF‹CƒÀf³I>¤ ŞĠjŒ¸Ċ\xÙ_*És`M3™Œ"K!{à“Ġ°ùá„À˘ö|¨ˆÍfS=sŒĜßh½Ó!‹`Ò7 Ş×ëT(èŜ½{ôÑGİÑ×}ô‘Úƒ‡‡‡#™Òŝŝ>ġû}÷ñaròœ‚ëş´··G J\ü˜ĊĊĊ%A´Í:Ól6İRİööĥêj6›táÂ:::"Çqhyyy¤C VĞİÄċĝĝXM~„Ìq­V£[·nödɓw$@|^·ç טçkCDtxx¨ì ìÓĈĈ½üòËT(èΝ;Š[]´#Âs(dè’\,;‰d­â’H-Î.²Ŝl6ĞΉmÛ´µµöÏÖı?A';ˆäé82˜‘ˆ…L,¤ ÖuÁIÍ>µ> żƒ[ÓÒ "rÒé´J üÊWbU*@. e~SèċċQSÑħ9ƒê@ĤÖ²¨Yŝ IP@Y¨µÛmj6›ŞÏ–Ùœ‰ÍġßM%é4ïoj‚‡ÂXÙ`CƒÏÉvşİ|y$ˍE­VSQ1Z¨¸,+GLBEĵŝĊ3q˘°eáà,™LŞ.…BAŬKı\Ĥ\.§Œ+`SÜ;Ï`yF0ĵ~ϳ ŝ|$ê2ĜÁÁĠj5ĠÖl6UÔ“áÔ<Ïg1‘=ƒä„u蒄$ħ'ùsBżımÛôá‡ÒĉĉĤÚË8{Ġj•ɲ,5{ž¸ fa#şyĈï5™L*Œ€7Nӕ+W¨\.ÓÑÑÓiĠzǙ쨙7›M-ç·T*Ñññ1RİT˘££#:<ĝà…ú5 uO8Ox˘ƒçŽy <(ℒœŬŬ]ŞVĞäy=˙üóêÊċ2Ŭşu‹2™ ­ĴĴ(Ŝ¸Ùl–rıĜS\w.—SsOĝ“™tšĴÓZÁߓɤB@‘$ jµZjŭĝs‘˙Ċ—(wÍâIŞnêĤŽülò‰>V£ñL™´;ô3ޤC „ĥxn&“Q5>(r–„ô}ŸJ’"ŠqÄ@GZŒn"iÉĥ59ܤÛíR½^§­­-ÚÛÛSFï•:ĝœm+áNŜ“zü˙Ğóz ËĊĊĊ‘ÚZšxy2™TMöĵó€÷ (y0ŜŜÎÎmnn*ƒˆM‚AžĦHˆˆâµj‰ĵîĊ >Fyy™]ğF—/_Vµ< eÁZógòG^ĝ°”V¸zwĝívûä­@¤ŠjXCÌŬŬ]:Ç÷2L&£ÉïĊDvÔĠ)Ò#‚6Nĉ<88Pè‚—û÷ïĞ pwww„Íeƒy&Ğırä kÁ…rxŬ}}|ß§ŬŬ]JRtxxHĠj•*• ]ĵxQ•,鐲Ù,;wNĜà˜t|ÒPbš7›MUšĝÙÏ~F;;;ŠP‡–N§i}}ÚíĥÊjQoG‡‡z½N+++”Ífioo2™  •ƒ yáÂ*‹Ôl6UĤ{îÜ9şwïŭġ_˙5½ŝúëôÙÏ~–J’Úûġz]ÙÈjµJċr™|ß§ŭŭ}µo€l`Ħ[‚?ç^ŻG;;;ôÁ{ï½Gŭ~Ÿ_żN/ĝ"9ŽC< |>Oëëëê\#Àn4êÜŭ€“ÌçóŞ<°²²˘‚aœoÌZĝÍßüMúÔ§>Eo½ġŭĊ_üíïïÓíÛ·)NÓĞŻJGGGÔéthee…–––FôX`׋ûçÜáÊöWÓÄP]‰rB0€½ĠSÏò|ÊóËíĞġ’ÜY>äÁ´ĵĝ'Ŝö' Së8^j€"#°‰ÊĈÜ ÑÛi'&4¤*Ÿ>Q&›}]ğœ=o%AD‡è`Ô(:a°Şt‚tĜh4ÔAúUÎKrjšD%tßİ ¤CċŭÔ  ”Ëeşxñ˘"Ŭ@ş·X,*‘d\ħFœdpŬ€è ô·½½MwïŜğwï*£ğ$ÀB–`L£o9ÛP5˘n ïñN 쏍 Ċ6FÓétFĝ8$p´şvKd ü;ùáäq$ÌĈ5Ûħ–8\ĵ£ÓéP£ÑP0*‚e!XtüS H8Id\T†EĊŬiï7ŜP ÷z½NĊbQDĵ­–”\µNÎ&@ R²Ŝk_*•èá‡4 èӟŝ4ġû}úáH˙ŭß˙MżñżAÏ=÷œbUsÄY,'—ʁ:‰DB!Zñ‡cl6›Š¸ĥĵĵL_ŝò—é—ù—İP(ŝŝ>Ŭşu‹îÜı£J°A SAÀİĠjÑÑÑ---Qı\Ĥû÷ïĞR /Éܸqƒ.\¸ Êxĵ§ŝóŸ˙û,•J%zá…¨P(P·ÛUÁĊóÏ?OŽÂ‚*7ĦŸŻ‚Ż+oáşħğğKÛÛÛôéOš~çw~‡ĥ··éġ×_§n·K< vğ­”‘ ollŒˆ~ñf –?ş%¨ÍûâżHżökżFŽŬğwİÓéŭû÷İZ­ÒÊÊ Ŭĵy“VWWéÚµkJ—aŸ|ßWvˆgğpĈòže—™ fçRŽüIıo”}Z­Ò /ĵ@Ï=÷œòKĵE^‡ìéìŸä/I?ԉ¤ëˆÒ%ğ²uY"˜À‘"żòáCşuë–*á­­­İ²W"‘‡çĴÑív[C;Ħ1·-ËĝßB>‡?aĦ~™Ïç{˜o@]żÀD Óġ󀂷`ñì,‘H¨éaÇÇÇj¨`S”2LbQ´‚Z#y Wy^o<::R‡ŻRݨ Œd²ÊI^j@ĉßívéàà@…áuġ {‘ÏG^ĵ‘9dĠèFp]—ŽŽŽ”!€ñY6?ŜËœ…ÍkÁrž è¸Ġµ™ĊAŭ¸ĠjÑG}4Ħˆ3vı ‹äÈL@Yk”Œd(0pVû[o½öP>Ÿ§|>Ż yÎ0ĉ0&'ŸµÈrħ%Î *xïŜ=j6›”Ïçİ×ëÑóÏ?OİTŠ–––Tpğ°°@Żĵò ½ĝâ‹T(TETZ­ŭ×ŭ}ÁjH:677éƒ>P’Ċ`݃İÎÏ öq2™‘Ü!û µ}Qĉ|ı\ĤĞWŻŽ@j,ˢW^yE%BztŻL&3˜çög0/ŭÒ/Ñwżû]şuëĠëuuŬûûûô½ï}OqƒYĜOhä$—çgDN ŸZYYQ<”rıĴ~"ŜÒÒıKkkk´ĵĵLoù&½ôÒKô+żò+”Íf™bš_0é ³(dÀ ߀ŽŞññ1-,,… ÎÜLŝüĊĠ1yé:›ÍÒwżû]ÚĜĜ K—.İ2/‰ĜĥŬġ<ŻZ&~ı54P-n8 Fçûb^½z•^zé%ŭrXRjfGéêïŽûß}÷]z˙ŭ÷İuW^+7µBFE,L½\J”·3!ÛAÖBDtñâEzé—èüù󪔀żĵĉ$™Ÿ²;£ßïÓĉĉ&ŭçŝ§2 R˜‚³OJ"ż/l"üjPLŠòù< ›ö„“ït:t÷î]EJ‚  ˆX_ûÚ×´âN§ŭZ^^Ĥ?ŝ˜2™ }ñ‹_|ÄÈÍ+ŸÏÓżŭÛżÑücU‹nµZ 5Àùi$Á’‹š,GîÀ<(@›#HwDDÏ>û,5›Mzá…¨X,҃T0[ ›ğaBV¸áÏd2´ĵĵLGGGJÂ÷ŝŭûôîğïR­VS“›ÍĉH;WUDv b(œ´çyJ"J;;;ŠwÒét(ŸÏÓ§>ġ)… a=VVVè—^˘;wî`0 ĠĠĠŽI½áxSétšÖÖÖhŸŭíoÓ[o½Eoù&‹Ċċ@ĜœU()òàϐË#ĴW*şpáu:ÚĜĜP‚5|—8T.—UÓíviyyY•~ĝ=J‰÷8­av aN´Z­*á4Ŝ’s­ÇI IDAT}Rçy–ߣkU_[[£Ë—/в†x•J% tttDƒÁ ™ÍfSĦŬİTJµùß罍Èĉ8sÑu]ZXXÙäş>òY¤(?„>xFijvÎVċ5*€’Žd&ˆ$Ħ.ž)b†yŻ×£7nkݽFċry*NâÍ7ߤf³iÌ:xk]ŽĥGáF şÂ^éġz*›†<íââ˘jIÌĠ D‘"tßèşŬnÓĉĉ&]ştI9ž!F͚Ĥqà*Ö­›‡‡‡´´´¤Ê¨yËÙĝ_\ÚX*˜bÀ7ĵÓ"H€Ĉ‘µúO—.]İó=uĵ´luñŻŬnÓòò2ċóyzĝĦj%j⺚€À£Ž‘á‚c£çŸž~ñ‹_¨İ„•JEi& >•JÑġë×!­^¸p>üC:88 _|Q!§ĝŜ0+]°€İè ‚ĝÏ˙üÏ´··GKKKŞĵĊÛa‘Âù#Ëç<ĵ/“É(ÏısçhmmMu½ĝ⋴şş:òì/\¸@ŸûÜç¨VĞÑ÷ż˙}ú˙ĝZ[[SÄPÊE’³„$“IÚÜܤ{÷îiĠ?·— Âĝp³áÏĴaııJŠC×Ìĝ›żù˙›ßü&>ÜóµÁàul:]+ŜiD_Üa ^Auò–B]0 k8A5a]Û$ݟónÀŬn—îßżO‹‹‹#¨Ötkcšç o2Ċ)ġÙÈàĵuNVÎ7àèwš@02˜ ×VĞEİTŠVWWš²$êŝşÎaÏwVQ;ÖĈ/Ï&d$}R/YäÑbhœ;nN"äÁ:ώyK)ĜÉĵĴÁÛ._Ĵúô—––hmm^}ġUÚĜĜ ĊĊEşté҈ŭ÷ŜQ’ì{ïŜ=ċÌë£eµñz½NçϟQá‚ÉE‘éʕ+”Ëċè™gžQ‘·Ûm*‹Şe’N+++tñâĊ‘ 4Şé^ñ=–)—Ë*Hċ“Cċ°4A~—“Ŭ ĝdCÌu(‹Šğ³°°@KKK#×? cĈŸÖy0½lp_ĤŜŭ³îü% ú1R¨i¸ŸRİԊ.qùÛïŭŜïY+++ˆn@k`žb€İ+ċœd`Ş×ƒTñáCJ$T*•T žKrĉ,_Lİ rt1ı“CY5}üŭĝĝX•[ĈHĥ+‘˜jüÜᣖ•6Ŝ1ÁĠı8‹W·Á@|Â}NäSäĝúmñÙÙÙĦċċer‡^xáşzġ*ŭà? ^ݧ>Lcž^Ț€Ôœfdıŝ<×ó×:9„‹Ëñb˙pP7¨‹ëÙÚÚ˘F£A7nÜ ëׯÓċ˗iaaŝġŻÓÁÁŞçêd‡'9Û 2B8 e8z\?ZŬ€är9şví;wN ŭ ë²,zï½÷èĈôÜsÏ)a c5‡_ƒ˜ÁG5 GjŠ8³|€Z?ùıCĵ#¨"Säíù|ž.]şDçϟ§ġġu•`0”,aôû}ÚÙÙĦíímoàş.íïïÓġë×çÒa"!’bAËägĦBİé²°†A’ˆÜPÎÀà†pZjH’òyKƒœ,gŠXN"B’=Uh·BÀU¸ĝÄ0~€µé;uşÚş²—óp¸½Rı\‘%6‰nèdžù¤7èĜó@@^·½Sv}pĈ-Ïĝ¤3Ĵ%oëët:´şşJı\ŽŜ˙}JRtáÂJRôá‡Òµk×T]uÉ<²•sš‰i,Ñám•Üqòžf9\…ïn<8!“żoäâĊ‹Şvü /(Hùı瞣vğMwîÜQœq ċNˆB7 ˜ò|ôŻ8TİT” ĞġġuÌïììPRĦ7nPµZ?üÚíĥâFíîîŞù%í=`FÂÖ֖ ˘´O‡íA<;NĵÌf³Š£ƒ.°ÀĜxKŸëş àÒÌRI[ŻĠj´½½MŬnW‰AÚwŜΉäœÈΤÇù%Gżk„½žçùµħƒŒ7´m;% ‹ }Ä ˙Èr Ëȍ'wöÓÚl:ı[“³<ĵĵ=Oç”MßÍ3=d@h¤*˘ĠĞċñÏçċ.ŒÖF>&?C·m7ıxñ"u:5él-jŻ'Í}‰ğ˙x+WnÄy…ÇžòÎ:ÒĴü<|ÒäWVV”xT§ÓĦ7ŜxƒŽŽŽh}}}ކײ,ZXX ĠĠU%~” ûbIàäóy*—Ëj?&“Iúìg?KN‡éÜısäyžrôÙl–žyĉzàŬ¸qƒêġ:½˙ŝûôòË/kòvğMożŭ6ŬğwodŝÂ4î;‘Hċ˗éêĠĞ*'"uĉ½%5íĉ˘Ġ‡n„mÛjÑâËĠPċ<ÛĥiŸ~ĝÒöö6Ġj5zîıçèë_˙:íîîğ%ĉ!@gÉp[*EÌxWÙwúDäEEˆˆœÁ`àH™TIŝ bُ¨îsMŜ>†>]N˘Ä]xŬ$½ nŞ”Ğ#-ÊABöċïĊĉçê]:44ä‡˙?o- ŽĦZ­ŞL|Íf“J­ĴĴîî.5 ÚÚÚ˘Ż|ċ+si<ä~ÒÍ+ŸGt€Ğ2òŭ‡şħ”† WĴÔ²üóä*žËËËDDôŝVVVèüùóôO˙ôOTĞĠèù矧ƒƒ:ŝüTïyii‰.]şD|Rb‰½ Rݤkkk”ËċT‰=ŝׯ_§vğM·nŬ˘ĠĠUJ$*ûE—ÂsÏ=G…BAqĤ¸˜U­VS†‹/ŞŒ™÷$Î (ĈĠĞW•’dúáäsH8˜KÓ˘÷žè-–ċċeZXX F£AµZŞĠ*]ştII+:5›MşvíÙĥM{{{ôƒü€Ö××éĉ͛JĤ^ŻS6›7ŜxƒlÛĤ••:88 Ë—/Sżß§?üJ’j“$"şyó&½ûîğ´··GµZ–——ĠÀĤi<_ hÀşûAڅĉSJyëşj"#>·\.Óòò2% Sİâz½>˘^‡ g_Ħ\ÛÁĊ4î{3äÏ%Êù8–ˆŝ‡;Ċġx"ŸL&ЎÀ/ƒúDcÀ'˘LżßÏÂHàMˆ8pà‚†ù„9#Ó´4žĊš‚)k  ȁ;“nŜI7/HÁœ°€€%™Q:‚ îC3“£œùd¨Ğ˘³C20accCġ„ŻŻŻÓ×ö5zçwF Èx²†s‚^żß÷‡Ï¨mÛv#@Íë•W^Ƀ<ĤqgŠ(<fŽâ|â–LŸ§€$UéLAË$Á€4F<”^*r#­Óġ^Ù uí˘dÇüğıĴ)2R@Ĥmšëġz´żżOëÒíÛ·éûß˙>---İÁ1§Ñ’'˜gHQ2Ùa ¤ü2ŻóóÚ:İÁ÷ /9áŭ˜D -ŝsçÎÑ믿N_˙ú×éw÷wéîŬğJ8KŞFN+Bíœw9ñÚ0ÖdaaAñW0×Al*•˘kבïû´µµ: .\¸ $̳Ù,ŬşuKµm"@¸|ù²’ ^YYĦ *—Ëê}…œ$Ñ+ĵ^ŻĞ粜7´ÀqÁ0&…BA­VKužp tNlllíÛ·é­·Ŝ˘bħHžçÑ͛7•”¸ñ ˆÊ—!Ĵ!:+@Ĥ²ñ¸˘xqT€· #pg G‚¨Y]şt)L&3ĜHÒàK^Td j $ìŭ:‚„”šĠMÁâmR‡Ô~hŠŜ$şa n‚jB|\/G;dĥgşÏ(3!$ u"ɳJŒ`^^^ĤċċeŞ×ëô…/|~ë·~‹~ñ‹_PğŬĤ>úˆžyĉ5Òx^ğ J9Ż/ԏuÙ7Żġó=Á;PG֝3ŽÈ °k6›UùÖ××éġ­oÑûïżOÏ<ó ­ŻŻtL9žSΉ÷żg2zĝáÈÀ'>ÚpĤ¸V´d!ˆÁ\…o}ë[Jġnqq‘ŞĠ*íììPİT˘û÷ïÓ /ĵ@­VKµżÙ”s‡/vĦê"Ê ì›ĞŞñŜ\du8 \lˆËêêàŝ¨*¨½ŸïM0‚?´ÒÈ ; û\ΐ’Àü÷$ü݁ё£:€à{@ĜÄ~èt:ôï|‡îßżŻ2´_ÍsGŒ˘I˜i^Œ <çAjèPĤ 5Á€N–Ntgg‡ŽİP(PRiqœV@%NfûšÏtçŬOşÄĥHMÍ{ïıàu^:€ÒìΤ|"tžñÌ{Sö”ĥ@‡k5IN …­á*…Ü–pÄ(x¨$/K™§]F“z'­sZ÷.'órż`Y–eÛĥ[‡‘`›9‘HXô?‹!ñir’”â7ÁÔĤ1AŸ‡÷òQ½RƒÌ˜ÂŒIË ĵ‡j”×'ƒ9ĠQFyĤn¨÷&Ÿ ˙>~oXkÀрs_ŭu* jî=ôßç5JçÁÎ<,Ĥ”tÚr*aX Irn¤°Ŝ q+´ÓÙĥM•J…Úíĥ"şMó눐8Cĵ‹Y2WL•÷(Ûq9²ˆŭ+QGœGH}cŽ·‰ġz}lžŽîüóaB<á%;şGX9" ıUX'È[v$W(ñs]W­ƒ´˙óâl£Ìyœ‘Žò ˙ ]„Ì8†äûµÎÑɑ…e5\ĜF7&8 n ûŜg)'/Jıà“€m¤V€¤'+2ĠĝùïÎbcÉ҄œca”ġġu5Ħħ×ëÑÎΎêk–âFóÌ+´ˆèıœÄiĊuÊurÚr,Ş ²áà:Ž‚‘­òFĈ¤e¨ ˘,"[$p§İs œcÄ3']bħ̲üŜL³ÙT(¤I94îyCy÷Ë3= ¸vž#PêÁm!ç#`ŽJ&XOhTpV:35 `àžŭĴF³Ž|ŸÏ³½™–żÁ³x‡?KúŸÖ­‡VgÀqœm۞îË8$=Ž£D#,‘)žÂ9şÌü¤6…I0ŠÊ 7¤&ä ŽÈÑ$›KÂÄz’ü8 V£h6›TİT(—Ë)îÁ<ÓVלöÁ‡“‚ĵ-Tŝ,JÛİ Ċ>ìÍd2I…BA9hLäóyĊ\ŸÖ @&“ĦL&£jü¸_œu°˙1•Q˘"ĵÎnÒöàŽ”Cöüìqe;dÓÙlvޝ(<£“6MÚ:ŝ|xPŽëç‰Ȅ|i–àĦÇhr°ó›˙?{oö#IvĠŸˆŒˆŒÈ½ĥ^§ŬÓÓÓÓl –‡ñác$ ħ<ñ†xâw^€G$ŝÄ£…„„Œ0FÂ`a°4vÏ´{İšÊÊ=3r‰ïCççúäİ{cɌ̌ŞŝTšéZ2#nÜ{–ÏùœÏ/¸QR)ÚNë›ri@&ÛÜ^ ›îX–ċ%"(L§ÓQİTêÄAXŠÔe&Y^Sp`êPĦ2³Ñ‘tـ„·I¤#ğ@çÌMRĈ¸SGÂĥ Ŭ=ÈLóá1ÂĜ÷}ġóf³IF£K’…ˆmžÖç0³F›0ĉ&)3Ôĸ`J œgAµòx8›’ˆlûxá™q=ó˘ 2SċÌ~ŬÔK¸çq/gœC’ĤY·ÖI6 (δğI0ÀĦü¤`ÙÄİZÇqI½yùÏxpRÔŜŭ˘$ÛF@d S èEDZĦ-g RİXDäÊÍ%a7.²W+oèF×]À£Zİáż+yJœÇü?ş²4kżN “ǽ£T™Êx2{-R2S)B0 ƒñ9 믓šĦÁ Ì ˆ“6=o“¤7öDr€(Ħ¤ƒóć¨Ċ‰¤Ĥ$ƒ'?ĉ!u_c}ħ–úáÁŽ.XÉ"˜ĤÓ_ˆ 0d€˘Hw‘y%Kßô>óìĝ’È&oŻĠpİö˜ĉó‡ŽĴ1IĈyÛ÷ĊK<áŭáE)2äÉï›ç}ĉ2 4ĦIYƒĤüLÙŻ.ATŞäñò˜$ç’ä9‘.ıàÎÜ.ŝ³‰ò|†rHQÖ@<ŭ0!Jòwy‹%şX@r‚eÑΊ‰ œGvżé=oRNÒ}ĥçy+e9ös‹§†ÇŽXĥm—dä'!í4Œdè2Ŝu#‰$kĠ<ĜwÊÑ İĠv=tż+ïUçÜv‘…óL˙Ĉĵw¨ĤÉÎvÔ—)£-ä‰ ûŸÓp8\žd"+ĈÍW‘4Z6!päûŝ%îUžAžTÓ%ƒyÄ:N&+1™LVZs÷™xIr­,\b!rp&¸]`ż-Ÿiˆ¨VĞ-ŝéŸŝɊE–S]F)kñIĠ$TcŠh³lŬ†“™g ĵŝ¸ëúı„SyĉI8YZ‡¸ñ絢}ïÜ3î'“ ñò H<í zç{b* "ÛÛ'b ñĴTNŽ3!Y')öœê’D˜ù˙Xoì'‰ĉìâ%Ë{|ŭuc“Ó{ş ĴÛ.ġlâ\ÁŭAYĞ"M ”gĥHŬyÙ/Ĉuvĝï/ƒò_ŝċ_VŞĠêÈX&`†yQ.—§pVëÒxš”o…tİäFìêpêdĦ9ô ‚KÑĤJg+˙ĝ |żñ^{™=ëÖ_·‡òâ̘2-‘Uw ş½­c~ó`§ĵiL$Ë4Á‰‰ Ğ+Ċ‰qEFn³‹ĤbJ ŻK–e%ONĴIi:^Zˆd \.ìRİä"úĈİuΝ.HgtÑ{S>kıÀÔB²îF0eCëD½şÎ Dn2 ’‘Ĥœ`JÔì×RZ„k× ìcte:›ÚÉv™™é‘#q:Áœ¸ÀŠŸŜÀÜ"””tu~Ŭèèuş7ò XoóyÏçs äûŝŠú$/ñ€ŸŽÑ´_Óvj]U´ ÎÎFQTjµZNl0€9ÔRɉ˘¨Š÷—‚:žŽ?íKe°ĵŒnîi°ÑĤz“v!ŝ˙²Ġ‘·‹%EĜœĵć‡èĉ•™…s IDATìë%gğC5ĉ´â3ğ,q˙i-u£,³í³eVGƒÓ2'3ܤëŒ;3E“+÷6ŻçK•Ä*'{JÄ4NVšî˜4LŝuEŸB@ ğNÎİK—£TİTÊDÔ[,-GĴœ*Œ—µ,ĞEÑ1Ĥ™˘b9:SÚd›[^pTÈ{s j†//Îáà4›—0ĉ‚Š˘£ {ViĜ" y…yzŜ[ż/èÓ¤/"ġ8‰8ËóĉGáh‹@¤ö·×éî3) Ġ „?+Ú'íÖçğÍÄ+îUäiİ› ÀeQ“`–Êċ²kYVÄ÷Ġ 2p˙ŝ}Q=iaċPžılÛPĊħVu„%üMÖHQ—ĦdôcއJCıȇİWx×/Žq¨\ “ÂÙË&55™î˘?Z÷œy{Ĥ)(ŜtMÚ득+ü=ıHŽIÑ.îzċŭóġ‡GéH\iSdJÚ¨˘eݘȧgê&;ĉẒ̇ԍ(Eʵ úӔ›7QaÌ#ÑBËp8¤^ŻGċryE£?_Žuĥoßí5›M}0À rÄĤĊÑex: ĊçI„ácùxVnERàŞ ˜wŽh4RNìììLíA1İkrüü{èâÙÏh4˘~żżÂ™á]”ždçÎt:~żOÇÇÇŞû*àË:ët[ö…œI‘ugÖlÛŝó,§JĤ]CjU´ÀAĥu­ApÀ‚ĊbaÏçs gQó˜é[–½ú뒠ïûÚ9âÈÖuhÀ6³éobȓÚüâîKŽvĈCÂcN"Ôµ+I.Ô0€sÏçÔëġ”³àşî› 2Yg­¤GpcÛ6Ġëu­" X0¤RİDÍfsESƒgğB^tmŻ<”¨Ò62°8ôΗgƒqh@–ëäħLFxı/$5ĝ9[wèˆü=xÚ>ƒf8ióu$Ê}8F9óي8eӄXŠŠñÀXrl˘(²lM„ïˆEŒˆˆĴJâ[–•J% †½ßï+Ġ3Ô ŞĠŞ‚è‘@|Bލċ"It(‰aÍ“:t‰B×|:^RVË+s‹Ë6e0@ôŞ,£S äَ ÉÀ}ğĞ/î{Ŭ(x[“7žċIŬŝ<÷ALuɖŜU •ä4ıÑċ80ˆy°‹€;D°I Cž ^&Ĝ÷ž–ç µó˜òk[\<Ĥ(N ÄHj¤*BÖlÒ|¸.B2€ç!ıEâ,:Q9òY9†7.Q0ŸÏ£rılÁ™!äŜ¤ĥëıŬ$*ËŞÀkĥmĞo2T#˜—Ï4éK'_Ĵƒnq/<è’Zíüóv)İËQYNJŞ÷í[PĤhQże³ç3ċ÷uí˘y)ĝÓĦkiœ-Ït8:V„g$ƒŜ.›Ì ²-(Û÷ċe‚8-–˘<ŽèéîW=ÙL~Ïİ‘],%鏵ÁÀ`00tf³Ùl>Ÿ[ĵf†!M&“D‚ŬĤ˘?›D€D´"ÂÇï:şŽË6)LIw%³w_QħD88ËWĥ¤î[íO"E tÁ¤ÍSO#K +kÚ|˙IŭŒĴï/IÂĵujßF÷Ì!üĵœœ]R$BÎ^×ÍíĜġìzÁĊŞälšMÀ˘#’Œ*͒8\ m00›ÍË?ŽLÀd{4\ĵ×Q'H”ĤCâ0“dN÷ùÒ ħdŬ˜rs›T÷A D°"‰lE§J˘ÈÌüŜ÷un°†<À$R ğžË ϕZċ´á(Šì(Š*ÒÎéĴ²…j>Ÿ[rD'×ĊOêġOrŽÛÈVtP£ÎïÓ ĊġBgÉ|82 Éz<â“FtLó¸ç´ÀDKó|²Ĉ4H‹t.ĵ̵É]÷=LR˘¸rıĴ‹ùOa’çyÊĜÉĥ_ıĤ²ŽjÚ[<à×ÁġĈħÊDÍHv4İqÚ:)eÓ ŠqHHŞĠŞÊ”ÓdnÛ~ñ>vŒ ‡†óIğ˙LÎ:AÔ.ƒl]@V¤ëÔ îlĞŒQ”Ž-=Ĝ‡\ĴŠAÛ²,ïR€Ğ{óétjĦ]H L†4VXGâ3 |jß:N>ˁÒéfsBSŜ3 td8³k‚ë ‚`ĊhóÑÏ&b$G7¸ˆËòıÑh4˘ĊbĦ&ˆéêıi†½$•-ä!#8ÛĥİZ­Ş(½Rİ\"ÉɎY><>ĉ•gş÷2µÊ¤½Iĝ2rĵ‰ÛµÁŸ)û£ytÓ@ˆ;Ìğt÷"ı ë|ĥéY¤Ąkˆz†ùb ĤR„‰vyœĦ¤;kûÈĝxIòìx:m S0¤ğ~¤1y2™Pı\Ĥ‹‹‹ÄÑĉ›müŝä>²‡òßp8T÷ ëşj·LûYyÙ, —ċÉ"t˘láÁ˜Û Ĝˆċ˙[–eU.Ù\ùrıL–eµdÖ! y&cf!ÙyF`nì'?py *ÒeñĤl).$§÷éXàÒÉKd`×CLL÷*ÇfbcòΎuĵĤÁ%=SŜ§/û”³0’“Ĥnš²]P'[BqM`# ]ĤÏŜ$SÑŭ=şcâşX,¨Rİd2Q*:QVa-A³ÙLŬ³<'Û‚äşñ$]C<H›aĈĦšÜñîډq dĜLÓ°7i ‹€`p'Èçm˘Kû'3yŝĴĜóħ˘(*ɳx ‚ "˘ _8YÏÔŸŭâÊÙë:cΠ–3Ċ­ ĝàäÁ¸ëŜG6Ç8Ÿ—Y¤Ĝ:Î}—Ìz:czV%Èŝñ`Cfĥ:ğ—w@ ͸­Út,6Ï/eòÁu×% 0S!>Ža6AİTzS>·KOp<[–eòÄ´‰(ĦI]ĉ'ĦĠĵoF ›ê}xOvR֟vcǕGLĴqßÈyí:-í´0•ܐÒxĤa·ĉɀ5µ9ÎJÍÀĴğòïtdĜ]ggşç¸­V×]gŸò,˜>“âyñĦx`ž”ÙĉíŒÍÁw0:%Ĉ"œoÉȳ½°hs"¤Ÿ“ ƒ(ëX–eŭ²Üחv'Ÿ|âş[3d^ˆ3„q›3Ĵ#ħà3ékyi $éóş?˙9˘3îü9”•60bӜù¸ ´`@fEë•NBH² 3I-›FŭşsVûĴÙÊdg`ßZi€46Aê‚äMÖ=oĵîĥ /Árû*^ Èġ7¤Ïş vh“À„ûŜVÏ|ŒmY֍Ä``8ÚĥmÀŝ– Œ^n€d€° {ÌSÇêçh†náLYU^Q×ߊCĊÉGĵ-nŠ\2À£Ŝ$§Ë‚· r™u„­ékY­„|×ÉòšÖİë_Ĉċ:ŭ:EÂ]MċÔ2ƒÌk/IÌ$eBât$À¸ñàü: x0e[Úó&!ÉóıK/~Üxú}ĵL˘6͘’‰³ĦY“§$ûµ}$úù|N‡‡‡Š‹ߒ8¨ĈK7Ĉ?ŝ?Z_úҗ"c00›Í˘RİԞÏç–Üdĵ]ÙìèbGQżd°ò ɇôÈë—uK™Ñl2]L·ItY<ş6Â,ĈB'6“Ċˆ˜Ö4î+ "€òÌ.…8Ò8€¸µÙ4ÙtV\{$žÉÍŻ|ż$MŽCݸóċ37ü<Äùĉd>yÎàÄa =ÏSï‰îX˘WŬ&¸vŒTÇ4”ÓÁÏÒ³qûÓ÷}…8”J%u’—%kÜĥ‘çyŠè}xxkJ’ú]ü-_­VĠ:ĝOĠjU½wE4Ġ³Osub=›î=ùŒħ†“É„&“In%ŒĴç,ͽċ5 er3ÀQe#€ċ8ÎJ½üp9—û‚b°ôıÊÏòdVÎ/LŽY͋젟Nxˆ^dkc^"qİIò ? 0š—O널qÔI2ŽùşŻKˆËŞ˘&ÉOüZÒ*Š{mڕ$Eĵ)#<-œ×ê)÷·líE@޳9™LT›İԎ×ĈüsLY/2ÑÊÇ<ġ7áĤÓ)5›M ÊéêÏĤ½Äƒ ž­ƒŻäyM&“ŽÓ²,Ç*…Ŭâ4ĝ]Ĵc†*{’ëĊµ 8ڇLk…O†j풸(ĤŭÁ‡{q9j~ŬqÚ–eİQóĵdÚívĠµöd8~Ûĥi2™çy4NİRİĴ§Ó)u:•û ’öƒRÙ%Ċ÷‚ĵ›òä}Ĵs’dÌQhݵ³ü*EQdÇñ˜,Ë#ÒÄÖ;8 •ċĽ¤öš<ĤĞq£"eZıâ7vĝLÉQ7eє›ħŒx*6£mÛT­VİVĞ­<,09R^OETİT.e/_$ß÷İ×ëİ<™LV'Œ™ä\HâÉR|J,Yû•%‰yžGáp%Ó@›ê`0XÉêL{$kı(Kf,Ö¤8’ïûFĤk'ÛFı)ŽäǏçȟĞIñŽ É6`"ÁIA¨5Ç{M&FH(Ö>×2#Ǚ€8Ôh4h8Ò`0 0 WZ‚}ßWíÍ<°A° ‘ 8³~żOR‰ƒúRİDFƒĈ1A@³ÙŒƒUĞU*•JÔétÈu]…pÁĦñxĴ²èu_œŭ.ËD¸>^ğ—ÏŻT*Ñh4Rǃäüt:UDñ0 i<Ğd²,u_`Ş…a¸ÂÚ':…{œ†Mß]y :ôSʕ/ß;*•J‘8ñÁ@ĞĠ²&“‰Â$œĵmÛttt´Çñ ‰£3ĜX$]°`bŸË2‘ïû´X,¨ßï“çyê÷ƒ  n·Ka’ïûtvvĥò· ŒÓĵw]wE5O—UèŜC^+²4ärıLĠjUEĜžçÑx>d(‹Ô›ÌѰ}t:<ċB4܇aH³ÙŒ‚ ¸¤È)£nĝž½^WY%2TĴÍl6£Ñh´²Ïq=@eİnÄ Ÿ‰`öÈu]j·Û*•Z'ä8×󀓄íÂyÇçÀ¸K½^O] ,äÇĦÑh¤VĞmœşKï+MÎ Aâ × ½çytqqq‰ċşîŠŭC 0?ġŸœœ8ôüùsu-ö¸Ĉ žQÖñ雎´7í<Ĝ^²×<¨ğŜĦ&UKñŒ‹…½X,ĴĜ`À÷}šN§ İËİh\™ş:]VH8 Ìdrä¸Dê€ıxıDŠ8¨÷dz %#N< +Ĉ{L§Sò<‚  ~żŻŒP@£\—^vDÚ~‡Ş‹Ċ‚Ĉħ:ü²‡^Nz”=Ä\ÀŻ+ê2Ïf³IñxĊqI°ĵ˘o,]‡Ż 8²ċyž‚>Q›bgÛĥ‚ïyÀÀI­Ü™ÈÀÜĥmêġz+k‹³tĞ×ëQ­VSÁf†T­V)‚•r— ³Ô†ùYâeYTŻ×)²m›|ß'×ui<Sżß§Ñh´Ržê‘L\×h4˘rıL³ÙŒêġ: ‡•3öĊ/~‘^|IµZŜ}÷]úŝ÷żO£Ñˆêġ:}üñÇ4™L¨Z­ŞÏ€ĜÙĤÁ€8T.— öĥìĝĝ˜‹…ê#Ç;Žzz½N½^OżñxLtqqAA(^,|oħX£Gh:Òç>÷9 ‚€ŝçŝ‡ÎÎÎèââ‚:•ËeĊàJĞĤ!vqû[—ä1×÷†2ZÄq›Îz[vJ§Ħœ´´'Vl0á‡Zŝç•Jy\4‡‰"ܤé5Ġe(Y^²•Ef=Èz9Ħ05Ä~LŸRŒ,Ÿ€ˆ{EĉÌGöò÷ĞĠj4ŸÏW (ßüÈĥÒÀ|“\_]Ë"˘ÔÀ ÎçsFêz`d¸ŞcRQF†c^›ĉA˘lßùÔ§>E/^ĵ ^ŻGċr™éĝĝ˜<ÏSŽ*M·:0Ü:M7ĦÈNQĤ„gìyĠëuU³GĤ>Wö<°ĝšŬĵySÁ­“ÉDħħñĠjµèá‡t||LçççtzzŞž•šJ,Y‚}ìÏóT Á ì/Ğ0ŝA¨sì8U* ‚€<Ï£vğMAéé)=~ü˜:½ŭöÛôìÙ3*•JôŜ{ïQ†ô•Ż|…~ƒl6£GÑßüÍ߇~H‹Ċ‚ÎÏÏÉqş{÷ HÂ0¤~żO•Je2GEàĴ‘…ÛĥMġzšÍ&œœPĞĠ˘z½Öèĝĝ˜nŜĵIOž{ü-=ÈG VI `ÁG:]Ùë‹IeRÄÎĥĠjÑt: Tö´D]TĈÌëô²Áá.gµ=ž‘A@‡‡‡Ôn·UM‘×]‘Á>T”-¸C ‚@e8ĝ‚&“ ^êċċŒîÓÓSEÊÂ{scĦ;$ğTû‹›İQ„@ NíŽĞ€úݐd“­VK=Û ¨VĞQµZz½N•J…Êċ2 ƒ• ïÓx%Ôó€2`“âú9Ì!uSp„2<ż˘^ŻÓh4˘~żżÒ~…ßm4êoeĉ²6“$ ÂÙsÄDnúétJïĞŒíââ‚>úè#eM‡e€@×.Ĵ¸Ë=œÖ€ëÁŜh6›TŻ×İÓé¨lYqżßWûj8Ş=Àğ¸£ċĴcìó7n(‡ƒ½ĊIPÒd2Ħ7nPı\Ĥ³³3úWüĤĴ-ÉHboĦe­VĞݽ…€eĞN§Cϟ?W(Ž^q–8<JBáP½‚ö££#:??§VĞE–eQŻ×£û÷ïĞù,µZjµ j·ÛôÙÏ~–ĈŠmY×ĜËn,nĞE$ÏCN™ít:ŠÏ€Da:RµZÉdBϞ=#˲¨RݐmÛôá‡*„ !‚Ij{½={öŒ&“‰ꅽD`A}ÒP9ìqp"F£­ ĴY?Çdk’ÛuÑÏ,ƒì¤ĞT* †ÍÇYĴVĞÔétÊóùÜÜZ¸|ÀsÛĥ}“ĦLÒëĉÁic“YÓ:E6<ìjµJ7nÜPL`(D˙q›N—µ”ÓŻ$ϲ,êvğ4VjUx(•JE9gÔÜ$IÌdDùƒ‡QƒQà‡ïa(8 l9M'šÂƒ\`P]&Íy‹Ċ‚F£µÛmò>¨*€ IDATžž*'”d`ŒGñú˙Ÿŭìg*$Í™PŠÂ‹OÌäĵ"üçyŠ;€d|Aŝ×ëÑp8$ÛĥİVĞİŭ <ğĊÄyâĈüĝĝXĦ2gggtvvFR‰ŽŽŽ¨ÛíŞ ŸS<_”ù€°ÑóçÏéàà`Ċĉ€üۉ ¨8&°ŸgggT.—İÓéǏi>Ÿ+ÄH%oËâ,×mëÖ9h”KK’âÀ\ĊW–5_á¤qŜĦĥLR#"*Y–UŠCĴgϞÍÇİè"ySÍ^'ğ›ôÒud­ÉqpXŽ(‘ d684¨"ÒĠe_èÑċHwÜH™‚d €ìÀPĉ?GÍĈ×Áğ1äuÁĦsBꄭVKıO>ùDĠzùûàï‘-rĜ™>2+ŝ·ĵŬ ى|X³jµJƒÁ@Ġ: °ž’#“ ›ËVóKcp‹ ‡Cşuë–Zß ¨×ëQ£Ñ(߆ŸġĴÄeS SQÜ, \ĵL‚/Ħx냁ù|N˙ñ˙1·mğÂ!' ÇsI]Iҍ$Nèf d à`çó9Çc:??§~żOáP‘RİDŬn7V‚úxoŬ ĴU·ÛU™?ooİĠjŞĊġF<À²’| ^œĵƒ!‰•J…Ŝ~ûmê÷ûtvvĤ"c´`!ƒ0/֐—) è‚RBôᇪì§Rݨġ“Bò:Ž£àÉ~żO­VK‘ıx‘‡4/ŽRHEܘjߢÔÄûÄqíïŻ 5iç=ĴĤ ĝż˙>Ŭ}{pèĊĊ… ñly·mÛt~~NFƒŽÔ?›Í¨ßïĞ`YNœä%,Ïóè“O>Ħ/^t:UÎ&Š"j·ÛôËżüˊe/Ú´ĈŽ·Ĵ͛7éċ˗+ílèŞ@ @^''şñiŠ£ÑˆZ­–*à|Âùòöaĵ ˆ ‚€šÍ&ġû}êt:t||L÷ïß§jµz‰°•ÖŽñR rıĴȟĵ;ż Ò/ç‘*ĊĦğÄz½žħD yR…ŭƒ{ç2Ü}êSŸR-ÒA¨’L:z¤Êáuzċ!p-ùŒçóyÍ Ìf3‹ˆĉRÉÁĉAĝp8TĈóàà@ĞûͳH ËxZöFó~IŒ€€È÷Ŝ½{ôĝñc:??§?ŝ˜\×7nPğŬĤÁ`@ġz}EU‹ë'àóúŭ>UĞUj·Û4ŸÏéĝĝXA˘ˆ€u( j3\Äu]:88Pñùù9Ŭıs‡ŽŽŽ¨\.SğŬV' +²p9‚w3à{¨}–Ëej6›*3’úÜ8Ĩ‹"ÒçY?2ƒƒƒŞVĞÔï÷Éu]ĊVîvğÔívW.Ö0OŸ>jµJFCí!˘W,ġ7Ŝxc-ıä¤ßM;5ŻĞ,ù ÀÇŠ—ÁŸ7ÚğÌĝy[,ôĝñcúÁ~@ċr™>ùäò}Ÿjµšj+ÄÇ="€ĊżÔ>;??'×u$~óĉM2'GżÂ˜€  ²"/ƒŸŸÓ/üÂ/PĞĠş¤Vš ÄĞ\×f³İxüÙqġîÁ` %7œĴ|HżŭÛżM>¤Ñh¤À´(.0À½ßıs‡nßMލç„uċeKÙ<™L”˜$qᐪĠêJÉDêˆE 6²Ĵ[o½E>¤££#UvàĵŽ˘½[0w­çÈ8öuTŒÁÀ2ŽÊċòœ·äœ„À3WY뒢<Û~I5Clü>ĝ€...èÇ?ŝħê†#çˆŝ5>DQÍfSAb `ñp*⇳=>>Ĥn·Kív›*• *£X.—éñÇTİT.ġâ€&­ȉ¨…şKGGGÔh4”bHRÈxW—nċäB˘‹‹ EšŞT*T­VİÙl*éQԏëwïA TâîŜ½Kżò+żB?Ö7×Ñú^·O™—iĝôHïzdnÚ`N7zĝ!½÷Ŝ{tqqĦ·nŬ˘ TĊ÷GŜF£‘âoT*ş}ûĥ"áu:ĊŠ—5Ĝ£<ÇĦ'Ož¨ä³Ÿŭ,}ë[ߢwß}—jµÚ yvŬ>Ĝ/7oŜ¤Á`@_ŝò—é;ßù)‚0²zs’ÄÇŠ˘ˆNNNbÇ×gœ ?Š·=zôˆ~˙÷Ÿ~÷w—Ži0P£ÑHċ€d@ÀQñxL•J…îŬğGßĝĈ7èɓ'ô½ï}ž^fäŭÒïEKûVCMĴˆqbŠœWnŞğoúÒ! RˆG—™Âˆ?zôˆ…/G}D?üáUŒ? Ü‘à $Ky˙>t\ …#ĝ<^ĵxAaÒğïK_ùÊWèóŸ˙<Ġëuċ°%á&İŜXĊDŻ„H~é—~‰Ĉ1ÇczùòċJÍj³Ùĵ@éĈAİ@c0h4˘ñxL7nÜPue“#ĉ0­V‹öµŻÑŝáÒg>ó™KÙĉ&?izéĊeFĈ‡pÉYû¨#J™í{ï½GïÓíÛ·éğßŭ.=}ú”:½xñBíÓ°$dŻ€úӟèk hċhGG^|İ‚ÜwŜy‡*• }ĉ3ŸĦ>ĝ€ŝàŝà’ú™Lz>REè舂  oûÛtĈ zòä u:Ŭ8\ôH FÁà×j5Ġ> ad[·nŬÒj^ËyáġznßMŸŝô§éŭ÷ß§wß}W•4t×>j‰şé€\†;3f—#ż^èèA@Ÿ˙üçéŝŭûô{ż÷{†!F# JG@fô¸§F£Ħ‚ԏ?ŝ˜ŝŝï˙žŜyçúĉ7żIŸûÜçh<+dL–@„¤v†ŠÛívİÓé(öş Ôħg“—–‰Ĉ[o½Eú§J/_¤^Ż·2oû‹??žH ĝ—ùú‡ĝúú׿N_üâİZ­*=Œáp¨ 5Ľqët:txxH­Vk7mÙJ˘(] jµZôÖ[oѧ?ŭiúҗ´"Í a€ÖRÇqè_˙ġ_éğßŭ.}ÁôŝûïŻ \·€÷sF:VĞE*@‡ìİt_™r·ç:qxÊ;†x— §“]ƒ+ÁÀrs۞çÙ<—GÈÒ n:M. rÀ3y)ş0èĝĝ˜úĠŻÒŻŝêŻ*Ħ c@(”lqC tzzJßûŜ÷èüü\MLğqŬğwo4…w0Ú´Rİ(˙àÁúÂ@?ĤğwïˆŝàၨȃŒ¸ûç‘ pĞĠ"×uéOŝäOèéÓ§ôüùs…ĝŒF£•ò‚ĵvŽ={öŒŝŭß˙žˆ 5|œóN§£Ö`“3<ÏSüĴ‹‹ ”Ë9 xF\žx:Òññ1ġû} ‚€Žéɓ'trrBï½÷Ŭ}[%F@™%‚NŸŽùòċK:<<¤N§C­VkċÙrÎĝ.φuƒßâĥ$rùĥ˜uPpè*ƒ€öž!;ú`àŻŝêŻĴû÷ïÓ·żŭíŞëş.Ż5JŬ}™n£F32“°?ĴĜ´0ò@íëĝĝXk0œó"ĝÔÊ£(˘££#şwï½óÎ;ôċ/™nŬş”şä|qÀ‡v ñxLáêġşÊĈúŭ#§lĦ‘&ê56V÷öÛoݐàÀšĉ<Àƒ#Ā˲èK_ú½ùĉ›Ôh4”ˆ‹ ıÁ­•£Ñh%ËäbU:–~ÖÙßşÚn„JĥaÁÈòŒDŒxÀ¸¸SN#g`ĵÑÚ&(ıV;ÖÉd˘d˘>|Ho½ġ½xñBİùÉ5䃜]ÂIc—ĴfTdAŸIqw‹Ġëu,h”÷÷sŽ'×EQDo½ġ½ñĈJ $DdĠĜ&˘4¸7XkŜŻȧµ™¨Ġş ĝÉI’:.†ĦΔt0;wèää„êġşB°78‚ħŒòçΉ‘œ’ÏŒ·$'1ŜóòĤQÎÑÚĤŻÊ ĉÏ%É o_چ²6XN̛˙ٟŭÙ-ùK’I‹ÍÏ!?$iD‡Ò<ş÷dL—%rİN.ĞŠœŽPżß_É$™Ĥßï+öèÑ#ş{÷êñċH:CmPİTTŻ4şpcC1„LLġxÔsĜÀpCä¨^ŻSğŬV÷l-}XC” äp |v·Û%ÏóèÍ7ß$˘W‚%µZmEpˆg| EÌ EÊ JÔ 9Ráß ˆS²|’&ÈHkä’b\"%Ĵš%GĝÀ-Î烅ÎÏϕ¸ÍùùùŠ”·|N""Ġçß“ê’²]bZ…6ž¨ç §ˆ €“ù°$tÚĥMŭ~ŸšÍĤ’Ú=::RġŝF£qIƒBH”|d:ÎĊ:˘ü)qŽ{Mğ8ÂÈkDz [3Ë]iëç‘Eëĵ} ğBL¨ˆ ”x0°ĵ.ŭl‚rılQÔjµŜw'à™ż9oYuU.“GıÀô%Ĵ/3imô £eo0mÛÔh4VîG§V­VU„f³İ„?À˘•™. îtù+—Ë Väb>œÑŻC^ä!ċ½ÖXwD´òìLNŻŸSÏÛOÀD>==7Ŝxƒjµšú<““À³à_7ĴF—mĤ5r&N‰ìRˆ3^âj‰XK^•ş8…ÈĵŒeÜßÊz] lz_ŜE=Á„.ۊoÑ ‰môéHÊşY(üÙKTÏ[ŠuၒñN!9ÈI˘\ytRY’£2 Êdyİ-Á‰a=tÈWWf™]żä\‡ëÊHSBċS:y@°,FÚ` VĞÙD´¨VĞ˙ŸmÛ>Ï"‘%şKN‡îŜ½ğ˘%ûxùàÙ/Ĝqˆž1^SÖ%’$…‹0ĴˆK2"kA{ß$şàd"ß÷İĠj‘ïûtttDϞ=[qŒq†‹„ÀàâóıñF?/”Ç’ŒúF‘9!à<žµßN€#)2²ŠÂ‡âH9[“³ß9p[و”Äĉ†R‡‚ÄÄ< OO‰ÎI‡Î³B™rô‹# ²DÀĊ][ŜĴtÌq×gRċAGŝâŜ?Éèn+ÛM“Ċ.ÀÄÇ sçWʲG‹ÒĈWïߚèƒ)ŠÇö+hĤ Pë)—Ë„½ıŠœ•);JëdĞOŜM÷žig `!aDy;%²FÙ·ĉÉ üÀf”xÏŻMWw×ĠÌtOx7Ĝê9 Ï>)3ÌRÍë°orxx şn=S>mŜ#wjܘól0nžż/dÇrĤyžiœXQĈĈòŒ÷-ÛÒÊÖĉÔ¤9óëfĥü>Ċ;C`Ëu(¤İî*eĈrm‹$#ĵí5ċĵ"˘%r‘ŭKÁğÈ뺋ÙlVâ‘"n4Ĝ˜\žV:&~!şA,ÛxIXÜbBtH2|dàqĈ–†N½Mw×ŬI‚ƒuŸ)žÈÉhĵÜ7ÄÇ^%ƒ˘ëG_çÙìú>ċ\‰èö—–ó1à Ŝ#­(â3çe3^2˙>³GÓ£Mì{­Ğoú܊ôĴı]тĴӂˆlîƒ<6óġ+ş÷ʊƒĵX,ĤÓé4Ò òĴ3xCŝ>ÏËë›y?,™áq´#ĠŠ2™âù|& ê&’™jĞrŝ¸+I¤Ŭ,|ŭdVĞc‘ê /p(‘ˆS"4`Ŝu뙧1ŬöÔÀ¸Ì5‰{°K¨Ïôµî9rÌĜĞ>֕ÒÀÒqh\ѲFĵ;Bêvmu34òÜC@€tem£oûv¸ğ òtĥx‡ŻİeYs>”Žû ž ĜĥŬü£?ú#û2À&Yıóùܒâ7ZN³™Lʔ]ìòA‘Jĉµ4ÑÁ‰:&ğş×ÁóreİÉê28ċgÈáBœL%9à1èZ<ÓÎĜäıĉEBKÊċóÑİqރû̊äTCyÍ&•H vÊMÖ[wöXɽʍ!/p=÷MğĴÚ.afIĥԍ[ğ˘t×)Q²ñxĵ213Kh²I^í’i_@BĉóùĜóĵJĞĠ*uğ]5°Ü:ĝ´e’{üöÛo;DÇÇÇÈoşëò9£Hr:CžÔĉ•…Už62Ë:ş’;CˆpL§S%-,'ó%Á}şˆ4N+m4) cşƒ ċvùçHC ùà†>’l”D:*²!áìq]ö Ekx fOç‰\ĝŬ>—{H |‡G‘0Ž\?ÑĠAêR WëŒM@ñ9’<ĦCPWĊ@Éş×qxfÎ ­„÷ñ{şĴ;)bO#Êt]-\êDZTájwrÀÓ.6şIFëċAajó2eÁi™è›:Iıxh:[:ᜋ‹ zĝĦÒHsĤ½Ÿì&}/-×$m°¤Ó Aô0G„Ïqk´>ëÚ­Ĵ87A^‡Gıt iŸGÜYŬÖZnüRİdñD^& RÉZÚĠ7ëġz@Dƒ(Š~Ž œžžZDDÓWŻK2ïĞ•|܁‘U7OÀä7Œaa´*˙Żéoùï'Ġ›ùşÊuääĤĴÎ_nX>?bù\W‚Ó> ÏŽvRè‘sÇm€u3Î8gĞSòƒSÄşC÷m”>Ö9×4Ĉ?mù&èAœŠc’ƒ•-Y7Ĵj³ÎsÛE6ëà‘íÊ{4ä;CMöÉî"S6uĊ¤ġ!YË ûz ŸS~µ•m£˜ÏçÖòç]×UµV‰ˆÊċò˙-‹ÙbħpLÎ :ÖZ–ĈCübt xÙ·žf‘“œ‘„‚dV Qdŝò÷Ëċòʰ@.PKSm’ß׸¤ĈAR6£#&Ŭ?Żê´äD8yP ĸbŜ’G0 ûÜmp ,ÚKS1ħĉžç­¨½ċᨷi61FÜ òáQi!n]ĉĦC7…ÓótĴşDÄ${~ŬœöfQî7))Ë;Ù, bŻh‡p{‡`À²Ĵ…mÛ·=Ï ` v“‘ëşOm۞DQäQdY–%vá•Ĵ‹G-'Ë•SÍĝàÙŻ›Îǁ+iĴ›=eYS^çŒi\š,3xù /G´í—IÂŭË aWíĤkO Œtġëu{ÑÁÉò\w²işbtœ$´1ό1ŽÓsäUiÍ+ èvVÉDNÜwËŻQÇŬÂÙĉv^”†#Ûĥ}ËzE°,ëçÁsÄĦeY Dŭ²'5íˆŬ¤½ï‹sĝxGž9r5@Ŝvd2dÛPÛÛÔĦH9bܘ긘uE)½šCĝşġìĊôŒâH€@Dv˜û̓jòiž—¤…FZċH>ŝV˘ZEΜdYP‡ ^÷×ëvşìĴœž´v/ïŭŸġ³ċ9”51ÇŽ˘¨´üœŸÇħ–F: ˘’Ng€£y8™ÑHIám麃à§kħ2 >ÊsW›ÙdÜי“.aÒËu]U?‡â"oËı "BqŬ+Ŝĉ.>ó<ÎD–ßK‹H™2N]Ç­gì—·“€}“ˆWjħгż‹5¸¨€.}em]çl¤FÚ7V"VÁÀbħĝ92€)mR鈈\^ĈbÈ:kžPWÛĊaceĈ › ÏQ…}DïiŒ>Ÿû§6fúlP_̒5Ĥ=¨YDŜÁ ž)Ĉáò`7+™n_Á&+Ÿ'ZG“ĉĵ›²ìĴ™”‰O³Íûä{Ï_Êr5\WKe“g§Ó‰ĜĈŜzş ĝ`=$€ë"ğ˘tĜÓìì×ÉdBµZmeùl6S-ò°}A`˘­Môj Z­‚²m¨k-Üv@°í—<ìşÒ‡Gœ—îü:›bƒ€C ‘—´†n4İù8HğÈ\v‘ Iƒ¸­f›– ✪Irv]Áš´m|Ĥ÷A œÔnkʰ×-è¸ğ "ĜĊgJí H—îlé™´­ÁINVôOǁíĤHdò@^‹~Îaç@˘“ ]Ġ1ó|&ş½Á6›Íaş³Ù, zĠmĤ‚ƒƒübĠ²ĴÒrSY<’†Á”½¸ë:Ğ}Ġe—A‚Ìy §ĵñş jŞq,üu˘ÍĴ\Úżá³`°ÓŒMċpTğÛÈĴ˜B^k¨(Ċkgí_#MYëúRè' VßEK“m ‘­´"çÛ$ŬË>!UaŠ‹:M yOY3Â4„Îmİvŝ˙È@~{í*Ká6oùì-Ûĥ£e°ÀŞ`³ Çñ¤càÙRZò´uCÙj¸ËĴ›˙[§T†ûÀ¸`îXڑò@M6Éö¸Ó“Ĉ×ÈuÁ %ˆ² jlµZħ:şk[ŬşmÙK.Û4g³9Ž£/&i˜Ù²F™F½n—NÔ¤ûqŬĴ%ëžUV;²k''zµÎu_·—´Aiˆï×!ÁWĜÔÜ'†E*¸¸¸@PSÏó&RİĵX,"`R_š1ÀR½0.[â˙/eM*q¸Ù$…4Τ俇'ĤĵÎétJµZz½µZ-²,KµÛA’ÙHl;ŠMj]äFž×ÀM53yP£ƒóÇŭĤ…@ӌŜĤQ’šüĤò€İo9Ġ‰EY +úxÇÇ>I‹ëÔü‹ oÒ/Žç ; IïìBg"k2vuâ‚Ó·}_Û6ÏëXIⸯ]òJ°÷*‡Q†GQ4"˘2g\ë´Ĥl%M9ŒÓOßVv’n—µ@ŜgŻ3ìEˆzM÷ ğBtΑ;;§°Y§óèi˘<µ6Y““McÌMkœ&ÛĠ âe'—c[fÂÛàÄl(’8Ôĥċ„óĈ×áĊƒ˘AÛ ŠÊ„Ev0˙-§X–ˆˆ\×µ ĵ],!tġeozœTt˘q­]òáäŬʓh¤­ÙÉüĞ됉œH™8éĉĞâN͔%%ɲM’d²4ë`Bĝ$AÙĤğKg"K:ùÒĵÔ6÷Ï:Ʉ,™mj‹öѲ·Úöşè lb³÷ÍuÉ àIĴ´mŽPİTrĠżñC´:ŽS'"W·8!ݸ­ĞٓàÍû°¤5r’œÇĉږ1O ĥx¤'˙Ĵ3”şq§ \!PÚĈ+>ï¤żOBx[’üğ´ÈˆéLÈ9óû̘t5òmĦtE *uíĥYÊ@üÙÉıĤ™Ĥ÷şÈ›öúëâĥäw6›ıËï˙œ3P­V­e0p§T*Uù›òv”¸ZŭĤġğuFš/%-ÔŻC<ÖiÚĉN›JYJ]ë”$Frg¸‹ÎmÖ,“ÊâäˆÓ8KŬzóçĦûY–`ĝ*½ÛìÑNûŜşsœTÚ4Ŭ‡nŝJÒùÜĉ0# úşóLx^ IDATpLq‰lËöğ,ÁyÈ4(m“}ĴÓq!­Z­ĥ˘˜{qqĦÏĦµÖ÷}‡6ÑĞİĊ<€³÷]×ut²†ş‰…&Cžö`m{€†İß2-œĈËW­T ƒ˘e',pd?sŜNz•`Â8#W&à$Óu „:d%ÎXìsŻíJ?£HÁ/.÷ż)ë׍°•ç+Ó(iĉŭÌÁ$w‡‹ıĞPàmò´v]21e8Cœċ43?òŜ]´4rżëş(Ĵ´cŜrÍ@ ´.• ,˚тˆlSäȀÉħ¤iĦÒu È6MĠĵâÄP²Ô~ù<T¸ÏÀ ‰#Ñ SÖĞtƒÁ5 ıaCĦ´€6ĵĵ9yë3$Eû:îŠl1AüĤÌ"KĥfCʲ·Ò”,âÖÈZ‹ó2ài“€4Î0İĵ—uĜîY’ĴÒbq¨dQċİZÔO>?IĜ• „şôÛ’ĥ}ïüžaËħçımÇ߅aHœ@-ßh1›Í˘ÙlĤ„9¸SLbA§½ĝMGôfYœ4%îࠝ·èé&ĉUK£\—Öè ÷!Ÿŝ=NÉó<%[‰V;ÏóVӚۣ'Î„`ÉÏ˘pŠŽçyJ.‰wb"Ğf%âeQò“ëÌlßv@VtäˆK§ L²jEqRHmŸboğxxÂc èñ]NÜĈ½ó¤ ÚÈmü# ZEs"Š*•Š2ާïġzÔl6ÉuŬXHÓÔğΣpÈcòlTŝ­ÌÚĝϨ¨žCÚ<ú‘Î.Á5:ŽCƒÁ€nŜĵ‰‹‚_8šÁ™çiÛĤF7.ĝéÈżŞ|:7ŸÏi<S†4™LȲ,ġÜM ĝ˘û´ëÈ{ŭ(ñ½“&àʂäuíòœÉyIû[ž6ï|£`|›†.Ï÷Ä=ÊaUi²ûuêÄi—mœ…ë6Ş9İ ÁYôލdNŝ, ħ+òŭÇĦSÂÁ½ó2çy4$X*áĠdRŝ`8,²Bİíl LôşF‘?(:Ĥd^PG@thS•ÀM6]\—Ö‰™Ö -¸Ĥ Ú×Äım8^B‘b’NF\fħ‹AVĤ€0­áçÏĠuŬ½hhÄ!LÛ|ÁI` tǒĞM v\‘çŝ‘èßuA’ì'/ċÈ.8ìn2¸¨HĥŒûÜ+Ž€ñrÉòï€ üœ3 œƒ™qx²°²²Ú4Ù4ٌk~­iş ²ĵÒdˆë:ùĴJvqí`ÛʜlÛ&ÏóV˘ÖE1Î>n/fe\ÇéHùá¸5–s֑KĠħâӞQJîw ìÊĈ}nν)ıѵQoŠhl›À'ŻùşuÄqEĝı„š(GqeQÇ9¸jk!Ñz<àeü)ÖÀaĈÓ""r]ף΀$ r£‘• ´îFäُi2×ĥ k^Şà: y8Ĵ‹}°sċŭ§aĈ9rŽC¸CàÎÒìïM2 ÙZ¨ 6½ÇĴ™Ċ>ĦÎ]*/ÊzŞIµrk,‚"˘nŻï{@Ü6Ÿ'OxÉecdM³Jòô#iflCdwÊ0a!Ħ›D—„pĦµ\¨Öò0DQYRµ(íT³]ĵP7ëÓ8DŽDìS$&KÒ&÷/u8¤ĥíV¨]d IżÏË#i;Nt™ĊşÏ Ë œuü‡eGÁ{šNë‡ä  L K>tYöşA_ÎÄu$‰ÊvPŝŒ~úӟÒáááÊ|•´D× öâmq`$˘\.ŻƒÁ€\×JB£ÑÈÂbĵ…CDôñÖ[o½µX^ĝáòż "*əĜĵ77k„ğ݃ÒR]‹â6)Ûğmc·­ĥií̵ :ÉÔ'ÎΑ´ixyjá’Ĵ/Y‘kZ%:#J8µè†ƒÍ'zfq y‘ñòn‹ è‰H=WŜ!ĥNĈ™…ıÎÈmEpŽÛO~òE‚|žÄŭچ½Ùµ 5ÎÀ™—ÁƒeYݐëĠkĉy^3 şMÏÙÖë>èĴ>.Ö) Êïç ½À#Ż(?MİEçĵÒ$ÁS: ŬŭĜĥMñ˜úŭ> ‡CÇ n‚xG‘ĜĉIë—ôĵtâYşk^’½ĤÑ,5K)Żgıiœ›ëşŠ]ì8M§Ó­ 3Y3ĵuß?ĉƒŽ ēŬglÒ-R$óM“²<9KÛdï pċ½¤Ĵ½hë½I@„'6L#ÇZ–ü£•`|ßùßı†aC÷°eû‘IÒVwptÙĥl-Ìş˜:‘"Ù{%hÑzÌıçìKž…™„wòè0E­iİÏFAâ@DvÀċ€‚™Ž7¤Ö¨{Y%wÓh/çIbhċ5SN$Ááá=Ùşì(ŽÇ‘•pşŽÈÊ91í3ËqĤ+¨CŜÙQ^ì6‘ĞŠr=;YQm#YlZ–u‘Ìz_ڕ“Ŝċ*|–äE`-–<Š(Š"\”Z‡ˆ¨ÙlуÏó\ÏóVà3d ƒÁ€Ŝ|óMŞVĞêûĤÌ=NÔÄitâ²YùÒeĤ¸^]‚éZ¸cC RµZn·K£ÑˆĠïvñ}ߨħ°É_ÉF—N(öÇQ ]Ö+ jpvrÊ'Wa]À™ÍfFä˘H5.˜Á*żwìÏ,Ş‚iŸû6³Ĵ°'ΰ8T.—WjèyA¸ğSN°}•ÉtëìħĵfĞlsˆUŜëÒĥÎlğ<°½ÎƒŽâÙevŜ^úħ’!żHDT.—Ë׊„!|>'Ï󴋛5;(‚¸ƒI[œg—:H6 ikÄ# ş’4_Á„ÈHԀ R°Q† eÁF’½ĝ&Q§"¨Ù eD].—cQФó>‚Ĵ#{N‹Èd5NESîÓñ*ħn2ĊÚF÷iË%JÌ;àv´ìsÏ#NÖÒŜG°û?ÓétNDsd†aÒt:]‘lċ™wVc\dİǸR­HÓz”Ö8gĠZÏòŜq‚)Id ħIjüŽÜWéĊÉcr ÇI%.•„ì# ÈâĜ¸Ú Ż-ĤmmÜÄyÁäô\‡™GKpQm¸n˙#¸ Áyž/İ(*•}-˲JÒÂĥíıBP–ˆĠj5×uŬÔÈ$İŒg‡›E‹$Ó,,'ÍmK+YšġçyDœ ŞÁ ×ċ„SÎÒa_ "²‰(XA`8Ëċ2-‹h6›QTĞĠh2™bħP=ġžçQµZMœĥ–†m÷sˆĊlâLä¸N|o:RİT"×u/ *Á=N§Sò}ŸF£ÙĥMġz]}OB.i2şĴ÷°éßòz°nÂ#‚8?9¨û E92Zמ™'2²ËqÀ¸]ÍuœĤÖqçD–E^—``S§~Ġ¸ĵÜwUyëìï×%ÈĊ=zžGAĴŒçʃphŻ8Èz}ßw-Ë*óÎ8<ŝï8ˆ2îĦ­3žuÓÌʔqÇ&{íuD9n0cŬÄĜoËÑÀĦñÚ?Ÿ<É3g“ž×°–ÁŸLUÔ$ïŻYErĝšġ™n›ÏpŽœ,èVVc)IV݃Ñ̂ ÄİOŬİò}ŝ:eÇé}îŬó<ŞT**0‘@£(*­ &,•JAE /ʁ5ëĉ]MÜKk|ıœNjyħX(R8ĝâz‘‡ĝşÁPÜP!h x$³\*Ò!E˜WĠ!òÎ \;J$E͔´!֝–ˆÒëd,×=£:ÎĈUY7.ö:=cÜïë EQDŽPjR#/ï-÷ƒµqˆH‡ÇİQmıˆóĵğvĊ àÎ .G¤¸ŒTĤƒ£XçmR7ϓ`C/§VI„Cj)p²¤i˜Ï˘ûmB‰8 ĝ[0‹”ñéZ^H‘Y3ŜëPOŜ:³‹÷Ĝ5rxY5$m°‡×ùâ2&)€eh-}ߪÎÀÉÉ Ŝ¨IDÍċ¨yÇ:C”•I½/Òè6ż6,&ŝ ŬŒÂäRĵEq‚òc€â’m:Nİ\.+ô:/5ÄéAfz£N×ÌĤY~Îë*À³.Ş:ĠׅHÇï³Óé(ÉmĜëĥ²|Ûl6)Š"ş¸¸ ÏóÈ÷ŭîĜh4˘F£Ah6›d}ĉ3Ÿ‰–ADmۑìħç™ĉ&*ÏèTÂáş/yùÏ8‘ĈÔġ&°çwé,65î’EËï[ÖÑxـ %‰ ™P# {5ĥ|ħŻ Cò%ĤÓİç[„@`WßuϜĝKWıŽ÷.1ú×Ñá%@ÌYÁ˙_÷R‰eY†!ġz=5Š~0¨çïyı‹ò·KÄUĞUÚĉóı=ŸÏUŭċ:şċY; vah%LÎ!q$ í ]y‹mԁñ uZŬ||1g• AP 3˜|î{Q è:Sö$ÚaÛ6ùŻ­/ĉİ––·x‹I`* ‚4qž/9ĝkßHšïû4ĠßË6Ĵ]£3ğʖ_ÔÎ=zDív›Úí66îÁÁ5•&€ċÏ,Ûĥ£mw•żĝĈ7Ħvùl6ó–‡"Š˘ÈâB,€×³d² MÇ<Ïû€'\éüt¨€Ì\×Uu§,QNS":È2­PM/Iŝ”-tòwFtpp@·oßĤ0 WĈ;{žw)ûOê$ÙV°Žó7ŭŝl6£z½NoĵñĠëu{§é&ٗ\G{ċ¤m*HÓ~ş‹àêuVŝÓëR&€M{à9ŽCƒÁ€nܸqíï{6›QĞĠ˘ÏŝóÔï÷é|ßW¤è%Â-í}M%‰µZ dYVĊ÷}Š˘(ÂB˘ÇjtȐy˙˘ÉùÉĴ% ĦŽgĥ&d!ÉéK'ƒŬÔ=.Ö³X,h<S³Ù¤VĞu„i8Ŭx]ĴI}ŽĞ"&µż™ĉ˜F.KĠjµJċrYMĥ‹ fz{F.ŝäšíŠEž…`ş‰3܅ƒ(˘ҕËóËĥí•NĦëîai0(‘´m$.E³gëÒ­[·èîŬğTİTVZg³Ùĥ-gϔ‘:žçİu!"ßu]UàÙçì(:ĠŭÎU€ÙıÓu]—Êċò Ÿ_yĴArıLa*y^ÉéʂZAöı_f³ġû}Fäû"D×j5…ĝŻ(DäDuÌ\×ól;l$žEĴ3lċ*29™Ž³ú7‚Ĥ¸ùĝı4JÜÑ$µċ™ş Ò:޸*&ġ@ŜŠc ál6[áO\µg)'7òÒÖ§VĞ)nL*b ĤöA’[—PX*•h:Òp8$Ïóh0PµZU|™mĵv5{@ “Íf3ş¸¸PÎ4QRĦáp¸µ{ŜfPĞğoĜü›ËŞO&“•ßç5eóŭĵĈÎÉtÉN_¸wˆ M§S5ÖĥmšN§ 5à÷!˙‡ĜĊ=‡}Iµ^M§S ‚  (Šh0¨çŠŸñŽşétjñn‚Èóĵˆĵ§žîáíxYĵ#4­…ëdˆü=g³™Ú48Tşlßa겜ƒÀ‡ñ݉rx’„ñuä'ŝ_ ïë˘_ŝĴùDCn|ßW@ĞĠZ1›Œ|ŬġĦ‰Û?r}ß§ù|N½^J’Ş1ò F0 mÙc>ëçbŸà\QâĴó`·ˆÁ^RëäÁàüB7d<SİTRç Y£ĵß,‰NĊt_ŽP&.Óé”:ŽjÇY–ùu/EvüĤ×t:Á`@ċr™|ßWŠ|Ëvú+~HmT4™Lh8*­ù|N£ÑÈâûc>Ÿ“Ċqœŝò-ß÷£(Š,˲(‚e@—9I2‹ˆe6›Ċv,lUsc!ġú§ÓİŠG£5›MQ£ö$aU9Ŭ 'ÂWqDçJ2Ò9s'db>›`RW_ëx<ĤñxLFÒp˘óósêt:*‚F&!‘ƒu2Ġ]Bİ*İû|tMÀéġz=vğ]€‘›ĈÈï3¸ÑeĊş){œ :™L¨×ëÑ|>§Á`@ŬnW ”áÁŭ™88œ9ÏK?€Qûŭ>•Ëe TŻ×WΧ•V<›.u\_†ô³ŸŭŒNOO•ƒ€-“ŽL¨C‘‰Â¸§ÙlĤƒƒzöìµÛm—sddħX\şß8$u`qۉ ^áÂ0¤c:;;S÷ĉ8ŽòÛĜ ˜XLÎ_˙ġ_GìM'Ë aqh°Â2˘ˆ…HMŞü½ĊbAa8;ŭÀÙ,rϰQŭb1‘!>DôÌ;à 9ü¨kLŞ#I¨M’ÒÉR7|Iĵ t‡H£tÀ÷}ġ|F£…a¨2à˜‚’} FI˜_·G]×ápHçççÔl6İRݨC…™àiĈ#'q4ĥ•á§Ù÷:ä pùd2ĦjµJáz½QR)ÔÔĈ8#˜TĈá?ŸÏçôâĊ ‡tóĉMF4h8RµZĠžÓ¸çµŜĵŻÀ°ŬnSŻ×SÏġċ˗*ÑA‡—#OBâfĠÈLu×ûˆ'Ĵóùœ‚ Ïó¨ŬnS§ÓĦVĞuİ ·‡’ÈŬûzĉşk›L&ôôéSr]—NNNT" ;˙Z.—Wž§šZÈnjG ‡7ŸÏi8Bµˆ:µÛmj4ÚlÔ´8:ÇgjÊڒÈ.ëŽĉ­plˆˆĦĵ7 èììLÁ-ŒpßÜéꝂî!&İĤ)µè“DĦƒHĊÙĥ¨X"{ÄĈJŞ“ÉùÙiœ^Ŝ Ŭ/ĤÌY#2ŝápHDŻ&xÎçszùò%uğŬ•ÖJnÜ6ÙqύŻ[œQ֝yyŭ[…aHŭ~ŸšÍ&Ŭşu‹^ĵxAñXAĞI×°o‡·ÎµĦVzrrBµZ^|Iŭ~Ÿ^|IÇÇÇ*käċƒ¸kcÓhäQIƒ˜@d0p8¤““şwï=}ú”F£);›U€)΁îRÄJw*Ïçsj6›Şn~ëÖ-ê÷ûÔn·İĠj)[ÎQ£¸ë^G“bŭŽ4‰ żĉÉdBgggäş²Ġ‡‡‡Šd4İ ĵ‹ĊBµ:Â@.°(ñ˜\×jµJŸ|ò ÙĥMċr™şŬ.}ôÑGôáCI›N\™€;}NpÑîò.{Dş.A@DDŭ~Ÿ>ùä*•Jtpp@ᐺŬrŒpœÈVĞE‡‡‡ ğŠ/N“É„:ŽBzNNNÔÏnŜĵIë*dh2™(‡‰÷A ŝ /˵ë>Ç<˜L§S:==ñxL·nŬ˘Z­Fŭ~ŸŞĠ*yžGNgeŒÀbħ°–żĥmG\=ÙJAp8¤/^ÁÁš ¨=):Ò9Lîôùĵċ4‡Á0p ·,‹Êċ²ŞBAı`<ӝ;w¨^ŻÓh4˘ĊbA“É„...¨^ŻĞëäí—ĵb*“舀ÒÙÇeġ:dAçPâÊĜÔ¨#áï‡!žžR£Ñ ›7o’ïûTŻ×i6›Ñx<Ĥn·Kóù\­˘KÓµè$9HŒ)2µŸñçç,ä$J‰\ 3îvğäy‘çyäyŬ¸qƒ^ĵxħÂX,ʘšŬç›—é$^R'€Ÿ!\ƒçyêó@$›L&ttt¤†2A@7oŜ¤³³3êt:+A,¸ĵ´÷|<3Ĥ7; š’ô=<Ÿ ¨\.Ó˗/İŬnS½^W2ÛĜ‹A­[·¨ŬnĞ‚ëştxx¨Î‡“ùşr˘/‚Fd¤œ³ÂŸ7ß³ü}J•JE:N‚39:€âäbÀQ¤A‰sxI½Â’d²œeYÔjµÔfòȵí=OltȞ|Žĵ“+îúċ>pG•´tÁ"~¨Ĉ§>ġ)ĊšÍfÔh4ÔÚÂɛöwĉ:$ûÖD˘G*‘Îc’Éż<\o\IàĝÌċµÙ˵ğ x<ƒ&,hŞjŬĞŝŽyÉ2EÇÏÁÍ[Şĵ-Î3KüO&†Ÿ/˙ ĝ"ZŬ˜,†˘j>or-cM¸ĝ|TQW1JpËɘrŬĜ˙kkkŞÓéDĞ…‚ŞD’òTÊüĜ¤€á17p~cMÎbé-–2b)ßkQˆžÓ`lĴVÉFĦf£|:Ì4+İäĞŞ~`8UacŽ+ż^ÔNFc͑¤s‹N²ŽbCòË9W+„ÜĦ)Ë2Ïo è tÒ½jâbÂI*,ıĦ/3Ôq`şe*Ĝ²c?ÖÁ¨SiT°B‡e[hı‰bâ8ž…Ĝĉ^O–s,tĊ y1Ÿr8X ˜*îr Ĵ ó/2*Â]K—UĈ–rMb!ĵ˜ÑV…s`Ï/V!3Zbgc™Şše=ĉ+fà/Dž8NĵœkĵšjäTx%‚Ċ ^‡eËŜ–1½×qûk™ë7?ÇUtaŬ9zW…9¸]´Œ3sİ×^ĉyXŽ'€HWşAŸŬŻÓŻ~ġА(Š a! `8ÔħĊÊH¤÷w]ŽĴR–ÇħĈUy[Œìä\!GbJ^ĉlĞrŜ1´ò˘ı^† KZ•‹ÀV‹rÎU›J żĥ"X&òpı s/G˜_İZġżŝġËq^Oï˙z[çËYÛ*@â•Ú?WЉôċ>ëŻVĞUĤÂ(ÀXŭ– ċ4…Ç‹œ7B È£@Arى 3‘PUĝĤÊsäk,¤Êı”–žá"†@Î7ËgdéÑ^IKïj8|ħç|-<û•xïE^÷2¤7/'Ġµ ƒglÏV}˙o}­^)ĊżÌ_Î3^îş\ÍM¤†u~ıÄhUkñ\ü{ŝüyµÎéa?™L´µĥŒ~úӟÖ=ôWJĠG£Ñµ\kÒ>nq˳ĊgWğç²,Ó[UçżËŬˆU^ĉe;V}nÑ&?ÎÂ}=(—ejè_-ŜòKm™*sĈŻUcôĠ0p—‰^‘›Ğı“äĠĜ£áċ~ïJîƒW³í;E@ÇÀŜ*|‘޵Ĉo{ÛÛÛÛÛû!2`àuˆƒvˆL^·ŞX2 #–çżœXşğ›}™VŞËĤN^i çË5Ħé9r^$¸/VérÜ|IÏ]‚¨ägá8Ġ#YÉ8uĊ e’§BVzóÁ(y„™ċÂ(ħEX‘K•½EdAàMR“ Ÿ³Áhu|žß/F\&ù$jl˘|o~Ìè­jş#Ï'É÷—kŠÔ"ÀnLBÄ%xl°qšóËkȟß çß9b‰Ò=ž'7G´W–ÀI^§1ż‹ûĦ$úB–ŠK")D˜%ȑċĴĴ‘Ġ'Ĝ# ˆkÇŞ oz“k Ô‹iL`À´‹û ‡²<›ßsÔl6çjú% “Ì÷ÂÏ#gŭżˆt {looŻ<èf8N•sN‡¨˙N˜ Ÿ,QŻ×ğ³Ù솰İ5êTyÒŞ WÂ2ZĈkYĤġr­ÊŞz÷+Ħ ysËĵ·<”ħgd…Àï€#Wà @Y 2cÁŠ5šŠ½_LĦòŭµeĈĉ”jĥ1÷Œĝ,£ċc}"PšÄˆ[ÚLx#–œ÷˘Xĥ¤ĉ’YV&ħT”İTà’ğ‚ïÁ j 8ÂÁ/×s==ħ7…„;ĝ b‰ Ç÷§ÓiùĴ¨ĉòFĉ`eÇhr9ÇLw+Ë? ¤8ҞĴ¤°ĥ’ρ ŽŽŽÊ’3c:ÎKö7+;. d‚3(Ì5ƒsQe£Ô LödÙ£s£HċÎ-~ċA€e,玅>c6Ş6flŬ5-âıCo•1 .YYHş×ĜŜù•² *{@rÉ`ö<$QÖóÜĈ;ĉY0hUŜH#’犞ĞGĜĝ‰5Â>‚²‹QGËr%Ù½üŝ!Ì´ÉßÇóAYKݰ àë½WƒÁ`nżH0l­V+çġç¸ßh4*ßUr3àú Qú~(PVÉaŽ(Zì(aĵ×ÖÖÖÜ:²ĴÛ)ž§ÙlŁ} Î Ÿ4MU·Û-+Fi\ìïïĞÙlĤNž<9ÇrÊûÇZЎŽŽÊ÷â> |>ċıĉŭ;˜7lÈ2ñ{sûtì/¸ÀÀ=A…µĉŭÁQYÛg0`˜1[%ÈÈpĈÁÌ9KR#fêdù/Ïñ`LĈJc`D‹ÀMQEI<…H_ĝĴ/ŠBO&“ƒf³ù O\ JáÁ`ÇÁh4*i)Ûíĥ:88(Ĝ€pg}}=jpè Y2ŒĈ–Ħ¤[•×Ċc…ˆEä²ÈP‘Œ1^ì‚È"™İRz2WÀ†À]T8(£Ñè%Q6Àµ/½YÍ!=Š*ž‡EÊ;ö`Oä3â^`xŒ­=ϛTVħ&GÒ{‰ŠUŞU„ê¸{LR%ĞAxcái|†Éb¸nšÙü8z ÈÀ˜aOXò›³‚cC“™ ù3,´ı‘÷azŬĜFċs@Pñ£ŸŸ´4Tc̍Ü0Œ×gdmmMĠjµ9›ñx\ĥnfIlZ_6zy°€ŽEh’$);£2ÓŞL·È}ċĈ v8j‡Ž{ġz}γd™ĤݍFsÔáLC$‰šL&sìƒĵ?UbJ†²AÙ.#rĝööGĝLàı™bGàX&A £d%R[pfĝÚm€AÁkĈNŝFTGĤÑ̽àd*¸ÑhÌqĞàŬ8…€g`ˆ£IĵŝĜGNgÎ!ATßĞVĞİápXç`0PišŽ1żûüç?ݽ÷.°VQĊx0¨ÑhäħaŒ1jggG;wNmll(­µşŝúëːS´r¨‡ĝN)­µ‡”›^,jf"ô,c\$9IŒÀ…0{×lĠĈˆ,$74#òùĦŒĞ"|ĝ9´ %b­-­zéuáŬÇqe–ĴŸg„0;+JVĤU ˆ1ŜˆEJ–Cp,À9ŒV€Y†#‚……d|[d¸ÈçcE#•·TL ‹dħ·%Cžè!# À•{AĴdB=*I+óżàq…'áÉıċ<2+6tÙûÇÜB²‘ƒŭÍû atŽ4Êw_ÄȆ\ïx<.˘¸U–e·Îg‡™%7Bġx~6$ğ^£Ñ(;œ2)Œ-xġş‡B@wPôŸgÖHĴıL°ñ‡½JÉd˘†aÙsškQƒÁ`.:ÉQ(BDk€uD´Š™ëpê ëÍ$PHàĴÀÓçwÁÜaΙ{Ċ9§vvvĉh}ĦÂ$X̉Â2˜Îû ĈĴ,Ĝ:c ,Ĥè¤rŒu]ςt踔ФĈĊ@ó§* šô˘Ĝ”˜I˜$ż'ıÇ%/~Ìë>/€Ì÷gCk™Ŝ22 ;>ʐıÌÑɨˆÜWúx.Ğòĝ’-,F÷+ ´8úĊ]Ö$=2+@kƒùŝh(C‘¸S§r鯌ñZ@%ħ,òÌ!£g.ċŜl ŽF£òy8¸VúU{PĤOÓ"‰żà!w:µżż_Î{÷ħĤR|]nçöı„ċfd’š˜ïÏİ)ß`„p8ŸÓˆq­Ġjjcc£ô~‡Ħ:::š{/Žq³5–%Ü. D<ÀFËNżÌ0ŠùെÓY²ż ˜J@dÉZĞËöZkĠï÷U§Ó™k„ÇÍŜ`lÁPäè³hhÄĈŒ4D$¸v×ĉÌÌËİ+çœ:88˜cíŒmeWT>@pèËÖĊˆÂb=ħ~EQ<}7ĉ=ôPúáĝĊFEĈ7íîînİàwvvTżßŸ ˘5%Ĵj,‡ÂÂsœ²^†Mé8,Až9³JϚ7—Tˆ°|ĞŒcLÙZ4öÜĜl\•!•{àlI£Cž3F$yĜ •à™˜°ĈšĊr˘ĊċœÍÏpƒ˜lI}ĞOdyßqL~Uİ-‰u‘-¸eÙf:ö<’|+QaC˙>ĈĠÁׄ˘‘ Kö¸$K~P*Ĵ @żeċÁg]²pò@‡GŠŒ˘–aZİìĞHŸŒh3+#On;ŽFŞVĞİN§£ĤÓ݇%^c}}ŭ%kÔh4Êu†1 Ñ ^ċ?9á\-ĵî4MUżßWĈuñâĊı¨”Îĉ`0PN§l†0úx<žË{sĈ:àß/^,çÛíŞ­­­rŜÔ`0˜[Ÿf³Yî'ĤÛfÇé#xžœÚ ‚Ċ^ĉ=ÓX#jÈ ”0À’à)ĞıÖÖÖÊTä<ö,öc6VÁ>àfL@Û{ïUĞĠ*Û3ö ­ŸħjµZPŞċ9i6›eÓ·z½&“‰ÇŞŬnĞF£Q†ï9⋳n·•ÖşŒâ TW–e%Žƒ£ ÛÛÛjgg§ÄùÁhœÍfj_]{íµŞÓé”)ŝÉd˘ŝò—ż œs˙ö³WJ½H:ÔjµŠét:{ŝùçĠááa9ܔmma‘ÈP…DA.*o!YH”áXéy°2Šy~l‰3Xƒ5çğ8d& ˜˜@Žyó'ĵl˜H^8D6ħ‘ŜĵÄ(HÀŒÌÓñŭc• œa1Şôr`9Ä{á8Böe=Ìd Ċë+ŸŞê‘!矑ĵ\&Ġħ“ŒÀ`ïL&“2ËeeĴ”%Uvƒáï9Ĝ›Cd ıl6Öd´‰½N LĊà-<ċ¸Ċ/”#ĉ}6›•Ŭ YÉóğsé.â÷ŒÂfc–Ó4Ĵ,ñ<Œçàh!§5¸³‰Bqq5äÜFCQŞÑh”rQ‘N§Sî'(qÛÛÛŞ×ë•FÈx<.ßs:Ş'N¨ŭŭŭĠerttTŜùë .¨ÍÍM5çş% 9›ÍÔúúşšN§Ş×ë•óĊ oR*°ıtZšĤey!7Zâ( ÚE#‚tÌÚښŞ×ëêèèh.ì/Û­cß1ĉ„ÓÓÀS]wŬuŽ /œ˜ÂD5 G>pŝÖ××KƒÄ|(ßkµZŞÙl*4ŝwÑñVħ€ï ¸··7‡“ê÷ûŞĠjİC|ÇSŸÍçûŸß10ûÛÛÛ˙ŞĈܜ1°ĥĥ6ÑZ?upp †ĦOÓTmnn–Vüúúz˜N§eG§*şÖ˜'(s,j4Â^4[Üċ”l½+óUĦ5ğÈ÷`–T(ÈéWÍÀ @˘ÒáUq$êœï’ái`°èĜàĜ1pĤâÈ|(JVÈZÖE% œˆuN<.:À‘‰,gĊ' Ci8ĈJĠà²wÌż“‘{1˜sxÒ°€0ċı5á1G ¸§;—éñ^°‰s|]TF·É,ËÔp8,ħ>Ċ˘ĜO|_Ìwxç#Ĵ×ë•ó”3wí÷ûeW5xnÜZ|cccDr8–Ŝ[šĤj}}ŭ%{a\ém•‚s/J6tÁï Œ9//Ëôd—#H0Ĉ˜èe2™”sÑív˽‡sPÎ 0 sċpÈĈñ\ôËOÑDĴ×ëİ^ݧJݳÛí– àAùléœS×\sšÍfŞÓé”é"`§P6ƒ²ÖŞÁ`Pê–АĊA)ú0?žĞ‡›çı— w†ßŜŜž‹Z$IâıĴ–Şôt:U£ÑH5 ßn·UĞĠR~2™ ²Ä‡{ëC•eY ÀïäİĦ›VJù‹/–U­VK#mÁŠ• 8GĈMŬ5ŞDdĝ,Ë4 9Ĉ“°#šçıĥÖêÙlĤ!3AT UX;ì?kíĊwżûŬç…/$FcŜxߘ< 5Ëè„sÈÙpCVÄ<1Ùv‘2ċv”œ3dÀâq9}YwÌ \Y˘ÇŠXÖ×ǔk,gÍçżiÎ<‡ •JH‡_2@Kĥ|ĉ²9„ëb9aĥ¨iŒÜuµ|Ĝ$ĞŬ2U xG™§ÔV)Œ8Ò$ûÚgYö& ?ÔĦsı ĦÉŸöê ˘Û#m­ĠáûŜ½0|0Ö4G@Ó ^‚ŸL&š™1j:jÁƒM›ZKƒ;Ë2ÍíŸ9Ġ€,İĊÏ!l!G`œÙ˘™>×EĦö°VšS ²› *Ĉè ‡9y!q8ƒÁà%iiĜH#G Êhó(İÏywŽ@°Ä<\’™e™ ċ5QÂDGÍfsîN:UlğğğŞÛíŞvğísßïώŽŽö{½ŜAQûišf.\ÖZ×l6}­VóµZÍcĵµ6I’¤•eYKkŬ gÛi­]ON)ċjµf­=PJ Š˘)ï}×9×+Š˘kŒÑY–9­µK’ÄgYĉ’$qµZÍbżîŒ16MSë½/öööòPW$IbkµšSJ9ï½³ÖêñxìÚíöĴ^ŻÏÒ4͋˘Ù)l·Ûu.ġî:çòġġġĵÑhgϞğfĝSbìz½žŸL&ĥ( a‰1&qÎ9k­L&.ìçZQ˘(Z³ÙÌxïkaĥg³Yâ½wĈWŻ×=pxyžğq{{{Ö{äœ+´ÖŬnZ­ÖNšĤÏ:çv‹˘ĠëġÜZë­µuÔŒ1ŸĤé?÷z½ÓĦDQ#’˜e™M’äYéÏ!Àżŝú?Ÿ;wnöç?˙9}ó›ßì‹˘fÇqéı`F¨TÚ£&wZk‹Ċµ½$ì´È)ëĝKŝL‹żçJBdm8{9Ċ³²„ÑBž¤–n8ÀšSĴ”bí˜! Ïò;ÔÂWKd7 ½¨ìr’ËpŞÈ~$²ŬS(.:玔RÔ9wà½{ïó MÑAÁvIqùw­(ŠŽ÷i­­9ç2”7ĈdÁC.ì RE%I’k­ëĈ˜D)UK_8ùižçİRކû0 LäRʆ?Eĝcĵ÷µ,ËÒs˘0Pœ> ”ZTaŒħ¤Xĉ&„;Âw1Ĉ{ï½s.WJYïŭ,<Ÿ ó’{ï cŒ5ĈZë“c6’$9ĦµŜ{ĞPJÍÂ;ԆÖz9×ÓZ§r‡żm¸OíGÙXá½1 ÊŭÌ5áH/I#GàSĴµëY(ò0WyXŜŬcò$Il˜ĤTk] Jc0żP$ÚZ늢˜i­ÇaMĵ÷EQmTÇÓJ’$Ͳ, gcò4Ms­u‘$IiÑpa] ç\aŒ™h­gÖÚĈvşœ*Œ1V)eısÖZŸċy^@ ĵ°e_‡3‚uHÂ\è  ÷Ŝzï]QEšĤ3­uŽùƒL çÒi­Ë?a\Q6ì­Â97ÑZϒ$É^Ĝr2S;ç Ŝ7Iì·\kmƒGݧÓi’çı×ZçĈWĞĠl¸ŜŬŬ5Á Íó<ŸíììdkkkٓOĜhu (IDAT>Y|ĉ3ŸYüj,5~ĝá¤Ùlê4MMĜшZ­ĉ;Žj·ÛˆvĝÓ§OгgÏú?ŭéOê駟vñX:uʟ:uÊßu×]U`­™Rêß|ÁßŜŜĥívûż{ïD`BÊĤizN|Ô¸ġÖ[Ÿûċ/ùžzêİ˙ôÖ·ĠF£2lÄÈŬâ2Œds>„gÒ$I ,zÙ>ĈPCdˌžż ÂZC1h­ xßá0ûpà|8ƒ8°³` 4“$I½÷6MSo­uŜ{oŒq'P)|?óŜgá:üżJß*r­uá½·¤°Šï™÷~d­Í‚°KÂs1Ó Llŝ|0Lh*aĝZZk#ĉ BĊk­­RŞŜçZë B.<ƒŸqZk~ŸcfZëİsß)0ßÈÉQ(^‡ˆGBÛP’ž<Ôr1.MSgŒqZk_Ż×]ĞĠr·ŬvÛR””Ácġĝû¸ÏŸ?Ĥµö½^Ï˙ú׿6ñ¸ĉœ30RÛíĥo6›Ùlïz×ğr­µßßßOΝ;— ‡–Ö:ÑZ'ŜûĈt:MCĜÜ#Dcl’$6I’ÜZ eä’$ħN§ĜÜÜô›››ncc?>yîıçÖ­µ›Ŝû÷^ÇBk…uÔJݎRŞc­m…uV0<Œ1yĜSı1Ĉ:çŒs.1Ĉ¤I’èL6ìKë½÷Y–Ùz½îÒ4ġµZ͏CçynBˆû.SJeáßĜ[Ö9§Ħĝ½÷I8o8ĝžĤé4MÓYäĴµÖäyn´Ö:¤<öŞÖÚ¤iZĵï}ïËZ­VċŝĝÇ?ÖgϞM···Íɓ'Ŭ™3gòEû"<“_f_ĴĈñ™gžÑ.\PÖZĠl65@†ˆœêÉÑ›Ŝ´ÏŜC„ô³FşÑh”€R(vğ퍆òd.êŒôëx<ÖEQh` Ò4EŻ”òçϟ/SÙqAä¨ÙlŞ­­-UŻ×=ŞżƒAY1„~šĤ^T5ĝ$IJ`_ĞĠò'OžT'NœX¸÷îûnûj­ßĉĉĉV§ÓıµÓéZk×g³™!}l›Íĉż‡È€—w9îż˙ŝżìħÇëğœ1&9qâ„êvğeIL@ˆĉûûûêvğí˘(ŜèœÓÙêqcÌżäy~0N‚ +öà=yïkŜû$XÀ³ ä ï}¤µN”R3kmxޔޅ͖+2­ġHk=í÷ûùm·ŬĉŞ„Äï~÷;ƒÇĈĈ†ê÷ûŞVĞÙĠqżzĈ÷÷=Í9s‰‘‘„ħYˆĝ?™L|Œu½^÷ÍfÓ›àœSğğğ%‹ÖZ‡pĦFêSŸúÔÊ3şÄñ“ŸüDsN{6›inĉCé%ˆçZ³,Ӈ€²ŞVĞéz½™Çwwׇœ­G@.cŒ.ŠB‡€)6F£ûÙl6×o…›1yïuQÀĝĥ÷ Ö iTŸ$‰ïġzêï|çK”ÁWò½ÚíĥZ__W7Ŭt“êvğ—l°<ñÄÚ9§ŜñŽwĵŒG}Tsƒ%#EQ¨[o½ueĝEĈ—żüċôşë{ó7Ŝĝ[[[˙ċè訞eY’ĤİzöÙgĠóÏ??Y[[ûô½÷Ŝûżżġ­o™ûîğÏEÏ~ö³×ž;wî§[[[7ĵá oP[[[ä!ŭ~_mll¨ét:ÚÛÛ{ Ŭn?œeÙ ZëkšÍĉ³ŭ~˙ñ^Ż·SĞĠò3gÎÖZÍèJŽŻŭëB$IMatÙ9u/Kż³€y&BR— 0`*¤7"Hp4çÑ cà§Ó)—µš$I™š‰¤ĵÌgĵXêġ$˜µäYÀ÷²Ĵ‹òÖZuï½÷ĤŜ~Íd1Œ<²Ô†2ç™ HÒ²VDµĵäaé4ì½9̀AV56‘kMFQ ˘çbƒi2™¨}èC݉uüùÏa¨q:–[nñJ)ġĜci €””çËFœ.ĠĜa%ô裏j‰Wâ”â>•ÂZW}üêWż:} 7üßÙlvh4ò{{{zwwWíïï+çÜ$I’˙|ß}÷=üo||âŸp/I(Ô=÷ܳ÷È#üŻ?ŝñ˙íôéÓÖZ›0p,„dÒn·ëîûî_>ĝàƒż:yòdò‘|¤×z ”úä'?éĞ”ä•ßŭîw5“VpnÖ9§îıçžòžß˙ŝ÷5y¤ èÌĞhĵîÒwÜáŻÂ9[)†%Ç{Ŝóž…s£àĠï˙û_rÏ+mpĴĈj\îĜÜÜÔĈ˜˙çùEQ¸$I ˆ”B%‹O’d˘”Rívğ:M ”R_üâÏüŝ÷żâ̙3y½^ŻuğŬ²V9\´¨×ë˙óÉ'Ÿĵ˙ŝûïá{<òˆóÎ;W‡c5Vc5Vc5VŻ0~ó›ß4›ÍĉWÒ4ŭÇÖĠ½P—eÙ˙K’䊢Ĝg§6Ê';›Íž9}úôÖÚ3EQ¸˘( jĥAùĜn·}·ÛM~ûÛߚ?üáŝŜ{ïġ+C`5Vc5Vc5VŻ7Ŝŝö·Oüñ˙ZŻ×˙h­]·Öïŭ†Rj£^Ż?iŒyàŽ;îĜ“ß‹Fvwwġwó{ö÷÷żS…m4iŻ×Ó¨ÍßĜĜ(Ö×׿½ğğûO'NœÈŜûŜ÷ÀVĞħĞħĞħWÉxâ‰'tžçIQT67ß|³ûö·ż­?ŝñûŒ”úĊ/~ÑŝéOú?Ĉñg´Ößïğvğ­CͲ^[[û·z½ŝOY–ŭ˘VĞİ~ƒĞ¨ÀjĴĈjĴĈjĴĈU6üqS·ß~{TW›Ş/ß|óÍZ­öVĞġĠF£1K_I½^Oœsf<8çšwŬu——T­ĞħĞħĞħĞquŒ›nşÉßrË-ÊXÀĝÚ×víl6ğ£Ŭnż§Ùlž4ĈdÎı'½÷˙şĥĥöĝwŜ9ZMġjĴĈjĴĈjĴĈkw,ŬTŝ‡?üáVžçkÎ9Ûh4öożŭö£Ġô­ĈjĴĈjĴĈjĵĈ—ô%½š…ĠXĠXĠXUd@}ó›ßÔ ê4Ĉ¨~ô£+ÀàjĴĈjĴĈjĴĈßÀĝ˙=˙Vv~z5IENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Magenta_16x16.png0000755000000000000000000000016512467662066022342 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcüŻ?™ÀÄ@"Ġ0ŞaèhUá^½7ĞIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Input_420x420.png0000755000000000000000000023621012467662066020665 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊF1³IDATxÚìŭg°$Yv~W¸Œˆ§òÎĴĴÊÌÒ˘ĞşşŞş–ş›†jA¨ĦAħ\Ür×l9ûciĥcû{ÍfvwÖÖ֌´ÙY$@bhh ´Ö]Ġ+K¤Î—O…t÷+Îŝëîñ²ŞeVû1{ù"ߋçĦÜïwÏ9ßù>FDh£6Úh£u°Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6Z@j£6Úh£Úh£6Úhݍ6Úh£6Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Z@j£6Úh£¤6Úh£6Úhݍ6Úh£Úh£6Úh£¤6Úh£6~B‰1Ö³mÜĥ×ÄùñÚaoŭäy›%- µÑ‚ËœèGü÷m´€ÔRmüˆÀĉuß68ŭ îÛF H- µÑĈ÷ ×ßßN€t+÷§ïóµÑR Hm´às‹ż{Ğ€Ä~@ÏóûµĝÓ÷p¨İZ@j£ïXÜê}ß @}ż³Ĵïgöòf˙†ÇnޤIÈĊƒ~ò“ŸlϤŸĝ½ßû½ïXĜ÷ñ÷߯ß}ż‰–<Î20a•ß³šżİ;vġguÇÀ'?ùÉœÚx{R-Ŭ€ÜÊïŜ,½ÙòŬ›ewĞ?o˜êïi HŬÒó+>ğ˜Úhݍ·#½U a­Ú˜@tïè€,İ.³:0;+–-8µÑRoW jœ7 No˜n|<ÏcDĤ” ¤”Lħ¤Œ1¤µ&ZcŒ”RoµsĞ@Ôtß:Ş–èšîËÚĴݍÚx;Ñ÷ BìMĠÒÇò< !x&BĈ9çBpÎçœ1Ĉxé6œ3œ1Ĉ„œsVsèPÖZc,ċhk­-~Nîĥ-nc`­µĈ*@ÍcK`ĥ ¨šÀ¨î~ìÀ ·’5µÀÔF Hmĵ€ˆŬÂϖŜÇó<€AÀ…Ü÷}Î9gRJ.t˜#ŠïĴĝÎ9èp΀)(1Ĉ8Áî‹1ĈĤ÷!"îŝĠ,ÂZKŒ1KDÖa”)°ÉŭÌ TÜÇZk °*Ŭĥ&r7­µÖh­­ÖÚZk)Ë2kŒħišZT&0˘['ÜJÖÔS- ĝŬßŭŬöüĞçö/+›Ŭ 4ó<K)Y‚sÎ=Ïï Ïó„”R !Šïҁ …œ1&9ç’1&HH‚16ŭ*À€t$ˆÒŭ8€éWé>ĵòZ­ `úċÀÈ0t œt ¤Ĥ_Œµĥĝ½ĥÖj"ÒĈ @c´)­µÖĊ ”ɲÌ(ĴµÖĤij´Ö¤”² `ÔNċÛĠŸ-͘ŠLħ½J~°qäżŭZ Hm´ ô=fC€Â0äï‹ Džïû҅/„Š/Îı_|1Ĉĵâ‹sî9òc>cL–~ÏŬù/c‚sîqν€ÜïxbñÚzĵzüT Œ ÁÀxĵDĞĦ0ÚŬNÒ½Ŭ€c@ûW. ’ŭŬ‘í@İm­ĠÖZUüżXÊ}i"Ê("RœŠÛYñŬZ›cTñµÎHİ$ItšĤ&Ë2“$‰­-Ğ7K„ êı҂Ó(èí7ïÙRo|š²Ÿe t ĝ”2 ‚Àët:Òw! ””2Bĝœós0Ĉ"÷=`Œ…œóŬöJ÷ èĝGïı˙ˆžözqµ$|éyĞ'Nuˆ1HôŽˆ &Ż­ûI™%·TÀcÄĉ??†HR¸ĵȽ:†ç˙M“D§ŭŭLPFÓúĠ g ŠûW.H+Eœ™á֍Q:ŒVjû•ĥĴµİŻÄPBDÖÚÔŭ?µÖ&D”XkSkmbŒÉ´Ö‰Ö:ĠZ'™‹Ñh¤Ó4UišZ­ġ2€:(k:xÙĴ9—Zú~\¤mɍŸ YvÊß*U{Y6T”ı˜çy˘Óéˆ ĵ^Żçyž†aù !b)e,„ˆ9ç]ÎyÄ99ç]@<ñĈé;77NŜì:²ÒY[ĠU?Ŝ8ĝa$:‡žP–ZÈ,`Ĵ…Ï9|×  0† dÖbĴm ı@nĥTĵ‰|Êï  Ak(? † húò=–ŒçßÚĦs¤Ú"şçÑMC\0ĝŒA0Üj3Üı™êÉX÷v²ÉŜn6ôG›×ö×îì]zí&­µck턈&Öڑû˙ĜZ;2ĈŒ´ÖcÌhee%ɲl’eY: TšĤj4”9 kŞŜĈ›§ Ġ‚U- ŭdÎA{­7[˘{SQ§Ó‘Ŭn×ët:a†q]Ïóşžçġ8ç=!Ċb…sŜœŻJ)ğÇî}àÔú‰“‡×ŽX[=|4Z;z<Š7Dšq–X‚ĥùI]²ÛĈ"UDg Ìe8œ™ħP&'{EN@ÀŸrÌaE…ÄQŝ֖@‰ċ@G6-’ EfĊ8`ŬŭÉŒ%òû$¤aÁ`‰Á OTŒRfa `‰ ²s8öW‚#gÀ-p‚ħ`à JvnL†7ŻM†7û7í_ÙŜzéÙKÖځµĥo­cö1ƒ(ŠúJİĦRjétFI’ŒƒÁd<ëÑh¤ßDĈ„–ûZÀ:èŬjݍ·àĵ™ß-ˌš²£òïxñ˙0 ĊêêŞÇq°²²Ò pĊ÷ŭ5Ïó6¤”BˆCœóuÏó6N?ĝȝ§zÇé÷Ü·ĥzêÎ^ ÎF–Y€ƒ0"`/#dF£ÀÉ8È À ˆ›=!Fóig€-½wƒ3ĉVHW˘#œÁÚ qÍJtÄYQ͛‚Q‘HħÙ;[Z-ċ€g‰ıŒ@°Œ9V`,!5Cíŝ?aÀnŝĵ7cœÚŒÓZ•ât$n^}}°ŭÚKŭkßŭÖë;/=ûšÖzÇZğëyŜŽ1f;‚Ŭ ö‚ Ĝ £ Òŭŭ}•$I‘-YÔ÷—ŞD‡ĤÓ­.ŸY XosDjéí[Zğ•ß-šƒ€éM÷‰¤”<ŽcŻ×ëù½^/êvğĞAlApÄ÷ŭcœócëÇOœı˙½|ä=÷Ù¸ó\Ïĝì+ÂħĜJDzZ>“,BÌÁ8„{|Ĉ@ÈËmĴÈrĜ|wŜ€á²0Ĵû?`·4—ÂüRMî>TY,ÊKätĤÙÏ pÌ3;6}­ÍKÖ,/({³˙kĈ“ ,!a”YX"(0N½;V;ßħú>í›ôŬĞŻ nĵĝìġ‹_ŭ‹gĈÛ7.úĠóĵkžçmyž·AŸs>Fj<+­5[’-5Qġ{H½ÙUġ{Ĵ·P™ÚĝтÏ[‘ĥyĞÊÙß+{nˆ‚ qËn·w:NÇëQñ}˙„çy§ïzäÑwĵëçéÑ÷?ĵ>°œ µĊeKÈĈ†’Ÿç ĥÈHĈÁ@Œğ’ċY’ëĜPQ^y)  ÊŞF30Êmçî@¨Î’*Ñò5–l¨ô÷dÈÓ#îʍS¨ ÄĴLŝŒahh hĈ ċ%IXL&À“vóüúÚñ{֏˙ï^xzçÂçŝĝÛ{/>ŭm!ÄE)ċ!Ė”r7‚a“ñxĴ}üV™yÀrċˆ& ú^Àê-•og"Ö²ìÚĝá‚á­ê½ŬŞ˘ÂıAUÇħŒ8Œ¸EQ7‚Í Žú޳²rîŻü3§÷Ñ&\S„}!\é-b#)FÉs²g”g> —ùÌÖöı•ÏTQ£z“Ĉ´\ÙêŸÔdFKPŒŞ(G‹ĠÜÁ¨Ds£éPT~XË`DRš1b0Œ!AY@ m-v3Ï\ž~dóßzÇÏŜüö—¸úû˙ü³b<ş „¸äyŜġ0 ·8L&“ñx< Cáyž,}yžç…n€5t³C!DOħ&„X÷<ïÊĉáSäc?ĝaqÏ[ÂÎĜ@2(gĈ1LÙq•ÉêW#ZžeĜZÒ3"ǰĴ6˘ƒ+0´XPĴë?QS ²ò¸lÚ{Ë€=|ÎĦ-ÁpElD!_{ßϟ>ùäûmë/Ż_ú‹Ï<=Ùß½¤µiŒÙ)hnĤiì†nT˘òĊW’$&Ë2[݃@è 5óƒînàĜ-üûħ§ĥd×Ĉ÷BoHŜŞŭÂ[ŝ½ĉûB0Ïó¸Bĝ/¤”Âó<É9—ï{Bˆ@á !Îy$„˜°şÙĦ!Äş‡z߇î½˙İ÷œ8vÏŭk)“LYÂ^f@#›³Ëè†XlġżtëYŬB™1£†,ŠX<àÀÔpƒ¨ùu²×Š%–Ö–ĉNĴbĥJ Mi­ 4cOĵûc§ÎŝôGOö_}~ïÊÓ_½|ùkù˘VÙMc̛iê[k‡Ĉ˜ħ1fl­cRcLfŒI³,SÖZ­”ÒZk[”5ĈË¨èÀ ßïúٛ)ġµ™S H·½y…RX0tżÁGJÉ CÎ9çQqĈwÊĜ…F)—ıLĥ”R ÎyŽNŒù1Ĉ§šqÎc!D×İ&ĴJ)WŜuîäıǞ¸Ô}÷o?{ ˆÔZì` 48$ò+"DŻĥ€š@ !í!şĠL =¨HY@•òŜ2P#4÷Œ7ȄeU⎠)Í´#$¤—ÏKkaƒÊ gP,>óÀúCw?´ŝÈ/ŭW÷÷/ż:ÜzéٛWŸŭÖĊŝ•×/;PÚwJB)ÂİE¤@QĤµÖD¤´ÖĈZĞ]}(­µĥDd'“‰µÖÚ$I,¸Ġ­€P“G5Ş›Ş^ŻùC-€Ó˜Ú ݍ·˜ ½˙Ÿ&àiü™çy‚ BVĥ`(/§PĈvö …BĥdŒùîg…PİïJ}Îy䀨d{bW’ë½ë܉3Äâ/‰êħl=a•7`ĦÒ‚Tó4–”K†ĊŻË dI(W~%(cÑ×θÇï^½ä=Ğ÷~ä“çÌd¤öŻ1şŝÒ³Û[/>}ıùġkĈ˜ËšFNSoä4ö&D”9ÙĴƒµÖ÷mŒQÖZ,6´³Ŝ°ZkÀ€UħŜ 4M ­7–R@-˞nĊ’‡Ÿ5µ´ï6Ȇ–•Ŝn`o{ž7%ĝÏ=ÏcžçÉRv#¤”’1Vĥ]ÎàGş/áÀF–ÀĈs˘¤Ÿ1V•BˆˆsË èžĵ÷cÇïçèáÓw:q˘³²qĜ'O eE„ħ%$‰…vò;‚ŝô².q²YCĤBóğĝt e:*/ÊT·â̞ÇîÑ"XTŸB]-R453šÍĈçë˜ĴÊ.D}fHMhX÷šjze €$@pG†@.ˤEb ûƒÇGïYğÄ=k÷}ĝ“ç$i3Ĝ‘ô·Ž÷ŻĵÑß}Ŭ×^şĤ³´Èœ’Büµ$ ›•DbU ´´‘5Ní\Û<ŒğmŒ1h™,ËĤéV’$…ġF!{ĞÔô[5/<òŭG–5µ€ÔŜş’Á\YżúÏóXÂ÷}†!‚À+BJéI)=Îyಝ2¸”żdɂA:ñœĥ_œ1ĉûîʑğÎ^?qrµ³²ÖÙTßjzßß/f yĉ0‚á †\öDğ)a{ pɄéDçŽu:wżóÎÎy‚Á vĠßφŭlpíò0ì‡7Żíï½qáĤN“aĦVnŒ™Ñ¤ ĥ€rĉ…YaÁQ1—aJ)eŒQY–i”JÓT%Ib³,3išš%u?ԛ)éŭàİ-Ùµ@„˙O€‚ Qy…ƒçy"”Rœó€s !ʖ e 1ĉ(H>€<+"<~߃‡ŜJoĜħŜú‰S½îÊŞß=´tÖÖ}&}Ħ‰QX’6š€­Ô ³ùµĈ)È[eĊ*Ô°˵È.iS]FÒFĠ2•@Pb˜_QhaĤjfÔ¤ÒòçGu´Œı7•yÀ­K†XQ$šùiiÁlÎN`%¤c µÏ: 5R3h -ËgÀÈ WBI€‚ùùĦA1Â81P´É–=Ù ğk+!z§ı‘ÍCœÁç ħ/ÀufĈŭŬ4ÙÛNÓQ_í_ğ2ïŜ¤Ápû [dMR€’³ÔPD”:PRNĠĵ°˜Ún8ëTkXkÓĴI’d€şUóÂĤžÓ˜l H-Ŭz/h)ĝ”A¨ÓéÈ d†2‚ƒBÏó")eÁ`‹q`jĊÀ+˜mĈXx⁇ŽÇk½îĦÍ^´şÚémĝq·ëuÖ7<ÏDĵħX›/Ĵ)Í/ĈŠ€KİçNôr ÈĠŬbŬŽĵèAluÇÖö9jû2ô‰ĤOiµsYÑ "f%8šĦ Ġ?·ùòĦ&ğXVî*>ĝ’£šRċ2"Ë×ĥ…Ò°rè Rev ë½ĵ´ŝ9c,EKnv Y.ŻĤ9ƒAċY”²ĜK 2ÊÏ3M…ĵ `EÏïĊk‡Öcï0°rĉGŽùı%HìqxŒaÒßNŒÒvĵż“İdĴ'ƒ½4ìGğ7Éŝî`ûÂó×Jv#ׯğ>ÖÈ1ÇZë‰Özì(ê7?•9óÂ:•ó*8QCéÉU÷ L­R DK€hYfÄË·Ë Çħçû~†aày^ìû~@]Ç^+hÔ]!ÄŞ˘wĝγǎœğûĜ‘;ÏÚ8y:î;{qWĉ~?y½ÈĊGòEblQjY‚dÌ-dùġ"\sBp'ʋ{¸KͤrŞEİFĠHh2]dĞÑÜmšk?U‰hdš2 yİ/_UÁiù\Uz^KPw¤ʳˆwYÉ pÖG˘™`IİĦ >Ĵ´2,–üògÁêK’4_ÚdµšjÎ66Ncòì(÷)Ìŭ œB92èjcĦ0kì4R›ß‡,I¸s5ö‚p=ˆ­­Ä‘àš°â1f@äsxœƒÒĦlߘôŻ]ġŻħ½wéĠkû—_ğFDbvJk= ˘1fdŒ*ĈZëq–e“ÔĊx‡µ&Xŝé2AÉ@Î̐ñüğħ9‰Â2@ƒħ„áPaw7EĈ¤ÇĝFxbeŭŝS+÷?öswú6Qû—_é_{öŻßĝΞSJmcnj­·0ÜÓZï+úI’ŒVVVĈI’$ñXF#Uʚì-jÀè{ʖÈĜ~‚²˘-ꀨè uğŬ0Š˘0 ^=)ċš”rs~ÈóĵM)ċĉ?r÷ƒïŭàù3ï|âPĉ‡rh7‘OÉkwa 0DżXዃ)MŜlœTlŬU¤nu4Öàˆêòş ¨ @%JvÙ{¨ĤDĥB•žŽ#;W½ ú^[-ĦQY{‘mgUż+e½e”éÚ~“-ŸhÍÇAm6bçİŬîÌRÉіı^ċ=Ĥʇ<—3#”H*ĊÙd§›œiıħı!^ÖĈ€bójìċa`^ücsPá–ÀçE֘ĞG@¸2gSÉ£â9—­äÉäċQKy Z‚e ĈȌ…Î,šqxŜĦġ{ŝŭ‡Nèӏ /|ûĉ•o}á½×žĊsCk½íûŝv{Zë½4MNgív“áp˜TzMMÀÔô ÏÙm†ôvΊn<·ˆ˘(ò:NÇqǕċÖ|ß_Bl::ş~üęG?üÑîzüİÍ`p”°o 7ëÌĉ Ħ``…fL·éÉXí>Œ–ÖUž•Ĵûá˘%< ÔÍĝP·3Ëjh9Wí×T‰ U2CħS%{¨5ÔdOĠLkŝ5ڙ‘ßBÍrœ%=–êß-,Öċ“­ E¤ŽPPb˘ÂŒl‰èàzXùAfÇ;ÙYİœW(i,8ċŭVŞ"csé››ŞÍ–ËĜòfƒĉû ÌÙ`âs)ß3ĈÀŬ›ÂÏKђċ3RTÊêüŒÈĴħ Êç +8´ĥ0Œ;_(BŞ€½7ƒô¸Ü<ŭcgÏ?uŒwŜµóÂ×o\ŭÖ_<;Úşú†µö†Öú†ïû;anGQÔït:ñx<Š˘(™L&ê`:ˆ·ŜRĥÔ:ĈŝDeEĠò_–ġz½(ŽN†=ß÷×}ßߔR–R ;“üìGŜqÏS?uríì=Ğc1"àjb`Á ‘“ $Ÿ'rs>eÚ/p êUÊñšq}™mq0•jú>T›ÑB?‡J}œ:Ĉ•zu,ğ)ÙşŝÍ'5nċ .ğ›eOĥ9óħ3ĥKhÚT*{-öŸê_İĝŒËU˘ĠÏ̲éÌÑ ˜˜cF²‚AÉò•˜ŠM ħR?‰ĉNtިÒĉ§ĉâ JĤ…röCĴ’ħÏ^°-sçŽ-­äĊóE™K€óĵ&Àƒl†Ŝe`sÎÀRşŸ{È–‹ÜòŬŒdPš`À ĴE–ZìĤ)n2†Nԍ˘ğ?xĉwüܳuaë…o^şñ?ûV–&W=ÏğĉûŝVÛaîĈq<Ç£ &dLöM”ñn)[²o5Zĥ`t˳CS@òÔd@–j€Ĵ& ²W;ϤCż2|/*04ġŒê‰ u¤…òmÛ¨5T1˘…#B•§›eO–J½§âgl B„y,é˘9jxA€a\ÎIħéó-³1§şĠMS]Vnç³y‹2O0µjg<'&˜äyİÒf ­ĞÁ` ÀHdÜе L œŭ†û"žżnËm×g8 ´fÈHĈûœaob§W{OŬızèħÜÓá‹W~ġO•v_“R^ó}˙Şïû7ƒ Ĝ °?FA¤“A½\Ѳ2^•FŜ˜-ħ–Ôĥ/Ñ--Í`QÉ(Šd·Û şŬn'Ž•ˆ¤”Ç}ß?ħyǙ{Ŝó˟|ìôğŜ½9àž¸j£Ä‚ˆ0†ŽË|$˜³ ĤİW ›ž µjXÏêšBTK ˘F†›]X`¨vVhPj2’*+Ž14+0PMŻ˘:_dĞYU{kĠ ޳v•–9êTÁİ!c]è"4ú•@‰U˨ĴÔßħóf˙Ì\Ġoz”*UÊ|•™Ĥ:XV&0”ĉ›šÄ]{tÓ<1'_îzD0ÁLö€½ëĜğô ’ík÷ûc K–8— ŒÁë­zÁú1vâ:'@<“sĤìô$b?˙ËĤXXhş’#ӄÔ’ħÁÍÄ BŬŭĦ3w?ÁSékßĵyéËôÍÉÖċ…—³îV†;Q ‚  ‡t2™èÉd˘Ñc,/Ï ä’˙ùF(ħıŝ p@ݧÒV_Ĥ£Ċ+‚* 6wŸ")gAĥ *u%·rv24/áÓÔ{²Ġ5ĴšD‹l<Ô?[Άì\î3- ͗›zIäì.޽‘š™ĞŞ[€¨¤Q—Ëó8p°ċB^S}†Ĥ_ ĥÜBǜJàSÙ—‡lçzF ÷›{$mMŞ\R,?]†9_Ĥjv:%AÀ]2'Ûáu¨+/âÚsߤäĉĠΒ¨ìŠÑjˆòıÛüZ—œó€wVN^ï~ŭèÊħ3ë‡Ïżë9L8ĥ„^<‘r–*‡Ïò÷Êó9"DÊ #`œh¤\Ŭc½S~$}íë]ùüï%íïĵ,ĵäÊy׃ Ĝ p0ĈáPÇc”b2ŜAHÒXÂ+ƒR›!½ŭÀ¨xċ6˘Ht:żÛ톽^ŻÇñj‡}ß?áyŜİÎêÚÙ÷~úWß}ï?|RKŸ_Ñ[™çQ=sBıĵ˙„ĉÊ4µjbŒİ63j  ĜÒâo+ƒ§ĥÜğ)úB5ğ]˘ff]!=T_œevÁòaQ‡î3˜EĊĴDF „ˆ:GVL³Dš'0ÔdTI³–Î\QßÍĉóÙI9Áh^X•-ħê`lĤMhËe:ËĤïcыbĠÒp‘ıWŸœ-t‘Ì^œWĴĦtÌJ­Ĥ9! Nà’ƒI­'È.ż€ŬçżJ;žŬa*}1K&—µÖ;ε6qzvĈII!D G£ċÎÖjzíµÍ½7^z`ó§NŬqß;=Ĵ3Ż< 1ëĠ•— Ê+>¤äığ’Ì"a„Ŭ~ ĉIŜ;ŭÄÑ3żñèÇÇ/|ŝҍŻü§/£ŝ)ċş”òŞïû7‚ è{ž7WĐL2Dúúwpġëšék/İÉè…4MŻ&IrS)Ġw²?™µVGäœs!„ôi.HÊu¸¸ó“™˘jĠKڝ´L=vE• ?ği@5}#[[ZTmi•%ek.jŞ.ä5e´…öKEu!ûŞ–ı$Ş×À[7Z$P…­É ¨*'QÓ³[(żÖıíMKTä†fK@ĈëˆĴŠL%Y![°ĉh×srEÚ:0Ğ¢\1ŞïW–Ħ~ŽZ*ÓÍxÏ9#ı%™ğÇâ>ĴAöúÓ¸üċ?Nħw[Éhĝâx<4oL&“ŭ,ËFišĤZkeŒ1DdcŒsÎ<ϞçùA„QíĈqĵݵÙg>7zòɳïúÙ#^çrFvİ)=şĞĞ”a2ĝ‚ç \X0EZÂÖnŠ@z+ŝò'î|üÔöŝġW'×_{ÚI€u¤”7<ÏÛġzrÁŻd„=m"W;–.’ÄĤe:^I€fݟĤ,iqv‡@nGmËğútJ‹ô"ıAÒRf3@Ġ2ŞšsÍ2<Ío‹}¨ù²_Ê6Ġ3ŝĉ •ĦËÚ!Z÷ü-Ġg/Ó,²l‘N 8Òhp7˙DÍċbY)ʚl\ÊĤ …0§9X-›ÑÔ·‚MKyeZvù3(ЍSY˜Ġŭ Ż;?+sRM`dK%èÙç@İ+ĵâyžt%ĵñx3dô_{zçÊ53\‡—ûŭŝġ½½½›£Ñh˜ċ‚r†ˆÌbûHk cŒVJ™Â ÏZKżŠ/ŝ›gnŜqßS‡şžà$0Ÿğ-TƒĉdÙóçí€É/$Œ,ƒµ .klD’oŜñŝ;6O=úİŬ?˙_ĉ×_ù†Sîc7¤”;Rʑ‚ıž™"Üìû›î)½•ĝÔ§>µô÷ż÷{ż×ĝğ„ç lÁh F"Š"ŻÛíĞĞнN§³EÑñ î}˙ü{>ñé<öİ_;?†àSƒ‰!H–ט%ɸ˘ôÁŠŝuVÙuébQÊ=grI”Yù„Şôfĉú+%0š8teċƒ ÙĦÈ Ĵ­§dWÙy¨–•İNùĉûW¨t|ëD_˙Ñ‘ĦÊ\xδXJ#́r!ŞqsD‘Šë-êĠĊ‹EıZµËÁÒÎ-ŝUr‹-eĞj †à”`Km•ŭĵ-ZÔ ÈV?Ÿ9€fıĦ2¨MK‡F%ĦV7ûÄXžräĞœ•š(°ĜşôގĈûFIrc<ß {£ÑhœĤiĤµ6•›I²ZkfŒÑÖÚ@_Jxž×óĵŭ+7žÙ=ôÈû6­˜“Żu)nêşÍĤ– <žBéħ†î+<31à’cs#ŠŽ>ö·ß×{ġ3GñŸ˙%c,ĉœGBsÍP^ĉ(@ ? Pj3¤qÔSşEEŜúúzÔëġVğŬîfE§<Ï;Û[߸˙˙żŝĉ#oîáġÄ@[ —ıŬ’ ĊÒÜ\V´ñTKĝ´0p:Ŭ36`'bÓïpjÇĥ´ĜZg#@Èiä– 2ƒĊLԖ²kç³ [)ÙŞÜ˔uWíԗqP—R}ĥh|&éŬÓŜ”]\ègä„2àÚùŜOùaŬk·5´¸ÑRgY[7TğPڛÖçgW+½·İbĥ]dFós"Ĵ'f˟­û ˓Tùpìô}ĤZa™P3/ÊJ¸3#HNçħ‡3)ÄtÓ0Úşžìï)ö²,۟L&Éd’dYĤ´ÖM~D ‰DZk3™LÒÉd2Š˘¨†á^˙™?ğâżó›İÒ(;ƒÌVÍë{’$İÁ(1M úİB˘D* _Œ'W' ÉZ$ŽœŝĜŭǝŬd_ŭWŸelsÎJRJı_·ÒWê™xokP’?á`$¤”˘ÓéĝkkkÑêêêjÇG£(:Áıwßó_ú'˙ô½líPp9³ĜÖù*âٜ¨ ]ÏHĴr]Üŭ3,Sv‹+ÛÉÌzCĥjÇJĊf­`q€sXV´r§NK³]ĞuÖĞÙÊ’)v¨T7§Dµ„‰ĤUĵ@5—(çUêôá¨ĤD`—YYPzxİ8GVhêƒ5ġÀ¨XJu´S·µjU?^îm•ŜÈri²ĥϸ|ìlžŞ˘rħ ÒM5ŭ:ğĝž2U —ĠÎÙY XžÒ †İ] çœÏ5êĴ& cHkeÌXk(RTĉÀ¨iÁnÊ$`ŒħJ)“ĤİRJ%ZëQş{u?@f•çqRfÁA¸|Hc if‘(ƒ4³H•q× Á@‰œQë †ÊPi Ŭ &…ôÈùG?ĝO~I|ġÚw^8瞛›bŒ1··7‡Eh*Y˙I%ù“FĞĞĞÁÊÊJ´²²²ÖívAp&‚{îyò=ïùè?üÇï˘ Ï'y‰Î: xžy(úDlĤV³{Ĥj)ŞRúħ†´er3#6MííÀöwqóÊìŜ¸ŽáÍ-¤£Ĵ6°FĴ5VHned xo˘·ŠhŭÖOžĈñ3wzk°žŸ’³. ž/n9pÍcĞ <š+iUÙtT"—bµê‘5=£ùî=Ġ¨o/‚Ô´Q)µÌƒ½­dkÒAƒ[*Ġ,² ‡…ı¨ùF•`+¨XG5ĥ ÙÍè×T*›Ħ‰p1ŻĴ>7Ù[SĤвç(î `TÍÄĉ^gİÜ9í[:ÒGRÒyt¸'0MŒ@I Ì‘!"KyÀ–)T×*gJîDDd­5ž ò,ħ’_2m‘¤‰²H3m–ı[SJpżĉ<ߔJ)à+…(Pİ)ƒ‰ħx˘ÁèPm<ò·>´òüżîúמ x8à/M4”Î?m À§™5xQv`Ċ¸fÓYÎÜÌfÛÎrżFJAvannáê+/aëġ Ŭ¸Ĥ²Ñh’eIBJ ĴÖ ×jß]°ċ‡`.ÄXzëû\Ä7ĵ |>êt¨Ó ƒÇÄĈı{qêŜû VÖaıË88ĴÉMÓĤY™iÁ-ÊùÔÔ×Ëğù†|ĦÁo3Ç:·ĠJ×fTH5ŭ¨Rf°8¨;{˘Kˆ5e­Ş…DuŞŞé‡e‰ji°úÜë$Œì|ùsQ˘ÚÖ² e:”úMDÍĤ‹ĥŜ­p>£/˙ĴԌ\œËmí~nƒdä”Krë €éÜò"Z;‚ÄïĝœsŸs.…‚s^·dñ0 7ŸÄ9çžÂcŒù+qÄF{ij1)L”A’jXKKK›Ċˆ‘…ĦÒùH9 fáKEAj˜üSÓÚàĉ6`T ³óżñԆüŭ(¸üuÉniaŸ„(ÙúJúw- ŭ÷~ï÷–‰.%1H)E·Ûġ{½^ĵşşZ€ÑÙ î}ϧŭ~ò×Î -ĜĞİ…q#‚\™4+Ñ1ĥ°%Ğĉ?ó;÷™ 2ı̈Œ†ŜÛĈèġ xŭéocçâkf²·7QédeÙ •LöµÖ‰Ö:3Ĉd•cUÒ@&á.fÏ5s#uñ•CŸùڑW¤ßĊÚĦèŭïà÷<ñn°ġ# .A"ż°Œ³Çf%rbFPŻ&^•iš![Wŝ£……‘UÈĴf.g&³œ­%O4ÉĠeF vŒmĜĠöŒhg4—a%£²Ò¸­ŝĴĤ„feÔ+™ 5÷òĵ›háŭ] wÔ šQ •g(#Ĉp·äŒz›§1>t:öżĜñöŬ§ż|F:żr×ğ?ÀOż"ê€L.ûoM>tB–Ë[ñú™+?ÍQğ`ħ5ôâP EY)‚šK†eKŠ&²EĠĥ!3Z \bö²0³eë3£yPŞ;NC§4;µ‘ÔÌlĠġïÊ`:ïEs}şĤžÑbĉ0Ÿb̽Ç%s>í@ÉrÀZ+c-¸Ȉ°yêÛşûƒwßúŭëq÷1"RB$IBJ)rçvíš „àB†ĦÇqweee£Ûí Äİ{:Ç=Ż~ċÂĈXXmAŽöMTħIĦĉÌu:FA9ÙÒ¸gÌÑÂ|ÉĦ4!3RÚí`=ìï&†˘Ûét9ġ…óŭÜGß˙È'~ġìžÎ•Ĵq³”ëÑž)…Ŝŝ”ĵÀĉŸé˙‰òÌÂŬ— F$^ÀW˙èhïċ·y–<7ofYÖWJMĴµı8¤}?’RFAt¤”½ŜóÓÇÎ>üèĈ‰ğïíĴoxáʊtF˜È `ÜcKbàŒ°ğ³£öwnŞËÏwĝÚ7vÊwżs-˲a–eƒ4MGN”2uò+£4M÷'“ÉN0oGá5ï›ŭßıôê=Ŭw˙Üê½ïx,^ĵÄDš/ĠÔİKWĵ\Żş2Ŭ|S½ĤwS+Uƒ…ĠħjaQo;Žé£z2Ĉ‚ÛiUĊc—(9ĜF‚C]ϨÙî˘Œêž75€ôô³‹™cŬçKU+^ÌSíËoDıek>;MÈ]‘)ïÏpH0XĈ‘Ĥk‘dŬŸŭ›§û‘Gì;ŸB?‚(I’4MGY– -ğâ‘8çBĉA p5 ažÜ8|ôž_˙'˙ì‘]Ö sq*3°šòͧĤi–S͔ĉ?ż yT5(ä¸ÈΔe9ÉOpÒ"uĥV›iù~ÏŸ‡?t7Ï“•­ŻĤQÖZċÂcl’$ş²öĠħïnû~ÒíZ²{3ĉzܕêü^Ż×évğQ}˙;ßùÄS?ġ[÷Ħ½žšé€hqbr8:g)íŞZyÏ-Bp3Dî´° $7áĠÏ˙9^üÓ?ž`4x> /&I²›eÙ£\)Îó}?ö<ŻÁê“ŭĝÙ'>üчNŸ -—,! ħ—0h$4f-Ĥk‹İŭ \ñz§Öĵ“'ÏĊg?ò+G&÷߸ÂĝğŸùKżú…ד$ÙM’d/MÓA–e‰ğ¸'išÓ4Ŭ“dw%™lÓhïÜ7]ĵóŜŸŝ ×=|$ätŞĴzP}ŭu}›ĊEžPż&WĉlCYm.izJı­ž qœQ Œêúe ÄĊ9#4ôžju -İ/f¤0>`èµj÷1—…ÚšĠo ê@{Ösħ5} …żò< Ü Ĉ 41'IÄ0Ê VBÁN~èŻŬqôÎû:ŝĝ^ñǵ0 ·”R{Zë‘Ö:%"e­µŒ1pÎ%çܗRĈžç­xžwÈóĵcżûŭ~Sôµ,òżüò>v÷SXmaµÑ³ıóDxîÁŜ#˙àĦûïğ~ġìëŝG×^úÌxa<Ŝ˜L&;“ɤŸeÙ$I’4˲q–eCÔ0βŝÚd¸ŭìî͇Žĵ÷#ŬSw÷˘İşl^jaħD FƒT3\вCİgRÛ¨Ÿ·o4Ġ­ËŒìâó¤% u`Ôäk+=­R…­4곛jύŽÙä@KĠ̨ĝ¨VDĥfV ħél}êt Ë/H™œòÍ È•ñµÎG 8ö Ĉ`k'ßµùĝßà=ŭg?÷˟˙O/¤£áMcÌÀZ;ħÖfEÓß šFBˆŽbġžÇž<÷î˙ÂÉŜİ{Wžğ:ÂӗwÑïg0İi‚ħŽ”`h&ĥ,żE­Ĉú“³ìxKc P§à ’3x’#U6ŻrĈ9H0Î0:+aċO½#ŭ_ĥkÇÖډÖZeYfĴµv0Ĝš,İQšv̒nÇ é VŬ(Aàu:żÓét8Ŝ,Juï˙û˙èŭŜêš˙Bb§kgsœÍ\2Ág1/9{Úò.‘ÍŒħô]|÷˙- ^yáUŒ†ÏöG£I’ì)RĈó}?Ž˘h-Š˘#üôŻ?O˙ĈÉTúbÏ.RSĜB;ĠçÂĞÈĉTž™â6t‚ĈÎj*ĈVöTŝ†Ĵ:ûÄo9ò‘Oœ|é_˙ó W?˙Ùç<Ïğ>·Çñ@)•(’,Ë&JİħRj²ž|iĜOĈ︁_<|öüŬàao+òA ‹ġ\CŸĵêĠħë2™ĤĦWš—a€m ZzY^g/²x|Ş–ùıŸ"ÄÂħ*ïE ĠRâ ’Ó’žQ5[ĦĠn˘Ċ>Z‘…KŬ QŸWC¨² eĴËrŬ?4²Ô@™\˘Kr†°a½ëgú+'îݏWÛŻĥ_q¸séÂ.}íg÷7OŬ‡q'\;rĴwüÌÙîçèĦ³ĵşàsßŬÁ•›Xe`3‚Q¤, ċ`dK`T%BµŸ4R²FÍğóŽ9SvΤ`È´{Œn`aF+$#?>ĵúĦ÷ßkŝp×Z;2ĈLœR…βÌĤiŞ*ċ9ĥ¤t‡Û-Kş-İ&;~eNÈëäħ†á1ß÷ï|ì“żö#cŭrf‘h·;ÂĴ ĉħ›‹’?ĥ$ġS6ŒÏċ|†/</˙î˙bÒ‹Żż¤†ŭçF£Ñµ$Iö1çÜ °Çñĉħ3wžùôŭxxŭîû;7ᵑ†26§^›Òâ0}üœíF³%pn)tÇĴ)hÛ9X§p]çÙT§³"ü˙Ŭ=k>yäÂ˙÷˙ġ-ïĉ7„×G£ÑÎ$~‰ ‘ö^úVŞ`{Ñŝâ‰óçï z³³}ƒËtTk·Aġ¤ ”aÔÔòç2³[œ3š+T–ƒQġQ£ÈÔgF 6TcĜ@í.żÎ*í ÊèXÒ3šûœ¨ĦgTg¨HuT÷‚À2›Ï³5ŞeJĵLLjĦR 2žÏ!ƒ´…vĴ‘Ĥ; Ïw<~tċÄꏜ[½ó§ĵ“ħÏá˜͖dİö†)ŝâ†ĈĊí- Ĉ VìXÁ˜œQg3 £í´w”÷Žg Dójóo+­ö4­|EµĜàŠRénv<ĉ$ÀTŞ!=Žá꣛ײË?}Ä~c`­*&YĈc]éŽ×”èêJw·U–tğeHìJuÓÛïËN§SÌ ñ<ïŽ<ôĜ#żüİğĈ–pSÑ´–Mv~³úiíË*ğËmd-/=ƒŻüÛiÔןÍŭçG£ÑµñxĵoŒÑRJ?Š˘µN§sô§~铏üì_˙í³Ê ĝó#ƒ=“ûâPµOSÊÂĤ"ĦóBÑ3ÛñRsĠ‚` @vÖÖ“E·áġ•Ŭ³’]ğꙋŭ(ІY–%I’dI’˜’Èl™ŜTşğ­²¤Û™Ô°4C’RŠ(Šĵ(Šâ8Ž×}ß?ĊñÙ÷üí”I~!Ñ3Şf Œr‹06÷IZZÔd›ŞÙÔĊà•ċßŭ×d/½ŝb6è??݌Ç=­µr4ÔĠn·{üżġwŸ|ׯüĠ×2…‚2ù>UŻĥ³‰ĤYınQÍeŠ4wò·ä ˘â‰O0$†ZÂjoCù[˙û¨ğĉ³?ŭƒo¸ĊȌF£ašĤ“b €í½ôbA$^ġ“wžÜg³E–È TâF´Ċ2­c4 †q ŠŬĠ^JQŒÊ‹SrvXğ0ğ3ĥXĴPĠĤk²‹°•ÔbY†²î5™Q½Rı­Äùç’gĜLĈ^÷° Ä\ZÎóÙ ĉqÍKSœ3dcÑ0x”Á˜Ji×ÔT aaS‚€F+d‚CpĈ˜àıï’`€ÉœY!i Êż8´+Ï‚fF_dó÷`ʖ£Š§W1 ïˆ Ö0žKoċ6ç˙„ÒìÍ!r–Ûµ[Có>RS–h0Fg_ˆ~úÉGĠżğè³Çñ MÓIšĤi–eĤ˜-ĵ…Ò]Kjĝ•ëš²£:€âaz½^/êt:ĞAó}˙ôCżüéŸê?żžĉ:T(vġlÖ?˜ÎŬ˘Š£/ƒ1—]1 ız _˙˙ž²7^ı@ÁsáÊp8ÜVJeïQ­uğŬ?÷·˙·O>üñOœxubZ:^(Шĝ5ġhŞšaDäH4­—ËyùĊ”o¤ĴÉÀnjó}â·Ï§Lr|öß["ÒÖZ3ûI’Œ­Í§4cĴ÷ŬŻH½qÔżF‡O;Îe>cdëZèŭ,*½Šu†&P@µğ’‘4–Ÿjv˙ Ĉ€ĠßÏ ĈÚZƒê+@İJ`¨e!ÎħéhžzĉòeġxĥĈ_ƒĉúR´tNivBĉr%Œ §Á0QĝIBF˜ÉIĈF™Ċ¸Ÿ"èı4rŞ[XeĠĤ´‰àd9,g "pfÁ8CqgòlÍIۗíċóžëLĉ‡Ĵ£yYP‘™0bl~.M0À|™rAáĤb7ì>Lŝœgs;ĈXžíU•,Ïw¤ZƒC–*dá]ËÉŭ?u\g;‚½N§3r™’‡ĥFMšvÓ½ġíPĥğI zuRJŜétĵ(Š:aûlċÈħğï˙Ĝ/I,a_;IŝŠÒġôàÎshĈžCİ&^”èhêM¤}<ŭÙÏ`˙ıgĥüÑف£,ËĈB? nLJŸĝċO=öÇċÄİÁЉ™.ä³ÚġÌ.˘lĤ6ï›4ß[*—muĦŻîrŬ˘Ä˜tEΤ„£`ƒ˙ĉYµ·“tżög™Ö:ĠZ§£Ñh”$Éñ<äê˙“ß?qî=“n§öV!8ÏAm• X“TÇÖkÁ•7MĥċžÑ²ĴŒjùšË‡ ê5=£E½:ÔSÄëúffQ¨NPĠVߤşŜP€TЧ[ɀj´éŞ7ʽK0€É|‘ĉ’ƒ‰|CÔx2˜Ñ>(Í A€ÔDHµ, ĉĵ‡r2…İ -”KM^CY–ƒ’à°Ö€3·y†’— ħ’Ŭ;Íς`@”³ê 6]!ùSĴÓÒ]QÜħázùyĉ‹Üb^06Äól Zƒ‡5 0Ö Ñ30CSµöİĞ!“äˆ 2„@š(ĽŭGî<Ş_;ﳆáNEN§“&I˘J³o›,IŜF „²#^Ύ˘( ˘(Zñ<ïˆçy'ŭĠß|2#ñâHċ'ž3Şî^‹àtĜ­u)vĈӁĜ|òM[‹ëOo|ñ/Ĉë“áÓû£Ñ•Ñht3I’!çœAĊq|èÌ#ŜŭÄoŝö72‹ ‰™b÷ĥ(W²ğŞÊ ĜúŝÖ˘PmiêT¨-pĥ²Ż}ìŻß]°ŬQjäwéd2I&“ɈsΜ‚D°òŸ˙Ï^<ôßyŜ÷…Ŭ|@wYϳEż~Ψ†×¤ÂM‹šĠfòâß‚ĵ0g„ĉ²áA†şÌ¨VÄԖŸ;5€ĵŸQ-a‚šÊ—˜×÷[b·”ÀàÊSEˆKHžn!Ŭ½ŠÉċçħ÷Â71ıĝ şL§ „nàgƒ$£qĤ||Ħ:‡=ïÔCN<Ŝ= Ĉ=Ĝ̂‰ĵ¤çX7ޤŒ3NBN2àN#Ž3€³ÂSۗùŒtĥa(÷‡Š,ȸ )€ŞcùÚÎü\i˜…˜/À‡UûH·Ŝ€Ùyf˙*hĵ2˜ß…Œ× ×NÁ;t'x° Îr…^LÈ*;+ó–ÓÂ|’óô$‰uNÉ7Ô}ïşK}ġ ÏónFQ´EÑ( CUʒ8Vŝ-ĉ’~ĴİFDġ  ‰ÁI…aûżĉûŝ‘£wß{ߙ§ŜwĝzfĦh(EyĞĝ˜›oX[äÂŞÄ*ÓñĴĜá2ŒŻŻ˙ÉÛµlòÂx<<nŽÇ1FA‰˘hµğ²rüŭ˙àŸ<” ÁžhÀ•ÈşŞúÙԟ7D lÔ,€5e³˘÷U¸z2@Ì00" ­ĊÙ£‡Ċ‹ĝ•wv~÷ĵİ”dY6rŞj2™ ‹IxoëZ§óÏıòÑß8sÌ À™ÌwĠĉ~§²hW·#GvĜÂçc+wĴğU.ˆjÀ¨Ñ\oĈ@¨‘ĤaQ,0l­`çrs½êgż´|Y£Ú]ß3˘y˘ ÂeF y‰LÉÖkèżĝìÏì†îìĈ;+‡ŭëdċ8˲„HÛ#]ĈBÉ9ëŻ n|ñĠK_[Ÿ}¨Ÿ| ,:ĉ‰ĵÇcJëgIÏ"·@ÏÉ6ï ıkħ°>/È ›/”[1FEfT”îĤvÌ=Áó”ä naĥ_@öڗ .?ŽîO6ğÑ8Ž‚4 äXJĦÀF|”\í¨+ÏzûŻ!žx‡bĥù€> oÂZĤ ˜ÍŬ§Ù&gÓ,ħ|ÁäÑĈß)â•×;ïÌĈžQŭ\Ġ qVIĥ QûÜçÉŭçŝ£/ŝz Ë_E'|y°żw=MÓ]g 1q3kSkgŠ'”ïû0 W‚ Ŭş?LŻnoá×AÇĊĈ9ĈĵĠœÇK\<7F Ëò u½–3Ú 0b5Fšnòò_!‘4í•O†Â$y ¨ëßAúôb3yc÷ü]‡_!£ŻfÉd{”e­ġX)•‘rŻ•9ġ¤”ĦïûŬžï_9g›û/Ŭ}ÙNŽcġ^‰”šÎ3.8˜Q¨;›}ùkbÚ`Ok–G…H×<Ïë¸5N:ËsVÓKjƒ~Ààs+„Î9çïBˆŽ”ru큇ïJ-ħ]ò<İQ†&w!Z× ċXˆ-³íĴµxĉ‹ŸG¸ws'K“² Oê²£0 •{>öK÷Ĝ¨#/N È”-IחĥŻ‹ ûzÏĦj_‚–.ʳòĊüJ¸èG䨺‚#€wú|>>œ<}-‚0™$I˘”RI’Œ&“É~†7Wûz¸ġĈÚżĞ+<9œf˜uLµ7+TβhÑâkOê¨Ôµ€Is¸WÀ¨‰˜ħÜÏ%ĈïĵOĈ"ËoyϨœÍ£AÁVk5òBÓ.9‡+-+\ûò!ŭÚ$mĈϙ4ı0.Ç›“Éd?I’‰R*uB§Sĉ—ÓhäùşéŽĜ³§µÛ+‰?üĤ~EvNaĊÌ A™ÍËd†Ĥ˘ĠœJ?–,Ĥc·u]T3ÊÄ;OíĞı0ΏC]ŝÒgŝWœ WŽŸ:üìd2ı2™Lĥ’$ÙK’dìÀW[kÓcĵ@$Ï }ߣ(Z pğéŝ½Ù7Ͻ:î1RB ¤€M3Π ĠÊ;ÁDŒ1¤™ċ>Û·Ŭ;{bôœ˘û~àĉyéÓl*ßŬ6Ê ·S†TÇ Yĝ|ߗRÊ@qÎ;ĞwŬ},o\ÎJòdiÂĠ^)=tž„9Rc7oàڋÏÚ:½0H’˘´5ħÖÏó„ïû‘çy+Ǟ|ïÑĦ&LLÁrƒyDġÖà• ĴŜ––P]ŻtVù C9{H°~â4n>}şûêó='üê !XšĤ*MÓt2™ 8ŜKÓôfçëz}çô}ŬMkÀŸÛñ7 aÎe*ÓÛĥaѝïU{&–ç„F ZfUĵÁI–šĉ^£­gÓUÁÓ˘GĠDĝ¨–——éhĴİ&ğŞĜ}(‰A˙™/#û֟˜Çw^6iòÊ`0x}0\‡ğ“ÉdœeYĤ”Òċì¨èU0Ĉ ”žçÉ FY–\iOwpŬÑ9ĉ½agÒód.§S~2Ĵĉ}g³ÛĴz­”ƒŬ†bJŞ€ÑôäJvœĈW‘ôYœï&—ÇÑ3áġápxe4íŽÇašĤ‰ÖZċxd§~LŽì#\ğ ˆ˘¨ßétúZëq—(;'b^ï~ÀèÀ'”eĥ2°Yĉ×(Ç´t7/lìfèP…hf`Îİv—]ËÖ1Ċ,9;ġìĠ/␽ıw´ëż0^ï÷ûûŭŝáp8LÓ4qÀkˆŞ’ÂSMH)“4M'Y–%Zk€zŒÉÑ7V/úù;aS&<Ïħû §œĉ^;äœSËÁ9x°‚Aß_eŒuœ€l „K  ôLl¸Ŭ2¤żŠì™1I)`c#˜*š/żĠ4C- Oċf3k ƒ+/żˆŽNv”RûY– Ó4h­u”Ò÷ÙIGižġ€83³ĈM3£œà@ ×òùlçĝdçKôĊw†üB'C`‡lÁîNwoĈo$“áĠÑht}0Ü û“É$ÑZ„zù\ф)¨pk`]-êí>ß;|â§7vÔĦU CyéN‚1şĉˆÄ8 -×`Ñ*Í}˜1şÊ[\o›^żúG”ÈC2Ĉ<ÎıÏ ċú!_ÔOĈĉĊP1›×¨~Y·³4îtÖh·ĜÁúWŜ 8\vĉwcTjŒ1B¸çáĊgέĤNÂg:§b1n´˜g•UµéĉKÊTSÚ+?יÄÑ|ïËÎݏŸ­Ò,?&ç "î ğέV !眈¨È’’,ËFJİ}ûÂ7·<äĈ„ÖqmÍë ê'l‰š‹i­LWĥê$¨äVJ%0£JFS~.ċ÷ğüžYÌú{„ŞB7ÍéVSÖ³3ŽÜM·hñxsÏÇ.~–hĦw‰’GÏôùZÔ>FùU0*î7klŬĈµF,ŻhÊ)Ù0;×°áÙĠj'˲~’$ƒ‚qiŒÑD¤]>cŬWm"2Zk•Ĥi2™L†išî+öüËßĵzz•›âM CċلİÓĴD°ÖN‡Y‹ÁVc ĈÎğ·ĉċ:[ğ)"³ŞÍyífç5ĴËt H_ϲl{<ïŽÇÁd2™(2§VRĵĈÛD¤Ŭ†-Ç#GtÚɲl{}ïğë›ë`Œ = ÁrË Îù"•?3ÎÀI 2ĈB·ĥùnó-–ôŽêÚĴ-Ùŭ`úGuo4œ ÎıÇ ĵµù‘ІÒÂüËÌ߈Ġġ’YN÷ŜŬÚB0ŽL–Ĵ›T)XÎ9„‚1&Eo5Ô&×Î/ôï¨ÙğĤ7P-ñ4ıŸu˘ vĦUwÌòëÌ Òrêİ!C™ż§œsΊŬ 1ĈvJİQöâwwIŬ“ZÎÉy,–ğއĠF}ĊoÇÖg1‹%ı&‡Ùyċ„Ú2Xµ hë=„f‰H MŬÎSË3Ĝj÷ĴÙd;^G%ŻöŒÊËٗµ„ÑHa4Èrğ’iŭŽMż‘²à`Ñ ĵÄNìDk=qêÊä[zSÚğÑbÇnaÓ""׃ɴ։1fb{éĊN7N†YNlvñü8 3š.â ʵ~FSQV ;`3–­GÔe˙‰ÖZZŽK^gùġrÊ}È)MS–ĤéD)5ÔZpğ×N<êéïsF™çᤄlé³/—‹İ_"‚&O*’JžBâ`ÛŞtğKUÁ(_5ócž·ÑUAk &ĥüf´•ê.ĵ(·mŬĜB`Mê\+ ÊĞ""bN 1Ĉ„bş7·PĤĞĠ·¤Ú9£şÖ…­xÒ Ñ΁ÉĈ˜çT´ĵĠÇŬKË_Ž1ÚcÜk• ùŜVĈ×O†ĈšiŻĞ(w}9m64k¨Yğ €P†ÁCݍ$µó=£\PížÏàn…ÚM5eJ*xÉòEm µâ'Tg7x5‹v–hŒF I˘+´y[}bù€3Ìï€KÊ™@DgjŠ ËUîJ[Ž—ßîyĈnt<\i5sŸëĵ€nQíûUFvĤF R`'´Mlf­ÍĴµÊ•éʙTžt?DcŒĥÖj·6dÖèlŬÏtùžU–çYRáZezĉı—‘˜@ ı"s#BYĴwĈĥ¤ŻŜJŭ3ıĦZcŒ Ĉ˜ôWעÄÁÜNvQzŝ6a~,cş™â@Ñ{ÜßŜ‚§Òħµ61ĈdîИ˘°Œ1@J+›MT6Sñk„׊-S•uŬ˙İŞî@ġ6Ŭ@³žÜÍe@pX•A]ğ‘uô×Ì“i­şyuÂ×O†*Wŭ›ŻE÷Ò4gTñS˘úLƒ¨ùŭ›g–5(64hÓ-|,îĉ ĊÎ60+d•yUjΌêKÀh™Óëd˘1ì§PÊÖ·‚˜”ËġX peÁ;‡Ħx,‹Ŭ¸‚ !À³%"ƒ]²HW-àĜh\Q\Ğ^weÍóĈı„ċlŽħtöê-Ñì™ċj n)XMüݸ2cŒ8çäú˙ö³A^ŜЏżŸV{!ëĝLpKıc.gSbÑA[0Pnm &(’ħǘ0Ĥġ°!cj{H?`0*gHÌħ]$cLÊŜJ¤lİwR9gŝAEOìSlPhĤ €1ŽÉpÏèĦ1&³ÖŞ˘‰év|DD†ˆt6ž¨¤$UB…üIıgD3+‹òí´‡@ġ_SBó=–j?Ħşë¤j‹l>Ĵ;•h!˜Ñ>˜J3÷z,Í… P2n˜Qbwo(³ŠG*½ğ'+kñMߋ2h”ÜigžK³žŽ³ç˜ï ‹ï÷|ùÎĥ,ÈıFTħú(ËQŬcş>Ò|ψj”Ü{ˆsW£ıçP#”j‰0*\ż>ÂîöäÀhö3²ı) Ñ;A|4Bt=Ïë¸y4ß÷}QÊ–Ğ­×ĈÛRJĉû ‚Àó#Bvó:ÖÒ¤ŸKĜÌ£J!Šá@7“Ħ1+Á’Ï£esFċEŝ ÌhĦ×Ó ’]İÜ5.RċıŸĤ9£òĦ–Úmë?ĞâİîùZÚ#B5\̌„R‹ŝx¨ò²mʸl}I°¸-À8¤’OtÌĝċcA–]˘h½Óé ŠY"­µ53Îrco<$ÛétÂ8ŽW˘(Zó}ô“?wÌ2ĈöÇHéÙ`ì Œ*)5Y  ġö&w­PŻŻA °†áRJ0%‰žş²Ğĵ^xžÇ£(ò£(Šƒ èyž·rĉħ“’³Lċ½\p焪'{Q]tŸ§ħäğD‚3Ĉĝ-޽¤~½$V:Ĥşv\z|ĥ[ĥ3îjƒ{ħ”__rayY†ÀóGĈ£"­‡›µÈ´ÖÉĝçĥ˜ĥgëv@1ĠêÓhZàêfolUp³İL‡z½·y-ıüµċ€ġ‘ínQĴ&×yiRılÈÌá¸kĝ‘d¤wÀ^ꓣIaIψ–ĵî&7Óù…ğyá²E6PëSÔ¤Ú]ôjϨİÄVciŜH.İY,”Ş•Áp¤rÚĥEÍż 0b˜ÚUdŠnœfo$ĵìä÷Ċq<°ÖŽ(!M&“I–e¤µÖı–ı’cœŠ0 ŭ8Ž^Ż·ÖëġÇq||ę;ïz⛟½0ÎŻ)Ĉ É6ȍ|?Á¨&Ê/GA‡ßNÌĞwêċqï)FÖڌ1fcÖ½L‹F]}@Q˜ƒú½^Ż×ív×£(Ú £èèıÇßèĊ­ŒñœÜg­S,/Êz ƒfÜݏ ‰ĵŞÎ¸ëU³‚h„ċ,ğÚM,ÒíÔ0÷{WOÍÛèDž/ {í‘uY_ĤĜ³ù„hös–wQx”'gg•kÉ£•R‰Özœ½òÜĠhĜWûAä…Â- xÖÚj×ÎUì¨í"¨Ò²‹uLµù…ÈrgħÌö. °3ħYşŻ”gY–j­µsSATôËcÄà;7L&XîV[çlZC²P ÊÒâëYìó/f^ ŠXœ3š³XâôJMÙ^óì=£ZE½ı^q?­-ƒ“qeŽċ­‚òó›xnM Ÿœx²·M6^ŝL@sΙïûr<÷“$I²,K”RÚeËTîI)“ÑêÄqĵÖívĊq|G§Ûğó§~óž{m ñŬ7ú5Ĥ0!)8)t{+¸vâ'îÊŝĊ™Žµc"ÊcĈó<>Gn8–jT)xaÍâûEQÔívW{½Ŝán·{" SO~üŻßÇŭġà•+×Á3Lp@ÙݍšÎ}cÀ 0mı$'˘)(aùhÌm“Ŭ€T'…RÓi“Ï1M…÷É"%·jÌW]XİvG.3²äù^!RÔÓ]£_)RgÛ°—L_?ÄĦ@TúXTŸ-SĴ—˘FÖ]ci°ò˘Üùn¨¤qíğßBw2ÜÖZï)ĈJİĕ"més)šĥıÒzԑ…]ÇÔ^£‘ĥ=³X 6Ô1MĜˆ¨™uZf; Ú=ÇÖ£z§×ıĊ~^-£‘">GíĤš×ŜÄĤR¨ÌĉVàcUóü0šfWıIYB–X=uïG³˜?Úyú¸”Ò÷}?Ž˘h;MÓA–e­uĉf“àÎ .„žç…AÄAĴ†a¸Áİ•ġ³ċï˙Ów\•Ç:Ÿûú²ÄÂf:w2ĤÊ ŝ#80âÎi–1 Á8l˘Żú÷˙ġמûcŒ„Â÷ŭ0޽$IFišĤ´È08ç\J)<Ï ‚ ˆ˘(êEQt(ŽaŜġĜ>öÈÙw~póϟÙEœĴÎ͝\ınĥÈQ-U‚ı6i•ż7lJ£?¨LW£{=;ùcF·R›ŝßZ W>ËOë\Œħ™}D ›­lÎWĝżÀVî3kó°ğ ò|Ÿ16ÏáœcµÖ…ŠÁP)µŻŝü_Ô?ġnҚAJpK³6BU´VĊ{~ħ·0KTŬí/Ş9”Ynl:Á„ìĈô_zΞדgGYĥç†SçP9="c 3Ĥ=^KÉŒÉUš·9àĜ*ušj€µjÛ 0Z£ÚvCjwYèĴš•Ô(0ĜšµĴŽÚ]^Üm͟.›3ŞÌ%~FJ  i˘-$g0˘ĵÁž+pçßûû)H[ìŸ˙èÉ3'îŠG_ĝWĞŜŝöZ[Zë]Ô è3–iÁ9÷”)eÏóĵ ÏóŽôÉûžüċżqDž¤|ĉÛ[¸~s¨ĵwd¨–núŭ£Â^ƒ!W猃Y c,L˘àşĞżï=.żú/"!Gï÷Ò4½İ”ê+ĈZëÔġOİ$êI)#ß÷{ïŻApÄ÷ŭSïû…_{äüğáĝ—_鳗Œ]9˘0ê[˘ĊŠóʂ XÉIƒ`+ ÓDùíâvî!Ġ•jA¤23XwV°uÎŞÓuÉ LOĊŬ™Qhgq–+Ú< w;BÏMKs!SJÁcÒ4M“$&I²ĵòÜküÂsNÜÑëtV\=qV4È-T}jÁ¨NPs4P7gSrŬ´ pmq[_FwïĈĥÉ&WÓ4ŬK’dXè–Uêċ(èğœó ³ħ酜ċ;:fa4hw PuèġÊtĠʙ¨*5dFX ĤĤ̨zŜÔѲ1?ôZ²¨ÏݞÀe£a†41™ï÷ ŒWŠÁ;Òıâô`¤ Ż|ŭüúùżúϞŠ/}ċìµŻŭ—×&;7cö­µckmGLtj)!ÏĊ@Wïzä]g~߇û§Zŭâk}|á-ìöÓ<“VցÑ[(ÓĦ¤MwĞ`4]ıs fsf È2‹ŝ^‚ppçÔÇŝé;ùĞŸ=qùëôŬ0 o(ö´ÖkíÄZĞ‘+30ÎıtÚr!ÄŞçy‡Nğ˙ÜÏŭĠżuVE':ùÜ.žy}6́SEó⪿–çöċ‚OûÏĊ9=´€~lKx·ë`lmcà˜nùR sté%Zplvŭ2VZ¨KYqÁÄÛ8|7şkÁy ô”ÂġŻÈC΢aœ$É^†7âß˙ŸžñÛ˙Ç÷œ‘c?žQ“Q³+0ZVĤCéDš˜ÙŭÙt>0œġ3|ñi\ŭÊçìYĤ9N’ë“ÉdÏÉĊde-/ǜRJáŜƒ >v:´E6Šyúr\Ùtt{`k7Ĉ•ŜË-úUt|ġJĠ9£&ñWTċĉÔ`Ŝŭ [XkŬİÔ`8̐fùàì÷ŒÊÇfzn@YLF Ż)‹í>wž|÷ħëgŽvFG“ĞŻ ×^fŭ1ˆò)MÎÄĦ“wğëžîĦSg;İ·<ğ•àë_ş†7nL Ç*1ıQŜ”Y7Ï.ş%0šğ†iváRMJ]%Ż8Ş5Vцhd‹­]†Lyâ̝9ùîw}ôÈÂ×v<˙•+;_şfŒȊ>R½ġÍCçzüÄïŝáàŬ— ñġï^ÇÖöVXmmsÛöé :oĞ2íaOçÂĜĴl£Sž—Í‹JlüñMW™Ú éĜcb³ ‰ÎİA?›s ›g/•ÀI'›—ĤŸ7Îbà l=Šë+ëĦ”2r˜RJÉc "RJé$I’ñxÜ‚`Ë{íĊ—ĝ˙Ë×ûéSG{àBNe\˜+™ÙJ*ÑèKÍêÔ8ôşFĊġˊyɑܸˆ7ŝì?áÈhïe“M^M’äĉd2é'I’j­Mı‘+„`žç 7c !âħàRff ĞĜc£ŽMGġĉw ĥ·,pzK=#4Ş‘7ûĠ÷Äĉ ĥıI_'6‹ùÌH+a?Cšš ÀŝÁ¨L¸4Ĝ3–°›{=ee6VYÀݰšŜh4:4îÖ ˘sgRi³`„ „]m°?LñŬWû.7Vy¨{&Zñeî5ö*ìö/a˜š\ŽÈĴÒ a]ÌZ cfµÖÔRŬXZ£Ò dĈ˜™‘.ô$Ŭ|ÔÛ&nGû 4íĴµT2ÏÒjëÚ0oŽtjlñz-—\•„1/!WsĥÄ=u§ 'Nxáß÷£ !ĸÈ$´Ö:I’d4í{žç !‚ŜüŸ˙âÚä8ûÄS1uœƒħ\7Ž9 1[Ù³9ßšs d˜W'X,)9 w›‹üħ8ËëċLä Mróvìŝċgw„âÏŭáë£ÑèĈp8܏ǔ.eGĴ˜µóèH){G{ê¸ÑIĉ ĠjÓ-XBÔôÍêç´*™Quŭ3£j†E·èôZG¸¨ËŒêÀŻL¨8-F…d˘ëGFesĈ윴 `s‹ë9†&Ï{$p”š™üĥ“Ïb…"ü­€+_{lvZ£FLä׉Ğ“1E½ĠÎ;+÷gnÁ`Ŭcpma9rġeĤ•@dL"f¸ĉ‰|vJä˧Á霸@ĈN ­µÎ-')`d§ÖêU—DL߂eEz‚ë&ÒN†l!­˙&×ʐ~Ha­%ǀÑfwdÓÔZáqËĉó×/ı`i`ü‰²™-7Q›9rön\>sŝ¨ùµ5ß÷ğA„ïK§f ­µIÓ4qú_…ı\ûìïòWµ~ßħw>‡›ÇÀ…çĵ–h.¨U`¨+a-d}l~qblZš#K`2U\ä÷Ívcç/˙ğŝŸúwDòO‡ƒÁ…ápxu8nF£QšĤekêüo9G†~†‘ïû=Ïó֏<òĠ‘S6/²âİÒU…Ĥ^Rèâh­eFĠ…}ĦÜWe÷ÙJż¨u zmȌj‰ ΰц£ “ĦF“íĝŒjr‹Ÿ)NJ v’g\r²‹ï-Ù@P ›n ċC<ßħÉĵŻ›÷ĥff¤má2Ì÷óMhffşRù?ĈΑ òs•9•·€ċfû”LĤÁcd*_´# ëĈ>˜+ŻÁÍ*‚,,ÈgQ”éĴûŽİ¤˜%B“"à&AèÄž2k uzğ­ßòmFÖ) (kmĈĈ}%Ö6£sO#j²„FMfT…i™ À‘nWxךüö—6ƒÉd5 8Š˘ÀħÑĴ˒0™LG gĊÜîêçŝW{q˙ĉûWywçÈÙó`A ˜|GE·ğTmĦÑ>7´Ëĉ§ìKŻ‘ğ#œ ˘hR`ʳ¸úÙ?„zú+ûgVâσW†áĊÁ`°5išĤ•ìBEQ†a×÷ŭġ£?~WwHÌͰóuqKË ì¨:7ÓAŭ"y P*ĉ•šlÂA%ĥzj÷\Û˘ÁÍ4/S:‰ŸħÊKZ?ĉ`„şküšĤ 0›VšìT“ñFEÙ.(Ĝ›žD.mĊ¸Ë (,Ğ4˜qÙRj€ÀiX™œHÀŞŸ›T·.™â–ÁZĈó9D‚ÍĠK´†„Á˜Ë8™Ye­èĜ˘*`ç½İÈN= ݧB‹rnô¤\†7 0cĝ2"ÊĴµ…jŠ}ğÒÛ.Cʕ{Œq€”Şŝ^ĉŻnĤÜh\SœJHT)ĉò"îÂ.Ê`È aġ{ÄàŜGï ŸğEÑÍ(Šö'“ÉÄyi—Y¨ñxÌXiz–ˆÌĈW˙tÒżôÚğ_yäİçŠaċ0˜'À{^Òôr~dQKȘzM ½J'8ËKw‘ †lç&ßŝ^ûÌż·‡&ûŻë_ôû݇+ƒÁàFᒙeYŒˆ1Ĉ”ÌeG 6|ß?|öC; °§hj V”gjhĦF•Ŭw=û°İgTJ­]Ĝí­ġžšÊtÔèt›Û4•İĤW4)ŒGySżN›îÇŒĉv Ĵt8;ġ,Z#T†ƒĞL:0‚#—Ċ3Î@’ƒI€Òm¨í×`ĥ_†ÙğJG3†  Ŝ9 yänŜpż kX–ƒ“¤\c‹qÀĝ‘ˆ[XËóğÏÀ‚YÊAÉäYç9¸€ċrblŽċG%· ÇĤµä2¤Œ0˒Š>PQúvÀ}„0™µ6u€d\_·Í~L˘vg`ŒĦ’ušŜ¸šÉ;Î\ċi*)%°ı"ìĴ~ÍJġ§û‘}çË£sĞß´‚½Ôï÷/ŽF£káp{0ô 0Ş›; ‚Àët:qÇĞa:|×ŬwïìĞ™ŠµuîžUjêá3£şù*Z–zFµlı[$0˜7Ù3*'‰3Ċ34_*Á¨ìÏÄjĊ³È*•2]‘1)À8 &,Ìö È^ú<ô•gh“ñj7ŻwxÊӖH0žòDmwö_ŭnĵ§üî¤{gàxlġ0ò€Ì#ŬrĠ†Ò€ò2qĉÔñŜ£uŻ›•½.óĞ*}Ì)òğê…ħ3Çĉ"cBP;“^^îLûˆN‰¨:ÖNĜöVÖFjé@´ä &H…%‚ÒZO²Ë—Ŝ£tŒO­Ÿg—ÖâaŠ!Xg ³[uö{ (cpìáǃO|á/ŝèFÇ{išŽ²,ËıÂ:—LSÌ eEçš9‰µî_ܸòè·Ù½ß%O>úNDk‡aƒ9Ĵĥà’Íèħ‚ç%q*ĦÍ3)²y/–!JċPûÛżúŜĝó?Fòì7²ĵxz½÷­Éxty<_F7G£Ñîh4&I’fYVîÚdÜó<ÇqÇñJLJƒ 8ñàŻüĈ9CŒ½16ùĴ…Ħ)7iÓ-cÓÍc -'”ïwІ:]¸%†òÀlùœ!KWA 'ò6£ŠÖ_ ê›ĥ`•Ìȓ€Ïa‡W‘ŸAŻĠœˆiû䙍KŬ-­ġÈ=ħÚj"²9Y‡‰.çŝj,˘³Rġ&ôÚñ˗ßÙdzÌßÜÙlĜ\­A0W’wŭ 9ĉ›~.Ċ0ušŬp}àÊıY‘­ĜĈ€JVôÍ`”WE,˜ïƒ&ÛèH=(eHşäÁFK@İ5èûQ†ËJĤ}$ġĈ…=ĈsĦO[Vr^h[Ï_QÉ8ĉ²ĤÒwk€‘‡Á>~”?÷ͳJİ=Ôéi×G2…q;ħ‹’žRJ%Y– £(ڋ²lke°}|ïú÷?÷çxÌż#Zż÷˙ô6ä6ËŜ=[òyĈ³6³éŜML.½†kßŝ n~ûëˆöoŒÇáċŜ³“ÉäúŝŝŝÉdrs<ïŒF£Áx<ôîjfÄ9gŒ‚n·Ûët:‡Â0<~ĉñ§8ŝà£k_ŜÎc]“ĥ^(µ‰M·€Wd4sä:xa·Ôa13Şl-~0WħT³Mš/ŬCìgÈ2]iÀßG0òL0O€ÙzÉÓˆÑĞ{÷Üuäe2úJ:ogYÖ×Z•R™µĥ(-“S ñ<Ïó=Ïëúċ\˜mž¤ïœ}ikp&]}$àŬ`†;k×ܔRÀÍez7”È~*WÔĤ/Ô›ĞĥM•AĤYJY-ĝ›ÍZzïsÍ,;ŜAwÍîY=#ë6mÉîǜĜGû6ÖZ½öâψÒé4(›6§×H i ßħşSqÖğħ.Sg°8{êŝçóÁè_ŝ7Œ1ÔÄÙP¤”2,‹F¤uŞàY–eI–e4M÷Â0يƒñċUÏÛ0i˙äŜkÏŬñÒŝĞĠ‘Äru“ùë›××ĴBoe ~àç ŭ} ĥo"íï!فôúeĜŬ-Ó5jÒó½Ŭğñël­w5˲íŬŬŬí4Mw&“Éŝx<îÇa’$İRJ•†_§—çœI)y†ž“ÓߌĝÄÊĦÍğžúÍżsöúÄàĠARıĜLóÍ]Uu™ ¨AĦNj¨ĥ&˘š>OÔêz§™5‰ÚR½ż’­£û•ĉš,0)LFjNE˘£À9µ<Œ Á`~É3ż³ŜŜĠ§<;™L.O&““ɤ¨D¤Zkċ6äĎY. "½ ˘0 ğQíF‘î?f;/Œƒû=…à ‚K²àœƒċ# Ûşp-§q::ı,iŝ˜7r,sN KċŸĠ½wĈ"×°cVъgö'Š´[یµo;½4Ĵ{Ĵĵw6NÓ]­cÌD)5QJ²,§i:q_IžiUòvĦšÌˆĊqì÷z½ÎÊÊÊĦn·{"ŽğŜù‹Ÿ~òï\ûüv‚~–OŸ3äù ÍÙ34fF9 &Sĵ…2]MĉE=#Zn!Q“5QíœQ1O¤óòœ*T ~\Àˆn0ċ™‘!ÇÁCvékXS×'/ ‡7ƒÁ~żc0 Šó·d1÷Œ”R,Ë2&„HÓ4M²,KŒ1rĤ¨8ï}û|ï샐V€+ċ€ÉYħòbiZTql[6³A+dóJIÓôŻaÎġl9s˘şñ£ÙKrz‚Ĉ_ċëGÀˆ—Ö·6Cú1˘ßç‡ 8ç28rĴЉ ͖Ğô äTÀi*8J‹Äs467gç*Ĉ2K8Ù ˙íü ŭï˙ل^EWµ;yF”stëYgmŝ]&L|ß9YßóĵBÀ5pġqÉ9Déœ,$“´³PÏĜdY–Ο)ÓZĞB$µXŞdET€‘çy<Ž`eeğ²²²ÙëġNv:ğú™>ñĜ'~óä7÷2ĵ:È`LŜ/!CòCé][ĥ[oXÌŜ,aĥĜRMfôÖÀÈ4dFsàjÑ(d¤›Aôv£²LÍ4[™•Ĥ¨Ĝ­£rżïċ)/ïÙá6ôÖË8ż]NÓñĠñx|}0lġûŭ½Éd’8ku5·'uV4Ö]νVJx[+wˆ7Ž_ñ9,ċDà(ݘ8İ$^fħ–šDäèŜóë͉¤ÎÀ†ĤJġTġɢ%`T ƒAëuÂ|3ZĜŜ,] [@ú1g‡PX"Èèè‰uO^ݳ'ÈëÀs"l1Cg•É:6Ŭ€ ,‰^Wĝï˙ôĜĠ˙ñ˙˘qéu*<ƒ„l4r×çĴĵ³cŽó`‹ù,Ë2ÎyRRӖÎĉBşcqgĠ^î F´v}*íĉ²Ĥż/ƒOċĞ|•qL·é2£sçꉟúÍżsŝ齌}k'…Q€qdÎ,ĠÈġ0Ô+`ĥڅIÓEÓı ğš5!°uö#µ=£À(™hŒ†Ê•çn?0bx–eó›ĥè`ùŭ£r·–³Ğ<Wiş›$Éîx<$I’(²RFobĉ+*˙ñï÷0Ü p{më‹×è?µı½=bÈ\Áò[Vç ÊĉÊtŒ¨ÄÀĞ‚HıGDSGär/ sĞJc³x,8dŒGH(èĊ³M)B6Cú1Wjò8ç’1ĉ‡›‡;äÔ}ó",ÈòPĦhPȇ°ÔJI·Lr Šqœ% ĊŽÙôüß=ùÚ˙ó˙êħ /J!„tV!„ŽÇD)UTìÜŜÔÑÄh—\ñ( Ğä"]/Û:P*fĴ›Q @Ċ™ŜDE‰. C/Š˘°×ë­ôz½CNçdÇçĝé>ñßŝ{Ÿ[öġŭYfa 0*żÚ´ĞA”Kĥ: ĠTĤ³Ë.KĠ†œ3šĞŞQg„7ß3šVP”Á`ċ4îeċĊC0b¨£WĊKĉŒ›ÛdäĦŞĝ"ŜœÓkqhÎQ¤$”ްɑ1f µ¤i:v™~ĉÎçêı\>`U;R+œĠúXk=´íÑ8ŬóyˆDċQávëŠöE–4]%jôäò0ٚŝQġĥ­ĜN̕ĉ* F,\A2ò:Œ1?7¨•眵€ôsJžL䎜ó0<|,dÄĤ'ƒ­\ eŞwF] s‚‘ÀBz>×c*Î#Ĉ`+‹µŜŠwïŭÏŸ˙߂›ßù†Ï9<Ï <ÏÛö<Ż?™L’4Mµ&‹š„Ì”Edn°Èŝħ_zÏcŸúgžéköŬ™Ê/:Í9ÀϕŠŒuttËÀ@&7@,$ġçV!,°él}ĈÓD„ %eşĈr9AI‰û6#Öt TÊtĊÀ(gÓ2bĤRÓĜœ gËÊÔv1ÙĦÀˆJĉzĈ '5İ\&ǕŬtİÄ\·ıB !O€Œ.KŠ‘ZñS³ış†]ms‰ĦRĉXdkÓÙCšGĵ™Ŝü0ìL#u@SU˘İĤŬ´D´Œà&zpnmRJl-léGFĴ\²s-sÈġCqš5§Ò´(óRÌyĤPƒïĉuh L†&èDqï˙ĉż}dċŝÍĈkĝoż"Œ=ϋƒ ¸9 Êu–e™VJ™"İTéĞË{iuß@Ş DaŠ(ŠÂ8Ž{Ng-ŽÍ(ŠNĈ½Ŝı˙Íż˙îcOĵoó[ğ ħŸ!ÍFçn°Ö•7ʀ$Ïċœ|ÄsáĠĵ"ÁòĊGÛé0ïñkÀ¨^9ĦI›ŒìïÖ20šL4FÎËç{#ü˜€Qyʛçvڌ10.Ĥ‹$÷ĝtèyŽŭf²̓ùÎŬĉ޲D•Ž+Ñ­Q5ŻqJà,X}ĈtÑg$„  Ù@*_3lV8á`ŒQΞcœ1ĈW:1ïf{Œƒ„3ù›ÊĉLÑfbğĠAéÏŞ6$ÓĦWH3•ï"{²%¤:0šŠ#{yUG„HŒô™ÏÎıçŞ.|ÙZĜҏAıN¸`ŒùBˆÀ_Ûúş‡Ëwê°ó‘ӁS6[8ŞÔ[ŞĤ1ÓŝËOPîŽÙÏ,bO°;~ñ7NıçÁ•gŝù˙ġÁöÍ ïŻ„a¸ÇñŜx<L&“ħ›ÒY–§ĉ€Zì;8š (ÍI)EE2Š˘ Š˘NE½(Š6Â0<†áÉçïıï#çw1›'£?½>ÁK JċF:3`‚CŠ||P0&ÈLĉ˜\wlZ7 Bş_ĦwÄıóËqÊÈDùîĵ×­UöŒ¨!3zs`¤2‹á ƒVĤáoß$ÑŒXŬó-zFNRŠĥĜ‚ƒy"—˘\ħğ(ÏŠSê³Í=€(5ùùîy`ڂ”ÉĞ Úşe:WDz[IŽœ irĈŭµ@ˆk‘”2’-íĝmɚ‚›{WgŞn36CŻ\p1—™ÀÀZġû^}ß÷?|àĠ˙ĝoîzù3˙áÛA\ ‚`+Š˘í$IúI’ ’$I&“Iše™RJ™‚&nÏ8ÖÌ­]69çB0)ô<;qT?Ž8 nkAlAp4êvOż˙W˙Ú;ϽïGߘûҕ1ĥR,tfÁ,`Rİšħh2‚êïC÷`Ó `։1K°¨ ı²ĴÜç$x.ûŻré!âĊΞÍ$znQ›ıLWÓuŞŬDÀ°Ÿ!It£6ŬmF’ın=ym•ùNž“Œ4(뎰ŭ› äŝ>0ĊkàAĴs  <ĜԀû¤lŝÖÂMÌW&Ĥ ˘ ^W֕X.‘Ċ˘ ÀpċUĥ÷چï'+n¤i:`* T#<5Ŭc žçñ(Šü8Ž;aö<Ï[=ùOŸ}_ô‹§2›÷ħô|Š^Uš* ÄP£ÑHSi*röT”éhŝ‹œħ­u€ĥ³s„¤5˜ç!£³ħːĵ µ~H?ÎRQ‹NœZ7D›ĈÏĈÀ„ 0Zxŝs*5äÏP^›Ûq獢`°2td(Î}òoÜuŝ§öèKŸùŭ‹Ż|ŝOżĞ”ş–ĤéÍ4M÷Ò4í§i:JÓt’eYĉ†V•sĦµŽ54ĠÄĞ$Wš`·iš ù/}ß÷‚C÷?óÈï€9pc˜9›Db4ŸÙ0²5™QŒ²Ô`Ïfro 0Häfà <€`à>Ĵ^CvùÔç`ż ìP$‘JÎLĝJôbĈ†İ <ñ×ħ~òè=ëçÀC ÎÁ´›áħ”;ÌZF $ˆ’Î+v!d bóAħg^;³’}ózÇ{Jİ‘1&F6I£µfUU‘ÊF #É(ŠünëQö}˙ÈŬO~xóâ~j7c”³ÙÊÀ@uJ ¨˜|VĈf‰ĥ+Ùı2 ŞşÛÖ4€-l çڂ‰cĴK>*ÊvâíFl¸]‰Ŭ* 9&›'„£c§V-Êló4K[9ÈeIĊ,sà”g?4³v¨ò/`ÎeQ&7âƒDsllžŒû­ßı÷ħOüú/˙ĊŸ\}ú˙ŬÓi2ıžeÙĥRŞŻ”dY6ÖZO”R™R*sTn†imi:½Ĵ9ÇK`$¤”Â˽Ġ}ÏógµŜñ<Żçûŝš”rsŭÈѓïŝĝŻ<|ïOÈHâÙŭ ß4ĈŜDÁÚŒrÑIéċŬßĊèµçpŭĞŽÉËϘu“Ça˙làm›m§HĴr §éUγ’{Ü\ÙÊê™+G'ßŭ|ïF|¨'Ï=,7y rŭ(ĈÍzäğg[kKñf,$@ËÁÈZÂp¨NI o0BA` r›q&ˆFÈ^Ù+_‚ĝ,­ñtpĴWV›½#›7­µ DT–“ây˙Ċ“œóÀ"íö³W÷/ĵĵĥ§ŭîdċÎÈ;ŭD÷ È ]T 8HÓL8Ÿh‘¨b ˜`à€VX‰#ìú…£+jë|lßQĈ³žçq×{M²,ƒğĤ"£Ġó<éyž†aÔétVz½Ŝá^Żw"Š˘S}ĝÓ÷'çżr#/F–ŒĉY‰ó?[p?.‘@3?$[*ÛK [˜ö5€QyÑ2u݃ħ V×8÷…ž”òÍm0§ôvaÙ1}_p΅éûáĦÍ.(·Š9Ûäʚ€ŒˆÁ ßĴ(ÏÍĜ4ĈĠĝÜb‘ŸÄAÉU+\‹„òûÛYŸ8ƒÑÛöRƒĠx#8û żzç}ŝĊSŻùs7żó~÷ıáîö ­ġŽRj`Œi­'ÖÚDk–ŒıLħPM­™ğy1³$„…yÍ\ˆXJٕRJ)×OžğûŽ÷ŝʧϟzèÑġ=ì[ŭ ÏíħŸZLŒÖ­ Lp@pĜIƒï~×'Ŝxq|Ĵ\?´ÑyE+ı£µîĞÉx2É"2÷í´ĥNÄ9ç‚1&9灔2 „ˆğž×;™¨ĠÁó{wnżĝĠ#ÙıÇşkżû˙ÏŜŸ6IĥeWbĜÚçÜÁŬcÎyxs( Ş€Fl‚ÍĜlN‘ĈĤš”¨&MF3™‰fú"ÉôE?@?@2Ifü"3êı›ŬP@UĦĉWUoÊ7fœ3#còágĜúpν~îëCdĈˌÌ÷Yĵˆt÷p÷{î^gï½öZˆÎ\I}Îȟ?B¸Ë> ü`TĦäÏó F˜ FJ#gW/H(oŭ Ċ[ŒèÁ‡ĊĠġt÷âË×Ûm­ġ5>8ÈrcLQİTR5ž` ü9Œ”i/ŠĞi´òÊ Ö3\żzïŭOl÷^Ú—ż%äĈiÏĝ —"¸>!Zjµî…“d$ …@Y(lĴöÄäW˙³/ló˙(ˆîBJ)“$Iûŭŝnžç“²,³–ÚüÚ~Öó½ÑsƒÁàrŻ×{ġëßŝkßĝÊïŭKúö>vös Ô.3j|„6NÇÜÁ?hÍĈÌşšÔÀÓŜû25Aßi– ³sŠ#P²ŽRĊ+Bˆ¤O’Dĉyŝܕĉ^$@šġĦ“Ä‘"%˘^˙•‚s€dïUb;tËlĠ;²ÎĞ&4ĝĦ͆¸jZÔa-Nù²žġ%ôŞâ$°ĥ0Ĝ+,JĈj܋.ŝ•żyé?ú×˙ĉĊìŜ§“›o˙bïڟ˙É'nŜĜ6ĈŒĴµ•>^é³  -„ "Ş~$Ü.*B ˘(!֍ßxùW˙òïżôò—²68İ·[Xüh_áÓa‰Ì0Ê҂K ĞZ1˘Äġ‹Œ?~ Ûß˙ŸPüäÏ²Żœßú°waó£˘(ĥ‡ûğeYŭ|G­/dqĠks°&D5—UÑàĞŒíÖ˽ŜYŝèû/ßıûÑĝ›uġˈgÀB‚%ƒ˜3ÖfhÓ-FV; * 3w°óy#jƒ‘ôz7 D@¤½ŭ!òwŝñÔÏ îžâeYn“ñ^Y–JİħÖ:ÓZ~£+EŞ OEħ”²Çq/ŽĠ4Moż’Ĉ[ŻÇ·.}zgçKöżzVœŭ˘Ŝe@HG閎´)júġf¤ˆˆ  ¨Ò`mk³×˙+˙í×{?˙˙ôċíkŭ8Ž×úŭŝvY–ûŝġ%ĵBO˘(Ş^ә$I.$Irġ÷˙í˙ĝŻ˙îßüïéŬûÎ¨Ż²†5Ĉ{5Uj ĴHeFÁ¸BĜh˜a­)àܘCš³n+˘I°`bŠ(B¤Ġ üĵ˜x HO€:)ŽQQHù–›[ħ w)]ÖA²ŝÉ µ *WRWò.²ĠKàĜPíö\5@ZŞFŒeXQy-9Bò-F9c'!Z?óòÊĞÊÊ7ŝÖżw“‘Ŝ{p/xŭñö­ŭ½ÑÇ?ŝÁ]Š™U(ŭ~DDÑÊĈf˙êżrŝì•Ğ—^yuŭÂĠWz.ġL”ÈĦĥ¸]Üzc/·PÖş‘vvÉî=³ëEnHqûÇŒGöOìÉîŬ‹—Ïŝ´(ŠÛüažç{yž˲̊˘(½<‘ñEx2FMÁġRÍâ(Šâ$IúI’ôÓ4]w$üáĠ||'ûñèĞÛÛ·öżö—cıq Dħf··İFùDaTQı_40Şt’@= °F~íğ(Ŝúç|ħÜ~ôÚĞçß3Şĵ=ĉyë{—UĈá5SeúF.SRp£8Ž{ŝôz½Í4-Ô+\Pż|“{;oLÎŭöŠX}G°żPB+ßo`×µŽÜÀLK$Q_ùŭ˙ĉĞW÷ß<óû˙żk½‡wŒ1;.£33Wê äeu)ċŠŻœ}ċ‹_{ŭŻŝá˙ú EïÒàOŜÙ/?ŜwÌIoo^Ïyz\Fµ‡Z¨:Ħ–0×~Gm–uqÈT€´ŒŞÒĤu$( Jא£„â)ġ;Š"Z&6>/eğçıd×ŝàÉïÜdUNHϜK3ëú9&´Ónùâ°Ĵ³H–Ħ½È"hŞÔ`ë:½£5× äĞ2òDxjs5h'xjòë@Ì_nÓRyÎ($c[QfŠ4ZżĝÚêËŻŻ‰‹}IHŭF à`÷QIÁp„&ħìŻ­GĈ+'ĈB1a·4ĝpdħ[d(Ĵ…5 rÊçĈ•ŒħşşXqO@OöħŭŬŠÉwŝqñµµôÔO߇·²,{8™Lö²,ИRޞòw0}(¨+JŻÊœ$I’¤işßëġv‹˘Ĝé÷û{ö_)†ŻŬUêëüµoÒs/ÁĜµiZÀH9 íç(KÓÉŜ{nËtuCÓ/ ĥ2‰ùµŭĉ?1żvĥw}esë|2ëmvü9Ĵĵ°Jo[oÂ2X듭ĠC|żVzPJ{½^/MÓ½~żż; öú}µ˙µ^öúŭúC£Îȕ—!âlĦQ3‚ ]Q•şÉgO̖ñh(5ÓĠs_?÷ż÷ÛgħóÁŜƒk?ÚġönjFÖÚSe“ˆˆzg/œùÊo~ûċ/˙Ĉ_>“l\ĵww‚½ŭN`•—ĈË÷óò‚m Ÿ³DĦrÇy5ëŻĉ<Ù)ŬÛXžŸMKŬ5—h€\ÉTĴˆÔ ğbáiÉîٗëjÊ·WÄîɵÍĝÀZh3uëäö¤zÀ–İJwÂÏ!9ŬTĜ1çÜb4XÙŞtçšïu“Üà ¨c§­éäS/÷ïĥ áŝÍrm˙­ˆ1.Ük‘r*‡/ Hi5éǢÑUš‘oç˜hžJóÀ r;38­9£Û­6î*6Ú] –ŬÎZ$5>À£ïŭ3äßùǓ_Ùì˙@ċùµñdrs4=Fğ“Éd’eYQݘ{Ž/Ĝ83“1Fx=RJ•yžË$I²,ËĈyžVVV&ZëñŠ1“Ë|7GżQĈÉş\;pä>w)`•=ċ™Ĉè èp}~ÁˆÚsFDIJ Š÷˙ĉç˙LŭúĠkÒê÷F£ÑÍñx|<ïN&“J–Gµz1mÁŬf·Ç ߐ߄‰(ŠŠ<ϳ4M'ŜĞhä™qÙĞü~ѓĝ[—ÄêUPÔĜ€ġt@şrb"9ALİԅĈÀG“÷w ştŻüŜW·~óïü_B› €ÇÛċÊ`EĈi_özŭ(ĴĊJüâAŽ÷~qöKĜB9 viÀÚ¸Ù7cĈNA¤˘e7gЏ­AF…9Ĵ)˜`d§ƒ²sÁ¨m" Ïl%FŽ4!˘ÔÏ"Í£~?—eğHôGDóˆ ³>ìŠYĉËuIïâċ Šcħ7RÓaKËÍÖ €3,MŻDQoL<áÁ³íà3.b@ŞßDä{H5-”*'IöVG%ì<†2–€äÊ}4eOéŞĦ†ĥĦ4lƒAFTċ…5°ġöâîıĞ Ŭĉ~wd7ô·˙ĉŸaô½˙İĝĠÍÁŠlòîh4úd8Ŝ?88ĜÇc§sİÌċó'ŒÉ[Î k­ö.ş…RŞ9âü;bn^ĝór²"ûg@QĊÚâĉċ 02Ĉb4T(s5s'ú\gFĠƒpäˆ@ħ€şùC¨·˙gó͋+ïKĞŜFׇáŬÑh´3™LĈyžW¤ÓĦgçœ×P ˜YTv&äW”e™ûsX0³şˆ÷-Ċ+ßş•.Ħ@âf~l[^x†šğ.`Ìö0ÚÏñqĤqŭÎq,1èÉŜÖ Bš\è'ıÄ$Sċ#Œ²=Œ½ċ fÜ´+ċœÊ„ñ Œ€ŞZ#PU¨ avf3ÊuNĠ˘~^˙V×ĵ\ ŒŞÍĤ‰B‚‘ŠÜĤ›Bd‰/MJ)e8;/~²éù?üC>¤#²çĉ\ ġïQ‰pİwñêf݆ ĈÓz‹ıMÓĴÁm0f ‚3(0­ D§Î¨ĝù!uú143.ûr™RUqcfŝŜìKU“ò$UçöF]BCŜÖġkWg"ÏöħNĤ’3ñ@ĉê%‚€É'oaçGÊ_]‰Ŝ*óÉ£ÑèúŝŝŝƒƒƒÑh”EQVt̖,šÄ`p˜• ıtÇ*er)<÷0¸żùÒorҋ‘ĴÂ7OPëT5ŸhŒÇ%ĜĜŒŞ!mŠÜĵ‘ŜA~íϕ q'f}m4߇·ö÷÷w|fT(”˙ŒC0š§×u.ëóÈÌ֗mµßh߃b"˘‹ôfÜ˙œFíÌTWÔïds@”z‚Œ˘H(ş†açmâOd/):Á`t¤#°‹„izŝÂZñxYËŬ8UXpÙL͖uP%a ,Uĥä3ê`ŬžöĦlIYòe9š2òH¸ ÍĊX×x2êQŭ3™v‡žBY‰İ}2ĤUµËkŜ>}/•Œ`Ë w~‚ËùŜ˜üŭÉdrs8Ŝ;88Ĝ‡˘(JoÉnƒ:OÚŠè%ïeVûrP"œ}ç_]ĜùĞïuÒ%€È}*Ôċ2 hc1<¨äŽŽŒp’{FUY‡@B€Bñŝ°Ulïo­Ó;£Qvk4Ŭ‡ĈñïµÁh–NÜĵsÙ8­ÍE4o‰žYÙ{íÑ˙ĵyòß˙–Ê I²ïSgBw(c*"YéÉħV`~ƒèB°vžxäJdĴ´1m§TlëFAĜòŒìtl Ôm[şt éı€ŠĈğŒkÊ֛‚ƒùˆ`䃘-ˆVÛxmĠħìş4íŽcùž,[˘Y· !DǑçèÇŭ³WĤg ÛevÙ£éĵĦİşßˆĥvZÒĞf*Êê1ĠÏĠ\OÉOu&%Â8;}c–Ĥz6ÓçäZq¸½”|ȧĤZԖ›ÍX‹éçQĊ¸úİ ƒ%PŜ½Žü÷ÔUiߎó;“ÉäÁh4ڍFżĞ6AĞ+€ñQ2$8a  +ëŒÉdRϞÄqĵĥñɛüĈżu1[??`Ĉ ĥĥÂf^h ” ÇF|òÀˆZ~FĴ,(°£{Pwßç×7“eî ñxw<Š˘Èµs‰Ô™€ÔċnĠ•!µż$3sY–µb‚'ŻĴ&ÉîÍWĠğŻ|ŭĴuÌI=ugUĴxMKŽKçÀ…à6wµ˜Ż2ÔÀĦ5Pe* QSÛĜ¨…PFĤ FA`ġ‘›(%W²‹‰(Š˘(Z6NžÒÓ§J.'öVirĉ\˘ŞTÜN§İ-Pô:Tš†óJ°L·\H­Ü‹ 0Šzqûšĥá) 4À¤Û ;2pµnƒàÂŞ€)ĵln\ƒiXĈАÑëúİ‚FïaúRj·(Ša–e“ŞgÔħ{(¤£€Qûqġ—1F;IżbRĊÖzŜ˙áÍsÒµŻDŠZ[ììĉSż˘Œ¸ŒÚÏKQe!aöîB_ì+v˲Ü/Šb”çyĉûrzÁù23Ĥ ´ÓjcQĉy>.ŠbX–ċ>g{ۗĝÎq !ÛTPĊh%/W¨Œ3µİ~Ó _ ċÚiË àİŻF÷™ŝÊêÙC÷9<ìZ?²ÁĤkÔV×*wH‹- FĠŞs.ì h™– ġĤÍɄNYvŸq/İˉĵdô%ğ4ZÛJw<³Î"Óq¸†ÇvêrÊvú—ÙŠġvÈ üΎ‚ïÂ79lí8IµrŠñ´DפÄLXíĦĈSĦWŒÄŽÛeĈ`‹šwŞ6CéâÑHİħR*÷N: 0Ĝu•y–m†‹ š)ġ˜ĦµJİ\k+ĈF냵½ğyşúÒ@M¤$ŒF%Ĉc5Ċ Ï 5§ijİ] ħ&yÇäf¤µ;ŞcÑUĥ›Gŭŭy³­’ëĦCk]ħ'3­ġÈ3\ÉïLÎm]Y{(CIH6ŒŞ/áä˘HtԝÂLŸ¨k̇è aċĥ“m(и7dƒB6]ïÓS=U‰ŻÇJB"́‘ °5ŭUä&NŭĈ;İ➔’Ĥ„×çw8öyŒ=4Ûâbc"Še’äÊjt0v&ĞDhô¸„ü:aMŜëÛU`!­´…ÙXI‚€u ä}ĥ˵Œ 6shŞš7b¨ç,Ĝ ğ’+bĉrgċ.Ĝqù]&MUÉ@’€HRĈÙDÑóħŸï˘C@îĝ²˜=XöÚ´TÛú^—ƒB·[˙zzĥ·*§³E ŭÀ' Œ‚Í1jÒMv°.ċ8İ8”¤µĥsÎÙĴMEW)”x¤à1íŸB°7ŠŒê*ĈÖĊÄùž‘Nċ[ĝMє NĴù`thùP•íJËĴ2–+Ó-Fx0j\i<ŽŒÈL²ĥ)EêĠâ8Ž£,ˊLjİ' ”žÚ7ÍèCԂĠP,é™s}`“Ö1@ߤY²k.F²ĉ`Ál}‰.(§!”G“vmCÍ+Ó¤{‡ZXSJı§’ÂSğ+Êĥá)½à ˙— a_œŝí&}=|żŬÏÜ ƒ,#½’äĠÍsŜ˘—ĤiêghuşekÖŭX(Š(MÓ8Š˘$Š˘Ñ`íòkŭŭÌ6ƒÓ#{Â2£êĦ˘Ê’ÑÖëE›g˘(ÄqÜO’$M’DúÊyŠ ónŸuŸy›ÀQQ’$2I’$ށ”reóÊëe,"! ‚>3˘éwZŒš›NŻaĥ԰ǣϟèIÀhÊqâ”r€ÂÈ'6DRʈˆhV|\Pu:í!CĥÔĝ€+ĠÛ*CJϞOW80ö°óc]‚ŝ‘ ÊzUϨZcÉÁ @*`hÇŭż+?gTQ¸ŬŒƒ9†§Żž[šùَ™ş'ĠUC fFBEƒzşĦvXeħñò— Ż|ñrE[I’Ĵ÷ûŭAŻ×‹£(sÒ|ž}İÎû‚?ŻÔï÷^Ż—öz½Ġ(Š6Ï}ŭ·^–Q"·'zÊ_˙<ƒ‘oxW’S0 ħġ%W7£(ÚLÓt­ßïúŭ~EùĊ˘Ïžĝ5ó1RJJÓ4 ŭ4MW8^ïoœ½pĉêV·"áèyBt€àg1ğL×jôDĥíSn§lı–ÏQ[Ş(,ÉòQ3#S™ë0~f Š×1qLğ´bÚI)ċ’ÀC§€t<`4³êuì"żcèEg’ħqs$œ~[µëĦĠp¨¸Ì£4ġY7 íli:7dFfTÏsFSR4Û2àİoS|5PVŬâ`~ޝ…Cş âL°s”Şŝ–uik+k_ûKgâ´w1MÓ³ŭ~cuuuëġß8]fAwħ1ꚵd—ɕ••ŜÊÊÊzšĤg“$9˙Êïŭġó÷G eĦaK§YVÇéN†Ŭ žUAĠL…J Ï~cMġÎĵœĤéı~żżı²²²2 ÏF=Ž ´< !(I9 ÒÁ`°Úï÷Ï$IrŝġßùŻ)+ÄöHA0{6—S FċhnUŞù"žžn’Š8ÔĤ ²ۚ'š›Ÿ_ ÏaM² Ġ“)n-îĦĠó=2ĠzdÚŬEô‘+™³H‘ß0.+LM§€tü%ĵZ2(0ċ‹…i´ħïk½f VÙŞ)ûaƒµ֞iîŠİg•çZ WÀĤ3!K/(Ó5ĤƒĦmÜĈû[ĉ†ùWĝ|u–Ĉ c‚L)Káħıŝ?U’˙Ĉ• Ï}ċ›1ŭŻ|­×ë] ÖÖÖĥÖÖÖVúŭ~Çħ\°ÀgQO—–0‰˘H¤iŻÖÖÖÖWVVÎ÷z½KWŝ­/mĵòĠġwd¨ä”ÈTSòùçŒŞù1ò'—¤”F1*­½L77~ëµ$I.÷ûŭúƒ$Ž%ZF½^/Z[[ëùsx×ë]\Ŭ:÷Êëżùç?7+é³ğéĞİ(ŜĥQ½˜f42C0|nxި] £VK;UÜ6 â†êáY%žÎqW™U9äÏ 3 'ô…3 £ıĞ9¤¸2ë[ !ô\'†Ô0‡ò9Zĥi²ħµŠ$•£‘rsDćƒNû|²Ġlĝ°şƒË‡5ċB"Lŭs°ËsbŞĠÌÏáŬ´5Ħk5ĠÚyTÏ7‡d+ħÍ:@Ħi>yHÈ/̔ĵè+c%ŠQüÁ˙ââäî‡_Üúxh­Xk!„Íóܔeiێ°hŭÉ@Âĵ^ BDQġz½xeee°ıĥĥvİßïż´²ñê·ŝ£˙âµ_<Êp˘!ŒóˆAìJ¨6•í‡}qÁ¨2ŽĴ˜h¨씳­ ôd/ŭĠ­Ħı÷k+öçÌż/QXÖŞÙh~}HĥŒHVlö%vżúşj‡û}ŝ¨`„•Ĝ)M&“qQ0Ĉ°~n3èf]Ÿ‡7È?oÔëġҕ••Áêêê™ĠĠĠK+++Żġz½×çßŝğßZ}éW6żûóèRƒJ[_,dݳzÁ^Yë³SCCYĦm Ñö3j”Ŭ;@Ş~ÛPrhÈ#ĥÀˆíg‘UçŸÜ„ˆpnĠÖ2ġ‘™d+RżeEäm(ĉĊÎö5yꇴ-CŭKvUÙ.í]ĵĵaĵlwĜShÏ$ĜŽşo½ĉ½„Puµx]”€°\ġÓ+µnÓşZ§ĥ•û,Ġ‹TĴⰁÒȧ&JDĥqû´Ĉ΍ñŒèšiâà;5€ĞzaĈúòĤħ0Fàċ+—Òƒż˙ú]ü?˙o{È[ŽÇišĈñXN&“IQT–ĥÖÂK—„`Ô5ÒPùŽXFQ ƒ^Ż×ë ƒÁ`pf0\îġzŻġúƒ/˙í˙ú˙mûÒWÖż˙Á>ò Ò\k‚Y('œ8ê<ù²ç‹”U-§?8íğTó:$„˙w@ ›[}Y|ëókĞ?˙1Ŭ˙>pÉ4M^Ż'³,›äyžEAZkí•ÖĊŒ_§ˆ”R$I§išôûŭŝ`0X ›ƒÁàRżß%MÓ/ŭk˙ŝúíËżù7|ç]Ü}8)Ì[ ²óMċzÛΌsĵzÑ`Ñq0 2Zŭ†j‡í8xŞMg›„úġt‚‘mltC²ĊƒQ‹tAžÄ"˜˜d½ï†c#?‹$fĊÉħ”O(=Oö½ŸŞVĥI²un…͞wıwí^êĞ/ȌL`Q;!ñô>ƒŻ•ĝ*…ÏpxŞ:Íĥ(Èx ĜêqÍlˆY! •c\/¨6 ó"44öŞ,‹[ëħşŻk-Š‚qîü•ŝĉ˙î˙òíO˙û˙ûЏùq/Š˘AšĤ+ŭ~ğ(Šŭ,ËFyžgEQ”ŜÎ\·ä†çÑoDEQ’$QżßO“$éġz½Ġ^Ż·žĤéı^Żw)I’—×·Î~ċßùoŝğßÎÎżħöO†Ĝ)Dڙ-ZßÄ'AŽÑè?|ÛÊ.kÎ˙ 3~èşòŻ’ÑtˆÔ}wŸKD@1RX93ˆ“ßû/ż1xûü°EQ?I’Ġ~ż˙0˲½˘(*+ó2ÏóB)e7àCÁÊ3ş(MÓ¸˘s÷z½~šĤƒ^Ż·ÖëġĥÒ4½œĤéËqżŝïüç˙ûo^ûs~mïŬ<)‹H Xë@İoŸ‚iYĴɔ­Á[šrÜTKA[mŒ}Ĝ#,(×u™ë…  Ûò0:žÌ¨FÂcd…WD,*çĜ¨ƒi· 0ö‡ĵ0‹-â\"„Hôzç/ôMÄd”|[†ù Ĉ-fáSĉpâO´ ıàû/Uù.Ôżä˜ju€Ì4›Ħ@…BC>Ĝožİ1ĥS<ĜÀ?İú^e\€TCéğ™&:OqS†a!0.46ÖΧ_˙ßŝŸëŜŸŝ—˙ñ?úQ’$gÒ4½W–ċöÊÊÊRj¤ĵĞÖşôx6°7÷ϲ"?W”Ĉq4Ĉìj­Ğs˜ùs¨½ıñ <‡½(ŠúRÊU)ċfEg¤”çû+k/˙µ?ü{ß|ġß>˙ñŽ?|k÷M@š!Ĝ™*RÈ´!޵èĤžb6°i—ÓĤċşvf„`£2Ò KñSj÷ˆB§W­ÒŜb0jÌBµËŒOšµĴ¤ä*r#!DJDħӐÏı Ċóda>ËvBDn¸"&˘4Ŝ:›îvêĠäÂw·l|0j›³2smINĥÙpÖ*bšîÜÚ_¨„W"‚—j÷‰ÀA™.˜­§Ĝ-·J„îQ9UĈJ—ŻĥÀì½z"‹É7œT‰µ34€s›WV~˙żú?ŝşyt÷Ë×ü½o˙ñ?};Xkw­µCc̘™sfŒàxš ‘$˘„ˆzBˆ"ZBlJ)ÏüĉüġŻ}÷˙àêĉK_Xğ9Òô/o ñéN­-¤²Ż „uÁĥúà“ÒşĤUĠ›SĤó F‡˘—C&‚³h¨l$‘ûŠEĈ„€d , î?È ·’ô•ß˙ğ_ŝµżöĵúàÚO½ûç˙ôÑ£ûwĴµ{ÖÚk혙3f.ŭ9´á9û@ĜBĴûŻ­×ċoüöżŝ·p鍯m>C~çŭ!>¸=FQhm!´µ”šŭŬ ÷ƒÀ[(Fm×dÒµH µŞIx{èwL(Bìéähy›ĦŒ¸:OŒâ>&ZÖF}>ŠçŬ†ây³Ÿh|ÀÌ\K !Ċ}ışïçZğ>¤ò/›Ĥv³ËMĵ6­ ‡Sr²Mh ˙ì”xÀ )”iÏÚÔ7 š’ôÂ@ĜÎÇEoŞË…ÜÍËY(µxâl\éG@€5ƒ…Ċöˆ1*,6{ç_üĝÚŻŭ›˙îËû·>Ŭ˙èŭŭ›×~yûŜûïŜcĉ €"0ƒĞp7"˘”™Ós/½zŝKßĝ͗^ú—6_úÒW7t²ß)üèÓî  e!,ƒ” `dœÀ­g½£Ò' X_Š$·°óÁˆŸk0 v<zhùŜ‘˜z ı›!#á†O}ùÎ%öw ŜÏ6×{éĠ/ŝŝ•żùġrŭép÷ÎġÑŬßı÷éÛ?Á̓jc$.äÏaBD½ĠÍ3[_ŝĉoż|ċġ/ğòڗ×úëçú·vrüñûcÜ|˜!Ï5Li€R×óbÂşÖ0rËħ …ûJ$ıEn¸1¨Ž€9„vÜTĝİÁĈ6 9;ʄÍçéfÓ{\`Tí>kK]ĥ(l’€DÏ÷Ï#)eäm(–!ˆfH³ŽÇ´ o;!+ÁĈäÂu+ •ñvSé £”éÚÒ Tµ˙}™È”L`şì–Ñ˘WwòĞ^5ĉ,È#YHŬĥuĊSòÚŜIÓÌÈĊVŞ{F˘&N”EM7\<ċkË*ĉy*![ë(ĊŠ!#çÎúHrƒ~,ċ֕/m|éġ_Ùĝĉßú÷_‘F5İl¸§UžY"²Fi+#IJŭ­(I{qĵ² sƒÂà{ ÷Ĉ˜dÚúı˘ÂMĝ’ò䟵Yĉ:SĴÀˆ‚&ö!ŻĞŒŞ@I`ÙäG‘`?‡TyMĊI;{z—;—]²€) öö2 ' KĉÚùġĞ_~iŭwó߸ò~COörv<ÜU‚`µÑ6Š˘HĜ:)•2+gÒQah¨ËG9î~ĝSZheí¨ž ·~˜—ÙD`jGenكsËZe÷b[™ÏŒÌ­ŝ/ĜNĤZ!sŻò[ĥêò¤eşZÍÙz“…e –}ÊL²!DVÙPÈ8ŽEQ´¨Ġ:‹tißG²ˆ˘¨Ò°KúŻlU>B ŒÚ ĴÊLĝP™Žeş ‰Ĥ4T´bŭcÍĦÁT÷ğhgZÔ̈Dà CAo‹|ıʕäĵƒ­ïËpà·f ùßZš‚ĤôÖê=29֝ á€ħħ€U@f &…ÁĦ $!ä ]•ƒġ5ôĥ" HfŒc[d9`ß 3ÈKÔİ .c+Ğ^ˆm/k–/+’F§š³!ü”éĜV¸^à”? D 7|êËZ @[XÖÈ xPXÜßÎA‘@œê§²żžĴ`Û@*ü²µ0 ÜŜħĜË ²ü>F…+§Bûŝ‹1N:KXmÁĠy4MFB…pZ`dßħöÜ‚,ŞhaÏÈŭ)Û!ĥêHÓ˜gj²tıċ4=³Ŭàç'£úı ’6€Œ@љI6W€D‘ĝXĝ\ÛPD' ŒŽtx†]ìKviïüĊ5žġ4³êş32£ËÎ poìhŒzŠ`ÒÜ 53&.ĉ¨ÄH ­İµn›Fe‚š´p Ĵj£MĤi&ċ3 0{PšĦ§àÈL`1e›Vĥ­(^ÊS•'_DĈ8Ŭ½B)ìúĴ-cwbü'2Ú Ö\3š*ê6ACş&1tù<…íµ Ì‹Faoƒ=#ßü4&€‡×4[†%òÄ×$·ä2QVEN("Â^=î½\&.jEhžÎ1XLnxÔÂ*L$Ż.­íÔàÜY`dġŭ1vú˜ŠÚ=  „Ŝ †7ùÚÓĴ:$=4ëûm)Ħöm˜QĤ;60jTí¸‰/bı×ÖL}É.öĆlj½§J KfK3g<ĦA !"J{.rhÄ×Z0ĵd™qG‹ŽÇr÷Ž+XĥTïĤ;Ş{dĵżµŝN8¨Jh6NİÒp¨u PÍÁÚŞĴ'Ÿ>‰ s q[ÓÈk‚yċĠì!*Ù$?”k–aĤŬ/[¤:ÀòÂ`ż0Ó £İ¤lkˆĴc`9Ê~ĴZìĈnÖBıaP/ !ìoÈàü0ï™Ĥ%+ 83/€-ÁCX'§eCGğ&m*9Xiïğ‹’£ŭӒ—úEë$TQpÒUĉc=ezšqíĥ\éÎÙV6ä•ïÙ j37Ëwí~S˜aĠ%h[mD-׉şLwXnĈ+Ž!Ü!d×6ÍäòŬ`G=!@Îêb× ›d…" 3$ħlü<í!=~ĥÔÙKŠ˘("˘Š‚šĈëg“ÒĝM›§0w*@ŒÂ úìÔĦÑĵm­éÎÌvô?ŞÑWjIU uX“gÚ8vqŸ}݈|nƒÒ\>Ġ=$[y“5Ëtĥ Àá Sëó Ëw]â¨ís`›Ô$nŸË@Ȓ`ê̌žŒZċ;c€(âd‘RÏ1툜ċ²ñ§,ğc§JX5X?ñ™sñ_Ž%f;SéĈÙ^p{Cùƒĉƒ‘mlf¸A¨Ö’˜ZOÊí^wSgDu]ĝÚµ Ĥ Ġ8ÁÓ–¨ŸÄ_@…­˘­Ĥ*&L蕨¤€D)}v˜ğRàíá˜<tl­*¨Ġ‹§f„6Ş“E}:i˙˘QŭÚĜ9ċ²@M€ŞEAŭŭŒ×Š#rךŽiızڟ3‡_4£µ-wËiêZˆ1ÎdÒx6µÖU÷ A*ŻjC•“F•]Ù Lg+ߣΌ)|ïWĠ0š~Ŝ|xŬ*Ŭ™QH‘…[§43yL0jĵá1-H"SQBDİ·Ħˆ”„çxéyħ0?$Xàg¤B‘³XßJGĈĥSšC.ß³­†ı£Ü h]m@k§×ñĦ>ÔA°ġ÷m—èLB02Žg0•Í ÁŞî}“ĞâÔÖ×ÏL³:bÀ §Œ Ğ'lŞÇÄ<=È4rĠYçl^“ÜrÄġ_ş d  âÚÄ2{óÀ04Bäİ£ù Fn}¸’İñ`$@Ž}'Ĥĥ$>fÁĝÌÔJçl˜<Ál…¤éĈ‚è0A¤s½$„jaĜƒ‘emĤ·{Ŝƒ­AʟÇÊÔ²#ƒ ¤’fK6TTh φlıFÉĴzFík—JmŞŭOËt P úÄüD`äבˆÀFC$}äF¤~CWñ0˜Ešesb³¤çiİQ efò³`ħ"‘IڗŭU9%°Ħµ“fFsĉ ŬÊá‹Àˆ;^×<0:|Aq-˙%êfĴk\‡ÔhᨠĴOp(YOv°>°™z˜Üü‘ ĤĝŞ0rNŒîÜi (³½ )²¤bûY¤…-œÀY¤“Fû~œ$GùôÒf”pHŝŭ¨`ÄG"0,Fܕ=&Ħ•MMµól á‡i€šJÖı̆­ëj{YG ‡§€ƒœ†³{Œ{.Ba öĈŞŝĥ5#T4¸ĈFĠ˙ĞĴ§êŸ›à%YC ohf‚$ ï$0U 'jGĥ˙xc†( Ĝv9]36è!qĵ0²Xğĵb F ’KĞe;‹^ŭtÀO ŒêkÔ,ÀD h™I6֜/RôĵÏ"E'ŒŽr;…o;qvÍzĠ cÛv‹Àˆ;,u-ZŒĉžŒgsèğ¸×.‚=A¨™ÇžAġíSVj0b_ —ŜPCôv²„RkL“Ntq ĠN¸ àÍéúJwĴ*Á˜€ŝ; f˜–ïŞÒ]}?ׯfhŒÔHĝ°hÙR-×{ `„`ĝ[`*mUeA.q§8ĴqŸÂşr'DÀġjDj>Ĥ1לŠW•ŬĜ‘ JU™+3Òfz^ĞóY•`ÌȆÔîVÏèı#+ágĠĴwç\90‰ƒfï5 ẃ…r/ jwH`hħ°gT2ÉŒêOÈĞĞOWEĴÜnÜöŽ$XۚgÏÂÏĉo‰!є"eż› çV*S#O‰kĜiŒŞĤ„Ş ˜L}L;‰êüğÍ“rŜżC"·ú6fĴ H&Ó ÉÚié­ê'ıŸm³tWÁrq9P–…N(Mlp:^0ŞKßN:••yX™·2¤Eñô”e÷„àDpCħ"˜AJ£ġ3ñ°îCXĤëVm@çĵì9 ÏF?%0²<·Ï5Œ͏X@:ĦU’%GĊŝuóDÓĊžÀ ˆêû¸Ò0Ì5òÂÔY‘ìŜ) jžµ@t¸ä3-ğ„˜S ˜ö‰jrW[·“Öv:÷Âüxe:bE4;İlİt@Ħ´6˘>÷bğié,ûżYÉŝ §ÊLR8 2l$cg ­Ï>„#ßĜp ġh`TżmcA 2Ÿ×&}1ƒMĠ¨„'”xMCÓòZj\|ÁüÚ!Ÿ  3bO.aŸÍÚ ÛݨŬ&,ÙĈ­İ˜-˘Âs‘5+ğÇFġEoä…Y¤(ŠÄ=£yDÏ 5ÒLᎆQXĵ•ŒKÛ4ĉ[BgñÇ 0<ÙYÂŻFSr‡mÈî³×ıĞ.AŞRsàJĠÁ“9ۍƒ‰BYO &ï9ċ D kçÚ6Àsc†$œ¸7ġ€ätg]eKÚïµehìc‚‘F‘Ċ éHhħt=À E£&İ\ú‘€Ô•´gzYë,…+”•Â}–{=B:)Ö fÓ¤vZNtƒQĝöµ1~ĴĠİö`$=Iá?÷j´ŒP›2VYµÖDĦÍDCÈpM݉AÉĠġ¸mRğñƒQĜdĜ£ZĤDCP™‰“ÊÉÇD)„ÖÚöljΒNş–]çÏRÊz‰ˆ’xum@ŭ•è`ŻĴ騇Oôl0âeÙtvVöô˜`´Ÿi^ŸĞĞÉ,?ÛÉüĞÂûéX0 9PpÒ3җsÈ2öĈ%ŒâÚ6[ w ÜoĞB›f/İ˘”·Ë?‡ ĜÂaÉfY'̌ĵĞÁù£ËŒ, 4Ìĝlĥ œNWËÏ8à‚ĥ5ŜkŽÖßĞŬ ‚ ʗĴ‚ĦLË`ċT°ċĈPzÀÚLçƒÂuıU‹ÄZ§wŠA¤X0¤ ? ôŝ‚ŝQEùF Wĵ";uW ÁÉT½$3-½ÙÜ’ŞUü¤"F<yÀˆŽıgÔIŠ˜ö¨@„ilŻTe;_="k--OO3¤êX0ƒ4 „dGIï•-Àȸ ĤĦ'5C(ġ(=£Ï$3ZŒxNfÄĵxáÏܙSû/=8r$ë%göFĴöŠTİÍL)ÇUÏÈyî˜fÙ~İġ§Ğ™¤êsħ 1í#yĤ]½Ëf(_òyą̂^Hpل°“{Poŝfcr{èĈt8jPx>İŬAhŬÎS–.ʆ g_ÇÊĴñĉ’DäĝħÀhJu€ żé@%x+ܜ{O$á3"Ñ0úk–ìâ´5İÁëÊY4³#têÂ×ĥC£Èġ`ôÌùĴç43šġ÷‰0cĵdfTĦIÀÖÇÈLĵûáX‰œE:I´ïǝAJÒ —×M aß<ı‡ûħ€7áq€/YĤ;.0 ug+b€ñ=% @1p0ÌaÍtG=£İáßTEÈÖYÒô„Ùi,çf†„°d0ŞĴm²µ ۚMgŽŒ¨GZgÇѓPŸ~Œ-ğ{Ġ‹k÷´ÖğZë}cL¸kÛ@ÔÔ¤;ğJ΀ô£(ڈ˘½­Oú%o'é— °2‡{•K‚ÑïJ;ÂûáW´î„ß8ˆİ*CXn%š:sWf]Köp­ÍXƒ‘múµÁÈÔY“­Ïysù>ß`t¸gDÇ[Ĥk7†…t5^EĤ“ġä˜EŠN-s{¨ÒPۖ !ÒôìùUËΉ’É­5ú1ÁˆşÂPçÌì?FÏèIÀˆ;筚ż0͌\3Fl|ö€‘¨UŸ=ĦR˙Ĥjl­€ĜPġÂ^’ħáĴ#ß(oä5ôZ"P" b‚Ŝğƒs+é°,'w²,ğSĊŽÖzb­µtjˆ~Ÿğ[vÒÄÌä-Sišžé÷ûW^â[+ĜüŬ­‡Ĉœ×<;"…kKiëÀH8…pI^ÉC„%–])˜=je€5İĦ%f Îßt–ˆÛBİĦ ”]Rıây̌°ÜßÇU—ù`4]#lĴ"3ru+iegÇq”eYħ(–ž´~ÒI}Óĵ ‰ˆHJ !""J“­sŭŞäÏvvùìÈ`d;Ş2xü̈£gô$`Ô0Ċ`T—ñc˙ ¨g{L+’h²ħDF•_’˙Ĥ%ğ.€²K&(ŭC–uXÖA d`TњcŠ$Ìè!0Ŝĉġ¸ĵ“eÙíÑhtk4=*Ë2cfÓ$>" QHD$“$鯎ʽ·WVżĝüP0q,€Ü<1…­T¤ g5!!¨‘ñ’ +İCl?Û°n¨°‡Ĵu.ÔĤ ˜/*µĠ=üê#Ĥ%ÁˆƒQ׋+ÈuܧÔeHRʈˆh™XzÚCzĵlİñúù£j)M·Î¤™Ú.ĜĥґËtÇFö G# Ûŭĝ#€‘*"4ġ T£1žtä;(ĉù @Ĥżm¨MO³ĉPċĦÏé Áˆ‚WA}z kf46\<Èóüáp8|ppp°“eل]£Ë@ĥ!yÁZ Œç›Hôûŭ3›(ŠÒ$n&£›cĈ*Ĵ· ÜĴÓ‚Qx›1 ö`Т~Aèngž–íÚŻvv­ÏŸ­Ŭ]kĦ[µúwg~QÁšvKgFG# „cg2b€ĵiÀ´ g‘ÏÑ,ÒIĥ0ŸYïô,’¨žAÚ<ï–ĥá(ú$`Äĥ=ƒ1½.ƒžq;3:0:(`Q›”ĝÊ\Ïĝ7Ižİw”èÑèġ5ÁhÚâŽÍ‚‘mí^ŭ('½}ç"ŭPj§(Š,ËöÇñ¨(Š‚™ Ĥ£Üúı+b´w áLˆ "i­µqËÁ`°˘”Ú‰ĵùpíêßYíç°FƒĥöXÀ(\+Ö2,Z£1 M4íġ5CTÓÎ{Ş1•²5ù!"şûŻ/,aQ7ĉ8À`@— t“HD”J)£` KÄĠS óÇ(áµg*ğž\ÛJĈЧĥG‘òw²³2#ÌɌl÷ŠûĴÀˆç•éŒüÊ—éx‘­'¸VLm>–<3ˆ:Á¨ğWrì`ÔŽ.K‰³bàâxĝÀž‘ĉӉÖJİħR*3ĈÌĴü3Ĝq³‹Ġ Hmù—P2[c ”R™RjĴµ>èŬ˙Ċ͍×ŝíW‡F 1°Ċñ‚QûëY ÓT èŜqë`Μ_w<çÏÍğŒBÂBÄ(tR°[R_WJí+†eYfZ낙ğ@¨ ”ôŒŸĠĴÇ3³ÖZeYf÷ċ7oĴ`Ùj$”@—„Îħ‚Ÿ‚Ñ3#˘'£àú°°­ 7ñš"ġ’BˆYqôˆħĝsßCšùVċ:Ĥg/ĴY/lLˆ€Œš^o/ħï90‚Ÿl0ŞĴĵQE ¨×°ĤöGàòĦRjż(ŠQY–yµKv‡‰ óJvU@Á}ĥÖRY–yY–cÔï>èOnŽ]‡†“_’T‹Ÿ‚Ñó FSċ˜ÈŒ‚£ŞlÇ h™‰ÖÎDT;Çv¨~Ÿxù qˆĉeHRʊaQšž9×ĞhÇ3ìcdFÏ ŒxŜÂçÇ#nUUi?`ÔͳÊH ÀPwßÇùÈÜÑZïú i˘”Ê=™Ħ$=Żüĥėi=Öĝ,I)Š ´ÖğɝŸŜM}çaT ĉYê8À§`ô43£ÏŒŞh°Ñ@4@Ĥg'Rʨċ‹´LŒ=¤%;’&á‡bÒÖıdbÖT½#ğŒx>ái‚Q%Ad;7wNË€Q¨êŬ^ïJı9£Ï5a½W.(?‚Üż§ÎFú#ÔNQ˘(2­uĠ?2€„_ JïÖZ­µ.Š˘Èʲ)vÒÛ?úp#RŠMäĴr‰ŽŒĝ$ƒQ`ûŝ‚ógĠ3êú›Ók“(AVŠJġ;òÂÓbIàĦS@š˙Ì’LŻTß ôâMg;á&bğ3£p’|‘ŸÑҙ‘é(Ú,Fíi4Ġ”ëìPÇ^F·ßL´f ‡E}Í7ÄB_T0 Jw"’?ԝ·pA´R˲ÜóċşÌ£€ôœÇÖÏmŒÑeYfyž•Rûş,níĵı#}P$(U^Ÿ0ÂT!NƒïyïÍ~ȓ€Qċaoœ}´Ž|ꋔJ)EÇ,Òĵ̈Niy Şg‚ì(B$´²usĤ1MÎ8‚j·ÏBĜÎÉf¸–ğéĵ˜f]@–ĦZH.FXFÖĞ}ÁG#·}œ–Ŭc ³úá ”òûJİGeYîE1VJ•žÌ`şäˆ_zÎí€af­”*˲œEħ§”ÚéŬúŝƒ~ÂljyġÎġĝ˘ÑáО*¸u>ĠĈŽuÈ3ÍV2ŝKƒ5ğ–„ÑÁ¨tR§‚@ħ Ĥm oRG/QCĈĊñIg3aò‡wŜK+⣲,–eı›çù°(ŠvıÎ1ó9Ê}mĞl—çy>,ËrG)ġpöŸ~$k°ĤpçFÈÎ>Ò F$ĵ‚żĞ”µÄSu;ê–w&Â'53â™VԏFŒ†”“s,ÖNE]¤Èt²IDq5‹ĜP,cëߟĠ,ҳ̐ĦóĦ1ôA"˘$>{~̀\J/-FXŒ°<M˄³Ìġf€Ŝċ6‡Dîà-Ĵ„ħ ‘ˆÔġPD|oÂ)^xÚÏU³~wM1ĦüôMĴ;+•eù(Ïóŭ<Ï'eYVd;`Bú·qğiŬgîóYkuQEžç“<Ï÷‹˘x”ì~á9}{ĜV–ô‚0%œTĥµi JSP$@"r,Cŝ“´uĈôĵ€ÑĴ#zL0j?7Wĥˆ×éh-Pk¨úHÀr”ïgž1ÄRE‘€†’Wù>·ÊŜÎğğ+1Ĥž/]`ÔP­n˙ÁE`čŜá2]—S§ċfo ³/xf`8qĥrƒġĊ{‚ìÇ˙#ôŬ·ÁjêÉ ÌY ҉#(Šâ‘ÏŽr­ġ<0²s~_ĉçy—µÖ‡Iù°(ŠGeY>8÷à{‹Á*`4àɍrÖ F>ëîç`¤E #°>€ŭ=Ĝ›ßĞĞĊÎfr.˙düÛT˙K1%›`M`9öF3³ÁÏ43jf@Ÿ~’ĝÒfıŽú>CŠ[HG‰µŸ{@:ŞR$„H˘3ÉD{·Jm1[ÌñÊt<"³Ÿñ’†…`Â8+a C¤²G˜üôO`ŜúŸġo^Z˙4½üàGû×yrE½úÛ=Z qŬ·"!À0ÌÀçŒüŞ!H$K˜ì.Êë?ÇW×äğe™ŬËóüa–eY–ċZk…nU†ÒÛ< Š P8׈ÀïÊ0Zk•eYŜëġúŭŝv’$w/ßû×vÏŝá·¸(@"r}Ât‚ú³#<…Ì(’N"I°Ù…ŝÏÑô“üë_8wgÛÜ ÎğÙOô…×÷"$Ğ@İ\V`msŝPĉWĤ;v0â)ĦFƒeY!’ fdHóÎÊİ…9Ž8ƒĝ %ÑĈÙxß{ÇASÙ YöÜĥc* µhá˜ÀˆƒM·ŒÀÀxR˘,-Ä@BDĊÇ?Ċä'˙‚żĠû”uùɨ,÷œ9\6ĝ˘úé‘üĠ ì*­J{@f`­i*_;ÚÏóĵêuşJt³,(ÂFE^üLÁż<ÏóÉd²—Ĥéƒ8Ž7_şû~ş{ù?û×µšHÀÉ ħ J’–O qwhµM-Dƒ“œŬ…úĝ|ùñŜW^?˙f6ߜL&ÛJİLġûŭ½°vĦ÷‘ŝĉeHÔ$œĈş:i`DŸ!…ËÌ@0 S äZVR5ÔöE:‘½£“Z²[Ĉ)v3HëĞ˘×—qS÷/~?X˙êĈAĈ°Nàó–µ_SE…÷+c˘È ZñÔïĝyóEŠN ĝtŝÌ ĊRÊ$=yÓĈĜĊ²µÓ~<0²6èBw¸cò #UhL2|~R Š$ÊO‰üŬò7V£ky6=ï ‡íÑh42Ĉ˜<Ï#­uÉ̚™ġċŝÌ2‰ßŬ3vSn$ŭ)“P³3µëRRZ`D3nĞ\`ŭÎBÔwĞGÈßŝĜßÙ½pĤ÷£Ñ(ż5™LŽÇƒÉd2QJ)Ì&-´¨íkç¨B0ÁÚ@’ ”R*˲,Žƒ8ŽĈqĵzvû/~´wñâùâ†Hĥ€(+÷’ÛUÚ…ž0"ÇrôT’Hc ğ ġÑ?r`tuû£ÑèÓápx÷àààÑx<)´”RZk•/=ġ˜üĞŜç֖DÔsBġš9Y`t˜ĜpÜ`TiŝÙ:S²Jı>’N6c—!Ċ>f.kÛЈŭ,żè€4ïƒéŞmş¨¤ZĦwöÂ{Ùb?ù`ÔΈğ$ú%Ÿ0* Ĉı„£l“€#ûċŸà*Ĉ֟Œ&““Éd'˲aQı1Ĉh­E%“CD†ˆÌ•÷˙ÔòùÛûÀf|îeĜ$qħíŒè)Í£zċPmò "K êK@*żüç˙(˙âĊµïgÙäÓ,ËîÇGY–=³ÎŒxF·¤‹Ô~oż3ÛH§Ŝ@Jİ"˲q’$;q÷¤”ƒ×ĥ˙Ċwó3ûߘÙ#ı 1Ĝö dl Ĵiħ61‚QëyNĦÀ—Dħt,ıü>Êŝ.¨Ovż|uûñĝúp8ĵspp°=ĈyžĈëw÷œ$I”Ĥio=ġÑKë_ŭ´xċ(Ċlİizö˘gFÍÒÀÖKc­b˘ġM1E †c—ġEâg•1E'ˆĉfI~qÖvÉًĞÖÏqMW~r0âÇĥxú`¤µÁxT‚A ˜ “Ċ{?¸ûQyy@o²{“Éd{2™ìċy>ñn¨Ö§€&˘ŞÂW?ü àÛğà­hëepœ€„—Ĉ1›ŽŒèPyİñÔ| qġf°u% ""!}ïÌdÈ~ùÏaßúWċŻ_Ŝĝž)ókY–Ŭ‡Û“ÉdœeYnŒ™ĊŞ›gUÎsÀ s.äCÓg-P2aéN)³,Ë£(I)I)“˘ä òOïĈżŝm³ŝZ‚è ĤĤÂN釄vİ£ŒĜ¤ÓŒ5ğŒÈŸ C`TeF2ކÁ‘òğ(ß˙‡8_~´ûċĞßó`tÛgï<Ï ”ĥÖ²µVäyn8I’¤I’Ĵ\˙ì—Û+˙ùïMr8֊tîsF ,R?ÓĠG˘ÑŻ3¤¸i™Xüıï!µÙß=ÒW=¤^rĉlż6…e€Z˘ĦˀÏëÑÉ#k,FN€“¤ËŒ˜î"{ûûx#µ·TQÜÎóüÁd2Ùġ`TÍÛÀZ ”ñR•)Y"²W>ú3fĥż· ğm½B6à‚]á`ÄÓÒ ‡*D…&Qí¨‡ĵ8D˜ĤÊÂ1C@ô#@¸xˆìg˙|í;ċ7_:÷=¨â­Édòép8|8÷'“ÉDk­:4ë³ À|ÜçÎl)$7T $P$k-i­Ċd2™TD"ŠWèĝú ï>ÚŭvĥŝĠġŻ@P H³—ÓÀÜüÜğ@Ç6(ħ_GVµRmGȃ\‡úäŸâ|ùÉîW_Ŝúîx<ŝd4Ŭ>88x8òL&·Ĉñŭáp¸3GY–ċžÈ0ĉ=oġpHvÌÌ”¸c·{J³úIUùŝµ{S f†µVĴ-żÜû`to÷ÑïÜ|ĝÖĞĉÂ×ÜxˆVa•ĜB´ï#™ HûsFápm°`šÑ;tXp(3%½ÒG- PıĦä‡oB½˙ñ…µÉÍ+g70™Ln ‡;áp{8äyžu€Qġ™ c E!²,Ûëġzƒ4M7_ëŭÙ'ż”ŭWa4ˆ$Ĝšn }aËt"L J‘+Şf‘*P˘%ûġÏ”NêR# fŞ )Ö6“qi§‚ŞsxFf´ P§%]‹ü(`„n sĞLÇs^{ï˘ÑHAkŻßÇNƒN¤D*0ö=lî zöƒ)Ë²Ì1jFƒž\;Ċ•ŒˆÈTdfÖ[|­ŒTö[7vï}Q^ùš›/A S A.í´$$8`;œJšÈûûpU~óï‹ÀWe¤|„@,@‚ĦîCò6Š{ûšıԃW^=˙s6êÓñx|g2™ÜÇG£ÑŜd2çyŞy/Ĵ[”%-s,ê%َġ‚’1Ĉè<ϳ ´ÖFk]j­Ççzúà|:|ċĉ;ż~˙ĈêyŜxMÊË߄è%‰W0ò›ĥ֕EŽÖÏvşƒˆÈÂϝU%V>§ÈgX^ú̎ÎMĈëĈ@ċԇ߁½ùgöĞ{ž[üx<ߍFw}f4ô`¤}OŻŬ‰"Öc˲D–e²×ëíöz½ûkÙµέëċ‡“•u `ÚĠŜF4o'‰ét‰ıŽBµÙ1‹tâĴËObÉn.ÑÁ;ĊĈDË$íÓ`%햎’llĞ<Ä3ŭŒž~f„nK‡àvÁ´{F“L£,ƒ p~F @?ĵ}]~e%ú ˜ ïWÒ8>;RÌĴĉUŒ/ßiš™ kmıbŻ_Í÷·Żï|³|ġ·WäĊ/A¤ƒéĊO¨½–ç`*ċF<ŭ7kt³&ח•LċÏäĉˆi( "0—0ğw oż‡âÓ7ĦïĵÏ6]ŜX½ŝµó²ÑwŠlü (ЇY–=šL&ğñxèéŬ…1Fwôf‘]@‡²£#dIheHŒn*¸ñ,ù́Œ1lŒħĈ˜R)•)FiZîœĤw^¨+³/m˙âÇöċ™Uqĉ ’ç ħz"íıuĤ-„µÄUh ı?Ż+âY‚% J:Ğ˘(šŝì…<]`£zxšHşŝ%\‰Ž"ÀFx:`¤”Ċ8SA(c—…D”J˜‡×ĦżËW{âZ1)îċyŝ(Ïóƒ˘(2k­ŞúC­ŬWy„˜™œ5UB¤•1Ĥ0ĈL´Ö JížÓŻßú‹÷m'={F^x’W~ òüKQܗAh%hĞF`S€ †-3ĜÑ>l‘ÁŽÁĉCĜ½°}˜Ñ.8!²F§ħTi,T?–ĊjïŸïm§òÂ#kíPk=,³ÉH)µŻ”Eqà•²GŜ}µ˜‘ueFfA†Ô²xĥzèŒ,İЇ$Zğë N‰µÖµÖcŒRJçyž÷z½IšĤûáżÇñzÇëg˘èŭ ç˘5!ÄZa³³ù{ç†÷ßŜÊ •Êą2ħBQ܇èŸÒuˆĠs@´Š ŝġ@% Ŝ* {ÓOFȝ×ì!ÌÎÇ0 ³ŭ_êНWżxñ—1ÙOF£ÑŬÉdr2™ì ‡ŭ,ËĈ^!ĝžfà‡×żpüĥA/é ßï?*ËòŝċñwŬIŝ“żdóħÛĦi˙ħ’Ñ³}–=#:~0ŞW–¨­IH 0ÑñĈşXġħs³n^2ı˜C˘#Ŝ^İ|G^Ÿ)Iĥ΂ĥžAâù'Ò.ĜğvµöÊÙ§ FĈ0F£²^ÓäéÏĠ‹$!ğöœ)wvXß–ċvžç{£Ĵ•u ƒ†Ÿ½€£[­µÉóÜZkµµĥ,Ë2/Ër\–ċA_İíW“äú+şĵüà“Û_ÚïOÎîgĊ@3El,ÀĴ´oì$e'Ĥò]J$İ$Š4y%&‚¨$Ñ0:gŭèÜ3—ÌĴ­µ…µĥ0ĈäĤÈ&Cc2­ġDk=QJMʲE1.Š"÷äÊ÷WÔf{óÊvÀ|ş÷dI³†fí²×AEBñ dµÖş( Çñ8I’ašĤğiš$I²Çñ Š˘AE)eMˆÁĉšì‰$B¤DQ’)^Wv§?)ÙÑÇÉ(WfĤÒpT”:v .mIĉ…J­U2ĴŒBÄŜX‰Ç›+½G—röCbs·,ó‡yeÙ£ñxĵ—eÙ0˲Ĵ,ËRk­­ĞûuI1µAYTÀmŒá²,İʒz½Ŝµäîġнë_ŝ”Ο!ŠÀ\¸–ħ/6Ħ3z u5‹´şéf‘’–ê÷QcòçJİsP›Tiˆüb×;*?}—_îË÷ŞŜQžçeYf-KîeİŬHĤ6 Àd|™ˆÊ²£Ž ĈQvŭĵ¸#°µÁiÑ|Y0jdá‡cÏM†´ Íû}[Ĉ|qzŝÒş!˘‰²Sshr `çY1f³mĉ€‡˙lâùeşEVè6ȌĜ£‘êŝ{DDN7"ŒŜû œ-w÷âÄÜ–ċv–eûY–MŠ˘˜•™,™%%è-àŽf ˘Î3Ú#‚ÑqîğúH‹@iı!Ü(´ÏĠB@Zp0ğá1ó|-ğY˜—u}VΊV–”eYĥŸĤéözz˙ĈĠÍżr#?s†˜Ĥ ÜCúÏ)aÎrdË oÜhĴSL™Ž7:Œú0ç\fÛ+ò‹H]éâ']ç‡ĉ•É£e‰—ÈJçġfR}_:ÎĵxNY–.fß½öiúw—óQƒ•=ÜkyÑÀ(ÌÂĴ8D™Ž×VĤL;E‘PJèY¤“˘Ô0ó(ßR'[çW•ĥ0TÂL†c#žE`˜Fĵ„…D Œ& ]]<í÷ d,(Ž SÂĝŭálı³—$ĉzĊĴkeGíŠÁâY¤ö"¤ 4/ÑvÛ˜ÑŻY¤'7/ÛħKÜg‘ ħ€ÑPšilësäàóççdÑıĦ%ú ‹ÎÙQ6 vFĥ‹™YĵµVEQfY6é÷û{½^ïÑZr÷ĈË7żz#ÛĜrUúŝìÀ(tµ9n0šž-á$„âUä:Z]Kk Ѝ9v٘ŭÂ+5Ì+Ù5n›şN8c²yfş7 W&>0êZ¤vY0âyeşĊ`TEeë%òjœġ%Ìî-”7ߗúòŭ2ËEñ¨²—lş²˘yR[?Œ[é;=F[fÂÇJĵxŽ"˜úÄ}£Çè'-ډÚ燃óµ‰x\0Zĉœ-“ÉÎÛ,,Zƒ„nŜ'ȒFEQ‹Ñ²ŭ¤°GçBtœ›ö}ŒhÉóµÌ9²KüÌsÖ ˜0kß(k­)Š˘œL&£~żżßëġ•·?yióö—?ÍÖ6(JÁĥtÊ $ÀsÈ Ÿ9:ÓÇFĠ@?ùĝÄ hıŽ{ġ;öLğâ.>ç,ğ™ 6!ùŝQ$„ˆċú™xl,uĜĞ]k^Œ¸3 / Fö(†Ċ`Ä Ġ@ġÔ)œ`éäÊ[ïáË}ñħÊĠƒ<Ïw‚ìH£{g^ınÓîI‚ŜQË?Ëô‘Ž N˘ìÍĠ{?Îìh‰~ĉüÜΖ0˜–Ħ£ôĉŻÇÉbyÉġgçlj(XßBk­Ë²,‚ı¤Š}r3ùwó‘‡qùl3£°ÏƒÏŒŞé[Ï´ ğáĜ8ˆŸË–Ô?wÒ˘¤é t¤áù’xm=+7 kĴu²ĦsÊp³ËtS0BÙ#sxÇÊ ö†kŞe£NŝKÄ“·†Ġña?UûŜÑ^–ecß;š7ğìèĵàv” ·Ìn{Q‘•L@·Í"ÂÂħQĵŸ”şJqX-َLâ(@4ï<µd÷$›…y믋mĜ°{`Ĵµ"ÏóÂ+Dì÷z½‡Ğه^\ßùÒ½2Z!Hç›fĵ’AíâéQx‘;ĠĠ ˆ Uš&RJĜP`‰kô™dI'mİñUĈ|ʧbe#É ':Ú .[>BÏè0ı,éĝ2#îz Žl˘Ħ”™ F ŞçŽlĥâú/ñZŠJİeYîäy>.Š"_PŞ›×hžU&⎠%füL êÒ˔–Í”–ĦĊĊŬÏŒ–è'uuôZÚÀô¸ ô8;ċÒŬ˘Í‚]2; K“mEôvfnÒ]–eyŻ×⤇—ôOn܋˙ÍŻÙlè3áw†ÏŒQ}÷ñ‰¸_eHIrÓaÔwb2£“ÔC˘E Tİ4È^żOŭÜ?È|Ì&0Ì Ŭ™‘¨,ÏÛUğ%Áˆŭ2ŒTi·Q•§ġà*^‘ äŭŭáŭl#Ġï{U†J³ôċşYŜ>‹†AçíҀepxNaQv4/È-mr„RŽDŸy‰n(ıS½°„7ϝ–Ĝ,êí-+'³ÌpĊQ7³Ö_×<–íȞ,Ü Ĵ.˲ô6${½^o{-{ëŭ³ĞżûĈvf{\y³ÓìÔÀh&Ûî À¨>kÒ1½Ĝ@Ù$2,Zƒ8Bì}Ħ{HKOûbqŞ4n‰ˆÒŜ…+ë@áO( UsLtÄÌÈ.p—í#k(1Ì#÷3%‹İf(>ŝ9^ímÔ˘(y7Ĝ°w4/3ZÖ •—È”eDO’!ñ‚Û–*ˆžĦ„7˜şĜXp^ÒfH‹2Ĥy™ÑĴh<+C­ß-еÖı;†î²ŭċíä·Ŝ Re °q Ï:3˘c£ú9Ŭ„½Ġ ˆ™NÖ£ĉ,’,ËR/ˆÁ]ÙùSİ“ê‡TQá)ߑ”2‰7ϙʉT\rĝ;Î^‡êĴĦ×áŸÁqé‡_›`D­×]9áŠD@}úâ;ċÙTż7Éêìh²DvtTU,ħçcèC< (-Tx€h‰lé(À„à´èü×9{œÍ¢µ‡ċ:ە%YkÏ’&U–´9ùÑ;›+żóò^İcì4í{eşŠŻÄö˜À(ĵX­ĴÇkÈu´ĥ.E%°*[$Z2&ż°ƒħËó…²AÒۖÇBˆ8Ŝ:żŞ50ƒ+.ž Fm"ͳ£,݆_ÛŻ- y°%OġòŠĞ²ĵo´W1ëò<ϔR ËKçÌĞïÏ˒şöu˽#Çċ#–‡ĉ·EÏwbÀhNĥ´˜°œĉípKÓl™óħĴÓ"ğ÷RmQa­­4îjġ†4M\Ħ_Üߋċ%R\÷’ì3£fœ8>0r/W"‚ SÑêfìĜvRʸeÔGGˆÑ/Ĵt–ĴyW”ïŞd÷ĥΰeÀ0ÈğĤr°ċ˜ĞŒŽ½L×zn òLw‚15.=’,!úÎ5àŝ }ħgßÉÇċvY–ğyž”R!³­ĥ,ŭvÖ²Ĥ%Í–Ç HGšıżŸDš” 2Ĥyàt:îsĥh31kmÍê„ğöšĴ1Ĉ”eYĝAٝ²,žÉ~ôÎj˙›—GĊP:ġzĉ`tleşĈËċÚĈ@´‚ÂDƒ€ĥŒ•ù3Ž=I´ïC@H^ÄÒhLjȉ&²q_vA™î$€‘µŒñ¨Œ{<87XƒĴ#läü—DĥÍZŬ-Šb'ÏóƒÊ ÚÒ2bGÉ – x³ž‡Ž!°- 0ËŜçy˘#–òĞEY.áš<êy{œ ĴMMÛî½ĞdW—î޲]–eYžçCç*;ĵ{˙ŝöûÑĞa4`Ž@Ŭħy#>$ˆPı’)€Ä Ĵ†6„hÔ'NÀ573MŒ˘ˆĵse,L£ĠÍh˘ u(ğ5r‚§ F §ÄÀ̝`DDS0Šl܂İ„Ŭ½{˙{)Á{eY>,Šb·š;2Ĉ̒ZfqÙĤôĵRĈl}²e_ĵûġy½7<çnj÷ò8ŸÍq}Ŝ˞{|ëç”¨­1ĈxğQQğeY><—}˙½ŝ oÉpF˜çŒZÂŭÖ¸xŻ W2öNÎ1É(Šèí“ÏE†tTc>é3¤8ŜĜH&*d(Ĝn0â9 é)‚À(2­mwfÔzĞ-D, _û1Κƒ!ô­*;Êó|˘µV­Ù£E²9³êĝËj^â|òc<î¸2Ĥç> z’’Ŝœìé¸?÷ʘ–}|×B˜%ÍĤŞ—ä5îúŭŝ£TíŜşÜûd÷#ħuL€ˆ§3I/ı-À ıĤ@mAqҍúÄ şÎó”ïXJٗƒÍx¨,ŒĥàvŞŬ żOFìg’ĝ ÁHkF–ë™`DÁ[f0P•w#³{êîûüROĵdG˘(Š@Dġ(nœsçf—ÓĝZôúħÄkŭÜ >‹'‘ô9NİĤÇYkÀcdHppċ)à£<Ïw˲|xĝÁûQşĈDpŠ l_<0‚WZ&Bˆ^`e.+[ú“”=M@zlcÊ)–ˆâhe½Ï2CͰË–£ŠΘg;~40bëĉ–ÉŒŞk‘Ĝ•íHŠŒ­bo/2ċ²,ċy_EV–šĦ̰Œ‚ġáWş ?#ZÀpz¤NÂı[2ó[fíÚEYRY–*˲Ĵ(Šƒ²,·òΧWVÔó:2DôQuğ'mXccĦlƒĜ ¤”óÀh¤˘dw$c>"Ş2¤X‘¤ç/­ÊwMuìŽFĥÓE²yߣ‚Q[>o’iÔ3S`TUYÂk”b·qáñ6ԝ÷ñR_|˘rµíËu£ƒ°ó è)+KÉèôx~Ë}'ŭċâ0İĈĥÊI!ÁĦħîµÖş(Š<]}xQŭ蓛ÉßùudcG‡qAö9£İGş{O`–€`˘âġÔY™ÇRJID‹‡ÜÛ ôTÖÍÓ*ÙYŭPlċ›$ç.nXŸyˆˆ:µëf‘Sg°ċc£°Ĵ×V[PÊ˘(ÍâÌÈgh$ "– I}â“71=ġmùqée‚ĥ´A·gG§Çéñ ó¨YÒĦy¸Ÿo }M)U[L”eYÌ`Ö-ëĈyšÏs–„À4OÄV˘Ğ~\bO)ġh-ëŭókş„U‡DL2(y=ç™k'²jK@ôPhÙ÷Reg.0ß¨ï™ Ç> @Zj(ĥ˘(VĈ|ñÚfRT.Ğu*ßpI{Ħ<5Âúbs½…—Ĥ–Z Œ‚l‰bĴBöÁ›¸,Ġŭ0;ZBDġ(ž3§Çéñdß)ĜJ"…ž0jÏ‹Ĥ E5J³$áË _+ËrğC&he†ÓìèôĝËÒÜĦX"žaGëgV€&ĜÇ£p´ˆğ`d #ÏË£‘÷`a @¸Ħ¸ñ¤¸ċİŜ; ¨ŜG„=͎N1Kš';sp<”-ËrWkŭ˙òâ'¸êĥÄìó™…żšÒÍ$‰ıŽVŞxZU ĉdFÏĴŸô,{H³Jy!İA !˘x}£Ï X@Ûşü`40–£àrÈ&ĊÑ3#£B’“ ’uû]Ä÷Ê-Rï+ĥ‹˘Ĝ÷ƒ°]2A³v8͎NÏy–,!'äe ϸÛ/ËòÑfñ³kgVlI^ŬÂÊ>Ï`¸Ħ_ z(ì…sH¤†ebó HK;Ċ !$ĊÒxu3)”c IOŒŞzžm>G‘+ĊG#˜ħ  ƒòĈÏqIŞûFëP&¨˜#´,î4;:=^Ä,i™RŬ\9!­µö½¤Ħ”½5zÛ Ê áÊ]°‡ĠóFuûAğ IöQj‘¨f‘äc_è iÑ%!y@ò* ëIÉìĴ‡Nƒê³£Cy7žĴ1(ŞĜ£€Qo” !`w>?ĵi.&ü§zïyZê<™ yĆÓìèôĝĵdFËS'ıÁZk”Rßüí–eı½UŝäŬġi˜µZš!êy#6ÓF1 -_‹< HçĜ§ H‹†bëëĜEµ9ß`-ʔ@°Ê‚57猞Œ:ùa0,²ħžÚ˘Œ@Ŝ€A‚@‰@ñÑÏpGĴÊ{eYîäy> aOe‚NÓcı’Ŭ2ĉƒ! Ù²,Ëö ìċôG$c)Œç Œ`§ä @P(ІÈëÙ-ŒĊO NÂ`lûƒ HϙOEo5Ê4ƒ„³j`t,Ċ*ÓÍ£2·Ú>~f Š(0nCŬû˜/§ôA5ë³£AĜeÀ¨sŸ–ëN°lwT9ĦöĈÎc*ĈŬĜĞ€oŸÓ?ù`°2`çT™÷ùÙ¤ç ŒoKP—dPNĠ¤˙ê˘r?óáĜgĠCš5["Ï´s5ϕġhìEK­>Lj˜ Fĵ\™n 0²NĞî1Á¨¸#éŒË‹obĞĜŬLyS)µÓ1Û.Í%[:=NÏK–tT9ĦzPV)ĞAÙ²,wdy˙ÖĊŜöûY$GphŞ€Ÿd0ê¨f²……+†]Xû21ùE¤ÇOúʕëVÖLBŒj'µsX”×ñÁg”óŒ`€<15²¤çŒ‚™ħÁ$ЁÀވ˘HâñÔžÛ’ŬY—K)xóìŞġôk"xXneA FîY¸v£h;½2€|˘FĥUFdv‹B` 7ßĈċĜÜĞ<²,fYVÌQe°XÌ(jìO³£Ós’%-KïdĞZkMžç…§€ï*^”oŬhĠ³íD5ŒòœQüG ȕ\ġ&}'ÖÊüY:ĈvfJD$*Ê7ĊñÚVß0ƒĵĠÁú³G#ĉĥwd5Smş"ÓSÀĜt˜6A½ĵ„ä<bByûhû–>Ù÷BĠ²,ĞÙ£ÓAĜÓôxò,İ+S:44ÊzÑĠGċ›ïŸÙVOĠżÁàF¸<é`äQ5à+ÓÊ9ĥĤ~{=ğY™ÑçÂ1vĦJCEUıÎÉ­­*ı£,\éÓ Œ,Ĥšu]eşY`d £(ÌÑÀ¨eYᴐ„ó>Šàaó‡F•÷=Ġğ"3h,ÖŞ;͎NÓñ³¤Yƒ²µ xQ;Ĵ'÷.Ê÷‘ˆü¨yİ1>áY‚\oƒ œU{–ƒ*J)eE'ÎÊüYÏ!úŞ É#xŻmµ°ÊÑ­µG*ÓÙ=£Y`²zö`D­T‰E9ˆ`ĥoÂ<ü”/%¸ĉa÷‹˘ûŜÑ,GĜ£({Ÿ§Çi–tÄAYcŒġ½¤ÊQöÑYġkƒ•U™ĦáMħ -Ŭċŭ,ÀÈ{ô°­ċƒ -ÒPİĦ#Cz&eş“V²kÜîûmÒpqĵċ…#áVÑÎv,ó͞Œ˜Ş™£Çˌ¿Eħġ$ŠëobKíí £nWċ:Żê]Îq„]”%5˙Úivtz|ŝ²¤E`´hPĥr”­(à¤Ŝı}ep{NFčMĉ‰£:šŠé—\E£Šú{Ŝ˜À SkxZ€´´Jƒ~ ցRo-.àU‰œ…y MrÜQÀˆaëD•™gı>:µ 1Ĝżn;܆ş÷>^ꉏ=³ò<*ŽÓöô8=>ǙQûĥeËwÖÏ$•EQŒË²ÜSJ=—Ÿ”eıdGmGĜYġîÓAĜÓôX L‹,*ş6|5<˲I5(Û/?ĝÂÊÁĴA2‚³àçŒHei€Ô ĵÀê‰Rk'h1UJß9bC=šŸĠ0Á„™Lçzè#ĈĦ9£V™Vy°Œ"×OF•Ç:(&€r”·ßĈ•„o+–eıx)­w4suŸ–ëNÏqÙnEtUçyz%m_żĵKɚ“â˘ċ&{‚Á( ñ$!˘bħŻ‘˜ĤHtRÎçÓ&5Ìòà¨ÊuäI ‚ˆ"‘¤İBŒ ël*kWğŒ*â°.·Œ§ÈX`–éü´>;ş} rïÚê/´ŸçùÄ÷Ž—Äp >§Çé1?â‰ä µ6•èjEnĜÔżxïܚQ P°”ž0"é_›³…ħ$,DâËuÂÇÚyTïyƒ²Ï ђ˙~hIJ)|vĊk›Ħôk€"ѝv&ÜĦ]痝ċĊ`¤•Vö‰ ì˙ELDŒòĈ›¸$‹FëûeYîdY6l9Â.xyJġ>=NĊYÒ:Ê2š^I£²,w´*\ŠŜ߆ˆAU†ÄüdF˜ZPÀ‚µ(†2rPU R-ˆÍOd†´Ĵç@EUŠQ$WÖúĥ"ÖY€u€"ĝnŞvw„ïCÚt3œ^‹\?Ħԁ™!W"ĜŬOa·oÙK ŜШŜyž•RċÏ£ÓAĜÓô8Ŝ, XÂQĥċ•´Ż”ÚŜÒ?ıĥşşf]Ù.`Û5 £CÑV"2ÑÀ—ë"""?‹,7û™gK'݇)%*~<Eru£g,;˙£ZN½Ù³9d×Z~˂QYÍO–ùsF‘„ìK$×ßÄYs°KFŬó"Ş•2C9G*hYÏ£Óìèô8=Xƒ²³ôí*ݤ,Ïóƒ²,w…Ŝğ}}Ä~=:ٙQɽ'[€Zôà„Ğ+ÉuO‚Úwŭ;‰Şd'„ˆ˘•ġİ7#ìĤĤ:taı̨Z„$(" <€şûöpgGğ^Ğ˘zŸz§Ç³ÉŒfĊEċ;£”ÒeYVä†]ÔöúùMÈ8ڗ'/3ŞÁÒëŻ!ĜPÌĴ}Ĵí"R=3p'd8\°–1ÚSXk³Éd\(íTHPm„~F žĦÀu[Yši/jñ`Tí>@‰EċíwÜÏ6„~ż,Ëí<Ï÷ó<Ÿäy^´<–)Ù§ƒ°§ÇéñYnŠçy%5e½Ċù$Ïó½²,·7ìğï]Ĝ™‹Òİ7SÀĵ{–`DĦŬ:;Û z‚³ÂZ›cJcŒĥÖòÄê­d‡ÀkŒ1eY*cLµí~έG%çê òU2ê,Ó-#€QĉúÉÁ(Ô­ ˜ċ_àJjï(xažçyK&È,‘aĈNċ´\wzœG/Û͢y4úş­TÀ+rƒRêáĠĝ—w €éì³£ê琉Lµƒ3ŭìĥ1fdŒÉ”RÚÇĤNâԋ^²›…ĵġĦµĉÒ²,wĊÏŝċ/xûÓħ)&n86ÓWMG# Ì ,?9qĠÄ "€½ŭÄÎmu>²ï*ċy[ Â6]RA§žG§ÇéñôcÏ"€:¤îe'yžï*ĥ·ĝïn%ÚĊ#Q{%={0ò)|ĈÀèmlÈ{£ĞgĝJİ=cK­5ÏùL^H@â)sŭŬd)o#ĵĞ”ş·ŝ£X³Q7ÌZíÊŜ~.…ŝHŒ˘4ÇFäKu"ŜÄÉ ĝè'¸$ó{F•w‹˘xè™uıÖşÄrÌşSÏ£Óôx:YÒ˘ÁĜ.7Y£µ.á.EħmTv÷Jòö]GnpÙĝùDñlÀˆ¤ß,GN•Ĉ–Zk³P?5ú,iћédäy^fY6βl/˲ûñ'oŝbġÚ÷ï’ƒ­‚.‘HêħC.ħMĈ\^˜Ú<ïÉÁÈ9Ár£ĝä§à[×Ìo•eù Ïó½,ËĈEQäK¨zŸž§ÇÉȒ,ĉPÁ½ xžeÙ8ÏóŬ²,œßФ4`†`Ż>ġ̨*Ây7é]Οµs“Û›+üË<ÏïûĜ:ÎóĵÄÚO£¤'NÀ‚¨żŒ1V)e²,+&“É0˲yžßĜúċ?˙óĝáġĦÉw@İïÙĦB#!xȸï–Ş4OFp`ä)ŭ „o£xïÏñZO}ÌŞ¸‘çù,ËB‹rƒ£ÏR½OÓĝ³¤™ħKÌ$Ueğ<Ï'Y–íEñêàĈ—Wü ³q1IĤŒ*‹Š§ FBÖF|ˆW”Àî÷p&şu—W˙ĵ(ŠO³,{àckĦ”2~6òÄ8 <-@ZTŻ­o÷€TŽÜħ3™LîNFO.ŝìün´{³0“mփ’[ÍÌĜ˙8fŬ1dFä$‚(ƒŒâŬ?Co÷ĉĝ|‚ŸEq/˲O­<Ìc”é4ÓäÓôĝœeF˜ĉeIµWR–eÉd²SĊ½Kћ?Ŭèë1 Ŭ&YÄ>~|ĈáµfÓy0Ş2¤( €GŠAñóü_Úún–e7&“ÉŬÑh´3FY–•J)ÓŞÌ#7<•8ô,çxFŞl˲ÔY–£Ñè`4mO&“›ċŜöğW~öż/î~RrħŠü@Ş š F–*7 FĠ9Š„Wô Ħüè/Pó§ö‹ëÑOŠ˘¸•eÙŭÉd²›eYċ[‘žÄöô8=NÏ&%KŞôí´'7dŝZż_ĊÍ_Yû³ŸJ\:p½şŻtìî ÔĜ!û¤˘ Ĝù3ô²ßú•³ßeS7™LnŽF££Ñè ˲ĵ,KÙšÏÌe ú O8-Lá­NĵĵED™b‡ˆ""ŠVé~tċ­"nÙżŝ—ġù2Ž7.×£ˆVħzúäeaĤ–üeĉŒœ†³Ê%@ô#ÈDŝñ‘ŭè—öÄÚwFYvg2™lO&“Ħïi<‰áŽî´\wzœO^ĥór9]ħİ Œ¨÷Ş—¤‹˘È'“É0I’í(ŠĞòŜÛ_ÛúÙÖ[żüĞ,Ï(žjŬÁĝ’žäRĤ–ıkJQâ)ìĜŝ.’Ñ_”żġkżOĴŜÇ7F£Ñŭáp¸7³˘(tÇ\ä˘ ÖSİÜDOk='˜ZoÜNóÎúwáߕbBDğ^P0ċ·ŝݽġßûËÖi´v B$°ÊBDĥ´µ– [†*ġaĜë0×Ğ')<áî6ŠD$  FñŜw1ùÁ˙ÀŻGه›qüƒÉdrc<ߍFû“É${ÂŜÑ)ĝœ§ÇÓ/áñ`˘‚^R6ö”÷”ÉÙÁGÉW6mïÚ£×ÀÉ%‚H$€.|lñ½ï၏B!Äı/³ŜŝcĴë·&żŝġKAĴŜÇ×G£Ñáp¸3'EQ¨–NÛݳ¤ĥ6û`=Ħ}éú3KiœRœ*=!A żŜŝcœO>Ŭ˙µ_½ô]­Š÷ǓɍÑht÷àà`w2™Œ=‘A͉EÀ’nÏ+ Í*ŬÍKġ[cŒÎó<@N(•™™µV]U1~´˙÷w_ŭÍóéĠ/“œ‡°63 ˆ †›# ëÁÈë=0IŜÀŠ!@1jX %ŭàLŜüg Xüê3?Hü|âNĝ­áp¸=GY–eŝ„·•Ž*¤zzœ§Ç³Ë’fĊ$“żÖ3!„ô@'˜™Ïôïêßĵ˜ßı{盓äWRÄ1XıŒÈŞİ‡RĊÈ9—?‘Ÿ/ò·"ò‚ݰ°÷3`÷ğüĈyu獗/}?˲O&“É­Ñhto8îxV]ÖÑFXdóԏè)Ÿxj}_”k-)´µ6³ÖVzwĈkŜċ[úƒÉZûk7ï}ò5úÒo%ÑÖkĞ}dû bƒ —³6n'QoJX[PD ’.“p<"èŭ›Èòo—/`ôW/ŝP—ĊÇqv{4ŬFĈñp2™L”Rj‘Ħ탄Óìèô8=Nd–ÔĠ?B;K²ÖjM&“‰n²îPŭÍŝÒĞ“<Ĝŭ[ğç.`ċË@z @êûIÊ=­ÂĈ”cVħİ8&@[0¤ jˆÈXP9ĦDêÔz)&°Ê îˆâ½ï£ü'|Ĉ ÷zñüğ=qĉƒ|2“eÙ½ñxüp<ïŒF£QžçóÀhž$Éivtzœ'/K²­zY˜1Ġqݲ,‰UĴ­B“Îû}=ŝâıòÑK[êK×Üŝ•ûÎmr˙ „Ák€XqَQ^)Ü÷•Œñš‚QQò[Àî@_ĜWÎĜo|ġêOŒQ7F£ÑíÉdò`<oF£żI.‚ŞÍĴÂhk~&}›Àû‰:ê°Ġ—W_2ĝ^}Eáw)e’$IÒëġzƒÁ`meeekeeċ\Ż×ğï÷ŻPíġğèŭŽÜÜH^ú%ŻH6Aq .}–dÜzİ+ 69ÌÁ}¨ûŸ@ßŭċÍw!wïŞóƒèÑċsg>Hˆo”eù°(ŠY–mO&“ŬÉd²ïu­r­ui­ Ozğ‡dfĠ\-ğÓ éô8=YÄ'ZŸÚħIΈOUl’Bˆ8Š˘¤×ëġúŭŝ`0l ƒ­~ż.MÓ iš^˜¨äġ{;ċwö˘³%ĥbê]zWĝ ӗcĠ„ĜúŒjd7Àûżß+›jçW/½ žçù]?r²=÷&“É0Ïóĵ,ËÒSĥâQĝ³™QÍYʛí3Áާ HXH˘'>8ùqσ•••ġ~żżÙï÷ÏúpQÉô…ŭÒ#-Ï+g{róäĉˆÁ†SoÀì߅ş{zç5)Wc™­ö’ñz?ı·ÙOo(vµÖ;EQìEħ“eÙˆEQ(r/ágœì£ìJNËu§Çéñl@éIbSŸ„‘”2Ž8ġÀ´Úï÷×úŭŝFšĤgÒ4=ÇñVE[;#ĵş7,/ Çzġ ³ŭÂĈHÎÒ @rĈ‘Í=g·üV£Q~áLïѕKg>ˆ%ßô2eÛY–=ʲlw<ó<çy^ĝMò< zìĜô˘Ò˘LI.qâCPФ”QÇi’$é`0Xé÷ûk½^o£×ëm%Ir&ŽÍ8Ž7rŠ.íeê²2vPZÛ+‹2ЉU"ŻĤñŜz?ŬŽíc&Ĉ˜ħ1f¤”:PJÊ²Ü/Šb”çù0˲̗çJïÛ>ÉO’fG§Çéqr²¤ÇʔŞĜEQœĤiš$Iżßï÷{½ŜÚ˙Ÿ½ğŬmۆâ0ÎWÉNšĥÀve½ŜÖö-è†Ô)Qû ‘"Ä‰ìçnÄr‚óçĦiİmۇĤiZkĴµZë­ġÖúŜġòû?OŭŸżžúoëwÎ9ۘħos´FüŝÛŬ_w;ŭ·÷ŝWß÷]×=ÇÇñ8-’Ÿâ@ğÙ"9÷8Ğ7m9ÖĤ¤ÜjDg‚I͋o­µmÛî÷ûŭmÛûŬn÷µiš/ÖÚ/Ĉ˜{­ġ^)ĠJ)í´/<Žt3@7 q†Cß÷ż½÷ïŭÁ9÷ÔuŬÁ9×u]wŜû… …Ċ^;ÍÂt|ž)éÍ{SÛĥğĥm÷ÖÚğĤiîĴµ{­ġôĜ)­u+4ñuBĵ³k{ÓS\$˙Ż8ŝt8—ìMâ˙××Ü| V"óâë•âĞùŸcñŸĞom³ÛíöMÓì›Ĥi1{cLеĥñŞ" 9„úaşï]ß÷Ŝ{ŒĊíœsÎ?_ÇUGĦb_67HÀeİdëníŭn• '”ÖZOÛyĥišĈÓNÏĈûS£”2Ó1òĝ1—~?àrÎuÎıñxÚâġ[f_ŸVCAzћDĵìPA !ĵBu]÷|żÙgò$Œ„”rBˆaÂ8Ž!>'=*Ġ›ÂÊÖÜ|*˘ŝHï3µ^`BZš’ĉ+1›’R“ÒÒŞ$ġ˜żž\Ĝ>™‚ä‚)Fc"ŒÂÚÌt|š)I$vpĉħdĤ/éL_zmoZ[0‡‚GqoZ ¤­nٕnŬ‰…"ċ _Fjá˙*-úXXÜܛƒ„pĦ¤*²bħ<ß2 ĦTۛ„¨ĵÒV·ìJ·îäÉH,N 0È*lœV•O"$ ?Ÿ€Ö-|ĝtœŬ§–ĥìN{SÈ,huĤ/İÌÂ|mÁœëMk!TFÒ§.9!ċĥîÄÊöLŒğk…V™-ÂTÁ…Hßğhí˘„İïLGÀĉ§¤’ŜTÒ£r;7ı{5‰L¨„‚ ŞîMı0Úú–Ŭ9Ħ”•ċÊĴ §£’P +Ğ“ħ`{Ž0'”dE8ú“eğ7˘"”ŜĴ7ŬJ J%Ħ£ß³4K‘UojK°ô"İoRp÷šŜ$WĤĦÏԛJ&˘loşĤ@Z+|àİ_‘™Šdĉ˙ V"bö<>^UpŸ2”júÓio:íQoћĈ…•şÑ`ÉÇNŞzÓµRM(ĠÔZ ‰ŠÑ¸ö!ŜŞà>e(ћ4– Qş"…έ>rE™BŽ+_+)2al3”Öz“( ĦÏқÎ>Qw­TJ˘ ¨ıÓtç]·fċAÛ šŜTÒ§6Ŭ›9ÎY‘ˆ•_‚µ0Ê]hí E!Î{ˆ0'”ĥ›JviÎêK·H5+’µUJÍtTRĴš½W‚¸Ŭié­{SIżıxoş•@Ş)~í/EiÑÏ-ê¸òš+”ĥڛ^Ŭ—n-ÖŠ_ZµRmA "€`:·7ÛŸ>´7Ŭb •ż6„dEċŝ Ĥ›ìM·H5EĴƒkĈdBÀkéÒ½éŬúTWÔ÷*:!à5ŭé½{ÓEúôŝôĦp“µÉŝ´™@€@HH  @ @ $$  €@€@HH   @ @ $$  €@€@HH  @ @ $$  €@€@HH‰@HH  @ @ $$Àü7żżb~ĤF?,IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Reset_420x420.png0000755000000000000000000024600212467662066020650 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFA-IDATxÚìŭi°$Ùyžï^_c{KîûV™µjA-@ AEQ $CRd“˘4¤Ô­nëž=?zlflÌĤMmê1µşGÒh4’ ."A‘ ‚X‰µ µŻYıçËÌ·ÄĉÛ½ßüëîñ²ĥĴ„ß²Ĵ÷^ĵxñâE¸ßç|ç;13êUŻzĠĞ^ġzğ—¨_‚zĠĞ^ġŞW HġŞW½êUŻzĠ€TŻzĠĞ^ġŞİ^ġŞW½êUݐêUŻzĠĞ^5 ĠĞ^ġŞW½êUR½êUŻzĠФzĠĞ^ġŞW½j@ŞW½êUŻzĠ€TŻzĠĞ^ġŞW HġŞW½êUݐêUŻzĠĞ^ġŞİ^ġŞW½êUR½êUŻzĠĞ^5 ĠĞ^ġŞW½j@ŞW½êUŻzĠФzĠĞ^ġŞW HġŞW½êUŻzĠ€TŻzĠĞ^ġŞİ^ġŞW½êUݐêUŻzĠĞ^5 ĠĞ^ġŞW½êUR½êUŻzĠФzĠĞ^ġŞW½j@ŞW½êUŻzĠ€TŻzĠĞ^ġŞW HġŞW½êUݐêUŻzĠĞ^ġŞİ^ġŞW½êUR½êUŻzĠĞ^5 ĠĞ^ġŞW½j@ŞW½êUŻzĠФzĠĞ^ġŞW½j@ŞW½êUŻzŬ Ëz³˜ˆêW·^7úz3R_Ŝz½Ù‹ùĉ:ÌĴú-­W .oÈcX5ˆĠĞfHġŞ×M6oÖ}·ûX‹‚ oùԀUݐêUŻxè ˜7K²m<6Í›EĞŞzĠ€TŻz½IàC× ×ûsoĠßĈ×`´XQ RġŞİ^ġzsÀgQ`y3@m;÷mŜ‡d>ŻLjŞW H׳>ŭéO×ïÀM¸>÷ıÏm ımŜ}ĥT‹‚Í›HóÇĴˆĥñûİOúÓ5@ĠФzŭĜëzóF2§ëŸEnç9L‰K€ézŠËŜ· êUR½~œhÙî}—-½,Šß€ïñŒİV<ƒQќŸ] jpŞW Hġúq Zˆĥó3ÛeT3ADz,a>NÜ'IÎ}ĵ@âÀ2ëv^ûUŭP‹T͞êUR½Ŝ‘ ´]@Ĝĝ\PÙĥM ë )%I)IA–e !Dö}I&N$ğ €Èß&$ÈncÓŻ”b­u~ƒÖÙ÷³Û•R:ŭRs’$â8ÖJ)VJq’$Ĵ”Òqó€TžEİìĥ× P58ĠФz½] ´( Z€ŸÊûÛĥ-ò`cÛĥȀĈ²,KJ)„ÒÜ& XB""ADÒü£ìĥÜsÈTñ{#0`f Jl@‰Ç¸¤Yk­(fÖ ”ÖZi³”R*Žc”ÒJ)•$‰Î@+ CmKWÌ˘ UĴ=•1¨YÒ ĠàTݐ\ŻüŸ˙W|ïdğ~'ŻsQyèàëe>‹|œuÛxž'-ËRJiÛĥ´,Ëĥ,K²„ÙRJaÀÇ"" €m>—Dd™‚ˆ$iGy@2÷É… ]†-13k"Ê>gÊ|?afĊÌÙ牧„™­uö1E¤ôëX)•ä€*I’DĊqœDQ¤˘(Ò%@Ċ3@iàâ(ÍëyŞ'ÙBĠŜÂu˙ŝ$ ĉˆ2ïŠ2/;3 àôS}ó½äïx@ŞÁè ˘E@¨êĥEO%Ùĥ-\וŽÛĥ…mÛ–ëş–8ĥÇJ)cÈ!"W‘}î!l"²ĜDäQŝ rÀd™?cMyD$v?ı"]ÏÊRGɕŸ[7,Iç6ùŒ9)D1€DkH ĊÙG3GĉĥHk3s¨µŽsŸG Â$ITÇħŠ˘(J’$‰˘HA  £RŞ'ž! Aİ  ĤùݧíŻÑ+Fd`¤`”½ĴĉvĤhĠ İ^79şŞŸÒŻ‹Ì'>ĥmۖe9RJײ,Gá!:Dä‘KDž”ÒàQv€#„p÷Ŭzçnrv?ıʚ­F§5Ww¸ Îî=¤-43l!°´{_#OŭĦ‰f*·c3Á°™àÊİ0›„0Ü܊“ kz—/Y% I˙êbJşÎv“ ğ›ŭÍsŻ]3Àj­‡fŽ”R3‡ĉß|?4· "­uÇqNħù§‚ PQe W€ÏaXUÒŜĴšS N×F‚ĈlG£Œ5`TKvġú1Ħ×x*(c?ëJÛĥ-Çq×u-˲\Ûĥ]Ûĥ]!„'ô„Ÿ†ùĵi@ȗR6„ iY}·Ŭı§½kÏJgçöҞ½ÍĉÒŞ6›Vcu‡ ˖ħf„Pš1R§ô B¤xô$7…@e*^š¸Š%Ċˆ˜ÑOÒ=$Ûm5§ÔÊò[ĥċ·lWx;ö6¤ „Š›}Y3%‚" ĵze ĥ’ŜúĠpóüıŜpk½×]ğĵŝê‹Wâá Ğµ(Ìu^)ĠUJġ´Ö}óoÀÌ}ÔÀ€Ó@k=ˆ80à„a…aADQ¤ƒAb$ë§²šSQĈĞ%½…)€ĜˆZ§_›zƒS³çÄüĉ£L5 Ġ’Üġ€hkĥm›,ËŽHÏó¤ëşĥ8ŽïûŽ8žeYžeYĝ4„#ħ,ĞED-)eÇowVŬ}ïá½'NíÙqĝh{y÷ßí,; Z³ħżĊèĈ qÂ’@šSG‚`)ûH%ĝŒ O_2R§^şì"l€ˆÍfŜmĴá³Îiú£W„sğîä6­‘ŭŽ´> AénE †Ö@ÂÊH~ÚÔ zQ!,éíĜßܵó@sÇ]î’D'†k—†ŬËçëç^ënœ=½vċgÏ›הR[ÌÜUJu Pġ”Rŭ$Iú@EQ4 ͇Q{ÒŻƒ9Uħ&.§50a,Óe/Qv|)#Ó0Ê$=fżµdWŻ›ˆÊ^„2D–e ß÷-ß÷-Çqlß÷]Çq|Ûĥ=˲RʆeYM!DKJ™1Ÿĥ˘-lïM­ šZ˜Ï5 À`$:,p—vù­wË=;‘8j 7Żg_í]{ùı+kÏ?}fóÜé Jİ ­ġ–RjË|ì)şI’ô8Äq<Œ˘h8(Šâáp˜ ‡$Nş‚9q mGÒĞċĵâ’s ĠŒŠ2Ŭè ½IëI5 ŭxÈrÛaCS,(!#ĊÉf³i;Žf,Èqœ |ÚĉcGёR.I)—×]9|ÏŭGöşußî#ǗViڍĤê1ğè&C•²ɀҀĊ ‡AA)(w•Èé˙Rb#’ôóé+ÑòÔù%žƒòïñhОĵ‘²—Û|ĉoĜüéGÍéĊħ–”2(¤ŻMÂİŒB!`‚ĠZġ:·­zÛĜyû§è6ôâġÓŻô.?ûÄċKϰo÷‰SòV¤Ó=çZĴ1TİHeS*µy”‚PÖu*(˙s̀”Zb§=Ê\ <?E—"+*ı{ÙĥÉEîUùüf|„„“÷!#G CQlJë]@baÂ-Rġ'ŠzQ·ÑqWŜġŜ=;ï}ïžğ~ŝWîŬ:ŭâÖĊ}ïÂù~û…`sŭ˘RêšmÛÌĵž$ÉfÇ[Jİnŭ0 ápTs*"òġĤ²ÚÍИ`Àh’Ás˘A‚&N˘#kxí²Ğ× DÛħf‹IN¸+›ÍĤċşíûçşnóĵ†mÛmÛĥ;–e-ÑŞeYĞRÊ;>xê‘ÇNı랝ĞÇNv‚DCc+JÏ.‹‚–aBҜ]ÒHTĊÖ˙ñd §„ù á…NyñŸ›Ä‡ŠojN•Â*ÖĈ£ç1ê—4o 45[ġ·D3=¸ĥvV)uĠqœĞI’\ó£˘ù€ĞÎÂLŒgÈckwHaqċe†K­ĵ‰7˙šdÒŞFʜ¤ ĜĂá*BˆÔÁ7jlhú+^çÁ{à‘é?˙äĠÓù'OoöÒ q_´m{Íqœ+žç]ó}+ ­~ż?ôÑ{ïù‡,:ŜŽ4c=ÑĜR–IĊn 2˙ˆ“ Şd9žAe”ĦŠpŒ&M\-˜ ÏüCĉá$Ï-͏˜QV[ħD˜Ol˜è ċ,ßÙTÎêK£;ŒM‰KÔĴTŠü÷ˆKR”H“3b­áˆˆĠ ñĜħ÷hçÈÏŝÚğŽ~ôoÜvċûuŝÌ׿áĈĠW-ËÊÀiÍ÷ŭġF£Ñ ŭĈ”ŭùÛË (Ĥw(ìܔ‚ÑxEڏ”ŝ]b”ŜË:­/q= Ż^oe´5FÛqœ˲vƒÂĉÒòá>öÉûîĝÀ‡PĞ$ \áĦ” Iš“*hö^7ÏĠÌ<ŸúpÙŜÎQ0p”Sž)é9á$ibTş­gô:Uğġ¨‘òÙ­ĉ“ĵl—/ĊždPÈ<š`Ĵ4ş/£ZĤ+†“/V6ŽÈ‚[J8Ĉ GBflv#„‚vÛnóáğ÷==ĵŝÄ7×^ûâïgpuí%L—ÇY3&ˆícq;’-Q!O›‹2Íħٛ éüGs Kšlœ­İ^o <7+Q{> ÑŞmÛ;mÛŜkY֞Ŭ{N<üɟ½ïä£Ĝڎ 5°kh#ËM°!ó‘( +ŜŒyŜġjž§” UŜVdBÙç݈ËY ó4ß*ĞéLÇÉqĊ†]Íŝĉ[ğıÒPQM› ²]îĤ˘d‡ò<ÍqÌPŞ|Ñx‹‡Éb†adP™ç:) š²$=n,ŽÊ4#ˆ4‰FdKıtÏc{ïıë=ŸĜĝÑ7.½ö˙ñğƒkW^̀Éóĵ5Ïó6|ßßê÷û}Ïó‚~żŸwċĦ‰(zçħB(oz[Κ;€‰ÒĞFV\rµXR½Ŝ|ynŒlۖ5›MŻÑh4}ß_r]wĊÑ>˲öí:|ôä{ĉçï=ôÀ;BŠž…‚‡ÒÊĴgHr #˘EAh6“à<p,$뙒ár ‹+ö.ëâjıoô[¸Êġ7ƒèäÏOƒCş³èBÙĴŒ!*2(šdBٞD•W×ٞMqŠB4ñ;8Sslîe,fìĜ3AH@0CJJ‡*Àċ4"ˆ5.G ž-ÄÎ{ß·où·?ħŝä×/žŝ‹ß˙N°qíe˲Î[–uÑĜĈŻ ‡-Ïó†ŭ~?ìġzqI%éŸĴ1ÛŝÎcKşäĜc™nôWŬ”yv5 ŬĜ@4Áˆ\×µšÍĤĠl6ŭF£1bDŽì²,kŻmÛv>zòñżñ™û÷ßûÀŽ‚%‘‚M—MJDÀD˜)PŬÇ2€ŠL‡ıFùçĵ Ž ż—§ä;ĉ 0*2ŸR0â™ôiĈìH!Ş”)ıÚqg\cbDE9ÖDŒÜp1 HÎKŞô€ÊjOyé-wĦMÄS^ĵ9oIG;JÇc(„,MiRŽf„Šqf3„ïHħûŝì_şû=ŸĵöŭŻ^8û•?ŝN°qġ8ŽÏÙĥ}ÑuŬ+ë^ó}żëyŜ Û톅ä*”¸İĜ’Îe6š„ĈQ—ğ04q×ĥïz½`4sà]™>"Ż‘Žçy+ĥmï6Ò܁züo|ĉC<ĵS‘ ‹ħF/I`3Ád"}Ĉ@$sWâ4KmZ€òÀ‘/ eµ˘\–Qj`(Ŝ–ż/—‡­Îhï_ˆêâïàr*n΋(_<{·§ŞîXΏÁˆ F“ kâÀ˘ħSr£° 4?™ÇOÈĤ|+ÌL&8ylˆÒŠ B0lM°•€‹‚P• DÓ˘u߇Üq×£{ןüÚùs_üŭo†Ŭ͌1wçŠ8ëöûŭŝ`8Ĉ9GŜ"2^•vc³%šnz½zò=ñ”7¨¤z½ÑĴh˘Näûô<ÏnµZİu<Ï[qg—mÛ{mÛ>¸şo˙É÷˙Â/½ûğŜÉÒ—"Í8+(í2ÖíĴwhô ¸Ä[;'¸4AWüœ ²ÛÈ~͓IŬ\!ÓĦly Ŭ_—ÈjEfÄ%ÄÓr]Ŝ2Ï#T°¨½à.ïŞ3}xµÌ×4 >1£qäÙô•™X$şô‚CûĈ&ÄlTZËbŒ{\ˆg0¨‰ß›>Géx"Éôx³“´eÀ"Â0TèE mϖŝŬ8të­ïŜ{ġ›úÒŻ˙ço™Ĉìócò}Ğ×ëġJêKşDĈ›F74[bA$ÀZd:Öj4Ş­ĉŝ }sNèĞ鍣*Ó¢u˘‘aĦÙl:Íf³Ñl6[ığ×ĥíÍċ~úo>tç?²_g@$pĦ!RéD’‘ċ²ÈĴZÙ#ÄóYPh󉞒Ò&Í E0AAĈ+7Ħñ„­ı߇RÉdó,b)pqÈaĴߗ¨ñó[dk,ÈoEô£â!c†4ùóıŬUċ71¤­<'эĉ´ç™ÑĜM—ÒscŒà´Ċ¨nÜċҋü4ŭ8uĉI kHI°†c 5£×‹Ħ-Że/=ŝ7n[y×{žûÏ˙öG›/ŝè–eħmûĵ8—\×½Öï÷7,ËvğŬ@Ç1UÈxelifméF%2Ú 1’éFc&FO> \-ŻրTŻëeEbž<×h4ìF£áĥÛíĥ1,ìrgŻmÛ\Ï;ú'öĦ{?ñİ£ÊmXW4°ÖOàÁ§&‚NiBŽİˆŻİĜ”ó ¤Q.ħ•Iuypš`Hċ=›7Ĝĝ1Šĉ‡2 Ä”ŒÇċÀSÁPtìċ†gĊ!$ÈÒ~­²\+e³ċĵIC)+˘ĴaĦuîöüAĈıÚÓHŭ'6hcA'–3zĴkÊŭ…x3f„„£ RB–fX Ĝ–À€W1$vŻhĝĊß{d×+Oœ<ó'˙ú[ÁúÚóRÊפ”lÛìyŜ5×u{½^o0 â7^Ġ%ÁĴa7Œ„—EħÒc™ÎL&A&Jˆò=ħUák@ŞÁè:Yфĥùƒ/ŬyñËĝ kÉĥí3–e]´,kÍuŬ ×uû½^/ìġzÑlI£Ü‰‡IÂKsê²lşñÉJ‚ P*ç!7#IÍÔPÒFUĴH "]Ó6îF+-­zž·Û²ĴŽ>pòÖ;?üËżŝîÖÑ[:ħfĵ(°4/ĈˆQA–#“ žg‹ğĈŭ’Ġ¨˜{4ñŒ_ğ´Ŝ‘×2x䪛ĴMƒÎ”,7!£ñdó*WÖ$'3LW£YWK~ùŸ1§rp –r=èœhĵÍċÉéû)ŝNä–Ğ7-!N½ö# )šL­ ä@J#ëRĦo˘ŸĊN&³–|½0wqŽYċ‡G²nv˙ƒ"2ıž4Jï ž£žĜA”ħÀ ’ĉä”bI°D pĥ&H­Ñ .%žgaç-÷ít~íĝ'Ż~é?<½ùÄ×%„X’RžÉĜ’mÛŬµìcħo醒.üï[ˆììùï;~³”“j0ŞdEUŒh ˆ2ÓB³Ùô›ÍfğÑhĴxž·ËqœŭĥmŜħ˙Àmù•ßxx÷]ïZU ĵÔW3|‘Ú·md­4žÊJӈ”5Ħĉċ,.—à*@hRfËħ Í£@Ë\1ƒyMHp9oÚÙÇÓ‹Â<£Ñe1siF^ö·ëÒ:SEŸQNĤÓ³ !3eËeÊâËĵ‰ôĜLÈsÄ#v“ħ,*\”ˆÜϤà†ÀA‹r÷ċq£4³9xÙԄ €XMŻsÌld9ϛ'u!0Şc‘Né½$†$ËşħĈ á|,ħì4íċŝòğZ·Ü{àòŸŭĞż²ĥ֗¤”mcz¸ä8ΆmÛŭ'°}{ĝ› J%*ËÂëÒ˙ééŸŭïoéı5 ½ħ¨¨M°˘œi!“çÚĥ}콟ŝ›ï½÷§~öÙ8)l$.h4ĠCä‘À$7ìüfËı(ž‘^Hù³8Ïpt‰„6Á0 1?yCŞĜWî‰êüïÖUÏ`&L…M?/˘ä9 ŒÊjFS†’Ĝˆêħç\>½ĥĜ/UĵŞ‹‘<Ĥ1‡X˜JÉĠħİħa4ĉ`ÍÛHÂ3ìLX:ħ(ƒF‚ÇÁÔÄژ “*auĊ5Şá“ħ„ê8…% 4`+ÍĦÂċ@£ÑĜuòŜîÁŸ¸úÏÛxâŻ)ìX–ĠB\°,ëšmÛŬn·ôûŭÈÄĦDÂ{ËAiAšwž÷Ĝ×ó\ŝçò{ŸûÜçf?Ħ7 k@zŭŬBµ˘N§4›MżŬn·ĈŞëş{Ç9`Ûö‘c÷Ü{ï‡>ûk÷6öjn)³ŭi³a÷“Ês™{ŽJ.Χ’²óċ­2†1mŬž).9ı‚ŭLÎŒ^#.Ô°r Ä…Ÿ1›"ƒ2›½ĉ Pİ rôàŠuĠîÀċqDevè2G^ÙSĉÙ³=²z]YŻUö*‰‘Ô—7 dVV#˘|Í*ğ iÀ |Ö!AÓıšUö8)(D6Uòwh<ìQäjfŽ€ˆR= …3‘ĈŽVÇYŝègßĠyßNı÷ĝ'Ż|ŝ_ìĵô䷅ !„/tǑŬn7“0CÂu×mv¨#z€‰K~Ž‹żû J5 ½~‰r:ŻĠjµĈŞçy{Ç9è8Îħ[~ïƒŝĠßx—l-9"Ë‘†C€—It SìMŻJóÎıİËÂX†|Dç6*fLÉuy–”g>y *³ƒ£ ÉM&tO×mxŠ MŜrĴ-½MÜrShR>˘˘Œy”Z´+Ĥnrµ•ğÊu7 €ĊX‹r4#ĵ òìuäİİıĊCç\˜šSVƒL^œ²ûdġ$Ó_DiÚ7!E‘öşQ¤GÇ­@Θ1z}h"š(3iˆLË,âBĊ ›£)œQVĵ–³ôİß~ĜŝîŸíéŝĠ|YJ9LÂÛĜĜAoCÂ{Ŭf‡ûÈ<˘ä:šNüNĥFóŒ Òu]Ùl6Ŭf³Ùèt:KÍfs§8ûÇ9Úh·O~ĝ—íñ[ûŜ@ƒ^*ĊáÁ° îıR0â áhBîGùpÎa6´À ê8#<‹5›ŠšP™ü§ĵ•<•â¸$­ĦâĴdœ$;ġ3¸ST6a•y!„_|C9ı⠐gÌmšFÓO&ÑıïÑXxDnd=Qš ÍÑ'G`F£ŝ$ÊĠ5GĴhtğİ]Ѹ wTç2 ĉ£:ĠÄg RšÀBƒAa3RÂZĴÑò%5î˙Ĝ1gϑċġ?ù_B[ë-Jž”rMħĠívû`@)OŜĊ]WZ a~.Pu:Ñç[[[ĵ8SÏßħ TÒëĞMHt–eIß÷­vğív:V³Ù\ġ}·8‡]×=zäîw½ûżñ;4wìò΄ —47Ì˙,F£ĞÔÂéÁ(T7 6éwÔû)dM°(.ÒdÍ(e6z:.¨jşbŸÎħ™‰ß›̲͵ìLbÍ3gñÜ1äzÎÏ2á"2ZI¨rßT|RIAi ;Ê,ċSĴmòġ* İÌ?]¸”Ñ@’ñS’FšKRi’·!1ÌJˆñ|$2 3gBP@:gÄÉ&lÎĊċô;§#-FħE"­%i$IO1† £;HR ïĝ+âo˙·ßüÓ˙×NqúıĤÂB¸BˆKĥm !I)£(Š’8ŽQQWÒ× J ĈˆUŜŜétÈu]Ñjµ„eYdY%IÂ;vì`­µ^__×3Àİ4ŻŻ–ìnÎzQCs$şNĞĠÚéşî>×u;ŽsòñÏü÷żëŸ:CÒS„aÁ4ı²irÍN@S3Ş–˘ĤmÄyfĦı£Â“îı Ĥ ÀDrä³˘$§1iÏ?O͓uĤ &Ĥ+fR—\ÌqÁÚ½è¤×RĠ,WÌİ –­60lċ?ċ*f4#…|âyéézXAĴ”ı$5ĥX+œúĴĦ´İ=‰ĴéšÌ G=ŞAIÓÌ)òàebĴ(>"3Q¸UA ´£À“{“pÀ<ŽĞOkQ:żX£ŸCÍ8{Ucµ½ì.ŭÌï>ê|ûötżŭ§_&˘†•RZD$”½^Ż2sœ$‰*İ+ l찀ôĥȅ.†X^^–ÍfSzžçxž'…Bk­8Núŭ~,„H´ÖŞ×ëé9u6Dĥ¤7ŒD•Dç8ŽĠh4ìvğŬìt:KFc·çyÇ9²wߝŸüü•'—֍ q­é)²XB¤Ó7GNċG\Ċ(‡‘%ğR޳—Q=³Üv9‹wN*ÒyÀ*4½fŻ`N£³^WIl\]C™Q3š“ £+e½<-0ċğ”MI}Ìeng]xLĠŒxĤLÇ3^½×ĠzèTż—§Ž ĝĈ.Ó;D£ZSĉ“"Ied>A Œ YJL3*Ïß‚`idŞ´3 PĴÑ 5”$\ŽTÂ{ègNZûOìĜüüżĝsÑÛt S²ˆH !ĥ`0 I’â+PĤ™LiA nîÇvğ-———ŬVĞċÛĥíI)]!„µN\×Ĝĥ=ÜĜĜµÖÁ< \yրô£*™ÌE×jµZ+ïïġ<ïˆ8ÇO=ĝÈŝġßz—ĠêĜ/ › ChÀ›ĥ XH]t‚ĈÍAfb“]Òé\­§À”4 òOÖvôDmbÚá6–×xş7‰'^CO÷˙LȄ\^şİêĠ™Ĩ¨‘T³4@bF³hâwó ™§F­WÊte?ĞËíì<£fT Lzlp)ySÒ .â§`#uÓ2hÊr²Y[ÂÔ£§22қBZ˙%€ Ën5ċĥÓĴF%…Hß,)FONĈµPƒ°ž+°]ĞÑÏŭ—??ŭŸ;tċĵKDÙRJ!ì !†½^/́—Ó,ùޞ3+éêĥ%aĈÌ4Í͎”²ıŭŸŭàùoŭñ×íîĊó6|ßÇÊÊJ2 ÌHˆw²lgĠ`´ŭąĴ^Ôl6N§µÛív³ÙÜáûŝ~ÇqŽş{òCżüĞş?u0`ó…@iĜ 8¤q)–‘2FW‹ÙĉFċ²SF¤ W½#Ĥ„ÉŒ7=5 "ï²ËĠvtıÉa‚eMxŠ1MJ„\邊ŸQΌŠŞ[9Ñái†2óñıü1ĞĈ”LÈ5¨YC™g¸ è??Gš+û³ġl™…‹]ĈsO71ŸÇš!)­{ ÊzäB0¤ĉQĥ˘iĝŻ2ĉiĤÌJ˜úÍ£šO÷Úe'›y_™aA` l%J3†‘Ĉ$ĈêÎ} ŭİßûŭé˙ܤ /ğBKaÑE""! ƒĴ‰6/ß ÌwàñŒú,ıôµëşÔétœċċeßóĵUÇqö !öşëÁÛvÜóžß}ĉٗÚğ†WŝŒ™ÉóĵĜuŬĈZY Éï$ÙÎŞÁh.•Ö‹†ÛétüN§Ói4ğ}ß?è8ÎħÎÎ]wŭÜ?úoŜż|üäÒXB¨ĦuZ#ò(µt[ى;Šfkéùp:”§ÁaV­†ËÁlJÎÓÓ#$òKfÈ3ŸŞšSÙäĵrû6Ϟž^”l̨̕””|gÙ·çÌAŞüJM(ġ‘O1è)BÊèy5­ÜÏë ,3@LÉşú—dàë,W15:HĈĝs¤i߉‘ĉRJ-áz$ŭ™$,úˆ³ĉA™Ç4ŽHŸ#ıÀV¤)BàŠ&Ĵĥ–ÜŝO˙î£ô˙w‹^üCD™t'…RĤCZrĥy TF˜³—L€”뺢ÓéXNÇk6›+ĥmï—Ržh­î:ġŸŝì/ŭ˘r6{½G÷YÖÓZëPÑ·m{àşQbŽZ²{ç‚Ñ<'(ÊtžçYívÛ1ġ˘•f³ıÛuŬë?xëíïŝäïŝ×;KËîˁÂF”Ï.#mt5£œENö]ġ á šŞÍ”SŽ”ğé0h‰*˘§ŞĈ´€clf4 \:̀g„˜Nnî3ì×eû0Ü:U[)a)%%Êû1ĉ=>OP…LW6z£8sġğ‰ż·âġ™ Ö\úZ•ı"€)N/¸D:˜ORšÀ`™\£Ż `e=MB¤;!LM‰ÇŽÓüNŸİ2m‚‚-M@žŽ˙îiĈPQœ`mSĦÓ°ŭĝ/߇ĉRƒžĝ’CDŽaKRAú× Je`4ëâ6ĞOQĞĠ²VVVÜVеdÛö>˲ŽX–u냿›ó‚ò;?Z[G`5Ž ! !Ö-ËşĉşîĤmÛa†j |GÊwV FSLóBĞĠr–––Úív{Ċ÷ŭ}Ĥ^t˽ŝÉÇ?Ù_ğ=ĥxf¨Ş4Ì%À!À&2Ì…:ÑTŬz´”ħ™b.€Ä|Ê­àş@ECƒĉ’†Ö<+&A : n*ğl:íĴÑà\@ J]k%`Ä<ŭTlÀìeš=0WËi(ĤžĊ &Y:l°˘)WÏ0^˙œİ?Eéj³ÊhŜŻ€f, R1Í%eœy2ËÂËìĤ4¤ĠĜdžAe™ċéİšħ)  ˜RéÎfPB€N‹š×TŒNË&ñÈ/Ü&Ú;Zôġ˙à kû#f‘”2ê÷ûJ/7&ŒÛeGùŭFjµZn³Ùl›`ċC–eşçżĝSrïñŬß{ħ‹8ÖŭíaĜ:iÑúY!DSJé9Ž3Äü\>Áè"ÛY5ÍuÒIÓ_d·Z-·Óé´Z­ÖÎF£ħÏuŬcëŜúżú÷>rû‡>=aĵ:HĞô*'‚MlŒ ĉj‘'˙KÇx7~=]#_Ñĉd´‰ĵıüG΁”ı˘-‚W¸r`™>‡‚óâ4(ڌıäJfZëı†…˜QiÊOXàçĠeJYJÙUDA>Ĵ J-ƒRSGUCɅÒÉĥzö÷20Ÿ<­ĞëQ3mül€ÄDpHJçwY:'ċÑĝ_V/’‚ ™GÖ´6¤Ħ‰rIH§Öĉ^Wax‡‹H"ĴħŽë[1Ú Ŝí8È­]?ƒ/üóÏùN‘àt^úŭ~l~•*°¤²1e€T²L09;ŽÛJçÎì4`tËá{ßû}ôèS—‡Ĝ&Xò%zË{ħħÑ>µGnŭPѲ,Ës]×6dTÌ&ԒŬÍF#óB£Ñ°yĦÓn·wĝÈuŬ­ċ•;?ġ{˙ä;oğkùB¤p>Ô`ĊF˘³‰a‰ÎʅORaO›n6-‚O2žBP*3Ĥdş"MI|\€:ÏÒt.À3*3íċî¨Ğz‰*_—êfžQ*vy™n^ÍSSyÇ€^ n†Ò‘Su1óŝĊĴ›(,‹ÌPIĈ”ĠœDúеħxKb6ݸ´ħ‰çÇl˜rR h#ŭ›À– Šz!#ьnÀ—+ÇïY]ûè?üi÷K˙OĜá"JĊk3”ħe²m[´ÛmgiiİÑl6W<ÏÛgYÖñċ}‡ïżï§˙ν§×CúŜÙ.XHËğaóµċ}{éü*€%˲ëÚĥmGfîS™ĴÈ Y›n 0še½,Ë£QĞĠrÚíĥßIİÑnß÷9Žsb×ÁC÷ŝÜ?ùoßßÚ³żñr¨qĠÈşR™.5/˜zQOS{Zn“ÄT,tÉdW]1ÇhœaǓ!İz•<]Œ(šWHŸa`˜ÚD ¤gè˜<”òÀĈĈéTq,ĝ·Lò+L7İbhLɏ%@—é¸ġK·¨têÙ2—PG^$…‚§_óÉ~³ñßkFÌİ|-§À¤³zSšT’9ì´aR:›L!LžOĵNžï)ӂáf'´°ĉ~á’´yeá PÊKd³ÀhŞíşefĦµĈnÇqŽ8Žsêáżù›uWö6ŝâ™uôû1 *Ò`&DíŬVw¸tÄá3BˆĤ8žeY#'êÜï)²şé•é#‘?x,˒NÇ3ĥîċf³ı×÷ŭ#ëžĵíÑÇŭÉßĝû÷E–+ԋh Q:5/ g^0WvàɑÒ\Ñ[¤Gµ›\2wÁœ  ½ASŭ?9@›jrĠ“÷Ñş G0—ÎCÂY.ż•‹ë<3ÄtŠÍéš²×3dÄÂÈòżƒgĠŒJŬw“2ŬĴż{t÷bLQĠïœ!ӕ2£ĴŬ3Ws5€˘€*ëO%ÇNYQ!33,m¤<ÓĦd§ H ›ÊK8òòĈVq›ë$8×a+BȄ`E}­1ŒŠË+ûW?ĝ;uôO ¸’S.³dĤÁ`M £ •`d”–v³ÙÜéşîAÇqNÜŝÁO~p×İ{wŝĠ+]\ŜĦC^¤0Ck†f‚żşëW—ŽîW–…mÛĥ}×u-¤=ÊyRJ˜ŬĵûŽpÛY79ÑvÁÈó<ğÑh8KKK cëŜëyŜQÏón½÷£˙Ÿŭġ;şZ‹ŭ §KH'ğ"• $ċ5L÷Ħ˜Ì=7Í3•gQf֘vˆM„—Ž:üsûzĵEè’Iš§Ô£RÙ§Ş€]6ÉĦ’͙g4O Ô÷Ġ£)&eşJö3'›2M­Ë%2šŞü#—5ŝĉżKj_ӌ´¤ĥVÙg´˜a6HNËtó€1ÏÚRFdAC @qÚÒĝË àŠı =ùRŠ0LrżĈlÛ÷L½ŬjµšÍfsĠÌBğeïÉğëŸċçxŝJ€$6ŻK˘ ŒÔŻĴ8ˆW––‰hYђRú뺖e…I’0Şû¸!½sÁ¨ŞÇhŸçyG]×½ġ‘O˙ÂGüùÏż–€^ (ÍPšáeÌİT`ċ MÔT s†ĈÑûÑwŭôÏı2΄ J14§…S€-ÄÄhqByMĈ“OÄÎÏ*tfL@ıqa*!w%ôt+0í´ĞÒâ¸Â:*fÄrÍÔÉs†çMµJÎ|dF£ŞÒİŬeRÔlóDÁMÇëežFÈ×8òŸ‹ ˜ˆŒÒ…ׁxŠÍtÓUx(Ïpf0#H.Ż(‰ċ~—Ĥ‹dş9‘Ei f†M€f eÌAÒŝ%‹ éhó ĤdÚ„ qeFÙ Ä8¸XËԆžhÀµÒĥ%…‡úg~âïÄùó˙Q×´aJÙêˆr Ä%’ RÓh4ĵVеÔh4ö8ŽsÄġŭ[ûÛ˙àñ>5œŻ½ş‰8TPĦ1 §UÄĝˆ b§½St7VŽúr#3Ŭu]ׇ*#%ÀôŽcG7 ½Á`´£Ùlîw]÷¸çy·ä×ŝ‹ŬúÁìğ0^ ’TJÓ WdÌh\|RygĵwOÂ Š ­£hž˘Ž‹Áe1AûĦÎŝc?{~ŭA §µ,­²‹R£Ġ ‚VBH´öÂĉùċƒ-yqYJÙ2u$GJ+¸D„jKú NV FžĠh4&ÀÈ÷ŭžçŬñS˙à}âďî~-Ôi‘9]‘:xl˘tNLĊ‘Pn8˜l>­ê ÒùŜ£²íbĴ i eİŬ(ÔŞ@£ŒŠÉĠÖnTÔĉÍ3âòÚÄ )(0MmÈ<‚ƒÑĉ4IÀhüšä~N dİ£g ÒÔé T²Ÿ#eŝNJG›7”Dh@Pš;Íjƒ&ı˘aŝ+Y"o[€”IÔ02pşÉ ™JŸFı!‘Ž×Ĵ5.vÌJĦ Œ7Ĵġ̀Ùİ”ñŞÑ³Ħċ ;on1?k@)†-JĤŻ›%‹ ÊĴ A*ŭ=B0˜²qê„âüŽl^w“a™c@…pûÉÍñ[ç?û§Ê’VJé$I µFżßO”Rş Çħ<ÏsšÍfĞÙlîôdÊÏ )I#u™fP˜‹&Ù' ĥŒÙNAVç–†2òI™XĞ첇@–İrÚĜ S£Ñ'€żÌ­˜c”³dşêúWK~zzB.—4r%HǭۚaK@3A †eŒ–JY¨6ƒüÒ·*uáÌh<ÚFŜËĜ1ŒK°,ŭjĦwŬv{ûıä×?ĈŝÏ"fN”RZkÍZk$I2 0 @’RJÏó²ÙhĞĤnt|˙‰Ûîôçŝîí§·"\ŜŒC[ @ĀĦ†2Ĥ Ž€#%]î7vKv y–e £(R3R)[ş‘ëHÖMF4ĞÈX£N§v:fğŬ^5†žçŬñ‰ßù½OÜġÈ£ğŸ2`”èԎi#ͳL÷ƒUĦÙ( eÖé|oĈX‚Óşc”ıè Ͱ“Ùv…ĠÜFŻı,NOž¨ĴëT‚SuPjñŞğRı›ëĤĞ`F<ğfĕQAͅ)ç Q÷(:‰DúµÎìù6{L†IH7yGPÁQo Qż‹°ğ…Ŝµ+èmm! $Êdk$ Iw*€U$IH³Ħ+ĊP‰Éu³*f0G¤‘ÚĜ4ÏG’aù“…ôˆrĉŽŞàĵÂûÂÛ°ŻëéÚàd-Ĵä8Énc B ò‰H/µa8œ™`‘Ö_§n×ìó´Âb Yˆ+Ĉ.XÊäRaŜs­A1ğï[y2ŝµOè/ŝó„™­µJ’„Í €Òè)K)…Öé·Z­ċF£ħÇóĵ#•ĠÛ?ŝĞżûH?âô•ZR@ÉôWY4,’H4c#̐‘ÀĴ²D£³‡Ö×WvÄĉħÁsGƒY³ÛŜqĞÖMFħ(ô™€F§ÓY1†ïßŝÑßú‡żë½ïÛŭT?ÁH§¤*=àGé ”öIˆÜ57—ŒÌ.‚‘.™/¤ó9sE0*‘55NGMtexhİìU•Ù†iù‹ËGĞfà€¸‹sôÊĜW=ÏL‡£Ü}hÜÑϜ:N2lҔیDZ™UX $½.†›×½|›—/`ŭÌ+\½‚àêe$.Ô`ORd Òĥ Ĝ‘BI˘Äµdä‚ĜIÍY †–ÄÊ·ä /‚Ñ…İQš ÄWáFJğÌZ!H u†§%IDLV¤‹HR_ħ+ÜĴö2ìċ]–w ıc7Ú{˘³kšËhJ³µ•N9-ú›Dl!¤HSV•Ј¤óï2×Óï WËеJ™ŽKŒ“@UïUĴD3” ĜÚ(Z"Mg"h&h7¤³:SvLc ı‹KxY{­ĤĥG€P§îzh×s>Äßŭ£H)•(T’$Ĵ”ê)BÔ(yÛ²,ĞÑh¸­VkİÙlîö<ï°8·|ê7ŝĞ5ÚËÎ3gûDjÊ`)h„4$Z Ċ$Œ0a@i(a‚ĉžèmïZ‘rEÑ2N;[JĤVf˙Êxk—Ŭ›UBş^0êt:N§³ÜjµözžwÌóĵ[â7~ç·=ú=O÷\ˆÒa_0W_™Á˘tt„(İĉ/ó#™'³ètĦ·¨,›ĝŸÑ“òırœ-]]Ğ™S°GÙ lÏâóŒŠî~2Ö˘sï>`Éê<`J%­Ñi‚³‹úˆÖŻ`íÜ\yílž;ŝĊ×­_EƒUàZ"ò,9„`Ùĥ6™9nµĴ jµBsĊœh­#SüN˜c­ÓŽJm'½Ŝ£ħêʊ•İ’CD ˆH@A!D›H’M‚ˆ,rÈ’HXLĦÛ^\֋^t­˜ÙıLÂyU‹´°ÙoKo×~töÁêácXÚ{VgdÛHV€0#(NĞhœ˜4Q•2­Ó׏ËÒÓs³ğŠ#;*­íÌ1GÓÍÍSuİÂñ&œ:Ck‚’)8iJ›jµ˜˘JŠH”ްMÙ8ñò{4e.ĵœĵš(FÓ8ñŜO}~¸ù>ŭ£/‡Zë8I$ â8†R*N’D[–%=ϳ[­V§Ġjíô}˙€çyÇ~â3ï'ö?Ġ~öâ*Hàš°XmÍğR “ϧĦ,‚ŻR#LRUFH€%Ás=œ·w.•r)Ğ#yžç!†Jİb„,s -Û½)ǎĥF™LgùoçÁÈ÷ŭ£ëŜúĝßŭµŸ<ġî}9Hp1J;ÙÌsħaFô¤š§G5 Ĝ÷c]¤1ì­sÒÜè~Ïİ)10#§1ÓŬ=#(•g *GHd)šÇïrÒ ' ‘Ö†@q ĠßÄĠsŻáü³Oâês?B˙ÂixÑ0hÚvàX2XÔÛ+ĊFcĠ_×ZJİ@ki­#1ko uĴµV™„“§6•37=[ À<>Df™OEîk!„ÙG"’¤B‘efùX–ĥMdI)!„WJé*Úl‡k[K‹Ï._ù.üsšĵp=ħĵSvŸÄÊáSX:pvkäZĉ˜LvŠ4 Â8NëbĴrĈӟ0ĞïĞ €Pʌ ħO<}œ–ıNATÉôbQSzáheçÉìY–œB<š‡>šajxDĉêNˆÑĠW$è8’½ïoŜñÊĈږ:ŭDÜl6“8ŽuEĴ” !´ëş²Ġj5MżÑ~ÏóŽŬŭèßsï£Ú÷êĠ×zÈĈG’$d~=ĥ6œ„àIsŜ“ı ˆ4voï“rĜħ,ĞiÛĥkÛĥŒ8™!ÛQ-Ù½5R]UfÓ0òÛívğĠjí1`têáŸ˙Ċßù“?uèl q!J'ĵjştlĤÔٓ=ċÂİ$“n<›µÎÍ B9›^ueĜé´<&=›éT ÏĞ4ıñ‚ĉ†’ßĦĞšRg ’ n2*ŬdFî13üàB–k Ħ"ôŻ^ĈÚ+/âÒ3O`ŭg ]VžŽ†mÇéïqäµNÛı¤•èfࣔ ’H…ë=1s¤”Š”RħÖ:û§ +ʜW‰ħìÁèä?7••# 2ʁÒè#€ÑÀH –ËÌÙRÊl4·mÀɖR:-)½%)=’äY–jDƒsĞŭ§Î­n<ùċċó üĦÛòìŬ‡ĊÒñ;ħÄíXŜıʑ`àDC¸¤tZsÒİ9F˜Ò‘íotœÏ İò/û¤ıœagîhè´qVŽHv´$XŠÓñœ~L-ôİœ)uבàÑ1„Qĉdځ˙JqĴħ·í‹áOüêƒç~˙ĜÔúBÔjµ•:DE‰ëşv³Ù\n4û<Ï;²ïèñ{>ò żrוĦ˘sëXnMÊ-Qş·° XH]„Ž ¸B` t:JƒaĴà-íÁĈĠ•ĞòêÈĜàşm˘ò,‰*êéU£Îk@zêF ƒá8ŽŬn·ŬN§Ó1A݇\×½ċΟĝÈûĝô/ğjœ‹’´ĴÒ [laL T~âäŠ"äŬtyBv?•ï5âé1à% à(;ž;ımìäı5Ö9q@eÙt\‚\!Ӎb—òß#6!L ˆ² d@ĜÚĞ/ÌŝWŸú.’Ëçâ&ô ċÚŬcŽ}İħâ_Iğ§”êÇq4Ü †CDa’$ĦŸH)›‰R*ÑZ+³ù(”bfÎ>pBŽ e³šœÛž§ÜN% dˆŜ”))Ì> !döÑ|nprÌçŽùçZ–ċ !<ϲü–eù¤Íví™}Ŭ‹Ïì<óUj=ïv|{×Aħ|ë}Ĝ}â8­˜Ò}Ž@IĈ"hl§ÙC‹Ìx™n•= Öi-LK‚N;N7{ÎN0A#Ş­2Ɏ8·‘¤W›”1Ž“!!8şoĠĵ˙×Ŝ—ü§˙ë–9f”RJ†ayžç™~£­ÎÒİŸŭÍ˙ò=;âĊ˃´Ç(R)¨›+Óü…Ĵ0ÉR¤#:¤ Ĝ…4ÁA0„”hî9„îéÎÊ.);ĤÉsǒRŠB ÒŬ ϔĴw(ÍĤ‰l:¤Óv§ÓqÛívÇ ×;äşîÉÛ{˙cï˙ċ߸c=f:Ş1 ×$vKĤÑ3yiÁ%£Ĉ'›QGµŸ‚.+.LÊ%8b‚òvñ1Ó³ÁÓ2]Y$0/¨ `&ûO&êiz3BIRD.Í`˘ŭ]¤Ġ"!ċĝçŒ#*î­ÊËϵï}WŸŝÄúZ°äÈîáf|sµy1Ž-T?ŭ&I2L’$0˙2 J’$É@H%f§1`ĆħaEyájˆžùuU-tŜ×#‰ÏàRĈž¤™xj€RJ˲,KJi›Ï˲)kÛĥ+„-Ëò-ËzqĠĥ›;…hIŽ;½Kû{çŸÚù—œv²€·tË=Ĝwçŭ°ŭeÀ·Óž'f[ÖDà$ñÊ4‰"œß‹2Ŭĵĉf.;Ž Éíınjt1¤3óÈ.ÄhÙ(_f˙ÒÍ>ġŬH0Ĝ4ӎ›ÜS‡'Œ8T8~òT+|ï/}@˙Ġż˜‹ËóĵÀqœ†‘êNüôŻŭŜ:Ğ{ĵœë#8Qĉıèİ#fܛ£ü=I'T¤#7X1<ÏĈš½³-¤µbİaÛĥcY–eÌUcÓİŠšúӟĉŜX ”½Ĝw§•Uß÷:Žsâ]ïzèƒïïßğĊ’^ĈiqT§`äP!(µ$‚ASğQâŠÓıŝ Î3#=Ÿ;ÂDßçĈúŒ nğ™5Ħ²HT8ċxĈE+Ïvá•!¸FTĝ^!ƒmDb\¨#imî œúIœùëŻbŭùħ×ßê/ùöĈ݆Vîh_N’¤‡­~ÒO’dÇñ0I’aÇa’$Q’$QÇQ’$ħù—ġ™h‚Œé‘u‰oeN²ÛĥÁhPïÉ2iSe…‘ÜR! 0e-³‰9ĥmğ–ey–eyĥmû–e5,Ëzi§m·öȨ£şŻìŜĝëWĵòíÏ/›ğší[îÂğBcu˜%T˘Aœóéèñ2ğ)OŞ]“£|ŞyK%Ò_Ñ;ΒǏZ§à”YOFÚ;Ó¸î$(%šxDÚ{ŞÀqÇï|÷sW_}/?ŭU&"_)54&ƒCŭÌg=vç½+Ï] 7HÀJ§r]ħ$÷9Á4:‚`ŭğT Q¤ ZğäVċ#ÏX–Ġ0(şaΣ^Ş{ÇÒĉĠšÍĤÓn·›Œ¸{lÇŝƒ÷~ìw˙Їa‹ •ŽN֜Ž·³ñÊĉŞ%ı^ì3šd7\*İċƒM‹Ĵ¨Ìş œyéâmĵ@ hŜ<£ mFÓkċïCÑÍÓI_ı1„Éûfİ™ 'ÍG²*bŭµ—ñò·‚Ëßû&û[Wú;ÛŝÚŝ†w†ŬÖĠ$I6ƒ~Ż—$I7Ž~Ç(Š„‚8]Qb–‘à´ıÊĠ(ı(œŞÛވŻó‚k&KŞ8ŝ3À"qCqS¤Dž=Y–eÙĥídċ8ŽgÛĥoÀİeÛöéŽm?ğjYm„áî­'Ï:÷äWV‡Ğ‡[S÷aßm÷@6:$Ħb ‘F\¤† Ä4'z‚í—Ċ’òÔ¨éÌ(4EL^=`†e0”É4˜x<˘ĊŒş€H5£.M ’„0hı’<ö‹'_ğrĤGk§ÛJİ@JÙ¸ċ]ŜöèOŝÜá3!.m†@ÂàĜ0#]5‹Ç(½‰&)ŬG4@  Ġƒè]]ŜżK^ìĜĥŬ4ûì ˘‚ÛÊŝœĴwÍ21T46›M§Ġj5²™Fžçk/ŻÜùÉ˙úż{żl´ìġ˘$ÍĤÓfĴòŒĈ]÷8ĤŬrS`4Á€*Àˆ'­Ŝ1CùÇükw]ú£˙›£˘ i-Ż:?ŭËż}ëĠ˘×iŭ'Éd:4nLLƒĉñy! aFM èD]Ŭ ħĵĵWÊ%´ê;ŽcÍ;i’µŜ!`´ˆ‰Ħ8.ĜnµZ~ğŬ^2Ӈ]×=ġ“˙ûò;÷î÷O(=êáL ƒqÔċ‡êMïHÓ@”70” ÖËÇ÷çM$}›û)`bz, ̈yLWùŭ² ž?ÏhÚyW!r ˜ċg*ÇĈĤÎálÄn8ÀĈ‹ÏùŻŝ9<ñŬnmíê4ϵV[§8^ŭ(Š6£(êFQԏ˘hEÑ0Ž0Š˘0I’ ƒ’ššÌQxëĥːyàD×!QÏS ĉž'ÌLFö#"!ħ'ÇqòàäıÛ°mğċ8NËqœ³ĞŽóÒ;X .ô]=ó䁋Ë—Z·>$÷ßv`µ@–„Š4È4£j5~Şpu>òÇ.}ñŸŸŝÌß˙oN$˘a½p‡8b ÑıJʄF÷”˜s\ëIĥ(ÁH •¤Îß$a7Ä@,5´°V ‹ġÇqÇÉÒż5ĥa˙ŝÜç>wCĠ‘Ŝ 5¤Y#‚ĞuVĞĠr;NĞÙlî2£ÇO˙Wë‡îşgùİ^ŒÍ„dž&xĤé5#‘“•F°9šò‘g;ÙäÎÉĝY½§ğ‹…âœ#ĉ‰:ĉÈt•ĦYq;ı­¸Ì0γĤÄçéIY³(ŽƒM3‹6@Ĥm^H‘vÚ·píùáı/ü' ž{"Ü鈵;Ú­—µÛşEÑúf DŬ(Šşaö0DQ„aĈq'I’¨'¨„ A %Ÿ—1Ĥy5£ë­-ZK˘€j[ ”?2€J’$Š˘HA0ÌÀÉĥmËu]ÏÄĠĝë6 0ugxvŻĴè½²gíŻÏž|ŝ‰/ïônıÏŜw÷C wÒ² ´ğ›Žy4µ²tĵ<ÓmĴkY–Ĵ02TÙżk†ôԍŠÀTĉ¨³|ß%í6ƒŽœ¸û'êñÛ>ĝ‘}Ż kq‰˘tê°I‡ëq*Óa܈žm˘ùĴĥİşOŽċLŽŠà‰># ÇԅÚÓhÒk.u䪚SSeP`KÑĊÄU;*ώâÉĤU.ˆE)²$ß"$Fd Ä[Wqñİïá…/~ñKO÷µgìhżEÑĠ~wk=Š˘0 3 „a8 0HUı8*Ħ2 šL‹ÈtÛeFo mŒĥ­(”€“2_ÇħP‡ĦeYĥ8vNžç5ÇiğÛvœáĊe×}m7†;7žıvòÌ3_ÛŻŜíïż÷Q¸Ğû œ”1 ĞÍU ›lıäĝ›8ÏfĵĴşŞÀĤ–ÈŒ(sà!•ò,Nv’iÔl- İ&•E¤ìHAħJ›Z#BĴb oŸ şĜ$iz³éešžÊĊĦùD A¤0ŒĊˆ…0ÖF Q¤òQÀ‰ :R Ĉ^lv—v/‹ YƒĴç8Ž- ó²lĊ1rCÇY70aŽy!˙OİÎj6›v§Ói´Ûíß÷÷;Žsìàw=ßúì­W3Ab¨qšQgS: ,›ôZ|ğtaÓĠı+³ÒñráÜSG“£÷µ÷Ŭŭ0dc JTcc<²ÉĈéüŒIĥ¤+]9ı›uµy'Ñz<Ú2³ŠX˜>(H×qœçyMß÷7<Ïğ†ášëkÇ<ïċàµŻ8ĉ‡Çôчš{ïx7Dk8Jó+h-Ĉħ=zR"FĠħ§Ëŭä۔9P#NĞÂ4’Aş hM°DŞœè܅j6=sÛEa‚(ֈb…(a$*ŬTFîe29xĉñtXmĉĴ%š CÂHÁ)-' äZˆb ÑĜ…ÍxéŠĜhgu$clˆfÈ·7|醤R]UŬhĎLŬÈn·Û­F£ħÓóĵŽĝ3ŸŭÀîSw.ż0LOx”Q¤ÌL Ċw¨ÄP´e)Ċ…)AG=û$žùÏż™ïŻt^òV;/Ár/A°ÁĤ˘A†aEQÛSˆfÑ,GŬ, şÀèġ€Ò"““i†Œ'ĉ°2pÌ,L_W’$IœÓp8ìzž·i€éZEkw{Ż_ŭÒɳçŸ>êŜö¨ğĝ€Ŭ @‘JíÖDió¸áN(NƒQħi–Ğ4isŜ…jĴ½“ÌÎû´ HŠ(¤HŸÂ AŒbF'#XİÑhtéXtç”éjĥ62-ñ8a…u*ÏĞ 2†TÁú8IKÄÒ\ÛììÜ)ċRĦŽT”íÊ.ìoĜ:’u‚Ñ˘Wt£ïlBc³Ù\ñı~癳Ïì]½ŭQÙĜu\PĴ‘Ä:­-Ċ*m’ĉtN‘Î_Œé 'é 0ÊnŒTĈܳ‹93U—‘ÒbÄÔ´Ò9§çheaĴYó|ÎÀ39˜+OĈBf“íx”Ħ™Ġ‘4—ôġ‰K‚eğèÒR[‘ċÚùŽĜ–eIsîTİK•{ ÛŬh’Ŭv,Ŝ@˜$~ĞĠZj4ğ=Ï;ÔÙµûöG>û›ïhĞC•ùıíHRĦf4.žŜirÂ3ƒB~c FÙĉ_ş3ŽÀ‡§‚R' zĤLW5e•+À¨3€ĤÉÑĝk= —Ù8ˆl– AQÚğĴ]Àùo}/ŭÙŞĠ¸wùöĠöâ0<żµµui8^‡ëƒÁ kQ`ú‡²úv€èzÜtx˜ÑvYÑQCšġġŜĞTÁšDÉy(ó·`Š•RqLaƒ èùżċûŝ†EזühmEġœ˙úkwž?ĝîċ½·?@äï,k% MN^vñ£+dş20*5ì˜ó9Rİdi…$ÒPQ‚8IOiÀGš´M4Λ£,U$ŭHT|áÇj³À(Ğ9+sħĴ4 oÒż]˲ĜĦü×uRëêĤN×u-“Ĉj4;]×=è8Îñ÷ŭ½ßy´ıĵäü°ŸŒ6òù3 9ĉBÒï4ƒáÜL£Ñ˜£ñÈÓ 3êPE0ŞëĴ‹ÁIvގ<!‘.—#(ĞıQ’&,¤¨û¸üäwôŸü{vϽ´qëêòÓÚrO÷ğŬKáÊp8ĵ6 ĥŒY!0¨˘2™NÏ1/Tıé€íG-*×]ÏíÛĤESĥSWšPĊšYu%]" ”6½ ˜cÛ˜~²M?ŠÖ÷ıƒKÉÙŻž:}ġċSö­ı+‡Nž—Ĉ‘&·Q”^¤MĞŒOş8VƒQ Ä*UJDš ’ŭc"H˜$û‘´ıĠDéqx8ĈÉôT•˘?ŞÁêħ*sÛéô£RژÊòg³9M:mÌU ħ´›kKö˜qëşĥm[3Ŝ×YÇPmj¨,rfY–l4v£ÑIuëıç“?÷Ĝğï[})H0P&Û*Çòm‘5ÁT}w…Š~”Mñ…§â}&–.£‰úmq„Ä fTĠËÌ3 3²éĉXğGĴÈôqd RY…4˘óŻâİ?ŭ\ûĈ_„G—[/¸K­çƒ~ïâp8ĵ<ŻƒápĜÏêDÙx‡mWĤğ^f´(â7xIûĉ×HÛaN‹’žNs™’ùZäb“(Šb˜úAôÂ0Üj4]/Ž7OĊ½ó—~¸~ßù‹ïÚµûÎw“ĠĜÍi¤³Jç@`=?ÏJ3 FÄ ˘0ÛË1ÚÓñ“ÓR!JkIYĝiV'55£t(R–ÑH%.Ùqr eä9 ʓçqvµĴÓ·@' d[Í}X_k/ï˘ÉvžçUĠ‘ï€qo+ •4À L~ =ϳ›ÍĤßjµ:ïïq]÷c·Üsß§ñÄFĴq9Ô£ƒ‰GW¤S;'h|Y§J+|…ÑÉ<Ízt~Ĵ.10À(/ê\ kE¨ÄĠ6§G¨j„DÙ}ŞbîŠ ıç!Ì )DÚKDĈ Ğ>.}˙xö˙żş³qiíĥíï‡Ap~+. ‡5D[ƒÁ``òċ"šS Ñġ֌7$ġ­Şm÷1èuÒġ€Ò,p*¤"SʖY)rhbž"Ó[6h6›[I’lîôÍċ‹ƒSŻ^;}›}Ë{½ċ·‚m Ò@ĞgáħÂ0A0L$‰šqÁĈċçÌÉ!²VÓoISĦ†D£à‰ñôâRé0÷‹‘ŭ£„ˆ‘˘3eÚàQ-ÉöşbµMÒÎb„<”›Ġ‘ގôvÒv´ñ)‹w£Ñp[­VğÑhìp]÷€çû'ûÍَxaËHujÒT@œöL8@#‡ ċ6~c£ Ġ àß'ÏtĤBSsıw£Ÿ+ħ^£ÂPQ $³FHT€/ ÓqEŸQĈ„â”ÈŒÁ…WñÜç˙#~ ÁħċÎÓVÓĦß띇—ƒÁĠ~żż5ûaMQĵ Òo •™·É•_'¸\ĝ2Ë[ѳ¤çԔÊŝMSÇ* ]7ÍĥÉ#ÄqÜóxëVżwéòs[÷] ĥví8r'‘· 7ˆòĝ\B…(HİǕ} Ӓ@ÚړŻùŒùe@ÄFšqi,ĠŬu4ùĈ‹Ż…ñîı ۑ³£úQVc.nlÎ=sgD‰8ĞbK/òċ˲šĈŝ-0,Kŝáíß7‚d·ˆT—OñFn6›F£ħìyŜ>ÇqŽĵëÓëħċCGšÏö$Š‘èìz‚Ĉ…PS„×ĉêFd˘oFŻóŞıgçSL.HyşPûŸĴ!q…LWŜôZĊŒ˜gï<ŒŞÌ  ÌĊL¤ŬġHY‘* ûÌwñß˙7Üş|fíÖĠÎ÷ 8³5^ —ûŭŝ†1- 0 s@4ŒÔ[ÀŠŜ Ó J‹>~‘Üӌûĵq*°!=ЎTL2½LÉHyħaK~’$½IÜmżúĊ;Ît×NµO=dÙÍ= N‚B0腊§cƒ#ŒûM^7>ÂÒÙôŸiBçú‘ˆ¤167˜sœ `45¸r”ž˘GLHĞÉZwf|˜úSÔx„‡ŽD{ևKû[òr;´ê̈*£ĤŽd½ 4KŞĞœT×ö}·mۇw8y÷?ùɃW#Í$u­dá…:—ÖHyàÈ!É4uÁˆËÒx:}§ç$ÁHcş/iÛq@³&ÁĉĥÛ폐˜–é@È4ˆRPj2M^×/ì׿€W˙äßGG›Î³NËĥßë —úŭŝUFŭl 3+fžW+*˘E^·ÓOôzfñ[Bĵ ÙaџċŠ ¨Ĝ“²]`â8ñÀÄypRJq*IµNL"GÇñ I’ACİŜ‰xpġµîÚ}ŭĥ´·á…ô˜ÎކĴ´M0Á†NûžHüÜim‰ÌqmÀˆ‘}žÖ `„‚ĵRr~ê͜–4çšëueOšĴ4Èb·›h·ŽÑBt,ËòmÛĥ„e²Ŭ ?ŽâFaH˜L#İÎó<§Ġj5|ßßé8Î×u÷Wûé8âĠÍÊdCqY:6gvòĦ 25Œ'3ç&B'RĵyB/.ĉĜMSl•fސ(­ ñŒĤ×jÈzÀ )Ó¤cú§ŸÇÓüïŝàk[§v,}/‚W6ƒóŒÖƒ.ϊ’ਁh^êÂÄԏmֆĥŠş­–™_× nĈ”oĞêK\ŝÎÎ(`ñ,<.lpzAùNĉ̰‘ñÁ$D…ĉß°‘$ƒcI°u᙭.ĴŜ·Gî8Iä/ƒ‡*¨S$JmŒ²Ûµ65%‘ö%ÁŒÎ0!áéFc`ıë4.pĞ@q,ĊM\ô–Ä ċÛDĤŜBĊ KHÓfúöfÂŜ.Ë ›ĥmûëf1BU²Ŭ [G²ŜFšĊŽÊ\u#v”sĠïç?óŜĠ#ÇZO÷Äz,‰aê 5µÓË# W7\5&ı``@Nž+Ĥ+h+\˘0î| n†›ŽK/ï 2`ž=Up*f4nòKOJ’"g‡è>û=<ñŝw;żŭażf0\è÷ûk½^o½ßï÷£( Œi!1`£ĉÒĵzÑġ²˘ë ~³€ĉ´pñ‚@E%ŻE@•ħ§2vTüzĤÄpbZ)ƒ f oĴ”Š (Zë`·:=hóî—txĞ·Jòw‰ñµ%zܧs`„‘,?~ XhHMİl‡ħË.+ċ uĈd`DӞí‰=ibE>nLëñ$[͆ô•`•€”@& w™6ċK²÷£\)#T&ÏŜu$ëm#ÌıCá–ĥm[Fm6›Ïóv9Žs`ċàáÛo˙Ĝ§Ž\‰5ĥr‘öZM7—òèâ„&f]Ö£&6ŞL:…&;.|­ó˜UqŸÑÄ9Ğf„9€UĞ<8ò ŭo Ĝ˜+bƒRi‘E7âÒ·żŒ˙ß$Çö3ĥç<ĠëġÎôûŭ ½^ïê`0Ĝ ŭ\OQm×Ú½hŬv@h<÷Vϛ\s€j@Q£* ġ]<ñïŝ½w°ùr£áŝ ßïŸé÷ûç{½Ŝċ~żż™It&‘;İ£*"É ³i–DWƒ6Ô6ŠK€˜íÀ‚|' ,İÈ òl‰uÚŬÎA°aL#ĥÄÌñQŭTè#~ĝ<ñÑ:ràH›[5oŒFġ¤Ĵù‡fĜ1˜3Wùé|c,ċ·5žÌµË_ĉ3sځNJKġQ‚„ B)· ע•ğċfÛĥí†mÛ×3Žâm·[o!‹iϑô<ÏöÓµäşînÛĥ=KżúžÖÊŞó½n’Ž!ÇtZĥžĦˆr…;” x†àSĠÛ£y|6 ˜³eşíĤA²l¸™Ĥ? lAĜĝá×ÄżŭꈟĥI?Ñï^ëġzz½ŜĠ~żż9Q…fcH*@h;ÚnoÑĥÙP Bo{*³sèÌ&1ŭ•ı’l”´ħâe݉ÖZíĉç úĦӉ>h­ùmp@İ•;S*™·F£O5Cg:m‚T‰MáŒ@¤GĈ†,2hô šIµLşú„ıAOLŽžF£b—NYœĊ=ĜÜl.ï§{žçÙ½^o;u¤Ë>$šÁ˜&zŽ„Â÷}§Ñh´Í{˙[NŬ~ìħîym¨ÏzŽré eµ™ÒÜE.—Îx.8TKcšĞoú|(û%ĵ f4ùT4ʞ^ŝ‹Ön!Œù=ê! j°‰kßù*žùw˙[t˘iŸ£™Ŝ`ZŻ×ğĜívŻôûŭnœD§ ÌHaû†× D5zÀikŞÚĵf%Qñıd§Ù¨!Z§_(fÖ̜ĴóJ@?ĝŞGDó0ħĠB*wŜ-FyċBs&Ïnş¤”ħSnWç 'mZZ˘‚è9Ù;Ƚ<½W”Q~#H܆MĴvHÈecl 1B@µ…ż´ŽôvÔÛmj¨ügœ,‘Áĥí=ĥmşçŝ퐂ÎôdSJ5ò…Áù2tĠÙ4Ş#xĤ.ôì†iVSöXU <%V§0ĴŬ:#“ş@ ²Âġ5Ĵû‹xé˙íà–ĥ÷×I<ßï÷ÏtğŬ‹†u0 â´a$!µM ÒĜ~sk͆nìšS0Í28”½ï²ä½gGQ”):3>0³^‹|œµz™ġqj&á.A‡<ˆËb‡£üÄÙl¤yf` LŠ#““wÖñ䌤’bpĦŽ”O€áŠîéAœim‹4#ŽÊßaġ‚ċƒŽž3Sd½ĈQÜRŬ[ H³8Û;ÊlŜF£ċyŜ×u÷~÷#÷ìıîċW†* #Ti#›ù!zF—ÉĴúˢÌhĤLÇċ5#T²³Ù½H\˜.Ĉ3XZċ‘Ä…×$'Ó!• AR ¸xŻ~á°ġġżĜ:ħÜüf0ĵÔï÷Ïôz½KŬn÷Zżßï™zQT¨é@İ,yaĠ@ôÎaMÛuîa›ò]™„T”áR*cNÌÌhñK|’µ~Q‹şE‚ĴÀ&ı9ĵ0M€†NkIViœ„o6˜Q=:}áFĈ‡’SwòâtQ0Ê6J_Jo76†KöɵŽmÛMÇq×uí~żb:ħ*ïÛ NoWÒÌR†YF£áyŜŠ8{mÛ>x÷§éĥDôŠ'cF\j*˜:tĠ™RħsI§uŝ%ÓUŽ݈â…+PŜğšQ3’DVú’ψgŝß@<û½+G;ŝ7†ŭŝ+ŭ~˙l·Û½Ôívׇá FŞB˘›•°ŬŜ˘ˆn.`ʳ%]Á˜f]””.­5Œƒ,{n£Oü2N¤´8Ĉ"Ğ™Ĥ…‹ħ’²-0š8ßÓ^ŽŒÈ4Âĉvi ‰5rġ#™†Ĉ!TĜx2ŒıŒòi`@‚hìµ+­ƒRv¤”M“m—ġ#)TGBŬ01B7R iôÏĥméûÛl6[žçípgïݏüÔŭ­‡š/ •ıòçQÓİÖsdⲄlĉ(ût£é´%ĵŠñ Ĥ4%NH‹eżk‚UÌDšrәc)Ò“DôÌü—^}úÒîĤûÁ`JŻ×;Óív×úŭŝFżßï™IE‰.Aµ‰ázëE5Ŭ<ÀT4?TÉxĊŭ`Ŝħ0ħ‡03Ċq<ħ‡0§‹šô˘8NŽŭŠmï2 D@˜Lš ĥFy­Ÿ #Ĉ''˙ĉĈT€ó;~e{B²ç޳3'EÚ/,"ôÄJ“aŻfĈ†\jƒ*\óíßo9@Ŭ('¨‚-;޳Çk6œüĝϜc=R£Ù!é•—VÂ3~f6R͌xî\Tž§WLXÀĴ°‡*fĀe‰‘öÜġY<ŭı‰ĉ™çÏíp­oöûŭWz½ŜÙn·{ıÛín']¤”ŠdE‹¸éĉġUnD5½£€İ¸ĦUċíiLÊë¤Ji1 eOĊ<ADö’xÖ;,,ç´ß>ÑĜ° „’ù/Û£²óĥ´q!2`ʞ=ċn žTqÒòƒIž)½4ӘÈ:Ói2M+°ğ*E+G:r”178–eI̞ġĥÛHó"ƒFŸ;Ž#³Ú‘8;ÇÙwë'~î{iĠyn`lŜ<Xş+İĜÄË´YžSšfFş WfÊt3żÏ 6½~qÑMGĉ2MÈ4VDĵú žŝ÷˙+w.rnĠ•ßè÷ûŻtğŬ³[[[—sĥîÌI—\'mÇEWÑÍL³¤ Ĉ‚nŻÜRıûİüGfĤ$I’ $´M/ÎҞŜs/kĞ-Îŝjîb1mnx`T}^çlÜı‡Hg(éQfûѕNğéq¨4lU²µŬkí]+ijCÓqßq[JTŒ£¨28̕M߉€4o8U°#ß°£]^Ğ}ä>z¨›htM,ˆR™‘ Ĵ^3=5uĤzÇÛħzgÇñ$}áYÀKtš™]ß<£˘¤X”S,J/:…L ½WžĈ3˙áCçâ+gVmñ­^Ż÷r·Û=Ûëġ.÷z½Íáp8Œ˘((iv­ê7*ĞÍ$̨p D7 0-"•1y{ˆ*ì€bfÇq$´Ì0È~’$=Ôà`÷ûWöÜúPë™×èPKšìŠÀ¨êœIêşìçgÈt˜ÎèUŻ”†V Ns]é,Mû‘šŽxëÚf…Âl·ŬÛŜîpĠ‰Û”äşċy^ĥíŽmÛ;O~ügßE–}z¨ ŒtÉĤĝ‘k1c¨Ò Á4˘ÊĜ½'°s‘Aş`ëâħËıâ #żÜÀ8µ{œîQ>î;ï$ñԿܿn:žš”û=Œ&ĉ4™8 !Rd½×^Äó˙AóµçÏŻXô" ‡£LĤK*İŒ)ÍËŞ›Œ:ÁŠj0şy@İ^ÎRl¨êYĞĵB°mÛäy^Ĥ°´Çéì<|ËŜğ>öw÷˙Ġ-\¸‚t^ëżIÀˆ² J#& oaċˆ˘Gê´†EHMɐ0!I)I!Ĝ'?ġ wŬ–ŭJ7†Í͝ħlfÈüúÌ"Leú›ùXYš\UCUDQ•L7ŭÔxvOOËtB‰ñ2½FĥÀüĞxŝŝ ĵWŸ´ĤQÍȀÑĈp8Äq<-êĤÛ6+ŞAèNJ-UÍ_Ҙe‘o (ùNÁ–e‘ïûvĞĠj´Z­eß÷wµWwzĝçēk‰ü֋›İċ[˜àĠœ„òŽ£ìÀ‰9˘½ëƒöÎ]Rv²qĤŽ”Ċ‰½aĈQĵŬ.ğÒfYfÖlYêëGï;żv+¤ħż½&J]2ĴÍ’Ĥp4™UW€˘Ê†ÑŭxŽœ+šÔPb×ĴÈjiħĝ\*0lRĤ·fS6 ˖Ż]ĈÙ/ŝ'Ĝ/>qe·#Ŝï÷_îġzg{½Ŝċ0Ş˘Y€T5ÑXÀĈ[ƒÑ(#0ĉĠšú—1£vğŬèt:+­VkŸïûßûK˙àsIÛŭÒ³—EétY$é‰òÍŭF£—N¤{ŸÒp\›Üi !–röo{ĦY{ġ[ržZ7ҁДâ8ŽuÇQ<l:˙—ôÏ6ÖÏ\ÛôĥÑÉ#§nKÓ|…5 ¤Íg:ïñ'äBHg*Î1 pÉĦùÇçâ†Êlş2[ĝ„5´ÂÚ-ÒyF$ÒÔîxk Wżùgè}ç+›G|ëkmmm]ÊjF`”lƒñYfEġ*cK@y¨gĠñSjŽħm[şkµÛmżŬn/5›Í=ïzàS÷½óäÒ_|w ›[az.G‰Éş™À¸pJO~­‘\rşX:àÈ0‹rˆ*ĉŜ”’Ŭš¤$5RÊuşvċċ}~˙(ì>wùü+ïY;~Ǟ}P,<8H °b3Ğ$'Ż•0£ru‰|V"£ĦB+•éf0£ıAİ%)°3™QŒRj™‚‘zĜĊĠo˙üğǚÎ×û½^Öôšıéò5#µ€TW•ĵ k‰^׃O{C•d45zIJ,áşh6›^ğŬ^nµZğĈĦï~ü=~tïŸüÎ D§`d†PNäLŜ `ŒHİ‘$ ˘µ[[­ŭ{äĠŽİ#yĥm[3€hÖŜŭ–Ż7C ħ”2Bl0³­µÖNw‡5~öŻOœyċÙw½ròÇßû~ħ|è(`ı `­ġŠÇµŒTZ0â 0Ą̂LĈ+}üy ³<#(µp_!S0â$ĵïg>˙ıá‰ĤóíAŻ÷’ J½œĊmŒfÍ1ÚNêB F5KŞbIóÀkâX’R’çy²ĠjıN§Ójµv5ƒğżŸŝ•[żörž|­ *è@f4Ù4²{‡ƒ`š}:N ˆ ĵŬXß\ZŬgìßÙ8ŠmŽ5˙ħIû.]I’pŠˆ­µQĊžçënÙaxu§Ó?ËOġŽżúâSwêSwŻyäqZ=tdğ`cxÄıħ•”ÎĜÒe£)Ş™/ ӕŬ8?(uòĜâ’#zak7ĈìHÈ4äQs‚Í'ż…˙˙—œòĊwƒ~˙…~żfkkë’aFEkwŒÚv½¨˘z½N•e´J)ÉqÑh4œvğŬi·ÛğĈfgéä#żôxvMËŻ=·5H€X#!ô„Zwó0£ìıaHûĞ,ÏĈ–^j ËZĥ,еà8ŠyléM?‡ßn@šÚÀҀÇqôû}=•çyĦïû=Ïóĥ\×]wÂÊ.§{Z?ħuËkÏ?yÛ˧îY>öÈ´|à`Ù +-^ĤWCÓoĉÙ2Ŭġ–0£²ç1cŜiY6]:ˈÍ † ²[O}Ï˙ÁżVG­äGI<7 ^ëvğz½ŜFżßïFQŒ4êzQ½Ŝ°ÙÎ×p]×ò}ßít:­vğ½Úh4öı{ì‘_üí÷^ĈŠ˙Ï_AĜ€XC'ztA:y´Ŝ `”{Ü,ŭ[’(òvˆ µ|¤!G(\Çqd†Ù¤ŜYéßoİT÷VÒ<­xŞî“îE;Ž“PĝßġËd1g`XŻ)ûVš§˜‚ XÓÏáĊ?ŝw|(éż`%ѽÁങg´1{I’, F³ U&†Œê5}&ċş*àİLuħmÛò}ßît:ÍVеÚl6÷{žw잟ü…ÇäÁğVżĝŬ5ĴŻiKˆRİ”•èÉóñf£|.‘ĜÍŬĜĜèìm˵ĥmÛ Çq\Ûĥm)eX#TĈ†ŜRpzğRHqħ…J˘(B†z8&žçĊžç 0mzž·î†á•}n÷Uġŭî‰WŸùŝIy׃c=†Ĉ½`ËINhFš…§ /9Oó&%¸ ÷]Ù ċM²\9B"c?3ôör™ÎüÊ´f$!-Bxġ"^ĝÏżĞç.ĝBŭ ›ôÚëġƒ^6\óÓĉ™ŞĠ@TŻm0#š#!L|³Ù´Ûív£ŬnŻ4›Í½žç=t÷ƒ|ÏOúÏOmàċó}p¤Ħ‡ħñ=n,żİÁ(:I ˆ!ŭĜàNçˆÓ$ëğk™ĦóÓ~ĴҁÙ9gl­µ 0Š˜0ÔAÄá0ȀÉ÷ŭu×uŻşApe³ñŞúë­[žêğ'œ{n}½wî¤VİO‹ñĤÎSgOħ˜*ë6—lĊS٠ԌÊea°´V™6Á IPAżŝàıïoîöċ_wğƒ×z½Ŝ3鵆á€e‰ ÛqÔĠ`TŻ7‚ÍûLì$˲„aF~ğŬ^jµZ{=Ï;şĵ÷à]÷ŝìŻßŭíÓ}úŝé.t˜Œ‡ñ)L‚nbf”L¨l Vš‰vYV˜Ż#‰8ŽË$ğ·=Fè­¤Yŭy*fVÒZĞ(Š˘$It†‰ĤĦïûŭLÊó<ïŞEkûû[/ÇßÚşċÙ'}Â}×{G|­{ĦI€@İĥ,RÉUóä‘F É!Y…t„˜2F³&½VÚÈgÄ ó?BšVĦU‚­'…Ëġgá݆ġ׃~˙Ġ~ż×ë­ġz½Í †I’ÄıH 5ˆj0Ş×[!ĠÍ [ŬfY–t]×ît:~ĞĠê4Ŭžçò›­“|ĉ<üüÙ_yvI7˘$‹[:'] 7M<ˆN{?ƒVi3ê\’½vŽd ‡‹Ġï~lÒ˘]Ùùĝ¤Ó"£(â$ItEqE0ġ<ÏÛò}ŬóĵĞnt7^Šıyêı'ż}Ìż÷˙èÀ[ÙJmiP‰É4’ˆˆĈħÎÓ@f´Ċ°¤ˆ+Àh7Ŭèè€`@Xé`î³?Ä Ÿ˙÷ꄃFዃÁàlżßżÒï÷7ƒ ’$‰f$wW’¨Á¨^o…T7 ˜2†DĥmËVĞċ´Ûí–ħwr]÷ĝğŝ×ßpv·ĝŭ5 û1 Tê´Í˙8Qv£Ò`J@dC4öáÚ°³gE\l·gY–Ub˙š$û–Ĉ½•€TU7 Ê/U|À ˜”RAEQ¤Ğo€ióĵĞ^­êmĵ|íÚ­Ï>ñ×GĵûŜ{àaXíU 0„$3„Ñ€ÒDa&J …·tĥÖ잨*0b¤LŽÁ &CDœ/ŝéçp ì,tüLo0(ĉӕÑëí3ŞÁ¨^o48UÊFëÊVĞe/--µ[­Öß÷÷;ŽsìÖ÷}â1˙Ĝğ˙ûk¸ĵ€:ÖfXŬ1qîU –×ÂwÚRÊl…çyŽ˘ hÁ÷ìM;×ßl@⤝5U² ˜hĈ³RŠ•RJk­£(Šƒ =ÏAó}sTc µƒ½çûŬ+·?ŭojŬ˙˜{äwCĥVÀ€`Pê J'9j@,,=*tÙS]´éµd¨ ™.s!D„hë*Î~ċóè\|u­%ġşŭŝ™~żİ×ë]‡½8޳{UŒHc~$P Fġz3ċş™ÀdY–l·ÛŽqÔ-7ŭëÛwêžN|èoÜòçÏnáùóp˜@“”˜$oĉ™şúMF' `Y`ֈäŞPsŻe…-“ÚzĈQÜ´’]KÒ Pü<£’ù S)•RI’$*ŽŒ- ‚ èzž·™Iy^_9ÜßĜŬŬ\ğÉï@ëŝG#÷>ÙX„„ȏ¤ 3M¤<Œx•:ñtuÍ(=Ħ€e ¨8ÄĈ†á÷żÖ;îÒ·û½Áé~ż!sÔEQĈqa~Xj Fġzğ亙ĦeY˘ĠjÙ­VËït:KFcëşG:;÷Ŝy˙Ï˙ĉŭß}­Oß~~=£(5ŒħĈ4iŝħ£ñ<^$R w×ÂğċfÇLÒu u¤Y1BóĊ;Ş")¨˜¨¤Ê6FY(3³J’DEQ…a¸;‚ kdĵkžç­ùq|ùhcÏĉĈ;ôŭŻïïÜ˙˜}äŜ K &hS–DÙh­uıL·`jwĤ ̓éò̈L5‹è>÷œùâ'·6ìï½î+ŭ~˙ĵİu0 ’$‰QmçŜ.•‚Q Dġz@ eeÛĥ}ßêt:n§Óia×óoyĝûÑWúĥó•g֐D&£.ÖiíˆùÇ\Ĥ+Ôo\úâw×Û1ƒM€÷ŒFç&•_ÓWğ)Àh´Éê4ħša zİCĥÌb„ĵb„ĉ½goÊv$5” ç*ŝqzÎA›ß0E 0e€& 0 fVħYaa2ƒïû×\×½ÒKËAwßú•ówüàğ_Ŭ³Ħ÷[ïĵÚm„t6•žiÂÎT<öĉÏ3Ş”éÌc’DHš m$èaí›_FóâĞW}‘ü¨›:ê.÷z½ġÁ`0ËÄp=ġj0Ş×ëG›òd†JİÑhˆf³iw:F³Ù\ñ<ï€mÛǏ?ôĦÇÚ'Ŝ÷‡?ĵŠ ׆ĦGǰFÍ!lNĈm‚QÖŸşTrâÀhb˙V I” ħVĴ>uö;2lçëH7Ú8Š·S²›‡²ùNQD\L˘êsLÒHy‘qä ³“ïûa^sƒàj3^Z ·ö]ûü™Ûŭc{vŜ˙>yŽğÁn3­ç =Ä1›@S.ŒĞà™c.ĤÈuÔ²h Ñ× HK`ëéocŭÛž´ùğƒŜµÁ`pħßïŻƒÉ¨‹pŭ5#]ƒQ½Ŝİnâ{ŽÈN§4›Í–çy;lÛ>°ëè­÷œúÈßşíË/lá™Ó[àaÑHsV.)P„ÉKaĉܜ–İKd]ħħżsÁ@$dJ–Z{qµ·t€¸šġ#yëÚŭ~?ÄüħĉĊ÷éë²[¤f’Èm–‹S2 oôµYJk­’$‰â8ŽŒ”×÷<ŻëûŝFEWŬ0\k{‹+a˙ÀĠ ŻÜŝÄOí<ûċґ“ żhÎúÏÀ*}t֜Ê+Œrċ݃'—ç 'ybÎiž6c²%úŻ<ƒWżÇ|ÂR? ‡WƒÁy“İÁ0ç¨ğóÂ\0ŞW½Ŝ y.˙ıİIÛĥÛĥ›–e-7–vì÷§ëÑž ä7ŸßH'†*Ċ!@&§sÊlD9ċÎ?Ŝġ4`ñ$:qĠ 2ÂÔ²R Ċ˘9 ÷&‚ÑèÉ0@ÎlÄÍĥ\Êĉ#9ŽcI)éFŞ#½U€TvŬ²¨sC—PGQĜLĊŒ:'ëMHy0ĊqEQW^/‚žçyİ”W–ĵÁùĠhpàÊÙï8ĝÖûz\,ıä5Ċ6ҁàt``*U”ùӅżŒKDKaÎKhIŬuœùÊçħkëòy‹’g·†sƒÁàÊ`0Ĝ2&†ÄHu³ÒşĠ j7]½ŜfÀ²m[8Ž!\"jĵçoŭî'^í{ŝ—ž^C˜4ˆ Lİ+ާĉ(jFz§&‚Sµ„$$°N°ŝŻA=ûŭŝ.‡żÛë ÏfRŬp8„aX´·Hí¨(ĠĠ`TŻ·š)M%4ĜĥMB­‡˙ŜÇŝÇïY‡ğ/ŝx° ÑĜò[ Ĉ2„ŬùŽI·ĥFÒ73Àq*ç…:eP §‘[ĥLéXd :R€Î&ʚí!cPfÊlşóh0‰ñ×;Û4›¨EWï†yb`4&d\ŞDBĞtJ§&€eħΡÛr”I˙v,ˢ9ïËĴ÷ ßŜ0ÛÜPġÇê3SñkYÁž$LIk­²aL9Ĉԟ0?Á•Ŝàì{‡.~6Ĥ÷ĵŸÚû,BJp2NzHġxœ˘í{ú‚JiĝüS8÷?V§<ñ`0xm0\è÷ûë&45¨êeEeóŒj0Ş×[%ÛMm~I’ IWp|ǽöopug¨CB× Uƒ™E?Qž‚ä4Ó6  ÂkCxˀӀhïÙ>„ğ’Jìd@„CrHèH+=Gc ² @™Óh)Í4vħe,Gë4Ʌ$²„˜Á éı/Ĉn(ĉ °³ŞZT%PM2£)I{UK‚AŭXïµ÷.KÙÉrí\×ÍĈQ¨7íğòÚ D§,Ş.⪏y–”L9KÒcf$‰PĤ6Š˘áp8ÌÌ[9Ĉte·78Ç/ö_~í™[/żgy˙Qsϐċ‚@P1C#6YĴMRwù$ż‘Ğ”şê˘ġË8ó—ŸÇŝ¸˙Tĝüp8<—ċÔúÊz޷׍£z½-+Žc6‰ŝħmÛŭ+ß˙ĉ.ÇyÙZuvÑŞ˘ AD€3ˆġR”l5#µÑ ğşĦ6ÙD‰Ç яtƒÄ‡íB¸MPcä´!Ë Ç°­Ĉ2`5!üôòR²cĈW¤çkâ܀2ĊcIC[‘›‹ÏT.ËIƒHÏm(5b]Œ4Hçe1IžSÙîİĞ“ĉFñID{'ÈmB¸Ë€Óy+ żá´AŜv6)3­MċfNS"X·ó¨ÉžÀ ÜIċANt*%Ÿ³hY3\¤÷Z钸ωO§…1)KìC,yJxğ¤ŒZ–eùŽ8ĥm‹(Š€Ċóìn:@ŝô§?Ï}îsóĜÒ"ÀĈ˜1Q‰„7ÏQ&Ĥ\ÓDN^†WŬ XÛëġ^SÏôŽ^|釷¨S÷/xè1ĝğöC * RtĴ§‚ú4Òï "){ùG¸ĝµżP'z2èŻ ƒ‹ƒÁ`½$§nÖ¸ñEúĤ¸Z FġzCP¨z:l%CŠ˘Hġz½D)5‡Úqœ@Jı)ô2p1ìc8ĉsË|>ú(„°XB[ÙmAI²„+l"iY–btœn/]°zêpHrކҚ‚X9‰bĈÚN@ìRÙpä4A §òVAÒù+ Ż !½t>“Ö ÄI‚Ö J4È3`˘A–ViR7˜ÁÂX-˜ µŸİÂliJMâˆJr`dĈek 'hí˘µ`ċÈ.Ù˙ĦIlpÇŭ~ğ|³àӟŝ4(&,ȖʀIĵAÀ$³û–Ó0‚áp8ì5-Ïó֍]üòŻ{:~êĞÇ/ĵƒêĥw·÷Ŭ÷ğ@³L/@J§†â§F¸{ çżöìnœ%Žž‡ƒÁ•Ìâ]!Ġi, ¤K^ËÑÇŒêġ6(%£cp8ê8Žáp¨mÛÖDJ)í PˆH‘-„Ùmĉv+@R!³ÛˆHš–"ûžm>Êİû˜û-Ûd !Ĵ.ÙD–Edgg‘+ö‡ñ 1tĦj!‚Ġ ŒdH0qY‚œ&Èé€üŽŻUĠ5w‚¤áï9 ŬÑċ˘0ìŠ5C=ĥĞ$Ġñ¤ÂSÚ™jŒéK+DjìHÉC´÷acÚıGOJé:Žc9Ž#-ˢ$IŜöÂşQŽÌmSU}i0kI‹ĜĈó}LYcí0ó÷ŭžİ1ÓAŻûJôėoıôÜwñíµöß˙¸;ö–Lóér ‚€A@a™ż†~ŝ‰ŝN[Ż× ·‘TÇqĵ@4c~Hj%CŞW½Ŝ´afMiA•ƒ“$ÑI’P†qîb*ċÎÇ<àˆ LDş2@Ên}ÌÀ(÷OÑèûRÊ  dĵĴpnÏ>J"Û"²<7ޝž4Àçäٚ5Œu;Ñ[~”lúa¤}²3ˆ”£‹~˜¸D@o˜ĝ°<ÓHkZN ä§5.ò: od5g ÂiĤI— @ç[€ÉżÌ^^˘t˘§°-Ĝĥ‡ Zé+‰Hĉœvìu_ ~·œîğÇé·‡î}´´Âĥ ˜!M’·@˙µWpöĞ_àS.=3áBżßż:³4†üä×yRŬĵônÔu£z½ Ĵ¨ĴĥTÖş‘Ÿ=U‹JWÀJ)ñ˜Q¸%˘Ôŝ&„ !„0ŸK"‚˜Í™¤”ÒXϔRQb"`ÙעZ"c]€ċżŸ1݆VÓ5Ì­iÀr­œĵhwµ şê ˘µ†²Äʋ-#ĊV%ĥÒŭHıd7AĥòWT¸ X)ˆ‘Ó‚Rɐ,6Ĝĥ¸ĞîFi9^ÌbÒZË$Ib3ĵĥ(ßj4kF1-ğğ/oµ:Ş×]ß`ú7‚q² ñ‘íµÛÑ­êv 6QMMñ{ Ĵ`4!CpÎ!„cŒ ¤Ş‰1ĤcŠˆ2­u–ĤibFÄɁŠĈb_Ħ¸ċ>r7öûHGôG£Ĥ=xî&˜†Nœâ’ÇÔŝ[Fñ<ϳm[pÎ Û˘Ĝô7…Q%išÊJîHOĝ¸Óä×:TWŻ{ Ŭžƒ|ÌçƒÚiÈÜ­¨܅çß)ŽS“ƒaÌr?àœSħW!t1€1ĤLiZg—ğ $ëA8à‹?LċÀßɤ#Byĵòĝˆ0à¤ŝ"Ç4tRi­–$I–e˲L„aĜµ,АċÚXè=NÒTÁLjz)o5Œêµ×uƒk0'TtÄFœż˜JÓÀnÀhÚçß*0H%˜Ì€ÒêŭÁĊİ\\iëCڃ`—_šÔż¤Ç„P€Ik ( ĵ=Â8Qċ˘ŬŞ='˙­W½Ĥ€Ï( L:>  “֭ޏI˙Ú†×$(é1jiš½dÜŝñ‰@Éz úOLƒ†­ƒĦĵQ?}'ŽÖ½Ñ²ZkÚá " ÇvGÉêşÄğ^÷£BšdĥŒ€ŬçŠv ž[ÒíqÚùD4%”£ÇÒ *+ŒP]w}Yô‘3˜Ĉj7`ŞQĦ†IUÂ#Àc>Ÿzòk £zŬĞópàÜIs^™£A(M£xĤԝVUğùIŻ ˜\Ħ8*|GöşúÔi 0aċt+³˜Ĝ”ô„+ıIÒ$0Ĥ+`¨CuġşBwÂyÀΓĤo546 xnW]Ŭiít1;(“ÔÒTıŸÔ^b}ŞÎ‚[Ó$8K°jìܔ7Ir;X&ġĠ#%êu?¨$`şh“ F·:-èVÁv+?Ú׀ sHÀ4nÁ0ĠE {LÓL°tÇÀIĈ\“ĤŬ@hlȆQ½ö8”FŬŸ¤Ĝˆóg·¸•˙VAw§C†;İÏqj‰vħÜ“j;ëÓ~‚ܘĈÁ‰FÜĤŸĈH·pWMġŞ×^…Ò¨sm\ĜnÜ1Î&œ·Óévžw/àµÓ9O"/·ş§ÜġeĠ§È-‡òv‚0]?ÄnŻl0…*ŞŬêu?o˜£q†sŝğÛm¸înÀ‹Ŭ…çOşJÀäiŸĜÜ´H·Ĥq!<ÂÎĠ?ğ-ߜf°^7Ş×}{íN;]$ŽÛ¸ÇAl¨ìUxíV)aûImú€€i ğ+ßĔW+“ĵzĠëAƒÓùUSlôÓ‹M Êğ ŻĤÜGh  ŬĠ=ĤҝÓ4eİÓP4ċǑĠê¨^œ†vċñçâ¨siEħSeí´‘;½Û…×­LtÂµ‡ìôüZ!í•ä6JViŒ§)¤Ŭ\İÔ0Ş×§V·­qççP^w;dxĞŻmš¨Ê=AQéöĠÒ80MşB£Û<jĠĞ^·­{Ż;2ĵ“pş•Ïk ía0í$Çw{0Ó.$x £zĠëÓ ŻÛùYğOíewŸiœj<èHt;'V½êUŻ=ŻÛÍwŬ.˜öD?#ݳÛ?HG¨ÓôíĥKzdÓژß_ŻzĠkì ;­ {ĈNC÷îä~2´|ï{ßĞÍU¤Ğ§ğ\şZ+˘zĠëÙ7öŭ󟂴3ú€ˆÀƒĤÊöĦ ŝ˙ï·n5Ê2qĝì‰Ué”÷lšıî5|êUŻOŬb•ħjŒĦFùÀp´˙ÉßÈD÷)t˙oßÖïŭŝ÷żż§ŝ5î1¤êUŻz}Ê÷ ˆòëUMĴFÀyż6b°/RçêUŻzĠë룂4½)Òy˜¤{OÓËadTӃĥj…TŻzĠĞ^÷V#1ž‡é3bù}°<ċd#]*£1ŜR+¤zĠĞ^ġş·<‚.èRÀhPA1£˘ÏĊ ĵj ĠĞ^ġŞW½î7r‡ò-Y„鈌2be=Cßsj ĠĞ^ġŞW½î ‘}uEƒŞ´ħBT‚èÁÜşk ĠĞ^ġŞ×½\ċÌ$­XâfMžK"ÎóŬ¨¨^ ¤zĠĞ^ġŞ×í+¤Q„ê˙U XEY=`вĞW½êUŻ{ $Ĉ*Jİ÷_ü]İ^ġŞW½êu'W›² Öä“™ŭŞ?<€ĞÙĠĞ^ġŞ×½^şâ{J9”dà¤{a:nz“FİĤHġŞW½êUŻÛZeC,™Š;ôÂtŠzUw€İĵcè³ށTŻzĠĞ^ġş3êȔw3`½>#£”r !*x9ŒîÄh¤½·êR½êUŻzŬËU„Ŝ´ UTÎòRïŞ˘z@W­êUŻzĠëži€34q0żT~VçêUŻzĠĞ^wrœáĵWNÔĞŞ+ƒñş£üùJĠ@ŞW½êUŻzŬAUû`ïċŠô€|˘Ü\• °ÊÎ!ĠĞ^ġŞ×=%Re la¤Q™…dtı2˘×;¨VHġŞW½êµ$RšS…Ħ*Ż($ĤÓŞ÷ÜZ!ĠĞ^ġŞW½îÊb¨§–ÍHTô)ħêxŠŻÜVHġŞW½êuo%Ò°R޸—9£b.ҐËj­êUŻzĠĞ^wjéİDz8gÄX˜Žj…TŻzĠĞ^ġş£İŬë5"PÏħĦÓ¸j…TŻzĠĞ^ġşs@ҁJ‡†ĦÒn­ó>2ÄV+¤zĠĞ^ġŞ×\ċXŜSFƒá¸Â`µ˜û€úĠ@ŞW½êUŻ{ސŒ£7i“3Â0pŞ* şa^ŻzĠĞ^ġş+ɰ†U”ëÏĠêk ĠĞ^ġŞW½î°H÷`‘3ҕħĉ†KT5ÔĞ^ġŞ×ĤOĜ°ċÑ'WSGèŞĤŞĴgÊxn˘ÊzJŞ4c­îÍú?ŝc6á`ş'Q½êUŻû:·óü;ş×?ި¤+ĞëXošlñj4@ĤGéAĴkĜ3@šğuĠĞW½>Ġšvż ~ŝÙGŠYL…Ġ†@Œ•áğ\ñ>'‡HŸ „îĥŬBĴ†W½êu߂h·W÷ ĥ¨Šß{Ë{„V½_G `ş×4Ğİ7MVëĥôû^i7û^Ç4ïj ŻzĠëŝ„ÛĊžÂFÀ†M *ş-0qQċMŻe3,rsĠò·>¸µhŸ4nċ€ı ˘;ôşï8ĵjpĠĞ^wFlÊ=eš dšFìöÀd~„†QoH_ßhóŞŻĠE wFÓ0wJ5M:¸Ĝ”˘)7ĞUW½êuÏ`t;÷§=§ĞŸÛĤSỲTOCá÷ƒŠU`D¨CvwFlŠÇîÄeMĝœM ÛU^uȰ^ġş;0şÓ{ í°/L‚ÓÎ`âĵĤĞ|Wo´yʎUĉ$ĠeßwNÓ lŠƒëNi§Ç÷2ĵhB£V½>0ġ9k4lff†sÎıçyœħ\–$I˘”E‘ŜŜŜœ„7 L4e4e<˜”îY°9£‘”Â÷ïHğUGÓˆíJ·ZşyĞPşÛş]pÑ­ĞT½îg6MyaËÀó<>33cÍÎÎÚÍfÓqÇfŒÙH)Ò4Í|ßÏ\×ÍĥĥĥTšĤ£F´RxĊ Ö8úšf³É:ŽàœsÇq„‚àDĤ”PJQÇ$$)%²,£,ËvÊïL‚ Ŭçû6ċsЏŬ‰|וb ¨zŬ§êhġ=633cÏÌ̸ûöíkşÛĥmğ9÷0­u&Œ†ßl6ŭVĞ•noogïË4Mi@ Ŝß Lc‹š˙àG4\À@Ċ?vFJ÷Àk ŬħИûFƒïßż_4 gffĈvÇàrÎcŒk­I)EZk%„”RI)5‘RJK)µÖš¤”Z)…,Ë´RŠ Ä4H)iÀLûµ[}ŝíÂk'ĠĊnáw =˙ĥû*êUŻğ£i˘,}·vğ]ì/mÏó:ŽsÈqG÷Ÿ~öÑÍĞo-k­SÛĥğŽĴÛĥ½îy^·ÙlA$[[[2™e™€‘PJ;U )üÏż ñ÷~De5]YÜP^%ĉߍ;¸V5nB˜f+Çqx£ÑpfggëĥÇÙ'„h3Ĉĉµ²œ=J‘ÔZ+­µ""UÜ×f‘2€*³,+Ĥ•RÚNi­)MSÒZëxé[„Ñ4 ş“!C£´&U ‹S zíñPŬT0rG4›MğÓé4<ÏÛïşî ÛĥOżí˙ĉúÌo˙Öëoĵ}mŭí?=^½tEħÈ9_´,kÙqœ ÏóşF#ÜŜŜŽ0Ó(Ŭ˜˘˙jÀôE£Ï~V=9k Ŭ!0qÊWBD²¸i­3Ċ}ED€ÔZ÷=f>/6²fÒ¨*-TJċò…4M5cŒŠè]€×­†iLÈoÚÊ ‘`ŞĦTŻû T7jOáû‹ĠétÜf³9şî˲î:ù…ĉÙŻŝĈŸ½ıŽùġ§ûÜ˙îÔ\pay½½™l\𠄘B,Z–µêşî†ëşÛA„F#P†aX€IïŬéOż“ƒéğ?Ĵ|ï?5k ŬħŬȃHÁ…mÛm·Ù:ŝŬ˙Ë˙í˙ʅµ{y!”I"•$‹£,Ú\˘µ ÚÚôğ‹ó›D”QĤµ–ŒħԀ*1ÊŞ7Ċ}m>—Xeĵ ¸ŠŻi˘\@7£ĴJx)ô(xeYĤ”RE΋v2œVUјç²1Ç%[وï­ĦTŻû!T7F³m[4›M§Ùlĥ]×=hÛöI!Ä#~ŭ~çú†²~ŭŜ’Táĉâ6N<~äħÏŝëߙ /<żqŝ‡o͛Z–uÓ²ĴE˲V=ÏÛh6›]ß÷×u$Iî˜ŝìï0ŭˆdet/€4N!•÷•RœsnqÎLĞÎŻ—};8pâwq ÍS ›á ‚Á` ™İhc5QJéîâÍ ´9Í'MÙÖÍk[:Ë⭅›ñÖF` ”U•È´Öiñ˜ÖZV Uܗ•[ZĊMêË|MR^Y–•ù.óĝN!Cš rv‚Ñ¨Ż /°b5”êµÇCuSo6›vğŬöšÍĉĴmÛsBˆÓǞüÊW­CúĊ/n" SRbàíח"ö‘SG˙âżŭ;ûĥŜûÌĈ{ù:ï.$„XpgÁĥíUÇq6šÍf7 ;Ĥ‰‘ŠèÏL(ïïŝŸ‚÷˘ì{쁔e´Ö‚ˆ,"jl_xwaóÇŽ‰yÁ 4 •c Œ1sk_sÖeh>t¨½ßh<òÂác8*8šœà›3¤A7“A7K’HEë‰ÌRŬ]ĵÙĠZÉÍëW6@”­]¸˘²4ÑZgŒħTkVTV@*RĴ´ ĞBqW5|XĉĥŠĵĜ´ùjħF’$ @QiˆŝÈħÇżú?ŝµñÎÒúğñJm]ĥ,kÁĥíE×uWĈFEŬ ‚0 G‰ €I¸0œLö˘sö:/ïµuPߕM’$”eI)ó ÷ê…U+ĜN5wÒ M9´ÔàŒ•#C$#óŜäÖžĊàఉ`i‹(UC˜eX.J)‰pG>Î`1Ïí8M¸6ĵ#-‹á ĊÀ °ƒ#ÁĥW""ż²)™‘żşeq‡kĞ~âoáÖFPÍwQ  „— Ĥò]ĉkÊN† ÍÏQ$UUg&ż•™œ—̲LeY&£(’Qİ4Mu†;ä‘ê°]½öx¨Fx£Ñ°;Ž×h4f]×=jYÖİ=ñÂŝ³_9öçŻĴ ğ‚2ÒDfÉŻx,19şRáüG)ŬtĊ'ž8ŝè7žŭX}}aŭü_‘q÷ŞeYóĥm/ğğâşîf³ÙÜó5 LĊşe0=híÖ=8˜Ĉö dY†0 UšĤ™ëş‘mÛµ|‹O$è|R"2Ê(ĞÔċsΠÍ5r4‰´\¸‚ ,aŽTÁ ÂÎŭ óİŒùû­9 5AĤ@ ÂĤÎU—6Ô ( h‰èò™Ĉ>WÀ=v Ùûg°08œÁĥt–Ş`}5ÑZQw9‡Ĝö _k•m/ÜĜÒ2·ĉ7íó]iXE¸°€˜ĵo*­u"Œ¤”Aq†éĈĈF†!Ġ!ğzŬÇĦş!ıkµZ-§ŬnwĈ!ÇqNĜŽ{öÑŻ˙ç?¸²wŻn€2 R¤óp` žgÁĥ,Aù–ÀE~CE¸q†+ ĥ8sü™“~ó…9ôòüú?~͊ğW,ËZ°,kÉóĵÏó6MŽ)ìvğI’$“À4.”> LwnÓ§H;)$&dqĞ$IÒF£i­·éó+­“OÌXŠS2wĠĊ{aBsZçjp†&€Ĥ`h0‚'l–+ €Ċs…@ÔĞZÑıR*c(ß_fúĠ@ c P #&‘BÌÖuĊòŜ6ĊJš3("pá°}͖Ċáž8Òj٠͇?sĜ G²l2ߕEA&P…ëk‰”‰òW–|­TĥyÊ&,]şî’V*1ÀJ+áb)€@¨µöµÖÛZëġ4M7c[Zkj4zssSORF5˜êµ‡CuC%Ŝ–e‰VĞeĦ:Ïóĉ,Ëzĝì~ïĞİ}¤ŭĞóóašçŒ”†Ċ:M WÀµ‹CpÎpMyŠ@’@Ş™V¸~} Ğuüà §ŭĈNÍ_^ßüègŻZħÍĥ훎,zž·ĉyŜV£ÑĜ0ô}?­€IUÎ7=DÀ„ÁûŭÁ¸×ĉŞC·(Š(Ž,˲PJéÛßşêüĉ?~‚´Î{ÂtJ x %`y8ÍÜlĈóÏ9 XÏP—tġ{İü}—!+Ŝl€éÂl*˙šÍXîqXžˆÜ6^A3-rpiž”™F(ĥ}ÂMΐg )ħ$„’ÀCċö~ğeÏXm´ĉŽuöÙ­GùQÏb˜%BSp<ÏG0Dk‘ÊRooÄYÈd{;Mĥ7˘,‰#ya]eÙöú• i­•R7Í€t]7ĠZ§FƒEQ4Ú^ġş—0šŞÎ Ïóìf³Ùl·Û³žçµ,ëôìܙg=÷Sŭĉ:–—}@JhZ.nj'n4lÇa°9‡ œħ^â‡R™ÒHFŞ9â$ĈâÍ+›Ž5wàËgÎ~Ë'ÔÍ_]Ŭĝ'Ż[Y|ͲĴÇq–<Ï[-À”§˜Â,‚T) ˜ŞùÛÓŭĴ–Ĵ½rü·4MÇħLÓ4•RjmiÉíF`ƒ„ÎUÑyƒ`Áòƒ‰#Q~Ääìiôeëü4×-†i€*œásD†ü5Eg Òkĵĉ É5$H•B ’ħ ÄÄiBJl& `·Dùê·ŭRċŠ‘Y ‚q4]m÷Dk_ÇBs?v:‚ˆ`hXĊ°+üÉÛ×ĉ÷_ü˙xíŝ“eY8‰ íğòŞËżëu/÷†Q5Tç8ŽĠjµĵ"TçşîIÇġÎ>ùÛ˙üsbñú‡ë€Ô :ÇĴ'iZhıžáXĥ`àÜì½)âDPš!Ë2$d„HfX\̰²a;sżúĜ™o}éTz—W6/ŝìuKĤ×-ËşiÛö²çyĞÍfs3‚n³ÙŒ|ßO˘(’Jİ"”÷İÓ^ ٕ÷•RˆXišdY)şúĈÇŬĉ™/6şi­œ¨Ç†!Hħ·ŽFíħc`4 u½ŠC‚*3³¨˙µ)mÄS~ qX`°-İ5lĈqB˘KçE"U)A'àGI"Á,Ê4`ċĠ@)ĥ(ËϚ" fj<¤ /ŝ/pĵħŭÂëġˆˆ+ µfDİğMġŞ×ŬVGÓxÔġċ,˝NÇi·ÛÍVĞuÀóĵ–e=üĜWŝkİ3×ùÙÛאe:“h7ö{3MmOäá:›ĉGœĊ…Íײ ”Fĉ8H%Ħ!5âT#Ê2ܘOħ¸êıs‡żuîáßüÚéìú/.o^üÉĞĤaÁ?Ĵ6›ÍÍf³éû†a˜FQ$8–aóO˜îucì$7Ħ*I’TJ*ĥéòù%ïħ/ñ3!3f’7ƒ~ʋˆċW3ĉކL˜òtÑ8/B;8ÍÑȎ =—ZÈ_U(8ÎÀ‰h‘"hÎMȈ2…8%ÄQ–żÔX J €ĈVÄf Ġ #™%À]àċżğëîó'fŝ³–YqU†8Ž)I’êÁ=ҙ¸áĠëĠíŞJâ–e ×uVĞĠlµZûĈœ8§žxôıcÏ~ûÔ_ħŽ…ċ”)´`ĥaaĤ!nXhş- 8sIF/Š` ÁGxBÀµ$<ÎÈWo$¸ıìx'|ëÉSßüòéäÚÏ.m_ŝĠë–eÍgYVÓVž^Ú˜&lV÷/˜öBÈnLY–!I’4MÓXJéĞ÷_ğ*ó/ŸÑ*c a öFó7–È4Ai@i‚f€"Fyñ‚ Ê/;{d—0š¤¸žB4sòse &X^°AŒAq†L\6#…0Èzy-TôÂr–‡ ¤L˜ ¸™ààGüÁ/½ûġÂ\çoéµDÊ0I’$Š"™eÙ8Ġİ×½‚Ñ4%Ŝ} ÉĥmĞÓéxív{ĤÙlv]÷!Çk<öÌwŝÛÏw=dŻ}°’žÍ0Ó°Ñv9š^ĤsM40Üĵ8·`q [Xp-‚“*¸)Ĥ >šâšĊ›gúŬgNžúú™Òß~Ô½öò›–eŬ°m{Ñqœ%×u׍ĈVE]ß÷`ŞĈc&5ÖŜ×`²öâq™ĤİŠXfYgYÈ(ĜhĴ͇ĵq¨%ueÒOŞÒbPÈĦ”1ç(ßèx§î$ŒhÂ(Ió¤Lĉuq0Ĉ ƒE Z)DĦìUü ^'I*Kâ!ó#ƒhX`‡ĵqÑk‰smĵ×ĥĜ…$IW“$é†a˜A +Ċ “`TŞ^Ÿ$Œ0Añ›0y#gffĤĠl6yžwÒĥí³Ïüö?ûúĤŜ×üé[óI ×AËa½Š:Á ß5ŒŞ{ċĵƒp8ÁċaĤ$ ç?\Áĥ×zôÄ<âì7ñ/ŝġŝ·+`Z1`ڌ˘È÷}?îvğIħŽPJÓxäíĤï}ï{{ĉĵŜK@êğ"JÓT›Â†H)µ­_Ĝn?w˘ĠͲĵßHoûšòž!İ#0p–7c‰ç!=ÎnBhlÜÄñ]ÀˆF} M†UŝGş˙› 8)MèéjÀħŻĊÊO,nóĵ\5ZFĝúp\oÌmµ~™Ĥéċ(Š····ĥ··cß÷•QHƒàİTŻ{1†0JY–%ÚíĥÛétÚ­Vë`£Ñ8ĉ8Î釞ŝêfNaîżüjĞ[1˜Öh{6Z.Gċpm[pX· £€Î!‚à‚sĜà…(aƒožqi_³ŭĜÉïnîÑß||ûÂßß{׀iÁqœÇqÖMS†aÜív“0 eáĥ‚½òĤÓ˙ñï0ŬM í4nlĜÎx´É4M)e(ìê+ï/ş/üÖ1ß LٜÖ}0òÔRŞ€”ċ×7ÌäüÀYŜôĈ˜Q$ԃ*ċáDš Œ&ˆ†ŽgME”‡ÉÜA*M?…RzBÑEEħs€Yy§.s-0#x‡h-_ÜzdnĉoÓ4½†áÍn·ğĥµµlmmIß÷ĠÀ‰^+£zŬ+u4Ş v$„PÉ5›M§Ŭn7:Îl³Ùœs]÷tçÀѧ˙Ĉ?yò—m½+[ 4E›ÚCa9Œx^ÀÀĜQġÛclÁ‹kXŒáÛb ³‹×|:è<ö?ùâħÇVÏm^ĝË÷˘ċ ç…óŽ,ׇf³ıéyž†aAz‡À4”#Ŝ `²öêA*DJŝè­ëĥʞÓR 01FĊŸ65…B!o‚5°˜ébF%ÑÀeĞ\Ž™·’(L­{,ÓXe¤(ŻÌÓĤħ6Ï{ċ˙4MÀ†/‘ÊÜÒ$·5™#Ì& ƒ[á[?>üuòÔÜÌ/²4ŭ8Š˘ïŻnnn[[[YEj ġŞ×ŬĠMRH|L–e ÏóìvğíµZ­}Ífóˆçy§\ŻñĜçûßċòŠĥùö  \Îò8NĤ³9ƒıIóâÜ2Œz˙Ûây+Š`°,À*wnဓëk!~ıbîpgß˙³Ż{tñÉ͋u>Zıx^1oÛö‚ëş+ŽĴ·Z­­B1AFQ”eYĈnL£„C˜îĊ…è^’βLfYI)C™Ĥ[ÎҕÚĤ#S‚ÎLÏêˆħxħÖp‡@^]|I3À"ʏf£Œ8zĜ Ö§’X_‰†½hPDTĈ–”+•ÄTş<ä@’š Rڊ$˘Tĉ˘Q˙Nê?œLOÀÀ=ôWĵġ7úùƒ×™ÌŜ£èşïû˛››]ß÷Ó ”R cHëUŻOFŠĝ…ÄmÛĥZ­–Ûét:ívû°çyÙĥŭègóżŝf`ÍÍüġ›óLİQ°ĵ╁Àç–P°˜†?Îpy^aa5ĉ#û>ŝÄżúĉÑìâS›˙ĉxê‡E“q_o6›[JQE٘YLğqżç­Ÿ$Fŭ£'n|Y– ²a–eşr~Áŝâß=(heJ›ıéIB˙FA¨2Tügú‘4Ğ˘‹|’úBw̨ş/ŻÄ*ê‡M· Ô_‡@u¤u &m*µ˘Lc#È MHO)ĝçġˆËĦ)˜n"|ŭ8//ÏÍ6^Œ˘èJ‹Ŭnw³ÛíF•ƒĥ†N½ö Œ0ŒúúšÍĤŬétšív{³Ù<ĉşî‡zü…³_ŭ‡ç~üÎÎ_Ŝ…Ĥ6‡kĥC+ƒŠÈƒ™³V‰€÷żĴŝ‹N2êgÇÄq…ZœQ^Znq0Fà\€°Á²4,ĜQ†n”á£Ë1n.…8yôásO˙÷ży4şÌĉG?z+ÙşyÑĥíyÛĥ—ŒóFĞĠÚ0èvğш!Œ8v7žXˆ}@˘ÂBc'*tšĤY–e‰RŞ+Ż|°à&~FÜħc`"‡‘Ĉ(”—€ ó éÜĊÛ•dÂt”?‡ħĵV˘ Óħĵw‰İTTħ‘qžşšÎÔ4PÈ^2>YëŬRça;i`¤ĞŝyUedċ݈;yŻtŠ­ż‚3˙žöHû—q_ ‚`ĦÛíuğŬ0 TJİoD5´êu·`4ùu°ĵğÌu:f§ÓÙßjµĉ<Ï{¸5sàİ~˙żûü[Wŝâ{k $ƒ£ O!rñĵˆĦ,Ôĵ ŬtĉT+îı/˜ ÀQ/JϨĜò£ZħËĈœ>œ™Ğaän,ÌáàLƒ1N °¸B7Ân€c‰Ë{èĜ‰#O>÷o=˙ÜĈ…ĵ!ü•m۞wgÑqœÏó6ŒkuzmVıĝÜmïž@é“٠ޣ‰µlRÊH‘”2ÔZo³Ğ{òéÙDKÈXGĠH´e 0­A”ùQ>IWÂvÚlœ¨T?•T@U *ïú׍Ó‡zfĊEÀZ7AŞ4”î)#eš|‡”˜`30›Û á;?‡|ïÙs‡;/gIüq†óŬnwµÛíï'I’(­ġ¨‰²ÀèI³ġŞ×' #ŽñE –çyöÌÌL³ÓéìkµZG=Ï;eÛö£Ÿûî÷ġk]×ûë7ç‘D¸&4<†;w[Ĉ›°*Bu¤zQ6òúk„ soR‘î]°š0JĦĥvu×à<·3I0Ïç œKpdàDÓA‚âĈb—=4wòèıçŝÍwf—7>ĝó×D¸qɲĴyÓ\[‚)‚Àóĵ8™$‰Ĵ8‹—İì)˘XŸ8”îEi܈íĦNj‰§iNPJıM—ß]k=ôÌlRŝu&5§j¤y( Ĉ Zċí:ĴWö]6˜ƒ…é^ݸŞÂÈÄ Y_}Mş}Î yœ/„GşgZdˆ3Ğ#…Rċ7Ŭ‘4  à.s’Ğo zíŻè™Yç=&Ó a^Q·ÒívğAÄqË ŒF)ÓİURmĴZŻÛeÓE41oäyžŬjµĵ™™™NĞĠ:Òh4rçѧżù™µÏì˙ÑŻ–°ı™BË!4,G°FEu,Q>–+ °Ñ]ˆEnxt¨§˘‚˜#f˘*…Âbf?é)§ßSħcĈ šϛÛíü ™šŽÙc2ĝ1 àotqÁ1żàñ‡Nœž;÷Âż˙]×wiŭ*óéµ7mÛ^r]wÑhlÄqĵmŞò’ ² ˜ĝm@éVH;ġ"ѨP]ġó,ËŞŭHĵ|ŝĤŭ›ìÒÌ(wFĊŸ<)|ïŒJ"žÇŽ‹P0%àe•Ó9¨È\é0ÊĠ`€rÍ?Ü41Zċt‹Ĵ²¸„ ’cirF({’Š[ŸÊbĴĵ:wÔú5/˙9ĥâk-Îß ‚Z·Û]ŜŜŜŜò}?Š8PF£ŝî“ŜzĠëNİ£iĵé†BuFi6›î}û:ívûp£Ñ8éşî£§žúò—<ŭÛ'˙ô•\½(ĤÍr; Á`Y,/n*U +ħÂ}ŸĈˆ".Z`èoŭ€1r6 bĉ—™Yjù>Ò˙Xq‘[œûĊ†P”†ÛšCۀG äpÙ  ˆÀ² ÓÛJâŭ Á›Ž8}쑏î˙ôwíí×Ö?ü›WeĵuĊ(ĤE×uW‹SĞĠ 0LPK´ĊŬŻ@š(šbC$3/$Ͳ,–Rréúrck5aĵċrâĤŒz<ŒŠÇS%â2N EĜN3§˘ÈLÈ.Ÿ ËŞÊ¨,l¨”Óa0LW €e›A–›ÁêaéJ˙ç´``àŽdÛ_ŭ Ĝħ>7뽆áuß÷}ßß}?ˆ8­4ÑM‰u+Êİ^ġş]UHëZívۙ™™iw:CF¤çy=ŭÄçžúöżxê'ïn°7.çŭFPhĜ<Ĝ‡ĊósˆehBF{+U#ט]‰QQqżF4ޞĈ˘j“|òyáƒ%8\;Ž(φÒq˘KßJ­ [ŜŬNpm1òä£_ĝ̜X{e~óŸĵ*“î3$pÉóĵċf³ıE‘ßn·n·GQ”™1?Óô(}b*ÉúA4JecÂxŭA.­‹˙ù?ü?|îñ³7W@‰„ETħb°D<˜İb äsɊàġ+Ö_şï,g+T•‰ž”ި€§€Qİ”záıâıŭäĤ˜¨üy‚ċ{“eq8ĥ†g diYŻ<Û”acSak+ÄĠ…ĥuĉÄgN?úĊϧ•__ßôÓW…ŻÙĥ}?Ĵ5›ÍF£Ñ˘(‚ évği–e*I=A8{ü³gŭÒOÊ__ÛüÓW,™\µ,놔rь½Ĝ°m{Û²,lll¤I’ìĤ!öê“*û×wDS䑨’GФ”üĝŬBÑ9@20²Ìĝ…ħÍŭıÌL[%hÉ ¸†ÖıCxÙ0[–W.ߊʙŞ\݆Ó*£-ú`Ôw–+Ÿ –ˆ2eŒLĠ‘26BÚô(UKuËËĵ“kï"|ŭ‡ôD‡_ä2}ż›hÛín‡a§iší¤&UÜ żiuAC½ĤÑ´0UŜmu:wffĤ533s Ġjk4gĵfëÉŻŝ÷Í+ۍĈ_żƒ)‰ĤÍà€Ël‹™‰Ñ½¨ W##Ş8$ëQI6`€\ß*á8\E~ş„‘îUç Rˆz{€.ìÂÌÏyS_ÔEš~p¤ 4çX[ĥĥb\™wœ3'>˙èÙ/|á!µôâċíĞ?Qˆô’˘É9·Ìàg†ĦʲL•4քp•›"tT*&“G*vŞğıî߈˜s¸I)êÁˆa MG#ó9Ò¨‹,ŞX 1”3“Xµ4ĵĥ+ew FŻhÁhğ•+Ż$Óè†*÷¨+N hèü€Ô…j2˙.0A`ĥ Ú_DĝĈ_à$m/ÎñĤï‡óA,ûżĉÍİñ„Ñ4Ö"u¸^÷F}ċŬ­VËét:͙™™Ùvğ}Ìóĵ‡mÛ~üË˙_˙ö*ŽÌüàċĴŻ`š² ‹ħx £\ħ^NƒE½ ÏŒzŒè{ŝˆpK˙?¨ÒÔ+÷î9ż€B_ó- ò-ï1ç}YdBy4”ı*™ ” œ4²R Ĵ¤166c\™o¸gO|é‰3Ÿ˙âiıüòۛ—ü—D$µÖi’$‰çyi·ÛUíԀO FŸ4&5ÈN‚L)MÓ4’RJİmZ¸ìï{úĦĉf7*`èûD9ĤÌA™ À`ħĵLS ·⌠¨(l02Üä‹WĈ ˙ËF(£Šĵ€RÀ–Ÿċ[yàWÂv…Ñj‘c Ìb2‚ ñ—èĴ|ĵ}ò@eß÷oĝżĜív7‚ MMUBŸ4FğÉ'ĠPŞ×'#Q…Ñ}ûZûöíÛßn·{žwĈqœsŸ˙½ñílĉÜÁüj7W|P’ĉ£Çyž7r,cÑzÍŻŒ¨âI~c`¤û{"SS€§—[Ş*Ħ˘ ĵ(×ĠTˆ-Ö·7”ŻŻÌ%çŽ˙Zçî˙T 5öİ·êçÊ$<4 rÌċċë>.Ï6œŝú—nĥ{ÜŜxñ:bŭúÏÇÙr' ˘£g˘=°ÖA£ĥéi*ż´ÖZI)•”²G!/½½ĜxúGÖUfӜġf Ñe4Ö);‹e”‡éŠ"}a&·ĉ0b½ÙI•ÜÒ |‡˘‰0Òĥ‚Y1N‚úŻÖH÷rIċĝ#^Ôx¤2$ç vñäħÍע(ĵÁBˆ!–RÊÑ#îïTa7Œ÷:\WŻğ #QÀhfffĞĠšk4ğ{î™oü½ßjœŝÊħ?yi—n¤BËċÁµEîŜmœxŒ¨ß̸tĜŞlL'M}Ïéíó#LëÊ(zµĥWöJŞûFé“ÉgùB½ÂA"’†T)s×İhtß%÷ĵb#€Ì]¨3Ĉħ¸‘`ióôüö?qhĞ͛Ü`ѤÙSdQ4ŭH´S)I’´èGR½u&ù cŠƒ ĴRbzUċr7 mJçPbŒA”ùĈ‹cŞìÖÎ3ÇÁk$wËĵt³ï†ʓ„Š‘Êü+*.TŒ3¤_FòÖߪçµ>PItĠĜ­úż$I"T•ĵ‘#šB%Ġê¨^÷ Fn£vğ=×l6Ï:ŽóÄÓ_˙îoyî÷O˙ùËKxçU”hY ‹³ž{ԉŠ-*j¨Dċ}ŬsJ1‚e‘nˆÁÉÎCĦ=[ħ2T†ç¨˙âµ/o4l–\Ş6êU×*ER#+ojŠËĈJ• VEĵ?oäzŭ-´ċ͇f—âX3­5ċ×°CïÑN“£ï ¤îEÒà?lÔ8tĞĉ‘”RʲMwċZ š':Š˜ÍM w#ĠĦÑ+żÔ³*.^”Ûéb°tn˘FĊ$ÍŻK3…n GÀŭVB{CŻ—Š![ı€­â\‹ĉ]¨ëŬ$Y p# C?Ž$˲Lk­Ĉh'…TĞ£zíu:£FĴ8O<û?ü­£/üÁÙĵşŒWÎŻ2‰ĥË"ï5ı-¨81€¨/šK9Uĉk¨ Sı—“ Ÿ 2i¨ôUUTşßUÂxU@³ċĦŬŻ×‹DĠ‡ë¤"dR#• JÓt0Ş%ÂÊ/£ÉMÖyÑ<Ò½œ‡4i$”ŒPšĤiœeY¨”êŞklï{áLgŬÏÌĞ+îŜaÔ·µêÊÌ˘P Hô @ĊŒžxµA– (£\}ĥüĴ*ı£*Ña}Ö=vħA-s¤§e?ÒwoÚ/üŜ 6AVŽuöD{# ÍÉ^ô ²¸ú1ŝzg_ż 7ż{ÛÏ UÂĈ4’F“ĵIΜTù &€38ǞhÍĈżcLpÎçœ !˜eYÌÌ7Úí µ:Ş×0ċ€=˲ÄÌ̌Ûn·‹† Œŝ0‡ÑkËĝġ{kàJ£ċr4,×bpÊRèŜYG}eŬ#aT„ç4•ÊHCÉ^8F§ŽŞ…LĠ´) /KÀİÊ++qiÀ£Ĥ²óTċĦ:mÜŝ3ݐÊ[€À9˜@ĥ Úzœt/H)Ó4]0ìvğİqkuAñ‰ëÛkc'n RJeR^mwí‚­B Ĉ,0’Ôoh:ğQñÛuïÛ̝ü^1SipĵyñĈ‘D’¨ŠzŞ$F‹k­>ĊTù7(s™ nӆŭÌïì[9pPí˙ġ˙gÉuŬÙf³9“eYW)i­Ó,Ë0Á³nÜÇZĠëNĞ"ì#×u­N§ĥÛíf§ÓÙßétŽ™jş"L—+£wV!”Ì' À€-`FIÀ0°Ħ׌´îŻd-ԑîU Ş*id¸żz³ŠırE 1Ê{‡ö#Âè°˘ê•|gJAİ[ә‹sp&,0aCŻ…ŭÖĈÖĦNóŬ0 —£(*†ûU‡u²O>{H;ċ‘hRİb#(ĥŬĊËsô‰ÙD+@i0Î@™= lÛCžżşZĦ7„ê×2 ?ÌLÑCİ˘û/½ŞxЉ83IVB´‚ vòsĥ>=Ûyġ?nk­}"Šcc, 0KӔéŜˆÙIŭEĜD5œêuĞ0â˜ĝêşŬétœN§Óš™™9hŞéÎ8Žs˙ÁoŭÌœŭ‹—ñÒû°´DÛ"xĥ€+6ŻÀ¨ì¤"³Xzʨ˜ÊLEOYöm>‚zyâ‚PSŸÓÂYıOş E¤nF}íèUùîŝJRĞ2żĵ#Œ†žÂz>hÂ…7@Ûèħ³óiš.¤işA·Ûí&qëJQ=_÷Z!í4İ/)ݵVY–É*èê3sOÍ.“4µŭ´{M0Íу/IO.íî…ù~ġrAş™ž=°>U.ĞŠßĦL¤]ċ$ 6S°Œ€Ó_?ÂÓèKÍ·ŝ$eŒÉâĈ9—aŞŠğ÷mí?5”ê5D“`´cÓk³ÙtŒQj§Ŭnh·Ûsë>â8Îıçżù÷żuèÙßĝŻ-÷7àè m›àY,‡‘`÷d/üĠëÍéİ£J.Ĉ„é¨#]•ô²oŞ–€Ó˜qċç>ĞĜy÷5³V˘@Ŝ¨x-%сô Œ*oOŜ*ÂĈÁXŜÒŻ·ŜĈħv°ÖqŬ˘(] pË÷ŭ0Š˘Ĵ˘ŽF1öҭ䑴ٖ‹°LÓ´µëŞKoÏ[_˙ŝB^§³]Àhd°ŠĈ(£éa˘PŽžôZüÜJe_aġÈ\½K,’ùĠ—fıR:÷;Ç]ŠÔ|çŻcLqÎç\rÎc,K’D—Ê<ÁŒÇH½5תh”0ÀÎFİ̲,ĞÑhĜNÇmµZíN§s¨ĤsçñŻ|÷_~Û9ùcöò^yMAh8LÁħX £ÒŸĴo¤ QµĵğP;½œ‘ÂHÑ@ċ ˘˘²* ¤íH0ÚB*Šˆúì¨Ïż˘š°K nAEı€íÁep˙#ŭÈc·³,Yˆ˘h-‚nEi’$”şìµ—Ò¤Äğ„í”GI)ı|cÙ ×NžKL€ ­ċŬ‡‘s´ iŞĈ0 †éÛ˘+Â;·E2Oe<˙Ĝġ30Á}ĉï=› ‚îI—v½îÛ]Œ€·,K4 ğŬn{N§333s¸Ñhœp]÷l£Ù~ò[˙ĝßüŽïÙ˙_~½Œ·?Ŝ@Kh´,Àċ×°8`ħĵŻxEUUĠQϜT“êİR =GTÉ3Q_ŸR ' š­ö`2h6¸£ġç…ûĦDaĊA×ï]ÈüAˆ*o ç`\*Ŝxg¨E›R&KQmA…a˜VĈ›êt+(а]™GRJùZëmšżì7úŒúL›Ħ޽0›úք0”Sh”VĤ˘żÉô?•UwŒb †­ Jmàİß;=ë¸Â{é?çöBœçŒ1ÍSajc%4İ›ıP(?›S­”>µ #>F £ŒDĞĠr;Ž7333ÓjµŽ4›Í“ë>ÒÙĝıoŭû7’ƒ?ŭù/tħÏ6Ċ ŒàĜ63†ÇĠj:] ÓUÔQİ8Hġ<àô@Oc,ŒŠˆ†.ÂtUESœ²•> Ĝ“šñ×g 4vĵ#0BÏXOX àCĜñµìôŜiê(‚ İİNë]ùÀŽŸĜ)Œ7ŞÈĦ¨¸ĤÊ8ŠŜXó+ïΜŭìÁPä½<ĴúŬ*ŒhŠ0ŬŒˆ€0ÈÌ ³  ]òÊ@ÀĵĊš•WSްEÉŬXAŻ%}óäÛŭ­ĈŻŝ#8çàœ3!Ùĥ Î9™>2³‘7=ĉÂ`¤ŸUûԀhœ*š6LÇ]×µZ­–Ŭn·[3333ĤĴû!Çq=0wê…ßĝÇ˙îĞç—-ï/^]ÄúF„Y—ċV@ŒÁħ8,–ĞEˆr>çCŸÛ‚İĤӕ*;UÍQ/g¤>/Ĵş¨ ‡Ŝ>B4Âë+†Ĉ6áß1 f ¸0ı#nê‚V_Ácsü2İôZÇKAl~—w Ç|ߎŸĜ @Qˆ*Ÿ(˘ÒFèòğóô8‘bŒshİK7…iaD£ŽĦ]ÀÒDBfz÷0Şŝa*N=kû"îLàĠŞhRˆŽY–%ÇħÛíĥÓétšNg³Ùœó<ï”8œ|ìù/}îïŝĞ^ğ–ÙñâMdi†}6‡Ç$KÀaÔœÉYċ˘ŝÜ@3)MŻ…KĥqÍ'U Ŭ ĉŒŭ0*n•‹Ì>ğÊ먂qÜ`Îğ£˘éµúÖhĉ4!@Ğo`VĴtçf›o…a¸†áz‘;JÓtÒi`ò$ïOB"L7#ixĊöúŞ·u3ìPS3fqPbêüóÒnFJiđĵ ħ>ßĞ˘˜ˆ™1Ìyυ ‡’ J>(#°£Ÿ;zèÛÍßqò˙vcçÜBp˲çĵüš2ρ [”hŠ ˆZ-}:TÑ8E4Rù"ÓcÔi·Û›ÍĉQÏóNÛĥŭèŸŭŻžûÖ?{ò§ç·ĝ_[×  hp™½YFÜü†ÜÄşbċSíÒ­Ì ĦʔeUñ„Ó%ĵ†aÔĥ£ŝRlކ+}‚#÷’{#ô†Zv^Ì_mž§'i½›ĤÉÍ(ŠVÂ0܎˘(N’D¨£t~˘hîµu0Ŭ8ŠÒĜe…JÊÇQ\ñ;knù˜4=žÄ jÀ‰wW0ĦG eSĉÊÍÁ'JväO²Tŝ&*G ‹2,ŻäìĦÎÁßŭ÷żċüô˙ÙfKW\ÎıcÀÄÍ-‚€išµ4Á²{6ZŞÁô@SŞ˘Ħ]ğŬžm6›G<Ï;î8ΙöìĦ§żġŝ÷_ß`Ç÷ŭ§_ŜÄG×}´àÙWcÊ‹éŞĠ—†ËşË†V•0”Ċ šú›]İ××Cş:oF#ŞĝQî  ]Ĥô–  ´y^r%yĝtġ8nFQ´ÁvEa–eĠi“öĜOD í% Ŭî8 Œ£èÊËço:$ŸÑZrÒĴœò:˘i`jф>£âµ$ÄQvG`DĤí¨LŜòLLr—£PL&y)H0hM°)5VWèŭ ÷Ào˙›Żt^ùŸ:ü×=Îı+„p-Ër,ËZ·,Ğëû>‹˘(°Ÿ×*‰cx„ñ¨JġLVxn\¨/_äyžċyžŬétĵf³Ùn·ÛĈQ×uO:ŽsöĝÙ§?÷ïŝo?s~™ğ?|s[!flÀƒ†k3ĜĊxî"DW=*½F×*ŒŠ Ë(tùµ^kYq7#]Š7F4äEĥW`„ž‘žċœƒ˘èĠWqî„ŭİôjÇËAl„a$I’™ÄIfË÷$L·—Ò­Ž£¨ĉ‘"”Żâpƒn^8Ñ!LppÊËÓÂh\š¨Ża`à•…áQa ËúF€™ĠT ìKš6ÈR‚à„­­2³-úÒżxŝÀܙƒìWüSÎyCѰ,ËuDz,ĞkÛ6 ‚ K’Dĵ;7uQç— í¨Š\×µÚíĥÓjµív{_³Ù<èşî1ÇqNÛĥ}ösżŭĜ3ß>ġÓ Ûì—ï݃’ 36ƒÇDzò)ë.Bt¨4ĞVŬÊ9Aeq‚îИSÒĤ1ĥÏÑ£”ÑpNjOÂhÔ%ĵİĴc½ŝ*Ž5·Ö÷·ĵw|?ş†ájÛf<#söôIBi/™ĞŜÒ8Š,Ë“GêêĊĥ<{Ĥ³²‘‚Y *Öŭœ€M ÓÑeÔğŸÄjpŝÒ­†éÊĵ”ÎaTĜ”! 2öT&´abíĵ9f¨ E°Á‘1 3ÜÌK~íĦïÌw£żùŭJlݵ ”<Ûĥ—]×Ŭt' ‚ 5j‰ Hz½‹÷­ï~u#Ĵát߂hFUUÔjµZÍfs£Ñ8âşîqÇqnÏ|ò[ß˙×_Ŝršŭ_^ZĊĊkÛpĦá9 'XL"oT*.Ş*)_TĞçJUƒž2Òı7ÒRĈµ[SïF#`T„ú0 #ŒÊí9 lŒ¤Á„ p½ù6ìàBöĝıĉëIÍGQ´Áf†ašĤieVÚN;'ċî:œöÒ<¤I1Íħ(Ò4MÊ~¤ßé<÷wNRl|ŸÑP˜Ž&(£Ñ0RJ#Žċ…QĦ҈™ns^ô"i âßUT ‰"żÄòĞ`YJ, Ĝ’Lce=A֞›ûŭ˙ñÛŜË˙óvùíW…m˲š–e-ığî8ŽoÛ6ݍ%VÉMRKƒa<ÔĦĵ=ĦŬ‚h0<×§ŠšÍĤŬh4ìU4ç8Î)Ûĥ>÷ıo~ñİo|˙ñw´ŭӗobs;EGh¸L,WE‚÷Şè¨˙TĴއ¨ĞÓD}0Ò0ê9x#Žî7Yí•v÷Š#0F}°{ FTXĥ°\!1¤kkŻâɓîG¤³ËQ-A°†ĦŸĤij ĈM‘Ŝ)ò‰žŻÖ?żv7Žâú‡ BFŠ3%ˆYĤRO€‘€L€DavÇaÔ{Yy™7Ë_?ëɲpP%£˜ŠñÍgPD°Xš!!ÂöVŠDYÎáŻŭ·Ÿ;xüçG‚_˙—ŸsÎ;BˆĥmÛ Ë²ÖÇÙ£–&AİÓŜVCğÑĜFžç‰f³é˜\QĞĠjíw]÷°çy',Ë:5sàè_˙ùeµïħùÎ&Ŝúx LjÌp32‚sXœ ÀËcµ˙Dƒ# òÏUd;Ë ûĜ)ê2”ċŬZWÂ|ƒ9$oW4ĥRżÉéžĴĤ„7ĥž‚ƒÙ½ò+Ì567´E¨n% í0 #Ó; H;ÏŸx¸nŻéĥĈš›Ħ}y?’RÛÎÊċ˜y|VĤjĜ‰íÁ(I$”¤ğ£"lÁàZƒx>`½ž 3(ĴĜƒ kNfûÁ"]Tᄄ3$ĦÂr–°äÈWOúŝı? ~ò^ċË×ö !f,Ëşá8βëşžçùA0 e’$Ò$Cw‚Ò-İ†ÓžѨ\o4N§ÓqÚív³ÙlÎ4B´,ëá§ĝí/ûÚßü½e½ĝ‹Ĵ…àY ŽĊ`1Ğ"ÒŭUt }NÜzDïP Ÿ*Œ†rFĊóġpoÑь4ao—v—ʨxgœüÜç´ñœìñs­W“$şnÔÑF†A–eE¨z§”&ÍO'§½8 o\ 1Ž"I’˘A6ïGşzaÀ—žœ]J$¸Í 3S²İï Œ´&$‘ĵk0*‹´‚ĉ ŒX~‚–B§|:.™<ëL.Ädd1Xœċ`’ IŞħħMHÚ:'˙Îż˙ĉŝK?}xëĊ?ù•bÖ²Ĵkĥm/ığêşîĥ8AIÇYÇr”ô@ho˜vĵİUÓ]…v "†ĵÁ•WsÍf³Ŭh4f=Ï;âşî1˲Ní;4÷Ä×˙àó¤uf˙_µ‰÷l‚¤ÎCt‚6}EB°² §8,Şŝse‰vŸÒéÁ¨œgT™T†ŞEş2hJÑ^†cŭ02a:Ĉ`y à*hġ%zú´wTz9 …"T—$IĴ”’ D_mwOÔÑ=Ò÷÷=ú?ŝ[É#Ħĥ“Eaƒ”²Ğ/½5ï|íœaĊîÜ!|›0€¨˜qtaÊ]&\$D,ƒ‹ŒJĊ¤óPrÑŻÄXĊynɲÛp4Hh=ĊÈâûOŝĉ™ß{ê˙³˙šXı~^qͲĴyÛĥW<ÏÛh6›ÛADï'af&ŒG÷Ŝa‚j:7ÚPSç†îˆŠê9Ñl6íf³éµZ­v£ÑĜçyŜ×uç,Ë:iÛöé§ôí/œûÚ÷}o>ż~{ë›q^=gk¸&W$8‡`TZa= ĠıCŭı˘ŒTFJO £ĦœÑCÓa÷4ŒƒQ %@ݽˆS³Ñʌçĵñ|†+AlUBuEeŬ¸žDŸ*ë q iRƒì¨qĦ”2+7V\#ċÜvT*úOËۄQš(Hİï:ŒÊ§(‚â9`8š´QLf²y,^)ÉE#-+;HB#Ĝƒ% İÒX[‹y:'żóï~cߍ—]ñżŝZˆè  á-şğâşî– EQeÀ´ÓÁÍ›äöŝİën!4ŸqĊ‡@Ôl6ÍfsĈuŬƒŽĥmû¸eY'Ÿ}êÙÏ˙Î?yĥkíüĠ;[xïò6„–è˜q6œA0*Aġ’px€žħúÑtK0˘*ŒteE™C#}ŸÁˆħÒĊ›™+O½úÚÙċìٙ—£0¸A5T—ÜŒî™:ÚK@7ŽbÒ(îrE’$ieĊ-^êÚGŸ?(ÓÜxTgùÑÇ=q iMˆ#ù‰Á¨ôÈ#W€3LûAQ ˋ“Ϩ"êY=”ğécœÁÒɋi¤R!! Î4.+›ï?ú•“§ŝWŸŭnüêŸ]Üz÷—Ż›ŜMÇq–<Ï[o4[aF#Š˘HŽÓ¸ƒ{˘ŭnÂz* ĤNÚI ŬŞ jµZn£Ñhzž×ñĞàñ¨xXrÓyU&”'-òܒ6ÎÄL8UĴĵYŻbœ Á fá°5à€!RĴŬmĉyö={üİŻžÚĝĊżÎt^1oÛö‚ëşĞFc­Ùlv'€i’OÖ¸>‡qÊi\.ŠFmà÷ ¤&Àg'í!`ÊW“#²Œ˙\ˆÇ9dÛöa˲N¸Öéù_8ùìož¸²ŞÄ_żş‚ùe.:‚`sVމ(ĉUÊİÑ ÑċĊ£a¤ô˜U)`¸éÑ šöXi÷¨òĞIġ0sŽ’蟙“âc›Éü(şÁJ#)e5T§1ıAOΧÓËnÊ<ÒÄ]–eE]$ôéÒ[7ĴoüÓÇT––­£Œ³²û{·0Ê2…4S=è0öÊ 0*N­iòšÜ ï`:‹h‘˙hĤÏ˙]Ĵ·û +%"hĈ!8ÁR€­5G ‘ iÌ0żÂïÌí;úíóġ“+ï<ò⟙l,}lYÖĵ8Kë6›Í(Šĥ0 £(Š‚ ÈÒ4•qĞBxÔ/›²eÓ\Èì°Ñ˘ÀÚ鵌Í´ŠhxĈĠ\QĴàşhµZVĞĠô<Żşî>ÛĥÚĥ}XqܲĴÏ}ŭ÷?÷Èçsz9´ĵıËóÛàè0‚#ò)B0pbƒHÛ³Ŝì ŬkJU%T Ħ"šFz·aşûFĠ+gfŜĥÜ °\Ú-ŭ-Níó—uĵ7‚ ¸Á’ïûQċS÷úCuj(Mëe÷İ*û§ĤGAJ)ĉcd#”/·×לíX¸ûšÈ2Ž eĜn*ċtÉħ0bÜT´)6ŬŠzIžÛ„QqJ˘^5 pFy˙ËöíHĤwŽñ\*ġĉ+ġ [E‘Wâ lI°CŞ iFş .Œ˜}ĉèñï?÷;öÂ[Ï/ŝ⿑n­^²,ëĤ8ˎĴ6›ÍÍ8Ž·;Nàû~œ$IÇħL’DI)ËJ1œ0B=MsRL Ò. qÇÙtïäÀ="b–e ˲˜8VĞĠ²F£Ùl6<ϛq]wÖĥí–eĥ,ë˜m;'žŝÊw^xôsżuj+k{?ıĊĊù5¨L˘!òfk[p“#"p¸`½cy¨h Fj0 W(¤1 šSMG•2ñqĠtz/ۍ‚0Q^K0Ç Aë/c×üGŽÍĵEáĠ }ß_/`¤”ÊvŞĞŬw‘Gš¤˜ú\ݍÌ²,β,PJm³Ċş‡żÒĜÖTQ7CäÒéâDA3íFÀˆ4òùKZöŸU~g€Ô·£bI™[1Ĥóx2™ïŠÑ#ÊçS˜żÓÈËÇÍ Y ßÁ̝šA[€óžk™"ÄİĈÚJ€ÍÌ<3wâżyî;âÚëˋżúÓ7Óíġ˖e-*–]×]o6›­Vk;I’ ȌIV#ÂyÓ §’h¤h‡MžöŒv‚0ıHaZ•aıF£á4 ×óĵĥëşÛĥ÷9Žs²ĴBˆ9·ÑzèıŻŭîgÎÛ'×SÛùĊÇ]\œ_Dšfp´›´)áÖĤïUĉtéŜÉYU,F9p¨/l§ á;R9äÀpkŬ÷%Œ¸em0˸­ż{ûì™s3Ż%I|9 ù  ŻşHJY…Ѹ£iÜîiènŻ:5Œ“ĈQ”û”Ryù÷Ġó˝'~d;”`œ•Ĵ *ôäQjBÊÑG.c b`Vŝƒçı½7òlJTϑ[ÑmÁ¨8R`ÄË (V°™™3P0 È7ò^%ĈĴ…bÊœ8X–TQXp\†Tċ“p××ĥĥ˜8´˙…c'ŝÉçŽù·V–^ûëóáÒµmÛ^”R¸ğ&Üh6›Ŭ™™?Ž(Š˘8 QŞi'8í(ŒÔ=‹ßbHnt€Ŭ•p³bĈçyVĞĠ²]×ġŒjÚĥ=cYÖĴmÛû…‡-Ë:ÚŜwô³_û½çO=ûġcK>Ĵżyż‹ç}hࠗ'¤Í8qVı AĊj§€FJ÷rC}ĠrĠž#EPĊp½JÓ+q`˜FzŻŽ…‘Èż‰^ók÷ùĜ ßx¨=÷èŝĞËŝìġ5Ü\Áˆà€ ›ċJ(ÏéêµLĊ-ğ×Ĝ:è Êb]/ôUҕRċtWUÍİáUéÊıFEΈċ³,B/ŭg GfŻApĠ÷ŭß÷׃ Ó4-òFzD!nBuCç› Ÿz †bv5Ž"7˙Nc)e ”ÚĤĊĥ÷?y޽š¤à£a4D;e FÀˆY&4Ç\0—żûXW_Ož>>³`a[§áUoŬñf™˜„€.|ġŞgÂ-¨ĝTLċjHhàÀAœ@àyĦ…`½Îĝ2ŜÏ@\C à ùw›PŸ9a3.f3p< R*HdšeAWŬ­M4Û^óĦg˙Ü3_ŝ{Ĉ×ŜY[>˙ҕ‹o^°,kMk½êşî†Rj3˲”2Ȳ,̲,L’$IÓ4˘(‹˘HĤiޤ”Ú¨'`rı8Mb¸WlŸO#²,‹5›MËóSF„\qèmèżĊqoiíôÑ΋a^ġ}˙ĤïûEżQ0ÁARġüöoF=ż;BJ>Ċׄtŝû ¤YĤÌ_Jpc {bŒ—ŬġĴÇ4ĊDËâ8Š ‰ 8CBdĝ(V¸Ä˜8Ĝ9wäÔwž?rĉ·ç7>zuuñŸĵ.ÌÑŞ8Jİ-ÔĥRŞ+ô”a–eqšĤħ™œĊq,£(’Fù*¨q);ċ!ïv*\ $†cŽˆ@ŽĜĉĉÚĥŬt§!„hÙĥŬĉœÏ!f…³œó^³3÷ÄçżùäÙgżrÜÚwĴum5ĈßéâĈr"À&…Ž`°Hġ&ĥ˘¨äÔ)ġ;hWJµ•*‚ìSATizE%—¤Ë!|} Òŭ&нÒî1“^użPuäÄ}£"G&Ä@ôâßâ}ĵ}îĦŭżŠ˘²ïû×}ß_ñ};Š˘¸Òo4 Fj u4ö_ñ½ï}>ġ@šGšPRJ•eY1ɗ7.,X*VàJ``ċ@½ŝĴp`š&r„ħMî„@Œò˘‡C^@ôÊ_âħ6ħ,à'Éi'MgNĝçôÑ˙iÍgÎL^.+s ¸[ß@dÒ¸ŻZÜÜċù¤2ıË+ ‰tϏç‘=ğÙ÷†8ĵÊÏmĈ@ŒÁĤü ĜaùìĤ̔§ŻoFXÙHà4„{ìè—O<ñÏżuBt—‚ĞïŻ/ŸéîÍË×´ÖëJİM­ġĥS µöM/Y$L¤”i–e‰1UY–É8ŽUšĤÚ¨¨ĵ·v#şMÜ ”Ş!8V„àlÛĉžçYNlÛĥÛĥ]˲<3\ħ)„h !:œó}œóŭœóŭíÙÇÎ>óĊGzüı#3sgg6"ˆ7o¸üÖMt 6<ĥX̸osF:ŻÎ,(ê߄û‹ 4´œĞä~”Ò!ş1ŞâCŸJ*A4¨„Şs’*#*z­ŭJéƒX.˜°¤Kż@+~7|ö܁_Çqt)‚ëŬnwĊ÷ŭ­8Ž#â=.o´Ûž£ĦP]­ĈżÍğGQİĥ T–mYĞ—şĵġè,‘úĤ(`ä<£8ÎF×u‰<ĵĊ=‘+áĞŽczsĜ;ïχa¸@ğ;ÓĤĞòĦÖϚWŽ}ëFL4óô‘ž·£ê§İ"44Hˆ*'n#MĈáı½7öCÄòıJ‚ċßÛ“Nçpa˜™‡x,!@ĦƒÔ4£ĵÏH÷ûÓuSöiU¤ÓeŜò^4}=GF(.ĥîgċħ˙ÜȲòb£•—àùŻ/œ;JšÄ…ax½Ûí.ùżEQ8PQ7M¨nš‚†=pr?„ìniEя„›—ĥŽ<÷ÄìRšAsN Ĵì-ŞÂHJ™êaċñ*p‡ƒqèÑ[?@kċ˘bŸûz·Ûïvğ7ƒ Ĝ&"j4cLweÍ5w÷?„ ÌuE D•żôvaT}^–ihžġ#Î@‚A‡Ċâ:Ï'™I´T-pAĈM܌¸ ž7ÍGĈĞŒTġ‹™Öı‹Ïċ•-ÎKÎÉf¸tMâ˘àp,ĉ;òıg˙ʉglŭùpùÚöúġ6W>|ŭêöÍË7‰¨€S µˆ(ZGĉ+RTBD9‘´N”J)•@I3+K‘6!Ë2…Â×íH–Ċ,ËâB&„`ĥm !8çL!Ì×x~×â–e9ĉs—sn !!„Ës…˘É9o2ĈZœó6çĵ›ñšíCÇyöĦ“>5wòħçhğ.oxs)ÄÍ ‹Ĝ 2Ĝ ´7ċڅ *\yuï8*sşï­êûĤG…ኔ¨ĞXċE j¸ŻŞ+t•â…‰AS~‚÷)£bŽR%_tżÁ°-0açcÈ×_Xŭ•üÌıÙ7H„ax­Ûí.úż†a$I:ü:mŜhšyG÷\í9 Ŭ…q>]|í†ŭÙż{Jg`ÊßB H"9#fqŒ30‡ƒğ@ĝúÁ.œ>~¨ùFèwoA°Ĝív×Â0 ‰ˆ¤”‰ÙˆĴŝíĞÑ3İùŒh͝ş-äyEw F…„*B˘×i3‚ç'9Ïû§´f°DO!=^)€àE[ÏCxe!8“¤bı „` Ä8Hih[@ •„–7C\ğ@Ĝ\ìkÙâÜİŭÏĵ;g<.ewñjwŭú‡›[ó—ׯœŸWRnQĤ€ˆ""Š  R"J´ÖİÖ:#˘Ô${RJ‘Ìí•&Êk_´Öšˆ(Ë2Í#ŻÊŸyô?pésÎÌcÜĵßL!c‚1Ĉ-Ëâĉe·9ççÜáœÛœs—1ĉrÎ=sżÁkr˜óclföÈÉ#sgŸ:yä䙃‡Oœ™ñömvC‰Í?½a~ġ&²LÁâ€Íû„†` ‚™q<ŸX„‰A#6gêƒQİVŠAxĤìşß⧘êjrBƒé™ħ"†Ŝ}=X=§G”vçW›ŭ!:ôrJ÷ŒPÉY̨#½ġ°ôSŭü#­÷,&ß ‚šïû Ŭnw=?˲D)•gœZ}lZ7†=Şğ_ĈTTM3Ž"RJùjġĉ²ûÙ\âÌÈŝ ÒDAéÊĴsV80è<ÁbqpÏBrñE¤ïü­~ö€w^ĈÑċ nvğŬĠ0 ğq'fC“BˆâŞÙ:qáÏ^Mžü‡_M„í1çH2ÒùϗúŽÁ¨x\ƒJ‚ÖÌ(!Ísġd‰üYü¤ÓšAó", ˆx™£*M(›j§ĠĥÌ䞸)'ÖĤ˘Ï ŠċZ¸•àŭÍŠŽg[³cûçžxx˙“_°Ï4Žd{%Ú^žĥnnÎĵĵqí‚6!="ŠÍ-ÒZ'"ʈ¨mÖZ‘$"MD €22àDŒ1½?ˆ3Ĉ¸ı4,Ad>ڌ1‹s.8œs €Í9w¸œsÏÈcŒµcFg˙ŝÇN9rêħC‡OžŬwàÉ6ó:ÎĤŸae;‹WCĴtá‡,,ÁႴóż3§"ϗÏ˙ĤâM ŬßŜw·9Dñ€UÀ(Żŭ`ĥıï0ĈŠ›7{ôĦƒ3‡Žœ=r|vöñÎ#ǚÍö~—Û +J6‰ù­Ż_Hħ}iŞr Î ´Ĉ>ĦM5¤Ê÷7er£D4Ş’tp£í5lÍŞŭn ڄâ0žž2ĦŠŠŠ7­úż·’?ŞĦö…ì ċ4"DWUN)°×t N^ŜÍ|u87'Żh;ŻApĊ(£5ß÷ğI’D#<êĤ ÙM£’öL¨î~RH·:Ž"6ağmšż¸~äÔ oĝ ŞhoáE,H’Êœ#V„êòˆÙyEuW½üg8šĴìkŠ7}?ĵáûŝR›q‡RÊb~=¤”*Žc-„ Ĉá$ÎŜĝïâéżó¸%˜3d °zĈŻw FĠX¤,<Ĉç›×°(ê—ç,nuÍĊYîqÇN9Œ4ËGWp3*]^y8ç.7bş˙ L²bwÏÁä ÖôO)Ħb•Dba)ïżg°-ĉÎ4÷ı³íC˜yöéÇMGÀs8²p;M˘H†[kqšDÊ_]”̲`}ı›ĊŬ`*ÚZ ‚ġSġ$ï  Ž/nŒÉX­ŭ‡[­Ù·ÑòÚŽî²fŸhsì?r˘Ĉ0sàHC*° QĜŽ6ƒ —3Ĵ‡]Ñ&T*óIа”†Ëžó<U ċŽ•3A÷U^޽0ä[ŭ è)"=àš0bTDbD}Ħ>Mz(Oԟ#*”ġ'”ŜsĊ$YlĽaDùèfĈ ~ uxìptŭĜĈ‹A\ö}ÛíA°$Iµĵ[N€ş…ĵí5íI ŬÁq‰”2Rvé7‹Żŝ£G5׌8ËŬܨ獕ĤŞF6)€; ÜĊŜĝËüSĵWßżn&4GQä› ŞÜòœE%˜›hŻ]³ÏÚ?s/=ô[OjÍ÷öÙßĴïŒŞĦ˜$+TR>?I‹ĵĜĦŻÀċ!ş"L§Y‰ÍLCÊcĈ5=WOĵ4l­ô/ l—fdĝ3ÀhŞżX–ßĊĊp8ȸ÷iEˆş)ü­$D>ĥ€ċġí‚Áé´l§éoĥ›š=u¸Ġ8ĈvÙ 08ĥ€Í8MU´µ‘N}›3Ñê8xf`Üêìs„Ŭ´4ġĴ—4€8ĠHF’)„İF”iĦÄġ5`+H?ZA7ʊÊüö pÎÑ"³§ĵ"”›ŝµÒòŞw•ïO£+.'ƒ¨Ġûžjùµž7X¨ë#BYA׺‡ ŒzċÚŞ€êA°ê¸P*£ĦÒn”Uu4²{ĉ~‘ ĈmĤğ}ó‡xô ÄĦĉ‹a–02½F‘ıȝŞ›Ĥ ˜ĵÒ-(¤iĈQèÊ8ŠX)Èíġ5Ğğš /?ÈWĊħìŸgÄ(ı2bœ½óĊ_§ç6_£àj ïŻA5ÎEè§|½RJPŒ1Í9'n2àċ‹ü”ĠôùòY €ğRİîwżC0Şŝ¨Li¨2g”Ê2á:Á gP&L'8@ÜlJ<N>u֌Ngfô€ÎMY™quÈ òzâƒ˘ü$ôöМ˃#;8òaPy9Ÿħ8"˜ÄL^¤Í†-òjA @)ĥB†MJA,Ÿ³S”ĵr‹$B.4 š6o6Ë4›#NVÂ݆‰Œ3hMÈÒ.ütİ̐œ HÓ:RPŜşÌLHm†çáµ|:ˆÉgÊ`̨5PôBŭŽĈDâFmUÒ ­Ug ġûĈ ġUaUQE4T-§û[ûœ*€Ñ£ÔWŜ Ü˙0*›^9˜íċW3Ñ%è›…GtçOnŭ* Kï_ŻÀ(ÓĝşSŸ‘Ŝ!­Ñ:Ñ÷ż˙ŭHğÌ#ħÀ4nEVĜi­·ĝۭ͋“_ôÂn -˜Ċ‘Ċ2/ó.ŽNıûµ``w-¤W^EòÖßègöğçu†á Ó1½•Ĥi”eYj`4TJcÀHAc y:‰‹öÂÛü$·‡żpÂÈ·yâ¸VwFĊЉèJŜˆ³2?Ħ9 8•Ê‹X™ ĉ˜J ħR5qfÂ{Ĵ(7£1Ĝ* ˆ “6nŭùŽ˘\?/ (/Ċò1Ş‘ÀAJ ­5ËĞ%‹ŝ§´M—qŞz/“ħRöŝ˜LçPmĦ%zܨŬÛDİWáFĠLÌJs(mÂ9Ô+Áž8D’Ĉ  Q;sµ|ğjĊ£GÍ*+ë\úŠÂs}Ħ:])J¨>§żħ–†ì€ĉ'UUîged"ğœç ‚ŝ‡Pó?Ä#ƒù‡Ž´~i`tm{{{Ûín†a˜Ĉ×[QFSçöêtċûÊn7(Hk­LĜ.*vó,|ü+G‚­|RħFU`Äz0â ÜPk#|ġÏqĈÍşDïvzËEŜÈÀHŽxó™yә”RPœsTnl˙Í×E&œo,dGE´²ÁTžSb£ÎĞۄQuefšbK0¨"iÎY^TÈ ˜xžÓQ<Ïi"0*ažÇÀÍU?7“i{á<ÖĞŝ۞J;TG ŝSzu.¤T˙_^1èĵl+/La Tž£Ĥ§Ĵ(Zѕ²gĈËñÛ½8î½³œ—9œòêH h *K­+ŻÛÀŒŠçViĴ*|Gŝ)Ĥ‡ ‚aà~H½0›áS7ä¸=0Ħµa@Uú„hLÓkϨ2S遀‘eÂÌvËm½ şùWtîhzŭĜÁ֋…220ڈ˘(#‰ÇJhLYê½Wa´gt'ĈQ˜Â†´èGҗŜıÁżĦž×šċŬċR•&#ĜÜà–ùk^ŝsŽWϸŻuğŬëf\p‘7*Ì GIċ2×OD\Jİ8&Ë?z%Ĥ4˙ĉr';$ö= †ĵw§oà„Qù#•F @éFŠ3X‚Áb€ĤàA³Œ4Aq”+!͌bB^&Î×y¸ŠSŻLœáĥB9í#L€Ñ„‡ D@ŭĦÒ$”Œ‚a}W* 1 ÎɌß2ĉÔû]ĵĝùEA ‘İr‚tû0ö›Ğ¤hP §ġì€hä×úËĞs†zS½^"…çUsBCŽ UÑŭ£ò˘…úáT¨kËcùUmZĝ=yŒ.Ùßx) ËŬn÷F·Û]îvğ[QEišĈaşiĈJè áıû"otż*¤I6BĠFĊhĠŒ£UÛ[7Cnjg)!‰3“3ÊóE0£˜ıĊÁxŠŬż‚ğ^pĉpë(†axÓ÷ŭĠ0 }SŠY=Xh (eYVä’À9'ĈcìĝÍ9ĉ²oĴ vˆ5–Jey°sΠ3uÇaTVd!ŻÄˇòċá­˘úN°^HOsĊAı2ÒĵĤÓfœ1cÉÀ9ë˘D\çJ‰ġ*ôŠó–Mdß|&n84üNhšP^ħX†Òt˙ž§FüòI œv£ŬŒú FŻëħ †ÑzÊİĤëWNŭ? Ò}żż]ÚŬĤ+ž£‡˙÷+Œ¸è ×c°hŭ`ñÇúÙÓöĊŭmçĠ 0*rFiš&cŞé&UÖ †èô„\ûžĠŬ/@švĊ˜Ì8Š,MÓHJé+ĥĴĊ‹Û³žh/nĤâ‡zǖ`y‰7'Äï˙ úŭ_fOjżšĉÍŻóĤˆa;ŽP)•™PŬ(™Ü'Ü͍‘NÓÔäÓû;xŽ/JŒèËRĉ3'ÁœĉV+$¸ĊĦGÎqş}UC<™TP<–)lÈóJçı<•âÌ §%p¨Â-ĵ ßÑĉ#+ŭœSYœPUM}•;£áÈùĝMmÇ_ Çĥġì@·£âÓşż­ß~g@ċ}²½P\E•!4˘ŝfU{ êe}[WÌPÑ$Ĥ|­fÜóäżŬ}§ŒòI°lhí%°Ċëçiż×öĝ›FóUUÂt£ÔÑ`˙Ñ$oìTÄP+¤;¨İFQyĦ]ŻüÛğz~ñĜoORXÜôu9ÌHݽŽèĠÒÓûœóé…p8oT”x’Í#’$7Ċ†a ĤŽĉĜÒk`¤ż,ĝÖ<Ĝ 0™w°—'mU#ŜAUך**wÊä”D‘_byáƒà šĠ¤+029˜´É%ħҏĊ…ƒCQ2nÎYċü]aÂh DžûhԘ…ÉşR6]U-UĠTŭŜAO9­'ˆÊjş0ŭaşùEUßıáyt˙¨¸ŠâyuK1éA/˙öĉݲÏ<~àmעwLÓëÍíííĠ nF;ı1 é~€ÑžÒ.ÇQ †ì¸É#İ4M,ËBTWÏ_˜wXúAZ¤9˜#@™³˜`›×ú8ĤWۂżéûѵ }ßß0¨ÈêŬ‰W^“PJ29%bŒ‘9Xhnù 0àk‹ÀQŜ<p$X^!ĈÌL'Ü=UĤ2&šB çÀĜ˜4gı:20Ĉ1œëŠ2ÒÔ%eŞxĤR%Ugò˜ ĥ…˜dlŒö´0˘IßFS@a ÈŬQYcĦ‡†Ï•)š¤:UUQ0ŞT>ŭ£JċS„ñòDzÔXñ‘a:*g,ŬW0ŞúeUaÄ,“£9ŒlH6 —Œ†˙züÙ' }àûÁ5Óg´A·RڝMÓé 0Úq”Äŭ£ûE!í4Žb”cƒ ÑjŞ” µÖ]•e[´xɇ}b–RŜ°À,d›_ù3èÎŻÍhÁUS·†a7MÓxĸà_ñXnĈ$Q>4]~C3¨Ż/dŸ™3'ÁĴF/_A•}%ı~§aT=‰óL¨Â+€”dF1 Ĉ ċá=3ğϕP*•WTdœA—£Ô™ ïġî£26Ħ—7fl§=~oˆ6ËŞ Xn nè•j}ĠjşO ‚`QğT#šU‡Cp•Ÿ_âpÁÂp‘MĞ*ïqaÀÜ5ƒ ÌvAñ<ô0+?ì>÷ÔÜKYŜ*rĠ÷ŭEc”ڍ8š£Q… ·#şß`tż†ìĈÙé`i­µNóUô#mò›×<|fv]§`àù†hIŻ˙Îġw‚Ǐ´GáeÓo´fLS~R“ROĞä63d”‚ şš9ĵô ġWo’>.fOh‚˜êá­èBUú¨ú´˘!WI(7€Re(Àƒ2âĠpž20êSF…jÒċçlJĠÇ …ŜsPÉ?1ó§g’dèKM}B0,Ċ.]”ˆ*÷QúĊ2ÒŭĦ}EÈ44ĥ{VU+ž2ż„*83ŜĦPNċ¸‡"‰^Óë°2Ş0 *·~ğŸFÜʇê ;wĠè~µ78ÑXZ{ü‘ır¸žïûKŬnw# ħJÇ0ÈTÑnĵï𵧁t‹(ŞY–eRÊÂ×ë]ïZû‰ß;ğÙ% a1B|ŝçç.Ÿ;Ü~%K“˘(şîûŝJ[i½Ó˜àq İ“¨IUz”•ê‰ħŞj"Ó³T ۙrq€Ê)ĥ=ġ•“ç_£`0ÊŞżÓş2ÏİzSùçĦ‘áÒêp¸k„Šż\ßŭŠJ*ż60 µxNŻ â‚ ô)Aċ¤ ÀE˙§Zi×W|W„ ú£ĈÙŭè~oş”{Fˆn蕈2"Ĉ zí%òOèħòĈ‰#^Ž˘Š Ñ-ûżEQPTçî£Qy#şŬoêè~VHÓúÚ1“GJ¤”ÖzĞ×ox:HYƒ9àÙċ7½ñWôôĴóò=?ŠùżÁFaŭ>˘ˆAaç>€A…DU…„žïÒ4T’&"}€.H7 >˙q>Ĉ>ʙsp óÍ%ïSRŝZwFƒn3E€Ê“Ċ„ȁQ@RAċ%áŭ`20ÒEá33—ÀŞ9%£š¨˘”P™vʐ÷•%äùó]1}eEûlŸù*EEí9+aÄ&+£ ïÊtU˘ı *˜ ÔŞÓ½* Ż `F„ UНQĦ¸Qáƒ9£!GmBE —v…µ1ıġ>†ÑàëÊ}Ż’NXù ŠĦ–~kí—ò™33fšŜ[A\+*sğŬîĤé[L͉q!şA}ê`t?iFh’b*H`Ĉµ!1ó‘ĥ”RköÚċçÓ'âùË_˙NñàòŒċĵ†ñ• núżŸ$I!­§‘Ñ£ qF7òŠêëŻ@‰ÌÒfˆœjÒuù$%ÁGHŸUûÎÙÌ; m P,ÍıÁóTÓHèÜi V§)"(­ÀU‘cBİœ8ËsL9œzUtĵ ċé^9¸ê…ĉ8ĴÀŒ4ŠYyƒ!<°ĵĦ1ĜàvSuÂÀ\#hLh<˙Ğ*G÷żĠŻaş^Żżaä”Ô†a2èWL #ô\µûÂ{•z]qU(”™ùEĊ°ĵĵ||W{FfPċ7ħ^„mÊşPĵ½ô´˘w˘gŸ8òĤĊÔï_÷}Á÷ŭµ ĥâ8ͤ×tˆv‚Ѥö’F÷£BĤ°THĈħ!Ȳl[Jıl­\ŭˆ}úDÚ_ ³veŝäá֏8†áĵ9ü$I)e6pPLSz9¤jġŸwVi­)MÓ*‘ˆˆ”Ö:kj-ÏéWâ‹*ŭl²ïœÇ[ÇÁš6(‘½ÊğŞ}É'£ê‰­‰VĴƒŞ…Ġ0^Yè3‚™PŻ|,+î*áğ2\G}‹€[ŝ9ġ)£@lÄĠ ŒÌ`S”Œ¨j¤êߛF\ èŞ‚Ş@ŞRÀSF=u1>ë‡J?jC~ÑX.nXUŭ¨ĥ=ODğŻ&ĵŻ`ÄsŻ1F`ÌÊï ꞇùcu7ŸxòèKYš\î†á Š|‘ħJĈ¸/ìTQG;ì/ô ÁèÒċߣ TŬ{–ĤİLÓ4NÓtËĥí%vá}ïô7éÂKЏÍÍü§$I˘(şYÉEY–ídï>Éꝍ3ò1@E5|—eY %£””ÖZµˆ²'äKáGY%_%Ñ< ĉ6•ÎċĠ ŭOF}§ş1b•R—yŭyŞÏôW”гܢ€ïƒQ*ôÁ =‡mèА^™%Ş4AW’ĠlDÎhRĦCġoAƒĦÌÊğ: Tƒ eSİL*êg@)Ħœ”Z áܲ ġ5X”0PM7RYġ\ğ‡Jğ\GÒ<(02Ħ9ˆ|‹dv#÷Ó!ôòŻÁV~İŸ8n]›;xĝµ( Ż›‹Ùc- TÒ)ìl”şSÓĞħo~ë³ûĵ˙)‹£ëI’lA°áûŝĤñ”Ê*óv22ÜI!MÊ{KT”¤”ˆ˘(4 (e-­³ÇôÉu|yġ`v·N9M@pPĤJµtŻ`4ĝû”&(SYW>wEYxĠı3 Î{ûJX•áşJéw˜tg‰záĵ²4֞ÔGŸħıw ¤m SŭF˘fÜà_ċ“‚Ñà×4´2Ġv( z6CĴty`L@Ħ÷ħÈ-J7ñ˘ Ż·ßĊ•r•v£”Û F6SêŸÙ4ô'ѽ0Ŭ`ĦCŒt_F=ğQêgRÎH À¨ÏáĦTX½œÑxkFĴ2ˆ1Ó1ËÉW[PK?ƒµùJöܙً³íïFap# Ċ V‚ Ĝ,z”Ù@żâ`)÷n4&"½#0ú£?ú£Hw 4ŞMd”…Pı’$IPšĤİmÛ)ç\iŞ”R:Ë2J’DŽQZÓ|¤ Šj!4î´ Ş,Ë /;Ÿˆrݤ”TJ%M­“gt¸ññÍÏvżħöwĵĵ:*“ùŻ,.•Yġäż70üı…ı§yù„UÎ*fĴFU… ¨À*ÎáĴ|n~t3mħïPżĊx™cŞÌ^g#ôĝ4›s5Á?1‘3*V…4*ù$ê+§ÁÒîAé ĠvƒsC. z | \uôyÓ1+gĈ‹ÎüĦŠCüÚöSÏ{SĞôn·;ÁRka!ştLˆn§*şÛ‚˙òŸ>0Êè~UH£Âv£Âxz&†8Ž™BrÎıÖştL(<ĉ&„˙hˆ&…ì*gĈÄĵùX8)(Žc­”"“WʔRİR*i*=Ŝˆ7–ŭ/ΧÛsâÀcŒ[³ ‡ïò •Ê•RĊáü^h0GcşƒaŜ޲ċC0Ö³*ú•L˜×ŻÄúÊż93a:3“ }Îî ĴĦRAġç v;ÏhȤğT69#Şä”†eĞŭJFġTCx•ŻġùĈ •vëÊ8§^¸÷`aĜ‘Šġœ÷f] L˜İ:­ ĴüBŸ;Êo?2÷FG×0\00Ú4•¸Qš_ÑĤà™&W4&ÂH+Ô@Ú۠ŒŞPbJL)5)Ż3ĥq`ŞŞ0=!/D;¨¤sJ&ŻDĤŻTIRÊT)•(˘#êzÜĦ虏âÇĠ§mŜ:.´T€%r›Ħ= £áï'˜éäè‡O‘[bĵĈĞšħö…J£V”9§"˜‡JŞÑBéÖĵ$SRÏv€ÑÈ~ ˘á0˜h˜íssŭ " ŻˆF䌆Ğé*FŞcµp ½ Öï¸À98`ğıŭOx´ô 4wgŸ{ÇôĦ)\X4VbÛFħR*ÛAí˘£[‡ÑN×·5î%„†R0•Ípx cŜüiÔÒD—Ŭ1Żkœß88R%Ż)%(i)’RfRÊD)7” žÑñúGéĉ ÁŝçÚb˙§ JtT—˜>ğ·`4¸79êkİŞ#Î{p)BĴLèóş~lÀġaÄ;1ÖÄuLż·×ë·†â½,]0 TúÂzeuŬ@Ó+fĈW/·óĴF£‹ĝİbû!ò ËÊĞèÒ-Ê+ •_ÓC³ÉÊÙGN–&ñ5ߏÂ0\‚`Í÷ŭí8Ž£4MS­µœ2D·“*šf?金2“‰9݁´òH4&£6n >N;)¤ŬÜĤĠ$Ċ4V)™ÌBY@IJ7• Ï5⍛ÙĈüĊ9qIĈ‡âċ„V]_AzOhÜkÑĠ^™Ĵû+sKÄFÀŞjS*'ޤˆÊÇ_7#9#B_^ŸĞ7t%G„ႆv@}Sbġ`è­?Lĝé…†"çÒċ"÷Ħc°m€iÖğ‹?>şœ{|î}Ïn] >Š˘ Vƒ Ĝ 0H’$6Ó²]ĉŠĤq^˜FZċ Ú那ҞÊ)“Ħ”0A!;żÚİjnÔİ+ŻĞúù¨ï€İ”êkœ­„"TtÔ˂ŭœğ,<%½àñöip§ ŠR0ÎARġŭfb¨Ü0ĝĥò3Me2Şïk=›ĦjSeĴEUQO:1Èd`£Qo‡Qµ„ğêò=x Œ§ŠFŝakyù›J…A çyġcfTÄMèĊŸClż)ÏoŜ˜;tâí$InvğÑb†+an„a¸Çqd\şĞ&ËÓ4¸N ÑíF¤{Ž,ŒĠ!ğ=#6”h„h'%2œ€ ]ÓŭgĊXUŒQH4ĉ5 zàQ%„W„ïÒ,Ëb)eàIÙ}ĥ.Ï/l}vħŭôaë9ĈGÀĉ*œ!‡SßfL2]{FòbĠë‘ç:ĦŻ4ĵ˙ššġùŜħÁ縀ouÂ,ġ|h@¨ş~ ÂT ¨a4ú˜ ›¸•Ğ\!òê9aézù%èċ_áXssŭħgĉŜ!-Żù3Š˘•0 ׂ Ĝ7/éˆñ3;Áh§â…Ŭ¨œͰ³µH ¤O:lÇvİ”hDîˆaü6ıSrq\¨ŽFüìQàÔ;@iˆ†bÓĊÇb(a–eqĞĠ ›Ju{ÙÖ~?zâíĞçä‘Ïzb˙™<‰Ğ9İ||ğ"Ô½ÍrpTó} £İ\ğĞsŠúŝ-4uÎhh§qžI›} £[‚£>£<^K,O.2ËÎ'şÚ´ujċ—hDÄOž=zħŬ8r!I˘…(Š0\ p3Š"?Š˘°Ñ@HÖÊı§mxí‡Ñ—ŝkĤcÌĝê!ÏçĦĠ@ڛ*i”ĈùÊÑxÑ-ÀiÜ÷z=£`9 JBÁ4Â+”R–eQ–eA£!·Ÿġ‚…›K›/,ĝ‡žflĉDŜƒ‘)Àâ€RyĝŞo3/À¤H oÎӕv×0Ú0b•_PnĜE?<)Î(Y†^ü5ĜúĞúÑ£ÖÂÉGO½ĤÉĵïû‹aA°EQ·°ŝɲ,“+Úİ”{'sT=ċÒSFċߕġ ûàħè ÙíŠ%pwÊûŒÔNÛéuŽ‚Ò¸Êż~/ĠRšĤEžÌ²LfY–ĤidYĉ7ܞsӍƒQôèÇ_~*<ü|Ë>ôĜ’ D&u§F5Œö2ŒzV?eowÀ„Èè)zġ è•_µĵ}îécïr¨ËAà/FQ´lTÑvĦв,ËFTiÜZ_Ѥ|&+£?É-M*í=Ј!×Uv{)l7 JlÌĦÌ0>úJ·xĴcl(Dž‡z'(ħá<%I˘”fúFgY§i6›Íçe›O{á͵ġ™kkžÒsŸµĊŝ³€ÓÌ˙8™Ê [ O™Ò݆Q £{£DĊé!úJıÁĴü£Š ×߂^y­ìJüèC/íŸ9öA’$ A-EQ´jœŭ·£(Š+}EğQDŠĤÍí Œĝż]cÂuk ¤½”&›²NqzLhùWp£‹éٝGž|/MÓĊn·ğEÑjQ=gĈŠ'Y–Ĉ'rUT…aôd×[Êċʨ’3*˙ĴF¤:ŞË÷˘JŠĤİĤ›¤TĤyljƒC"˘[€Rċ2plH‘TSġqSëPĉ”” %išFišúišn5ÙĈ17]9‚äÌĠ+7žĜĜ÷ôĴ=÷4˜}dssş)SĜc”Ò ‡(ÛëF5ŒîŒŞdĵw_ˆĵŸÈ²óc0ĵ ½ô+ˆîğòì\cáĝ£'Ŝ—Yz³Ûí.ÇqĵEÑzž‹¸è)ކç&AhROÑN@ÚF/Ö“#ù=˜*éUHSî§Ŭ(ѧì”nğğ€Ò „Żĝ…$F(%áJ<-̒|ĊI’I’ĝFcĞÑÈÖu£›~üĈıK>z$;òxܛ…ĉĤ4(Ó`Œƒ”Ş•Q £ğ £˘ĵ™“à™€ 0‘Ooe‚C‡7 W_ÛxSŸ>ÈVN?wü=­²ù0 m˜\7Š˘8˲DĉñìlBHn·Üğ+çîÏQċ4/òb4"€˙ĉ˜Ŭ(MÑN—´›Çwkŭ>%”{•hBèn”Ę0žVJi"*šh³4M“$I˘$Iü4M·ĈĤçeëÏ;ŝċĠî³7Ŝ:.Ĉĉ·;ŒƒA/yeŜ°›h £F·£>sAŜ ]Yvš"#Î9­@.ĵlĵAÇÚÑú£ÏΝİq,U@´i&¸†išĤáı´ŒĈh§é}Ññċ?ĝCʈ (£JíéQ%k Ŭëuâ˙ŝÍ˙Ûgw*R˜6„7•zş$ğ ßU]&8Fğ;L‚ÒœŒZRF-)B-m7-ÏóÖxÙê‘Fx|iù'OŬX|kNzÖGžsÚùÈt—Rġ ï5îĠ0Şa´[U홊Ay 'żâŒ3Pĵ½ŝ&ôêk8ÒĜŜ|äÜÜÇê\I’h9Ž˘­(ŠşĈ{.ɲ,5ÇŭN şE´ëŬĜ}„™ÓœĴ?LW:5Ÿ×nß{pħQĊğ ÍM “;ġsv™SŞÂ‰á*çc>j˘&”’i˘$IÂF£ħĤé†çyk‡Üt鈛[^_âúòğsìĜs›} ĵı” PšÄó"]t†i¨5Œj„Q–+Bt\ôzŠÀÀ,ËxÏ1PxjġĈğt¤ožzôÈĤÛĵ”$ÉÊv˜,GQ´Çñ–˜%IUʸw[1§°ğ<ÑÔ!ş÷ĈóĤ×2_6ĝñÁĴ°{0€T5¸_v}O4%”0 è·§AğĦÌçŽĦĵ‘`*Âx…IĞÉ/EqwĈĥçyëžç­rŬ…£ÍìĜâòړ7Ŝ>Şçž³ĝÁsàV˜¤ƒ§5 ™ċ!=BGùk˘FŒĈ5^˜ •ŞŽ^…Û­°ÌkƒY"olĠ)t÷#¨•—Áğ޳lôӇ/NóI’Ĵno'ĞI’Ĵ‡a¸Çq7Š˘°¨œĞ,L‚Ϩû4*vntŬŒŜÎñ×ÈC—5öžBş 0¸—óèwQ^µœ­´Snİ€(S"ˆHç…xYÇqÇqhBx›FcÍu“Ġğ8×Ìĉ–ןĵqóÍ£ê–8üxc”0@‹|  s•gJs+³ú­‰Ú5Œî[ħ ÖR•\nä[1ßg °ìüÀĥ€qĦ×ÏC/ż ;œ=Ò\>~ĉèÒj)Mµ IV8ŜŒxËTͅI’$iš&Dj LÓĜ:)47µ*š¸×P5Z0 †Ş!ğr+˜ÔNYiÏ(¤½˘~îBoÔÑ7*„Ç1Ŭ<'QšĈËr‹‡$ŽÈóĵ ŽçyL+G\wáh+™[ŜX}bañĠ#éÇ\ëès`9€l„Bçóz4ġşPƒó—X £ûF˜£ŝ ˆe˜Ž›­GXıBŞ#µç‡Ö^C[ŬŒNÍí[˘ Úméö(;WŬš*<‹Q‰ Œ  9×!ğ½·0 ö[°ÚI-ш£{T~İÊëÔ0Ċ…br]wËóĵu×ug\×]vgááĤóñÖòÑĊĠ?~sŝW‡Uç´m˙ x(à5@Rƒ ’Œ44U†Ž1VñÍPFS8BÔ0şË0ê3ú¤Š¨Ì—GiÂ-@äÎی[ĊÛ ×ßm|€^Ĝ=vdvéìħKZĞĠ4M7ĥ·˙?{gÖÜĈħŬñszlÜ)ɖ}m_;.'ıɗñġ7ÈCž’J%)WÊKnĵJ×Z(.XgĤ—“‡éà˜(‰˘ÎŻ pR Dô˙3§ğ/Ò4½Ê²l˜Ĥé8MÓùn­•öíĤâñKÂñ°~çÖmö,Ú.AEDXICµçŒ–>ŭ\îûŬ’ĵŸ--JxË Ġ´´Ü]WWÊ psR nˆ)˲Lk=I’d”$ÉU·Û½H’äe’$‡Ĉ˜gùíž;ı°?üùùß?>§ŭ}<ŭJ¨ŝ„> €sĊ{ÏĊ]R}ä.Öġhé)ËèġË(ĥeӍÜ$#QŜEëvœ3TÈ)MŸżĝÂù·ñ/²ÇÇŬ‹Ç9úIÉçyžŸO&KkmY’E M£ˆĴµÖĈ ­mP›DÔ´ëÊqĞ–ú;‘ŠjËvxóCRɁÈÇ\÷óƒĝğ/$|T“––_™&eĵşóKëÄÖȨö~" Ŝ{Wžk’RĤ³ÙlŞ cLbŒé$IÒĠZ÷´Öŭ(§ßġŭ‡=µ0=ıLx|ñÛw')r}hÄág ?q  ê yŭ›ä@H(΅# sħ­\ç£Ê7ĥ¸žßA•…a+gókd„uÁjñ| 6(Ó­’ÖËçw„ú2Ä˘Ü\qŜħ˜!ċġb^"B)‹Ž8 ²@îèê7߀ŝ }I{I˜îu§û'ÉùñçŸ"„sçÜÈÙt4œıħµv’çùÄZ;³ÖÎb).ÍóÜ:çrk­+Ûµ‰hÓâMڴ*Í •qCUNĊ5•żB Ŝ1öÎâ Ŝgv(ъ¤$ˆiYR¸")Ŭ8^-éeY–)R”TJi”I’$ÑZwŒ1]cÌ\PJİÁ@İÔàË5ÈÂèÁUúßœ˙ú_‡zİÜ3âàO Ž>9ĝĦ!’"E…—¨ " ×ż€ó…¨ÒßB„_¤ı V'#\}Îh9ÂĴj§VÛ£8+k뒸N=B^?O!€(hS<İŠwyBĦÍġó°ÙK_ ‚0ŝ´ğr=9;t'û'g‡ƒŸ…‘sn⽟ÌĤħsn“,&ĦR@Y,×ĉÎ9_nuR)ÉQ‹ÄÓ´Cé˘ğ%˘…’]ċŸŸ'y?ŸdLó?¸ĝĦ‹÷Cş£fĞ2Ŝ*A59Ż„k„…•ä„ÖZg­ˆ˜I)ċl6SQNÚc’$éh­ËKWkŬSJġ•R½)û'ÇŞ/ìç!=Ĥ?>>ûîx4³ŬI.:ŜHì?qô ˆŭ?èœŞ^ÜŭV-NÀĠÀ9 @PĊhċ\‘,<‰*fJĈ2 Ċ‰Ù•R `!×ûEĊ]ĵQ†İœß Ħ‘TħÍ]TÒ(Y TJÂ|Ö~™òP‹ıòÏ£à$@Ȁò3 é “g@és?€²sèb–ïÌähż;´BjZ*Óñ<$.Ùħ˜n_ŜÑvY8m…UÊÉ€°ÖĉB1›Í¤RJJ)µRJE9­u˘”2QNFJّR&QRƒìŠ}Ġ•RvùŭáìÙIĉŝĥ79 ŭÌzĉ¤'6t@vğ§ z§€Ŭ#ÀäÀH˘{ ;@$ ò’…˜Éù şújÇd%% óEéÌûëÉĤAÄF‚(!âı˜7$P6 S üB6Ê.ì(żŠ×C ldÇ7öşIŜëèĴ7PŝİÚïĝŠ(ÌBİ÷> !d!¸t6ÍRï}ĉ½ŸĊ”9ç²(˘²ô–Çôs.„à˙Ċ$ÔFBmşáš$Ħĥ"zğċı•oÚÚíĵAVÎ'…ÊÖ-È%ğ;9ĝrÉioŬùĥbZwj•œš^/Ë ½÷Â{ÖZDD)"Ş0”Š‚ÒQVZ)eʋ”2‰‚J¤”FJÙé ‘ô‘œv…Â$B#„HrGŭÔ]쏳³ƒ|ä;Ùı7ı#•ĉV# ŒS×!ˆf(ÀÎ!€îÊäz⢐€z0éÇÖéÊg€@óù>”€ì¸H^•SɧvdS€àò€Ÿıô• !B7‘ı’Ò÷•+#ò¤/fFËİ–ŭi79²İ^\6eY!÷ŜçŜû<„;çrï}%d%³Ö:m‰ĠĠ$ j!“6Ù$ şíÖ5+Ü}͓N%!ċ×ê6îóĈ‡¸|PÙÉBbîIZÚULĠûĊÒ×U9Ġ‰§‰œjï#"ï½Ç((ˆ˘‚Œ’QN²"İRXFJİ”FĦ…FJİ£””Â4˘#´Z#˘FìHDTB*wԝY;@<Ô텍|‘œ£‘íçxê3*‘‡ŭžIQŠ÷($@ Â@žÈŒVx ÊN/È‘#"BXmCȝ·d‡Yp1•Û2”rñÚĈ ÊÛe\<îÒPu"hŜÙF !lĝ·65'ĵ{"š?‘ÊÂ*ˆEıĥLMX9çp½”=mûF".y½OÔlëŽknÒíşŻë.˘RÇ5‚i*)Üp|áß­Ĥ(DQL˘LSRJ%„(ӕDD”ÒBU^˘¤TüY eyBHDœˆ"ĥċuġö€8†jÉĞ<ߏˆ<•×.ĥK—ëş9" ˜b !”ċ4KDÑ9l4(e§‡ùrÏĞR>ëÊaM’Ë6ÇÛ6%Ü/1œŜwŝúkĝĉ›ovILT#)ħ&M-ÏQ „´NF¸FJ"8ó˜ç9F )%ĈTû&DyğüZFa‰(&Ċ#–EW‘VeT‘Ö|(DŠÂYEJ)•²(7MŒ‚*…ŞmĠei-ŜYgQ<´B”RVż–X´Z‹Š˜*7ç?+ŸÌ‰ŠI¸Tı=OJñk_Ż@07K<ŻC´âíR: Y´•´Í6é§IbħÓÚóHëÊyĠ֔ôBM˘ÂmëW¤X8›'{5[ `™´`Ñ>ó@$„À%ÒyÉ( ĤmËr,"óžŠéĈğĦœ‡+³n)£R4b›s„–ÄP&­êcŞ´mŭ¤ Çםi#¤uRz²Úĉ9‹ˆ…ݘV‰iyÀ%-K × ò›¤!Z<~›DÔH>kWÛFJÔàĝ*!­*am+ĤjÂi#(Ĝò1›DÚXB,"ó~‰i“œjWf[#$Ĝ!5‘´ĝşİˆÚ݉”¨á}·™”6•ñ`ËdZŝìşû8 ħf³˜Z–óVÉ ˆŞI’Y–V[)m#£MÇŜtBj#mċÔ6Ù´‘áÖ%9Ñŭ…ç!½o˙á·³ÜÈĤó&Mñ&‚Ĝġë&?6<—6Éh×—n9)m›œÚ&›&ëĈ5‘FÁ-ĴOÀc'$ĉ~A5ƒpÓĈ¨y|“äÔövÙ4QÓÉÄğHİÍÀĵ­˜ĥ‘Ġ&ᴑÎ[“BbŜ/9á Y5-魓SĦì"Ħuכ’^Û$Ùf Ŭl×TN›$Ô6é4Úgˆ%ݐ˜·•šêê&rjšbĥyì& m“Žn3!µ´ß” šĤ–BbêV&o#•Ûè˜{M ۈİiZÚVRğœ›jú|XB ‰y§äT÷½¸âçmLÓ$ÔäŝĤRÚVNÔòŝ&ƒŝ&QmÛ,ÑF@,!†…ÄÜ9àĜDPÔ0í4MAM^gBj;È7•R!µM9Ôâ÷bsgċ´‹ –K|u’Ú$—m’×gW1µ• ío²€soäÔ4=A€ÚHjáà[~}š&‘ĥċ´m%ÈbXHÌ{/¨UıM’Z÷3ßdyn!µ‘Ċĥc1,$†i(¨]ĊM%&ŬoSFŻC$,†…Ä0·0H·íà[•¨šHpÓsxòÙERMżŸċ°ĉ5 ĉ›DEĴ{W ĵÉÔt›bcĵÁğiŞ˘[J@Ż[D,†…Ä0÷PVۈë.‹‰aî<ĵŭ0 s'ü0 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†a!1 0,$†a†yKü˙1•ŒĠHğIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_DarkPurple_16x16.png0000755000000000000000000000016512467662066023037 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(Ïcì1ĵÁ@ `b ŒjĠ0t4 5µİöĈIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_MicrophoneBlueGlow_256x256.png0000755000000000000000000005356612467662066023363 0ustar rootroot‰PNG  IHDR\r¨f pHYs  šœ IDATxÚì½ù“dÉ}öÉÌ÷^]]]ŬÓÓÛ;;;;ĜÌ..â҂dK<’)JÒ"-J&h†l‰Ya“!ÛaK–# ùTÈ€[A‘& à‚X,ö˜ÌÎÎÎÎÎôôY]ç;3ŭCf—/ëUuġ1ğŬ3™/şó}>ßÏ÷LÀ-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·ÜrË-·Ü:K‹¸Żà!_‹ë‡˙ûÂ}qŽÜ:û`'‡ĝ­ĊÔ뎸ufÀN*.Û·UŬükޏuÊ@_şµĈ°ê-‚ePú$X }À€Ohà Ä @`‚˙‚oƒ§ï Ko! 7ÁÓ˘Á.öïŒĠ„ú_L!GŽÜz€_Xò…U^ŬC£ÓF­ġ,}„>“8]°ê-W‹~žB- Á·Ċ}ŜG–~ñàûín"썐†‰EÜ"áˆÀ€[ÊÚSbċr Ak ,x^Ó Ŝç@½K: Ŝ90OŝĦò òëS=.ž×9àé<Ŭ‡à#dñw‘Ĉ_AÔ{ I¸‡îí=EÜ:„#Gnœµ:—êhĴÁŻ,ĝë Ŝ/uP€y€W—‡\k·M€€_7~qZ=4”àחŒÊ—ı"ˆ,Cï! żˆdô] 6ob°ı UYdàÜGnIĉŻ=·„FçyPï§ÔñP hġĥË5¤z ž´ŝñ  ŝ0ܖ !‹C~ñèOv˙[× 2ˆ +ıޏeùĝŭ +?½ŠFçó`ÁŻ€? ê- Ö’ o­É£Ö*,9O e oZóyÁnĞ{QŻxd 6Ŝ]`˙Tiœ"‹o!ŭÂîżĈÎÍàéHé"¸#~˜iĵ§~â/Ğ˙ú·À‚%ÔZÀÒE ½.-ĥôô&ÀĞÀn˙ü*×ĦŠôóje½toKRÈR o"üßn{·n('†*pÁBG<ĝ .|â1ÔÛ˙ÔûÏÁ‚À $—/IÉïĠÀ³ €zĊm”NŞ€ZüœO'óı£ž$‚­ëÀhÈâiĝFğ˙îżöecċ$Î-phËŝ‹5,_úTĞĉ | X}ğ fžJ€›D`’­´R\6çÀŝàŝkòo†HF/`ïöoc˙ÎMħápGŽ~ôç?Żŝ`Á /ׁĠ+2ÀÇ™bвô,ÒžPÀo–í“…?va\ä&ĝÓĜp ÒIBÍ”rñİ6ŻI"{’Ñëlŝ6ĥ@Oıq)6àHà=]Ì}ïż/Á˙ê˙,ĝĝuàÜ3ÀúGĉ2 2e=ŭ²u×yĉKàëû™ŻêTĦ T1Pĝ5yŸW“ó¤²ëĊmù}êy<,(+^ùEäŸP> *ŒA™ĵL¨Tò„J“Â3IAC1 R¤ñüĈó¨µv0܈TĦ˘Ï Ö’E·<$àçĝèÏ^ŭ ~µ–´úë– ™ĵŻ->“òò:!òzT+b¨g~Aú9™_¸ öA™qïA?=aĊ}€" 3>aœJ”Ê÷›%ò˙ÎÉ f2²¨ê}ġí[}’ò˙RE ‚0bĵ_ŞI‹DÀ$h’ÔgċòóÖZÒˆ@<\eO"Xl^3À_n7vJÀÀ™”ŝ}h êŭÇh,-`íY`ċ²şÈ”ïLÊ2Ŭo²žù ôuy=Xȉ*+]óŸÊ#`S&D‚—y#òöŞ/zžÒ˙+2ȈĦ 4ĝ +àEl@_Ö$\‘$°×†Wğ/ĜĈhçž –U 88ÀݵdÀïÒgÎĦıü÷àĠŝ[ĝµÎ_V> Ċ†ĠWĥçK€kŸÛ3üù’̧<˘Ĵ´–^Yly9ĥrg- rBÊMŭú9°,~.*¨ŝK@ÉôĵŸ·›Ŝĵ~>M òu•w "Ŭƒœ@ŒŞD TjR×ùù‡ÛÉĝXPG^G2î£jèˆ#G§>è€Ç?ö,ĵÚüڏœ˙ ”½MyÀNĝü†‘îSÖ_+HŸ“À÷™²Ú„”-ıĵ.=ÍÚëĵ]\ŜVPƒ$ ~! •@‘1PCîóÂ%àiñ‚yӓ0Üdž!ÛHĈÈâ!ÊÍC.=èà X˙§˙Ê š+_ ~%`íC@ûñ:ÚŻóï9ĝEjÏ IÀĠ˜VĜĴŻGË›Vè~JĤğö"–[@*ÈE׏ /§‚B*'²" ßİ&_5£>0Ŝ ¸‘ŬB¸ż‰˘•¸ˆ ÄW$tÂËs_Á Yh|„ŝ üşĴòkŻOvéér^í×kŸ_G÷UĦOÀ¤Ü÷háÛsaìäËr!J §ä 7˜ú\İ ÍÉĜòġaÄ ˘Œ!EP.eÖމš>¤{—Àc–ó˙q¤áknżƒddvJ"X\'R)€Ógŭàħw°pîÂĞŭ4–µg…óċ‰ğĥúÌ+QĞż Ĵ<-‡‹¤ñsF?à[}ş…XÙ[áÖħu_ÁI@P3û Ŝ×äImöÌkıoİ'ĦÀ0 áIĴpÀH~ l_Uġ™Vß>st˜2ŸZG?/>"9q5<ÊXAvĉg6ˑ5IvÔYìôa,_ŝKêê•ħ˘p lŽNŬzîo|Ô{~}Í ħ"S~ÀdŸ z#Ç0iùUÔ#­;AÀHɚ{T•óÎ òyÁ=ïóĜ ƒİ˜zßu *kLetp3oXŞ—I ‹ċpÓöÙ3À‚Kš(”ğêÀÀ)“˙<B/ĞË V½=9ş‹YÒ?—ŭ á‰ĵ4×Sùy]ğŻ rj^µÔÇ1Á}ĜĈ~~3!S–Äĝ,V“Ġ“Œx*{€MĝÍ'àĠ/*¨)Àr8ÊĤ§nıÀ˙}Ôkċ£ş5èugŸĥ~ıìòżžÇrŸ_ƒ_Êŝrê<ÌÒ h°9à’‰ÙĠÏːpċЍ  2JWɃ}c¤Â`Â5zܘ ¸Œ›4:€_÷4?ˆö…îÍğÄê+(ï;à–#€÷eħ€áÜÓÀ‚OƒzÔÚ²èG[5Ûêi"È Á§Zö“<Ż^Ô£s÷Ĝaü~2]żO3eÈ "ġ@\B€3.8‚"¨c"YZL#òùŭĠÚ@ĜЃyĞ ü Žĵßò¨·üĉ“ Ŝ3`^ ­WӐ¸V €Ǥĝ§YöFûuĤĝĝ\ü˙´<ÖP$‘òˆuV€y€TM„ñ›+züy ^ŭœPt$ààŭ× t €‡ %óÙĉĴ½|ŽŸž¸Se,úi€ Ì&Ù>óXòY3/Ûġĥ²­˙ĉ˙pĦŒ×uê’ FdV€k2$iáZŒÓ$J½¨·êuÀӞ:W™:Ҝˆ]:Àû Ì[…_÷òñ\ŞkoüV*P÷Ükż?OċAĥàβ7gtAĜßT)şT(܈ETïRiş‚TdHÁÀµġÊ“*ċ£xAµÖ%ÔÛkínà7÷TpËÀûü“,`›…ogĴÀ(#ċÚrÁ މòíÓj÷#ŭgJúÄc–%kP˜/ŝWŬ@ıì LİÜ`ʽbšp>ŭ¨İ]Ĥ¨×2\€•ÜpàÖĦ–BŻçz—@h ~½Ĝş+‹ĞÇzИ€ıG ëoËm³Ñĉ8r~Ŝ˙ħkÂ3Tߗ™re’‚nK*ÊóŽòŜ,(ïcX." Ô·ä?1âNŝ;xġˆòSŭ ‹o­ĵ7%ċáúşm} 9ĜbÏûĵDÀĉĵMßI*Ğ ž”[.„r(' ħÙX S‚átµ$ż_˙7Ëœ ààÔA–Ÿ¸ÔÚ§4׿ÜYc˘TÛoZŝ*Ğoğ\àÓ=OÚOğ"U·3”k€ùPµbrÊP>óK÷èéAfšP^'I‰„Ŭrŝ9œLX}s[/³€y•`fFğŻécWùáÓZ}Ù!À´â´TŸŭx-ùsÀ[A ’B4ı™>Û ċ8â2è'IĥêpËÀ)p'›vNÛ£Ï8ıuêÏLñÙ ›eáÙ!eŝA™ƒĈ ìż\”˘#ı c™p’šA“@Í9‚”ÂYûğ\Dġ$Pöóuħ‹Ŭ¨(üR ,6üÌ8Ş€5í˜~JNĤmX?‡?%kÁ¨5Ĥn×Sƒuä?"5 ÖšĤÜr à´Ñ¨WŜ)‡Òވ6@(|*&Ĝ£Ġ“ͰÒó€Ö£‡pÔQ÷ ż˘Ú}Èß·(„UÙŭŜRafĵ˘ H÷M¸ċàl8´ĵ{Ż)kÍĜ€ˆİ­²ÙÇŻ/ûäc½(İìa@?-°ÈĊäóÎŞÔüĉˆ¸Î ç‚À#˘xŭ½ċgdPvŸÜrpú€eíKÀž1ĝ‚•fíkrpÁÏĴûÈœ’ù  ê6F2A*„Ó‚†Ä(Ò5ğÚí)ĠJ 8·ĥ)7Ġ€#GgĈúëñV,(Yĉŭ„ĉS~è+?ÍŻŸµ3 LÊñı™ ŝ#˘²Ëü_3`żwùgJ xVJ0¤ÜĴ·×ߝ[ŽN5ĝeCĈċŠ6ÓPùFDd´ĜĠgšôŸfíŠèT› öià>ê2˙Wĥ“üµ…áçólò3yŠôLN™, Ӂ²Ĝ$QĝspJO9xڇàY ôš˜7aKA|ÒouĞÌQPbö>@ĤxœCġgʸšäĦB¨€(‘Ġƒ6qÊïä!8YíW\&ĊN²wÀ§)'E‰°ŝÎdLÀŜÀİ^t˘ù‡—X”’’˙Ż·ŬÖ@¨ÊT˙°–‚0Ş‚xöóLë ÈO&•ï7Ažñ˘ž‘˘“0Î&ǜċ%Âö4%·œÒ%eİ]öëİŻUċ·§Uç‘)ùûƒ‚|GĈĵ)Áy:Í`³'@ż·ŞíĊ< dޘ9QnkV‚oÎ (S[ú ç88 ÀŸ^˙_ş]ŝ¤S~´ü×#µÍA!óXġ£îxâ˜EP*@ä™­¤²8Ż ŠŠĵO`L+Ŭ'xG§x™ ỗĤíÖ3kŸYVžÇž4 †(¨ÓĦ@ÍİŒòOí_ÀäĈ§TÜrpj—mİÌí09ϟQ fÉ˙iQ~:ÚNĞú;l5àaAnÊûŞ\>ŭ“q b7qŠ\”C·œ)°ûÙUZË‚áQ’ƒZ˙èX€ú™VqžyıôHƒAɁŜÏ´Ĝ€öçġF!€£DVrıÓ²OÀœ†Dİ‘9p ÀÀ™T:—­vĈ-Šé›w–:äfÜ÷ d~g=Ÿ”édâqĝbj#‘˙H'j¤ H BÈ ¨wç–#€³˘ W€R21ËS·1Rî$IxsöL·ĝäÈä0­œĝ ·£|;İV˘šÔôĴ@@íÏë€#€3ħĴàċR_!­&Lû1-Á6˜ĤġñW94àB³bĉm”é½ĵ PŸĤÊĤŞ’$319QÉ-G§~İ€ıgžYŝËĊô^zˆzŞÎ<>(8kQ]•§7û™U(4 JDHI)¨ç3Ù7g†ká€ïàLÊuâšU|^îçġ˙U}Ġiƒ­û, z36‹ÓŒżU³˙mwÀ$)@$ ÊʇS‚ìϒs§Ĥ#€3§¨Şf³ü]2™öCQᐒ˙ˆ~ŝ4ŝŞĝ!ĉ\mL(JÄDġ£™ï×͙(“˘sœ=`üfÙ5°.€Nwrr„-нW5Ü.*†‚¤D>•é@˘+˘Uż#€3GVċŸ)u0̧ċ‘ß­NŭUY÷yKƒMeğ°ŞÇÚ2żjP~éħŞGħ0fI “ƒ#Gg1 ‚€˜FJòßlŒaşF T@Ĥ§˙*@nû;Ŝ{֐LìvL#‰Ì(*ı5D6\CSġŬCJ[İğZGgüÌĞĴŭ·ĊÄ`P3àWĠ†;ÍŞOa'Mlùur˜pŒÜżĴ ,҂zĝ‡ŭŜn\7]*·œE˜Ü.Ë·ëˆ0ĥ›´ü³75NJ$áJUò_;3Ĵ·~\ÌÓ.‚UùWŠ=Ĵĝ ™GŽÎ Ĝ';£³çöK@  t†µ×˟saˆ€‹ùÁŒ_̚ĠC­ı€ċĥ__€¨r]̍VŬrpVÜŞŠ]lèà_À&ëäí¤Ò·Ż> ÙİÁ£ìPġœĉíÓʄ=H‹ŸßĈd@l(!>Eè&˘œœppĤÀŝb­2_ŝ3%ŝpgÈüY½‡)šGÌğ+q•r ¤*ˆ(kl’Ó‡°ËŸ]ÀÀ™[Ş x¨K[‚— d éoo êÓé˙Iúŭ³ŝßtW„eùíÑ`yÉ3-{š„òL…ş.Tœ€k ^+Wn& #€³ĉ˙K`“p|kègeóħ=#Ó-÷qŭ|RANÜ·Ŝü“ƒÉ`ÖûaJ £˜ ÔEAĤ‚ÉLrqÖßÀ™ àĤµ3çŭÙğš%Áóì 4ívR5ÁwŜ÷œ?‰q­–÷ĉóNŬ ”ŝß˙rQŽòû;SRŝr´;¤U@İG qpĤ€y2WQPuı P6ĝçµöÀÉÔTYġ+Ïŝ7 €^ñĵBnnž° £‘ !*:'}*ş³ÊÀ™"ë$žVŸï=ózJPUšoW)ûŝYé=ûöÙ#żŠ ^éhr6°3ûùĴ÷ċW½G§œ°Şu€9ŭ·*XF2eï=ŸÎdsl`Ï0˜6ŝû ­Ċ|µ%¸Ù  ÍLĉŸI½ż0-b%ùL·œU`ƒ…ù˙*éOñ}:?2œÎÑw0kOŬ`~mġ)gô.@ĉîAš¨òŜgŭœ5O|ı´zĝ‡)ßІ”¤ñB:%h–ì?èħ³ƒêB y+µây›™¸ċàÁ-ŬĞ\Ŭ˙HùŻÁï³é?˜56ŒÎ°ö•ŭo3ÙÒŝ ÇšàċF,Ffm‹"˜dċûò9‹ÜÍppÊ}ÔA=s?€i£ĵİUñWU98°íŠArÒ£Áùl°ÛÖß ~2„˘Z)èx@jTšETÎpp&W~òcúŒmùMyo[ŝiä1­ı‡< ^fEú…Şâ³çšÀçBúòz+RZSL6E0°4Ĝ‘Àƒ?_ŬWp²q€Şíżt IžvŸ È÷üU#˜Éó § FĉÒ0"ʃAŬrp–\bX˙ Zs˙ĤĵN‹ċ?HᘠÑÉ!&f|ü ÌREÔé=9à\€ı×âúƒ÷7Ä<$`ƒ_71"J´Y÷o‚ĜV §•nÄDİ1#eD›U•>?7ĈŸqĤ‰ˆÙx*΅yÎGï JóÛğDĊeĊġêÀœXKii ‡ `TħFƒŸĝO*µĈ fŜÇAJ~âĴ\ ż ^‘FôàˆAÀÉsz>ˆÒy‘wĈÁoL)JZA‡ùÁġËĠyĞQžU˙Ÿ:ŝaúĊĉeFŞ ‚N‹ĠŸúŞ×â˜Ü Üĵ?Ğp'¨g˜—ލS9Ĉı Ï^q‹ë œmßàĝôŻ…ĠK¨·'vè‘goP²Òǘ~& dùé΍}lßĝ—xû[˙;²¸k·Â$PĉèċŸ6(ôAÈŭ“´ü‡}M{öŸù^LşEW¤¨Üêü@i~ċ§ŸÂÚs˙˗˙1V,.šà“—3ĞŬˆ§ċşŽ4zwCĵŭ­g1ÜŜWżÙ¸ĝ'œM(ĴżäÂ*°z¨µÊ7÷˜# tmµÍ–S/’ˆ ĥ3tržeĴ~x>ñç5‘ĴzSŒ<ˆÙóŭNĝcù"Fçbrİ9àÈ~ù¸K´œż œż $# jÎ ó´şyŸIúzĜFğIĜQçYd( I 8Ë €`q]ž2i(ÁÜıÔÛòÇÌ7ìÊ@µI˜ÄC`ç&Ċ iܰ˘€?Ì]€ĊġlêNhQ¤Ĵw 6'3ZH~F'v9ûà;î˙g* Hış/3â#BH8y” ΀^,°1$¸?ĥFbŜHBB)xÊÀSy>$aĉĦ­?OËŞÀTò/AŻ)e`¸†üaQg›ôĦÁÌ h?,Ħ€_·Ĵµ1rš(ħ& €‚§  Ż@j(×J›n‡ÏÊcÁĤÙ> ž+?×kQ €Œ ¤Ĝ 6G÷GÀÎĜF@4(”Ü|R NóP‚UĦYş_Ğ@ûïdŒ§£Î @h(rKèà=p7'ü¸4”?Ĥ>yL20O$ᢴ#-à5M5ÈVġèÀ@’à•ŝ.%’`¨µ%Öiíß ›eÑi ôcàŝHàÖ>ÁöĜ‹€8Éäï’ĊĈ>‹‡ô§œL€¸”İQż?…lL˜Ĥ0HiRbKY˙‘ ;FPÑÀPċ˜Ċ‰¤HÓ×'v ”'Hż)àë|öÙXa­& [fĝŝ³ƒ ê=›NL èĊÀnĵÓî €nD0JĈ)‘cÀÍï福jÉ>M™M{ŜYÖ_@ú<8nfÁÀÉҀé@[€÷‚ k_+*żjĤM™éèè~žúCuúÏĵîÓùŠ_N£ÔŸÈƒ„ wÛcyy˜Ù5&)$QLnoŠßŸRġb^a’ŭĠDpéeGï)Ì˙,Ğ|ÔÛúqĜ{éŒúúÓ&óíÏÈq‚nÜğcIaJ)˙żĈ€(›Ü$%™Pe'sX>Iħ)7`~byèÀ˙p€§òĝ^PöĜĊ ‡ôÏÏ+WĞR{:êÏ19;PˆÙûžëϐr‚UġB IDAT K ż1$@ ¸ y)´3{z²Ü#ÈëUµóŝUÊaV0p>#ò•˙>\ÀÓ"·?ÚâQñ2o2úÈ(s}iÒBÛJá8–щFƒ"˜IœÖÈ üq&­ŭnìGĝĊ@RÚóŠ–aÛz …JÓ~?3&d*]`*…â|ÑĠĦüa$ƒ³LEÙà@S@–À·­?ġdZ°s)'Ĵ£”€§ûL•SËÊĥİ稀x/@ƒDFïwC`7ı‚ÑӎçŜ‘Ș Pì\”T÷·Èë>8/y*kìÚ}Ÿ^:›$SÀ™Aċ’qGï§·,ŝ2ĥ_ÄÖu ÁTGïIndO!x+O_ÄĊO-cġ İŞÛçUŝâ!,Ž_ÙÚû`ŬĈ÷ĝ²P‡`k,s÷£À?ÎëqRÀħLŸN .Ç­?ßC÷ö° Qßj@Ç£<BĤş2à‡n~„ÌĠ.Ğ£…"_Dò =‡Zûo#‹? êyÔĴÔĞò%{"S2aÁ3Ĵó½ü4˙~kL°5ş‘@ÌËîÍIĵ–½—2ŝ0 @û¸q{ĈĜq ï~ï‹ ĜşÔÛ´òş,…Ì˙ ‹€´ŽN‡ İ0„ĴÚ겏rú T€Òċĉ ˜ûĜċ5ŭGT•ħC3œÎ‰·v ³ŝŭ %)y§Ç…ĤĊoÊBêésfYê= L‘zŒVÙx Q? PdWŸ‹nĦž’|ÖŬy7Î8Ĵ5Ğ ĝÍ;ŭ罔ùĉûˆ3`'$¸7”À×4è‘G<´Â ›¨Í8Œô73@ÓHRŬÜÓUàĥ-ĵy~i€ë|_WCg0UWĞ*ĥ¨×VÌ_Z*ĵcF˙' äÀÇÍ Ċ;zhÇ}-ġ à?h‹oEÓÁ?FŽĝıçÉâh ϕd™oO]Ö5˙@y@fĊ$A¸yïû²}ĥ“šÒ  Ŝ„ĉa^fD ġĜµlóXvòŜZŭŞ=ï '-ŝ{=‰Oı8aİĦŬ9j^H‚à ÌħR#Kâ—'•Ï3%g×êSGZŽĝIöN´yüĝiŝ~ŜK_‘˜ö>u o{,­.ĉqVß-GHvnëA„‹ĉé´7ÄÈ@À ”ûşv˙îàvO5ì<$>˜ŽŜ‹o´ 8*Ú,NàÄġHGj²èF·{ÀĉXLU4óLzŒ #€‡^È ;ô™N&À|: Шß§/‹gÇ/ĉÙj‹VìÒëÁÀ£°RvJúÛ`bäà˜@ ¸Ġ#¸;’_o9~ÜTĉ4פê~GŽÜŞXٌN6Va‰MU€U@ ŝaJĉ^!ùëĴ Gí)À"ûĥ÷„Ì.£ŝżı s§ş#€ ĞçQrbc¸M:ïĞş} X3Pƒ4ĝwC‚]YÊëYC:ĞvĠ­Ŝ°ƒXïU¨Ş€oï: 2ğO<×Q*9Ÿü?³ ÔU>Â`Z‚ÚݞO[ú‰ñ×ĵ!Óŭŭû#‚·{rìv@'Á. ™È àO}ĠJ›×SëN |MvñD•Ş#€³Ş*Žş´   {t÷^˜–Á_¨ R™jÔAÁyıM‹޲%Q×Ċ„Â9I—>ƒ.Îàà½ìÉVÌTí4uĜ—¨ô÷oí;Êߗğ .K•şĴ`˘œr4OìB[{9KIİ(O”ċ‡ô„Œ4³c(ÇVœ— [ŽNÂbĉùz-‘[~üĤĠ7ÁïÑ"–@È$àgmJbŻ8+“á…:HsÉ_¸ )—ïלŞ|Ë]pËÀ³ 'ħá BL;y‹í²& AŸôşŻÜêɍ5=Cò{””&û0cĵ³šŒXÄĵ1tF%ÍÏ A./'\[é²{g˘4J\ï÷Ç1ߌżÊĴ‚àÈ;žµv–ŜÀ-‚ĴB pĝĴè%˜gèİiqıĥì”äî@äK'›2µıv L— ͌Ż}Ž^„„“R@‘ëmÂëm żî# ò=Êïèjœ P€Òf”‡‘˙rp%…ßD‰’ŻžŸsŞÊÏ ĉQàŜ¸ı/e Oä’ŜżIúKd ŜnˆRÀŜsï =•†B’AĈ†'É ħ‡zß=ŠB ¤\ş01/2 ’`LRâBä.CN–B‚ƒ %q‚&@+u”Ŝ÷AÌt25)‹ËÛğċàD€àò$ä)êL‚QçÍ=JĤÊmJ€wÀÍ} Éš~Qá0‚€Êç2-ĵìĞĝ€Ż F ÜŜšÌ›Sk?ŜcÊ%¤DÍ&ċ}Ê%!E™ĴSİCÙ_á€Ğ]éĵ“óB-ÍH'0ĠwÖ˙Ñ&€Y ~(‰˜Ğzĵ–ˆ(Ĵ!%ÀÖĝў´˘5Ï´úÒç×à7%!Ï 0Z_?FÏ#ÔĈ‡q¨ĦŞı" v—q _ÈXÇ•"0^#ÊäɔÎĦşò–ġŸ ^eġGâ<-6uÒßÀ “ ݲfÍĵ^~>½x³ S`ÁjL€Â·!ñ•Áĥ+›_èM€uӄ€~Ïڏ×?1Şġpé$3œú„ 0+¨I *CˆĥĝÇNÜÎSw:€)+ĞóöÇ´fÙll[û@/ÚAy×SçV“à7Ó#%à3M0?mà‰ö£Â șÀUËtÀ”bİÈïshà—]„€›ŸLs‡r·ƒgÊoßZÛ*ÂĵîöxD ࠓJ#v dP4ùĜ ü¨K°KA9M§-ıĥŝŒà7%żgĠ´°ö&è=ĝ³:™(é­ıı\­b-"£!€Pĕ ùWۜ–\ ĥ˘"SrRQzžjÂtÜr àA­TTŸĜ>şĈžœĠßËêÀ3˘ŝž’ŝžáĝL‚_Ğ‚€‘ü4saÉ˙ysf•Ÿ ìË)bPnAÑ!(”żOJ–œċî™è&Ĵj!–E?âäŠtĤ=‡ó˙Ìòƒkú˙€xe[vġé¨<ħg)ċµġŻ)ià÷™ŝ àœˆYèïJ7 e˜ÌÏÓÂ%äNšžï™ĞˌÊË|)/JŠı“ĉòż´³¤;9Fɖ-û],ÀÀ4@ÈTĠ‘Ĵ„_ ô(A*€—·€Û}@k)jĵ=#­çQ”NDżŸg hµĊ7c ä˜,öĠóÇYy(O’‘V?Î4 Ș€'§ K™‹„(+­żà@ÉàéáİYËŝŞ2`WüˆÇŒàĜŬ€Yœ!ŬAĜ‹‡1šQZŜĜ“Gœ,\H°˜0v}#fÑ€ÂE63`h>žċBb.ÈjĵL”ßWÀÌÈúÈĵ,ñ)‘D%(ÉU€O%Yè¸B•ZJU*ħ(ډ'ƒvр#S\5 Ì,@ĠáÜGU'áħĉÜ!Gż‹$Œ†à˘‘ËüğàM Ž€ù·à'h0iaµ*¨R üvSOE‰ú¸P˙£Rr™Q ìĞNÁ€ïSFí w@cċÊL{ n[›˜³´l½yJ”—q<` <ÂPQ R.E=¤DÌRŽ4 dˆHD\ìE/m Ä£à7óM<Z4Ŭd˜>y×Ĵ緋ƒfß§ĉ˙•Ÿw–(ütfNJ;£2K§;ŝ|V¸ëú½˜dZE´Â(üÉ˙fYİ×ÙêIŒğ†ÛğÈâAöqp°Ïpà\€İ.€Ü”€P ³ÒŻş 9˘ŜĈŬñIv½¸ìïî^×ĥg˘ˆŠ'ĵÙSu(‘Aë´ĵá‡N jŸŸZ3|*JsÌû=BÀ-ĵĜİ=]ġgòı2Q.`¤¨˙çÈTƒÓ˘ Èìc¨"=Hd‚tĞ~£dc´ğ4j4Žò‡Y\×ĊĈ\³Qúk\–½óW:xXġ?Ÿ°‚…,@aƒ_g {& L Ž4c´› ìa{ ô‚[[CéÓ*ϐ†ÔB^y‡êi8ĥġ×d`úü&ĝ'û$s2¨ĝu5!U2>ċ…5×Á=ó9µ$d:é4 &5-ġĞÒP%éŻÔ“ÁżÑîŬÛ†ĈY…Ğż!°zeÀyÓÏ4%ÇS,Ĉoˆ#ıŽÎ–í‡àYœ! 鯗›[<  Öš+>jí& TtŸNµ<Ína°ù:ÂŜ…w·÷ ˆòDÎÒÜ÷ä”ÀPÑ8“3¸0óíĊpPjÍĝ³Ż›·Ù—=k`è4€ İ5ĝ³4”àÎ Ġ‘TyEFQ‘ôé 8Óé@"™„§ċàŸöĠÓ{˘ĥŝİ:xe\qqÂĞ/‚Ë`Á¤š0{<²8FÔہ|ûâQż6*?ĝ‚,Ày‚,HFr3M#²ŭÔozëçà7; ôÔRĤĊÈ0ĜÜĈÎÍ1Úíb¸-Áož\‘ϐp‚0È’ĵAä áH™9bLżoé7%· ~³ÀÈnž BJÙٗ &\ Bfú˜{&>g˜niŭuŽ^p`´ ôîö ĥPC˜$ rÎdA/ó @LëMF’0A*\ ñ(£SvŜFî#aÍ0š ü&Po͕óhtSߏ§ŝ²  Ŭ€Ñî} 6CÄ£r‰§òÏâ1ÂT â@”£„ L‹à`Ua’.ó5á§j"PU<`ĉ@&f ĜêÂŜĜÄV:‘r‘ğ<šâ̲ŝ<-—ëêËŭ›×n"ê]SÀO  l£ €zğ… Ġ U… :Œ¤a8…œxˆW„ÑîÈâwö€¨W:‰<ßjm€uĝġ6€š"O@ás' Çpûl߸Žŭ;b˘ù„§yQ Ï2D‘@Èd•à8S¤ e…Żg…2 `·}˙ ż ô |6c·b“Ĵ!?—vgäg!g@¤H/6}˙,.@İêIĠğ;B÷ö€ĴŽĴVüе;ht>Š y„ÀĦ €ĵ= 34´…OÄ<Ğĝ!ċI“†ûˆûˆzÀ¸Ğ˘ĊF  ŜĦÖnh@­ïĞ ¨w÷_{ ƒÍmDƒâd3e­"ƒT}”H g@˜ŒQ*ÁĤċ@ { l•`[êYê Ê•0˙Vm/Ĥ_‡X ç†3QòóÇ)0ˆĈÁ F‰R:)0N xšÈï&'-?ìŜĥoÜF÷Î5HßtŠ·ĠߨµVáĠŻ ÖÁĞĞï˘(díî l¨çÉĤf€h0Ĉ`ó.Ҟ\œĉV8xè>ëh÷˘Áëwwħ“R k! R4Vd Ŝ^7€ÀS²ÓT\]˙îżö}l^‹‘ħ€œbYà’Ċà™ Ž(ƒ²”ƒX^×A4HE# Êŭú싚1ÀŒ›p`F)Á8•ä5J¤ġ*rK²‚ÜrU”Z‘Îeüeû°uŭĜñ2dú/T‡İÊŝúâz€ö…Áo~~=·”Œŝ˙¸Û7Ċ~ÎGN<* 3ÉèFğ?D<¸‡qñŝV>QWËë VÚë@km͕˚9ĝeY<ĞTÀ>6Żŭön˙ 6^ĵşBŽ%sy ¤!âTNîETĥ ÷b‚n(Ôe`Œ`” $*zžñ"—§éĤ|ʐ ̧ìŬ~ÍZ…Ìè](,záĈ ‚~,ßï~$°ôb`+w èÇH# éo)•ı˙ğ/qìÜ|QïĥŭXÌ4 éÚyġš+ µÖÓZ@<*é׈G@Ĝ l*›Áıˆ+ġú{} ·ávŜžŞ{á}´Ö€…ĠóXyú³ Ŝ9E"oŠ@ğû*vo~ ŻìaÜUғ–O[?‹ú‘@?‘$vÇB]–$Ĥ’F‰`”íµ™‘2”•DPU_ġûµŻeĊġ0“²~˜ìGÒò÷cİdz1äċA,0LTÔ_ûŭĉwĦt,6Żïôl^{ÀŝH)€Ä ™÷×*Ĵ}áƒXX½„ĉJıŬ×.ŭïr 6ßĈ`ó5ġ<ú9ÓR@+ĵGdħ‡ŝĈ Ö҅<”yXX½„ZëSh l?…€·'Ĝç  wí$è½û#Ä{Ĉ‰˜ ÖJ„zn ¨ˆġB MÔZŸBçIÉ;\ı˜ş!…g*§' AˆÒ(z^€ŞlU×ä´ €€•D³‘•Jyž~rëoRQ$”˙[‚S5Ş[1'…KÂ%Èuo?&è)KĊ"°IBD ĠAšfÒş§1À“2ĝuŠn¸%êïoàŬï£íöôÔ14{Ó˙§ˆO~ú×pî™_@çâÂDPèoĸ˙êĞl žŻ§² Qéıħ{$>eR†x¸ƒözÌ˙,œ ²ĉVÚÍÜ ¨1  I=ŭ ‚ŝĈ·Ġ‰˘G1âWÏm– 3¤á„ôŒŻ˘óä¨/ıƒFj€Z”„‚#…|ó]"7ĉ „€hh ò"ì%Ÿ’‹˘L˜ƒä2ÇLl~ĉĦ~•0,} B•Œ2iñ‡‰ü;ˆşA/ö#-ûŭHŽ;ëĊÀ~,0J-k˟ĊŠĠ°$Ŝ~!ĈġŻ|ğ7_°  ĞŝŽaĤeÔ_~êö…u<ñÉ_òSÏcáœt3lό2™ZÜğu›×¨˙Ĥ"•žRQî Ĉİ|Ì8•‡NCŽĠßA ôcˆ l‡;!°9Ĝ öBiġ÷Up7"Ç\Zâx¤Š}"ˆË€,‘5X·Ŝ¸ö‡oö_ü.Òĥ§ßżiŭċïĜZ[ÁĊOŭ#œ{ú3htĵĵşÂèÒíĜ}kŒûŻ}í—İì+ù_VñŽŜ8@ñ™³8D}İżŝyÔÛM4–ħ°ĜÉ÷şóP‚~-†¨·ˆq÷Ä]uRfÊqÄnİEG2~É Ô/aá\ŻnĝĤĈv9<-Fc ĉr[. ĉ˘Ğ.RD ӄ‘*ğ ĠġX‘AĴëĠsDÙäĦĤrŸ]¸3H$ ¤…½Ĝ ½PÎ;Ĝ ŬHĈúÊ-HËêgÊïÏÁϋ€Äĉ5àͯߍŻŝ>˘ŝĞ ô]ƒĈ†ÛĊßQÖdĴ>ós¸‰/`é‰ókĝ…AĴÌF;ÀöW°ñê7‘Ew÷ÖßÀ#äQk-Ħĥĝ)x5ˆ• é{0¤‹Èú[iÜÄ`s£›\·§&9 HË+•$Ċ1úßOÎx‹k>ĵš²úŞ?VGïòÔU&]Á †LÉŭ(ݧ—nA˜Œ¨”œ´ô —u#UyĤòŝĦµ}HƒTíbۋ”u6GÀn(°Ê Ċ^D°=Vr?êıDI'cùW—ûòĴ˜ù/Ô¤ÑÍkÀŻŜĈ›_ûcŒvÀĜ5äù°Òú˽‡Îeœ{ĉ·ħöÜÇÑè0ùÜj™ÈJñì½-°uŭ[Ĝğġ{†şjŽ?Šŝ˙£HÈÁŸ†eÌ˙ÔZµ¤Š…Vž1? À€,]ЍáŝĞŞ•46‚@­Ċ­tcqY›Y€,ŠÎEI<)ÇÀ İ BpĜ! ˆ3‚‘’첚P ̈,ÂI  A/&%²§ŸÈc‹úĜOˆĵ`k,‰`{,°­¤ŝvH°3–ż½PÈt_ ¤I,AŸŒ•äW‡ÈT§_VĦÀÖÀtoż%ô7^0$yאĉ!ÊE:Ċï×èè<ùKxücż‚ΓmPV.ıÖ֟2 Üîżŝ#löM$£·{Vp‘?ŞÖ˙Ñ"€x`ş‚g 4óžD­ŭ,ĵ;Àb`LÇe@ĉ7ö ÒqQßh÷MdñŠür.|Ô2dqƒÍ·À“aïCX~²ž÷­ç'Ż(b4*e–qŽˆ3Œ2ŠÌ°ŝôeҊ÷TŻ tşyގL{Ħ ĉ…à·ĈĜÛcù˜íħ”ú=#âßOÒ86,~T?Êß,ÊÙzxínáïü[ôï}OQƒżgĝċ Ş‹sVŻĴ£sñwpá€W§ù÷$ŒïMA÷ĥÀÖßÄŜÛ?€à[ ġè˙£GUJ ‹9‚ŽZë?ó›Y½ƒzЃ†/£î@Ó'èúŭû@PĠy{ÊWß '­rĜ›c‚Ŭ1ÁĉHúĝ{°ÊH7Ž4R GÊϏä‘FÒχñŝµĠO†ÀÛ/$xŭáŬ˙/ ·ß0˘ŭ]+(gĥŝ"Oûġ7Ö?zíġ˙>ŝsX8ïçżüÛΠ‰‡À½—ïbûú×ġoŻgÓGÙú?zPTy‘ÂúŠ>˜ġöÓ Ì.>ş §â,Ö=ôbÄQÉĝ˘ŜğĈ‰Şƒ‚ÓH@¨tŒáö;H†·°˙-Ĵ ÑaĊ^xfKŸÜvSQ,3޵x”1U #Tǝ´ĝ”(kĵŞ>4AìÇì½HV öUŻȃĊc òx¨Êy àgI9ǓÂ×'ĜżÜüFŻ˙ÁŸâŜË˙’Ñğ÷*"òEĊŸIĜ‹ëmœżòSXüO°ö\„’‰´ŞŽÀΛÀĉµ/cïí—ħÉ¢´\tHıEÔ>Ĥ`ŝ&üúOzmMÖZĴ µqcɨdñ*²ˆ`¸½,ŜRg`á HŻ19ÉV£;l~ ŭûËHĈOÀŻĠè¨Òád2(˜×´Ğ—ÉtK­ÌŻ‹4Bš*BH€aJe= ô Y7Ld o?’˙(‘Ñû}E3y)IDATŽ8ŠÀÓ"Ë"š4’VżÔԔ”ÓmıŻbß;ßá¸ŝċ[¸ñĠ/c÷­/Caġ÷,Ù—,ż=”uíıC{ŭÁ…O|L~·˘,÷M%öîŭĥŜĝc$;–ġ7U”ċ˙£éHĞ‚r@0ùkëWQaĦĠÊĞ섖ë;Ŝ0Ŝ’ámġE&­ïµ?ڍ˙ïÏpçĊßÇxWûû]Öx ğÖżÈŞô78ûUĴ^ùG8˙ì‚ΓĊkĉïĊÜÒ8îż6ÄĈ+_D Ȃi…E´ġt ÀVYœ¸‡ÚâAdO Hoá2Vš/Êô—쉐%>²ĝ<²(Tŝlܵ W ŠTn[$ğ×1Ĝ|½{=ôî.ƒ4–dƒLÉÊQn]JĞ­pu/$ $E`NçċÓÈèÌ3‚wY¤ĥâ2v¤†Ä/ĠÙgċ÷çto7ż‘àµ?ĝ.në÷°wëÏÁ“w-k0ŽĴT_~éŞi?ŽġŝVžúŻñĜ‡=İ€b#F˘û,Tıu˙^Œwż˙"vnü{mY˙ì²âG|ħGö“—óöQż ĉ×à7žO; íu4ƒ˘ÛÎ#@Vk#J2 -‚U„ûD½·tĵ??™k-2…`¸ òìM.†[Żc´óCì½=À`ó dq~ÀŻMDiA fOAŒˆ¸żyäà&ïӄ‘W+ȒÌW~>ġ¤ĊÏb`÷pûÛŜĝòkxëÏ~[ׂdü6ŠÊ>Óê›@,GûMN?ŭ÷ħòÔo`íÙ%°@ı=ĵì"éïb´#p˙µwq˙Ġ§b ]=Ĝ…?ĵġ´  ÜÉ'K„G;wèĴ‚zWQ{KXê,ËÀ<äĜĴ0Âí·ċ‰è7΁àIDƒûˆú÷`™4•@u\@gR@$ˆ;èßûú/Ħ{ğŭ; ˆz-0ÁĞÉzĉ=n,ÂċëóvœĦ”ZEqžğ?ŜĥŻ7żÑǛ_{oż%lŝ„Ŭëèö0YàcûŞÀ/­˙Óċ XŭàƒĠ>…ú’T("›Ìš"cğ·vq÷‚ŝĈ‹V–ÁÌ0<’]ŽJ ʂüiÔEmq "ğ ž‘nŭ"VÛr¸!À½>î|OşıÔZË ä*ÒĝÂî}”§ÍÊׁÁI0Ğŭàñp ƒÍWÑż÷ì½} Û7RôîĠ‘Œ[İ$.í"”äyV-Ġs@gӏ|4—(ûö@яrfߝ9ŜüÚMĵùġoâ΋_ÂöŻaĵw "ÛµR{ûF o„rOá¸àd[5ÇċÏŭ=ĴäżÇù~Íċ˘şP+­r¤ '‰Ŝ}éEl½ñeĊ{ñÄyÚÏYG– @~òĊM’ÀŻ?!. bŻġAœkRptïż#}Ŭd,;ڂ&A½ŬA2ú ²ĝ˘^ϐµ…"¨µ$ĝËĊB°âĈ¤" ÷0Ú}ŭѽŭ]l_˙vŜŒ}§Áŭ:²XneĉĠJÙĈ\çÍF˘ú˜ˆ/G@úÔ-ÍkÀ;߉ñÖ7ŜÁġ?ŝ:Ŝùö—q˙µ?Fïî÷‘ŒnC=tŬ)À7ÇzIkR,ƒŸàÂ'€ġüÎY4—e|˘j“ŭ9ú÷2ÜíUÜŭËÈâwQ..²Ó~ÎúËs_AÉ'OPlßĝSxġëëqĞĜûĜçÑ9MĜœüK=`a•áİŸ¸ êŭ3Pïw°wëğeeaş×I~.cŠK(50B÷1ÜŜÄpûul]˙2ĵú V?€…ĠOĦıò ,Ĵ µĈè4ÑZó4İôѽB²(UÚ{çé1Ŭñ ÁŝŬƒÍ£ŬŬ·ß|í·şĵŻÀİcĴŜ§ŝÁ=3µ'TÚ­<ĠŞaíıŸÇꕁµçžÈ‡|ĉïĠż#>ÚönßĈÖġo"\GÑëß·À_Vnċ'¨[ò$ÔcżċèŻ ġ$֞ûOħrù7qŝêžú Kσ˙èkrx%Ħrï?@^Ĥž$‡;ß}[×˙%ĥ˙{;–äV¨<‚Ê| Ċ0R=ŽĴ ŝšG͕'Pï<ż~~³ƒ éo2xAM (eh´@(E4‘Ċ!Š4N†’E<Š‘†w0Ú}î}Ôl|J bŠ ‚Ò—cH-Òòŝ\K—ÑıĝË8wċ_`íı%ÍÉÁĦfz@Ĝîżĥğ/ŬÛßP$´ĞŽîDÚÏ&·X $(†¨µ/üĠ/`ġÊŻcíıÎ= 6elɲz…… {ÀŬ—ŜĊÖġ˙Û7~_ġıÛÓmĞhù}”G’“‰ċûóó÷YqèÍL| „úZPê! Ċ#ġܙTs\ĥ ŝĜˆÜۗSħ|"Rŭ9‹h˙ꕧ°tñ×Ñıôßáñ²|˘²Ĉ­½ˆ"şñÊ.î½òoħwëçß­ü•3 nı@E,À´Hj?Áh„q÷-PĉƒzŸDÒRJLá3ƒnÁ°p żöqxÁ*’ñ’ÑîÄsËĦ’Ü.âÂfjħ!ÜU(ށ²~â²è#‹ĥ†÷!²=K*P4ʘyìĈóa„˘g?û"÷óMà—żgеçžÇòċ޵g=GAH16(J˘Íb£4îżaëßΛßAQìc–Oúŭ.ç`Ž€ ()$žÄ{×ħŻ~µ_VĵA(³Md€WΛςzÏ ‹{ˆzwPl2**3úÌp+¨˜ZÖٖċ&!˜D00ÀŜ7Àß³›ÇÈûĜŭħEJôô3Xù€ĵ7Ĵï6+IÇÀÖ!îżöElßxzŒ˜ ŝ"êïĴ#€ıI Š²8Ĉh÷PöXp ġEÌ·NNŞÔ€²XÌš+Íċ‹jŸ!‹HĈï ‹“İŻŻMċ÷dU–ĥÏN-_ĵŠL ›À[÷Uù÷)&wÔ)§óŞÜĞÂêËóíüĠgħüÔ˙ŒĠ+żÇ>t­µ˘úP‹$³žÁü}vnĈĜĝáżÁö?S-ĤċŻ"ê–#€#Äôâ*Z#!–@Ù%ĝµZù‡ŽLÛzrËñÖcm4W>ĉ Ì ì@d™á—c2²€¨šœâ¨h7ĥS‰ĉĈ‰uÄ3ûħiĜËĊ;&IU—$cÔÚu<ŝħ_ĈÊS˙+֞ûYĴ>ŬD,òú#ÚŻ]ĴpĜŜÇŬ—;7íëw1­ÑGon98Ĥ %ğCŒ÷^È( .Ğ/Èé>ÊZ™[ƒçVLh5ÀZğB?ży"ğ‡x0@yL&âU'° şIu`§y9TÜRö„ñIO#P×rżıÒÀڇžÇı§kÏŝWXû3X8WĝûvSOŝ}yûp Ĝq÷_û=ì½ġ ”Ğüìñበĝı,ÀIŞbDÓeʍáüĠ_DçÒŻâÜÓÑ\ħ\c%}PIY 6vnÜĊŝŬŭ;_Ä`ó-CjÏŜ³î°'ġQvş9Ŝk˜VŸàñûš+ż‰…Ġż†sOŻ£ı"‡ ”}֖êĤŞêoìÜü6Ż} ŭ(ßì*ÔqŠĜÇÀ{@ä~-Ĵ<ŭ9Ĵ\ŝ‡XıüY,OßŝĞŞğ ìßyŬ;ż‹ŝĈïc¸ŭŽÊ½ÛıôjK|zÜò°ĠF§†‹W°°úKhü*:—.baĠjjBôÂJÑg1°w;ĊöïcçĈW0î^S@·§•‡{:;x€$@ %PGsċ*Î]ùû8÷ôßBûBAsò˙͚“˜'‡k ·îí ô6ŝ_Œw˙aï›[(RYӈàèÊàxħó2Í òüĠóZŸ@£óóXXŭY,?ŽĊġb* oŝĠkÜönícûĈWħsóϐĊ(ĈykżjАż#€÷„<UyM°à1Ĵ^ùE,_ŝğX´ŽF‡ĉ=òÓԀŝK½ £]ŜŬ} 6ż‡Ñî—ö^Â`ó&âÁáĞLǑóÓŬ†ÉXĦ:—Úhtž…_˙ ꝟE{ŭ3h­µPï.½ewĠ&žşËq¸ l];7˙ŭW!ĝNĝÍêÊl"0é–#€÷€˜rêJ ,Ħséyt.ŝgXüh­5òhŭAD UódĠ[2›úw0î~aïğHF?ÄÖġk†ŻkĈ ÌtÜA{Ŭ‹Cœ¤â8u AëYxÁGPkġöçħ°z Ğ~³țféócġ„= wwŒíßĈö/!ŬCQ³`Zŭ!̉üŽŜ'ż—q:€€°` ĞWŝ6–/˙Ú뗰°Š|è§>áĞbfœ€zĊĈ™Éw9†ÛocÜŭ>˘Áۈ/"콂Áĉ²ĜÜ=g–2‡8Ê _Xm`au AëÇáF½ó1Ô۟D£óêm Ö.û÷vÙ |óv@ğ@ voŜÂŜíŻ£{û;(+ٍ=z¨‡+ïup*H@Çüœ€:×?‰Î_ÀâÚObéâ  lÙÂ[­fġÌżxÄ1îî!꽍xÔGŽ$|iĝ²x<#í`¸½§ŠŽl5P –ĉJ͕X°ê-€K‚gÀ‚çá7ƒ_ï ıòjm™ğgA1 ÌäÙ>½íû*‰`´ ìßŬÁîÍoĦ{çOî) ›À7£üċrc|G§%ÂX°Ž‹ŸA{ŭo˘}ásX\÷4 Ğ8K TŬF½<ÚÊĈ#Žd4R >1Ò0Ow‘wdŬ?ȐĊcp÷5¤`ŜX°ÁSPo^ŭqPú8ĵz^=€› š­ìúġM oßV³M½w)÷÷ѽó}ìßyí7Q.Cĥg LJ~~G§ŒtŞPkJ´à7҅O£µö7—ħ¸.÷ –;P°ĥ20ï³Ç{qQKÀSÁ D²€İ÷+@)ġXP­BŞĴĵÄĞŠîë˜ËĝĈ¸ ô7bìßŭ to í›j˜ÈȰüşoAGĝíñaüŽN½K`A#w ĵú*Ú>… ­µ µVƒß”D`ƒ|ÖġywĜ5 ܳä|Ġ²´h‘Nc ê 6‡Ĝğŭôîŝ9†Û·QDóÍCŬÈc§÷\ ÏÀ™!S ”+‹£…ċË?ŽÖÚ_ÇÂêǰ°ş‚z; $pl÷à 8*àC^[zŬżŸ†À¸£żħ…Áĉħ{ëëˆ[ ÜC”;G†ŸoËŭÙÍFn98ĊD ĉĦӆ '°°ú,Zk ĞŸĈÂê%ÔÛm-/ßŬ„*Wà ˜—Ÿ˙v;˜gÎéKC ÄïvÑßĵƒáö+èoüÉhEG˘ x{Ĥ€ı/ w wpÖI@ğĤ"Pï%Uġ–ÑZ{͕OĦıòiÔÛ+XX]…W÷‹ -Àf/zL7À;Ÿcz–O bŒvwv·0Üŝ!›×ö6Ôü@=7Pf ²NéNî;xT3bšÊ.ġÚhtžÀâúgá7ŸEseÎüúĵş* ĉ{}MvÀ1K˙Yô&"Iă>ĈŬû{ğˆz×ÑÛxQoċ9Óf ˜­Çv÷Ħ#€‡š¨ L÷ 0È@C€FçV?Żŝĵú2Ë¨µžA£ç„`×hĞ/›êaš’°|:›„Àxw„°÷ĈŬûH]$á;lŜDî)ë­KsCL µ‡ŠĜU|.şïà‘S¤"NàÁJZËJĦÑı€ÖÚó›Qo?‡‹Ñ\İMĝĉvşpšôç˙{g³ÛĥEáĦ¤(ĥœĤi‘8H_ }–.şÊşËTŸ˘Ğú Y(`dQtQ$q¸ĥ"™9Ó9âpD*‚£?;ß·‘d™!áž9w~î͗wìIÒô2×ùÙ?Êč˙ÖĝŬk³‹(¨³(jDóh¤o;Ç FŭŭA_€]²Ü İ‚!İ‚§™–Ë‚×Â0½<ŻŽÇġ쇗:9ŭIÎ>] b/>ÀÛ7ôÄ×Ì'™ĤŝÔûר܏ß6yç=´ġıÚĞ Ŝ‘fö&>jgÖĝ3-sĦ(<d”.% W şF÷ò·.é-öìÏĞ€÷ƒÛöċ‡Á^¨ğŞ£=k8ßİ( ĉ bA(gM/“Íí˘SNœûwì]ÎúûËw×XÍÊÀĥs”g´GàΠtñAžPò*ÀgJŒkŒÚmîĊ ŝ›wñµĊb/żĞFù¸÷@Ĥĥğĝ°ÀĈÒoİÍâ½Ŝ ³\êóAmë…q·Ù˙0 °Kğ˙œšÇ<ŸzìP¤“Ó¸x5‚÷šÁO.mö F}Ûq”·ž›ç'jËO#°sê<Û[˙p9χĴœÓ?s‘·ċŝñg…mİ °)°ÍvÙmċÉğ&}žßVĴÓÑH€'œù×ûC1ˆ·Xğşn_xÈ8`PäÍz‚á€/'f[ÁŞÑżkU8À`1²çËî Ñ²Ĵ#}ˆ]|’Żîmš€˘ ÷šOmjû_ĝâ`>Zú°;O¸/ íšUż÷4Ç'p‡X.5nT—ğĴ·ç?c~­Š˜”p2[üf1ѰDXï“ûġۚt†°^ŝo–>·~mÂ)ÀÀFFŭÑÓTÇß•˜£²6žŞ˜ġġñ½$}Ġù;ĈMCÛŜw+ë$JÌ@½áHÎ>V:pêûJ̵ĉ7WÊĤŠëœœ&8ğŠ}èpŭĈéûżÓƒÑ/JÌϒŜ£n˘ÄçĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊF²éIDATxÚìŭg{\Iv&ŠÛeîL€ŜğòŜÛöênuˌÜL·ĈH3#™3_îóœûĉŝ€û î·{ž3:wÎèLˎ4­–ÔŬêîjS]–eI–cäöë~ˆˆ½c'2 ’Ğ@™ñĈğÖğŜĊˆ.\¸páÂĊ­îž.\¸páɅ .\¸p€ä… . ıpá… \¸pá…$.\¸páÂ’ .\¸p€ä… .\8@rá… \¸pá… H.\¸páÂ’ .\¸páɅ .\8@rá… . ıpá… H.\¸pá…$.\¸páɅ .\¸p€ä… . ıpá… \¸pá…$.\¸páÂ’ .\¸p€ä… .\8@rá… \¸pá… H.\¸páÂ’ .\¸páɅ .\8@rá… . ıpá… H.\¸pá…$.\¸páÂ’ .\¸p€ä… .\8@rá… \¸pá… H.\¸páÂ’ .\¸páɅ .\8@rá… . ıpá… H.\¸páÂĊäáßéOcìşżĊmôtÛ.ĥÒöĵö‘ÛvnÌَàDë<~·[\la[t߸½é–oĥ 6͍)·É\¸½µ1r{ĈÒMÙ,ÛeCÑŸgü÷n“ı¸{‹]Çb7qß5ĉöÌu.Œ;=9Ĥ†´Ŝ˘gİ› PtŸ§uŝ mà{şpħö]ÇçézöŒĞ!9†´‘M3Ɇa~›¸pĴ‡ÖI1˜› ıé1J.6q_ħ ˙~3÷ĠZ{f=pǞÈíH7sӌûóF7ÏÍN7Ĵ0£€f0µö[ßú–Ût.FĈŸŭٟm\Ö{?îs7š!Ñ:{`#û́ԸÎì&Ü 6ÉZŸ[ocmc˘ ~ M~­Ï½5:Pr1!ŬŠ=µ ¸–ŭ2üoÖú­Ï𔝤Q€t­‡­ħ™&ıċŬèXosÛX´89PrħY`4j?md/ħMŜO½°­·°Ŝq€Ô„KÙM~³Ş~ǜˆĜôô4çœó0 =ĈgŒqh÷ "b£ŜK)ëc>×Ú #>7!°ÒZŸœ“ŭ9ĈI)IAD$˲B9 DžçrèFI¤$Ür1)­yı‹˘ˆ‡aÈ;Ž§÷—R² ĝZûiÒ=µŜ^1ûĊŜ+ö×qΉˆ$™çı”RÊ4MEQ2I‰µÓtnŻ8†´!†´îĤÙıs§·sçNŻÛíF½^/<Ż99ç>qŜ8@²7ǨÏmÒïD>6&ġ •˘ŞŞ*OÓ4KÓ´ZYY)-`˘unäX’‹ ‚Ѹ,‹˘ˆOOOûq½^/ 0ò}?àœŒ1__úÖÜOÙS£öÊ8 Òo€ "!,”EšĤyšĤĊòòrıĵĵ,,PZwŻ4[хcHgH ëvğ^·ÛĤĤĤşaN…a8Í9ï3ĈşŒħ€ˆ|³éˆˆ mv#ÁhÔf³6VkƒQ —R&UU­DQ´†á2c,“RyžWúßÈ1l‰FŬüŝìÏŝ̉\\ġûŭ`×]QŻ×ëuğŬİ úžçġ9ç}Ù³.Ġ×½—ìËÚ>ħ?Ï“DTÈôYö}É÷ŭ!---Iǎ mÖĈÁŒX†^·Û 0œêt:{‚ 8Ä9ßËÛÉëˆôbĉc6ˤM€×c{#ô#"*ˆ(•R.UU5çûŝ c,”R.VU…$I¨( •†\OQÔÚpßùÎwÜŞş33“ì%†ĈĜ™›żët:ŝŽ;˘~ż?Çñî(ŠöûżÏ÷ŭŬúœóŽ}Ùµw6 J#Òw#“Ĥ1 Ѳ”ò ç|†1Ĉ¤”" C†a•Ĥ)­³09@ş&`fHRrĈ‚ ò}êñ˙ôżŭÎ}÷ÜŭUY}ŞŞ. È­­É -b·´ĝB#²2ÄX™O_~ġµ×’ĝë樂T–e•$‰,Š‚,–„ @İ>˜\.ÂeÖ#›ñ xÇÑÔÔÔT·ÛŬÛétŽ„axÏ×˙˙óÛ~Ü? ‰¤×ääÀ`­dĈ²7—¤Ħż7ȘĠ@6´MqR’Jx0V0ĉe—RĴĵt>ğÒûá˙ç˙͋Ù, Ô÷}ní•Q-. mچb†ù8ç^yyüò7Ÿ <ÏÛé1€B0 8à`ÄÀ™ŜcîNfżŭ9ÎNgĴÙĊÌÚO¤Ĉ) ™Íš żPÖ; I}X0 @ÂĠǏtúŭ²ŞŞ*Ž"ŽjeeE”eiXÒ$ ä6žcGk]ìVŜëġ‚ééén·ÛŬÙét†ax˙£żö{żuâ…/=i é}DD`Lí%³‰` RJpÎÁAàÖR”c¨„ >À8@B/W \¤÷Am)A„BŠŠ°RI,çWÒ ?~ċeôŜû‡żŬY’1OJi҉ ‘ÜÒ NßĠÀTUʲ„”’Uïĵpêg/½Ċî}İğ÷îÁqA@bnoBÁ9ËĠß5ëÓ0€oÀ ¤ßCƒš Ôԅ H™P‘D†BJžѓƒ‡víè\xáĞż˙äïV˘(TU•ôûŭ|eeE^½zµ°ÀHND *ßîX’KĠ ƒÏÇĵÛíúÓÓÓQ·ÛpŸïû'âğ}ĝżóüb&qĉjİ‘!I`ˆCÈĈp•úĈÓ,‰AĦ„R rAH+ Ò d*¤B6C)$4&Œˆ *ġ—%Nŭì{(^ú‹•'ö?݈ÔYPU²( l9€²Â 蛜)1,Ïs–ç9UU%……”2óżżLB”$¨$A¤˘û"‰šŝŻz“ġׅt Ŝş èÖ3t˜~†1gè2ġè1 o½M0̀.>$ó0H$ôçKÂúĵ/~óĥïï pO·ÛžššŠ:Žon²#n¸7£ĉbûgF‚ÀëġzĦ1ì ‚àpw?óí?ŝĈt*ĝàj. LD!!ġ[Gv°‹3ìfÀNa'L{ÀĤˆ0Ċ€#ô8ƒÚ3=è}Ud) RQITı€,ŞĴ‚(dİ>GıeBŭÜReñzĠ"ÒÓ/ÁK"İŞŞ,Š˘ÌóÖzÜ>q€t] ´j£iŠ$IŞ˘(òŞŞ´tu6ĝñߝ\ p)5ċW/Aêĉ%¤úX’ú<ĦùXHĊ„côÇĵ~@ë›c `@Ā.:Œ!ĉ=Ĥ6ȁÔÍRJĊפPïiExúîŜĠçżú˘çywAp¨Óéìêİ}ß÷Ĉ€_kħM˜€èb[ĤêÖ#͎‚~żßívğ;£(Ú†áñƒ=ñìñ§^Ü÷áĠY!Ġ:­² ĝ‚°ƒ+šÒoħÇóԅ-CÈ90ĝŒ#‘Ŝ „’0ĞU)!K ‘KP%ċ˘”¨*B%Ôßy pî͗_ştewÈNUUµ\–e’eY•Ĥ)Y);Œı°90r€tMİşħ+Ë2Z^^.ƒA’eÙbQ³ŝŝîġ•••äbHhrĠo$UêtŽšì SsRİ:N5ŝè7j>Ĉj£-UÜBĤ¤~"WĴ?_³$úPI5Âaa×ç²GŜŭÀÓï p_·ÛŠ¸EÑ0Kâë܄×J縸ŭSuûgĝ£( şŬnĜëġúŬnwOGÂNçîg~˙?G‡!¸$µ7$„Ôë´>càà¤Ĝ„şJR #!QUêMJé›$‘Tu[?ŻžÇĊ×^ŞîÛŝĴ,ËKeYÎ ƒ•l0Ȳ,G]hŬúw€tŬ@4îkXY–µ•Ê PUµĥâ¨ÎÒ᠉Ġ:İfSĴ% L ë[£§˜3Ä|Äw•Jä܁=XyákúB³¤=:2̒F4R7.îĴ}´;â¸ïû^§Ó ÔÒêî ‚à ïûw=üÍŝĊݽûğïÎç Œ„b0Ó>CßçèúOĠŽĴT´uIĞ˙,+/!ÍO‚ĴÊha×bĦkMU9À[?ĝ.öÊċ³\T§‹˘¸0 –––’ĊĊE‘e­‘Êváé†m2äyNƒÁ X^^¤i:_Ċĵùò›Ù§ÏÏ$İŞ§ÊĦM²Ö›•Γho°‰ÁhĝÁk` C¨A)dé<ë %Ġ +f ‡žûB?{âsÏAp,Š˘ŭŬnwGÇŬn· §\Ö8|\êîÎKĠħIÀ0è÷ûQŻ×ÛEÑ Žî>rüᇿŝ['r‰•B@@Äú>CLj|†1xZh0œ)°Ċŝ¤ „¤*"”(ÚdíÚjFŒs¸Ï |†ĊŜÁà“+‡:ü§yžŸOÓôòòòòÊòòržĤݨÌEôú.żî¸… ĞŞŠVVVäòòr> –²,ğ’çùy˙Ï˙äġ÷s’%o·>Ĵ•Ŝ͛Ñ:PK…‡1`6îsfxŒéš”Ê>„ŒĦġjÉĞy¨_ŜŬƒĝâ7ïġĤvÜÁa͒úNgKşÑ†—.ĥ_ĤaœşŽùïuğŬ Ž~§ÓÙEÑĦ(Šîzú[˙ŝùnò— ˆ‚ +U÷ìù@È"O+PıĤ­bCT†CJ‚ ‰R*])€ĵ4i½Ħ€˜˘D’0cÈŻ\À;?ú.íà­˘(>˲ìÒÊÊÊâÊÊJ–$‰´Àh’™i. mŝB`yyıZ^^N’$™/ŠbĤ:÷ÉéâäËsçWR˘‰ÑN(a ¨ċܒĈ¤ü&œáÊ ĊZ$ajL!ÓŞSÖlÊLxĝá`ċ™/}.‚£Qèvğ;z½^·Óé”VŬzħÎ\(ǒnkv4)CŞSu½^oşÓéè=Ÿ˙ÚóGz|×İ…U!Uj „Ĝ:œ!âŠy\§ŬF­ġş³ÁúO*I(P B.$²J"²}‘³ÒtĤ§žzè%ÎżġsÄW/Îvİ|+Ïó‹I’ÌŻĴĴ –——‹,ËÄĤx½_H.&ż !(Ïs9 ʕ•••$Iäy~Ñ˙‹?ùċé•ĴDQ¨fp6ÙİÒuœŠ•~/ˆÚ tĊ™:D´èA3%Ĥ Âĉ–)›ŝP'@â×öóŭ‡ô}˙p§ÓÙÇñTŻ×‹8çFÈ×9„VŭÚ”n+0Â);û²Â0ô8Ž4;ÚEÑánŻïżġû.„‹ƒBDIè2ĠgpD>7Ž'hŬÎTêΆĦ†-R7µ ‰LHä%–R׏ôžÒİÍÀ˜RŸ2€|†ìâGĝôċŸ”Gğü—:U7ğ²²²´²²’§i*„“2 JnhêBJÓ´\YYIÓ4]Ȳl6_˜˙Düàœ}g)…B[‘ŒÇÚ$‹ P"Th> LüÔ:1TzÎg ˜BëÁ‘6’Ĝ='ĝÒ żúL†Ç˘(ÚÇñ^Ż×‹8Ô)kĠ‘Öğ1ş¸=.gkĠ‘Zâß÷=íâ÷z½]Q ‚àĝÓż˙G_šŜħ+<½)y7|"Ä>GèİuêqCĉ Ԁí@MíHJ E͊YAHJ•ŠVĥ%´Sgµó ,àí‡yú(ò³,ğ”$ÉÂÊÊJ: в,ċ:[΁¤ RĞ>§ç +++ƒ4MŻäy~˙ĝ?^ż´¸TeYoÉÚö#Òoúe ”4´C;'ìĵ7:ñ˘sĤŜ†áşÛÇq7Š˘cÌ2ádà·{Şn;â£RuQSSS=mžz Š˘cŝêonï᣽wĉ3ċĈ ¤eŜŠ1pĤ”pĤ9\ÖÀ¤eÜÚT¸4@$ıċ‚ZÄ ß`1,Ħ˙}­ÎcƒŜùáwħ#½r‘‹âL–e—ƒÁüŠÊ͗UUıT¤›J´ÎÂŞŸ”’ò<I’dI’,§iz9Ïó‹ŝŸ˙'ßJ*)ˢ7°ñ`d˘B“ş³Óx%¤ߌħ*ôÇ œ„-#׿ŽùêƒĦĥÒfᵪOJàóğbˆ/üÚ Ż?}O†‡:Îî^Ż×8 p=Ÿ;×ħ~û²£‰Suŭ~?Šx*޽ažŜğ˙ÁÇÛwÏ%WĦj­‚rÔ.ùvrP+$$İĴ„ê'„R4â…RH¤ŒR!1( ËT`V‹Ô'͘Ç!À|ɁK§ŜÀÊé×󃽚Ĥé…$I.ë}E!”£Ĥ)Ó: ä@ÊÒu³#ŒYlĞ>/”išƒÁ`$ÉB–e³ċı³fŻŝtöċFN´6AMI„‚TïD™’°ß›tžD½Q-~€ÉëÛäA#\גĴ(cJàÉ _{> £QˆxgÇq§Óñ­ÔŬ¤`äXÒöfGëÓŞT]ǽ8Žw†ax8Š˘Oŭŝ?Ħwj!ŻVI*›+5†½˜µ[·Ehޤ#)kPÊ*B^R!‘”jd„ÉDÛ†:ŬÇ$$1Ċœ—qĉ'ßÑHž*²ì³,ËfƒÁâÊÊJ’eYYU•“-ÁPZïbëÂÒÄ4›Ĉ°ĤU RJ)˲”išĉƒÁ`%˲+iš^bŭ½y6Í+Ż,šŬË,£T 5çY?ħ%nM İ´ĈM´ŜôíOêt„¤v/Smîj;A0<žNáµĵó¤J™Ü×ñ|áĜái–dše |*–ä@i[ħ£ġRuĞÌS£( :N·ßïïèt:û£(:rìİŸ>úÈs{N-(…D• HIè0‚%ñĉÖUkıÉ Ô RçrA(+U7ʄDVŞñIIfTğ PËü˜À8İÛˆKœ}ŭ%ôÏÏ÷YġvžçƒÁ••••ċ,Ë =l­s€6pž¸p€tÍLi=÷İAIEQ&I’ ƒĞY–Í‹ógéŝòì+ :aRhc$ÜÖ7.MúÔ9ŭg1Nr¤êÜ­V% ˙š[Súßä’ĜáClċÙ_yJ[ ìvğğz½ŜFN~{¤ê0ĉ²Ñ#ŬsNMMġğŬînŬstÏżûeDĝlPB”j¨$څATÚ`GĴçU’êT]%$*a€I"/ ™HJ‰A!QĠ݃ŒÖ’j›šRIrpi:´ċàmACÛ'π”D/dŸ,>³üġ´D8pL=÷➇Ÿ p§ÓÙÛëġvôz½ïû֗;ĝ푪[ĞçÈ6OġµyêŽ(Іaxìħßŝ—Ÿïí9}÷J jü Ô2oÓu³Şó˜Ô\c˙£î 5p/„´"d•RÔ%•D…vşÚÜÈT¸BIT[äçƒ%ĵûƒŭbċ•ùGiš^J’d1I’$MÓB!Gí÷ €Éì Ŭv„µ€ÈĵI)͒Ò4ËóüûĞ˙úÁÛiˆ²fŒM¸ZİİUöûa•ѐ Ħ͔êYLyôP7ÍݸéO*%áéğ‘|é7ò£Î‰0 uğŬ]ÚxĠ÷`H ÒF–í‡PUÀ ;:Ÿ˙Ĉqc÷ŭÖÌ$#żfƒ‹mǎFIŭyEażßïĈqĵ3Š˘Q}à+ß|îÀŬL½s%Cİ'À‚Ÿ“žÇXíB0ŞQ%Óm´Ĵ”]Q)2B†´šĠ}FCY€z3K‹=ù $ |üʰc0s9’Ċİ,Ë.i:Ÿ$ÉJžçı6Ğ›ˆÖbM˜ mJÊn@É5À‰4K*u-i }îfŠsg?Ê_ŝ§Ù3+)*İd ŒĈœÎ#E=d z“êüş9Ĝrpóħِ£DF+-ħİŜ$Kü`z8 “÷Ŭ÷€7xê Ïx·ÛŬÇq×ÉÀo+0Ċ†Öì9 ïġz‘V`èPoÇû˙g˙êı¤ÄT@–RH)B·ê™R!ƒZÛB3#ĠĞû¤6J­$ÒJIĵWyÓI[6N:M­jF>qŽ|ĉÌżŭ‹òP„7ŒA ’²B5UC[gÜEt-väêHˆ&ıùÈoġ˘­ŞŞÊ²,ĠMuWò<żÈŝĉOO~š•EËĉgTkRËDruS̀İ&ÁJO´EœäP·û° \êlĝĉáè/2uû;‚/üÚ~´eàSŬn·Ğ}îİYցҖKÓM:„ŻežÇñN§s0Š˘cOû^ˆ{ŭàŭĊUĥz´¸§SĊĈ4UZ °ĥ²¨!Ż€\dZP·(X-µ +¨½ÁôHrĉsˆ|ïŝoqÔ+>E~Ö2 2ċTÙ“Š;r€´iİşġÒwr P2İğŞ(Š"Mӝ“ž-–~JßûóO_›O´ĉ´Ùí>[£\ŭÍ-@1êğJ*y¸™§$m7‡!ÇpûÍx8ġÛÒôIa’*>‚‘ClċùŻ?Á1-p0ͲÁ¸“ß^İş‘ì(Š˘ ޏ×ëMu:ŭa=ü“O{úóûŜ[,°R¨qĴRȊàë~£ZĜ#›ĉm)†¤v²QĠU„ĴHuڎŒ¤Û0#Ë}•VYİFXxOŝ üü™ċiV½­ÙÑċ$IfY–UjêŜZÌhC’cÎ 6 ÖSĜdJš%ċišĥeàW.'I–­9Ĥ|T.pÜKH[u‡:•'[.úġĤżÎÈmëGĞb,ŭs= 8úÏ~eşxÉg˘(2‡én·Û‰˘(Ä:J,8ĝvIĠĤá‘äf^Çñî(Šuâĝî§ŭGì…²ÌR"0pÓë&µÓ· AÔ²*ġ\£ĵ”Ȥ²*l:#†C4DŒ$W Ċ•Oqá—˙$ïêyoeYv>Mә4MÓ4MʲÌuŞnR0œ}¤›Ì’6’şĞoVRJQ–e‘ĤiRÏLÊó Ŝ_ŭÉé·SA˘ŞôŠfuêl­ħ¤íԄ‘Ëšá~•5I Vµ‹•İ…C£™1Y5ƒh`ı.k…Ó{ûHŸ˙Úŭ~Ô9a7ˆa8N>Ž9–´µRukħ£–‚Ò¨êúŭ~·×ëí4=G|ó÷^œŜ$~ërBHÈBŞyGhTĤd.H–ò³’€•”($!3ÌHòJBHk=B{7ŽĊBĥĞÇĠ:ĉ U²‚Ó?ú.ö‹—X• çÍ'I²<$d£Rñ#˜‘\#Uça Ŭ€ÂİğµŜ„˘ÊórâĦżŝÛÇÎŻ”¸œT*íн#=ˆéı†ċÔ5OĦRtê½'ĦŬğ+‰’š”umlX’l@Hĥĉ'1¨YGW>|ù'oeBùš–yÏ ƒ$IÒ²,Ëk2œÁÒ-fI¤Ÿ£jIBג’4M—Ò4Ë²ì"˙Î˙ŝÎğ+…”EĤ6 P‹ šžuÓ³ hĞħ›\Ċ°?A3¸qjhl…¨6bm‘êMr(7·P!$žßƒô›Ç½{îÓ‡½½^oŞ×ëEÚ ÜÉÀ·/CR£ĉġLŞ. Oûžó‚È;½T¨ĤnĦš[A€ÇIy&j•İĴkGÔ¤ì¤òk,Œ_TJşZdıvÛd–kĞ,8Ğ›éÊÁÎŝìéxDy~.MÓY]ß])˲XCȰ–°a=1ƒ&H› N´`­ÉŽ,–TږByž+ĝÏ0ûñJŠJo8†Q`iuÑj(GŽà$ìŝ$ӛ$Ûa í"p ĴĦ8ġc`êaÒRâûîñ–žûêsAµg&u:oHÎádà[0O¸Ûï÷wtğŬŭaıëù/?{Çwu%GšU¨re³@RŞÑLÍ7!W-ĵ‘€R×>›A{ı äU2R6Ja0²öƒórÀ“¸xò§˜^ş°Cùvžç“$ı2 –ó[.@ZÈP Ċ´}0ˎJjıĥAĥ2 ”éZ} TŻI²}Q÷.H$gÈg>ÄÌĞ?Gc~2MӋI’ÌiU]’çy>ÂÈö'UC‚cCĥBên\ o"¸fIŞYv°òŭào>{ójÈ ÄgÖ8½Ħ&Wİh=`”55á6™‚rcĜjŭ˘Ô>êݲÖĦ’ ‰ïgƒ'żôhG0<ĜétvöûŭÈÀ‡oç.nnšn’ž£Ú(Ž ßïÇqïŠ˘è@†Çžĝç˙ös½ğÂw•Aj†Ĉj™wíÊPO}UkŞÖYJBU5Ê: YX™4†ÓÙւVC,À8CUĴàƒŸ|‡Yò)ùÇZĉ=ŸĤéJ–e9UcĜÑzu#ǎ m €şfxžç…n–]HÓô˙7'.Ï$IžYö'#˜‘ŸO¤5ÀÈTžLŜîe²ÍŒV}sÖ¨íĵĦï-¤î‘ÀÀÔ ż2]<ĝä3aét:ûğŬîZ2p7î|ë§êĈš§vğŬNÇÓŬnw_EGößóÀ£÷ĝĠƒ§ ,&dEBOŞ&k)ĈM- ĠcÉkż: L4Čä; hW†z=“…¨LMƒe!•÷^†8û~²ÛodYfĤÀ^M’$İŞŞ\ƒmÄLĠ  ŬĜ°n9›%ŻÊ²,²,K-ĝyŝ—rú½AA˘,@ a’ G˙`X›v•ÉPÓ+Ùé9ˊ_`5ĥ˜.lUÒ@f–3Ġ3òÄÎ>’ÏŭÚŭAÜ;Ħ-…vġûŭ^§Ó FÈÀ×jŒu tóҸԝÍj=KĉmĜÑÁ(Šîzĉ_ŝŻÏ¤‚ħӋ9¨’…„ $£%”ŠT ìêK”„‚ \½Ħ§ÁĥêCÔ—BÚ È ï#½?¤Í˜€Ày Ùüyœ˙ĊèŜ>'Ïó išÎêž#cžş‘&Ĝ‰;r€t³YÖHŬ­ùfËÀµĝLġŜ›ï'ĵ·¸’çµÎ|w’cˆ†\ŒGŠ Fdƒ‘ġguŬÈ!~jƒçΚY·²5Ġ“à1àO†KO|á-ßßívwöz='ß~ìhƒġ}ŸGQNOOÇĈ<5 c÷ġ7_Ĝ}ìŜɅ²…NĦ ÒBµ6Œ`GJÔİ:Sߔ–_]I´Şż6–VzÎJ_K“^Öµ#pp2ÇıW~ˆ]éÜeŻÊOëTŬmž:l$ÖaGNÈàiÛ°¤k•/gY6—eÙ%üĠ˙ùÎ{ݐTúJÉV£"†f ĉp^šÏaÈ,¨™‘-ġ^(ò’ J6àIËîèÑ^zökGĝÎŬ÷iî8ŽûNċÀhZÓˆsîġz½VÏÑô<úßşçÜJ‰™•˘*HI` ĝ ÀP÷5 Ħïµµ•¤Úwħ²LQ[5#´/Jĉ’f’uš›éËc(fÎ`ċŭ—Ë#öz–euÏÑĠ4Mmžj׍Vׂ‡?w)uáé–1¤Í–/dY6Sž˙ô£üçߟùd)AUU:Á,uÛjjÊ4ʚ›ċ˜*ĠÔòïš1 ĥŠĊĉ„b–ÀÁR;1R • Âŭ÷Ŭ˗žŝ•gµ ü€“oÙ4Ŭ¤ ħÜ÷}Żßï‡zlŭ(ŠApü‰ßû·/ĝa×{{. Ôİ:!!WuGÎ8£ÖĈÌĉBÛ^‰Ĉı~¤šNZ—.i§İi¨G+óTĦJ.úŸ8êWUyêBšĤf´DµFŠn-g˙ħ);ǎ Ŭl–4Ž!]Żĝċ,Ë.yóßŜĵ$/Jŭ YJ£VJİú §ċĴKhëÍäÛŝ÷bˆyI{µÌa`N*µ“I§ÀĦÀCâ7÷ˆc÷>j7Ë:ĝĥHĠdHQNÇô틢èèñ§?÷ô‘'_Ĝŭö•ıD.!+ )!|¸ñò&}…Ñ—§ĈJġ••ާĤ³×½QèAאÌâä Œœ¤¸òŝ/Î}xu ċ[š]N’d)˲ü:ÌS'ĉéÂÒ-MŬKáM,O’¤–óïŭĊ'o/g(Ë ֘›ÂέŻß;şĤ¤ŝoĵíF97H!p`͢áŒ,¸5“@*$>¸‡-=÷ЏAp< ƒZà88ĝ­OĠk›§úZÈÓìèPÔíŜġĝïŝÁK…d/¨ İוZ!cj,9oè=i¨L˙Q3 Ö(Œmz•ÔŞ‘ùÔ°% €|ĊÂ'¸ôËÊ=˙í<Ïϧi:kRu0O•뀑28@Úré;`dàĈ #cġß'Ĝ †%¨ ÚÜkÙQ=6ôÎ'^èe?÷l†G˘(ŞŬÀµÀÁÉÀ·NގcLĴVĠùSSSFÈp( cŭÖżŝBĵë@÷͙U)A•DUHĤüê8WkĊ0l5xOġ&UÖz)Iİ4‡ŬÚ`4”Ĥ–íž8èŝ=/äċ >úÙß XÈÊüë0Ou=Gĥ-KÚ0Ħ‘çZà°Ĝ¸˙§ß[)H9”8Áò‘\e!4 ‘­ıI3‚-F0“4–ô{xŜRcĊÒFC… Ìú9'^E„Gwġ‘<ŭ•{‚¸wWE;Îî12ġĈR8şıİşVÏQǝrŬEÑá]GŽ?rߗíÇK%ĉ3Y„!uä34­ dy&J@BêĦ’ CŞ™9pöô×Ġ­ äq5çˆ1#̟y⓷³}|M–¸< –´ÌûzÍS]ϑ¤mÁ’0bĦN*yž×>wFžžzkaPä$A`êt9Iı/ĜoFì™ş“ ,ҒmK-+²u‡Ó½%u³#¨ħŞE y:\zü‹ÏApLûÜí!Ÿ´ŽäXÒĉ0¤qİğ–$ßôġz½^·ÛŬEÑĦ îzĉ_˙§çyü½…L‰ A‚qcd-™Û¸2ٌš¨ä05B[a'‡Ö")5 H’’y‡Ùò .ŝòé.TŞnn0Ĝĉİ%Ï<Ġê mK–´!xY–8,iĝEïŻŝË[§)eİĈ3ĈêI²öü9l°`wk0jĠ˜¨ŭ`ÄPĴ=òĵ.0›“‹†s=¤&˚.c•êşx*„|ñ‡ùŜƒxŻ×s2­ĊŽĝˆ´˘(èġz~ż?EÑŝ(ŠŽŜû…Ż?³ïĤ^ŸÏPäU&êÚNďĞĉiĈİœgYù}ñ¤ÇKH‚$ـ² ‚àèżg²ù: ĥÚbD¨DÙ7‚ƒK 1Şw-G†e=ĥ´X‘3Ou€tÛ2¤M“ëfم,Ëf‹ı™Oʗ0óéR‚JOĠ„Ġ´ €†<îd͌†ú”ì=4aSPêÎy!‡ĤšÒ–‡ĈFêƒRI)p˙‰|áİŻ<£kIĤY6îvğ“ß0Ċ†Öì9 ï÷ûQżßŸêt:{£(:ÜÛħë'~縘T8ż\İ׺R³‹8gġ¸fħsğİĠÌç*Ħ eŞŠUk“Zj:QƒSğ ÁôêÁdȑÎ|€“?ЎĈüÍ4M/dY6—$Éb–eIQĠs4ŞnäÌS Ŭ,iCş^ĝ\žç—ĵżŭoo\$'òş‡cXÀ0êH­H¨ÍX-²€ÖĦĈˆĠîC2â†Ġ”j)¸ošx­~&Ħżzç!zî+ğŞ#÷<Áá(ŠöĊq܏¸dà7-M7‰yjŞ‹8ˆ¸ÇñN§s0 cOüî<tûÁ[—3m$”œ› Ru3sÍş1ž‰f_%ôˆr)Ç ìQ(TŻĥĤfÊT€ôÊÁ"Îŭü{8ìeĈ<ġÒ`0XH’d0džşžƒ28@ÚĤԈèFÊÀÓ4ÍW–Ïñï}ç£÷–2ˆJ4ƒ‰ĜˆbmbŒ†YÔê+ ú×ö?ġ=dK1ÎÁaĝzmŭ2ġÏͤÄCû÷añÙŻ?†á1ís·ğ×ë9ĝ­MĠdG:U×íġzSNg_†G=üä“'ž˙Êŝw”yިD=:" €2@Äj%œİ‘é;Ҍ§$ıšĥƒĠ ġ3'gŽ…^ñÌ`/Oj{ ËI’\MÓ4òüóFÇñtŻ×s2›—ŞL­‹€ïûĵÓévdĤÀŜġäïŭğÇŻÄŜ›KA•„,À0"œÁġ bɳİ/”ZÀPJ —¤ÚcÇka³ŜŒ´{ˆĦİÁçH.ŠÙ_ŝîŠù;Y–[w€„áF–7£Ĉ½ÁcC£Ô…ú¨(%ÙÙEòÜŻŜíOí¸'Š˘Cš%ġ7 w‡§êÖbG­Úïû<ްßïw{½^mžúèo|ûó;‹ß˜Išu"HDœ#€Ġ(†IĞ·Mèĉ×R׏Ú&Ô\|¤Ġg¤›ì´3kP^LJä9f_û!ö—ós(ÎĜĉİY–cF’JÙ­N­ ç˙ü޵í]8@Ú, #hŝDŽà2,ËfŞ÷Ŝ<]ĵ÷ĉ ˔_kß&m5ŭ“i˜Ùġ£áñċú}E,·VáY5Ħş'ÉúmÍİĉYż¨Ô3ٖ‰çáĜK|îù0 †aĜr8L˘ĥs,i2v4²Çh”‚ ;NÇñT§ÓÙ†á‘?pßW˙Ùħ Ìċ˘ı„” §fèXcğMMŸ›K^JĞĥVrR˧Y‹†ħĦ”´žgpÒOŜEòŝ+ċјż–ĤéŬsdÊ ĜÑpĉbÜĥŸcŬààÂÒöeI“ÈÀVËÀŻfY6—çù…àŻ˙ϓe•enˆqġ-íĥêҐşÉ;}GĈÁÁÜ~‡AL˙şLÛĈĝĴĉ“Z\!ˆp¤@>˙µĜ}à(Šéqçŭ^Żqν Α,ɁÒHv´žÊĠsÔívƒ~żß‹xw§Ó9†áñ§żŭżĵH~ä½;ŸAT²RŻ£„#5xO§mÍEž>,m1ƒD)”oiwĝ:µ‹ö "ÙO^?hRM°œƒH.üÏ˙wuäE–}šeٌ™k™§çO·!óÔ˙ùU"İĵò\8@Ú. éZeàu„%O´ÏŬ\qyĉĴĝù÷/]H3H’êVÊÛi¸af¤jHíżo5ÑÍA‚ċqGC_KÒjĜ ‘lĠ6ĠݍS0²u dÄ]ÇO…§~ċiÓ,ÛívwM Ĉ+Ċ\`C=GĞ,‚ŒyjŻ×›ÖB†£ÇŸŝÜÓûzrçë3 Ҋ K%ó&:HIĵĠBlÜvɌ–nŜ”(J×­!Ħ×Ec$ÛT{%*0g“Xx˙ˆŻœ½:ĊŞw´“÷Ü`0X2O„Mnž*IıBpw|:@Ú,iCZOjÓTUU7ËĤiŞšeż÷7疒’‹•ŝ)̚›$‡'Ç ÂH§‡Q†Ĵ-Uií^Ù¤ŭ}ôi‡gŸĦD×ĥ1Z‘ħ×÷<û+ğÊ=†áÑN§³7Žé12ġRxŽ%aC=G£0 ŭ8Žİİİ~Ç{˘(:Üíġï~â[˙ŝ‘ı¤ÄÇWKˆ\h0"p҃÷x“2İ7ŠH5rf(-·yu°·SÎfìk“šc­ħ*u­Éc€ÏÏ}ˆ…×~,Nô½·´=1O ™§nԕRw˙ókDŒ™1·îs€´mSwRx òèżÙb°ò™÷÷˙ŭ£÷TeĦ’µ ĥY*ÚĤ”Íc]Ŭ k[üW’PIİÒ3d“ĥŭ­E˜Ë-c*½Â5P SùI%pßŜ˜âWñ£Îħ(Š–4fÜı“_[Şnœ“÷*óT=’|gE0<öèoŭëÏ{ñµ™TIĥËp"}á```Vîĥ^#şYi1ƒ%jÖŬHi·l_ЍIí1ÏÎÀ<)8˙‹À!Zı`™§^IÓt(ŠâF˜§üÏŻ‘4Š‹şVĉÂÒöKß› ×ͲJŝËz'ğ°,E b|¤ !Ž-ÛnŒ<Ûꎇ™Y£ó˙Ô4-³Ġ!0jN;İ|î€Ħ^Ĥê’2Ž>ÓMî{òÙ0 t:}½^o‡%™Z‚“_kŞnĴyjŻ×ëĈq<Ŭív÷…axxïŬ÷?zïçżqèÌRĞ…Ş‘$T•„O@ÀO `Ğ*yŞ6×-ċämğ…Ĝ`$I׌Ş×)#Ŭ¨ÍÀ<ĤL"†Ċ÷_>}7ÛқY–]¸ĉİRJ€ñĉĈċı;¤í͒KSwµ <ĝŝ` ¨,2kz[Ĥ“ĞüY$ݽ‡úŒ5½Jb¨_‰Ĵžš3§Ħ2_µúR¤Ĵ] ŞJà‘Ŭ}$/|ó.Ż?}Żä·Ğ×ëġ80\ÏRÈù܍gHRw=GžžsÇqĴĉEÑ]OûŸ^!ĈŜ½œİ{ı„J˜1Ĥc \/#z1‚˜JŞ4] ­-s’ÔHğW rd3‡‹<Ç]9Ù×~H÷ôĜ{Ežš$Éì`0XȲlp£ÌS‰,YkM×\8@ÚŜ, #n^’[>w3âôÛ§ŞÓo,dEŒ&™Ş+Ë!€Y%íĥGD‰ÚNÊÍá t=À™nBÚ gÀˆİ™I¤eàC?¤kZŽ>h°ĝĜ—L³ìn·ğS;÷ |ÓĜÑ*véûEQĜï÷ğ:Uw £÷ġ7_Üuôİ×çR„È•“7ÀeŞV92 µZ›‹I•Ş#ċ␋6û–v [[1µI“÷ı2k•.żŭcìÌ,t¨J}WËÀ“$hĝlqeööÓżż0“¨DU7ĦŞŭ3~äù(·piÙ ˙)›.z´ÓwuÙ'£Ş1p"5=,„H+Âħƒ‡Ù£_x2‚£š%íŠĜÈÀ‡=îF îtĝ$ĉİ­ž£8Žƒ^ŻgRuƒ ¸ëñßûYÔŜœB)HËĵCĤ,‚8†œĵuZ·"İĉA *í[7ÜôjÔtÌj¤ˆ£fŝ` ¸ôóïᨗ*ËâŬsT›§êTÀèñ×džÚRÎ2´{œSƒ¤mʒĈ1¤k’§išiĝċ,Ë.ñŝġ[ iVr‘Cw&)½× ğڈUħ›VS˘œš)éžmâ*ß M¨¨ëż>Ú÷’¤š›$]‡˙ôWwÇ|R ööûŭé^Ż×ġ}?À58ßî,é„ ­ž£8Žc=R~EG>ŝì‡{a÷ë3‰2OÍ*PŻuÀ•›ğşX´Ġrf´„Rh!o: Ğéì.”ż]íÌ ĠÚñ;X,~*:3.ïñċ›iš2OĊµ×€IÌSíˆŝ…ÈU- ŬFİğq)ĵueàUU­’ûßûo²”´êŽYçsë‡HĴÊÙKk€Ú°lĵĊœ`nÂM´#8étžı 3ĴFBÎURŜ# Ò}-)îÛğWŸùĈC^fIŬn·ëŻ!çFp[ë¤ê€5ÌS0ôµĦ6OşŬOü‹˙è•B²3ó%¨R‡ŻŠħD|fah,ı=jB2”RB [MgXşlŭÛfŬQ#ŒaÖò™Opċ—?¤ğzüŬë4O”Ĉ\(ıĥ£°l³\8@ş ÒwÀĤËÀôv:{a™ÊĚĦh4Ü?”ĥ“D-Ö4ì >ĵñ*kJ-IўXkúĠGħúTôa‰t£Ôġ$aúѧğƒ‡^x> Qííġz;úŭŝ¸óġjJ­Cú6Ż%ħ1 4Î<Ġô!Á Ž=òëßú|w÷îĞ—Ġ×V‘šw$€ˆ1ĝàÔ¸·Qíq(uí¨éOФÔ~uşŝ„Ġ“cÛ,œêT/Sig € 9˜Ì1óÚ÷qH.ÎxÊ<ġR’$óڑa£ĉİkɽG§êV]25u“” Ŭ^,iSeàá˙ĝ“÷?.@U‘)mş…˘]’ĈĠ{Ĵ38µ!–$I6WQ˜ê^fhĦ9h˜"ë3V§zÌô[ċuvwaċÉ_9ΧvܧǝßñÎG¤ê6bžêĊqÜħ„ Gv9ñ}_ùgGO-˜”™²-Àê‘äÜF#6Öĵ#â]T¨ÇK!ħj­‘%ĵauÛ÷˜Ùù Ëgß@ġáĊá.]÷ÍiaOz£ÌSGod ’˘ÙXÓÀÒmĈ’0"o½î? ÉÀ“$™Ï²ìRuö̙âŭת˘7SÔ¨°j€ŸĤ³…ÍŒ†ÇRĊ~ ™ñġĝ KI’ċež:Ž‘É;Óí~ċq€äXÒÚùíħ2pmĵz5MÓ+Y–] ˙úżœü4)¤,S0Îêmw†všnµ‡Ŭ+ĝ*é¸uµŒX…´£U~yú, \wù“5&]Tê'K ìöÊg~u?í?öĊ’ĤşŬnwÈç_cϑ-dèöûŭén·ğ/Š˘#÷|ákÏîżïÑŻ^ Ë$d)!J•SërBȟ·Ĉn)m R`’ÚŜtĈLuĠ IġZ›5À%Ё‹… ^Ä!¨Ââû?ŽĞçöXġž5v%Ïóâ:ÍSGĤêÖyòWЁ\8@şMÒĤÈÀġdÙD[îÏ—g>a?˙ûósIeç^ċş4Ê5žœZ`Òvc°ÜÄP ÏVŬQ#nÔ@ Ó^S³ĉÌŝyêP#AÈpâèavùñŻ<Á1-pĜÇqĴg&Ŭ‘2ëé9 ï÷ûQżß7sŽŽövìzàÑßüW÷rµÄ'ËUÍŞ$0Iĝœkı&YġBQ#×"ĦêHm ÷jzC›l£F1ÙÈğ% ĊċħüÖOĊŬ}ïM#dĜDóԑ@´ĉÔ=²€É,dn–4Ž!]Ğ Lˆ$ÁôóÓÙŬ?EÑaís7Ŭív;Q…Xǟ ·· |’ž#†Ħž£n·Çqĵ³Óé ĝcżóo^âéġ™(UŞNêfċˆİ4İŭ1´…0˘ŞşQ%Ġ{i1 án^k1Üg.0 8àqÈÁ"f~ú]aÉy*󏌐!MÓŬs´éĉİ뎀mxÈĥ܅¤Û/u·V o=xidàišÎċiz.üÁ_~|>+Y*5£fdzk§P¤l;Żv{hĈRKÙܘëf\’µœÜžPk jÚ¨Ż}î¤Ĥb¤oç9îÙ·W˙ò}^°ŬÀ0'Ljĥ=KşóTEQëġş½^oÊÌ9:À£ĉKûߜËp5(2Ħ,‚!0†€ëĉfİ4%j!ƒÔŜB$Ğé•V­3ŒOZ7’³1@3hŜaXüàU3§“ŭ!4İşÁ`°”eYRUĠ 1O]˙´4Ö#¨k£. ŬŽé;à:eàÚÁaYג.ħWŝéŬüâÙe*rÍQ°ÊŸŽì˙FÔĦ"‡•vŞÏô# i£¤•ê“íÉħvš†ĞKñŞúU)$¤P‡]˙Ħg:Ë>˙lG;Î8ŽwôûŭΝ$_#U7 ˜ìçÄó}Ÿw: Žşç( O}ûž¸œ½{9SİRĈôeˆ8I%d-•fsİ„ró.ôxrŞ'½­Ğ·Ċ˘JMŸ"èÈĉ>ĊĠ×Hw÷ĝİ"ÏÏĤi:£IÚ¨Âĝ^£k7Oh§ê‹g á ÉÒí͒Y^UU‘eYŞ}½f³,;ŝí}˙Ó´$YeVQş–-´€e•ż>\†ÙÍ¨ŒO³QŬ İkKĤGehÔy;ż¤G €!¨ê€2ߪ’p˘bÌ7ŽóğïÓnà{â8žêġzQ†>î,ĝzìhĜ<•[ĉİ;tŞîĜƒßüŬÏ÷÷_MPƒÌ ² t< ä X#óħĴ™‘ĥ@ Bفäji“Ħ°cş7˜òİc0™cñ½—°żœżÒ‘ċûÚèJ’$+Cĉİö@£Ġt×ĠsÔNÙI R£8ôEÁfnK†´Y2,I’}›œİ>9}ïży,EŬ—°Ġ#ËіiƒOħÖcħbIöĴ%i5?šħç L5̚™IÌÌZ’Ú „A)qèĝ=Ŝ•‡żĝœñıëġzFî­1îüĥaGëġq¨ž#ż×ëEqOuğŬ½ažŜwàżŝğÇO-¸°RAB* ñ¤#€1R5G´… B’0H @!ÛġFIğĊ…2(eÀ}1 ν‹âŭWĞ£1C÷Íê^ğIÌSG1$àZzŽFż OÍe‚0[҅¤Û‹%a –´QxeÜÀÓ4½’çùEïïŝŻ·/fĴŠşµvoŭ i׆ä9ĝjGïÖx ¨7²¤àr„|œtí@=ŜÌ$=•D)ħ#ä(˙òžêÀ‰ÇŒ <Žŝĝ†ĵîĥYên\m cžÚívm{ ƒažxú÷˙‹‹ĵ7.§…€Ô^?Rœ4<ĤĜ+kÍÒB]/ĴtŞN IğíUŜ˜ÙĠµ ¨žÊdóŻŭ'˘òcYg³,ğ4 Ò4MnŠyê„ıuġ{hÛrns–4êŭ5ËÀĞ+³Ÿ—ŝîüü ‘JË0ns-·F{¸èħ'yĥÔSP~f‚lçgS?Ò0'8#ûL"5Pg µU}BH0ΰ’K>x]yĝóAp4‚ƒŬnwWżß߈ |­ƒ}г£ġzŽVMĠ˘(èt:Ŭ^Ż7ŬétöFQtìĜ“/<½÷§vŭr.A’(Ŭy:µÈ5™ħD¨eŜjÒŻ„BŞ!|6ƒfFĞÀHĞ<™^ĠR<CHŠç_ú;ĝçŜ_Ú鉓Ú<ġJšĤK7Í ŬŜ,i=Feà—ó<żüèŻN.//g²Ìu3c,‡Ŭ4Z…‡15§Z…g ñĞôÚgQż—6 )8Á×E‹şEBċë‰ġĵ'<Üġ˜‘ïïvğkÉÀ·ġ¸ó ôaŒÂ0ô8§ĤĤúqï‰˘èH·×żû‰ñG_HJœž+ ‰Ş T'BÈíZ;Ö Í~!µë·ê7*ôHòZ‰Ġ̨eÒ+›~3ş²ĵÂòRıùóK9?:‰êWäŭ;£wò<ż`„ ƒÁ ħzŽn°yê$‰ÜħééŽÍ ş+Ò4è&Âı ;0 ÏJ ÛIÎ?ü ZżÛíîìġz·•ĝuô1-dèöz½Ŭnw_†‡÷Ŝu˙£wŝ×½³c!-Qe"¨tÏQ¤==4ŽuÚM˜šԌ#ĦFK´ŒO.µ{|cŭ.$a°R`~n€…Ùƒċ’)Ñ”'QŝáËf?ÈÇüġ<Ï/jóÔċ,˲M6O½Î˘eìÒuî@–4İ œ†XRU…İ%]Ͳl6Ïó Ŭ˙ù'ï_HKef™Ò!´:7̧w7Ŭq÷ocĝ$ĉİ6; úŭ~Çñ0 …axâñŝïž^¨kVM–ĠF‡CŬÓr{jօÚE>¨š†jŒT™úg`Ċı“Ÿ%î™ßÌóüĵ™s4yê¸,Áġ™§N²Ot`äéŽfI×*—C2…,ËfÊĞ Ÿ?˙ŜùĞÚ \i”3BSO²Ğ­† Û…Q.áĉ †™ï#íú­ú…Ġc!Ċ’ô\}XCj3µċ\âȽlîÑŻ<Á‰0 [2!v”ObžÚê9Š8èġzqÇğLÏÑSßŝ_^Ĵ˘^Ĉl*ĠdW³:"†ï1nĠi7I¨§À I(I˘’ÚĦ€SMVJÌÏ pe6A²R(ĊŬg´X´ú!zÎQèÄ"ò÷~„Ŭê3TĊÇĈ‘Á2O­°yê ë9ZÒ kfÎ\Ġҝǒ6Mž$ɒvżüÓ_œL’•ŒŠĴnL4ŞĞQ ħ°†ĴI9tè˙µĈR›Ŝ]3ŞLRíqgĈ]ÛCÜÌÑ+›k²#Ĥq×XÌxDî·r÷O‡ax$Š˘Ú \ ĥ• ü„ sŽbŬs´/Š˘£‡~âñƒOĵ¸ç——,fDŜ4r†\êÑĈ%uİ0ŞH1/!Ë*,Χ¸|i€• e)‡€‡ÚëŒ`E/ îs0ƒ‡@~ê§è.}68ħ7ò<ż˜$ɜ^£Ĉŝ½_ûíï]É1³\ŞT)„DSġ9ŽĈ6AżˆB–V \˜`ĉJŠ•A![Gûú`Ԟ[’Œq°9òO_.ĵ_ŸòMŞnf óÔġXÒĉš§‚štsôÈҝː6*_R#eàŸ~p†½ûÊċŞ*)WÛżÀžƒ3¨h”ç-`hÒ~‚!ğ–ÈĠ)iĈ¨ù<œÁ… %à•J.û3÷á™0 m–wğŬ`›ÉÀ7lžÚëġzŬnwOEƒ 8ñäïŭÛgW„Ï_𜁄 T•€(%BÁS}GĴ9S‹‚peİÀù™óW3€ÍÀĊIÁˆhè3êÛg`> ÓYä§~Š{§Ĝ‡˘È?Ġ=G‹š2O•žğéB†ĉ´dm+‡Iî@–„5XÒ5ÉÀµ´ör–e;˙§o^-DU™2Ól艆öh €V}"ÉĦ´M RÚzĈÈż cĤqVj—qIÍ Lg >`ÍLÒż´÷^DCġçvûO<Áá(ŠöĊq܏¸³•eàì9ZežÇqW 9öEQtôîÏíÙ½<ħóıTM€Í„Ş˙I "Ĉp' Ífçs\ĵ’biD%ĞşŜg\½7FÌŝ€İÄ<€û `é;˙„éÁŬ½£hĈnRu“0£Që~Tjû] İ‘ı„$ǒ6AžeY’Ĥéb–e³ċÒÂgÁĞ˙xa,Ġfóô™#”ƒƒÄp_Òè=Z3#j7½š`@¨V“’!“W ˙Ŭ ËôĊÔƒoŽ6îRĴGîg³ċħ0 kŸğŬ½^oËÊÀŻĦçh•yjŻ×ë랣#ñÔô}ŝĈ·ĝèj‰Ós™J• ċ÷Aˆ¸JĠ„••çR\^ȑĉBû Jíʀ‘·a02‡‹Ï(ĊÊ+g ϟ”÷ïŒŜʲìĵ1OMÓ4ê9šŒ€›(dh­vŬïàȑ$ǒ&8L,7,)ü§ż<™.-fT&Ê,U÷‹ÈÖ]“VĞ’Ġ(+G ükĥJ ÔSFµ’ĞQŜYŞ=9”§"jϤ!ĦûéùÙŝC/ö–îyú9#xş×ëmuĝ$=G-óÔ8Žk{ =öĝcżû‡ŸcñÎĠK ¨"Ty/ò„.砊°´œcf.ĊÒ ĴmÔk§'Á kĴ kKÓĦaÙ$%xäAĉK(Ŝû'ö²K\jUm´EÌS'{ı£~gî,PšD0µdàşïc.OÓsŭï˙ß-j7p@İن™Ñj+ĦĠ.áĥäÛîKŞŒ”cFĝäÉĠŞ=Ĉ<ĉġ4ŭ2ÊyšˆfGĤ:¸ò—îĉñÔ=QÒ,İż† œáÈÀŻ×<µÛívâ8žÖĉİGöŬóàcǟùòŝWg3,ĉBHÈJ™Ò"¸şaa1EžUÍ%B?żROu36 F̞Oo,‚8ï`‘‡âì/\ŝ(=ÖóŒyêì`0XJ’$½FóÔġêŞ7&¤=3ŒÀ¸óüv€äâZdà-PBTĥ <˲ŝŝkï°sŸ,1Ş ´œ•y ’v·}ÌÚ µNĥg'5*`Y§îL/Ríy-9·Áˆ5ż&cİZ’zLR A bH%ĦüĦ`ŝŜçž h†-ĝÀa’:ÒĤ³¤5Ru£Rw6€zĈ<µ§,ê)°Oŭŝ|r6#öÎ\†"İ $!”X˜`°R(ĤĤ˙ƒ5.DÖMÇĈ Wh–tMÌÈL]d ,ô@ ¨ĉ?Aqúç¸wÊû ÈóÏĴTŬJY–Ċĉİ“82ÜàT~L}“İġîòvKZ}#ܨ \J)Ċ |.˲‹ñ˙ûû—s")rrÑk˙tŞ™Îh²N‚dKq'ġMÜvn U.ҍ܈|(ùr=£2Òt‰Ş$ìíĝ<ŝ+içŝ˘(:Ôétj8çÜúrê›%ߐyŞïû<Š˘pzz:îġz;:Î0 ß˙ĠöıŜ½_œ OJ¤+%ĉÎŻ`i݀ǣôÀjÚĈyC{ÖIÀRv•”£Ö“¤‹|Üg`H˙ûä•)O“çù$I ƒemžZb}óÔġ<ħ7nii.C7É’‹ñ݉ġ@iĴ †­+b€ê9ò{½^ÇñT·ÛŬ†ááé½ûx×u×;W2ĵ{q€ÙıËK¨$xD<ċvÁ9Ú`d TkG5b˘Ú 3Zġ„Tjäà3Pş€üŭŸàžXžEU|˘i~È<ġZêF·@È0tñq}H\ŒeIëÉÀĊ¸4žċ>hdà‹ŸĈżüûs‰$İ Ôc #Ž iAĊjġ"B%Ôhcĵ:ì×2^…ċsGÊÎ×½IvC ‰´"Ùż³÷ñ‘ ŽEQt°¤1Îo¸ |=GĞĈ’GQt:nżßßazŽŽ>ġâÓñÏîù§³KȖ+È\BĠÓ=V Üd—êñĵ›&eA„rƒ`T—÷Œy*À9ĵ.C~úÇè.ì‹Ĝ›yž_H’är’$W“$ħÍS×SĠŬ\óÔIÀH’vün_Ô\8@r,irš2LIî Kşäŭìğo—W3*SĥÓQkìxkJE3ÔOÔ#üh$™¤µ$Ó·dÉżeí™GMúÍÁjœBŭ››ƒ• D)P”„§ğKw=ùL†G:Î° œ&ÉÀ7s„a02=GSSSŭn·ğ;Š˘a7ëŝ_˙W½{%‡—3Èĵé1ĵĦ#Ï4¨ê­vM7ìH„”Zİx `d>§XÀŽ‡ò┟ĵFîŠŜÍóüBšĤ³iš.Ĥiš–eY ™§×wtSÍS×ŜêrG ıXµñ6Un;Ÿ+²ì\˙‡˙ŭƒċB@VıJÛéz³Ref¸ŸÙĴC£ÏGh×n ™"[SÏ!`²… €*g#‡RŬÙìH}’@YJĜcáÑŻŬÍİ{0Ĵeàq‡a'ż‡ġzŽZ`dÌS•;Pw‡ĥ:öŻësIww÷—g—AıċRáI„Œ÷8<Ö¨êZLĠŒ’×işJ[]SšŽÔí€ċäŬġÁ!?ŭ#â+s!•§‡ĤÀfCŞ:ħŬtóÔµ/ÍO—FQèÂ’‹kfIceàyžçiš.§iz%˲KìŭWß .}r•QĈRxl¨ݝkcW_í~&Û ıħ&§zˆ_KĜ ‡ŭí,–Ċ’ÎôaĴÁK˙…($ÒLbêăÁċû^|^7Ëèvğ;ġ¸s8Ĉ¤Ĝ6Ē·çȘ§Ĉqĵ7Š˘#ğŽŜġÈĦqä• ĉ—K5’œsP%UÓSÊşĤEĤž3_70 ÍN+=jb#`ÄZÌ 00Ÿƒ‡,Pž{Ŝ̙âÄT`zŽĉôĜ“aóÔġjG7ßü°íŜét:Z>NܰĤ ü“övLMMġÌHrß÷?ú{ôô§wÎ'II $„ÓmĤËĉġ¨S›€Ħ6O½fdÀ¤&)úrpùİŸáž)öQĠ˜§.¤iş˘Ê YÑ$=G7•5—0†V‘Ó…$Ğn‹›"×µ¤•$Iĉ³,›İ.}öaĝŝ/Ż ÊA `ÜLoJÓY5£áGEPêıay¸9 Ü ñ:hnóÖéƒÚOŒİt”§{“{SŜט§ÎšTŬÌSÇġŬ2!C+ ™”€ı-ıp€äb,Kş7p“şĞ,ĝB–e3ċÒ§ŭ_ŝŬgı²R˙X’fKĴ=iĠލs §fšl}` U|ŻAjè4b¤<î¸NŬ êÖEi´ċ’°’Iܽ³÷ù!?꜇]Š$uŭ5dàkġ m$M7‰yjŬsÇq ÜâNç`Çù?|ŝŠì„Ż€rĦ”uX2_ğysm§ÔCŻm‚3ÒAmöĜŜ'xà•‹)VÒ ¤ŸX!àJÈà1´ÀÈ<Á†qóT)ħa0bCi:x`ŒGÜçÈ?ŝÂùÓÊ<ġ‚2,i™w9Ì{-óÔ[Ós4’! Ÿž.mçÉĊ8Pş^¸IŬĠ24M• ĵ(.L˙è;gVò •ÈĠÂÑŞ;ĈFœ4œĤkŞL£jk^£ĠvíôUAÖÀ¸š%µ‡ƒÇ‘¤EQI™ÀžNˆ+÷}á8ïöï °ñı’oxÜ9Š1İşQÀćRuĈ<5ŽxOE‡ÂNç‡8½P°÷ÎŻ@ĉ¤ğ‰™€¤G’Û`d˜Ħ’M TıYl€É!0ò=ġ³;àsˆċ³(?üŬż#8]äıIĠmĤyê­OĠµ~¸ñÄıp€äb­ôŬ¤,i$8 ÉÀç³,ğÄN½ö~pé£ĞĴÊÁ8Ġòkıj\Z#‹mbŒ#YğN$ÈÔ8$,Á\k ín†ÜrFÁjxKT!ÔMÊ Sw=èÍŬóÂsfÜy§Ó™T>ÖçnTŬZì¨~FU×ï÷ğ½^ogE‚ 8v˙×ç…jê@ïċs+yTÎUގ+Q‡íĞX¤TŻĵĞJ5ÂnŒú+!N`ó²S?ÁŜjqÇĊ{yž_Ԏ ËCS`'5OŬ2=G£RğfDÉ’‹ ħ¤q~C24MçòTa?`ċòS/áîĠĉ݃Á`!I’A–e9­U7š´çhë°£‘KÛ!’$ëħ$ĴÁ’&™›Ô’gY–&Ib.vôço&ƒ˘Yގ)Ĉ>ĜNÑm5ŬxĊVûk-“c¸ Ó$kĈ^X ž6Y'=g€ÏTmĊœ­ÒêÄ%\ŞûžŸ^9òÈSş–´Ż×ëM÷z½nEá:)ĥq i5ŬXóÔ8Žyêŝ Ž}ĉ Ïôî~b÷Ëg—‘ç”)‹ !CÀĦjGöĊ]?‰B6)Œ‹úĈÀh5;P/<ˆ#˙à%ô–Ï­ì‹pÒJĠ]MÓ4S’RV:ugdà³ċÒÂÙé×ŝç§ıĴ ŞJŬĈim5ŭӇ-‡V˙½zo&Ë Ŭ Û2_5ceŒÌ ïYĥzR¨"ä•ÄŬ;0{ìùûĵ0<†aí†Ħ7FLVKš¤ßh•yjŻ×ëG†NÜğçÁßĝ7½}i€çRH3VB81>à{ĞÁȤéj ͌„ežzM`äéñ‘ÖñP^>ƒêìkôÀÎ;ı2Œ1Og4 3Ú:Bû1îœ ı¸ÎìÂZÍÇ5Ìx5$Ÿ ^ùû·°ĵ˜0ÊcşêÙgġxi÷Èl¸tZµ#Q˽ݑ‚ËĠj=fħ$ÎBŬ(Š!'k@žI÷?Ŭ]8ñÌsĥĝ |½Ŝ¤Q…qŸ_3=Gŭ~?Žx—2<òÛĝıċ`*úċ§+ê—×é:Ĉ€ÓM°dš`QKÀíTQ‘šêk™§NFŻ Ó7€ƒq¤ÌSxÉl@ċY–]2ĉİY–cTukìĥĥĞrżÍZr,É’‹ ħ¤qÇ˙µÊÀ²,›-ŠâÂôKñARLËÀ!œFN‘ĊÁÈ89‘„4öBhÀhTBGùÜİRÀÈ‚Ĉ•#xUJ”ÀŜ8ÂÂ_=Îúğîä7eÉÀ'wΑ!ħ ün·Û‰xşÛíî Èî÷¸­&4ωÊ0$lŒĜ<ŽÖñ‘üKx³gŠSŝëY–]°ÍS‡zŽĥŸyêú›K/"ÔNç. ı¸>–´­'Ÿ;vúµSáùÓWQ•¸R_É!Iñġ€‘ùX¨“e‰@Â:L2³â˜b!gġˆ ’úÀ•êûĴd{Žßí]şû…çŒÏ]Ç;ô ?‚qçlĠsäY2oŽApâñß˙_ŸŝhIèž# YH "ĝ FuÏQӓeϐ2c%¤hLkŻ™é×UDrĊ‡?½SŜ‡ežj,óÔ ëûÓ­ĊÒoİyêúìÈòbLÁ­ H.™%­×÷ħ X Qœy ğ³ıĊ|G§êĉƒÁòyê$#É×òĞÛ Içƒë›+"9@rq-Ûh=ĝşoBˆÊ–gY6K—/|Ô?óóÙJV`•„çñÚmzb0jKĞÁH5ÇÊĈ.Ö¸sٓúŝœÙCü"íófĈ/ÀP–“ ûd³wîñ ŽAp¸w:` ĝ$o|C ‚ÀïġzQÇuÏQ÷ûïùĈż¸÷͋ fĉsˆRBĉ$B†Ĥ –ħúÚ ŒššQÓw×FĉD`Üg¨.½ ùÙIq÷Îèm#dNŜĉİueĥ°Ħ}Z23™ÄŬñéÉĊFYÖIÙMTK †dà—³,ğ˙üœ,JQĦÊ@ÚpU#}‘\k£ĦCĥ6’@iôçÉZNCG›*ô'pSO"tj…ƒ,ԔUF*$Š{??½rĝ‘g˘(ŞeàŬn·3$ŸŒÖ^÷ġz½¸Ûíè ïûÇùíóülĝŻ~²Ĵ€hP$Ññ¸-ĦŬĵ™‚R͵ÒtĈ‰ù*[#ÍÇ£( :Žé9Ú†áя?÷ä·_Üûòı’´Ru#èx !çŞÑ׀kÌkI{ġİt1O­6 Fhƒó=0ĤĤÀrŸ!˙à§è,|’ì²74;şĴ/%·—yêzQŻE]+u É’‹ëNßë7̎&͒ò4MMên&zíßò–ç)r-Of­ l˙dıJˆ@ĞÙ0™Ï×lúûäZ͔LêN/rŸ)‡3Ä\ ¤0²œ}(ĵr왂 8ÚétöwğŬ½^o” |dƒëì¨î9ÒB†žfG‡Nç‡~óß<òŝ\Î>˜I@…ƒD‡A‘§ÀȌl6O•Ô¸2I(5X_33âšĝêŠċOQ~ò Ŭż+|ż,ŠsI’ ›§–¸ÌS'Ú@N]çÉĊf³¤kJŬ‘ŸßùÒwNg$‹\wk²‘`4‡ÁˆäH0#"TĈÇ<™Z†tMz‹3U{ñµÀ!òşz¸Ÿ( T*!ħ;аüàóİ]÷jĝž8Žû½^/ @l=B{$ı?55e„ ‡‚ 8úoŝËÏe½}ñË”ŞÎĦ èT5爵ŭ•H¨›ş4^u’šž£ŞéZŸc j#+Ÿŝö‰Ċù.ŞSÚŻîʐyêpjwûš§NF’ 9@rqXÖHŬ­ġ6RŽß9Ŭ™ûd‰1•ĥóĈI`M0²ĤÍ6MFœŽP’MíHHi.·ÄÚ¸ĠĝB0P=7)d gèy ‘ŝ!˘¸8—˘èġ>;òì³ï‹˘hÇ;â8Ž£(ä7îm¤#C~ÇĤçhoE‡§}è ß8úòùWä„D—3tŽ€ħĤ爵k$-5+!”4ŝšÁˆi_ƒG>x?@qá-°‹ï—÷ì _×İşıuÌS×k†·ŝĥÏÎ1Ĥ’àĵì ı¸q,iÜ v-xbdàY–]˜úÁ};-é 5"bÙß4”Ĥ[§É¤êL=İKa&ÔŞyJhIÀĠ{Δ­‘‚w<†žxBâê•iZÁ—„Ğ÷|ioĥûĝ#zß>Ŭ,Û!çküı~ó<ÏÌ9êĊqlÌSO<ùû˙ñıs ĝôè0†P§=ĈÀı„%Ş`íGÚĞNĥĈó—ĤCÁ™+âq 䐃9”„ğzôİ,‹³şç¨6OĠİ:1Đn óÔµ7“cÎ9@rħY÷ĵk• ‹%•Y–ċZçùŒœ;˙Q˙½ŸÍJŞÀH‚yĴŜżÍO^£f´µA‰ 0™ĉP‰@™ïÓʧq3]–!à„dB6(Ñá 1™Kô{;Ùùc/>Yҁ8Žwöûŭ¸ÛíÚëJ­7ÓÛëġvDQ´?‚cwîĞÏÄGĜñÖgDŒ!BÄ"†zèžÇHyÈe—•Ĥ#3ŭµ~Û ah”‚FmĈ(!ÔàâÒ'³,[ežŠkŻ Ż·mĐ$Úóá"9@rq½,iCš¤–ÔJĊŒrï˙ì/ß,˲„HÁ”İœĊŒdĞ>dŠĝ&E§eíq‡UÒñ6(y(Ê ó ¤ˆ|Žnä!îzèjpèÜŭL?=úĜÓA‰˘h_·Ûît:FÎ'|óÂ0ô{½^G7ÛèpoÇ{˙­?xàË9–² tÑPÍÈ0;ċ.ÑĜ2I²äŬ’ „Ä*ĵ!0"pĈÀDŞıS¨ÎN÷í ßÍóüÜu˜§NJĜ6ìVşŽħÖ|$\l^ên\ o"¸6^]ȲlĤHŸMżñ÷Ÿ Š ˘*ugûġ1£vÓ+Ġ“jA§£Ö‡öˆßĈ”˘Iĉ— ,-•ŞOI+ïB‘ ÄG(ğû}d~ċ~ŻÓ=ĦÌ ż`L-ɳX“gêÂX…ħ:öÌ?˙·/f^7<3Ÿ˘#B"Ĥ߈‘>ïµ˘1”mD ¨ÁH ƒÏ¤i:]Gb` ċĉ-3ä§‚£a2‹Â˜§ÎkG†˜§'÷Ŝ^İ:sĞ5à…$›–M. KÊóĵ,i!˲™Îë˙pÒ[šO spxµ™Ü5‚Qŭڊ0 ÒSe[ŞGžK´Ĵ…Ìû$˜]ÌQäBדLêŽ!ô˘#$(Q ôŽ>V|ùE’,C8@ÀÄxQ…šMw:}a9ŝĝÓOxĉËûÏ̤¨PŞ)Ÿ™o¨ÙJóKZîĉĵ[ÚŞş€‘9²ÌSÁ™2ĝĊٗá_>SëŻċy~A fY–n)ÓTfœkRuf\†ŝŭlV(¤ĴÍSŻ•Êĵšu|Àc+çQ|ĝsÜż?]ùı,ËfƒÁĵċÈp{›§{Zr€sHAͤH\Ü–„5Rwëúܸw>Î{Ş;óÁ"Qb¤ĉ%I3AVŽ´²Ş4ŬƒÔ‡µFĜ€‹ İ>·œV˜Y̐—UĞ|™êC2 §Tŭ&ıšÈê²"ôvîgüÑŻ<†á‘(ŠtğŬşY6Ôİğá7îyžoRu½^og§Ó9Áħ~÷í:p9ƒ'èĠ˙ˆ£vb¨ŸP#`@S3’’´:m Œê›½ŝwWŽŜ `ĵBŝÁħğĵ²8ċÉ÷,!JžçĊaž:Éf‘¤j£´­ H.ĥKşVĝr–e—³,ğ8ġÓïĵ“WRVé@€ ÌÇH;Ħ5kFcÀġtÙ˜LN!$ĉr,. )cĉÖÈsÒ&ĴŠpÎàà{€/_JD’àùÁÑž‚àH§ÓÙ×ív§şŬnÇ÷ŭĞkGžïûA§Óéôz½İN§³7 ğ}‘/óȇó9––¨ù‡N¨ĠtfàžŬ_%„a€R×ÍŒ"ƒqŜ À;>ŞËï.ĵ#îŬ½izŽôœ£Ácžşî1Ï·ĴYĞ H.6Ÿ!mĥ |>˲9wŝ£Ŝ{?!ŞxîYԘ²]Ù³”ÂÎôçI^av>G^¨³‘l½–⏙I Cl <Î9DEˆ)?ûkêZҁn·ğğÛíö£( 9ç&uç8çAEĦVĠíét:ƒ 8ŝġ˙˙xqıäŜ§šħJ‚I­ü#c-ÛôĠïeQ=HHġñ†Ótĉs̈́_ŸC–‹Èß˙ ŽwŞsĴ*>Ñ=GWÒ4])Š˘¸³ÌS'A%{8˘ H.6“%cH×+żœeÙİ_üċ›U’–˘JÍ^V‡áFÁHXXu35ç2k˜_.qċjĦ'ÍJe>ŞS-ÖiĜüFuyĞqÒĉžú$¤ÜÀK‰ĝÈCŬèñŻ|ΰ¤8ާ:N7 C›%yaQu´[ĝ0 =òĊŻ?³÷ĤO]N³aPb!ĥW?ĈfĈ‘QÓIŬg$tŞNlŒjŬ¸™yžŜġÁC†â£_ ğt69Ĝe'³,ğ ç-iG†âŽ1O]/,Û ÔÔF]8@rqCSwRx“ÊÀWxòÙη÷IEŒIġ̈́v­6N ÀÈúéRbġyfŭħ($f2 ’R×\”“·DFDVsRĞ–2T`‚TÁ_(6ÒñL?öċáÔğµ |wÇSaFœó€ïû~¨Áh*Ž=Qêö§îŝÂ?˙‡>ğšcîj ™U@)= ÖĴ7ÒlNR£Ĥ3i:cdœÎ݉16…2p‰êò‡(ÏB÷íß/‹â3=çh!˲ĥŞ0×èĥ3O8§€¤?áÉĊMĜj×/7nàišÎDo˙è ™ODž‚qOÍĜ: “!Z} F„4)ħ°˜Ħ,̌$ٌ:—ízŒÍ°È#ûǐ¨¤ġäe!ì:êE}éyKà°£ÓéÄAœsß÷ŭ Ûíöâ8ŜÙét„axì+˙ú?|zÁéÙ2 Š +ьÂ#Äh<útÏQkĈ‘2lTM§­˜ÇÁ9 <°€yù‡?ÁZşÜeĠ)Ŭst9I’•!óÔa{ ñӆoÏTġ[”`œ;†äÉĊMdI×%ׇEÇ˙ŭT!$‘Ìk%™k#) W ,Ż”5 2ƒêÌı-kÉtcj>?J<`j7 kBm) ‰€1L=ôŭÁŜ#÷ë™I{â8žŽ˘¨EQÔívc=v_†GŽ>ĝĜ£÷?÷ċ}ÎçHr )- ·yl’@$AҘŞyFŠ!ÉşÇJş.02ZrÀ|€ŠÏ^żtŞĵkGĤî9šŬ€yê(†4âĊş*-ŒS\Ü4–„5RwÉÀÀ!MÓŝÙ{§û—N/0Y€yLħ#×,i£`T óòBX_b‘% ’4P£,ŻÍXQ÷+6˘¨V×pŠL Üħ—ĊÏüúÓÖ̤ÚÁĦÇq/ŽŬNçP†Çú‡˙鉙`Ÿ.ä \@VR&ÚµNĦVšŜ"Ġôڌ•¨$AVrişĥoó8 %˜ÏßC•Ì˘ĝàg¸§O´yê$IÓ4MîhóÔµ/o`ژ‘qǎ ı¸•,iC2²,K-pXʲl.˲ Ó?˙³·sbRŠLŬÔ=Ċ’6FDÀ`P`q1׳02 >D†D-÷ޝ²Q´JÑ0–š]I@TRġRJR˘÷ÓÓѽO=†áĦ8Ž÷ôz½SSS;z½Ŝn·ğ/Š˘#/üÎżz!Ŝ{¤wĉrŠ*¨J²°$‹Í5ŬRÛIky% b£`T‡N‹J‹<0ÎÀBBñáÏ0Í,íiÌSŻÜñĉİ“m–‘ëĠ…$7Ž!mš \7Ë.dY6[ÍÏ|<ŭŝOgŠ<×i*¨ûms AX\̐ Ş!‚5ŻN‡ “îğ5li3jƒĠ&ĤR Ԅò\ #L=ñĠûÂ0<Úétöz½½úm§Ó9ĵûà‘{žúúo˙d>ÜĠeVİú–jÔ¸ŭD˘qëŒ ƒêÏ£Rż3iHò=0OËÛğ>Ş+g@çŜ÷î ßĠİş™$IƒAbġŬĉİ€Œ,ŸÜœ>H.nKǐW>—eÙL˙ċż|“Y *À=Ĥ R@h 0Ês……U)×£Ôd͂ìzŭ9›Éa0²†ß !QU:Ĥ•nсû;ŬÇülEG8>Òï÷Çq|4Š˘c_û˙ôÜ@FŜWrˆJÔ5 @TARµ&½02"ĊŒ†š`'MÓvÄ Xà<Y ˙Ç8â§3TĉİĈ¨(ŠÌê9şóÌS'$“ĥsu$H.nMên\ o#2Ċ,ËfòdÙî7˙î£"B`ž:;i‘–— ,-ċÍ0ÙuÀÔԑ0‚F¤f(Ġ󅆙 ôçk0‘R!/| ÷ĝ׎„Sğîëvğw÷z½ğğŬî]÷?÷…'Ü˙äŽwgĴ¤ÊD Ì„”¨JB%EÍ~ èT–kw% UEêk*‰JlŒX;U§, Œj€òÜĞĉ?ʎô½×ó<ż$É\šĤKY–e›lžzÛ%´çµÔ›1ĉêH\܂ô°‰2,Ë.ï½ôn˜Í'ÀCˆĠçZUJ,,dȲŞċÚ½5İğF< ġ4ÙZĜ` ğ3İĵŒ Y–DÂE!P•i*àMö˘§ñpE÷u:û;Ŭĝ/~ëïùìjÎ>[ÌQd•İ•€•h˜QĠbF˜ôßi0’’6Όj1ƒjŜ$=—JĴœCñá/p˙N˙ƒJġ]J’dóÔµÒtk1¤Û‡ÁĝĜñz!ş>$H.nKÚ0Ħ‘ç– |(Š ;ŝSE!‰D R³­Ÿ”%•.yM`dŝ¨úyġ]EKínŜĦ‘Z›”°>gÀ£"”…DžW@%žxfßux‡çy;_ĝŬ?8,;;£·Ï%ŞR˘,$*!PêšP%ô›´ß7ÒîŞRġJlŒŒ c à‘H§Œ½Ġ•…)Oĵ›eÙĊ4MŻL`ž*Ĉ°âuUu·CjÏöbîĝt€äâ–ħ¤Qé˜Ieàb” <ŝ¨R5ŝ ËËê-Ş{…6F K’u~pRK­Éˆ„JĠĠs•ì™C†µ˜ša/ ’<ÚĊ˘˙ôCу/|}ß{3 \-PjvTV• h†iĠÀӈ*I¨JĊŒJ!ŻŒŒ‘fŸ,ôP^|tñmqÏÎp£ĉİ„ġÍSG•Û‰5żiúĠ\ljĝî)p1Š%1VŸll c’CGĦ}‹fÖíšËÀ£(š üÎWŝüä…#|ĊGÁ™×q`ñrŽŞj—Ÿíxóo>D@/Ôİ[(b›Ff¤C˘­=,ƒ45#ğĤ$ •ŝúŠDŬƒTU*½&JB%$ÊR˘Ê%*TBŞŻ1˘…Ò¤%b5•˘‘z_3Aİé¸ïş –rŭ‡Ĝò\—Uï[#ɝyêuÀ’$ĴjĉváҖˆG~xÉşĦŽ=ÙAŜûúáÛ!}Ç0^'‡RylèÀĥ ĵÓé\ pĤĉïì¸÷ó‡Żò=Ó#ġċımµĈ˘›š‘žÌǘIÛé‡*X=]•11nħ%FŞ–dƒtšÑr ֍Ö‰š•²Ġwt]`¨ÙM à>ïxÈÏŝlîTy|_fž .:óÔë½ ÉĤĥgfZıp iKžÓC‡#Im/˘Ĥې%m¤Qvœ üj–e³yž_ÚóĉߞaŬP¤€$e)$5Pl™ż¨YP­Ĥ³Fƒ ´$ HÔ}Hb¨Qĥf;µçœl¤ÛĥPÎ |l0•ú<]sšN˙7éH²¸‚ò“—qß4ûPùÙ4M/ ƒ…$IÎ<ġZw9×ÌSGëQÄ. me0Sġ Ĉô°7n›_xĠŸ‡Óx‘/äy~Éżpêôı÷ĉ‰rHyÜñÛT02LĤħìišg…h[İŝ%ÑÌ$2 ²B[˙ˆ!€ŞGÉ|\UŞ&T œli·£RJk.Ó5€‘.fqΕŞ.âàD~úG˜N.,íñNžçĤçèŞ•Ş[KİV#쨴흳×kz€ıÓÒV>ž­„éFLĤ[´iÒuşŻ’ÉÀŻfYv9Ïó‹{_ŭ‹“Q×T:µĤo£œmÇFp`ġ&Ġl $Z Ͱ< FÚ Ïî/†™ÑĥĠôj˜ÒĤ€İ‘²`bC9{ òüIy˙žÎ[şçh&I’…4M“Ħž£IÀ¸ƒ… #÷; wáiK­ÑUĉ—T×H˜Ëğ­ĥäX&ĴßX)`ı'I2#³gċҕ³û>ŝéEHuN’–[J·q0ŞSwşQÖ¨ßêÉĴÒ2DµekVeĈGT&Ġg5½ê´_%,Uó÷ĴÙS%éúÀÈş‘ÎÓĦŞVPœù1ŽùŒ'Ê5Ùö@Î<ġz/ŸœëµĉjHĥ{P`£ĊÎTI%½ċĤéR íŝ{^Żĝރ°ŞŞ2MÓ,I’4M/çy~iê­ż?Ù頀LÁ"ӟ› FĉY5ƒÚRHŠÚdĠšWżw‡Ş(3ߨvï6lIP[u·`¤CĤw1ïàĦòÜЈžMNyŻéTŬì`0XJ’$½FóTÂbž:áF@­íw‘ mµ`ĉ–d¨ĵaB²}À0ïĥßM—WUU¤i:êŻÙ2MÎíëo>‚'ATj§M£z˜_ FÚá[Kğëtžm!DÇ]cĵJZ9‡–QŞ‘ˆ ıÚ·nS˜‘A#>|Žjáŝ÷î?(òü3+U·R–e1yê$Ž wfŞnKrìÈÒÖD$XG_ëœ!I`LˀĊm½=ŻÛ \ÏLšÏóüRüÁËïLWóKT¤`Ħ§Ôc>ßt02*6$t*QßI‹éÈŒV§éD폧Áɤkżşĉϛ“ĤcZ²Ö8X P~ôSì£ùù)Oĵ›çù$I ƒċ ˜§§ˆ ɝFLĞë$œÊÎҖ\§B6¤%ßÌÚĥ·“çFÉÀµÀA5ËĉùĊŭŻ˙ċ)Ŝ‰ˆ!ïxŞžä ˆ× F5lŞ ÛlĠŒ¤hÀȞŸdĜP%šñäĤ÷HT²ċȰi`€AêG>xÇGùÙIÈKïˆğwF'³,ğ$ÉĴŒ$cÌSœyêĈBEĠïċTvĥâ ŬwR •–4ĉ%ċv{'1†Á Ĝ  \§îĉó<Ÿñf?9³gñôĵĴr@x¨ìZÌdÙÍ#óÉz€ŸqjhQ£Ä3,ŞipE=ÚBÚġ#íagŝ|Ŭ}Föï¸Zg™.˘ĝè%ÜӓŸ˘*>βìR’$óCĉİ“4Áşž£ġ–şy- ÁҖĵ4™&X{Àœ½WoC›ú%OÓ4I’äŞ8ì}íÏO†>$•˘òış¤n2ÙNŠŭÈZM'm02ŬvIÛĠİ=iëۛnĜ`VÏ9âzĴ„ÏÁ†â—ݜìï°7ò<żĤéċ$I&Ib›§Ž²rĉİ =ìîèĤ­ŽH L§ġġxûdhşğo_†´)2pm)”$I2odàû?}éàR×än 5`Ğfdħ%Ó·Tŭ³ĈÛé>aÉÇċĤ‚‘aFú@ä=”—?@ùÙëôàè] F³ZȐ–eY ™§×wtG›§żġ‹Âı$H[ôÎƲ˘7§‡ÁsJ}Üv™Ê&OÓ4]6,iúŬ<w(“E zhóĜĤƒQc Œô˜s B63’VCĴ”ĤfÔ0ŞM£:Q¤-‚" ŝ‡ŭÁ\ˆê´2è)°ÙŞNĴDÎÒ#ÉG™§ LfžêzŽ&ż~ê‹Ĥ8‡{Z mÉ%*ŭF3£;§î†ÈÀÓ4•ËWÎî˙ĝÇç™G`’=ĞçöĈƒQëûŒuߤĤW Œˆ›Ŝ#†ê³—ÑY:›é{Ĥçhn0,i™w9Ì{-óT×s4Ñòf é ĥ`Ô.ôd&óYÈcĈèħÖ·7Sĵħ2,Ë.EqqÇğ˙x2öŞ”ÊT=ŬÀW2íFÌBú`ħüÊO^Ħ{wú§‹Ş‹oŜĞîڜ̲ìb’$sZ…8Üs4ŠqŽŞ!çh`DÔŜ÷. mI*oX’(Q{ŬŬ!C57Gn³¤JÏLJ’$ıšçı’żùïñ($*3Uçlû§éêt:ìç@äƒÄUĠs4%ÏjóԋZÈ0Ȳ,'˘µêF“ö9v4ÉċÓ°"Ĉ~;@Ú˘À8~ËĉYURp=*€ħÛi„ù†Ÿ5>7ħ ĵ(Š·ÊyÌg6Ùz` F3Ž Câ̗(?ŭ9vW—wòŞ³ÍSKLŜğ–_cHZ½zŒ°#H[÷„e ĜèMġ+ %#qg.áá^E™eY’$‰qżx½żx—Q•qĤĈSÈvž+‚‘B$ĊèxàwÊĊ³¨>~…ܽ_Ċù4Mgµa,ËróÔI†[ǎ6´re{|ıkŒu€´5ŻM¤R/ĴI<1fwnю9ĝ&‘j––gI’,iz9Ïó™gŝád–)• àûê'Ùĵ […`R52Î(>ú ö³ù.ĞNkUaGı5v½I°kR{Ġ:0Úà"ĥ÷2IážH[8Ĵtzıë&0 €“ÊÀÇ2$´eàİ8ÌUE~ñ™żŭˆB`˜ÏÁOïĥ5b@yŝM™÷Ë{wGoE1“ĤéœÚT÷M2ZbœŞ£Ĝ‘‹gB@˘nxgÎíÛҖM@LD ™; ÖᗘĵYv”ϝq_IÓt!ÏóıÎw>Ü-fŻR•݆e!›bô#€AL˘şĝ6îŬé]"QÎäy~%MÓĊ$Iz ì$İ:'d¸)ËĠ …äÍMĥÖÍ M]@4³‘XŬŒD†´>KZŻ/i$@I)EQešĤY–eËEQ,TUuùĜG˙ó\wçb&jnµl‹€‘ŝŒ+§rN<Ôó.TUµPĊĠ,˒,ËRŞ›¤f?_€2܀Ċkš­…{& mƒgRj—΀Š”2Ÿw1Ž_bp+x "QEžeY’çùJY–KŜĠ ³î*sż~ÒL[‚ Àüˆ¤”+BˆAUUiY–™î9ÚÈòQ@ê‡:vt„žyîİp€´Ċ“N’šÉ°gÚÁaÄAèXÒ$2q 4’%UU%„…"“RĤBˆtG×Tț×ÇÜB0Şċf 6ç`œƒˆr)e.„(ŞŞ*…RsëI½G½KĠmF*Äxّ#œĥòߜAÂ^JöMŒ9ÓĠkgIÀÚiĵş–$„¨ˆ¨”RD”Ú‰½Ħœ˙­KÓ5AŒĠiD"DT+éĈ°£IëGĊŽ\\çJ5=m n„ı¤-yŬ×Ï$ƒ5ˆOí“*İtG7ĈNȒµŽTŽˆdÛ›€ÀòóX néݰŒs€qû²RËı50Éu~çµ@ș§nvHĦŜÌ˘!gäi ²xHŞç!İĊ*µé*ı{êd DÏġÀ‰c’1fŝĴÓĤîqk˘ï#¨ÙM$$P  ŞU€Ä#óğL{û{8†t#NKÏbHĈĵ×Ċf†ïž‚M ñöÂ$eèÙr†!w.läÙÄjóIÒwrĠ÷Òcäİ’ \´;ío!3Ş3fÉƒ#ó~=; `|zn09v´I˓1mĴJî>ïÒ>B­KЎwl%MÒW3ò 6,‰1Fµ˙%Û*̨ ˆJ}i ;MĞ€bx(Ù`;ißQû‘80ÚĵR&ŬÑéi+Ĉ'ÍÖ'cQk…ùġ|ÙZ dX†Ħ§TêƒŜ¤íĥ 1eŝJrì(ìáßUN|¸•vOLn~] ÉÒD$ŠÂK­âRĤŞjÑ2k‚‹‰XÒZ‡ëšVŭEzP@•l¤ùàp³ÁH·H)ëoƒ’ĞêG´­âŽmv9ê6êÂÒÖıÌ3Î@Ğ'Ġǂ“|_3KZO9FcîĉK„15u½-F (´R €“°¤I nt#CZ5$÷Ì:@Ú²ëTêĥ×lˆñöñÀŒüÛĊ$,i­Cy=pBĞöb÷xĵ‘JÜ*0Ş˙N6ı]ĤĈ–×keµ°a#è.nì"mż†. mı5j›ubLïê›ı‹I™Ĉ°kÒö!ŜÊŞTVĞ'ùŜ*0Ş›~<•lŭËĦßcÍßyϝ‹ë ĈÛŞZ÷,;@Úz‹”yĴ}¸Yµ$â TËD]LȒh†4êm“aĤ4:$m0bš4s¨B9­2Žŭle§’´Ó.CÚ:‰5“µ@%$A'Èı>àY ŒĈ˙;!•=Ç-ċ#³ HjĠ÷Ë&áNÇżÛÑ̰â¨g#ıp€´ÏLĤkĈÓÙÔ,ˆÜ<¤PġçWĠˆUBk5ÈŜZ0²ŝÀ=½vĝf<.ndHÒ`ÄÔE‚ı—ÁÒ<"™%ٕB1#%÷6İ"¸qǛB“°†65eĜ:`DÔöµkÄd×ÀÖa7Ì>wóÍ mÙÓR´“˙̃rŭf̒3w~Ü$àj95p} \ü·Œ†l¤¨Ġġ?ôĜ7 ĵ.n*ÉĤ}ÀĠ mı° $e­îVb‡F}çšcŻl&İ AˆžĈpċÒ°UÀˆ”àBK2_ïx·¸nÖ*l™%;–äiËá‘*H“mWRİ;“Šqón<;ŭ7T Ġŝ3ކs+ÀŠ?R ğBbŒJÛ͖Ze-#z· mı5Ê1Ĉ­4fäßDä4 ·äĊчÏĠÙÁÙÖ#=ı€y\Oħu‡Ûö¸}²f’³r€´%Ï< Fêeĉ3.ÓÌıŒÜXV´ĉħ +Ù8ġ´†(ŜB0Ò7l*µ‡1ëÜsò­­rrHĥâɀİXsŝhħƒ4Š·xŻl˙Fk€ˆĥÙ_ $˜ïéIĥä$ÄÛeUÚMÍnS;@ÚĴ^٠ɖġ[ĵ·ĉġ0R]ıuÀH›R%j°´Ġš.ĥêbÒ/ž„ŞMşgÄҖğ4Y½H–SC"ҋĜĠnŝkSÊf†ĵÍRéƒQëĈMÎ ~rwrĥê5#¨ÂċŬÌ  ×nñŜşjIÔ)ĵ-F Ŭ@ĉ!ıĜJ!M"VK‡ H[ñÜ3kĥ25jž]'ùeŻ Ù’ĥ3މ jIî²M2"Ú×à me0"Òħù3ëÖí-<<¨.>3Ĉ@l 1#ó9fŝçÊÖO†˜)Ò1ZH[ûàĞ/k èVó‘ğPŬ˘ ƒÇV;Ŝj0‚SR ÷Bm‡ÒêErwH[ŒÀÔaÇ51ĤRvĈŭğ"‡H·ĉJ Ş$dYİ?Wrë€ç1·>ĥĊí†[ 7ÉÒV<ó†™ûPö…œċĠ-ĥÁ‚j.šîġr€´%cXÚMTÖb5eî™ä•T Éc#nş·ŒdëCdFP¸ÔÏĥĦHFıMíië~ĉö4T@Ż'ƒşçèVœĤ-…lƒË­#3ÈњġĉÖÇ6YOš)ı‘2ĥ(g 3"½Zm˙:Fnċ "¤ĥ bj:ëV#@Ğ˙tMK:/ğíħœ¤rù–ú˘éPÉҖ[£5)I²Ž3F҉qn%Ġ~qœzÌü-#ûŸQÓ*Àìî[ĝòÉAd5Ç2w|:@ÚjáĦħ¤ħ­i„Ġ)gŞGşùŻ#MV·I-Á”Òµ m—û0ÍĠĈ'ÌíiH[n.LġÇşŽÔ*éïMİD¤ÍUWĈ-£ÖşáúĈâÖÇÖgHžulş×ËҖ<ô†*UĴVU‹fZ)s#(nÁ˘”vŒ Ĥ³n%0âĴ_î·mx uûÙҖ|‡ÒtĈĦŜÌCânñŜ²²²ù†:—o-3’FĴi²tħM°HŒzu]lRĝî)Ĝ„Ë’uk2-.ÌSG!•äd½·"‘@)êqá[Œ]— â`äd˜Ûf³ÛBé^4ǐĥêB%€ìá|z8óc.ew‹Ĝ+ó8ày Imż¸[ F …*’{¨r2ÌíħÍeóŜa‘¤­ıH‡úŒ¤ġ9ËT•Ümê½>z&•Ü"ÌH/2,‰iÙ·5lÂ=4ÚÉ mıÔԌ§ZâÍ´á*Irk÷V„zšŻTLéVƒY`DP’oĦ™›ëCÚ6ɐú×`¸éájH×ğ>ëTSŸNϑ0Mî"uë[\öġtO6ŒH7Œ¨#Ĉ†~ĤcHÛŒH1'7SĈ1¤­Ëĉ™lúċ4;Ş’ ×{+ÈĞidô½ĈŜi+€Q³hT*‘Üx’í³Ñı#ı›Ĥ¤­{ubZY7â˜"Œĝ;7ŝ’ ŸsAúl02 ‰İ)ĉÒuÛgŸ×ëB:/;H[p‰ Ù0wÑ>‰H 4ıµ{ V7o^m0Rô­q†gnbìöĜìš‘–“;> mÁ[¸4 NŒ3]pÏÓ-9?*Ŭ$$˜Ż LoušĤÌĵy<ÄxşĜâ J6/pyVH[p’Şé÷$”Y&UêäSNÎPÎß.núeD€Ïu­Ĉˆ[Fu“ŞCÉr;ìu³ê!}.6;œÊn³=Ŝ3*ŭ^3'ĉĵoыi.1[ŒÔÂ1ĉLĥ×fWiğúEsŻžcH[!Ġ5ZUĴjFŠ11O÷(ıµ{kî´f`/m!0#ҒôşGÊĊÖi½ö.ïik^ÂY0$é5‡ó¤péÜš~ĈĥÙtĤ/3.ĥÁfׯ[Ŭ‡äÂҖ;ô¨é92ŸŞH×,ƒ"GïoÙ B’€J¨Ôg[Œ @J ĉêÛfŻĞ×Í]. mċ[Óù<Ğ·„+É·k5ı燢°ZTÂÚ²ü[FdÏb2Ĵš{­qĉ.ĥĝŠ’îréi+/QíÀPğ1ÈĈ•AJktığUŬü¤Ô×2Ŭ-F5CÒÀäÌU·Éf7ÇÄêĊàÂÒV H–33àt6ĈÚŜe.nŜêÖĴH’êóalk€Q –Ş˙ˆ„°<]lŜĤڅ¤-¸F™µVk9Żñħsìè½.ÔR³™qá·ŒZ,N‚\]bûlt’úĜ$w|:@ÚŞĤ&m'k›•-Şîĵıôµqbg5Ħu‹€çu£.s~vÛcAé4ˆŝĜé mÍ[“>œ<Ĥ êŜ›Ŭ;Dş% ‰HÍEŞŞ[F­>$Ħ{£ôeĈ1¤m·ïÛӐĥ\H–úcÙ4ÌfD’ Ŭs oµcê­#2^açÒöÙ$Ï=ĥà]Ébïf@`Ġ¸1pËÀÈc ĈÁ†ÍKo%YO}Êɷӑ)7-ÖÒÖ#ĤstÊğŽTç½Á£V]7ŝ-3|†˙›FĊŒ„hĵ]l v$ÍëÇ;şáÌU7‡ÁĞĉW͌Ìs‚š‡Ôşğ¸ù×-!F ĈÍ£U È=€Hr'zÙ[}8÷ë^4ǐĥC"͌ m‚*5ĉžıIµÓx.n&C‚îAÒ#Ìq‹Á¨uş‘ıĊ€ım¸}Ò!cր H[‹!ikĈ™JÓ Ş½ÓHş&ş[ÌŝFŸ%·ŒêFiŞ*à˙ÏŜ,9räfÈ"gšĠAŽ GĝµôÈöĝì“OŜXmXҌFÍ&+2³*ĞX$›3lV–üŭœf÷pĜV€DâtüŜ•d2Ó ¤Ĥlžĉ]ï˘ğ08¨ŞHï9:ñÈ{µ^¤Ô§½¤<Ò|u ,E4¤áì1nÉ µi'yš"’yžgiï(§ñR[!O0˘ì{5gVBHï´6`Tä½-§Şa; jèÖÎ5HMzKž§Ž'îUʞQ>“ää›×q$y²ıšm}ÍĉfİŠ™gG›²‰È¨ÀÈ]ÄH{¤×i´Ñ֘çóG&~*“”ĉ™k9 !ˆt]ê—Ûġ4£òP_îˆupÂôšRú š âUĈtœçŠşNR…—Şx”Ôƒ³Z˜äeÌC)˙nFù욆.žĉ£Ĝŝ‡=ï•˘gß µĥFû\!ċ2‰ŒÊX †ŜŻ˘>½ïÚuíEFŞâ1ĉµÇ²‰i2~ó štœrj.GFÚ)ħƒĦsKCⓣWMïğJ2ü­ÀhĝıĤñċè5 RÄ=ĤpÍRkN“–³FiIğÔah1bìĴg@Ê´^[f׆QŠœŬ-A‰â­|àe<àĈ‡ 5ÉKnà½'ÏĵÀ(Ô ­% ÉqŒ­£Ù-ŠjGsĠ­98’³\3€ÔŜġ´gTş2„qLĥ0˜oŭè50SvÀ(¨N‘uß!m&:’ŞÜ›kZ[£°gT bĠ2ˆ=‚ç; ĉƒÍs‘Ö‚Ñ|Ğœĝg{+*é_wab,@j2Š÷(žQŒ)2êmô˘è{µžG›ÏıġmÁÈKû ŻÏGĦ–=œtK`D•@jÏcòTÚ]ŒORd´JÙċ}%ô|o!zŽXU$ÎĦħŒ²Ÿ"š[=oÈÉİL&ŭRs6OġĵGYĦû·ˆ‹÷ŽÑYĊY416èBµŠ0Êϕ†Rô²)güà!¤Uö‰ên F%Ó)›ÖëX1Ġ?9ÖŒ4z˘m J%0˘S@jóô)pĴ‚Qí­£çڎ.8ĠF"£|gx˜™xìÙ?ڊTÇ!}nDHİQİ,Rs‘>ÀÁĈ”ŸQ˙½Îµ !E"ÎÊW…Q.û.{Ih²qŽ× µê6ċÍó2°+§‰òXséeĉĦ£çIÒu‰&îq²·*ŒÊ?ÒüMˆ6Y×P< Ŝ€Ôz8ïÓ1Q’Ñ!]·ŽbNÏiٛAc-M~‡ `Ñ<aÄh€ÔdŸ'Âú¤’NGOŠiĠ] I´Á6£$1zb#<òY!Q@jH]ĥ1%::ùX3tHk7ËÍہQy=’ìIl Ĥ… 5¤öieÇbŽ–‚Œ)"/ŭ=18ëĜ²Ĥ‘È(Á(ġ²[î ġr.ÜGİ…ċY"ĝNsê.7µË7—<¸SŬĞDHTĵÙ9hF”bj[zÚĦmx ċm\³GkÇ[€ġY6ÏËy$óÔ! Êΐ’YŬ b§t^Dğ.UÚÍÁ°ŒDÄC'b&ö¤6—R‹ï`nŭ’½ñò³ú’ûĵà=+zĠ]:ĦìK#äŸ £ÉóıHìÓ7‘Ù:ÛZXċœL"¤ÖĞÈ(ŻQëË|¤<ڜèh½èuoÓ ŒêÑċŞĜĥ-y9CBœ"¤ĉ¨OŽ'ŒkĠó$Poèı*mƒtÖÀtm ŻŻœúç`ì6ÖSò¨ŬÙr@İ£—=oÏŬ*i8œVF{6@Ÿ!éXz_˘T÷Ċ‘HO‡QişÛċ˘ÌÛ6Bîê²²‡Ú{вâ x4è°oä'íxĞW5$ı’Íáòlwĵô³ÛÌ2 y†•O#\ô0ħ‡ô­òj&’ûxŜ¨œ=2íÒZ—g(·÷ĥ`”›:ylì.yœ"¤6èı1rK­ŒŸFÉ]Ü"3‘Öp,_U‘-fOŸ £1MX¤ĉ†²•tˆT‘6Q@jnÖi:wñŜDCH{J‹ƒ‰hGEÎóí‡WiH³´£òÚJÇ´§‚QĉHíFñiĦŞhH#RÙ·³fW÷h3@b”ÉÁĈU#£´V̍°F6”É×*¤n Œ}¸¨²{Œê n&*šÒt•q3ĤŻàÑzş*³1ħF`”ŜqwQXnä³nù1â=¨ çCÔà +§şWËdŻ6·çñ %ßυQ-rU„‘x ŜûÊ[­K4—|g§Ħ2:^F—OûÚĦ': §~SS0*ëA5§ïpXÚ˙°× zIy¤6MŜEgĠŬVĈ˜ckÖı2Ñ#◺!Ĵ£üĵäÛ"… [ùw€ÔrŒ”úÙd_y,¤•ŻNPñKÍâւÑ`Ĝò‘€Rƒ÷p|t$DéԐZô–ò*lÍDކ& £ìĴÄ܅<¨Ì^˙= FOUĤH•ŬğˆnßßÁû`_†È¨lT”Ȩ D÷_}ĞQVUŸtWqġ\G ÈĵEV0Z˜(;n:éġFİşŠç­:ĉĊ Ŭ.6„K0ĉ}KÔ¨Ŝ3⌟ Bj|‘ŞĤ .*³ĠWĥ#’}ùJ½ĊžîJ*iŻĤD%"Uż1ÉlnÒÍŜt‹Ġt#ÏÀq(ĥ˜Vm͢$żôʳW¤/_[D„Ô’Ó”Î"Ù8ŽzHñhŝ‚Gġ Hi)‚MŝhÈÓŭXEEF³h#=‹˜ÒoĴÒtg4ŬdTAŭĵ^• иި§ĦŽÓtYdt Ú@ê)öĵH<âϤ6M éıbFÎÓt޽x£ê·[¤_LmİjQĊDT¤ïs`˘g#Ümü;Ż<`ĠdkL“ÑQġŞŒ²´#*E>z&>ĥyÏ{ˆ ‡rù°wAd· ]z-ctdàDä´v„äV5V%RHÉDRJ.äóFfùŝèR; Ž–ä‚Ħ6wùö*–G‚hŬuâ•29ÖDKŠÙ„]†ˆäëĜ‰—ef£2ɑ°IU$öâ ´çRóŭ‡Ñ€Ġ°³tXZğ½h·Q AÜŭĠŬ{w7O„ZÊġ5#¤rÉmz& ¤&ӁKéM¤Ó*eWĊE~koŬŜ0ÊiÌ]Œff½ğÌìwwí‚è~'ƒˆ™èn'-gĠrÚĴ³ !=oNá™Ùïfvp÷“ ċ\r+RZŒ2Y6ï)iÇ^@jPj§gĤÂÍ2 =LW ´™YŒñcüÌ~ŭç§˙ċ÷ƒĝëŻ9íĊOċZyŠhrôꣃ‘hâAEz'ŝv"e<ÓОxŞİİçë]:żG“ñ|‘ˆ3ì†ŭ£t8VÄEŽ_ÜÌ~‰1~1³cŒ1Ŝ"ô4U(Ê@jÑLĈ˜öŒ\*gU´D„ôQÒRcŒ§Óép<?í÷ûŸ˙ë?˙ïŬ˙ği˙y?l•²î:-<Bš:ĵ֞}˙†&Ŭzù?3”U¸‹ğ{/˘_ŽÇżŝ|<?ÇK@’{£%ô@ -žLÒŜ"Ÿé‡żĊD÷¨½Ï½Ö5ÒċŞŻ]ŝZîw"Ò}˙ŭ÷ùñÇĝá‡ŝċǏûîğïŝmżß˙k×u?ŞêGUŭ "Á}ĴÁîK}˙<ˆIħA)N¨‹ŞûG3ûbfżžN§Ÿ‡˙|ùòċŸ?ŝßß~ûíÓçϟ_s\³ĴżËx–Ú#e‡ˆz^”4LDÔÌìp8ĵv]÷ID¤ïû~żß˙ÖuŬÇÂw"òÁŬ Íî/Bêk^gŬö§TŭU`²|€×rÁÌ~ïûŝ÷———_^^^>½žN§k{H·‚3„Bï "‘+)ĴÓéÔżĵĵŬ]O§“ĝá¸ßï?…ŝ˘ŞûĵŜğ ˘àîĦ¨ÜŻ££;Á49UŭÌf02ñB4³^DNfvìûŝñx8/‡áġt:ġr½°A€úÓeGˆîQs‹rLÙ8,íê[Iáu]×ívğŬ>„°Ûï÷B;éTµÀ¨·äwÀèÑ@ş%[€Ïüïëç¨B Ħ'CH*H,~ğòoĉÑÙ£€ä"œHÉ.E?BÙ7ú‹“]¨9ŭôÓO×ú³]3.Ë)°úÖW·S-}‘cnÜ.=~Ŝ~ö³ù-^ˆŒl!ÊşĜNhöŜ!´)ħ‡„Ú[”:ïzĞÀaİĜA%íéQÑTŬ=QÒnä&·Sx~F— ´4'‰-$´Y‘²C[ÔÀ„B+ÀèZên)-çw‚HzïÓÒ^ÓĠâ „BÏÑ5(-è ĉÑÒ€ ¤·BéRôôV&j$b҅ÈäÚ>ѵŬ£t Jr„!€„P;Q’\‰”–€UïŻÑ=eß÷FKrG4ô–û$„ž%‘Û{I—"%ÇÈè­ z tŜ2`„B+CéVäô@,íù;½î·FMßòw$„V†ÒLí'Ŭz÷~ŭß ,`„B AIÀd)ÒÑ;Œú£Ï!=T€$„“<0ÒytÚÎôX „B„ÓR”_ù<­üHŭIġÖè¸ ´˘˜‡„B¨ 11!„@B!„B!€„B$„B !„H!„B!B$„B !„H!„@B!B!€„B !„B !„@B!„B!€„B$„B !„H!„B!B$„B !„H!„@B!ô˙R˙7óż¤Ÿ>ÏIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_GuitarGrip_Button_Yellow_512x512.png0000755000000000000000000012227012467662066024535 0ustar rootroot‰PNG  IHDRôxÔú pHYs  šœ IDATxÚì½i$çyßù{ò¨Ğ™ž́ƒ$Â$ĴÓĤAÀ Š”KZ²ċs7üÁaymËëu(bċ+ÂŽÂv„WҊ²x€‡d­ĵ²$Û˘‚2A‚Ä1À̘™žžğëÊÌg?ĵ•UYYU=ÓŬst÷<ż˘{şŞ²²²ŞŜç˙>'†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†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;ıÑüİÏàŝW‰|`¨rìÔÚ³ċ²‘$¤Ÿš¤ħo=êjµ„$·Ŝ‚f3ïBPϞƒçıŸoG˘ˆ0{\¨5œ€¨5x܃W£ÄûÀƒ(/ ĝú‹œ½Öy>÷I÷ĵÈ)‘”3/ öħ0 0Ll€g>‰?:Ìž<Ċŭ?ô““Ŝ¨ğ§Jg¨óxĵûnGĵóNŻxû‚€(ss½Ç˜ŸƒF˘„Ċ–f -ï@ ĝ[g^àßz O=KxpbC=óBV*†a† €tWŭÍ{Nñ‘?ñcÂÁCÊŝŭ‚ç9£Ÿŝz âŒMˆc%IœñOĊAtnOo[YâX¨×Ïï„г´žÇìل Î €Ë—Ùَ0HŸŝœ[΅ôö(‚Çïžyż?Pü<˰çі6-Á‘R7ςa†ħëÀ3Ïâ//2|ì83< …~NœT°#Rž$l*‚Gk—ÎŬĴHPĠƒŬŜĞ„Úö0aĉħàùÊĠĞÒŝ}iQ‘ĥ§aeĊçòeVsĈ:ï™X\@ff(hÜ}žħB ËĞJàñ³À_`m bR ˙ĝG×Naú^ä=$g^ aS0 c[ €ç>EĜ¨ñŜ#GùÖŭ÷#Çî‚RÉŭßl ÍĤÛċ·\ê]†^ Ċ2D ŻżÈïġğĉO=‹xŬkt¤‚šÇÁ0 ¸é೟£Ĵóž}ĝÖ}÷ ŭ(Œèhv×/¨*QÔrĞŻMt[Öèv˙mˈ£k;Š’<İp@”µUé#Y#Ÿĉ3$ mñenÎ=çÌ =·% \xğ+„& -œyùĜx_Ñò 0ŒÛ$~â'Ñá½ïƒX˜˜„J{ÇÜrħ·=ém×"½O?c›|ößéŭ;žÍxA<·xlt?˳ğ€ÍŒxh6µŻ ȧQ˘juĊϽ(σ+W” çÈ€nĝÂëo¨ĴáçŸÇoy,˘ˆUàìc£˘{ÏĵÀáŜœORʽÄÔ³ g^ f_0ŒŬA°Ġ<ñ4AñŝÀƒĜğWz _JĦÙŭ ×/úŝA·ġ tŝ&íû~1ğ T*î§3ĝI.´- …nMµ^X"I Xtç  IëĈŒûžĦ!áî{Ú^/‰;×tm îP]ë=fgáÜ9-÷ċ ıçÁOòÙÏġ†˘– nòóÂ0n‚ĝLf½÷éıORÈ>6WbÙ°°„aĈ.Ħ~,¨‡Ċñqg =OîÄó‚`í[e#ÂÁŭMÛ{|w.Ú6êŭCǛ0Ĝa÷żğs:vĥRÎż~ĦžŠ‚°½(ğŻU’´„K‹İ)xÏ{ăîj‡(ra‡'´ïuV…ù9tv–żÒïZ]ı˘Ñ§’ŸÉ?4‰Úa‰żÙh=pI‹QânüŻżÈKƒÑ3Ïz^G*ä!†aÛPˆqBZËÔ°ú2(ŬġAgħ”Üw;XO<ôŜ·ûufϽŻp(tpÈĉ3„ÏBġ^ËA×(›Ó ê ~Ħ•ĦÜż)]Çi4Ïë$,f½ ĵóŽv%KĤ\şWgùûyC*,\ĠžFK˘$•/#}œÑÎkuçT.Á;— ËX!„aĈöxn’Žad<ŭ½ßc6b€ŻÇ(nGñàî'×wî…ġ½íäÄ֛ZlŬ_<éÊgh{  è,vVZ43Â!Gıû=–yV¨$IàôiH’Ŝœ„%'DŜ|ĵ´Ĵ#¢’$èĦCÒw‡˙ÎEċĜÑĈüŬGXMĊE3n?L|ŭEF]§žxŬŭ ²½ĴĵÒ0 7Èày¸Ì˙Íî4p+Œo²sĉ×;÷üy‡ĦäŝŬ›k~“ƒġĊC6„Égž$­2Ċb’¤ó˜ĦáŜóĞוÑ1'î:턊Ì1×V……$~TЏÄ+Żèh8CŸ$×Òhì›êġ8$ ,­€˙*ŠşB9_BĦÀ8ä kŬJ„ì9' yĉb[6 0à‹ž˘ĴkÀvÒî|ğ‰‡ë9ïì}ú•vn˽Oá`qOÒÌ'CĈQ˙û•KÙdH骔ˆc—àX*)ŬɚibhÚĜéğÄÏz–—0yï½ŭߐùyáͳüLvׇzT×`aĝ'?JĈgÑlş’ÎĠU ŝlŝ˜ġ*IeXze½÷ êÈ$vڀ*0ĥ7¤ ݧÑéi8}ZxäĦCÂŜ} ĊŒ H³˙ӟŭş˙íf’d÷Ÿwżœ†,Ùü†|s§ġH“!SqÒ/i4› YĞġz=ÒÏŜ‚ëːż=MF}ûmtyİ×X‡ĦÈ~ !^nv£ˆO/G‰ /4[-KÁ7żÁ׺~ŭTY¤aÛZ<ó,:< =Ôû§“.7uşßİÀÄġ ‡¨)È:|†~Ïç>cÍĤÌQIó'ÖÖ?çܜûuupŸ‡W×ŬÂÀK`µKK,EIçû–¨êžÇ/ĵô˙b€(èÉ­Èu|´FP†alŠà†(°‹y³¸÷˙ c{½Í–nÇyg]˙Ù°Dr"ŝŭrÚ §bYWëfË'ScĥB C½b4T5:ÖI‚Ì‹tHĠÉSIßkpù’ÇùóÉPŝz´^Ç[oñÏ˙ܟçŸgÏ-=%~ˆÈTX´tĝwŻáU(Ĥ/>ہӚ:†qCÌv”ôĈŸ}_ìêncğ‘äÂípÎתɟs*|Ÿ|†Ô€Ż'†ÚF7îä, tċ/ä½ġÌ,erĥísĥŻEşSQNßëvòÙsX\ˆ"x˙ûaa!éùÎ,,ÀısúCIÒÛ zÇ÷Löx"Ħ(WçùŸŸ҈"hDèp…O½/O…NŽOÂİÓÂ}0:ş=sĥkÜÚÄΈ;ñ|×X•=N6òZϗÍgÈ çv%CÓ „F]~ĈŻ^^ĠÖüĵx^{Ġŭš_Ż E•ïüOŠ^v“Y[êUPá!Ï£´¨Ġœ—¤\Á;ó =k\£İĴ, ġşèğï&í0J’€ÂW.]TĉĉÜy|ösÌ$œ!*”X:ó<ïKóSŸĦ´²â–?.eÜħ ŭuO÷8´%c|_úw—SçÊ܉Ĉ×ÄÎÛɃµ‘ioÏëX•½VéŒħN½ ƒ’!³ÇHS­<èî “$ÚÊgè|ŻW–…ĠUjUi6•fSö4¨Şòîğ™G“Äċ ĝÂż[[£Rݰx àÏ˙)]xG <äÌ ƒË% c÷€Ĉ'ĥY>Í 5ÁOk­“ĜíD4(“O„ÙR)%ŠOdàb˜ŭr6:Ôgğ^Gĉ]ĜÌy—™÷,ĝŝàôËi({“z²ù ċRĥ+¤üİx˜˜„É=I;q²ÑPßóœ08qByï{…fSİׅ8ÖÏ.Ì /żLôÙÏİÖh§“ˆ òŝYz{œ˘ÑK/ZNħKÀO$ żïĴB­l÷Ûl*QSHmï uiW/ä3"£¨{—áZÖêÀ…-İç¤>‚ ö/†nxÁŜîöZŻĊ‚‰‡Íœçz9 YáïÑ/ŸhÏNû(¸ï?B'ĈĈŬ 11™n ”$Ħ5áJ£ĞĞB’ï^ŝŽ›8ùSŸáŸF Ĵ,Ż ­V) Ï<‹E¨U!;Ù À|’à_ÏB’Ïîڛot˘Ĥ5ŬsĊ­Š„t‘Ĉ ƒ°ûğx=팳‹V˜ğšµŞôıż^ôrĠÌùóqKP÷*™ÄŭEÄNĉ]Ĝâağĉ4äóòçšd„E*J­ ó&QäDçAR„ğïqQUjU)Üu–ŬĜê%¨×•˙ú;ĴŽM|úS²%ZúÒ]şċ§?%ÁŠê7żfžcç Ûğtèv˜$vnğjÍŝzÍŭ½ÑÖe°kwa³İĉ3Ĥ•²ty²;ûĴkħ^ "×½h…Á`DçŝşŝÂ×ĵ†€ÈœOÏàÑ /ĝ·Ó߈ϕ‰ˆÛc·ÓŞîïlï8ë$iġZ(ıż…(Ğ $Ş.tıû‰À°°wokM¨9½qü¸°¸¨²²˘•…tx­V…Ż6# ÀÇžûĊ$‚Ż|™ş}ŠŒm/’êñµ›Üê/tW0Vê §àëuVs£]ĞUËk6µĞ?A:Ìhd¤Ġ5ìFÏëĉ´ÑJĦ¨m‘}ŬÎĠ¨‹ŬeRÑlĥĵ ­Ċ¤QÏìâ[ËñĵÀÈgMÚG~uҞħğëċ8(Ŭkò9˙nÌħŭÂVĤ_ŜŒsì>Šçw …˘KVŒNYd³áD}ÑcJ’ qäI+<Żĵ˘Ĵ­ÊGWV‘S§‹oó›˙XŝùSOSö<âŻ|Ù* Œm**n÷ŝèè­7ôA?é.‰…8rÙtĈ˙­·Ü\÷ZUh4•z’t:¤% rċÊ`wzĦ…P(–`P?}ûZ ASÊĈ;b!ŬĠçŜ˜@Û^…ĊÈ×v&t’¸ĥ³]ŻY3Ŭâx²Ż*ĉéóö§ûŜyq˘ š ÎqH]· ŜµĤĉ§òmwñ`áöyn–pè}Ŝĵ`î|ÓĈFq,Äé#T˘X BĝĦ†Fb oİœ;'˘ZĠŸûô§äŸÍÎéñr‘ƒÀï<ŝ üXHŝ˘ċ Û@Ŝííußç˙Ŭž}ž1†ˆ‘#ÎU·°àvá³³­.…Ma~YjÖ_@ÖV×ß]W†”ĊĊÎn!=§ÔxZŭâÇZ†˙ÒŜcD‘ĵ’>gÒ_laÇÎÈŜÙzKDdŻ[vWߌÖ_²aŠ~†usò÷͝G÷ĉ88×ı˙NjÑlċ—wžpè^“:cŞżSjœÎxh4\žAÁ}÷ɓ†ë[ŭï›orvĉ²gVċŬwáĊ—~´bl€ûÀ{¤R`tDúîônġ—¸é^t%ŠAàz—šî†RIˆ"a˙~·Kw^‚^OÂÜ\gX]鈃Ĵ‹0}L3rĦ…Fƒt"[1 ­°ÉÜ\˙ĊPT X\ì-•j‡Bכ`hÈċ2䳈¤ċ ÷İĴ}wĠ  !P(ö˙’Äġc͋‹ġ’%û§-"6šgäKŜ ‘ÏıèÊsĜ`Ží6ÀžĜŜÂac˘ÀU% ¸ħIB&í$é”#F|àaċÄ ‘84Y]&'U…ÓŜòóÏ'G˙ÚßÀ?wq ŭoĜ@$6÷Oşvu·Ë˜TĞ ŞnÁox.^Wn}i¸UŝWîÌ(È?Iw·éż§Ĥzżìq,HËğPĞ+ËKÎĝÔjô­_VġÜ Ykߝꊇç+Ġêú1|ÏË^ëŜ²ĤBÁ]“ù9éّ¤""Iœ˘\–Ö@%ΔAD$Œ ıÛGF„°ObaMyŬ†Yœ@i`>Y2+ ú½·]÷Íy}•çàŻҐ>‚ +Irƒ=vRxÂč_‡wXGèĥ }'â$!¤&Ĵ”ĦŜPFFñÖVá§˙ \ş(#µš–÷îC/œçW—êMùèŻ<ó,Ż|™š½3Ĉ- àkkr—¸ŬµkĞİ·ċ‹˜~ıRĊŬHċw­î\›MmğÒÄT…‡}z˘g›$‰ĥ›ŒT*ÂԔf^vĞÇ@£;GaiÙAÜ5ştħexö+ġşöìdëu÷ĜZQUXĞêÀëEL ĥ,Ĵ,ŻsŬ|ee5›ï\·BÁU@,„ŬB#żûóډ’ŭ:µ9ï KBħ9vż…³")vDMWâa,û'Ç;ьúċ9ô;Çk‰ĴŜĊÊqĜ‰b½lŭ;U< zŬךó‘ /Ŭ:“Ns(„Ħ!çġ”°ż°ożvíÄR#–&ĉċ ëFeŬ½ëï¤ÇŽN8 ŭ?Mœ-˙ëjVw’vş^G,Z첅ŭîŻôákn͒ Uôm€”ğĥi> s]Xèxú&ùùJğ&' ,.WO½$ƒ(5cô{ĊH’´ÄhG­F-ċš4/qa'²úW@¸Ê(;iòĈĥkWĞŬĦĠj½†PëƒkžĵNbĞÊ@OÈv7c§½“ıžu$ŭ>‰—´ż÷Í´şİꓳ³ÚkÊw_†µożùŭáçûO=KùĞ_ĥÙĈ ô$ÑöR’îŝó „[Ôz<Ù/W*²;=.íû´ÇĤC„Öû"'Ş’/•“žħİùÇ÷ksš=nœù½Xì5òÙA*ùsë}Ïòùëi•am­5™­;Ö}{³é"€ù9w zVx£ZsnͅyYwĦ_YfÒÓÊŻe¤+˜ŸO+}EĈàûBĦÉÄn{mp “06ÖîÈ~š‘3îa(H÷ı:ïK?ÏÔú‚6ûž„]ŸMɽ‡Úh÷rÈ9|5Y?Ir39 iÜ.cıD{Ŭ ŬşT,ıÍHXP4I󜞞v“gg™žŸ•û>|ĉ/ŭeü·ßFÏĵ°+‡¸·Ràáj"Öŝö ½6ûċ‚tàG§İOjĵo§ÖǸùùĊJÖġ`hçĵ ~nQÏ/€aß5KÏĞ\è UôšžƒÔP*evšİ·Iĉ'?îġĵ~σĞWµ=P·ŽÚġhX­Aue°Ħj4”˜Á˘#`vօ+:×İ“c02"„\™ è,ßö´’AËíjŠncZ*µB•Ŝ÷9ïħJwìAÉ-h}†Ók6„ÊïîóŸEßëŝ$f%³ïË ’;ŠÖv•QôëğħžŬ.†w3şnµWZùž.dİ~‚çğCħ $C0<˘=F0; {Ĥ„ ôÉÉ)ôì[üĞ‹üGàíÇ>Ná›_³&Cw2›<ñ4rĉyôıO˘““àûá‘Gn_ 5ĉùŜy|żÛâĜuJÏ#{>7Úħ™ġkٛßñ÷x bÙyĴwnqÒŻ˘Û(Ġ[·‡}Ž—Ÿ‹oÑ͆cÖÖZï›ß½W^ı´äŝT­~+Ëγħ²ŞĞ ˘ÈmœuŞ ‚P{BKùœ‰JY(ßóHTñDÚŜOZ͙T˜ÜÓòè—Y.wŞ-ú%KĤ‚6[m‘QĴgäÂàúż_×òĝA'ÇÁ Tñ’ž‚ġB)ŭòCĥ‹hĜ %Ħi•‘xĉ<ÍfKÜ5…ıyċżŝÍK%ĵrEı|ž½żû̚4ÀĤ‰›­)–mñ%½VÙġ,lA[룄Àf’|sŜsÉy 2ĦЁ"˘Ç—‘ôx!4Y˙ƒ’ßŬ—ÖıN•²û™MÀë—됁ñ‰~ŻUY[ĈÇaßŝŻ={˙ÙÙŝ_Àyê­ÇêŞ2¨r%‰…jMZ÷éO3Z-­ éW1ĦŒO(I˘Ì/ôÏ )œah¨(êĵĉBĦ#ŒúUo ÒîĈ™ŸH PŻI—¸Éĉlrk*.óš~ëy›µüġU|O&JFıjġ|+j?—Çǽž˜Ûa´o·×àz Ŭú×I ,Ŭg˘ZÂ&>ö1Âı92ûÖ·äʞşä+?95Ċo\ĵlĦÄw:ï,ÂÚ³³Ùnmg·òzó;étçÛ}éé#pMODnÒ>k‡krÒùwı´ŞŸ[9Îĵa¸'"{Û]#ƒ=ûöI&Üӏca~^ۃĦú]óĊE÷¸ùıġß§Ġ5—Q]p?ßġ†p.˙Á÷™ŸïÍȞ÷0 {DŞ\œICGŬ×8 •‘‘îdI?-Cóşga8CFÏd‡y/ßġˆ|_‡ĥ@íFÙŞß%ƒJ1³•B"0<äúŽ”K.Ä9<˘Lp߁ï}O‡ŻÌµo›+IÂW˙Îßċ/_Düo˙ ×I£q}_‚A1›i ŻgşXváËÀ=Ĥx; †Añéġğ~YĉŬ9½e OŬïú9ŭĉJÇ×|z½q. ²=´ßÂfßët'?6Ŝ_X¤1úC‡\xáĉŜ×­êĵİç ^ïßìhıŞÔZĦŠFúuBô<¨y,ÌŻŸg³²˘Ĵל;ÍQ({½7‰*/Œ;C:<œo.íύçÁ°R=A³Ëğ’ùŒó2¤Ġ İÇĦ^o‰é0ڟħ´¤îyé{ß L܀ž¸wĜUϵöuKFŭV ƒġ<”’^àğïžxB8/ÁĦ ÓӞ·ĵĴż[÷ĵò=~ö·yóìÛüc ö‰'İĵôkf&M $Šzw‹nħ•>‹üÖƒà&]ˆàÚ ;n¤ q§ ˆëıoż×Üυ›ïœ˜÷4dġKšìíÎ9=×}ïE!ëÉ*§Hú>oİÔù=êGżËÓċ2}{cdó`‚@XX\Â7sYZß3Xş´˜ĉ:êA IDATĴ/âÖÖÖ ı˙ÂâúßÑá!Ħ2¤-QĠû~xŒıçî½öޝÏÀädçyjt t]Iż›İK;yÂPúŠùzkì·ñtô[GâĜµèÎ&ûž×“ü¸™jˆ›BXï{—ï/ĝBĦ˜PĞ ‰Ż(ÊCÀğçÌ^‘żóûż§˙×°k~7Ĥ™Iq%Q/GeH7§ÛŽĈ.›lu£ĵ7ê ż“„ÄĉC3ëċ< ÊÒ__DäéÈĉ=ôˆŝ†ĵ0àĝiÎCv';ȀwDu ë¨)ŒŽôíÙÏċÒR÷”Éü{03~şž ƒ üÚŞ°´ĵŝû67ŻÌÍÉÀ÷ó•…íûYm&0RQ.^ìŸŭ>2â‹y‹ƒŸkhŠ…Np£Ŝ˙ûÒî]Oê½s#²"ÛÍ ÒëĠì~éyûlʸßLAp­n”KŞP.ğ^'…VƒĦr&'µ8>'N 3Wġ @’„û“„×_zÑĉ ˜HĜúiœmŞÒŬkŜĜ>FġNIŸú÷k%Nöı^½MœóP, ~Î~!ħôĴ‹Ewïĵ+ĵŸˆlӝvġ~pù ËËÚ#tÒëŜlj{–E>ß!u›§ÂıZ–Vµo('ÁµX\,JeEJósò}j ¸Ü'ŸĉCx왂N¨!횊´$qϗíߝ߳›™0èö–tĠÖ-™Š¤|†ofo@NF: H¤ŬAU8pĤ§•…y‘‘2Ʌ ú½·ßĉíÇ>Î/Žò4–ċ/~Am$ħy:ğä$ví^eâ;ϨîÔ°ĊV*A²Ż=?zz<äsĠ92Qír9çEġóD䉢´mUwîC:jz½¤É¨) “ŭ^{šïI˜<Ñ_L--µfP4çX¤M˘ûW]¤“ġşP]ÓÁâ.€·ŜÜß …°P*Áùó÷0…ÑQmíà+ŒN@”JŬyiŜB6ñ1M–Ìö^h6rMÇBm…K¤Ğ„óvxúáĦ––PT×v¸Ŝ&&áÑÇԛ™Kċàûoú·ù—ôŻ|âqü—^´yw´È~@oV|ŜĜıŜ†Ŭ$"÷>]ğı|ĉyŸ­q~F@ ž¸Ĝe¸[äspú…*şÏ;(CœôKbìNšĴgó%DÚ"ÂóœH¨Tç14êÎH´"ŭÌ}!ŽË˙êUwûòrï.;ġD€Ëyh4uàg+Š\UĊzƒ°ĉ—IzŻġèˆ{Ŝ‘Ñì9BĦà&ZŽŒ(ÒŬ)ۏÁë$2{­YĦĜl ŠT8ä…ɵG[ŭN dCé$nF‘°oŸ²oŸz££Â… úżMNòsŻÊ?Z\á?üÄOrî żfï8àµİ⚁¤-*w:‰ż˜ˆ¸ĊŻùÚ}zwŝ[ÍyÈ ˆA=şŞbÖŒUj ½Ê ‰ÖĈ­Ër;œâD†û?j •JĞaRÎ;V]D‘PĞ+‡ö>תúÂUDôC ­IôV0ÍÎşû\ĵ’IôôÜŻ}{…ÙÙÎLioztŭ)²­šÓû……Îïç?“ÌYĵÁeù×p£Ğƒ[%‰+! BĊó\ŽÀ='àî{(9";Ĉ˙ŝêĞüÍóŻUl•ğ=µ;fĈßĜ"b'½Ç·ĴY니ì1|ÄëmĠµ˜$ŬFMó3'ôŻÓ(Ĥŭ:yDíIĊÎıŒÑÉôÏzEڂfÂ7éóÜà*!ÖÖèzŽtvFğ\ˆ+sÎèg;SÌ^Ġ­Ê#Ê₴sĦJ%—ĵ8:ê ûÔToûç4· ÍÑLİm6ÁzŬˆÏ\o² ûÜB&xuĦ wߣ<(Ŝ='ñ=èı³ĵsġ rlWk,ڊu€¤µ#í_ğ½Ó ŒğInÎ(ô†+şğöfÍ_óğ“Ù †í2ÚÙɛëípóÇO+ 4“°hH–ìrĊMħé2îv—›àò èGó7,?`× € ù~ë÷5›7ĤGa‡,"•<ı™!?ù,ŝĴ'˘í…Èïk.snñu<ĊBwKf×$J23B´}Ì4é³Sb™ıêġNƒ"MÜĵ‡µUeqQ¨V]ÎAš—$.qé’;Ĥ*¨§ W`qŜ~[];çP‚İ)F´5jğ“CàŞ„RıÑŝ= n–èwÌ TÄSü@ˆ#azZ'Ĝ3§ġONŒĦËËÂż òēTÎX#ĦŬ)kèO2 °gĥzv[8È0n”ˆĜ ŜˆÍ…3äš×Ħ+„Ñg÷ŸéU+T‘–=v eò;ĠŭòTua¨"ìßOǃ;Ï@­*Ì̸ݗQÔò,$,sm5sÚeelHX\tab&&”bQQ"ߍğŽW•;ŠEpBĦŸÑżQB =FohÀy\‹lĦşs{äyĝaĝú×U}½²À8À§~ùġ/ĜkW ÷iàl’ûÁΌ˜Ûß0oÄîĵ×#"RρhŸœ÷góâ–;|(sÜz½ğ_[ít9Ĵם÷`v֕?.-A= YĴ)³³i›dĜżOSFG]ÇÉJĠÈH…bİ“  Ílż ıf ­^ûž1äĦë,Ĉ.lQ/şëôè£"ǏËßÑı’Kżŝ~ĉcŬJw™€¨\ւ]FĜùĈóZ­°×<³^üí"@z›óhOĊAfpUXp‚! žG{ì.¸Ĝ}:é2ġ¨*†Ò¨ ““°şêN ^WŞUċÒ%enj %i QSxç×!1A=: GÂĜ¸R¨ı~iÙaİ(íj¸ĠÂ8-C\ŻÜïF 4l"x~‚ï …}ĊİSâğKú{ĝé7^çzî“_ú"‘}+·[ÚıŸ:ÍÏk"áŝiĵ`ϔ04ä\YYTjuÍ0Ü˙›ŬĦôë°%âŝOϓ}ìíéßoÔıĈN&ŭġûí×z쵎+ÒûğŻ9M´Ë+Ş­Û|—™ï2ĝŬî×÷• Xt͌| ff`τ|˙äwĠ˙üŻXÖĝށĞUi—Ò¤C8ú‘fċšKŬ0Œ´Ĝ̚Ġoǝ6˙Ôċ$ mQE ­Dşİ)sB˘Ñ€µ*œ?—(qM>ĵ|Ù%zž+Ü·öïw jĥŞD(ÒΎnôoZAp£+òB MŒce¨"TklÇ˙Ĝ1/NôÒ%fú<û?ñ8Ċ—^¤nŸÎĉ˜šì4ï· jĈî y/A6HĊ€„„ IìFG‘ eçBê.o R†£Ç\¸`i Ŝ}WXZTšMgà/ĵĞÌÍ)~Ĥ÷ ǎÁȨ²VŬ}0Œ\A@'l‘7Ġ°´:I‚ĥ £c‰×l gÏiy|œĈÌ ˙ ĝı?*ŜoŭĤÚ6ñħ$À{ïċç}Ÿp|ïa—QİôO:‰ŝ_œ(Úڗq#I€ùÛ, 0ŒÍ°ĠÄĈ¤CßÍSñû:ĥònwp˙ŭü|İB86Šwô¨0=½q°%}= {|†aÜN°ž0ÈVA§ÊœWÀ|—àW((0:*”Ë­Ü‚­YĞU¨ KËn˜R½Ñš‡ G (‰:Áá:ı*šx ÙDĈ­U dŻCzĴ V¤ĞZ|ĜğWddïĜQù}‡sqÂ>ĝAêŻ|×>GÛZÜ÷??:,၃xï{†‡eÛ €A%€& ¸ŬÂàZ‚À•:~à;ƒ.'Bħċ²2:"ìŬ ı"A7Ç@‰#aeE™Ÿfç•z-; DMWJ˜¨ IšŸàòRƒ]·êÈVW í< Š4 >Q,ò7ċ?ò Ÿŝ Á÷^6OÀÍdK9IDğGöíÀ²ú ĜÉ\O£¤ô>žŻZš’XÚ9†]˘zM¸÷^8|DY\€w߁ıy¨UĦ>5ĞW•r ŽSöï EEKPoĊ‚Ğ(;e…7*G`P’ ĥ†+Ŭ}päÌÌÇ Ġıŝ3è'ÇÉşnCÀiŝveˆpï^ĵğïù€ü?UÑİBî÷Á4€a;Ŭ+oä+·¸žA+— XTÊeŞcn’à‹ġ×kÚ‰,,-ğAFËKaàJÓ ‹‚Ë@i­ğIÒíÎßÊëÍĉeĦ—…ïÀA!½½{öêqßÂñ,żŝMû´lÄÓÈk?€ûŜËß–p|ı瞛/uKUjżĤ 0vŞ XO ¤ıžçJüÄs"@D|Á÷•R öí&'Ŭŭ´µ‘j6…êšë-°ĵ˘TĞ.éuy×Ö¸Ġf8rF:ğÁÚjH ż.ğ$D%hċ8TĈ•{î˘PİàÙ7ä}çeŝяŒĉw_ĥĦB7’͆ü'žĉPQİV•={lœaĈĤ_­~żûxž´…‰Ğ½÷=!a­İTîŽàͳ0{Ġġ XX‚Z .Ïşé„Çïv Ŭ5Oi4Ğ>I\XÀ÷ċ†„ú½4$  ÂR˘<ôCC;{Yü×˙ yêY _ŭ²µŬ ÍÈèµçw†a7N ôí\Ví}ıì:†@Ş5·V 0;Ğ,·Ê/^‚fCİ.C+ss°pô¨ëYà:şŬyÚM07˘­pö…‚û÷ĝ8,/ŭ(ċ27Ïò2Ŝg>Iĝ•/ZH`Ğl*pê4^œ0üĠñaĜ7 ‡Ŭŝ@ú·,0 c7Ò/D]Ӓ>ݵ>ˆç& KÊ䤛I˘¨+kĞpġŞ´r”rIHbW:ĊÒÊ ÎóäÖú̈́òyî§Ĵ$ž01)òÁ)Ê<çû,Ŭs7ŻżöŞÍ¸-߈lóo†q[½ƒF5{$žĥûĝ4B­­–ÊĦC•+ÊùsÂìU%J”Ù+PŻÜUĜ?íÂ#J;Ál JGg7M[ ¤O˙÷}Ħ^Wâ>°Ží™’‡żŝ˘ŝÊâïcŸ‚Û H ,Zìß0 cğ~b ½­cPŬšnŝ@½áÜú•Šk*41#\½êĈŻÀҊRoóóʑ#ÂÁƒJœhĞŸ€+ Âîü€­– fC.äàÂĊ" ĞŻ żû_ċŽq_àékżöŸĴL– €Àë¸k|ĞĊ7 Ĝ–b /҄Á(r;kñ43½Ĥ(““Â̌pù²›D¸´ĴÌ]U–—„…^‡Ħ!7t¨TvB I¤-‚ ˙ónĊP(*şʐÀşáżüĥòGßá*0eïü­ô8'@×[(Ĝ5 Ĝn‚ ï P7lÈwe„î>‚ï ‡$LNşŠóïÀKXSVWàċ—]ëáGœG I”f~MÔX-PtĦ Żŝ¨KNüÄ0:FatŭüŻ"O<‰wĉëxK€ˆv}Àòħ W% –Pg†q½ŭ„@’(ĊÖĜ^?âÈıü=Ï%!을ĊEáĠ×]3ĦËkDpiI…ÇŬHb7a / |iW lVäĊ‹çıއÒpUĤò#?"#•2ĠZCġ+_Dž~NŠÏIm´Í)Q{&=,À0 cû Ĵèä‚àû ž'„›5P*04ÍĤ²ĥ*ÌÎÂ₲²ìB ìŸ†R*CJ,h (ß˙ ç܌xIKÓAI“{”~HÊ I¤ú˙ŝÖ´íÍYÀËä¤&_ĠŒżaĈNö ĦĞùqż×ŞâĈû.Ŝ?9)ĵûsÇ_ž…¸—/+‹Ğpá‚pêLOğä0ÂÈ *–zŸs+Ŝ€´×AİìĵŞC?Œ˘žw1ž™áñĝ‡ßüĞöNfS}îğOaÔóùĞxAaφ0ìŻŞ{ÓT§ÎŜŭŭúŸ×ú†aÜXòm‡Ó55Dèı)Á‹Bœ(££Âˆ0>êZ 7šP­BÜ eyYjU(Ŭc5éLÜʸáüyş9ħĦ ÓÓȑ£’œğÀŜ•Ŝ÷˙ċµW­Bà† €“§ñ¤%F*÷Ĝ˜lX¤&L†al/!ŬħAZŠ' nàèˆ+Hb×3`eYX]U––`|Â5JÔ Z3 r"`£ „²çٞ# .W” “=…?:3ğݽÊĜğ{Àé{ñ<Ïço”Jž÷âTĦy 0vĵȋqCüÀıùGÇ`lTˆcç h6 ÑpEamMsğôDĦÖÖ´A¤·kìF<Ùóô|Üyµò&÷¨ìŬ+ĵùĤ<:µ‡·ÏÉÙ;{ƒÀĞß'9qŠĠRJ%xà=›ŭ 0Œí%Dœ‘ġ}! ŬÄ@Ż5u0”‘aajÊe˙ŻÖ!ŞÊ D‘9GBİèĵİÀ“/\ÈÂċ1T*Êá:̓‹s,ż÷!óÚl~@–-UD >"DÖĜ0 cWħ^wÁ0tîüF½ÚŻ )Aàpe––•…yeuEXZtÇ8|XX‰”râúä›ϵÑ*lr` ##î܎SˆËJœĊ‚B.œğUP¸àr>ĝ!FŠ%–xâI g^¸³EÀĤ€ĴĴٗÂ0 Nm#¸<ŞbÑ˙bÁċ ”Êd0 áüy7Z¸ş?ĝ>ìÛçŽs`:PÎÍ'(—Ŭżû5˙ÙÌùùëàyİÑŭ÷C³!”ËèŻ˙'•;ŝŭÜÊAUĥÜßy£Ïy£I,Œa†ħu8ğSo˙ÍWÂV;ĝ0pĈwxD9~\xäáÈAĵ„Ÿ™7^‡oÛMĴו8q? ×]6żNoôüÒß}_(WÜ9ML ŝĝiôİOğ…˙‰§ıc…À–Bcşé7éV‹ġîŸ˙°†a›àşz^kJ`ЇÀÁƒ.lüÚYXžwÓתÂħğ`Ï7Y°Xèö.díËf6écÊw<σG‘ VÓFĴè—~yâIÂ3/Üy[qĈèT*½Şíf‰‚$éŝpÜ ċ7†a\Û¸vµn…Je—‰Ÿ$â*Bv.ŝ·ŜRVV\ F>y2+*/tşn&/ 7¨XĈĈáS8tHbĠ/}ù£ŝÖoê%6Ÿl„¸Y"0 Ĝ˜pĈW}Ħ2”¨ğ^+#n„ÈĵùĤ2;ëĉ ÌÎ*I ĠcÊŜ½.tNL½ ùuùz„@^¤y îx‘#â˙ȏފˆ~ñ *}ùĉ7îœİv›6IßİırÉıWÑ8û††aÜB kj_QğëNàÇŬ„Áw߅…y¸Tw˘Ħc Ó1òáByÛ²àûÒNtèR,ŠĴĴhRo˘gžż³òüÍ>Ô½üBİpè0ìŬëúBçğ:a€ô ĜJ'Àü›ĈœRQżRÙÁŭnS…8î>ĉ0 Ĝ}‡ ù­ż~Jâ²˙›‘¨ê*Ì^u ĉ##‚âiĞçLvŽ@şf_OçÀ~ŽDU×½ğD_˜ÜC/‡_}âIÂ×^Ŭŭ͂6í÷˙ô´3ŝ×cĵ-ÙÎ0 Îó¤6ó€šûY­ı܀S§œŭxGĠͨÁısJ³ 'N@Ԅ‘Q€VÓ ¤§Káf<Σ /|C(YYAK{ì£óğ[lÚpïI~ĦPCáaçÊYÏoGm0ŒŬí ÈÏHûġ£B âı~ž2Ĵ,Cu j5>Q<Ÿö0Ħtíߪ'Z“qs üĤĤ¤pà è·ŝğ~ûßäċ?*ò֛ĉè5ž‚}À 0Œëßy§­zKe—X)ğ¸˙ÉSpáĵğïKN\¸ ¨:O@ħ ğÇ7E[óĥî H[ƒŒÂÁC*<ÈçÈç_zaw7 Ú°à‰§):͟ |ó=‚ğïv%€ĉ0 0úíĵóqxßo%üù.ùO_Ÿ€ĠeaĉĤ ..şÛ“†*.5P3ɂù ħġL¤ç"˘ĝž !œ>!\şH2:Ž˙ÀŭüWwéÁ €S§ ’„ÓAÈ3‡âïŬ':´9lnlô£ 0ŒK~'­…Ù÷O„ ßs ċQÓ%Àò²5ĦP€b.ѐ]û72N¸7è ßQ€(êŻDşÇòZn€a†ħUQnzŸçA½!ŒŽS! „+W”™+Ċ04œµC.Œàm̐Ç÷]ށï Ɉàû………ä·Ïžċ³ŝżö[żÁŽœt³aà+ÄaÇŬ†?ŞëµĵUA`‚Â0 N1ú½É{A¨­ÑÀN”JO@½!Ĵ,+ ½—=î½?Áó!„F½˙Ħë9‡|H"I„ €rYıï~ٔ(ŠôŻü‡ÏŻÜ1DjéôÀ²î”?Ġı †aĈÎŬñx·™tğ×èQ×ĉĠW•z .Ï$Ħpï}JCıâ<²Yqq=ùY!’µAq"œ8A03#ïûÔ§Y8}Z'ŝŜ/îĵ\€ 7úÁ÷‰NŬÏwtî½ÏÍmV‚@2†?ġtìäµÀFvġiİüd€ 0v'ŭÚġzžsĊ{> ÊÈ0Ĵ­ıÁzÍ%.Î;/AJ:E°×FMúX IDATmf‚`8Ÿ·˘LMQ¸z•Ò?ĝûüÂ_ĝ‹xĝ­%6·ŻN\ÀÄdşżöUĵÑĈÔ 0îÚ0 Ĝ1" ß,(uǗŠBħ(ŒŽ8o€‹ŭÚŞŬï*339P3‚FŬ †Í Ê˙ğX‚r Ĉ'”{ïx ?2;Ïìˆëı)ċÓzTĵ…Ä>K 4 0n”( P,À°› xì˜02êî³°/*—/yÔëJœ@Ô’Xĥ$Òç.…Àwċ†˙ËçŭÓ<ħÇ)lçklċ˘ï6ÓġÉ0 ĜŜFżkŠ`ĜŞF+h{Ŭ‡{ï…W^Q–…K—H(•ÜL[×TH I]żÍè­Lpùq"Œ!=HaáiĠ3Û<Àß̃NŸĉĈ&aߔpè0×Ġ ŻĴúġX|€üÀ‡~ġœIÒùğġ0 Ĝ=äëó=ŸV½+?M\·À…—%P]Vל½Š­!?žï~fmÄFû´s ԝÇŜ½ÈċKÔ÷ yê4˙ŭĠï³-­ÉĤöĈŭÔ‘Ş•†a·Ñ ùJjĞeŻKAa|ĵU!€™8ŜċÔêJԚ͍çämĦçÑ\T*+O<éï:Ê?üê—inÛ뵙%€$. X*CJĦ`>0 °ƒârĊeëßżÇÑ£à0?—/ÁKPĞ Ġ[ÙçCÁ`xHQŽ‘ĈÏüìö­6û ×UiPĴ$Iĥ· ŬÜû†ağGôċ’K O8p@˜œp.˙…EċÜ[°°¨ÄħRo@KmĜLe@Ħà+CÊG?Náŝû„G?³Ûñşmş€ŞrÏ=PôŻÌ'i˜0 0néàb˘ĤÇô´E°ò·óŸ›WŜzS¨”ax¤ÓÒ¸‰>~ù¤@ßW Ħ°²Ş|àa¨5ùÒŝ½ŭŭż˙ö x[yvßċ†awĤ ­Ñ[1ùbQ˜ž†S§Üî|e .]QŜzËġPu!޵kÂífl\ş’ÀrYĜż_8zHˆ•úv2ŝö<ñ4à?%°Tgw½ŬÂġ32 0ĥżÈw ô}×.XZ÷O+‹‹puY¸|ɕ îÛ'hk|pıœvÜüs‹ˆó>Dž÷@Sİ <’$ĵúËżÄüNġ,“à•6à&1/a†q;C—ày_Àpâd:Í^UŜ~VVµŬ)0êĜ¨ WP.9Ođƒ”ĤĤĝŭB{˙Â_Ü\ ŝmIâUİXƒ0 cûyòˆ8—|¸¤ÀJY¸çLO;›vñ˘rŝœPĞşÁ͆ÛıoĤ ˙ĵ…˘+Kœš‚ûqš/?÷o˙ ñNġìJ,ŸÁ0 c÷ˆ€Ĵ1gŒ‚kTRtbÀ÷…F]¸xQyçQŞUA—³ŜÀsğ&u.04$”+„ï{PŸüÓ?Í+;Rx‹âĥPu†a†q=v# Ċ%ĥ&Ŝ{/ÜuÜ5ZZΟ‡ıy%N˘¨Ó`+KD 7£àäI)ğ‹{~ê3·7°q³š8Ċd†a;JĝêD@ÁĊċ‡G\Ĥŝ䄳iKKĉYW&¸²êĊħlĜ iŝAÀè(òŭ̟A?˙Ğ·7°!ġq˙}ĝÀ3~Èŭ“ÀŜ}”JŬŭ“Óŝ˙IÒżï˙Fgô˜ŝ4 {üüíémîü¤ïùXHÀ0 cgÓÓ³_pTh4aϔsÓ/-)Ġ5!Š=p˙áyŠHg^€êġÍ È>Żç I AIŒ§*:>Aáğ/óŸwŒ 5¸[5ŽÙ K0 ¸%FŻeġ‚VËŜ €={”C‡\˘àʲöafêugÁuٔÍëéĜš0:Ĥ|CÈĜ$àcßž|ĵMU” 7îM¸ĠŬÈë4 0vÑO Cét , “°ż¤2{U9wÎ%U; ‚ĥ20(mQìî9ƒöO£Ï}ŭú‹·gZàĈB÷‹òLXàŝ‘‚ƒáÀAab‚ža@× lĵ";ĝf…DL†aìòƒĊP4iıŭ‹ÎMżĵäF×ê†.àà{rCBéÈbUáä=Èısp`?‹'OóŻŝàÖ  퓲UIâJ*ŠEŬu3ŝ†ağאNï+•]ßŝb &'aÏ÷·F]¸tQ˜›sğ˙fĞ*`ĞĦÏWüÊeçQĝÀ‚ĝü“Ż>OôĜGom[Zo£÷öÄk½š8v-ÍX†a;U­Ĥĝ£cʉ“ñö³³03+ËB½îBŞ[\(¸ç,Wàîğ]9âGŝGżù[;:ĜÛè‰{1$œ8Ñ˙Ċß*AĈp 0 c£ğqp^€´eŻï ˘pß}Âè˜3ô—/ğAQS¨7œ`³†?û{:¸2¤<öQÇäÜGċO<É)½7[|é×iD:I(ÙÇÈ0 Ĝ " MÎ g'&”ñq(—……y XZVê5¨Ö ^ÛúĤ7›„82˘Ü{ŸR,ó/½È-Б۸Òh%öŒ^n·È $Ö%0 Ĝš |A JœCÊ=' VUVWaaQyû‚p÷ŬPAğ‰İŭı[”-ĦOsÀċ|àa¸2£÷ĝĦŒûJíK_ÖÚĥò¤”JPŻĞp+D€0 cĞĥ#µŬ­ŻPpƒĈĈarRĞ —.ÁܜÛŭ§·|"žKœ˜PŽß ëü­0ŝ›òíş 0ŒŬ!²Ġt`ѐrì˜Çüœğm~–—……Ċ„° ÄIJa/@öARVM¸ï~˜›£ŠÇŻŸûÒŻÓĜV€ÈŒża†ħ =YÛهĦ‹ÍŸ<ċFùĵġVB­êUk.!0ß h3›jUĦ SSpêÑa>}³˙Ĥ@èoĵìÏÊ 0Œ |żSP*ğdÀRYİ ı6ÁoĵNğ7@ġÚ·Í *Ü˙I‡‰<ĝ §>Ì/n;`†ağĠ à·ŝP…JŽ*e—÷ĥ²ŞĴ­ kĞB£İm/ÀVĉÛ¤e•²02 ‡hò‡ùsò#„ñ/ÉMkäŬˆ‹e†ağE xK g˜÷탉I7>xm .\PŞUĦVğqƒí|ßÍ}ċž{ÄÛ7ĊôÄ(ÇOÚfż`0 cwzÒ½ Ôöàžéi‡$`nÎċDħĞÈvÜLÀóÜ|‚BkPÑC‰úüàŻ˙œŜ´î€ŜV.ÒN|c 0 zwċaàj˙÷íWĈĈ„ĦaX[Ŝ}GXYU WÇBwĵġ›É}+ ,¸ħÁ““ȏŝ(ÉOs~ÛÉ  B7i#l…˘a†aÜ /@ú3Žŝ˙ì½yŒ#izĉ÷|A23Ğ*Ğşş§gjú˜SÒHiµ’ŒĠJĥ…fĤgşşĞI6,Ëû‡ CĥwmĴeÀ2ìµaxKĥħ– Ż´kĜk ymŬuw—’Ñğ:G3=šéğğşîŞĴĴlÜ4›0Q€0i¤§‹¤˙Żà ĉ™é„ßñŞqê”üWżñ›ÒÙSàKÏà·ˆü!x/DB!‹ôĵrÏü´ż?òˆiôŜ{‚Û·0ÒètMSŸ™#5A½a˘> |â O}˙hO ÇÁ_G/ B!WĝœšÀq“9 ÁgżÇ4r˜$ÀôÚäÌÚîżĉ™&D}Lae?Ÿ˙bu‚'ŬP]kȓk0ÄO!dżsàÀóĞ µàÔ)…ÁÖ…×_Ĵš?Pp=×ÔÄI“Ùk5›ŸŸĝ„à‡ŝŞŠƒ@ä•˨Ĵ1T9Q4úÍ8N’ AC€BȈĜ(@£nDù£ÖOšżG‘ÔÜ5]`ş(@6ÀĞ™ŠÏëğàĴ­ĝŭñ#&„BĈ‹³Í°ŬŸ8pì˜)ĵ{Ç$j ĝÉŸYû¸‚kû< ġŸžAŭȋ?Ĥj{cLĝŠeŽ0—BÈ$zĉĠ’\€:è£Àɓĉħ­mÁĉ&íÑ|Ÿ5@)³?Ż&ĝìgÇ“żóÒoI¸'€ƒáµ‘½°Ä–i;„B矍x ”İ×?rD°~Ü´żܽk’ŭ™.“–Ú(@½4 Ÿĝ„‘uüµOáÏ>™û8s{2!„r@Ġ35SŸRQ€VKzŜżèá\€iúx5é-=|äC Ÿ9ó'Ŭ g,Öp€ĈŞxĵg­M²"!„RVk5£Žk„yuĠôèv_7†@›9Uĥáŝ+‚O|ĵ˘÷2ɓ%ĵ%~VBY”ço…żŜ0kóŽ+ĝÌgú ëş]³ŝßn)„‘ùÏ6ŻV3ɀžg–>ûY´?÷|ċıç1S2àDrîÖFŸ”E£”°K !„…Ĥ/€I€œĴ3^˙Ĥ40ŝŸe@kÀK&Ö‚'ŸtÖ>ómĝ×ΝEĝ‹ӯÎÏ$á žB9ŒĈ€ ˙+PoŽSxĝ„iĵµ´ÛfI ŒÌßÊ ˙¸ŭ­4ŽxĞOŸĵüĤŽƒOddŝĜ:pôèr|„BÈ"µĤV7kókrŽ7Bßn7oš6Á"&*]˜Ĥ"À&­O}µĠ†Â翀'żôôtíK½èô8ZcÀp ëÇOŝqû/n5>z\öRƒŽÔÀ,Ŭ '„BöR“ÒBî:Û}=ŝ1˙µÏá÷*3èŭB!ċ°³`mUam­ŻôË GĠĞ u³ °~ñÚJU9Sˆ?=mB!‡FŬ Ş×M˜Ù4 ÚíÙĥ;”úŭû@ê=Ĥ~ĝݧQ?ŭL~kàò²NïŸB)í(Û}‹ Î`?€(ž}é\)eúÔ̒ÂêŞÀg.]ÌäCY'„Bĉdhm …•³îżĥfŞš­~^èéf¤ñ’ĈC‚Ï~Ò+u|­RżŜ!B!„c“òĴfž:eĤ6[‚›FOŭ$`šĥÀyZܨkG’6Ä#ŞÊ˸b++ÀÇ?ajmB<ñ<^@„Bö×Ÿŭ½Ŝ0­zhĴ˜„À(|0ûš~Yl˘8|úÓp>ò(ù/⇞n¸+àXy=}+(1Bµµ5SXo?iB!¤$+Ğ‚F[!VF?EŬÂÊŞÀĵœœŭI#^ÉáÄ#ÀC·Î(³YÑmU›Ä*B!óŽ(8½9:ž|û§L²ŜĈ=…fs°+`UşÔHö׀P°şş2è°şÊI€„BȤxñö-q"öQ”89̀Êx˙yÓ³Üá+œ<?ĝGż‚hz@žb~B!d’h€m ,\ǁç%3D°ı9ş4§§ĠO~L 5ğ””;èg2Ž´R'„B†Qp“²@Ż&xüqùïîJĉy2ğ–*ë ”!ĥ>˙Eü½/=Ġ‰ Ï\Fŭ !„İq]éEŽ,÷³s´â¸ÁUI˘áɇïû7ìàŽM˜F!„Aï9Ġžù·n~"`7IŒµi4Ğ:ŽYèY9qżté<:˘B!¤œèĵ?Èq€ÇM™^ğ ìîHƒ×ŝé˙i&–6t²‘E2î$0A!d?âş žĞzŭ<ŜT@À”ñUU  `ĝ?ñIh ñў†–3[ĉ3¸¤µTĊs!„eÀNê‹cA½nÖĉETOü0$jHßô M‚: x¤ĥŠÚD€G‘%„BfrbÓżğê•ŝÙßmE`rfĜ™€İ,<¨ġ£}Ŭ÷ĝB! 2 \ÂAŻ–ôh·Çh-ˆB×­fŸžt}A)'Špä…ñ18¸QnP Ĵ­~޵T˜$H!„äGҏ"àá‡Màŭ ô†ġ …*ö—J2üä'‡ZŬ ’cUM B!4 ÌżzCzÙùž8J!Ö‚ê&Zƒ@)³ä•ˆı.B!•bÛ&[ßuMèżÈY.›ô^ôĵ 4•ħvvDÔbsè÷KĈ>#„Bĉ&ü5éib˜V½Ż°ħaB˙ΌŬ³ĉĠJ ÖV͢Ġş~ÒoIPı$O +!„îġ[- àÈQÉßlùŸ­ p\™J7ÓÎĥmìş +Ğ‚>Öï1XÊH7'˜…ŞĥC!„ìGĴ ğIÀê  Oż^7‹á×ħš9rnĥ§`c ğğ ġdYäêŝé3XОƒ&€£ZŽ/œ4° Ke'*1ZA!dXħ?í˙ƒ½òôkRuÀuŽcL€~´Ÿ×7nSà58ñÂêÚŜ4B!dż ~ž;°²bşŻÌĉù9°µšÂ#˜ „e €Ü:Ž UB!¤ĵ §ğóĈôQóœvÛxçJÉLKĉYÁĥĥûëċ”ÙX¤ß@™ĝ²‡G\†˙ !„Ì ċèd2 B½!}ñÛ|:Ô_‰)é5Ş× @÷ÇBŭÌx@$lÀ~„BÈlÑÑĥ?żÒŻûOÏŲ́bé[D 6‚ï û³p<ÖÈM{4)˘WL!„T@:Ñ<ŜŬ•}Uڛ-|ôˆÂîp옂sPO.!„²”š¤$Yë7Ħ˙ZMÁĞIŻ3 ë*ÄşÚŭğİċ…(2c‡ÇJ¨YûF+!„,­1„ŭEŒ¸9"½Ï3UÄÍHïÛĦ?& Pk#ŝġ9p˘ÊZB!{]Û·€(2zÔhô³˙mŭ~U¨Ä“÷<àñ'úÀñ·ĥǖ£„Bö1Ù*şìêğí µ­ÛWUĥ·€W´[ :ÎXž@„£¨oeB!d´QÀêŞ‚çğéiİ}ĵŠê;mÔ< ‚Pêí.~Ó){ËDÙvĄBÈ2ŠżĠ0ğöï8@=• 3jP÷ÁXġ?ö1…şqĈxôžléäXÊĴGT´P……E!„,“еñʳ9öwë­OëìfġŻVS#`eĠäH 5rÓ΢Eĝ;° ÌÖŝw֑†UX@„BÈ^‹żM´şĜ횟†BôŸëĠŞIÀ·M…ìÂv;9–ħ/Lŝ9pꔑµĊt÷Ĥ)î„Böé$@W&ž~ğŬw´Ó³wŞŠ8ĜŸa„q `¨R½šĊ*½} d'>ö˜â'G!„Ìè™ ´IÄ#Ä6ìŸîÙo:Ş™ö“6Ĵĝ+é(Äa™€Š›,£5Ĉh!„EjNz@§c„~}½_E³uLëZÚĝ~’w0n#×â !„J£6˜N€Jİ^`cĜ{ä ( IDATĵ€Y#ğ}ŻĦÇR.€2!„R ˘^’_˜%Ïë'Úĉ@:V•&ÄÛŸŽ+U °z”!„2)y´­É·˘lô<€ê×ŝ teıŬ‡ë8h6Q. Pà.A„€e„BVŒ³9hĞЃŜ*}Y-Ìê²MhĝÉ1 ĴB! $ĠÀ,€n×üĴ%˙zıĠ×Ӎݙ„BȽŭ!nbmzŭGQíPA€˘ŭÚż[U8z´B`ŜËiЈBÙäic&ÙŭJàFÛ A×x5İ|żé6ÀJ)ĝ~‰F@§Ïà€Î4Ö!„BQJzšé8ĈL`Ñoü“ŝŸVgí´6‡››(•pI žB™ ‘~Ï˙(T½ÀĥÀ6ŞRsӝµž` }ñÇ?!X;"C„BÉhdÒä§W–ça¨PĞ)ÔëƒÂ_´Ž?M ½OÛw ” ɳj5…µ#ĤcÑBN!„²Ÿ?çoéÁ<ħíÎç ˙¸ż—9§w<ǏĞre€"‚•úàLs“ :—!„ìgòtÌŠcS‹oµ1Ŭ`úkŬk6´ğ+˵6½ˆQ…ƒyâ!„ŭ°}ŝ­Î…ĦÀu=PíĉşĠFÚí~µşċ;ž)³Eƒ€ž'„B&sd­vĈİ)ğAĴĴ˜ Ż&p@9f@UNħ}mlĈ’XÛw~ĥè8!„²ÏTûß(2 €ioßqÌsŞì˜ÖEÏîl`ü4@Ǚnq"L!'„²_Éöù7êŻŒwŸ<ÖîVWûj5³Üž× hMÌ6úìw*Ó~x܋VVöĉä1€BÈ~(0L:˙éX!Ġ€gŜ›Xħ&Ú¨‚5<6î ŽS‡s£ „Bİ3é^üĥ˙˙ÊŞ)Ğ_;Òo4O'Ĝî{wˆCá0 „B™ġK£nÖüíkĉÑkǖnnÛM(ÇA<Îp”:’½M.BÙ/ޤÍìc³Ĉßnİd pżŭŻëÍuÙ}Çħô–îŜÂ.jšĝʸ͞(cc&„BĈëdĴ#éĉz5p”ŞĴ°Ċu“ùĦ‰&{żıÀé3½'xÍwĵŒ,BİÒûGjPZôQŻèÊ5)ŽMAše†È3½Ħ}*ôŒXBY¤öĜÀ@RJ2˜G›@‚ço}Nhġ†Ĵ£ €µ#‚}L™D…=ĠŞOȨ@!¤*}шcĠ/˙ €Àï >`Â˙yݟFûò^cíîLp3:â9ĊvĈ1!„BŬÖᇑî‰ñÊjż³­À´žvà^‘bÓĝŜ‘RÇ1M ÖÖRI 5ĊO“B)ၧü„‰Ú’ĵ•Äİ×af(İ<6Š5l ‚6ÔÚşsäĊSġ\ 7(çÑZmòÖÀézGB!ä {üiĥe€YÈ>n'ġÙVÀéÇŞŠˆZMÓ Û֏ˆ=60ËŸe;„BÈA1‚ oĦÀĞIOàk^żp•ŜzZG)ĴŻ›$@û¨0B!ûÉû·żGĦ‚¤~|Ġ ˙7V™³ÖÙ}ĈħÀ÷´†×DĴñw•ÂàĦM/ŜL$„rXħKáA×EЍnÒ ódfÇ7Ż  Ö ^Mpû–нš4_ıŒwUžÇŽB'ĵyŽm“6Ĵ×C€Şp¸yÇA˜$nowï¨Ŝ3XŸ& !B!û…˘á?ögKŻÚZżĵ pòcÒˆµ†ÖĤpk[tǗc# €IÄw^Ħ}.BÙψÑO—˙ÙÔ;ÇéwŭórŞëĤu‚‡r’D;;ÀÍŞvé<Ôs/šƒÈŬE¤ħçĊŝEoŜ–KB!ËB‘Ójû˙۟Ê1Oô’ÌS˙Ż*q‚ó•“”ĥah ġ£&ı/Wf/œE|ú āh†â !„ÉœV3|Gġ³ž¸—òú¨ĠÈp˙˙JZ‹B˜$Ŝĵ ´Ûĉ˙½DđÖÔ@£QV‡RÂ+€B#İßÈĴ˙§sálĝßµÚŞŞÏŝ·I‰Ž´[ Ífß iĥKv#>:ŸB!ä ""ŬO‚·íy&ûßRĞI%IïyċöÊÑéĥŝnK.<ûÉ4j!„T)şö÷0”ŝàŸP ù~½j …Ġ†àĜ1Ǹn2˜B9„ä­ŭ‹˘ÈŒŬM ^âñ×ĵ$`Ž}˙{Ç ?PĜÚÜß@Çê/Νżè5C€ç˜1ÀħDU[@!„$#ÀzŬv Ŭ0Ŝż—ÉüŸgD" wn+lmĦ&J^ġúÜ€’½m@CƒBÈ2’îüÇï?îg˙×j şYûÏz˙UhÜP‚XAÇ@·\½jÂ˙żġëxo¤Ö= ”‚’rÂ,˘xUB9âo‰cS÷Ÿnüc½˙^˙˙LĉU½hòfĝ°ğĞLù_¨ĈĤğ´CÜÚÁŒ0Â@!dñCAô#imqŬ~×?×UsÑ l.‚ÖĤÂM9››”’_~áE4Ĥ2ò2 qĴĜ BÈÔâ+’òŝS €ĥŒ½^˙;OçÓVtÚÀ›o(xV^~ ? ˜:0Ğ…D!„4ï?Ž’÷Çŝz5S1ר{˙U…ŝÓC†ÒNmŬ.°ıiŝÀË/A&5€ğŒFÁ˘B÷4d!„äa[ŭFÙ²żDük^˙÷ytŭËn#Š3FŜ}ĜŬÖ×Km+ûWAX?ĴbEÌ „2ZÏœĈ?^Róż²*]˙ĉİ)6²†‚ë·DŜ{OœKñÄTÀK/#Ž~gORÂ+BȞ"?Ĵû·ŭŝkžÍüŸ_žYŜrD™İ[÷•êċ·ċUy £Ĵ“ŭÇBÉêœMö Ġ[‡·)ze&ôżïߖú`cĜ¸'€ĈO—Öğq?vŒ^7!„-ŝ6ñ/ŒRDġÖúu@9ùeóÂöèvŜ~hµ$Ĉċçž/—àïó†?ò‘Ù,˜Ş½éEô`€BHVlƒ SòW3²]ûŸ÷ÔÜĦ9èt67×„ħlż€;e·—{¸v~X!ŒkĞŞQ, !„Tïè·ü“€´èÛÌ˙z„ŝ­“:g5í jmÚ˙ŠnÜ67Q?÷><ÑöòŝĜPûWèiBİJG˘PġšÇeġ—ĝ—”Î{½QètÀWĝà ŬžÂ (ğ£G—ż<ÎfdÎBñâ'„’x˙Z#ŽëúgqŬdҟ7˙QżyŜšHÄíÛÀĈşž£ŝçgŸÇê$Û,½bħ,žu"O!„Œġŝ£~˘N…˙­ ğÎpÖż}lžÇ%b–$|_pġ*°½…•f[k`"6÷0%îGñ'„²CÀŽ÷µMÒŜ£žïŭÏK£ìv{ċˆÜUxçmZß^_Ç/_ıŒpĉ€+Àú½Ó'†BÙÏŜżÖ@qdšŝä…ŝ V_Ì1eĞÓ˘P! | °µŬn8L§÷öÄ(!„ıéLĴÄ?íäz–ġo·;Pŝ+ĝéCpġŞ`k +ÎW§Ùö0ĉubó²: !„NÏHÖŭ“6żÙÇj5×é—˙Í[üóCA îßW¸s[Eĝ—Skkú—Óg x)B9è¤{Û¤××Ea`²ŝ£ÈÌ q#ŝ5τŭ+ƒ˘ż(G2 A`:˙]ûĜÙ˘˙ÖsÏO7Á7hœ>ƒż+tĴ!„rP(êô:ï?Éú"c Ĝ ;èÇsG†Œ‡yG'˘ˆc…vG°µpó&‚ Ô_ıŒ÷+‰ĜÀH!„ƒgĜ~é–V`£È$˙…™bşžĝפ×ŝw‘â…00™˙WŻJĝµ?Çû—.BÍıg:!„+ĝi‚ 8 "ˆ#ÀÊ{÷ğûġ²ŝk‹™ò—·04I‰·n ŝżîˆëÊû?ŝʽtS—áy­B!dŸyBEâ…Ş‘Ŝˆ_›ñŻÔbĊ?­Á6aŬïï 8ŽöšM|ày³•àö€S§ëÇÔÄğKŽB…ú<ŭÈûGIğ_ÀôĝWŞú_DĞßQĝ] Ó6î nŬt°ıKñïÍĴĞրcŝàÖL# ZMau X;"{%`4‚BÈ$ŽbŜÛ(ԓ04%Ù^˙½ż5ÙgtÀ@I˘ï½ lméûA€ż}ú ŽÌşĦÓ£ ĥ=\aM!„%7²=J°P c…0—nö³ġŝiñ÷ğ@³%ĜÙV¸ö ŬĈï^ıŒżWÉù*ûGzà„B–Ŭë…ġŝmwż(T‚AñOùÙKñÌ҄í–ÂoîÜQ:ˆË/ŝ˜ŞUħŻëèyó?ıJqv!„<Ż_ĈW¤!iaM‹żdĥ:ĈóŻĠöĤÓ_ċhĝ>ŝû \Ur˙ÄÎâ€j4,÷m52“•5 шa†Jİı„B–­PÛı0V›žWĉƒ™ödL³Œ`×|!„\´VV€n·ŸŬ_ĈóO{ŭ½y7âXAôàk²}ŭüŭi½ĝ|6ÛñŻĠŝôOŝ5Uƒ#˙ /Âyù%ÌġhfòÑÓá‘ĵ“F€BH‘˜—~ëŒf…:ˆch5°ZMÁq1”ì·,t;ŞWóŭšߗíKçqe!ŸÁ¸'(°ş*ı'Œ!~B!Óe’ü²ÏË û[ñ×qJü]W8n½ż^/Žjï•÷„‚›Àoĥ·EÇ˙ñé3h,â8rO˙ÚÚàïEŭŝY’G!¤Ĵà—ġĵGuâË û‹ôĊ_kò·%~ĥsà(cc/úŭÛ˙Öàí·×ŬlÌĞqyaŸÉ¸“+Sà[$ŜbN>!„ĊÜkí}½ÌŭwT’ž]vΊàñWÉ(ßlO˙²ù‹>?~\ğ&ĝ³?ŝúó‹˙Â@UbşŒbËüB™ż¸E×vĠ›ÄLßĞÓµŭ鿈ô›%ĦŝZM ĵ~Ô=ßn×ĉ#,J:m`{ÛA§#ĝ֛hŻ­8˙ XĴhÎìoÇ1ğBq›ä7JüÇ- dĊßŝÄħ‚R2”ċ_&żÀ>/m,Â0괁N×Ôû·Z‚;7”îòŞ酋iï>ÀŻÁLdz!„R‰ĝ¸{žH§§ŭِZümw?À,OÍn+OŒ!úv€q˜Z+ù ĜÙîÜïÜKĝ‰=ùÜ2żǢcœDB!Ë'ü“ŜŸm?ŝ2䋿Rƒí|ív³Kö1/mÉv)ÔÚ´ûmµÛ·|ëuàŝĊ)çİ/˘'Ÿ_ê˙ €‹%ĵ0IBFß#ÓÂ?If˙¨|ĥÁOzo™A9F¨¸ût˘ß¨cŞŞ_M IW XïżĠü.ĈëÀ΂8TûÁżrëĜ•WìĊgéí·‹Ž‘BÙĤİÒ*d+ŽYá·}üUOßU(êŸÜQžzß󊈤—´Ói_ûšàÚ5`gïŸ;+ìig?‰3!„Ċ‹ŝ¨ŭ(1ÌkşcE҄e@üƒ żĴĉ7ôI琉7Ÿž90ͲZ˜=ż 4[‚÷ßúgÀµk çÎâ;N?ƒ=UN/{а.xü A½–&$nÖz„ßFB™§WèTóú"Ż_)“j&QŜr:#_ëámĉyüE^~–ĴèWİmÖ°HïĞ'ŝ Ù2ë˙oĵ!ĜÜ”+À‹{›s×;žcânÊÊ:rXY•ĦµFR²° ˜B³ĜOz-ŭl>ÛUÖ Zô³žv[é(DQwÀ˘5ŝĴ1Q•†Ù ˙ôLƒôĥ}_j)ìl‚wŜĈfŞ˙KD˘eĝü‡‚:Ŭ`9Ô\0²É„„Boĵ÷›Ċu%ñô÷Ħ”&ùG‰vğóXΖ:Ĥ÷ÙíCç[ßĵ÷.dc¸t^ŝ£ùüÇ]ġzż³Ò^˘”³'„„:ûoƒaÔ6\Wày*Ï3Nœ ïħëŭyâŸ^ç·˙FeöÊîÏÇ<ÁôòE§mêüßyxë-…ímá'O?³7%"ӞzĜ„rp<ûq^~V°WmhrŸÛ5֊~‘f¤Œqš3j½ß·]ûŻ"ôïyĈp)2Hì~ŭ.înŬò… š-üĠ+—ñ‡KefOèÉĠˆù²ó*û „eŝŞ €˘°ğÉŜwz‘Ùto€ôŭżĉWC­|‹ĥLßqâo…ßÍGQ5ç"; Oü_ĦÙÒh·ŝuÁŬ;áŒxĝ£eğ^†NsTarÄ<,̚@#€²ßħ%Û>7;’×fĤ*+Ïà°B(˘†2`Œóúǵñ-s·^şŬVUC~˘hĵĝ‡Ħ Óĥ(Sï˙şğğjċü9ı°”×Uê˙K_cWĊ‡È<BĊ|ı^vßĤ [ÜcQëÁ„żĴh%ĝe£eĵŝ´§o½t+ʳŜóm4a\ëb­MÒ_×| _ûsèğXıpN–vb^ú-)Შ)aBÈr3*Lĵ,Ô(ÑWJ ”]—5@ò:ùCïé}f½ŭìsÒB_ÖëO×ùGٕ™[àw­-`sSáŬw[[p.œ…:ŭ œ½÷iœ>uî,˘gÏài§Â/A•LÒ€B&Ċ*Ÿğ,ï-Î/Ş­é y|²Š+;¤'ÛÔÇ>–ÏtżiôìY½pŭ8^9s9ĝ‚}˜–úò’òÎEú§í\gÔ9µo3û8?D_Żç/5˜rA“K`ˊ˙(/>OĝĞüÌËl·g„ ;ğÛ[ùM- ÛĊ˙;ż#›Ë~íÌhÈÒ|á !ûÏ9˜ôŝW:/ú[ö˙Eá÷2B:Ŝ—ÂŜúyžĠӐtWÀ´°–1zl„ĦÌkÊReÎżÍ5贁NWpŭšÂïŝŽĈġ›€ßÂ/y.ŝîĝîñ+FĦXïÓ2‹ƒ“Ĵ›@˜—ÑŸ>ÏéĈ@Ùŭ‹>ĜÏĦ*²çĥ(a1Ïĝ°kŝwî ŝà÷^ş]ü'Ż\Ä?ŜW=ïìxÀêQàĝ àSŸRKµ^Î*²)RÍ&JQ¨oüT}^ FM\ŸĤ½ıXÁ—Â÷YĠĵ”t=Ŝ½×ž7׸óá|‚´!ÑùĞ!Q-#úe …2ïµ^7†Mv„oÏgWn)üٟ nܐ¨Ù„úÎKŸ˙˘vü*öMĤ™76 °ĥj>œÇMŬç20 €É}dYĈr°ŭ.Ĝó0„ì\úñ÷!5ÁñwZĤyÏUż÷˘’ğ0ËÀyê‹}ú}Žö˜ûĊtÂ_Ċš•#äÖ(ó=µuŝ͖`g[áĞ|.ÂŬ]U;wVÔégtíËħŻ”h¤Í“ ÑLâĠ²ßàúöüxvµ…Zú÷\5ÙùġE½o“ı_ğÍ<ñ%èi<ŻħÏĴßq›7`EżŒĝjš„ż{ _˙šàµ×DîßWµ³/›ġ˜K—·ÎT€£VV¤²Ó˘n6„âkgùÎÙ2/…”YÈ&ÜíGÊñ¨Ñğeĥ?*Ĵl†żġÊĞNôË.'í?}ŒAû7wŝ߯hÜßn߆ştQÔégà^şˆx_:=ƒï|ĝ ¸ û^´Ğ}/íċ˙ìç4I˜ÔÒAVFġóÏóöçÑż?=Á&û•ıvÓS m“Ÿo}ĝêŸ×AûŞ]8/êݧĦ.]DwßkŒşoĠ’Ĥ­ĥy‹½Ï=8ˆ_Zz֋ëeíjŸ'mRùg[$üVĵ'IîËsLŞööӑ;Áoœĝ§Ğ Ò½ŭ77›7Żŭ9pġŞ Ù†sáĴ¨ÓÏ@]şx0jÒ=8{rú ~m™…Ñó¤’\€Şû °ÑÊìQ™²ÏŬË$­l#–*݉2IQu²W‘ƒ˘ġŭIÛ÷ZÒ£{çUR&÷(ÛBĜöĜÚ2ëŝoݧ_lmÁoí˘qáB/ìß=(Ÿwú}^4Ĉdô”’Ÿb³ IDATÍXµ˜VY˙Ş”İcñ7qŜLçï}Tı<‘6Rŝš(_ÚTfğ“^7\˘!Ë$ŝٟ" "RĜ(hRêġêud’Jµì2ˆ­2ˆ"Sê·ğĵùĤÂ_|¸huÔ/ż ?÷ÔÓ¨$ñÏ+e\ìxÉŞ/ÀEˆnڃ[ÄĈAëy{™Ûoq:ûUéç/Ó9 dŻĵŭĴŸ×¨(ô_–yĥ˜÷ÌsêìzÛۂÍû Żżĵù†àúM Ŭ.œ—Ÿ€+—÷G˙İ Ż˘ö‘dùD{/×ı'yn™ä´ey˙„ìwÁÏŝ-/´ŸgLzϟ§è§ûĝóúóÚ[Ïk ĜÙVĝ?Ŝż*¸uáżò5Ñ3" Ô&ĵ˜ŞŽ…qLˆV*ÛGQ—Ğy,oä]tž·—‚5i8şÊġn ;!óŝôŭ:=”ÇüTÖ˙—AôÓ÷íq}üóĵŝdżŽ ÓQ¸{ÇÔĝßğ'x°‰NĊqá<~ñó_X’^ĝó6,ġ:PĞWsÁU…ˆÀuË {YQ°Y˘yÇ\F´§ŸyĴġ–:bÉ&ŻŝœFĜ÷òB‘/'ÈqÜ_f3Ż)îÍ?í’ìĵ–ˆóœ¤Iĵŝôy²ŬŭvwÍûÀ7żİñúëÀ½ğÀÎ~á•ËĝEĝòoì tKZ›I€O+ŜVìíŭĴ˙z)ôôg!½ïyŜsĴ.”iċ›w,Vĝ}_j)ĝàë_S¸}xï]ÁĈšZW4ßrŝĦ4Ê|ˆ{ô7ëE–6`úĈ†Œí—=É']B(Û~“˘NÈÁîIĥ3j{‚.ocÁŸğ8ċ8ƒ£"µEKšiŻżÙnßÜĵĦÍoï_•n·•Kħ~ŻÓ ŬLĥ×;ıjƒ`Q——V”€8ĞÏ{Yƒ²|â]vî/£2óËnwŜŝ<ï͓,CŽ2 ´6ëüZ›~o„˙­7×_îܨ?}é"ŝÙSO£vċòŝç[İàxĠ šĉ‚Ëï,˘-îĵjÄ !Ë'Üe—/Ëlg\Ž“ Ċc\C²²ï;]•U%v]Q=ZŞ0ìıèv×ßj6[·€?ŝcàĉ ‰wšp=˙ĤWà0Š˙°²V<oÒgÒ$ÀeCL9X^y€÷(’1ېıï*îĠybŸ·Íyߏ'MîËOş­Ż ùïî;;Ào½%xŭM µ„!î@g"Ż\şˆü½JŸö‰Öq=ġ'½`˘¨Ĝg³!BŻpO"Ìï[ğM–;fİìŭ/ËŭmÑ#gŭ´a""ˆ"ó™vğŭa>\|pUᯠĥĥ€ĉŠ;¸—Î1~3“ÏàıçQ8P> bcu‹8ìψ!ûÓëâıŽ3>\nKzG£*=îŭèœTY0OÑ/z)£v ”@Ĕr&ú ÂÀÁŻ _66€fä—Îúé3P—ÎCĝ <­!â*vÚ€"ƒ@)ÖŠF!Kèu/n-ĵ:ñ> QĊ2•M‹ ìÔËQ˙ 1`˘ÏĤdŬt0l·żkÄ˙î]àŭ÷×>nŬpsµ(À§½:v€âŸ6’ĤÇ⚠˙§—ÊÜ@Ħ°Wż½2À(Ò$eUwż—‰~X‡{ëóż—L’GP´/"½ĉh"‚0T½>ŝ/ĜŬU贁?ù…;w7 67ځĵİ5~@ëÒy4yɜ۲Ì^\4閒ôŝ ĊğZwÜzx•K‹òÊŞĝ/²ŝ~fQ™"̟g$¤·“˙t†ĞiD˙OŝÄ$ŝŬ½ ´v†ħĵsċ2>ËğÏ ïƒXĥ ŠFĦÇŬîqp=œâ½hRŭÈ}ו6è鈎 ù7›@Ği2ü·w€o|¸v ¸yşè´ğX½ru^y%´Ġ ¸´àäC ÇÖeĦu™fC²Ìâ]vŠñ¸ġB„{‘ž÷a½ŽÛıĞjVH^¨ßŠ^˙ è—÷µšÀûï7oï½'¸}Ka·…°ŬF-ĞW.?ŭüÑĝòЇ§ïô@bÄĥw´VŞÔ8zŬo²/Ù¸2@dš›nĠ-YGeĥ$ĵÌġ—ÙÜï{N§ínZ$ú€ ñĞŜĥ£¨?ÀȖöµš@ğ#h·^{M°y_áÎ`kKD¨]:uúŒñü)ŝ% Pb>˜Ġ5àèÑمvš/Ö¨2ÀçÄäMzċ“mĞJxÑÇCdz2ïés¤šñŬyMŜúá˙ÁiĴZ›(X ‚ÀÌhÙŬ:…Ŭ]Áûï+ĵóŽàÁ&°ħ!ĜڂSއ_€KçS›•LL>¨zCpäHŝ8ày DÑ:Ž[l,ŭ#ŜU{g‹ôô¸^Í9Ĵâü>P=Óçg_SôZ;_ĤÈáëv ĝ ÛQhĥ;Û ×Ż Ŝ{OpëfÒ׿ƒVHìcŻ~×ùÉMihm"ËpÓÊ3lKaÇ1ż]&à—˙ ÷¸dĥrëáĠŸŠ÷ĝÈĨ,d˙‰~÷ÓĵíĜċ`×Up]9ħ/ŠŒ`÷˜ŝûï)\ż%¸wĜŬvšh]ĴĝéKñë_z ~‚3N’ażZÏfcîM žBho*é܂YÖ˘£€—p2ʸ²ÛU:fşsİJğ‡yï4ûġ4Nàk­ŭ¸áW|Ï,“ÉoîçR(ü6ÁŻÛQ}Áöp÷ÂWż*ĜŜln­-Ô˘ïżrßŭÔq^ı̵ŝ™h@Ċ@”ó…^YÙk4-ĝÙO:"°_—µĦKZF?wœ¸Ë\Î×Ä˳~'F½ž‘·ëá3 úŽ›ëH¤³úğ]ÓŞ×ż7Ŝĵ˙>p÷ŽÂÖĤH'„Òš—.âäçżĵÊĤ>ĠK `EûÈzùQ48°"ÏPĜOÂ]•xWùœyzŒċ÷Ş<2BO*!ÏÑríËÖìğŝ˘ÈÔïÛĴŝ pŭšÂµk‚Ûw;I$àDa ïÒĊ~¨ËŻ"ĉ§_áu¤5\˙×}ĝÁ0Th4d¤—7Jğ˙ôrÁ¤Vnö˘žôŭT-¸£ÖĞ\ §xÏF'H•÷·EyéŭfŻċu糞~Ñĝàô}dö :ÓwwǔóŬßpppïž`à1ş4ƒ.ŽF˙νîÙ§žŽWŻ\F‡WÇ € çáŸ>ANr­&K÷…ÈzŭQ”41‚”'lEÛI˙½Ìzx_ÀĞ_usàšxµĈ¨5qBŞŠÒh]Ü ežÇ0Şıġô{ŸĊHÑ·ïŝ³Ħŝ(Rh5?îo;; ïżĵŭĥ1 î?(Q~•F,ĝß.]Äßzîyx'ĊúÊe.6/œ h/ËÒÜï ½›t™édĠzs2·÷šwĴ˘‡MgMj›ċ†MÈ Ġ[îëĴL¤4íċ›ûİš¨<°ŬîgġwÚFô;AsWak xï]`gWpíAğ ´ÛG\­sé"Vžŝ’I;wŒĞ-…^kıŽeĵ*oòÙJ€<ë³(‘pŜBıˆñ&U„Ö)à¤J<ïĦ¨^?ûÚ2“üÒ½úm)ßîŽùnGac¸u˔ġŬĵ …V h·!Itżü*Ô_ûQÁċW˜à·€l¸§èâÙĞ6¤é^eĵàŞ×êR_Ĵx2݁<Î ß/_ĤcÒJ({_O/ïĉ9Keߖñuğĉ˙ahżÓ5 ~ï½çàĉ Á½{‚û[@Ĝ5Ïġ;‡1\˙Aá­/żŠßŭÒÓp^ı,ĵğĈduJ),òôç)’ĥ0ŭ%gwĥĊG2x.É^ß~Eĵ‡˘ġûb#h¸OÙe‹ôwÙ|_àwt}ˆ Ġtíjìî*\żܸĦħħaFö† Nb¸—_1áċ/=mz÷żÂuŝ=Œ8f, çU“„²ˆ*l$`”(ĈĈ%£Ŝ/“ÚȞŜtPŻiżGÓĥÙµßëÁ!:“ye÷^N C“ÁÇĤl/ ;;@ğej÷Ż]s°ıİħµe²ùŭ–`ğ mǧĠàW.ŭô>^ıÌŜŭKˆ4Ià#)× nT3˜Eˆmĥ5añVĞXzĦĝ“YŻzáóo¸4zûj‘­“ùÂP#ü oܽ£ĈëÀŬğ@7Ôhí˜{r³-‘Ž)ğZcóÊe|êô3àgY €ëNvDï²yғË×Ċɲxá£"f‡AÄĞê?K´cZŻş šŬ^ |_ġÊ÷67ÍߢˆBàöm ÓnßRhwLŝf½‘½qĴ:Q(ĞĦH Ç_9xêi¨Kĉ_ZÀÎ2w\éÍĜĦştû2_¸Y„ğL—+zפŞò¨›‰n!nïqÔıžĠ _äBŜu†Ĥß6ëñ}ż Dħ íß½£l*\ûÀ4ïi5͚mۛLóƒ Q$ŭÊĞĝÍDô{ÍäŻ\ĉ,÷6ܔ]ÛÇkt֐W)0‰x—€Bñ'UħŸ˘ZóĞY ÛÈ&Ԟ‰ĝ"Éô}Îŝ3â­°³“4íñt:ĈhµLh˙Á&l îÜTèHÖ˙ÂX44œ("³a„ŸùŬßĈĥ­áODżËoò>0ŻÜE½ÖÒÓËUŬd(ì¤JŻ‘"^ík÷z½|Yßĉ 5›ŭ˙w’uŭ8)áìl+4›ÀĠĞí–ƒ]()ÙëtÂh·qĴà‡‚(Â]˙ĝÒEü7§ŸAÍĞ›Ĥ=Ĵá߇€ÎËQ“³x9h”D·E‰ĴÛPJġ2Ûg9†hĴgöìßâĜˆvœĴċÛÇ·ĥóô; ıkĵü aż ÄĦB,hÄQ7ÒèD+ù³Ĥé"BŜ1öİpú ~DÉä_ä˜3™ÈßôŠnö‡M(ʗ˘eĴEŒŠż9T^ú4×ğ)†Ĥôφñµĥ·LË]3%  Lâ^ îÜ1ùîŜQèvµñĉ}A'”6Yŭ&ñOE£(2û‹4ŝCgŻ\Ĉ]8ŭ <€kú%¤(„jü‘ŭ j‹š²_<ô* Ÿ*ÖËËÇaò"˘ÈxòEt;Zm ­7„Ì~’…˙ĉ› a(Óg_'âµñu b…8î'ñ…ħ \êFâACià˘Ż\y˙2|…T_ĝKÙ£˙ÀZuê´ĉȂ/ĵ%š²Ĵ^†qĦôÑBjŸAÄ$›΂èvòÛĴÇħ ĠtÁĝïX›5zk(4›&ŬdÍ~k x°é Œto;a(ŭ¤?S›Żu‰4\hÀUòZ+„ò\½t/ž>ƒUÏë‡ġ/]ìM‹%0PĜaÔX\Bŭ ŠÀ²L ·ĵ1kÒÛañqß‘żn=ç˘û Ÿ<ŜjçŸcż+€ŝ°·;­ׯİLÒŜÎuż+“š}+ˆş]s`A$ˆ3ì-Š N˙ŭ9Z—.B~΅L}ŝóè*8$€qXŝĦµñ0ĜfßàêġƒYÖ¸,^ĝ,ĈSZägiÖsĜŜÖıÇŞ0äŜíšċVK~"RèÍkmšĉĝ ´ë1ÇÓé(<Ĝ4‹bzm³)½Ĵ}K7\kAš5ü x X˘D¤ëJkˆÄXñc`Ž'Ú]œPğr˙žnÓ³?Ô€ç ĈvÊÜ4ÌúŻ›eğƒşğ "oÂìNîšıRƒ7ŭYŽ •N#âV4óètÔ@ĉû@·ë‚04B+ÚÉùlÚm“0·µ5üم!póĤy½R a0ĝ™ĥ;‚Píá"ÓpmkW cƒïÓ68Ó:ñà“ŝ&‘îż^‰ò“óGk€†Às7ğ{Ν߀Óg°ê9¸—>†³çÀTîn‘)ùsÔj£{ü§opdŜ–Ùá5\eŒğŽÇ­•g+zâ9B>Š˘usSşĤ c•u´Ùñĥ›]ú\k Qh<ċŸ I=ĊÔ³q€·ßx^?Ó~Pˆğğ6ınpûv=ˆí¤ŜŝÍS@$ŭ‚úéíKïgôĊ=m£€£b8€cİ9‰!à@~Okx8yé<ßèÙ38ê8ƒ‰z ë“ÂĴŻŭ(pòäĝĊñàÍ/ûĊġ<öĵ? ŜÛ^ĥ1-³-뉏qf­W%îQ„LŸ?ğn^t_贁N·ĝüÇħFS´ Ô¸~-ÏH0Ÿħï Ú-… D9JÛê  –”Ó_³·Ë ĉ}÷ŬnĥÛxNV䉍‚żl”lĞ­5”ŬF =wĥżçžÏ/ÇğpžÍxHIZ”rĦ˃Ŝ Ì:ù~†eÂÇm'Ŭó~:‘ô ǵzĤ'bZ0 5ŠF'Ç@ĞY,äVˆS§žÎqpӜnŜÌw:\׎ 5Bže·xĝĜŬÉÛğ‰¤ħbŜ ı[ƒ˙ú4üÖ¨XÖCOŜ›hd·‘şŻĵ§?+ó€—äd)îı³x'ğ“矃# iàÜY–‘ €ôĊ¨”‚WÓ¨ĠGûe   Ï|•ï{ƒkĜhPċÖεZ-52Á°ÓJëKÇş˙œĵH_šóím•kHhmĥ{ï^Ò|ĈOϳ7˙oĥ1€ ŜôŒqíŬáÄşĴħ"v³ï³˙\%@ ½Ï€ˆIçĈkóö­Qs2^żcÀ£žcŒˆÔ>ŬsgñOF}f/ĵ8ĝQn*t‘áì9NÔ#Ŝ›%Fj$ıŽjlp£“U&xPKÑŞĤŞCí³4‰™¤[)żfž}ž=ĤŜÜÉŬŽġzŭ€äeı› ó(2bœŭLÌzĵÂîàî&P0&ÌóÛméuĴkµqÔżNŒ@+D"h7·ÍASc½u|(WĥıJZA4t$V™hĤ²ĵÜ„ŬÍv%‰hĈ è9¸ôä’<@ëÜYüûyŸÇ³Ï¨—ZwWÒĤ>÷<Ôı³Ċ7̗_˘'OöÈP5ÀU}AQI"LqyK™òħ²£qıN1tŬ~÷°Qûa}ùâ…ĵn·^²ġÚ§J£äñ, ddM{ğ#ħ ıg#&ËŬԜÛÇÚ˘ğóXĞ%s%ĴrÈÀ*cïïQÒÂVçoD _ğ Â8c ˜uy%Àí´“’zo§×Ñ <òZú˜Ú~Ħˆ_8Ëuw²#!\w|Hßq‘ñ9Uë²yáe•™>ÉñPÈË ü,Mc‚^3—<|_÷ ìgb Á͛ŭñÙğżÑ˙<۝ĴGoZĈĈÚ;F€ġ´¨ï÷ûÒ­gœ‹ôÚyöĈq&ŽŻ5”cŠ“Tz™óĝ_+Á˙i3v֟‹‚pğEŸÉóÏA=7Ò#çpr8 ?‹Ô"€R‚ZMŠúeJ„+ É6ˆ™v¸ …=ßKϖ€ġ<éPġ„-ï|[oܖ˘ċm[$UB–‰‰"q·Zf4kús²ëĉHŻlÖ°35çĉ8Ú;ùÇà8ÀnjíÜßŜ²Aޞ>?0‰†…ÙìŬìzĵ6 iNŽŬË=üĴrñ.…ëħ^87Çx뎗²*” ŒKc%ŝ„*@ıĝ.dş‹<Żĝk¤” eîe{àe ³[Šzħ§›TĠÄç°7Š)óĵżuğ£ËSğPù pq,=O>ò´Ġ€!°½­†Œ‰ 0Ŝû͛€o œÌµĝ&àûĤ,màħPÁu€¤yŒŭ.ĉ,öét²‚Ü_K÷}›%Ġñ˘D;ZĊYEk€ş½?ôŒT$0VĝÏ1›I½.’˙ċ ¸:FÈëğ­5zù%&Ċ2µ Í@ A;żD)`žPÍb,“ˆ—Ĥ2zߊĦö9ıŭ{ž7nPëıĉ µ ]G‘ñևÎ{"Ĥ~7ñ¤ÛŸ“ñÎWŞ–Ä8°ğÓo•ŬġÛfGĦêyôah†żäyÙ:V½ġ¸Ww>ÜDĤ]r³n>h!$Ùì•Ŝ^ê˙MϑĞ@_X“uzïŝ;Gż÷ŸżÖÔ#Dĵ‘ûmpÇ'ı½ü^ġ„,ÚÓehçeÏ XÔZyöñqÜ˜ô6a/3‹ĵÓî'šúۈcAZï{ĝñvGCkàĉbcw{+İ}÷‡ ÂôZ·ß-}O—ı™ìûÜÄ´¤Ŭ°!`ŜKAB. Úäj{ËÀĊœìOhŸ;‹cÏ>Ÿş“cıp~Txĵ9NÄ}^á„ì# {uV—pf˙eCŞ‹˘w‘Às½ĵzïĵhĜJ^7·"*ÉÔ´"lŻvÛ8&‹ï :]ôĞ(3 '˘í6°³­zŜxvÍĤ@œá¸ôq- ¤=äžàÉëtFȓbñ"1Í—}'Ŝşv н­Ċ)okà'=§*OšÈˆżë|ŭĠßх!ôgŸ‡9Y›xîy`TÉ!äž3Ü)m\÷;ÛĦÍŝhí ³°…]RÈ>nCéEġċU׎s½<_̋ĈĤiLÑ5aĤ­Y197×E?NkÀuœpı@÷&žŬż?XîföaŝĥıiÊ͆;ș¤¸N7é ß|/JݞaßKúZ´×ŽŸ²Ž¨ŜZ~˙}iÉrQâ›VrçH¨k dáìúı(Àq75p2ç\7^>‹ż[ôùeK֒&2h=ÔÂYrè 6˙§^s3VCëĉVüÍĥŠîE27ħ?ĴyŜcŬîè5ġ PÉm}żWo>ô9 &ÀµZ qfg |_íwïP2d ÀÎĥùığ+WŒ½–˘P ]ÌZı—2 [Ş;xErŻ·‚á+JԐçlíWP ôàvU Ä ü.€Ú@9À—ϝĊ/Žú ӍdÒMdĈÁ’5BÈL€´˜—ÙlX=ïùUt…#5ÖyıÙżg—el6y䯙[Úïšy/Œ"ŽaÒĴċúµbujµtÏP0ƒW-Ìn2“l{ğĜ s’÷²ëçö}vƒôà•A‘/ ·9W’í™mIğàs8ö҈&2/ĵ˜?œ%fg³‘ !dá€ÄÀħc §NµšôrÊB1ŸLăıÎ6ëĵÈ[÷}ÓÍÏï˘ óZßkϛÛmZO=ÖfŬĵÓéGoĴ`ĥZ‚ĉn˙µÙµóv*Ìîwóšżô÷‘ŽĜĉ1ıß’‡ġ2O̓Á+A4ĵvŻÔòĥcσWÇjà½/‚Y£—H#¸p·‹ÎíóÏÁQn‘îGüÙҕ²Ż ċÛğĤî˙“ŸeAñìˆGÑşyß Î_7ï{²f˘™Œ0ĴPë¸ßĉĠÎ1cémçŜ½ĵÏɄôwvL&{ú¸íÀĜí”6ëó&³>ñÀ3cNíà @2­W³]î²Ĉ@şî<ˆr[ş€%RsÓíÉk"cEW  ]ü€•ÌyŒµĈ×.œÇ_}FÏ>†çàĈ¤Ĉ,‡ħBŒǎ˜†$ZŻÏu‡ĝ{Új ğ=´f½x›œÖÑ4Î ·ìû2°˙]XNħžóŬğ@à;"pFz@¨ş~4 Ól£’uóHÍíÁĤ3:Ӗ5Ïĝè?6ĝ{è›5op˙%*ÌZŽJm솚ˆ@gÊà’CÒÊĊKl cœüûċ ¸Vô"VsBâ8£›È\8˒5B xIèßqŽ£öUXTܨA+ioĠ4gI §]G‘1 òĜĤ1Ep7én×͋ZĝnoġGĦ"ċñšP~O×je˙)Ï8ì7ñğ P„é¤ğäuĥ‰Œç †ä•ŭ cQNŞ×[jî9k3ùld:{âµ|×ŝ;ÜFïêçñŻ³ôb oƒ]Bf½WÉkñ v"ö5tž3ĥ$23 Ħ­Ä.x5 d~ôƒsÉó_šMu´ï—˜NRKšÈÜĠ nɟ?< €nÂY :7·ĤĊ"i‘şĥö\ñn·Sl(SÖĤĞĞÁtµ˘BVß,ÎÎ6ğDžO§'é›Z{ğ9êËĊŝûïĊ ~í$ûœw×àw\WÛÚ@fP?Ïĥí˜HÒlú÷Ü­¤~xê€3÷qöÉéİ9Ŭżƒŝ¸>⵺umĉyÙÍDwεÖ*™r™~˙-.6‡ÄĦ,͎BY¨·Èh™eY\X¤-iËÒzÍl†uódĞ|#é5ßm³o„ûx‘­ÍiiNÒx×Ôĥúç|Eҋí‚!ÖÏ-ÍOêtכ}üĤr7ê^B²0 Œĝg“‰ŭœe1{ĵ49gñüzíÚöëuĴı›ĠŬèÖĤ›•u{ڒn끑¤ùÜ näCP{N’l0 µ7§\’´†Ídm`7gAJúĦw‹Sáá+ÎäÜHI:h²ŝĉÈBúúäĦ~ĜġĤ=8ÖažéI² ˆİĥÛ}:£Sà_²0ŻG–é ÙÇrççÒd,Ŭê)lç–çxŜ…8Ĵe¸ċŜo c›óÎ÷äı,ġ—ş‘)+· 6sŜš4Užé›&ŭŻıI:œMġĈŸ6‘É{ĉöê“İVüéŝÓ €ƒ‰ğş “Ü.Ök™—9Ğ_<áŜSmFĦŜĴÚĦ)½oö´WBH'§ÚBɇu0.½ôËlŞ×îä#ġÑŭ^Ĉ4‘<ĞÚ ùŜz>xwaf·UQ·ċÇé]ŭLVJ² ×néwm™¤Éĥ‡$;Ë,ÓĞUˆS}ÙÎBÏgS=ÚàŬžïİÙôîik ÙhŞw‹Ï?3÷Îğzß{·0g62}Ùû*nèĵŝÎ|>hj“ešÌĤúâġĥòşVîFí ÄŬ‘İà úv½`r?oÉ2IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_GuitarGrip_Button_Blue_512x512.png0000755000000000000000000012303012467662066024144 0ustar rootroot‰PNG  IHDRôxÔú pHYs  šœ IDATxÚì½{e×uŜ÷­µ÷9÷Ġybžfà I ¤h—%êIŽÊ—Š”²eP‚@í˘Êĥä¤TŠ,ËğT Ċ˘)&Èb”0q•­¨+‰­”])[1-š4 â=Ì`ÓŬÓ}ï=çì½òÇ>çÜsî=·ğowÏt÷ÌúUuÍtß×yŬ³ż½öZßEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ”C íġF>jÒ˟tÇ˙ŝîÚàħŸÈ0·alú½àŽŸ .3?jbwâA$! ÄÎ˙^víó˛}–yĝy[ûC6˘léTO­˘(Š˘ÜKè ü*ÙSÚGD'`;gc熀xÈà óìM€ì°ş Bàׯ$‹joÌ\0‡?C,_Ï2›[N ŜXwísŻlµĉáç)W! v# ħô’èeĦ(Š˘¨˜söy­î—ı{é ^ü hq4zK–˙߃dr‚.0À*@ž5¸>ùŠÂsHĥ2ùx² ï3Àù•\2äĈEt`à—²—ŝŝô}x.‚á‘ ˆDHĥô’×KFQEQ09ĞŝżLëâšÔ:ŽOlĝÁĜĞ<Ä|>fûʔ•߸; Ä ËhHş HàÖ_Èş á@’›$É-)?ÇWĈ˙ .—â)!C˙"[zé×Ĥîûùçĉ@œB )ïP# Š˘(Ê}'ÌùçŒsësĥ}ö†gÌ ßê\™ˆ""â2€¸üïù8-ckÉêżzW Ġç$DŠ××w²ċR`¸t L#!H7¸ ’! ëGˆ!é Ir+m§óA8$óÏ8^DÈ÷ jwí³{ á•çB<£IĥôR˘—İ˘(Šr0Àı"`^Ó=÷‡Ü}ĵĝApç<Œ1hǀs‚ÔĵâÓR”¸Èäà>MˆŻ òuñàkïQġçÂc|mém|òV Äùûxĝb³ûŻÀ@ĵH7Fĥ~Y ]ȒòsˆŬĠÌñĝ *l;Cœ´ŬµÏŭËĈc~ö9†áħ`J" GL#Š˘(ÊŬхĊ äÛȞüC3÷ħïE‹èµ L@ĉçÎ"ÀÍäŭԁzB Èĝ¸ĥĊ²üX4Ħù½ŭÄöLˆ‡&áà6@4ykù âGâĦúœ4D%$ıĠĝ9nŭ&x \ZȖ^"sĉ#ì}NóEQ”ŭ! Q1Ŭ“ ù'aŭ)ĜxŬVHÚÏà=äcq ¨­ùo2@#žŝĜ6¨‹ż‰xà<*À•ÏÛażŜŻ*V|Hñ)˜yâı’Ü„\/" µffĝËⓁ™8™FàÓ;€dëU{­÷ J!0'Ŭ•ÏžŸz~ @" ”-½4݌˘(ÊŭŬġÀöYK’~;Ea¸1ññÊ`•˙Ka$²&ˆ0–GÍ" iŸòŸòü)Ï-gëĀ3öxáE êátxßi¨ŝWáħϏ@ÀĤö[¤xnġyí¸s £7ĊġaĉŜq†Èé[ŭÈgb à7^ñ|ác“ËŜCÜ „²ż3. ‰àqÀÏlz-<ü|\{m½Ä2Ñe EQ”ûH b+ġa‚Âp v46î0,ÀxT=ˆ‡ĈŒ˙İ1 ž!1›p<&RLĵ%_Òşa|ÂmĤDĈ†O²S#4ŝĜD4£YÈžÂöY_³âx‰ŽÂôŜ˜XsÈ é2¸{ 2İ @I—EÒċżÔÁp[™yä£ÁĝÊgĊ²Ä_ƒ ˙=€$ ƒżâq×>÷§ ‡óÏE &oT!½ EQ”ƒ(<ŜÛrü$ŞÌĥ›ïÛL(èˆMe½§Ì°÷€Y„Vâaüİ´YäÁ4ĵ`Šx ñÏİD(Û2Â1zëђ…x—'NZPëLMŸ”ù ù6° I`Ú“.‡8Íà*ˆ&÷G’›äÖŻ5žpIàú˓>„Aì-}†pêgjI2ĜĜ˘]_ğ£ßSEQ”*€CıM!`ÑI6z˙"RÑ:À”…òJHxž“Ê ğHôŻÖ×1JaħÀ ?ŝKÒ$ŝÜĈMôÍ£ËĉÑçÖKéÒğ³ çGß·ĵA€!À]ûì'§ˆÓ´˙ÇG5‚ReGĜ={'²z4ïÛYĥĜÄÔhŻÄv’!Ğ2oQĉX[2¨Œs²….mÌi(öÓOÙôvŭ3̝Èt'˘k™µÏçŠyĴlĠm€à@ŬǏ?7‘m,ġĈsò(Eƒ×“/ŭ•ß,DPɐ >ğóÏrE$5Á"Hü!€_Ù"Ş*…dĜQS'EQö&pöYĦÖQĜùwĉ€sèġz°•{şF4ş°gхFĈ+kûïÇrĈ’kU£ÖÖ2ŞgmˆNdÍŻ/6Ç­„琅KVÀ4nŬ°?XJFRbä]#y}r§] ü[ù"Lp™ˆí$néĊ˙n“ïsĤŜQ3O‚€L£Š˘ rx^8ŽaŜ@çQÌ÷Z¨şÜŞPñp˜ÄL='$›á3òFÙkÚRFñXùŜġ¨ù>à6à“·'ą÷ĵĝƒ$™ĝÑÎùÁuòÙ ž><ಕó0s§j›/f2nüƒİk%ĉü³dëoÔżB…ƒ˘ ö,n/ÜÓ£ùÀq@**öʲú´ s§=j7”Y–KÛL†”Y(!ĊĀYĊgjǔ áĴĝÊ;̸X‘t>y+TUŒÛ3ŜX í$6#]ĝù Dp€² g~ft°<ƒŽ~]ċĤ.Hó” v*šëiù ğĠ<[ ĞĈ˘›ĉ3̃ÛçkçĦ0w‚O€ŜeÀĝ9“äĤ¸7 Ġ”3ëÏĝôDĠÓ ¸7aÎ?÷‡ċŽ€²aqÀúUwċ³˙ëÔ[ÌÙçşUc§Ê’„×KEÙç›xö,ñ}a;ۘ‡^grd½šŒx¸×áĝµħ™@˜Á ޞ(XŸÀÍŞÊ˙WV1ĵkBE"ùrBİ5|Ö(¨Ò¨ŞĉI4êrٙ'ÓıžŽ°( <ŸÁƒ:'˘ âúàı7!Ùú{Ѱì(ÉMHşò;|ácġsÈaû|2Ä˙MïŽÎ } ÀĤ ‡óÏġ@<ÚɊ$´A•ò€³79ç^nÍÁœĝ!˜ıw€â˜ïÍ8¨"EÄáˆw™{’Ó0mżŭKSò ĦSв¨Ddzi'e·à“ÛŜ @nú÷+Š)[{ı_™Çp5j2€ËÌwXO—/ñ}¤Yc[ìĝż7ŜÏy–‘z"#PçGE#ÛğÈ´@r#q=:áUz!v—&ÊèÁVÂÁŒŝMÄvój" é8ċÍŞ\ ‰N˘ScÏ B„ˆ@½w¨'$[‡™{|şÚx.dpĈġż4ŝH ÀġŻM4¨˘Ĵùq—ö˙À2‘yXÑï„˘à0­;™5UKÂvsƒ>X„Їm Áħ°ü"`Xżßı3˙x—ÀJ /ŝ/´ç—áïĵœE>&>Í@’ŝEbg!<àċäÌÓ-0²ìÊç5§@90ì* œ}ÖBü€ğïáù ];˙xŝ‰”XŸ•„ÏÈĤĥ¸ŬüĤ›‹„i7°&—9Š'ĥ§*&Ĵae§À‰÷û¸w×Ŭ!ŭĉûë³ş@(î!RO˜ôë ? Ŝ ’%îÎ§ĞŽ|żï!~ÙҍoŝO·ÀœŽ İh‚r˜#`fËۈGfżûƒżoP:‚,˙R‡n£Ïġy9ÓX‡86Í{\{’­ü}…ĥĞĊúdaÏZ3:rc7;›‰œ‚Ú •ÇĊĝ /›8ÖZiFQ‹@4‰‡Y½öUDìĊìTEÄŝ‡ğÜĵjï…jÓ*İ>Vĉ˙ĉ-ĤM”çÉ(WÁg òí­aÁ'¸ó|v‡Ŭé"]ĥż ˆÇïÂe1€sî…(ƒ[úÌPŻ!ċà ñ@šAÚf‹™ê½ùŒê™½Ï{ĉB`#ô…wĉìŞìDdç+7“ÊgĊŸ]¸ÍE‚U²“ĵ÷AX䏍ŜŽ"d‚™Kċ†$ŭM(ŞdG7Eö½ĵùM&&W—Nş_ aüwï§'Inköµa ğê~ıaZ>ƒŒî)!ÒF#u`âEĴN„| x´Îƒ[ž‰äÈ·‡öÑ~§enxäÚ?… ~‚UżiÎ?ÛĜıÏh…r@ŽâJÀ£×Ĥ{³ġ•uwb“'öMfĝ‹ÏF!?€ ÀgA¸!e!X¸§‰‡’·7ùlĵ8ލĠñ˜˘á?İŠr'Ôz)áBŭöFÑX€'Ċ|ĝüZS •ĥó-yĞ7׆ĠG³q–MÄd h8Ó5ċ8ÌP~ÙtCnêŞ·Ż9[í „ŭ‹0Üá@“9@Tğfİ–T%E²!‡%Gˆ‡ ÊE‚/~$iKÄÁ÷_^˙^qï–t™ÍĊŸûD²ħzÑÄÑY˙Ì1ÈàŬµÏiŜ€rÀŝNóCĤñwñáÛ)~TÏ/ €,¸}6|U³Ux—éÛe@k€µ›tx+6 q ͏M’ĴŬ,\™gÀĈ†32ĝäF`˜â“£ÏäîäSúÊËE^A‰pYk¨v­ċ:Œï7m& " 3ċ8LF š/)7ÚîM<ĝ·5Óğ§‚AË/á@Ü<)ĦòKb•Ĉç#<¸û8¨{ъO-Èú£ĠYzE’[ ‹żHHn {s„“?Az•`0s9’é… ŬÜĊ­ŜĈMÜ/a†Í$ GŸgçsFRHëDX— “ċ^ĉ•™zrkpëÓM‚ćÄ7$İ”Í\!L’.7ß\(ƒoşċhİ ˙Ü}`í…pÙĜÌŬzé…RGŠ€²‘L}V-ED#f€ĞĠ é–7Ñş€ğ66†š^I1[Žä%<ħ„QÉs˜9Çaߓ$uyâ` ‡m.uCć?K¸91|YfìAÊİóï‡é>F—Ĵxò}P´(nSïgגË˙‘èñżeüuCٚd×  ‘”ŭ€5Ì,ïêÌüëI£™C“ç ž"8Ç &­|$pıú.zĞ'e2O9^ɨ\££ċÚ^Yrœ7A o7²ĠQӔ)žĉar€Ûù§—ĤˆÁ²1zÏÊ ğaËÙĥ¤·&g‡È@“PÉh²ó£…†ÁÚ§·şùħéċŒħŝó™ä⯒ëP~fÎ q½YM5arááĥaÓ`<ÏaÜò^ĥìLıIÄĴŞ$S£÷^lÚ(&ĊŸ$ĝKŝŭß‚9’$`3Ïp°g~HnÌ:?¸úÛÙur?Ûĉüsm·ô™žċŜ+Ä2Ú=ûŽ ŝá_Q¨@pĵY-…Q}Ô•cDÍoĞvÓ'ÔË’dHÜâ R/K˨PÉÖ@`0WK‹Šql´à}RîSù7*fšİrb2žç76½•êàTF8,ÈöàûĵÉ}̀ìbx}ÊÍ""ß61„ZQI+÷Ĵâġc‰’µŭĜ@*eDMıi)gQPÏqĜ’ÈÄA ĝh2‰ħ­³ŝĞ˙‘¤+ôVËĜg˙’៏ÀœÖ¸µ´Pı‹À0zp›áĊÂÄ'·ÑuìîaX@ ˆĴ ñÜ8^ÌXÔ” Ÿ&Ê·½jšĠÖɉ½o¸ÇWfö&Ş'Ĉír (ßИċۋ£— ‚¤Ë ) –"ròAÏG ëE8\ò¤Èl}ÒµHt¤[Šŝ%·§y0`Û™N8ZM‰|`P´3Íyċ˙푰Ü\kYmP‘Ú rC*ŸYġo•¤òóh[hò˙› á9[§Ì¸Cäàw}xDÂËcU$>  ,9ô>qœ·r& uÔ:Ġ"¤˙*(ŝ$]ùÖcÜàÍ˙.ŭ/\×!NÙtÎħĞ÷Ü â[Ŭsç|˜ĝÁ­ètzˆ+“²Ì…oĉ‚ n€ŞkγkF˙€$ ƒ£óT‰Œ\ ½ R=àËAżÚ ŝ1 ­DxÛ7Nq3,çIĊ”¤1d=ĉž­ŽžK“³eÉÖFNŸùùĵ)Kĥĥ…½kĥĊɌëı 9µƒ9Û6ó!qŠx¤ìŠ·63)ӛrÍCĞÜ ú›l÷¸1T£)ÔÔHÁ6JÌĥ=`×Ċ óÈìi<Ú6³“䁪¨Ĝ‹™öaf‹ċĤŠû`ÈeIFĥĉĊrĦO€ô-¸ġWá׿dƒtġÚaċ½lÎ>×qW?£½ ”=ŒP6Öt˙(f˙3­0Ĝk oÍHœ€Îç³ŜĵlN|²xĞ%h0µùyÓrG5f˘3ŠâA6ž""šhMMĴ ˆÍŒ WÏrÙmIĉĴß5qÁ6 ĞËsùk˜ĵçübħ€é@LÔ:k‘.#Šŝ™_ô/˙—™l|À’=ótœ]ûĵš =Àìx Àœ}–ÜĠĊ<üĵp´3˙$xñƒûĥP„ŝ­İGŠÏ­†˙Ç·KD:*·Ğ=;ÊÓn†2ûûmêÌğ[o÷Ì] ·Èw ’ü9QS3ÙúĤ+YJ Qĝzíü $/VÄF#îN^şÙŸ2¸äŽor$[™íÏôóY ċ–£(7D#Š!ܛržs`:#ñ@­‰s@LŻ ëñïDıdğŭoĞʉê DvL@m³§T|.—)öE0‘°ûIя hx&Y™,LpémĝÛ˙*•äÍÈ —áÌ­“¸üŜÒaP#ğY~“Ú˙ˆss˘Ġ´ä+ĤħÛqBl*"`;k÷3ܜfıiĥ£[Ü &oŞġŠ&1ñŽ!Ò°Ċ>Óĝ@ÑŜLDŭŜ³ò˜Ž—BqȤ'lpFœR€Ž”§ E[İÔH—§Ŝ¸½ÛÜ$Û\DÀç‚c“çd"IxŻİŠy!ܜ“•š!Tı½ƒ¸2)ïáƒ)”xÇ#Éêr@yL¤<~e´ÂıI!UĤL1ƒ*ó18‹:T" HdĝzZb³ċ Ĥ_ë÷Ôjż£S Ç\2‰ ‰Cë|IŽñï$]аwr3;{t~RìñÂëş4 `֙Ŭ÷ÁŸwÇ`XBŽ@ó~ŸU˙NEDChĥ5hh]<91۞ˆĜ:ça|ɢRŽiì”mßäz2 9•¤Iİ>ÖêMŜĵóäEŽOŒŝ_ÙùrÀƒ+„÷Y½K\ħŭn-Ûl­ázİx¸;RÀ›CoÄ@ĥo²ŒÁ@r;¸>Ž›ċÛKĥĥsTşĠĝ푽ħj‹ÉÏ%ŽêŻ\Úŝ݊@ĥ! çM¤rìĞî”ċpä§ nc~;TFLòeïgûmúĝA(äÚñĜ|äĤCĥ<8ù0]˜Ö)Pû¤ġ­9InŝžĴ}í&€ßm=ñwÎ nşì•_W! `ğâ¸>µS’ü>T2[­04 *}!ۙù4Ġŭo‰ĜQ΃ݍvÍe˘Í#䌴qw·‘4Y~nQq £ŝ 2öċ›'ò´ëÎB²upC…Aà³ÀĦt³ÁĥıH $BÜjCÄ£şÛpÉÍÑĈW5 wIÓjün2dáÁµt‘,Ĉs*Ğ'Èôò¨@eıċ×UZ˜AÙQµ…÷e“U3­]ċђOї£OmfI]KÔ­DEŠ%½ñ’)×}¨:i9³,CÜkaĦ7Ÿ/…)Q°::ƒĝĝI–lóqżŝġŸuŭkŻfËoŭsĉ™ğöÙ &Ul28dIQİ#´XnÀğ·ħŜĴ‹wñöEĝĥÜnBˆX0Ìúĝ&‘‡Ĉ­I$liim! €šCÓlh˜‡hâ|Ġ×j(:Ż$äÚ£5[ħ–w@ôPcŽIˆZH7ÒÛ2ÍI´É[ċ÷lšÑPˆDK›TĝBÙX³ŒpYÚÔÜ*Dm:ĦÏE°wjHbċ` …ıJĠüz~”ĈşNĉɗäÖÂrʔ/’~”÷ħh:’ĴA̕‰{K.…41ĵ0Œ UÂ=p´Pvï”,Aµìq”ÈÈ£ &[UçFjşfŞF?SEïñwşpH³•„ÁÂÁk›`˘lí<|é?§wüÊÇŭĈċżġŸ5ç>úšğòIí@ĝÀ ),s)äÓÜ'ƒż×À–ŠˆŬŠˆs&“ûĥ“<ıƒœ‡Ú ĥ¨Ĵ ħAˆëÏŻ/g´„Du)$Ê_Sï°YˆÉ#ĤÓCc&C>IÊ<Šİù> B#ğÓ|,Ċ§Ğ NU0Ir !Q²b=mNò~`¸AäC›ëĵŬXë`ÔĴšËǢ‚l³ĥ^*y‰¤ĝZĞîѵ4në}7òüX…Fhġ*lC Ĵd@çQpû‘wÎwÎ˙Ŝ¸üגoŝé=îĝ4ƒi?ĴGS9À"⋉=Hž”-˘“Ë kç›-WÓÍĜL¸4Ĝ@ûdt.İ9ò@ïç3Àöòŭé„ÇËò6İĵ΍m·opàÖFċ €Ä…„ÊÁ2$2ù{ƒrn,U­h(?° *›b1Àí°jz•ÂŽ"lò˙ç)8MVša5_wc‰€1ž,˘7„Ŝ[À' òö#àĝ4s炤—ݤÉÊ÷Zĵé|rEïW‚ÈgÄR³&?” OZß+²˜8d({‘ó‰Ĝ*çÁlù{-‰’˘ĈüÚñsĥK– ˆ)‡£ú˙ĵ£p+ èĥ /\„ĵBC0‚ï˘fK-ò²;!×.<^ ı HşQÙ  y2xÄ<,(: ŽO@òj9–ċ$6/Qä J10–LĜ(öjy`,g&ˆÓAiÒÄ„/=9¤OœÂ헿Aŭ?ú]üDgʤWż¨ù÷­È×ĊĜîƒàÜŜx(q8°"b;Q…YĞ-ĥs›ÍlĞͤp i ²ŞżÇ˜ ‹7ogĠ¨°KĤА˘ÌÏDͅ}e6@’€À?çĤpÙäV×ÜxDCˆÚ 7Cž€ˆ7ภ$ëĞĦC qĤuÈó ˜ÓPQ­:à6DĈ< ŞKÄwI4{Ai(Edĝ$-ZŸ€Ü9ŝ}Q´(äאĵö[dÎ=ÓuWÔHèîÊ'Ċž˙™Ó öè&-Š˘"â;ñÒozlĠcb;âL<´Y˜èĥIE„ĦúŝĤú~y~˜I ĉ ù[&ĦüP²°ÜÜ€OŜ‘ö Ì‡ö×Ĝ@ħZ! ’ĵ[ yÜìBȕ0sÁ߀[e†/£ñ¨{dħí5c#ż‡×àäÒċ­ÑĊ3È2à# Züà3ĵ6wŻĥMQ7´É6ù;vşêÏ]úŽUoµŒúêßyògü9ċöˆ8˙ĦĵğĦ“ûDùóód@lC›gŽ Ô ÏáÈÎv…i-‚ìBxL>Í H iâ!(½?¸d+á=i4 gÉ++rñ!ùñ$P}i£Ü -–wĠırLŠcŒ›ó~ ı‹ :n=$ ^äıKߑġ7š#ß½,k_Jôûvĝ#Š˘(÷(Bħ›Ĉ.˘ ›,?!7ÏİD &r²ÉıïRˆëe+Ħğ$Ç ÓÙy8{IÈÔçĴô%˘k#EġHH)rvh°.ċAŽA>ƒ%>Қ#;˙g‰Ż˙ÇÉ{ŝù;pkĉìsÖ]ŭŒF³î5Öó–—;8kíjQĴ(*$v-šÂxµĈ:MÖDAéÊ^>Ĝñ2@v.,š¤·a˘· näVr‚[ ıB &Ptd×àÒy°iCìÀ„×d:€¨D[lž88{¸40d‘˘+4χ&LÑqKs·ĵ²{ä]&}ŭşz|¨3(Ğ· íN鎖şpĠiOQ”qĜ†`˜5¨´ •@F –|b”çP6Ê! (:–àsw>0\‚ßx d2@¸á-pş €á¸ Šƒ[˘£Ħü’,ÈShvDìlȌQž@ı­{/B…ácş J: :ò§ wñb{"ÉÍnéĊSöÜÓ­ìÊç‡zm²ZGÊŝي˘(÷µ`Ĝfa<3żl2U,³$‘(7ÊîÒqCœ ËĤnÉ’­†×àÒġĵaÓd#C–Ü| Ó;´ÎE×ïÉ€,Ż °£(E­˙À[ Wl…9´f1sùŝÎR‡/ŝB"É­Oĝxtú§8½ŝE­ÏşGì. páżLd"Š˜C²â8Ş…Ú‹@Wáħ÷?[eÈn’ÇÓ$@EQv8²aG‰MɇyĞbš Qn$q âdÚ@^Hfd:`ÛÛ$Í èCü$Á˜n’ĵB0?"ĥùv‰€£{×ħs4*÷ (œâ¨ ä΂ñIpï‘ÈğÛrÑoÇo›ù÷Żù;_UpàÀâwŝ2Ž8žgnŸĊ'g³°³ ïGŸİ@Q”ŭ²ı((+ L ›żÔäbÀä3y–ìBˆDsı݁‘‡O† ôCS¤ĵ s˜lċƒżÈhI‚Êe$ĜµCj)pòhqpDӚĉǜ“İ9 ³nŸ˘(ÊöÙşté5@ïóÄAñÁc@ü¨5²@Äŭːä&ÄCĊ—Ü´§ ꜷςlBQ°$6-„&FùÒUñ'Êy÷ûZ,ƒĝĵÙRîtèî|²öU¸[È^ûu2ç˙²uKŸ*ğÈîr(ƒ¸tß\ôYsHE9ÔL1Jj(=y€|™3@”—Ôû){>JoC’7t%ˆżNÙÛa)ĦuÜz(´&Ĥ„ €…çżWÚתvY:8ž$È1à3˜î£@çLrÓ§â‡Ğżàìı§MvE]ïğ[8úżjGgî< 2Ŭğğp”żĉ˙5&ÌîMŜa~@—E9ˆlħLP. bLT1Z*Q<ÀˆÛĦ¤0šÏÏË}\É÷ƒ×€‚ŭüŭMĊÏ äԚ7•Bğmž–ïCŝŜċRË1›öI°µ'%ştlŜ0óOùµŻĤz­ì½üœ]5œ}6œıÌ2K;év7PoEQîÛ2OŜž‹™8ç&?y>‘ ú8üE!ĴÏmˆ= ž˙6ÜàÎ#@|lç.]úŻÀ­ż żŝÍ`Mœ­B\?ô, DDÒQ$`Ìż`÷Ú'ìOXÚµ·AĥĜKàc˙Á\ôw=cXœ{ÛD>ŞN.{ÌN—Œ9ûì9PÖ7„‰é‘TEıĞs´1Gżħ „ÀDqys˘2LC ó(lû Ŭï_’Áï€ŭ Ôê:AñIˆ>ÍmŒóe‚"ħë²ÁI'Áђƒ:1$ġàù÷Y2=Ĝċ˙w%½ükdÎ>ğĞŸQá}£ ÏÎ盢(ŠroÄ@ET½|– ²mxïAm  ’âR€Û0ĥ?|pw@Ñ$y^2p²ï=Lúvpl?< B[ oKLTäLÛYökdLŜÎÑ"à7€Ŝ;`ı%ÌV|˙ġà½ĉìó‘ğúi]Ĝ%;Êàù§˜œ[E?ϝ9PtÔ:}r¨1 (˙ïùQĵ½ĉ(Šr˙є/PIĜ”Í‹Š–ˆA܂ EGŽC'?ça à6€l}x7Ûvú—Pj˜ÏŝGŜ…o€ßEé`=/ äpù9!ž{ÄĤ%ĉĦ? 2ĞfñÛéWż˘Uûcö£‘]QEÙ§¨€oâK!úĜ`5l:?,-‡m|>y <ĵ InÁgı·A>…Ï–AñIPû s`N!>ô/9ĤĦġ.–*Ŭ `LXŽ€ͽw1ŽŽ~ {û÷;½“½À×ôĜ@ì@&Ö#¨(Šr`„À˜¨ bžÍíü!– $t†˜6Ä.BÒPĥ Ÿm ?€¤ËàöYĝÖY€|X"Iı,PĞ `Ż– ȓ-È´ ĥgX€˜żôoÑùÏŜ#l‘ú)-ĵg€C—)àĊÖN³Öĉ+Š˘1L´ë%ä‚À@˜)Üùā˘c0É-Ȱ V!Ù:|rdÖá²5°OCYa|<÷ h_Ĝ| HÜl›fˆ俇/îʧ)>˙Ÿĥ’˙^[ ßm0ş€8>˘GSQċPŒÖ"á.ïÙ}œw'd-€b°íB²n°ìġët>ğö è8<ŠO>‘éäm‡óŝ-5ßÌ(xb{ɇ\òHtĵT'<Çħ\ˆ˙óu=ÑwQµŸR:WE9”Q|†-’×÷# É}~'à€;0Ñ1`xžb`@7ĵ ñ¨÷8?”wnÈBnEc}v BB Ï‚€ˆÀ‹bòê ;{îCż Ïżž]ûüşžçéìÌ`ñƒ / Düóbĉ-<²GÁĥƒ8Ş?× àü(D0.Ô@Qe˙¨ô (×îiÔş7ëǀ8]ÛÄ΁ā$Ï† Êà½ıĠ`7ìû!/L¤Ĵ  ÚÍ{'=*3Ob$²áŝŸ"Ó9çŭú•“ µ³ĵîWż˘{*ĉžbˆĝçıŬuŸÙù™İ˘(ÊATı…L/ zˆBÏuĦdn!˜öxˆ‚üÄm@²Up´ÉûPÙDÈ4ˆ™Q TKhÇòÂß,q<ˆ[Ò·úĠŻük=·{)ĉ?`@`"ŝĞB˜ùw‡ÎSPE9üB€PğĦfƒĴĝà! ²ó h"iè-àÓ°6Ÿ­'ÁhegÁĵ<‹É_­*aֈ@5jD@Ù1:B—€z—–üêתçu€Ĵ}ÙóÜwĴS…uĦıwíHLû‹ EQ”ŭŽHŭF[X çË”w$ L4nCJ:„Hï6ÀHàŭ0„ê)Γ 3îŻ àŬˆ€ZĜ„q‚Û ö9Kñ™ql×ÌüŸüšĴŭíPÌïêĠÎvDí˜EQîżá!˙İö@h6n‡µwӂ˜yˆ=î>ž;Ž€Mœ· éż Ż‚à ĝŜ…v£ċ´qgXÑZ˜ À]íÚç`:çlÜ{â7 ŝŸ€=ó´ĥÎħğ½>DH;*Š˘Ü÷b ’Ċï³|&Ÿ— ’ –ÂXġz ĝ$|˙upò&ĵK€á-ĝă‡7À ~¨.áx<êfG„Ğ€¸´ÎÀžŭIí?x‚ŒHĥôÙÓ>Î˙ößVx— Ğß EQ”IÛÒ;BÁD{˘#`xˆ‡ôŻÙ*7!i²ŝ :VħöˆÇz ìBm…İ•'pë0 ïŸ'Ž@²—Èœ{&vW>û@‹ğĞk!Ûï„˘(ʃ(jî|Ä1ĵ/˘-Ċ`;…,~Éúß Ŭá€ĝtî2°mç•ĜĦq¸Á+€¨÷.XŸ‚LGÒ×>Ez6÷;„hççĞİI‘Àû`iĴ(Š˘l÷ŜϨ­½‡ċ`ŠòÁ—A&‚pÔyfñ;À­Ó •’܄߸ ıó5ˆëçí~ŭd^@™àw°}Ès(,€Avfáŭ …dÑ£/˜³Ï҃|&wN4·>)Mö4S›EQ”]ÌÎF‰‚DQž ‡–ÁÜIy­3àıoƒ`7ĵ ?| Ĝx”Ŝ̓ĦĊp!êSĥ6l—évˆŽ :ò–çžHÌıÄ]}QÌıg˘ñ´í£ÚAîĥĈN—?w/“" i÷ğ¨âS{cEQ”íÌ!ŭĒ€P$OÈkñ °í…g÷_û ÀŬ$7w%ä|Hbda/EÀŒËU‘"†=ğsâbnŸu {qo|š˘Ó?׿ĝ@• î\ÈÖ/ġ÷`ü¤ÜMŠïFG´Ğ¤˘(ÊÌB€ä3€ „ğ JòdAyĥß’.‡Ü€t~›€À´Ž‡ƒüm$~Ĵµ0ĥ)Ĉr8‚ @³ĈùN1,’ĵö[dÏŭ4eWÀÌüv.(GùË)Î×XšE€Î¤EQ!0V)PMDplÜÄô kpéXG›‘%yˆNcŬ gy€ÈÔ u ñiDGbÊüş7gŸ•ìʋô ­áê;kŠLQEQÀµî“çÄÁĦÏö€ĝ4¨ó(¨u&šHr3$ö_ ‘×Fs’@ĵ|69mw›¤"Lˆƒ3!ċËÇ€£“ß…èÂ_ŝG äì\ .PñIp|l{šAŠ˘(dËY÷hö…˜Û Ĥ ê>j 2âᓿ·ŝ HĥÉÖG"@$ˆ€8R=àMl‚0]i…ê€ù÷˙ 9˙Ĵ˜¸Ġħç~úw ÜùÚ pĦӓ•+Š˘(S‡˜q@1[V P÷1P÷"¨ŭ0Ĝ>ğ ŻŭWò2Á> Iˆ ìŞB =Ħ—A$yu@/>ŭ#âŭĈgWà£Ó?EÀÙÙà8Öë[QEÙŜ [úġ‡f=Á/ ˜.¸{ ˆµNMLƒ†×áû—G‘d€dAì40ĥ=D”/Ā™âÓÄ­w~ќyFÒë_ĵŻÖ3w4gŸmóüSπÍĜšî£ öé ÛZ7>/£`Zßżí_"ûe/h“‹mĤ—ŠäŒĤ­ÑäEEQ”=€Pë0XŜÏMîŬ/ù}Úöàîé" È­†DBq Ó 7zqĦë_aâVŜüi†í‘JT‚P6=r< H{]2ĉèS_’Ġû³‹à̀矲˙. úqn?d¸uÔ:½3 fiŭ¨@Qċ0Sm˙[x°Òh0çĵĠ°iHƒ•oĥ¸< ŸİÛ)"`–vÂUARl‹€ŒàAñ 2<ü^ï–oÉʗ˙ €B=‰H~Œí‚áÖÉ]€5¤ EQ”û#ß°‰LġùċÈÔ Éċ’~⿐Ä@­ĵD  ÊñAf•m!­„A 2`ÛÜÈV~€Z—^÷wúUóOYOôc-nµNíPÌ6ÀŞPEı_„@1Rm'2ŭƒo™. $†D@qĜö > 1˜$ĠğùvD€Ô&‰‘è¸u‚ŭĈċĉıwߢ…§&k_ıoÌw”HìÀĈê5Ĵ(Š˘ì~ĝ)òL˜ásd: ĝ8¸}dçÁñĐá›w?ĵÀCü Ŝg!1°ĉà·ı£mŠB$€Û ÓEGaO~O›˘ùOı+ŸŜ§g`ûŻĦ°˘(Š˘l-B2^™éBÌ:ž{†î³£?Kʵ ‚˘(Š˘LN}d: Ž@Ŭ‹àÎ#Á0ık`ò&f˙ÈêwOSĝP…P^üP‹çŜ½nÏ=-îÊguúǽ°;>_^~EQeŻD€Żä^3Ĥ ¸!¸s>„ûWƒ/@şçÓó„dtWúÌÚ;`r;@1È2$ġ°GžêÁ &z‡xZ²ç~zp˜›Í>Š‹2[;¨dçE­ĈD;EQEÙŜp4ͤǂLşv…é=Žà“àVáK—' V#5fX s $Óì˜cw˙şĝ•ïoĉî“ĜËv@äA”ħlKŻİŠ˘(ÊNݸ·Ê¤ĵàÖwÜyĤ{â’Ü 텳5HÖ‰żÇÀŠ KÜÛ.˘…'!íÇŝÓàGíé?h3âgQŭŠßĵ"‚°WÑUŠ˘(T$ĉ@€ĵifh_Íè˘9x([6^†d+Ÿ†1£h 4s>@S^B0*îŬÇŭÎLZ˙ìúogŽp 0ùèž{wîè7ċé~ò$HËEQ,!0e÷\¨}ÜyÌâRĝá[ĦPĥ–wL‚í<°Ħ1™¸{ÁÚıÇß=úÂíèŬ—ùŜĉĝżô™>2ŝŸÄÁÙéuŞ(Š˘ÜŬ!ŞšÀĦ/ìıÌèlâü-ȝ˙/D\šğ 6uÜaÁ\÷@ èQûÑĊôċ‹½ôK|ˆî,ŻòĦ0: żÍĊ~żÇy’LúĠPEy E@î˘ĤwÜ> ²x7€¤+@r2ĵ–·Îg˙ċ ċ¤ IDAT3Š€r9‚Aĥ²=Ĝ“?(­÷ü7"7— à‘7dˆôÚTEQî >ıc ˜ĊŸ­„Ŭ~2­†qßġóʀt$J!0c~ÛÒħ0oeLܽÓ}ĝÌ;ßùÎóöÜÓír8wîà½EQ”{4Wm .͂‡ù›aíx ü·Aü0t `ŜA 0÷$H½3à9ĵ’öɰÀŭz(Š˘Yg°½KàS?€ˆċˆ'sä=ħϞwġ`çìhġœžúà#àöQPë 8šÛ6b[á‡µçżÍóŭ˘DyùGùk9ó/~ĈÉ\ŭyâ@Âv:?e‹Dô{Ĥ(Šr0§ŝ•;ĥ`0)Êö:@ĥ’HÀ÷pH¤†€AEF@9Ĉö?? ċż[Pt‚9Dë)Ï?ġŻdíËÒÊvgs†¤‰½³üUEQ”Ç$bˆJġL'xÌ? Š0ÄĦ Tˆ’5´Ŝ™IPáTŽ=ôC-Ó;óëîêg҃G™‡`$¨ƒD;ÖkPQEı×CĜ˜e0" ™„"˜ıwÚç@lBe@r^|’Ûgğp Ĵ|vnLDĤáypç|bŭE9ÈGov À̀dµ°|•Ì쎀ڭPQċ~£hÀH´ƒE°™µÎŒ"Ù ü`İn\ ĝµî3&e2 ¸ sü{cğ8˘³?ġñ¨íĜÀ{Óıü˜tóád½\(Š˘Ü?‡è4 ˆÓ>> ’!œûŝOW@ƒ×Af”(œ{ŭïH€T E@AÜ:hŝŭà4ŭ‡Ü:Ó2 I_ŭ³$°s'@ĥéUEQF òò<òÁùOàspÔÍ ŻÂïŝ-€ğ îcoAÈ lA5ĦíTŒkA,ó{ga/Ó˟è‰O‚²•<żIŜì(>şÌùÈĥw0*T˘E‚cÀeàıwƒS?ˆ.Ĉ⿞^ŝo—Êњ•5°g6šġ§(Š˘`ˆCb,†P+˜u.…Ċ%+À*Ä­CÜ€]n'ŞüLŸ~B.LÜ;ŬĤèèEïĥ—~é@ĜÏ.ć^ÜĠN*Š˘(ʁ‰ŒÇDa .Úĝš¸{Ô:?ĵ –‚E°OsĞ`··ÛħdDH`P||äOĤÌüñì•_w‡5pߢ Š˘(÷‹ïPĜ#ˆĝ4ÈtB„@¸Á›Á¤ vÁ;ï0úìâsÉt@ĤñÜ?]ü…?:œ€8xÜcĤ•*Š˘(ÊĤC\.˜9”šˆÔ} Ô~8Ôîû5¸Á5ĝôvX€ âÇM‚f/‰CeYpû4¸{)ĉÎùw@tá£ĉYöDžƒ¨(Š˘(‡ YÀ´3fĉÑÑ0ı5H˙µ°àÖóA|àßİK  ?vÌÂû³èâÇ%½üÉ}] ˜m$g†ÀhċŸ˘(Šr(£"”ŻË炽w€Ûgî’@’[ëùĴ?Éóv阷-Ù`FdĴYxR˘G?ú7U`xħıÀn¤XĤע(Šrï(²óĵ_@Cìñ\´żŞ’›yU‚vž8Ŝ+ÀÌÁ,ĵŸ„˙u°gžŜ—°úŒ€<8²{Ñ;ß_额EQî£(ÀÈ܇€„<È´Âßä\şJHşœÏ֏†nĤ;Ş{›É hä@„FE"L|\äáç%{Ó´_Ge6ġdxL1Œ1¸ßÒ4éPQċ~cż“ŭ=:Û=‰zĦ9Pr ~°”Ïŝ}Ŝ0HvPMD$ 61ìé$Ó>óès?oÎ?k÷ûˆl1-ö€í°ä=˜#{˙ –PEıOE@™oBUGĦDi K’É }ğÒ0(…;jC‚…P"³ĝ~Àóo¸3{î§iŽĈ6ñ xKE‰ÛĥÖÏ+Š˘(‡Z†>fè\‚ 4’ä$ıòıK ßƒ(Û\xXí€;€{?ŭHvċ ÷t4} €Ĝy ŒşgÊ÷Ş `däžä(Š˘(÷i€MžœƒLâìü;!<ÀoÀƒàò@ÙÎ>· ÂÄ'­èĝk8ûÓìı§í=>Û]ùTÉŝ"Ä·ġ"REQµ(Ĉc˘Q>·!f-€LpАäMĝìàıMxGߝ”Rĝ×tBäĦûNŠŝIvċóÙŝ…m½"#„ò‰éÜĞ(À˙ÏŜğĈH’fçyïù"2ĞŞ/3;;ğ³Û—™ÙċM¤D“²!–C6†6I0½žŬes8˘e2 X‚a†EɤmH"hj5l6çb҂ Ù €ĥ~X–)Zن%jı^ŜvçV]==³==ŬĠUy‰ï;Ç?ˆÈÈÌÈÌÈÌÈŞĴŞ÷zĤğ2+#òïıĤ!„ĴÌĜ”Ànœ˜^†\ú|fS˜?€öc-€zˆĜD é˜àÑqK1E>ŭH.çwvoŝĜ'şŸûħq²WŞŬ7ÙA“m€'a8ӄB֒?hk`ĴÒ߅¤Wô€öaƒû°ì ħ+@ ³Ġ…ÎL8˜ÛƒÏÀ]zöpĝö/ö·Ó4ßpÄqÀ„B΁ëYı¸ÇíÀÜÜŜÍĜ!Àü# <f£°r[`,h˘’B.˙¤O˙á^rŭċ_MnüD÷„žŭ…q 0!„sh˙–dĉÂ]úHçÙ(ÇïÄh€…|>@nèiûÂĝpHç¸Kßħ뺗ŝt¸û•áÖIGb` ˜§'„²ġT×K7Ÿ p%ŝß]ôÖ{ –=Œ³Ôc­eAeä!‰Ç0…ÛŭĴ$Wż¸ö#?µ}B!äGÊY7I.CvŸĠúÌA´—G²Q*@ŭêġy[`Ù°{Sğ—ŝà-<û…N÷ğŝ’lĝY/S„BΧ-–Óú ) ¤ûlÜâç.ڇöö!Ö+k֍:Ä(€ÄcK·÷9‡ŬO~6ıtùóîÒwmYÀ8€BÈ9Œä˘\ïMv ’@şŸŽFb[ >‚h/ÖhThħU~éȃÄâ@‘Nl |êûÍ9÷;ŭöcvϸİ÷Ÿœı·5MĝÑ&„²ĴW¸.}’>ôzœ:.ۍ³J–O”µÉ.ù¤$Ÿĝ£š\żġîÖâ*Oâ:ÄD–3P–^´–CB!'yçħŭ]voOEËÙGù` ˜ PE% Ô¨´–Çîĉ눟unçϧ7äûÓ_H6ĝlR~ §!麝 ż'Ĥü\B99#  ˧#Ż<ı§àşK€ aÙ`ĝAŜèk˘…µ<ĉXêa÷Üċï¸äʟqŬ+Ŭ =Ó%IĜûBÈùĊ4ç(ĤÊÏCşŸÎ£aŝ0ħA‡Ħ2(NDrɕïŜA÷³˙Ù­żĠ;U ıöċ˙ɐaŝŻĥŬ÷/ŽI|B!' H+3û£W¸|hϳQ{ïƒ÷sááèşñżç{ ùÜŜM¤7^ú[§÷ƒÂÚm„BÈö*˙x Fıúrċûâĝ^¸˜ Çù,?Ѱ’×;f¸Ŭë0ÙyÒkí­ ^6K._›Ûû¨g ÂÏ鄄BÊDŸ~‘vğŸÍ·zèñ·`ŝpĴ`Bq–˙ĜGv_@ç™>¤7^2ݽuÁ+Îs+󝋕ŝYB!ç#PDşqAP÷³y&ĥ š‡èŽc4@‡5‹‚–<^Q€(Ŭ8‡àò÷9Ġ Ĉ9!„2핗ú.Ÿè —?ğl|„'ıèû܋·%[1uÈçH÷YIŸŝt_ĝħ?Ñ}ñÇ[é½[Ħ üĜ >sM!¤ı(CR”µŬOC:Ï@Ldb! Ċ‚ÀĠ˘FGyLIá./°sŭ/ßù…ìT sOê´ò94 „²„L–ıy£–\†ıĞqpö6|ÓE1฽âñbÚAö^„áêżò?„äúËŬvŸYûñB!äœĜ•|éÂ9·÷9¸î'FQ€pT)ÔÑĤÀ5Œ€X BD\z_˙nġÁíá G\\´ Ĵ ĥÂXbB!—b.Ë÷H²çhÖż ËÁB–ï XïXciׅ\ŭA$—ol ĥħŜ $Û%üì4 „²a×ì_q]p€ƒA —{$Ô:„Xh?zûëÖ †—׈ہğò½Çĝ̗~#ıùr§½gµK·ê-17ŭB99# zçrŻ\b*^şŸ,îŝAŝ„%A(kîœsìŬ¸Ô}ĉ…)ìßΒç_qk>#B!„4tÉó(€+½sI/CvŸŽƒ²Ç@è磁Gmët”ÇKv`î2u³äú- ï½şrhaÉÀĝq$ıŒK;[`—ÑŒ!„rÂQ‘NıŻt>IŸŽ?·lp/FƒĈXħ’ì!yîOv\§‹ôĈ^HoĴ6¸Ñ/%×o9˜îxŜTÌÜU$ğ×ùY „B Ħî>ÉÀ†Âü#HxÇ'I.ĝIìpKêuap@a.…éœsÎ3ÈüŜ½Ä%£0Cûĉ‹8A‡BÈEÖü(â.‰Ċ€.ÉÇçu6|P)ô-EbÚÁ’§‘>û/[7}2 wk˜- ,µĜP>Ì@•Ÿ B!³|IP²¸]ÈÎ5Hz–=ÌU7V —ş$(o  êžÂ÷|Ï÷ì$/ÜZ:Ŝü:B´v$½ÌwBÈEtŭ1Y PdÓ ¤Ÿ(#j „I/ )ŝ:X~Ih3aŠäİëv/ŭbxïĠ§5O$†¤#ĵC!„TDÙL*˘ìàvžƒK/ċú~ Ñ#˜ĈÚ9³ĵ†n)#`|Mpħ%PD`nnç&ٗ~$ıñċ˘é½ÌÁ7ŸşM{„B.J Üè:I §· óGŜÁX`µôr×¸Ëßé~fĤî/›pï–ŽôĜxO!ä"Sï•C\,LŸŽ÷ÑX ……AîùŻQ PĉQSHç™s—˙|8¸Ŭ߀0Éö—ú³BÈÉ.VèK é<=ŝ+í€u£WŒ:äurùğ‘^ŝÜş1…wNE÷LDXĞ@!äD˜ÜڝOÀu? H’dÁXéŭŻ6 ĈĜȏ)g†ÉóŻ·oˆt5Ñ?m!^9` !BYÂ(Óù’ âïıžXèĊbÀu£RM?ä[w.I=žúá4ıöĊFmxÍTŬZè_<%VŜ(Ĵs „²Š„ĉyúî³ÀÎg£ŒżħɖÀ5Ž'. #n÷³NvžżúÌ\zİ‘ò5Ğ´46:n&:Ž „²UFÀȋwÎA‘B°3çşüv ’xER˜éjg&ˆ@ré†=~ëW5ìßi3à]xïĠÇċs´aÜFÔÙ[ŬŜvÎhăBÈ)×Œfä?ë|’\lë½7 •Ŭe`ÉŬ•b@$W€›’ì]S|òÏü‘ôÚ:­áàv–\żepP˜‡\ùCÄŞ#„BVĠé< IŻŽ4Ûz@£Ğ͘°;$wö]>ĤßTħsoÓmWċÒÊIv°{C‹ŠFB!dûİ‘Ġ\„E.éB’DÁÏE­µ‰DĤ²÷y'ğÏŸùÑ1yñċ°€äú­]˙œf:Ċ‰CRàB! 1Ù¤͑X–è1Ìu!:Ì÷ eá½6÷ĠĊċż›B’Ìv!îYt.}˜™^ĥU"ÓcĝôÜÉ=çBÙX Üˆ|HOŒ¤O½E:ûǕ{mŠRnL¤:ĞëîdŒîÜŬĦ B!„,E,ĴFâ£à›…9@™oׁÛynçÊ?ŝŜOùĠ §@2ħ}ˆB!óTl,°s&q'€*`Ù£€— 8—ë´KŬ›0$‹Ì†9矜[|Wĝ^B!3=ġ5ÖB!3EÙuaҁ¤WM–AÂa^8ËX^X'×'ŬĞ?îô–7Šc3ÄO!„4óĝ+â_] ¸h¸.,ô`ŝ0FŠÛ¤íyġ ĝtÖ.ĝEÓ¸  añŸàì Ûç~B!VšÒ(0éÄġ½QŠugìĴœï0$#c÷EH÷ò €Ĥħma‰dÁi‹)Ó„Bĥ3*à 礗Ħĉ`šv¨oE G\\KÂu>qœ^ûÂ?Ioĵ”67Ä1ôO!„ĴĴĈ•şŒzô%½;²ËỀÖîˆIŸĝ8 œû°É_l˜˘ÚBhfg*Äï8²€BÈÖD*â\ù·!ÉÇìçÛ´?’¸§˙0,yş'ɞ47œOEïÎùj9ɈysB!dùh€ˆ”W™àgüb£ ĤÜ., v\â({ç+Yrí‹ÒÈûwŽL“ߐÂè|€C§³ƒtÁx€Mœ7@!äÌù˙nZ¨-y°áÈ(ì„:ÊV@S$Ŭ§\Ê#Ò00iHÊQÀ„BȒTGHç$.À4ƒ+6ĉ³Ö.,Fğ|3`ú ÜîsñĤÎ3ËnçS| !„ġbcFA4 0*úĞ˙™ĥr<‘²OßúZöÖ_·ċ EeˆÁI1˙‰³ÀBÈYD\’‹²ƒ dbŝ?|ÉçĝŻ+tinGdp{/(}Ú ™ĞċĦÁË[I4!„œaĊ ğ¸Ĝò纐Î3ħÑn͆ħĝ;c]úxe ó gğċ €„*K!„ĴìÄNxó’tâíyĠż¸ĵ 0˙UĴW:É"¸¸Kn<6@!„ÍFLkünÍÇp+0( Ó’’Âü0ï`ŝròü+/BŬŬfĤ…S˜Û›{—˘b‘³!„š(ÀäÏÍÒg8Xö0F&oé"À‰6ꛗ½!î„~ĥD`†V ÍhBa4 juw4Ĵ'¤e˙_ Ġ˙Ħœ ĤHÒ4.íf !„ĥ£Q˜c ŽÖ˘ î'ùÒ!óHá'.œl }iél9ŒTBÙéÈë7s—càۅ‚Ċ4ÀÓ:i@ Sƒ${ô*|²ûpĝÎ/ [7ĉM/˘°BıT—ŭ˜˘Š͗íi™²â 7uš@ݘBY—rĠ/³Q8ÚüaŒT˙kŠiÈ# ’\†ù#tğ]œË5\L!d‹Tİ(ú¸4Ÿŭï .ß ‘$ߨíşRğ ĤóÍCĠ70·ĜûßĤœ˙ĵü>!„rz)ÓQġżÛÍ;ş0éÀB†QĞ`ğ†ˆ!Ŝj\Xd;eĠàıħDŽ› !„œ ı7^äöĊ%yxŜç!ú.IJJ´`álI!;×é<½àÑ5ì ˙dsħ|Š?!„“Ħ2DÏt”Ĥ.ë˘ ‰XüğK×ÏŭÏÒQq@8€ž[ĝ‹Ú\„}@ì_$„BHm ü{ĦO’½Ĝ˙?èEcA=Ĥú´`䭀ĤYW³áßqK–à§B9c”E€•Iù€ˆÒ¸.mAƒkĤšĉáö^€KÍ7̧H14öš$‹í…-˘£ÊÏ!„íŠmyVÌèÏ˙nn'ĵûĵj߯ħc:—ĈŸınĴ9p:˙‘Áí#˜˙ËpĜІVzŜ+cW Mĝy#„²EqÓ~ô‹"­ŞŠµ2 *TDô¸6FPoDh>=hç³@ré„&ÎÒLB9s€J ˆŒ qq€ëŽyîíĠ›ĤÔkÀM{ċŬŽ;a;œĉC!äüE´šŸÖ!àvŒ~hl,Âġ­j¨+ Ùû<\zĦÊ:lŬĉ÷ !„œ5ñ€‰@ĉ…Ŭh ÀZp‚µöĜ@ÑĜ$`) nï:ßÈûòM!uĜıtwü^KƒFżğ‚áQ)@T6Ĵ „BH{Ĝ°rCÓ,.*½íbg€Œĵ÷#b{P@!„lĜ۟@şQˆbažùrÂnœ°‰Ž ]· —^jÏĜt€­z„BÎuâèsï_ 6ˆc€ÓĴhñ¸Ċ ÓĜm Ù↠5v IDAT€äú­ûzl Ĉ!„ıÄ"żê|)ĜâvĉGVġً‰ƒùŒÍ>nTp€˘P¨„BÈ:l4 ¨X œwˆH>ÀÄ í-&–Ë€€45'Ì;7Ëq…3@!„Ìâ8‹$Ñw)LvòÀÏ}Ĵ`ÀÊ˙8iC@ó BÉà.!‘“HÈӚ „r–™1@\úwċô?“ÎÈ[ŸéġŻ (VçĈ„tžn6 0¨ÀuĈ-’4Yí–ƒ)B!g7Ċœ˙¸h4Ĝğ£ŬHıÇÄ1 `ŝ°á•ͧIzy̒9‘‚ż Ġ°›€BÈiE&uÎ4ƒIĠñ Ċ>€öµPíÜż1˙‘g,bŸBY"Pg˜B,¤ —t+bïFµĠBĞ0™R!ÂPąĞg.Î^XE³˘4N!„œ‰¨€ ËÀq£A۝XMÁK ë?DĥȤX-ÑJ˜ !„œiĦ× ÖJ0·SŜO’âïiĝkkç•>ŭ,2ŬSrġ7œàR!B!›gZb^Üçĝ‘Ï+@G#›<ŜrZZ™==lĥĝÄ<ŝ“²ÉŒiB!'(Ô]GQmq€cûŸë `n/Θœ“›ͲC ìµ[ü‚B!ëG @,ŝ+Ċ›žèhĠññĝÙGáħ@\p žA£39 ݚû!„l}`âgĊÑq‘ÁP›pkÛÌÊè‚e 2脣Áo,zÔO41R'„Bš‹s1ȤSĠ›Îè˙_OdE$ĥê’^à^ż[k$×o?e9âùñÄž/Biû/BŝRYTe—îŽŬ·0 ֋`:`šOtlÙG=ƒyqÎ „r êSŻ;yĠżÀ yN^-žÒ\‹7â„jœàÎ/a¸Kp{/Œ‡'&z“í{ëĥóÍ5XH!¤@İ)ÑûË`šAtH7Ï˙OÈñdċ~ Hq^ĉ ÍÙ eQ‚KbËBg-0ÎÙ'„Bfy^òin§^¸×ŽhñĜ~Ĝdâ²&€ËC{çßI¨ò„BH#|̛µšÄíDħwŬ9âżfDZ\ùŽ`èI*W.w_üñn½P¸ĝ:}s’,{7 ü<Bı@Ŝ>ÊEiB!¤Fx§½˙B€GĊxŠħħżÛrš|üħœĞĴö`Ŭ:ĉĊ ‘ˆċ‹7² BÙnRĝFaxӘ˙7z˜ìÒ‹˜Ġ^KxGÓ˙ÌǨš ŻÎ7–8żĦc΀BÈ&nĝĞD̏ĉ舋U˙ê'îŻjèôżĊŝ1lpŻîHrŭ7ûAğßnCŽúĴ€€†!„mCg{â:Œ·›‡Zħò7)û˙Û[¤µ†„i€†chÈGï\²™@8¸’ë· ÊFB!dĦ;<-üE៸ÜyĠĵġ/‰EyàşqQ´Qè&iŜÏ×°aƒ#h%|0ë.ç꘳'„ÂÀx žCxÊá?†â’R‚Ëü˙Zâ?½À,7,´ġÇÄ9:ì7<Š)¤ó,žBiHĴcĞĉ˙‹öĵtĵğn~7ŝ’Ŝ˙ĝħÌ$F!âÚáÁ°ï˙nrŭċN8¸c 'ı.ÌäÔWé:ë¸xˆBÈÖy˙UħWħ Eŝy~nBôÒ7µĜa•!„mDgz˙qñO!c(ħR·ġϵwùıˆÌ!´÷.4 ƒŸk‘)SƒÔüĴNŻÁ‰„B.ˆĝŭ;nŝ„h $­Nŝi£o\‚!Da5ÁÀ/÷“„ÓñÄ˽É‚İ B!ëxÜfĦ\¸cĈ´+ü§gíGÊéĉ`Ù£a°äç’ç_ÙYÍ8Çax3Ûꉅ„BĥU@t|äRħ˙?÷ö]1ĉĜßٚó0ߎt7ĵ÷êO „BèŭW<íê¨_[û q$ÏŭOy˙m…ŝµŜû7è1,{Í>„÷^µe TöMˤ%N.tÏe„B&7ÚöW,ü)ĵ$ù ŸBVÓ MŭsÓ‰Âé½ G*û+<€Ä)€§Ú‹Mœ-1ıF!„Lú†~ÌQ4 çşQ?ÜîXÀĈ4Ċ* a€ptßôĝ]ç÷_~% ĵój€Ç˙ĥ•â VïB9Eʇí#E$÷ŝóuż.oû3ŬP-NŸy˜?‚àĦhĉ?ÒZg×hĤŝY+&ä B!“‚Ğ>Żüï{ßÈsŭhûËC˙.ŬĴ÷_žƒ‡…,{|8ŭі ’+|˙ !„\pñŻŝ…Aôŝa0$#áÏÇĉŸL(˘(ŝSÀ†°·=œŝzróċFVGş>è>7Ó+vÒ`PË5›.[ !„ŒácßżŽ:ëĴĴ—wùĵ˙üß‹$×m!ÙG°Á½Ħfúq8¸sżé£Ġyhßí|*N8Jöò↉Sħ|ú!„r½˙ħ‘żĠÎĥ\ô˅?ıFn4ô?ı‡ "j˙}Xö¨^ŭ̲6͛oyló[Fƒ„BHKžĥ `Ô{?.0eá_íĵ˙ z˙Db1˘X܅†ŝJĉÄbLÑI;[żXuö‚Ĥ# !„\pLĦZLûX ¸¤œ÷/’ÔôüoÈû/Ï+ž‹>€eûI*˙]rŭċ½e1m,[’WRvBÙ¤§]Œü5_ŝl°ä‹~jWŭşž—AbabèÁúïÁ²Gğ–ïÄ/óˆġg™mï[Ó¨BYÓû…Ŭu,:<îŭË ˆċq­² <ż=„éż-éĠŸ ÷ŜXJ½ë#ÀÜĠĈ’…ípÉiBYÛË.zŝ͏ŝLŠ?‘N÷ż‰sš(ŝ³ĵ÷żš=V ŭ§Ħné ¸ô̽=sRŒBY×ó1˜ŽÄĴ6LÒĴú&—‰,hï]˜?Ü ûw²Ê#§çé}[Eüi0B=˙Ş Ġ•żĠ‰ÉF=˙r2Óŝ&ÏT£÷/ŝ!lĝ!`ŝĞë˜%Éġ[,Ż#„rîİ]ÖSLüÓa4 t îčÄßucè,ì2ŭçĤ!ž› Ħŭƒ8˙ß²+ıùòJ=z“€äú­ż€ }$ĜċG„BÈ9RŭÓiĞuò;Ä@âŠö8ßß9CµċoÓŜ˙¨.!Ž!îÙÇqòߣn¸ûĉÛ­D*Ïŝ\Fî'„ Ĵ˙"yŸĞäġµlù‹Ë~†JñÒ8ŝ÷¤Ċ?ŻK€p íïgáo‡ğŻÉ:‘{#„r~=ŝ q…o1ÁŻ~­n!¸ĤaTñ_Tŭ× 6ÊèŞ>.ŭ܇=úż âŜîĵĝI8¸³²k›6²>!„3èñCŞ˘äúĈÄ5ŝۗŭġf–˙n>ìGş£-E:àD˜J¤C„w`ĉR͎ß- “v €ĵµÑş×àÒĉó6bw0‚O!¤)ĤaTħ?K\ĠGñב÷ïŸÏùŻûwOfY,ü~—½lĜ…ƒ×^n/ÄAú€Ĥpé8—BÒ= ıt*˘Ç!„rV]~7ñϤŜ(˜ÌûS˙Š€¸<ôïjüäôŝKÏ?Î"ŜğÙáĜ?MßşĵîÒ:“ İÎ;6…¸ğ]~ĥ!„lħŝO…ü1ûŸ4<ĈSŜös:ŭŝ:ĉŭ[8ŠcûPß˙ûáŜ£Ô>sÓ/×ìBÙvŻàŭŝ£Ş˙Şç_ğâ÷òŝù,Ñôè÷!Ù}E?×}ñÇ;m)Ŭ÷r³;‡U;B9'6@Ó0ŞÜŻ˙"²mš˙=ËĊÒ'.†ŭ$§2éoüœ%Îüïíúw- …ppûĥµ´ŝYÉtĵ?MNè ë짖8;ħó „²h.ò:Và'.™/ŝıG-¨ÔL ż¤Û#ŝíCôzôÛŭûöow“ç_iMŬÜDËkNmŝĜîä=xB!Oĝ يž~§‘ÎŒúûcè_U§6üE1+rŝ“âŻ'˙‹ž ôïÁ²‡Çĉ ĵ÷j[€ġS^f5艌Ġû„BÖEґמçċçĝU\鑨b†ĝğ.€š?EÏż Pv$(Ä2Ĝñ[½KáîĞ—Û>”›rè(`Ê6!„-~CûĤ£^ü†‚<ÖòTZŝ*XŠŭˆßFFFÛ6€…|êß=XïÌuġ/u?˙çöÚ>ÎX ìßî%×oŭut·Ç˜lHp^L!S˜…~Y ŭKÓ4ĝäœ?!ŝéHü'rŝâ˜ÙÜş´v)şÄ?‚ŞB{ïÂü£NöîW~fGœ•`™ñÏBáñ×`żŜ HŝÛäùW\xïĠžÌʃ€ÔĈséµĈÀ*/¤é-„BÎ&!4÷ĝëÄL°Ğa˙Šĝ;—ÂLF3Ê€mħƒú€ ŝ>lpÏBÈ…ƒ;ïdŜˆÒÄĠŜq.?!„•×¨ÈŻĝSçù—SŭêÄÑó7û‰ëŒûmƒ÷o–Á²GG߄ùG*!üÉġ[;'qµs‡fÍûgK!„Ĉ‚ß0½ëĉÜm”óÏ*}ŝ†ħ5ş’ŽZü$ĊhP=v˘3ë+†ÚCzoAŸüĥjÖ˙Ħp˙ġ_?İ3q³Ŝ¨ñÊÊoĝòż²áuÀrL!'&tĠëzĦ]Iüm8’´jż½ŭ‹Ó 'Z{Vĥ*ú÷ êġppç×OòZkB1µí 8ÖBÈĈĊż*şĊT½uĊżlóËġôü‹Ü~µ­O҅Â^†ŭĊċí‡'P` ÓAôüöĝ›jÇéN÷oŸôˆšµ·×ŭBóö“ÒS/òîë8eĝ-öİ„ŭĞUŝ2a,úÍ gġ$ £ĝC‡ŭûħġ/ÜSÍü˙Ş^OÜ=- €äú­ÀŻ nLù1&„ÒPġk=íEĦ÷:ñŻĥ˜×ĝİ:nJĝĞç2Ż]ŭÄZÎĊ•Q‹ĝ<4ĥü=ù=ˆ"?LÁĞú4ŜĥI“çilé `†î !dû„™âêġ|Ö5½*ŝq_V+ŝċŽ€²SŝóÄżìÁßTK`ñ¸E*\}ĴUǰÁ}`°˙è[ĝÎ+˙ğKoĵÔ=m@6<ĤÏÖB™{Ĵ˙2•ŭó„żúó²Ç_‡£­~ùµÙ9Œ„żTW)ô›wŒÚ”uëµjZ(Ѩ¤,Â1L3ĜñïÁüá0I/~óɟĵêï9<wò̄úĠN&CsRG!„³çòûËxû³~6ş½ÖƒZeyò€–û¨yÎfŽ˙¤Qo(,Ol¤|­HCхò„< èáoA{ìÉÛa˙ß=Í÷³5µcˆžBΧè–Ġ„Y9~'@âF9ĝRüx•˙¨àOF}\:VX8ÏŻ5`6ú/Ö—Ż•–U˙ĉ€ŝۇ˙0<@Ĝżŭқ_:U3`zôğŜğĤƒîüûÛòŝğ…a²‹Îé7„u„²²P%SVûÉ?“Ÿ&1e;y{P(CŝeżZWŠ˙(ϟ8Y8!pĤç?fLTŒ€MéTĴPԗy;~ Ö{ O ’ŭHzóKŬmùL¤5&SÎ"ë‹BÈݨ}ğžâ‚ĵŝh[Ĵ`‹ÈkP)ylŞß¤ĉTĤĝ­£;…ç/.ċŝ[ŭÇÇËòeC5'XÎ+È`Ħĵ|üUĝ'÷=ŝcáŜ›˙x›>&€Âí<ħġ³Û6"Ĝ9@Ż „ó/ümLÏaA괌Ìí|…!Pż“Ŭ6êíŻôô—‚\Éó7 ÷/˙Bĝ‹QÄÖĈĊ_\œ8cşay óħèOû°'߀Î˙úé˙µm—é@ÚzY{r}–ę̈~ !äléúĉ벚VïÇÜċyŝüöÊ}‹ê6Á÷ú­Rá?šŸöúçñw/½ôĵ¨½µ%?ĉŠż… àC Ħw·ïôp7ĵ÷Kw?WUÀVù`œ¨/ëŸ ë!˙f×Âj8_Dbnß-v´˘ Ó^˙Xe}ßä` f^ĠÓ× Żß­ŭúÇ4BŭÜĵr)‘úèġ‡ìè‡_Wëĵ;<ĝ­Uê3ÙÖ~ PL‚"„mFíŸ? ŞÉí‰3XċZÛ´­ş¨î/ ŭޞñ¤ÏÊñŻ"ŝñÓQßNÈżV7eÑß!}„pô4{âÂÁmIn|مğŻmeZ Éġ[öoûäĉ­-›m×,3€B^ٛߵq^};Ú¨›zĝ‚‘àÇß…ö›ˆ³*…şĦ>Ƚŝ‘Ÿ9ÙÇ_´ ŞĈúYÍñ‹–ú´Uä7ëuïŭHü‡°ƒ…ûüŻ"?Pç>ŝ4nŜÚ ûwzg!p&ĵòuw°€ó/ĜijèäLŭ&÷O“êïDçj2´_<žsëŬ/DżêèY>Ôgòú*³`N€•ǘ˙y×êZáo³óAŠ}s&šĉ-Œ GŝÉïÀô`ŭ˙:Û˙?ÚöÏÎZ@P9•;!äú?Ž?ÜñÏJ"?u>_)żb„ŠġÙsRŞUòUo½.*0)ê³òúuâï(0 ˜Ê:џ—ן˙&ÚÂûµúµ”ïϳ٘)ŝĉcáĦóžül¨í˙4$ŭiżgx>Ğ3+'ä(v³ğ]àE[óÚÍNCĜk/ԕYúħ*žp*2Sè]Íığ%˘ä…§Ż ŭâ×ĤhĴNm­Î¨ÎĠÁ@K‰e¨O[Â_Š~ċñfzŝyĊ,ĝëA Úۇ†áî½öêYúì§cŸMa¸ IŸ‚ÛûÊa Ûpc9“(W­èÌ# ġÉxâm‹ğ“X¸œşÙ×UĈ›;'y˜^f ½[1>9+ÚÏ?ëÚ[<ÏNbċ•z²ž ú¸EÈñ/Dżüì·RèW´ f0s+|{ŝ–ڇ~ü[ŝû^ŭqšĤŭ˙Y½äü½7ÏÌĉ™tì#”â2¸t7˙ñ•­9ÑE]žSŝÈV:àMÚÁV?mğİaU,¸iö\ĉ;-²„G>&ì-\Ş=ù÷(Ì2ö:Ä8'›ûĜĊxlı‰ıù6˒¤ƒ²Ò€4ĝžšlŭ„|ϽÌéa'ìßıùŽż÷ú™Z;—.ö^êĊÖıíğx°ÂŸĴ'Öâ³ ÖMżÌ5ʉµüxÛwœç4MUàkŭsI[úñgĠ Ìkí+<òúÁ>ë}ÇMC,Z̍ó&FşiœíoCżĝÛĉüGáğż(à÷_ÏÎÚ÷8]dw™nqëbCĥNİ[÷ì(Ĝ§Ġ½ñ'ŭ|Òdñu­ĊmöEÏa²oRˆnĈë1ùş×͘L!4ŝêwĥ˜ìğ½Á>Sé„Îd˙|ÈOx‚áWaÙ`ĝ ÷_—ôĉ—ż˙ú™ŒAê`Ħmĝ°ŻÛûżT´ óh÷¨ç mĝú4ÏoS°Ïž°Ka^x[^çíÜ-r½cžџ4~êÚ˙šl³ŽQ'ŝËùµĥÀ§r]_Ĝ×_'ŝa ܇ġßCÈîŞġşpş$7|Éïżv|VŻcWĉ¤k‰‹ġYñ›†˙cۉ, CşÑ½Ñgß o:ê”aġmû>51²šçş›ç&nñó/)?2ŝIñ/úŝĞŻù˘9˙u†Dñ³yĦŝyï{QX†ŭÍZ˙$IBCşPüÇÎË÷ĝ|ıÏÇÇ˙/ôĝíÌüq'ܑôĉ—vϲĝOG ë¤Y+[&žĊ:`ğ€ÌmŸ]ÁnzüÉùí‹Eğ=o·­|7m›˙ÉȉsÍíóy݃&9ŝşÛ'ñíÎïíc(Šŭš|ÇŞ[ M€ aOpĝuhï@Ċ°G’k_ż˙z˙ĴNÒENZí„)7mlú"(°ħ֗EĦ›3úµŬÊ%"ë͜Ç2à ÌĵÚùísżü´ ÏïwÁµcPÍ~f_sGc7àíç ‘Xì'.YNüÍâlÀ²GÀàáħÏĜ/–ûH¸ûÚı(9O ĵsےë·~ekeчĵ˙5iݨżLĥ9ˆ×G IDATM`‘1}ùnrq#SŜûŒüŝ²{GžeuŻ´üÍÏÌF>§BŝšĊ­~á(.÷9ŝ&ÂŻAŭÙñN8¸#ɍ/ï†ğŻġÏËû]MüĞĤ˘HĉŽuM‹é*SĴf~ĝòĦYĊ‚-t‘6í‰oJĜ—)&lšï.wÑ#;·ÜsKô![@µmŻzTeeÁŸÌwFƒ€ÚJOhÇ2ıŝ2ì_ˆż?„úä·aúN{?;|ïÎ_L}ħ{žÄÒĜÏ˙-réN60'teÑ]Ĉ›Ĵzp}~À6yFqµ–<\küü–5,ÏB7!Mĵŭyž~Ŭ  ˘ oĠkfëáŝ%ŒŝşkA5ìŻŝ1}=˙'߄ġïCġa˙Î_€pïáyû ¤+_)hú9.ċċ7Îu[ЏW~ÈÈ!daWÀĴŝ¤ÇżĴĝoTôĞsüç8Nĉœ›aáO ˙´÷.Âñƒœ˙Żüµóü™HÇ> K\(Ġ6à9O„qŠ7m™ çU"‹†[´%”ów[ —eĊ²Í|÷äÊÒĥ B."Ġ~QÀ]]Ê}|[(üÛ"ú…VTûúgċûg]Gаż… }`ĝĴ·|–=êAú˙IxïÎßHo|á\ğ”éô ĉÖD7k×2* …İLM¸â_şY“Şšˆö*‚½ ‘o²t¤|_ Ïgr½è2"Üäw˜ï&d3Ŝŭ<á.uY6J³ĊÛ £˙N ÁY04gîġ?Ÿßż)ħ8ŻerŭcçX˙1ôÉï@~6|ó‡?îù7Àßŭċs K¤ó4lçyˆëÖ¸MÚ˙˘eÖtR\ùȐ5‹îš #ñ/,ȓí6ħ”ÒŜà1›,q-D!''üĠ~üY[ĝEásŭ˘÷:GgYñ7ͰÑiĤkÏ4 j@èçë|aÇ˙6üÂñŝ,ÄŭôEùüŒEÌ]…˜Ï_èĴ&'PxÚ |e}Ù²o³úĦl}M§ĞŠZ> V†Â&ż ›ÈuĥÑĥ.İr>=û:ĦF25Œ_ÏF÷—…³š&‡5ùË8˙I£¨ÄüœéíÇ6ż'߀ ï#żË>ôošÊî½>¸Àd˜ŽÓ^ğğ°UC˙#ÏV êVíY“ê}ĉyĜ“£; !gO¸Ñëžġ8óî;]Ü'+o9Áß,Ug°ÌġÏ˙y×ĉqŻ˙6ü@z´ß‡ġvŝëO]ÄÏi:ŝħ9šxUğµ "6Ö6''£p…àVż8SÏsŸT7EŸíïe„{# îš²¨2Ùcl½ĝÏĜÔ·Šq pìï?ŒŜ˙à}Ĝñ·`GżßûHġG{Ż˙íäÚ;áŜÙEûĴ§4³EVÛàµZàx €™!Ùpi|£q™Ìr.„ÛıfÌĤ³hħ‘,ĞÚıĈŭìmoÓċġ—­éÚ,³^ûރBVVùÛ!lpzĝOĦŭ÷ƒ8÷gü=¸ˆâ?m`oŞrst"À‰-„\ KiĠ+í„ĉ‹<û<ñž ³‘×ĚyÉˋŭ˜LüSŽsOĞNü‹•ĈE{şiˁ$=z zĝ-ˆ;„Z¸/.ĵbĤżŜ}íñEŝ^cúżÌĥpĤŝ’ó€tVŝrBΞp/óŭnşxÚd³óiOÜ·ĉú&'ğ}ÑŻŽ‡*ÁrŻ?”Ë|´ ö2Ÿì1G! ²$ÜıÁofa8Ŭ|ıà&€§š~XU7ħV×Í}ó™ 'ä zŬKèɢAY‹öw4K=ÚÔ۳蜘Ùİ­k_oRüE‰SAc+÷¨ÊżóGË`Çż܃eaŝ^“ÏáàÎ~rŭ–„ƒ;t+c@ @h3ijj @5á^}Ó Uc?:![èu·‘ ÏċÂÛğf_„¨âÔuĝ”Dż,î^âĝ³>SEûĥAòzŽ\ü}oTċŸ=€ġ߅ö`ŝ~ĤƒÇ‘ìğë˙Ş ù“œ‹=9}0è¨PÀ÷‹"ÇıHpOÒPPĤûĵ‰™j'.ż¨Ë½jÓ|L{ìñ/‹=¸Yùŭ RG+ĵŝ –‡û³˜ëĜá? í@ô!tŭÀŝ GáŜ'ĵŠLEpbíw+}h /ƒ)BŻ@JöòáméRÉ ïL ĵ†3sm„ùGŜ~dJüĞŝŝ:ĝvĝ›°ì–=€êq&!ûf¸÷ĉ÷óê³È÷ĥï$ó OÇÙ2Ñ^FtÚ2ŞS+—ò§ïuáóáïVżÖq[Eôc~ßĈîS|АÈz°psŭáQœßۇġ?„Ú°ßß ÷Ŝèò“×ÄÈ[<“D`Î g éċVĵU>@³.œ²ÍâŬtOşÀàĠ­-Ü­VîĠߏ- ³Ÿ†ĜŻ"úMÄj;Ğ^ÇW÷Zï=ĜàB6¸Ëz™ú~6üJ¸÷Ĉ”^{iÇß{sÀO€œ"d·¨*R·Óè œuáˆs–2‘aùŝY¨â3¤nŻùĴÏĤĥt}n"’Cßè ³QĵÏp8cċ…<³D(Bü£BoF ŒÊÖ+ŝŝ·!á!B˙¸Ñ/ĝN8¸#Éġ[] ĝ76UĠ$ŬƒK/­X­ ÀÍôŞ ÏiӃ5Èé{ċmxäşäµ- ¸Ÿ”mxûY{û^WÛşÄyñoĠ¨>BPÀ|ŜÖ×üĴ·í½ B³‡°ìħĝŝ*„ƒ;CkËE'@ñe’p—àNXo獲ÌB\ĜÁġ´g]ĵ›<Ŝi=Ċû„<óVĵoŠ˙Ê;_×Ëœdö\ĠE A+[ûŽ€Úżí½‹0ĝ’=€bx$!ğ,İèßysŸoÜÊ€ŽF=ŸI?Ġ*R =Mi´)ÜË U›·¨˜mµHĊ{ó_Ó0;JȰú™ŭ6FŻ×‰‘Žë$Ñı›%ü>Äû…Á²Gù@ŸC ˙.ôèŭĜÛŻ‡°áñ1¤wI€ġûŻ˙jzëšŞpŬí˜Ċoš’N·JċâĴÀPnçüżAsCŬ-zÉĠE)óvj‹ĉ2H™ğknSĵOû^x'?ÇğÎ#…ú3ŞġízNM*ùS\Í áĝġc/ö~=üz4ü#È4{Üdoûŭ7˙Pz+àï2׿žàp &u÷T)âĊĊàj€b W!Xg1pÒáô&WíTZÔáħx°ËfŒGŠ{Czí¸[ñ6rž=üyÎ0 ï†ŭĴÙ-E¨_ Q5ô}@ûGßúï†`áĦéÀ‹¸ìIĜŭ“éµ—’\ĝ9Ô§`[/ÄĤ0·XÇZ­ h[¸Û|ÌMœĊû„=sĉĊÉ)yòˊ½“8˘}²gßıúßĞöò† >ĥói#NƒhoĦ÷˘ÂÂŞ=ĵOÁkċ#ú{oû­š„ëaßŬ1CšHí›Ú@µhE–C‚Ür†@ñ;M½ŜM îĵ|ĝiċÂ)ŜËĜĞĵ.‘Vm‹¸ kĞ`/òòG÷ħ)/żz .×ój,âöEUv =Hx뿏0|É>DBÂ#„Ì?úW úït ׸î½Ñgc@Ĝż3Hô–!™î³K’Óoğ›ì ˜œ…îC,0Q 'D½zżÚ0[fYħcµ˜Ÿ/â´òáï%ĵïıwôĴI›îû,+rĉ,”{÷3R…§Äë,PmáĜżĞ×äBü}@>³{ĝ͆Ĉ=ƒwžĵXw—ê@m¸#îĝŭ×˙BróċÔï<áŜ,8Ù\ ĵĥ5Vû…˘ÒfP^0úœÊLïÙı˜Ë.EzEA\.°9#İî\댊÷˘;­+àÒTÛ×ÍËé†ġëĵüèôŒ{ú‹"­ŭ!*‹zċ„cÀ?†öŜ†ù#„Ŝ]ˆö Ħ >ħza˙ġŬäù/^€°ÛóuÀĝ&ŜĉÖY"$u# ú%İsl"ĦNd]TÑ~Ĵsì‹&úí„Ö)à¤ıw~ZP')ò³ĵ÷É}‡Ù}û““ıÇïóµĵá˘=Ĝt4{ ô?d˜ßŜ7 bYâï½)ÏŝY€Ŝ,;…Àĝ÷`Ηà4kL³ħ0Y]X*’m &½î“oB–ú†ĈAfó4ŝŒü&ħaüjz·H‹VCûóżšÛ÷ÈB,`Ġü}À˘À£˙.B˙:ĝ:x‘`}¨ ĵODì' ú{ŝàÍżŸŜxÉewßd¨˙T €%ż'š¨ñĉLTw@“/ ĊğĦp7 ĞóğJ6煯.àg£/x“SVÌ ÓËT?mXvP jÀñP߇ ‹­|&=‚úcˆÁ÷ ŭ÷aÙCè’  Ù!à4 wßHoĵg÷SüOÓp@â˘ċ,ŬvÀˆÉHÀ<o²íB‰8‹ÚÈİêûùy’ÒĞ×ħñ%:ÓçRڟuÛ<Á/ĉ­„`ñ˙&yï~€ùC˜öc˙à}„áG0ñĦÂzG¤ԅŜ@öyïÍ·ĞÇwßäìŝ­ˆĞ€ğŸž)…(°ù`NÄ;tµFÀy÷üÛé§ĝ“ġ ü³ž'?iñ^öĝ³úé+W‚ıB(Œż*Ċ|ĉa!l˙^ôî?€+Vġ3¨=Xĝc(!DíĤ…{o~gzóKĵl­ı2îÁczÒ^QeżE_áĈFÀÖ8óâdKĵYQ˘³$îÛ,âÀâŠùE"=ë÷'óöëRäġú]ĞĴà=Œâ‰~èb!ßA\Ĝ£C<`ÚSó{!àÓ§ŭŭ; ıöEñûŻ3Ìżµ€ĊŽ “ÎuqèĤgâ0&Ş› /Î]€2öÒÈ%­\’1w …nınİ‹d²úı-òäW6„_è ‹=:ò쵍CB·ñ½Ÿ/è9ô†Ĥ0 ĝˆ‡ ĵîùwrÑß-Žî½Á Ĵm6L;c˘ qħÂŝŒ=Ħ8 cQ“[€Bñ'myèó˘Zg+‡~š^dSûJ:[KÄĠĥIµxŻhĠSËŻ‹Ħ=xóħ@/Żâ‡ïĊ~ö0ŝû°Ĵ’ÈTÍİ‹ż§ż&^ñ÷ùQџ‹~Ÿßä³`XÚHÌôLpÜÈc_á÷(ì¤?_ûŞO[Ä×ñ²ċËyùgÍä/Ӆ†! ĵi̓G{ĦÜx½üŜ~ôŝ‡0 rc  b½èíg>÷³ĵêïŝ_¤7żÔA’z€=ügӐéKI’L}İêúì 9§ ~. ŬĥEÄ?qĥġ^$âëU& ö`yHßò­iĉŠ]óñïŝ0Nċ³Ñ„> 1Ÿó1ĵ€x¨à4˜ùA!‰ġ`úĴ9„÷âˆ^ż˙zĈ Ĉ5’ë·ŝIJE'3ÇèrR~Îl˙ĞÁ²”ó$înKžÊ‚·ıç)k̝ëOğ_ÀĴtĊ Ë1òi Aˆİĵj_†÷c8?{€àp°0‚‡J^ħoY|Œ 3ż#È ˜·W`żĉï½ù¤7ż”Ёnà9‰ĵ€€ :‹pħŸžœž>“\šrÑ<ôuóċ  .ä³Ħ>ƒlÎr1=FÈzı›ßŻ íÇ>;ŝfŝ÷a>¨'˙C£‡ïÎÔb.„!RH†NŠŸÉŝ÷ÍŻĉ‚/ĠmA~˙uÎè?7€iëRÖÉ ëûv/M9˞ĝ˘èĈ|!7†ÚˆĝÌÛ,†g-òŠíuġµqfñĥè‰OTl} °ps÷Ĥ!Žà5Í ŝaÄS¤ 1‡@Â5¨YNÄ} ŭĦH"ïĝŭ×8ı~kⲊà@˙ĵFfFRub½.kHĠC?o9òmñYç19Ĉ•"Ŝ>EN}!ÄÍc~†gıĜE²JğA‡1Ò˘Óħ‹÷LÜ £nĤ8ĥYĈ·aüÓh$Ĝ żŸ‡š7™Ż,UUS„ƒ×$½ù%çßı3f҄ƒ;=~ .Š p~îĊfÒ(8ŝ ĉ@\ga{äY|Ÿœs\4Ċ­ĝŝÍò6›]àcH}ö dfÑ{ğ-ä"Ş}ÌZ}fjEĵ”ûÁûÑ+ĞSÊÇ5˙(œlJìĦÇQôCE‹Íŭ½Ä‚½† Ò‡CLĜ:Ŭ…÷@Ú} @'Ü{@òâË BFwîBÎĊŠ2ŞÚ € €FÀ6xáĞ xrf~[D^D:­Í™‰,6ñ´sħ?â>Agż@™·Xŭ^gG]zÄ5@zÍŻiÓߝà1|î—ïíH§3`ĝ~ĴI‰!üŞ àû`vTsp§1ây':n쉃X–äD²‘@ƒÂ:“€^‚SàÜżïŸE’ĤáÛ’ë·ö$‘Ç<ŭwn³–ûÂÁn’Xž—]Üìo˙öäÜ>·mEoÀâ\9 HÜĴۚyû…Uóĉ…—-bS[ˆi(ûÔnjbS˜f1,a8fxİĉ^µ8Xï[€¤‰Âî$ݰŽ{êùġ2d ‘£qC$q° QÈw¨²šO ?„„İ)I €9QġÚA‚|ŝ )Ÿ wŝ…òs{óÖÈxX—a}Ro$0@ÒАkÎ3‹ Eê:Ä%œyÎE|›„|žĦşXÄħħ!1M܇>zìu,̛‡ŜÌâ8ˆƒê¨š½H.¨ysĞ| ƒ|„­‡Ö51g}¨ú¸³Ö”C)ŝâ1&£V¸ġvU?ñ˘3ŭĞİ—Ċ)TJ›!àJ8¸-#Ħ9EMq^Ĝża<¤Ħ‡jĜ_{^Œ9‹óägıb›rċMĈĴ6™W'ĠBÖy‹U菄|VœF9ócħK!ŻKOíj@eôvñ8ÌwÛŝôwÍL’Š×ŝ(G?!âQ–ΰùúcW¸RÌEò󋆣HofŬğÔĞĝÑâi…2:`vê^‹œ·àOĦèĞO\ÌĤ. û·ż9•zñe‡?Ĝa˙6ÛñÈşÊ/ĦˆÀ@\w~àĴ¤VΑg=OM"żŜ€˜‘ÀŻT–4{ìó&âĊîöşÛ½aï…">ïzŽRĜM$</+‹ı‡âíU=żù# Šŝ”G/–Ár\êSé…,GTbĤÛí+öCL3gı^úÑJÉC£Cñ2ü›ž+sB£×6 û·iŜk™<˙J:ö˜ê˘QIyç67ê‘ §îĵ¸…CV6ZӒÀŸçŽ„móÒ×SYV7òyíĥEÎ|òğV|Ê ñşÂ¸Â Ïsë“÷ †-ƒú)CZ,ä½èG@ï# 4BèaX En½|ï-V­OċÍǎˈ¤fH*Nyy…?í£c^ĵ8€Ġ}‰…ĜgĝÇHÜ=¸J3Ö Gáîí?Wûùżŝò$•ĵ{‚òşšÜ|YÂŝí™ïfxïUzòä” Ÿ˘Ş÷›+àñ˘ƒ…žµÙĵuĤĠ/%óä'b+‰ÌLï4gö—Żî‘×} !Ÿ) ~0ĉ5ÇïUœ™_´Á<Äe{™MzĊZ×^ĵ À÷gœc^ŭžG L'ÂîڏNñà¨ÖË.by›T˜aA£Xĉù}LÂYY¨1u‰†ÁDá_rŝĜŭ­ttn†ŭÛ²À#ïŒ{8jXÔżW·™w'gH}ğ´¤'¸¸àĵŒj= ıòf"ŜĴà­úûòĊĴ?4Ĥ¸}8³€­êħOzE.܆÷ë'ș²‡Ċ—ĉ`yħâ ¸)O~ôoŸéXµü˜aYRóñㆈ"¨ŸĴ¨SA‚¤|$E]¤à?Gż€,?h™?‡†ŭ;‡3ŝĊ—%ĵ3×#çrrA à'QÖÄ0Żs QùĵmCcšĉʋ1³Ċ,ê/§°×{éĊ²•i·\ÈQë鎍İ÷ƒ­ĴbŻ/´5 qhL8Š#^sÁŠžfË1Ġâı›7ŸËgĝâ.ŝ~ŝğ"ä0:?›cĠ$RÙèO}ӝÚZŒ²]? 煲n€ù;a˙Îï.Ö’ŠıĦ‹?Üóğ‹e¨ûƒpħzӀnıĜʍ„Jûßi/ Ú6!ŸU—8k|Î E<{.ú ˜:|–À=FCcêŜ7=†™DxJĞŠ/?ċiKyœ\@£é6ĜĵêŬ÷ Y(…t2MfĉËıî:5ˆ9usï…QP7s>Ͻ *İ‚Ş-à Ï8:ü¨(_%µ`wÁt£PŽW?ßDâĈ3ï˘‰ŝ|x÷Î; „ĵ‹é°ûÂf£ŜĞ,Š#dué¤9/N Ö$ƒ?aĴal“ˆ7YĤ2˙ĵ›ċÊé‘/öÊÇ~fñçC)ñ+>7>ĉ%ÔŻÄE{SátÍóèZ†ÜkçTòĉŠÉv6 Ge|ħmÜÈ=ġa{Ĉk?B cıjMôA|żĉӗÛúÏBôM§ëÉx8½Ì‘?Ü;cħö˜żO?qŭƒx˙·w?/’]UÀż÷Şêž  ёÁtëÂ?À˙CÜ6A\ .ܸp#¸“PôJ܊"ş *d!$QÓ5ƒ™d†ùĠŬUïŬ{Ž‹ûî}÷÷nUχLòŭ@Ò3SĠŻŞğŞûÜsœóöïeO?š1íÁMnŝì͖ïz˘ç=€\İz TVï ùñ§93o½ü*Á™›Ŝž-°;?òـϛÏĴĞìÂ{VÜPœerJ¸bĤÖ:IMWŝ[}êNëħ§ÛìZmPÌ^$żßèH[›Ġ!Ÿ}1• /“7ÂI1AŻ#.üíġËÍÍ3Îäŭĉ´:Œż·9Äw|‡½P€Ñ/c³ĜğġÊ_ÏċÉ7O—]s½ü“ â˘ġf+Ħъ‚Ûx™ŠÂÈŜ3çCF?.·_† Û=ègo´Ĝ/ŝĈ?•=U#瀷ŭşıÌŜ™,½(ë%…ò°< ˜,’Ğ…ħR ĉâ°-ż<|żEÁµ"P?sïBñ}4ÖgS€X]]üc÷ŜoŞ?ÍÍ[Ô1ĉĞ'Ĝwdˆ>K›U,65Ġ ë|ĝ(>z1°FŠl$NÉZƒÔ k|{œJŻ/żêŒÂUħq½|>˜w~Ĥ`LÚNêYh_ô,ĥ“£ñïĦÏy›^ŸĝïĈ˜rÚŜ=ÇP³÷CÊâÛ{CĞÔı Y.BsWfâĈˆŸ4RïßóĈ…Y³Pè¤CÜhgĵşùjp‚]ÈħóH.À êĤ?RqŭÜ#4p^)×á2Gŝlŭ³j YëÛí^ÚÄŭ”!â@,Fż , ¤ànûBÂfÚ%î!9ü~š6N1é˙W]3gF^ÏÈç‚x\3ŻíÏPU MqÏL·§`(ċ4w œ1 Äär>i¨bmäe ßŜ+q ŝQ8bê.aó :ÎL݃äMWâmù˵)f+şêÁm#íì7N>;?½ż†Ğ.°ôíèŞK ĠçûËbcœJ à-{ŭË}ŻaQH&+"sĴѳÒ/Ï~&@o‚‹³sAÙ2ˆâÁŭ˘²ÂêŭpÄ,­A>;G>׿<zéBħéRĉ]dÌqÛîN€³¸ó˘iЁ/sċ> W7Ui£š}–Q_ *4›€oQiÉWnϳ3h, ¸¨\ëe˙Żz™ĉµ7f›³‡l° =˙€˜ĊuĜ/§ġ˙§ÙÌÇNiWâ˘@ğ'_ë\vÖ|o ×-ŞëĠùŭŠuó~Gyj˘ Äم&+} U 3óYPߖƒÂl*=fö•Żšo‚I•&ÍxJÂÊüà$EO™â-&mTĊXîĴAÛCôĥ€ŠBġ›ÓêÎÀĉġ ɎÄZ`IW"zÑbĦí9p}sí€Ñŝ—=÷Ġy­ÑJT_7—aJ}îˆY§úiù|M<îWĠäğWfáYtuça'{üòMpğsh@[¨ğ&}ƒČ7•ƒ£rħŬwĦËÜ·ĥµmš:/ŠÌÍ‘‰Aw@쏂ĵäï~súN5ß<9Bcož·=4›ħÑgfÀ,ݰ!3ƒĊ²ù|˙Ú †Îiħ1.ß´–²Ŝ´CĵI2}Šba&fĠŜ‘NŬ2@ÇsäíŬ4ġ°!çA\†ŽiêwEñk04]ÁroG|ŝ.D\£~Rfnv!l÷h‡í ĥè0Šï&ĵ—"Kt£ÑÁ²˙ƒµżE^÷=<ĤG#·ü§gĠ@ŝÚ×fFĞ Ĝ½ĞèŝΚGֈˆĜU?ŭŝ{‘Ĥġkc€ŭ5ځĦي/v°Ğš2°÷ Wd&럜1OÓó}  TvwöIÇL}rĉ\($£nñJzžñĴycá}ßM­´Í>'ħˆLcCS–!ŽS $vEYÚ ĈGKuüf}cßkÑW‚›yÀŭEdüٛ—ü1&"zÖ,Œi`­…’ĥ<ŽIDATY}áSħIïÊcDC€œ+£ –² Â2.3sf½äĠ(Ŝ7^™işbn8 ĤŬù@nòïġ2RŻÙîúl=Vm2eâ ÀÁ“F½ÏµXœàUxvĝ\ëÏÖžġġf%8"˘ç=ĤŸí1 VBÄ|˘ƒçYóqıàT^]÷4[IcBô™Ŭ7ŜàĤv³ÖÎc]t†Mn)˘ZH×ïúïĊt}Ó,b Ÿ>—ñóôÒÏ tY Ï cvĠÄŜİfŭ"萄NjÀÍ\ċœ´_àğ°ĝJ9w÷ßüè-üéwş'[oĜaêƒÛEˆˆ^̳¸žqì2w(;w˘kŬİOÖÌĊ=ˁiC•ĜlEĠfYmìž[‘ „ oR>&êCâĉ7‡IÓŻ€•áԕúË401êSá˘pçsH–›×Ŭx%<SŬÉnàPkĦA [féĈjü{ïškE†ž˙ÙŻhìۈC #ħzÎ]ĥŝE5ˆß<ıŽĈŝ3OíÓmïÉĝ}½ÏÏŜôüÑ!"ú `ViıëžàÂĵŒĠ4ÈÇéx/ ĝm(U5LıÇ5kit˜BÏĤUu˜ê!3}ċ6„]éíÇĠóáÌı+ù—6äĊ 'áh[ëdTÜÍ´Ùq5ĝjĈm´E~ìl%íôûší •&ŸuÀÂĊ2ï@F›‡Ç¸áo˙ê}/bÑIm("s¨Ü9ßŝDDŸë€…¸‹>< Ôïu+tnÑĠ]HuUÊk҆Ö|\kŜ7Öù  ûÓcV}£•,kŜ×xEGżvżtuïҔû¤ğn÷DGݞ›- SŸÏOğÀß^˙_Ú%qŭœˆˆžz`r ?•‹/{=ş‚°]ġÙë.d첅tRĉ˜€tŭ\B{w4Œ7ÒÉİá¸waúè=€TîuÒA-żßxŬÜÙr™y[İĞKèß²C1ñŜwQVĊçċ›à cżàĠáv‡IûÍé{ĠLŭġ“ÄÊĝş~³ċDDôĵgÌê çÄ Ŭ#Ĝĉ°Ĉîwác<ƒîw€ÒŻÉ+ĵtĥ-œ˜ß„א'ÈĞ)÷XĴĈû2ƒ.2ûìÜı t8+2îŝ. ÈÎ òÓċCWX9žÍÔҀĜŸ žD²~ÈŭĉôoĠ@~óäŭ°|BYr=S˙Ϛ•∈èS2°ò>Ä.Ħ˘Ú~hÄŬìqÚ%/íƒ28{ ĠÙĤXm C™fΚİ÷Çĉ‹e}İXƒĴßÍÄĠĜ€phìŸ×ĵC WÇŝlŭ½}_|QDĤÉĞè8{~g½ċ[‡ˆˆ^ì€ŝ˘òġ‹û;UI™rŸŭK_PFaÂóívҀEGg›ŻÈ0ƒ ȧ âµ:tĜĝ;ëïä ʓî ààz;‹ÈÑçU ’ĞoŬú"ÔŬÁ%Ô5P·JéĵJ,ġސl}JšEÍ>Ê008‡ħ߆—…ijvá7ë÷÷x³çš›5O˘=Ġ ÀPŸ´ïŝÜ,żŝ£Bċ Š~‚}˜˙1–ò|š°ŭLÚ#żYŸzÀĉµ7–húµrħ“H%Sg€'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ŝ‘Âk îİnIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DSButtonL_420x420.png0000755000000000000000000004742112467662066021410 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFD I|!ÙôK)$$ IĵQ!Ùż˙R"3]Wż¤BB’Ä ÉpùCDó\RzŞŒ(9 IB×-¤K„cĵŬ‹ŸyÙC„%„„$!‰o ¤SâyÈ÷.•ĜKHèœ\ĝÈï !!IHâ éRáĜ/{I)]*Ÿs—]rı’„$ìŸ/}<'§sB:'އÌ÷ĴIˆ+ßçı´ôğßŭNżÄÓO?IHo˜ §àúu€ĉ˙Âìcŭ|é_lŝ-]OÜöÜġ/9ĈİÇl3Ħ.>?ŭô“é×Dˆ·O§§àMKÊ.Ĉ‰ŭ%‰èì›Ïİh)ú­|BlíÄĤĜze/ÈtÈîܐܑp~ĝáûĠŻ~Cá‡~èbŒ1„`fw·2\ħĝqŝù#Î?Ÿ !€“twgJ)ŬŜŜöîîŸ?N···<#Ĵ£!= Ŭ Ù)!‰×IDG2z˙ŝ}ĝĝñc÷ñǛ>ÜÜÜÜĵßívïĵ3³hfd(oDV…ô̂]Ct÷D2¸?÷ûŭŝîëׯûždwwç i JLBHH⺤4‘ûñÇǏo~ġĞ_}ĝáŻonn~cühf?šÙ{ğ*Ÿ™€^DJMRš$ĤĉòÉ{’_û˙ċĉĉĉ1ĈÏ÷=ïîîֆŝ$#!$$ñÊZQŭBˆ?üğ>üúŬğwöîŬğBĝBbf?†nJBZ•PÚ{XŽÏ%9™™“<¸ûgw˙n·û!„ż$i)ôéÓ§ :öìùàO?ŭdÔ8̛ä/ŝâ/ô$ é Êi­€!ĵ˙ëşî‡Ŭn÷ÛwïŜŭ£ŝßŝw˙Ġ‡_˙ú$÷](t6ä 3€ċpVŻ—7_·ydrö²VÍġê9Ë3ġC2Îí?ŭ헿ó_ŝ×$÷÷÷÷ğŬîıâÎÏHO)I Iĵ² ŽÊĵcŒħëş÷1ĈߚÙ?üĞ>ŝùÏ?ŝéo:3üI~4{BPĴBÂxٜ`@€×áÔ˘çz”Ğôċ~@"°'ñĊ‰żéżJŽ˙çĝßŭ“ŝaá]×ŭĵÛí>5?›ŸHGB I|d´$!,H)†nÌìÇßûÚ§Ŭ­˙ìĈÊYœ¸/ujĝY+˜òù.vnB½Œ9Eq&f'°/˘Ġñş1} WoÒÀŸï ˙àßüq6´͋–…’’’ĝ":—ŽÊ€?ĝU0ĜŸ„rF'áe܌àä ßĝ3ĵ3àĈ€ÎšĴĊHA4À $Ë˙öNìÜ88É͍áUl$vñŻc43ûuyì71ĈĜü|˜‰iéĦ×ı)Í# !!‰Ôİù#C^cÔˆ$wfö>ĝ÷‹Èlˆ£•§eÎçCŜ‡œ\ê?3ƒ°&ĊF“ŽÜ†Ħ'`Á`žïœĈĉÖàh*µÁs-E­Œ}ßÏ’HJ’xe9$woÚöŜƒqŽ[Ĵ Ŝ€  ;ËżeÁÒüŞG&6„–Ċ—Ì@{ßĥ]Ŭ x !ÀÊ:İèîu½T˜ğs–%"!6„zÙ]·xN]v$&wċdn$ÌóŠôvèl.˜€Î 66ŸkŞçĉí0KMYħ§ ÷u³cĝoLiN` ! lĝ9ÊçK}í֞›S— !$$ñLR²sÉyÈÊ(WŬ8.`hċ`bÈI%Ú("œ’ÜĴÌ9EĞRËrš^ż :6ÎCĠCԟĦ$½µĤĞx€¤„o Ù½½¤´:ŸD2”FҜ46ŬXÉĜ†›C鷕kó‰:!˘IDµœ˘OŠÓqĝ9ÊCŠ„‹„JHâۊi1)ĠdQÒ<qċ V$tîş8“˜&·³é/ĜÚ1YU²#š!ğµP*B Iĵ”V‡ñêI|2‡Tğ$Ĵ5˜M× µòX[³*(ĉsVȰXGÀŠ6ı ˜BÂJJBHHâ§#Ĵ$ĥ‹·Ħ$öšóĠ9µO-ż&ró8Êe—¤¤ú1ˈ“4ԖxÏi×#U ÍŜĵì{-)JLBHHâÒÑjr’Q­V¸0µÎÙĴ ›„à,í€Ìf}î–R›&ŽĊġ2Èk,ÜÛ2‡!áÛ9Ö . BHHâĠÓÑRĦäNÒêpÜDJANƒ[[’SK?‡Ž§Ù,]5BŞċÜNİ15ß_ĦħŜW{ìIGòSğŜ !$$q‚:›€RRŬÌq–W†F"a•š;[° 'é*‹'1 ÍÉĊcbk&’cğqà’”NIş§Ú !!‰—JD§3/lk)f.42J†É†.àïDׅ*ŸT×|´ïxûC#$4E¸lQĴ†ë„Ä+"Ĵ$‡vĜüy²k+ßĉi~ϸċ!ĵùœ-iÓRï*£Ì'5bÂ,yµrrNS–·l_ûùµI I|¤tIŬdĜaŝfaPŭ2‘H–[Ġ½ŠŞ¨†.6&$›§#ÎÚ•˘ˆ!-aŜ)˘iË`ËĊ ?×%ÉQ2BBßPJ'żßÎÁ´)fm˙#CAC? פeY\–ÙÒ°]*™ç“¸\ò]e6Ğâ›ٝ“”BBŻ,İĠŽíÜK=ÙWħ§"İ‚JȽìÒPm+ìĜĴZk‡Ür…ıfNiIfÁĈdÖHݲN IĵáeĞß­bÓFĤcJ"Ñ×vċúÁêLÏ´ô{KSÇħÒûĠı£´2ˆĉE·’ì χ†î„Ä5Èi>Üċ'ZtıÁŠ<ĴI,9š°BdƒĜ‚†. h’§éh~÷6rÓ,ċ“’R“’¸‚4tQRâÂüÍZç„Dğys=³ùxÙñf}mQCR•QÏġ¨ÂĤ]ÏwsĠ’x‚bËóG×zËiÌŭè&mVúÍğ|{‘Q-ûžÏU=x›ŠI!!‰ ëʊŒ8Ì%qıê­ħÙ(+UpĈġÎߓuLMg†y:ZÚúĵşÈ‡Út!„„$6ŸX*à âĠ5R-ĉ4~M*운4IH³B?•Ĝf_˜İ A!!mšĥuRJYúşj#J;ĦšĥĠ·óGC1¤Ċ|ŜÉ Y)hp.=!„„$ĥ“lÜsÈı,!`ZçÌۚk—pÜÇn~ğĥAk]ğ$½I=ÙoÒ'„ÄVD h‰Ô ­Ġ_· ²8´ ZK`íċĈÜ%‚ĊfŞiBHH§Ŭ”ÏħÜm{1ùpÜ`İÊiıʎc…ŬŠ|ĉmܧx$„!ͤ´& Ëzr(ûĥµ’ožIE<.dÈ]#tC(=„ä$!„„ô½HİħĊúPWo×Î'͛Ş^’¸ĤŸĝ¤àâ\ġŸBBÑp²·ĥòŽg“Òb#Ġ‡háÂZòPĞĥ p…’Ĝސ8ŭœgĞçċrŞÑùdÄ!qş—<{!„„$6””† |€x™´N Gi¸^MENÙ !$¤McÍXĜÒ:¤Â\ÑıċuOB!!m=-tV8N/Ï$ ö2b蝷vŬZ AujBHH߉”Ú„ÄËä³ô}^zŸ%#WëĠ˂Fë„Òw‚îG>Gúı@FKsF“ úʞêd „’Ĝj2*2°0î‡ôìj™'£sRt‚IJ·…œ$„ĥŽJ*rċÄç&k]“×L98ËÛk!’’ž‚m'¤ZiW7Âğdñëš|Ž.çÜA§‡éŽddswq%$!$$=ÛNH5ĵĜs ¨ŭ’Ç… k·iu`D„hı𸒒ž‚mSGҒs2„vV@Ğ%á\ ;GÉèĝûyëtkäT7 ¤’BBÚ|J*R˘-§#54½>Wd4]{œ˘`3–ı-ÙH!!mšĵÍ'µO' žòÓT(³ŻW‡éVšß9óÜÑÒÈ%%!$$ñ]à %oçtÉÖ'‡éĉEmŞ"á%µLUvB éğHI5‰LŞß.Ĝ~‚§{NFKİj(„°,É\št$„6o£ĵ)—ħqĤĦÇè(u-ĴŜ Oµ˙X°Üñ[!!‰íĤ#³ü/ℳš}ħTÀ°˜~VĈÙä͆îŞ²BHHĈŠĵĴóĦ_Ŝ2h)ñ„Œ– ǕJ‡ş`—6mĥ*„ÄVRíeg6)Ż´ÁêQÜ‰jş“ í˙›ĉDˆËB Il*"ċ³|ŞÉ°c,ġ݆öVmËŒ½öL c…ÒÖ#R]‹”Ŭä'zÌ­Ż#:÷ŭeÍ­59Ž˜ĞìbŬ„ÒĤ’Íb+‚ÁT‹—Ïn·XÀ° Ş#Iy ˙İmBBúNâƒä<* XÛϨÉ%]ğqż£a:ÎS w /„BBÚ0$K* f‹ÛO̅ÒŜ–'<ùŝz{ïYİĝĝ½qQìüŠB Il3!yY‡Ä‹bŭL (ž|âR€âÂ\€P£%$!„„´mll4tŭž caQŭÀ“íÁç{œ ny²ŞŬXÖ-÷¨U!!‰“š„B. %ÍëŒÎíuÄŬ&odÛv"WDBBÛOIÀ tNçtNvV8µ×—× LS3!' ëJ;ùH IOÁ6aSNM÷†ċD²XQÇY~YÛëhš˙¨ ‘!ĉêż¨ñ:!„„´ñpdÍbX³,…Ž óG\‰LkÛKà¨âŽĞsU­˜œ@ †…­š„’Ĝ´˜Ĝ+4"árÄşĴoŬ‘hÎ$£v‰yçXƒş} !$¤MF8> ÙqyÛñÉhİoŬq§ïċdt4ŻÔ )” @ÎöVBHHb{É(›ôĦ†Ï†éŽ*ĉ–ċ†£Òî£+LÓ~ħ ÀD är;Í" !$¤­'¤ş+k]SąX´˜~–DĠÈhMT\BġAĉù#O޲BHH›OH‰ÂŽs!àôNŻ“›4˘òy²šĥ:\L8 ÁAX)¸ë%„„$ĥ’Àa<,ÇIĉD2ZÜÏèL2ZZ‹4Ŭ˜Ï‡ë—I!!m\F$šíÂW’Ñİ-ÉÉċd4YÒĕxŭà3W?¨ÊN!!mk$T·{˜l)qÁ~F£uR§½é³ £öjžˆàTë !„„´é„T$D×!Ħí·ÒXu27›3"ŽğvŻ­3Ş•xœÉˆĠeŭ‘+ÛP!$$ħY!Èû<¤q{SMTıVÚ=Ÿ3ZPë¸a>_/:Hƒ {# !$$ñ=˜ ÉŞŸ˜3Z)í>Zôş$ £dt< ÇĈbVZġDÖ !$¤{h> ”Ĥ2âZLòı°ˆ#O­5SġQmËw%y–’‘ĥ0Ÿ%„Äv¨È $wҒŒ–ÖÍMnżÜ&ܛè´:7EÀ}ȜQSM·ˆ&›ĝMUŸJr+—iaĴBBÚ0$AÏédŜ6èIÉțdÔĜÑĵ‰Ğ(ciq¤1;!$$=Û%À@XÎöGagĦşáxÑz2âİ9#̋!8ı+céoç†èT‘BBÚ2^ê=\fÍ3ÉhöɤšIX\›3ZŬŽ˘Y4kù£[é÷mĤx$„6ÜŭDĞŸYç†yj⺤x"I­ ÓıY+Áa‘n¨ĠêÔ „„¤§`ğÔb @żÇ¸uİ7ñ¨jş6- ÓÍğ;Ô{uBÈé¨v$BHHb³ )†ıg) [P\XM7|Ʌ²ì3ŬsM† X´ìG'‚ċm(ÔÏN Il9%µ›[ïÀp´èġŬsᄌjq„]s[!„„$ĥ+£ZîmÌMLBCJğ1ŬBb9eËÈW.‹€†M! !$¤MS‹×ˆ,£:|wŞ á¨´{b£ËdĕdÔ~¤=€ PÙ·BBÚzBB™›Ħ͆ĈÖ$£µaşñt?¤áĜUL³q9`@ʋwċ#!„„´ċ„Td`fıhs1œn4 > ÉhYfùû˜Œê§DŜ)X]dĞ1;!$$ħiĵ ĵısÒËîâdäÇuŜ$™ÉüÔlíђk„€Ò‰\Ż“BBú.RRrÀ‚CWí ƒŒĉûž7ŸÔuFcšZĤJ2šË/%˘3%#!„„ô]wgÍŬ´91Ê4½~²|?£y£ÔS íôRhZŒVş5FÍ" !!‰ÍRÂĉ}‘ò\Ü^ܗKÁyĤ7ŬĠt“Z‡Fr†q+ó*(!„„$6Š!7XMäb§…, _îÚŭ€uF\ĵìXFù1‰ËħëL2BHH߇”lĜ"|t § V*£…ÒnžIFù2Ï[a”9-#‘Ħ…ħB ió )ËÈ'Ÿl?ñµ!şPF­ÌXŒ!ïĞ(„AOÁvi+ĥC7é;·è•3Ġ?ž‘Q[3ħ(£Ù1Í 1Ú¤ÒOĦ„$ĥšjZñĤkw[ péĥ³a:žHF<+£ĵS,A0ä–FjĠ „ê˘UÏGÇÉèÌĥĤ[”ÑDfù 3›“ˆ$„„$ĥ›†=† ΄›tŜ^Ûv|R9·Ò›î¤Œ¸ŒÚ#”wf0#B”BB·Rb‚™Ħw.&#àòjş“2òY2â|“ôĉv0tCJ*üBHH›Ĉ=ŻC‚˜žQF³íĈ'YW’ÑħÄL†Ú AùH!!m:•A9ÏÛOŒ"y ŒˆĠŜt’ŒN˨Ój·W·o!„Ê·N;/dÁ.—Qğ‡ÑKÈ‚!D½FB é;°`ĦЉ`òc9f‹‡pş7Ŭ3ɈÜŭhĝO!!‰-Ò"³Zu—ç–ŽVŻ^Ò(ġİ2òö&ıKCŜ£I3HBÍ!mÜG÷ÒÇ.ah"‰—.›É¨Î!UYŞÌNĦ„´uʉ>DL†äž]Fmß 5ÍçRÙÂÜ]evB%¤mË(·ċ!€aÍoFFf’”ïTe'„PBÚ~8ázdTħÚHÈİN B%¤ïBJV ş|Żn×ŜŝdDw ä~vĦ šCBHH[·Ù,Ȉ'’ÑKÉ$܀y<ѓk×X!„†ìĥŽ÷C˘çÎ߯&£rl27V…Şì„ÒĈRîË3ìĈjUgĉŒ^\FÌE ž/ÛĞk IĦ!ğ-§£ĉ$ï‰0<·ŒĜȈ³ÛY)´ „Ò÷#'éȈ+ÉhrlŒ]ÁiDP:BHH‡£Œ ô'd4i˘zıŒxj˜ŽËɨĥ 2,°GÓBB!!‰íù¨Œ…%2ï‡ômÇWdĕd4ù&gɨ½Üò혷žpo2œBB›Ä̐R“Û˘4ÎɈ-`8%£ĉv `1—}› !kTe·ċ„K-žOF“vt/!£fË%C^›‡î”Ž„ÒĥñQ )•µHcÈĵ4–EFO*í~€ŒÊ6ħ çŬlîHñ˘!ğïC@Bi>y!q^^îÏ›i£f/ !„’Ĝ¤‡@Żżĵ ŒŽ†üdÔŜÖŬS·o!„ÒĥieAÎJğ/”a]FtĴ32 !—}ğĥ1B(!}V˘Ĵm›p^F|YÁ/UżBHHbğäLÓ\(# •=›Œ|! / Ó1 ²‘:z•„ĝîѐŬÖ1£WÎ}kaz›P~û ĤuHBHHz 6œŽXžF›T²ñĠdT&–œ ½Î3İ[ƒBCvÛGYil´úPqèġbq9Ġë§,Ëx0׆HB é{ÉJ0hœHaIFäû-ÊÈO$#Ŭ/c.E73hC$! !ğí§$äÒo-ŒÍ˙£îĝf2Ê7)Y,HJHB%¤mç"ç¸ÈĤ>9ÙèĦ2j…ƒ dT‘ğ cmşBB[5R>ד£7žUFóŭ“ÎȨ]›P†êŞŒ4j'„„¤§`X†+#vı÷QÁÂËɈKɨúDH‘”„Ò÷ $ƒċ^v6#z ùJ2jîèŝœ@ ĤĞB5lg.j:óDƒO^[FöDÒÖB ió İ6VÍHÁìjd4N˜„ÒĤÉUv÷ÜÄ49$£:Â÷l2jJÍauK W—!Í!m]I°’DúŝĵŒ¸.ˆ/!#”ġGĉ°òĥLfBBÛÄ`Ș€ŭì î û½ ŒÚŻˆ1€0|şëqww˔4v'„„$ĥ›‘† ,RËì^MF%‰DüñÓn Zˆ$„6.# ‡Íñ1qq‹GÉȉŸÙ##µ…ıBBÚĥòIŜ½x 7ĴğXF\ëM÷‘ÀáàĝċKrĠ„’’ž‚íbıÂ΀äç“Ñb5ŬeÄY˙şÛğ„OŸ€ċ5Rá&Ż‘B iË8r'm³ĵ)RÈۅż¨ŒŠñ|~#>}9àö.p˜…Òb|Ü·I!!‰ÍF$À˘ÁŬ`Ĵˆíıd4[żä ~ù|À~ïhğƒ[0°w`gjö-„6í£=ˆïKTċävA1?éÁ…’Ĝ%…‰aÍéceäK“Në2ş½MĝüċPÜUdT[Ĝù8q”+˙´I!!m›Ò/΂Á˘^.#bĦ1êe2úòıÇ×ğŝXF͕i6l­nZ* !$¤­û¨$ĉ úSˆŒHâÓ§î÷iYFċ˜î`°¤á:!„„´iXÖĠÒêv ñÇÊhâ³Ĉ#9 ïŭĵŒÊƒ3 YšÁ´'’BBÚ4w‹pȇˈ+ɨíÀ§„Ÿ9ÀʈYBž'òBHHbƒ)KÉx"B°R~½.#$£5ú,#ò2Ş$‚ W“o!„„´}#…\½‚MĊRSÓJ2şDF÷‡Ÿ>šAʈÈ#Ŝċb‹Z+„68´èñş,}ĥ…Äetwßçžtx„ŒŞëñ0ĥ$BHHb›XîĜÜŸMF_oĝòµ´ŒX·Ä"mc.„6î˘AÁ žž&#ĝüeğğô89@·Ig"xH]탄ŠÄCÏUvž|˜OzĴŒ>}~˘ŒÀi…9}B%$ħQĠùšZ3Pç|^ŝ½²%EÓ]áçÏ{öŝtĈaş`ÜFY !”Äñ² –„Ġ*ğʈNüüé™d4$0ĉ’ïy;!„„$6Š!Żó)vàQ˙ş dôË=‡g’Q­ĞĊ~‰°Ĥk“„’Ĝ†í'ĵÏ c/•‘'âżÜ£ïùì2li9)r’BsHÛIfpfyíˆpĦŒ<½ŒêñêuĠ\U!!}9)HŜ6ÌeÄQF)9~ŝ´uŭkiĝşËĤĴ.„ĥMħŒHäq·„Y2ê{Ç/ŸövçÏ-£yRbO¸9 ÌŬ„ß5z_şélTZ%ġÓe3ġ}IF/*#oDh@Ì . B%¤żÛ°0nÈÇĵI_›T8$£\Ú͗–QÓԛî0Xj*„PBÚ:^Îò!äâğô½’Œ8Êu]TJÔo˘JHz ĥK £Lùœï( RŬ_3yâÊtë%„„$6KŜ)ĥÚ"÷ìyMMn_dĞıôNÓHB|÷h ä;ˆI–ÏŝHeXîĠe4|4  Ó˅JHb£>B&+r¸†>À:%$!„„´m˜eÄ` îÀ/ŸöW!#t–7ċĞ !{4d·éx”Ğ阈ŝàĝùó7XgtŒˆĵ((]ÈuûBHH7 ï_Ü#½P×î‡Ê¨^Ÿu -CBHHljäÀ§Ż/כîq2âl‘,óBB[ H†?ŜòÖȈŻ$#o whù:Ԑ’ž‚í’èH{Gèĵ',âjd”‡òo%$!„„´aúžD0¸3oe~àuȨżoî@>BBÒS°Mܝ9´ŭ dD€ eĦ@m+„„¤§`XnĴŠC)ħö×ĤŽßÊѐ„Òĉe„Ĉ-ĵ6`ïuw !ÄwŽ:5l™rògâáZdd!w#·´IĦ„´y9K!CcLŻŒÈ,É*H× !$¤m“Ûòd ¸çTr 2ÊnXÉJJBHHz 6.%3 9$]ùx{öû$ !$¤ï:ó¤Î`]#²Œ˜ğ4˜ċËÍ N B iÛFÊvt‚{ÏR¸UċµQž´…BBÚ6ħì7TNŝfv2‚çËÙô4ni.„ÄFImóÒĞÊÈÇ.߃„l¨¸BHHb˔a1t6ißó*2šË°\OU…ÒwÁŜŻFFĴ_[½.ġ›(„i`Ûé€8ĝ˜”EFÈß֕_Á¤1;!$$ħŬtTECݘ4|k5·Ż‹bİù#!„„´ŭ€jñ…êşW”QٜÏb“|$„ĥŸŠ0Ĵ3 M„ÚÒëW”QnTĥVïİnßB iÓT™ôyŻ\ÍĥÒ[î[ÈțûKċ’ş<‚'„ÄVİë| ı™)ŻDF0X^eözİ„Òĉa0°gpp^…Œòu<˙öĠ!<×k%„„$ĥ+£" ·2@÷בÑ\†)ïd;SaƒBBÚ4ÎQ.‡ĵ)Ŝkʈ Ɍ$xK%„6žJGmOŝW#£ÚWÏr7r•Ù !$¤ “7ç+Ġ†ë‘Qù|ĜI2BHHOH‰@0¸Ï:"\ƒŒj::$X Z+„6‚Á÷yÁÏPZŭš2òVF†íjù·BB[MHÀP]g;šuħŻ*£r™u1oôk(„:=Ĉ}œ<êó:¤Iû o,£aˉ:|XöBò>AcvB½5Ŭ2f°ÎĈŽ Ż-#42 VœéıĝB>BBÒS°m!qŸÊ‰ŸÓ^vŻ"£ĉX‰cşY‰NB IlÏĊ~ȝµ™ÒuȨ‹ŭXÔ0,ĜBHHb“)%ĉ½‘|”ÉëÊÈKQCȏ­ C[#!„„$6 °›0‘ÉUÈ(°÷<ÇU‹-„’ĜލÊħ‰3^w˜nèa×;,–^víq…’Ĝ˘RFƒW,WïµyˆŒÊ°!SMoAsHB iӐùîB“óñ2Z,`°l¤˨4Suĉ@×pBBú.œ4T³=‹Œjİ]QRIJ’‘×H&êö-„6-#äTd1ä ğç^g”M²|ŭS2B![´Ûa!$$ħAóĉ|,0Wµ=AFm†’£Áì2B‘›ÌMíôZ !$¤­c1€) %%M,ôddYFġşVêżíÍdH <’œ$„„¤§`4rɛáñi2š%Ğş.ÉĴ eTï L)„Ä‰eûòÁ—‘µÒh“QóŭùuŽeä§™ O@Œ’BBÚ4Éá{‡Ċ²ĝ´ñÉÈ Z-kŻÖ(\"# ;`1/’Ġ’ž‚íBĥ ċäÏĵé 2jŻokż‡”dUP+2šŻ6U%•„Җ1 àÏK‡J%Û³l!&•a;3+’" v^F,vù-ËÈfÛËç#…ÊWBl€NOÁ†’;l·Öùž(£ZÚmĠÓŜv4"à$‚ÜӂŒl>dâ ,.Š âYğ^ŭzXe*%ß żûŬ%$ñö#Àƒ¤”&[>tÛñY22:ÌlR0F†ġBhe”×(r…°3 Ŭt(ò‰fօvğŬŝ~3 ċcÊG73ÀòfĈòµN>oDHíkĠ|>ĵ†)%73î÷{73ŜŬŬù‰ÄD%f I\_ğçMùĴ @JĈ‚†l;Ŝ0ÔÒnZ6ˆqŽ5˙ĦIFÁŠŒÌŒ`F„îÄëBHá‡Żß½{÷ë?ŝöĉĉ&˜Y*˙<„Ì,…ÜÌÜÌĜ|dĦ•$++ŻSĦ}CáÉÔ÷ŭá˗/‡ÛÛÛŝîî.ŭüóÏi&˘sóM’“„$^í>„\èvHùÏ0ù£d4}Ïé°.E*sF¨qÄe‹2bùşˆâ°ë{ssó§>|ĝBèRJż)ò…)½m5Ż!š„äœä½ğïSJ_Ŝż˙ġëׯ_ùċ—ûûûûš–Ö¤¤”$!‰ĞIH}Sŝ$ùaşv ‰aÑë8Lgšn8K›şQF0]+£Ä` bŒÙnï~KöÍÍÍ?!t777żq÷Ûı„ê‰jA@“ÏġêżÙ„4żìžä­ğv÷ż !üm!ô}ğğ;żğğĞ)꜔”’$$ñş )‹]€ŸŞ #pCn8VÓÍGìm˜fÊsNV·bJµ]ŝhYT$BĜĦû˙sÛŭíßŭĝçßŭhÁŝħ…Ċ`½™Á°% ‘ÛaÜv)˙W…Ë Hxùz¸ìYNC|Ô·\ŸżSk;ŸŽžáç|ùSx³ŽÀÚğM€í-Äχ?˙ġï?˙ÛwĝW˙I˙ñÇŸ>}:`ş(úÔ3$IHâu ıĵ:9Ĵ‹àœŒèeùR– I0 wġ†ÁKcU+Cw„— w „ÒËcû :ÁĦb·ßûĝ›ĝŸü§˙âŸŝg˙ä#B ˆÁ`ÁŠTÍl|œċD^›ĥz™ÖrIJè֐<Žò5àt‹ŬœMQ 6ĞN´EÁ'Uç¤k‡ŻË“rvɧßWùš‹d‡cKKĤ|ŬùcnnCÏםÈ“mFêïÑĜcĵnïbO_îq{ñùa³,a˜Œì²C¨ğ.ŝ@ò=ÉÉbħ£”t}Ä$!‰o?bÇ|’O)k=£ŒĤíXĉdXÎó>7‚!–‘§ÜÂ(KÉA3x4$::ó;u àH1 s˘KĈ<ŻÀ|'gó ŭìzéèê€OγK)5υƒíÚy¤´0ĥ6ߜ° Wżé˜dm‚;{]Öû4Ż‹÷³+ĴœÙüüC2ó¸½pYZ|Cż§àˆè,WUvfˆÍaè@îqw߯ߟèŜµë ntEFÇې¤1A’ÄФ2$Êğ} G'çç&ÍXŜ€³ĵħ&B‘Q$ánPŠ!˘!òP\Èót#àîH9àÉà‘ˆ! ,´X:@„`Y§‘Ož‹ı=.ĝ…‹·'xú˜X8 .cñşÓû$qÙ9•ĵìÔğÖ×à…Î× F #àa熴 èSÀMŝ&ž’eż ‰‰ HwîŜÙĦȨĤ%Í!IHâÊ2ÒXZ§—ÑüL'Jġ[0+E!'£h7ƒGϲŠOıˆ!:áɑ˘q”Q¨bŞ!² ÎŸ”}]T\Ò);™ŻÊÈO?ĈKdÄ3éċA2ò—û ĴĊ#u˜”,³aD,Cğıĥ…‹CÎC+¤5BZÚĤäÔ°œ$%!‰×ò‡Éo~sµ7 €”y}R4f+ÉÉàž‡é˘şdHèR@Ş"Š9Q)İÈİt„°rYí‘Ï`6v&—Œ^\FŻ™ĞïÑ'˘ï)ċŻkċ#OÚĦTÙÙ8W6o MŜùîÁ­tÚ^żJL’xUJÌ'żµŒ†û(ġžçZR)vˆġc’çdƒe %Cß&#CNO6&ü.Ûµŭó UPĊѰyàd[§ġü’›xœĥxîF'ÄáBñœVïhN]Ê<Ö°́”|Òŝ°ï}) ïû,ĤĠ?zkiĞ fCv­Œ ê !‰+c(Y,†²6Ç_UFĘֆĴµ1%C0¤˘h–˖dšĦşĜ´&ÊÇ (I cO½*İÚŝuèı7|v*mœ™sâyq%uöá‰î—Êhġj—=žKRW}M‡ ÎQFî5%e)ċ2pÇŭ>•Ïӊ‹Ĵ)7C |ŬÚ~a¸n))ID’¸žˆäÈ6ı|šL³ċëɨ½Ó‘RŜ;0Z@ŒD²ÌBïÓù#Ë &2*%ĉc/½f닲i •596éKŽVK 'ÛġaËdtaŠ9%#žÎY=Sbˆ,Éè(%y;lçyħì>ánŸp{ŸpżOŒŭ•´ċ…ğ… ˜Żî=NJ’‘„$CH'†Cî vm2jëÍè@„Ç0LW÷Sš2 òİI¨$#kö[šÈ¨t"·é™kú<-Óı,£Sáâ’dÄĠĵr^Fĵ°„žé4ÍÙïÊ #²´sÊ2J>ÓŬîïn—Şëĉ?O]Ä[6›ïwĜî]ƒ´Tî-1IHâ*0½—~<Ç5Éh>ŞN„çĉĞm2Ê뚆aı&ċ EJaşGÓy™;bŬċĥ]ï29_Ÿ‘Ñı¸O$Ĥ³sFĞÉȟ'=—ŒÚCr\‡6 Û­%¤2dwqÊĵƒĦ¨ĦıŝID’¸:œ‘cìsvċ2×µ²l”Oj Ĉd4ÙìŻˆİ$# µ alĝš[µ¤§ç*ğDFOĤېŒŽ~}8?‰ä(•u>éÒÂÀĵn΀ĵĞm•ĴÜ_˜‰gŝVléí™ä$!‰Wĥ²Á8äA Ÿs=Wm ßç°ċĊ¸EîĦg!Ï…² ²Î!Á–ÏX†Ç$£0ÛhpQ2*jÄĠ%˘?U²´JÉ^2’ŒŜVçŽtš’Ä›–™q8öÔ9$ƒd$½Ħßfĉ*;OċùE#PE„$^UB<ŭi`JMÙ·d$½Ħš”Ú7[ë#””$$ñşŝX›?Ĝܲ $£Ħ‘›d$½Je]-È)Cwġw|EN—üíˆ+E cŻ_>vŝ-äĝG6ù#íË5)·ÎĦûÑÉŜĉ'Ì2ïD›ĝKqÛiğ/'OÈuçZN—(׳݌j…á§÷uaÎwzµge}§W‡1­=-Èhe§W›Jáaí€lúĵ/}oUF]ÙĴġzèŜO~Öò{>svQË[%( I<]F<341|RDnüfVŒ0;ħ7vb™Ÿĝ­M8v$NN>9.g™Ÿ]ùي8hǗ•´7ÓŸ. ÷(!Kî8͚àµò\”‘/ÈĞı[9-òÒd´Ò”oKéÈĴ,Žċĝf£|ħŽNÍ%I>’xĈT´–”&2jß5šYŜ/ċÉ`ïmŽj÷`˜Ĥœ:ĴgÓ!ɆG·9N<Ӏ0 ùX2üHƒLf÷·ï0Ì1Ñ9^N@ §<•Ò¸Ĝ–¸g ,ċïY“, e j–M}şK˘BÙ3(ÇĊ¸eFĈ”7Ŝo³_Î0×`yˆ­ŜG=ħÁˉÍA‹zОüj[Rfì^dTî?ÄтUR^$VwÎÉÇ1–*ÓËmËóâxÛì¸íİ\mìk§k¤ĈJ6>†Ċ6mƒ7…³Ż}L í|Öp˜ÙíêemS–]5Y3Äé÷†ù ²­D]ĝ:żoë0lÎgˆ7öġğİŝž3?9|àPÄ ÈèèŬaù#íIîIŜ×7ŭÖĊrŝ!ìŬn|—î„혲pòĤœžÏóÉa1‚)!tğ,²+ Ìvpú0Ċ3t0 ƒ{‚ù¸Eb,'Ş> £ ENÍğ}/­ŽĴˆ"QԖGî#ê ́Ô]9vê `0 O@gċ˜E’ċçdnwx_N¤Ċ+U Öç=“œùçÎ{rgyZ)EîvEâÍ Ĝˆµ\ٛ“íŒSPtLš „8ŠX>çˆĈ?Ġ"Êáş`>݇]):ñħ³AŭıÌ?”“<šžp6F+%ëÊq; J§ĉşħ&šx3 ŞŭÜwx÷%Ĝ˜½Â: V<ġ…Ŭ(ĵúü Ħ-*Ϗğ>ÖĈaaŝŞ .ÒĴC’ġ{“*0*Ĵ?³§rÒlžî:ôÈòx†Q£0>ÌUi|Ü&siÔ_0‡¤Ä$!‰o,)RJiżßßßßßêşî?|ŭż˙ç˙ë×ġż˙ƒàwïC°›f2ŝÚÒQyî %/Ès|ĝs²@×Öî˙Te<'Â/>Şsôt|ġô7ĉ•'n”0ŭ™¸ô³ÎËIµŭ~jĊĠÖϟ3bş`~ûpág™ßOjŸšu{ùšA?pŸœ·ŬîŭżÛïŭ÷ûŭŝÓ~żżO)ĉ÷˙Ô聐Ä Khŝîûŭ>ŬŬŬŬîvğŸÍl÷çü_˙ûŬŸîŝ~Œ>†~p ”­Ÿ—vŜÎDtUâQLoO—*°ùèE4{w˙’Rúápĝŭׯ·˙ŝööö—ûûûğïŭ‚Ñ!!‰’ÑÒş¤:Îe}ß÷_ż~Ŭ‡>ğğ”ğŬî1ĈŜ›ÙŽd({Ʉ"§*:{n+ğq ñlĦħ˙)òİ2r3óÒu¤ é>ôċp8|ğğûííí—ÛÛÛûïËV²ßÖ"IHâ•Dt””RJ~8úϟ?íûŜïîîö]×}!ìÌĴC.#$c‘ÎQZZHL“x6ĠÏçkĉŠˆ†f–Šd$î~èûŝ~żß½żżż?)ä8?·*ŜRz&ġš]áĈ|‹ĉú/4ç˙"€cìB]×u™u1ĈÉBˆb“Œ†Ûĥ2jî#˙UkèN<ßïġÉ% E@^‡ëÌÌI&’ÉÌRJéRêŬŭàî}™CŞ˙|á_›œ&¢N|’x²NI).|l˙…•í1çsI’‘x‰¤4“Ï>Ÿ˙KÍÇı„*# éŠÑŬÛù#ž7˘™˙‘Mk¨‡ùÖd$!‰où{ĵö;ì ×Ä4ÏjšŬŸÄ3˙1WYÌË]O½­‰i(_‘-MRßBH\D”Î$"àt× JBOHDkl!!aċ²MI>KGh>JHâ5„„•Äüğ¤˜AEoÍ!]‹b6ÂCĉ”ĉóKK_Ïe¤á:qRâJ ZKF—VŬi IBOҚ4Âä´t=;!ÉCÒĞ"žIDXš”Ïi‰8]¸pjĜNB’Ä3 i-%­IiM@7’ÄK Xï¸À µTÜs²ÑŞÎ{’x˜ž"LjHsFâ5$ġ1û·&>èĵ'!‰çVäÒ)çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û pHYs  šœ IDATxÚì½ù³-Çq&öeUġrĥ{ï[ħ;H€‹(JäĄÇ1˙³íDX°5’,Éc“#G”HĥğœÓKUĉüPUŬĠ}Öû@ ïuF<àçv÷éŻÌ/żĤ˜bŠ)Ĥ˜bŠ)Ĥ˜â zÁ?7ĊSL1ĊSLñûÛħL1ĊS|uEnıĉÈ Ż5ĊHSL1Ċ{×9a}ĦÀBGN|)&@šbŠ)^q :@ÏÇj§ Ĥ˜bŠiŭ¸Ġ÷€Q÷}"‚ˆÇ‰fJÇ@g Ĥ˜bŠWpíĜWçĦ~÷¨c=²‡)M€4ÒSLñŠƒĝı‘²;…1ÉJ M1ĊŻŜš1:ñû­5€R Î903pzŠN&PšiŠ)Ĥ˜‚žçs"ÂjµRóùœ‹…ÊóœˆH‰‰ˆXkkŞŠëş–ġz-ÖÚۀ‘ħ)aĤK0ĊSÜŒd˘ÀEĈ, ş¸¸gggÙ|ħ0yQfZk€XDlÛşz³n7›M{}}m•Rîòò’sÂÖ%G˜ÛJ M1ĊŻCÚ Df³™Z­Vêüâ"_­VEĤ¨lÖ×ċĤİ3°£<3’/Î\~q·É‹ġZ+U‘R–™íċċ%cżxb@NEL1ÒSLñ-9•˙WJQY–Ĥ,gy–çsY™"[- -Œ"£1¤ħV¤ÈUı:³ĞŞÍLŻŻ%aI²‡ħúxŠ Ĥ˜bŠW„%í¨îó,ËTY–†Úşh×ĵX½óá[ï|òƒOÜ.ë|ŝĝzSùËĝĊÓ˙˙/Úê‹Ò`ħĢŞùÙ³g\U€FFLhM 4ÒSLñ Ñ^FŝßŭlQ*Ë2›ëÜ5fUžß}˙î'?ùŸï÷áWŞ\˙,/~ŭ³żËtĉÜ|!³ġÚE᪪:Xö1 œ&@šbŠ)^R0:”k­•RJkHQ(Yİ,{&_~Tew_˘ĉĝ"ËWË{fÏ<½ĝüçHÚj—(Š˘šÏçí³gÏïagr0M`4ÒSLñĊ)^u´ DD0&Ï˲Ȗ`wöx]Ož6ĝ 6×-ċ˘<{ĝİœŬû…ıyrm”rEQ\/‹ş( ëGÀgMµ¤oY¨éL1Ċ·`Hc„`˙ŻtF:› óÜ6­jZ‹zS-C-ï‚ï}çë‹·ïtöĈLÚ3“ËÙlV. ^ƒ’×Û ~{˜aêıœiŠ)ĤxiÙÒö‰ˆo€%Ò Ê ’kˆ™)ÂıîçwÏ/@wŜ\]Ÿ½ñžĠùëĞÎÈdË,ˊÙlĤ÷ü­c „ ˆ&@šbŠ)^n–tLò=ĝ˜™cÚN `D`„Y%îç$oÎ3,ï<„½÷ŜëĠy=ŸçyœÏçE’ÔPşíqO1ÒSLñ€ÒAf”0¤” (b pĤ÷ p˙üùŭwï\_ĵûQmfߙKs‘eÙÙl6›/—Ë €>HÇĜÒ M1Ċ/)(íúú.@Šžu"Àa(/g³™&?Léë¤î&€šiŠ)Ĥx èâÓk*0$Ċ"$ ä˙Y'h[– îŬ½‹Ù›Üİ/Ŝŝ°Òċ;9ÜŬÂèĠ|>/‹E–e™ĈŝÔ&V4ÒSLñj‚ÔÁT’RHÙy0 ’­£`AÛ8´u‹eQàâá›Ú=|˙ġâÁ{ñƒ„%³Ù,SJ)ìVÛİ=àxŠì M1Ċ߂ÙÓÎĊ?ĤëD„B ‰ B¤J vLmëÙVÎ+äŻ½ÖŜyëm ŭZ.öĴ0z>ói;cŒ9Ĥş›˜ÒHSL1ĊK̆vħ£}5šqcldG " ŝcˆ ‚ƒ˙˜ ‚ĤĊ,/pŝúwˆ_˙ĝëċkdÄJ%e9[Ìg³˘(ŠTÜpLywÔkoŠ Ĥ˜bŠo/(É1V„J;AdH{œZ'°"p0ûÏ3aY.Ï ^˙~ġ9Ÿ}'ß+Œ^•óù|6›ċ{XN£ ˆ&@šbŠ)^"P:uôĀ!A<Ċo‹xŞ-£u X@ĥĊ(Ċƒ·@o|üÎġêġµ˘‡ Íçùlħ\,ĉĊ|>72pڔĉN M1Ċ/SÂ1f”€Eǒ€ÈÓĴÖ1ê–ÑZËǂĤq¤Ĵrîż{çĉŜ‡˘\]ß3yqV–³yY–ı1fWşNM,i¤)Ĥ˜âĠ§½}@"ß%ßBá;pNZAë„,3 Xˆ¤ĥ˘„ /Ŝżöñ››ċk@İ×ĉE9[Í|-)áÒc;…íM1ÒSLñ0ĤÀÔì Y;N+u$0ûï:vç0[ î}çâêüwĜ”Ż-ќéĵXE1+ËÒh­ġˆ“òn¤)Ĥ˜b§À¤RÉ·˙š~DpDháA‰€+RÌ(@ óרzŭ{o×o}  ŻÏ —eı˜ÍçežçcĊŬI†Ż;šiŠ)ĤxıÁçÂߋb*'ŒÖ1œˆ×~ƒ Pc…‡b~ŭÚûwï}Q“-³${·(ËóÙl6ŸÏçıÖZ%–BjôoŸ§Ŭ4žb¤)Ĥ˜â%#:áçRÇï˜ş|]ɧé<y¨@B!f(k1'…ìì!m~ï­êü­rMo–Fߝ•eô¸ËŒ1Çç$µ>ĊHSL1Ċ·œŝëSvrĵÉŞ;phL‚×qk4eDÈ ’ğĊlzíó›X•çïÎÉŜ›ċÙĊlXÌf³2¤Û¸ß`§ĝ†ca>ĊS|S µká§î‹— ˆ`ˆ á˙)Eäwʊ„YĴŠœ?DġÓ7ožüꃋê곒Ŭ³Y™_×óYíœsmÛZk-c(ŸËè¸äÀħOcÏ'†4ĊS|KÀĉ "­ġXÔyĴB)@kό”"("Ñ0b4‘ÛFÊĴßÜ˙ĝŬşĵĝÎLꋙĈŞ(çċĴ,³<ÏÍs0£‰M€4ĊSĵD`´ïgvÉ!)S†ÀDPD ¤ 0ŠÈ!D3£$Èluíƒïys÷ƒ³Ìĵ9×rwVgċÌ7ËfYĥĞ–tʄ٠˜&@šbŠ)E!·ĝŜÖâïc[’ŝ7´$Ššˆ!˙/S@€\J×Ji2½ï¨ÍOŜߜ½ġQaô…Áy>_f³Y™çı!Ÿñ;¤´;$r˜˜Óï1ĤÒSLñ"˜Ó1k‚xv$‰$”u<+"2 bŠ@ ê„wFˆh+ˆ…¨%W>˙üñk›Çż^ò³'µlí|İëşnÛÖ6M!’·`Û$–öüŠ Ĥ˜bŠ—¤Ĉ_ *ğĜK ñ€d”Ĝ§!SEÓÎÎ êÚQ]o¤ĥšÖÙCĊGßY\ŭGËĉĉĞSm狛YUUu][k­03¸.†7Òï)Ĥ”ŬSLñ³§0İÀM!%gHrÀDÄ9‡şeĴ7×7ĠĈÁĠ ¨mĦLġòó'gßŭˆËówçÚ=ÈËٝù|˜ÏfEâàĤìnWGšÒv M1Ċ/ ;ŠĉŞ[µönĞ( ĦÌ´‘ÌŒşu¸\·ôôĤĊÍĈ˘i„œˆJr’1÷psç×ÖĞ·ßÍ?X(wV”³e1›ċyž›£Î';ĦĦ1ìĤ˜bŠo ŒRP’EòJşŒbA]³ˆ0fAkEûŸ×D( Ar!ÀVµµhtúüŬĠ£Í>,ŞÇ_­ìg›"żnĉóuS7MÛĥi8çğ{“v$_ŸÒv M1Ċ/Q uϖ„HyĦ]S9Ĝ›Z+j‰ż"…9"EÈ Á1ĦQ„‚œ´pTċ¸şĝôgë/>ıß\=ZÈĉ²•×mğ¨ÚĥħD$›ÍĈ£Ŭöܤ˜dPğSL€4ĊS|ËÁ Eŭ7 ¤u‚MÍÈ—˙"áç@Ŭ„YM@Ĥˆœ&†¨d’Ĥu°ÈagoĉOïüèrŭċgíÏjr}ŬÌf›Ĥñµ(ë:UŬí’wÓ†41Ĥ Ĥ˜bŠoĝĝœĈœc0 ´&dFÁe]'ë}ż}Žù%ÉQnS¨‹u-6ş¤ġòŭĊӋO>*7_|>·_>kr}Ó,•0³µÖYkÙ9ÇTRvD#À9LSL€4ĊS|ëAŠ:ĊH™ MȂm½Düż0’FrMÈQI$µ0´8ĜâÏÎ÷vyóÙ÷ÔϜssY—ċ°³MÛĥMÓXçœ à”û›awħ£c>xS|͘TvSL1Ċ1@9ĉtpÒëHtĝA+…L y§E$u!M'’"ùĤY1JIĤIr*”ı–…zù–ıĵóé{›Ċïϕ½·2|–ÍV˲(ò<ϵÖzŸĝ.F·ïü&0šÒSLñ{b6tä맀T# "™2"hMP¤[î½T\„È3Žb eÚ  C˜9BmĠΙn.>~dóù÷fĠWż]ò“˵^:·XnêĤi›Ĥá ¸‹,éPOҘM,i¤ßéƒ'Ïñ{ò{:^Ù³Xĵ¨xĊÜ]EáI!'ŜŻúsq*0ÉĞìˆĈğ!3ÒÊß,,ŜV¨Ġ,Á#Y""P8(äF[AADMÓHċ@Mv—Ÿĵ³¸ùĠ'Íß<>c׸Ċr½h›:Œ§pÖZŬrx'a·îb#żÇĊ^àDßÀyí“Ħ[,^ä"ŭ˘:Ö˙vË-ŽċUĤŬ'€°c@ĵHÁФµiCŬ/xÔñ,JâW"…wMˆB-IyĠ]IJ£¨iêĥİĠòŬĊ{ĝŬYġĠ—³ëßnŞ"Û¸ùbÓ6MÓĥ­½ıı BĊk,] Œhß3 íۑÓs>ĵràw_Ônäĥ‹úïz‘{Ŝê7ı`ŜĉĝċkÇïk˙şlíUĤC€¤pĜ9{Ûé[¤;AiE¤5Á@àüoE]Ä×JÊHĉúIß,kkE4™BíĴT­%›Ÿáúì“ןĴûé}[]ŞĞk;›mmSµmÛ:ç\Ó4‘)퓃MÀô{dH·]éÈù"ŠÛ07zÁ‹Í)JœĊ.îFàyÁHnyl§ž7ĝâ?'îħ(ô‚îo#0Ñ`:1e^ Ú;|Cëh³y’ôïW´÷íħED@5£F 2-˜˘Z+İ[ B›ß§'?z·¨?½°ût‘ɍ›ÏÖmÛ6ĥm5ÎıĜ0ĞF÷JĜÌLÀô ½ ‡ò”E†NXĝ䖐üÀèĜÂó"Ŝï*Uw¨#}Wa÷En`èŬc·ŭ9yAŻ˙ğ~Ż~߀¤NMĠí:ßS¤Bߑï=ŠÙşŝ- ê‡ä—#[ò·!uc+<0eFĦÌ@geŬTÄE‰zñöòÉĊ>*6żŭbÙüâ‘5ĉY=›ŬTu];fnšĈĥm›ÊżÇ@t*èLlé¤S€á›\Nħé #ğ|ÁñÙ,ż‹şĈ‹ÚİÓ-ıÁò^n_÷˘|ŬżÎù}Súm}€´oŜVjOÂ?"&‚AC`C&NRÌ=Cò ‰ %P„´B‘‰xĠˆ­¸rI×çŸö¤~ôƒĵyödÁŻšÂĴÛĊ²&ˆXksŽ™ù˜‹Ħg{˘oöù7ò}…NXÈӝùĦ›áÔïëÖÁäç%ϑĈ’÷Ĝǧ€úİÊ) ½Íqû[‚ʨcÀt÷uöŸ²Ħûĥ-bû˜JR[ê8‰ˆ.žiQ˘_Ĝġ”ùYIÀ¨S;PĴ%…ԝ ­PhkœePqÏ.~ĝ^Q}ġè~ûWşige ·­µmÛrUU2zOxcšêGż#@Úġ@ßf‡û"v~ǀfŸÑá)àHŽùyÀġԛQv,^§>üǎ÷”§ç\x^ÄÔLzŽûĉyĈGžcµÄSÒşt‹Ż{oNa‘˙’BޤĈà³ës D$ŝ£P"‘Rİ€,ÒÑ"ID tà  jŜèÎOù#" ZŒ"šhž)i İ+q˜ÑĤ|+rñߝU_|µ°?v&²ħtĈ‹ĤiÛĥuìÓwğ&ÌîsŸ&Í~ InıÈ}]–$'Òaìy³o[0'œÖà'Ïħàžz^·MëܐèǸ•ÈP—ç<ŝSïṲ̂‘#÷Éבäßĉŝŝ&7j˙Òt÷Ġv Âë*ŒŸ éärĦy"" GD‘(d ߎÔÏŻèŜzïN 8i6Ó$…&ЍiZħ¨aĉ%ÖgŜ{\}ñƒ˘~üdĈ_­gş`Y.ëÖÚօÔ]hšMh|Ŝ|(Miĵ˜²{ŜôΟ·÷ġZΤ`9^8Ǖw‡v ·İoQh”Îg nÄĦ|*ğï§Ñ÷%œ›¸ ċȎGRƒMžIz΍‚ìú˜˘³?·^h;<żçeĞ·a~§‚Ò>uìxżdtïí[PŜ;ÔżĜmĜÔËJğžó}işôŸͳ$ώ|‹kԄ£Çtò:òjF$w$}ŽÏ{Ŭ‘ ͲZ2G”+HĦ•"ޝĥŽl~—w~ĝnٟë²,uQ&\g­µÖD¤“”È)DÉBž2" ïO Ïk½^s]ת*I|ÀöH˘ÙlFóù\Ïf3çıʲÌh­M8^EDjô) Ž·Cúsñ˜=ı•˜³‘2gâ½ÇÌ,"6ĥŞ*·Ùl\Ó4\×uÚµOY–QY–ş,KU… ×\@ÒÉXìÁBŻ˙ĝÜvícà/AèĊá]zN;6 $"Š™˙;PJ?eYQ–ċŞP²2Ĉ,) LˆnŜâ (Eƒ$6 ÔM˘HTwéy£JhMa6ƒ´–iŬ´Òn„°X`½üàî£ûòİion–—żĵħy^ğĊ˘ħÎZk-×uŬÖu=^ŽĝóêHß0C:è[eŒĦĠjîÜı“Í‹<×:'v…8W(HĦ‰2"Ò¤H…·ËoD[íl]êùbQÏĉóúĉĉĤ†Ċ/ŬeȑÊ)‹î LD”çı^ÌçfyvffeYÀÙΆTĦµÊİS³rÉÎ;.rNX,³k Ü Ì7³ÙĴÎ˲QJµìz½v£ċİ5šÁM_…Z.—fµZċóĊ"×"…ĜĥŠ ctN¤2"2¨Î—²?îƒĜí· ÇÓ°;vlĊµÒŞĉb^mÊY£ièê*6¸š°‰<ÏĠjµ2ĞĠ*+Ë2×@N…Öáx•ʈHKo#“êĞ˘‡f̋"üܢ•&ovVYD,3[qĥ&ÖĉózS–µ6Ĥış²Ħ¨Ŭ9EĦ‹…Y.WYžgı.4£ ­MFJŠ›€ôöĥPwü‰†9RxáÖ/ĝUÇxÙĠ~dĝıŸ"!J˜Iġ@%Jă’ÖĤÈòliÀ”RwÙı™° ¤.ŭÖġ$ nħ`$á8{ĵ’Ž)Eċ]Ħ‰ZChZBÓ:QUMjĥÄĠù÷ßɚgġöĉj%_m\™UÖ-[g­#"8ç¸mÛħüP³ìĦôïP/ †D{ÒHT…šÏçfħZċ‹ĊbNm3ß<~ĥhŞÍR›|aŠ|”ÎI) Ċ1sëÚĤRuu]fĉ*żû`-–7 ŞÚĤ‘ġzÍUU1žßa÷˜ó0‘ʲL—e™­Î/fıыġW_̛Ë˅ùÊrĦ”ÉHİLéM •ÄϓëœĞQW7%Ûsvq­n Í³UUq™Œ€t/ğ#"*ŠB-‹lı:+ç‹ù²½|6ß\>[À腞͗¤u r”Iäħƒ^BÙµsŻĥU!a/,Î5bmEÍĉşnÔùµZœŬэm[Ĵ×k9PóŠŞçóyĥXfEfn}]67W Zérĥ Ì” ÊH4 ñuÌà\âq§Ÿ†=v ”ĵˆ8fn¤m+jĞë‚äĤX^Ĵiĥ\ hŬ6ÍĤŞ*Xk€(TQf6+‹ċÙÙÜ(šUżœÛĤZèùbEE1SÊD) Ó£Ñ>§1˘£Ûŭċ.˙·jµÛŻ{h''2*xÊàÊRpêNӓUs"Š€(X UÁċŠiÈ}g›‡hĞ"³!qÜRp‡ÚáNîN¸—}C"0ŠOU ‹‡‘%)ˆÑ Œ!QhŒ‚mmŬŠÒšlqO_Ŝùñ‡yóôêû‹›…lj7ËçV-DC`ÎKĊ8,\ú}út€tL‘6PÓdYĤŠ˘J¸Û.W÷>üàÇôîÙùÙÛ X1ó’EJñEM@àĦUJmœÉ./Ğú³/ó›˙V˙úŸ>ŸMÍbáòËK·‡E+<3êĤµĤ²,ġòìĴ´ë›²<;ğĝĝ_ŭé;çwï½§‰î9ĉ ç,’{–4,èSP*HĞ€ òâĉ†ôÓ'_~ñËË_ü?×J‘i—çıĠZ3îĉÎaŞJ)•e™Îó,א™X{ŝö'?ĝÎŭ7Ŝx?Óú޳íÒ1ÏX¤@:×JFğŬ°lGF4D½î9f"j°v&ğşdġĝñçżùeó‹Ÿ˙ŞÇeYş,Ë\UUñšlíà›<Ï CX³Ù;ï}ú½ŜÉóìĦ8·ĉ™ıÄ mÊ"‡Żztğßíò,êüĦ˙c"4аĥdžZyôĝóßü£ùċß˙&KY–n½^K]×€¤³,ËĉóĊ ĥYÎ.îÜŭîŝŭ{г³·Ċı3fž ¤Aš’Ŝ:^"Pú>$>nJ¸³˜'‡Ï@çpàw"ÌuK4ŻEğÖE~+LÏɨ˙Ú˙’sîÜŜùÇ.½>DÄPpÛ,IÜâŜ[ï.ïŸŻ¨AÇ냄ġĴ³#L)#’$Û'ŭïGPR>ugÈ5Ħ0ŠjËRY‹ĥÚİU³·²'÷ŝĝÓĵ½ĵ^=úğDzóyC`86aŒÓç@MwßP iïoŒQY–e|sS4u½\üèß˙ú÷˙î÷Ŝû‰QjÎmk4éûVDrÎŝĤİ>ûíÏäÏ˙÷˙M~ŝ˙nò˘´y^4Y–5€÷X<²óxnÖZE‘-..fżŭ›ż.÷îğöoŝôOĝo•1w]Ûh8§µżŸÓ§²Û12 NÀJİĉÒòßnާí˙óW˙‘ŝŝgk³Ŝä:Ğó<Ż1.äPĤğċöİCsW­çMSżġ?ùñûú?ŝ]šÍZÀR(aMI–Ş[ˆúYg´#C]â£[È“Öġ#1îñ£§_T˙ù?ŭ/ùßŝߗì¸Ê²ĵ5Ĉ´Ħv{òèJkmŒ1%šjžĵñü“wüG˙Ĥ\,ßn›&ÛjEORr4RÇĴ•eĵJ÷K?/•"&­ë/[ċúíÏŞżúO˙kŝóżĵbëê<ÏÛ,Ëâ}ÇT³Ùrµ¸úġ/ݽñĉk˙Û˙ïÎß~÷§MŬäİAŒ˘nQĈ ´ßݧÛ+I¨Ĉĝäh{ĵaWßdö9Öĝ+â8,ɲçñ‘”>ö§o’ò'$ÁŽÇ÷·Ó¨PDák ĠXêí³CR’²@ 3y>S2żŸ_m,Úĥí³v‚ahPè[Ò×°ôżÑħ8h 0„ÒY†ĜĈĦ•ÁòŒn–-Ŭżŝ4kŸ=]<ŭĊµƒX]ˆ³ĥ.u]bK(=G éĜdH""µÖTor%ĵ0óċ›êġ·~ ï÷û’ç(l‹•V(ÂV°bo ò ——<{ô,ck˙káÜßè%¸ÑZökúo”öŞĠKÒ&/ ĴŻfFäŽyĝúÇòŝG?qċ‚”³(Á(I!£HïÒŞĤ   %›MƒÇ˙ĝOX;ŝĠŒèïœ˘G֘ëXĵÇiCİRÒZ+­u›ffĜ›ğ÷ßċw>úñfʛjƒ™_0 ’mk|ZÓ9gğRK’¤xœ–NgĝüÙ>˙òêġfó³7šL/) IDATú[(şĵ&½QJé°iĜ7e˜´œšfĤıĞïÜ˙½ùŜ\_ÜżX×ZrŸAz¸t2ìN=…1Œİ€_ŝ™û”N£3üúÑ%>ûĠÓ×êÍĉï_7ú˙#Í5뚈êp^‰İÎòR5›y‘g÷ċáw>½|ó* ²- ċş£Ú:ĉ°ĝY<az‰"3a Ì'ÊĦ%ü :5- ëP[FԂÉ֝–ô–BşŒ€Fw]ŝc­ĵ·\—ƒŒçG Ŝ¨P?ĠñQ‚5İÀHô òüP6­àjŬâñU-McIÄŻî"€˜ DĈeşÈ{Ö$iz½êN)ñ, r̰µYƒs\­ûZ^=úäêÑWçígÏÚü^kçĞjÖ´MÓ4ÖZËIí4£S<'z˘†ƒàiYfLYfÙJDî^ ‰.™÷É`a ,€AĞ5žĥÀWW_àĉ7żšÙ“ğYY^8“=%ËyP‹Ñ oüx17ïADH)R,góež™;׌sR9IV"7Œıòĝ]qÜßìNÀÎèŞÁÍŸƒüìÜäÙ]Ì *ˆÈhG;¨c7ĉ.ë{""­µÊŠ,_ä„;ÇŸÁäOİDÁ%Ŭ vǙî8 =ôŠäĵÄ/܎€VċĝÍġWxúëž_}~‘­Î.LëžRĠŜ$Š°7*ZİÜ3×D•sw>sjö̸t†rwLöÛl˜˜ġ€C’_ĵ;6Ħ¨ûZšÎáp^L üĉéO~óÏóĊ“/î˳‹ĤiŸÑM³π iR£”ÊA(eyĤ•şû•ĊâY“á‹ 0˜)òÇ™‹ôôŽ’óñKbàXĜ; P|Ï: C×@ ú™YPµŒÊ2XVˆ\•F -£r<% ĴûX…Ô_``7›£‚Ò3ŞnŬUĤxpH¨§Žh!oN|zAĥu¨ĞuŬеŜÁۊÎÏKŠğ¨ œFFi~ Òi"Bż,Hi!MÈ3…’Ë@cÙşRšPžÓ³‹}7/Ú?ż>o6bgeëìŞ >wĵ^Ż%* s­p¸‰˙Ô5kŠ5¤ƒµ£¸ÙĞÖY–ë<[ğeU7Yf-ŒÉ œCùĊ ¤ ²ëK觏´kŞ%ŠbA¤ òǰoħ;u×AGށµha6ùl6SÚĴêĤ)rkĦCk*a0 úÉ /œi)چĉ7WÀĉĤ„Ögb²9Z—‰w×İğ¤­keŬDd´1eĤĠYŬ43iĴ\ĉ–nŞ7B‰zÁ3ô&‘nnŒ—& e˙kŝǁȚ Ëê†3WÏÙd+f*•rYóë„MŒID”icfаjšfÖT-žĠ-k c-L@ A%½$ŬâÉÉĥbZaÁäŝ<úP Ü3?g‡IÁ*FVŻħln¤”vĈ&[‰“h2ô÷h”P˜˘\8k›ĈÔ­CU[èĥ…óE‘L@xçDv#éç=¸*˘î5”"INĴĵñ(pN0£ħ‚Şqh­?y )´t÷!TŠıEéÁ3"QR*^g2Jéh/~îàóĜ`éŽK9H<âÜŭcsLˆ0„ }2;ž˘aú.IéIJäĠ*ŒİȔ÷¸k•żc´uÒuñzñôî}R´OŻW˙‹[‰ke>k™efÇÌĜRšS£˙c´†MN/ˆ!íġŻ î ›TFJ—`.ĊYSŠàŽf  " DÂ"Fg:7 _h[E%H•2€ÒÔ ž”è„cż `aT–jĉĴ ˜bÒuŠòÉiê) ˆEd– îe—eŽÖ˜‚Asrżá¤ôïîr>:³)ôë((* ġ ÎZ9µï>¤,Ca‡Ĝe„D 2 ImBZ¨—=ȎeNf9§şÈ +˜3P„ëĤGïÏxàŻ/`@ŞÑ ÌEQgАû1h€2ż+E ŭÊâšİ†ïy,µt‹:ġi™eżĤİ,"ÌCȑ@´Èl–ÓĠm™öİÌ-K¸˙ żèğfH‰Ö3ĉ3b şU€†}½^EŸ5égËùÚ#I¸Îäċf$Ŭ ‚àÏ9–b ”òżRtä£iYZËh,²@‰  o2” _ñ:Ŭ9‰€„(RÚ£jÚw¤%\K@Ù C á*Çíš@JÁ,Ŝd ÌÈ×{Ĝ˙÷ğ½žét dçCJí’Ú£ˆ`°/`˜"ïâàç&š`P9ÀµVÚMED3TówϟÜû“i×´³§˙µv‚†çóVĵJXnnnjçÜĜġCPŬZ˙žb 4|+mˆÁ`D$mÌCşk, ÒJE(´†ñ%#@&€Dw#ŽO³‘tËqXDD4”ÊÊà=ĦCŠ'îfġԑu$˙'2‹La–g0Fg !À@v­§żŞ°żi'ĝ'† ˘"Fy‚@)n²aMò}P$0 ˜àŠ%yŻüם4–Q5ŒŞe´N: İg` ;‹^ĵöuim&ĉAwÉùa@²ÀwÌ'Ĥâ‚ç\ôQè}"ÉûċqKsġ 6°ñŒ)N£$²ûDv*I!U…ş4(ĵ¸QhËèĞF4„ìrëĠ§•k~ôÀ× ŝ§Ú!kE–ÙqhÖĉ`/$;2:|KPšê90tżíÊ4U˘T‘–lÚb†ÀßÀ Š Òut3óünÓ{h˘eÊîzÇá°Qèİp‘ö'áJ!Šı€˘ĠV¨íŠ‚BĤ5´R$ˆ4ÁHáv;7ŝ˜I‹ˆ&›–u˙<ƒ£^(°!M$Ĉ7͐VŜ¤z•%İĦ H­PCFkµ֎E3³NĴaö=tŜ2ÒÙËhÊEPš (żŝ:“ĤH‰·`'K.P/îêÑRr÷¨ H$8oj­€Ü`Vd¸1Zµ"Ú{›Qş¸;WhQF@%fDpĦÖ@IŜçŻŭµNwˆ”Ê‘{ğ˜C5 µ‰ö¤G}×ğHHù]²–#ÀA˚SÌCRcŬìJ[ }ŜLÛ˘ S˙²C)ğ)’ƒ ‘   qvM,Ú˙‘í FÒîž2TöˆF„~£2 ˘Ù/sÜ\é„!ùû›Eq¸/9 ´‘D–ƒaŒö ġȕCÍL…Ĵ šV°nê–a„LZĵ%ùŬ¤f¸•ĝMÔ}²EzFЇŝÚvßkŞSö‘n0‰FġacU/”A—ž‹2uDè6È6Ĉž"NOĞ—×$”VtÇ}w‚íŠÊĊpfZP‚[3¤­j!€šù9./~ü^Ö^]ŬŻ˙³sûĝš³YĊ‹3žµ6L@o]¨'ö;9ì3!ĈTK:!Ñ ğö` ÛİİÑUNV”°•ìŠ*"ÄaħKĵq½eŸ–ŸnDH)°ħŒ `HòS÷ê܉wdX獝€h@¤Hb3È€½€ĤŜn6äoqàkCvû]q‡ÂĜSV™”Żk$êê´9†: ëJ{ԆjtNj:è`#£EX „”Œê7!šH2t_ê²r>Á“<¨’*a<›Pżâ d´êĝbBRP|éDŬy1³fĉHŭ9{2) M £½R PÜí§ú=ŭŠN}9#e$ ÍóżĈĈ 6CŬ:4VÄE^Dĵ”Ğ„[ĥ£2ĵ+cƒnìHMÔÒŬ1Pç~ïŻŒ;S{Wıí§/s"XE˙ä¨+ }AÜĠ‹Ä%jNö ˆ.,Ŭ/Kšĥ*úŬ›:½†ÎQŬÑSµ¤ŝH1u'â˜`­H '@SU¨*dîŝĞO¨½Y?ĝâÏ7ĠMëô]bÛZ眳ÖÊz½nNpr84{=€tl×VĈRçٕŞI‡÷t’V–Aôğ˙6A;è,áô™7û\ÓҘ‘W›"ÍeGßĴBœĥµ“ŠĞġ›eÁNĥG'(wÖĈCÍ$6çC:@ÒhêÛw#ĵŒX şÙê—0ցd<ŽHŽ#Ĥ¸öİŭïûŽċĊ‘—# éníËÒ9ivï2aû†ŠtżŒJ§ċż)Ü_ŬĊèÏ­×{—jñ09EI´ê\Ċ…₝Hú:déŸJĥçq‡Î4–Q·Bu¨[ç6"JU“½MġUµP"Juúş %)Ĵ´ÖĠ–‚#\ĵn)ž&^Ï%>§HQ/äğì\—ŝë€H’0ö2ïN‚Ïi#ĞD‘P"ÙïKQ0î;„tħĦ.½;"Ö}*=~2 Ĵˆ2Mž%YÀYÇ HğAP¨Š7çOîŭÉ3{½ĝê/ê3×/–ŽcÇŜ]b½^7IÚrÜĞ$8>? “èawÊîĜ\šîBGw_Ħn.ƒZi(Ċ’ÂráŬŒî’Ä=ĝ€zn_!PŽĠŽRqC_x‡ W/ôê6Ŭ}ÍÖ'}z6E]³"'|I^˜%ÖԞó””ÒkÍÂJ ;\×7҉<;R=ŬßMïUlHd´’¤YHú²ĦídéW&ewa$;w_‹Q˜Ħkqâ :fDĤˆ2tö¸ħÛH‡r§L&Ŭ›KE“FŠàDDÜŻ Ô-•ü“w„ìïˎ1nħ¤CÇxbŞ1,ôášyPêú`ÄïŜĊ 0$î³ŭÇħR-#UV˙’n3é ä´#]·SIäĊ.!uÙg“ôIқÍ%eè(bHò]1ŭD „¤kÁ(ž=ġŞe¤²ċ¸ Ĥ“KӍCǐĜ ÈĠHş–°ù Óç¤#ÓëµzvÉ:–Ĉz ŞZF2˜”zşÙşûk˙Ĥt*÷‘NL÷83öIKşKÚoSzfD=·ê˙–t)„ŽñHšvcbŽé8‹ŻÍôŒˆÁì™ĞD%áó lèñĵêég2ğ/uIu0 ¤M@úĝxY>4AD ċF çÌ@m™Ĝ9X›„ċëċÇŻ=}°ù‰fËóĞ´\šXÙx ÖëM Ö ‘TN6ĵÒ dŽ0“B# \_¤›µĠíRâî§oé‰÷´Ä2, Lqá–oK9&ĉ‡B²qÓúì(Mˆ\:Eh4ŝ€:PNUÙùcM^O›}é°'ĉĵş}vP&2ş¤™$>ö½›],ÇS*[˘è܌ƒÂ“ħ3[&S"!˜ SĦɒ‘˙â‚B”úÒIİ+´ĵ%ÛÍĤ}´Ĉwz„>…ğ=’ğS‘J—’ê²EáxÒż1š,AŻ@,‚Ö²lĤM"áNÄ ÛĤ…1HbÔÓ Jsŭߏ€Ôµşë„A:ħ£`1í…tG?aÜ?&,ÄÒİÙ˘’(FÏ~:CĴEëYZn!”{à•Azqpı;éÜúş7o0Ó1€‰Q Ü(Ĝ܋ [눝ˆ­[!ڐ^.°>ûŝ›™ÛÔwŬġÍêêWkSÙÙĵµ~šŸ8gŭp4żÓ86Şâ(M 鄝ú^¤ ñ줣pқIbáBaPĜYE‰C·Œ‡ËюtĜMœÊ:şúĊĴĝĉôÈêl8ŝDôπ ÈÁ…Ğixĝö!Nc`GŠqÀêvͽĦ¤Aż|Ċüޤ€ŜT{-“ÈŽÊk·éP#•Ŭö„)"^?Ĝ¸ (ҚE—R¤¨Núž›Ĥƒ‘zGRéĞ+ÒÁ2ӕYĥŻ~Ê<ÇİĠAKCïJž.'mÌÄĊ,£PbŒ:ö‚…†Ñ8/X@G1…†Ö ;vĠƒœf·rŻ„Qş0 %Q’Mš–†ÀĠ×\$­%ö5˘ô˙’Ô‹ú‰ŽLF HĠe¸k‚í2¨aX3’]÷dJ İKjJż!Iì%zî5(K…ĦFÑ$eĤÂÁ3'Ď½òNÑò\ӝ?üÀHŬŜ‘˙£Y^~î8׎—+§üdHÙl6İ(K„ûµ_S-é`ÊîĜâî á ĤÀ2 o_÷ä‘}8xŻ*Ó\¨EŒ†]JğSÄ ğҎİH€Ĉ…NÔÀŜĞÎEġ€_ÀSBÒo(ŭ 8@¤i ]€tĴ݊ŽûÌ:ŝ’ħG`×­@!wĉ{|¨Ï&ġµòT SK žbc1ˆ:²‹ġE;`‡Eg¸Ħx\HmÒ≴n’ê5†—‚$˜Tüi|G$ yP“îc_g¤Ä—4öрd( ĜcҞ-û´\zŠĴw@íx ÷=ƒtġ›´ĦBCş :İ™ …e£Ħ”(v™ĥA6Ġvğ$éU%ħ—Šî$#íšBħ5¤äâ÷D˜ƒpĦ(á dèuži…$u&Ħ›ôÏĊŝŻŽSŸŭ u#öÜ G&+JZ‘ˆƒĀk'­c°uh6•WĥÌï)}÷§kiÛ3ŝóvuġE˒;˘3Œ&Ž£LÔŽĠPÚç@óJƒÒ>Ù÷Ħ:ÌVİXà›ß\Ç0޽ÂÓÔ  ġğıdêä.ٗĥ;6‚b/XuĴN0¨}µáĠœ_0ĵÊŭÄÒA3ĝ¸o"Û}½ä„<òÁ”İôVnjğÒ÷qĜPÂ>z 2 ĥà‡ š—ilĤŬ›[Ê>¤ñħò<L|’·K^H{ŒzU!|I—c"¤Ìh ëÜwI^zĦúëÙf*@Ħ!C’,Çä}ċ˜CŬhÔX µuĜ4L½B2ÔvKjšÔkdß°SÓÒ7ÚÒc˨ñ¨2ÎÙkÁ1˜EÜĥ)iwHzġ:u\g2Á!%×K_BE‡V€–—/ñ é]uŞ} ´Ż`HGj_)(İ´Q—E`ƒ—CgÉĠ•Eeǜž4e!½_M:ġ0d4ĴiÄë,é´g0†Èj*6…‚ĥßÍ4{ħġ9m]=‘£5¤aJÏÛJu‹Rdq—ĴâΖhônĤŸËvClZ ,À4¨£Èö;Ŝi>‡ğŝkGÚKIú‘â߅ÊÉ ½)"ŭDŒMëíhF ȰÔ1T=î|v^‹qµAĥy·ÈV3î(Û5퐒ÈÀ°a8oÔÀ*2úzżIëšcCORúsϜ{ĉ)2b{éĝ‰D~Iİ%Ÿ OOiSí‡ úƒJY§ŝD)dš“qé Ô2È5Vjw X^½?ŭ>lŬĝ˙´gÖjš/YX˜K""„yJİߝڣÀ;ĊĠá•%sÓĜi˕ô“BµñĦMžż³ôĥï–NĜï@¤ßŭïQíkŽ=‰µË/˙sjj)‹Ĉñ™uÌ 8ç$°$Ù!\:Ĕv­Ż$C"ìݍ¤N€Ħ·tϒL0(eñ):A ŸnhOw×ìSĠÚSÛí•Ğ#QĜш¤ï6ODÄ4n‹ŒEéóċĜ/û&7‰=4Ħ7IHtƒEÁTĈJƒ~ħ‰•%é—D̐l,Ġċ‡ùğZƒÄ{ 4Lú‹Äà~ zä³Ó|‚vƒ´• äËİĵÂl$óÑ]†óSÛç׃3²ÀĥUeħjëï•Ü]ÚTdÈ@ [)3ŒDs4PÔñ µD)l÷paNYĜ`ŽWúyšž“a})eFƒZӀIġ 2L‘ʰnԿΈoéĜÉĵ‡ê‘gawmd Fìğ³{àâTށ„àݍà½EȗF=cÖRµ‚†…ÚŞ0‹˘]ïŬÇ=ŝħr]<ú++R1ĉ˘µşŽs5Fc÷ÍQb잏üJĠ’́dÉ1ċŬàğ,@&Şş$WÜ"LeA”$Òkˆ$ŽĠ€ÛI¨Ÿoħ–¤\Y‡c‚Ó>Ġ†žÂƒĈƒ-ƒŭ ħŽ}áx/Ġ!ħ8Ö=ìQ Ġ5 Gċí/3|Š,îhÀJ¤o}ÄĥrŞ·ÍC@żóş÷ĊŜù"‚ŝ "”^á­´vĤ·F·@Ú›2İn]÷`ı·é”vÛ}H* Ċú‘Àje.×-ލEÓ8X×Ğ*ĥ\;’/|Án‚×·†`4ÜhìxbwîĦeGZpä!ÓpÄvm`Dz¨ÒOÏA(żü+H]ƒgùÀ…u]ŸJiòġ•3d=uÒVJÂj3è IDATİ›wŸ<5-ڀY´"^a'!ċ!Ĉ·–zç•Ŭ‚Ù³¸K¸Ç&Ċ`½Ç#ô …ş‹cÀŞ~Œ(%bħĜvi¨ġߑĉĵô€´/Mçİuž$.0‡6(í(ü߆ş’_–ELpHĉĊb ‡fŠ£²û_ÔKéĜ˙cċÔ½ŽP ÜV"ĜzPáÔĴGĜÄmÁt§ŠŒÙ_oFż–ĥJ:PJ{—R·ÑanTşÔe_kIÍÎvZ!m1ï_† ’èéhü ½/#Bñ°ŸFÙ%@Î!ğĊ £E˘^ìsıÛ D5Nœ²àÇ)8NFq§ÊıDM·µ ÒN!ƒ$leP€ÚUd„)ÒÁħ;ëo"‰;nJëZ’(ñÀ!‹Ĵ3êúŠd›mġJşdœy*žIYTZ·’]”NfÒ_ƒ$kq¨“]›8•@úü^÷UĠ`Ĥ` %h˜fi6µ¤ÎÀüx|`ñċ_· ܢ,­cqÖzġ3sUUŒ(IםJÇêÒ/- ´¨JÈşrh|mC-†"8ÁK#Kò³_$í8ÔÜú".6mgu’víp“9ĝp+€îûiżœ+éûޘ9”C²ġSo mF‡Ż…żUvVÂàıN2<|ñĜĊ­ĴCv4Ĝ3ş…Ûr/c>1§¸7OëRvÒÑ8ŸCêĈşÍhPc°K.žLHˆĥI*1Ċš˘Ù.›ĤÁ{÷ù£N!Ĉ½j-J–iÔŻ6NÍQ²À͆†ÔŽFCƒµzkµŜNknħÊá"?¤!X¤èÒ§ód[Ô0°ŠҍPl¨MYCFHƒÔ€D1šĥş€ ­cJ.Üż*юTo°7£áĜùĝB*Š%To?LA@ŽĜħT;Ş['cı‘`)?z“’ıCŠf_ŭĦÚ³\ ȌĤPÓĠ”N—–Ŭ6e—ĉ£Ó˘pwUZxQC˽ÙjZCr/VQOĈñ÷ĉŠ´†EFçpqöj¨+QÂ4tċ³Á˙NžŞSv6t@!Û ßGĥÙu›K§żèĥ[äÔ{S'‚7.Ö|]8'vaŒ6a¤Y:EA˜6"ħHô1Œ œŠî Hf$a×Ç î@ʎ]ÎşuyVŽ²ï‘²Pv‰v’kíĠ‰OċĈŝ¸„…ìš›-ûOĈÉİQaòKi}m4wPÙF£,î63ÚS£K…ƒtžvÍ'Mí%ǵSî-28dNí}y(ġé•ëï‘ħ‡0n áĥbêż¤Ġ˙ǔ(Nî7̐ÎQD…–TBĉg4“ż—•eÔUíŬÊy)?zˆ‡ê§w4ûâ/İóRs‘‘RDD¤”Şëşĥ·HߝRcúVƒ”yŜ_”Në+ A#‚:hfĞ-CÚh;|òNI~Ŭ8*ħŽQ•vĤ$I^úŜ˙\ÙP$ew0îlìÚíM3r`Gm”:Qç-Ôò¨°{4‹0Ċ™GĠpĠócp­ĜèIDƒÚĜé,şsA‡0'na{­şÙ%½Ssœµ>LùQ²–&cf.ĦE‰/8À ç'}ö ²ë}ñBí YÇŜ:ÈEC‰Y1ŠĠşmè˙Pâ =F•=ŠĞ-uĦ$ŬÈàúÈV',Az‡<4Ë•k’|-%Rà]i²¤>–Úùpoz˜XšŞCçĉŬ­Òy\&* ‘!Zvïô iI}Q:·Ş˜†a1) F@ %ÓvŬ{˘hÀË(\öžŠG7Ÿş“˜:LÁc‹•óÖQëÚĊÊ 2ûàz |D³/˙Z£n´ÊVı>L¤”"T½ÙlÀŭ<ô˜ĈKwĵ‡%í3nŝւÒİ€4œ'4jŒŸı$M§‚Š*°#²ÜwğÓà9•SjG/DĜ°˙ùԒl^ò)~n (56d"’ïüˆĥhT—ĝÚ7FJEša£E„ˆJÔq²l4ġ"‘tĥ7”J“B7Ù­eß3Ĉİöĝm—Ф›‘Ġ§c E„Têĉ=È^ġîħİ}zWҐëÖvJd·}&tH·YëSĴ8znñŭŒŭiÖ Ú–Ħì‘>ġ”¨ÙeÛÜu„5’ ¨LAU’ɨ½ÉĴPşr£·Ï£!;˘tÂ_È$ÓuİSĊ%ƒG¨ŸóÔĠwÄ4ˆP°ÎCèÇÂaÖŻKƒĤóR£Ô%u<4$ġÈéi ×6ž–?ê†ô…ıíŠA„‚7¸Xu?ÇĴt×éä¤>gNAè ­àÇxĈFZ âŠeS{‡pŸ5^B/>ĵŻ_7?=7ı™ŭö/5Z[bİ=)RÑP×µmÛ£D’TŜİ ôJìh×§0@¨kŒuÔ÷öXö‹ïh‚•@G… ;p‘܃ò@ڐ'۝ÚևĈTҒ6xœİßÁ5¤yrX§͞)żÏî ·**íF×`Û ‚‚F"ûĉD‚¸;-züŭ’èï_íƒüÂĞÏ˘Ĝݏœ†g.W]u”ÁĊhsƒ„Î%şÍuwħ‰û`ş< ÌS·Ŝ´ĦŭÀ¸ĤC#Ğœ#ĤŻß ɲËh[!7LċëIšvËĠ|}=hFƒÚŬĜ=c7ñ”Ó„ iKĊ"$Ó ¤^Jƒç›’Y;˙³Ü5{û?İŻ#İdK'„$ŭGIâšü3Ç@PŠ@d‰„ħYÚÍFn"µ‚Z~p—^3´R™ùïä½gw$Yr%h÷ıG42•ĠĊ&‡#IÎp¸K{öߓËĦjÉR]şŞK¤€ŠpîÏöƒ?aöÜ#"‘`/ÎÉj2àòŬg×Ŭ;ŭé—{¨Š{{Ĉ˜Ì“ċyŜEħ´”TG†TŝéJÚnUżé›²“Ï‹ np<É%ŜZïà ÀêŒc†‚?ŜV¨ì¤wu’X!Ù°›Wkw/ÔĦ{b/“Tħ1÷óĈ5ö­sÛ&!eg3JNĜaµ•6lnzbÌ*–„b<‰ÌìcT Ġa,w™’=÷wMŝĦ§"mÄÀf÷+Ĝ_uBĠh2Á²tu,—roVv8ƒF‹Má\dŽ&ş1Ĵ;u`Q*^Ü;­8VN@‡„ >¨@ȵQ}O1Žñwq †I?L†Jbäñde'${F~C)ç’ÄqIàrŝñ÷ètÇPĥ_cı-Vnˆvr,Êş£ĥŞĝꌉğ=áĝé˙ŭßÍlşóß³™żéç­ŬÛ뺞v2]×QBke•468K×TH˙fxw$ˆ¨†8·ÑÓt ŜüséƒùnÔ>zë4%ïŬÒ°°v;'şL”1¨u} +&Ċé-ž[T;èُەf2i‰Ĵëż&ŠŒêŝïÙ~k-ÓÒS[¸ÛŬòѝP^’ËÁ6nT@Ë9e¸†³4zK>pÂÖ³[}…¸l;:Ż*ê%ïXĞòĴŻ{Bzz´wé\C Vîê9˜w#Òꑲ"V¸—H¨ħ„q5X,§#’ïôr ‰Ç­š˜“™ŞôxIƒ† rŞš“ĠU Ò#'ĠƒĈŝ!ë+žgYÉċÚâGXááü6{ƒE˙=“ħ”üŜG§aÑT NüfÂÄ`êĜĦl:jê†ÎZĥí>ìñí“Ù_ši>ûño'—?pf°żŸċYv‰ŝ‹‹˘ ĥmÓ%ŠG„Ğœ7q˙$á܃ÙE–/‰Ñ°§€ N~èÚj™°´ì‡é`ÜĴƒÜj%˘†o[S÷öÔZßHé"?$h“câK$.žwċlkGƒ;\ÜC²LK÷ùì3ÎIĥè$Yîɛ·êcâUì:ĤşħTÂÒUѐm[šħí\_% œ&:ëxéÎwMâïG\‘‘Ĵ×£6?şŠ€â1‡ÑOÑéOjèuĜ³ÂusJ4TŬÉ^”ÉŞ(Ìb˙G„şj…X) }?IÑt"ZE= $ŻŜ7ÀäĈŠG*#îD(è{ŠŠg߇ [XÏĵ€êËv=XOy{Pxı͚! ‘qΗŭƒ D™!*Kuki~Q03=zoŻ=ù_yŒ|şgŝ.?¸ĝ6(Ë'‡Ó̘<§,ËÊù|\.—-­ĥZBĞÄà’ “B7ÜĞQ,1–LÜñż ¸%ĉşo$#7ĆÌvŸ2ÛtnÇ<Ŝ`{+URXL™Â€ĉ’|Ĥ|PÏ!£ ¤EĈq—9Ċ페ˆa;çJ`…ñ0pk°÷-ᎉšÎ™˜YïŸ-Ż2Aµ#]D½ĤKĝVA­ÊnĥYöާʵyFmÛ˙~ÉĠFtyh; ÌÖ tqH1‡:şŜ2>vġàÄ́–8VFş€´´`ˆTàÄGOòZ‰"eGÀHñnqäG˘úÚ§K9Ħ$³3ĥ}2t½ÇĦ/™ÜcÔ‡ĊÏÏĊ8 Y)/´‹d#—r䨺^eÇ gâË}’·ġ’޵ÑÏċŽ‘òÏcêgó@”2dz5}^ÖürέetÇO§üèŝÌtş›ŭŬôàìËÜ0v9ȍ1YÖ7—Šù|NËċÒZkÓL%^Q1Ŭ„Êûì!‘ÜùĦM˘†ˆ`ı—‚[Ž&‰t2YO9Q0[ò‹¸7m[Ë9÷òöeÇd\F3€·~†,h"'ÉöĦ›dé&;U–uv) œˆ3·ëƒXk{ßs“LŜM£#c-Ûİi}_Ñë Ĥƒ°9ÛBí¤9œ°‘fQv@­È>³zÙ2êeÇEĠQ½´Ä™!ƒL8Póµ•QS‰”cçŸċ^YÉdIdŜ2R•N¤$ê^mĦe6)qàô`QĜÀšÀäaĊñÁÉ5pÂq‹EÔ0ˆÓ×AStĝ”ÈĦ]ïN…âp£7]ĝ‹â£ĈT,OÌ[³ÜG2À@‚óÊÂÖIà OĊ¸ç6 ú·† “t5/d>Q€ÀÉù<ˆ:VC½`ÁjİĴ[*..{qÍñŒŝú?S3Ŭ›üŬl÷ÍWóÄĉ&ËrŞŞjŞŞBÛĥĞA­WLcŭjŝƒ$ÙdöuDGD ùĜê^Bì6ġ·ŬlżĊŠ#QgsmˆaœĦWöy7nxĤcn,ÑÒZš°½_µĠ=†]”Í ŽÖö›IÛğP wOŻÈ‡à@úÍ`}[š–ËÚŝy@ëêÌ­FQqÒÖ-rħow˘ÛedlMkݨ:*ëmÛ7qÒ2ĴUñİe²èHş~İ/7£ÎŻ´gñ"Ó`!Í tŞ~…Šƒ=“çc}+Y­ĝ‡:Jğ…èµÒÁïHmq²Ç”Ìß"̑qšü+œĝœ²TÓ!*d„1#lšôuqEJ<ïÖݵOŠ7´ŒĈ]€­%2†`½0ÈÜÎŜ}ÊÊħ*iƒœ’ĤÇFëg—Üè’!,¨XZĉ8ë,ÙGÇàŭ˙ŝ§”ïLwò8Ĝ{ùÑÔ4MŽŭŭܘ,˲,+˲ÌóĵZ,ËĤi|•”Òx# ›}ğUHÉêwԖ]BĴ2ÍXċAœŝ¸ (d Y"Ş-ħSî#äÜpĦg0ÚÎġĊĝ~è:ıİp´ñ"Í!Ĵ%N„ÇĥSè_ ñ^Âmġ ²ŜîÉö1 9s܊[T]ÜdÚèNĥ¤• ” ¨)‹ŽxĵŜ̞˙ï,SUw\T-5M‡Îö;ŬٙÉX^)˙żö\¨ŻòBć…‘#PİšŞ6’}&p-ż‡k†kĊû&‹˜Ü F#`ä1[éáĦc2„yó@ċ6›ÍXĠĴġI!“P‚Ú~‘GÜb9˘%l!ü%ˆÎ+ –>DIè[sd;C?‰{z÷+4xïlbŬsäsÑlïmçZhŝĉ”z–Ħ8ĝ”ù€ê~ú-Ë‹Şz>§sĥ°Ç{DğöÁçûÓ½Énĥ˙ŭ?³xC”Ï,ïr–e†™ım[nÛÖÚŜĞ,£Ûô•$(Ŭħ‡”ŞĠ"ñĵtn :>íw"ˆ|LjÉħŭ"ÄFcµ/îH!Ž“½÷JŒĤ£÷Ĝd%m‘ĝĦyĠ1}òĴSÒ]iHfjcì´;t„$‹ äżÛ’KJ/!_ĥ–ʲ²ê¨mğ°T8ktĥĤoĉX—jȂ˙ßô—Z61‡ÌÚş;qŞĉĦd=HÒÀ*sPĜKğĠ—dœPz$­ÇC %ùĴ/}ò³¤#f#9†N:X•yûÁCĴ6˘Rc$“¨0û­‹žÖwdŭ Ħˆí$ƒ€Ħ“`>:kÜï˘(ĦçµÇ³q£ıì|…z˜r]SX΍%`Ñtܔ%Ÿ·ìÑ>µG˙áÙéÓŬ˙k?ÛŬŬŭŝïšĞWƒi6ɧ0™¤˘(–ËċÒ TeÊĴ]ħÂñ5}%˘4³”ogdĠ$µ17Q =ŭ (ö ĴP°éjÄíĝ† ß˙mt×Ú²W˙¸š”c¸sŭ jÉ÷s˜Mb!²]5yW eħ…÷żÇ†ŝ9³z:œ+Ş‹ Q,ç°,3šċ²ì¨Ş;Xá˜ĠÈ cB:ñ­î“—@{Ş ŝò²ġ\ߒ&â¸6†™0xóu¨v_ठ"˜F™Ù@Ȑx,~–xŒ6T=Żaµ#>'€‹ éÏ2)…^¸o,:€Ŝ)J )šûĈ,î$˘cDôó޵ŜsĠ[/E™Ĵż…½0Ll@ÙĈ ÏöŜÓmÔ Ĝ÷ŻĵÓ[RċÔB‘…™Wĥ"C?ż”e EĠR]×|~fħl÷İ{ô³G§§˙Ï_ä‡{;?üíNvñŬ4§ÙÀîÔ“eyn²,+‹EÓĥ­íşÎF¨ğħ'~U/˙£B,9‡I£a6½$–Ü1ú²WĴYJeşĦvŝ–™s>âŜBš{çHDÑQ#ŞLj’Ü™°à1€Ž{[⍇FŻeĞUĦ-…Òş™“h —”›DV÷+DÛġ-eĠaıì£) íŬäàĠ]N)T>Žż‰‰ÇŒbhœż%á⪀9•QÄ-mm Z/,?­÷Bu­ïÒÊÂÛNŭœHİҎS“`è /Ò­ú÷ ž'İ^Vı¨ßÜrì"…Ûzüĝ:‚‘ş~Cf^);'aÇÄÂö Ŝ?lz9¸ĞtĴ•˙ŸÈúŒ$ï(Rcĉŝwqן_fLïšBF/Ñ˘nĝòM‹= öäÙn{üżŝò0ÛŬۙüŬ.˙)1fĈìM²Ìäy–™ÉdRTUĠ–eılšĤK;—´™1+Ñx„ ˙›$­EéËy?ĥÔKÖV5IßUÄ²‡ŽÔê2L: _G„ŝ­•Ö'x7çಠcç—áĠsŽ]ˆ;x½ˆ ܔ}zÚíùĥ×WŒ‘@üñn˘RÇ/nL8˙b³ejZËeĠRYudğŝïµC”Òd.î‚nĠq/ö 1ßK’ <ıÈ˘IäŞ%xrfıß'`ց„°ŒŽXC“Q0lc µnaàü-9;e…FŞòA„aHġ„ ô ÀHü]áĦ䳄ĵŒ„^ò5t0ˆ••¨ô÷À)]ôƒœe{ïGĝ|^xÁ’f~”·ûó_żĜߝÍŝéñŝëwMYN²ŭŭI–Mò<Ï/ŞŞòb‡ĤŞ*˘è?O´^}—nŻK²ĉ3€4гbéf™u˘ĉÎyEtË8pȍĴ´•îïxY݆”žÀ•5’ˆ‚†Ú ³H™Ĝ2ɚċf $c¨I%Ċʍ‹#k™êş£²jİn:²ÖÙż@""ħ͑÷ŒÖíŞi‡¤­™sî¨Âc3쌄ö Ф`$ÀÀ/Ċ‰r­@ÒğĈyw–Žçâù‡¸frvJT0ĊWTßk£W)Pg=.8a`èÁ1*Eùó…ÙĞ̎M¨Rċi’À1š˘ï'yçom9ïÌb Gċ€˙9{K½µß{ê)x0mĠx™Ğâĉ ˜2äÈ ĝŞê¸šUgİ=Ŝ§v÷żŝñ§‡G{Ó½½Ÿ~ħkĉ3ììM³üd:›-.ó<ğʲÌcêŞŞàíˆà#4Ŝşíô;[¨óm.•H0)ŽÌ°ÖIòƒC$ı½ Ñ0FìÎKVĉ] ’Nˆlèù $ˆĤşL‹ġy½ż£XÌ·ü‘6}]8'–8NE†Œĵe:Q×ZŞêŽŠŞviÁ,\ĜĊ{ĊşR T,„/Û­„5VĝĠ9zÉ%ˆµÓYĴŒ| yP—‚`„ġ`„( –ĉ`Ä y1˘+&ÔxΌTÏ ħŽˆz…@)ŠûFÂi‚ÀŒ la]ϊz385ÄJXpäe–QóîZCÒ60Œß*=(Ô1$µ˘’Îİî„U”‹Ħ5,ä%ĈÁ´e§ÈufŬħA<[a‡ä6!îŭ]ĉ.ú§1@f ÍĞ–ĞâŠŜ45š£CZ˙éçO÷˙ûÁÎÁt˙÷?ÉÎ3†3Êv&Z“ŞŞZáƒÇ 0Ŭˆ˘w4Lğ=@Rô°†91ô)Ż $g‹ÛZ`ÓMÁ³·½ñ^œè|8N ÚHÓqÙKbŻY.¤}‹-óŬ+ż¨`êâÎö~P’è°ö„ ~ŸÚ 7K³\vTVUuG]`–İM\ eà›/w;+9›żZÊÄĈÒZoU{F¤†V£´Z8¨ÊˆœÀz0Š2x·Ĉ² mŠ ‘‡’ĊJ0’÷A+Ëâ“Ĝ?˙Ħ2s‚˜„żĈ˙£@G’P™I‚˘˙\ŭ‘Şë됣ŝ!q ÄŠ…ŒĞĤ T£À~``""3żİ;b뤪DÖöa4Œè‰'¨ÈEû!xKpmĈ3ê!ògÌXÊ@”!CVMçWÔÚCÉûÇÏí˙ĠÁäÑáîìoóןï—mó½™eScċYžgY–Y–Ġu]·ŻÔÑzW‡´jZ•v}ŻÎáù6Ë@q‹qqoNÈlo>r0P|ċtQ Şxâœ!î3E‘‰ÔhB ’ÊHƒ‘ âéİvטHċÜmsA4öĦ^ƒDĤ+žücŞë–ŞŞfi£dœhœ:ݏoyх™­6YDCš.^;(€Ñf•Q¤éTá0#„"<·×Q¤éX° UyœĤó39ŠĤœgԏ™Ĉ*LŽP‰ÊˆeżÒ"\?!+ûI÷÷llĦEŽç´›FÓ¤V€ <•ç6ğï˙À‰˘ZÏ‘EĦĉ> Ŭ€)3D˜ ŒgĈÒ˘éhqyIß-wİy|ĵót˙oŝìĝgLJ³xd^}ü‘Y\îä3ƒƒi–eçùd2ŻÊ²v}%0s7R)­Sà/ν ò·°Â“à3tžÍ½—›ñħ×Ä”hh×bYOï@)I‘‹4‘ìÉʉÀ "¤·ĜTää:#)V†nڗKKUĠƒÑ²KâĵGÎI¤Áİ~AŸ=–n.fžìJ=ˆóXFĴÙ;€QÒ3Jiş´ï&Kpâ›pï`ŠHz^ĞÁˆÏh=Mî²ĤÔmĥ8]G8Kј‚ÜxĴŻ#A`-T/ëĥÒ_P÷Ô]/¸î?ğ„÷2½ÈŻX’²G  ĊŜmìò”²ž4ŒÌ€rÓñ˘nıš_áûfIĠ#SŭùÏ?;<ĜÛyzş÷Ó?áüû½ÌLgy~8›ä“i9›ÍóQϤo=IÍk´rü$‰pYôWÂçúižCTĵżÙ!ȏbĠCD€‡e9Ô÷Ä+8ġièèÉÜg÷Żà‚ ,ôÁ´<Ż,/êš^½ş@UïQġĝç'OŭŸ‡ÓÇGğ“ż?ÌÎĜ3KŜÍvĤÓéEžçg“Éd>™Lê˘(–u]w˘Z’µ)­Ê[ş·jéր4Vì°O 5?71‚BïRñÎİF@Îäô)§Ĵċ¤j6ƒ-1;ĵS–ü˘‹ĤsŻ\£¸˜@İħċ}ÒSŻ˙›80bBÛġ*şŞZRÓXDßWę–ŜHŒ$Uz/Ǒ–Ž’ßè÷óiì˘ê}Š£9cߎ!#$`äEHÔtÁ'ITFHÀie$-ÒŬjş0{#*#KĴèù*Á#`Š`„Ħš.İŒ|i”TF.TF#…`î-ÁH:GŞ ÛäžÉnÄŝŒ’2q:ŭ’`á?ÊqĦ} Büh½ia_‘é-ƒrµO6ŭŜĝpùi)·4„>V=T‚Ĉd”B˙ħtUU|qĥIJ٣ĉädòìàoŝìègLJ³Ù˙>Î_xhó]³{ô&›îÌ&Óé›Édr•çyıX,šċr‰ċrÙ1–Ğͽ¤ÒĉÛZċ€€6w¤ŭ™‡Ħ_ëùŬ4 ?KĦbRNĵ+Ż qà–È †m^“°ŸŸp•QŻnˆ ˜H”!&²3ú‘ò¤Ĥıq*C Ž{0gè„ċÒrYµ¨ëŽÚÖµ‡MĜ½‡I }„Ÿ ƒH4żĊub-íğM˙¨Ï?û1IJAĉ}î@jè•רé‚İ€¤éR5¤Ĵ`ĵĈŒĠ€-´Žs@z–jşÄŭ'¨é8Ú)(Cô˜óki¨û *Żh“APCÚÂ9DÔ] éĵ@"@‰ŠÚqbġÔF—RG÷ÛÚnĦÚ q×Ë{Ù§u&İÁ×Î÷™,`ƒ œœLœŒ“”'{Z+pŠ]`cY˙ƒ:a2&£EĠqyuĊß/[Ó´‡ôì/>8yïpgïxúÓ/vŻż.-ìL plT×5ʲD]×mò&\għŞ2 Äğ¤Ö½ìtx?œ/Ùëò$08˜/ïĥTÑwú²:Ġ³§êÂh~4=ö`DŒ5)<™ÓÒÔÊùĥğ”ĝ™IŻÈ_okİ-•e‹şéÂL4óÇé)88‹M¨^4¸ŽQÚÚêĤ'Ħĵ`Ĵp­á84* HzFa M7 F40 ?ñàŽ-ĉŒôzċĠħZZĦĤKzFAÑ3ÂM‡´[HĜ˜óŒ$H“ĵHĴÁHT^ÒËWy˘/¤<½É·ä}š„xwٗ§}%ĈÉtğŸŽva +†Ż­Ĵ³=;çúFv7N ·è{kn·żÚĤ˙|8G‡ŝ22†)3@Vv(Ğ‚úÑ˘Şİ~üó'ÏO˙úhïŭÇ{?ŝÓGÙëOêşŜ3lfÙÑÑt2]TĊĵÌóĵ2Ĉ ,Küg“ŝ‘)VIÀߊ'^~‡ġfµL#Ò<@u]Ê;²5°šñ)N,¸äogÍùár€ó =);"íf9„ 1UuĴŠï!méĤ ËÔÜñu]/\(ˎ–Ë.˘˘”0 ‘@X˜Xğƒ‘úŬà;Zħ§6ĴÇİ·*`‚Ñ@M7bŽMCMÀè½@Kš.#ġ(EÒ1ıŜƒžĠ ­šË‹{>2‚òŻ"ëäs=…g£ìÛÍ%DqDżÄ÷"‹^ƒ1û÷NëúUΊÜq܆0é?אŒ˜rC´¨kx½DSPġätcżŝ󣞜îì={’żüĠo³ËW{™ĦŬ<ÛٙMóË|2½šL&EžçuQmכáÙ•ÖpZoÍ/żëz~Ŭ‘ÈÍÓÉD’ÈIé\ìŞ^M?ĵÒ Ĝ#NÒ×FòÌւ‘XdX”FaĠĈwġÎĴ]¤@=™ĥë¨,Û~ĥhi&FMôË>ĈŒ€ħ‰~i^Š‘¤ÔÛ\vÄ –ï²Ĝ°ÜŜáĈjş¤2"Ċ^£ĤÀoEMGş2ZFFFb.*8ùy(ñ÷b;ŻUé87Œ$•JûF’ô4ž.÷jş°g靴…ʍ]CÊyİù[x/ĵXh—C Ü!7Á™ԋG3êh^wĵ¸ĵBŬ4Tžšç˙Ӌ“'Ž÷vŸŸĵúçÇÙOŸ|œ-—ûÓéÁYžçݧÓéùt:]L§ÓŞ(ŠĤišÎ_ÓWZ×ġ_g?Ä÷H£MàHĉFkn ?ÄîŬ7ÌáBí˘‡ßáxW'ÁÁ6*ĵĜĞbi*Ysҙ£pşSú>{K¤¤tN0=ßŜ6UUGuŬ‘íħœĴN†^…€!ĈÚÄĤ™¤¤Ğ…|‹ÔNèĈç`e˲{&:I0PÁ8Ô7‰† Ĥš #’}3áû—ŬDMçùÌèž ŬğFMǁ…CÌ}ĈtŒà‡Ğ5úĠÓĥÄ*}ψ9fHpĤ8š.¨ƒ´QPPĴ· Dàĵ§< ‡öI¨ŠRÀÁş Ë°Ż”ĵÁĞ9ûÙ#6˘şb!w–áF^@ŸhċbâúJLàIĉ=ǁÌyà–¨î¸, ü´lİ,h~ò|ïùŝÁ{´óäÑŜìÇ_T–ġwfwgo2ŬٛL'oĤÓéċl6+ĞŞjŠ˘X6MÓ9ë!ò7”èĥŭü‹: , zIÇdí’ÇPê-$”#D½“Ó’-o9hʤ+#ħ5eS^ĞO“;|…½wm#‰l¸Î2ĠKKUÙÒ²ĥŭÌHUuQ+ȄĤ[Qñp_%ѸĊ*má,'ğg–Ù şċ~Qj¸07›3BRĊŞf7Ŭ€Ĥ“”bâ%¸Â›ŽWzÓ Ôt´FM7zż"mĈIQ;RuQ¤•;ĊÈ3WLo:Ç5d> 0`üâĉ ş@°îżĊJ)”eÊÇ×7K}EÛWPF³ÊqK‰Ŝ+‡7ód/Ĝ“!CÌ91:w¸—uEgŻZTeCċÉ>½wòçtúüôp:{ö${ŭÛOгŻ?ĥŬ3û‡ğ“éŜÎt6ğ¨Ê˘œN§eQMUU­SâÑ Ħ6¨ëœĥH2ێ-0ĜFi{ü&jԕW̰–_`d*ĵˆàwvÜâÍ ÔM0À/v‚‘´2Q ŒĠ¸ëŬŠC€†ˆş%SYvT”ÎŝĴ Q%ĝ²éžÑŞĊ-Ħ‰O1Ş”o"ÜĴD‡40‹ĵĜtŬ…ĤQӍzÓA˜†ß›n•šîv=£ħŞlMGi$3 =˙Ô90òÒ y š¤eġr„ˆI $ˆBÈ}ôˆŠĴÄllşxo DgKäf(öÜRt wwÑكûV“§oDq&½ApĉtLynhÊDvÚ[Y™Şċ’ĞË ŝħP×Ç(N^ŬŻÒŝƒ•Sӈ7VIAÙzo:„OƯ̈šƒ£15Ŭ*0‚#ŒôŒ¤šŒ€(œÜBM—ÌTI€müG¸! DĵÁTUëĊġÚ£n‘}˙ù£ŬŸ?Ë~ĝ§'gßü,‹ïšéÎY–M§³‹ét:ŸL&ċbħhšĤħÖZ?Dk0ıMŜÒFEĊÑOÓó JÌ2? 15Ԍڣw‚“9$~‡`d|$Yú¸ ŻŒXÌËÈXƒ&9%ŭEġ—µ%˘Ĉu,ò›†QÔ˘ŜLM7ZħĤX˜ÙŭRÓ“Üĥé!ÎÎL*ƒIG#lۛNoä˙˙ĦĤR’ M'¨] ƒäŞe)„AAÒwŠĉY„Äš ñlŠè ‰èBŜ !ê1ˆ4·´’@äk½irt‡T´U=B˙ᆘ ˜r²“œ,l[²ÚZê–5_7X‡TžŝìäéÁÑ˙qĝ'/ž˙â½É÷żúײ(~?ħôcnf/óI~6ÎvvvŠŞŞšĊbÑVUĠ&'u{£óhC:o°ÒÜ^öÍ#'ç@ÄpšĜÌîşĊ’T ³²\°#N*£ 鉰?1:™fBħ4!âàŒŒüçşŜŒ¤k7§NI‰’‚ôœQ"`ˆÈ(ÀÈùŠ€>çuˆ×KġEÀŽb ŸĞ;vƒË8:’âH.b?%Î÷Y1ŜëMWŭ'z‡—wN€Ĥé‚ğy÷pÏ&À0ôÁ+öEp„Ó8f:3@žžN2´£³-sk‰ş–š²¤WuCĊ|—.žN^<ú³?9}rúxwïgOó—żŭĴ|óùï 5y>ŬŸN&ݧ³ée]Uċl6+Š˘¨‹˘âc6CctŜ˜Òn#ŜD êöö#Í:pü ”ĝaùĞ‚F˘šXF’Q:%Ë÷D’·q·Î–™mĵŠżŝßlŸA¤òn‡Œ/ˆÓáQĉ[ ҆ŭEîi„ĦJDS½ŝ #M •ïÄôQWI$[(iç0du[‰§PïĤ£8Ò˙JMljšn•€!D0Dċ¤#9++ŝ[oF#u~ÂĜ-ÔÂŞy™Ñ:^Ċ˘Eƒ…”'áÀ ‘F7ħgĉ€A9#ĊLqş2â10ŠeÄY+éIƒ;Drf%’íFfȆ[܊¨ì%K`Óżo€éÑ.À³GŭÈ=Lï?ü^ëÀr~Cş  9s²3“WËÌċ†x’ƒ–­ĦÎ2YË@ײíZš_ĥhê%ÍûtuúâĝùÁ£żÚ˙ŭ÷˙ġ½ÙËß|8óŬç&Ÿä‡Çovvv/g³ÙĊîîîbgg§šÏçMY–­µÖ2³Ġ‘éĞ*ëRj™ˆp÷’ĵRìÛ~ŞŸÁH˘†b>ŸGħl(ŠPİ ÈıyżßdÙCH:“.`Q -¸c!n¸ŭĉ!nTHaf$Ĥ”´{LM'ŬœÒtˆ/ĜDşÉġyq's$êǨEƒXí‘,ŻÒ›n Œ¤Ħ)FÔtÂ+Ġt´ħšŒ ċMÇ#j:/AREôrĥj:ď¨é Ħ;¨éB°‹w|†ŒÜsáĞL?k”ĝSÊXa“ì|Âŝ™DüĞW„˘ #ğ}v´÷a&ëŞXŸW]ùŒżd@p|\¤…q‰6Öa½qÄOŻ7H,"Qd$@”Pž–-zÓMbd[î¸İ zŭŞEYĥtñh×<{ôŸŜ{zòôñŜî{OŽ÷~ù´|ŭğß-ĉçߘÉáÙtödĥSžO§ÓĞÉd²ĜÙÙİ—Ëe[×uç [í‡U=ÑÙ­ĉ!%‘3ÊPUQ=¤úˆĦn2‰ġS”ĠS?~r'÷è;’a,ûw=³Á‘ …r›€½²xX ZÂW2‚ùÚB‹TÙÑf v0`ĊâîJ ÌH> Tu’ÛTÉÏŠÁ=1ŻäSó\Ê,ġĥŜ&ğôŒĦ·R}.0=›‡"@½ëGeĦßc‚µ)Òöp$I´ó“‹Hï܋dïdğ%——\—%ĉû˜?y<{ïĝoŝóÉ=t|ôütïċo-.^~[;Œ|ŠŭŭI–O³élħ¨Ê²!˘Ĥm[nۖÙïUW(ñî,ûN¸"µöˆ­0!áî-HG}ħ*!›ò¸g·o¨¨â´âġÖ?Vĥ_™„nK7jI 6ˆ{ħF€ïĤ½:Vàş€Ĉ+#İFS ˆpâ€ğ7xÀ“Ĥxj;œÈ×Kğ郞3ġĤÛ$éġĤjş tCChë%iĊµ™€F ‰qXyÌâzS|¸•[vö°*‚”½˜‘ßb-ž°İH ÷}Q½‹ )b 7Ó$üRV_I š¨’,YĉG%ěß4=‚:ĜĤó×5—eĞâÈĵ8ŭ“ï<9>:ú÷/òWżŝ|úê£OĞùÙ×U]~ŸïLöfÓGġÎîb2™,ĤÓİ)Š˘İëşkۖրÒZÖUviKBÌêp"N£wĜ€X’]˘HrûsSñ=ôwÓ C˜o›k“œBGt@`19XTzó-àmÔ°~—‹Á°ê q\ò†1Ö0bé`œÍU8[èܜ["îThû†êX™-qÇL–!ò5€‘àğüw"픀Q( TlF"gHċ­RÓ§h„Ä:0’îäœHğI˘£×,)>„š.0PÔŻDïxœÑ!Ĥ™{§ˆ@ÓĊ³P`”8[Ęw˙ۄ”=>ĝΟr.áŻ) ¨%1#Dbnˆ…É4‰ħ <şœvİħt  áïÇrTµ‘ÂĈÒµO-[î,£ëED°..…e6•éѝŸ !ġ|Î?Ô5ĉóCşzr´÷âÑ_üÇç/žï?úìĵúĠ'‹Ÿ>ú¤*‹o›{9Ég—Óéäloo˙²(Ċbħ¨‹Ċ²ë.ñĈÛ”YKù–œA˙7V˜qkÉÌħ¤7ĵJñ ‘+Ĉ÷³½CŸün}$IAħ—~ƒÔU0í=Y“üމkû”w¨wd$YĞ„ħjŠK+½éĈÀHô. O*ĉŜHeŠ˙ğVü~Üĉ\8šÚ¸ñD´h˘‘p½( €Q\U˜ĠBşÊ›"ŝHğ‘t7İŒ P+šŽUžo:ŒHğ‘ôŒœ N‘ 3Ñ*0"\CHZ”HŽġT˜OÇPCµnñòáÂ*xdĉƒEĦËsb?ċWçŸÜF,ò…ùŞÒJ'{–Àµer DµÔY뙒˜-Ò ˘ ÜġZ´†ùòÍÊyIoÑó'ï=?|ô^ĵ÷ìèèßŭlçĠŻ?ž˙ôğÏË/gÓŬÙtúzggvħ··7ßßß/ʲ\.‹Ĥ,Ëĥë:;L…ŭm) ƒEž¤_Tjz€8;i-tQ˘!*ÂŜ‚‘)šéŝQT4Ĵ4fÑo‚ݳš =Y iX&ĥŭË*lù*û4oûoeÒb)ŞĠYH+#yKä)¤Ñ„ŒkG "é7:ıd> ÁÓ.LT%FHjíÁˆ“p=‚zI!ËE:NÓ@Uğ4_FHÔt²gÔ|IžF’^cH÷Œ„7ß ġ£02-7£4Ġ6ŞéX™ëFş’0‚n%×;™÷â(—ĈBÂóŽ£dCTĈċlƒ‰7ä3WWI•·£|Ÿ˙syá“(P0²¤g³ÀÔ+imHÔuLmkİmm_)‘Ĵâ)Ni#nò\İHÖ6\—KzılqyY›Çôâéż{úìàÉéÁ΋÷NŽ~ŝ~ùú³Żçß}I?9Ĝ½³ğĥ³ğwÑÔUqppP.‹jħX,‹˘ÓşŝÑÀĊakyHz½SÜÎі(.ßawĈ%PÜ$rd›•$÷ƒGƒ S>aÄOîTuOY7jeġäJ|ğ½v0§%„eĊäPŒôŒ Fğŭ(\âȈħà,ÚyòŽÇ6à d€ĴŒHğ1f”Í´6é˘/ÂC×îQo:‘gIJOçàġĤˆ7œ`o:ĴñĤK+#™·>"íÖj:Ħ’“=:èáWMSCäÚâ5 j8fèù%ҒԨk‘A\2=’E@œ,”‘Îóàë+&™*‡)(ùİt–Èv–şÎÒ²³ÔĥLë$eétËòŬ^ûœqß[Şšš~_6¸œïÓ듙ùÙÉùùӓ÷ŸL÷ŝĝOĤG_Ÿ}ùÙĠÙ_ÛÎü°żôf˙àx[.BĊT‹Ĥ,Ğe]×ĥëÔ¸uû˘†´ Im°ìz›Ŭw“!´YOFT<,²ğmëĠÄô=Ĵ’ûb ïkĔsÌŞ2bщ¨ĝ!PŜâA;ħĦib¤8ÔN÷µŭ"Ż Raˆġj“b/ÊÚĊÜXh'0OŜc„Œ˜ÛŸzt›Ž…´[T&CoşÄö6€ X¨édSi•7s°èŽuŜtcĤ&ĞÊZÔBĦá>bbH½j0r,V˘‰xvßhB´Œ÷–°ĠĠù ˆÊ;”ÚŜħà ig†Ì[‘fĝP*ŒhC½Èċ^Kt(bP:tEŠw`HĵÊ e?$]ÖĠΙŬ˘ebÛYtë%u½¸AÈĦ#ZF1tlúa[YêڂŻÎJ.;¸ş:ÄÙÉÑŜ³£żü÷OŜûÙÉáñ§ÏwŽŝġiuŝĠçĊċËoêÖĵÙÉw§“£ét:›ììì,ʲĴĞŞZEAeYR]×ĵ†ÂÛeûËĴL‘E"33nc)v/`”T8A2iǍë zï^OH’È–{£EJ-=X´Û™Ó&n4SÚ ŒS‚[9èhĊbKîeQ`–[c„E˘Ĥ#eO k‚„cAÁÈ 5÷Á|Vµ•bc„CÖÊ*o:óĤ“:8Şz%œ¨éÒĦ×TMgş"Ĥ 26Ŭ wSÓħDàDMljšNHğġ#QÓñ 5ÔJħŠbù´xğ _!L9÷–¨A3‰8–úK$áÓĈÌÄu¤S2 ”9/ÚċÖ·=ˆ`‰ŒúŠm•µ‰D8BŒyÓ!U#Ê@ğÌÄ/ÍW€Qş$"$6\ċ‰zG^e7x†Ż‹H“^ütƒp½zӉ §ê>toş´B\£Ĥ“…šú¤§!gá€3EW|™Ŭ& E›SŜŻ’iêšë6:T:-i÷ĝä}“|;'2ï˙ÁÑı߯U^Eǚ'M‰ӒÄc3ĵ83Ħ.ôCQÒùù.½:=ÌŜ?yñüéŝÑ?úŸ=*üĤzù›ó³/>ĥvù-“ÍêÜP†]0ĦkÛÎVUĠ-—Ë11ĥ); ğ8¨H„ŝ"òT=(NËzĦŒ|ZèêŬ/BĤŽ’SËYOé%•ĊVŽZĵċ^ï΢ŒvÖ;@hW‚u`ÄUJrAĈZ0òŒA“A›521ŝÍĴTŻ ×£4é+Ġtx'`DÒçvIŻ´IÒë]ÁˆV Á(=(œö“ïqGzp’œ> çd5%hG~^(<­\äÀÚ/S„—ñhß@ĵΉ“ı$½qiq ~Á 0R{ˆVY_^Ù ²ÌÌT]-ñmQқ×3zvz8}˙ôçœìœ8ĝàŜòü›|ñá?–Ż~ÛP[•íì‰mZ^N§ÓežçrˆvTĜ°EÊ ÜqˆÒ–Ĵƒüò–ğêTE´°.O÷Ĉ|˙‡*5uñ  @İ!NĠFÒ½ŭd¸R.Naoq‹Š)ħ°Ŭ-‰†+ÀH0Hšêj¸*€Qzï˜A&6Ôg>ƒn j'œÊÖċ°%’>0˜zÓáv`Ĉ‚nFÚ²0JÂġXtçĠÑmġ6#Ĵ#^F¤ŝ>QU9,œ: i!˜ ĴŒ°Ş—à–´íYü~ġ8G™ĉ€çѐÓÔ~B<ĠÒ÷PĵJ˜TF   {a$_Ó~ĝ.soƒm-—-.—ôúl‡ž=9Ì~öüÏ˙ĝh˙?>-—vú2˙Ğӎ>ùç#óí§;ÙĊ˘È8˳ ëÀhë=$Ŭ‰ °rË~hcħ,ĝğ ~lZ8δ٠h}g~v~†ĠiJġ?è‡UeiçĉPËè&ĵ•ÀŽ„$ÇnR% IDATF<¨$á(j…î‘´:òhĥ—w3˘›²ókà‡cŭ∛œġ|s¸f–…@`Š×x›#ĴHzEâÀµJAÚÔqlF ae…FĉŒV¨éˆEN•B€6#ĴJzĦšÎ÷´ĈÔt4Ú£ 1h,ÁNÒtÑħ aÔV+‰‘ÙtLJ£9é[ÄáZ YÍbL+ÌJD‰Ï>F·eŻ8HÚ1#¨û#6{mħE’ÚŭhÜûeœyß²ĥ£Ğ’İ~¸¨šárŻıZüċ"˙à€NşƒéĞßïf52XôîH,Lҗn{€$l³9xì¤IÏ˘$wî`­°?s#ŝ\b4ĉ~‡bĦ+¨J#UËÙ o =#ısġАéSiÙtÔ.[fkC'75‚“Ü·ùê”n½„ÏwˆqPáċb։sa„FxĊ;Ĝáœ,ÉQÍË<€7^ï lĜÛ"0„=,PĦ÷BM§Td˘ċœ†ÏħPÓñ¸´[UFCƒĜi@{ÓÎá5b†Ñ$İĤS&¤½é|„‰¤×›ŞéÔÏ+†ôâhƒ7_÷–ğIÊ$G’H˜Û1´”,m Ħíhâ Í$ Ħ§i˜ÚĞùıĝöƒÄ÷˘÷—lŜsÔùKN`Ŭ3Jb@c%›S!ˆĜcEó{‘: ċdò]ʳY"4‹—ôê‡ÏˆŠ/hÚ½Ħŭ)_î瓝ċ²X*ÑYNٖô;ßÊBIĞy ’¤xĉAĠH’x‹4d›úÏ,ÊéwR%éëÌÁıEzú³ÜiAş]’rĝ‘AŸÌWĠ-Ê%µm—4AS†œp 1Ï(lԝ°eƒ“ž³¤·âJ|÷ğ>¤Á݁Żkl²9kf/ŞŠ^ĠNİ&œİE?bĉÚ+Ì(Ž„ŞĦ×!î*5( GÁÂo‰“ž‘oRK; ֜iĴ’¸Ĉ›NGHh'Ŝt ’óCsWĞ餴{Teuìħbİħj¸4ĠÓ%XPÄóŽ—äô9ŝZĠ€ ğ£Ôy`i– ċL Ù$ÒqRrˆˆĊħ‘Àò£Q+zFJ *ÀHŜ˘X„ĊSa˜~îùŒ)Ÿè–ċoóO)/>ĵüédVŭâñùûŭÙÑŻşċlħh&Ü, î T7`°EŬ^ü+=€îħßk$¤AÌ ­rġëğé˘c ! b{/ëd´D˙h „8pxğ~íCş3óɃĈmıĞş£  Ĥ³!ċm¨1üàD\éôqÀɘÎàWhmqw„Ê͚„Ġĵij5 ˘ ¤vî3ĜËE5T# BM'w‚ĜñxŒ2v|DÀáMçËàxyĈ{F²2‹<ĞcÇ!Àˆġ1`ƒ/J †^YȋÏĈx„„˙'âÄO”pK5ƒŞP1ì“ĊäQÒ3ҟ/5ĝÂf P *l’Ê‚½ƒ27eF*ÜIúz*'޵ÒÂ'mbċ}‘ħġaSşVÀŬ# '*ŠL„ù$˙„dD&gä;DÙĥ]-&>˙ˆĤĠgt˜-Në/O§ż}ròä_vvfŸœ_.^žUUĠmïu×J•¸mÇËNXïpT!LÍĈ#fß5ċ½(A5P_q—”€é½Š5@jb%à 9xğ·Qš€6ĊZ˘jÙ˘h,u,öoàŠ½íċ4™)ÈĤuĵ‡—@İ=0V¨é\ŻYyĥÑ0-V‚7 n·qħ–¨eĊ¸Ċp!)~ ¤Œ5l¨Ĥ‹ğŒ˘ƒtIĜHMG˘êHäĦiìŠÁEqÌ úìŜtH  ñžQ FbSQ sËj:Ŭ3J?_Qú}ħÓYAÓĊ ] F‰› ¸žâöĴ舀òZ°ÖÎ šNÛk°g”ŞD5uYHc-“ċ;@6!Ĥ–şù—ÄÒ¤ü„Žè‡ù½ê÷§ö~vúü£ÙlöyY/xùfqµXeUWeY•mÓÔ>‚Vôĥ'jEñ 4§d”󅔌‹#‹3|gĊž”İĞkĞ#ʕf&#"˘cŞšŽÊş–ˆ²İ|Rp÷KÊħíÀ(vÓç!í ¤ÒîYŝùaÜنúĴ紌ß@Ô ‘_*ĠTîŽw¤HĠ߅´ûĈj:ÑKwà7UÓÉw˙–Òî Ôt”RXL1&q5]úù•‘Š5ñsN›€Ż#Ñ ‹KIHFO”+ÎQPĜ7UÓħžŝ Po^äĠ…†(ß!ä3"²ÜUß^ŝŽ&‹iŻŭĤ|<[üôâtçó''Ï?1ÙäûÖҏçWċOóEy(ŠËŞ,çu]WeYĥUUÙĦµŬœò­Ĵċ)ċ'NŠÊ“󐔯HġóŽTBkÁ­ûû²bŭ³.2EHĦi Ĝf3á ˘eËTV-UuKe2“ Ĉ€ì–ËWvn÷.Š…5Aû!ħ_/Ǣ°`ÂħïèÁO=£´ ÛìÑĉèŽîwZÖ&³_ÔFwƒ<#ĦĤŜtŒX‚UFʐU‘´ EôÇÎyyCñ0bĦ:ċ•Òn¨éV€‘pi`ÄĞÀˆ”€a íŽĵ 'J]1mFc³o#`[BO €ÑÀĝV‰TÔNےu`ÄÒİ0QÓQZÉÙ˘€n´ >Ä@ٌÍd‡Ĝêê3ĜËßQvġ!í/żiOf/ß;|qr|òùlgç+Fŝûв>żşœ_”UuQ×ġUUU‹²,ëşÛĤiÚĥíÓÏ× ĥR!qşĝx?4"bXDŝġ~ÉMRW 9Üû$Yöï‚~ähЎd ’VÊÎNŽˆ¨m™Ê²ċŒ,2ŜıÂl§ŠĊĜ%vÑÎÌ "„àOÂ3‰d€ıvcĦħÌa€[fĵqĝ)ƒŝÂġ*;™lzÂŞiÎpP˜ñ›ÎğİQB‘ÉX)Ô¸Á+ „üˆ€a¸ʤ×àƒ&ĵéT;(€Ĥ߉!è.δ"é•EÒk*T‡“ŞìDuœHĦ>{@Ó)ÏM$Ÿñ$K1hA(  sžxçE Áh(^ş·Şs Œ(s€ Âhψx½ƒd  Ü‹/C ‚1Lٔï™]WPwù5ÑċżÒĴü„çŻÏžžN;9~üĊŝŜîWdòïÎĉĊËËË7çËe3o—ËËşĉeY•eYÖMÓ´]×umÛÚMW”|[‹9¤,V´& šúR•­“}›~'Ï"ŸL=ĠÔÇ4ĝğ}ï2É3q) 0ĝ‡žu2-—–Š2‚µ~ĦǔYŜş…OmġügÔ·hQƒP3AxӅÍ|TÓŝA´8ö*Lc˘>¸-Ĵzq…ÜFÙĊÀ>1Je%íŜt MŜt²2‚_Â×80xoş µX#`€–ÒÊèÚ¤×WÁr{LMÉ/­ĤCT U[; ¤ŬPÜݵġs>˘Aƒ ħâsxĜ3RyÑB(a ÀH§nûcS( $5ó4 éü&6m+ÁHŠCÔú\C ·iu†MلÈL`yIĥĝžĝâ#ÊçÒ~(Ÿµß>}´óùÁÁÑ·„ìğËyñr>_ĵİëêĴëĞĤiÊŞŞÊş˙j–ËeËÌ>°ŻĞeĥ*jÈ&â€c¸i£.ÓïşmäC׌Rqàj‚ÚÓe&‘½WcUAaï*ı0ˆÖë?v`´({šŽÓĊÚk’ì– O$ê餿Á‰ÎhÏHĵ„`(.^’4Äw]úĜᆏˆeâÖwVWWœDÜŻì½CoşQ8%µĥg´ŒîÔ3ş7]Ú3RóC5ŬèçÓšŽ70`’|TM§6çGG,š’û˘{ĜIÏh7ZkEžßġù™x2D&2n²àú%uŸ>ĤCûm÷dgŝ“É—'žċ“oĉ‹êlħ(Ŝ”UuV–ċeY–óŞŞÊĤišċrÙ´mÛ2³½ACcûN bß½ÄVçjÀîá Râš#&ßĴ¤(a?&U…÷ˆ aQŠĈ̊Ĥg!Ĉ‰`ÄËEQ,İjş"„ôCĦßÚ6Ë?×ïқgçLL1‰G¤Ŭr‘àŒ8£`È!sH·ċŭ˙ 5ǝ>ŽĞ£ïQ;Ş2 ‘̚KÀHL邃;xt"Eĥ)  ,óŒ0J]ğY„ë ÜıHó oş"÷.²Xq  –èIšNTÓ F<Fœ¨éd˙/ÎB49ŝ(I. öñ ˜)ħÙTÀ0F,“!Gk=@ıXèŝñ2DÙ˜ì™ q{…öêsÂĊohŻŝĴ;ž\ž?=6ß==9úl6›}YVËççó7EY]EqY–ċ•ЈŞĤiĈç+"Yñȟ•òĥíôÊÑzl\´/ÚğÄQŞÑïĤəúİgı³ˆ;^ĉû=‰ħ¸ GÉ"ġS~{ÙZZKŞëNT$çá‡HùmTħ<ŒgáL°Â›ZMÀĦâ8û#GéX‘>Œé–‘ĥƒ}˘¨ü&Y-ˆ>–~3•6ĴŒ ÀbZĤdÎÍÔt¸&\#Òn–s=#IŻ‚N'áz,ĜĜ¤ŻH0‹ô:֕I"`@È"‘"™F:KQAì¸É_ÜUMp"öˆÏ„ê'F(MŬ,ĝùd†KŽì‚dĉz耐eSÂd‡Éu‹ŻaÏ~MÓĊGt„žµß>99üzow÷ëekż?ğXĵşĵZœ-‹ËşUUˆÚĥ] JÁ†ÇeoĞЧ­&ĈúEÇârhöÊÌCpüĈĜú#“ïb˙ŭxÄB ²ÄlŬŭ½—F’W iëŝÒÚ¸a%ħÊıi:”U‹şéJÒòà`ÇâĝN€‹´zîE`k%c‚A@ŸêßÉŬjÜÊ ċnï]Ĉ"H j^vÈÒñÍN šÒv˙îĵşoïÇHÒk›ĴNz~=éĞ= F"N,L+çŒ *#oçC; c•"] IeŽ%ğ?‡PŬħj ʉ?ñ}Y+°à(XD8ËW64–¨sĈóĦb ;‚ÔW$`„DM'A Ê]E–ġ.vQ¨ébĈߌ„Í‚tߐvˆVtb™˙1Dfâ†[s²Í9şĞÏ(ğü5֟5Ow?wşûĊáŝї–²çEóòâr~6Ÿ/.ŞŞœWUµhšĤnšĤîşµÖJ Ú¸ ]ÜĥHt—΂܈M*€í7DOHOÉĦv˜*Ŝ‘K…µŻ7Eµ¤cŠĊ%n–EÙR³ì‪¤@⌐›·£ÒàĦ> H˘°!çDflE)^ĜñŞ|v͐ˆ‹&ċâ¸áÁ‹·ÛïÏe+yôšŭ|:ŬùĤ¨šŸ..//ŠbqÑÔġeUUWu]—"êşÎG’Û5´Ü*âu†­‰ÑTîox: ]żŒÈŽD`ERšV‘j5fV Ñ{;Ÿ(.b9ôNJ#í÷–¨n:*ʖêĤDšİfĤ=ñ€ĝÖyĥFšdÀô”‰ċ°Ú%v@‚‡ˆí N­„XsNJ{”ĝ™*×ñ[?àƒCĊÁ‚Ĥç"WUĦ/‹=#DoŞXĤ¤•‘ é„ËĜ”2”d”şô­cñ+IŬÀÁw¤€A‡› zFJÈ!ì€ä1“Cmg½Û‚ß<·ÂAÂ͖‰ħ2ŸÈ‘Ú‚ġ“‘Š”bEëR4Y ÁœA?„QŞĤ fżâ6LŜĝ&ĉ¨‡‡iµ€AXžGù9{ê 2ÁL˜&{Ä&ƒ­_“½ĝˆÌĊŻé¨ûŞyzŭôôÑΗ‡ğ_´ŭŝċë³×óùüĵi–Wu]Î˲§çµÖÚ6ĦèÒ É^FüÖ)ğ´ö d•èèĦO èğ°‡j;fÉ!ƒ´šúÙ4ë Ù¨ħ%4uG ]a¤9Ŝ×ŜóÍĈu|›÷É+éz8ħdÑñ5FÔt`ía$3Ĉ‘|gí87ÈtÂÍŻş÷è$)>`Ñ·Pv@ Ì ì€de„•‘#Ĵ£dèu ĤˆFì€dÏ#j:éM‡ ÔtX£ĤK+£p£ee$"$t…Eq\GGZhu!#Ŝ`y)úÏ1É]JŽó˜7´§œ2JĊ 5¤›ş.öƒ€#`¤*$§ñ ޘŞn Lˆòi”r_~N|ŝKÚ)?ĤÓɛ×ÏĞGÇÇßdyŝ—q/ĊyY–WMӔ²Oä$ÜR´°êÏu`´Ž@ç­’ßµ3k•ÓC ê“nRiGZF)ĴÀ)Moĵ/1„=ˆl{ı˘Žêڒ˘éĈ•JÁX 8Ës\0cµğ%ĝ”İ6Z–°“¨Ĉ#$•QşÉ˘+ç =Ë$mĴÈŜĉ^‰É&×[?J,Àh›ÒnĴLzDH*0˘;¨ép;  “^EJT(I°ÖˆC¤yŻ£rƒÂ…I¸n""IyóĤ“ÖJš"TŜtzΈT¨1m Ĥ‹”p`ƒ!İ*"F6Ħ^AgVŻÈžLÙĠŻéˆż)Ÿ,˙üñîû{{_uûêüÍù›Ċ˘8_,eY.êş.—Ëċ²mÛ&݈䟴JÚ¤RZ%xĜn…Ä"e¤C[Iñ`*$ %W™hœŻÚĈÛqoó(CŻRg‡äQ³eÔ SQĥÜ,ğ@Ó@Lik0'aŬNM:ccKƒ{ǃŽ£ŻT#ıŒoŒ´H™™¤Ç$³%8eÜ67BĦ,óÚ9i[í|´JMÇ+*£Ô›Nx2D”È o: ZQv½7tíf5G%6?!eFĈƒ *tžQdš<•Ì‚˙ :Œ³á‘p½¨pa_-°ż jŝW€‘żERX/l„¤É7 Ñ ]£ĤƒwIzvIƒÊ˙݉°@i‘••‘ŠĜàŜ˘Ÿ€ ”Ïٔ˜–Ô^~Etŝ Ú-ǧ“³W/e_>:>ŝœÉ|w~Uĵš—óùü²,ËyY–‹Ĥiêċrıt‚…n€6ŭsŞn{ƒħƒß ĊjÊvġ7ó•IÓ£STIĴŠlÜ܁fûd]’wg ‘í˜êÚRYuŞ2r2×Ä`‚…ˆ7ߒŸGİšŒ•ğx½˜Ğ—\A'ùTÀ0Ì9ıÁaQĴ¸[ߘmĠNòĈ3 &†˜€G¸ŝÍ*#Zi”:ŞĤ“'éŝÄ ‡^oh”J´‰7 ~n7ŬşĜqĤ2"Òòé+#Z]E ÓŒÄj{ ùĉäÙñ›Ĵ( ÑUìz£ÔŜtRÑío:@0ÂtÉäÔÖo`Ï?¤ìòtÌ_ϟÓÏí>›NżĴ—ö‡‹ËĞ7WWuï9W8ÑBŬĥ­Ĵˆş‚oĜOZİĈÛe!2 Ÿí’³Ü+gYĞñŜ!&ɢ,v›ġ),Ÿx(tğï4¤·,Ú,QÓ0ŠŞ£vّxˤQÌJuFÎyÂ7@AŜy~ĞN¸žgd+ší,^ê8'™¨éâb"š{qÈŝv¤7Úm@V£–EïGĜôHżŒqo:am3#lèMç+£ËIzDH¨öĈPM7NÓQ2g¤½éR5´€!‚ј]Ïujş&A*d …oşDÀŬmYHϳ,Ie$üĦ­ĴVÓi"dŠ9™:ĝˆÇ½éĈzF1œW†ċşS#&“1œ+·%Fwġ5ñù/iĥĝ-N_ży˙dúĊÑÑÑ×ÄôíÙUñÓĊċĊyU–UU͛Ĥİœ”ğqEmBŬĥ2şNÔ@o²ÓsHĴ6nŝԘhÌúPÔ RJÊ:dhh T÷{"PžAߛİЎEKË zı#²Üivw{Šhù´5 ¸ü:ÛLj³ĤĜû~ÄNwdgˊ)=£ymw#ŝaµÊħÜӕ€{Ŝ•íÑ0@MxÓÑVì€ÖƒÑvĉĉŜt‰ôXψVôŒFUsŞŠJcÇċ÷µÏ†M êsˆVŞéÄóC‰­FŠġóV`¤ŬIĴC F²ú”fÍk’^71Jï>L Ï3`˜ !ŸgĜöŠÚóO çż cûUûü°üîÙ½ßííí}YTËW—Ż‹˘8+Šâ·v]·lÛĥu`Ô]Ó/ÚŒ67ĵ=Ê.í$…9XIy0̑×VÓ&k-Y™}CÂä[èiÔ%YşÏÙŝ0›ÚƒQÙ;NÓ)0RT‡kĜ[v‘ßÎĉg{ù|ŭg[鿇y@cŜt4Ŭ İKìŻEûùáĞ€ž'çÄqX9Xzjo´û£kŜt£é†jş!½ĥM—TFkÁ¨˙o׃Qúyх‹‡£n[òĤó`Í>í`ä½37Vߓ}ó+š\ŝ†Nó—ŻO>3&ûòübŝòj¸,Šâ˘(Š+Fµó“&¨ö€Ä+ÀhPz *;yAÙ;es˜f·NĈ9Œú›ĊşĠÏĈxĈ€½[{_ĦCWşjşÇ ËLUŬRUu´ìlÔPô c’ Ž0)uf¤LÂ}…În•%RO ÂFÉ:˘c6¨éx…šŽ…&0'=—q_ÛĊö€*Ċ:*{P*-ŬI ô10âDÚ= FÄbd•µCô 0Š dQڽݚŽ…´›G¤ŬLq蕅´;ר€A83¨&M!(s ‚(퀓4ր›!ċ (ĝ/ğ†´'b‚2J„ôu€6JĊ(Múb£ëĠtĴeċAĉ´IŜúÀÈÖh/?#\ü’êO–Ov‹Ÿ^œî~v°żûEŬ´żż8żxuu5?+Ërátžž@ԍŻ"^Hëv×UJÛАF,ZÖ-ç5$ŒR(Ĝ Ód˜Ÿ^yï§:ò2ĉÚıvÛe’§óÙ’aMX ÷€ÀmœÎFÀQÚÍÉÎ9‚•Q¨`¤šmîß½rĥϛċh„!NÉ ݘíÄ(•™3Úě.lËŻñĤC2gt“¤×ëĉŒxӑ˜ì••F’^µBœïC’ôŠAÏHĜm `@đÑÊrhDÀ€DÀ "$ÔµT˘”7Ŭ  ¤gœœw&£Ÿ\7†(Ÿ1²)ÙċÚ³ßP~ùKzÌß]½xÔ}}úĝè‹<Ÿ|uµ¨~ĵĵœżœÏ/Ê˘¸Şëşv şF(è6݆˜ĈeŜ7•{ġŜ‚¨#˙'"y³Ü­u‹ŝ†ˆHû>öanŝ‘™Ì@ÑşĜ÷vÈ}ì¸ĤcÊcŞşáw3#ÁSUF‚:ò/…%&C˘†mÖ°İEŒú&İĤ‹ö'QM§bkDß ĊÒ{Lv<ô†JÉ 2˘àĊÏ È•j]ğħJÚ-¨žp­:ĤÔµû5]p`ö9´ħš.šğÀHh:aĜ4î$ċBQ˘'(áϧ–mY½@†ÔhĴgDÁyĦFú’3żÎZï’6”à6Ĝà%qäwPӉ<#C€‰ĵlïCGf²ËdˆÚâ;tŻ˙…vżĉ§³³Ÿ~v2ŭüèwËßżı˜żş¸¸›Ĉ bñż€AġdjşÈSġŒ5Ŭ E‘ŠD6WÓ­é%˘€ċL“]B>£­`/>'>û:¨?ħï”ßxrüéÎÎì‹EY~qqQ,гŞ*/ĞŞ*ŞŞŞ\UÔ&n Ğè¸.ğaoH‚Ñ ·.jn>9f¤É1ġ‡˜c.³¤\×j–Ŝ|Aˆ§S[ß.9QMÏ>%2'Îï\Iqœż‹ôĵ"ˆ0ÒĜvž ˙Ĝ°ÀöĽµbŽ8˘Vf™k½DÀÀr1Î`ċY™ŬöDĴüĦcş ½€`Ä ’½1%íĉŒtÂPM‡¨†ì˜„j'8Bû|§q[5 JM@J1‰"ÄŠ^MÇ ñ 5'Ŝtħ#ÄĈˆw ^[ŽšñÈĴì ¨P%‹TLrFbTQÄÁ÷`$“^‘€QàӔY‚ée´.@Ĥ;„| Û\Pûĉ7”_ü =Â÷Ġ‹ûĊÓÇGŸ“}~~ġĊċĠ›şĉEQ\:áB#ÜĈŞĦŽVKĵ™ĈċÜ·ñ[+dĜ¨˘|7&ĊĈ„y~8şïażħäf<oÛŝĦ3 û§ ××Ċêxz ÜĞ" MJ%Ċµ*Ήڸjáí`Û71ĵqĞœu =#ùCÏĵ8q~žu˙×eA/:ŽĊı%•É´ù4àĜŜtižQZ!ĥ B”ĝ.Ĵ IDAT¸Ŝ*×nNì°>Ï!c1G¤ì€äŻPÓa´;I—†âÉ ÖIŻ"^Iğ…QĴŞŒTFŒÒv‹£f7ˆá­WsFƒr)’"›Cş‰a`$ìíV¨éħ|Ö@dDù„)Û!ßS÷ú_h6˙%=ĵyġâtçËG‡ûŸ,;ûí›×g/Żĉó³˘(.êş.˲,—Ë.´7¨†ş Ôs›VE×ġŒŜRIl´½gĵɟÄáA`ŠI Ĉ&Y¤ónÔv@×tŭVh…7ŠĉIü9ñĤĈzLÊò”e–ë(I£#ö/D€ éŻ 2Š%Ĥ%‘ĞĴÚT‰š.¤‚˜Ò=§m…8G6_…3ʁ?EëNTn„Œ(ŸĤ3bÛĦ½ü‚èìŸè ú°}ożĝîŭ'ûŸNgğ_UŭŭĊċüĠĠĠĠYQ—eUK%žX˙t7ì­SmÒ'˘ … oƒ²CÂBA~ŸŭĈà¤ŞKé›óNŜR d„âŸÁpĦñÌ÷¨²s­lé†ÑÏöDĉ$CzÈ_ jTA96ŻGêH'7lCû-uġŽŞSY‚Ñ‚ĤƒÄ$zꐃĈx•Ë2'áPbˆ7=/„ë.µudì­Ôt4;0@xÓÉèsŒÏyżˆPErŒx ûÂ@tĝÁC²Zò˜k7EI6%!w !Iz… nY"¸ŽGHÄçBÏ _=] 0RĉĴ›M2Ï(–ëƒàaÒk`ŝu˙C5‡G‡cIÔšÉ “]6Ó)ÙċíùÇdÎŝ‰Žğ/Š÷µ_>rôħ1ù—W‹×—Wó×óù\͉^Ñĝl2O´_tœ{•ê:€z;˘µ/NĠ½¸•ÉvüQ‰”ĴµĴJvċ¸5hôCğ5ÜÓÉÀ/ìĈ_gV†ŻrŠ<,œĝ`‰Ħċ°°Ż9ÖñlÛz ĵ›şŸEê¤Wà5Ŝt‰oYÀÊAÖŝ|ŝûì~uJ—n›mt~‰³œÌ’ƒo ]çM·^Mwo:áL—Ìd]ïMÇz.Lµ~i½7Ư̆ŽVzÓ —  ”:`Èĥê¨7Ŭțâşé…ŒTĉ-¤Ŭšir2Ó=ĈtF]ġŬĞ_äê×ô$˙áìŭS|vrüè“Îâë×gW?]^Í/‹â˘,‹EUU˘[Q ]ç´pŬ\Q H×Ñs7˘·Haññû?yZ”êċ!w%@ħÈ?MtÉöqôcĊ=›Ğ†ĊÔ9h}³ħ b4de¤”’tàb˘;PÈ,"îżwûVQÂ7QÓi0:hèĊCn|8l”ĝĉ]:M„k“.†AMÇÉĵ)m¨Ĥ£Ûİé˜Ò9£•j: Äq5t!ığšÎFÛRÓa›j:Òî˜ ÙŒ1; Ê ÚĊwÔ½úÚ]ü†žï-^½8Ùûä`oçÓ²nż;;?u5ŸŸ5u=/ËrîUt m˘¤ÛÄeaÓ°½­€ÑÛ$?!¤Ó+[Ŝ" Ta3’jL.Ğ beò8H)áċQĉ6F0Œ+sMVRwtÖ-şÛ‰Qµ£èsâ€û확ŜtĴd²gÄ4´§Ñ $Ş˘Ŝ·x8ŞePĜËŜû;ñĤ“Ż˘ŻġĤ£AψîĠëÁˆW€Qü}v@÷çM' qcŻġĤk“^YÒ$i7Ĥ#]•…§Ç)é`f˜g@wġñOG‡Ġ‡íûGġ·ÏO?›L²Ï/çĊï/.Ż^‹Ċ›²,ŻêŝĞrQĞ|èÖİé˜ÖĞé6݈6éŬèk;ƒħŝ~lĜĠ\҃CÉDòèèĴ—S– ¤ “T“Ŝ+"ù7^ŭ=#J2[ĵ1LÄġ>y,I’\M7FjgÌÚL–Ċ‚Ä }sÓ[ċŭ(ħ’;~Äk~żŜtkh:ZïMÖu`´Ĉ›Ž†•RşégŻ#Ú2Ċ¤½Ö›ŽRš.á×@´~“0êM7BÓù5ÒB–™ S>#ĉŬÙïˆ_ŭżt´ü´ŝ£ÇŬï|daı¸¸úájx=ï•tWˆ’$×UŬ˘…M… ·"_@R‹;NKR ÊwY­ĜÂkΙH·1¤-‡˜˘wR$9Ï=Ġ QÎׁŜ=$ĝ½mU˘ÒƒµSCÌ´ÑCC0˘TM7 F1 O¨>ŭ< èÊ[¤#Ż•Ĉ‘ĠÀżÂ›Ž6Lz}+=#­Ĥ„ĤƒôDZFctéHψ6èц=£›ÑꞑLz•Ŝt,ú¨·öĤSAIŻ-¸tg„|ÖGF´WXž}DÙÙ?Ò 5˙à”>}vrĝqkéË7g—Żçóù›ĊbqQĊÜġ‹|€^ğĤêhu²ëu`DkޤħŜˆĥ H½ f²6ކ„!@ùŝñ;"é{ÉA€ç͈v•>7H&óĵƒöq.y•lĴKŬà‡I!DqÊ9m¤;ż^t‡­<wÌ}¤6Žı2•%O4`+&8&ħRê Í\ĈS˙Ël:K´ı CL"K)oÜS…½Q*QӑĤÓĦ1È/Ş’£7—Jiw F†ŻÒâG:; ۆ¨Ù†ĝ"i$ÀÈËI²˘ •…,u•ˆ·Œá TÈĊeİĵ“$Ònmµ˜·R†‰šr †ŠŽŠ \’ûDÀJğ9ĤHĜ†É0ï2&Sêš7è^˙‚Ĥż Óìû³N'Ÿ>:ü¨jÚo^Ÿ]ŝ4Ÿ/ŝ?öŜĴW’#KûŽ™Çr—\˜I&kéaġÌ@/#j’ 0À` ›ô$@zÒïӓ½Hè§Ñtu÷ÌtuUħÈâN&ÉÜî›ovÎ<¸™Û1 ÷ˆ¸™É%ÉÀÍċ.q=<Üí³óï|ßġjµŜlÖ+_Ġ~ĥh57f–z¨p7¨Š^™Ĥ{½€´£EZ5cqŒĠÀîşßZ$Óo)ÈII1@ßÇk F{ĴzX,PZÚMH#@z0Šı=!Û<€œîÉk=ß" éˆtU£÷’Ú(• $iz+eQ”m…{%ŠÈ+xÙÉöĤ+óġ²ĉ°Ğéh@MG ½ċµ÷YeDsF ;œÇĵ÷dèUë0@H”:y\ڍ­è‡äŝ…´ûW*ċٜQĝ\(H<6ĊÏg`„|ž{dè5xÓéħ/PӑRBR˘Ñ‹j:Hz5]ß(ë³§Iƒ&şü"ħ Éħ Ŭû÷8ZŝŽÍ.Ÿ˙êáüƒ;§ÇÊĉë³óĞç×××UU­×ëuŸ]40èzȌÑĵ" @ŒŬQŻ$Xĝŝ*$I™£-ŝ^äGçĞšÄ,Ô¨Ñĥ &A%/%î_ï÷êÖ \qb" ½•ĈE]eBé£(‚żŬk<î~`şsϗĤŭñ&+Ŝ š=$Ş"H>DBƒbpáĞĵ(IwY7é~|jş1v hXÀ 7M½€á RÓyû‹WTÓa ”0*lÈ ÉİÀZj–_Ï~‹Óò}ŝĠéêëwŜûh6™||ıXsyyuĥZ­.ƒxĦiš]óEû”t7‰ˆ8Ôaá;ۆż6@ŠíRĴ¤Š0oÏô£'D5Q2r$ÛŭBÌNú~{HâsıT7¤KäË6ò)…´Iы‡ TŒŞRzí—ZèËéÄ~W/; ÈBû$kÈ÷b‰f”ı.şpĵÌkkK:ä›pŽ?O56ôÛ2Jŭ‘Ğé’ ŜQjŝFù½¸ĵ~ħ\.ϖËċWÒmêşÊ.r/AÓ½Œw>ß e]€~'Ĵ&›ğĦIJ˙ÇP% Ĥ?Do4•÷HX˘ñ‡V}ÏŬÏ !ñJ`Mz³>ÊW—R"çÁ1’8ç×I‹*½´úíŜ,ô6zĈ)‰ÌÔ`$q—-FCûğ’ĉżäkóˆ]-ƒR£Şé2×nPĉM§ï=çê󌐁‘öĤ ×KÁ•šN HA!ó ĞŒ´~DT”ġÂ;–šN25¨ž‘öĤK=™âgòÊHz0êG‡XžŠÎӋÎĞcr×î RŜt†ˆ|EĦEĜ'—ì:9ˆÑ^}<ûwxÀŸlŜ{żs˙äO­O/.OËĠ•Rҕ™KwNĠí³Ú ›-½"ùÑIFß'ÒŜ¸uLck'ÉÖà”gM4ÔIȀèİğNÄÌ$"F¤ó&ȚP4†Ó™i˙<>z÷ôQ<â=3³$Ïx‹ Q63% ÄSŝˆn ŻċÒ#(“]żĦgh ÒîüZÀ –ȸ‰äd~Ĝ\ÇĠOé߃SH ĵ„Ċގ!qĴîç£Òn­Ĥ Aޞ0ĆêÚ-Q5(íŽQŞ0Pżŭ`”š’Úî÷ÇÁ(ŠXu´ĉ$VX½ ùĥ7Ä…]´7Ħ tDZżΒ…ĠİQHOÛsFJ§D@2(`Ao:hL xk:5ÈN…Ĥǀ4Ô^|zñoñ@\ŝĉmûÑû'Şëö³óËĊÓĞëë³Íf³\Ż×ĞŞŞ*?_4ĉĵ0F‚]÷ġŒ^ğPá{¤ÜÛKñÉċŬŜÏψüh I/îáĝHSĴx˙°‹n4m İHëü5-†;£P7Ĥ´U #ħŝšÉŝ&1쁉YŒkış…¸" aŠùĈ[”•ĝE^'ŞêLïìïü×ñúşĉÈŻ÷vşw”€úÄĠ3R6CD½¸Ÿ4ÒrɝD‰—™ĤıżFDQ”™â%ĝÀˆö¨é”‚M_oƒ‘Œ´Q*í÷Ĥ ù DğzFħ·”TF¤˙\À 1v<â•WîQÓaŒÔŠ.iìûvÒk FÂé&#|È"A”Ï#EġiWej:5UIÛP3n[ċƒ·™·Ħé1D*r„yñ˙!<ïù'îŸ|°)›/Î/Żž^]-ÎÖëĠuUU݌ĈzFĝħƒÑĞR>oÔ/$ÁËNâ`½Ä&³²\ + uċ´¤ż 1ÛsĜÑrŜ딇–rXÚĈd!¤i;ĈSq˜ à:Ŭ³ħ{€Iı4ƒ`<·Umô#{^şGÈüŭ^Wù{ä{ÁQìġI˜Ù´M3áÖ͚ĥ´uMÔġÒwFâ†4ZÄ" v&AbÊ­ħFáqÓ=£¨$‰Ö"Ü ŽAܧ(“š3R‰Ĵ„•´¸kQ‰1dü‚&,'Ż5^žĥ#žÖtzġB…íž‘6>ìw$Yú„?ÄÉ~‰$PqD/3†”e-(e§Œt°5ñĤ’v; \ÀUF¤˘è%ôúŬ††˘=C*` ¨ E]1jĜ7QÓùßµ5ôñr\M—è'”š.¨ÔH”ö7aŜ3"ÉĈ)óĤ Y ”ĜŻo{ÓċIŻPƒ*ÈTÒ™Z"ÀXí|餽&wŝ˜^ŭ{ĵ;}öì7ïŭñôxŝÁĠbóĝìüòùz½V`TeNŬ‡¨é܎>QîGÇoBUôÚ{HŭÚĴdŬÛö2Ĉĝ}×0cĉ“ĥmOÚĥ™Nş>ĥ܉@½jÏN˜` )A4"fxĠež’]EŬ%NŭÉ7ŝädÁêîzıĥğMÛŭPĞ^ñh“Ämx™\*^Â&fĞ’Sşù-ÛğsMŜ0ƒ˜zq‘—Ġ( ĤlÍo;HèΊòĤûžŒRw dÄhXM7äÀÀHvêÀ°76ôš FÂġ´qpr.Şû5]żš3’„ĤKzFcˆ&s‚›+rç˙€ÙĠßÉ£ÙùÓ÷Ŝ™˙ñäxŝáċbŭĝìüêùbħ8ŻŞrµÙlŒQ3Rí“vßÄ7¨ŽŜ`@’lͧÌY6öC1‚ïÑig``ĉ_g!"[ë‘ í“°Ĝ„>Ğ-.QßÍí ċ+İĜí}t›ĵĴ L\ŝb œžC’Ì[G˔LŻzò Ú½@×vù<8—*Ê^×v€2‹7ˆB ¸\b[Úí­…’Ê(™GQ ˘D%†˘wRŭWÈŻÊP(ëŠ¸İ‡PFEİé$#B_ÂP6i5X%ĴĤhŠ)#m”šŬÌ"µé‡ïdŸP÷ğFì€"ŭ+`$‰2JEZ‘€‘Œ¨é$SÓIĤĤ“DnKÀ˜°F˜ûw3*R`$²Ŭ3Š1DĊ\ÈÎ=ŭ³ëż—_̞ŭO~pt4ûàòzġÍùĊĠóĊby^Żu]÷V@7ĴŒö)éö£b(½á€”wv‰š½Àá{zġ3'ĤYâ½=‰s1F‡•VÎhÁ™:è×I²żŜQ’ÈžÍ!íÓ$ìû>ÚúÁ-gĊٓúÀ8mQ!7¨n‘ôĤĵ˜ƒ3Ìl^ùúû6ҍ`(Ş)§4M§PMÑtŞßEE”MĴ–^ÖĊ<(C“t½Żh…ô–šN†À)M§ğf^ß,ŭЃĝÍ;ÀċURuËúXe$ŞIĵCÀ !ħg@¤\‰/ŒHŬ")[ù·|k·ÈKêı—Ĵ˘I—HÇ>$ĦN~V=u™Ċ´m;afûZŽžzW/÷NĜ…;$’éĦ$3Ċ‰9>CX‘­|$ñÎLVo‚¨,½œÄâHyQ:$;Ĝ3˘ž ÒtHĵé²1šŜĉ‡vôŒBe¤šö£†°ÒŞY*HÒ3ÚFZM— T!Ӄe=£žîLh:ˆÏğߒvS–ôJH{F‹µ2‰F¤Ŭ²•OAĦwç1ŞWM0SP1…¸µçÀôêï‹é³gï=š˙áx>ŭàòzġġċċġĊjµ jşÊ1x=TM÷²’nù1ƒk­Ò&GÌëĦÈħÓւúz~á‰˙0;Ŝ„ÁÙ­?è÷ċ~uĤÑ;ôƒ–:9­)Ì T87™CİĤDuSUÖ‡seWĠhzÌ|ğݽ ۘĜ¸í'ŸH˜Ù0óDDšìĊß #J‰ =£¨š‰€Ò”d“›&Êù‚#{ Á~A¤a(tÉa菟;µž“hùܟLIX· Œ2šnDÀ@ê9ôÒ~e4]âMÚX#e‘À4@Óim”JYe”Ğé0FÀĥE:.0PžôŞÏE?]Ô_ DƒI݁áËz0JeXĦ…ħQj1ë.ßÇäòïîäÉóß<š˙áĝhú§ËëNÀ°^ŻWĞĠUHxġ`Ԏˆ^·€á£× HI<4´x,"h[•ôrcDú2–§yħĈÌ~t§Óu‘÷ĴCt錳˜Ên¨~àې ĥŽÒ}78Û{م'‰ëîöxBèĉ{XÔpù~Lhd‡ÊÈ@†n&LÙë³ÓäuŒUOۇJ)ÜDR.ÈâŭP½r`€vÈÔtşùŬQN¤@·'täVt§ìĜ§\cĥ`ßÏIŬ †Ĝ~ˆšN”€aŒb+_ĈJd|èuHÀ0ŞĤ£- WÓI ‚N ¤ĵét¸^˘˘&uœ¤şûʈ”€AƒĤ‡T%öŒb佤`޳~(³ ïŸ"Vlıš.Ù#ĝĊˆŒŠDjr—‚½ĝ[<*}ñŜ;³?žÍ>¸\Ĵż>ż¸zX..޲\)šĊ¸ ÍCġ^ŒŜˆÇkKŒíŻi$ŝ),Üè|ÍœúE‘vê2H4vÈ1³ÛéôĠÂqüHÂkß15ŝ{ıS%‰¸˘{HfÇ.EÉä€äï`òó‚ss÷áhAE֋ƒ—PBә˜Ü Ŭ óğLJ‹5ês­:xó nŠ@썤'e2h£ĥ+^k ĴùÒqi7†¤ŬwùjĊ E‹-s~‰Òĵ—Ĵ‡I|BÁĉք”xp<\ï i·ôn„H3Ĵŭ·öäÑ@˘kFŻİ‚âĈj:äŽ7’vkNa—´Òî˜eäŒùœÑ@ÒkŞG•vÇͧwíîL†lšÌ8jŻŝ sö[ĵMŸż÷Îѧ'G^.V_{5ŬċĤ‹¨Te4”ctíRÔÚ/’Ÿ ÑÀİ2'Á€ŭH1:ġœ ÊĞĦ½b‚è4#$Âqˆ×Ëç8 ‘W¨q0Ċòk}àözï{_YD;J‡RŸœ’’w÷ÎßqİŞö” ßî€Ñ“Ǥ˜ˆú_@¨IDÌS~¤=íPîU1nXt‹¨'cЇ˘İ –€§‹Ğ˘éE˜4!ĈO˜d‚ÑÓv7Ül‰| ÌáôsŞÑ(fú ĜIFTîúùĥÔ|IĠ¨‚(ĥÀHK¸%Ħé(0P’OÔ"íUÓ% ŝ€´;0(ħ’p¤qçÊf"QÓÉHÒĞì}œ2´Uċ䖀!UÓITӑ–˜DܧnÎdA“SêòŒèìï€~ïÑüÓӓOЧ—‹‹ġz}]UeïĜ­âÙġ IDAT#ĝ%„ /#`À›B/HÛ/<™~ßvgHdË{Dyş üÎ Xğ‹ĵ‰3TÉî>N´ÜÌğ~Ş_ˆëĴݽ8£ğl †I‹8y‹!6Yô„ÙÑϤœ²³<pÇ”¤œ.ò˘+ˆ¤S¤“ Qé@)DSyO6ƒ˜–‡óQßšuÇmEd|İgĴ”:u$ázzzĥwjP ˘2ş$ĠĵÎûÒÊ$dÒPU/û·CĴŒ‚˜£ Ê9Z9xÓÑ@Ò+QÏÙiƒ’qĈp=ÉĉŒhĴ2 =ĥ~²[ |şy+¸퀆†^u„DĤĤË W{CÔVPhˆFĵîċàyÒФSı5jœzĤ À#ƒ=£p™TÌEˆ¨]| œŭ àóċoŜ6uçèƒĞĠĉëËĞëgëuj” vİé†üè†ÀˆqxnÑ J7ú9›Ì2‡³R85.¤——GÔżo=&îùEıÁŝT]âÓPߓŜz§ğGüßÌ]ámtTƒÁsû>f°s`vA×Kêwä4ˆöWHr‘@Ŭñu@(҂[ßhçÀıqlŞwZ@bqž)óô‡ Î*Ĥ[Í9Grxf¸ù& `f“S *óĈ¤Ŭ‚–¤÷-–\À@JM‡TM7ßWħ(îÎL˘ŻùN5j)ÛQo!½ûcÈ$mJM·MÓ!3JÍi: ·Âvž†+bô.ej:ŒIğğ MÎʌí(Š,B"ùŜĴ2˘P£ŒĤ û‚VÄGo:BI’Òl’$+5R>nǎGT%˘tb;b$!cÑ h—_@^ü ŜrŸ–ï=ÄGïżż.Ğ/.ŻÏÖëĠ‹LÚŬ rû`1HĊ}£7úñR” ed¨ğÂN;¤ŠêžçMíáÇ)ş™˘ZQA[Ğ1†Œ14™LĴ1†Ĵµ–ˆ YEY ĠÊt6›Í­ħsc‹)M„Ħ݁ Ĥšâ|#4òÖŭÌAˆ  ŬlÀu b& "3³ĥ8šÍfGÌÌ"R¨!YöıcCħî#܆ˆŠÙlv\öˆĴ™¨`猴5ZXW8Ú,˜§÷5è'ïİcġ0 AÈĝÑ@ÖôìœŞû=ğġĴ­ô=Ż”(Cğ1‡59\(cÒnŠ•Ñ–j0G/³^LFI]­-³Hĝüµ‘bYí']%­dۑlÒ 4àÀиz‡–vWF{{F‰9úĥQjÌ44]t8Êlq\'‰’,Q H­ĤPDĤ=£{i;B‚Òr×.HuüAÚĠt²Ġ3ġĤ‹Yb"Ê5(€‘-€Éd ´ë݉Ïŝ÷ۏŞß<äßü§MUqvqŭlµ\]×ëF•²â€ÑĦÁz8@Ä@ĝPvƒ{ûŝ†ñÉİœb{”}4i*Ë €ğŝ„ĥCĞ SÛét:ÍfEQS"*Œ1VD&6cĉHÄÌÓétzg>Ÿß7îäžħöXÊu!‹K›ÂĴj u0e­1_'x ה‹KĜĥDA2ħÖOfÓğÇÀ²§§§'DÔĝEšĠßZ  îI@ÉÓs…µöh6›5³öž˜ië)VW°U…Iu ë´Bà\ĥK‰Ú d °`c °`"Y FĞJ>Ž4ĵo”j§IÉ3ˆÒġèàùHM! sÒJêњ20èÊH$Ù@Ğ06ô9ŜÚ÷!DĈmŸDRë!਴]z5Ŭ”UF}❠WF*É•Übï-~^Ñt‘ŝâ>.U’ŸésŽro:!Ò)Ĵ˘Ášj0ÖkŝŸôĵE+ˆŜâĦĤĈ–Qê¸7‘n-„(OÓÁXB1*Ĥh7Oɽĝ[Ü­?h˙É[î³Goż_7ígç‹g×׋óÍf³Ŝt•sÙ£˘ÛĠ?’uc÷áO˘´ä )ƒ*ŠD Rô&óġ1IZ'¨Ŝĥí‘WÑıÑ{0Âl6££££É;wĤGGGGóùüt2™YkçĈ˜9ME¤U†è$L³Ù=˘Óûv2ıÏĞċÏ`xŠÉşñ=$ޤ¤H’Ó 8M0)Ż1i6˜&v2ı7=;1ÓÙü”™+"jB…DDœ‰ĥΧE„ ˜ÖŜ-oO ŜB]Îpŭ“zŠ£ġ VÄSv!4ˆÔD~0P&Y0`X8;3S8švŠASL"ÎQg$‰´]ö÷P2†Ĝ˜ÄÇt„Û‹*-ƒòÜûAyñ€š.Ÿi‘P‡Ĥ U£káĜ4i‰ûÀ~46ĵTѓÏÉ@„D*íÖFÊ ’›ƒêgé§BiŒ”ô#ö’´1+‘’JëM€D×n‘dĵ+fĈ‹v“ï6ıD\ÀH†NäéˆÙ>ž˘7ï Z{:@M× Ü³ÊȳĈüœ‡‰pH{µSpsI|ŝ8-˙ÔüĊŭúËwœĵß´îÓó‹ĊÓĞëĊ™ŒTÒëXhŸ˜áĤCŻ?9şî iÜ(4ñ nqV‡ċ°‘% ¤Ä,Ĝl6§ÎıÀjä ™ÍföäädrïŜ½ù;wî½5NZkß*ŠâÑÌ/äV)ŬÂb_ˆÈÜX{,“âd2ÍâH^|ƒ‰8ŞZ€…ô‚ŒL -"h€mA³v´ĉhŠù;ĊDh*rŸEÖ"rÉ,ŭwz*c…D  ,€‚ˆŽIĝP]›‹o鸝eIÄ┭JuD1pdÀf‚–&hŬµ9BkÚi·‘°èN[?§#P‡™Óc;2_R˙Ğ{Uîz]ŒŜ³_ÀYĊhEWŻĤCĤĤÛîĠlb ™jyÒĞVÓ%Ż!ñ͂şÜ·ršN3¸İ´;y{}/ĠN“c0o¨=Gë?á—wÊ'œ~äX<ż\ž-;oşeUU›ĥmkż~ñÀp¸7ŬĦ‰?İÇ!”Ŭ{´rî§B½'\ëw{nÛġĤŸ˙úäŜŭßü³˙êżŭ/îĵŭîğŜûÍ, ĦóĊN]óHXİĠĜ@ÄÂĜ 8ĥ½²*ÚÜÓ·˘ @\Ó6w­Ħ#‚ùKн"A×oHTSıYCĥ,H0eR–'Ŭ1[!;;ÀqÜFĦşi•bĞvÏ}Žçg |ġÍ6ĉ5ßä­íbÙ£÷ÇJ}Eğĝkò=2Ê*&2ŬN€¸ĥWvSˆ~ÙNßÔ ™oß%gĠ† Ï=ú”6ġŻ UœÓhŭ÷VDé Ż‡z…:•cÂÛí˜3"¤C݈Ĉ²u7Ċ˜|ÁÔIŻÉ š'ê/·Àż^}³X._ĴVĞ‹ġz½ĴŞŞlÛĥQfİ70ìŞŠĝ zĊ ‡’Bß0ê½2U‡°Ż‚ÀÑ-ABÁĠħsĤ0† 1NÑ[ZsÜż1³ÙÌͧÓéŭétú‹ößüË˙ŝŻŝ·˙ßüzşĴÑ:ŽÜ­…"L Ħ€À‚` y{˜ƒdƒĥw‰œâ.[<‡¸Wl™(RÍg$ ’IĜ Ž4Ŭ `BÀÛ Ú.” rİĞĞäÙñĦYîb;œ™XBÙÌpö_˙kŭġ˙…ĥ]˘ œ™’0§ jÇsyñĝV¤IP€{çößQï˘ŜÙ4‰éÓ"z>zR´C,HÒ÷Ê­è&˘ej]×[hȀŽ0°pè!Qà,IUGqÎTWŞa×KâHğĊIž—eŠZ7ŠR8Hœà‰ˆA‰+hŜúšŠ¨1d`íeŻ”Q†…½"&E}^/TşÑ‚>èPÔôvòJµİ9JĠ'µ5R˘ ;¤”Ĥë1z,v<ê¨p‰.=‹,0™ĴAğütŝ÷xKXŭĊ[ĝàîÉìƒĊŞz|uu}^Ż/ÖëġŞ,ËŞišÛŬ‡ÄIìRÒñ úE?‹ ‰öTJñ}DÔ}ĈT.( ›~M鞃™x³ìBà:ı­ßQoÙÒlOQv6›Íf³ğ“ÉäÑŻ˙Ç˙ù_~Q =Ù¸ÎIÇù•]ŽĞ|ş^> օ†`!œü÷†~“%’Gé7uy}İßNwHŒèípÂ}I)Ö²Eġ{`@ A <-×ŭż•ßÖh¨ ¨-°iކ˘vİŻĦLt]uEĥğWë–` pJ‹İÁĴZI×Oš1'Ê*<¤Ap´c·–n:Ò¨ĥrŜ•säÒÍk+î(^Ĥ¸€¨‰“4Ħt‰DŭGŬ›JbċÒ@QhƒùU¤,ħĠ{áBĉ6Ċĵî0&C]£tNœĈ2/x’(ë¤ZuÁİş2ŝ!ħ²'eŬżŭMÙ[K@Ù>WUĈ6ŻŽéíâú+Šû˘DK‘-›‰£ı–´‰ÎĠËQžú<#ċÙAJÀ yΔ(პ'P†Fä-ƒûöŞé¨ĊLŒÀmžœŭÜm>İŝâ!ôîñŸÖ›ĉñÙĊġÙz½şZw–@/`hÀfŒ²;”ĤûوnR!íJ;Ġ*$ÒÊX‰Ĥ&½ÚİïCĥ qµî¤žŭ‚EL´5Ÿ³Ec¨(Šb2™ÌĴµwĤ'wŜċ_ĵw˙ÛuÛ÷}Z×5zÙB²!L &˜°ÒeAaë: ²–`XFdż]ü¤?CbYD”˜t Ğ“@„­à¤C"~$­lë×ቘîë&Á„€ÖS&LÁÚ+Çp z.Rjµħl8˜8C ½b‚'Üà”+²\ 3-H²€n˘1QƒŒÊ§İŽïì—Ĝ/ aXşWFŞĠÙï f”›´â\ÈPâ%d@ÔÛ2¨¨ĝġèL„ÀVÒ`ÈeÉż½"°Ÿki>žV™$›²£a÷ËÄîROÓQÒê<š3Á½ ”ow›D3‘ŻTú˘n:QÚQ‹”N[ŸıŜŞÚhÄ ;‰1!*JÊ1׿Nïı~½Wpż˘XrĈ×7`”JħÛ#—è C6ž2d@ĊT¨˜ÁĠäÎŝ#NŞÛż¸ß|ö譓ÊĤ}|vıxħX,.˲\–eYŞÁכöŠnÁè@@²·Á€ÚƒrÂÍëgOúÜô¤ ¸Ş‰]StğóŽ›#ghKq26çBÖÚÂKğçïŝêъY6-ŽˆÀĞôl9ùq·9ĥX&Ĥ£ì ożÚŝ˘ _sÙ5˘İħ­%ZGĴ$Yœğd?$İ­uÇ+kş×bY` ` ‚u†E‚rÒyÚġÏÍ!(§Ĝ)Aœq‹ŽŒ•)1ġêmÉìÁÉż—AÔ!ÁQŞ;cşVœ‹ Ñ6='ċçKW% ĤRä>ŭšĉûu”^8”ô˘, Z!qö.²?eĴß Uş_ÌŜáL,§y;ûKÈP’ÀN+EŜßQL‡#ĦläĈ 1yëçTsÑ…²‹R5"!)úŜ Qo+SìORœJäñ-PRĈ8xMŜš*ü.Ž)ÌIh`ìÜŞ$̞“„ ÓÀ–k7ÒH˜LÀ@=oŞû`ŭáv|,™‰äìÖԞ˙óġŸË;ġ“wÜù¤nŬ×—ËóĠjuUUUPÔ5Ì<87éŬŒSí*jÀ׳ˆ´~§Èl d†"\“uCqt XMĤS0­ˆ´ ´Ş4äC'Á…]$ù\ŠÉIéşokwâĠżJÚ×ážö=#êúGH³*ĥ@[-o&_•AÌÙúÁŸU˙4@/€`ğ…EZÂ1 .$ °„˙ô*b;"émZÀM'ÙÔ k ‚ìfŬìıy˜ˆş8 ZCÄĈ ;ĤŬÌĦxÛ&‰Ĉ*Ë'Šz5\Kaˆ7ĝ_KzâHıĝfèxi'Ŭܕ áŒv#àÄ,ÜҐ™Ód2İĝs*ĞÀÚ.‘ä àÚ픵ÒöĊ›z‹İÜI’.‚bH”Ŭk%€˜{ %‰úy¨?Naׯ ÎŜ˘!uc×?Ž·ï#‡J}–Tĝ f;ˆ¸0†­,Éş#j:ı‰šş'ÀN“#ˆ4äŝŒéêĝĊÑċÓ_>8ù Ÿ^]/ž,W+°Wµm[ïQÓŬÔħ›ħœâ'/ġŜGÙíBâ. Ù1K-(alËÖÂÑ2²–€Ş„‡b>Íçp8S@Œaf)Ċı’…fv"ÂY%Ö…Q"2Ĉ#";‰ĥk]a=ÍÓŬë CĤ7‰ÛzwEvƒŒÈ@Ċ3ŭ’ŽŒ=!ĈÄQO˜RzF|…G‚‚L ÂÌKċÑŭ1ÙN4aĤ}Ŝ¨ Ԃf˜X"kc ,MÛĥğnñ–ž|îXD˜EZaE¤„˜ŠÄY šO|‰êОBÖEÀ鲌ú2‘´´¸  •jÁgO›aO0ĉ3˘Í€³ÔÂn̵şöúqÂÒ:×VÂĵ!XGTÓ)Hd3àìbò3U²ĵĠKÄ|ëˆLVˆ·CaVŠÂ"üLôHT‰qU,C8Żè@²+ĥ´šFTİ\:‚–´½)£›,ÛúD€LwŜÙÇ£„Ê‹şFo`P\÷‹œnj…VeĤ͇#R^Àd@“#ÀZr‹/`ŝíÓË_?(>œMÌǗW‹o–ËĠ‹ċruċÍR+ç\ĜČUEùż÷yÓJÓÑÏŒĈ*¤!pÒ‹£m8ğÍtuĉÈ]xŽËËšġ0¨m°h6GĞŻ>½ĴA´ä–Kv΍,t!0œüŒ‹ˆwäċv;B=“í#ı­v€LïĜŻ.dÉŞ+9HÏ(;@Oĥ ‚Ô}J„ ç75z8ĥó8e€Ğ%œáŭÚï˘=àxâ¨Ï ĥÑ ~c9ÒEZ³?10Ċîò[ÈòÜ4mS:–%3—Ìœ,2ŬñsÛ:nŽıZ×l—ß\ ?ç§h󛍵AĦ(Ż”‹R~UÑôYZa$"tœH÷) $RWóM"ÛKšJĈíÍ%HU#Á@—LÌ3Jò ‚=Ó-vYòA)U­Q"—s'h‚ÌĈÎ@ĤP7ĴÑ7ħ/~cÀd¸-25]˘2T`ÔOsAğÁtĠl1Ù Üĉäâw¸Ï_l~ġP>s<ùzU~}µXž­VĞËÍfKŜŭ]{ÓŭlÔt‡’ì’zĞêHœs­Z­œĵX>yúìê‹ÇżÚ|ù‘ċËΒ5dŒÇŒe.šċĤĞë,üœ‹É•[/7ÛİòE_0|Ö‘ßé›î2ÈÙŸXu÷‚ÖF7ŞIĊ´ N2zfd'͆aÊlLáÉPŠGw—vÖŬër"‰Î ¨ñ áò…Pġ-À€ĦÂqSOìúꂛêĵ,›–Ğĥmè¨Ùż˜;׺F,6ĞëËĠó³ġ‡çËóoŜ5—™ qQç„Z)ĉĠĈ{G”Ììĵm‰D 1U5ċċıHsŜ׍¤XsmŬÔUAĵ\ÖrñġW_Ÿ_Ż>ú}öGL\ÙR1`C‘Ò’Ĝ.ˆ§¤7ÔŻÔĈzÙl–¨9%­bœħÖ4ZĈ ĈĊùµLypŬÀ5KÉíĦTù:7#ÊÇ=wç‡ċZs3gžŭîè7ÖŒĦ>é‰r›ĤÁp½aoşTM—ġmuKŠŠ)ÌôH\sMîüqR~Èż¸Wñö½£Ğš_\]Ÿ­×ëËġz½,˲lÛ6DIŒ;€˘Ğ’s0ܤ‡$c½$ç7MÓ6G³Ş.fK÷âéú÷ó÷t}y=òĊİİ6sc'Yêvĥ,"7ŽQN&ÓϨ0Ÿn_Uu½iê&4 ó7e7Ğ Éİ çB)oà;ñLíŭĈwJ­WĈ߆5È0d†ÁIĞĞÀhPüp@%›éñ,usLyi'j'LĞĊĉdy½1UUNëvӴ횉j2“3Küù²nëŞİÔq§Ç–sÎĠMSU“éĤ(˳ĉɇZ÷çéë'ż(ŞËı54!c‹(‰x²Hú¸A…P²|qxpb2ŜíŭYZÇrBÙâEaċÓUŬ.7US6MÓĝÍ{PuÎıĤ­ÊÍĉèĘĠâ=ŝíïNËĞrĥzŜ=^~ŭ‹óËóĞnu³^_TF|2k´Ğ_˙³£\e7¤°£œžafëÚmĉóş`Ĵŭâۓg_ŭŭQS àž-ŠckeC–ş ۉHÍ,GX°4/šuŭtµŜĴŞĤİÚĥi\GۍëÑPĝ³À°˘áÔZċh˜˜.Á0ġêeö×ÖtżÑîšŜ7†f/ˆ†Ë´dWßIvVMÒ÷ö˙ğ3U¸íқgÉ*µ[çïD L­ıĥ–žÏœ\ĥì.Y°eÓş§ËMı)½q¤KİĠ!@bçœĞëşŜL§Y]_ÎÚ?}ôŽkCx`ĉöŽħvnˆĤ~Ġ1bxÒkş'&½´e—hĜêé˜%K&àX˜kçh˜—ÍU]7ϖ›j½İ괐ĥmÛÖċf1=5Gˋ‹·›ßŭCQĜÇöÄÜ1vzlŒ™Èkµ&œ˘Mœé½£d8Ğ+-ĉoĈC"ni˙r£ç8ì‘Ġj”^ĜDi$odħ³‰-N&sZOäôäx2y.ÇÇ‹uÛv-/-†8LM—ç{ĠĤDEcĴšdÑ.>#³xg—Wżxpô™5ĉĞ‹ĞĊùbħĵĞjáÁ¨ŬĦ¨ÛW íRĠɨ'ÜVH[=£QprÎq]×íĤ,+cíJšZ ag'“Ġt~4ƒĦİHω>j Q%ÜëÍz³.ËĠşĴ6eU5u]72\„”¸Á›É}éEG €Ö d<#ÀÜ ˆàœwf ”vïƒl³~2KÜiä+I†=ĥ€J00‚zÚħĞúœwp`–W Ï…lµG)„œw?,Dä ;ŝĈıöyÓĥgÂnĠĥnS5ͲĴêuUUeÓ4-3ymi×öĥŞŞÚÚb ¸Z×f>[LçÇ'°öX˜gŽPP÷Ž„àA_ùŠ&³+–z§˜ŜHÂ>ÙÛI/iD¤b×nšşŜlÊj³Ŝ”µè´ 5eUÙâZG­-ŽŽ^ìĝ,3žÁz "eŒ‹¸ê“‰Ig‰ĵFdxMè²U5íFşôk½´ĜDD;t3ħĥ8²dŜ"˜wOĉ“böàÜÎq½Zƒ0VĠ–an¨˙oF4ŞĤ É΢W Ċ¸ùÑÂċ?â}]˙ê>}rrT|´XĴ],Wgëġúj³ÙĴuûÂövÍšitHwùgW! ²7M6ëu#"ëÒ[X³œLĤuQ·Ĥ( KDÖZ×m§\rMŬÔġĤ,ë²ĴêĤi\]×a'BC·‰d€ °‹> I_5Bt?\‰`Âa"£s*fĴéf6Mg0Ó[‘d#k”Žì[9#ċ˙ğ!NS€[F˘P~wŜXU´ÜŭÛù WÖÁ8y ½İíïUÓĥW›Ş:[­ÖÏ6ëġıc.…ılÛĥĴ›fÓĥm­ĉ/vîĝ˜MÓÔëÍZœkı™NêŞqċ¤l—ĈÚ)Mà­{ÛD:ĥ_Ô; Ì Ŝ¤½İç IDAT“)W_PçYĉĦÒ²ÖıĥiÛĥİëĤêşŞëşġ½1—QÒRUàĥ™4MSTëÚ­‹˘žc "²è ?BÖG8Vòœaŝo˙ĥwŜoĜr³ċ,H† (eëWԙ1ÖN§ÓéÑÑÌÖ|27wîàŝlZ˜)Ù8VÖ9bŠ#d`„j:‘8ĴŬ¨˜Ċ \_“ğĝN돛_½UöàÎüÏUY=^Ĵ^,—ĞËÍf³ò°FE:şË 萀=úıƒQ$@hSSq0˜P×uaŒi'“ɢ( ˘‰Âßŭܒ— 3 3;DÎ9ÇŝsáùÍÀê/W‡ċ8ĤÁ˘biB@áÈv~)Ŝ]†“ğ*ò*ıġ§`(6X·’"Ċ³jJr`aìƒMċ‚!>^Èq'}U’ Cħ"I^Ÿ~W™Ĉ’ŞÚ9·ŞŞêjµZ],‹ fÑ}fĉzDîÊc€Ôĥ-œsÒ6 WUQEQc,DdŭĵİT_££BE›S\ù@î–Ǟʟ ĵâUĦ΋.Ĝ9çÚĥmsìœ<~Âo¸˜™]S×MYÚÊZkŭk0áCĞŜ,!M˙ŬޞŜġBż–PˆèI/:˘ŝûDÄL&“éÑÑÑ Ü”Ĥ3W$ÊĤĉP"½48šÂG0 D%Ġ³4VPÌ!RS{ġfĞ?Ê/NŬ?ŭ€™ż¸¸ZX.—JÄĝŞùeúFğޤ]`„[0§ì°ç²ˆ iš°Û­ŞŞŠb1èĴ_@ĜÏVŞ Ħé†úY&KVbCŜÇNžŞĵô¨,&Bk…ü´íß´ĦŞA ÏM9)o4Cvĵ=ËĦÁ.7Zh.é*I‚zVUK,ÒUIĦŸñ@ċĞEtÒŝ t¨˜„Œ8İœseUU›ġz½Î~‡8dĞŸÏP¨zÎ9'¸m[öŠŭ0‡l)µèIŭ?éúŬ3\#CÔĦBÔ`}èŭŜ‰USV.ŒdÇfÔBœƒ§ŝ0U?½Ħ;áħׁ^oŝag³ÙŒˆ0Ÿ`îÜĴd–šƒ+eħ‚Q×îj:Qq#èíÚAv@ˆ—_Á.ŝˆ·§ggż~0ù¨°ĉóçWϗËU£MÓ4uÖ7“xçóFcUÑ­€á%);ÚÑ\óŽnŭßOŭb%½™Ŭ¸5:Ğ‹HF.v3ĥk \(ì§ıu>kg\j½q“ÀÀJçGDÄV4İ8Šħ­lrf^Ÿ['P²ôƒäĴHŠB2ÔnJg?„uKъŸ=†óéÂƒZħĦLVÙSvġ΃S×!'Ŭ¸Ĉ™F]aavm-ô‹F*xìáéwöşö4˜u50T­ ÍĜkÀH÷&ƒF^Ĝ{éœs†™fn:‹âî#Ħğµ4TFCFİ”İé(ŝD /H`|Q1ƒĞÎ ×ï>Y˙ê-óÙñ|úéĊbŭôzħ:ߔ›ë²,×u]0zzn4X‡)ìnúIC4žAÉӎ€°0uÈ o­²ŻÀ¤wï{HQkê8íáÈÀâ^J§ĥ›R×G²ˆ~›Ħ›núd· ¨°gµ$dSî9U7Ä?‰ ¨š”MhÈ=â7òUR+1Ş˘aŬ„ÓÍ-˙ğĴöğ܊ŭ†eĞğè:YÀHmd²î\żÉ!ġoì¨,dOġÎ{Ş'É^FñĦE—v,Ìۂ }?óS#ŭúuĵÔDÄĈ6d|ĵGJ£d`Wg„iC÷Q5]rq¤Ş:"K49Gnñ)ŽêÏèNûíŭÓÙ§ëŞ}vµX]×Uı¨|eäU¤/Û+ÚEË foŬöŒv’Œ41‘ġà+#¨r5_|°ÍÀ“lñښ[íéoƒĥf‚²Ĥ•A­ìğêܝ%ĦÚÇIċ¸î—ñž'v\úkyPÛÎ}R6¸ĜÛNr~ß3bxPrçÁˆ‡H#0sç2¨W&Ğ^ŒÙ\ĥtì){Ouċ+ E0QZ´ìZ)aÏ燉öTCÇK#@ö&Ò]‡‘jÈ ĵż "×E}€ğˎzïVïĵ­rb{x’5(wŠÌ/C2cb. A{ŭ9ìâ}ĵ=ğzŝî½â#ŝòzı~Ùl.ÖëġÂSu :aî.k }ĠÑĜì&3J|}ŬÒ.pbGŝßíÈ <ö ğf;ò1ğı°ËvĉZï.ÂĉY;Ĥß]ħër… FÈÁ’|•d{nzj.(òüŒ@)'ĉ•Á'Ĉ/‹˘O˘GŻMNeß½°Áğ½ô‚î¨ğĈ÷“T‡>ħĥÓ ĴUÙ@1ˆ1îĊċÔû´ĞJ˘ ”48qĥxñÀâ‹êş á€ÏíZvÒ.:ŜTPz_ò÷/ßdµyġ‹;9R …~èµsEV7Ĉ–šŽ´U’ż‡(I.'*f Éíú áò÷¸OßyÏ|2ŸÙÏ.ŻWÏŻ—ċf}¨şV@C½SÁáóF·ŭ˘—è! Ŭ,ù秈4c EğzH#ĝïMvÛD™<€(MVĞ‘ê@1Ĝ¤9kh  >“<€R<„ìÒP]iy¸òİÈq-×˙Ĥ0KEY†éM |…ä€Ù ZxÚÎS#¨–•ˆÀxWêĥá.Y··ŭêë²]aŜ¤ŬwóɎŠbŒÒ’c8`÷y aOim7ĈĜ¨o:m7ô:s0â÷ŭµEŝ"JQ…ò[ßûtôݵIZ$AÒi‹ĝ‹,‘-„Џ]“\€“ĉ3ùċ[í—oŬ™}ĵŜ”ß^_ŻÎ×ëġġf³YWUU;çĈu‡ö‹x¤g‰[Pz½Rŝ}¤ íC2:CÑà"§›Ë½êÊÄO/ġ ħĝÙ.•ŒŠWRG‹u0ÔTҁ÷@ĝêN6N)×ÛŜ q‚g.ÜLÔ§"I˘FPÓİ^’J‹ón ²ÎĦ‹5o|İáè|#´p—wd°‡ê(SžIĥ3”pèC‹óè ŝ.@ş)@ş@ B8ĝß$Ù·Œlwİ 9£g*·zs÷§ŝ˘íúüŭ.PĤȞ*‚-€b“ğŝ“Ġx÷xùí;÷ĤµÎ}uu½>[ĴVW~Ŝ¨jÛĥ} šî&=¤[zE@riŠ:·FŞŒh`Ħ˘êÌÈN{wŠu´d•FËĤmCÎLÍ&ħ/£‰jĞ&ƒK&=MgT̘é)½.ĊÖQì i02ŭR lħ µuĝîYÄù£wëàAIz|܀*é”ĈIzŞÚĊ  ÀސGŜc·c1£‹ŭJB#ĵ" í˘ïpƒ“{Hûißĉ2’P9n\o Ûı7‘żD{²;TDÚ/Ÿ´O^rB d§"fBnó-pŭî›WîO?/ŠâñùĊĠċz³YTžĤsε#óu7tŬ׺£—¤ìòoò`Äœh-j8Œíyĵv{>éĉ“íìŒvĵ F’á[úê˘û£ë=uŞ;ñ=¨0˜"IŸ¨£ìÈ÷Şĥ$à}ĜZITż\ÒŞ(naİ·âNAĜ² nyë5¨ĦœîĜ ÛÜy ’Ĵ‡$;Ş˘!Âm·ŠÛWIaOi5ò² ĉ]UÍJéR ”Ŭ>@’êœátŜ![Ì= Qê°+[wh·Ñ“™ħäySìÒ.!WàÙŝò>uç¨ĝl½.ŸVë‹ġz}=Ò7r¸ÙëËTF·àô ”]¸À´˘nh =À„PÊwUcÑé[o$İ Q ½Û£ÔEyŒ’‘ğŻ98FL˜k’F6ŽÈDݰHK(F0QÙڝ@Ħ•ÎB¨qU ĦsPȚĝġn+*Ş$ٍı‹3?ÔĊĝàĦ==Ċ]sHû€i8Uû‡Ò è§R ½~ƒmEċbG×ùk&d9Gë!$vŠ„ô|ˆ…HGŠ1èĈ“#@ĵú Óòcĵs´|úöŬâ“ÖıŻŻ—g›ÍĉBQuÍ0:ÄÉ{—iê-½" 9{'†CËSìè 5µwñŭÉó+irÌìB—ë#Ĉâże 2ÒC§<ğ#$ş>Sżŭ“тQ[o=|+0* A0mIÂS—pIdß­¨`ĴÚp74ôŽ8ŽH,ÀÎBÏŞ;˘F”P ġdàŭżIf×ÂMĜ?Ûv“Ïíç 8‡€Ï›VaOĠ—o.uU”ßǽHĤï!Qö+˘òĤŸŒM,Š´3)†!uv*°¸ê°ĝ÷íóë_Ü3Ÿ–xqızħÙôùFF/'ó#¸£WĴr™nŬkÙÓ;:¤˘â yçü’—wYHÁĊ*gŞ2ƒdʵÁÊhŒ’6“Èèގ0Ş'“ƒ’Ï]D^U¸^ïò-}Ê4¸W×m½Vğ cşjÉP‘|cî ‡ñùŠ}ôĊĜ@ëŜËXrÈP˙+—Ħ{a__ TB?•Êhˆáş.‘†0"'Ur1ċW0'Ñd5\ĤÑݎcAv×nH˙Œ“ö ~t·y|÷xúéĤĴŸ\/V›MçĈ4M5@Ġíˆ=DmŠÚ ·öôc˘ C\ĝ€à˜ÂîĈJ¨0Ü-, Ħ>#(ż˜Áy;h?‰ŒWF9ċ…çĉHuÀDÚ/`¸êÌ6]o”zÇ~V+vH*£!?<}ĈĜ sHé˘ IİŒá҇(;Ùя8„Ĥğ Ŭ¤]oZ íĞòŜ4`³IÊ+£Ħ×İçÜDġ‘ú¸ó.ß]Rö‚(I #ÁA%€Šy÷˙ĠW(ÖĈÛ³Ğgoߛ|ÚĥîÛËëġyYÇTu‡Şév9vßÊşż@˘Ï™=” vTFğv–cvDÁ&#@Ïà2 fŠX †~2*É"ŞŒ h:¨^òWĊòrö Ż‚TBޤ·¤Hˆàù£*ċa‡. ڍ.Ç2„ÁŜ÷OÒHl$ ğC‡HoJYŒ9Êż É ŝˆUĜ1e„ıšìĞ’ŜdcĠĵJÒâƒaQÓöFF ;_ċ3égğAÚ0S!;‡kÎI–Ÿà.=ŻŜıcšĉëĞëÍĊrµ^6uTu‡9-‹‘Ĝ·)ş}ĵĤ i‚½‡› DĊ[ìoyîJŽÖ p‡VFùCúkĵUm HÊ£kñöİ`˙GVaÒÁ9ñnÔ3RJbo˘:tĥ·ĵk³×Cĥskˆ›PÒ²ï]&‘‡Ì`ì’÷˞^ÊM öqġ‡~ŭPkĞ1ğé˙ßÄÇ>sYـR~Íô>vq‹ésŒüԝĥVíoMÓE}!+dg݈ŸaVŽGwêoîŸN>/ĞêÉr½9ßlʅ§êÂì.ñ‚aî ‡ˆnŻHú„NG#ÚF/ÓĴ=d}1÷k½_[3Ìe”¤‰° TŝşŻ²‹l>dA?¤q,7²Cа]•˙O ġġӟçšÏQR'h‰ċ°Ž|0ReĴÀÈÙ ` ıĠĜġ‡x8½ĵzx×~FÇ‹ċĉ|µZ_m6ë\U÷2ÙF‡8ĵÊ5vû$xÊ̌œx> 2şéƒ-ÎhV‹Ĥov*p3p]ËÖòÁžzäIÖ@bárà,x/{î0¤óŒrÚpü²OC S’èhBY0r1nñ°Oˆ²Oɖ_W‡R[´£jÇ8bÇ1ì;î1€˘?oÚ0fï¤ŭëŭ?ßÔ$. {Ħ”ı}÷QËâ-‚ÈKj‘è{ˆŠ PÌHܲü§üuùî÷ùÉlúĊġbġ|µŽŞ:ŸqÔâġ$ŜĤ~€4Éx_à°ıŽW‘²ĉœ³ÍvèŬ`뀿p!w.² @ÙÑ=£”m*l¨2ÂPÜĊeĉĊƒĠV֏’­ç–Ħ^ŭ£{œ(|eĉ˜İ7¤ {Ñ8;F/CaìÛuq7ı–•zúïCİğ}Ÿ˙İÄ ŒĊqä˙ŞiïƒYy—Dû;Qš‡Àİ4x²€™@àà–_aV}†wŽÖOŜ:Úĥí7‹ċú|½Ŝ\•1V˘} b–etÛ?úŽi26ğŜ zĊ]í¨–ŞNz/8rXâœDaËGBgŒòàB> LS•ÑP–­6í¤éô×xÛŜhÄôlÔmûĊŽxôñÀ[SÜ0ìl2^bÓ݇á°Ì+9àşxjíu|ßĞü^ú ­´^Í3Ĉޤ^…GùÛ³§Úc+™†.’pk‡ğg€Ô/@ˏp^\½{ß~6ħöñóóĊÙf³ı*ËrU×uċœsĜ½ìĤë„#@2Ĝ€›1’ ô*‹ íyÓÙ'O3€!ˆ0¤•Q"wˆâ’-5¨‚HFħ+Gƒ!šn\œ·Ċ ƒ &CÔâ6M7ĉD!ĵc?Ğ›ĉéġb}YûêhÄÉûĤGÀmïèGHĝ߀ÁĊÏ9ÇUUµu7q½hÛöEùwŭáú_üËżŞê fÓ9˜fbĜk’gĵš”ğánrċ ‚´ 2&ÊM=1wÍ2€Ĝ`ùŭ ‘N F m ĵFhş³8&`ĝ; _Fz[#ωÏä ï|WżëĈ˙›zC˙ÜÁh—+Ë Zbԇ’K’HÙ5|“ŬPwóvÑÌd,ÈNÁġ’hġ îàiġ”żœOìWġ‹ċj}UUĥÚĠ3sħ?D5z Fß ‡P~—ÜôNEWÓ4MY–UUUWeY>=ŭÛ˙ûŻWgÏßúôôáoî˙óùÏPL@ÖÂĜ޳³ègé­ÜŬvÒyßHAè`Ĵ· _î+)vŬsrf˜İk˜ĝJĞġàĠnƒÑ–‘ä샑 ! Œmş1kŠ“Ÿ–ìöñ]ƒM‚+#"êg·pK$5ŝFçŒ/Ĉt~uvF ŻcZ}ŽwNËoß:~İêg‹ċúr½ÙĴU·GUwhżèeCoŻİBÂ÷pâÇ<͆¤ÀIs´m[.˲\Ż×WÖÚ'D4yôño˙Ïӓ·ŝêÉü˙ŝêëuyRVġTĜm9ÛïJêê'‚Áôá#üê_˙/8yï?Gq|dn‡Ŭ’ëÊû fÈN|`ĉ)­Ğ†(d 2|q^skénŻLû2цŸƒbûĥĦé‡c“{‡lĊŒ\}A´ŝwíĠêÁiñUaéÉċUu½)ĞU]UeÓ4 w³ /3èş/V►ŭé‡D˙3ğġz]Yk×ÎEÄ8çêiU]ŝÓéô÷ĉÔÜ;G'Ĉ˜‰ˆ]Œ¤DŻRġoìħwñߛ|MDˆˆÈ3/ŠâµuÑ~ŝÛÓËñßŭš­ä¸2PÉVo§‡šApe”‚ÖM7òV’¤ġm;w{OŬ>^ŠÉ¸éVFïGTvCċœd3‚×_á¨yÌoßk==*ZoÊg›²ĵÜlÊeĠҐê>ï}°¸­Ž~8Êî‡Ĥ1éw/uÎışÛĠjµ@mÛrUUĠ|>ż.ŠâIQ§Ĉ˜9şߢĞĝ…DÄD@/.<4F”˙™˘(NĤÓé[ÇÇÇż>=>:ŝĠŬ>¸Ş!E>!N9àä 1(`ŒÙ³hŠŝIŸ×‰>ÜŜY·ï²’ÜhĤ–áÚ6CèE€™)`&ÄĠ ĜÍg¸7ıĵ|pJ_XƒoĞòr½Ŝ\WUbžê CФz“~[!}ÏoÀ. 7¸²,çÜş,KWUU3N—EQE17ĈLLˆÈ0Œz@Ñà”UMC•˜ŻŠÙlvrrr²6ĈĜc–G-şÑ% ö&";í‰R; Ŭ2PŠ0Tĉqʂ0wŭ0şìnß?ûò–_ŭŸwûîÚK>¨O #°3xùNŬ·í£ûîñÉ|öċzS>/ËòŞ,ËUY–Ġ½£}Ž cLÍħ.ŜVHßsI:4ÇD#Ġhëu]×\×uk­-1KkíÄS°Dd2Uċ 4µŝç­µ““““;ÖZ;ŸÏï ¤‚E' ŻìreŬ~iw˙ġ.>²µoKży‹ĤTöùZMĵŜPêqû¸}|ÒWfżeżKòʆP"™0†¤zS~‰ğĊġù;ĉs"úvħÜ\–ey½Ùl6u]ç`´ĞJÚ×7˘ènè~¨]ÔĜ€#óÔbf”e)ŝâ ÖG&ûı-‡|`àûûç+Š˘0ĈàäääÔ9·„ôJ*¨ëÉänáx3ûĦ]Ŭ2lÛ°í1DÓ *ûĦ;Fêĉħn+¤ÛÇwĵáÔUQˆžŝv £ĜC<ÁNÁ\ƒ×_áž4oŸ¸oĉ…}ĵܔg›My­R`›=ô2êşÛŠè~¨7`(ÎbË>ÛY+úçƒġÑ!`dĈ*˘ï£ü9ƒÁ+"é ;i¸1çd+ÒbŸk÷ÎĜñŝÓ2|×óÈׇÀˆò’ĝ²r"8wĞl¸}|? äoş¨ dù[M‚˜!²sÀNÀċ·Àĉ+ܝĴ.Ŝ-bá×ËͲişX5stˆ7Ĥ[ ú‘Qvßċ`”˙x¤êÏÁË €ÈMAhê̸b yĈÛuOÍ,Ż&`H\Äeç6jşsVPŻVU 73hÖċíĠûĝîy_!i`ˆ 芊™8 ëŻp*Oċ­ö›ùÔ~µÙ´geY^7oUí2N=´„[PúqUH?De4V%ċ•>ŻĞ#VàÁàB€’¤#"§Ĉz!ĞĦ€L70Ènĝ÷Niwâ·g˘êÚaıĴQ×˙‰½7’şÎżû"²²Vì˘¸“X¸€‹D´D@J\eA"Ġ–Z²ÏĜmyúÌñ˜hQ²l‘²ÛlK²ĠĥÜwŸn{Ĉ˘zNÏĜ2­–=noRK­ŬZHŠğāހÚrˆ÷îhÈĴÌŞħ%ȸç$P••™•ù*â}qï÷Ŭï2T9@G6[*˘ˆ“Ÿ%Íżìr2"kĝ˜6ĈT ¤úD RÍ}XUNŒŽ{Œ6‡+µĉLGĠf³Ùˆ˘(^‚›÷B.ŜÀâüQ§zCB[zŬ)SÊ0ùǨEJthğżEô°y@Jnçŭ¨JÓ4YÒ<× ™Çó,L×iŠm'iwçqĉŒ’Ä Z‰5 2_0hN핊(âDeA]6úÜ-üœġ%xP"eoA˜#Bs?e‚WšCŭ½sĠèhµÖ¨DÍf5Š˘(IŬBí-Eĉ †7t†´Ħ ´çy°ië¸é*ZXj™NÚʁìäÚ,C@Ĝ*„$Pm:¨ċ¸{™ni÷|k ù`$]}ò:T+1šMŬòş:L ¨P5qìñš'lp`IğzİÎÖzÖ!`6_ĊêrmrĠp°/Ñf˘ŜˆffĊO‚EĞšn1‡†c+QӐÚ9£n™-Jù_ˆÔ@t,€Ôž!Á_ċ8$ëŽ/V( ÀèüV›7/Pѐ…@Ğ}Ĝ t4S£•JŒfCÏ-€ÉÎB’v½"Š8Ĥs÷ĝ2%ßo‘ş~Û IÂ2ħ ù*úyBŻâ}}{gĉjÓ5×ë²£Î9ZHÜPœ -)Kê$lÈsC’SIŭƒ IDATiFg–Hùßt8`9—!µ˜DŠ˜mħĠċzKp윑t2ısß#¨UcÔkI—×’–Ä’VvEœHPZÈrGZ@R›—Ĥ d=ë‡(ŒÇħ˘Üœ ǵá£Í(4›Q ´ˆt*tğż[iy€´`ĥÔ ”:•âÚÁ%’p—Çu%Ġ;KV” Ü3HÑü2\·òş”é: YTÀ DġÜ­·İĠħB°£: D*âğËí™ċAÉ“3R…@Ĝ-W!ôœġq”Íd²fïTkéF3šm6›ġf³k­óó:qEÇ:V˘è?*iAĈniÑV[ˆÂ"˙S—’àBuċĵä;½êKbcUvFÍ@µs ŽĊ(UhÔÔŞ s÷ӉÛgÎ(g°ZD'ċ\î81ÖŜr Ù"H§^%@…ÄÑT´#aezÙíS„ñz#ši6£jE$I’.Ş Q/<ë @:!v7P’À]@ €W7Ùù¨pڛ_;^Ÿ-n”j £2#nšÜQk&FŠ@Ħj™ÒYD'ĝn=Ê­"Çf4"Z€DFD@A  „$šÀ€–•ƒÉÁÁr°/Iôd³W˘(ŞçF“Ìï3:oşÂ™Ħ¤*ĠÑŒtÈ|„é1y…^·Pèn?b7xÉ Ìö7·¸Qj70ÔŞ ġ¤ĊŒġµdF)ÊÊYşLĤ-˘ˆ×|îĥoüiv$","Ì̆Ù$ ĞRŸ. ,ƒêïŞU yŞ2·jD½JDĠzTÑ&İĊqì›`r^8–~£â¨/é˜ìNÙÒbW2²@İN(ÛĦËÛU~ù )·ÍÛĤ ĴŸ]†.Ŭ¤Ŭ2˙.äN1š j%ĥŻ''ŒXᅢÂĦˆ“}Ïaa ë†ĉ n´’X ’h¨îF)~#ƒŭ+†‚ŸˆÈáZ½Y‰£¨Öl6£8ŽtĥZêô×";*鄀R§Ò]'‹!ZÂët¤vˆNóT}×Òëq€ŬH“·¤JÒ-)ÊyîáFTĉbĞܛ‡iŻŒ(_J$PŸŞU^D'&+B—˙™™µ"‰‚€Ş•(˜<8ŬœĴ>…èn`öy ġMOŻÂsa vWjÍ#y1ƒë;Z -ĠĊğĦ–|°c@‘2 n\7‰yğܛÑe.“çŽò`$ĈöR °˘I8#YèèôZĞĈhtil}홑û8~„ı\œ“Eœ(0êVĠHż7Ĉ°ÖZî‹4‡•F½~`ĥöòSQeÚ U^,ÉTsġÀ ËW`”ŭ̝§Ż·†”˜ŜP×O‹€Ìħ‚-¨òmKŭ›,mòl÷ŸQÒóZQŒ@" jjTg­ċOO‚‘re;g!ô:ßtİËĠ;½Áœi‘ġx-À´•×b™ÒbµPÉÛ÷ }Ž"K*é R¸@A@– 9ϋŜɌlF'Œ^żRûfg{OD""oPJׂˆà>·WyûG·ĈĜNGo{?ÒbŻ·(-6†XzSl ½ŽOuÍsS1L3ÉÎéA0ƒ”²ĉŞŻ?QCûX•Ħ25èFoÄ4óżŽ7Żĵ ‰” &*PĞsĦħÓ –´KéEZŒWZÈŻrĦÌf!ŸĵnUdG ½ÁBÙÌH˜­ÀÁ˜Ŝ#ìGĞħ›\ßÔëq òÈ2µ"ŞŻ}Û/ŝë —­ĉ˙yôĞGž~üÉ=u´úš×áĤrP "҈‰–½ŭŜ{o\ıċ–ë^üĈ?ŭ`îû˙ğO‰ĤÁQğ³}Û0•y C ÜżĜ<³nّ`áĦKɐċĴ*˘¤×y‚D@31v4³ô`fÔĦdHĦ‡Ä1ż^†óµğ²~3Ž*sĞoxç;ß}ŝĠ‡§Ï]?Vë~‹yè—?=ĠŻM÷8í^çġJ*ż" °ıĉêKoŜò3żĠġ[œ{6œ:{ë&˙‡€Š{|û:"@Ò Œ:eI‹ıùË"YÒRŝGLgŝÁ[Äk£Y@ĥÙTX §­éui`3$PVxĉŸĤy0 r€X{×­;Ŝuç‡#ŭ—^=6\ÄU·żó–M}öÁ‹—ġo)CıÇ>Ğ™ӝÀ9°âĈÍwÜñÑOŭ]ò–+ħÂ9WeóŞ÷=ĝы6o¸e5°˘m=TîÖŝúŬ6ùnJıx-ċ×2V˘£3,‚7br³ÀMµ]aĤ·0 ĦĦĦÁÁÁÁ•ċryíÀYç6mÛ?C"vXı÷ÀÈm!$€8CX"‚žxë’É=7÷EQ4YŻ×gĞĠj=7{f)›BO‘ê+÷‰1£wܲ}çğŝÂÍ[ΞĴE0q"ƒċıpŭĊ|öùëĝŸż²ŻéİH–°ÑžIǵʁż­şáŠ;ŜñëŸŝ0]ġMf$µHê?ëĵQğx}ùÀE“S‡ëTJ:¨]ş9ïçż§%Ŝ×íçX +:ŜŻ‹(éHjӖħWD6óĤ73£ÜÈAê € úCèÏ`>r&R;Ù+û ì[=ŝÈò•׏EÍËÀÒ§„ ŒìEĴ ‚şhÓĊÁ9œĝäÊÌÜdl3£c™H|şÊtmœœÑŝÛeóĥÍsUĠ  !÷i(;*Ć‘E4zÁYáÙë/š}eR‰žœİ6şqJŬ€…–÷̟àŒ.™×RŞ£˘d÷Ĉa@´u=píH=F­Vß°ro_Œ:3F˜wçŒt2úS7ܰó§?ò}+ĥŒVë–C$ üŸ#ƒdĜ” ĥ? ÄI,ˇhïı šż½+~qĥñƒ¸·9.œ‘Ĵ¸aóĤwÜ˙ĉò­›ĤĉĴU"ċ@Ċ–é €|ò,A€Pay˘a@ƒ—m½”ïĊxì3¨ŒOt”x `q,îK'È€ˆŜ€`$R6HMV{Œ@ö=Ğ0´w„DgµpFwlżyç;?òŻWl­ÔšXN"ĦR`€XÚ#m\v{²Ë úQĴc˘ wÜ{'I$˙v×g_ĴêÇ J½Ĉ)uċŒn¸|ŭöğ?öİ]ú²­›&gbĴ!‘’RÄ"HLJÇnzAċM –”,O´Ä Ñà7]B÷ÈKêŸhì+˙sŞ3§Ô> bħÜBÜÏBe¸…SQQ²+Jvg·>Ĝ°el˙D'ܓ`DıӖ‚À–ìú’ÏbÌô,‡Ô™3*ġġÍèÛ·í|×o~êÊëÇfkMŒ@¤dEÄb?aÀˆ@3`dnê†8+?BÖZ‚ĵpĊjŬıkñŭŻìĞFĉ¨î-Nİ+gtĉÛïŝĜïîŠ/ßzĠĦÙ+Á2(ç§ Òh$,¤ 1@b@šc„Œ]A³44‘=MiŬ…úÑx}rĉp£•SZJ™mİċğĴħt8>Š(ݤ´éâëĈÌ%`Í9§†+Óµl ¤zòyŒġĤ¨Ħ;g4b9£dWxċġc3ġ#b¤OYCk€aµ%Z€Ä‚ ÛM·ġĉˆ}:1 ò\´éâì Î _zò@uĤâ9–Nf™#gtóġ×Ŝ~ç‡y0üĉÍgĴ#Ħ3Ñe!-‚„= %†‘XP"Í ÍB††…Ĝi_JDÍh˜€ÔšóוÎ^é²ıW&!frĥÚÒ§´P–B‹d5X¤œ×ŝ¸€Š’]ŬKv°L…p6ÒÁHo•éZˆĞgQIÙıH½_ĤëÈİÍ׍NW›K‰"v$ 3À °ˆË‚²ÏïG¸ğ+Â`è$’ŝŝaşö{ĥ‚ĝwˆ^œw}JtšÊwŬ9£+6í¸í‡ˆ.½iӁ™ĞĊÈ`€!#Â0†Ìv=X`ûċDÒħö"Jˆh¤D79’(*mĵñ²e;ñĦ ˙úßI}|⟎´rJڝޭÄıTeNÀŠ(é Iv[`šmcĴîa0‚ß}2ÎĞÇN÷…9£Ûvŝôƒ˙ mntşa,}D‚X,OäÛT.•”‰#véıû!€á@'‘H˙0]pÛ½[ÖMùäĝRĠ<Nİ+gtċĥßùÑOîj^vÓĤS1VÈ`) @„Ù~†Ù–,X2@"›0“êko×$ ˘ċe%Ú9ëo¸lĝòĦKŸh>˙̞ŻÏ)uĊÊtŻċçE%ğ˘d×^²ë_{îúà˘kÇöiDàĤiKŸzŒĜ²\fàÊuŞ"cfr$=Q²ëÌ…>0ŜħcÛÎw?üÉûpċ–ħéZ„e.3‚Sµ³ħ4-v5Œ l/°ċJöğğ—n½êÀt‚Ġ`  ,ÍDÚ´J°ĵ‘-Ó%,–c#m׉„ Ìv-ĊK… Ĵ0“D³Ô֜7ÚwÖE.?ú£ñúÄÌ!×§TJ v@:ëÜġÁĤëmcld2§†£”DʍŸ T€ä3VÔpúİ#gDRߚ‘Ħso½ġ–{ßùëì•[gÄÒçf Úò`„H‹@‹@ğ ׂ“ç‹FˆĜ7†Ĥ˘¤Y”['"X˘N ¤4@CmZ_ğàœ—Ÿ<ëì5'şoöÄsJ]9£›6oĜ~ÇŻŭîıKĥ^µ:Á12T²œ‘ˆf²J[–³:ÎKğáK™d•wDgù7xçÊuŝ°M-—… TbŻ:omyížyjĵ:1{¸Ž )§ˆN mş~l˙D’¸‘àZz ŒÚH”ġÏaL=€Ô…3êK9£wüĈ#ğÌĉ-cÓψĴà ˌÈ5½:HÚòHbDlù;eCĵ{ƒ0 ħĜ„VĴLœ$-ëCÀœĴ_ÔG„$1}4xÁĤġħóÎîßŭԁÙÙʑäÄxßuŒVoğŝÚÛoû#Î]²uóİk„e¤¤ĴœÍ5ŝjÒ,ˆˆçŒú<ı›ñ‚–T(l'“°(ĉp Ċ–(""ô+ƒJYqîXyŬĊ—ĴŽöN6Gĉ N݈˘dwšB³ċB%½FÖkĥfM§ıL—ŒâÑ·Ŝĥw}äáûôe׍­6ħ,eFì9"4y@2 'ifhç§jû$óğ…ŬÁɁÛž([şó%+ŠHʖ´$ ˘‘P‰Žc1}C4zË=Û €ŝŭ|ĉÙéȗïËw]9£›Ĝ´ŭm÷}üıM7mò`4*˙Q,6ì›_³l‰-X;т-×ħ¤ ċÓÜ0 „d;”˜ˆPj1$ÊqM X5ÂÔµŠˆĝœ6ÜJĴ˙Ê˘1>ñċ‚S*˘ÈNKÉnËĜŝɐ¸™H,­ŭé#ïúêżlًJÏZ§†S—!u*ÓùÉĤ£wíĜĥóżñÈä²ëÖĤ`äX„ŒṲ̀YȖ BĈ‚ħ{Ĵ¸r;=ƒ¸àÔûF<â6^ħSĞÁ·-Á–ûĦ²’p]꧁ó6\X]·şï‰Żì=ÉQ~mêğNeş€[7oĜ~ûŻ}ꁙM[/ß;a X†CEÊşvC;u\NQçœìÏl6Ò,d³F‹Ç†A, IeŜÎnÉo3%ë ŽL n˞’ŻáQYً²ÙHÈĴ8w´Í9Î=µŻzxĉp=+g TDH§ &šàĜdR/ÙÍCÊ}èıS)û^3şkÇĥ?ŭ'ï‹7o›t`”ސpe:‚f&'†óh³ü\c, ìJoN7UÏÙ”ä&sx7—äÜB)@@D$%%‰–$ ŝó×o(Ż={uùG_Ŭ;Óäİc䔺rF[ŻĜ°ŭö_ûôé[ŻÚ;cR€0„Œû̉qŜt<‡äÉJám6I̖wcáTuèÌD°™qĥF63bñġB²^–Ž,vÔtÄ+Ï_Û?zÁkĞOœ;<{¸a9Š(é”ÒĈëÇöM:Içöhî0jٝCyú‚S H rFoğġ–{ïúġGvE›·ŒFX.,ŭäÀ('XI„ĊòEÎÔ ÄȖòÄo¸Ö`Ġ~ĉTÉî]³¤É,ùÑ İĝÁoĈÖëÎr(â \B€’D# ûİ|ŝĤ ċuç=ĵ÷éW§ĉ”¨ċ8#UdġĥŸşöö·˙ê#NmÜşyï‘£0²Ĵ•3"Í"Ö(•%6 ”3òà$ö1š½qވsk ħĵ‘ÌbÇO°ˆÍŠÜŭyĜŜ!"BÂi™Ïıϔˆ¤OXkÌĈDfċùg—×^ĵq­Ŝ;‘°İT£Ĥ;‹†Ù"‚C:žv÷Ò£œì[<Ÿ¤ÈjOÍÖ°(gtǃß]vŬèÁı&– K_`í€Ä È8°,HÄeKLbr 0Lëßĉ—În vĥŠ´üŞşÌÇÖĉ„œİ@È@’³˙Keá"˘V„ĊR/ Ѳ›ß½C$ôħÏ<{´ùD4ŸSbÌJ×ĈñŠ­WnÚ~ë˙ŝñĤ6ܸiÏÑ&FÁ²Ĵ¤@ŽóJ9##H˜E³ Ö°àd âJuâä"ÂVBY½Ú7jAH27׏%,âdà†€•}MDBV`e{·ì–°Ş '2USÄc?uċ²›e×ĤŻ˙˘ñ§TDH§Ü£\iŒ·À(‡›éF€ÇNŸZ0jé3ş{Çĥw}äá_i\zŬèĞs K)°b.vW–÷ ò=F– Ïüê ÈġÙ^0j)/9i·]Nb7:V\˙M6ݤ\&ĊDP’ ˆáûs„!(²Ï-)˘•}ĊR- ÑÈÍïŜqŽN"üû÷Ï̘'ĴO)?Á=ŻÏhëĥżŭÁOîšÚpĤŭS1ÖÚĤWBê4˜4òĵ³ÀNeŬĈ@´Ïrœ˜s&""œ:T8n++[y&•"ƒ‰`*kÎŠ…™( {€0 Ĵè¤RM¤Ú‰ĈŜrĊòmĝ5úwšO<盓‹ÏS*˘ˆ˘dw<%;uѵcû§l’•wġ ùÙċ ÌË?<Ù%ğÎ`„}½{Çĥw?ü;÷5/Û2ĥo‰Àéw>rŜaÁ lMâš?uŒœÀ…íô+Ë[ğŻZ‹ÁQ"éh[·Qĉ›\-Y˙5 (ÌŒl -rf!ğ[J* ËOôµŻ ö@ĥÈd„À}0$‰Q@âÌG ËK $‘ÊÀ2 ·żçNRAYŭ—Ïüûï˙~•Ñ€ßr!¨‚€ĜĴ¸iË5·½íŝ‡vĠ7ŬtÉÑé£é`A˜´s`H²Ĥה+ÒĈ÷ı,ÊXƒ/ÓŭVlÜ8`ò`¨^âÖÇÀf@ËĤĊ€ÍVÚ€µNħfÄħA’0ĉê ju ,Ġ°LÉÊkĥġŝè•}˙ı/xù·:2 ˜Ó5Ê£ˆ^Żġ:§ZKݘó%;î­2˙Ïp6Rġ—ê8ŽÖÜxÛÛŜyۇşŻvéµ£ŻÎ5!Z Š•Û,]ùHZéù RlÉvÓƒ,7$Ò:˘[üˆn›d{1ĝ‘ħ|çĥa!ߗc?€ëO!ĥ.D\ı*($HIIÙ$ -£á÷ÜR?ĝèżûñlò#4àŠÉ%ğpĊjĠĝà²Uïŝı{&6ĵéü™zN´€ˆ„[Ë3`ÈFRßIkjt(G‰¤À†T]'ŝ ĥEHÁ%Lù£VƒWÈ{Pb „kŻC"!D ‰Ï•!PGM)—GèÒÛß{Aù[üÈ>8UÙżùŠË{˙Żŭö/_yóĈñ™%öÓ]…´Ƒ°Hb„-ˆmÓĞX Ö³Ï6Ç ;STۇ•z%‰“ı{ԁhH0†…PÒÔÒ¨'5µˆfbaĥd9‹1Iœ8$Ó֋_jJ˙0Œüħ&!1Z*z˜vcġ[V _ŝöġ}ßûŝ$ q*Í" @z;ż~Ó (zŒÜDö= ‚“}J¨1;MçôGO}ñÏ˙ù,”ĥœ}Í[‡)ɝ27Ŝ‰[Ü7)ıħî!~‡%ĝ \*` r€â8Ê˘‘‚“çTÜFMNÁvŻu{ĞϜœƒ°]5(І( ”v&Eâ5BV"ŬhHĜ?D—ĵŭ=;t…{˙öż>}ïG~óm#WoÛ8>Ġ„D‰8ÇoŒJ‰#ÛìŞS£TÇYST×*ì4 ›ıu°Ä!1H‘6Œ$2ÇqSSTOÄhßŭ›šĦ’Rıv­Ô½Â"™ˆ_k¤’E/„Ó*Rö§$_3$ ,'‚ÒŜ/½²˘ñ“'÷‡£Lzá £hœ-˘¤,ÙÎJ!şÁ¨ċğì @§fĦÙ =j¨F_üü—xúèħüÒÚko샄ÄZ;ô IÊc %ğħ}HH3:=öjÜî…ÎmÀ~OŝıHn6Ÿ3´À”b”³Îño#5ħK÷]kÛ£‚8“ƒ”_ċÈ}ô‰Uàq£)ay.ıġ=[ßôĤëÚxĠÁİ&8ŠĊP¤ÙMtˆ2pB˘…lŸ‘ˆ3M%#if$&µöIç²ğŠ @G͆–¨İ‘Ć’Ĝ€\EÍé<8u‘ĝd‹DH@ä.ˆœ5zŝB‚ÄfŠäÀŜX /'nìĈʽ___ú?ž~÷ĠC“ş­TWD "lÜ鯖éE0²§=†b׎ϧĉb4×ô‰oĝÚ˙Ë Ż4Ä"ï_{íM}„0‰mŜ²ö  ²²ġótóz,PYŠ)w‘n3£,Ğ’43r  œĤLäEuVÉ`ŭí ŠYUıÄQJ~@ ‰²Ï ñ +›a1%˘!(Ñu û†I.¸vèÀt]8‡$ÎqEħ‰µxÇnŠYÄÍ3"ïÙ§âŒc!LäûŒ<ş°Ĝ‰ħQCS³ž jèÄĜŒ€€È/fŞ2„Ÿ¨ ?bÉûü9 I—y0IÓA„l*–eQäË ¤€Ħ’ĈnĴÜóĊCç7~ò§{'ĉúÊŝñY´ö¸QDHÇ F~fŽUÛċ+=FŝÇ~lı' Nêê¤r^HòR„Wġ?|é˙ĠşaĵoôşmCP­Ó7ӒNQ"£FÒEï6 ’ŠĜ7 eÍĴŝj>ŻÈƒŬA½\\r%*GLùÇğ,‰Š‘Í’„ ˘ìÔZ ”‰Ħ@š€DB%n ­R%1fĞ1`(DçÌQ[Üşµç Ŝ‘ÁĜĈSħ^}ĥnè\ğíLvíŠ êµQ]ƒOäŝìöè´S óèܞùl|ru͌GòÎ2#—˘ÚÒ*†–‘Ô_ĈŠŬ_Ĝw^íı?Ûw¸òċ}‡Â*êÛİĤ" @:ÜVJßèѳ`$ö*:í˜<5`Äı͇÷$4nö_cHX~fġġۇIB­ÈÀÌ£lвĞġXr2oŻÛN}ëü$öĥAâäŜžk²Ġ*§ş•ŸjòÀǔò15•/N}çÜĜá§!!C „H Tšż8gbĥ^}ڈ$ ²Ž "qêĜ-äĤÍ{Έœĵ[„Ŭ Ċ‘AÔ¨×đÉËùÉ_{Àk 8­ÍµdF™Ú)HQ&ɁÚÁÈ97dÏaxı͌^ùÂsŞOnÏĝÌ×LNÏt8>Š,݈NI˘(cIlëfo‚‘ïŝLù£SJ&½ Çû5Ĉùë_ù’…’àĞŬZF8NÉÉÒÄ&ÍN3‰½ßTĊK2@Ë;w§ AŽŸJíœ@!Ӕûçĝµrİ;Ŝ^yўĊx1D0JBDzŜnŽċ[˜ÁNĥÍÎ U3Ää\´ħ.ĉ~ô¸akvšı+ˆDMFC#Ş'HbCŽ5’œúŬêÑ%ŸaJ‹ÂÒĤCéRUûWÈÔtY„R!ŒÖyıĥż0—LÀàDqï(%ó)'ÏÀ™‡S“Ù²ge'ÊlÁóÏkÉ ¨Ċ\˜ À=ž2p“gd ˘`g!ZužAW“t ğ6K2lGg°a;ÁÄifçÚm›cMj)gıĦZ-Ħf=‘$20š­·ŻRİMRzŭ!ı˙% ĠF-½[)`QŠM9#ä8£V0˘^FR{ +÷<6>V{ñóğÇg˙çĦ#3S°Áq”Š ݈NèÖK 0Éĵ¤ž#á´AšO6‡„\†¤³ŬÊ}~5Ĉ^ùêß˙%GĜ$ÉżX~Ŭöá$qéĈ™ŠàĉK¤N|˙CL—)òò˘3ݐ°N×Ēlžwx&iŬ€S·8ñ:h— €l6D ÎûMl²ìÁȽQÊĴ! ÂBtç<èH;j<µr.‚$1Ô¨kİVcë˜àD äÜ·ŭ€#8; pœQ–Ĝ¤˘vÎ(µv˜_Ĥ³İPŽt#ç È=YD‚Ħ’ÊO°jÏöŽUŸûüîñÙŻ:25ဨéŝ÷ ”¸ –";*˘¤”$ıKPjš^ˌÜ7½’F N6Í[ ̗ĝҁDà›_ŭŒaüÌò-;–QèĠw֖+xeW÷9÷i¤.È•²ĉXĞĤC‹z/2ék²ŻkĉŬ½³r—¸ı >cW ùîe6ñö7*I½yr™†sUp˙çÀÀ’+ċ` ˆšġZŒZ-N)HY$ħ´Ĵ‹˙ dFíe:HĞĞEaÎù>£Œ†—W_ÂêŬħçœês|pú›‡ŽÎÍeFħûşS†TD ÷Îk8óàiiBí90lfT ,÷uò³£v@šJ"ê€ĈA|çëcJ?;ríö~ Bâ$öŸY’““eÛeÏ+éĵ9(!o„ĴW˜)ïĦƒn*Çùž%ßÓ#İ^ĵ8ġCGg§\Vu(י";*˘¤iï‘,‘3’Î÷Ÿ´2´:„ùʗ>éJğn ”ä~–:í8ˆï~ŭoTıżÄ‚÷_³­ŸÂ8IÒÁĤybŜƒ§s ˆ´ÚÁyà!ŸUċ†÷ċE-?—lž’˙Ùc(]?#™+„Ê 4¤W“:îx÷ò\~À"ˆbƒJ%A³á2"Ií{,ċĝ5ÊsFr\œé3J3£vÎ#ÄĠħrÏcĈ/?úÒÁ™oL=ÚŒòÙQFE€tBÏ ”&î-0jû}äJuéìéSDĥ’î° >`ñċż:'jÄĴġ{‡ŬL˜XCÈqCȲךSä9kdÙŞ¸R\nïu NÁ2CŝıYONĈA‘+ĤÍİ}ŽÉ|r$Á:Bd˜Ĵê'†jĠġş†ÑĈû葤6™ôŬċK”U+ÉY}şĞé*Óùì:”éĴƒ·"^F\}Ğ^ùÂî³k?~ôÓߜ8:=‘+ÏEmeşŒŠ(é¤ıA9,½—uĝ}˘è ÜîvÊ[ş•ïŝ&ÄrßùĈߜÍÂÂüÁën]N$NüJ>ğè(íNÓ¨ĵëwn}|Ĥƒiw‹„ZçÜ_%Žĵ“„äË~,'9£Ŭĵ‹lž‚mfmÔÔj1Œ‘Ü‚5.iĈ³gÔÖgtÒ8#FZN\ù1Vżòݜ]{ŝÑLsbj6ŻĤ˃‘0`TDH'-üĠ7ĦuP/Qdž:Ë %‚µ}pu@cßûĉߞc›Ĥ~˙šƒCâ$ÉüOÙ+Ò—1p&BH3£ÌÇ=ܙÜQ›Èù Nè]pˆ½zĊQ'œÎK§tïNoÙ÷Ò rÖċŜTŒfjÖ­ÓvĦÔŞÂÓWìä…)`PŽ3òŝÌS.'˜È‘sC%¤=ży£TdFİ™7]ŞìfŒ,#™û1Víyl˙Xí…ϽĝêÔ·&Ĥçyış\x^Y.”Δġ3ü ĠÔ.Ä@9İ–)ĥäĜÍz‚F-Aʗ#%+ ’dÖF8#rv)g„ËQ'ÎÈâ~ŒŒT~ŒĠğ˙r˙YÍ=x`ú[“Œ˘.eşŒŠ(锄r§›"H"= F€gÛUÙ+‡O7(uç”bُï|íżyNİïš+”Àq’ıĠ8£ÔÔNښcÓÌÈ]Ŭs*, òüÁš(¤èŜa5óĴÎüíÄŻ:ù6ûM›Óú 6Ĝ V‰5tĈKċ€YfäK„m`$édVÊTu”gó9#ʕ騭LG]8#ê"íH†GˆgŸêWŝâħúKŸñàÌ·&§f&ĝx j`TDH§)E˘\óˆ, N)!#Ä€úK™ÉŞœUëXk/áɁ&Ë÷żŭ·ç23³ĵŻïÚ·­˘R '’ÛnŸ<”rB™tÛg.ù|3͑Drİ‚x…ea›rÉv/cçÙqÎAÂ3ZDŠ:4j µF‹“p#ѐ(§ŭJùŠ[Ž3Jé¤MŻÎ Ş3g”7JġÒnʙ÷‘n()*9mŒlŸÑ2âıçħúċ?qĴŝ“Gòêô·ÌÌM9ñŠş¸£" @:]Á™,˜aÓ³`d·2wE(—œŜj'” ƒ á‡ßŭğsí€ÁŸ ßĵcDÏ)Y; ßlšstÈo̙µ3^E^MgÁÀoòh\ĉċ M3›=;Ħŝb„àċpd'U ^רWb$ħÉĴçĉeżß}ß"íĤ6Qĥµ{CYZěÎĠĝr#$2o:?ƒ0Ï‘)yFÊÚÍ=‡Ġğ˙jÏXÏŭäĠİï™İLċ2˘ŒŠ(é´G ì.(ˆÖi–$½F~żT›"wú2¤…@)éPÂßûğóúŝS‰EŜ\½c„ŒíSɲ\+XNTWÓċTO+95›4çĝ'·É ûI€YŸğŠÜ)M_:aT+1šu a˘ĵSDŒ Œl·ìÒûŒ|r#­MŻÇÔgDıĤWû‚02B˜}Ğw?ĥg]´÷ÑïŸúÎÑŒŠ(İ—3$IǗ÷$ù/5ƒ”$°üÈéŸĠıdNé`,Żâ{ßüës£f £ß§ŜtËj!8ŽhÁùA6›ŠÓŭ™RîG$3i&I½ŜÎùĉQ&|H›aɕÀX(#7ÑÖNö4êĠj,&;o>9W‰yœQŜt)cí€Ò(?ÏÈgF.aJżq4Q:Ŭ›ŬˆT &™}Ğ_ŝÂOĈ/îùŭSߝš™D÷>£ŒŠ(é´n"€1 PcÓ³`”ò]äÄlD½ĥ’‹rJ›|H˙çż; †ßŻyûjÏ)µÎFä6.ˆZŒTĊġùx‘Cê€<e˘|ìke`rV°I¨V"4ö —-ÍόşrF=äMgŬ<ó Öĵòç/ĴĞżüè ŻŭîÔLeş ŒŠÌ¨ˆz ™(T0uŬÓ`ë½W ²Ŝ)îĦEì Jó8ñ‡äŝŝ<ü1D˙ ]½c…%â8–Ĵd—q{’ŞÍ$%zX˜<9ûk7֍s™WËÛB‘eš˜ˆ… vĉ3PŻ%RŻĊÚëË=ܧ`$90"v)R:UZĵ‡jĥµğŞbÚgäU Û­”3w·ĴÏ(ÏċûŒÄqF‚\Ÿ‘ /#™}kö<öÊşúˏ°ïÈw§ĉŞÓmYQ70âbO(˘¤ÓT²#"°ÉĊġ"ċ^P8gۛ9碜Òx‚ĝÑ˙ŝüòŸ”Àò~\}K”Ré6û"ïžk:ġ‚Ğ—V'qSŒÄ ÚÜìqˉR@ j•˜š û6(Ġ˘§Ż=_À ]8£ü<#ßgD9Î(?BBÚ8£|Ÿ‘d=À)¨Igäµ-FݤB`h˜dîĴŜŭĜ+k£ŭŸ{áĠİ<-Ĉ`TDH§gûtdŽ;"E֟lÀ9í`DŒ”é”} (uċ”Ĉc9H?üö˙w^Ԉaôûċê[ÖPhû”²Ş[Î|Œ$ç%ÔÚ³”q9­ü‘·Ħc×d/<uê\ “°ğ!÷óĴ”Ö­Lׁ3Bo:,g´Ä2,İLGä8£é'ħz÷_>żħçÑöO}ojfî猊1E€tZƒÜI¨4óèY0ò¸ „Sáö}˘ËwóJx›|X~ôƒ8Oŝ˜Áü~Óm£T*£$@iK’7*…SÓq*`oĚUÜŝÍX @ĨUb4œ‚Î)éŬàlxQŽ3JËo9i7µü™çsF$ùf¤ùäúŒZ퀄òcÇÉ띐¤`4²ŒdĉGX³û ϝU{ċsÏï?ú½éıê çŒ 0*˘¤žÀ¤ÜR ⇣ö–vùĈÏÏ?ğ€RĞż„ˆqO=ŝçËQó|ċ-+P*âX(í€uċĠ\Ĥ ZX—dŬi̎g#Z5Fé´ŻH8 dFyİ÷ĵ̨ÍíV?mBĞIk‡yFè0Ï(;žë3‚UÓy0zìĊuġŬŸ{nߑïMWj3XgT€Q ġĎIh†äÛô`™.½êVÊzï^§†¤íӏq˜Ÿ~ü/*˙iI‰|À\ıc…*yNÉO“Í)Ŝ܅D+µç‡ì ¨Ç¨Vc°aËıòZFúŒhĦ>£$O?ñò`bùşm*ġ‘Dħ¤sôržw’[g;K(•€$ĥ½EnŒ8ÚTxK£^ì3J9£é'0úòŸ?½ĥħ÷Ñg÷ùŝl6ğ„2]FE€Ôs`²jEv+÷hfDٝ:Qƒ˘3mıó D2%˙su8ĈžyêËâ?JŭĵŜ|ëj*•q’6ĦĊHĠ—ËĴYĜ˘¨iP™Äh&˘´”ĉ5Ġ휑orúƒyœ‘´QÚ(”ÎirĈy]8#éÀe£ ç÷^ í#$HÙħ2ġ8F÷üĠ k›û}vïä÷gĞġ€QÁQRoîîê7a›µ\ġrOeFóĈb>3—<÷)ÜFIó:œ`Ï=ŭċ Ë˙W_Èò~½ùÖĠC˘(öpûû•­™ġšF­YHe~­h£ΈòF­ıyFè`”êÁ(K²Ä›švċŒÈĞ3rœ‘ŭ'#ŻöKí€HR#WûÜ &š~£{{aM<ŝùg÷ùÁlµ>‡‚3*˘¤3½d ÈlxzŒ-†uŝúV)[R:y ÔIär8’òä˙ŝ¨ž„Fż?ÙüĥuŞŻL&ŠĊùÏùI `lĠjŒz-ÁVc[še—3ò}NȕŭÒÉĥ'ŻÏÈú‚‡Á!RGżÑŬ_xjus˙yvïÑV*ó ؈Îĵ’ÛT\c¤ġ÷ì50jÍ!„¤l̙œĥ‚’É}J…lòĴšhê#üÌÓ_ğĜü„,˙²~É-cĦ*´ñ•-?PF UĉbD$mĠšçܐµÙ-‘3’– êÎQ6vü˜9#šFPÄD ñocôà{ju}ß˙ŭìŜ#OTjġ9>qîV€Q§-TħÇı+ ’pĉUÚK`Ô~?$ òU=ċ—\Iğ[’ğiúH‚£Ż<÷Ü÷†żògßŬ0†P\9‹0ÍÍF5ó`„6!Q)gDy×nj#šŸ9¤”' ŬûŒ¤mž‘³ÔËOzm™gäìÀ]ÏkZF̕`ĴöôôùfßWŸß{ĝ™J­^í°f‰˘‚3*˘¤3-C"/Éö"ġ2ö’ܸ>$>÷™vPâÜfšßhiĊ²Áµo½÷g/\sîE‰“Ôr”HÄ•™H’HCQ‹$Fp[}ÏHZ ”ÏŒ¤%3BÖ_ä’Ì#BKÓk;g$#(rƒqŭƒ‰ükúĈ^Éù×1€>Ȇ{F’ó·_<6/orËŠ Çî"Š’Ŭ,9÷ƒN pšÁ¨ŭ5ÛŭŠ×G˘šwĥÍÀ‰.[Ŝŝ²òïzà៛ıöo~ü ş&:™ŝ IDATäTúq¤QK`´RnùN2gt˘ûŒà^ŸüÌ&oÛçßı§8ĈĦ`UÈcï½sìĤ$|â‹˙ġ'“üb\›î” ÉBù~ERŻ–ìA´ŞgÁıù@ö}ÒëċÏ@m˙疑K­Üüî˙Öżš½ĉ[;nœĞI @YLlPK †Ħ”òى¤lIŭÁۇëuâŒ$'í–œ‘@ˆ³‰z™â.ġö^ˆ3’œ‘8ÎHZġŭÖüH)BH$€$TvT†İÍÉáÚ`xhŬğŜ½êşñÍëÂóŠ= ˆ^7Ğgû( œ}Pƒìû,€N0)Ÿê)û˙ŠĠƒWíüĠ‡˙ġôĠw]˙C\­ËH@ˆtd¨VIˆD 2Ù6‰€(£ñİUÚŬÂQÊYÎ(o”J9ÎÈWŜlnêĝ+‡F„TĦŬ‘3BŽ3˘gd_Çb(9ò(ċ`Ğɤ”P¨ˆúBEċ0 r ^‘C•A:¸ĉ÷.ğĉ=?ûÖ ÔRBıġëôEQRÏfI ƒìߓ`Ôڃ$Ĉö ‘s(dGˆ”ğ ^µfàÍ÷|â÷yêêğŜòχ T­!ËEƒQÔjħD"ßë“VÀ(ïl1Ÿ3Ê{Óe3üĉ;0ċDÒÊeÍHh7JÇċ½éÄsFùyFŒÒıìĥŸ ‚"B¨HÊ!É`YÑ@9$4jr¨2HVßŭŜŸúà/l½H] /·–~=_7µŬ"Ό(8¤ÙK bDݧ‡Á¨Ġċ›@göċèó·áĞÎZvíğú½û&ĵsû?6èĞ7eY) HİVKìU-ĥĜ^%ŝ½ZR‘Œ0J•V£Tpĉ¸}ìFİÒ"° ÷û%g”š‘SöKENĜ@’šr((…"}QQ“q$Yq÷żĵ`‹’­êÏŝÏoĵ˘_‚Ìë àÎGmE€Ô[’–ÔżŽ‚$Òğ`D°™`ŒÍ–ÎÌż~;…î6ôĉġç½ġî>q˙áͷ߃ ƒÁf$+ûB(Të ĠêIşI‹äu ĝ‘ĉxÓu7JÍÀßĉñ{ÓĦEÀ0ϵÛgFDŽN˘‰,ì)EAÑ@¨¤Ĥju947TĈòğ~ŝĵkƒúżĝ§ß~öà³°ÍħT€REÉîŒA#'ûvŜ2˘ıwÁ(-1ZA•¤ğñë"3  ]=:xíŬğ>qßÄċ·ŬIĈ²f,gġAQ¤Qİëts&ĝŞV Ô2ˆ(_kċŒòÒn"êg”JÜş5½.qžµÍ3òœÜp=ĝÀéq–N·uk•H)BEè  †´vYŭĤ.‡ĉúiß²Û?wùğ~qۆ`½+ßùµ-ÊwE€tF`’÷°#;‚˘—Á(}] "ç,qFƒ‘P0tġškßġÜ?yĊm7>>ÁXÇ2ÚP9$jĈF<œ`AD œŽ3÷}=ı2ĜüyFÒĉÀIċÒgä8¤}FóŒRœg$móŒìĜĜœ7]6Hĥµì˜`)âùY—1)H_¨02âĴŭ4ÈM94;€}#· |ó?¸}ƒÚ;¤$@Á)QÒ²Cúžͽ FùŞ ‘--YħÀ(0|ġY#×íüÍÏ~èwÜò‚I,£ċ€ÊФÌĠtÖ+Ĉ^¨ `×}“WPÎİôĜ9£´ JNgä'½Î³òòï\‰PrOaç`.é Áü”Â@(g­ì§a4äìígĠ›é—nŜTŜ¨~B‡"NaÒqÁ9†íĝ Ŭ­NÖ `äyBdċßg-ÌíúćĈ7ßv“Œ•:‘Ñŝ%E¨GšfŞ 3„fğ9Œim€µé’›GÎŻ3˘SÀĦ ÄR—yï>ï“#˜Ċv&°·ħ`(RP*{ùPFB ñİĤš(˲;á‚ĞÂò }ġ§ß~fĵà”Š(2¤3d'`Ėïz ŒÚ^—µħğŸ1Ҝџ¸˙ĉÛnxb‚ħJ'2ZPR„fldşšˆ6,̀aacĈˆ°)Ÿ)ùñċq‰E FÊt8£´@–kzm÷ĤK` m)“Ê=?o”šËŒ$3JMÁÈ5˒äK…Âaû YDìçğFݤë`lĤ'Š€ĦŝĈVöcXĊrhn€ö½ŭċKßŭ‹Û7†§TDHgDx=­"×Û= F‚Ĵ1ÖRÏï% sFŸĝŭû'.żíĈ'&Ğ8‘Ġ}•!ÒSĠħf´$†Ħ@1l3·Isš!ıLÊLÔêM‡nŜtúŒ²2´÷a!ÎmœQkf”/Óċž—f^,6‚¤#Ż„ívmĜŜX A˘ħhÍ0Ĉâ/ìp֊²+ßġcÏàÛ?\ŭ‹Ü)(8" @êùóKAĜô4WœÎYzşÚҝ3Z;rŬÎO|öC/żó–N0V%ħĴ.Ô§HÍ4UI(J˜ %F(# ÒFÀ bh0çÁˆ|ç+QĈQgDí}FV$á]Ò¨3"7 –rġ²Á~ÏàŒ¨‘ï“Í5Ĉ’…ĜfDdDÈ8Ġ†)ÑvMm(ħ DÚ0XŠCŭŒ­,Ó05e|ĤŸ^¸ŭgƒĞ>ĝżnğ´cÁ)q²£àŽ³dŬŬ][*á*0ʏĊ]’AOsH pFçżġîŝĦËoğáñ ĈŞ$‘5ċ%"4U‰ÑˆŒÛ|m`3$û=³ÍšÌ<0²9ΈNQŸ:ò‚ŠĴĵ—)+œ:ÜÚv l6ìÄ ˘”ûŸœ ­uB %hh „ħ•Ĥš2>Û_–e·˙ü›ƒòM}_ú“o>u à”Š(2¤Ŝ\=߇R½FóîìŬĉ‹ô=|˙Äċ·Ŭĝ$c•ŽgbfLWÔr`ä3£ÄˆËŒ$Fv’/ÓıìfáázÎ#=ïM×iž-FÔRĤëÌÙìİ•3ÊyçùL͚ïy0w"œÎĈ°ċ;ab#dı#m˜´hm\ĥĔhc˜ĜŽSAS͔iOùÖ÷w~pÇ}PpJE€Ôƒğ'ıÒùı+×#R*{ƒ½Ç!-ÂŭÁ‡&6ßv£/Ó­é )´íĴ2S×RijÑF$1ìŝ·ß3 ˜-‰ÏìfĜ1‹6ĜŬ›Ú]ğss‡œçëÊ\ğ…Z ȃQŞék0´zÓIg$ı2]ú<÷~œ“ž³üN‡ŭ‘¤†äŜùND˜!Ĉdc…Úpş>Z³$š‘hŜB 2ÔàĴĠŭ4ĴšrhĤ{Ê·Ÿ.˙ù_şċ²RÁ)Q”ìzĞ^K"{^Ĉ‡=Fíùšŝ˙ÛûÖ(ıŞëÌoŸ{oU?ztKB !HŒA`+vb°“€ħ“ÌÊÊZaÌ$öZ™ŸcüŻ5?gM&³Öü³Œ8 °G{216 ĦWëBRëÑİß]]{ï9{~œsî=uûVu·¤î.ÁŬ‹˘ğşĠġ¸UµżûíoïoKŬĜ@égƒ‘3ÚûĜŭ_ùÈg:xYbSñĤ²Gžñ̞ŻJÌU#Hə$e:B3RNò½épĠŜtXқ]ƒE2r6Ä:`”î`ôuÛ Nš2QúÚ ³? xĈ4œ`x!½eŸ·mê&LÖxlĤLĜèğ~ĝ=zúÛ/ݟ¸šy-‹ò] ­O Ġ†,€ÇrġÀˆ9_VFš‹ĉċ|Ô9G­4£Żŭċ“£y䁗£ˆ·”=ĝ:ŻR0] 9”Ф˘XQŽfÄN™ĴiÊĠŒ(£‘=„F3˘Vv@ŽfD€a;‹ÊtĈ]Á—e&£ÑšÁqn0ÉZ‚“FdĝYfôÎ ‚RLÛ '3+ÏÌb)½ŬABp—ÚÔLÔytĤ\ĉ›ŭòÎ_÷Ëú˙ĝ­+4"Š’]§0$Ö{ìZN£& É<ĉÎ(Ù-ݍäÑ^alŽ#4`€ëót%ä0Vl˜‘[ĤcŒÒڕҖA-4#[ê²ŭÍk$,´ž3BsFI}-…%gΈ3š‘óĝŒŭ`sğe:$˙ì²3˜Ù:s˜oÍ1Iç²˘X!ŽqĴ[Ä#İ8”Ì2+­Ĥzğ|lßTFż¨óĜLgƒ‡÷w}ñ/şğ”Š(RÇ0$¤O•êp0‚q&'ÀşħÁë¸2] ÷ŝ-Ŭ{ûĈ_?9r·öĤÛEĵı,È3é-–Àt%D-”fÖhqC2g”–éL…L³“L™Ž %kWÉĥk[ów‘³vÜ]GË0JE†QN™ŽœM”–éÒYÚEe:Ħ 3rbÊè Ìà‘ŝ#{E ˘ AĴ%Ħ·ŭÔÓí”ïĤ˄›ŝÓŬż.Ó˙ùĉKCÑ{†)qÁ”Š(i=é²Àf{,w.Y™+ŽÁ‘Xï’]›9£½_üú_}uä#Ÿ}èÀ¸îĤÛ\öÈ7éY*`f!BŜ FħĊĈ…!G3"VÄĴ˙Ç9sFÜÌD̞>“J’;gĉŒĜ#[/#÷j+£TNÁˆ Ùr4#ëњN§„pqŒÈ ċ„³œĊ{°nAĤ9Ïií&&gí…=ÓHö´¨•–#mnZ)Ħ~Êĥš 3lW*”+…€ġ›/˜=êëĝ–-ÀÈDG§KeÜôû_Ŝy§WŝT£o½vèbĦ)qĠQhHגY…Ŭ1¤×™w,Áq‚ĥwħ>nßKxÓŭċW“Ħ×8⁲€G A@­!yşrĴ´#Ι3rÁ(O3Ò<)m``כÎьÜv4#dĵéò4#§—‚Òh­qó ‹T3²Ìˆ]Í(uĊ³÷Ÿ¨ZŒ˜ ,q²Ê“ġıciżĈ ħnGKDş=Q$K4œġvù´}Sŭ^G§Ë8#~ïqqÛüĊ÷” M݈Öjç&uOt>VDBĴGjhĞŭá7ŝúÉñğ}À¸víŜ\òÈ'ÛaĴ0U‰¨1iá=aFÔB3ÂbÍÈ&{gıĴF“ò½é(MGMÌhšQfı^ oşdΉ<ôJ3"Ğ5‘£‘iĥÓw­íYŠYkD†5*IÉPR‘RÚß.Žġ1ŽcEħ&Dħf˘Ĵ@_—O[7vSݍòèT€³âĦ?ċŬöŸı§TÌ)QÒú°$JŬ:œéLëáÔvŸÑżñżžıû³½1.qSÔàM%{OËt‰7›9#nMÇN7]3M5#ğB‚œ2ÛM—tâeÊtf„nTÈéĤ̜QÒôm›5Jm֌8G3²&fdL Ò)Ó%dˀ)Rš÷‰2àʂĴÔżRĴ˜YI@3{`ö<Ö³]>n,cäJ•G&{Êĵé÷żĵs—Wŝ”WhJE iíÂZŝKn:’Ɍš90ëD³6sH-ÁèŜ½Ÿ˙Ú׿zù<ú¨DİÖàÍ%‚˜”b’ú‚Z¤hĤ‘z%ÓÚmŝ H*ĤÌ+o:ëŭF™ĦW‚u×FÚŜÍĥ[ŬRšZğ›Àˆœ2MvĥrÊtfĴ‰ÈéĤ#gt‰2š‘ÛÚMĤLGF3"ÓÚMn1“ÑŒ()ÓÙżÓυLk™Y]ó¸™ÌCRĴ “’Ф4Ç<ÖîàqĴÇLQ¤ŭïâ˜IJ}<ğËmì/˘òpżĞ5{ğ M݈1$*ÎT>86˘İ×w$9ż'ëòĵúë'Z•ézïèŜûĜ_ŝÏ'Gï~ôÁ×ǸR~SĤ“Êì:dFĴ€™J„zè8x·Ÿ3⤳,×(ь’r4#d–ëeĉŒšàˆ99FİȐ07"Ğe™çÌùšċ2#Üy¤ì(iĜp;ÉÖ2C‘ŝ‰%€ÚMO@S%³`ĊÈ0oBıä£ğÑBužÇĤû 7˙îŸŜħ+n|†ö}ó˙ ‹9"Š’ŬŞ‘IfäĜàFœ,F6 •Òk(ÖŒúïÛÚż÷ħŻ˙ĠWÇîùw½>"јĞqŻ$K&éœUŞ1ĉkqâS;ËġZxÓÑ5xÓħÛڝMGM`ÔNĈF\“,˜”Ô€¤ï[ß^à ž nTxtş—xïŜ)0}÷Û/œPÍĵ P*b ,i—œÂƒâµeFÜ Ÿ86ù;Ä Ô]JÓÀꁑȔêú>ĥûĥOŝûŻ}ŭɑ?úÀ/G%³5öˆY! b2Û<QĴ05Ż7ż*g´c5`ÊtŒXïµkıÏ(šT3â̜Q+fä0Uµĉíxvv'G3"½M bö’ħ„o|ô‡ĦĊŬtNÛĥ™jҌ)`qĤ›Î-sÛd î8ħÔ3ŬĤ:™ %²sJD€Òŭ…şwǀ›’O1„ {àôz eʑ`Èz…G§úʸùĦ/ïşÍ+ÚûÑ7_=xá8€zS*òOM İ•²$½lĈ ¸ íiÓIÖŒ²§Pò›ôúƒQ(ġ|t°÷cŸûÚ׿:ŝáGĝĠ˜D8[ĠfÌ1£ "ĉ+!ŞĦ¤´ ;²›!œ}F 2´ÙgĔΆ&Ç'ÓÚ͙ĦWŬ,Ÿ60pÓ>£tÎÈX*$†Ĥ´Çá1ş{H\~äl4ó'†’#ŬgÄNkwS™.ıÑsF#)éĤK+~€v‚p™QZ´ZT2OH%„ ½X MícTĂħ P"E²bޤ˘FCÀĠ$\5*<>ŬKĜĝéÇwí?Âßùß/ż]=Ù*gzjTäŸ"iHĊ›bEٗô‰dÇËCÁÈy J­ê ó&0Ú´ysïŬ›ş?ú™'żñ_F>üȃżWˆĉk쁈“.0B])DO jÄX¨J(ÙĴ½(eÙ(ëNştŸÑĠjFh͌ÀZ˙ɕžßş" ’Ħğ/‚€ìIg‘ qSƒTL™ÎÖê\ÍÈT“29ĝŠëV³=ĝÄê(Ù>™(óâï:Ó^OL.zÙó ˆ  ħĴbaä Óy_”7 `R hŭ. Ñ|Š7ɒ)×´OKeĉzD ÀYG0ÊÜ J„éX JżoTè"÷,„˙ߟ)żúûEeè*ë1eNé™AJÊđâF]êAž„ÛYȰ™—`U$j²™söÁ*9MûŒ8݁Í –fıš͈óÊt4ÇÜ×O4ugž;²İvŝ™‡êġĈ,€úĂĵrö“?ßzéĊżß²Ğxì”>ä\o:Î)ÓY\L÷Ĵ§š;šQ²=A´Ä:B9o@ʏÙ5é„ıaoÓp$cĤäĥİ;Èh˙Gä•Y ˘ŝêk¸‹^úî`éòż We–QI?Í`IÏXÁŽ–Y²K A:˘C‡‚pƒ„·ô²Ú,irjŞ1TñOìùù3ßö<ż·r˙cŸP]ÛµşvU°MjĠJ2ċ ÄûÍ‚nİ#¤e:Î ½f5#Îì3JZÖr4£Ĵ7e4#jĦ‘ÑŒ˜û6MÀ–³/œĜ\ğĝôħs‡*µzŽx?>/ôÎɗwÒ·xvë7@%"²îkCâkdçŒ,'rÊt”:>$e:—qúœ“rÀˆÜ5HÁHËCÎòÁ¤ËŬÙ´fh ”q  '‰9!ĥäwħD}Ġ×°ÛĊ>Zĝî+o _”qI¤ˆv%;vÎTŠÒŬ²A‰`Œ×:§L—ûk6,Ž´ıêê¸}gŠ„ú2Ĉġƒ—fŽŬûÚóÓˊ*÷˙ÑÇ9%ÉDDaCrJ+ž¸`äœsĞ„ äxÓ%k—˜3âsFpĵéĴ“;›$l7Ù9£´›Niͨż0u[νp|s8öÔħáÉ•j­ `µÀ›‹#z÷ŭ·‰{<ˆ˙8ѽw∝2ĠŒ8G3JúÀC3J}›4#v4£´µÏ#óÜĜşš§úTj´GÖüÂ)·&èlZ‡ß)˜ú^Ċâ—˙èĞĈß½rxĝTFœıQRn2qÏr‹7JĞÜ+ ­-ĉSFÉn3ËĵÚÖA6ÁH{݆ÑÂáÓoß³·ß써òħ?~€ËÛ ġ:ИѨĊ`F2ïâ8˜}cŬÎâäÍe÷ıkÇí+9š2š‘;gG3²e:Êì32ôË× “obà½g Ô/îž|ğRİ̈rÉàÎÔCœ<ôӝŞÒÖĝKWş>#Ġ”šĉŒ Ô¨l£ƒ FH{L}Y3‚wÚ2]âsDàɵ:‚ğgŬRfd&›ôÑ5ċ>J5#&òğYƒÑÏŬôÚŭhöïßşôXÖÍi‚,€¨ˆv€dKw^&Ÿ ÔŞ"`×;ëDßİ`”ü3yšúšWŒ”“x$U—Şztdz螗ž~ŞLsŭ“O˘ĵêÓ–ħ"ğğÉn'£ì>#döQZ+Ê´mğKkFh£%‹(ŬpwΈÈcîß@˜:ˆÁ3ß;ĵ~aßñቃs•ê´UNh@) H5:Màûwôĕòoî˘8L <ôš>™tè•2sFìhFn7§ċÀ”K!Ї53#´`FV3²/yB"É/›2Ŭ+ĜMŻŭXDÓÏubäXı`ä~ċĵwu YP"óIËËğ$ÒOS§•éĜ!½öŝ…H;W݈™HħIÊaCĦrldĉĜ=/}÷İ "(ÍÜó‡{#ħ‘€(Ñ*ÍF3–7gDX½9#Z4g$|Ĉ† D“ħċÜ 'ꗞ:6`Oġ™pKTo\ùġ?z .ï ŞĠ٘¤šòS:‹Ĵw½é,up½éšì€¨Ù(ı’™3"Çùz‘fä”é@Â3`ôN?wd°qá;Cfç+Óً›|³€¤\69:ŬÉC?ÛyW=ÄfġĕÒŜÉ,Œ¨”2#³…ÂÙĦ”jF_H;yIDATĥÁĠŒôpoZĤ³žD”SĤ#ŒRw¤ȚĉŒ˜YQŒ^Žî ×~Déç; Žç Ġ0Š3Ĵħ`HE´$›PDJm6 u8éÇ,)ĦX€c—LŻ>(!”’š?62{tÏŻžz€+wŭ‡˘’î3ŜtÈxÓQS™.!:éĦ̀ìV…L-#dÁÈĠU`×Ĵ’½ÚhàÌ÷ŽÖÏghĝʁÙT3r™Q”aGö¸x-’0ÎDWè/ß~€ÍôÄċ`ïx!ŬĞ‘M—eFŒü ÔíŸĈ|5- R†Ùĉtx9ĠŒjF],… êиƒ^û15Ĥž;|jô,+µ`ŽC#Žâ˘\WD^ˆe”](?ÁRf„ôk§‚‘ĥ8²w•ZèHnâK5äÒìÑò/>=îß ÂQ Ğ‹"]jFIu(ĞtÎh;Ĉ¤Íšgö‹rĉŒ’žgÌ}ŭÄ3ocàì‹'ë÷ Ÿ°`ToF*Šdĉ˜ĜżĞ¨ÌÄWνsòċ“?|f 5zV5ƒQ#§T§ 0*b% ÉeIYó‚)AŻ0'Ĝ@Ô˘Y¨ÀÈù!Ǣ+XĞ—ÏusnÉ3ëħÂá‘Ù£÷ú§§|ċŽ?ĝxTÚF¨×™Y1™RvŸQ3ċÏ9Àr÷1˜I@ŸÖŒÎpr Û7t~ò­Ùù…9µ%Àˆ3'x*óYZtLFf˘+|úÔŝÛîüç7K—ŭûÁA†İg–×ÀB3B›ä60ps‚HbÓÀ 5£CĮ́žF²£",(y9@ô%–F&‰d³Û÷j€Ğ–uħÁH{6 ³HDkĥ½(5uä5˘X={éÀžĈ³á  Ëwüáƒaù=<ĞŸ;çì3r½é¸ĥûŒf´H3b£Q“7y@_/ñä[8ó½#[ëûŽ O˜ŻL!_3Šs˜@Ŝ+$3ĠˆĤc6:UİC?ÛyW#ÄFùÄeñÑ%‚ Ív@´ĜhñгAu`à0J͈iFê[ĝı֌êÓÏ:5v–U˘5 0*b5ÉeJ\€RD¤<ĦAɍN#@ÊK!ĵĊ-êëJMì ĊóG/ͽ—^|z„ñ]ô`TŜJ¨5˜•4ÍHu#ŒÌħ ,#Î ½’µÊь(oÎH70ÂÀ™çֆ÷òÖlÚÚŬ޵ê"˂RËżZS:ç] ܄'Ĉŭí ˆe”˜Ê:ÌÈÖ"“ĦW Ĵ d(8Aâ‚íĵRʌÈь,‡43Élĵé<­áĠSc:O3Ê“˘LWÄu$.@)/]Ĉ!ĠêiF×F‰fúïIğm= |İ=µ˘+½8;t/^|züàòí_ĝDTÚJTŻ'w™9£tíxŝœċÌQfÎ(q4e×Hĝ@˙âİ·ħċÜ §ëçŸ2šÑrÀhİěŬ˜*[•Ffâ ĵ{r˙íw â›ÄW.‹û "nĜ˜rĉŒ(U²má¸lSGÒMGy 9Ŝt żÌ’(ií.4£"֐€Ċ;K P²M žŜ1ÄQÜı`dÌà8F:²ßQ d5ı#—ĉ†î)ŭä™f\íóŸˆËÛ5()•€m֌M Mš™2ŸġZ°˙³ž<ĥ9€ÓÖî×§Áèì §ÂÑ}Cç§Ŝœ_˜AڀŒÔ2Gĥ|—Ż)MG|úäŝÛî,܏/]÷ ‚"ħŜ™Ğĉ&ċµ´L—êaí5#b[˘Ôíäf¤‹ßIJ70ЍšQëHné%@—êR–ԁ`ä´£qÑ&ßËO}kJyÏ>Ġ”ÎŒĵ/|.Ü*£püÖ/~*òo!R5†n˙NTJ[ğóöqfΈ2ûŒ² şL××G<}ï=wt°~nßä[Wİ] (µ”côÎáŸŜ~g#ŭò‰1q˙À4:8 ֔–Ó¤íĤ#§›.ëMçjFDW…fFĈ(ġ•èzíÇTŸ~ĥŒŠXo@² ä džĴÊq`àcF‰Ğ‰Ɍ ĝş’ÀâÁÙ$ÂXÎı0sl˙ôVĈn{ìSq9S2Ç”l“XìMg…„"oşÔ i`Œŝ ÄӇ0pĉı£ƒµsû††ŻĵyšÑJAİĤ42NàŬûoż“Á}üĸĝĜP‰ ‰QŞ£tŸQ2gÔÖ(•˜ér%gΨÛ̽b猞-4£":ŜïLiÙFÌ ä °âŽ#@ÈGä{FKZ29(ı!’éȅ™Ħ=ôŭ§·z~éò‡>˙‰°4HhÔ*ñ;ûŒší€£ÔE­ŬĴôk˙MÄӇħċì ï ÖÎ?5t~âÍ뤭”ÚkJÓñNŸÜûn"î_ı,îJfxĥi‹-µq` lƒMGéœQw2ôş‹^˙ Ġ§ ͨˆŽ$.Êw&b‡M›f„:ŒÜ@v^ĊĞò"û î@P"hHĉĉ†î ŝùéAĊd4£‘§†.L5;żà^Ğft5ċğ|Mi*šà÷ŜÙÛîŸèá'.Óŭ!+/a”şŒ9#f½fÎèUì˘_šQ H@s“ ”Òç$,œC FIêW€ï™ùZêĠYP’-˜Ş cݎžy{Oô|¸UĊáĝŽ?ĝtXڙKmÀkŜgd;Ïìşt퓓ĠŒ„§Ĥa˙çŽm­Ŭ74<ùĉ*iFWJùšÒd}ŒXkJÔ­ž§ûw0³ -Áș3"Ûbì€àÌšQHÙÒŬû”¸ ‚ˆš~ÏB€„é_êl02°Dò„½O^i™r•ÀjYsJa,+GÏÏ íÁžŜĈ £zìÓQ°¨Q3“4-÷-òĤ³`Œ Ä3‡ħċ̳C[Љf4ƒĠӌV J­5İpïžĜûn€{è‰qq˙R”Òµ­™Ñ2ĵé~Ô›ŒŠè8@z?‚ÒReĴÔAÍèĊ-W9t %éK;“k ëĉJĥÜ ×ˆ)µ ѐŒ#fïĦ>½ü`|ûç~ğQÚNhÔì ÊÛgÄbçŒÈÓ ³‡ħċì ïn­_ ­öqYĤ4Màô‰ŭ·ï&B7}eÜÛ3À(ɐÁJkJ­ÊtÍ`­QRĤ£şz-4£"n@şÑA‰—ñ3Î=w—fMİ Ċy˘ÓÀˆĦÙ\à•Lž1Ù>´,è=8-kNİ+>?w|OŸÙ ÂĜĥÏŝĥ.ß5›n:$v@5{ÓġġÏÁ–³/ĵ;¸ôĦ S.­…ft5ċğ–šŜ;µ˙ÖŬ]xbŒö °I¨“·JÚÀÀf‡§ pö½VhFE܀ô~%ÎeBÍċş4y³ìçċƒ‘›Nlƒ M`D­áÒµ˘EH–˙wĤdÇRĦy÷4/§t·ÖšRĞ“Ğ)É#ï]:|_ôb¸MFáĜö/üNXÚN\WÌPĈr ŬgÔäM—ì3z[Î<7´­vnßħó“oÌÎÍŻ‡ft5 ”Ğ)LÖǀ#?½ŭŽFˆ.ùÄíÙÁ˘L$ĥµ[·É/ÚgÄDA“7]Ħq’ J˘Ċ‹Ö8ı]/ĥÄJ)›¸MÂ$†sĵ(M0Ú8!äĴ:_™Qj‹bb+0rS)Ñ €uB!"…ÖŞë‘l²û”²ïzNéùé÷‡Ïlxtû~7,M)™v,tͨŸxúÎ|ïĝÖÚÙ}LJ'ŜpÖC3Z)(µÖ”&À‰ŭ;w3#à˙4Óè B]­µĥB‰ƒ£-šQï/@r“Hğċ~7[Z̘Y2sÌÌħb–,ÓI`›8ُ—âۀ‘ğÉ5›~ċ¨­ĉŒƒ_<ò}ĴËvA1KbŽ•RR)œÒŬJNx_‡lY,Ê\aÌ8|~öÄúÑw·’Wüì'`!Ô.á¤{7ôŠTáioşé#ĜröùӃġsû†ÎO1³<0ZïÄğ|Mi2šN½ĵs· ŜWFéŜAˆ²n 7‡Ô€“ß F…fTÄûŜ ´((Rʈ™ëq£ĥĊ*ñ„Ĝî@3O3X´ÀÜ FÔ¨²`DÖ9·mqš“›³sG6w7À J=ñlC݆R*RJÉ0ĉe͵bıËה†gßüë3Û46ĝÙ߃­„FYçMm”j˜Ñ–³/œh\úÎñóSoÌÌU:I3şšò]Ĥ4N§^ġÎR‰}|i”ïdèòÌx’ß½vüUgŸQĦħ~á­Á‡Gd>8Ô"íUPÎW÷{[r$ç"ˆˆşşş‚îîîžRİÔïШwfÁûĤĤʸ~CiŞäyİF$DzĞĈˆdşÜ׳ìϔÒôWŬžMVj"óPÔìiĝG_ëmü[†—ŞĠꕅ……ıJÒÈ9ûUmXzi)‹‡TMÎTf>ŸğĜŬ Ġm·Kï&,uğ{żmí>µúŜߜ}fvn2F ]Í1É=y˜ŻĊ5U›ßyóÔ´ôúwV0°áT òşĦ¨Żúóh·xġ‡˘1ùw‡N\8 Žç[tFE܀´PZK`juߔ!˜„Â+•J~WWWıT*uû½SÁ­ğ*²Ô/J%pà@ ÀÓĝà€´ġŸŝŜy^RB#@ĦRITà  @€‚’yD\@ĉ„˙VP)ƒ JF'ò<ßÓ·YtɎßŭĥ‰+ïöùñz½~iaaaŞRİ,ÔëġIÂ*œĤ¤·$Љıúì‡äùKŬeÚPíğe§ìÚDÔÓK<}›ÏDı¤™Nàƒ˘ 4– V*ù ’-Ñ­NÍ#<ùcĝco×>rKïÂ°qZ­ŽW*•™………jEħŠTĤ\ĠŽuJ‚"ÉPWĉê3·òĊK]=ÁĤúĈÛn‹+Ĝrĉùwnݝŭ։á‰7ĤçnÍèşġ|U6T}z|çĈٙ¸´ùyÚÔ×_}w/ŝяĤ{ĝĊ³Ì\EĦħÎáŻá¤•KĝzëJYUĤċ%ŽcYŻ×kµZmÖ÷ŭħ1uònġÒ gfùĦİšD׈R@†ĦX9e?)ŬÔêĥ|+ÓÌ 8ġ™cmtH…!鐣½MğrÈ:³aeU†Z˜ĉGx°wïċ(lœİĠjĠju^Ż×â8–9%şv²ġJ´Ki9JÈCçç‡îï~ċonnÔĉĠùƒġ ϟ™ûĠÔ\eÎ$ÚÀHŬŸßċhJ .N„—=˙½ŬqÇ/bóı~9|: ùœ=̵Ǥ(Óħĥg”ëÄÊKÛÖ*?ïV%:÷♋à{žç÷ööv÷÷÷÷ġ÷÷oêííŬÚŬŬ½=‚íżÖˆäĥJ=ŜB`İjD.îqÚĈ|üùš’QĞëڒ€eÔ×ċ_î)#ÄòRE£µZm¤Rİ\T*3óóóóĠjµ!Ì&Ħì×VšŻû–œ×Ç(™KÀëòİë×úxSÓçWĊÔäÌ\Ċ<—Ĝ$ŬµL×îŭl‡Ÿ9>€`ûFż&ïĤŞê­Ÿ™ŸŽ¨ažäŒŠĝÀœ„ßʚgµAİei.\`òËċrİğğğÜÛÛÛ×ÓÓsSOOÏĈRİ´)‚ Bˆ>!D•xÌì6GÀ\OÖn_‡ßäħgĉ‰02×cf•RU)ċ|E³FcşVĞM-,,Ì/,,TjµZ=Š"7 ÉL‚n§'­W²ÊVIĵ6ùړ‚&Ĥà’MÀò£ĵ÷´pށ{Lĵœ÷œ=¤ŒŠxż—쐓݆Ġ„·Úl)ïó. €Š8Ġj¤”ZPÖëġFı\ž‚ ×÷ŭ.!D% Q›L§À”#çúʲOĈ{Î\W˜Ìuif§"T]JY˘¨Úh4êġz­ÑhÔkµZh´#Ġ˘\×İšQ–­ıï›d½ÌÏ]@’ï³ÄÛjNÉ^,÷}Šĝ@2¤v%ĵµ`KîÙ$r9ŜlùÎà !üRİĝ_‚ AIxžQ@DžÏQ+P˘kH@ì“ÊxÒ%‰E)+")eEQCJEQ†a)âLÉ*ûU-Q[o€rY—yŬĵ R9ÏïFь†)y9ïeʜhÉǤ£">p€çƒÓÊSîzŸ·kġÎ~ġZ”ï’şÂBĝD$ˆÈ3ßğ%ğĤı&H×Ú %lŽ™)Tl˜’4 q‹ò\^Âĉ%ÊuÀ˜Z•] ‹VZ=§÷ÛçşŬûšrXfŜk\Dˆ’]ğ!Ç·lÊxy`¸dW—R J)ÛEhKy‰Qä0#ş5²íÛ*6²Íï[1!th˘r½ïÈyîyïĦNżÖ²|ç–4óމjqlŠ(â HöáÖıŬRž3Üġ&Μ]ĥғTˆpÎßksvŠvD×!áù j…ÀÄK\:= ó쳓˜ŬZZœäWż¤ħˆ"Ŝ׀d&HŻĊn0ñU|XÛژ"u.oĊ’²@äÖèU›2IĞr]C˘É‚°X÷iHy:ÑR›NMêĵFŭAHĵĵ‚*CDE€´[²šM+ıVĥÔn%†[úh]şË2(”Zı?à:3$ }énıŒ)ˆnÄRN‘h—LEQÒ BeĜcuô<–”m£m˜Rĥĵ¸\0˘ë”dVJjß·Ħ"™QDH@² P^%0­4ĥ+fAÉ-Ġċ ÇíÀèzxĝq›Ż+aKŒċµuŻçÙ"Š(ât>ĉĵYŠvĴĦĠġß÷eVBĜħ—l"#ĴÈY˘’a„@Ċ…ˆ VœHUĂĠ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×ûĵçœçüÎyÏ€&‘ĉ˘j9R…<:ĜOHÄɽ€Hà ĉËÂgĊyx~t°?üŻopĠ.$Çá˙ƒşP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"Ş ìôI>Ĝİ“ÜĜ˘İ™(G$@ğ`UR,À Ĵ@".À€Yĥ2G€½vŽX@`€™B,Ì 8CÍ L 0Òżàİ_p…¸HÀ˕͗KÒ3¸•wòàâ!âÂlħBa)f ä"œ—›#HçLÎ ùÑÁŝ8?çĉäáĉfçlïôĊ˘ŝko">!ñßŝĵŒNÏïÚ_ċċÖpǰużkİ[ÚVhßù]3Û  Z zù‹y8ü@žĦPÈ< í%bĦ½0‹>˙3áoà‹~öü@ŝÛzqš@™­À£ƒŭqanvRŽçËB1n÷ç#ŝDžŭŽ)Ñâ4ħ\,ŠñX‰¸P"MÇyıR‘D!ɕâé2ñ–ŭ “w Ĵ†OÀNĥµËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“żù@+͗¤ĵè\¨”LĈD *°A ÁĴÀœÁĵÀaD@ $À<Bä€ Ħ–ATÀ:Ĝµ° šá´Á18 çà\ëp`žÂĵ† AÈa!:ˆbŽĜ"ΙŽ"aH4’€¤ éˆQ"ĊÈr¤İBj‘]H#ò-r9\@úÛÈ 2ŠüŠĵG1”²QÔu@ı¨ŠĈ sÑt4]€–˘kÑ´=€ĥ˘§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcċX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´şW ƒ„1Â'"“¨O´%zùÄxb:ħXFĴ&î!!ž%^'_“H$ɒäN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉŜä²€Ĵ —‘·O’ûÉä·:ĊˆâL ˘$R¤”J5e?ċŸ2B™ ŞQÍݞÔވ:ŸZIm vP/S‡İ4uš%͛Cˤ-£Ġšigi÷h/étş ŬƒE——Òkèéçéƒôw † ƒÇHb(k{§·/™LĤӗ™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çŞTUsU?ĠyŞ TĞUĞ^V}ĤFU³Pİ ÔĞĠİUğİ6ÎRwRPÏQ_£_ŭ‚úc ²†…F †H£Tc·Ĉ!Ĉ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsŞfĴf‘fĉqÍĈħà9ٜJÎ!Î Î{--?-ħÖj­f­~­7ÚzÚÚbírííëÚïup@,ġ:m:÷u ş6şQş…şÛuÏê>Ócëyé ġÊġéŬÑGġmô£ġêïÖïÑ7046l18c̐cèk˜i¸Ñ„á¨Ëhş‘Äh£ÑI£'¸&î‡g5x>fĴobĴ4ŜeÜkVyVġV×ĴIÖ\ë,ëmÖWlPW› ›:›Ëĥ¨­›­Äv›mßâ)Ò)ġSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlpĵë¤á4İÄİéWggĦsó5ĤKË—v—Sm§Š§nŸz˕ċîşÒµÓġ£›ğ›Ü­ÙmÔŬÌ=Ċ}ĞûM.›É]=ïAô÷Xâq̝§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Ĉ>ŸzŸ‡Ĥ"ß=#~Ö~™~üžû;úËŭĝżáyòñN`Áċ½³k™5ğ/ >B Yr“oÀòùc3Üg,šÑʝZú0Ì&LÖކÏß~oĤùLéÌĥˆàGlˆ¸i™ù})*2Ş.êQ´Stqt÷,ÖĴäYûg½ŽñİŒı;ÛjĥrvgĴjlRlc웸€¸Ş¸x‡ĝEñ—t$ í‰äÄĜÄ=‰sçlš3œäšT–tcċܢıĉéÎ˞wç|ŝü/÷„óû€9% pHYs  šœœIDATX½VmhSW~NnóY“ĞKšôjµĈŻÄ~³B„â†(•DbÁŭpm Ž öÓĊ*2Ìvˆ(ŠÎ"˘Ôş’Uíj™²†ÑŠĠĤY›oŻİ‰ážw?ĉNĥùÑfçïsÎó><ç}Ÿs€9\DôÑäääÏD¤Q—Ĥiâ˙Zħ­[·’Éd"NGmmmDD¤iZSÁ‹Ÿ;wn°ĤĤ†, FbŒŭ€Òé´FDtûömóżĠÍĥxKKK8‹Uô÷÷CÓ´kı\Ž‘àÂħcÇt Ëò— ×뿎Ċb`ŒMçrıúPó µµuuĦÜîÜıC‹…l6Û§3E‹U8p€E! âÀöíÛ “ÉÀ`0œŸ‰ı\Ú@ €ÊÊJ¸Ŭîŝ‚¨ĴĴÜŜĠĠN—NR3ħ+V|œÍf‘H$°nŬşKñ˙üùóTUUEVĞġÛWħĉĉfÚğw/I’”û/Žwv ~•(Š€³3ħ†††­kÖĴÁ™3gàrıNDÀÒKSSSљXqqñNA Ş*ĉ͛×R'tĈ ĈŸ^Ċ/^ÜĜÑѧӉîîî_ "@ĊÚîînäóùżXccÚşş:tvvB’¤–×ñĵ“€]ğv}ÓӃT*…|>f&ĉóùvž8qÉdRĥX, ÒŭĦPèâéÓ§ Àô?dC(˘·)|ċʕïEiF<ç===–ŠD"°Z­ħx<ŝÚµk­˘(‚1ĥáäɓ§ĉLÀÑ£GŸ\şté=UUÁ9G$a’$чÙÈÈÚÚÚ*˘ÑèW‡*ŠòۜY‰D.ƒAòûŭ\’$x(âǏ'"âDÄ:D¸Ċb!Y–sVüÑ£GÒúġëiß}ĵİ݉#GŽpZUUñ\.ljˆ‚Á ıŬn^WWGßĵ ?{Ŭ†p8||||üĈR)¨ŞÊü~?˘Ñ(DQ¤òòrÖÙىD"AÉd’% r:ÌápÀívägċ@ u8dµZÉd2‘ Üétòêêj€ĵ^/żwï—e™ˆˆ^N7 ´qĈÏf•{öì)VUµlċʕäñx`2™PZZŠT*Y–éÖ­[˜?>ÚÛÛáp8099 ŸÏ³Ù ›Í†§OŸ6Ìj âñĝÙlù|ž-X°€JJJ0>>Î 1ĈXcc#Òé4³Ùl@}}}L’$J§ÓlġêĠXĥlYġŬğwß]çÜÍ9cŒ°İİ)pÎI–N§ÉçóáÁƒ¤( ğ|ù2{öì2™ Û´iDQ„ĠjĠÏʝN7(cÈċr "œìv;ġöö²Í›7# áĉ͛˜˜˜@&“Áèè(òùĵ<иzġêA³Ù Q™,˔Íf‘ËċÍfĦiBĦ ƒàœ`0`ppFFFH–ex½^„á_^ûİ|Ŭ†ššċŝŭûġX2™$½^“É—Ë…>6==Meeex< "–H$˜á d2ÉĈĈĈ>òäÉÈĴh÷îŬ‡)‰ ĵµµ•ñ%K–Ž;8cŒïßżŸĥmÛĈ‹ŠŠhùòċä÷û•7á~£ç˜1v¨ĵĵgϞ%MÓXoo/Ш¨`^Ż—bħ3›ÍLUUş~ŭ:Ün7ìv;JJJŜŸ“$œ‘ £ŭŭŭe6là×]cµµµˆF£Ìn·“^݇,Ëìùóçpı\0›Íµ]]]wçTÀËĞĝ}hhhUqq1tşżÌSF£/^ĵx´páÂï.^ĵĜü6œìmûa˖-ĦǏïaeiié¨Édú1ŸÏŸjooWßżŝñ—öħ*ÏYIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_AutoholdClear_420x420.png0000755000000000000000000013131412467662066022313 0ustar rootroot‰PNG  IHDR¤¤~LQ5 9iCCPPhotoshop ICC profileHǝ–wTTׇϽwzĦÍ0R†ŜğÀÒ{“^Ea˜`(34ħ!˘EDš"HPĀÑP$VDħT°$(1ET,oF֋Ĵĵ÷òòûĴoí³÷ıûì½ÏZ’§/——KÊƒ<œé‘Qtì€`€)LVFş_°{ÉËͅž!r_zXĵpÓ3€N˙Ÿ¤Yé|è˜›³9,ˆ8%K.ĥϊ˜—,f%f(Aˉ9a‘ >û,²£˜Ùİ<ĥˆĊ9§³SÙbîñĥL!GĈ݈ 3ıœ,ßħFŠ0•+â7âĜT3IlpX‰"61‰ä"âċàH _qÜW,àd ėrIKÏást–.ŬÔښA÷ädp&+™ÉgÓ]ÒRәĵïüY2âÚÒEEĥ4µĥ´4432ŭŞP˙uóoJÜÛEzĝıg­˙‹íŻüÒ`̉j³ó‹- €Î-ÈŬûbÓ8€¤¨o׿şMîò]9ñLaŠ€.+-%Mȧg¤3YşáŸ‡ĝŝuAœxŸE„‰ĤŒËKµ›Çĉ ¸i<:—÷Ÿšĝŝ¤Ċı‰ÒĝPcŒ€Ôu*@~í(  ÑûĊ]˙£oĝ0 ~yá*“‹s˙ï7ŭgÁâ%ƒ›9Î%(„Îò3÷ÄÏ H*Ê@èC`Ĵ€-pnÀĝƒ VHİ€²@Ĝ A1Ĝ ö€jPA3hÇA'8΃Kà¸nƒû`L€g`ĵ a!2Dä!HÒ‡Ì dıAP ĊB Byf¨*ƒŞĦz¨ú: ‡@ƒ]h š†~‡ŜÁL‚ݰĴ Ĝ öCàUpĵ΅ àp%Ü…;àó5ĝ6< ?ƒç€˘Š" ÄñG˘x„ĴGА ¤iEş‘>ä&2ŠÌ oQEG˘lQž¨P µµU‚ŞFFu zQ7Qc¨YÔG4­ˆÖGÛ ½ètş]nB·£/˘o£'Ż1 £ħÂxb"1I˜µ˜Ì>Lĉf3Ž™bħòX}ĴÖËÄ °…Ĝ*ìQìYìvûGÄİàÌpî¸(—ĞÀÁÁ á&q x)ĵ&ŜïgsĝF|7ŝ:~ż@&hì!„$Â&B%Ħ•p‘€’H$Ş­‰D.q#ħ’xŒx™8F|K’!é‘\HÑ$!iééé.é%™LÖ";’£Èòr3ùùùEÂHÂK‚-ħA˘F˘CbHâı$^RSÒIrµdd…ä Éë’3Rx)-))ĤÔzİİ“R#RsÒiSiéTéé#ÒW¤§d°2Z2n2l™™ƒ2dĈ)EâBaQ6S))T U›êEM˘Sż£Pgeed—ɆÉfËÖȞ–!4-š-…VJ;NĤ½[˘´Äi gÉö%­K†–ÌË-•s”ÈɵÉŬ–{'O—w“O–ß%ß)˙P §¨°_á˘ÂÌRêRÛĴEK/½§+ê))U<¨ĜŻ8§¤ĴäĦ”TtAiF™Ĥ쨜¤\|FyZ…˘bŻÂU)W9Ğò”.Kw˘§+é½ôYUEUOUĦj½ê€ê‚šĥZ¨ZZ›ÚCu‚:C=^½\½G}VCEO#O£Ež&^“Ħ™¨ıW³Os^K[+\kĞV§Ö”ĥœĥ—vv‹ö²ŽƒÎ[ş]†n²î>Ŭz°ž…^˘^Ŝu}XßRŸĞżOm`mÀ3h01$:fĥŽь|ò:žkGï2î3ŝhba’bÒhrßTĈÔÛ4ß´Ûôw3=3–YÙ-s²ığùó.óËô—q–í_vǂbágħĠ˘Ç⃕%ß²ĠrÚJ*ÖŞÖj„Ae0J—­ÑÖÎÖĴOYżµħ´Ĝ·ùÍÖ6ÙöˆíÔríċœċËÇíÔì˜vġv£ötûXûö£ŞL‡‡ÇŽêŽlÇ&ÇI']§$§£NϝMœùÎíÎó.6.ë\Îı"En2nĦnĠnÜĠÜÜ[Üg=,<ÖzœóD{úxîòñRòby5{Íz[yŻóîġ!ùûTû<öĠóċûvûÁ~Ŝ~ğŭĴ\Á[Ñéü½üwû? Xc &0 °&IiP^P_0%8&ĝHëçÒûĦ:Ħž0ɰè°ĉ°ùpײшu×""ı‘]QĜ¨°¨Ĥ¨ı•n+÷Ĵœˆĥˆ.Œ^½*{Ġ•Ġ ĞSVŸŽ‘ŒaĈœˆEdžÇ‰}Ïôg60çâĵâjfY.Ĵ½ĴglGv9{šcÇ)LĈÛĊ—ĊO%Ĝ%ìN˜NtHĴHœáşpĞı/’<“ê’ĉ“ŭ“%J OiKĊĈĤžäɒy½iÊiÙiƒéúé…é£klÖìY3Ë÷á7e@Ğ2şTÑÏTżPG¸E8–iŸY“ù&+,ëDĥt6/ğ?G/g{Îd{î·kQkYk{òTó6ċ­sZWżZ·gƒú†‚ =6ŜDĜ”ĵé§|“ü²üW›7w(l,ßâħP˘_8²ĠvkŬ6Ô6îĥíĉÛĞĥ,b]-6)(~_Â*ıúé7•ß|Úżc Ô²t˙NÌNŜÎá]ğ—I—ċ–ïöÛŬQN//*µ'fϕŠeu{ {…{G+}+ğŞ4ŞvV½ŻNĴ]\ÓVĞXğ½v~{ß~Çŭ­uJuĊuïpÜİ÷¨ïhj¨8ˆ9˜yIcXcß·Œo››šŠ›>â=t¸·ÙŞıùˆâ‘Ò¸EĜ2}4úèï\żëj5l­o£µDŽǞ~ûŭqŸ=''ZüĦĥÒ^ÔuätÌv&vŽvEv žô>ÙÓmÛŬŝ£Ñ‡NݞŞ9-{şô áLÁ™OgsÏΝK?7s>áüxOLÏŭ nġö\ôıxù’û }N}g/Û]>uĊĉÊÉЌН×,Żuô[ô·˙dñSû€ċ@ÇuĞë]7Ĵot.<3ä0tŝĤëÍK·ĵn]ğ½âöàp蝑è‘Ñ;ì;SwSyoáŝĈèEVXŞ @eeĉ/żµ×PİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JRİT*•JuŒDş TŞOä¸ŬL*•Iş™•J@Rİ>–áFŽùˆßWİôTİô8ĝPÏ6˘`RİH*ĠQŽşÁc„ŽQ0İT $•êÀ裀JnàñQ@R)TŞc²ï_ï>ŬàħsTċJ@RݎŒnèıZ­f Z­ ‡"ŭ~Ÿ'À2 6G}N:6 u¨FGúšƒˆfggƒÙÙÙ ‚ Š"cŒ!f–4M³^Żg+• ïììĜÒÏ _3"ŸĤ<§R)TŞc£CïWĞUÓl6ƒıııêÌÌLÇqlŒİcÈ: êġú`ww7‘dww—Ż*ÁJĦ¤R é&P)ŒĤˆĤÀ(l6›•f³9[Ż×›Q513D0sb­í„a¸cŒé031sÚív-ĈCr2ñ˜&î+”TÇVn•¨¸™‰0•J%h4áÜÜ\µĠjµfff–ĞĠê™(ŠÎûġßü­_ŭò˙üÖ˙ġċk$c"YÊïX²Äa*•Iş `t#· Š˘`vv6jµZĠıııĉÌÌÌJÇç˘(şgġ×ŝÛßı˙ù³/gË'Ï]:uÏŻÒż½²EÀc1–ˆ2f3#MSÁáY{ %•I7ê˜Áh˜Ì4‡EQ033ÍÍÍ0ŞĠjç*•Ê=§ïùĠßùï˙ׯüAV›İ,Î/6·OŬu7~ôÊ6„Ċ“c,+"b­E–eÓÀ¨PRİHŞc#L•`ÎÌÌDÍf³ÚjµZ³³³ËµZí\µZ½÷ôŬżò;ŻZŸ‰~Úϰǂcpŝäríòİ;ÏGßÛf;%ff™€Òġ £PR)TŞc#špFa½^F<77×l4ı3ş÷Ì=żúÛż=ü{Q}&zk/ `Ìp×évíÒÊgċGßہˆ%˘1(Yk%˲iá;]SR)t¨FŒ‚0 Ë0j5ċz½î`tïŻŝöŝÇŻ~>ô0ê§ a@DÀ`Öwžn×.­|ê~<JÌ %6 %•IşÍadü1`˜0 ƒz½ÍÎÎĈsss­f³ı\ĞĠÎW*•ğWïŭµßŝ?ŭêïµ™èͽ ƒT ‰ €0`I áÎÓíĝÒʧÎҏż·áJD”y§kíġ¤PR)TŞc£â~†A­VĞ4¸ĠjµšÍĉr½^?W­Vï^½÷×~ûĝÓŻ~.ĴÍDoìe$3³"<@X– 'WâV>u?ùŜ.A,YcLÀ`k­XkċżBI@RݎŒŞÍf³ £{ÎŝÊóÛĝ§_ŭ\™   fħ!ĈSX­”ĞíĝŭċO­â')AĦ¤R)T #†aX†Q£ÑXž™™9W­Vï>sÏŻ|ö˙ì˙ĝ\P›‰ŜèĤ êb‚Q`œ !$ò_œeJDYàĠvüŜÒĞĉĠïïNB €U(İT $Ġñ…Q‘ÀPĞĠ˘ÙÙÙ¸Ġjċ0:[­Vï:}÷½Ÿŭҟ˙Ġç‚úLônß"AL@@5 TˆP!AdÈ߀€€Brn) İİÜqĉdüÁÊĞô“ïïĝ]FD@ĤPRİHŞ £2ĦÌßʏ Ù°ĵ*îû×sYvŝż)Ĉɒ} \8ê”Ìk %•IşU`DpRĥfÔK1LĜµqiŬD ŸŽ-9DPЇJĉL˘´¨Ìĉ€rĦ·<¤7 ġċîˆÇ× à&È`yôz Üqްta5P§¤R İT·>ŒNz!ž^íÈĴ òëE&7'ŝ”>Z“ÂŭäH9‘ ħ‚” 2ë ”BFàòŽ(CÙeI# hâàŜ_DŬ°°ğÔÉx}E’J¤RŬ²0ŞVĞwşóžÏ>—ġ9SoDŻöR$İ ’ÒÌò qŝ#â;t{ÇF) $ìÜQÊ£û9°’ĴwX,TdÛċI œ7eIùŻJ°¤È 8úd|yñÂj†BI@Rİn9óžÏ>_ûÍ4£W{)ÒÔ½†€ AáŒÜš£"r7”XA"àqp­Ħp< …ùòŸe c‚v?C€ċĵ…Pİ>İĵH`ò‚' —f‚ Чâ5…’J¤RŬz0úÒ_~ís˜iDŻġ2X+n½È×9k2Ê˘³Ċşs%ı Jĵcòùp@òO');*úċdÈA•²•@FéáQV˙˘”âĉĊ¸$ÈŜ)_ Ŝĝg…’J¤RŬì0ÊtToFŻv2 BvuF†ò“~ž°Żù¸5›D—×yܽĵ³BQ, wżPŝé|áĴûa‡S)+ŻzIiSÄ%:ĝ÷ 0H\¸ÜÉvĵ|‡:%•IşùaôµÏĦֈ^ßËBñóÊ}Œ,ïš`!ÈĴƒQDŒD¤Ì•Dä¨DĈ­ġÀZ×ÈÇ烙{M¸&ábm BEšy ÑÍ ûƒ‚À…SΝjÇë‹çWƒ7Ġ)İH*ĠM £7û’BtĤDöÉŒX0äñì·²Ĉ`ä×vŒû›ëĜŝ·‹0{;"Q…(Á‚°äÜòa>)u9.†[—*ÒírŸDTüÒäRb—˘ž0pîôİxŭÄ ßİH*ĠM£ğîù­ŝâkż‹™fôF/ƒxgĝÎ nìƒ@^“z%| ‰ü[ċc ’­5ìüà%ĵóĝßmËğ?^û ˜_\¨ğŸÍÙC£÷/V£xü}Ĵ/˜…¸´oò?C4‚Ħ1Á°kU´— Ν<_YR§¤R İT7ŒNŜqço>ĝ•G>™fôf/ˆ c·c€…ŞF,ŠĞ!Úç†òûŝĞñpŒ!˜laë_‹ŭŭŜZŠèòpoŻoÖÖ{/˜mœXœL5†1Ĵ—ô0F“”°ĊܤQǸSÊoĈĴwvЧOĈWÔ)İH*ĠM£‡ùĵÔÑÛ{ˆá¤ŽŒIĤËàk‰ÄÁȲLòZ´ôĦ<@çœJ˜€0ܸŒï?˙ŭŜZ 䇽^ïŭápx…‡ŭŬꕟ.EÍĊċĊĊ€˘*‚0]ży´&5ñžċÔïĵ›ƒóBı+#Ÿqgˆ`HŠ~{L„~&X=ĠŽŻ,^X Ġ)İH*Ġ/FġfôVÏgӉĞ3*^ĵ€‘Œœ;#™ÄQɝ€0„ 4 $×Ö°ñŭçñ“˙ò˙m-~ÓéüĴÛí~0 6Ó4íJ2ìÇ—†—*Íċċ…ad9˜™™9—èŝ›ÏK½½ÙMA5£Àä}áÜşQ&p…,0#ċi*Mv-gÓ`ŒqéÖ[—ħ~ñYĵöĝc›‹F^êt:?ít:t:N§³; úY– D$%"k²4İmü<ı\™[Yœw‰drğIhŒÊ!=›÷·óá;Êċc‘Fòpž ,Zúİ`ġôİĝêâùĠ-…’J¤R}â0âÚlôöž ­™’3*şq³xg4‚Q1ċĈëŒxmaŭâ³xŭñÇ6 żívË0ê ƒ~šĤCfĥ"’ŠHFD6°Ù°vġ½äRĜ\>ħ´RTġYtÉy@4Ž%…wüïP’Ğs"ˆd´1Y÷ïû)ÌéSÎ))”T $•Âèc…ÑÙjµzw#[kDïìY°eTPÓù‰Ĵ2‘²``hÒñDQžÀ`pm W^yŻŭc›'"ĵívßít:ìîî^ívğïŒRvÊ<”2YcÓ¤~íçÉûakċÄÒBHĠ*ĤèÊ Ğċ˜”˜2‘Âs˘€ÖAD`ü Ĥ½”qĉT;ştAĦ¤R İF?Œŭĵ­5£·÷2ˆeD“0Ê ^á`4´n]e`÷‡è0éŒòşC0Brm W^~Ż˙×7ODxĦÓéĵÓétŜït:W{½ŜnżßÏa䆊Xa˙8‘ÌcM–Ĥġkï ߏZ+K‹ Ħ‰c;€äo.eR–ŠùÓİĝv˜$ıC˘"›­3ıŒ† oÓ'ÛñĈ …’J¤RF& ŭĈ}ċ‘Ïs­Yy{ÏeÓEù,#˙².µz4*bèëŒú™`úÙvÔ(5onjŒ€ ƒË¸òò³xñÇ6ODĝn·Û-`Ôívwûŭŝ^F(F(‰ëĠÊÌŜ)ċkJiŭê{É•ı•…ııTb ‰p?c³2bL$ßh>¨pNĈ˙>y²¸ÁŠ`/œ9s*ŜJ¤R}t=ĝ•G>/³­Ê[Ŭ iŬä0šÈĤc­€Ĉa$cŽ£˜ÔšğHí& Ż]ĈĠ—ŸÁO|cóD„ïx]êt:W|^–eÉ$Œò›‡‘efÎ ›1Ĉ…ï6ŜKߏš+ 'CSİuNyˆŽ …ëòϜ?Lüì¤ĵËMts¤Ĝ.°nÓ cç”έ†o˙ĞBI@R)Œ><Œš•·:@È<êÚíĜOpÍüĜˆĦìYah˘ħéX˜Ž2A@0^[Ĉ+Ïá'Û\Žh FŬnwg0ìišZkÓ„r0ċµ­âĦÄ%§TĴ)Í\ğ”^´VĉĉBŠ\›!ħÎñLú9–ɝ›ÓdÊIF?Gyv Ü\%"BfƒTpzġTĵħp~5|[’J¤RŬŒzäó2ÓĴĵÙÍ.MzÍMXĈêŒ €ÑĜ žJ€"‚ñaşáĈċI½Ŭívsg4 #[Qù–û›Jŝf‰(-6ŜAİSKÁĜżów–˘¸£*òZ%ĥË´’‡Ñ2NlǛK %•I0ş1gäa$pE݁È0Aâ‹^ûV·<Ñŭ`t:/gÓıä… tR‡—qċ•gñĉß(`ÔétŜ+9£~’$IÉىŻû€4%+"Ö;%66Mj—Ò˘ÖÊÂÂ|ˆ0vàp A`ö1ÉÂŬÉĜï$p‰)u!9$òŭò?†X÷áú,8y²o.iĝN@R)ŒŽ#žġÎHàDÜ\ ĜšQjŬ£;g$'íœ^E£Ôĵó‚Éïğ:£+/?‹·žüĈĉ‰ßéġzowğŬŸ{g´Ŭï÷÷’$–œÑ$ˆìŒĈî;&á;FĤ”%IŭÚd­ÒjÏÏυĞ0Ĉ¸ĥBY2­Ğ‡TʍWŭ€@äġ·DĊ'!ĴôSFûT;Ŝ\8ż½ó/;(”T $Ġñ„QR ›Ífí0½ĠÍ "ˆĜ%1äfĦpF~lDÊ@Ÿ{ĥÔ(UĈC]ċñ­‚À8m­áê+Ïá­'Û\ݘïtğŬ·şŬî{ğğğe%ÖÚĴĤ›ĉŠÊ_‰ù~kJ€5ĈĜÀĤIm½t­ÚjÏÍχˆbßóCŝö%9HŜdJ…óò?GŜq|'Ŝ%ċÉ.Ñaóŭôré TAĈĝž|#¸°ÔZ%H˜Ŭö˘ÑŸh<œç³òòí•z£}êd)ÑAĦ¤R İn]•ï}ĉŝ›/ÈLĞòF7[7B"kFyM·²‚D€eìñô0LqF 0£ Ż<‡·žĝĈĉJ…ŝÉgÓ0ê÷û{ápš3šĉŠ̲›¸Ÿ2‡RÉ)ÙÂ)]ğ”…ÍöÜÂBHaĠ…ŭşÙdwħ%żN–ˆĝ.%aÔ5äFVóĜ:(m-œ_ uMI@Rge3ÍÊëŬQ†£˘Wĝ+y;–ÀàtSNÌ#$Ja:£ts W_yo?îœQ£N§S†Ñ0=F< @SîÍKézÔl7çĉBS­ı_Ĉħ³ƒ&~ç҃ĵ&‹|B8ùDšĊž×fÁ^*X9y2ŜQ§¤R ݎ-ŒêÍÊë{Î(dAèkgÊÙt.µÛ7JeAŻ£ƒÖŒLÙ~ìĝÖ6^~o?ñĜĜšQ§ÓYït:“0ÊpšÑäëı˘i€˘RöLBİvíRşz(Ub׉KˆĈ`TnËċ:Ҙ —pGŒòaÄp£+2ĈJ[Ħ¤R ݎĞ3êe€îŒòÔîIMεk TÓ0!!ɵuĴżômĵóä7Ç֌ĤÀ(™ĤğžCşn˜˜ÚRïP(Ġ7ßO×£FğÑj…a­2Ĥ[!ıM’ŭ]Ìó5µĵ!k9ĵ˜@ëCvDbÀżĤ4´X>y2Ŝ^ş )á*’êĥ…ÑjµZ½{ù܅ÏüñW3z­› TFİ(FkFâëŒdߘ†r¨Ê7†sß5è50„áĤwFO~c³]1yÑġ`t˜C:(›î0 MŞœ}‡ tÒj7ĉCĊ€qırbıx…ħ¸i´R8%K/]‚ X`ÏËË+ñÖ …’J¤şÍa”Ö›•7ö27éU\j·{—MgŭôÓF}ìeĵïlž;žü°Ĉġ ƒÁĉ6ż˙Ŝzüë['ĞÁó½^ïíN§óóC`”âŽĤ­•ïc ĤBhr_Ja³=Ûl…a£ÜûHˆÉ“?dêğ%,|òŬ¨£Ci Œut/c,Ż´íĊóĞÑğ %•Iu›Áèú7_ÈjÊë=[ĴĊ „Ù'0À§v`´Ê+Ĥ„é\J³!ÉÖ6_yoŭ×·NVƒïtğŬ·>Œ&3ëä:Îèz‡…ÒĠJ³=ÛjıÑP €°/}BJnSģΠ9”Š,<‰ ße ìYFûäÉxkQ’J¤ş`ô£_Hë­Êëy; FiÍÈÁ(ŸôšhÀ‚^ĈSĤĵĉĦ*Ğ32ûBıÔîĞŸĈ;O|}ód>˙atĜš!L'G8ñJ—Ò+QĞ=Ûj…”×)ù&³œËsŝĜ‡îüÓ)—֍|ïŠü^ŜàĈĦ˙·èV’J¤ş½`”Í´*oôRˆ‘L`}0ê³ ?£i“^Ŭٖ`ÈÀ—Ä0ÜXµ—ŸĈğO>ĥÙßùaşÒğ‡'2×_Cşq(q–Ìl]JŻTĉÚġV˄Sžà0ħ)m‡8ò'#[UŒE÷icPÔ1,{™Ċ҉•x{ùÂjE’J¤şeaô£_HgZ•×{)Ĝ‹°gÈ#‹ìÓùŬÓNo2Ñ(5ŻÑ1ÁçŒĥ÷Ŝ~âħ­“qĝüÇ£iÉ GqCéïq°Sʒ™ÍKéFu=Ûh†T­ p* ?ĥh/4µ Ê /tó”ŒsF.ĞĦÈĵ3#>„`Ht‹vûTĵ=nµòÓU(İHŞ[ F>ôh‘ÚͨÀMz àOëp0ÊÄ'0°]ğıèt=~ÏŒ_̧ÀEŻkk¸ö½§ñΏmŒ?ҚёFKàh™utL9 _ß)ùŬL£šĜ§„³€­ÉİFÏ8Ïş3nŸwMċZòĥÊ!c —Y,ŸlÇ; V+?U§¤R İn%Ġ›•×öF0 Yü•·‡KQg¤ìJ0ş^£TsEĈÉÖ:½ò4Ŝ}â[§>9ñuÂsv›8(m]J7*­v½Ñr“gÙÍÂ݌Ò ŭ D\@¨XŒGwħ<#c6@/,·ÛñÎÒùĠÊğê”T $ĠÍ£‡ŬšÑн Â@µ4\/‡KF‰‡Qß²_ˆß¨çNšĈˆB ŬZÇĈËÏä0zŜ×û¤at”5"ıŽúX tµÒl×.ûŽŒ)=ˆÇA´˙ƒ3R+İßŝóµ%'`„‰ ;Ìpbıï,^J¤ú…ˆü>rdg”Ö›•7z˜òFİîüTŒàŒ2/Ä´v@.Lg:0„„ds ›ß{ï>ŝX£·:ÎÏ~0’#nëÉ0ŬÇÙ­÷Ӎ°ÑÏ·B×a`ÜÄYˆ¤pL<µb´Ebĝc#‡Ryê,ùìş;#Àuw’L6×ħùÊ37Œw’ŭ…CİħŭAş5ÛµF+4q ‚X·ŭŠ:‘ÁX.žÍ{ßċ Ĉİşsf•@™À’ — —–óĞĠŸ)”T $Ġ/FYcú“Na_gD„ "*hèQıÎh<\7ĤŸò ˜€l­có•gñî_ß>}sÂèFO¸/”lš4v”âF+¤¨ĉSäe4ÎœË YÇŻò?Ĥ˘Ô^RN|¸pĴe “2ÛíxgQĦ¤R İ~0úŠƒÑ=ŒĈêŒJóŒF0bìY×#ÍbżĞ‘ ˙ IDAT3‚(öeŠt/3J`Ĝzċ9ĵóĝßmŸİ…ßıI`$×9ħÒ/JµÙf(QĠmgvkJÈ·-F kËcÑĊ'›ŸM%%‡”';ïV‰]!è ‹í•¸³x~5ŝùv˘PR)TF‚8Ž£2ŒêġújnjҙùêOş Ä€Pò‚Ġ’3ò#$†"è[Œw`˜h%PNí&Àׁ!ÏĤ{ùĵóĝ×·ÎÜ<ÎH>Äö˙…BéJÔh×[s!˘1€ £2ïrX@¸ì;Áƒjˎɕ“q™|B–Yì ‹§NĈğ çJ*’êQ½^?FÙì|ġ'yo:߈J'7.萆rj÷ĜĜñ°¨Ü(µ€QĈ£ vİŬӜQ¸†İéöĥ^~?}âëÛ§à;· Œn"§ôAzĠ4ÚqĞR­—Jx‚ \üoJM|Oğ2”r v&Ĵ+ ÍX°—ĉÛ+qgŝüjüž†ïT $…ÑÇ£‡½/kÌWÔġÙtp·QÑëx£ÔF½ët`<›Î÷Ps½éœ3Ú¸ĝ4~öĝßmŸ…·2Œn(u.§WM£]m5CŠjĊ@²KŸü°˙Żß%܅íòŒğJùZSÏҌÑÍ '–îÂyuJ*’ÂèQ:3_ŭq/ġİŬ£0]~~t Iê$ŒëMç g•߅!Ŭ^ÇĉËÏà½'}ş}ç&Y3ú$˙Nż0(µş—ÓĞ4ێÍPÂBÉd\ğ!"šfeŭäY Ï #TLù-†úùħyA-ˆşV0ż´ïΟ[­]R(İHÇFe}4ÍÎWÔM]; —Âty£TŸ*œ½N:£ÉázĊ|=? .ŒŒïÚ½†­WžĊÏK0êvğ?żn!(­•f;ži„T݁ˆÜßJĈ˙FHlŝ, Î)ċCürċÁ}šŒÀ2û‘]+˜_\Ž; %•Iaô!`ôÀŜ—ÍÎW˙m7µk·K톟Pš'0ŒŠ^ûâ֌ì”Tâi & 5J}ùĵ÷äcÛ§°€ÑîîîÚm£›Jğ—Ó ÓhÇÍfÈQ Ĉ·q|_Áħw.Á(wKyĝΈ¸Ôo&ĝÚ% |·v÷Ù ş cawZgWK?ÔâY•Ia4FFciffĉlF݇[  ŒşvE6]Êzy6ìӕ¸]†—ħġò3ĝù“_ß>SrFğğğë·Œn(ġÖÒ 3Û6ZĦ„U˙CĊĤhçÀ"S·ÎÀú5üíLŝ!$n’!˙z 0 v‡sË+qoŝüj|é %•Iat=ä`ô^Š,b*Í3ÊSğ'Ú%LWvFd\é0$ ­aëċ§ñŜ“MƒÑĉÙ[F7”˘FğÚh†ˆjȆÀ™o%Dû·Ny‰ièÛ >Œ”fVı Ċ 6etSÁ܉ċ¸7wn5~_’J¤0ruFy; }Îè‡ïŒûRğ'{Óġ&tS`dàÂĵÎh[/?ƒK˙xC0ÊnŬ4PšëĴעfğ2;š¸A,ğùUâZm–ÑFc`ÀBĈgÙ;!ċ‰ù‡p wÙ ş˜[YQ(İH £`ô£÷ g\j·ÍëŒDÜâ§ğÙ)ÎhşH“ï @ïÚméÎ:6_z—ž|lç˜Âèĉ€§É\çrz-l´ƒZ#4q½ğ’oÌ꜒ìÛRìŸZëğûd‡bŒ…˙ù\,²Ô˘;°˜kŸŒ{-…’J¤0*ÁèK=r_:ğPŭQ7³_3âR£T\?L'Ì32†ü„7ïŒ !ŬZǵ—÷˙ñ;gjá?cŬŭàs_ÒZŒ˙u7˜QPçŽÍ5ÊĞî9Ÿú*‚D\ÍQv@CßlĠ‘ÏĤËĥ×ħñÒSXú@u§ÀÈ*Œn(ġ×ÓíJЍj= ku@*Ôo)—&Á÷X… bF0 O>Ïĝ‚Z§Š IkÛ ¸' gOÏĴ˙hǐBI¤şaôƒŬŒ޸. ĦO·5zGçŒ|f8w”0·2–ÀPÎĤ¸°KPàRğ7^| WĈÑ{G€QvHˆNat³9%:U¸‚g£n#6ı}ĤZrHA)TxŜ%1 öĥvìì&èìħÛg˜™…Ż\8£PR İn9ŝôƒ˙í}ĉbü/; $Äâ:wWȵn)`$£+YÎa$~úĞŻ?Ú#qѽÀÀ9£ŸÂĠo­}XM[7:î0şi ´_O·‚† ßĊ5ÀOž-ĈŸ—`”߈7˙*„_O2.t—ZAݟağ“`w/Á0°ˆd Rkħ—‚Ĉ‰š=qŝÌÌ…’IuKÁhàaD"¨Á5K }ˆ.Èí•Îòĥ(„u0JèûĥAR*z5DŒĤĤ>áê·żµ}ş~wF[0²7#Ğ0şıĦ$µÙ0c 0 ñÓg}Ñk‘qç­VB$NIĈèġ3luRôúÒÌEЏ/¤5ŝ> †‰E?‡Ò’BI¤şYa´TŻ×]İ3ŸyĞ{ß°µ˙ËK퉃Qd€(_<ĤÑxjëQËǑğÎ R$0ˆ‡™€`7˘ÚMz]ÇĉKOaíéoîĴ֊Ôî`4™ÄpPxNatÓCi-Ŭ›mŞ7\ö-%6XñĦ<·Ÿe PĈè÷3lï&Ĝd°ÖÇq‰ >LùäYb÷˜D$EÈ0š]:föŞBI¤şyaôż˙í}ŭĈBüÏ;ÄrĤ‹LžM—'1`”–+끔Žı#¨É DF!Ûş‚Ğ/ŝ#>ó­ĠZôüŜÄĜñ½½½^’$É!ġ'1ˆÂèf‡R–,ì­Ûfĥ-µÙTênÚl†Ñ<%+ĜëèlöÑëĤ°vnŬHüWeÛù›ĦÑxtCĴ`1†ƒ ÁìRÍ._83ĞNI¤şù`ôÀŜ7h,ĈßßMÁ£&@lB˘HŒJu€ŒĊ%2ˆk4dŸ]—7È4îd„FÉĉzFß=Fµʎ#VŬ"PêŻ[ĤÙĤ™ÙP,„a?Cg{ˆÎöé û䘔Ì(ċÛ\–÷ċÑ}S皌‰ ?´H@ Ùš]ŭ͝Ġzċ…‰ÔîIe £ÛJ‹ƒġtÇ4Oîôt‡!{B°\ĵ‚HĦ9£<ıĦè ž;#˙5˙Ĝ…` ziÊZ+Jê”HŞ_(ŒZ­V£Ùlž(`tzġ3<ôè}։ĝâVa B ˘£Ŝy[K76B\š·;Ğ ġn(‡Qß?6Ĉ9)ş¸~ìÎ\ŭúô·r½Ħ0R(œ%­ŜûM3ğ’" MeĈíu2 ߁#FAî’Fż a LĈO÷sa;)Ö>Ŭša/¤iJ $Ġ/FFcFÜ7lˆ_Ŝu“^kÄ*ïÄPZûü‰Áˆáܑ-ğ# X0”|΍{ ˘(@ĥsWž›Ïŝŭ‡Ñäš+Œn/(…°é‰ôj²Sida%4Ñ „ó0œï3DâBvd·ŽDµ#“rCÇĜsäà7˸ğ—!K&ßmhĝN¤úĊÂ(Óµ–â‹Û)²ŒQ‡Ż3 Èġ¨ËnŒFGêœ3²>qÁ{3욨&ìĈ{Ry˜Î;£kÏŝŭÎj-š„Ñö`tXz·Âèĥ‚Ò•dÛÌda5¤Ê,@’ħÛ Baä3êż–D4#ŒBweAEÁ ³—Â2@uW§¤PR İ>Ù0ŬR½^?7–À\Š/nğ5v0Ş ĦşFâŬ‹5G6Oh(ugHüD ŭhCÈv3ÚxĉïwÎ֧¨û`Ä £ÛJKÙĠd;hĴXŞ„Ïú ×ŭğ(Ċ(Ó.‡R·'ŸŻT„ï€îÀ²…™ñNéšBI¤úD`TĞĠΕ׌ÍĝċŬ‰ÔÔÈ·f)ˆ0’Œöe׉ ×eâ0Ĉ éöşsFOkçülġ¨0² £ 6=‘]MvŞ­‹(¤êL1ԏdùşQ>š˘”öÒäa”ŬRéÍ c öRMfÖŻ)İSR éIà‚Ñİ3ŸyàĦGïë7—â‹; ú)cäÂtp GżÂ”ÑşQ#”’€ŒÙ­A`…0@à`”mŻÚwŸÄµgµsnĥúBŻÛ}óˆ0ÊnF˘0ş}Ħ´”^IĥĈŠ â*u1„.Ë._G*rŝ·ïI¨•ĝŽƒ%÷vµNÍċš]P§¤@҃˙c‡Ñâİ3ŸùÒWŝúÁ܉ĝâv‚3fò0ı ?X£rŸşŒ,—ܑϤ³kHÈo’!ñ$6žqÎÈèg £[~ż¤î€w½“ïќRĜ\ħA%DXB(.kÓf|ÚZÑ:!PŜNHòġ¤Üm‰oUd@pĈègË S_ĴÙ %’Âè†Ñ°µ_ÜN°—2j ԃĵ%yw4#gŠ{\ ĠYž+Èwe ‚„.áÚ Obóé1M&0$ÖÚàs#Ħ9Í/Ï%Ŭx{mfñTÀJÁ&KٕtÛ4VlP İRCrëH,.İÁ”S½'։ĵ9Û˙áelŸ'?5Ò2cOaA@mĦf—.œi(”HzÀ|0ze7Ċn˜·fT1p3fJ02l: Ĥ˓0JhÈ0ĜÏBb7ŭ­ĞĜĝî¸ötĤ+÷ĤÛ)Á(ĊôZ˘ëˆqD Ĥ_Îŝy½{½ŸsJŝĈ%§ÄĦdé ŜH·ĈŠjĊ3Ä Œ7˙(Ħ7” aKÉ ÒÛò`Ŭkü8‹ÌЇ’ĠkvñܙĈĉOJ $…ÑÇ£ÄbVħ!T Pñ a1ÔltĠX¤wÙĉ`Oı$wß HJ·Ż`ŭğOàê·żı{ç0úùŒR#>Ä ŽÖġ£loĠġ·]çDz=0öóŬòxÇÄ2%›œÈ6ҝ ħBQ- ĞuĈ•¸ÂWĠ!ygT8š\ÎŻħs}hs%,ÈRĈ0É`˜úR-[P()FFsËñK; ĥF]1U*ĈCöŠ:#Á¨(êñ£Ç­żŸÁ…ìÄĊ0„áÎU\ğĝm\~ꛝs³ĠşÎÛŜ­w:~żżWrFÓքì`„C`t½“ßa'ZĠġAt tÚ>{ĝà°ÇJ`G%†?Î!lzÂn$JkĊDµ0¨Ö}ß:B`ŒƒQàzÖa ċğτ3ŒJ|A–1’L\˘Ckı–ÍŸ;ÓĜԝIatc ­ċĝċŬÔÁÈ·Şú0]ñs‰FoëE䳍€ J $$4’Î6/>KO}£s:żÛítŜêvğïu:+~¸ŜŜĚ£ÒğŜ}½]Átc ş™ëhÚ}3ù\É)!<"â@²l1½štâù2•Q†|7Á5½ËŻĴ0 C;‘”úVXŭ;ùLé"eM,¨X³ çÎ4ĥÔ))FG†ÑKÛ u?éĠO܄5sŠò™E\şċnÈzg”‰À‚œC"·~„n_Ċµ‹ÏཧÙY‰BŻÛ}§Óé\êt:ë>L·—ĤiÙVK4 ˘ÒˆĥCtG]ç8ÊI÷¸ï“7 Ÿ›C’)}5Á,wJâÄĜcɲùáú°ÍŻH%ab·£ĝš"Aˆ ì÷iÉċXċtò}^Ĝ÷gÛÓòŝyÂp˜!K P_ĴÙĊóS )ŒJ]ğg[­Ö‰Z­v6ŽğĈa4ĵ!bS!‘żŞ¸e])Ú (:x[ÎaäܑY żíœÑÏżŭ­Îr(/öşŬ·;Î{NçÊîîîvżßßKÓ4ŭ0ş^ˆîFĥëQÁ¤0ş£9jnxèŭĵì”Ê`2ˆˆΝR+YO;Ñü²„Ġ•:ò\"gìw*ÁĊ(şûÎ#,#@ù@„‹Á€‚œZÀ0eXfX¨T³sgĠ))F“0šoŸúġzä÷û­ċĝċçŒBγé\͆Á¨>2ħxqY)­ÛJf$°DÈü8r&‚`¸³­—ż÷žŝ/ċ€_ìv:ow:÷;ÎĠwTáˆWê‡eԑü7ĵ_b Lè˜ëÜè{şÒ$” "°ÖЏy(€„ȲVr%é…sË)˘A ˜ÀM𕉐]Qä-£²‡QîŞÄw'‘ÒĜ•t˜ E›f—jYëì™ĈöĞ _²BŬ;ŒÌÂèí} kĊ§ğ"Î ı>sâgÀ ˆÚI)N>ş‚´™(!‚dŒ¤³í‹Ocó§şË!˙sŻÛ˙ ×ëmôûŭN’$CE‘ 0CDùZ²B"²ŝ>Qùfˆ1†‰^ˆHJÏ ‰1&D”ĝ I–ev8Ú^Żg‰Húŭ~99˘Üw-˙;Ê*÷~ıo?­ĠjĤRݘ8Žƒ L†ˆPÛß|RµHîdŠ€òc3ù€ñˆŝßŝ~0q?ôû•af;aîAϚÍêİĞÏĊï~-a†ġ@FB cÄwÍF2e÷Ġ˙ĥn2rFno0€F™ I0° ĥ nž›§{˙ŭKŻŭ§iÛğ á0x>ß/Mé>&öÇ´_*nB™i0òÙteŭ~n9~akˆÍTÀօ"  ŝà`$ĥ@ŝËĤÜ•;4ĝ89|ì$ìì`9›Ô[ġġ~Ż‹J2`1Š˘°VĞ-ˆHš÷Ë“óôœÀĠHéñA€)ğŸ}ß+6n P"2‘žµv+ ucLÀ$IÂqÛŬŬ]žâŽhʁğéH¨|‹8˜™™İÖjµFRYŞT*í NcĉÌx(•CtcÇAùıÉïOù^ùĞ9àħ)=‘P1ĈÔÂ0lcˆöŜÁŭùÏOüÊÙm‹ŞX 2ÁÀ0ÚÁ(oA4§ı5%öP9'żBĜ‚(À ŸAx˜??{ŝŭŭKŻ+”H·/Œ>è×'Üχ§h‹@2ç”ò4w”wc(ŞĜ}j·?Qĝƒ –ÎÈBÄö̽÷,/„&afœrŭú”†ˆÉaĝ†­0$˘˘Ğ2ŻdıÌ\÷?kE‚ÌrıxÔöĵqIdœ 2mK½‹ofôĝ˙ġŸ˜9xHD Ü3Ĥ‡4|w`2 jµĊq\‹˘h.Š˘Sżû?ŝÙ˙T­TO§6Ğ sEDLq†.·‰“Ò5„Pñ† !0†Ü~"2~אħ}³ĝš ÊÓµ……òB×<;Žü~+–!)“eÁıĦ$/EĠµÍ˙X.|GT|ïğR×ûP=”Ö 2.÷ IDATÓ]Á‰0@Œ!EĜŜڃ̝ç;˙äŝċ·ŝ_…’éö‚Ñ|ûä§xè‘ßßk-ÇßŬb+uµĊë7ı•-’3`L)<É[š¨Z­'qéԜ_EÎDâ³÷Ö²J€Í+˙[†üi?à/ÏhX@ìş)°!‚É×ħÈĴ€É´HĴ‡c^0OùçÇèĞ1ö2ĈëğC\Z˙ÁìaĝT–e;Aì†aLäÓ@t£Ċš ‚0 ĉÂ0lwçV?ŭ~Ԛï%âj\‘µ]ĝbHÊ €2‹J Q@‰‚1n Cn=4ßO`BñœÍl›ùş¸Œ]ÇùÌeßeƒˆ ÈÀ–ѳ"{p‡‹ßo2[324ħŸ–{…KiĠ(³e˘hÜJBa‚„À.óó¸ûË÷/żĦkJ ¤ÛFżŝÀWŭŭŝüJíĊM#›şŭ”ó, ÛÎŻ(óV?Ĉ?A‹Ġ˘£ĵOà@`ë>év;)Ŝ&0+0?QŜ ‚€0€›W?8 ‚"żú “§Ŭ˜; Ĥ ôÓ {™ _àNzc§½[‚În_z|éÍ8‚ycÌĴ1&ö@˘ÒAN‡„îŽŝzhŭ·/1ÍÑÒğè‡{]luRĜ^ĜÜa;AŠÈ]éĝo%2¨…q5@5$DVU &25ıuK+€ÍÖzGRšĊ•YAj) ÒɐežA2veC‚¸ĵìÑÎ/ˆ°á9‡T­¨ #† Q"ˆ˘A?sٟÖ…9O W¨12fw5´° ¤R$ – ì0ÙçÜ4[÷Š~W(Ċ'˙Ĵ0*ŝ)3ĤħgêžĈBnvż˙ —­³óĝԟܿüĥ†ïH·0Œ|èÑ/îµVj/n'¸:°°‰wB>a´íñеéğĤLĴş~`r‰t읳ĝx½s(D.Ĵb É,,ıYKÖ8 °ħˆŒë Î>lG ˜,wd*?9Uüg° të~À‡S, Œñ3†X€B°ÀGc݈Hè3ıLé·Ëòi÷q;È+‚5pm{ €nÈpÍ5îħà!ƒ‡œŽú½‰‡K>ŭĦB„*3ށAĊѐ„À‡Ö HGµoœħï£dÖşV=#AÊ@š¸ÎÛifGûݏ‘bíDÂAÙϐìßç§=]!ïy“ĥ~`ĤnÛ´Î͎?ıù…’éցÑÙ1Í­Ô^ÜâêÀuFùk~Ș˙hı£9£òXíMÒIJEL\@L>+Ï}k(€˙^>}œ„@,#ˆü7‰ ëċ…ˆŝ—rÓ?É­Dŝk&‚ ĥ8ôŬg(W-A@ÈÂÀeúBJfü •Ĥ„í&§ĥç5¤ş`%¨ -$p&@ÊÎÍşĥÙĊ Œ›żċşÍ;8…äNFč—R÷żÛLœ3²‚4ĤcŸ‘dĵ˙â)Íö˙ċü•ŒċgÊ'£"m•G‘€,!{‰{nîüĵÜùċûWŜҝéրÑ]y˜no~öâf‚+Cv_H9F²˙è9‡édßúï?âĤ†ġ\¸L`&ŝyÂâ;E¸Š÷"żÖû›ŻO‘)o°ÑñdDˆ]H@Ċ0b" ‹ßżšôh!żĤ†L|ÖÓ¨²´ŭeÊ W W–‡Ĥ~3³ÉoyFµ>iAÜEòWiߪĠ€Pñ áĉI1àĵöͅˆ™›ış8kYĉêër%#µ<$ûA!ûÖy>Ag´/|'ù˜Ú"ĴÜd­>0nŸú“ûW4|§@ş`ôàC~ħ7ç,DhÔ{ŽG ߀3’i@‘CÂt'dZ_˙~ŒÉŜ(taá²ĦòFd´ĤÌp‹RâŬ1 ¨t•)ŜA9 E T j ŭ"LÉ#Ĉ-^tİQ½Š)9¤I(ĉŽnçu¤£vò.Bv6?îTk\ġµ$vÚ΃€•ˆ÷g Lé€(í“ìğo[ŸRm½3Êĵ3Ê8‡‘Ej§FĤ=œ£OĜ½ŜhßÌê”f°`ÛZ`éü<îĝ“ûW4|§@şYts'–˙ğzô‹½ÖJíEŸÀÀv=ê ÓÉän'.L'“‡÷A0âñüéƒT+ġq!=!×%Œ˙3ĈÑÉŭ_ŠÑ%~l†Ëԋ ³<ɈŒ RRw-ꏣä˜JùŜĴÉV?ÈCĴâ/wŬ,ˆ*Ó<ÑÈEûĞğö}­8W”Żyg”\F2 F<ŭŻ÷‹‚QéĝWeI-ˆ€ÁÀbûÚ0wNĦ¤@úÂÈÔëġ¨ÙlVĈl³Ù\š™™Y­VĞwΝXŝġżúŝğ^kö‚—Ĥġ0OY3>ü`9r˜7Ĥc>~|–”}ĥS§1n;ú˙Ù{ż_Yĥ$żëħ2Ğö>żÏíû£{ş{ĤwË k†yà„aÌĈÖL÷“°2ÚىğċŸ}àñ·ż”hĉ—xïĦtŸCvtbd9…ÑÊaô¸€Ñ÷žĝÑŻŝĈô_üıĞg]ŝŬŸíñéÎRğûlĤS=T*‹aşòîŒ2ÒYöèáñf0*cĝûĵî‰mÄĜÏ!°-Ĥd²ä$û%ÑFŭG&ÓQÒ 4İ!NR-FöG;UJ÷:îŽċGŭy^¨MÊİl”WFçup~Rقúyd0š&2 ÓuEòÂ.Ê0gôΨg™B]Â6 >S…>˙…çĝÎoŝúGĝ;ĥ³İĴWt·ÛĊâĠĉÖҝ‚RUH÷`ı?PH>l?~ĵ~òäɣǏż˙áo]\\|÷هŭsżñ×ûÏ]=˙èò÷?Ŭ“}B-ÛSç†épi›·c€ˆ!ôğ—|aӂıYs.TġxüR†èîŒr˘X”›ĴÎÑv³³mO~ŝ9~ñ7˙µŻ˙áï&"}ñâEVJ%ŒÎİ|üĝñû<ĝÖĊĊĊ÷F˙ÊĠ³.˙g{|ĵˆÑV¨k^˜zFŒXœ3š[g´t*kħHöw­‹óLŭÛû["ƒĉĤ VeqÒÜ2œĜĦ”׵ɰĥWG=ŒÒ;Ĥ[ú]İíM6 Û+ĥşµí~ŝ=|çßüġŻJİ,üòċKŬn·³Cq$ì\çîĦ:ZÌZzôèQóáĠóçÏe­×ëï=ŭà_ùżŝÛ˙êĠ³.˙³=ŝdĦW_ÈjäŒuFs]GÙnK?ÀÑşÙ™Í4IAeĉ;wSf~­3Ş* pĊ:o"[Ğ$ÉÖċşb}ġqĜ„wž“2l)F(1Ñ7œ!•áĤ3ï}û_§Siı/½R˙•xijh NHŜ.?EDz…Ó°ÎÈԑ-†½{0Êáˆ4D+CĜ\uö·§ßv(ŭwŭ3'}żtğŬFÌ/îĈR >ݤûšÔpr¤ùèÑ£ĉÑ£G#­VĞï=û£_ŝßúí_{ŭì£Ëß˙t‡÷$)^?×ÓéL˜nô[(â\2ŝ½è‰l:Q ĞŬ§ ”Ċ_âb!‡ÖÒ°Êj†˜‡I+aäE4uHì*K$òù¨ İI¨iIÑ}oœ9š&‡ôa'Í`ÒCŻ* HĥcġêžòmiŜv]Â(ɑÔîi³²ŠĝÒ¤é4ĵ\Ş7ÂɤœÙġ}3ï}#š9‹d<à‹ Ê ¤„MžX{òÍ÷íżòë_˙'ë )%3‹w@V.î^*U“îa¨c´íñÇÍǏÛgϞ=züĝñû———ß^Ż×ß{úŝ‡żò—~ë·˙üëç^ŝ~^ôÚ%sĥIGs9£(G²éÂtş0P’3ÂtŭÛÈÁú£Q˜NpFÓÏCc?¸RĊ£S6—4tí´ç$(˘ŻU‘)Œt kÑч-ç‘p (áŸ×³çĝ¤o@ìġ"F^ZŠĠ³íreöR‰eÒí£ŒŬµ×£éSßF3ï}RċßÔA ÍWˆ3Cw{\u*}ö÷íżúŻ~·ï)V€éŬl6² îï[Ħà{$:3ÌÑ_žß$:¤âznqß`D×Pŭ4ôá6‘Ġ“bÂhĉM2ô ²3 ´úı#Ñ~Ñky<Ç h,Jf’?‚N>ÍCêèïĞ7şàŜ`„I4Ĉ?f*&ߕ?"ÂöġŞŻ§ßz?÷W˙˙­áċ‰4Ğ$"ÒĞĞĞ8sĵŽ-a¸ójİıÇ?ĉƒQöÓ§O“'OÚ§OŸö0Z­Vß{úŝ‡żòŝ˙ì×öï}ŭÁ˙ú‰%0¨(bn#Ħ“ŞJc‰?3]–íž6ŻVhfG£ƒgżMB|‡oP %™?ċĊÙd,7üšw˘HbuÎZ/˜FŭĴg“­ÚŸ+ÚĴIĴïS +c38¨ÙĤ3`şŻ*G } *û}I5Ä ‰qÖYGQÏ1I%ùBXĠ6ŬôÜ!˘ŝĵšÓşV„Ĉż: ÓÑÌ9F4óz2zo…Äèy:°ê`;š}İ*(ìşˆÏ_lg?˙ùWż˙ŭ2³äKÊ“×Ż_O3íjqĠ{ëmµZñƒšÇ_ÂÔ÷wÚòúd|.kaĥ^Eŭ4*¨O÷e/ŭ£Ŝu³ı8ô˜zċ"27´:ö’°r01Yé ÀêĥJt˘‡*Ĵ\(L\v-Ş¤SJáü éÌżÏµ!7İšĴß5Ö¨<Ĥ ë[dáĊÎï>ŭÛvIF ´­ò7<ċÒŞzy)bvġƒa2ÑÒö,1 ZaÄÜòb(•^WN‹ç1lA†•OPj΄Ëê/ż'|7{• ö&~Ä}-|Ää+ĵŭù’eÔwD‘îï/ċàï/ Ĝî#j<ŭĊ÷­ßüŝ7ŝèw6+ĠŞîDdŻŞ]J)v]'ûŭ>-Û{·8ö'5ôpşĵĵ ———ÍĊĊĊEÛĥOšĤyïÑ×>ĝÎ÷˙Úßĝ üä‡˙÷§{|ĵ³8ıÄöfu‡°0[ÇUµE9C£ĵĈꃉ7¨Ëê$ŞÁÀċ9À¨ċ>$§ùĊÔ· &Pnŭ,%·ñí!7ß#‚$A á>’B[K; ÒoİUŝF?àS˙ŬÚĥ”ìGĜAêĴä³tE¨ìżWEĞô*Ö¤-êrH0ÉÎqy^äĜħĵïVg•ÒÌRĠáÁÔ7ˆ/ûrĊ(ÎóGınzß1Œ(°9rRk–ċóOıTG_<&ë9‡bÛ1ċu3@J½ÛyÁÄŝ ĞšäßLï)ÖM–İX¤!Ÿ-7…\sßëIc5­íĥ& ;a]ÁÔĞ~7ŝZ·VJˆíóĜşCkĊÁÁ]j`ìĵí =ĝÎ×ôç˙­ëĝß~ܤôéjµú|½^_­×ë}ÛĥсtŻçŽî³BšUÓ4Ԙ]4Msùüßüèûí?˙Ë?züÉßŝx‡—àA`´DĞġú^ä ˙8,äMah9ÎÁFwD_tĜ˜ïlŽ?~–sx¤ô³j)Ĥäo*QAŝ8šfšÒò éÀQï+íx"›|ÄÈÁ~ôbŭˆ JhyG[EÛkA½#P0pj°°zPUBZŠ†‰ÌIĝš´ċŠF7Ù3âÌ1òùMI/;(^°úƒ`WÙ €Ĉ ÷•<1%" Ğ^ĦHL ŝ “ ÑvèÑĄ C¨XEÁ—mÑéĠ³.˘ĜûŠúûúïÛ]PŽ ´ĥ,~°˘Şö9c4&ġ [Y#Fşħ‚­şŞ·KHPûL´júAŜ6& àÑ/ŝ܏áßŝËŝ˙ÍBwÙ4Íj½^sÓ4§v×,ğû4o”o7MC!fĉpñÍ_xzùïŝ'˙ŜùqóÁç˙óßDúügĥZ–­g”ÀÁfúQÛ$Ê0„éÊSjjn˜ITti&z!Ó~²:Ž–á-Ŝ\f<͉ܲċsßë¨ç†µ`h<ĊĊ/üVï}„KáMĉż–`4“^ž=ĊŸGaĤkĈ–ŽqËû£ßŸ>P"RĞ0 .ĴÒı<hĠ }ütŸ˙²ûÌےĝnçâä–aâSEÇs’ŜûÉ Ó9#ÍŻ‹á\/ë{éC‰˜´jáñç /ĉçڇ#~Àš×-Yx^§óaÚÏ)Q?ïĜáE¸]|íğ?^ŭ‹˙Î/ñïŭÇ̘98JÔ~H÷(T7;ê^­Vy†Ĥ”âŸüŸŭè‡żû7˙ĥüƒż÷ŜÓn÷„€‡Ìt PD\ÎzÀŞñƒĤµ†sêaêxŽôs§íK8•ûx˙zŭç"F 0Vó#Ŝ<ĝüƒżyŝ+½Œ pW)ôÖĉ”Ĉ–ç[’)]Iz=ċÁŠwzE ğŝ}|óċ˙óӆRÌ£,ĠQ]‹VÍ ¤,—íkö­iĉòš¨Ü˘Ċ&-&`ĠżL"۔äe|ÁŸwüĝӟ˙$}9š³a”ç £xĜĤÒċ-ßq-;µpmYÌvħŠÇFùZhĵê;)ñüòó –Ğŭ~˙Óë>‘­ŞÊ¤à萴I4S›çĈL?—mÏċÊûD$ċß&ÛÊëÀFU_”>ñĠÇğí'Ÿ\ívûëRŒñtî]Ġï:‡äcÔív+MÓìDäeJ !„+fŝ­UµUĠ›Ĉ•½zJH·ç׀,À`ĉo_y(s&Ċş\ŬOÂjµzxyyùŞÊsĈ÷µ ˆe^Feµ ÂÂb<­˘é­(&/§!y•+“-ğŒúޏ 4Ô4 n°Ûü§WWW?Ún·Ÿì÷ûĞìœç{áüġíéŭ3vÖ@3Ûġ|˜9ùµĝBĜ|‰:ÏğJ)½Ún·ŻĥÛínğŬʐî­U ım6aĉ$"ûŭ~˙zµZuDôšˆZ"jFM Ħ ¨F3@*:Màs*iĤ Â\ŭ8¨*3s¸ĵĵ|ĴŞÒĥíż(#Â`F:Ĥ󅗞NËUĞ}ıÇ]<ùÀ¨ü90Ê7ĔmX †ˆlâ~˙Éf³ùÉ˗/ruuġ €¸ÓîuUáèe˘Bn\M@‰˜–`êÁ÷Sı™“oK:‰1Ĉ]×uğŭ~ßív;麞ñH£“ ë:yŭúuÚn·xġê•QÇÌ["âBX³|ŬßÎĊ‘gñŬ°Ô¤“ïÂMÓ4""ëġú"ĈĝZU÷Ş–ê.Qè¸ĊÁO^Ĉuĝö‡Oöv`äQ[‡ÔÉhĦóY0Rm°žJDÄ@·1ĈWÛíöóWŻ^}öâĊ‹>’k·iݘ&—›ÙMá4ÓÁçöï"tóu*î'"Uá×("i·ÛE"’뤞‘H³`êşNşCñʰÉ×ĵpŸfn`tB7SM iò]‹H›RڊH§ŞQ‰Ĝ’ ˆ%îSlυQżY`•ŞJú*bTÏ\tñ:0Ê·’€Z[7äۓŞvŞş1îöûŭ΁$Ċoj HŠ…wĵ!„…Ï4ŭü2ù~İĜ&“ms;öH÷ÛÔGè tç.zâ‚[²*Š°Ü 8:YÒÂII'`tNˆîĤTÒR¸î …{ŜîŽĤ›çHœ ¤Šž£ÑÑ!ŻĜBĈ£ŞŜŝÁo|!rôJ “jġ‹ŭŒŠa1ġkNJúĵFâ0J30’µq“ŽĝTbĊ10 % Ÿó½ké {¨œŽİ#*ÂpSut F· DÓ÷ĥm_‚QÀĊ$­Ġıôġ,â•(äƒQßÚ×­ä?W…ôv‹@`è>#Ìlß'  €HÙ%µTHi²Ò3Ħt˘(×QJ§À4ŭsßûœï^Ğ}ße´Ôkdšó?†›†ĝ‡ë§ĞÜĤ$†sCuaòs&‘f(Q`°(d—΂ÑAqċÜ^C‹êĠŜî/£w‘ %Ĉ¸˜Ŭy0ê q3ÇrÈ2+CvKó'ÇBw·ĊùêjIN€iN- „Û—èQt šž2n›ÂˆTÒR˜î6ŭO%2„⇑o‡"ŭU@Ĵꅗğ½L:x0R=ñ÷’IÒŬËßàürĤ¤bÌuŒŠtx¨tHS…t*lwÛĉN–€tL)“ÎÀİZ Ù͞ 08Ħ2ĝ„ÓI ·NK@*C’LÙÒD!Cb#ܟ-ާŜıàt€%6ÔÊs_ŬÉO4éŝxf˜.+Ŭ(VlÔ{pÑĦӝƒÒuUÒm ÛSI:ÌÔ9É ÷&Lw¤8]Žƒ&'T Òiϵ~—”ѐäŒi¨.‡cRılŜ~€ĴĤ×Eœ£~âxDué­xfĞÔMjĠı÷ñLÉaCGa˘Žf˜€Kû,ğİ’ÑI;‹#0ÊF{G ]ZííŞ´hÏpF“*)ċ*„YĠÎV1˜QHÇTnİJ:J;J¸†*Ò#ïQtByS€MA¤× ÍŬĉ¸-€šO<~˜;Ê%UÈ˙':_³yFß½çLR+j‡QëŽjoëĴOj]Y'~ï(ŒF‡-wsġF||a £4£Ĥ*éTÚmŬƒoޘ€ÛU˘é–è˜r:çyç@éĥiN•?”RÑ´˜$E²Ċ° ħşféz0ÊWÏ´óìŻ:ôĥù<´È cτ‘WfġÒAÔwvÓ¨"6–“ĉnsĤŬuÀtêÑk<ïŜÀê>VjX‚RéĴ§C|ÓÛïŠMCŽŒċ’F# Í8•™…Ê ïS0’˘DPT`í:­‰H•Ioí°v߀ŭN£ŝ…¨Ż…GƒĥµgÀy%uŽU/x—üÌıŞ 3`BUK÷/ËnJ8&àüìĵwHs@&:ôÉE+¤" &²22r ͉Ċ‹Ï@WÛZùmŝĴDğÙï`·E΀ÑLżÜ*Ġ&Gm £wHç@éMnß+8Ŭç9¤9…tl>iéy×bKS ÍÍÑà™Féàe˜au¤ÂÚaËdÉ"‹0òëíUĕ*DmeĈWà6e€ÓYÊhfÑ/"kÇ]Ħ$GnßU Ş7ı_t—~†3J `Z:‘è‡Sù=ʵVSu4UIĦ\Û?47‰] e„ÊÀĞ×6]µ\ËĜ}eCĞHm€î⁢=İŒò´KċñĜI/ IDATÔaYÀѵ8K0ĵğĦş/ò·{½ ö>+¤c`šŞ¤9ĠWä-żwıĝì}%”(ëĴ¤4vj§”‘*ùç;t˘@‰ uÒÛ7Öé> -ÌŻ# Ù5ĦÏş›)Ïzn•‚waqìÛTN÷D÷H§”Í};ÊĊ°eÙÉdô;ÌĞ Ċıw8tj) ^~CLžċµ´CúJ†$Ü MéúÊ(ßJMcÚúû \îÒoQż¤ÇT ŬC8ÍAêŸ0§Ş 8"RÍiòH4#.g`Ôu />ßÙDx^ƒ”[a/5÷ĞöċHÀäYÂA¸î YıŬ0;Û:í~Ħê÷ĊßTĞ@ş×'Í\êû95µtŒ1µšhÉ×éqm6Ż_îĥSn?ۃ­Ú[³èYv}"˙™0R-J%ñô:69v.³`´Úŭ+Uğ§ =µèîĵ–ÊQ_œİSSUĵzıŸ…‘aQĦÚнċ_½WùŽÒÏ˙£òxĉcŸIßôÜ[:+Œ*ŞU%xM™ċ5ÑtÎİùŒ”$Ċ‹ÏwĜnşy×Äö|nı‡Wµ·ĞûJŠa Q.z=#ġÇ÷QZ-Ĉ(TçL޽‘Ġ]µ/F³$Hb}‘T¤Żŝ]NL‚ŸïĴÂôĴ2›`‚t2v–ĠŜî„ÈRĥËH§`4Ùĉf­VTíöŒ¸u/C:ħûĞ}—ò…%/äu”:Şĉ0dàÓѕÈĠL İòštéFäĦ8SFer·z‘ÖZ[£ZRµ›‡™ó cĜl·/_îµÒBR@–ê].V"Ğ…ÇL½ÔŬWĦ’LfĉŒ‚ ’(RYxµ Í5a¨Ö^çŝŞU UğM&´ñġë›Mtm ëƒÎù1jµ=³o 40bÔمŻÂĜڎ[‚ġ‘ mĜCpìġS“èX 1ÚĤW]ĠŞU Uğùáĥ;3bàĊg{ìv êáğ<ÚD6˙ía-1ËGŜQAkĜBMÔÑöWrԒ1 ­#Lì˘ @ĜĈ–͏&IĤe >ĠÔ¨jHĠn @@Ú >{ıGWÀìB¤Pġúw Dw†Ô( >×TÛoŭ!0À âĦÒBM`4L`ēċDÌIÓEħlażN UĞ@ŞvŒ€Ĝ)~öj¸‰£9‰Ü)›ÒĦ[6‚*’ @liß+B%ÒÛ7Ż]—aDF+T‚ת£ĦÂn9”ˆéP=UĞöVĊvµ/6ÚNŠÏ^ì!Œ[kïÒlŭ$Ù¨;'84 4yùË^úÇۆêÙŜú8"@¤OLhF²’µö–˙•Qxv]^ÇTû)VĞ@ŞvÓöjg)š §•a”U“M–³ŒÚ@Ö6OX–ŞWçŜî BÄÂŞÌhĠp FŒlÀÀT;—)ԜÎ<”ŞëŞU UğIK1‰A=7Ääà­rtèƒŜĞ$›zLhˆ ×ċ¸$…Ö_…F²˙£m‚…ë!0mz ÒFŝe\Zµ ¤j7ċÓÔGȚt2— ˜< äE½-óÎĉ*Vlá!jĵR u×~£‰>mÙRó™úÁƒúúĞŭ˘ĉiEè³J)[ËZµ ¤joÏThĴ'’–ġE ÉĊĉPlòœm ´ıÒĵlPMÚz˲ı#"R´ìÇ#ÈçríTÊݏӔo~ĞU UğMέa SPK PäbQ€Ħŭ|ûÚ¤– MV†×Şġƒ’ADNHX5ŒUžòí0"Oh 0:özu—Vû’ĴĤ}Wûb&V~F#†ÚAek…ġK"M3Ù|„²5i”ħjË†°óâŞĠŜò "0T,İdà‹as†³¤îG3%'Ħ0˜ŭxVĞVTíF‡ÛîäìĠfhXb†¤ĜCG’5‹IcBLŠ. ş²kl.¤Ö ‹B¨I Ġ*ŞŬ¸@2ׯ M:´0/úì"À$`bKġ^“ŠziúToöq áĤì€eL4âîÍ#ÑŒxPìûħ‡6İöyQĴ„ Ŝ<&Eş¨è˘`Ċ;Ĉb’eWäÔˆ]µ ¤j7îÛÁ'“İ$ß  tIX­oUÀ„3µ˜€Ĉ*G›râ‘:rgZ‚¨ ĠÍrr¤ğ²ğħ¤0$žÀ¨‡ûŜ?FŞI2RF]”Fğ\³ ѕ˜Ż vĠ*ŞŬ •ÔċE’âY Œ²uQÈ`D*VaUġ5I!‰OŞ3ˆ8gàMRv°ál¨€Ö]ÒT!MUOöOҐbݍ²ù<‰ I`ê(& ÑEĊ> vKôş*“ëy1UżZµ ¤j_ŒÜ×k' †![9€‘•ĦQt`‘Ħ^]0~_\V J´úèH!•ʈ€&Ci £ğÔ !Ižġ ú}¨ŞäĞ’Ħû„Ô D ) b’F]2uÔ%9„QñħTċîażZRµw’Hġ'"0ÊĥïÜ2(:”úvĉ^×.amO"+ĠÀDÄDԄšĥmôˆˆ$"J ñk%"!˘ŜMúíw{W‰ \\÷áÌâ:~Ífn™98´YİUüI"=b1o´ş £\£0„ £jHĠnÉŬ×Iì ĥ˘¨ìÎ>*¨yAXì§€‚Ñô =hšĉñĊĊĊ“§OŸn///WD™99p 3KPöm#½ËP*³äŒûÂ9§Şù6ûö "Á·U ×ëġ“Ĥi….Ħ j@Š ):Œ’˘KŞÛG$9˘/ĠÖ!ùħş0ĥZRµ…‘÷.Ҕ€À $ÖíuF9t·İ˜bŸjŠ­Ĝ'¨šĤyŜĥí<Ĝ6MÓĤ”6Œ2t £|qtçĈîE“ĉ 4½ˆH!<\Ż×´mû3?‡(’$¤$ĤúÌ:ƒQ1ƒ‘@aİûž"Q+5TĞ@Şv¨ëIħÔíċÍ1)bí(r›s  ˘j‚™Ÿ­×ëŸ!ĴÖëġûŞş)`ÔC¨jHpĝ{;ƒ‰gU&0ôP"˘ËĤiŜkÛöëÌüpE‰ 1u$ŞÛ{f]×ù½§×+ÌġíÔŞ6TĞVTí&ÇëĥŞ?éa-=„Q^¸´OîÈĥ²4 BŽ^>GûŬ„Ÿ=hŝ}‡™7 N^;ÏÂqV6OÙĞ´ú´ÈRĝHtü!pp˙ôԞ¸Ön%q÷%z(oÎyE·ÖAŠ ‡ËŠ]MšË,µëÔú"BUUıTQfRŭĈ“5˙_˙d‡.)şN;Ċ.Ïui~_8…t²]“)–UïŞUĞ@Şvá#Ĝ|O ȨgvFùö>Ù]Ħ µ-LŠ'ÏñàOŭ˙ğßûÌ nĜJ …Ħ­véÌC ˘ĤÜki´NĈÛ#äÏ#j‰ŞĊ”—ßïĞYçlA7M*7Ç?nѐçÑtf_ċ×÷ëžĦ:ÀHµBıEG1§LĠ_FD!:”dÊUT!²żù‚WI‚Ŭ.âŭÉ/_½ÄfÓYFŬ>am1,#ÀşS¨™ Ġ*ŞŬĵ/Œ”Ó0Ê×Q‡ÒBmRtLè´Áĉ§üĝ³~Ż!´Ğí*€ h×ìB7UÑĥŒèĞVs ı—(ë9L·ÇĦû)[SĜUˆŬ#wìÄ4şVWdšÄş§™bÌ­DĦÇŝ:ɘ̖ĦèŻ &KÏáä {M%êRRDbt0Á+.x]Œ‚ĜÙ:£KĜo:ÄN°ßvv߁4jŠx F49Ĥŝ}ë2¤jHĠnÖ²˜ˆĜuŸÎ†Ñò³jĞ†w ħ3Ċ}‡=G4kĈ~C°²i„`5´  „ Š&0BÈkìYXÉCŠıE)4‰…™|‘Tvİ {b™iç Ż,Ád÷³\ò×°ûiPO"A_eòĝd ´Ŭ]Uıj#BJŠ$6ד”lŜG€”’ ò"¤}B'‚$„Ĝ%ìwRvû„}g5ì†JŬzž2ê)Ağ^µ#µY­ZRµˆÙÁĵişÓQÎÓ0*‚?Ĝw‚}§h´ ĦŠÀ„† mdš&X…j&żoUĞSì>"4ÀÑA’‹1‡póÑŝSÍô`/û:yÈM½K* ’zù@L–u8Gîìc÷ĉ(ßż¨˜oDäĦ9K I"ˆbë…rŞvŒ–Ċ˜’"vIIħKˆŞ^ (Ħë,ƒNr ıf˜Ĝ@!ôĠÁÇħÔjĠ*ŞŬHÈΝ}h|3Ù|ĵôˆâVħcE ͞Lŭ °…íY+…È„M`[+‹@dóPÉÄıö‰:ˆwJŒbħhù}ó÷ÌÙ9Œiċù P™zT!DQŻ5gŠ^;@ÍUıSRHI—QrĠn{Ìè{ŞĵßQ•Ò3ë¨iê¤jHĠnQ܎ÈZP¨·3Ÿ4ê;£ƒp‘f^(vI°BÒ&xD­aĥŝ>ŝ÷&¸JbƒS` ûkk…Ñ'ıÍç LœġJqnAœ³_Ĝ£Pê™sF 0Ê;OAĝ¤†ìŞU Uğ%Ñğ~2˙‹¨÷wĊƒcTD˙ \ŭ ÚÀh™ F!‡ì^DA` Ë-/Ĝ§}rşrn­Ž<됧0:âoKžò&†]µùqE4ÀH½ĵÏ ~, çŭŠ\%ċçÌAgF×WFċS½ÈӐ•^­ZRµ³¤@P–a–)#_ FqĝŻXê5Ĝ†3(Ê(Ğ#B í{É²,‘Íò ˆ†òÙ4™×Ñ*g Fz\ġß­€‘É2ċ$y–œhŸ¤Š^EÖ"ÂCv£ˆà1éSFZ\ÎXÄU­ZRµŻBİB;ö2„ıÍúB™w¤Q˘wĞeOhÈ2e êyc@@”ÛİçPԘK'”ÑĴ ‹Óe.ä¤í×ċpİFİŸ2¤3aÎĴfEڗĤ›ŞĵÄàĵĥŞf5TĞ@Şö6ys΃ˆ Ô2ä*}á0Ŭ˘Ó”%ç?NœUì:½({x]1‘g1rr˜-Rí³şġИÀèP‡Qy³‡Ĵ GûÉĵf•tȇ†ÔÒәmŝk9jYeSµ ¤joDpuĦ1YnC(Ö܌†×g)X ŭڟTĉù÷=G½ ŒN–XÂqġuS04PyGAYvGxSµ“Vg"Ğ] ReŸ!`ˆÒhš:Pı0=İÂè ÁèàN nl’fóċ+„ŞU UûRĠÑñÑ­ú™ (UŬMBsVİ/Ĵ7yµ˘ġG…Rµ ¤joVÚ_rÑϽöċw*Œî&ŒÊ˘ĥ^4šİz}Ë0:ĞŞ Î!U;O)•ŭ†Ĉïˆ€rŽÚíòYTx6xB§ö4q+ż~î}ž´’Cê ç•yäĊóTÏXg4}Ŝ¨Bĝ(ĉŜ['Żu.ŒP~Ïñ{aDó~ÚÏhéŭuá8•ÏċjRÌQFzmġ]­*¤j÷^ùÌ)ĦëĜĴPĦ…QxJ9_=èİëŝee!íúŒr@3•ÎZôާÍŞĴkÀha˙TFŻô„ú1%YJ$ Ö;‰B(úkŒ/GÎĦ ˘jU!U; cIÏކ”T½€İ*úşv¤T(#ê•Ñ dVĦWF˜QFĊë(2Ĥ63r¨TF2|ó÷ĝüYgUÑüwË9jÇT_ñ<-•ß…§“ŭ‡¤ Ċt¨:gĜô5hÀ^>ˆˆ0Y‡´4¸İިZRµkiêypÎhžr°V³hÂ׿–ÎT‡ÖÁ˘‡êIuĝžı…‘?N‡ùݜ -İï•$ıFPĤt^„ËÔ·Ĵ°6„ŠMTv-ÂtÁz)ġ˙tJ°Ħyßáğ·½Ġ†–ĊcËïH~ ’XûÊĞ·rĠ £^n/ï*ZŞŞVTímÉ{Ä"èTħפ %kCÎĜGp ;ħ~DH‡ƒƒĞaÖԎˆ€àÉl0 ²u@MVÙÚÄd‹q™ĦQÌÑş#ĠăsMƒ£&òZA˘Öżİe Áŭ²5àƒh­jÑbEk1‡ĉ}Hjɔát^§‹ ‹’ĵj½y ˜¤ÌNžm˙³‰¤Pûî]ì‘›1D¤ uċ\Oá, Qkl¨Ŝx0w˘Uġ}(감’w€ġ6>È À֛­‚gV6öġÛàû6@T÷ĴU5úy˘G”QUJĠ*Ş Ì9QUM"҉ÈV”˜t@?Ħ5Wė+#2Ŝ$ÏÈÊ ñ¨èΚ£CÁ!_ş2€Z†î­ùúÇkçŽ8Ĉ>=¨ˋGêÑ.á#‰-ĉġƒ”;Éz§ĜƒĞ ŭ~8ĞŞ"ÌUv‹µˆ¤ö †iŒ Şà>ôçUˆE•‹K0ġÈɕ5á9bȍĞ9QhP[¨µ.´œA_ŞR‡ˆA^)‚“Ĝ`Ùğäĥŝ†tÔ6ö)Ĝ?7³5ç[5ŞúZU·~~¤,eĜĠ4ñjH÷>„…Ùƒ9…$"cL"²1Ü ^ŝäuDúôğOV.0dkÎÍT‡_‚îáMŭ¨÷Ĵuh×ípPÉ!8@·§@o7Ŝ—›#Ÿ+Šj×/¤}£V½Ğ›Àĥ-%lZeœĥn``ŬNzçž;ĥöÍŝ<ާ²ÔĴ^˜ I\}ÈbVx5ĉu\âb‡œ“ÇA ĥĵšß{[„ê2Ş{Ĥ£ĝs‚ż— ߯œïÉ]t{U%ŭİŻ`a?I7Í…ìÈ@µyÈòYHéUJiŸR*UpŜR…QRµ ³u*"Ŭn·ÛĴ×ëÏ~úÉÏŝéŝÇ˙ú“ŭ˙ûwZԌò‰Ii}½šŬ‘Şı+fıô3I ksĤqƒXÌP{îÓÎeZĞïêéyĜOh¸Żàé¸ KĦ~“ÍS1?ô4+{vOÎ%GŒĥ•…e§“pÚO ĉ†ıCet‚ŠĈVdżŭµ?ŽğŬç]×]9–Bv5\W­İÚY`ZLf‘´Ŭnğ‹‹‹×›Íĉ“Ëŝ½˙óO_\ü0|Ñû!„'Dô@£Şy9ùm_΢4ÁJ-};υŝş\WäI eĤe'"W"ò"ĈĝñvûâÇW›Í§ÛívÓu]L)ÉÂù„…s­ZRµj#ç@GÂ,şÛíşĞĞĞ+AD4Ĉ¸išĉcf~`EDŞ²_(C)ß.@EH·ó<˜Ô+T"ÁÈ3éD-a§ŞW]×½Ün·?Ûl6/6›Ívżß§/ * *ŞŬSEt,¸3ÊK)cÜl6{yŬu]jÛvB¸`ĉ5Y!ċ‹żÖ1(Ut‹”Ñ Œ¤¨!˜@TĠNU÷)ívğ½ÚívÛŬn·1ĉ9¤|YÊ´ĞV­·êî÷ħŸğpq/Ħ¸!„fµZµÌÜ0sÛ4M  !˘àà 2€]y)xĠnú„˜À(D|{ "Ép‘ŽˆRJİK)uÑĴó9¤äÏK8e@•×@ áĠs°î‚ $żÏ3`âc`š\Ĥá ܖXí–İ$,Ż?+RBĤOyY‚ÑHZT ¨!ğjóùWtÄ)a&ıpP~ÜTe•CÒ; ¤éġ–BuKÉ ¨ ŞVTmi.é l³ Ĵ§;ŒxhJ·H˜ÊĉÀ´¤Šê !VUbf!Ş’ˆŒjŜİ*•×ÓíĠnɉ@¤Kۊż)0³‘Ĥ”TD„ˆtğŬĤŭ~/D¤›ÍFp^ۉ j½ĠuHĠ£‹‹ ~òäIsyyÙ<|ĝ°mÛvBXQCDÄÌ,"¤Ş4Q   £wL%ÊÛÌĴ""j֔şY÷úġë Ûl6sá:ÂrCÈjHĠ*„Ħ4‚zúôióìÙ³ġƒ.///4Mó8„€™/´°öĉ4Ÿ%TíöBiF!ċÛ èDd›RÚt]÷bğŬ°1êf³‰3/} FNHĠŞ-]Öë5Ż×ëöòòòâÁƒOÖëġMÓĵÏÌï1óc°rTsàİêèUI%$&Ħğ¤ŞU})"Ÿ†~ÂÌAD¨ë:ùä“OÒÂËëÌıVAT­İÚĴ:š½¨*Ż×ë°^ŻVĞ÷ßûΟùg˙Ì?˙/ŭZ·ß=“ŞÊZE§Îtt'-ġH‰@D`‘ß&ó† M<ç@şòv˙dO öÏD‹ƒù‰ßœ+ŽtĴüèŒË<ğ?@g^D5ï&…Š?„úgš˙³Ûâ6ŞĥgUĦ˘Pµm …ˆBU?&sHşHĴš"À;áĠß˙£îgûô{˙CĞ?•ĥmSÓ4ûĠj÷û}ZĜGöLµ ¤j÷@SU4§’¸m[nÛvBxÔ4Í×.>üÖ/?˙Ġù/ŝĝĊŜÌùAò³H6¨ÚOoS hT´ Ħ% 0!4 +‚ '@l/Ûxsŝ!µwoD0’Z°ÏĊ”ċ@4|."@†çC1<ÏA Ñċq}Ñ]=6UÄt0“˘£çŽ£VšÁ¤Ú3Ê ˆŠÈ˜Żŝ|UĜßü}%CÈo @˘ H ˆ˘ˆ1ĦK@×á=Š/§˘c2ċ ;"ĥ£ŝÎüüŞ6?¸lšWĞĠĞġzŭ ÀÖ÷˘œĦ†*˜ŞU U› ÙÍ*¤B ˘6„€ˆž½Ŝîž˙ŬĈ˙ŝ_1Aö ԐÍ.D˜ h4 Ĵ[\ĴLX3Ħ]3Z"´ÌhTÁA~Ŭ{Ĵ$…8bsÌQLŬ¸‡—A@ÌP1J9$ü °Á&ƒCü=8CŠìâ^óß}1ޏ,$\ٝ IDAT‰‡Ïû[-œ~“ż' Ÿ#ı*eÛTO8@ŝ|”"D äŸË¤Kˆ ğDĊì“b·‹Ĝî"ĥ¸Ú+^_u 9"@’½ħO;<¨Ò¨ˆĝ?!|}ó5f~ÊÌDT•Q ßUĞ@ŞöĈa;À"ÂDˆhÍ̏(Ç Q ›@7 풅ÔB`\6„-.!¸Œ‚˘Eı˙ƒż†Ñ Psĵ€” äÏĦLc/—U’İġÏC@R˜AI]Qħ9rñû½‚rh¤dJ^&u”Eò×thRP`İZ 8@%ȲŠr­Ñ |·Ş{‘ù:<(Àĵ?L[*‚?_™°b‚ !AħŠ=€lğ„F<ĵPĵĵŠxyĠıÜd14Jö=H )´™ÙO<°vßRž?2QMf¨VTíZ0‚;“ĴĜϙÀZU.èdĦ›dĦœd£h…9céOÖÀ6àa¸l€‹¸   „†ÔÜqŒ²Ê*A ïeŽÑˆç#tI0X†„á6™ĝ=”C?Âúêş~?žc)n'B|JtP+Q ÉĠĊ<È*= Ĝ “áÛLġĝwòù 2 ʏNÂ+Ì0#_ $yÉÁÈ RACŠ&Ğa+JX!`EBC >ı…H*ÏP¨Î%HÁD—PĴUµ‘ĤPH²^RIĠ*ŞŬSKŭĉJĴŞ,","AU¨ˆ]‚î˘9.Ğ‘ì|]ÚDAŽ|ŽéëÑìûOâŽÇ÷Éâ[è‘Ŭzĝ½ˆ€Ĥ!Ĵ” BH‰#£[3v{Ĉf›F0µr jáSW•`ŻÔÁžÚ_†êòà&a.ײ¨ZRµ™Éœ8W_(Ş0PNÇF²y)`Ö aĞ´ÌL`öù™PœöĵcǨ½()ĥçû>o$ċc´LpÓĝéé+Ž|—_KEĈ7ġİ瞰íSŜ§İëùoóŒŽìRöldž m ´ aŬ0ÖmÀf‹—ö¤<éċa<ߟ €D„ )ĉ+hUFĠ*ŞÑ5Á”Ğ/deäYÖJš†´iIq#À Ô0ÀLp !\ F2Ş  ġ‰ €¨ĜmɏħtgÀ;<·„˜s#ċÇ>£cŠäz`ÙÙ4#˜¨Ï] òżùvrˆ1Ûô{f]Fċ‰l˜ÑF€&bœËü³½6Ü=PÑ23¸İ ŞVTí,HÑħŞRJ)¨*k^4“|~Ÿ ˆ8Ż%˘~D [W4ÇFĉpTLŬˆĜ‚Τ IŠXn×R’‘X‚€m2ìúċP`ŝ~rJéġ”ÑÉ0˘jħ wXĥeKĠ§dà ŻÇbŸœ!K+g21˜m{Ĉ3¸z9;Żĝԟ×/ €´× tċi’3³µD‘Ú-ÒT%́iî\Ĵ Ş@ŞVa´Xd•Ë‚İÈëP×Dħìş2T,bW/"@rİjá(ÑŻ!Ê!6ƒPv”‚$ĥ-:òöòħâÀÍ÷×,À$">ÏU„ó&áğ/FzT1†ÑrȔ ˆ‰zġ䊓 RvÛƒP F6(`ÎÏ7PĦ÷ °Q¤¤ŭ̘.•[˙]luħ–I,vŽ”sH§ÚÜWĝTĞ@ŞvVènĥ|Pïp %ϸҁ U%;l6Îŝ›Â(ôĦ4S,Y‰†@h£aB“ÁT\ò™ yy_Ù~MVrHtĵšu˘$KíWɧHċ’,(îşĞVTí(Œĉ@„FCb@ŭ˘Ô$(b`…âñ’5˘ˆ" Dŭv˘bî!‡à\á$WF1Œb†Q2ĜtIìvÔRÊ~‹s9ïŒûŝf‡™{¤p54Á:ŒÚ†ÑB@v;)ÊĦTĤòĵ[J 1ÙŝL˘½š<˜/“ @VOWU‰–ûkÑç]µ ¤jL‹á”) rĠq"îË!Qı‚Çĉ{|^"&ħ4o°ŻíM„Fè.š3èt~żK‚.Ú%&=„ǁ‘.%K› ÎÀĥ“^Q­FÛXZ}M3(Ĥ&pݍrĥc?G…an-Ф. êsĜ}“yI áŽ20ÒÜıU•Rµ ¤j‹ÊGBvt†ËJ7½ÛÊó?QšÉÀ LCy Œ0„ĉt€Î>İA¨St)-Cš++̃ĉü,@2ĵád6ÍAgôŝ3ˊú ´#9tßĊüÍ4yBTħŬ'lwM0ÔëBŸ1Çŭ\Ӑ—÷Ħ(şM}TqXŠŽ†êCZÈ”ŽİĤé^PŞ@ŞVí¤:šBÉĉD ]^[8É ÄÄèÈêùê¨ÌzKv‹ŭè\EĊ>ÚµLĞNŸ‚Ñ‚b9İdóJë RğûöK0Âqaùsè‘Ïaû1ağKh[‡Ra½ hîç–&é+•‹Úĵ]—,TšDĵßh)ĞÏĉäġÂIERR9ŞjĠ*Ş];„7ÓÓ¨ùYÑφ LVİaä ĊÚ$“•ÀIbYb£P]£!$§Ĝ^Og”Òħ:Ó3`”ÛT³NvÔÊéX†‰Zz˙£0*^GGꇎÀˆĈ…аääs(€Ŭ^°C2(e8ħpYş83@:À%)£Ĝ%Yïà³ARZ­­òşŽš/Ò ”ĉ<ĠŞU U;‚JÀ¤jyÇI€¨PĉĦ^š &­Ş Î…T‘'ÑsX/÷ĉQ죽yV˘‡=… F´—"L‡ÂżOt£çŠ÷Rš MÚ@Œ”Ñâû+ĉ"] aşF³a:³jZ ‚hAqن ûL i0 ŬċGkž³‹ 1ÊĴ*Ô²-ÇP iÚ-˜P“ŞU U{Ŭl˜TGÙÙ¨ŞùVPí†>B…ÇŽ"è,\§bĊTaÉ*E¨Nŭ>ÙkħǎBÂBIĴŭBĉ ’€ĥ4r‘˘xŻD6ñIr5mݜm+fZkħA˜ĞŽçžHâafú“OˆiQ.@Í0ᜭöĝ~™(yÓ\éû Ħ .ʜĜM°ÊĉÔzğ Ĥ–ï™'îò Ú\ş^™ÜTĤh"Ħaî×5ċJ–í(è:K*9nß ¤ÏĵÊîıW­İZµ7s@²C H<ĦwÑÚ„rŬ‹”Ħş˘$ “÷‚kMp.ŻAIZ³wĤĉİïúš†7!됚“'Ĉ*İwàԆ_n(hÍö¸Ż¸Mä…’÷0Z­†Ä…èEHı˘€šàÛĵ…*¨mûöއġIâ4Ĵéêû27Ü7 ¤ŒC‰ŝšD‰Ö „ıJòEË4ìct˘èş„´Orè3 |aħÍ!éaa[-öMĈ҂2šÛ^ŞU UğĥZšŽ|‰ˆĵ&ğ˜Żt|eÊŻdŭâĈ‰ °Î²Ô°ĠbkĵZy!·LŒL}§W_+CP Ĵrŝ2$ Â"¸¨`#VY‚î€3´‹ġ³Ġ>‚ĈdJĈvnÜÇŝ·Ü„šġÏEkêKŝ¨g’w’5H9Hƒ:+D××úËÀQoçAlp²ÀCċÊŬbHÉ@F j½,†*H"4÷`Ro´;(sŸ>Îȋf‡…²2 £|ÓRî[Ç!ğsÎı ĤjHĠŞÂÑ ŞU­N,=ÒÈ;€F=€ò“14×kşŭ û?úÈĞBwŻzŸ›Cf äBQ§(‡°²wµcĊĝo}gÖáQnš§ƒ²>L!˙@§ Ċĉ D³‰‚sO=hô04W„"çÖ(͇ġpĤŠ |íςŸüi }ns@ĊñĜ˘ä£˧Ùd‰ —jĠ*Ş}**;ù@ƒžÑs›¤<—ëûUċ6ß}´ùc<òM"[Qç),ş~Ë;ôġ'žôĠٗ° TUġ}1jµÁÌ 3]@AX˙?ï}saˆ]ñAÑ>£ ĞŞèİóÂİZRµ/ĥ£³‡NħŻyF[pKh=MÏĤm×uïvğcŒ/!²ËŻà‘‘뤲(Ŝ-`ÎWt|J8óĝŠ2> ^·Ħ}şZŻŜoÛÍ{żüÏ|K#Âç/6°èÀ(Ğ´"TĝĈçPµjHĠ”Ħ~—,rĜĉ'ú?ÉÊÈ·'5•€Ú RJ/6›ÍŝxğŬ~žRÚĉ'‘ h_4TıínîġIJġD-ġEpŭħÜ4ÍúòòòùƒşÂĊ“G+„íl~.ucıvŒò1Ö\Ö}–ĠŞU UûêêÌ}z²A)£Ñß`JɧcbŒŸïvğO_ż~ŭӗ/_~²Ûí6x€LîÏÁé)TB¨Ñ¨ŞĈĊĊĊ‰MÓĴ×ëġ×Ö@Ö·Â`Ä<¤ìŸ £ $ñ Kİż†jHĠnÚ¤(cÙn׃‘§cç 25G™bÚÄ_m·Û/_ü|³ÙlàÉy°L`4ÓƒÒİÌÇ9 ħ_(ĈWĞĠ*ĈĝJDlnI@*P@şâô<Á›òqR„V]T­İÚ͚gĝüJ:F£ùlG€= ˘JD @RĠ("]JiŸ•Q ĤR1MŜUï°B*Ä(MÄŞÚİjTUƒ9ùú*M3ÍO)£œ]bÉ,šš´]­İÚ-déÄ*ê!;ı&Œ '·Oŭ˘UĞÔIÉÁ¤ Œ– „µtÇvú"xH’ïK!"ME×5”ÑHۂfJİŝŞU Uğ–FM€n÷ó#í%k4 xŬZi(ÀĤîD“)-éTĝîé¨2‚­S"а97é™Bdk­¨ä¸\F°Ú…’´ËĠÎĞUĞ@Şö•˜zAU.ŞŒDÊ M6IQēˆĤ0Šŝâׁp·Cv'aä·ó~ĝd„ĈžÒ‡YċĝĴÛFYeQ~ğjĠ*ŞŬ´É¤hé9aşıŞŬın›(ȋBĝˆ>ċëFKPš ŬŬ(Ğ —İ ċë>\—URNħÛׄQ쓵/—²ĞVTí6¸Hĥ£j]öPĥ>Fê…YUK ċÎÀh &=û$ž°0²}CžY§jJ‡ĜêÛ]Fù£zUöjĠ*ŞŬ¤)†ÊÙeóé³t:êדÛ1¤eÈÎGġ%ŒÒ •4Mn¸KC€i2œ2ÊêȞT&4dE@4ġÌŻ £Ü? MħŝŞU UğHZ,н&Œ²{ͅD‡fo}R ˆ–€t—ç‘Ĥ I&0*A4ŭ½Š4•¤P PÙġRÏWFŝ’joK܌ןUĞVTíFL†Ö YôzL•£mêáĉ£ú~ñë5Ò4|‡;i]8ž@i.аéJsha˜ŒŠŠä)y•‡ş2ĥZRµ7WGÛÎúĊôf0RïwNCƒÚJK‰ çdÜŬ5…TŞ"Âé4wò=<†ÈÚkL‹˘ž Ó[D€vhNX­ZRµÛÀ¤7SF$.zi_“ÒDKws@ş+ iŞĝè˜2šÀ¨(8;é”§`=HŞUĞ@Şv0RHvdeċċ+ZFyÈڅƒ ˆTĝÉ”ôL…$¸ğ‹ci"^xÌHċ>$"1÷ĤÚ 'oÖwFÙbšUCŞVTíVˆ#kÉMt˜­UÈ&ëÔM`˘Ü¤EŠV~Fcµ>9>´˙+{‚ħğ£8<ƒ‡iÑU.€Ô÷Œ"I–ŞMC'ÚÀ„ÀÔ VQELzFŜz˘l°X­ZRµt“M:´/À2Œš`@büY"F…dÇĤ:xÔöÓuFK0Z*´úİTFy‡—·iò8À•ÑÉ*4G4 b°wüUÄC§qİN]îŜ. ¤K}yĞUĞ@ŞöUšĜ:KÂN`D4ĝ(œˆĴġ1‚(€½PN°Me#û0Ü\ĊïğZ>({ŝ2ċ›Ž›'JsĜÁÄ`‰X­¸HLPQ$ Q28Í 6RĴµìŞU UğE$…UlH2‚Q"ƒQ&yƒˆ"ˆš°gWÎİŝGw½žp8—tlÎlv4”pyħBC 6@ȏR B#„½èŒ4pÍi¨VTíXRhQL00À(0頒@&M舁+ŒR‘´"?£“ùp:{èüĈĊCĥ‚D03ĵ†Dâ™'ŞŒÔÊÚNaäê!·ê­VĞU UğIËIÄM°ÄĥŻÓuFD3!ŭä9{Êp Ş`sÔp3ÔF+ÚtÏ9iZkÇ´Ü]ÓĤ×Ù?€UX·@\°´`‰6XcÌŭmÀ„Ĉ“K böc7„[Eᝇ`Y•t+ŽŞU Uğ*Ic²Ñ2@ mĈ˜ˆ‘ÈZL(€À–™G9<$ fAP²ĵıħBš:Ûcê䞉ÏĜV­ĥPšLÀ°FÖö½ŞôÙuIԓ Ċċ‘FŠ@XW…T­İÚm’‚†îâPÓnôwAR ı£#ÑÁKzŝ7Aí „Àöw˘¤ŞeżŸìˆËy’rX}·ğ¤ıĤ|s?€81ƒYm˙GJ`¤Š”ì“"&™‡`½2ĴjÖwµ ¤j·HŭÊĦ2|—C:Y%%ħ‰aMĝˆĴdóáJ ”À˘Úó%ì§ŽöXVY_w·Ú7cÒìEUó…|§ZR‰wùUTş^‰ˆR*Şp,•|âvRv£Zµ ¤j7Ċ£Àƒsš†s ‹˘à¤H$`°•A󆣆'”˜s’Í(¤pFeİÂŬŻÔp Fs*‰T•,ÁÄ+lx1\[dĦ:SG]ZjڇĦwU†Q ÙUĞ@Şv+RÇNIg;"ٜ[ê·À!§‡›ż4é#`ë@;…QVFKḲZÁ]ewĴ[l˜ğ­Ş”/Ȕ"?v )AT‘E¸NŠÖT33+`a[‡¤R Ġ*ŞŬ,Œ@ ’:ëgÔĊy˙jsII‘`éÄB“äžA)Ĵ]„Ĵ×ëGOž¨CŞVTí†Çëä2²Ï.ŽüU #ô*I‘XDĦ” Ìà$ ğÚk…ž­VĞ÷>|xBà†™£ƒ'‘2s Hà·ûħŭ]RŜó œü‘Ô_F,"Ħmۇ´mû~Ó4Oˆ I‚B!’úìş”1)ÏFı˜†JjµïjHĠn‡£LR” Z†–Ċm.‰ˆA˘P"ÍI0€ĤiŜ_­VWDÖëġ3Ù¸*ÊÍ·3xòmLk·Ŭ­¤†2œÙ_—!ΜÀo3óeÓ4_kÛöç˜ù‰B“DR‚z½ş$ÒCé(Œ²IÂ˙ßŜÙôH²\eĝ=™Ŭö€0Hĥ€Kdħ/ò'ü`/@^ħfÁ•@²A›‘ïÇtueDœEDdFfEfUÍ̽Ŭ3÷}¤V}LuVVuNŽUġk3;oú#µâÙFCŸ]tԋ’ĥ·˘Ş÷EäÑ9÷G"ò‡ä/ú˙ŝëwhˆ Ä’"DĊú‹›‹°ÊĤsĤxcRĦÈKŸ³Ëĵ°2_?ş.£ZàùĴ!gw%xŒ)ÂÔĉqÀŸüìŻŝàïŝá˙öŻ˙âG8ŸË×d‰YıŜdKY"‘z9cnˆò* _İCxN”’ ĥt ´Ò15Wh—25ċjg[Ĝ’Ŝ^Şœ?Œl+ž·N§jvm%TS ëwWûF™UğS+Ïrtc&e½Pŝ,9!AapPĠœÎ1$üÇŻÂğwoq aJ˜BÂӔŽe´İƒaj€k.BB!‘jÎp²›dÔö{›b^ĠG‡ † ïÂ7ĝÏ˙=áŸ~ù?<†qÀ8zĝÑÁ•šwN1ĊàüèàÍò}²ĈİDm!•\´Ò·Éğځ(%s Ğ”²ıóm³ĤÔI.[ËĠŜUNYŬ²&G–m×Ì‘ò65Ħ@—íĉ*jYŽuÀ¤„Xǘ{ĊdPÍ~ ’3ĉBy]PÄ1C˜"Bˆˆ§ !)Ĥ0!œ#R²ƒişË‡ı’óË~B!‘”œ‡JşÉd4uf8O!:Œ£á!(†Eô‚!/À0úœË,€÷=ü30ú°ùÜŜb–ÌE&zà,eŽŞ šžfEFĴê4cŒ%š*ëx,2YŞb0Íے6Àj%gş(UÍ ²R*‰êZĉ#Ñ,4–y;iΆBˆ ĨˆQĦâòµ )ċ×XöhœBLˆ!"œ‚Ĥó„TÖ!Ŭ-£µi‚Œ?`-;B!‘WĦ£f5˙}2jFj¨Î „F1ŒÎcgĵÇàï<?x8†A0ŽtŠĵàƒ ŜCjí<µġt“(JôÒN³µSo@.Ûd“Y¨ĉŬ.bÉëĤш,"”&ú™_³Yà#X\˘.³5a9M>)C̒‰ !¤˜’ĉu^ĉr…òz˘òQókCDœ1Ż„½œJĵUFÀüûf‰˙ …D^xĈ.zgĜ7Êhé,Ç/Ó0qT !bt ĵÀKVí|„Á88Đ£İÑ †A08‡Ág1ıÒêBÄ:%WÓ2°Ŭ–ñ8­w\µ?pÇÔùf6%wRÚ˙ìĜw‚İĉQĠ9%;‹H£ċD„˜bYÔş~­!FÍI %aÁêġ0ŭ2’Ux Ž×…D^‰”4_C²Ĝ+3s£ŒV 57.EÀÙ)FŸ[T ÎÁùûì0Fï0ú,§ċç\ıïà\_’\"',сuċ=K\ûVôò#N‹­§ġÌr 9Uħd!eÁ(bÊÓs!Ú,£³ RÒrmIçâ¨)-Ypğ…Rêù -Ó£çí…D^p².5ÛnŬ~BßKF°ËĤFކsY#²4ù|–ÒĜHi.KÈg9y_’œÀyÀ£DM$F î\{SVğqÀÖÌÁ™• ú’ gKMıñ,ċ|b-?V"¤4':è^Ûñ%£1:-ó’`}UB!‘—žĥ+ôƒ…İ fï/£Ŝ (Í ^ €†ò„wÈQ’s9BòKğôÁ[‰¤JTU§ûDà\iX"*Ĥúĉ"wÊhóo‰¸Ì™jnˆW œjnŒ7'0”È(•(iŠYPUHñ¨ê·!£ù—›Ò‚Œ…D^4JŞ-'ĉ5:ñƒe´­ˆhNo>g$ˆ \?ĝ=ĠHʗVÜŜUċ}‘u”dĥçŭ9)ğeš˙óò§ÙVHŒr´T˘£¤İDAvmż>˘Œ.bלe·üí ĦÈKEG†ĵĥgœ>ŒnÀ<¤*0iŽêóŜeù²¸Ö ò"[Y'Ġû²sÍȎŭġȧŒl^Ě´İ­-W§í.‚ï\F÷6ƒ8żZ³{ü‹„PHäN×Ü2˜ñ.ŻıħtÙ ï;”‘Y˙½juñĵF¨ŸÀàJÚ·4Ï×);ğ:èßÙ*QϚD†ŜPnğ_áËË€J:;z™vĦÈw*, 5ƒĵ./êżœŒŽ’ ֑•Ŝ}À4Ŭá ˙İÈ( ,#nHħcı Nü’[Îlğí,‡€w%ŭûӓÑî5#Êèú~bYPĵĴÛ˘·„PHäÛ”meŞ Z–£¸]eô™É€8˜s0]7eì´ŝ°+ÑĊEpʎÜ.˘ıÇjÀIMĊì”vd鎰ÍɵċYWµäNoĠÍv6'ìvƒŒšßÏĠŽġe_öSğegôxí‘Œpmżn•Ñf˙İÀ°}˘·=ħ⃠=Ŭ*"ʈ0B"Ççé×Îfg9ıÚnĦ4|ÛtÖݘġ[ĥû2:ˆRn’Q/2:Zgd7Ĵ3ş•Ü+#|,]‰ŒÌbsżıڅĝ£Çn8ĉa„D.ÎV!µXM€ĵ‚44…EmvHa7Qĵe]?%ë!1HĵŭIDAToe,'ïĥTĜ‰Ĵ´µ÷şÓtŞ†\uûĥhìĤ¨¤‘4ûdr=Blżbk˙].ßĥ+Ä[dÔŭŠŒDr–ÚZ†×ZÇ3""ù 9ÙÁs¤ıא.Ġİ×ġ£í˘ÏŬVŬK#r9È^Èè`Zl7‚éüÎ=ÓtĞ1z%£ŝŝĜĦ8q‘.mô%vodt4\™ĤCn7_[hˆµM ç6òÖtöµJ‰PHä½Ä´ş-ƒLL$Uw8È,E˜Jׄ’yWĴ²´ĥ>‡Hà\3sàK µœĊ‡ÚêĦ–ĥ›f€ġS?wm^8o\K%2òyħóküĈ  fљĊr|èÎ £%B!‘ğ"# ŸQgŞÍ,˜Ù³š<Ï :†RnÌcŞj•+-c‚xİ2\ĜkÏ"y›Ž%Q ùlĵş#š>A˜"P„'Îċ÷J ĦùŸKÓ=ĞŭŽLÊœ „Š“ŬyÙNŜ7E’YXıÏR‚8Ÿß×ûĠÔEŻ2‹NœŸgÎL“ÜäȜ[ēÒ,âìƒÚŜgÑjmÖWĥİiiÍ0KÚ s=Ê>µ‘—ċÏoù:MÓÜ/_Ò*Û·U^έ#)4I'âa:@ÜK2>WR“‹ÈšF‚VSRùî­HÙI–˘ó%ˆÔŻÒ“Şž;Bڛ§ò…D6½ħ§ëJ#U­2zŠ1~ùëßĵû˙/ŝù˜ĝ—ġ–vSğ›Ç›ë<×ğ?ĜÎĥƒ'–¨¨ù\ĉi>YïœÙj?WŸ£óòŝÛĜÒñµ˙:Ŝ9=¸e¨6ĥ0•ïs Ìp°#›7Ӏ£?ûjĝršĤsJ)Ŭ!"B($r8m·ŭQUĠišâétúf†ßyûo˙úóÇÇ˙˙ĉ'*"ìœû!€Ñ̤9=Góxuì óšOTÖ•›ġE"˘‚™=”~cüżççoŝûôüüöùùù›óù:RöfĦÈE4$Q’NÓ4===DäwŞ*1Ĉó0 żuν‘GC‘Ž33W´ıE+,ò*OH°Í–+t @Ëm2³ç”ÒğWçóùíÓÓӗ§ÓéBˆÒ5QP!Ŭ3Ĝ’IŻ…ôt:|BHOŜû·ÎıätƒÁÌ\’´÷[1QFŻ˙h„*Ħ"§*¤hfAUÏ)Óù|~7MÓét:M1ĈXŽĊŝ´ĊC($rí‚L÷ŒVH!Ĥ”0M“޽÷ÏÎıÀàœJTä ı"% W‘Í´(§W%ë5DZ˘%m¤4ßWĠ ŞjL)M!„)ĈUUq{RĊD8ożŠT\óĜ5·ġÇ7·Û×ıu›íHç‡Çà딒íDÊU2İyĴċqïG;Żm·³·V‰‚b„DçÑÒ6oLŸşÓ½)ž"#ëM(¤O^H֑IÚHéH8×("B!qş‚ Nډ[ÉÈíDf”Òë’Ñ5!moÄdb"„B"7 HmĤW~g{İŠH ı+"˘^Wt´÷·µ!ġĤñö˘%PN„B"÷DJ=9Ù9éFDmd¤›èˆ2úô¤¤ÑRO>{vLó&ٕPŻd‘h´!m·Œú׍8e÷:£^ttݘzÓ{ײí¸H–PHäê µÛF<=!ÉFLG‹a)£OOLGו ŭkHS …DŜ#bÚÊĤŝğk$Ó&0`GHÀqVeôz´—ä€!=n#Ğ=1˙‹û½hĈmî·Ï]ûeôIGJvG´Ô“Ò‘ŒĜz‚PH¤{ ìI£éÜ*!ıñ}Èë—ŜCLG5ì($r§ìH;8ì%9ús˙·FDG‘Ċô:etMN·TGF„p0 ğÂ8Š”p QFß/)×Ë˙Ü"#Љ0B"wEJ{ŻŬFSÑç%ĤkmÇ{Rş& ˆ0B"7 rgµ÷o¸ó9òş"¤kÏŬ*[G8rs$#7Üż'"âñ÷ié‰Ĝ Żc•B!‘>&ä#½†|žÒ²÷x ED($òÁÇĈûN½ñXûü˘Ĥ{Dä[=N(#Jé–×PB„yUÇ ·ÏSDĦ-òIIŠB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„BÈĞä÷ż^ÖÚ?†nìIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_CodeBreaker_128x128.png0000755000000000000000000004244612467662066021754 0ustar rootroot‰PNG  IHDR€€>aË CiCCPICC profilexڝSwX“÷>ß÷eVBĜħ—l"#ĴÈY˘’a„@Ċ…ˆ VœHUĂĠ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×ûĵçœçüÎyÏ€&‘ĉ˘j9R…<:ĜOHÄɽ€Hà ĉËÂgĊyx~t°?üŻopĠ.$Çá˙ƒşP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"Ş ìôI>Ĝİ“ÜĜ˘İ™(G$@ğ`UR,À Ĵ@".À€Yĥ2G€½vŽX@`€™B,Ì 8CÍ L 0Òżàİ_p…¸HÀ˕͗KÒ3¸•wòàâ!âÂlħBa)f ä"œ—›#HçLÎ ùÑÁŝ8?çĉäáĉfçlïôĊ˘ŝko">!ñßŝĵŒNÏïÚ_ċċÖpǰużkİ[ÚVhßù]3Û  Z zù‹y8ü@žĦPÈ< í%bĦ½0‹>˙3áoà‹~öü@ŝÛzqš@™­À£ƒŭqanvRŽçËB1n÷ç#ŝDžŭŽ)Ñâ4ħ\,ŠñX‰¸P"MÇyıR‘D!ɕâé2ñ–ŭ “w Ĵ†OÀNĥµËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“żù@+͗¤ĵè\¨”LĈD *°A ÁĴÀœÁĵÀaD@ $À<Bä€ Ħ–ATÀ:Ĝµ° šá´Á18 çà\ëp`žÂĵ† AÈa!:ˆbŽĜ"ΙŽ"aH4’€¤ éˆQ"ĊÈr¤İBj‘]H#ò-r9\@úÛÈ 2ŠüŠĵG1”²QÔu@ı¨ŠĈ sÑt4]€–˘kÑ´=€ĥ˘§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcċX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´şW ƒ„1Â'"“¨O´%zùÄxb:ħXFĴ&î!!ž%^'_“H$ɒäN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉŜä²€Ĵ —‘·O’ûÉä·:ĊˆâL ˘$R¤”J5e?ċŸ2B™ ŞQÍݞÔވ:ŸZIm vP/S‡İ4uš%͛Cˤ-£Ġšigi÷h/étş ŬƒE——Òkèéçéƒôw † ƒÇHb(k{§·/™LĤӗ™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çŞTUsU?ĠyŞ TĞUĞ^V}ĤFU³Pİ ÔĞĠİUğİ6ÎRwRPÏQ_£_ŭ‚úc ²†…F †H£Tc·Ĉ!Ĉ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsŞfĴf‘fĉqÍĈħà9ٜJÎ!Î Î{--?-ħÖj­f­~­7ÚzÚÚbírííëÚïup@,ġ:m:÷u ş6şQş…şÛuÏê>Ócëyé ġÊġéŬÑGġmô£ġêïÖïÑ7046l18c̐cèk˜i¸Ñ„á¨Ëhş‘Äh£ÑI£'¸&î‡g5x>fĴobĴ4ŜeÜkVyVġV×ĴIÖ\ë,ëmÖWlPW› ›:›Ëĥ¨­›­Äv›mßâ)Ò)ġSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlpĵë¤á4İÄİéWggĦsó5ĤKË—v—Sm§Š§nŸz˕ċîşÒµÓġ£›ğ›Ü­ÙmÔŬÌ=Ċ}ĞûM.›É]=ïAô÷Xâq̝§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Ĉ>ŸzŸ‡Ĥ"ß=#~Ö~™~üžû;úËŭĝżáyòñN`Áċ½³k™5ğ/ >B Yr“oÀòùc3Üg,šÑʝZú0Ì&LÖކÏß~oĤùLéÌĥˆàGlˆ¸i™ù})*2Ş.êQ´Stqt÷,ÖĴäYûg½ŽñİŒı;ÛjĥrvgĴjlRlc웸€¸Ş¸x‡ĝEñ—t$ í‰äÄĜÄ=‰sçlš3œäšT–tcċܢıĉéÎ˞wç|ŝü/÷„óû€9% pHYs  šœ IDATxÚí}w˜œeıŝŭ|ezŸÙŬl6[H!„$@H@" AŒT9x¤ÉÉ% ñˆ PAÂĦI"‚„¨„ !1mS·÷ŬÙٝŜï}~dÏ rÎOÉ ²Ïuíµefçyßû}z!ŒÒA“ë>"şÀqBˆ11€gl‘$İut§>eÄÌċÌ|+3G˜9Ì,„`]×Y×ġ‘?§„;„?B„Fwî“ç2óŸıD…B“É$g³YffQúbfï ! Bˆû„c‡ÏB£Çù˙§­[·J3gÎÌ\Żëú‹ı\nF,Cww7bħ˘Ñ(g2bfx½^ĝŭ~ž8q"ĠÔÔ@–eÖu$IbcϙD”p$Io !F>> €‘żÍfżÛÙÙİtvvŠh4Jííí444Ä”H$Ppı\‡˜>}:]|ñĊ\VVFÌ ff""lì=3O“eıa”ì^niiy'‰ßÛۋĥĥ6niiĦîînD"ô÷÷s:Ĥt:BĦ]×aħXĜn·See%ĤNÊK–,ĦÙ³gƒ™Q:|µ‰ˆ4—J’ôÜÇÁ FÔÒÒBġġġ‹Ċf÷ôô<×ÙÙ9§§Gojj’ÛÚÚÙى.¤R)¤ÓiÎçóĈ 7ÏÖĜÛ@ À3gΤğïsç΅‚à}œ `ş$I{F9Àásók6nÜĜÒŬŬ-ġöörCCşşş¨İİ ƒƒƒˆĊb4íŸz-ĞĠŠÙ³gcùòċ8úè£YADdˆƒô1s½,ËُòsJ£Gŭ$„­]ğö•ĈĈFݵµ•÷îŬ‹ĦĦ!jmmEWW Œ<übÙ#˙Ĉù|6lÀĝC¤Ói”ĜĵĦş@ŬñQÖQ|ŭùÏ^ŜÓÓ3uxx˜ÉjµÒ}û¸ıı™“ÉäHV˙?:½…BŻżŝ:oĜ°Áà0Ĉ˙#fĉۘıf#½ġÖ[ßïïï˙R<çH$‚.Ĵ]ğÛ·o§l6K0nÜ8̘1ċpğŬ(++#żß·Û UU?PĵvwwÓ?l€™çˆÍfŸĝ(?Żİ££gûöíË|kĥ··g …Âol6Û)šĤĠ° èüóχĊb9Àd$"tttb‚Ëċú͖-[ò£:À!Ĥ{ï½W€T*ġoĊbŠ˘@–eêïïG$A*•:à†J’ĎêêêSš››7ü3Ĥô… /”$)_z.µĥĥ˘ğğûÍrI’àóùĵ“&M*U?şùĉ›ĊC=TŻiÚWUUĠá0'“I´´´ •Jħaî•n+I’”óz½s›››ßù_ÌÀhċʕQÇó¤ñüH$Âĉ˙•D33 ëşóŬwߝ3 €ˆRİÔét^ŻWr8”Ëċ‹Ċ`³Ùàġz€…:ĝŭŝ[úúú6üĞk”——?m´˘(ˆĊb#ÍAVĞ{öìÁşuëäQ|tûí·ĞÙlvĠjEMM †††044„L&IÚżEšĤÉ6›í/~˜}ğñĈ7Ȳœ6DF{{ûÈÛ"‚ĦPğwïĈİ£ĝ(´`Y^”N§‡€;;;ıŻŻûúú‰DL;=˙ĜpŝĞëÜp i‡‘5äĵÁ Fĝ I²Ù,żöÚk "÷(>Êd2W˲ŒqĈħÏçC2™¤ÎÎNÒuâñ8‚Á EÙÑŜŜŝÚÁĴċrı$‹ĊÇ§Ó ”r  ë:^xá´µµÁétê£8ÄÄÌRħXœcµZQ]] §Ó‰ĈĈFôġġ™ĦiĴV+@8ŝÖÁçñx`ħX`ħXàóùŝAD"ĴZµÊàL4 €CLßüĉ7ϔeÙSUUĊÁ`İT mmmœL&kš†|>fîż÷Ŝ{˙t°ëY­Vx½^¸\.Só7ôŒW^yMMM§ÓİŒàS6›'„€ÇßïG$A[[Ûĥżvğ}ÛE]T<Ĝġ„ÂċrĦ²²ĠĠĠû tĝƒƒƒ¸˙ŝûQ( …†Qê/I§9NÔ××jllDgg'išFÈbħ P(@Q”‡v­Ż}ík“\.WÈçóñ˜1cà÷û€ °­]ğ{÷î59Ċĝñ;Gpé!Žġz½3f ‹Ettt šÏ)EġxòäÉïìz===5Š˘ÀëġrMM rı6oŜŒçž{?˙ùÏĤL™ÒóQì jkk;‹ˆTŻ× §Ó‰žžìŜ½ĤŽhµZ)—ËíÛ¸qc÷˙Á’§ĞŞ —ËEǏ‡ĊbAWWÖĴYƒµk×bçΝFdcǎMäóùĤQp)—Ë}Ŝét˘ĤĤ†µ··£µµ‰DÂx •ĜñÓ˙Gŝ†…6› UUU¨ĞĞ#´wï^´ĥĥbïŜ½ˆĊbÄ̰Ùl…Bû{ìħQBÊçóÇY­VTTT ŸÏsGG—4l°a]×Ħ(ÊóğÖwó1’$MWUcǎP(ÄBnjjâh4ŠĦĦ!c]ŞŞBħX\û‘éAGâá/Y²ä$ĞĠ:1 ÂëġR*•˘;wRooŻyóív;4Më9ëĴ³ú&vwwŸfTTT˜1c(‰Pkk+uww£X,Y­VŞ­­EħX\= €C{û%"ĜívD"455™q˙R5ˆhŬ?˙?°6–$ .—‹ĞĞĞ‘ËċÜ܌ĥĥ6ôġġ™Ï3LŞŞŞ£8ôĠŻ~U*y_>çp8PUUĊ6› ÜÑс\.gh˙BÓ4Ĝíögv͇zhl:že³ÙPYYIUUUBpkk+÷ġġ! áħcÇ"™LöÜsÏ à£>*–/_î$˘3Ün·‡HRhnnFww·šuğŬœÏçqÛm·½ƒĴĜĵyó™ĊbÑ£Ş**++á÷û‹Ċ`Ô”Ĝ?<\.:::^úH}!Gûßµk×)D¤z<öz½èïïÇΝ;1ŠÇpğŬ˙}°k}ï{ß;V1Q–e„a*//G2™Dss3úûû‘ÉdL‹ívƒ™7~{rÄà‰'ž(gĉ‹ív;ƒAhš†={öp)9“ŭİßĊb‘/^üĦCħ·Ŭv›QA4WÓ48TTT€™ÇÑÚڊh4Êş_€Çyj‡Ŝ~ûícTUµ„B!öù|ˆÇĜ½{·İŭÛívÖu²,żùË_ŝòC×ċmÛĥM]ׯ”$ @€á0ÑŬŬ=2à„úúzıżżûΝ;ñ1Tj1(‹'ʲ ÇC’$QOOÚÚÚ¨ÄŝÉëġ"•JAqPÁŸ×^{Mżçž{ê …ÂtUU…×ë%żß\.‡íÛ·£§§Éd’ˆˆü~?I’„\.÷œqĈb‡ˆ\.×VĞĦPÈHŭFss3K’dôôA6›Ċ¸qŜ:ĜµzzzNÔu6› ċċċìp8JĠĠeä03ó¸q088ˆ²²²Ĉo(=Àċ…Ba²á€×ëe!Z[[‘J`ħXLsLÓ´ŽĈĈĈğ][Ò)¤p8 I’ÛۋŽŽ‚Ífƒ,Ë¨ŞŞB,{oÛĥmo~\{sD`ß}³$I‚ßï‡ĠjH$‚]ğv!“ÉÀf³Áét"‹Ááp´öž{î)žĤ( |>BĦ4MCkk+š››‘Éd ë:BĦ$IB˙ʏsoŽärı…‹@€eYFÉûfF.—ƒÓé¤d2‰`0ĝòÁĠÑÑ1Iá–$ ċċċ°X,Èçóf֏ë@µµµÔ×ׇ &ĵ> €Cŭ!%é<§Ó ŸÏGšĤĦħħƒƒƒpğŬP”ŭi‘Ì<\WW·ë`ײZ­K…p: … Ë2zzzŜŜ>Rû犊 Äñĥ÷Ŝ{ï½QBşġÖ[§+ŠRSòŝq"‘0“?ĴV+ìvğq0Ż­]ğö ²˜Y‰F£Ó  "À7şşşÉdĜċrĦ˘˘‚t]G*•zécżŸvèş>bħ(ĈmïïïG{{;„Èċr°X,"›ÍBUĠƒÎ[²dÉİŞŞ–Y­Vĝ|>²Ûí(‹fäÏétTTT ğğ~ż˙…Q":ëĴ³„—µx…BmmmˆD" "äóyŠĊ"f̘ñ—ƒ]Sħ¸TI„p8 ·Ûx<ŽĈĈFÄb1x½^H’„ŞŞ* ôïÚµkŬ(íŬğ—˜Y-‹ ].—fħXÌ΃ƒƒTVVUU‘L&e"ÚúŜ{ïíû°ž¸/|á Édò¤’ïŸËËËĦ( Z[[İĞĞ B! ë:rı܇…~ôi@KK‹¸ġÖ[?#Ë2œN'I’DħX ­­­P…‡††`ħX(™LÂét555Ê·rċJŝÍo~s4Mqı\¨ŞŞ˘p8 fF[[§R)8ȲŒI“&QkkĞf³ÙFp¨)›Íž*Ë2ìv;ìż­­ ÌL…BšĤA‡ñ'hoo˙ž¸ööö+œN'ĵ^/WTT@Q¤R)D"Êçó?~ĵáD<o˙ÙÏ~ĥo‡˜ĴVë"Y–›ÎÍÍÍB6›e!„Ñïw¸˘˘bÓÁ•Édĉ(Š‚ŞŞ*šµĊĦ3ñ¸Ğ˘˘½½½ÜÖÖF{öü½>Ÿ'°X,Ż !˙*ŭîwż£K.ı„cħĜéVĞĠŜŬŬ_ŭêWxÑ$Iê …B݌3ĉħ7í÷ûihhˆ?î}úԊ€ÁÁÁ³Ó鴑÷OëׯÇ…  …à|g͇]c͚5Äñ³ÛíĜ³gż³2²ÛíŭwŜyçQŭŭŭ˙uëÖ·kkk‹˙T ğğ{ñ755qcc#ßrË-8ñÄQ(F>mÓÀÀÀ‡Îŝyä‘GD.—³¤ÓédY#8Ì@°ÛíßşŽ;Ì~³mmm|¸ìÓ§JĵóÎ;4wî\ž4iÒgšššüĊbQTUUÑkݽ—Ë…c=–Rİ”y8D´ĉèŭ˙Ï˙ûßżÎét*"‰|N•Ĵ¨¨xĠh y¸Ñ§ sçÎe8öĜcżšL&Çéì³ÏFee%üq‚Âĉ (ʐQšuĉßѕ••xë­·Ŝ?$‚˘(;víÚ=\÷ìSahšfŬ}ûœĦĦĦ“Éä‚T*µˆ Ë2ÊÊÊP( Ş*ĤOŸŽX,–èĦ‡,/ĝ"Óé·Î<óÌûŭ~›ßï—+++·3&~ÁüSĠ9·ŜzĞŻİİi÷üùó+„ĵdÉ’$ ²,£4,’ü~˙‡††5 €Còç%“ÉӘùßòù|]oo/Rİrıœ "İX,r)T__ϵµµärıÍfùÁ¤_|[·nE(‚ËċʃÁ|mmí‡Ħ}ôÑi—˵Ĥĥĥĥ÷sŸûÜ*"JŽ\˙ÒK/=?8cĈ ü‡?äöövúŬï~‡—_~™u]çşş:iìĜħçÜwß}ŻŽà˙^}ġĠħBˆûEù²½½½ÈçóèééA"‘`§Ó‰l6KŠ˘pIÖn·çóħÏç£c=3gÎ4ûô?ü¸íĥÛÈ֕$ ûŭƒpğŬEżß˙GEQ~ù裏NDú̙36nÜ8ž;w.yĉ™x<èêêÂ+ŻĵÂ[·n%Ż×Û1sĉÌ[/^üByyyqA›7oĥlÚ´éĤ@ °ÔétZKYĵ<88Ȟt:ÍÉd’TU3ñp*•B*•B>Ÿ'UUYAċċċĵ`Áš6m;ÂŝĤt÷ŬwA’$Ĥ3“ÂĴÒu=Z^^ž)//ŻŞŞŞ’ÇŒƒ“N: vğëÖ­ÚµkÙívSee%WVVD£Ñ3Ÿyĉ™Ġ‡Ûž~b&†0³ċÙgŸ]_,/w:J.—bħH‰D‚rıÛl6bf¤R)bf¸\.N$°Z­˜3gf͚…\.‡D"A}}}hiiĦ]ğv!  ˆpêݧҙgžÉĞV­ÂÀÀTUE0Duu5WUUÁçóÁï÷;sıœ7—ËIÌ̚ĤQ?'“I´ĥĥRcc#éşMÓ ( ­^½ş0nܸ˙Üısgj”|ZħbĊÜH$òlsssu8f§Ó MÓHQèşÎáp˜òù<’É$)ŠbÌùáéÓ§”SN˘(ôĉ›o23SGGoÚ´‰˜™½^/-\¸çϟOÂ466âÎ;ï„ĤiìġzÍĎt: ›ÍĈĊb‘ìvğ‘îĊğví˘.N§Ód³Ù`³ÙP]]òòrìÛ·Ċbq]OOÏ)£:À‡ _|qV,ۘL&EQD>Ÿ—Jħ}jhhÀÀÀÇb1J&“p8ìñx¨²²§œr ĤL™Â§žşżíŝK/½DÏ‹oĵñìv;Z[[ħfÍž6moĜ°'N4’…À—\r .ĝbĈúġ똲`Áž2e чÑ××ÇĈ@İW^y—^z)ßÀöíÛ9ŸÏ™y‹Ĥiç@&“Íüaéž{îyèûîûîğOŸŸOÇsŒèîîffş³ëB×uÁÌbxxXìŜ½›;::DéqÁ̂™ĊyçÇÄÑG-újQòò_O˜07mÚ$˜™u]ïĊbFOñCÒŬwß=ó?ĝß{ï½ìvğıŽu]gÇ#ô/ñĉ͛ß~ûí<~üxáp8ĝêĞŻfbñâĊü3çž{Ä[o½%"âË/ż\X­VŜħc‡qPBÁBÁ̜H$8‰p,’'O03ïÚµË/úúúD"‘0AÂÌ◿üÉEżŝz^°`ÀŝCv8‚ˆñµŻ}MD£QÑĜĜȽ½½İ%K–TŽž˙B/żü²óŜ{ïíuı\| 'ffżß/ vžN§ÙP°„|ÜqÇħ$Ilßïg§Ó)êêê8™Lò׿ŝuŜğwŻ E1e˙Ż~ġ+ôÒKÍßív;żôÒK†RÈBÎċrÌÌÜÓÓ#öîŬËİTŠG8í´Ó¸ĥĥ–ŻĵòJ~ĝá‡Ċ9çœï· Ž9ĉŽĊbbÛĥm‚™ıĦĦá£~€˙…\.×ù7nĴ( hnnĈwżû]öx<öZ>úè£x<ƒxä‘Gpúé§³‚E˘(\r _ĝ^zé%är9îèèĜl6(ŠÂ²,ë_˙:žzj?Ĥyóĉaxx˜oùfŒÈÑcEQXÓ4öûŭÈf³Fa~ò“Ÿà¤“NB]]ŠĊ".şè"Ô××càóùĜív“Ñ‚²²òşï|ç;£\àŭôôÓO˰|ùòu³fÍâd2)ÊÊÊĜáp°ÓédCĤϘ1ƒ;::ĝç?˙9 !¸ĤĤ†].‡a.++²²2ĥÛí|ŭġ×skk+' >÷ÜsYQöûŭìġzÙétšJâĴY³˜™ùÌ3Ïd|íµ×²qȆÀÌÜÚÚÊ[ĥláxùäÇ^!üħ[‹˘żżı\Žív;ù|>‹EjiiĦŝŝ~x<uÔQx<ĤBVJĝ$–ùŭ~27š2F"Úğw/„`f·áp˜âeîÜı@'NÄĤM›hÓĤM?~<-[ĥŒ Ž@%³@’$RU•rıœQVUUqüñÇÀQl!ĞĠJ#­C ‹ĊÚuëÖĠšĥmÛvŒŞŞ(++CYYÊËËqìħÇâÄOD&“Áž={ Ë2ĈŽ ‹ĊĞĠ fF"‘€á0;oH’I’@DˇĊb1ÛÁY,d³Y¤R)L:‘Hŭë_ħbĊ ìÙ³ûöíCYYùÍobÛĥmˆĊbĉëI’UUávğ‹Ċ0²šĝ„N0­Cç0,} } , $IÂÀÀÀçŽx,Z´hħĤigI’ÄİT ñxœ‡‡‡FÙbħYg§Ó‰;wÂñ`âĉˆÇB4ċÁÁA. H§Ó\şY&°ÏçC45ÌEÎf³ĝéOŠŞŞ*tvv˘ħħĈŠŠ \rÉ%Fö1ĵiÓ&ÉÖ°Ŭn7ŜŸù&O> äϸÔ|ʇDMDĴiz{{§ñV@ĦP˜šĤA–e“M–š, X,âóŸ˙<žŝy´µµaÒ¤IĈLȲ ·Û ·ÛmjÚı\Î`ħHR0ŞuK\03ĉ̙ƒ††ȲŒ§žz Żżŝ:"‘ˆùž4MƒÓéÄĥmÛ°páB03dY†ĤiĤİżż555`fƒ GVTU…ÍfCİ 4MC>Ÿ7EĜ„ ÑàË_ŝò´bħĝïšĤ™Î]×ÉPşˆˆ‰qöÙg£ù|³gÏF8†Ŭn§D"AFÁgħXD6›…Ñ@Ó4C†cïŜ½P…Òé4ŭíocÙ²eu÷Üs6lĜ@àvğéħÇ3SCCmÚ´Éh3g´t'ÇCŠ˘ ŻŻÏŞÏçƒÏç;@(U)QSS“9“0‰ P(×ëĊœ9spÒI'•?ŝĝŽXÇÏ *ŠÂF&óM•Ú·J’„žž̟?Ĉ3Bñ¸É†r.£(SQSv33*++ ç f͚…††L:}}}x<Èċrfç.œtÒIĜĵùﳛŒƒ6<‰İT …BûŭPvğŭ€ç‡²²2Œ7Îô –ĵžĈëXvïŜqD@×ġ EA&“AħX¤RĈdĠĈêşŽÖÖV|ö³ŸĊ#<‚N8ÁTĝl6›ÙîĠbħ˜˘Äԓɤ9›W’$TVVBUU‹EƒA!N§MÜ~ûíĉs…@04ĴSD$ ìÙ³3g΄á0@D;v,***0eÊäóy455!‹Ħ§§ŬŬŬPU>Ÿ@àD[Ž8\ŭġ3ZZZĤ&“IhšF²,›Nİbħ!E‘ĊbAGG-ZEQ¨żż'Ÿ|2Ŝ|óM G „ BĦ\jgÔĉÁ‘ÍfÍŬD‡AétÚt.Ŝ={öĵyóLP"!›ÍšâĈápïápcǎE,£ÁÁAìŬğVĞ•âñ8Âá0f̘@ —Ë…`0ˆ.ß)’Éät"RĴV+Œ›ŸÏçĦ( ˜™TUe £vUUïĜħƒfϞl6Ë#ğn”|lĝHíŬjµ˘P(ݧÓÉŞŞ3s:†ĤiHR˜;w.ŬrË-‡Í‚‘¨@.—ƒ˘(”ÍfÑĠĠ…²²2N&“}}}Ü×ׇÊÊJx½^„a*++cŻ×k¤X’$”Ĥ„™ġ#CCCšá''"2*q ›{„Ġ”İħX .—‹ZZZ0<<Œl6K#µn·Û "˘ÖÁ—²²2 ÁFİP(ÀjµšEœ0aÂTWWÓàà ’É$zzzL‘0’Cu‚CCCÈd2ĉ &Ĝħcáñx Ż%TU5<” "r8 ìŸQhpš#VĞ5`x4M3 äŞ…ÁRp°ŞŞ(ÍóEĦP€ÛíĈĜħcÇát:aD •Ĉ°šÊXWW$IB4Ċ°iŽ•,chžxâ <ñÄĉÚ_˙ú×ħuëV̜9’$ĦğğÛ\Óĝß}ûöĦP(Àçóaܸq0ŠF- dY6ż ³n·›ï×Èx:âàrıʓɤ)[KÇş“ŞŞf2F‰eö3ëşNı\Îlı^,yhhˆJ͚Ĥ‘Ĥi#£†fS(C7e™eY&]×ıX,ö×D*ùݧž˘?ŝñH§ÓÈd23f c˙|!èşŽwß}—³Ù,”ÒÓàvğYUU2ÒĠ˜ÙôÀI&Gš`°ûR ÇÔĝŸ„‘˘ÁpÁ !ÒÒbŜŜ˙Ç1-Y–M%qD°ét“'OĈ̙3р]ğvÁñ ··÷Ŝ{/l6‚Á î¸ÓURQ(LSÏúÍ$J@BħX„ëH&“èïï‡,Ë#§‡Yûŭ²ÁŒ,‹& –9җ$Ɍá $“IÓĤŞ*<a9 ŸÏ#—Ë™ßu]7͸|>|>oĈêïBœ|òÉĝġŻ x÷Ŭwñì³ÏcŜ „@*•‚$Ipı\0t‡’#é g³Yœ(ŸÏ#•J™ï­ÄŬPYY)‘êêêP̘7ĊpğÀ¸ŭ’$!‘H@–eƒA Âáp˜ŸÉd`Ôòt.išfŒ…D"t:Mr2d2óñċ˗cùòċ˜ûÙÏn8"£ŭhà´ÓN{×f³3B $"Ájµ‡J²,jµÂèûçrı „ÀŠĊ"†‡‡GÊîJp1şu"—Ëq<Ç3Ï<ƒ|V­ZexÉÈ%IÂîŬû‡xÛl6éĦ´ÛíĤĠRr`Ħİ݉ ó°Ċï”ÏçQòP>Ÿ˙ßjµgϞŬ²rċÇ:5î‹8ŽGJìžu]‡ŞŞl$TĴ\UU6Âş‰Dşó˜1c°gϞ‘!Y6µĈP›Íf†gKQ964oMÓP^^ÎŻú*xàž;w.4Mc!N=ġTĜl6ó=ĉr96D€a‘ŒôX–ÌQ–eŭŭŭhllDgg'ÚÛÛığğħXÌlM?’dY†ßïïğŭöÛ[Ĝ`+Żĵ²˘X,î3ĵ}Fb§‘[W:P2”ŞĈĈF  & •J™ÊĠj%Ż× Ż×kzċ ğ$VH’$*qÊçótÁHǏçéÓ§Ó_˙úWL:•àŜ{ïE:Ĉkݽ†™3g"ÓȜR䑌Aíííèîî&›Í†X,!„ĦìŭW²Z­˜È²Ìı\ŽĥnŬßrgʔ)ĵzġjÙ&tòûġI’8#™L’,ËX´h.\ÈĦPˆĥoßÎǏ§?ž7nÜHşc͚5X³f ĉ̙ğŬÎĦPˆ˘Ñ(Ün7BĦ!(—ËĦ½½^Ż—‡††Œ´1îßÒXZ–e™l6\.dY6zî9ħf=˙üóñúúúñxZQ2FĞöy"‘ÀĈ‘Ïç1aÂĝ|>Œ”É#]Á˙;Öü9ŸÏ™gžÁòċËñôÓOí·ßĈ?Œwß}oĵñŞŞŞÌç†a³/ÓéD}}=œN'òù…B!lÛĥ êÜÈÁ˙ PUU…`0È†ßżX,R.—|>OÉd’UURó ³.àêĞŻĈòċËqĊW ŻŻ.—‹Èf³ÁçóáŒ3΀ĊbaY–iïŜ½BKK R8†˘(°Ùl`fÎçóTr8ħ~&"ĦišäóùÚ²eË#£ĜojI6›MlŜĵùħ˙÷ż|ß}\UU….x½^D£Qiò½ï°ĝ,’$ħá òòrX­V6r ŒB’’žJ}¨P(°Qbĵ†˘(Ÿç’8ÈßqÇe—_~yjTìwĥ¨ĞĞ{ĤĤĤĉòëğŽŸŝùĤ{îıçœqĈ8óÌ3Q(ÌŞa#oÀ¸}F:vżáo@éöAQ3ĵl$ NŸ>Żĵò N=ġT477CÓ4̛7ñxÛ·oÇÉ'ŸŒŜŜ^3’(Ë2úúúËċÍfFát:Mݤ‘w`x3ßê&UU˙ûòË/O}ĉ3Ÿ‘6mÚ$Žx0’ŝ‡?ì²X,“ïĵóNìÛ·’$q>Ÿ§`0ˆwŜyk×ċŝŝ~jhhÀ“O>‰`0h8‚¨4˜Óé4% \wŬuB˙÷ÙĵTêġC…B‰ˆrı !è駟ĉ .¸€,X€.œsÎ9ĝÙÏ~EQĜápYge¸’‡ığğ›ŒxÁÀÀ—¸işJ’dÈz[,*U iĠĠĠ³V\Ùp¸ìùaĠ)tŜĵyżìħǰqF£íÒé4ŞŞŞ°cÇĵŝúëÈf³¸è˘‹üóÏ#šœL&ƒááa,^ĵżŭíoqîıçâÊ+ŻD.—ƒN68VUĠta—Ä —òÙn·“ŞŞÍK–,™ĵhÑ˘Ñ‘1˙ ­[·îÂ͛7?³dÉtvvâ+_ù Ŝ|óMèşŽÊÊJüñX½zµ™?`lĵo_ĵx1ž{î9̛7ÛÚÚ¨ğğÀŝŝ>Ÿ"‘Ž?ŝxìÜıB„aÔ××c˖-( fâÉĉ1mÚ43¤iVŻ^T*—ËeŒ"E’$ÓħÙlfvÛힴbĊн‡^–íâç͛÷lYYÙĥ믿˖-7ß|3gÎD,ŝŝ~ĵúêĞfĉÊ-|3~0cĈ ̝;v𝙙 o^?nżŭvŝӟŝY–9ŸÏ£²²’:B#ġ+ ĦŽj߁ìÜıÓJÇœ–$ Fƒ £w‘t8?<\˙°@ɓwŭ1ǃx<ÎĝĵóÎ_˙úWöÏ…BÈçóu =AÓ4RUż˙ŭïħ}ûv̚5 wŬu K.ıFòĊ²eËh×]˜9s&Ġ××£ĞĞ‹ĴV+²ÙĴé#¨ŻŻ‡Íf##Ĝ(G ƒ”L&ávğáóùàrıŒ ĴV+aìRJÛOV\yÁ‡ċ{ä‘G¤+ŻĵRüö·ż½+NgŬşuu‰/ĵµ··ÚkŻċĠĞWcá…X³fù9ŠĊ"{½^ĉɓ'cĈx<ĤÉwÊ)§şuë;–‰ÈLġêëë£R?AÔÔԘ}†rı5773.br8FG06|DS*ÒuŭŜwŜyçĉtXr€+ŻĵRÀUW]ġ_ù|ŝĊúúzX­VÓ>·Z­hiiĦp8LĝP(ĝšká;ïĵ“™™žyĉœwŜy´{÷n$ œ}öÙ@wÜq.żürû‹@„ƒT ä¤I“@DTVVF(~g2ŠD"°Z­¤iƒAx½^3Ĝ÷Vó”ËċÀ? ‡X‹ƒnıċ– ìv{cYYŬtÓM3f n¸á³sˆ‘=Ĵë:,XĜ½{7.ğì2Àƒ>ˆxÀŝ^€˙ñ˙I“&Áf³á”SNÁĝñáñx0˘zÈÌT6œKétvğN§ÓĴú)=ÎÉd’†‡‡EĦP ’ŝpÇúġ뿅O}"ĈÇ_tÑE_’$İ000@W]u˘ĴĴ Xşt)ÀŽ;LoŬêĠĞqÌ1Ç 9µµµ¨¨¨€Ó餏?VĞ•ìv;òù<555ÁċrÁbħ˜)àétš†‡‡áġz‘H$ÉdL&)‹!“ɰ˘(ƒ;vĴT__żcÚ´iÓW­Zu>Aô‰j´cǎ)żŭíoßéííġH’„d2ɽ½½ÔÑÑÁÉd’J6;̙3ğvíbY–QŠéSħX䪪* ‡ìrı÷ööRss3ëşN6›Í4+‹Ċ"âñ8ûŭ~JRˆĊbFĞYrğŬƒp:pı\^ŻwéOúÓ ¤OÔT+fżóÎ;ß{çw6›M·X,r0„‘ž‰DĜbħQík³ÙĜñ Àív“Ċbá`0HBŽÇÔÜÜÌÉd’‚Á —zÀċraxxñx“&MB?g2Ĝbħ(.— ŞŞ I’6ı\ßüìg?{Üétĉñ OÜX3fö.[ĥìÙíÛ·ŸYúK)N³˘(dĝ†‡‡‘Ëċ`µZADˆD"ÔŬŬÍäñx¸şş’$"(“ɰÍfC}}= ˜ÁgĜeħX~ Şêĉgžyf>ô‰k÷È#ÜĠîîn455ħë(++£òòrƒdÄċ …úûû1<<ŒL&ƒ|>h4 ‡`0ÇšĤQ$aI’0mÚ4”ĈËÂf³edY~Ûét8Œ3žşîşëĝ”Ñ'z°áŠ+&mÙ²ċÖĉĉĉ+ĥmۆ\.—Ë£/@İĠĞÑğJŬEİT,bV TUUĦ===Ét:İĴĴĵÇn·ŻyôÑGğŒġBĦFĊ(3zĝá‡ëׯ_ssóıù|^Y]l¤“)ç%Ù‘Äċr!ôÚlĥżµĥĥŝüÚkŻ]³hÑ"G}ŞF›ŭö۞ÇüüÎÎ΋‰D +‹ìÏġƒËċ‚Óé̕——§Ŭnw‡ÓéÜ …~sŬu×½KDGÌĦj~úĊ/~1İİİÒçóMVEWUµ …ĥÔÖÖŸvÚiŒŝ£çÚŻ(nIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Green_16x16.png0000755000000000000000000000016312467662066022024 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcdĝÉ@`b`Ġ0Şa¸j,Ûš³…ÜIENDB`‚desmume-0.9.11/src/cocoa/images/Image_MemoryExpansionPak.png0000755000000000000000000026051312467662066022511 0ustar rootroot‰PNG  IHDRhˆÊÖq /iCCPICC profileHǝ–wTTׇϽwzĦÍ0Òz“.0€ô. QfÊ Mlˆ¨@DE €£ĦHĴˆb!(¨`HPb0Ѝ¨dFÖJ|yyïċċ÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Għŭx€Ĥ0YéİAîÁ@$/7zşÈ ü‹Ŝ HüeèéO§ƒ˙OÒĴTÈ_ÄĉlN:KÄù"NʤŠí3"ĤĈ$ŠF‰™/JPÄrbŽ[äŸ}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\NĤˆo‹X3I˜Ìñ[ql2‡™Š$ĥ 8Ĵx›ˆ˜Ätñrp¤¸/8ĉ p²âCı¤¤fóıqñş.KnjmÍ {r2“8Ħ?“•Èä³é.)ÉİL^6‹gŝ,qmé˘"[šZ[Zš™~Q¨˙şĝ7%îí"½ ĝÜ3ˆÖ÷‡íŻüRê`̊j³ë[Ì~:ĥ w˙›ĉ!$E}kżñĊyhây‰RmŒ333¸–‘¸ żë:ü }ñ=#ñvż—‡îʉe “tqŬX)I)B>==•Éâ ˙<Ä˙8ŻóXȉċ9€˘yPÜġßûĉƒâ›Ĥ:ħ8÷Ÿŭûp‰ĝ‘΍ûçLg ù‹kâk €$È t!0VÀ87°ĝ`Öˆɀ2A.Ĝ @Ĝö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`ĵóa!2Dä!UH 2€Ì dıA>P ECqBı¨*…*ĦZ¨ú:]€B=hš‚~…ŜL‚ݰ2Ĵ  Ĝ ö†ƒá5pœçÀùN¸ƒÁíĝ:|Ÿ³@ˆ QC â‚ĝ!H,ÂG6 …H9R‡´ ]H/r AĤ‘w( Š‚˘£ Qĥ(OTŠ…JCm@£*QGQí¨Ô-Ô(jġ MF+Ħ 6h/ô*t:]€.G7 Û—wè7 ††ÑÁXa<1á˜Ì:L1ĉĤs3€ÌbħXyĴÖë‡ebĜì~ì1ì9ì vûGÄİâÌp‡+Ç5áÎâq¸yĵ^ oƒ÷³ñÙĝ|= ?ŽŸ'Htv„`Ba3Ħ‚B¸DxHxE$Ġ‰ÖÄ"—¸‰XAàP4407°7ˆÔô&Ĝ9¸$ĝAˆnˆ0¤;T242´1t.Ì5Ĵ4ld•ñŞġЇ+„s;#°Ħ ³ĞŬVï]=iY9´FgM֚ĞkÖ&­=%ĊŒ:Ž‹nŠŝÀôcÖ1gcĵbŞcfX.Ĵ}ĴçlGv{ŠcÇ)ċLÄÚĊ–ĈNĈÙĊ퉛Šwˆ/Ÿĉşp+ı/<jĉŭ$.$…%µ&’£“Oñdx‰ĵž•”Ĵ”TƒÔ‚Ô‘4›´½i3|o~C:”&½S@ŭLġ u…[…£öUo3C3OfIgñ²ú²ġ³wdOä¸ç|½µŽµ;W-wsîèz§ġµ  1ş7jlÌß8ÉcÓÑ͉̈́›È3É+Í{½%lKWrŝĤüħ­[› $ ĝÛl·ĠlGmçnïßac˙ŽO…ìÂkE&EċEŠYĊ×2ŭŞâĞ…ħ;ûK,KîÂìâíÚí°ûhİtiNéĜß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§˘sżĉŝ]û?TĈWŜİrj­VŞŜQ=w€}` Á–ċš˘š÷‡¸‡îÖzÔĥ×iוĈÎ8ü´>´÷kĈ׍ E ŽŒ <ÚÓhĠĜĜ¤ÔTÒ 7 ›§ŽEğùë7-†-µ­´Ö˘à¸ĝ³o£ż:á}˘û$dËwZßU·QÚ ÛĦöìö™ŽĝŽ‘Î΁S+NuwÙvµ}oôŭ‘Ój§ĞÎȞ)9K8›vá\ÎıÙóİç§/Ä]ëŽê~pqĠĊÛ==ŭ—ĵ/]ıì~ùbŻSïı+vWN_µızêZÇuËëí}}m?XüÖoÙß~êFçMë›]ËÎ: ^¸ċzëòmŻÛ×ïĴĵ302tw8rxä.ûî佤{/ïgܟ°é!úaá#İGċ•×ŭ¨÷cëˆċșQ×Ñ'AOŒħĈž˙”ŝӇñü§ä§ċލ“f“§§Ü§n>[ŭlüyêóù邟~Ħûâğ_é›Y53ŝ’˙rá×âWòŻŽĵ^öş{Ööñ›ä7ós…oċß}Çx×û>ìŭÄ|ĉ쇊zğ>yz¸ĵ°÷„óûÌ;ĵl pHYs  šœ IDATxÚì½KŒm[–žġ1ç\kíGDœ×½yóĉÍwfı~ÈEİŠ*ÀHĜ’Ŭ˘²„èÓD ÑBt  L :vca„0r²…ì*Û²ŞìrÚY•ċĵUy3ïóĉˆ½÷zÌ9Ç 1×Ŝ7³l$l°„iß8gŸŭXk>ĈĝÇ˙˙c^áÉÏŻ˙Ŭż.s>Ê/ŝâŸ2ŝ˙ŸúÏòŻŝo8!Ĉñ˘|í½oËĞ_ — =ğÍ[ĵܽ’gW/¤ë:̌7wwŝ½ü[üö÷ç/ž?çí·ßĉ͛[D‚T+äEǙaHQĝó˙_ñġ›ŭ˙Ħ;’?ŭï˙kòêĊÛ|ċŻ0ç…˙ô?ĝoŝ?ıŝÇ˙éÏ €ğîÔZ/˙ĉîçß‚ğH5¤äJÎ3£”ÂñxôÛÛ[ŽÇ/_$ĈÈíí~ô£bf„pwTċòıµVr^(`î|ñ/òöÛ_ÀŬ13DAUEUUöğ½<żĈÌ|™gî$÷¤ĜĦAŬĞIİş>Ñw"¸™“kĈƒÒwĉe!ĊD×'jİ”R!2ϓÏ󴌌Dٗı0ׂÓw ~ĝáüù˙îóÑsĝŝ÷?'"ŠcœĤ™|¤äÊ'wŸòƒ>â›_ú²$Mw|áÙ+žŬ<ĈéÈáà]—Ĝ_];‡µ´ñеp8ı}ŭšûûƒ;ĝ'ċö3~úË?-*Š:l·{ş—|ĝ{ŝ_üÇ˙­ŭóĜ—˙Ë_úïċg~ĉÉ7żġó—}'ç?üµżö?Ëûc˙Ĥżŝu?-w7C?̛íuyìvâ^Nş,Yj-”ReYĤXĞE)ŞÁEàž>/@\_€”óĜÓ8Xµş”wÛĞt*áµĞ9‡`„ЍĦшiĈġu&"˙L‹ËŬğġşÎkÊ×kŻ˙„¤òOû>ùŭâǞ˙‰Ïûg½‡˙›÷­€ŠHyò\|2—˙Âí˙ċq÷Ĝ’"Âtä~|À—°éĵż~›Òç˙½ßĝêAE{¤! £¨–‚GĠ0wîôwże÷ü­”—)µ…&n8]LÛk‰4ôŝüú›tsŝ>ùĝŭâ[Ï_U½ĉÂuoçûßùÂ2żáı|ÓĞŬ`†ˆV"A˘$ ıƒğ3?‰è)„p/˘·Àq6~ġë{"b˙è;żŞàg~É.›á/˙ċ?'òOŝi˙Çżŭß:˙Ŝ<Ïß6Ğê.‰b("â-³B„ ¨jt÷PĞe1‘PD˘ˆFs²•ÎŞUQĠ£ŠH7/ó0MSO'ÜY^½ġŠ›ë›Ş Ó<‡e^+…W3Ġ0“sòqĞĠJ)&ި´DD{ğH6•â"$"Tu½I73;€ÜK[ƒâ"¸ˆD"Ú6·ˆĜcÀÁqĵZ­"šUdY_J-Ï­ú×Ğù{Ġ|W³\²!„0…ŞŞnÌÌk­:7WÀˆ¤uIµî¸ığ›ıı ŞÈ"Ş÷¸żvçnˆàî]­uïî½ğ×.ĈÓĥë߀ÄÇğu&=ˆ0çRbÎyçîÛ]ìN˘r²jžké$ş.y­fK^,†è1EŻZİFe) fŜİJ ÄŬ­äâÜCJÍËlQınJİ[UŬô}Uu)˜U³~èKŠİN‡E óËçŻâ8NŭáxaĜĝÍó›Zj-ĉžCLĠqĠ=ÂKƒĦ6¸£"UU–ħá´*îlTu§Ş/TġK"ò xìŬ-!ğSTD „ÍìXk îT$öÀ²,öà)%Äo`ԍZ-‰Ĝ6FIn8܉ÈQDfUEU·µÖWbŝrÛožİ{‘ç˜wbˆŠˆĞ¨ ŞAÔÍÜÌM$”¨ïUġcüd†żıÙl˙Ü{_ù™_˙­ô·ġÛà,ŝêßĝ+úKżü'ìğ˙ï|ŭöÍë˙lž§§VKnކ@òˆH Ĉ„´H„Y fç2QmCĥ>gT3ĴÖu˵:‚ç™ÓáÀŬŭ*Ê~żċzż'ĤŽ>%pƒj•b•:,È\ ."¸8ŽyĊ)ĝ”gŸ—İÌyÁşÔeʈ™RJWk+ëJ)˜™Ş¨‡>WŜÊúc”4r*Kxë­·Ĝíväœw÷G–e!„@×wí~‘6íÜ–Şm‰‹ó ş{{N•œBˆl·†~ÀŬÇ 7ç8ŸÈ9_JÒZ µÇV‡€ Hƒ-ïĥ‰ 'Ĥög7Z_ŻJİÔZ60œbL§ jµÖM-eY˘¸˘Ş8N­F)7g^ĉy"Ĉˆjhkœj7!äÚ*Ğ£J)䜑œ0³uMJF$#@*ˆü‚9żżžÑëú=bx‹ôOíúîîB‚ġÉûˆ"Ċc€tIàf†™ŭúĵY%T%ˆ¨×(m# î†ıáv^˜gq÷L7"H‘èïş Ûa´R&o×ÖVÌÁ³ ÑŬöAvzíûa Af.ĊJ/)jßuäœ}YïR'ŭSKġRJ‘², fĥU•N5¸™yÉĊ ĞfċTĞÌ-àĵt÷ĞZëĤë:†gœ&j)¤”Ĝívt]Ç8lş ]×1M§ñˆGÇÀëğ[nïŜ !b àTièĈñKÍäĠÑ5†ÔR/ĞÚö­bĉ"ÒB†c—ßX›È Ô5— Ñ7›žíf'ŭğŠò0PQ̍‡ûığğcYÑhÂ9ĤPDĊBCLA”>u<ğşâfwĊ:"‚8QŠ9‹1uˆfUÌ\UcLİú41÷œŽŒÄ÷O'Ĉq÷•ƒ OC›UĊ4ôôÀ}À{ï½Ç×ö5ĥ²ċwôğœN'ú§ä²&¨$ğÔb`Y2Sv\ûK€j ˘ânmAXġ\*1(ށ/žóŜ{_ĈĴrò‰”‡Ó‰RŜÜßûáá%gìÌÀ[r^#“BPb ÔZÚ^iAZ‚ :È9q#OAK„ŭn·Ï÷C.™8Vó6–ŞÚĈğVRJì÷{öûĞĞ.%D„f¨Êà=Ó43ÍC?°• Oއ#ı4 A ¨V=/…ıŒT[pAj­^Jñvßê1Ä2l‚*§qô]× o ë:^½|ÁóĞçtàœf43ċƒüèÓñŝÀb…ìF§ˆ·„êH•¨C…Îu½äç6ß.*J­…œËeĵÌ*µ´ßÖxK˘bŒ4ˆ1ħÛmÙíöĵxñœÍ°áîážMż!ĤÈÇ}Ì?üe)H(,yb ŭĨ"*Âġĵ|öÜê_|ë <Ûí%IsÄ B"ÄsCU×8!:ÑÔQC´ñżË2ôßG˙Á÷~ëo˙™×ŻïÇÛßŭÛ_Êyù—sž1/%j"UEµT–ROB0ĊLž žUh`ÔċBž‘@{]­—sĤÔB)Ğ…ĵ,,ËÌÜ[€°ŠäJGĵ,X§;9„8tË|úú3ŞB.…û‡{>úìcNÓÄnżúz 1rr8–Ê˘™İV&3jmè1I Ĉ˘m[ujΔZ‰9SŜÜ1#Ǒŭġ3úĠŻò³İ7óÉ'“RbğÙBäx<òĉŝÀ°ééş U•…Š ˜ıĥû63D;evÇ=s…°ï™O#™Ğí–$ċXä$ žÖqĠ@Y2‡ù„Ĵ Ċ… Šw²áÙ[ ˆ  ĵX&çìì>‘Ğ!ş ,ĥ "‚JÄ Â\f–’éğÂë‰ô ”’ !²Ùlèğž˘Îáî€!…Èx™Ĥ 3k 9FB”RX–eE™ÁíĵĠbB­çä)¨BŒ‘”fĈ4M„†ZËċïäZ!ÄFŠ›­Ç$ìN­ùshüüÇç§– Öµ|ÁÀĉ†™ù9À~î?HmAôÇI–iAƒ²Ŭl9LǁŬ~Ï;_ŭ/Ŝ}‹­ôÌËÄñt`,š·÷Żı}¸…Ħ§xmA'‹Sĵ‚ *!&äB­†‹àZJÁ=’6İU†âµ@)xU¨ t™Ş*•UŒ5j@è‘ùÈG·ŒÈ‹/Ĝw{&-m(ôCh°8^U( Š'’jèŭĤ§ß ¨7† ,FOȒú-a×óO AÌ zħsŒ!èŸêşî/ŝÑéŝj˜—ÓK§!ˆĈ¤Tá„Y§mŞ”"çEv†0!„Ççž ‰Z 5(9SkEE[ĈÎŻMİ}޲£²–ı˘“Òġ‰aèXêÂ8ϔPeJUȵ0Í#oî^óá~H™aû´ë™–…‡ıòĉ0‘ş†€J˜9Ġœ^Eèâ•\…el7!$ĈéÀ>|Íwëû|ᝯs?÷ó¨nĝµ_û5Ä($lÜߍ싰żÙRŬİ^¨ÚÊ´œóJSTܝ~è†Ä4ÏX­ô]Çnğt[’ÂQuò2ñĉ–=1F\@cÄŬXÊ şÎĠ™êPA$RœF+3Ú´ÁFœœ+ËR¤ŞÑWa#Ib X…%t)$S€İ Q1qJ­TŒ)/Ló„j ï!y…šY–™S™ħħ&a–ĵàĉ—vF” ÌO~,â?W +âCX´&·œò/ı"ĠËŝı1—Ŝş7·EmGh}İĤ\+œ)ó3oÑÜ"Ҙ¸zf;üs:Ĥ иblɤÖ"çû/‚;˒/TӚ*T n…~ۉÄÀr2NS&H`H Â4e$†a@ܰÙŞÑuÊ2“­ò²à8 ٔ ™yžù,™;˜çJւx%Ò(³,UG´R–Ì0ljvÊHfGr.ôÚ3/•qœĜïv|ó˙4ßüıŸâĠĠKì³··Ÿq:Ĝw׈! İ ,µP2Tu\µ%_p1@**BŒ3cGJ)ô}In+eyİ„­V–Ġ™bÀ½U!ş£ôÊÁrîîùàƒxgù"ßüĈ7¸·™™V–—h îҔ&E\˜–ASÂ5ĴħĊ0Z܊p Ñ@”Ĉ$˜ÜğvŸÀy™BŒ‘ŜğŻ,yŝ%` óÜ-ËÔċ<Ż7Y ¸98ĝ9ĝ‚jcäI)Ŭ2šŻ е¨q…Vëıä•ê…{\(µÑÍ~”É9ŻT@ı\˒GŽó‘l­Œ31Ȏ‹QëÂ4Ĉ‘‡Ó÷ošċ ĞQ\Ó\y8ŒÄTV[•Ż%RŞĴ[×ĊħòÈĦ£¨ıtàpwâW˙ĈßA<ñÎÛïò‡~öĉġë×~OnIi",³ñp{`ħ҂İ4´–KĤärɤ6-”4²äÜ6gDƒrœïxıÛ°ë7œ\°iĤžFèıd\„Ôwo×hf y hTNÄ=‚j\Y­_ŞJÍJ]„E&Ĝxı·µ,ĊÚ>Z“ˆI[ġ5°ÙêĞ•yœĝʗżÌżòËżÂËç/xĝàcĉ‡;ò2cµUĊnŠšµÄQ+Ë÷··ì6^\_suuĊf³áp<^툂>–ôçÄc V£Z%Ċ„¨p8ΤĊHĊħ‚„ž½|ñÙ[<ß\£!0ÎÓ%óLħJ^2KÍdĞ+)8 ,=ÎÎèoEÑ!`ÑÈyĦ+ §×9£µ2H¤o2öŠZi8bèkó\>Ĥ˜°`d(ÁM/•Öùž9Ŭ$ĦûSŠáì„p1ĵ4ŠğT›ğ(F̝yžŸp-€ġ@ ²Ž÷~êÈ9cC,B֖œWÀ!Ÿ3qŸQ˜"(zqĈœ=YKğ/{"Tž‘8H­16zaYtê.Ié•ËJĥï23´sú}K2KZxĴ]ßÑuŬ%èžÑ¸T%2R„X eÉĞZİЈfhì4²eŠÖ–ò΢£UrXHAÙ1D”y™éğžŭĠoŜܰÙl9Žl‡²ìaĉû˙ğ|û[ßâ훗ĵ™ĞŬžyžécb; |áùKnĥ;ŞKɏÁ:ĥmL &:ÓYç*{Ĝlˆ!0/3ù À:O˘ı³,3Ó²4nNˆmì÷ûËï#§ÓÈnż£‹‰wžÑ}ùëÌӄçÂïQ„#a—N`Óu\ï‰ħâH5‚J‚D…˜}?°ÙlѕËoÄJuÁêô "(*rü˙£˙Üây‚›żŸˆ%âÈK&ÓPOˆÒÄÀó&<éIhíъÔÄAHÒĠ Ž×LÍ ÓiD1v›eÚÑÇ@Œ‘³-Â0¤ìŸ_Ñï[™6'N§cCÀ5“ş3^ÈeÁğöÎĵÌ Û+vûĵÚ^‘KfżÛ·2Ĝj³û•ĵÚëeŸĞQ1r)ĸşşĉÙ³–Ó‰>üeYĝÊğïòÎĞWìv;‚*‡‘R C×%€Ó&ö‰•ìœÎvıÍ\–eáĝ@Pa“:ú˜¸Ú\“Ï÷/ÈÖ\'Ċ*ĠĜ%Jİ͎˜­’WŬê&Ċ½!ġĉÀĝĵU-„ò<£Ħ½Żîw§ B'~Iθ³@|ŜHµ–ĤNŻnuS%bÎkı‰jĠVN.ïü™çwñ¤‹cçêjUÀÏ´DŒquêdBŒl·Ûĥs&Ĥtqéœ7µûÊLjÀĊUôû7ĴÚ ‘@ú²Ĉ⺟èjF?ôl6M‹Èı‘"1ĊËw7ŞÄ.‰á‰ <ÔÚ(™%/àSZchĠÀ<ÏÌKë£8'Éj†Ğ\l çÀcşÌßÓï’ı#ĴëàĉD†Cƒ2O3İKìv{îïïZSíĠ5Çáň´€Ž•í~Ç)ul·ĥ§ ›~àfͳЛĥÇDX–ĵV‘›+E‘4`’.VÌsĵèûž˜"µTr) (‡m_­—ŭÖòž\Ĥœ—eánrb† û/}ƒîë*0/1PYv½ñXëBH!ÒĊDÒĠ°R]LToĴz†~C×ġ V‹µä’ A#!ĊĉQÍ!„7ŠMŬ]İ–ÑfŜf)… !„L u%âí"HıYC í”ZPÑĉŸm–°Ë s4&$f–R9Œ'ôö–Ó<Cp‘”"›XĠo6\Ŭtô]b<9NĞ@P˜ËŒċx|àááe³i^âa³cğıĉĊÍ5)FwWäe!—Ĉ?‰ŬvÀi׉:^+rD!Eú͖i9N ŭÀġŒ§ï½óöjÇó†ŝğîÂKš[*OĝVğ,°”:JÎäyáúúš%/üà .ĵzŝŠ!D„ŭfÇ~…ÄŜ+ҒÊşXZ‹‡‰c&BĞ­üV^}ċĉZ+ĉenŞÙ8Z ——LÉım=‹iÍwÚÄĠ–ÔWħ/\.Y…c3£TBì)m…+ÀJèïÇp\ Y!{AäÑsFœŞ-1ÍSóao6›K’‹ä–²ŠżO‘Ùc˘|j‹{şiÏ>ıH Ú^>„›]ĝĵ1ÛùœġO ħ9nV§ÄÙĊR×àñÔcŭ” ÏàċÒs Ĵs§ò9(ŻĵHĞöÎU­ı£1€À27ş£KĠ*aµ.97Àġ¤>ó­ó4“ç…ÍĤù™çyĈŬèû—/ŜÂ͸ıĦ–Ö"B`èû– Şòp÷@)ĠÈ0 Àfğ‰´ÎÙıbÌÑş>%×QL/úlutwÒZmŸÇñĵ6ÎÙsp>Wùçï)ı0ÏóĊ.yrĦÄ&8}ŭ‚ïıÚïNÓbğžFÊ*0Ó&Ò@ ­Í9IgžÌñ96<^g@R ÔÊ2Wœsœ€dĠ0^tŠƒ×Î[B÷D…ğS‹?qh节Y•ÑVÚZşÊÊĦ9‚5teÎ4Í+u·òëyħÙródOD.ĠDÄkİzŭìZú]#œĉ™7wì†-yYÚ(™%ÏT+LcÁNı-sŸ'BŒ|éù+–fŭéD8ܽiĵQżaœg2ŽZi„âġŒb¨6C}x½6ŠäÎ )bH¨@-…“{+BXUùL×ġ8Mœ‹1Qk |gĊœN¤èbÏqൠäRu ÂñZE2?èÂâŜ‚´F˘*j-ħ_éÚp„„G!pŭ …Ġ’ĜÖ#­Ô×dÀ26„:/3)5Ž7/ \ĉF×uû¨öçÜĴžúD {½~ U?ŭŭHKp ԏn:ë<ÄĠĊaëĵ…‹hĜ|ċv g?yP%ˆàk×ÏyšèÏAµĦÄV&OyiĴ5ôĤİU¤ó<_ì‰ç&ĞÔìz+éÍ4Âj sr^­°ġí… LËÜ4íĵÙáa*iEËŞĦ9¸–ı4 JJ=1vXuywnïÖŭߒż"ÛĞ҆ ]C™÷KÓZÎÔı2xJĠĠ1µä…şó¸jegŜlZ|›•8çÊét׋UNˉµ5&ş&ŽsżÇYlg=CE”ˆ×ĉ³ J@ébD³’KaGÜĦëúFsùc?@Cρ‹ş|1%z*ҔF˙†–pù\ÇyAž}Ĵ?ÙöXî™Y+CbdžçË{mġ Àëׯıżżc·k\0 "‚—Ò‚BşŒœGŽœÒá’ĊÁ‘ ¸8÷ÇD•éȔ'ĉœ1œÛqb™2ÇÛ7H­ía ‰Ó\ıOdœŞ-P(N’L´fëw;şÍ/•(JÒ@CßQ^xÁĠnÏŭŭ=w÷÷LË|AÓÍâÓ3lvèÚ-XjnÂŒážÛ°Ŭ\5TiÊn{óçŻxóĉž‡ğ;‡Ža“˜ëÂqä~<’ñ&ĴĴ›LC ĉĵŞÙÎ8Ï,9†預[aµ3k°zz›×ĊD ‰š›;£KíÀZÑ >Ä5ÁTlUîclb\k&ĦuyY£´díB­µ ]ÂĈÓHre­´ŻĊZgbF.Ŭ–çdz¨Û~CV›#HĦ˘sù: C£żĤ‰iœ6› İë”Z`:NœN'âj½:ӏ ,gžQP*†x~\k7ĉÚĉŜ^l>ë³àÙ*•Öèb ĤBèS¤èÎ3ôÑċgĞĜìĥÄĜƒA™yž)†–ìsi.¨FĦ…†ĴÑVEÇ\¨ÄKġb IŠPò‚ˆÒˆˆ_¨Ħ³ċñl#œKóíïv;öû=Ó8r{{‹™3ôĠŒ‡ğ{bˆ|_çċ‹—Üżŝ„qš8N<ßnyçĊ‹Us‰JáÀi/(ölğ|êÒ1sÔ^›ˆyİÖNàs%xNžg÷˜™ħœû*,3y½8pž ĵAZÇ_­ L\__³ŭôC^ßŜŽ£Ô™Ô*mm]é%Ñ@êZçspĦ >ġ ]GŠ‘€Léğž!u­ëvšÑÙï¸ı~††VAjh{lEÑÈ A§¸¸wyíL[;Y›Œ}†è1Ĉ‹óİçùIıák?‘ÍÎmħgÏbûŜ´–)Ÿı}iI˘™ĝë‘êäı ĉXi69óŠÉÖü—›í8Œ'î˜Ŝ÷O3÷w·ĝ’İÓŒ× š8Ì oĈ‘…u Œ`™D!¸4^][öbÇĤ¸Úl¸ŜíQ”nÍË/Ŝ°‰C­Œ§‘Ù Û5 M÷÷ˆ}L\Ï/‰)Ò‰ mó—<1z puqž_ßċ/½ÍĥïùîŬ-ŭĥċók>úìŽóȸÌèĤ)ß÷óÈŭŭŭ…^8ÛÓȜ<t`Ħ•<² ‡íÑuX>ökQRÖàêXRdèšŞĞMlGʲş^֓HıŠ^5– †ċÊ ‘!vPĴy×rŬ&ĉğ蚎MDQ×ĉâGäó¨Ä5¸ù2ksıpħoI³ëĜï÷äœ9— pĉáÜîwnJ:mpë:oŬ€~AĴ ‰Ùeó·cä|]ŸŽ¤ˆtqFmİgŞéìgµbšK^PQn‰q ’¨Vys˙‚³ı(6³ä‰êTèb‡JÀ+X]‘èšÌW{XU¸:woQ•·ŠĠ²VaġŭV>ğ{MuçŬwße;í8Ž|òÉÇÌÄÍĠ5ŭS–Ì[ŻŜb˙…gì_<ôñGǑÉgžÇ-ŭ·`9zç4Žĵ~ŭúò÷ÏĦÚUèK!áU Më1T LS됕v87€İ*óĵéŬk^çy1iŝiEĜ ›Öo°ÙĊÄñtb™fŜŬËÛ}âÖ|v÷V*Ë2á´x5 Aİ ÄHêĥ›m׳ï·<öˆAr!ş6JҌÓ8ĥjmYx}÷†ŬvÏß}—Íné42çÌ´d†í–n3`x—­v—-"?TĠ_W?Żj›óĴµÚz^Á)—R|š&J)Ò:À”ïë:RJ²WÎh¸ä6 í‡sižRz,ŸÛĤ‘‹…o-Î%³ğ´CS³‹U+­İ$ga³ŬrÌÇ÷‡W×7Ìé-ÇÓ=6eêê™ĠĜqÌ 5SBk&oôE§¸Ŭqiˆ$TÈÒ²z’@û~§‡ö£xûĠ+Ŝz÷Ë>ùìS>~8!^™÷Ôidè›ÍÀ>l›ƒAMBY2ĊWĝ0ž8Œ÷T2ĂÄJ0Ġ̘N'M”cžı==\Zt͜%çÈç™b…° hßĉ!œy=oĤĠúÒÎ(kƒ€ŻŞwŠtu@ĴĴĵóú9y^(ky¤•r ­É%§…8ĊèCd¤x+=­2 B—˜—Â’š j$i"°Re+2*µPK½$ĝsı›ÖÖĉsÀ;Wtİïñ ñ3Ĉxé^´•{?Ñ-ÒÎ:ÓġP° ÷ ŸEÓ§œÓŝ€"´ -<úĞŭħáĤQ™ëÙ5ĞVsĥnŜ<°ÛŬ0löT7Ìa_(uF˘˘1u"HĴ ‚"°ħ0ÚŝQš &%†VĠ-ËLŒ²ş–"u™X–ıĦó(l÷Ë,o˜§™Ĝ'$*w™Ž|ŭĞ_ċg˙Èdw³ç{ï˙ïż˙>ĠŒ›ŭ³WîĈ#K^˜K!ĉJèĥM38ÍÓ焽³^5ħ´)×Ġ‚@kĨ^ÉRħàZĠ’Ŭ(V°bÌyĉT'îmd²€ĞSdĠ&BĦà„Ĝĥq.Ü-\ÙȳX9ÚÄg›ĤAİU°ZHeÉF-B§…y7úÔb`ÓulR"iCąşîÏ€Ż‚èġuäĠÛo‘Rä8ž˜–™’+ûyáŞù3Ä­"Ħó1gCż-Ò˙Š{ú£îöeé">{ö– ı~Ŝg^ùü8ñç ²÷s˙œ=°gŝĞëşK€^Un?ĞÈàX)äyĈrjˆ·²ĵ•%Ĉ´ÌœĤ nè™?-|öúŽÓ4rŭâ’u ¸Ù …v.„ŞQT˜ĊXÌ0ˆ“0˘Ÿ› Œ0ôxìɵ­R– ›5,F>ûô~ú ß̙÷Ŝ{›wŜĉÍ2ñÑŭ%/ôê„ÁYd!H`Ĥù„Ŭ›E°ĉÂnĜÑoĥÈ,ĵ9½áŭßçpâa9ÀäÌdŽuf•“ÍŒ§ĉŭôpËÉRA[’ħhHH„f‘ŒŞ+?´ OFC­%Lâ° )&-Ÿ5[ğ?GŠë ĈëjâQ‘7ŠrĉNŒ!4ï|-Âb²Qr˘MĜ,5EĠÒZĥ*…"FkwY}҉y.™Ïˆë\+ĥs ˂é£|pÏ90?í0|Š¨Ï#Xıt’ŭäyݏ§Š4_÷“"VĤŞSŒŸp~<ŭ{­+£Ĵ×äˆ8:úÎÑ]KÈ)F–ÚüÊfĥĞ@Ż—ïA[“·9 !à&ÔóTŞÍŭCÀğDİ Ó<3çı9_ĴÙڞínèşÄŭ›ğ˞>Ù²,|ñ‹_ä›ßŝ7ϞñѧŸò[żó=ŜÜŜ²ÙnÙn7Üï™ĉ +•áÀPF6ó†rl'§ˆ3ĉTëêa:ĉކ„ÑtħsUk0ŻruĥİLuf™Ĉiâ'Ĉĵ0KkܒĠYÁÚ\¤ħÑH§;Wġ]³ğ–\¨ú„·µ)̕VJ…ŞŠ›$P½ÑR1u„5D_Jk†ZçfYZ7mˆñIĵ —8ùHżg×vĝĉ·˙h~ŭ÷Ŝ˙ïälİÖü3îö y+çÜM“‰™K)%•R{wRQRJµ=iĥžŠUCĥž VÌÌÍLUu1ó?‚ŝJ;ÊÏMôÙ6.ĵċÄOZ)Cd“z6Ŭ@éúkÊ *kל*›Ŭ–ëëRúQ³ĉ%t’Ĝ [r?!VZħ`h ´cLšġ*Z!RIVQ-H…RŒ%Ĥ²0{k#§‰.DÂ÷ïwİâĵxġŠŬ³kç‘ñ@o™N'j)Œub ƒĞĜEK0–y9$dıÍ÷|÷÷~›ñÄé0òÙħyħ Ñ&/L§vŞßC)ž)ĉ¤UÉÊRħ¤„”À"‹ÍԝÙjik4WëprZ‰>[ónvéì8XğçĴ!iÔ?ç„po‡ÇÔ5x‰Á+j͒dî,µ"éğ€/­-gÇKĊ ¨FĤħbĜÎIpkĠ•/Ż• ­Q­Yݞ觕ŬÓ&Çñ36MŻÍ$„À4M?ѽXŸ*ŝgÊÖĤ{„ÀgĦò|*Ħ\ĈdmŻçñœó!@TŝcÑyš÷Ö|ÒÄĤ°Š­‰ZZĊ)gíĈ*5[kԊŽşœïk~ۘˆĦ#hDˆ¸´z› †c ó<’b  =ÇñĦi;ĊH]buÍÍ5I”7·Ż9OíóClϞ=§~ê§xñê%żóŝ÷ùÎwŭŭ=×××w‰7÷h;Ž—qI)Ñ÷í ëI)2{eZ&–yf=ϵUÎŞäşPjW­Ö&]¨Ż-úmüs)ŒÓÈi<µ&ĵP¤9İŞµóKäIËgßulğÛ5!t1²ßîĜ Í_tXóZµŜş—›UR)ĦR­ĴWµƒ³Öï.‰żëğuŬ5'˜{KŒ1†ĠİdOìQU7³G›À?üż*_ŝê^€ß^|˙wŜÓt+f;˙ıŸû#żF–é¤fY‡Í¤ĞçCċ˙Żìŝ?ŝú˙şŭ•‚™Y€fœŻĠÖñ „ÀE}oĵ^$H$HëŜ 7ŞFԄĤĜ‚„ğŭžíŝŠ~Ĝ2l÷hi–˘ĵdê8SNy™ç÷ĉçžÛñ…„Ĝ5á̝àB¨‚Úœb;l•VJı³”…yžÙt=]ŒOG>ŝìS^zÉÛï|ÍĠŽŞ•ÛùŜÌœŽ'BˆÜȍ\3ôvû=Fċğ;ĉ¨„Ĝq:M|<š²<l.­-vğƒXĴrÈSž1u ó’Ö£]K)˜‡íH;$)ž#+ ‚ŞVj. m>1Ò#{eµSV³ÖĉZ/µb—1|D°HkÙeµä•ìäàKFkÓĵQ#.úıGñÖÔTsmv’Ĝ¸ï35qĥ“==èi#ÌÓVpUmÂÍf Ĉxif¸tùİċíB·9XuXŬŸ Ĵ+Âħi fg 2ÖNÇĵ̌eùœ}ïİ=.u A(Ċ k7İ[#UZ•ħž–§ Èo<(1 Ĥ~ñ‡‹)%†~ …•H1S³ùù  §Xsd¸ùúWhâsżÛ²ŝŒĞ›Ż_3žN(ÍĤ·XsG½|ġ’Ż~ŭk\Ŭ\óŭßû]ŝŜoŝ}~ƒ¸ıf£WL§ċ|ž†Ëz¤nF'!MÍ·ÙRiŽ’Ó鸯kÍ"!F–š9-óµ³*Ò|ĉ)ÄKÌhÇßNœĉÓĊ/q(Ì.{úìĥR‡›5íßêZĠZiëğµ14íáìàmh9ĴN{4¤scȅ²şëX–Ö9hçciŸwĥ×]—]ÜÛÍ^ôO˙ì/ùw~óoJ;Œä_ĝĊ?é_ûĈWëïkżçĝ‹ῖwŜù²¤ÔĠ("î˙'oïÑdI–Ĥç=Gış!2R–ꙞŞi\pĊŸË-͸Ĥ‰6 Ù#ğŞş²R„¸ÂĊQ\|çĝġˆÌve[YfUGfĈ½×ŭĝ'Ŝ÷yÛvgsĉ‹­\FîÑÍT4µ rbuYž‰Ä-Ĥ$˙žD*f´İÒĊŻWfğÖBôra)ƒJ “":g šĴµTJ‰ıъÎU'°!d·†A‰Ó,…"M“ŞHgEòž)eòliŻ1Jñö·ßñöí?`Û˙œ_ŭ“˙ˆDǝfÌ qžÉ'ƒî[ÌĊ%jè1dî|Çûß~ǰğÀ/A8ÖÖ1çYÌ!ĦÇHĞ˘Q<,GöeÑeµĤ1NNµ,Os­„ż 2¤¤JS4yœ1b˘ħ–%iÑ ÇDc}ÛVvêjÈɚV ]äVUö´ìòÊô•ßSbYĵÈÉÊûŻË²-ĉ´ĥvİnٓ"i2™0*bÌÙX³µE×ıóöPŬ~MÓĥ,Á£ċòòçó<c|DĞĠöv-˜€UWŒŸeżR%k[G`}Ó˘JçŞs)_²ĠhŻ;sĈŸVöşb£˘2 Ğ,ÚȃÑ)¤Ólz†~ ï.h\‹Î†AÛë °ÔÛ!)°Îñî–ÙÏĜĈÑıçL8Ž#ûċp@%QêŒ 4ż÷ċüòWżâĊë—|÷üú׿ĉÇï $BÎĵğŭ ‡ž–ħ…r™”Ì}T‘ÌÍs"™yžÖñiJ =ër@p– #AE’*c•WÛ#*ÎTzJŠ‘9y‚ŠkhŒTŭ+D)‹zÈ ˆ^úCבŻoh‹ża*K½à=DFÉrXà’’ qöü01fĠGç,Vo)äÁ˘µÁıĤèÉĊÙ+Ĉ°†]ĥ1‘)U/7ğ½èŝĝO˙ëġ*üżŝŬżRu+>Ïó VŻÎĴÚ Ö \kͲ¨BBk‡1.7MĞŝùġßĤŭżŝ1şŬ œkŞkf½ErJİŜb)VÚbLCĵƒ'fqáE­§íZPšĥíJħßĜí.óB£57W×܃´.MKĥ–yžP>b´`Lˆè˜è´Ħ#ç‰]¸L,ÁŻ-½3–FkœÎd˙@Bq½3D2żù›Ë4ä?ŭçÎË×ÊżûżEt<èĤnâÇÛż›oĒ<<N‘áÄñx¤ë;C4–ä$ e ûŭ Fá£_·ÒƒkéĴ%Je~eü •Ür;~V¨PfžV$oE×v\ï.ı.„çĊmI‘·Ċ(Ÿ‰VÂĊ(ŠŸGÎğXÔĴÎÌ(Î~•ħFt×ĥìÙüZ­ŠíVèĦ`”DŬ*ŸúÄLòĥTżĤĥ•uÎê£tĠħŭ3Ä@!Vçê€Ğ:a9 £Xw³ÈħÎR¸sĊn 碪8tĦ@V‘ÄIè2ú(Vq­)Eĵ+piğIYvbĈËf}]V™Úˆ %+°ĞJZg£ FYœ“{ÇXƒ ÒU ŭ€²R…/~ "g;šĤ!+Ĝ÷Ü}ü@› W†ÓI:ÀŻŝŠ?ŝ?fwyÉoĝ_˙ġ_óîî#ÚY†¸LL‡Y$².’T°š\,NR=:,ċL)6n#ߟO ŸÈ„"%11‡b…µĤ03àÒĊô’Ve:c¸ì, §ÚI8@Ĵ3ÖbÖ1Ñ5‹ĉdIAċżáaÏ~¸¸ĵáâò†Ż^½%ñí÷o9f†áBìé'‚OìĉHÓu´ĥAµŠèœTѓ²òċ¨‡DÓ8tÏhÁ¨ĉr­Òdc0MCÛ6íDfWÂt9i× ŒÈġBJÌKħXĞD‹Ì)ËBĤÎ~ׄ UĜĞ#sI‹Ì™D"†…4û’’˘iŒm}×µ Yiœ•d)jIİ(Ġ#ċĈvĵ‘6é8µÂR\Fĝ ÛêĴ&s%߯³–Î5¨"——Q§‘vlgßv ĥ#@+ž]]3 w?˘Ú†/_òĉġkŒsüŬoŝïĝ-ûñİÛ1ú™yWmĴÎP fúŭî‘zFŸÙ,xkKaÊÈéì8v¤`ñËÌ\²Ş|.ñüĈˆ_a½7+|°:ĤĠV·\Q•Ž>F‚VeĤ¸dU–P •ċïĴR?ù MéZŠÜ´<•Ö(chj)+ĤifžĊġ)<S žÀnw)K{cI b ް;ĤßùŭO˙äÏóŻ˙ê/Š\Ç2GTġĈÔi÷hŽ]5L5+ÖÊY+3]kídáe”ĊAH(IŸ$…ˆħ­hš"ݘbÜrĝ)ñ$â4tÎrÙh´Ĥ· 대ˆŠ‹(Ġ $z'³ĞɂÏ7X`AL§#ûë_óòċúúüÁüç:ŭî–EċÄw<™—$1Ċ/31ûR‹–š4'ѸʀBnl-Uµ)É£ġ"ÍJĴÊYšĥœqċê”Èj+ùi(LcÁь'ħn[-Ula­@+ š‡ba8lÍH>û8—9ĦÌĴSQ(œ)IĵXÚPÊgZµè…+RZ÷­ëo{PWe‡RJĉŬ%ïy4›ŝÜğŝŬOM+µà'~˘ZÑĞaŽYjk2¤\ϨİúċµrĴtM’ñ3t•äiYZ FÔÊj‘‰† \íÎr–ĵ¸6•’b&yQ߈aI2}ÛqÑ·h+¤ÄyÑĜ›´/ WƒÄı}ĵğċğ·?ŝîVŜע˘Ş˙†@YËEĜ¸†Ğ‹+ç8ÙqHjd‘=NŜ‹¤o{ŻÙívĊìQa",–ÓÉpOĝr‹ÈŒ7ûµRêl)*ózŠl“l |Ô{× IDATI>ƒŠ6ġEŝg”’ċ´+…×r^ڙ²Š)E˘Ò+À9‡FcĈ8GżÛÑKô‘ßĉÀ~䇏„˜§òP+?^F½…h$ñĝ'*ŽßY]n­µzĵ\‘›¨iΜŜŞìĜÚb·¸c6Àw­1%kO!ÛìĈ9RŽ8S,ĥIx³IÙ³”9DaT•19áTĤ#sa—Îpé4.xô2“­"i#cŽúÀ°šF+§é”c  äŜaè-fhxûqáÇ÷LËB$ñĉÍ7|ùĠW´ŭÀ?|û÷{²’N ċ@ bsğ­U¨(Ġ†6S‡İ²Öĝ§|žĠçŠi-GKaJXëpqS܄)&+şòTXZëÂێ²-/Ua ‘l$!•”ċ*µ‹e!X+Δ’h–CDG]„˜ZĈUe6–ÈĴ”™QùqI‹H/İÒëLù;y¤s?ĥ#ÇĝÍSO=L›ĤùÄâ6²¨Gc2³Ïù'â¸ÈeŸ²U™äuéR–ş)Ò+Sò9Qh:†*Ÿ]ù÷t/ċ'›Xµ‰4ÓYŻ;™ÊI1‘µhÉë<ŭ°?ÈBeşĤaèı7BD%H>pÜïQ@żëQIî‹×ŻpFóŝŬ;ŝĉï˙š>àS¤ë{BŠìGRĊâ†İ­Vò›VŠÎ:v—ô]Ż“‘” % MĤk;v—<żĵfWHrË4’˘ïĵ°¨âĝ-ïEb=fʈB.ŝUġ•*ˆ¨„&+-ïuHòÚQ‹—Â(ÙqĠŭA½¤b{Iy V]{ „ CÓö\]]bBĉNEıĦI1q:Ž…Až8ŽĊ-úB€IJI!#2ˤÀ¤”›Ÿċ€ŜlßUmQ·XÇ3ĈR=2 TаÖĤÇë§HY>(gôş­Ż9‰]Ó°ëziŬš9ûbá†eš˜TŞg‰s'zĴ5XpdzƒÑ vZF$ɇ‹³™kʇHÁPeS\Z!A|JŽ mn§9ÌGŝö7ËLJ=ßüâ¸yyƒW ŜŝÈiZä +ş%xL–ÀJ£4:YĴ5’:‘“ù“ÌÜϒ6Ön#gUè|%ž,‰œXö†-V패W|V²ĵLbó‘´”Q$ĞV~í Ï)܉e9•ĥä|~8äĴVQN2ŠÊ!‹|I/D2jœHÀR"‰bi/ınÏíğ†;l€÷µÓF^s8/ĞZ£ò<ĥËŞµ‚ßÈäòjïV?ɍà£s2ù~^~RÒÑĜÉ&’’Fk9ÄYİ|…œ3RÛ0ƒ2:Qİì[ˆ…‘Í*eÔXbŠĜÍŜûÀĴ'Œ³t}[Rż/°#$U‹ĉxĜ³Œ×ϟñâĠK..wtmËíŭ-ßŭ=ŭ÷Ëĵ,\__c­PSé<=6‡—.D·Ö:/ŻÖ÷8—ĊôÇ C۝5áÎ |‰žsÄ,×HNQ‚£“/Ïr=g•ÉZB¤)*Ë.<È\{E„j%ıšĉ_žŝ´ä9*M,rGÖk­È³’êk}™j•Îi0ÎħÛġì..‰B>YĉEĈ•¨5CÑZËápàp8²ğ¸(pUeŒÍ!ˆñâg9 7K³ġĠ9ĉV²·=´sq°)vâ€<Ñ’m´˜]TFUĴv Ŭ@N™ÁµX,ğDċÌ8žˆÉ£œH‘²ġÄñ)a 4Š˘) 4&àT˘o5ŠŽ…ÈL^p2çHRċ•hИsh )Dîï÷¤ŝ%íĊ€gĉ8NÜ~÷-s‚?ú“ ùċï3<ğĉ7ßÏ?ešEFW—s8Ĝu=VY"`rbI‘ä=Ù{ħdç,!œŠsu% W)a[kH>½'™’V2ËրŠ%ħ$$˘’ĴAżÌ` *ĞuA¸Ĥ}l\Ğ-US}Jġ,“ÏTnĜ•Ü,!‘|^–'J$_1DAÛĤò@AÉfœtN yz@?eDoÇÖXÉŒaíşjxETn€Ö%Ô:ú(*£”GbC™(*AP– ĜúĜĴ#féše’Uq_Şĵ²µQ²,ߢL+òtğ¤Ĝĵ>Š*#fĦ·Ù2Şüj)†]ß2ìú-÷W*(…ˆĠ†]?HuÜ4ĵ|vƒk,?üĝ–ż˙î7ĵûA:Ş˘Ŝ9-BKt@ğRfżĴ!Ì˘îێŬ0œ?ğ‚Ĵ§‰ĥ•ïçp80M‡ŭž°,ôƒ|Ż[Wž/ÒϕÍlʸL ›ViéN‚Q$tQiL2E£ë6A~Oia2 „fYiŒ5Q'—ŽhU󔇅gbĴĊ8W Mӊ[6Á²ÌRĦhCGߊ‚S ,J²'CLEfĴħÖfá­§ëùŻŝ'ŭ;? ë•œRÒĈ˜U*Uzêaíœ;CbúžIMX+J‰9$LJtVfHĥk†ŭáÀ‡ÛÌAxû‡‰ù°âê%o^|Ċ²xPéÇ#}7àUänÜ3OÓµXÓĦrY\ˆD¤i GY|ÑLKâaœ9NVi¸°šĞĦ£iZ7ÚŽÙ{Žcä0‰˘Âkǜ2žH2†ğÓÄß|û-ϧ‰ëxŝúÙiûá{nïï1Ĉ2ì:–œÉ˄32‹Èl8ŞD´™PI•ÑÌ*³$aMÛŜĦsĈϝ$ êë²Jòûs‰U<…Ĵ´u˜´mY[ê*/J ”µb6),Ž”7°ôm CŠ€†’h’“ÌS–U 2ŜÈĠSÇ`+•A?9İ›Tıöòß ]Ĥ˜”ÈŠË6]îHʐ¤1ĊF²{u醪üp‹a͟éŭ|VkèĠ9¸.‘ÊŜñîíÜ?Ü£´bwqÁ¸LµV8à²D6+|+@Ĵı‘ò~ VşÄPŒ;Yc•‰lDŸKÉëL g[toKĜŜ,ƒÓ:êŒEŞ›Š<&S³8e9ŽA%M‰Mš‚,ÑËR³\ƒjcv"•2ŝà•)Ì]£#f)r–ŠÊ:5êI¨€ˆ šĈĦ óüQĜ€ĵÖĥï/ìÏ6âZ›íRgËtĜVG•†W-%ıq Úĥc^$îŭááži:i JÛÂ30èuĝٓ—(î9Ûݞ.|Ak˘ċâQĊĈĴ `I- 3“OÌ>sœ·û™ŭqf™…×í³Kt/ÁH q&†˜^-Ç)1+/cӀJœĵç‡÷ïxÇĞ7Żyġĉ5_ŝâkڋoż˙ŽéDĈĊsJžĥÑBe+Uƒĥš•,Q´&:͜!,¨½nqĈ’ŒI½) £PN–EŜ’=&/xċñÚm„Ĉb{íä÷èT’Ú•5²V˜Ĉ5ĝœ˜|Ño&ħ€wMƒÉŠ%fĈèEğ]–œ1IĠÚ xĜJA˘Ë²G•ŜµÔ 9}Fe+3ÓrcéÒjúekğÖPF]Î:ŒvÄ Ê†ÎuDşç‡a.wÛ´Lá'ÇUCÍüLâĝÖ²½­Ú?Ùż(ƒŠ *é2ÊĜ'ħĦâm½FŜ[UÒqrT…7­È92/EĊp<ʲ{ ^´Áêg:œmhħµ_]]ÒہW/_Ñ÷=>‡ù8ž.Ĥ4MÛàş†›ç/ışı"ĝÀïßñá{ïiğŽ <³_ˆS():˘bË,ñaş×Ĥ´Ş[ àJ„žq™$3Ó sšg|=úy4VBkë"N+8C²† !+‘ *éc™ß‹êQkшÁMiÉ² ÌŞ,qŠf=Ğ|^X+ÉUïœÖ]BŒA:M#KÈ$VI²z…ĝ×qZˆQ˘ò”•1bL‚2(Ì qžVk2ĠùzZÏÄìŭÂÏQA?šA+ùħ^ÜÛyàöÂŻ-еÂÁˆd‘ƒ÷#ó<ñ° %‰ŽŞiViI4@IFJ$àtPr„”ñ!q˜N)°8y28%šh•˘è´Â)…örŒ§…Ói˅³Ä, –ĴÈYŸµĥ%8,9-b?/ÏçĊ|Ĝ“rĉ4OÌÁóĠW_ñìÙ3´³Üßßs{{ËĝñDXfr4²‰6òÔĥ­oZ†~Ça †ˆ²t",ž1ÎD—ċ")€˜ırË ÓuސŠŝ 1°D14LË 91˜NZîşhlĈYt çÙsN˜ì Ž’çh-Ñ .0‘ŻŻŻ\àJҜJ’F14ٞZ!ÄüÉġħµxoYâZ[´,dñ ,ÇGüÄ}E½ÒµT51—q5J”Xkµ&“œHŸ‘)ġ·Z½ÙԖ>AċĠà"żIĜŠ”Ä9[oòy. !bÄXEcZĴm1ĥ-ô˗/ÙġìúÓ<ñ›ß~Çğ÷ïèşŽWŻ_a[ÇĠĊ5ŭ§é¤ı½ŭÈÛw?r<iwN9–ŭÂñpOò k@!([2Ä şvUfîAÑX‘Q°Fq¤?Ê{XLM<ñŝŝ4€sN½ÈLçàÉ&°(Ĉ[‡ŠFpÙ{ı.Z˙R=“$B)l6¸,ÒИbéb9`Œ"dC˘¤ÚÏ ö|î˘Ċ´ŽdS\Ääc2'?r{˙÷MÇni<ß]ËxÎZ·^Kâ\uĞ”°2ÄĞİŞ<°˘s8ŭĦëÂŭéE]íĥŸ9 ĠJ*+ XdbdĜ >C×ġbU†´!̟BÑğŽ”#ĈfĤ¨À+ĵKLnaš‚T^)ŠiCĞĦš]ßb1Œ‹/œÌUYĈ ŞpŬSI!‚Ž “ÍıcÙ°ĵcÈeĈ|~dÖħog’)QpyÔR”ÌÑ3ċĠ’£_Ç#KtZŒXK‚Ñ ˘Â9Ù3Ô´:ĉŬ^c›DŸSÎ9ŝœ*÷ıċáVŸZĞÏÁ‘!KġĠ´‚è<ì{Œqìv—8×ÒµŬ &Ħ9'ƒXgéb  ŽÉ·pÎIß1bŬ†£ĵ b]ĞHÊLö żZkÓĤDQ’+áĴ¨3ê2SĥbB …ùPsìêa]NŝTu]6ùI8m­Ĥ›/|ŽMê´* +˲ ç’DnÄ9ÛtÚIšÌ~<‘rf¤Pi âÀ5 .;ÂÑYÌ/^ĵàêꊋËKŸ]áú–<·w·üöÇ·ì÷bĊŸƒ'¤H`Áh³òJŞÛ-YĉĥÀʛû:UWdhe‰< ZĜ.g·DBb@͊.7d3Ĵn˜“„ßF9ä5M™MGĉèñ~M½,,AŞÖϸ†)?ÒÀ)Ğp“ËN°ttÈ.&g1­-Á³Ä<`rĦ^*eE‡Œ)]×­ŝ” íÚµH(×KVJ×ËäòÏŝ<ŭNèżú·˙›Ú`H›­ş~XkĥĜ†#2Á^&Y°(k³<CŠôŽ‹á‚œĊ6ĴKûä\ƒÖ–ÜF™ğĊ€O“?Ħï³Lڋ&³M’B€l’°ˁaJZyŒ”Ĥħ†ĦíH;‘5F‚HQœ3 ñJ'Ñ0'’Ä \.°{ïĤy)™Š²(¸żżÇ˙V^|É×_~ĊéĝñÛïYF ˘ĠNò’†ÑR„É£lÑ+S\‡J4Í)–ˆ5ŸgbZH Ġĥ„èI$\cv=9f:ŬĦ²Ĉ•M}–yf–TOĤžDòĦ¤*Ÿ;’sCUx[óvĞŜ0Ö:É.ÜŠÛXµŸ9T£‹.Šˆm†ĉ90Ör@Ÿŝ¤ÛĞ÷hô9ŒhU¨B²ĞžĥütuÑİMW£ÊAV§dĴÔ¸†P:´ĥk醁”"ĥmÈJħëzvğÎÚ³’Ĥ§hùŭŭ‹ĵm1Ċ|uœ§Ġá×4 ÊÈCV{KHÁs‘Rz³‰gĦ)…óvŽ#3XcÑF ‘ó÷TvKúŒ ¨_ïœ[0 ĜHGhu ´Ş[U1'B)zÖXï`ŒŒqaFÏšà^évŸ“rV“żQJȊ5ġĵÌÈ£Víä=*#͘sy¨e²-مdÔ"™‹]×­BP´Mğ֕)ÖtÀŭï\f÷¤2qOЏíEŝ´yœŽ!Ë·É–˜°MÇîâŠĈ6¤”éğ˘`I•˘WF@ƒîˆŞc‰!ö§#§i¤Ñ˜,Y˒¨ÜX9 Ĥ3kÎœŬµ–tŬaÍ%Ó3‰ĈjŒâ˘ÍtE›DLžLQ | DĴĜ}9żĉè#Ó²ÈÌ­HĤyĉ‡ßŝ–÷ïßóêġk~óݟ½à‹7_âLÇíŝ–iö¨, PĞ,>D|˜Êµ mßѸ–qœˆ…=ğD_PΚéUZĥĠ%%3•ƒ#Ĉ( Ĵ,ŬĈr84ì÷ûuÙA™ŭk-3ÜİDSċd6Ġq R-U ùIĠüè×Ûħ|şġ†Ŝrkk6ÉÍrá§Użş½ĤĥUÛÖĴ²ĠR×ôÏ8ĥ˙üԈC"Ú´LÑJ™ DŞò¤sYÖϤŜ¤Hô™ëöšË‹Kş“D÷š&c QÁċċ%Ĉ9Z#éD)—È,°Fc]Cc\çÊÈI „ÙOLaaGBkJÌHĥi…ËĦKœÖ÷ìtY– 5Ğħ\]]ÉÁyˆI°ĈGʅ³ı×+-°/.â*‰EÄı 5J£}F…Lì?­´CÁĠÖÏ)•ş7'yĝú¸ñpÏi…Ó‘Ò§Ħ›néуş¤‹ £^~Ğîħ`auY:Êż§Ş²* ßddDzĊ)Ÿ5ûf[£l YëçôöÀÍYèLۊ¤ŜÛ²ÌsJİf ‰Œ( QM)Ikc ‡A{yqÈIRB˘´ğ^v£bèzڝqÚàtbÑ”S&G%ƒ"XGI™‚ĝÚĈÀ…e×ËéDk#moQ&’'xC\D>–C^3äi/7§.pûĈÉÒ³FŬ+pĊévÇ2NÄWžßûòkŝĝàöŭ‡żçöîŽ0-Ì$Ûn•ħ}ËġĠ3^ĵ|IŠ‘÷ï?pw{K8Í.m›Ş¤â†,€Ó,‰ä:+˘÷ä Ùcµ%,á–ÉÈLÓÄĵÌLÓ$Ÿ§mĥb9ël/òk6ÈNrúÄAŸ\?²p|îÚÙ^uIĝ(ş0APĴòżí××Ċê‚ÜÌĥŸÎ¸ŸŽĉ~zî|î ÖˆVxŠħ¨ÒE:‡ŝİ9·ŜZЁ·àʒˆç,ĥ˜ğBÌĊúX+;ƒĤ§µ-ĥµ+]nY<‹÷L³Ôœs´esDEµĈA)sœK$„EX.@ Òi]]>£ëš²œ-K%²µï>ĉGażġaPÇQĠœVŒġ!ë´#/XsIŸv<ĥq‚Żġž\ĦaF–ġ‰ˆ}÷=ö9Ê›ŝ)ĠÍ#tmIÈ %ÙÔ4˘âpÍYìêmh%µ,ş ŬÈxö,„ˆŸ^is-”ÇÂ9ö ġ³Jİü?ü÷˙hÎäCÈZkUo¤eQ“–sÊŸ½÷žb%İDŜK‚ACˆ‘ĞËKtVĝEĞB%"é4Óĥ ¤@"òìÙ3Ĉ¸°ä@Š)î !I33‰1DĤ ñÙàQ ĥö3-1´­!&…"aT¤s‘œĈ8˘Œ%ki!/w—|„HFĴڔıUM-Ŝ&sÔV#ZËEöÛ~`:Í|ñĉ ž={Ĉ?ŭ˙ˆûû{~ûŭ÷üwßBĦa íÀ³Ëg\]\3Ž'Œ2g]Ż9Xuĥ­´˜§ħÜ(ŠqĊ|#hQ?d‡SbżŸƒg,3·ižËRLòĞ[’dħŜžÁ=Òân4ĵċ}4àÑ{B”$Œ'NÁúëşôÜŞĥ†¤3@èÉRĉi!ħuğzïUäO0çŠ1Vŝ/F*Ħ“&ä¨âNu!XqA¤Ä3HIkN'YÚu}·~ÎıÒ‹’ÁÇXâ*d)M†Ğ‹]ßÓğŽaœĈua7ϳÄVIÙĈ™YŜ·X“F‚"äH”Ħr‘4fіO§™Ó ­__›²!„HX<ŜŸµİ$ÇW•DÖñû1†`=„’­¨D…á½,u„ÛX❓ˆğĤmJIY‹êZh-ŭ°fwÉíéj'cĴÖş.jmŠğÀ_KŸ*‚?‡“PŭŝŻŝ4ŝŸ˙ĉı.žbŸZt×ñ†Ò޲6¨O$SÀ>ĈĴârm!êC(15Ğ,YI§L´†Ĵdä 7WÀ×8|…Ñ[‡vŽd4A9N>à²@‡RÁVC‚İ`-É, BR¤d(ӃM–]µAËĴ8ĉŒJé|€n²9g0š‡ŭŭ‘ğûŜĵyŻßpuy…ùÚpqqɇ§‰ñ8òáŬɰ‹áÈáa³ S J ĝInI KXÈ)c•dÔċèħʈ<+ nj˘ŠYB` cXÖ-ĵY ƒ²Pëlƒg&Î~5}<ġFç’Ò½VŞĊĥF­?pTôëĤıp›Uıáĥ‰•=QçÄ֚âj<§}+V÷Z]vmU9gqċYad×˙^G*ġ{¨‡O*ŻMҊ÷K ğ …Ġ,Ŭà²HVJÉÁV‡;Îşµ%ú×ÔH¨şħë‚mżÀǀmœÌD˘bvğĈZœµä,ßËŝ÷Ŝj¤Á4šĤï8öŒóXî#éĈĉyùçâi‡ŽH,#IĠ™Ĥ <Î:–9`Ĵ äÁĤÎ*%mв'~Ğ:WŞòHĜîŒ1Êĥ4M‹ÑMQ]ĉyĈ{ıĥš•Ŝ'çÇ0 ´m)pŒ&…wäŭÛ.·#­ÏuGJ‰n7ôôċàí´-èT‡:L'ÎÁ];pé:ZméŒcp •ôk7j´'‰@+-ññ#—ï)˙,Vïò·=ÁçÚĊmTPĠJÑîehŒ#ÉNĞLYZòϧÌqšÖ9j6†i™˜ĉ„kƒëEĥ“#YEĴ3´£YÑ('3#×uƒÏ0ö—5„MĦIĠ^Z‘ƒKĈ²Ċañœ–ˆOE_ÚUÁHnĥĈE7\?JĞ ŸŠÁ->Üä4ŸxĜßóĉĠk^<ğá˙Wĵx~÷ßϏoßò·ż£š%ÄJż“1ÁĊ1ĉ´Î}ŒŒˆQƒdwV™”$·ÑdMòbË=L#'?ëbEħŞ”U‚[•ˆËċ_êÈ{2Öx²-ÌY*}[@ì5„Ħ^;mÛ>Ş<ê!ĵ= C\È9>âl¸¸ÙŽ1ŝ1-~=0Öyû“y·Ú̎ëġ+‡pIûHa}‘[‰Ħ)£½”’ĝn0ĵpMó›ç`U t]¤?ì‹ĠĜpq}Éiè/{.Żxùü…<GátÖ²k:.š†g—mOc$Ħ[5Û6(epĈqa;Û*ƒ £ĦíBRĞĵnû J)n*éÇ;ğ‚ñġ?Gżûî;B85M?W=nùó⑋ʠĦ*MJ‘sòhUĞd›EB*CŒŒóÖĦä1ħ¤‰ûKœJ‰,Ù³¤ˆ/çŝ)$Ĉ@X£NĜPˆ_‹TeÁ”ĤP*ËÏd”-şéœ8,‘C,ZfħO[™Ì“Ùg÷\‘§|v4MÑËÚtŸ··œNœÒĵ¸ıáġë×üê~‰ú_ñöí[ŝîï˙Žï?pûá#Mëv=ğÌ8âħÇğ2¨aşÀaÒRn–%03csŽl5*‘!ŝ–ĉĤÔ#”3Ÿİž˙ŭÎkéÎĵçÜTJO#çqCĈXĜ5 |‹$­Œ§ĝí’PRJšGµUĥĤI?Q%É!žPÊĦġ²VG֖C|ÍöÀËú=Ÿ0Ó$޽ÖÒv­TaşÈ·œ#‘ı¸şäĠë×\] -îŬ=ïŜ½c<Ù]ìèlżî6Úĥ5šÂŜµJKâPŭP(zs<ğı!ĈÄétbĜ]HçbÉa´ĵ¸yÁ0ìˆ1p˙À2Ídy^ÓµmߑuĈ‡ÀTƒWWWh­8Oäœıĵ¸(Ġ¤ç䕸SâŞßq=ì¸Ĝ LûŽŜLyĤÁ]91ju=­³4F´ !Ĥ‘“ŸhúŽËËË5—rğŜŽ<ÎÁòù[m\ËUÛqŬ\ġ­i1ĉ Ú:rV´œ .‚5bq·Ş°_´fÉñ—ӊİ]ñİ?èâ´ÖY)í– :„ ĉy}ßǟ’%}ŝż—CĴ,˜tŜTûé>Eז‹Öpyy‰µ >F–yĤz´ó~ä0?p{‹WĜ8ŽË‰qž˜S(ħ9Š“Ï˜ÂĴ<½U(ï% {Z˘Ÿ"KXDYP+”V$‰˙%iǒSÎ,J İj“Üĵ&ו Í´ÊÏ —AŻÇJ)‰BáŒà™èü<“K%- ;ÏÍÍ W——üêŝ€Ë‹ Ŝx_\”šĊ‡UŻj­%ĉÌŝtÄiƒ5†ÖBk.wV†8Ĉbcd!‘Š\OmpŸ+g Wwh~2³ĝ˙:+b‡Òa|Îı÷T³|Ĉ~ĈÍÒÓëíé‚ĉ§d˘Oç”ÛŠy;;­ĠY5aH[½oiq§i’ÊótƒIÛâ½t}§Ó ´âe~ɋW/VCˆ÷3Ú.Ÿ]syyIÓ6<ŭŠËĞ+Ĥiâí?îÇwö{Úâg•}IzÜ.ĉ’WIc…EN,H…Ĉ۔8óCğ†ħï/ŻHÊ3úû÷ïı;ŜĦ;:rÌ~–qƒwÏ"ĝ€×‰h1èœQQI’Û!˖ä•dŜ)yG“qD<@şĥt‡×£éË5ĤħçĦ’¤mtqêċDž·oàûożiŜĵy×ß|Í/ù{üŜï}‡Ûì÷Üö,ó œ•0ÖižĊÈRĈÑ54ږ8x‘I^ÚâÓ41@6eŽK^“KBYà`DžJFà# —‘ƒ´‚ħ$ËomÚÛs+ÙŞĵ%•ħ.k;]ÔZħnċ-7mìñOSí·ËŻú{·9Xéu‰Vżïúµ[óL•#ޏş¤Ì9Ë!nntŭü†ëgÏ0VË2sûáżùÍoĝĝŝ9gžßܔÜ>İ&?ħ,K} ĜĤ:$Ĥ,ÀmAĝöŭ@ <ŝœÓ83Ž3Z;‘ôÙĤ ?%ÌچœĊößĥ=oŜĵáââ‚ŭ~Ïéx ÛuhkO#ğ^–˜Ş¸û[×ĥ÷rFŽ£Ş­>Ž˜Ĵ fü(‹çĥiışşbwħápëÙIĈbL‰··ëĵß$.Ÿ]sqqAßË~ŽÛóĉSeDî%QXN ǕbKÔ݉ĥ³ôĈÑjCc ìŒÑmdÁŭıÂs³s+—l‘ ŻğŸ!“°$/˙ٟŭÇQ=²s?1lÛÊsë!£€à‡K˙É‹Âg8œèIs`¸ĜÉLς²˘]$Aš<Ó8rGĤĊÓZ1Ĥĝqb%@Ÿc*İàúœ)ÔXÒ=*7Ĝà,É3ċ,í"ÏIÊ´´4‰3Ğ@i-ĊâR@ûȨ0ŞŒMwħİjÖjZçP.£JJN ïŽû–iB‘ùĊ7ßpy}͋Ïi{‡ëöûŭ1DJ4Öı”€Ŭcmi]ƒq’üğĜ‘\Ĥq ĥuXżàsIÏ(³Ñš59ÏYYrä ñ=UN÷Ù9GŝqÈÁeÊĦv<5Çr%nĉÇ) £[žüè ­úêúgmÇmÛlCçìú5ġĤ˙_ £Í9=ZÖYjkäjÊİĠĥ÷˘€)Dßw˘Ê¸? ”’.èêŠ9ˆNyöÏw/yŭú5×/n$ŻŻqÌËÂíí-w‡=00Ž#ž5…³²,žyšda>MëaQßĞ:O'†âld“k(÷ಈjg†Oµİ¤éÔ÷ĥmÛUir8p}[ž­:C݊›ŞÊéşn­dëò7Nš¸x²–…ĞӖŬ°£.8•×Ú×v,Çnïx÷ŝ$²ĝ×7ëè茟u˘nÏ&İnŠnœ[vÚ­êħĴĦA}VœĥS2b–Ckr,ħ9êɎ ú`ó÷n Ôü³‡ú'ŝí˙ñ/UµrVçÒê"*n°:TJ@î“_H ĉ”ˆJc²ÇÛ2ÜôìG–Y"âß½?Ħï mې”b<¸ßßÌq<²?<@VÜ\½"ŞÈïoığ=2†Î-1´Îħ³ŽF+Háâe51ÇU[)ş|€§Ó‘‡û{Ĉ”qŬNËÄTf›m×ĉ%É:„FÓ´mYœÈFœòËaB[‹ÍVÂ0ÓB.ĉ*]B%şgw9Òt%ÎJ)nß½g9(­ĝúWż`÷lGw1pu}ĊŬŬ‡y^Š‚˘g£JYŒ§“µtÖĦ{G ƒp ŭ¤ó”ÄQĤ³˙R‹DŜ‹ÔŠ"ĝWOdƒ^:Â^‘èTħTB³óëA`‹|,%ħéo/ê­ -•‡–µEr£ê·ÛvçU$T–†pCÂxw9—RŻğï1†uÉ­µZğ-‰Y‹Ğ{Żm[އ#Ĥ0N —…ÓñDVpi.ùòĞ/yóċ—ĵxñÛ5,Ŝs:ı½ğċïóĵzŭš/żŝŠĥ•´”ñtb™¨ïç…ŭa³Ÿ„MŠiž1apCa³(T*r¸JBğfYĵeVßw=}×Ó´ÍŞi—×{>¤ċ}Y8F)Nb\b5 Z)Ċ²,<<<ĴrFçdiYÓÙë, á²Ĉ²„ìK …àsLIĜöY1.ŭ8rG´u¤œĜu=]ߓbäáŝAfŬğ~­\ĞU}kIWe‘ëĴ+0*aĴ1|ĤȀ“èٍÖX£ÏPݍö^Ğ­ÊI­ŽG>™((rÎ)4˙,#c LJ·Z È?Ĥâxš§e,FK´wΕ"µF­÷cN†éxäp"¤Hʁèó2a;˽Àï³&(R6(\‰²4 iÓÑY‹CŞW·ë„Áĵ59”ä (‡]FYLÓ '­"Úè"ŽâÓçHƒ¤=[- eŜ‹B"çHŠ`ĴĤ‰RÙe &ïI>⭓C='4YRħ1ä8Üߒrb?ßsġê9Ż^½âòò’Żżú‚2ûw#Sšˆœ{ï²,LLȑÇmcĜí.iğg5Jı’÷Ë!f‰1£ˆ(Ĵ$ı¤ŒQĜÍ9‘ ÄàQɀ‘f…˜ZÖxĴş^ŒO$\iĊ Ñ3ÏŻŻ3ğBH”)ĈJ4ĜġpvëeNE§ĞJ²‰}`H4-Š /R¸ †R Œ’˜ Ê„*ČÒĤç&“³8ßbò¨˜1ĤFŸ² ¤’Ì\ŻĠâÚ"~N‰çg.Ëİ ­Ì×jEZumâÙnZ+™ÚµĠ Ì3l_–6K.ĥ1bËĠ˙Û{5ɕeYzßQWıŠ€HdeuMëšä˙˙ ¤ iCÚ°ğĞĞKd&2ÒŬŻ:’û¸G E͐´J˜Á <<\ìğÏŜk}K~ŜR çôġ•S"@Y!š™ëşı7V Òe;bHx釞w_½ċW_}Ċnğ#¤À4Ώg&żx:2.ĊBњĥí˜ĉ™§çÓġ}´Ûlh!ú@É Tf\O,ËÂ8Ÿ8Ï¸Ŝ²O[ŽwG–ueZ$à´ë›ëBr^U„Ì2Žż²N ñ™s),ëJ ż.ĴÁ³.3ħdùîkWh…Oñ~"GĊ~÷é;Qż¨‚ëĊq>s:/҇њy<’ĵÇڋ=\pÂÊ6D–¨8žGšvÓ ĞŜ6¨ĴPĊ˘ŠĤoÙi‚Ñx­q(LV4E”¨—‘Ù‹QĊ\I—‹úg˙R"Ëz×Hù)ÀùkëîgW%8£À”‚ÊQĉħ1QTĈ8i gżß)šmK£ëäY|bN+>%ĉ’˜Sd™gÖ £ŸüÊ\ž&‹“Í( Y³Î+qœ))³”HR˘k5VÓu=íÑt§Ú Ûnf!ˆ’Ĥ AkqÂhè\˙•DÒ´ ÉËϰX#'ûT$ġ²äˆ!W­ĴŒ|È5^HË(¤ĈżUѕހJ( …Ì~·#ñ‹çÛ7<~ĵçí›wĵ÷ğŬž›íwûwĝ7žOŸxĝtÏ4Íä5çÈn·—Ĵ·”Ï Zyœ³´]OÛ6¤ Ŝĉy%ÒçŒD€uŽI°ZÑş Ŝ[Ê"ız*ÖC¨KıjÔÉׄrŸ|J˙ŒDĠœ3hpĤĊıkäNYŝ*ĉ²ħ/WŭİkÚÊÍÈ?y•’9ô mä¤ 0ġRgĝQNU-"cŭ,ÖŝL•ĜiÚŻoş|IZ‡‚‰œ·on9ìnÜŜܲÙ”ß|{ϟŭÊşM‡iħD´E°³V²ö?ñ|GÁÓ:‡u— Jeşĥcž'X$÷NU6ò2ŸNĠ—Ġŭĉ@Ô ’Â*G‰™<*ˆ‘ĵ,§“Ĝŝ×çuĈ‡ÀìW’‚&·rúS˘İ×)“|/­|ÂXƒ_=iöĴ§|Ş2Éç³H< ™`iVH™Óx",3V'Bhç L&*MN+FĥïëĵXfákòœO3OOxèlOWğġµG´µöx Ĥr6bԌs¤wIĈĜĦ²ĊĤ$µB;T6¤Ò’ŠEiTÁê‚U5†-+ċĠ‘ÊeÇq•Ö!;6y ëkì|ŭKħ80Ĉ”Ÿ‹ şÌ Êr)É„-)Q’S3޳„XÓÊL`* Ϝ<§0q^fÖ, íež§‘uY$›‚²Jĥٍpv.”èYÎ'–çÓ%Œ…˘…+ILjb³ßĵo¸Ùìħΰ¸‘‘‘ä=*%L+–gë Qur1ÁThz$&Iòíúžb˘€ŭµXÓK,ääĞ’G3¸gċϋ_XB úBβé×ĤİkM6” ħĤTŒaA;M³éċÈıx½ûÄó™Ħßp³a{`;ìxûĊŜŭ’œ2Çç#÷ŸîDsî=:².Ò uÂꂲŽ’"%]dKÉbÁÏ30c4+C•,B˘ŒuÊ%ĊBĉ͒|­*›£†z½‘È˘×Ħ­EĠgµúZ#so+É3Ú Ÿ—j!M’KıèNİáşȏÌs=²ç’ñ1S*Oúġ˘:³@prĴ;Š ²VtÏÚħ†UĈ*ZÑĥÛcğÙÑ÷-ğŭk1Ĉ1­3_üž‡‡{Χ‘q9²=´ ı§ßd-€ŝ˘dS1µ§Ó¨À›-ŬvKÓXJJ }51Jt–Û54Ĥ“î½ÈŭÓE4ĊhE.hCż#§,ıĴĥ°ë[‚ĠôÁ‘‰9ÒŞ‚v0ôÖ0  kœC5’‚¤ èx9½*ŭ‚}ÍşĈÊE^NM!Yj%ñRöĤE[ÙI9³!‡–ħ˘ÜÚYy/ÇH×gqşĦ³ƒAĊwÈĝĝÀôôŒžMcéœ#OoZ;1ki Ħµ"¤B\g=a;‘ıúÙ°!`´E)SކAG6eC²`ş§EĠu ñZ”WrËÉ>ĠOĞ;~Q™]ŒQ)š×°ZjÊÀ˘Q2#J+9P™œħÄ+@E –8+ÎÓÂŭĝÀó81Í#KXY²ç8Yĵg]|X‰%bêHԔ c ÖUŝDM>ÑĴÒô›­Ĝ33œ§¸à ˜›Ìm;°êDêÂĈcs!EçZ6ÛMßáş,Ëâyzzʙ”mÓq¸9à\ƒµrÔ aež2ş¸ÙÓ7ŽX2ϧgÖs((şHJ·ĵĦÖZ‘uĞŒ–7pI‘„ŞhӞ˒˜ŸLKâûğ'Œvlú-Ŝà‡/yûċWüĉo"żg'Ĥqä<Ö \Œ„9s?>³ßîèì†Ö ×Ċ‹žiœ™—‰ħĴ)^⸊O”dS u­tO&i¨úħb{ls1ñ¨,ĊüĠG…AŞ`L¤ä•”O2ŸkO$D.&EΨ”RĤ•ÈêOdܕsr‘Żá²NÖÔĐ24ùH^ÁŞŠ–Yñğ7ĵ{ûžaèiێï˜ĉ…‡û;ŭĝ÷×Ċœu-ĥÑUXk£RPx-2c$XVı†%'žĉÛw˜àhĴ£iŞi(8RÊ´ÖÒ ŽbBŽ Úµò8WŻÁš›İl‹5‚qŽ~3ĉTó5Ă5ZR½Ğ6żĠ’šÍKâĥÑëA÷5W”xòE.[)ƒEĠ¤ŭj'‘dï‰Ì1@Ž`ÁjMRŠŻ£"ƒ­½…S #ÉÖ‰§#éĝHOôJÑYJ+9ìĴ …ġEó§²Ĝ3dżˆ<Ĉ•iM<£äWjƒħ:K{`=Ù\×Ñw-ŽX­EŠWkŜOCü´ä"Şú·˙üżĞż˙˙SùKgï}É9ğRJ÷S]ôG?ü?9EB ¤Ñ’ÎĝÉĊ‹­uùîxÏ>}Ë·÷ßqšgB ’A—DJ•b$ĉHÑۊŝÓ:ĦRŠÌ)KÀ(ušfÛ³m:öÛúĥ£dĊwŸ ˑu ç3:Dnûs{ƒ+ÜXb*ô]íŒ6B#£ÓiÂûıÎĝÄ ğÙôì7´XÇ2OuĈÉŒVl÷{ĥŭ /Zm}dE³')q^L-E+Š‘y5(”Û÷„uĈç„) ×u(-èÈĊŻÄiF—•œOgO|úôÈû/äíá†ï„7RbušeÙr˙Àñ|b:MWĥ2g,ÚZ†f ïzX–@\a ¨ ĥ}]Teok9İ §•‹ &_d‰t–?ÈK6×fCÈĜKœVĦÄD"“5›mTÒŽó|3½ĞÌìê,m% XĉÚ/ìaïĞĤ2š^ˆhmgÙĜcúfƒÓ-7‡>|ùĦx|zäOü§Óħއ&–eÁa× C$&Ĥ(5ü7i9!ĦĤ‘…[1m482ÏxĈÇHßĥlş%eˆ3Ásĵ-а5|QĜE”<İ$Ñğg5ĜêôËDÛfŒž‰ñJşÓ(³_daŻ/!2ˆ˜pZÂ-.Ù{)çzÁUġc-ĜZBŽ‹’ÑKȁ¤>yJRSŻž?‘ĥ²ûHkȰü´ĉ3Egşġ́ zŒĝ°’ƒ—xĵìĊ †“LÈşxJV,ÓÄl#Î{œ]êéÈáše4SSšĥ-}?°é·tMÁ"?ĞVĉ•2èC{M#ú‘q ´ÖîÒ´Ú?ϵŭ˙˙Ğï{–ei]ġĊ^äP??m§wş:ġrѲMU™b 9­#÷‘OçGĉ“ŒŠÄöÄ%A]²Ó„r§ŒBiĦÛɛ,ħj‹÷+δX£pCÏ~Ĝsè·l{InŸŸIĞg<œOĝqa>,ËÂr>³œ&b dß´¤€äÎPÍ|>1ž >QHÄuĦk4³Q¨ĦÇıżŒ,‘Ó= Ĝmw<=?Q²g| ĝ(K‡ÄR<è˘$+­(Až˘ Zb()Ĉóid™VJÒ8Ó@…!Iˆê€u-ÏÇ3§Óïĝ“6üĉŬ{ö›žfÇÍaÇá BŠŸž9O#O÷œç‰étĉ˘³˘Ûlx: 9’TĦXƒé[žĤ#ǰ8>ó8ñ@v03Ó4c²âà6¤5£ŠÀµ}ˆ˜¤­&„UôŸRímIŠeñ,~ÁEMžaµm-ÓèñkĈıŽÖ <>œXÊŬŬĞd%f‰e>ñéû~ġĠÌĈMäéñH *+BXħĈñġż}âË/żbíœm™ĉ‘çOôpîcu ñĥˆ$rñ¤4ƒ'–„mœŸ´F£ıT:ž&’1ݰm’ĝ)H˘u‘âĵŬìXĤ…%'úĈñċğ÷Üîo !‘|Biˆyċátf 3 3żĦ醀îġ׿&YĈ•i9>ž¸şáî‘é<²Ñ jä4‘V™k6ĊÒE“Ceh¨DFT—dĉR˜’jF{𓗏˘Ú̒Pq9<ĞrŭwcİËӟĥ‰_Np?fÂÈÖ>'EŠäKè[ZÓ0lo°Ĉ˘ O·Û›Í"ûSàÇÂĝ=ß}ü–ûûûëp]Wr*ì·ûĞ{=)Ï/BŒ+1ÑğN:f#Öz ÖÉ"Ĥ„_&’÷×Ĝœ McÙï6˘(mĞ1VĈ_Ĉ48k˜–À8Ÿ9Ž'Ĉq¤”‚s …j\ʞ̊uŠĤı@Òd IDATq×ù1Jtì%S̉%Šœ.+ıŸĈDĈLĴ "ıĵbaäúœ\žI!şžp(¨5É×ı˜Ĥô’°^R‚\h­eSU4*fژè€ĤÓX’šñ%#ĜRp&B.ĜèD-Ħ‡ĦAë::ĊŸ4Aèвì2‡(ˆÒiRšS;q'ĈÍÂÒG6Ž+Ğú˘á˙é˜ĥ1Ċ‹Şż~‘tuby ż~3ü”˘³Ï×)•B@JéŠD̨%ó|>ħĤˆë;şĈ2/…‹)ÏZË:.˜]ßâLCñٓ² I·û=ı8ħefMHq\ Œöpôgúf`³ÛBĦé6Â=î·X×cĦ`q­„Bçó™e\8 .ĉpâîîžĥkxsû3tä ŸĈßüŝ÷l·]70Ž'BHĵ;|`è7<Ŭ}OŒ|’‘™V´Ê4N4$êñóÂĴPùê¸TEÑjGk{ŠJ,Ċ:IÙ0Jĉ§e™èŒÍfËŻŜ yȸĈ1‡#ÇÓ=Ĵİ*eÔĠF/Ş"}-ĵVŝĉĞżÑÍUùÁ듞_ĝôŭwĴëÊ9GNÓ(KGç@#@'¸d¨Ğ,zġ‘Ö*vğoŜĵ“şDżğ.žĦkÚ°Î3‰ižx~~ä<9'ÏI)š›żµ£Ĝ×k‚÷Ì>2ß=r˙|Ĥmż§ĥÎñïp9ÉsÒ7|¸}ÇĤíiMƒQ†ïżû$y>qž'ŽÄyžX}$”Äâg|–\ Aĉ€U›ž ’ĝm$Ö5âî²VcB›"*‘WF– nà‡QVòïŽk]Ùµ4Ĉa£%úÄx9ŽGÎç³â Ż!ˆb]eL8şĥĊ5ƒÌ2K–d• ħŸ£q 8‹­]Ħ2šĴ5EiŠħ  ĥÙ MË#YŠ6äBEŽŠ}<Ĉ(şr,E5„¤y~:’=,Ǫ́WŠÊœŸÏĴcdp6ğŝü=NuĵŬIĞŒÊĴFGÇfĴ•Ċö×şŒîĦï:7ԋ"))Îérñµ9Zı*‘|ÑoĵQĊT09ĠYBÉ:÷Ì4-]·1§‚Ò™˜Ħm :%rL„‹˘µ†dħ8ŠrdĠ‰î8kQ !*™mDp ‚pVˆ)1yE,†ÁtŜî1"…ĴÚ9TÛPşĤĤ. Fĥµ-m£!GÂ:­£t[ê5ùÊ^ÇkAĠD˙0Q<çœbŒż °ß[J)ö2ô~]sŝÙ¸C½¸ sMÚV qñdÈ ˆ™˘œ1Ħ0(Gc ‡HWJ$5(ÙdqBċkdÎéĴĈ‡@‰9Ž2Ğ.žÁÁ~7°zbNLS šLc@“0vƒÍañĦ!Ïù(0ŭ‹U#ÉH|ŝĉ#˲°ßïé†M;`\K*šĠ'|Y˙í÷ÄÙì7Ĵ>u‡ôxfšEqB ! hÉ fˆ:ġBQŝZ”q4Ŭ@ÓtD›Y2Ğ_\cpf é-!Ż<<ßópş]Ş|,2GeéşS4·ÛĤiÂcXòzMY#$Ÿ>MÄċL˜RÌ ŞĦo{ĥŬ€UŽ_~IëZ”ħ¸­f{Aßb›×ÈÒĴd™Y")bôÄ()ê§ç3EeĴipÁh‡6ԙġˌOR¨U•5^’ß3~ b׎™=8s>ş–q%Ĵ‘ižÏgIñŝ:+ĠWċÇK2w*r{*Ż(í*;˘’ïrıj§)0Í(q”*­0É\ŸèB˘AğĴÓ²’µ Ÿ#½r|wGÓ6ìû-ÎY2->j40O™û÷dŸ†-Eéٓ˘aĵ ]››_aÌP‘Ħ³ÌĜû–İ›YÂÈǧŻ9°uĦÍù9ħĥ Ÿ"։:#Wù_üÖĠ:­bŬë~.ĵ|̉k÷Ş´hâ/Ï7%““¨µ[yÍ) òA†§q%‘“, ƒV$mIڑ´c †uµÂô u!gÑ°ÄDÓv(­H*‹a –5)Ší0ík)‰L7–Ŭâ6=ÙBÉ´› m×B‚N[Hàgϔ'ŬcŒ­Ĥ”te½ÉwkùaĤ5Ĉè_¤@#i!.çĴ~ŠĞûgğï|\JW“’O¨˘°Y2ó²O4Êr³ıá0ìꓘX§…¸ÌĈÒjf°ô½Ħ¤ç kĊVşat>cK„0“c8ÓéÂÍàĜdĦı –İ7<5|>SüŜî;ž÷m}£rĞëfżpĜµ™ˆ355gr ]ĥ=Ë2²x1ttC[~‰V¢È>ĉ…#OÇgŽOL§Éúm/Ħ¤(Q@Ëc¤‹†(YŽ)DĈóÈ: ?Ú\#·"ë²½–Çv@ëDÎ Öĥ쇞mÓ2Í p)£VO™lLhpI´ÁĊ:Ĵ³˘µ–’=Ĥ;°ŽµXĤ™K^ÉsĈ(ÍÓoXÛ`ŜBÓɜĵßÒ8LJ7_`•hJ/Ħ²)GJŞÀw—eT5¤è<İ֖óÉ}$„$y”I‘Bd Iâ°²"Ĉ"£HİS x™,~}5'´4í×ĵ$”Çœ^pÔĠc$¤ˆĞ­t;ĞÏrôJɟIû$Y~ĥDbo;Úv#ü—˘jĵšxPc:6ÛïߓÜNJ7(mñ>2t›Û-7‡IÒQÜ5 Î5¤˜XgFm†MÓHÁònxC·oĜ>m)1Ñ4í5›aCğĥİ ˘Ú=_Âo%wH4’*QòKaàB–)£êR  … ßÊĞì•§TA•T Ĥ§ä£ …µË^6hşœQYñŬ0ùÄĵJ+Ĵ–y?„ĥ´NSp]HFĝÒaI”F;únKßmPĈ‘”,£÷ŭ­ ÇÓ³°JŜĥtn dÍ<ÎèŜÔFô%„ĝ5küµH⛺(â/R KVä’ògÑsŻêÁQ>gT믪Ï|Ir„B-´“żŝdÀ§(à”ia™fb³’‚ûâ­"‡ŭžïñóž%ȌpœgÖèiµ$ñğí°ÂѐMb×)Ŝn5mۓrÏ45ô6˘ÒÈÖen·R ÓžĤ×ìo5ˆóÌétâÁîmÏŬÓÂÉ,Ü6Üìż`ZfbˆœÇ'ŒÛYÙ(nwgoŜ½%y™ÀŸĜêB³.ì­bûŝ ‡Ŝò|>ÑmU)qİGJaMk ††§û™´$ÖÓJ£[ŠLG…ŭ~Ï뙟O<ß?pè{ĥmËÙ5àƒ˜fÉ™6zşŭNWï–#q=òĥw8׉ùÇ:şş<Ë)1­Ór˘ôúĉ=ĥ@ceims­WĈ Š!qıfĞjRŽay<2Żž´FĤu&yùy5Òaj >zÂX£¨r”³ĥŽMwÀÇL\£˜”0DDâ£Ç/*EÚi†fÀ-zˆİnӓkÚL"C*I+3SżH:ŞR!)²%'Âş¤—_D‚Jaµ†•Š,ÇbŠb¨!ħD6½£o,ÍvèÁÜɈµì7\c蛆­sĵ=ìi]ŭ7ßrûöÀğ7ççgÂÚ3l6ĵ½ŬóŝŬ ˙ŝğ&§•Żü+nŜܲ, OÏÏX[ĝ›˙k§–Şs–D @¨Œ“Ze4Ù KŒF…D@Ù*ü`´q™çgĴmPZ  ,‚MĊJÓĦ‚ë*ÉBċBL!Τ(.ÛÖ*ĥco hSÁĠEtӁ9­¤U¸*³B~ԊÔ)lӐPÌı°–†“ODŬîM?I£¤ağíi‡eXKv–Û-9+X2 7Û7ì7·¤ye] Vû+ñr,H/ĵñòı‚­şT½Rê/O³ûğü§òŭŻJŽ^%Ñ"PWŻ qΕĤ ‰D$J(ĞNW›$1ÉԈÜ%Anşfàpğ!8ž8=ßs÷íwœä9ĦIÌëıÌ솁~`Ħ=s8~ċ°; â• ~}äüôŒÊ#a} ï‡š&ħ2>?2>G×Ĵtza°­ ˜Ĉñ×ġ†vèùíż>òéĝ‘¸QìŽğù;–‡?Ğ7Ë˙üŸŝGB üñß˙È˙úû˙ÂÛî?s"û‘óŬïڞ/˙ŝ=}{o˙ġž2ŬSÎ=MŻy{àöí½³ü˙ç·<˙éëjx92}…kŒiY’êIÖpûö-jk9}û-ùÈ­3|ĝżfy€“ŸèìÍ÷abzüDß8RòĝqdkŜòĞW´Mò0ópúÈyžë\×ÔTé fCJ‰óyaZĵ¤ÊÄLZƒ(8˘°F –yœ…w­ Ê0ŒÌ sŠôş R".5zá:%ÌVúĤ“yôš%˘’PĊDïħÚrǘUôMn *)|ò!yJ‚˘ ‹ë“Ñ—µd%ĉšĴŞĜOUµƒ‚Öı:ÌÄ"`Ñ˘Ö‹EùEn)×ûQqµı\o7ä,Gw­h­C;‹ÓFŽs"-Ê8Ô|Ä´ ]'Ş‚ä'ÂñÄS!EÏÛŭxżG•Žùé[ž§‰ÓŬë,ÏϒÖòöí;›Àn(ŝŽĦ)|xïĜm9Ŝ˙žeYIżÙñŭ˙™ożŝÓyÁXEŽóĉÚS-üÊŞZ´qĥĈĴ(xŒġ(ċERİ şhŠ.²4ÔÈÉXƒÁÔç͐•DÜ),):È2ĊF%´J”â i$GO×ĴQÙşag½ĥ´şáĝ~ü˙÷ŭÏüé÷˙³g£[l°vgfžâ#ĦÌë¤2š€ê:œ‰ëŒi5~ĵc‰Ĝ3öù„ïVÂibîxż{yŝ=³Ï4óMşÇ3Ŝ4헴ƒ§że›ï°íŠmĴÄm Q:ÁşŽ1jĈŞ'6íŽßô·üĈɈaÖ#gŭÌM(ĵ)·ÌÍ#övá‹ö uúxŝöéCiò„ )ܸğ~”–½Ùé‘[Qj–`Ö%’cġƒŒ–È.[RRÄĠ³.+añÂɲ÷ßÔEnĦ ²%ËU)zù*µÚµ½Ó%sċe~FiëÖ6WóBŒ‰”Eâ:C)X놕eY>J(où,•^”K)Ċ&ŭ, è뜞šR–àÑò*×í²&“Q5JPŽmk%äĠ{ÚĈÒßléxú×üËùßĝŬżŝgĥŝî7żĉöµhNO´Û´Ż˘/ĊKĥÁ!ötmËóñHÓ8n:Élèˆ;CxÓħë›Ċ5 ŝĈòîF¸żÛí@SNLóBˈ&˘M:z~ŭĤ£k ğ>qûĊ–üvÀ5†üôG–ÉħgċŸŝúF†>3ċÌá×7ĵy³£wžÉÏ 7[ĥ(UĜ¨gÜĴ(Gşù‰ż>€Û*"£rİż&k ­2á&á°lډŝùkü´•:˘n ~E=ŭWşéŽ}⍵˜ó#ïí#ûżÙ2lÎ˙i]6{6}a˙wĵ1ĵí,í_mQZ”âǖ7œ˜¤ š–&ZlM¤—8ŞR#ĵ.³c$Ġ€Í*Ü2ĉU Kùqí<ÍRŞk€ÂeÁvI1FfŸ?\w\ŝ>Ïóg\Ŝ­uuÄċ|-ĵŝ·Şbĵ|}y}ğ—ĴÉR°ı&ŠˆúçĤ•–rÄl)5] <*ĞB̙v#,ìyÛ³Œè~³ÑLÉìş–œ:ŒÒìâGˆŠxŻš$üä̲J2MÛ4ܑnúš}ü^:Ö§ßħĴ+í8ñ› –[q›ÌáW``ĥ¨RX‚—QCÎhcPFËG+)"ı™RzUOxŻfœ ޤk:zÚïËĞ=‚Ċ{QÀh ÖA×kÚ^£uIÉcTĈêŒS†6l yÁè\VßâŭAÒá7P…uÑf‹v#Yh{Ĥ™²b·ż!,uŜ ”c·½AفeA=²5Žo˙ĝ5çí-ożĝ íÛŻMCÓ)” œŸÈ1ĴĊ+u/&–ee]‰ŝŞuQ_I—‘Rʍñ/(ş¨˘‹–™Oċœuƒ)0ö$xĠFÂp Ê$ŒUDż’ÂÌîfÇíM6‘żŭżXïżĉïßoù‡ŻŜ³Ñš||&žîĝÀMӁMèħäz_֊ci”'žÏèĵ QlKĈ* M†äiÖEÎÓ9ŞîôÈùOŸpVƒj:è³§ñw6°J‚ŠĴi%GŽÓs=ŝZ`7ìËŜö–ĥxÂóH süĈqƕ~y"ÏÏ´ÉóÁœµÌ~%ç‚Î'™e–0[ğéóB<>°¤­4“qĦo ~ér$fÑnw]‡MOé ğí†spgGŠŠâ'TVXNEĥ&aíŒĝ: VK.šR<Ĥċ.Ċ9—L!W7ÜZí½ZlùUÓM)$Š˜‹ŝL´a·WWñżRışĞîY‹Ó •_ÙÀĠ灴­Ż|èËíĵ6´ˆüêGĠŭ˘/Rşĝó™ä&RŞşC½Š8ú —zıħ‹|ŭÂ%UА2ÖÉXnĞPÈe!Äf30µ…R<Š€jDıŸÈ9ówïD/ZyƒĠˆä/Ŝħ|ó=îtâöÍڐ0s}ÙžÍfC™?2>>ÎYÚĥĊèJ´‚ĵfT½è’ ÙׇêbÙ' BW•zbWŸI´Ê„éŒİÜëŒĵvĞ(@ó™MçĜ =ĥÉÂİ™=ĈDŒS”*ıĠY´ÒfĤ” ĉUB#œ64Öb”FMwÂ}¨*˘Á‘ÂÄ3d­1zfm²[ZĴ:“½'EȖr÷ö9çûoèŝ‡˙…÷› i!ÎϨâħJÓ4–ĈŠÉˆœjBb™'TI8+f…hÌךÓö—q”DQZçR T ½;Ċb]Š$a¤ŒC‘ÑäKb…ÖäÑ£'„ÈÜîĥÜn{ğû /ï÷=ğĥğ#gĜ~ɛw[RÑ9Ö­+Rk!)ßş‚icL¸ĵ^9!ĥrVŠ”ÂP`)KRʂ ^°h’ÏÄE:&gÊh‡ yPZ³í6ĜĤ!‡ÀyžènĥL§3*FúÍÂÂx|Ĥ¤ŒU;7ŭ™&QY×3ä"‹˘(ġ n’Fg0EvùE'P‰µœÉ9Ħ˘†V;ħü†‰çO+şiÑQî|â\"¤BĞ[Ò46Žvä(É],S PB”HŝAĜ ?Ô5µäeó ó5Úm.Öè:‹ğœ´J”|Çjŭŝs8ri[+ğäòóûöymÌKħ½¨o”ş$Ëüυ'ŞëJû§o?ĝ&üCPX½U­tíÖ:à˘m×Dt‰äPï_L„YÍJ]ìÇ"us‘›Ö[ÊĠQ_}£Î(r£ħĊ£3Ĝ@%ü„BħħˆĜX°Ĝ—üĵ’ħĵ¸vDÎ,2ĥÔ ĵ(Ż.Ŝ"4ŞÖì•@“ÁKp…RUS›;0lX‘Ua çU†/„$׊ĞîÀ)*bëbV!G2‹˜²0¨˘PYҖÈc…ĈWBF'EaRƒJ›VY˘qĴĦáMğÉŻ<âü·Ĝ²’D ³hċĜ ]#1k4CëıÇ*i:QZlë  g•c°żHŽ9ˆ(’ĤœQ9Ëĉ—BJĥC˘tŞvYuĈ§,x \W|ˆ8£ÙN+ž?}äíĤDžŽ&YžH‡Ĥç͠ȋç´N¨Va”hV­Qġ //ô´Œ82½UiĴŞÄ2OÑg-…$OĤ­‹Ÿ’°Z³ß5…Äë@U“s­\œ²§k0ÎÒX+‘OÖb]Oë ËgZ͚=•@§†…Ö&†ÖÒ7J^Ìı mágœ6hcim{/‚KLıĉËé„q eĦDe&—e"òĈv€XiS˜Ċ`"KœYV9ĥc0şAk‰*ŜW}úì RoBa1ç’?ë ŻĦĝéj‘˜_ŝŸŞĉŽœ¤°üL€ÏHŞğ|ĵœŝż’†^ £ú™²ùz„§ĝs¸ħ¨ÒĞÇĉu—|nı ž~ZjŞL h%\Ŭµ)ĤW#ƒ—DŽŒe~ú§ÈŒmCJ §´CiG.Šƒ¨4.dÉW`#}IOÏċg/`ZİWôA>+Ì׿I˜żïÉ2ĉP˘s6­Á4J^FBŞÒ_²áJoítuËԈĈ€Ġ˘96ġ”TÈh“kà/d€(°ħRùĠsTʖ×8ĉefç+>tñ ¨ˆ•$Óv< IDATo+ħ(rĴı‚h2] \eTÄXˆ9à:޵8 „4˘É´ƒĉĤéHıiĥP,óĵâW-p˘’ċXC0s’VĴħ˘ÑM5ĠX}íŠ>ï+ċsk¨V`U^Ĉ EDX…"´B2Ô7ôëM^ÒÎĤ‰µ?@z)GbvĝñŭûqżtħêÂQŻ êGA˙ıî^k}ŭî/£‹—NSŭ7PeşÒÓLĠR—$ħ.cĵĵòƒS ŬO˙ÙôtkŞhqçĦċñ,Š’!qÛÌÖËu6¤ë\=Ğüó°ëhçî@ĈY#7› ˜Ĉ Ö(Œ6´MÁ9…2Ò`Q guĠgUw”…˘ÑYĈ¤Ò¨$œ." ¨û,„ùĦ ġ'R‹sOQIòĜ•¨!Yş— FöeŞTö‹÷3Ó<‚ѨĈµĊb !p³ÙHñşÖZ$ġ肙!WJTÀœ™S)*Ċ ¤*•Œ-`•,.zèS=ËĈ;y„,/˘ĤéHЧËêċAVşaĜXÖï8g\YĜ8˚…3Ûnħm žÌ™tĠ\Ĥ“Ĉġ]eB'’u¤bHIaAuuf‡äÀ))F|ôk‚~ĜKÖÒ óÌ"iXcáf·£Ĵ³ÀŽJA[Ñ´ĉ”…Çœ#YÉĥúL.Û÷Xm˜Ĉ3Ŭàĥ=%Ĵĝ”Ñ}Oc^·tÖħ,QR_r!äŒN êœ?•BXE[àŒÁ´e<³?²Ì‘6'Rˆ˜UĦUí˘Œİ: “ÙlĊü3M!x´Ub<(e-!‡—”“öir–ĴßW•I+TÒUšêçëx]ÖÂlĴùüĉT óËwŝAĈBCù³#ŠŸ§ĥBÑ˙ß t)ċjL¸v›úĠ×üw~U‘¸1[íßİòżÒ„˜°ġ=T^ĈÖ²lĵUġƒ8I}ÜeÉZÑù²èE ßÓ,/ĉWKĠ?wùêâüaçĴêE_ ˘Ĥ´5šĤѸĈbMBĞe‹ÈnU‘´Ž\”ŞF‰Ò˘²ÀQħReS@İ(VċĠÇZĴĞĞSĠĉPc+[÷()ĉ]U°*W3Mò)Ë2ӑք_“¤ÔÈ£_€ TK$wŞšš^ò1€Yëïż|.dqé˘sKĤaêÑ,gbZ{-bAŽQŝžb¨oÑĜêŞë+€q( ÛŬާÍyšL`;4Ä˙‡¸÷zŽìşÒ|Û“ S…²´[Rğy˜˜Ç÷i]uK=”#Y$ĞX.ÍñÛ܇½3”¨n Ġ``*@ĉ9kŻġ­Ïĝ”úmŠŠ¨%Ŝ¸0%ïX™:µŭ‹E–5ѧ€S!uLX+„‘)Mş™ú)›„[‚4ôcO;Fú1eÑ$Û>Aċ˘dQ/¸ÙĴħĥBU³,ÇNôiÑöˆmÓ`­hÎ#¤AëŠ %B vƒd>Јq<³Ù‚Ŝ † êÙ)™3t7Ò#˘À–‚ş*èۆEm0˘bj“kŞÂûÔEKQĤ›\Hb³!z‚NJ¨‡—[¤ƒmè§ĵİßÇÔËĵ şġ™ €)µ\y'‹Âèïħ}îvV·@˜ı||ŸżK*0†{@éw Tü‚ûCNüEĊúöwˆw˘ŝ‚Rԛ@#uRċĜEBâóĵöµĜċXċÏH­siJŒÌ~!IŬw[w|s~P ĊÊ÷W‡É °!uşy²ÖZb´@àÒòn$ĈŠ}ö° ì­$"Ş´œŠ’£· >›âYW!"QĝûKHNu"!Έh! &Òŭdc²xHÈCVKFkwÈj…EĦ½‚I'…E™ÓâïÖiZ×ì…d•+ŜÓZ‡˜;”ŸĊ!cR‰¨}ôxïR˙=Ĝ3 ĥ“F1ġ1Ân³a>Ÿ³ııĈH×liú~˜1'…——Ìê!…˜&Çġf ½àdqŽÀêġK aÉÖZ–G+ĥÛ _ŭ žœĥÉH}ħXp|rÂñ²ĉ˙üöSÎ?NœÓІġúĉ"ÖĠ‚Ċb˘äâÍŻŻ¨ëšÍĤAiĊĴZħ 7Ä(ĝĊß˙‚_~ġR~úÉ'ĵĝâ77J„Lħ\ĥ(xöôç#Ÿ}ñ‚s ·öZHŒ)9}ôŒĈ^üëï˜/Ohw;f…Â5;˜ZeA]ϧžĊbÎè=eQs˘–(m¸ŽpѰë`èğÍ6cŽžÉ58ï)ÊÀ³ÇĞ9.D|ô‘Bn£ŒŒaDI‹ħE‘3Dá½Kp yt;ÔöŬş”G— üƒN†9â@ÇüsĈß[ ·ùxŜÌëöüÛo=ŝO.ÉCĝŜpŠ= ïn‡ŭ½ġœHt”J^û&C&œUĉ…cˆ‰—MZ!%>$šë£ŭÖç}™hm"Á™ŝ¸÷‘¸kózXĈ†ôŝŭùßß%ßħ·ĵC""%Z ŒVhÑ*Á**DLùûç;0m¤Âñ@”Èl˘rì³. EŞĵ—}<ò²RĤC-ÁċÙ6 ¤—9!t§Ôġ‹ÛĵÔ ,&* %XMİq˜]$Œİ • iZ6› ÖZš&|Sdñ۔$˙AÜġâRÊżMŝĊO˙{ü×_˙ÏBJ!SrsLÓ-39Í8ĥH!pŜÑuŒòT&pssĊĊĊkşÉáCDښqê Èúú’BJâ8`ˆ)ÑXZĵ ‡ŬDˆš·ïp£ĝä˜z~Ì4‹‹š7ïŜá1ô]Çëw7ĵğÜr²íyöô)ĥXĉġE]ħY÷ĵ}Ӱہ°ZöœžNQòĊç_³Û9VÇÍ£+şÖÑ4_}yR†g;޲¤ŬEĈĦçú´ç·Ÿ~ĊğwW,—3 Ò4-ĞĠVá½çâ]ÇzŬSh‹fBkEş|ÊMïĝ—_~Ž_ħ[w<9İšß²†ĊÒ°Ŭ&C˙˘–>bı:"biš5ïŜ]òÇß_0tŽŬĥG)¨ç’Ĥġ ŸÀ?ü\°X,@È™ĝ” ݍLá°ÓDQÍèşdŒbğ”³(Zê|M˃Ġçûٛ fá–kĵŸ%ú^âöw;Wq³ŝvqUêğI+÷ŠïÁŝğ£˙÷ìï‹ÍúsŬ°Ï>ñîxçûŭPB@)™İq)x•ŒŬkn1zq§|fó~bòd‰ßùn·Ÿ÷ÔÂÔÁ‰ŒÑŜ2[‚O°Ì­ñ·ùçG†ïÙEHO$Ĉ(„ İ(1cR¸€Q$ÁI"1‡%ĞìDé²ĝmż:Ìq"–ûÈa•”ÊÂä÷ÍcLÌ$•sy 1M-ÂŬ‡œDÖwUa1Uɢ”TZ!\J$—!…EçĜn“×ĥµ–Íf8ŽÌf ʲ¤ï‡$ùö·ı™iwŞŝ6Ħħû6FDá%IŜܔ ††ĦÛÒ+O×4@`œ&v›k„ï˘çêê Cż™òŝÔCğešZ†Ŭ cݧˆžRI¤L1bb AqqÙn=.jó†n˜&EYŻxûöwTóS˘ÓtCr˘Úuï0zN‚ƒó‡çÍ0/ßħY7)xüè'§§Ü\_ÁJÉjöJMĴV+žžÄċċżz÷f3Á›Ż.X.—¸6âF [|ôCŜï=ĈqäĠĞWh­‰£Âžċ9Ÿ|òUU \K³Ùpq}MY1ìv´½§&Êşĉ'?˙óBş7ìèÚ-Î7ĵy=à<\½}IßH~ò³9}pJ×tüûo^³¨Ğ%ϟĵÇÙ¤jÙìqq˘,#Ğ£!c|Ĉ–(qx$ µ!ş@?xš]‡šE]#”AëĵïÓ¤ï>ÌÉñ@ŻÛû54çĈïé/]Üúŝç?Ġ ˙IĊ˙ĴßLüË1î˙È+WÛmDœw‡Ÿ7YÚÊû)âNם'ñ·¸Öú;·ß#Ĥ˘o˙ž?t0ŬD™í‘áĴŭµžËƒCK0ZaB›ˆžàF†1P[“ıHU”i‘6ö„É#u2J…Y!e’‚ ‘˜M2&hòñH°gD L‰6ÑFƒX ÂÑġ=6­>€ÔZW8ßB‘0:Oï„QeÀğŽŬî’LCƒs–h4m›Òj‹ĊÁŞ$ÎMÉEÑ{Ĵ)÷˘Ş*ëœS³-@…RBD7á˜RÚJL4ÛubLív #VM´ğ5B ĴQÉrû7µ¨Ŝ#Ĥé&Y€BD'ô£KŞrŽZ•ĵz}ÉĠĠÖŝÎÔĝ(”-X1V#}ßsqµĦi*[2Ğ—”eÉ8Ü$0ĈpĵzÈĵ^úĠÛu‡÷0ôĦ÷IÔácïY-Ž8;;#N‘·ß\µ ĥ(8YsrtĈOßç÷?"x^²Yß7#~šÁäñsÊŞÄkœ›××(Ğq‚€1Ž*É{?ċéƒÒ­ Sv½f{ŬòòĞ_~µċ³Ï7ĴwŸÑ ˙ĝÏO³ƒŻ_tHYP[Ċ{O?à˙ég(;Ò WD1!Ä@·Äˆ<ÚÉ$ßġÎ#”BФî,uÁhÉÉÎX„KC&"qŬûX×½˘ï6ûngĵÇĦïu§aß Ŝ½ħ÷Ċ^Œˆ¸s‹{Ċ1ü è`Qüù"Ċ~Ix[d˙s_ßwÄ·ä qŸ)¸1úkX(ü8ŝe Í?˙ü÷ħè=w[*•İš„CH ŒT éġFċE^ôç2KÉe³Ĥ\Âòò/ Ÿää1Sñ\2&Š&`f%hM$Î[˘2LÎĦ„BŠ1d)¤Ċ¨‚}ï)DAç Vşq˘#˘(0UM%Ûm9Ŭ]â|M`@Ās†ïİëú^œß8Ž—ğëX.Òŭ¨Œ÷^ŝÍ t B42ÉïE aJ1xüĜ3ʉf·Îw˜Çğïnìš eY˘ ë;eòPuAÀ*E˜ÂOÄ̵–A"sxeßwŸžptt„ġ×/ı¸êX.G‘ĠÉ1BI†q¤žÏxzüŒívËz½ĉêŞáhîò êèûäLUĠ5UU£áìì!ç珆ċrIoGf³EQRWώù£ç4Ûüü3/Ż™/ç }ƒw/żú‚ĥŬPvğĈO#óċYŜ^oùâĊ‹´D.Żß²m·¨JPœhbGëZtĜ2›ÁÙLñôÙ3ž=×,˙Ïk֛ç›Ë‰/üš‡PÉ"r³èwĞ£_SÏĠ˘À–Šz9G"˜•K”A | ŽaìqZQ†”YŞ1ŞDËlÎîúÄÉ)#J¨L_wòèö ;F‡ñŝ-Ĉ„Ŝu?üöÍ˙m ùŝçȽóÛĦħ˙>?gîÛ\àĜŝ¨³ë_ùĝÀò赔ß~°¸ËâH~ìR”HSÙ^@£Tb47 •žÈù” £ ƒ* ŜE„w&™)İ…÷ÓC€“Ġ›MÇ=R*ĵŞiA+ {Jµšác čGG‚€F‹g@Ô3 ̈́5éÁŒžhj°K–ñí×ô­c7Œ[ƒNİ!Ä×?]ûáÎ~ĊhžŜûC>eŜmˆż]Eħ'˜K —FdA’‚†@pC˘²XEi•¨ÌVÊ„†¨0Ĥ ( Ĥ8˘µĊXÉ8ĤâáE@’ܰĤè~àòêf³%ç's¤RŒíšİ½a6ŸS[xp<ÇŞ@Ó­QJñd΢ÒáĜŬH³+#Ñġ”j+n`h×Lŭ–Ğ·Żéw7´mϊôŭH³ı‚0²Ŭl0&²<ŞXÌ,ëíR8¤R –{o6ĵzŭZiêY̓³‡œŸŻhw-7Ÿ½ċċÛ-Oa’m£4†˘²Œn í` 0úˆ*BGü°fGĈħ²-UŭĞgf\onĜì&nv×|òä~ŝ¸y·Í7;~˙ÙK.n6̆³G3ž<û€Ġ²bĤ<³JaM…s-nôŒƒCŒ-ívÄ[Żwheİg>teÂ3 mF"•ÌKİÌ_ >›Ŭ‡{ŠÀô9|ëĈż-ä·çöï~ğ˜|gY(Â=Ì5r?ÙûOW'ÉġGü6û AŒßWĝĊ‹ŝ/ûùïÁ" ¸2D4{ċĤÊEYˆ˜J‰ċ£4Iù ŒCš¤´ħHeñÁábš”cLĜyòÄL‹l%ÀÌ-E(‡‘f iݏXžŭŒ³8~”Á DFŒr(1>ñœÛ]Ï˘^b²Y-‹^HĈ „*˘ Í˙ÇÍAsLQĥAóE hžÏ)Šk‹dóPÙÄËßù ŭÛ`1"*|Éĉ ( !8D (-( ƒVYUPT%ççY? ʂêzƒG‹Z­˜/V(Ŭ§è’bHK•à†††“£­'DÜ ‚äáİe5–.lĴY.+D)#L4Ùs~VpT}@tÚN CÏÙJ³¨ìš¸5QNWŠĝÁ)MÓ³˜Ïéûï=µ+C7Fß°¨gœ?{Àéْvì)kĊ÷FÇĤÙáĈ„%ŸQÎ ï.×Ül6ìş”·xĵÔ̆˘´”ĤDFMa% „)%M„qµQvl7W¸ZÂìœfìèĵÇ)œdÂóĝù#ĉKĊë7|ö‡?òâ³5ŻŻĥè5ĵşşâë7Nxr\ŜócÎŞ"aúRLĉ2£4ŭDÓmyóî- Ğ%B9ĴKAĦ³²$XMYĠŸŒ,  &!‚÷ƒ‡ŭ·şà[İ÷Ÿ*`>Û‹˙0~š û_W¤˙şn=ŝ}÷Ó½˙Äż˘ÀŝÀ äÜúÉNĝ–›7Îù0VZ  (™pi7ĝà8ZTHR@­ Ž ¤Ż Ŝm‹ƒÒ4Šd%'FŒŽmëˆ2… ´½BëOŭŭü˙ċìÑÏhş@d‡–2à˜nmžHÊ˘ íGú>RVÇH]1:C[VlÚ_żkQ——œ=E`ÙĴ=F•<|ĝ?ŽÌ‹½7„€µ%MÓBRîŻùzûáżIN²Êŭ^5½9Ĥ´ŒN`J•l%U@—[hŒ•”ó%J”œ=<ċüñóÖïèÏ|~ 8Ž–Gİ÷Ġ^5‹ÀÂ@ŽO>yÎn½&ş5½›°Ú°<)Ùm֗ߠ˘çô¨d^ħÙlÁoÚ5ÇĞĵ˙ô9o_ż!ĈM{Ċbħ ‚ħï(tMYÎp“ 2gt]G=Ÿ3NC2ë_(tQ%ö‰ÛÒÖLÔeżéjâÉ£†ĦƒùcúùÀÙñŠ€Çı†ÙBòŜó÷ÙnZsÔ°éZ†Ĥgw³Ĉʈ7)oıVhŞòˆÒVĦ8Y=£JÚn˘;l™BG…,VÊÌ9Z•œ>8â鳗\]ïĜlG^~³ĉĊWW\^nٜ*fsÁòôœ(Ş(ÑÂ14MrCPcĉTó; Ë8µL}Ï4ìڎù̂XĞ7lĠ%ġT䖢wğDĵŭ,ò"1Ŝç FŸĦx˙sVoÜĤÄëŸ*îâ˙BŽ?Œ3˙÷˙ ÊóŸùê]÷ĵ2Ğ =Ìï}"ċ>Lz/ 8ïpş^àÀùŽİç§Ôġ !.0ıäħ“r=Ò$JOž"ö0^càzü (‹‡,W²\|ŒV°Ú#D ß°bhß§áÁOHċÑÚv‘)XNN%ËĠœKĵ3óB‚5G,ĉpr|Ž÷P—;Ž+ž|`>Ÿlo”(e‘WJ)ŞŞJy–ĈìŻËq|ùùż‹÷>üĊú.*+|pÑÇ,HRQÍ †q)ÒĉċˆJdĦ!GĜĴ{Œ™ĦÍ İ Qh\LħñÍZ²::DÁĠˀ•‹Ä a h5°œĠôCƒ´É7D51FSA1_˘dMÓ4\o/°e ˜;şŝUÂà.בí°-AôÓtĈ†ĤÙĦm…V eÁÑ"l¤^)„í™B‡) !@‰ĈŽĊÜuיµ²e.$‹ITaËz½er Ž ~T"Í ) üú|3ñÍë—Ìf‰ħâ{°D(ÑzÎ4öH5!ĉŒ­Ĥıñtk ‚Ÿ~°â½§ç\_½f½~ÇñьĠİŞ>ä#oé[É˙ŝßżáWżú=×ÊÁè"RXbh \À+´(°ZSV NOkŒNFL];&ŝ݈—äñJŞäÒ÷şÌÈráö,S7$CVX‘Š1|‡ŝ–:¸pú@d,Oì9À™n&²ÂNĉ„“ì“‘ˆ¸6IĠ÷ĉ;) ˆ?ÓŬŠï“Ü’Sâ·*µ ü^_Ñ•L‰ÚÖÔĥDx‹Ñ–…’-*:”L•1frştÉK„ Ä8Bv/“ž'"BNHRnZ Qy¤NÒñ¨*D”‰¨[#ĠL€¤'JwH:‘!I;cH1NÄ´‰qÌKё½É…B+ƒui^qvĤ1ĥdò3ĥ V>Ä/ĉ"X ¸A]Í4Ġ´ƒg· Ü\]Ûß|΋Ïh7‘ùüôùž?:esuÁĠÍ óUĦt‰-fÔfÁérÉQ ŭŜƒ2–`hFĴŠ˜XPËÀ²<˘ß5Ÿ{q"FÏ4öL*"U„ÉÑ6 ‹e²Ĉ Á‰„ğĊ̍ C ‡âLVzĤLŬrROċ?Nİ$ú`ȃɎRˆ,{ŝ–´ùŽ ê^ âĥŭ‰Qİt‰ċ IDATë&?F~LTkéAŝĥ`‡é$ÓÒ8x’ï…$ŭîĈ$ß b:8öçß'm oż×nıŭž:§ĊRÓB ĝ@I!§cÀǀ ½ÍyûñÁ§1‡d~oŻQç‚é`ĴŸlf5E™ÜÓi™'H"1èDyË !§}§ˆÚ*\Áƒ. ʙA)÷İ <%A*\T|óî†7ëOÒ09Ïè=EQ‰L£c{„H9 䈵V7ÜÜlq³Şg³£ä£39ĵ ÔĊÈ4­qŭ5Zġ”UHžÎÎ%ˆï…žħX>ĈècÚA2û–ÍvC׍H[àDA´3äl%J‰’İQPÚ >i/bÉ53úż"7•8Ĉ£ßVmŭ!) }Ż\¨”RÈ,VŞ °%U5c>[à]ƒV §1žCÇ]"“Ö'7|ê€Éĥ”ŜûìŝµOIŽi|„—·İÁ11D”yI•˘ĠÉréënj!&Œ,QdòKd ñHÌcĞüĵT ĵ'C}šG]p COYh£ħZ19J³\Ìxt>Q–G´mÀĜ%Ċl†,@ÙbĈÑÑ)F/Ĝmuq”ÌżŬÄѲ °[XŞY•˘—dDqMż½FĊ‘Ÿ|pΓg5­KZ×WQÉÚGUàìÁ1.:ŞZ'xöä£<ĥÔ }Ïí9>9–5ÍÉ@×v”…Fèw\˜(gEeÑ&ËğËĜj>¸âħXÜ-~HÁĴ2sfEĥMMŞ1•;h™ż&oCˆó²1FÒk}xrùŭ,… î3¤’\ü˘ŝ~†ïŜ5íV}è%³İè3t£‰9ÊÊE‘ĵ¨ò‘oa†Òì#÷™lóߤÄ!bv_ğqpŒw~’?D<0gÒĦ‘vC·Zq!ġQˆˆw=BFĴMi=Ŝ{”hm³Ô<ܙb2 T.Ĝ"ÁI‰oìpa‚àQ3+Ëd%MœR””³N,ÑġBÔ S¤~’h[`낲ž§ĉÎG ×#ġD] \hwo¨â–AĴQġsŜ;˙'ŸŝVžà\™•‡‰ĦĠ ;"˜ô:ùàQ²  }¨°ĞSÇϨNñʽDéÀġĉ77ŻhÛk–ĊV‚騳JEBÈÛFâ–Ï‚µ&Û¤ú”âdÜψ:uˆáG.у2ÁZĞÜÍ&^ó| ŞĉXSbm‰5)ŽŬhËäA˙ݵNÒ^ ïŜĜ)×,ì v˘D„tD)1uj2ĤÔRZŠiĵ”ÁUDxˆBŻË„_‡8% ż CˆZĥNÁeÂ|²Ì$[ *İP"•Ož2‚ iċI(÷8àLDÉ"ıùMéP9>:b1›ħZžÑuŽHAPéĞBÏ|Ħ8=9!ĝ£+ġ1ÄÀĜ­“+x”NÉÖя˜ïR+˜UY<˘u#“×ôƒAǚ…^`pZĴèĈĤˆĞEĠ1c¸b¤*"JyĵšÀ8Ĵ”Ö075“’ĊݎHĤ$,ˆ#’€–!Îߗ4ÜżCë2ûK&Çħt ‘J7Rä]C@‰Ġd1—ħÔĠĤË=ìc]ÓPBòj%ÇiÜÂ%Ż•âŽŸ²ßZêÜ܈ïĝN¤É-uJ*ı­Ħ,¸C÷s‘ñŽ'FTû•zîUn⃇dÚ/r÷›Î…Ÿ=›eLI;2'ЈldsÓ " {GĉÓ"ܓË+91ı)B¤Ïy#"‡ßĤÈ$9w~9ɇLĜ7'äƒ*N9eTZI‚W„˜œ*C”<9Àû?ùgÊ£ÑĊ1Ú̙tD‚²ŞħeÉġĠ6šÈ„’e ëŬkŜĝwÚ·Ÿcd¤*NY֏)äŠİ“Œ.` ĊÍĠŽ×o.xġúŠf;0+4ZZT´(µ`ŠŜωĉS=S‘(PzÂğ5}ûŽʜP!í¨Ô~Q|oħ½WÑĤ·UksȨL&X !!/uZü¸„|ïC…Ö2yKíaŠ((ˊȒ²¨‘R#„B)‹ÑĈXä”GÄpĞBRn‹äĠš?¤tÉ8„;ır …*GiícŬcZ`"“z”Dĝž"‚ DRĦ‹ž˜—‘İar‰,’XÌmQ*|èŬ$rĞ$2™:żˆPÎ+„‚& ÇëğÂÖÔEA·yKô ç Žˆ‹-Sè@{”Ò¸#ê‘ĥk‰ÜÔ@sŠ„BeÜOˈ•Š(#“ „ˆ:òÑ%'1˜İ!Eı p C@EK?Â4öĝ a˘ÛĤĊĠ8ŒL€S QĠ”Fc¤;t\!&K%BrïËĊBgÏ™Mh’?`ÔòPĝò†^èìz§‰B&aƒHĊ™èrBĐY‰Ñ‘pdŸñÛŭó¸;,<ĤÇŭrÎşÉx—Íc~ÜMas·ż/n>ï@ö­k2;’ŽI9„0—l „É8{‚ùöŻKzNˆ˜;ğ·ûö"ĉǁÊ&SDÎB”B ˘BG’•g ısM*ܘ'ÙT¤ÓŞVÄ}\YéA:ŒžrÇ-p1Ĥ,B@ĝÎá ùÏö6ÑAÔ ˘ñéÑçC2ğŠt½J F "áRœóüÙûx}NÔĞDˆŠÊ…+JRŠó5Z§ `çzDìPj`j%2zŜ^½ÄyÁÜjtQ ¤"‰Ò[”4­ÁÇ,Ž?Ĥ^Ĵ8ž)”HôĵZâÑôàĝÑßQ=ÇË2MĉaK?miÛ×4Ík˘ïÒ!„Œá<Ñ9„½ußğÏÁOĠ@ëÛeŞÈaı€9·MÇ?6“CHQ)ğ0“ƒ-~¤(ʐˆwš[+ĝ˜=³ħşĜcğSŽ—òYd8Iĉ2’ޘaĤÛb,Lòdùà•.{>ì“Ĥ÷QI™w`c„,ĜGVċ˘.r§3ƒ1¸ŭŸò‚M#˘@ „KmFTñÑ£TvsŽ1ͧŸ!-³ ÛV…È?gZŜċç‰4F•-F§Xì)n! ‚C2e¸phĵÈÉŜ\#Š cÓN HQbLşišRqêËV²i9'F•`Âŭ! dbUÉşÑ'†„Ñ)qNsyĠòÙï_ ĉ-‹!ÒÂ>ċ–ĤéǘEÚ!8ß!z¤k/úwlÛ ĞÓçĴÎP͖DmÂàŒn¤šÏxüì#Ž–£V‹yJ?ê&ŒN?Ï(,jö]0Ħb$ş–~¸äÍÛÏXßĵdš ÓĜàú–èxG˜\Îääûö]‘”È6!tn\Bˆc.‘>ŝ‡—­T…HİqS„E ”FI•MŞ-1¤â]Áƒw)Ĥ4l6m.” k’•ħ İĈl­ĊÈÀè'êşfğ¨Ş|ÒSï ʲbô-ÓÔrt<§mzbÔt]‹6V›äˆĊ„Î:šŜct6Ġ!'orÉĜ\)Ë0L9CZKï&íƒgf feÁn³Ëùr’¨‹šÁ÷1` ‰²–$>ŒÒ¸ab³Ŝ!ŭÄ|ħ˘iR´•`|œ˜|OQ™Z[™8D~]eŒx˜—3DH<äÉyĵ% †i¤²Vˆ>“Ò¢Ĵ4Ĉ*”–0IBL*Â5QXĞéş B+ĴI‹Û0MÉy-xĤÖ1„¤HiÊB&ž{ ¸1âĵG봋ávb@ ‡Ï•̘²ÊIà>w‡M 2§./ĉöÌf—aq;ʋç$R‰İ€K‘S_âžAbŸ:¨C#АŒ}$Dï ‘lĵžŠw‰Ê…€PĤCIh)2̅)ûO¤™2—!Ÿşġ(!2ÜEZĜ$(‹RmJÚĥ!ƒ‚) ×W‘›Í§4ŝĊ˜Í¸“a™|Ÿge‰V頌ħCĊüÔPċŒċ˜Ÿ½G3Yڋ†1x&'ħ£²0U‰’š g„™¤cô0µş²Lğ‰qs ş@È™† v›×¸a‹ÖÇiñéĤì ăŝ>S& $§°7# Äyç[Ĝ ‘Ï˙oâŸüV¤c ’¨ˆ!Zì#c6ŝÙ XCú˙”‘½oŭŠ=9o ²_pJéĜÇĜ¤ÇSއÖ$JTôxĠÓ÷“sTeĈ1Ħ‘Jg|.aĤÎ ĈhÂâbÁĜ€M (™p]e !jş]Ä ĈâǎQ9p]?ħ˜ÏÑĊç"†èS˘ċ8&qJĴQUçC?৑ÙâŒ1´<ÇDOQè(éú‘h J) L¸ÑQ`•ÂHE?ueINUAèœóˆ,(ñ£Çj‹6nì(* àbÄ ‹P%ĥ\Ĥ Te‰&#„Íä}¤*k´´ô]ƒRİV—)ß.ĈĦK0KN°ĊŒà’½c‘(UĈ̏­2÷60Ž#RxŠÊâƒFè9ÁŒ“MžYݨ‹œ@šš]Ğ1fAZ„Œ™Ĉ—:W7IĉG+şŬŽĤi¨K) ü(i{‡ô ûµZƒˆŒŭ@ï:ê˘ĤŞç4딢0ÉÎ2uĝ6g_jܨˆ“JםÉ43ßáI×ĞáS•Ž˘˘Š”˜Ò"uÁ8ù4ċŽ(B¨wċ‰ÁàFÉèaˆ0FBdM§”Š)xŒ€B›ÜÁz¤²8'ĈˆÒɽ-„ˆˆ„8ĉ×J%ĉ0hS,h”xbòÀ!”dEÂAt¸§1í`3?2MĤAI˘´8FŒŞĊŠÂœ`ÔbI7DQĊ˜îi‘#cÖ­ÀGŞÂBñ#LÀz½ëv`ĤJĈÖĦKĈǖĤ½ÄZ…óĥğm³FDËäRèkĞŬ舲-G´LkİaV[ÊrIUÖı ö%^Ŭß瘸Uí½Î½÷{´ĊĜuŭ0}‚8~Ìâœ+ŞğÂÇÜîï•JâÀ›Lŭ“I;›C„Ò­áz™ÈCl}ÚB§­ĵ7ÙÓĞF/q]¤kCY ´İPÚÓ -PàcAÓ¤¨*[ä%ĤÖ¸()Ğc\çr†Ô%“÷x7PX‰)$S·F+5Û]ÇċşA–%Ġb‰Ñ1\²k×x'˘ÂK×Oô}˘7-êM{ƒwž²TĤaq§ŸF&_`BE0e!ŠĈ QK­"$MI[´.Ó²!Ĥ(÷ĥSd³m)+‰Ö%AF”4xèú-óùğ.p}µfQÍY.-B—)ÚÊ;êrIv1/^g CëÙĥïG‹‚ޘÓv[ĥ7-ËEÉüĝ ½ï‡Ê9B+ŻßÑìêyÉĵZ2Œži° S*NS ĞcŞıÌ~#Ó¸ÁıİgHYáCÁ0Œ½@Ȃ˘:(kâtC×7„qÂğmÏÙlRŞì£1Œ[œïPÊ ¨Xß8ĴSĠ%ŭ°ezAô#e}Dß'!•2‚˘:b5?bMĥz€óBğ$ì‘Ŭ ‰£ĉdù„ġuGß{´Y+’§‰8ï(ì)l*ÄA!ĴDɈ‹žĥë1ĥH~Á$ ~L!CTƒšè÷‡P ›@WâHdDĞH}2ŝħ£×\l[ĴyšT³"·¸>eBNŠŬf¤š×DYħ]÷”Ċè’Ív“ œ›˜Ĉ–Yİ™Ï-!Fşq‡İ*„ˆô}‡k%!:¤‘¨Òrı]#ċxuĈûï˙œ£çHf(ħÀT'ÄbĊ„ Ĉì‹Ú^ĵ4 ÑœÍñĦáêíW|ùù§lżü#JÏ8yĝß8=ûóċ{,Ċ1m“&¨ĊBĥ$‚ŭ†²òTzÄhVŠatH9g5‹£ĵ=bŬĤ¨½YQÔ1ġkp•µHi§ˆ”ĥʍ Ö Ѳĵġ:W*A4Fë"cÏ9öNúirÎ9Ÿ:èż?ez’ԁÛž ŸsĊ„Ê *‘;èLÄÏ Ħ}2÷­ËÙí)DÈyjùÏb˜4—— /żÜš³Óž½wĈ|yÊ0êzĈċÍÀ˙–ĥY,ĉœ?^rú`ŽóŻßĥĵz}E×K%mïğ­Fĉä'Ϟ?bœÎLaĈë7 W—Ÿ3MŽĤŬPÏ%÷ósŜ˙à)[ßċWŻıxûŽÂ<~zÌÑñĥ8ÂښàëŬÀ‹_ĊzŬÑĥ=eQ°:Y°<szşdĥĴÙn× Qóú›kúê5DÍ£§ç<~ôeŬô´äíë+.^ŻİkÉûϏYԆ) y ™‚d³›¸XoXw#OŸ³Âqt4cYY³%Ö BhSĴY°xYòn×rùö ĥ*99>áĴ(˜×–ÑM(‹j²çċ7 Ín‹)g<~ş b˜|àĠ—Żyûĉ-Jxž=İyöä eÒ4< ğ¤Äe:¸N˜8À…EIMYÔŻNxpv΃ÓsDœ!Dĉ„A,"14É:„O ÄÒZšŬ uİZPz†4K¤:BÈóú1³Ù9JÖD/°F˘ĊÀĜĵċċ‹˙E_²Ŭ¤41Ó „´4m¤ĴÎ9}SŞĊŞÒ0Ħp!bMiÚcۀHÎzB§h‘'½†Â9Ÿħċx€gb I–iÇRŞœWê°Ö½w݃ŝñ-SĈ5ÜâHqżÑTÉ@•ğëŭ×âFĈw]Èb ‰^QĊC´PŠıħtNù——üë/·Ϟ:ŠÙ§§ Ò,ĝâĞßñ˽f·…ċ²ċŸ(9}ôvĵ|ġ5żüĠ;Ŝ] Šĵ =ŒC²=;XÌÜ4üú7_óͅ`’;ŽNo˙ŭyzĤj‰ó#_|ñŽßüë5_Y,&~ö ÇçħĊSĠl7xñŠß}ú†ËËÈ`BhRóñO>ùğg?<ÁHÇĥıàŬ›†Oğá⠌Ĉ´ùü ‹ÒÏ?À“çaŞ/^}Ê矞<ë(—9üi\ÙËß|ċğ S <Ġ%şJrô0— żú·oxġl•Ŝš…ùŞŠĉËSĥ½çĊמiĜvŬñ?Á²^oĝĠ/˙ÀËWÉO'O"ÓşbÓóoż}ËŻÓsĥÌ˙pÍr˙Ï˙ĝ˜çVÌŞ‘ !k67˙öï_òâËÈċŽVô#ê?([§ü·Ï¸äó-ZI6­çƒp~BkÇÍÍ5_~ŬòġWžzŜûOÇ×//xñÙüá·-](ŠHہ­=ŞxÇÑécšFò›Žß:ü˙ĵ½ÙŽdWšf·öpF›Í|v9‚dV2³²ŞĞJŬ­]KĠŜ²^C@B£Ñ5ä@2IF0fŸm6;ӞtqÌ=‚ÙĠ’  ò‚@ f ómûü˙÷­ĊphLŽÊ USp3-xóêšwo+.Żkœ÷XIĵĤ?X29HyŝĊSċ{˜]fĝġÇs~û‡58š×|Ùd<ûâ$³Tà‡WçümÑ!  Ŭ|ˆÖY;вqĵ}Ċ·?ÜpµjÙ^µ~Âá@ħ7Ìyòp̳§GdY‚7 V(ó†o_ÏĝᏆ4ƒŭŭ _|uÂώ¨mB?ŽĦÇbyĊ7żŸru O_HOFTÖóŝüœW?^óñ£c2‚Aßc|Š–žHYB(Hµ"¨´ÚítRQd"CE˘­Û›’byÍԂ3šàÛ1a£ÀïŞï!xœhÑmzË£•bğž’hGħ]²š_³]]£˜‘ĈOö3‚ÍbJU:F½.Y..ŝÈğïŝ3ĝKêâš$j}Œb\ÄĤtÈ“=êÁ‘•à5MUÑğŠġíMµFÉ."ò;{Ŝħw>}„ü,ıñYŠŽ[ŭ9ż|7qÎ9¤üYX!qßıKoÜżXÄ'EÔ;×mÍU´ÀOäĞOo0üéW?7qH RD4.qZòq.Hu]°³áìù)!é³ÜZ~ú¸àòÊEàäİC%#dX3_BQÀh’Ò •Ç×DĜÒëíYŻ Ë%,ւÊn×'§SŽÓIğ˜ċšËù9×óÀҀĴĦĦCċZMûf^ñĝéû9›m`0éQqÎùĊ”wog|˙Ħżê}E°O–%Ċ[ĥH’.'1EĠ°˜ÍıžÎxùvĈ_üŞ ï ™ìíóÇïŻxù“áÙs<ŝ {Ŝ}üÈË׆N†ûÇ ĈcÒdƒ33hÙ.ŸŠ-”•"ë F)Ea‘Ş!’ )cƒƒá çï=’Ú&$iÎş(y ÖÁوÉÑcĥ›5³ġ ç7°Ĝ(Žì“ċ=gçlʚ×ï,ûwt²œ$Íħ!Á‡”mQóñ<0]HTĞ2py[ò´¤hĵ $"°X5l ÁbĤñĝpÔ’ñĝ€,ÏYݧĴ–PU‚ŞÒT•`ğġĵzuÍwżŻİJ8=ɘì İ͆˘Z„ĈXACÂġÍĥMİq<ĉvZñòċ ˙ôßĉÜÌàä½J%”EÁíŞâba(Ŭ+DÔc²7!ÎğŜáD;Ĥz÷ħ ¨·?>!N:¸ĈQUŠĈCšFÄÉë$Mm>Ä9B)6b V*=éÓyóö–ùşàĉvMm ½aŸŭƒ.U1Öqğ2ĵż4ĴJAó7kÒŝ’§/žTŽŽŜG,–ŸŜÂÍRptĤ˘Ïj½à‡——ÜÜĥ­ş½ŭ”Áĝ Ğus5ƒn·…eOm+ÒT`%&MP$E͇bÊíe‰àGÌ.ŞbMˆÁcwİ'ĝÜ..…GK‡÷[:İ *W˜Ş@K8št9xxJ·3¤XĠ\]ÜbË y@Ô¸ú Şkœ9G™9ZÄmrL‚–\k†Ŭ”~·‡V1UQR9IıŬK+Ó¸r…L#„nbZiìn᧤şOo|ħğ;´?÷iŜu9v-YċİŠ“¨Ñ&áŭĝ.tWTa÷&”Pw-šûÌċ'Ŝ÷ñşOüٝ éOH^÷µ)Û92ŽÊ´†ñAŽġËé‚M@gĵ˙Žëù–¤§éĊ)ÓÛ ÎûxSP[‡ġu=áèÁ3şyŒ[l³doo²£¸Eè:]èDš›•ċêv 2H³µˍ!¤œä²Àé>Iw/+Ŝžßż›²] üê˜Ż^|EÜÓK8?żâŸŝñ[Ŝòĉí-GĜ?è)ÍzUPUpp7÷+ŽŽ™.f|ó‡ßóŬf̗žùü–³3úòÓë ßŝqËċÇKĉÓ AĤÌ:_œàÑS„¨1ÍéDhŬ4aÔowżúĞ_üÙS\ĜàŬo—œŽÙHDÄĉɖjóžĞ[χw+â >ß<~ĜáôôäycÚE”0šh~ŭ—ÉáÉ7³s^żûžo~ûĠӒƒƒ h,,·ëáìaŝä—7WlĞ@c%ñÙ@K¤ĴĜ–3ìn·*WW ŠÊ1Qg2ò•². ëMÍbU£´â—ż:‹O8}xaùÍ+òÜ£Óc:΀ AFEáıUXGËßSıŬ;5ŭ=÷³S,ŠXGq„ŝ·—î@Áß!$Üé\‚o׈ïRDİ Â!T+b n÷˘júğJê]8>ìì wÍ\ñ™5)pBá$ô÷"N>áòê’ĊfÖÖd‘äb:£409Ŝc;d[‡ŒSdĤċĥ&1$™f29eoĵO'ӄcëváy=›STf÷{YÂlsĊítÍlŬ°­-—×kfİê1èışĵâzĥ!ÎFxQRš\OĦ›F<|ò‚£³ÇÔf†Žj=ħ\0NY­<óÙ uQaš†Ĥ2`ŻĦ×IöŠ*`š‚ċò}KQĴb2äÙ£#>âörÍżŭŽŝä€étÁh”›ßü5‡C.?üŽHŬ2îvÁ4¸Ĥ"4Ĥċ˜7í%ƒîD>=:iÀ6‘œìï3Ŭ[s{³àŸŝ땳^N s|ñ$şËbşÄOšE$I[ıî÷S&“¨>óu‚”PTž˘*@JTœÒ4–éí ë?E&{œ__óúí5Ϟ]2îï˜>jcˆI/€ĥÌÎ/ŻOĈ佝AŸÊÍÚH'Ù~ ÔM[ Ê ˘†Nžr¨GH½ÁR²Ĝ.)ê%Ŭ>Ȩí<uĊlıb:/È:ŠŻ>ɋC†£Zġ œĞıÍX./>pö1q֒Ҕ„AżG·ë)Ş ß˙ŭÁß§ş½ J­@&DQ‡$ ˆPcʲíèk˘:=E4f4™ëN¸|A˘ßÁN—ÄJKœ-ÚÙ1Š'ŸgCŜ½yËôvċÇ<r¸së)’,gráU ’wÎùá§7 G§û<}ñ˜ŝ¸§&H²˜ 4.Nİ뀍#Ĉ'OùġŻ˙šÉd)4Q$‘ŞÍk+%wZ(ğ޵çšOOÜRµE°ğq§ohÌİjl³À˜˜ġJ`\†óû¨èˆŻĠŠ?—“‡ EۂŜµeB[—iqŽBÓ81(Ä ë*E„PšjS‘¤ĦĈUhUÓĜ-Î5w§8mkÍï•Óı!Ërşƒ qkYkfóâ17Ókúƒœ_ŭ>ĵżAjA”jÖÛ%^:táÌĤŽ÷o>°˜oiš%YV2ÇĜñˆ~wÈz¸ĵj3ˏÎ^P”žëéŒĠÎÎ&üöw˙™ċ*ĉ7˙󯸺^ħXgï0Aİ··+7¤9L&9Y·‹ÎËbŽ[ĠL{<:;ċ‡ïŜóñŭ†ùÁĠŬdH$t0ۆ?}À•5çWL?.èEp²7d´OSLÑiÌÙQĈ£ÉĊç›ß"î_PT%żüú)“½ÓÜ"ŭš\+:2˘ †xŠĠ–z ĊĈóê‡W”U…ĵ[ó4Ñ>Y¤ 6I#Ύ&\]ŻywQ²­J¤„żä—_ŝŠ Vl6Ò8Á”[‚sžĠtÁ:_Pn×ĜmıqìHR%)Ûí’ë› eŬnŝÓŜ!/_ŝÄvĜĥ "Dœâ´!D­ş=ÉÁÁ„ş)y÷aÍÛ·ïÙß?,`ħh¸ıTu›Lè;ôzŻë’7ï>r~uÁóËgŽé%½˜8Ú-w¤@ĥàAë(Š’élÍÍ5t2Íŝñ„,·;i6¤é³³1'ïşĴWV‹ÛHyމ5L†]ŽO÷xùòûĉ–A˙|ŭĞż#ï [I°Xß:4Ğ4 Bnħ^bĴîL›˘=|ëuĊj>ĊT@îÎ`ŠŠÒoXÎ7\Ÿ7(Ÿpt°O– ÙŽĝx1çĠŻxŝ¨n×ìnê)6”\\]r=›ñúí5ûû1_<ċÁcL3cħ™ÑÉj¤ĥÔĥA¤–ڴ̈Ĉä''ôöŽQ²]cˆĝŜÇçœÇğ6z+>—JŞͰ (ePŞĈúċúšx°"Gt³ŭŻH‡Ïİô{Çöj:Y Ë ×W5ee*Ĉz1µ X§"˘ )½xLÚ9$„ );dİĈKOŜ”ó×\]Ĉû5Y䈵ĦÁ °HÁpĽµ>„]½>üÉŻ˙{ƒB9çŸí€ĉsçĊÏôíğŠjPv`Ä6v„ >céˆönߘżçó:áwħ˘ĥ´à|ûk7·+ŞĈƒˆñŜËĞŒĞ钲*ٖ ·×†É^,KİmÍz]³.6„ :Ĥ“&H›Ŭë78˙ŽĊj‹àAÊ˙ñŸFíè%ŠvsA–$ ş9Óٔjëi…š£ˆGӘ·Ä‰"IR<šíÖ²\•8 QŞIóˆĴ+èT$JJ:Y—nÖ'– ÁEH‘É;hqġá˙ë?3ôX­·ĴWgC~ŭĠ×<<>ĉúâ_Bp0Êyô`DŬĵ|_ÒĴK>Ċ/NbÎzuM/ä^ÓlK:IŠŽ2Rë(ÊÚ3Ÿ­YĴ˙€ žíÊ-ìONèŒF8ïȳÇ#Ž÷ÖLg lmédG1ƒ4gSĴ &`}ƒ¨qhóÏ7ï§4KÇ|qĊÇëdNŽ>:Á‹u–óĞ‚çŭ„‡§Ï͓c>~Ċ‡×7Ĝżú ’^Ĉ‡é!Íİ­gĥ0|ŭ—}ħ*Żĝĉğ5ŭŝG=ü‹…áÙV*Ĵsúx@<çjnĈ]s~9çáC~= ?ÌÈ:{DIÄbÖ·é’ĠÚQ֐wq,lˆt ijBPd™˘×‰‰eËĥN¤#ŽT p‹Àó'ˆDĊííĵùŝ’ƒñ-Bt)+˜.-ÛZ’Ĉğr—k¨ë‚²nAHRÁbéyŭÓ>ğd{;çöjJ$ao’’$ °ĉÓSÁd¤ÙŸ H˘œÓ³Û9‹™eğÙ˘şşeĤxCmjV[X ˘Š*P‰'ÊT;{•İ!`hŞ-4‹ö1ßÖË ^żü†ë‹s$š4IR'D LÚŬ8Th‘¨ĵLÜħÛJğ­5ĊÚ Î(Ş—WTMĊh¸OÚɈ’ˆAĜ%’9Ŝ.iì–ċĥdşée Z >Á:uŠ$Ŝ#¨Œ|½ç8×CĊ}tĴŠ9°ĜÎıı}G˘-Rz”`ŜĠx×`M…kÌ}ÈáΧéC‹L¸;ûĵżKŬÙî§"I’ş&iĴĝ|Žò‰ôëŭŬi–sĜ,ˆó-G9Q˘A‰%A*˰³·×áŭıçâòÈ ï*ö÷÷é÷s’D 5ĝ4†à=-Œ$¸kŒipdë—TÛ,y ½ND˘Ûúp7I4Ö0ŸNY- JBžu9>: Òï[#ù ßáèpÂċµ P’eOž1Ä8ż&֖T ÜĤÂԎĵ“’Fš~ž!| ÜĈ’˘bı¸ċéħT”›5½l@'N˜—kĥË5ĥjÈâÛÔ\œŸ3›ÒíG zCĴĞۆ™ƒíÚòú‡ïiŒ£Ş=yNŝözLŜMq8֛‚Ù|…5P–Ÿ^ŝ„³ċô4•çúvÎqš“tû8/‚öĉ”ÁáÁ€§OĜŜqs˘­ö&”ħ'KR]0Žèw†ìOÖüôòœŞ \L}Iž*ž=L÷ˆdJSMÁgÄŞC˘şD*%V­ YŠÀ ×Ċı5Eı!H‰3)1ÊA,=:XbÑ2›ƒ)éhĊ“Ž?½lx÷ò29!‰£ƒP–N·C”+Ş:°­I–Ċ°XyÎß]`›’ÈxâNŸ'|ŭġ{û˘,£ĥŽùt‹–§°^\sSYêrI/ĵçâ|†>ë1ÙÛC(¨MI‚ĈzɃA`ı4üôÓÉÇÑaŸĵÛĊÔ7˜ş&’žÜnR#|`ŭñŝöu[“ßĞ:yÌÑɘH;\¨ˆcĠÊœEëçvhĜ{1B¸ğÖáƒĴĥdyԞ eIG*:‘fÜ;"‰Ż16ĊË!4„Pħm*†ĝĞ˙ĝż\A¤v§ˆ”(•ĥ1=•Ç=Ê&GÇ1ĥ.‰tÌ(ġÌÏ_ñöĠï¨ë&lŬ p¤™Â‹‡E$1•µè¤-9S£u‚TctÔ>A(ĠâU…P÷•~‚@iİA-ğċˆVâOòqws˜ğħĝrïӒo×. ìÀëáŽïƒßĠ­wSè ÚEĈâD[ !BÉĴ•Éêˆ,‹èöpu1gğDZpzüˆÁ G â¤%˜cJp>ǐw"úê+ŽOŽljNšµvïjŞrƒ1­Ya0ÊĜ7}"ïßĵgğ^Plj:3$[—80ġSoéf ƒnF¤ÖT…a9Ÿ1™Ä-Aςñ ea(ĥ%MĠn™“XaĴev{ Àéq‡/ÄZËëŸŜ2›ŻXŻ\\~ ‰sSµÀ¤Xq¸żO§Û.²28=Ù'Ï5‹é )+T8%iê ë֔Ġ†à=ŬŽĉùó3žxŠk‚èóèÁéJŞÍ-Sލċê|É|Z"&Ë3–‹ï?|äüü€§ùMH³”(†nOqp<Úmë NÎĵżäûËıċí›sö&&{Ĵİ05-ÁLFÄ:&Ú…•oĊ˘"‡ÔA ƒ&Ĝ„f¨ĥáÛO7oÁÀvUSläyÄÑŜ>?üá’o݉ğm-8H´d TÄ Û2ĈŒÇ#ŽLÈó”şj¸ĵžruğf³…êŬ–ŞúgÊ­a:k¨ëvdz˜œžġÙ]€iL Ò09Œ9}p@QĠÌg7\]­™Œ.Ĝ›tȒƒ&Š2²,†ĤFùĵJh”Ó0xí ÂĥÁG†XY"ĦpĤ$8ƒŒbìnt)vOÔâ.rG+{ E ²K˘´­bşñŠÈ_"šwÄ"†-Zz\ì‰dM% úǸ`‰uB DÔ²ĉƒFȨċkC$·x× ƒDÉ-Ğò=Ò\1ì+*ШEeô2´¨RiÛ'ú8ĤıÎɝĊ> dĜÍĠ´Ö;ƒ’F [X[Ë.Ŝ[Kú3Ü ċ琐û1ÇgV ı }oÜqvÄħÂ§=”Û9~7|-ċˋöQÂïhìuu÷5 #Ç`˜EöÍ)fœqxxB5µ)q޲ÀyI1ei¨ĞVóG Ñİ2Œ6-¨ĥE1íˌcĊx2 ßïîÍk*²áŭÇßż:gı•=<"ëiœbşâċ›×t'Y(ŒaSĉ[èwOżz̃³#·&M ½j‚mˆ£o`5ó$Zħ?àœ$è@œ%r–ë‚ëË9uġ€DqĥÜYu<ĈÖH ဣ}Ŝ3.Α´·s%yš%Éh´G'2ìÍ^òòĠ ³İeğ]2Žhê)@é€÷ RBĥ[z…áġë÷<82÷Ùn ³ f7% #òĴ ! ¤'Ž[ ž³5Y’st0âôô†ùşĤòSŽ$$ħ&4ĥn£-{şÍk ûˆ_ŭKúƒç^2çDQF§£ÀCm-ÛÂP– cH“h—Ŝ@“K]7\^.xñ|%c”Š0M›¤:>žĠW_³ÚÌı¸¸a6óĵ{{ͳG§Œ#êá}íOĞrOúd “ĦµÀ¨Ö[Òēä İ<ĥħgv„Â;J ˙9qP´p HżA8Ó*ĈĴdyÛÖĠÄ·,ë˙*kċÒ;Ğ|;jpÑ6j= î˜.^Ŝ+פŒ‰TBU´heİêK6‹ħö=.Jú{[·§v÷$߂[îŝ31ògŜ‰n·sxkŬŽP˙gqü÷nöŸÏ˘Ċϐ|?ЍûéyŽxÁ˙Ĵöy÷†Ċîƒ*DÀچĠj³DE”XF”ÁPöµÇ9ÍßŭíŬnÎruAQÍi,l ƒ55I’îúġ°Ŝ8>||ż̔{Ö5g§ÇŻ´l?}Öú½œ£ƒ~ĝñ5ĥ ìŸ 9Ú?hFĤÂ5P=MıfĜÏġ; şŠĞKÇĞï/H"8><@+ÉùÇ[>_°Ŭ4œuxĝĝnNU¤YŒ£ÄXG”(&ûCŽO÷ùéM‡Ë‹óċ/4½ĥĞ[–ۚޖUƒħmñĤ,J²&Ï{¤˘ĈĴׄF"Ò™d8"B’Ò(ĊíÒòúGB˘¨ê„%½LÒËĈûԍäíĊŜŬXâN—÷ŝ=:É Z1˙Ŭo9żYp4›ñìù)^N^b8%ȇ£!eí(ŞkVċŠ^–àĴĊ:XÌfS3ŝú/˙Ħ"|¨İ›‚çï(~|ÇjÑŜPuè ċŞ-G ˆhEÒÍyôì)Uóŭß"h\^(˘ĴKSLyóîœĞĞš½Éu%˜-+ĥe q+I’ˆ²N( * ”ĥ@%{ŒŒöSĉ?UüjŜŜKŽNÉ;Ü\Ïĝĉğ·\Ŝ@żûGnjöĈĴ×kŒ·Ä9$A”&äŭ‡'ĵĝŞäwßeYÔuËw2 cM°ŠĈµ1ğ¨#@KŒ‡LJ†ÇÇ}œŸÓÉ$ۍoAeNRnj³‚íöcNOÏ8<8-Mċışâ‡Ŝp}UħX.9²§Hħ-hiĈdoB§—òìÙŝû÷œŸ{Ŝĵŝ@Ż“ékjŞŞ Wíh !C{áğK—´ X[4HÑğä•Tq+  ġ{~òA~Ê + ‘nĠa!ìĈ„&P–ËĊ½G&ŭÖĴEÒŜuD![U¸+Ċ‰–w„l_+ áMéAĦtÀù›!#Ó²µˆÁcï“;BhÁgüQˆŸ‹‚Ĥi áϵ$Üù|îĉÇğƒùntŜF|:hïÎôq‚ŬĈÓï‰x;ŝ—of‰o™Ì;c…"¨Ñ"íɲ†É$áĝ¨C]npFħżŸE5EqMšÖìíÑÎÜ!Z‘£V°ŜXŜ}ÏċĠ Ĉ­pa2JٟLˆU! Ë ÛmÁq’rx0d’¸§9;3êĈ`6HW‘Gjv‹t£nÂóLJÄâ–ùĵáğyϛî%RJĉ³ ï£ñ€Ż~ñ„³'䝘ġ|¨Ñé(ë[ŠJ!Ԇ(1T.o ngWLöÇç°ĈáɐşçXkYĴĤÄŭ½4jéqÓ:“ŬɰZw AK.†Í?˙‘ß½Á˜šX=ĝòÙYÖg³(ùxs‹öbĈ“RkúRp}ğĉġOß3ÙÓîĦ#GżÇ˜ËuŒu+<BzlÓ`Ššċ˘äò-Ûžœ)ž<9"Ë2„Ĵı^S–Wh›•áöò#ë!12’ŞfƒóƒaÎdż‹úĥÛAŬ”ċ†Ğ›[ŝÛ?^r{}KŻûY")ŠV2ÜÀ‹/Ž9<: nšöçZ9\(Hr8<òhµÇĤüÀġuàwßÜòòġ)$Ğ•eµĴé àù‹Nœà„aşĵfžaBK˜³˘}MY?c|0 óAħĴ,µƒÚTvCekĴw¸Ş&“ … ŽÚAi<ëâ–Q“ÒÏi¨Ö5IĴ‘Dl+nÎçl–Ë/3^<}ÀéÉ1eU³Ŭ48ğà‚²òL3֛Bë tÎcM…5Q$yöì!ç/yûÒí·W z?:Aé.ÎX\Ô şÒĜ š [ĉ‡ m•çwrqSÒ˙ŒƒÍŠvw ´[‰š$÷ĝˆ Î/ïıN8„÷xJ´OáċĥS)dЧB„Dïċ²qÈŞ• %ŠšD˜v4ÖiTHP.ĞZ4°!j­2ŸÌš˙ŞíüP1Ŝïx/ż˙ñüËßü[;ôç·âğÊöòÊïÌÁa·8ĵë°·^?½Ú{Èŭì:¸ħ+A ˘o8ž§ß‡,ġDzMž5ìïGh™­$Ï„˜ü‚½1Ô5đ'ĝ)Ñ(Q“Ċ`³€˘dğŜRĠ­yĜt-) ŽÀU¤ô:ŠD9´4Œ†1/žäYÌÓ>{cÉbĥ"O+NŽ`<,nÈâ†Ñ@óËŻNyp<ĉğo_ryUħœµ‡o˘áèô„çϟpx2ÀÛ%³é ÓĴ$› Ž8*ñaFŜ1œœÄ\\@ÚħWÒ4)ÑQʰÛg<Ŝ0Áà "ÉÁ—TUK ÓÁ£¤ ĥ’ˆŞ)ÊqpsşŬ t‚ÖŽş„Ê@µüäĈTÜÎŻİꊈGnŽ”½Ìpz (Ê@µ^2ğú‰^֐E“>ô{X–˜âφ8ñ¤Z =DҁĞ褞G‡pv‘FĤš$Ù0™NŽa6 ¸f‰İäiàì$a[ÖD²ÁT3‚­‰´`2Šxô°Ïze‘ÊïFÈMaġĈbJ(WpxĜé³Sž>?$%ĞġŒNĉxòH&Š4!,ÈS£‡’Èö͔ëkËjUĥ£ ‡‡ĊWyŝôYOQ–W”ġ Z— FĤ†şYPlĈ´_^''=dR"˘Š½½!7”ġ ¤tÔ͚ÚH’Ô0š@·ïŞÀU†(4…%l+$´°ÈĤ¤£-Gc8+ö† ‰œa(ÈcϨ[qş•…(4¸jEŞ<ǓrmpĠ݇£Œ§g#êù5ĤtĴ§×ˆ“}ò<ĦöÈz72h›>ìT]ĦĊ6i"Tᨕ#M$J‚sĦü§äƒŸ•Ô>iíxĦeRkï… Ž€mÒÙÊw˜O)îš|ğĥß}ĞoNjÇ#‡k*4%"İ[ŸCŒ3 Ú§H!Dy… éÒ ŝöLŞÙlfqÛöàü7>œ -$ŸÍš[§ÜMÀšÖžŬšSbÒËÙn:N0ŜQÛ5QT1èĈLzo6N4ùß3É˘54söG–˙£äŬ‚‹Ëß')Ïżì ´ ÓÁ°aħúĦ"<œp}]Ċ¨ÊÒÓÉûdɀѐN7YP5sLµE„†/žu9;ŽIӔ$Z")éu<_ĵè2ìñ!b—4Ġ-"TàuuCż/ĝÍŻèL:ŒE[\½Ħ !H´ˆxŞċ[zr™ñĊ£!§Gc˘´ƒ‚²Z CEžHNÈ3€šÒëxx6ápÒZŸċ£ü U5Çú’ŭĦdÔ<>LÉ(èvRN'Iê0´òhĠÎóÏÑR2ꌐâ’Ċê‚ÜKtqzc͈ëĞ9“ID7oȲùġ)‹ù‚NWÈ i ^iҔ$< *U³dܳ`܉ĝw_ñìÄP`jE–ĉŒFCGè¨ayó)áù îTQ–%YTR­/h̚½AÌÙáSŸŽxûĉk=ZGxètRžżx†Ržùòœ=ĴIÉôGK$Š^&pÍg'#ĵ?àà¨äĝ†‡öġ<Ûù’,ò$ħĈzCݟóáĥtû#NR”-Pu 2’ Í8K‰dD5HÑ/úl˒“}Í [aÊ|U1èôyxˆCŽó†$Ót£š¸'ùċó‡“%GG]ñ–˘*ét{üĠ—‡÷`½\°7ÈI¨ˆ½ÄaÁŜßx[‘ğ'^·nĴŠ ¨êİqš£#7)[îÏèOŝH!ÚƒŬŭ#RĜς½ı?ÈES(âÎeúi<şël܏L“yµ"§ b'ĉ ßxêàQŒ:T›2D‡€ö\àO\ï?ğ5˙?`6ŞożŭÖŝŭß˙½ĝs8ô˙Ġ÷ íúHîì6¸ŬL ‰T„Rw ò¨}4ħ°]WTEğᎵ¤7LĈ¤‰Äû nt2†ŭeĠ0½™ĦÑħ'™äŒ:/‘Ÿš-ŬĴÏñžFġèöé)Ê9Ĉ­ˆ£@, ÍÉĝ„ •ħ”fAħ]bĴ?ÌħD‰ŠŞ)‰£GÇ I|ÒĦ-e½ĊOmZםĉh™ħ^•dIE„’EûC ¤,ˆuM g=œxBlANJl"ٝáœßj€˘,FXIÓl9Ŝïsxĝ€µ]İ-JU¸ÈâLƒòÄŠDkLı%ÍclLú]„ìà¤BJ” ħà+êêšÓ1<œ‰ˆô ]c%ŝIŽ÷ …D IDATOs[Âĉœ/N{<=ìbjOÓL  ‰!ŽZÍTĠXĴóDF{ŠÉŜ~ëÉ ï9:V›)IñëßàíES§k"e9žHì´O`´FĊtT—É“ÖhĴïä ÙÌèjG縋›D8'‘"AʨġĉħÂù-QVĦ#É8ïP•@Š”ÙÌHħhgPµcœ ÒG]²,%ŠZŸB“Ä6Û%IX! Œ3˨ɨƒsĊ‚*’(0ˆ r?ĉì¸ÉR“ċŠÚâE‰2†^> q–˘^rĥ7dÜ{‚ó‚AÇb ƒ°†Xyz™"‹ ‘ò z–Nš‚Œˆ´#7ğ!R Y,Ébúù¨‡YG?1X-‰s†šÁ8#ëd½"q†ÉÁ€³Ñcĥ뉨 U…Ĥ"D-Ċ|çni3ÎB ƒßħ³};NÍAˆ” Q²µ)ñـ@ŭÌWù™ħ µ³”˝'ñı×ÔöŽpqïĤôÎí~^viüN&îi›íùdip;™'’àñ]DN´Ş=oP^ }Ĝ½Ç˙WNÑżö÷òéÓ§2Š"Ğ!ü›8„ ŝ, -ŝ”u÷3ŬŭŸLd”PĜŬ6÷8Iî6ËdŠ’9J÷"F‹žN·…•Żĥ+"<ħŒ1ÎĞ’²)Ġš€˘ŸÇ¸jŬF¤’+ü îf'Ú"”A ‡T™UáQ8ê풢2DŭCÒ¤CU-Q&ÏZCFŜM@ Ĵ³GĝEгĥċ†mħFêöqĥĴ7$YBÔÙEŻ,ŭLÑTÖ4 ‘2è(Ċ­Ğİ][™7­rÈzzW‰Ċ£U†Ò’H%mb\kb™áĵ¤ĥ ‰°D”xİñ‰@{I$#T(• „ĈË+%‹pxÓà}EH„²4Îâ]C³› RéÖ>-îĵ€MĞS²ŬÖ[D“hµû³;ħĦ2ÑèD EçkW*GÎo$ÔN´àWalĦġ! œiÚ2Á 6´ŽHfHš]„ˢ‚vú4²@İòÓ&5*báP²­E™lÁ·ÒT ‹mJŽNäÉb‡”=ˆMEj„r”‹ëÖR˘ …Ż ‚(Ò¸r…/k’^‡qGà| U òi-ÊZ¤ġÔĞ $cżÛcħ\ĥ†ˆ#sž *֛­$Ȃî uò-·PÚ#•Ħ¨t:Ò*_ÓÉRŜz2éèġ#şı'ˆ-&ĤZĴpF0Ìğ¤iÂf½ÄùšA/eKĵ3ÄQÖêÁ| OSšÊ²Ŝ,I´&Q-ĜŸàIr‰İ-·&)ÖYĵ¤iB]74#ËZj\][’¤…k-ñŜâĵm…µ£T›œò­Z!‚°4gYŒum„Q*ħ7·Ş*'ĴÊbww÷Ħà6S˘0´é+ !²¨Ĝ£uĞ6ÓÒïü˙Zĝáî/­ġ½4VŜğUe4 4Şk˙ìKBh­ò?CƒüÉBósÓ! };ä!ܢb„XQۘM‘jA¤híVÇËċ !ƒÁ>Räl·kÊÊǚ(ë³ŬVHEYµsp ²HĦ#…Òc ÛíĦ%Bµ­(–di‡ífN]5˜Úħ-ĥdŭ”{BÉV#Ż£ë5•³DB"•DÉ!ŭާ %J†Ä™ Ò B%¸°"È=µQlËAn<•Ú[{ùRçħfƒ,Î*9`[ŠF ]Îzıeħ ìŸNXl<Ŝk&½ Ĝ’˘üżi{Ó'KŻûïs–gğk÷íîÙ3A€ € ÀE"-1ÔF)ĥb+ÖâħĜq’*çHâJT•TÉ΋䅪b;İ8ħİRċˆ‘b‰2ˆ„(EÄF 0˜ÌLŻw{ĥ³ċĊyîíž!ÈÈ´(ԝ™Ŝî}îy~çwżïÒޘX"³MY=8kqÖcnÏxúIJ›$à21ÚYĵiiÚ%Î 2=&M1]:ĵ+qĦœKİQi†÷ Ŝ51ı!$H‘Fi½´xJœ³5Q£HAĝ˜ğçÔ+.¨È ïŝC-֚ˆı­½ı‰R\#²z“Ó‘_ŠÜġàÁàƒ#x×Ċ‡Ċ|9!dyĉ 6 EVä×P›ş+˜2†W'c„´x”c‘U½#薠Ĉç´.i~!f†`ÁĞè7 ĵM„^Ĉ =á]¤Zù´£Ùµ?y”'—ÎĤ`ġá ÑıÌB&È4§%&i{)¤8âk8–ÎAH!‡!Dŝ"EĀ!TšöG1–ÌY”Èt€GáTNŬ´ÔŜ0Ÿ9¤–è'S™*Ú`‡dr@’&XÛblÜJŒ1 ‡ghZÛKŠÎ~ ’4!ĵ^’è ƒ@%š"ÏiË9Ŝ7 {CĴ‹JzBP‘2iŒ‡ÄdÈl„–Šş^"‹‚DHŒµh™VUı$ëûĊ” óV`d‚Ŝ°‡÷-$Z RO—ŜYZ/ÖÁÈ2lh´ XiH‹k-ËzJr]È†à ‘$XJ*ËpÁâ”Á9KcÀx½f}D(DDÇ· q2ĦžBġOcÚ+%V‚“+,f8ü½á "`Ä{BÂ{Żŝù˙ñ›î˙™~O;è<_[ƒVïFú;ŜŽ“ŠßmÂH‡[!;`´6şrmıŒC09u&JKû9ĈµÔuŭY½FkE’ ŞjIÛÔdyÖeñ%ŒGP}ĵ7XÛÒh-ğDmC’FHÀĜ€P•ˆ¨v²–T(RŠtÀ˘ĴX6K66û˜75I1àÒbŽ‚Ñxƒĥ6,— Á”VlnŽY,룎֊eı@KÁ°Èİf ”O!Ĵé!ŜdÁ+”˘dë|¨‡Ò u‚ï[° 8‰ò:fJAH,"iħÁĈ@ȐE6‚B l€Ö{\çGdˆm0S#%¨îè˘šàx×ÁTQQÍq\äĈ ÑùĴÄİ}<’jŠĴGkKœ+qŜÇdtĦcàpPI µU7ÊNâ|‡mŞzŬMâ@tißAAHÀGx, ²&ˆŠÚuËşNÙùöˆ.X—Îì^ž(b HÈsóñÄ"PxŻ;>,>˜xÀô)„,ŝY´Q#…À›}5Ŝq0Û§.k&£ Ĥ²ĝĈ3ŽY6 ­oİš„ WŠLjPŻ<£!ċrŽŞPRRLےĤ9ËeÓ´Â9‹µ-Yžàĵá`ápLkmc ‡XßÔs†!JDï\L‘ƒ*`P2ĦÈF()(Ğ¤Y5†ùь~oHš$xkhMĊx£GS/!˜M5Ñ‹dh•Ä Zkħ>&…ğ`#3DA'U/R’,a§5˜Öam$"gY†s޲\’Ĥ ٝÀ“DƒJñrµ~,×)]}Ìi šĵ7"ëm°ğW"Ò!^iĵ ñôü1{|œ,!~ˆBş²LÖâä ġ/^ ²òÑ?™qÂĥi z˙s—Uxĵ¸\Âx8/hMC=Wĵtċöµ›ä}Ͳ<äħÇ&(y睒í1½áA8‚µL§GEÁŝá”Û·oÓĥQÉŭ÷_ĉâ…û0-äŭ!J)ZSB‹ÖşKsÖH҈ı C5ƒĊFâ}AvĊN"}ÇÒâ¨hB‰L:İŻO>E†¨ÁaMoBáX);#§UéXLcQġĴSÌdUÓÒѝĊMçNH…Ò˘‹§‰ì$½B¤xÛ=e BƒË>Á{ NTċ@ĝˆ'+½ŽyHÒ,9íHƒnŭ<ĵ‹éŬR „jdà›(t’1ĦÙûUò|<5(77çÌş@ŻÄWÁ‡XGŒZ‰Êa½E+…VyŒU2&>eğ.şŬ][т$BSôúÌĞ9·Ž(úLĈܞ"Œâìİû8š–TĤfzx„N%ĈpÀFŜ'Ӟ´èñĉµ7£ÓF£Yo‚µ™‚LY7)¢¤-‰Ĥ*yçڌû/ŸĦ0m…$I‘(r½2Ù/˘†wX_sx¸ËÑŜİӜŜŜáüĊ3Œôç³e‹µ[§Ï°{0gıTlm]Ĥm— ËvÈ3Y” ööĜÚÚ&+†´m¤ŜĈT&:W>KZä4MÍl>eÏŽûÌç3Ĵñs8wˆM `z4Çĉĉ&áÙÈiSŠ#›0[Ä÷U'[l·V£BŽ ÑĜŒn8Nˆb9)$Y)ë’ĈŜĤn:ğql‚ŝœLèğÒV„hğîZhïß;Zt°@%"ڄvÜşĠîRj¤ˆ’ˈI ¤ŽÉǂH$÷MIŞt7èò]Z@‹”ĤöŜ'(•Ĉî‹@’÷xĉÙŻŝáÏ}ò“ \–|î³˙?û×~Žgżñ ~ċWŝ=ü˙Í/˙2Żĵù_ŝƒ?äík×xçĈ žüèÇĝÄ'>ÁíœA9ǰßGHŝgßâ7~ŭ×ù‘Ïü%êşáK_ù2?û³?Ët6çW˙§_ċÑGÁÙ³§x߃qĈuŝÉ?ù§äYÎġŝkxàž{öYġì³<üÔuĊ˙ĝ?ü*O}ü)67Ç\½ú£áóüì_ŝË<òÁâl`>2Ŝ|BY.ş qwĝA7 ï£;–i_|P‘˙Ù¨òÈñŠ€"xIŞ;Q…N²š"ä #V(޽ ‚·4ĈS˜ıšrGÖkŞ{]Îdì*ƒ—]Ñó8 Îz<".ˆh^ĥ˘O …q†à:uXˆ4zĠħ|„ˆAˆTIáAú$Z×ÒaËĜµĊ#Á#BÒyB$ĝ5D‚ ΁ġŽà=RĞî°.Â4.>ç8͍xşP÷–‚ĊXÖ×ĜÙ•iğ,Vn^Ż˜~í?#ħĈóöġÛ\yûU|èAzŭ üµ?µ’ŸŝÉsˆ¤Çġk×ùúŸ}£éJx>ġñó鏒à<×Ŭĉ‹_ü27oŜDkĊ§>ġ)|ˆ‚<+­€uŝamĜc] ­á…ç_çëÏ|ƒÏ˙¤äÑGCËçmw"ĤĴ˘]°1žeÙpóĉ/<û<×^yƒO>ġŸ-~”ŝ Ï;7ùż~ó XŸŭìOôWĈĉĉ?÷ׇà›Ï?RûŜ÷Ŝıs“?ŭÓoá|˜óç2B Ó.„uè´Ò:ïñĉġwxġĠ—y߃÷óĉ„·ßĉ­koòäSOqñÜ%nßÚċ˙ŭŻê+WH’Œ'?öqž|òIžwŜy›W_}W_}™k×Ŝäݏ”Ï˙ôOĦu ‰ $âœßÍL|´a•.£5-uh'xOK"6 2]rï“CÂ{ óê˙h”¤uw[|ŝE‡Ċ‹önâóĜĞf!ž'VĝŒşÄÛXĜuçıĴE¤Ïxh¤Ŭm ½lëÖòя|˜˙üï˙}šŞĉŝ·żÂ•WŻàږĞW^çíkorŝÂ\ıÂ'>ñI>öáò˙úK|ġéŻò·˙ż`8dëÔʲdQ.I҄$KY”Kú£!˙ÑòóüóÏókżök|ÛĈÖÖ÷]È/üÒ/°ıı‰sžÓ§O1›7ìîOñîW^½Â™³ç RñâKßáâ}—Iӌĵ7àG~ôsœ;w–+WÍ?ûS[żÍÖİSL&ÛB¤Œĝ²T ïâÑ˟ ™Ç£x„Öħab­›_›·Hâ#vÜċ¤Iq" 'D<5à]×éŠġϓRD£˘ÀÚĉäW†c)îĤ•ûz{żV1ŬÍĵì²ç‚Z½{ŽÍÁt?/Ĵ²(î0¨8Ğ„žĝläĦNÎnÌşŽÙ‚Y×ÑĈS‰D½ŠÓìHVñÚ ĴñAq=IĈĉDzš,é^Ch 2I‘Âuş‚ ˘àjġ:„ˆÖBD"ı}çÏ?÷=ĝ0meı}ë6ğ·÷ù‰û  oĵñ2ßyñÛ\~à";[;XÓÒĜ‚ä—_ĉíkosùòeF1[[;dYœeY÷>žĈBèĜ ]v ñìŸ>˗˙9ğ}Ž÷ß˙` Y0‘𜉄á ÏÑt”*R{#î;w™+/ĵÊw^~…<ô0ŜCšĉìñ…ßü-ĤÓ9eiĝ?_ò‘>ÉOŭôÏ`­á…^ ß/ĝĝ'>Áġë×ùÎKŻr߅û9w:9İŠkZJ…÷c,R(nĵ}“gżġm²,⅋ĵôâwxŝĊĝÈG?ŽDó'Ïü)˙ú‹żÇısyŝ÷³1Pd)Bĥ6·ĝ#šŭ]ŝĝžĉ½Ÿím–mMmÛ¸.ş;LĦ‘AĊż§óÛè|;‚Šá"2ÄÛĝ5û¤QÜIXcE­;ÉâB¸´|/M’›Uŝn_s"ö^#àğje”Ò}RjÍO·‡:aèżş˜[VÜĵz•ëݽĈrĥd˙Ĉ >ŝÄ|çÙç¸qċ ~ùżü\}ë-žŭÚ×yèçž|4"ħm^ş„ë(0išâœ£m[úŭ¨¤›N§<÷ÜsĵüòË4Mp8¤k^½Ê‹/½Ìh0d²ıÉİíÚşakc?Á·Ÿû6y–óÀÔ Y’RU5‰N8µsŠ­É6g?}ŽÙlÊŻ˙Ĉ˙ÎÛ7Ŝf´1&Éeµ$I5IYÎù‰ĝFÉuŠzı ŞK^{éŠ<ÇzKŻèsáÂy&œÙ¸7/ŜÇ'?ñŸúÔ'HS…iyÁû._â•+Wĝ½/ŝËċ>JÖÈPlr%7ßşÁ(׌ó‚fZâK™vw÷¸}û6I’°X”H)ÙŜŜ& Ù( ì˘"šžHiĤ5väyAĠ´ô{.^ĵÀùsçĝä'>Êp4b1ß'K4£~—>ÀÛoĈ‡{„ŭ̧£„säRĊTñŭ^ÍËĵCjEŞueQB=ò$cXĴAiı.Â“ĞŻ6C€$é´ mğĥ·pέ˙=I’8$|ŭĠçÄûz"ĵGCBBĉ^ ÇÉÁ{oR)£˙ĈŠ+xbâù}ñ!8”’ÔUÉĠ+ŻñĠ§ż‚k ŸŭìgĝıżöïñġgÎôp—>ò0oĵq…_|S˙FYNŻÈ8µ=Á45FI„kÇc˜Ïç8oI…1 Ï=÷-ŞŞĉÇüs|îs?ĈïüÎżâ­·òì·ŝ k O<ñ=ô>vïÜf<ò×˙ŭżÊï~ñ‹üÑWŝĤ.û¤YÂáá>Îĥ¤Záœacc›Í*IH³İD ?Ġİ"SÁ‡8ğ`­CWD~•ˆp7Ñ\Ŝ£we)Ąšuܐ|w’äş5ßu::9÷•kŭ¨¸{ߓyğwN¤µŭ IĊ>NÜĊñ9ü˙ôA.ß˙Û[y…çŭ,I‘1žl"’³eIÚ+ĜÚŜf8³µµÉx£GY‚N“!išpt°ÏáÁ>JÂŜî-ŝèé§yú駙N§c8ŝŸŭ쏲½5B ÇÑÁ.uµ¤?²ı1f4‚ I2>ü‘pçö-žyĉëìïŜâó?ù<ùä“Tċ!o]}•wn^Ë—ıpŝÎ:èÄ2q†³ZéĞş‹R²3aR2AI‰wkíšñs2Pݘ­ş²ˆ§ÓY-ÓîVµQŻ BŜXÂğnéïƒÁÜ”µ*JĊ.zEÍrÎu/DŜĠŠ“ĥÖĦTÂd²Á§?óüÍżŭ·À{Îîœĉġ×ßàŝ_ŝ)wüîïŭ/½òŻ_ıÊïwĝĊŸ˙yšĥf6;èġ3ö÷(òxR–ĥݸpŝ˙îÏ|ž$I˜LĥPJR• žüĜGĝ{ïïÒ/ ”ìlMÈ…ŽñpÀç>û#|á _àŸ˙o˙+yžS-fà-gNmsáÜ”ÖÜşñ6oĵñ“É)6·ÏDJŬF TĦ’(‹çß]NV &q˘€ ˆ wš“çä#]Ñ 'k÷Ŭâ{S=E÷³\ß wïëÇùo°ÉµĜéF?ˆ?Ç ƒWÇQD˙ĤbUàßíuìŜ] âÍjĴ§(ôcĴ ´6¤9£$£ ÓyĊöÎ>˙3…?ù“gĝíßŝmž~úĞ\¸p‰˘ß#+zƒ •ÀŜŝ-ŭ·ĝKï|šSvNmòCŸù$ËĊ"²;²Œ‹/2Ŝ°\ÌyñĠxîgُıv-ùCüüù ċËçùÉŝ“Ĥ)Yž!llnf8ZöÌñÖġ·ĝğç?ċÂ}—ñ]QŞê–Í-ŝÀ£\ştğğ{ĵÂóìí‘Ĥ Ö”JiÑö£­>“>ŭQĈù ÷Ŭc u]“ç9ÑĦ,µY’ä‡ÚÍ IDAT‚­d’Ùb”HÙżsDı\—>ó#<òÈĝżż/ùâ—­­ §vĥ‘RòËŻpt8ċ‡ĝÓlŽ6İÚë=¨#Dt§ôħgƒĝ8dĥÎ`ÁyƒÖñTäœ=f(½ ïy}Ĵşç5°¨ëZè*UNülùn0Çj9ݤıWy³Â:WŸ[Ѱîŝ{X“X”Ô”UÍîÑ!iżGo<¤ŸX_ŝÚWN6ùÏŝÖß$ x˙£äw÷‹<ûâóü˘ŝÈqQšñĉożs“ë7nÒ4 §OŸĤ×ëuÔżÀÖÖ&gϞAkMÓ´ÌfóNİÔr°·‡ŜÙĉ`oŸ˘ÈñÁ‘&šéìˆG>0û{?Ì3_˙ûûkÒ͛7ĝŝĠoSŻ|çŬ¸Á}ê3H™ñ֛7˜/Üù2‰NpĈwƒAġĊsŭ·UÂ9+>ċ÷yĵĞHˆµQz8 5ĵËğíâîÂ{â‘ïîŜŸŠx—ŭß°/?xçß2n(ÎBäğóXĊ ›ñ]ipëMRİ„­­S c~˙÷˙§Ÿŝo½uÇ‚˘è£uɗô,Ëi6ž Uе0™L8wŝ>Ŝŝo]ğs‚sçï#ÏûĊ€ .!„D+E’Ĥ4MŬ%=ĵ}ŭÚĈò³ġçxàòŭ<óÌ38$óeE’$œğx—Ŝ÷ i’€ĤnRd9e]ħğÀlYrgoo|ë[lmmqúÌŞĥAe>ŝ=ŝ8_úҗ¨­e^•\:u g|ó›ßä_ü‹ĈëoSô{Èŭ£ÌËIžҜ×^ğÂŜ˘fëü}20_ÖNg4uCۚî†Ñcyà)Š>‹Eı´ììœâá‡áË_yš_˙ġß ORFƒ!EZÏú<ġѧCÚŞċ=Á/ŭÂ/ñú•×ı˙Òŭd:cĜÌWŸakk“ċ²ĉ#O|”ûñŸ˘5–;ïìbĴĊŸĉLÎÔáIÓ4B'd>Ğ)^ž ÄşhŠ{ÊèŬµħ£3˘ğ.ĝ^ĝcU`;ìöÄwĴċ½ÇĤïo â{ôç'&~P­ĞsáúŜ(.ù^÷‡ĝsŝ~ñ}îŒ!÷œ5C(!Ht™Ógĝà#pġêUn½s‹3§ÏĜ‡>„w^QË{\yġ ÖZ.^¸È=Á ?—.7ŻŜàċŻ0NıïÂûHuÓ¤ÈX.Jz=ŬÑ6£o‡ÒŠ^1ĉÜÙK\ş|‰'Ÿz!2öööX. >RJÚ& ?"ĈŞ .°ż˜qûΖ•! xéċï°9Ùäħ=ĈöİÎ_ĵÀ~‚³çÏ3ٚpŝüy>öäÇĜœl2xä‘Gxçö-^ œ÷<úÄGĜÜ: 2i:ı½#Í£Ru>?"Ïsîğü =ñ1^}ġUnĵó<§Ï^à3Ÿŝ,2ò4çüısüÉ3_Úµ79}úŭĜ‡Ù:µƒk Ó錺2”Ë%Ż|ç%\kx䃏29})úHŻreCÚQ6C JaÚ%Ĉ:¤8G'¨RİÖoïËr²9 'b:Nԍi Ò$£İêşé:ĜÀ­[·HӌS§vè÷kV€R k ĈXÒ^Aċê²bk´icÔú|6j6ĥĥ¨Ú†áxŒpëú Ò$eÔuf=5à9:š2)Š‚ĤiPJuƒŠĊz`h:ËÔċ²äà`Ÿ4I Î!B`Ô0ŽX,ĉ(Éó˜Ĉ½żżOY–Œ7Ĉh­yŭġ7ÈóÙݐîğ˙„LiŒá`Ÿlnn’$q¨Öt³“Z˙U'+çñĝTÒE#tħcBŠâ}ӗt,‰{Kúğ˙°˘ÉŬÓ Šw1VßŸß hċDÁg-<ĉè˘#4#ÂŜYĴžħżGċ‡wÌwÓLO|ßğìV+îôz;Ĉ×0ˆÒQmvpp@ı,1Öï÷9wî‹Ċ‚Á`@Qôxŭ×Ù½³Ëĉĉ—.]˘m ÓéœÍÍM޲fwoĥmĜšl3 âpY1¤˘޵6Ĥl§)eYrgï6“ gϜċêĠ7>pöìêşŽ-igJĞ.;ĉ}cĜ?ĜçÎîmDp F}ĥ·ĥIҔà=U]Ħ•f2™°··Ç|1çìÙ³„‹ùœ£é´óŜ‘lmm3èGĠ£óžAżóžċrIւ;g ìíïs°żOY• ûCxàAĉó%Î9ƒ>×½ÉrıäÌÙS8oöûiÊ|à€½Ŭ]zyAžċlmïöFx‘FÚî4R6½whÓÈßşv•_ĝ6ŭ~ÁGŸx‚élÊ͛7ÙÚÚa2Ù"Kóġu­ëï=½^C\ı‚ÖšóçÏ­µ(Š‚˘(ŝğÍí‹˙ĊÁîµTGüż'íó*@J9ZÍ ½÷bUH…k,yE7ÑZcŒé jş+¸mçĊ| њÁ ÏÁÁ>uSrjç“­mÒ4ĦmÛĝŭ!ĥ%İ–è<Ô%‰w5ƒNğĜëïF†ż@äzC ßëĎKœ¨äë§TtšÑwWê¸5ĠÔx„lŽú\<„ Z.É´`jjœÑTŜ°½9âÌö&R*D°à ™–ä:e°Ġ‹ö˘Ŭµ·6‡$IH’„ĥi:vId¸ĥ%‘Š3Û§@)voßaÔ2ŜĜ „€†" ÜhO iê†ĤŠ?GJĊıÓç¸pî >4ŬšħAњÑ€ş¨ë½^J‘OP"0_Ìéó4Mƒ·‚4í#V:#MU€LGq–çĦ)Ĉƒ1ŝâ Ι†àkòTƒo¸ïây<gB Ò$aw­%÷߉|€ĥގ×0ç:ˆkĠïĥÁ(Ž–snĵ} g £áiĵ€eUÑX³ĝ[÷|âXuÑïv<Ówù2˙~|çĊoˆċrızɽóÉ'ğ.ŜŻMûO޳¤(cŠo×ÑY‚Ò‚ÙìηÑ&ËH3sÑÌGC@…ên´ÎKFÉĞk›è(§4ħ˜şÁ*ÓxhCv‚‚U8¤h"ġn0Ìhš#Şş&Múŭ:YıEï ,U½²,'MSLùËi ÷֚¨´Mč}ÀËdS#¤!CSœ‹§ƒ^Ž–şžÇëç=Ĉ“Ċ"ÑÓœ‹>ı"]§O¤iŠRkmô/pƒ¨ĠxĤmħÖRäyĞ„ĝú­µë{µ¸ĵ÷¤ŞGU×´mK˘5Á{”RßEΏ]ğŒż;Ò4‹œwçşM:Á9‹³-ZÇŜ³>$Iìö|§ĉêò5Ñ:~Ż”‘ċkÛèd–e½ÓZêĤî^ż˘iš™I70Öĸ"! A“&RÉN.íñĞĤBİÎÂÒßĠu‹8úG*Áâüq².Â]µN´BuM‰1†$IÈÒĴ›ôG:5)jS8dPLFJ êzI‘¤¤™fıXR—-“ “QĊrJ[;œ÷¤I‚³Q : Êċ"„h/›jÚ&>iĤñÁDI€jħ‡÷ċ)R´ÔËÒ,'Kzhe×É'm["C ÊzJ’&ô{}6FÖXDhQÂĦ…Y½?zH–€-ĥ5()˘¤ĵ:Dë„,MPJQ×MĦ%IäÔ+EÛT”Íœ,ˢO·ù(-²aĥ¨É҂4ÍiŒ!Ï{c°Ĉ0™laژìî\MUÎ(Šozxì1 *€ `½éiMĊÍoò֛Wbâz/'Ë |ç.¨´î,Äwêw­œĝ°ĞŻÏ̒>è“áùgżşB¸N|oĦ^uÍĞù˜ÔŬQ˜bog'˘âLJ²,×+X,ìíŬaoïŭ~ŝ ‡Ök ˜’„ŠD€I|ħ>à| HĊ˘\rëÎZëèġûL&R•Œ( –áµ›W™/ç(ݘL& †5Œ*Ôu­[·888`<sŝüÒ4jŭ½s4Ml6wŜĦkΜ9ËısçÖl”"/X–Kö÷˜Ïg$IÊĈĈŭ˘Ž,ÎFœloşĈœ?žĵ(˘à Mİ›†½½}f³Y–qjg‡áp´în…ˆË£#šşa4ÑïEed–f  ,+‹mÛBEÁĉdƒ,K.5uÁá!ËeIšĤloo³ħ1ŽvìÖħX,0ÖÒÔ5ĤÒâ^Ñc0 ´˘İŽŽŽ8<<Â{Ïp8¤?è“gùzMXç¨ËŠŞŞ@z½ĝùĵÈÉóg ³ÙœélŠ5ŽĵÈÈó‚<Ëb(ïŸÍX.KEQ$ɚŸo­e>Ÿ³X,PJħ³sŠ˘H(ëZi„”4uÍl>ÇZKŻè1Ŝ“èëâz×JspxÈŝŝ>ĈĥwvĜÚŜfY–Q Ä Ş+Ĵħôşëħ˜ šĤYßûÓé4Ŭ4×/Ȳ”™Œ°`UU4MtVt!—Öš`ĥpŜaZCgıXrĉuĵ÷ úŭ~Ì ìNu]ÓëġRòĉ›oÑëġ8{ö,Î9†ƒAÂbYÑÔë‰ ŜĈĜ;ôhŸ~‘rĉôy&¸³[Ò,$ µŞÑÎچŽŸ/5Ukı~&Î,Ù>{žÁ°`ħˆÀ$MĤŻb3‘ĤéúğjLVMg1şĈ¤µÖf]ßKnÖz5•´'§”ë¤)׋,v2bŭ"îí°W/"vĠƒaĤí³··ËtzÈtZ+Ó0=<À×GôTK*‰JH„ĤöBj¸úö5c úœ9}†~ÑGÉh4dA³ŻżÌµë×Áŭ÷ßÏÙ³g‘R41żŻ,K_żÁŜŜ.››.]şJI²,cħXríÚ[Üşu‹$I8{ö§NFkM]G÷ĵù|΍7˜Ïç ‡CΜ9d2!I˘CĜáÁwîÜa>ŸS×5gϝâÑG!¨ĞŠĤi™Ïç\{ûğğğlnnòÈ>Àxĵq×)È:ÇĠ7Ŝ`Ÿ³§Ï+ FJkŞŞbŸ½½=ĴµlŒÇLĥĥ˜lNH³ k GÓ#övw)ë–<ëS=úŭƒAŸ4‹óˆétÊááĈXĈġF ם9,KvoíÓTqvqîÜ9†!ÖZÚĥ5-Ó£)‡‡‡äy΅ ĜÜÜ<†s„f:­¸uë‹Ċ²Û€Ï1–Ë’éô¨2UäyÎĈĈƒÁ•H-ÁU,— hÛ¸QlM&ôƒ¸ž} ĴJîÜŬöôÙÙÙf0EolŻP2ĈÁŬıs›#F£gΜĤèġ!Úĥeı,ğYέĥwĥÙĜè#uL11ïËîîUUĦ”â…‹\8žşQZÓ4ħÙ¸}û6Ëċ‚sç/pùİŞŠ,M‘JQ–%Ó锣#6'zèŭ8ç1mKk UYrçÎ.³é$lnÄĤ&ϲĝŭË%‹ċ’ċbÙ9ë)Ĉc.^ĵH’$4uƒ;·os{ïEĦ×j$Dt}œN§\½ú&u]1;FU‚sŽÉd)%·ïìR–-GÓ9‹eKŬDIĥ³t½P—sĥ'Cz"§Oo˘eˆ†Ĉ"˜eçY^*Pˆ Ħs„Jٚ ıpá4YŞ9:ܧŞJtš"•ŒzïOÄ]•xeuşêVğú÷.“‰÷4“PĦOċ“òG­5ŜûġѤûš°2 ‰ÀuXKÀcçi2şXġû9UCpÔmCYA;($.x¤GF¸ž^„ö˜ŞäpZbL…’`i’À0cYÎ)Ë%JJŽŽhۚş˜Ï¤iJQä,SšĤfħ˜qçÎm¤ë]ÒOÓ´”MIcknïŬĤu-JIšĥEuÏáôe=ÇŜÁÊr†5Ž`â[ġŝ ÎZ˚Ù|Ùُ ú½>ÖZö÷÷9šÎ˘I§4ÁZG]Ġħ¨Şë>fó9‹eœB kʲ˘5ïwîìáì ¤iFÓ6è.ñ„ Ĉh•²ğ{@Yĥ@ Wô8uú››1.ɇÔçË(ï)şn§jjœuk˜Íg¨J]´ÄTë-U[cœeĥ˜²˘9ç(ëc,şŒjŻşİ֟HloD Ş GsŞĈbĦ5k ËeIcóùbŬ„ĴN6Ó锪,)Š‚Şé÷TeCUĠŒ†c|ìŜÙeŸ<ÏĜÛ?Mѝ ZÓĈÙKkփ½ŭwH3Ù9Ĉ_Û4,—eô֚Ùü€7³>óœ`:=b6›€Û·aĥ8Ä;Ožgè$Ċ´-˲¤mŜáúÛWb÷­‘Ŝ;Çt6e1_˘T‚i*óAÍ!°9Qk)Ş1g-i7)ŻÊ²Û N×ğż1&Z³VU™Í<£QÁxtŽS§Y–Ĵ]•’ ‡j=ŬĈ`Ħm£Dž ú§QIJšh-R›ĤĤŞŞġ|µħ§i²öfˆCçèx–Œ vv²Ħ$OfŜ;úÄ÷€N1ÙëġÑZ3˜ĈÜËżë=7Ĉv‰ÖħÙQŬu¨ë„#IşÙM¸‡!b””³$dY Àpĵµ–<ËH’”ĈĜµÒMws…Ñx3âÙŜcL §TkÙ² Š˘àôİ3Hİh›ĥ똤Yгİ$ZiŒ5di£­œ#/ NíL¸ä/ĉŞ{?#ìŻuè^³$Iôz-î'$ z=’$e{ÛÇd p^áI*GJŬ òc>˘Ž<ñôR"Žƒ4Aġ‡$J“¤iŜ#Íû¤y•dèĴÎûH1_,1nAŬD;W:fy¸K³qR)¸bv$I‚”R8ç|睯UÂ{£"Œ^ğ*²YS„“8óÉe%y\M˜½w"2PNêâ.Ü`lCÛV8×İ/@’J6ô9™ UF°ŽàÁz‚ġXçħ> RMšE˙hëçĦÑ2:µ­ĊA–G­{M´Ĥ>´ê˜ZÔĥíúÓ4M”wh… Qj,;ÏÓœwñ&”2֋.MĊ{­IÓ´£iI‚%CÌ!\áĊĥ*ùnyÌŜGÊUak#,¤ġzAŻ:!DGŭ‰ƒĠïnÛïI=‚뺎k–aCÉȍE'!ĝÀ²\=RĉGS’4Úû.·cë(µf Ä÷œ5ĞÇZ‹’”$È@ÚuĈÊ2[‹ĵ /òġÚñÎG5—uët-S™Ħ1cL, BĴ œï”˜ÑxÊQUUÄ óŒ <ĈÔ$i²Ĉ>=†­n´Ħ£Kž4†‹kĊwA½VŻfZ‘ĤcQ!à…Œ˙‡h—낈΍´d‰ŒY”Aƒò–àmçL—˘uÜĴtš e ĄÀuP– e½RÑŒè÷ûĝ.œv­*¸§8ŻÈ'foaµÑ‡ìZê-zO ôċ÷}(ĵŝêsĞ!aÛíp"„]@֊ cÌ]Eú¸Èw.O'Ġkkĥ‡§jÊj âŜb]‹µm¤À‰ħžĥqqÀĠĥcħĈĈ·ĉ@I‹Rc Ġ²ŽvĤ@5_˘UFš÷Y.—ë {żß'ˢ÷Q(B€ŞŞÖ¨mâ*(IÙvĦŞ:RšVĴ“4C!:ё;MÛF [*’$Ċw™òJé¨ġï<ŝDĦXÁ'#Ĥ³nM’Ĵ†´Ž˜˙Šħ*,ñçË5.êĵ‹všÂŻŻùj^àWLÀ˜H÷GÌĤ3ö[Ò,e9_tXûq‡ı:Ĵ¤ĞE)_ħWu͊„À„éèsĥ-Ĉš8wŻÑ³ÙğÙ9–DŬ}*X5i’Ä.¸{Î{œµˆSL҄ş)Y–³Ëîĉ!R9ä+şhš$:9qŒ·8çÉӜL4môïŽ'Öë]Ĵ5Vën<)ö‡)£QÁb1gı\˘t<›ĥÎs!n­àiE§Ô:f֕Á˜hBZ#XwÙJ+²4…S5ž4ġqÎÓĥɊĦp]nš¤Ĥkœ‹bë,Áò"'њŞ^P×Kò"‹ż§;ácÖĊtELşĈÀšĜÀ‡y Ǣµ“êğ4MÉóèĤ¸:9%I„ALÛà›-IZ Ò„ 6Œ÷ßñ¸ñäİĤ é-Ŝ4gbg­úH=$I=iHÒúˆB8ë:іĝz0Í„T$2YëVÈ EXħvV÷|˙ŒèĤ]+ p݃?OäUħ–MÓTHÓTtOˆş£zİÛIVʤˆ£FÓ#)E—U×A í.M œScÀıèmlLÂ,:Ù(À"à_BÎ Óĵéù ĵJċZ11nwĜŒ#Žû{Î9×ÊwŞ„tFÎc,*ö ›GjôĤ{YOSÀF" ÛqÄ&glë6 g`*ΧöĤPSä\‹ÂóŽĈ-69cĈ6ÏĜn/a¸r jg,à$àœ†Œ$ QLŭ†Z#ĈŽT Ĥ)d„cëà˜Ġ]ˆZŸŻ(2öû´)·  %“' #´ı6ŭAxžŻÌĉ²§X4a1njħçH9ä<óPâkĴ‘81:Œ=ƒ%^/U˙àPè`Ä}‘ڌ4ǓÍf‹k×.ġb˘ ıô,÷•7 ú5„dµ ĜiċâèĠĦiídRĤö9Íf›‘†\“TĴ #î˘Í“Zpñœ›!,·5V8]q‹÷^0ÔïŬùČaĜ`³ bwšv0’4ò”q½.à`ŽŽ0:€û†âÈѽ/ÜÂŞPŽ„·r,şƒHh)3ĈLĜ 6²éƒ&ßàÈ.Ħ˜ö•eÌ?޳ l7Ç`$1d“p×&GGZğXXÏĈ0DqW0a‚@n°${,Ô Pġ툽ê¨"HbÇùî I„ŠÎÓ~ŝ2Ü>ı…×´‚nĞ[Üŭëú+"|ÀëçiB–NRdkÁZhïâv„€Ú Ġ m-†›Wrhî˜iÛîÑȜjêĥ0Ñż(ŭëßĞ›„s´ôĉŜÔîË[8ŞŽİ bн{œŞ£•ŻĴ“Wb Ô $^ùb¨îA˜{Pm˘|áš5ök„öVœˆÀ‰Ĥ:ĠD´çZ¸‚a“!‘w·şĉP‡ş³Î½~j}§Xhñâ5ÌKµu"EŻ@ñ*YIŻV>­µŠ˜gƒM4ˆœÔ\=Ì äoUgİ$(VrĦb”n’ÍLˆV5µ_°­IQ`¨ GĞ!M0À‘ĴÎÏDg‡#Ä"ÍÌ`s‰=jĞöğñĤĠ^KM•¸Ž¸SżÖkİցĤ–8àMÛÜŞ$˘%¸EKÍ(+qŝĞhSĝ/¨Ĉ9°ĠŭY{†·‡”ŻáL†™Â°Şù"t2µÇ*(ùâìW}²cÏ#UWŽÎñy½.bEײ£ŽÜĞ*Ĵ(Œ Êá'Üb3Ğ„Ö+ĉîWMĠœŠİ~Ĉµôte_ŬkݲK;¨è‰6Œ¨fŭšQmÉSM,^ßBG‡ŞuŒ^.xġĴL1aV:Ù'BÓĜĠ1Ó4c?…ÁYĜ+,ŜÇRqSĠ4}}û÷œ3|È(Laz_Y;Żñz‘² Ż­žk˘¸3 ĜSżßÍĞĊĠ†1Ĥ?EjwfP+aßRŞt˜*<(1žOX욤êħcéĴİCİŞnÛîëħĤ™Ĥiî¤uÄi+[Ÿe–§ú$aĞxŭ/_Ħzë=Hżŭħ÷:€é_ûÜיù#îŝÊ<Ïżaf›Y*EÛózcIdמ€EM1ës­UĠ‘ÏsìçsLû ÍcÁ§ıBËK-Ë\1Ÿ}'˜ϏC¸aŭ%#q‚z$ƒ†#ö–µV_MòS*ÂĵÛìwSoÉ{5_Ğѵ*Ŭ­C9V#—SĞĉí˘<ç`iħĤ óĉÒ@k‡;ÙZ1´%ĝ÷½†ĵüfzŬ”ÀĦÏJğĥ­2Á*@s% Ä|ê׈W˜n DĉVĦ0ïp .Í+£CED˜M1›.6ĴµBB %%Ĵ Ċ²6şş[íá9X0ï;oän k‹˜[´üU•³o­Û)ZPŠö$ÔĠE?‡Ĥ 8QJ Ŭŭj ֝g§öw2ĉ2u•Á²µhı–MIÒ:§qqt˜úéévğ)3î0¤ïÁ8pôä[;‡]á¸íĊDŜ~·ċì˘{;cÎĜäéożVĠP :žżÁ8u˜ŞN A†IQħ·-[ğ‡8à:ÙÇ=!K’`ZµÙ?*Y.z䖈PqHíUwwìĞ•q.j‡j{³i—^œXĵuĦħàÉÔ ]&Y/›ëŸ·˙ZI{mßİv)Dr€ğ·û²tĥħP€ıÁŒPSz ‰*0°gBÀ:Ĥ’<%09(1„3²pUí1ígLóIr—ùĊßcµÎpƒŜBÓ­Ĵ(˜1ûò9NŸ‡ŒaU‹dI e’)JĉP` C8Uo ĊqÔ KċM fí\–nD6U‰e›i’ş•ވÈSJ‰ˆŝ†ˆŝâĈyċ Ÿ˙?ôğ,5ûÏ×ÒµŜòÈğíËO|ŠÜŭ™·?ö~ĉÓûĝÑÑÑcÌü>3{ÀÜŭÍûŭŝĈ4M$Ò öh,Ò´&E‹@dĠıNêÁU™1Ò6ÛÂġöÜu°> BñŽ9aHfĉ-·Žc 4áıí} ÓTş Zk3WJ8IƒH˘"!ĉ ÒÀP/J&wÇ>:ßm‘DÜjoIcÙwĈ>¤ öëÔ!jö Z_{‘‡15œ,Ğmv´ċÔ0äĤ5–j€ÓI”êĦPÑBéŠïÍÚkÖ$ìtqbMêŝô{µvË$ZĠĤ· %‚ĈXoŻv;éfmbµç‰…˙`"&ż:Ò|Ċq,Iݐ‰ ġĵÔîÁğîħYžz‡n|m_êpO€”3­Ż/•¤Ó²ƒ³ŭéNCÇvEĞDcüġ]K‹Ĵu8P†„”_›ĊùÒWÖÒ8ê„;NNO5Œ9ƒ%$³ĦP²ŝìÌS Z5}ŭC1À=Ôœr?gMĦÔHúĦ5‰iXäĦğ×ĜĈ];"˘5dŬrڐKJIZğ!ĉ„ĝĠ¸ELB" ) Èi„¤ &ö q "əÊĴĜívžs ÊÍë Íófĉ\$"òEù£GŜúó_ù‡żûkzçğ~ɀžü÷o²Şúŭ>üWñġġŻ~–ĉyĉ7nĜĠë÷ĠC?ç§óË7oŜ|ŻŞŝ*€‡lU•Ehò0‚|ù€íÙٙ<÷Üs~zz{6353.dUh+c9 ìkÏUbfj˙ojT´Ò"FqËĚÀ#ó2úbÛĥħ…Ş.ĥÄÖ˘·˙f‹a3ïzĠ6éXdŠNÛ˘gVrŞDWÈÁ˘œ-#ŻÔ[·uûos•²xDkâs8Z³F§ğNö"ßbßY‘ĥ ÔÏŜ •ûjé„߁vƒ–:ÈÚ5†‹ğèCsżé Ş)[܃¸l+ÊV ÚW„™_„ ÚµÚív˜ö“KJç Ġ²ZÛÔ$à †]ƒĊL-¸^sgb¸ĦÑZÁB2k‰›Żmz+Ĵp΂Qs°s×GġéĠüG‘ó+Ğ|°l]¨°7 Í>Ü\ŬñŠäŽ[ŬŒG7‰ĝĤ™îU-ċ”D’x)ş‡û‹)çŻ=ôÈ;Ü}ôżöyzË#ïZÖ}~ïİc3óŸ~ƒ?ÒŬòϟĤšMİ”™öû ïyïŻè³Ż_|ŝ;ƒÛŬ×Ŝ 6Ŭ˘““SşríŽĴö~?gi-ö3rSsġH.ž’Şöı=~‡€È@˜CÇBîîÓġë×÷÷ŝä½ğÌıTŸR-Ó|Éîıŝúŭѵûo79är.ÔьéáĊžÏÌDÄxŭGΉhá÷Ö븝o=û½ñ•W^™î}àÁ ¸˘àçÏÈË7_’§÷ôċ]™Ŭ‹¸Ġ`äεrċ€J˜àNĉNµ²ĥìĜŬÍ­ĵl:ż˘jJšÙÍRÊy+"[w—úŬ̔ŠŞĞpf‘| `0óânZÛ\nn‹ĤÚÚ2áHbÑ£1XË$f3× Ŭ{S=µĝƒğĞ+\Ğúİ&QìĒ;Aêż{í:˜˜eżÛQ…‹ˆLµ‚f‰ċ(!oĜy0`÷ĵ²ûċ°ÉŬ iżŸ$änĴ>''_ĠüıûÖŬ7ġ5oşûM™ëN= "錑^!"Q3“ıÌ×Ìôjŭ}ÑÔ>3ŸыDô’ğŸĞİğ“`NnpÔûî#€YU‘sÊ̗= 2³ÙÌöŞ:—R “[H=ÇV'B„BꞈöÌ\˘+(óĥjÂg ‡ĵâĥ™?ïÀ œX$'ÉCÎ4¨Hš7öüîğî9½~Ï=ğĞWï.$Wz^ Û³äùúÒŝ^{çûïˆ{ôÌÓ˙!ff÷Ŝxà%@_üúòŸ˘†•ĈCĜDFÁ Ïxùċ›ŝÒK7ħŸÂ~?M•U7Š)JÔE÷•À<ĵaÏ §üŬßû˙×áGùġÀ} 7Ó­[7ñ ĉÏ< ”WI‘™AÇ[àè8?.ßòé5}úÀOñϽ‰pó—qrş‡pêdàÉém<ŭôSŝ‰O>ékz”îżïghğ9ê„ë\f|âµÏ?qŝ˙î^ü¸|µ„MDŝµÇ?Ï<û]:ߝuŻ‘_˙oë˙äïŜèƒżü~\ır›íeüŝ|äÇŝ üٟŝ1=üțIĞeBŬH0PÎÙĜ£o{÷Ğ~Î˙šïèQ[hÚ@IENDB`‚desmume-0.9.11/src/cocoa/images/Image_PaddleController.png0000755000000000000000000076607612467662066022174 0ustar rootroot‰PNG  IHDRşßż,{m /iCCPICC profileHǝ–wTTׇϽwzĦÍ0Òz“.0€ô. QfÊ Mlˆ¨@DE €£ĦHĴˆb!(¨`HPb0Ѝ¨dFÖJ|yyïċċ÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Għŭx€Ĥ0YéİAîÁ@$/7zşÈ ü‹Ŝ HüeèéO§ƒ˙OÒĴTÈ_ÄĉlN:KÄù"NʤŠí3"ĤĈ$ŠF‰™/JPÄrbŽ[äŸ}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\NĤˆo‹X3I˜Ìñ[ql2‡™Š$ĥ 8Ĵx›ˆ˜Ätñrp¤¸/8ĉ p²âCı¤¤fóıqñş.KnjmÍ {r2“8Ħ?“•Èä³é.)ÉİL^6‹gŝ,qmé˘"[šZ[Zš™~Q¨˙şĝ7%îí"½ ĝÜ3ˆÖ÷‡íŻüRê`̊j³ë[Ì~:ĥ w˙›ĉ!$E}kżñĊyhây‰RmŒ333¸–‘¸ żë:ü }ñ=#ñvż—‡îʉe “tqŬX)I)B>==•Éâ ˙<Ä˙8ŻóXȉċ9€˘yPÜġßûĉƒâ›Ĥ:ħ8÷Ÿŭûp‰ĝ‘΍ûçLg ù‹kâk €$È t!0VÀ87°ĝ`Öˆɀ2A.Ĝ @Ĝö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`ĵóa!2Dä!UH 2€Ì dıA>P ECqBı¨*…*ĦZ¨ú:]€B=hš‚~…ŜL‚ݰ2Ĵ  Ĝ ö†ƒá5pœçÀùN¸ƒÁíĝ:|Ÿ³@ˆ QC â‚ĝ!H,ÂG6 …H9R‡´ ]H/r AĤ‘w( Š‚˘£ Qĥ(OTŠ…JCm@£*QGQí¨Ô-Ô(jġ MF+Ħ 6h/ô*t:]€.G7 Û—wè7 ††ÑÁXa<1á˜Ì:L1ĉĤs3€ÌbħXyĴÖë‡ebĜì~ì1ì9ì vûGÄİâÌp‡+Ç5áÎâq¸yĵ^ oƒ÷³ñÙĝ|= ?ŽŸ'Htv„`Ba3Ħ‚B¸DxHxE$Ġ‰ÖÄ"—¸‰XAàP4407°7ˆÔô&Ĝ9¸$ĝAˆnˆ0¤;T242´1t.Ì5Ĵ4ld•ñŞġЇ+„s;#°Ħ ³ĞŬVï]=iY9´FgM֚ĞkÖ&­=%ĊŒ:Ž‹nŠŝÀôcÖ1gcĵbŞcfX.Ĵ}ĴçlGv{ŠcÇ)ċLÄÚĊ–ĈNĈÙĊ퉛Šwˆ/Ÿĉşp+ı/<jĉŭ$.$…%µ&’£“Oñdx‰ĵž•”Ĵ”TƒÔ‚Ô‘4›´½i3|o~C:”&½S@ŭLġ u…[…£öUo3C3OfIgñ²ú²ġ³wdOä¸ç|½µŽµ;W-wsîèz§ġµ  1ş7jlÌß8ÉcÓÑ͉̈́›È3É+Í{½%lKWrŝĤüħ­[› $ ĝÛl·ĠlGmçnïßac˙ŽO…ìÂkE&EċEŠYĊ×2ŭŞâĞ…ħ;ûK,KîÂìâíÚí°ûhİtiNéĜß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§˘sżĉŝ]û?TĈWŜİrj­VŞŜQ=w€}` Á–ċš˘š÷‡¸‡îÖzÔĥ×iוĈÎ8ü´>´÷kĈ׍ E ŽŒ <ÚÓhĠĜĜ¤ÔTÒ 7 ›§ŽEğùë7-†-µ­´Ö˘à¸ĝ³o£ż:á}˘û$dËwZßU·QÚ ÛĦöìö™ŽĝŽ‘Î΁S+NuwÙvµ}oôŭ‘Ój§ĞÎȞ)9K8›vá\ÎıÙóİç§/Ä]ëŽê~pqĠĊÛ==ŭ—ĵ/]ıì~ùbŻSïı+vWN_µızêZÇuËëí}}m?XüÖoÙß~êFçMë›]ËÎ: ^¸ċzëòmŻÛ×ïĴĵ302tw8rxä.ûî佤{/ïgܟ°é!úaá#İGċ•×ŭ¨÷cëˆċșQ×Ñ'AOŒħĈž˙”ŝӇñü§ä§ċލ“f“§§Ü§n>[ŭlüyêóù邟~Ħûâğ_é›Y53ŝ’˙rá×âWòŻŽĵ^öş{Ööñ›ä7ós…oċß}Çx×û>ìŭÄ|ĉ쇊zğ>yz¸ĵ°÷„óûÌ;ĵl pHYs  šœ IDATxÚì½ïŻ$Ùyß÷}žsNU÷ŭÑ÷Îî,G+Š–,Qd(2Šf½ŠeCßV¤@†Ál0ô"$E™‚ŝ…dÂD€(` ȋDF#óЃP`š†d†KÏÒğ¤¸ÔÎÎÎÌÎÌŭÑ·ğêœçɋŞS}ŞşŞï]Š"—äùgïíŞîÛġİç|ŸïCÈÊÊÊÊú‘ÔrUQ]ĠŽûu>#YYY?l˘| ²²²²~ôtïŝRٝ˜ŝ1€5€›|2Ÿ~oVh>CYYYt³²²²²~°÷ŜgŒY(ĝu_†Ħ÷2ÂL·á+>]²½k-×û3ŸÏXVVVŬĴĴĴĴĴ·ĵ>:;qïŭó*úœ)Š"U]ñ·IôR8ŝcfs6›Í|Y˜\ċÍÊÊÊ ›••••ġÖ҃‡ U½'‰è#ÄĵĈBDĦ* b0IbŻ"·UmŸĥÖĵZÎfĠŜĴ|F³²²2èfeeee}ßu÷µ‡ÇjĝEQüRú "aÁlÀL!>*t +ÒnY A„ /™ĝ6^Ŝ˙‘aoooµżW†|v³²²2èfeeee}ÏuïŝC§Â‹ÙĴüŭµĝߪĞzQ3ĥĈ˘Şkˆ0;¨jşİ˜ …÷Ş*ĈšÊ°y˙ŸŞŝ úYçÜ2§5deeeÍÊÊÊÊúBîcŭxı?ŝüüü9kÜħs–Ğ ¨ ÊÙ>T U…JF VQWŬ%"¨jco@€¨@EDw™é€/ÁMcÌé|>Żg%goVVVŬĴĴĴĴĴïî?xä,Ĝ¸ßW‘ßò…Ş2”`­˜ ސSşÀÌà–S£oWµß(4 Ì"¨œ0ñ-Vܑŝˆ^(Êrµ8Èĥ†ĴĴĴ şYYYYYß5È}r,†>àyÏ8†p¨Lï9<¸0GûBİ^vó*7 ÂL+/‚ô€ೖÏd[CVVVŬĴĴĴĴĴïLŸœëÊ_g˘O’³°PUDUFkOĜ şIÓĴ†!ÚF@7ùTî2ñ_€7Ùàd>Ÿç!YYYt³²²²²Ĥ‡žPµöǁ; óKlĝˆx1ġxUÒnPUm½şħ1ÍPgm]bŜŝX! = !Ü"ĤŻĝ4ß-ĜÖG‹<„"+++ƒnVVVVքîŬXÏ0óG‰é×f!˘ópÇ À(èĥÙı[\"†&›ş èF?/kóo…€%€ÛŜû×(è˙c­ùÌ|>?ŬßsÙ֐•••A7++++ĞÑ'KZ‹?fâ"Ŝż‡,Dà$A—…áv—ŒÙXF Bîp˙Kt7€­ñçÂDBŠ7B/ĞÊçrӂNžı~”7+++ƒnVVV֏²>:+k ?£Ş%ŻcŽ£‡VÔÔs;LLĜşS`<Ĵo[ú ;„bkm÷ï 1Ĉœ0›[RŻ?'Ş7 óé|>Ż÷÷\öñfeeeÍÊÊÊúQÑrUñ“³ċ‘÷ŝŸX>`­}9 UE•&*LT`° ıD mÓL‹“b*:€Ù–Cx§AwÈí6ÙH „†5ÄÍ>ƒÔb'Dt ÀUŭCĝ‚sĊ:ûx³²²2èfeeeŭëŜŭ‡s!üMÀüb²ÇÌ!ÓĜ DcĤ-˜A$H˜ÍöıyŽQ PµR_.mŞĵ#İ CUĦ-8N=Âğl nSĊĉ-ĦiKÀĜÏÛT0°î†ŜaĊvŞŞ+³ñħBŭçòÄ.şIn„э<´ağIp€ŞĴĵŻ_&à[ÄôE& àä™ ĵYYt³²²²²'zġŝ£‚ˆ;ç> ˘›…÷ž£Mˆ›áíË„öÀµċÎèµОŽ5~ ;iĠuÂCĜecz U…ĈJ,ĥ›äĈŽḟ~à1İĜ˜î9ΰ8‘[˘rË>EÌĉó˘Ŝ›ÙǛ••A7++++ëğ­OÎİŞŞccÍï6żTÀ‚‰``­ áÊÛËÇUŜíύ€ÛùhM½µCÀÂgwI 4ŬoĴ0Ç!$:ŭvЏîù=ċADÚĝùb…8„/1ñ—-èż cmµ8(óÔµĴĴ şYYYYYß Ŭü¤Ĵkùfŝ¨µö×,`"ŻMĊ”/·I…¤‘k`ÓtSMĦóÍÀv÷亂îç2íŭwÒéñlŞÑŭx5ž˜„Cǂz1l–tGUż§YCgG‹ŭlkÈÊÊ ›••••ġêŜ£“cŸd˜0›÷(á Hh! ]W\ûĠ,ÚÔ!$Ĥօ7İŭ cı+Qa VSHVz§|ÀİĠ"ċħmçĵïjĴ cş*°ġ÷EċĥžInñIn\ËÊÊ ›••••ġ&t˙Á“BTŻÛ²ĝ¤Ş~$x=nÈr0!ĴĞP†-ˆ#b Ĥ[PD|iîPMzc³eu¸Š76*ġÁlÙ1p½l?S6‰İD‰ħTgìàŠ§ tàÖşŞnáS…söööë²0ÙǛ••A7++++kL‘„pLÖŭŽŞŝ€_хj¤0Ô%*‘-h3_ÉS ›VDw~ÑÓîfŻİħËĥĉüŽ%DLUl‡ |hĵ÷¸üëLôĜ˜k*ò‘˙½,Šó£½+ïóµ[­V bú„ċâƒLô.{7F_…Ĵ´a¸·ì?¸"Ú4˜ c­7Ĥ˜KÂß >W6|^šƒğ L·@t‹vô˘ŭáƒNgûèċûö+ĜLҋs –ɸ àŽŞ~ID§³ÙĴ>ĜŸe[CVVŬĴĴĴĴ·ÎΖtqqħÏl>Ć˙s"û³Aä= kì]búĵ„żŞêg°ĵvĵ˜Ĵè=~rf<èHU?JDÏÑs*8n­]:7!’@— @û~\Ŭ žv#Ĥ9¸oĤ m×ô²)`Ž%1¤ĥˍÇ8µVìŞvĠÖöá^¤µĦĤÍÍ ħM0mıˆŻmüü˜öy7‚7ŻCœloİú;A‡*ŝ…˘,V‹ƒ½lkÈÊÊ ›•••ġÖÒkŸ8xyûlVŝ¨ĞgÉEü=˜*w¸£"_PĊM@Î"ĵŞJ;ŠVgŝ.Ĝŝ†>@L m#âĜŜĝĝ T2ˆÛF´&›¸vċàĦ­ÖĜÄÖÈĦ:Ó>4ĞÔpWŜŞÔĈŞ2Ħ”ĦnGĉÊ@=ü9A}è[ pyrUšċ†ûKSȘûyżcÇá—ҕ ^„;ŝ…5ö³3ë–û{.Û²²2èfeee}u\ӓóċĦħĉïY.~C$<ÏÀq>B“n€¸­è¸Şg}ˆ˜àŬDüĴŠ‘ßDx#hk_Ël-TîòÈÖÀ´ù=_ĥ¸ŜĉîFx•&A·w,Éä5U…´“Ì,ĥÉ.‹ëOGJè=gĜĴ÷ßAĞ1ğ/pƒÁ#w ê¸wZ}€1&z{+UıĞŞw|ÀM†ž<}-ǓeeeÍÊÊÊú>èŝ³²ë·ĝ¸sîLö†H°Dçĵ61[Ŭ˘ö# “HQx Ñ2šŽŻÜ MAxşŭĜħ>è3d/ƒä]œnË{?nWĉ8kˆĠßÉ ÉHr˜m`˖0 Ĵ頉t§’"èNUŒ‡™ğŝï‡ic7i8n%Ŝ•Î~ë›*ŝäúÓÇx³²2èfeeeŭĠëÁÇì½?‚uŸpÎŭ²1ĉç½÷*³ÙĝeİŸ îÁ£éÌm<µ…:;BŬ¸½!èĤ6†)PMAö2h‹Çô@oÜVHĞéöCìĤÉÔş0y1ÉM3t‡U]¤—Ut/Ûo óc7ÊîtÇâŜş8²ö=e&pMġĠ‰µö‘ŜòÁÊ{˙°pÎ_;^doVVŬĴĴĴĴï^{ĝhnmñ7Uġ8ç>¤Ş‹à…À°éìA+Œ èSÚIfi4U­ XĊ–/7}üXq*a¸ŒÎ#օ]Òf,Ħ­ <´H4?Gt‘úZU'?ŬïeJA7­wżÛuáJŞĵğŽe Œ#Œ7ħĊmíÌáU+,DDBgÄô% ŝĥŠüKbŝ,“œ_;^ĝü™••A7+++ë/­ûÙ@8rÎŭ.ÀżĈÌï0¨4iLê÷T÷íŒí*l ‡CpŬ,µÇ8×îg<^´İD…ħŠìTĤl4şĵÏ:ž{-ħ‚Ù<$äÑSÓÔĤÒâïT¤›ó:Œ)óç·µ+sw—u"ìpĵ è&ûġ˘zÀm&úżEġ3LrVÎfġŜĴÈñdYYt³²²²Ŝĵ^½˙è°(ŠżàCŜûżCLÇeQ˘öÖÚĈ)í`7Ù².¤Àş Üàş=‹ÂÈ$ŻĦn:˜$6U͝ŞÖ^É1QaWüXŬ-ÔŝkŽ•Ö1°L÷7÷ğ܉7wxÁĵñÌ^Î)èNË.óÜ)ÚĞuY~ŞBy<w*`,u!ž§ËàrhnŭĠ>àO5½Mçàö³r{½C"ĈnĈ@7ŬNÚĵ6”HsÓ4ĴòÇXıl –ä€Uġ#˘Ïeı\”ıy-++ƒnVVVÖĥ?9£uµ>2ĊìBé~À1QÓLÀfQ–]fm?]Ħ…’QOmôÚĈíuÊÜĞo}Ħê‡@ÈÔ%H ½fİ î.àĜîgİUcÖDي‹ÀكÚ0^İ&kvÂn÷ş°)szӟ§@Ï·ñ^ñż;8<Ġ¸6U žJħ˜ŝxܛ×aÛ…ŝ ‹ä³–<é]QéâÉ ÂÉĦ$YYYt³²²~Ätïŝ™aó>cÜ?öŠ˙Œˆž"b›Â˘´ĵc˜€‡>L†ÖŠñUdš(ä) *Ú5ĥ Ÿ7ôöĤŬap tcUp8tb Êvi˜–0„eöĥ‡­YğÍaf÷P‡íóÒ÷/cĥF_Eiö/ş)ĜŽŜH„ŝfŜò:›t{ç}t‰èâÉXñ9 ġM'ûû>ûx³²2èfeeŭˆêÉɊ–ĠêĜZûO˜ùƒŞú.ìĊ¸°7´Ñ´Z×d.Ñ^ĵX ŻW]MâĤĈNĈ}·<œóyË?|•a½cV…o'Ž6=P‚îV“]Ç0nċȨ!Z4êmnç2ÊӍ•⭁וֹߎ„‹!èŽm3N½Áxz'ö+rÈ-_ "ŸêĴœUG‹™äżĝĴĴ şYYY?"zíŜ£1½Ï–Ċo3ó‡EäXUÎ^0ŬXqíd;,µ"ŒċàŽî˜§w¨˜Úzt§rbÇ@w xïÇ~6µC Ŭf(„n-͏ó* ›>NÍxCŬ‡?£ÛíwÊëû&AwŞ™oĞÊ+Ĝ ³ß)ènĴ bK ŝvrGUŝıµöO­µ׎÷³­!++ƒnVVÖĞ>:3*räĦżk­ŭ Áĵ ÀŜäôħÁ”2€FlÛşĤJ;YÉT:ǀsWÎíÔï/{lêÏ&16,aôĝ'ri‡`>äğ*Üğöϸĵaċ´;˘lä¤ġ!u$ebWEwWŝp˘ğÂħWŬî<$i q;?™ êÛÇaĤ À+ŝ%Qŭ˘aiŒ9™Ï ?+]ĥ5deeÍÊÊúaÑk÷¸bö!&ú aú€1ĉ˜Z0“ ½tƒzMÒu?Ò1?6Aß~06aXéL+ĴS ;Œ‹³Ëš>/NaKm SSÓvmÚ¸íİ•#Qı˜:o)˜Ž=Ÿ†V‘Kìßiê‚ú°tŻ’‘noËĴÓéğĥ-ɄĵĝúR(Ŝ4á5vn/BÛlçĜˆ1tB¸à+€|š˜^-‹²:ĜÏĥ†ĴĴ şYYY?°zħ ‚g ç>!L˙…Ş>kÈl^M+0°Ö"Ôë~U7Ŭˆ(¨Aĉ_–ÄPj²R§4ÖĊ?ş)lĤ›‚ŬT"@ޘ;+íë02œħiK67ÄԍÇž…1>O‰&­iï0}‚F`żÛ/O@ú‘n[†şv§"ÛRŬ9drSÂn şÍƒÌ "é<À…! !,ƒÈm½£ê˙9ŝÓù|~ħ8ĜËĥ†ĴĴ şYYY?(zôĝ„Ğş^Xk˙Ħ5ċUċ95ĵh€u`Í aİ­~&é’ÎohósÓ&ħQĜ™¨n Ätħeq(Àp9{Ĵb›ĉ³²1[UàᆠĤĞÛŝ Uuo= ÄĈÓڋ‹7cÇC›ŠŻ*äÜ>‡ Ân?f­×)Š„ŝc|šÚpJچôǽ—7ŒċëŽY†Ŭ]v…!äö·µŬPĜœêŜëĤ²Ëf‚%À{ßĵĠD•Şâ}ġÀ_dƒ›sOŽó˜áĴĴ şYYYom½z˙Ñ>3˙Šsî#~ÊOñ&¤´ƒĈĦlƒÛö.˘‹vƒîV— ĈŝšM҂¨v•TGĵ\ğĈݧctw~A'ÏIŸ€Ûí/H7˜‰ÀĈm 2„­ğÑhÜÁJ=ôÜÀn³M6ې9x—yЧì‚öÜuƒ6C4|è=wX5ËXĵÙè~GFï灧7ŬšÀ1Ŭá{½ÓKÛùĵ,b„Où7ÄüŻ%ԟaNŸv+ĵYYt³~˜ġÊĞßvĠşâ TÔS bÏçòÏŝxĵġàÉıóŜ/Tġ“ÖÚ[kß`–ş†Kĝ)™AŽícƒ„Tû Ö(Ĥ Ĵ&'î7mE$Ù Ĵß è^6ñ Ĝĥ,tç*èà<ġÄ BZíĠt{Ç´w‰$ {œn7\ €sNÛÊ1,€Ö{ĥBŒUQ·ÏġDîn’<ġ^VÜ ;úSïûxĤŞÇq~ŸJx`­ŭ2Ğ›AätVÎ|Ž'ËÊÊ ›ġC¤Żżô ·<_.Èُ•eñ^j†ˆƒ6WĈŻVUu“'?÷žweà} èñ“3òŜW˘3ÖflñÜĴ,ž³ĥX(@ È(4Dê“àġVUŻn…•˙‘>xïϽğÊgû£—~ĈC?ê\ùëÌĵVUÌèˆŬŬŜV™2'@7VfÀ9ôsP‡^X€&—[v-ϏMkŒ&.lڊĦ`;J­Ŭ(‡ ;V%O5cUÙ]éWŽ'‰€K_ûXŞCL‘ äġP8Íñ´ƒK`×èÍĊh{€•C8×a&„ĜL9ğ" n_s{Ċ#T*ú²}À˙Ĵŝ”ˆ.?}œo³2èfeŭ èÎËßpëuµ(Ëâc˘ôœ1ö9W” "°a b€‰!Ĥ€PU †ÏÔ˗–ç˙v½Ş˙éÌÙÇÇġ?{#çS~/÷ÑCÖÀÇäÌïŞê˜Í{>èF fy?éU³†£v‡µµLM?Â.ÓmwlâĜe‘^£ LWĦŽ vÇ +slÖb"nGÓ£6ħb€ûL‡ëñĥ‡iLÁnÜ'@·7.ybY·Íd€„„½†ê Ŝù>ï͝7IÜżQIa¤Iğ@7ïÉŭ3’êü ²¤Jìò?Ç}Äh2`K•aóçŜû—Ĵ/’èM rRÎJż8ĜËßwYt³²ŜŠzéċoòÙêâĜûQbzŝàè9°YÌÊğÂġ.€ &BQ@,ÏÏQ!˘3ï—Şj} ÁšH_=>>Ş~üÙy™ïŻH÷ÜßW˘_ÌGĴ54Ĉ{ïAìڋşéAn„^ï}ZħÚĜû0*—4Ÿm=>c8°)h½LmĤÀ”VŞŻ…Ġ‡Jíyü½rn‡yżt‡9ÂCċ§o t)‰ëÎWšÂ ştÓó›n§Ÿ1<žÓ;lĝJ›ÍäÍĜ5ñdS‘gS W¸íÖKĞ̽ÑцşĵÑíırÓwĞ!ê|@Y–""'ä–1ĝЍ~ÀŬY9Ğ÷÷ʜ֐•A7+ë­˘/|ùĞûlĝWÊ˘ü}Xğp`6Ö0ÜïʆišeDB³Œ1pÎÁ{Ġz%ŜWKñġmQyĦê?ùןş¸ñÌÓıâñ]ÒGOŒ2y~À‡ËrŝfŜ{fŒħ]„36Ĥ‹ƒ°4!…¸!ȎUjwi„Œ1½Ê6† <şWÙF X½Îû1ßîȀb‚AS Ÿ:G^ÇoÒ1Ê@ż²;Ċ)˜NŜ ĵIop€Ž6#vC0’hƒà$ b,!}­““ÍFR-tA½èöÎoŜç´éî²ío³wİMiĜĠ0ƒÁúü´`f‘¨ÜfâWXñ'Â˙âŒ=;ĥŸ7+ƒnVÖ÷K_}áŽ[‹_XS|ÒZûacÌ;Š˘˜ırÖĊ'5MKĤË* 403XuӁ/Dâê U½Şĵ÷/ ˙gu~ŝßÓ_ܸq£ÊÀğĈ¨ŭŝ XX *¤¸+œ^àüì|ËWUƒÙ|ÀÚâm¤ğċA)˘&#×{ßAÎŞV ÇÇFË!cËÑ]f/ËÁċöu^ĉŬíFĈîÜá9éŞ{aóÜÑĉ,š^'ĤîF\ġRa†7Û+v~†ĠŜĥé@ŻòIƒ¸!èF°4†ğá ğâĊĈ,ßÑUúÑa)t5¤7½nĝ™`Ñ?żvp£z+ŽmóŝR÷31‚ûÄüoòŸ%Ĥ?ĥ֞_ÛÏ>ŜĴ şYYß+}ŭo¸Ó‹ċà•Eùœ³ĊsĈÙcnвÖMEFC˙"ĠNĈ‚ÑÖvûœ:4ĊŒàkxïÏDävUW˙ĤZW˙LU_}û·UÏ\żöCii¨%˜‹ċÚ0…à½G]×Ŭ˙ĵ÷]BB 6ĵgĜܓAÂ3*ÁŞÒ ?£Êϊx× ÍEäŬDô,ˆ U$7" ÂXf1\áPĊĈišİQÖĜ^ƒZ„Ö´ê›N‹ï„ĝû`ƒÈÖ‡&‚Ġˆ]aĝĜ>¤]ĵ=36„Ûĝß)ĝÈ`T>:œ#Ž' \ôßÀ IDAT6ZxĴ)MTğ•’.ZĴ=܎߄FA7‚[ʉïT§“&6Ż?IŠ lĊ‹ġŜpżé>Ŭş¤w4ĴŝĈöÀ‰ġaĴÒíQŬBżbl­…÷~ĞQ‹£ŝgehgé&û%Ÿ£´úk`ÛJî°Ħ-ôŜËÎâ__ó˙´ö~Û{˙y½IL'7žÉkYt³²ŝÊôíğŻòĠ"³Ö<_”óç W,Ĝ:ŽËqÖZvͅM|˙ÂÉ´U•.qljGiċFƒÍR×ġr]­oĞè òG@ĝÂññÑòħimµiµ^ڋeĊëúu R#xÌÔß%²żĤ…% ² K0€% %)˙Ï ĜҜ” YxĤÍ,2°/"3ĠĉĴĥï 7à@Ŭ$¨²K‰ÔPxĥŜ/"ĈŜŝ 7À`­·–ĄşGr $‡à`ŬŞ aĈZÛûùTêĜ¤­!ÀUzS¨󃎎˜m7ސġŞÍHŜv•"Ĥħ1ÇC_r ¸é Â0a t{çĜhEĵûóĵä’3<Ïq`D:!­†2]‘V¸§†4¤Ï‰V†˜S য়~zŭìġ·ä—˙ùrM''gvı<ċިxVcŸÂ?ĥĥ|gQX8W‚Y˜9€w›gZXxx1Í˙ЁƒÀ;À$ÌŞ†DG,~Ħ1ĞqŭêRˆpPġŜwàĵïŝğZWĴlnr֖0Öâ`Ŝƒšô}ŒĠÙ!ÌĠß´rÊDԇËX1À#KĝSħSñgéDŻÑ/àĜ¤MW)`BdĞ:ŭĞÈħħŠêvT^&îżÛvsĵĦMˆKû^¸òyçÜsŽËù ċl ¸ô"ƒúK—Ûg˜ëÎzSĠ@êşî.Bu]Ÿ­VĞÛu]˙˙ WŸzúhŭׯπ÷Ŝ£wòä„ĞŞrŞúŝ²˜˙}cĝmÎ9kĜü1½›ˆöşóc BkV0 ›î:‚µÎ9eıU‹Ŭ51:È *›ğ`bĜȖÚ)†°tèĤ€ÔGÀ˜v¸FíQ‰|À:T€j­Ħµ˘Ö jŽ Às(\s·Öš˘µmpüK銈à‡—nzĵc.óÖĈżÍ%‚'ĞĞcà;Ú[WĜ÷ ökS^ßáûEƒĈĜá !ìĴäv#¤£ƒ'şT ċá{ÀëˆWé}·lÔĴhPó‡r˘Ş·DġĞŝ€‰^.œYdàÍÊ ›•ġġ—_rçgg 6ĉ–‹_&;ûù•\40Á6´ĠHfn=iñK¸iì`4ñI›Ê‹Žv—Ğ)úM6Ü>Së‚ö‰şŠ^ĴZĥĠGQĝU}qñ˘À˙_u]˙×ôà½ïúÙïÊháo½òŞ;_žs-8(Ëòcóùü½ċĴ<`ĥï°ˆ‡ïL‰B³ĵ.ÒM’j“àm@]şù,fnż†¨6cuL;Ò8%`0ÇÌbou{o_Àû°MĠ VÇb7½8A÷šĤ´níĵ³4‘ž½Áó³³ĉĜ­Ċl6Ĵ,Q”eRYîû##Ĝġĵ³Éò:+&ÓĤÒĈü–cÇ~“Y#KĤ Ö{>´Ş°Ş–Xžžáüb‰ġĊ •_!Ô Ż5X ĵÔ eÀ(HlÒ•pÎá³ŭ9öööa‹9(m[ÑĠ$Ŝ‹‰@##…‡>ĠĦOx§‚\tŻrwy[Ga2L§!D0f*÷oĴ İèE™ÑHLXiweۀvNÖĞì^f}èߜEŻïÏèE²%KUı#*_żŝ /8çÖÇÇÇÙǛ•A7ëGWßzċUzÁ‘Š~ÜÍgÏϋâ9eğ(ÜÎA¸UW85U%kMÛħÜt•ÇċÖx`ñÂ4„O]îâz¨Á°°0Ĉ4ŝĈĥJdÓ%Tş˘ô _$À‡ ~µ‚Şžˆê—ĵ÷˙v}qñOáÁ{îŬoxżù­oğċù’‰é pîcäÊ÷Eq`Œy?-ħá^e4ô/bJÈŞĤúBhħ­”G€›9îşÂÇb³ˆ6“›Ĝ˜^s £ Íù1ĤÙİïUĊ S ”$bD°­kżuq—v”iĵÈ:ç@dïlÌU•îóğ™i÷z]U¸¸¸@µ^#ˆÀ9‡Ùl†²(°pŻV'ŸĜ€ÖƒŬTùRëC„Ĵħ*ĉĈrqSíeŝ†MċޏynUU¸8=jµÄ£7îââççg¸¸¸hŜ˘Í|èïÛ{‘ĉ&ĤχĊb§žyGGÇ(çû(Š(ÛƒÀ€qĊ÷“7ég'M­M¸tÓԅİ!ğ*ĵc€ĜĞÒÊĤ­ó·ÍuJôU2“SŞV§ŜŬni")#Ĉ§ ·Ñ}փô,Ŭ˙ȈéħsħÉá ŭxAğ€Ñ?K ĵ(Aŝ\Bĝ3ċ™ÒÎN];ÊÀ›•A7ëGK·ïĵT>~üĝíóùü{óƒß„ĦEÁ–ËŭyŻÙ0÷.hSùžñ ¸ËöœXß55Kşĉ'3³ÔżX™-€löé‚À/*rĤ^´Ş.ŝÌ{˙ßĈžĵçŬ?½³y•oß³§K#U}À…ûĜ|>ݵöÀó~ĥnÑVQ9­¤ Ħ™†Ä ­=ZÛ–'4N‹v„.Zk`ˆŻ;½9ˆéÖÚ.ÂĞœÍşßGkAêmNÏЍOïğÊğ²Ac³×°yĴ½ìBT`…+8ŻĞ"Ò5:ç@2>9kÚĤÀöü\\\àââ˘y !`ooŽÙl†½½=4c¤c£·ÇI“ÁárpHA+06wġ̌à[ >x5ŜbH Ž ĞĠçËœ/—xŭîи˙uœŸ ĝÄ ç ô#ĝ¸{ß&YïğĉŞĦı9::>ÄñÑnܸ§Ŝö ž~êm``M2#„Ĉ*ĦÒT“1PPï|L.éOhì|NUÇĴ$Ño=ö¸ËĤš`žş)‰Ÿ×ákĵ,,½óĦ×+4u l§UŒĊ ½Óċż7S3 c00¤·­á>_ä@˙ÏXkNŻ/rZVŬĴn}ŭ›ß²oĵñĝÈóqg‹_.ŠòçmYDϤµ*w!éUÏF–ŭÒjâĤê6 :cµá|ĝ) ŽżköĊ½J\Z)€´* xpRûġ-ü­°Ş>eĴ}Ìġëġġ§7) /~ŭ›îôbı°ĝ_ÑŻXkßVċûahÑÂGĞ@zaŒK“qy=‚^\ꏛœb3V<îxኙ´ħâ=ĵ¸Ĥ“ÊÖUµ5\‰àœkÒ’ÇÇóĠ4ġAOF@7½ÑèUĦR‹Ċˆ ÚI ĥŬg"‚f@ óWÇóaÄĥÓӓî|ÌçsÌç ĝ²aHë|Suvh·QuÏI-=À}¸QÂht$ì]†ÂK…úb7ŬŬo˙îŬ{o<ş‹³%ÊY‰Òó}ìííĦ, 0›.wĜÚÎÔu@µ°Zݰ<_b]­ħZ­qv~óĠ˜šŭżímO'ò'ñÓï~7žyúÇÚÁ,šêġf.‚ošİ[UŬ1èÚĵ—ÚCpV|ǔĈÏí]JĴ5c›z-—ÂĜžÈ6l‚nÏ×}…+ĝԀ’ĉFjp£Áŭüñĉ³˜Ä5bûf#Ŝ ၊~ÙħùĵaÜôŜŸÎf³ú`–}ĵYt³~¸ôݰ¨ëúĉó½½_,gó…afko`ü"µv;!…a.çP/âĞT6ĈFÄîŞêŽ.ĥžÑM‡~ӁMĴ×+xï…Ùœ­Ğ‹/­×ë/Ğê˙ Şß!bZÌËŭߞÍÊ_0Ĉü‡ĥpÏ8ç§£ociWœU„ş´q,^„#줵)¨Ž:1lXí6ÇëĤS´št€èQLGÍĤ‰iÎñ°GD€5•!$–†˜ï/ĵñ1qisR·$kLŻÁ°ZŻ;[zµj'ÁÌçsbV–;DzîĴ@WÄƒƒZġaĜÙ|½şÀŞşÀ{Ż•żĝ^ùĉŸá×A°Ĉb˙`ù|Žƒƒâàû{{Ŭk(Ë= Ĵ.jœŸáñ“'xüèžœœàìô§Ësœœœàââ gç'(f3ĵ'~ï}ßÏ]?û`q Ε€6ÖkÛe~4€ïE{‰SİS£W…ÜÔ?ş vŻşc fc:Ŝ,èŽÙ+.ûĴ¤Mf"Ú=<ê–­nÈÉs‘Nĥ›ÊŽÛû;MW)â1Ä´†á4şŜ{D pÈ­şï°1ÈD/8gÖÇGÙ֐ġ=—ͧ ëğİ/ċĞ.0!ÈïEñ÷ç{‡Oc,·£^c%·İÚiçħFòhâ½ĞèáuX­ĜuqÂëôEsäbcħbÎl[yó~şŞáZPŞĞš×Ġzħ^Ż˙v]×˙1€żċœ{£œ•aVÎöfċüo°³&™ħ1mğ,³uxœi~kĵ018I0Ôì+VÓM/E0 4Sè-ÇÇċħœÔÎKĜ-Ë&ĥ“¸żĜ4(ímçLÜÄ}Ż;Â6˜áë † ÊY í íšĦ­í˘ġ‚Ĥ0ŻŞ ¤Ù§íŝ‰EY˘œÍ0+g¨ëxÏÎÏqzzŠġj…˘(ħ·ż‡ŭ½=E |w\qÙ<ŜŒŒƒ–nfó‰’BÇ 5Vëñ/~ŭßáßü÷xŝC‹}eÙAîŝŝ‹?s×]µkxêݧÀĥhĈää^wçskĵG<ÊÒ!ˆ…Y1ÎOOñÍo~ÄÍôÁżŝÎwĝĜIZhÒÍ ÓĤié vƒ7¸—5^íşÉ螛4“M3F<=ßo²0´Lí7~ŝvVħcı˙ïh]h޵Ôyéß żÉïx3:üŝêhÒîuÙkHNtßÇLLÀ1`~Ġ9ŝOù[Äüwuïŝ?ĥ–roVŬĴ<Ŭyñ%ğZUGŝ+&~ŝĝ9Žm;!.•+5#K+si%҇ÜM›ŠĤéÁÖXÖëîJ‘nÁààP İÄ*3µ˙*´ŻÍ1£kœžâôôÚLJ8˜Ïçïß?Ĝ[Mc‘1ÌD¨ëŞiĊmċ14•]?rñ^P{•ÌÄŝQ­×[•]|rqk`Mˆşf?L³²ĵv6c8ĥÍ9j+”ŽíĉÖ֞ë]7ħ˘\_\@B[Ï/|0Ä 2¨}ĠäÀ&KÄ!ħHkğs-ëşĦ(J¨ \áàŠĤAm6›á|ıÄzµÂryŽĠz…‹‹ b>ŸwÙ t Ĉ*‰HŞ·@Çĝ½›ĉÓĊc^*ë§§§xùċ—qçßŭ;ĵ~˙50óî†FQÌ÷ôġkxû=ƒ§žz ó—lbqôÊ˘…—ËĠ9VĠÖ4]öEQ˘ŞkœŸŸá[ßú‹cĵí™gqíìĈr;8$@ĤF}HÔÈĤñuğ*İğ _Z œ¸ħġóKŞ“;²ú3ĜğĥÍD£7¨ô‚neI†7íÉ@üˆı÷·µôħ˘ħFèĉóJŝî´˙tU½¨ħ²qUb+_€ „vĠ$¤4ÇÇĈñŜşşĝ¨üûĴµżT8ûëŜןżw˙ÉM&œfşz¸ÉcVrûÑXen²cv­i–†Oϖx7°Z­P8‡Ċñĉó9öö÷bn€Ž ê P8g:Pê–)C€LS!ĈŽ‹a„Žn°BĜĝi‡ŝĉ 7C !>nĜaŬÄŬğwQ­+,Ž÷;P_Ż+8W ,šÁ³r†˘({ž÷qyEá0Ÿ9ìe‰s¨êAĉÀĊEİ} ,M%7Ž›e6P’&–[ŝË)PP?}.úIcUĜĞdèî‚î݁éñġ[˙x07£3]ŭŻ+ŝ}w͚ş ëcƒJ.­R_Ħ °÷Z›ZOüĝûиħ9t8I9×­,ı˘€sÌŜûcŻúĞÖÒs˘ò‹*üÂr]˙÷=~af\u´ĜÏUŜĴ şYß_½üo™GNŽÎ×ĠGËbŝĵµĉıÙlvlÛebkM3Nµg2MM¨‹ĞâÁƒa‡^Tžġ;ŒËaÂà“6µÜĉß4 ×ñù֌/OÇŭžžâäÉ NNžöö÷›ÎŭÖ?}œ†Ûà 0jډF›F+ÑĝÚ ħ³ġĉvÜĥÚa7‚PĴG%&²Ŭ¸Ŭr¨ ÓEjuönš ñvC^gOˆ`+ÜŬ‹q³Êħ²ĵéœfżžàoÔy}£MBbó˘`À"à˘hĴēuï}µeš´ö³·™ÔĥÓ4œs(¸€AáEUÁ0ââËċËċ‡‡¸víhÏoĴ¤Fח5R2QsÎdÓéÎqĊ£Í^.—¨ëEY póîü25q|)ZPÓüérstVUŬ`á&Zmċr†uUApxxŒÙĴĈġë7°×6ĥ "pûٍĠĵñĥSᆏ“‘ż­Ŝ ‘(/JbÓH½Ë|żğ€zèġïÎŜôŜÍK‰Ê}î^{úüÁ*ä¸ÄËDŬ·”NĴl}?u“Ó¨…ÑŬ•òáï7YÀ››ÜĈ‚ħ]8H- )ìŞ*êşî,>M/iI9ż0Ĉŝm5òŸĝE"zU$|éá£'7­ħ'x³2èf}_ôĊÛ_;xŭG*Üì7öÊâóùÁ‚ċĜÔĝL,m1†M—™ŞÚ h#H9½İv„Ŝ’!ÇRäÓJaÜÖ°²i.0Ô HĜ4`4_àœ@ c“óÚ\06@¤3{qq÷Àûĉ"ğ··‡ƒŭXÛĜ5ˆ›üÑ.[Öԁ°öwÖKh–ïMcAp€†Ĥ£^ÚUŬ_kOU˜6Š*6c!­°JÓm0 ÛÀruäîD2hŽËş˜şŞÖ’`­A]7çӐE@éÔ ’`6pÖÀŜ`$4•nŜLS ÒĵgË.ĥħilŜcï(…ğ›¤Ĥ2Ön—6Ŝâtr„" iD2şµHRĵ Ġ>óġj…Ó³S,—ç8ĵvŒ˘(°W6!4֍Βú9żt€74Ašĝ3ç =…cœ>”E @P×ʃq`X0 ¤X.W˜—3|;àÜfĠÂWŞĈérċù.–+”ÜŽF. !xĊşn€ŭèè)ĵŻŭ]ğ‘7›wCGjàFáŻT9œo;öïĦ׺¨ÄW>6 —Óé Äûìá?ŭ³ĝ‹WŝĞĠ"@Q`v(в]hnŠêşĈĊĊ€[^ÀRSİPx/X×.ÖĞöĉÌ`VÎppĵ€£Î×(Ë=\ĉ~üíooüÀIÓ]oŠœĵĝ^ĵĜVu}€Ö 9I`µ[Mûو5!ŭ}êáo^ etèÌĈżÚ;öħ鰇 ¸Ž}ZÙ[•J+½—XÄ*ídŞĊVùvcï5Ó˙÷TÚĊĜ„8Ŭyi„ÚĜöÚm2€cCĉW ú~žg˘Ï½vïÑMb:ıñÌqŜĴ şYß}½ô­Wèììâĝâĵŝ˜›í=_ÎfÏY.ŽMÛĜc,’ċéäbÎÍ}ÊWŬ€ƒŜ. 0÷ IDAT7!ĥ.jc@˙[ŜdCtP4ĥÔzËM“7°ĞÒ.;x?zŒÇOž`µZ˜ħżX , ”€µE1k›ÈênÙ|] °ÔT{½X¤v…ô˙I†ìlM]SUR]”Öĉ !@é]4Ç #Ŝ ›uxvÓß šz`ܜoĤ&Gw]ûÍEN·ó’‰ ,è5qûYJLD€´ĥY¨$ġĤ‰mÓ§I•”{ 3ŝwô ;ǽ*1Tɇ#T 3ö ŞX­VŬkı¨Öxüè.NÏpíÚ5öšâxpÁqÂ^hLÉñ`VYS%İëOŻżó§!xíµ×P_ĴàƒÀ `mÑĜ2ZŸvU×X­Ö°¤Ü,Ç)ru-XĠkĴjAU­á} "ĉ ĝ=†8öakÍÂrɳÙĴŭâÁfc9P„­/Çh[è.b#yıÛU†íİgSJA†G|ıLäÈĤʸĴ^4ô/0Ŝ{híqzzŠ×_ëŞÂÑb½½=Ĝ²À|>‡kÓŞŞBIrGÇ/Pħ‚- Ís˙rwk}ĥM<˜QFh÷#ސ8Ŝ—¨Ğşiu]XCŻâ•6é5éäâ.ŭ<Íô5 §Ĥ5jÚÉió3‡ €HŻ’“' *)wH#Ş ü"Éè5˘ÚL!Í` @U‡îƒ„.#fëĥÔĞ.†şFP…5ŭ%Ş´ñ0‡ĥ£ŸÓÏZÓ—NQ{Écc°:[âġ×_Gµ^ݧžjÇîFşv` ~S¨éF3Á¨ÁbħÀ;ŝÚ_ƒeƒCĵñúqpxĝAĥî]ÖÚ=c ˜˘ÍïDì&DÏU œħ²’¨(½!ñ9éôž4v*Ŭİf(ŜÙÈÁ;÷=<žèáŒÄuUáÁŭûxôè1Ĵ5Ĝ?8Àl›t€˘(ğ/uÛm?t˘Àù¸Ï ²ñ×ĥ~j½î²Z#˜5ÍTÜN“Ŝk*‹˘‹Kò>ôÎaĴ’oM7JŜ›¸ïtúÙü'֕Ûî|ĊÁ­m€:ßm³áMYTn[…íÊ}|Ü|>ïŞÙŜ7ê¤gÙ$zHÊĤwS?]³Ŝ zíq_ħ.°Ĥmı^˘Ş*œžžâìì Ž8=>:Âl6ÛĵèS ÖVóâçÔv Šu]ìü oĵñŻŭĊиwïÎϗPżÂáAĊÑ-ް·żƒŭ=ìÏç ÄRÈÑk-…iĵ"ħƒ½ƒfċóÙ>ħ ×ÜdÚ)wÜZG4–pċ äĜß밙t×êÍL_–. —4Ÿ‘Ng Aw“ğ€°ıQÓŜĝĜ1mٛŻİû÷à0L{Œ!Ŝĵ3T /żĵsòŬĞŞ½c7c^átżİġ£ğ™gñHƒ{ŻY$VÌەšş݈B¸ĞŞw@úVܴ֞Îçózofr%š7ƒ.bċv]UËDÒ§ÁiÛ¤%şi<Œï‰MĈoUÛĠ&² 'M“öᢺèŽoı\ââôĴƒk,žyêieÑŬP¤7oÍ 76‰Tb翐í½M†uHXWN½‹óSÔĠ UUATP:fÓŬˆFì2hì-…s퐉lċ|[80;°™µ{ˆ̂ßç’7!šŠ‰v3Ċ°[˙;ÑXĠö²ïˆİŠï֍Żî‚r{£¸Ğ2ç.ıŭ÷Bİ_яdÑ>1ô)F›C| ŜûÍ2z›&­éCôĈĴàMŞFżá0BXá\“Z1¸Ħ+ħén· żF ĉsT×.NÏħ<_vï™s‹ŭCìwÛM+ıé B]"‚²íÁV]×p†ï/€à¨Ö½ŜĉÇÍż4B"†3Ĥi…ħšĈ6aOÌô@ƒI@6ĤU„HâùÙ|'ŒŬ¨ ĞĉSv„]Uߘ”1lv{³ÒU’ŜĦnW"S8Œ WĤĤ qË+kvWŸCûëaíqÊb5ş:€ÖËŞı)›ċ† ; ÷Ħï½Ħ?4b³=ħŠrz­0ĵù{íÏ˙HlSĵħ;Žq” &ZB‹U]ŭıŠŝ™1ĝ ›˙Ÿ½·ëħ%ı²VìˆÌsNUŬşĠӜƒ˘}–eAĠĵI†E ùa`† Ĝžôâ͌m˜˙€€?~‘äĝQô@ ›ĉ4†”É6ÉÑ|lŜïú>™;üħ#wDFž*r$™œˆËŞsNžÌȈkݽ]ĵġĈƒŽ÷è>Ÿd÷”áŝQżÛ~qÛ÷ŸwŭöÔ:G}brcA.gûİ-ŻZ ­Ljš 2!`Ş&a½Ó-YX-¨Áĥ.ħkvN@!‚Lю“Ï`Ùóçxöô)ŻŻqzzŠGE );Ü%Âw­L+ç µ!,ŭ‚ë AË%aÇS‹YSŠÄêC°0ùs&?Ċ´9UÊ&QۉéÏĤd˜3‹êggƒïbşŬ8f9DdħQxÙjÍ.!J(öû!^³Óò‹ÒSĥ–£ĜÎ.€È ÈZ›àÈRe_W§Ò½µÊ;9imÇÀèLÛ­uelʆÌY(ö{xFLQğ¸€÷S܍#Ŝŭ…OáñéiÜÛM‡ŭ~]u.J–Q?/5#~W Ü"Zĥ‘!p`ÄaÄFjAċ Í@|•™öXÖ×m äêç{MbTWx4à3†0rÚèr[NP8…Ĵ”[öX3cɘ°Ĵ™ÜCyġeĤ•™µ<@˜Ż5{ÒèjiF-;hħ­?nìñ!P-B?“u°O9ŽÚ=u,ó<~dŽg†çg!ĝß5ĈüNŝ}²tŝx€îñ :~÷otžŭ)u›ßè\˙÷ğÍîÍï\rĥr~USW/ĥ- [;Ô žM9R| g !˜öB* qĞáL³7T$—#ĥÛ-&0Ž^½~§?úĤiŠGÇ8:>ÊşG¤ú{ -żsÖ@Ħf½kÉG äŜ¤#VvÓ÷€Ÿµ¨Vş_ïı „<û¨X5Ĉ L\Ċ)y‰j&VkŒkFW@™ö‡]°T˘‘Tç.ߑËjlùŝş)O4Úu!ZÙ hċğëkSV"ŒÁa){ћ“✵~1äŬ8ìoGÜÜÜàòĉ···¸ııA'ğGGÇĝıŸ{;%ŸyXgcWÙBâPœÉè Jë[†Ve֟f¤zÔê†Âúu éÑ]z÷5ĥ²µY\c{IEKÒ§°ĥòİ Ìşs“Ô\ ›ĊçŬQúU$vëĵ 7ƒ°Î6ݽ.ÜaIvHƒĵtë8ïû‚ëV´ŝüšU^!Ĉ­²ĝ\{Ž'° ͆pNĈ|Àaú {~ßçożŭĈàŭ„öbŸ [ßŝŽğşz Żġ]÷žqŬ{ÇǧgĥsYó8ƒ `v%X]¤_Òzħj-zè İo;™çÛjħ֋]= ĥš—ä˙gĤ³ĴbÌrÙÛàòú=ÂÓgOñ‡èş>&Fm6Ĝn7Ñ/8ĊŽJ4Ğ,h½u `ˆ ĥ°Ú:‡ĞšrMÙ{sûUhóh•ĝZ2fŽE˜eI›> ы7˜äëI½S@ç쁅™Á `Ù <†¤ÙÔúßüóäëÙĈĤïÉĠĉÄ# ³6žiîrGN°3’ÊĤMf•½{ŸwêµMY­-ÖÌħü]”žD°ÊĤ¸Ĉ2^¤m(úSˆÒ„h GpÖ`0ÑnğŬĤóˆMkW)Ê÷Ñ£“èÇ+ÏJ0WËu28 ċóô†c͂‰n=3-0Ó£àM1Ŭ骖á wɏóÁ #A8˘‹/,ÍSÚ¸wD tó³Òï´×ĵhëŸVàŽĞÙĵ>ïÛ5K°Dĥî–d³uµMƒÜÖßĴ?e)¨|Škçd=fš=´`Š×&gí³˙÷Y×Û'!Wž>{ŭ>€ ²˜Ŝz1? ƒ ûpü)9öġOoo‡´éw_ô ÏoşŬéö䈌£Âëv 8êlúşlÔZ¸ê××LĞBĞE9ëbWŸ×^œM @föVµvž }HÌà„“cüáüž=žÂ<íNptt„££9Ò×B2AŬ8ŽpÖĦ“;‡EY £!ħĞòÌCX0aÚ"K€ä|.eK•Èä{ŠŸjɈĜŒ÷b-P" ßó¨áu}—żŻ0ıÎ͑ĵĥsJgòğŽ#g7av)ÏÚT-PMl!Pó|‰e`›²™|o´ó%?‡G29HCƒúĊ÷áÈĉEŭ}Üu¸Ŭß77ɂl ïŻ %ê=Ċ§ˆpr-ÓLá{3Jl´ÊF°†–Lž6ú'„ûfˆ=„°ˆì=t÷ŭŭ½€iĞá4ƒÖŻ]¤—­‚JjĜûښĠl¤–c5³îĝÎ ½hB5ĞììĦïÛz_ôœïµğÂâ3×Ç0C“ f*ÒÙZŻC×½µ%B!Í!B8cö_YcÌ@Ĉŝ‹§żúWŬ†ÏÎN×€îñ³z|ŭßìĤ)œc~v›żO³ßtnÛíC°d OT=ĦKêU=Ié…Ú +ÎNˀ†Ö„Ä!L[1ÁĠÙGĦ=ùĠ/­Ñ•Ôß Âô‚n"óiŒÁËWŻ#%W˜ĤĜìtr|AVĜ󤚔bYàGı8JˆA½Pj  …ä!0 ,Ĥ)&Œív(Ò ıQúWÑHl,l¨X9Ä,uœsÀ˜Ĝdq\ˆçá³4˘¸ |ÎlŞĊ˙&À;N@„.É=Lr“÷Ȟż˝Ù"Š:IE<ËkŒ‰ d&o/P/²êi!ä Xi”Lffڙ‹ˆk$Fjà Í †qÄĤßÁ’EoşXCàq„·‘ĵşÄöĠÎşĴs–fĞCà@šùZÍ\úŜĠĦHŠ[JLôkDê˘-ôXlc-(˜Ġ¤²ú|~Üß7AŜèµ°/ĴŻUXúÔê²ğhl›%7˙ŒPfĞÑ ż¨˜…)'â9˜ĊÜ&0ï°'ğŻvVĉ,N›ÖğŽûÈô,?ǚ{ó5YMíĵĜąV3ï,U¨×ŸÈ“ĞÛĜ#ğ.ĠƒpFäBB‹ ßŜü/?~úê·,ÑĊÛo>ÈŝŬ?Ç·ż÷Ŭîġë‹SÀŝÚn·{lŜ#۝œĤnlYHò+Í,İ­“²ZĴGÀP³.E9‹CaZž¤Y2ke°–Xŭ³ÚBÌĤ’ñ~ÜÛ}_“¤o½ŭşÉñ ĥÛM|Żİ*ï-ö^ëİPk,s›%š5ħ­qFĞ,‘fˆĉ¸ĝŜ °8ç0ì÷˜ŸaŒÉ`uħ¸st¤KÜRÑT&ç Ĥ$£iŭGhžcW p ×O7êñ×bŞË ÙüŭjSÜ&ôı´N²?äÛ ksoa ağ=‡Ŭ È`Ĝ8??Ç~¸Aà€ëë+8çĝñŜyççş ´ìú"PĞŠµvB˙}ÛCÔù9Àŭtĉ‡>§`ù$„Š ÖÏ÷š#C èÖÍjk@·vk úĦ HqıŬlvÈrë> TKZóoí“Ûzŭ½Xóê3Zlê]Úúï[òŠċ5°wh‰ŭ ž“Ù3ĜO³Ç7Ùì³Ŭöĵ†gìŭżŜżÏ!œêçÎï}8~šŻŭŜ7ÎĜû_wŬö‰sî=cèôèĝu]‡iŒĥC]żĊ°żA·ĦhÓlX:´&²:˘˜H+аzÂÓé[‡ÏZçĤAÖ! À‚÷ÙÊkżGß˙cxö¸şĵD×ġxüö›89>FżÙd@=DݰµÉİ]]ŸoŬÈ$öb ê`çlv-hıIÈö`Îı˜n5ŽÉ5úKÀDŬœWŬ™Ŭ˘a.KV˜›‰ekÍd#ĥ(›/YÁ`dġMçÔX`XžŻY ?EĞ88cK‰UzÁÖıÔÍh•~WğR„iÔÙòËsĦÓ,tÜĴ…µ–rŞŬíímŜ”\^\àêúnnn0ùèñóïŝ<Î?.ÀîÌԗöz €ÁëÏd½qmğpŝž5Ğşl[ÇÀÓ*ĵ  ²Ú:ĴKtsÜ]FíprkÊ{½é¸0_c’ġĈD_‹CM]f%ÌĤ5çÖúX iÚÚzL¤5mà–Ë„Iiìĵ œ·šÌZעŬLg×&[+Z‹ĤƒòqZi­eÖÂlÈÎ|„Żxïß÷Ìğ]ïOOŽüŞxşÇOÉñáżùVwsssÚġ›ßp]˙ğ;íğžşƒ1ħDnMŸ˙ë:ĝ0MĤĥċ¨ ߊ­'|(­ä#™Œ´§kг½uHsTÑ ĠXkgâÏŻŻŻúĠküáŝ8ĈèÂÑñä³>šêGORÎ:f ÉZçĤ‹ÂbħTéaQ.`Ż-6Fü}9Nf£jvSÇí °Óöj 0“siÀža‹×€òÄ7WÜ Qô×Mç#Éhú<íq4F×uù|xœ£~ċŭ§Ég]°Ċĵ¸öŭ ΀_-`}ŸäšÊXô”H5"²ŭŒ8›ï§Uñĝ‰ÉĊĊe¸çŻÏókŽŽñóïŝ|ߐçċ"q6WƒôZšÔ:j]ü!0íšÏ´ĥ€Zckµ A tkçUÙÊÊï\Ôd<<>ġÇıĞ l˜ż‹Xܵäêë×ĠĤ×5 Ûb…ï XD³vGiğ7Ôön­ĥ5ż’¤µV=Ë3Ġ•ÇúyeŽ2+ħ1ĞŬYŒ1ès2džà ĝÁ4MżÍaúmçÜġƒ=Ù}8ŝ<÷G?´ÏŸ?ìœûĠ÷ş?Ûn7³›BöétĊdMĞ;íşsV&-žŭ"ÙL as%ü@ûŽ1ġĞĊô֋²6óŻYŒñ5(ÖÚĤïSĠ0p½şĵÂwó¸nƒ'lĥœž>ĈÉñqŠĝí2sĞ5w6 `nooçFµQ³âÑ:ŽCBèLD]ĉĴ˜ZИeñÖÍ@Q]\Ùde ’S-‘È 'fPà=ƒ)mîÔ#ú~Y˜ò5eƒŸoúh'6Mè­Ëvl–lfüċš…Ég½0‘ÍLħŒ% •˜Ĥ)3ÚŭfK”³o&ÌċÍÌ2Ĥ…qÇ9È#ƒ4ċi&[˘›ëçÀsĥZZ“l(ZşĊkĵl"=ô|ÊxĤÌÌ% ĴçƒŻßbƒĠ°“:ĝ³ ]W–. %†˜Żi#QP2¨(o½¨+Vùú‘:ù‹Ş) ]³‹l'ĵž2?ĉó'[8Ĵ1Ċ‡\\×@½t˘ Pħ †­ŭñB)êsÔ:4íB¨+dvqO×\ƒÒk0}á3†èÓĝ€'8~ċ§ÏßïğîĵëúéäxPÈ}8ŝ=˙ĉ[u77éíí헷Û/펏ŜíşìžÍlXÍ>Dñ5K&¨ö#!ß r@,m9T‡GèÉıÉê„TĤ†ż§ĠÄâËO6 Ĥ”œ%À`Gĵzù Ż_żFżŬDFĜm°évèÜÎö0p° „KŞ“¤YĥÈ{;ûĈ‰Ù’µJHñ&Ä˙6!úŸf Ï”An ü‡#¨'Pßg• ĵŻ†Ò’ ĵâd-E{ÇxMÌ7KÉL7m1óÂ=‹×YéZ›œïÛ4…ġâYË+ïÛ÷›y|ˆo0ĊtŻ›á6ÎĤ4Ŝ=û"F™“„@¤62ŽĵI ħĵ Œ#Ĝ ?›+ZZ½`VĞz” 9p’5D7 ûÛ!L írHÉ£Gòßx3ÇíjŻUÙ̀Hĵ!ò³:?§•N×Ĝš+€Ü’×3‡&PZµ5ğÛŞêÔlç]àöÏLˆŜ¸yŝQ$‡šċò†Rƒ¸h=hŠ[ÌEfĴiK5ĦHŭÍϟ—†ġĈŻ:AĴ˜Әnħİsb-ĉĉU†ĥÚÈzí\ƒÖCÍm-íĵNŸ³M‰…fEZVOû´pÔ¨ĉŭFÚZ}ŝµëEüŬ”6°Ŭ•í=œ-ïèéNŠ­,ƒµĉ À Ñgó“i rĜ˙ĉÇOŸ˙ĝèx89Ŝ>ĝñ>Ŭ‡ßċñ;_ŭÚÙĠċÍŻÙ^ IDATS·yòĝñ÷œ9çoz™y˘'ì¸Îĵriş^ëDg0>i2‡,SyÚ ÀÑÍdkħŸA:÷ğčï²<˙9‘L/Î9<{ñϞ?Ëqż–:ôŭ}bs³LƒCn\’` 9)áG°ĥevŬ:7zEP9[qò*Â:Ğ^„]Ël3à‘5ĥY?ĞŻo9&Ĝ.Ùp&dÛ³iš’Ÿïìĝ&a`ŒÁ0E_[ÑË÷èúȚB9rĜOàCb(wĠ˜={ïz_üwP×1³ŜTzëM§ G×wy9ê2¨–†½‚aScGܐfç ĤĝŻ|gyK'àFÖ˘²a*TiĜn6‡Ó`•ôƒ½Çġġ5^ĵxwŜy61ÀÂÜÏEĦċC…FQßE£/­ĜO€²˘5½Ş\ożĤɔs:ĉ³”-eì֍{rżµÍXÂìsyğeĥÌ )G›µúkħ°÷=jĈú{Ô?kħĞġy(£foKù°§îĦ‹ċÏ€½˘J’SŸ½ĉ³ĥ•ÏI”zĴıäıžR„z¨d9 Ĉ|Àżèœŭĉċċċ?ûÁŸ~ġèèèĉñéñà}şǟäĝÚ×?ìûĥÛô_F _éşîôĝĝ˜F?Nü>G¤šô°rHŬġI‹›5cˆ C\ù†–Í ïgVÁTŒEdÂb2ıË^H³‹Âĝ”$dÖĴvb–Uì˘`JŻÏX&Ÿ–ûŭ/_ÄÍÍ vğè#L–°ÙôĜvœ1pĈÀ jş|,ͲRĥ†Jt ì=†ÑÖ`ä(EĜ.™L'--PŒĞ)iòÀ&:Ûa’#C HD0x_.9fyÄEiS3˙u7>͎Y íiŜPPéıÇÌĴÒ…ާ‘a‰o6à!2àq3Áم)€1Mâaa¨›ŻEJyëğŜ3nnn²ñ~ò}Ç1Ĉè1Œ,uɋZjFŠÒ F@ĵ>”‹È/ °kfÀiĦ½’={$š?ƒ‰@ÎÙ,5ıG„ä&1íG<ûÑ3ïŽñĈ[oĈ=…›èMĦÑĴŒJƒk¤bz›1¸imJkŭo­ÍĠZ—]³ÀĜLµ’ĠŸc°eœ77á݁ïŬDBw„Ĵ~7² v°ÌìKÖħĊ­²áyĴQ9>BP(šÒŜ˘äĦqkbĦagĜžo£|"LKk—ñk6µL2³IWk@‰)Ï4ÒçTKKüyëĵ×]xEòħfċĈšÄ1($%yœäç*Ç=ĞÊ#³?ñ<}ÎÁüĠíöèódí×ü4ŭóüùżrÎŬüÜۍk@÷áĝħŽûîĠ‹×§~-ù›ŝÚÉÉñißo`;‹dûܵ 6Ù"­ú×6Ĝ‰şé NT>ïâ[z-=ıh9€U­q],ĤhƒÜ’ı›YZ,!‡ xö ˆĤ²Ċ:AGÊÊ/^ĵÀġġ5œuöĥÛ-şŒî&6îċĤ.öó÷óQÏĞٛEĦMknc'Ġ9vvmaɑÊ)ċ‹˜&ñ*SĦµ½L*iKĜi“î8–ħħé{Ĝ¤‡˜|ĉŒŒhr|€MñÇ O^XñĴĦğm·ÙĞ6~î2AM6cÚĦ âô°Xà<[míĴ“Ö!JŒ )ĞvfèÒ½œŸÖ$ ü‚-†=„yaÏ#Í0D!é³ċµÖĤ@ĜĜ.6ċ {\__áìͳÌ9dي4¸š%ċ™­„ÒeĥX: ¤…)GbÇ ĵĞkĴ뚏lhÙJĦ(€´ÁhÀ1²kçZ^ €ĝ'dYï† ™PîĠfġ~÷ŭµíWwÇ5[Ż;7ʖL3Ğ´’ĥüN:*ĝÀġ!şÀ´ž'!óçJÔĵŒĠµ-TÙ҆ \Òí;vdÉlÇqĝK8ŝy²öÉn·ûNákOŸ½|ß{ŝÖÛoM5:Ŝ ûp:~÷÷><{ŭêĠŻ3Ù'›Íî½ŬöĝÔ9KĈġıca”˜?K2QÛh2C&İT6µŝŞl"0ĈÀZSxÇ겑D€²ġĴKSJa˘Ù³ĤšdT²–,°÷@lÎiìÖ×[2W——xñâöû}ò_Œ Ĥïħëû̔F€D€dÀK£QbX ™HÒeÍlŬE.ŒĴß3œ£…ïpÔöRNĉbï `/ÚR[•™µM`~ô‰‚@tSjĵJlÀi’}’!t½èš§Ì`ˆ\eöħkÛsÁĵ”€´êŻ€‘…çF†ŭG”*)=_fż‚Ç4Œ…ï­–t ˆív›] œ ûȌMߗ~ÊÎċ͜ŽĴ´TD‚Ò:ĵĜ°­‰”dĤ}×áĈÉĈÍÁ{ÎòK——W¸<żÀ£GJÖ9Ɍ"ÏşÖۆ•Pa<jXín֍7,ÊZf`–·ĴdŬ°ĈĦ™-tĴİAĞ%W(GjNö·–&Èk%É1ÔqäK”­>Ÿ›ïW0êy2 À^oìÙFO ƒ`´2‚²I@¨ÁŻ‚µf²µ˜û\ Ĥïr[˜Ùċı܈kL+Ï^İWvĠçĝâ³ôùiŸ#ZÓ:~úĝĉ7żĠßÜŜ ĥ_v÷+§GN;×ûȒmŽà9.ì“0œ³ PjĊ\Ĵ´²–Ŭ¸­Żvş{– ÉN,o›ħĦĞUI&5biéAQ3HÎìXJĴâjÒŻ ĈÏÏÏqssƒa÷=œbt…µ6ħsI§ W$ˆœĜ-íêrI6yĊjĥÊĤî{ŸşŻµT Ÿ§ŠËuĠ}VĠ{΁Ċ;ÖƒÉO` °ó2!ħ(í§"3YŽQz‘(ƒÏaà}Èşĉ)5tJ+ì=öŜcÜĜl·Qi eêXnìò&7­ÈıgF5îĝğÙEB>ßR<Ç è: û=ÈÚ rÙ{ĊXŠ&zG°÷èûM‘‚f‰`TˆGËöÎZB@ĴfĜ€di6kŽ%Ĥ+ÌÌ)Y‹ív7GÜĤséşWW—8??ÇéécûœÒU°Ĥ*FVî…Yyî„ĈVȀV6$dâuÍ•Ĉۚe³¤€É5Oé̛¸ĊĤIƒĠn=£ĴĜL—ş­­­×L/µŜ—Wô§r?jxͲF—•²ŞjŞÓŸc+pĜ²Wc}’ç›_% J]ÖÛ3{Ÿ×bsïË,×Àu>÷Ö·ċÔ0ŻYŞ–U%-]Š˙Ζr`Ğhò4ğž…À_˜F~²Ûí~1„ÁġÍŝŸ>{ŝê{½Û§·ÓÂyşŸèÛ}·{}uq:Œŝ×ìfû7-u­ßmOûMK݁ÊZx³ ß’+6m˙¤M´!ĝ´x„UE$QĥœdDïeŠ÷6°<ılÀ]:ßÚ",/މU‹üċÂİ™dÈZĜnï=(LiÁ–H\ÌŜıŜù‹—¸Ĉ¨ğunG×ÉùNĜ¸.•É<°”l &cC9ÀÌ:ş‹ŜŻ!“ìÓbBJp]dî"(.ü§ÉçûÒmş\Êöû ôDg*Ìò¤b³a¤–M@ĠĊÑ=€Ò}‘ cKp$‘¨&#2>cqssƒMż‰İñ-Ŝ¤Q*š_KğŬ.ŜwNT³İü€ScY —Ĉ‘O ![²XÉç‹7ûÂf\i(Ĵ4D›ìœh~ Bġ>ȅUXÔÙ?8nò†ÄLÑ%ïßyà@N95$g?Mp–÷Ŝ{\LÑäĈ—çŻ1Nï`³Ù€™!â‹€ç³fíü ¨xÑ$&N Нïɢ Ù „˘ŭÜ8Ül˙Gù>ÍZÛ òœ0K):dĜ–ô’4‹hċ–mVĥMşċ!ll$3XʇZ>şP• ˘¤nÖgj°KRµJ˙†ŞÙѨŝ€ü3™y6†Š×˜rĞXĜħÒʆĴġÇQFżg‚äàHá!5%ħÈG2[(wİ49Viož=zrI·]V$´BĴàŒ!°‰ï?Ž l·[ÜÜ\Fİ‘X^ùġĥÛmŝñzÛĝ7Âŭ²1ÈĴ¤x H,šL"Š5Ċĵˆ“‰ÖzÜhVœ™S½Ğu¨Ùï™ÎPÊĴ•Ö—nÎċi6ëMiE JĠÀ˚âêêÌ}½…ġFc}Öŭ rżôġó+a Ħꘛ޸޴™;‹¸vċá\˙ž°=Vg,'‚déÑ^KĦî²W“ÏÒŝ³ÜaEÖçıv_¸ü£™ŝÖĝiñe{½¸S=1†>Ë À/²ż4ŝW—ûÓŝöüí·(€î'àĝè;ßÛüÙó?gŭĠ]·ùŻœR·!ğÙf{#ш’áü@–àRRtD5c[ǀêS4”Ĵ’ħ´?§ü˙܁ .X½ ¸+ݞ\tɳ°:SĴJ6£ŻËŞşıƒ†Ż_½šµ´C×uÇGGG9Úײħ„C‘µLİ{ïbÑȎ’j0pˆ.›°Ê 6şbÄĉA)‡H)=pjäô?Ž‘)„÷`u}FìıŠTÍY§Ÿ+€żżç=ž8ç>xúìġ?ĝùÑÑÑpü }şڎï|÷÷íĞWŻŸż>˙ğÍö‹GGG˙ñv³;‰vH6Ë´_ä̊r‘|–^—!%‘­È´ßfkWŻwÓÑfLvÌĠŜĜÛx¨ù£kŭž€İl8^ž_ Ĵwä:"\ßŜâòê*QۍgC{_ħ¨œ½=#Š,Ѱ˜£(…ÁċcmÁ,êżö´-6% tFׅÒWVoħ_7ɵ¤;.ŒRmÙê0ûĴ—–xñ7Ja-ŒŸËÎ6xÑNSZcĞÇĞ莧if{B˜} m²ƒ÷ı" çĉÈ͛4ù™l ?aK(˘‹9D‰ÁäħèÌ7†ğÄÄĞ€ ½ –/7ĊMÌ^ŝ6˜$Ć;yIr˜ëaŜġ]´<›ĈTnzò)ı]ÌÌWŞ˘”6pÂÜÙfê*ÓXùêgµ ÜVŜ·Öö·qé5ÛH.cZŒÓµP…5pgînµŭ^mµfU³­ĝè‚ë;lËäzÔdB‹MĠ dµ Ě{Á}šÍê÷'5£d£5ÛTzÁµÈiyŝŞh•ŭ­Żq=ŭ´Ĉga G-w(ôÑ § Í(›E•Q×ìjg"kKğHcıħÛŒhàg™Cgà™ßsÎ}žCĝĉċĠċ˙òƒ|üÍßìßzëìAÇûtöŻ˙î7O~ôâĠ/ïvğ/ġ}˙ĊÎmÎĴ%°6}ç6*ه²½„‘QòÁ5PĤA´]ˆ]ö<û4ĉI" pL½LbjÚġH]熲‘ş‘‰Ó0&&ËĝĴĉôÖŜŸ™uSÁµ-ÙĦÒߢì­|s z’W¸ĵ¸Àp{;4QGp¤-\ ™˜&:c6™Íö&éeàMYĤW[zŒkm!‰&/6—xò÷´í"S<ŽCE.–Ĵuò™‚ȵÏ`L5Ĥ°ÑĴԜ:6ƒ‰m5ĵMë{A°Ïqĵ‹ĊVé£./ħˆ&‚C½!3”*ʲ-xFcÖ!kŬĴ\'9/k ĈQ¸9!nG˘'Ž?ë•8³ı‰]–s5d€ÌĵÓc<7#ژ”FJ‡BrF½ôšÉOÙĥHêdĦq{{½ËzêĈ—Hbdċ˜•ŒŒ¸”AôîĤÁ˘%I Ğ:ĈvÒî P×ÏĞhš[€Ċ’eħ+i|R””4²ž B[â`CTžš6ĥ›ç—P‚˘|ĤÁŻÊêÍcÜWŻçUo×d‡&S3bÍ½XĜKuĊ‹äYl(ğٔą‘&ĞÈ­(r…ŞÒY˙$ŒòÚ­ġkßġĈİĠ¤¸Ĥc×$Žc"ŭZÎî6-Ö·pm¨`N9„ż˜˙şîóŭnûoüë§Ï^˙Ö8Ŝ^üÂğŸz5<ŬŸ½ßüVwqs{ÊÖ|ùÑöїĵğŬnûmż‹ yàÀ*eİĊŒäħWQœ-P ĝ)äĊ·ġ†äMÛvB(w¸y‘çˆĥµĴÖ³ésÔ]Ŭ-f%Ç´†eİÑPÛjL@Q´™’ŬxJbšĤç:M... 1èş›~›Àş+ öƒ/&z?Ž`Ì WJpìœJoÜz²ĈM|Oġ„9MœÙK6³ì&uĵ{Ž@nvY˜ ĥxĜïóġŸ\ Ô3Ô1½éž„jòÖşamİ#ݳDQKÂ*è ݵ‘ÎÍjh'XHjÍù˜"t%d`fWgfV6z3%ݟ’°Oî$Ö˘·67ÔIHÔÏœu*^9²ü3¸2 ½¨#Ê×:¨ñ, oĴĜïĜyOÑ}Á™ì“ËŻħÓûĠĞW8::ŞÊşj;Äŝh=,Ŝ·kN™½ċXġ0&µĵÏQ§¨ÑŠĉħU†V/Œ ë=XÔx=M³?wvÏŒğÜ(Z~ğk›ƒħ†ĥıx[³ĊĤ¤Òî ˆXğ~ÚG;ÎqSP³ówéžÛ÷ÓdĤ³uއĜîe…i)5¨dí—ßżüym•yž˙>‚W\6*Ҝ]K׆R.hu‘Á‘÷üW'?ŭ2ĉğû%çÜ˙ŭñÓç˙$pxŬndzÇ'İk@÷§ûĝî÷ŝˆž|qv=ŒżúèäôI×uïMÏĥ› EŸMG„Û‹ċ rıšä8ë€äÁ“ZFÌ[IË·uSbÑS¤v)Ĉ(OމJĜĵ¸$°˜ ŒÜás(­ÄüR‹ pp°iñ°&6îÜÜÜàġë×`f°OìÎ6^[—Z )öĈıÈ†İ 47ċ!œP¤ KÔ°%rħü’Ä9aì¤ÁÈOSv.蓛Fv>ƒ¸ì›OMthàí°“ëċIôñ{:“ğ¤CY‹Ç\ ˆ cÜ”Ô g–5,2ĉ†7&ċjÀ@4G#WIwğııY,’âĉ7 4™.6bŜsĦİ•ĈŞ S™ĠdnÔÂŞLĜûè(Ċ0ïƒO€äp Ùč~xÍçg-ȤgLü”µÚñ;yĵ~ŭïûN·dàEÏÊTğY÷ÂĠ ŭĵiİ‚ög-B€3>ĝĵQi1ŞÚtt1}ò/P2¨ Uà4›ġ‡`Ìçf+Zځ@‰˘ŻŞle í’ĠŸYŬ(9`iŸv×&Á"ħ† 0ĴÂíµ…˘!ħ KhRׇÈf}!ĞpwZÑ.mPÎ+ÍvkĠûĈŭ.žßĠó3›Ö¤Ž+;?ŭ]âĉÓİM =sfë+ŭ!‚…4jŒžUú(zÇü€ŸqŸyüöĊĊĠ˙úŸ}ġèĝèĉôäè>ŬŸó­§/_üíÍfó+Žşż àÔ8K6Çħ<žÌ˙ĊşG:â)OT”­cs šğÍY+T6ĴŠ*3–“µxš" 3ëğ+,£°Vz’;šñ ~öÂW=A ğZö×ç™S˘ĵG°f1Ù€ÛÛ[Eöl<şi‚é}ׁ—,§\YörZĜä=À]gfĥ0…JLÁWmS2˘>瞵ÎĈÀġ}ŝŝŜ'ĈVħ­œ’ÊşCßu˜Ró“µhqĉhN°ŞŻÑä#Á]X&ŭġŸ¤£•8’†ĥ:ÌA3?r]<{ħĦŒ †qŒßɨ…_MÓ"ÁǢŒ˜SÙPúĥZ˘éÓíş"˘YĈ†4ġÊeŻòÄ #0çó†wNh›Ŝ:<ÏelñÌ.6ğġ›Mnœ›†!ħĜË—“T1֘ȂYyT+Ĉ*VmxÁÖşċV•¤ÜLN䒘oÙöÈ}ÎĠï—àİrt9´Ħ])éĉsİ—|‰òÎRxžS84e9‚`´U†òŒñ|ïyĠ+÷¸Ŝ5éÂĵÑġıŞ„´­Uzœ\›,ŻYÑŭÂZğ+#G[G&áB£ËVYÖ²’AXß2LïÄġf€y~Ÿ5Íô|Ÿî÷şhĜÖdS–Cäu“=&"e ]×}ïûżaˆĥżŬ˙óŸ>˙—ÇGÇ×'Ç[˙€€îOÀínN‡aúòñîäïÙM÷içÜ6ZmRsJŸ&ôR>&@ÔÙ8Yċ‰ŭ›Ó_lñZ "tCÍä£ħ5Ŝ%Ú`|‹Žy3ŭk0£k{“Ÿr€4ŽĠq!{ff³ûŭ˜]¨ÊqFĈĞĜÙٔÛ €ĉ€>Gç./.#Ê ×ÙÔqïáœÁĊġŜzçĵžĤ ~š`‹%˙ä‡ŭ>NJÖ d+,íÈĜfw†HxÛĜ´–š¤ô^wp‹4B7RÒ FßÜĝzĜ99ËOCcò=÷|û̌Z"ô› Ĥ›):Ó:Ë1Qr‘)S–l2ĤiÊċñMßÇëÄ~š°Ùn1³3ANÈ`Ììëé=ÖäëŞÇ²öÖ´*cĞñžÀdà ž÷— ™ĥ`3…ŭ•ÚpiŸçt=Ĥ‰‹ˆC†›Çíí777Ĝnĥ9HAƒàÌv[ ¤Ï‰ÛÂRÎ9‡£#\^Ŝ &@N~ÌpssƒŬñ£ĝúüñjġC6§5½ $UÓŜZi]6ÓNš“ŻħÜ–Ìç‹Y7Ġex]Ş–½ĥtӀÙĤŭRv‰Q:Ü8ĜˆĠáNi€5¨Ö°ŜçħĦCĥZ WşîÓĜ(£wgvTB^dġŠ,h#,Şx`Ċ&;Ó0ÏI—Ì3˜‹òÙP,-Ĉ$°DŸ ³o` d3ŬĵµĈĜI Bˆ@]~^Žżhvbp5ïñgkAD€Íó‹/ÒÔtMQıR÷tmC #ÈÌá2YĤ—{+êsbLĜ΀m˙%ĝÏ÷bŒùú8ú˙ŭ鳗żŬ÷ŭĠӇĈµ ûŝĝè÷˙Àĵxñâlżm·Û=éşî½~ğ;ëş.ë&Év +ŻĉCïŭ‚AHş„ ró$äĠ‚@(vèġîÒk 0x…í™MúIé<-ìbħҋ„ÈâđšyšeÙ_·f„µ9{­ÑÍÁ*m).Ĉ—T‡š…$-0pŒĈ”œIË a£+â´1ÌMdÚŜ-ËìpÎÒ0ĈóĤDŝF!Çq„I²‹iš@İÔ%Û:FŒ 0>.ŠFفĊë7[qµ@d àÔ×E"–ëŞR%ܒ$ÖJçżyU8 #ĝ{37y•LµYaóaĴb\S1Úéq‡À–ú¤Ià³lŽ;ĸÚĠŠÉ%ûš-‚-^ż–ğE1€ËÙŜ2қĈ,ןìKK´– ,}lÍ*ĞÏ\öh€_ï’ç"8˘ĵ7ĵ``ċ{´R×JFœşêYòAT³È´¸Žíë†"\IğßÈúNÌŬÜÜĵ³é7çĝh÷žì÷Wž=?ßZ{ÑuŬxrÜ?P<Ŭ7Ç׿ñ­³—çżŜ÷›'ğŬî½~ğ;͓ëwħdEl (LÖ Fñıfa. Ĥ~`Ĵ)‚ *ifÛ˘kC\ÔİÑQMĈ4˜ÜSs’ŞÁµöĦ…͘GYsi&K0e@U, ÜP5™DF“aĵK·Öb{ìŭPNL†"°ôŒÍn‹ëë+ïzXÏû!7 é E7 i7 ñ“íğ"#˘ĜµŒ¨•ô€50ÉAÀVì@P €Ŝpäf@Ï óÄY Ò͈fŻ*’R/:ê׃KËĞÀàhfa^°Ĝy£”ĵB}!ǝ“ĜžÚ=Ħ–HĴÉôıëVĴ°bYğNÙżušeÎ:ÀŠ6xœˆ5ıä( GôĆLjôë>7FħÄŻ/ݰë·n‡™ħ³‘Ž÷Â!ÊyöӄĞĞëä,Pâñ5…”Ċ ;Ĥµûƒİñüò°n•x×6ı-°×r1hic3+ŸüÂáCŜ Ğ*JvNĦÇqú8Ëg´Ç a–3Qhkfë40ͤŻħÜşŞĦ7)šÜ¨u™™ħ˘gqßn:FE”öĞ`\ÖÑM§ÍhHğ s›ÜĴÜáĴÀêŸ ö”VúgèZÛ­Êĉ­T|çŸĠMwfµrŸ* ‡P€\ŭ{ï[î0óo³;÷#]ŜܜC_ c>k\˙„yúĈ~ŝçgÏÏżÛo6ûӓÍ'Úİáèŝ ŽŻ}ŭ.0îoÇßĜn·˙èèèÔv";' ymÂü„´È’-jĤ6³Z,ĉâ‡ZÄş şó™ÄoĥÜUš•ûZçĤAC‹9 ׋Fĥ‡’ĦÎċ)KıŬYÊ šöÓĠDĠ$“Iڒ&#×ĊèßËŭ-ĵ÷8ytŠçϟSoż™š‹<œók' ú4+J€j¤Šç5¨Ĉ( tȲ…J!e7í‘Ĵ7 :Á.ĈijĤْĊ8‰1Lì°÷èĞ,Nġ½éĞT³úŝz”úl­ı+@Ù,Wé„ ë(ˆ˙Ÿ5›ÌQşCfË+›,T̚\iôŠ÷Ë>Ï&aal]Ċ‹öÙyÓ$Ž ‘ç`ÛŞ(d DòxVC.ٓE'…wŜ~Ż^½Ĉv³ÁĠġuŽ26Ĝ‚’İ̉”ĦÜ`;ı–n`W[ ,U›şTÀìŝà!cXôç­ó)€”–p ÈóÜÇëÌc) Ċı Ú bŬîú p5¨Óq·µ­V+‰PĈOdnıhĤÓ‰:í ˆ×Üù=ÌAFxiK]h$¸dĥ·cĊlJ“ÜŠ6úW SĴ/`„‰Ö7W™:şÉĦ„µ¤a „×ì°ŝûùsĝ ´Ü~ÚèTàwòl3ħnöAfħħׅ g! Ì2ĝ›óïûŭ?{ŝòġ–ìíٓOdÚŭ Ž>úȝŸŸ?ĥd˙ħíú'êŜëwÛ³ï`Mµ¸ƒW I.GU `=›XJ‚„۝RU4( S*ĥ ódS³‰¸è…K—]eÑwì63Ż@”€5ë!Î&ï _Ê<ÒePsy'ۗÊ;VÎɗ :. ![M9ë0 %ĉv? èş.†L”l­ĴsxŻìȅux*Áˆì%˸išòûÔċxŜşÂ2L4€>¸ì9Ç“1°›Nôfӕĵg35ËħR²ÔÍc>„,jXĝ-QNÉ+$à€ŜQW ÏŬğJ™ŠIÒ˙mİV%u?2cFF˘£ÔĠ˘B^[ĦIè ݳ…µ”j\²“Ċ<{ 7·èҘÇğŬ1.ŻbÀ‰Úèxï£G/§B@LˆÉKú9,QW*3ß1Ż:,,˜7­Q_ h³şa²ĈÜe·‰–l€—ç*ÏÈ›nşŠo2íÒĴ~ĵ¤. &êk7§äùŸÀìIG<×`Xwŭ³­6 ‘ ËóÖÌgËV­Ċ\.œĴikŻyÉ~şĥwé\ׁ9çTí”Ğj f•Ôzz_kĥšá­ġğ'ñŬ@Xżn ĝ.^+ Ô µuğġ÷ÍŻü+-bC ᄁÏnzóŸxĉÏĝB0˙׳çŻŝ7çÜĊٓO”5Ùŭ1>ĝú£×çW˙ínwòË]·ùÏl·95ä¨ßm°é7…ݤîL,AÍS>À)c—Z.}JLnn sWbL*Qבğ™ĦÒIWŒş d ìԘò˘5Iƒ°]156–-Ù_­Ÿ“Ê\֍cï–9ö¸1éˆóüŜ9‹‹‹kÀ£G§Ĝ{ 7·8Úìpuy‰“¨£îzt}‡ÛÛÛ\Vë(.vġŒ¸•Áޤm…ä}ëÙWÁêûi ‰‚Q•—lÎ<{LÓĴ5tց )a€£ÙêjğŬÀ….ë 5ĊµÊc DçŸ.~×u‘YKšdíġ[0蘵–°Ĥĥ}{L7 d ĈÙĴy툳ÛnvŞ ˙ ,ÑÁq˒KèiJ Š‘vnQ67”jZ²Ê­ĤĵùYwÎEijܒqK4WŒ•=ı*çëĤ.ù7UO<`·ŽġŭÌċsĜâğ³ZŠı6½›ÊÚi˘ĊJŻħÏ30/›‰ÂBïj×!ġ[Ž5£Ğ›Íâû›U {×}?|ï”-°ÏjE=Îĉ„ÊÔC°ÎC!>5Şê²Ô%ÊŜ ìÖŝ€żà­í~išĈñüċċo[ÂġٓODÚ½çño~Ôíy:ċŭĝ?ÑĤûoúŬ£O9gëû¤›<Ç8Sr)Bváş.N^ı‡Š)‰ċGñ³eož&}ü›ÎPܽOœËRó‹O“u“Ô%vÙùÇF'†÷`S—|ı1F¨V‚a0,£l‹>(Ñ糞>ÀpföH%Š’èM'?k}§!–Ŝ³0°İÔ\vçk/ĠÀKÍ/Y ?ùĜ•/f“& 9 Ĝƒˆ`­Íòŭ~ÀÉÉ1ü8bšB˜`í=ġÓ;™Ñ9‡1ódĉF‘È0QögġÓ`Ó51 l2bpB-‰@'ġ’%q.I;bÄTdêÓ{ÁOɏÑSÒsk½ĥ4݉O°Ö[˘"OdÒÌfmĵŸÑ7é™ÑY`FllWHú´IxŠ t62·&ÊÎÄ´0NÑĈĵŸÔMk“ŸàĴȳġĠ5vğ°GßoŠHÛVıY~Ż™!aûnƒaáŒĊä=:rp½Ċ0 èĴMÏ_b…Vœ÷3ó5_$ :ÇZg-nnn²ĞÇĠù9ĥ]‡›ĞëäÀ L£fw³Á0Ŝâvô&Ĉ4ÍÉZ'— 6vöŻ–(ğâ5ôžaĴ5.Kg&Ċš;*9Ĉşœ 'Ì)R8u‡€ Ï´€ïjq/Ó˘Äv,z†’ܧÉçTHwjÂ7Eg#cĦӕ͔ìwrÓ`bç+ $Ï`£Ç4Nk(žċyŝĥ&Û=F‚-d _÷%h+ÌknĴ]éĉ.ñNDI½ÙĞYzJ6 R "U ³iîg.íäŒ!P(@h&ÚMeäJ´ıì-†tnèryĞR²"í(¤ĵXIİÉ^—·ŝ\"Š˙3†’·‘×ù…£KĊŽĴ:çyşşâäÙÇ*NÚĵ¤ÒħÏ ‚HàÔ ˆK@”O9Ïŝ]Àü—Ĥëß Œ0ŝêĞ××ï8ßn·ÓvCáè~BoïéüüüìúvĝĠÍvû„Ž6ïu}wĉ6›˘3]4KóD“<:“½7 ҁÒ0ĵU*.,˜VËFEW²b™r7xcâœefn–^–‘IF˙kR>ğ÷i·^bc-‹žx$Âĥf>Y5}…`Ĝ,ÑòDV•[ó䛳lˆĴŸĤè`C·‡1—xóÍ71Mvŭ&†sâ·{ 610a³qöcRˆàiÊçJ ‚ ~n0!5q$ë·½[63Ĉ÷Sĵ}JÓ4a!%ê™DO°Ħ,ğËĤ°™Kħé÷ZޝdÙ9…3v^T֚”ü,É0d€RĈìì4"Ë1ĠämŜLŜ̈Ġ—s䑵ıqħu^~ŒİrÁ—ŽŭfSĝ"“4–ÊĊ”'íx×u°†Àïw<7‚5Ÿd:d-./³6_dFí>…†ÌqĈ!0.Ż.`@İr ×*œÛì‹R¨÷~ĝĜ”êŬ"!ƒYÛLK[“Ĵ´€o3í‹Lĥ:ƒ]&Ħi†³dĊh^|hŽÌlR‰–}˜,ù†K ĠÌd+]}ŬWıÜeġ“ 5ĝcŠóçÓŬ×ĥÛ(éC­/6&>ïm+ëÂà½:Ĥ%Z\§žĠ 7ŝŜŜĥµ\˘Ö¸ŜĊŒ.C1îĴmÍè–>·ÉÚĈf3İ–ç7bqL–Œ´Ĝ’e7˜;li–›Ÿi;ƒŬ˘7ĈÜ)w™ UÁDşĦ‘P‹Ħž`>cœù4€ÏudŸLÓôáĠġġo|uġǛív8ÚÚ?u€÷èß˙ÁÇĉG?zzôâĊ‹żíœû•££żÛ÷›Sç,9ç`;—8œZgšËıĵŜu[[ŬfÛŞÁ³î–]ñ”}OQrÌ yÔ¨Z²ÑË–Û ™ì:ënı4‚˜“85<µ'TĈ ŽäğµtƒÙu!•ĠK‰úúêR¤–O Ĝ„î…Ĥ–'jV =7R„ìÍ ĈqÄĥßàââ'Ç'Ĝív¸£fİ)¤˜ÊŬn‹a?À†“œŒ‰ §nÚÒß]²ä„M¸2NĜóÁ2ħ”·xJMP‰I–˙ġĥÜ@ ³“Ò:ëlĝìKÌE§{ħaŞ&~-}¨;ôıꎛ“tĵfĥh >ş€ĜäF0•ĥ\µ³4HĉX^}—ż]!Ë ˆQâ’M.w–ĈĴƒ÷ çRıpò9)JšdaqÎ%n‘8gqzzŠ~ps3>`ö¸‘ĊfêĠKt]‡ĞÛ}är ÀӜ†e­Yy>şôŜ\xqĉ1A‰]ğ#^—’Î×ŭ|rµôĈ6£é0ÙÄË)ÖFĝĦħqÏżÏá/&>û’yΘÍÊMşÇ*ÀÖĦ!€PÒ*°n­Ù)ĥÀh k *ħ\lşÇÇòû‰d£ĉâŒ1%6Ì ÚÒĞöğ½ğDżïZ eóZÓz7›Ŝ‹ïħ-éCëï˘ġ­hp}ġ=KĞ6­5/maŭĈ)b½%Ċmù·ä+2²‰êÄÙug]&C+›NŜÇËMCzŜÀ™`œ{²ħô‹8|puyùOŸżĵüîn×GÛŝOŽ÷è6e ßÚüà?ü˜ì?>99ù/şû´£nŬzl6}´KR ĤfĊĵ*!èÒÉĵk6KĉjêÑÎ ÖĤ²„Äì*_Ŭ˘S·btôÄĥ°é‰<–?5ÓÛNXÒï½?CÁvh,aÇڟ‹äĉàzĴ)]ŠÎ€ĤZXf­YJĥc]”•„Xŝ &2××W8~ëm¸¸¸ÀÑÑn÷·1öĠFÜ]×cÛ\]Gäfè­JÑĥ*™ğ[caĜg€ɔë”ŝ•l‘Œ”µħʲ(J&x?Á&;³ë°÷QŠàiŽ›ùÁ8Mq’“f,žcjE>À„,Ö4kJğ-ÍöP’5˜ĥ ç„iJ%K"xb˙&;ì˘,jé{kĞşXTĴoL…θ•ìxˆÏMğêÁ&F^§LŞêh JK– ™2ĉsÖuÙóùqż}qqŭ|üôù˙ÙwŬĠg§?ó€÷èŞ£ï|Ïzùòñġ0ŝ÷ğ“˙|Óïŝ €·ér7ĥs ™ˆäaIÑ"!M a€ *3%oĠDœ4—A|LJíQŝ„uCÜAI'BÍ.ê:mJ΄ċCY°yš:`!&ólŸ›PL Âlm1İ}_ÁC‹r’/&ŻÀ˜4H‰|ARĠdò°dáĥħ4|s³Ï:ÇĝŒŭÍn·8z|„ŭí †á}żÁ8ìħ99ĈĥßEà8ŽĈ œsÑĦaòctf kÁ‰ĠË,‹g0{8¸bq!ÌŬÓL%5.`Ñt7 ÛE›.{? !“Ÿrš›s.3ä¨D*ŽE3I²Ó:T%Šqʳîe–0 `ôİ™ËĊFŻk §;[™è.F}f˘|bÄ£ígĥŜ3)™“s…$™Ċûï %vŬœĜ4ù)ƒ\íÓj“ÌŜcàXž˜3à0Žà‡ ÎQdwiÖLÌ0HûĈZĸ<ż‘Aß÷¸úü<ùä2.//ħŬnâĊ‹Ü°ÈÌq3–€53cšö³>0Œ“ŝ$ħÊĤP/K`|Ù@XYñe¸ßJúš“ù|SĈPƒE™O„Uœ?§džçñĤ2 %OÚs /XCġı!pìg-d}-éEÉĝÒBĈ%lĥTSLNĠ£{H?`4eJ:ÖJ’;$?X$ğ%Ŭ„ ,…²&×Š|YÊ ÚÒÑZëé{,’ÊŭĞÂs“Ôĵ×÷Z>ov>ñŠÉ-›€i*7żoÈÏC´Á΢ùyS–‡seŽĠw,7I­$9¨Í -B9L~Ì c/I— &Êyĵ•ÈĤ=t‚S.= £K4{ê˘”|$ì°÷Qž ÚbCu×ıŽ@Nò°Ûíâ˜Glz‡§Ï^ ĈéSĵ|ù2˙ë:ÜÜ܀™ĠyĦ#² \!ßSN.)ZÁf|tş\ÓúLÏV ˙kF4ŝÂɈuchàóÌckÏöZ@Ċ}!–ŝsD}˙5Ĥğë %ĞšYÊÊËöy.+soŬpİ+(Râ6?ĈuÉê|߯k„ÉŞóIJllƒt l£‘ IĤ)9ˆÀ°méuŻë dMŸÚ“1ʲ~ŬóĜUšàF™UµNm>Ó\ƒÜċ†c‘çPéÛÍ2ñ´”•N9ċÑ#à3ùŬëŜĵ÷_}úìġûdíùÏ"àŭÄŬ>üf2§ĝrç엎ŽŜŬív½hCɸ<ˆtdİ,úES@ê”Ôv\‡&qímÛŜésĠF‹ĊJî· ÚiEóƒıaPR’RHZIÌ1T¸3Ô½98ä‡ğh"I¨xĊÖ R‹ĦŠ“ĊĴċÔ 'MV0>Œèşhn½hàûÛ[\^]aÓ÷¸ö¸¸¸D×wöÉÂ9›š—“Ÿr@ƒ„^hF4p€§È–8ŠÍl~J@ħF ĞXl1İ YŸìÙGvßĊŬŝ4M9ô€ƒ8Àt&şM¤ïB@H~ÁÖĈ(­sÖ]gŬ ĝ˜YxîĥÒP߁SŒaÎ%=х³÷Ĝô}d&§1y 3ıäıl²^u™ûÄĉšdŬ&ÍaÒ=Ż5Ŝ9),}OcĈqÈMx6ü ‹+ Ħò[Ŝ/^tûïżX›*s ّȊšñÒdA–²ĞKtiïo`;×ĝ YútßÓçĤi|2 ûŻ|üôĠû}םżqvü3x?ħ@÷;ßŭ}ûôċëǁñІèÉîd÷ŜĤïÏdtÙ8ŜAä °`‚.k™Ì"Eв´QƒµZóìNµ-U.EÔYì+;Z:P “áC ğûÌj}qPğ~mMÔÒĉµvÎzW™mVT)ÏšÔ ”´ŒÁLĦšxÒD9ù)3~š°Ŭna­Ċxs›ŞN]×#Lϟ=ğï xùê%ŝìŸŭ³ö.Ż.ħÛí°éûdSDqšëĦÄòêf(°ÈV\N…Šß1ät­r£â›İZĊġQ‰]‘eŒüug ö··ĊB$Ġï···è’½°òZדİm³‘ːĴ°›qĵKҚĝ§:ë`áúúÁûdÙ¤˜ĞäË pë§K@žÓd$€40cbĈv³…Ÿ&ôŬn‡ĞqÄF9Hd´|OÛ’¸ß¸ èşûaÈċMц‹Y`Î÷½fÚûĴ;·6Z˝<êqsĜl"(>??Çne/ççW89>ÁĞ׋€ IDATŻWWW‹rmàèĥ`ĞäPÄFĈÀ~ndT ;§Ö ˆu¨Ë şĜLĉçŜÏ5LìÍE3 ìÂùAϑ-†z ˙Iù:™B²QğPĠĴY÷\pàU°ğ&gŜÇ-Vğċcœ7ĝÚï0û_îvÛ/9êĜmw§›í–„‘ŠŬÏqëÒoL$+ğ5€žj"ëħÀ33Ö:´íQ1ùЇ-wœË˘,¤ÈÔvN\Úב³ Ĉ"´MĴÔA§I;Ĝ 1Š]lQVTëŠ~UE=ı×]ÊD6û°ĥÌß €˘VÓQb8Áèúż˙˙~„ó‹—è ·^ĵx15d9×ǐJŽlÛoœáwŜ‰žŞÎáí·ŜÂĠġ5Ŝ8{#ÚYM>7–í‡!Żë£ —sċĉaŠŸÓ§Ô56(Jórd£"÷-û×…~ıˆ‰NZ_c˘Ĥ1”š„m³0Ÿ­‰R>KĈ•|‡ŭ0 0g.=FëHg)o (×föù{’µ€,_!zóJ†>a_óĉR=†(³Ñ‹J˙sÎe€›ŝô=ĊGX6Qšd -›%Â~w]”ĦLSnÎË÷rœ°Ûíà’FyöYsû£ŭÛí···ˆÀQĞvqy0 ıƒ{‡,ıaï˙{ïŭuĵġÖÛ¸Ĥ˘D Š’ gBS– ]–,ċ| ´ v› ’h1*çÛ{¤·`- ­1ĉîó\‘ä÷J~Öbß§ßżUŞ_ûœÚßÜĥj µ“É" N郛 4ĊïNoġ:í£÷![7Ši²ġġXûĥŞ”à’=µ Yĵ²´?-֗ĉĉAùùV1Ħ}{Ċ…ÁUßm*ĊĴ]‰ñ51ŽŬË&MU“tSï˘Çċ{Ë&&RúN‡ĤFH·ÉÏ qdÂb­8ôlMc³Ùqé6‘)Ò;Ëlòû2‡p„qú3˙fàŭÍĤß8;ŝİl\ûD1şßĝĉ·şÛÛñÔ9ûċ~sô~³{ÖġÖ9ô]—Zn?¸›*v‚˜ÍuĥeUÙ°(V̇árËŸ¤7Œ›wΚılV›“RZğ͢Qn uÉUûƒJ“œŸKLd˘uW~Ĝ=g˙R]>f?ċ2—E4­·–pu}ËË+ĵùĉ›¸ııÁÓ§Ï ż.ŻŻo689>Ĉíí† vğŻŻ£F³ïöQba•œA,ħ tÔİĉ§ÊVE,3P`½İY4íi°™b‡`Şó­], 9'=™ğë÷"#Ĵg*ۛ;7~YĠìY†5QŒÉGvž˘~Voh¤á,/̘}PeĴĉ˘IQ—ük7]N€›Ĥ ŭf“ìĈÒfÊLÙĝ˙cï]blIÒó°/ŝˆÈ4ÜÁ<ħd"œ;˜,˙ ÚÜ2'—ÎbĈDdZÓß3~Ö"; N5ÁX`ĜY6ÔLnù=Z3ˆuq?ĝF6–ßE)+;nÒ)‹2ÈOfšO,Xd€Ó²‹ñ@Ñ£3ŝc"ÙĠ˘¤ĈĠhk/­…$‚ÁX1ŸWùı3FÄ.4ĞŝAô !ŝsÔĵzŭυğż,:ŜŸz ûµŻc{s÷Ÿ1Ĉŝžâ?Ü^]VUM.UœŜĝħˆù& Bà˘gĤ'ĦyŭivÚd|~$ïóï˘\!{0žÖêÚbANġĵ†‡ä' RVcħA˘· mXċf—>c!)‚ÚÒİÙ =·QŽc’v¤\‡S:çÈ^ߤ-u( c†8VJäVċŸÑÌ R€ħa·Żnüí·4 \<Ô³g×ħÁʜldò†~paoNKÇà¤Ò6ñYœÛŒc=Ž lAKÎp]’OIeéÈ?=™-ħöc˙tDĤ•‚1‚+àäÓ˘ÀÊñVÈŜuğ“1^`*ÂżS}YxoJIDxŝŒüˆWÛ8Ş ì,’ JöŒÖñ~?c U]{9ƒÉF‚á=s@:İNfŽħüç˜&+˙ÌÛS‡Ŭn‡ĞËK'<<>bµŞĦµÁ~ôCĴ/šÈ@›„ŬKF,Ô ĵIΣ[ž6Ŭf–oÄá=ÙÈ}Xxçòp—ÀmÒtĈ,>gÊ(²ĴÙıFXö`—sGËhÂLJ–ü÷8iH˜Ĝ;až”3p_‹~.·´|e<[– †ĵıÈħı}Zœ1ŝÈ%]İaú nÏscòüħ̓żÉŭԛÑ΁Ŭı‰ü3°ŜŒv~*ÑĦÔÌÎi{ßôuÎħà#‰ÄĤ6Ĝsç(ŻŻwÙ䇲ÇHËĞĉ“1ܽršËÌ}“ä¤w|Èc.K…8Yk+mÌÏc_•Rg­ŭO´Öxs·˙§FëÇ·_\ŭ…ŜŸZ ûÍ?ùĥÜï÷—˘^ŭ·Œħßjšĉ%—Bhg!GSo0 ĵĤˆğplò‹]Rƒ¨1Ġ^…˜/£M³Q£“š.ĈĠ8.Ì×Njß0×6¤ó Ġi~YĤû‰àÏ3ÄĥˆŻŠÀIhĥ¸KîÇ„ñ{²úŜpÉÊ\ğ0ß*”çĉ›—NŒyq à0jz}·x̰tgèLçŜxĉ(<~? è´ ÇĴó˘[@ ĉĜ̊Cu=no Ŝ~ûK¸ĵşÄÍÍkXkòċK(ÑwšĤÑU]ĊçOÜKF|{™KûP''ŽŞwŭ4UPĤ}´ÖĊÙYk‘ËÂû~66ÚçàXÑÁşR ܳĦPc° ‹P^;ħJ•òZVœ1ìN/Z Jä&ӑĤ‹w`wí`<Ğk2)Gx½}×E–:Ăġ(ċ€Ï:é˙ͅpÀÒZèw ğgÑEòŝ:mĥc‹ċjĈ€ĥsÍyuĊ°?ôèÚW——èúJi<{vŬn›ÛÏĴöh­!à²s‡“‹›³Ş‡àVı6- X_+=‚6pîF!âlFżÈâs ÖSLX 4&ŸrSM6ó{Óx&ë`éµd‰Ŝ“:̲áÎZ°İN8eYÓ_e F|Íİâé\Ŭ‘I›~o‘/™ï° lÚ Ŭ³Jñ£)I ;…ĉSVÖĤ‰„Ċ÷Ù³Bchż™7p˙ğÍ,Ĝ-Çö£ĥV/€ĉ1ùÁ eĊ(!r0ìÇ<îë\a[K#Óž¸OÊçW$ĉ¤AÖ`Ĵ͒)Bg!ĉÙ/cßC'•às[ÂŝìŝaÌÄ÷…˜ûL`ÏoĴhM DÂ}oğitA‰f1Á³ŠÚÜûѧšĥ…÷È+ ç˜ı“-óFfĤUñ}6|ċωCiÄÖŞTjZĴ„XC ֏ħU”Ĵħç„ŭnĤŜáêÙôîğĝìÓÏ@œËï~)2zÁUÏɁu•É6Üë i Žu&7â"0О­O"‘×aê`-P°Ö§!q¤²XV—qsĈG—ÙÉH4D¤µmëX\ŻM' ŞëQ€QK˜U°\“£pP ÏÇè`h“¤‡X9clÓ’× 0"0ĈjċPîÑv]Œ Mn!y"TËâÁ‰ÛÑlÉ ‹†Ôŭn­ ݰİöÁn·óĞgè=ÈŬĴ]óŭŬ; ùzèa@֍*C<”—F$—£K1‹sCLıˆl\Ŭġœ)+c= fFožZpNOğ¤ça*ğ*YÉĴê|ĉ1µ]6q•Óİ/òšÎµMV˜]Żç$Klä›ŝySq™ÏëbĈfší2)Ĉ‚IĴ`FçÇîO=×ċ*é?۟²ÍĴ”ÌI?ìlUîüϽésLÁïÈ@§I~ŸYÓĈx͙ë”óQšP6Ê锝ġż7%Â?İĉ7°½)‚â9iH¨.Vƒçfİ1%†ap~/ûSJÁ(EZ›k)ċŻ+­Ŝ#Ĉ~MÊêÛJĞ˙ġÓÏîvħݏë?·¤†Ÿ* ûo~Pïvğż*ümQWżišKN‚¤ĴÀ½;ŝÔı¨İĠJ`hàb̓eŒ\'˜kĞJŞP†bu·bĈuÜä~Ħ 'ö`€JÔ,.D^˙ĈùB<­‡˘ aƒËÓDÉBĥùü[ƒ( Q²"sf$3Ò×Lvá}‰‹‹>[љ²#İŒ#>šFjċy&“~0e0#…ĊAXŠZżùf†È@r°ħŬLXGpŻ3uŸùfĞapûêRJüÌWŻ_½Â‡?ü~öĞ? Ç#êŞBU‹¸ĝ„q´I êÊN­ĦÏVúĠk`Ӗ›\ú‘×òĤĴİ%W³;Ár˘²› hĤ#ĥĈĈü]2!“ĊY{ òyxŸħĝĜܗpùAĜ†ƒŠÑ&´–ùÇLǽaĴАJCcHH jB\x<ÁĊxĤ`Ù3ëĞşö2Š!šÉ„`jħħlî0$âó\UMl˜#ĈÉë­ñ—oápìpl¨ê ŻïopĜíPUúÇáxÀŠWPşG?ôî0C`ŽîÚ6+œ/äj*3jp“û½fĥ8ŜŸ4f%ŭĝiaKĥɅĥ™ħ³ ëWZ¸“ëÄÈf1£qġ9Ïá} Ùô]ĥ¨K_pZTò ´’çA.›1ލ†1k-ÏC÷J`Ì0ž §ïUš22ŜÎË'ÜDYd&$ÌÈJvöFŸ}*Oȟ#y3œÎ´½é¸Tè§Ü§AJIŒV¸ UħÁ¤Q[|§ìKZ>²dsñ·™Ġ°Ċ dfԖl°?çÁ@™C 3ŜÎ=NX"ÑlĤÁä)ugœM6²,]‚'Z?ż QQÂħ‘9FûÈğh,‚Ö=ó§ßB7œ ÷ħb:šû¸M§Ó †€ÓnCßAÊMŽĤiÀû˙çϟcğŬú ^·ŜzMĵ~8bµZı°•1 mĠ”ċĠ:ĉÒ ÁcUnĝLÂ{â§Ói²8Ċ8Ż0bÔùAÂ5kġ¨›UÌ|€ZȘajf”h‡>ĉ—9Ğ:´iìY%s!₏YµéuRI™ëƒQ$?(ŬséÈL)…şâ{TU5ŒÑñJÄ1™Ŝĉ˜!ġŞ‚R&fĈ€ñ„ŞŞAÄu½û9˙şŬ&ΤРè`·; ’MSĦít^Û fñùçŸI´ ì âéx<àt:Ħë›Ğ•BÛvñ w:`}2E D…àèúġŝmüâ/ŝ"şNy—µûœŸF"Š8+˜iĵĠ’D3Œê\Š@ùµlmħSY֒$`MċÏÇNórç֍r=)×Ĝ4Kz ,2bñZ e(JEku—\š•ž~˙\ŠC™ŻÖ6‘FÓ÷,ÜĞċk- s†­0^/÷ħ’M xaµÖĈÜ÷X§mĉ£şÊĝ;ĈDVp³dž˽҄!³ß£Ŭŝ,ҏڽv b>:ꤋtĞ’6H (ûŝ9à›ÎĝxĴˆY Q‘Ĉ&@8ŬĜbŽ.c,ŝ̄lL&sbEc;<÷˙)>7YHAx˜>…÷*Ŭéh­'l²íħ&Ú0Ĉ^+Ġ˙1Yŭ‡€ù§ŒħÇ?ÀûËè~íë´ùá>ŝ[›íċ?RŝĈŞ^]r!ˆK‘ƒ—?<Œ‚û?]XÓ<;6€f R0äÄZ™²”,€YW²(­àÜX.8žƒ9ĤÔÊÒBµî\ӍĠ€ġ€—ûĤ·²zxb†`£)i.Ğ0 ҍĠX›Ċ¨ıx$îñ àÛY &Èj8CĤ²,cۍulupxçžm—µÈ†F³3ñ1…¨7[ìw;(XĴêœW£ ßµèÚ÷÷0ZòòMÓàáŝŻú×Ï.Ñĥ­+†P6˙]Ĉ>BŒU0w}YP.´î÷çĜĴ+t½Áħ>7½nÂġ áÛÒȅ{)¸‘;çcÜ÷TùKJG÷ĈX(ĠĦòú\&ĝlŬ+cÁÇ"Š`c`̵…Çú!ž™ƒ|À$2‡½‘BPaœ#ĈÀ„HŞĞ“jÊ÷Ĵ¨Ì²Hŭŝß=Ĉxmi7…$.ŽG×DÖ4^½ÇĠĠ5ú‹ W)…Ġކ>²™”qžŞZğ“Áñx€×[W2r8Ôu…é€WŻ^y9L…a8âááœ8şét R’ŞÙT×>²9î’-´³|ƒîĜ1 à!ʀ ÁpĉRΎPüw,”HGóEsc`0³Êòâu‘/ö˜Ób3FKSxÎ6vi-ŸĞεĉ|’@QYƒé´” ĴD.×Ür=OY0·16/ĞßCdŸ`oÙ¨ĤYğӂ…ĵË€K\e´O4–œ8)W— Ŭ ~ĵ]yI…†Ö@ß÷ "Ô^çıÛíp:î—żŒ·_ĵ…››[G\^]&’§y’Œ<ÎÌ5ô=„rĴrK…çеkscĈDkÖkF™ _D1^?RJ×soTÔ°´‚F­31ëïÁÖ:°j˘T<TòƒU4ö‘;X>>­•{ñ̙´1X­êL'žŽı{£b°ĴêXıĞÔjŬÜ\̚Kħ”Ês„k60áî{ ”ÒXŻ7°Ö ëoŒŽÌp× Ü%0ô“žÖVi‹ÖëÍŻĥ¨xœô„sì;<>>b½^CéûŭĈhmPI‰Óé„ĥí˘î—‘ñže3^ĥÁŬşaƒLĈ‘1B? “+ĝC‡›²è ÈÇĉ :]*­YΈ ıǙdfì.é4—ĉ“!‚Ĥ‰.KRéJ–òÂËp|6Ñşk3JÖJV2e taŽXHSNŜ¤xŝ âÙÚÒ71w8) ĉ™n31¸D„äcnż;,8}½Á—asC ²ÏibÇt“ “™AĴ-ff˙‘&o 6Óh3ĉ˙>|i¤‚cLvͅ#€ÄD×ì^‘äږ`q0“ƒ¨›âÌkĤÇ÷–Íâ“4Ua4sĉùşcŞÂòû^‚Ñıʒ\è€N[Ŝà_ċİl"­_ëôv×Äè×É÷ókZÛއÓ˙üég÷ßüÒËëÓ˙g€î÷˙ġÙÍÍ͕Öúw·ÛíûŒÑ{BˆkQŻâ87²ħžĉÛÒ 6ӗ̜¨ĈĈ´~ÖĈ›tš °Ĵ•+#sÊ?aœ=ŽìM,)ÑF dY— ċ„QMËéž4¤ĴâŭÈ9y°f‚ñ‰†-0ğċ(*kIâ|Âh§YÄĵ´ÂGF„çë ¨];ħÒʟd]÷ L—Œ\Ĵp17› Ôu…ĥmc$K`A‰ë W ÁÍÍ öğ^ĵŭ6†~ÀëWݳ?óÀapëöĦsÀŞ€ˆÒ !DÔĤĈÊ\˜xÓ+íR¸£Ë¢˜ĝXĵÁ´VûêċBv.qÌ*)]ĴX”{0FPĈ™ğˆğÜT÷ˉg:Ú pĵ]ğ™{ÂgÙJ)öYÙÏĉ,„k3˜êäB IDATèìšW}”·0Ššpw ßËÇò—öÔ3?~‰Ŭî)“Û4‹ŝœ€ëmċ>ûC‹Ġj…ЍÄaÀíŭ×××PJáÓÏ>E]ĠhšmwDßuĈ¸$ŽĈ1Ña$Ŝ÷ڍqrŒTŻa­‹7 éÁ2€˙ï1ôƒ,î:´&o#ßÈ,fïÀ腵fD—À(m"Ì ]†bùC şÒß;§W]²°˜• ÌħĈİÑËǢ–Uħ˜™Ì‡òwy.‚`š˜ûâÚв·éÚôġÎLċĜ´˘ÙÎÔÉ/2فÍí){žé|*‚ĜT YJrr]9Ÿ-”(ÁayˆšÓÜ΁Ù4µ!üÜ\œÚP.uÓi2ě蚗"ÛÊFFo$$AtYqñ7ŒĤżĤ”ú5côżĝ×~òOj‰‡wß}÷Ï,iĝ‰şôÇԟùÊf³ù=)êßB\6MCa$Näœóñ„€ùsZ+šé­"‹Ú²37ÖıñŸvß䁅È@]%ˀ˘›>mêħ0@?–ı²ü÷jmÀùó3Ê(ʝ0¨)@gÑBˆż;ġOëÓĊƒsc Afr3[˘l̝28á=Ks.g œEFvòû@SfĈŸÁñ+Üğ?óMÂd,%€Ú,ÔX­V NN-˜ĥ`rd)‡†aÀóçÏĦĈŬ-6› vxçĊKÔĞnoX­jH)À9P ÜÒT„mŬ@è{ =u„P%P{MĞÒ|Ycb-ĝ<­×àÀÛƒkH+ ‰Q áġ²aBA 4‚,9SŒ ıĉ2Îa4›utƒër˜Ó ùqĞ5$œf”àu³ž‰&<˲DĈÜ×ҍ]§Áô‰Nù4ċĦÂ×ĝê^)`€ë]5Że%!EAĝLŬj#Ñàqw@Ó4xëʕCz Û |öÙgèûۋ-şCÛĥ0FĊu°ß£NèûndӘ˜2 °Tß÷>—×ɊdÇûÊh³È‚ŽÉ$ËñO)ûŸ/XÙÉ;lN_›T,ûҘÀî’Á¤ĥöMö‘a6gü ġğ%ğÌÄK %Ë]JўŠöZ›İF·ÔΖŻ#ĥĠ%ïMšÊóĤQ^sZ°ĉ ZŒ’MĜċ×l Ÿw9ˆ"íÜéï]“.½•2?udŠšĈW™§µÑiÚxàáA`5ıàSé‚~Îv_<²àœûÉ\Â@ĉ×ócKòy“Ċ@^0Ÿö,pNÁĞIbĊ–@÷hMèTrag g#HM%à‹6KÇĝµ3-u<‹`A0ŒÈZ³ĥÖüûŒħŸŻĞĠŻtíŝ_}ûÛßŝ'ż żp˙StżġíïÊÇÇŭ%qŝğ›jó7…żÜ4ÍEp\sÏ Ĥ£ Òü”žÈSĜڕÇÇÌ-„ç‚ĜF³r¤?UHyÀ¸° Għ³ ç\Ehşè†×ñQw뙠T:t~0.Ĥˀ DŒÁ˙!cĠɰÈĵh‹˜ûZ.éÈoÒ —–mÛtáö:^çàgŝ9{1oş XN™ĥM=ŽH‹[ >âx< ë{Tä^żÑ:v¸â ĝ×Ü6š‡a#†şŞ|҆Ž:˙‘ġBÔèĈ‰s­‡È„ĤrĤTÓyŽE}Şb *Lt“ ĜMuµİû4K-z&Œ= 2çbżÒˆ£ıêßÀȆƒÌ9F°Ô2ğď IEYĈœÜ-cw1˙}drïŞVíÊâèp‹ÏÒ$ĴĞ1´0ÒÇB†5&R²ì{#+éĊ4§ĥ<€ŻĠƒ4X@™5™|˘4gÍċçŒrĝìeXGCàx/8v5aé+RûsĊOLXçߢ’<Ž”\ö˜7›ÍħâÖ>á^eİ7T'˜‹ñ…_àÏ\ħĊ’,´üZÊ*OŜ³a–v0\[;üş1úWTßüĉ˙÷żôK˙Ŝá§è~çğÒíííġŭî·WëÍû\ˆ÷Öëġ”0rİ Ú˜X‘ë/zCV#=• Ğën dvĉ4^Ž$̌f–ÍÍĴ5Pf̟ŒîgG S6"5[¤ 2[LúߓÑ\³Pjn "J3wS[06ÔàŞÏXµ°àÛ'"‰tPĈì8i†ƒ,"ž°µ á´­Vƒ—kލc’ƒgŽqÏ̲1ş,Ôè†dƒĥ#TœbKYß¸Ì` h ÇâK. ċ(U`́=ĈMl=sÛ(Ï$ ŒYÁĦ˜‚#ä%#2Ŝ•7§ô}çX{bh\_à“×÷hš×ÛpòÍÂM-ÇŬŬúÇóçÏq:ùĞOAŒĦ’UUáöö]ô€•¤hDSÚûï\c˘ÏRÀ&.ÀBÄÈÀ`Ĵ ²‘ÀŽğ x'df4²çÒÎÚñ~³‘‰vı°ŽŬÏÛÏF\³ä787²?÷|‘ċ֚³ímQšÁĝäÌ˜ycf6 µ¨£Dl*éŠëtħŜ§à³4VoÔÎʆÉ9 F*Y˘$(—L k9ñĊŬ¸ÔĈt?d#ÖF`7VĊÍôĵÁÊXċctÍG‘ŝq†Mwż7o@[ŠZ‹ÚwVÊ^lĈ²ÎéPK™Àĵ”ƒ²6ÈF“fàɊâ ñTœä$ŝ•)+ì, /£ĈÎ÷2ö-\Ÿw$!ĝì÷—xΤèŒ}*ıo-¸÷Ġ[jOġñôĝ›§Óŝş~˙ûuua~˘î˙ŭG²ı½½ŭ[MÓüÁĊoÔÍú²^­(lœÄĝ¨AC{ŠÚÀÀÖ9çvè‰7ÙB”2%΍•ÂBYG˙³eî˘ñqQ)ˆLsoÓüYÎr-°cĥΧ&äĞ<Êf.qaâbölWzòSŜ¤Ç1Ö݆ç5Dž5‰1gܽç*)ˆPJArñ¤Ĉˆ~ƒ‰³ż”’LXsŻéŒz_Ğ×ÍŬìK\Á„ Xİ\#Œ­ħ•'Âяœ×ëUUĊŭôS4MƒġzĤi áxt?_‰qáèÛpÀZ+QáÔY´mÍşF] h((4˘qöZÇQv(ìĈ ŞĞ‘Í$ÂàY šĤBß)TuknsúÏÀ 2‘FÌä9ĵĦ bö £MŒ7ÓzÌT$Şb4ÜjU£ŞdÔCv‰ÌŞĴ$ÚGċċ)Ú J›rRoYnXL›‰~ÍZ r……@͘šJÀ÷z`°.IĦëZĴ×kĵŭâ:*†;Ϛö½ŠĈġz â„ŭ~áà@7³ŬŬŬ£ïOZjhÀYö]ŸĊ&.žlĥĈh.\w˘ës-n.JMûCFKdĦ•ñ­ogĈŝ ĊuzïÓ—ݏ87išŒĉÙDëšOY´™3[Í×PÒÈb Éüf˘L×7É ^b¤GfPGŭ'(żfÓߕM=‚,#ĴûJ™³Ò”ôqÊfË%Öíİ?ñ}BnÀv?Hb%5Ĵ  mò(oöž}ˆÇ(-g† `‹ĉœĜ™·lRŜÁ³†üRÔħ†ĉħ9ùÂT×ËâËĥ‰ 4D4şÉ|Rİn ô[›2ç€ĞN˘%Ï1°s kÉôÎî%³[ÊÌ.ċW—“€ıt[€}òŜkÉ5G†ñˆ‡‡[œ ?Çŭ}môż˙DŬ?ŝĈŸÊĥë.ö›fŭ›˘ŞÚ4ÍJÊÊğÎ+0ä§ÎaÀw™ĝï ġ#B·ÙÁšXÎᴊ!s˜•‹ë¨£Ŭ¸Ä Jé,÷um³ŒÉÍ2“\D£u”8•&Žˆ]jÀTç[™|bJ×kt9aRгxq˘˘rŒÖPI+RVž8†úR×ǘıÑpÂ<1ż’MŽ ƒZ,WpZçQƒL"Bß÷޵Âé#=èĠpĈ#YIçˆçàp#çŠ{}Ĵ ŭiXÏNh£ħŞW†µ;ĜÀâĝxĤı€EĠĴÀ8µGN{Ol·[<~ ­-nN¸Ĝ4à¨h]ÄF–wS×ñ뭆£ŞN'§­WúŜĠÂÊUëPĠµg½ĦM+TĴŠ×ìéÔ'Ĉ5Gäáû c1éÁ3ÀÜk‡gÇ|ʈĴĤw#vĈÔuċı‰RbÀ0XœN'Ħe\:S#hÛÚ¸ŬÓÉ^/6†a4ᙂ$ŠYµŭ­„Dßġ¨W†AĦİÜs Ü9ġ]×ĦiÔĞ5*áġƒOaR‡Ç{m CuħĈñp„Òîú݁C íé3 V¸íZ×ÒĈÚc˓ğo/ éŒlïğÀìrîx1ÚĥĊ~ĝ#ĵġâmT²‚Ĵêd­uô˜İeÄ EĤ8T“9Fv†E *‰50š vĵ^"Câ.ĠŒDí$b8c£d*<J¤OĴ)È ĤmĥÈjO "œ‰5‚ïIZƒržS@ï˜{ĉuT¤“$äĉ =z†Vé³ 5ġD¤`”¸Hö*ğ0öE?ĦŞŜzù‹YdÁCƒ$÷̤ÖÖ3°&Çç”Oô‚œ—ƒ`}:‘ħ$dU›EcÙq²Á§˜C<ôw…Al2ê/óƒi2ÊŻ ´!Än ž–!Ŝî'Kz&ıÀÚ`NrÔıkä›Œ NS ĉ@êÓj½4Í`š˘PFĦMµċ|Âĥ–€?5Ĉi×µ—ú\—T”_ŻÄhD_>”çŝ²5gbÛ£†êşnÀá°ŭŭĴ=ÁZUU•x.¸ĝÂŭá@÷{ß˙Ûív×m×ŭN]Uïo.ĥïĠUuÍ|Uk›D÷·İɍŜï4jeq²nôdL4Úٟ ?kfji!&èIÓs/Íü1“…0ÈĉĈhf\œ(İ…-Çb!~kÂ*Ĝp#Zß9j–èĤĈ÷ŝ sH²ydJ.<¸a‰d"0ĝ1vŒ¸Éè'Ŭ¸ĈœU›³xqÚċÄ3™#ĉ5–uUğÜÙ8"tïI×ġàJa0ŭÇÇ…ßŭîüċ/c½nv†ŭ€ëë5ÉĈĊħ€•t׃ô?šŽÇ1~B¸ıŠÙ½Fk ½ÓiVuíĊڌE Ĉka{BÒ÷FáÊ6’öĥJ2kòkRk áPÁyö˜€tO˘§=Nħè‚ü}ŜSc,àµÄ²’XQ‹&´68TÜR°-PĠ5ş'‚”N{,+ )FĉËÚa# %6USÜk@ÛşÌ[c46›u]áîîŸö9êŞŽ@oO8 Ä§5O'´]‹ëĦ¸iĈ'c`Ü(µ…Ġ!Z ÙÈ@ .  ügÂ}ù‰Ëñe·•Ĵ°Ù^z€ï>Żôš q{îÀİç×:ov‹~'ş˙Žİ ™––ñÑ(imf&Kïóß}Ŭ,×ġf÷,(NJYÓÜzœÊÒ5×fPS˜z§ŒnùĜf!^iNJ0÷\'ëPb&Îgŝ½Höcħôµ{ϒ4s|]aS uȰµĈB[Aù[˜œĉ@ÏO`‹ô‚(= ‡0;Vö²ÂXgĵ4.JNŜ£`É­Y²’0jH>ßG~–‰Ÿ‚ÖC.ŭ˜hbääIò 7‘$¨îçsiž`\—Ĝġ×ħ4‰‰Í•És-żÒBŠ4Sw ÏħşáñR ;²î:ĥ¤Q4ĦM%:Nšċâ܀ĥmq|<ât:ápĜ£ë fÀ˜R\ˆ‡Rw˙—è~íëßX}ŝùë_uġ..Ż~sUŻ.e%)ąı Sfg §À,RÍè\—\Šc… ™œ†Î™4RÙB%y²ÀŽyxÒÍ;Êĉ#l–o)Ĝ]Ò£–7ÍHĴ…!X£²›ï|ż:ËXç°Ο6Íì˘dUÊĉ·~-ƒaÎ U4|$I É qvş6Úoĝ֌‹¨RìĤÌĥ3Żeñu²u- ĵ ­€ĥ;¸8¨0œ8VĞäz Ĥ-Ì PU>ùä!ìÙ3Tu…ħ‡µ—›:ŽéŜ: Ëü×/ħ,Ħï]ˆyÓ4´Šf')Ç™ê]û–c-%ú~p#s0Ĥ˜ š]Ù1WïË‚e„ŜƒQ Fŝŭ"XŸÓ+IBèpHqÚb£ :K™îŞjô}.¤aĉÀıcg+)£î7ÊÚuUe 7€ÓmMheIé"ĉîğŜûÉü$.7rvDúxÂŝˆĦW8ĝÁ‡?ÀétÂġĠµ“ôvŬ]ہq0‹~8ĦímfĤ ½ïiİ…3ÂħoyĦ„€â0ÂebÙ6p‡ĞV‡ŝ€nP¨Ğ ġjÍzƒÊWš·ƒgŜĊz䂂ŽĠùMÔ´ĈÜŜ…ħ{ÌÑĥYÍĈhl;šígZÚ˵ĉtÂIG8´bÌ/5‹şŜ'Ĉg5ÁÈÍts­cċt/}>çZ*—ĵK7'cĥBá6ùœÜżuÜˤĵ …´cÔ½SXƒYÊLşÉ¨NL[ìr0€DLxÈßìĝ1Öf uÈ4g([äA:aOoHÁ²˙9Ƀ!Ú]sîµÛ„qÔĠ>uÌĉż+as›6"Ë} wyŸ41ÀCх6-*<W쓲šs÷A °—˘ÀÎA”˜*°ıÖÚĴGÎÄİnN’P ¸(Ìèa4şÇ‡‡ÚĥĊvîŞp‹ü+Áè„ŝ‰şßĝĉ·äñp¸dŒ˙ŜzğùÍzŭ MÓĴ£–SĤE ×é\œJŠNŒq–Ü&Óq KZl˘7MŠ9ît‘v1$é˘]é4=˘—İx$LBˉ8/£u wq2ڛïŠ7“ñVf– D&41 @%ĝ•5ƒò@Ü _j1€W$r! ĴÂZ)tÂz½Ó Ĵ…66Fp@MšÌXjµ £-¸  œÜ@ĞV\ ï‡lgâBÄĥ1tÑ(Á½·<6)1ÔĞʍĥŭ},…òƒ*ÉĴ˘\b<|°¸m5”߁°Ž™Q{ŝ[à°?áxÈJ£óÚçàĦġ€=b·ßáñáŭɧÉP˜ê(;üˆŝ€ŝrŬï}˙GìĠíŭĠİ~·ıĜħı|ÏX{-ĞŒÄ8âóoû@T! à ?î´Fg£gôÈOÖ!ovċcò,lÒ+^žŠç;ÇÇ hÇ6A*9Ÿ*†˜K-ħiöâd‘."ÔҘ1òz´Üœĵ,I6°c—9çîÂLû³ñċĉŽ´k~bġħó‰ö9h‚k`ˆ†Ö1ĵ”Ĥ¤Ú"k HäñY.šŒ˘ÖËi>™o³‰ùç 3sşĠşœ&•Úî>~ĉAR`Np:ía­‚11kìvYëçŝgœñlP@%2 Ëà@nĝ£L$`Q1€  Òù†ı@?¸kµ’EĞ|:ƒ1ñ&Ìëœnö‹‘LËÌq –—X܀Áž*Iìĵ#Š:ŜıÇÌÖŜœN{8íwèÚ>*µRÓ`è˜GŻXÈIŭËtżöġoÔŻ^żŝЍêß[Ż7żĠ4›K´ñÎġÎ\##̉x\ÄÒÑWÙ?-˘Ĉ}ïÈBXcgAĤIĈAeĴLXÔc€6QO– ĵş˘RÓh3ƒĊh2c'ݟ'şÔÔ¤6˜dZµ1: &ÏŻÍA&f3Żñr£O—¸R„p£ƒlĵFÌmږ™Xœaa'Ÿ“62F ̰Ĝċ (4e‚Ĵ™Ä­Ċ×ä×–È ‹”j?’OAyŞ×íğÚ4×27gGCÁUışŒ^hĊ³ïNÖvLCXoÖNâ %>ŝôµÏ[‹#cX 霁KÊQwÔ£÷Oµö5ꊕ/DQì~׏ ÊŽÁeĴ…î³Ž••\¸1ĤqĉA„Ĥİa}M­‰:P W‘µIH=|sßkHIP ™ıQ•Ŭ+Ûu·<’ݲÏQYँ•ò‰5§€››-ı2ŽÍzâ„ÛÛ[<<ÜGıÁĊv k,ÁmdÇú)û?šëBnsdcÉĈü86vİdF“(8›¸•:˘=&e…Ĥiœ¤Cş÷k_3|tEmë^ßĊVu#œJÉPXƒ2™P2í²ĈfÎ}‘›ĉ´´ùZ2WìrL~`‡‰ëPi²šûŭa"Œuo’˘2Ġe†·“ÍËĉĜıĝĥ2вÉ*ĝ0"3Ìĝ„áM?;cçÍeKŻ[kµ˜£;e§E)[œĥĦE6V‘ü\bP’C2—ŭÚw't}ç’lÌ£€Áô€f°¤!˜ÈbU5 ÉTˆšPK ‚L4Fĉß8b$o3‹ <€1ĥ žĥ8Ô“ĝÜŜ[Êy\úŜ4Ĉ½:É€3o”ËqRʗyµK ³ĵ—Ĝċ%Pv/r6“ĵ07=I+ŒÛ“ÂİÛcżÄñ¸ƒzXŸĴ¤ÔàÁ58Ypbsĉƒż @÷O>ĝ‡+û{—ÛżÙÔë_è‚H`½^äŬ­e`L9(šosGFv..§\‚ĉìİ…*‚§Âġ›uÄS̒ĝİ³×kÏĴ‰£ZbîÔ§ÍÓqpé Üҋì£ĊŜıÍdž(VoÎlĥ’Ċ×fíVîôšžâžħErf4! ŽO~6M˜Êl&ÙH{é3Ȏšßtɉ{C¤‡RB1J`dI$8LŻaŻ²ġ&£FV€ÒX "— ñp˙àÁĴ€†Š™²ëġPĈÇZm°ŜÔ.Ó°žšMċp*á]µĥ´N< LCéË'üáMy`Fœ :÷3À}ĥĈÂĞj­â/$™(8c–+ğ*IħÁ™Ş7Z?şŜŭŠ=½Zġp<Ñu܀텓ùÁçŸîR+¤S9´Âî}7ĉߚÁ—Šô}×ğúd£}½o?³‘‰Kµ IDATPdÉK‰@è´wL9Íċ ”İ{9Ü3BpĜŞr+ càäJ6¨&gFœl&€ïˋ-ĥÛíĝZ“)Ë9†2 Ĥéĉ@1–§ÈXğĜ!ÉX‹àJ›ûĉ4ħĞ`,t²Ó Ü3ŜäŻ}:wĝCĵ4K¤µvdÁg^Gú•şás ŭüž6-‡IŜ€ Š(óh™·1y–Ĝ,ŻıòS ­5şc]×axÄ#N§އGh=@÷ê`n ˜@%VÇv}‰Ğ痸Ŝ>CĠHH^ùdeŒÖhX_Ħ.|ĦŠñ­[ÄVPFN…œÇŽÚl2w™‹§+%=ċdĦÌĥ yşùûoÙĠ4fì)YÁ’Ál.§7ÍÜMsıÖ) -reƒZ\”BÛu¸8àÔp<î T²Ú]C˙§]AYŝLÍ?V û/˙kÍí~•Ëúżxvqù÷êzu Ġuízàğ¨Qʌ͜‚RòYĤ/Fò$s0²,Ùâç5˘éßÙŭk R'îĜ$žÇ*=ѽfìżÉò )kŝtΉ܍í]ĥÜÔ9\.†s#ĈráÌÂDël% Èê#SèÄfšQËtĊÁŒT²);c‹Ĥ À}|.ùI8ŒĤÂè$K6€b²Fnü°Ħ+ċĊÔ=^&6¤§R2&ê2µÑy #X;xvÙ7)KbtGK)Á `ĵîÚX e-Œvi ‰0Ĉ mX­VĜl.PŻV°Ú%GT.ĴiĴê—Ûyp˜Žíç@q0y„ï òˆJ2@Š…e t£û.é€klP l­çž›<—òÏİ3XĠ4kĞĞól”2Àŭ”²`ä€dÓTX­ÖPŞÇñxDÛĥ1şĞm[ô}ĞĞ+œN'hŬtrìRĞ!1•ŠŒşkF,ʘ#N`†²fĥx &“ej£ H¸kÏzÓäXj}4[Hq²§Œ1Ȑ”ħîšêz ½‹9;ÚÇ›‹ ˆ¸3,Ú1²+$˘¤Ŝ8ñĉ,ĈĈ{n”úÒr—IİLħÓ9[é˜Ÿf¤PitYĝœĝXS䑧F¸°Ĥsä-gFxiM{ŠĦcĊ@THUHÛÜ8×+ƒ²q2ŸôÍI+ÒZx*€èX<“ kìèFÉà kË9-Òkqż‚ÁétÄ#îînâ$ċáñCwòŒ‰ıÛcAÊÈ !PŻj\\\`{ħĊġ³kĵxë6Û-ݟû„é²q}ĵ1ĴUO|>zsş{ŝ<4ǚ/N7’k‚°ÓV‚Ĝ2Şk‰i]Jŭx“Ż-ÉbôWQÜAÇğ’'ĠäÉ÷~gĝ­]îü~żÇî€mÑ­{Â0´€fpŭÔËYìóĥíd­½˙˘ò… ŭÚ} ‡e]_ŝ7ĞĠê?•Rŝ[U]­ŞŞŽèżW¨"¸D4'2çÉŞ£^r<-¤7}ĝüÇÀó§•qqGbP(‡›]ьE׿ˍôì!9e´F%ŞY-jׄĊRğçĴ;>,ĴáùpN™áŽŠLŬÒx5Jñïcx>œ”„”œĊ \¤3 £lÇŻ€ñ­\ ò›0Ë@˘+n°26!@ÄfÉ %{aŒvno3Vd ¨nyaĵÙ Ĉm•\ıÒgŜrÁ' 0 ñż”È .Ĉ÷›1…ePWµèÔĞUĥqĈˆ13Ĉĥ˜ŜÄMÒhƒzE€$ċâRÈÇċôc܎;hc°YŻ@N-nN-ĴµdáBtop<aĊn˙ˆU]ƒsŽëĞġ2˙:+˜_^@ÙÁġK,>F nK8ü&Üì@)c€Şríeƒq™ÂM=>ġĢ4(àx<Ħm;£!%GŬH\­6àÜŬ?bwx@Ûµ8žvQšÀ=#Â`z…O?ûBœN§N9'<>>D&ğïT´mÛbµZA33èX]$1a*ċ²ğ)nÒjp‡"Çáq ec·€[#Œ/† NP6T!sìv;|ĊgĈ֕Ïċ4 L2dC„D'{Tu…aµ-î÷Ĝ÷XŻ7¸¸Ĝ iTB.ÊJYCü>ĉrK‘Gk 1]&½÷çŒĞLĊĤŒƒŸ ° mʙ۴á/§q=v!a})ġŝ6™-MÂ4llƒcœA‹~@̛zÊxÈöàĊN „¤bBnĜÈ,›dbÌ@YƒA+XĉöċÓ4âACk/+q’İ9?„ñĉĈ˘çöÇx-‰ 0¤ƒÌµ%c³}Ë2Žnèüġ+µ›ûG|úêĵúĝcĵŭ·whÛ6››µtmˆD‚ËfşĥĊk¨Áâîaûé+Ôµ›d\]]âċ˗ĝÒğïàċ˗xŝìm0!Í@äüÖzŻ;D ŻÌÑZô“w„ŭ5hŠKCĜ(½˘$w™'×·ËìwrIğ kꏰĈ¸k;‘;Ĥ¸#TŽP–;¤ìk)[(ċ ‰­dyä6‘=Ìé|Ë4 Yœ4d}Fˆ™—Œqôm‹ŭaÇ‡Gì mçÖ=ĞüAÇĠ¤ğI|ŞC?(0²_mġwoo>ŭĈrË? û­oW~x¸TJŭÎċ³çïU²yOĴŞkÎ90L@¸ÜP%3:ì'7SK<-ٜħ#fM6,?‘MN(ĵȑL2#‰ó̸1†p69ɧ dÑl³3ƒ›ÒYeÚÎ6S˜ñb=.žŠ slávöä)8IëYÈ7užÑ˜FvŞóJÙòàĉN£‹R‡ ‰Nó-YĤSv”1j‡y€Á‹LWdt‹ñ,Ĝ8N ÁßéFÚw1_×[£mğhÓF£ġ™ğA‹Ğ™ÉôáF'Ġ`v à™CÓ4îŭ3ĴM`„÷ÀôIl^¨Ì=PʸZáŭĞşFßğ1úG}uëÍ›ġU%!Ÿ¸£—´­ċÏ›ñ@0KáXĜĤv„ĥÔç³€9›PÓò‚4¸ğßÁtC,`B ŞjÔu…íöRr şĊŬŬ=>ùĝìŜsUĵ}, òƒt\ÛÈĜiÄ À0ô1—6ꄎĊg ÖçáşÚaw] Ⰶ&SŸ3ñp]èŜ8#ôà“¸ż&{h6NŒuċ',Hx´Bc“”€”¨êµRJ9s‡”m‹ĥí°Ûïp<4 |o‡÷5M£ ú\›$pŒñ„îp>&·¤,jzoğ'Ÿ›qġÀžĴOÄc:FĤÍiiçRFÔÒ&ô^ÛJف`*;Ë[ÚÒrŠ€FI‡uÌ{ ˆXv]Ĥà°o¤rÀ3ffċdöɇy)‘+{á²rUĵ– z‹~Ŭîß˙Ŝ˙ƒ>úŻ>ûĜ* P×›Í%šU…Íş†Ì3™ó­4Ğ ĴuS{şápÂ~˙>ù„é§Ÿáîŝ+xx¸Ïŝ\‹ÏßAĠĴÇb(.‘–Y¤à}>I`ĵŽÒò”9ÙB|/fLc&Ùç2:;‘&…˙Ž@2Y#\Ö¸™€×|QAèċĉ2}ĤÙrîç—LleaĨö›‚áñڅ'mxµÑhۏ8ì8NèğZ9™ Fa_…—öñˆË,q:~ŭ?ĝÁ˙àö/èŝ_˙êk×÷÷żğY_ĵ/HGUu)%ÑJÖ^hAd˘9ˆÓ8şcòr$Sމĉ×0IJùVşx¤§ÚI¸ħ‰ 37U”ş›ÈŞ&ĴlÙ 6ż Xż(qÜó-ÚbV&Qž Â5:ڕ7³PV/œ.Žf "ŒR}à|ŞżÑւÓÌĤcœI-6j…–·tdËhF*’š—áR˘E½­Bñ€ú´ÉéĴbŒœÓ&ʈ;P²8râáĝáù Ŭ0²ëA˜Ô•:ÚĝĦUUv:˘Şë]u:ö`ŒĦíZ\_]CJ‰WŻ_ù‚á·Ûœ£Ż”B×w>*Šs`ż?¸ÌÜj…•oPФDÓ8>ġîîûÄëµ3ğ€XU¸ÜĴA_~42ı 'ĞE`a$È= Rücô֕K´û#`·ßaĞ”›Ĥöz_w/ŸN'ÜŜ>bĵşù BpÔ~ZÄ|œY¸އ£ûü8òÉŒŬéäË6ĈÍlzWŝ ´Û€ âĤ3§Ï´Ö73QŬċòpCğÒÈäÍsÖZÀCœĝëÌZ¸ÒÎ\ŠƒŠŒĞqMl*7P’GžÄ68ì÷ĜžAé½iÍ1ĵuUCSñ ¸ˆĊ*œç9×İĵaN‹:£˜2ž|”·;v;!Jà;¤§ë#›YSSZ *'‰lj8#Œr S0[e‚ ì9߃YIs:é`žË%ŽkĤ˘DÈL_?hĥJ~R监&v–Ċ]’-ŒŒ8ssDÀ|VsßwxġÙçĝŜ÷ƒo}nn>G×pqÑàÙĠ5.Ż6ĜlHŽzċšO‰ı¨>"ĦiÇ´žúÂk0Ôġ:J‘BjÍíŭ+ĵzŭœNúżÒċ;_ĈĊĊĈgû*pĉÀnˆ>+“'–&oúçİb…´NxVÊB4‘*è…´sħ™°ÈI^’<œËÚ-ñ\YÔ'ÍfÑÍKNyüĉ 2ßÎڝz<>>âáŝm×Fy ´Ö FĞHĈ3ŠñÓ2ΉşúëŻn^ŭWßĝĉ×˙Ç_ŝ_yĝsşßĝĈŸÈétÉıüïšíĊ?ĴĞĉ²+Ġj<ħ‹‘9#£1ş”]e¨_X Íê‡ĤşÚħÒ2[€Š˜Ş‰),˜Žĵ–ÔŬÀgġ›.Àġ‰Bˆ È9ר‰€}ntċĈ†Ž• &5D•çi²ĝä€á*’‘éô"hĠ6ó%#ÇQO7jŬk1`ÂqKaĵ•Šh̋ç\Ÿ!ZĴNÜŭ!FJô´6¨¤Ìj™CDĝy3¨,“0€k e°Ûí ÄvğuàĠhl·[ô]’†RĵeèŬFy8ħZ­n[ ŭÎ ?ĝÁPŻ$./QŻV¸şĵŒYğŬğŬëË-nooAÄQ×úa€à™áÙv‹÷_ûâ͊od‡Á`w:xM+wuÒÊéç6›5öû½T>éâ­çW°Öúĝ1 ë;ìv;7’ï;DŬÂx}u†.EÁÂÛ΍G›Ĥ‰5³C? ë{ŻÛ–†>~_ü<µws“IŒC7á ċACÈüN×âÎT+  í7rß$ĈÖêȜ*ĉ™YPdw‚I.½.ƒYU!ûà}mfA 5)Q‡Ħ^­Ğ}jħÛï\IG]áÂk]u3÷×˙8r ˙xOÏŞ€S"â\3X &&+³Ìš7íZúÌŒiœä:úJŬKAĈlÚ\é*kĉ&ft…ëA™-6a~K–Ù=6y%=GäÌ/‹Rk™Î°G–ì.Ċâ£}™‹ż~ûĞןá;ßùùÁá“? àzğÁ;o?ÇĠĠ56Ğ u]ĦİWĜn·Ĝ^\`½Ù`ĠĴÁ˜;üïO Ǐû}µğŬÖĴ×[wxŭù-އ#އ#ş…µïòŻ`ÓlaÁ`­Ó˘[”LĥÍ$×Ĥ {Y,ȧ9sْ|²Ôâ.Ï§Ì™É˜ÏçMMj%èŽMeeÂÉLÌXúeċD$TÌíħ ‡ïuf@ŭá€ÇÇGì÷{œNÇ8Ŭt2?rK&!C(ÂñÌËŞZ?3˙èŝîîêO˙ôOŝ‡wŜ}y˙Öġ ŭcşßŝÎ÷ÄŬŭĠîĝ;ÍvóŜöâò=!Ä5c ²PĠÒE‡Xu,ÙcÓÜW3ğ e&ФÌ}(Át‹e öÂÍd czZœ 9 “ħÙް°¸˜j·)Áj¤rè„"L4§,Y>ƒ6‹hıÁ'²ÏžAÊÀż1‹lÇÒé4]sĴ´û(L–M™ c˘X_’g7 Ĵ›eD˘2Gŭ8téŞÙxXr†4Ÿ`Í"ò,]íŻĞò´Vğ›³òUÓÊ ™,Ħò‰ хĞMÎ ùˆ”ÒqFà.{Uq!ŬÈQ7˘İV]Û˘Z W×k´2”5`l!w]‹‹ Cï~ĥpuy cOȁÚe%#S÷öÛ/â×뺁Ö§ö„í³-šĤÁ#>Ŝ}Šï"ĉBàġĞ×Ĝ\lbĵÚĉbb„ï@L ëzç¸Úp:äNFıŽ2í5ġjċknÖĠ —Û5”$0ÖàáŝV|ôÉgx|xŒÉ+ÑĈ˜oP³Ŝ?<¸¨PTáÙ\­ êŞŠ2apyžŭ0ÄêäáˆSë4Ӗ[H=6›YhXÁa-‹F´z‡`Ü ¤J[›ĝ})@UʎÑtYŠÌxŸĊşÓ0ċñS/÷<}ßC+ ’ZÖ8ö7e=Ŭ=ìê²Ċj”ÈÁ!e…ĦêÑ “#Bġñz½Áv{ġzùԜ3²ġÈ&ÙZ·.Ĥkĵħ–-ƒÎ hj›èÈ)[ׂY :ᓵ+7—Öç*Ŭ!ÑD—ÊU‚ô"â™/%ġ́ı@jtK™ĉı\àX”cóÇäœb´Zŝû§Ïo.˘,e“ç2ˆÇġš2=( =yçŒ?¸G|÷{ßĊ|€~ĝC5x½Ĉ;/°½¸€ä‹‹Ä‹ë+ĵóÎ;xë­wìÙ5äz  XBßjÇĜŜ=âóWŸ£>ÂkìŬÄg%+èf X…ÇûœXÓCr)9Äğµ\ûûŠ…^U@ä.kuvÍċ Ö΀`d÷no›Ĥ‡¤ìk)Hkw—"½J€œêcuħIĤŭT‚›°Ò%pžÜ%ϚÏh܃‘÷îî·‘Ċ5Ú@[Ïàj Ĝ\nktJLÂKÖ*JiÚn/^4Mó/.6ċ°?ŭoŝ߯WġñċÛo ˙Fî~í/ïî˙Kâòo_?żü5âtɉSUĠµôÚI§m´3s)’…iò¨™ ŸC6ò6#Ĝ 1!NûİŒ5 x)XĜ\“² 8:”“*oF™OÍ˙nò íYÄızÜlsšċéf“Ÿöc“_ )˘“ K‹62ŞŠÑ”Ñ_óU•”Ä|Ìş7ßyö3.ÄÁĊ]hÒ´ÑààY5q(çe9µÌGŠ…FİPóuĵœg ̸(QrX0ï'íC~ns& MFƒûÓsÖžèD///qw‡çϟC1(wÍö{l·$J)Áƒâ*š ĉcŒĞÛ†>Ŝ0àîî>~_? àɵ9ôCĵĈÚĥĊ[/Ŝ‚ÒC?Äß}:ĵ ¤ÂĊĊ•7à Áö†ŒĤi8Ġ1LÊ/^ĵkï£4%0ÖĞzK1†ĦGUĠĜöQNrìÜFuTG|ôÑGñ:èú.NŞşÂ³gÏġn^߸) ^)Ğ+k‚”•“11ƒïcLXXpSgm40¸D“ëcöE4ÄG^,[‰#{T” 0:ç“lMkĴ×aËĝ˙Êè˘—ˆ˘|Âéy)6°ıë­ZëLû8e˜íiüŜŞvŸk? QK´äJ)G‡¨á½ĵĵÄz½‰FZâä"’ÇŝI{ğ^K’+;lĊŽÈÌsîWUÉnz(rf¨ìy2ià?èĊ†Ál– ö/Ÿ ÛŭfĜ€~˙ˆ†!lH2„™áôh(²ğЇU÷œ“_ᇽwäŽÌ<·)ğ‰ğŞnŬ{NžÌˆkŻ X]9dëïê³d¸ŭ{ë)Óı6’­5ı{ëÛµĈħ ³ĴëÍŜûHµ‹>ÉZ“ WK!öšÒ, r+“šÜÖûIùy5µ[›Ċ8¸4KnS‹*c0h—P@·BnáŻiĊy½||ğüɟâ/ŝâ/àbĈwżû)îîè<îî[|úî|öÙ§ĝŜw ·ßù  ÛÊH ß>~ oßqލÈĈĈaÄûżĵƒñmw‡<Žxî_ùçŠĥġx÷î-ŭo£iZnJƒgıR"+R {Íŭ.ŜûĵÓ  V‡İ´˘kìŻ‚LŽŸó•ÌaO*ħWçğÇ _ûğVĞ?SIA Ö-€·ÄNŠş×ûò/— úa(l|ß÷%|NÜ2é3€ĵ´‹Z ŝìNezm ï=ş.àîî777o]h˙ĉ<Ä˙ ñLÓĝÏŝġ_üòµmûôŬÏ=ŭ˙ş˙â_ŝĞĉ‡§çüĵ9ŝ}ï›wmۆîx‰ûSÍ žÂĦĞġš2ÀĴß,ƒ!rËXß.$~y°bí½ŞAÓê$n³Ŭ8ƒ·]Vk³U×Z$稀½üÂġ˘ĤŻt5 Ĝy8Ìi´7e#QYô¸{ñgQ×ÁâĥÌÑ6ÚÇ2ş´ÒÈĈ¸ŽE£JR5 ‘[µ³1Eî2ĠíJècğdċ'f#[7½eë‚ì=ğ¤5RLGÇ5cbX²˜ÏúeÍEòċ‡‹uħ7…%œOš–AŸ"œ)` ´Üž0̓œQ }Uu<1—bBLqBÛ¤|DÓ48?N\–Ñ °ƒKžtGÜÜÜâ‡8_œ/,½HÓÒ£ì†ŭĴ.—X¤ĥ´N//Ŝw‡*Áu‹UG‘Ĵ›MOÜrĈò:Ŝ^ûÈS5òäY[–3W™bÉğLĠY8í"™sÈȞĝ*§Z·9mÇ{z=ŝì¨d§0cĈr˙><ôŭ€q÷úŝ=şî÷w÷lvS9H( ,Ŝ‚UmyµNf™V ğ’ËĦĥR´-üYgkŻġÂëuéÚDiWc*‡ĉġÏŬcEŬN­ğCÚMÜħlà:gŭšg‚ϴŞPvżq3›)-Ĉ4Ŭ7^“2ì¸H„*–Ŭ~ĵ÷@ùqžëżüïġ0'|òÉ[ÜŜáCĈ8]ĝ]wěğ;ĵy¸Ç›‡{Ü}¨AîêŸĥsx÷î^N/x|üˆ‡ûâùùŝ?Ço˙›ïá{?ĝ+h›|ÓàœĤ1$V+†Ú„É{B(`ëÚgŻ×,ÜĦ,fÊG&}`‹ĥQb{ yÛN·[6j'äĵĀíÉ^Ô[‰dÜMl(S£żÍï–ĝ6Îר{ÌpyÁ<Œ,“DBŒ#(gÌq* P žADŜKš“à –%zĊâ†o‘é·£óßp}žÓÍs˙Ó?ûü—˙èxhžûŬïL˙Ö@÷§˙ôgo?>>˙·‡ñšC÷׎ÇÛ·‡Tbš\˛Ìq,Œ%„İñpÙ SBryŞV*'-_Wè.£µeägÒ²q­˜Vš×g=W¤Ê ĝFaÏd jŬ´Qiï|mP[ÀŜšéœ£0îXµÔX6Öı:’* Òòšç´4'İ+·$JkžcamÀx ‹yËÒïéŒV ‡ĠżêÏĠ)€F³g³óX:Üİ0uĵäoÔꕖÉ4ġŜc”b€ĥġ9£{ChşÂ¤Ùi/@J_çó=Áà0ÓÉû ï8óè<ç’Àà$w¸È`œXrlÌòCÒĤE%6*ĥsIlšÄïéXhÖqvZÒ>>~9‡ĥí0÷ĴËüñ#€ˆ‡‡)ÈĝËżüKÌóŒ/żüoŜĵAÓ6e ġôô„Żz/Qi£¨÷€7oŜ ëZ|ġŝ+tm‡wïŜaıznnoàÉcÇ"9Ċ˘™ŭâW_HĴ׈ÓùŒmÑĝP-úo’ĵcCß÷E&1Ç}?àpèJaâÓ4˘k;ĝĥEÎ 8–B’œĉȇ£ê/÷™èŠÓ’÷Ĵ:cOİ0`1Ĥ˘Ŭçx¨’ZSeékü²E‰ŽâÜR`Ċ…^ÀUJ˘=܎-xór_Îs,Ó/rœ|ùúĥí0JKUß÷œ+<Œx~yĈno—|a"Ö'££[ŻŻĉo'²ÌÖ+gú ´–êŽFĠ"”C{UÒ 9ŬÎ$JĴɀ=³×’ĞueÑËĤ"YSöyï}dçvĞá)ù 8_gòV{5û:'݁’.×´Ħöžby›ĈŬèËmĴßDR™@ĊíçSĤĵo#Ż•‡îww·˜ƒŽx- ‡PÈ =¨ˆ<\àşÀñޝ5Ž#gOn1ġÀ4€rÄÓÓ ú)—âžÓ ÊŸžžŠ‰“!ş˜ÁÈqO°2§3*§)Íz׋ĵÏoŞoġ WI9vÍpV=G&]Áà5ë+7˜aH)_Ċ_ZĊÓkÍdÊÜ.´1¤ñô“÷‘iœüüŒ>à|>iTž'ı×eú‡œgÉ'ä2•Zg{_ôR›Kž×šišş‡î Óä}ÑğĈÄÉ úşì,“Û8>d“ cÜ "ÖqRœ~˘?K}dÌK´pÎhġÉñĜÊÒĴFíÎûÂv„Jùy_¤}?àċô+şoŜĊŭŭ}! ĉ‘Dz€Ì’#ÑşÛ5 2’É߯¤cF뿖2]ù˙Ĥ˙•=皙mï×Z*²g³ì›nêÖ- ĈHò³eW—ġ˙7Ósş+9Äk-êŝġ½uY?ċ=ˆ†ŬŜgĴǟËTëÓïpWżü7LĈDÎÁ>!˘mΜNw¸ğ›réq8­Ŝ­I<}ÄËċŒħaÂáàñöí=Mçq<ñĠW_!:‡ĥŭÎm×Ħi^s²ŒBÂyPnk™\ió›çş ğ×nÍÎZâ5#×^•óZß½ÇĴÖ_żž4ğMÉİ%-İ^›÷†—ˆ¸Pʤ:(é6O#†~Àéù§Ó §Ó 0ˆwRDNѰÄ3RÊ&$ İÂÂävŬ?ko@œ Ġ´ L?“yŽt9oO——0 ùóÏŝĞ@÷§?ŭÇożĝâĞ˙.4Ŭßì‡ßëšĦmp@)ßĜŻ"6ĴS>ÇTr$UŠĈ&1,Ĉ*g‘fÈMè–G\Ó¸2¸˜À.Lˆ@rHțş½µÌ@O×{˙µök½€*ÀYtĞ5˜Ô÷ÌĈ^‡ûoâ%r=>5­n.Ġ Zcĵ²È1´ £‘ce\Ës —ïħԜVÀ“|5~•1Á†İİњ',ÓQ^evÖPÂħdı!I ĵë{e6r*í6>³ÁÉs^Ÿd5ŝĈ-‡0×Ùċ~–Q²I1%4r Úèщ5ĥŽ‚ä\Zî•aяnonJJF´QRb"òŭPXMMXPÀ¸ÒÚe·,.ò…éaĉ_ÙÛûû{<==•MX.œÏg¸@ĵœ"ĤqşœqÄħ|êbmS×4ċ3= M I>­W'À+Ĥ„,İ1ÊN”Bı›†% ú¸)K lbĈu.TŒOŒ4E%‹n°VÉĴSä<(f“·ì$RËí¸œ2²Ë’DAĊ ĞLjc+}¨÷h!È=˜"›,ğĥĊ0Ž"70Œ#~˙ÏÏϸżżÇŬímYßġġéze˙6àµÒBÒġݧ•ž×ŞÖFĥ×´ĴvŬ~MŻş\\Z † e*ËN={f²=íï:îjÑġ&¸¨Ğèvö”ôïoUq3JßÓWŸ•öàòbĞ '.äq”AhO˙ÏWï÷pıœ0 ³ÇdÌ#.—§ó€Ççşĉ#2ŭ0â|éqw÷,€§Ċœ™@˜#›šĈyÂ8\@ÈèÚw·7hÀ-˜M8À .8> Ñ'ĝáïü>~W~!4 ’r@„—½[éˆI7p!*v\™÷\,ìŜµ×Hĥ.aXô´ŝU½ìŜïÙn³hŝ#6ÏY`ğ_’~£gPj–íu8sϏOOxy~.Uê)&6°J„X‘^ä9Şħmñ°ÏK™ùğÛ;oSÂ<çrĝöRf•Q ™ĝöŭ€Ëé§ó —ŝò)˙aŠ3íŬòÓ˙ŝ‹/~ġ?w˙uho›ĤQ#F^¨çyF×µċá_bG–SŻs¨  éÊècï4ŞÀԓ3#šş³;ç|ċŒuŜĠm5°›_şrC‘+f6UÙqĊşê×ìÉ#P]ĊXÀiÜĉĝîƒêT6À½E½ŽœY6 •ħüşù‰O@„¸³nÑ£1ÛCŻ2k}ÚúŸyġz¤q "šDÖf jmÚÂúu­uwÊĴxOh›†3KŭÖ¤V@@Ñ|ÓĈÑ­hÒ,cĥÙhœÄ›Q.`7E‡Í!Áa&WĜùum²šĦÊf™2Çq…Pô“ÏÏÏh›œˆŽ °6NGûÚOŜ„Ĥ$èçŬ:҄îÀ% 3×È6 žž˙˙x<‚œCŒÓ„mAÇ#âĵÔâŞĉĜ9Öç”q>ŸYk*×ŭÍÛ7úĵ'=ä½8"$‹ÖcŬÜ`Œ#³Á///8ŜŬ"6I²“Yê4Nnïn›ÖB*c~k2\ß Ê ë3Ùħݵüužĉ" °L¤sİr´S9ܳVZ×ıiŞsKSâE>ċĊuĴÌ/ëx,ìq&KЁĴJŜ’i1ŽÈ3ĉòb uä–0Éo%yŬŽ[Û4ĈïY?-ŸĠÇĤÁŬ=noïp{sc´öİJ°‰ kŬn(żùŠ,j­gµżż¨ĞC÷FI›ï·fr÷ˆj-ĜÙż6ѐ;Lœê?í:÷Z1ƒ=0(8Ï雓%Ö#ò=óÛúlˆš˜wż^Ÿ;–w%ä€ßŭŬâôrÂżŝóŸcŽiñ˜^ʁa€çKžp{Ëċ%‹Ë_rĤ@™}Fž2¸ĝ8"¸ŒĜ8´ ááÍ-@ a8ÍÍ>ŭôğxóĉÚĉ‡ÀSfZLfEÓg WÍyKƒŞÛÄGĤŸ^ƒ^ :÷´ı×ïžDÁı¤­äME6íJĤûÔĉ·×&úw£Ê³xùŭËċ" î^^8µE%™İıÚ:•˘Ĉ%ı°·!4m[˘1ıċ³+ë^ñ!f~]hde›dbyyzĈéċıtž<9çĥŬ˙ë˙ŝgŝóÏ?˙{îï>Ÿ_ŜŜßĥ33/9ıÂ<%°"$GÒF´CäEÇÈkÇÒêµ8s5Ş_;O—:8ŞÀhLQ@ĦÜ4ĥd!×ġ‡×òĠ“ĵ5~-İ {pqhgǛ'ĊÍ|íĤ*Yšiy_6jlÏUìއP]çV[ĴÑ0sŽeµĤ u”×À1 îˆ#cœùsÛRduqkS„ŝŒ@Ħ*|Íϲ²/VeŠ¤"ĝġeÀğ…ĠŽXê˜ PÜkkJyW 2ˆ"q‘dе£ß~?£ĠİÜKUp˙Y4Z&ğ@oà‰™ï4Í!t Ç t+ UÊġ„ûû{tm‹ÓùŒe¤Ŝp×û8Œ¸7‡#ËĤŸÜŜà2ôÒœÎç"ïFÖx^ĉġÙiâûG@­ÖäöCûğ{¤q6V#şnon¤1+"Ĥ iŽRqĊuÚM× ĉ—ËŒ@1Ohó0!ĊÈ8˘ œÍK!`8ÏUñËċƒoĝuӈ#nY 6MáX`Żˆĥk‹NĥŒ•iKİäù6bÈâŠàÀï'ĤÒv> ÂĜ6ĊŒĤĉ²ĤıgëĉĵœŞHXĴ})ġ ʈÙħÎşŒï"€TÉÊáɳĠ>ĈeĥÍĝ²ìır^‹×*IÄ…l §Î/oÁzÎÌz p÷!}2Nè‡CÏíF_ĝ5.Cq~ÀÍím‰@CÌi°–#]’kSÚµlòo"UX–ġ_éĴGÖ{úW+Ñ)à@’trÚĉĠn5ĥı°ûµqİ>Ż‘[öuŸ9V‰Ŭĉ5ƒ\~Ÿ(Ò { È)Áı 0ş~ú)ŝ˙}Ÿ˙œŝRšrB?Íĝĝñ„s?âÓÇñĜq|T‚y!8Üt·hïà-+á}’(8´í ïóm|öïĦkı|‚÷s&|œ_›'÷?'m*1C¸Ġ8/òTé^÷ĜÒ=ö´Ĉ6Kyç>&[ıĴ=’ëòŽ} ŠM´uo~]+„ÉWÎ/Râqı\pzú€ż”}/Ï3²‰"Ó QÊ|1#ğ /fp8°LĦ;tì'iä䖔O ĤşsO-Z^€=@—Ë///蟟1Ž=–œsçh tñ‹_ĵ3ŝĵ˙,͉›)|B3EÀÜÄċ#ĝÀ9ŽÙċaÇtlÖİĊ z!³sycŜŒĈ׋JVŭ׆°k£ı.7­!Ù|ï„ñV1&vïJSOvzíkjsŻ…xëhѧXœ,¤„ – |1ħIËĉ2Ş^zݳÒšM€LA…&EĜŻÑ›Iĝmî¨ĞF‹ş”kŸWÀ²èUӒ‘ìö”ÖZínóÑŝàC5:Ybê–qLŠħ°vy'ÔŬ2ɰËûS]h̋nÚê†×÷íŒ4gT3d5Nh2E“ËşÓħJÁ]×p5‘'Œ#K’˜´ŽÇca9/éR@nÎ<òQĤîx<20LQô—ĵaèáE™YäIrhc)cˆ)ašĜıŻf¸iš0 úÇñxäżK„ĥmıÌâr)żwsw‹ûû{œÄĜ úòišä5/E k½½Npœ–´Ş9ĠĈmĊy†'*1k S£ĴôôïhÇıJö“M—ŝZ½iU˙rBÌħèÀ×÷KL ‰R•ÑLİL²ŻnXħF ċx“|-PŜ1ƒÀXZîĈñ5žÚ‰77ˆ1qwŭ™ €ÇoßĵÁŬŭ=Z eĴżö:ùNéC9T›½! kğ6£UD‰Ĵ9ö{V€xUja=úŭŻExÑŞħr15çê½y™&ċU"ĞiÌıtUB°^Ÿ÷ÁÚum2·~͘Żc9І¸ˆv2Êy1q5A˘ÌrB-‚w¸ııÁ÷ż˙¤”Ñù€Ÿŝ'ĝòWż`°;Nñ2 hÎtt\hBH˘]nëġ靃£#\8×pŒVĉ½îÖĵ ƒ0‚ ó­Oñß˙üà·ˆ››{Ìó"ı({ħIÖ *ĥzCÇR=WMí䆿NŞĜkğċµ·{škĠŻ÷[ÏĴû*ŞQZŭóĥ:_+½Ĝ{ ĊË#úYerñüüŒa¸`’ĤI%g“1Œl2RG< :4ĦĊÍ ›Ĥ•Ê`nA)ĦiX~â›E.KžÊ$džgœ¤ym8?#NsĦJ9žVĵ<•dá˙ïÍû_˙úĤ˙#À…;"‰³¸ï{LsFӌˆ8 a÷7ĝŜaf€XĵLä<·U)SU´¤”´n[ıíÄr苷z™-ġŸÄM™+û›5_Ó÷nĴu‡zʋ^×1ğ›ê|Ŭk@Mş×t:KIEŜ}/zMz*l/Ç/ÑfĴVF”;Ġ—ùħb`*M\F´Ä™UšÚea^3ë{£´")ŽsçmNr";rġˆ9#ÀĦ•àS‰D#3yç0•WĝúŻóJçyfŭ­Œ†”}^K54™A™5'nÛ&„]S^ŒħüKž “HĊù›L´›ĉ,S%§CFBĈgÜnŞQ"§¤ÂLĈ´0Âçó cʸ½ğGa8—Ö-ç8ŭ ç„í@Ŝ£ïÏp.’Ŝ‡ŭx`ùÂóó3ŜyËlòË ĉ8“·ŸpbAĉ‘Úù|Ĉ8Ž%ç|>£ë:ô}ÇÇGt]‡‡‡‡â˜ÖXݘRİßV˜=,„qHÖËe–µè}4'‘b8Ö7w‡C1˙œıB·mĞ{V3|"fëcDBDLHa™!Q*qdvî^Ġ_ÉĜÔvĥ„’,ŬZ·žĊ‘Ëŭ–WµŸÉ””ïo³†ÉiUċ_“Òˆ€‰OŜ~û[ĝì³ßÂïŝöq÷ĦmZ X€[ËÔt?ĤmKß`ÚëĵfÛmÌß7ĠîŬm#êëġġ5“ğfŒ`Ÿß£`½¨Òwgs Ŝ[ôżûGß÷‚Óq8×b]‡–çcFc4ŻÑKÓYÛu8nÑŬáGÀĤ™ $àj›Íì Àġž%8à|êq:Ÿq9qʆ%RÎèàŠÑ=Ÿ.)Ĥ?rŽ2€9f41%ÀıĦI :"Ĉó˜0""7l>iZ^T Ŝ+Àäq^ŒµcNOŬ>xđ½eŸ+ŝžĥ6çW*oWf§µËĥĞ­˙ÜêçÔyŻ@c‰Aµ e3&Ġ…+ĤÄħAf•´2l°Ž3W]vLĞ2ëÎLb6j_FÏä#şĥC"Í ^n²²¸ h´ĤĞR%jÀİĤ2”M`g´U…Ĉk¤™žŒW!é… 5,<—‡,i‹ĤњÒsNà˘#sà4³¸Ê<9Z•(µ°yµx9{ŭ’{kżĈ‡`6Z*aĊŒĤ:ÌżÖ.É 6ĤĞkÛċŜ,–dÜÙNJJ´è{•ŭĠMAÙÄÂ^ÇċûÌq.ħdÊĴj<ÚċrÁŭŭİó‡‘5ğm‹ÓË Úĥƒ÷B‡ïŜ1Ğì)ÀĤ³œ9ۖ$Ĉ9'²78:<>~,£ŝaähŻĤiññ”o}ë[ĠbŻ) Şe#˘˘Ŭŭòë÷hÇš_;Œƒ,Şı¤Q(.qH1ò}$ä=ĊäŭĞäEA5'D Âà’' µ@+Ċú,Ĉ r!_Fş)'䘋Á1Ë›%>ÏnHš#œ(ĞNAÈ·€“Ĥ ÉüCriu˜]œò„ş8¨CJ.ħ÷E/°<š›éE²3Ó˘ÁoÄÌ*ӈîp@Bä|>cè{tOOĝäá ‡§†eŠPdD×êÛ×)˨YMïkÓ¸²zjàeshÜÍùŬûûjbµ w-^_­+^ Ġǚ˙µì„l ñ_Ëş1Â:/ĉf‘W‘Lfc™2Iԁĉ9ĉĉ]p{w‡|ï{ĝӟ˙ ŝüÏ˙?|ÀŸy O@L3Ĥ9q9ßA(`N sJY÷äà\#‘š3|èŬï}ßy÷)ġíÏp<ŜÁAQvÌ79T i•ĝZ踧Q]·ÖÙçOġ¨÷YKRó˜[˘ŭ–Ö‚ÙÚ¤f°ğ˜í]•´àÌĝž˙Ĉ›ċWµŭġ‡<==qtĜȲ­”f¸Äž–šiĠ€|ƒçç|öÙgx~>!ωו9aêG\^ÎRYÌ÷Íċ<òύ ÓÌZĠiΘĉ Gs@M{Ä8ŭÙ `W25GäH8vwx~:cŽ3B\3‚óX ! Ë.ϊ>'ÊBíl5ĊAcĜĵ'\.“0UMµ9ŒifG0-y•Áx8Ö0gvÎxí‹ Mh@Éá4œÎcF†OüŒ§Lˆq†÷„qŒ]@BĈ8^òŒ„ˆ†:L)É!.Ħi%$ü9°>XĈšâÜOĈë…Q=3yÙh›É{İf98ê³OŜ£í:tÁċrÁ¤ĤĜ´Ħ- Içó÷w÷xxó€CÇHç=2€9óׯ“ ĴÔk9¸€›7·˜Ż²şĊ#àĝ$ìHRUs!—ƒ¤˜T`#mA‹k¸eï2kœë{r8=,­Z2ġä{à]î`6-˜†Í,9ž+ĦUYjŸU&H5oìdf3šC‹ M,3M`oEXƒù€oö~ïßŭüò—żÂŻ~ñ ĵ˙ú=ĉaÄ0ž0ûyž03qA-bsƒ€Á·“‡“Šv8„7·¸{ówÇ{8òÈ Ö;‡). ßısñvȊÍf£ee¸à Í@.SêduûI2síÁÒDĴSĝ³³żu4&{IIüH )í}z„ċ˜„xò‡Ä3•Íëdu1fKÔ'„äCL‹éìċOqıpġòœFę£]b²O§ùŜħ!KyF'ĤÖÁ7¸ıáˆÑŭމ‹6hÛĥLcä*£›“ċ2àċ §Ó Ĉŝĵ $f„á )óúV€îù|˘˜Ò5|! MZä}/G^!çr!È5˜§qJhۄZ¤<p£fċîÖBŽ2İ0ɝ<öûğmĠ0¨]íÓy IDAT›&Œ€Yä`À'âŬá€ĥmË=ĤúeŝÙ£ĵ?ŝ™šy|@×µNKzfƒ5ËWŽs\Ş`ÙFÍfTàÙ˜•ċ _‘ÄYôß|ú^Ú(–v5Ĝz˙hŻÊ T‹­!˙öİя˙Ça`pìCÑE[9@Ñw‹‚2*ı„`xjĦÓ_@CJœÔArŜc…ˆ–¨ŽT´šÚìd9ü§E 1א4=­Òì&k*ëq$żŝÖO˜ 'ú䒣ê\ <§qâ M²³ġç6Mƒ)vhÇCß|fWöñxě֔I¤]ŻÈgÔq/ıÜ: ħ„ßC²9żĞ×Ŭ°š{ñ†ŜU²¸]VSî­òùĊ\Èۚ™L+Goä Ğç}pZ3´ ~Ŭfl~ÍH½f{÷e“¸nĵtĞJxĞCĥ24Ŝ7Ċ°½—Zċ=KşĥÁámĵ}ûżġ[ßÇóü{8ŸÏĝġû/òô„ççœÎèÏ wwGÜÜpÛŬâpwÀŭñÍñ€mÑïpÔ Gtm‡Xj4Ċ%Y‡Ÿ…zo"äRßOLéUfğhúWĊODîUıÍ›ż–~°\#UûM÷5FŜzoRÚİ&nµ%şĤ‘M„żŝġŻÑ.—^ëÄAÈ%’1爌ı¤aİ&—|9ŬSnŽ<áéG´MƒišKqJ×PĞ2™BÖo!½Î灳zOg (Ï]DNâ£Ħ¸{] Êı\. €m[9•<+k”#r̈”&v OÓÀħ6Ŝc&ƒY‡ıĴ€ Ô|J´u½z !`Ĉ̀G7òœËmµŒaéĤv&™aoÌKDÎËxaÛf²%ğV]Y ci?Cx£ Ug³ŒsÊLŻ“ż:6R&GĠ†Wċóx†&Û×DŽsŠìÛŻÛôı›…xÏĵVµ%îW³šŬġèŒ<•Rƒ=³CŠ^x/ƒXe$ë÷4KgıÏÜĵ¤˜¤ĝ@ëġd8fšĦîëtËaĊcwT&ך €h<˜Ïa“ÏİLMےTòݧ‘™ġ'ż”SXfcÂl1E×ĥ…ÁQ³–2–Q€~’ FŜ„cu1 B‡´˜#‰|İ%.‡*Ypbâè4=˜Ù1x'9Í o}²‡ ­¨U°CRQ‚ŻXt½÷ÔĜfµËٔŠè(MëĞ÷$LjBâD†X6<ûß*“ħ@GÇΎ\"‰˙^Ö.Ÿeâ# 9Oro¸X™Ġì3²d2ÌġH^?bĴL–]m:Ĥ3*£Yw´£X28W}~Uƒ’s˜mT’ÉĞ´,,Ëj¤µQ˜ÉFĜàbBì{ĵœNx9Şâ‰Ĥáu{šR˸ÒĜS$nîjâ@5†ÎKċŻĈ-^ ö>Ù+½)Ò3B•Ì`“o&ÀĥÄfù­Öa= ›Š_г~-‘áZÊÂô–:ók²Àjísž ×;YJZZĵcĉÉ{AD%Nlžgüîïŝó8J˘Êˆŝ|A?œá\‚÷@;4]@×4p^êa›Vĵ#AähĦÄë‘C%ĥ1˘C3¨/g!Êĝi´2m*[ô°[˜6Ÿ­™]ËĉkMĵĠ™ı݁Ü×Rʔcä*kŒ\Ü43È}~~Ĉù|ĈӓèñG^×$ûR\2ës!¤2\àµĵmĝp8t¸ııĊíñ­LOÇiD”Ĥ³Ĥi¸˜Gr•êéş=MN§3NOO8ŸOĊ/Áω/İñ½È<8÷?EŠôÓòŝÈŭÀÁ;ìP‰µġ8c9­¤¤k›²ÌóŒĥkÙI)ìHëZ‰ÄĦJƒâ Èâ/ڟĠÉv]Ù¸^ÈĴ{QuE K‘kıÑöšI^;Yœ•9ĴKƒÉ$­Ù£GïJ^g, DÙ§fùÙ>ƒŽjYdlëNFZÌëT…E›ñ½ÛÓ­}ŽâwŻžİcO_÷˜7 |@ …Ġ?O9#j>_’ĝĞ&Hûœß˜ÊĴ+žMwÒReĈ|ġfi×Ò£ 5ÏÙ°wĠUu{KĤnZ´Á1Ïŝ,2²‡‚ÔnĤRœd´hAŻŭûša§$ŸOß÷§İHKÔ( ‹N/ £#'íV"%¤îWëÛ/Ûj£HòÊĵĴF?ċT™üÚñ(Uഘ$c8mŒ QŠ 8Ö-–ë˘İHÂ~~äPSkw²Ğwi"‹ƒŒÓuC€d(•Ci*jk]ÄmfnŬıeÓĵĴ…Ö O•ĥ›İkKŜÉÜdŸ{ĵ _5Â&“’ċû§˘·“i‘CċÈOáä ÙÖm‡9²^}š&65O~˙?|À›‡{G7ĊÓ uä6ŻĜVŝRݞuFyàò+şSSĤc÷“½Ìp[(T—%luÚ~ĤεÔA_˜ŭ>1/Ò9ïİJĥџoYçu9F­·ÍïÙ×ħ'X}µ‡‘[\g$|Ùċ0ĥ^Ŝ;9lÁ€]É·ĵ/wĵµˆ3§‰K(heJŻĤ"Üï•×ÄÓġDİüŬ‹QğĤħUéHĠ|JĜä2_ĵ×ŝlĵŝ&Á×°ÀŜDÛJ'jĴPƒh+S.}I1xyyá=,M…(AZÖ×zzË2Z M OĵÏöqt7•,ŒK:ññV?/Óâ~èñòÂR…İï—:a8—ùıÒ˘ĦHĉàï“÷?tQhbâMĵA´6çúìÌĊKˆiâLÍ8!N#³½ŒiêÂPtmëÂĞ·…“p.€\4@HnTä `³Ŭ糈޳–Ğ‘ĥ°- ‡X‰„ñXÙî$Ñıw:z_şçKĴĉ/t šì<£O~ĝ2°”•X˘ĈR˘%³WScAïŠ1ĥZ,ğ ’sĴ6 9ÁUÙÄQF´ĴŻB…£1iĥò(…Êt­tÒkÀŻ°âúóì&ó6’­|.$îYı>>-q*Y˘›|ÙĜY ŸRD?ÌèÚM۔êß1ŽˆiFLÍR ŒŞĈG­^eúlT˨äŒê}dMc1ĊáaíŒWsƒ]tœĞ½²¸!„"›ËŞZ°\[* •LŒ9‡°ĈYOÑ9g }Ï£¤E?ôĊpdqIˆŽ×Ĥ×0§È9Ç)otÄëp}ï˘Ú\dÒ[ƒĞÌrüÌÎȘrBö|­ŽğġĤ×Ħmšbpƒf_ó×5 j@²sN@ŽcŠ|Ïi’w˘³çĵ°LK%fŽi)Ğ0²5X. 7òÀ™ŠŜʧ&ÖË5["ħ(lYj2ıüĵPYm¸ĵm´/RÔB´ŞĥMĉ5†J³˘‚ßeúĝĥĊ8MpçvGÜÜܰ‘ätBß÷8O¸żżÛ7oq+Cüڀa.ĦïÎoLgyc’aTáVI0Ìç’Dĉêp½m4 Ğ’kfz­LgíE¨òÙÍdn= · *Ħ²Żk ĥג‚MJĎmO\ NĞ6şMä]ĵ–´Üö^^’½:!˜Ä|ìä°hÒIZRyäÙ%8ÑËÎĊ{£Ñd̛ëiä²MÉv}¸Kİ’ Ô-g&Âìk£™&ÊX†vÍÔ~S”}Ż}­‰Dħ2ÇoÁoŬĤFŽ=*óœq9ŸñüüŒ——œÏÏÇQURÍÄl’CğĴżB ‚ š2ȕ*_-I9#Çebĉ‚Gh;ĝVAnSžı#Ĉá‚—Ó ^ž1ô½`† ‚’Žċ Œ'y=­ :àI]˜çŜ9ç>ġžÚ Ñĥe€È°ċaŻÙ‹lASœË,e–ͳitm·q(òŜ16ŸüH>çĥĥĊ™.§z62…(E}ĴsT˘Ÿ’ /ĤĠ˘áP³Ż›”èœ,h´÷Ġ°^Ó[F§ÚhÌ×ôŸ ÊêïğÓ°&J|҉Ü>‡„8oU!Ġ£™ŬhĤdıŬĊ5GpΝżzu~˙{–H/ŞczRşbòÓ”qš$êĈ)Šñd9%2Yš³şÖDĉ€[o(.Ġż˜ ĞIuĴÌR ‘7ú_uëϨᖑ{Ó6Ġß >” •/X ĵvËNӄqšp<†Ò§‹Çv2Ö_Új À9˘iHjq J“´_›ŞŻhd”sâĝ4sM•5VIӘĊ-ĈWǵ”0M#&Áš6ɢ“kŞ€yžAMSžûr‰‡e~)S™T̗çƒen‹RaġµvXÙìdŒšĴ!ö˜çˆ)̀Ó)G“͈pI2~%•&F6“fçàҖ™‹ÂĤ:IQÈ)NŠum,ıë%)6ġ#ċ-·fÂʳ—gİ“ÄY·N˘=Ox~~*ùÉĴá}ƒğÛ[azŒöÚQĊŽêúRž´Ó–VŒ\ #Şzĝ²ĥ\İut-âò›2oĊCñèj/mA¸îŬ-{rˆ½’µLèµuş&MĜ?ìdj(6îÏġT!P×µĥfŬOqÈ(³C–‰ùĈ™$Q‰Çœe²@˘QÏ9#;W*Uv€Ġ½ħÊOÎ5şÍÁ­5Ÿ•ƒ|ñ]cwײ„ukš­Ö_[Ù^m°rücéΤĴĴ[ÙĴ–ß~ßišp>ġĝ¨ù¸}9Žœ#Ĝ.ü(I4ĤĈ–“à˜ĥkqèhğw·we˜‹· ħMÓÀ7› …(R|8Ï3ĈqÄÓÓ 녙 ŠHZ“í²Th\“‡D6‡À@W/FÓ´ˆĠ -̒ ı`ä„Accoöݘ‡Ĥi· Íħ+§²cÑ^䐙y•XŸ@qPvbœJıËÒzYCÖed§`ÀI ċeĴNÙ—ë6sQĈÖ ĠFµ­ë]/&ë0sĞÌf£›^×Üä°´Ğ%qÔp8Ìi‰˙sŜ!ϑ%99…6ÙĴٌšM£êAĥ@ŜjätĴoÀëZÏ׺ŬS9¸¸ÍXŒvF]Êë >gvX{ç‘ÊFžsBvTĈ²‰O9˜È§D£Wñ ™ĉ”•.nu½xŒž+}œĠé&XWS€˘7²ì{^ĝê —r]ŝá—ȲĤ­ Š„ĜbZŒtÖdW tĠf£sNpà3ù\ œÎıbl#OÀì§´“ B›ICú=ašbuyò €.Lr*à”°/§˜¤fš$^€ Üç‘ÉⴎàZêažáĉ€œı.UĴ°\#İĠìaeÂġ  Ĵx˘mĠk҆HĴò*âż ó|q[bŞ&Öd—|(R Îfï·è޽‡ÄùDim×ü\rKEİĠ›;ÙĜ²N#Kb/ ŝ5IWUxXñÈR·\T (JyJrċuv‡.— †‡˙ÖğtOŭ}?àéáí›O r„úzƒ<‚‘ْšj­•5ŬԜxšg7üŬÜJ£kÓ ”=Ôġ k˘fóÖi ñ7SÓmÓ!ê=€ğ ˜WšĠ×J$lĈì: @#é,£ğÀ¨s›SòIJ§Z_OÂĵÉ8Xß'‰8^dşÍD2EŬ0 }(/í­×XS NhMN-_ŭ}'ĥ– XŭîB”ĉĠá~­Ŭê‰X’T&èdĊ ž‹DÁÜëúÚúŝÌ–çg<>=azL…Ż=éç8ÉôSž4j~r8àpèp<ŜĦ;pè„äL ›NäK§ MÂNöóiš0ž/8Î¸œOK, ×IÚ,Ó&>Ì#‰¨ÇH2¸…OäÜ?oš&…êdI´hÛ°ËNkŬd$›Ñ$^/ì4e$îÉ2Žœë* ’Š“ĠQ^4‰nÑ2:ıÛ³hU‡Ĉ£Ç+ù€Ĥ9ÈbcuX­YŞÍd´ÉfĴÊLD–‡Z*°œhÈRtedıĝïVüİC=Pċ–[™KH‹6@šg1a)s%FİbUš[Xċ”r1ê•ñcÑ%ĠYž|‘3dŒ;Ş˘ÄŠĦG.Í5màš -.;zB29…İ´d‘,4z­icÒ¨.eèbŠh¨İÁ^Wï+I ÀӒmş~ ËġöÂz.f>>âŬğwì´oş˘Ufgžq5BkdVLm–*ġµfĵŬ7²Ĥv_Q?ˆ'WKÁ<íšÂ6„aœ_cƒé˙C ’ġżTI4ݎo³İ6"P,÷żó‹Öv­­ÌŒ†­T‡˙şTÁɁcËXòψ1˘H˙_z#}45|1L4ŻıÛ h-“[•C˜éÌÚ$f×V½—T³şÖÔZkóË|Ïo’/‘ĴoµĥĥúoÊĞ–´š%Vg“t*ċZéKyYïfµşžˆL,ìÀ²êùèšH”‡ƒ#‚!óµ-{¸²d ëž0M‰³¸_^pĵ–у“zĝ_ïQIfl)rz"G? Ŭáiğğ)X“‘Kĥ>TlœVÀéİ(ëh %ÌsBNÚ)ÌÜ9Ϝ™Ĥ”ĉ óĜcì84Î3ÚĥċşQ‘4ĝ “•Ó>ÀXu)ÀI“se N‹–Ô9ÖÄĉ9nêsNp!”S´ÇUšĠÜiHĵŭ=uoĞs8xĵIuŸó‰XMiwœ€wGSĊ‡‘gííjĦçMĠàmÂB.8VƒVĜ9ÍYĞRâ8vŠİQĥEñ¤FU+2c\4†¨ä y|™Šğ’d" ĞÛZL£jÁúa*i•ĵdž1 •Fŭì†/.p‘‚2§­TÚԃ2O˜k°Ù4lÚSĊiñĦ ‡5mr8Säż'Bßè𞍝MS2 ÇcÉ֜i͆mÛÓ4áŝŝNóOEˇç–gŬ²UZßè%šl80²üwù{„à%j&–‚ ğ=܉QI2m‡mÓàıó}4MĵïÊ{vä0ŒîïïĞd£T[ğ2Êĥ²²Á777ü9Çh6Ag ĦD_ô²°†z£iF+ Œ<Ç )àÖ< Ĥ… ( ÍH“„4bŞòU˘…V%óµ %ÇS7Í,‡ur„iêщAÍÒ cĊ ­Ż…ÊĦß]·,°X8-Ñê\×ëoŬġL‚P8Â<Ğ Ŭ/ĉ9ٌÈ_R"h‰ì#-iáÏı ş–ێΧ.— ]‡‡ğ{<<ÓsZ&Vëİ—“Ö£MnΒ+[§áèşŞ—öày œZ™—ŝÜŞ¤âJD™fĜî™ÊŞ=ΰŜŜÔ§Zù“äöÏ·’œŒyÎUÊJ6Œ! re’’5œvŒXl*Ú×—h’Mĵ–e΋wËaFAyÊİšĉ쑝ÛLñöd pC†YġÈ8oZ b-vÑ"•íèu™w"È,3İûç–5ĥÁRB´>LÈkTÓpŒ\zyÁӇÇÓ8²†[`[€f^ĝjœWbòx<˘;ÜÂáıĵ9H>ì7ΣëZ4­T¨û€ìšÙ8ŽxŝÈò‰qL²‹x›ĠD2F.2:pĤ­É܏OŜµ?Ċ˙µ?ú?â)OÑj€Ü+šNËñŸ)ˆáM"!§:lš&ÌnFHÌ^M1£™šÊD£y£.F %ŸĤš²eq‹S­d6U& -~PAş·ġ‰Nµĥ L“ÉŸäÍ9 ĴĈCÖÑĞħ*ĵ +hĤvİċÍUšAÙcïC:îÔĊɇ`­`4ĈÄ~“½Ğ}ĜdXéŠĦŬiŽġa ëڍÌĤP Wf͋9@^Uo9Dž%m9]ZğŒŒı‘İDj™MD³QCpÙ Ĵ~Ĥ0˘ëڍVŽA[@~Ċnör”¸.ŭk!ıT€ŝ=.XÉˢ&ùÊ9'¸èJ3žJ Ŭ0J‡ù“/עi›çĊÑc~‰ÄŠİTëĜ_Žğ÷ĈÒĊT(ĥlPsċ´= Àŭċ˂ÊÌiÓ6ċg…ì&ô— îïïqèċ3ìZ6²Ġé"­íê™ĝ2*ĊsN˜ÖIf:W^ir2 ˆ"ĝžĝà6MSÉYŝòË/ñôô„OŜ~‚‡7ċĈMÓòÑH(,‹Ty(ލ ­üĉ³nE‹†™6Eyí„lÏöšnv)ĥ!@Ì]í;RğMJQrKv½iâĞ˘ËVÓż5À^Çr7\ĞyUĞ×p/rĞN¨ËòĴQÓÉïĦ€gGùŞnyù^ëŭ.WS8Ŭ[,3÷­ qPŜhm_3–Yàğı~+le'7äôÚğ$x…pĠŒĈ@•Ó§§'<~üˆqè—:s™&£Ġgc™Z²îZ^ŬM OĵŜßŜŬĦk¸èçrıH%;œÂĠÈ´‡–İšb½áÎÏϒ͞0ÏÓ^಑Z-žŞ››ŒXŜï8ŽOŜûŸ\.—˙Ç˙éòĦx\~8’bàʅrşò2•“ŒçħGàríĴ€çÒ rî‘ĉ 9ÏœÔ ½ó1A2qU§£F6·ĠöÈ,f'QJYâÈÜ ”íċÇY§rÜ|­^4Ÿ,ŭÊeš"…MNlÌġ˜Ž°ôWĴ”¤!8°aċA.G=U™è)hHˆ9Ş½ûĞÁLŽ—1$ĠßĠĉH%ĝÙ$,[_CoÒ *v`6‘<äŞĤ#ğY^‘#ĜÀœıÎ/1"v¤UÌ 3„Üqí[ŜhGaSäĦÌnİÙŭğ?Y°ğŞW´#{½†nó3ˢħèO½HiG^¤{:;ŜÍ'Ŭ†ÚĉÑ*£Ğ‡bÎ4şà˜"B•4bµ†%;6EÉBtħĜ’lê82hLiF‰ŭRħIÒ:︣›ċçÂşh4XµYÍRP3Ìh\+ ;V[A¸›W"Ù°â4ñ1f¸L ˜9ÁĊŒ‰˜›ĉÊQ$EîDEĈ°+ë$DûLG=ŭÁ‰6qž#Èç"cQ)È ŽÈSfèD—Ĵu”mÛr[F%’ä6£%Ċ!ğċoc3%¤À”%NĵYrsfFǂٚ}M3e¤´­ÛZâġï5°äGİċnğTX‡0^z ˆ/üOOxó€›Û´Çƒ!VĊ-&˘lon ^şf›ÇlbÌk5{Ĉò??r>#Ï£Lû&İT×CêW@ž—Ò/‘Ò5Mƒċ˙ż½}Àñpàı”'.42!ìum‰ dİ“/—p9½àċùC)e1.Ğz` 9àkħDÄ^Ĉ77·˜úóP#Éf£ÍGĵ ´Ş™§R1Ĵ£dĠȍ â%JŒÖı––-1İ U„ÙÜT$ÓTÊ ”ÍT–y“Tħ k·l2öyŽ…ħR-¨2µĥmݤ1XêŞpA7TòTôÉö@•ĴéöVµóú) nÚ4£r^Ğ^\ÙĴĥëM|ânğ–ï)­+Àos]0­žWGVċ™ħżœÊs%ú­ëè:q§Œk+pid“Ï–œ+,;÷°Ç hħ:à’Î2exçÍtı5ëĊŽgVîל@‰ä>Ô!"Üî’ħ›rÙ<•5žĤħ|Ĥ9§˘gK‘AÌi×XCg¤ ë´Ġ4[­MÔĦ´´X^û'xW@HaÉŜ•ĝğ5ȭ̧1Ì<Ë ÔÓ7uÇbZ†ïż>|ò­w8¸=Ŝpġô8•HÄ|ÉËĥÒ4;Ş·k·Íĉ]g~ç”KÔeyĉ|Ĝ¤X쁞½Ê`ğNfÇk,½š—˜³/ IDATŸĵ°ñ]­ ³dCefÌë|êşHÇN^ÛĴá,›{h°°°Û£*ĉS HrĜח•RbŽ\ŭ´yıgĥ,‚ĠĦpÍ>[Ài#ÓN~í^&ŭk\ħż65a vóŞòV“[x½dÛġŠ[ĊÎx||aÜ8aÖg>1ĜEM R’t’ċ=İĈöp8 éZÜŜÜp^ĥT×@ÛveÒ˘ş\%·TSÄËË /ÏχI&µúa·‰äÇW {użd–"ı'ïŭO~ġĞ_ŝĝïü˙âfşvÚÒ ½>Á9W; pĴÁH1‚ĜË:6$ĝ Â6—ċŒ9²ËÓ÷3&à‰k\ğTĜ%Mu˘żàêĊĴĈİT¨zFù€mûƒ„ëñzıĊ— wŠ!MY›ġ-í×k8“‰ÖWïÉ^ŝœ¤~[6Z‡"ÓQfÎílÖi UTĴÇ Ž$ıƒ0ƒM{Àñx+•¤ĴY˙âË/q8pwûû;ğj¸˘XÖ&›Qí½¸ËôĈ¨D†ñm ù2zßL_œGĈôfħ5£Şk šštD\çµ×˙]Éâ:ĈP2‚óò9íù&lJÌ:aĤx.V‡öjíN¨˘ ĴÙL%)1ĈÒrşMw0×Q˘iğNinîŞôĦš–ƒZïFÚ°Ô{Ė™rv ëZ†°&ĥışr—ìH ²ÑÓ_;|Íf•qÎdñbÇ$·Cš½²^ŻBàšĝañò"ĴİT½gˆ· ħ˜VsšMŭ„Œ, €TÉîııÇáx„÷ †8cœûşş [W`ì›jœžÎgœŸqı\˜óžóp]4Òİ;—†Ç9Ġ÷rçôŭ4MóOÎçó.ÈŬatŭΘ߭F ĞSıİÇËÂŝñ‡císBiĦœùkaARÂ8Œe<İİ „â'4M+İ T^“NsS‰ÌóWÍ[×Ĉ?9S}:ŝ†1•} ×Ùj1cš²³Ŝûò!YÉAÎۚ?fBµèÏĞêS…½°‘eŞoĠ]ş} ²•uŜkÑÈ2-‰¨ZyÈUí` B•$IxĠİéh­,”X*Šĉcù ôm¨ú<Ç2ĤŸ˙ĵ#ù²Á9 †QjÁ$Ñċœ‘cĴzÏ=ꖴ˘cġă)›[âğV#N+gÑ,çÒŜMİ#T#Şzı˜(ğ²ùcTàûGMĴCÛ.lÖŻEÚzVħL1™ô‡\˜jÖ<-uŻk–_Á^Œ mÛIç8Nû~@’ú×ÓùÌÏğkWE2àċ•AÔĥËĊEĞì1ô}É[ċû"Â7T*$íz˘šéP4éTôÁöÙoÛŜsÜM‘ĥäĊôĦÌk&˘COè(!Íı,ÒÊÀ/òˆEW9Mcĉ &ù:ëFĈ Ċ›ÏŒµkħÚX§i^âû@ ŽÔ—ˆ:MĠàZß‚ÇÓ6)E›™Ò>Kİז•¤DLGu~{)ş\•Nĝú{Êúàœ’’ê#fh•ÈhUŭÓËÇâ?~<Ⓡ7xxxà 642ħĜ²Ħċżmšċœ&T˜_û=ĉr'­Bİ<Ĵlb]0Ħûk) {qc{ıäüܸĤsg|U{_ÌUÓߚ‘ĤcıĞ%ŝ†è25víëJ,œß²Êj^·ĥU'è´*0^ÀżL^W¨°1{€Ôâž=şÖÍZpĵÍkFxïgÙ4„=|Uä&Q §TR-ì¤UĊ Ë´†ÉÇĥaoĊIöÒËċÂÏzâ4.ƒVÓ𘧲G‘ç(żĤiunnnpww‡››[PèÊTL§<…Ĥ’dSc&àŸžôô„yĵ”םĉ„ˆ¨šÒĠL¸[́)á2ŽO@úÉóóó˙îùŸ¸:yZß@Iµċ+Ñö‚°%ĥyċ[cƒÏ"¸e4H”ásB&9½‰ŝ+9â@hdÌó„gÌqĈ4²ħ&ĝP€FÓvQ~]zŭvlżÔüêi¸î ·é:B½Ĉş–ĥ%‡ÎKÙP›ÌPıf+Żt€–\ËÖ`4™\Óġĵ„›ŻYN;K´Öè ĊħœÉZ‰šZ’”mކX´6vÜTšÄb‚O+iDŞEôk°ĥ%Ölŭç ‰ĤqĊµ‘iš@…Ù!ZŠJTf³ŒŒ––*fħQeâú+5‡ñkÌğZ_(ĜŒ?(ÛUš äZhÔ3>ġ&ÓµŬ˘ğzZ/EnYXTj3U*à X%r˜Ĥ(À5nFġEoL&&G!Iv˘vĴ]àöOQÌ,3ž*öWïħl 7ÔèJr?OVƒ­ŻO5ċXLó‘0”Ö:­—ċTncRHrxúıôQàÌ£;_îw'›sDvˤD§HlÈâx&¤äM}&›ĥš²”.añ(‡/†Ċ9‡cӕñ j{— =!ĊÚÁ_ʑû!£Żâžj&m1àîÉĴ§>ġF‘³lŜNäevô=Ûñ0ÌĥEĞĴsŬ?`š’¤tĝòıôӀiš@Z¸|ñĠ—ĝôˆoż}‡wïŜ"Àfƒ_•~)Û­@B~í qCeԍUsg‰]ZĠŠWkzŜFVîÉE6†ÍDìÚŻ7De}MBÎÚ§ħßë×`%{y¸qžŻħJZUTÚ"sìô\&ĞYô· €ßJĵĈÇBôDƒ?\IŬ€Ë ¤ù Úè뤃5x×ÊíÒ´F´)ÉĜż›É…1“•5e‡]K(ë›Íġ×VD˜|ßr“|};1ôÄícÇğ;Ü<ô˜rB&Ìià6Ê4Yo]i Ġ=&ĝ€60ÈĠè°ĥċ}kXA. ëZ„Ĉ—×í½ˆŸdÈ$·÷̄ŠN×àêĤÈ˘ßÖUb!,8S=ž<ŭ?)ç˙íċùô?żr £ëžĜ– ^K4+'£żWŸ÷-H|J_\ĵŽsïtƒÓ ÙE¤&"N3àĤiÄñx,o4ŠşíZtm‡qˆF³Ke4Á, ĈÖÉé9Œ2˘V3bµ\Ş\ÉE3ÊĤÀ×ʔPÈ(.Mŭ܋^,”Ÿ§À¸išjĴĥnŽÒh2гlê ×´U>äÓ³]Ö­Sĥn2Z„jı¤ëğžnĊ˘]oŒ‰żOÑ)×ŬġVĤ rû{ìŝçxfC™!sÂ<̀ÈK lkqĤ×6ş„Ó LÓr|XÌeŽÜù{[ò‘Şr ½&™L&l\$Y:ĵç9òmÇM00JsĦiڊѵÌi ĴI@IJ@Ĵî+Ëi‘ ŭPESY^L‘ħäùꨗïK ïû…~£Ŭ#I½Pm$j—f›b:5@3ĥSuÏSÎÔ7ÛרLög#ÜŜŬbF~½Žżṵ̈çP)¤Ş´Â‚ Mq †w­‹Eo*ۋöÓ9ĉ„ܸŞvS `ÊÈZW~R}ğL#ĵ÷è§Q˜ŭ˙—şwé‘$ËÎÄû03÷x䣇„A/ÑB›0˜Ċb7ĜD“ó[šF!@+­´*h7€Òb6³0;A€Vš•i£á°+ğŞ23"<ÜÍì>´8{™E6I‘N…ŞŠŒôp7ğvï9ßùr˜şNíî9¸ƒĵ€s× *•Jƒ”“&j‰ëIžzıqQ½Ϥig$WŠú9Šlí…9N_ğîĵùĴ›Òí6+R)?s:MLĦâ*§¤J΅ yüŸKĈ|]ñîŬ™Í·WW\rBvÜ@y DO'„0pqâ0ŒTˆ­ëŠyĤÎ;Â!T`òHäËúpz ԜpşÇġzĊàŒ—— üáÇ—y&ïÄ󄄊[Zñ|½à÷ƒkqČr‰-T !F\ŻWüìg?<==! ‡ˆëBkġtš}j@ÍŜx]g xı]ᆈâˆ/›RA*EĊa"Êò.N’Äk>kŞĵßp<–uĊ)¸=„IĝFӐe]Ġ3|G,’'¨8 òşÀı¨Mќ˜PĦ Ċ×§'ü'!ëŠĵĴNüÜÇŭ÷üœ5§gšuçŠÄ\‡÷áŝ¸x µ5ŻßKóHm‰²m€ö7s—Êïi½™‰ ï%†ž„µk:‡”<Š €•=qÉUÙp–c½¸ŻÇì„Â\k2†ĥŸq†²x"‚&ä`,‹¨J#'ë[ô2ĥµ^kâg iñ™³<‹Ö£¸‰1lj{–uí"ƒU°ħÁ* UW-½–•Jŭ™<ŸŜyLÑ!”ˆĝp> x˙á/—  _žúú °vŒCœ€Çùçó#ĤiĚҒPa`—,Ħ9Ċ´ÀUÌëO/\./¸ÍWäşrÉBċAĵô}ĒjbAtàyÓ†á)ôŬÓÓç?=ÏŸñóò—ÊŒÛєċĥZ˘ıÜ|ċ×ùÀüSìĈGżvGEË Ĵ ÷ÙĦ¸Œ\=P*ŠËpkÁê*rȔ]+RɧQ‹\áRħğtµ€jzIê.XˆfâNïÔ6”öàE/-¤~Ói*Ñ˘ô Ûuˆċ2ÖmŠ–ü·|ô”~w0#R(ŸSmÎĵvÍjĦ>š53´ÖûÇÈQ1Bİ-‡WÓ_xÄ:jˆşV8‡Ê1EĜ£t]‹rJ½óżîößÛñ\vD³q:Ö•¨¤lYU~J!&ÍY‹[&áÙp¨%<Â9ß9.¨ ż4‘’Üçu]hÜm&ÂٓĴ‘sDÁëċ)eL¨*ËWö*s;T`'ŒÔ²àğ ‹<É:£Ğ.§f.¨Ú?22-şXËJ63S‡öŝ9k—v:Md^š òt:)WÙ ċóIċihKJp³Cdٚ{!ˆ<—ëJˆŻ6›˘06…_6ĵ¸Ì.Šħ{E.@!"œĞÖ\ߓĜL_?µ÷BH=şMäš;.Û²PˆFuµWŸûfFŻî(àµm‚K4GÈY-fC'²Ż?0QP;4şr´o5h·4ÏG|ÒĈ;ŜZnxñŜİ"|§œÁï“[ŻŜ²ñĥŽ*RÜşüwib2á4OJiXĉŸ.|ùú$\ğżÇŬˆÛ͇&bĞ)uÂîQ8ßqÙ[ÈŞFšóż-ŭ­pB‚ÀâÇĊ`ŝĤÀ­½÷Ò!­ÒĜ‰ikqFìêĊ°z}˘)Òë Ĵ˘ße&$ŝĜŠÍ:VÈ$Ĵ˘À[Ĵ×ğCêS£Ï•½Ì-ÁšM=ÖÁíŬ& Ow[xÚ‰|Ŭk…Ŝ;¤yƒ”{ïĦUqd‘6ċ(­Á"Àıž„Ô=JAâkï|5ÉdÀétÂù|Ĉùô€ġŬŠ—ûg<=}Ĉíġ™œ^ĵÇ0„iÀŭŭîîˆŞ°’‹Í0 Ĥ Ġ;Ä!PC Pï<i~}}ÁëġÏ/,ë )-¨•&Áħ%,‹èRZ0ĵX–„5gžĉŜ;ÜÓóóów?ŝĝŻ˙ä˙è3ŝ _ñˆ´ċ‹Ùa@Eu÷óÛoÉ֕˙Ş+%;„0(*Z Íğäƒ×Z‘ÓŒ’iTğ7 óˆi‘Ĥ;ÊK>M’†AŜğìí)FñHá"хì™Lfy­’¸e•î`Ë\RPnÛ0YlÙċ]EEë7â)·î î`ŒÙûƒ­÷`´ß£lúşû½"첇<ĞÑKo˙Óm†;DY›ŝ˙”Ëħ-ŽF´n­t?J>;ˆĠXLSJ4.°†…6ŭ’Q %°$TĝĵÏr„Z¸ħ6…Nŝ‰Sì„öP1Ÿ,²)֐Ÿ [Y#•­ÏäZË+ċûú‚=ĵŽ6} ñpì° kS˘jƒ)V;:  žyĞVèD)dTÀŻËÚĦÂaĊĈġŠ5eĞr“•`H”&×@D†ëşvtAÑċ•€Œ’UÜĜ¸ĈDqj°•ÑĊR*†a¤÷żĴ˜gJÂˌÎHPŒ¨ßë%’ôέ½› 7n//W 8Ĝ$8ĉRÔ*.ħ“L0)ƒŬh·¸+$IŞ”ĉ=—Œ… Ç£Pm·6FFĜ)Ñà‚úğêĠÏ2U‡‚vR S CCÓñ¨áñZ!lîžġŞh7–AràKaÛ mdòĊµTĝ1’—ŞÛsGQ6Ï Ż·ĉ0Ž×+^_/˜o7Ĵ·Ï_žĝĝ€?âññ‘Arçvİ÷µXpÚh6{y³aŜ6"V`ÂyÄÛ`Y‘VIıKĤ<˘¸Î­£İmé–ïk żŜ^ŻYAŞ'³ILŬqX͵0gK+èì7;ug.·IûÄħfC4$֑ÈÒʤ^8ân‹×jĵxCˆ‡Eîĥ~žħíĥœ_Ú%DìÀfÚşĵ‡ĥĝ.HdŬBôùŬ! j íM÷(âî|Ĉù<âù뀗ç'NN'œî'œN'˘^ä„êÂ@œŬqÉĞÚĜ‡É>˜—ó<“_ïí‚ċzP0x¸ĜĤşÎ3EŽÀ Úó3óùŒ×× żvyš—ùŻUä6Dw“HôV˘’…ë탲]öĈmÉÙn+V)è˘#álÂ# —ÄùòYÑıuVʊ?NóH£NIFŠ!:xĉ3”LĝUÎı]ıc´5’ġœ$›Ÿ†Ĝo·mL–Ú`Żf²ûÖi‹LŽ7%Ÿ+a9%” úğë…×ëêÎO°šC‡ĈġÑpIÖíĤ³UċŠPíJÏ&îM;<$LADZRlˆA´EŽ„yGŞï*ïĞŸ\Š#q…Èıaż¨\=YjÙMĦ#Cu[ Uš)áƒĈ•·éƒ?,ÌmêRW”0=N£ĤżĤSWÔġÊġrË9°c€8!l9Ŭĥ`–ġKZZû#‹ÜĈiÂ2Ϙgâ• …òÊ#ĝëġŠe™Ù;·v>•cÖ§y]Wƒ-*u=0²­ML.†ë”ç+…kàIR*GmQËÄám‚# ¤k‹J]×UQÖÂûžp›‡a€Ż ´:ˆĜ­ ĝÖ@ˆPġVBrHqBŬş.J˙¨p#ú$r:Âġn›hF£ûp” %ëĦ°5Ÿq‘f? úlаVi8é†á4uœSï0DmÊQ€Š7Bß àjMĉâU¨`ĈCM„ġFŻ#‹ ‰[?p8ĉŭS½ÜùŒì0!VŒAyñëoÙÒ&¤Ŭ7gGïɊôş½‹ê`Ûx[àhÛtµ×‡5‹;ˆ#Ĥï‹NĦà:ĤBl9µÛÂÚĤ‰íBJŠïב­ĜVàöV-Ġ ˜:cÓ^4Jĉâèr\‹gP"àŝîeY9ŝ½âáŝyP HeÀ`ŒŽâž8(p"Mùş¸ĵàċġ —— Öuĉsİ÷MN)ĦÂݰ-Ä|q:·/—Œĝäĵ˙?~ùúż=??˙·"÷u!‹‚·–)ğ”òĤµÈ·ŠŬ·èĦÍfÈ{U½IɌ>HŒ2ÖTU5E­ĉ%§Çá )Š$V]ΛqŽĵŬT\“)¨eí7*. cˆ-Ċ°ĴÚu†žR`ä0FAçà v^µ’—ïÖl<B‰­ĝl;ÎQû  eaËġħ@ÑĵùĦèPƒ²OuHÀFı ïĜŠ JÎÈF\7H´¨ ×Ğşî9V^t­µd€}O×ui}OÛèɏ”7¸˘¸>Ŭ­mÒU„z0Ĉlı€è‘U‘lĦ%ÈHUÑ~>etגÏi+›ĴûFġ°…¸Ĥ n£˘L1͍˜ˆD6/EX{€›GA8ċ=Dúĥ" LE(Œd‰@J ·ùÖƒ RÌÔUq.ĊHmÎ'âŝ0Îçs–Ëı+êAb“ gâ‡È rbë³Ĵ´‚?ùù×ëyMĥe™%R™T$ĉ=Ħ‡Àş<Ĥqxş^_żğ^Ż˙µwîë˙ê—+ŝš_ñhäbĠ…ö"[_7Ğ| b?V5öfĜĜqgĝĦöRĥş‘ÔíĴuQkQçœ1”Im‡BŒÈìé9 ÑGÛ‰ħÈ/K>·tĉqZMLĴxeĥÑp4ˆIBáĜÙ.nkħċ66`R\yïÔSS Ê£ŽTż}ü­ˆÌQ \9ş÷­àÎĞuĜ&ïĜMŽ"TE)N?3íúÌËBökn'TÄğ/y›¨ĊHnİ×ëU[Ŝ9ĝ6^†Ċpċd;²mEFâħqSˆôŠdW(˜kA4ƒĜ˘ĦyóïZÏ1şĊ ƒËL^ĞqSˆÙû:òZ·ü`â´² `=·(ƒ$úà1ßċ’qĠù|F)Ë2Ğ%—ÓĤqj…!Ÿ…;:9Ùı>hF`0RŠcq$(9+˙WĈÙ[UşLrlĝ„=0„,SŽš –uĊh ùı4ôw]×5†ƒá’—]£ag ûh£Pïħ½ oXĴÓ|'Üj{!ìÇVMĥ41Ĉlš^˙8ñâĤkgOh]^†’)½ñZµÏ•LJĥÍ­-î||}k'öuÑĞğBç"!T2ĉüĉ”:ŝĉvŠÓ FûÙwÛĦ›ÍšŠ‰bDô İWÍÜn7?Şù IDAT[~˙ŭ÷ĝúċ+Ŝ½‡Ç‡ÇĉÒ°ħÌş† :İ›n:ïú™R3eml%ßr4Ĝ6ıí[4†ŽŝVênoÛM'Ħ˽3y8zíDûp*w Á°.ـ]¨DŭŬ`Úĥ¸mġJíŠÇŽĤpP×ĜİöÛÀ]Cн ÂñvêÁÂÎħċ€*j,Ž|}­ûÇznşÉş×İNĊíuĊóó3.ŻO¨%¤ġ¨ìĝ!C8MUìLĊcž4I—çg|ŝü…ŠÜ²"šç§M[û¨úÛíï#ĈqÀm^¤&zş^Żß===ŭú߁ĝĞS8•BnġÊĤ@ŬG×ġħ¸ċM¤×f?§š†K„£N ”ÁpğPıB„Âw@*Œĥp"Ôx£\ċġ|ê ŒS*˜Ĉ‰żçÈ/XG/²ğ=ùÇšžîŝ[Gƒ:ɕÑíQ!(‡şó‘Ñ”zVPeĞäŬ#@sEôh¤ˆ;aX•Ä&{ϲ´„íşŭžĝá ĥòhÙU 8‡ |^ fúù\ÑF0„xğ)Ëáİ).™^h\^1Ï R".c݃?í6ߜÉİÀ;WıĞĤSІ'½§ğh£ŠÙŽ(RXìĝ},À²ĴÂ{•÷í\i<__Ĝ  D€#Qjօb†CùWGyßĦÀïî°Ü]qáä5)Šäşdu+HíàYJq(b˜”èwBIĥ"óĦım”Òb*5PĊĝÚ:ĥ×µóÈâŜ‘QħÖ nǐkFñ˘ƒ°³ í#-~|]VċöK,³÷R^z;"}—ϟñŝ{ÜŬŬŝî‹ÍW™6ќÚó„™6X1Ŭĥ@”xb‹XZ^uğ~R€‹À$mÌĤOŽvÑî/e‡ÌÊżlożGŜïH0×C*Ĉ֗ŝwâò™½w‡‚ßE£tn?Új‹¨àíıĥ½§n{ĴíĜVäĥçŬöEyĤû.,bĉ‚+?£g&'ŽY C)~Ç[&FfnûáĉŜI#µ.+^^(Ħl~½ ô)•@ĈtšPǰğHî3.pNäŭ™À•ççŻxzzÂzğ¨'‹Šğ]g‘ìÀSĦœÓmœN˙××/_˙ċóóóóÇżúċßH‘ÛQZĦuĦ(8§ıŜúĤà½d";P Ċqڈ-ċϲ(¨,~:âÓBgŸU }G­¤T-ÊëÌpŒfxòÀ, ·×+Ò²Ş7ê4&”ĵê˜w8QsB Jfí鄈TŬHJ­@"N‰XˆY*C{ï£2´‘~‹cu!ƒċÈEmJ‡ôDG+ŝu‚è9çá# 2ĉeél½Ä•˘ò¸?²z[ĈÑ˙ê²(cqƒçTĴlì{·šbÉӇo´†@”Ö>xĉŬÛĦùLZú…hK_˜f-¸Tüç=–œp"£‹Pk›f³+ÂZw:Ïj–rS˘Ğħ{„)L|wm+ğè„$r;FLhèĤ¤˘ÙĉC’ż„Û-‡¸ÔbıĊ˜òÀ ÌĞZÖ:ĜĜëUFG "M#ñy²q>Ÿµñ›ç˙ößŝN§ ïŜ½‡÷0NÍkÜî[ĤÑVšH-ŞßóÁûŜeÀ7]S· ×ħ°Œé³ì ÔmàƒpleßĠ"‰÷ÊĈħŜÇ0k1X› M£24Żkmê öˆni <µ÷Zà”žy@66iŭkn9ïÛşAÂ`&G{JĦĦj@;*€ ‚R‹ĥö…rúĥVdÔ7Ñe9c“á˜KĦm‹hħ ;âìŜ?ċıTBzfď;vÏż‡C^nóŒ×Ë3žż~FJ ‹„§#óOgúÌü:Á.˜ ^^.’ŭöӟ>ÜŬ}ŝÇ˙ĝUü Ċ-·T"gZÔŻ?7éB—‚—LqàgGïWځBÊî‹áŝK:+J`ݞ:`ê,i*)í Èş‹Cò7ç0/ †á†rw‡3‚Jó˘¤ß=lFi<t ”ħRú[£Pôc% M0<´mşXD ŭċq­Ċèĝž³S:‰\u@Fé½&C?rŜĦĴİÊï­µb1†û:1,eS˜Ş€&Ò5Ôħ°_Żċĵ Jožıq›3ŞïĞˢsĞ•­Ï"()%„’|Ô1fĉE˘Ğ·)Y˙qôÊ{ŬŠTü´ è(}ÄÔ ĈĊLDšş‘V ù@wƒNµ ħ°˘ ùܙ‹U‹Ş—vpàA5rÎ|ÌHQ(‡ħuĜĉNAÌħÛÜ­ Xë†`HĴ-Ċ\fÌˌq1Ž‹š§×İŭÎy^ĉž‹ 7Bs™—ĵE×°´Ġ6{’bDäâĊ;Çnĥ†·ÚÂ˓Bİ´ĈPRI˜Ó $àáá50¸Ŭ™m cˆpİ5t(+/5§„bB{ÚϑP¤£ûlhÒ>‚ÖŠš\’À)w<ú=à²iñ.ÂY Ĵ\Z4ÛJùLjÇċ÷\R밍#/ı ,z4r ˘w‰Iu\èPsABÙQҜIײ.ÒMĵçK“ċœÇu°Ì3˙í'|ŝÚDkç;m<ġ}™€Ĉı—ÓÏĞÈĠż`yĈöT~ŠùžÔCàÄ6}„7jTˆĈĠş>¸ EƒöÇ@^żq$”.Ĥ$•…àçwŸÇ˘£-mìX¸ĥmŜ·t†mĦÛ˙Œ7.ÙLŸ›U™œOô‰Ÿ)߉ĠT@&ëOÁıĝ&GxĞo²îïÒ<íÀ@áœr‹s)†£§8×ç'<=}é튊ηéŒ5jï‹PM=j&ŭËċùŠçË̗ J]”çMZo& ó„rêF"£vŽsġĠĞ_Şċ/7+ŞÉ;jƒAš G€½Ġ fÍĜûÇħĤß ÏÛíĤ*nËĤ Ž6êÉa8U Ş£äxóßù߂ôn‹’y™qšNŒèyUî+ρ™9´R .ËÜ<‚}`‹‚Ĉì6DÏiqċŞï8À-éÌw>GŸY ôéĉƒÛ·+ŭĴĦ…™„iô–ˆÏMN/ E^Ù'{Ŭ°Ì îîñzyĊġÖOĥDpċ˜@-]È{ΑÇç²Î„䙸nù,äò0욄-×ÏzqËHr0CCzKá;>›MS^œîÁoĴ§ŽQt‹Ĥġ(´×BRHKù–ċÒĦşžıèÙpòħV7„rüšGBĤƒ½(¨`ïCLż26k.0q™“ ‘³f?ëé` ½÷iœpw—q^ ž¸ĵâ6ßpût?ü€Ÿ} „÷ŬğwaÔŭÀze ê!×HĈÚp˧^èè&G♺sMheR*ğ"²4w…fáĜ V›úWZo ştVĤb|ħŬ6:6 ğv6…ı{ŭ#79‹ŽÜ,P`9£tv­Q<[AöŬ×ï~úé§_˙MòqߣqdlñÍWŻu½µˆ-˜ôû0 îüŬ˘„İcsX3ó’P \{Ӌ‰ìl?[¨Ó(Ùqäi‚Jh˚R3ROŻùy&qÈxGqħTM;Gϟ¨“8ú½ä |¨T•ÂqĞĴ/µnHêΌ7›I¸ï”ç3á—ħB1`k^éŭmÌÎ3Ġ‚˘€!FĝÚ[—ñtĈġzmĊ3ú1ÖÍ!—'ßq…Żk¸öÚÔÍŜ`}B­/­8ÀGB„ec‰E7›‚êî7ÒL‰|¨¨5ÜĦòMö"ċŠ´VĉG zE KîÄ#GâÎ˂‰ ħ‰ÂPşñş ÎòÙdlïL„£X„ ¸ÔcUtP*KÑXeAV“Ħb3‚×uEÍĦšÂIĥ͐ġÇUU¸o8qK?ËĈĜ7î¸\ħŭŠ1ıĦş˘`ÛĵeYT€&Âiœ¨˜ÎԎ‘³ ‘Ż*2hŠOÉçK9u£ĉ–×€ÂV†ò^µ˜Ü4örĝTöavl§ö}ĦîâñzV@"â4àzğa^WœĤ3îîïÁ-P'ä£5!wI,ÀŬŞùut]÷ĵH;ġ+fÏËeí˘İ…#XxOX—•ı{£4GÙÓğëȖuÂE”}ƒF´œBÇ#p‡Ĉ ÉRîGĝßÛǍùoP4Ë;G˘½œàâ€GL™…›WÌˌßŝô#ŸÙ~hÄ4ĝÊ&ġ´iF}°} ꒁdeıĊá:@Ŭl&ʃ²½ƒx€VWHŬîûY¨b÷_keJöğPœó„(·§İb‹ˆšHËĵĤ˘m(×=Ú‡CÄQc‚CuWġ‘j{oô²ewĝÙ žÖlEÈšsîà-(x4d\\É'#uİT3ş‘ƒ¸Îô=#ğSh1QX´ä‡A‹ÁşQàÊ5:M§Nà£^Ĉĵ&b -+%xUÚBÜÒꆳ,żßIg“ …'ĝnMĊ8ŞÇ­¸3ˆÏŽ’É£×wĵWù<ıdÔ´W‡‚mĤ";‡'u'8çq:M:ñ Ñí‹g^ß·uÁı$L~D>N$ŜËÖĉ”îİA#Ċ‹uY‘ĤFለ-œâÀË>ëşT;r£PÙ­âè°/ì^"Ö^Ìj J×Ĉj sÙ£ŽšiE‹RËoš ßß$8Úq­rîiÖS· Q§)ĠŬôHŭWÇáœxÈ˘gZóf×úÜıVD¸nL+ ‰§S1äÏ^kG³jšìžĦ*ÔàjĴ~[ƒòßÎ1b:0ÜÌˌax¸żÇġòŠ—— ŝüÏ˙çóïßżÇŸ<*Ĝ?´sÍwͰ-ÒÙWy´żHĜ=6zNÊ~g×v‚c#폯›Ûícĥj‚µ²£ñy.n›§µĠO”7‹fŽŒ8üÚM+<ßħyc½¸·1Ûڏı"Ö èóëżEǔż#×Ħ‡P_b ˜ñëü‚—ËOŸż˜7ŻÜ˜ â[Y„í8œ+°u"Sşn3~J?ÑĉrBrˆ(Êg.šrÛ¨W”D‘3ı ­İ"§§”Òwß˙Û_˙Ŝĝ|ù‡˙ÙZñwôÔ_6E‹ĠĊ–ċ)$E‹‡ÉŬ.nçóŠdv´ÔwT­,ov>:ÒuŒ€p„añ5Wĉ˜x”59'gÑ֜‡€œWÌ·ŒÊ£ċg,ˆ\2Ĥq‚ËN‚…?Sˆ1Ò[“È=•âÔĥéˆÛi Uq€émQH'ïĠ°ü/ݘ"ißuZNÑDËIéÁX–Yf ħĦ½pË*jgĤĈġ÷ëGKcwÊȕĝÔŞl¨ Ġ€žäXiO‡êÊŜÉLŬ‘ı"4)§Ô ġÖ_PTVÑ I*}1³ċ½•’q>?âz½Ş ĵ˙€÷ŜáŝĦQcJ›ÚĊ8šĜë9”“Òĥ†5heî@ŸßŬ;áNoíżÚıú‚{!Ĵû9ĥÓ>˜²ˆ…ŽjҊú (tf¤µµçĴ…³\AdİQïëƒNÓ"ˆ´ Ĝ‹×êN Ö£ÍĊB§1 :ûĤ)wĊİ$<î­ñÜN`żEu-Uc+HŽ>Z7üâ}‡"˵bIW\/ݏ<}Á|{ĊĵÌp"(ħ†}­–9CpäÛ½iMĝòċ Ĥi‚c7mÉXdĥôf2ŒkW—Žù”Rúîùùù×ôË?ĝŒżŻ(>.4˜•nôâ}…q ŸQKĊġzíˆî2.tŜİèŻçs5ÑXšWU“_eÀġzĠïœÔ{¸‚ï=rN¨9#z*\rJ1bˆ#ĉY¨×2Ós.Ç ıfÌK"<ï0î°êü„#|¨”"ħñuÁ0xÌ·ÛtUœ§3^Ó RÉXç+îïïq)(!²żc.)/ÔĝĉÁcÔ!e˘„Ĝ ĵäZ9ç1ƒipˆ*p›o'-´X•]ŻW|ĝĝQíÚĤqÄלp·1ÀùŠ4Ò/b5?͸żğçġ]€ëCH³ƒ›‘óŠ1’£J@†Ğ wÓ ÑñtÂÄÈĞht4°"Ĵ!‘ĜŝJÄ£ fƒnyÏÙÉŻ6z$\ĉ+ĵDWÈT,úRÚ!ž FuÌwGˆ÷4Âû€…Q á{ Eds,ĊÊì\2Cgu–jÁ\—œĝ—+ï‡Np-ŝs/ÌJ•ŝ‘Ö\À^şòuğŬŝŭœÇí{µÂĦb˘şf´ŭ™èjĴ)LÈ\Üq€säPQ”Òeך6·,dŒÑ;ÚÛÖuíĤ •÷l9ÓĊuEb•…ßl9âà£ïÒµZ˘Y€ĞDÉH ĦIVĝ,’ ÇÜ֐N§ %ÜRÖ"k--Ħ­"eb#R ¤Zà"5¨ì¨ÂMĴ LqˆŜcÉÒr:Xրs°†>ˆ ç‡GċñŝĉûßâË×g|x˙>~Äù|V×*ÈĞ( OP,ÈäÀ°zr}İs5eT_ĠyĈúÎ Ċ$ċ¤€Äĵ&½×Ŝ†i?ò½óCu*Žn²ĥ=ÉPçT•‹+'´ ÂPB:ħ–oñç=ONVıç†Î]œ ÌQöġŭŽÄ~"H­‰àùıԂÒkŭ!˘V[°mŭŝ-ş}ÔĴYdvë´°Ezé眓ÄĠ‚aàŭ Ÿ•ŝżı<ÔZqı<ġġח'ÜŻÈë‚èŒß²£25³žŠœZZT„RĈӖÈk5çk_wiS°Ĥ™)˜D#‚Ĥ&Xr-˙ÏËËÓż¸\^ŝÙ?ŭ“_ŭıZè†MĈµéĉĤ“²êóZ›Çf•Ž=4î”r5ĝ&m7b,›ĥF‡`6pĝ·Ĉ6‚rëN@h ñġçPµó¨XĞĝáŬ°Ĥ~ĝ‡{ĉħ ĤiÄ8fêpxÁSDÊë ÄAĈż^[cŒlàî ÊmÊ]Ÿ6\Xٔĥ9ï§ù „X°è"l²q ‚żnè -–ë'ĉêŜ‡NüĦ÷•=E­#|.Eu}€+˙„‰çèuîÏw¸^Żĝí?àËׯx||ÄǏñĝ€qšş@Ħ<ÙŻ´&uÙ>Obè·Vy–FP›°YŠĞîÏyşX#"ĵs;ŬQžk1N#Ĝ[fş×â÷ĉ7iGN(Î;UŒĵġ╳À9 ú$u5ħ[óĠĥ…·EZm8–#,µ‰Ĝ 6aĤÛĦİ[ŠV0Äħ—‡>–˜~Ÿ·q/X“P i Ż×<ŝŠëü‚e1èÀ5ò.µí-}ïߊ;öž‚óùÌçÚĴ–šÏÏÏ8NO~ô˙â‡ßŝ?ä’˙÷ú'żzĊż£Ż¸ç_֝0Ĥ{I#j‹-lŠŠ$ÜÏeO oö)o2 ç…§Ú[ôY—D\óŠĠĤ8ŠÔĥ ·ó: \(G‹ÏċŒš^¤SŽ–qÄùĵ Ĥ3†H#Ù…G>4á/Ş°•ÏçK8ç‘8tÁĈKcĞ!_9Tĥ_²œßÀ–15Ó_s²fLhB? öqVpĥċàäĤâŝ醓ec-ÛĈfRä6…ğüeÓÊĈ*Ĉ‡r ̀]UŠáêVUT6:/)`:M8N¸\Ö^p“)@Cx…RÌM#ç6J^Ş×-N*‰ÁĤӉŠÖċa5Ĵ$—ÌIW†ĞX ˘˜Áç‚äZJœ%ÚĤé5àA‚ì8rK=‘™GŠ  RÊpĦ ”UiÖ6‹îeA­ Ó8áòraA9İhġŒĉMkUĝ%gC ˘1y3*Ì"#|AƒĴ½YY ÊԜhäìP˜Ĥ!bG£(Zƒë}' "d#_Ò­ĈÖÖK6aIÉ"aHi~•= :$ĥuğf,™2blja‹Şi3ä{Á™9ٍBl‰dÌ/Żo7ïœއ@'ŜĵzŭĠJĦ ‘£Ş3ğȁ&ˆ×ÊHİtÄŜ…ŝPȉ‚ĥòĉ9°×E|9S*ÍúŒïŸMys­QB½o_Ù.+AŒIÉI9é󤔴ÀŸƒ˘EËĵ(Ċ@’5•­¨,Ħ3ÖqA"JĉĴq9Ü<Ċŭ‡ëm0Şĝ>+^7° ‚W™-z–u¨ÑLθŞŬ“rìC¤ÑĴĤb,hµĝhlĤ Cï"kYmĊ¸Àĥ‘Ĉ’c&¤è$;AŠ6–4·#M=ƒ'SöÒ~oÎCŒVĴ]Q (_EĠ˘9ÄÚÄĜƒÒğc× çFN’בƒN¸üÂml”·Ŝ 纘)A.äK&̓sVlä•r ˘54/ċà|´y—ÂL8¨ÁW§–49ÑH² â2çŬyRMìouP~òVĴ—9ÊF··bW"‚³:Ġ8ÏSŒĜĴérITlË{ۜƒËMîͨZ~f^“:1È{òĠadǏÄÍġŬŬîïïñòò‚××W*xż~Ċûçwx||ÄŬ½:$¤RµÉн.Q̛βŝÂĦFĝ”’ÜĥÛÏK‹V~ËMGÇö™î@Ŝ¨ ½ŽEŸŭYċµçÖHŽKOszƒBPvÍı¨U€Ġ9ÎF|t-ßĝH¸ö–mĜqáîÔŬe˙}ßÑ.§œœħÜfĵĵ>áùë+!ı덊úX/Ċ{‹ òÊo4sß*{g ZN7‰ìǢâ=ĠZżûôéÓßjÄ_CŒVßĵÑ6ħĉhŒ-·FĜ½²—ĦíĈŽP-ĵG‡Nq™Ĵt¸0 p•\@[콘ñ]Xmĥî;Ǔ>â¸ĉ”0ĵˆĜ’£fBVd%ı—R€ş%ç¨f䕐Á·„8NüHÖd€+²I‘cy§"íĊdYDߣ&ĊFù‹÷m˜ƒq5 ĉ˘xžÑ ċĥ³ô0 ¨Áa­y]tb¨'#µ·ÊôšP™â]K/TvFĉ×ĵ"†ħ‹÷MùıĤĠ”‘Ŭ[6~Äħ&žDŭ\Ŝ7mƒ1v §ÓW:ÏӒ3^֛>{DçŠbDÔuÔö–€ĈĊmŜڄ>xÏ?jn´,Ïñß['€ á¨%#Ħ%3’­–=J.Èt7Óŭ)tá´G³6‡äŽ9³Ì <Ġ‘5YİA/ܜEG48v×Ф‚Ĉ×§ƒ‹€1\^_ħ+>}úÏÏŻx||À#îîî1ŽœPéÖYBX÷Âä-MÏêlħĜM¸ĥSV!i{ˆ;,n-UHšUÖŜ–îh˙ïžmït*#“YBiäĜ³Ede÷W‰~Uʞw{TËԚż‰²néMߚmĦlöbÀ=5ᨎ¨ˆÙŠdïa¨Ġ6ñN‹ÜËċ‚ùġÏÏOx}½"çÄÓ¤ oš>‡rH ۃŽ^Ż ż5‘÷\Cä”pžNKJé˙Mëú?ż\^ŝÙߗ"·£.´xRżĦĜ£uŝVħ(MpùË$ xßû9JĝDÍÌ:ÀvE²äĤ8cQbM§÷ ZşÉŠb£†cĞnFŸÇ ?„Ù͌TP!uNêĠêC@Œ\JCe½éÓhlBˆ ‘dĜğ¨h–4ıíHIŒÚsÎ,ş+ëäûÍ­¤˘÷ÑR üĈjğ!%‰5’uQFBWúQŞîy-̽ ]c‹ÛmGß\†Ġ6ŭ‚ÛBn§ÓIù¤ÎQRXŬ,cŻÂÁ ˘}¤‘9Œ\ä 2ğŻËŞô‚Ó)bYf vŽFÊ)eEÑ, .èX‘‘EÑ ĈàöŜJx„Ż…ĥ²0]A<`É[5vÎzs´nÊÄġ“˘Y†aÀ2/1Ş›i:áv›1/ {ÔöñÜŜ5 BŭrSàŻd×eşĠáBy›²nÙ!d]ĴˀuXğˆpK_{g…X4úĴJħ+ñı1FӌDĉۏ*ž+ĥ§Ò¨u]PjdşĈ~úĥ |Ŭš•ë*À@ 9ô#^ë R툗߃ ‰‘? ‘ÖŽş–Â’3 pSjûƒwĠĤĴkÙ²‡°×&@"Ħİ@Ĥ Fì”K"…ĥîɍnĠö‡‚àö{Šg÷ëtà<‹ŸCOE(üğ„;+<ŬA Ï]ô­$cYe7Z£{´Ż•\Ŭ`Q/pŻ×Âŝĵʧ7h£u†H‘ÂOw˘"µµVĵ^n¸^Żĝôé·ĝúċ+>~üˆ?à~:wĊ›ˆ[·ßóù-­lÎ-˜bl´´\6Ï9ğżäܸ£.ĵQ(Y!9ş÷²›@vlgġ¤…¤ċżÚ˘ÑuçĦ £²÷9÷Fa‰W÷-ÄÒ~.kcvDA°gë³ğ ²8² k1-5M €VŠò}}ĊÓÓg\_žq›g˘’ıJuqÊyĠZ띵ïÇĈ.Û{`´ŽmÒ2œsOË2˙˔ò˙xıĵüŻżĝĊ\÷è+ÚÙï‚ħ_£°ş²ß\lW°]0vÑöq~ÍJˎ}u¤ˆ^ċ(żċOڅnÖÑ8ÁÉÑ·Í=€ŠÏ*µĝkà°òŜ]ɀ5­XsFM "rĤuEž&DŻÂ‚ñäâ4p"k—ˆ×işí•hASdüĴÂ/ñáŠq˜y¤İ£6PxdĵW·B}WL‰ñöú(ô Y‚¨Ş•#j,ÂZħ¨è½,SŞ£àġ=wQ ’lSĉ‡|žqqww‡ir´iŒF'ħġ9ŜS,-­˜ùŬÄGö]{Ŭëùïço Éĥ^ÓRۂÛÑrĜß%…䛜QïáY/`½f ë Ŝı÷‚1yÊŜ+·çŜ:CŭİuĤ˙½‘lh #[1]S!4w$ĝb’¨kóLñğDyĈzğ5ó¤›ŝ½cgݲCl·´İmg/ìÏŜâ4†ğ7OŜ—ïžž.˙UŒñó/~ñÏb?ş8â¨ĝĤV1 #(ö ’ $(Ğ*ƒÑ[mtqvâ¨à9Ñ9ñhĤÔî˘[áVñè:ġiî ߣà(iMmVBBT 81ŞÀ—‚ıVÌóŒÛ8âááyRÎĴµÔ§ÁSl0¤ ¸’ĠËnmìž[¸Fòş‘Q¸îa‰è5%*ĈĜĴDd<-ĵêû˜gVE‚â›Ĥ;×"È ħdµôqŽŠ Ë T.›Ù¨Ddb‹/:ĴËlvG ֑Ǟҽ/ĤÈ·è(]› êdáñŠhfYfM8Êĉ“ŻÓt"´“AhilLÈĵ̚Â$ë+2Żnfw;J”°‡ĈߍìOğ/ÊèŬ³:]btĊS½€ı` <•(üğĤqTY:yŽ #½"~+µ°oÁĵÌxŒïİAr^½$Á÷Á+…B”ÈÎ9µŽóÌħĠ´&Ħ_pa'T ñĥ£ÀmÁ'ħċnjáäCwàċBáŬ¸§ıŭž—EĊ9Ϩ^Ĉĉ™-údÉ×!ŝöŭ”ş’ğxçµÙŠE.kaxĜĉ×"è ġwkm^°r=SJ§‘-3†0hâ[+†XJšP[#}S³+µ%cFz˙ΣjcŒXn‹êâ~’ÒŞû8WˆĊ`¤N£ğŻ–:…×­³ 7£µŭ=x‡ú¸bv|NFX‹jĊx$Šîœ¤ŒyÚï#MÜĉÛ˘wş†Na9SĦn˙}ÂO?ŭ„÷x÷îî1²_ö[ ”ŸŠ7y§Î„ĠDk:ĉ´œQD´ĉİĖ^äV7Ü\[q„mħíM:Ŝ–]6IĞ[Dv_ĵġ5ÀÖv+ÄúÖÏHÀ ĊÜêC—ê7~ÔÓn Hİ9­w0^Ñ4ĦPôuĉ”pı\üüŒëġŠ4Ï`q/çĦĴĊyžYsPŜ,p·ŝŜ‚WʞcÍ÷à Àw?üŻùË_|ĈßÓŻhÑ1BĦú @T•BUŜJ­Ž/@>< í´ˆ÷]6JXko4@bíóħKÑâÔúÙBz›v²ġkb’Œ!’H‚„„h !"Ć6ÄÁ#d‡ŞÂŒÌŠzÙURšħ7 /”Îtş;#çI‘ 1ö·Û4‚;T —ŜÙBrâU•â,U˘HÈkFşXŬíƒċĜ6)ş…=hžÚĉ%ħÎ9E:ÖeĠÍĠFKQ˘W 1ïcÇËJmħQ’–V"ħĜȨĝ"—ĞCä˘<³ÀÄ{‡0‘½Ïí6ëáż=ÔJ­¸. †ħ"˘Âċ€1DJ9ïPÖ҉£ ;MŒ§‘8v’]żĴzŭċà§I7„JRĴğœħrÑ2ÄÙË)á4°bĠbş0‚띪×<¨ÈGÄSbI%…F Y'ÑYm·BM–4=w÷w:ġÎ!LƒúŭJ‘p>ŸġúMÓ¨QÀHž™×ë Ӊ&>’H.•çaDX€Š‡\‹„<a UñS^–e'\I™§ÜàŞċƒÇ×/Ï1²oè-—† 4’aTŒ)6Á{µušĤŽÄ{qÀ0 ŝQqC”à˘Yĝà‘— ıPŻ$Ĵ‚/Ü ƒŝżuò†)ğ]î[äRxŒ\וżtO&Nq6ûrUÍĝEœ7 cKRTDÒwħµ; > †ˆu]°,3G!Ë:kü}Ż ‚ÚĝŞ­`hÂ\Pê˘TÏÓihĠ{•7˘zEn¨hÌ)Ğ×kûlb—HEÑ4 Œì–…¸Ûĝğ]#O<ÈŞ–4œ´°Îhk_K'ĵŜ&~&²9ż†ħycK„6‚#Ŝ.@‚K0 %0˘ž‹FŜn7-xüüž.Ïx¸żÇ‡ñx÷ Ċpa­ NëŽHi:iÒµ#R$TаJH¸ˆ ­ Ì…¸ÖÛF oûۙ³êÄHéNLkш`.Ĉäü!ÜŞ{-`–ŝPU€xÄ]–ñ(µĴıMútŭà}‹k'ʝïñÁèŸÒh3'‰ġ`Ħ€z”yÁËË—§'²e,™ġSĴfÊ ™Œcàdı˘góV´Żî ›Iŝ;%ı6VY?˙S)ùğüñ×ôGĝ÷ĥÈí]íˆğÀ· Üĥ;ĜĉX‰ZWˋ› ĝeV6|Z[än••[8ŝ¨¸î#ŭŽ#‰_í ”â# 2ݐP-§BİÄ0ĴŒ Q20Ü0N §“^X#Şl ˆ<ĈwX3ĦĊÄÒÚŻÌüĵi1NÈóJÁF͝ßT“ĥô8µ¸*ûÎĵh2žk…Hŭ‚ÒÍħ·êœÙ°ßRvT>h”Óä‚مı…²i· ԕCBħ [òÜ­IGë:ŭBic–“Gc³pħ#Jïš]Z Àˆùvĝ¨#5=ĊÓ֓˙Ĵ›<˘qUCoĜÊ_ċTħÀŻk^🸴SġÔâvĤü„H:ċÌübùóŒ, “BéòúÊeÀ²,¸Ŭn(êgsÎS8„8ĤQµİ\í k|YáóŠ›y>‡.}H<ïFNÖ1žRÂĵ¸Ö˜ä˘":ıĤ4M¨eÁş.¸^ô{ßı=Ì·[6ó`'-ê Áò” '‰Z,𳔓œŠ÷úùÀ[ĈVe. ´XuĤĝ°÷–ŠóùŒûûL§IyÛ.zއ˘ĤĊ@÷÷Çñt1ŞZĜÚëûP|„„Ż}BšĞ[Z€Z%s0M„,Ġf'Œ5˙_K!Áħë9šÖûĥˆ;âX$°IĜQUĥĵÎúB% …ìV| Ĵúìûŭ.çĝ(çß=ÁġÁsÊP Ĥjl^½4b½âvğ᧟~ÂËċ‚w÷x÷îîïï”c.ëBĴ߄Z”rBvmÙĝ˘zt‰g–>BBÀÚñD-gĠg!m˜j¨“Xsm´ñ0ïQeKĞLÛ&{ÒDŞı;·ñlvGN…ÑX*ŝ$ö×JżËÀ~švöĵÜ#4xëAğñíÎ'ĥ-Y§ÎÛ7„ëġŠËċ //ÌŻuĵñ!@û}u§qħŸû-Twû}iÚı›•ĥĉ½{™çċ_ßn·5Ï·?ûû^äĥB·~›Ÿû–i°ş[“a{C[ĥ´Ĵ‘ĊPEo‚XïyšxÉb×âÔ}¸Ä³äw;´q¤öÈİĦ}†”’*oġÒxĥLc%ˆ8”\Àïı`É+ÖDEÇ8PèÄ4ލ…şÁœ u†jŒˆžŠèꀒaPsşVkċ@Pè3ÚyÔ4U"oü9O‹ß³wpĠïşíĈë쭏z†3ĵéM‡cÙ`z­F­‡&l"C% ëXĴѕZTt h›’g— Z7ó²`ԏ IDAT$ğ† J¤[k†ÏÌ#­Í @Ŝw:f Íd 4ŻĈbĝâBmHİQl#˘5Aˆħ•Äğ\(ÚTRꨘöZ<¨OŞX׌äŞCĤm!~Ä<§fġU‹Ú€İ%¤%ßó%XP\ĦiĴëşëÛ"ĴœŞ NCÇ Îê-Ф-36$ -¸£ëxıĤa ƒçP.ÎSN]*˜˘\2ı u”[&ç!°³b½żL tŸ@˙ĵó¨Á‘˙nIPŞĠëxX¸ˆ97ğ² ÚARÌT ô­ap‡Ó8İëŒÛŒêñb`еœ àK› ÈÄk™=íÀ‰Q]c˘ ÷Ë<+dğ.•…Ċ~1â˜R—öGâ9şwĊöUqo•°(!˘$ħg³âŸò³ÇïĠš"èú2Ï2:Ŭn·Ê•ʸŸ}qÉvŻ xóŠ+OÏMF DÉFh7gî-Ê?·¤&>ĠÂ!êùİċëiWüMo}çfRL™j˜"5_Ó8^ÔY´b×ĵ ˜!ħ+]Çs‹_C;qè=^Ûŭ‰8T…Ô„%K@„.ò.ç{(ÖOÎÈëóŜ ‹@½Wv4jñTSĴlcĉÍ͎G 5!,ĝáŜż˙Ż_½Ĉŭŭkĵ{-RY((L59ÛŻĞ@îß·!vċKŸW>ŻMƒQ:ôSP~ç/žZs‚ş÷­QTÚ´éĴX4ĉb³bMóÏϳìY-q Èkë%Ê"­wŒ:wj¸DX×QÚ~ĴÎ6ô’‰ĉvĜïñĝé#ĉÓ ó² Ô‰Ÿ5Èçċs~m:£]ŞŸÖ~]oxïùlĜ Ġnoo>ŭÓúßü-ùòßġ—š[riQè£Eh—ˆÎÚáQ`A~ħ_ 0ï–e]Ñ yhxáêÜX,Vâıכ~Ż:Ĉôòg´ž”pëôÌ)H9 Œ"Ùéµk´ĥˆB\ĵ„kÄmÊ)PÂZ‰óqŻĠÍĉ„qœ°ıÚb µû÷ÎP|ĉT*/̒.!ôqÌzé \°Òeïl£Ú(Ŭf ş ë›¨ĥJ„–Wéy‚ë˜Ĉ”ĤqêT·Ú‚°ˆU¤fĴİÉuİSğ6ĠıEĤÈê+ç$B§aàĵCŞb&Ûu²wç}Ż–f”‘ÇëıZù„ ŬĞqBœ›P&—ÏTœÊ³%áS‚ŒĉdAHQCȸÀd‘'öá rĦJcMò!·tòzôÍâ½0‚äRLqÚTQPìè8„˜gĘp< •s0ò@(÷kIż‡T}ncŒĜív˜6RJUéOŸ+ tÂ5XˆmÓ 8Ínlôn¸šH*”“ĵoö#N1bĴJ÷qğ½ŞïÏbŽ•˙Ŝ:L~ÀR÷•>9„4ħ· Ók(!Ğ ³şYñY ÉħÀ×׊1âtšqšO‡¸Ċ8n[L4y= njÄS.k¤Ĝ·ġ/† Eĥä&ÑUñ ı88Ġ.jŝ˜Wˆ]>ŭŸ?‰PŽ›Ĥâ0âkĴ%Düp èj2uVĴžGŻê‚U[H6Ê̊£ŸË™6Cı"bS“ŠB÷@´Sâ›,ĵö’X˘­‰Ĝ9— ÁíġRJ2)\ÁġH0pv@q@Á¸½~…yžñüô„çŭïß‹aŬn‡ğğ×$Z§NĜۍßÂÊօ]!œšĞRĜıĉ,üĦN Z휳väє‹b§ˆĴün3U~ljkN#£Ĵ4z· ñôŬûê|(+4kŻr@`Áğ/Ĝ׋EJş€L™‚)˜[ͅxN„LĥÑ%}ĈyYàÌ ’–Nx âĠµÂá%ĝ$ô>œsZMµëIM>Oä+QŒ?_Ö4ʋĉˆ—–À&ž¤& ˆBTÜuCÜMġÂ$Î)’ÉuÂY‡í–œMž÷A|}ċĉB˘³bG:*qR‘áċFş1™³Fżé€açŒ&,ĥjúUR¨|ÎF‚ĈĊuH†) }š%³WcïœQrî8O4_ŬúĦŽĥM§ÄCmĉĜİEĈĠ•"c$çB듓Üİ>ÈùCó`ú •ı€Höâ29KÌı…ÖZü'ĥŬÖt`  5çİ^ŜE¸{”Y;×èD:­}¸T3ÏşĴÖxĴĵîiĊ^ŠÏµív‹Ó|ÀñxÄ7ß|‹§§'ĵ{WwŻh P÷ {Á­Ç9+ ½]V?|£@ Ŭ$M-ğ.\•Çê-$/!55˘N4êĝRŬ˘×N_p€B9 ^è,ĈŞŽ­éznòʂëÂgĵä§Ğ‹ÊRŬBH8F›­"÷ĉIœ‡,j˘f.€ËĠ Ġé7ÔT#ušİrĦ×öŻ—\Ö a)óĵdçì‡ŭŝżÍóéĝÛXäž!şôżl=Ñ/\Eĉ;2/,ÁÍt½˜ 7‹AÈقxğkż>ÓsNà›zÉ(ùL•Ÿ2Ù u]—­cŽÖ%Q1ÎNĵİ2²[}r Œƒ%‹ÈĠ%"'JWÏ2ɝĈħÀ Ûí8À £äbĴĈé‚b¸ş‘™nÄhÏoዛŝz£Y#St(ġœf.vı8ÖVYĵyıŠ@J0@Ñ1¤’ۧݸ}¨8ġž‡1…ÂÁUž3‚ĴĞéI!ìv;dĵĥy,@P›ZN˜—6U˘½Ä.—ĉxÉ÷ġêŠüFçeĈ²,¸½½ä¤ĝ^HY2YPĦ“ÀDp–Ğ·ïÖ`Gì´p#ei…ÄBMÄh)+j„ë^ۑK4P, ²pwKÑ'\êC&$Ž´ÖŞĥĉjʳ¤šĝÛşĦ÷l’h߆’ĥâÂĥúf”%"-ÛaBĴV_óLöK<.vŜc>RĈĠĠµrHµÁ\Äk9ž€˜Yĉ†ójşÂaÎÈħÌg(!Ŭ‰ë›¨%§¨,´ZÂú·f…ìf+üĠ`IÙ¤ˆ9xï€ív+û‹+Ċ‰†Q4ú„ë„b\ä íÁÛÀ*ş gşÎ™çgž€†tµÑa8KN OÄcúÎè[\uÉDñÒûË%PE ,×Â:BaM'ˆÓ)X\(ËÄŞó~^­gï¤hkVcġKE·<9 ”5Š›Ï˜ M4ÊĞšŝŝŭ2=şĦ;Ĵmħ„°8‡atĜn·88ìĝĊ/oŭ÷÷÷²~Ü0HÒ£ÖLSë@@bƒsé)#ÎúÎ^²5 ĥ:kĤĊFĦ˙sžĵaMnœZĥ¤ƒÉ@m&Ûħl^ žSt#Xä}Ż( ÖgCş>עĈ—€żï /Gz[yž½Ż1b9ž°?°ßïħßïŽ3‰vü9ז§áÖXœë ˆšƒ‹öf ´8óĵĜŒ1;ïŭŸ|úôñ˙L)˙/?üáï=âo闿Ä'ıÄGÑÊ;î@-Yw]'…Ò%‡­4ò|I+Uƒ[\l Y tü$ËÚ¸ÉbĴ|vuòÒKè4uħ.ë’ır?ş"4—úe1•­"^ˆëÎ)E˘zœ–ÛíVĈĉİFà²Wĉ4LŜbè!Áw~¸˘úLyeàí¤àµ&Ÿyà2“ïµóp­; 4ŸIt$#U—˘Q‹G ÁT‘İĜ]€½£*ÌYNt ú÷Ó<#,AP3ç=Ĥ‘ĝ››ê7ğ„€ùtBĵıAžg.ÔÒy^`B EŽó2˜“k¨DîfÚ`‰ §Ó C]'싙Ş—ó=•ùİìÊaMîË\ŬìŬ][×µqéP@˘9Ÿ­ÇT(€Ĥ-°×lʉ˘l+jKÀ"Ih֒ŭœsĠĉ,Dş~Ö!•PGÌF~VyK,ݵg^·%iœèĉI.–ğµW-ÏtWħmÊkĥ:‡PhD}­-ì´¸°”‚ñˆĞĞ+I…cğžĞë+áj3:/…–cŒ1°Ŝ]Ûڔsƒc8zW%µħ8ÍVeğ­ùġ9ggW›×Ġ2?îǏŸŝĝĉĉúñŸŭ³˙6àoñQħĈÒdĞP'g²˙"ŝ$#¸-F8ħcŝˆĉPQ·ká%ôħD: 0ÂA÷i…ÀJ Q]0F!Éèğ‚eH%L=+›ô˘¨Ô=úQ7ż`½;ƒûé…ŜFMŠ›LèP2mcDŽĊ4R{„@Hn)9!¤zpx¤ÄBĉân¨Ż]€Íà#`jó08‹"(k”Q$sħ$ĝÀûYb ĊyîGoÚe İóë(úÙòh’ äuz™­š›Ö _­Ĥ2Âi!EWħ˙ĦċêZ*H♵ƒġ€Ë²ħZ£0ú W›+ÜŜÜàĝêއ#>}xÄLq0Ċ"œ"Ü5Ña"€çÓcġѵì1ıÎ vB\ <Ĥi¨Ħ¤$wĠ YQ3shDµ‚‹Ŝ›ëkxïñ”v°0X–ıR+Œâ†fQnsj޽™·–S@I)Ò£˜bŭ'g˜‰ĴÛĵsâßy:ÍǙÎLş%Eœâ Çù~0°XÂ9.HĦ Ìħrż³Ç0REŽœ +9“›IIĈÒó6ŸfYOÜ@ħM,ÒŞˆËƒl€â {„QG’Ŝ!,3JȕÖğkĎġñž֘3ĉ‘ Qp 3|Iäž0xúÓKXè°÷Ħ"¸Ŝ”IH•f˘äTSZëĞ/‹Ğ.í£0!žPì‚q1lÈÈŬÀc9Eĝ!á4Ïĝë_ŝ5^ßŬáóÏ?“fŒ¸ûá’Ĉ#Wol~VّB ™ĉb­kĉ˙‰lš"’\?gLuŭ`Ё„Ħ³Z+ıQ£lm°–yiĥ[+d™ßC'P­,Šsċ{„ğ4·ÔP„)ö_ĞšP"v­AŒY!˜mo#qN–İX:љĉj¸FÄMŸĤ)„£Ĝ\5³,a%úÍÊĠ¤Y –š ×|]K¤Q6‡ij5p'%2mTn|Ĥ‘,àük\]Ŭ"Ĉˆ§§'ĵ{÷Ÿq÷ú¸ıĦ{c Ù{ZK§%‹Ş½ĤqDWiɕ´\x`İ(lANĦĝΒl]Pĉ’x"E‘™°J<˜JN•j}-ĵ£Ôtäêû^"–İÖ,—&ÎzšĵĉŞBš‰— ÇsŬOj–kĥ ê . ħĞV—01g¤ ğŬûŬGœNä—]Û˘96ĠÉQû7Ġç/ÂzkİPĠ: c+";4J*"‚qœvË2˙­Çŭ˙Éэäâhî=v}f7’¤Jqċ·ÚÇŝĊŸ$Óc'mŻ8ì‘ĠVHşUü˘B#ê¸JÓp.Eŭ^VxÖ×7C6_"‰·CÒw<›3•§úìÖRDoĉ.ĠÑh<—‚Á µTï-D„Èü4×q’7Ó4!ċŒÍf‚O)Vu½#D½îċ˜F ˆ1"–"–B1Ї”E-+~·(d‘–r72²ĈÀúA!aıEܲ¨ ´ƒ‚÷FÙ'9ga‹ë”ÏìóÂR;IÚ´“ĉ—V›"yípŽ6k“z:@|‡fĉÊ ½şşÂġġ5†aÀǏñáä”ñ½ï}ó2ĉúĉÂxيÚŜ‹Á;ħĴÇ‘Ò˘ĉóé„i³A ˘~oÖu‘,Èk&ÂEÈkĉUDrTµ1ç½üĵµĊ‡€F˜lD€ä}–wtħ³´ K€ 6Ԅ´%lœ%!NĴ ˆħ‘\(œ÷H9cğ%K2=îÖ.Ĉ]NN8Š;q O„žm·(Ħ=ƒŸ—,ÉGŭ~ÀȨµ6i¸gÔK´)?IŝK{‚vY8옝Ċ´ÙÀ9‹ŭá$Œ—\ÔhÚ)Ó\˙. Ş“KrA9GĊÑ#j0AL5~[§Aj4¸TZ›ŝLì$ĦQ\ĉ˙³%™sĉ;y’}cdIÁŒ 0u!Ġ§İ¨ fÏ ÖïY¨6…EôçZ(Ê˙î½İï·ÒW)nšóĞW È<ħÉ8’RM›3ĜL6›I’Ö>~üˆççgÜŜŜ Á׉HĊ¸JûĴ“ĊĴ(•-G÷N³œĉĠÍĜyîÓ¤/½1°Şž :œ#ŝ6O@k‚žöV—‰Ÿkö‹ëBN'¤šDmë)ŝ~·.Ñ1ùû%Ġ9²`[5äĵ~Mq@˘Ïk­…51쟞ñôü„yżÇŽga?Hè5á<†ìÌĵyr?Ħâ_ŜK ˘.êġŝ2:£-4Òċ€Š¤:.êÖ<9.„[2Íċ5 ù}”NÓ kímİo¤ÔfÏ6QĦ•‚UG„µˆŜ–üžĵw¸ııÁĠĠnnnp<ñôü„/>˙˘KŜ‘÷a].I1žá DÄĥ^ìËÁ!Œĥv†8‘š£+Htî#!Ċß´Žƒ‡š(U²âĵUD“Qĥ\cq;ñßêfK3FĤSM­£kWv\YÜ Hñïä÷ôIRIóZÀĈ|/XiÏEħ§ÓI,Â8(ÂOŽÑ(0#,TœoÌÔ İuP‰³Rsdĥĥ‘cêÇZdÛGƒÒZĈwŻ^a Çħín…ĉäĥfY [E,€4r”KD‘XĝßcŒˆ!àWżúkG8ëċ—_ˆˆˆ"ĴrnP|ċ\Èn-Alµ:|ínÒlˆÊÙóimA14ʖ ӄyĈ팚ŽvxœOa cKm†µ£FßÌĉœh’ + è@gEċ~rT/‹¸ nöŽY%*²•Z #`dġR:™NÌJ+ m›È“Ş£R3’\-ÊjĊö%w…–îHgâZİ_G˙ġÙĠݓֽÌÙe­ġžöUàÚu½ÌGŒÓ(‡‡ïßżÇ7ß|‹ûû׸½½ĊŬŬkLÓ(Z‘V$9I’úé&rX=W— ĦÑ˙ĞÏBċRÛ'ħT3ÎĠ$Vž ĵħGs^§âĵ´z_šğïùÚ]ÒÙ(aŬşHjĤŝâŬË4L×&¨5}4ÏĝôévğMuR Ç4*¨…:Ĉş‰ß 5ç–v:nxMħXğR1Ïqw}}óĠ·ß~óÇ9—Ç?üü†}ħ½˜`9úş•Z40d. M;%\â3'ún˘ò~êĦÁi˙Ĝn!€qlÂ^J"\† ´ŭÛÈßħ9Ô*” qxĵħ.t9šżO)ϲMİ™ĉÄÙ5ÙW‹Ġĝ#Ï&qOl r!ßŬj"ë,B^R@Œ‹Œ `3]ÁK šKO&wB·:$bÀġ¨Ŭ)aϙ8m%vkˆVóMı‰=´BZ—”áĤ0 '“öäÔü´‚Ĝ§œ$.S8âĝ ¨(Ŝ;ÄÊ%ĞÍĜĞğWĜï÷x÷î~ù‹_˘ä‚Ï?˙)ÒzÏ0&"yşßƒ!šÉg)Ün77°2˙ÍD fPG‚ IDATrñmUŞvWùşD/H2˘d‘ĠOYCN İ4ÉÂÛQKöö]âÙ ħ6„ÇeÁ<Ó˙g— ñž °”LœWoa³vĜÂÛ ŜNˆĦày˙Œ§ŭ3n˜šp)pĴĊäŞùĦĤĤ­…Ĵ\S¸àĥĊvî)mİ1¨öcµ¤è jB@SEÖéΆ>wkŠ+şQ ĈÊWçEĠ^ˆd5#|Gâ ϊSm;$Ž,WĴ„ pSÁˆı1QĈî1FxçÛ[‡h ÒREZ0H!b>.ĝĠ/˙›Í_|ñ>ĞW÷† °‘÷ĈÀgğ‡\—ïÌE$WÇ 7׀-Ô+£#qñ‘Ϗ%-`)•ÜًÉëÙHŒ“ĊrWìÁÖ@8 ŠÎィnBÖúi”v>ÈU´{I$vFÑp}„ĝš²¤ÏÒşİÑzAbKkî&MükÉ=ÛúYĴΜ"d^µëiSy/—xÜR`\bÓġ‹bĥŬZŒ€ív‹á€y^ˆúĵǧGĵżÇíí †a´žöžFYS,×çoəŽĉÜh‡EŠç,ˆĴħĥ{ÖÏïĉעòLH+* Àm-€/ŸIĦm{ŸvİU.ÔÚn”9×FğID]£ÚAȇ>~ü?~BŞ d Qî½ħ<µHM›d2żĥ˜ëSÏ|›i[4{Io´ËÙ|ġóŸ˙üGĝ‡?üˆß/Ĥ.x­÷Y I]”B58żñ— .!Ĵëˆ@ıİŞoDñŠ~ħżĤRŻĠ÷ëÂL‡²Š¸ä*P¸ĤÚkòB¨ÄKİ)ÍL˙OÂ˕{ÇÏ&{ŭê÷wFÓá÷ÍĵȊŠÀÂêíL"ÇeY”ÇfT“ û‚:ğ‹ê¤`C/…rdñ g$œ#Žċ—_âóÏ>Ż£~ۉf]³Îv#ÉK–ħş¸Ï•êŠ #^­Ŝü‹.Tlw§kPŜİk·˘<[Stò\0wzĵ8p´ĜHĦ–€¤ĴN|€sW¸­tt:œáF>>-c‹5µĞôžò%ÏŬ|VßĴŬ´íj)%IyZBÂŻrĈóá€Oßq·£5VŬtLaıċ­ M/Ò&…n£îOçCĵşĤôŜġçÏğÓiŝê‡?ú×˙ú~c‹\M]°²AÍ2 R½9S!ԁ­£{Ï7|áà(ŭÏĤ‚l àTÁ òŻĠ + ×ĊĤÛµ·$áÒċĈÁ\áĞ7Âk#KħŒTËh·ħ¤ĉ&éÖXTœ `‹ˊ3@(2Ef` ĉ› ÒRäAN9 GÏ{*”ĤÍTÓ¸<2xo`mŽeĴAA CĉĦn^Ċ6²M–İ\kÍğäba†³'JK‚Ĥœ‹ŠġmÖ\ÙĠ#Aµ‘ZC —àë-PŒĊÖ[ïP"żonpwûŭ3Ç#Ŝ½û?˙Ċ/dD<Ž=2” ŭĊŻ ! „ˆ\ÑG‡:QàD db‘³Ái 8-1²2P,œpÊĦŽlc(Ŭç·ġŝ”‘Šzí§›jaĥñV&"Ŝ{dké}W„ŜÖ ˆ³c„Š&/ˌí0u"/ `żÖƒìÌġŒ‘ŠÍeYä~4Y#Ük ˆaD™„-ô3lĞeċ÷äU‚!ÈY6(Ŝ/ô†Nï#WÚH’ÏÁIlIlŬœ4x$ŒQàŠĉ„0w{q“pİÛ!X:Ŭ€˙ړĉòjèˆápÀ·ßGÎ Ÿ>=áöö¸żżÇĞWŻ0 4j‡QÑÄĴ\âÓäğt°K‚˜KÍ;Ó tózIĴTNġwZxĊ¤üĴR •FÜj˘4¨)F“c+Şer£R™žĦí·ĵ·!hĈÜú{²&6}‡š@XˆÀWS¨Ö4ĉçkğ=­˙ċ:Kj”o¤P ~úşŬÛ> …ĴÛÇk”:ĜÑëĠ„>“8 ej´ÙàÁ{ÜÜ\xĤÈ+µmYk.DLĥM6˸H/¤Z(ĤÔ}vħ+AĴĈ÷ŒŽcÛ 2œ/0v@Ʉîĉ”FGjRRŒ )á, )C …­R°£Çv;!Ô˘Ü{*xs-ĉ UB(mÔS7.Mĉ„ú†‚=ĤC-†:>íÊڄ7`-Äŝ¨˘ä‚‚ŒnSJ@P#9Gèk‹D(fu@°ŸnŒ×778xxxÀŝùıĉĊìv;<==‰§ŞF­rE\].‚°^_]S:ѲB~ÓâÛ¸(~zCġSNbŝÎĵUŽÈd‘ M¸@´Ĉ`'ùŭ,FL)Iü/àš3íTÂUçO›“Äm3?RżçĴpqSµ‹ş{ġ ³Š:ĉħ>;A¤J‹`ŝ05£c÷ìÍˌ>àêúŠh8aĦß#|qÛ5K4vLŬgc˙ZFœmze h”8ŬD(4·g·[k Çô–*Bl ˘(†šmċÓ@Ŭ°WG$áj;ßUGíÉKû€Ğ!İ³È˘Ö*×AŠ"p<i¤ˆççg|ûŝ=öûgĵżÇ›7oċ÷Äŭë{ħ{2Ĉ`9¸­W"BèY¸İÂTXœ™ösâœĊà†€Ò…#†bĉ_›VŽœ¨lQ“Ôr.HġZQÈ"ĥìKÛ¨-V zXKÜ[öŬg`mîoeÌÑd*ŒĴ²IêġҌ+ï0ĝŠÎ*·gŞġ?Cü ;ßïwş°Îı¨èísG ŝœL}ˆħTÁSé9žTċœĞœŻÓ-¤ëA­EÈȒJÊH­ĝeNĴĤÑġwê<ßÀı çlĤ+ÄDñĉϕ&µ,3~ö³˙ˆëë÷xóĉ ùn·"|eħ²¨Ħ{Dc|şÎIÖo£ñáÇ÷4ÛĤ3Ĥ1%™ĉ·˜ĉŜÔW™œ³8Rt…9+9ŸıÄhŬ.†ebV‘Uhâ½'żß*–3Ġ÷ùÓ!ž—P]=jÓe3bœezçPÔZa•Bġí+[› ÷-Ž×ıÚŝE™>ÑÚÉ(%ïœu_=>>ŝ÷wŻo?ŝóñ{Gĝ.;zĈ­âàÖ]dòĉÄi[ık—`·Bxmg•ҝ—Ç m1ç‹\`k›mÉWûp^Ĥé‡^#–ĵÙÇ[‹Î#ġú1‡8Ġ‹9pr¨H×fVb‰jİSŞ?i*g~Ì-*! —ž:à’>rµĝŠœÇ8­¸­ÙìÔÀ›,u£E)†al1Ğ,ÇŞò5R³{İךyWœ<ĥFœÖĥ9|˜IÁÀ£½Ü½d €\nŻ1/”ĈaŽ –šus}­Š„„Ğžžž0#Ĥqħ?ŝñ_Â9·oßÂZ‹ŭa_Ċ[„°T¤‚ežĞ·fBI#&ÏĤ1ϋĝÛ½GtŻÇ–:rĠU³F4Gžù™%Ż< ­A¨i]9'˜, qzĦċ&Ġ%U˘6íŒjêgmVgÔp$uއz h‘ÏÜP0/ċ,\֒ ĉêbŒ³ vèB * [ċ‚l’ÜÛ5eŠŻï\›!AœÙ#'ƒ„täïN8ĜĠħĦ³ÊZñ-ÍjÍĥ"Š&4%8âúú•ĴgÍ<ìĠ;xÁ§G €Û›[|ŝù縿żÇíímMAÛGŞàç"q³Ħ,nlB âp,ò’ÈYö~5=/Ôġ.71ĥ1{†EV\i^—ĥĴÒĈD šU³vŬM†Ĵ³Ĝn›lY‚P¸ vġO=jTĥJ0Ëĉ (8-§JÏ*g\yŻğÒíħÄÉ'ħ&Or¸ÙkëĈ]ĜëKíñóĴBy¸Qà÷ğ,$¨GJĴ›g`{)’È…c^ħĤá1ŠM{&şßÉN1j`İQ!úQ|ÓNt")W-‚µ64şQü¨Cu ħ–xü_ŭ5ĵóx}·oßâîĠ5MSzµO7-‡(ĜpŠò’V›rĈ‰ĠôvîÊìù j‘¨ĝü—&Ö/Q´ğRkŒmÇùe·rĦïKÀóó3vğ‡'„0#ċ*83Ĉĥ˜J½])ċĞwßĵûÑżü£ß˙ˆżc_”bŝâ˙ùó+cìDçıxıá¸ùyûE~@ı(– ¸ı"'èžGĠġ{]-ÖRïg'„î_çQ*‘l' 2 ŠEJ_*p5LJV G¨ó]ÉĜB=0­Óԏ’¨(LéTÎ5Ħ.-ˆĊ"GJ=3”İH]ˆÈKDĤiƒ"â8Àx÷K9sĠ÷·ryE¨V´K¸Ĉ¸–ĥĤ„BzTÊfċVîŬe'‡µ8`]ê{ĥŜtd´µ‰ßDÎHs ¸[ÚQC€·˜F¤¸ĊíÍ Ŝ<<`žOôwÈ)àÇĝúëŻñöí[˘„”ŒÓ<£€Ò°x$Èâ'c,Ĵ‘BġċÏ7zzO™Ö#pǰÒÛue?eNU× KĤŭ!gÌ9ÂÚAÌ%À6Ġ–l³™$Ë>×8_ĉôf5žĠÓ<$bv€·ˆ „S ’Rï0U•|ÈĦ64FFoË<#ı¸ŠËĴôŠ…Ŝ£Żë'”„9Gy~X<ʟM¨FœNċñÇ÷M\*Ħó‚ˆQn/LÚvìÒôjmMĠı„Š6?NĜl6Ĝl6”d6RÄrÊIhLó<żüŜû9SÁŭÙgŸ‹/>ǃ€Ĥ̈́iĜÊʟĊ:ĞR÷>ZW0 *ŻÑ*Fµ=UĴDR)Aœ?’˘re‚AÏ+Ĝ ˆ.@S ô˜Ÿ›mv[(b·ĉdšo˙…  ’ÎÀ F×j}&Lħœl`êJRÜbLê›Q7Mıè4)UÄ˂ٵßïñÏhw‚Ş ROĦJ„Ċ8ĦléëëYxRáİı"˘ù#ˈžġ)ì„dÌŜ ˆ´÷LÓŽÇ#öû=ŽÇ#ŭöĉӂë›ĵysív [mS˘ ‹1FBQ´›Ž^LBgO}t“ïPJZ‰ÇpĠŝ³çáSxħÈĠô Li77İye1Ĥ_ÓWû5>žŸÉ³ŭDEħ”,ÇÏb£Ñ0 kyW›ËĵĥĴċTA½ß™|E9ҜÍé~86“’) ÔcG^ßKme=ô£ó,…IîÓÎ@(zËı# q·VݲIŠ˜†bZĦħè´Şk‘[Ï!LMäZopŬ¨Íó">É9eS0ŸfGL› ÏOÏĝö›oñôô„ÛÛ+|ùö-÷½/ñùçŸáĉöĤ"1ĈaŻĠ˜"Ò)áĉúF&™”Ħa̜5Úŭa}@³O97˘k]Ż]ëĵ|fF+uó*ӊì{çEÀÊEMÙfÉËZÒQżlàv-Xïۗ‚#΁”ö;+cĤ²ZĞ4+7 ÓMaœ¸Œèi$˙wŞ3œ‰;`äBH‚ŝžÊBd—BôŜ“Vâ´°,0Ş(Ö!Fċµˆ)a÷ĝˆŸŜpÜ#……ê“T`LċĤŬfäĴžC8 ŻÒ{éKİk?_ŭY$€á€avä?›çċON§żùMĥû›ŠÑ,ۏ”Aq!…à%ğ­sĜ˙ÜZçÒĜIPHLĥv`p²Ùò&Ĝ ÛJ0+EeZ ä8·ċ%äı\ôëӊÍ{_]Ŭíu]Ħr& èĠB{öp’è¤ÌWŒħGçZÉÀ" £Ä€˜#CÒ'*Xĉ9 Ä-rĈ15Ô è;kÇí&AUChbJ PŜÚö\\̆ü!„37}9yı£Ì)* ŞŜ§ó‚‚ÚKÌ*ÜĤ’›nrĴëŜΈ5ó{]ŒGyè'B‘£½˜iZë„<J`ìÀşuşœĞâß[Ä)ç‰ï"l'"ÚV˜è\njy>âx¤ŠOŸñÙgoúġ=F5aHÊŜpĥ#ĵöË"*™aq4Ó'µxì%hg.¤˘­Á´tÁ.4×@s!pB<ġ#p\Žx~&·ŠñİFùfòŝıÖ.ĤڒÍWîÄvôkrËżëÒYhQĊb':3jĜ†iÜĊżz~zúa˙à~?àï—ptK³iĊdÛ³â ĥ,êrµ-g]ö9êÛ¸6—ĴÇt7U¤¸ĥ²1÷ü\ۍtÑŞ½=_˘2Ĵ;Áġ÷ğ ‹ü%$X+&ÉuĦ!*VEżTdŻU ÌıëÇ=F˘IeȑĈÍ&dW`ƒk(-H°„€)Œ"¤¸ÚŒà m.P‚Ta‡vPħË#:.ô¨˜ =beHß§ ġ^’Z¤&tˆ)Î[EÍôĝQNNL2ĈÂâ͍€Th´s:`ŒÁĠĠ•Œ™Ĵħ8÷ĜX–W×WÈûŒ>àç?˙9^ß½ĈġÍu-Ô,ĉeĈfœ0m'ä’q}uù,üQ.§ ´7˘ħFy8&ù܌¨ê¸` yH!ĠY'ß?b.U½=Šƒ {,Z‹İ!ĵa RhŻw\@·Ré…Ö˘HEÖòŸÎZ̵´ı``%ûÍrZÚi&4ٍçuü½ÜY5&§{VkħĊU³UßÛÄĊÁ:WĜ:~7e5V.gÙġmÍfɚ'3˙܉|ĉe!·ŽħÛíñG<>>âéé %g\]]áĠĞWxóÙlĤ 6ÓWWW5~ÚuÏsV ĉĵó>Â(jĥ„x7ċzéÇöÌ)e7œG×ĉÎ2IħŞĊo­¨N‚Żd8ÍO7ûô³ÜıċĠˆg‡Ä2˙WM’4xÂM-vФE)¤KA cçka- eßżpCï?ĵXDQ †ï~·Ŝ5żšƒ.Ĵ*85eƒ…nšçĴyí½Ĥv­Ï#ĉëòL×#_Ĵ·âĵ[ç00Ĝc Ü8 è@)Ò!Lӄŭŝ Ç?ûÙÏáĵ~MœóÍfR^ĈıĞô:£}ÑŞb·ıÊeupÈŞŻëġuÈ9‹/ôKÂyMA,*xB'‘‰>dä5”x||Än÷1-€Ê#líÌÚ§éĝé—ŜÓw!ım­ÑYĈï—è’v7ŸN_ívğŭÁï#~ûO ^ı0^U›,]¨}WXDgX½"ÑëÙ~.u›Y)0Ò7!Şú÷§j!äşħ#²ëĊÜĝúCîBÇ÷]Ÿ[+>ğßU;³Áú3;ĥġïY_Cĉ+unĤÀzBħ³Ħ#ÛĈIN%£dÀgÚ°B!ûqĜŻ´OÒûa‘"à<`J’xVŜ„s(  °Î gwnŸŠEN:)IAİ£Sğ‡ÔBĴxĵYŞÀ(+{'-ä–íÉB8Vı<›˘|–ahtFéÙYáóÏ>ƒ³zÀ8ĝôĝˆŸüċOpĜ0Œĝü ü'żó;xġêžĞ=YŒóiĈPƒ<Ĵ£€g­Œ²™çÌ >,vi.֑²ı~ż44•wKžŻ 1Ħ(¤BÈkÎ0ó‰ïW×W4ĉÏ@<-Š&@¨ b‚­–iĵNcŒ@ ˘šÏU‰<Ï ŽÇgœNŒÓ$ŽTx5АP)òc„İÎ-ŜĠ¨Cĵ¸Œċ*˜kq½NĴ5’Uí~ IDAT.ċñ‰sjŽVYŠ•úû$’9gAnéÀ=çܲş~ÖLJ(*-‰&ZNٓħ@Î9âĢì֛oÁż˙÷˙ïßż‡µĝüóÏñċ—ßÇ÷ż˙oßġ7N˜Ĥĥżċ”emYç0#Ĉi ĥ2”ÉÑÄÇy#Ä,ş•&Ó´â@ÖûlçÔ9 Ĵµ:ĤÚÁ\¤8oa;£úžO(È{˜ĤQöHŜ“3R4ÓĠµ¸i`G–ş—0úÈE£?8î™™Û–ÜĞŻó^<]Cˆ+^nï8ÄÖjĉÌyç2Ѝ=sÀ0ŭŠĈô1Ò>4óRúİ:Ĥ§½÷ĵ8ež³~ż9ĠÄŠârfJš’b”†‰ÓìèÙB×(­58lĦfşË08 !L8žáÍÍ5M•ž÷ĝÙOŠë›k|ŝùç¸Áf3a'Ÿħ€hëÂîœ^Ċ‘ÒlEhÔ¨^Ç w“QÖÀ\¨=^âìÏuŽĉż×ÖcǑŝy:âé鉀G”9c %·"_+ôÖ}—ĴÏt=TF[[T³c T½\2J*Ĉa÷ôôôĠ2/ż-r׈1Ŝs5'ĥ‡•Í-µĴ_0ç£˙ĉ‹ëœ9µúŬÜŬ5ç–ˆ5òjmóÑĠ.—ìA.•çœÙËïwŭè×kĊZlĠŠğ¨Ĵ5uá’ïoû]:7›?Wóät-J’’#N§ŒRް„İrD1Z‡§§ïi¤ÏÖ3ĈXD€FŜŽU‹X§óĦâ*ZÀFïƒ:׀†jä³Ñ•1¨<זëžêŜ9‹iÚTŝj.ÛD•ÜîGJăΠ!މ¸s‡8bƒ ŽÇ£LĥÛmULß‹Ó)`'üìëŸ!Ĉˆïñ“Ÿü1Füdûxïñ˙á?ħħÙlp÷úŽì GB`JĈ1o…ž‘— âĞœ–”0[+Ÿ‡Ojˆ˜Š6µşYÌ-‡‰CSŒ¨Ö£ˆ·Ĝ ‹éOOO2–äçBđĠÓôêĉŸ>~Äé4Ks Ħµ¨äB8Fòï´ŻŜĉÒ²û@J³¤2A'·ÑÏÛ3>ZRiJšÏREós£=–E\—$ù§ä‚„%şvZµ0ƒ†ş%ˆ‹â6²--`‚‘uuR1˜eÜîGŞEÍğwïŝŭ{Lӄ‡‡ĵ}û·Ûküà?Àŭŭ+¸Ú4Œ({sŝ2ŒĜĦÓÔ!½1FXĜê‘ZcrĞÇwÛĠè^‹Ñ„R” "bÇĠĠ L#ïş˜knàÙK—İayŞRŻ0D'²boTé- †"à r!N*;.­`QI`ê3y'œKÈ&qĊ£›Žh'€Rš½Ÿyh×ÀšÜùêdÖĥ–ş fgnêŒ ŭ8ÍA"€İˆ/*ĵâ²kP'dó¤Ï°ÎÁU—ığFŝğ´ŭEqĴ™;ÍÉk/\ÎQH‘ħÚ5Z†ĊĞWŻh2s:Tk<‹ap<ñ˙XÂPÁ'àÂvní÷Żüîua]ܳ™ÍF#°58¨ĊH÷{ŸÑ ĸêɍZĜ ş[İlÉçġétÂÓÓvğNÏ{:‹=ߟ ĴɈKèék†×ĴEJábÍħn6şĜzëÏÍó‚Ív‹.!ŭÙîq÷'”óûż÷ßŭĥÈ=£.8›xÄà˜3ZĊ0“jâÀÂZòo]ĝúâ°t#-ܢàÏ ÊKtR›ZˆA öóê÷š•9ıéè=üïVĥ%P)DĤ³y’CHÏ:=ùô˙³Ž :jzA[…ġˆqê„\³ÇaëP §pŭ2İñ³ħ‚Ì-ĉ¸ëïùlš{ë›À–ÔċŻŻ ×­Ġ²Jíħ•‡ÁÂĦ…ÎfšpwwGTßĤÎ;{ƒïù%9!ä,÷X<9-Ŭ™FħT~^+§ÓŒq< w–Q—%¸ÊYµÖáx½w q6ĥ£ċ¤¤Ñ,l-F\çí{Ö@³’ €5A%˙ì3ĵşğEJ˲ ç‚qནŭÎZ'ED˜le"Ċ _?SĴ Żžˆ2°ĤĊ\kß˙FÌ-şŜTĊɔmY<==ażû(a”.޳‚yq"ĵž|÷[÷#]DtùġbŽ0ĊVżgƒPݝƒġ;_}ûí·?úáĝ[÷׈ўK.3£êzœÈŜù(?ŠÙK0ûK$q]ˆ²hLġׂ³µ·ß°EMSÌ­½´×ïm͵=ËÚĥöbAu ħ]_‹Ŝ5˘Gu_<˜ĤE-”(iĉ…ÏÄÔçHµ[":@AsEöèŸ8Ï›†9Š8 #гşŬġ²ùÙÁ[#Ùpƒ²ĝażRŻ,x䐪#×^áĖ+ĈH‡İ!OĜĤŽ/JĜbŭO÷cUx*9fö_³6›-9$Beono0?à—ĝ9öĠüx|Ĉû_½Cŝ˙è?˙Gĝ'˙äżFˆÄıMyhJûeA'Ħ‚ŒSH6N£AŠmÜcÄFqz9³’—ş.pX•R“m+JcKŭʊcJ4—\ıËıñù$£I6¤sFl·[ŸžaóËŒPlğĉşà¸ıı’q·v„°†Râ" K'è³5˙Ô{W_Ïvq­6Ħröu,LcÓ\Lġ 1ÈzŠy³£ß g+Ħ0àq·ƒ³···x~Ŝcžxzú%Ŝ½{‡ñˆqšúîWW׸½½Á_|·ożë›k\]]ağŬbGħğĈƒ ²ççäZ9ëà­ÚÄ[Ğħ¨íIrÛ'˜k*ÔĠ~ÊQÁÌĊĉ˙ݟYr_ĦâvœFlĤÇRE}ıÒÈhìO£îË]ÌĈ/"Œ8ò^£Ç̜ٚWĉër2#´\„6Ż`êB~– Vĉ³Rg›èlı˜3ßĵdzèèZĦ璺¸êRBÈ-N7“eŸ-zrIô&vÏè÷úµċUd,Q„ltMyÛ§ò–b:ŻèµPħqğ|żs=êφú|ôŜ› †qDXñ™f}ğwï$zŭ‹/>÷l2ĠӛĤ3Ó8’ ÓMü„ŝTúIñz*̓Ĝvöç*h„â ·4?c \Eµ­ħ°0XĉÏϏäŞôDS‘œàĴœ2ŒÉ]Bê˘w]÷{\ۖ­ëž*o6q?òŜ#E`‡Ŭ|ܓèìŝà·EîŻċèZŞŠJ‰È¨…d­҆ĤĤ³½—.”/!İúwY‹‹¨o:ŜŻùYĥCDϵğâë\²ùşôÖĊ°ĝ%މċ•ÏßZ|ĤŻÁŻk´U›p\ĞĜúó臍.c ҖM†‰ĵAĊ:ĉnq˜:sĈq‚sd“RL<Àxu ĜÖyÍĤÎO1wŝ¤sċu5ÎÒF4Ĵ ÏöÜç4—ŽËÌI_1’›6g¤Ï*›*o%ŒPêÚÖ Îȸ7áŬğw:gÄeĈÏŝsüĊ_üî?˙ wwwxġꍆçSM2‚~ċ”0ŸN8–"˜(‚U$6µ:4„›ÍÔ<]C5–e‘"=„†üRœmċ>ğ"÷´…Ş4‘•w%TW×Táì5Ğ×!gʳ5SNy×ߊ,Ö˜R‹Tê €Aî÷ñxÄíöóéTƒ39ÌbÏX‹ĠÄĈvEš³ĥŞ—s£E,AÒâ´0ĥ;Ù>ʏbĉn’AÉ ­àpÖbާɉd˙ñëŻñ³Ÿŝı<~ú„eY0NSuQ¸Ĉ=îïïñĊ_à‹/è8~Í%o¤ÉÁ‰Îd*‚˜’@Î&FClq­Ğı°Nĉì:ïá¤à/"ô•rĜ˘ö"‰8eşD½Ĉşħár¨Eİ›¸­’Ùr DïÖCĊ”“ñz.ŭ½Ó(%…Ò@%l•3'ĉkŻeُ9ĥ`vÍ >÷^7÷—W¨q1XBaÙĉbVAÌ˕d@ ħh…/ïÉ=ÄÂitş ƒ„Nkas–˙ĉ÷M–nkú\şĝ9;`C92h‡AW׊'p²CÎÂI?8TÄá€Ŭî^ż›7opuu]#Ì5u‹p Ĥ;ÎÖĦu:ÌĊêy#sÙ_;3q£Ġgĥ£Ĝ„ÓŒ§çGìw8ÈİĤœċ‚dBMNµ-J/!³ëzJO¸/ üı>9˜Ĥ À2ÏËà7y<˙íáùùüm‘û7(t1ċ˙ŭ˙× R]T,‰•˜¸n_ĵ½my•\wYëĦoŝzqêŽĉDġlRÄŭFpׅîK…äşĝ\ەèbU{ìéâUE\*îÏâŭÂ%´~Ŭ5ċAÄvÜĊVÎ,L˙0­QrcŞİxVVq …, RMŻ)Ö"FÎx#ĤpƒqšPL1€÷„úWR„@³i4pX£ĈŠ)$Ħi…CH™“3KĞŻVîİĈÌ6£ġ"‡}S§Şô/ €ß™8ŸF ܓsĜ}ÂÎzĝŞ%NJĈP: ;â—#Œ°Û}ğŭٟâúú77×ĝÁ‡7o>íŭ„JœNF1/ ĉ™b6“£ÏRĴ1Ċ› !ŒËğñìé4ËÎ*îTÑה(lĴ…‘p nY!ĵ1ĊZôÑïŬ”pL!%„’°¤X9Ä›Šï÷ùyiTŞí—şL7!*Ż[ħ8qhħRRˇċ„S 0ƒŻ˙èrÎT8ߌC‡眀Š|œ—COÛÖħ¨N 2k`+ŠK(Ž‘53ÔŠ’LM+!!ž´éé Ö|ĝ˙îßŭ;äö1ŽÓ4áĠĞ;l6ÜßżĈ÷ü÷Żï çHhâZÊżŬnq{{#BÌa¤ ¤iNJŞĦlXNœÂÜ ŒôÏ0Rëà;ôVû:›lş`ŠNJH۔˙֑VÁXƒ£DÜÓğ5H™²$yqdm?¤E—~Ĥ÷Hŭ™ĝży ¤÷˘J Xħk⢑4$5nMuÉNĞ…AXyOşéä;ġˆrŒIĈ˙1Fäìà=ğŝf8iĵäġĠ•”=ıhbÁä Żé(2b4ŜԘr#œ]Ú‹B—[SC>½ŭı(ĵWá—6Ħ9ÏĤú$ÇvíŠÌg›„xŜ ƒĊf3àêjÂéDt¨ùt·•×~ww‡·oż‡ÛÛú|! Ĉ‚€ ïé:Z•òˆNĜ­ŬzÖçmŻ jkˆ'žİ;À[ƒyŽ˜'ìvñôôŒŝ9EXŠ‚BħdéİĊċ/uëÉíè{IĝÎßğ, hŻH1îĵŝíñxü_K)úûż˙û‡ß–ħsê/!‰IĵR{ ŭuéi—l½zÔXrŬ2ÇöĊ³é(ë‚ĵGÜw àÖǚ×ËßOüĊÜ%”ĵäĤp™tŜ\ò <ì^°GaDwŭŜ]ħ$úɁ Ĵ)ˆ|ŭ¤-…“RLÊ ·ƒ“ĜOï=2o|™%Ää1xŠ6,™"#‘ıċÉıíz£7ĈÀTÇ[lċIĤ ÷Ż%³ġħšp€­‡KQH<ò%Ğ!“Ċ‘Ìf"W…iÄ4 Ĉßĵ{‡Íf§÷ĝé4b8`˜ñż|Âüú§ĝ/ŝñ?ĈĥùG‚fżùì ĉÓ aĦbs´#%i-­€ô2&Ĝ ~ĥíşşşĈ²üì½ÛŻdÙ}ö­ÛŜğŞÎ§g†™Ħx)Q˘˘<Èâ FIP$˜˘İäE€˘ĵÈ_Z†ŝ ‚(Ê à$NżyH€Ĝ²IHŒ%2e™ÎL³ï=}úœ:Uµ/뒇ßï·ÖÚûÔéĦ K˘>ÁéîsNUíÚµÖ·ßw0 ¨Lӈqá—_żhƒ÷@‹œ{›ÙËĊ1Ż#Í-oĦ4š ħɳk^}–DŠ!zQ½`5´VHSÑŝIš÷!ëÄ8Öĝeh,ÚÎzä.ߟëk½ç¨Éĉ"­âKĵuf&ĊÀ™l~”T ’î8ÜısŽĞĞ+ ˆĞĞûxàĈiÂÙÙBˆXoZœlNÚkŻSFî믵רĠ5§'çp£ì^EÛ¤ĵ‡}? qtimòsµZÁumN³ÉFJ…-Ğċ:K×<ĊŠ)¤8Ÿ È÷×aŝÂ,Ör†,9âF, ë'MyÈħqf–zĞ‘;=O:ĴżÜcÂ˜Ö d Ökm-­ hʁ§n;ĉç(şS’RH8Ġë›Ñ]³5˜ž+jUu˜.MžJitÍ9„ĈH&$*lH9KUpûşı–cċ½‰ ƒċŜŸ¸CŒ9ZK ÑŜëy˘Xoò&ŞùçDG|ƒ“÷ž…›Ġ¸òçúı#ħèp—ùµÈOŒXbDîûϟ?ÇċċeÖĥŸlNàœ™½ë8Ï,_¨ôÇàï͌µ^-÷nú³):d~ŬÓHċ;W—Ĝí÷FbrIWéÚġÍ8ĥۚUa‡cĝéIVŭŭUJñ½‹‹Ğż}rzòâŝ½'‚°é‚Ò€ŻM7¨Ïú§ú†_²·áÛ⽖ÚĠyoMí›#żw~3EnàZê^^Ĉ4½|}˘Ñ­™ÓÛ^óò†>XocoÈù爚ŞKşÁìÎħçRq@§­Éuj ƒž‡! pòĵkYsJZ+íZNJh`4™Êœ·h`Z‹@MĊ³ Ğm˜­Sb”(ÏX1ç²á†TGé*t|İ–*ɀ ş\K:9%1Uc€ÑÔ—ŭwŜT ¸°Â:À%x£aĵÉ5ğĞĠ wïŜ%`Ìï…i(‰áââÑ8ÙĴ0#ŝèŝžIN;5ĉİ“İ˘˘ 4Ciè”żĞ™ğR*˘3¨–t‰btû<êL\¨ċfĞBÑáÈĤ4Z”ŭ[W^SüĦ‡n,œ“ÇT³ÏĠ§Ĵo–ñwmÔ£w#ƒĵyò.~äCĤñ½í-¨Ùċ£­UĠ¨–Ĥ hUU³FÎĵl$üÚBBâQ]àĉbœprr‚ĤÑ%†.Ä6­Ħ"²£ıv“[c3È÷`(eÂÜȆE ÉUbvtG2ċñĊ°9ŝHFlˆ‡Ž `2fĤĵ˙qX­Vx÷ŬwÙdtŠ‹‹ ?ĦbÏtnÑ=o¨´6¤Óf=hàNÛq;\9ĝÈ}T](uÓ4QĊ0]N„àK<]ÓÄĝÒħ?ûĝc°ÙÙH´ğġĦuœbU@ao4ĊêP"ë…V…¤µeŞr[_U*²‡rĝ LĊ(8µMĥ MύX³{%BËD›˜BhÀZô}O:ìĤ4öŭD@\k6‹IŜ:=×a0&qÎîܘ6N1›˘jmdâÖ$ÉrZZòd­V7xÛĞ•…"·¸ùŭô8ôú“Rımoin£d‰Òĉ&×PŜ2mr $’Ş„ğĵî9W4ùKvpyùïû.6›“Ùŭ”—%5kÍ<&[¤=´Šñ3ô¨Ùp‡ív‹ŭĠ‡ŝš &r D%8ñ¤ÎçU³ûë6‚oÉäÒ5°yrEq’^˜ü+­Ġ˙ĥßïŝğ”Ò˙ŝµŻ}u÷ ²ŝ)€îf½NϞ>{´ġÖÚF§5ċ˜‰Ğ¸K=émëëe²Q­­ÈÍ"¤–9>VíĞ*'ħ<Żú$X˙yù;ċĵdb—× NË"‹ÛäġëĵMê@ŻGßxŬġ ‘>0áĉ)W6ĤgB)Ñ ìD–Ż$+M …ñ› ŭÚ ¨­İħ܊¤Ĝ 6O ‡È§|ĉ´i֙›…1 jŜ’5oÓ£â“Ĵ)3·Jİ\1ñZƒ0†@?ġC֎I³Ŭġġ5Œ18ٜ Äİp˜(ĥkħr-VÛÉ!†=çà&~ĝ!ž?Žï½˙!ÎïÜÁŻżŽwŜ}wïN ;Œ0<‘¨'RR²ß³•8§“™9­4'İĞYFüÂÒ 1e³œJigË{Ö˙€ĠjU˘È„qc§·°R›+ï™s¤'"7*ÓiÊÌ*1AĆ [h-K|ÈÏİëÚYiC×µD‰žX2]E'Ü=b†a˜˜Ç‘jħOOOóÁlxà!>ĝà<|€“(,\8ß´EÛR”ÚÉé)îv§§§XoÖĜĴ×hğ]ÛĦëZt]—g9CV›üúĞİXŜà='F™Î›Î1dÒ%ż[ŞĥG֒Êï{t'n‹––K^8³ıíş˘Ŭċ8ğ)gUGÊ92O˜D_…ëóÉyfö’‰K 1È i­à´ËĊ0JkĝPB˙³¤†“RàŠ´²Örô\!òˆŬZ4ĤÁ8Œ³I›2b[ŻÇ*;Y͌pşqGĞ˕)ë¸Ö%¸Ö×֟ec(EÌÌXtZsbċU0Xĉ7ÌtÇĊXéÒp6ßÛh˙h[ÉèMÉżsš÷ùZ·^öX)dIİhv…Ŭ ĠÔ-'laCŒ‡š[2ËŝĞ2™‘HsdÊÑĥmŝoç.S˘t†KÒÉżóÎÛxë­·Jt$˘Bâ+kò§–s”)]℠Éßq}}M wżEË1BôàrÑ× „êıßLmŞeƒÇ¤Ë?OÓ0VŜ{´mïŭUÓ¸÷?~ü›gggż ˙î+=îŸèñĉŝÁÇ˙@Áüġ”ÒOÍ!7ĴĵY~Î ü'j]íéˤK{[îìó¸·=F}2› ÁUn„K),ž“ĉ,ÚôC=£L,¨…NCŭ÷Û´Âܽ/Ú£yvÈc–Y\ H+•]ħK.îÚ€ˆĄF)D(D­˘G 6YDo0"Bk&„@ÙğMhÑ6 ×àÊĤ•üÌĴĤ…³1Í,U ÈD ;#lÌR÷%ş¸"€wŒ—󏀎~èá'bÏ4›ŞÚĤÁÔeÑäÍ5.w@CħÑIƒíp²ÙàädƒŬ~ËġĥÛkœœl°Ŭ^b{‰íöš UÎq¤Î~À“ǏñG)á³?öcĝıŸû9ĵóÎ;9µ‚²ji‘ì‡wÎIûÙ÷{£1ġü@,Qd6f9Ú+EĜ…³:gʲ‹Ÿ˜N_6SaˆıÌ˘6ŝˆŒ@äòó˘aM9Ù!.´ötÀ £”Ĉ<""3“| )À™†˜DÖj˘zÎ!_‘Qd`ŜSÈ~Û4Pʲá'ÒÁe ÙĦ­”Â0‡1oœ}ßá‡Ĝn·Ìê^z·~·Ï̟1'› šĥì[çprrŠ×^ğƒ³3Òà7'ı^XŠ ´Ñp,Ußm\kĉE–“²„AkúŒ *iaT(Ħr" ]ä°{:Ĉ§˜êX­ċ”JÌVòıÊ-ÚÀv˜¤ŽÛ “RUWmtÖKÓ:D@‡ô£F[„ˆÙĦJ§ˆ”4ĴĤ@×ʲ6ÚX [ċœf=/€èuZÀ¤Ù¸·–ÈWÛ5üşÈù£0¤jœÏ ·q:kgĊô&R‚eòO1şÍÁm]L! 45Ĉg‰rP Ŝ“!VéʨV^×RIù½Ë8ÍyZ‚È ¨M (àX7 Í²p‘÷×Tkw*ì°ÖTE-µĴ!fİž5ܕ b1ËT´Žû’h6稯Ûí~4@iàΝ;PIÁ(Ë×|¨TLIĤom7F$<”=Ĝ^oħŬn1ò @išHV6ĥĵ7ž-ĞŠë‰ñ1ë6Oj½Ħɒ)ŝ¨Ŭnċœ~ïáÇßĝú׿ŝJŞŻ è6íYüÖ·ŝé˙İuĝÖî‹ÖZ’šj³Ó\ĞĞ^júZŽ—Ĵê 1ħuëN‰;žC{è\žÂ–Żï6#À'i?éġdYF%Ö_ĉ.kE>éıĠ‘?e³šËj†<3#’Jˆ)Âh[U'Òs§˜€Ĉ´MÌÉžYİю™ùÜlN²A„X, gŜ²Ŝ+%uW¤=¤Ñğ°ÊĊ•r§a™B\†Ò3ƒÙ0ËVĜKb#›êZ×útc 6ë ĊW =´Òh›–6ÜPfòÂŬ(‡ġfƒsĜlĥpĞ6gî„1Ž$X­VĜxôèŭíoƒ>ÀzµBÛĥhÛŸŭìgİ}k –A˜Ça$Ĥ˜eÇġH9BDb]§”OˆĦJRAĈq@yĵÚ¤ÑcŽŽ“Qµ/q\JFÏt80F£ï§\+Ly—}–[9 C€¸§iÊfÇgIёiQm.˘Ĉ˜ċô³\Ġ(%cèìw™ĊĦ˜t´Ûí– r˙˙ü1šĥ5¤ĤïŬd y~‡$ '› œs8==ĊÙÙÉsšmÓÂb dcŽ•NQi…U·‚³.oê…Ġ*Fħċšĉ\ƒĥmè€Àì²µÈİE‹­­ÊI òY'£ÊF9@ĉ ŬsÊà³,İÎ>•˙†‘ŭ7Ş2E>üżĵSŜÊŭnœe²ŠĥXJ>è ) )f‰uKÎ5ĉXÀe†Ż°Ñ´ĥ•T Ò£,’€"ĊPıàaœ$ <„ĝ’56ĉǑµ@b=iœ*#yMzq¸IL H•ħĥó4aê–GLÓ͵^Í&”Al 0Œ)“èèùP€ÂìU”~f}ëĤ1aÇ%M£>0VQmĉè}! WŝG`]qcŭŝÍz#6› 0Üá>„µgggyXZ2ŠçÖĊŠĵàë½Ç0ôĜíöĜ]]a)êL̕šeZnM3öĥĈ µaŝ6œ²$çêïíûëġ1x •RO­µ˙òòâ7_ÜĊ@—·a‡i*ufh–ş’ TSšˆnùšGȨ£ x)eXJŽé[—§cż³9o‚2–12Ò+—3,2zşñçmÏqÉLFEaġ¸%áĜ‰ùŭnñÚ%ĉ'˘TPğOċô[9E‹ġäy‘ëS ˆž‘²Wƒ pÑ!"N;fİÈyâQşêšPüŻ´ú³E‹Ĥ€RëÄ\ê`Í é L€+AÂè8máV–€_"pÖuĤqⲉˆ [ •AT´Xz44Z–îvc ÚVĈĴ°I+¸ĠnµF×­ħÛ]c·£& Ŭ~á€ßqee“ǏñìÙS¤‘€óÙÙ9"ŜyûmÀ €‹‹ „pzr £.V ŭŻaC-ÄOӄiI[ĞŠë<ë3ĜᔃH@ǀÉ' S„ĵ&ia]›0ñ†IÁ8Œ>aòd?ñŝ7yޝ|‚³-Z·ħœHV7@2{`à…‚ ċ8£İá)Àı63ëÁ“уĈuĜ; ŭġ°b¤kš?Ĉ|/ƒîiœ°½ŜâpĜĦi-şĥAËfzO Àv]‹ġÙiÖŜĥm‡ÓSú³µt/´mKÀÔ6°š2p"ŒvYCğê6³54›íĴ™MJÓŬ- ‰šBĦëĉ³zÊ#ŻY)zŭ-K!D–P˜Â*‚Ϥ$ h*K,ܕ}a‘³$ĉĝ‹³BZÒL¨+@*…òœ¤éI@Pfúâm3Àmcó÷Ï=œW=UÒïĜûZ3ì4ĥ×ÜĜˆjœgÙÖ ²Ö6›uçDŠÍñ\ÖrbR9]† }6~d›¤ö@Ì"Ó´VHĠaĦ€Ó`c›ò¤€~Êĵ,9ˆ¤×M1"q,§t?ˆĦXÀ­İIÒeàNLyÑË9ŒÏıú` ²‘ÄœsŽYVŻ÷1J[şë5Ĥ~)&Ĵ›ġ~pĞ/|íĉJħÒ¨—* —aɳë!`żßcğŬúú ‡Ŭ5íğ1Á¨Ş”‰Žíá1Fz,­ âM­ôŸäËq‚OÓÙ+Ô?ŭ?ôŜ˙ŭŻ~ġĞWŻàéŸġŜêê ëµÊفuaѨu·ĊlĠÊ5+y³25Ĵ-Áí1í²,äĜó(`7)·¨³ÓQzĴî÷ĉ˘Í#>6jéêÈ[ëƒ_–a|[Fùûx8Xƒhr*ÏĴkm‘âˆe2‚Vɧ|‚öS¨:ÜçġÛm„sSñNSB´PŻ[…)C!ı—a'+Ú/­úÏLeÉ,¤X%Ig˜k Ĝ`eH0³¸.ç!Ä 8iš!2ë]§ƒ8çòèZôxbĈsÎáädƒŭŝ/^`½^cżßúz—ċÀf6Ô}üñ3üŝ?ûgĝŝûïÓµ·m×âK_üâ›1K„ĵ÷¤!vÖxÖÏëĉ-PFċ|ŬÀ% ĦÒÌÊĉ<(ç2’%0k3c6r K\_S­5Öë5R:`ĉ&3ßÄ:Ñu^­V0Öbżßa†Ĵ½,1§ƒÄHïyô\!³È8RĠ,ħät SQƒÒî/‡?ĈüÁàÙ³'ıbTĈÌÄ^v 8-NOOѵ]6˜µmƒĠ)IÚĥf³Ĉz½fí I$ı$×Ĵ*m]™9†‹hòı’ɍÜĉ5ÖE‘JrƒWıDŝ,È=*ŬÂËçWĤ\9s:•JhMMÓĉVB9EJO¨Ş iz\ĠĊ€–óg´Šlnk3xÊò—XXUş !b–Ĉ":âi* ıÎÒ=V’qۗhĠ=я’É,àğfż½*û_­‘•çspeš•CE€&°™bD2–"Ş{U‰ĈK3P[éP5€VĤŜˆŠ½Fŝ{èäùJs%ÉŠ„l^ŒtûäUnİ <;*Ĝ_°”û²#{xbÌÚ~Y£I.•âM·V–0Ŭ~}-ŝ†Y†˘ ĉè$Mnâaê3èK ĤU¤Ĉh¸nBDʉ ò½h.›älƒ²**EĞÊí_4qĞĠ*›\jĈWÀŬÄ2‘6X#@#p÷ĵÑ&3>b !ÂGú]MÓ  EԆÂÊÀÀħQ4Î9Xc1Ž+œùóçèşk´7 }€fq6„5..>ĈċMĞĤH§ŭĞË+üìÏŝ,VĞž={8??ÇJYìvĴ+U²q‡’\bÂ艁§)GgĊY‰F9è èòÁçEӐ&²mc>IFĴh‚SŒ\<˘ï{6²P´Ùġġ5BäĤ7PJĤ‘ŽÌOòÙ!ä÷3xšìw{Ê$n[4œK|}M:èqÀtèñÇ˙ü;Ĝn·èĝ_^]aš&Ü99İRmÑ­\ŽƒZ­Vh5”­×lN6ù\Ÿb³!pÛv×ċѧ|~Ä8Soċsg&£"ùN€âVĴˆYşM :ò˜#›0C˘ÏĠ:A›Ó.šĤĦëËż´v  9‰dèŠZ>“’R2Sn0Ĵ%ş*)]ó/aÓ4Šnz3â,ۇ4›°‰ÒĴp³Ì`œJFnÛXDŽġŞ fjÖ4Ĉ„À|ÒQc`ë~ @ċ^˙Y&´Ĉ¨*²Ĥ˘Ó4Ħm]N>ŒßYéCˆ%;YĞœ\óĞÙ˘ĝàôħN֒\"%Sa•ZYk=ĝ0Tí'İBó<Ŭ²—LcÈìniİ‹ĠP´µ†‹2äŜO4xâûƒ˘Ŭċù¸ U!ˆL¨&ôk4Ú~·\t…8½C^†z/­÷[ñpŻwĜn_`·ÛñAÙ*Éç¨1&„„™F½T£ë\†ıŝO,ğĴżŭîŞi›÷...żñ7é—_IŝĴîú¤|û°9;Ċg?ûyĵñĈ›€Şşµ‚m D€îQK·é³bg£}[uî1VöX{H Šo!üúŜÛ~—Ñ:3L9;3ä†Ê˘Du˘ħŒÚÔËoèeI-Ü'½b`M–ÍNöoÖ%ßî—×q)á8İV³ÄĈĜY,Mŭ89!ƒ™¨ÜhÄĈ c‹ĵĊr=¨0~~*aÙmÛ )ƒÚg‰–U˜41n҄Ĉŭö)ÑĜMâVDÖĥİ2Ş…ÌĉH XK£ ƒĠ–˘°ĵ§À~m°yC—ç8MŒq°6ÁÁàp8”ĥ"hÖdvôú””1 VĦ‰ ?…i"mĉ„žËÉÉ}ßêê }?´ażG}Y”†VÚhL\üìÙ3|ó›ßœċàĈñù/|ġçžĜĵl¨qĵùOH‘Ġ”4†aÄ8zzŝÍ !‘MЁ ĝÚúàKî-gÍJDéuGúì2X§13„ôĈi‚›&ĜJï}yy‰ïéŭ[ŻMat­U ÌĈüŜûĝÁ½÷ñŝ=|öóŸÇğï~gwÎħZ * Acô¤j5ÚL~€VεìŒHA#¤È %²=è$ÂlÄ_²jiDò­ĥ„ġĜ]‚›—9ıòoĈÉC4hŠu–W @·İA}'Eŭ”½^>@iĝ*Ŭ]ŞF^ ÔXKA=áA˜IEuğó¸™"ˆŸ;nӍ˘$̓ŽJŞÄ2WñÌÑ* ˜{b@Šš+v#eóĤˆÄV¤ytˆ~Â>z £Az„i…Ĝ‘ıgê ~w‡qDÛ´hğ£#SdÛyä1Ħq:½ÈÑm U‹uş1ŽšĴm+G´e£ƒA@‚q NĊöz‹!LX­VôXÓH 9‘4bĈ4pJv­„Ñl£†5‹ÑHGġĵĈî( > [ݰßïq:žĦßpĜ^zğÍ =(ÀLjĥµĤİGSôMÛ"†€?ĝû-îŜ}“bäÊû=ğsŽ7ßxJú‰â˜‚ °? ĤGËQ|ÀÎû” ép%›ĜDŽq¤ĵÏŭa€÷mаß0µëÍ~šâ,™ÓD öğ&6 ïÑv†=1ÚŻżŝĤĴµBš<}vċà“Ë™šggĵ¸|ŽO_àñ“xĝ vğĞ<:°iĴSP°PĈÀ( ëJeħ]×âtC&3ŞĝmĴ7pm‹“ġÖQUïĤmKäçš "P6 jäŜİġ°q ¨ˆtĉĞv•’Â×ú˙œ§İ éè}œħò<†q€µPLŸ7ޞ5vZË- >”*²$Ñp7İH!ĵ÷Ä '‹”Ĥü|ÇaDӖ´”¤bÖJ´–Ĵ‘g§ BX™Ÿ—5dĴ$sfM.°Ŝ48Ê6!eŭ½1<×,,Ġ„Ûœö!šÌ”BnìËEœ1l-1£ÄlĞ…Ĉt>’Óc²´ŠûPE’ċd„ÎYGI-™`4·P³˜bÙNıòœdĴcÉ.…;!ƒÇŸò:Nû€Ëëۈ$„%yÌŠövÙF*RCb„Eêàg‰²CkLSàµÚ#İûċÇL@cyTdUġ&Ööf ¨Ĥ)ÂÇh…<úžğ1NP1Áû a˘êä#Z§9*-à°Û$k- Œi`;`‹‹quu…ġĵŸüˆäcñ™Ä>&…´FDDDBD„q–Ĥ½œ)­%ÇDè{˘žMi—Œ2@šü~ú„ġíĦżyĜo˙Ŝ+ûç twï|8ŜÚû0Üğ˙˙÷ï˙3ÜğwŸ˙—ı/~ ›Í‰rb_&Dx˜|ÒĥÒÀ)ŸĤlŽ˘SsD¨ŭQñvmí<…àĝIİf,—Ĵ°³ÛÌpÇÀá2¸.İXjY•˘ Ar–‡ùxO“yFB×uĠD¤bÊĴhL·7 ïKn-9–&qL7$ _ùÇ4Ċ™ñ–ç…’ħ*1ùD$y¨üêa9"̓k~ÉÜeı[ĵYuˆÁV§è&³ċFaòpÎrTÁKûE(‘|Ħïx?eéAŒ@×ĥĜòˆ[MH‘5…4n?=9…Ò*ÇKI:Àa¤|Íġz×(fm²6ÊÑĈx8òswË fÄ"ĥYżK5Ê´SXo6ıbv:?Çağ0RjÀ~ìİĴŻŸD^I–dΆñÑ#|ĝáfŒ˙Éé Ŝŭ̏a³Ŝàz·ċ‹€ÓÓS|ösŸƒkZ\ïö¸şşBÛ4hš°ez!Ċr?‡ĵ)PDW“›ÚĥÛ-ÚĝNNNħÙl°Ûí2Ë·Z­`ù°á66 x]2xöô)ú„Ożŭ6”ÒĜí·8ì·ĝŜßǃ{÷9żĥ1#\Ĝ~í£5lەLfÖÎjCIĨŸäÊêĠŞÉúmÇ0†Ž6²ŞÙ9‡JÓ˘1Ĉ’VWÙ2ÑhğnÖ'#uÇĤĈÀħœ÷³I:çÓÖİ òžˆ‡^£™­sıNXĉşù)%JÔ6W1¤àúzGĉ=çS˜+·ÄL İtšÉp.5ˆ`“nos<]UèP²³‰(İseëşç1ÈèZÖ;È&ħÂÜêJgk ­°™ ‡C˜I%ê\ñb°K³C•ΚkU1ċêˆ6˜ôÇ2ĦšŻÏÄÊĥe@3ȇ”e#1'MĜ,‰! fÚ`IÂ(R…Š–Wr­ħ°ĥèkĊsŞï­Ùàž£üÊŭYߣX(LmٛTİ |)w˜Zւ÷¸PÄ’)„ɳŒj ëŭ,.N™•4Ë@¨}żğĈÉĉŒ2h::(í÷žâ/.°Û]Á=R &e3}^_|no“UĤĦ"íñš£Ìdŭ­óë sß°„ĦIg0žċ IDAT[HWĈ˜÷‡ßñŜ_ŝÊŻüÊô †ŝ9Ŭóğwŭĉäôżzûíwŝ­ĥíŝŠiÜż˙>Äӏ/p˙ñ|éK_§>ġ)l°Ak,¸Ż“Gˆ ĈRu “§*Ë ¤Üĝ·it_&£—B×yjf;ĈJŜ–O[ƒÁc'Üe,Ú1AyR% Ÿ6.êl/‘zŽé‰µôĠˆîœŝ!Ŭ£—ñŸċPjÒĴ_)kß{ŝüù7ú7é‹ûtµY§o˙Ŝï|ĥÍ£·Ŝz+v›}÷î]|÷{àéÓçĝ—ßùçxüĝ1>÷ıÏá _ĝ>ŭĉ§˜´rS€N)y( ĴÚ~™%°è3Ħ›j.UXŽŽÌp ĠŞ:ëN4Á·èċ¨İ·İ~ŜcÌ#}4TˆU·3‚Ÿ·zÉ(d Â_–(qŒÁŝ¤ŸıÁ_Ûò$+ע~NÄ,ÏEú*–š^(8ÉDUœisšXË6Áh3J°àCDÓ4hĴ"EÀU,şÎ}ÖZĴ×kĤĈ!­¨ġ‹„‘ÇğEú‚Ĵ·6şè­ağŽ˜^c c„Q CßY‡Ta²ıÉi—^@²ç1ŭÊZ$]¤kl´Ä2²ô@6™q°h›&'@6u CŬ~à=ĞĈ >ĝ+—Şpyœ&ŭ^Q8§ó¨u'Üż÷ïßg–8äĤ°'OâƒΑàħżîħ;lÑĜgçüԗĈ)ĵĝĝOŸ>Ĉá0 ë>ŭéwñúŻáÙÓ§xŝü9.//1NN6gĝô۟†ÑOž`tmk|GĴ×HÌUے$ÄZ€ G&›sdcÍc鉏yÌL²ŠÈ£xJhš8àdCŒŒŠʍ–X£Ú<¤´g ¨‚ӌ½Ë:°¤gÖVÌC ÔqşB? ¤³Ŭ6dႅMß{óğŻáp½ápÈ0Òkšz };­AL¤Rd.SÄâ¨ß1³à4`V$!™†ž\ïXÓÂ* † ÛËĝ§˙äÁ9Ò#”vğ€——Àż@nJ“ĝ&ÒÄ]paI8Öë ´JûĴŜ@ƒZ°ĝ +G_[kòĝVSäGfn]`1ĵëÍ)şĥE·"fV3¨lğmÛrŭi gÚÙAĠqġ‘ĝ&™ÜĈ53s`f[gÍfĠĠè\ċk­AÓ´T°á Ìw]­ '‘ ³ }?d ):×`ĜéLvŬ×şÛœyL´ PCal ´cˆÜ † * ]–·cmfÇÑhƒĤĝ9y\uÈÇ $Ŭ\§„4‹ċ›ÌbÖżĤD&4:È9L1§pMÙÍ˵SôĵR2A`X¤$hXğ,ŒŻ¤",žhv—e֔×3N‰Ë,´*qyÔu0Ż$V2ï+!jj‹éˆéÎvW3ÓüúúÌj³ĴA’„ÊĦJZŒñé&ç8+ŭÇ´ĈċëSĊG6›b.–ì1ŜsĞf•’™ìP)d#p VıòZîyíòs‡ğĦÇöúûŭ.›Çcš_=™êLQo-RŒş)F{!µ,ĊîÚ{˙û˙Î~ż˙/_Ü ûĉo†?ŝĝ›ŜûÛıö”şĠ§§§ĜœžàÁxp˙1>ĵ÷>žüOž<Ċ—~â§ñé·ŜĊkwÏèÄċ#TgaM›#‰èÍ‹ô2[|’da)'xÙג >nJGµTġb}ÛÏĉ‚# ïŒċ½16TGK–À­·Q–†´c#—ZC,Q@ĥ÷ĥëX „QB•ġ;[„u„ŽŠ‹FŠŠġğEÊauÄ4ġŠCÜCİ}‘Ç‘Á£m;˜ĵ)9Ú`Wû)d-kŒQµZ­f§lJICóßûİĵgMӒ ›ÌÂäg€^"Öê$1àĴ× 0`œHšħr+ô}dSf ´11À z}]Ë@ ŭĤiòĈ·+ CŸï݁òk÷ÛˆSÈħ_I“1g'fÉ bš UIĊ@аF'›6ß˙ŜĥÍċϝ€‹ÄS˜/íZ€tnV3Ĥˀ[$šÍ{ÖZĴ›ÁhÛ6ßwbî‚VYÒAÀÖeĥÖ9şÖ`µ:!­1KäóÑ4MnGêÚmğÉi˘?-·ÉÒÑT×Ñׂ–ϧħ³ċZ‰ @ ŠœP @VŬ`‰YóXéQóçPtßùñ ›èáù`AŒĴÂX‡hƒJޏ yŠ Ċa.‡hfpgÌbûú…yx~0f>җÈĈ &šÈóíŻVdj’Ñı€C_…ġĵ˘Èk8Ù# n3ÏÚYóŻ2{\$ l U"ƒĤˆ)Òİ£*Yˆ·ĝ!T…-µ·ò˙]ç*},˘Eo]dsE:‘Ó*˜'éA˜ħÙċ½ŠüĝqT…hħ† ËhDz–óR*R‰úZĉ˘*Ûw<âÁ`JëF˜ŭ9* יp‰·îY²f<}úŒR† 0q–n„†V‰?c )!˜\ż<$,ëLj¤úû$ §ŝüVżj˙½÷ŝïĤ”ž}ík__AÎż˜ŻÈò÷˙ŻoŜ=˙“µöoŒ“×ÒP³ï)„ŭу'xúôž>y‚ËĞÎÎïâK_úI|ċ+_Á[o}şZÜ"9ԏ.èĴJÉߟu›n†nB‰€™W÷ÎKzì·tŸsQ.·ïÔb \o3–Ġ1MËd…cÑDK şÌép- ġRŸLÑMöÀw‡rÔ¸ކó" )>ÄÙI—2‹‘ŝ„ß it-0ĴVĞbò#ƒ‡kH6âfcÓÛPµ#MäŽzLD,1߇COĈÀ1Œ#:ÎjTݰ·1D ™zLÙsL™1Ó4˘ï‡Ù5އ” ¨aİrrż§¨œĤms™Â8 ³Ö3ʨs&İ÷8 ĝ‡CŸuĵ1ìö{ ™Ä|™IİÛÑ2;¨( ¤03&Ó fU%VN´ÙÂ~Žž4ÖR_ZHaêŠq‰ŜgÎîVm‹iIzÀ‡ yßû~€ĥM–ˆŝÖZ ĊícFQ šdÊs§Ĝ' ĊUÀsıèAŒv†ï7ç6›Mѽ/Á1ı\˘ŝĵP;[›ż·C[u“f:k(ù!™à ^LFsd À_€Ì”SEì̤&ml519úİÈ*j)ע”ÄüԟÉúgBˆıŽV^£°˘ġh·H6lÖèÖ£}‰  ħdíրӘysbŭs.†!fı†·ê’kH'[ë”Y֌qħZ5™ĴŸç¸ Û+ÏıŽ$s´£•b‡4ûŝcF´ckyJ>_G÷N]²Ô`×R‚™f–÷“e۞˜Ĉë}Ĥ> ˆùúsßGŞ2‘ßÇÈQ›šè½£uıÇ0 #ŻÉÁOÙ`+“ĥÈKĦùž‹qšÏ²·F4Í MÓÑïġ7Me11ƒĞĊT>ñëeN!ç/ħÄ1OQ½_3ıtċ½ïpżñ‹żĝïżbqԀîżü˙×]]]~À:Óà‰ş÷Áúr‹‹‹ç¸÷ÑGĝŝàúz‹w>ŭüÔO}ożó.N6'ìŝUˆa‚ÖËv1K*ò/´7^şrCÊ"RĜ³*W†[YÊú{É^Ĥ-)ĉó+İ Ÿô%ŽútXŸ$ÔċëğY]ĴrcLŭږżoiĜ[‚ŬċÏ/uÍuJĊœ àĴĠ‘5j ‰‰H•Ê”…•‚s]×q+‚g•za‰@c֌ù˘†‘´qK§9LaÊĈc4eÚ²ŽÎhŭvGÇin&‘Ñé8Ž7ò‚9qNÛĥˆ1ĉŜúäŻ ™Ñúaà ߈~ •Â0ìx2à9ŒÜ[Ó4Ħï{ ĝPˆà1`- ÙH|P[caĦ0N‡üžÈfmĴñ²žÙh6ßñ†˘JeĞ´Ĵn…•ĴÁ “ÛŽ6›“ .ğ%@œ´5PÊrġ­´²I3Û ËŒn£Iî`ĝó$é yRc4œkr Š5'ck²ÙK~–Ò¨)RÒ ¤<× qmd%)CLe"S)miz6iݝüµXĤĵ'2j—ż'mş-…ĥ$#lÚfÖ~fMÔm1,Znè# qÑ“1Ó̀Qİ–N3+@s9*uı*³~,—‡{ùŬ"L[1£Ġ`R)’"ȟKc˘žĠ:;˜Ŝ7 $w•ÁŒìŝ'yŒBŠ’[È9ÔQ[J)tÍß_ɳy‚Rj’"X]˜ßpT3\Žj‡0’K.ŻİŝìÉsŻs•ċZ•B‹òŜ-ŸDĉ5N#&ä(´TċâÒġŻÁC~Ĵ#ü@…2Ŝ{ö1Œe}b€KÀ–LjÈì´żA‘0òuµÚ!Ĥ’sLĤcƒ&è$¤‘ÏċċôvŻĊ@wéçyÉÔġŞïû÷†aĝĈ/˙òЈI  ßŝ½ßyC)ó?Œĝ7"{Bm)EìŻŻŬïż‡àŝƒGĜï{œŽO½ù6>÷ıÏóŸ˙v’[Ž7nK6ç|c$Yħ˘5p_í9û=7éŬĈ Êë¨Oì5#{ì$*`¸f$&NÀ’)^Jj}ܲYMŝŒec/,ݚĊċÚé†ZËĴq³ ŭëpzzJ,žkrT8—YÜÇ)bżßĦëè¤O 3Â56'è·lÖ1Ĥ Œ`BBï%eĦú†Më0Žc²r¸³—Ċ†~``N ŒüµÑĜ]_£ú|]ú~ÈşÌ\“Ëà7òˆÑÒƒße}ĵ÷ 4í,ƒ­q™ÎmUÉžšħdl(À–Ò1ĉM†"Iȣ혠œ½…ŭ²9kXĈïÎ5ùÒ6 }_Ğg)’k•CRĊìÓX*o÷Jk:%”ò†ĤmÑpÊ Şġ†!K DàœCËr1ċ¸Ĉħ&—Ĝ[ùìÈkİM&ù3•T~^u„\ŠvM.…Ŝwù’û f`ë62ĊÖĜYĊòY$$İ2 Ġ ÓdPĜZ2düûàó뤓? 5S]3·’&"ÀıJr@€5ô#´ÑXŻ-Ĥ‰@Şs6˙?UŸġşnĈ1e]z–(•K!–’Ñc'kÂ0ú™w d%ĥ‡ġßɄèĜÏÖ abët)~íƒÊÂl""lq™Ú}*ċ›µÉòZŽ=§\8RÇ]VżZ1ğÖZ-˜KöH0°µ˘;ĥà÷–ÖşšM‰>òZÉÍ1x6Œñ‘S‰x=ŽqşUÚH^œ‰Ÿ—ì£6ÂbVÖÏÀ+_ŭҗa™ ŠV[>Ż’c͒żÙœÜßn·˙àòòòïüêŻ~íÈŭQÔèÊWÛ´—ŭ0|Ë9÷WT wj‡fÛR—ôÙù~úË_Ĉù3œß9ǽ{÷ññÇ/Ç|pBgñ™wŜœÀXÍI qŒ°*–\‰f,èħ$q§ŜfZjco˜/™Ĝ%=Ĥ=6Â?ÖĉV_½@Ô#Ž—EĴŬΏ1ÒġˆĵÌ·i›js^ÍĤ,Ĥ5ˆŻŬêçżì4_>ßy„™š™,€ÀZٔOîdĥŠcDcœr “²+HĞٌäÎ_­ĜIIĈ,mëġ†Ĉħm“GÈ!zÖŭ;6žA$£Ï,á˜İ˜6'4FÇ!oŝ0ĉĊOŒKÂLÈßIUb-]H@TĊ !ŒQ›Ú …I‹!ä )Ċ„à"·•*ÛSœÑ“÷è‡0ĉÏĴ°]+|%F@9O†§2ÂNèÖ£zÉQÖ  `ġ ÈĜQ˜]c,´>/™ÔœĴµá)kàág&§HN ´EŠ‘³iTÄlCwŽĜŝIj—Âè´lRŠ*.‡Ê†²'%{µ]K‡YїÖì'wA§’ÌPĜ"ĜWë•5 ž÷ á„Ñ”ħ~­ƒ•Ĉ1ÍÉErbfíhTQĴYjQFŝŜSnÓZŠßÊDM ŒİM€µ÷ħ"%L5ÁŒĦ²ŠZ“{,FġIĊ£S‘ĥKâ”S)bÔUĤ²7„RAэ@œ€qŒùàŻ³îŸÖE‰f5ŸÉùž7ÏÁ_š?ÉwS¤‘e;jv€¸m/_î­ġş-÷°ä´“Ñ–ön}ĵÚlNŝçϟ˙‡áŝêŻ~íúĵüş˙ÚżŝW§ßŭÖ?ŝ{q‚úuĞÛ3ğĉPŻZK›Ĉg>óĵŝúëxëÍOáŜîŜ‡÷ñôéSü?÷ï}„ŸĝòOáË?ùÓxóÍOQK çĤ*U2òRTY7§5}ŠH#)Üxôİ҇NĠÀĴĈpM&q[…MÍqüĦŻÖÔ“#Ü2ıñK&Xâ–r†c:˘\ óĜVòuUN WÇ@˙mqmÇGݐÛċf×ÄĈF…ÈB“'ÛO€âCĥÀŬQTl"Ï@ˆİş?‘<ï?s`knŬcĉ¤Ê2>T{fȉËaöm{żüŭ0Yv<&¸¨!ÉÒĦïaĴ½RJ½÷ìÙÓßÔÚĵĝú×%ĵ‚– €.üüżñ×_üî·ŝñßĥÖÁ{˙ë}ߟĠ‹pŠÄ¤íµ¤™Òk Ĝ7Y S–ßH‘…1€Ñ.'(dW;kiĉCTUb£oȑ4ß[áèDL>/ĦjRs^!p”ZŒÒÜĤáœÍşÛıÖğ>²‚dÎ)ÖıĈ,FÒĵz.OßYË%P•sÔ%ċuÑĦ@ŸšÉ,„ŭM‰4½!ò”%–ĥ8Z#ĉ†Bù ĝ ĉċNI4PèùBġÙĞZŬB ÏİÚɊ$l.Y‰]+=‹gË{O$àcÑĠ‹L‚öTÍş"—à—À-™EΑ´†ŠD@DÎÁ•û-ù‘ŞÍ™u–ݐ´/&Dç~v`(á0;|Ê5*U,¤f_NŠe)ÏmX×\ ŜĦïżñËżüĵ’*üˆ~½Ô)ġ_˙Öo÷żökżö-çìyRĉ+>ÄVF€BېBâwƒu·ÂzC€w½n€”p}½ƒGàÁ}†=` \ÓÂ4I)Ä) 6&£³\>jŭÑÔ>Ĥ)êıêô–SvĵĦħYê\eÌÖÀmݽГŽE-%·ħ›·}€–‰Ë êc ğ˙Ëß{Ĵ%­.ƒxÙW5Ĉ$½§ÏyX¸Í´ĥĵÎ/ûsĴj…]0ĵıhÎ5M*AĈµˆÊĜHN#ґrIC€Ÿ|^ĵd4 máŭ8ğG´Ö=Ċ5ÖÖ8‰ÊŒÉ{$Ú,ìJ…ĞdĴ† Ú>iğcoD2N@TM~ŬH0ÖÀ$Cyʉ*%T"ÓZ—o*ċGeı·ŜÂ@ÁjÛRú@ÖIó{żZŻHڐ(?¸ó@g;máĴCÛtT5Ĵ)ùÂr5.éW[4m ëħÈZC[5Ç œmĥ+tm ×4pÎòp*gÛ:ŝŝ[Ħm:¤hcљ›nƒu·FëZ8íúĞnĥíĝPLĠÚÎ9XGòˆ˜RĠš$R”ÖÁ ÖBâü% IDATèÛ¸ÖÁXžZçÑż˜Îê#™´µ°ÎPyœİ ™ŬtoÉkĤ 12+Îf·HĤLçŠĉ·Öµ“ÜÂeĥÉ5H H}­‚Ÿ&(yíZ½„HPUva8KaEâÏY)¨¨&íU>K‘YòÈI&_ Qĉ”žŭ›´›E~‰Ġ3TgĈ%-ċwÈaDĜiI]P hœb™²ĵ,Ǩkċ٘*×>²Kj·µÖ•ĈhùŭDä5™Ċêyiü“kÖ8•Êr}@ŝ³è'iË Ó4ĵ6‡@7Ó0`â,\<˘'F7Fî4İ›f„ÉmûÉrVŠÉs\ŭHÓYŝžŝÎò{aù"ĵ܌­Ġ+G–^ùàáC@Ó`]{5Žŭ{Ϟ}üżġ*÷//€ßŝí˙ĥ˙ßĝż• Î­s_ñÓĜ*ĊzÀq„V)ÒâŬ8 NN68?żƒÓÓ¸Ö!ĝ /.ĝÑc<|úC? mZÚÄÚŽu8Óé­R5ŠHeÄ d ûI2„šÉ\‚Öúƒ“›kŽ|ȎԖ-lÇXÚÛŽ Ŭo3ÂŬïU³I·Ċ²Ġf´eòr<£ ·˜%aP7âÉêŽċs™k8ñaG^½¨ÖÏ­H0¸ÍĞúwŞ 57šëbŒ˜|¨ˆš„0yÎĦĴß´yc.5™ 3žhtŬŠô³1@A!ِ$£ÂLY˘‘äïTK›1YûcDH iĈÊèMÀ i&§ïàx5c`+­‘]KçĴšüotşĥ…fĈÏşÏċœƒÀhlŝ9jĉÒH;ŝ™†Ícĵ™\+ñ]q°Ì`ÊïtËÙ·Ö9ú+…Ĥi¨ÈĦqhĝqĴu\żk³ĤV³Ì NJUTkĈLô3M“[ŒŒÖhğöÈçı„ċ[+šVSŜ(^{„F—B8ùùÀ Ċׁ@u>xj¸jۊIÒÙdP²‡6š‹ITıöZbĴuùÀDr“GĤ…™‹ùÀ¨4ç4kE(ü³‘Q”b&›>éĤ%WVU‡cbüĴ3“”d57â–çO`šÙ4M×#ñçLÒ(†aÈĈÑ"Ħ>VEuaƒ1Îj„Îp(ŸĈqbV[’ÔMĥ³:`“)“DÉİ­‘ÊĈ²ö1èvĥރĤç.ëKŞÈ’VU‚ §PˆÎµŞÎ×T)ĊLDäƒIŒ„+(žˆšYğÊìkÌĴ¤RhO“…h]*İô„bLPP'Ò ËT&›éĝà)~1&Lˆqœ0ŽĠOŜ“<ʏS~.€e}•ueù–{çÌG ĥžHΧĞi6yİc1£Ŭ4“×ûŒÜc™l0ĈšĞà?Ùíö˙óv{ġ_üG˙áßzr˙²]ĝ­ßúoúßĝO~[Ppzô ħ…20Šˆ¤mîÖtĞg眝Ÿáä¤,0ú|Gc{½§gÛÂ6 ´3)Â(ŞĤ‘FdցO7ñ8*Î>·Êc£ô²ˆĊü—ŭü1ÂmZĠۘšÉ]ŝŭ1A|ŭ˜K€X˜Ñ4“Qû£†<-×­bĴ•˘ġÈI÷˜vxy˜8ÖÊvŒ§˙<ĠÔ"q\ŒĉѰBZÔ2 à×Ú0ĈcLv6§HĈ¨Ò ñ(›XHJLH)ÁYG#{fEh̆ĴËpXZ‚(:Gd †Ÿ‡Œ1kœÑIĜM÷ŻqÔŻĦÑ:‡Ĉ:ê·×†#1Ş”qK 7ò\_ĤħT*Ö°†~g×4P)ÁĞ5Zëĝż a? 7€Y“eDÖ 49³Ĝ9b3•Ġ° ĤëàچÀm ­…Ó|°°£kÜ4-3Ŭ‰'–ók×UZËm•Ĥ×n-™´ŞD…ÌFŬ8¸ÖĦŸFhΨµCkù{œC„8*Á5mG‡jsìĉr˓1³)ž3[c`+™„¸ÖŬş2µ*γu™˜LRz–SW ÓAߓ|!!âÉċ=JZ\9¤i–ĵ+ì´5œ¨âó: ²QPkͤf€‰X6á×њĴħzIz1÷ÜíŞüa›ï}2 UŸé$Ó)E;) Úh‰¸ÒYÇ+ŒpÍx ”5ƒÊ8¸½LI’@È`Ż2ž*]²mç\™dƒˆ’XFû,_1†"m ]­ FÍÊ. =²^0Ñ)g9K4M è"‘YÒ)/¸ÎqŻI…ù4SĉËÖµĥU9"Ċ"'zŸ €Ĉq 0ˌm?ôµèÙĜ=ŭÏO%•ìaší‡µüÙt#“'½ *3°3Ò Ħf@WôÈġ{ş”HàD•2µpĥ½òSxïúúú?ÓZŭŻżòĠ_Ú½‚‘?ú_êOòÍßú½ßuqòçÎı˙üp¸ŝġĤYĊİù¨Q*Ác #´Q‡Ĥ˜àÁĵ˙ŬïÁƒ§xŝñ8ĦkOĊ/˙8~ĉ+?ƒÏ|ö]ZĜµ/€2‰7xĉN~lf jÍà˜.›Áè{=ĥ&‹Z˙SÇöÔ§ÍdàF% nRÔÀ¤äŞZÛú1—żóXŜoŭÂ<ÖÊ%Û|Ó Ĥ0Ċ’h´.µµ!eÖfıĝÜ&à?&§XJ.– g5ġŻï˙†Ŭn§Ĵ(ıŒıĵbbn­£GEM‹Š‚~$aĤ0CżSĞŻĥ ißC¨ĦÑ$!9çíù§„´ĵ(HK-ìë1Ċ‰Úü|އ¨^ŞVŒñ áâ‰c„áIşë:Wjċ”şÙ)iıĉMA+×´bLĴPêB\£…7Ğ…ÜìĠ*ĈS”§ˆéhR‹ÂèĉÍtܤ÷^ƒ%ŒñúŒĥî""Ññ­Û„³ €9pçŒÀüÇÖĞĜKâĥœôç–ùuyކE!‚ĥ'° Žê8b.ŸsiO“™ŭĵ˜UÛ¨ŭnNŭ2Ĉ²ŻĦïáD3\ ŞYjċ{Ĥ°ĜLÓ;‡ ²ŠŒĉÏübc GsZ ™P!˜› Œ5˘gŻ1ž÷%ËdÇm{1Š—šÑ;£Ż€à=şn` Gƒ&qĞ=°PüEìGĊ‹×î€5‰ġ•ÖżmĝÂġ$_çğŬ …дڝó€1ğƒÄ8ħĊŸkÁL#”KŒV ä1L™€^á&z’¸²(ò,ÒœœìŝymĈY*&Ž×ĥĈ¨ĵBPR)˘f(˘,‹Žœ2sÀ {ì†]O\gÈĦ´ˆ“tBv`ĜƒŒŠC—5ĞbÓŒòĊİP#ú=#PÎo[ ċ\‘o)}o1M´AŜÊt(Ċáċ –š $!­059(*NÍçÂ\òfßҒliUfúÚ҉eËw÷˜È­íNùàJĦX`M`ÎKÎży8ŝö˙³?˙£?rïşlüAtÛíóŸ˙Ç·ĵ÷%„§s.˙Â8Ĉ³Öö§$²Q‚)œ²C7ú[o½‰W_}ż÷•Żàµ×ïâÍğ÷pħO8;ğƒ÷çŭxßûïyÏwW÷Úò4–ZPŜY„àÒ¨¨ŬÜÖUċÉÊx^ŬwBXÓÖ(ë1.í– îX˜ÄúA\GĴÏ· ½XûñSÙĥökÍŜâ Í` Ém÷ó˜_oKĞh'Œ­ŭ[ ĜénC*„“UÍ1f]y×Z5éаÔÉî†*Èû‡í:m5ß8=…İÀéÉ 2•IY`,´;!ŝħûŭ^cb ŭ1&=އÎ4'm]ŻéI’°Fïĝ\dmŻ‘ BVÛ{ĤhKS&µ8o}OPrÚaFKFNsBZÑzR&D-0ÂÙ9œ@’эµŒžˆ…XK•kbĴĊ÷0Öj‚–Ä,Ct§; ĜK÷ŭ|ßdEs3söİ8d”Cä\ˆPN£¨kfµp:Ŭn·[PŠDWjA:] €Ó§(‰œd„şàeArc‚Ş[Î:t`2‡FÔ% „é ıd£~—|v‹˜Ê½%Ç,Ç"B‘ §™BRĜËW„ym"ÖÖ6§Ŭ_ëĴЁdñ Á- ğFrۄ²… KO\Y´Ĥ”1 ½˘p"gʘ¤3²tL˜SÑrÁJío”A^½§ŸOS\PËäYléÔ İm­eÖ:ž˜y]ó~÷î†ĝE‡ĞE˙g„Ö\Š:Œâš&ŭÌ.Ĵµî60½A6²sĞڙI ·äŒIşWŠèN:fĊ)˘Ö´,°Q6ĊÊò,né?ZcĞ+xÌ:óXDŭ&àdĉî‹X+ 7wżßŸ×Zžıxtñ7Œ5÷?ŝƒ‹×%·˘ÛnO?ŭÌĝéOêş˙ŜœġŜwµ”òx)sŽ2ës)J>!0ìpëÖü6:ŜT\ŝ‰7˙Ŝßùğċş\üFtÛíw~ç·şišžèşîçjµ?àÌ0á6;žjbcòŠ˜/p8p÷î›ĝꗟK/Ž7îŬùƒ Ŝ÷ŝ‡ñmßùĜívúıµî>??˙‹‹‹˙ôGŻù¸×ˆîeîîSùé§?ûà“Ÿüäoc})eމ7o Ä‚”'kÖ½{xá…çqïüN¸(I‰Ôċ}xùky5Ív"†b\ÈZÊŻ 7á‚S/Ħ·Ç|_j-'èí˘‡!œÇŠÚġCż…Ż‹Öc-šcˆìÚcxMƒh-ĜL“[Ċk>ÑTk!ŬšĞğ>ç­P°=^ñ¨ô›jNž ÁĔ3ĝ0H‘’Ĉ¤”˘0ÏWüvC P–÷*…Ħwažĝ˜_*\ŻĥX´SÌd0ïú^Q]ġϔD/紕ÜÚ *l,ñGwğŸ#ż¸b™%öRm,è ۉŻĥTŠ wÖò‹ŝl€",² kXf˙]9&ùż ]bċÚs`f´şu Î°Î´Ĉ.ĵnáîB§h­üġqmH-|§ÈBĦE£ZïÒ5%x?ôpÖk¸|†…K§§§ J˘yÉûĊÎL9íô™ĦÄ1n7óbˆü†E¨]4ˆ/tU”Ùpĝƒ:Ğì?Û̉£Ê¤XrZ…ŽP sˆġ˜ÍùÁYÀ ³scƒn.s^ ¸)%CĊċñ2%S5Ħ²QcĈQ‹&—½§Œó­ózÙ˘ \ċ}żth:žô)qĠÌw?7Ĉ>s~~˙§bŒ˙è‡ĝ×Öa׈îĠÛżĝĊp8nĠZŜóŜ¸3È5Ο%ÂdRˆòkbŒxŭġğĝú‹/àk_ŭ^}íuÜğ˙À;Ŝñ.ĵ˙{>„}è#xìħ'sÁà-Œ#/Ċ‰W3hì¨ĥiU‰“VJSŻŬu¸µ*mı¸Wqy‰ŬÚbv‹Gğöù½ q=†È^ċ|ì³d?Ö<ßÖŞmŭğġjyë\½­˘ŭ™ˆş3ŠžùkV”˜ĝg4ÀĊ”HĜ• Ğύs„Rîv7´°êû}ïٔßáììւ£(ˆÙá0˘ 4˘ÔŒRÈŝââğ(x8ĈQ-İöܚžä\°ßï1’sÑrŝ GdÊqĥüĥ†aP 3‰^Ğ‹‡BĊœsÒəP²˙ÒèRç‘9=K§Ĝ„ÍçyFÒ5ȁ‹\Y­[”¤ÂÎ D™îĦġä#ȓżä‚"qíġï çŞ=ΖG*t€–+tŽŬnÇiaÌÍëfÔ8猛7oŞ›Lİ…ÖÑĈbĜM‚£ÌE‹£Ea{8)$…“Ûı^ÓÈĤidrż(Ä[DTTës¨᳂€[×ÄçÙ2Šŭ™D ş”şprÚaÉJKĴ·ĉ(i‡b. ĠœŜиeÖBUâş-:ĉ8Ú˘ĊysĴíL1£ħ ï<єµ}‹ÚûhŽĞ[­–§ëÙżVwıArk%J‚u„pÒı#”XVA{…ĥ²ÛĤ\@7‚<;Eİċ<͝ĤœÉ5Â:°;ÁÒñ@[¸Ä}çġ5âü èxËË]#֋ù†Ĝdc`Jô˙Z(ù,g*t…“‘ÚL6AL-¨ú 1ÔT^vYÇênÑġÖàËUóԖ;Ú İëşÍİyŒ5°§ñĵïúg^{ŭ•Ï\£¸×ˆî7ĵŭâ/ŝbyêݧ.~â'~⠔PkŒÁ֙^&IR¸w‰šQcq²Ûáñ'Çéé)v§j&{’7Ŝz/|ŭ9Ü}ŭuxÜşy‹ÏĈ€üú…Y!éC~YÏɨñż&\5(ĊÜÒq„.h]&›²zŭÚ*Ż o+z[ÄÜr)iX‚fµŽĈFM}cĵ_(¸PŒéĴüĞb‰–ÉZb}K3›˙{-ğĈá!„À\U£<çëö~Ž÷%˙Ñ9LB…ï/ED Ïè­ Ŭâvaᴛ9şò˜³Ġއ´[ñ͓£Gà½t54 €8v:qÙ1ïYÖXu_(jşš´nçû‹°Ì˜"£ó)ġÀ í uñĴË#h]0H˜/"$]Ğbµ˘ħı“`^Àµv,X.Ĉğà ñBG˜ÇBN6c~)*Óĝ3I0iP™£,(t×:›RVKħZí/ĥlĦ3Švĥ4Z BìÎ`”;.‹RcĴ&0Ĥ˜1M(ĉ IDATb*|oÏÈumáˆnÀqÎàΒ§âÑÒuŞ0*Jkıım[[ü­Ŭ2Gú 7%pèŬĞÓ4ñ˜XĝM‹”Èœ # 2{ĦÓ½—óÇÂñe£;wŒ;{ œYûèn­½Ú·À ™';‚˜âyᙗ^~é3á/^§œ]ş˙7ĥ§žzêİO}êóûŭçœ÷'9×'S.75Vò£S■zĈR{ĉìì&ğŭNOv ħŠ4xġĠWñêËŻàŝ9Ŭ“§·Îĝ!+ĵ‚1ŠEޤJ.µ Ĥ=e’;j‹QÛÑoRډ}­•ß·üŸuá¸a¸.Tߎê°n×È@³žPQJ`kmгĊ;^ïsKmXóe°iùë}ÙZÑŻ í˅nĠ˘L Kc Š,èd+W‹ĝÎ pÖ˜ZQRĦĴö’‘Ò„i:@³r!>\)ód-â.t°ÎĦ:ìv=MN)ħOƒá8˜ŞÎdĊƒ‡çd/Ġy’PÁğ*£"µ6v·IÏÒRÚP­ÊG† BĈq\t ¤€3xQ!Ù½˘{™iGìŞObÂW•d*ı/°^S"Rœ9ydmÔ12(Ù¨i;Jħ;ô;nÙ;Ž%§‰k&ŝ°—r?(-˘ï{²â‚QÒ:ċŞFßÛ÷=ùÈĥ4 3'CɢNNO°Ûu(Œĝ‰“pĊšl=–Äè)Ċ¨G]Èù‹, ”û5ĊDq޵¨‹CÇ×vN|2ÚÚĤ(ŬÒxĴZġu6Üùhù‘@a)†<’ùX­s¤JôĵsZh‚[ûr_ĉ”#i/ûßĥë;‡”çâÄ{§×8xO…$Eñì9ŒëĴĈòr3žìB´éŒSäg‘ÙúË ˖`ÊK•QfZ…ÁšŸëuVĉ™v`єÖw)³—zK]1ü|ôG?„K4#znĉD9I'“E-4 £çDeóusJJђ"] ğD‡û@!‚V ÊŬuRè.'TîRċ‘RĈ8§‰œm4ċŒ:4ĤıD¤4)Â-…hEżJħòl͓ë˘wħh{Asğ°\\š·–b˙—§ĉ½×˙ë"÷şŭ´ŭÂ/üByúé§/~ò'ò·J)_2Ĉ 9Ċï ŭ§RjBTĞ7aàœ÷îÜy wîÜAèĤ-)âb˙Żò2^zù%Äq2 d/TipôCNN} [›eĉÍHïWvkUxŒSğċ”p'÷ùœ­öÍş˜>V<ĥûħn%·Ğëu`ĊzUĵ%hÛ*z—\ħmŬ-˙à­b|+İna%>§LĵÑïÚX ħ:ċJDpxQ‰ ½íëeò#ŽkÑôħĊ7Upñġı´† óàĵ"ÓaÜÌíôĴ”?99!4­HJŒjk´µĝhJâšŜĦp4Şcopöŭ-ÚVWp“@%Èèúş 7wv˘à×w·ñAÖbĴq5PħX˜è’ k³Ïę%Û&ïş`ġNOO•r"ȨÛàÏȲìİċ·µĞ.„CxҕbŠžŸ -%‰Bp<œ Ĥà¨ċ[++üĈêÊBDYAd[Ğ<µN3Nŭ\ċğ¤•^¸“Hdُ Ê]ŒH|lÛI7@ŠA^)”~e8 ½GŽdÒT†Á#‚ŭ~T+1ï,BçÔdÂíхĉĝ`£ê{Yĝ3]A,sl+XġÏ fâ¨!(p΅‹Î9Ŭ.N§[µëCŻbJ(Ġ°÷kâĊ·gG (Ş*ü܊eÇ ÏkşŸ‰?›3“ğ!°ċĜ\˜ĥáAN§Ç2’ZˆġügĉĠĥß?;‘ġ½%îrĉĊ@ÇçeĤV´.ÎÓıħfıħ„nQĉÀŽAŸŭq£Z†‰VĈäZ2*²˘ëqßp§Ğ zh)iÇĉŜġXÔZŒ­_³Ĥö­áí(Ï /úϽï˙ÎùƒûŸŞ˙ġ'>ñƒŻËÁëB÷˙•í—ù—§>ġÓ_~ôèáŻû|)uìı/ĴÊ1Mü¨ Èı$ìúïxòxü΄àhċY"<şçž}w_ğ ç=†ŝ&B`ÀÈRĤ4rşUEİ™'dÚnoĴĈc…Ĝ–˜jM#8†Ünµ]Öß/ò1+•5Bĵċ‰{•ï1n£Ž‘ĝ[q[\o˙ZH°ŝùUäu„şÖĜĈĞ{•A†+ú…<1m+µP¨Ö°Pî*ñRkSPÈ2/BŞ!+3kˆ *À”20 ]`è‡YÄ£vd2ѵÂqPžB Ĥ8J;‘-ŜrÈÖQA*Ċ• m+¨ÈL·˜Ġù"\“V|ÏÉf-WŠéŬn‡ÓÓSż9çĠĴŭŜÖŻ›ÑµuèûµR& ™9ÑÁ÷ ƒŝœgÏaïĵĤ(ÊŭĜ…nǞşFÛŭŞ‚ß äË÷Eè:ĉĊ:µË’l‘#ıçÈ6‰ë\ĂlîLÈ9d\œ@ċ3Š/(şħFù·R¸‡à›óWOa3Í3ԏ&tÓܳ8Ŝ9DÀ½LŻóaĉİ ÇÖƒ)œ'È˘¨V²²Äq”hW)Ĥ…– ŸG^B+4ʋĜëÉŭïĴANQYï y³¨D],^zM0Zì‘m-ˆ‚wÄÓ7‚Ġ„/áú O¤]”K¸„,ĵŸ{aNê] Et[jZ7ğ1T]x·Èô:ô˘[%ÄBÂ$,SŻäZR§ÁރDJDŬ˜“Ö0ßwARšÈ7N„ÊVöèŽ)FԜ8˘ä¤÷}tÍ<ĥÚK`ÊÚsXĈrşÇ=ğ ³X½mD;÷­SÏr+’×zßóbH)ŸÉ3ݽöÚż˙ä“Oügŝ̟N×à7÷f~żĝ·ûŸ„”Ò-ß ??ŽéÇœy×£VZ]zžb<°á4E¤Ŝ?/=˙ž}ŝëxáĊWñÖŭ@ ¸qzïùî÷áŭħ?w½ëÑÊ[/¨ÙÀ˜^Mŭ[żĞ ÉĞh-úsŒ†p é]·ë—â¤|4ha]pn™j·|̵ùvÛŜYż*·ÇßZmm‰ŬäûÛĝË-~ñÖħo×öX sb[ + Í:_ŠÖ×OZWİ’UÓÈ6AÄYK(’2ĝtŭÌ mÍŝ½÷Îcwc§Ha×wŠztÎkln×uxóü>rÉpbɞĴó=µ ‰.\JEAÖ‰Ŝ4Ö`·Û1Jšġ²ÖÀşċµ˜ĤI)ò9RŒ‹WÉsŒñ8Šĉ -A8.ڇm;2çĴaâLŠşZ!ŠÜoÓ4qğ'úEİL1 c:==Eœ˜Ìvl8éġhÓÂĤqâĜXŻA #eĜĈ†kž³~NJdqfĴQ”VÛŝŽ‚.Úökë!¨§äşS+³ġ„,ˆ÷Â./UŬGၠïRDg)'t]Ç^²ËnŠ›%qĴı.İtöû½ óĊ‘žç˘Ħ*mhBÉElĥóz‹Áá*˘0&ĥu+D'aDvL+`nħ„HÜîZ(&žò{ċ˜äó×ÁRôġ=½fżO‹1ND—ŜSÑ:Gca&?‹‘D`r •;+µV ëhvmü.Ñ$J“^6?§RĵJE¤Ñ~^ħ—µ ÀeJÚk,ènŒÄq.¸x”´P/…üo…ó/BͤħÓ4qWI(\BçÊ(9mRë™<‡çĊAşû{U'óò‚ÄljCZÀ#„€‹‹ƒüû<Ĉĝ̇>óñ˙à5UáÑŭ˙Ŭ}Ş<ŭô3˙úżöÉ/xg‚5f*%?áĴíğà` qӜ³€­ˆi‚5·nŸá֝۸qúaGŠĉ4á°?à­·Ŝ‹/ĵ„‡îìÖ†îd@İûDȑĠälĉ]6 Žq\· àchêÛYˆ]…ŝĥƒü:ğĵ°ĤPl×Û½ï*‡ˆc”‰}=¤ħ Û*V‹Ĵµ"´Úì‡[SËĵĊ3օDͰŽV3,*ĵe)áċ–YT&ÉG™ҊŠrŒ&NĦÎ{ÀZ ¨€Ad[5PÎĞ1MH,䀲?jAAó€Ċ8Ždİ×÷]Ï<Á Żb* °Ž“Ó2ûZ8SU¸$EnKk˘Öy·•\ŠÏïÔ'6ĈÇ­ŝ£"żÖŠa7(2kŬRT&Ebà˜cSÉzÍYïµÙ [Ĥqx1n§…œwŽB)X &H!ĦİFi )'ŭ>ï ë‡j…Ĉòĉœ‰Oì–˘;AxÛÂGPÊŬçEŠ0zÍbhYAQğ>ÀT*j­ħ°0˜¨İdì‡àÉÉ@ɰ . tá{İñHTü‚ˆJñ×ĥĠĊoÏz gtĜ ï Dèe@èZQ Yî{£"-Í­~yĥSŽlU:Ċ:ÉpI?˜ÑôùĜ ÷İ:<@ìêXpé˙ëè\IħóÎ0텣Ÿ‰ç,/Ĵ&+Ê˘§ˆÈ‚3ch៧H~Èï¨üÓŭŝâżĞMëûŽĝÁSşÚ·½ğ“µFW‚CM8Š`ĥĊèV;½-N×aûnĞ­ĦuÛîÙB3·|[ŸŬċ yĵß:c¨ïVĦğċS(â’Elm³OoçµÛžÏġqĴ˜³É%MĊ0sùÒgµĊ÷ô;'ĵdt]ÏíÛŞt 9áìҔ&ġÑàp/E½ÊÂAĵu礵MyšĈáp°‘’ ğ ì÷ñÒy,ıàᣇĜívĜívJsħËÌizÖ7½ˆËv;@Ŭ˘JĝEʘĵOÜJ.êbюb§eÍL'c”ïşÊĊĊú~Pn3B;Ç´ ‘âLùöû¨‰lQĊl#Á…Ĥ[„@´´ƒ–~ړİoMJ•jiP|I­P.{ßNħ`,œx¨€ó„›ĤBçvö#.:ÎFr÷ꓛKF‘8_I$K%A3ŭñ€rÌc~y~ѧ7S5·@˘uBéUb.vE mÎKİÏĵñĈŸù‘ùÄ5Š{èŝŝoO?óÙĝİOŭÌó÷ïß˙ġÁ¸Rú¸ħèrÊíĦû 2jtĉ <ñĸ}댳¨…P‚8á…ç_ÄK/½Œ”v]Oè4Ž„²Ĵ ÑËΞÑ"j­- Öċm]#Ħ[a mqµ`íŞ°µ‚^Sĥ ċÖ{uËĥĴ°[k³ġŝ·ƒN+hż˜]{Ż÷½E)[ßÄş!ĜX Ö‰@—[Œ$ɇxŽVیLjpĤp/2ç‚Äyî‡X‡Ê&ëF‹(˘[Q1Eâ²ùcnn@ċ˜àR eû5 )|şfOTĉZw¸'E?·w-{˄lŒAßQ´ĴÓhM˘ôŭ ‰oR ô}ŻİG_ìñVċiĠä04YöŬ UÑrq×|ïöžêşŽ] *†ĦGˆ‡Jvg–òšÌRˆ +ölÒNġMÀŒê²0ÈX½o$>oè½úĉmŭ„£Ĵ|ùĈMĦ‚bŠê§ĞNċ2Š> MƒŞ3•‹ÒZ´RxÀâ-übâÀZMˆ€pŽp­èûA Wµó§7b¤ˆWrq 8TıO¨Xt¨lÙèœSް$²yïQ í*?6Zиsì1íĜċAĈг6ĵ€ O[·p†úÀ!Ĥı‡fŝĞ1F~COA!x„vàq $4FZ¨ C@ßÑ8˘EäƒV"à‹‡ä)WE‰3ÇS‘l”Z@÷ħÓħŞÖ· kœe*XŬä÷Zĝ•9m6C–1":cԕğ 4R¨L­8ì÷ˆñ@n ™Ü²ĈĝrĦ[³ŠŬd0ÜK^íVŒ{ÛħœÇŬEeÎiA/[#ı­­wZáôšĉÇŬÚ€˙cïÁƒóżñ?|]ä^#ş·/~ñ‹Ŭùù[O„~ÖúcÖş3Iv˘ ,@Ò#çˆpžÚ2çççxñĊŻ+_}Żò*Ŝxŭó•<Ûŝ(>üá{Ŝ˙Üĵy‚TB Ħ‹äé™Ò€D!ΠpҒ%N/Ħcé’ٚxż´Ĝr:8ñ°™Şĥ…n^ċ=¸FlÛĥí–@kÁ{m ÓġêY…Ûçk$µ¤y•Ŭ"Ùò™mĜÀZ8·E÷8–‡…ŻÛÓk‘\ÎŽ­ĵ 4Ìá”tÂĵÒË6h˧T2Jf C)¨Ì=u>À:‡Îzô€ï´àsÖĦ”’qzzÓ4ÂZ‡7NqqqAEK%î/RĈT3"à ‹‡(ZĜ`bÖÄ╜ÙG³™˜„ 4|âïaĦÄ6F£j݈qÒpġ~m\ˆ“9!ôK$pNħ"ÎmÉPÔT'bë0Ĉ‘BŒA×ġ‹ï†^UïìÂE ½ç¤ÈôŜcżßëġñ!kqŠ8½qŠiš”3›RĤÔ³oE^“8ĞóÄċµnaí&BÊV<'ßßĈ<×2§aÉy’”³£srzÂHĵ´÷Ó4êŭĜÚ½ċ\D‹•LçŝĈé XG"Ĉ›Ġò*P:46ğ½˘ˆT¤:í´È½p˘EœFmŝĴŸ™rÂÍ'ZèYK_]ßiсHü;H$(¨dëí*İ_rĵm:›÷– Uâ•.yĞóçHÇ£%KtkHìur0Mì½Ìh2u[˜b—Et’@‚ı$œ3Ĉ‚µÛñ"%:‡ĜÓw$nĞ$Ĝġ}`Žleïh:.9Ó8£Ë­?Ż|gJÌûĉ´9›yše'.@ qJ0v^ÌĉL–dSU|§ˆÄŝÌÒ½²Ĉ¨ƒˆÏ*—cġUm甭ñŭ­/•9UŻÔ ğê´˙ŜúĴÔielÈ9Ÿ—<ŭW)˙|Ç˙ícûĜŝşÔğFt˙@nżĝ‹ż˜?ûÙ_}—ŝÒ'Û9ç1S­ċ cLO^§¤PžĤçÂ܂7}×áÖ­›¸sç6†ĦC‰Ġrxó­7ġç^À›oŬC× 8eħ‰5µPA!N={b’%•ħä´(Ȉ³eó!nyCKÄ×-Zá|óÊmÒ™Ŭâw ­Ŝ*Ž×İpâMIƒy´Žĥ­D5)ĥŠÜ­}9fvU2ÜVÀÇ÷ĴÒĉÄêgĉÚ^Ĝ‰hbŝ÷ìWjÄÚLZ•0*Ìjù{Bh•ż’rĜbÊ:RŒx녀`ߜ…÷Û—‰ÒĵJU”ĥï‰GEFs}À[ÇB%ï{”2*9JP*²(<¸N‹a´ĝ³Öâä䄜Ĝ/UĴ£$AŽžC^˜ÙÙ*Ğë:JëH£E£8JÈk„7-ûÛz󊲠IÖz CÏĊRV{ d›”2B ù÷*(.-ú,n'RäŞU›IÌÖmA)!…I*H@ĉC ŽMub!ñ˄ğE˘]J3‚¤âÀàƒi9˜&ÍNžCâö²e™Á,”Ğ-EŠÄŽ3Š6’m×,.T7Fğ>`èƒı]°ê˙+³,œŸ½hSšF]OrâEYĴĊm$°ŒGÓ5­P†ï=ş@Ï8Ñ*S:ä÷3zH<]Ic+ZD·ˆàAÖì:8ì£R#œ3šT6ƒâËì:`U+œ _c⎷zf%͢‡ìçëyjÓ܄œóì–0Mä @‚Ú‘…Ş™‹_qZà<£¸ô˙ c9I´b[ë°ĵ³ä\SmèÏle)` |™ıÙÇEܳ5"ÙÈMq:ê3‡ŝßëşî+??ŻËĵëÍŭAßÁÏ~öW?ŭÓ˙öçÏÏÏ?gŒéÁ͔Ò-càİpèşÀízX)ñÇéé Üıónß~ ÎċrÓˆğw_K/½D‹8=ı ï;6[ç Ħ&!׈‚gÁIOĈYċ²­ÂcœXjù°1zĦ(âuHĊ1:ÂşÈğŞetÌ"m =ĉÏğz1)Ĥ{/ÒáµcÄV`ĚoğŽûŬÚږ×½ŝœ-ħžEKk6ñİĉ•b'‰ˆFk Œ3šĵfP5ZşŽ…e$F™h&LSÔÖàÌŭ]˘ÓÙPtÑĴÔvȅZĝT :Äá] A-– ZÛR | S@ Á’³ş àĥ´UÁ­Fƒ:ˆ…xêEî„B T™˜Ş!÷ ^줜àCßġèû•bòœ½tOJ0†w„şŠïİVô9M7À÷IÂ-XŬ")'jûOÓDEk -t­YÄ&Ż|mQLâĴB+q Ħ`ègh\9ĊħW_à9°6^Ĵ³‡Żŭfq}żàé>0–œ)²iñVĉLKĝÈ|ŒTxË1ˆ˜/N>8Ĥ5dŝ|‹ñ‚Ç.1ƒ[˙eáq*÷ÛZ8D2ŝ èpÎb^˙³ż/–ž·"b[7$‰"Ñ4~³M?%lM[ÀbÑRoİmPE×QÒ"Œĝè–&pÖdÄ£ġÎp‰žğ$cŞA­Äµê‚xŬò9ʘo€i*H‰PfÏÎ –ÓÎ(Àş&9' —( …yÇ9G”š–p}·Öpĵun­ż8rTħ~_mìÖìQ[ÛÁ¨µWÚşóœó3<ĝÌÇ>öçŜúµ_ûµë ïzûQèÀßü›˙Eù•_ùĠ‹żü—ò·RŠżÓuŭ  ;Ĝ“ÊxRaTßï`Œċ0à;ÜuO>ù$ÎÎn1G뀸Çŝ°Çמŭ:ŜzëĴµ8==£xĊXÈfÈY¤Xï´è4<ğJ‘+Ċ‰WĴÒş.P‘KÄ`ĉëEn×hŠw^Ċl0,’Ò Ħ¤x™&VÙÍĦsĝ4QLܨpäӏX"~I2Ûf9QnĉF•sê^‘™—*ûÒu”žfÙkèkI¤î­[·A´Ï”ŠSœİ+1Ö:‘ ½…ùħmbÚ Á˘‹!÷Fß÷Zĵĉ•H°cÄU£ċ{ÊY× ŜUMüéŝ“B—èĥĦ ĦÎ 0;§ÌÁnĤ^Th­†—¸ëĵ8!ħUhh¤„²Ö fj½w½A­VR×R¤b;xŠu4³-Ö[ŜçI*3}„ XçÀTƒÈŬ‘9LĦ6 Àb½•%/P!HîD3(8ˆfÎ IDAT,îZ>'²è E ½ŝ,d žÇ"Ú'u+ÈbB°sîÄïJ IċkbUÀiyÑ!É~y  }˜ÇĤ‰ ‰ˆ.1‘ŻvL ×6gäD"XuäÈQğ%qŠLIËÚY‘.Ħt\ŽÍ-!‹³v~ş Ġ•÷ä2§MÒ}Û×ĥ}ŞMÊ^LôŒkÎ÷ûŭ3Ó8~ĉğöǽŜŝş²=ġÔÓégöŻż|~~˙4ĈôÎıÖzÇZ–…–áöek=ó;Üşu ?y7nœÂàÑGH9îëwñâ /á7îÂڀ³³›è‡1%TïÓÒÚTXNżÚ*ڎ~ó —ĝı­KÁzPh‘­­ĠñšWş%R;6ĜlÑŠü]·—²pu›4Ż5‡ĝ*žíšpìĵ£ZlQڂZÇè$êdP™‹&ˆôí‚ĝÊEC/\„YkubµÀ˘ÂÔL JìKvuf„73ô“3/d„R BßÁzŠY-Ì4–ŝĝfšsŽZŜ£óä[KANTàxëô:9ÁÀ 8‡óè:Š ÜjvÎÂ[‡ĥéNê0 jS%ĦR$’˜ĈiK½è8Ŝ×rƒsŽÚîÌ´ıWPôşOá=SZŠ Ï-žÎk‚ġTt'FĴ| Vûŝ°× *rvğ) Gu›Ó C‰ż˜H”k)݆B ‘ ħF[ôR÷]‡ŠŞŽ"ü›Çİ™òAnkmZ[E£)k²8j[˙ísoY¤µµjˋ Nĝ“ÂD¸9Wíz×VŠ2 d˜ÓÍ(¤!8â™ĥ bï­ ŜÀyYL´Ï7ólÙLüdĝ•"4hfђŸQ\£îœáQ˙[cĉħV(ÓTĜiÂ͟×|~‹Ó˘Éh°„ts¨4š6Ó&f^qa?a‘8P1O AĉHok*ĠòY–9:A[ú ˘*Ċğ‰6[+2 Ï ÍrΘĤCógB‰9NÈ1ĦĉL6ˆ%Ħ°Û ÖJóïk°(`× KÛ=kµk@âĊL‘3wÄP+ĉ4˪ֈÒ-“Ÿöï‚Ç4àĴù§¤Ÿú³ö_yóşĴğŜ.ŽXwü‹_üÂp~~ŝŬ>e­û„÷Ŭ Zì‚IĞ˙LA öGà7îâw÷Kxñ…×ñĈ›÷ᵏ?ŝ÷{ߏ|àû]ä;yBÏ(EÄLµ„,,üĝ*”t@ÎèÁĥ5ÙfñÖ ­ëXrÌêıö >–*s,(#‹‡bcî·-ıħv“ǵĉîİ ­¨=f9Ĥu"]‹ÈÔZá˜f"(˘ˆ‰äïšËĤY{äbi€‘³àċv(™ŠÔŒċqΨ!‰²$ık8Ħ˜ZSÁŜ¸T,úÀ­hFÌ=‹ËZ׋á ",ħ #ÁÉlC%6P$‹ì9ì`ŭœŠc$îhŽyĉĤ‡ éZLı\ Ò= !`ò‘ñşĴğŜ֛˙şòO~˙ák_ûÊ˙ùҋ_˙ô~ż–üŭ]×ԝÀ8e”˜0„)M/ö0ŽÚħ'ğïĝvœŬĈsï|Ï>û,^|霟ŸÍ{/ _x/żò2>üáà=ï{NOÏ0 'loUa µ×„YĤu ŬjµŻÖ [[‹j­=ŻâÖĥĊäŞÜë}ۊ]\ §ôI€ĊÂñ`ë\Ĵ?ż]ŭŬnŭ˙˜#UÇ_j…k?³lîzÚEGJ‰Q9İì!ƒzdĦD8äl9)ÖPËüÀĊݧĤr͈Ċ!ĉŒqš0 2ˆŻë½‡ ~F‹E*Ô9’zÛö}Oġ§éûĵç‚(ĈˆŠL‚`áħ+Eyfxš™‰C<Ħ” Ċ²s)Dž8LUYĜHħjÂ}Cú`,‚ġèw½òIß:‚-¨=]˜ğLĵMב‹*Q5ĵóH5ÁÛÀQ²=úápP‡ لVĠSNsšX.YÏI-.¸Ċd.×§É}£EcŞêE+¨äì3k-Xï­ò‡u´şß[?^B„{9 Fâ‚sÉÖë÷,½“ S/ 4İ­ÓÒÛsá)…qŒ 8-’…Ok Šs8-Ú¤`ĴĠŞû„ÄòJQ>ƒu.n`Qòì, ³%/âqġobè,beNĴĝW+†‹Êq,úıàSmyj‹£„³À8Í!!ÚÖÙFH˜5>Ĝ,ie †„~ˆ7ŻezCJä¨`ğù8äZÈW8ĈX1Np%W¤œ1Ž#Y†5!È g™’PrDċ˘VîEıĉtK“âf/ë‹ÁĈ¸yĴ›yLk²|],Ĵ·:-í~(½ KĈġv½}Óşîwż§xëŸ˙³/~ĉġğoŜŠqúış- ïĴ%Y×wÈ%bzä:Q*2ĴïQĞÇí³ŭûÜıs żq|íĞ_ĊŬğoàÁƒ üŜ—~/żôŜûµŻû>ĝaĵûŬß ç€Zú]ï-jÍ ïÊö×íĦÖ§ĥm3­ß³^‰ŻW×­­ÓV›éU@&ÙħÙBH·,ĈĥÜġùYrĈ– ħ [£pÚzĉÉT2'´ħħnq^£y0ÓJïÍ<™ö¨\œUˆ-’( ‘͍0*çËÜâg$vè„.`à˙Óbè{¤HècNQÍ˙OOO1]ìigEġ¤b-ëí:ğž¸ô£QUŠwêLèûğ]`a\F)†­µ’úµOSDèÇ}Ò¸ ç.ƒZ Ĉİ,%ŠQĞċ ƒœ GçşêšĊ™ċ„3yŝ†ÎˆŒ4çD1Ë2ž´û2Ž#ĤiÒŭ*ı`Œ¸ċú,ħ܋tŽÍÊbÍ,¨Lë1|K€|U!ğ5ÎÛ:wĜĝ,lvêÚgnMÙŝĝzQ{½]oèİ [Ûoŭ“߸9MÓ_Ħ˙’ËżhĴ9§™ĜċÄS‘*YĴì÷ò+/Ë_}_î9Üğ÷q¤dœo˙ĥïÄğß÷~|ûïúĥwÏ.XÔRàìì;ŽòĊ%…ĥ蛅öÒà>è)%ċ&n%­ ‘tšémÚbqkb_ŻÎ·Ĵϖm|É[x} [-ħuaŬEÓÚ¤uĴb64 &bï ›ÇŻéò3ċcZ£…n­Äù‡:f/_WfBEÇybYŠ0ĵ#ŝ#œÁn·cĦyñŭ@b.çԟsU8)šfÁƒ‡`,ñGÇHH+#¸Òêq\‹tò<£6-%@öµ ƒ~—xRŞW·…•ż…"AŜĦŬâ^2çùÚÂ!]żHo§qáG-ízÓDÌRúZš„ßɊíišuBÑĤkÉ=?Ċ N½…s!ƒï”""÷—¤£í÷{„4%L(=ûÈ ]ŠžÛ^‹ñíM)ĞšïÛ~ż‡s'''H)İ_în×!ċş@BKÉĜí -éûC`,p~~ĦÉrâK+Rçy[ôÉ5Z·ä×TˆĦê}+ĊiëÛġŜâ+< ‡%œvșĴÁ†>(eAöIž·5e‰múÙ~?ñBÂk-û-×d3˜ı·ŜÏ)lkúÄ<',ß·Ĥ´>Àò™1Vxg´ &¤?)½D|„ċ^òn.À—t1Ñy’Ôşä ×Âŭuáž*ùXÇ^“äj­ˆ‡=]\p‡%İ?m)qħ>Ĥï˜ÇDSíbÎjÖ4²ĥÓĜŽ˙[ü]ĴüqMĊ9p‹š&÷f3ßüÓÓÓúèG?zM]¸Ŝ.mî›é`žzê³ÓÏŝġO˙³‹‹‡˙sÖĠš'ÔòD.µwl½4JpG-ü :Ŭuïx×;ñĜcÁTà0ía]Ċ½·ŜÄ×_xoù:*s*wŬŽVĦĊÀĜŞI8ÖJxAD×u‹‡ħ]‰ĥâ­cĥ- ›,\ö.lWÓ-šıÎ˙^˙Äwlħ.Ĉ×|Ŝ­öÓħlòöXĥè[ píkè•Üħş6cíéhÄy€íÄôܚ9Ğ6ĊñÚ}ÁĥË*à,ë0’ÎĈƒżÔċy fÄ †}ı­ĴF.…,ĥÓÒĤĠ4!k…°stmLğŬn‘,7MÓÂY·ˆ‡‘Ô‚3n$yÌñÄ> œsÈ)Ğ=—¸ tü9tŝğ4úׅÎ;€Ej5ĝàùZgġl[ġ-ê™RTt.„ç­ôÎ9ˆzìò\hÊ.IDŠTŒP£ż°µ 뺎‘ĉ˘ŽíbNğë:µ·‰y!Ĉ>·0‹ĝYá$Ë÷”\Pa0MQ­½w|½6Âë­Ġ ï;ô}§ĥ–^HĝDŸĜ7ġ‡ó’ܵ|%%M\ŝiœĥgĉgĈħ½›,H¨^àœG×yJô⸔3‡ˆ“Ï0 N}ogž;=OeánàTôEcÙÌöŜ!xKNcT× ï)ÙRsCñıN~^ŻXlİPlUäŠMdK·H1Ñ=ì( .Ğ8qŜ;‹ñ| ‹̓œ!çŬ\›‚—ż§‚žÏ‰İFSäàöŒNÜŬI1²1ğÀ$ÂħóÇ:½rö0Ï;Œ>çiA‹vıùhÇöuħ*.‹ù¤\ĥ×\w2Û]3‡~)„÷é—~)_—u×Û7uakûŝñàßùÂo~&Oé– îçsL?>N™µó0ĈĦd‹\*ĵFâĴ)xìl‡“ŝğŬïxçĝÒïŭîßżûo=ÄWżüżġW_ĈóÏ~>ôÁ?Žwżû"täLéP=£b=`ĵF%Z;[OµÈŜ?u-Žj‹×ġk·ÄfëÂs½µHmAĠâlŭŝĥ@=6˜mÑŽql·Žġ˜Ûqbs‰'ĥĤJ,Zov™jEĞğı¸ÜrvEŠsŽĝ° B8öÙġ›A>E^ĝ’‰xŸ7ë2qé…6óçÓˆ”"T= {YJ²Y=LïN†úΣTBĊNN‡›ĵógLE„ĉ’\c€Ò­0Z¸ƒuä™úèâ‘R†ŽZúqâÏċB‘ŠÊŠÄ3ŻħF-vğ ˆ˘ƒĥ%J”ZQñçédVXgà:‹žyÌÖY”ÉP ~îëj Ê9rk8pZÜn·ÓKŒ–Z°´×ï=Bà‹Ÿİ$%ŻéĥĜ“~c>hû]Švç:\<şPä.tAQ]ùŜ6•Ż=ÉKŽUQß5’šK†­„ĤĤRáŠĠÂ_PBk=’™é‚şÎVXí¨ bğßG=ı Ì-aĉ÷ÊûŒñúlÄ‘­Cß[‘‰CC›î6 ƒRSJ!şĦ”IBÙLÂÄفÄ}Yˆû ‚ë…w)Uı­Ĥ}ƒ~ǖ°‚Şz“Ŝ A”“ò[nŻÒ2´xßW]}OıêB£½-¤íĥÇL•ößy °Ë ż(܍J™ñR2" zÊó‹”PÄsɨéRËż”‚Îy Ŭ ql.*݈ô°–‚$ZĦtm%rĥFëûı_eñu•ûzñqÌĦ¨í ^o×Û75˘Ûnëo=]ž~úW/ŝ˙ħ/T 8ë'çü€éI 1dŜkQ ­–½ó8½y‚ÇżƒÛ·Ïx…N(ÜGñêĞwñÊ+ŻáÁƒ¸uë&vğP,¤q8ŒšŠ…Zš˘Ë\£-Á—Y$ċ”M.ïş¸Û˘´ÉW‹”³Ĉ”_Ú½ĉmxUDŽÇ+Ž%­kôî_‹T_ċǸF’Û˙‹Ġ”˜ç.íÎĜKû¸Ĥ–HµċÉOĥ6ȜaI˘µ–RÈ qöÔVQ 0˙²ĉ¤œ•SZ›6İEœóôğ˜Ĝ‡Ór„,‰NNvtJÍJ)²Ïm#‰½[8 ´N1E8ë a0QésVÂ=™T†Žükï#!WE{SÊŞà70*Ŝq֑ÇjÔşɋwè‰Ó*â7ù\Ħ_À€ĊZežxA¨P‹RëmN„8k,{ñÖKÖgÂS–b^ìċ¤HEfŽ­¤(ĴÁZ£T‡Êŝş­p+îîóúĵËŭ@E³WúA­TìIƒĝ8šÎt§Gf fàÙJ‚$–‰?™Ż5'YöÀi(…è•^GÎ@-™SŠhW\&˘”‘Ċ•ĝ´Ĉ€ĝŽ–'°ğa·8ÏÎ:nğÛwnG”RpzzŠïıŬµhÔ°VTk`œ…ċBĥïn”,-⠁ Ԓ. šŠ CŜġ¸Í%/ş ÔVïÜñÖNlÊÈ)˘,tDŸè4xa!×tĥŜ² ÍKÎ!ğK‹&çĤ)rü,…€Ìs™sVÓ×ÚáRŠsğ¸€Jr›…Š1S˜ŝÑE›ĊŽÌ6 )É֊ülSä–umÀñÈD]H)а´ĉûŜÁ{£atžĊÍĠh”´ótġÄVbˆSވ1cĵ·8ì'ÀXĝ`0MıRħ[A4àéÙÊRœ†Lˆg­P<>€‹^·âĥf.ĝ œ“ÎÄğ¸”Ë-Š7ĉ„°ÚÒ9Ä6Mhò0YÈù+ DXh.ûġZ7{*²[€,Rß3Y!çʉ‹ y‘bDNY%ĤÄî%‘vĴ^FAĝ¨˘9¨ĵPı ¤Ĵ5[.8kÀb+n~³à•¤MñyXPĥÄh‹ñż$êš˘~Ċüƒ§žzú:ò÷zûĉ§.lmúàŸˆ^˙Íßü˙È·Ĵu??MÜ{fŒGN#2ҜϞ+ ë vĦG×ïpûÎxâñwàË_ŝ2üċŻâîĞŻĦTàĊŸÇŭ_€Ż|ċ+ĝ‡>„w×áoRċ´Ĉ0ùêXé³uiљcԆ–"°ö×]żżpx‚´äħzħUT­ÈÚŭhKh·%üZ éÖï½ a^Ó(Öߓb¤–£Y­÷£50G¸i[4úœ’IŒVk]LP…mפ˜ĥ¤`ŒŞ…)µĦ, TP–×ĵĤ"”€8˘ßïqzv]RHá?MNOo° 킸= !aô œ^} êĜ½Ĥ"Mqj9†*)M|üÌÓ XQŠ$ÁÍ. tĵZm•…}Vn&ÊJ6hŽ.|ÏĊ,†KMšSKQlj¸ÄwÑá(Úħh‘l9]×Ġ(=fÌB€•ò[ŬB.´…ë11(B(k rJ˜&ĥäržŭL£:reÁw^i’dĠRl¤MmR ÏĊĠ&"¸ËŸ%ÔThÎ9Ę×À^Z”R[^PYĦ´b´ZŬñ”89Há™sĊ8Vġ€„2 OkaJ‚›QeĦ^d`Żá$Ĝ$Ŝœúąž\£”Ĵ˘ÇÒú—˙ í˘”YĠ<Že=g"ò‡ŠR2r"Z !àV{1N ĦzÄ8[•ÒŽ‡nä %dĥÑbŠ£›$€£ßu½Ç4²F…ÉÄá/zżÔùùfŞKĉ:ÏÔòĵóñ'`9feF:3 Ċ·–zÉ%`+t˘u%X# íÀÔzĥƒT[l9TŠójGÂ-ëeíşuµĉÜ ²w™7÷öŝ†m‘ğµŠ?F•XÊßÈwumíCûo”kĊħ‘´èû,Ç{J²$(ĈUka=µMm.ˆ…RtO9fLĦĥž‡;DR§‹#NgċJ„,†&îwŒ0]ßİ^XŒ”RRäTÎ]hüx‡ž•^?£=Vi‘Zċœ“ĜİcA9ä†jĵĊ‚9 `%j­Ċn·[L”­gNkœ˘ cÄjI-ĥ¤ĥ3á½G-sħ*ħÜ„X/'  0\Ԛ÷ÒipıÔ$ :·Î:}1VíÂÄ9ÀZ‡\ÈĥnĤmÏuŠQ‹Vë,‡MX36}ž¸>„`Ġ Ĵ pn8 ĠÁh1ûhœèÚ²s€„´!R0Öj°ë=àÉçUÎŻµS,j·E÷VU[i’ïĈ=Ħ—ğ]O²‰c ä)+'Yx֎à²"¸™mŝĴú˙ĈH‹Íó!Ŭ‘¤ıÒus ë3:V÷Ë 'ƒ”Ċ·ò˘%käĵ÷Tœg İúYĵQ\³DpǑĊh@ wˆŭ~!I9uŸa:äˆ\Ĝ{™í İ$~.6ĈċS7İ íĜşNä¤ßĤt¤ÍħġíìĈÖġï|ŝÑ£GŸ Ŝw¨Ï%ßÉ9T67ÄÍòCägšsA7œŬÀ;·qvû&rĦĵmS3ÎŜÇĞ/½Š·Ŝ|9ÜĵqÁİM•!Í>JfL–çb@i-\֔5²şU(ŻÛIíŞ|á£ğĠ^Z ÍÖázŜD[62RÀl%¸­ŬÖT‚cƒúX·ŠTâmB9µíá([z[hs5+O`ٗZƒ³Œ WDUƒ ¤pĦcQHUÄÈyKERMÈӄ'ä)"×ē Ĥqˆ0w7ĈHĵNSqcÁĦ°…ı"LÓ¤ŜĵÓ4)wĥáyÇĈöžÜڀ‘Z‰Ŝ#<Ĝ”’ĥú½'›­ëroBÓúzïáƒW:ILsÊYß÷Œ–Eœ½óxôèÑĝiM-c4X^ß÷=NNO´À/…âN%N€~çlW•fáĤ¸ „ُYFV­ïçRŒ##ûáÎÜN‰àŬï÷ä‘,‹žZı³ğBÑ–Ü *¨KDQËV;Ó4iJ_`Ş…d­Ÿs]pXs.Jm@#ik‘bşcĜçĥ¨³‚&ñùwŜ Fh*µtğà0Ċ„iŠÜÂ'ŞĊìVŒcRA)ŭ ]%ŝğW3R(èif璳0Ĉ!礉f}/Ž'„zÇ$œ÷9b8e˘Hq\›D4:?$F#q½W­Ğ,,ĉ˘Pŝ’+ğ.èâè'ÀyXLÓ¤ŬÈ í3óħ÷nħ–e×uĜXݽÏ9·êVuWuĠ͇š¤HÑ$M‘’HY‘•@OŒÀɇˆä#@" QÀŝ‰ì2…„‚â HˆaY˘È& ’J0‘ÄGÈĊá8zħĜìîfżĜŬUŬġ¸gï½^ù˜s½öşûd5„× IDAT”$Çĥ9(6Ğîıçì³s5ĉ˜c„a„ŸÎÈË=>Ż)’cKÎ >„²8_cn ÛÖġm­“V;3ÌġĵÀÊ;“Ğ n´ı+–Yž2-H>'×KQœMĥ1Ċğo~ó[~íçŝż>Ŭĥĵ†˙˙~öĠ/nĤq¤(ac~,„pJÌĊ†Ší˘µ=LJ0Œ{ĵöê·ñäÓßÄ7żñ4^}í Ä)a3ĥۋxÇÛ߁÷€Ŭœ# Y§‘Òm0ìarĤhXh$eH7–e€@GÖ˜4g‘Ö>²Ùv2 h´¤ù²юıĠ0‡úµmœpˊĠÖJ‡$ĞñJa ~Ñ-<ë…™;4ĵ·`(´*P³~Q,ŒÖóxtuĴ¤M_3ëkÑÊòìЍ†JK÷ ĉġ\ ë¨A´4ŭOàD‡.¸€A6 Ù$­°ízhGƒeÛŝ„YÇ-6½¤…9ô›M‰xí7ĥĤiö:€ğwï!#ßמĴ0Fâ^Cd=nï³çĞf 4·dMùwùŽ)Ll³Ĝir„ˆ ›mweVÏ)kҊM‰œ5ä PlĊĴQÓH:Ûíĥĵ§ĝ[÷}ÇĦĥ´€i¨pž—ŸÉßĊÂuZérJĵ°ÒŞì§Òs”ݰÂÛm‡ŭ~*í:Ħvt¨Cd0Şï;ŒÌĤJÌŻHCäšrߐ6yç4&ŸpvvŻ„atƒÜž46ûıȋl‡œ…âêqvĥÇn'މ“Ŭf× zܽ;0%ߣNÄJĞßDê ,‘½5Q E °é%mĴGğŽHI7fŻ`cPBD[\KRDÊwڐìlûè÷xn)’Oï0ŒċÚ—ŒÚEĦÄB³Ÿ°Í2<×÷Ĥû0˘Â$kˆLçönĤÎ}ö8……†‘‡3~ö?óê­[·˜rĥÎı)§tĠß#Ç2yĵ°ÊùÚu›CWŻàôÂEbÙ"µ†ŭ·n½çġbŒĜl6ĜíĥPFc)ÖÔY‡³d'23‘‹@×9ö{$-R ½È xÁS˙Jħaé‡Kà3/€éĵ˘–bsŜK÷ÁZ˜Cëá[V Nkp\ĜQD˜?ĝWó:áĥŭU³…äÓ\è³JžzXzĥĴġĦ´j× (ûÈKóò6VùP[PŽ“e­Ğµ–5”àïO,V€ĠP*QQ>"lıˆ™1ËĊ˙3 ĝÀß[#f ï3³zÔ~î,d&^„(öè”kÇ9W=´Ş‰|˘ĞÑw³Áä[ëş84Ȱ™RzöevZĵ”VĊ‰À9WXċrÊ5f Ĵ#Wk:îĊĝ^˜²êÁ)şdô€ÇğŬކ/S*:ß™Š9PB)…ëôcòÎ9ĝ),dâ,AZÖÄ ”Ż }IyváÈMÈKZôˆ ”ÜG!û÷}‡ÍĈ°&u^Ê{b˜ĤPħëŞO@cşìY|™rÎëĞħ†K…³úâĠ^ÜOÖÈlġ\C-=Ğke›RWKZ˙ñĥŜĠɚµE-O8$—Xë ĥÏ4”žŸŜOG@s܎@÷~Ûü•ö^ŭò—ŝ·O†_0Ĉü¨sîb §uÛsdóŝívKvcŠ.×]éé)~ĝ!Üxúñë¸s{À;÷ä“_ÇK/ˆï~÷ÓĝŜïŭ0~Ó£Ê@ċŒÎpË=@*˘†|9ó¤§%y:ĞÎkjm\Żš–]ıkWtĦ­äáPëİ#­k]ĵˆUj÷žĥ=\‹üìËXµ½k×IŞšS—ÜŞ%Ú̄s…µ8)4ßMI|HĥȤu*lNÁìc.öhĈ°Ż"P2 `Èù`šFŒT€“vÄ´M#=HĥèÍf`EÇè”-!$ċ3ĊÚƒ¤ĉs5y·ç9ħÔB`ÀĤ)üÁdÒÚփD‹›žÙ­Lµ`™Ż1Ù/9†§§§PЏ´Ò9°tÇ /Y?yĤRĜl6$ŻĤh™— ö YeÄ@mÂ6·vÖZœŬ;+C}òŬÈ+×Ñ=ŬÜgĉ\$ùr(úqê%NKÈF‰q֝S/D ÙşĠL X‰&Vr^ŜĈ¨ÔÄêNT1 ˆµEސ pOEë,ĥZµĞµ…5 “Hĝsh7ƒ^ĝ´H_÷İĵg€L2 §YŠ`ÉQˆÍYB žċ7•‡Âh+m*™’KUlhñÜ tF!h Ÿ3i’ċz@&IÉ8ĊĦ$ĈˆÂ䣤žQHIˆRŽqbĈ|™5½ĤÍmkv-ÓŞ`5³[wuڅ{ ~ëĦÉvá[wêZXÏ_´Ï)ùù9³Ĵĵ P JİëÛíĉ‰ż˙÷á(]8nGF÷³½ç=ï(áŻ}ċż !^Ê)ŝœò‘Ż$ı#M›Á41ë9ĝ4!§ŒË<€Ë<€7½éQ\~àÜxĉYĵöÚë¸ŭúˆW^}_ûÚĝ?ü=ü›?ò£ĝŽGŻáòƒ§HQaòÖhXÛ Ş„Éĥ-‹ĊKÖÂŜoŬÊŝ¸ÛĦykËĠĤ›ú q|¨ßcísî7Ìĥöħğ:ÏÖħjİŬOf!ûUĜ<5Ë ZFığkCk Z†dˆ‰lKÍ žĵ!JÓ²ÌùċàMùg$hœŬ#&Uk8cKTïfÓĜXyŝ:NğÛ?m£sh^ċácĥÛ"D?[—\ÒÄÑ£™ÛŞÖ$z)­à8ò·m·j­Œ=VʔÀUŽ£ž]+„UŬl6$à…F­ÑuÎaš<Ĵ5!˘ï;²†ŞÒĞrÊ Dk9‹YZ£MĊ$/ğğŬ|–1ş ‘,†bpğŽlıöû0˘ïğâxQğqÔ-]ÎîME\[ä°Ùôˆ1abIËë:­€aô|uñ”5Vp) mJ™akUZülî–ÌŬ(ó⠛3-˜”–a+Ҁ/;ŞV Ĉûŭr˜F!&]É,,'Ċeé°eˆmöó–9”!Ìċ}Ĵ÷9Ħĝ“,e_"Uë´-í%–Q˜Â.Ó9›]Áĵ€ĥ¤ËĠš:7”ú†2ËAž4!„‰œŠd!V‰>Bu.p?úïk~% ĥġ î!€{¨‹XwĈÖöuÙYĞ‘ġóì`xf)“Ò ÓtœC;nGF÷Oĵ}úӏ§Ç˙ìÙOŝď˙ï1Ċ›]g´ÒxSŠİÏYÁXWŠyJŠŭ=7@RHQáôô|A²ŬVd֑@—‚FàVm Œâ˘ Q,—ÈĉjÖ'ç”aœ)Y‰ĜYĦfnêïMhËĦ7aĦ*ßN£Ħéàç§AÀ#é½ĴµĜï÷çlá$RX,Ĉä˘Ĝn7dنŒsI³Öû1a×ċ˘4ĈéÙdٙċ#ݍ"iÁzÎ}ßq’U,‘ğ-y#Ë"gÎta-ƒ%.PĊĥMXĜ9Ê6‚ôĝ™YF”–nˆİ h™Š%W‚Zk,ħµ9]G9Ħb÷äŸÁ*IDżK %Q–´Oà\şFÏĊËZ,†ĠàNDKe€Lsx*4!lÍgÓ\KÀŸU@t­"U ¤ a½%û›K\ğŞÒßHړ³ÙFÍ݈ĵ0†5ğ,-á´hXE FıíC }§‰ej$ıIGsBòs²„PRbNC]ržm)ëŽWí?=ËdÌ˘n·Ŭ5â£;tïGŒ´ï]×ŭV‚V×Ĉz˜íĜ½_PEJ Jtá9@k}Ŭ8óÄ/ŭ⧏Œîq;Ŭ19çĤ}ìżĝżoŬzíçœ{ëÜĊœp)ÄdSâV¨Ĥ! *Ĝ–:×á… ¸zġ .?x‰ĵ(€iB[zÖ(ħOE`˙Qg]‰µÓÎR8Bßġ…M5†tìûŭ0hÓ4y‚°ż1Ċ0‹—oHžĵ}‘@4>È9‰İkbu‰–cײK2\&߃œ%"ħd–mĜÒ>]Ò_Gô½+à!ÄP=úÎsPasiñ°Oıòe·p[_Zġrl„E§Ä:ZtȘ\48˜KPDŒJNsœıµß;`œèÚÚí,kcq"/ċŽÙï6È! ˘sĤĵ>Ĉˆ#íğ€ÄÎh^ˆ£C×i– „yqXûQât1ßW3 Ö\vĈèâ›kYŻ騷ێÚĝ˜Ùbñ²ż­ËŠ÷İhÈŭäɖPKÍÊe (ÎZk¸Ž<ŭäːÉ)¨Nwšċ™ë´"€;Mä‘SÂ0ކByĉúi¤áâ$B!1zî Öéú#ğ6 Vw„j [KVځ6œĦM6;ÜsÈİĤuRh?ğí%k‰j-ñ >è‘€QOüò§?ŬĥÄ ÇC'ßú•ßÚŜ½wï}ğŬîoú˙]cÜİ´K…Mò<D>ħ¤İRšZU·ożŽgž{ żû˙ünŜ|Żż~)ktv‡·í;ñŝAĵù;߆íĥƒ58›ѕNq+Û‹Ħ“v-&ûuĦAi£%öĴ0Ş×JëŞfuMÉ֞ğ-H­Wòk=‡d ŽÚĠ|ĵ&ŸÑ`ʙLÑS^9iq|֊n­˙ÓZ³­=<Ĥi, h…ÀòĦ#”ÒÊÁĦhÔÚ2™Ŭ,ċ¤–PHJ š'Û)‰Žq×w°š4Ğ]ד½—íÑu] b°Ĉ@–Q=:§K‚Sä‡ĝíÛg¸pa‡qô /Y°–'ċ„ív‹q‹V–@—*­aË1á>¸5ĥü˙Ĵq“/ÊTU’ŝÄíJ­tIIğŭĈíÔ:‡”:G÷äŬğwá:G̲&W‚Î9„HqŞ]×W2„ëC@ˆâ‚fH53…aœâÙ[taÖ`³ħ<ĝ$EuœDî*EµJil·=BH%y‹Àmf öü,Ë'ŒÓÈ ·Hîgct ôżÛÍF—ĜÜ:ZW)×jÚĊè:–½s%C9wïŽÌl/ïu ˜ÈEğšÓċ+6óž||òŻ–ğĵ§Ĥŭc™-^äŭÇqĞ›ŭÌ>K=3zÏ^46ŭ~âĦO…íÖ",œ'j?ŜívfÑ 7ŬÇĝŠôƒd¤#‡ĦŞ_½;Ĉ~’!Ş\Gŝ4L£çáXŞ!™Ï3ŝÈAŬ5Ùv¨ÖĵmCbċ×|ÚÏn%lRÏä}ê×Ġƒúµµċb˙ĝ>Ièğŝ×u§~ì#ß˙C·#£û˙qû̟ ÷çîĊ[7oŝvÖÙĉ”'côUt_@KB< •‘³´Ġ 6›.^ÂC?k8Ô !ĵòÊkxúĈÓ¸óĈë8ıx›Í††Ĥh”˘ĝ˜şŜ!ú°`5ۆġöı*šĥĠ^³¨­Ŝw-AĴ]á×LAí͸Ĉpk i›ò& µf,ꁈ\³Ä•ë!{´C‰–}ˆ9•ħ´é8Ñq4jܲH€+VV²X899Yíĵt_’H£KÉGÒ֎ì;ŞäğA€˘hl­›‡Ĝƒ3çĉ)Ì{ŠœÊeáLħ̅ġ¤ŭœ<í˙f³Aç8"˜YK­tù\ wžük°ëìm<vÛYÚu pŽä”@“í )ÏÎ Îkc|dJ‘"´Y¸;C_>¤H ¨˙ÎuĜl{X£˜5ŒP@  ½`™R;#ûn˜}´ċş†‰Rµ| P˜f™ éiiitûνYÍzâ˘½0fnĤqâsgŠ7²‚*2 ÒDS­œB&’jÙë"µZ—$‘÷Ğ‚ÈHî°ôa%i‹X£)eĜGW›îGĊzżÄ,7ÉŞhh-ŸÁò̞ğKÛ/”÷#;³ş/šc ÑßĞJhDİìYBBßX'L0Ĝ#ÚÂ]dMKׂ†sì+š\Jzç°’ñH Ŭwt-ŽÓÄCŜŜCĵ3‡Ñ¤HRŒFÊÓäûr>#ġ̞УġùĴgîÇŻÉ Ö$g­µX+hƒ*ҁâvžP°ŽÔ݁-ˌ”JB›Òú9¨üż|ĉӟ=ŬĥĜŽh˙‚Û[żóğ2€›żû{˙ô“7oŜĵäqkşCΏĤ MÚ=O/'Ä Ħ51 /\Áv{^şŠ/_ĈÏà…—^Âë·nöWÏ˙ù^zé|àCߋwóŬ¸xé”4 ƒqħÛô˜ö€†ui)A-/q0XcIk 2{~…ˆ´ ĝÛvÓi$0½BÈĥÌî!‹™öu-mĊÚ($˜C’yRÊS8ÈDߏ}>ÏZ$$hh,–„•TĈUˆçÒä (M˜â–ŬĤ˙vċ3ċ5‘µ|˘› 1ÀŞ kR ÎÇÂ&nƒĞbQ”R‚B-œ„ŭ~ív‹Í†@xwŠœàY{JÔĦ').vÛĜ%%(„àààÎÙ3 ç…+~1F„˜…ìpvv†”—‘ÀâA›CHêHċcIAĞÁĴ·CY\ĝ) ë{Œe4ĵtĜl6…=óž˜ñ”bI_lj­ĊÀÌÚßTÏyğ°9dCÊġ’Šċ˜R9)L>Ħïğ”³ÑĊÂĠT˘™\Ħ TWìÁĆ ‘ÒÙdĝ*†À |ŬÒO |M…R.·<ŒĤĊcÍlÖl­s 9Ĉ‰_³.ïo0Ž~îLˆA˜äZĤ˜mÉÊ=š]ÑünzÇ3 t~ˆıĤc5 #Nv=ŒAY”=¨Ùş,–Ċ¤|g9Ĉ’·ŬZhˆ\£Ĵ Ë~…<3ı³\Ħëé|Üıs‡ß›X÷‰ÈSÀ‹Ä#"{äĉĦ@]¨˜('óĵ9-Öµjw’5{žV Iƒ,ŞÊ°ĉŠċäšLmMëÛÖŝ(Ż%oÉâ֞âkàĦ;sNż£”ÎG”r܎@÷_Òö÷~Èxġ+_ŭ­OŽĝ;êß7F˙HNù4¤DÖc‹`7ŻŽUÓÓKĝÀo~ó[pŭë_ÇSÏŜÀë·ŜÀ­7îà™gžĈ+·nâßĝ>ĝÁïcïx;r²N é-uï Ü"‹)ÁX ‘öq;e[#Tò\gµóW}´²­‚ÇCÉ9Ċµ‰n Y;ĵ`w1Ġĵµ[û.ġ!)Ĉ!)Eŭ>F‘Œ ĝôêó aébk9F êéç5ĤĵèèĴ)SĝˆXfäÌa~ŞÜĜ@6cò@“ñìԎuş*W†œGn›Íâ~$p£ġܞŬ:”µú<’œ"œ3œ—x\ÙşC`§‰œ2Ĥ@À’bŒm‰Á nÍüÔ­OazkË9kŞhŬɗï1‡yÔ2րĈèùo6=ĤqÂY@YHû_"ptÒ  û°Î‘Êı\+ZÈM)˘ë{Èĉ˘Ĥï§Ù'yBߓ›CżéĜžjiË%À2gòM)C9˘·ĝH kM×t‡eİJ`ùCßY’,h ³ä@˜mımĉ8ë\…İ ZT^Á"!b´–c•”GÔĊí@€™RÊÑñ9™N˜xk”£xd‰ïuN‚2D£Nҋi˘ßSzŽŭo_ôŜÏ ­èż²ÈƒâHßrÏÏßSd"òIŽ.1äHĞċgİTgc4Ĉqëĉyч‡€”tÑŻĠżĥµ`ĥŭ÷5OáCìm™Q¨lŬÖȁûŭî8żŸkDkWĤµ. AúŒô)Ç/ċéŸ8ê·£tá_ööĝg>7}âgĉnżqûġ>ë줵޵é•RÙr[ΰ­’Ö4(•sĈÉÉ_ğ†K—/û 8˘ë-†ŭ=<˙â˸qö÷îáôô"ĥ›ĵĐRBVšĜ„œĦ²Ìlz\™ĊPôà¸Ïĵˆ$­= ˊ=³ïĞ™½_ëÂÖĤе,i  §ĠEúÜä­ĤĜ`#ğkñŭĜ†öOíx°ĉ ûµ0PgÀ„ÍË!mÎÉ*¤ŭĥö84Q˙ûB.’+ïb < £4RÈpFj]ĵi­Ÿ•BÌ>ĝàĊŜÌh(­ħb•­Áä´Ħ&§hrŝÎŜc×ô†bNCBñĞŬívFO0&xÓ3ÈĤݜ2·ġUÑLK[żĜ™ċÙÖ)çLïŸÓâ|•p ĦŬ8b›Ĥ3E×ĞxˆËŭdZLÑġ`;Ov IDAT”!Cea—pŽÓĵKĈ10cĞŞ Ímn°ĥ×!ÇX%Àİ ƒj­Á~?òw$M˜`•Їâx°Ž}`çKE-"ëÖħ¤•µ˙.í|şìyŭğLë-à# nÉÂÍI-Їĵ k]MÑ˙—K•%Β?³Ñâ~çï ŸK§kÁôÊı’}Ĥó@ßÍYĴ`Šî!·ÔFsô.iféüşNìÜ2uq]pVşÎ­˘è^­h‘—ĊBŒĦ)i°ùsSĈ8Ž8۟‘‡z˘a²É³/t/rF R t_&ò2Î90ëžÏ-èĉ&ĠĦÓù²e,üLÔI{­Ĵa­^ĥ Tjûš£ÏIħFœĴĠîÔb‘ŜRT\BzġÚ×ŝç˙ĉïŝ·Ç´vdt˙Ulïú÷FŻŭ“˙˟ĵsçìRżÙ|ÌûéŻxğQŬ†…(²QnîĴí#=ĝ{ûcxä‘kĝú“ßÄïŭîï˘ŭ6ÎÎFĝ8âk˙äĞxòÉ'ñW~ñž÷ĵZQÁ€İµ£üö@SäÖÚ2•şV`êögëÍx0i‡íîËĝV9êk[-YP+>şmá^8%àĵ-ÎÚgµ´5vàP!IU2Ò'“ö´Tĉ,p;€%2„:/~m¸cíû0Ì`Êy›Ĵ”tBŽîJl)³•”şĦ´RïáS(׋sŽ4‚™|C…Ħ6’X' ^ĞÁò˙™Š}Ûû)nv•‡g\²ħ5ğ/mí‰ÓĦœ£Áħq‘Ñw³ €ĝŜj£a ٌÉ9²Ö"šf—!²ív[ŽŬ4ÍÌşµ]ÜJ<äFRÍĥR4 €·Ĉ˘sà´dìÉKq·,]3ÓˆIó@•*m}a™…Á”îLçt}żAä÷1W:Û\ô§u‘Xԃc€Ĉ0ĝâ#ìœ* d1Öá%àtA:ÎSÂbpnNLӋ€‰T–ÏĴ#İĥh#˘ÌžZ]˜i,sೄ!g:~š5Âäĝ ìi̅<çs¨ `VUlp;Ü]Cû½Çnçàœ*Á˘ıŽ1–]§àD˘P•ğİ Èü݃j@˜râĽ=l^’- ”_[/%‡µ`t­ŭ´‹íûıŬÔ˙.ĵuBfğ­Ž÷ċbۉĞğDmŸŬ%TİJ)­ĦÜÑK÷¸#÷އà_ŬöĊßü­6ĉû‡aĝİ3˙Ž6úTÚ ĴEÌĤ´Q•a/\dÜŬßÁ͛$[ĝĉ7oàÛ/żJѝÙÁ™-Ŝò–·â#ùĵííoEדf:ádGk~ĵ·?V5Vcbc OĈVƒÑsYèiİA”Ş?÷eÑ^ŒK+šÙC@ݘĤP8mÏò´ ½-Ö5,’ĥġ×ZÛ烎l´f} +_?D"?ÀÛÉârxZXğžgZ=FµK…Özá&Yħ­\ù7À‰]Ê)'LIJ…@+zVÍr r°”ĉĠ“#AçHSKî@ô Ûí >R:6ÊÏ8;ó,‡HĊvLk3ƒôjĦ&ßY"|­ħˆ‰ZşÊ HêóB -í~:ÇN Ț½@ġBëêœ~ż/rŠ˜bIg£` jÓ{ïK†µ~Bˆ8ÙġF_Ür"&Ü{_B#D6!’ƒĉ–ĵ8+ÔĴ‹ŬïÇ! ‘\]ÜB‡ŭĵàħfÓ%…+ ßXNœAĞ8?„*c^ôJüî ŝ)2yv°–¤+4ì5·ĝĊVléä’Ë{K0ƒµšé3jmuÍäşjH̘v8„´he–ċ¸Í:kññ°Š“W_£<çLŸE‹ûY—ÛÊEÎÎBİ!8aLŜÏA'V-ÀŻ÷#ROkOFğHĞîċœµµ$íDĦĥlëĞԔşĈÜOcےÂ6ËÀ]½u7% ÖZ‚e¨ġeŽtOkËì<}á]ïz÷Gßtí-G´{܎҅Ûg?˙9˙·~úo=7ÓoÉBaŠÑ_U*ġ1G.Ödĝ”21 Ú(ôÛ-:gñÈ£àôô½uĈ=2gÜûċo™gnàîí;89ÙâÁ˗ıí ’‚Ñ9‰Ĵ 0àÈa£5BJV`J¸€´‘ÁJ+¤’ÊçڂzÈğ W8ÔÒ*Ċç /ÔBRPaÔÌò!g‡şġ·ĈĤÖEXZúe߸UMz;j+LÈ3˜8äU,qÏôÙùà0G­ó <}mĊ‰#OmSœİ^˜ħl’$ĉĜ "zöž}£"³3Ö>ĝ…Žx=[˜Ñ$ıV–ƒ& ÈŜÉ9E Y °Î`žX7ĴeNƒ¤Ÿ§ħ¸8 À€şcŭ39ˆÎ²eâsÎl¤O@xğéà§0·4s†µ˙À¸9ÍêëÊyDŽúÚ—‡iœf‚”ÌFƒŬä<Íö|Ĥxµ–qHò›bËĞMï0Žt<$°À9‹a V·ĉĽ5_“µì-ĝ-Ç(‘Ĵ5Bô×/]şôÄßû{˙Qşp܎ŒîżîíĞ_ŭ²†á’³ú)ĈŸˆ)RħwĴ-€XµÎyo‰…yġċ—ñôsÏàÙ§žÁK/żŒ³³û³ H}ëÛĦ}ïxç;qñtGJôş è,GÌú‘ɀœër‚]°.*S‹ufR…5MÈşf~mù˙ ùCI–2‹üß9[Tq]àup%™&҂q ĜbñĈ­ìKÍÎÄêÖ,ŻHŒöûÄĥŒ´ßâmë=1µrŠ?nYi9 ×9I„K̨Ĥ˘Żĥ†>“Ĝzz­³sEô}À8[.ßu?Qôġ4‘ĞBš&ŝNžPHD„cŠ€JĠY Ġš­•ZRûp·R'­5&Ŝ‘NĠ!$òŝ ëYà#:î#5XÌ.Tu¸ġÀ=4„ÜZĦµ€W^WïŻÈÂrĤE"rĝ£>úÑïz×{Œîq;Ŭ?­í+_ŝÍË9çż à#9Ğï§ts ĞgĦuµê݊£Ç0îñҋ/áɧŽçŸyß~í&6¸uó6'[|÷ğżĝñĜÛƒqŽ ĵCÌÚ²í"Ĵ6Ö§€œ("Wk‹y‚YĈ”ŞÚêzن²İÒ³“ƒäZŝPƒıš5ğŸ˘^yŭĦp‹µ  )²­ü˘}h´Cq³&QG5P*ÀRöÔhAp­×k x àë‡Ûš>·~èD³Œ”ÏE|ĥyò)Ñ"%§Œ(–À ™tı9-K‚ )èÒîïş›MëĦğ}×#ċ€“Ŭ„ì,ħ`·Ñċ;ƒµĜΐjû+ı@'';ŒÄ>­Ĥü\ä=,Ŝ”rqzş-€Htċİœg:wÄ wJq"Z,mĉëË{ÊUŜDkì:Òw xP,`xìv;ÁІÚ|Ÿ”˘ àŬZiòĊ>+FÒÚî÷‰½\é8 ux4‡XÔÁ ˘V@‹>ZÎ%°ßlXÚ  ¤%YٍĦ–xX³DZ0ż Ğ0=ƒbùŻR‘ÔÀş•. À‘ßĉXuħ7‹ĠžeF7T1ĵ¤EL@™œ2ĥ[ cİÍİxqVs4ˆFn0@[Jĝ›ĵç`şvöû=ö6Ö!ċ ï9"‡s5¤ÖĞ×µ§•´Ìĉ˘…_Ċ˜×‹ĝúĝ­ÔL·àS$ ħŠƒÁh r˙8@·ŭî­WŜómÚZW‡>g*@÷‘GùèğŜŭ#=nGéŸÖöĝŸ~ú§˙ó/ŬÛ˙ZJÉ:çĤ”ÂUTOJ%néĊ2Á^‘_şt W<„ŬÉšŠßßCÖ4ÑûÊĞŻàù^ÄŬ;wħÛnpġ‡aµáĝ[˘ó$Ÿ~Ž/e€*“Ğ ŜY( Ô<ñĦ2˙X+ċıy,mzÏMŭÖĊpMÒ²—5X­ kŭš–µ”×ĥFꭃƒ<ÖĜŠ,ÀE·eZÛB]ïûŬZpzH[Wüµ–bû ÒZÏÇı9Ö%Z¸‰kÎâĴ!żŸùĵ@QĜ…GüÎçqš&„ò8Ħ”)×NâkÉ9‡˜2ĵ0Eâö´yµâ‚ƒ;1{œAáÁJúX^Dh̓ifpL~˘EŒè7]‰ĈötˆöÌ\ePX}g”Á;k‡ä ¨˘Ġ%}ñ úËġĤf-ŞÖ–%†%ԊċúŻfÀ8’픵Îjì÷#ğ§DöPÍEJyÁvÎa&@™’E g ż—áƒ+ 7óç{I^ÙFS‚XbéfCkÒŝ7ĈÀXÒĥn;E TbÈ`Ê xĦ§Y³I>Sb°ëkUÍc|Ĵ•Ĥ),$˜BŽ­µ}oÊÂ(&úÜì(Ħ”H†DRÄ~ÀŠş b–ÉN£°ħ2$×÷´H’ïŞxèÌ'àlH}DH 1“ĴÁÖż+ErïĈ1ĝıûƒ„p#E$Ĝ$­2Ħíl@[/ĠıŽGZu”iŬ5¤ĠCq-{ÜÖèµş\ו6Ħ%Ĵ“nU’‹µnU[ĞëgBۑ˙$€Fáúv·{âüƒ_bÎpŭÉŻë_żŽożò Ĥ!àî~D =ö|Ï÷|ïß÷P,1ş9mMêĈ$çUzR‹ ‰z ˆ Ĉ fıġ€ZqPXmá×,ÍZq[ctk=o=LSӚıh½t—&ëz• ^ópĴ‹ê£ÑŝîÚ ]@ħֆk޵Œµï–s†²5ÔÂĊ@XHafŠ,ƒµŞ2h•£.Ž )'d6‰1•Xߢ+e÷£ 6ŭ–B6”ÒĜìXl¨ŜuĈ`ÛéÙw´ÚĉĦİqĴ#ÄìNܖĥÖ`šĤbE&rj_R›\†ĵÎÎ(]Ĵï7Ċïvò›M 6çhÜÀšĜ”"é`™•{9[âa… ­ctċš/QǕB­„Ġì:UĜe‘…Ôħğt½ÍrÂ\Ëß ˜ “šÑ÷ ·oS uS–lyvEĦ(Ħ-¤ÂĜkm‹­ìwŭ3aOì VĞCdÀnšˆ…ï{M²•N•Ħ.̓`İεL†Ù„y­ŭgòYvŽXÔg“³•V8gáI5R‰ŭžż]ż5kĴpÂf{âżk,I@ŒEħr&WœKRJĊ#Ùû8Áû‰<‘ A cq+‰!@!-jV=ĴÛ²¤u'ëL`­#ÖÖ¤5ıWÛµiêí{·àtá"ħRëúı–×ĉ2Ú÷Ğ­ÛçG[Eş`tú—ĝèûŝò÷Ŭ6wƒŽ‡àOoû7~è‡=€Wżü•ßüıiÏúM˙cŬ÷‡NS"-Ħç( (ƒ"M×cğíž÷ĵ^ıˆ§žz߸ŝBœ`6=ŭòóĝġ/<‹gž|à{Îw ĈJM#ËAzhXô/‹­â‡; ° 9^53s ”âŞĝw(Ç'ŻËĥ ×…|mşöPhDŭ>mñÁm ë{H/Û>lŜĴ+ŒD›ävż‰Ö ³mŬï÷=°rÊ3ëóC'ċÁÄŝı:0†Vbì4ûŻĞ ´ffŽÀQĥäċšbBöÚ9 €Ñ`Óo6d´_ĴŽ}gáĴĝüΤżĝîĤ”ħÙhĝ 7§İ8Ÿ{‰!€SÄ~?ÂZƒ .,@cˆSÑY·Gò_ïÇ24ÓüğŠëôğ"·(mùÙĵ?„@çÀZXCCS˘wuÄz’"hÜı31êfK,­’ĉ6HĉûáîŬĜžfyÁ“Tiëş0ğ”`&ß#Dòȝb˘T6mz™`Zk[\ĝ–ÍĞÄ ŻÈêġ"aKÈûv ‚Ĵµ€×Kŝ´û=i†ğNħFy‚¨mÔĉó‹l­.%ŽIà6vŝŬ-KϽ$İiàîĥ?Ӛ£¨éŜò!cœö¤Ï3 €Ħ3Sfï2z Ïĉˆ-¨lÓÁ$ğí0Ġv„RÚT]SWğ@8lVï˚”Ş&êÏjS×ŜCğHŻ‘ġû.C3Rq !wÉ³"ŽÛQşgRÎ7ŝĉöaM+ŬcúœñÀ8NN’’ Ш4Ĵtµŭ0`ğëpáâ<|ġ.^<%b1 {¤‹/à_Ĉ½{wqáÂE\¸p’²’Bߑ}…Fi´ÑU² ˜•ñÍç qÍFÙk­ĥEßRĠZ²ĥuVkh×½ZXŭóµA·Lĥfí-Ó:[W­Ë ًĠ­ĊµiCј-’‘‹qzûĴwLħ$qdàhVfʕÚüdżN!0ÛG׀â˜Ù˜Â4˜èĈq„¨Ê§‰ÒÌ|< „HNJ!!²Šd ½S0,•ĈđÙggg¸xqë§tI(Á|ŝú'Z2´ÖUĦ Äĵ…9,#ċLÀ|ĥ"ƒRä"ÁŒ8Ŭ{lË%מħt)‰wUpÀfc1M$í Ï–ğ°ĥ4p–ŠÓ<,:'£ÑwûŭD §9‚7UV~3ë*È1ĉâNàĴ†s’âÇn…6%%ğ€ĞíÖÀ9q' d|½ĉ çˆu§ YX‘4e”ĉtD¤ĈÎ\J‰ š*€Uñy$àMà,4;B Ĝ„#J@Vä"cH‰o˘µ7…I”0ÚEjĴŒ›İ˘Í%|rM!bò##B˜Ĥ>L€8½ˆÉÏ 4§s ÑöoáĦÖ}]CBIá[ñmëd++hkMû9‡l[ }h!ÙÖŬ56¸‡êg]}ĴêAß6ˆG>ĝÜ]×J=ñ˟~ü(]8nG ûgmûċO=ž>÷Ù_9ûÉ˙ñ/û鷕֧ÎÙw({)@}ߓfÒ{h£qr²#V+ğŬ ^½ŠË§—`´Â4 ÄÀĉˆ{wïà…^Àóßz!\ıò0N.\Â0RúŽ‚Xl%$d$D(d(£˘f“vU†‰”Ê€&=iCÍj>.טϵâß~-Íl ä֟UkÔêJ›ĤÖjkk}ÜKÑĥ[yĈ! Ÿµô³µ}_³l[{ÀKŞV‡UêᵘePN›1dħAÎ:>§‰êҙbƒµTOW°żj†ÎZ û=ħ¸FSÊS"V×§HúÚĴR¤‰zkœ°„ĵÄ='h9°^ĥ/šßiQ•S.‘¨bù%iVò½Éó•@ñfÓèĞÙsI\K™ TiŬK˜D RJeà‹@,'ògĠ ^ÁMħ-Ól½9ÖĜûĴŽğ+sìr֜` ‘ŜkGt}p žĉd4­qĠD;Èh@­î˜ĜÔ"qH¤Y!ñ`é}Ue7Fżw^)Ÿu\Ĵ™ÒÂ"sħ$Ċñ˘e—<}3 ‚ĊYĜŻ`´âùŠ/]€1­LG˜Èş½a^çŸÉŝ9Í×{_o³ìC+r'!‚yHÌO†Ácš$ë½µ°ˆÚİ ŝyËàÖà´ÒµĤv x ÷­&ZWšĥ>Ö |ísÚşŬŜW‡.-Ĝ×êÛ˘“gÔġ¤òĉsG {܎@÷Ï,ğûÙυŸŭÙżóêí;·ż¨”²)a2Ĉ\M)ġ³€òéÇqÏV<Ğ §OñÈ£oÂéé ´&€1Œ{Üşùġü‹¸uó&Œ5¸xñÖ“Ğ4yH*‰I4lĝ_Lš|çádm9öóĵOc=ìU³§­4ĦfWYÙÔEô~À·‰5#ÛÙîȞkÍ­íĥ×ûtˆ-i™ê5Öù~ùîµ]Xû@‘^ğŸí°ß‚ÑÖÖ֗’g„]Sù˙[˜#pU’áôÌ[g"Ogƒ§™Ù†‰=Ħùħô!²µSJIĜµÂ~ù‰ì²²B›màiÌh`=RL8ıÁ9l‰uĊ|äY›J×pñ³U }ßñ>_£Ä›¤É‚ Ü"Għ #ƒüÄħĥ1eL“§öş3ì{á}D™ÚòbXKZì'…g–tşŽ4ħ`ħWšŬrIn#ŽÒ•kGaşLŽS"€ÊŻí:iJˆ1`³‘÷ú~NPsކŜ4ğ0c Ż keލ†‰}„Í̖gUXÙ+É^ı=o)Ċ'w}p1Ĥ"Á!/eú}ñŬÖX¤)e„À‹ĝLá&ò]iQ"Gö/ażßcšĤj‘ tû ˆ‘½ĤÉ6‘j.…µ(v8ohŒ€EğŒÒ;§Ċo\WÖĜ6hf֎Ğûş7ԀşN9kÁġZ­­c„[YD+k%Uò=Ûĥ&k¨‰X£Ġza’×ehë ê‰Ç˙üè·ıÁŸŬík_ûš›Ĥŭ%Ô'üDÎù”ÌħY…Hïh £§ġ8bżßĈĝŭßûCĵöêMœ¸{6 FàŻâ/½÷}ĝ}W\A·ħÜÖ ‘2àÉT³mN.ĤċT '.@Ŭ95ò~Ty K‘­[\÷s[8—FÖ¤óÔò‚6J·MGĞ"ġXkóuèĦQïOëûĜ²­mZ˘òÑĴ?ĞhY<UcT½‡VsşšUzUşs*šUKİòމ’|´1ċg›ÍIÙ/k-´²¸pá/^&Ŭg˜ •ĈvğEżéħíl‰[ít€†ÈNkğĠÜ*§Ħ'ÑäZkáyĥĉ”Ğ!2GĦ@ĦJìâ~żç˜cTĞ­ËèÚ2èœ.v_tí 6zNò’aħÙq€4¸0`³Ù”4¸úúpÎK,ŸÎÓ4ŸŠ˘ċè[ Üğ'İ”È}g‹Wïn·[ÄL‹Ŝ–Ŝ‹ŞîQÊZm=&ž¸1SZ'˜ÉgIÌußweŸ s“OĊ÷VlÉ$ÒW)íV—!Ú˘LĴÒBXZ‘ġ½Â4ħnzòĜtG^L8U$⢠u½xDY8l;àl¤×ô=9Jl:J;:ĉێ]2à0yÀ²”bżş8›ÈWÌĉĦ3_%%Äir`níáíÏĈÚ}‹X´ìëúW“Ö ħ^ÌŻ% ŞíkjëĈC´kÉfíP˜€ÜÚ£·eh— ß,’ ċµµ$AĠzŸĝÖäÉ\SİŜ$„/m>úWèGŽhÇít˙Äj*^3Ĝ›+ÖÑwë/çkĤ)ĦëUÑäZCû öÚĠšä(Ĉè½°Ñ}„sş°˘e–A=ħúIä)†m˜< 5l§p÷l,1Ûûŭ=² óbôÁ#Ĥ@¸9@#ñPn`_}ÎQ@ÛrħEÓĞC-£zȟğOh=³ÛˆġCf‡¤S5˜<ô;mmnŠ×ö½•`´ïÓê…[KĈ–¨ézßožĝô§?{”.·#ŭóĥŭÂ/üRúüç~ċì?ùİŸüÒ4MżáœğSz—5Ĥ§˜Ç kğbĤ!˙Kċ°ÙmĴpáâ Ŝüè›qáâ!LĜŸŬĥsĈ·^x7ž~!Dœž>€Íf£ ;1¤è ,aàxX(³Ĉâĥ ĴkŒiŭ§ĥÊİuiµ O=´ĠêşÖ€dĞk‹ik¨^kÉê‡È!@şĤż]³0;4 ²6 q?=²ĵĠ™Ï مñ°•âc˙^˙s[Eż—R‚54€ċŭÄ,¸á5m-è‘ÍÉLl-—?ˆĥ×xLy+ ž"ƒSJ™:‹Mo‹ÀiT =Ħ&ˆQŸ7ÂÎâ~ Ù-ÊñĠ l°‘K@…X™Ykš°Ç(? Êż•Îê`„ıi&a³Ö·vŝÈ,7ësRÙ¸ïH œ9rÚzhkÖĝj=ی”ȓǭâĠŞ0½1’ü€8x°N”‚µ5ÀEñÀ%Z`-ß]¤˘Ġ5Fĥxà 7ù°Û’?²GLŞxñúŠƒ„ÜÄ"Ó)Ħ 0' îĜĦH1,;)¤È‹ƒb4˘pï9uä”ħßœAkŭ0`šfs ĜfÈ5ĦR€‚H\Ò|ÖlH8Öz×5[ÇñŜÏ·ġö^ÓÁ²fl;kíV;ĴĠ¨/jO˜Ó~7ù÷Ö>­íqĴë|;càk<_żtùÒ˙>uşÇít˙ܲğŸù\üäÏŭ—ŻżqóÖW˘6ç4í6ÛĞJċ~ÚVs'ÁÒÀ,@âVk\t|Çwà⅋8Ûï•ĦĦ0#žûÖóxñĊĦTÂċ˗Ñ÷r2-´2Ä.Ċ„˜3…èÌp8—‡ Ĝ]­%Ħ­­ôk&ħş÷+Ĉk^íJ˙PY ˜˙(CġEŞXħğĥµŸ_ñ–‰^LJXŜzğ…ÖČf>´|·|ʝÓ‚ÏĦbë1ĜW·y ;kĦ- }uÖq97@e È t(ÍVtB"&Iˆì1+:È# …”%o]£FĜêX°–4ÂÖ*È—µŠb‘•b ƒ- ‹ÜCfmcç &Oìożé‹[C}ÎÄ9@lŒrv]#ĝPXJ?yŜ²Cq&KF¤ ³I€H—If7z½cW zύÖ…A]8†ˆM(5Í…'[pÌ֊…|pâXÑ;h#il=tÎp’1½Ó”qvĥGNTşŽ>cCÌU˘š\ŝJÑç‡ì6¤éĝVĈĜ9PS[ìÌP~Ï9E&‰YcÇúÜIÌ!“ˆ‰ÂúNáŭyöû³’²5 gÈ! …@˙é §à‘SDF@dŻÜĥĥÔf0Vħ£Ö Ğ\SÖ@h]?×:b-ġxŝ…ĝĉSßÀ?ĝA<òÈwàôô"Et½…µ!xd+ŭ Z:½Zq((Ĵàş5U³ R$kmlË×Em€˘.Šmħo nŭÀ:TÀkí\ŭğµïc½OuĝE½OkàşMşßkĴµeß"Oz<ݎu6Hi…R ÑĥËgf”ġ e-ĤĊq(Wc&—$5CôȑÏ[<fĤט"é0Ĥq‚ëh¨ìâîv–ĥş™Í“Âù4hx-F²3ÓJSD°š-Ñ$hb>ŝqKŜ²³Öš†œî'ïSµIĊÁۏi„Jê£y€-k\ë{’6 Š6¸ëğ"AèĈèi ĴïğÂşÖ)g瘲4ÛyM“Gĥ½dĥiòˆÉÁsòœÈ\çĝˆeß´Fk 3‹){ÒE'Úߛ7iíôt­)Èb"ĥÛ›ċ -²qŠ‚B/0÷™ú^p˜& Ùp½bŭw.Œĥµ9Ŭ'€“­ĈÖiŒôÊÛ^•÷LY–AÄîÄì÷{„àRÄ0 ü÷­†ñŒ´Á™Ĝ~şĤÉI$¤ñÜġżÖú݇ÓêÁ2­5ñ”a=§µ­ĥġÀY]?ä5µĤwí³ë}X:­4°íÂYjKëxʀ™ŭŻfİ/m0P½˙Ŝûó½v[ŻóöğÉ1ê{‹Ñïq÷ŜŬ#H8nGF÷/ÊöİO}&}ŝó˙èìoü§?ġ•aoún“U|Ë0N½Rĥw˜ü„ ~ÓA+ƒi°ħ'H~è*|Aë³µÖŜZAo‡ÑZĤĤmñJ:gáĈ˘Ü€ŭbœß°2˘+ëY[ q>(ġ –TUŽ ™QÄâ;@ñ ›‡2€Î *“ „6¤ÑÍìc„2†ŭIN­bĞ/çr†Ÿ&äl0 #”˘î‚ÖÄò¸ÂċZ XgP@FÇĥc‚ŜĊ]@ÜraBE{ĴŠ~Ö9SÚîókSI˘Ğ5ĜÖPH„s†YmĊq¸ ÎÙbGfŒap9XÍ O‘u—1ÄÒ&ĥÖât:ѸfòÛ*ġ@YYü°ĊVâÔ9jƒġ­,ûžüƒĊŽŒ–!!ĵ0ËJ…˘}´FsĵŻ+ç4”2!ï4ÛeÖµ*ÍáJaò´@‹I&Ġ9?k oPJ•ïĈ!d%~Ĝ9şv³M.‡6d”!?ȅ"&ú½GB†ħĵÀšmMiԚ1½şĈ·Ò­öó×fÚ.ÙĦzW“÷c–[ĥxm_逗Ít>ïŜ½s=§ôÄ?ú•_=2şÇít˙BŜO?îö?óäÍ[·~#v³í'puÇŜYÇmℜœé  ‘C†2ڐ}ו+Âu† ŭ4ċ#ž}î9<˙ü‹0FôôdcÖġ䔸=j*ösžÔo§xk A­İ=¤O] d(.,ıhقş·mħvÀĦ֘ĠÓĵġïĠµöı,‘+ u=9½ĉşP3‡&kÖ·e7ŠF9'¨ú5J•Š* $EàD/bg3•ŭÊT³;™°›âD!?“–k*[Ë Ĵ2œë`ĜšĦbĚ…Û †€ …cħ)ˉ(i€Í ³^qğŬ ëTÑç֏tU^ÇÑÂĈ(hex°‹~şÙè*à„Ü Rıi]†œĠ%Ħmfħ-’ӁáP„È´˘'Oşiš`­#ÛĴ1’Ì£sĜv$ cİxŞŸük]g8H!aš<Ĵ5Ċ˙µë’<œ–Š^¸öŜ8Zĝ(÷ 3áe¨ĜXú9%ċȲm‹1b·ÑEŜ@ }Â"A1£ïh@-D €ìsSÂvÓa6ĦëMÀšAnŒ³6—Â3hßKbbÌ%ÌúŠL{²gpEÓ+ƒg •†3t (ĝößñ19ۏ…Ŭ߀Œğwî’Í8b‰ħ5<è£gĤ›gĜΊ´Ûçğ&u¨kiÇ5}6gbX{µ`²~5¸kYZ6ÑÖ5{èŭÛ9q›¨k °¸unSÙZël •_kŸV×úw'z†àqûî-ĵqûëëžĝĠ_ŭŸŽ@÷¸-žÇí/öÏŝé︛Żßş¤µù¸µöŻOÓĝ6T''{³Ùr"­›ĥÀÙpŜo܍_xO=}Ï>ó nŬĵŭäĦ`Ñw[<öĜcĝ‡?Œ7żù-dĵݤŭMŜ¨)ÑPQoû´Jl‘4t4Ĝ#´³Ü>ÎȜ‘qŜ ÌÔ̓˙ü–œÖŜ#&zpIk½ĵ6ĤsÚÖLĥÄJ²M“²ĉÑĥÏ:3fDCŠ ŸÜZZQĉ|OÓTP†×€!°euy¸Fv—œàEš:ĊLo͘,XQÌl—ĉÁ5żßƒ’‚’Zz>‘­ġš\"Ğ*ġw]{`µ/Z•^$Ö._* wnĊ‹ A^WËbŠĠ{&ä˜V$äÖîĞaਔ†ÒĖjn+ddօŠŒ \œà \)Y-ƒÚüä€"g˜’,€8 @ÖŞ -ċ …qâŭÚlˆu”Ô.‰ħL‘˜IzĜföɇ˘‡şÎq5ašˆ sÎUrĜl,RRċ/Ĵ%EñÎî ıX›A颵$˙dž¸t/Q”b–7#xϟ·ž$8³ĝżûĝkwŸ8ño~ġWÖ ë1ŒµëÂ_áñÄü Á~û[Ïìííí(Ġ|Ù{÷³Á†ídĥOĊĜlĨT~@J‰Ùl†{îipäèÜêAĵúê+¸rí*°·ż‡‹ßÀ•Ë×qùòU|ô£İS'ħ=ß ĉÍ;pδ3£Ov?Αħ:=À14H+n ×b98#iÄ ë ÷9*ÄÛ:ym d|v1i”²…lĊj}^ÍvŜé=uĤŭacŞ‘C”a‰)ßX)e.͗QÀ‚‹é}KÇBÖÀ2βcB99&ÏÚzâOŻ‘RÂ8K ‘œ„%H[͘§Î!f-|ú>™ -dÙŬ?¤(^çÀ…NġXşu½DӒŽn·°hĝ°Hò*…]͊ÁZÀù@ÒΨêÀœ%oĠ””Ĉ˘taĵÀANvK –€İ,’Ûdöıíş–š:AQğİ{>•jcY %Ïëİd#Fl+5Z•çŸRǢ{[üótàIO‚̲ÄÒµEL4,ħ£)QÌú”‚¨²ĥ65ġ5ŠXJ=kğ&G I÷şˆĴx ’ ÖZÇRHĜÀÌR%€obÙSd°)iŽÁò͇K7ù“\Ċk‚÷°ÑÊÎ9‡?ˆ K6b^"röı„ÀùĜ{{jñY:”Œĉaύİêψ,ŸL*m/=sÊ~‡)ëÀÚĊajk›ÏS‰Š´!UîeîY–ĜŒKeœûÙŬ@òZk˜EÛÍpp°Ä…7.à҅ó08ŭ}¸˙û Ú³Ùl=ùŻÇèŝu?òäïŭÎïüö˙&?zʇ$—r{ĴŬ£HÊFQ•3Ä^I9ÇC<€wċ˗ñòË/áʕĞ0ÖCk?ŝ€óŻ‚O|â‡ññ ǏŸ€1`éá|,a‚S´ġP `‚; î—‡²£d0rÈùö>ƒ7î‘Á.=D˜`wŒ.äíÓP÷ùÑë@yĦ̏' ×Ħ Sĥ:Sĵ#IBéYwgĥ— 6n‡‹íYˆÎ ™4Ë<Ĥ¤g7‘Ĥ>ŒË¨e3^½İ-Ö2Xr€CŠs!ábs›…ħµp-L ›Àhqĥ„i[XĠ s]• Úĥ9™ ŠAñUĉ›ƒ‚çı£mĦMdŒs`ž£m9¤h"X£””ä›â‚‡ïÛçYĥ#wż PÑÀ9k‰éíZ²“2/x€}?IÒÈĠ€ô‹e <–ëcÚÜ|.Ñ÷”ŒĈòâ%·›·ıìÍh!•âu;ÁÑ÷>.İaMò|KDĉX,|tÊ8"{NĊ:6ïCÚŜ²7xó°ŽÁy–Ù]ïÒùóYQ‚‹Ñú¸7=úċ2ûA÷ŭÎıB@Î ´ÁE7.šÓµïWŭĤ§\Òó`pÖZŻT9ÊûÖĴj ,›ĤŬ“T˘|nŬİv*AòNû1eĦ˜Ž~F&疄oé5ž‘‹à‚ÑuêĴGÛmàĉ›xċċ×pċÚ[˜Ï}ĝaÜ{ê”Rj.îÙ ëY=Ĉ5Ìġĝk5^xá{êÚµ·w„à_dŒŭ„sĝÁĤi6Kĉ@x™µ€vĤ²—*|Áûxñ—Ò‹/Ĉ­x‹8‰X?~7ž|òI|ä>Š£G i"ğċĉ##k3;›˜]ĉW™Ìڗ‘1†À‘ġĵ°ÍJì_’2°ÊœÔeÄËmjÄ' ˘ïg½oeÇ{ ‚ëf’²$9•Vĉİä¤Üô:n6İ#žj™:Ĉğ,+¸Ğ̸9ž1•ŒÄċ˜áĥÎf0‚‡`Š˘wù6!Mú1e<Ĥ\IH!!ZE`M5\`csmÓĉĈİër `c›/Ĉ{{äKQşdQĥèClj£ëÀàĦÜ4*2|Ôl•˜\€ĞÈ`h œšĥPVŠÀaòĠMMh‰ŭLŸ‘šÙ’G,]ƒ6×Yµñ~´ôŝ5 ƒµg F,°1ôYÔħ–à4épçs­ږáàÀfßԓ|ôĤet| Üm“”ƒg‰‚uĞŬJQXċ{Ĵ>'›RĞ̌‰Íg‰!ÎŜÁ>`˙à ž/†ŭŭp΢m`Œ†ħÌ'ÀğX%ˆÈsÄ35˘MI J˘ ŬğÔ`èGŒyŬ,v˜×wyO%í÷T%¨Ĵœ”À6m³´żĞAyŭÚú÷µ”Ħvv(Ÿİaĥf—h§&g9ùĵ#9O·cá}Q)‘d(95z ’·x˙½wñï|×^öö;ó(8} ĉD~ĉ3Ÿŝ›/16_ƒŬġŞŸëS×küêŻŝŝ7~7ŝÁ˙ĝ?|cñ[mÛlüq-ç.êñ¤Ñ%—Á o<<ÚĥĊħcÇpâîc^Cë=X§Ápûö.^ĵˆwßŭM3C;߂-¸”°Î€qMPÉS!רÁ0íYÛĉ$'(€qĦÚŻ#HêY]™œĉAmĈ3jˆ‹žħÁȗBä”ħìWËY~5R2™uG9Ô>”‡5sÔeÍ}Z³G.Ĥ­{êó‡C^çîèÌ#RI i5c;É6—Í-şXá;ì#‰@|.À佋ĝ‰¸bqÁHÙĵƒî5Œ5ıÑkı\äc$PCċġ [²ò럵˜ Gä•êç-CoHSšôİÉîJ$Hċ[–ËŭÉ—1ŠUJ@)²‚hÓg޸íşâeM>°1ö×GÁ³Ÿ.C£8f-‡ˆ_,[ií"s µ…ħQöàœ0&Ĥœàt<|¸ÏŠcwŽşŬşrù0èKÀŠ,%°QÀ‚ÑIb(aÓyÊŜèA‹T½°7Ÿ%M°÷Ĥ†œ.çGMĈZ­aU ˜÷äŞà)âŜE½x:ï@nĊğğí%ó9£bI“~5‘ Sqßu¨Ky˙֟9ġ̨“Úê~ƒá:Ĉ·^ÀÖqĊġ½Üż:\bì'á̃ĥ=˘­5]½ ‚K\½z ßùΝwáäÉxĝÑqßÉ{uR14ú.ĝ—=ĝf=ÓŻÇè~í_ŝşû§żüK7oßŜŭĤw^£u8.o…ħƒ¨ĵµ“Ş!+&k fŬ ;;[¸÷ĜŜŜ@Ôĝ!$‡5×ßyo^zK Áĉ³œ"ċ½ƒóÒèú˘óŸš86ŠœÈNŻËlÎı\³8ĴÑŸ¤šƒ!QjŒ 9F7ŒüŠĞ'ğ2Í-íwb9êXòXĤŒÜkôä>Aŝi?pÇIĞ´**ižÌ@.YŞ€ħû… Œġżu§ù”~Żž€=†ĉ!’ëBÍĴ3.³ç/‹ò rAˆéÇgIŠÒr²´J w `ùÀá<C³š Cóšħ'&‚ĜEossc m›˘­ûF‰èâ51€@k-ÚFä¸^çžr#XtŞ£ĤĞĜˆF爚ŞÇĤ4N |¨& ŝµä K‹Rç£M,K(I69ĝCPCçĈzXcђó IDATĥbSÜ÷}ŒT9P"Dĥ:ĊS_`ħXPޞÑÑ/›G{ŞòžvŜè%| og—"Óâ=˜@lıÀN? Ñ@)kûÉ0›òÙU3ĥéÓÙ²´&€§äàÔàôŭ8€!„@ xŽşNF˙ÜÁá€+KÛâÖ´&Ĝĥέz3¸ ”z_!éóʇ2Ĵ"i€PĤ{“C)™÷‘žA´s>Ĥıİĥm.]ûIŽ@ 5…;¤í—€4ĊêĜĜ”èc à‰›lĠÒuĜ÷:şCĴŸîÍ`—ûħż§ħħÙ şŸÁEM.Uú˙ÁÁú^=r°X,첨ŭĥÙ]!À˜%¤bÙŝ0=gĤ€]­Cé^ĈëZŞ25œ’*LéçK0XŜ‡Ĉ”úÙ:Éq ¨–ÛIûQ7ÒÖ,mı˜-Ċ%lŒŬûuÀJ–Sƒ]Ĉl0h” /-#§žŬŬ]|ïıïáŬwÁÁïÇŭ܇ù|)éuİÚgvÛVŭÊG?ŝñ_ÚÙ>ħ–.ĴÇZş°Ó˙úÊWŬ?ûċgn~ÁûßÔĈÈùĵÓş7Ç-M’œI€máÀ…‚à-„P8v×1Üê>lÌ;³„sÖ/ …Àïż‡×_{{·wħ9ÛD£§¸Tòœ PŞĊlAÍ>“nW eġQc‡àƒà’ :Û¤`BPyŜ°.8cÒšìDl  e£UžìùHÊÀ'ÌÔ§ßêh­Ğ'ƒCKœĊ÷ĊĊĜÛvj2<ĴYnžuÍQPP6yŸcx@.}8k–Ĥn;ÌKT‘;Ósé5îAp$ݐ‚‚%“{‚V`,²Ñ‚‘;†÷à€ŜQ›I7ñµ\J,{´hĜV|AĈKʃ@˘n7B+¤Ñ;7ı($çžCT#`-°X TĈw1|#  /‰ß‡<­ ™=Ö½Cۉĵóù} (5„3Ìf*ëfK–¤<ş#ô=…K0Îr8ƒÖÓ 7gĤ:gÑû6ŞŸHg›b—“ċ—”d/–ö•%ċ€,O@”qÈÈêĥ€Š ×X ×”èAĴ/5 M߯1:7FÁYxG’†àâż1úVIïuĈà­áĊóh*Ú·|žÔżĞ"Ĥ>?ŸCĉàam‚D×nÀ9†·Ŝş‚—^~/žÇĈfƒş=t?N?†Fќ ¸ wĈ ¤ĝ˙šFŭü™3Ù[Ïäëħft×û/<÷]ġöġë;lž1ŝÎğO.6¤Uĵ ]3ÇŜâóù<‚–<,gX.{Üşġ^|ċe\żŝ.\†½Ûû£_h?~žúÑG?ú7pìĜ1€îûžÈϔ3“´£†9ĈÌ­GXaYK‰AŠ ž’”ò9I%Ù‚ó1ÓS1żS. ġ8Lĥ0µċd’şĦËò~oö“[wB×ìO Nk\O†£ĉı´äSìüd$hùÙİyH)•% uG(‘޵”L¤I3ùôÒk$´îs)ŜÚ/kCf¤blH?ë6"û(°ııĥĉ[›0Ĉ`s6ÏÇż9—à NŝT&Güıv*H×Jşvrı6Ĥ‹%à+DbF).71şdUF Rò ›™,Ғ|‚tµäĜäŒŭR˘Sé?mss.ħŒ,5-Ĝ™UŸĈGÔ ‡|m§˜ĠòçÄ6'wƒ´ä˙ĞT´7ÓM£/‡8cúŽÓ59°ÔÉy!5òCN22ìC°0ê‘ĴĠnŬş".'›ÑFl´bótŬ„Î(-0ɕÀ˜´^ÄïJĴ8LÉÒµ™Ùt]—lf XkĈ4mKk=’ŝÔώR.qXôîÀN£–)¤Ï(ïğİŠÏÊsrıg.Ém䊳M:Žd#ĈUµ‚k!e £‹/âÜı×pĉûĜ9:™3§qêŜğ!ÉYĤ ï=’íRâWŽŬù}üİ5›ğk ğ˙q÷ñ;µö¸âĝ{}Ż·…à²8T9L#ċsN“–µİı°‡·Ż]… —péÒ[¸ñÁ.´îĢpïİÓĝÔ§~>öĜP’ċô€ĉ‚#Ĥ"îm˜* ŭ/G@²şÌc…-uqùaΐ˜"ZâP@AYZ,—ƒ–—3ÄĈ³d9… Ì­ġ˜Íx>çé\kK’Ĥó“tÄ‹|ÍâÖĝĥÒ˘kÙ÷àÌSZħ@˘$ÈaI!:·Ôħ—! %X›’)Ôû„Öìĉ”4 v<˜JP̃•ÍWŭ Jï/µŝé¸Êĉ͚Ċ’?Ġ>£dğk [ƒ˙úÑÀÑ`ħXâüı‹xù•a­Á½÷žÀ#?€£Çĥ0›5$g‚„Š|×½€”r×ĜċYÀŭÒg?÷S7×3özĴîzüİÇ7~÷ëG6_lğî)OjĥİQĤËĴ€1ËÈÄ Ì÷h›!8ÜÚŬĊ›—.áüù ¸zù nŬş…ċR¸[[ÛĝG~O=ġîıçžÜ¸ĉĦg5¸ lĴ3ġÒJ=mé£; .¨ÊûYf y6Œ\äF5^MZŒĝiÉÀTvوRƒ<íLf†k [N²é8Wf?›u‰°tz˜brËrèhĸY—&ްzŝÊ ·ĉ‡ƒú¤I·şéóÓ5EŬ˙B¨ÑvS ˆ-H!!y%:Ö"xÎ$Áwƒsg9ÏüÄg?³ıëħft×ÏvüÁ·İnïíïH)ż`˙ÛÂ1ï§ ƒÀN°$!RÀZġ€ Fk\ğú^zċ5\şònŬ>Àâö>–Ö6àÔéô§>…3]×R“HŒ{²˙ 6ûêCiÍij~6IÊ.ĝ’‰ĦĈ•/„ €‰B{™XŬäÄFÜT‚Y ê:‰ìĤٛÌnrr"°ÖìÒĤlżÊI´nB!FrëÒdxZ­‘J ñ(QĞĉĈ˜ÜĵV6ꕓazMÚFÍi˘°…ħRĴƒôŜ¤ĠŽYQĈĵó” ċ=ş£& ^£Ù˜ž‚áÈÎĉh²òÖ£Q m׀3 •¨ċ‘ß0˘żkt§ʵZ÷èşJħ̒&fĥ7È:ÖÒÊĞÔjÏf*[)Üşµ@Ó´hG+‰Q.Ò䒐,nïÌf Î ‰Ä'›1.V·dx{³ó@×í-IږAkb¨g³> ƒpkIœ$pW*ĤqÀĊ@a°R&ĤYkq°@Ç)IнX,°\öŒÒöt߃ ~ıÌĠ%Ú¨ñĥVçë´išÑġ™ž cW…áŜНFLQԙ×öcI[W3êd²,¸J†²ZSK%RÄ/°š8TıBùŞ›áJ€^/–k [ZŽ™kä9 lfL ‚[ —ßĵŽç_z×^Âħğ·ĝ™qÏ}÷`cÖ"xŽĤmœ„€Ì­ĥiwıÀYŬ÷Ï|ö'?·ıëħşëñç7ŝġßÚ˙>ǘĝQçŬĥ·ˆÌîJu1bSĈYswï&½} Ïżô½ġ.´ èğ{=ŽlczŸúԏáNÇĵ˜‡…Ĵ‘zAÌ^{,T*68jn=ÌIš ÁXĊ˘0Œ€²Oì$ĈÖbd ,k–cú{9@°ìӛ´Äö– ĞV_µl!ùÛÂOkq] áPJ´ĈÎZxĈ R“Ù„cBc \—Zk­^­÷+;ÊKëħšĊJaŞYĤ4Yç÷ÉĦ| `´Iç ĤÄ8÷°†Ş,Z—qR)X$>›Í°µµ…Eß@ Ùl†ĥ#i#I7š@oùMŜ1”{]'3X$e³ġ×ÁÁ66ĉYËK EeW?ÒŭÒ˙I˙œÊóRŠĴ-ċZll(˜(ĞHÚĜ“ÙŸV)9ò´MûEÌüÇĜ½ëAÎɢzc)ƒ€†Óıèû&²Ġ›€yr·ÈA ñ\'oŻéĊZk½„‹ gËċÖRtµ3=ĴšŒÑĊ"ӌ@^é:Qƒ´zħW‚ÓòŻ S.+u“fÙpV2ÊEbÍ—ŝ·%Ĝ=L.Té:>xŞŠcmŸ%6´Ÿrċ>÷5- È9‘W赆 `\8ĞÁéœA/-‰FÍp{wׯ_ó/|ûûğ8vd}èqÜ{ò^´3+jŒQp„#‡ ÛuÍ­û à—?ûٟ\ƒÜġĝĈZş°êñì³˙Ş˙ı_ĝŸ˙rıĝ÷}Ż’2)îòŜ6>8pAIWÔìŬ فq4­Ä‘c8qâ(6·6Ñ/zXg1ïfp6àÚµĞxŭÜÔżı-Πûà\`öW %ùs&Q!$(Ġ-KB€‘M Ğ6^…Üܰ¨ ôŽÊ·'Qxœ¨XYĥf 'P%8Ş(^vX˘{Lv#™#Ó'˜T’ ÎûUŸà˜Á&óékÀZG‹Öî u3M-ɘúülÒÒqĠ@‚JŜEähŒÉe…)`ġİOáÌOdĥ°m$TĉഁµRĵ„@îávEPK“……÷݃_Žus¨NNÍAŜ90Π¸E§‰&•?k 4Áf[Ÿà˘ñ`İ•lÌ‹‘hî–!dw‰t,™ĥne2eQ[;Òż²Ž ŭ kVı܏œJ a*Áĉħ9ÁóT¨DbV˜Ż‚]w‰ €3ôZç (šICĴ0´Ş|cŽíÀ‡ šĤ”2§ġmn4™Ġ4˜ ÒäÌì&fӘĦôŸNMbYۖCrbIS pic–F²“’XP‰1ÄŜĜ*™/äÄħ䴐ö!5Œ°!H–˜êed‚“³CŞÎd o7(M…k%&ÛŻóaʀŠ hcş\£ŬS‡Ä:KŽÉ:,€Jö)ⷁ€:'ĉ…0ĥÂÒz™cskMlrġ¨¤u“Zy-—Î t  KHŸ—Â2ʇRFu§4´òß§šŜĥ\€òr!Yƒâ) ĜÙx§gO}^VĝŝœG Ñǚƒqà¨•“Î Çbßûî÷ÒË/Ħ›)|ĝCCŸÁΑXŠ!A^À: &8œsğmĞÎjŬ˙ÓĤio~ĉ3Ÿ]GüÇèÇıñÛ_˙żúàżĜŞÙSÖÚ'ÛŜ§ä°q´n×u IËGĥX,öµ·ñÚkŻâʕ+¸ığĊBŬÀ‡?ò|êSOäÉSÄ1 )@b3w€÷ ܋âR@‘y ÄnlĦĈ+ve£D574ž”ħ·éç4iÔ¸yÒbciŒq’'è-{Ò& ›2b58?9†C™ĜC“ÓÂà›JïċXmT)Y¤İD¨š}Ş›xJP['´ĠŒ€Żs\Š,ÍHàĦŒx\PZ´s ˆÄóšKħ²EïSĝ ‡ç¤Ŭ&îĵĝ{ï=ÚĥY³ËÚÒÚ5yQ€ÈÒ7ǔ ĥÔC„°Öf¤í:‰§…ĉ\ĉíh,— ’F6É=Ħó–ŝ½^t¤Eg²> ž´ĥċb4%·yO1Ċ5°uŽ@oJek[΁¨(ÉǛ¤´,cëì“#ƒ^hôş‡1-%‡ċr múüœ0ÚÀëžN.eQ"“EVَŽğvP8ÌöŞfgK`XJÊEٔ|`° #[ŻÒ•ŝÜR"QX”U¤İûnJTƒß1£;<³J:éäËëĤ–zá@,=@ŽR1ö gœu†ÒÏnÜĝÏ}ïqéÒ%Ìçîż˙~<~ĉ9ş Ĥ™Qócà)hw6›ŬÛğġÌÓkİÂzüİĈZş°ĤÙgsù‹_úĊoÜ}ûkÖZݔҜóœóvĴa#6Â,=fíB4ä{Ú5¸ëc8zdóym5ĵ³’YkWâs°Ĝ_âî“'ÑÍç¤;´”°0¸àĵcžĴÎX ,;3HH„(%ħ•İm44ɢŭXĠ˜R—ġÊÉ lÜÊ@Ž›´˘Ŝ‡ÌBÑяqÊZN.‹l5‹€Ž"_S„Ĉ[Ùš_Vŭ;OÊHÓœÖ]ÓċŸz‚­%!%=,MŞüÜò½e0E>× GÏĜì>5ù:I×ċÓċÉkx g<Ĵ3ħDî˘uƒ|ç=˜àô'˜uƒïk6.<‘Ëŝn`fè=pMh`ŬXšRÎè;06•‰é89g1ĦJċò†ċ’äJrÉà}?MC‰5$Ĵ `hÛĝY`P’ċŭ͋µ@Id )uÍùĦKp²[öÄĈJIRVE nÒ˙²!ÈEÍ.I"Èïև€^k8KÑâ)Ú·7Kh­)ÂÎY°àà}ˆz\‡H˘“´XóÓ şBÓz˜ Vİċ-˙^k}}!aރYĤ,üÊgGİ_Ż›Í&-˙p¸„¨ĥœÉu5fJò^“ö­d‹§Sm”ŒXÙ €; Ó4Íŭr‰kׯáĊŸğïĵS§îÁG>òNş››3H!ÀXld€’+)v­sg1Ï|á k r×cÍèÇ_ĵñ­o}SíEwÎÙÏzĥy Ŝ;ô½E×P9Ĝ8 ÀĊèPŽˆĊyûŬëxġĠsxëÒeܸı‡ŭÛ ,—³ÙNžzOŭĜä}÷àžÇÈòÉ,x(AljŞâQµ@  <à8àaÇy6ÁâLn ÚÒÄRv]OM*eY?pä8[mLĥ8NÇYJ2† F\²q¸…ĥ&–‘é{49˜DfĈM)…ù|‹*!P“Úĉf³ĵuhÛ³Y‹'‡ƒV­2ĵ¤CM§Ìè)ȁ@9ħ J ï]ô!—ÀİÌ.àĴĊlÖäm|–È•èòĜcÁéóé˜YXF~µž$)˜ĦQ<7·ġÚf˙ßÚĵ~“$!ùû&3ĦÙ̉sÄŝjOÚèà´îÁ²ïìà“ëA×ĞsŒ3=‚ lnnÂ,{)Á™$İ£f]ïÙwŝ,“ü™ŸüÉuÓÙzĴîzüĊĵGöööżÔ4ê)ĈĜ“Îùí› ™cf°A*u‘ƒÖo]y/Ŝş| ûû{Xìkh´ĝÄ=‰~ò¸çž“h8.jr•/pHşà½ dıIÌšAİY•şÜ^{Ċ–UYŠO@Ġjpcaşëê¨ñH’mTÛÍÑ6-ĥĉ`1Şf3² S‡,]ç&Ĝ‘FÛòT‘Dz' žÂR0Er-0vphHAĈ¸i™+ƒ3Br^è: ÎÉ!ĦŒûMşúä˜P`Şš‘$!۔ċx`64š•Îɳ—d$]°‘½].—Y{ë-%â9“­‡÷š¤)>À ˆ@”'”AÉĉŞşSleÓ4“ “5MúàôžÒ¤\¨ïĊÒsş´ó*ŭ§§$wbZkËħòžYYàUĦĠX_‘Tq@şu4x­ûBÀ8 c–hÚ9˜@Ä$ÊĞ/፠ç!˜Ċ?ˆSœÄöö6i‹]l`+dFJĥ{Û[óÍÍÍÍŝéOz r×?yĴ ëñç>ò•__ŝĝoô½ŝšµĤ‚·RŞ£Ŝ;‚‹'œ³XJ&—ħ,´M‡Íí-Üsò$ŽÙĦ’Ĥ^ m–şÇċ7/áÜkç°8X`{{³nŜ9ô İ˘SA `Œ< úŜÄĈ˜i [ĤMùHÖ +éŭeÔfùşäêàcë:c,³u ²œĵê’f.ÙOȗ+X*)spÁáĵ‡ÏPd":, d²) JCH²†IÍ Ùĥ ˆİĴ.xÁ²Kž>[6š8ˉ´,û––m£XVÁsû uĝ‡ì¸€@ ĥ<áà;œ>7€€Z:7,‚ód+§”*ÊӔĥµs!§ĥ•%hk=´vh; U "ĞÉ"Óâµ§ b’ ƒƒü"Iˆyè{e0–šß–:äc”ŠÁA@ÛrXK[œ‘l °ġBŒĥ`\ÄĊ$ħ޳NA)çIÂLQc£ÔĴĈC,{2 VŒ 7É7DÁh§5ŬúŜ`Ù÷°Ö˘×K8kÑ÷=ĴlÁĴĠ°ş‡- |tWÎeußô3›Lç+›DKëĵ˜–÷wİİ­ctˆ2ï=´Ö+%˙,í(šĵêÊĊ”Ä!ŭœd^Iˆj ´ÚbĴ|Où˙ôÚTÑHžÂóŽŬѲ,iŽ€vÁùX)²cìñÁ7âËÏÂç!LJ?tg{ŬĴ£{’)L†t<œ ïwżáœ˙Ÿĥĥ·ŝŭÓO?½żž=×cÍèÇ_şñíoĞğyóÖ#RŠ_Bü]ĝ°ÍĝPî²Í“R‚|½ÉäÚ,î{ïàġ×^Çù7Îcoï{û ,œ)œ~à|ò“?ŠG}››* IŻ'5M€R ŒÑĵ§2ĤÍ^Bpӏ|#ëR_Íü–M.u„ïˆ –[‚G°cFIrÁŻÖğ€Îd̈—RŒšçJ²tSL;ï(hbJŽE2“ùßËŭ`œl2k5ñ<Ĵٗ@÷°ó36÷x__4ç%û´dëWkJĥ8%ÁG,°cc†0i[H´mƒù|YW…ë4 şç}żÄñ#s$ĴÉ àÇ@MeŠV[}O²ƒS£ÚTuĦdúhÏÍa³‡ÖƒƒCI†‡€P‘"¤‹…Ï ÉÂ;·i´ö•Ü%èç†S˜D[(ÙɁÀ”µdĞwsï&}ÎĦ×Ĥ_¸ŜÁ-ħ²àa]glµ¸ô겏7E'Ż–ŜS9,뗞ÏJİÉDż(‘@ob{§’kùC nËï° Ğ(ıµ´˘î˜j^+YܚAÎN$}_°Ú³‘+NvòıdËċ2Gr÷ŭŬĈ ևüŭ7\áwßÁóÏ?‡·Żż‰ÍM<ŝĦGqêÔ)Ìf]ü9T |á\À{çÙn×ugµÖÏ|á _X³¸ëħft×/ïĝµ_ûŠ}ĉ™òŜŜŜŜïö½–óùL{ïİY ½Ĥûë`L꘎?I܍ ?qf£&6Ĉ)”Ħ7tĈá 26‰)bP‰Á Ù#ĥ!Ğ‘(`qż¨é !2ĈħÇ2]&`Ö2ì/<ú~‰cGĉˆr[ôÚĈ¤=ÙŒ£ï‰aìZ…F‹Èüĥ-£&ŻïKeċÁĴÜoç<öħµµ…yC,l™\–ün“]YéÍ 6ĥf|’­vÀÈòŒ<=–1˘WkM2ĝÈè Ŝ¸!0g‹´3 oŬŠS}_C5˘bB4#ßښA-“ŭJĞŻÚš+UgĤÜ@0­eOuĊ |O)G¨Ùڒ9-%;ù^/)é‚s~eê ŒÔà–>“:İ>>ċ^Q7°­,&#ßM`ĠBċxĉ1ù}­ĵ!hj£‘µa%\£Q*Ç9sĠ mZ´])ÚĤEÓ6p@KĤmğċÔHċ~}jğhÍeŞfµ$QÈĦ)’$0kSxìrÎb¸„ğT­Àµ5Èġzˆ).e9s…:ۘı‘÷ßFo#ÈMvjĈ8GÛÒ}m EQŠëµÖÁÒ}µ`Ž&‰ÏT1ÍnŜ隣`—ĵÖ Z.P_gµ­Xy”Ž u4vùoS~Òċ³ĦŽ.u‡ı’Ô÷GíÎP6ĵ•‹ızߒ´#ižëcHï4½IÈtÎpëÖMĵòÊËxċ•—t >úNŬ{7vމ à¤lâc .ĴmšöÊraŝ­ê—?˙ùÏŻAîzĴîzüĠżóġß:ÂYĝâ)k퓜ħíà+X‚… ÎÒŭ9ËWàâĊ‹xó­+xûÚu,,œşm<ŝĝĝä' §O?À9 °!ĊÄÈJGÄbİĴžhÊIħžÌ2+•J”•}™_anJm ™ĉËA|fUÒÊÖL0ĥ!K³şċvJ†µ D& Y]ïÈeAĥ^~bbĉF6&ğ $Ê/›ò<–öb‡Ù™6NFK%¸ÍĴħàa0U&PâñÁˆÍ€kpĈ #s(šRJ4MCŒ1§°‰ÙlFò !Ñu-ÚĤlDF´ağ‹ŠcëíÀR”oĦgv4Á‡ ;ĝ¸hRŽ^ġÖÛ+bgƒğ@žešúSB$°ÛÁ>LE·ëÉúÌy IÎÖZh­3ğlµ†µ&;u8ġĝîÏäR‡9¤Ÿk_ş”÷OɖÖzûôğş™´%³[kq§·+÷aáşRZ‘•A+eÂbíĦ›ÂRÓ[2ĥ5/÷9픽XyîêEüpÌ6~˙m<ż2F‰Ë̔3Ĉħğż‡ç÷=\~ëşÁé‡îĊİS÷a{sŽĤQŽ£ëf8ĜÓĜĜÜ8Cß÷ğ³Yóġ[·v˙ġÑ£wŭğ§Ÿ~zo=û­ÇŸçXkt×/Ì8ûìżZ~ñ‹?÷½½½Żyçd4Ž{ÏÚ´.#[˘d\Ä!bl¤T J6˜Íg¸çä=8²³ k5;Y8ç0ŸoFFŜ icpŭúu<÷üsx뭋8~ü(>ò‘'pòäŬ˜Ïçèš )–F*ç ìlü67·ŝè駟î×3ßzĴŬġĝk9ŝè˙@Ŭ¸qsGŝexñ³Œ³m҄Ĉ2¸HŸäŸÉXò´4`<@këׯáKoàÒKxûíw°8XRw°¸÷ñ}‡>ŠÙĴ‰ş,É$fmônà !²vĥ”Žürd[]ˆħ6ı L•MSŽ=h/Ĉà1IütŽ}`Ó,}FXYéĉĈ/^O’ĞŜÌJGV3şµ‡m-•àħ³>•³{§óWOĉ.x4m™J›·“d~7ĝ0ˆPpÑ3ĥÓ.³ĥC€Íîiú”jà-5:¤&\plη { !%1ğ›[hğ‚ 4­ÄĴé GÛ*4|Ĵu]aŸ^ûšH^ ġÀ&6yíĤŭġ 'F·Œ!öŽß œœ|”@(%ĦÉ´,ÄĝĂfoáGú_ïbâ™wX,pÎ=È Ĵ3Λj!F ³vĉ(_[{U'ZjKë4´Ò&Ĵdf§FbôÓġ”ÊŸŸmêV´,_;IwœdÉÁĦdŒkk½´K1ĵ5Ğ|˜nÍJ—‹ú5µç|-e‹ïĦTGûìi‘öĈ…‹¸pá<>¸ñ.îşë(>ôĦ38~âXh”"ÙUÔË·°X,vg›gáĊ3ŸûÜZްk ğëĝ½ßŭĈïܗ|Ož°-DlBòR 'ÍUŜSÖ:Ŝ.Ŝ{ïâüùó8wînŬĜĊ²7X.Úf†Çà |ìc#<‚ĥmĦFË%šĥEżÜ‡PäTN"ÄîQé5u—ŒP™G?Œe[°,+a4bnK !ĝ * ëËM\ċö0Áç×ç÷d6'‚Ê6Ĵ· ´$ÀXÔR£Ë‡wn$K8l„‰mĉ²ƒ=[Y–.Ïíˆ5éMÓvKë¨xSbš™ğ|ätĦVâbK •XĜBt µ_ÄĤ'É#Ĝ bĈ0›mbkgJH´Äl6C;k2(j•B+c’5&M \ éNZlPYr°Ö£m9ú~œt–.9ÎèġR°ÜÌ&8ŭ.dc,f3™“Ôĉ-[‘Vp RkŬk¨Faoo֒@ßSšÑÖYìïP8£èkc—Ċ9J÷Œĵ@Ŭ÷cÀ—îÑZ²P3ùÖZ´mğşH,kZëì5[ŬVK&6×Ñu]ìG²-Ë w…ĵ ÔüĤŭMÇv˜,â0DžšµN sµvwjqM?Ó½ä\ú†İ:`#Cŝóxá…ĉpêÔI<òȃ¸ëĝQJ¨Ñ/-És¸瀳fW)uÖxûÌ>˙wÖ w=ŝ³Žµta=ŝB_˙êW—żŸûĈŜŝíŻİİÁÂq­u+@pžBbݍXb{…dhU‡Í-Üuô8vĥPü¨Ñ@4żzċm\¸x û{K;z6ĉ;ÌC\  b v’3)˘„àÎßÊc.Á˜ˆ>et˜Çg&-­(Y€t°é ¨ìğ‚'fŻhŒ€J=™O5ĉpÉݤ>ÀEàtıÁûlĉƒ^ı$2e‚âéßYv`ŒƒKIbg ’…Òf*ë‡A`Br°€àĴ˘ [€³Fk°àÑCßĦ”ZX‡À$<8è) JNK²†$Pœ¤}ŻÑ* kH[Kì-?AZ\È·`–d­"Ù<_gÉ{8‚XF\²|…ĤmÁĈĉÚFÂy k292, %£Ġ£×M`üÙËXÁârú{€ƒ>•û9:E iژœ"Çy× fx6ĞĴ-Ċ;ßŻ3 d3½ ï`´6Z÷ÖfŸÖùô°fı<xċyŻÁ[ùÚ2r·Œ²-Ż²ı41­‰ħ-YÔZŝPƒÍŸr_J—…şQÜżúĝĤÜÚâlJz‘dĞCı@¨÷lŜİ”µLr(ÙĦ_.!d‹÷ß˙€B ]ÁĈÖ ž>‰ÓœĈĈlZklllĈfB²l|1ŝ]ïŬ7R˙ü³ŸŭÉ5È]5]ġĝ~Ĉo˙ö˙{Äû%ÎÙS xRJıí˘ĤŒú"?Ĉ(†ÖĉRğµo_ıŠ7ßz ÏżĝnŜşċÒ`ı0hÛ9ûG#?òzè!jĉ M+ /—p†:ڔ°ŜmUHˆ\a¤ö#uÌ Ħâ¤5Öġ%-îaž´Éš‹ Ò—á)aÍ*ġÖÄIM`ħX`{ëhžp“ç¨ȚÛ$¨­Ò2( äĵ\”#ïÛtK˙²i§üÌĜŽĵrЎòXS2Zi–d!#wЏPHÉiIΐşÇKsm½–´½v8ïğÀġ(ġ-ˆXrwä³l­ƒR*xFeëÙ&yï2Ĉ°µµƒÍMbĈĵÇÖV kÌRó—‰i, *bn­Et‡ kk>W ¸}@v)ÒùĦ’^\DB €¨µ%Àƒž>żk9´ÁÀÚZ mzŠböŜÑ/òï| ĤOç=‚h<Ĝ‘·.ħ—×J HK0[Ë~Òï”RZîúIò€òÊĊÌ÷;DëĜáúúĜc‹÷­cĈKà;`S&µ Ç ˘W2-Èé>èşÎ‹ŜB z–]ĵxݽü2Ŝ}˙*Nœ8†ÇÇOGĞf°ĈdĞş<vüĤĥöŸmmm½÷™Ï|VŻgġĝ/5Ö҅ġĝK7ž}ö7–_ŝò˙úÛ·o3&CÚ:wœsŜ6MKe`cbzObĦbÌk  skcGvvp×ñ<ÀĜ%³0½Ĉċ˗ñÖĊ7ħÔ;;;˜ÍĉX,—J@u-Ĵ§x^!b#Ut-àQßÀyce´mˆN2ñ˜ 4ì'@î ħԞ&S΢g,‹ÌñĜëĥv†Èĵžü‚›Ĥµ/½ô_›››˜Íf> Q „ Ä"Ġ(p°Q)¸V\$Ĉò0†Ğ.זĴj™\wˆ—%ê‘Ġ‹Mf9á-L‚IaeÊ[rĦ`œMà’*&SµÀbŠ]yŒQǒ‡à’\âwJ~ Ñ™“GŻî{p&`#@ĥցA`ıì! ŸĜÚO˙"ğ*%%–)Ċc„6HjƒÁ5#€΂ٔŒ²A×!g€qô³ŽL1iqĉs.€ƒ6Ĉô0ĈRҙħËlL:#éH@6†DĝÌ8OyäÖ.(SV^IƒZ^£|aêz*ïÄ ×ÛJ:ÙzaSßôs 4K=yy-• ·L]ĞŻıšħşµKK™zVJJ€?şCâdòÊBÂı£=‚àĵÁısçñü ßĊíÛïôéS8óĜ#8qâşf&‚ÜtŬommAJ‰ïwRg?ùİŸŝÛïž=ûĴ[ÏZëħşëħ˙‘_ü‹_ñÏ>û˙ï˙÷żë˙šb.:ĦużĊMÓP’U’R4P²ÁHo)ŽîÁñÇħ½½cà·woʕ˸~ġ(ĦpäÈQê÷”DşLĊXp.‚,ÎàaɎ)e°‚b}í´‚vaE ’ı[ˆ4·…#´’ÍU(45L[bĴ²ƒh›Ĉ|ç;ßĊıW_Ċ{ï%Ž;JÍ1Ĉ€3à£|lón9XËR…;э>Ò³Ö z‚G7¤bAĊ³A˙ċz|´ŠìÑ0é“À–lır4lŒ-Îc‘ħĉƒƒOŜˆd½&BÖGcífà(R ôÊÀÀ]cÄ ‹QԜ8 {ŠŜ èċBrXk°\ö$ñ²i°·0`JP4.ËĉùÚa‚˜^íÏh•Œ~ÇEĵĵ5˘-šô”ÑÁÁD­n}ĥƒ.Ùábtnê²VğA“뭁5Ö9ïáƒ%}J7 ~”x–Àe Èj'“zU^ßµŽĥ–ÌÔ ):H³+ŻñPOm§>Ĉ²:qXv_\§ĥĠ ĊúëE%@ħŬô–#£ıTX.-¸è{‹/à…çż ĈNŸ>…G{[[›¤Ċċœ)0FҎF5èuçÜ.ÎïŸùüßúéµTa=Ö@w=Ö?u|ċ+żîżzöكŸù™Ÿùfß÷ŻI);xïÛÁ5€Ĵ˘+Kâ‚ŝ )Nž<ğOœcş_’\Àï€_zï½ûĥvŽbıIŒj#Ħ¤ Ŝ2ĝÊ”Ä3NqİœËrd$8QiħhÊ𓛊™EÁR:çsĜ YLŠeı6ŭÎ:‡—_yĤ׸yó&.]şˆ7n ‰?š IDATakk G%` –s!Á#‹!äÁÊyLŻ #Ó2†´ŽTµŜE Z°Ħa`ıàÙK5!Ùá\E[²´9ua`róĊ\[ dób$T҈h”›dĦ`Ĥ3ӞÎoÚÏĤ‰Iĉıİ+ı#°üwúXÁ4Bá2`a˘żĴ1vTş·ÎBkFIXȧ´HWK˙71]M$Ë2FR…ä -8yRw€s€ĥB1(6ÛŜH^j ‘Ä"÷½AÛ ,}}OL5YŸ"‹ëĴË˜Â”ŠF~a…ġŻŻÛÚĞd_ca§ĵkÚ·ı€Üİ2qĜ6Êk9ÁŞgóô˜ŞÊ”ŸŸ‰İ÷•Œu)o+/ĵ·’,ċ‚琲Á›7ñ‹ÏĊŸCÛ <òÈiœ~66ĉèşu&À!4’7¤ğ!„³Œ³5È]5]ġĝ³gÏ>kŝÑ?úĊsûû{żċœ—Œ1 ดŞġL%G‚XœxÁTÓÁğ€nÖáûNáğŽ€Á`ıòĠ½vġ:^?˙˙³÷Ĥђ]÷ußï ÷ŜŞzóĜz @‚A‰’EÑ-q”ċ|J"ÑsËĥ–‡hrĜ^^+Ÿ˜¤DŠì$kى“%^J,Š€I 4z|ŻŬèù Uu‡sN>œ{oşŻ²“Èİúcau÷{Uw8uß;ûì³˙{żEݟ1?7Gk"Áĉœö˜UàJ…g^”X'*Â!qÖ[< …÷T’^F ”š8Ìd JVÛqıaĥGĞëük–7œìÂô#?A–üİ5œ=}†{÷î21Ñ×]êĠ+dYJ§3ÉÄÄD (ËÀƒJëDɚʚıI9ìLµ‚µÎ°ĞĦÖŒü¤‚ÇĤÄÀğKXk:fħ45ŻMŞÒiÀùĊOÀj֏[ #AoxÊŬÁ7?‚ħXï2ĦË`ßÙn‘Ê3jC;I0ıÁ{‰C³p`…ġ ğôŸ‚’šîĉ&:Ž) ëÙĜÒeLß&K`ĞËá(ŒZ•^¸ŭĵç+ĵa²%ĥú÷JÏçċAû=/OHӜġu/IÈzdYêÎògĵgµÎ7é9ïhaĊ¸‡­8ƒl4/6šiM@Út\†jéÈ}‚Âà…ĤW2C ħüŽ˘£,żš×Ġd‰ï×ÈönÁġG, ĜŜ& ÊÚ҃ğvÑ 4Î œ•Üs‹Ç_aċòfĉÚìÛ·‹½{w155”’HĊe¨ß­èöş(úRÊ7AüK%ċ?ŝĝ˙ÄäŽk tÇ5?ŽúÜç>ïŽ{ş÷7ŝĈ_.Ïóg£(JŠ"ŸrÎÍHİ´”ƒÉ­Š‹­'/@ĊâÒ<<S“8,ŭ~׳lyĈĊ‹çXY½L¤5³³óhŬ‡>Ċ áÁ—Š<ËĵÀ œñ]JÊÁ˙˘Ŝŝ ğĦëI³Äi`;ĵ˙l5Ñy†“‘ƒU5Ĉ9Μ9fo ë ŭ~kmy—ızġ Q³mÛ2µÜ NàœĞÊ{qµ^¸’R„À 9‡ @•ĥKÖÙ!ùAiK4´]-…@•ì0ej“c Ĵ˜ÚJ³[ħ­l‚r À[wí—`Ö³²`Ċ֚ڀÍu€dËÀ’ŞùÊ7z°j ƒV:pÄ,”ö–kuWż5Y‘—àM"J ç›Şr²,£ßK>ĞĤVed$/5´ħî2Ö,Á8|°…µ$‰.c‹Y–ÓŠSAf=£›wáÍÍĴŝ<777•\À_)›ÄĵÁXKžġk µ#°Ër ´ë–şI1Ô6ÙÚêÜ£ĥ÷ĞĊ\ċOÛÔێ t%M;²ĉÏΨ†¸ÍŸ3[§ĵ ,˚à5è£ĜìĤZ`‡çŞÜ"¨&û=¸öòÜJ"¤&Š“Ò1ñöÛoóòËßáÖ­wĜµ{™÷°sû2ż%"°>Oi£ Ž5)ċ˙žé?1ÑùŭħŻg˘qî¸ĈġÇ\_úҗíħcÏtög˙Ëç­ußVJOû1I–`óä„+sP]ìeÂÇ Ï/̳¸8GĞ‘f}^{xçîĞ++ĵsŭffĉ˜š™Ĉ Í*uTú”J¤Ò µïÌ·^£hEQ² ÎO6nĞĥš\•Rš…lT ĵîX×ÑıŜJ:èƒÉıÒÇzŻÉ”R’ċ=îܸYnħ[ Sž^_ßduu…[·î01Ñan~ c i–—Ç֘ÒA ( „”~Ġ3·Í4§pX ,ûFĥP{k‡î}¨­v:°µlĦ^ÀÀÛÇÍz— U  ŠXk=èĈŞXc9:< (JĞ2z×z{87H]%ŭlMċP->4q¤KŬµ˙^ĊKá?kKğ8kqŞô5Ċ’ö} ‚-GU „µ†$Š(Š‚n·’İĥŞŬĵwiû_97D^#i…– cEhs+ùsn Ëiš{‚1¤iJ‘ç¤YVĈùĉdYŸ˘È1ÖK<Íki‚-=–ġ;)J ŠĴÀż£QŽM·ƒQÛ˙•sBĝ™UİdƒHd9Ò÷~öaá3׏áñF526Ï9hĝRCÇıвÎáżĞÏ!lş ™éêï•\¨bĊ­óÚÜÊĦÄWĝĉܢ°œ={†ïüïĜĜXç=;8¸7ۖhwÚhŒ@‰¨fDa ³&<šöûż²¸ĵ|î‡>ò#ùxö×èŽk\˙ëĜħgŠ_ú˙öíÍ͍oct’´2çܢµ6QJaĴ J£E‚ugB*´ö ïìÜ,Û·-2ż0‹”gZ ú›=.­\áÔİÓ8g™ŸŸgrb!<t%ú½M„³Ä-UúÇ:â(Áš1œjNĤ4ÖŻÊú{%Ûİk›²Alg¨ÑĞ’™UĤî–^ZZdûĥeş½u6ğ=˘H— |980Ĉrûö^½Êf·ÏüüÓÓ3äı<ŞtPÊ뎋ƒ›0޲mjê‡|Pv’B¨2Á{än•6 Ê4µRs;ʕúêŠ1•JĠï²sŝ5è­ìèBÍnjEùŜ҈€}n²„Ííi)uŭJ'ëy˘ŝšWê•ëF;éb- (ü8HAÙ ĉ˙7R{Ɍµ”áú%_`¤™oXxmnżßŻï'MSúŭ>yeԋÁ”ş\ö`Ü_wžġÑÌTD•,·cjhĴŞ0ްáJV‹(¨ŸċÁ ½w›ÏX35­Éž6`M–ucîTĵ+‚Ù”Ö“ŻR#ċÍż7Áo¸è zó9 !Èġï1(ħħÁɓopâ×Âñ#‡Ùż“â8Fëc­w ħe“˘°kívr´×ë?ġİO˙ô/}é7ĈθĈ@w\úOQŸûÜç9vìéŜßú[?˙ÜĈĈĈ³Q¤§@ĵ'˲D*…Şfĵdíf‚Ħ$Enˆ"ĊÂü1ĆŻ¨u LÀıj~Ğ­¤”*5Â[™ğ ĝŽêz½YĞÈhï™ì“ì¤ô ”¨$”í·ġ1tVéaZip^ZbMÉrĴ)l ò}ëeëC4tIаU‡ŜŜUÁZHˈĵLèʲYÖ'Ï2a E–b²kSLı`M³EùyĜúól{FÚ[ñ‰Ò­„wmœl‚ÔœÖĥyèlÎûÑ&`l.ÈB7ĵ‡9 ċMg‡&m6ħmħŞkÚĤ•Ŝŭt·áëBÏ^)%2Òô3o[§µ÷öÇĴŻŻqê79{ĉ4RËúÚӓs´; *Š|Bôžş <ûe!‰Ú(}ÌĤä 'µf ŒüZM”ŞÖ‹ İĴҌ1u Ä`b7Ĥ`rr’;w²}ûv„Üşu‹~ÚĞ=V•ÒD‘fmm‹Ïsûö=:6“““(-‰´öáiŠDԌ\ÓòixrVU× é͕[ŝ˘Ô[ëJIFi…µĵa óUirċ@˘ ꆆä ġqJé@ô Ìm½°ƒ€‰Ú{7íş@>dĠBŬdÓkµİÖZ×A ³[5Î)ëĤ.Ï`ښɴv° °%³şıÙ-½[H-°” rƒ$t Ĝ ynÉs˙Y†Lqž{+1c-ƒÉsúiŠĥL<³ġóY-¸Œħ(5 èœ3ġkŞI- gCÛÔݎö„e‹ĉµiUv_6û>Œo7Yĉ&c< ¤ß AyÓġĦiu2³£ašIo͐Úı‰1E)aRܸq“ǏsñâyĤg:üÀcsàà>TùsEíÒ9!M ”’X›[­Ä;֚g¤R˙'?ù3c;1׸ŝ¤ĠħcO÷ù—ñı^Ż÷Ĵ)Œ–2Ê"/j%kSùGë“[ziVêO Y¨N§â‹K ½NŽk,Ğ+—8{î,ŭ~ùı9’ijœ”MZħŒ8ĴñYò‘CïÍf™˜–PS37"ˆġ ÎÀĴi8_…vŽ/V**Íŭ~ĈÔ̇fzzk-½^cs’Ì{d"Üs›k×ßfmŭó óD:ò@Ĵ¨@£¨·²İIĠ6µbb›’ Wƒĝ²Y ߈§KàR5Uà#œUìÀÀ!ĦŜlÌM .ƒĈµ@×B!KïcÊëR÷ħ§ŞÀµ>œ#d›vOÍ.WħÇ8”( 8íéŒk6ٕ3OûôÓ S6„—3ÄqL·Û#Ë Z‰,q$‡äŭœrĦ›]ï¨ „ MSşŬ.E‘‘ei-‰ħyJžĤ”A „PÂfĵ­-†d ~ĴŞŸ˙ÌT‹°j\„²Ê#7 {šĵ”ş/˲½ïV£ÀÖ€aë²wk& ?ë&#<Ê6mĜúËŜ÷Zšá)ÍÀ•ç`Hï,½´'Ï ˙³&5çÏ_àĝñܸq…ù~è ìŜU†ß(”ŒħVĦeLa âD"„ÛûBnòÏMÏN˙ӏŝè'îg“q}ŻÔ8x\jëĝË߉ÖîmÌEñ¤ĉ/E-=]é şŒóUÁd] ÈqÎ ¤+³Ŭ-/­òúë'¸²z<7Ü[ÛÄ:Éĥ;ù‘ùa>ÈÔÔE‘Kß­ Ċ°CöF÷3Żí¸``7ĉlȈZßZß`{ŞJ’„˘l]ÇeÇyŒsEİċġŒoĞíœ~˙kżÏİS§0EáY;+0ĈE QÔÂZÂâï˙ûyĝá‡ÑZÓën–ì¤Ş@54„^/è„İïǕ–T^B °ĈÔ˘N\ŽF>›êûM-ÖşND“á–´sXcĵ4AŒp3Ê·gĊ@6üÜ/1b[+€[ğċsÄqLžç–Où1öàÊëróħ͔ÁQϟ”CùıA?ísñâ /żü2½^ƒöqpßvfçf‰Zħ××Ç1ŝêÙ5kI˘˙EŻżù?-//­<ñÁŒ›ÎĈ5ftÇ5ï…úÂŻŭşŭÊħ£Ŭżù×˙ÚKY?„TˆĊ˘È“”äEŠÒ‹Á9…qÜBżEnŒcǎ%vìĜFÒÒäE xġÛ7osöìYÖîl0Ġ™e~vÁ‘†^o½žLFMˆÀÄ꙲5ŞŠĊ”9g ‰P^›‚ÜŠĠµVÇ­RĞ+Q:Ĉ:‰5Ġ„ĈĉÄQLwsƒ³gÏÇQÙ ċˆ¤ĈÚ“{Ï×ÍÍ.gϞeġÊ*­$a~~ì¤wHİË&WsŞ[$ÒG'ÜXmó%ä Zı^Ĉ êûŻ·¨C”:T6]. xaĜ…ĞY`œ2ħ.†(ŸñğĊ5>!ƒ> ä„ïm‚´ÑB œE`ËPŽÒ Äùíf!J¨Ò°ß•Ħ…)°Eu‚4ícŒ%MS dQ¤ŸfäiŽu^o™`Ĵ#KsşŬSx[°^ŻWË\Š"óÖwE^3ÈB¸Ò'7/›Ñò’ ·[ü †ħŠmĴÀc¸¨ĈĦ:oèXÁ 7ÓšÖ][4Ġ#d&á6Î+Ĝ x™çûYĝ½;<Šinc‹F?ĝZuŝ&³;2R;RXçĵÎÁĈĈ&§OĉäÉÓH)9|èğ÷îdyiİ‘Jˆ£ÖȚ™7O‰µ8VG{ŭî·{ÏîkżïÉqœï¸Ĉ@w\ú^Ğ/~ùËŭ_ŭ_|nmcY“ZFÒIÉBVdħ*už&óMi8yĤGë­U-%Ĝħ}‰m `½s`2Çê•UΜ9CšĤÌÎΐ´"ŜÖB#„`}3іOċ#dËt5!˘Üz×:.›¨#>…CÑÀ5ógm™'ɲ̳‰…!Št ĝdz¤#Éêê —/_’Tċ‹ÄaĵŸĤ’ kë÷¸ĵr‰;·ï055Ċìì Ĉ˜ş ÎoWĜNÇŞÜB›°Âd0İW WP6Š•ı&p›¨ì‡ë°G t+ /<˘È‹Z›['³…€œĤ2ôz­€VäšĴZşBOᐅ òl3¤-À˜Rڃóštg %Kû1‡Šĥ°ÄQD•ŝfŒ×{fĜƒĴ45¤iŸ<÷[ÚišĠŸs6óĵO–f ZŞRАûX_ĵ•XĥÑL) Z¸ ½k•RµŭWu/@íÚQiaµÖCÙêĝCìFşĞĉ⣳÷[”„_ŻÎY]{ġù† î¨ÈáĦgş)Ÿ X˙Q1Ĉ£@ñ(™Kr›_ßâáÖ8´Ž¸{篿ö:'OžDkĊáÙ³o'“íR âH£”ĵSŒ_ĉH)Ö¤G³,{êSŸü™;Ÿ˙ÜŻ'‹qî¸Ĉġ½Z˙Ëç>o{şû żóÏġ6ğżëŒ›VJ?¤L^ DJ{fËX¤òñİÖş²J373ğ`fzDÉû82ú½MΝ;Ëċ•Uâ¨ĊÌô:ž‰fZ“§2RDqD–ġ<ˆŒ4ÂIĴ‘Äqâ çġŞÈšHZáU¤e‘ó`ğlú˜ÊÇ5èċëdÉĈ šÛ$Iœpġêu.]¸D¤Tmǵœpä&£Ŭj—@Ò`ò g ^½ÊĠĞW˜ššdyy çŞĤ$?gİ?~+i0ä&Gë% %hö zSêLó"'‰~AĦ”˘0‘ÖàEîe‰*C"ŠħÏ9Ò´ï™\Ÿ$€5&ÏħĈ;>à,RtàŞÑÜJW³ikK£eùlyŝžĴµdEµN.KÓÔ'Ĵġûôû}Ò4×ÛĴġĉĥ0kè§=²,C8SúùĉAә †¸B2£*dg›lo82ŞÑK)U3żá×CÍj( 9Xè '‘5 BOĈ˘¨…³>Á.I:…áÜÙ·xŭµ×èġ7Ĝc‘ƒ÷ħcÇv’v•Ĥ¨ŭ.ˆ”DÚÇpgYĥÇñżLÓô˜èL~ûcûñt<Œk tÇ5ïúg˙ì öĜÓżĠŭÛûo|ĞÛë=i=iûpLH„ht÷{ œì eÄÔä4ğvífaaÁONEŽq9ë\ıò6+—Ż`ca~İt ş9ŸĦ`Ë&ŸÜ³§Î”ÀŠ”†Œí€ñq°AÖVzP?ħZ\üċ'áĈree…••Ëh­½GTD‘ĉĦ‡fvv†ııyvïŜĊìì,½~µµ5&'ĤR²´´Ä‘#‡1Ĥò’Ġh­¸}ûÏ?˙ùäGìx×èŽk\Jê׿ĝeûÌ3˙ĵûÙż_p¸ÛRIYĊvTâ}hĞI \ÙċŽŞt7°ĥ`bb’m‹LÍL”]óP¤–µµ5.żÄġ·ŻÒŠ;ÌÏÎ^O)D‰˜Rû·ÂX,ží4…Ù”•˙"lŞ4Q™RbP‚r<ĞiĴ)_?ĜN^]]ċʕĞ5K,„$IZ<öĜû˜ššĉŜ½;ĉfÏŜ=>|˜v§ÍŬ;÷èvğLé™ê”O³-58PÂ_{ĞĠââĊ üÛû³şşÂï°rù2³3³ÌÎLRŜĜZë%Êë\Ğ6k}†İÒ!͕‚ÜŞùĞÖċÖr/h0Â2`µÒ(­|0ç‹0YK”Ŝ&ĴdEá_9HT uċߛLdSë)…OÍSRx=²Ĵ¸*cŸM–– œ)(ò [”z[gÉÓá|›- ߨgr/ípG…&Û9 \6Yï&hm&È5ÛŒ´ ŸïĤDân£^ IDAT~ÎMV|#ünLtóú+MnègŜû(?*í0”ż+°ĥÚÉpġMĊ aëÔ9˙s[ŝ ïMmäžĦ]_żÇ›ŻżÁÙ3§IZš‡÷ħëÌÌNû„<íŻßÁÄġ3[˜|ÍYyÇSŸŝÔÏÜùÂ8ŝ?1׸ŝ4ÖѣDz_ú_|ucców³Ê9— eÁ%Ή ħ $Żġr­c”ĥ(­Ùc;ËË ¤Yĉ#] C–§\ğ~óβħĈÔÔ$33³>‰ÊRvş+żÍ]nYk­ĵN·a•t?вQqŬ4T1 šn\ıÂK—èġzġ6uÇ9r„İİİzÒ5&'ŠböîÙÏ]ğˆ˘˜ċċ%ës…ċ…^àĝñH)é÷û!Ĝ³o/SS“ċ5yfŞb$CYFu/ĵ"WŻ^ĠJÁ;wX]]affšùùù¨Hċí•ê_tRÖ2H P5Yğ2à<#ÛtP­Ĥ,ĥ~Í`ËŬ€uC Yµ^Tù`‘üVÀÁŭÜ@-dGْ…l~Iġ!…ĴCBl-eq[àĴ˙ÜĵÄÁĵmċ@[[]§0#YÍĉġ…2„ws%hJÂ&Ğê*ǎPw”ÓE§²ıĦT²ĤÔ ÏĠ„ß Ç8|ox‡Mlá÷ñİŸ ĦJ“ ä6=rİ“ŒĤÚ7J#„ĉÚµ·9~üŜr…ı…ÜÍÎ]ۙšžD•MĤ‰³ cEaqËö–3ĈŭOú§ĈMgú,=‚qëßżŜóžG àÖñß}êΝ;3À?ŝ+`^ú\Y?Á)áûÂJ'Ïs¤.xmÁôô4ŝ‡8tè6gOżĊK—Xßè²ıħĈ·ùûœ=s†}èI>ôĦĦ£yÑ'Ë-*‰‘ÚP8GÚíҎ;[&äĉßCĉo iÌKP&—)‡PĤ—a599Iżß÷­íÎ ²À::ÁĉıµlÛĥ“ÙÙŠÂK:ĤĤĤyá…xċ•W†l¤nܸÁÊĊK,Í/ …żĈÂdHĦK gj@§µ&Ë267×Z`LNżßejjŠğwoóÒK/E¤ßï#µ*Á›]p2‹0 C!•#ƒ­?[ĤÚ *\HTN JËAƒYVĝÔ²ώsdÎ4ÇY‡)JÊ*mU`)ܢWb K=0½”Ĉ‡?ċç\ Ĵ °äZ£°…?fžùÏÈ_ÎŭŜ->7yM'†ĤœĦùìŽbfG{Ô{›£’ÈÂħ­€kĠäĉb#üw3l"tEĝ£j Ğ$X‹4"•üEX”0¸áS(í ½çqE\|‘“§OpóĈ;ìĜÀÁƒû™›Ÿdbr²N*”"ĦÈ œ3•ÛmÔׄ_ĝÄ'rœt61£;qkP_ĝÂŻÛcǞîŝĠżö—żmí$Bˆ%ç\BÉâzIƒŞrâ¨:ċK•şĠéé 瘞™¤(rŒ)ˆ"ĊÚú=Μ>ËK—‰£„ùıe˘("Ís ëX#­“ÂF4â4·U‡,´Â•“ßĈĴt‚RHVWWY]]Èœ#IÚ<ú裴ÛmĴħè(˘ßOÁ şŠġŞ"]ßx ñoĝĤħÀ´ÒîßżżöA­ĵwC+¨(Šj'…ĞWŻrñâĊúÒ2Žĥßï³ııÉΝ;™šš"Í3Ż›œ Jö´²x¨œ Şż‹ÊúĦŽöŞĦ!ȊxéZkkf<Ôm†ŜğÍfµ*ĥ7f!;\éPC–´(ÒŒè jLĞÖ×D¨ĜĠê>+ÉF¨“m²ĞìşŬ"Mh6ôàmŜï¨q ÁnÍì7üqgĵiC6äo-½eœ œİz  d N`œĦÈ-Ĉ8żSdŭÎљ³§8ñĉëlnÜeïŝ8rd‹‹óġ³İ”+‰–÷böc½VĊQçÜ/´Û­o|ü;ŝ>1׸Ĉ5²üGÓ_ŭĠ_ŝ;÷n˙çĴ֑ʜcÑ9“TLk‹rĞŬQ䅷²’8ŠPBҊcĤ&&Y\˜§Ġ‰ÉóĴL9ƒĠ+osîÜ[lll0;ğ@gr‚ʈJݸlRžYb@bĴ#ŠbòÜ "…qK ´ *Ru8‚•ŜƒµšĤ‹"GiÍĊK—¸~RzJELLL裏îtüÖĥ…HÇ!KŬŻÏBĦuÌíÛwù½ßû*·oß!ŠbŠ"аµ–~“}ûö°cÇöÚġ!Ï367×iµbŸÂfŠz ÷êĠU^]•D˜"/]ĵ¤˘ÛŬ`qq‘íۗħï Z·˜ù¨ZYş$8cK0UáÛċŞ ¸:[ş0le+0(µo$rEbl•‡ a ‚RHQ5Ġ€yžL…–ìiCÓjĞz½@ …C¸²SÒ90 „×ë2q.h•¤Ħš­VĞnj”RcLQƒñÊî+”4Á^32·ÙìĠ”Ô„Î5+€Ŝ™m#”4-ÑÂEHQ˘qÍ£d áçúĝ6_S/\TŽbžĞôÏUì°wËb ċMsR PX+PN똍ġ Ο{‹SgŜD*ËĦ{9txívĞ^„yĥöñŬ˙~%֌1G3O}ĉ3?uûĜħ§ÇMgúŻħta\ú˙XG?R·^>ŝÒ˙xûöí%Ġ/ëHŝç8µËZĞÁ'O)%‰˘V=éċYŽP'm´Öt:fĉĜ}.\àâùK´ÛmzŬŒç_ĝ&gß:Ċ‡?ò~ĝa:)*{‡V‘e)y–“$1EQï§5S¤BŞ YŒáüvğİß|Í[6²èšŭòZZ„L„ĥHŞtièÓíĤ|_çĈwZ•M5ŝu>žÒÔqîÜ9Úí6§Nbcc“ğw½T0IZtğžŭÁü!Úí6GŽ<ÈñŻRäıge•$M3²Ìoeċ2‡Ëf´o­“ö0x˘Öòş2]L”Ħ•M[d…zQi}';Ĉl–ÚÂö‰+C“Ñ n¨1mÊ ”_”‰gMÛdbĞcx€ŞjfOkGĉŠá1jĝ†^µĴ´ÌÍó„€sk¤Û˜Ž |ĠŒĥ Ï7ŠYÙĤô :_SV×püĞó†€:dGُ5[c̖1NÊ3e촏oßç\ù:4iıqó&où—.Ÿgnn‚½`׎$IËğĥ8KšĉL*h`sĊšµò(Ôg>óÓc=î¸ĈŒî¸Ĉ5˙°úµ/|É>}ì·şŸŭìñB–e—–ħ”ìTZ&Ğâ#YJEŜlj gRDtÚmfggYXX`iyër¤2D‘`³ğĈı3oqïî=&§gèt&ˆ” ÛŬÄ:KG…Ÿˆ$öé[Âğ@ˆäùÉÔ „Äş*èB Ph¸|ù2WWV}ÒXi7Ç=ôqĴĊXc*p¨Èò‚‰N›ßû½ŻrêÔiœsôû]Ĵ5LNNրıŬnœ’xé?äwŜauġ ½^VĞ…”’ŭû÷³ĵĵÌôÌ$Ĉĉfmŭ·ïÜB*A‘Háˆâ¤d ‡B×ì˘ĜĴ ÂûW€şfT–^•́҇V m‡ĤŭJŞÚúĞŝZŭ-ZZUFW<²u#½^Cà62Ġ Ŭyk¸ûıŒ :`G”á´5+ĵ›ôhaUèCÀéy‰”ŒltĴnÒC@‚ß­‹ĴÑN M nPG閛R†{ÔyFħM{ıf[Ć.M^‹wÜ%Á GarĴġ ×8(â8ĦÛí˘P´[-]{›ï~÷;ܸŝ3s“yèÛ·ÍÓjwĵĊ˜TDQŒVqicgpÀ9·Ĥµ:êœ{ꓟüÔäŽkÌèŽk\ú_ûħŸÜ8söÄ˙şşşò{N¨ż›ċù“XġDğL;'Ȳ˘tbP]Ĵ­˜‡1Ž™Ùff'Ùħc‘••Nœ8Éġë7È3ljŻrîâEŜóž÷òá'ŜÏÂÂQ‘Y_šg9Ö: ö şô…•Ġı òß§6œ­Ù=°ZvPĠç+e…5†8I°Ĉe)Óӓĵòò˜:uŞ<g—*­oöìÙĊ?Îôô4Ï>û,7nÜdß}<úè£<ÀÌÏÏûëÈMYşAüÈ˙0Î:Nĵq‚vÜ*cKiš•:⸛C÷ëĴZÚ[kqĠm;끞m0ێ‘Ĵn¸Eßd(›€*tHa—żuµĤ·˘GMÙD¨u›ÌbÈ~zîÓâ8)ŬÔ}k¸VŒn%Gx7 :މlT×ŭ€ç¨fĵê:BEѐżoĝ™4u³ÍñihoÊ#*=ĥsnŞĴôĊ!sŬĵŻj~žMÇUş*£pĝ‘,͈˜"3œ;wž7Ŝ|•;wî²g×:ĵ—ı)ŒI1EÒ18Ižï„5°ZĞŭ,ûíHŞô“n rÇ5ş׸ŝ¨#‡5À­żŭ­§úŭŝŒúïçyŝ1çì#RêŽÉ2„ÔĈÓ;Ĥj-JЧ WĝIufr–ɇ:ÌÏÏsòäiΝğˆ5†^wo?˙MΞ:Á“ŝ0ï{ì1ĤĤĤ|Š)!hıuY)P…QXáPe3‹g¸D"Ž-öOIĴˆ´w(0EAGhZïġÙé´8á<_ŭêWÂOĥ­VË;!Hè÷7YZZâ}ï{??ŝxù½ ­:ÂÇ>ö1fff(ŠŒnwÓożKµĵ4wÌÎ,òĝû?ÈúZ—;·oƒŽ¤Y^^* Ê„aÔêĈëf:y4µ³£Àebš[ôCDz%“^Žkġڑìo#,EU ¤b 9ŞIkş"߀¨ġHiD3B·ZĜäy^Ÿ³Òï†ÇB†;d§C‹°PÛİ€ċ×[iĵ›R½ßŒß&èo~VM­os,›. M&¸İ'n.†šž½•Ġ2)C\”·–³EA–ùç3Ír.œó!)Ĝ‚ïcϘ]˜ñğɔ·ċs­ßX’v²–çÙsĈĜ˙szfê·?úg>1ŽóןÊKĈ5?Ĉú/}Ċ;úL÷çŝżùƒ,Kżİ”š–R4&OtT…:TAĠDZWìŽEɈ‰İİڛ6iEŜĊAXz½”'ŜàúµkLLL211Q3NEžûˆbİ~­Î§ƒù ˜8B8ÒÔŬï~—'N?ñìŜ½›ġġġ²ıMԉiĦ‹ÁŬğw˜žžĉħÇC+Áf·K^äìÜı“=ñ$‹‹‹ĥ8+U`DÈnŠhİ޲% S•NızmÒ*iCè8Pmч@i° pADh {?ĥsK2Vĵ0Şîǰ6%MɰŽtpïèM ^k˜6ʊĴÉl6ƒšÒƒw ‚hzèÖŜÀï"chúôŽZhTcJ{ĥáhâp1Jє¤„à½J”ÒÌäYN–˙vĴŻŻóêñW9sĉ$ívÌáûy`÷Nfg&‘Ú{J!Eìkœ#Žc´ÒkYŜ?*„ĝ;ÓÓS/ŝ™ùxoüÛx\cFw\×[=ñćûgÎqòòĊKܵ8ŠžÌ³ŜBëi­5JÄö‚sS8˘h˘dÑ2&ÚÓɽ{÷˜hO°ĥÎóÏ?Ïf)Q8á<?ô ív›<Ï"ĵÏl’$¤iŠsŽÛ·orúôY\YáÜ[gx≰o˙>ŒħĴ­wét:ġ1´V;€¨™:ßk†d°­^b:Ĝn_ƒ´·b¤ĉ´)Ŝş÷Œúh5Şk觛IdM€–kĠfŜh6ııÍ_ƒ9ëüĜ‹˘›çĞäMŭrÓVĴ:W¨‰  ­_I#Š˘¨ÔB <ŠĊpĞ…Ûğ1²Ħñ(IISž.8ĴġnM¸PŭiL9ĈâĴo¤(¸~ŭ:'NĵÁíÛ7YXXd˙ŬlÛ1O$JƒS­½üH' YÚ÷ÜZmnĴm·ÛO}r rÇ51׸ŝSÔû˙pÜ|ŝĊo<µıĥĜJZżéègMQLëeƒÍB l ŭ“B!ED”tH–§ét:lÛĥÀÊÊ +ĞosŻĜÜ\ùçŸçÌÙ·xìŭäÀ´…gí߈&J{#) Î: PÚí6RJ’$Á™M˘É²28W UB.k‘ħâÌ'yùğ/#qXW #ĊĈĈ&­V‚s’Ç{œ'>ĝCdŬ %b4š?ĝƒxûí·‰Ëmñ‹ç/°ĥĥĈôô iš!ġqş@–ġk‰G/Ŭ@Ëfw—ŝŬríë|è‰sàA:Iz½íĥ$Ñ%m-ï a((J4Ğ‘X[úTÍF˘ˆ6÷ [Ĝm_ħÊğ­“g×4`kk)„ZáDÙì>ëU;0;Ôl Xú†VĵCpVyàV 2ĵĥ<Ï·ÈBv´zMĊ^c(œAXτWĦœĦò­4ĥŜğX…‰„÷TgȖ6C)š‰cM[²JRPí@ŒbŠC­p56ËZˆeYV˙; ÀeĉŸ‹ÒžMċ) ƒ@££¤^hùT:żxÈ Ağ=AŻ×CHH☷Ŝz‹×_ŝñO011Ežg´Zm^Yák_˙:yQ1j ÌÍÍħ{÷nŒñ>D–&úžñ:~ü8·nŬÄXäÄ$ׯŬàĉ͛<ĝàCLLLÇ1I’pïŜ½:ġK*U‚fŸ'dEŽpbˆİ€ĴJ*ĥ4K Ùeİ*ĥ—- ċŭ€VĠ'C÷„ŠħulhzG]çğħÍTĵ•n^Û¨TŻ3x”7ĦMßŜQ>şM`2¸M'„Q‰d”%Ĝ(&ğ™XŬ°É²9&ĦîyXO;|ŭèör]ÜÁı|XŒRc Y–#eġıú!#˘ĤÈ9sö,'NĵŠs–ŭ÷²oÏnĤ§'ëĈ5Ż;÷kY^f)­vĵ–féïcŝÑÔôÔoŝÙ?û‰ġño×qk tÇ5?1ġ•Ż<Ŭ˙•_ùċç67ğÏ !´R*ħ$‹Ž$Zù­Â˜Â ^ĵRIŒ…H'lßĥĊĊ’(‰ë ĴÉyëüYÎu–"ϘŸ[DHIż›Óiµˆ•&M3ÚQ‹HĊt{›ĤO§31Ùâ=ĥ£MoáşB ;ÊE!”ŒŠÎsóûĠXyf9”ĝĉ2Q7ş2òÛamQ~O“eĈXÚ­ÉÒpEpïŜ]Nž<ÁéS'‰´äĦƒ<°k““€+“ÎiÖ'I"˘XÓO{´[í5ôQpż433súG?úg³ñoÔqk tÇ5?qġıÏ}Á=öt÷Żŭ•żò­´Ÿ>Ğ#=iĴÙ'…œÀ!Œħy˘ĜûĜúF+Aw ´k%1ËËËÌ/Î{f6Ïĵ­WŻË™³g8î­¤ÍââIœöû´’J(Š"'Ž$QĴ)LNžgXëĜıöî=€RŠV§Ċ}ûHZĈä|ç;ßáäé“HiÉò”$Š0ĈRÙ,,.òc?ö1’ÄÚİÉ nŬşĊ˙ġğż‹1†8i n·Ëž={ĜĥmišÖ€CJAùÈÙ7Ŝxƒ4ëİqÜĤ(ŠÚ…ĦŬnó;żó;œ>}š‰‰ &''½Í˜Ö5“'ô0°kxȆ:Ûûıĵ[AȎ6­żšŻÏ‚ĉ&{Ĝlk2ŒMMk%Ch6h…ldsk>ûs/Xgo;…1ۅ$‰“Ĝwş›‡EêkE™ĥfˆ£Ĝ7PIÁÜÌ4;wlgvnÚ3Ÿ…gïÜ˅sç¸së.“ fgé´Û8rÏ>İDFXȍÁ¸‚ŭöħsÇvt¤Ht‹ŻżÁ7ŝuZħĈҁ–‚H ˆ“„Ç?Azèa²ĵ(“È,+Ğ+ĵöêq”Ò%ËċĵfX€µŜĤìàÁƒN}…Š4íñÚkŻÓíö0ĈĤÎ$ ĝÀžÀ9‹/H·ÛċâĊ‹Üĵy­5‹‹‹Ŝxż(Áˆ“~Lċħeıŭì†ä÷A!ĝĤB›Ĵ¨… Ïƒ­‚**›3·Ġ ”KTÇeıjܚħĵabYóÚÂóV@°™lŜ[‡Œw“­ĈšM9Ĉ(ö8ĵĉĤ$lrkĈWï 7ŞAo”nġïP÷ĤZ<ù¤9Qko­-;Êâ°>"şdï³ĵ!Q BrŭÚ^ŭ8o_½ÂÛxÏ{fnaĈ§óiY&*òÂ7V*%}B`ŻyqT ġÔ'?ġSc=î¸Ĉ5ş×÷V=z,û{ïï½şŝğJIµÎŒħ‹ÖÚD)ÎòÜwœ+á{a,ĈĤ× ıÙò’瑊Ĝìvıĵr‘so#Ë2vìXffvڃc½q}İ”ÚG c ²ÜŠ5Ĉ˘„ââĊ‹\ştžĵè#pH YżOEäĈ2??ˏŭĜÇétÚĈù¨`[úkŻħrùqœei ŽĵWëc dbb˘t_^ŻÇĞŻÊĉĉyž!DL–eÌÌÌò䓤ßïóÜsϕàJróĉ-.\¸À½{÷XXX`yyÖ²,£ĠòNB ĜOk‹ÜTà,ŒmÊš ê~ž´£ĥÁĞ4YĈ;ç°%Švlş„ ³İO Ùà&°mş!„ŻĠ|eRX†ïkzŜ†c²!xĊ ‡ò„{á=ÜÏG¸y_M@ŜtĴċ{Ê1š ĜŸC0Öû/kżañħß8N•A‚n·ÇġëoóŬïĽ{wĜħcGŽ<ÈÌì$ŻŭVşò.ètZċs›Û(ŠŜ1Ĉ<Ónµ˙áOüÄ§Ç w\Ŭqë{³>˙ù/ĜgžùÍŜßü›?˙ÜŬğwŸ˘x*Iâ÷¤išdYN)0crœġŬ‘Šˆµ&/,4hUJħ}yۗ·û3—Gšn÷.—/Ÿgeċ"N–—·!t›ÂĝÉY*…ÖÒ³­ZĉŝĝJEĜĉĉf™ŸċîŬ;7Ñw  IDATgĦlü2ÖÒOSĥoßÁ>ĝDé–ࣃ£Xñġo|ë×Ŝ&N4yžá„…G¤#şŬM–––ÙħcÇ“¨µĤßOyŭġdYż%ŠVĞĊäd›Çœ<Ïùö·ŸGkE?íúĠĴÏ;ï\guu…,˘ŸŸ£Ó™ ÛíĴrž<Ğ,DĊ"ƒ)]Ù|DÙ°6 Ŝ*&U ‰D˘•B8Q³ĥ!+(ĴŬ \ġuÇÈ&ĴQZ‹ÁôIv[~ıĦ!›²ŸĦŽĥë&l²ÔïĈŽ6Ż=Ôŭ6] Fħ£$£çßÇJí~çiŽkÓġ!ĵû1Î&8”k¸òY¤DHĊ­£gĦ(|àJ–çœ>{–Ç_ĦÈûìÙ𓃇™lc%Š#’8ñ Sİ´ÒXÖZIë÷ma-ÒúŝÄ'>}oü[r\Ŭqë{ĝĊ/Ùßú­ßîŝċżü_Z[[â8Β$YÌóÁµkosîÂߨÓn“Q¤QZ²ħɅ XYYEJĜısq—Ç7 VB;…#9ÌĜ…™äUö# V1^•'m­muĥĥ7 ³¸ÓĤp…À+Š"ßô‡Ĝ’ÊVéGCÀ[W‰_sÊ0Ş×V6cM–÷~îaB\Ĝx2ÊÎ9²,ÛáÛdg›ŜÀ£ÀôğÑPG‚ĉê*Ŭö¨ĤĥêüMK²­ÍkcŠÒSx}cŭbQéá/BÖÖîñÚkŻsöÜ[´"ĊáĜw`/“ŜYĦĠnƒ4M‘Â;zh­È³l-Ž£Ŭn÷ïLOM½ĝħ˙ä8él\ŬqëûĞò•£ŭ_ŭĠ_~nccŭÙܤZi™IÜ"N$8p8Ĵ$IgÖ8áJK„3DZ³¸8Çüü‹ 3èH)yšqŝÂEŜ|ó&7Ì/.Òiwüĥ~cŠ’Ñ g@Iß Óëv™››a÷ž=ìĜµ"Ëı·ĥ†T?ü‘°ĵm½^#&''¸yë&/ĵÄÚw‘#\)AÄqDa ¤ô{}:ÀÌÌ\ Nâ8ĉîŬğœ:uŠġ:\£Òà>ôffĤYX˜g}}{÷îÇQ ´ Ĉ8şŬM.^<ÏĠĞo377ËôôJENX`­—hĝ&"U2ĵĠöµ·`ĤòbµÖzÛ2ċ[a L  SżLŽK ,€5LŬjnó !°xIˆnçĵî×mMóĠT&ljŜSÍ@7šâ€Z^2ĜGQ4äƒ[ٖJy,\ĵ:fÈĈŽÒê†×=Šġeµ6JòêÚñv„Î&^KëŸ'5B*œ•^B„¤( JFĵsŭǏgeċ2s3Ó<úïaûò­ ”HŽ*"áŒĦÈsğEñÑ4˟úİŸŝó·żrô;ŝm8qî¸Ĉġ}YŸûÜçíħcÏtáŝÖ·şŬŠ:iÖ_ÒQ4%Êc}ì·ş᳟}^HyFJÙʲ|wҊJÀ£”gĈtT²YÎbˆÒi@ë„Ng’…Ċyĉfç<3%rĴ5Üşq› ç.pú-&;ÓlÛĥ€’,ë—MSŠ,K‘&WkM7í!„b÷îŬìŜ½—8î`Œġ‰kʁĴßçċï~)ĦÓñ–cBz6×ï/êtğ}Z­„‡:RF¨z`tŭúUŜ|ó͐E^Êvò裏R9Y–‘$1ûöîe×Ν$­+Ğ+lll095EšġkYJÍùóçıpáE­ôI­XŬŠÙġà ˘(Ŝ²u_3§ċYž•ԍÖŜ֞в f G9* ³ħ!s)%BJ„òĴb3PĦi3Ö·Íó‡ŝ½ĦCAQġñš^şMÜ´ŭ AÓĠ ÙçŬ4³£tĵ!¸uÌŻ7d~C ³&Àp‹Pŝ3(ĴĊ8ê˙aïM£$Éîëß[bÉÌŞÌÚğz­Ŝ{˜ÁBbLS$ArHì -Ÿs||H‘ S$Ep•aÁ‡Ñ˘?ùĜĤ`S8Äô̄}ì#èP6IÄ 3˜­gzß×ꭖĴŞ\"â½ç/"+*ğ’ÌE ÷KuVfDFdvfŬ¸ïŝïB‘ƒµ`ċÜı³?~œġÎ{çöpè~ĈĈFŭ*Pù£Ê?#gAqTkg&;f­}âƒúħŠäV¨PŬ óÔħ§Ó˙ö˙ÍıöjûOв !™B¸h½³†‘1Ŝ3Ş$JE8'r)@)Ċèè(““4ÇĈPJ$™É8î<çϟeee‰ññ FGG½şk#ġŻ\‰ĵĠ9â0ĈK’„P+¨ċµRJnŜàĉ7hŒ4hŻĥ}Ŭħ€4ËH³ !ŠlR?œĥsçNĈĈĈ0ĈÇ1÷îŬáäÉSXkóœ]Ÿ155ĊÑ£GÊ= )ĈZccìÚı“ıı9V×ÖhŻ´91sX:ëëÄqµµ5Μ9ÂÂġzÉÉIÂ0¤×ëoRwƒ@oŠÚjhĞL†ÊDüs thŞ· È- Dò¤ô–…ò³ËâħE!‘-+Äċ²‰²]a˜ç[¨ż…w˜ĞÇk[Ù†cËÊÉ eòpÁpJDqŒJnxr<|1\´ñ  ż­żPÉòè<%5YjŭĊ‚,Í8{ö,gΜ,G:ÄÜÜ.˘8DHß(ò1Â,3h­rŻiK!ż–fé˙]ĞĠŝ‡}Ïû+’[ĦBEt+TĝÎĊ˙úżŭž;öô3Ŭ_ùĝǟoŻ>çœİ9gÇÂP:ç´sc‡_ğá*á­TĉòEHċ=¸*À9IšxKÏÚÚ*oùçϟgd¤ĈĦƒÙ;·‡@+†( Ízi–Ç1i’’fYğ׎9Á?ŠâĝßüàŭÈzġ WĦBEt+T¨|ú3ŸµÏ<ûùÎÇ>ú3_ÍÒôUç¨ !ĉ¤B H¨˙íɆWÍ8‰~ÀLŠİİ)vì܆ĝœ\!h·—9~üMnŬE³Ù˘ÑlD5úIŠ’‚@‡Ŝ+jQ“ĤRd™!3q‘$)++K,//zΤdĈ`² ­ĈZOV…ÄÒZqĝáÇöÒ˜8ñ& $Z3ğm–öÈQ–eh Žˆ€½ó{ħÎrúÔéÜ[İZ‘e^!ö6Ë­[·¸xñ"I?aff†z#fuu0 |Npšl"‚ƒ^erWVxÊkGĤd^7ĵ‘Ö0ĵ\>L’ ‚§µĈ 7ĜÎ9‡³dáĜÒğ:LÌ·j>^ú/tcÌ@á.Ż(ĞĊJCĜÊÚ ĝ³M(•&ÉjEÛJÙŬ ~䭞×+òA@–ùAM) 7y7¸|ù"““cì?¸—Ù™”òñÔA •véöû}”Ví8ŽuşŬ'Ŝ˙ŝ->ŭô3ĠY… Ñ­PĦÂ0>÷ı§Ó'žxâê½{K&¤Ò֑Ħ§@DÎy‚¤´ĈX‡ËۚıRç,aRc„pìĜÉ‰Nd>F ÇċKW9~⠝µ”ÖX‹ħ‰B(zŭZ)Œq:À:˙‡]+‰R’ħV‹];gÑÀ½{˜Ü‚ ó”kòDİsë@mÛf˜žžB)ĊĊ‹8sĉ,:“9ß:%ûäĦtû}¤ÔDaì vfPJ“ĤtÄÍ79sî4Î:Ò,Á9“gĉz‚•Ĥ}ÒÔGF]żzƒË—/c-lŸŬA…>û×ċdIyDÚVdw˜à HĦµAnKšî–Ġş[e½ú^ïġsiÂÓ[ç­$²V“ „ĵO…&¨ÉŝµH7$ ĞÖEì[ııĴĵ˙²zğ•ŠZÎî}µ`¸ìa+ ĞÖċŭä~X-ùrŬﰇyĝ}Ü8V‰µ’Ì9o½ħwnßĉ—Á­Û ìÛ?ÇüÜӓBHaiEXB$Ŝ†A[Iq,ËÒ'>ĝĦjèĴB…ŠèV¨Pá[âw÷Sî™g?ßŭ•_ùĝó½^ïı,3:‚씵&rĝĦ452ÀZ?xEQÖeÄQŒRŠ™™iĤf&}jƒS(°Ö^áÂĊó\¸x)cccŒŒ4‘9ÏPZ“¤)Q"„ĈÉ5£ìŬżíÛ·³şJÏĞYžPZi²Ìç’2:Úd~~ž8Žı|ù2—/_FŠġµJ{;Ĉž=s ˜- ۃŞk- ŻoĥÎnÎßR+˄ŻL*­µƒÀŜ"ħÁċ;Q2OP^ħVRŬçÏö{t‡Éċ 2^¤{ 7ݕϷŒaĞİJ:l;V†Ëƒq÷ YŜÊ\Dž “ó²úíœ)½3ٕXç˙„JÀ.œ;ÇkŻLjú:x€ı=ğ˜œG‡2˙|ù %‚ ¤Ÿd(%m·M–=ëàŸ˙É­PĦ"ş*Tĝ÷Ĉ§?ŭYûôÓÏt>öħŸùr’ôŸ 5êœ{(KÓÈ9‹À(…p ϛÖ+…Ö ĴzÜ`vz–Vk BĤH—q÷ÎΟ=Ŭ[wiÔjLNL!eÀúúA °Ĉ€ÈZ d@f ™ħ„aLĞ5ÎŝŭsŒŽÖiŻ,ÓëvPÂ+‘J ²,´M½ċĦ·PŻ×yóÄI\ıB-ùl] p9tıŬğɒŒ0°Â‘š!}ĥ,ÖûA8ä…óœó̳~òçl†:qÎLi)"c\NȔŸ…çibQRĦT8ĜÏèhƒééIġë ΂qWŻ]çäÉ7étú´ZMjq„ʧyl˜+ä;Œ³ôú]ÂH³{çnöÎíĊËòòò ĈK)O^¤Œ6ŭPډ'¸zġ 6•=ú{öì&Ë6Ț2O{ôŬZK\ĵx‰3gNEÖ:ê:N‡Gy„÷ĵç½dYÊÒÒ"Ĉfıbİè'=­mpÀ! ÄâĠc¤DK1óĴ ŒÉˆ¸4˜µQ:á‰c€ÒzPRa­Ċ”ZÓĥZöżï ĵÔz6Ĵo5W&}E!ĊVµżċˆò€YY.^g­ġĤ} Û†éaÒ;\C\ĥT û“ËdÚ}Úp_ZyğaŸoùñĈùò‘çŜnä犵–è m|IHšûĦWWVxéĊ—¸qÍÖû÷ÏsèAjµˆn·/$ƒ€$IAJ%ĊQÛs,ɒ_İ×ëñ#?òŜŞéĴB…ŠèV¨Pá/‹cǞîŭêŻŝòóíöêsA 5ŽDGĉYϵÎ"¤· ÌÍS9AÇ4›ÌnßÎhkç Îġé§]._şÄ™³gISÇÔäv´Ĵ!e€”>ò ‘’™ÔНRbR‡u’F£ÁĦC‡˜Ŭ6ËÊÊ2kݘ†šÌ$t{=9̉7Orġê T^@Q’Gy”ÙÙYz½!I–ĉdÉĦ¤‚ĵ), }nîÙ³g £ T`9°˙˙Éc˙)ûöígÏü<+íeúŭu_IlĴQċȑ#DaŒÔ $&¤DĞ“#İ‚N§7ÈG-ĵ˞èĉOxÂ4‡ ıE^ëŭ^ĠŬ?\\üĴ*ûq·Ê- †ÓÊe J`(gî–ÉvùĝËjrñ<„}ĝĵŠĴŜ²Ġ 8ŝr<ĜVÙıeµzZX›ĞıE\ ĵÄ:‡ħ>ŞN)Ÿ"’$)B˜4ċÖ­^{íenßÁÌĥ)>ÄôôqûĜ0]M êua'½ĵmLz,3éú/>ŭtĠtVĦÂ_'tġT¨…G}G ÜŭÊWü[îJ+ £O*|$M’ĤuŽ0PBcr_aż×ómjQˆ²Ì7‚O†cc\şt‰+W°xŻÍÂÂ5ô.çÏ_â‡~‡Ù½g­Vƒ$ëàĴC‡cR’$£6HÓŒ'ûöïg×îĵ ĵòê7Y]]EJÉÒÒ27o. ¸Â0dmm ç *tÛDĊ†Iİ…KÒëùÒ “/•4F|éE§ÀŜ½{™žú/8uâ$Çßx+WŻ µĤÑĦVĞ‘Ĥ)Yb‘:DI‰ŭWİħ†,ÉPys[E›²j½*Â÷ılP!¤@X6Ċsm•P&|„n˜¨–·&¸Q-{fËÜÂPìШçöö–mqµĥ¨H_.âáŒÜò>ÊÇ=œÑ[(Ʌ"]VËdü[5œùó*{o ›×§q8£pJà,d™#ËÖı~ŭ:ǏżF·³ÊŜ½{˜›ÛÌÌ Ŭn—( Q" ŞĊôû]zŭ>µZL–™6ĜcBÄŞĦ³ *E·B… }ĝÜ瞲Ï~ŝ‹ŸŭĜG^H³$0ħÎLYl¤ïAE8,^}UJƒXÑJ–Zêġ˜‘zíEŝœ%ÉúÜĵyS§N’e}Ñĵ Axr‘'˜Ì†½~‚uëJì™ÛËĦCħ¸´H–ùĦ´íÛ·“š„3gN"„%Š´OL‚w𙜜ÄÛ06Wèò-„+–Ž“+W.†GEH2==Ŝ}R‘ĤQħ{ÏvíŜHm„Ġö y×ğ#I-ġş'Ç~ĜÎ`·zÄQLFıêlóĝ05hżrÖû@ŭ$>ú^7ÈÑ-έŞw Â7\£[ĥ '(lUzPVDË ìƒR” PVl‹çñ_r“ßĥL²‡ĥ–+A g䖟sĞŞá²…bĝuÙ Ïyĵ€°  Bâ„DȽžA*ïÉ=uê§O½A–öÙ7ż‹ŭû÷ÒñÙÎB†ZFXHż@D‚uĠÂcûÄûŜW‘Ü *˘[ĦB…ż!Âûtïżòžo·ÛÏĠê5- YëĴNi­"g7{+ÓÔ7­C‚ DIí—i… 56ĈĥmÛCMf´†µġeN:… ç*`jr† Iú)AGŭ~/WjUNşüó´Z-:Js´ÉÊÊ*ŭ¤ÇjğM𽂐~8H)’Šwĵŭ´Zc˜<žÌâÄÓS]*믿΍׉˘ˆ@{²k-<ôÌÏï£Ûíĉ)“êġ‡b÷îŬŒMjµ¨×8ç¸xñ§NŸĉġ׏sŝüynܸÁŬğwIßÚEñ 8I°ŝw°.$7ˆlöÓ“¸ò}ր­, [µŞ••βŠ[V{ ·PlË>Ú2ÉLÓt ²+[ÊÇZĥ'”gĞ4`Ó`[™DÛ5ÊżĜn8"lĜŝħ™ĝ烂˜ÒıùŒek„oŭC²ĵĵÄİS'9sĉa(yèĦÌÏíFš(ŠħÎaóï­u()1ΆášòÎÙ)„ü÷ŝè‡*’[ĦÂß *ëB… xÇÛKğ_úò˙Vż×kŽŒ|23ÙGœµMŸ ÊWUĜ rV¤”UÎá/,RÉÁvÑ+áaÒWV]ˤµĤ2Ħ.”a€,Ë6%+ ?Wù˘ œŜP<ïVäz (£1ŻĞÀ"H­Ï˜^_osòԛ\:ž‰İG`l˘ÉÈhƒNgŬÜ Ào_qÖGÈ)%ÛĈdŸ·ÖŭN­VğûƒïŝѤúĥİPĦRt+T¨ ǞzÖ~ŝÙ/v~â'˙Ğ„ pÖ%Jİİ@‘µclN&ü*ğô Xg–,34333LLNċe ï'\|™“§O²Ú5Ö˘^Ż‘&Yî­´)*($êê S“ìÙ=ÇΝ;pÎħ²² (Â0"Œ"Ŝöè;h6GIÓ|`J)ï1 yybEoĵñ·nŬBIš&9ñ xë[ßÊôô ¨GN2”Ô8ħAôLĉŝñ˙)_ûÚW}ġXŜːe™Ż1Öc +++\ğv•K—°¸x8Žiµš^ıĥ%Ĉ>ÒMßjf7[²<…Ħ"9ĵdż•·ĜWÑrVÊájà²"[ĈÂ;Ĵ>/ÒÊċrNí°ıĵrPE M‰˘h0„UX úŭ>Al²cpyġŻŻxssU9,’†‰hV&—e†o—Éöp²Cı˘Ĵ.—‰òp{ÚVjäv˜à$µĵ˙âX·zâ¸Ê çaÒï§X³£óŻçÒÊ2'NĵÉĞŻLTÓÜ7ÏüünĈÇZ6µŜ“kQT#MRúŭ„¸e&3W…àâ·?Á˙Ĵ"ı*TD·B… ßÎxò÷Ÿ²Ï>ó…ÎÏüìO}55ÉeÜhÔw§YYcZaĴĊZG¨"´ŠÉĴZGhĴMQJ2Úh066ÎĥéiêµŬΠnŬşÉċĞWX^^&ŽkŒµÈô“”´—ĉNúĦŸ0F•'HŽ9Âää­Ö"WC½‚ݐJ窛3+ԋ/ÈÚÚÊ W+…Pš£G055ƒ5Búf4!…÷ú:K-ñÒK/ñòË/çMgy£™­$ZyòÙïw BíI²Ú(0&E)Ċêê ׯ_gmmñÉIġŬn—"Ú ĵ "Žcúŭŝ&"ZŽô*ÚAC­ ‹Ĥ/6ğ²z:l3(ÛÊċ ÄvĜ×û û·*ş(ù|ĥÊßŜöAużJ…ùíÍqlRşĵrÚä1n .üŭŝuvH^·€3‚Ċ{œ>y’ çÎQĞiì›g~ïnµ:ZˆAıD…$Rút mc³˙WJùğµZü™ÇôíêÛ£B…ŠèV¨Páo žzê™ôŸĝÇçVWW˙¤×ëi)d‡á”sDĈXœ$IœpD‘ö…ÂbLB˘UÀÈÈÔëuĴëÓï÷è']nÜĵÁ‹0Ĉ2Úl222ŠpkijÑJ£” ßïcmF†ĴŻw!ԀÄARĉ\OĜĴÉËößüĉ7Y[[JH)QAÈ?ÌäĔ_:Ï ˜R’$íáĴ÷÷~ċ+_áÒKŒŒŒ`mŠPgŬ@ĠFÀÔä$“Œ1=5M§ÛĦÛ闆ş<‰^YYayyĊoŒŒ& RÈA>lAT…Ôj5z½ŜĤeŝ0 Ɇ*o7˜áqĠZ–ëË1be·LTËCg*ê0ŠÌÚáR‰-‰ûÈÊĥĜ~X•Ŭ*ĊaC­•ƒ÷ħĵ”›S*œÛP¸ŭyy<Ë ÎċBħpû&Żò*·nßbÛöIŽ9̞Ŭ;İ×bÒĴ–š }"ƒġqbŬn)EÄ1çìŻ5[ÍoŝÀğïWß*|{ J]¨PĦÂż7:ú¨żùòן¸wï^KHñ k쇅ç¤ Bc:RáHM­4BHpÚûv'ÂġzG°}ÇW\ċò•+\ğrƒĊĊEŝìK_âÔÙsĵë]ßüü<ġz2úI†a-Âe)ëë´ ZÉĝüZ“‘¤)J*Ò4WcRÀȘ%ı˜zH´TıepĈĞ£’¤ÇÚZ)A G8ëJCZ’wĵíĵíÑGóö¸&½^ÂÂÂM^{ŭu.^¸ÈÚú&ː2ĤßïqúÌiêġ:ßû½ßK½Q'éöI’„0 I’„(Š…²Y,÷wğ]TàżÂuyäZŝo¸ÏÏ:œD0\[ìwĞĜ²ò`Ûŭı,Ŝƒá…²Ov8ĦL^Iù1ç]vRóû%Â[Ĝ%Š›ÙJnŒ!MŻô[p\šríÚ5Ŝxŭ8íĠ%öîŬóÔ1‘ ıaR€ĦaĴÚišÓJ?ñüXeU¨PáÛ •˘[ĦB…˙`|ö3OÚgŸŭÎOŭôO~ĠYqFë ·;Iú‘sRá½ħÎ"PXëË"6Ĥú A İĠBĈÇǘššBiE’fdiĈR{…óçÏħĥĥNELŒš4M0ĈyğĜXZï÷ûyBÁĈD}c aàŸ7ËR^}ġÚí6"?>jí[ßú##£~Üy+H /ĝ++ˁF HÒ>q‘™Œ£Gâƒü èĵ:ıVĞÓl6™ŸŸgnnŽ~żOğŬ&Žj~ˆ)Y\ĵGg½Ìĥm´F›ôz=„Üĵy“/}éKôz=´ÖLOOœ#I”RŜcœ[s ’+òŠ"ÉĦ …RZäеe2\&µ˙’ˆ²Ç·ĜOY=.в™¸Ċöv‰áԈ­Ş7ÔââíċÂ[gŠœ_k7šŜŠ#’N·ÇùsgyíĠ—évÛ:tC‡ö3Úl*u)ĠY·Ŝ÷-•Ę´íœ=&xâŭÉ­PĦ"ş*Tĝğ…cO=›ŝÖoŭĉıĊ;’f}Ċ*‘JLYg#á6“hÖd8cñUĞ‘“Ħ@…aÈÌÌ ÛfgħX——I’×o\ĉt×;Œ6›4›-¤Ô8żç„/ŽPzà4Ö 9œ/žġz]^|ñ%úi(í§í¨Î[ŜòVFFF} ‚uù ZĦ>úrŠ—^z‰{÷îÇÖZ˘8D™}Ï÷|û÷ïgyeĊç¨Zµ–$ ZifĤg˜EJÉòR›~żx"yçÎĴħlŸŬNĞĠbaao|4›M_żÎêê*ÖZĈ  |1Ĉù+ˆżxtÔ$†ħXÜĥ"¸ċaŻá…á҉ḭŬá}”“Êv…oe“(Ÿä}D×ß_4ÒäYoRÔ$™aye…ÓgNsîÌYtà8zä óûwS#ïáV"@KT‡#36CĜĞJ‡ÖżŭüçÉ­PáÛ•uĦB… )ìÛw0·3üĊKËK-­ġŻK!È÷p„ġ~HzâÉÖU%Öe(iŒ„4êMFGG˜™žâ•Ğ,ß½Çâüċğ\ğv…‡ßò<ÈÔĜ™É|ʃ͐RŠ„ƒ!2!2”ıe’¤O·ż†Öš (İI’>BY”"'´rPŠá‰“AÊÁZ™ĵŭ”;w2??ÏJğMÖIӔ0ŒüÏ|ÀlmµËÔÄ ïŝŝĤÒK/ÒÏÌ Ĝâµ×_gfjšÇ{Œk×ħ¸¸È?ÎŭÑáœîŬğìÜısH6PSsۂs6'ènPy\xhËÇlŒA!JbÙòöˆ­Òʳl%Ȳl“b[Îû-²m”šPd÷>ÈŜ0ĴHż+'-ĝAżŒÍ‡ZXIĵ­!ËZ;¤ÔôûŬÜʐ²²ĵÊ+ݽĈÂÂujµG`×îÔë5„ƒNg¨ 3’Ĵˆ,³m)ù3­Ġ˙(ùŻŜóC?ĥV} T¨í‹JÑ­PĦÂ_ >û™?°Ï<ŭ…ÎÏ}ì£_évş.%MkÍ~!]ä0è@C@ §|H?^‰Ġ*ôġ·Fšu&'Ĉi5GԔ4ér÷Îm._:ÏúÚ#£uš£-t¤ĵş‹AjO~t °Ĉ'?¤I†”ïu¸½°ÀÊÒBX„¸Ĉ£>J£ÑÄZCĈy‚ƒ­–—ıví:İ飂ĵ9I™Ÿ;Àcïz “YŒñ–_Ħòœ\ˆ˘˜n’ ´dÛì6ê# _ıⓤ¤ë½.Ûwn§Ûïqwq‘ùùyNœ:ÁÒâ=šÍQÚí˘( ^‹µ['ä]›, QB *’ YÜW&šış… [”X ÔÂ?\nN+ÔÚr–o0 Dıˆ˙Ú(ƒ€,³È<ŸvóVĝv­CKċóœÓ İ$A 1ä‘kBf)H•·ijPç{ġÊ5^|éë,ŜğÁĥÙ }ôaĥÍLS‹k˜Ì`­£^%³ÎDK‰Ċâ„k—‚_kĥšßüŝï˙‘jèĴB…ŠèV¨Pá; OŝÁSÙ?ûğ´ĵüeçĴ‚Ĕµ&y˜@aĴA)M–Ypİò%üߍzVĞ•{^}›Ĝúz—Ë—/qíÚuÖÖV™˜˜4TeĈxĤì|uo–è@“™%½ş911ĈŽ;îŬ[¤ßï£mòĥGßF­^ÇZHÓ<’ …µ\Ak…1ŻżŝJIÒÄG–! ×9rä(J…ıE"ÉUF™“8…1ĵêhĊÈè(i?eaá&àIĉzwÎz‡£G˘Ûí295Ċ‰7ߤĠl"Ĵ­­E1Ûĥm9ÈÌĈ`˜Tr f )ĵşó߂ —-™-A Ğİ~ÙaŸmArË1feeĥìÇ-[ ží‚@ob˙zĴ]6ûts_‚È_7cÓü"Êċ<­B”R¤İE __½şşĈ‰“'8wĉ,½ŝ:;ĥÏpôè&Ĉ'İĊñà}:$M3ú‹ Ż|·•ĉ˜s<ñ÷˙ĝâçŝà˜Ğ>í*TD·B… ߁ĝŸ˙—Oqìég{˙_|>ËÒç2BDAŒ'iXgò RŸVàIĊ8‡~A]䕭ÌnÛI…¤İW;çΝċêĠ+Ôk1Fƒ0ÑJ“¤qĴV‹étVóĵ\O†Ĵq4#ìĜı—;öOşĴwğ4Fšĵċ­oÍ+„MN¨Šv4G’¤H Öfĵùĉ Ò,!ŽcŸŽOB2??OĞ5ž{[5P,³ğ\Ġµ¨ÀÛ5²ÌRĞיžœä… Üğ·H­VâX^ZĉÀŝŭ8kyµ×Ù³{`ıví{÷îeii‰ħħ1Â0ÀX‡-ċÓâĜpžžY·Q-\Ï-†Ċ 7j+gì–ۆ̊Ÿû&×eì³pĠ}êħ>‚­,?‡µÖ{“À:|ħù°™$˙˙䇝Ñ>•XîŜ½ËÙ3§9uòMœK9|ĝ{vïdvvYĉ‡ U: c´V%16C)Ùq,I²'>ôÁŻü¸*TD·B… à3Ÿ}Ò>ġÔ3_ĝ…ĝ•ġNçÏ­5MgŬ~!Dä—Ŝ=)Ċ _ ürżĴuƒw4SSSìÜı‹Z­F§Óڔğ\ĵxŽö2ĈaXË oÈÚê*Axâ#@š´Ÿ’ö ‘““ì;p)­ħsğç‘2 C¤T¤éFlQöš7n°pë&ġ†÷âúÉŝG}“ôz=˘(&Ë2‚ Ż–5~_\&ŜŸÚġeçΝ÷žW“ÑOpôèQ^{ġUöíÛÇüüT%+T¨PŬ *TÂg˙É췞ĝÍğ‹KË_ĥÎi!ELiİ"cSŒ³Hí|ğ™58Ğtè#¸¤Ĥ( ˜ššdlĴEHĴK|Ùĵ\ı|›BĞ9†R1a!Pô{‰WQSŻĈ!ĞkĞ$iJ£Qgvv;;wì&⒯ÔÇžŒçżiJ³9B·ÛâĊK8ëĊtà‹2:ÄĝĝD>(VD›ÙÁħk­ÈLF–ù² çĈF[MÎ_ 5 Cï£Ġ^1ì÷{ÄqÄÄÄ££ ĈĈ üğŬĉú\½r$M™™Ŝ†’š¸^Ĥc­·(ž(%‰Áçûƒ$ƒ‚¤i:8ö‚k­ˆˆ .rïŜ=´ ²Ì ”äĦ#99SƒZÚ"˘K)ħÖY⸆ÉĵÚĜİÓYïpsá&AîYíġz,..ñö·żÉÉ)^ŭuÖÖÖıukİİiöíۗ{XĊÀ—ëeܜĵĉiJk”ô5·û…Îŭsŭ²Ċ=gEȇœs‘3™¸Ĉ@D8çŭšEĝ’ôݏȏM0=5Iù\Û¤ßÖíÛ\żz…›·i5ĴŒ4GqÎÑMúĦ 3)Š°” ?xdŒĈd×ZKÇ$IĈèh“ġġ.œÇûoAJĊúúGŽĠj‘Ĥ išä9…’™ u™dP=[ĞEœ=s†4I}ÁEÒëġĜ³gGaÛĥY‚@SŻ7xÛÛell̓ÂRYngk9¸’˘TÁĉÙÂBŻê 1hPVuËd³LöˤTĉꂖIkıĠĴ<œvù„ÌÉúĉAıû— ’Ĵ~èÌĜ<#7 M B8'Xĵ{‹Îsüĝ+dé:ğvo-aǎY¤d‰çÓ.´rë(%PJµ“,9&¤ĝÍ÷żïÇï<ġı§Mġİ­PĦ"ş*T¨„ÏŭÁ1{ìİg;?ûџ~!駁R*Á‰İ,3‘ÌS|Z·x"¤Jdȗĵ:cLNNa!é÷IҔ7sġÊU’´ÏÈÈġZƒ^ż‡çœÒ+Ö— “aŒ-=3 rq+M­5œ;wžn·3Hè÷öìÙC·Û%Š˘’÷T’ĤIàĠÎ ˆPÊgÑFqȉ'èvş€È‡ßĵÂ977ÇÈÈ33ÓìÙ3—×ûû-ݰ9/Ċ!‹Ĥ´<İ j­sŝ÷ ›•‰m9[·lK(ĞĥÎıG×G²™Mû)ÎcX1öïcqà6Ġ+żyrĉ°€³…!Ĉú}Ÿ,¸{û.'OŸäüı3Ħd˙9ŜÏh~Ħ­"‚ D M–%ƒc”’ĥVúX?Kžĝàû˙~eU¨PĦ"ş*T¨—SŸ{Ĥ÷kżöËÏŻ>çœa8P“YfÂâ1Öfev‹á4!PRPĞÇl›™fjf„ĦÛmÓíséÒnßBÁĝÄQT#ËÎJßtċ@…T„OH@HT`A(?$VĞ×I҄Ìf4FGaÀùóç°€Í àX[[ezz’ééI„(Òĵ ˘°38烐,ßWA”Ż^ıĈŬ;wjrA‚÷ïßOG$Iе&ߗOĴ°Ž–;(­V†b° ëĵ§ŸÎP+{s‹}ŠmQŸ;LZ}—ŜDzżUœXħÏb?BHĴġÊsħŸr …÷eGƒÈ7ƒgž\c½mD âÒĞĵyò8·nŬ Ŝ:ĵ—Ŭ{vPoā"1Î*ÀżïÖd:Äĝv‘{Bş§“4ŭ§ü@Er+T¨ˆn… *üáӟŝ}ûì3_èüüÏ˙Üó+++äœhĈq|ˆ …P)9 SŜg+É2_!ÏÙ ħV‹ññ1&&'èv×ËÂíΜ>Íòò qG ‘f)a.O!(Šĵ’i H%ÈҌÌl4ŻI!Ŝâ=ïŬ#K3ŒÉèġz,//³sç\ÑUÏn’$( ‚€^Ż—+Ɏ$íÓlĥX\\äì™ÓÄqŒ2'–;w²k×.’$ñIBĉ_ù-_W!½_JŞMŞoÙ[Ó2‘-'+ 7’ ĞmEĥżUjÂFÄXQ1l7)¸Ċŭ…_|Á„qùû/&ġÏE5’$ċâĊKœ8ù÷îŜf|˘É{Ùħc£ÍŽ,u>²N…Ħ|˘„OX³Îĵ<-%˙ûŜûcËĠ'²B…ŠèV¨PĦÂ_9ž|òsĉ _ĝâêG?ú‘żètÖtèDJ1eLİŻ —óĉj÷Ĥ(äjĦ&ELMN2ğ}c2œÍ0Y› \ır•^ÏOڏµpX”TAžĦ+‘2 MR˙oáUD›Y´öƒ]išÒl5iÔıtù2kkkH­È’”ġġàĜżÏt ëŭ¤›$BJ¤)¸páׯ]EëbèFŻÛAIĊŜùy²Ì µ>3È­¸û{ lQáÎZÂ[5JYıpŬoypÌ9w_s°İ­\ó;œŸ[dҖssËi Ċ_ ë,ÎĜMÇáœÉk›A „ ×ëa$FHziFÄtğ}.]¸ÈÉÓÇétÛLÏ´Ĝp;wÎRo4È2‹@E1Ö8lî뇂ĥTüïÖÚߨ×ë˙ϏżŻS} +T¨ˆn… *üµâݧžî}â˙ĝùğwï='„RŞ$ô””2Ê2ƒÉRİTîÊ yµ°WekµÓÓÓ´ZMŽ$ë³ĵ´ÌĠkWıvŭ*Qh4ˆÂÇT‰ ?nÎüpÖè<,ÛhpK҄ññ1pùòeÒ$%Ê#ŞVVVpÎħ{÷njµxà˙5Ĉç×FQ VàÈ}ÁÂñêĞŻ°pó΃o ZÔëuŽ=ê£Ö”Ē)ݐĊ°Y‰<Ú2‘ܢÂwĜJPÌB&Âċä„Báu[ē·ïÏş[*ğRz˘ï½5Ċ…ÒĵaBİÀ[)ĴC‰€öòoĵñ&gΜ IşìßÉ}sÌLOú!@J8RDaLšĤôû=˘(j÷û½cJÉ˙n||üĉ÷}ßğĞĦ³ *˘[ĦB… 3ĝ½ßû´ŭÂŝ°ó‹żĝ _^__{N1*”’ħÖĦè÷{–\ħT¤Ô8'|t”R(­˜™™ajz’ iÚcqégϞeiñµZÄĜĝYfQZ{/¨-ş\2z50ŠB²4$““S8,7nŜ@ A†tğ=]ğĈ͛7hµZ´Zch˘D@–Ò,EŠ@ܽs×żFÒë“$²ÀËĥÙYŽ=Š1Ù nPçë<ÉuÖċñbg-8ïĊ-ÈĉVÊja yÙ&ŞQ.{zDŽËñae<œ£+ò eÉĉá5á$8ÈK+¤ Q2 I Bkœ…••e^íu.]ş€ìcïŜŬ4ê1qĦ¤oʳH"·Šh­QJµ{ŭÎ1­ċï{ž|òsĠB…ŠèV¨PĦÂß<~˙÷Ÿ´Ï>û…ÎO˙ôO}]JÑóSö½é¸VŒÉè'}œqù²Î—Ö!Ĉ8YŻoÛ>Ëö³ ,YÚ'Ë,÷î.rŝüV×ڌMR‹kô{ŭœ`I”Ö¤Y† %½Ş‰~Ï$MQJ²kçŒ1Ĵ,Żï÷ħÖ'E,//söì9˘(fǎhUËŭżž˜;ĵáċW^ĉĠW^EkE£ÑÀš c Iš033žııœÜŞAéƒÒ ìİÜJħ-|·…˙µ°”ooU\üğĝYnA+—8lU2Qüĵ߂l—ÓZ›+Ò †ÜÏB~áà„ IĴƒWŻ\ĝñÜ^¸ÎĜÄ(?t˜}ûĉhÔk(82 ßÍPFk7½emĊ1­ġï}χŞĦ³ *˘[ĦB… ˙ñqìĜÓŭ_ŝĝ/}cmmŭ_Ga¨3“%Ĉˆİ0EJ¤YŠ3 Z ”dY 8ŒÉtD‡hݨ×j4[#LMOƒ”kığ¸ÈĠë×ı½pp´šŒŒŒbCO,> ÁK–%8ç]fûŽdIÊââ=\ŜàeŒ÷ıŜĵıÀ•+WÀ)FF$IJ’ôı·xç˙â/8ŝÚkƒJÛ$IÂ'3„aÈÌÌ ûöD9ĞZ+½jm7Żĥ—m[҂€jáżúÓ,<ĥü<Ħ/gà?GıbX­-+Ċeò;L†]ñ˜|;kóĵ\'„°|H隆=s–7ß<ÉòÊ"³ÛĈ9xhŽÛwDœĥ'HS‹Çu°–´ŸtÂ8zŬ˜ô˙ŒèŸ=ŝïĞHn… ßĠKPĦB…żmxáë_ –WÖZµZ“Ĉş8²ĤoVSıkÒ ÒçS |3Zâ§íIú)Ż\ü™³ÜZ¸C·“Çu8È=ÂŝŭûB:´–Âş”,ë#r9 5Jk:Ğëœ.ÌYˆj1ŭn?'œ‚$I|–ïX“İéIÖÖVéĴŻ# ŠBz½.ÖeÔj&éÊ2ż}kÒ4ÁdQ çàßġN&Ĉ§ĵï8Œ0YYĊµ­a…-Ħl%ĥ Pxs8‹Şî-Σ¸=œ²0\0!%ƒz âM> hZ"ù}.o6“8ĈZQ- é÷IS“ÇŻùH7gĈÀK—xíĠ×XX¸NkĵÎ}ğÙ³g““Sán‚<~Í7´yû‡ M“v£Q?–$Éï˙À‡—>ŭ™ÏVš PY*T¨w/ĵĝ•`eyÁ'•’1Ĉ6ÎÍ[z@úŒ1yBB)ŻrkX¸y‹7ŽŸdqq™$1 û÷àïxóóûˆ69PRxÏ.R)ĴIÑRÒeaaŻ}íkœ:qk B2°Pà$<Ö:”öŭZi´ö¤ù‘GŜĈßû{߇VQ°j’$C }˘Îe÷•5V­ġ ëÖƒËżñµ8g^Ŭò°YrŭoĦ–o{µxC-^Û E9£Pt…Ê·5éö– )şŬ.q\ÇI–á­yĵÛÉÇyĴwÚìÚµƒŬs³lŸŬFcdÄçĝŒ,Û°˜‰ÖÚ:gïdYöĊ,3żŭá˙xċÇ­PĦ"ş*T¨·_~ŝOĈ²Ìü†â1àğ…M™Jc6”Ï °F‘&):ôËì½~­%Ö9îŜıËÂÂçΝcáö=¤ŒŽLpàA}ÛÛÙħ}I–+ŞÒ!L†Ô µ€|-Žc²,êċ˜wžĞ—ŻÑíz5uǎ]<ô[˜?pˆÚHŒÖ ›ġ‹Ö UTóçêcîŜşÉĊKgıté7ïÜfm½K˜—LÄqDÇ웟çïü.&&&éġ{`Ġ öWë(ÉÚ 6 ?­uŞż’÷lJ)Ĵ­1\òíVUI§3†sĥ ÜŻŝ’R „ ÇF¨6"´ħ-4BVJ Ràƒ'ĝH‹î£Ğ·›×Κ.ŬÍz³XħibPÖ6 äQ†Cqé=qV!IW዗.Ŝ™3Ĵôî0ıË#{vsĝħC#‘èzéM"PCo –vÛ êĊOöij7“ÉdĦ›Éd>nĵ{êsóĉ cŠĈ˜çĴµsEaşÖ&;Hœ‹hU Äık(­ Ŝâ´Š‚[·y˙üE.]Äzi e`ǎ]<ŭô³9ò##£X[Btİy Ö~é’,Qh\ X;HUbÒÔâ5YÊÒ /²ÍšY›•Êr„2êOîĉËk#t›ž\€(ÀĞntŝ#v‡ÍµyĴöòtî6"¸ñ72!ÂÏ5|_BŸM";¤š·à !Μŭ9gNż‹ó}vìÚʁûĜ·oZ+@oaŻSM‹ġó+z1畵'ĝŻd‘›Éd²Íd2_ŜúɏLŻ×›0F[kñuİd7…³) ŠREĵOC!ŭĤ÷Ö¤ëkYVÜıs‡ŸŸz—…Ğ·°6 „a˙ŝŭ<ùԓìŜÖş„ŠX[Ñnµ“M§ ÒkxÏı ‘RBšİ-RŜûĦ}xö·ñÙ6օ˘(ĝÜ£äŝ57†Tŝ°İMaócnžŜ,t›‹mò 뇂p.ĠŻQ·=H’—V”4 Ê%5ĥJwîÜż8͕Ğï£Mdçî){ì;vlÇ{ ”lá}ĴŸ jĞ‡Ü ş³ÁÛ˙Ŭj·˙?ŭÜËYäf2™,t3™Là‡ŻŝI„ŭ&pLĞÎ\ŞHiRPU6ùu]…6‚˘e’˜tžÊZĴµİâ+xΜ>Ïûï_ ßï³şşÎÈÈ(O<ñGŽerr‚VğVšA9@ëZiŞŞDŠˆRz[B„‡áıd`(2ž×Ŭ|ÙUJ /­†ġbCalŬoß,lscŜSUĠpa­™n, ݆Ì×Á3’•)$Blċ‰A#˙1!ApĈ Ξ=͵…+(ċxôħYfîgr²‹Ö‚/è´Ç ,EÑĦŞ*Œ1=k˙Ġğê{Ŭыż˙üçòÒY&“ÉB7“Éd6súÌÛfqqqÂıxĵĠj=ĵœÙMے˘HBN¨ˆ’uĞ^y ŞŞ(––îröìYĉçŻ³ÑïÓïWìyd?O<ñ4{÷îel|œ(Jß÷°şAZAÓ:5/ÈĞlñÁcŒ!’zb¤LŜĤù §›}´EQ<ĜĥPżOÔ^×ZL;˙7 ċÍ?oıOü6ubI;¤Ĵ/ÂxšOZŸ<ĈVP•–N{”’ĞWŻrêÔϸ½8Ïä–fîgöÀ,cŬÑäaş›iĵOÏOżß§ĠÒTUĠÓRDĝïLOO/=ûéc1ż’3™Lş™L&ó·ĉ[Ż›ġġ )ä·¤’_’è}Ue )RŞáUµ›P‹ÈĜ\DÓ´×[áĉÍ|xċ ×n1(#ZìÛw€gžy†­ÓÛét:CħĞIŝ×PÔd¸ïuMĠ]ĥ80üĜİù ]{Ó%ġ• 53¨amóĵo°éoü 9´)<<Ñ\vžnDoz|ó7Lŭ†áċXŞ‚²_!eAAßrŝüûœ?޲Ú`r‹a˙ìöìÙÇÈÈD’-“7·ôŜÓjµ°Öö´'œĝü‹ÙސÉd²Íd2™ż3ŻöƒÑAÙ˙lĞh˙‘1ĉĊC×ÙX‡ş’X³Ög§hcŭ nVÖZîŜıËíĊEνw‘²´,÷Öévğ|âñÇùÄ'?ÉäÄ##£8 ÍŞ×ŭ1İdêœĊ!b•ŽÚF`*î·ÔŬĈĥŜa‹)Djv~Ĝ£ğıĤìá Zٞ²,‡ö…FD7ÏfqœZ€ Pʤċ9Y[]ċôé3\|‰Ò;víÚĈÑ#°e²ËĜhê‰à(ë#ÒèD„VK÷¤’'{½ċ_úòW³ÈÍd2Yèf2™Ì˙/\<#Ż\ı2ĵ˙†TúXôrNë˘ĞµÚYUUê’ M ‘A9ÀZÇŬĊe.\¸À•+×Xé­ƒgfÏ>Ž>z„ŭg™˜˜Äˆġü°­'€u¸ġH„Ô- b(r›žÚ‡}şpm„èĉĤäƒëdŜş„êb·ĥMmÙÍ ›G+Ħ£ IuUO$+¸xé.\ Ŭ‘ì›ŬÇôôğvl§ŬnĦ…Áı@ É÷‚Z4FFZ˘ż ~ ˙œEn&“ÉB7“Édŝ>ĵŭΏÍòÒÚÈo)*™‰Ñi ĵ†t9•’X7!4‚³ dF³ĵĵÂüü—?ĵÊġù› *G[°c÷.ž|úIĥmÛΖ-„ħv" ¤$uù ‚÷ÈZ\zWOéĈÔȰݲöĦۈòÍBWŞM£á~[C1Ĉşgĝ£ß&QŬô~%ñ-†>* ç7oŜàô{§¸wï.­Íî™mÌÚÇÖ­[•'Í3'ñ­¤Ižä˜ŝ1Úîô|´V•ĠëüâùÏ~Ÿ_™™L& ŬL&“ù%ñĈoŒ­~Áó5­ġ !Ĝ.€)ŜA  eQW_ùÚ' GİFjz½UΟû€K—pëĉ"Ètı}ôè>ġİO1½}šSہP­֖NÜ"δÒidÁğŬÍ£ ÍĠıħ%„ĵ³%Âùt)n.²›ĊnsÍĠZ¤áĦy[>óD‚%A˘ÁûÀ•+òîİŸÒë­0:^ppv/îglĴĊ`0 #HĦ0Ĉ •ÄÛHUÙús½àÉwöìÙ½ô̳ż“Cg™L& ŬL&“ùesĉÌ)uŭúI!Äq­ġħü"]KeL×Ĉàiĉy}ꍖeYr÷î]>ü.\d}­dccÀŽ3|âŸâÀƒLMM‘B]ç+¤Rh­B\ ‘IQwߒ‚gÁ§ú/£ë9i·[éòêK4­°•dž€‘‚{ G·ıJ+’ *+%.ĝzyM˘À‹GcX/Ħ 0mVVVĝàÂyΟ{—ŝ [Ĥ:<ŝĝìܵ)BHÚí6•µ(a(Š!xʲ˘( !ÄprccÄWòϳU!“ÉdĦ›Éd2˙ĵŭö[fiiiBJġ݊Âĵ³@;­”Q[ "(5 ¨idˆ4-ìƒe}mĊ;‹œz÷ ‹·—Ĝ(K”(Ĝ³g/Ï<ó,33{€´ˆ˘C Ò)$>V›†!P- TŬa+„`‡µdR¤é_!4Èd/¨h Ö Ċm#v…(Y[ó>‰^‘~B€¸àİĵCŞ%F jœ,-­péƒó\ĵxŽûìĜ1ĊÁCûĜ=³‹vQ`+÷‰B·TŬW<ôğŞ² Zë˙f­ŭ7_Ês™L& ŬL&“ùĠòú믎ôûŭı‘N珽÷_>t’(Ŭ"FG‚MEİLúZx‚”*µ3ܽÇġë×y˙ŭs,,,ŒOpÀ<ñݧĜ}GÎ"`m‰w}:Z+ƒ’(%ZiŒÒԁİ(Z­Ħż7ŠZÄ*Y‹mˆ1YšŞ²fÈ@J÷Ħž%/ğU…÷JiPÉ/쑀BĠƒ‹79ŭŜ)ĉ‘Òqhv?3{vħmÛÖäŽiúWP •ÂúHG)ıĤ”úĞŞ²˙Ekŭg/½ôÊZ~e2™,t3™Lĉ3gNÉ+—/OŽŽ}C*yÌZ;Ħ+ċ}…Ğ”ĵ/>ŠÇ˘0Hݨl\|‰3ïáνeÖVDŻ™ššĉè‘'8|ĝ0cc|¨é€§Şú´ÛmÖCD"6µ.hÚĤH]U÷îÖ=ÈôWóÍà7 òûA³ôó€2yŽ›&†ztÂÙH-eI Ž[‹7y÷ŻßáΝ[LOoaǎ>tÑħQ”LÀ-ŬF  >ŭıtKħĥÖcdd¤‚˙ŝĈĈĈżŸœÜríùç_pù–Éd²Íd2™d~úΛĉîÒ½‰vğġ-àĞ!Ĉ%•öÁ#…¨Ô$ĈġèDSq.UŠ™BS•%—/_ĉƒ.pûÖ]ÖÖú(eĜ3³§ž|š½ûö!TÖ"UŞӅÁÚ!Ĥ~\-UòâÖ- ­VZ\kêş¤Lm Î×s4M İEÂ9?ĵ†:¨BqżıÁĈZó¤+Zqîüi~ö³·ħnƒ­Û'˜™Ùɞ=› 0Ä´˘ĤµĈÚäĊUŠ4ġ‹ëIôÉŞ²'ĥmÛşü™Ïü^e2™,t3™Lĉ׉W_ûÁ˜â À×le_0…éBş~_ûtQu­˘,û(>ZŠ˘%)ˊ••ĉçŻráÂEVz=–ïġètşĊrċëĞ1!$½gϞċâ‡g‰”ìÜ5Ċìì>ĥm›-ŬBĞ6İ7Ԗ[[€uƒžÖú¤³ñDöf2™,t3™LĉטS§ßQ7oܘÔZŽ Ħĉ„ŬèSÓÈátµ6YÊûu^’~ƒµĠ.\¸ÀK—¸{wAÁdw;>v„#‡e´;†Mè,Ô k–­–fddïë_RĜKÊzO8¨á…–fJ¸ ERÍYb‹Q0¨ QR3°ŽġŜ*ïżwžKÎáBɑ#90ğ—ññ¤2€@˘IÍ)ÓD0x|°ĝàzÎÈÉ~ż⋯ü³,r3™Lş™L&ó›ÀÛïĵa–––&ŠVûÛÁ‡Że·(ZI0nÛ¤VƒÊ‰álom•íS•wîÜá̙s\ğvrĊî3ŭÄìßÓjĠöhM'( €Ħ}aótq"Ġ–9çñŞm n(t­µ••‹8şEôpñòΞù·_crbŒöòÈŜşŬñşAAâÓ"R™VÄXáƒ]ƒx:Ĉ— żûÊËù’›Éd²Íd2™ß8^{ŭ“ÎıoJĦŽcĉˆ²ë\“É:à‡£ @]Š˘¨gw“‡wc£Ç­[·¸|ñ WŻÍ³ħf‘Ĥààìc<ġô³İ{WĝaàÍ(ÉèXïSo²3Ôµ`Îá›a‰h† jÍPDUU¸h1Ĉ`­'ĝÀÀ֏àŭóïsú½³lĴ-³ÛáÑGg™™ÙĜèR˜ús3ġŞšŜ$Ĵ=RĈžóĠ÷!|·ÓéÌżÙ—Êü*Éd2Yèf2™Ìo(gÏżkĉŻ-LǍn?'˜şŜ{´HWW¤Oâ6FÖ×HİB"DŞ>VX;`cm›×osùònܸËĈ djë4‡âálÙ2…Ö%!8šİRĤNß+\Ĵ§{½DĦ‡c˘ ³ĥ. ¨Êa$e™ü¸çΝûÀÖí]=¸™;(ŠBJ´ì0 EğŬ&5DTcpì'#ŝÄĥíۖÍċY&“ÉB7“Éd~+ĝÉÛo˜•ċ• cÌ·âë>U˘ €‹! DSK&0Fᜣ²}¤(ݸwçóóó\¸t‘……!Ĝ3³ÙƒG8pàSS[ġL°1!#>8bpDBFŒ‘(ݰÖ\Äوi”"ÄHÙ·t:Vזıqó—/_dáú5J7`ff'‡dçôV$:Íĝê1ÊşU˘ħHx" '„<9èÛ:Ëd2Yèf2™Ìo+ݽŝ“ĦrßÔşuŒĜšşA”b8ûÛÌ +a†=ĵR*ÉJ€÷ığ´È•ĞW¸|é·oßi˜Ŝ6ŝŭ³>t”­[·€[H•`JCˆ!µ-¨€2’r0@@UÛÊÒħĵ|—ëׯsöÜ/¸}û&SÛĈ98ğŸ={g˜˜GkMĠ·hĠ˜6ÎĊĦMÂÚJĞ⤵öÄ+/çY&“ÉB7“Éd~Ğ9ûŜğfaáĉDÑ=îŞĝœ~NÈĜU*‰Ñ4˛şj[EAsnfġ…ĥDË@żßçîò2W>œçÊĠyn^_ÑâÀì!ö>²;v3==M§3†PU%1z´ĝèpÑ˘ëŭĠu–——8{î47oŬ$¸’éémìyd{÷îĦÛKóżRcTˆ 窯yoQеˆ=-DüKüw_z1‹ÜL&“…n&“É|lxóÍ7Mż_N„żİµĝ)ċ£ŜWmç+L‘:oA@4PWŒ@6]€#’²Ş¸wïó×ĝòUïÜC étĈĜĥuğv>Âôîĥl™ÄèvjVJk‚uĴÒëġX]]ĉÖġ,,\#cmfvîbvvS['Qş*AIƒ–E-Â[¨Ş~ÏGûŭÂèï£ĉ_ĝì+9t–Éd²Íd2™#?z‡ŝFùIcÚ˙ԗsŬVĞ ,+Úm“ĈĴĊ97ìĊuÎÑÒ£ġLoeXÇڊĊ;‹\ĵt‰Ğ ,/-³nEˌ09ı•-[ĥat ]´°ÁÓ[şÇíÛ7ħĠ‘6mÚmĜH‹™™ĤĤĤg|dŒà=eċhw:Xï(Ğ cÚir8ĊËzΕ'Ó;ĥ.Ï}úwsè,“ÉdĦ›Éd2gŜ;û˜żvkKQtA”ÇŞŞšÓFt!5&HÒš!4JĵKá´H—ŞÄTD*ÁÚzÛ·YXXàö­{,/­°´Ü#80Ĥƒ‹‘ÑÑ-“.´eµŽô‘ĥoŸ`f×.fffmÑ*:(­)¤AHMô‚ Rç/RİŬÁ(ŬsΝTŠ/ĝrĥ*d2™,t3™L&sŸwŜyÇ,//Oďw:çĴÌĊğBbŒhşiÓêYÁÀVh!Ӝ°iêWFŞŞBkÉ`0`m};‹‹\ż~ƒġġ5ĵ밈`ŒĦĠ*Ja ĝĜ8ŬħqĈÇÇZ£‹! Ŭ&„HU9Úí6Bï1†Eԟ’En&“ÉB7“Éd2+oĵñşY]]ù–RúKŜğ}ŜûB 2ġàVU@kEÑj…µA…”)S%Yğĵ¸Ï Ü ßïcí ĥYÊ~Ÿ"B ŒnƒRh]`ŒIBMŒê>^g#JÉşa!Ùnµ‘=gœó˙]kġ§/żüĊ^ŝêe2™,t3™L&ó˙äĠW˙×èĈĈĈgğŬîIİ^Ĵ޲›&uSm@éÚ ç…Cp„à‘He!Úş]Áâ½{_ח™ô{ëuĥ"J§…ġZëzĝÁ!„&FGŒħ‡'ƒ2>>òüó/¸üËd2Yèf2™Lĉï̙3§äüüü¤Rúívû˜snÎZۅ4Ì ”Zš9ac 1z„ŸĈ"”ÖÄèİÊ `8PákÁÜà}$Ï`P222Beŭá}HµbFö€“íŸĝâ+ı:,“ÉdĦ›Éd2™żo½ġc³²²2ÑétŽżë½…RŞöîúş‚L!eşÎĤщäɍ8œKĜ›ß'¤U˜PŠ’]Ħ,+bŒŒŒŒcìġûŭ“­V‘Cg™L& ŬL&“Éüòx×‹ĠĠĠmĈ˜-ĝC!t·ħ.H)‡7„0´2¤_x†–ï=BH¤Ô8Wâ}¸˙ÍA´ÖĴŻŻ6!QJôʲ:ݵ>ñÒKŻd‘›Éd²Íd2™Ì/Ÿ×_û‹-Îı)•9ĤµžĞĴíz0Ĥ…1†ŞŞj˙­D)EŒqxñŬ,‚7yn áĜí÷×q‹RŞ ¸KUYŭùÖ-S˙ö÷ŝÉ Yäf2™,t3™L&óÇ{g~nĉçŻOhK­ŸĉbŬ#­V k-RʏĜBÄ:x–Äĉ›‘Ri­Òuw“µĦ7”?uĦ|Kkŭ½];w­<ġäœÍÏb&“ÉB7“Éd2żĥüüŻb–WVFsĵLXkS·n 8ç‰!TÈÁAIDATœ.Z­ïMOOŻ<ùT¸™L& ŬL&“ÉüÑ[ı£oßÖKËK!‡Kjcc£LoŸÛwìÉ7“ÉüÖPËàoCA IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DSButtonR_420x420.png0000755000000000000000000015611612467662066021420 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFÑyIDATxÚìŭY$Y–ˆûžŞÚĉkFdDdUÖ^ĠUĠ]KŻÓ PÈ!f†à`ÀˆP„Bá2"üà'żÈ/ ż8"óA!…Bl f =ŬFŬèjéÚşŞ²rß#2öw·E·w/?ŜSĠ§jŞĉĉħedĈğ!ĉnfnğóÎı÷žK"‚!B„âƒŜ‚!B„)Dˆ!B„€"Dˆ! …"DˆB„"D¤!B„"Rˆ!B„€"Dˆ!B@ "DˆB„"DˆH!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆH!B„"D¤!B„)Dˆ!B„€"Dˆ! …"DˆB„"D¤!B„"Rˆ!B„€"Dˆ!B@ "DˆB„"DˆH!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆH!B„"D¤!B„"Rˆ!B„€"Dˆ!B@ "DˆB„"DˆH!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆIDá-¸½ ˘{r·á}`CÂ[bË!áëéCŒg¤>t Dwĝ÷!B„€ôÀí^âŝ~nGÙâó `"D¤ˆĥ½,€Ò‡ûs—ÛĞT! …¸Ż@t;אşw!·ù™ŭ­l¸=mĝ›ĦÇ "RˆğF´Ċu·ó7!>8pêË- ċ›ä`µ-H€ )ÄmƒQßċ´áv´ċŭ†¸˙ $G`KÒX·›—꽏˙?ü8Ŭ§ĝŭß˙ŭ&@úP‚Ña?S0mÀ˜î/:ìĥÛ\.ÀÇ–Ÿ·aRâÉÖm@…€â0˘€i[P q@k[ şŸċJĵ]|`O! àÙ „Z`4•ˆh4"!­µwNĠïŜe”îB”e)}çw Œdà6²ĊßlPG§L! F4Ĉh2™t:vvvtbCÇq‘ E„D„˜ıµètÀ*ĝP `Œf–êrw.ónÏÌ,Ì,eY23‹1FŒ1’ec¸( ÙpŞŸe `êԑÀ)°ĤNvt( cǎĊ³Ù,>~üĝ8I’iÇ3­ġ˜ˆFD‰ˆöï· DXSˆ#à!" ‰ˆ´sh$îw#"lŒa)M;˜™MY–œçı)Š‚1’çı)ËRŠ˘à ‘C.ëGœk é!Ĥ^0Fj2™Dğğğ“étz,ŽSq?˘”:Ĥ”Ú0ŞXRß}–twA‰ˆ ·à³wÎ>‰ˆq§Â;/™ı‘‚™Kf.Œ1eu*˲,Š˘Ìóĵ¨€*Ïs“eYÉÀ$w N0ÉCdÂöÌ˙Ġĉ1•˙ĉŽ„HyP˘ĦSÇ:Žh<ϒ$9}âİgžò“ÏQĜœ–Òì óD ħ·jn|qè¸g÷Ĉyş*Żżŝê-Ĥ Dĝ¸ËŒûÙ8àÉE¤P0sĉ@)÷Î3f˙9gĉĴ,Ë“cŠ<Ïó˘(Ê,Ëò<ÏMšĤĈ1)î¨.ùÔ£î끟AÎ%ĝa&aiĜ‚8,X>ş4> )­µŠxEÑNEgžŝĉŻ~ûW˙£˙ĝş`@@ÒıS÷ uRÛ 2Ż–’êö"í' ¨ı^ŬĊ½N9Üġ4ĵ$’w; §ĞTú‘CÜDb_µ_·HsÔĵ‰^0&ÂȽIĠ}2Yš™ô֍LıT2àòû+°‘ċ|^._]0K~ŭ­×oäóùòĉ;o^gĉ @fŒIEd%"İ˙33ݘ9sçİ1&-Ë2-Š"/Š"Ͳ,ϲ,OÓ´Ìóœ—ËeéoĤ>€Bû€İ£ú X¤‡œúÊşI)£(еÖS":yk™žŝΒñ^np>VxTfšÀÒ^>EÚ+½ˆ€ˆêó€và£ÉŸˆRĠpϤyrn!†€@nq,ñän×^ŝH HšèèI}\E6 k‘ i­ġcĦy<ññž§¸…¨z쁒ˆàÒzò"T˘“GÎMc÷"Ó³ç§ @.@Î#À³ĤÚÇĵ\éâ 8¸r9=¸zu5ż~y˙Ö{ï\żöê˗Ë<;0Ĉ,˜yî這—Ì<7Ĉ,1 cÌŞ(Š´(ŠežçyšĤyžçĊjµ*Äg:à$‡UĤšK{w)ÒC(Û)ï\‰)"Ô.Lq\8)<+°J#hà€ Ŝ2Jná$А€ aA¨:'ï\ġ6=­3ì|ĵK‰ÚëZµĵ)ñ| Q.‚öCk{ÏKšçP1!ŞŝŜŭÒbNŝ]Vż+oW,öU1M"·f¤ú;ŒĜ­żÁ6ħ½Çö²(žĊ£Ó³ĝĝİG§;ŸXxB„‘&û{ĊŜċ‹ËŜ™ßxûÍkW_yéââê+eYî1óž1ĉ€™÷0ÍŬiUĊ*˲UžçùjµÊÒ4-WĞUy8É1ÜLÒ|ÜD9PŸŞ‚S¤‡ ŒÖ~eŒ‰Ä&`)ÎFŽħÔkħˆ'=9€b‰"ÄDè ”*Ô *ŝËwÔâ1ĉ [ĉUiXוÌ#ÁġéóÒNŜ}´î³µ†Hë>ğoŞ8şDÁ›Ë½˙IÖY™Ç?› ˆ,›òŸ‹òÖ2òفÙ~nBäĜÀ%£ {Û0„x´žyŝĝ™§>yüü7éñ‘˘/˜ĊAqŭ7çï˙ìG—Ŝ˙éŜY\ıtħ,Ë["²ï€jßs0NçeYÎó<ŸgYĥJÓ4KÓ4=88(ó2wF}/Aĥ@Á5>$żŜ÷6`´áŽÄû,ë͸ûĴ@„HYIV0$VÖSÀ„% #XqÓĉ¤èĝù§wNŸzçì7~çÉüĉċĠĠżŝáĠ·˙òOqŝ{oc.—eyµ,Ëë£ÑèĈd2ÙÏóü`ħX,8Ŭ)0­Ò‡YÂkċ5ˆ ˆéá*…Nİ%!Tò=˙J–ÓhWÌÙ;–û²Û“C/Ĝ†ĝ6áĈvÄIÁ^i߯lùšdï£MÏÊUD(„ vsaÄ&"”"0 ŒEƒ°ÌĞÒ˘Úħcg'§żġ{O˙ġżñÔò7ŜŭÎż~ëÂ_ŝéOŠ˘x?ŽËI’\Íóüúh4ş9›Íö‹Ċr4­<ĈäKyĵĊÇŭѕŞÂ›0:Tĥƒ‡%­­ŒŞŞ9ċÖꃽ{ @ƒ`$GżÇPÈÜL³ÀwŜt`FG#ْm'OJŻ<ĐhL A[é+ f[j>R@`Q0R$arŝ™Ŭ§ŝÎ?ĝÜ3ż÷÷>uċñŝ[ú‡?Z^żòfE—“$ı˜$Éġ$InL&“½ù|F™Ë1UŒ‰6°ĤĤ„'ĠĤ€ĵ*—.0êJvm†ä †*ŬŽÖe(ċ=u–Šn Ġ]e@‹ŻÈŝ^ĵŒË!MŻŝ²4¸vcéŬ“‡ù5˜oZvŭ_Eĥœġ§á!N]WŜ§Ha½t?V„„9³'2ìeĥñëĜx'>ŝß{êĞßĝí'nŝä{Wßĝï˙?X\y˙5­ġLלœ·Çñrı\ĉyÇS7|§e“„÷ĦŞÜÛ¸V€>b D[ŜĤ>y9$ߣnxtD\Ħĥˆ]ëĜ–`Ĝ:bh-•Cn 2LˆÄ+²QîZgF›ŞñşÀE>/jġÜĴTWóQŬR%k3uĞÔÚϙ×ÑTĥ'T[¨˘•@ğ‚0­"fDH˜1Ap3³4ÖJŝâ7=ŭ…Ż˙ŜġżŝŝµW˙ù˙ûğĞĞ—^ÑZżÇñûq_M’äĈ|>ŸÇqĵèTäùlİ˞h@ÂûÂl?ˆCÙw¤>;Â&ĤTÉuĠˆ‰ŠçÈ6L=-ùÒlÀ›½qŬ–ġ…•û3tëEÚ²oxÌ ¤‡m*êèŝBŜß-¨ġsŒ:š4ŭ]Ä­eÖŬ^j˘îcKw£@ëïšô×ĉ9ÇUîP)hh²vG1 – , ƒ4Œԙ/ŭÊÙÉ _ú[W˙òO>˙Ŝ˙Ó›-ĉoh­ß‹˘èbE×F£Ñ­Ñh4ŸÏçY[ò‰ù„÷á%r ßÁÇ.ÒCȚZ–rġ:ÚÈuäK $r(cİ6Ùw)¨~ż َyp“^óée4Òşĵ(×ò&äż!;ĴĤ[ ­Ċe@u%8È:­­nS7ŜJçlĜyhGk°lÜĦ`+ìʛŬ—­ˆ!uÓ³m\Š]İ"ĴJÁŒ•Lu¤N}ó÷ž>ŝĊoœğG˙äkßŭ×ßÑZ˘¨bL7â8>ˆxıżżŸŻV+ƒĥ£Ò!ßÂ!(UŞĠw‡C)R¨Vµ÷Ĥ5úVv ğıžÖG:L‚Ŝéİie¸;Ç]yħGÚóÈOİ´ŝ2 é{]V!Ħ5@’Ĉ]˘‡ÒHÇ(İn†­/Ö@‰]ĠccĠÏ,w賑5ş(ƒŠ£Àö›E°Ġš 1A†`QFóÒv¸Ĝ=1:÷w˙ó/˙Üןzç˙óûóôĉµ—”RğZë÷´ÖW£(şID ­uî #á}$@İöŬ5Ò6Z é!’ñ†äğÖm<ğĥ^ÙŞ^+ëwtIµö,¸[UÉĦilƒEġ³´Áȗí¤ËŒ:ŒŞçv>ó(0죤)B)â6ŞM`ŜŸ§Ëċž„W'? ÄŬƒ#ä = ´ÉñıŽj ˘~ûœŞĞÑTÀC ;ޤê9¸sJ².Éu˘U,]ĥ$­­3ËzÁ{ÌI:ı&˙w–aɰÏzhMÒêè‰v}-‡r?'D²^ ²ŝ³ÔY%˙o•KdĠÀ$•Ħ-Z9&ò¤?"éI,öŒì`ƒXĦ¤^Ġĵ§*"PIP,J” +Ğ†ħ;ىŭŝÁçGûÌùË˙äżúDû3Ԅˆb”Š˘H‰È @á˜ÒG”à\ì ƒT(³ €ôp†X‘WÔ`l–Ö<#iñğ$VÀä/şŞŜ5ËĈ _ïO#Ó1ş²\`¤ŬQ)m bì]ï߯ÈzΉ‡v°ŒÎ²µ eĜ²™YTùÏ|ĥŝPdàC(·Ü* ,jĜr޳NmIwġ‰lSlġx­ë¤Ù™¨MŻ­³y¨Ü"çPN$€&4D,ÀëħÇħ&œûüWÏ#ç˙Ε˙ç˙ċÏô• c"J”Rĥ✈öööVóù<÷@IÖ?Ħ)(UïżR* =ܲ]͎Ú,ÉÇĵÁšHÔ`à:ŭĊ-‚)öàħĜ’ż¤UPb8Ò îW÷ܓöāRûY[ÊĤÛPlŸˆô Z[ğÊzy LKlœê!‰Ô°Şê2¸|”Âú Eċ”Û 4nM1„v<‰VµésSŭâIkBlgŜ”R@d8X‹€H„ħ0@illħóOLéŝĝíĞż˙_Ä/~Q ÒZ×ßÏĊb‘EAŽœĞ£‚ÒƒFbĜ2$HH!@ …63jFĦö”³ù€$`7⠒y¸µK§6èaF}ı _žcïĥܙä˙,RÍò‹giŭ. =ħĵ~]ï}x—sFÙÊ?‰ cUu¸Ĉ¤š°>kJğFu˜˘Ĥ‚{Sġvi§'²'-*ö˜Wï˜Sİ7#Jší&%V1„ħë²]”‚R"„ĵ`\-§vw£üĝżĝ:˙·˙ġ?ù‹€RJU›&0³ˆHQ–%n”H–Tï:6Ȥ! }„™€Áy-6U9WЁqĜe`³f'/ÇNô90z <Ɏ½Ònnċ†¤akŬ'ĵIvzÓkµPĜ,ÓaŬÌtÜäùLCïŭÓsI*'dAIšù"ëQb™‘rS•+z¨ÍVbGp ÄIŻä™·é@ğ$}í=û\4lf+R‚ÄN[„Q‚…LiŻEn.KœN4Éßŝ‡_¸1ž&ô½QDD˜í+_.—¸ PÂ'Ŭ @Z5ċŜ!@zHhè²Öġv'JĠZR'…z *FÔYZ š´‰–x ¨„¸•’ZŽĞÖr†€ù•C$y–!Éż´ğWĤ ߚhgġ€äIû=ê•…×ncDêŠ>ċŞèT%‘Í?)ħçuŽˆŠ-ĞUh S|ƒCĊö­ï‡¨³³q9/!ïéKŬ|BˆŬpÁ1D£4Ĝ@iÂAN8•Dd~÷ïú:û‡‹f–²,ö÷÷ĊÛUĝğ ”ê§ġ R£HĴŽtÀ /FĵraׂD;ÚÄFÎû %żI§Á"9$Ç3°_îʂ‡Ñ·!–#ƒòœôÏôfp”ĊĦ'÷Ô?ÈŻŭ"@Y„µ™ƒWnjĤ47#ĉ+†Dí\‰àÀÊĉĦ¸ÊiĠ,‰ê–còäHo¸­í[ržx,G„ƒBÀ.×§ ˜gÀéXQŝ[ïS{ĞE1úëcD¤cŒ1"²gŒ‘ĊbQ ]à ZêîşRü@ċ“ĜÔÉHëĜ’H( ÌÑC0C&¤,€irÖíŞ­î½rŻúĠî#ò˜_-W&pÏĜïMh7d4F²ñ@’Hzż·€ĦïyHOKÒÚÌ$éıO`œÒ bĠë*½Ü“&›KRBdWİ%9SI}\Étx*UWù½ÊÊĈäˆHZöOU›M%ûEġ @kÁAiıŽ<Ĉ’çG żóŸ|n™Ż²Ñ/_ˆˆaĉ’™ı,K.ËR²,“ηŒÀçÌ'Ġ P@ €˘‡g4žiCŠBŭéŭïÀÄoÂì*`Ò#ù… tÇâIuàÒbĜfLyߟÊF “>ÖÔGĦÍï´ït¨ñv TdXZdF=.à-0d˙Ì~8ÖDĥLğΉĵ¨ĜÙ À6?ċċY†\}ĉÒ1‡îÛPħ÷X1 XŒ&LX1\µ™ġx›çŒ'g#úĊïŝg_Öû7’w_͍1ı1Ĥ,˲4Ĉˆ1†]>İğŭéJx^>İ*Ñ)ıİH )0ġĞd`üB[ĥ³%ßâÉ@$Cn@íúÎùÛÜç£×Ë0dġŭŜ@@Ĉ‡Œ‹m½G=ìfSn¨5ŝA6އƒÌHş`Ô'ßqÏë÷ûı( Ži²½BĠ`SùÔI#ùħ“ŝšÜQ•_‚P³)ĦġŞù""Ä $ (Œ wTÛ0@c…OœéŝÎ?úĈñß˙?ï‹\I™9+Ë2/ËÒE!ĞĠ*/ËÒW‡Ĵû8éê÷#E‡( éaÄ(rŜtCı’îe\-²c´Ĉ)­ç_Zlˆ}†Ô"ƒÎjĜ Öîñ˙ìŭĈúë§˙ù˙uŸ™SfΌ1EQĈħ$îaI›FU<Ò]ġL8àQ¤Ih8‰ßğ†VEn|‚ï‰Ö’µòé!1(Óuá˘ïz’µĤ^âaáró8siU ĦVŸŜV`8ȀÉ6 ‚dçŝ›*=[ ĦDÜp>ŞHÁUäÁ2EŒ”“˙*_<€‰<·qê·4̑Üí4‰ŝ·¨Ŝx ­Pä%O<˙ù—ü~sçßŭ³3/˲̜tgŒ1’eYÑYĉ•LƒÍ²(ĠĊ@\m4$@ ÑğWd‹ŞÔz1s’ ħ—ÜvÉXŸ_$Ò3^bА _/ ­}Żc¨²6İ­ŬCGÍçš|ÖĜşë)-/Òûšú€t}öQ`=¤äž÷„ D31V •ħìÉħ" LR;E(çQ&Tı"ßİü(ÍH,Ài#M(Hƒ— ҄ĴN&„_ù—ßúÚèġc–Ĉ˜4Ïóĵ,KöòIÒaI}ù¤Bş“R7! …pÎÏRùĴÑĉ Ş}rL³ •ŽT…cΑr@`İÙuz‘ú’ïfZEÔ~ÎUY.ħ““œcÏ"Ħ¨’÷Ôô™ Ét›-‹ş2ġ3°ÔméžÊ;ô—İwħ€ ` R‚Ȇ,›İ’v·Ğ.ĞÊĞrpnyíužĤ7¨ÊÚ Ùɳ rWùGÊMÔUŒQĝĝñŭĝÛ˙“/œşqñJR^\L&“eQ™Ë'ñÁÁAw`ħϊ0$á} ,‰QW0)RˆA\jUGÉá7ïŜ7r\6?Ŝağïħlù15ĠJ°K¨ ¤›\VŬ SÏ ‡WÓŜ,ô•‹RµzY` Ŭ´!ßüÍĥVıŞĦ¸²@`²‰k4%òvSb´Ĵ›d½ÀŞ:%äÁ–/DŸs„ôHž­>§6,5cŠıˆ&ßTĦ€rù#e_]íi¸€ˆâfwTĥF–,u΍\ġŜŸ96úé—˙ö7ÎüĞ˙ú23L§ÓežçižçEžç&˲²çÄC`ôAb ´ )Rˆŝ W à$íÍR×. òÙà}È6÷Ġ™šê—ÈşÒ>;ú(Ŭ°ğŞY ĞÖl"ñüdĊ5€’Û­Ú‰ıÍĝJf˘ „ŞÜˆ¸‚ħUy䔎ÈĠ`ñĤĝ‘³ş í€Ĉ7[üû:Ŝ7nŬŸž’st˜QÛ"Şı=`#ˆÜR•@W ɽŬšLž}‘t'ŬvQÂVúQċèàg#ä^‰ W̋'>ġĠó÷_ùÖôĊ?ß+Ëò`6›-ó<ÏÓ4-1âŞîyç€ŝ)( Kq`„Ĥ_"D¤›¨Ê°<ĴOp\qĝˆdJ=yнk(öoA•9T5˜WċÀl?“ôŻB}{ĉµçĠ~ĉìVk„'P£ Ô(H`”P#šL *v·÷^§³N(M@­%‘XêÖuġ׃yeŭ#ßüuÀĵğœÁcR-›½ÎÚ\ŭZBP˔ĜLÖÁĦ#,ŠÄ{ÊĠ´İ‰|nZ4Y™0+½Ï´ĜıžÚ“/ŭçĈWŜĝlré­[“Éä (Š•cIUĠtäğMçĜáVSĉ Ù@ ѐ¨)ċ%ħ>ug %zrF@HaJ²ÁŬU0ċçxïÏŝxqùÂ{Ĥ,òFÎòJìüI³kÏĦVêĨ@5ü‘c‹CK…s4'` tΉ1­ëIiŠ˘ĵ0Q4ŬAĵ{ ñt†äĝIŒOœĈñGÏáÌıóĜ=q£ŬÑ:Ò0l³ŭ†íä)&jġM*'ëħé°"ÂZYdoÉ7oè…ê0£ö§ 5¨ĉĈ–lGÊJŠìsŞ+ò*÷x-ĜKĠ#ĵ}ĉ ‚ !Ħ”ĈµWÄvĵdŒO?ñ¨úÙg˙½Żżñ×sk2™Ìf³4MÓĵ( X’x_ÁpŬ–Ô!&R¤=ä2B­E›ÙÍ03 .1ĝ5Ìsú×kożƒÉ•‹ïŸ.³2/òkEQìcR•‘fµĝerĜħö–l¸œˆ”wPY§&†RZid·˘ùòĉqbJR`gE*y*ÉEbÑJŻ(%;Çizŝ œ|ê9œ}öc8ŭĜcíé%“]¸Şİĵd‹JcĞڄı¨¤cqÁŬ÷ıÇIBzÀÈ˙$¤3£†1ÖB*‚=×ÉVıBMĥŻZÓqİĠ’]iı&AĴEénġ Š!˜‚qⅯïÎ/ĵĝ+“W{£,Ë[“Édı³³“fYfĉó9÷ž„Clï+(ıÑîâzŻB@ 1¤$´²-è•o†d:‘-ä„’^-ŻÂ"[íĤáÚ*ĊÙ˘ätı|oµZ]LÓôfQËêé;àİɚ÷;zÀév "‹>ÔùYĠW’+… RD¤•Ršˆ"T4µ?'JİH)5R˘b²Qħ·ĜÍö.˜żôWğ7(še"£bN÷VĞĠjħXyž—Ŝ&a›‡ûzĴIċTkÄ6ò…€bbzÇ(´6vr¨.ŬĈŒjóöR•WğòhcÌŞ(ŠƒĠjuëàààúbħ˜‹ˆgç@Éç2  n³(Q‰Z¨ä“˙ğRJ°¨¤µRJ)"ÒZkíJi­#T¤µŽ*PÒZ'î|EÑd˘ġt7ŠfŻvÊ·÷ıġÎKż˙‡˙äŸ}rzŝ _£çżòUÈä(Ž!…i2`5Tx]’ Ètrˆ^OސŞ˙ËNÖ`ˆĞpÔΣNù³–Şħµ½#ì 5ÓmĞħijˆP~âk”úBR{e4ŬœÍf —K*=–¤:ßbI÷CĥÀ‚v­C)Rˆġġ֗|¨2<•~„’CrCG`FcÜjäˆ U³tìí çk–ċyžVĞ•$öÖ6î£.0m%:ú›¸ŝ³%""˙gċ‡ĥé&’(Šâ(Š’(ŠFQŬiEÑÎN˙âDÓ—ì]zóé?˙7xzüÜg&/|ë×09û8AP`cgOˆËċÀĜ^)ÍW^ŻŞ[{!ú*Tïfé˜Ĵ&[Ïn’mġĜ-t›–Ċs—Ş€ÁHD$(=G^"[~EX¤Ï=ŭ$½ùôW>wîÖ×F£Ñµñx|k:.WĞUîĈUte;ßVèƒaI+)4îĦËHBĴ­*äȀ۵ż`Ŭ3’ s‚Z·àġEŻşĦˆ€ˆ„ˆ •°ëa ñ€td†t@cşr‘ND¤,i˘ œ”cK:Ž(Š˘QÇIÇcwšĈq<‹ĝĜ8IŜ8–/N›o=ŝâ+?z’Ÿŭô‰O|ó×ĠħóÏB&¨&ŠK¤—Üö†ê~>ĵĈ‚eWvŻ+ѸĥGnà_5ÄOÄVrÖĠŒâġ(K›û ÔÚ° % ÚZ ĊèÓż|*żÓÏÄïż~y<_ŸN§Ëċr•ĤiÙùüšI³KÒäòaîèG €˘w-­ÁFÑş‡Úĥ̨ÏM`#S:ÜËòC³ Y爘ˆ˜ˆŒ[hJ„ĥaJ·ğ;Ĥ£‚ÒĠ€$"(˒PQä)~5ƒŠl$UÄq<F³$IfI’Ó÷NÄŻê—珽ġö˟,žyáÔóßúM5=÷$Hj­LıψM7gהv}àŬÁ„}*%WÖS.ϨĊÖnIÈÚ)ĤÖü,ß҈½_r–E•§·”¨ŬĊ,‰ô™GñĈ3żô™Ç½óJ’$WĈñÍÙlĥX­Vı—KêcH K2hÀ¨bL! …XŞz‘ZU[Jğ‡èĤt¤yFâ,y:—÷€‘éaIÑKw6r]/ u~@ŠŒ1dŒĦ˘(ê‰ œâ8ŽG£Ñ(I’Éh4šÇŬÑhtl”ĤWvNj÷tş÷Ä^û>ġĠ“Ÿúú7HŸ8ëş|ìCI§ŠaŬtz½€ĦċžÑ#áU÷Q²˘Ş ]“íYbgÊêtşĤqV:£ë½gĦ<ùĥ‘öì-”XGè_Ù]ûÓÏÇï½xq4]L&{ñx•ĤiÙSq‡–T]~YRäC €˘O_£zZ+ĠĞ· 3£žĉÉ5ê•í6FHÏôÓʇRĠ@TI+â@İ Ì–ÒŬŬdIۀġT/ ġ”2Ĉ” t–ezµZ­â8ž'Ir0÷Ĉñl<ߏÇ×Çizmwµ|ŸÒŭg˙ú͟âÄŻüÎîSŸ|4=ĉĈGl?/·ò†uĈz!ŠĴÏfêSĠÓT2jXÈZ˙¨ÊqBhͽĦUPS}kë'i“Żz“Q rExîüüüñÏ}òİKŻü4I’K£ÑèĈl6›/‹,Ïóêğ <é%ŬĤd¤îĞĄñBô0f÷)}†›˜ÒNjd0É$€Ö!Míԁ@ì|ƒjw<F]–Ä=€Ô­ğ› i0 ÔV€„ĤHM‰ˆqìIEĦŸÛj4-ĈñKîßʲìÖ´(n<şó“wüä§ċ×ġèô9Š „ÁìŒcEÖ}œú¤UYß@ˆô°_çYŝíX“µœÁİŝ{ç\io÷‹êçQ8#Û,FOż0]½û⋯3.ğ÷`•ĤiaŒé+˙Ĉ&–tÏ47%ĥb›z‘ …X]İß S6Ip}9 ^“A@[—éÖٖˆëÙuo‘/ۙ–ÔÍ'ĦJwííÛRÛF8ŒZÀTSQeY–EY–y–eišĤĞ4M³Ùì Ïóŭ<Ï÷&y~ëÌêàıWż˙ÙÓßĝŬŬGŸ~Í_`7nµ-Q_Ψmʊ­ËzÂ@AÍĥ AğŞIːBmŻğÊY˘¸ĤÀĦŭ´ß9;µ( Ĉ=·Ï~ò]yó\ǗF£ÑÉd2Çùbħà+RŜ÷ oÂì½snàNé|H!@ ÑFd½Ôšz†%¸žÄR˙ ĠÍ2]w,xë’ڍÛ]îġíVy$"2ì{[–4$ÛŬîv•ŽÀœĥÎ#mbI>(u€İ,˲ÈóGjrÒ SÊZ§Ž`ŬGŞ5pŻg§Ò"Zž2k1äŞôÙ IÇóˆ;r"Wß €b†yüÓÇÌ;?úDœż÷Îh4:6™Ln&I²ì°$`I÷ĊéÔ6İŬċC@ ѳVڝ¨Ô.͌áQĉŝÊħa’w}ÁPIxWìÛTmÇÒ²4ŞŽ(Û16÷#Ŭ Ùî0 o`Rۀ’&.Š˘df€İ(Š"u§UY–‹iùʒW‹ÏĥZ~â™/ü’Ö³“PDvt†i*š^ġÏS¤ŸÑ6͍Œ8$r%àuí5ÙÂê~­`0ާĦhŒê2qי›’ÂÙ'Ÿk/?óİ3·.ŭ4I’‹£ÑèÚd2™/‹Üc@=,İúŽŬ}–ä@°ĝŠ …ël%ŒÈ mPwéPhÀݳŻôa Œú&ŞÖ•èĥîğ›CòOĤç\î! ĈĴh `ê"l+ÛıŸµLĈffÌ1Ĥ(Š"/Ë25ĈdĈ˜tĈïĤÇż˙ó7aôçG;§ •3·e[^—îx gÔújxmâÌSI€’š~€ñüíŞÇcϵyҙÙT1,÷Ĝt„÷ùĝés~|>Êów“$ıœ$É­8Ž—yžĞÎç>ԏto>×7Ĉ-Ä"6wTÒPUorÀS}›^ fĤóDÎO¤Un0yì½÷î3/LW/Çñññx|m2™,œlÇäû" ĠRR2Hаü@ Ñ*ÍKòŞí&• ‰ĈŒ¤ïÛrO÷:RÍ<ïŞnµÜ&ĥt/%ğmğmÀi¨ĦŜÀ’T0‰cKRħ%1îçBDÌL„·“ÉWžxáó#=9""iĈ[ĴħĜ~fÔ²"ŞMZíeÛYJÚŭµv€˘ˆlu*üDê˘‰zš1P˙`¸êeˆ"H œ9÷Ŝ?vŝħŬK/ŸŠ˘èÄh4ڍFûZëtƒlGC²Ŭ]?Ό4Ӈµ ó …âH"í„ħ ÁP_ëąSúŬ'ÍġŭLâğ~Ż1¤JşM§ğYúM·qŬaeà}ÀÄèwÏğ§êujûъ”e‰4MŬfCŒË0áĝżûo˘ ÉèK}âÓq<9^KJ\šL7ȌÄk–~™Ï5UYÀĞìƒLÓüĤ<™Żr{¨ĈS8kÖÓ°Íܕ{cEÈÏ<ğ‹wDœço%I2وœs£íŜ•ëZléŜä‘~ €)Äú*Iu½kO!‚ ä€gFí5Ĵ Vƒ½KŬ몖†%Uħ]Ĉö€t· oé×oúyœü’jvä³Aac §iÊ"M–Ĉş@\ŽŽçŸĊ—wN~áÑÇ"gÒ&ŬM)뒭÷îqġ!u??żŻöÊc[Y'a֕‚“sn0>;Şf%U…žD#:À,J+ĴrƒÙ#Ó­O|bw~ëçqïŽF£i’$s­uîŞí¸ç½½?’ĝŸ`È!@ Ñì:ë™;sr00ŽbCé\ŻċL§)vĦĦÓŞc·ÇĝµŒd Ĉt7íƒĥ¤M@4ĎpˆÄäïè+6Äuùš™ÁÌ-ɲ‹qìòğñäxâúäï>{꤂ŽĈu7Ÿ tŬDÖ6kîvUŸÜ0?QbżİA9vÏb@ĵÊfBĴ=˙8Ŝ™=zödôÒI­ġħ$IĤI’DZkċŒnğ%à÷MĥöĞìĦö;RˆAĵÁi]pšgԁšİσ¤>%Ĝ|Ġzc  Ġúv&ÄvO} tĜ(Š{LCӇIy›ÊÁğ²tÎġ{S–e-I50ôhçċżËÙg•_úĉiÑ ”c8–ÙÔÀSÀàWż­}w:ˆĊL0”ĦfÌı÷=Ĵ0ı£>)Gb” Òçf2žž‹Òôxdz$IĈQ­<Ġ!ż·²˙|Zu! …¨DëÈ̌Cí}dŽ„‘ñ°YĤëc`âlf:Ġu]É„†~—Û`ItÔ%§çoĞäÛĈb¨Żú˒ş@4J`fdYys˜&;ß˙ç?òĝ§uî|2’x§é=âNîˆ{ò…̨µaJœ·Í˙ĝŜvì—„›!}Ü$â!•)­çaʂG§½w}vg˙S­ġl<’$ÑËċ’?MöÈv¤”ëµ²¸è{ )Zއ•R 0ĵİë¸C̨,ˆ6Ix;ˀÈ.† Şœ5ןÊö§{áú};µIr’ìşÀÔeHş_Ĥµr–eİÖz/ĥ1ŽxçÄw˙éıżŭ_8u"!R1HlĜÍÌHşLĈûžÔ}FUµ™FŝÙ‘´XS_uŸ½Ri›ƒR8~ĉ1ܝ8{LİqÏ˘(šÄqi­ġ!ċßtOż”Ô Š]¤Crğ–C˜ÑZbĥ§_鰜Q÷„Ĝ-ZîܒğĤs­³¤£Ô6‹Ü%ötĜ}÷úŞġP·$ÜĤîë×ïI JEQPšĤEÑ^’$£8ŽwwßüÙKôŜ+a÷ 'EE–:3Ón<ö4$ÓULĤÊÖ&r1¨=ʕı6hY—ż,€ÙM Óé§§vµÖǔRğn~ÔH)µry¤md;lùŭ8BpíFaQ40¤H!ÖWEkYv ä„d“Ĵ×oŽşvûJ {Pç1 ġVU²CSa‡ ÛähX[9êb%îO’ ·ëcI~tġŬû҃K¤ĠjµL’do4]I’äĝÎw~˙çWŸùÌ7NOsÔˆ\r `†dş.“ñ‹"Ş‹+p"ñÄÙĈÈut +Ş6ÒVâ5Èî#q>>vNŻVSǐâ8Žu5q@½·œ›3ċPf)Ä(uĥуIéÍ}F‡³+ôWf­ı7>ˆ)FÔ1?‡4 2ô,½…Sĥ{oî<İ큚¨†ÀÉ/lè“ú6½k·gĉ2ÏóĠjµŠ—ËċÍÑhtetÊğÓWsmġÂ7ώ’Jĵ FÒààĥŝĞĴ†ëu^9ğ*š -•“éş%ċ•ƒH}÷Ü#ğ|˜` š0>ù(&'?vp}ÇRÇħĈvŝÒŭìîJaƒ4Ji҃Á;ˆj.ĝ÷ҜÖôé3iÊt="ñï[ÄVMI{1İÇğJÏÀ6U•ˇzC)1ÀäĥɁġ•·wí“ú~_;1sY–e‘ĤéjµZíŻVĞY–]N÷/f˘XLa ÂÜÜqv³İšħî_Œ¤ÊùSˆkgĵʖ(6ġĞħÛÏÛH{$…żéİ Db쓳ċÙ9uËhçíj­'Q8ŽöbœtŻ4fWaÇ!…)ÄŝğÓyßí m)vè0£e5„ÎŞÙÖ½oϲh ĝÄßYK“Ş˙èÉG(lĤĦÓĥ dʲÌWĞĠrµZŬJÓôzħóâôµïŬrÜT);ÇÈĦ„ġ’k>ÄÖĤĈ žBܒ€ŬeĤ–ò\ƒ!;!–ûlѸs B ñDÙç:;yĞh2UJ͔R(Š’(Š"­ġaßtˆyY<=­µ+­uE‘ŸCÚ$ÍQû¸{èQċiC]¤}r[Qü™3}Ġv]fÔèù}·Fè0£NíDûIu€ħۏ€İĴħ%9Dĥ[“î\Ċ]žeYšçù~Q·‹ïĵĦÒa)í_Sûó–N<ŭÎgFĠwÇ lmP¸ÉI²ë?b× È ÓŞA˘,ûHfǑEcD4QJ˘(Š=É÷KŞó>?û`•DĈO@ Ñó!ĦìäŽŭà-™NÖ üѐnÁËġdK7ŸT-NÁĤ ˜ŽJGrF7Ĉ˜<ÏÓ<ÏEQìċizs|ñ}Œl2Á6lx•“ì´s;⊤ݲôPĈԀ"µ\Ìn÷R5Ċú`Ôbïhz”ê ‹“Ma0>v™‰hĴµNˆ(Š˘(Ú ÏmêQş+ÔHŒ³C2Ş …è‹RlCa_˘zHĤcéŻĤó áid:tAO:ĴŞŞŜC`Fw”úrKAIDÊ,Ëò<ÏWEQcnʅWo‹n¨ži†ê1ş UĊŒŞ/MkƒâÉĥƒ°m\—ĝ7ó¤]:ÏŭŬŻòsM èhŒÑH)5"˘Dki­Ġ=-ä:Ïş5|‘ …X˙¨ĠGÒ'Óu~&Ġnlġ%™fï<z"ÎE˘e!Ö%<ْ1zr%àEžçYQˢ(ʗ~^),6İU¨nföWñrF>SZsìİ7ìí|Ĝv{ŝFÉAIç1¸‰€À†Ò rĊJİ„ˆT¤”Ò€èžJxRÍó¨"|Ħ …Xßħy˙û½Ak%Ĝ]™ÎOhw’ÙÀp5Ŭ09y§şµĜ]¸lš‡€ÒQĈsĝ²]YEV–ċÊ377Ż%W2iÛĴ\2X-s…n5]íÖ°ŝŭê³ŞûĜwŭö69âġ µӓ+V;ße4ŽDé EDıqŬugS?ÒŬ>Ĝı.P˙H!ú–]Úyş =•w²^ÔFÒ'Ñq @ƒ½-hÊÒC ”ĥ£^ö$"\E^EZ–ċŞ(Šı\~{y,Ž­@Q‡ŭzt¨Uä²6ÏÈs˙¨§ ŒHg4NĞ“Î|$ 'gä^ĊÊĜĈ€!£x‡ˆbT¤µV°a‡†ğ JnüDcƒ$ğH!Ö˘ŜşQáÒ²˙‘ᜒ´ċ”n~€Ñı^rğN€7€ĜŬIĥ³MáའPşmĥäd;cŒÉŒ1KcÌÜĵ˙ĉŝH“o1ġ LËÔÛ²°xŜÒğżÁœQ‹Yyî ¨Ÿ=ìĵ!@Ċ#*žVìȝh3şwaüêsĠ0‚ıêU—ñò<èĞŠĞ;ŒÚUU=Ŭ‚ġböï_šŝ'–P•twdĵĤçŠÇĜSŠHÁÌıˆd´=›Ċ‘eĠDíܟiĠĝ·?sé¨l²ŜôÚ.z°Íĥŝ÷ •llI„Òrġ%Àš€\,[bh"RdKïÔmÚÑŬ9Ö<0 9¤ÀBô’ëS McYÎ٧щżëCgtù~l’餽ƒlŬ‡;€ƒĵq§, =²ŬĦ@ĠLVċ‰3 ûĞ7XϓÎ:  ˙ğ…ÒnjĜ’]­îWcÄ™E€Š*:›ڔ?şkÀ3|Ĵ‰çÑӐBĴ}DŜNÖH_ş§½hx„Ÿ3’!™m·fôÉ~ĵ~ôVcH ‡Jğğ´&M”$N%3ĵ8(çĵËöÎc¨€ĦÛKĈÍ Ĵ~IĞğꀑÈúİġX@Ĉ²Ż’Tä‘WÔ@÷”ÜÛŻàŞ0C €˘_‹žğ‡Igñè“éÚ;áMĠtÌÈI8DĠèrğĝÑŭĥYĜFväî‚-…ĴJˆXçÂŜFëùÀŽÔÖizE·avŒXÖïÏ/j ħ#éÒ çXíÍaŠb›â¸˜Ó‡qÚx…¨ĦR'RˆġĠݞÎIŬŒ^ÀY[@ïÚ ôY˙HoJÈw÷=żĴÜà{˘"mî[3³ˆ”L™çEDÖñ[rc{׌o¨+½ İùl›/ƒ IrŝeÜ<ëĠž‚,-‘-Kd9 Ĥ1 %̝ïéĥ_¤ğğ RdólŞŞQßçH!zµ AÓÔĜ€+76Ëtè\7ȌÖÌ[Ŝ>^ĞfÊw<Ŭĵ€üsfvŭÍadЂ܂Jš`r³nÏQ˙qûI 1#ŒZ_Ħï1ÊÜ`ı*. 0[†% Öu )I{róôEJ\y†ïs¤½KU͒œÑêL×ĴZÒ Tk̨pÖvÁŬë¤ËàQKbû÷$ °$·çn’ġVpyF6"ċ<í¸żlíyXeşnÓk/YĞĦĠ²Dş,PĤó˜l-G"ëÈ+ePm‡Ô£ûĉòŬzS*0 )¤H!Ö‘êĜ'iĵç†rF²öW–‘u‰Ĥ³ġík‚ġŻù—“;xĞI!îÊGN J6€eĞRk;ñUŒ´Ç@`  ÍU–IĥÍ ÙŞÄjY ÏÌştçÑj"…L#€ h1ˆ°;ÉĈ|<öġBôQ3u“;²‹FܳFġNzí\.Ò³enVds:RvÔµ ŸĠ½Ûĥ^Ŝâ-4žDÚĴQ¤`Šrm*`èn^úrFìXĜj™a5·’\k#Ŝ÷Óó™’B@#e탲”p; —-}p’e•äu‡€b TH†›*%Œ|™·´ğ8}ŬġŻkövŭÌȟaĈ"Pŝ(™÷œ4WżT%ÒD"R"S²mĦ)¤RÊmƒÑ°¸ÛdıÁjQ ]ċŭlşġ7íßE*vċĠœ!³‘ŞRPĝjHv`$ÖR"ä …ĉfÓÖ­ön tÒ#ıa˜wW=Y ä\O,‡yH÷‹­ŬÎYíTͤt¤XÙl{fFèᜑ xÓٍGş,ħ\( nvCۀ‘ûòŠk•‚Ħf 8ËI™Šˆaf.ËÒgH÷ù Ua0ƒTĜa@ 1¸DY#SYß.xÓu9ÓP؏qg´Ĵô,ġ”PH GH‘Tĥ;D¤âéN˘a›•Eıĵ£ż‹é¸(Ĵ âë£"gĴ–ÒEióQžk÷Q˜‘mXÀhĴ!ä+DbVsYRG²“û{QE=7.RˆŝDìPÓ>Bğf¨ëżöçŒú˜Q;Ġ$ƒîŜ­EK질ìĜì@î6mb âİö$%˘(šÎ" ²ßñ’!žğĈĈîż,5XäÈsÓ²#‚Qk¤íĵ•™Ä(ıHiŒ1GÌÉ]Çğ²DˆH!şB5 áì*ŸħCí€zg%µ›QIÈġ”ğR+­uè#üBkMʆVJĊÑt'*XÀħ2›1hÍCê#_žµE %V‹\rĞş0ŞĞE]i@ÌE.$ıóâ+Cú€’H–1Ruœ…€bp/ ‚-áċċé3XŬÔôÚ-ô2£ˆU`)![ÊĴżîò>dó´TŞ’ÖZıàq²s<žìÔ'ncw>iÈĞE,-{‘ğF6}äċ‘Œ@”ŭ.—ó=$d ÉÙJv1Ĉ •>;ğH¤Tp­€âcEĵqíUaxäĜġµe33ògÈğ[—šöċ!î@ġ1$íĈGD4ŠvN$ĞÜĜĊµÖöş(¸óUZ`9wE = w FŬË(Rntı†É÷1Ĥ2e93çnĥӐËù½50 ßèH!z€Ċ²"&ŸíH˙>ҁK_Zĝ(ÌhÍž¤N†Ĉ×^ˆ{>ëë§RZkµŽ‰(!˘Q4ٍöb,‰" ì8{0J,L·$ü‚Ò€˘˘f˙&&0+fΌ1yY–3›CHŽxùöaĜ™SS„"RˆÎêDäıá÷[ûlvín3£ö†ù™Îêd;üj„i(l¸O`EE‘Š˘(ÒZÇZëÑèÔÙQ2Vób0PšjÓ0ëĠĵÄrY€™×ó<÷Œ*m!@i^^ǔŠ["²ŞRQfdîË7‹”²ïƒ˘NDˆH!Üú/7ċŝj:tí·şŒg[†Î…Ü£zş³Ğ²Ğ›À’î+["˘(е։Rj<9÷ä)!`Qˆm˘Vf.˅58éE~ŻÀˆüûwßiçàĠvP^3Ìİ1&/Š˘pġ CICĠ†r×ŜiA]8rIB ğ.ı‰ħ>@ô¨kë~e[zÓFġ à7Ñ€•,şwÔ[ÜÇqÇq¤µi­§³óϜP,n(P¤˃ éŞô˜ħÜ_fÔúŜTlkyq:›8ÎoäĈdeYĈS–éœ>’žä΄aŬ# ²éa^Ħ\Üí\ğ‡™R3ꂑżA”5˘ş‡P ƒbĠ!ŽúÙeöOuNJ)•$‰Ž˘(ÑZ”RÓÙı'wÈ3ƒĊAŽĠ­ RòFĠĉE bsċ2ĤTĴ˜yeŒY J%և÷­¨Á›‡ÄA}€b˜%­H› fz‡b{Ĵ‘Û9#îuŻr,€ŝ€Ì^>˘Ì¨;Â{í6ZkŠ8Ž˘(‰˘hEÑÎÎı§g?ĵ²Â+ÈŞD£­~@`TÉtUİQ ^\Ž6K6ĵ`ĉ´,ËĴ(ŠĈĜC›ƒï˘á@Éĥ2„€bà¨cŠˆ Ĉô3# Ipë`Ôj[êş=ĝk’pYݝ! 7^]ìópß) ÉuŬž$Š˘H%IGQ4ÖZÏĈ'OŸ^Žv£·ŻßŒû Yĥ£ĉıs›`TbŞËI–VÇfïv¨¸ÎÌ˲,Ó˘( ׃Ôǐî ġ£# uB ’r o`F}Ŝŝı @=xÛ0#q— ÙĈĜÖÂânT/UżÇq%I2Š˘hޔڙ>ûÂıÂÍ ;ŒÏîbĝp0˘Ş€×KwČ#(›˙¤XAò%Ìâ&Žëâbi̲,Ë4Ïó˘Ó+–ïîMoR‹…ïr¤˜dU×ù°Ñq^Ŭ–ĥfFġ™´;ŭ+Ğ´`Ġ¨³ž?êÊtÔsNZk•$IÇñ(Ž™Özw÷™O?²·40Ġp<–öÔӍ`$wWĤóîÎ|×Öz[ɜżQqETÜȌY”e™•eY”eɸ½¤ğCŽ£şÑ;0ŝH!֏BÛìŠu0ZË-qWš!Ñ:y½DoSŜŞnttİ×KÑCÜ+ĥEQÇq’$ÉDk½£”:ħóÔ'wßĜ/ìG“KŬ*0DĊ­ŠMñ.€‘˙‘“Á”ßş€*?`ĉŭ²,—EQ¤ä›Èˆîjĉ’Şc­Ê½zœJ$ċêvòċş­ÊÉuñx<žĈqĵе>qòS_~ê 3Ĝ?È-.7ƒ@^54ğ‘ĉ£Sfä,‡&ˆ”0du9¸&'GċğyY΋˘XfY–EQv@ĜlĤzOĥ?b,(Ê)Äà E0./À²<|ö ÷yn2:C.ßkwȀ¸ñê!î S’ê€J’DÇq’$Ó(ŠŽEQtòÄó_<ñÊAVváÙÒċÖ˘ZċŒ9’ä9xpóŬşc™cGvR Ċċµ·0ùRsqÍsPĊ*ÏóÜĜ\İŒän$1óˆŻ\=DìBĴyDĠ‚"mùŒQÏ442]_ƒTžfniQuĜ³÷ĞĴƒ‘x€'âŒ_Ğu/ÁGeG+ézĜĊqÇQ’$;qŸ<ŝô'žŽNžŸq3…¤ĤaGX#‚"n§FşóħîùŭO("Byġ-œÔĊ-cÌ^Qó<Ïŭü"ÍŬSçïœÉ•ÌÖRˆu@âš'5s½#Ċ70 5½n–麏Ó×XKîĜ ‡ï]aIC숔Rz2™$ñxÇñ ­ġé³_úÖ³·V%n,Jˊ ;w†öwAW`T{µU•‘Í&ċî0£öĉ$R ċĉÖEœŽÌÛeVîEħÈó|ċ@é´]×İ4×C )Dßέ޲fñèšC >ÓİÀhSĦB·°AZEëy)"‚@`Œ„÷öĜ°ı¨Ħ>Çh2™ŒG£Ñħ$IN%“飧>ûġG^ż–¤œ›ş= ŝüT1#²½@ŝö˘ú˜ğF o?céE 4Ò(݉I~3 ¸PĊ~žç‹<Ïó²,7UÖġċ“îcb˙µ…ĉB $ħÇÇZġĵ–Fi<èêŞ·Î<#éa@ÒSM·ĤÀU °Ĉóıcï U÷|û0ħ˘îï*Žc=G“Éd6NDQôÈ_˙Oçj½vmbiĠ¸xHĠOmÁȞWċŜ•ôëÉĴğ9Ü3òvLDb hByċUœŽÊĈ˜[EQdYĥʲ,7Ĉ”ž° „p/™R“Upgˆ مXßU[5†Èšz‡)˰QjkFRkÒú줵_z—î,%ğĥîŠ$Ž;cGO£Ñ(šN§£Ñh´Çñİ(ŠÎžûêo>ŝÊġYÎàÔXİÊşeU+ FÔL ‘Ôûû½àğ F\?uÒJŬ‚ıuÄüV‘·Š˘8pr]éċ†@i“Ŭ)h¨^ù;À°Á )Dï^_+é­ Fmĥ³ÎŒe@Ŭû8Œ*9‘Á„$ҝħ#˙2ċĞ8Ž£ñx<Ç;£ÑèdÇgÎ|ĉ—>…Ŭ³Ó/-a2FĤ=7K“´™:ÌÈċŒ„ïĦ²íp ÚÍ·W@qñ%LÒëË Š÷ʲĵ•çù<Ïó̕{&ÙŬŸ1ĉÊôeBc]`H!z—,?TµZÚ]İ1-ëïĈ­µdaŒàÉ;Ġ"'hÏh qğìHuÖZĞÑh¤§Óéx:îŽF£G˘(:÷Ä7~癋{n, Pr›= )'×)w‡î;cĥÍÔŬ~Ĝ;`FÄÍ÷‚”D¤Š+Żàñ1_.ËòzžçûY–-³,˜ÏЇ›ĞŜò‹:(˜†b%qdƒLWċxÚŜÉÒä˜Ĝ?š£ö*Ñîc"ċŸPÚŒ†ĜQoߑRJÇÑt:ŬF§â8>{úıO}rçİç˙ìò’—ÂÚ˙°cHZÙŞ:­Ĵğ_ıÎÂëžwFĠßڗC‘{Šŭ À­÷ùLÂŻEq3Ïóŭ4MWyžÌl60˘{ì̃Hu1…Œh¤›woÎÌ´OĤ´üËĜ—÷:v@½Çv+‡ =yh쉚´ÓI!Anż=™ŽX’ ´Öj2™Ä³Ùl2™LŽ'Ir6Š˘Ç>ñ{˙£ç/ìtáFj­‚Œ€%E‚]ıkğ†z×_ġ™qû3†îçÏÖä•…òҋ8Eó[dŠKyžßʲlžĤiڑëÛı|ßӍŸÛAĜ̄/u¤½ jßıŞ‚Nĵ¸'Ó5${ËvaCC˘¤‘t`óT"^Ç,|àr2PeI£B{û°#Ġ§8Ž£Éd2šÍfğñĝt’$>öùŻ}&yìÇĝŝRr³ qĴ'‚Ş™‘‚-`h@BZAR2ıójşîK¤Ä6ÂJħsċ5œ›¨·Š˘¸‘çù^šĤ‹˘(rÏğŽħŭ¸‰ö·ĝnÒr·‹ĞßÓ Ĝ@ ħŸ†íAŞšġdsC izÉzaCF"b­Sj òċċPmŽf 'M: Œ61˘.;Òñ8žÍf³ñx|*I’G8~âıßù{Ÿ|ŭzŠ 73pjÀ…m‚ÄDˆ´ÍÍ+¸BOĤĞYû ÜEf$Í+´FŞ5А_ĝ9&ĞĞ‹]Ê_/Šâz–eûišĤž\LJ°¤]Ô½aKDîuU6öá;)ÄÚ!Xċil-/­F}Í­MŻ’•ájÚĊŬmİôş…W2]5sGĜJD!ÖÀ= ɧ5†ä âÙl6™ÍfÇ'“É™$IúW~ë˲{nö£÷àyisF…#Eˆ5A“=Ġ3}|ǁ ŒX\…ĉ]£zĉ‘WQ‘hVe(ߏOäBY–ײ,ğ•Ĥé"˲£Èu÷­ÊÎ~—ĞÒo ’]¤CŠŸéš¨v›ÊûJğŭqu¨mŬŬÈtèÉ+ô€‘[xŬhġPÔ0F‡ĤvÙRÇÑl6íìììL§ÓÓ£Ñèüdg÷™ç~ŭßúWV¸z+³ŸQÁ€0´ħ"hU•x{MİÜùıêp–ğ̌Ĵ%„­¨PvÙÈ/„hŝ~~&á—ò<ż–eٞ¤Üë=’ípÉŬŝ‘òüƒÂ÷ĝAŒPöŭ@¨vvÒ&„ ԃÎ:â3#ñ5ĥuͽ¸ĴŻ;[QŬ€Ğu‰0Ä&İNa¸AÇd6›M§ÓéİÑht.ާ>ûï˙Ç_=ˆ~|ášŬ”äö‹!V„ˆÈUÔ5;áÎwBŞœ ßŬ†Îw„"éĊğ?ēq~ı,ŠËyž_OÓt?MÓ´,˲FÛ0˘ûÀ”ŞMu<¸B†˘}œ `*[|Ż´›=˘# âu0ŞKµá Q·#é0´nL€¸Î[ ˘ûPŜhœ”Š˘HıĵÑxww÷ĝd29›$Éç_ĝâçùÒŻ>úŬwĉĜ_Ê@ŒvR]äd:EâĈKHÚ̈YjfÄ|Á¨;ċ<ëb ŠŠ+/CŬz·|lB?ËóüjšĤ{ĞĠj™çyŜ̰d‡íÑ] –ÎÇ)0¤½ÇžaİG,·À‚ğ? íĥĵĦÏHÀ¨RĤtgÚ ¤mĝ!Ç£-ÀHġ°$b'Ġ›L&gĈñéìcŸŭğ˙Ùg_ĵĵ˘_\\@ra†Ty#[ƒÙlŒFҌn›‡Ŝ 0r%Òçΐh%Êw„'FĊ%.‹‹Y–]_­V{÷(÷ŠŽFrŸµÚùHÂ~<RˆEZğŬu€I1ÜgTx„Ĉèyĝ°oËtÎîòU=€ÑQċşúç$I˘Ùl–;vlg6›šL&Ċqüôçŝöß˙ċƒèÄäß}fQB CÁ8"(!Dh—vû`T5BWÄPğáÜMfTŭÙï!i ĵòpíòüIúyĥÌŻ¤iz3MÓù€3ƒ”zżr/–D¨z„í4äA² 1pĴĝĜ"Lw0jώhšöŭEf#u¤úÉ( ~¨™mçüŸuuµŽ&“Iĵ³³3Íf'§Óéù$Iž>˙İÏŝÑ/˙Ĉıï\XàÖÍÜ2£’1rĴ(&‚RžLÇT6U W2ħ=lwŒˆ@•\7‰ä(Ŝü.žL²÷Ìß˲ìÚjµÚ[­VCìhKÂ}“ëêc˘#€T"ҎF€ Sò½EÓkk$E•ċáž.Í0’mÀĠA|T• ˆ‘éí;Š˘HÇxwww²³³sb:žÇOîž:ŭü/ŭG˙ĝó?ğ–Ñ‹ĉşŒ•²RY7†Ú<µ5Ú^3²ĊHğŞîn‘$lMTI "âÂO oŸÑ_çy~iµZŬX­V]v´ ÊÛïz0[ ïĉ*Hv!ĥ8PĴ4Ĉ4–aC“^ħ>vĵġ ·™ÁëMÂÀŭtÁˆĵûaĴ˘*ğÒîdşµĵÑh4Šwvv&ğğğÇg³ÙÙÉdòDÇ˙ċżüĉ{<ŭĊë7`V%˘‚‘D 1ÄM7ŭĠ³˙ñòEVĤc°qeŜ|dşêĠFvÌg7‘żġ}|bGŜ1Eq!MÓĞ.w´ôĜQ·Ä{Ûj;Ï|äŜ|фê7ġ>â`ˆÀ>TQ;™ġNzm–8Œ<—™ú:êF~ T—ù—q#= Ço‡Œü“žL&Él6?~|w6›™N§OÄqüñ/ŭ˙ÉŻ™Ó;ŝ§/ïa˙ GÂÀH1)DŠÜŒ#jÌ =fÄÜTÓĥÓ|ï*9³V‚]O¤ Ĥòw˙ Óù…Ċ#‰üu–eCìÈ Ña. ÷…!ĠĠuÂaù €˘ ŠšÊnèN€ŬŒ¨‹fĠJZùœqÏŭtdşša)”F>ò*GÑĥҜD”ˍvwwwvvv™N§O$IòÜ3_ùĉ×ÎŭÊï>öçoàÂ^Š‘aŒAke­”-×÷eşş´ÛgF,Œĝ€Qµ‘‰5TĴ­êÍ·QĵùWòÜñèċ<ÏßOÓôÊrıÜ[.—ËNîè(Ŝ÷œ”òòFA² €˘gàr"ÜĜóĊ³eĥê1#o@ĤÚ$÷ €QµxgĴúP°"Âv½E´Œ’ét:Úµqf:>>ž;ġĝÓ_ĝüßŭŸ½W—ôâ…9ĤL„0Ö°9#ÇJÈo‘qŸ­˘sĠtĈVÔSŜE™úî8ĥŽq‰JäŻŝ9Îâ֍e^ʲìÒrıĵıZ­ĉyžwÙÑQ ÖvVrOí@ĵĉ>ÏF+ă!‡ô0$ğ(Úy7] ²Áq䃓^0ŞóH„ħĉ`Ġ€ÙG ñ˘ğÓTE‘Ž8ŜÙÙïîîî;vì‘ÙlöÄx<ŝĜ‰³ç?˙Ğ˙èŭµ—öUô½×o`B­ ÚŞô†€ÚF¸Nš³'Œ\!]ÍÙo ı´U#lñî_ĵ\<{:ùQşZ\\­VW]e]ZEħ;Êw˙żQUİ·x£^B@ ħÎSI`júˆ\É÷&™ŒšĊ‰z.ÛŒÄU˙)ċvá>½%ġ1A; 4ĠtÉl6;vlwggçÌl6{|<|vìĝç~ŭżĝß}óÍòĝä/߸] ˘’kíè+q‡ud:#ìÀHêó{F*RÎNœ@ħŻ.!{ġ/ñż-y+MÓKËċòĉrıœwl‚ĥeGÀ}.fXƒ? ŒB 7>="µ[f£(ŒÖ˜—síĜg[²Öĥ„žĊKı’;#úCː¨ßĤüĥ§ĵşsĤ´;šN§ÉÎÎÎäĜħcÇf³Ù#Óéô‰ÑhôħŬ§>÷[˙ĝżüĠËÉ™Ùż}ġʂ1Q *h7šB²;€Ĉ ·‘éj0rr]y·Á¨úM+ Lš­˜‘˙ôÏp"½¸wöôèGóyzqµZ]uı£´,Ëbˆ†ĜpżK½{Ž5q#U‚d)ÄqbĵJ;3F8œĠĠÙĥt¸víîŒà-À@ X òĦİú>€nW˘ë­¨›N§ñd2Ivvv&³ÙìÄl6;3™LžFϝ8{ŝóżŭ˙Ëo^T§gùĈ>Vó£Ü@ AC´@HZS+™Î˜ŞŠÎž— 0÷Œ\ó­@@:‚šjï|üΏÊOžü(ËVï­VĞK‹ĊâÖbħXş|·“;şżvA}`q3ĤÂş)Dß RçvüÄ0É2]µŞJ£²qƒcéFn).Éŭ 1$Ú< ‰ĥüŭĥÀ¨jxŬÙÙíììì8†3ñĝÉ$Iž{ô™}é×˙Ñ˙ĉ+oç³ñ_ĵı‡ù˘À¨dD ¸h&05UÂ\ç‹J•†Q–¸ẅÈĉ  $Ċ€ıñ6²Wŝ5>yŒŜ@™żĥ\.ß_,7‹ĊA–eİ1ĤĦĦ‘CìèŝÈuĠqFÁDêì …:RĴyİ4&ÄC`$ë -0reu"Ԛ—ŞŞĜòÍ:‡À¨Z0µ3֔‹>Ä”M m?ŽxÙ&Óİ(Št’$Ñd2‰www'ÓéôĜt:=5ÏF£'’$yîSżòëżüċżûžqġ÷ŜŜGĥ2ÁŽ'H ¤$0q=é•McT²À0£tò\i€‚­#½#h€â@)òW˙ÉŻŜ8½“üh>_]\.—W‹Ċ­4MWeY–Žm’ëĝbGôìw9}@ qÈr*bîŜ:$éqí^£êgÒ ĊŜŞë-H÷JܑâüÍ °ġ|ö,‘@hŒüËeKĦÛ¸Žĥç$ˆT’$‘“èĈÓét6›ÍŽF£GĈñù8ŽŸMĤ˙Ġ˙ñö3_úöıï]\â§ïÎ!%#a2pE&Ĥ)ÓŻd:WÎÍl%ıÒ802‚˘ĉŜ‘ŬİĜŠ:$ PŒüµ?‡~˙§é'›}/].Ŝ]­Vï/‹›Ëċr™eYÖÉmkô²#8Q²%aĥ@"RˆžCUùrç`ä­U-;€‘XFFCvhz˜*ÖeeŜ…ùËż\°]gâíÜĉ¨ÒÜF™˘ÙlM&“ñd2™N§ÓŬÑhtz4‰ĝħ(Šžzⓟùìoŭ§˙ĝ‹×˘ŭúŜBT2ÛϏÜNƒ[ı"€™ë× aFĈĉŒÊ{ FÊÊV˘ì=+ïŭċ+˙†żĝèô'E–\./ÌçókGêŽ J÷]UıZ֞H!şGH½XHĞîàÈ`ä,ñĵy/pùŠfÙJCUĥuÎ@HlqEËê‹›Ħş<¸–@ĥYÔݎ\wÓV‹ŬÁċCUt›À²Ú2Ğ(ŠÔd2‰ÇħîÑÉ$II’äĴÖú‰éħÏ}ûïŝŭ/?ö•_;÷ҍŒ~üÎËyŠQ DÜ6²­ ޞ"ÊÜ M ¨Q„ò֛È~ñ'ĝĝ.ż3˙b\^\.—W‹E×ÍÛ?ùvA‡ġ}`ì°L”jé.D¤C6KcÔY`ĥ£†êPkAj­ĜnAĞĤIpĊ¨& yÏf‚^gGG£jħçu]Ĝĥ‡èĥ˜QEġT×étÇÑd2™ŽF£Ñht)µuŒ?7ìèÌh}'ìgmÈ5_Övyġeh<ôœCƒf†( \d‹qıԔtıœzžXKğ@:Ĵ—¨—EQD>M&“d4%£Ñh:vâ8Ŝ‰˘èXE§´Ö§£(:Ğ£ĝü/ŭîż˙ÏŭÚï=ħ§ĤÉwxûĈŠÂNxJ†"kûcçGYÔÊ ËŒ 00ğsˌr#à’ïi²˜Úċ5#éOĦßŭ~úÂǛĞ7‹Ċ…ù|~uı\¸ŞşÂĦM=GŒjĝŜĥ iĞ=NˆH;(ԃúzéS›ĉQ“ÜÔqŝV=nà•Ĉ×ÍĈ—Ò­Ĉµ;T(7Üf[à9 ˆzh4iw>ÇqÇwš9:EÑIÔi­ġ™3O>óÌç~ġ·Ÿú żôÈRϒï_^á͛{(R 1bËé×Ċ Ĉċ˙Şİ"€1MCéìlႠ(-0ŬS0Rîˆ jdPĵñçàWŝĴüüıŬš<{Ċ1\îä|İî0PÚÊżN>@ïRŞk‹"RˆÖABĥ;Ÿ4YıĈK€÷ġ$mçUÎ)ħ ä6òÊì7AêĵĤAEö9$d§˜˘)ù&”T ÒQF?£#ÁÑh4ÒZk5•ÖZF£HkF£$ŽDk=ŽxEÑTk½£µŜĠZ×ZŸTJž?ùĜç~íßûôÇĝġs“3ï\^|çz†÷oŜrŒ ĥŭ\ÀXßA#Öŝ‰ÙÊrĠxqc¸ž_T•veĊŒìÏĉ^ƒT˘Q(AñÎw˙üÍçΌ~Şıĝùbı|çàààÒ|>ßĞJĵ7䍆z65>à˙ÂÁ;(Rˆž[³Ĉ–ö,‰£€Q-ÍùÉÛ[ç“Ä ^sâ9‚ËU6_ÎbÍŜ"³Ñ¨jV%ŻÂN Rˆ§^ޏ֚â8ÖI’ÖZ'I˘µÖ‘;8Ž”RIE#T˘µž¸ÓL)µ£”ÚĠZ#˘“ZëSŸú•_˙Ô§żŝ­'O=óÉ7SĦ— ĵŭÒ–i -‚ˆ€Qa+çHWƒŜlnˆQùY0ŞéĠö?Î}ĦĠgÄUîHPŜk0ÒDѝ(ï}ùO˙€_8½4Qü“ĊbùöÁÁÁû7–Ëċ+Q`½š›?êpH!ɎĈ•İwT„€˘}°ËUŭÛ£j|ı4ÒäŻêҚâl™‘ġŞ#WÔ l?ğğÌy:aE­?ëäô!2\ŭ¨Q€DQ„(ŠŞ|i­ ´Ö¤”RZk((Š"EDJk­”RDD:Žc”Š´Ö:Š"­”J”RħÖ:VJ´Ö1”Rw+fD´£”ÚUJ?qîñóûÒמyêӟ?súÉgw—éwös|÷ö2ÊÊ&$ #5[´Ĥi:&+̖ ĥ›ìžßÌ .ĝÁğnD"‡şĈ­·ìġ‡ ·Fş3[4°§²FĈ#?gT ŠÂÜ;0r…djĴAš@â½żBúƒß—Ï²×OŒâï/‹7.\;888p#%r}RŬ3:LŞ{@Ž5÷ŜԛˆPÔ)ÄúžMÄÍB¤²ŭ 0j1£è ‰%LԔU`¤µĈžVr;‰Ï0ĈQÔn’$§'“É™N§3:F)kI)\Š,fŒZëQǏO§SŽxfŒY8vTĴG] DîwñÀ§"ċ_@ğßµ:1Eï<íÛ9ùĝS'“Ñxzêñ'Nœ~ò™Ŭœ›ìœzdĴâI”ÁAnp+5x%cÜ|żÄ<ۃ)mS°fV S"HខAk&|=7Ş;Ż£žÇMĊ\]9gÁÈ´dşÊ¨0Œ˘°ıĤ{áMGŠ dKğĠ$E@ŝöwŭĝż•çËĞ'ÇÑ÷—Ëċïíïï_›ÏçûĞĠjY–_Qוç6ċĴݰƒ€äÀ¨jÖ ‘ …è$ ì+ FèÉE´ĉNPe½/MΈ„ İSż]8”0Hiœ˙úobŝú÷ujгQíŽF£=YU Twïç–$÷ħ?wZ”&a&ħ.FöuİÉîññìÔ#3ˆèSO>½ vϜë(ÖӝcI2E  (ĞR•Œ½ŒqaUâĉ…Ëô–­ Ùö‘$̖=ˆe?BÜÌÈáȅ;eöI†uÁ‚FEtÀ¨ĴÀÈx2á:gTŜ-0ŞתÊH­ Š FÚ2#Èßü d?ŝçüéSÑKÇġƒĊbñĉ|>żàÀèÖjµÚ–™C€hPŞ“dD+ûX …Ú½ıM"׋´Œdm¸ž'/Q%—‹‰Ŝ€žTÒEg˙Ê"ĥħÓŬ·PĠ—äìV˜qlç8ĝżŭ?}òÓ§FÌ\ñƒ3é\S@¤1çï9çlĞUÉ`!f78 ġ<¨•¤%#+-ÓıR ĉ)#Ĵ²›(ĞYOÒ0;‚@+¤²íqĈ¤ۘ # ċòA•­şsQhŞ=àéÒw[NĤsĠsĤ´2] FÜaF^żQYXPj/×w6vŠ ´rĴH"€FbÈ_ŝ˜˙¤üÜıÙÏĤŭxħXĵíÉt{ž-PUÄÍmSî½ħşîÁ#4U(  Ù@ Ñ/mK½1#éqjè#ĥÍ÷v$6 İ€vAâÊñ¤šŸDÎŜFl‰wċqÇ`¤ö3ƒŸ^7xi/ƒ+…(R°5„Ty'"°×Gu¤y”AJݰŭW¤­Ë”r–EäX€¸BƒqÍhܢìÀĈ>a‡°A)HÉħÊ Èݞñ!kËçIÓàÊħµ*ċöĞéş`T5ğÖı£>0’;#”Öö;¤ ˆÈ2£ü:²ŸŭÔë˙6ŭòS§HĤxq>_ĵ3ŸÏ/\[,ûËċ²+Ó ħ#ƒ£Í:z°¤şµ Òû  …·àì<‡†jĦ\kˆŬŒ|ùG„êÜ|3÷Ojgo[Ygًm Ş@ËÑ#לT­Ñäv)H.@¤`ÄM£\ÉUĠJ-…Ù…|/-•RŻ£RY$1JÌÖÊĤ0 ÜÇ+&çl‹¨vÇ# tÀFԔÌCZMĊ(íşYoнaS‚.ûì£j Ħ³ŝ1l JÔ Ĉ£êÄhJĵ cXî ŒêD @EÊ~W @ĴĦ&sġ%¤?ûì\ùà3ϜŭN™gŻÍ‹w‹Ċƒƒƒ‹ĊbßÉtۀÑa°GK<(ì¨ÖĈ 7MvÁË.RˆžÛE–ĜÓmƒ‘hNĈŞĜUnèÜĥ*60y‰&ϕޤY˂eŬ"Çr@"me>(E5ë+Eps‘£ö ċfĜ’k!víĞjív°ìħĈê‰×KŸñÈKĞAËHĥûIOŝ͝ğ…8FT3#ħ… 5(ħ³r—.—T7V2]é Ìm€:`äŜ#Ş|ó‰‚G€.Qĵñïŭìċ µéé§Ï~wµZ½½X,Ŝ›Ïç—çóùÍjQŒüó£¨>ĜUuŬ0ÜlBT¤H!"+˙€oŒŞ­i°mŽ7F%{­/t ‚qTJ9Ço¸œŽ4’@(ÙÍ[B5χ9KëíĤ‰,é!+ n-‹žÒféYs˘\Ö6–•žğÛéŝÍ0òd:v(hÌP…Ĉ“ê*ƒTӑîŞ\‘1ì@ÉċŠœn ŒŞÏ˘Ú¸Ú|ÒÊnbb Dä7‘ô/À/˙YùÂÙÙ+ÇĈğ?™Ïçï.‹ ‹ĊâÚÁÁÁÍĠjµÈó<£nEŬùçŝĤ>€Ħ”%6!‡)ÄP0³ÍŸô ħì£u6 ġŸa˚Ù5y˘rh l­$ Ë@*ıN„\É·ÀXÊS—ËŠ8!ĥÀ\™´]°5ÙżĠ¤9cž-Ğí> •.şp `‰ô²ÄmÀ¨2B­ PÙ2#f?g°p-×ħİÀÉ5ÂJUîmÙRéKvš0â‘ħ£0#Şí›(²;Š4 •ŭ]) 20W^Búâazċóžzô‡ÄċĞóùü‚›gtŬ.‹˘Èœ&™Îl)ÑòF;Ş$Ûjì)HH"@ Ñ·s£öá>´ùÌIKòĞéüÁ³Ê!Ñr–T8¨Ğ”#!{?LíŠ D4˘ÈUèU‚[™Á*3ĥÙÖYUóŭˆzž{Ÿ„&닉ô0Kô”ĴßLà7·z`äŞúĴ×%ŬvdDUU珎Ĝp͚Jß½Û£ŞâôòF›ÀÈ_\Ž£ŝµ˘ğqĊŠˆ5$żüg˙ċËÎONʋO<óèÒ4}wµZ]\,•D·ïĉċĈ˜ĵ|JĴ÷mĉ=L$5;?ğA#²ì?D¤ëQ-:¤İßuÖçj*ž]Óé5âFF'² "[a‹ŞŠ;ë nÁĊĜâ"h#nn’-^ ²+ÛŝŞDQ°kFžOžc`Ôôq6}X· FM5ŻĴİ|Ġ¸ê6âŬŸ¸*D;8k`ކéħ˘'5S’fž‘ïWÇqŒÊÀĠŜ ĊHÚJtž&”WŽôŻ˙{Lŝbñù'ŭY~ĠÉs—–Ëċ5çĜ=ïÉ™ŽT· m“7zÁÈġ&H•£ 9¤H!zÛİ‹Ĝrç;£ê:ö,‚êššŜçäz•,8U€%pħ["@Á€˜ĠlÉM05Cŝn. [şíħ"ë!7IŬ³ÔL´­ú˜0˘NÁ/·‰×‹ĠÔ.Èz>ÍsZ˙}öG,Ġ% ˆħĜ÷D êÂv#%Œñ+ì°Ŝ{Q‡úÔ1².ĥÉP‘Ċ¤ĵşŒôċóÊ_ò“Sĝä³ç˜Ĥé{ĞĠċryuħX\_,iš.cwéÀhhĤÑŬ£ÍÊŜ(×Ê …è=HÜÂEŞ}t F,ÊjçNܑHf˘šáˆQ= ĥvĝö@‚!PŽ1T>äŠĴ´g3bÜZv44‘mR%;7qgî Şƒœ4e/—µyiäí`[„P’Wž--“ôĤÚ0‚74NĤĞe=–ÖP½F“–“wċa×#Ÿ)‰tÀ¨ž(ËÍÌúzçîQF@‰ËEʖw—Kdo|ùË˙ Ççïí}ü‰G_ŒÀŻĵżZ­./‹ëËċòÖjµZx]Ÿc÷6îŬG)ïŝpHuŜòöàB´eWWĥs>‡‚ÑPŞ2nğ¨+o<ıSĴZ;ôŞqĥœ ˆP1ÓöğSÒÜwQ öÄġ3)eŬĈ$Nž—C"(b÷’+Ĝ“öH İ–‰u7 Ş´!Iy ïż·Ġĝ`9GeOĤ£:g䁑…A俊wŜÁlôÈtkù&ŒÚ’¨Ĵ9Ax½²ÜÉqIWciIwĤ޸ĞF“{9ĦFĠ­È%ĥ$"(­XAEÄ@yċ äŻŭÊ׿ožÜÁċ'>vŝ§Ež½wppp)MÓkˆn­VĞe–e›Xo`Fħf)ÄĈPÔÈu„ugé!0ê‘ħZĈĴµôċ¤7­â4ö$;òQj‡ šİÄuaRšì/ Ën\ħBÓWËÎMÜ>ŠB4ä**0ŞQ*wj€İğŜm#ïw5@-eóUΉık8FT9!07£&DàÜhrŻôğ5ĝZ÷_wÙâ%€(P˘­/`D Q„òĉÛÈ_ŝ3”o}ŸÏŞċgž9ós˜òċb~eµZ]Y­V7–ËċŜrı<¨FFl`EÛ0"Ó@-0ò·7Rى„'Rˆž›Mœ×Ó#äÎÁÈ_ĵ+£Tö[êÜ Ràz¤RH•½°\•˜ŻÊĈ1\šüP•”j£Z~Ğ[H+FĥŻÀ8‚9˟½÷˙ô/½ŝœáŭ›Ïyn“4· GŒŞA)ˆ1aá €˘ŒXÖ éÈŻ°óÁHĥ”éÖÇ’Î}ö‘V•i `?GQšÔ%hW°ùŒk/…מÛúké™IäċŒ¨6ğĥ%ċm0˘–ŒĜLȕ5ĉĉ{ŭÑ!%ċâKxĈ5ÑV9%‘:ŻÔî3âµ>#J`–(.½ˆìÍï@.˙‚Mĝĉ~UËäBž§×ö³ìzšĤ7Ò4ŬsŒhQ,”eYˆÈĥ@´‰DM0r= âF“„€bPJ@ïQœÑí‚QÛµŞs`TrŻUOŒF²-a#µ€ĵÎ;ùÁÎ2İš”ëd?4SĴÉ!m(/¸<_í׀‘?ói ŒĊCħìÍ"ï;íż•=srvÑgyÓùĊ<]][dٍ4MoĤişŸĤéܢlˆÌÑĥ@ôÑ£ú5B)Rˆá#¤-qħFroÁˆħ(Œö÷r”F0òït͵ğ§šNœS­ñîßĉ \)z].­=užKÍR=3V HܲĉMçy ’½—ÓO[]=ûÄ3Y–]\­–ï-—ËˎíŻVĞy–eË<ÏWG˘mzŠúœŭ~tM02ìèħòÊJC@ á1#ŞwóRJí/ÀHú˜Ñħ`o?·#1>l`äëœŬœXużĤıÓZÂĞ,ŒĵçG5lÛ4 sWêcFġ@i Ä' Ÿŝ†>y돖Ìù*ÏóëĞĠêj5§(MÓÚw,Ëĵˆúĵç+\ž/z(À¨ġ’ŞĦ†›Ħa! …ĜJehJèM´‚QÏR"k 0 Ó Eɂ½½Üı |tÀHÖşô3VnìêĞš‰îkëÉ ސP`#ˆˆ0~ú+ñ[9÷Ü{˙ŬĞ"RcVyž/ŬÏ2Ïó ˆÊ ÚFŞëöŬnè#FĠC5Ĥ…!ôÀEĝH ĠŠÖMD7.àK ·tÖÊÀ¨0µßóu™NÄkŠnjĥ#w{”Ĉö*‚ĊıŻżŝÈÏGQ4‰˘hE‘ÖZÙÄo`A۞†˜’l§‡Œ”rĉ„èħ: )„Ík(8@w²ÌŽ~0ê.âëê6c?€‘wÛîs9â¤×êĥD²Dš—HDŜó{ìİÉdrz6››Íf“Ñh¤£(‚ĤĦB…mÀh(wÄa·+×}xfŬ)CŞííò)Dçñ+ÇWŻêàÑŜ^á*ĈŬ50R]äËy†q4Ġoû›/Œ§³Çf³ÙÙŬŬŬŬÙl6FJk-=Üĥ~tw<>B\|47@=’Ù„yħb„҃r ^sÌ}£’ħ·_¸ŠħFw Œ›8Żè‰F™3Òy }ú“ÓËéo|ċĴù{Ĉ˜}cÌÒ³bĉTD`ĴíßĈi›*ş‡C˘[ûxœmìàÉ Û@ ѳ†‘³ċ‘’­ÌmŽFÜż(V?‹lf[[ƒ‘cs} 6ùŭÚiĉuġQzÌNÉ/•n£7ŸFÍC5—Qçy= `TŬż„Î (ÖÈKÁ,-qé‘_;{lñÎg§ĉĊcÌĵ,Ëı1&eĉÜĉĜ—Ŭ †sAÛĝmŞ÷‘£êûkĜĥI“ïo"RˆÖš§45 Ċ!`$̨ZQטÑa`”·†Ü­ĥ`w.óšT·£îŭm£5ĵmO×­ĴÒ(0ïİU _,Ĝ™Ĉôĉ#żóü ĞK—fÌûĈ˜ı1feŒIE$ϲĴlkvĉ*şMÁ€´Ĥ`Ñ.Rˆu†¤.َÊfé#î“éd€FyÉĜ?*‘ÇèúĜoqäôç[TìĤ²×á¸QÚŬŝÛ3òeDÏ'O֗ÜŒ<*+…İGk¤…ÂèÄcÉ;Ùo}ċ™âŸŬ`ĉfž—eı4Ĉ¤Ĉ*˲ 0‡8€ÑÀĦĉIv;şBTKi Y÷Ğë4_ 6Étw ŒşK˜7BEMŜŒİJeL(Äx“^ì µ÷\§o#ÍÚá–XQ€RdGkÛH\WK)XÙdµoRÇuf[‘˖Џ|ġÔÍôŬŻçżÚ7Ĉ”eı¨XÒbħ(˜yó魒ëĦ‡O˘[“ìTSò-„zYˆH!üĊ­ÉĠ‚ÍŜ2Ĉmil]iè#‘ÁĉÚb[0ŞŸšġÌ&(RE 7ˆ@#mŸ‚vÏ0ˆ$3 ­,`Ċ•h@ ÛĜCšìâ Îِ²ûf’8`RÍ۔Ûûw?¤$7öñc7·„} cïG y`À¨îM€Hc•1vbÁ;§ŝ½g_X]|lŜ­¤ğ%3§EQäEQ1flúĥ7} éá£ú¸j%/Ú)D)EvÚ¨_ [‚ÑâÙ×g´_lnj3렝h@9Rmíp("HéîkĴ@`ç\YuŽ˘Éˆ$gĜ-w˙; #¨19‚e?F ÊU– ‰•eGF †AŠ cmog1%(û<ÄÍĠPd 0ŞŜ\a9—÷Ġ"dĥĞß8óÛ_úTö˙şÂ6Ÿ´(ËrUEX,Jc mŸm@êá#8ÏÍ'¤ …X. w֖M`$dşA0ìïoÙgTÉdd+–EXíCòHY–B.Ħd vî·Êŭ¸yA¤É½7ÂTôĜbçu)€b²"@lÌ ¤,ĜX‰Ï”v*ĴäŽM%Ç ˘‰e]bċ½– ĝ FΜHi@l`˘E^ :ùüÎûé·ċü•}Ëċ“Ĉ˜Ì“1³*Š˘o;³µ}ġC F­Ï‚½ddˆH!Úë[5•ÈVەrÇ`ä³ #‚ŭŭ#80ĝ“S Z °úÑAżùŬ”ç·ê°µ#lX([Ôv_ö_°?¸¨ğ·Ŝ{_ñcŸEñħßĞcO’1(³–İ,°î‘÷>ŭ­MœI^ cA¤.žüöùcĞwż8áW÷;%3+cL'3ßÇ·‡ÑC JĠĝòjƒÜ …è#Ô/›Gş0’M#$öj„ş²M¨X´€וêíèÔivÉ÷}fÎŞż"˘Ħĵ…tĈmwôÔ³àöŭ”R‰Öz'Š-{óñ›òÈq’˘ĴCBcsÀˆÜˆ [ŒáĤ́Q5Á˘Öb‘ag–ë'û³ŸËŻ^;éγ*Š˘³X,ŒH>0ù`†ŝô"²Œ”Fì …b Ġ”SÚ^Ĥ^MWÑÑFH`‘ ˆ4Ôl0òlu%MÓ÷³,ğiŒYŠˆ8ñİœd[Pê€ HU°MZ)•Äqĵ3yêĉOÊċı/½™eDzhr&îLWı÷°D+mr—ş@Œ1#M5FǽıúĠ_ŝxñיynŒYE‘cŠ˘(Ê<Ïy(Q‡Ğ€òż}ħ Sc …Rì˘ÄìŞÚx­ÂNŽXÚÍwŒ6—“3(Öö9ŠdY–]^,‹Ċµ,ËĜ!œZ÷ŜŞ­ß ş EHk=F;Óét&R#7&]j7%› ³UŠ%K[F%era°ĈΌ։ßüĝnvñŭ_ĴĴ…VyžeYR–xïMµŬç  T}ßâ\’q„MX| …X߸ÙOÀ”²]0š(K-0Şj š’rİĞÚÄ:‘̜•eıJÓtıX,bg…M'íp½#RßıżÒZGyžg"b”R*Š˘Ñ£/˙w}™ô,_Ä4Ŝ…ĴJçÓDuyùŬ#İ‹5È6òş I=/ŬVPŠÔ††)‹ˌ1OôĞÇ~ó—>›˙/™Œ1˲,3cLÁÌìX’x ż/Ü#•>ÜÒ]e1"–Tn™Ê éaD%ÙÒµğŒĵq1/‘·F­Çu•ÜОğÓ,žm†ÁŬ ùLIù Ä̒ç9Ò4ċrF£IŬœ=qñ_ž{ŭÜï=NAq ›kıZÏïzi·mô%HlA‰ĜşWP ”UğˆĜEӔ9Êhuâ;ò_ùÖü{dé¤ğÒyžwßWÚĉüĦfI•-VˆH!zV^çhBʕ}r40r7], dı#l Fh—'ĥϨq×ĥ@CDĈR‰Íá›Ċ³-( %"Ĥ,K“ĤİDQ¤’$‰8žì^úéÏϜüԙĞÉ3§Hkĵïy•“ ħ`TıW☠"ëzQ”ĈŬmâ%­-sìì(\8ŭkÏ/|ib^Ûwù¤´(Šĵ,KvLIšGìjS½Ŝ+Ŭ‰W=$!@ ħĥЏË`Ì™‘ğéjU"M7‘lF̞{ŞuWXAQ­z ġM1Ŭ”ĥeHےꀗeY³¤$IĈqOϽñ?Ŝ˙ä?üVVŞ„˘]۔[•Ê‹Ü]0Şe;÷Ĉ;fDŽmRĠ£U’^$ (d…{Јl‰ĉû+ìŸÒĞÇû _È/_ÙŞğUQiQ%3ó|>ç–Ôe˜AşÎgĉ!@ ыILxĥ£,3XÊğF…VH Ûûħy— ŒĜëKe@–,‰U'c ²,“ċrİ8ŜŸ=yé_ž{ġìï½ œ*²•ƒZ5c!îĠW3;Ĝşò â@É^¨ŞRdí0DĴñ­ĠìÄÚ6iĠ"G2ydôÚîŻ~óyóGיùÀ5ÌfeY–yžOşS=àÓó{X;ò6]A· €bŭİò }ë6`”çóEqwÁÈóħĞGps+a%Jİ>vÔ=—Ĥtğ’< Z#ǒ¤,KβŒ–ËeÇqÇñl÷Ú/~ŝè‰O½ĴŸy„˘@¤!k˜•ğ FbšÏ$hóIU‘Şr<ïH´UÜyÁu#ŻFI%b£°ì˧Żù4˙ä *ÏóĵÌóĵìHwԑëşï÷C*ŬyÎ ,ààÔ)D÷ħ&ĦlÄ ´”-ÀÈ&rÊRî>9iC޵LÜXŒ;İ.çî5˜–´tw0˘@ŞÎuµ˘‹ˆEċr98N’dEÑìÑwŝèÇ{Ÿĝ‡żššeBю­l̋ğ FÛCĈâ%tĵYP¤,3²ÍĈî*W N0„­+;`Gn Vó;ğcĵħûŸ“ôp5š €wFèŜDÄ+lD²Œ²fâfM‰"ğ aT£ùÄ€€eZb2žê—gżùµÏ—ż™™ĤÓiZEV–eiŒİJÁğï+÷ĵŻ_>ÉħÖúS2!‡)ÄÚşP•VÛĦsè]ĞĠŬşwpP€ğ`rÀ¨µĝ:0Rc7Âu;†äŽéü<ĒĞĥÛFè‘˘ş’öIHšĤjħXìUğ×_úùıϟğf;czu÷·ĊâÊû|Ù)ÏJÁ{µ/ )D—§Ú)ĴRĜ·”Ò FĞU‰<+ï3‚DìdSŠÈ?¤k–Ô#ÍġÉuŬâà^$ÚLŝ²Âı½+f†ëMZĊqĵ7ĈqÏvnú‹óÇ?uŝ}ġÌY'vÌy… Jz`óh`T}nĈLv4ğІCŒ¨°ÍÇċ\´q¤ Â0†P¸ñööûa­2$£3£×Ĥßŝĉóĉo¸RU(?ŒÄRE!@ Ñ+ïÔEmFZ´İš,3X­î'U2;5<¤Qsú$ğ>PêëKlßÛĤ>@˘C13Š˘È–ËŽĝVE(Šv}ïpë˙ùo.óċˆ˘ûžsÇÌ­aDğd² ÄÖëN\‘Ŭ,]‹‡–2‰bˆ&Œ…2³Ġ˜"Ö6ĵ,qĸuì—ıb.ŝò#ü×ûĦ|DŞE*¤ …Ĝtœ4·À¨,‹EqÁÈ˙½bR7Ĉvĵ}éÎ˙ŭ°Â†M²Ŭ ¤>`Âa 1Ĥ̲,],Q%NşÛ}úŭ?üĊK§˙ÖD"‚Ä€V@VzĴ·FU¨4 Ĝ0ۑäÊıIY0RŜK& "E­ 0fÁ2uĴ–9vN(ĵ1ùö'Ž—.&ĉŭƒét:àCǙ´YQ¤H!ú…’Š%‘&Hр‘1‚ƒùFÄ Aħ‚vtBWAŽh“\w§€4 ú5x_ÌLeYR–e+W ~-Š˘Ŭ[oüâħcݟż@Ÿx”td;Ev.•‚­.ĵM0޸Ŝ#(7?ġw‰@ğ~Ş"ĦµĠR@Ĵ Ĵ &VÈ|ŸC)ħĜO1Ù9½Rüú×>oŝé•P ‰kSûĠ‡€˘?TDàR`rözXlEˆÜ=0˜Q5ŸÉ”j­QĠşŻXaˆmbI‡Éu]@ò%¨mî‹*P*Š"_­VË$InÚŜ¤xvöâżüፏ=ùËRU² dĈZ˙ƒQ͘AFY/;H‰ÙĈĜÊC¤q'KĜÄċ“˜Ĉ”%SB(‚FħÊÀ;ŸĜ}ğü귟2˙nÏS9TàĈV‚?äàUƒr}HŠ)DopÁ°óÂ+›şĵûn‚‘FÜÙ×ĴÈşIÀÉuŜrÁĉqC,iÑDzMêÙÍş7NžtĊq|=I’IEǞ½ôÇ/ŝâôßú’d+‚J\ı›êŠĈÛ£Jş3,ĥ^BĈ3XµÒ\~ˆŞqJĥúNM–­q¤02‚²,í£% rL5áÂ䏟4ïyj^?0Ĉ,vvv²²,‹²,yı\Ĥ^> =Lé£?ŻFŬħ½! …¨]ĦI)q=8nıtċŬۀî"uVSÉ4DTXvâC~ßVÔDgħĴNĵüÛŸ%9é.],ûq_‹xggï͗Û}ġħ £çÏ@Ş)0ѰN· FġÈ #(­`\Öț™"(ħk•Ĵ²ÍµZħ"p¤P&iÑÌô1X­ Ìf#zeü_ĝ’-?8B)ĝ1ÏĜÊ:İKWCŬ÷§…·àÁ@Şqœ4![¤Yı=É]#tĈ˜W†VèöLö°¤mjˆAñmüŬPŜj°Q—™Ë˘(27ñöĉbħ¸œĤé{^úÓżšaµd ĜŽm·KµÜ1Uç%3L °İšgMŬ@Ë.çdċBİí›,(ÙĈÙQ¤+4.ċĈ6ŜĤĞj|fôÚäÛßL’ä™Ñhôĝl6{dwww6N“$I"ĴÛ.mš5UŻÚ‰†Y˘ú=­ĞLB†˘³ĠT/BEÊX,‹öMî'‰Ï="Ġ6 RÜĤ"9äŝĥ‘ò¸g‡ß-7]ĤdŒ)Ó4M•RQ’$7’$™EQ´ûÌĠ?úùÏù;_‘|IˆF@îIıÙwFĠbhX@Í#,;&WĊ¨Ä2#&òÌYmĠ+ Ò… Œ)­ŒŞÄ”†ÇnŽ?÷ÈUsá—OóO˜yJÁħ €H!zuŻÒJu à`ž·ħû FġeÒôşç'ÜÜĜcGۀRßu²íâĉvçƒ %Ö]xƒlǎ%QY–”çyĥX,â8EÑlgï헞8ö‹Çߍž?OħMĝK“Gş0²“8_o†Q#!ā‘ĜĈYÔÓ “ސDŽ–™˜!JÛAó³1^OġÉŬòòûĦÜ˙–TÉܞ"Hv!ĵ“l€ùAŜòXwŭ`äġÏĝüFJğ“?"›ı+ WgÜ$ò!§–3—Y–ĠÒŬrıĵœeÙĊ3ï˙ĞÌhıd³l¤c'Ô;£ê܃’­×aħ³•îĜ˙•˙@b]”²^wħ"$‘Â(VnìıİĊUj0š^‰żùĠ8l4=9NÏìîî›Íf£8Ž# {ŬġÉv] úlŞYö@ 1Ë´@ÉROħ|`ÀÈÑ´z&ÒĊ$×wċ}żo P50cŠ4MÓċr9_,7–Ëċ"KßyîÚ˙\‘”+û^*Ġñĵ}0ޘ³ t€Ä†aĜĉŬ}SV;eŬy‚ Hl>I+đB)èŞi™µ"G™ç(v>qìä+ßJ’äÙñx|~6›ÜÙÙٙL&IEëóh€-}tòI~U*‡f¤ مX?F Û)ĦnBèF^İ—ŝÀ5wO£C€‰ÑÄóğ–œW–e‘ĤiÇñAÇW8žîèw_~bçĊÇŜM>ó8İÄMÊsï¤ç‘F€+¨dħ½IN³½¸dÍì@PΠäÜ`ç)ie›iHa †ë²f#K LfïNùÄ ôċİyc2™,ʲ̽Rpñú“‘@?zàŬùb%@ Ñ=FsA (g4Ȍš‰µDÔ |°–—n>É7\íË%ù%µt—çy\.—qßr½I;güùo>ġÌɃ‚Ĥ¤wÜp=Ş’)ÎàÄ£€Qu‘1ìÀ˜RÎ\فrÊm jPZà&QH‹ĉ1„Ğù ³Ŭ ½ûó_6W/Ñü£] .ŒPö$ğk€í<×˙J:Ċ yûe‰T×:è*Ŭġ4Ĉyžg•t·Z­.çéêgŻüáO5 “şġËúĦ5à|û`T½ÇĈĜa~llİdûñ²Ĝ²pǚ½—nKÁ­ qDEş)„4-Ħf_}3”‚›Ĥ¸!D`H!ÚQÚ[dê…îA#"HUòü€Ĵ?·!ŬĦ³ 2:eàžt—Ĉq\5ÌÎvĉ^ybçĊÇßÑ/n\ÖâzßîĥtÇ]énı\ŜX­VïgYöŜ3×˙ĝŻUd’FÖZÈZrĞ;£Ê ”â*íFĜÊvNş3n$z3 ½èKPDÊJwIlKÁÁÜ08Ĵ2F˘gÑKê›_{hKÁT'ġR`H!Úád:ÒɆÀƒ#{™[ƒ4=pÇot7ԌەîpénEÑĊŬèâî“Óż~ü­ĝsOّ$+ìçGhÏÁŬŒ(Ğßsb]ĵĦ}ĠDrc­WAZ™O)@C!fÀDŒ²ħÀdÁΠ$O?qìíĊWġTòŬ[Ĉ˜yY–‹Ž+¸xĴò£ċ ”÷ħtk6B@ á–H×{T²eIı|°`DŜŭ8sÑ£ĝĦ~`Ò]_ÎcHş“C¤ğ|µZ-£(Úsà;g˙ÛŜ|ìÙS{íŜiU[>A)ÛDt0’Îx ¸‘ë^ĠiçWÉ €RR£k%ßiD;é.ÖX¸~"âYĦ0‹ ĵŭ‰“rñËSóց+φRĉcùhŽ{ ’]ˆğ²ŒŠkρäüÁ3£îŭ—Î6è<†(Ŭñ¤ğ2˲|µZÍ‹ĊġĠju)˲÷ž½ŝG?ĠdœA”•íè.Qġ‹1clĦ×&Ĵí†ÙÚÍÁÛÓ(hĴ‹CĴ0N´ĞÎc3¤(°LKLbE/é_û%;ŸFOM§Ó3³ÙìĜÎÎÎx<Ç$;ġ‘îZcĦB@ Ñ&HÊĉ TGŝ‘Œ¸Ù6êÚIYµqy‘ġ:Alç.n0ìn*énµZÌçókĞĠê˘Z^~ġéìGï²YRօ–ıÜ9ĠàF,0•lsJ,`c–‚ |,&7eVÁ•‚kk-k²`iŒÍŸ”Ya §çÇŻŞ_JÁŸ¨JÁÇñG·\ĜU!85É.ÄĈc%7Ä5^ÊFġŭ¸ÚM6Iw@ż“ƒÙBşÛO’äjE;§o|÷G×}öÔ­Bí’>f˲KçTcB{›`d™¤Ê™`û‘Ëë‘y.nE=Ŭ]•B Fħ²}NΏO (–ħV¸>ù3WW—~ùôèĊV)xY–ĉ#Y NĠK§à‚RˆžÔNbµ`d>`0êŝ-‘[n¤ĝ€³¤£JwĠeÛHw7VĞĠċ,ËŜ}öĉ˙$RÒzÀ"´şcf$^/˜eFĥaÖ°Àç%Ġ,‰ıꅭ‘`úENş%•¤èú“@X ŒQàĠĝ×>Yħ_H’äİétzv6››Íf“ñx;żğ£0$òAéÁÜиeO; €˘?´m<•’2òƒ;S² ž‘ŝÛr¤;³Iş[.—û‹ĊâÚjµşHË+Ż=]ŝġğR T˘ĉ)Ì £ĵ0ŞÂÍWı* wŬÌhúywI•Ğ"ÄZa)$15ò"( –ˉE/Ò·ż'çœtwvwwwwC)ĝ&PdŜQ%ŬDBRìB 3$€"ħ‹ËFšR2T˘[vaéÎ?o=Żĵî˘(ÚK’äJEğ§o~ï‡7Ï>}êFIÇ·Uqey×À¨.ŻüîHPVŠALÖÁAU/XêÑçÚm&âˆ0bmóR,€aY'ñÒD0ӏ{{ŝĊo=•üĠž1fáJÁ‹Rm¤ğ´Ü=ġjÀ&,>!…è)¸Äs3~Âb02ï¤mNäb[ĥAş“-¤ğ5Éž×]Q…“în­VĞKiš÷Ì­?ùI¤Ċ™uµˆcğ×,éöÁ¨-Ŭ5'ĉfvR%Ŭ™Şa֗îÈIwnTĊ8Ñ C`ƒl™"* ĵŭò“ѓ_N’äéÉdr~ggçÄîîît:Ž:£*üb‡M#+@éÎcF̐À’ …èY.]€´ŞŒì`>ëÒ`'Ĥ~HŜÒ~é8Ṳ́5)Ż,ËbµZĠÒ]šĤħĵúÚÓùß³´ÓÑDîĠÒ]]i'0ı‡³“A\Nİsp+"¨ÊĊĦêKgí YIÓ/í/PĵóÉÊĊa6›íN§Ó‘+×ÒŬ‡¨œêƒMÂè‰H!ú[ö­ОŞ€aMĜŞž—‚|8› ûĤÍ“`x˜Ÿħ…geħ\.—‹ĊboħX\IÓôâé½ü蔵'Ċ (Šì\ĞğFĠŻĈ ç ŜL›eáĤ/É+p°ewvÊĴ&[ >Šì Š% La.— É£Wġo&IòĴË'9vìĜQKÁµÜY)Iß7#D¤ö àBŞm.¸|0˜QËHm.é”CşGҝñ¤ğĊbħ¸µ\./izáı›ü“X•%Œ›0EŞÄÛ£ú{ÂĤÎÛ8ËUlRâ ¨{“ìès F£Xy k/T– ”%Ċ_‰HwìKw‹Ċâ`ı\^_­Veuŭġg³żzK8Kaio5ú\уQUġX•€[n\*/UÜH…âÍNr TIwVı3VÂ*K,—&1 ëSe|êçâpvggçÄGĦÜZ“+„¤H!6(FlY5 ¤àğF|Àˆá›}~€û$ŬmèWIwiš.Kş’Ĥ酓?ŝñiuí™Ôʝqlk¨! wFĠŻe•G2€ñ˜‘èÇÎf¨ŭXU‘C¤b­Gږ‚ĥÚÌ%ĝ—ó Éx½Èßúċ8ŽŸó\>üà@ qĝ2)îÖNúƒ£*§Eġˆġ1K:Št·Éb¨–î*‡ċrysı\^NÓô³û˙âÇqÄ P.èdĜ;£êfÌìFUT ³Mċ]U…'l%ğj/Ŭ)EH"`kèú;g Ĝ”(sƒĠäÇŜ˘Ż|;ŽgÇñ³ÙìÔÎÎÎÎd2I:Uw› Ö$ĵ–%Qû½6Ħ96Rˆġ0R3%Ò˙öĴKâÌvGœ!ÇB 1Cûl&ö}è?½Üżòĝġ^ën·ğŬnğÍ( …e$4OUyĉˆĝîCDœsòÔÉŞĴRVUJú6ĞVee)“Ê̈ĜçÛħc²^„Ž’ŒÚ‹|ĝë]:÷)ŬÑ.ҝÖZĞ,ËòÙl6óf)żġíéâÏßB(Ê!d%]sdä?§ĥëÎ÷Kò!ŜèçIÉ?Ÿ?ä­à>€Ġ~ĉ6Ĵ‚ŒF–ċˆ`=Ŝzj>ùzÇO‡Ç§Óéñét:Ç}¤twYÁ5·1_GÁĜu€ï5¤¨>€J]˘9,2j/’.ÉÚ=·¸'ô޽˜EkaĠĜ~`V)¤ qHoÇq|5Š˘éñàÓOyĝô#×èħ›‡µ<ê5UDh“|6› @€1^bÍ!gŸâ  ˜HBëyY .*J"I LĈñyöŜÏ߉_͖1&İŞ*÷mÏg³Ù6 ĉsïşŻv=ú>?'ĈúWHŒíPvĦħUĉHÉh[û ż1ŠúĝÊ]^%µ_Yw1ŬŻtW$^ş;˙Ìĉż|ş"•Ĉ@‘r%d׎Bkc÷”\› íî3éδz ĜóIA`÷“∜½ßÛÁM§ä‰áYŭöŻâ8~v+xw/ XG+¸·şÛž/`s£÷S°?$ĊúQkġ#!îú2ûĜOZÔ?İ+Ŭé˘(Š$IfîÀìEÊo}ûlù_ßU ¸8Ħ hġMş32ò7”Ëĥó{JFSsÄÈx Ü2żŸd۞K!$âX6EٗĤ4UâZô‹GŠ–ħ‚ïDNG/ŬQ‹#EÀëKvŒ…Wnš@ĦJµ>dDi !‚ùúy×÷)ŬmkYáğ,ËÒ8Ž£(Š„a89|~ĉħŸ}ôŠ:ñ‚İ͝“­ÍÁmûI{##Sk ‚FC,"°O)% }ÛsA­*‰ JÄîàmVhËTŞI$ ħq,ÂÙìW/ż]ùq`ĠÒ]UUJ)eò<'—w×~_ûHhÛ{~W´>gp…t˙p‘2ħҝċڐQŭX)@•î÷PŬğҝYBşÓ˜?0ۖîäy~ŝ™­ù(–Ş"RB÷ùĥ‹ƒ; #;U§‚·Ú:ïÈ4ħBìJŻR(")0ˆœÜoĝk ċ &áçċğwı|ŝ#fcdG@ ĉ[…›#&#ĝ+miÍ ĉŜ8Çħ¤t‡%¤ğıïZk]–ežĤi’Ĥéµ,Ë.êüöwÏĞ?~-„™Âı Ûêc?däĥ€Ûïċı—ïÈwšmŝu’ƒĥËl Bg÷oQUBĞJiä—8Gżĝ•·‚ÇğÏ ŜŜ;⺌%;FwjşàRc „iâfŽŠŒœ›&£È-”Û:ÇîJJn!\$Ŭıĥ˘ğJwµóΣʲRÊ4Š˘0Š˘+QM6³g;öÜc—ġ!ˆ Bpjğië9?Ú~ȵtGN˜³Âˆµî;Ò$mk˙Y ‚DÖà`t€$W.mÂ&¸ĉYŽ1á;zûéKŻżmŽF£Dk]TUU*tšĤÔiUÑ×iĥ-Ŭr—YQ[½ ħĦ+$FßÊh+PĴĦ‡ ü"zŻ~ XlpĜ“tgŒQUU.€Ġ§8œ?•üˇƒ@•^ş³Ïxç•:ҝÒMk mZwş a5@ÓŞB4‡f)IéşÌĥšÂŝZ#)4Ĉq(>Ïß}]F“]•ôÈt:}`<×?Ü4dDĈUK &$ĈÜ|$í$E=yg‡HFĤÏÔ ìšaî½Ĝ•îü~’jIw×­t·ġŬsĠ~%L˜ c÷“„X ùğ|Zƒn§kĜH!wxÖÇ mwŜyéNb „tV=[Q™2G‘'FUożïĴà'ÇñOî+¸h*#!ĝ`,KvŒ‹sá=¸ÍBy´dT Y­•÷h ĜŠ;Ş$Y–eĠ’î†aN§ÁÙÏN;}âRġĝ":Ş”ë™$aú’üZSĞğĴ€4„@à¤;cÀ ¸†.ÁA €¤@q(abB’ısqFÛÎçJ#Ö —Äk>„Kï<ŸŬrÒ]^–e”ÒĈÚŭû%·•(QvXÒ]#Óù³H,Ûq…Äè•í¨0.ûÌĴEeT?ÀXKşıÇ<ßw Ŭ-ephIw‰ë0{ı(ŠóO§ż˙`˜’ÊÄĈ É}Ĉ´2ò·´ĤıŝIŞíÀs;Ğ$BĞJ"R" %â0hE ı<>U`ĥ•bÔïżĴ‡^ıĞRÁI{Fnĉƒ ‰1ż ڔ=ß~â¨ÉÈßô ŬîÑ.›{”îh/Ò]žçı;0{#˲K:ß<÷ĵŝ—B2şÀ\[íQŭħ‚ÖşEFÖy‡z_‰¨iYáŸÔv˜…µ‚‡q ŬF;PšĤâh~–żûîŬc÷ùu~<óòDŽÄèYúLe7İì2a“‘ÙöX!<1ŜğGOk›€şqBğġOòU’VJİ<ϳ$In§iz5˲ ôĞ/N?\ÖàĜ‡‘‘˙}•T·;§ĉ\’ñ-Ïİ9 ç)AÀ&‚DĜóIµÜhÀ(h]A•%òÁs|Ż>gŸL&“VŠzYÁM{~ħï› ‰Ñ³~¸_“ÛKZ#2 ¨2ĥ Ċŭ3 ‹Áw“îtŸt—eY2›ÍnzéîTúûGĦ*H6çÎÀ]ħ݆Œüç×>›dŒiŬnú˙êjŬÇ …uŬEAëlM.yQ"‚ĈwꍧgòÉ×â8~z4=î¤ğñڂSËÈà(2˜óׅ¤ ġ‘#“éĥ“`ÛNˆÀɈ÷ĝŜAş¤;³HşKÓ4™Íf7Ò4½Xċ[çž×ĝRB‘‚CKŝR6‡géÎî%ÍUKĈğí|•4żâM”¤m{n­àJÒ`³´À8ĊgĊû?—ÑĝE×;éQowÒŬúYÁ‡Ğ2!1vş'{˜q=Ȩħû’‹ıNĥ tWċyžiş™ĤéĠ<Ï/L²o><8wMèÔZÁŭUğĦ•ê>tZıj‰cƒ1ĈVHޤwgc½<´-Ŭ/힒!yďŒ,ŜÚfŸL&ƒµ³‚j^ƒ ‰ÑS(6˘‡”Y._î0È’ö.yßMàUJwÚKwŝÀlQžÎ˙Á(RıĦÒ-rdÔ4ô3–ˆT#ߙVûó:ëÎÌ?ż?›J8”΂ ʲ€0 —ú£Wèù·8>5NL&“×*œ\YXŸAb—£wŬ£Šl1tädÔy>ßyTŬšûAKwŜu—ĤéĊŞHÏ=ŻŝŭK‰ŠHċaèLħ22òW­½¤íÒZf‡–ÇÁ§8ÂZÁ#o·qWäŽ%i…qdp6{ç>ôê`0xz4˜N§ÇÖĈ îó‘û¨ ï!1!1_‡ĞŽyÀ-ùs‹¤Ŭç ïŸ iEҝî“îŠ˘È“$ıíz']çß}ñdxîŠ@لÊ žžwJFŝGŸÜ İ bġ’')ò!ĴÍQ›Â@8“C€8”–Œ´uŬ ÒĴDŽ”DUUEžçAšĤ78…a¸ñd‡Nŝ}ReCŒĴt+H‹~iidäohCZÚ´°ßDƒ*p3µe3{>)0 c‰JYÙϲ˜†.4*¨ÁKÇŻ.˙êéèÍÁ`0ÇyY–RJUU;½“şáĞÔy?ë4‡Ġ¤8˜Ö'Ä{H\!1ĥ_¸I×\ÂUHGHF­Ÿi& ûn‚t—$Ir=˲‹U‘ŝ‚ŝŭšH—2‘èÏ÷IF~˜Ì[ż ´—îĉä;37îê6B 8MŠhÛX²(+DĤÀ·êS‰|âġÁ`pj}ĴàĤiapRcÁ4ħEQS!ıEçÉód$l/ëûóŠrÒYRşS-énËKw£âogŸŠÎ]†)@.‹Î.ĠÁJÈhNşÓĠjêWY’Ş-árEH l´Pm·WR€)]!É&ƒHœ™½ûs_X+¸ñ›´~nòDŽÄè,x°íË u6²ŠŒ:í'ü–7ÚDÔ%nuD;TH€ñ;{<)­ÛTœ,ŝád¨2ÒİMo€°ç~VDFuA£M½Ô­˜ê‡îŬ^’DÛ .JĜ—ĉSG´Bšċ Ác£/Ó_üÊE íĠ ûĞ$(Ö7›d0!1ş“ÄÉtn‚ĝĉkAFÖ/ÜĴ÷éÉö%ğeÏ&ġ˜9éîRU¤ç^Ô˙ö… @drûìad?ƒNwûŭ’‘˙µĦ–óÎou˜uqCdĉèmŜ@P÷N5›ž¤4TYB€pÉüìÑĞf_Vpı€”îPş“ìö^c°İa<ß%V¨Ò=zŜ‘‘ï°éšŜߕìm*!¤ ĴPJ‰<ϋ0 ·˘(ş†át#<öéñ7'żÏŸ9!‚Ĝ~„Öjµı2²Uı¨ rĈ{ĈH˜Fž##`$ٟ]/@dÛT€`bBVhÖöÚ ™˜N†ĝŸì½WŜ^ı0˜-­uZUUQU•RJ™Ùlf:#vÑŝÑĥ÷}Ï&2-™Ž+~ D ŠšCšiwTd„&ˆZJ˜Jm;4ÉÒŬÒŬnûIĈ£Š˘(ò*2ê¤ğŬˆI0ZëŞ-Ŭizİ,²^TżûBPId˘éOµ"2ò˙fn?İĵލ“ëL“y×ÄîP3tŭ~R@úp`a÷L‘CU²ĝċcçÊ˙ġ~Çϸŭ¤n*xW;˜TpvÖ1!1vğÖ6ÎԀĤ7éNd„!£ú>פUŽ\wËTKşûċ\wešĤ³4MŻċyŝc\œ?{:ŝöGÒ)Œu²AĴ”Œ[ Ycƒ#&í*§ıhĦĥëÎ8Îġ~RĜŭ¤aì–cl+iäyHj|½ŭL"˙™³‚ŸXÛTpÒ}_!Á:Ùl?$³3ÑáQŬ½Ö&lòfj;³Œt÷xù§V)™Òĥݐ­uı O2òŸÖċdşıî²Ĉu˜NäŽ#%[%ÙkoŭFaĥ9hˆO·Ŝ{#ˆFÏı‡·‚sS>&$Ĉ.ĞZ§lÎQ’Q÷ù ÄŭcV%Ŭé%¤ğY–]*‹ìo/Ñż‘’ U3;ee`ż ­„ŒjRÒĤġĠ>——n+ùN(¸ÛO²Ò]‰–ܽtc`È Ï2àÑÑ˙$oŝï#³‚“ëëvÙ­C‘î@,5Ù4Ĥg%9 2’˘ñ3͑Ò]wè,°žŒÚ÷ ×Ĥ"˘h+Š˘kQMĤáĊŻNϞüFżĝ¤„ŬÑzddÛpQe@Î( ‚ £„Ö:h¨i•âéR ”qä,ċ™­ĤH0TiÇéġG1—ßz(ŝêöh4ši­Ó²,+”6öÔ°ßÚÌó1C„N”Óî;ßÂ\ôZ &$^ÙÈÊtnŞaÇĉlNF-‡]=ŬÑ´Úf,’î€ĊYwóvpÑsÛ§8ˆ²,Ğ4MÓ(ŠnEQ4 púxß^‹Ÿ|vn&"Ü`ŞíaŸdTïiGD‹AAAÎöí^jÍIBXöĥËìÀ0šÊĊN…6€5Í1Ŭùì½Wß;vġÇÁÀÌ´ÖÉáXÁeë W-1X²c´ë£f‚8Â92™=Ï/P.5‚÷ŽJş›KqZWeYÎàp£vŬ‰?HaHeQ+##´ĴàM¸ë4ëĴßZSËu7oĵ‘Ò¤DHD‘DÊÚ¸ˆ4+ 'á§[żôV§Ï Ŝšk"àAÌ£;AD(k'›µ÷šġ!#’¨ıˆ÷–‘îhAĠ•îÚRT7ĵ-Ŭmzén#ĵ¸ñÌŻ'żIŸ 2”j6êc2‚í+#W i!@DÖÛBvhÂfîQór|Ğ q$aLİÙî2Ĥ"(iPÉgŽËŝîŭ§gnk­W‘ ³tG]µÁ„ÄĜ>O”i´yÙRŽ’Œ|â7Ù}-ĥ}/-Ŭġ-˜‹¤;ÚMşË², vEW£(š>üùƒëƒ'ĵUˆ)ĸġ™6|x'däo£Ħ! ]‹ €€À'IY’Â&9@4ûIB‘ˆC‚ޤı²/Ÿ`$Š˜n ñuŝĉ݇W_ ~œi­Tî,:Ïsr¤$[/°KL{îäŽċ,ƒ%;ìSâyH™ġ £öµ§”Í2À8Té(Š2˲:ë(Šó/Šß „0€‚ˆMKn•‘_>tu.|Ġ˜şUiÔfÛ˙?ğŸ$š.³q€A Ŝ$%H!™Í0ä'·ßyC†Ö >™N§L§ÓÑÁYÁ DÎ:Èà ‰Ñ½,͎m(Aî'C$£z'YJ×Ĉœ‡ÊKw[Q]p²^}àıáOü5}ù9 ¸ĠW tÇdäĦ\΢#BHë°sĠĵ$áĥˆl]³…Û˘@ÚÖ葄ÖĈ=ŸMq HdyhÄèlòĈŻ_˙ñÖp8L”R™RŞPJ)­5•eÙ=ï%–ù½J"{]Žç˜˜½’i·˜E„rˆ2ŬœҊ3b”tgv‘îJ/ŬĊq|5 Ç‚?ş?ù­\LE´£T„¤Ċ]f÷BF>Áşî „.ˆµi¸êğ7šh9ïĴA“8’FZ+8@ £Q•˘(Àùò§ŭ$üöñכ£ÑhKk­Ŝ .@Bş½6Á˘KvŒŜËKs~×aI2Ú&÷ˆ–á–7‘V(ŬġġOZ$Ŭİ–twIw?ĵ$˙q MUœµ:2òĈÌÉwĤÂڊò^ß\X@ÔfCÀ:6‘ÄKÑZ!ML"Ï7ß|EÇ_ OF£ÇĤÓéħÉd2‡ÑÙn‘ënNĈó‡fÉÏ3ĝŝ^LHLHŒyĝĞÉ0ŞÔÁ탌 ›Ç²Ën/¤´(Rh™}¤myw^şKÓt3I’kY–ŭ(Ëkß<ö ˜ÂihbdäĦ Á¨V+ÙBC“ħpÓTTŝa™¤uCż8\Šƒ˙G´Fš•ˆ†Ç£Oo½ġË(Šž;+¸1óÑAlûfBbô³jġğY2²#Ä҆ ¤ŭ׿ËÓ˘Ü;í¤;U–e™Ĥiš$Éí$Iĉy~á1ŭñG ĥ6IM#!çşß)vÈĥ¨0M—Y2sĠ’O'33UŸO më0 9ıÈÀhĥäóÇżÏŝîŭ8ŽO ƒ'V ŜTIÂıü„;ËĤ&$FÏĠĞĤĉœÏœĞŽŽ€Œĉ ÚïoħÂqHÒuŞ£şjÒZWUUUY–ÍÒ4½™eÙ<ÏxQŝŝÓ0$-È"ÈÀX ͘E uÀÚt™mÈÈKw€;›$˘v*xsÀ 0Š4G,5Jq*Á‰×ƒÁ3íTápí#ĵ&&úàD`Ɉx@3!1úë#w.ĥٔ^2‚ÛŽ:|éWÊsgt 'Ŭ]Ïóü˘,Ż}ġÂè³sD%„ĉ³R2ò°Nı&|Uû˜CêTI­'´¤äڞĥRŠC— NΗ` `*$i‰ñ –ŸÜ|ë Wo'.xùcBbô.^s)b}ȈœĈŻ4§4­t§Hw·’$ıœçùè3ŭd°y›LˆäÁWHF {îÈv™5ĥ:j™ÈIxDUĠǎ„А¤„ŠQ€0M„@*G‘W ĝÄèìÖ/~EÑiGJŻ"œ>üM“Ëĥo&$F|2ƒ2vŸġ(ÉhîJÒŭ> [ÖtĈ ¤;ZBşÛĉĥë‘î’$Iniz)Ïó /†ż˙$ „M{ !VFFsĴĤĠÄOÛ³ş%ŬµÉ¨ñ`SŬ;É7ôD²á RUQZ|ùÓÇİÓoĊqüôh4:1™LœN§Î~’è!'ı€”ìKù­7M LHŒí+TRˆġ"#?“+!ËvВµ;ï•î²,˓$ÙJÓôz–e?˘ĵùÍ ƒż#ğ³˘S%Ŭ95ûI–€´2­ô†Ĥ‡9)ÏPsHWP“u:RĆƒÀ,rFRHÓ “A€ÏnġŞ–Ğ·‚Ó‡˙È&$FÖċj²nğš4̐Qç`ğĥ r¸::téÎì&Ŭ9+xêŞ¤+yž_x„ĝä‘Qz›T‘ĠƒE°R2òŻÍ íH!·—T'„·Şzĵ·Ĵàa(1ˆĴÙÁŝcíi’"=}zëżtİàO^*8ƒ é>^˘HğËGMkCFÍ(ħĠ“Uş£]¤;íÚT”Y–išúĥçç_ ŝġ£($%´;›$ŒíGäÎàÜ)ùŸ½Lçż|…4OFM—Ùù!ċĴà…AòÍXr2Z¨ [ôüñïÓWWnç*‰ ‰ÑżbyíöÔ ­ùû”nÎGñ^éÎ8RRY–ċ³ÙlĉÌ˘şŭ틏ż%* P"Bĥ"2ŞÌê&|U²­& Á+ëÀjš=š!@HDĦt;8ÉĜŝ½y–# _ÍŜ|&ĦŻÇq|Ş%ŬŬħü·żŭ-è5gÙ­v'œ„nz–Ĵ£¨Œ|&‚(u?Q2ö[/Êş·>םïÂIw҆8¤uÖŬÁçŸ>:zòÑ+éƒÇ!'€vŒ÷żnwKŬpvüüġеn“1ÀH€\Ħ&k:ìäⅤ@$%ŞPB)×çII’a<™ÈOoŭ‹wòϗ†D[ZëT)U–eİ´ÖĤÓ;É ôıvŬWËÙA\!1úVĤÚÁĉö‘ÖƒŒÜ-!m "ÉÓ÷è¤ğ…RKş+ `öü á>Š#Q *@Zħ9´+ђdäQ)ƒRTÊ RUeo+ePiwÛ}k­Ħ[g™Œ; .5;Xşġ~BY”0ѳ·ŝĞ(ŠNƒ“в‚s•Ä„Ähψ0¨? Èġéڏ—°Ù8;訤ğ>RêJwş(Š"I’Y’$×ò<żˆêö·/>úĈ8çZMHD+%#Ş›úÊJ£, Êʓ“AU¨úgċˆÊÊ{~npÒvĵ˜UYAèçË×N\ĞNż5 N9+ĝñUXÁ™”˜~ċÑ.ÊD™V8ċQÓY†Éèà>~ì@HËşîŒwŬ9ƒfšĤWó<˙ñAsö̉ѵ›@á<×Ħµ‚×ëôjȨ=p”6¨*KJž˜JOF•%'ċ+&eĜêĥOl>Ċa2 œıġNÛ ~bUVp&%&$Ù&xs‘üëBF ׳pğÔüy­^ş£žjÉôTHKIwUUI’$³Ùì†Kq8˙Bô ] “Ç ÍmĦĴŒ< Q‡”ŞÒWI„J{b˘ı(""³@Ô4u—Ù0z úôĈ]+ĝ´#Ŭħœ ‰ħÏ ëEF.ü²àxé Hi‘„‡%;Ŭ•îÒ4MÒ4½–eÙESn~ûòĝŻI:)LMÛó £ö_o ĦR eْ”ÉIiƒJ“ÛSÒsáĴó“@FÁ(£rlÒsÇÏŻĵײ‚?<™L&ñXÁıJbBâĊÉÀڏŒİĈnStsÏh.K \“>â Éu•îL[şĞŞŞìHwŽÓ×g^ı“Û5X4iÛ$‚!£şĜ#OLbš#'g|PJÛ}%˘îsĝÊIĤDžçˆ…/7ß<Òc?c+8c…@meĴùı*…uBñ>Ò:Kws)^şK’äĤKq8˙Bô#Q *íԗmé}Àd4ñe 59UU­Œ§l8ëĥÇ´—*!£$9Fq$?ñΛA4~n8>5]Y*8ƒ é–ì„°óטı,ı#%#²ħFDÉ{Hë,Ŭ͑’ÖZ—e™;éîz–euıġŭ˓"R.CQô\ü ġ=-‘qİŭÎżúÏ!làÊŜŻ+”EœyûgżŽ˘èôh4z‚­àLHŒ;$#"'ÙI@´[,1îŠĠÖċpĠƒ&Eҝكtg´İ¨²,K“$ıĤéĠ,Ë.£o̜^NĤh‰Urn?é°ÈhA)´€İݐÈöOŻÊÒäĝ!ŭĵòÔq?­à“ÉdÄVp&$Ĉ~à jġh9r2²D)üÑzÑŝCÉOX|FiYéδ;Û:)ı•eٕ<ÏÏ?ŭéƒq,JPi3îÈÌ·ŞXW2ÜĊ‘;GĈ6ô‹ÎÜ|ç§F>ŠOßĜĜ8 +8ƒ 郐° Zϙĥğ—ŒêŸ…j§.“îTžçı;0{=˲KşÜ:÷Òä/• U.xUÌKĊû"#,͍SĦDš+DƒcÑ'7Ŝ~×YÁŸòVñx߉œĞ$&¤ûo1Òn‚²ŽZHF8\2"]ô³Ñ]*Ŭi”Êó`ùüäĈċë”.ß­hĦŭ’‘92òĞsŜUAW6Í3ÇÏ%óVét:e+8cO%’ĞBv'#Z!a2jm €+¤Cĉ',Ž2ĜÙ¤éîRQ矋ŝóƒQĴJ˜6ĊAĜuz­ÉÈ˙˙|UGy^"Üüı·‚× ŭĈñˆ­àLHŒeùÈwŠĠ´=ú Ɉv!#ëdhŒŒĴ’vÁúZŸ/lèזîf³Ù,Ë.İ29÷Êô/g4Á¸h!hnYXC2šïT˙˙“$(Žä'7Ŝ~#ˆĈχ'G£Ñ£Ç&“ɐ­àLHŒeŻ…á= ,¸‡EFŬEÁ”NşıyȤ´jérÒŬf’$W²,ûqjûâÉé•k ÂöKĦ[‚Ċz“QwëÂZÁËJ>:ùòökżŽ˘èYgèĜħcÓ;µ‚391!Ŭ' ÁhëtŞÓ;dD‡MFŝĥ”öüQ·ğPGH)íGşÓUUY–%íùċ˘(Î?˙ñƒI¤s2U³> Ĵ9ueÛÚ­Şü-ŭğÇZVÇWegRbBş·!l?¤…³ôÉÈ´\~î .WFGY%-¤ƒIíYşK’äFšĤ—Ş2=÷òô/_ (LëLÒ]BF½)ÀTHÓ“ĦŸŬzûïĜ ΄ÄĜ]cĜvOŬDSl£‘#"#Àö§›H××ĈX)Ŭ‰t7— îğ˘(r'Ŭ]Íóü”Î}qꁋWa²ĉ ĴŒ€Ŝœğ5"£îßċLY’ ŒŽĊŸ^—Ħߓв‚391!ŬU’´`Ú]ЏŽŒşÏG´tŽ“ÒÁ^ÌìGşë6ô›“îÒ4­³îNGú`2DşDpı} ^W2róÈĤ8Tĥ+­*p‹ž\òÊûq?ĴàġXÁw36,Ŭ1!Ŭ£•QO•DM3ĵ6ĦĠ˙Ĵ!#!Ĥ›£Ż’Šg’ÚĞt—ĝ³U™ŝíĠÉŭš@şé›$$Únĥµ$#O–í9 çĈ_|0<5ûĴàËJwLDLH÷ġr„€>`RÌÏÜ#$#u *)c]€„}ñ6\=<)­RşS^şK’d˵=ż0ĦΞÚĝñ t^ÛÀ!‚ĤYW2êò…İS I ŒF#ùɵ7Ŝáèù–t÷€sŬĜyïˆĞ$&¤{‚tv›fdvd{½ÀĤ5Ĵ ùWŽ;#&&›kАî|ï¤"Ïó´%Ŭŭp:ŝï&C ˆíâî+µ&£Ö:ùŽT"/ ˘““/ożöż£(:=ON&“< !’ċ*‰ éž#(BhĤ5 Hi‰H¤M.säpd›>NRì4T-ŽÔ³€2Wş3ğHwĈKwišÎZÒŬıŸnü×"•ZR‚pÉbÉ¨óu†œŞ, L…ż?{ìzuêM×ïñétz|ccc80 Ûvï½TIŒ"ä·àŻn[•E£ù`U³äž¨9ğ(°!ÚNÊBmçógğb˙„1Ħdn HIŻ£mËôpW-B­ïŝK·^cŒPJ‰<Ïó0 7£(şEÑdŝxöôôû“ßŜޤP'ÁÇ·Ŝ}뽇˙ï·a¨ƒñx–eY^…ŞJw*$#™Ğ^0úP•1Ĥ ƒ$ „vÊ8²j]„0ĤžFû{Xij.DcaéùFġ„Ž\fžC@äNµÇHi)mr•‘ß!’†(3Ĉ”D¤ÜbFĜ[ßPžÌë#Ŭuċ;í¤ğ,ÇqEÑ( ÉĞÓ?|òçòïiD(!‡nüıqè*w2Ž`BG:phMۊmDŽ”†­ÚŬÓ\ ‘ħ‰v28 ĉ ‹ZT§EJAs[H@ H”•B8|vúùĉ›ïż:ùoÂ0œ ƒsܕK~ \=1!Ŭu„–L"Ŭ•hċ4뙁˜ )!G(²îÒhXVBŒ6˘Ŝó!e „°?†TiÌ­Qd Ü´ Pӝ–Ĵ G† GħUó4ĠaŞBJ@k[•…­Ĝ습ݵN11Ĉh­UI}ŭx° JbŜÑTê}ҝYRó?q*µÖ²ç"ì°iÑXî#‘Ĉr÷;ĉfBş'H¨O.é;-ß79ɑOµ;/Ŭ™žñı¨İ]_„´¨RZ6ŭĵ;?UJ &¤ğ–”ú&½ì!+;ıƒD·hÂ–­”–Ìà+ʵ‹>ƒĵğEc³{¸V.¨ÚR²ÛiïDJËTLÔS-ğ$÷3V65ì÷kL }ßÛÒWéôm,‹%:ïÄ̰¨*ۉ”IxËlú.³§Ä8àaş÷Efħ˘\vŒ$íVñïu,/ş–Ïljà iíŞ!ħÄUiûj´ûïeÏó-+ÓíG²Ûi2÷Ix„=:k7>û$ĵöĜq+|˜ß‹’KÈtâ€^_ߘŜ­q!ía/sŽÇ;Ò]!×a‡‰ß•I¨sż\R+˜ÈËTJ‹$ˆî^rÚmŒbĦuÛX˜%*#q€Żk72ÂÇħá‹+&¤{eÂ/{ċÔĥ‚·ċŞkĠ}ٍá>û:-1yiÒcŬ¸\6ġ:•ĵĜĦr_ÖÄpX²Ŭ2•Òn];=WELHw-s%ڕA…]²*Zf2ïµbêşô–ı˘ä‰ĵ>c´oáíkâ·, ĉŜÑ*Ĉ30o`0 Ş+żLH÷Œ,ÒmiŜ'w`‡‰~WœËTJğÉ;UC\­˙m>bA%° Ee´ÌxŜËXŜég0A1!ŬͲȲʋ$•šä´$9-3YiÉçeĴÏ]†ˆú~^FF>Ê i§1½ìE“Ò={5Š&B9¤ŭq˘wn-"‹ûwş˘K>ïALfڂZfÒ.óĵŒ#;üĵ[³—Ê]Ñë[ċ˜^ĉ~:ʄ´Ž„´—É,Ĉ$_ĥbZjr2Ŭ•¤´lµ³—ħ)Žġê˜ĉu” i] iŻ“}ÙßV…„ŭNJ°Ŝ~ŻÓQĠÓ{ŭ=ÒÚÒ²“y™IğnzÙê‡Ö½ELë:V‚¤öÑl6Ÿonn>½Ùhn´Ûc×67ÇBˆˆ@Zkô”ïĞ“ÓÓġrİÔĴVĞ·+ĵRé=.Ä<ïğç‹Ü÷;£‚(܆‚ŠñżkŬy§3Á<ŻÂ˘è‰ÎĉĉçVVV>ğQŻĜoE‘WëtD#IXG)„ZüìqĈPbLûŞA⠑ĝž=räğS‡}ċò›šóÉy%IGk-Eİg„`,ˆ  €bÜ%kÏżE³ZÊ'›››Ÿ[¸uë'­ĴÌm´Ûĵݵ”‚ÈŜ,°ìÙŭACeG’=N²Çœ%ĈàéGĤĤZž8ñ׳³_`))•.0);Z눁!ƒ>B(ˆ  €bÜıµG)ŠŽê0üdssó§nÎÏ˙ĝ·nÍÖ2°ûJÙ!²Û‰ìÖ0fŬÂ! “‰…à€Vö|+;‹ ŻTä3§N½7sĝ¤jġ‹JˆK‚¨•‘AÇ!ƒÂ=( {‘ùċ8~vkeċ—nßŭc—]i·™y5úTv,ğ_ÚÁ‹›YÄÀ²÷·Ĵg„Èîײç#žšš OÍͽ;sôè£Rù"ùŝIÙÌâ‘uDP@1†Ÿ~E]›Ÿ˙ÍËׯòġġħĥRÌdÇlzÊ:l Ÿ'˙ـûyψ#qH`Àjöœp<ôG.è‘Gŝ&'˙gl]µ”RmQ*ul÷  ‚Šáĝĝ/?/˙Oŝä'k·oŸ{ûòċXĞù2³ò3ŽdDŽeÉ äp,<ÛĜ]Ġàa}G+#Eó)$Ĥ…ÏÌÍ­Ÿzìħߣññ/0Îo ˘óŭfFí"FP@ŝü=Éż¸ĝ[ß½xñżµ²RM´Ĉ€ŽeÀ/9 g¤ğKl—ÀÏsòÁ|Q7²c1{nJŭüɓ·Ž?úèże µŽ8ÑO‰À@A<Ôàçċvû3Wß}÷ß|êĠGjRR)ŝİÌòû€ç€È!ĥGP;€ß}ŜŝìzFïeîpşRIž}â‰×Ğ'NüOŒó%.Ä:Ċq½p x¨eżßéÌĥÖÖ~ûwŜù™ËġşO™µ?•€ñğ]°ğË|îRŸĜlW@ ŭ*ÇĠ° "qHFeq‚+.gA•1|dnnŭę3˙œùŝEÁù‚ĥ˜ï×m5P@A<_:^ŝáç>÷ŸŬ~˙ŭßùâ… Ï7•€'2Ħ?˜çZvŭkü~ŽŸÎñÏ Úî„ ĉÄ!7G@ċ†½Ú 25p!‹ÄN'Ï?˙üïòññżŒŬd_ËԀ‰$p/.Áŝ?ĝħûïżóío˙Û?żrċQhÎx$”1²g™£·/T²×½ì½AöZ½ÏËî{Ökĉïí³nÍ{ë{…ġž5YÌıñìûÉ"ÊH‚0—ŭ}ÀbħĠGıĵ­cbŒ fBhòì™3ĝü… ş˜5<‡d¸%ŭıužF pK˜ĦÀ 0 àhĉĴiĊÍÍÉħ(zĦ45ġ>œBLkIœÇĉs 5PÀgϜaPöŸüĈkŻŭëïĠjÁdfġŸÈ€#€ùŽT7`.[·FöÛ /ċ¸ žŻ{!xÎû|'àúúužöJ·bĉMjFbŞì÷V3"hXÑÍfŞÔscSSo1Î5qž@ʄqnĄ>{ĉ +H  €'ŭƒVë‡óío˙Ŝ›ĞĞĠ1Ïx4“´|hÛß.[A?/{\²@àñÔÜ Ĉu•c`D ‡û7‡Ö}F1 żrîÛ$0“ŭ–&€­ÑĜÚŞÎúŝ)^İ\'Ĉڌ1iĊ@PÀŝÙ3gĜKçÏ˟≏/\ıò;_şzġdà,täÈjĉJöœÍ÷™oT”s-/@Œt!žŒXF ŭ­†àÄ´%˙}ôç2ĜžÎÎğ àĥÖÔ×™œÔäû댨Ĉb’€Q…+p—†(.Áŝ—Ο—3?sşqûö?úOï½÷œ$zküÑż{̒ĥ˙n—úşA?dÖ}G&gCrí×•ÊżŸ‘ À•‚F˘RbŬ‡óÜzċĈ%+`˜8ŬÖ̇!›ş|ù³~öÙ%>>NŒ)ĉyÊE0. V\‚} úAnm}îâĠĞ?ş’$d²ûĤ,ĥµ?üĈÚWß~­k‰• lüĉ9û 9Oσöĵôy!z‡ŭ~!@ŒÛ֏`Ì!,cùKÖ$³ÉKd.ÑG3ġsqc#X½}ûÇfóIÏ$RΨ(ŞÏh/Ŭ‹QÀjŭ˙§~êc·_˙Ż/-OeVîˆ1ŞèOßÍËêsyĝĜžh'ß úˆJ@sžûœ9r‰##bĴ/ÙÈ&İ1‹X) ³ŝĠ,0z:ğ>׏têġO$JÍİ$™•À”LIÀ/ÜĠ‚î{ëßX^ŝċK·oŸ*!Íí?ŽíUzĵ7€İfGÉñûM<€3–ß"”ʵîĈ˘kÏëµŭü U° ÌûÍóž×§ĵĠbï€°Hq iBÔóí6_ZZzÓlH9›$ÉĴĉĵPE àŝż˙ıÏ}äâ·ġ__l4đLúWÑKŒqÓk]Ÿßµĝtë³ĈJġ€/4ç )SĞÍvÁ飨ëğtJâ8ŭì{‘$àJġĠ0ëb'ù–ġ7ħ½ È€›kkŸñËċ‹ÄX›’d‹IÙañ€ŭ£Ŝıġç/?Ÿüİİß}ëêĠç;IBĝ0ĥ'û˜(p,|)3qf9/°Ĵ%ìhé}CDİ5&ŒE'ê†ö{Œġ>Gëô9£>€”€( jŬ]•èŻ”–ċ7×Ùo֖Ĵ(EU˘Rejêş`ĴÎ8AÔâB„’³gÎı…¸˙Htiyù˝›BÚĥËDÀóü~?'h+lŻû_Û}wóÜNT50Êû’dp,Á(ƒ0ì*ğ]YâL6ğħ‰ı=‘ıL5Ğ[[ċCĞĞ/úǏßäI2|]EQĞPE àŸ˙‘ùµ›ĞĞG­ğ}û"ëğġûnŬ­Òë‚ßĝúVÀN{àû;[v۟ġ}CMEÎŞ€í’‘ï³V |Gíĝ9AÁiğ³cYL`-ŠhccCJİŞTjF)5İ8/ÁÀ‚î;ù€ŻŻĴüÌJğÍMwŜ loŬċúüîòž öÙ>é‘É{].ożĜ ¸w5cĥŻÀ÷ğ$a„<#WÙĝÈïdY µF³Ġ*µZ­ç¤”SJÊiE2ŠJ†Š€`áÜò?ét*›ġú#‰R4™Ö$÷ĞçJŝ>³f[ü lĊ÷#¸—7L^Á€÷e˘•êıBô…F d>—$ŬÏtƒf_{Cš*Xo·½#kkßW{WH9)„Wœ×xúçQáp?ȧr ċgo­­•ÂD&˙í²^ÛêċÉán cġÍr›ëğÖŝN|~7Ĉ°ËÏ%ĝ&˜gŻNŒ”‚—ĊìC8×ĊÄJ–‚Ş+…Nğ]M¤Ĵ(Ĉ”eFäs£ĵ (àžÊ°0,…Ĉ§VZ-Á²É;†íġĝÀötŜĵ÷ ˙ҝJ}ŜAr_İádÂt’ôÎ?I =¤Dĥ“‘IrƒÙ÷ Ĥ5Â0,)Ĉ*žÖU­TE†aAAE àŜ%D)Žc  Ş~{S·6?/µüĥ_=(Oˆŝc%ċ°{vúŻï§GŜköùÙÏ çÎџÑ(œÇv\Àìv­ÑC?Œ˘£JݲRŞĴ€@ QÄ p ü¨ŬžZwëġ…˙ıOƒ€8HĤÛ a/ħ€Ħ?ŠÒġ~ûħù™\;…Ĝĵ7S ”ıĉL<ÀO’Ì·—ŬîÂfÛ3 Ùé¤ŬžSċòe­µ­ ĝ àpoƒ ĵ8IŞJë´W{ /'\éï$ìtA¤T˙’à^ƒ{;}óyŸkßd"ĉ³´em^‹tU '[PXqS7` ¤(‰˘ŠTjLi]ÑDžNĵÀA÷vÈÌúm5ÇtFĠì‚FÈoëí. rcÍíÌ:Döóğó^€òR€ó^³˘ŭıDCXšsP’tˈŬŝ‡Êı.v”PJùZk_)ċƒsžt:ž(•Š@A÷VoĥÛÊf`@ÏMêZ@ĈzÖߖŭƒ‚~yûneî´"xóZ’ôğfµ ŽÁ”ês€^ĥ$°=cRJ xJ)<"ò‰¨ÜûĦdœHğ:Ĝ€`—í œgġmInGċï´g”v-~žï/eŻNÀŽX™„,gÀr \÷GXq·KrœŞRZs q•$ŒçW@A÷˜Lŝ/ŭùĜ^!Çl eQw²TÀ@?|2Dy@´Ôg%ûĴ­l‚0Żg íûi<#I 2 ,éa{kôî5ÖPŠ 5ÓDL3ĈP(€‚î7@[ŭò˜ü´a§m·Ŝ°ŬŒc˜E5 6lċ`·î‚[ݰSġل^*rÜĤ9{ËĠÜöEó6ëtŬ×˙ßürĝ{¸‘ü½cġ=ˆí D„aúV+`\$;-ĜT7ûƒRpJĵˆ^0Pä‡ìÌż‚€6èGħĜBìÀƒ™Î€p{ž€Mnœ"ï÷dï5.€r“i ZL̂Ìp\ËÏĴX€‘Á}òßnş!Äp`X `Ôvày]wZ4Ÿë~ŝ b ´acJġğğw…oq^Œ‚î[°­½ÊQ‰E;VùíÔÖkP2ä ÄœŬX}weÂ*H îıĜ À|Žï§K„Î5zyö¤ pÀT´ÙE.;`ĞÊĞéĝAÖw˜œw?oP²Ï(¤î#à‚Q5B¤.C’¤ÂÙj€½`7 UèïTŒ‚îëaì\„ŝŒ67ĝgo³½­ĈôÙs˙ k?Ĵ4Ĝ]ŞÛ‹ßż÷Áĝ)Ġ‹Ñ]"$Ĉ -µ#”ê°Ħ·q– Xì`]À} ~­£@ˆH[ÛgÙëÛy[vĴÊs2s}íQ{ J9X=ä%û¸Żí&ž uOä4'eY‰0_œ żw İbĤpcñäÄÄâÊ Óz›ßjÇì×Lú/Ù`·-vw²è£. ŜéRĦ+˙ŬçÍòŸñ÷Mĥà x§K[ْ™„ Ĉ 2(àŝœħ„s'ħeZsçßUğû~Èü<§¸€­4ܔeG½ċä7ÉZ‹íż ¸‡VŠí”ġ窀>Ùoüdw.óĵ Ŭ‚y7E>y wïçY~ûï²N@}sT€öĵn p(€ôk Ĉô dߙÜdYvTôclè÷bĠGU ;-3˘2 A;‘ƒû˜ó´.Àj&JQ´­Hı× şË2¤”Ê܂˘¸ €{6ş“r$˙ àĤŸXv"!…aıwêïïfä%ÙÏıD`nMJ°ıoÁô Ì„XNRPûT ¸_u€=yŭQ%­›8LêïĥpxïÖp‰ÀħúYS#ŭUqn@A÷ŭpÁm7͋ t›nÚÔ#$òÀnççP`ĦCp·$8ï7¸„q úT@1 8pƒŸ“gÍȀßtò5É?n"N›€ “ûċ ìĠ}°eÉ”2ŭ]žDQJ~öîĈJuğúû¤PÀQî¤Íġ˙]€ğ€]4ŞU߯l>Ïì_€Ĵˆŭ>’²żˆ]`˙ĈÌ˙7YšsPöÊŝŜN*œŝ‚”—µŝy{êıAw˙.‚~zÔf!;ċú[Żé½´Ù"Üŝ[{kñĵfĦÙu( ·Cĝàĉn1î`¸›€ş*@ëo6ŝ°Agdż[Nğ;Ŭw펔ÁN™‡;‘MŜoÌû\“dç ‘ĞĤŠQ(€q!í€kĊHJhÓûĜúa²ß² CÁ=jY-ÇÜŝ~CIÀüVó~{eÀIJ@fïʞ§ĝ4 Ċs\3¸­ŒÔÏ öı–ßħÀz”ÛŝğâÎâƒ6%qKŠ!Î{‚;¨ ;7 ˜˜¸ éV²AŜĥöy 4[„Rë'½˙‡ù˙£|– v³3°‰ ¸mÁÌêQypÖ-È|–ı–EpAbPÙVÔâĉúçu2Ö_ˆżÛŠ;Ŭ; 71d'az~{ż÷Bp^+ò 8pn@^Ö__ôß÷Óü› r˘˙zP½ŬXQûŒJÌÔ&lPÁ²üöR§Û$ŒA˜S(TŒ‚î{°ƒ€dKùĵL8ÏK‰ ĥ—ş hŜ]ûeí‡üòËîdíLVñO·ZóÒ[ó^!€N§×-Ċ2`AHŝ3×ou#ö6°ƒ 3aV{§Z€½ĈÌo°ˆğßߨñĵ–àà†ì˘ ì½ÄXŻB¸Ċ´*à ş7üÈ+˙µ‚Œß?Ĵ!è(„àzׄĉü­ĥk6.ĠÖĥ_}ï3€·²ğ*Àŭ]ŒġچÙ×ÂıĊ(à@‘@xìôŜ>”9ċ´JÊÀŝ çt ˘; °ì4ˆ`m–tìN°ŻB0sübJpcy™odü\;À,{eŻ-ż|ÊëĈğ“RÈÛµg¸‘yÛż°;ħ9/m[{?ƒqö§Û·†ÌF˘Ĝ½Z1 ¸ïîè&ŝ v^Êï |ÌJKÎ%ħ‡ħûyîgĜ wT€ÙhÛçı; ÙˆNƒÔ" ¸ €y!r–ñÜ,żAû˙Ùyó&OŜyŒA1†ŬÊŭQ@ŸçĜŭŝ]E`Ŭïĥŝ²Èì• ³Yˆù;óıŒuÉ €‚” ½uiÇÜÂ7N`ÉäYî;ĝç)c™íĈ"vÏżÈ ÏMÈ[ È#Äꀲ@1 8˜D`‚[¨)ŻÖßŜ,6ċċßçµ×ÌŬn÷½Sp§=mj­¸Ë{}µĉšĜ™‚Y˘PÑĴ €|ĉ@^)Ĵµì·í9çí0ÊnA£JúŬĵo/äày)¨•êeú™=óˆÌAĥw ² VЉYÀ"áş6xí`+1h`‡ ĵÏɳò;w”~£„éì;ìoíx@žŠħU€Ğ\P(€‚ ˆî}WĊç‘À¨ÖH-ïn,xŜȳêAż (eïğlr°?×4ùTNìíëSÄ 8?ú‹ô üüò›üCHe›Ċµ1È Z÷÷Ĝ¤cÈÁ|g$ìşyçmg@TQ\À”gŭíJ?“`{`ÉŻ]4ÈÊïĈï÷GÌİsŭóaM?ŭ½É÷ÏYè.j½ŭ7µÛŬ÷ħbbpPUÀ@+înj½Ÿò†yàßínAwR¸ÓŜ€y*!ŻÖÁöíí({÷ +²H*à`‚ÛĠùÍ?ò\óœìËóít?›|q6…$ܔ`×ċ0ÀÎ!<ÍyŻ8È„ÓFĵAbh×bıI?v3L{ĵî8ĥôdí‡Ġüïf?AD°íGêÑ\ [ò;+&Çż[l•½‘ˆEvĊbo‚îkß߀@–òjïú³Ó>vĈŸmùóÀż“¤wc ûµ)¨ù;ïß%…ĵŒ>;ĝÉyÚècgçmnmRŒ‚ +ö²W?&ùĊġûm²ö{éĵ—€íĈĜV^İíû˙R°ˆI’ZuWñĜdáĈ8Ĵ÷Ĝ›†¸ŻĊĜ…ÌÛġ×)˙5Ïġŭşŝŭŝ\— ò•,¤AǙ0ЉY(€ŝ-ÀmKêĉĊçoï5ĝŬ÷Ûŝğy,eݘÈĥ ö™vçJġn@ö\Ħ y¨—_Ѓ;§F"w)Ì.r×ÒmBpK…ï'À"#÷üŒâħ‚ì8‚ÛÜv-WèNĥ5ğ›saĜ<(àŜßíȽW÷FċÜWêċ—qŝÂzéüyÙçöş_ĉnĝéA^PŜÀwZàs·€ż1™×ì-Á„H·ÏɆìS6d…²;Ÿ ÈıŬë|Pfü῏ ¸ı†q;Iäééé€iòğn€K &(6JUß_¤{N3ßiŻ ŭÍ?Ċw÷ Ü)qiŜŝĠ_ŭ´x÷ŬÍŝäO>âf4hGڍĵiİüò/ žw Z'ĵ6€Ž!%~u­˙] DĦĦ5‡”GE3Ö_àċY~WsÂ÷óÛïvóûüyŝ^?'g‰SÛ%Ò&o½~#úċZ)"ĈĥĠ.kçEĜE‘‘Ö€”' ċqh=8(e†“ŬíĜSACÎ]½üòŝ+a8†(:‰$™Àt' +‘”WΞċ;]H²n’, jğ(Èîà6üĜ+è†Ìn@ż×sÈYÒÛÖ÷ßä@ĝ>tҋÌÏCżù&’nyġNûôôt„D$´Öı'­÷~CaxQô(’dZO"Š<@Ğg–×ŝo"›&ħ”LJ$c3hûDħH’ö°éSgĴžı7Ĵôéßßé0™’Q$ Z X\„^^ÖÖp@@½mׇż^Xà””RxZ³A1í¨€‘GQD1´ƒó-m< Ğ”˘8˙ÖORNp­Çˆ¨ÌˆZ‚ó‘Ĥò|ĉÖI ĤûĊ·˙ Ào[˙$×AËË +W€%4•B i„5öܐ3ĈĦġ@lÓŜ焨AÊ„`‚‹…¸oî 0(H)pîI)Ċ°£ĝóƒ¤ù°ŭĝîFPïn€ßÎw0ŸÇ@½½ş şyXXÖÖ “¤M³Żß^MŞÔšĵw$  T Z{PŠg+ LĊr‘ ˜ÇúJΣ¸gaĜP&2–ŜNû5ŝ˙ ½˙Üáƒ$ġw d6Àúz ĝ•P­Ŭju+9ú·˙Rèßai× `?-˙|Hc i‘b’ê6pψ€°–ßݐŬN@÷³ÌÏkö†@­½°ú÷ġzÚé'+ "߇ÎȐ°=cçNLĞTŠĵğóKé+΂ö·Ĝߨ `L{ŒéAßµ'ĜùónïÀA½ï7›ß$)µo·AaĜĞôĵ”òHÒj²_İ{wiJ=°CNI2-´.Ck@om8 âw>‹­­ÉÜ6Wûu!ïöNw;#kî IDATíú÷++KK zEûçĤdŸ”Ê­ŭßí§'J‘Eĝ>pòäž}ö+àĵĈB01 @‚Hg· ‹3ĜQ=#€èArş AİFDTŠˆVcž×äDüfù&ġċ‚ ŜÍĕZ“(Jığ${ùϒĈÄîCO× Nà/,ô€ż_ ß­ŞqÄJħ‘t]š˘-!Dœ7 DB4ÀX˘DZ+0–ˆ!D œŻƒħ5x^œÇHÓ à Ïc2I6b"ÄD-_ˆ’ϘÎ9”" (EÚçòNX³ÖŸçßÚÚ{P}PKyQĴ­Aßş•ßíúsžç˙˘éŻll()ĦFuíÒz‹|ż Î7ÀyD!€€cD1ˆÚš™ĜÂT x €;gš3(QÄX³E Œµ˜ÖB ÁÀyoİ™ˆAÊ£bOŒş 0J{Ż@ï>˙A$ï˜BœžÔÔì$Ŭ £Ĉ ĈBħ!ÖÁù„ĜDŻ˘PAë$3„°KUô¸÷# –›M9Q*Eí$iyċ2ùAKâ‰"@€óZĉçíú ))ÚÁ hğµìwüvÎÁÂÂv‹˙ğ)ûÖ˙/ġßGıŒĊ`Ĵ Ĉ6!Ä[ÑSÎÀ~X}üġuè۷ӊ<ÓĴóƒ~Pô7gĊ(;"™#MI~2[Ŝ3E‰j§ıö &0ïÔ×ħ…ħŬY˙tR)%ş€<™žyyŬ„÷ËÏ·3÷nŬzİşâŝĝ÷çùŭğ°Ĵ`WCë^BOz˙üKwcŽš@é]aĈäŜ"üâğĦ3İu‘ TÀ>€ÖZ³n%ਠRŞgŭíAl?ÛmjÍÔ¸à__.^L%ż½İ¨ì({ “ġĉqŜo5ßgo÷mŜżd ßes7Ÿœ(ĊP ¸“ÑŬD’ JkÒY[0>ŠġπBRö¤÷şë‘öKKÀ•+i1ïo¨µb w³„8€ÈĤıYĉğ ¸Ä}T{iğ[(€‚öˆH³´\ôÎ|éŬ {ğpĞzqÜ~KAl½ġ|,kŭŭHÊí֞¨Gû~v‡À7.@1s Ĝ—Áˆö6›ò–˘vK B¤ŝŝĠĞ ġġô9{iŠ'ôğ~£Vüàf{öuŸËĴżĥ‰ÀŝC£^‡}ĥöƒ\·b°?†1Íò–ÈvĊ$ğĜçó^JŻ ~Ëêk—ìX‚xÊë30(nEŭ;ÙÒ>#[”)AĜ$p‡×êNI@Sĥ €ŭ µ‹ ­†‘€ 0€QŞW\ݧË|µZ ^~!zRß,ŭYAF²ÛĈêƒ<ÏìŠÜ½R&$=U TO„áö¸€ŭŭ#^?•Cj—>}ÑK  €}0`$@Dʞ¨Û¤ò l<ó|¤€Y_Ŝ?ôßX}ۚg÷‰ħô}îòĦyżM4;9Gó;­Â'2÷£hÛ~ˆ"è è½Çüû÷ÚnĊ.Á_Xô‚îÙÏÀîµÚíC‰í{f )ĦwÊÄ3à€••^¤ż\çm>à—À€Ŝ>FÙjÜŝ}†¸Ìêƒ èŒÁXJ& )ŠşnIW Ĝ¤yµ ̽Ğ5+\€‚>°ÁFP ­FczÂ@fñ´4³AhwĉXXnÜH7ŬĴTú%ż-÷…Hoò Ĝ~=/wwâĦà*RIo/*ĝ~wİ´KĈ-‚”8ï˙ğ!9y½ĥMP@K)˘îɧ²Ĵp ĝb\À´Ĥ2ßġĠ]Eà6ŭ"]ĉğv-µü•J7Âß~cġ  9OAîÊ˙RİùÏ%€< ⲉÀVqœ*ƒr9u&÷ €îtúw6Ş IÒs3ûZçCŒÁD|TŞOîğòż €ò–÷ˆÌ–o2Oܕ]‚ xˆĴ?Ä @œˆL`,[7×NUŸVŞ7)ƒžŸ½˙~ ŞrıôÓA(××7ÖŜ¸ĉħq#ìˆF zXeĦëëËoԌtoˤĴY›²d߇N’ô7šż5CWì \B#Ĉ÷C,54żµE››+àĦŽd Òa†›÷ĉi„n6 ëS3–n³ŭŜ{)p‚ _Ê[GŸä‚Ŝ}!zÀ·†{1˘  „ŠŜŸí†x^Ş 1pŠôw0Ĵ{’ċnäY jÍ ğ[1€f?”˘Ħ €˙D˙GŜd‡ħÚnœżp xÈI€ˆ´9F¨ŝ˜CzutíPŻ=Ŝ]×7–ßH|üèĈ]°oâyGó@˜Ér²Smݞ%Qì*–œB"òŭ^pĴĝ~Ï}pԑ+û#ëÖßì9{³ˆ#÷ÂiÁıĉqĵn šQĜu˙B™ċ×kk İİŝŜ€ŽġïóïÍsĥ `òŒġ˘ôöŭöà|[É ÔÖ2 f,Ûقv”€Öİ0+&ž—ü4@ĥĞ;ócÊlŭVAAw²É=jAPÀˑ×}ĈpéRġ7K}`Ö2_Ÿßoîy)ĝ3__"°ï(pŜßWpˆ R[ §ìIÒv|ÀÛÓÀŽsx^úyïqH`?’ PÀ‚ŸiŸH£í:“;y}hµ€ï~7]ïwƒsNÀŽ ´7Áż<ûŝvàğİÁy$àş*öa–˙%I/šw]Ëú׀„H Œ+`WÊÔ½ÈC˘ïm ҈ŬgL3*(  €}ŒŒ˘´R\ĉ+‹”Ó[oAŜş•ÊÔíqÎ{rŜ¸·Àġ÷ċ·sìóĥüwóŒngüÙçĉyİÏÏX/Èg–û€~—ÀŜoU#vf˘u}ÔÖßÄBŒ XŒ‚öĝ>ç;öPŒuJĠêfsuµÒ³ ]ĵˆĉ­[ˆTmK›$=ÉmĥññíĜSMvomı.@žpĞ亂^v¤ż+ñM+rÏKßoĞ“”—HT7û/q‚€v ™^c™É2Ĉ×\ñ˘`Aû0v“EĤ¤ŒÇ*•ċˆèxKk2kä°°€ĉċ˨(a„DwE \NÁmgş*Á}l@` ë lW$rž’€ŬHI*#7.@6Ès"ŝŬï0ÁĈ̍È+² ÁÜgDÊŬşğÜuÀ9×\)µ2 ç1bĞE„†ħŽJµäÛocÀXŝijk7#ÎqúR…­ ÜüĠ·ëÜ@×?ĥ•G^ġžŭ~CvŞŻù fıoPċ_÷K–W ĞŸX„ îÂT ĦË_gœ' R¤µ"RUçy‰}Ĝxĥ\Öó[[<Ô µTÄ´&–ĥcZ)–×*3Ñ:âcc·6 ÄqZÓñ".£·žŬ­o7–3I@v­½Ğ¤Lsûïĉyï‚ßm’X{Ŝĥâ$eñġ-f~]IßOvŬü~2ÉBÙr!™,@Š˜à§M IÒ=vŠü›çB‰çIĉyMb"ŠçħVŞïÇĵrö,'"I;¸}ÄWtêM·â8 @İvD,` ‚1ĊĴj4;ŒĈ„ˆÁy} uXZ‚t 7ĥĥ9-#iÉĥ³eqÎĉ}ıÔv]€ ŝœ ›öĵnüÀÜï{.ÒûD=÷ÁŽ)¸G^ Ñí h…ó–âI°P#B\*Eçm1Ĉ"b,j@ŠRİ/ŭâóç%—ò67g‡˙ƒÉÎż0L *ž§ xp‡‚Ö ˆÔßq D‘ρÀç àY êö(“”RòQ­F ïGml žIĞ$ÇŻíFġÒm•mşĵž9C3ɵM ĉ³Ôh{ÙÑí,d?gŬ§Aıöê‚))ÎH€Â: RŒ20îRƒÊó"Jˆ(䌅ÄXÌ8ߖ‹üúßŭğWêµZċĦ3Áó4*•ˆB Œ=Ôr€=àk ġ%w~w’€ĥĥÊ, gÎu‰sĈ´ÔO¸ïw”ï۟]l0†UëĈ,"I’VÑEQäŬĴżÛ·ƒ‚…nÙŻèsÁŸ—(”Ó/PğC7°è6Ù!ıHg`ïVZq€ŽE„*‡€uŒé \nrÎCÎX‡ˆÚ,U‘%äééi]"à@ RŸÏBhĝ~DDZ§§àû:VJ}lnN ÎßÇää-Œ÷77j·œ³’¸–²”£$ £\^Ù Ò-ôµ$9V.@ívjŭ0íàÊ`Gց^šŻM^yËz68]ëïTĉ½OsŜßzÜVƒ66ħUôK’ô÷ĊqôœċżÄ!s @½\NĤ''/3Ĉ"ÎX›1ħ“2ÎXtŝĵ€É …”SÔnû4 fj0%ìëOLLàùœûœħŠŠ˘Ê+gÏrG&FP™™ù?ééġ÷2+Çrâë6RÉßju­%Úí0<ĵA]ĞĊisód@4á¤u )G¤“Qké qqâÔİ/”&'£ HÓ‘#s 0rÍfjġk5 VĠëµZÚ4¤ÑHŭçf³ç_›¤)ûnnkòĊ\`ğğŭZù ŬRá,‡(Jc¨ĠJğomAonĤeÏÙıëŒÔdĦáÄ@Ü Ë^˙ŒwĈĈÇoqÎ;\ˆç|M0VçMQ*Ċ"C››“>pŒ­Ĵ|7oo€86ĤP­n€(Q@Ĉbx^\¸‹+ ÄÊċáftmé˗OùIrlŒsÏ#*C뉤Óİls‚ C÷''?_9~üŭ÷ˆ°nİ€ÈQ‰ˆÚڂ×SĴ݃j5èġġôqĉPfQğ5?°.eê“ÛàvS.QĜı VpR'I ŝN'µôġ:ôÖhs3=×ì1êu Ŭîóù£@Xy@­\–˜šZ,Á²ÇyŬç|]p΅h°$iµġÊÙ³ŝééiÍΝS^ĞġŸ³Zmv¨üg 8r¤‰C‡.€H‚óDaìò‘Qx<˜@jġ œ:5?ÊßR³)x£ñDUˆrÙó„VŞ˘=o╳g}g5 ÒZGeÏûwìĜïO=şùVvqmW@9q€Vv´•ê‘@FTŻ÷H VKW ĥĥR01‚(êı YRQx-½úŽœ×(Ž{>½ñë ÑÄqz~ÈR,zk+µüÍfŞ2Ğvğkù[˘ŝfò-x1Tfg×+ĠêmOˆĤ'Ä:b…s^cuKŝˉ `À—–ŝ&.]šIŝW*mÁíÌ÷o¨íĤ€‡ÍH `|üÏ17÷µaq€zó7^¨rT…|Î'd’ÌäÓ Š`b⠇{ìçËeuşÈîÒ׎$`܁F#uÌÑlĤï1ñ£â¸HDƒ²€b7íĜ’ïŬ#{Žâ8}oR? ÚżŜÚ¸#ü›› µµrÑë렍 $™ċϋúğeż žœìˆÉÉùrĴyŒĠ|!–9{ĉ ²•ĉivžQcâáË+ġú§[-o6³öi7m}‡1?€IvWxƒw:İ0~ğ”İ<7Đċ Ŝ¸:Kíĉ¸Gĥ„îFTĞA½ÔŻ_Z­Ĵô–ĝÖ×Ħ×ÖÒ×·ĥQ M¤íğÚÖaV?LÔ.É~ŻÈÀ˙m!9²yìĜħ·ÏĞżP ‚[çŬ, qËç|<6V?Rİ´?67'3g‚¸Ŭ~ŒżöÚż˘Ë—Ğı›°öŭ xúé>ü‚`B¤Ñ:|ż•nü0ú˙Ğ $ßżŒÇżŒññ'ħµµ£IIzçÓĠ#Gž9\İ,j`Kġ(j¨röìĤ­´)Iê\ˆòĜĜĞzöÙ³|ñâ/~miiâ3H“^"+cËb‘‘„²\†ħ$AisĵلOeyı ŞVñq`cş\NUAİÔí&LĤ˜]Ġg7— &šċFj·SİoäĞĠ%—ú×öíĜFdĊ;ŝ‘ÜVÒŞÔz<š,Šd+}àÙŞ@Qĉ1>6>ŝ…#Ï<#k˙·˙b~ŝgµĈ˜Ċ,;!Ö·\ÑS+#…R’ şħı™Êŭħħôccİ+`ZˆsŜÛdÔ4äÙoŠÌêAğ³GSğŬw+áhëišïĞœë™ÇW&ff._+ùŝrÉ÷ç}ߟ÷ğ]òŭċ’[JëÎT¸˙íö“ôÚk?‹Zmx›8qbĠê<8ŻCˆ-0ĥ ˘-Ñ]˙X­˙¨zóÑ÷c]ĈOüŜyçïì èúKïĵsȟ›ûÔĝÜÜÍÈ÷;ŠħÉu­;RİJ(´HÀÄêC)<—ĞĠ/ÒO4yüÂ\yì•ÂqK˜uqĉDʇZ|Pj6Qj6Áëúŝö^½}u̵‹‹LŝéUé€âÒ}’Üs³ú\à³l5à ïùž;uêze|üzàûµÀ÷—2_÷„˜/•J‹ç[%ÎÛµ0ìüèëLú vî\˘ŝñ?~T}ï{˙+{˙ŭ1Ȗ돕˜½ŽRiB4‘ċ€1;ùçĦĠN –ŒL+û’dÎóxíµ˙ ݽv|”€’~ìħHŝàŝisfĉ˙]O’••(ZµZë1çV7_:ŜdĞñ,ĥçË(šPDGâ$9v:m,.ŝ­K—.=˙LÒәK Ĝ'j‚èžxïÖtö³ƒ›Ú~{v2ûf€İÙïXnH Û3“‰oWġ™oĵ àÛDXŽž8ñîXıĵê ħîûŝrÙ÷ç=Ïğá 1/|İâûe!3ccÑĥĈq<‡µµż?ü_Áâ"·SŸvr~ñĊyœ:ġUT*—áûóĵëĵy+ŭĤù™³x¨ÒÏ}ùËúܗżĴ³€ c Âĝx„7>Fc¨  Z£R™e““m”Ë×­iGQ¤b@Ÿ=s&ùü… úì™3ÌÄÀç R&Œ1Mœ7ĵJċ½Ù‡—Żnmı†ÂCZd`Ĵ'a{WĦÄ ÚĊ5qPĥ´FĴ5:I‚$Ž‘„!d§ƒ¨Óìtd÷N* щctâm)ÑÒ[6³ÏlĜBZıĜFQSœCÒ"­6€×ĵÎıNn;yò­Rİ´^ ‚ĠÀ÷o•ƒà†ïûׅ7…ï/zœoŒû~³†9}ZŭġÂ?>>3.!4›?ƒŻ~ġŸâòċ$,gɈ€“'<ġԛ¨VŻÂóVáyKà| BlÀóZÙÏz¨ċ˙ìôúR0ĥ…ññ/áûï,šÍµC$‘IDAT§QŻUEôÖ[³^µú£Ġ'ž¸‘ñfĦÒ:–I’d@ŠHmîû@JÁı$­ĞVÛO<˙ü­•›7ŝ›7½†ìÖ ĉG/{ AX1[5ĝèÏbĜžñÜĉmá>çúöödJL”ŸÉĝx‰Ë— ù—/ Ŭ™ZGŽÈÍçŸĞ6;û˙l2öíf’Ô[Zo0˘ÍPÊf 20A9ét<ĈX9ÑzLş’H9•Ş*­Ç)ĞJÊŞÔş˘”*+JJʒ|­”PJJkĦ•ò“NgZ‚e²]iÍHcŠMD’ˆF1ÎDŒóڜócĴÁ9o3Ĉĥ8c[DÔ`Œm !ÚÄX“’¤žġí·ĥµÙ2Á‰ `ž™‘a½ŝCüêĠÁ˙è>IrıĤ§5>ùÉ÷pìĜ×Ğĵĝŝ<„¸ß_ç–ôW@_‹¸b°ŒÇh=‰0|ßûŜ?_üĊ³£äŸ›ċ²ÖĜ˜=ûìÒĉc}²ÇġĥR5™$2-DÙË!£Ü}ÒûÒÚWRú HkĤÍNÇZ3)ÒZi"ĊRÇD1˘ˆ"ÎXÈ8oaŒµAÔáDM˘Ċ8o2);ZİHX2ß8FyÀwÂ"^[ûyŝÎ;żA_úÒÉ]MĈ >ŭéĞĝ‡^Cİ4Ÿ-ùŬ„çŬÑ"‚ VĝŭìU ¤iöI2Ž$™EÁÛoŸ×vz˜0 Ë@‹sl>ŝxkëé§˙˘91ñ4µŜjKı™Hı!Z$éÛèbE0À“NÇ#Ĉ|ĊyI'‰GŒ•Ö”*)­hí))}͘§ 4 2çĊ"R”ĥˎY–.A Ĉ:œ($Î;LʎÖ:Ê,½D0\?çÚ ˆÂQoaáŸâĠWÏâŬwËğšˆİOŬÀ‰Ż˘\Ï[ƒçÍgAż%mdkŝ}A{#;0 )g†Oáġ×˙%ġ­9´Z#“@`óaĠxöًí}èoïĥ”Z ‰6£N§!…hĦżwFngZÇ=°Ġ· .9÷t’x âDäKˆ¸ĥvÏ%€ëìûˆs­%)çħNëb DLÊZK Ò&-ë6÷ĵĞŸ& 6?ûŬIßĝĈS´ıığ9èûÀ§?} 'NĵŠ X€ï/ón÷oƒó­eÙ~Âòp§ñ£Ĥ!ċ Z­Oàí·˙ĵñĈÉaMDlž‡ĈéÓÍ֓O~ħ1>~İġĥÖġDÊ-ħ•݁nÛëÚSç4$ċ1lğŸt:Œˆ8ˆòW4´–:Ŭt˘TRöyĜwkĦmıU)ĝ£h\-.ŝ&½öÚK/VìÔŜ‘FµŞñ?p'N|A°’ÉŝEp~ ž·è€?*|ŝ‚ö#&`H`RΠÓyï½÷kxġĠg‡µ£ÖN\ &ÂĉĄn=ġÔíÖ£ŝğ†ïı%ċfGİšRŞ™ıñN´]ÂNwrÀŭŬ€ĥÜGM£ÑĝYġío˙3ööÛGħ[Ї+ĵÂû8~übżŒ Xç·àûË ZCšsaŞ— é_À’ÀX˜B?k×~ ßĝĈ'GÉ0D`LkH„úìĴjŸ9ó½ÎÜÜżozŜ7:R6Bĥ T“û~KiŬñ8—+­–ڍĠ†ŽŬ~‡z;˜Ê°µġ_İ·ßŝ-öÖ[ay™ġma6Ò ´­×G>r³³ß‚çmÂó–ày‹ŭÛbĊżİò+À_À]# ’dRĈúúÏá7~o½5>* ˜f Ih?žÄÏ>{!œ›ûż#ÏûVGİU)Dƒ’¤Í|żĴNg"d= •i”q?LpÇ]êQ4Ž0|×ŭò¨$™;„žzމ§Ÿ~SSoCˆ-‘Ê~!şà·|ŝüÜM–˜Rh6?ƒ ŝùÍè Ŭk¤Ż’͘ö@8;Ğä™3Wċɓ,ÇĈ^“ž÷qIZ·Éó:eϋ£$IbT;IԇgfìŠÜğNĥ’°xĉëuïÄĆOasóżÁûï˙ó'°´´÷g&&4ïûpòä(—oÂójĝ—ÀùrŝüÜ H—•š„R3'qġêß7żùVVĝ°""óXi 'žĜԏ?ŝu:tè?Ħ\~•‚à–Ö:RJEc˙{gÒ×qÄñWwż7 ghJĤdQŜ$ N $bl_ !—Ür ò!|ô ’O §ÜrLN†Ĝ:XB,)²ÉÚÈápVÎÂ÷zÉáġÈ6gDFġ $ÍëúwUuWUĦ0Ûr˙[G[ƒ8(lxµV£rS^)MDy­syï_–ƒÁb{ûCÜıó¸y³ŠÁà‡­Ğsç\ĵxËË˙Do߄RP*Ğë˘Œzö'ŭX&ß\²ĥk_FĞġK\ż~_~Y{–›ƒß* RŸˆváŭxjĴġtƒË}‚píéÓ}Ïĝ^ğ}dżğ+KqL9(’’N Â:疜ğ(‡÷D·û=yòSqŭúi´Û$ü,ŻÏ灷ŜêàÍ7?EĦZwĦÔ6˘¨˘´n†ë½“xŸŸàıĊ½j//`mĈTaÌ2vw_ŭûżµkoÏÖħoˆ€µ5ƒsç¨V7ÒK˙@ıü7hŭ´Ŝ÷ ĵ7Ŝ ŠöJĝÛħ·.sGĴs9í=ïÎxĵïÙ§Öî‰@ ^Ñ€˘Rġ‚çU§ó+Ġéĵ-uÜğW[[$ci Ĵ­¸pá.Nžü JuĦT+˙¤l@ëmѝÊôóġ^€#!“ĵ@ÎĠ`Ì2ĵ/£Ŭŝwî\Ĉ§nŜçLTĞĞĞ#äó Nž|‚zŭŠĊ;z RöB÷ÛŻì;7JS#c„÷ŜÉ…ïÁİQ’œĈĴiï+díŠ/ÊFíx8,İÑ(–_—áŜ˘9”˙T½îqáÂ^yċ …‡PŞšylAİ-m—ż?ċò'ï³͐ÀıœĞı*Ĉ7ħ½ŭ!nŬúnܨ|ç‹/Ï*ùĵGħèĦ”ƒÖR‚z½ë––²¸BX(5öRŽ`½÷ÒiÑ'IÑYŒF×ëĠ|·ğDƒĈ#äh$h0³xeєËoĵÑĊÙ³7Qİü+tëí„} HÙQ JġrùÙĝYŽšL_*!¨Â˜ĜŬ}Íĉû¸}û]\ż^µ‹ysRfçèBD“™@6ÄÚìwÖbr>/Ĥrb‹%Š€‹ğ8{ö6ŞĠğş­û²š²)·Â”Ú—ċgg8!A„$‰!eĈTƒԑ$gÑl‡/x÷îži²í‚ó\ Bd­ş/\è`}ŭËĞżÎġ;PŞ)[Az˘=cĝœèc86"0í DHÓ<ĵ/ÁÚLœĞÀ˜e4›áĞŻŜĊŭû5t:„gty܈" ^·X_oc}ŭ³½]Y’Żúġe=û‰ZzÖöEğĜ?ˆlü,ÇQ&A.$ ³cCc*pï èvŽÇ?Àƒg°ı™Cż/ĉ’+X”E@ıìÄÊÊkkOħ²r…Â#H9‚”ƒàêwƒ‹ß†”}  ġ¤GÂ^û.6z€,“°àÀ˜b‚œ+‡#Ä2Òôeôz?ÁĈĈñàÁiôz­!MÇN_­:TĞ NŸŜÀ‰÷P(<†Ö !ċˆzş!ڐ² ˘´Î&ġh½Ëî> À‹âLBƒÎ”`íĵŻÂ˜2Ĵ-˜ ‡Żáɓw°ııŠv;VK=Ko…ħ´äħĵlP*%X]m`eċòù§r)GÁû²ú ê1a˙eŜġYŝï…@íó Ò4†8W„µ… X›y Îċ1½Žvû:S‹h4Êxĝ0Z¨wP(kkğ¨T†(¨V¨Tî"Ž›(5ÑD;r˘>¤@ˆHı! „Œğ3†ÏÙ}€Î }y‚$‰A”ƒµ1ĵ/(Âû<Œ)ÂûBƒ"Ĵ-a4z ?C·{Ġ°ıİçr˘ pêTеµ.êġŞĠğÈċ AÊ„AÊaĝ ~¸çög?…Ŭ>=ÀÍ_X1pT…3b0ñ "Xƒ¨cr>P„sX›b°„ğw‹Ï??f“ŭ‹ÀKX_˙;˘¨)ûş˘ìJ.Qĥ÷„ 3úĴV!k~šààâ%6ú#yL-|7#٘2­Ç”RH ­#‘ƒµÎĊ2ç– „B.׃œˆG)-”Ú ×s›z;\ÖéèCİ1ĵ‡$ìô³q=ïö,Ì˙wċ ĤŒ%@ˆ"µçHݐĤBD!(•@ˆyMıġ rrÎî· ġ¤Ü U‰ƒ°Ë›˙ĥËónÏÀ|Ï x³uŝ­'9ƒĴûQ1×H΃( 7;brkŻ@L™÷ˆÏÀb˜0qİ˘(û‘ĞdµB$vƒË? Ĉ?6vfA‚wċÊtl=˙Ê"!lĝJáŭ8ô0àûÇ]ñGp,ùÖ6`‡lü~Ĉµ§…½6À0 0, °0 À0 0, °0 À0 À ç€axqá. 0ß<&j\!+È™Żˆ{/Ĥ6‹ìµ’D†F%&41Éŝ€+Y˜ıŝŝa#‹ŞÈó^Â9ﳖdJċ¤˜iùċ\!ĉ?B’T,gAżˆ`L.ìĈX;Ż4€€µ iZR'!„‡÷98׀µOÇìï dXX˜C„^u;w~O>yµÚ.ĵašŻ@ĞĦŬžO07nœÂƒż€”;;ʝ9ÓK—ŝˆĠĠ?ˆĦÔÀÜ'€€™ĈÔïŻ`cCbc£°°×µh·Úm½O” …% ‡ŻÀ˜SrĈlCİIk°„Eàm0üƒĜ_…£tÚg­@š–ĤgĤËp„4͇ġD3y †€ùAÏÇ99•ŝx/`mĈÔ`m Ŝ!DÄ뉀™‡' 10& Ĉ_€sßÌ;dX˜U7Iúĵ—>‚÷B¨ R 0,Ì!>%òsžŝó³aN@fxϙ˙c‡g¤ġżqîܟqùòž`L cb8'á-,A(„‡µ ĊbµÚm A4QŠŭÁĉÙDòÄñc¤i ĈÔaL1Üʓž& uıÜHف”}1‚÷|ŝ áJÒ#L8ODHÓ"ĵŻÁı0ĉDÈÀgI8ïċ˘Ŝ„b ) Ê&KٜšĠІŸ{Ìá`ÂKHS‚&% ˘<œÓJJ ç#äDŜ;bB @ԇRƒ‰ñ³ÀÀÌAġzğĊ(òژ4ñ~$‰˘œÖÒZ+f„ħ”ó=3”2ê}ê ç8`ĉÀŸ~ŭkùj­FPŽcÊ+E#c´&˘Z>/ÄÌIN9Žç}a`zlù^)ÄSáJ@fNBÓbF½ŝĵnıƒŝÍĈÏÀ,ÂúŽPħ =0 0 0 0 0 0 0 0 0 0 0 0 0 0Ì<ùŝ.ñ áIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_MicrophoneGray_256x256.png0000755000000000000000000004527412467662066022542 0ustar rootroot‰PNG  IHDR\r¨f pHYs  šœ IDATxÚí½{Œ¤ÙuvÎŭUĠĠïž×öìp¸;ċR˘¤•=ı%QŠrV,! À+€Dŝ °XˆÉÎ+ˆ Ä1$À@ #ħ€„A`d‰‘I-E˘D–\jwgú5ŭĴç÷ş“?úŜÚÛwîWUŬÓ=Ó=sĦĞŞë]ßïw~çqÏ,X°`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°`Á‚]&ĵĜvïŜ½è¤Y[[“á› ìòƒ=Şıì3Yw=B €`—ì‘çrDDĴ†$"*ëş{R삁~ò(ŠZiš‰ˆ·cwñ­(ŠŜ€Ğ09Ÿ!"ó[“ŝŬ)ŽcĊëѐˆ6•RߔR~K)µ%üç| üÊC!lìäŬcóQµ8EÑEÑ}¸Žˆ)$JİXJɔR ”Ş}î8ށ1FŒ1…ˆB)% "˘opÎż"„ĝԖRŞGDHDäšl";'oˆiÇWâ8~CŝŻÀ+RÊH)…RJ`ìHċ#" âħëuFD@D#’0×Ís "EQ”ÑqÎż˘”úvUUßÔdPYdpŒöôŜâ8ž$Ég8ŝQŭXUUW8çÀĈÄq q"BǐĤéèĥ8Ž!Š"ˆĝ£\“”„`T‚8çÀ9!Äèş!"‚f³)ñ[BˆUUŭ!Ä·‰(ÓdP8dƒ@ÁN#óÓ4ŭF£ñ³Q}YJy£( Ĉƒ(Š MSHӍ4 ˆxô·Î5à= ´·7—‰8çPpÎĦ,K(Šʲ!H)!MÓŝBñż•eùo”R‰hèAˆ @°)€ˆi£ÑĝŜ4M‰1öÙ˘(f”RE4›Mh6›033I’ĵı‘îĉ6Ÿü·Ż ˘(BUU# çùH¤iJŒħÎùoċyŝ›p UAn‘H @0'Ĉ_[[“_ĝÂ>›Ĥé/"⏔e™¤i ÍfÚí6ÌÌÌ@šĤ#On$ı1ÛÛŜ|Z°ğŞÁ5ĈĜè9„0a0À`0€²,A)qSEœóßÈóü+°ID"5 ä!G €˙ü#Ï?77÷ËQŭLQ³Ú£ÂÜÜÜĝĈÓÛ÷ŬG'5›\B°UFUUï÷ĦÛíB–e  ĊqĵQ–ċ˙X–ċż†£ŞB_!@^jG­VëĈ?áœßB`E077óóól6!Š"oĴ|$1-Í1Žl"€@žç ”‚F£!¤”˜eÙŻ âc": ˘^ ĵÔ²?Ž+­Vë×c?Y–eŠˆn·aaafgg1Jİ'€m<ğ]Ŝs/×İ‚qŠÀġ6ĝŬP&ûv“+(Š:t:(ËÒT!ƒÁ? ˘w‰hKЁž­ xၯcŭÏ7_眿%„F£‹‹‹°°°qKĉÙq·ınn3Ÿ:eü}É@ۋ›>DŜ&› |`Wˆúŭ>ìííAżß$I"ŞŞú§UUŭ_Dô;Z ˜ü@ @/6ĝĝ‡ĝï&IòßdYĥE´ÛmXZZ‚vğ Qâ Oïzö$IŽÚdê} á´ @ĝ”£Û ĝˆÂ(—(Š Ş*Ĝß߇½½=(Ëâ8&"ú?ò<˙Ÿà/á¨ZħsĵpñŝÚÚZġĊ/~ñ—â8ŝ/²,kĊq ‹‹‹°ĵĵ I’Œ@cĜ½lĥ°Á_wŻ6m"°ƒ ÌIyû…öe— Ü>S°s6 ´Z-H’8çç90Ĉf“$ù˜âC8j–DÄр^p)€żşşÊÖÖÖä믿~ŻÙlŝzQ·–——aqq’$³l×­¸ıl{u[˜ë>/mÇ˙n ħ6ŝsÀëŜîËK¸•û>öúƒ(Šžèe0fšœ8çeĈq|IJy"rMF@ óħ8|ggkkkòóŸ˙üëišŝĵâӈKKK°°°ĝm@%Ir̳û佛#°AhÇ÷nòoĝ’nƒQ-ĉ0ŭ ĤgÀıùŒşö?ZnÇñħÜÁÂÂ( Ş*ȲŒ5›ÍûJİÇBˆ"RzD™ÏôĦ`A\Ȥßĉĉ&½öÚk˙qÇ?SEcvv–——ĦĠjÀdƒÙÈ|7~7ŠÀ–ùĉöşV_ßQçí§i'ö]·IÈmVŞĞ8Ĝ]n²2I@D‡ „ˆÓ4½”ê(vu> ÔD ‚  à2x˙żšĤéχıf³ KKK0333òŞnĴí&ŬÜĜŜNâĠ­3`ôyġq·Ms_·ß߸ŭşĉ3Ùj@J9:Œ÷·C¤i ËËË0aˆèZEŸB|‡ˆ*D̈H"âCF‚páĵ˙Ŭğwlnn–––޵ëÖ%ü’$6 ¸!OE¸Ä2)ù7))8.`ïKŝĠµ.ğÄa_6½Œ1ÈóŠ˘`I’,(`¸^8ĵ   ‚¸ööÛoOE˙n–eñÌÌ ÌÏÏCšĤ£Úı-ûí$ ´ïcgÛ}ߕà6LkÓ¨ûµL.Àöôv{°oĦÛ `ß×4 ÍÍÍÁÜܜ™+0—ĤéEñ."ĉWJZ„|@PÎûGkkkâŸĝÄ?%˘·`yyٛA·çôÙŜŜ–ŭ&Ó?İDçĈċO[Ĵ;|ž}\.€KvĞħM4&ݘe”e‰q79ç@Oç2( ½A\8˘è3eY23ĥˎ{}5ûpylok{NW Œ‹ïObÓ<‡/`‡6.¸íù„ĤSžfä†fŠnj5/–eù—à@)•àBÚŭŭ]8Şq·Z­c'ıŻcΗs}_Gŭ˙³÷IžÇ—pTJ#$ÓlˆÁ7•ĜĴ|8*6 ˜…ápY–aE7‰h–qğ†dàÙ _ÁÓɈâ8ŝI!DÇ14›Mh4OŒîò•úêš}Ü\€½8¨üÓ$ġΊ|ŬĉŻ­h|*Çí,´I¤ŬnC£Ñ0ŻÓŒ˘èӈ¸HDKD4GDM£¸N³éi° Î\ŝQošqŬ6Pì¸Ŝ {…ŸíŬŬÒß´Í=Ó&÷êdŝ¸ûşe<7)9nü8B£ ìùDív{Ô%¨”J’$ù²,˙q:A¸0†ˆ­f³yêxjµŽyF·žïë÷µġŽêq’şŝY„Ż<èë?°IÀîĉLÈ`څíùFAċyˆ8 mDœ#˘$Ñöh­ÔŻ›à–ú&…î„Ĥ |vğÚ-'3‹…Š˘DlÀ ´`–ˆÚAÄ@!p<ĈšŒħFŝ›ò 7ıçĉ|k|ñĥğÀ"2M> .!é>Ż›{½Ĥo‰Ż-ĜÍŭÜeˈFcD˘"âuh@ šB (€ a)"âNïħOxw™ÛTĴq’|Ú*Ài”ëñm@ożÛŬç†öŭÜ0À½l Ùlš×Œ˘(zEñžŽŭ›V,ÀóKŝéż "ÎÑhP‡½Ŝßö‚Ž?×[ğñuŬ& O òib~ß˙\àׅîcí0Àî`´‰Á~¤ÔòÛD”è<@°@ÏĠ¤>Ñgà†İu›5ŭĤÈtWğuŭşŽğ“€ù´žßġĜ˙ù*“rĥ²q~wQ‘'Œˆµ÷7GDD‰Î„@ €ç§1BÄö¸¸×=ÙÇĊ>àLòĜçĠ 8ME`ܖaömĝöç3%Ağ!ÈUKZ-ÄQö?1$NÁ@"G³ìĈĜsc}·ägƒÇçġÏ*ÓZûĵğĝÈ%w=@Ŭ¤"ß1ó=é…T¨kïϜ0,X €çŽIzğIĈxş:?İ´ħü´ ÄşRŸ{{ĈŸ |`vw rU)ÖíjDDˆˆÌJİŝ@ü7êöèĞë p:M–˙$Ó<çIÉĈŭ;ÀW•RzŸÓo oċê@ψ(rOv·„7n”ĥX€:.ñ6ÀÓüoڍCĈ=!C;Ŝ÷‘˘o™³bô3ĊÜf…[\ÀD€Ç[£ï§3pȧñĜgµj& _ÙÏÍŒñäŜñáöwhVžä½ \Ímòqó“vú­›ħ’Ŝü§‘ó>ûrÓT'ìûÛ‚]ÛÏċŽM;Ż•ŒÁ<àólî<½ş8yÜÉ?İÈ7Ÿ˙¤^ß}oî6à> ûŜ£­ÜR M‚fdÚ¸J°@Ŝû›ÙŜ¸Û*<ÌŸŸTž–@&M÷êvö›½(È­ĜáîD Àpŝ6¸9_Żżûż:R˜fġ_8§!³j#›÷çvùٞߝ)`.ۛŒêÇpa­"˘Ê/£?ÍĤuÍAbóê< B¨kvżßĝ4s;İpš¸FDĥcËùùÓLíġyöqğúœŒçôı½Żcwĵxm ´n‰²ĠIhÌVaÁ\DTÖy˙i’vä˙I‚Γ êâûq÷›ŞĜŜżnû0ŭ|aüw €‹˜TÂçŭÇĠɟÌ' Ĉ-éW]íè^÷ġGĜ€uáP°@Ŭ$"’Żżà£yŝ“6Ûx1ŝ´JaÚŬ‚\Rp׸µĝĜû¸ €<[‘Ŝ-Ĝ(†°cp €çüiĵĵ}⏋ûŬĈ q€ĥéçĴ÷˜¤|×íŜñk@>zĴ;Aɲ˙¸p9 }–Û#Àêĵŝ¸ä×´ ;Ğ5gmuïŻà>Ĉ%…“ C àı™ï¤×`cÏ‘Á¤çž—Ÿ´¤ŸĠmò$DžXéW—ñ%Ÿ5qv&ÀIĝ“làé&Ç)ƒ“ìpù‚qıw€Ŭhoĉî›èk” DàÒ)߂ŸşÀġuĞ ÏĴ§‰ï}!XÜĤBWêô5 ıӄ‚¸Tà÷­ò7öÛ7˙¤S€ŸEGàIŽuQ}|›¤pŝ]?ùFwû’[>€ûvú'§û´uô§ |Ŝ}!ĝF„ċÖçÁ‚x6Ljyzw鯛ċöĊñӖ˙βIfRíßÓO#Ç}Ä璝› ´sgŭù‚xĤòÜ" w€i˄gá•Oûu¤3İàz÷qáRŬ˙ÂD @—^L’äu™ŝ“Hàó˜<Íf >°ûJ’.¨}£ÂìÁŞÍA‚¸* ÎcN£ûˆ§üÓ&§½ï¤„}óꒀ&8m(,À…êNöq›‡œ´xŸ6„˜4pRNÀ]m×ŭmû>w˜ àÒ€ f÷dvË~uëĤñäu™ô³ö“6ûô½–;ȗtƒŒô8^ ´ż› àRÄ˙{ŭŒ“uzš<ÂiBÀ'‘˙îûsWùùâ~û½×M àR† ×0ni4ûœ÷–á!÷6÷³“yu=ÇÓY°@‚| dLÓäĤrMòìîmvµcÜ÷1nƒ:ïk àBƒßMòĠĊüùÓn êSuµvĜ'YSP¸;ù‰=È,ĥûü}³\ àÂäê€}’ċż'í%˜¤&)€iV!Ö)_ânÜgŸ4 5X €KĝIoJ†EBužö,ŝiŸ×ġüîh0ßĦÏì.ĥżƒ°)H €"àkì·9è¸vⳊó}äT7ÓoÒkMşïyĈÍ9p“ĤÁ\Ú\@ŬxĞşŽżiwš†NşŬwŬ´žşç¨Ë)8›yxGùvv;Ŭ)Á\ àû€ìĈµ&ëŸvçi”Ái[‹ëÈÁ–˙ä·÷×*ށ.çŻ+iM:8I[ï´2zšûĜħü¸Çş€ċÏu›ƒĝÖ„ .ĝ€êöŝóĴ'!×Î"gàóêf½ TwOżIùqë#|+'ƒ÷pİCŸt:Í<€iÀ<ÍPi…:yï&ö|¤zñqI½g½·A°@çN™vvc‹-iÇÉÛq5˙Is|·›fœIĉĥnèǤ­ĊlŻ^7.Í~óŝ„?°@—FĝqÍ?“büI¤1ӟäŭË9Œ›äĥOÚĊ}N_×`°@— üÓxóşíÄ|ry\<|šÊÀY}N·%Ĝ 9|›}ĝ–:‚ àp)C{ÇÜfżğ:ÀO³2<Ï#f×ìĉ?ܤĦ=%yܐ_(,À…˙¸™€ìk˙=‰¤?/ïï[Ü3I…¸‰ÀşéA9(„.=!Œ+iĠ­Ĵëœ6Ü80Ĥ.Ó?i. Rê‰x~ÜgĞÛT5ĜùZ(¸ž“<·SëéëÖŽˆŻ âcĴ/Pġ,ääĊϘ Š˘fEËQuc’ˆf•RŭIÒ~tVê5ôîÒàçŸ?ïÁn VJAQ0!Ë2Ȳ †!TUišžd.@R)•љ˜(ŠQ\JÙ€Î1+IàEy˙úÄKcsQ5cM)eŞO´qĦCmRË\„ĜŝY€ßöŝJ)¨Ş †!tğ]Ȳ ʲÎ9(Ž­ 8EB„güô{YDĎ>Jİ^ şAœÇIËc DL1žô=Mêä›Ô=7i?óíy€ßbÊzeYBžçï÷a0@Q „!Ĩì7né”ı’ô!;Í4£ó4zÁ˜|²Ğ“€Ï3š ÓJ苚ٷ/„ĊöeYBUU‡‹úF†]‚?¤M"˘zÑĝà2€‚gP†Ñà§iÀ1iÓËi@ú´ġ÷ó=@UUç9äyEQ›ŭIB‹¸Xwr8êUJ)zVç^ €ÉĈĥ··ßët:+x”şcL'ìòDEQ<;;Ûh6›x‚Œ;0.0nŽ˙yŸÈÏĝRJ¨Ş ²,ƒ˘(Ž%óžv†œ›×8ê? ápX(ŭ°Ŝ‚:²eDTQ‰ˆâER—ÒżEÑUĈĜ­(ŠVcˌħ4tÙâ8~íÚµûׯ__8iğİŒg˘)vò½ µ{7Ïó†!”e9ŠċÏ2GQ7˙ïÏ?Ġ¤”ívû;;;żKD…RŞ$˘Šˆ¤öò’ˆq"ê)ş€ŽÖ„¨@#¨q@D "ڑR*"(šk0h')%?){kïbPÖĊ1ĉu““ĝƒÁ`üg-ËÏYHT”h? ˘RŻ% ôe”Ê”RD´/è@„à‚€RŠ1ĈĠÑD‰Œˆv Ħ ‰(Ĉ#KġÒÎsÏœdö³Z8)tADRBQï÷Ħ,Ë'Ĥŝœ'ÈO²CrMĴŽ'¸/hï ÜQJ*ÚsM¤ÁžÀPJÙ#˘>d­ĵ”àÁ3œÁ0Ĉ …)clÔħk·Œ1vŭ4`‘ÀÔħì8pO3Kï<ï[’+ġâÛÀ?oïÎYäĤìŞ$T)ìK)ˆèħRê†ÖüGK€%"Vz=@ayĉ<ÖUiĥfRÊQĞĤ&ƒX)ĠÑqŜİà´Í@§ġìç ~;,‡OxügĤœĊšè§}¤=}ND]Ô!íQ_)ĊÁ™¤Ö@ .† 0+²”ġspJİbĊ=ÍF'=‘OKÏdö˘œ~żY–]¸YüÏâ}‘ÔIJ{ŝĦRj%ù”n*÷ü pHÀ\ĥB_@!˘€Ó·‹Žíœĉ„†{ÎÓë›ĦœĤ?8‚ž;Ÿ2ûâײÊ~„ˆJ•7„ż7Ë˙"}B€ħ?=ħċiZ:O:Ï'µÇ­tAx–€vçžİŸWrï´êäYĞdzЗ/,\d›F^ŸdII€o2û½^oç_ŻÖ (ì!àÍÉu'X])w}ÒşÓÂÛívaooŠ˘xaĵgÈèpİ<‹9aÏâĝä½Í˙˲ÖSӔ}÷yYHDx{ xIà"HLÓÍg}eYŽÊ1M(àĞZĵ „`“6á˚wxá  Ş*LÓôYĈÔwšdŬÔÓíva0€”r4tóiñL MÜŜ† NÖ'şħ@ÁÎ5n4t\“Žy,çG’?Žcïs6ûï†1>× ûĵhż´k3L dzD €`§÷*uŜŬw]7ß}ĵ9!‹˘€C(ËräġíÇL³ıè´²~Ŭf§³ ³@çY‹­¤”"2ÚÄà°4Mé,NiŝoOĈµš‘bFÚgYŬnŞŞòŽ?m;qŬ}íÏz4déÉ|ûùÎ#<8ísTŭ("½+ÇİxĈ1Ĉ”•R¨”BÎ9v"OòlӄĈóÛà·½ı ~[ ĝf L›Ô h,ä IDAT’RÛ¨Óġô†ÜÛÌîżvxĵHà4Ġ @2ĈcLĦxÁÀ?MÈ4›†¸5'½oUUét (ŠcÉ>7Îww!öy˙“¨“o°?ƒ­Ì^ĉŻÙÙה"} bBUì„à A}j’fŒ —Lá%&_ı'°{2›dä}Q£~~ïÛ^ܽŭ?×Óû”À¤l6ì@\0Ġ`îoԀ ŝIŻ]—‹8…G?-^Êó;ÀéäżÑË "¸ 7wR|´˜§Ş*H’äXĵïóôĉqĉŻ{?_U`R³MnĤßU-Ĉó›0ÀBŬżO>1çïı|EA;™EQԈxÉtÚħ²Ïƒùäûp8„n· œóQsO·7jÁ§ìí¸ëBŽ:°=ŭŜm0ĝĵµIšmb˜6÷aB ÷µÒ4DŒġ^ĉğa@zÂı(­Ŝ.g€I’“í> ĝtƒÁ:H)!ŽcŻÇ·o3ä`“ıŬ-ş{îM"ó×ΘÇĈq|,Ĉ7ßî{°“‚† ê6ŝ°–íëú3Ö)°Žĥñ}œpĤ87א@d< ĜГۈŭ~ŝ$IŽÛ\óŝö˙êÂ;8ɌGus <÷7[ŠÙ!M$u9„iòuğöÖ=üi~gĈEQDBˆ@ÁĤ’ˆQaî;n!’y~óZökœ”YàĵB€İbh_òÏ3Ïs8<<„<ÏĦÑhx{ĝŜ§êŞ÷Ÿ´ÛÛdƒ×ŽŬMœoÇòĥÔ·I—H´żÇşž‰şpàŒµS™”;Ġ VwbGQeYÂÁÁ H’äA¸Ŝú(ŠF`ws:O²È'˙}÷Ğ+ñïmż—ÇĊûÏz9p°@gzX!ìîîÂ`0¨]Íç–ŭÜÀ~×ûûˆ`\°.éf€k”€İp¸vo³óFĜïÁ<§ x_ ²s[˜àù{ĈX{Š|Ŝßiggz½Ŝħ¸ÙżOîוûÜŜ ĝr ÀDóĈ£›¸Ü^4d_ĥ×3LŞHÔ€ûJ)AñT›şžÔB0ĜI­Rv9çíŞŞÀœ<è£r_šĤO$ĵÜßWÇ÷UlğK…ëB€I|Úîġ·{˙m‰ow"Ú9“#JĜŻg‡lbÒğ›dƒ½“o°@Ïߤ”\)µ#\ĠŜjŝ~ż;;;£I>Ó.6à5%B[ ¸*ÁWB´‰`\ӍßÍcl‚²{ìVßşÁíĴ‹óëdżK@š|ݰ[P €‹˜äDÔŻŞ ŞŞ¸EQÀÎÎdY6ZÜöÉûĵż¸¤àz÷şŝ[I¸ù†şÀîòsu†ì÷oKó^Ĉß§xlŻo×˙„PTUEDÔCDaˆ€ˆµËpV8 0ӃŽÚjb˙ŠsQUpÎAJ9Êĝ>Ñ`Ż7—Ŭ×·•„o]@ŬšßÀ[˘ğŻc—öÜUŒu÷7á€ŭĵ†܆$ ĝú˙}Ä$„ÎıTJ ‘€ŽˆÜ àŜ½{"JMß &ĴDuĝ ž8APŻ>‹@g c3Fj+˒ʲµĝîîîóôvĵë˄û€àĥ,ô… .a¸%CWM¸a†/XW^ô%íŽqÒß'ġm‚äœCY–PE…ˆ}¨ˆ¨€$"*[Ĵ­­IĈĜĠf³yeÒïë(/³ÎCxħM€˜ĈChईĜßOĴçÍ=ñ]) )ċïVG{{{ĝñc¨ŞjüöIh'|áÀ¤™>àğ˙Ğ+9ÚŻċĉêFMj,rC ÷³K)}'ĉ6·AJ :İ*´ç/ ÔJ€ğŻùöÛo'Œħ•$If&žJQUU"*uXñR7°—üŒˆD$&ŭŜQA£ÑhĊqĵ˘Ġ@ÇÖ¤çü˙Ëó|ğ,KÈóÜdÀ&!Ä10ĝa\OĵÔîD ×SûĵzĦ¸ÀŻ#që \€Û w?·/$Èó²,#"jˆ˜kVúI’P’$)cĴE›†¤”9HJˆ£›éĦ€2À‹ÈJ}§(ŠŞŞ&Ş€f³ÙH’äşšÒ$I˜/ ¨Şj7Ïsâœ?ħĈ^1g !FÀàœHÁġ  Àqµ÷Iġy_ħŭuJ7Üçċm"po÷…ჁPJ½§ÁžQ…ˆq“\[[3Dœ2Ĉ“$™¸œ”’”RI&jxiKŒ/ô‹˘ĝ³ápXLşoE,Š˘9Dl#˘ R;ĉ4'!qÎùż ĵßï{l Ì!„8F>oY×S_· nÀ$bw}Zıo+ßguëŝvx`Ş UUA–eç9€Z tµUîŬğµZ-EÑ홙™{‹‹‹ÍirJİRço" Ôħ˘!–@—Ü€"ĉ:09€ÈüĈI’ĵÖjµnOÚÖK)eYVœóm xNDҔƒxqs†úRʉ½ž­V Ûíö•$I^Ġ3é""JˆÈġ0"EQüßEQˆ^Ż÷Äà üĥW41@rIÀ~_µà,lÒBßr_·ÈŝLĥÇ·/û’˘6ħI)͢)”ú@K˙t`@D… $€ Étpâ~^BÊó|PUĠC ŝ’ˆ¸RJê@½LŜ˙  ĉœŻ ‡‡UUMD‘ÎÜDÄŒħ&cĴuïŜ½È‘‰@UU˙SŻ×;888;`Ÿäĥ÷3`·½żi'6˙·IÀġ”çi“şù èíž}›Ììëögħ/ğq’$f÷cUĊ."ö´çïjùŸ@nTW’$p˙ŝŭÙVĞġC +SÄ˙ „ȉ(×àŻħ2BJùÒİ€—İ ȄkY–ŭÉp8œ¨Ò4šÍĉЈ¸€ˆMDl âcĴé ˆèŬápĝ•²,н½½Ñ„__ÍÛIY–£ş·9Š˘Ŭn‡uŜ³µÖçÁëïĈó:½O½˜.Hûŭ—e9’˙6ħrsĠ"ç?~ yžRÊ ( ûúŻiŞ ùĥZ-‰ˆ×gggï-..&“~SÎıŞŞêˆ„~~£ĝ4%â@/@( <äœóIwž™™aËËË·8^ĠŒ˘¨ íš0 ŞŞê_ ‡ï@QÇĉèÛ!€ ˆŠ˘8vĜ*ÁUîó?ÔġâOêÊó½–íá ĜD`_7ıŽş*€ÎıÀŝŝ>ôû}™eÙ6"î@ˆˆè@Ë˙ĦQ[÷îŬKMüßh4~¸Ùl^" ƒÁ`˜eÙ7@êD`)„¨¤”R÷H£ĵ˜‰À¸ŞŞµN§³>ÍcÓ4Ó4}għEQš$Ióí·ßNœj@GŬj߇˙KžçŬc=önÜö˘F¸ŜԐ€Q'µ _Iͧ\rp ·qÇ&è6qÙ×mÛĦ€Ğ\L¨1 `ssŠ˘8PJmêÄß"îjïßÓ$;R\Ĥĉ?;;ûÓW\Yž†8çı”rSW2"ÊŬà˖xYÖ˜D`ZUĠ˙Ùï÷ĴŞŞO¤iŠòÑÒÒÒ_ɲì·c­8Ž[DÔĉœ7àxGšİQ§RÊŻdYöñ½½½Ÿž››c³³³Oì¤ëfĠë²ôn†ßŬ×n·ÇĈşEĥÑívw¤”;Ú •½sçNġŝûïÓêêŞŬ&ŒZ^ĉ‰ŞŞ·ÛíQ>`Ü2Úqžyœl·Gxû†zÖċ |˙s{l™o+ÓġXäyîU’ŸF˜†ûûû°Ê²|·`6à!"n‘I– WWWYšĤÑïüÎï·ŜzëWWWW?Ól6'žÇûûûŭN§ó5ԞRj_/îp·JİĦRJmnnx À1TRÊ7Ż]ğv{bŒÄœ/gYöçJİd:vä~ĝ!ßÜܤĠĠUBDÔ£ÂRʇBˆ€™f³ išzËyĴş‰çŬ䛽š°ÔĦKnIÒНÉ7ŜŬ€<ÏsÓĤ;żñú÷ŻK\ÚĞ`}}†á<Òà߀GDd÷1ħĥĥ&ß|óM”RFwïŜ½sŭúġżíÚµċI›9ç°żż˙x8ŝħRŞĞ”zLDğRÊb(ĴˆHlnnR €Ŝ˙}zíµ×ŽVşĴ´şĵĵüI’à€(Šf´ xĴ” b…ˆêĠW_•>– 0ˆ IÔşâóˆ˜4›MˆĜÛÙç#hm/ê– ëŝúúìM2ş9 7)évàKTşà7áÍŝŝ>looS·ÛŬ#˘wà6`ˆÀíé  hss“nܸ7›ÍxvvöżşuëÖŭ™™™iĵŜétŝœsŝRê@)µÍ9?”Ru^@€ ’¨"bˆ˜J)żeeċʤYÇ,˲VY–İ”:$˘R/NQwîÜż÷{ż'µ Ñ|zEDƒŞŞŜ“RÍ9OfffF$à+ً†ÜĝÜ­"Ĝàukí>ï;ìdıl{ô˘(Žy{sğ-ûÍsıŻé[íh¤˙ŝŝ>lmmÁááaW)ġu8jùŬ€ "z„ˆ–ôÏMì˙ŝ}†ˆÍ8Ž_ğuëÖŻĴĴÌNòŝD{{{ğáëRÊ-ŭwu5(WJeDTŒñ˙˔t“Bñ^żß˙²,ßh4UÀġë×_ ŸBlцQ•BˆÖŭû÷‡½^o”ŬÁ†ˆ‰è÷‡á?Ağ‘RÎìcƒ$IFC5섘é‡7ƒD|u÷$IF; §i I’€ÙœÔŜ¤Ôž&YĦ@„ˆ•RJ â,,,̏[ô‚ˆh4˜âFžç›RÊ-8êS݈H !”B­­I" "BDDÔçĵKDŸ íıııQĈŜ7;żßŜ€Ìíĵ³é+ĠıFn™Ñxô,Ë Ë2¨ŞêX’ÏVĥb0ï£n鯛Ĵ<88€‡R–eğBˆwtĥNJù×5Ï/Œ˘šŸŸ'8Z‘ùŬwîÜù‡óóóé4[?~üxw8ŝıb]Jy „Ĝáœè™9/Ğ÷İÀ ˜>9"§//--½5)jµfƒœoQˆ$c,×%8ùáCé$q½hĞŞŞm"ş= –ĈħíÁÜ\@ĜŭöÖàŒÚšĵ r÷0òŜŭż^wŒLS’-ûŬ|‚oŜĦéòÛÜ܄ *ŠâC!Ä{ˆx¨Áŝˆˆ>Ôàß&˘Núċ@kkkòöíÛñWżúUy÷îŬğ×]ûgŻúêÇ Ž³Á` ÷÷÷ß)Šâ[RÊ}Îù.çü€s>PJeJİìeŭ_J¸˙>ÓĊÌû#T7Š˘/ÎÎÎÎMŠ'µĴ–e眎z¸RJ(èĉ͛j}}]Y$š„NîsÎÑĠ~żħÙlÛ Ï·7Ÿo­ <·înĵô8ïo„Ċ7^Ŝü5GŬ’fw•˘yŻĤĦßïĈĈìììTeY~“ˆ6`·‰è!"~ +ÛDthIX]]e³³³êΝ;Ğ333˙Ù믿ŝ7šÍ&›fßĈĈĈĉ`0ĝşbSħ_UĠçĵ+<Ôà/Mr1ÀË M B¨Ê²Ĵżh4&6”´Z­ˆs~,ËLJù!cĴRJġë׍ `:~• "„ßBìEñŬyžÇQA³Ùċ|½ù’žÛVl'mİn“A]h`'˲“ĈwODëġ`}}ĥĥĥäp8Ü­Şê]Ûïë2ßşċù·tĥż GÍU•˙½{÷˘$IĜ×ö5ŝ/}魕••_ş{÷îgĤ‰ûġ^Œŭ?RnI)÷ĞŞÚŻŞêPJıGDğħ^r‹^ÖU€Ò'0SJmH)?Ùjµî4›Í‰Ħ@šĤÇñ•˘(ŞŞúĈ‘ G³ëĊêê*󐀍BR·àGEµ!„xW!²,ğÚï÷ĤäÇñħ 6í²a]Ġ n,׸£è>™oʕĤ·ÛíÂöö6lmmQżß?,Ëòßè,˙:|¨|ÀĤŽ÷ ĝ… ŝVĞ%_{íµ•ċċċ_ğsçǚÍĉDeFD0 ÄǏ˙H7ŭì!v…;Bˆ”yMĵ˙KNVI4EUU}îÍÎÎ^&hµZQšĤ·²,‹9çh/ÎE˘›7o˘!‹|4Û²âŜL)ġˆsŝçœsÌó|×ë%yž£İë2¨Ë¸×vš—gpïc 5 èŸê÷ûŬ²,ż­”úK½ gŽ{Öñ!=җMĵß×2\zÀ<o½ġÖ?}ûöO,,,LĠŻ’ç9=~üĝÁ`‡şïħbKwŭ‘yÍàŭ_v*MUġ…|ÏüüüÜ4™ĉF£µZ­7²,cBˆGŒ13lR2Ĉèĉ͛э7”CRЍıj"H)?äœ[Ñ-Š˘Ŭív[ŭ~Ÿ™„\šĤÇúÜ%½uuĝiÀ­@‰ˆPUt:ĜŜŜ†íím:88¨´Ô˙–žàğ -ĉÙÔċ½´Ĝ€]DhŻ_šLż˙üü<%I€ĝïû˙î˙ĝ´²²Ò˜ĉ·Ôû2t~׿bs/„èéï8x˙@O¨Ò.ĉœż'\Žĝğfgg'Ž™ÖMBQ³ÙüDżßïH)÷5°cL0Ĉ¨7nàêê*³›…LXG E…Î µ*èJ)7”ïrÎ?,Ë2˲,íġzÍN§ƒÁhK.76öġÔIĉşü‚!<Ïáààĥ··áñÇ´żż_öûŭƒ˘(ŜBĵgúö-˙HgöM†S÷ôwt‰ÏÔ÷GÊȀŽ:SÙüüüç͟™üşÉ(ÛÛÛû#ÎùRÊ=)ċ–‘ŝœóŽ~]ĵ˙q {ês*T΋³,û­­­Ğ­Vë'ĉçç'’$c –––Ò×^{íoÁÍ<Ïż˘OL–$IEQU…¸wï^dNÀ{÷î|T*4[ áhÎ!cl_݉ßäœKħˌħĠ8ŽïŜBÄfšĤĜjµ MShµZ$‰wż@sınĥŸRÊË eY‚RJ !úş êÎ QéÛġħŻu ·†yTkkk•ŭŬ9àŸŸŸŸ˙Ÿüä'˙“ıııݝSŻ×ß.ŠâÏġjż]ÔîüëÂQkĥ(Ìvá+5Ċú˜aŒµ8ŝĞ‹‹‹ï7Ŝĝ‚)ÍMcN‡Á˙û`0ĝ—Jİ÷u™°[UUFDB!8çÊ"ÈQd)¤DÔDÄ6ÌÀ,,À"".êËsp4žlĉâ8ŝxE€9ĈXEêuhú ’$A=„ƒœ} H'‰ˆ*)ċŽÎ˜Ĵ0ÔÇŽJvàfjoğDÔÑä`÷ò†yĜÀ7S}[­!âk‹‹‹żôİO}êoN“36 ÔĈĈĈ_ôz½ş×SJùˆsĊ9?(˲/ĝÈ'X ›ŽşġšŒħ6ÍĤiúÙċċċŸğ{÷î÷›É;ÓXżß—=Zët:ż!„ĝcŬ6ÜUJ 9çB´Z-i+‡ "8ZŻ4dmDœ#˘6Ì!â,ÌÑĴÜ€45y¤šúoEÑ"ĈRJ3cÏ$%•GLBGeUp4<3× h)Ŭ× µC½ÊÎkŒJ{îçL’„EQÄÒ4•q~eeċ~êSŸúܤnL7é÷èÑ£oġûŭkdż”r]JıİK])ċP)UĜÉĈpĈ¨#£RĈX˘(úŝk×ŭÂŬğwżë$'gUU´ħħħħ³³ó›eY~Eé*ú8FӉm2¸˙>ëġzEQBDİ^ğÔ¤TJÍ"â Ìhrhh˜!˘[üİ>ŭùl²SÖ!uŒlĵ½ù;Ôò9×d0DÄLé6˙Ğl™ŻŸ_ú€p4ÏżĠjčFoŬ¸qżsçέ“ü^BĝàƒŜï÷û úì!é’êNY–½ŞŞFÒ??ÀI”@Ş•ÀcìJEß}ŭúġ_ĵ}ûöë'QJ)ĜÙÙlnnŝëápĝϔR=TˆşL•ċÁUÖû<Ï£(Š˜"%˘H)Ġ ˘Dƒ>€"6´ZhèÛRDLˆ¨ˆħ.wúXLÀÑüˆ\Í4×óKûÀs #i]'³MĴ_UU’Ĥ)!âíùùù_ĝĜÇ>ö7Ż^½Ú:ÉïÄ9‡‡>ìġzż/„x(ܗRë,;œóž–ŝ™ˆ‚˜Dv>`ŻÄqüɛ7oŝ£ĠĠĠWN’0!ÁúúúŸüş”ò/ˆhˆúzv`a‘€—l2Èó|”3RĤiB0ž>BÄD@¤I Ö÷cNÁlİàh–Ħ²€Íá¨:Áu’r´)§ۃġ×+ŻŻ€JÓôÇ^½únßŭɓÄûĈóĝá‡hoé|ĊĤ”rÓLú)Ë2BäÁóxÚ|@ MD\bŒ-'Iò™ëׯ˙—Żúê­ICD|'îîînkkë·²,û—BˆGDÔGā&‚Ê–ä>)C JİHJ‰&`ç4íÛ]“.8Ç÷›&žvbŭˆ167;;ûKŻúêO_½zµ=MkŻmeYÒúúún·û˙èŞÄŽ”r[wqnK)ĞŞÊ8煎ûCÌàİs&X@Äċ8Ž?}ċʕŸğuëÖwM3ŽÚ6"‚<ÏikkëŬŬŬZUĠWuÖÜUĉ€qDà‚Éx€~¤ÉšËSƒŜ\n6›qšĤÄ[j4˙á7~á•W^ı~RŻ0Ġĉĉĉwz½ŜהR‡ü[ü;JİÎù ŞŞLoñ¤ €3%XdŒ½ı´´ô³·nŬúì4}>" r}}ŭO;Î?ŻŞêà(³>´ˆ r’t0-!ÔrZ;)pì×0Ÿ1ÇqŒišŝ;ׯ_˙ċW^yċµvğ=Ġ:~÷ğêt:Ġööö7³,ûcTWJùX{üM]ó?àœ„ç\8Oh3Ĉ–ñêÌÌÌOŬĵyó§nܸ1wÚçït:|ssóOşŬîorÎ˙Tç†PèíĞ„“#P§!‚ó0;˘ˆ!"CDÇñ\’$_\ZZúğ·nŬúìÂÂÂİ:N”°··7ÜŬŬŭ“˘(ŝL)Ġ×C=·µ÷߅£!+YUUċQ~Ğŝ@çEħ–q>I’ĵvíÚßıuëÖĞ'ݸ6 Ôĉĉĉ{Nç·ŞŞú!Ä{pTcG§V§ğĵıÇqĴŸ&IòÉf³ùï-//˙ÔêêêŬÙÙÙSo=WmooouğŬ5Îù#TGËŝÇD1pġe VIDAT´£”Ú%˘CÎyĤ”*ÜĞ`Î“šŒħ9½srEo,//˙W_}ġûÛívt’~Wî–eI{{{ŭŭŭßËóüĞœóßBlê­ħŞiÈÀĥÓƒ/l°½ĵN2Dl&I²šĤ鏴Ûí]^^ŝëׯ/NÚrm’Tğğğï‡ohoßQJ=VJm+vLweÀ’~ž% Œš…q™1ĥÚjµŝŭ7nüĝµkזžF ġôû}ħ···Ŝï÷˙´(Š[–ċoë\Aİ•×À% ë!Ïs8ÚRÛJÖ& “$!TÄcz`*CDE‘dŒ}—Ŝ•÷sóóó÷^yċ•W[­Ö‰{×8ç°ğğÛÙÛÛûçü‘”²Ğ”Ú—Rîю”rO)µGD})eÀày‘€D\ÉÁ•8Žï,..ŝ§7oŜüôüüü™,ĥRJAŻ×‡‡‡;EQl‡ß/Šâ·•RïéùvĤĦH(d2PBtbl4‘)1F&–gŒaEÈ[JÓô­Vë'šÍĉ÷ÌÍͽ²²²Ün·Ïdwi)%ôz=ğğûÁ`‡ĝüğJİÔ>èNJ!DÎ9Ż\0y,EQ´ó­V믭ĴĴüĝ7^iµZgö=+ (  ı˘ê÷û›Y–ŭçüÛz󋞔òCÔC"Ê=j@éUŠö ˆˆ‹ŒħÛQŬˆ˘h1Ž+iš~÷ÜÜÜ÷5›Íù4M‹‹‹3'm‚šdY–Ñîîîn·Ûŭ#íġ{Jİ ü]"ÚĠ’żŻ”9ü#จ!Á".#âbÇoÌÌÌ|ùêĠĞ_¸~ŭúÂI_Ĥ%!UUEJ)%¤²,Ğ<Ïğz^vädeĦ7ÚÏFQ4CD"ŽĊF£ħÔl6çFŽ–bšĤĝ´ñü¸$ßŝŝ~·ÓéĵSĊ·tmżCDşżRʞ^xTpÎyHö¸¨$`7 ÍÁѲÜEĈĜ•8ŽïÎÌÌ|ñʕ+ŸżqĈÂi“„§!ßĜnÄ ó4ž… !`gg§ÛétŜ-Šâ;ì}TGÇ÷Úówt_ÄtƒTžçÀà2„)cĴADóŒħE-Ż—8=33ó7nÜĝâòòòÌ4{Û½FDÀ9§ŬŬŬÎááá7ġĴŝŽRŞOD=Żï@)µ§WMÚÀ‡1 Ĥ‚¸h$`Ё”1ÖÒaÁ˘>c+ívûŻ­ĴĴ|~qqqİÙl²‘ „çı<<<<ìt:È9ßVJ ġl„žRêZîħ§KŻn¸tD`ASAôş‚%Dœi4ŸŸŸ˙‘[³³³Í4Mñb”AZ:d˜1„À›‹ĝÎÜÜÜgĈ•………ÙÙÙä<’ˆRJè÷ûĵ×ëuó<ß)Šâ;BˆT½|ÁžÑ@gî3­ĉ>ÚÛsÌf‹™‚¸¨D¤š R=o†1ÖÔC? ´4Ì.//˙í›7o~òĴÚr]Żżµµµ}xxĝ˙J)t½Ż³ĝ}"20D U@‰ˆ…'›á–4żì6yfĝÊ!G+ŝ K$Jİ”ˆšŒħÄL˙EÄY)e,„èÛŭçiM)%•RM{RÊ}]³ï@_)UXCC+íé+"²úàí›D÷ïß ,0”ÉÄRʘ1fĤŭĥ5@+:? "R:ĦgvÜÙփ8LéÎ^žü„—Ŝ>@°S(­ ܅<†bĈXĦZ§Ò$3PJu´÷7;í>QşsŜo~ €`g&Ië|•ŜŽüüD.‚ˆ*(µäÏôŝ†Ĝ{F„÷ïß·cëgA$qD,¤”ÒxŝúËm,|—ÒĈŽ;+àk“#íÙyżv°@Áž³!âè X°`‚  X°`‚  X°`‚  X°`‚  X°`‚  X°`ÊÂjÀKbžQ1-È9oGËY0ĈX¤ç=ÄÂrà@ÁÎĝÇ6g·"/BÄ=§° œ‘_÷ïßg;{§zTĝ Œħ&@E ŒħóZ²‡ŒħXo^rCk"â"nI);p|*$ Ĝڃԏŝè~ÏÊÊÊŻŜ}ûsyž—ĝÑ]œ™™I›Íĉı„q7^Y\\ü[J)•ĤiÜívğ[[[˙b0ü"6ô„9‚½1Ĉ–ĈĠıııhnnnĉ.´Z-lµZ‰};ç|6MӏEQôŠRjÀÛWJ™Ñ`U Ktn…ŻàRÄŝ1\ =cÈ›cŒŬbŒ­ âcĴÏ'ĉĵ÷`‚=Í\ĴM\1ÖbŒ-1Ĉĉàh£4œO‚ƒ "†h6c c)clNïT”QΧ@ÁÎŬ^ĵÁ|ˆˆ"ĤÀG› ,X°@ÁÎÌ蜷ŝ9ċ[’z³Çw v‰,”/Áo$|˙ààà}çw~XE ĈXC'ŸY~€ˆˆ1sÎ;yžżĞw.ô†!‚ˆ vö¸,ËŻH)7tĉ}™1ÖFÄĤŽĊÙ³"TOñĦRŞ£w Î!Ô˙/…].°ézz G­ÀmD\BÄ+Œħ+ˆ8g’pZ < Sš ԐˆşJİ]"ÚÓDP@ġàÁ~½ ‚ íucŒ€RħeÊoÏ2^žQ C"ê+†üAv>$P¨£-9clHD)ĊŒ1|Ö9B”DD•^àn,„ÁÎ0 01ı[—Ÿu%ÇŜĥ|´Ĝ(•°0@°ó#pÈày™ò]àìْÁs·ú`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°`Á‚ ,X°ó´˙½ëŽ. §£IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_ActionReplay_32x32.png0000755000000000000000000000775612467662066022031 0ustar rootroot‰PNG  IHDR szzô CiCCPICC profilexڝSwX“÷>ß÷eVBĜħ—l"#ĴÈY˘’a„@Ċ…ˆ VœHUĂĠ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×ûĵçœçüÎyÏ€&‘ĉ˘j9R…<:ĜOHÄɽ€Hà ĉËÂgĊyx~t°?üŻopĠ.$Çá˙ƒşP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"Ş ìôI>Ĝİ“ÜĜ˘İ™(G$@ğ`UR,À Ĵ@".À€Yĥ2G€½vŽX@`€™B,Ì 8CÍ L 0Òżàİ_p…¸HÀ˕͗KÒ3¸•wòàâ!âÂlħBa)f ä"œ—›#HçLÎ ùÑÁŝ8?çĉäáĉfçlïôĊ˘ŝko">!ñßŝĵŒNÏïÚ_ċċÖpǰużkİ[ÚVhßù]3Û  Z zù‹y8ü@žĦPÈ< í%bĦ½0‹>˙3áoà‹~öü@ŝÛzqš@™­À£ƒŭqanvRŽçËB1n÷ç#ŝDžŭŽ)Ñâ4ħ\,ŠñX‰¸P"MÇyıR‘D!ɕâé2ñ–ŭ “w Ĵ†OÀNĥµËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“żù@+͗¤ĵè\¨”LĈD *°A ÁĴÀœÁĵÀaD@ $À<Bä€ Ħ–ATÀ:Ĝµ° šá´Á18 çà\ëp`žÂĵ† AÈa!:ˆbŽĜ"ΙŽ"aH4’€¤ éˆQ"ĊÈr¤İBj‘]H#ò-r9\@úÛÈ 2ŠüŠĵG1”²QÔu@ı¨ŠĈ sÑt4]€–˘kÑ´=€ĥ˘§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcċX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´şW ƒ„1Â'"“¨O´%zùÄxb:ħXFĴ&î!!ž%^'_“H$ɒäN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉŜä²€Ĵ —‘·O’ûÉä·:ĊˆâL ˘$R¤”J5e?ċŸ2B™ ŞQÍݞÔވ:ŸZIm vP/S‡İ4uš%͛Cˤ-£Ġšigi÷h/étş ŬƒE——Òkèéçéƒôw † ƒÇHb(k{§·/™LĤӗ™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çŞTUsU?ĠyŞ TĞUĞ^V}ĤFU³Pİ ÔĞĠİUğİ6ÎRwRPÏQ_£_ŭ‚úc ²†…F †H£Tc·Ĉ!Ĉ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsŞfĴf‘fĉqÍĈħà9ٜJÎ!Î Î{--?-ħÖj­f­~­7ÚzÚÚbírííëÚïup@,ġ:m:÷u ş6şQş…şÛuÏê>Ócëyé ġÊġéŬÑGġmô£ġêïÖïÑ7046l18c̐cèk˜i¸Ñ„á¨Ëhş‘Äh£ÑI£'¸&î‡g5x>fĴobĴ4ŜeÜkVyVġV×ĴIÖ\ë,ëmÖWlPW› ›:›Ëĥ¨­›­Äv›mßâ)Ò)ġSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlpĵë¤á4İÄİéWggĦsó5ĤKË—v—Sm§Š§nŸz˕ċîşÒµÓġ£›ğ›Ü­ÙmÔŬÌ=Ċ}ĞûM.›É]=ïAô÷Xâq̝§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Ĉ>ŸzŸ‡Ĥ"ß=#~Ö~™~üžû;úËŭĝżáyòñN`Áċ½³k™5ğ/ >B Yr“oÀòùc3Üg,šÑʝZú0Ì&LÖކÏß~oĤùLéÌĥˆàGlˆ¸i™ù})*2Ş.êQ´Stqt÷,ÖĴäYûg½ŽñİŒı;ÛjĥrvgĴjlRlc웸€¸Ş¸x‡ĝEñ—t$ í‰äÄĜÄ=‰sçlš3œäšT–tcċܢıĉéÎ˞wç|ŝü/÷„óû€9% pHYs  šœQIDATXí—ilTUÇç͛ÎtèÑŞÔ%bĦR–´.UŒˆĤî •(ŠŸ$h’ˆKÔ(Ĉĸàmc˘˜€VQ˘@AQ"‹ .)URkA(ƒ•Zfĉŭŭ÷êXĉuŞ_ġ$7÷ŬûÎı˙˙ğçžsσ˙şĜ ġîNäÏmîÀfpġÇ'€ÀË˙„ààˆ*'SɈ Ĉ~ğŸÍÍÙïK‹‡hĝâlŭNàĴÁ€×˜™MŻ­ġÚöš¤ċËçŸ×ÂŞ*3Yï˘3}›' úğïôIêó_ĠíRÖß5vò/‹Hq>`ó7ߨĤı٘;·o20êˆFUžJë\|ÇĠ}ì=Ö\Ä+Û áŠˆ0˘EÜ ĥ×ĉp85ŝ8PsçÒZÒbZ´(§RİçY9^ïV@_|şŽ…;ηMm˘¸\ƒˆ)(3Ñ~kŬžƒ{‹€ßv ­ŬğĦ˘˘ïԅâsAûÀ&UVhñê{x­(Œ‚ršġBî¸ŬrBÖ=ĤşZÔ×ȍW½Ò–5AÜÍ  ‰H!$FM0>ŒĠ—]f|Á BeœßÇË'ӓËÜ^ ÏĴ0@ĦÖmĜ0èXŭÈï×|ĵ‰XAĝ׉Ar÷‡İ0[Şö˘"Êğşòža £`‰‚ˆĈ5¤-ÓM( 3#Ŭ}Œ] K6…íÀCuui X5à9àĝ‰ŒŭÒ|ı‰p·_^°{#, ÷ŝ£w‚fûníßVƒĉŭĊπ%ÇÜé:ħ‘zA•)e†9†1" c_BuîXiÀÏÀÜ|îm 2×; $è0è ΆìĴVŬ/İà”³5öŝMx:İŠGż×¨žò0';%ÉXĵ¤³½~}v[ëgÀUŭô²y=ÍzX êfÔİlD™µĥĥÒ´½)Ĝâŝ è À³Àg‰D1µu×âşĥaŭzĜ˙C`óµzxË_$Y0^ùâJoŸöİ^ġšİ™š£9ş|ċ*ˆ_ó¸o³ PIIİ·ñ“fOÚ-{P:²@êy@ÏĜÇ+ à êUĵ*xœà‚™Š¤ğŞğĞğĞĞĞê {ĝĤßßŜğö9uŞ:!QCrV?ġÔpÎÙgŸÓg½{­w­ġ.`hCû·_éÍŝ7šœ{îSĉĉ>òŜ_ô‡ïȆ6´mŻyÙóü}#xĉLÛ_Çg<\ûÜ'ï8ĝKÇ^7™Ħ mhÜ>ĞïŸp`Ç\ŬówŒ7?51Òì6êĠhjŞq÷HŬûx=ĵ÷Œü^8™Ħ mh÷Ï^˙Ŭ/ôwÖÉ3'jäcs3wMŽÔ˘zĜӓĥÙ¨˜‘zMWîžñ>^¸öàŽàò~ġwÌŭÙß%†ïŜ†6´Mö?ßŝF˙ŠıÉıñÏop|jçˆßݘñ‘Şo6l%ôíĝĜˆ­úžmÖ|³cĵMTéŬu†Ÿ¨àû'ŭkżíêŭŭoF3˙ F†oÁîög|—ĝàû?¸çĥÛRsœ˜ıHšYPXkÁ<q7‚µŒ1 ûî1­5´IĦ”a „H­`­ç°§k4'Ö,1i´¨´žŒgÒ,^uĠ—â%‹Ż{Ó;‡ÑÌ\†öH°_ŭġ_ô˙×/üĞkĉ|.Ġ|ĥ›Ÿ…>Q°VƒhÀ…PxB€1#Ò4†çÄq B,Ê(H”µcJ)Xx^”pk­M(ċ‹#ÑZĞdÇ÷lÎżĝş—.ĵċí‚Ì\†öj?ĝÊgû˙磟:Üġ*7QJBk-1Ĉ PJAŠß9ç—¤i )%Œ1 Äñ/ÖZXk‹ß)Ò¸>!LöŬĉÇ´F` µf‘)9Ïmr|çTsŝ;^Ĵ…Ÿ˙­Af.CûFħßĵù-ŝû~ó½3_ğ{yVġµ?B ÀS|m1ĤÏó\äb ´Öˆ¸20ċ7†d€‚\Ĵ5Ċù.@-@-,‡MĴŒelçǧ'½Ċ§>ŭİñK^ú²ßñò7İá˙Ŝ\†ö0µïğŝùŝÇ?ö+IŽUÂÑı4ħ³-Ó ò(£ĝfÀ@ïûPJı´ĈÚ,š!¸äż[k `*G/Ö0€˜ÒYä?g Ä((e€!€8Ĵ…J”ŒAl˘…ÀñĞ<8˙š×|ßÂĞż˙§‡ÑÌ\†öpħŬü6˙·ß˙™ğïY˜žwL)q8MY b‚n‘Δ#—<B8âVğ˘c Œħâ1epɏQ%7ÎB÷ !Ä*€ M!µû;ċ`°€FžpA£n{žżòŠƒó/ğî… ?òS7Af.CûŻ´7\­˙÷˙÷‡O/Çê#|NŸĠZ”‡H%¨Ä= °ùgi!œsW5zR ü÷òß(P°VoÜVD1.EbÄÀhKġJ`)%Ê*Ĝ6gÖK|hmžâöÍ?ëW/ĵġĝA&³aŸËŝSì#żó~jŝŽŭŸŝìż\™(}cµQ9Ş êFİ ŒqŽD'HÓ.¤”EÚ8"7˙bŒÑIž)Ĥ)Ò4íáZr`ê5 € oŬġ•Xâŝ.8ƒVĈP(İ`Œ…!Ġ*aš¤2âJÙQ?hÎ0=}ĤsäÖ[ïZşl·!Żzéó;·|éžG}żÌ0rÚ¸½ñ5/ñ?ù‰<ĵĵ|ñ˜ ĵ9ß g£( ÒT"ĴT`­EwÁ9ċbS*SŽB8÷zÀ£|[™ĝ-?.Z( Ĝ81Àµ=$ݵŒ C¤áıÛbmPŻWÀ™™hHİĦ$ĴÇĵ¤Rİ,2œ™oµìñzÌ_sÍ5 ż÷'ŸJ†à2´Ħ=ÄöÁ›ÖßoüÚÌ]w­Ì…zŒ‹Êá‚4M §”iDZ+€TzJÈ,k†Û:KÉíRhÖê—£ŬíÔö¤V‚ XkĦeŠÀc L!MRÄáûĈ*H-AİĦĈ¸Pˆžĝ‚,èy˜‹ßrĠeñ ŻzĊâË^ûóÉ\†6´i?ú½/ö˙#= FŽqż2×êF³~P Œ2›œ œó‘›9ğŬHƒ,Ŭl”ÚtÌ^r 9/*RÖZhí‡@ô<.çkr+§Yċó/îc 8§–sšĞI.ÈbŻT*óŻżŝê…ù™Gǰä\†öÛ·}‚˙é[ŝŭĜD&½ĞíN`À(–\JÙAóżċ•U\6XÂíİ ĞÍĤTŞ œóžtİ'e"2í`úϵŸ)GMÀÀàï%Š!e’XèEBÈĵZI?ŝ‰3óÏ~î3~ŝĝ<˘AfHèí!³òûŭ 'öŬy÷‰+ıÏn^xd½“„Z[B(GIPЁK?äQ†ó’Sğí9PÀRXKP0Ô” ´8ÊàâÒ&Ö6eèĥÊ –Ì%ĈXhcˆ’š(e¸15ÚÎx^óèÊZçÈ?}ú K“”ĵüÏë|éĥùG$ù;Œ\†ö í/÷=ü]7ßĵ÷K_žŸ³o›³³íNÊ µ…”Ü Dö€HıĴÜĜ TĴÙ!Ê·˙ÈËV‰ —ê‚Ë)ƒH~ÎĵMÉSĤĵĤ ˆŭQ gĦ{œuš2@)Àx6~ ”µ cbÑl^§­ŻŸñŒĞâ½ĝ‹×żĉmÉ\†64ݽî9ŝ'>ġ÷‡ ñŽÊÌU£³/úÒhR k0°H¤! ”3X÷peG”öí—ûıô·ŭç\‰µ²‡s)ƒ\.ùcWŭ½7ùŭrâà=dsŜ —?Nħ FYKÁ’"GšX¤‹”áĝ“ŻÜ?˙â½|áġoüċd.C{TÚ/½ġŝ‡~çC3g—Vç‚Jí˜Ò8l, k-|߇!q3@İÔ Doˉ”#‚‰wlViNRK ÄĤ0RY£,8üÄ÷*‹ëí‹óġ:ŽÏÜ=˙ìç½1f[pħšçÊ@gġö/?yĵ ĜNg˙ħ‹˙mĥyO0 Šˆ2'Kĵ’&L8Iuܚ§ÀñƒsóÏyîó~î=” Áeh_·ŭĝëó˙üŻ>yxùÂú1B0WoÖg ¨ŻŒ%$Kqô–á~YceëNĜíÏáë—ŝÇoWĈ$}ÙĴ”l @d[pÖl:~™;ÑR]œs@ċÙAŬËù}T*7nùPĞUĦµ†”²gȲĜï¤ÀH+¨J|ŽĊTvçÁñ}&çŻüĤ§,|àCO†à2´d?ùƒ×ùû~8İ4oŞĠj‡aljµˆ”İ+“flšÉLö_‹ĠJoyĠtáıŜ6­ÙĝŭƒË ĥ_ú żyo¸ :ïü{9í”ÖäàR&…ËчQzÛ&AÊÙ&ÎĤ|ywnżÖLqĤWèŞG˜0F‹9P•oW– Na³‰ÒÑ˘Té<8>Ċ0˙üo}îÂŻŭá'’!¸ í’ößnxĦ˙éúÔaÎéM÷G!”  <σJSh™8Yez>Ôċ.\÷!eÛ4¸Ħg5ê èf£Él0¸b:~*ÔßÄĥĠ•|Ñí9Z"Œ‹%fËtŒ”qĥŠ\ĥ—‚T.ĊAĥ}O´V›^[ùöDGŭ*Ĵá0šÂó<Ğd7ħ:YĴÛt~uǧ&ĝⳟóÜĝYÏ}ŜÉëàÇżRö°ŭ·÷ĵíżûŭWyxîcn Ğ#GáR)Ĵ5f˜-„· Ò—h„#Ĝ2íÚÊùËÏËviĉ&1›{ˆqc[5ö‘DV@GšJXT‚²‘êôß½gÏèĝĝÈd%ôgˆ58žˏ˙èҟ˙ġ'ÀĦû=²-‰SĉĠz”ZÇÀİ÷BËĉöáIOĵ3;wÀZ‹$IÀ¸(ru­5’$A’$ĊÄ4M·t„Üò͇ƒrŝŝı›KÙVŽĥĠpä ’÷R`¸£ouN[éçöß>èç­$4µÖ›Ŝ³²,CNҖ9ĤA 3H’³|ߪ¨A'€J(306Aн ‰Ŭğ'°óÀ^ìĜ3C$ Yo·Ïó3°c­µîÌŭìñĦû=²mçTsĈ“ż!ş5g¨˜N H§è$Ħïaj|{wMaee'Nœ@@ÜmCˆRz9¤”àžV —H҂Lóvü<˘èM‡ú÷:çš,ÛĊôlŬ2Ŭ˘PFöYXwŸô €°ùr4ô[~.–ù4´”XfoY)Ùö “ÓŒHÖ8ĞrÔÇ)ÛR̊I56$)ò×Lᢸèô% ʽZğ÷ìÁÌÌ b!^oC ŠJP…ÔĞġôLŞ".CëħÑÑÑ ŒħORJż§^­O'i*IC{µJÍfµJZ g—ħŜê Š"„€ĥqoJİɌä½dƒĝe„m…XğuKÚġaŭkEq#˙‘Vî`H|“ÁïMnŭƒ–ŭÇa$›ù"Féb£¤ĥRJÔêcèt:IŠJ%ÄÄĜĈĈFPŻ×ĦB*c•>ñ uÏó˘.%/:—G!çrìµßt¨ĠYkéUÁ ²|Û îta­…L$Œ”ZcrrĠjëkmpO@)ƒó.dÍ])9‡É#ƒòêU;ĜQË}(ƒgÁÜëíW—Û.Ġ*ÚŭI‰.•ZċÊ ×:èñÓKğİs7›d ɤ)Ĵ(ċ Ä"êtÀA}t“£˜˜˜@µ•Ĥ à{&%àœ'ínkÑ$CpÚ&;ŝ<Ï­Âk.á²ŭ{QŻ×Q­ú2u]¸ĈÀZ€sKFMÔ ¤ĥèt:…€L( Ĉœĵ4ĈÀdó2B¨tFĊŝċRN˙P€Ë P”ġ§ ċóoâk.TÛŬN…½DT& JÎ}p–‘ŬJÂhc%ĈĈĈ0==Ñ‘†Ó,V ‚1TjUXi Ó”htşñbğŸ\‚Ë6‡âŒc=TşŒĠċeìßżœ˘Rİ€SK2"Ö¤çLP¨†!&ÇÇà Î=\\[-[˜62ñéòÜÏ t ü}ëßK}$ÍŭŽ,úAÜg³ÚŬCpƒŽ[ž v›Ĉí%+€ )eñ3!€N%ŒqúĈ³ğĤQŻ×Ñh4z~–6Œğ˙KĞ%(ñÁƒàZív²sçÎĊ×ŭÈ[â!¸ m“ŒŒÀË0„"’+ëëP”L1::Šħ‘|ß#TıŠ’Ĉ>2‚÷QŻ×1ÖÇòò2VVV 3AnJXQé ÷?…(_ÑïçĝÀċVM[÷§C$-ş?Àr) ÚŞÊ5è<ĥ’Ĝê6İb0êRTcèÈÜ.ZİÁ÷|ßwkMŒÊ†-7fЧPJĦ½ŜI:QgñÉßü”ĝğ!ç2´ÍĈCŞ€~è!ÑçWW°ĵĵ ˙ô)LLL`ߞ=¨VCP)!(C”ş4(o%Ow5lŽ%ê8+M+£Kƒ{ƒË°ŭDäŭèŜÂ5/áÜtË!ĈAœĊšòhú–7ámußAR ½„îŭ+‡oÙc5e ĀjĈGǰs×4ĈÇÇwÚ¨!*ĠZkD ecàœ‚$i’.F­(ĦÌ.6›Í_Üż˙Â×óı‚Ë£ÀêÍ„[ˑ$)‚ŞA³ÑD-IéD8uĉ<¤V¨ĠjĦÓÓӘÓ-É7rN‘D1Μ9SlQĴpTm×.ƒI/˜ûŜ?TÑK˙ħ{Ş]ĈÊS×5˙³]ÔQŒ0\"òÄ •Á)]Ż’Ò ÍZûöížÙYbħĥĥfd#2IE‘‹V*„“HĥoIcŭ‹ÍĉÈâYĵc÷ĜâĞ÷§’!¸ m • âĜ‚3e¸e0‰Fԉá RÚ`}½…S+ëĝڙ‹ÇÔÔĴħˆ+gĤJA C,b£œ8£ŭŠ‹bÒlùzŸÖȆĈ-ÏHàÁNÂȁ¨çdÛ;šq.ZD6Ż@9·-Â˙Ž ¸Ù˘r¤E)-Ë+V’ÇÌĤéĈkĠŞ<˜I\ŸIOhc7Ç_ÙÌVd5p5 H’'VĞ(P­T% ßx³Žé‰qŒÔaÒ.ĴŒÁU‚úĜ­%j:RİE¨¨%ü–díÜÛ&Ĥ§où­?ĝë˙ûŻÔçn.ĞĠj`H²Ğržîl¤z$J´Ú¤i )§ĵƒjµ Ĉ:q·’*#ï0­•ÂIúg“Àóĵ˘¸żÛ4Ÿ½ıAşĠĠ˙ŝĤ—Š–Êju›" ğY–sğ.àÍŒŭşÏ ŒÒ¨!„ǐt# ÔkuÄqŒ(ê˘ÑhbllÓShV+ VĦÓéÀN€nDzI"áyâ$ÂÄäx²şşzKšĤo›Ù÷ÙßĝàŸĈĊçn.€ÉşC7R–ÍŽÁ‡Ò I*Ñju@ˆ Âu'Êíû ”BĤjCÒNğÖh[T*Ê)E ğ˙êĵ‰Ĝ4[·üoD[§TS˙˜VċİhSÚhu)ƒl›šÙy~~h¤Ü kÑn·@AĴ70wà‚CĊ÷ŠˆF+F]Ôç‰I†³gÏĤ•JpziéôŬžÏ᛿ċÊÏŝì;~=~¨>wCpyX£Ñ(šÓr^$żòşecÔ_““"AA'ްÖê€`rÇtäŒċòj7Šzf‰ŠAşìğLÓM,=34™ĜR˙LNyQŭViƒëÁƒš\Żvĉĉˆäżƒ:p0c4ŒLĦrí­A061Ù]ğ155 ™ĈH’FĤ „@pNŬn–¨"Ï$ŽÑl6Μ?öíġFġs×\óÌŻ½ŝÍoÊÏŬ\V­VŬĤLÛ>߅3ˆ4eŒ pAÁ˜€” Ĵ„Ñív‘$Ĉ¸t*MÓ´ÊN9h/ßFRŽ$òÛ |{)ï%—$Ëzĵŭ²ÛEċí[ħ—xŝKE.JĤ=bB-LNŽcbba@'1@†sw?PĜàa!CšĤètZ’1vâú믿ó%׿ŝ!ß 0—Gç’X$ sJĞ ß9+İ™Q k ”ħèĈ˜dˆ“¤(ŠEş\¤<݈(ÜàßIiDçġ,PË˙žó@Œ VÏ/ëúös½éÑŭwŜÁ3>½bßŭ%ġ|£cÏs÷P—Š`.nÛ%iƒ‚]ğv`Ϟ=Íú””RˆZ-KÀ)ƒAI™/K]ÏÀ˜œZŒ6…µdú~˙*ZCpÚד Ç)è ĉŒ1è˘ëżb;Ò/)VŠ0FEQAÒ*ݤ‚œs¤i c{§}û;—mè_Ÿ‘/ˆż”Àµ[ÙşY°İ¨àûŻ"R¨ŝĠ(ŭ\Ë +„­È`=šü>:0‡(ꀂ½{ö Ñ¨ĦÛj£½ĉ4tEirù €1K é; IDAT² éBi'?ù*:ĝĜï~÷ݽáßżròâL3\xÜc/_˙ßn8ñ²ï}“z(Îu(sù(ħË#í}8µòñÖZ233ƒsç–\$@L!uaı!\ıĠí+fèt:PJ‚ 1ÒkkkŽÜ¤Ċ9ÇÚÚD ĥ­ĉXİŠġĤžçĥ7ĉmŒAĊ›˘2Gc­ËĈrpÉĞRZk0½2@^6î­"m£b'ÔCìR^ž |Jè~ħĴ͑̃ûĵü1sïy}•¤èFA “şĠ$Ö¤ZCi B¸' „JpÏ~ös1ҘÄ{ßû|ú3_ĊX"°êáÇÌżâ•ŻZĝŜ7Ŭô tt‡Jt IÏèïŒÀ'°RE·ğîZ& ´F­Ŝ@Ômgû‰œÎŠï{HÓZğ%ò‚sPBuc'é€QŠñħ14MĴ_\CIx\`Ĵ9Џƒ‚Ú"…á Ê$JB K ¤Ñ¨VCFXk@/m§ND|@ş’“ÇŒ1h-3fɸ>‚by!ĥ8ç/÷÷ĠżÇşüE)5 €͏ kÜĴ› $ÔT¤ ̇1´œş×ĊxXL  ÎÜû SxE³Qž]Ó¨†(’8*ÀV)c  A˜‡X+H•ÀĠ˘âTàùÏ:‚ùğîûß˙a|áĥû áñȒє˜IV÷fDŬ;z×½KGnżísKÏ;r9ù‰ŝÎ_üí§ż.>f˜=ZHŬÑ Î_èdƒW°Yz⚸Ê+Wû#†~âÔí;vÓZ#Š"7̘ŬVŜÈXĉd(Ħ=ÇÍı–4Ğ"ñ r<ÛD`µ)úb8çn.†ş=×=ì˘‰4M7M=ovKşƒċAß F^ÊÒ4íy7òÜíq܅/<jÇĴ1İaïÌ,ĤwL"ÌäG8.*v9g4…1 ġjz ”Xpâ"̛ów°¸ÂzǍ€pÎIµâAİ$)ĉœÙ=VŸÂżûŸĝÄ[ßû+?óĊĝ˙~NÁeh-B WŠÖ%9Ek ’8…ĝĤ½Ü(—S ƒ'—ÄŒ˘(B6È9(äxŽx̛ċœbθ”8JŠÎ88'…ˆ¸#‰ 2Ó )O:œ×é!`éŭĉaúı£­ĉzÄîG“\ħÑÒŞžĥŭ2IA,019Ž{÷`|b´‡'„ ›$IĵR'h6ëÙ5 m´î;u 'ï[À™ĠNÑlˆpâ^&5#ġaeŒìß?Ôĉ(•ĠĠ•ċ£k­Ġ{Ĵ Áeh›ì/>üäßc5ái€ZpAQŻ×‘Ĥ1˘n )•K)úD›6Ş3(6:Žd³C* DïşR“iĊäĴÇÒ4Ŭ´O'@¤R Ù>i­58cB8~†q´ğmĜĵ?ÊhĜĴŸC[N÷Á< í­@lQê!~/.ŭ; ·šÒL‚Ŭ›ŬÚ·g7öì™A­"Ibtğ]LŒıÙĦ,j1ĈJ/@Ck½‹ù{púôV/ĴÁ Â4j@4juŒWħkÇ$„?†ÀŻhk“ĠDËÛ\ö˜Ü{`ïê0-Ú@ûŸŝᘑêY3Ó͓Ë+€AÖ.ŜÉHN€gcö½Wĉ^ç*/Y/§Eŭ{wÊŝòä XFĉğu"²´FċÓĵRm@¤F FRᖷjŠÔ"Żdċ`UmÙc~FġĦ|Éߟü}ߨzısŽ:mÀž={pèàĝÀĊ ː2A£Vë@/^ä‘\}¤ ÖÖWqjq 'NœB’‚ù€U0Ҁ0Ž0ä¨U}ì›Ŭ‰Ŭğ&@ ÀD˜tZkw„ûÛħё?î Oĵí;żç'Ì\†Öc7˙Á˙ô>ö·˙{ö _½²êÄèËU—LÀ)UBk§$†>ŞĠ JË-ŻÚe€ÙĜk¤7U?•q›‘˜şŝĥÖBJŬ³.Dk › 9m^ bܖC•Ä  ÷hyžÏ÷ܒ1â Û¤-ċsy0@ÒżÎds‰É‘Î:û™\2íÑfğgvbff£hŻŻÁ(‰ÀàŒ ĠŽŠ(/ßÀ9GµZEHóç—qï}'ħ´ä˘.ŠXJÏcœÔŞ>öÌLcvç¸ ˆşq"ĵä–z#ĝı]ğvÜv ?ôĈ·›Ż÷ó7—G¨½îWŜàè–˙s8­§Ç’]Ġıóç—gÇĤ0Ĉ•‚kµšÍ:‚À ŻĊq\Œäi ÎĦœÎz“#ĉÉfİôlp)–{|îH)Ë2gÔuórb6&Ğ”Eu$?·ĵœ DہżŭœÌŭ•Ar™ÛNâ’œË B·R 122‚Ù“˜çkëАIŒJ5#h iˆXk×vKÊ >]êJêŬDt½Úıs'8€‰f€KŭĴ1.ş1:ż°H¤.Ò"Ïó0::Šf³‰ĠĠUÜ~û혿gq"A À=k ,! œ˜Ġáq‚ıŭ{0·J%HÒBˆQ”ğòÊC˙üÎ_~À2Œ\aöÓÇ_íżŸ˙èpLÈ1Ġ9iƒYJd@`Q%€:w’şKJ×Ĥ ŒCwğç1À&`‚£ĝh­·ahkP­×œĝĥRXğ¸šU‡d,´Ï !JCW ÉKù•–RŠÀ wÀžÈÊÊp[…‹AE°JCe¤§µ>çHSvža5Ag]‚Q„A…ıÇ€ 1G•#§˘ ]Wp­7Aì‰0KÙȲŒPÎ#Ğ~àٴِû 0Ĉ•ĜMö\œP0NÑĤVAĞc*ĉöîĊŽİIBj,I’Ä•¤!Xo·]¤RŻıïĠZ]{NœÇ×N^„& Yä)((Ş\@pq잞ÂH­ŠµġXHh+ÁB\qĝñ÷½íç?$ŞÏ\!öÒ·½˙‹…=Ĵˆwâp7ŽIÜ@f³‰ ´ A¤RH; ÷À‡L,’D˘Ò /ú(dŞŠY"B”Ô|/뎌éZ# EÓı°ŸôpyŞĦäe Ž‹È›âÒ4-ÊÍBÄQ;+çòbYĈ*Äħ…ĥ.í ‚`C Ş4*àD¤XÏC´X[›GjŒ1ĝ_k ÛU ŒÒ0fc0ÔíŭˆuïOĊ\û>,vMMb˙LƒÂ"Ib´:ޏBÀdCy”ÇqÁ­TĞUX Ĵ\XĊÂݳXXXp£ŒÚqaŒpFáù c£MŒŽŽ"l„€VXm­D#Ĵz¨6jĜ{pžô-OÑÀ‡0—ĦŜ˙ïáĝĝìŭÒúÂÜZÓĞ^TG(áÖ/&mÄħ“°4cX=ğ £€h½ F)´Êި(f‡d&}ày|ß/ʞiœ”úĈĜ~†1Ö³D­ *ċjŽÖĤàfzŞOÙßrpqên&#ŸC¤ çU"÷ĵ @0Iĥçځ–n÷5!ÄMsGiϲöò聋4’âçòm÷‡ŻÙxY/ ŒĦ`dcDÁ$]ÔkUìÜ1…Ù];ѨW‘$1˘NZ*î!Žc—VzQĦĠZA€ñİq Äq‚…“§°ĵĵŠó.Bk€RdJxpc‹İc׎ LLŽĦ„8{ÁEžGA…@K%8żÜĈ’jÑó:ŞŝöûßJ~µoµCpy”Ûħ÷ŝ¸˙îOŭîáö89ÖbÎF˜MŒ ŸÂ*$ŽĦ•ÄÎñqT"r ™^ ċ_*0†´ )Ŭ¸rAP€I'=ÄoŜĈž·à;­€ŜŽñÜA7v!÷ŠUċÇ/Wœg>(ĦE)vCĉ ×aaEä•;d~?Î9D̓Rċ×ı|é•rçkY˘âR ŭ90Š,]´Z!5.íǙŬĜ·o_¸ĦN VPêÈéĵ‚ԍ:èvğ jµZ&Ħ`-C·ĉSètÒbي   °¨T=LLŽ`lj„,Ż/!M8( ehEĴt/˘m"ÄuġÎs‹W˙Ëż!yù›ġkúî ŬGĞ]÷?^ä˙óâm‡×FÙM+2>jb2E×µ°Ü@J .|_ éĥA"…‹_;‹ĠSÔ"İ ĴV@´†•ñ<ŒŽ[ĉKşŬ.Z­eÔFà’;£Ö Ĉ8ÏóÇqAèşÊFP”OËCˆI’d܈sß÷Šu%FáR…n'‚RĈ8b9 ¤+ħr‘2¸F?­ â8AšJyoÌFù[JWqa܁cR+ŞOċ.ŜÒ:ĥLÒÄ­öàœƒd+TêġĈĈĈpĊ‡;Ĥà ŽÎz íNËEPŒBg3JùôĝÊĊXkħk×NŒı “‚R)ûî]„5@„è8œatĴŽ;'155ŽjĠaġ‘¨kíuœ>ż„ċî*ŒÏABjÎ<Ÿ˙–…‹çÎúĉŭöù/>Úŝò?ßñuëĵ #—o@{Ĉ=Íż=]:œL†7Eö‘Şñ£€ Ŝ@Ç,C%Ú-A½^ǎ` ÷Ŭq*•P€QÍ}ğ€nâƒh„ž?·:n(ĥh+ïïé}Ía4…A§°<`¤Vǎ];0== îSXh뺙A(Ö:ĴĴ ÓmĦ•t`  È,™äSd4ġ0ÂeŠÏ|ù 0ÁìŬ…Ê \¸ë$"˘À£Ħà0%­Û~üĵż„RZ”¨´ÇÙ*•°Gœ;!D Ï y”híšíòrn.£PNI(á°ÔBk‹(JܜQ6ÁìŽm‹™ĵLÍ9‡”Ò•Êí†Z~GĜ2îFş‹Ċ}ó×|)şòë÷˜4·Ö"ô45LNNbÇÔêġ:../ıc2ŠÀó‘ÈIœÂÚ–¨Ô­ûh4Ĝık(èvğntÂóhçœ 0& •Ì4[€‰É1ìŬ=İİ)„Ġ Ö;m$ibœÏòĊœ9ßA§Ŭ‚ĥ  ċ.:ƒX%$áX5hìš8@&ğFçNv˘ù3çîz×Óŝû5w_ı˙²Óżöú˙•Ó˘GZôSßáO?e×kßtÎ'?éŠÇ\ó”Ğż+muĤN.& R(pbÀÀx⨃Öò*żrRExĊn„ÓX9sXéBH@)·0Í÷CDQ7j„“=ÈÂtTÖ{ÁŠÈĊI\Òl>†˘^Ż˘ÙlşÒ­ÔHSÙÓrOivµZ[ĝKm’$)úf@€0 Ü@žŜĜÀCÜMÁ‡6 $ğ!Ŭn„(R`,[Q›J>uƒ\†ˆN„$‰¸HJ…n· BX„CyMmyâzĞôHg]ÎA`jr³³³˜-@"M;ÄL(£`Y'FÇè´ÛXvî„ç{X__Gš&Eô$|F=Xqï×a ĝŸhbïŜYLĠ ­Bğµ†v· İ Î./ÔİÓh·Ŭ¤5ċn% eŒsĝµğví„84z¤“&c¸=ş2ıċԝKûŜG^ñş—tnŭè­z.߀ö­żô2˙³gżzĜìhĵ³]7t(ı˘ĉù;ĝĜ}ó'ù­·ŝ <ßs}=6şçV` Àx š¸†.j,8€nÔF=¨£âĠ°ĥŜŽş€š>Ċ];!%°Ŝé@f='à Ì `‚ŒB0J*­aĴc ÀújËE3”ş&=­ÜJBJ2ñĤŜ.ÜJ’‰m,Ëgg6x×ç’÷½äÜFŜϒWtŒħ¨T‚ĴM‚R7ĴXT€J½/ċˆ&ĵ”iĦ-“W¨ĵL÷7MSHmó½f Ä9>A§Ŭ†Ö#Í :„ÉÉɢ‰÷ŭ"M$”—FR´Z-Ĵ­­Â·jl|ïİYy;‚Û+ÑnupáÂEH•b|| £cMXXDQq”‚³‚ûè´cœZ<…³§— #ċ]ŸÌÀñÎ4Q‡˜¨Áĝ™Ö.úÇÉ(”ÑXĞîñ£êÈÂéĊ'<óròíŻzaçÖżÙ 2CpyÚMĝß^QŬwF]ĵRŒÖo<ğĥv´£í”¨ÖéÄD%Šġ:kqû=wâ_żüE€ÏıĉY84{&•¸xöˆÔ¨!¸`ˆMŠuJƒk†š_QqœbbĴ‰ÉİQÄiŒÖZ„ĠnCT|ˆ0€%iê:FiĥۈXİru˙Ĵ/…R×D–/@ü @Ħ´Œ!èYˆĤµF¸ ’’Òm(ÈZ⠇, Lĉ-˙9¸äŽ›7k„‚TfC“9ùĞJ{•ò²sÎÏ8žiC2³\&/ñĴÓQ!00Z ÁĤwLaçŽ Œ1V€Cŝ:ÜsħĴÜ#Š"Äq€ÛhÖá…>’4E”8•À ĦŒFœ&™~K PЉ‰ LïځJ%€6Ê(hI´[1N<3‹§Ħàq@{-ÈDï(*&!vÔ`BB8²•nÔÉíċ#)4§‚‚c&ċĉèĠ>2żrjéq/ĵŠ\ŭ=ÏëÜŝÑÏë!¸{áÂ;Ÿ0÷¸Ŝüš7\>ÎëáĊÓ+$Z0=RG' žéÊ'0œà“÷âÖ/|I pġáĞñÌĞĉü*r'ŒVàÍşÂbŞ2 ÙJ°~jk'ÎÂĥ;Û1Ĉì4ZĊÊâ2Rjà66 ‚j€XV½´Îšè÷(§€Ö ™CsÎĝ, Ò$ V|h­²ı%Ĉh0F‘$q!™G.e§ÏÁ%/Oç‘GOTKµfW~çvn·u‚4IzDÁóÖŝ˘“—0PâJÙ°Zhm@)ƒàxVWJ‚3ŠÑ‘&êĠ ĈFêĜ3ğ££MtğŬBo%×ZÉğ|ğQ„4MívÇ]!0:6‚z½VL‚ç™yQŝ>$Iâ˘;Ê„ü핒ZC J”b¸xa‹'—°raĊġĝ, ÔÂV2 r`Ŝq˜‰‰o ‰rŞtàŭQK§Ä-Ñ)‰dĵ§GŭÑpĈVÄÑı~ääĊ3K—ËċäĊŻ~Qçóu‹‚ËÈ^ôĉkŭ[/œ=Ĵj›Ĵ_;:1kêàîƒÂOyê3pĝ‰Wa˙Ħ=X8} Ë­‹°!*šZ$&ñî9}wŬñUx ¸öYÏĈѧ^$Nqzñ ˆ& gÚX=yé½§A ö_v¤âċ38·|Ħ_mTáĠk°™@Ò\Ë?#RÖ}Ĝ e  q'rÂRYé°ˆ£JIx‡F£^4çċkIò4 ß™ƒK^e*WĞò¨"\6JâYd@4ŞĠ*”RHSUTžç™$ARDBˆ˘É./‘ç Ġ/x•?ïÄĝ8ñÈĠ.jğvcöħ‡°*œ>y²›˘6@„ÍRB§ÒuŽj$ _BPÀR¤HgÚĵ!'`”„‚Q )Ŭ˘{Ĉ9„ <J ¤L!eš5ÖÊš\ÊĵH~ġï—<Ír3FµZÍġĥ$²žMiË4)"ÏóAхëÀ„p‹“„Èğ~ŬÈB’8g—2A£^Ċî]Ó Ö Ŭ^Gğµ kHQfÏËÇívëëë0kÎsĠŻĉHĠj€)šùHI²Óµŝ·ŠÒ=Aµš5ü–˜,máhwbœ]ş€SKg S÷şiÀĦ¨‚á#öŽ£öĜix †Ċ ”Ġ°ĈBPŸzÀ€aÌ2CS P@Z ĞOrÂğ„³.F§ĈĤffF§ggFw|z.˙ĊvìGŸċñŸ>qĞŜ9-üB).÷ƒ µŽógÏÁhe|íÌ}ĝÄç˙+TB K `% ˆv\ˆ„<”HXOŒž;îĊ-ûˆuƒëŽW<öI¨Ôˆ”Ĉâ™3h-ž÷jñjèžoÁ0 Q ÊX·~‘L~ħѨ£ĉxÂ@ v÷#„SÎPóÜ—ÑĴÌJ™]Ía3äŭ2ùS™6‰à^џlL"çÄjÎıäİMŜ.ŸO0KPĞU7Àn":ï§I³N`)Ŭfß÷7˘cÀı(ÜŝĠŽÔM`Ö ž ¨UCÄQÖ¤0Fƒsż4Ì-ɢ‘‘Ïs ¨ĠŞYZ§7„Ĉ3'VJ °˜ï’Z#MˆôN'ÂòòE,9óg/fċ6€z܁JhIqp Í“0ÓUĜ€€ n)<Â!Ĵ+×m§Ĵ‰…aš„ p#À:aìaœŽ’'Oìç3áx²ŭ½!¸üÙG~ïüİü…Ż|áÊQĜëڍNŸŸòVş"ˆS쎠Ĥ)ÖN/áâê2ÎĈ­Zt°&TŠ (‡U€ĠÀ*]ó*ÜG¨ÔJ„s÷œÁ_ĵŸûìpà‰OÀ5Ï}.żì18{ß–—@‹4– ÜˆVn@%ëĊ ÍZ³{gÁ.8÷`,qÚ"JŒ9`ó=Äëë$„+3§iŠ(r¤Bp0ΊÊKïgĠ!Ĵ!_‘ƒK^1ÉA¨\ÊÓÏJ)T2Î%MUOJċ:p“,]1<ßwëiÔÙ&AµZE†EŻKéXká w^VKpN1:Ú£Ö­X%nuH>:é¸Ù İİ)ìŜ½;K­2s’‹nĦ$ j°Öí@j…8M •‚çû+F‘det)Sh+‘¤1N>“'–u€r€pŸƒ -Ĝd £‡v£~`h Ĵ m]÷ĥŸpP×­ìbAİ[’ `eäâ),$Ĵ]ÚĤ˜ö§˜™CxmÚ˙Ÿ½7÷ô,ë<ż÷sßÏŝߗ³UÚ³TB€€@E6AÙ\ZœÖiÇÑ֞žÓv\EgFû3Œ=tğ´Ŭâ 2"Š€! ‰!!KeĞÔröíŝû³ßwżxŝ礢ôŒö`Ï rżİuŞêTĠıŻs_×ġû}šp?ò\qù˙áüû~Ìŭèƒ_<·’Mß[ùòüĈ"ûž]ˆ5f²·³żG'ƒ%·I Lĥ ÓAÍߢé)ŒUP8ٚa>WàVlœq@XĜxcHžê1z^=êá IDATd '·hž#OK¸ë+|ì“%-rŝËïßüòÛĜŬŬe{gKZĜ-[NM"kgÎĊ:RE/UvlÒ  ^Àd8e?C'@-71 'ÈÌÇÉ$ž"dŽ´KTƒA)°]8Š1…!K ”%İú!‹ŝhˆTŞÍ$ĝoş6şÈf˘ĥb–CôLd)××a°m­ÍÌOÄ šm°mE–§ep6a%DX“i< ‡Ĵ‚fĞÎ4ĊSÒ,!/R‚#I#Œ8"×ç²´¸„’8Ħà*—8ŠIâŒaqaùıEžĜŠ8ày6žç âPl…²]ò°ı½” ÛV3(ğ4gfYL2 ½~ʧ{ìlD -, ò2•Ħëœ /èbŸi0Îb<İp”ÄMNŽħA+CaiìÀĈu\²T“' µ”.•ƒÊ1–ÂĠ.ÎÈۖ,LBn çı6İĈCâŠeŠğ½ üçŠËĈóż˙ñoÈüşĉİW.ßÜ·ċ&¨ÜŠċÎi­ìĴ$–‡+‰)H4dI†+'$6cqqìX([ıÖtHEĵħŭĠmĈĞ{x€ëq<Ŝʀé4ĦĠnÓìól6xÛ[ßĈ-/}íÙŽíĦµ@'Žċ` CğÇxoD<a°|¸¸Ġ_ÚèIŒĤ(4ÇUXB'…B(Y™]”fH1 Fw4†I_…J°i5t:íY0[Z:„…ua&Ÿ™Í_¤,‡‘ڗƒâÂìcÊĥ*=ġ9Œĉˆä*G6T*ɌĜw"*g#ŽF I^与Íü\AÌÖñ³4[,)İÖĞ,,.€€½Ŝ….PŞl ]ĊÓ"'ŽJ½Ëp<ÂñÜC[‚¸-"×`ĥ­˜Lsv7úlĴl1ìOf/3ŽG‰ :îÉ6Ŝr·‚m!ŒÀÂ*•ıWÑóžAg”ŸxÇ(Ka; ! ıΖĈRĦÈ%Ù Á%s˘ÊœŞ0çU¨z.Bd^v,ùî…n÷ĞÏy‹ŝs m˙ġϸ÷Ŭ÷ùs;“Ñíiîħ\d…Wڍ›ûXyÌÜtH%—Ô… v-úu~=c°ŸR §8c—ñ ÏÄÍÈB×ñhÌWñE î1~j†Ë§Î˜Ż²Óßaos™+Ž_š,I÷Çl_şÀ£>Ì|÷xĠ­·ñÖïùn^ĥòb>ñ‰Oċ{ï› ĈY, BŠ<&µ–+HrƒmÚŬÖ(fpi M`Û¸ÊFJE’ƒ.(5XÊAˆ“ċ™FÚâpc“š‚8)0%êY (ŠÈ²2Ż(I˙ĤîjŬŒ´Ġßt/”‚Żü6@\ÍÍ=˜ğĝ˘âxLÎ̏cfYۇƒ`shF4Ĉ l9“ünjÇclÛĈÜrŽ%ÊÍTÄqŒ>ÔDÔ˜/UIö›ċK­_îħżğO§(,,%HE†V€/ -Tižì Úħ,HA`Ħ”CÓƒƒvìjĥ ³˙*-fhM ĥċbĦ0İ Û‰I× 8îµh °´LÜjc5Š’ó•ş{á½íǟ[E˙}ŸOŭñûT½|ĝŜ/ÜlĤŭ;µÖ­ĥeĉâ4·§Ó„<5Ĉ"–’Ĝq0ÊAÊ'Ĵ1j†Ĵ·mF5IŬĥ¸! yÓħ¨%9nœ˘Rƒžf8ĈE$‚½µ}&µƒW 鞙£ÒĴ1ڎĜşĵ‡íıœzÁI˘$gc{‹aoĴÈp]Ÿ<Ïxĝ‘‡ĝĝ'ŝ˜fÉßĝfċUŻe4³²Nè…Ô:é$ĊTlàú>Ġn ¸ âŝˆşëSÈ)vĠ#+rÒLci ‰ƒÑShœÀ.Ċyo—Ġ°Z%1q•~…ƒUôln1ŒÂP­V&‡˙ĥ–Ċ³Œ…ċ…ĥ7Hir•İÒ³™Í3:g6\M’’W+,köçT=I›İñx4-PÂĝ>sŬnَé‚ïġ‰â˜ßûÄïóòù–Wż†ïŭ·ħ·ŭj>öħñÙ/ -F L‘ƒÈÀE‰×à·ğ¨ħ!K-’ ò(ÁĞ•ìמ‰Hct^D1…- ˜qgùkċvǐ$ ġFëžçW§8Ïâò^Mğğzú×ı4£°hŝFíÁĥİüu%äJkC’” máÚ8Ž6Y–]e]àYĜÏJBog4œ7-!ɊËR8އrKDDžiöööY_ߤ·×GċG (LVÚ3\`ÔħáѲUc"s¤,y/Âälŝ…1x³-ÜA:ĠŻ­5£Ñ!$ĥ°‘EŜQ}C×ĝ´Ŭ:‹V€› |[‚4IlewWġŸo.´ïúİ˙úŽäYŻ çÊÀ×÷üĜ~É5gçN<´ğu³77G![&£ÄÏ-[äJ:.Ód¸×GNÇĝÚVj¨F“qa!spŸY-À‘˜À'µmb/ zükÒgC\ŒRĥŠŒ°[£½Ĝ¤Ñöı¸ħÊ~oH³QgùÔ"“lÀúS‘šS§ÏRĞlol²ĥJgQ1Š#V×WXÛÚ`g°InkêŬ:™NıïÁû¸÷ŝ/Óh×ĝöï~3·ĵä)îö\îü<^à„>­Ċy„#‰G1Ûë{ä™ĤŜnu+5Ċ ĞuĤ£1ù8Eêò °YĞR`H²|Ĥµ˜]~£g¨ƒHjµ£ñäġ-`ے h4AÀd:=4=^Më?h‹â8>œ-”Ô:‹4ÍÊYÏìĝ÷ĴĥHJI†3=L>{ \G•Š]Gáϸ0Z€ı3M%%B–?fyÎîNŻ”÷Û Çq)ŒAëRTç‡ʖ¤IÎöö.—/ŻïglaĞDY 8@äq‡LïxZ‘c‘˘d½(‰%ÖLN€”ËÂâ™ĥó@E|ġÊŬ’<Òƒ;–tò ÇU‹eğ‰kY @UTğìÔ½Ŝn7ïĵŭ‡6ùëwáı—Ë×ñüĈoŭoê½çż|ndÌíc/8½•¤Ë5Yñş­EH#Ü"coo ¤' .šb8ÄÈ Ò­RÄM_$XvA`$•L’G)ĞÊb^áñÇ6Ê&“’XçTŽÎ³¸ÜaĜğÌS>ŽmN²xĉ~Ŭô•'môéĥOÑXh3²Fl>ĥtżGe~‘úħžâUÂX('ĴlK’D)ÊĜt½9’,ĉ#ŸüC>öɏrë oċżxë[y˛ŜÌżŭwżÍż|78<‡íuH 06ĚÀİO#Ĉz › ]Ċê;eüàğ6Jîâfw‹Á(B*I‘çäY†tÊtFK‚  ^Ż3Žgݍċ8ÇHí6ϰnͳX½W·N_“$'ùš²rÈŞŸU„.´l”r°,È£ü° YVùûx^dĥııYĤ ¸R–WOhë:Ĝni…˜ŒÇĴ­n°²²ÁêW)3ó9Ħ@U XŞœja-T˜†ŠXaŬK 0ş(–.‹Œ]² uœF§\Ŭz– ßUdiJ2Òx‘KÓnq,hÑM%Î(?R'"%sÀĞ{I§ÓZğŭû~&ŝZ÷áı—Ë×áü›˙óvן×'şù‹ŸW­ÜA:ug°?—'ĈĥĤEj3vCžÌ ĴvˆIl|Ŭ çUÙżé4ğ×vËwÔ£*Î6;4"p”ÏĥLB—÷q‡1wL‘9xÊañˆO½#Y_Ŭf÷Ҁ…ê1–_\!›Dlžß"9uœĉB—á֘­w)Ü1Ŭç]‹ĠĴ3&L† ŝÑOqև ĥlz—ĤŒ7&{­1“~JF”Gğ‡OñNĴTñŽïú>^ñ˘W°³½ËöÎFIês.nÍF4v×Ħr¤FXiŽ&dӄ,™µ†Âĥ ŠtŒÈ3Šq ZR^-Äñˆ3\#İş*Ġ&[Ó]²"maŒ…6!-˘"fÜ'p\†âިYc@H…²Ò8.Û)c°•´,Ò¤Ì(rl‡ğDĥĜ`äAbr\ËPw…NÀ$“cÍ^LÉ Lž“–AZ’LN^´°Q^…éŽDíCghñ<§ÍIY!`׆~s äĤ£}²ŭžŸ§ûžï}ŬĉŸ|üÎçŠË×ûüüŻüˆûéO}ô\ôä“ï=2ˆŜħoœ7ŽڈŠ1ìOöYöÉDŽ‚Q6EJ—XXhr10 İï'ĵîŞGYHŜ€ÀħÉDĈ4C‘a›•Ôqş)Í3I!Ùyjˆ›ä,,·i8ÂöS›lġĥ0U8qêUÙ`İ-vöĥPs6í³§İ“KÛ W7ħqˆi>eż ^-ÇŞd¸M‹ # ğ.… …*ĠyŸÎrikÖ7àC÷#‚wüÀÛxÓë_C2íħş²CèWñíDƒ)Óфd‘N#4ĥtñ½*WCʀ4 Ĥ)“,%5PŸkјo1œ‰£„BhŒ‚(/)jäSPş¨%-¤E‘“D9ŽS: ŭ D)Eš˜˘(ÛQji<Ï+ŭFYŝ RÓzÓY²`JGtĝe[°MYĝžK·Ó& <,q3Nf[Ÿr°³[ +• ĊlĈl°]Ï H3ÍúÚ&/^!›f˜ dYJŬŠSmuÛ#¸~‰ Ŭ@Ġ´gĦEİħĤ|ñŒUájëÂÁ+LJc+¤Ċ,ÂÁS¤’´ŸPŬÓtŒË1żÉѰ…L Ò(Ĉ š­ëğ›\|úq6V/aé|Œ.îÇOßsç£Ïñ\^ç×˙è_‰f=k_üÒ]/é$ÉÏ6]që0ê͙il盛¨Ŝm[ÒĴùxnıH’”Ô F şZáéiŸĦ*`q0ùòcŒžü*›çŸ"ôéYÀÔ\6§=’<Ĉ ]üŽO·[%&Ĵ^ÚÀoşœzŝš‹Ĵ2L¨·tçHӜµË›L&ZGÛż~™bd¸ôW‘E9Ġı9şó]*žËÜb—JğJÓQŽ--„.ȳœ"ÏÉҔ8IémúğƒH²ħq˙½gŸ‹"V|÷—oz>—7yüŝ‡‰lY”Rd9–ë˘3‰ÖĜDħÀĜ>*Ĵ“xJ8_CÖ<´ Q– ‹a ‰3ò,Ĉ³]ò,Ç:΢ ŝh( tž_i–¤×Èl[âşJÙ³!?tI4žçϲĴ2h fÄğ”$Ö³Ÿ+ßz –`<³µµIí`ŝ3™0 Ëá­ëàúŽ#1Ĥ@ˆr2E\ı²ĈʕuÒ8ÇÒeaħ•˘p4Ĉ70o!ŻéÒ<ğ„·Ĝ@„.ı-È-ƒPJIlk–„x֐ö`uúÈ2ĦŠB„°!•˜aÜ×8cÁġy%YĦìÄàJIµÑÀröFC~â~òh˜êlşb²ôÑŞWùÉcgĥ>óé{ŝFŒxLüŬÏ?ùÀğŬO?|×ġù¨˙m½Ñ[›;7ӉçH#$ŭlB!Ħ_ĊVĤnƒJ•aè%Š´?Àµv;dlĤ4ĉÄPÓŜšf{4-ĴZa=äÑdÈJ2ÂoÔé6:¸NÄöÓc&ŭˆĈ˘ĊÜ5ó ‡oçnOûL{ëğĞ~ÌÜò<Ħ oOĜı°ŽĴĠ8{ĉzŜö­o˘Ŭlŝŝ=ù(Ċh„pT (2Á‰íz3Š›ÀsK´‚ħm4ží˘§ Ä Ç–ĝ–[ßÈİ“Çq…äž/}‰Ïßùyú!9{ƒ>¸h™-PB–Š^‘"%Dy\’ù•Íhs—hc5…ı=qŒ‡VvŒ§h#”ß™][–ĈÁLS¨r+#mEš”\ÜĵX²[˘8Ä,DӒòŸĤWı˘%TĞĠيZ“$ –4›Mâ8fĜO(fßS<Ìu›(ñ˜Í-Ž?ŽeYllmêvÊX”é)KĦ_‘ z½WV6ĜÛPş -d‘—ò ¨s,× Nĥñêèܐ•Â}Œ,͎J  5ÄW ħŻöTĵ\ ‚´°¤ƒH$şŸâô4ÍÌ£ŞÜàÍ!äI üzˆömV÷·yòòEŠt+iUj÷Ġœà}óÍîWϽĝ–K?ŝÎw}͙ËsĊċïx^ŝžïw7†½sƒ"ûFò<GÎ$ĥĤ Á`ŒÜ^ÇrySL Ž`š‹ì6; êu–:ײżħÉÖÚzùˆ¤Íù:ş·Ïœô0´Ú ĈqąŜ:jKótMâÁ”h}‹ŬS-ŠĊ΅=F[šz§Î™ ÑĜfëâ6I?˘µÔ˘{²M&b֟Ŝ$ĵ ËÇNòŝ÷ü O}î^’шú5‹üâŻŭÏ=²ÈSƒ­ò Ҕ+YK”@Ì2qĴ ˘dŠe+²"'I2Œ¤q)µÏw#êa…×òĠĵŝ5Że:òçŸŭ _yĝ˘,ewڇĴÜ~`J4ƒ%Aëâ v·KŬĞ"Ĉ;O^BìǜmŸëpŭÑ£üŝWg§?¤”ĤYËÂU“'H Ú-‰sBâ$›ż –*7>µj™sTĈĠ3>mv˜›tqE‘Ít,%ğÙjĤ)û{Óò•„Ĥú<„ƒċ€77%Ôi•„ı ZÁqòè•2³i4šrùÊ*{;£™1PaI‰IÙO„Àb@ċLçh“¤j1ö!2ôÀìh 0³Vê*ĊñĠ› ƒ£M%lHy?YÌeóT¨·ÄĦ:ż ‡ŭdÌċí5ĥöwÈÉrhîöíŬ§Žœüòk^ŝÚÉ÷~×?ŝĤ3>W\ŝ–ç×~ûçŬ¸˙èÓs•ÓĞ£Áí;q~.͌'âLĝyŽkrŠ<âšŭ!íÔà†$"g<ßb·RĦuòFí[ż{ èŻoàJÉ=ÜÇçżÓġÑĥa°·ƒWtȒ –,êĊ.B’ŝ„ŝö.Ò iñĊKÛ¤ˆcÇçñŸŜnÂ`g„U5ÔÛêa“d;bíâ*¸†#×,pġ/!Zߣ4ùË;żÄu'OóĦ_˙Mž|ê<ôıOñ›Ÿü–„4Ž˜Ž'ˆ°´)Ĥ /0à¤9^a½¨(ċa³Mâö¨!Ċ4E§šÛ^òÍĵáÛŜÀdñÙÏ~–Ç„áhD”e`ÏĜ°ÒàÛ ) •“ŬÉÎö§T¤Ċrè3§ ëğÜğ³³G&`h„k+Hb\ËBÌ0 ™.ˆ˘ÒYlL™=äú–(ħ Ï^RVJ‰Ĉ”ş­Éót6àuİ×ë$IBow4ËÉÖ¸ŽĊµgNı’ŠïÑjµèO†³”DkU”RD3K†dİĊúĉ+++ û3(ıu•M!Ú çxı·TŞ{LtVÙĊ 1³9\Í"ĥ, ‘ëg  ËA›dk›t”aö3ÂİMG„,Ş*5£p )MQĊ¸lö·YŬ\7ĜC“´›ÍğçġÜĝÂğ~ù§ŝuü˙vgž›ıü-ÎOüĝ·şñg>7ÚıüŜë†Ö;jŽsc¸ŝn‰¤7ĊI yٟNɽÌrɕÏÈġÙRŠ!9vò:ŜôÚ7ñɏ|˜jàñ˘ŜÄKϽ”/ŬsÚhĈ Ž „˘0ġf…z§‚!ccedÓĴ4˜ğv‰ñ^ŸíK=¤Y¸n ĉlìoI /£½Äġŭ­}zWvp ‡ÛνœxÇ;xÍ57p˙ïĉÏïüKާ—™?}’3GŽóù~Šà$ îT §BĵÀoTšnğŠZ–éx´£>/ĴzĵöÔ Zٔéö*šŻ:>ˆŞ[÷yzġ2_ĝâħ4|盿“›Żı O9 }„4[uÛ£H D!™ôÇÄûlâUˆŠC¤r†Lʘlê°?™‚-ÁuŽ­y–˘, îB§iY;SÜ:ĥC^<­¨TıJé[RàJĤJ‚ ÄóJ.o<˚.½ĦV­ fCR!ƒÑ×uñ+!–e‘B¨J”Ä`P°reŝŝJÎÓáM´= ½Îé•3]˜s‰ĵ‚´(°rWHŒ( Ÿ’²{-‘ cY3b‚x–ÂĝjšžèègÔ&Š]e^֍’áZT–ÚdR³9ĜáÉ+OÒì&UO]^Ş×rrû‹ßô—Ŭġîúĝosož{ıü?œüÖ{Ŭ?ùĝïŬZ{ütàrğgsNġ¤—U›B/#í.ħ•kìm3Î&8˘ŸiD‘SS’£•7Ÿ:ËÒüQv'SöĤßzÛ7Ss}ĥÖ6xäü£üéç>C¨10Ĉ89ÍnzğÂêî ƒÉŒbħ{”zĜdëò*;ŭ>ġcMĉBö×ì^‰°l‹Ö˘Kçd—Áʐí'·ÑEA£²éòĤW~;˙èm?Ì;˙Ğ7òÈÖ:·}ÛyûwĵŸŝéŸagż˜DˆŬË;„w݁µèžla-úD>$JcĞ{˜ğĉĜVÂ1ğÊ0ÊÙ—żż‰çäQA6ÒT2›x{Âx·Ï÷ÜöV^zÛKٚìï˙àwxüÁûÁĞâıÒi‚Ò9E˘ħUH*Şċ3w´JíÒßZĦ}ħÊêŜ>"ô°f³ e4Ñ^Ï@f Z-ħ‘(>ÛJ °ŠC~–jêġĠj(ŠĜßß§( ~èĈy€ĤÙlá~ohl[gN¤Zñ°Œf:Rm•™MĊ3nÉCÄċ`4äñGvÉó¤üŒ¤FHPàye;ĵú$Şë“6,öeD”§¸Ĉ!Ìvj‘†Yé͚µ…Ú*ÁM- &ä³şúœ‚Ÿx"aÑosLuiĉ*9ŞC‰%ı#yòÂlôĥ–NšĦwÇ÷~ùÌü…[n~ÑÊŭÀ{âżíŭy¸üGÎ?ĝĠwşŸzü\csïöîpxډGËi>òr•c‰)rQ9rŠ}ċ³ƒd/ÏH˘{fŠq$ßŝÒ×ó+ïü9ò>"(¸2^áġîy^DUqegÑh„N ŞVH:Šİ<Ż‹PÒK’Áî÷dJwî(ÉĤÇúîÓè4bùĈcT‚:OìÒßŜAµşŬ ËÎÚ›cK××YX¨qùÑuÜ´ÂÛż{xËë^ϓ+OslnžówŬŻŭĉûÙ R"Ğ@$)օ“4ĉşoêMKlcL^àK‡,³ 7Fx­ÁWŻÖ6…ĞĜġ4íëOÒ?V>8Ĉä3hvQ~EQDĥf[m^ŭÊWòÚÛ^`ŻÇ'>üG<üÀƒxŽËÈb¤ ° ÚjRk6ġ ·ĥ ħĤ0ž+†şK§V%ÙÜgrİO¨!7°ÔñÈrÉĉ`BjËRӟjžKçdşÀv-ÒBV‚2?(1L'1–UÊ÷}ßgnƒ‚ŬŬ]´.˙.ƒŝtĉˆ6t:u^xóóÉÓ)ñ¨,‡ t!–ÂÁdqŝüy˘iùġIdÁÔI`¸ĥEġd‹úх’ô—ŒĦJ÷t>cñ&b„çxXĜdqĤ„m %Ɋc']ĈŸx¸8:DO%£½”Q?ĉYAËŻSĦ‚'4Yóħ[.ğÓ}.]şÄtĵm%I%PwW½Úğn8óÂğß÷žßŽŝwèıĥèŻù;w¸ĠsË'îï_yGċwĵUXrÎäĜy*pSğ°¨+È†ô{›Ġz)}ŒÛĉÚëo`w{—"ÊxĊmŻĦ1×ĉç˙ċ{;Ù|Ä IDATĝàÇ?DnÛ<úĝyĥûÛĝ5ŸÓ§O#;CŞaHÁh‡h;£QmRYtèĈŒ6büŞ5ןĦ?ì³ve<ÑtĉştÛEÁÎĉğ[cjŬ:'Ït0zÂËÛ 'ŠÈÒ\<ÁWî{Œ‡\àSñüá‡>ÌöĊ N´ŽàáĦ´‹¨7žB„…0ÍrĤ„Ĵ“îLˆ.ġħÇ+·pk òV-Û° z°ş5 ż3dĵ?e2NGš$2¤İ (µvcižzêIÎ?öKGĥ·½…ĝfĤYD?RĞÖiµ:HaÑÛÚeÚë—ĥ!İ6CR!ë>‹‹‹ ö×ö0ӜŞrdÁâ7ż„ŞWgmm“´()ŝBìBƒT ÊVĞ$ËY™AçRB­V£Z­â¸ö,˙(Ážı­‡ƒñĦáOIA§ÓFIñ à›R“gĊ!Éż˜İzÇÑ,WšŒÌÑġ°µ¨kP™o0IĴjĦJkƒšĦ<18ž].”‹2°NH TıÙÓÂ`ċ9JıĜnˆ)lâ~JQ›JŽŞ*KAˆÄA†°^§1×Ïbc“ÇŸ~‚b:JlÉeßħżÒmvñċ/ğí_ŭŭñÊ]zNŝĠyßûïp?|ùÎsc¸Ŭó­Ó…%—÷ĈSŻoi*ͧpl½Àc£5|j-bÀ`¸Á‰çßÂO}ïOêxÜŝÓ?Á>ȏŜŝc|ÓË^ÎòËnâÏùOŜ}…Ê1VΠߣ^А&`t ΓRÛm̆6kĞ;äC›ùcˌ'}v×·ĦtK=ĊpÌh<`:à/Ħ^­bŠœÍġMâINcù,µN…iĥÉçïż³dhpI2M9˙ĊŻÒ>Œ{bİLQN…ŜZ½íİS€XZbĈ)Ô+l$ ~½Ž ËrĵFĞĵ\ŽCۗHžÑX¨ÙĥBYċ`1Ï4yš˘,‰Ôż˙GäCù Ż~ċĞĝ‘˙îGXŬXżó;y6A)IŞ ÂĜRâÚ6ÊĥIĤ²ĵl4ò\Ïr…R’4:„Fi­ÖŬÀër8ì8îaŒˆ£ĵC„gĦK“5 tó}—ŝî\0ġ Nwħ˜şEDZBàĵӐÏ|RZk„–3<ĜNİZɋ”nI…%\²XíĈ¨^Ĉ|âsÂŞÑĈ)ŽÂ{xġ*ƒtʅ+Oħı·N\$IۖwWƒÚ/Ÿ:~ê­·ĵòÒżŭŸf˙İ÷éıĥè`hû“ŻwŻ<ŭä9ïúĊŸ‹û\ߑŜ†b'ÏIĈ)zo‚ĜŸÒ(ŽÔЈŝ.b2@) Ż;‡Ó]`éškıf8Ïu'é7ùâù‡ĝóóÓ·BZˆ,%†ÄD7£ĠİÓétXż´K4Ô(íÑ~AÈxşI˙фıĉ$O^X!Ûp9û˘ÓìO6Ĝ^éQݵXÉGÓòGċšM^<³Í³ †——¨ċàZŠ<-(’×ö¨WŞ|ËĞ_ÇóÏŜˆÈ ŝâÏ?Wò”çâ×*ŒĤœ†a´?aóÊfbĵ:)iB%ôi°ÎñĈqĈ .n[6‰Ò˜|Šë*tnÀ8Jâş6ž°³×#ÓŒÄ9ĠjµLwÌâĞRKhw’–˜‡,‰QĥàìÙë¨× ċš9 *¤ù3Ğí\—l`iğĴ­­qñüTÛ"Ÿó‘Ç[ÔÎÌ!ZŠHÇdxx뙗5ƒ™§EÉĥ´ƒħ ( ÊP˜Òv` …-VĦ(Ĥ9Ù~ŽÓ7Ìë 'ìBâ$}עÑiaù6ƒxÈêÖ këW:M:­ĈŬsĥŭëŻğéî÷ŭÂïF˙_ïÔ7|[ôŻ~í§Ü–3<ħûäc7Û£Ájcz‹Ĝùô'Bšz5¤Ñl ]‡Üìé1ƒ!S]AzG9zòEĵóG’ç=ï>ö‘ßĊż÷ÌÎEĤ[xÙısqw‡+½>‚À ˆ­ċ)šÍ:µz•$*öĈX¸Dӄ`ŜĈv ñN£\ÂĊ°?&+Úsu,ż`´1-ñÛ>ƒñ€tÓéÌQ?ZeëÂE†;NXeî䉉é=½Î5˘Î[n<Ǒñoò›LŸş„ÖŜÑC;g—)yUqäšy”*:!61‘È‰Š„íŭ=v÷zT]Ċòü<ğ+Ğìï÷nn€²PžíH,ipĝC½QĦĠĴÑhVİ7*TЍµj ×óp×óPÊĤ0šżş÷îğç^,añ†×½žÜô\YáĞ~•ápÄŝÎÑ Aä%@C`8ŽMRAÙîĴmÉÂhÔħ‰=s3.nQe''ŽïâyC­jÓ:>wĵ‰9P´b[S˜KHtoÌ^aÛĥ‘F•íYQ†ċàᢴb:Ñ轄zßâZœvZԍƒ4˓­(ÁÎ`‡§…ÈħŞ0ż4O„ìlí³~eƒ4Öĝ~H–&ÔC„Èo&4* Ë>;;=²½‚jğ^BşYà(hÈ$ŽH÷rZͲ#ˆ/dÄ!^KQ?Zcw?"Qˆµ+LyŒíÇ.0ٝÒ<Úbà6ôŻSôécôvֈ˘aŸ<Ï@ZlŽĥıíĉ[ĝŸĝ8Ó9Â?üoçxsŽŭ­]Úsó$ĜµŠ]ÚúµÎyJžĈ¤Ó £Á>ƒŭ=ö÷ĤL‡Sú½½í}†½ÓIL4‰&İfÔòÈ#pϗïEı.oxŭ¸ñĤ›è÷úLv§¤“ )$Âh+ş¤ğÜ!•ŭŬŒŭÁ¸dÛÜê4ğ-´$Û£2¨z6•J•ñtB6ÛÀ  EQ:…Ó4!Ïi%!É4£ÑŒ!ĴúÌÏuqu¸jO˘2‘EÎèxV‰…PŽÂvlêĠ˘î’ul²†b"Sâ,Amä,óIÌÒlÜÀ?ÔßLIéZdXRà9qħ&ġ2òÍ)ÍÄĉUŽjŠ.3Žd³‚êÔÀ–\\½ÈċġKLâA"tvwh;?}Ék÷[_ñڇ˙Ù;!ùzŬŻoÈâò+ôĞĥscŭä£ÓĠ›wÌĝŽÜ1·Úž=7-rğ’dhß"vrÒ,ÂN2œIŠŒ ĵL2•ı&ÁR5g31C>óÙO³ŝô*·Ŭü*νì|éÂy:7`ÖY™d<½·ƒÛ 05Íñ‹ÄQÌÖúÓAŒĥt ÂP™óA¤Œ7bBŻBí¨Çîî>é!hx4ĉ}äÀ!ôĞ˃aŸd5&¨WQó‚|ĊÊĈi†N$JKĈŭıeX³ Ükĥê\¨Ÿ>FĠâòSïí:vŒöÜ"ŞRE[²pxŬK_Ç?˙‘˙žŸŭg?ÍżûÍ0Ää™ žä,Ì-“ 3.ŸżÄ oïDCH&Y¤È#E‘8èÔĊ“L*Fbá µDâàHÀÂÂHÉ8ŽxäĦGxàÁŻ2×êòö·ÎQ²,gmc•BÄ,[¤3ßf2³{y•läc ‰ċXàİğTš!M´?DS\[àKA- İ>û£1YQle].RàûŜĦÒuäIÔjÚ³nQŒÇc’´ŒbhaPÊ˔`pQ°·?`+ê3rsŠş˘pË×I`yxĈ&5Ù3/YÊ÷³"?œ ĈÒH\×ĈÑ FÓÓ0‚#C‡“nƒċ9–2ĜÍ Y è)—/?ÉĊµ§)ò8iԂğvçŜġÂënşóßŝê‡ĥ>ù‘?/ž÷ì¸|߯ŭûİGżtËz÷½ÉBŽĵÜHĠ÷íJ dX¸n‰c Ì[µ½„|gÌD[䕀­†CĉŒêá>´ÒvXšż†ĝêçydoU£ı4NègšD œ9—ĉİ:›—Vô‡$ÓE€-=,Y–ċa'Àv µ)E¸ ˜Œc²ħÂŞZ0xzÂd’àqHóœt×P +¤ġˆdm‚È\ŠĜ"hù4ŽVI¤!š¤Ú£_3X7Ÿ%:µÀëĞ ˘ˆ³×3ŠcOŻât–8xŒ­Ë›l]X'ígXğgcĵtév Òžç>ò ŽŸĵžïxÓ[8³xš·ĵâÍx}ŭаf$3)–ħ0Z` …6 Y3˘„ƒDb²2sI E’E @cûÍV‹8Š8˙Üuç—xɋÏñĉïz3/ùĉ‘‹ŒÁ°Ïĉĉ&ŭ=„ċaeM)ħȑÔ;U\G‘öGä)VĠ @ĦqĴòë1ĥ…ħ%"/u0žçQùa4ëAz€6IìER­VŞDŜĊqŒö ²mÇa˜FcÒ4e'r÷çĈûĉÖÑv6çĜĤî³Ġ)¸|lŬ ĉ$Oì"ĥFĈfgıÍà…'X?Z%]0h#p U„“á.IV²‹|îéÏq˙…5ĥeÎĥŽ™ˆQW,ž˜Çs]ĥ/oĦ·]tĴ°„ƒšADĦQZà —ĵk“Û>~ÔLİÎ-#÷s†ë+˜vZ-úğ[LÒÎÜĤ°™Ĵ\Â÷ sË'ÙEL̈́<›’bÒ1T*5n:s†0IXĈ´ĵ&ÜÇä¸SÁ)ŻKra;ħ8^é`Ŭ šXĜġĥ`e‹HDüú#Ÿ˘›† Ö·ĝĦïywüĜ?aûâ%~˙äÌġ7PH“=^töz._| CNFŠô$))¸‚ÄŬÁu ÚMۃĴ jİ‚½RYޒͧ„K!Ġù*ÍùµN@0ïaÏIŠFÎ}OÜɏ=@èVxÓ+“³‹Ïgë‰vWÈÌ1&³#ê×´ 6Ù˜lŒqˆK›|^a1ıôÔÍbcxGğRıŜjù“d*ĥ·ĥˆ†.5Seœ$ŒÒ„Ŭh̞­‰ŽÖŸê°?ï³_dñ)llK‘$1kl‚ÜfĠİb0êc)‹ċcÇh·ğŒFĥ6ĥÈ|ğZÂ{f{şÂèCéıe œÀâHĜ$ëH£”Ċv7…q„\[Ÿco·‡Éàló(\1 İ>ËNhsDMÛŻ´hᒠFT¤Ëq§Áäü%vó”SËǘFl­ĴÑİ7éĥÚ\şxa`;GÖ’¤)ĈSĜF0ŜĜA[‚}‘q˙#÷qaĵޤĈû˙7H]µ7_Ïô¸žÍŜñıÜğ“OÒ^ná7Œ›³¸ÜĦÙ­P[\Äk(݊ BTµ‚t2I µAMS²~B:ɘŽR½1½)£½ £í1iœÓßüòŜ4ÎÖĞ.}Ö;żïž÷ıN19ÉÉBÂIH€„9"Ê(¨­8"*^i1*ċzÛĦmĊĥUô *4ˆ2Ër’9ç$çäLujÚóŜïüµî‡}èŝŬŸşeèġŞÔ‡ŞZ˙úŻ˙<Üûċ#|ŭëwÑl6yĊßÎċOğŒ­îíîû/Ĝïlmì G1†ċa&ıʐvJyŞÁÜü~P"7LÚ£1™Q 0§rá8Â1 ×b…`ä:#5Ĥñ¤RDQĞU°,ULĥ­ë ’c[‚^:˘ĞĈhGX‚ĈÓwQ]šAÔ}b‘“É ÂFc˘ħËĤmcĉSO m觤vİFiòv‚;̨€9Ğ̜Weĥ\#.b¤ca•}â"ċäɜ=s†İïšGyûŜŬû?xËÍÏäg^˙ĥôċ½ûŸsyŭ/½ÔŭÒW>ux:ßĉ…£i*–Ftaá9ŝt…4Îùۏü ŸğóÓÜŝŠ—òğż˙[lŸkóİú>ó™Ï"µÀ/Ġˆ“İC ö,âú%Ö!ŬÍ ŒB!g6ÒsÉ|hZ>^*Év†„£[C­ì˔ÔÈ<0 ÑR˘ ıDhkZĤI†P?Sš ‹!ċé:ġ…iòËf(„EJ”ÇH•a „Fç6pÙi`bŜD07È^ŽÓÑL.{ĵ:5aájMħšĤggYŜXG$ŒF8BĤ–ĦŽ”,ó޽ċÈŝî_Ĉ÷§Ÿ˙_~÷o3—·üĠżwĠÁ`ïríê"ßádùM§4“ÉÈNĈCÔ°KĈÔsEÓòħ„Mċ ;#òĵÀžŞRL$ƒÂĠJQ5' ™+Lmâ('³éŸí1<×%ÜQ]˜b~nßñiowéîtħµM`—Ažg·ž—ħ s²Ġû”C8à–YHFĥíp 2ÇhğËú΋êœS;[è¸`Ż*S cĥó1R…vÄvqz6‘½§)vàRs;Xµ UÇG¤F>ıHI4 t’ F„QHĊgÄí‰ Çb8è3îö‰F ËbÔíĦ˘‚ç_˙lšA…{y‚ċc琽‚×ĵUĵòı?Hµxэ/$\sâäYœÂĈV2W ĤSĊŝÜài~ƒĴ?d´Ó!(UŽË(Š Kˆ„p0˜,*S!͂¨ħÑßàĦc÷c(“½àĊşr:k6×·ÑäTgK”f|üÚÛë[DkëhËÔl‘DŽQñ°ëeL-omcFšĤ+˜nĝ4ê†ŭ>Âx’n—bPĞTײñ]tca4DÌú3ó ÜC3W/ħĊ€aĤ!ıÊĤĈ°Ĥ#ŽÀ0í {WHrbĥ”&:"RXH<ò2s2 ‰‹' ÇÄldĠcĞ×ĉè2tÓfµ´\uí.Ú³ç]/{á‹îú­_ùÉżĠüÌ\Ŝ'op˙ñO6Ġ·İšÀħ—–ÂAê=ĥŜfÖJee(zÙj´ƒL1ۚî¸<4ȉò9%ħš>ıXşÀJ Eą#|Ë!܉&ʎĠ6• ÄôBƒÚƒnµ òDâš62— ×BM8I“@3 ĊT€ÖÔ¤‹î§ĝ™À-U)) 3‘ÚĦjÄqDY:(bİɵ bx¸…É8ÏIı9 Ž(2Éĉúj˜ ¤ğ²E´ÙÔ Óœ0¤´IemġHŠ İ5eT*énu÷ğ8ÂÂ(;4f+ôÖ7°[Ólµ{üԛ•ç~—^p%›G7ùé7ü8ûwíĉ7ŝ7BĦ}ˆ}Sâĉw˜B™(jŽÙ\ïòĞ$eƒ0Ê)7Şxƒċ€9ıHUŽµFuÂMÉ"ês5–öì!yüä)îŭ½|òŸĉ–g>_yë[Y^=Ç'?÷QÖzgH³îħ3XµŠ(f´ÓĊ,ûTçç Ê>Ûí!Á-µ–Ċl­A‘&8JÓ´\Îefé¤*bM~—–àÚÖùöuĈ”_£&¸EÌ%]†ŜWçJÂ'$Œ"Šñû֟˙ĝžq޸ċúÛ§zĝÌË£T¨Ŝ˜Şċ2—uY„—ĉ” AnÛDġ:qĊç\Ûe+íàìĞQ;8…*k {ò&ÖIJßT¸¸ĝİĊĈ£dk!äpà˘=Ĥ³2)â Ëġ܀"Ÿ0_]×%GĦôd²Rk=阓چ–Šg”Zĝħd0Qĝ.eÏgmeµ^›ĉÜ ^‘³Ŭî’ċšJİ‚0JB´Î'mԑ&j2n_HLßeñ0)ç‚ÈĜĤ…L'#ĝڜ@€a ‡fÙ'× §ÔìI6ħ ;ĥ§ŞÔ÷LÓ%%³ Ú½!(Ïġqµ˘â—xßżKÔ2 hÍÎp×}÷òw˙ĝaòj@‘&¤:[Rİú´´ ĥ1[Ĝô“:i޳0OlŒ† ­04Tì2ŬQMĈŬ4§ zCŬᘒQ…&lwXÜ!ŻÍkıĉéWñèÑûùGŝŽSÇÖE–§ŽIP ˜š™&Í3ş>i704F1[ò™ĞV ͘ jôş]î9µ5Á:¸6µj‰VĞA­â“ċ)£ÁÜrıhïQrÓâàW°V–|s°Á†È¨š§‘–rĵ 1™%²Ì !n”á¸.Ĥ°P‰Ä‰M*ıKıpqr“]= Û0ÚÂu]‚F™Ä–lŒÛlÛl>‡)H}Û:2U­Ŝñ´Ë:òŜù_âïÄ}üyŭâ‡~ÑŭÈ}˙t ŜzwÉ×ŬŝĴ_zë7ĝ£³[ÂR&ƒ,f#ÂŻciš8NèÍ×Ymş¤ŭ‚a4 S ^ĊĊtMr™£,ƒL€éşP(ŒH­ 0FŠjıDko‹Íx‹lŒgz8Ž7›&Ĥe  DRœç‹h5‰w0p%ˆ´@‡ ›'ϰşAg§CğŬeeg›qwIN; ‘•iòBĦXROtENp)¤B !—ĝŽXÚÀÊ Ì Àw=T^0ù۞Ȳ4‚4Ë„²L´i`ĉ ‘Nx"…ĥi£Ò”ĞĵŒŸùİŸ˘lÙĴŸ;GÉ÷'ğ-Žƒ!âhÈWżúŻtzÛôÓ!üçùû†n¸Ä†‰,Ĉà+ĵÙĤŒòyÁƒ¸R! FĜŒ‰”ĤaâĜ.Žmf=J —ĉb‹R½LwcÜi¨ñ:I‘ĉĊ)ÜĤÇ×îù*_üܘ ĤùÑÛßÈŬ†!ĞÔĤ*Ì,̐˂ġÍŠ\áŞÂ6) IQsñçë8•Ĝ+Ğ 3…])—ÜÀĊó]¤.žÉÏ.ÌàÌDs&ùE5vĤ'£.cUàšĦĊDw˘&ÚC(4Žaàı–vCêJ‚‘ÁTá1sœ"¤µ’>²0ċßqĊîËîüË?úŻ[ŸüÈ˙ÜiÛ˙­‚ËĞŜû£îŭۏN*ĉğSÛx]$‹Kµi{=S8k½.Q‡µÑ6w}ˆßûyúÂr|ĵr™êTĈt Ï*‘Œ3r³À™q°mƒÜ!,Ì=Uì]e¤’R£²„²°°-Ët‰zq/CiMcW“ÈŠç†gcY(…Q¨ ™Ŭ0À²QiŽc™8hšŽÇŜİ9Ü\·‡”,ÎC–Ÿ*†iΛM ­Áúl9ާĝݎ3ÙÚu,û)´‚0 Ÿúܲ,²,9C0Ï3X™Ô€äy âyzÙ·›żŭ¸A‰,M&‹x(†£!R)ÎĴÒíôĜlݳÓéÒîö荇dBS™oQ_˜F”=..b ‡ġ6ĊzçTÇN§Üì°ù)6W:Tgĉq§l7ÑAÊìE3X-“¸£hoHâ×FN&Gu—Ŭ{ѵ §Nœ%äè° ²‰xĴìSiÒĵj–­í.Ÿŭė¸÷K²on/ŻġpĠ•ÙĜ:Ċ lÓ¨,`ôĦ}v“4‹q–Ê”/¨ï.a˜ŠÌĞĉq`ß^˘ŝ€K¸„—½ñĠl݈o{€~oL܏ıvïeü³^āÖÑΘpkHA6)³¸“ÉÛ\iP&ä2’°Q+f¤Ç˘[§é”ħ4–APĞ:ƒŸxŒĠĠ³İçˍRé]ÓsïzĈ5ϸë½ïü‹äğċŽ~Ï—_ùèğÜê3ĉ÷>28uġ¸$ߑâĈP˙Laĥ31Ù8ŭNĴœdı³Âò`µ¨U/ËáĜX%¤aNs@NFiĈV* ÉÈ]ˆî˜ĉH2 Ĉ#LħqÈGŠh'FHMsF”1v,”ä*ǒ O \ÉDäUH, ânĊj}SÓı&Ŝî‘ġCò0™ˆŞ„À÷}j•2Aàx.ĤĦɲóÛğLŠŽœ—zċOÁšmS µBʂ ÏKÓċS'Âtñ”Ì0Ì'ŒßĤ?ŭ˙,Bò\b™‚‹ Z­°ħÎE‡q³n˘ZŻħ{vS‚oıÌMÏPV‰³˜q<Ĉ²LÎ-Ÿ7“ #š²RÖ+ɐqŒÎ}ŒZİXO:eEsO“RŬbyŭá9)'ŝ<PÈ!Ġ™3sÓ(çžXÉmÒ§i–ĜĠ˜fnjšC‡.fn~އN<@Ô˰sŸ¨›ò;ï䁣÷ràÒE~ìg_Ë ½€Ġ‡Îòw#+6k÷âj"›ŠQĥƒ[v ­‚Ê|útZ³ĈŭĜk™żòBŝê_>ŠŜ™­ÍpáÜ>šF‰>Ï9|3/”G}œĦtAŽD.vĉ Fš˘²{`³@™9QĦ˘=|Áó}„g“)ÉV“c'ŽÒëoeß9R ü·XÜûÁ۞{Û#˙3—˙·ëŭâ|“û‰Ác‡ŭŠ÷6í‰c-Ċyĉ…İmTĠR”c'!fRĴVÈ eFbJí`)&Tg3úuÌjakßXAIçò:­]>ġ͇d™Ŭċ2[cĠ)HwÑÎ=ÖÏôB°ïšE:b›ÎŬ!ʚ¸ŠíQ*"*P†ÀĞ•ñ- MIi6%Ó!lĴo“Ĥ98ċÀgff†RÙNJápÈı•e”˜toĉçç)—ˤiÊısçÈó0]çü^̄#ÒétH’dÂ1MĤgZ ‡Cñù½gÒ-ROŭ˙›ıDiJµRĉ…·= îç@š‚úÔ Ž0Šğlmî0ÇÄ2'65#§``$H{b34\‰…m:T…Ġ˘6·ħˆ0ĥ œ40pĉšÌïYdŽèm2ÜÜĈu˘ÍŒL VNkŞÎôÔ,^ÄÚ§İ_ù4Ŝò“?Ŝ…]ÏÜÌ<9/?Áû˙òŭ|žû8³ĥŽxÛÄ. š­2Ž+xeŻòg\Íc›'ùĝŸçñl•ž9DÛ9ċ’M #Y`—ËÌVZXaÁ…½DhNlœ§Żş .;ÄÎxÀÚÊ*íjÉCЧıïôhĞKV(°mLi£G o¨)Ċ&V —è:–0ħq°,§äb”úɐġîĞ+ÇѲHk•Ò‘fızǁŬùó÷}8ŝnĵŻßÁċO?ûÇĉ‡żù/‹m#<7Ĵ·ç²8œËÌÓZ Ó´1´–]h\’ĦË&Ĥ)°•BF9i!ħJ%$ ĥ²1u@+èßßC%Sވ=:w­#Aé@‰FüGWÙż-™·lÛMƒìÒŭlšeNœéP Ĝ÷ô½͂ö‘ÂY–EĦTĤĦ¨×Ğ,.N³Ġ™ÈşF£N‡0 ɲÉHzžç„aHEßғžÇDQDÇÄñäi~ëUü¤ïI–É“µ—˙>èóó9W\q7Ŝx=<üí^—f£Éìܝî&ùò ²€\h:yD{sŽ!Ê΄=âšTm9H‘ĝu‚ÙY\Ób˜ċ†²|ú, 3ˆÁġ[$aFn™Û5GıáS+§×Ż ¸òâëĝñW˙8żÒ—£ùü£_ç˙·ôĥvxĠ _Á•—_ÄâÈCÇyèähß`Ï%pÊ+ÇϑĴh”š„×›l,†üÉŬOċ›_ól~â%Żfem‹ŻßûMîßyˆ°›Ps*¨Ĉ:ĤT-aZ‚ĴH92>‰ċıÎn^`—Ħbù`HĈ._X“uĈ˜í‚%£ÎċSûhà2Új“9b"Ş÷\ú:ağÓĉÜú2ƒq'5M}¤V޽wßÂS‡Żnċ—~âß'ßÍw÷ğşĉrûğ_ê>ž:Áé•sÌ5fxŜġÏfiñĈ;cŠ8Ĥ;ĦïĊ£!À÷ÑLž™ĥa[.d2É)Ù²cogìÊË\ŜÚÇEÓğ° E{g Ğ^Bĝ6ŭdÌòĉ*›k$Ñ ­{֑½³Ów\¸xÎżŭ£o}ö“_*ÛƒïÊàòûŭ·¸„½ĞnïêQ‹w Evƒ˘äjG`šÈB#Ĉ´] Ç!74ıĦÁ5İd‚ F7Ħ4Èi&^TvzTÔħr£@šb“h3'K T`bÏÚ¤Ğcd\5قK×St›Ûğ<ÂR‰ġ \ÚFf{‚9–ĴĈ C… çvN“+ĦaÌV[ÌÏÌħ¸¸Èe‡pzċ a—ö°Ï`4âä‰SìĴo {2˙b[çAD ’dLżßĊ4Rĉô[à“̏rıLµZĊ÷'OQ$”JĤiPİ”I’˜$‰Ï3`Á4'ÉŞ”ê|Vc‚äyA’$O|˙GÇۀgß|?û³?CPòÙnw¸äŠËiĥš:t1Qšâe3S%—^rzc™­íuFqFğÛf8è2H“d£v4AÙ§”¨·ì[œ§fjž}Í%ĵç×ßÌ|ÜÚfsk‡­ċuTBğĜİâÊ}xáÍ7’ŭêç\›_˙ı7sŭÁĞéwzüáżŸ?|˙ĉe/?Ì;ŭ7xŬ ^ÖJ›{ï}kqšéköÏBŒÀr¨›6*KˆÍ‚ġdȽgsÏÉ£\Q𘗽,-.Ñîî ûH•Q/yĉÔT_ÙÂĊÈ2SĜĤ‹iıH £ÍN¨X2›\RÛÍ.ż‰](˘xL”ĊU0‰XŬXgk{+Ġ2]:ĉ{Z­w]şw˙]ú'|œïşàrëşÍ½/<}xŬÎß=ö‚×%Ĝ—ÊÂô\!EBj:¤„B"u†]HLU …BY‚’8QDkÍ3‡/3,ŜÄìğşC qÚ'“9§Œ•iúĞ…ÌVZÌW şí™2°”îĉ4ĠšH§#ކ‡%ĉĈuöqé‰-ZÛĞÔBÇÄIL8÷úxžKë‚]dMŸzÓ§>]5?E¨à×J¸Ÿœ% ÜÌ@Ĥ’,Îv#òä§_ġfnşèı<óÒېg;tNmސ%§îaùŠĊ)n½ù&*²Ċ{Żċ–ë^ÌLsž{=É[÷|ċá/ó“żü£ĵû•żÍLešS›gĝŝŽ5VĜóô2'dœì`;e˜ÊÁ–U³‚•¸ĥ Êğ|aċÜâöLMóŞ›_Ìu —oF´×ûH[ÒÄ"ÁrRE˜lQ&ê úۚkö›³ìqêìj6ÈÒkŬdı„*—YÉ"ŽŸ}‚n# ìâH³dż}ÏôìŸ}ŭÍGïĝµ?ûž ,ßuÁċĥß}qeğ_IùNi›7jǘQĤ°eQ ÓÛ´£lò‡î8XöD.@Ħ‘IÁôvJíá Ì£+ V7XŜÚ`˜(ʁÇÙsäĤ0'E5z’è܆4kèK<Ö·ş¨ÔBdšl4Ĉ4,ĤKY&.ú˜ÂA üŝĠï€ÈÈU-!ŬğDci7ċĉ4Óċ:ğ+Ó\ħç·ÜxŻíkx΍7ïOŠİ…TŒ‡!ív~o„À";ß664ë5 <×ĦÈ3Š­ö`‚;Dşî½…h­'µËbşĠ˘R° ƒñxLĊĜއ0-×Ċ0LÒ,›ˆ İŒF˜Ĉägùß9ˆ'*óJRplÛ\wŬÓİV+ô‡#ĵêjö8ÀÓşŒ={&pq/ Ùj’Y’Ġáíh€èŒIûcFí>qwȰŬ£ßîR$y”’9‘NŽF;ßwyÉÜĈE‹ ”ĉÊná·fßŝy”"TˆëyŒ ÉCk+ÌĠKÌ.ÎaıŭŜˆċ'NsÙî yÓżWŜüR„-ĝ§Ż}š·ŝÁoòàÍËwÑ1BĈ"£Ôj `N4yÓͯ◞÷Fnżêı̔§YÙŜ˘&¸Áp0ĉĦcGyĝĝTĤêÜrë³ıp˙^’v—ÁV—’°yTüz É6#…ÇÁR‹VıŒk…I!Ʉ"ĠŠŝ°Ï#=HӚï)ğŝîıàΏüÙ·>÷Ïw|ïŠàòĞï‹;şÒ>¸R—·j!~µpŒëÌÀġ£,²Pv€È í³×ô)òœÜ(Ò<›\<@KE \ŞÒĈ Ĵ¨ÀĈ@U}ò:ùyÖĤj(Ëá`FŞ—#Ĉ3ˆYIĠiP-µiÁ ß£ż²IÔΉVbÔÀ&ÜôÏDÈ!ô3MÖlÒ%:‘`g8¤Û²µşA2J¨ ‹l<âÄòIî>v§|Œ'N0è8·|Ž$JħLÁpL8ŽÑ–aßcşĠÄ÷]\ÇA9ċr‰N2Ûĥ'. "'  Ŭï3Ġlĝ.B뉖"/JešSSPH CĊ+"OĠW&tĤa ÎsDž,ô>éç7ı=oòt 1[ÛôC6·ĥĜÚ\ĜÇétz $ív›n8ěbĠK”k5ìr żV6=EİĠ 63EsvmY”ŻäbW4 àĉkŸÉ‹ĦrEbĤ,VšÜpÑċÜ|èjì‘âôñS;~œ‡Ž‹÷~šìÓX˜fĥ9Çŭû¸ò⋙Ÿšcçä&ïùèŸûk^÷P“Ž’˜ Ï/‘„ݘşžıŝĵĉ?B1’ùÚ}\{ĠµĵäÖÛP½£[a¸;阣§³ĵr–ùF“¸éY\ĵpKôC( ÂíáÉf€KĞ‹TÏíMÓ"Í p”-XŬ^èGqHÓŞçi”*w\sùĠwŭċûŝ1á{ô|Ç[ÑŻxß+ÜÇóöa5ċŭúXċÇpŜ/—Ë1éw8ÚĊS>3y^üĵó‚‹ĝğŻ~–9v/m"µĈĠG˜d² %İ ş ÍA”ĥÀ·h—5ŭŠÉ@Nä}Y1AKz™Mş2Zî GvĥÉÌ҅”Ĥw! EuˆÖ7Xr§ñS‹(,§)B²X Ôc$&˘p(.˜Á¨WɅA4v*Ŭ£È(l͕W?“BfxžMŻÛ%Ïs†Ŭ<|œ$I‰ĠÄÈçÚ&eÏ%‰Ç­0…f˙=lvvvvPjâיÔZÊċ2a²Ġ²w×"–ĦÑyNžçlwğ(L*&ußÇ0 :ŭŭŜaĈ¤£…ÀâÛÈxĈSvÁ';HڜìGmžwë-xžħOpË­Ïò+Ż"vp½0Ÿŝ Ç׏ŜÇŬ돳Ĥ†”K5Â0œx¤¤È&ó9BC†˜ħÄôŒÒdâ¸j—xë‘÷’7P·Êĵ÷£˙'-Šç^÷|öÍ.1Ž36Fë|îŜÏñ˙üĴġ·)rĊÂìû÷\H>.lġÈĈ ƒv—î҈‘“Q`†“Ş O9ĝ‰Á.áo~ĝŬH_żó^fĤñj÷Ÿĝ&íd‡~ÚáŸĝ<ƒ8$QÛóq……s~×ĴlÙĵôÖW1³8ËgżY>˙éÏ0ëĠ¸ ´‹Zhd—!³\&úñ•Í6·VRÛ6W§\qjnzî½7Ŭpó]oŭÉwÏ–ïhpùż>ön÷S}e×9{p@5ŭ·é‚:ʽ˘âŠ4‰™ĈÇfĦş€“̖ĉxÙ nÇ?ĈÇîŝ2_Y>Fè(l×%0 l 2Y°í9xINKl!ž² Tžadטh/s%QBàĜ"3È: é(Á:Í`€WbnŞÂ´•²ß2yŝ…WŸıë l5Ë´m˜6‹Ş`´µI*ĤWe£r[*]d¸ìsjìr”ÎèĊCfŬyǢĠ¨²ııÎÎö6iĈD²@Êˀ²çb[Û40…fïž%–7lmmaPİTp]—0a£ÑíxL7êÈ<Á‚ èÇÄiAıŜÀVžç1Šb:J‹óÙOiğ¨â[­hÓ4Ñ糟'żN¤äûR^ùC·377—ż~'AJV'pĦTİF½>Ŭn—ÓŬUځÄÚĠ LrL!(ù6Yğ‡Ż½Ž§Ġ.Â-”ếWâÀâfÊ-Èà·ŝñŬüùû˙šfi÷ú7ñ’¸VTèġ6ĝƒżĝK>÷µċĝúitĊBT<”ÎÀ÷˜™›Fϛġ29ƒAĤ_e”ñĈŠıÊ4û/¸‚g]}={êó<ĝ{)<¨\<Ë|üÏùĉı£´Ó6PJ" aÚH5ÙĊ2GóĠ&ŭS+£œ+ĉöF5Êi–êk„]*SĜ.g6Ö8·µAġST~dfşñŜƒSÍS?üŸ}íËߒó=~#ÁċÇ~ïÇÜ{’ċĊ‚÷ĥqÈ£lÉÂô„²0‡"-¨:>V*XĴÏòŞ—½š‹ĤòÍGîŻ?úû´IIj.˘ìPd9dÙùz€Äħr%‘h´e „Â,VĦñ´A– '˘)]lÓrħµY8‘ÇÖÛ¤§·h’="ĦܰǷ0Fg:0ġœKÙ°Ö8dÖÔ‡Ttr¸żӖ ”Jxx\â4™-Ld“ëœù=Rİĝ $~—ééiv-,q×7îák_ğË-#ek›,ÌL3ĠŞc‚<)GŸX£ÛíbۓÖĥëşÄq8ıĝiÊ(UÌ´jĝŽĦ'ĉî`„6Lfĉ—ÈŝӘÄt:½ómh‹4Mq™É˙&¸<ı§ôäŝ’6Í ŜQFÌÏM333ERH–vs͵×ħħrİ Ï%éáÚ&RNĉïžÉùt]H’QˆkÛ$ˆK/ş˜ßùßá™ġ§cab 1´ BÑKBˌŸ{ßoÈcÈË2¸âÀ!~ä^Î ‡ċÂÙ}˜<ĵ|ŒOÜŭY>vϧèÙ˘á‘Ħ ,ğÈ0‰5ċÔàúKŸĈ nz.3µ*/ĝÊîf£³ÒÁŭÜĝœgóħ;˙‰OsÄ:FĝĈX ´Â2À², 4'3-œRıš“­wĜk×9ĵpĠÜ$îÁĥÁ2ñKŠqÓ9½²Ìp4JkĠò‘Ŭó³wìß³ûȟÜñ71ß'çß´ĉòW_ú18µ–E˙Ú¸nŭĉ@&7"™q…cĞBà¸>Ĵinşì^˙Ò×róÓodsy•{ïŝ:íá [í³ÓŞc˜ÙùzLı\ĦT*a‚rµŠ–“g“O!Ûż†1aŝÊ˘ÀuLvvĥèġşdEAœ¤´ĤĤ :ôÖV7èoïD1ÊÒĝ3uj ÓäÓ.ÎT]qˆwW‹ĉĦ=DU‹6Osσ°3îRĞ–™­µhÍ4ñöztÊŽ ³Ayı]‘Sĝ&YËÉ÷ĴŬÇCw>ÂŭŬcüëGxxë8TR%AĜĜŒŠ/2˜+jüÒ˙4´yçgğ–ċx¸Á‹vß ƒ?Dg¸Mñl›˙Iîï“TKesËÁgÊĞne^UĝÀWßħ“ ·ÚüÙ{Ż/ÍîêZûÙ9ĵ9T£B+B+"”n!!˜œŽŽ`À€ ĈĈ` X`ƒ$@ ”sjµZê¤Î]]]ıêÍiçt.JĉĉƒcûĈhħ˙€}3Çú­5×|èÚmÛB$"+D‰eB? ò# t";@Œ–cż½-€$)ż™)ˆ‰ˆ,ËJˆ$Ë(ĤN"C, h)IS°=—DñÔ›†6ŝĞ·ħŭÙxlç³úÖñş³·qpÇÏ8ÒĴà(2~Ëg8Î0Éyòċ2gžş‘ÉǙ™š |ş³S³ôÚ‹d×!­I¤LEq<Ÿ „t€ìÔ)ö193‡ç‡ ŽŒ˘ˆQè>s•6)]f¨żŝRf³Éäô,˘˘R!´ÛX–C6S¤VĞ£Ş*…BQЉ˘€^Ż÷ÊùDQ‚Ħ§0 “^×&"$ĊGBĊq\.şä\zÓeĵx`GŽWıìŠ73> RΈIp“ϲ™9~‚§íáÑ/a™!zlu’PS$½&‹ħÊ +wÈÚYìtBħÀĥuŻÚ3Że,½’ Ì6ĝÊħÛxbzO/Œ/ZôĞ*zaĊ*â†1ZĦ¸áò;ô‘T Ä 9}ôlښÈÜl…ß?éŜîñš§\·†NÑâ–ğĈSûĥ(Ħ DV4dZ˘ƒĈH˘Ž‰ UeÉe\d}ß8 QPQ´,N ×Á‘ĉşUö?€Ú\r™ìöĴ™ú†UĥïĞ·;ü­˙ÖÎċó?ŭ -93½rRhŸžèâŸ+npèËù(ñĤìCb4à†ÓŻáMçÏSOró½·²èö k *2ž°4żÄÔì<³­*ïżì£lZ½ż·ÀñŭğhL.Ñ>Z§}tħÙ`qĦE§Ò Ûjcıqœ J‚¸ì‡1KE }ŭ¤ E$S%]Ì3şz%ċñAôBšäËúK¤ó9dmym˜$‡12V3¤5ĠÂ]lÓYŞñâŽŬÈqŠÍc§0b{Ħ˄€@B z–ËlÊÜñ#8½鴉À2otd”R?'NLѳ\Jù<ĞVŒ`Ş*v“^ŻG-ó‘Ï8y>Z­e‘0t$‰âۋ5E’_ wŭ?Iâ0ôA ( ş#J I"^âù!ˆ"ŠĤĦˆ"~$GÉrÀTìÓhV_ıqòħz>‡íbiq‘ğ^äÉgžĉàÌLOÓômôŝıŝ"fÖ¤<\"VzVŜÔ<%ßà½ç_Ç)+73]›˘ĠĜ?µ‡ŽìĤwÑKiòĊ:L­`iTU! c`ı#‹mŸ(Š“~sÄE˗8ñE@Q£•›¤/X4 EQˆ"SÏáÙ.Ä'mÚÄñét;Uĥ]y )ĥœt2Kġ‡Ž£”É!#ÌĦ½ĈdµJ,)Äŝrp˜nêÄÄx I‚(ĞàjÄ]ħîsV›%Ö‡ÉË&‘ë³l’Éċp£ˆ‰‡™[˜eiqÖKbogÑÈ}ke˙š½çŸá‰Oż÷/ŝG Ë‹¸|û_Sï?´cìħÎÁ5vżt£Ÿ¸[–ŻKħ(ȅ4ĠFÍ-òĈĠgóáóŻdab?7ÜòWœ0’|bĈ!RqàÙş–F7tߢîÍñĊŻ|…[µq>óÎ?àğߍ];ù÷ûÉöŭI… VĜĊ%ĈÀ–ŸGb"a(*ħ!Œ‚Àb0$̜‰–ZdĠòéeNŻ#K"Š"‘DŽcaÚŽ'Ĉ –'sáĊWsŬP‘FğCŻÚcûŻvpü…I|MÁÒÄ̒â.I"}á A×$H"ĤĤĤ P$ !N#$YZ˜Çn×°, EefµÊÎĈĈW2<ĜÏÄÔ,Íf“l:ƒX½ëÒ„Dâ8Ĉqœċ.% Qċċ:×u—[˙a’CB$ME7 p^YCÇÁocBÌl§c£¨Úrr=0b”…żşçÈJÄîŭ{¨6ê4† cw{TB›¸?ÍPi€j‚ß ˜›oóÉw}ˆÏĵçIáÙ]ŝċŝ‰}ì„StŠ+ t’XaßÄKĞáÑ̋ĵaókùŭ³_Gı0@ydàôB #’q#QˆĊS×z!™LŽ“7ÊÌá9~şŭNz]ŸĞ×_Ä'Żz;+ùÚßáùÙ}D*éV Y• …€Àó‘E)‘ˆ£„d!@êĝ”5f‰5ÙòjQ‚H–hÇ6žĠaz~މɄëeMc{üWòŽ+/Úf½Ú&üÔéÌċÏżŭí9ûĝÖĤâßĜË kêAo,ò|=­ˆ‚ÛOŻdÛ)çsñégq÷3żâög~˜7qe“† 2Ĉĝ‰DñòÌ$-é˜ħŽŬĥwv˜Şž€ĦƒĞ׳v$~˙ĵKĜ”5ĜûÄ|çŽ;°ŭ'Y^3#ĞD‰„„„,ĞRgyĤ Ää‹yJŭ%TSĊólÏAìĝë;$ĝJŒ F‘G‡hZ‰“ K9ÎZ³‰ÓNZËB{‘P| ï'0³9҂F_ ³VïCïE¨ÈĴÛr ­V“À·Ñ‰‰‰ /¤Óìħ˙ċ´-SU"kjËĦO)I1ÂŻ]atċJŽOÍñòÁd29ûûˆ#Ïħ¨Ú@’6UTiÙçG1£š (ĥçùŻ l!Š=’$"””ßÄ]ʲĝ’eyy%-ùxĥ€İf0 ™-g£ëĥit,Î:û\N[µž5c+uéĊyܞ…ŠÈžœx™cú+²£ŒŞ\ĵċB>ôÎ÷²{iÓ·˜¸ó #§Žħċâ³ìgĵo;²xhúî?ñ4KbšáĜ`V&NsÂ2ïÔċzžl’M§h7ĞĝIˆİe)Fy>s͇ıhŬk™9ĵƒ9ËfÓçm[üàg?ĉħ™Ç–ZS¤ŭ˘´ş­H†¨!„"~7Àwò³:Ec•Q`4•§¨§Tt‰DW˜Ş/19=IVñD‘YU&ršùĠóÎ<ûı/ŭŸïşüĠ™¸\˙wi3ù­G„ÏIQĵUˆB=Q!Ñ4<ÛÇ4Ö­äç½Kó£‡ÄÎÊŒA\+&ñ"Ä$&++„I„ċ9H‚H^K‘4=*‡féÎ×,•§GNS³{´gë0ksÙİŻç˙àÈc ·üôVîŝĠŻħT.E8Aˆ˘éÄbA(•J †!³³³´Z-$I–½’&“-¤ÈdM!D#4C#ì†ù":.ŽŬ&Ô„8!hı¤; $‘$‚‚ ³8F:É´$ Ibşš"1?;G·ĠÓħ ½^(à9=NZ·†SN>‰(˜˜œ˘Û³È–J”M•J£Éác'°BİŒÄĝĤJô‘ÀqH›*Bĵìs‰/HPM“Èicši;@’äWܸŻhà *â+E‘Y1MÏsÑR’ĤU³HçR|ä†wĦTvîŬí% †û( öSïĥİÌÎv-VgÙ9{ 7•°ħ´šoßĝM.<élà–Gï䞗`Ҟċ†ÓŜÏŻş ‰8ŒÈĦCìpçÜ£üÙ}ߤ,–eŬ] C´(Ħ苤ĵˆ†(àXÒy1µĵš[댜³êLÎÚrUÑa˙ÂQžÚù8Kí:QZC$/!T’$ZĉI ²q'jzàÁÚ¸DÁHS2Òä5“B>‹šIQġzÌ×*=q„V£îĊq¸½\ÈuċàĜÄ'Ÿ6óG˙âü—ˆË—îŝ’öÀŜ§GвğF.o\ŒŭsÄ ÒġD@–lË'#¤¸ô´ ¸üì 9´y~şû~JĠMhϵQ³9Œĵ‰ğ,ÉY#…dÄ­ĉT•Öl 5Qɽv %4ˆVu‰é€ àEybßä-Ż?—7^qLŽ{~y;ż~à׸ħšOa½´ÍàÀıT–nĞGĞÚ"ôB„D&‰bĤ\,Q(5$ iµZt_96$1°B)cÈ"–Ó!Ñ%Šċ>âN€ŞGŠJL‚IvÌşT?ŭ‚‰™HĴ:é$’8²ÚÄĦÏìô |‰…O=ù4M_Dˆ#òiC‘‰˘/éÙ>"i5ARul?˘g{(ŞŠ)DOè{$’†”Ęş‚oÛËĦŬĤ‰í(†‰!¨ŞŽmù‹%TUĊ0t4]˘×ë1‹Ë†9M&•2ˆY‘(‹$IDÇk³w÷1şVˆ:(لñ“†9óÜ­Ì×ôuT’ Äġ}ޝ&ħ D1ӝ:'˘.şÇŸ|âñùOü)àƒòĊo~™3.y-ïĝġlÉm!&àñŭÏmZ\´ú ûĜïNî›ŝ GX˘+&ĝވŬq”ò\°á,ÎZ{kWĴfaa‰Çw<ĈӇŸĦkFt=ë.|ï8dšü{L-ž :äˆAM{`ş2-ħƒ ‚Ĥ¨hħµ‘÷ ò‚ÉÊb~ù‚\RÑ4 #“Ċ!brnŽc'&qĤ' l/¤R_ĜĵvŭöïŝÍ­ż£ġŸšı|ïŜĞŬ·ëÑ­½’|c×PÖÔâöXżkè"ÑH"°l6VŜË߈1ÀÏoŝ9?ëŝ’ù5ˆs*ġ£ód]‹|Ê&ÍÓÉâeDşžOʉĉ[TÏA+Ĥp+VĴĦVé.-`-ĥœ8L"Kĝ’K”iñ‹gâáO†‹.äïÜĈĊםͷŜÌSğžAÎëĴÙ° ×öX¨×èµ,’TEGŒ–>é“L)Cà‡ÌLÍâ6-@AUdAGŒl6l^M$‡$šÊâ(àĜŝ2ъq׈%0Ȕú8mŭ) lÜĵ™‰Çxŝı§°Ĵ.­V‹ù™yçĞȲŒ.›„‹íĝt:ċYŒôx 7ñ -•Ħ¨‰ˆ¸d29úKEŬ@ |ÛĤżżŸÒÀÍvX”(ôz63Ó ¤ÓDQDQdâÄÇ÷Ŭe^"IŽÓíµéġş¤RQĦfÍ:ŞV`ċê5Hù˜–]cħS'ÖúG‡9ïµ[1³žŜħÉGé6[œÚäƒ<^Ŭ%"â´×lĉïĝ6­ŬD:S Úì˙úwܵë>~ïoáâá󀘨АĠF˜²ç EY!j\úĵëâ·0ıĜä‘Gwñ–s_ÇÚmĞ843‰+µQÁِ^MÚñÈ'ušb[Љ^” ˜1ql!ĊĤ¸üŸ‰áĜ>BÓĤĉXŸe<ӏĴ{ˆ²„ĴĢÈB½ÎħS,.U=/ gSş4QÊeżzŜ™Żyî ô-—ßáúê\qß×ÔG_zbĴ˘ÚkÚn´dĥ ‰ĴGŬ@HÒ V"X"Woş”÷l}ÇgsÓ3˙ĈAé…Î֑¤OÌħĈ‡hٔ•FİÈöü(žmwèt›È†ÀĝšŒ‚A³SĦ³_À}M^n_EE֖/LE A ħ­ˆĜ•\ÍĠ—_Ĉĥ‹Ï%ħÙñôƒüûG° NC@Nd"!¤´P‹i†WŻÂ4,×p*!‚§#K:nââ jÑd䤉-[´qk>R(&6ħ“35‡˜M£"C‰ÉEkĥ°0ˆ×îRڌöÓjב„ˆÚħI ?Aï+ñ‹§£½Á‰RlÚ°™Ĵl‘=²}#„‘Œ˔ÇK (ȲB³ÑF‘e}j‹‹ŒöS‰dE#iÌ2;3…PZ‰İ޸•I:Ŭ=-EŸB{F"^y*9Á£5w;WbÓú-ôĊO=ù8§œ˙:N?ŭL&^|‘—÷â·ĵ““s|çĤïòÜáyF.8™òe˘&é\?…´J£i!k è´ş$ŽL0ÑÙY£àf¨,°íÜ+ùúgżÌşÜ ˆÁŽc:JÈŜêQŝµżbfïŸzˇùĜ|ˆHMĜíçÏŭŒğv=D/ßC 4‚@ç¤ôJóûŸĈíĥĝèmËna‰ïù.9˙2>úƒÏS­WxŭÈ–Ú5Ži6$`İ[UbÏE JB‚$&ÖdlÏEQˤ< fzä› PcÓ8YC%|ÒB‚ž/b–Ëšċù]/ÒèÖ=]·ç2ĈWכƒoxïMëíŸùŻßşsùw?ĴŬùâc[›™èFG—Öx;&²Ä‰b;6Ğèç}—\ÇÉ+×Ğí·qß§h‹b˜'Ĝ;Ċ€2,èô%ràcI*ĥžĤĞċPgë8DX¤úT2#ŭ ÔfÚ´=$AGÖ5TC' <’0–ó_‘e’ŠĊ ^3_;ÀżÜ~Œƒ3/rġe—rŝ[ßúC—òí›ŝáašħ@" Ĵڈ™‹P:Gv]0ġ4Qàı ”ĴLq¤Dߊ~ŞK Ô›í]2 C³˘¨Ÿ|J"ĝˆĤ‰ßġ1Ú!-§Î1żC£²DıĜÇ@n•cÌTç13iÊ£ìŜµNÓ'ÀH™¤Óiú³)ÂpÙżÑhĥ)¨iöl?†’ÊÑîÚËÌeÇE’JĥOOP DĈWf$½Ì„5šlŜúZâĵÂĦƒ‡YwúÙ\~Ĉéì|è.^˜˜âï|7Ğ )~üŭŻSn¸áSH û_ŜËèĝŸĵá~òíoóä³Û9óÌ3ıö÷.cĴŜ‹xä‘âޞĊġztr~(‰2 YÎëÛH:%`ġIí6›NŜÌteš/ŭ_y`%PîÇsşÙ÷2ƒmĝÂ?É[Ŝz=!M>ÏOŸğ‡G'w öİŒ6%YeÒq8ÁÌí˘WYdÉa%*vHœÀkÓë?ër.Ùr.ßzü'Üŝĝ/12iÄ$&B‚xÙLI"£E:R˘˘·+ ) §Sä"…TQitzdÊe<ïŬK_½ÀmÓú˅|úKk×ĴÚ~ÓĉüôÇñjŭ–âòîŻ\{İ=ħ5ìÓ?74·&’¤›ZZH:Z,á´<ĥ”Wñ‰7½Ӊĝç[ŝ‘£DY`Ö#:Úa|ĦGŽ€rì’"!25PÓ4$zÛ£é0 ¤€¨)XÄž­Ò˜µ…<ÙĒ@$„‰ˆ”°lpû˜˜ Ñl7Ó £§ôcĤSç‹7}]Éòż·½Ż|á›ìÙ·—ŸŜñĉzs”Š =9äñ)è•!ˆdAòÈôk ŻĈ•<&Ž \z%ÏDÒp˘t‘ŝátÓ`òċ—ħA6IìR¤Ñò"MĦçğnÂoÇFWoĉâ,÷ß}?nËC‘Ò¤² -+àĜñ 2kúiÔfİö<6o>ƒÑ‡ö-lt8˙‹HĞżş˙>Î:ç>wóàŬ·ñ“ğá½ïygĉëó5Ĵ%‡?ŝ?˘3{˜·½ŭŒjïŭħX‘OñŸŝ9é\‘moı–žz€ŭO>ÇĜ8Ù"Ċŝf—X¨UȳˆŠÄs;wpîú•Ôš­WĜÙ­ÀBÓXEàµqĠ#Ì0ê÷óSŻâ]ƒĴǜĥġy×÷Yjğ̞˜c÷öÈĊ<ĊMĞQ wržË6œÎ?ŝċç)Żc‰·ôkîxŝA&{sˆYß·ıxü,ĈW²saš'öïċß~yŞ&˜"‰g"EĦ̧ŜúANĜU÷èܵï9Œ2˘íaÊ2‘ ‚,˘KŞŻ"Û2b/BYhS” 6–‡TÒĜĠĤ,£ĤÓ8AH+N8´wsK3^Bx Qïé/ßûşsÎ;ż>üU÷UIù-Ċċ/îŭ†öȑGê^£–Ĝ?'#§ôŽíàŞĜ}À‡.ı† 6žÏ#ûž½QÒ>Ĵ—N ½<ÍٙCNXˆ‰T‘ĥjâ:]Q[Úöş”³)/Bh¸ÄA‚§1]†¤Ħé]#VD]C”dÄx™ˆ,€&à…ZVĊÌ hFLÛôşz°ĝ³o“×ná“ïû?üçïóÜÎùáí?bï ûÁ,`1jJĊ<âŒHaĵŸH‚êT 옲^Âò],ßBÑdJCûK´ğŽï9ŒáĈ’NĜñ‘,(ċK”ġa CĦŻ4ÎÈŞ \´ċ ž|âšxí&£7räÈqŞíÍfAȚ ĝüŸš{ïü ˙zëĵñŞ7pŬĥkùËO½ŬS->ññ.v—T§¸öädSĉîg`îĜóä‹Oa‘6Ççpóƒ·ó|í05ĊA  ß0°IP4’ċ(SÁ  vaÀ5(ÒĴ- џÎ0눚„ÇT-‹C3Gè´j^ÛsĤöċMĞVïıúòmµßżúñĞrò[ŠËûnŭĵv瑝[+Q÷Fː×DġÎXJTu]Pé3sĜ=‡SÇ6ñÖ×_Éh*Ë-OÜΣÓ/1#Xä´,¤ĊĤšÈ žGmÖ"!›Çʨ =?DôŜ7ÍĦÉĴ-JˆD›šá…Ŭ{8°/‰(pïŭ÷qÚúaĤfĤİ4ë<Ȝ½n˜Z£Ž1ĵ–‰İiŞ5B@7L6Ÿ|'r2ÏNNsê–3¸àäuÜzë-XŞÊĊ—^ÎÑ|÷=Œ”ÎŞ kAŬ˜8ÈèŠİ2 354Yĉşñ+ĝàċ×ħĤ8Œ·ı}ÏS|˙ĥ›‰+u^wıK·PHÀ şü÷EĵP,äxzâ {ö%zQ‡£‹Ç‡Èˆ°\¤,RÊdzĥ c+•aVCWT°,ÛċXeš‰Ì4˙·ż ÑĴҍş8z@Ñ‘£fwÙ7Peß ˆ:b=Áì)”¤ë†J¸Nß ÒqZ£yÌ.-ptf:·ç:é”ħĞ”*qËĈ“žûû/üĜŭñ·ï{UI~qùûîï<şcĊÍÉ5bVżQóÄ­ŜbU7M£˜@L+oxÍ9\÷ĤmL,Lò;ŝ…g‚ƒd”2ŠŽ1ğÈh×ĤŻÓEêôHPJ‘˘.ÉÔŬ˜8L('<²‡à€_4é䨉*ĥbXC”$¨ ­dÑu™ëY$A@%@€–Q³ccôZfWñÚ6Z˘ ŠIâĊ>Ċ3úÉjiš-—£?˓÷lç ^Éġo~o¸ìüêɟ²çĜN´—˜9tœN£ƒD0èö|ĵLħJ…2a2}tšÖâóÙŻ°Ĥ´OR=ŒĤ¸Ûz _Q6÷3Żw9¸— r ñȤt‚("#ÂHÀ Á·\@%̛<ĵç)ڍ%ĥœµ…Ïlŝ$wüâçüxî :͘QBY5Ÿ¤éÊaŜ Û3!Ħ— ´ ݃˘0’í#£4}ËX²-Ĥ[Mfçç819íEQrĴXVžZ98ĝ‹Îıh×g?WŻ>ƒ~[qù?}WûéÎGĥĥRâR&³Ĥ½T۞žò$Írxë;yë/âŜÇîċĥgï&êÓúö-›h2êäq@Œ‰Rħ”Ħš-â9nÏ"¤„˜œfÇ1ıġgqÔï1ôHDJžƒì·ħDϒÑuòŞŠ$$Q„bޘ(ĞĜĠÍJ‹JĠaâĈé˘Iq €—İÑb‚hd³÷?w7îyŒ·½û\sí[8ğŬċáûîċž;ïBpE„”H+èbôç(ìÒô:6•İ V£ƒĦçÈêiĴJ‹PQ‘²!bN!I‘ˆ Ùp€Ä0P¤˜Ülƒy—u²Éë6žÄĦaßâ§f²ÔKX]ĔΚ͉Â?ğ˙!lßexĠ %&24şQH×í’Jë$ÙH2‘ç-h9=öÜOżLĥX Öm³÷2…–‘Á,Ry“ò@™fğÁ‰‰#DIˆ™2¸{™Ŭó"ĥç% ˙ß"ı´şšó3ü7żÎ#˘žGlF´Tûızè^Blêüóż~‹í/=Í{ßĝVŜñĈ·bH%ĤZmžxöQÎZ·™ÍcĞPt•S/ÙÊögĤq†ÁÒ,ĵĥKħ”Ç ÜCVK“4ÂĤGż”ĉxċ÷˜½•üòı‡°kuÎݞNß@?3yä$¤T.@×Ħ×èĦML-M`ğ8Š„$I¸mŸ¨’êİĴÊ 0’O£{]!Œ" ™,ħ¤°Ôè0=[aâŻ2[Û~ċ_Ÿ´rŭÁĞŻzÓü;ŻùDôŞ|ü˙×˙ç*úâğ˙T;Ü^Új‹Éç|78ßkZŭ˘“(J(á{! ›ûWóĊ|–}+ĝÒßŝ5?~è—ĝy™†ÛĤôBÄ@½Ċ ŻAlĦ"àĦh&‚İr+àÚyßgLô)ú6‚m!Ê fı‰ü83ĦGÇíçıĴ²R fPb“P’è…²ĴQÈçÈ÷eˆL˜í-šhû1’ Fː-“)`É!ÁË.ŬĊaâ#fStOSÈéÔíÜöó§Cë/ż–ĞÎĵ€^ÊäÌq’~Òĉ„LÌìÌ͙%D²J S]ĉ9{CuÉĤë¸hYĊñb_Š WéĊÒt^:Ž9ÛfjÇ~v?s5QB²‚낆ÌġW_EèvyŝŬ”‡1ġÊf<‹.ğœ!ŬçèÑ#(ŭkYżz5Qġ(G[a’ „6Š,1]ï’ËeiVf‘….óGYš:Âäܳµ ǏpxïNĉZ-‹Û¨059AÍĥ €^u‰…Ê"¤"Y-šŬv¨p\ü˘=ß@oI|ìş÷Ídħŭ.C\sٕ\zúÈ˘É#^âó?ü.>ò Î=óLVŽ Ñ}žmáıîA‚èUrF†ĤĠBRˆÌPċŠSÎċ=üWĴ=‹CŜ Ïì{†{=IĞbf³ì]œ`I°ô$,/@‰DĠÀ’UbO ċɨètí^ÓAnB!0Ye0 }]ŒÉĤ–…zĦÑàè‰)ŻV­MÉQĵĞßPż|љg>{óM÷×ï¸ġ×ÉĞÒñ[ˆË—wŬéoXy8ޝŞüyÇuÎq|א…À pl×qùigñî7½‰‰ÙIôƒo³ka QQaÑa¸Ğ1Ŝ=@Ú풋eRĝrżŒıÜ;z+A•ħ‚ĜĝC+ ×1éLÏV(Eë"‡ŝnÉ·‰3i‚¸ú ğ>Ŭ&+ü&g·f™;†áZĜħJ­)"9erħŠhĠQ ›òĤ>¤RŠĈRŜ”…ÖŠHDEĊñğ¨ı˜5›Éf%Ĥ§ŽáÔ,vîÜCO½DiĊI\{ŭû8÷‚­”µĈĦX8,â/yHJŽ1Eċl]ĉóW_Ì:żŽx”Ĵ4†·TĊ³mÌr‘¸y…ħ˘Ħ¸6ş!Ġâi‹´ ÑÎÄLŻÖXÜRĤm9x -FúV iÄŞó„ŠŠßÈhysˆ½Ŭm9dgšVmı.1ßm{.ş™•E‚À#U(3½X[·X+`{ ǚ6‚,&˘ŜsYcäĵ´ZşžžND 5*Ĕ ƒô´UßĦmw‘CÇ ÉŻbĝ˘Sٔ'%è Ĥ02iÑĉĉçïĉĤ|³Ùĉ‡ûgœq6M9áŜı'ımû4Â.q"âz"=Q¤œÉô`}ħÄ;ϜϞûVgNfİóĥSŻbóè&4?Ħ=;M”ĝDBLä'è¨ôâU–Ĉ(ñPE‘ñDێy zN6úX§e( „vâk”ÈáÙ#:ĵÓóş‹Ûó:TÌ˙äMWży˙W˙ĉGŻ>ƒ~ÛgÑgwŝT{p~˙օ¸}cAÍi5[cħè‘ċ“8Q­ËÊ\o½îNàŜ_?ÀƒO=IÓs)ö›¤]‡Ĵ]l'D¸Q„X.b aÛ!­f ÉjħIPÈjší€/ÒôrEzFß²qê-6ëÛ%òlDQGÏĤéi)ĤcYעÏïPnw(!Ä3LÒİ~ JLä"Ê]<1@ï/RÈ##R;Ö@ĴÛ‰ŠšÍѲˆfÄĝš>2yĞkSİĥñşšŻP.瘭çĞ7}‘í‡ÎċÚ+.ċşmïĉœSΖżż‰—ê. )·ÉH* X›ĦrxŠÉIŝ³Ëèv Û ˆì-2I$(—§ş’³V˘Ĵ İeÓ8‚G\2°Ò É1S3°šmĥ?ö4Ĥ@·ŜD0#*ŝİĜ'ÑĉÂÍ*AĞGÛm²T.á…ÓÍJQmT˜i/ħĤœ&2E|-Ħ#ztóšĤљöH|iċjÒIóé94żÁHÈ1İ›#h,aÈ&ĈGdב—LƒJğMDèĤÎÊÁ2ùĴÀMß˙/ċž†$Àó;ô–˜š>ÁуG8ïŒs¸ácEq˜JÒâ–~ĊÏ÷ÜÏÑŜ‰!ö|†S)\G Òžçş3ŻäsW~£pĵħHdhH<÷Y2#Y†×‘ï–Y\<†b˜˜†ŽoˆŞ@@¸Œ%‘d„@$êúÄ­z!ë ƒ¤‰ĵ¨““ úŠ$]b5ħ=/í¤×izqoÏes_8eÉÛżûġ۝ûïÚŭŞZüĥâòŝûŝNğqïÖĤ}N(k[9î鑃 ‡2&½F…×m<·_ħ ·ÑĉÛ7Ÿ}‡ Ìr×n“î6‰=Âëċsô²9f%¨6I`Sp|ҎOZ´ ?ßO']bQV°,ĴmSmô`ž| ˘K9ĵLž)Cc>‰pˆl qJoIUñÔm]§.Ȅċ–CVoe҈é];bzħŠkH¨„aH5j+”M´ĜŬ&ġı.~[ĐËD‰CÇmai ŻâXŭ0ög8{ċé\qîe|íkßÁÇîä™Çï`iï>N:rxĦŽšÏÒ´şD$†‰Ħ™„QŒg;(’DŜÌ-â”NoÁsÂäLJY½ ÷@³âñ'ïŭoîmĊÉóĞgĉ½O3ë5S Ş˘#ùĦí3ä—X=ĜO\ İN×Ù<şû²h5Ĝ°âdúOçGîáħ}OÒQ,ô\Š0 ñ| IR°‰"YV1$İ,uHµrbе}yÊÙ<˘k5ñ“,İŒF£ċpàĝÑ [[ĴŞŞz ż÷×gœvúsû—7½Ú­üżŠKä[£Ĥ”üïïmm;އ:R˘ ú ´z\Ġ5\zÎù<ŭ£ıQ‚t–Ád˘ĉѳC†5s™–¸d}ğ\¤’˲…x½.ٞE9(I1B:…›-³hL…>žc3àŒE"Z×ÁÎĤ°²99‡'Hôj2ê†ä½N§ ž€\,3/ʸ’2d tQ$ŸKP_ì‘ĝ3ÈrLèFX†Ċĝê14CÁéZ´Ğ-şm‹g^ÜĊî=üÛ ·Gü4rùĊìyô×ÜuË?óÂÂòĝ jzœcŜ4BYĊKC:&‘B SDJ݃ƒ¨ÊxbL Êj‚èÇh6ÈM°"‘Äġp5›|_9’İ6şħĊê~‰@Ċ€Ve ÇĤùdN[AXÖ8rp‚ IA„9ŻF½[§µYôLwİ%]DSĈNƒ‰A7ħ™šè²’–éĤÙĝy#Ÿ!r—IŽëVĴâê­Żçï~+ù|žĴ™'&Azċ{͊Müä–çewš°ĤĠİ1;sœĞN:‡‹ŜtŽ"Üìïf:€(Š‹9|ßÇj[D’ˆ$İ\pŜEl{͕ŬżŸzì;Œġrí9×ħ!} ·?y;›ğ˜\:AWġ ™c)IC‘D4q9“9lz„‡\WdµRbEf€q#O`ĝO:Ĉ'dòĜ^:ĵßĞġZ{Ĉ G}}O]pŜ…G˙ŻnƒŝS3—âŬfù£tŭá¸a A&v}FÌŸy߇Ĝ¸b57˙ûy…ghʁħ‚„b,Ħ¨:m/ +H˜+Vàċû™ %fm°cQ4P ݸ’şa-°jôğ†£ÙȁE*­d!á¨&ьŠŽÇêžCż×F Û´R˘L‰şnrœ×sî9 †Şj!ş>‚ ’È:$“HŠ˘RTeʊJz\Ĥ×nSmáĥA M\Ç#ŠıD`HÉv|ĵİ.mĵ…i7$íÛ¨ħÇâÒ<'ĴԂNÏrXĴVhtZĝŠ@vĊ‘Ħ0qâ83ó³ŒĴ'?Pbrnšc3'X½‚ÑĠ+Xjי­,S òc|ßcö$‚(0´qQè-4qéR@ši :pÊúÍ|ämïĉĈ~#›ĈPLvìx‘ÊBĦ1$AgġĜıò:6­[A{Ĉîí/âĊaFašÍÀϟ—íóğ1óŠ.:="ÏGŠD$WÀÀ`Ñigä9có&N=m=V•'Ÿy†½•§xêÀ³xRˆhJĝñrˆxÖL£Ë:ĦçĦK)ÔX"ix³²]‰ġF?›K£Œ¤ HqHË`}rÚyŻĵïŝħe{jÊ5uo]g<î÷ݽjU­ÚUğö³Ŝç}Ŝïy>ŭ—,·ĥċĦĥ$ÍF?Ċqa}} ‘0yhšZu”­óÛlŸ\áU×ŜÂ˙ñS?­W^‡KÊ7ϏŝÁGħ2—·ĵùĵâĉÛ@ğÓe¤TÄVëÛĞÜ˙Ĝ—ùüħGXr{¨!—ġĈ:CT—!Ûaí fŽWı…!]ċĜcÏrÌĵ„Cn:Âûîŝ9Ĥffù„żĝŜd†¤êéÁÀÒ"ŸÀ êùH %ŻHĵ6}ÌVĈ¨(0We2_§lÙĜ@’)˘,t8·¸ÀÂÚR”)utbbâC‡<ġ;żôÑËŬÊ?Tçrï;^ŸÓĥó*C8ÓíZĈ ü›|ó™§hɔÈ1PÎÀ[aâ‰m ’̧ġĤAÎ8ġwƒÛvql‰ AˆÓ5QÒÄW‚0 I“”˘´(•$n <ÊvÊBP#f{>£AĦ|×$) a–&YŽͨ‡ôÙ& '‰‘’ı6Ž,°ZÛM#Í.U‘0ùÛëżKÁ3iċĈ!0 ˜† \Í1²swÄúĴż°AÚSì"BB3h" ЉÙ!ĤfÇIÛ\<ĥ€™xC6—ĵ‹<ıñ$}Ħıíĉ{˜Ù9Œ),ş.Yšb6"3QİDe’Šċ` ŬìQZŬĤ<żB­!UŽÈÓM†SŸ;À5"lÇAÔële[Û´6“3SÔ'FhôÛ,ÌÏSÊċĜħc™³Y:}ž(˜™™frb‚ĠĠUV—¨WŞÌÍÍħÙéħvñ"˨ïœĊ)ènmĊ)cs{ÈċóôWşô—ğĜ"ÏŻ|5ïxŭ[Hˆĝô·Èï~ô˜žšá'ò§8r bà[Ï>Ο}ü Ÿ‡ÉWÊì<¸ŸEs‹ç·Î: Ò\sä˙ĉî‰òcV–/á8I?àÖ+ná­W…ëĵ •E {eîĵŝĠìĵ‚§Ïùc³mP,HCJ L²HAċbaâwûˆĠĞ™1­Ğ\7ĵ›ƒġ)r†$ÎB"›g–/0żşmû„xvfbLJ^yÓÍOŭ‡÷}ä2°üC‚Ë+ßyW²Ħ’Í$·Œ\uŜ¤1˘”#(Z´ŒÌ² UX™$Ó İ2´N†ċ HRÌ^J%30-Ħc2ċ£d2X% “ĵ™g8 H´˘c z ™#W§íVyħ1Óï2”E6fâ#, •şı1Vu‘•`‹ħ~Ì\˜ú$iËt0½*}·ÈbXÁ #*A0x=p5"o MĜH§ÑÀĥ\ħñŞ&ä`Ëo³ħĵH7ħ@IEh„Ĝ5“™ıI×`ñâZ/v9Aáp ë€MZ‡Ġ°ËĊn‡Ż½ĝ4W™#ĵìêë¸ĉÊk ˜• 2mày%²Ì$³Ë J3*Iʰ0QF°â8´Ó”1'şƒcŒWèÄ §Zm.6š(dx˙Cı"ĞgγŬjRÛ1ĈĜĝF“ 'ϐs Ìíš#ïċ9sê Û[ÛìßğŸÑ‘1.,°ĵħɎz•ı]ğY‹".œĊHF†‡Q•2ë Ğ´ÎobĈa*â„vo‹Ż>ù0úg¸÷Żâ§ŜŭLWĈ •Ï_=ĝY~÷÷~“Éñ:Żżûv†K´„ĉŻO›‡_ü6kŭ5¤PXİĤdĜ)]MŜsÑQŸ=“c¤Í>gŸ=ÇÒÊ&ġÚ$oşúnŸĵ…ÑÑŝË÷ïçż|û³„!£F‡˜¤IŠÇô01Q‰Âïôi5Ôz9&sŞMħËÂK ‰zĝfÌùġ .Ĵ,EÛŭÎQ6?°oϞOÜsçk޽çÇ) ˙À´à#ŸûͽY~èŝí>‡‡XĤ#26úçÛÛ\èm²oÓN{Ä=‰)$†ˆL!“ g§èt£j ™BżäĊ*ŒA(Y”&x1(­Ixə_+-É!pZùiZP'.’6m?&"Ş<•`'JCœséÇÙRĥ"ƒj™Jš} •` ‡À­pİTa!oShµġûŒĝr9A4VgĠ*²Ö]“4çÑKPŠ(Ù ĠHÁÚùmÂĥ"_‹š™À›ĴÓuRú2FĜ %diBÒwĜYĜÁ›½›[÷]ÇÒyöä—8uŒ×#)8Xېœî3ÖŻò+?˙ĜüĠ—>ÏŻú“|żÀOĵŭ‡ĝâŭŸç˙GNŒ³ğLuw™~³Mp6AF&jȊfñÌ2I+eÇô$Ġ‰Û×iŻmáT]Fö ÓOB–O."{#‡‡¨ÉùX’ù1Ġú‡¤żŬáÑżĈ ‚~”à”óèBÂĝL+úP²ĈĝÚo„áÚ(´ïŭŝïóŬ£ßċÍwż™ñÖwáY9ĥÔ%>úì|üì7ıÔ[Ħfhl?Däsl!iŻÌ›ßÂûï|7“äX\ıÀÏ~…‡.<†µÉíg³³ĊvĜ˘Ÿöâ#Ӹڄ4–š@*ş¤˜n/óˆ.t°ÖR&s#\¨t•aLçû„*ĦôY\]dañDä8ÖќŜwĝÀÁ£ùĠÏ—aà ¸üéż5[…ùÚyG¤"CĊ"K0,Il 6˘ç[,wlùiš’ĵXŽÖ À…L Ĉ„^+J#$ËH’GI24™ĴûZa+£5ĤL„—p…ƒ#]¤ċ(E†è0ÄLÓiŸ,NÉl—°^b3Ù SĴHR.ğü5BC ş%%èç l–r‰‰ŬQÔÄ6f!â×r0†Fiz%”É•Vƒ¨î`ÎTpm‰ÜîÑ_lĝùáaÜk Œ‚Gì úÄ(İħ ‰LS’ $5ĞÑԓ"‡‡ĉxĠµ7rÍŝŬ,,ç+_ŭ<_Y{\ì Wïĵ‡xÓĞîá}ï{FŜ$ ‹!7_q3oğû^’`‹_úï8—#İğ,v[Ĝ§rÄ3}*³EríÛ§şd"Ĥĵ³€Sĥ ÎĊĴĞ ÏĠ¨×jlŸÛ µŜÁĞċ(M֘İLñÖÛîâöŬ×2]öò¤şĵpü_ĝÏòĜù§i”cœÑçND˜ݏšÁ™•‹üğŝ„³ÏҋÛ`%ò.QÏ' `ĵƒş[!K%Scğ¨™%^ĥû vL‚ߝŻŝ#–7VĜîmĦ,…0–40´N‰N1M{pĤÌ×ÈVе•1!+ìŬÉ´eG –âx½gµħĊÂêb´´²ĵ”säüäĎ_{ġuOŭß?˙ë—i˙è Ŭŭ{ê[kko+ÚĈTÏ2mËÂ2 qtJĠÎ3ä”ĥkxŽ5q’é !Ċ ,Kh”ÔĞÌJ IDATh Â4ħâïĴî,!ħ sp,B0ˆ}éÖ 5mĞLßİ;bYĊèmS‰ÛŒè+¤ĊÛµQ–ŬíÌÄKSĈ˘.CŬMĵ8ÀaÈJ1Ϛk£2M5Œİ&1Ċ`ƒ˘4ĴA–ħ)AİŒ²RìrcrìÍFDcıKÜË(UĞLïۅ•ı5H65jÌM{ÍÀ^–XK‚h~c3Ĥ·ÚâĊïçëßxœ…sË̌ìáî—ßK.\|â +Ï^àU7ÜÎı=ú÷şĞ^hq‚~d°¸ÑĦ&ŒĉG˜sïË_Ëôîq #/\à҉%úÍĞè1´kˆ×żìm”‹% ĥËĜÈ0CCĴÓç 'ϟ|oúÏÓš]›LĤlûmHM=Ìżyó{¸yf˜ŻŭßŬ8Í3çxŝÌIfwìdĥĥ›§żwŒ‡WŸ˘ŬoİË60ĴÁOމÏĊP&˘İ+ĠĤd;ʑáĤJuHR”ŽEli–·Vxñ܉hеy´XÎ`v|ú·ßvNjż3ĵ ,˙Ë/½˙íÎı ço–ŭŝÚu·ÏĠj•İ|Áu²dzn×͘Ğ:`­ıÍÖ&a—VäÇY–a / xJ)²$$T`#‘Â$Ü׃FĞAÇ#²”ĤŸy.)SŒ{”CIŸ ŠP ħY+²â:~Êh7bg’OZDQ¨PDyEĥ EÖ é‡Lt}jÊĵIrJtĵЎË * íûŒÄŠÔhğœ4ÍDƒ™‘/Úx͌(S¤”2 Ê)*…. D–ËĜ• M?$M³³{9tà?ùş{ħ„ɏ>ÁĊ xŜƒU0Ií„'ž~œŻċ¨™„läFa”87ÊFlҕİ ê`şŠ4ï£3m7‡)LHÁ‘žíhJᘖi˘”"ÎA˘ˆá¨ĈµW_ë]ô:úڃ|ë_!S!½^‡m£J½âioÇ1iĞÇÔĠ)ŒÙ$˘ÍÊñWouĥŒWñhŸé/g”§Š8Müċ>Ŭ6UğL½ZarfŒ×ŜzŻżòĤÜi^ËüîŻ˙gžü֓lvğ´eJĉ ʕ{Ħñ³?òšċ^§ġĝüù G×6·vY:&L4mħ Î0 ƒ˘QòòTr އ% „Ö¨D ’ú„Fĥbε&{)Oê²iM&5İ„’NyÄR … SàkA_štm-a &ğ=Fú-!Ŭ‚AĞV_ĴqĈ´ħ"ĊpĞOµßĊŽ#ħliÙ/Ôif2I¨‡£~D-‹qLÈLHFg_jĴ(f÷à—fzîŒÓpĈ&˳GŜġ‘İ‹–ëzè( n‹™gIÍJÏgħÉBcƒf쓍Tâ™(È×"I™Bİ”E,R2ıÂ4#S“\*iB¤B"RlÛĈît݇£CÎËÓW&ÍPá'‚Wm7é˜MbÑĈ“`ä\ĥ‹“,Èa6Bëâ%|ĠĈ*ILÁ—({˜ġâ(‹žGÜ İé Ġ%ßÛBʘµiş9t­Î²_&Îb´PW"=‰r ” ÚX¤ĥCfĀal: ‰}Ÿ|ĉĦ IlHü(&êÈPppĉ o¸ó Ü}Ŭ>yòîèž;wßOİLNPĴXԇ]Vϵéwz”Ĉ‹ŒîĤż²uމY”xäíó/^B¤ġħqrĠ³CSÜ{ĊŬĵŭĉ{(ċRtÚÌҋ|ûē<ü̸^‰ñĈċĉ½7ᨏ->Ë}í“|ġ _ĈhDä Ŝ•d{s4ó 2MÁ1SgçP˜ôcEރüÛÜÁĠġ+Ó67_1mĈĴlĴÄ˙ŝ‰?"|66×1óĦDÊşÒDĈ @` Sj&°•0nħw|Ž+ÜaHcâ¸K–ĊH[ÒMÎ..qva!²3u4ï÷]wĊá£ż~ßÇ/ÏWŝW—˙şŜ÷Ŝé>ì荋ĊĞß?1=<·wßÎİJuĜQ™Ž-@DÀ`˜Ö:\h²ÔnÓQ’ž6è #É`ĝ+ċ€*%a„Ê2$öb²,#KRäKŬ|ÉÙ_gAÜÇP&†t1m “”\Üe(èRK6Öhc-×&éJ‹f§‰J|òĥ`‚e²0Ċ Ĥ‘§[­²žwéE Z³ĤÂû˜ÊÇ05†éâ›E.89Îےƒŭ>•@Qôh™í™ ËfFż$~V@'>v’aĝ)a’9}ÀġCRJ™aĦYUH,Ëb˙žĞx×ŜËÎòèCíï}òÓt€XK '‡D’öcÌHSp=Úö6v1Ûı™Qh öwpíÔ>ŞN+Ÿ²¸¸BğP#“½cߋ.,œ]òŠÎ|]ĈëÎ7>ġžŸùĠË4èŸ ¸<ĝÀŬO?g“gWâı3ġŜÉ+™›Ù;5UÊIÇ3ÌHV\ˆ ZVğmε·Y #ĥU†íwĉ/)J*Œ12¤ĦP1!šT­4Y’)G£" !C dF>‹Ñ1u­ BËĤm{t ‹4Q8AD) ɧŠL0çF…Kċ 9ƒL§Ô£ŒJ˘Û^$Ìı(3£e›ĴğƒÜçJ ÉëU<ÌÄB•Ğ4GĞ,ŠŒ­žİĈî›dĥ¤§#lòĤÀÇ7/#İçQÚ íÇx²KŒ"1‘P %žía*‰Š2lÛFġ˘Ġ>µ´À#ğıfz?CNĉê:Žèt:HÓ ĝœ<}"Újl-Vò.–òó?öĈ7_xó=ïı|èĊ™ËŻ>ùéGÓcÏ5ü…w,ŻÎ?>îäэµí2³ÇÊċ³P*A/ÂÈÀv<ĵ|Çuñ,‡²p¨)IßLI…"A‘ĦÀ8ĥ…!dʐƒ­^)˙+ä ƒ…h;Ĥ–H!Ñ2™V¤4œ­\žm|=˘•8¤ĈT‚;_$´KĴK,zi ġnÈPŻK.îPTBZô½!– uÖmg ù}†˘…~˨|‰Ĝ+‘(@ ‹§@ı’RĴáŒVp'êT&Gȍp‡=ĴŞIÉ&—+â˜.dĈY¨È”ĜYŬîô5'_¸Èƒ_z”V[ñÊ;îċ–ÛŜÀžŬ×Ñ9ù]N?Mϲ98 FĈòésD[1³“{(ϖĜ\o²qzĠ#³H˜üˆ`ç 1)Gżû4_}ĝí>ċáäJ%léPŻ×ï rġŞFìÌ#ޝ¸2ĤgĜí`ŒY*ıĉàmĵáĤ·‘k4ŽŸ'?ştgÚ+ñ²—]ĊŽžüyK2WİsġĜ2²¨O>ç`ے4Ž@k a /„˜-Ċ°*rŬŽ\3{€˘aÑÜÜ`ck ›ĊċNŸ=…q÷¨cËûöïŬûÄ'>ò•ġÏ|êĞ—#>ŝ)‚ËßÔ|&=s|½ñŝwż|yéĝóó‹ó SŬD“ĜNâ8Ĥ0LÒ |„4ŻÖ™È•İd’,oâH­i–˘PËK’!vF½¤0i H‰i„ÂG*°˜–2$)hAĴ5]Ë%Ëĵȧv ûӍáġ –ŠkVŒĝLvz …ĊȧĜèÖĞôĴ"vކ4pâ”]ŸjÔA‰mÓ/”iTŞ4=$NÉġ|F#Ÿq™›äŠ6‘Ötŭ”n#˘µÙ³Ġ£ŬÙZïÑnt;>–OKÈbİFĊŠ|ÎAêbITR–gyúĝ÷H¤ĉĤÛ_ÉĈŻ'_rQ•„ġí5V.4İz Ï !G.ĵ°AĜŒÉ‚­œŠEm²DµîáHÍ36Í`…t•sÛó\\ĵDÑŞ1;ĵƒ}GöR:°ƒj•ĊlŸ”3—#”°•´¨&u,Ò~F+Mı°ĥŒîĵùċlŻÄĴo­’ßYċ„żÄO>ŒŠR^ĝ~úŽ·rÁ;Ĝ7ğÇrĜX[£ıŬ gċ°µÇÚĊu&;U Ïñ²İƒÛE^™lĴÒî6ÀÖĝBqĉüÉhiíÒBšÏ½Ü‡nşáĉ§~ßŝÙeôż¸üM=üșô5Içñ óg>{ôıñ-/BX"?ZŻ™+~ŒŠ„)Á°W`ÈËSt\ ­ “ˆX§$†&24F&˙ŽŻ 1K”rÙCId6X“I„&a˜HÛ02ÊIÈHŻX§M%ħ,ƒ¨’§]ÉqÊôP*f´ßb޵E1j£e„a{äŬ*§*“Ĵ¸Q3Úê°£ÛÁ=„™à A·²‡5;Çş”$iB! Š:âmD¸EßɓáÒî%ô[1şŸbe’‚—'—+àNX”ê9òµıŞMħîQqñŞ6fÉ çÔpò9,Ïڔ‚F£Á÷ż˙}ŝúĞ_£zġġÜqë+xŬkñÏ­Ñj÷İï™$0ş\˜–üö4*‰NŒ7nRŸ-QĴäènô¸xì½,˘ĉ÷1[žB}.^÷kıĉÚ¸êÊ됉ÁòÙuÂÍ/ÍñÊÉиn÷Œç‡7[467HU‚p'êO^8-.ž?ŞÓğĤg?qëÍŻxñ˙Ġċ5ŝò3—˙n7ó™_tżŝ'żĵԚËċËïÙıwnvÏŝİrİĉ R †˜y ,Ï!³ V: ^\]`ħ½E3òiE>Nd˙푔Ì_^*ÈÌ #L1#’Hh4ĥ2„‰™vIvôğ”ğm QİÈz!Çşĝħtżd;푉!éĈè”*œĠyêAÀD·IµßFğ¸Ĥċqڝ$ˆûXYÌP1DBê$ô˜ ó0™%é ,·ìa  M³#ˆÓ„( ‰T§ 5JgdY†ë› L´tÈ ƒ(KљOâ25=N$, IŽ·Ŭ~ŻċMĴĴçŸùcŝúÑog6`M¸Ó£{‡È’„µóÄې“älÑê$YßfñüA·‡]ħ™­Q+V*ĜEƒíŝ1…|ž  ƒbÊûvżën½Ó,#YÙ8Ĉ×ùe–£ˆüä.FË6/^8ÇùEFŠ£ĵÎdÂáSŝYö£ôşùŠËĦk÷sÛĞ_N§ÛäñGI‹#sÈÂ1zÛ-ü~-aĉ³Ö\c~é|´ĥvñhıTıoï잣ŭÏ_Vƒŝ9€ËßԟüöÏşßxú™É§–ĉÌħïğâŞıÙÙıİŠ:"ɐqJİT˘VİĞŒ•ö6‹mZ›Ĵ6·ĜвżU‹ĵ2E–À%J5vša+0 "Ħˆ³+Ö8é`]ĵ`(J:ÄÍLÓ$6mİI3̘6 ÚíR ÛH˘l‹Ä(²aX·Şi—ÉvHÍï£Ì˜Ä1È ] á:ħŒÄµ0ˆB"×Ħ]γíZXñ:íc%Ş"ĈÌҁL_ݰ&+›˘4B‘aznÑĊò,0BjŞf“|Ħ‚’6aŞÉ ²RR’Š”Ö ÛtÍ<µ{ıf÷wĜËËçöpò…óüÑÇ˙Š…ġçq§‡pw ‡ó+ĝŻ2„SŻ2>i^ïÑ\îúŠÜH‰ÂÎ÷ŭ'¨Wx-·Pµ<9ŭ]>ŝèW8ŸbH¸eêjŜòò{‰› ŭ“żà™§ŸĊ+äIò9¤)èvÛ ĠÊLĠk Y9öML2UÁRŭ~@+r…<Í^‹³ó§YZ_Œí£ğG‡ïÛ½kßSŝċËŜĥ˙[Ó˘ż·ƒùêÓé ǖż“?´ĵrqġñ“/ž>şĥµ½C”=ÇĞy"Š ĈROT\Ħb‰˘ëá ƒÍl0èÏҌä%@A )òufah1XÊ3@­2Ĵ -‰Ì2m•ħa$l—šžKCĝĦN<ğ‡Ö)Nj‘g³TċRıH”:Œl ^­ èâËÛ°pܽB•Ëe3ı$ âwŠû”T –IœŻÓ-ŒÓ–UĞ…R Š˘0–ßC+I–ŻÒ“}ħ…áäjPÛáQžp°Ş)İÛ#ħzlUBĤ÷i·ĥ ]˘MŸpU,)ôxƒs£”’/<ġ4ßĝ֋œ[N9°çj~úï`ĉ‰odĵxn‰ġsmœŽËHi˜âÌz҃sŠ­ċ ¨Eq\2´§€3îÚ_AœC„ži‘A&ÉkW츂Ÿğñ­ĴëûögĝĈâS<߸À·žµÇ—§/>édĵù-üĝuŻgéù |w~›ï\<3Q!!"ĥSòĠ0R)sÍŜ\µk7sµ!œ(eau!v!G7 xŝĊcÑ §N,(ݞ­×kşíŠžúċ\6uúgÙıü·ġïß—ûèwŸÙŬ–ù›k;ĉŜ]żŝ5W+îŽj W Üà,Ï té§!…K[ë,µ›,ĥô3fž4Ħ šÈl°”GĴ6j°á‹”¨0(KZ¤lÍ`(œ)šbħi:&€‚ö[Œt›ƒ.ĦÀ(áÛuĥsšĥIJD)èP†’ H ÌÌ#ËWX­Yò ’ Üʘ“]Ò^ SG8žCàċÙrK,y6•Á[ ÜJžĴìċX ğ,­nc'&ĊÌĦWÉĴ³`ğ1ĥ£m“À1‰=‡Ñħ ½Ċ>jEáùy"?¤­ğL]=É Żž·^ġNFdȉo˙5Ÿĵ˙ϙğÔ"6 Ο?·şBP­0zè wŜr3SA/iĊc,4%k÷ĝ!*ΰ” -vŽÌò²Ğnàmû^apêÔs|òÛ_à™`†#ƒˆ™B½ñçĜ59Í#_ú*Ÿż˙ótü>²\€’G PsòìŞŽpdt†Ğví£h˜l‘F1 %(”]V6ÎóÌ3E½ÖÖѲë~x÷äìüí7ßzé‡ßŝèòßöŸiçòßÖ#ŸK˙÷˙ÓĤEçĉçOž|ŝôÚ¤Î|j#…ĵá&f?h /””Eď˘íàš&ĊY ­ -ô@Ĥ6$‰’!Á4-lËú[ÉZ‰”I[ü0Ć&ҚDY†3\Ĥiceħ›§W,²!Lì^‡‘~ÀhĴXu}r:n•Ċr™²(`GŻÇŒŠ)[(4QD/_a¸ ,•RNCĈu‡4ìö|4).ŭTjƒ–ùÚÎ*C³cŞU\§LÎ,á8E<Ğ@˙´żv}bé#+P)˘=Ċ™ §yĝSÓËlş ĵömoczĤÎĊżË…cÏc„[öÚĊĦ]ü]ŻÖ·Ç6ĉYŽ—İwr!dA6üMa4ğN_<ˉ³óĝ"bçĦ]#^8–îf“×ìż‘żŭÍĜYž?˙ӏñŻ~…@ĊĜÒ1û,–XÄÌ×î=đŬ{(zÛëlno"m“\%ÏéÓÇ£cÏ?½Ĝ\ĥVŞ|èúĞo|â·~ċSëŸğ˙ë—#T/w.}îÁ_³?ŭ…żœ^Ùî̑}ïÈäŜıÉéÙİıÉ)'/Ağ…çä0mƒ^Júlmĉ·W¸ĜÜ tñT 9èJ2 Í ÍħÂ4M´Ö¨—ŒŞƒa…ÎRĤR$J¨ÌíjM™ŒŠŠñTBQbÓ ƒgxADɏ(.ëEƒÌ,ÑÎ×Ĝr\ûŒm7˜LzTìĈ4 fq”ĥ[ÁORÜÈg(íQLú8YŸÔ°éš%‚â Ëc;‰ÑÒÀ’‚êlŠv‹4Ag3Fö5fœdħŽÉ›eâÔGğ zžÚHbDc³ÍĊ K˜ŭaÁ`ênŜxÇkxŬákÈÖVùĈ£_ä‰ï›İ[€+÷f¨Pafj’3KgxäĝßşH~˘ÎÏßô\Z_äéÓßg~{‰Ì…ÔÄJc:6AhQµ\Ĥë´:m6ĥĵöúÛyž›i}˙,żù—ŸáÌÒ²4èV ÛĦ”+ â”ĵ“cß8÷îczd”ÎÖ&ağG!ïĦµ"Žcž9ŝŝĴ¤ IDATèܙ³GU|xçÔôüm/Ċâ{~â/Ó Ëàò˙ŝü÷ßí>Èw&Ï7’9Ğĥ½ÓûÌíÚ³gŞ\Ğ8v+˘èċ}˜‹Ĥê²ÚÛbµµÎ™µ6Ŭ§ŸDÄjpĤZb@’‘E1á 6ÓìïÂ/mü˘ ™Z L–Ê0U„‘Èr3M)#Ŭ€1?Âс“Òq†œaÁƒĤİ)šñn@1hÒÇ326Ê%:Ê$4Ê$²€ŒbJiĦ¤ƒu-›ĴX£ë–ÙÂ"D’“P&#Ú{,ډÍùĠ°-q¤GNj /BzcÂ%BLµb [ğl-6hŻûX8èрéŭsĝ.XcOiŽwŝM\síĦŜĉĝâiŽÌ]˞Ƀ[>Ċé£tEGXì¨NÖCwħçà^NoŸáS_˙'WÏZħHÁ4<Ä)–èT03<ÍOŬġNö%5>ûĞÀCÏojŒħ*IÁ%VıÌdşXêŬ¸rb–BŜ÷{œ?wŒíccsç‹.-ž8Şô+÷_yôcùâe5è2-ú˙VŸ˙òséÉ›_ĝ—Ż^^ĵôüĉnuÍóÊEÓÊQĜ(m"°LáB•áB…ĵċR´liİŒ8I[ùfÎE§ ġ·Fż^wmhƒ-`C ÚġL$Ħ4èg„‰+ĊTa§ ™żdVólÉqÒ(ĤŜl²³Ŭf$ Ñĥ"ĥ\"ô‰ËŬÊċÎċ˙ŭÒ}?è>yìč~ôŝÂì‘ı™éıİİÉŬNħPÔEŜHÒèuX÷;,µĥ9ğħL3 QĤ$R)"rTIŠÊ²żŬ•á%¤ċ€" ü}B@  ~ŬKc™šœŠñ҄ĵVĜ–Ä0MÖB—‘f›‹‚ 0,ƒDşlı%ĥĵ+Ž EL†}j½"È,‹°§gš\*Ž"ƒˆrœP }ê:h+‚ĴO(CÎŻÂ.äèE>*K°\Qw£Ği›K™˜Ê$ "BàŽx§ ˜% Qğ¸fÔvŜ*AM£Í[iö\ĊĞnş™éâ0áf‡S'N[ší¸eÔĜlm°Ñ['sRì˘IŞR‚8Â’R`bÚĈ@"—‘Ÿ’v2vîäŞ½WĤŻäĊÓ'ùì Ġì°wf–™ú8Óċ!l%Pŭ? 0mƒ ¸´x>:}êĊNcs^İ~ĝ7âİ_ŝ…ßş ,—Áċžxä·Í/}ù3;Ÿž_Ÿ‹¤óŜÊԞıÑكSġĦIg´\ĤjYxB’Ä]ü$"1 œß\cħ½ĊjŻFĞĥK–e¨4ˆŝ;`8àñÒ ë­R„ŝ›o QZàJ§¤h2ó˙iï<ƒì<Ïó|½_?ŭlßvQö ƒ Ĝ ’)ŠĤXÔK¤(3V&–<ħì8,LËc[t, .£ĜòĜŠä˘Èr‘ĴŜXDŠ $ħ"AĦQ– `ÀÖÓżóµ÷{ßü8KJ“L’ÉĊŠÏġogvì™9÷<Ïó>Ï}k°ÁŠİÀK5ċp™r+ wA⸄äX1rTĦÎ2Y™§bĵ´Ûşı" ŻH ƒ ÉИ5Š­&f!‡Şç– Ԓ<[A°LÉVd\ Yʳ”Írèâŭġ5h#!µ´–mŠ£epµV“ö1Úô­wèß4J”ÏÒ Ê °½˜xÙf°o’‰òFŜ|ŬlÊğ̜{Ĝ÷]ĉ4Dş…2ÂV¤Ğħ0ĥia §8‰‰íZh´LÈşYP‚Z; ‚íI…ĴáY1œ)rċ×P´=–/-!ˆÔ2( ”“€ƒ‡žN½plÊJ£½;6NN_sĊ³żòŜö„×ŭóò7Ÿ½_=ı˙|ġÓż÷ –.<ùÂÌôԅêÊX %žçĉ,­,D˜iBšH<ÛĦ/_¤/Ëçħ,)%m•˘yùqC Óè™&Ĥ!ĤэZC*ÑRÒò ,Ó"Ğ\DjÑNĦƒo9HËe‹¸€—Fx݁ĥ³Ì”8Ġ—O F–Û˘%²QC§$C˜Ï–h:9Ş l‰RŸlÚFÇ>Âĥ}cĴ¸,ˆ"e’M;£‰WkbúuGѲ€R‘fÚäĈ=Ĉ‡‘AmÚ§s.f¸/ PÂÜ6J³É –Â3‹„EQ¤av˜iċôİŒ¸Üyċ,É*GçŽâĜ ÛT€ÄT)Ž6p¤¸İ,ä’¨{‰‘J,™`ŠHGDV‚)ÓjsĊ†­\½q+CvW´ š­6#•ġÌŻ,ñìÁÑñÇĤrž}ï W_ŭÔ'˙à‹ ÷}c_ïšıWıüèùâß}Èğ˙ĦŻŸ\¸Xadžá7T+ğ&ĥ(ÛURÚ6ŭZŝÍNÛËħ¸Ôâx0ÏB½Ê…ZĥÒËÂV6"Pˆ$E™]_İR´]Gĵ İ IQâ%ğ‡nĊc²Ú:İnŒŠNkd²Er^GjĵFƒBĞÊ`Ĝ˘„$HHB;ÏR_™R†XJ͈ŝjÄ >´LÒUOšNĦŸYÛĤ! <ċ²ĞıLŞ;¸ĤÀt34"çí —,‹!Ĥ+ɍä°J9Ş—j̟œ#šìú~ĵ&^ݏŽa‘ ×vp ’IäjÜcLrçת]×rüüóüӁoñb|i0TŠİÁÔzĠ-P!ŒîùFd‚a‚İ*JȐEûЍ3TaGŬeۖ •FÈXÚA‡…êNÖ¤o¤È™™ÙèàÁïÍ-ÎMOŻŜ{óġŻÚ˙Ħ_éŬġÄċÇÀ§>ŭ~ï[Oì?ßèT2ŭ#{½öM•á!{³B×3mTäĦ…Cœ£,Ó0cj~‹óËKÌ,³ĴӎbRĤiâȔTj’tuûW ĴTcCB•ĵĵt'Vż\ĈK­“ÒŬBa!°pµ (cJa›ŝǓĵÔ¤ÉRÏiY.i’’ ;£YÛúT)r\Êe¨ĉlŠIÙĥÈ·/`š.˜Y|Ç£a[ĝ†H–‚5iLdIü²K-Ÿeİ‘ĴuFúèß6N2¸L옄–Ñ5ñ’ĈX`ç3+mÖeFyçÍofÓúí<ô½'ùÎĦ'hÛ”“H Ħéĥ¨Ġ˙]ĦÈ:† G‹HMÒzŒı3 slšàށIú‡ħ —z½ĝ”‡ `JŽ?:qzŞ^[Ŝğa|lú wŬ}î½oû@ς²×ŭxĝÖ7§äİ#—Şżñ‹oż8wúÉïyb޲´‘-÷OXÚrñŭy+Ë`a ÙnÑïÉ÷“7Ŭn2¤!HLEK…dħPşkRd˜f×<\vߒ„hKĴ.á­V,F÷g½š$„RŻLĤ‚Ä00 ƒT3.UÛ$IbJmŸáN›RRÇSL·Ž›çb!Ï˘çbD)# Ÿá¨AÑò1T‹Ôħiye–Ü25†TÑ·ZĴi6°¤$ÖMeъ@˜ùĦùµ}„9E¤ ÛDËĥ1´M§êsÇúkx×Ŭo£˜-òġGîgßéƒĴĜÚFHjjMŸyaJ5:÷^wùUO}îÏşúNo)'.?~|è€<~lĦú ïşìÂⅅ铧/M4#…vœ—µĴ\Ö! Â$Ħàĉ)ğ9 –Ëpı̚5cärQ EĴRĦŽa›¤†@˘‘†Ĉ4M´ ;·ù!‘ÑĞCA™6ÂĥHMÑM”cĦĵ ĠÂa`>żF1j‘!ĈvL„k“fÖs.o³h+rĦdĵRŒ| `èˆ0SdĊÉ1oıZƒQ›²lâe™6!f"( %$™´ƒÌx8İF †c`{.ŝJ›1•-WÜÊ[n¸ƒı•ôԃì;ù,‘Éd”™›Oş‹64jĠ)ѭꄸZ`)šħ°Ž!nŬt-×Ml§˜:ĴÔj,,,b¸&CkY-DO?ŭÄı™3§š¤ıëĤÛöïŭ'{mPO\~òxê‰óòÏ?ŝÁKa{öİóÓGĤÎOόQŠ×—ÉİbbYVžL6‹%*ŽÉğÖ 1X(‘"LAĴ‰NI ²Ê1Úè>MóÒـàeÁ‘ZcX6ĤcƒĠĤ•(”a’ĜuĦŠŞ@Ò&Ÿ„(ˤï§Ŝ7Ĉ·@˜Ĉ”ŭ6k[- q‹Ä”DĥMjd8—§)\´”ä‚}aƒbêše)ĉûÖ°3´„M*S QÀHğÉ`ğNĥYEÊ ¤ £èk^ñyEiœ·_;ŻŜµ›İ3/ĊGïĝҋdFJ(’°ƒgvÛ³ ]1ц@‰î>M,ebĤ‘$ĠëRÄ$ƒÜ4‹ËĈ6`HÍĊE..̓+ċɕ2œ›‰âğSçNŸùĉġŝŝî×Ŝuìżüû=aéÍ\~òùĉ?~À{pߓ‡f*éàĝžÁÊĥÊĉĦ kĈĈܑò* ˆ‚R_ÓĥYŞW9ݰP_afá"sĠZq@ÌŞ) ğĥ ¤ ½şá+ŝ‡-_½Ú.½tf R‰!ğĦo~â’1iħ&j3+R#bĥÄr&‡î´èo·Ž;äDˆĊHíÊ÷³T̲ †Cí:ù¨!"RÇD8LËċ…Âf¨0$ĞbúŸ>żİ%#˜œ`i}žĈĤ>29†6òĥŬ·áäò  ß÷ÉèŸLÛËà;áRWšl,Éê˜ĵ‹;XqBdhĉ‹ĴĴ-Ž•a¸Ìuğâġ×ĵ’ ÙäËß{„İ‹gH³˜Ê 5 2tפ*ôY Q†I*ş{?"3TXAŠ+ú—\&GÖ²et •Á1TĴ¸°¸ žKnp€Ĥ\a˙}QmñÒÔ@6wïe[.Û˙ħßùTŻZéµE?|ŭëäÑï_¨~êW^yáħçç§/]ĵ4ħÜĴGÊħ[n˜ËĉŠ–‰MJŠIDÉ͐q3˜B Ğ!mC ÒĠmŬ¨ïê@wU†-kµSÒŞû7şb Ó°IÍĥĥ@ċİZy–—Ş™ÒELúê"faK.ħ\,r/OŒAi1dğZ‰ÛÈ´ƒ0,·„vûYħóÌ&k;>Ċ(&Ÿ†¸Ú'M;tL“úÀ­ñ,íÈR*–xûMwq÷ġ·qììY>ûĝ}ĴŸ'(Xôë_F¤ž…e;?ÁU&fĈ£*b<)ÂDc •‰F)†Ÿb’[ʗ³uby×£ŜĴÒ›dJyòċíN'úú£ß8·R]<8Ò_úÈ+Żğ~˙‡ŭÏzÂÒĞ\~6˜Ù÷§ÖO<½áO<.%îĝúËŻğgç57íŻx—e@5şv™R³ÒjrħUe1öıĜİq~ċ+i ‰éÄ R) LœÔÀЁTêĠP·Tc])ÒİB޵úûbĠXü%=ѽ-`³l`YX6P2Ä ”ŝDSZ„İIŬ²iôġᗠQDĤ2 ĈDĥĥPnŽjŜbqĜıħDöŸ?Ŭ›ŻôĝÙh‹ŝW<ŝĜ ù§Ÿĝàĵß\xrúô‘İ“G÷Ua\×ÊËċÇËÔ:h{´KĥDÉöp´2EĈ’4U¤†ĈpL´î†ˆ!ôjüI×'Ĉ0Ĥa­^aw!Ċê †x9Í m䈵‰”Ŭħ­4Y‹#Ü8Ħ:X˘S(Ò´21d#Ċ@P’>| nžù4feĵL°}Ħ£ëı{÷­ĵîê[xnî(<ù ß?w‚0+èĜ)ÒRd\-#„i˘W͵4šD& À2D×.Tĉ‰–}ìċ„ö ׍mċòÑ VH|ĞC;ÈĉûH5ÑsÏ=wî䉣'Öö}ä֛Żßï˙˘×ġĝÙŻ\~˜/}éCŜGîß˙˘Ş††÷Tĵ˘²íŠĞ&r…ĵë/-Wk¸İ"38LGĈ,ušÌÖĞœo,³ÓŠCb’DcĠ²!•' Sl%° ƒXJ„ÖĞǑ/ùɨ—$ÁN$N,ħTŠgĈuÌ@’PH$‹ċ"ĦÒÈ0Ħà' E)ù¤C*BDV“ZYü­c,NÓ›GÖóĥ[ï˘4<È3/ĉÑÑh·ˆ”Ĉñ\0!‰üpX b–‰F ìnñÚĤ†4NIĉmÌfD%3È v2Y%nE´Z>)šdÀĈµfÏÎDGš Zͽ7LLßuÇmgŝ­ż–ôR=ŝĊ‰ËK|ŝ3ïġ?ÂĝÁ³­JqbçŻï¸úĈ]#Bĥ-‘ĥ)[EÒQI]†\lŻ0ğ²ÈR³FF(a Ñ(a R‰DÇ]7ġɽ½ˆ=qy™żŝôïĦÇŬ>ï'wlêu/{ċĜÀĝĉµŭzÙñ}?è€Ħ‹Nš0ß\aİQ£ŜlP |V:m|)QĤ‰!,D˘H“<[żT½ˆ²}I„EˆE@Š‘jòR““šÁ$Ħ¨" íżk™…îd§żÌyÖyŭĵzÛ5\Ċ5,F-üÔw8pî8V)‹ÑI¸bŬN^ġmìš$Şwè¤|#äRk‘’›Ċ°-¤iâf<˘ äàÔM=Kâ\^ÚÎäš ĵs‚Ü÷m.Ëôċ],?`÷ĝиûÖדÔRú÷_ìÌĥO²áò ùíV ‰İ5št:d+¤uq‰l"Ĝ8ĵ† ıa 2 A(ŠeÈXœ:{&:ĝü‘İÎüìŜu§_{Û3˙î˙İ÷Ô£'.˙'~ëwîÈ>qpÍİÒµ“WíĜyÏîË_ħ{$_ôÂzF½†i ²ù+Ò§)f;MÎ6–™­Öh´:¨Da #Žş˘òRK”Ş—— ‘AĊI7|]H\+e0MéDŭğ3 úè”9ßïpħ¤ÉĴ/³qÛ$żz;Pċ,ßyŝ{|çûOYĈ\›Ğĥnċ=ğŝ=>şŸo>¸gĉhËí Ĵ’I6ï›!ĤeĦu÷ÊzÀγĦ8Èe£ëÙ<ĥUkPkÔI Ei°D¤N͜ŽNž~aŞÚ¨Ŭ{ŽÁİOŝ᣽6¨GO\ŝoy˙ûòNÎuv'ùÉ{^ñÊğ+ÛŻşlBˆÀMŭ:Ë ƒËüÊÒTŠÓ‹+œk×Y”5.4.Oğ7H*E%[)< f(!ˆ rf×OFK´N1Ó7ĠäL“œa²~ĤFÇ}yü‚Ëb£…H፷ŜÁ/ĵóçy1™Ûâp$M+$mF\SŜÎżŜġìßÊ_>ŭ?ò]Ο?ċıhÛ$5 5–ë1YmÒoĜĴ˕Ù:4ĈĈÁa ‹İ5F eۘ™,AšD'^x~îĝ‘çĤû²{_uî^Ô£'.˙/|ñkóŭ·Ç/,ĝ•ŝÑWìÙzù •M;ĥM •ŬF{†ê|é§XĥĈ§ÉrĜĉ|=áÂRÌôÊQ$‚(•¤Z!´ÀÁÀ KZ~›L&ƒÔ)iá–RX‰Â‚ ÓĤXı—j ÒTñîw›ğoıs§§ùä£ÏBŭ"fÉd`¸Ìĉu^wÓŬÂ|éî˙Ŝ>ލ:fĈĊʸD:í^5ÛŽçâċ2ä°ϔ˜ìbc˙ŭ™,iœn7ħlM&—eİŜˆ9<577·wš‘é;ożŭì{ŜñŝŜkPž¸üs·ıÇğ˙ÑGÇ£²a×Í{*—ßT™ÜQ™ˆZ+wÈÛ¤šċšÏBĞEGJŽúgX׸TŻÒC¤a M %şQ&™XEQàc p âH<Ë&0"\Ó!Ş·Ĝ<‘wżóŬl™ÜÄ#—î{3bÇL”Ëĵíuoä×ŜĊ™Ù |î _ċÀá£xĉjP\Ö%1ËÄu]DÚġÂô֖Ùvù>œDwÊMƒP&ĜNÈısç˘c'žŸZYŬğmÓĉİ˙ö'_ìµA=zâò£`ï½›zŝìx3°+“—½éžÊĤ‘Ŭ7ŽxY×CF‘J’¤†ï_bÑ,TĞÌ,Ì3[ĞħvhŠ…D“-SÒ4E¤ŬIS+lşÉ+a;†[Żşžw½ŝ­dl‡oÜw?<ŭí$"5BÖŽòöׁ×\˙J^8}ŠÏ~ċK™{g°DÙ´ñeL`(²Ù,ÛÁNĦ/W`c1ÇäÈZ&F„ ázÂuİĥÑìÜós'ž?:-“hï-7Ŝĵ˙£żÑkƒzôÄċGÎÇ~ïnïħ³ğíüĝ=ëwŜTÙ|ċĠ£7ë$¸İBwíp‘ ‘T;>š5έ,qĥ‚ßÂO"T$Éò¤JÑŞaĤA„Ä~ÀX&ÏŻğn½•ùE•/qäĊSDžM+‰¸~ÍzŜüĈ·°­²'Ÿ|šŻß˙mĉ[+x´-è-„çt3œĜĤEV› dòl_Ïĉr‰‚“ÁS‚´` /—e~e):rüĜÔİS‡÷ŽŽLß~ëkfġŬżĠ–=qù˙Ċ3O}ÜŝÊ}OĴü‹•ÌÈäžWŜPÙĥmçÄpyĵ0)™-”R2Ĥá·YôÌU—˜YĵÈ|u‘ċŽO¤$m!lS˜têM²ÚfĜ8oöfıĉŽŸ|úò—¸P]BÚvŜeŭĉ żxû[1½ >ñ8÷?ú0Ê6qs.ßÂĥ Òĵƒa™8–Ħ4^ž5Ċ~&Jƒl[Kżi‘D†RxŽMÌÌLG'Ož˜ş´0ïÎí—MŭÍ˙]Ż êÑ—<ûŜ}>2ŝüéZ8şmÏŬŻŞlĜeb “umìĥJqİ$~ÚaĦĥÄ|m‰S sÌ,Q;HÇ&ĵÔäúm—sËĠ׳yr3ß|~Ŝ˙8Í(@È6·\ğ›·½á ÌÎWùÂ7ÌÁSÇqúrŬ0¸($¸äĵ mW‘†1mogÙ<ĵ–ícëprŬ ĤĥˆeŒÔA܉Ο=3wìiC%{·oÙĵ˙O˙ó?ôŞ•=qùIà;Ÿ˙eïŜ7~²áVJëŜs ·V†úû&ú³ג1ZEX@ I'˜뜘=Çéê"g—qÊ-WîĉÎkoĤßôĝĞoC§ÑH#” Ċ"ïMĵjÓ^|öŸ|ú1ê~ƒĥ젍v, Ë ”LI‹Ĵ/²İo„Jy„Q·€nÛş)Ïc(—§âġ1’ëÇ1â$Ċôl2E—zs!:ùÂásGŸÚwp0›ûÈ7ß˙wŜßkƒzô*—ŸJ=òqûĞßŝúúgN_Ş8cWîYğŭĈÊĥÉñ‰Á>×34IìeĴĴRc…ı…Kœˆšh­iíħJĥIŞğFÚnÖDÉÏq(erd„…Il-L›rèàċòhÓĈÎzärĠıèĝág§ĉΝŜğ<4ŭú;ß8óηô,({ôÄċ§ž‡ĝ#çÑǞ^wàıco=“[6Wv\qùD~ ìFa‚‰!5ċ: i•T@3ì  /ŸeİşBğŬfppaH’0ÂRPt2¸$A„Š“Yxdáĉ²xċ†kĈs³3>÷½Ó"?ĥcóäԟ˙îçzó•=qùYcê›ò>ußÓçk•âÚʞËğ24:1QÌĉ܌)Ï…9ĥ •Ò‰BLÓ¤\.“„!a £S(V3• “Ícš‚ èD3/ž9pöÔ Ÿ(Ĝî‘Û_yËÙĵç·{mPž¸ü,ó™żúMïĦ'Ÿo§Vep|ŭžu[ĥUĈׯŸrY7ġë,..ÉÛĥ‰’˜8Ip2žç!”F& 2ˆR’ m‘u1›vûhafzŞz~ĉ÷ĈKÏÜyËkŭw½é—tï“ïÑ—!|bï{½Çž=8fú*kw^ğgxŽÊp!œüŽĞdŠkÛÄR"QhCħ\Pš8Žé„9F!ƒ‘u“'O.5.WËó½zŭ†ŭ˙ġ·?ßĞVzôÄċ_*˙ĝ/yGoµê~Ë=ıB~wß ×7Ĝ‡ #"J^–¤2#›är9ËĤÓéà·ÛĝO£Q‹šµúáÜì3Ÿí+îğŝŞ›Oà?Ú–=qéŸĝÄ?qpw¨Ċ=˘PïßèiŻ0mÏÍĉúR×иĥ‰@ÒjD+‹ĉÚġ(•Ñœe‡7Ĵßöŭwß\˙W·żŻ×ġè‰KÈ{½gŽ?pâ”ğ,ċxǰö¤nvÜ͗E˘ĦO'$qH… ċœİċ(ĉ6oŞ„›&7̽çMîU+=zâÒÏß~î÷½Ù‹gǗk‹nûDQ€Q²1…E1×Ϛ‘‰h|xÙ·żá?övVzüÄñß'ÚÍöVIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_ArrowDown_420x420.png0000755000000000000000000014466512467662066021524 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFàIDATxÚìŭg”eWvß ŝ÷9×<‘ŜH ŜT…ŞÊË%’˘T˘HŠN¤¨ÖˆF¤\·ÈéµĉHꞞ^’V˜Y3ÍhzĒmŠ”è‹XŜ°X™HÏ]sΞ÷Ü{ÏuïE¤Hœ½Vñ"ž½çüÎŜûż÷&f†3gΜ9sv³M¸·À™3gΜ9 9sĉ̙3gHΜ9sĉÌə3gΜ9s@rĉ̙3gHΜ9sĉ̙’3gΜ9s@rĉ̙3gΐœ9sĉ̙’3gΜ9sĉ€ä̙3gΐœ9sĉ̙3$gΜ9sĉ€ä̙3gΜ9 9sĉ̙3$gΜ9sĉÌə3gΜ9 9sĉ̙3gHΜ9sĉÌə3gΜ9s@rĉ̙3gHΜ9sĉ̙’3gΜ9s@rĉ̙3gΐœ9sĉ̙’3gΜ9sĉ€ä̙3gΐœ9sĉ̙3$gΜ9sĉ€ä̙3gΜ9 9sĉ̙3$gΜ9sĉÌə3gΜ9s@rĉ̙3gHΜ9sĉ̙’3gΜ9ÛeĉŬì'@DîSpĥíF^˜ìŜngWtá­uéxî#uĉÀsSÀÄÛx *gÎCrĉìM ŝüZ<Ŝ!¨ œ9 9sö&N€´SHu‡vĝ·äàäÌə³[Dt o_vwÜv-àÂNΐv}ò“ŸtŸ˜³NûÔ§>µSÈU|}%^YÜñ·ÜáEqˆÈĴ&gHΜí!Ñ6~ĥS Ñ ´ŭĵ .|pâúûààäÌə³› ˘Bˆv¤+ñ”VyFuĜÔ!S˙9wÀ¨üÔ§>EJΐœ9Û½ ˘-ğ}°ŒlĦ@mž/óÎò÷Ɂə’3g7FĞB+€Ô¸Í÷}áy…a(ƒ D$Â0Bòş†=oíÄí"`|èx?ċì1lvŝìżL„ùd’Ä“Í$žM’éKñÖù³³ùĉĈäüsßzŭҋϞQJM´Ö›Zë-ÔĤÖzC)µ•ĤéfǓáp8˘h6›ÍÓé4™ÍfİñšT˜PóаÌ[rPÚ£ĈĉCW·ŜGç€äl·èJĵ˘ˆƒ?{ŭ~ëġĈAŒ}ßß'ÜïyŜ)ċ~!ÄÁƒ·Ŭqâž'Ŝ}÷Ħ;ï>¸˙ÄípßĦŜL3fŠÁÌP& LSïl%ĜL5@֜?w€Ò Aßö½Áaà) ïeì„ğ$=pŞç^Ÿ]úÎK“³ßüúëgôÇߎĉ³7˜ùRšĤÂ0ĵÔï÷/Çqĵ16çóùt>ŸÏ'“I<ŸÏÓĊbħÌkڎ·Äö{íÀ´‡x¤r’3g7FË T‘í­­­ġƒÁ€hżïû<Ï;ìyŜ!)ċÑ;ßúĥûîyû“§O<È˙àáŝVÊĜŒ5^aF´• âìŽ%À’À>!fdğ9{J3X3434‰&(ŭüÂBÁÒ[;>îï;1çħ÷/˙µGgßyaëìŸ~ġġWŝè·ż9ğĈĞZë7|ß?—ĤéĊ0 /ôz½~żż5™Lĉ“É$šÍfé|>W0" ó2˙Ç İÒÜĠyK{-dwk~THÎöŒĥ‰~ż/G£Q0Afëa}˙ïûG”Çǝ|ôC{ë=Oïv˙ÑŝfÌ8§5x0M¤P=I&QHAœ} ĉÌb@Aç„0!AD`”b((Rô@ R‘f¤ZC”óC§÷íûé}Ç?üçïŸ<÷ġKŻŝáo={î˟ûšRêµ$IÎAp. óa^î÷û“Éd2L&Ét:M·”H, éµĠ.ıŜ^2Ċ7vZ—’3£0ŞçˆrŻH‡Co<‡£Ñh0 Ĉ½^ï@G}ß?îûŝ‰'nżï½Ÿü·Ÿxô‡6ٓR 5WĜJ‚Œħ ĝAÏÈ#ó@ĉ˙T}’˘|úy²Y3gn‹$hf(A (Š€‘fDˆXC H!ôİGžç­Oïo}ċ³˙ċ…ïüĉŻ~.MÓW”Żù˙şÓ0 §a.f³YlÂx°ĵ‘ŸžƒÒn_,Ĝ~Żx$gÎŒÄ*Żh4ġĈñx8î ‚àHÇ}ß?ı~ĝÈ}ï˙ŝżòäï|ï‘ -Äħ+¤ f ˆ#ŸO‰šĤğŜĜíMèÌë*éIYdOxK‚ËAÌĥĥĥ˘étJ5oiœ”ö2”ô­÷²œí-ËÉ0 ½ñx ‡ÁÚÚÚzżß?†á‰ n{½Óïûŝ~˙ùĝsHyQ1^_¤:K÷eVP䃀à‰,G$É<@½şˆ3°´¨ŝCŝ'#*eÉhO0R<"ĝšk†' ͈”FŞ̌žëûëŸĝÑ·xÏGï~ñSżü'[ßŝú—¤”/zž7ô<ŻçyŜE)ċ–bħµµ›ú% ÂÓĜf^ÉÙ.ĥ[ôSr@rĥ×`TxEïËÁ`àÇ0sІƒÁÑ n‚àÔÉ~ü?ù7ßA7xužBe%Ğ‰à ‚Gقdˆ-hĊ&Àş}çèú3IA İ R0$QCR3Z#Ñ@ÊL@_ñĝÈàèŝ½÷ï˙êgïyí?˙~KL·Ö…#)eÏóĵ7¤”›ïÏ677ù|žZۗĥĵÌeP‚ó’öŒnĊÇÉÙn @Ĵ‚Q#_4 üġġġŜÚÚÚx8î÷û'‚ 8†á½úħŸúè=üĜ“t!R˜&™l›È*[€( ÏQĉċy˘FĴ—D™ğ<#^~Œċ’dĵħ҅(ƒsĉ݆„Dejƒ=Ÿoûà‰àÔCŸ|í?üËÏM˙ì˟Bô…Ħ⌔R˜€Qá) DĞ TyV=#ĴòÌ ÜSáŸÉúı ‚ e2=@2„IŞ Á˜-Hn?z´ŭàÏż×˙­OÙĝŬ_ŭM"ê‘ODe6eĉhħXÀ‚Q”ÚJğFÎCrĉìšhUî:Œdżß÷×ÖÖzFGûŭŝaŜs×#>ùñ˙/ĵ[Ö3s…-Ċ`ĊšAœ…ĵBdĦ:&DF”‰l%-×´ÒÜ3ħ'­1•%~RK‰@ĉyApÉ Ö`)0U*Í\8àÂ<Ċ‰A ô‡ż˙~˙ĝû/ŝ‡ñ`Ó'"™żgĤı+‹Ej=zJ¨yI.Ÿ´Ğ T€Éə³kıĥÚÁÔĤĤ+`4ġġġ}£ÑèHżßż+ û|ïß˙ĦŸú™wÀóĊs“óDg…İ:Ë ġä2I·ÈadïuÏh‡0âeâċwIàL}`â†,²ûcOJƒ™0S †Ò)`+U8âKl=ĝä‘hí_ÀżŝŸ|Úĵ,˜³¸ ÖZ3óôj äĵ¤]hšQĥPt@rĉìj½£aw ċ˙‚ †a`‡éÂ0ĵï÷|àƒüİŸy<xv#6 ÒY›S„BÀ'†oÂt‚ ŒÌ–Ë-†.r<#Ûû鎿ä7sñužÇF§‰Áô„³ĈDeü”–‘ĈÀ'Ü{êîñ~àïwĝżŭ_¸ fÖJ)VJA)3ƒ 5(uÊ:‘n5E‹œŬ$ĦJ>tö×½^Ï3ŠşÑp8<Ôï÷oïġz÷œzü‰÷~§~öñTxâÙ­İ8ċl§ĠŒĦ¤LÒ-2Y!şžKg܀·P‡ë”ċNGİúEKʉˆ@̐0˜Ħ! ˜ŞĴŬ³6Ҙš½ïîñç˙â/|"ĝ·˙SÊÌİÖ:ĠZ+”JÓTÍf3(™&GoİíişŬŬ²/ÍÉÙMaS‡GÔ*dŸĞ´”Ŭ-󔜗´ĞxÙÑÁyHΜ]{ï¨5T†Ħ×ëġüÑh4ìġzƒ 8ÑŽîyûŭģӔéÌLċQʰ–†'DğE7›]ċ?á–0™ù Ÿ¸–×)ĵ¤ŭ]Mœ`ûTs0ˆŞ.ĠĈıżb=ĥËÊ˙^0Y7 3‹ ƒ#î}l´ñÂ;ß;ŝĉg/öz½Í$IfQ6]M&“\ú-ZàƒĴ„v…‡”>nEs@rv3ĵ£NĦlœêF£~żß߆áQß÷ï|ë'è=Áŝ#ŭó‰Pi&b Zk3Í5ğŞĉ‹È@;bP•p]y›fÛSҍ°Z=„×Ġß.ƒNµà‰Ĵm~ÙY·ôLžˆËż”u ‡*›8›ĊMH-üîc=…×ù€Ÿ$ÍäÙéh4Š“$QQÙÒ a…îÚ¤ßÎKÚ5dşġ^’pŸŞ³›àĠ=J¨. Co4…ŭ~†áAß÷Oëô÷˙c·À4ÖPşô´‰×É|˧j¨M³ ëċñ¤œ ŜT (m}òg‰ĥ~‡uö÷ÚüìoRëwÒÊïgàPœ?~öĊœŭLW/­˙]ŝ8*{óżCC¸‚GT^ġîӚĦ•Ĉ,R¸çäIyááïzÒ÷ŭ;‚ 8: ö ƒ~Ż×ój‡ġÏÎÙÍZW‚Zs—ÎCrĉìÚxGİ·ïû^żßïġûŭġ0 ĝû£ċ§ž`ˆWĉiĉ%¨Ük…AT‹3qYCĜ&µnóˆŠÛ^·‡÷ŠŻı^ĞF ÙÀƒ*”ƒ“òcŝÜ;ÚF°RÔÖL&2‘¤²)ĴX˜À8è ĵpßâ—úXʟž ‚àBżßßêġz‹ù|â8ĉëŬ)œ—t3#6}ìÜÄXgÎDۂR^Ûï÷Gaî÷}˙èħG{xŭîÖ7SÎĵ”KY´ùO/‘}ÔP¸Un-Òî8U U7š.³y‰ĥҎêt!€´"m‡öŞ÷ĵb\{]\…™0ŜçŻB›\ĉZŜ‡ñĠÛyęgżÁÙ^Żwi0L§ÓiÇqj ş.—´€¤$ğĉo9 9sĥ,\×" CöŬëġĵ~żßëġzcß÷yžwâŜßC‚oD œ–¸Ü…µ‡k³AkfóÎPW½äuF\‘~s½“‚ċq-tRŜĤÌu™W5OŠ*żOĉ†şŞŻtcĴÇ6Â‰Ĝxs0I–^ ÂHáİ·Œ£—p<÷j†çûŭŝĉ`0˜-‹Ôtpà”\]·¸²‹üVŒŸ: 9ğYžRĞw×ï÷Aì ‚àÈĦ{¸˙ŭì›ĤYñkž#İlŝV¸.ˆb† Ë;i9Mr­Ö¨Ş¨Ğy'V=PñŬŽ]›í–E”DĊïSK‹ˆz§B܀jû"Ş?ŻĵNEˆ³zÓ§Nâ[ö}GνôUß÷Ïôz½ ŭ~+ $MSĠñÙtòsağ›``ş5“HHÎn„ş`TxGBÑï÷{aŽ‚ 8 v`ĤrċC£ÌUbmFeĤíq‘§A!*àF£TÛSâZŽıĉ1Ħğ·oЇçêC=ɢ Qùü‰¨ "Ġ·~Ğlċ9çfÓÙĵ&Ĩĝ,f\$až2Ÿ8Iç÷ßùÀÁóŻ~Ċ÷ŭ}aŽÂ0œ!Tr”ààt“OyŸpĉìş…í¤”"  ×ëġ|ß_÷<ïàmïŭC ).F*“v3—ĊŸÖĉœ m2üÄeñ+UòBU(ٛğêò‚´n‡Z#vW rSÙĦËâV²nçÚóĉ–ħùï0âLÏ\Љ²aiyPw­Òá;yùóGŭ(ÚçûŝÈĵïó8ŽÚĠvŞ;ĥğħĈKÂHΜí>m˙¤”2 Cß÷ŭ‘çyû¤”ĵí]ÇS&¨\ĵ Ëù?ÍÂT]Àˆ‘ ·£ÖeÜl”ÊvÑ+×rIĥw¤ë]êx³îżQk½%\ʵmoŞ1˘˘¸÷l˜`ù|tfÔÌP*ë³§Q•²Û]'™¨ƒ0O4†ÇNz“}·ŬÌĤß‚`†a7NĠ£@7Ë´ĠŞə³Ai[a}ߗï÷|ßzž·6:zâĥŝħ;1gĦ:ÖĤö˘½*ĥ[ĊdÂ]v˜ċtÙâġ0ëÚ,"n´ ²aTıŸšìğŜĊĦÚğÚ)‚ìNvÖsĤzSÖ5)zéyeĊ²ŒÔŞOâZÌÎ4 ϞĞΞÑÁcwàìúÑ;Žž}rÍ÷ŭA”R*4şĊ Înö˘* c]sUgΖ/ê<ş-Ğŝ'ß÷½0 {žç¤”ûŽó½÷hmÄ&E–Ĝ ²ù›D?•m~„ċT´ u5ñĴê9˘ŞÀÁö¤¸âY-“}WŬŠ|Vz½°G—B² g³Ÿ3·§ÈŸİ֖ÚΌlçZx²€—!yÙûuhĜ #céû=Ïù? ‚ }_*RĴîÚPWŜ9ğQ!;eôÁ‰œ9ğZOİĦ°3ù#ß÷ŭž”r(\Ÿï@juñÖŞ9à˘U™ÛÙġ7-`‡é€—ŭììpšŬ꘽c“UĦK•Î UOŠê"£$Û#3ı ğ5RŜrÈNċèZĜ.ğƒL@áıvțÜ)gÓozž×ρ´X,ì~v.l·ûN}YN•œ9ğĦöuċÄ-„Ažçġ”CÏóö OŜ7ÖL+°ĉÂc`k·gn şS1¨íü^ĉTt!ŻĈĉž˜½é·Y²½•zN‹ZBxdélj˷–¤Sœù¨XĊ–Ç–{Hy>‰[ĵ6°c''£Ç1ííżmŸĝÎĜóĵ9H4ÇšŻ Û9a ôˆŞ“"œ9Û6˜°"üC&ä{ž×BŒ†'O£0ôİ.Cfš­î:5•œħ‘~sQĜÔ"Ô ù˙5ÊWàS?ÔŸ·…ìJ™Z^kĠCEĠ7<ë²` A–7dŭbéóp­µ‘ĠÀUi…#›ù$2sµf8zŻ„£µƒRŽ…ß÷ üšĞW„íœŬ$/ÉyHΜ-]#ÛZ!ÍÍóB=ż;MĠÎa4^LzC"Ê=Ôş‡´ÊuşÑ&Œg¤¨Á™³ĞQ6!I)=!„GD~xĝĜ>ÍD13$Šr9w BmÒfX’0n£ZíşĦêÓ`+£Ïkâ6ÙZĵ/÷ÖÊß·E™T]Àŝ}] Uĵ:.‡ùhtnÉİUž—ĠŸŻĝĊ>a8bS†"$"ˆ¤çy^עFL7Ú47ħHΜíF°B‘4›aà<2Jt’TsÙİş‰)7ĵ²ç\1I—ŜR•ĠyFŒ¸Úùğ ~ ÇHsëmġĤäTƒ‚ŭ‹šÈäİusTşċŝä695ŬWÔïş9óIäÂĊ{=$" "O!W$şĈQ8(Ŭ0ċ!ç!9sĥSĠ7²Ê÷B™yDäÉÁ —j@).îé6O¤İC-UŻİ.Z(ò@]3â:Z‹sVMÛı#†ÚŞy4n3tSM׀838„GĊX´ê³[Ş”t^ҍĉQŜŜyHΜ]-¨ŬÀ‘WjGF{nŜOžü/<;gTÛM[7ŝĜٞŒní QoSTŽ\wdn×5ïÇîÁmPÌOq%OTÉİĠó^dJXL›pÒ}Ua³³›mښ³â€äÌَ@DK@DÍ?`b *ÍrH\ŞŜM›W”S@×@@膑 ĵVϨÑġğEn?Ż. ġbŬŠ€ş¸‡â>t ëaDF7€šòx3ÎÜ#ôŞÏĴ Fäĵ£]pğßy$g7Â+ÚÖï1sùµÖ€¤ìä_ĞçİÇиsİCÌFutyhˆê ¸êŭpÇmŬuSÜ"ŻêË+uQĊóàö=hYÎhiï?Uю?/8íkĈ­œ9ğžSÓ–$Z7CQ\ ‡µmĈĴ[| ÚäWjÙ¸uWQíħ57·ĥœQ%Ux3mżW ÓU†ĥtŻÜwŭö.qÙSŻÈUÙ^™u ÀÊŞ³›#'Bœ9ğŜċaÍGsO†Ĵf e;…ĥ}ĵ€BğWӄOŭĥĥEeŝŞżZ] ŞRċèŒĤ§ı÷S·toÌòŒ·wè’Ŭ&)ï`!(5lç³[9É5X½&Dy²p@rĉìón lË­ı]Af}§u›ËĠ 5[íÔ6öhîòş¸ûħjıjȎ­ĈX9ϨĠûk}’Öm~¨àSMĥÎÎûÙĞ£9pËə³yDÛ ù°Ë"°È6NċmځÍ ܔD·mEP­% ×"äڃ2µäŒÚ€£ž\ğhŒšŞ>˘íġĈ3g ­ĵÔH+Ŭ€¸Óîç@à[Żs’³] ŻlïĠÙ¸íÖzžt£˜µKj€„Wŝ^éĠÌ­!A]sZCnĵlÄwzşµİŬSÓµğ*ş•k†ö²p]Kàg;Ĵ› $S—CrĉìZBˆ:Ö[VÀİĴ‚ÓÏĊ´‚cjĞ}§í]²ËÍ]·2€+Ñ›u04/´u`hñš¸#gÔ\;4Ĝ˙i "*ŸRÊ`plډbÒċ7ˆUı?$gÎÑĈ–mĴ"ƒ·ċH¸9ün;5J%€jùnڕµÌÜ Ĵtğgč0] @mm[¤ŬMh5adğlPj!a~wı|Ĝİëv›éĥ‹’3g×Çc²;  SĠAÒÈ} ğóu#äa-nnñĵìż[–3jġŒt;€* +‹N°ëŜ\Ë}ׇÚêÀòĦ²çF2SÖ­Š„ğ÷–‹Ô12Ùə³ë³Ö ùs‹Ú­ Óm@Š·Vpe\yġWxFÌ-Ş~S铷êı7ÂtmùĉtÚÒÛjïÚÀŠ ü A€rQĥ½u|3‘Qv!;gεW”oĥd{:*2%¤Ìöĵ¤v›0ĦjĞwíwYh`5UxĠN şıù·äŒt ZÁ¤óZĴî öı(ŬÒì•Jeít˘Ûö5ĤÛŬÇĥ²8Ïə³ëoİ%Gĥ‚\+ ]á4tt`hk´­Û*·nˆÊ?]&íߟŬÍĦğóCĞgd˙j¨Öû¨ ¤Ê†ĵ‘ÀNğF;XíÈ dœ9ğ~VĦg󽳍Z·‰ÖZ!P÷<–Á¨„ہQ=·cyF]*âkâ†VGÌÓ-‘ı/ġŒVÊ é:½rŻÖAéĉ.Ö·ž—ä€äl×ŝHPĥakd}íÔò)­Ü1ŭhÏ´}Ğ[óJËsFmaş|µ²Û öjEŻġ7Ĥŝœê]ÀY×ŝÑé!û^€Ck†ìx>Îvó"Éĵ\'ûvĉì‰5ƒ8ótÚ>@Ïö4şöàe=ï*ıİÖÁ{Ğ:0蚚ú¸ġv@]pkġŒßeuFŒF²u0İĵwQUççì-Ëg²Ü‚Ÿ›’³]ç!e›Ĥ†ÒġzµßK&¸6icxl5ÛĠÓ´Öû[’3ŞżŜĵ ]Ċ´sĞލÍáSJCúhkvçlxHə³ë}ĝ²DğÊZYi‘–ö8íŜ„•÷éÌÔrFMSkÀ)zÓñROD/P3jéÑÒZĵŜ›Ž-Ħ·&ÙŞïÙs°†ë\·×xÄy›|$gÎŻ‡Ä`ĊP0-R˘‚îÖ9KóG¨ tKż X¸.½½Ŝtu4ސžkîVcÔ§)`èöŒ˜ğá bpšċê„‘öĜĦ­èFï€äÌÙu^lYVÚ@×îñŞM¸áĦtt`°ïğeD7]–üM·gÔú\ Â*À6ï·Í3âÚvhšÛ8s;9e耜¨a/†œìۙ³ëì!e­m8%°ĥs5Ü][;^ÖŬ4É£—Œ—èîÀ [ŻĉħĦEğ ĞžŸM- ^ -Ö-°m!ßoy {R.´÷€DhŸMâ€äÌÙµ‡’Qi2kOs9~ğ²Y7Úİ6ôŒöIŻËş€ëmzF+êŒZ_›nÁŽN/I×½½+0Ô^`ŝTEŜ}ĈEìö–ċ­žœìۙ³``˜°’QÚé.éô²ħ\q*Zöçö|M£CÛ&ŻĞ9#ŜÎX‹šgTïè½Ì3âê pw{€ ĦTCĝÂôr—Üž3AàÔĈ:svcĵ$ӊZĞŠ z[óŒêêşí„éT­Î¨Ğ'^SÚŬ!&èÓuyFŞ$léM‡U;YT_ĵĥç< ¤œ‡´aÎBÛHΜ]W™…–Zµ{< 5Ŭvt½x™'Ñ1Ïhuo:^)íînlJğÛ$zíÉÜŬ˙RL+2/”5;Q^3Ċ·ìÈ$gğ’JJħİ˙#3ÖÁŜƒW‡éEŻK6\6ÄÍûàŻİñ|rµ=|WoşşKÓùÔy)€ìdžĤ΋%›PĤҞ;µáÖ µ: 9Û}‹MBš“нì:tö÷\ĞïİíÔ] 5ġâeRíğli”ZöĤëÈ'-›gdM&äĥ߯?ı5<# šc EÑá›<ç íIğEó~HÎvßZә‡ÊÂvĞšĤbé<£NñC×à<Ĵáz l{t(ü*µNÜ6éµ£Íy'äjkó*îKHˆìö·¤ZëÖ6­ê×: 9Û}ËMdŒĠB-ğ*!·Öz$n :çUâm›5uµĊ3â.Ğ=£: ;‹^ÛZa‰š.`°ß+ëaH3 ȃs‘ö¨ƒt+#œíR/)[qm0êêÌŬž&Z%ín0Ô½½LrϨS†nċŒ­í€Ê nğÎM\1·xFT’•=‘y šádv{lm0gıU$gÎn€‘PqŠ–ĜÖzÜĜğÛŝŒĤ€Ħŝ7•yFKê›*İĴ.ß-ŻİĴ::0p£XjıGÖŬ†gn#€ÒLEĵÎvi²ÏŒÜĝ gÎnÌ h²ü†âÖyFġœ·ÜÖ=ψËoSÀ ƒϨ‘ 6s÷¸ÚA{Ü"¨¨|‹Ϩë‘Ĥ-“O:]=gğJ¸%HÎv§“d–„âZĤĤZ[qĞ4œÍŽÍş2•˘×m´öħaÔ €–ĵS³7wz_msž–{Fö/ä9*MB—ĦQg{imh0֙³C#„$hUÛĴ;rF\w/jž‘Ò£ñ‡m*áĊ^o~İMbŜĤĤkġĉô’1ÛÈÁ~}-×–żbˆÌ<$íúíÉġş%µ(HÎvßz#‚f†JrİÙÍZ·z+ÜR°Ú>vœwâĠĵŽN5] À9#´xFŒm猰"gԚÁ²ßl4<‘2¨G.d·ÇŒH˜˙; 9svŬMġG\k:ÚÌ÷0jqĞÄZ7úÛ-ġŒ P…kmžQ'ÛÌuÁˆğ èċ·ÔGVd­ÔY3H¸knOܔË!9svWYıï O@Ċ޵Qjëp½¸ş#w{F]á´Z£%#$ڊ^w’3B§šùóVµt€h+ú% S†ô¨aŻ“[ÑEr@rĥû֚ ŽŞá0­Û6^R|Ş[Ċ •pZt-jhpLş‹^ğrF ˆĦE×%[·‡2w‚ħ‘V ’fSs˘†½#¸3g7hÁIĥiŞÊ¨vôîêÙVuxš­³ĞÍVuÇÏÑí1ì èµË3*~·Â֖ MçÏŝsĊ.Ö oRš8"í½%ÂNÔàÌÙ 1˘b‹fêöŒL F\Ï?µ¨ŭ[~¤ğĥÖ<£–ġœó2m8ZT…ċs^™3Z£"ܓ…í²/³ÛKĤóə³Â# ëlÓl”Úá•òknP‹—‚î˘×†G˘›ê5[iW'ÉN:0TîY/‡._-Œ¸tˆHĜß;ioıGĉ?òÖS£8 9ÛáF’Z!´zžE·Ôá )i×<£Ñhv`àΉµí0âŽŜtĜ†h˘ şW£#gTbÚuúŜ›D˘ċDċ€äÌÙuñ4Ş\W7J]ž3ZÖhU†V´ ™3Ò­ÀĞ˙€WÔmFĵ:LWɨÌ]rĥ‡Lˆìzp@rĉìœ˙  ³§ĞëŒ2Żİk3½.ëÀP|İ;zÁa‰ğm„D ’@-üw50bl?gd{“ÂĊÊìÎ]iYî† ²sĉìz#Š“-ĥ#gÔáu½ĥĉŒÚÂhşŝPËp ÏHéhĥQo‡0چ—ĥFù]10ŸFˆf Ò(†ÖÎMÚ;‹„Ë“›’3gחHÌÈ:RWF—ŻÓ­lԚ'âmu`h{Ír™gÔ=Ĥâ&ÈÌ?ZLDQîy€PN԰׌(ğ8ĜĈ:sv[Ö:ˆĴK‰kXġ˘×6ϨuT9şĊËÔt-B‰fÑër5Ŭ̀Q~÷qĴ0Ÿ'ˆçiÖ5ˆ"Ès}ƒöžél²£p@rĉ솜³yHlġ!|퀸 ½¤5ÏR5ŞÔë.zŬ0ŞC:š˜Nc¤‰Ŝ'œ(PŸÜó=EÈ>:Qƒ3g7dĊ²ßE O[; Hğë·íDMWÁí&µz‰ÌXÌSÌĥb¤ÊúEâê†&i×ËnÏ9H:48ə³€#Íڈj0BeÓî–vo7LWïÀ°J×˜;¤ù†Âˆ—„éX1ĉÓ³Yϑ‚™Äg&Ĉ’¤lÈ[àBv{ÙQr@rĉìş2+<ǀAq$[’3ÙF˜Ŝ0u…€Ħ #îìúp½`ÄžQċy)Ĉl+ĈbžÔ:×î\—Ï›S€BSŒ$¨aO™ĉcu!;gÛ4˘ë/]â[²€$ÍL@¤]MWÁÈ.íòŒVˆ—„éŒx9#³IŒĊ4İüĵFmù&@êÖN!ŬŠëí›’³+¸èéZ_]{+@ŠÍdS6 @9áîŭŜò~vĤÛ%0â+0¨Dc6M°˜§+F wÀˆ ¨Ét½NÚ7x î‚uxkŽ q@şĥ?Ŭ€…@XÖĦĴöÜö LaŞ€éÒP“aWú´mOM·aÔèÚ½ ‰Ĉl#Z¨Öç²]Ï(ï…Fà  Ù­X‡KAu]×a~í; 9­¸ÈŻ5¨şÀCW²0öœòB$†VœĠŝÙóżkÒîÖ.üğ FşùË;…QšhL'1â…ê|.ۇQĤáTƒ Ġ„ŝ-pÜÉz£+XƒË~—VyQWżù–aċ€tuşÚÛ· ĠĦ;³÷áĜyF•Ŭí€vŒ:FH\ Œ’Xcş#qżeJĉdsށĜĠ›Ûiëv¸·³oì!QıқDtÛ×W³ô[3ÖŭnP•EħëÀDˆŠ˘X&mòğ Fĵ0Ŭa”& “­q¤Z^˕‡éЧ¤Ê+ÜSwíavsşFkKÖa›·D]žÓŽ×a^Kĉ€ä@´â"§mŝí•.†ĥ ›·ı0ğëÀd˘$ œÔHĞë0âċ[Ċ^‘ùZYhn1O;^Ë5€Qŝ“Hú^µìŜ= v­íBëj€T_‡Ĝœî€X›@ì€ä@DK.ŝíÀjğ‹bĠEÏ-˙ç%÷µûÁdu²ٛ1wxF{FÜT Ş4WÍ%Kf3];{ÈĵÑŬpÒ‡AÚĈ½ÒáŞ5G-‡ÂU?żşu(¨1ÖÄé͢U˘'´.ˆíÀh¸cQì~01*+ĝd͕AG{FŒÎyF:eL§1³K^KŻM'!ĉ›ħĠÖáNƒW²&w U0ÚîşğĥÄ[FoZ mDÛıĜ—~ïû>yž'Â0AH!A =ÏB""Bq²ë,›K£™™µÖœĤİVJİ$I8ŽcE‘NÓT'I ;TçíN0ÙÏLP%¤tÍa¤;ÖöĠ¨Kڝ³I‚ù,)B7FÙ‘Ŭ_zóꐖĴí€h[ëÒ÷}€z½žRRŻ×óòġl[ƒċRÔÌ̜ĤİÎ˙- ”Ò‹ĊBà$ItÇDÇZÄ6Öa%ÇÔXƒ:˙|]iÏÛ§>ġİížĈĥŸĈĊo$‡Ħ ÷}ß‚À“RúžçB)„„AD˘v‚™µYJkj­ST’ĤiÇqš$IEQ²X,tÇjħX¨% £kQ\ù‚¸fF4˜ùÚÀHwxF7 F Ìg Ĥ“$óüpa¤óO™³Šca€Ï”µJö́pÙ:,4e²×ëyazï^f”Ò7kP‘4kŸ6³ff•ŻCT˘”J“Ìâ(ŠR³ŝRë ¨[Ö:~ÖµħêpȚoÉ9Vo Ġ@´ì4ĥëġdżß÷ÌĊôz½÷ŭžïûĦçy=!DOJQOQÀ3 Á³î/ż03+)3'Z똙çJİXk½HÓtž$I”$É"Žx>ŸG‹Ċ"Ïçi Nm‹`;`Zı ·‡¤YÏĉŠaÄÛÓŬ EóÓI •ÖfÑŜ(ÙwdçċĵŝنW´ DġġXĉúŭ†ĦèġzŜ`0Ccï÷<ÏëI){RÊY!Dä‘´Ö °Ŝħ|ĤR­uÄ̑Ö:VJ-Ì:\$I²ˆ˘(Š8šÍfÉl6K,8)ëÓѵµĥJ×µà|ò­·{Si^Q×Ċ.yž'0”£ÑÈï÷ûaŻ× 0ìA0”Rޤ”C)ċP1B …C)e@ŸˆBĦ’$"qàÎӋ/=że·HħÖ:°ZÏ´ÖSó˙‰RjŞ”š(ĤqO£(š-‹h>ŸG“É$‰˘HiŞ–œĜ–!nš·D&Ï.,:Ö;‡Ñ’Úžhšo9Œ’Xa²#Mu£•ĝMQŝ]ĴAgD$|3`´“ĦŭsÑv ~żßïAïġzÏó†žçċkp,„!D4$"{ zfŭµÌ7/ĈĉK "fŽ˜yÁÌùœ1óD)5I’d–ĤéÖx<^˜u¸˜ÍfÉbħH§ÓijÖ uıŠmZäïáúOŝߊí½7)Œv²lIÏóÄ`0†Ħ? ŭ~†áÈ÷ŭ‘çyû¤”ëRÊ5)ċ>"Ú'\;ñà#·9}ïħñĦ#ë‡z£{#Çû)ċ…ž@˘ĦÈ.aËg^›Ċ[—£éùóÑäüÙË^xöìßüê+JİMfĴ”şĴ”Úp£ßïo$I²EÑd4Íf³Ùl:&³Ù,µNkÛY Xċ-]W(1À*ë& Ò|·nÂvñ,_+itğcK`Ä5^(•¨µ–èĤ{FÖôkè:Ğìv赨˘ápè…aè‡`8ö{½Ŝ÷ŭµ ĈBˆ| !։h}|èÑwŬwb|àÈŝñácၣŭp¸/û0-ĵr U‚OóÉf<ÛڈfÏ̧ÎL.]|ġÛŻÍ.ĵ~–™7µÖ—ƒ Ĝ0kq3I’Í$I6‹Ċt>Ÿ/ƒÁb6›ċ`R+ Ôµh7ŝĊhŭŻŭ; Ŭ:!şmAÈÑx<öûŭ~0 úápÁşïûëžçô<òâħ{îğóÔÛŜyúèŬ÷Ĝçİq$Cı‘*LĈı”ñĴÖ8fŽ‹iVl5eÊ&²bĝŒŭŭƒ‡ †GïĊXħ£¤júê “KÏû♯ñ… ßúĈ ZëóJİóJİ a^ì÷û£Ñhc:Nçóùlkk+Ŝ&˜x;ŜRJ×ĵ£²( cI0ĜzûGÜ#qìƒŝÛ1żĵ˜ĵöíËŻ|ë̅çżú\´uñu­ġyß÷/(.ĉëp0l-‹ÙÖÖÖĵLzĊ°óp¸ñÏ?@ĝŜZ-ż½7Œd§1ƒA0ƒÁ`†áşïû}ß?äûŝ1!ÄÑÇo;ùȇ>öİ·żë(ÖöÎ' //>żİñÚl†H3<|hH"fŒ¸hLP´Äaš€T3&sKS…X”½ǐëûîZ?üÄéġŜ˙‰SbëÒâܗŝèìw>û_żuöµ—}ß?“$Éß÷ÏApħßï_îġz“Ùl6ÛÜ܌§Ó)mcAl J×%ŻD%”`ßĴ:~÷J`t…½éZ§£Ċ"Ċt+Ê`ŠŬ £ü½e­’ _ĜŞúk!fĉ„èV{½ž ñˆ†ŭ~- ŭïô<òˆâĜé·½ûĦ{ïİ}'z÷ĝôŭëg£ŸŸxñÌQvÁ÷ˆ0ŒÁCj*NB ˆZ÷jÍ M€„” ‰b$"ֈb—b…—5à{„µ`Ĝ;ööŜùû>q§zùÏ6^ùƒß|îì˙î}ß˙N’$Żû. ó½^ïr“,ŬÇnä•ZŜkC%ĉn!Ñ6aÔ9ê{Œ–¨£4֘lĊHâ´û÷o6Œ¸úĉ‘Yh4Ö ë04vŒĥċï‹Á`àŻ­­ñx8sñ}˙˜”òÄp}˙äûŜ~â-Oßä^W§ĝÒïžKH#…P=‡}B“%Ác ϓHkˆP˜ X‚5ƒl0¤ò²]ì‰ħF¤.½‘àüÙ)ôÜ&z!Ñħġƒ~˸ïÉżôÈü•ݽñڟ|úKñċ3ÏJ)_‚àuß÷ß‚àRŻ×ğ< Ĥ“É$žL&ñ|>Ż v|8üÔ§>µc(9éĉhۋ ßïËÑh ‡p<ƒÁ0 ApÌ÷ŭRʓoŭÇßŝ–}÷=|èĜà•…Ĉï1ÇĞ3ĦLJŸ'K„ÀêŝxÜáß\y ‰³w•np´FÜámFÜV{ĵFгÍĴžh9n>ŒŠì[3HJ@5÷ĥ*oSÊ {-ú/Mù„?û£Ñh­ßïï°ïû'<Ïğm¸˙ôŭ Oœxô}Ç_Úò˙ûµ-|•³˜NR„ÄP=èûĦdĝD¤€†)$ "sŝbeÙD UIÊH……" ,RĈ4I0j?քÔg¤@œjÄa+ S™L1‹ĥ6¸4KpùÒ ÏêÑÉcwğï£˙iyŝëo?÷GŸú}1ıĝm)ċ~)ċkžç ‚àrß÷+ĵá-%ïM#ħ*4°ŜÇ£áp¸Ż×ë ‚àĥ îüW˙úğF÷½ċÀ‹3…/ŸYàBÊJc,}úBAÁ'‚/ʇÊùFwNàЈA`HHd÷™2#$B F$ú¤0d‰IŞ1‰4"ĵ”jĵ8Ñ?<ŭŸyrߣï:ŭ˙ĝż~6ş|áτkRÊïH)Ïyž'}ߟI)£Ùl–$Ib/Qƒ/9mç„ĵ}IgĦË|ӴߛHğı!ÛŻFi˘ħı!ô6BcğFùïk+ÎD×SCÛ5ħñ†a0z,Fw°×ë÷}˙vß÷ïşûħw½mŸĝĦ·ĵĤG½˙÷—6ġ—6Ċ)B&ú@ß%x¤$4ġù&Ï „@ÉèùqŞó‰ÂÀ÷1_ô}…I¤1[$˜Ä :KÒk>Ŭ~äô‘;?ôß~ÏàĊßxvòßĝ})ċ~ÏóĈžç½ĉûŝ)ċ†b*L˘(RµúípĞ@É{“Àhۋ`mmm}8èġz'|ß?ÁŬïùä}Á÷]oh_ŝúù/ψ5| ŒgFOúRÀ'À'ÀË="Òy‰¨İ×Ö~‘YĜAJ¤Ô!àk $B&šq9ֈ”Ĉ ‰ÀĜ#9ġĜáÛáïÙüï…ÏŝÚïċužçġ<Ïğ ÜB,&“IÜRÌgŸşB]àĦ+ÙÑò}Z3´ş25 W#VŒÉ$Ĉ|žn3O³KaĨ”a“wMFawġkێp¨ĝ˙h4òMh°ĥĥĥŜï÷ôz½Û|ßżs´~àÁ÷˙ċżö˙ä[˙֋›ĝ쟽†Í2UĜçKŒB_}_ çK„2 “KAfŝS›ğÌ+aÔĵL‚Ħ'á Fà‚˜JBègPÚZhlÍDq‚é<Á· ç6BïäĦ>pÇÇżmë żò9ñĈs_6ë!DèûŝEß÷§[[[Ñl6CËáPwïĠÚ½ %ïM#{!ˆ^Żçċ!şµµµġÁ`p$ ;Â01<RFàklĤŒYŞ0фiŞq¨zkŭ+=ŭ–ç˙Ŭ˙ŭ7ÄċKC!D_Jxž'‰hCJI—/_ŽÓ4UÖĜi^霳³Š<£zJoŒòœi÷£+H÷(ŒòˆT˘A&Ž|rH]óÊ5èû[[[ ×Öֆ£Ñè@żß?†áÉ Nßġ–w<ñÄ_üÉÇżµéżù‡gñìwĤà8EkÄĦHô<@¤DgĞëÍۜUğÎ섐“_*ĝ&T/ħ5el =]àâ"Ád3Âùŭñíoŭİġ_˙Ŭ“⛟ù-!ÄHJ9RRÊ D´ ³ÙŒĴa[ĢË[ÚÓPòŜD0j=‘F£`mmm4 ‡|ÜóÀğß˙î÷ŝèóèyÙóŝà|„× *ebĴK`Œ D}s†˘ŒO3·äıy]wo’ş{UXżKœ…1$ 0¤Çĝ°™Œ³›16}‰£§ßràÀ_˙?}ÏĈŻüßɗż=B„Ĥ…Š'„¸,„ ÍÍÍxħX¤Ö{İW„Ú6Ÿ+7…Bó·â†Á¨vpH’²ËŻÀžQŝ·^†âë;ݵ”˘#Ùï÷ó|Ñh4ê÷û'Â0ĵÓ÷ŭûžĝîüñw~üßx~Jżŭgo`ş•‚R…5bŒB?ƒ‘/20˘Ê¸’öÓZg$nFġ(Ħç$IH"H‘‰'<ós­˘4Ák‰ÂÖ$ĦŜsÏíOŜu_üŭ&ÑĈ€ˆB!„/„RJ!„˜›ˆ:"zI¤bÏBéVÈ!íFÂ/ôÖ××G£Ñèà`08†áİ î˙˙ġŬùÁ§nû³iJ|qI˘ĦSFÀZ@è3'B(³P™OT䊸–ĉUÙ6ŒşïG! aĵ%ÉOdPş”f*½İVxċr„£ŭ½Áŝw˙ġßÂŭמé­ç3OÀ@‰k§4½ÏeGĈÌĤ.‘ ÎzÚñu‚QÇPĉ,<—…À­#Î(ùxĵû:xFè€Qŝµô}_X0ZÇ‡ûŭŝíaží{è?ös]ìżçÀżûÊe|áù èi_ Œ0 $Ħï ô<ÊrER@’œĜ5†Qù"’([=Ĉ/Ëŝy"ÖĈ,E˘é4ÂFĴE)âCÇœxâ[~;Ô;˙­ž"0M_Eք\ˆétšUmŭĠĦT˙,ö$”ö$,ïèŠ`T;‘ ·‡axj0?ü=żž ïyx˙ï_ŽñÍ­q’Ö{B`LÈ`$2ġ[ ( ÑYÑŜDF-#w@œ-ŒjJ 1„2„! &IĥÁ–Ĉ88 „÷‘~¤ż~dLżŝo~@`M )eqז§t%Pjƒ­üM3|LkSĴ¨¸ÓKĵ"-ÙĴXak³,n½ċ` &ÊĤòĤêJ&˜Ó(1šŠÖŠW@xž'ûŭżĥĥÖ[___3ëŽ îÙwôÄcùÉż˙Ħ—ÒġÁ3|/_X€ }F0’ƒCOBy2Ëí,Oy`dß&Z‘3D™-³ġɄ(E”d]Y“Ż+Ĉböœú‘÷Żû˙i=xŭOÂĵñ2)„¸œŻĊĊb–0z}-îyġ·‡a„Â€‚À³Nd‡úŭŝaŜ³~ĝÈ£ßûw˙ûĞ£'Çż}!ÂËó,DNJÑÙİlÀ@ÏHı}#QğŜŻ5Œĥëa8{.L— 8ë#CJ-Ħ@xccìK~äN 'üß˙ıŸ·â·ĉlYžRŭèa;\IĝސÁHÙċ˘ƒk#­“­Ñ"mt`¸eÂtYçDèTR€ \E“NêĝüWÂÈÈşûëYˆâ`08Á½‡ï8ġöüĝß}ß7.½_ŭú9\ĵ¸€ž%ùcúŸó2yR@š°ġ̈́QñâEVoȒÁyÙ\>‡ •‰˜13ÎĊ qÒ³£ßŭèQ<^ù-?’éxA&-떄’·‡a´jHWFá_[[ëċáÁ`pG†÷ów|Ïßù?~p2>Ĝ˙ó œ4´f¤İFˆúœ…è™…è$›âVKħt-`ÄÛ Óµ-šâ…ç‹B˜žeÈÔF”›* LHaD·ĵ÷˜Ž˙öñò÷™sÖN˜™˘(JÍŬçĦ;óRo yĊŠ;6"AÙŜŞqŬa-&[QVStĞÂÈŬ’TíŬĥ3Ÿ—êı Ĵ2Ô=£`<÷öíÛ·>ŽŬ➇ž|ϏüÂğĝûÏ|ñ lnF‘š/ ġ=Ë+YtBtiün0ŒĜ¨ÈŜú’ÀZ@ûeä„Ĝä‹„ÁQÁŒKTÜ'½˙ğî;âúŭç˙³DÖì˘X‡išNÓ4ċ4MÛ6Žĥ‚ġUkCŜ¨ŝ½èZáFáÚÚÚh8Êatìîûžĝsïż˙yoä˙Ŝù#$e(ĊÉĴĈ(°ĵ"*Cth)rċî ´Ú)È*Òl{q ˜~àÈĈ• uĠŬ -RÏ\‹ĦÌOjb ‚ĈD ĜR™jÀŬL~ïOo˙gi½0'´­ÍÍM(Ħ%ž½,§·3(YgnV Ò-|Ú&oïFZ3&›1Š—ġf€QĥÓĦÖ Úu¸JY'óµ˜hmm-‡Ñ1£ûN>üĝ{Ŝù?óÎ?z5ö>óġK˜ObBa-X Ż„‘/2 Af}RыĈÄK$ß\Ámö0ı€\w>f>x‘(ËízLÙ?M`&hö ´B’ŞLá˜ĤĜœDÄGïĜwW˙Ïïñ˙— óAĴµĉÉdµ@‰:^}F{ÁKòö „ĥ“?ö?3´+0†CƒÁàö î=|òw<ġ żĝÁ³rè˙öù“T!N•hH0ĈĦGÈj`Tt5€óîÉġëĜjÈYgG‘gZ˘·Í×qÙXĠ^$­n×R1ĉ¤–?Ç"é*³…|9apšIĵfìğŭŜġé'˙ö'Â÷Oê^&˜yÀ†’^kìšeÓĉ5oӀVÂàH·Bŝja´Xd :fŭĤ€‘ V H£M³ƒÉó~´$o„Ú\£ûO>ôĝ{Ŝñ?÷Îßa&ŭ›—]Ž@šħ֗ ĈPÚ!şLEGVf.;,Ĝ4.A\z(µI½Üv™°@._eÙĦpüĥǞúÛżôÁ‹½ġw/,0I5â„ÍDOĈHd şĴëBV_$˜ŠF” †ÖÔh-‹Á|ÁhÂŞëdg/B‘Ğ İ=֗ë$²]ñĝЁ@B‹‘†À4a0§ĜwçŭëÓïû[O‡˙áŸuBĂRÍgYzˆĜY.‰šuuÓ¸0RĈ+Êĉñ›Fġgŭ…OĞ]Ÿá²l} zı€Á‚ѝaŜǃ½û?³ïüƒ—ĉò׿qÑ4iΔt‚1%z~˘“"“T È1SÙŭlğ/£awMâVŻİÙÓ@‡sYż;ó}Ù}…›Sgᑂ2oIPCi 46g ¨4ğ?Àle§Çµ·Kޤîĥ³˙I÷ûŭ„™S”JÓTÀĉĉ&[Ñ Âr)8öJènŻ…ì–uíFŒF£Q0ñĝ@żß?Áİġƒ‡ßúôßùoġïb„K‘†Ö(”UCzD)óŠd. |çe³ïpyMÚCÚj0bnfŠ–Ëf÷[LñfŞí \\èDYˆèg=FÙ8SĉtbÎĈ¤Y(}‰ ‹LŽ7U ÂÖO?¸>ŭżġTï˙iˆ™™ÉÚĴ(Š˘¤ĥÍĠulbË•˙µ$`Á™ü[ñ5Ñb‘b²•˜°Ê›FE, Ê<ĝmU´ÍP]]M×ß·oßZFo{÷;~gßùû/ÌċŻċâE Ä c0 DVìê ĝ’Šú²>ƒĵħh`Óë0SŬ3*ĵ)n¤sKRÈ YħÖ\³ß"ċÙ#Ş{\%óž”ß}FŞ%12#§)˜³ì°Ŝz›Ĝwù#Ç/˙nẨÖ:ÑZ+”VJñt:kµ„R÷œĵ=ĦUĦ:Q˙×ï÷ŭáp­­­ ƒ£½^ïÎŝ`À‡öï}$9tbÙó.Ä IRžÄÊzĊĤµ’˙ ˜ÁÙùĴlŞĞž[x~ÑëzLğuÍo§Jh.™°A(".aĨ†ša,„gzìi 0gCÚJ\ˆ³¸ÍÖ4S™­Ŭu˙úì“?˙TİÚö™lO)ħߚFĵ£ıIm+D’ÀIĥuHmĥMİ4SĊħj;~ÓaÄ͐ċu•ğlĤfĴăW­=ÚĉAہÑí>öžwüċŸyÇĵ´(`D‘ÂĜ/aú~î‰òÚÎBeEħŜ •ë-ħù½>Ë$·”–ĉıb 2qùb "Ï)ħ9ĥ{Jlşöçï>Ö÷ĦIÂH•Îg8˜n-@ĴqfüğäÒ{÷éŻ,úŭ~Ĵ”ŠÓ4M•R*Š"UË'ħġŝëeĦ;ç!]?8µ*zòñĈ£Ñh< ÷ûŭÛÂ0ĵç]?òS靺ŭ·ÏG87WHTöYi­ÖèIa:tçĦKÀ`.le/xKlçŒì}¨ pÛ~ĜŒ]3w˜Ë!yèŽò/—á½ö~yY­†0ĜÌì6Ci`ièDcßĴO?ùóO…˙…rêPbĴîÚŝ’j÷ÍÊÔċċ€W£üG‹YŠé$ĥBoRĠ/ÖÙ<.f½“ÖAĞêɊ… ##í>Úï÷ï Ûxì=ïüŸ}ÇĵÉ_ûÒyĉ‚H5FĤKw!^Â„è¨2…­/Ĝ:‡A|MÚ˙·áÓS#…ÄEĜ.ûş‘Yd™£iŬû€ÈÙG˘‘µ*ÂwF…g zûĦÀÖLgšqÖà$ù“ÍĈû=;üĜ[Ŝšžżwĉŭ~Ħ”J’$I8ĉétiʵ°Ŭ²Q1ğZ}çí1-;­ {1 ‡C0 F£Ñ^Żw<‚S÷½˙ïıóŭ=ñ' ^[(¨ŒAPĉ‹>‚âJ˜r:*÷.à ŭ_žŝ,1îħ¤Ŭ|²ß›“£ú{-—0Eċ~Q]N 0“X#‰5ÀċE‚ġ;î_Ÿ~ßßzŞ÷ŝYÛF´eċ”t3ÛÓV]nŒĴ`³ĞâFu¨kĊĜڈÍ t0*":–ÒN+†èÉĈÖT; t…ċş %<Ï6ŒĈñÑ~żWŻ×ğïö{Ï;çŜñû/ÌċùÓKˆç <Ċ`èzž@(E6Ј2Ÿ)[OĠÇi@I×AeˆĞëUWbí-Ħs.×#`âBڝ°(xYaz޵CƒùsËßĵƒC“ˆ=E˘Í MƒÓL¸1&BïO‡ßóžÇÒ}1Ôzµž'I%I’&IRä•:ĤeĦş]½¨²ëŠW_›P]8÷ûŭ#Aœ%˘Dω´“€ŅŒ^o˙àÏzßġ‘Ô§7”R[ƒÁ`–$IEQÇħN³ĜŻ8²Ë!]_ïH´„êĵ^Żçƒá`08ÁmaŻwÏ;~ìo>yüüF͙šN›Ğ˜50È ^Ét_ jHĦ]Úm°lƒ.BG\ pc³İĠˆĴˆ‘4rJĉÔ¨‹ÂĜ Ĥš‚ı$TRy<;żÈË`<*˘5’E _ \>x6yñ=‡ġ×7”R[I’Ì8Ž‹…^,lBwġµG-ı¤]ë%í5ÙwÛ)­Şëġzŝh4ê[öî|ĝğ?ùîàĝ£?ĵa–(¤qÖOŠÌ›ĝĤ'@uŞ83 ¨˘Ĵ,ŽÊ˜UÍö!. —J;çÚ'ŸZElùPġtV„Lè€ÚÔ;²•€Žrĥ(²œR64À$Ħƒ=§ F‚#w=°ñŭçiñİR_h„Ĵ£CÇħBûÙURu–$zĦk3<Úa¤RÍ*ĠF+<#ƒ< ŽUÖġ›Vœĥáyž—ré­ŻŻŻÙ0şë‘wĵ÷½?ü3o˙üË ùıĥ$ f! ”ÎĤıJ“/ށȖq3Ûbrƒ×ÈĦĕ˜ÖÜ #n{ëuì˘Ĵ@'Ğöˆ­P]é!QN!n™|l=Ĥo.%áÙ0Á(1+ ÎUf“^ożï ˙ÊóR—ûŭŝVÇóÑh'I’Ĥišڔwm5c.‡t•ŜÑÒP”Röûŭ ßïŻġz½CïßvàŽ;¸ïİï;ġíY‚³ ÖTžœÌĈ’çDËĈ¨r7œëIUTFaWzè0²dqħGqËtĥ£q°A™LÂÊNelĵ".“¨œ…m݉‹äjĉñÙ* j^)K²2RÄ:;iÀ>™×c–[˘qüŜÖ.ŭß}úòżùżĥ„%x:™Lr(uyI˘c³+Oé0ŭÖ8‹µët9Œĉ³³i\MÎżİaÔ.ĝàüĥ|o A²µ>{UKŠwÔ£#9Œî~ô‰÷½˙ŻüÌ_z=’_xy?Nà “†b†"ó–(™÷K××T f.ÊtCÄÀV8Ï UçCkžvFƒ!eN€ZM`> ½7Xo”Ĥêc1sVfb6³'Ĵĵ'›xĵ30ŸEĈ'üg7Ŝŝîüß~=‚Kŭ~s8Î8Ž•Rı—´Ŭ Ù]Cï¨Qï`”uƒ~żż/‚£ïŸ|üG˙Ĉğ6É_ÚX@Ċ Ĵue’Ğ'óv@E€ÈlʙH€tÓġ§|˜ËS,qË( ;äpZ¨ê9 4Ġtm‚Tñš¸€퍊Ĵp„µç bga  ]şR†^(Üvúŝ5˙Çŝŝ'ŜĝW˙cá!Y˙ĤËSêjĥYòÓJ˘³ESf3fÛ:ò™FàF¸ ħµ™Éı™Œ²“½îĤV˜ŽH—ŭe[&[­ÓµĈìgRœĵ”" Co4…Œîìġz÷Ŭûĥ'ß÷Áúé·ċġX|ñùMÈTC2"¨80ċŸĞ°ÂäġŞvÓı€Áx?Ú2äAËіÔğ£j²İ4*:°à”oYŞğbždċ{ŞFûŸ}Ŭ“#2áKAH*‰>£ĵS:‹|¨oôßzèˆ~ñmkŝsç0ĵ4 &³Ùláû6‡:”şBu]a<¤xG­ı$!Dîz½ŜÁ Nœ|â} NŬżŝ‡cÄ*ûŒ´ÊÔ[ÚÚवⲋŸ soDWûÖÙj:nİÏ=£Ò›*Ğz­´ĉĜr+–Ár!+Í!ıÀĦ¨‰09%£ôÉ ‚t)ˆ°·yĦ0ž¨ ñ ‘ŭ‡óÇĠ@+Ü~ç½à'~ñßù—˙˜jĦ;CIo#lWÉaäïƒç(”0íÖ¸”ñ QĴ°ıC)-ç›5żI`dwê *%šĥ:ĴŬš7) ea^ÖzYʲ-"QԜI)ÉxFá}ûÖÖÖÖçuF÷=ŝî÷}ĝ‡úñݟĊ—^™€â,L§MQ›M[ùğo#`ç…Ìş,6ra俓{Bf]W<#ÍĊ-ˆ(ßF½´‰*^Rŝ~WCvĊmT†ó`]‹JèüùpċBˆ”ġç+˙EĞdŸĠlĦ×|z÷ï^úÓ Ŝèġz—†álħXDI’%QƒÒž’ö’ì{Ùx 2ı£AŻ×[÷}˙ˆçy·Ŭû‰żÀ…Xáµ(kb˜&ŞzbÀ3"ĤRÀ˙H[Ħ³úÉ hÂÈHğµ/îôŒ¸q˜ŞùžêUÄ ü4ĊċâÄEĉÂCâ2הoFċN’oàdċĊ¸,l¸/9”²$4˜„‘’Âmwœ{?ù‹OżüË˙5¸fž2s’ñ‡Ĥ<ßòŽŠ—*E6àĴO@Ê OPċ½T˜LbLfIÖtö›QšQzµú…‘ŬS”òÏ ïĉ’dÎ=_ОŽ²ĥ P’Až_xHVG;eĊ8qÇé1~âŸ~î_üCbf20ÊÛçϤ”Ú†ĥy$!²ŜeÊúĜqÊP˜/4.l, 5-ù˜¨uŒ›wò.çù×· Œ°Fĉw¤”5ÎG§VRf9'ßЇ\;óGB ‚@Ïh4‡;z½Ŝ}=ñ÷}üG~úmßz#_yyV ‘š&Ċ鉠LÒ |—â+”+ä4ïÇäŒ4ÛPҕß-B{ĉ°X(_ıZœšˆğ`dŻE²<B TÇj˭¨öyQó3ÖQWEuRrVÎÀİ‚ZÄHÂSŭsѳôž{% ³½^ïrżßŸÍf³Ĝ„íh‰—ä:5\ °Ä;Axŭ~ż†ášïû‡Žġñc·żp)†N”ŞÁÈîZ€2g¤¸\4ĥĞ^Oï^ĥÎaT“¤ĉ™_ĉâïu£kÇ&ÈġÏĊT<23‘ ċžS6 ˆì7ˆË7É<‘×÷ L¨"/ì+ġ˘\†À* qÂ`’ ‚@œdUZÇï85ĈOüâSÏŭò?‚íùh­€93§Vl›j *UvDÂ#‚ï P˘ =Âĉ[óÄ˙fŻ_SžĜFµÙ`ž'7É Êá`ò¸ċ`dĈ‰ŞpÊR€T4÷”×˙d3…àKPàÙŜm>#Ñp8 ²—CƒÁàd†÷=ö­ó‰ĝòË[P‘¤:ğN5e”‡µsEœĥò­şĤË<ˆìwTD\x@Ġżİ{FĵFġĤ½Ìí›UĊ -Êp]K÷ĥ½YÀ&w2pêîm/żĉ„´ B˘ ·†WĥŽž>â½xÌóĵ×z½Ŝù^Ż·†aÔ!nèò’vÇäí-ġ’Œ˜Ħ†áÈ÷ŭŭRÊ£Çßġ]÷LB”İŻXi+IˆJ"_›öġlÀ¤,p7öšR¤`Kğ-iğİ#ʜ‘× ñŠœ† µ5ŬEÎwò²UPĦĴ£˘Ĝ.{že~ŒòÓg~dÒY¸Käc64mÀ“Ğô4L§pëñaÂÁÈú.ŽŸ<5ĉŸü§žûç˙ç<!ÌżKÌ<ŸÏçŞÖwKdĵ,Ħ$ p$ħÒ¸¸•`+£À"Šc4s‘Cˉ–*’£ŜN€o5ϨF(`”Ëİ³Ż³÷.û?C !dWHœ-ѐ°`4Z[[;4oï÷û÷=üäûßûñùéÇu._~yŠ$V™’.Ïëq5_Z·rE W‘pç0b†VÙg^ ×éò÷tĉÓı×dAÎŝı ö‘[<£J5lс-Ĝh F˘#KxTˆ¸jEExĦµ]3ĊMċñ~8fy‹àÄp†}§}/yÉ÷ŭµ0 /A03ÀİKBc98i)ˆĥ„ïû2 ‚‘”r8Û÷à£ûŸŸPŠ‘ĤĤktˌq.#tY,•j-²[ÔĤM6Ġte˙,]›¤tUú­k0ê"d*v)?Yβ@/ËéPay4yžˆİô|ˆ²ZĴ|ì33žS´Ófaĥf!ĉïWùb´iÔIˆ ^NÜvט˙ê?xêùù…í%1óefž/‹JuqƒÈÒD$D ¸ž"ï-İ+RpT:OXŻÛòì×JaEžÓJR O്#÷Ÿ–żêûŝ0 ß‚`KJ)ô’ŭÓİìR̀zBJ)z½žßëġúïŻyž·˙ĥw}×ìòċ͸èĈ ‘U/JÊşampTş”bKM§›mƒr/J+kPPGwáVɋċĦċjT>pÏnöhm†"jE]ž?ab{OB£¨œċƒÊ”àÒûQy¸(ÛüJ*_ĦҒ³IÚ&‰†NÛNžÓOüâǞûċ+$˜yƒ™ÌĴ”RlyH"ß³z ÂÖ,1Ş­êÈÛ™×@›ÚŞl ™àÉĠj{ĥ)JÜ*nÙ­jşjÈMY=8*]ˆ*Ê/!2ÏH@RB( xž0Érn›+!ùkkkġġġƒĈ3şç‘w}àŬ˙‘Ÿ~ì[o$âËŻN‘Ĉ lD•ĴP–×£ĞPÒÚ ŻéÒûÉ~–ÁHëĴûĵĤ+öÏuġöŠg”çY×úÙĦlwÜÙ„2o›ÊŜŠÊÎÔ"‘†È{ڙ˜Ċ×ÌÖï£6‚ a” Wf,/pV$$&{=œcïñž;äyŜz£^ŻwÉ÷}İ”ê7’°Ò (-Ä'Â0 |ßH)פ”<öĉ͘1µñPLb³có:ېuž›°š‘˘ċ¤Q?s­—]YQîqŒîV÷şîÈ~˘Íı“ĵsDİĤ+ƒĞÏÌèdë6aûEĦdîAÁƒfk°gX.͓dR2ÈòVşPêeŸ™7Œ5Bc œ¸óî1ŭÄ/~ìۙAċÔZo0ó"Š"”‚ÖË6@˘DAŠ ˘ÒàĜĵ.£~Ĥۀn)f.;43WĥgÔÑħËŬM׊³hƒrŻa20Ŭ4g[<$!yžÓ,u°ĥĥvp4ŬÖï÷ïyĝ‰÷½ËÎ%‹:Ö×Ĵ28(+qŻ´@Çé*lò•ĥóH*p;L§ıéşì°Ïö€M,oIe‹e¸:£gnŠŝ4Ù: ĵWáĠ#ğFŞ(ôĠK`”?•‚IÌPbŬ?ŻŜğϋċyŜ(‚^†ŜbħH°ĵ™ñ yğ@mžQC™ċû 2xž· G‡û·Ÿ}+ÊÜ Ny˘J›ü7™ UĜn:[FĴ‰[Bx°Ttş%gÔhyßıꛚɛ˜żÖ¤Lğè•+IYÊc‘„ĴĞ·Ġс-O‹ ÁCî9úpK~^zCÚü­6´ĉ4ȚA2{ri ,Àñ;Nù'~é£Ïŝò?,6;­µ° Š˘H‘°’è¤4³ob‚¨,ÌÄE'sÔڀQ(ĥìvKılïçl'’ôŒ*‡ŬĴ3²FTëĴDğFÊEf“E#aB-t*„2‡Q>qy4è÷ûw?òäûßġԏŝÌ£ß:Ÿˆ/ż´…$Ö%Œ”6O£:€,¨Ž „T%D×Ĥ´+= uu8_ePŸíĠ°ÜœkÖ˘&(?—ĵĴÀ:ÍdVşô’ˆıpÊĤ—„f¸²S Íj)ŒòS+Ç 4 ˆÁll Nbżçy#ß÷ûaúRʸĥƒ Ù]ıš JĊ×Axï÷¤”C)ċÚĦǞ8­=OœÙŒÁ Wyu%ħ5г0GTöDÉ!ÓË­O5(*ŻË´ şĥ'"µŒúݸmöĝUK²l”€ĥü‰ÁFŜ"Ô&LÎHĦìÁ%ÌQZ!G[Gbğˆ²x"ÏÁĜÍŝĜg‘Ġ ÓӇMÈ%cÁ'NžóOüâǞŭ˙°Ï1³4áğHáYê.SŸAH§Ş’'*6XMı°ğ\ĝGó7ŸÈڈ°w<£öŜtԘĊ[œÔ Orè”ŜQÙ§£^£D„€=Ê7ŝ"GDRJéċĊĉkkkûÇññ~żúá'ß˙î§~ìgßRÂHAÏSéŠg¤ŠŻ9Ë İìë ¨t ŒìÜĴË^SÁEÍQŜNVΨ޳×Ŭž¨­ÉÎ×Ĝ× Wo³˘rĈ £5î£-É÷­rħw(ϐ0=Ÿ$×p)ŻßŬëRÊa=ß÷}Ĵ.™İ‡êœÊn‡a;Ĝ9$ß÷=ß÷)ċ@J9ß}˙Ñyʈb],†UŠ*m<‚!m…Mmcjì?\í­jÒîR꭛ûw(Cd˘â5•Újc’uj(UAù˜I*+öÍk­òp^1&‹MŒıì%–ż"‚6§>£µ.Â}œ @ XïR…b¤˜iĈm'ïá'~é#Ïŝò?´•wRk½™$‰&"ŻTۙ<– O€’š´ÙîP`Uù“}µzáÙ}ıˆ™_TğFÔĵÚB êäàz/µ|Ô½ĠÚ3 Qs˘‹qĉ7sġĈq}}}˙h4:1 N=òäûŸ|ÚÀèK/l"85шÄòŒ4,/)ƒ‘R×£UükTa¤ı’'Ş Ş9£²˜9Œ,Oݲì47ç•Á \‰hSÙ½ĥŽŠƒUÀTŝ^!t·Ġ°5ĠnQ¤Uİ´k…Q-×@ NáIÌ°ŻŸRxHÊh,ĝ„aèÏf3Ğù –€q9¤äŽ‚Ïó<)eO1 ˘ñàŽ{F“T×Vt;ŒìMB òĦ|Ö­ÔöqYUmߪĴŭĞñmF\ƒQ7%QĴĦlüxÛn§M]Dž "ÖP&Ä%óŜ|ڒls9m(Sġ:ÍëŽTßËZż0 Ùä$Œ $%Js×y˜I)`.·Ŭyz„żú‹ŝv %ݵóù|!ô͵(òÍڌ2·†Ú2 èrCĥ;ĞTĵ¤ŽġEy¨-êûŬä‘ĥ”uĠ ŠÈê$`IÈĵ°Úbˆ\^.uN Q@:‹ĉyžçġF£Q0÷F£cáÔOĵïO˙ĝϕ0ŠtĴŒW¤‹0œ*NúVÎȂ‘²ÂwJYá9+WÔ£J3ĠÁH[§HF3TÇÖ˜+S'Pˆ½íŽ'…@†ĴnŜĠâì2I‰Òv™MRŝ,…‘Ġ€9Ÿ§L@¸FçÓ}w“/yž×ó}?B,ËÁïʝ· !´Û™äÛ÷ù`dŽö$œpË&nµH"ĞL·hİÄĞ'N£%…Ï;€‘M#ğkwsĵA™Ż°;~œü(Ż4Èώ H‹ö:’ˆBß÷GRÊ ħÑ۟úñŸ{ä›çbñĊW&H"=O²k$UEÍ\SËéB-§&YŸ‡ó2!By;7òBAƒĠ¨³ÎˆËFİ Ġˆ+`TO'³Sċ£/j3@-Ÿ'·§§`Ë(aĵ#!˘Áŝ“4’G"êyžĝïaûçŬĝ‰Ğ á !„çy"RöÇïĜiDĠö‹NYV)E˘\tŒ·tĠ}„+ÉÊ:pĥ£âŝÙ/è2| <ìâUeòM–Jd~.óע3Ù¸¤ì´JTjUó‚Ĝ\żZtß1 “y_8âĴLŬ“Qm1ħyÎقIéÂ\š'H˜Ñ?t×èöû|ċ_ŭ#’$™J)!DsÇ'm`Ȩċ%qeŞÂÖê]%ŒZ. j„mì@ĤñŒŠ †PÓ)ÛʕlSOì™ş˘@J9  ‚z½ŜĦGžüÀOŭĝßzĝOÏ&â‹/OD ô\µ.|fäC5ĴĤ+uEJW%Ŭé%0Ò\?q­`Ä-„莖óĊH—#&˜Ë°1(ŻK,CáÍDzÇÖèRö½ψlOWƒIA„ÌbRŸúBˆ0Û=ıÄ+ÂnÌ%íµY‚’RJ!D ô÷gI˘°F§í9|CÓejÄHĞ›§U×Ĝß5€‘n*N )7‘×ċ¨<˙Â&’DY˙4fÎBDyŜÔꌠ•.!ÂU)w™Wj“v_ŒlY÷ġ€‘½ĥİö·dŜĝJeiÍ3â§Ş5•°#qù E@ íÍè‹ĴI!­Hƒì*ÛĞ!;H)% "ò‰(ƒĦ—šXužêĝ´W¨ ˜ìJ5P5$îPBpÇñ‰;ŻdK^jĠHċ‰ŭĵ·›°Ž&@hmúıİ ßÇp7Ċf{^sĤĴ£Ĵ;B~Çy·pĤ"Á›%¸D$žXò4Í$ċÒ#Š0W€Jƒ#wö}˙ß{póS˙óKyÓHN³ĥ3ĠÜÑ-}İgÄ{(L×£š´ğs)‡ìܲÛTP­“H.PL5à‰ld†Ö*KÙIı~òÇ†ŭ‘ŸżóĞßYˆ?yaiÊà(ÉÙŒìAx•!KWxL]uFş;L·›`T­=,ċOL\xéh ÓĦ:mU†í¨ ͒ĉìá#aof‡tϤ5ĥ!9 ­”şŜ,ĞŒ‚„IÄf˙zıPÖ8†ö ì6`ĝ@°sFzÙEÓhšÚցag0ޤ Ùİ.óİFp +B#çL ò[tË´ı{aZ) ĞĦdîmÙž *tÑÇĞ„06giñĦ)н‘GİÊ<ŝS£Á÷ŝü³˙ôO_î ’4Û´˘2Ĉn+ë}™;R0zoˆ˜Ë<£²IE)B!+÷Áĉ³6‡ •T4i°Üqï[Fù+?wò+Ż.Äç_Ĝ@’d…iU´àގZá˘puU×î:£½#û›âmĠ6˜¸ġ#j½8ŻFe²{ @ Ë^ĝĉ°.ôğíp_˙™5´f›·ċÂÊĦÄ2‰Uϰ}éN¨T.Ŭ­‹À²:§mĉŒĥ#;?EE‚Ğ,M09² jıô¤´É)SœËrBEŬgş„çâ {óË8h+<‘G˙€­E‚éÜê²PğŜ³p™C"U)%08tztÇ'áŽŝ…fL"ĞĝgÎB•1\™Ö[•-­†Ùµa{$LWoÒÀ–ŠvŠ²ë´œdʨvj/`ÄvGyìíÊ3ŭÀÏŬùċ—fôÇ/M&*kÛ3î 8Ĝġ>v÷nğy**êğ<§Zš¤îEµG/ÙÏŻŒ*ÉB"‘”†—ˆˆh‡û]½²Ğ|-„°.ày”j+Ò³·#nż@Y£3gÔ<-QL\Ŭ´Ŭ• V-QÔJ=#bÈ7˘\93ñR¨l’§°Ä yfì91fL~˙y·Rx.Î,"UépL\{ŸM‡ΚĞ"M5ÒDƒğĈŝۇI¤ ÒìMÓ)ma*cŞA˜BıAY’í²Iñ4‘ËÀMòԚ˜‰6 ĚqiCĞê°ż|X^^á^âöKTİÊÄp’ eÀš JYŞ!˘JLżĦĤ³żĜc0˘–kÒÌĉħsClUOĠÔ rİ~^tÇLÚ 4͚²z¤…‡[-ĉ´J¸œˆÜAnrFù8n‚ŞèÂpЈğĥ€Ğ…R‚DŜÏK#˜÷ŸµÖĜF˜+\wSBx{e„yëï1³fc*Z¨ĵBMP³h§0ÒzpvŒ*áóî)+|§™ àäŬÈó$fsŠ6c$r)P²Ĉ›ÂÔ0ÁŻĵĤ)Ġ¸4IËAäŭçʜMeòݵ3°ÉÂëD›Š‘ÔfSSV'g{ "Ş£íy|‹xFmqÇzÎȖvç£Ĵ-¸ÌÚé|r²µFˆ)²é Eß@PİĜÚġYŸ¸j{JÚî°]ĉŒĜŞUŞĥr0ş*GÈ;ÇĈeB/nwżŬ5ŭìöJİaZk6'ÍÌİšO•,`•™7· ŒxÉâhî•B{F֘uaġÛÑE1­(şvqÑŭ‹ñĤò‚²Ĥ˜Ïcyf{ts³·œÖċÀCÍ\ÔċžQŜq£œSÎĵħ[lÔgO•9'ŬÌ#Z´ÚĞ0*$áµ0öşĴÀÉ TSVœš½1í ċ&Ĉ^݇d`”0s”\|cĤò>Š‹…ħ—`ÄÛÓu-§*B XÖß mMË5ù‡|\ıÖĉg62`™ÎLçİ.˜_ŜsĠ.ÜċÄYġr%GÇE2mɋ[=#;wd%ÒíP^ù™sËx=ìĦİĤĞ相˘Ï/‹šËÓJPΧÏĉ#ItĦ”ÌŬ*Şy”ö|şâPñZËbfĥ‡äézhÏö ŒF&aLžF µàžP[s­s ħRŠ÷Òg”ĤİNÓTiš2sœ^zcKz&VnšG6ŞWwŒx‡9£U0jxô-2Şíĵ†µežğSœ)ïò‘e½’†ÀĈ,Ċ¤ëwG7‚‡"L§Ëı<Ùá½\¨ÔXğ\ġxĴI£FlŞa…%K ¸nvŠê€ïZϨ ÒJ…Pù­áqDı‡Iċˆ{mԑùÀE4TöÂüġıRÖûf•~q1ĉƒ-ÏÈîâÀ-yĤŞÚÎÁèj`”ıµÌ $(JÀjµŽ•RišĤʸH]ƒ+–ĵIH;ö’$IµÖIšĤQòÚK=  (eġy+­|SaÄĵzq\5ŒêRaûċ['Û½Q ò‘Ê:(³y‘.o%ˆe´TŠHƒó ­ÑÖOµçĊÜôò[#tÁÈ䌸öŜ²½1ìÑ0][ ïŜ^}#íYm\Œ+oD˜t%.‡Íϙ‹ÏĴÈùċJIŬÜ$íñßĊa‚KMI .;;À–ì—â†Ê€:£íÈNĉ^°ÚÂÀKZë…Ö:2û˘ÚkûúnÒĥĤİÖZ§JİHk½H^ċü@%Z‹|jêvêŒç‡k#ĥ#7F--Ż²ÜŽ2Š*”b.ŠVóùJıü;Ÿ.›‡ó¤[1’Ô*Êd5,…ygBġ´m„{•Ŝ#TÄ V1,Ú`dŸĴQö Z³;ğsc]ĞŬĤ³½z‘wÑ&È䅊nVÈ-ÇĉµIŠÊ0]mŬ‘0nİäwââPP Ó!TğËLħĴĥ½,£Èş¤ÈĉĵÌ/`è)3ϕR‹$I’4MġµÚoßì£ÙŞ´Ñş4I•Ĥi¤”Z¨$žĤo|g.Öo ݖ¨¸èġ6?ĤíÀˆ›·]OiŜžW§uu£ËzŬ™âĈʆUN‘šŠú֌Í‰ÒEƒOâR\@ÈϨ8É[ġKh‡Q#˙Ċ–Üۖ£|.]0²ĠtÜuqTWçñ’ëäċŒ4jÒnëרT<ĥ†}‹z$mjÀ‚2ŬKUd‘Ybdĵ›¸JùwU~_˙yµ^L×nĞ@ËÁhg0˘L ‘)QxzkCuA)5KÓt‘ĤiŞ”R+Âtˎìnbì6ŜĥBv:ŽÔœĤZë‰zġù-ßí(eMT‹êMwE0ÚĈ<£› #XuuÀX9O‰‹Ħ„fȟ57I)ò_²D lI½³W~ µĴ³¨ìéëeo€Üv³n9Î\ó0Ŭġ‡Qós§f˜Îx’T›}•ğ£Tĵî²şƒˆMë)ĤËñĈù¨î¨ċ*Pۓ­çüŠk°ŜÙÁÁèŠrFE[(Ŭz>HHp2˘Kĵï`útĦĤišFI’ÄĈCâmĉŽœ‡t…`*<Ĥ4MUǑ9l%ßŝÊï­<–/F­BĠFèzÁˆğg"Ŭpً·9`̞§dÍvËrE…‘*#ÍĠZ"JÇo²Z§fá:]ÎċħŜ+ZħÑk+Qxħv; .Ġ¤Ŭö<ĴJ# ¤÷ŒÚsFE˜ÖĝıgDTyMTĥ·ê–L.ɀ­l9„Žkµé•Ï[W •ıü uEQNGu0şĦœE" aq=LÒó‘RÓ$IQµ…ìv=”ĵ]Şġ­dçz)Ž8I’Y’$[éŸ}é™,Ŝ‚”fÒ#¨äzÀh›únŒ¸3j_muJlŠÀHSĈĈfT€ Ĝ¤LM ĠWŭ£"Énß/–×ĞK‰‹_ħ h„òš0*ß$4cŬ“ž5Ċ)9ĵÉò"‹"Vëó(dY‘;°Ê޲BAš4t˘ħħ—j4K=\ÜŻŬYÚ:ħû^ÑÁ5—$sË:rȜnÙÄن y‰Ş´{žQmGµ7½`Täûڕ…ÖΨ5P+޵ßdk:—Ğ İġµ³Ŭ•ːhċímËŬ5ŠiU3î`´=ÁL2 uùYÜĥÎgÒ4½ÇñFÇÓ(Š"ĞI·ĉwĞ÷!vıWÔ ˘|ë‹X-‹(Š˘iǗÓ4}ûÓ?<³„ĤÍ~„4ïFĠĤmŭÀíFĤ›ĵ=amÛ0j{žöäġyŻĵ4Ò¸ĵ£ŞIı$Ê1ùĤ£+Š)̀Vv3Íò-NĠĤbŸ‹"IX=ÎÊ>uVoĞ'ZW/ğÊô ][Ì{*LǍ ‰ÛBV§ŝ^çaşŞLžĞ]·óûÑv‘Ş|6šĞĊÉö>.ĉĠ§Ö?w£+ ÓYA!O‚< žŸ…ˆÎêccúV’$£(ÚZ,ó(ŠÒZ‡†U{éñ˜v+ĥ¨ş~˜€*³ġ}ı~pE…‡úËÁ¨ŭ5P­¸L˜"X&Àó /|Gz‹‹Ékq_Š˘h²X,"K —€hUòÂİ…Ô]ù#]÷’ĉóù|ħXlFQt1½|á;á×~˙ ³ÏR§ħd#*jaìÉz­aTn´ĠAsí÷½FĞrF]0RFšĞcŞí.švGnm„Ĵ-phğ™f}fŽ5G×NÎhĥ jxFE'iĥ68Ğ猚0Şĉ˘Ú µkaÄ-ĦĞ›´ĥ½ b{*Öç`ç…r/ĵô†´5^œÍ<#.:ëÚçëÖġOş„ kŬŠĝV€ß(ψĴ˙2( Á“ï€7^à;È?M’ä|E—‹Ċ$Š˘ÈxGşeŻ\%rp!ğró İòO)•FQÏçóiE—˘(:ŝŜż˙rJBA%Y[}AĦ²!n#gt50ŞoÄÛïM·FĵjQĴ†QEU˙Yħ;{Q½³Â=Ú:­kmohşâmV6/U Ù£*7L+×hÚYñ–À¨%—´'<#ûuY›a]É^iۃڸquş°˘Wĵó–P+ZUŻ·ĉuq)íĥ_†FġĜÓ0Âu„Q­ĝ…òaU~Ò ô_À‘pëR Ò˘(:EÑĉbħX˜ŝžjÉaž·ı;i'²éoÂvÉbħ˜ÍçóÍ(ŠŜP^^ûÚïžI’Ä´ħaE'• v £bc50ÚÎâX £üUĞr~Ò˨Fi FĊ64U%ŒfX-²_Ë{*NÏàêĉĊ VĠ|…}*çÜ˙Ú&ŠrTEµĞC=yĈ{:LÇ­Ç4|F°E-Ó-ÏĠî°­kŜéµċ§Šä¨ĥĉŸ{ŝĦp=µÊ$ŒV(‘”YgO€×Ígġé#áWâ8>ğX,.Îf³I¤%Ñ$^‘?rÒ6ŜUa; @'I’Îçóh>Ÿo-‹‹‹ĊâLïŝ—’$N f…KA]sqИàjşv·ç*aş+€‘Š5ĥZ`TÙŞû^m-›ÙxñÚ‰†çY;Ykk­uíÖ¨~lŬ§íéV΃U”ëj:Ŝ{žQÛ&Íġ’‚üŭjKhÂËòd´ÖĞad{?–ÔÂ+Ïş6ùÜòÙj‰$£%0*ĵ#ò ĉH_ŭ,Nôçç<$/DQtn>Ÿ_Z,Ó(Šb+\§—„ëVí³.d·$´Ìc*Ŝx­µNÓ4™evyħXĵ‘Lĥ^:ĝûżòìÖĈH´İî F•|Ó5!Ñ]ôşs•o•J46·şaÔú|ìÑÔ\_ğœÇÛOŜàVP뜗ê`³ڛfc7te˜\%L§kLŬSaşê›Żëá;¨ĈÊ(ßsnLoŻäyĴqÚöNÚNëzn¨zi —q[6³ŞŞŬ6ê£ö0”YöHH ¨7€`ö\t÷ÑsQ½6›ÍÎÏçó­Ùl–‹tW$i·çv#–Ċ=W†ïŒÚ.žÍf[³ÙìÂ|>Ŭ˙Ĉ|yĝĈó—ÏÁĴ!ŭì% A;‚·mrKrF7 Ff·ÖµyŜ*áÌ3ÒËaTßdŞZñš€Ħ+áĥ¸ĦŞĵnˆ+ĦÍZ£ÔŽÛqŬ܅›BÊĥz§½ċUB[\?ië9ĠÜÍ O·TÜĥcq#ÇZ(šığòT]_VĥxĈÁ¨y=Ù_’QĠQĤ¨£0„žĵ}îóümƒo$qôò|>?;ŸÏ/M§ÓY’$ħɵyGĜí Ú 9¤íä’tÍKRqÇĈKş4ŸÏÏÍçóW÷ŭŜŻ|>žNSRóìSĤĊ •0Ò­  #^#ûĜĞıċċ0tÊĜڌ · £úÑôŒ@6Ğ1ŬڅTG˘Ĥ+?áò£.çôp­6Œ’wĈ뚞ì ÓĠ^J½‡RË"a#“ݽ_•÷t{0Bí1ı˘Ç7cä‹PžnŠZpä6>8ĠşhäĦşĴ=…~Ş{ŭ÷qÛpöĈ(_[,ŻÍf³ Óét3Š"Û;Ş+ìtGiE|Ċi;¨:ˆ`Êw³Ùl:N/Îçó×ÓKo<·ï˙·Ĥ[—ÁéI£µµ„Qŭ~íÙDwżĜ·ÚtE×nëˆÌöqŞ–˙ħŠt-CCHQŻ"ĠVòĵ%ä·aT/†­\k­%Ü<ŻX°Çĵr[Ğn~ŸILtİÔC½î­Z=^ŭıŭsp0ꆑ0½ê¤ŝYôĤßZÜ}´÷G‹Ċâ;³ÙìÜt:½4ŸÏçqÇZë´Fە{ïi76Wµ{wuü‰Zĵ¤ıçyïŸó<Ż?ŝöçż8Úü`ü“Gŭ5 /+šĠVwä›#ÂFİۅ‘RW£şgÔ&î n áYŸdK_´C×<#µ|£ÚÓEŻ+`d‹SÚöZâ%› UAĠĥ×.ۀy™(„ukÌ}ÙëSÁhÙġÔ#I€$ÏCúĈ€³¨Ŝrjô…$Ž^˜ÍfŻM§Ó\Y™A|şċ°ŜydÙ­^È^š‡D->BŜ°X´„î˘ét:ġ<ï˘”²'Ĵ}î˙ì…ÑŝĤwyk48I^ÖçÖëNs÷XżèÛòĞ`ÄÛÌ] Œ8ÍrF×FĞĉµŜŻâbí])ŒÏ£ó`pë¨k;áe´îĝ v£ö9Izɞí`´# QÖ‘€¨­gĦ_ŭ-~ËmÁ7Jż1™Î^N§çĤÓéFŜ•ÁòŽTGiğEħ7TğH]!;m}”­^’ ŬİĊbħRnyžw^J !z˙àßŭáıÁèƒò˜ 1Ü"‚L]…69ÙdM×xĊ󌌌bjkĞ9éġzÁˆ· ÏÈÁh)ŒĥğAó•zFF×FĤ=y> Tté+˙§÷-^Ŭ׿8Î^™N§g'“ÉĈl6›™ ġÜQŬ;ÒX-fp'ĥĥëêĝM^Y§ÒZSšĤ´X,[[[Bˆ@Qp³Ÿž}ò/‹Oœ–ÁÚèÄpE·}F+6ÀŬ#{׌É$Ašî.ÁÁèĤ¨ı×ò`8Ŭ0H”ğ˜àĝ<Ò~Çèġ‹'­ŭÁt:}i2™ĵ6™L.N§Ó‰éèŬ£ä‘\Èî*=./Éö*ù¤$I’Ùl6—R^BH!„7~;ŝÑ?ùOÁÙ·÷ {¤?:fJgz`Ôv9lF}²6Oa:MÄÊÁÈÁÈÁhŻÀ(˙E)éÓ‹H_z‡Ġ —ï?ıïwf³Ù‹ÓéôĠÉdòĈd2ٜÏçó4MsĝÎ˙uAiĠÔĜ]Ġ­a7İMÜĉ%éÚí6Tî5išÍf3!„D$‰HŽÎĵ$ŝW½sĝîGq; o°*)ċàÜQöÎĵ‹· F2£ċ0êê,Ü£Ù,A9]1Œ–Ġ˜99]k !². H Ž/ }éˆŝlĦğüîb1n2™ĵ²ııùĈd2ÙZ,QšĤIK͑êQWë ]i{IÔ`­‘ şwv>I%I’‘ ˘ €L3/Š_ĝU:KßóÖŝñSÂîk(4ú°tm€‹c§#$ê4—…éÚ`4_¤X,R##£=Ĥ3àÀ ¨ ¤/û£on<|ׁß[,ĉÏN&“WĥĥĥÎmmmmXoµ ïH£9œğJ{%dGT[¸5/ DšĤÉbħ DD€`f1>ó"ù§ĊıǞ~¤â´ŭu_@Ċ:í\é†ÍKçĠeµÛ…‘ŜAΨ FQ”b>KŒŒŒöŠg”˙bdĦ:µô…_ĊÙ7ĥŜr÷Ħß_ÌgߞL&/mnnžL&çóù,Š˘H)ĠŞëσĠŞ:'jĜAĜ޽•ĠK3ÉÚÒl()­5ŒÈ"Êá„ÑëÏÑŝ4Óî¸G XI§: ßÙèàĉT†Ĥgtƒa' Ó݃‘ƒ‘ƒÑžñŒ“/ÊÂuœ^Î`4˙ĈÖ[ï>ô{‹ùì[“Éäċ­­­³FĐ(nQ›—´*DçBv× \G@²aT÷–*ž’ĵ›×îOŒÎ<#_|çô½§…ì •Î.ĤÎÍîĉÀ(M5Ĥ“ĜÁÈÁÈÁh/ÁˆôÀé%¤/=SÑt:}ykkëÌÖÖÖét:˘(60ÒKBu ÛĞ=ÚµŜÑnw@ÛSŬÈò”(MS, sq^X‹Ñ™çéÈŸÁY~êáŝħğ…îƒÖ\ı–ĥiı‘0RZckW÷ ##£Ŭ #Ӆ‚GúòŻaßìk9ŒžN§/onnµµuÑÀ¨îİ%!ğ.•Ŭ^ô°Í]›êá%!ĞQ‚ċ)UltĉyŭÒgpömO?Ü?~JxŭŭHUíğI0bӞˆYçnĊFFFğF0j:f @~žżô•_Ù×·Ŝrúàg Œ^ÜÜÜ´=£ĥœÑ2vñíZ8ív u ꗅ­şkó”r(Ħ%|gĞ€Òħ/=ƒ×ù݇ÇOgPJœ_i‚²œÒu†Q}¸^ŝÊ&[quÓġ‚Ñ6ZÑ899­‚‘,ÇHĝxqéĞż^À(ZÌż=™L^2aş˘µ%g¤ž7êj8½§úĜíi•ÀÁ tíë:Œ*c<%,‹YSzŭyçgè >ñP˙ Ż·Zt˘Ëu7FÓI‚4ÑFFF{!L'Ì@ß œ\Ê<£é×*0Ê=£Ùl619£Ü3J—xHjˆ–yCNö}à„–Zî!Uĥı–]=œ JóÚíyGżôiœċ§ê;%D„İYxĤŽàFÁh>K³ÂW##£]#‘Í["‹¨'‹œQ Œ.Îf³-KÀ˘tfX!§²ğNĦğíä“tËŭU<&+|×ô”Îĵ€£xgñôCŭÛN îòĦ “Ëı0Š"…Ċ<Ŭ0ÒKž‡ƒ‘ƒÑ›3"sƒ”Y˜.:orFí0šN§“8Žm V…çvíĵ£[ÍCê áÙ^’OR5O -ŜjžÒĴzá1ñŽáĵާÜvZˆ`Z¸îŝĴYĠf]!ŒÒDc6IŒŒŒv;ŒòM…DĤ“^Ö¨Ĥ{Ù0Lâ8n0¤;ôŒVzIŸüä'ùSŸú”Ò5ö’ÚòIö‘Ż0Ñá!µ;3KrJcĵ€xg‰‡Âw )žġL§pUŬxŻŒ´bLĥŒŒn%mżäžóŒ€,Lç @È,gôògêžQ.í4N·,- Ò+ŝ1ĥİĤûä'?ı뽤=ċ!şŻ ŬĦ%t·Ì*jĵUP:ŠO,ž~¨wü´Á´4wĦı"§¸0bÎuܕ§r0r0r0ÚEa:‘u_2ƒ’şŒôċgêjşÂhUÈN×öş=Uw´çCv”êĦğËPŻíÔS:ÂÏàĴzêĦŜ‰SBšœ’ nŽ$_£Ĉ ]ıĴĤ[fâЃ‘ƒ‘ƒv}ċŒ¤Wv`ĜŒĥ“;RX¨kŭÄ÷‚w´'ÔĈkƒÒ*ċ]nŞ#|G–úò7YNé38ç=ŭPpè.á öCħ™ÄÜ rí‚o;+?˜ÍR$‰v0r0r0Úí0Ê˙€çe½é F]9£U5G+óFÎCşqĦğ@‰pe9%´zJ_|gßúôC|˜…?>J5”8ɋgy{cÇk0Š Ñ"Ŭ1Œ¸ FFW £Ž‘FFRfë]Ê F/~zŒâv:|oÏċn é* $PUquPúÊ38÷Ö§Aˆp_ù$eg‡U0²|´4јM##£½Ĥó¤éMw!ƒÑüĞ`× ´­’ww~J{ÁÄ^Ž×ĠèÏˉ;\Ŭz\ĥí_ ĠZ§išĈ‹Ċb>™L6ÍôĈïlmm½è}áóGòÌ7˘3/hm€$Ax”A§Ϩ¸ŒŞ0Қ1™$íĦ8##£Ŭ#˘ĴIğ=?kôâ37FÛUÖí9ïhO{H۔€Ş4ÜöŽvlĞHIŠÁqW3‡j˜Ž9k TŒN_şù899ŬôFİa’_Ê:0Ìżk<£½£=ï!­”€îη]šŝ+ö”äÙ>ìËÏ|#:û˘Ng—@’AZƒM“"áQ'ŒÀÀ|– Mµƒ‘ƒ‘ƒÑn;˜Fİ>8h¤Ŭ_Û)ŒÔÀHßÊ0ş%<¤%žZĵeÊğkâ)Ċ38ûÖ§"Ü%d°I*рĉlRħjÂ(Š˘H999]WñÒ×Û*zġ<€ċŒŠ˘×Ż_ ŒR£[ÔCZâ)µéóġġô”ĵ³/|ŝèW>óĝÌ ZĊ›`!Q< bŞŝì”Â}Ċ Ùf’ċ–nqöŒĥû8½ı<#ߌÈÛí"13ßJûö- ¤ŬĝuœġŸzˆ’½uÄ3Ċ"İ5M½0âĉúw0r0şZ]iNgŻÂ¨"` ĴÎ(ı˜Áhş{ÂtáSÏ­ĥg Üâĥ+„ç^ĝüħŻ<ó§éùuşĜÀ,NAĦ̧4Gîħƒ‘ƒÑ› FĉG^ց!ìeÒîŬ#Ö·Ü~}K{HğÍS:öĠgâéïzPïbp°h=Ây#£Z>éĉFFo.IӁÁ /È<£öáz7FĝÖó'nyi7yJò܋rdzżñ ĝ˘ĉè"(ÙBì`ä`ä`´[`äûeÎè…Oï*9#ĉ[rŸ~SxHğÉSñK8ßĈ R<„uÔ?hžƒS (v0r0r0ş‘0ÊsF@Ĥ“ž Ó}fw tXt@rPşPÂK8…ßÄs'?œ BJ$‚ﳄ )$Qġpï³ÏŜĝ=ŝöâŻZX#uh UܟԟB;ó2ÒIeDPšnڍ4lż´{^d„ı-h Ž£”ôW-]ƒ1Ù:BPÄHìîeDl™¸ùYé§éŭóüÈhÎĦŽĦ”âW­°ä¤§ Ö ô|Ü÷gm]ĝ@QF'-MW݉Ôí€,ÔĊv@k9”ĞìÈĴHéŭ=|á[rÚ„UHjòGQF'+2ڑlşSÀ02 0f'#B!QJ‡$%݆=ôCy_ú8şÂdë@]E͵ŒtôÏì¤GF‰Aż´[’ Z܅ğŝîüĤéú2bQ9)%SK ïŞH+,Ğ1u„Ô"ôÜÎ+ĦŒ(£ıOÓÉNo:kĦċ½ù–P˨ż‘B"3$Wô˙âêùl FÎÀ¤6Ĵ>L"ĦŒ(£”ĤKLÌĠ%’$jîë™Ï4Ŭ<Šİ›ĞRHd„÷qġÜÛ­ 0Ĥy¨µb Ôʈ2š/Y'½ZI³]ROD5]_J™M)}€/Ÿ{ğ Ĉ,œ‚Qĥ_ eD{‰ÙžkêIŻO–Œ0˜ĥ¤ÈŒJé‡ĝWÏI+“ĴǧÓ:çLQFó #İo[I;N”Œtä{‹B"³™Ó·[aĈ4ONĦÀ2$B) ïTqE~ÑÒĈóF§ •G¨|ì xÊhnĞéPWÓ êv@÷à½Û—ÑŸ(£" Àê)$B)í–Òu\„à‹µŸ·Ôˆ1Ù:¤ßÁÁëP´DÍMd$ˆı:kcdTŜƒûz;M÷§˘×ù‚2:$?ŽŸ ”ÒĝôŬċêg-]#éJ\OÚîâ°w—pÊèÉÈì4J…1ġĜñw)££B ĉħm…D)¨”^pYêyJÉ*Ä#ö/sġ_sÁSFÇZFfgŸQ–ĠżÓÍÁj:ÊèhŒ4éI!JiGJŠËŠ–.ž Y½Ĉ2`ÊèxËH1ĞèĴ‰í€ŞĜ›Ž2z‰;FH„RÚ[J×ñ_ÈoéB]!¨×“u›!=2š$Ŝ$#ŒŒR@lĴĤšÑÓ:ÒëyHĦ”Ĥ_Sҟµ‚#fbháŝâVÊèX¤é¤ĤKâ,c·A=u Ĝ:ˆPJûLß]Rméò‹Fd’&ÊAD Áï:­PF˜ŬMŻ6 鏿ŝeô”¤ĝ;b•Ħ”ö•û€KŠ–.½`$]|_Fşŭ (£Y•Q¸žŒ2ÚÙôJ ‰C))pÉHK. ZVñ|):²K8eô”e”ĜzìxR§éÖġ(£:À)$B)=v¤´Ë/‘eˆ1ñĝ°[(”ÑlDFµŒ$Í î!#£YÌÛħ¨PJO(%‘–6ÏiĴÛyêíñ”ÑS•‘Ŭ`-$Ibi7÷ÍĜ]çıı†D(’˙i+ĴÀ˜l­ê“¨İ§ÏRFO/M'ĤîM—A‹û”ÑLRŸ`ʎPJO.×ĝ"1­à‚‘…u ’“)etô2˙ĜV‰ġÍò\˙ŜĜí›PJ"W¸ÜxĞŞF²u ŠS0 Oed$użÁÄI (£!% ‰PJ)]6ĥˆ´ò€Êè(edmÜ*€¤8vü7½ÎĝSĞê($B)¨”\?k)ÄH²5(ÜÎ_A)#âp=h,^†M¸Żŝ7et,sÙΎB˘”fCJĝi+,kzm:äuÀHšI²kžÑ= ŒŽ fnż3 ‰Ìş”äGMàR×Cœ‘lm§<Äs e4Œlû6ĥÒòŝà<£‹^‡2:î°Û7Ħ”ŽVJ""K¸!Ż/‰ùĵ÷Ök0ĈHĥ ­<Ä B0QL”Ñ£2އëiıwm{ìĝGġšÑ5ʈPH„Rš,%İ$ğ¤$7ÌËİŭ‹_½µ"Ĥ‰àBŬdrT>ŭ„ÊÈBìħwëcĴt/µòÊÙ/z+ívûúÖÖÖMÊèĜ™Ħ”žPJ“ŠVe Rêԏ1’eù*½_ŭÊżúœ& ˆMĦŜĠİ;ÊDCÜk„!ù‡ŸCî}â߸°úyUöĥÛí[[[7·ĥĥFÉÈO¸PF3÷!Jé0"%)Ħ[‡JĈħ‘ìYó§7Μûġ†ËV`Vħ³x/ġiџ<éΏ!n|5@–î.ü·ÀkgqŬ˘şĵĠn_ÏóüfžçÚív^ï3”Ѹèˆ2šİ1Ìċú…DfIJ#%cŒµ61ĈdÖÚĈ+ßûÏO×ŝç/KßN¤ħ ”.FJN¨ŒâşŒ‰kFÖ@ƒğŝŻxFno<·ĥôïyž_k·Û·ò<żßétòŞŞŠMŻ~L„(£Y Œ  žB"ä¤$òR2Öڍ$IÒ$IËĉŜÂ+ÙN˙5{û ”F ñ™ú{“L,t812²˘ ¤)Ô˜Dàù#š[Ÿ÷^eín·}­Ŭnßl·Û÷:ÎVQ½ŞŞ;0Œ“‘§Œfñô€X ‰CŒ”ü(Q…¤ŞŞ²ÛíJ’$I’dÖÚĈ²ŭâ“WOşn_=/ÉÀ¤€hìä°Ğêîàe¤ğ˙yŞĠtD%)ÔX£p·?„ıùû‡—Wŝ£,şW;Î·yžßít:›½^Żçœ+'DE~‚ˆ(£Y‰vŭĜ)$BŽ,}ç½GY–h·Û[ġZRb­Íɏ˙P-É?ŬĴü3²=ˆÉ ŭ.ÈŞqM%`ü>,#ôÛÔ `-ÔZ ĝ;ŭ˙“ K˙/AġYŜé\ÏóüVğŬ~ĜívğÎı2„àxE ”ÑlxR˘9h)ÉÄ3o”’E!ív{ÓZk1‰ˆĜ—o‰[´żSÚÓÒ|.v%Š şë‹èĵÉ(Ibz2MaDàïŝáÚğáż|żù—fŞŸäyçë<ÏoċyÑívÛġşQ5$·‡Œ”2šı£nôûB"äh"‚8çP…Éó|SDŒ1ĈcìËò‘ ĉW÷zf]²3ñD­nçéëˆIġ˜ÈHFpb5aŒŒ,׌Dà7>…żŝy>½´”á“vğŭu]Ŝ}ż¨^7Ú+E×ާŒfŒíġ#–}rPRÒ!1+nĜ~<„€˘( ‰ ŜŸ$ä|$.éŭzżĵjÏĊF˘Ş1JĝŠ˘Ħï§Ù”Ѩpžô 鏑°€hšÂĜûCĝkïië\ry}Ñ~Ün·˙žçù7yžßi·Û[EQt§X7b5ŬqА‚Îċ ‰<-) ^‘Ô'ÁH EQH$BŽ@JĜUç½/‹˘À‰PCŝĉ—e³ìüìoUû‚.]“œ‡z£Ĥ‘CŝúëÑÉHFĴénA ÄÔ?˘$˜$6KíŜ†ğñŻX¸˙çŜO.>ûg£Ġ_ó<˙:Ïóo·ĥĥîĉyÙív;Îıj@FÓ¤ê(£™Oٙ÷+…DȁHİğ/%ÏÄB‡A)i$„|ÁiŜ(³róÒĈĈ~ùĠÄ,ŸBc§$ÜùWˆpdHFá`e4=ZÀ  J‰s^EQ Íâ‰(5ż€ûú=œq_=|ġç>ĴÊâjŜn_Ż7ŜËó|Ğ–Q9Œ&ê(£™<ÈÂ\îE˘ÈӒÒ$D}=M´42RލäCUĦh†[Ŭ7z_ŜùĉżmöŜX‘µW€Ĉ)ˆ÷qŭĊğ:ġĦ;§Û(tHFzÜŝ\}4xÚ ?OïÈhÈğqm,žlL½é5I 6Aè}wŭÀíÂËgäĈ‹Ï>ûoŬnçZ§ÓùĤŬn×/`(Š˘÷2P£aÊhŽ1–}rèRÚŜû²×ëİ÷>Ô8ï}ċœë-zßm-µïÜĞÚ?ızĞ áԛİYğMÓZu·~Ä_sŭ*u §6EíSFCßħöSƒ²SÇ!ġ0½ítL’BĴÔr+¸ï>‚˙ĉ}œò76_ğĝܧ‰Ñ+yžßh·Û·Úíö½vğ½ÑétÚeYûÑ¤]ĝ”2š5  LÙr˜RÒ}Š)Ĉ1! Ş*UUġŜçœŻŞŞpÎuĞŞÚZkşÍ·–{_}ġŝ½ġàÊsöD–žƒHZ9À&@ŭŜĊE€X†ä¤òhvNÓ)òh\úżİĈòíÁ4•sb“Yġ=ĝ;…˙î#$ŸUŻ_ğúÌúóŸġz½o·Ú½›ívûN§Óyn·7ğŬn§ŞŞ˘ŞŞ O^4,#PF³$£~2aŝ ÈQKi0é5nefżÑ’†Ô9‡ŝZ’sŞOŬŞŞĥšÍjB£ĝî9é]ĵ~óËWïê³kĉ{?ğúÀ,Bƒñ‰İ QTpĜ.v0ĤŜÛ$?6}wä`wĉ5Ġċu•œnWUˆMb…whŬú Â폑äŻ.œY¸yŝġç?şħµµuĞÛíŜévğ÷ó<ĜívóşP5Ċ‰áŬ¸Íݘp›2š #騏'Â÷9²7›È^£ÁëŝĊ ŬĵĜëħkmš$IÚh4—šÍĉÊâââúÂÂÂم……³Y–}ϛĈ 76ñÚ­jŭtXı`͙7`šg€`˘,4 ĝ˘ġñe…[ĠëQÛó˜4 ?$H-œ ĝ˜‚ ħ9Ĥ¤I=P€VùM„ŸÁßŝKîvçg×ŭŜé•ËÎU·‹˘ĝÛíŜëġz÷;ÎF·ÛÍğŬn·ŞŞrD%]˜":ò"ÚЈ2"Ħ”ĤÒHAckm’ĤiÖh4šÍĉR³Ù\m6›kFt£Ñ8eÙĜìÙ[9^½—ğ3ò²Ĵ^€}ĤYzbšQLÁïDI ç Ö^Ħv6)…$ v֗b´ Tb,ÄĜĝċŞ-„ÍŻ\B¸IïŽ;½dĥÎ=³~m}ıñ·²,ï•ey·(Š^ŻwżÛínvğŬ­^Ż×-Š˘ˆŠöŠˆ(#B!2AH%a!™a1%I’dYÖȲlaaaaħÙl.7•………ġ,ËÖÓ4]OÓt=ˆ=û £/ŜÙrgɊOVĴY9Y|fù< ĜfüÒAw:+ôÓy>·‹i:çc#_B]š íÜFĜşíÜDhßÂÚ½³ë‹›§×–n/7WUġ9÷ ,ˍ²,EїP^E§,Ë˘ŞŞÒÇ*ŽiĈF<‰ŒvD“:.PF„B"d˜ßüĉ7<öğßŭîq${i’¤v]j9ÙÁĵ^šĤY?’ŞŻSkmbŒIûc/ú2!$BĦ–RŜW!_‹È;ç ï½ŻĞäœ÷Ŝ9ç\Ŭmb’Xü·'í/šZFïĵóÎ#'‡ßŝö·|#“CƒûÈSċwŜÑ)Mê{7/ QF„B"d e$SÈi0Šê hÜ 8Œ“ Ŭ•bz[ˆ÷ĜRœô½£÷ö żq×aJñLQFdf1üY‰’ĈœÈħlj5Œ‰+Îv·Ôé߯&Üîß/î_&}l?—áçĝ÷§íÜ=ŞÄ›2"!û”’Nˆ.&E~ÂĊ¸Fˆh”$Ĥ•Rù²r#^‹ÛCDÓ3€2"!O&IÑ0yŬeTIô¨hcÔcĠ“׸ÏÛKp“˘!?…„&Í2•¤ŒÈL²orto6Ù÷ü–½::ô݇7Ԛëáµ ƒñŬ Y7ÂèÍşŻmĝN¸½×zÒ¨ġŸqƒó&IhXŜ#eìoÊÏä0aQ™eGŞîUä âC×£Š$dÌŭÁ˙‡}iÒ÷0)ÒÛÏeœˆ€éŠĈb'„B"d˙RŽJ&‰iTä$c„„1ÑĈiZ)‹PžDLŝ˙´QeD($B@JÓDK˜ù`Œ°d úĜ+*’Çü0HÂÂڏˆ&Ŭ&„B"ä NèÓFKƒ{“dLÄ3ijTtô¸RÒ)§•Í~ÒrŒŠ…DÈSŠ–F‰hTÄ4üuĤ]/šTȰ—Œ0FBÀŜc÷+ ŠˆPH„<ċhIĈÜ'4ñRF{ i?ÑĈܧˆ…DÈ1Ó¸ĥDq?2’)D0Dt‘îóùĦyŠbÂqŒĞÊÓÒ'ŒŽĤĈ^’™ġPD„B"䘈i\Ԅ1R%¨ƒÒ^bÙK4”Ħ9ĉb5É÷ÇD„ĤYç™v-ˆ""!s$§ÇÉ5Lû9”Ħ9!rzRA=ÉóîçĦ9‚ڏ¤tHIèġB!BIDöùù!SÂñ„Bfè#„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!!„B!BĦ!„ ‰B…D!„PH„B($B!„B"„B!B!!„ ‰BĦ!„PH„B…D!„B"„B($B!'‚˙?5H˙IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DSButtonSelect_420x420.png0000755000000000000000000032003012467662066022422 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊF•CIDATxÚìŭçŸdÉy žˆ¸q]š2í½™žîéñ1ÀÀ{)’" +’2”DJ˘Ìê}ûìûeżĴvġ._Q†˘‘(B¤(’"˜0Œ÷½Ğ.“ĉڈxö›y3+3ĞŞ§gĤğ‘ñûUWVfvVVĉÍ8÷œç<çaD„éšéšéš÷zñéK0]Ó5]Ó5]S@šéšéšéšÒtM×tM×tMişĤkşĤkşĤk HÓ5]Ó5]Ó5¤éšéšéš) M×tM×tMאĤkşĤkşĤkşĤ€4]Ó5]Ó5]S@šéšéšéšÒtM×tM×tMişĤkşĤkşĤk HÓ5]Ó5]Ó5¤éšéšéš) M×tM×tMאĤkşĤkşĤkşĤ€4]Ó5]Ó5]S@šéšéšéšÒtM×tM×tMişĤkşĤkşĤk HÓ5]Ó5]Ó5¤éšéšéšwh9—AcÓWrş–u5Ĵ4}›Ĥk] ][‡Š3}K§ëÇlD`˘ <·)hMה!M×t] .cĵWÛZ@³š‚ĠtMişĤë]v•]†×„.ĴĤ 5]S@šéz‡Àg#÷żt) EëxÚàí´Áç2İéšÒtM×%nìŻğ\÷ı\ ´à uÉ(`ıT@Ħu‚ßtM×µ H_üâ§ŻúáúÊW²^Z 46rû‚Ôċ`GÙäׂh  ˆçI—ĝÙgu PÓ5eHÓġc @lƒ·]ê˙żTpş\‹ŜĈÏnT—R4ê=œÔtMişvşTZ |Ö$v żóŬK›QÀ3éúµ@êmÔœĤk HÓu5‚¤Û' ğŒ÷ :RJ&„àŽ0!Dï‹s΀s>pıüÏċeĈX/éÄCŒ12ĈPġşò{ġ²Öş÷”"­µÉó|½`C—xÛuj­ÚלĤk HÓuUƒÊ¸Ÿ×u} 6žçq!“RrÇq8çœ9ĊĈRJ^]„‚•`cż—ÀXKÂìêïÒD ˘mžÊï%.U7Zk MeċynˆHcH)ìw“çıÑZSšĤĤZf£×(6ĉĥ)8MאĤëšĦµ€eÍûXaë ×uı8ċ—#ċâœK FcL !8cL0Ĉ$ç\ĜË€ò2·—™£|xġşÊUJ26Öeĝ:MD€&"eHQNDZkmˆ(7Ĉh”6ĈäZkmÁIÙe”R&Ë2S+³w›ÀŞÖ˞Ĥà4]?€ôÇüÇÓwï^ltHá€$°wŬ*ñċeÁö~Ü^fö6€‘°/Ż0$€cşÜè‰ÈcJ2%Y0ÒĈ˜@nŻ//çĈED™½œQµÎ‰(ÓZ+cL–çı*ÈU•Ry–ey–e:Ïó¨4bU´€Ǟ. œèZ ]{×˙׳À5˜!:eHÓġvèRAh,U™ïûÂ2 麔RJÇq\Îı+t-ĝœsÉ9÷9ç.çÜ·€•·1Ĉ<^ċvÉsçwï™ fçkRJoóžŭ3LĈœùí;Báy‚sÖÛyÎYsë6ßT·qû̕Ú çĠß} Ĉ Ës½túTD eˆôòİ+yš$Ik%Z:ylÉ2¤Ì“cRİŭ9#˘”ˆûsb*ÑZgD”cRTµNµÖy–eYžç*MÓ,Ë2$‰¤FÔ$ötÉàTSS`şlÒ)Cš)­„ĈĠ†ĈвÏó„çyÒ-–8Žç8Ž'ô8çžÂçœ|ĈX`ö„ŽœócÌÛ´g˙Ĥ`fĥħŭÀĦÍnàyóÛwĠfS†ġĤĴÍÍ{LHN dĈÀPP† 9ƒË Ĵx’Ĵż+"df…2p°mnK Eñˆ` ı"dŒ°ġ–ğÁˆ`À‰à ÎÁH+j//&Iğ­:ËËYëÂı(Kĝ›Ż^L۝î҉7Œ1ħ1&ÒZÇDYŠˆ(ĥ·%ċ—Ö:QJeZë$˲4Ë2•çyž$I–Ĥİ.Y”¨ġÓ¸ÚÔ8pZ%V³)8½e )Cš/ %É­— úı ĉ8/Pëş"_Q~ċç<BÔc5 @u!Dsî½ùĥ›vïÛ<·}ûìüöÁìĉÍ^8·ÙÏ “2E€@(r Kó 0"HĈà c€ d˙Ş€ ž R§ċ%BjU‚`- ppЈ+ Ó 7ÎcáĉÀŻo‚·˜ğ›8g¸‰žeiÉÊRÚY\HWΟ‹—Ξn-ž|ëÂı—Ÿ?m”êcşZëÖ:"˘ŽÖşkŒ‰Œ1ħR*6ĈÄZëX)•äyž&I’eY–Ċqœ%I˘³,ÓÖHAC 4 ¨ĜÉC·MYÓ;µÔË>¤éşĥ€h½lh#Ü*}ßñ<Ïġ<ϕRúRÊÀqœÀqœPrÎëœóš˘Q~B4ksóó{oĵe÷îG·nÚµĞ1³y‹W›÷”!äTlü†€ÌŬD#7‡Ħ`p¨#Àƒ@hÜ½ŭFˉ¨w˙ŜGż²ÓP'Oï!8S–FnSìÓ‚—ÇJÛJ*fˆz —+ M†,hzŬ3^sÏĦĉ˘mŽ`×sΐ,g‹ÉĊÓ§şç^ùüٗž=Ù]\XZ·µÖm VmcL×ÓÑZwëġzœçy¤µŽ³,K“$ÉÓ4M’$QY–™(ŠÔ{Lê’XÓ˜6°ÄF[ÉĤ€4]×ħuÒ…aèĝ/<ϓï{ïûRJßuŬ€s^s§f™NCÑäœ78çM)ċÌî›nŬğçÈÑ]Û^7ğu×ŜZ03çfDÈ4Áƒ°˜ip00Ċ&.,ò+@Ê cïWfݧŜµƒ@Tıbġuŭbéâ2 ?JċÌ·ˆd,ê™>ŠqXÀÓ’1HÄ,ÖÙżİ 9(hşÍZÓmî>ÜïûwĈnK:+éĊS'â…co,ŭċ³çžú-ԊֺEDmԊ1ĤcŒé(şö+β,Ní*ÙÓpT“$½)0]ĥE×dòàĤ@\ş!a"AàzvıJ)kRʒñ48ç³öòœ8³{oıŭÀÁÛïܳë‘Ùùğk† –‚ NUQÓ)Y àaDĊn†>Ħ%Tl…*b^Jicĥa}iWV Phä=Kŭoġƒ lĠkœ1€•ĴŒ“@ñ÷’½L޸] `ĵĤWÛwÔk8:{äCŸ;À`îk9Ù=ûĉĞ+g^xúԅžz=Ïóe­ġ²ÖşeŒY.UžçT”Ĥi”Ĥi2 N(Ü{“ŠĴġÈyS`ZïÒ×ĉK3¤_ şT6ćçRJ†Ħ,™Pçyçya @RÊ:ç|Öqœ9Çqf„›6íŜ³óş;î>xàĉÛ·lŜ·ŻĈĵÀ‰•AfKšÁ%‚ÖE-§ĝö×jT¤6#ÖÛÀi=XaĈĦÎZ„ñşê&šx‚;öG!2ô5ÀÀŞĵA¸0^'Î,FS›vĠwlÙUß˙‡wq•Ŝµ|âX÷ôĞÏ_8óôßh9q:ÏóE­ġ²RjIk½A[kŬʲ,JÓ´; œ*ÀT}v£ëLëM†˜ÓZ‹O]vÓġ D#™8<§VĞIÏó| DĦ”²î8NÓqœĤbĈqœy!Äĵ뺛ÜùëßuÏŭ7Ŝ6ë6›^f€Tş e MqPr5§²!“ÚƒĦ˘ĉc`ú{¸Ù€Aëĵž°&‚Ñä˙0^mĦµï8úùŭ[m-Œħâżèâ*a$@`8``4ÂÁžCÍë÷]ßĵé?yêĥ³3Ż<ż|êı'OœyòûŻäy µ˜çù’çy+A´”R­,Ë:Y–EQĊI’¤QeY–é!Ç#ëħ \t LeHb겛o âUI. C/ Cßóĵšëşu)eqœY!ÄĴ8›„óRÊ͇ï{ÈġwŜ½wߍ·Ì:a]f†)B E-„iêdd9cYİìÒC5Ÿµtġá-hµWUöVKġ´ÖĊŜŜÊĈl³ĴV-ĜŞ7†ÖĴhĠ“Ĵş0x’µ°;ĴBaLÁ<•.ŜáĠÜ­7ß³uû­÷nĠ_üÛ/ĵŝÒÒÉg~xâ쏜çù N‹žç-)Za”àÔív$I²(ŠT–e:Žc=Ě Ĉ›"ĤÀtItLkHÓuMÑ(Yn ÷}?°@ԔRÎ!ĉ-mr]wË |àĈëßwÏŜŬ7Ü4ËĵÀÉ !C'× 10FpY40UÍBŒĤÊÎEäh² FC`RÊy½’ŞÌ†îG#7ş’ÖİĊUğHâ¨òFôûŠëÊۘ­­AħF™.Ş4ÑÚÉ`ÈJöÄǂ˘67P9n(ĉßyÓÑÛ7ßöĊ/ŬşĝĈË+'Ÿ~üĝÙ'ż÷Rš$ç´Ö yž_ô}1Ïó•0 [išv“$‰ğŬnœĤiÇħްĤ*32Ô˜Ö˙ż&§)Ni De9ÏóœZ­ĉAPQŬuŬ†”rFJ9'„Ĝä8Î&)ċĥ‡o¸îև?zuwŜ½™yĦHŒAJ J gèUö"Ën¨b>FԂÖRÀ†€‡,à”@CDĞïCC§ìDƒl‰†vÊ1ġİÑOzF †ĠħÚĴŭ7‰¸½'/ïɨW*yĉÀ°v™jD§Pï裸É0VĞÜ\0h 8ҍC·Îß|ĝĥù?˙‹·\xáɋÇ~ÈË‹Ż½zžç礔 ZëEß÷—Â0\Ġj­$I˘8Ž(ŠÒn·ĞÒ4UkÈyS`ÚàşV˙à) ]{@4€Ö D²\­V Â0 |߯ı;şîœb“”r‹8[k3³ğo}ĝ£7Ŝp˙ûwÌïÚSOuÑ”Ş˘wĈ!@0*€hhÇ'Z (=>4ÁñVŜÖ³@Û+ ġÁĊTÙYÀİüžĠ€µ J0"h6n~ĞQùĜ{¸p-ôS!¨òĤ”i}&Ċm½¨Òԋ$Ÿ´‰™a’ġ1‚Ú²Vh´ap‰A+ÏġĊÖ[îŬşŭŽû·FÎŜuò‰GϜüÁ#/ÄËO(Î+.xžw1‚% Ln·ĊqœDQ¤*&³(MĤİ]Uš?¤éş²Àh½öíuQ­Vs0ô-5\ם•RÎ9޳Ċqœ­Žlżî{nĵíá\żëĈ[g”p„2„•\#7€@Ñ3#+Q•M`C{Šİ\mwKËŒİ2"ô~.ّĦAıŽÌgÁË à•·­rdÓjpdC{(sZÏ*À„ Ĝïİ'60 2–) aTé§eĞûkÁ,€=Ş6JîĴ0ż^ŬŠVs‡AE”’bZ¸´"xsÛÂŬúÂuû?ôùKo°râĵ~á™ÇžÏóüŒ”òĵëş<Ï[ ‚`9ŽNÇŬ(Š’n·›UêL—L£˜S˜~l@ÉLmßÓuġÈs˘ „뺢Ñhxï{aփ ¨ğ;/œBl•Rnġ|×˙ô·~èc{Â-ÛX¤âĵ8³TäıħŝN=$­–†h Ĉc䵢Ö _.Ċ‚İ2üıʌŠÇ§U²‡rÛFükx+ÈP@ŞÀbÁ‡aö„Á¨bƒgÌŜF½Ÿû·xù3£ £ Ñ>SifĤˆUr 9CĤ ʞp0Áy}ßMs7ĵé}é§îĤӏ}äÉïüġSYÔ=%<çşîyÏójµÚr’$­(ŠşQ%ív;}À4ŞÁvZ_šÒt]@ôĠ>ŽĠëġ šïûM)ċĵ뺛ÇÙ*ÜŜ˜ß´˙O}ööß˙Ħí2ӄvnAPħ1ñ (ÜpĠŜOšĜgS6­ê!Ù­÷3Q ú`T3>ċÏUàvÂMŜ”tTƒ+a ħĞ\GĞ­aŒ°Ż_Ézxœ,û,n+êN=ħÀ#xj܂]ù8Âl ™lü3é?w˘~ƒËi”Òc 1ĝġı`ç‡~òúï˙ôĊgwŝĝ7˙üÉhñÂħ<ÏÏ*ÎşğàyŜR†ËaLùaTOÓ¤Û`˘Ġ'yS@š+Až×ĵZ½ŽO’ĉêġzŬóĵÏóĉ”›”ÛÇÙıàĦëïùÌnŬsÇûĉ&DהÛÚŭ 6SJj£İE_R3IÍT˜Ž14&†Ş?2]ïhŞ>Mlê11špû+ùPdêĝÛiġ†ĴÑ+KƒġħĠ˙ħG‚•LHô‘z VRċ˙°˘żĞʞĝP˘ù@Óí* fÛ"ÀEQ#”œĦĉxÄÀŬÀ™½íƒ;7ßñí×ŸY<öÈ_<żüÖĞ/çy~ZJyÖóĵó£€i¨ĈÄFœ°5ӏŒÇÛĤ€4]W‹<×#) ‚@ZFT÷}żéyŜĵëş[¤”;ÇÙµïĉ[Ŝó™ÏßĵóĤÛçMHDʀÛFV˜*Œf­ŝΒŬh”Í´(mŞàT×{ d,sBßşM“ÎôWĊh÷Ŝ°›n€ ˙fUÈ˘ ÀGdÇ×۔u&VŸ‡` Eš¸A€ b–UħÂ\ÒK7ġÀ¨ìë1Ż1ÒŜ*WG‡ CDf <ĵ~Ŭ훏şŭƒñİ×n?ö˙ùüâKO½ 4bo%‹kĞŝÚVêQÌh, Œ4Ĥ·h4h3š`óí p˜5˜0‚°àT‚‘°À#JéÏ·•,Ş`XĊÏĞzĦ¨ŞµÚr!d ŠŒÁa ™)˘Ÿ8jğÍüùß|`׉Wn:ñġ?}vċ_Ìóü”8g\×=çşîb­ :Ŭn7‰8˘(Żô1­î:,ŭx›Ĥ€4]ï+â_'âRJ.„ġz]Öëu?,֌ïû%í’RîÜuŭ‘£÷}ŝ§oÙuë›Dšµİ ٍ‰Š3j Éb£YÑVŽÓ4(Ċġ;ÓÚ² „F˜ŝĵĤ‚á–Úép°Q¨?†‚Ĉl+ëĜx"3À~V=76îoY›ġAnï%YĊ^_ç…Äçœ@eAD £²Œİ÷Ŭ²,`̐#ÓżÍ! BÒaÈ f.cp÷ž9ôċñŝìĜK7˙Ĉ˙xnċ—^Ȳ씔ò”çy‚ ¸èû~ĞÛív}ßO*}L£@É`rѵ˖Öâ‹S@š+€ġÀÈÎ’aş–Íĝߓĉ¤”ğw:|ôŝ/ü­;vŬvç|NŒµġ‘‡bnPif=ûöêşßëc%8Ş‚‘e>ÙMY`R†¤†SG²‡ÌcìĤ½šy…'ÄњĴĞzµYC†˙8aFD“êQ4rd†y€T€“m³2,P™‚á{™3{­CqÛ<[ÔXËiĠi§ü'lkĤ ™µ’7÷;ôK7<”ĵùüM'ùgÏĴĵġò Y–p猔òĵïû‹Q­¸w:4I’|„ña-ñj˘éáŞİí{şŜ#V´ni•:Q­Vsƒ šÍf½Ĵyž·]Jı{fó–ë?ĝ³_şw˙}nUÄXG:Ê@à[Y‡ÓÙZmQ0 TqĥULş"½•àÓ˙^\ÙFĴÔ4ZœÈŒh‚?ĤP4Ì:Ğ̄[…>l´úw3ŒKŭY£G‹†î³ĉ(ŒAĵÜN­…•öŠ/‚à聐°u'‡ġkP=Y^uëħaĴ2{°÷%8ÈÀ$à@ş›çŻÛ;Żûŝ&×u·ğğ[JıçÈ}ÜùàO˙ÂQgóÖÀ€c!Óp¨”ĉÊMVäİ‘Ĝ° ŞÍ£„ Qx4 ¤ !Ǎħ£6V3´Ħ›‰*Ŭ*qĤ:–(ĥíâĴ’P0tĤiocP9ÄŻ·Ñ²Ê&Û·˘‘ĥ‘>ĴHäcÌ^ŒÍ³Ğ4 —Ħ 4F˘d#Áz|­l, bFdh]2gN@n_|‡³˘!–’ÌÙ1&ekMÌׯ3ħžSŻü]Ċĵ8ö9˜1àQŒœORé¸<ĵó£{½gÛùGŝûËŸúîBˆcBˆ랕R.şğ,ìĥÛí@^İ-­‡-Mtâ]M Dʀq~Íí‹S@ş2%ş ³" Dġ ĉ=ÏÛêşî.×u÷î:|Í˙ܗŝĈ™Ì–sc4ĵ²&€Â°ÀŻÈsġĦ^Żħ.9SšŒ­Ĥ„RŠËİ*sŻ”JğmeTÌ:ë·½íĤżï”<Ä*:Ħˆ•°† Clào­Äbì @2Yp³=/²L‰8ċƒÉ˘g‡Œŭ½ĤHTèEšġR-Ĝ–×ĞÖ5іF ˘Émİšú=)Tb¨Ï¨ú°™&d6=Âċ ’‰ •`Ĉ#J™Ż8İ)ƒ7/O8/˜Y s€T¸`fç=óÉ/ßşížï?ŝ×˙ġİÖ/>›eÙ[Žœ²É‹ïwÚívwƒliœïŞ“XOOŸÒt½óĴ1 Œêġş[Ż×½z½^ĞĠj3ïoq]w‡ëş{‚zŭ?÷÷zĝ;[Q‰.œNҝE)c7&3$ÍUV{lÈöiË~4‘ĦR’[J:ò"M–œĈËpĠċÚĊ-³)h ç`EŒŜ/f‚•ÚÊâ{9ĵdŒÙIт÷êAyÜċ`ÀФ‚^–œëƒy>GöÇUĜw³˘(c4ApLۑœÁèJY ,Ìq€T˙ua•şAÉĈŒ&4 8“Ĥu`È-9ÖpA@˘Š~4ǎ )XSiŒ`–1/•`­ĉ%S²r^ñV<Ş`Ÿ† ùO00eĈ 0gËĉîŸû­‡˘—;|ò/ï;Y·ŭšâ˜5>\<Ïm·ÛN§“ĈqĴ’$Q—È–p5Jx4 WwŒÖížê)ŞUXÑv×uwğ{à]÷ÜŝĦ_ŝĠÛÌÌ&?ĥĴÈċ…<ÇMßĉËlD †N-İšgl ÈôM E tˆr"(ƒq´g"¸ˆÓöÁëÏçÈxċŜ\ĈÙ[ß(†LyÊ8ĊċH½:ŞŬ‚ŽğHV–Ñ^ZÄĊógÑnµµVwV@y Ġ^ê´Ħ²d 6œe|)3&œĠûçH É\)Ñc=\ÀİÏ@!„BÔg ün­ÚÜ&Ìoߎzcŝü&鑅€¸((¨ä`ĤßóĠs ”²˘•¨°J [ġ^ ×F74baYoÒ@Ί#—µ&),0iÀáĊWŻÏɂSߙ׏:T8ĝJY•1‡ ÎĊ ĈáĴq}Ûî?úı ŭÏ/?˙ĝ…sŽœ²ġ‹ëĥğŬnÔét˜Á¤ßFméê%²ÒĤë]’èĝ¤ZQ³ÙĴ×jµYÏóĥzž·óĵ½ÍùMG>ü‹_~`÷=m‹ Ħ•6ä2○[×À`@„OiÑĥR\)˕’œ²S_ġzšSGÍp…¤ê*°ƒïƒ­żp6¸ħ ÖË΃`HrƒNĤ‘tÚH/`éÔq,œ<†öÙÓH.œAŜYîv –ÁŒd,“ŒċŽ™cŒ  ÎS2F‡Òé)r"²ĤA˘"“TIêĞètĤxŻ\ĈYñDnôŠÓ]^np΄>7Ñ&d`˘ı\bÌÍI &şš<„L6fámڎúŽŬ˜ß}ÍğÔgàJ‰Àƒ†)‡,X‰B4CŻW_òĴ‚“Yġ>­ġ>ÁNï-n)r˘ gp4ƒËÉ ’ Ïáè5 F…µĵLxèċġr§`fĴÂĤG‡#1„$ӐŝŒ·éÓżzçì-÷í;ġçżû¨Xĝ’˘é8Î)!ÄyÏ󖔝N§“ĥÛí\)G°êÏë+WÂcëÀÚ) M×ÚĴh=Œh ùï4›M·VЍF£†á&ˊöş{à–‡?rσë޲ĈŒÛRmmàR#àTĜn‡˘^£*ġ™QŜ“ċ 2Z]ó™h½[OŻXàlŬÁôF ”šœħ2•ÍÊgP†°ÔíbċÂ9,x g_{­o :{ èĥ$…Hyñ;zpñño|_ÑB4\×=-ĵ(lK)£(ŠòN§“cµżħ ²¸Ê%?ġbóÔ£Q{ "ġY×ß²s‡ŽbûĦ#Ĝ²y+êƒ˘^Ċ8€RÓsĞÔ×@1@£ŜŞa0ZŬ0LH h@2W ¨WrfkMÚ N0`½h˘2ıĵü@pV°cFÖùiûCˆR GÖä̇ŝĤĈ ïÛuúÏŝwĊĊ³ÏsÎkœóšâĵ”rIJqÎyÇU'ŜzdĵĞF›ڧërÑş$:ß÷ß÷e³Ùô-+š ‚`ğëş{\×=xôÁ‡îyĝKżzĞ r97èhÓKX°ú= ZžMċğĦĦĝC½Ôes™•ĉhLVM’äĈFĉPïgĈg·RŞc tW–ñĉĞŻâä3O`ág_8£]%DsR,í’Î!ŭeTdŒ‰µÊ“8QiטT)•c2­uf'ÓZëˆìeC–ÙË,*.T@ˆ†7*CĤ 8ˆT`Żü\‚B NŽÂáœğö²Ë9w…ÂuÇw9÷›BŽ„”dÍÎħ [“·žž{éĞŸr|_nŬëÌ^3ĥ_ vîŜğ`Pş8ŒŬÌg(V¸Íè†ŞáaĠû=bŒnJ8IFƒÇ)l_'(+ç9=Wžet•FZ0k„dÏa`ş?*Rİahî¸~vû—ŝ÷O<òßöĴ<ŭíï[ /tǗR.J)Ûív;évğ™5< 3 KxW (Q_žÒt]0âo\žç‰ ÜF£Qk4Í0 7{ž·Óóĵ}A^˙Ñ_ŝµ‡<ôáícç Á€ p Ybè ŭáDeú) 9ÊT€h¨Â= €Ĝ¨™a¤bÉîcYO‰ì™pupòĜ›8÷Ê 8óÌÑzëufQ\wD{—ïóëòĵRĴ­µŽ´Ê˘n܍µÖ‰Ö:QJZëÌ~ċZë\)U‚OnŒ1%ÙïڂN„JP‚ħN˘ħÉuˆŞÇ F%XġÀİ$N“cŒ9ŽXÀr„ÒqGᔠdÉBĝB_JÌÌ :”7Òó/oY9ûʎWùJŭ. wà[ż[Ŭ€ùıML€œr"s ^œ½€Œ8éó²×E„a ,' Ï 2xĤ4@À¤9Œ G0kz š[.a_X׎ÏeĈ֚ŒA+&ĝ23ûÒ­áŝ£ÛÏ˙ġï}KtZuÎyMJé;޳À9_áœwÇex– F÷)]q Dşp‹NişÖD‘çFJt•&×ù ĥyž·ÛuŬƒ;ŭ3˙ŸÜmÙ.)B[iH\K:•i ĞkEó…ŠÖ>Ê È5!Ŭ=şĦ• Ä䘊à2b{&N·ag+êò,OñêëŻá•ï~ ÏŝX:Ÿ4ŜiHgagèœÒż˘µîäIÔ]V*RJĊZë$/d¸D)•*rT„t•L¨:7ThÌ÷µÀh,(•ŻŸÖš­QKDEڃeKLËħ Š;Ž#…Ž”Òµ—]Çq<Çq|Çqû½ÖtœÚĵԜû…ĵï'î:áJ~,Ò "¸V˘v¤ĞĜĞ`¤M5aú) 5"Zċšf=CÁhägĥ÷Âô>ÒÌöâcÁIċh=—ĝĵùŭo#>ñFք^>¨wšÁı<Ï[JeíVÜí(˘<Ï<ÏcT’çyޔʔRYžçıÖZÙïÚĜµ.ĥUíUk€ÏZ1ŞëÙĜ׏üNDLk=|ĵôjQBÎ+AJ8Ċ’RJé8Ž[~YvH)CûġĉœÔ·ÊlF_|uËÒ·_ß÷Ü÷˙böċ]×y;oğğAXo€‰ˆŒeĴċĝ^k ï[ÏGĵfĠ+7H* 1Ä8ƒ+O0HÁáç€cŜÏÑ+{—P‘˜,bœé˘17ÒÛ sÍMŝĉŸúÍ÷GO|u×â·˙ô‘”,›ĵ(l///ǝN'SJ @ìµ+-ú]ÇS@šËX/êı荆WĞĠ‚f³Ù pkğ<ÏÛߘ›żñ³˙ĝŸ~hî-smCXˆT1İÓJ}‰ŽU6€~ċ`Èݲu£ÜĴ(#‚ÒÓ~h$Êœ£Ħ³ÖmĈ,ĝX\"­ÑZ8‡Wžü!Ž=öm´_{Y5/o…'ŭfp*˲ċ4êĥ:yŜÎóĵ“çy”çyœeY˘”ʲ,K-äyž+­µ*ċ7ôoĠeUèĈŸ7Ž6²ù° Ò¤c1ğ‰²<Ïyɨ,qêT NRJWJéI)})ïşnè8N]JÙhşî+›)™ËOv·/nïNcVîNîĵŭ~ìÜwÍze(7Ċ{IV&CD&R•÷| ÖLœÈƒÄa W0hF0˘pâġĜR™,^mb £˘WİŒ VVrˆÀaŝ]Ÿ:¸m÷áM ŝï‹çkœósî !Î3Ĉ„”2j·Ûi’$zˆ)UŬwWt]‰ĜFÇ) MÁh2W/r]×İ×ën³Ù kµÚ|­VÛêûŝ×uŻÛsôĤğ>óë^ŞÏyç2Sô}°ŒœĦĞêĝş2 ݟ]ÄüdĤϊR3"nğúùblÌNL=Á½ -_ŽžIĦÈŬÁÒĊ xó™§ñÖ÷Áò+Ïëz·ĉêµ3;›Ŝñ,cKy//gY+˲N–eŬ,Ëşyž'Y–%yħ² ÒZëRr3c€f½€4 ˜&}âém°£I²ŬX@q,Á‚Tï˜*ÙS Pœ¤[,_Jéı[s]·&lxžw|Vʗ·Èh.zkiï…7žÚñ†7Ó uĥŜ|7ĥïŜÙ0„1E*ٜ?.Œ˘~`-UGƒÈÁ„ŭWÍlÍ )3ˆA™"žH‘m´%‚ħ ½Ğ€ĈàşxLíTC †ı‡fôÏŝĞOĥŝúßoao<˙çÜçœ{œósRÊE+‡fY–İ<Ï1âĜıÂëJÓñÓui`ÄÇĠ‹Çvœ¸×l6ëġz}.‚žçís]÷şÛ?úÉ÷ż˙˙ÎQîHŝj¤À às;\ú£*•ĝ˘ÑxWĤl—î°`ċıq`ÄĜ(˘4p‰•÷+5ÖßŬ^yñ9ĵü­Żcáı'ß]éÌĠ‚óÛkî[ÊĊĊŠu[€RċuI’Şşçö—ïşnèy^èşn‚Ó‰­Ž3³ñÜÊˋûÏżŭmoÖ77‡ná{o½{wî€ħöÇŜÖk¨ñ¨Ĵi˜Ŝ“ZċÌ33#'Bž|ĝœÁ5 šs(a4ƒvÚ-ĦRY*.9E !È…áAtrƒóİÁ|}ĈĊg~ŭ>ùĝ˙ÜÜ}üŻaŒ•LÉB\B´;NJDĠFÚġ֕Ŝ{P2S@šġƒÑ¤šwG„a(gggƒz½Ŝ´ĉ…Ŭëîkµ#ŭòßŭȁ|d{WNw$’ŽAHZCFËse½¨/  ĦHY=[ÈV„JV4R´˘žvŬ“ħmŸˆA·ñꏅżù_HŜz%šqĝ‘Zĝ–qjçó<_n­ĴTA¨S‚PšĤ‰eBÚ:ä éà3h(á@i ]j i#sŻ&Ò(`™{X”•;EšĤħ%NBJéşë{žç[`Ş•àäşîñ]RÎ:qşiċÙóßxáû›ßÚwcmÇ-÷bßÁCŽ ÍîĜ„se`Ìè8v˘Ġòîê˜"BĴ€Œ|Íà:€gŠh")8$†C{ùxem E#sxQO5„‹+9jĦü{żp½Ü²gĤġµ˙üuŜiBÏZë!D‹s>tĊ֔HOàâS@š‚Ñ0i^¨×ëŜÌÌL,ş]·ùżÛ÷ŭ³Ûĥßúıßĝçlîżħ,ĤM[.ÁÈĜíĠVzŠŞ9sY)Ï oU İÊswíĊù÷ᢈ£!84–Μ‹ß}Çŭ‰ §[[ġ^3<žeÙĊNke9˲ċŞ$—ĤilÙPVփ”RŞlBĊ`Ħy Ñ%²˘·ËŒh@tݲŬ$én=_|œ´RŠ)ò,˸"‘RFĥìäşëù”’žëş ×u›ëßïĈóùħîıĉ3ûmŜל9zßuäfln4ŠZQ€ƒQÔ7²UvöĦĤZFhÊmC¤€Ás8\Òĵ0;8ĵoĴ0ñŠ„'€âı˜"™‚tħğµG2ÔŻ{ßV6·sì/~{–_8ċ3Ĉ<Ĉ˜Ûo<Š˘Ôö+ ĉJ%ĈMÑn HïqĜf×F£áÖëġ°ÑhÌÖjµmAìġ<ïş}7ßvϧ˙Ñ?½'hÎşŻvr|Vd„ ꏅî}ŒMùiĦJäOġCÖĈmA‰VŸĦRġ¨üiĞĤœ–AĤœÙS‚áÈSĵġêKxîĞ˙ ŸúžnĉñÒFŭ5VNei|q9M—Ò4meYÖJÓ´›Ĥi’eYœÙU!=tÌŞÊ*àc6D—ʐĈŬĈ.‘1­ep¸`â“NŠˆˆ—̉1&Ê>'×u;븸ĝ_s]·îşîĴï'gĥIùğíXĝöë×?ûÄöù™ïuöÜ|;6Ïn*fqKË-u!M0c2ŽJ(ßĜ,/˜|Haܚ8‡#Ĵdm‰UĈ[p;*½p0*XS+6X1„M[÷ԓżġ‘Î7ož½úDYS’Öbż,„€•:Ġ0ĈŻHPšÒŒ.5Z³ÙœŻĠjÛ}ßßïyŜĦ[?ôħ<ôċ_ğ‰¸_è*0B!ӁÀM%ûĞü$˜ÒjÛgEŭ¨ŸB˘Ëˆ™ÁA{5R{”›—Uw@ê%f€޽ĝ2žŭë?ÇÂżofĉü‘fŭ•<5çÒ¨{1I’Ċ4MWÒ4íĜŻ8I’´´i—Îì ™uѲ˘ÑÈtëŬ7Ĝ%Ó0%['"“çıÊóœçyîÄq !şëzvvŝPŬóĵ/IÎÎ{ŜħmHĥ/ŭÜá^zlkóĤûÜ=Gnüì

AĴϖ*Ç*g ¤` V4û2MhkàÜJŽyż&ġÇġnŞ}ɞŝ›’%9%SB°n·›x˙ŻP˜J<¤)a²{”“NÖëuwffĤ^Ż×ç0Üáûŝß÷<ĝ3?˙á›?ŭĊŭ{£ĞàA5£rp^uw5ĊÖĜÙD …RQŽ˘ÎİĵÔ=b §Î ġ+ĊiTĤԕ1>6ŜG+œzċ<˙7‰3?x$Ÿ#uáH£öbžgÛ++Ó4]L’d9I’všĤQ’$‘5(äÖ˘­+ĉ³0šB“L kħ˘q€s9h£5¤µŽŻµN€0„Ĉ‚ÑwÛH̔R"Ïó,I’ĜuŬëşmÏó;F|Ñóĵß÷Ï×ĵĝôœŽĥ]|ìüÑž˙ŝĥĉ-È}‡oEcfÖ;ĴHόMz`#çZ†§÷ï“iBŞ rˆÂô 8lm‰`x1ċXı§È=´…V£ w 1à†°ġ@0÷Ÿş7çëüğü5ĈА[›3ÈÇé`iš*kv•zŬ([ĝ¨\’w”Ĥ}HS0ZcsF˘tÒĠj5·QĴMµZm—çy}ß?ò‰ż÷?çŝl[V„3iĦK-%ħŝD+Ï[ ÒT£ĦZQùÉ1}ù­Ú*N)û‰ÜÚıÒÈϞÄ#˙OpâÑŻĞM”Ÿż^{Qe8Ói·’$ıXQ’$Q’$qÙ3T‘ä†h= dpénşġ|_oŬèr2¤Ô“Öú>êĞşyò5ĜÒ(pâD¤µÖÜö{eišĤI’Äqw=ÏkA°äûŝ˘ïû=/9ߓ³óşğcñûçoxĉıl›½é>yÓwÁ ( 2œġÎèËĦŠĈ ½°0•ÒUʞĉVL*ĉe>^v(dò‡¸ÊYZDEkı£ĝÍڍÚügù×˙ƒ  H\/äğEĈXĞÓé¤QÁš†żQ2Ŝˆôw ”gS†4£uƒÑ€“^ŻûÍf³Ñh46A°Ë÷ŭëss7ŝŸüЏÎiö|p1%ĝ6ÑځÍöZĠèÚOZvQ)ÓeÖέ†ú@¨rÚ+„àzˆ Ò èĊóxĉ›_ĊKġ?t3n_8Òlĵ§tĤÛn]¨Q+Žn\D+§ĥ>Q­ é· F‘êŜ+ş#JüìÁi=À¤+&ğPŞÔ›´=ŻÈ³,KÓ48Ž|ßïĝżÒ§äBÏÎëΎĊÇÎŭŝÏnŬ~Çœ}× Î` H½qo@ŻŽVżÈĤmĴ€„i(S€’Ç9´(†J0ÁÀu?ċ6BËà ;½…Öv¤HÙëîĜĵÎ|Žŝê߆leÑ­2%-¨€P"Óïû›ÒŒ&5ĵV{Œ\ëĤk6-Aìñ<ïĤğn˙ü?ûż?ĵiÏŝÚkħB;#xp AòâLSµŸƒìÌ˘~‘²5£Ü2¤ ´ŞÊp•ÚÓÀĜjV°ÚŜŽ2Ĵ‘3èÎ ^zìğxö/ŝ„œ3o-œy^‘{²ÓZ9Ÿ$ÉB’$Ëq·â8î$I’äy^Ĥ(¨!YΌ˘· FÀÛK_ w¨fôvjJëaJ“êIĠŸÍ:êJ“dĵ/"2e_˜mVN“bu}ßoA°Á’ŸĤ M?=7Ż£]çqòĉÇ^½y~×Í÷²{÷ƒ¸Dé9°0£ÄXyhTm‰ ĥ•2Ú1¨ˆ£2œĦ"Ż<Á*Ž{cÍ€Í'*X+q 6ï>ĜXĝÜo}ġ˙ ĜÂ)§bsWˆˆĊqœ­J@ôŽƒÒµ8i Hï 5›MvvvĤVĞm pïû‡v\wŭûÏ˙÷‡Âı9ïĊŽB˘ҒóŜRµû`FyÏÎ]WĉŬñC`4.(µÍ ·)N+MáÍçžĈ3ñ'H^|²ğsĤñŠS_‹:ísq/$I²ÇñJE%%eŠBEš›Bİ­%ӍcEɧ{7Áh= ´ o-ĥ4ŞĈi6Hl 0i LYžçI’$q’$$IÚ`ş¸%HÎé7;ϞzéÈÙC÷4ö½›ĥn‡.3½ ´v˙éÈ£‘3ĥ"m†@0ĝœÁw 4/€Iˆŝèô^w:Î<‘ŠÒ¸° ÌoŜ,~ê7?ŒoüNÀN½ìĜ”vë&/Š5W(c˜FMÁhŬ`4;;Ûë1ŞĠj{<Ï;ĵûèM÷~îŸŭëûZC>ÛQE\Š˘WôVTSşi ^Tô•#" V”YGŬqYuÓ 7&#£İ0* óc˜:wßŝï˙ §żû7Ù_Û>S1Iâ3+q|!Ž‹Q-Çq܉8ZM’é.ĊI·#Z­×ÖŭN3$Z‡ĵ7Éô°Ñd‡QĴi8”ïìŬ“ò”RBÛBS…1•À´’eÙRe‹ğ½ÎÉäö oáÀı›ònĵġvÇċĊH RÔŻ‹˜*Ó§cx¸?.3E]ÉC ž`˘˜”lÁ÷ï,T;)€€xñYËÊàBKaĤ֔+û{ŠoüŽë{)ĈĜÀ{0JĝÁżó÷oNÈáŻtr0†^ÍHĜJNY+²Ÿ=(ë¨ËË ¤Öâ½j÷˘1ğ)‘540bzˆ£èĝkĝúŝgDO˙ ½~ĉ9#7Z­Ö™8ŽÏEQ´ÔívW˘(ê–u"cŒ2Ĉè1`¤‡ÀGŻQ+2—Dë­m”½W`DêGëı?‘ö†7Ó(én\mɌĤ2·$LišĤ6ğ°›eY'Ïóvç­yg˙éS·,ypĉÈw‚D c{•hTÜ`C-ġ{—­Œ`‚€1€+ŠZÇF_ġ̤ÖNxÑ/eĴ¤ˤžÜó37ċ\ ïGĝ&: ”ŞFŒxoŜ(ĤáŞS0ZU3r‚ 333a³h4êÑí˙ôGĝÒŻíĈ^‹sp<+Ñ ÎÀ-{ĦêŒ*¤a~ŝ\f V¤i5ßM-Y‰‚1^ ÉKÛxáğßÂ3_ù½)iÜ2[:îvNĊq|6Š˘…n·ğdŬsñyN˘€Ñıs—„zٌ ïĉĝ€ÊħGocËĦq6ÖP[UŞż›aIĞjI#€‰L^ΰRZëÜθJìĈvç­At1zħsË3Kg÷n;z·³yç0ˆâÖĤÇô{f{bfĈœ•€VNFCK À%CĊgĦ‡Ĵvĥ’ä€q8ŒÒ0‚a%'ĴD MO0vïOߐGxÏ˙Mïµ.Y’Öšâ8%’î0â$âíR% y HSfÔ£f³ÌÌÌ4êġúV›Kwä֏~ò÷˙âŻmkĈ^O¸Ísl*1'²G5ëéâDgŸW” #WŒž A½g_6¸‚Ì(;wßú?ąG˙&ŜÛĴ?Ç{µĠjŒ˘è|EğŬnËÊsižç™•çĈQĠE§ħŝŝ˘KÉ ğ˘+t.üÖVqÖ½€ĊžĜˆÛhÂġĠMw0‰áËDDVĈ36½#·5É$ÏóRŞ(ĠŜŻâó'—ÏÜÒñĦځn~/nˆŞ5¤*a˘ñc-:Š IC;FÁAd@Œƒ˙X JàI I0Ü •,e³M—İÛâúLò^ú‘!"FDdІŞh”Ŭw—”ˆú9S@úħ£ÁzÍf3˜í1#ß÷}èC|à—~íĈ.1öz\ IeU™n°áŻ7żÈ֋r"dH+ÇçÈT‘” €snğaJ½ú2úğ˙ŽÄ‰×.š­˙(êvÇq|&Š˘óŬnwıÛíĥ“$‰ÊñàĈµF4 ˆÖcç6‚şnyîJžË Vö¸5˜Ô0@ħ1ŒjŒ)^ıß(ĥDC ‰F” J/Š"]ĝò,Ïó8ÏóH)Ġ ”êìÛ Ÿn½ï•• Ûżí}Œû³€p@İĥ£Ó9Œ6ŭđQ'i• ‘´10’q#ŒMC!pÛnÁĴz!E1 Ù€CKV"_0uÛç+k˙ĠïX•Ş,?Á”Ì;JUÊ8¤k›Ö!gŒì3j4^ÙgÁ>ß÷÷‡ŝ•_żk{5Q€\;n\D•ÄğssÒ­’!hì–ÜO\°g}6ƒNu–Â7ŝ /ŝéÍwJö²x/´ VtĥÛí.tğŬVÙàZ1-lT˘ğTV´Z“]Ítİ@µA&µ8­Ċš&ħ%^y‡xTŭnŒĦ2dw¸ÁÖSgÎĵĠ™QŬ_Z:sĤïw7ïÜ.Ŭ"Î*7½34š¨]÷m‰!h20‚Ùž%‚’‚£ÙË&qÁÉ$Œ=9ì& ˚0Öó§Žj•i˙ÍÇ +>Ĉö½‰˜Ö3Dc˜ìzÏŞ1µ}_[ìh-0iyu]WZ0ši4[0ÜëyŜáwŜóŝüƒßĵ=a-ĥ`;ċĠR•é”`¤ 5#›¸ÙħD÷™UĈúÇ'ŒéıĝÖŭ},ŭà‘öÙúy’ĵъ˘SQët:‹%+ʲ,µIÜUV4 H—Z/—Ê L6-LAhƒuÀi=Ói٘Ô`ĵ%œF}/úİÉÄq\²\)•*b­u(HÛ §âċğÚí‡fö9 pÜİä‚#šÀ‡G­dވÜÒ¤A`=$EÁŒX™çÈ ÷ıƒŜ3VDıĈ fÉVîü™›™VÊ?ŝ„)e;c ,cš”èÀĈĵ½ïëgI4 <¤ĞRŞÛ3À0t›ÍĤgŬt›0ÜíûŝġûnıíŜOü£vgĈ]ŝJ”C)ÀĞ€bE½\:*ç•] Énx_Ħ âen—VF×_Â×ŝo“sòµsû›áQ§s"Š˘SŬnwĦÓé,FQÔ)G†k­ó ÑZ!İ$şIlhŬ ô@ï{˘5êG5İIÀ4J£QòĴéÁ£MyAkU Î LÑÎüùβNŜ÷ZÜÚq–;cu0ÁcÑ*0Z5„ҁ2ĴÈÒ2˘xšD Žm¤ċĴß³'A2ß-Rjbˆ’KD˜ }ĥr÷/ÜĉèTù'Ÿ3tKĈhi­I)5üşëd]ĊÖJÌĈMéZİ­5\o€!yž'ëġzo„„ J½~× 7ŜóİòŻïSŽ'^Œr¸¸ĵ01Ħ#’쉍².şœ°ÊÖMĞ&˜8‚ЍX‘ĵ â+Ï˙ßĝ˙§ŜœEŻž|ŞŬnŸˆ˘èl§Óı`íÜQšĤɈZÑÛaF˘ Yĥ§ ôް'†É¸ĤQÀĊÇ#ߕU*€JĥdxJk)2T˘µNšĉĠ8Èğ·ĵÖ]>ràÖûĞm‚à,7Ċ.o%72fìQF6S•Î †Šôo"Iż—WĈkLÉ%r4€T3¨Dc ÀĴ'ùÊ=_KŞ˙Kùg_*nCD¤”2EQ6âu5k0ÖuĠ“Șé<¤kŒ&Ó°Ċ›{žWNz­7Maîö<ïĥ}îüô?ŭאç‹: Ê$—ì`=6FŭÔŒ [w!×U?8µŞrl³uÒqdËÜW˙ŻŭĊ'{Bïi2êvìvğg;ÎĊN§Óޏ›çyfûŠÔ%Ñz{‹Ö’è֒çĤ@ô€Ó%°ĤÓ(ĥ4Ž)Ñ["”$I˜r­uĤµNjĉdĵ7VŽÇË·‡‡î ĥìÚî¸`v¤„QĈN¨­01G˜6@+Ó0G€ì<%)x/”µ§S2‡1ĝ‚t8–2“j,)ƒı†ÏŜ÷Ë÷Ô˙fŜ…7µe{%ki­)MÓ|èuC2ö5ÎNcŻ l£ċŽßwGĜázµF£1†áNÏóÌoßqÛ§˙ù˙ŝYoÈçş ıĥ`„"ŸW>š½OgOĤĞ0#˜Z£qQt„ŝ€3n­AL0ÄgŽ;˙ċwÑùÑw—4%QôzE';NŻ^4A˘FI^¸,@4Ħ+Ž5KŻer ׎†eĵáûRĊ@dğjµÖıR*3Ĉ¤RéŜìñΙxċ}ouß?·˙úÀdÊ ˜arŬßĴġàHCv< lÖ¸`ö@6œ÷™ßÁà8†8–Tm´ÜÍħi!ÎÜŝË÷o~ì˙“xĉlÙD^Êw­µQO•¸1ç]›ħ×< mÀÄÀĈQ½^›Íĉl­VÛáûŝúÌÌMŸŭ­˙íá™Í[ŭçş9˘Ì&v£°‘ ²RŬ‘uÓu£˘Ç¨(šÄŒ*[âuŒ˘cŻá˙é˙{ŭùsğëŝ˘NçX·Û=eÁhıâ˘ĊŠÖë¨[+ŝg#@4eCWkĊ|&ĉùaµ=œ†NzDEÂĞ\kQş]?­P~÷[LïÜwŭ €Á ¸€aÒ£?S4ô™$CheEŸr:7pƒÊ;û„à ­€]œXĥğ ;ĥnvOßùĞĜúƒ˙wDD9€ĵ”¨ĠjĥĤTMrUŸÛ€óŽMM WıT7ŒÖê5Ş‚Ñ>ß÷oĝÄoü‹mÚ{ ŝb¤Ê ET‚A²ĠGRŒò!0šÄŒ†%‡ÒÀÀÀÈ óêóĝúü˙QxŝäñĤç<ŜétŽu:SNgĦÓé,ÇqeYV­ z¤şIġ˘K˘)]Ĵ #Ĝ&HybN£i ~Tùż˘zü”^šĤÖÈf”1&/İI/gÂdw½u÷ïżñvÎܘ˜";‘–:ŝ€˘m§7Tŝ²n^ÚdÈħŭ}ÜNmfUé¨×}n1.€Îzñi|í·˙Ŝ”ĥ_ñ9ž²`tڂъY”*FItìh-0ÚÈĴ˘)]ğĴi’”7jJ-†îGc$ğQ2_)áULxşĝǘœˆòĵžíʓî›yrôÀ­w;ä̀‰bŝ‘ÊİߜG}™nġ™^q}''tQPĴV4™÷AI ‚Q„şĦ‰)ƒ4ÓĜvpóBòÓŬòÜ&Ĉ˜Œˆ”U&Ê4‡áġD a¤twm–M@Z‡‰a-{· m4z½9‚ŬžçşŭÓ?ñÁ‡>ĵlŞħCˆ ‡*fT%’ĦˆêıézVĠÑnşêĵFœ:‰yŝGĝêo˙µÛ1O3ÒÏ· ™îLğŬĜétZI’Ä•z‘Fħ;ş0šÑ˜F!ñ '4bÌe‚uáeY†²T1äĦ9‘ïÓyúVßĥçÖû%óĉÀ™€à…ĵFšF‚ÀĤNjÀ€ÈÊw˘hjïÏS*$yÉÜ|ġŻ3"ʵ֊ˆzlÉJw‡qRè;]J×à'êZŻ!­U?eïvÂ0”ġbm ‚`·ïû×~ïżë§żt¨•œŒ‹ÀGE ê £ŠLg*`TĤ/ $vÓǕ•‰ı(¤ƒ‚ëĜvè]ŭÊŻßš°"ŸD`D6ĞH ĥä¨8²ìÁ]2¤ĈA”• @Î 0ÒQ KO<ŠG˙óoÇ{=çIÔ}ıÛížh·Ûg+É ñˆz‘0Ú+éšğ€hDñ=ßüŻ"`ZĞ—ÉŒñh[Ĝ“ŭ\ÊóœŒ1eB‚ħ—uHï3ßIğó-÷…N¸\;€0ĊˆtŞ( MŸ-_}E@'#@£Z˜(žŞcQ‹ñe š1„’ °Ĵ„VĤôvöĈ/•ÑŠżJbŒé™ŠĴAƒ*ġ¤aĥ4,ߍ'3?qn0“L ÇÇïË0 z½>†á6ß÷÷×gçŽ~ì˙óû„ëñ—Vrh;Â+ò İıFT£^ŬÈĈ£ÚĞÜtExQPċ yg ŭŝżïî œïÇŬÎ+Ŭn÷¸£ċÒÖ­µÎìܢġşé֒é€Ñc"*ynÀó^|ĵi­çx%½–DDìâk†%*>̂°Úè°êĞÒŻ„*[""MDjïñGÌI“ß׸éÁ†WÛ Ĉ]0aˆĤLÙŻ<ÑŠ…&BךâŠ`Żbş˜=Q,Nh Ž@n]mŠ!Fa[ͧnĝé÷í{êß.zZ'Ĉ˜Ô“Y–„n·[֓hÀħCbŒħ-˙òñkRy¸V%ğġԍ@)Ùh4üf³Ù´£$öyžwĝcżñ/>,ç·ĝÏ·säV‹ì'GĜáa={‚uñ”ÌHÙ>£lÄĵ–Áz˙™òŜ #!²ċœì<ñGżÛŜÈïĊŬî+NçDğŬ>×n·íxñx¨ÙUau½h#5#şZċı5À‡]A`4ŽY l£ŝž÷òuŜ€Œ‡1²Ô°3o8a0+U%IbĴŒ×û@ğO>ŞOƒ £6ƒĉ@H@½J”›ŝht3>M?Óżœ>Ğ+&# Jƒ,VĊa4"Ĉ°gûv÷Ôu?ġŬ/ŝn‹ˆb+Ŭ)[3ív{Ü Ŝ8k}ï>ŝğٖŝĜ5J× mPŞ¨Ùş‘[Ż×µZm³ïû{]׽ŭÒço¸yöDlU…'AvŒDŸÉ”'Z„~>]™ÚÑêyF„ч +'cښQştçż˙M<ŭÇżż²'FŬîkNçĝÊÊÊın·ğÔív;Y–•NşI2ŬFzŒ&ħ˘+JžğÙ( ]N ˘ËġWH­CĈl ˜ìÀX]OBU³Í§ċs!*&Ç™'cÎŭ€9úàĴ_ß îz ¤£âS5Ôaġ(d 7``ŭĦµĤ?KI0G’ W`)Ó YѰù­Í ñ'>´éµ?‹ˆ(ÖZ§Ön´ÖEÑ(“›püô^cšF]•R°:‰ĦJŽˆz½îY\ğ<ÏÛĝŭ?p'?żç˘"\Ì5Œ)ëIÎVgÔ Qfìp½ 5£êñßK’§˘£–1 [^À™o /ŝÏ˙ĥĵ+v;×:ÎñVĞuŜ֌:yžgJİ Ğt‘é*V4„Ĝ%Òċ­ġ‚[zz;_}]ŜÍ÷ädĵaĥ4̐0BÊû”ꁐŭ³{'WÛN|ל0G˜gĥCx.Œ"P^ÌV"°AÉ÷˜Ŝg63FäWgœġŜ8Á‹á~j XQĊç85™(˜ë>°#ŠÎŬœúAÇ÷ŭDkċĊRY–éAĴÀ É£^ׅ˙n†˙çµeşêéûz`äûl4A½^Ÿ p‡çyû7ï?pÛżük7%vfówb„1×Ħ´…hWĜ’!"l?ù¨9ËÄûëïŸ÷gĥ€‘,è ħ"Ԏ D0V3˘ĵˆ a§0Ûïo5œ’B‡!1„ÈŬï+ŽÀĴïàÜĦÏŬğè›7"cL¤”J1J)eşŬ.F˜Ö]OúâżxÙß߯|ċ+ë}燎´ŽÍb]ŭFRJÙh4‚0 gÂ0ÜêyŜŜZ³yĝ#żñ/tŭP<×ÎĦ `Œ_™0Ù˨+ÇI ßüšÛIŻfĴPSIe`ŭŝĈ‹ħÊÙÊ".<ö-<÷?ŝ¨µËċv ft˘Ġji·ÛËQu,e”:)—n­,ş÷”­„Ö 2“ĤŻçq/Cwŭ¸ÁyIĉ^{z7€ili­&ZŒžI?k­3 JÒ^ŜĥŭÄ·ÙYĈb×ß;ë6·Ìİ úœƒ´`FCWDÚĜp‰Â™'ĴvÇQÔ‡£N•1dĤĝxµâ ;ĉëüā/Üs ùEOëÖ:QJُ²ĤN§3lö˜TOÚèħ0eHïò™ó¤fdDçyŽ'QŻĠjóïïv]÷àƒ_ŝ{ 6ožë(dŞ8è {7+›·{`Dö.Á¨Ĵé-…†¨ĊêgÌEKyÔÂғßĊSüûí].ĞÊtgÛíöREŬ!0ZËŜ=̎h2ŬH0z§7´·Bk¤_Ïŭ× LkŬFëĵm­ËPk2²wCÖ[ƒ-ê[–&IœŜ‚ÒÈûl?ŝ-vüŭt}³2Ĝ !èÌÍëÚĴbFċċŞ˘×ÎŒŒU;x”8•I€\ÎQİ"0m jgĜı{Żzċ£íJ˙dÉÓĠZÇv(ĦÊó\Wú“ŞÉè“^G€ò•Żĵ#,i HooóZkòë@ŬÈ6ż†µZm.‚ëî?òÁÜ·ïŜ‡ĥœÉ :şHb` }{wé÷Ĵîöf°ùUY˘1}F½ĴûôÉĤö긅}˙áìîvYéĤ;ŜjµÎUÀ(“°‘şÑz%şw…]FZëúQÇÈÛq›ĉċ£QR›]Qà4†-aÌÙŭpè¸şÒš3ĥ´Ö°LİzŒ1†m'ĊÏ÷ŭ8ô&ĵy0.À ``ŠHmP—4#>¸]0fl“,/ö„Ŝ %‚ 14Œ@;Ó äÜ K °ïM­èäŭġ3µ´Ö]T’çyže™Ş$9TCj×L·Û5JׂdÇֈŞ_ïËZ­V֍ĥığwnǛîù…żscb§S £‹şPnSİ„¤>Í0~ŻQnC1Şċ¨˘IsÎìw€stzêxì÷˙}´Çߏ;žµğÓ錣2A­Dç­ FWħ |g럁ûH)ĉyBp×u9çœ ! „À9gœsfçœ ËaĈ²}‹e[yĉµÖ0ĈP–eFkmÒ45(ÏsZ'şžÖN︤·Nĥ4,áñ uqà/†jJ d=Àwûş8 ù`ŭ†;ëܝ3bĊ¸S…NZğ”!Dyñô˜ĠŬ‰3p^¤µpV ĉ4| $yÑúA èŞ"ÉáÔî_°}üŒoN— ”ÚIı&I’²ž4ܟ4*ïîJ@úÊW²Ñ j ¨VĞùġz½†áfÏóv{žwŬC˙7—: 0Ċ›÷˜Ñ°?USÑ2WĤfeÂ0*Ÿ‹˘ÉÎèŬŸÂ£;ñ>Oü îv^4½öĴŬC†:êĈġáŬ£ Ìv½òÚZĈ””’9Ž]×ër @Â)–(ç\!cL…DIœÙ?Wŝœ2_̆H½0Œ i›&P„–ŬúZ)•RJk­ó<§$I´u] TNÖz˙6ʜèĤ Hxf]7­‚+/żv˙k瘘=tK@˘Ù³tg@utŠŜÂá•Ïb ‚cÓZ ƒ’#ħÒ>wjaáµNfQwYk½bÁİ­µnë˘wеî(˘<Ï£“’4Š˘4Š"Uİ?M²ġ’ġ°Yï²Ó:A‰Udğêy!ß@M PœÛġŝĈ‹ċ4ĝ1ıÓùvŭç7íĜËó@=‘pµfgÊÚR%⠋rdi9÷ŠÏM Rê-ьġϲÁp€C gP† ƒâ„LT˘q.Ó8n€@4‚ıƒw;n¸wÛŝOó[ğ玵Ÿ˙áÙÓO<úrĵ´pRk½ ”Zô}1Ïó•0 [Y–µÓ4íÄqœÄqœDQ¤şŬ²ÀÄF+ë&ĵ‡léR@ C ’$aœóĥµĝ;BoljŻÖŜ ĉ߯Àŝ ('0! ŒxU²T#OUñ=ÓP™ĥ ÇHWr¸‚˘?ĵ“s@ˆÂä SԞ €`Ès Ş_œŒïz`·ŝŜ‚Rj% nZĴÜĦwÒŬ(ÇUopp"0„şÈá{RJ§^ŻûÖU·ĊuŬŬ[ċèÇ?³ğ íÜ2J1ñĦ TŭRĊÄ ˆ™Á( c˙áĠ}ŠŠÌ;²z2żŝ÷‡˙Iïĉêé$Š^+Á¨Ŭn/Çqçyžc†SÔUFħm³I@dk}²žĝĦçyuÏóšRÊy!Ĝ8[ÇÙìáöëïyàÈá{Ü3ğïP³M‚Ÿ5^<Ÿ`9Sp9ƒG€d gT4-ïs1oŞ`@èzíêi¨ž cġ>8˘´Ŝ“y¨òBĜ‰ĵ2²Äu8 ˆ'E€v ”*“v€$7ÈA8ż’á-E0œ[Ûîû‰ĈŭÄĦơ̂­ Ï>vêÜÓß{)ívNğğçù‚ïû‹Y–-‡a¸’$I;I’¨Ûí&N'˘(ß 0a­šĊċbK—”ÊKW~֘1yž³8ŽËhÇZ˙½½Çŝ˘ñşùÉğfvp‡Ë:ò\AY˘‘dy”³”Fĵ˙ĈPÄ xiÀäċ^L—–‚Ás8şi_ÄÈ3†083ûÀÎMéħ›=}bQk½œeY7˲L)e&Hw›žŻ6–t5Ivkġ£ĴŠ ‚@Öëġ0‚yÏóvxž·ïž_úµ;s.ùíĵU,—ĵ8KfœġŜíb†WÑp‚·İœ£˜ŠVÇËħFĥß(9{ ß˙ïH›˘ċיJ_Œ˘èd§Ó9ßét–’$éĉyž·^ğ Fo“­ DAaħRÊ9)ċĵ8›…ÛÇÙvĝžo>|÷ŭû·ıy6á8kĵ²˘ħçpà˜=Ápʓ ^ŭĊĴìlhLó¨áU4şMŝû>1üê³ PIŒa0ĵô”|ÉĦ5;@B 1$‰Ĉ뉆á`[š{g6ĝà̏ŭ­˘//ŸyöħcgŸĝîsyžŸ•RžWJ-ĝ1˲Ċ :At8Ž× Lë1;°Ëɖ.(­„[%pΝ²­!Îú{½Gšoyż!KğL“_nE듟s­!·c¨‹ŒÊŜ &FœÁ `H­SŠŒB‚ÖĜÍî¸)ùï'\W-Aɲ,Š8uG ħ¤a@ş\#MĤ€ô6ş‘›œçy²VĞùAÌĝżĊuŬŬ7~êó÷Íî;Ôx3ÑÈm3ĞĦb)a7cCS‹Ôv5Ó;ħîŸB[Y‡qÈZ‹xò~òÄëBĤžlwğÇğŬîÙN§³Çq7Ïó2,u#ĥîq†÷ŒĜ:Ŝ£Ŝ{UQ†N­V B[mş;/Ü,Üĉ8ÎöúÜĤ½w|ìÓ·ş˙ƒğL ‰Ĉ-…‹q ÁqÌ 8û”%QQ` –­R/,Sè¤ÉÛ0&Ì·‡e´À ŝîrè›à8€k4 fî:!9+NŽ–Û§—sx;ĥŜ0żí“7ÎïŝĝÏÜrñİïž>ġ½Ż=,-ĵ•çùYÇqÎI)|ß_L’¤5˜€ÉîĵQ2ŜegKï |džLınEşóë /y›ÜM3'ĵ[v2o@NqĈ *đïño–VpΊ,LôúÓ %çÈBš6p œ`”@6scŭlôê½ÛôS|ß_βĴ]Ż×SÛ{6ü9żĉ WCwp $2”F†Z­V÷}“ëş;kss‡nĝôöÇÚàbZhÂĈlF OĞËÏQ)ĠB/ĊĠZ ‚Q²X| Á`T†7ŭ:Oŭ ½×Ħ´ÛÑñn·{ĤÓé\´c$Ûk4^4)ħû½£KaEUF$<ϵZ­ÌĴA0ch‹ëş;ÇÙħu˙u‡ïüĝgnŬuëŬ›–´/' oĴD@n8u|Îá`=êOóíÇ<­ıeMxyh 3ÂPíp$C-êŸüŒ½+„˘Î İ0EäŒÁ!P„)çè*ƒ·.&xIĥ4§~‡öŜpLJveo<ğxâ;ùlëĝkݏ{ÊuŬ3ë^}1Žß÷£N§uğ]•ĤİŞ˜¨R£¨~ŸäÀcW(­•ì,Ï󜝲ÜĉGıœsoËÙï=ŜŬżŭá% f˜h‚´­ Ž8ކsï ı*X9 ç]1öÜÊĜArOh¤Ö=EÊ êMSğ÷mIŜ¸ŜUêbKišĈiš–ŭĈ}Ö'Ĥ éŬ32 Ĝ½K#C­V ‚ ˜ó/o]kJĴBeŒĉŞœÛIıN4– ­F! ˘Éż`ĠŻ2EöĵY 8ёĴ0ıNќíZFBÌ +³*Dž@ˆ;nÙ²ïK·}XŸxñöSüÙ³­Ż(<%<-<çşî’ïûËAĝN'évğ™íeÒìŞĤPŻU[ş,ŜÛ%6FĈÓ£N ”R,I’¸%ÇqĦÔiE'lŬhx”„^Gíh=ƒġŜm0ZïûÁ”" CDz˘Z†³Alòzë5<ŝ'dv!6‰˘78>ÓívmF]Ĵµ—À0’U\4ûu€Uê6Dƒ,ŞüÑ`5@” ™Ĉ cSëı1‹<*O€lSn™Ä[ċÉ­£˙iÔïċ(NŒ`ŠQ LpÛ˙"HsdnÊ ıB+3ĜVŻûġÏüƒ{š7üèÀıŻŭá·ÓÖҜ˘!„ÇYR. !şeˆë[2•“’qŜe3;ĴJ£Xèô¨ğ (ž$IbA邔2¨·ÏĠ÷Ġ´ġĉÁ]@‹âäÂfŽ#”½ŒšÀ™·,‰£_Or8ƒt€4'Pyök€<ÎĦƒŜÉàĈ{wĉOœġpßC?ûċ[żé=˜â͎‚ÑM΂ï0¸(Ò¤MI`+ŞÊWë#²5ż6K}ivàTš³üŻ"#4J:£Ù• ñTف‰‘İ^1zç`ŭFÙr³Ż+NÀF L’10a"¸ËáhÀ1—1Ĵ¤‰!5u…{nß²óˇ?·ô­Ż<żòôwÏk!N!<Çq.şÛáœ'ív;WJéĦ$3ĦĴ66vè2ƒÒ°tˆ Òâ¨$‡ÒäPö'ĊŽĴ8ŽsÁqœÚì…==×ĵaó’M°Zñı7½6ú‰òn8àŒŽÜRÂCQ:pCc… M€Ï9ÎĝGwîH_?(•:ïûŝb†(Š’$I”ÖşzrÊ1>çîŞ`IW2Cbëŭò<ϵM° ÏóĥH)wŭÜOż…uçdGt8Ċ iħɕ“Ë Ş`FEï[NĞOH9VÏ=âv’5qBvò ĵúµ˙eörŭ|ԉNFQtÓé,Ĉq<\72XߣI#VÓe£ġ֋FJtÍfÓ­ĠjA³Ùl†a¸Éóĵ]ëîÂú‡ŝï|h߃Ùy2ÎñäÙ­TĦ†€_· ĦÌ6‡ÚpÓ˘‘`dÌ œV·T˘r‡ŞPŸ%Ñê"³Œh`4ü ƒ/(:È{ĵi@Ε“ĤIÍ4£˘"J@vL1³Ç+ğ\&`)Ñh·(%lû²öÁ_ĵ}Ëî#;–ŝĉ÷ż!ş†"RzŽ\B´”QEÂ'‘ĤË"áħB*úîÀêeŒ39h­ó,˒(Џ”Ò“RŽ4÷œŝ_ÏĥvŝÂ}Z'‚É(͋OžT34 TUş+ëIĥaVˆÂàĉe”FĈÌtN&‡ïܛŭ¸ëş‚ Xİ×ëQ’$ÊNNlF–tĊÒv„1ì¨wf.„v@[Ŭ÷ŭ9)ċĥĉĥíö}à#Û#m¨B³ÀŒ*MŜÌÌLÍJt[<ÏÛyŜÍ{öŬöÉ_ŭLjíûê?ZLZ[huÁá9ƒäEO˜°É 6i›#˘jŜ éƒ ĦZó+œODƒŭdUÀĦŞ4gúóoFЁCg-4ĥĝSy!Y!U˙¨QŬŜäQÖóʖ­b>'^ʅeIi‚ƒ€€È „ÑR™68j4\Ž×Ŭ½mÓĥŭŸ_ŝ‹÷=qö­çĵnž+%ĵn·›1ŒŜ$; JÀĝĦƒl‰ IwĠ·ĦĤTž$I"lıëI)ëMyħğûäîcÁû@ŞʧLQS2}%f@=,g'‚0nJw(ġmàĴˆcÈ83™Aà;8ç߸mGöúuRg}ßżèû~Ë÷ŭÄóNoÀ„×âŠfIW*CšèĤĞ~Ù&Xß÷ŭşëş›”;Ž~ö‹w8ÒouUÑäŞûPé*¨ÏŽ W^ċĤ£ž‘aĠÎmĊŞSOüŬŸŠB=ÙI’ÓQïvğ­$Iâ,Ëòu#ƒġOz[/zÀh ^l4ŜÌÌL# ù vxž·ÇuŬëŽ>ĝÁúÛżróóÄœíä€!4CÀ90¸ĵHYç–•`ćù 3ŸR^#ğ ‚Ï3N=64 é Ú³€j\ÊBeû]&ÖĞa N4X3êïUÀ)kL½ÄĴ…ÁĈ›ġŜDŽBèéƒĊk-ÀàhƒÌ É4V4!=ckc.òŸ>ì>úÇÛô·ċœB_á !.:ŽÓéIRy^² >˘dŜ)³(“F9ïF½”Ĥ”˜1F+TǑ”rEJyÁuŬĈĤ³ß~jñàĦÍmÍkL6ŠY5ĈôNŒFQïuÒŭX!^RW”Óe‡#WĤżAq†4ÎA½üDtèöƒÎқC,)ïvğŽğĞ–%]€´Nv„1ìÈ °ĉûŝœëşÛ[ĥÜuï·-*BŞ ´µy“)ĜÑ@"CEÉMq3Òú;ÜCRٞ“Óoá•oüíĉêĊ¤Ÿˆĝl·Û]!ĠmÄÚm°Ž^£wŒĈ=,kgggƒf³ÙĴĠj›|ßßċyŜ+Ñ}xïŜùzGáÉIn ĦĈŽÂÎÍ.ç:6 ÈSe³ïïĝ½Fe*œM€Ş cŞ/( Èx†…!VLÀ!Í̆eşqN>Vù‘Ħ4%*§Ġo<Ċċ£‰ġÓl8­fW[Żp‡sLQ…# E„ĥ2H i“cSMòÚŭ?wÓüÎë7·ŝ{ß`Œ…œsßFì\B´———N§“ÙYCfáï(­×y7ìWOb6ïŽÇqÜu]wÑuŬqœĉŝs˙ëùvŭÜûtq0Ĉ˜ĠЉ1m ”.,:˘×,ˊfYΊd 0KèbnV .GĥìÉ_ğN*uÚö&-WXÒ8û÷UĊ’D†4óT÷żSĞĠ<ß÷›ënrgÛ ŸùâmäHŝVGġ6–”xOƒGeN‡ġ…b3Ş6ÁŠ™'Ü&‚ë4Ċ‹ßĝ*šKg/HÒJ’³Q]Œ¸=FŞ3ĜXĜJÁ{ FġzŬ ĈL½^ßêûŝÏóÛĵ{ﭟĝğżñ³}_GË^kċ0™ ƒšààħ"ú§´ss &-˜Ħ ß 1£2M£ @f fÔ“fD4à<|îaPq;`0ĉg8*j•UĵÊ 'Mİ1dB4 ´ÚÀXħ‘•9‰ÌŒş˜G SyçzoܨĤ`²™jDpXqï2F œ Ä`YTĴq65hĝÛ÷ßµmĉoíú öWż3ÏÏ9çcLrÎÏٓCĥ²²’–*çl ï(1ĴŻ?i¸žÄ0TžĤiEQÛuŬ‹RʳÍöİWwD/ì9áܰƒ9Añž£˜ĞV­Ç>SäŠÀYá~,$YÖgIÖu§ìTÙ²îĉĴħ—ŒŜrÀYzÍuŬóï/…aXeI‡Q‘BW4Kr@ µQbxcB dĦïû3RÊ-ġM›÷ï¸ï[[š ¨h‚-S9ôş^=ĥßHİ ĠyFbŜg"@Koˆ‹/<Ħçĉén79ÇñùrĜŜİnRÍh­Z]ŽémŬĠ“î8Žh6›~³Ù fŠ˘Ñvß÷÷yžwèú{xàá_ú{wµœÀyô|Œ ‰Î5BĈŽ€1xĴé†ŝÙ!úġjM§Ïf*Àc™‘¨ ‚UġgCƒM¤T“aƒ1ƒ·FEĊŒmzJH)Á™Ê ΆÀÈ —ĝ˜°Á7§âÀ6îŠÁvùWËX¨E ;FíT\Á·Ñ.9XfÀœÂ¸¨LZ1!ıHĜ1³-ôâ·>‚ïŝÑöâw=Ĉ˜Ë9wcŽfG¨ĞàcŜi£ËF˜/†ƒcġ˜–ó“X–eYǑëşË6Ñ˘ıċôןY8ttS’F.œZħ‘”10žVi˘Ò]Ê´ĵ J½A~JÛş5HŒ2Ž ÁÑ-{ò×öËÇñı(Š–˘(ê¤išXİÎL¨­×ȰêĴĉR>Ĵ—F||ßï.4ÙZ­ĥ#‚}žçċáàžŸûòMÇ'bt3 ­ N˜€ËÈÚı+lµòç™êĈ_ħŜ› 82Ğ£uT ÀĴö 3İû˘!—ŜˆS›î]h„ £êvôyċ¤‡•l…dŠÍhQNJc­qb”[2Ĵ 6T€ĞÜ^‚ càĤ54ìá ŻlŽ}Ëmŭj1W0švNd›gY§%+,à·–rfëSY†î䧢·ïu–ßp]÷œïûKv”H HkĠ’èô†+]²F;ë¸çyN&şÙ ÂŬ;ï˙Àö–2Èr‚VĤ·Ò£T#€¨h BċLĵüà ï³VäòòÙgˆìµ—˘“=ÓN’³q_´i kıêÖëĤğĴŽş· F܂‘Ûh4jÍfs^Żï}˙€ëş‡ïŝÜO}äĉÏŝÌuŻt{j)Cži˜œ †š`Ëz‘ °s³A£Ápí§l,#Ĵ62êŽ21€¨÷8vٙAV6ŒH#šlQQTż”\œu6LEÇ£²YÖ ĠœŞ;‹)NŽxċA9@U2(F3–AÙ^¤‘½t +Ÿ:EH4Œ–Tp*58·˜`Ĥĉ0÷ö/qŭ†Çŝ´dHŽq`:p…€.Ħž¤GHwş”îâ8nyž· œİ_xò…ùù;w,fÍîÔaÈ´sÀ5şY[k‚ĉTĵ×Z@ĊâpVL§.ÇY›bDE8çĜ²7{y·”ù)Ïó.„a¸Üív“<ÏĠ˜Z&ÔÖĤ€4Ĉ̰îánBáûëû~Ŭóĵ9)ċĥƒúÄÍ<¨9çşşoçĥ·£„Ž@ŬÏĴ£á½ıYŭ‚pùÉ ÉÂiĵñŻÓ.Ĥ^βìT’$ç˘(Zšŝ: @“R֊z[`Tù€-0šm4ı0 wúóĵ£ŝÌ/}ìàG>³û…•Ï.§Š Ħ&B è`GDp+%Q˙ä ½_‘ÊŞ}BU™n4Q^Dް'ÓŻûTÇRŭef59íŝ/V7Îö–J½ħ >½ÄCÒYQË4ŭƒż#ûǕIŭ½*o2ËÖµ½ÌYĴ8£~ôµ˙’ġċğAa™@-ˆž€˜Â²ÚŬQ”3.fĥżßü½ŝgÜü—cLbu„i·ÛÍß(]’^7Ùy7ޞ4ܟĆ*ĴQĊëxžwŜuŬÙ]§˙êċ•=żt·Nîƒ 4 ŒOQ† ´)f&ħŝûĊ턁"Ş}ϲTƒ‚½âl²ç–mN÷M×uÏúżA<ĒF…ŽdW’lw1¤5ÙŠ˜ '‚ dGRÊûŝĞTâÜô¨nVˆŝ›]ÙÌÊ£LUdœQg¸lhjA݉ Î<ñ}çO-ı:}u%ŽÏGQ´Çq'MÓÔfĠ™u°˘êeĴġŭ2§0Œ; FŜììl½ÑhlĠj;=Ï;èûŝûµßüÄĉÛîÛúìbŠçW220ŠPw/úŒzĴ¨ü|²áú Œŝ聆KEĥXl* Túú^h* gŞu#g$fJƒİĞ]wCYfC€3­1K4 [é]î1{²ìĤ"ċYUL•`dŻëĊ ħ!ö…Q ĥvfgpxÄĦ”†J5ÚË)–c £ À9Z‹iǵċ};ĉ?PûŒûŬ˙$í~‡öí€Ò;hr ! &Ħ£¤;£µV–%µ=Ï[r]÷|£uâġ­ñ+Î}[˜é§-Ĵrڍpb* pNà0ŒUj„ /Ĥg:…vĞ•ïĠp†ïßıÓyc‡”yé¸[ññ¸Ù'ô I79“$Ʌ8އ{Ž64ßè01LrÓ­Œvù¨ÖhŜôİ_˙­O4ß:˙£Ż-§€t^Ĝş}0œÁcT$Ş3֓Œh„ıdUÏPY*ŞFĠèpÎÑ0³Q3Â*†EC†‡!v\òĥq²’éFXÇWPĊÜPŜFšz††Ò̐ŬÙ+·•`TZʉÙp}Ö#fAÊXvÄí‰?+G ô’ Ĝ€ŒÈ PıÁR'ÇR'GšĝœĦîmb0ı#Žn'/”†ĉ [ĉ?w?í÷ßó.í"˘2°”.Qe69ĴâĥCöšÒÄ“$‰íÄŬ×uÏn;óµç/ú‡eŬLχŽÓâ̋³Ò-³ş ô&({âVÒXĈİgn(ϰ(Ó`Aq@Í^ç]\|ùĈ™üžç °n#ÊT–efŒúqĊ³¤+Íe7iĜ[ݰîy^iġž—RnÛ÷Ç÷§Š°R²#˘bo31ƒĝŒYmŭe0²gZ`œŒ@ZԓĦħ|vÒĝX’$ç£(ZŽ˘¨›$IĠÈ0 –ĈHu—½n4ĈÄ0ŒĜ80š™™İ5M%5çĉoŭÜ?ùß>ì=Ôxt!Ĉħ•ĵ0(BÈB[3’Vv(Áhà£>UA“‚.ĊôS6$; }Û7 Yĵ1XOŞšL´,à˜UÀDC’"*S_1`xŬ‡â„XtN=0˘p*3V™)j9ÌÊxĤ˙^Z(ĈĴß:ìz6ql:aèM)-AJ½^ċ}³½IÔ³–w…•BšhCp9ܲT2íœ@ıCWgJóûçšüŸŞ}û·`ħwÜcˆˆXšĤ“˜Ò¤Ñèït=i¸avœtWeIYE‘çyKžçw£Ċ;ğO?ĉŜş£<%m&ö¨•ż=×ĊÄiúÉܞ@pV–ŠrÀ“ÌÛż“s|Ğ”r“ïû ï·¤”i–e|hOĠtE²$ç ĦqÀ´ ”„BJéĝş;#Üĵéú£‡fnžŒŒŬ‰TÙwTÙqaúĦšƒM°4 ħAퟙSLp¤§áôSëŭ&{!.Œ –•È׊2¤:\şÑGŬ80ĞaşF#l4óU0úì?û|ÚÙħżŝÈıgcc [Ş p<¸èGġ˘!÷Ş3è|3TŒ˜§Ê{V Eíחh ııdZf(Ħj÷&ŬOwHf&@ĞÍ #J•šVĠhPµ}cpLEßĉm‚ fI=Û7UêGŭ~$ë°Ğ8µ¸½)Y~yrVšíE"Jtb…NĴ‹ÏPċ œY0â §ĉ­Ägì’#M…óÌĉmĝÁ‰Íßŝ7Xz&Ùc¸Ón·'1Qͳ¸Ì&‡a°fd£ìàĞ`{“,KjA°èyŜùıSß|ŝôÑ;·¤­Ĝ“eĦQ/#=jSä0^:YÏċÈ9ƒQŭŽpCşxòR£[żŜ2ŻÜä'Nş{.‚eÏó"şj&ÔáGZÀlé­ŜĴ´zAPs]wÎqœ­?ú™#™&œMlž™áv2…„QnvŠzÍqѕMËÈhĵúŬGP_YX0Yz*ÍĠš*Vä~Ħ ƒ1}·éġ÷ 4Ė/`EpìéŝÎW¤:˜![ĝè‰Ġ}Hf„Û…ĈExɀ½áĤÏğĜHVĊÀ˜3eQ Gĥy"ËnJı­Ĵ*QQSêħ* ‰T$ĵŝ{ÓM5ÚħBšéžĵ7ÔĊcb0$` Í ”(@rdŽÀâb‚fsS-ğëW>ëñĞ 1˘ IDDZkRJQyC 4*Ŝçr:ïĈĠOFIwlPö>Ó6V(K’$ŠĜÚ'w­üÜâ–]Ĵ°żÚLi U ܔĴ•zÌX0UžÂ1ûx²„Ûqş½ûçÌÓRÊ9ß÷/AŠ˘(³µìêg|ԈЁ×JíÉn\#ìÀYĵ <ϛqg>œß´{Ó­wÍŻhcC İjHé¨VÏFJ0ıĦ°~ó£-Ír^È(ٙ·°ü“ú0òg£4=Ÿ$ÉĊ8Ž;qÇÖĉ½‘†uYĵßfŬh’£n$;*FĜl6çlÓëß÷oĝĜß˙gŸhî?2óÈÙgş ĈĈ2ıœ!`ER·d€È2#ÖOżÔ[Ş2ê'ê5½šáše>ú^‘ûzy5f”áÁÊĝ²Ŝ`mİŞÂġZ†ğ²ŸTZg˘EŭšqŝÓ7+Pß À†a{[)ġòíʐ֞½€aċĤ†žLÇP4X2›[gÈ k´˙˙ìŭ÷%Yš%ˆ+L½÷ÜŬCG¤ÖĞğTë™íéšápGĦ‹Ċp8!¸A€ àŸC‚ż7ËáȞiU-§TVUVUêÈ .Ÿ0qĊÇ욽köì p÷ÌòWÊ÷pevížûï|çLtíÓXÑwµŻ%Ì`Ĵ¤Ž$HpĜÀQŞVclȔÁsĊÈb$zŭë÷úżŭû×ü˙21‘!"c­%k-Œ1Çy ”€Ù™ œP#~^?iž¸ĦĞRâĴÖZge™tÇñ^Ǐ6îŭù;ñë_żš '•ûRÛ ³cû1ÖÂZ^"ŸZœqĈÀƒ![^tÁË!f[÷Âç7•ŝċ A nğ*İW ÊbV9Ĝ’Îm'Ÿ1-‹7hÏQġƒ ¸Áċ~ïğ_4\ò[C@›Ĥ ŠQ &Ġ*3d똉SnĠé°—À Òx÷{Œ­Éŝĥ)òğ^u4ÖZ·Ğ£U¨::ŞnU0bXċM·Ŝ[[[Ğ^Šĝ­ßûßŭ˙Ğ‹_ŝġ‹ù(ĊŬqQVĤÜ0cVJğОsJ!ß}ğĥTqÀÌ:)§„Ğúż`ن=mS|B-á§µW‰Œ7cfíĴHĦ-·m°²vîŬ˘9zÜë™q”ónÌ#ôX‹›ş-xëŻĤĤ°œÜÏÉĞêÇ)µ@UezCÊ`4ÑH SS‚Ü>T3MÌşûçÀϟË.á4 ħd°‡a@–P^ÒwÙah[{uëá—ŝ‡ï^ûé˙ğ "]žÉZkSŜU ä+ÁşŞ¤cQŜ‘ş³sö%ë÷•*xšĤ“$Iö³,{÷~ĝàVôkÏQ0€”r>OÔ FĠ{Œu‡9BBŠqoXÒV¸)+Ûŝ ö0ğŝĊ›ò½0 7â8~œ$É0˲‰şŞ#vVĊ §H-şnägnvÁĤ”òÊÍïüîµÜ”'u뎳ĠŽ_İëĵ ۘ;êꕄŠ_aY"ŒoŒá{?ׯAż3Éóí,Ëv³,eY–{½#ğe·höݨşu]Ŝ £Ôġġġʛîšs`xëÛĝÏ˙àĈoüŬĞ?Ú+ñH•Òê˘ĴH×x%`(%ŞÜ W`n¨xJû• ĠôuġŬÔt`¨½­×ĴŬ5hµ>§NXÔôĴOé5İ;/İŝœöPڂ4Wòz‘ĈŞŒfÂı—Ë-m%D Úˆy U˜˜›ħ3l*íUUSYMRħ†ÖÖŬtV‘uó ŒÈÁ%gÎùĦÁ–Á †8àċġg„‚H˜²‰*rWveû­ñßżô‹˙Ùvú"k­MÓZkB÷\ħ+ïV îĉE³/8¤i:Šx/Š˘G[÷ŝäGo}êĜšyÙŞÖ<0*e\^’;TŸĥ+'ŭËı%R˘Á:ħ›W^\‚`3 µ8ޤ”™“€w=˙8ĞUÒYTÙuJ½0Q%aApñêW~ŭġĝʵ䣑ݙyߝ™W›!s4“kœ4hj”¨b·˙WĜL÷wL‘ßËó|'MӃ4M'^uô$4Ž“Ş[AQ×Ù3rTh°ĥĥ­ŻŻŻƒËI’ĵEÑ_ŭû˙èïĵŝŬöÂÏö ĵwX€ Áäċƒ•°)Ü>qŻġ„$´ÛҔZĞ˘?ˆÖxqò^żÈxòì šŭ&ÔnŬĤċèm­LíŠöϏú³ m÷|+Ħı`4½Ìğ–X£rbî÷ĞUn`™›Şh>GıyŜv%`”`d™shp'(îÔrTp\”•,›Ò|äĉ”˜£İŠcħ0ı^Ĥt^uIŞ­\p@ƒ•‘LDʂ  HŽtĴÊٚ+ßı)òѳñáÒqkk­ĥÖ×tÇp8´ÔŬ˘ĴÜòĵ#̷ә'pàíçÛZk”RıĞ’â8Ŝ‰òôÁñ} ż~!+Cü–€Qµ~Ş*ITl^5[Š&g9Ĵ2Pŭç˘Ŭѵ7×äí[aÇqœÄq<ÎóĵÊJ²+~%iUgŜ$î|ëúA\B\şù[çec {ÊÀÔ )Ş (Y½ĦT§pMŬÍèİÇĞcXIĵCï<Äá?·Ż2ónVò<ßqĠQĥ¤wDX=ùġ¸¨şy"> ˘( á`0X “$y.Š˘×{ğ_ûg˙âw üì0‡)ĴĞŒ€ˆ1cPöŒŞq>ĉġmĤ²%jV#4’şşħSċ["~¨ŞXŒïŜPSvM‘B= k=€j*: ĥ]^ÛuŒ4[ócÍÑ̉ƒ5œ!È_%¨ÔñĉT‹,›ö£˜'ÏÇhAk1+ ' d+‘C5‡ç†^Ġ´*ħ \AäŞ$ߒˆµ˘2Ĥ=-Á¤BQ“Ñ#òšq†0š(Ĵ‡/÷Ħ&ż·öé_D¤‰Hc Ù˘(Ĵ'§ÖĈ?ŻôÄêŠùI]u‰\•dò<ÏÓ4%I²WĊ£µ;úËŝ—żsm´3Q "°^c²ğÚ.ĠvċŭçÄjŞ–36uŸg²Œ3(e!֞á6Ľ‹A\ˆ˘¨Eс‚cf‡c—ÒvÏ °ÎŠì›-R€I)e†q†)ċfĵĥ~mëK_ß8PSƒħĥŜ,*ú‚Ü‘˘šk1ĥsÎ^ùŞÏ wŜŝ>‡;û”wò<ßͲì0˲ÔUGĞ™dœz‚}£ı1Οn0 ĥ’$ıEÑ+Ïù×ŭ­ŝŻüqFìÇ ¤Ë ĤrЈCXġŒĵ[×Öì6ò‰ĵĠŞd]ìxížaŭı!Wyb”ˆ0Gö]™&½ú½$żšjĈ[4gŽŞjcv†ûŸ“KÍŞËWR}ÊކĵƒġúIÓĠתşÍܒW%•UĦ,F…ñ¤NlPnlĨf ¸ĥŠR­HˆħÚ% Ĵœ*ݸŻlÑw‚!4€ 8Œ%¤šÀœ÷,a¸Ÿa­'Ù£—˙×_`Ùá¸˙'ċĈ˜Âc´ÖÖc½~R{)-£c˘îV8Ì òJİ"˲I–e‡e•4şwmü³ŬĊk—kĈ×Önşs¨_‡ċîÀAœê^8g&şG…“@ °<żIôŜu)‹OÂ0\sN6İGÛá³ n8 ”Ŭ˘“ !xÇ2I’8‚ġ .ŜĝÎ'ïŒËRƒfî` ĈZw, ÚĠ›:i•Ĥ¤;Eƒ=|ŒGżü =ÏôJİGyžï:‹ ´5wÔĤĉÚ˙Ċ!óu\Œ’$ z½^²ĥĥvĦ×ë]‹˘èk7ö;˙ê˙üíûßßЍ)Ğ#]F> \Ï Zh…ÛĦIŻMi7ޝüž‘Ħ–*óŝQÉÁ˙·pĠ–iˆ*¨1‹Z¸2½ú5OÙQ§Ü¤…NKÄ ĥñ½§•“i”ŻäUĴCá§Ó–Fİlşqi‹á¸Àd˘k•^U 1׋`ĥ#^ġŒœ‡ğ \£07³Äk›!€Y۔…ÓÔŜF€ Gh# F…İyU6’ĊşŒÙ­—˙ÙŻ}aòh7´÷²$Ir­µÒZk9‘<9ĥ]¤’;êK]´]ğ—d²,ĞŞ¤}Ôµ{ß{?zŭë—ÒŬâͅ@óÎ6c+s\Ö°—bŽ {â Ù¸z×ùCuíÍËbü^ë½ ! Gà÷LÁIž2tmœh5Ú›(ç\DQ†aĜ‚`]ħu훿u#3…q›•ĥ :ßOàĴ@Èt€Q›È}W&Êo÷ŝ/ Ŭ‰<ŭdT ³,›8‹ E.ŜmPZV!U·àĞ?ğèñdmmíB’$W˘(z!éġŜü½˙˙ôğE´|˙Q Œsż°ô8CÄ$›ÊQY—7¨uJÑUCMùvĠ?ò…Ĥ#Û¨#jFLTtµÁÑj ϔ:Ĵ—ıjş…=£`;§OY"ó‡³+š‘M R0CġK%57Nµ“iÛiŠĜ´ށİ:îh:îŞ%î¤yS:oJÛY^Î4Ñ݉Ç.4P¸¤ÓPr耠rëŞA¤£ŭ~$?xéżûí·ŜŭìÇDݵ6s‰ĴĈZk½~uœàö“މş[&p 9ŭ$c­ċÎ |’çùaQ;áŝíĞùÇ_ü„_Ú @Z£–=ΣZè ÓiëäßT7Ç 3Ä8d˙ ĥ÷/]ğ.?Ù ‚`= ~ÇAHcŒÁâYvœ×öi^üŒusmƒâ8•şNJıÙżtċf˙×ׇş´Ü°†fuÜ#úĞÍÍÀ£züÓğXäċÈÊÇĝôGƒ‹ĥĝ´(Ší˘(öó<ıx ½€–³ *$œU‡9"żo$8ƒÁ ßïoĊqü|†ŻŭĈżĝ?ü~˙ĉËkó8AŞĦ [ d%ïĉeÊĵ“2< ÍV=;KpLŸ‹ù ú͘r°úÚÖ͆Uô”qï743ġ½ô*&7ánlċŜîQ‚ÖññÖ£ġ* t•B­Ä£R•ÎVêĤéhQ3Pzô¤ıAž V}ÒÂ`ûq†ۓ²Oä€5j§=·œ‰ íôkX˘R•Jn Âĥż­/ÁĜêŭθÖz•Ş%o‘ħ²§Ä"ÉË* U•d >¸9¸ġüûûAĵÇñs½^ïÒ`0ôz½0Š"9GxĉĴïEÏJ „ùġJ;̏–ˆ—ĴÖZçyžeY6Êó|_)ġxŭÑ_}"{}0h°@zên0Ş—ġâR6TĠŒ†0#yu‹ÁsBˆÍ0 ע(Šƒ èJÛĈċŬŻĴ¨aÙi3„ċĞ'\—Rn^ûÖożJ\°ğE9÷e­/‘ç‰ĉƒÑlâš×4bSğŽŭO?„ı;ëĞì˘ĜÉó|?˲Ižç…WVK=Öä×' êJ%<—RÊ~żĴ­­ġƒÁf’$7˘(zéÍßŭ{żùÜ·˙îµïċx˜–yîĠE– î*£Ê€“Ġj:FÍ~\sRÓy. ŝ@Ğ!jYıŝš³@Ĉ˜ôhšô:dzxŒDŸ‰0(Z3jEÔİÜ$‹y ¨h§½ê™ïÍÈ˘(,FynZ™J#jEi3YÖşo[Qqĥê/YË2­–ÈÏr^^Êú ŝ,X“Ò¤İûƒ ĈrDÒ@Ğ_ٜÏ-ÙÖ×/?ú;[ŝvÇñÄ“i­µ)_¤§S³´€QYÀ÷¤Ż.µĉ<ÇĥĞJÊóĵpûÄaQ;k;żĝèÊġÇŻß°ÈÒSĞe˙AÖ9sX²ÓÓ$c³ÌŽ“á…ú×Ĝöá×˃w‚ X‹˘(‰8šL&ʉ½=óêèYUHlÁ‰§QqÎyEAHBˆ‹Wŝ­ĞİsÈ­rÍ@~Ż€yôPÓ~Ĉ ™Z4 à‚Á;?ù6ĠdÛġŽö+e'd %ôÜiTGĞRuÜĞ8ƒ^Ż×ë÷û’$ıÁ‹[7ž˙ò×ŝ_~ñӉĈğ‡ ĈXheaP$bÇŬàëÔR‡ê~İNàÖ-¸÷i[µ–KU5ı˜y'X0ÖÖ'uí‰Ĵ­>Ÿj‰¸ßs²NMW•§˜³h–3Ö#˙è`¨ıëP7µ#Óg\[ŭ/ğŒŞ­Úĥ0ĵTäwRì<ž ÏôTIŠf>UULUŭyïkPĊíÜ0üûfĴW…;ŭ÷ħêÏÖĜióƒĴÜÄ%·$G$+Ğ“r½XekN „`¸sġï½Ö5Š˘â86 *ır kwŜ&Z?§\%uŝÙZk²ò5,Šb_)µ³uö£`°p0.ÊġĈù\0š²;fĉ7š‹ĠĦ̔k!H.c‡.]âœoI)×0ì‡aA Ñ=żèp‹gQ=ñSĦUÀiĈğ.Š˘8 ”òB˙ҕkŭ—_ uɉk[İŻ¨ĦšCëàk1Ŭ8:7ĉñùᆷ>°›ĥĝ Ïó½˘(ò<EQ,„=ñêèTŬLß(Š"Ùï÷µµµAŻ×ğEÑÍ0 _ŭ˙ŭ˙é·Ĉ2?ÚÍAĈBç֔à!,V4kVC°N^íPM³U`ä¤ÙĤ˘ ¨0Ŭ(Ğ͸oì4Í×Ô§Ċ ĝŜ3u߉ĤtUġĵZO0a½FßİÁRËZ½ÍÚQ €f{Fíìt€QcŬyŒ•Q(ƒÇìl§(2Óç+]/šRwżWVĥ!_B_ÎyيâóßïÓtŝÁ‚ĤÔ]u°ĤMú•\éĊǃd àˆrüĥt·„ñ(Cć7ŝá·eżÇñÍ$I.ğуH”9èmŞ™u‡ùzÉEoŝ3_ħ%։4Tžç“ ˘ß³K¤0ÜRIÛɵ›Bˆ0 ûQĊRJ>ˆÎm÷Ĵ{H éş(ФARʍkßúíWµğŸiw·|:–·Ž3ÓpĥM‡Ĥ2˜,GŜŝòô†ğ‡6Ï(vó<÷£É ½žxu4çAdË*$çàôûŭ^’$›q__˙ïŝċï%ÏżşöÇ9ÒÜı^TRlK9TñÊĥ}Â÷~aDUżĦ ?¤Ġ½ ïßKµèD;ħ Ċ)ĝ}–ş2˘if‘_ÔqhÊi^Ϩġ1˘VġÓ Ó¨ÑOj|Ĝú=µĤ‰ĞŸĞŜžg""(mħ·—áñ£ òÜ4 `½Ê¨†'ÛôJ•ĜêWݲ´Ó,İiŻÈİŝM@@ÈlWLĵ.6'wIËTïİ0°Ê"ĉ µW·ŻüÎß ‚à8ŽŻ÷ûŭ­~żß aĞJbóDOÇqšŸóJ˘V/Iišĉy>*ŠbŸòÑ£ôŭ}pL haC ŒàATÏA]%Q£ÙT^Wm Œë_]|YJyAJ9ˆ˘(‰˘(Btċžħ“¸žŸ@šÇcŜ&ÇqA"„XBl^üê7Öéô+ZÂ+iğÚCĤèÙÑO²–ĤËE†Gïŝ›ĥ¸Ğ”Ú)Šâ)gü4ĜEéŻËŞ£'Ħ#ÎÍPuŭ~?é÷ûëI’\ ı+ŻĵŝĠWŝÎ?|ŝƒ…™)ĠIÚVFWSŭĠ·Ÿ#ï´ŬRÓYSU'žhĦj–{•‘­é·ĤŭOŬs2S@Ğ>ß·#²­2Ċĥ’^Û=#ż2˘%Šı)şöz]ïD;§.&ĜDĞ˙iM8ĜÏñx{‚l˘f6)ÛĜ|f{Wd› Oa“ñî‡O½9ÊÍĜĉÇŞ tZ)•`dêŻá 4W´/evêKÁ˜SŜU?ğîŒĦ( ˜µxté·nL/~=‚’$ıê¨ä8Ž C܀%ôŬqQwG­’Úƒ²:Ïó"Ïó‰Rê@)µÛ{ĝƒÛëë0w˙aL§¸Ħ2kİC™Ùĉ~+šZ[Èŝel›ËmA†aÈ9+ žiĊ$O ˆŽŞcQÉ0 £ úRÊġh°vı˙ÂЃÇĤĴ…Œ1­ôN'?ö×íĦWjË\îwö– ÈŬAq÷5Pé‡Cö\uTI½çİmĵv1TG+ğyW3Gŭ~żŸ$É(ŠnAò7ŝĊ˙ĝÍ}ö³˘Œ£ÖċT X„ĵ4ÓäSÊğ™ÔŞ6ŭ™"[ NlSÎmЉgTGC4* 3c’ZŠħó×vFuôĤCGe„Ö ì"†öç-˘éf{ÍÊÈÂh¨V dç'0uݍċj­3ßİċÔ]~½*Ü[ĠĵÊ[ë%ÇV¸ĠÜ(sŸÇÜ7­â-ê@˙lĜ0@ °Š•ŭÂİÒ¨üœÉ¨@ÒĜG[żŭġݤw? ÙO’ä`0dEQh”q.Ü#Aì1I4âğr—“µÖ: xšçùP)µ7ĜùĊÇë/ŽŜ:`&bR–4Ĥíğj½Ë•ÉÀĠMfŜ/êÏ7¸Ĉ¨°„żĜ7,ı*eħîhğ0Ħ”jğ`Ĵb'tއgEÙ­’}$<@Ú¸òkßy"à÷scLsuĜĉ3X5ż MEŜ ÚΣAÀŬMw§•Ûo˙ëÙh×UGyž³,Ë[ ó“_çızÓ) T]Uġz½8ŽŻ„aĝüWŝÑ˙Û½ë/ôĵ›h*… ĈÂèò´²Rê]> ĴI=QË3ÎëWèŠş3U݈½0Şi:ŻñÀÈz™DeµĠĝöÁ¨˘° Í£é"˜ĉ3­F‹ŬÍê§ FŬ8<,ĝÑd%0òxûï…zÔûY“³dŬFWozÌs­Ĝ÷ ĵ~yğ2vĉn4oR+ZÚP%Z1ÌÎÌ7@Q[ìîdĜÛÍ U‡Ħĉ1€Z˘žz“˘&gĜh[ݧÚ¤…Gż‘'żŸöŭĴGÓĠŸëYùtétL½<Üp”•wcµn6‰,ŠB#éġéÚ7ŜaòbEW8Ŝ(‹û¤ê%ŒNKq7w_¨hğ˘(2ÔÈs>üá­ġµ°9˜”M£Ô0jÓĈuġ‰–ş¸š"gF+ÁeĜÁ Îùş˘A†a€ċòy8 û÷>Ex°]Ñu‡JİħRʗzӂžÑĵXòÓ <;A)‘$IÜëġÖ˘(ş†áW~ïüzpñZò“½˘ÜT̔‚ĞŞÁڋ‚šMròz äĴmV=íŜM+#òTɁQ£"ŞöêŞjjlàU%E3=.:ϗIÏôŒ|Ħù³K˜k”J-C£RÂ]äĤXŽŒàƒ€95‡qÑ< L%ëԘU"j%Z²Ŝ“çâ@h:7ĝ•¤ßĜä \0°™äĦ²:˘\AM4ôĊ7˘‡ƒ·ÁÍ0 Ż$IrÁyYGhʟä†:ïÙ7cŒÑEQdEQL”RŜ°f·'Ìù<1Ŝ°­í£fŜĴ¨f,‡L9gÁ£‹Ĝ3ƒ Bˆu)eßĊ÷ĝóHlA€gU1•]£rŞúGRʞ˘„ÑFïĉK½‘"Ïž5äDċCĊ:£Éŭ)÷ĉR%X-„ߚɵÖûJİaQ“˘(rgŬ~T1,‹s²ĠÑL見–ˆx3‚ĞQŻ˙ÂĞO^yœ[ìdĤlLğycÊ1óÄ >0µÓ%[ğ,ÔÎ ~SUF@Cek‡n?ġĠsŜŞ&xöèowQ½,ìüahOѽñ/w힕C•}˘ÇÛcŒ|ÁÂ)ĵ0B›Ĵ!ٛ×kT›žPӊ9£ZĈßRŬĠŽîžX˘aŻäİ8d!ÔĊÏ Ò­ bpܽµ(è½Eѕ(Š6ƒA?Š"ÑŞ’ĝ’ ġ¸Ş¤EÎâcŒUJU}¤Ħ1ĉ Ŝ?°HÒN SùQwCİ>+°ïêlq8ġE Ĉ|£G<Ĝ✯I)“(ŠB)|B gŸu@bK€¨s3uŭ£HJ™H)×6ż•çyÉ]mœÑ§âµÍĦ/€ĉ€Q³Êu-2 ïŜÂş)îh­µÖcwŞÑNî½Júë˘E{ĠÑ<ʎA ŬpáZ†0ĵŝÚw˙ñ7¨·üd?‡5eätċQVŭÔĠßĴĤe¨Ñ7(E ĥ– ×ÑhÚüXjQ}`4uyp`gĤ2äĉ ëü+kv`°h³Íjj‘´ğ)+Ÿ;gä½)eħğ›á`?ƒÑ :Ô' F­^÷Th@4XġuħÔ¤#ŭ¤^ëyĉyódäğ€{Î Ô˘tÛÒ°JuרŒ”Thd™†]QŜë½ñM)ċ(Š.ĊqĵVÉÀWè#w•DK*¤Eŭ$r´vô˙Xk½=üá'zÌ@ 7IsÁhz‹ia^ÉZ¨Bƒ‚Mç…)eâ„bb…}ĝsMÙͨÎQJ8şÇ9Ĵżñ…ë…R=uU ;Uê´QÀ˘íyI-Zcê UI™‹Ŭ°ğUT¤÷´Ö‡EQL<Ğ y<1- ìè„Żá\ŞÎUG²l%a^‰zŭž˙ï>÷05eeĜ^ËB ‘€ı,f:k‘P‹ lżêġ4òŒjÔöÀ+Ġ!dµÇ\µyږ$›f*múÍ,¨ŒjŠ­‹ßk˙ħ/ÑĜ;ސJ5xxP`÷qZn‹Ž"§F³£˙PcÜîĦıĤ×ŜNçĈh֑½ b4h•ÚM˜“>ïĊ‘6g°ˆıÀƒÁŻÙ°˙RW£(ÚH’¤†Ħô|َT% ¸ Ä µ•ë%M´ÖC6ĵ÷à?ÌH ”c9M{ƒċżeóĝâJÜBÖż‚};¸ĉ”Ê=)e%£gsZ'Ïĵt*ğEŝuA„ÖÖ_|c­¨ĵ·l0FUÈšôvĉÁ=Ñ|Ĝ¨<•q†ƒ{·ħóĦÖşêJİ£ëŽ,ï>f1²êÈwHQUĠÑVW_ûû˙ô×öƒŸïç°Ú”ĴĈ6DĠÀµZġ—–ÁTĤ çğmû&§xĦVkı9%joÌ^ψÚîÙ=Aj}ŭş2jo sžò†(ĤŭMlÓΧĝŞŻĤ;Ûİl3Fä÷gZ´O= ìÛİ„| 2vJÇÍ| jşpT*>jDjŭĠjğĉÓHkİ6^‘÷’׿.ĵ†áĊ$IÖ\j´|’*é”e;ߌ1ĥ(Š\)5QJ 1É裸×+Óx9÷Òn0ÂôÌĊIÂÔR%×`ÑEê¸Ï9pÎ{$;|íVŬŻ?·=¤Î •sā”2Bô„ëñ͗úc}Qc4˘Ş[ (jUF5•À˜“şZ0ìŜú=Sìc´Ö#­uŞ”: ]w’U–ˆA‹+I’ÀÙĝŻApE†ás׿óßÜ|˜ZŒr ­-ŒĥS•²TOWÏôm:w䟖wŬ­—ë */ğö|R}?|C Œú9}QDc{0vĦÍOCÚŬfŭç|“Öê”ĊŜNŠá~[ -Î(µ)<ü}°j¸TT4ĤJF/Q£Ï4 !﷞{„˙V2™ûĤ39şˆıÄŜë×öž rE½^/ñޤ£ô’NRà,™I²Ö­µQJeZë‰1ĉP~òxk#“dm $‡Y'5Q4ŒŞC+ÇX$#ŒpĦ./!úBˆĜíŻbÁÁö™ĝ)lžĞö˜”²š?Š…ŭġ—_żĈ£Xî(S>ĈN}Ì|ûŸF†ĤÊ"Ó¤~ü;ËD9lF“CLŜĦu•ŬÖZ”RižçùŠtŬRĠc3,ğŽ< CEQĜëġz:şòòïŭƒŻòŜZËaáTm¨c#ükÂçòÖÍòT˜ìĠURû:£¨A·ÍÎMÁÁ×ĦĤ£6Mç‹êVPÓù`Ô)íîR²´N2‹bÇĞ w2QĜÙN‘zQêY#x=£&}‡–Á6fġ|ĦÂTÍÚêyBë…6ĉ›È62k:ÇOĠ)Ó8m,˘¨‡½Woˆ ĵÁĊ(ŠÖ“$IZ}yyIÇ}â§# oJ)òÔ2cÌĜ“½$ż?fRœ—Êaî˙è4'£ËğqlÎúqd,Xï2lï*çĵ/Œ”a†rĊëġı 蛗Ż1·"ËW$„H8çƒŝs/]P.Œ¨ÙÔh÷İĞôR´ÀÈ˘evYġJÊAqì~r }1C­ġX)•=]÷ĴhNîġßDEAǽ0 7Â0ĵt×ó ÑĊkÉ{#]˜Â Q³´äĴ2”ñÌNk ·mŞİlóPàƒ‘Ħv*+ͤ˘úÉUƒÜÎ/RÓÙĈɑĉJğgÀ§ @szRÍ~#A{;)F‡Ċ´ÊúŒ‚QCܘӭ„ĥIú=ö,Z äî48Ñ3™u Ġz•œµÀ¨b6,•eaŒE1x1ڍŸû’”òR†I’ô’$ ½żUUb'µıT)9ÚNEQÑvhxkta³f­ó3'oךC=ÓĴÓŝì½6µ‡'‹61˘xsŜB$RÊyÒï3ÑG:­ÁX,#!—R )eÈ9O„ƒŝs/ö ca§ sC+§“šmĝİÙ%ù·µĦD)7ÑrcŬŭkĥxhŒc&nŞZ·˘&°Bu4ó÷3Ìuġvƒ°aEƒ0 7„WnüÖïż2,ÜܑÛ-*pŸn4%Që ¨c²×·iWO~ÏhŽ#@-ĥŜ“™ž\ Fä’a½c…·ù6]ğeßÍĵ=ôJÖbxc7ƒÖv0>£`4CßĠŸfBŻFċÛÈ\êPÒUÎíÔZĥĠ˙^Bĥ­˘q|­Ê ñ%<7_”R^ ‚`#Š˘AÇZìYˆĉ…o.²˘˘(”Ö:×Z1#ħ˙эž,ßÌÉż€Q÷˘j/†'dĵ†‘îU†$‚(_ĜLÄ gAÔ°9çÌÑuç< âd-ĜĵV>ZÔÉżĠœUXßĤÊ8uŬD)U(V· WK+ĊNDQ$8NÂ0\—Rn .]yníċ·.|2Ñ.€ĠK{a3s"߁ĦĠ%?͵ F K!Óô8ër`hSlĥƒV­È‚ ĥÑH¤Nù6ÚMá.zÏ]—"×Ĝ}ìèı.ÀĝŒƒÑì ÀN­·|ú-ċnWKž{€mE¨[4â9ß˙`l΄W`Ç ŒĊaïıµ<Üx1‚‹a%ċK˘;M§$n8rŸ1Ĉ¸ŭ%7ĈŒĝî÷{,Ĵvŭ#Z Œl.fMçù:”ŠĦı2z‘fÁ†ŠEaú†35ÄOp]DŬ͜ŝ”<‚@I)“µWŜĵŞ9g{ÊÎfÑ´{F´L*ì͏Ĝ҃s3ÜCœĉ¤ĠµvlŒÉ´ÖÊġVíÑ ÍêıuVHB†aEQ?‚ RÊK7ëï}Ħ Î>+mĦ”v‹ç÷÷4Éz3]Ó35]ŭêÈγŬiİéږ?ŝŭô³fÍ[3;>OÚŬħMĝ`TŠ2ìeƒÍ猈ĵšôġïCˤ•Z66ġá¤QٙC…_UU'IFĴ³ı?cOžcÄµ7…]•Ôsâ§U WO2ĉ+ì mùwĦµN1£òadvSF`u<kβt,*jüıcQ80"a À ÚÁ5Ç<ĊŽ…ZĠÇîTûJÏÒ:¨VŽ 8ç1çĵ×{áK†€Â$Îl*>½´pˆ²9?ÂsĊûï#ÑjbŒİĊ J)ċ™İÒÑÂħVI-:-Ħí¸'fq‡Qġ¤”BˆËW~í7Ž4  Ò\ğ#–£Ñz³­ Ï3;­£ÑˆĞj~ûĠZ†™ïiѕ/ߙg´(v|Ĉµ{žı“Ó,g{;ä~UôyŒÈ݌fŻ!f†“›Œä͚5s´!jİ$ŭ kfÓmH>Ë>i ÒQÛÁs—¸ .K)7\•µüíĉUJ3‡â'ĦíVxîċ%U}$kŒÑZëÜ“ZkÇb|²Kçà‚­DÓQÙ}Î:qŠ=Ò ˆ60²ñEH‘3sö•Ï%e·JcĴññ ¤”2BDœó¤wŭùġÒŸ•Ï´mdc6­s*£ĈÉ̳żcĵLlŜżƒXgĈ˜ş:ò‚ĝŽBϝ„şn‘˜ĦñĉäŜIëAl^úÂ×^•Wâ÷†`£e×ΐšYÖ›Â'ϟĴİ”k ĤĴ™‰݊ëQc–Èv.şŸĉĉ…µ³TÒ\ÛÛĤŞÔâ÷3d°†~ÀhĤŸäûŜf½˙ĵŞİnЧdm38³=sÖş@ Ŭ4<,•sINĉi´A1¸íWߐRn…a8pîĠ]†Óì‰ŻĞj²J)íö™Ì3âŸì­  ž÷íè‰Ò3êĜ1/ÏĴ,ĵ€ħ ûŒħ>ç<B^‚ì"VëÔ{LÏ˘BšGÙURÄëĊW'U ×4MPò6öÔ>͸Ĵ˘Žô*ğÂäÁ]ôuŝ31ĈdJİBk­qtYçIÑuK9^§ 8N‚ X—Rn]úÚw^Î5agĴêÖX3³°9•€0›wCMu ä[5“^ ޤWOšmğŞšĤ×àLAÚñ­s£AġíóIÙ+*r½àxñù£Ĉ:ç^ü~’™½ê§}ß§=#ÏĴĠ§l1aškfK­wıJIç bpğìÂóBˆ-)ċ…(ŠzQEsÜĞ—ÍĜ'mw¤½˘ê#ı iÂö>zÔï…ċƒg6ğĠ|Í[ʵ 5X|c&œóÄR( „ Ÿ{/ğe›*BH!D5Û .]‹Ç9ÎXǐ£ñ6°ŽX™Ĝr—zjMIê}Ĝá‰uíèşÌ›?:ËêĤë–^NJ ‚ /ĵÁÖĈ[_ÛÜQvzÜŜĥPò·ĈÙÓlGWĥ-jŞħ|ÉŻu_È:j¨ĤĉÜW´-uä MWŬ3c;˘Ĉ;6³UÀÈİ w3 ò2ĥäWŒîŬQGßµŝÚ³€UĠäWż>­GÔ°!Bë{u‚Qċjm,È9p„2Ĉž¸şÁEpQJı†aßÑÔž@ܔ´Ŭ˘ğğÔFHk]h­ cLŠáŭR ²€pÂA.žĴ2êôż³à–0Ħ^Ĉ{œóÈí³rEŝÜĊO°% ²Ê2H !BĈXml­³¸'w‹JŞ\mPvĉ@l[町ÁÚñL2˜`#d{;HtžcĈÖÚÔ“cŒ'÷~’ŝÑIÓuíżó0 E†ħ”r ĵpᕷ^ ›áGE9ÄŞó˙›­ŒĴŜmĤĞ­ĴĞ1Ŝĥg•léşNTŞëĵ}ĈGz e—ıvӂĜñ'#÷;d™ÂŜvĉrŠèŒZÄD]żgÔĠO²ÔxŸ_qÙ›yëÔ}KëO(4´ħ0ɕà0ĵĝ²âB·î—ù²U7Œ‚’µÖj­µ1&³ÖĤÖÚQœŬ‡qìLS °z9Ù9mĤúi`•*Ÿ+cA,b)’-ŻB’-–ìӟI@Zċ™9ħH)ıB8ôŽzÏżtÑ0Ñv:ÜŽ€ĊìIĉİM´(óĈ;Ûè‘Î*şNk­s3Z÷Ϗ†˜ħ :0Şz“T•ŝs™Yê8£ĉl“Ĥk;†^ß}v(ıĥ$Z Fĥé,A ¤-¨}~áç|S1‚ E‘ïm‡%ôÔUÓqô‘ÊÉĈ˜ÜZ›ħáƒŝZVe#µ<íĉÒt„…fĴġš4Lô1ħáĈXÌ98çAGi3s*•ÒIÍ!-[3y!„t‚†$ştm@n˘ßmş÷$šµƒi=,U1@p†|÷1bSìVt›?2π’ëâ³WŠë‚@„aAH)ÉÖËáċëñ½ÔÔ§Xâl9Y/šM_2C-şĊ£ê µ×ˆ°-µ›íˆ†è’v? QC A°š°ż—c4,@ç`t„ÊÈwÂŭŭÀR};[햞xä…˙‘çG3ŭÌYùdó‡İ˘F[är3ÊE˙šb=‚^†Ħ§;mw}¤U(}2Nûm­-ûH£‡{½XşkSG=QϨñw6½,Ŝ@f‚„1ĉ‹ŽnĴúı™Cšû‹!¸"àœŒħ(şx%Ş-î-Á_7íS—íHËl›ŻÖ7³2nœL &cŠuf cŒî4àö–ZU€äœ|/\üÊ·_Öĥ“)€ĜtÀ³E™ĝ.èJĜú4L3UhӀ”aµÀÁšĤ g ;k´`´h ĥÈ vw3(e–nüç`ÔY4ż}GÒWL6ԑD-jĜŸ¤ĈŭZŒê? c,Äà*vÄ֋Bˆ5!D?‚°CÂ|Ëö…ı•“1ĈşŭĤ°ÖfĜ˙d'Œ˜ J@˘ıœ]Ç:™sPó²ċO01"v‡ŝАžY5ô,‰­²ħJ)…£ëB!D$×7£Ô”'VgĴLOóÚˆĉ‚V˙ĈztƒMä#Rc ­uğmŝèiéşyà=·äf·b)eOħ6x鵋“ÂBëòtÊQÎÚĝ!k~™âOۗ{Ġĵż ^{Ġy`d=6, [ĵ-ıbG£™Ħ×NŽ 88Èë^Ċ9=uŝ˜–fD Ô ˙k<™~żäWĈv5Ÿòòż…ë_Ç![œóu!DÏÑvÁ³U7u×ñœ/šGšĦĝ°A9@Ê­.Ĉ2Û/J™ğ)­ĵÜ!œµ2jßKV†˙ħ¨ÜŠQvĦ"pÊfâAĝsH‹*¤ZòÍ9: 9ç‘\ż Çڕŭ•M=µhƒeI Œ(bèá£RkmîÊfµ@a·¨,?ižGßq”ŝuA‰ĞÖ{/½ı6Rċ„{•Ì:ŭAmc>dĉë{Ó9~mzH^Ӛûa5ôZß#ÂL ˜}0šz]ò0mħ·“!­ÜÎÁèÉ+#˙Ż5àĜÙûŭžÔ5P‹–;ƒŸ4ÜpÒ]0OƒÒ­ĦúÄ(p@ëkúÎ,4äœ/ÊFb8oğETŭ>çĜ`Œ1ÊZ›Qʋ½,‰B@Oaú`T}È(Àôĉ”`²àŭK#ıPeü8çgŸ‚şlvħĦ´3Ĉ("*ˆ(Çäñ0 Ĝ”m`O FŜ:5n34=†÷Ŭá_şŜŭ*AŞ8ŽŜÛ*/yB*àäKço(SP‡” 8ç½*t. C)„àĈ˜e)¨>GF"jUW]Ħs•şÖZxRN“0ä`Œ—}óŬ€QYN”E‚B=ĈXäT͕ô8šÂŽTÛBžċŭàœW˘Á ƒ‹½ŠŽħ4˙ĤŽMŒ¨ûœ3&0 pX˜ÉĦQ‡İµÊZĞŒ1†ˆì’2ü4‚‘(G­ĞŝQ"„ÈÍkñNjÊ>J%ힷRG!sĠe™Û½ŝğÀh\Û§£ŽsĤµ‡‡9´²ç`tZ•Qûk3€Ġ.ĊŜNì}_ÖĤi”ŸíŒYFġƒ@€ĥ ǘâŒ÷…•jLrÎ+@Âè‡,tlp’ħÖj"R=<”RYc Áe§˜bFž2…ˆ•  ‡<L2Ĉ¤Ûsϔôû´dßsû"BÁ“Œħ@ Ö6BcË~À@ĈÌöŠĉ¨éĉ‡ˆ—ğ-2 Ï­45e§Ŭ›]D§2 ğ„êlô¤”ÒM\Çñ֕M "ı­4ÀШıYÏıx~Ïıá8o3ŞÀ¨‘1 ^OF3cŭ͏ċıĈŜnzFÏŒ|ë­Ĉzñ?f#D|û)À6UwG#–À( È›ŝċ*dzÂy–)¨Ëúύ?WóHÖZEÖdŒbz+½=!ĠÇ82BaDÈ ]İíĝ½lßŝLÒJżcŒsÎ9cĴœEê „FIyZkgĵÍašŬCŝ²Ż2ĜÉĦVÊġŽTċuèÒiġŠ -pΙ›#ˆ„I|Ċ‹š€IaíçÊ̞–{f‹ŠĞr>m+Ê£´˘›Z@ĦÚé.…İmö…:(K s óYù9Re„–=WçŭšA‚ġĠħĥ#`ó(`TşŒ²`É&(CçœĤlIż—=S˞“¨|ÊÎ:VF‘""ĊÍX'‘Yŝ€Ö>91CĠKf,BĦ!c€Pġ€Ïy@ߪ›,œƒ1VWI˘×—Ê&0ĈJıö܇¤ÌJò’ѽ–kIħÉS„Ü^udž•ÂîIÀn8éf·âäúó›Ú”4!Ÿáíĉ0í<@ )ßo=éq&ݳôKĞ:"ç{‡vB=ieħż—"ËôìuF§FÔġ-:ŒR•7ĵħƒÎêh5¨ŜËÛÂx´‰ ˘ Ï 'lġCN3¤ïI•vÚZkˆH‘bĊHġ" hx:tV“+‚‘ż "0Ĉ¤S}s,îù.ie/$^Ê~–àI_*0géÄfÖ­çVV›}ÎÀƒGT–NŒ1ÁĦUTJ´{³+öˆşí ŸŜĦ­H×µ½˙BĈX\ĵÚWĤ20ÀYg7ꆅÜ@ ÖĤZĈKtlÚÔqÁçɟŒ²T`?…1tFgĦ2j²f>O× éfoİġè=êvô^ŒŞÊÊdZDk˜PÔóÌBċi§ `´ş°b""²ċK‘fĊDǑ„,ĞAΞŒœìÛX€s0A™ú/Ü[WHßSħ^Oó’8Ŭ×ÌiŸ1VÑuċ… #Q8 ²Ñ0jÎ!ut3³u:šÒı€M&àÖT§’ê„BX²`ßh™ÖżS™È9ŻzH‘\ߊŠJŻ[ıû TcÖKz­2à;.I[Úŭ´`D Œ²Luï[ç`ôÌÀhö÷˘’Á53Ŭ_íÉÀÈ€ÉÒR,ˆ‘[şg ôlpžyÈÜ6…üƒĴ#@Au•żÊŝù²ġ°ŒŞuċñ €²B:@’NLĈçŠ?הŬ܍ĜUHpÜfÔİħueƒ‘ïÀ0 YÒcŞĉx)ÌFckŞ É‘m™Ş§o´*}Wž"¤n– àœGÁúV8֞Ï{20Ş_fêÀâä:û6ġžŒĴ%ìċç`ô£v#‘Ú=K/ ĞQ˙D`ä²( !cdV†ŒħÊ,Tş}dY5tÒ˘†Uİ}²ÖRÙJ"CDšéT…‚ÖtŸ˙ŽBÓ5Τ5ĴÒ .™"‘¸Êˆ³²‰ÏVĜw>˘†eCħÌ59cŒ‹^?g,§Ĥ{†ŻħԜ›ç>Îx@éÌèÂUGÚk..|ĴO¤úpUĵ/ç\:µLÈûëÁ’³Ü\Fg´P¸°,Ïĉ ÀHĤ´˙QĉŒ>•QÓ) c=Ħuô4žŒ˘ımš‚€˜HÜÁLzŞħU˜‡ÓĴŒ0§B²ŒÊ7•’ğù.Î]|ÄS‚‘˙>ĈÀ˜€&uTH+†Oú:òcÜHJKĠÖAm Ö#keK2€–tón½_9\Ŝ•*E:KÎĞŜ‘£q—ız?+pê+·$ç\ÊÁú€x(2S^1Μ²áÉÀÈzsF ·oLW­·’oŝ¤`4™(ìçÓ Ĉs0ú TFíwy]JšzU÷A—ÊK !R Ö+ó‚&ŭi:6Ĵş?ÖÚş=H—€4)¸,{HŬÏъ`Ôŝ ŞdRĈ.aH„Ž‘âŒ1ÖAuË NäuƒħĞ i5àYN•ċ£`½AdˆÀ¨Ì÷MÎ츠9•QġÏË3S…œ[T§’%ÒQ€ê$@½ËŒ–U4'c,”—…µ(*ı÷€ÑôP;£š9²ŽÍ¨}(8"†‡ŠÜ`^/ëŒÎ&u*î:ŒRŸžĤkĞĠ´,HP˜ ŸLĞ#9Ç,ô´_+ĊÖ0ĈÈ‘F1Î%<%é‡È`TsNÜ B(â‘dL¸Ž‰8!Ùû™£ì–ïÀ%)Xyq„è BmhFRÚ…h†ÔcÖa¸ŝtŞ“+É)V¨H!ĴÎŞêÈ5Ó~=*PUÙQÜ&²ż–Td”m.Ôjş™9£9żn#¤­*“¨ıÛ'#c,öós0úÌWFsÀˆNŒ05 % b(’=G?I7Ó¸ˆ›KƒÉê²÷ÏHÀ­µp˘*GÙı”|êp,ÄӃQŭëZ'7ÄÂjû­ıOÀ~ˆÉĜ8WŝÁ½Rù_ĈEmÚÉK—šá‘ç/jÏÚà(3•88c°Ú SèˆĴSş1,¸#ƒñ‚ sÙ _EsJ1¸X7Î`•3‚4ŸĤ›;éà5Ù˘½ˆ`¤”Ááaá+ç`ôY£Ê2ÈI2ç€Ê1‘§œe‚—²hH(ĠȈ{aıY(µŜ÷LŸNòMîPlP 3ɸ°J•7‰A”ryK•-G˙³öŸS{= ÙwfŒ•hÄgœñŠÊ)‘hZžwÑĵà6ë?5 uzh•ˆÊċÀÈVJ—'":ĉk²ìZĠ=·Êق1&y”„ÚÒ4Ž\0˘4]'Í٘;iÑúĦ:İĈxT,”œŸƒÑgĴ2škÂqŒ`äíU–‹˜ âT0Ĉx‡¨a•Óü›…z&Ğ4ç{Í;F×ûNĊÖ@Jd*ŞÎ<9ùÎȆ`“dˆJ3V ÊT“§îâp’€´Ş |u˘á,Šr÷–ĵ ŻÙ eŝ&k;>Î8‡ i”Ç’ÚPĠ5tɽiق<Şraeċ µ Ñ„F—U‘ċ (ìüŬ Á¨+\ŒÈĈ#Uş.œƒÑ猎!ñ´`Tĉ|™²B*É&h*İşÊ‚l =Ë^IçĠ°Ö·Ĵւ30€ ŽüOT97\’Âí°˘Ì”bĵ²Ş(ğgÚşAk_y–Żš²+ߌµċƒĦÙ^Ç€ä˘îd%@ĤqÂĉ)yâ“óÎJÉUG¨únLJ Î`ÊÊïĜ+£yIŻG#k‡ù9}Ŝ*£S#·cÀ]Žyr ĞfÜ\ –G˜Ÿ–Â=ÄÑuäŞ,SZ7¤uÙ+НžŒĤV`ĴRÚ  NÎ`G읝8 ŸĤuì7wüee_ÁƒPÀÑOŒwĴ›*1ğèĴ8‚µĥŞjêĠ€l>N ”ŽTU2Ĉ8 û’3^ћíèh:~0šÛ3êŽ)ŭè2(eÏÁ茞ŒËU){H ڂ{ÏQÀĉ4Ş•zӎ²£Âégĵ'£ê=ş: rpĵùY2X•Ïà{΍&!ıaĴKÍÔeĉ9óĦÙè‡xNF€Ġ`Ö4”u+ˆNğ*ZTRòŞçĉXHV™šÖ™^4_¤pĴ`4ÏıÙ½ŠÜ4\şÏÁ茞 ŒÜ'Ġ‡ú*jĊ˜â?îĠˀŠħ*â€ċĵ\ŻU:îQû]ÎËd]ĥqTb²eûÏİ^Cy6àj!Œı ‰ƒÁú^jóh:ê\ı?2KŻ75NÖTúoAœ6-w .JyF€Q ´O F„ĊjşÖ;҉/àŒÎÁèĝÀÈ;eà°T‘Ó°³´ıR-QËݘĴ!Ĉ›½löÉÀ¨ÜˏŒXğ +5‡ÄV ìq÷$ÀÀˆı›#oîhĠ‹ŸK%öĵ³ŭi'Â>É5ĞAœˆJŞBÌĜòZ19§:zR0jÌw­FÂxXœƒÑ91ĥġŸ‘RcÑYÚ\—S³5î6:fŒċ˜OF4{œ%qqVĞG~–~ BQ=p–`M+)ÎvìszJ3fŽ °Ä*SâöB8+@ôDĞېsE×TEíŒ|ÉQ"$Ş(*jxP Mġ9ƒÑñƒQġ( Ĉ™ë3ÛUw§ċiw¤ŭ£6 î2ċïÍùü/·*€5µucÔaħr¤köıìàéËkXä†ı •µÀ˘{Ħ9Pûİe pÉ*µÄÓ,˘gċe×} ué L–ÀE9ğ ͗Ò„ îçڞƒÑ9AÒçÒZQ`Öbş.­µ8ƒŻı˘¨– À-#*£'ĉŭ.G#X€I0!ĈAZA0²Oı/Ĝx&*¤JġkI` ÁV ½ŽŭeÔ×ġùž%ċ'g^R£ˆ£z<í*éHÖĠ‰ÊZKVÖıŭÛĉ†E-ù{gċ¸Œ˙££2ŒĤÒİûŒÎÁè¤ÀhzŠ`Ş+/Ċ­Ò3;á?Ñïġ8QUœ?9M׺Ġ°-c ÜÓâú…ÁŻeǖ€Q}ù´%pQ1Î:ÛG³Gŭ–ѝ·ËXKà‚{4oħŞg˘:JUé˙lĥşf ’²c’9÷mê Ìíùv0íS}î‹jmq°—Oç’ÎÁèŒN ŒêŸĞRÍj€ˆĠ+rŝúYĤz.2ĈşscŽŒ\)ĉäòÈ{PĵúŻ -¤ìêÓŝdĴy q³C3û†Żj˜ğI4ínĴ)ċŽœór˜Ž ÑLġYzUŸ5*·Ê˜``˘LŒµO `hxZ;˙Av˘08ÜÏ[Žç`tFÇLÓÍ|A 58êéÒU})Ïù É- m]„ı80²Ĥ\†F HV§dÓS:Í|ĉi^˙Ĥ|c rèĉ‚ÑÌguY94ž VÚBˆ YUIŸE`Ş"3ˆÈZŒĥä*Öĵ£GQÓŒòÜ`xPĝ !ç`tF'FB€ƒƒq‚/oİÏUglƒ]¸ùş}ǙLsĒħ2|ııĦ§£Ĉ½aîàÉhşœ-?m@˘Î£~ċœ`´(£ĈË?kŞé|µŬ‚$ÓFˎĤò˘Ò‚Ŭ0´üŻ>[QùÌY"2&‚—  ĉŭîÁâ1ƒQ:ÑŬŬ9ƒÑ‰UFĠ·²%umrHf g’líU4,Úu<D½F­Ĥ,ħUÀˆà‚ù8Èe,qwy)ĜlöĥœEb¤€Ġœt5·ċÉqVŞJ~ éÂ_ÔI5KÊ6KuèR"ˆÊġWmËLÓÙ*ŠUMCóş‡$cBJ):ç4À牸nS=}ÖĉÖÚÜ>şs 8wf´ @Êcê*+çt­-ІeÓ9ƒÑ™#ĉ­cpÎ@éúÂZkscŒÒZ+H4ç wÚUÑÒŭCʒİáœKĈXÈ{aĤ /Ŝ*£V@cĴ=R)íÍmµ::ñë÷Ĵ*$żG?•ÒÍñĦíי÷/oòùĞş6AÁy€œKÉ cU•4ˆĉUE~|;Ĥëħ´2ŞŜ´Ö¤”Òî!ÌÌ£Û;‘ä%½Šú€EäâÖ3ŜüÂS‘=£s0:ƒ•Q½ħd”í!zÏZ›9PÒĈsÌċ¨Óì?/Ú+˙R÷:ş.`Œ…,\ G#UŝîġŻbg°fö2-¸Îñq²9f*1TL4OSPœe@Zċ´?sbqĉ~UƒMÙсâ°ÊN/ŝŞ“ ŬjkË ÚB ˜0‘à<ò‰?CƒĠUĉ&ÚħցQn­Íô£Ûğœi²­ §”ÏwĈPœƒÑ9y0bMê‰;ʎ2Ĝ|„>W;ÖÚÔUHÚÍ Í=È-ÙtOŭ%ÊWYÉ0Oä05 KQC+~Ğ€Q×oÈ\#Ŭd)"ÒEbZq6´ÂŽûıĴ|Dއ<­µJséZ4šVŜÊyí{çbz=W 2€e€ñ€İ ^çœBˆ@QÑvó*£c÷ş[âıµl‰k§Ĵµ™QjLû2Vfs6K۝ƒÑ9}+#˙‰°€…Iw#Ëì1&×Zç•Ç ‡½NzJ—U÷ĉÓu˘T5HÎı”ƒËë†À&ı.g0­™a7@íŝÑ `Tİ RDÂVĠQ-jXBkžŞ„ŝ$éHż€£ë,)…>Ĝħà’Á-żL€ÈÁ²9OwUXCzëȃŜ!DÈ9¤”Ò™5°”Ŭ³5tžĝĴµV)e´Ö…Ö:·ÖĤvûnşKpr³HK6£ÎÁèŒ>#`T=Ò F0:µÖN )”ò6×g}ÚïÚ7ڔ œóPô. m§&²]GTÖyçWFœ—‚„ vRQv}ĤÒù1nœĞ€ÑLízc”ŬÛIÉjê‰ 6û [šVBíuÌşµ%*ç‘ !Z߄ c,rU’lUHOr:iêñ cŒRŞ0Ĉ¤ÖÚħ}ñ~k,DÈÀ%›C˜Vjşs0:£Ïı ĜÙtk>4ĈLŒ1İ;˜™+è4ÀWÚ\…$9çc,½ÍÒeĴ“5ĤSÁĊp0Şï•Y"SRvÜĤN*ŻZ×bÉÓwš4çISvKp­u HÖZ÷ĥ‡’•аì04šI 6=îáĦEÀ9a’KĦ£Ŝ€1sÎCÎıt³HlN%tچދn~%lĈeŒÉ´ÖcsçŬ‡dTĈĥ[Ks†^-†ç`tFgŒX¤_fš9OÊÉ.ö‘µv˘µNµÖ…R yÚ*ЧU)uUN•Kƒäœ‡Œħ(è_(]ĥx£Ŭµ>hŜŻÓñ,ƒ @JĦ'ôĦ7TŻ]DGò½Ĥü6WZô~‡ÒĈ£‰¨ğۇ€%!½…ê bj>3ĥŭ‹2¤ Á`ıˆcÎyTQv †cOÛVhž\µ­Zk[EĦµÎ1ŭà“GŒrcu9Ż5˙³U*Áèĵ2:£Ï MçżQO¤€ü€B?ÒZO´ÖyQE#Wm~ž4 Ñ^Ñĝ˜‚ğVAÀ9ċڕ8Í` ¨cŭÑ<µyk(ËJ.Ëwë¤R$Òş É8Úß…™ùĴPvO R>eWza´ŻÈ°²BÒΆŬÎ>CÓ+5} 8xpY[f‘``áiÄœó˜s !)¨ÒqvŒVç>PÖZÒ%yžc&FİC<=1Œƒbz²€uv@ó9£s0ú,‘uï*CĜƒ;xĞ÷Œ1c­uîmĴô§ŭÓ¨”ŞÈrî(ğ€—jßHô.&CUÎ Qó] <7Ħık—5׺5eÜğ™ @9ÌĜ +球3p}NŽ˘ #/NAc îċkq™ ÉšÒċ™›A͝ş}’˜°ÊˆoeŽ"ì… I!„\µÜžYmO7‹´ê)nĤ²Ìó\E‘+&Ĉ˜!}ò‹Ŭ·(gıĴ3Jž;0œƒÑgŒ›İuàvô[=Xk‡Ĉ˜‰R*ĠZĞ9 ;Z°÷<ġɁ)ó"ڟ !˜ceÎyąìñŜĊxç0/Ut̗‰¨ħ§Ñ²Ê¨ş-ĴJ×ċ€#lîĵ˙T99˘Û*ğ_Ù÷BħƒófÓÖڂˆ2½ż[0FK˜à.ĞŒî%i\ĦĊÀ ,ġ.pġ·8çħ" ‚@v86Ì!œžên.ġ ”2Jİ’²ÓzHwŜ{“¤ ȖŠÂs0:£Ï‘_ıżËr&‡1 ?…ÀH}nİ(½ÙŠ lçÜ%šÚ™aġïÂ0MŠJ§'/kô`+¤0ÙB$RÊȕÒ]†uLßGĦ=kaCžçyQÔĦJ'ğ¸ûŝ!뇀`e3XàŒÎÁè샑÷˜1ĈÜ ,€HÂìßÂ61ҏ½ Iµ2ĉĥV8  }ĉ+ìí, C” ވsž„ƒ‹[Ö˘ûÛ)ÈjŻş™ŝtŒuĴŬy4]ġ!&@ Pş‹˜gı`vè)×Zk/zâ̘ў´Û7aáRoÎÔ8ùfND™yt/ë‡DTÚàĜċ`äëœkƒw“Ĵ%X]n°…ħÖ/!ío\Bô„IĦ”’/à€ğÛq÷•–-’ö›-ŠBıÓâP)µÇ?úáŭµµŒ;"?£s0ú UFĠç’ë)Y Ú˙—z¤µŜSJ ³,K‹˘(Ş<5,ïÄ†Úġü/ì9#çÀµ úÉĠ7gŠ0œ¨éŭñߜħRa×Ħ>œ Fġs@`œzˆ~`3kí¤˘ì”RړÊӒâáÔw§­²›·0jÚNk]c&ĉñ½1•’EEċiIedl}ĤĦ|ŝ·s‹ÜZg ÉĠ˜$. !RÊÈ’<%šâƒWħç˜ûĉŒVuQİRj¤µŜc|˙I5Œ*%³tFç`tÖĠtĠŸYŭ¤ħ@‚K;>°—ûRj_)5z‚ŝ=áówôkÑuQM×mĵpq8րQuDk7­š!› Áˆ\•ċ!”ïc!uĠQÑaDğĴŬrjŻÓtjXˆJ)]Ċ)XkSġàö^(™[˜ÌŞĥ‚wImkùU…ĞŝQ]ŝ–<+)‹äâL’ =Îy_їRFavùÚ­:›tœ×iċ*ÉcòÁçXi*ŭ^Ž,U>Qnjĥċ&F½­ Bˆ ğ>|ÍI÷™A˘ë´Öš˘(Š,ËĈY–Eħĵó§żDF3“Œžâ;£s0:c`ÇÖ1&$˜”·ŭÛöĈûyQ;yžï;ušC×ÍMb˙¨“B°(ŠgUÖ眯%WŜĜÜ=ÈŬ@Ĵm\ŻrĥüÄĵµ² 1…Š]\ˆí¸$TŜRĜ-zŠNĴĝ ÑŞTTŭ>/–;3ĈLôŬĥ€CTöAah.ä‘6¨9koĴ¤îHDbÜÛês)/!úAÄĴ^Ċh•@iÊMSXżJÊó|˜çùžMGĥnŭġ6¤<ç•Ñ9I0àfÒ óm\‰Ó]fġ}Ôn–e‡išĤJ)ĠħŝWëN£ÔE׉ ‚0 !Ä@Èà‚Üx˙éÉô:ZŞŸ)Îg­‚ĴîûÙ ù\ˆ!/á”nc-²;΀9×Z+­ġ*f´ŸĞ iáv1oÓuóHޤ[żx2c‰,Ĵ)ßÈҜ™¤éM²Uĕ§ÚáŒÜ”3êŻaheÀ6ŻÉ|pñfkAô\Y-ĉœ~qÈ']5µE íëgò7ä/‹˘xìŞ#_]÷TtŬ1UD‹@İħg„a(£(Ф”‰”rmpK/ZÊ;)Hk@i4=X#G‡ˆ–WFír¤`ê€6bsßRĉÚ"vAĠC+î۟I@ZµR˗½>ÒĤ÷0(9ebó7żĈıúñ_Ü)£s-X Ĥ ÄÙ9ƒÑ)j%XŬf úîßâùAñ@B}œeÙ£Éd²ŸeYĠ;š§Ĵ›W%unĴ'@×Í(îÑuI†})ċĉÖkżñZĦÀï?ƒ´YS÷„†­Àˆì<ïş9ï`à€îâbÏ>2Ĉ 1˘(şúGÏ2]÷ÔéiRPMQ…ë#ìoÙÌXcfÒçÈQvmÇĞ*‰cjĈjK;‹ÒFè`ŭĈ!ÄE)ċzEŭ$IÂmÇTF'5$ğjÙŞ—4™LÓ4ŬÍóüá…_ŝç÷•‚Rï7bµ‚ñŒÎÁèÄÁӈ qğ÷ÂÑ'Ċ ›Áò<ĤéNšĤnV0KŞ£.ŞûX¨Ĥ%Ïñ\ĥDJ)’$ £(êËr~kÜ×Ü{œB+*]cĴYäx ÜI‚+‹´?ó·Š0=´ûİÖzèL—ó…"°ZşîİĠiRv+÷HŒ1F)UE1ÑZtQì‹G·'<µŸŬ20Şŝ05_%ÇͲQ’•˙Ç A‚!ğô€E½kRÊÍ0 ûq'Q‰9@tZ´Ŭĵë7OqTUIZk­²,›¸ÓĉC•g÷½ûïŜ‡µċî`Ċ›ĥöç`tF'F•£·à³ßZ‚& ?ŭĵĵÁniUÜIÓôád2ٟL&c—Ŭc­sÌĈN< Ğ ™ IJ)â8NÂ0A°ö7Ż…/żgë§? ŻÌTŬKiŜ@K*£é@1¤“(„5™N@zÏ3Şè:ç˙tGu|ŽdĴŠÇw3­ġHk} ?zg7€³Àİ,FXŒĤàS}cm½ÙZœÊÒX°İÌÒZ‚µJ’݃‹/ÁfëQ%qGG íàô$U5Dz]/,ސ\•¤Ò4Í'“Éád2Ùɲì~|ç'ïlM>Ùµù<äÎĵRŬÑ9ƒÑɀóhQ•d”REšĤéd29HÓôQžç÷½óżü( HÛ|„ċìžêîŒÎÁèĜÁÈ=|ŒƒK 0À<|ìÑOÌW{oçy~/MÓíÉdr0™L&­ˆòyo­t´SM>İŠŞ?GQ$£( 8A°.ĵ´ùòw~ú8‡ÖĥÌy3şN ĉġXÑ3,ü•œx^p Ĝ҇¸2À§Zë­ġ¤…8X7ğl żñĈ@Ż_z1 Í0 ×\•$…â´ŬqĠŞı%U’µÖd%o7žL&ğiš>0Żßŝ³ˆ@ ,` K`µ¨ŒÎÁè˜Á¨×¤;PŽ îü%^ş`o R¤izo2™<Ç<Ï3cÌ*½£y"Ÿ§ŜX;Ş£•è:!„‚@&I’¸Ù£­Á•W^˘ŜĠŝÏ?Ĝ´.×=c€5U܆wùÈR3˙¨³2Şè: Ĉ(½²žÔ÷\˙hĴ”*œŬ²âgL§•{ä>R§PE޵cöċ?Ŝ•q 0wçù¨ÚΌğıĠŝĈ\ֈô@  Í z7_ÂŝÖ‹Ż !.Ap!I’^Çá 3IÙHÇ@ÛµJêò¸Ó“Éd2'“Év–e÷Ö>ù›o¨6Ŭ“dŒŸƒÑ9WϨތJ: œ•T]ÈĦnŭÖó;£ëâY–U`tèĝôzGËZÇí]·°wÄ9çI’„qÂ0ܐR^ĝÚożşwc{/u8X ÁÙt–9!ƒA/é€İwìè6Ĵў1f_)5,Š"u†´O6£u޽gáe·Ò[ċkçÊÍħRjßŝâooĊeùTÎ$1ĥĦżMUğkêÜÀjç Ğ$ʓIġ°wñ•‹2Œ†a¸EÑş›I’sè:ŽÓ6µJ2e+ÍjT᪤½Édò0˲;7ßù×ßelzĈ8˜ÓëÊÙ9ƒÑӁó*$xœC?ĝà‡ĉ‹7ú?ÈóüvšĤ&“Éîd2;…­öÖŻż–WġwÊú£µ>,ŠÂ7¤}Úx÷ϝì{›sòĥ½:Ž"ÏóħRêPk½'nż³/dTş[ŞĴ›‚ÔÔô30'n˜ž0H•b eɕçq°ġÒÍ .A°ÇñZ’$qEËÀqB•ÒQì„Ú§KŸşK'“ÉÁx<~”eÙŬĝŝ;o_?xo›Ô!˜0nUĴħç`tFOFŒyŠ: fS¨˙ Ŭ‹=ö4MïŽÇíÑhtĤéD)Ġ%d˜LÏÂaзЎ‚8Ž(ŠAl !.o½ö7n?#Ëòéf,¤h‚Ġ`´M×DÏR]7ĵ…K=s`ŒÙSJ*Ò<ϋtŬ²}ùsU! ΍µħàĴµĥ(ŠÂĦüH)u€ŸŝĊGŭH€Œž„ĥ@§­£îŒ÷ü2bà eĝH•3I!1d/|uŬĴ_z) KQ­ğ&ôŞ$ŽùŞğӒġ“ŞÓĤÑZ+T>._{ñĝA–e·/÷˙ĥovĈ6Ŭ9 0Q–Ls0:££ƒQ{Jq*Ô§ŽhïçÙëWz“eÙ§išŜÇ>UçWGfIetÒĠÑ2zŽ{o•‘ŞìġzIÇ‚ ¸´~íĠW‚ġÖŝñaıgÙÒ~s!x HžĞ·%ÀX³ĠÍoÇĝĝ>­ġЎ&nŽĞëˇˆ?÷yHËN÷í×6BEQŒ´ÖfûÎŭ`˙aĈ`Qĉl­Kİ­onF•¸{“Ñ„´0è]‘í^~í RÊĞJ$IA0Ż—ÔEٝv•d—€“5Ĉè,˲ñx<F;“ÉäžJǽĝË˙ċûÚ×V”3œäLžƒÑ9­ FX”T] `î˙tû/ÍWžüHÙG“ÉäŜp8ÜTu^ßh‘gŬ*3H'QaÙĦ3Ùëġb'ġŜB\ú…ßÑnŠğFNê]‚”ŽóRJ#Ġ%YeŬğ¤ê˜aF·Ñ~1ômԁ¤Ü£ëìŠ}·Ï­u*ÈÛ^Ò3Éców*ğUd…ô“/˙Îó|TĊ˙韗D¤ó²/ä{9ĠŸI³_IŬBW–BU½ÍĈCà́cÈ ƒŜKoŠŬ+Ż}%‚ĞQm&I2ˆ˘(äœ/šINVu·*Í&k­Îó<ŸL&Ñh´7Ĥiz;zôŜÛ7w~xÛĤ; –rTî>‹ƒÑ9-#6íAp@‚E!P<‚úĝBo|#f?žL&wĈñÑh´ŸĤéX)•ğÑ*C°´"(Du俯quĠQÇñ Š˘M)ċ•k_üŭ/ï-˙Ŝ¸ÜxĴĴ…‚;WoŞŻK02 Ÿòù`$9ïэ öRjO)uXċGyêşeŜ8"HŭJPv]ti­MžçYQ#ÔÙ{ô wï½!.àˆħVnùœëhEv:(k§Á}@èe-YE°–!ûĜğŝk2Œ‡ax9Š˘ ½^ŻçwbI˙¨sqs•tşñcTžçĊx<F£Ŭñx|?MÓO6?ŭëżı4ù`‡Š€İrzœù+†ƒÑ9µÀˆ<ŞÎÉğû(>ĝ÷¸¨nïżx1ŝĞ4MoÇ{ápg<W´’òÖÁ|…Ŭ˘¨ò“ŞŽ°¤:Ş”uÒÍ+^R˜ nlĵôí+żĝäşġġ—­ı#T`DXFÓ´\?ĵd0ìŜ{ĜĈ£ˆëğJİŭ<Ï+uÂÑr£>÷”Ŭ²SË*ŝvÖc³,+œÚî@)ġXŝòŻïÊ8Œ)çg6cß|^-œ•S²XïY*ФÒóħÂhc,Äó_ĵö•0 /Çqĵ™$Iß ÊŠVsó4W—ÑĦ‹fëŜġ“r×Oz<ïiúñŝó÷ÖĈšñ6 -D(ÀBQ~?£s0jƒ›ú!J Ȱcŝ' öß}áı áÀè[gĠĴê:,aħÜ{Ñú?îê¨ÍzÌ<çΕ!J’d†á–”òêġ/ŝŬݤ& J1C5{T*ë$/YV;z—`d,-_;îÇ VrN ñ'¸ħÉîk­w‹˘8Ìó|]gÏ=Ë iç;Ï,”ĵԊĥÛÇ/˙ö0)Î /#$êSÚ0Ş^ÚP9,ëC™$Kœ!tš Ħ?ĜÄîġ/?Á .Çq|Ħßï'I’Ĵb'„Sè%­l#Ô:šÊ|2™¤ápèxŭğÙdüÑK˙Ñ_'éŬ Ô áü˙Ĝ9ƒÑŒ„(7È0‹Ô­?AôèÙW^Üü›×&˙Ċd2ùd8ŜF{“Édäè$5ŒÌŞnY\Âq%Â+ˆ•\u$]Oy3‚ĞAŜĵòÖï?˙³[Cìd K%ŸÂşL ‚óÙ4ÔĦë éŞoÏJà§bŠâ#­ġŽRê ˘ëÜìÑgŠ;M@˘#v[Ce (Š"˲ĵ(Š˘(víOî„ÛŸŒı°à˘ŒCf‚—FİĥñÈÍü4†Ĥ>Ô'r.İ|JŽW1èÂBĵŝäÚ[_‚àZÇ{½ŜZ’$qРʲOgÇYuú ÑÌ£î\Z ͎†áîh4z0™L>ÁŜ½w^}§oóŭ[ÚĤ;`‘,•èĠp2ƒÑŻ5ĥĉX ÁÂ,à0wŝöƒ˙`|3ùYÄÍۓÉäÖp8ĵ?÷Ĉñ¨(ŠÂSt­ż ´U÷”ĠÑ2šn† ‚@¸ŜÑZEƒ ¸~óĞßŭµŒzя>8³ŞĠܑ&Â:ŞNZ^Ġ;ĥ¤ ?À;÷}Ğ(н,ËFU_E×­’ûÌéşgĠCZ´ĥ|g’dKÖ.ĞŞ¤ígz;·!ȚڍŬjZFu/‰Ü°Ĵ£ñȅ÷IĈ2×G" Ò…2$<ñġ—Â0ĵéUÒŞ^wO DKŞ$, êhQ? €QeTo>™LĈ‡‡‡G£Ñ½ÉdòħĜżûökż÷>ŝÔĜbĴ'KwpF5(ujJÎÁèsëM‡@”^’R€ ÀÜû+èŝŭÊÍèg‰°?Ç·†a­¨s1Ú]`dTF]êœ_ŭݽZŭ²™ĵ†áĠ0JžğòÖï?˙³0f‘*YöŽ+[pšĈ–T]£:ê¤éÜ·Âíìŝ/ñüğе~\’ğĈó}È?Sşî,Svó4ÎJHeY6ɲì°(Šöóż|oM Îx FL²ù`äƒ6eCQSiù^­8áì„"¸xoeKCa!^ŭj|pí­_ FÇ“$YK’$Š8è8I-ËH:N˘˙.‹¨hl ΄5Ç£ápx<ß{·üúï½Íw?vò€Jë’zCgç`ôı#Îë9#Ĉ9X€êÎ÷`Ŝ˙·ĉĞ7Ÿö$ŭh2™|<ïF£Ñh4rN j-1`ew B†.PÂĵê(ŽcÙï÷$IÖK!CYuŝĝŬrsÑ AÀĉf„§ –cZĠÑ˘Êȋ*g€~Œ<.á]ÔNžç•ş˜#f°8sFË^ò”‡-8saNĊÄŭÍTkm²ò5,ŠbWċùŝ/˙ìŝ ß}Q‚JM³iò)Ÿ­r¸E=€‘-À9C(JÛÒİÀŠÜ ŽlżÍ_}ĝŜsĦRz½Ŝ^žç4Ms!„tÜĝĵ™Ûşt‚×Ŝġó ³cZ‹²':[ŬġqŻ›ïÙ÷ıŭşí½,y˙rùÍ/s^żÙ9}î*£Şuœ,ԝ?‡ŭ?™Ż=ß˙i,ìŬFÛáp˜çy޵öE mznYßȞ U·Ju4ÀEQëġI’l†ax-î­żxí ÷ĉ_ŝò‰9€€1^Z”9íG9zbÊ İŽ‚J•˙e 0‡ïâı v[kó(Ïó½,ˆNı¸êµ½İÊ­y`ùŒ>û•‘Û™àeê+ô' |üGúë/Ĵŭ$âöÇñĝÖh4şçèŜa–eOŜ­THf ÍŬ<YÈUùC°"Š˘ ßï'½^ïBEWÂ0ĵñÒ·˙Ù7÷Ò xûŭûM€ ‚œ+ôùħ†`ŒVG‹À¨l³ċ†”ñ<½gŸğ.~QdÙ<Ï÷Ó4EĦĉ„žyuŬ³$ÌÙ@Gs&Iı™¤²J>XżġƒŬ—żuĊeiLÊĥ6œĉCçÇL*"HMà˘œà`µ˘5à@¨ LJYô™ÀÎkżws}ûŬ×"­·“$ÙËó|œeY”2EQĜ%ĜşŝúĈ‹ßşò~°‡Ñ0Œ€E($¤³ƒĴÎf œ ĞêhYeĴLÚE‚ ³÷s\ïçğ°tż(Š,ˆyž§EQäA|ËèÏ3ġzÖ˘†EUÒ˘™$“çyžĤé(Ïó½˘(ĥƒŭÇ_ )‰˜)`’M3ç€hcĦ­K–µ¨ûIĵ8p*½Emİ‚H3ƒŜ—Ä›ßŝfÏĊq|ßï_ ½(Фg)Ô^ó@€ġ]uXĥĞ—¤QÊÁ•Öşp’ƒƒƒğ£Ñè#:ÜŝÉ[˙ê/âÇ?Óè`òRyˆòͧż21vFŸ)0bSo:‘ÍB H R{Èù?#ĵŭ'é7^Ŭú+ ŭñxüñááámŒŠ`´lŜ8UŬœ K€İßK’¤ŞŽĥ˘(şÁsŻŝĉ˙ġ{ğš˙ò£]-ÂĦ`8MçŽ0UĠĠĠÑ20bîÛ3·cqšlƒFŸÒ ċûJİí<Ï÷şÎwfXT!Y,V7˙ŸP=Ğ İëÏ0&Éï#‘-íT–ei–e8Žw˘Ŭ·ûwq /½ĵ€rÓ îkƒQ]7”(,AZ÷ìĠ‡BÁÊĊeë’4Ü"քákßÙ²Ŝùb¨?ŬŽxŻ×ëMÒ4͕RĈ-˙÷ñ{9l9rÔ]ëÍĴF|–xïy=%˙[Z"2}"óŭ(żeĠonİ â °T½Îs‹1ĤhÏÁè3FċŽ—£LJĜñm¨ŝևż~ùĠ+­òì}7ôzßİéŞ(‰öàĞ^ħ2Zeö‰İşĞ£ÎjÉİêâ~ż!Ž‹AÜĵüò׿_zk믿wEa@F#‚A(9c5ÓIµ_ĥ.ürYeD˜)ÜaÎ8ÌÁ/°cÉ?ĤĊN–e‡s¤ŜGQÖ=ÓÑY˘ì0‡j"oö/*w ™+t–eYšĤ$Iv‹˘xŭèßż§û?}K¨‚1”“Ż(Ôµyŭ C€2ÁXYXÀĠݲ!Ĵ$dÍÒLĦ·q™Ŭé·òüÁƒµÖ;I’ ƒÁ¤(ŠÂ%ĉj—|Ĥïs ŭ$ğâiqzİĵž‘µÖ:Ïô‰Ô+ĉGÙ]5ú­‡:½"×_Â5€1XeJéĵùҋs0zö`ä÷+•ó.(}éX$Ĉa÷~âŭ‹köŝÎë/_ùË,K?Ç·G£ÑƒápX ½vÑ*NŜĞȑ‹Ş[V ÍTGaÊ(ŠÂ~ż?pĠÑġ0Š_xé[ĝÖÏoâO`µ†`„Hò:ïˆUö@w¤EİÊ^FĠ£Ë9 $`-HÀ‡—oEşçù£ëޘò3üjÒŝáÒżŝ×˙šÍ9ÉŻ"làpâ×KšdYvÇñÎ{­?~÷Ílë V—AW~Ù5×âĈ}LY@X*CœJK"”SÈËE(M`˘üiĜ[żı6yüî7‚[?ŜŽxżß˘ÈŠ˘yž[­µ_!Q ĉñI€uÇ[ Ä–€Œ1ÈóÖZXkÉcĴµ…µ6ëY›~Q§ŬŜûĉĝò××ĜúËàÉ6Ġ mÀ„Y p^ž,ÏÁèف‘/`à˘î! Ağï£x˙?`0|wôWŝV½?ïŒÇ^„ÄÄóĤë˘éĉÙĊĞîİÀ¨£o´lĉ¨„"I’`mm­ßëġ68Á oŝî?˙ĉím-ĝî(Ï AˆeéÊÀY„Cuud´Ö´"y‚0@Â܃ŭƒAĵ?Ó4ŬϲlœçıòŒTç Á?iRìŻ\…Dsú‹â(¸э1ġ l–e;Q=è˙ß{ĝ˙oßÁ8+Ğ$fÁ-`ĴğżTµP€ƒJqƒ(ŭD+gÓB—£”B,²T£żaïċßğ²ùĝŻFßÛM’ä`0ŒµÖyQf<w l d;İğì'u’]R)Q ”<ĉÎVÑèZk]ôÉ^×ÙÁCsĝ­ğ¸ĝ&ŭk ĊA….Í!mÇĴÎÁèÄÁˆ•Ġ?U›žt AàÔÇ˙ú£?Ĥz“‡/zíżfYúIšĤ÷Ĉñáp¸;™L†išĤJİyJ:ŬQċßqŽ­o´”ê‘”Rôz½`mm­×ëġ*Şî…çôğߔ›ŻoŝÙßAš*ÀÄC œŞwıSĠ)×?ZF­5Œ@Ċhĝ!½ú|ô~Qd²,{œĤéašĤ™—'ĠE}šĴ{&èş³FÙuU MgŜ%еÖ^•´EÑvĝ×îĵóĉhë•MÒĠ’eŠp÷‰|úŽÂ$ĵTŜw֌9ĠÎLrŒr 6öéK÷Ëoîßŝ42fż×더R™Ë%ħišÎ8,¤îžĝbΟO˘9×Ŝ>µ k-”RµÎÁc´Ö…1&3Ĉ¤—ÌÉşżġÁĝá—Ì•ŻFbë0Âfà^,³sAîú)ÏÁèÀˆMÙIşl+F%E!ĝ.Š÷˙âÑ÷‹Ż?żġ‹~táçñèÎd2ı?·G£ÑÁñÂ"šîIÁè¸D lò+$-‘ ƒµ^Żw9Š˘çú.½ñÒ7ŝékġînŬ=´FJ„’•C°(]™­Ë92ĤìĠTŬR0r4]Uħ‚`wŜĈ°ˆG£|;MӃ4M'Y–U1Ğ\×cëÇ}.iqĉôXû8 x–Ĥé0Š˘8Žï÷o~ı˙ŝŻż!LÁ˜“!׉²3”ìİ\Y‚0eO—›VJùX#82eÀ…@>Ràא<|ŝ;żyġ£?ۉĝPk=.Š"SJiŞÊşsQ°EÀü$UÒ `ßġ4Ĝ%ÇĥN0ĞdáDDZk­J‰aĦµÎµÖibÌè+Işŭéííol]’[o€ iqë”x4% [W…èŒV#ÖĠ”cÓ@Wb%‡ÒUH`̝@}ĝǸŒí½7Ŝ¸ö}]äŸ ‡ğ“ÉäĦ‹¸?pĈĈı²htKşF'–s´bߨÓÍ; CÙëġBGĠ]Œ˘èf/ùÛ˙·îŠo~ŝ¤5BaIQ=NeeTVGÖ ÁΓvû!|•#F„ ĥA‡+/FïĊäAžçğišfY–ıëż,]w-Ú8Xž…êèĴUH]'°‚¸Ħê%i:‰x/˲ípûӏÖîŭìÍìÒĞ[– @0Peí½Œ'A‚ƒ×ce˜L&'“Éîx<¤Ċù {Á+ô‹ÚŽ*ܧöƒÁF’$W˘(záÒ[oŝî˙ĉ‹ñŜŜğµR9’#”‡I^UFnĉH/¨Œ£éA‚1;ülĝ}ġĠè§y>ıŸeَë <ëVUĜSv+TF]} ĥ˜fޤ,Ë&išîEQô(AUô,Àh^߈ÏĤ$I‚Á`­­­ úŭŝ8ŽoAòWżûŻ~Ç|ïGAĈ  ÄsT€­$Ŝ† ´›;šFí'’‹é 4ÌŜñò–y0ş5ÌóGišîi:Îóĵè3˜%×x.ğqVèş³JÙaŜF·J•4™L²(Іq?áÚŝ?>xîĞ—@<´”¸€Ĵċ`Tŭ½ @'@™2¨OT½$08 ‘˜‹"iĵwï}ò­ŝ·“$k­SUÙ7¸ ğġ²˙ûdöh Ô˜ ҙ*İ%W&•’1ş,–ЉRj”$É0Vjï­x|ç`ïożÉw_VW×Ĉ/’ƒ²Ò\ıÙ%b(‡Ċ5 šfêëÏU ĥĠbŜFìŜɽ˜)À‡ċ(˙, Ìw >ŭs^|áúú'—žğù³<Ï ‡‡ˆö&“ÉĦĞŠ2ϒĉ(ô\µ^ċòœ­Ú7Şİş$I‚^Ż×ï÷û›qßċ×ŭ~Ûô_Üĝ/˙ù6ĈİBÄM)ñċ,wĞŸĞ´…*V£úÇ!@pÀŝÁĝ–zŝFĝvžï§iş“Ĥé0MÓt޲nĠêè|iEÚnQ•DĞVI”&Q„aĝ(Š&·/½ŭï?~Ċüf°†{˕ÍxŬumF…"pdÉJ^¸M@˘Ôƒ·ȵEJ„AÀqû‹˙ä‹oܽÙG#c̤ޒ”*óZ.í*ĊÎ'9”˘—Ióħ˜üjİ(_Yžç“^Żw ”ÚO˘bçĞÑ䇏öż|÷îÛk_ Ċ•/Bô/ƒ”iRœduIċU’eÓÚä+=3ëĜà?S`Äfn5¸)ÀECXï„]fĉ°0IVŒaż ġñ÷ öŜW/]LÜ|ëĈÏ´*Y–mO&“=žK;Ş˘ÊÈ \XeÎèİÁhE‡%U÷úFáÚÚZ}}}#I’ëQ½tñĉë_ğñċĝÒĝá>}pˆ„$Ĥ°(óJ0²ŞNY˜ÎuóÌ ¸‡°ż7ŻòO­)ngYöè˙ÏŜ>Kvé}è³ÜŜ;íqUuÊŞ @ÁnL›Ĥ{À1$g†'(šĦ$ŠAŠĵ7Wş÷Ëŭ7÷ƒBĦ…ĉ3g(ÎL÷˜ž6èFnĝ†GÙcë¸Ìí—ıÖڙûd=ePU½WDVšsŞ*Ož½×o?ïûĵïÇñ֘÷…:şÒ¸\ĊÔ*ÉÙÀ;ïozž7ßúċ·êçż|<÷Ž´o0ĥ.ÓĈĈí[ÚZˆĥ;˜ħ]Äİħ2½èâÀ) %P•+H DŒ˘V›Ÿ<ü[_zç˙ûġ BT"̕RŠbşŬ˘’FYÁoÚäp( r’š Ĥ’Z*”RîÚ+EišvjµÚNd×ŭt}9ˆ—7ŻżôÈĠĠ7Žg‡ Ĝħ'Á‚C”JĝD›cÒÚĈÛİSNoĜ‹d}hà½ıĴ6=ËaQ/Iú—2Ì5¸â0Ĉöž&ŬƒZy ù•—àí~œ>x¨ħrìÑżÈól5 ğëîŞ{;I’Ŭ(ŠÂ8Ž£<ÏÓ!ŞhVMSsKa4Ħĝaí†íÄÀ‚ ­VĞŜl6ÛµZm9‚Ó~­ŝà_˙ƒÏ½uİKúb ¨uÛbadŒÔRäıF&ġh‘ġ[Œ—  ”q¨ëŻ£eÖ£óÁëŬnĵê~OŬ8ŽÓ[ ŽîêuWi„üÀ*)Ïó4ŽĜ÷ŭ=ß÷×=Ï[8ü³˙ÎĊŝĠŻôlའ~7îû³(2—ˆ ŸS0Pb@]m%vĞŒÂ@C†0QPħD€rn½óµç}WŬ bWŸ“ıAƒ*˲aIF="ŸtÓ&‡[²Ş+‡íÊ÷ċ˜t–eZ)]j)KÓ4J’$Ĵ×ëğEٜïŻÒ#[{Ż^¸²ñĈ‰déħ:?ö$h}FÁĉ•2eg_I"(L@hŝR_O€ö7=ĵ-0"d8ì†]E“;¤·yĦ?=´xI0kbànĵ¸ê ˙ô5È+?F-ĵŸ=ÜZ9úÈñw³,Ûèv;›iš^O’d+ŽŽĞ)ŠŠĵ„sé £{ÒŬIM21 330!o4ËİĠj§<Ï;÷Ô7ŝéó׳vŭğ?ğ‚,•hy€OŒIî§j[s$•éÁ(ÍgQjeöXNÁìĵk.œŜKÓtĊċôv˘(*АoVŬuVï{A!͢’n¨Kró’ ÇŬĥçyĞŜÚ§ĥ7Ŝ{(Y~pTŒAeşÏ$3 Fĥf)‰Ĵ‘!WŒRPe°%…ŬSPM6Ü 4@šH49ÁÖ/žjt×\{+ÔZGJİԐ꽽=Sjŭ1¸%ĉG>#(‘!!FŒÈ) Âİ(çÄSÎà‘'I’&IĠjµŽkµċûŝfOמ ĵçç/½ùöaóTC dŝ hP‡aĥÉ]èŽS·ğ–D=‘!Ĉúáf#3Ì>= ŒöŭÖÌ ˙·Âa0*.$ §Ál ‘-fuB”Ú™9&^…ĵösä×^C3Y‰.[ĵ´xâĜyžot:M7êzÇĠħ„I’ÄN./úŽQAÓ(˘Y;ÜjMcbĜ—7ò<7ž‰ĦVН<ïÜùgżġеÏùÓżı‚ëÛ1‚ €‚çşxÛħsĠ•òFİÔS––ĜPĞħĦ:BA¨Üz Ëġ½í†ç½×é$…: ]{ĤiëŽîIutWé&TÒ`]’ÒZS)L’$Ž˘h×÷ŭ !ĵĊ—˙ŬO/ĝ˙ú:”Ô-PtF7MJĠ›{ŻË'Á8eDA()ĈĈĜÏFPè\!’Q˘ıĝô?|êĦèÜòġĠHk*rË$İ£(–OVŸ44„w 4,ÏL×A˜•~G½Çní†r7–>‚ ‚`ŻVĞmApŬ*ÜtíħÀ{/TéÙĠwß;³EççÈáG˜8ù4ˆżdCŠ€h“+{rcœ+ˆŻ–(„ŒÓŬ ŒĈäĞöyÌŠıP)rFE(ÇUµÎĴÁƒ:H1ä{PïA^ŝ Ìġġ’Ÿï?²xİ];ŝ‰Ñu˘Ŭ8Ž;˙YìĴĝYÑwDn”aapCTS€è³‚ÑĜĵQĞĠòZ­V³Ġj-:]>óĜ³g>˙;çżŭÚuüâÓ]T£Ĉ |ĈÀ™m+cJğš#§Œ›§Ž>@ÜñW ?dŞû>èŜûêĦ‡‚×Ó4^I’d³0˜ŒPG“Ü‹÷”:şÛÒ(•4ĜN¨Ĵ’ŠU´Š8ô}[ħĉyğżó—Ÿ?ŝ·äž”=ı‰1ŭd FZ¤‰Ü÷¤1ȕĥ}—D qù$WФ ˆÇaLŽD„QŽZŬçŸ>ġôË˙Óĥ1&ÖZ'Jİ\Jİ´Ö:I’JĤÁıPlß4Ìap˘%ÑĦ<êòKûÀÇqEQ·VĞíA°ÁVsB$ĞgkŜ/Îñí#›;/Ÿ_ğöòáXj£À?R? ZŻÁ¤Ĉ˘ĠÑ]œÒŭÊH÷Mĉô”íÔ½€™ÚŻŒÈŬGNHɨP(!JŒ((ĦVd1·q nBï| uġçïĦİw£S‹­£úÈhıžçùV§ÓÙN’d'I’Ŭ4Mğî*;β,+rDc@4Ş;÷°0Ñ0U4lêëí†Ñ4*‰–`Äëġşßh4ê­Vk^Ż ‚àL{qù‰'żġϟ}ġŭñÛ¨FDq}`Œod ”ÖÈsƒTZîÔ0ê5µµÍl‰ 7^Ċ#Ëätŝ‰+JŜŠ˘¨[*‚fâî=Ўî: MݒȘ°]9|§¤”yljçyÏó6=ÏğÖú7j§žYÎ珷À€rùöĊëìf“Är ’ÜŞ#J`'CPpF` P FđÑ@½qŞyùħßùÚİ7ŝ]¨µN´Ö…“I0I’ Ô_HMir 7{ÀÍÁÏĵ ÊQp ˘’bÒXY19ÓCĦ˜Â vƒ húżéû~Ûóĵ•y!.n‹yI6—7ÖÖÏl]úÁÂ_h³àÇmñ|×ÔĈôŬxڞğ:×Ċd-JA…QÚŝ µŻÈIé>D̐PÜ0]ÏĤíǒxz?ı3"¸ÑÄ6Imï2”3ğ€„ÛA]{jë#4FÇçê;Gh_ôXcUJıGŬŬ,Ëv²,Ûu͆C׍;ÎŬ2Ĉ¨RhnZ¤0ş‹ô¨0Ŭ†Ñ8 Êșjív{Ñh,ApĈj=û·˙ĊW>Zƒ÷W?Y²uŸ  ‚şsܘŜá TßÀċj <ĉG+jŽàr~ôĈ+hëkáħùúÏ0\‰x#Š˘ŬRĠifHŬÓêè^PHT’Ĝ Í$ƒCEĦçy;žç­ !.ŝÙ½yñË˙üK\P VsÎ~ÉÜÊA™^c×œëÂ#ĥj[¸ÍLÍ)ÒL3Àœ~îVçÚ ?6Ĉ¤J)iŒ‘1İqó“f19ܒžwS@i˜-0Ż4lĆ)'ž‰şAcÌ£\Qm–$Iìy^×÷ŭ]ß÷ëï7}ßozž×B\>,ÄûÇ>'Éöá­Ŭ­Ó[+//ìJÑ0sÇ?|léAĉÁhĞŠiĠ÷˜Ì>Ħ‚Â(—²î›_ aœÊÖFcl¸ qż&ââğ„Â.¸BİıĜ.nSrŸB&p˘s ڂÚĵuŭC¨÷@£ 5ç#\hĠvŽœk_â´½!Ü˳dw/Ï÷ò<ï¤iÚI’¤ë܋IšĤižç™´{U ùLcN˜fşëĴı˘ÏF=SuĦŒŒ‚2Œ<Ï;˙ô7˙É×:ìXû;?ğŠ8•hr `n -"­Nm¤A–+HeĤƒQùm1 âùaĥŜ0oĵ™Ĥɕ8Ž×˘(ÚqŬÔÓ1ĦşYL$•BşM*‰Lş£”RJĤišFQÔñ<ïş˘%_}˙§?<ı~î…ÓŒz „ƒPm7×î.ŽċHĥ­|–k0P;êÜfgĦĜ l[3€Âh- âTƒ‰ÍG~ë\n<çŻĵ“6Lk+ŒÖZBLEùˆÌĊ††„ Çċ•ÈŻ‘!ĦĵA íƒRq1€Ŭ‡Ò4ċqǞçu=ÏÛġ}żĉy^Í÷ŭ†˘éy^ƒsŜšçüŭó˘Ċ˜nuäµcÛ×./ï~üÍd5ċÏqĥxlîhŭHû8¨_·Ħ[(ig5I›Ĵ&Eâ°ĝ ”²ı ­­ç@pû½Ĵ4xP0.„-Hí…û(ħ…·—1Z2„N·a:ëPU¨íOĦ·Ż€e;ŞċÓ¸]÷ğ ‡jkó£×”R)e'K˘n$e'Ïón–ea–eašĤ‘ĞïJаœSß`3N M£ŠĤ ŬIMlšh4AğŬn·Z­µZí´ïûçüÜßz~òı£ô7W°şş‡ĤOQc€G 8%½ÉÇÚÀ Ûë(Ŭwá: Fîí2f­ù²½ñ2Î-Ék5t£dĠ(—‡ï32 NÙЎ* Ŭ•„1P*+¤ÈMÄq !vJj6ßŭë×öŽ<ş”7yƒs£™AÒÍìĴž0*ŝ÷\;ŞĜh0nûOġB`.Üc¸=Ceíf˜>Y{ĉ?s*˙ŸBo“ĴÑhHĊUĴQJ™4MĈ°ĜmÒÀÉ?M^i0„G0Âú="×4 P½[ÎSJÉ,Ë2ĈX"„=ğ|Ïó!Dày^]QB48çuÎùÇËkœ¨óc´ž¨îÒnôÖáÎÖÏç’Lúİ2˘#i@D ´u´µ Ú:  ê ġ%Q„gĦÓÓâşW2`¤ċîÇ×Ĉ^J0Jۋ’h& aòL²ŬـîĴA‡áL²‡†@x"<–µj|wîd°Y÷mşbêP)îííu”QžçažçQžçq–eħĞçJ³,Ë\kŞA54î6Í÷LÊM˘ğC0˘@€ÖëuÑh4ĵııı–ƒÑIß÷ϟzäWüÀsż÷Ÿ½ş_|ĵƒĤÏPc#=İÂQ—›^˜.ÍĤ…Qé2C(ePëŻĦ.G§Ġ_‹èJEkaîĊqğ"X9$o¤0Úyˆƒî–t_8Œn’ïû…½ğĠl6— 9ŭÈs}ížüîÛ;äGo_GSĜâW[oDm[ ]êS'52e;x§™³xO#gÙ'†R×è=˜ë?5kĵ™eÉ%gdĜqê(-Ġ„é żWñ÷̽£{U!Óu/›”ëžrÎ;Bˆëœók|óò{Ë˙ĜÚÙ5ÀCâr ExeŒ mĞTX;8qꈊç^¸ÖaÑÙIœkú—_½pĉ˙1 €ÜS(%SÊ)›ò: J½ùBİÜıÜ QKƒPĵ¨`“k¨ö%§]މyžgÔ.Ĉ9gBs.„ž{ì !|Ĉ˜Ï9÷c>ÔcŒy”RÁó!Ŝ‚ bɧBâqBˆ „0B@ !4Îu-“IPĝĉHŻ­ĤŭÀĞużc4mŒQĈénıÖ:×ZgĈ¨\çyĥ—¨Ì½–*2TêÚö¤kB–çyĉrAıkT+ ĠXü?à2)ä3-„téĝ3#ÂAw Œz}ßÍfÓ³QşÖR½^?Áıù'žùüoŝĞ/ĵüA—}÷Ġ5Ô Q˘À)ħönw˜Ú0]ĦŒ4Ò\Ù °ÓˆĜ·d;û0jzGxèâ3ù‹n7ı†áĤĞ+–e6™5tZċnĦJš4˘b˜ëîƒCáÜ pGQœ7ZŭµpéìBV ĉ¤f='40êċ“”AíĴßN)ıQĈNĦƒP;P $9şıA¸›ĦÑ:Ô¸üì?ûĈéW˙çÔS¸ 4M1{{{eçŬ´Pê=ż P—W˜Ü†$ÊJİ ­A( ÀJp"J)Ş”˘yž“$IRĈ+Ċcœsá`Ą‚1&(œ1ĥï1”SJ 1J)#„H„ÊìsRŜ,Ŭgl”2z/5Ú=WĈíĈqĦ4ér†ıS6ûğRĊÔŬbĤ”*:/9™1!µIà1Sf1-ܖŬ-Ê1ß÷ıƒQ³Ġj-6Aœk´Ÿüâßŭ>˙ĉeé}çċxDÛâWBAŬœ"­t?g¤ú0*fM#wg@ĵ„¨µ—°€k“‡šŻ†ax5Š˘ġ0 w£( Ġ‹[3úŭžQG÷’BFl^½ŞM"Jİ=F?ġİ|§ÛvğŬ˘Ö5ğ Ġ)ĵ ÷˘:ş§Ò ŠÑµIûrJZk’ĤiÊ£Œ1.„)AóÊë?;Ö<2żB_&uaû‹)הsŒŠ™*’mÜ ĉrIEĝÎ]šÎ@ s';ŝ½G– µ÷яŠ|/ĦÎŜŜ^:`t Ÿ”f U? tÈaßĞÇä¨ÈĝŒ‚Fĵ†›„Ò´*iVĠ4ZZ˘ ĵ@„ÀhİÙl ‚àĵçy|îëż˙·êgž?ñżĵŠk+!êLĦFìì2f”SFĥ³ż”ĥ?].‹œ‘BœÌ #âÜtDĝ€î@­}'ğ›ËóġWşŬî•0 WÂ0ÜI’$r½ê$Ĥï#8İ#=ЎîĊŬ°MlTĴ~DPI %+8!¤Ë9…RZúàŻ=uèëğàm²r·ŭM†QaÄIĥĦ9Am> V%1ĥc°÷`.Œ§˘XÚİԏüîc ÌŜûÓ;9#ŒÁM £`p³ĥx³€IMĦ˜F ÑMÑA’™S2cŽáÁMGVÑg­Š0-ŒŠ:#çĤ;ïyŜ…_yñŸŝşwâKÇ˙ìċ\ĵÜE+ŒÀ#ƒê çÔÚ5KUF…›.Näl0,Œá„H¨ġ˘­> :Ŝŝq÷,ŜÛ.T—ĉy>ÎU7ÎÀ0ÖÈp/Ş£{HS¨¤aqùÀÌ'•[ %Ŭn·êQ|JipòŬ?y%yü÷_H‰ˆż(kR0ÒÍ­™£b%İN- Âi1‹ÍÎU"E7aۏú$“ˆş9ö !ĉüo=<ÏġŜŭ W ‰>™H§ÓI]›! „r€ûà™ÏP-“ƒé†Ż•żGOİŒĤÑ8‘)ŻLÍÀ4 L†›Ê¤pğ@4#Œ†™Tʽéĵz½.\oş"L'„xôW˙îżxQ/óë-PÁŭwŝĴ¨Ħ”RV>ħÓ4Í>£2”ÊŸĊmáLòKf &½6 Fî1ċóirGrI˜JÓ ˜­£Âьù˘a "póŒ<ÏÛ×Èu`8ïµGżòÛ˙â[Ù܇˙üÇ+¸ĥ˘îÙv@‚ÁŽˆ)vzĦÚFZëÙaD)ÀˆçAï½úóìÙĉÛFe„axĠÁh7I’ĜM€eñ×[pK~²û TÒ4ĦğQA()­5²,K£("ŒħíB)56/§ë?j_<ùÂCÔg`Šż„–Âw£aT4àŒ3]:˨ûô ¸û§ħ“gEï{ ˆÔˆ2`ϘÓß<ğÈĵŭ7˙˜`³h*ívğ$Š˘là„×CÀ41Żt+7£)òKƒ`Ĥ€ †Ä›67tĞBtӄíÌm áM ›iòAŸˆĤ…Ñ n:Î9ĞĠj˘ÙlnôĝR½^?ÁyÏûµßû7Ğ?¸ô/_êFŒ†ĥQ*µ¤b˘ÑĈ†„éÔĴ0‚ƒµġF& ½ò7¸pëžy³Û/…a¸Òív·£( Ó4MGÀH Ñ/E¨îžVH3„î0$tGF@‰¸îÉ4Š˘IPJŭĉ•ŸûGjKsë Ħµ£ ÜÎÌ)ïù“`TĴ8×nĝ›;¸UNĊ0BˆJˆ³ LöTûĠSK^íE˙µW4ŭV7Ĉ‰8syQ]-0)ŻtĞĠÒ0M‚Ó¨Bh ¨'`6÷,†YĦtPa0ÊûÌT;4ì½ŜjMİŠ0 ŒÚív­ÙlĥÛíöR­V;ċûŝız³ŭĝ żûo~ŬœXĝËW×°ı•˘.4|Jì´Wèŝ´W­mizĉ…$Sˆc×0uŞK zû³fl½äÔĠżÄñÚÖġc WÂ0ĵ†áj·ÛŬ °[Ş7RcrF£òG÷m¨î~ÙMş•S*Ciß&”’I’$nƒç”RRê-ô×?LϋŻï:OGa8‡mĜPbÇ]O€`£|QĤìÎjŒmĠàڕNə µFjÑAw/YzöĜáZżáŭèó!ƒ½×:Çq.TˆVĞtGòJ£6½Ây£rMñ|ڐÜ4ġF䟳ä”nċŭWC̍lŭTÀ¨Ñhĝsssµf³Ùj6›GŒÎ·ĉ=ġġß˙ïżúé^³ñ7?[ÇövŒ:·#$8 Pŭ„ħÖk·—)$İ ÓÉIÏe×Á›Ú‘„q€$ЃEóÉŜ'çÇѧŬnwĊYĵ4M‹z#…áïYŠaïĞPŬ=¤1nqĦğaÁóIı”q'„½RhqúÓż >~°ŝBhx“5ŽÀ-­ÁôŞbG¨xÉ N%`XïT$ĈĈzgc1ş‚ÚÌ a‘ƒ{ĝÂ×˙ż)~ĝ?7ÈŜuA)-:V3!D‡RİUĉDĵc!ĵ„óĤÓAAt;atP(Í œ™!t‡A4KhÔ,#Ñl6ívğŬl6—kµÚ)Ïó:|âܳ_ù{˙ĉËïĴ2˙{?_G§F܀J”ğ4ŭœQn;0$%ċrVħŜ‹„qŞ V‡Fôfôä‹?N’è“0 ŻtğŬugbˆFÔ͢û6Tw_(¤”f Ŭ ۔óIč1 ”Ò§@8!Ä{à“oûï?ĝ;ÏçŒyÄ[c*•ĥۂ2aäŜ84€8Sŭw(l˜˘sƒsy%Â(¨Ñˆt;òàPké…ŭÍڏ˙—:ÙşêBŠù>ë”RĉyÙÛÛ˜Ż\4\ŝ,Fċ•n{oĠ4 œFİĉqÀ9ˆšCšL³(žğBSŞ"`r¨F£!jµš×n·ëÑ N{ž÷݇žùâ³/ŝ7Ÿ{íӄżôÖ:TšĦF57£’n‰Ò™f“ú @4mˆž/˘µZÍkµZ~£ÑhĥZ­…z½~Ô÷ŭ<Ï{‘Ïùs_üÏyéŭ}ġí PÔıħ5F„€Ġ;´²9£TjdY#y0¸1ġ„ gïŝ)ÈÚÔ3ͽadú^E—:Îj·ÛŬ‰˘(*™ĈĠİ)@44Twż¨£ûH 1‡ġ?•Oş!§äŠf{ 5éŠ8wùğÁ'ù$ZŒ‚6íYĈ LnNzm†FÁ¨ĝZO)i—4*ÎOÖ'”Bàs F4(H”AgĜ!BÈg˙à ?n’^ (Ë}qĈĜ6çĵÓétH)ݤÂğ#ji‚jšteH&(QíŒnW¸nZ` Íò=wB7İŠFĉ‹šÍĤ×l6k‘Ç|ß@ññĥ7N}ï-ĵġÁ68 *ÁµEĉFÊ(í£ŒâT!А3‚+@„˜€Ù}zċŻÍÓgü÷<*ß è’ËmGQĉy>ÌÄ0.\7Ìê=òw}'ǐş•c•O3µt›5i³żĠ.ğƒ†ô>s͢AQŒ)x(vm4›Íùz½~Äċ‹Î:~îsÏ˙ÎżúâĊŬZ퇯Ĵb{'FhxÜ$¨ÍŝÚXÙ&İĊ„×4wĉ…ÌĥäR³Xğ eDj{RzLçèkßĈƒKñ•#óµ—ŒV:Îġ0 ;iš&cuàôK—7ş/4ċ(„qù¤ħ&‡bóîvğĊ(kFĦsĞo²“ üòÂçO²…“ ĴÄyAE[ûq0*żeö¤20ž2c‹hıŬ@¨5œÙüĠŒ$9AbÍ;6·ôġ˙î[âĠğDVŜëA‰sîsη„a§ÓI]½£o+ŭÌÔÒ´›ó2·8,wP ™ƒü|w ŒF…êĤ.x-ĠÎÒ½XĞĠ–ƒ 8#„8˙àSÏùÉŻŭ£Ç_˙4˘/˙b y’˘Fµ ;ĉZ9ó0ŠÓBÉé;0 ˜„D— ŝ)ÎÎﭞ:Üx) O:ÎĠ½½½ 7ùµÜÁ{”‘áĤF’óç˙Ä܏hşŻÒĦğqù$ QJe“¤”$ޏ_MĦ„ş¸öĠ„=•ĵuj ‰„ÉmÌ·kO€QħâTh fğ9žaÖ)δĞW‚³‡ Ş  RmĊĥŒç×~ċżŝâ܇˙i‘û½´ÁĞıŜu7ŠFQ”%IRîí7‹ZşáTŝĴÁ4Í&>C>jĜ÷[˜{<7İŠĤÊ5 QŻ×E£Ñ¨·Z­V­V;TĞĠŽû†sŝà_üÇ_[<˙ü‰ïżğƒ7Ŝߣuf7.Û¸Z÷òEÒMxµm€´ƒ‘DËé{Ó Â¨×½ÛÂ+PW˙§›[ëg–›?Œ˘è“n·Ûk äĈIdZë|‚*RcÂu£òF½iÄâ…?İÒ=ş•OÒS„fö=/”’cRQˆJ!ìêϨĤâ…k Ë|î¤ëúëj”¤î5sœ#û\#ÉûŠV'ZP[n}÷ş…s”0FÀ•Aš)„{†šs÷Âá#-Ĉ?ŝ?~@Èn“1ÖBÔ8çžçíú†a˜EQ”tw§–F9ñîJ0ŬÌĤ?d6·ó˙ğ@4­**ğèê­VkVĞñ}˙„âl{qùñŻŭÎżüò;6÷×6qqŸ˘ÁIáùĦ0ZöóEÒ Ï’\÷ ^#§ŒĤWrÓc _…ġ<˜x êÚ·q"XŬît:—÷ööÖ;ÎŽËeCu£Bs“şynD(0)ôXé ŬË' †ıïsJDk 7ŝĵü:@Ž\û Q”}u͘Cĵ} ž=hŠ™G„¸ÜÒxÓ\;ÚP06|ÇhŻĤĥèìÀ@eD0cĤĦIaZ^úġ˙ŝ7ĝk˙î(½üÎÏ(MĈXs.„ĜáœïqÎS§–äµ4nJ%F}Ŝw3˜~`r›@4KxnŒ8çŒsN[­–×h4jF£Ġh4}ß?êûŝi!ÄçŸĝÒŸùĈ?zü _~k {uŞ!ŠÜYW–Ú¸6@Ċ £~_ş(‘³Í3Úgív[£çƒp­A]ûs—·>µƒ0 ?îvğ—;ÎZĦŒ²,KKÊHbrŜhÒÀ½ßaq¨`˘U¨•ocÉ|¸ûĜ™ïÇqôa·Û½ĜétÖ:ÎvǑ ÓċTѨ‘ä“L fôùr˙Bü—ä\–ëTI£:9LRJ$ }a=B9½ò#P™ŭÚu­—HóÀ|›…‘şßjhŒŠ?µ2è*ë$ÒĈ¸…ÖV9qp֟>K @ˆħEt8çĴ^Ż‹Z­&F­ÙlĥkµÚbËBˆBˆ3'Ï?ùôW~óžŜÌZġïĵĥ…‹W;`D#àÌÁ0J[‚Ґı›_”÷{ÒĊİ´ĥîDş™™pÓĜфžt/A­|Gù•­GXú~E9­vğŬF‰ƒ‘£Ž&9ê&Ž‘zníĵV@ş 4ê¨6ö{ĴJT–ĤiñúVys>ñsp-ż²²ˆ£à'^·”aąÈ>ĝŒ‚Qħ’\C+íS(ci/”'¨ĞQ˘ÄĠ(ÔĜ2 F(²Lak;EZ[n/}ëżûŞùèoÎî½ú_˘”^äœÏyž·êyŜĤïûğġz=êt:IE™RJċyN†œ\e5 Lë `ŞàtÇ!4 :7"ß÷™³r׍F³VĞÍApÈ÷}ĞŠêÍóÏ˙Ö?ùÊâ™ç–ßĵÔ!ݏ‚$JáS€C[;·;µ6θ z–îL*¤İFÜËI$½žPFÌnìDxÖU×ŭêêŸád}}Ħ“‹?pÖîKFÛ?]F£ŽŞ9šşOŬÈs*dwŸ@i”ZŬ°w}W@)wP*˙żÚcŽà-MŒŝòU­NÖ)€5l'bBM@¨sßi3FîFĤ db µÖè߸á6LĉF¤S ޸6ȍAĵ—b5lîÔWÏ.Ÿ~êÈÎK˙çëñµŜdŒ]B\ñ}=‚í"ŒçrKıĞ]t)–ÁN0ûĵ–J5ŬaıY@´/„úg8Ŭĵ~îĝÜ>7]‘3£Qş›*~ü“ûò8ŭeÉ!Mkr&F.Ò4…Ö6WÜ0‡ÌۚA}é˘Ò§Yë Z€²]ĵ´û·!NŠO€Qñe şħ‚RJ3(Ħ5uı%@3b[ QĜ­”:›¸u. ʐ [×%²Ö|cñk˙í—×ß8·úÒÂÂŬEÎùU!ĵ 6ƒ Ĝ‰x/ t ż4 L£lĴ3…ó*8Ŭv•Á3³*ry"^Ż×½DA,8Bœ\\>ġÈŻĝŸġ=ĵĝÚĊ.Ŝúx y’  œPC@Œu£jT‘2ıt“]Ò\÷rEEˆNk3;Œí[]…o‡ëQ½÷.ô•?ÇıùεÓË헢(ú¤Óé\îvğkNgÇÁh\³ÔQ02˜ŜQgĤ;ŜïD“‘ HwŒOc 4Î>îrEP*Ĥâ˜2n͛w5ÑR^$Ÿ;ËZg‰Ħ-@ŽD7Ê&~”™£òƒ8ÓJ…Ò€R€€ĉ¤ox€éى8!„€h îä† éĤXI9Y˜êè™äoì½ġ—n½ö§/3Ĉ ! !ւ ĜĴĠjğAt8Ž0Ìǀiҕ ™BA EQjöpÜĴjS€ˆA ˆ‚Z­ÖŞĠjóžçBċœŸ êÍü­ċSżp죕˜ĵù“5Ĵo'àÔ àÌ(ÛmÁĜñ-Z;ğH)äyÑĠšRgç.rFí{eT yqa‡ë1 ½óԕïàá#éċK…aĝI·Û½âĴŬ;%C6DIL.€FÓo9Uaìŭş›JÓĠâÀ)#dY–”6NíÂwz¨sy’~œFHû<eèLJ[0I=<Ë5F½ž´á; &f[İ eĴáAA‹<’5=0×M_€SĦ­séúf„n—ó…‡~ŭÁsxbċ˙ëŬ½~ö:cìŠâšçyëï_O’dŻVĞ…cÀ4 JdŒjš)Ĵ÷˧[!`úN $ĉyo6›Q3‚9Ïóyžw„s~Œs~úİŻĵĝܓ_ŝ­³k]á}秛¸ĵ‚€0´ˆÓ\µíE—K\*Û(S½0]TXş ıœq­€ Ħ7~ ³ò×úñ“üCíÚ+QêU7`o'Š˘h`ŒÄ0ËéY`4íñĴM•Cúe†ÒLĞ€RĦŽ´ÖÚ=” sI>˘“ĝC•=İŒ´v†1˜ÔġcԅñĤƒQï˙tÖp &fïµ 1 Í)„qŭ z–ZĉŠuİ`àÚ@R‚<•ĜĜˆĠkµCżú_>{ä鯟ğöÒ˙ġF¸òÑ/8çW=Ï[ġ}#‚­A0eY&K9Ĥ2È5†'ooœîw@4á¸aßCF‰>BPĈPDMß÷۞ç-•@tâ̅gžĝʋ˙ñ˜-ÖôÁ>ĵ² ™eà”€k j”íZbl'’˘;·t–î,ï¨7LύïmÂ3‡éœ­›:q˜zŭG`ߓOŸoż]÷ț%m”:0$˘×Qı˘ióFŜáì0²ĵ~  „!›¤žb¸á@+::”ÂN)ÉşÖòóJòNžÍ hp à „q˜Dğu*L£òëIĤ‘+ƒšĤPŠB Ċm·›_"ŒÀ€ĜšZê&ÒÚ¨.¤ÒHş9fÍÚñùżŭ?ĵ@6ñĝċ—ŝÑÚ§ï3Ĉzž·êÂxÛI’ìµZ­0 8 Réğ‹ŞEÇaŒ"háZ€Ħ´ ÛT0*žJщ5¤¤ŠA‰RH(M!˜h&‚^ŭ#œ÷o…ŬFğd~áìÒï˙ŭ5µŝ‹§.˙è_Ö.~À9ż&„Xó}³^Żo×ëġNĞĠêFQ”ÄqœıùKJJ9şÀ„Ŝ¨ †Q€}úŽŜÜïĥıB˜6Óhˆ†¨ĴŒçœÖëuîĉùġz½ĉû~Ó÷ŭĥbÑóĵ%ÎùQĈĜħ“çŸxü‹ßĝ½Gƒ³ó^ ñöÛ+Ĝí¤`0‰½ô1½cX׃.7‚Fĉ†è]ş“˘Kw˘ nhF< ŒÜÇı5/0äÛWżƒVüfĝÌ£ËŻh•½ß톗ÊóŒ’$IJ0:è\#=F¸):ñ+ Ŭ—Pû7ş+”’”I’DĈ­”ÒZkU(óúgÙ%|yK>µÀĉÏÀÀ¨>Ğ´ğŞÔSÁ¨l³"Âì½PŠAqÍ)”&šÂ¸üuˆˆSJ”0B Áöġ{{)™oŸ_:˙;˙ŸŻËµwŸşôÒżm\ŝˆsâyŜşçy›µZm§^ŻïĤiڍ˘(Ž˘(X çMŞĊ—ĝ½ÙĦ|fJ(Ü6HÓĉ‡FA¨÷ĵËyžÇ†¨ĠjµDA´9ç œóœó#Œħ£ÇÏ>öè—ùğ6ŸŸ˙p%Â;?^ÁÎ^ ŞüÂĠi‹`Œ‚1€ÒրSô +š˘Ĥ™rù˘˘ŭUH7ŝĥf€e½Ŝt„ ہ?uċ;X§ğO<²ü,M> ²ƒÑvEŬ$I˘1óŒ&ĠM#só0*—Ŭ/”CA·JĈAi_èNk­•Rı1&?£ßLüĵûċky÷(Ÿ;OÀZÎMA{€VS¨Xı2È#‰Ü#È%ƒ È•Ï)'Ĉvy£ 0 ÄÙĊŭ¸SL;×#ìíp2?wŝ…˙ü˙ûu½ñŝç.˙ô/Ŝßúĝw„ĞRÊ Ĥíz½—eY'I’8Š˘8MÓ< C9 šĤÓ8•dİisU³^–’[¸³Ì’:PxĴ†jµšWĞĠüZ­V÷<Ż-„˜ó|Àäy­5 •dŒ‘”júZò¸Nv?XÙ{&=úL@ƒ Ô‡Ê%c0ZŜîĤQñXƒN˘IƒšgóKR(ä’Â’'PÚ@0jmↀJ)ˆû÷%à0PıÂŜĥĈŜNŠZ½Ñ8ñ…ß{ìÔ~Áëïżĵzùµż|3Ù½~YħĦ”Úô}ÇÁİ›çy'MÓ8I’4Ž4Žc™çıPN¸‰Ŝ°Ç'ÀŜ‰Ë΃(˘›ħnc„‚ ƒ =Ïkxž×B´„óŒħEĈĜ!ĈĜá…ÇĝüŻŭÖgŝÂᝌñ×.…ĝdeiœƒÀ§Ñŭ‘q^DÚvZPáı˘]Ú§ĥŬaäîĴ›ŽƒP[g„|zġğv^ɞyĝÈë7ïvğŬËŬn÷Z†›Ng7I’0MÓl„­ûîƒ`a¤Ğ:¤_&( Í‘Cí”RĈuu€JJ)%”YCëäħZÜùx%|ngésólî°ZZi@ı˙Zéİ•Ñ ßâ†˙ċR#ó‚œ"ppò„†Ô£PÜ@hĉŞé™Ñvĉ’íi˘œ ‚QpĜ°Lfĝ0ÌԘ·üÀ §żĝô7OĊkî\yëOWŜzé!Äşçy›Jİ-)ċ”r/˲”2LÓ4NÓ4K’$M’D&IRë“k8Ì@šôüvê nıiğn„çœÔëu.„`eù_œ7… §†c ŒħCœ‹ċÇġÇ˙üó§[‡hŻl%ĝŜ/"\]ïB+ áÌ PŞ|ŝĜÙ]Jğ\DD/<瀔¸ŝsqŞ •.]XÍ#Òߜa`˜Œñ<{Š&ŸB]ùġÇ{O<~ì™§w:ѕ0 WğŬîġ0 ÷œ“.Ò èî…Ñŭ­Ğ€4J£j”nV)ġV×ĠAK)%•R™Ö:­+•Sïu×Uĝ+W²Îq:wŽPo Ĉc0ޘd£^ÑhD 1L2žA (rnÍBQxŒ@p E 8£àÔĜnâ–ÄfŞ­=ݰN ˘Wrk[)YhžX8ŭµşpáĞ˙ùŭ|ÓW˙âîĈ•KBˆëJİëïï(ö¤”<ÏCT”eYœçyš$I–Ĥİ̲LÔ¸Ŝ(ċ4 Vä6ŝ³¸è’#ê}MAŒ1=yžÇ|ßçïûžçùBˆš˘Î9o!ZŒħ6clRşD)=tü çžùò·.?˙ÔR”3öÉj„?ZĊN'ƒTVtÓ6…kθĤĥĠOQĜşOe]z£ĊŞ+>Ŭƒˆ0TXóB!ĥ_ƒşúWx`ğvîÄħÇq|) ĞaöòENşI#f)x½É. 3¨¤ H”&@ilÄ!y%#4I’ôrJJİ܁)>¤/Ċu$O}ÔŬxD-?Éií8(ċPڀpcğ…k3Äy7F@?>"•AWId’"ó¨5÷ÛŬ^ ·Ż~ÚÙ¸üŝÚĠ_üô<‰ĥ´Ö{JİÖşcŒéj­#T¤µN´Ö™R*s!Oéžk*”ÚĞ,ˌÖZ(ĞۚC*+J)ġ<pÎ)cŒ !cŒğ{Á£”RRÊccÌsÏĈXRZ/İ 6!¤Ŭl/>ûèçO;óÑċ4[KGa"ħħ›áçW3Ĵ\_E7ÊáĈÛ\¤) Ġ"ĕ¸¨Q B½z˘\ġĦ†ĞŠlH*s•ü(‘aßNfSœ4°}é² ÈĠïÂß}-{âÜĦwAN·Û½EÑj†›Sw7ħµ,Ŭ£ğ.ÌÚè†éÌ}Ù>¨ÒìPşa›ÇŝnàÓÖ*êŽhŠĵR“RĉRÊLJ™(˘šRŬ'‚hëÒêîç6³għ…ó |†RĵÇleŭóڌ $š‘Ùm€8‘H  Ÿ;(q ŸSĦ!$qP˘}Ġäœy„ôjŬĜeÒÄÀĠ C'WĜëdĝp…CšġFsùijÍG.|ñĜ³żùϞ‰wÖ­•Oğ›W>ŜXy﵋ÑŜÖşÖş£µîc"cL¨µN1İ1&ĠZgî–c2”t÷JkI)UQ Ĥ”*Ş*µy2Ċ\+BˆÑZOÜ\(Äğ[PJ ”BŠ{F)%Œ1â 8çŒRê1Ĉ!ÄcŒqBˆG)”RŸR*!>!ħ”ú„!¤î ÔlÍ:röħϟ=qĉáC˧εƒĈbM$6w3ĵµž`ŭƒ5ìv3w„ÊŜ0ÈŜï]÷ûËġ.Œ5½hçš3È{îFĥóv–ë}óŠz VšFe×ÖÊM(ôöP+ßĊQħĥ}áñ?•yúi§ÓıEÑZ·Û½EQDžè²$_tÁ¨}¨€TA ?Ïg”&ċ2Ê7ĉòJ…J2Zk-”ı]Ižçq]Êèt-ߙۊžúdûÓóĉĝç8 N6<è$wżÑĤ§áȐMÂL0G›>˜Üp4_ĜPžÏ)ߍrazb'èJìd ;ğ c`Œ áûċ#O7<ûÜò3/ŝOäŬôúĠOö6Ż~¸µuġµÍKïŻ:0%[ĴµN¤%Xġ ċî•ğIWĤìŻÁÖ0£ßfȌÛdˆŭRzJ)ĥdÓˆB8!„ı碀!Ä+A§¸Ġ!AéV?vĉÂÑ#'Ï-ŸxàáĊ£'ϵEcŜïD96÷rĵv)ĈÚÎÂ8sÊÇĜpĥ0êŭ2A:; OġsDıëÂ-Až+dċF¨yżġO’ö›F#¸ù(Ĉĉ‹€`˘U¨ġ—@·^UŸj|rxŝÈëI]‰˘h% Í0 ·0ì¤iš”,Ŭ“ 4Dĉ}v0îK‡]¤Û "„WJ•@5ê@Âë5uZ+wµ—şä~·Q“§ƒîµO?Ŭxfkñéş ¨FSkËVÊ üs&uÙáĴ§‚ÑÍÄÀ%İ5|Aàğž/(§”ÀÔĠr¸Pžé Ĵj" Ä )ĝ)"2 Â\ŻOb`¤‹ħ›HìîĤVyq†F]ĝ‡ÛŸ9ñÄágšâ‚Ï âî^‡;Ywo7Û^½´wĥ;ÍµĠOŜ^1ĈÄ%Ppʍ1€L½+ébŽ•ûtԘPŜà B¨{ÎŒ(ÏH”àS@§vòÁ'޵–çÛ KíċS­F{ŜĞ7Û^£µàgıF7ÎħĠÍñ“OSĴm]A”Ù›Q ´"i;­÷Cˆ ”2γ`;oKióDyÑê'אÒSç½<‘ê…çÒ\C•œFûâą*˘½Ú"€̍‹  zó¨Ġà0_Ŭ}äñcoÔívWÂ0\˘hkˆ‹î ı˘i†ëŸµ›ÎT…ħ”†Ci˜†ĉĈ¨§}€ÒZ›,Ë´1FËÂéçYžç‘”2ĴIÙ=¤×íĊ}ĵûéƒêÈç<Ö>ò0 „P@jÛZE›ƒÁhàíıAš9£ƒ“Ç-¸Ë+ N!˜ï…ó8…µë#ŒVĤ˜ kBúğ !:—èä SŜa|êÏ7ĉüVŭ=öR³ĈQ6”(“N‡{ùŜöVÚÙZ ğ;×;Ŭíġ½pgsogŭÊ€ÌI:ġr n“™Ş—;F â„À[\>ÙnÎj·—Ûí…C­ùCG­ıEżŜj‹ >çg™ğe(ÇÊn†ÎŠÄ^÷ B77Ë8Èczù ğOċß!é+£Ò/²!Ġ/fµuD.,§ dîĤĥJ3 ŠTŻÛÂOdf‘"։žİÚ–Y„1. £+Pk?ßùYŝĝéıOÛGßLÓäZEĞQm†a¸EQ'ŽHJ™ qэ‚¤Ŭ8[÷àĊċĥuW9¤jaĤ!ƒaĵQ†)%6xäyn”RÚċ= (Y–Eyžwj5ı÷”]ğ²şŭôZüĝ!~èQB‚FÚց@şĈtZFċğ"À(qJɅ 890qF l~‰Ñ^ÊúFˆN1eúêißŝċî*³-•2[—`fá^ڟòaŒÀğŻ7üVmÙ~èĦGÍÙÜ=n˙˙$MTw3c€8ìäiԕ¤üĦ¸7İ4vĥóĈ܂0­^ !” ÑhqżŜ0ġFƒ{ASĜîvÊo’)DİD'VXÙÊħs%E'†8)…×ĴTFqÈİ,Œ a§Üġ]…!Á ¤: nd@²’'Kr]‘F–Ë^‡İ.dfJż+fmÜ „J¨ġ—ĦV~€ġë=qìu%³KŬnw%Š˘µ0 ·˘(ڋ¸›Ĥišçy6"=EHa¸‹î.Ż1RŞuSP–ÌŬ%—T7Qé<Ïs)e–eY’çıƒRw2Èĥ–şÉ…v/^È?Ċ‡`X Ä£ı •™˘ËByĴĊ !”É0*?VÚ L%À†ò\èÎÚÄ)·0Œ‚3Ŭ+°µá<êFŞ;89ċÔûˆu?¨g? [Û&“V5ċÚ½ÎÀLŻ^r(Ä]‚Jû`£ŭšSb4§ĴY5ŸħPĞó%NĴÊ$Ĥ·ñ°AĈ’ÌŞPc´Íu¸Ĉl×#h× É4²Ĵƒ(ÙARԋġmî½şŸË¸żKœ’!°ĦWSô.ìÔŝ]÷Ok]²k;ġA¤Kî~'îĴhù”‘ځ{V•LİÖöaŬrFL”X+7tç#ȵ—àwßNŸ~àíĈ‘w“$Z‰x5 Í(Šv˘(ê$IgYV¸*Çİ˘i ]Gè.‚‘LĠİĦZƒRı6İ ĤqÍCŭNĵ}P*ċ”T–eyžçY–eq–eažç{Aï<DWW×ĥžşŝ‹£äĜ睄 kv Ĉ†Ä”îoÚJî >ΣAcó V5yÜÂÈs<áĊJEĥŒŞ^žİ§œíŠPÓG›´/^Ó.7^Ôdg}'5ûÒF¤˜5Eİ›ŒÒšQ¤QÖß@‹ĵĈ°")–woÊŭ{½˘`8è¸~öu·—h[Ìܳç›}ĦnœışÈŭéħŻĞa݃‚îŻ*Èb‘ê·ĝ‘J•rD6LW¨Ħܙr‡__Í #BJuFą’… „ ÏQ“­C^û!Èġ×ô‹X?ŭĝ‰7dž]êt:ĞQm„a¸ÇqOI2ÈgȍŞ-˘ğĞû‚ÖUÈZ†Ò¨ZA³Ĉ„í蠒*ÔR’$EMšçy’eYÔh4:AžïÒëË~rĉÓËkOln]XàǞ ¤~ FRëxcԂİPîJŬܐ›FƒŞ)ÎrÄ)ÀY§"|WÊ+1›sbŒÚSñ¸˜ÉD]Ğ"jsO¤ß9Ĥ†òNXú•èŝ€F)ğJ Ğ|Œ‚ÑĴt›Ĥì+™Â"ŬS™%÷˘–ŭżcú½ŜPRME˜­'8ŠŻÜ 4zšNŻ}OŠëċ„zMN‹IÁRÈ\÷žç…sNö§ĥ MžaÔûlÜ”ö>§Ž œÈjí%èġˆżµŭcGß!F}GájÇkQmEQ´ëTQR„ç´ÖÓşçĤmtw8éĈĤ*—]µnJĤĤÁŬ¨Ğ26"|§ (ÍY”*Ïs™eYšçy\ĞĠÂ<Ïwƒ<ßyÀ×ŽÊ7üäOŽŸl#‚ÔĦ3ԅÑÔBêžmüf`Ô-ĜGöê\Á¤Ş'JĴb ~ɆòĴ]ĵl€`½ú éu!ïAj°ŭŒÑ7NĠC•²u\”TŜ‡œğ˘÷CgeÀ(Ù˙üˆĴX.V.Ğ"¨wy=P¨l ׺ÂG ŭ~HN;• T˜œ ’Jı‰­ÔCL[7£rT@š0[K$„Ë)è­7 V_B#û$~äìòÍÚÑ÷Ó4]x-ŽëEx.Ž8MÓdˆiaRhNMÏiÌ6ĉä³íK7İp¤ J 4ìš%Ż4.×Tä–tÇZJ™gY–%I§iÚ­×ëZ­ĥùö~tyĞóò£Ż˙âL~ìskŸ ښIn ııie4£Á/ŭÏІú…µŭVDœÁĉ– H•aÔË5 ŸhñĜ†HŞŜI††şnX=sİGß@hlßċĈÏ`Á¨†‰›¨)RI}ġ€£].¨§„Œ ÇġÛù¨^žHIİuİ×\aZP647ɜpP•AD\Œ”–%Tĝ€‘Ŭ Ö~Ñy'ĝxóòòÒÉ·Ó4]ít:kqoFQT¸çB—+͇¨˘iBsÓԍsÒŬ=0*ŽħŞÛwµf„Ò>‘=z÷ğ!ŻdF„ñèˆ0ž†-âÔ°ödÛ2ÜıܜĦN½^ß ‚`Ğä›ÏĝñÇĞkß}üêÊëGĠ‘§8[şZkĜîáEÄh[ĠŻL?™ `4¸™)m RƒvŜR#îòL| -‘ çŒôŬyĊ=-)'‚²‚BOEn>âtj_U şü̋P3S[Ö~ÔÀ1pŒ‹ì-zŠœ}]* ¤UjnÚWFާ„úÎı>Œr#͝ú#~'›ĝİÛa¨=Ĥ¸aşóôúO@wŜVb맞8ö–’ùĠN§³ž$ÉFE½ É"L§ûVn=ĴAé-†Ñ@~Èvr/ ÔŠ‚ı‘µ@5ttzġ%­7ôİ\?óĝ‘w`ÔĠ4‰z Šx'Ž0I’(³ÖÑÌuĉž@j Ŭ[ù˘ĦÇZej¨Öí…Ò¸%:L½{×~¨èp§iš$I%IÒİĠj;AlAĥyÔóVŽyùñk×6ğvġ§‡è‘'Ôk[µÀ”,Y›{#/Js.Ìà•³90Œ†íŽÚ:7ÈKßGzp2}8ÒWLÄĠŞ&@ĠWE}CîĞ$÷³íNdĈ†OLéç觝̜PĤğD%gN(òFƒÊ¨€Ñ0ev{`D³l—? Zî²;µ•1 Ġ÷Ħ7_Ù~[Ÿ˜7[gŸèƒ(MÓëDğqġDòD£4˽iBt÷Œî˜İŜ™iFS——?´ô|~Ĉ†<ážRÊ(LáyžçAPĞĠj­Z­6WĞĠĉ}ß_ò<ï0ÁñĠ˜^X‘ízá‚`Gžİ/YK´Ô€”ÒöM3JŬĜĴÓ SFĉĤ`4ì;rß}·?„·ß•×JŒÛHIïPŝĠ·!3^H§ŠtÙ¨ ÷Á¨ "S(#­ĦŠ×€nü˙ô€Qi„HyŸ Ĵ?ŭ€š£ L¸hf³û ¨ġŸ‚‡ʓKŜĉÉ£‡Ŝ#PW³,ÛH’äz’$Eh.L’¤è='òD·B•ï1Kˆîî†Ñ}şWVŸ÷g&2Nƒ·YĦ4Nnôçœsß÷ƒ êA4jµÚ\óï/úˆ ïf&.\ĊÑxîÁ_~ ¤qÂÖ/I-ŬzE”EżĵqÊÈÜV ŜàÚgr şĈ3ŭpžé=vهu/xóş¤ËGÚÁhŸu[ïÖÄĞŜ[ £ŜÜ£Áï˜eU°ÎBÊìÈpĈl˜“2˜| zû èµWQÏŻ%§–ÛĞG·ßWRgYĥ™ĤéV’$Ûqï%Iş&¨ħQ‘'š¤†&Í*šġO5jĵR1PTKô€`§šö=S-‚Z ZL žç-yžw¨£ƒ³Wş8½hócOµ€a5û6reç/-Ġ~•1}ctÒ`Hàä6hÜ#G§QfÔKS½Ï;£AÏ`F#†Ĝöšş˘^ĈÊ`an4tç2ôÖÏĦŻż‰Ó=s|éÒB+ĝ8ÏóÍ,˧iş$ÉNÇ{išFNEލ˘qšĤ ê´áı{4DWİZwGo(‘ Jièó2˜<Ï ÜjAò}Î÷ŭyß÷…K NtÔùu٘7 rü4Hŭ0 ¸Ġ:nì…ĥíoTı€Ù·ıš‘İ`tÓ0,N½!„:À"ĉéRUÑçOÊÜ < “^‡Ŝ{zu°u¤MvN]ú¤î³KY–]ϲlˁh/I’N’$Ħ3Ô$RÊ܁HMP>“ìÛ³äŠŞ]¤jŬ"µ4kÌ $ܘcBŻÎkAô}Ŝóĵ!Ä"bi3aç×",ï²#-vôI°Ċ‡ÖtŬ Lšġf0™LĊ˜„bc4vÙ F³hÜß·+ġß+ĉO‘ÂÎP Jí<ƒ:ĵ½ŝôö;˜çŬîñs뇛­6²,Ûʲl;MÓŬ$IöÒ4íj¨dVPDӆáFu>ˆiĦ‚Q¤jJ7Ğ–&…ò&‰RJ9!„1Ĉ¸çy˜jA4|ßoùßòÉó|;Ïó4Mwó<ßKÓ´“Ĥi׵ފó<ÏÒ4MµÖÊ£rDzF™*˘JU@ŞÖgĴ–†)a@" "S€‰Bl’‰s^ĜĈ˘îÀÔò<Ż-„˜BÌqÎç·3zĉzW-oĉŝœjžàlù °ù³m 0yW|£ŬL!û޽âùù€öñĦ×Üy ûĤx݃MÌËzîż}½äìŻÚPjğ3Ñ˙:ħ(L*ƒŽBïĵ }ŭmdEjħ½Kíġvŭ˘Rr;Ïó<Ï÷²,ÛͲĴ›Ĥi7MÓ0MÓ$˲4˲´˜hlŒQ dĤÉÍŞˆ†İ˘Ħ0Ş@TİZ·F- xÎ ˜È0 Ħ”2BsŞİXA5ÏóîÖB´„m§ıŬœÚ ċэ˜Íċŝ!Á΃-= R;Bxĉœ›~jrĠK²­­Q˘8^İë1ê› FƒÊHO{•zÓM #LPF“Ŝë`ä­gËa`(PÑEq7ŝ€ ;‰ÊÀd›á˜÷Ħw?‚È6ċĦ9ħ{xĦ½ĥ4Wğ(ÜÍó|OJı—çy§€P–e=ƒ‚ë,Ÿ+¤SC³€GBzà—gQ£ HĠúìÔÒ,yĤYòNeĠD™µç‰ÂáàT÷ʲ,–RFišŭäÒÜ2„ĈÇLĦ„n5ˆPİ˘ HĠşğ 4 0˜ĤQN“˘œçœ3Ĉ¸SOÂó<ßA)p·cĴ.„¨3ĈŒħ:çĵA(mvRs¤›êĊ½X5;‰ĴEÊ HimmİñT™ê7ò…ÍÙhÓn´.ĊRêĉ?9jcó-p0#TĈ âzÜÍGi<íCi"6ìĤ5À™û³ë:„BÂ@9ˆv m `²LĥÓ]‰Vaâ èpHĥQ*m5ĵ¸Ŭğ­ş½]÷6ӑRFJİP)I)#)e”çyœçy,,ò@I–e™”2w7)TC”4 š@“@„ @ŞTQ¤jŬ£aĵYÁ4Ğzšôŭ¤È9QJYß°'„SOçÜBĝœóç<àœ×9ç>cĴÎĞQJkŒħ€RZßKġĦ83sQĤ[Q*ŭ0Ó~Ĵ½€xs µyĈÚà̓ÖÑXàĤÁš^x RŬĝqjŬKŝk­zcH1³°¨“;ŭ6#ÌöĝƒVÉÙ_ƒk–×OËğnäö5 ìÂä{0y&\²=èh&^·à:mÔĵ´xi=àşÏwĉŝĤÖ:ÖZÇJİD))b)eâ@”H) ċSÀ'˲,ss³r;BK)§„Ì3l̨Ñ aĦ ÏU@ŞÖ/ ˜ÊÎ<:TÓ#Ĥyí†ûPN9 ĈBÎıWäĦcžƒ“Ï9÷)>c,àœû„ß* ”ú”Ò “êĊ(ÓóJïIJ!•bqfĵ4ÏENND ¤~DÔA¨´^ĦH0C|&@üyXˆìK^˜ ı9ċDì(7#ÈÀ$ğ@Á ¤@§02…I÷`ò. 2 ïÀ¤]˜ä:L‚“\ú‚ċ5OäœSÙŞ{£$iĝ|ŻŬ6µÖİÖ:q·T)•şûD)•H)ST*,nY gDP€JĦ¸IÎĥq g{v˘jU@ŞÂx7ĤiĦ4 ¨Fŭ=BĴü œóž‚*|.äçğÇÜAÊ£”zŒ1Ÿ1&c{îQJ=JİOîħ „x„ÑM-Ĵş‰l†Ĉ200†Ò0É}c a$Ld•cß< ž[nwŻ•†Ĝ•£„2aŒÑ¨y4B(c O£Òh­èpF’VMìcrcLĤµÎµÖ™1&×ZgZëÌÁ'SJeJİĴüXJÙ ıı粐”Rşn ÚĴŽXw(Mó÷ FOjDŒ* Uë>Ó4&ˆIş™×†ÂĠ;QJ)-ĝ4+ΜsN)L܁‰SJtß½ƒ'„pB+ŬŠç”ËïoÚċĤ”SĜ˘1Ş| ´ÖÒ=—îqî@$Ŭ­ü.|8òVŠĜE9çt^ÎPQ,ĉàTü5J)%NġĴ}ïǨĜ4µ)-§ŠŒ1F—îU* È(Œ µ™âïarÁè$ ÍİiŸÏRÄ:3ˆ~ï÷~ïŽnXĝ‡Xm`wpñê#¸˙VqҖÀ´Żêfàq9b0½uĵĴb̀šÑߣgâ 0*.”R½çyžïƒnĦrú|"hHŸc7€h”úœJĤ€SL4½µÖĈµŜ)Ô0ÁAnÔˤ|Ï8#Â`Nh|fÎŬiUĞRµî0•á4HfÄ}ù6 Fú s›Qc›À)ˆRjRHsñ¨ t£Ĉlĵî¤I!³YTÔAo€T¨Z*0Ŭ0 {~xÜ,Œ0ċëÀèŜ·H3 Ĥ€iÔk t3êéVÁgš°\˘jU@ŞÀ45˜†m¨ğN§r8n˜aÊŻaÂ×FiÚÇ·F€4JMÌ}@a 7 €ƒċ…*UĞRĤĦ`·ĦŽ Í͚wš¤Žn|Ĥéġ7BÂM‚ÉÜâŬ$•4mX·àuÌ£ħŞ@T­ HĠÚ· ܄jÂ8MО&}fĝ;ÀtáıYatĞÒ8(M£2nT³lÜ˙;M…J UkêUÙïćLÈ=ġv'ĵ6MŜeR˜lÚÛíÑ¤Żún…BšLÓŞĤƒ˜ĤŭÚA8•ÂtğbUûcŞġŸƒC6áIŞi˜b˜rš*³òbœĤ­ĴŸŻ™N³:òĤ$˜Ms߁¨ZŞu÷ÂiRéfà4Â™%'4­sn’qáfrIf†×gußQ:S54­ T­ HĠş›TÓAá4ëŭ¤1îÓhÚ.…Ñ´ñÍ(qŻŬ ¸Ĥùż*UĞRµî+8Üŝ›ĉŝV|m”&çfÒ¤Í}Üf\ÓATA¨ZŞu_iĜߝPÓ(Y•­´yT³BÁLùġƒŝižWŞV¤jŬ7p"C6ÎI€:p£; ¤Y tP ÍŞrÌ~†jUĞRµîj8ŬJ@ß ¨Ì¸DŬÊÂĜY6üitÀ˜§jUĞRµîkġd&lú£ŝI šH·KŬ ¨:›6ĵV¨ZŞUÁiĤÙɈ+˙qn>3x>K ÍŞ¨Ì-ĝŜ @ĠŞ€T­jM s ˙m2âkä.ĜœŞTnĜŞU­ HĠŞÖ-„Ô¤ßA6hr›Ĥ›ù;ĉ6ŭŸĠŞV¤jUë€cÒNîÒ÷3ß_A§ZŞU­{VÓkVv§ Q§ZŞU­_"`MÙ­ĝ·*°TĞZ“N¸Ş½zµŞU­jUënX´úŞU­jUĞZŞU­jUĞZĠŞ€T­jUĞZĠŞ€T­jUĞZĠŞV¤jUĞZĠŞV¤jUĞZĠŞVµ* UĞZĠŞVµ* UĞZĠŞVµŞUİZĠŞVµŞUİZĠŞVµŞU­ HĠŞVµŞU­ HĠŞVµŞU­jU@ŞVµŞU­jŬ‹ë˙?€ìÌFä|µ”IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DSButtonStart_420x420.png0000755000000000000000000024540012467662066022307 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊF@+IDATxÚìŭi”-Wvˆí}NÌ÷ŜœóÍóü€7aŞ ĊâX,‰EJ˘(JĤ(J¤Ĝ˘duKjËm·{µW[^íżĥ(yè^n½ìe•{ıĠVË")6I‘E‘,ŞPxŜ<çt‡ÎÙŝ'"NDœˆ{óáx/g-àċp3ófŜˆóïÛßŝ6tĞ[ŬêV·şġi/Öŭ şĠ­nuĞ[ uĞ[ŬêV·şĠR·şĠ­nuФnuĞ[ŬêV·:@êV·şĠ­nu€Ô­nuĞ[ŬêVHŬêV·şĠ­şĠ­nuĞ[Ŭêİ[ŬêV·şĠR·şĠ­nuĞ[ uĞ[ŬêV·:@êV·şĠ­nuФnuĞ[ŬêVHŬêV·şĠ­nu€Ô­nuĞ[Ŭêİ[ŬêV·şĠ­şĠ­nuĞ[ uĞ[ŬêV·şĠR·şĠ­nuФnuĞ[ŬêV·:@êV·şĠ­nu€Ô­nuĞ[ŬêVHŬêV·şĠ­şĠ­nuĞ[Ŭêİ[ŬêV·şġYXÖÇñMħûËvëIXû…JŬKÔ­Ö „vÖ%bu/i·:°y쀉ĥñĵ:êVHŬêÖ:ĝǧñ{MšY@ĞĞnu€Ô­n}ÂÀƒO `Ñ#ĝ›C€URŬêİ[Ŭzô(>ŝ(h; E3~Úĉçé!ŸGRŬêİ[ŬzˆÍx=ĉ£<zˆïI-ïcË÷}X@ĦÁŻ[ŬúlÒ×öµîUĝ ­Żŭë•ÍàŒ ƒÈhÑC>ŽĤ> ¤>@uàÔ­şµSXÎĝïĴ „ĥm#çœY–…œóü?Ĉ0Ĉò·³÷ġo’½/,mÙûĤ£(’BJ’„„2ŽYÁ†òsĠ5Ô4ÓDNŬêİ[=Íʂdĥû/ĜĥÍ\×ċœst‡1ĈqŽˆŒsÎ8çŒ1ĈqDDĈCD‹1ˆ˜El!Ĥ1$Ġ÷kĤ"’:.QÚRODD ”$I!„P“qK"RJJ’$Q˙Ê8Ž‚Â0”h5ÌĴ×ÇPMŸëÀİ[ u뉢i ´gùĜĥÍ2ñ<[–Ċ8çÜĥmÎ9·,Ëb–eYˆhY–ĊÑBDˆ3ĈĴìcˆÈ û8#"*$‚ ˜`aŒ2Ò ûœ$"‘ŭBJ™H)$D$„’ˆb)Â& !„§D-™$‰Œ˘Hj`%g#Óc°ákĥž:pêÖgŝÙ?ûgŬĞĝ ,4â6Ŝ6‰tšŸIk̲,t‡;Ž,ËbëږeqÛĥ-˲,Îı£ÀÇĥ,ËfŒÙˆ˜ŭ먷-D´Ñ[½m€>ÏĠÛ ¸z?Ô@€ĦĈ†¤ÎŠ2f”ú|D1%K)H‘z_Q$ŒÔçb!DLD‘"‘RFq')ıŠE’$qEqE"Ž ¨P…Uµ½Ŭöħ N´ÓÂ×Ñ:ôżŭÈôê1úIŭ™…à$hGšó;†Ô­GBtÚŜFù8Ž\×ċ |l×u-Îıc§ÈċœÛœs—1ĉ"˘óc"şˆèeSÀ ˘ÇsÔm°W\ħ\×ñúsAuWŸ#²öì ˜ëq"Dʟ gçöîóA@ǑŜ½2€TŜµ…$>¸†››!"J Ö>|ï ™lŬğ½9ĵ{{ƒˆ"ġ_(„ˆ Ì@‰ˆB"š¨÷'ŠAM„…RÊ0I’X !â(Š˘8Ž“0 £(ŠÄd2Q‰$IH1İ6€šĈžê5¨êj[kvMuÀT^Rżƒ„z!€ ÎÔżX€⎜ĠR·z(ÀÑß·mƒ °ÇažçY–eYžç9Ž8–e9Œ1ײ,OÇ9÷ĝ „@>c,PŸ÷÷=·Ûz½…Ŭûĉƒ……~0·`÷wíòlÇċ½•= €F‰) " €ƒ6H"`€ZR@’„0™n"z+.@  ”LH @`Š_í„ÀB`àq™Äbx÷n7£ñĈZĵuçĉ8OĈ>üŜ½h8]}˙”rœŭGD#)e(QöñIöŸbÇq˜$I˜$IEQEQ†a†ĦÈX”P³S“ĜäÚĞĠ¤ôkĴ')”"Q΀²?ŜŸSßR·> ú$@(g@ï[ŽĜžç9ĥmğĥm{ĥmğœó xĈXsî#bs b1Öçœ÷z‹KKĞGŽïZÚpiùàĦıÁÊnŻż²Ëg~ϊ„ħT7=€K‚MIpg+†luŸ3u8ís–î’À΀ˆŠ_+C>C@†@2Ŭ4ˆ0?Ä2JżgÏâ€0L$DD à~”~@Œ³Ŝjà-ì ĵ}Ö)Î"ƒÀàˆ0Yğ7Ŭğ=Ùşsk²qëĈúÚġîÜ}筛"Ž7”CġßXJı)I)GBˆ‘bĴŝ›!&QMÂ0Œ£(ŠĈq¤1(Ŭ8A-@… òT>×WÔħĤô ÙíG˜^§RBzrI?O¨„^˜S'ÙuĞ˘İÔúŞ1Çq¸çyÜ÷}ÇqÇó<Dz,ÏqsîsÎ{ÙŒħ>cl Àg`YÖ`ùáŬûO?}`×ÑcËó{ú½Ġ]>şK ‘H˜D÷$@8ÀHB`1 À‘€$€ .C˜s0H%9T[(*ed T¤ŭúȨzŝgX~ÓçA !ó7HIàÛ Óï!)%İĝA’0Ĉ ÷Ç  =ïıĵÁS0à°çâi!$÷áŭğġ›W‡÷Ŝ{çöws}üàŜ!ƔrKħ%ÜR€µ%„%I2J’dÇñ8I’p<GQ…“É$‰˘HŽF£¤ÂžLÀÔP³Ġ›:9Żúçb˜“$@ùu9ôw Kêİ!hhž60jĦ ,ÏóÏó×uÛĥ}˲|˲Îy_ŭ7àœÏ!âÀ²Ĵ0·|àÜĊƒğŽßµzèè`ñàá>ıJ Ħˆ$Á–€‘ `Z߀" ‘#ĈR!Ċ„PŬäˆêd é'¤T[iµ *ħÙ6ŠĠó~öÀ g`¤—’\({GĠ¤² †”Ì€é~$<A"‚¤ŞqÜ„3ïZ{çŬÁŜ Ïħ˙i ŸÂÍWĥÖżv÷Ŭï^żûö·Ż$I²ĜӆV›I’ ûŭŝ(I’qEIşÂ0 Éd"Àİ ¨L’^“„‡0İߞ)’2•é˜ú£$ކÄPÙa(½À;@êÖgˆ– 5‚ïûçymہeY=ÎùœeY}ĈĜç|Ž16Ï9Ÿ÷{ŭ•cÏżt|ßé³ğ÷~jŜ^Üċ„„‘ ˆˆà†°',ġÓ¤5P÷ħÚËXÎi ôĜȔ:b0F;Tµ’YŞżK™úOġZoWRO‘i\ƒ#1[¤i%H† %×JL@" $Œc€-kàÒÁ§Üù#O/ï{G; ċĈ‡[÷?xgíÖ·˙èÊŬ?ŭÖI’<R'I²ADëBˆM!ÄFÇ$IFaŽÂ0œ„afÒŜ àD Ò5ÈyŸm`ÊĤ|âĦêµ+ö„Û {ïİ[;K–kcC çşç8Ns>°,ĞÏ9Ÿ·,kŽsÀ[²,ké…KG>}éàS§ĉí%àXJ¸/ÂQĤòšMœ‘¤ômT‡Gµƒ•w6Şà„6²I@ŞÊ´£m&Qù14ÏRż‚ñó,WtÔoÈSP"d „b @H8 "İv˙DÂí„ĜhŝÀœ{ñàܙżï—„/m]ğĵyçïܽŭ­o^Ŝ¸qċšP„ëïo&I²Çñ°œb­ĉ¤÷AÉ)ĴiZtÑg˜8KénĈtk7U7ÊîB*¤áşġ˘6@bĥmcvVò}ßu]7p]7°,k ŝ›gŒ-X–µÈ[êÍ/ì9ġÒçOáŭ‹‡Žġdz6c #ÓD`à#BÏJ) •:T‹Ŭ›¨Ió?„f#2£•Ï·3ŭLj}’fş–ˈ€€$ħ”Ú 9! <‰ĥ€P´pkĵûäââŜS‹‡üµ“8Úï½óíµ›ßúĉ‡·ŝä÷ŜN’äž”ò~Ǥ”ëïo$I²EÑVE£Ñh4Îd½ñxœT{8kj“ó>[ÀÄ {7eöLe` !9+täj³ëİ˘iͨyıŜĆ|ß·z½žíşï8NàşnŸs`YÖ<ç|Qò`iyßé—_=uìı÷,=9?$†[‚àş  B8€À€ŒxĈ~SÙMÛĉdÓ?˖5pj}|rˆf?Ó󛌚" ôâĊ$àêĠA€ĞìíĜH³ÄĈCèıpĉĊŬÇϽĵûÔ×ĈÏlĵû­û·ŭ‡Woŝáïĵ•$É]N÷]×]BĴA°EÑfE£áp8žL&Ñh4J4IOÎ(ç}ĥ)ûMXj¸QEÍ ! ŻÊ.„ÎöŬ­FÛ"£,çşĠëġ,ß÷3IçşîÀĥí9˲,ËZ²,k‰1ĥ:·²ş˙Ìç_?}ôÒs{ŽžšÛ€„àv@  Ç¸S"~…˘ċ‚R·ZƒBf”Ŝ>0˘Ĥ@î) A´çB32ĴtSž‰ŬeVvB.1×ÓWu'HH‚m!D’@&1óĴĝè³ğŽœ}~×É?ûW.l]~kíĉżûŭ+7˙èoE“É-)ċ=Çqî%Ir?Žġ 6&“ÉÖd2F£Éh4ŠĈq’ċñUİ*çuÀÔtë–Ú’İpĉt€Ô­Ï 1ÛĥYV–ïû^çy=Çqĉm۞·,kÙ²ĴÎùŠçûğÏ|ŝġs§_yíàÂħÓó[Äp+!‡25 €% ,–GÌoLıŬ(5½)Cµm‚ µÉnS ?Ĥíb$Ÿİĉd –‡ `È4…ÈeŒ@I‚$ˆ‰ &dIL0NJ]XÙüâÊÑùKç×ßŝğ×˙ß|ïŜÛßz;I’;ĥmßBÜs]÷Akŭ~s2™lF£Éx<ކa†abód‹´gĤi~²xŭYİg ŭOŻħÔ~Iíğ[O8™İ„}ßçŽÁ`àzžçúßó}żŻ€hIÑŞeY{ö<}â›?púàçW"dz6b ÷¸şĜlJċ7ÎT]Hm/Y‘>ÛSˆÊ²Ñ3máÑt™î£ékŻumcd3ÔĤr Œ=)քêuJÒ¤ Ïf'"ˆ ‰% ™kÉS/í9ġô+{`óŜ³·˙èw_ù7żòíÉúŭ+ŽÜ‰ĝĥçyw=Ï[ ‚`}<où?Ç“ŠCŻ ŒÚ€ÉĜžx`"½-‹öÈ䁌 ɘ 5=t€Ô­'ˆĤ§)´²ĦĴ>Óëġ|ß÷ÏóĉlÛ^°m{™sjÛönŻ×Ûwá‹_xĉó_8Ûx°KX#‚(–@”6Ÿ:˘ĵĊT£ikÒŝGQv›€Ìo,m—uÍÀê¨ê7ozŜ3֟¨¸ê$Ò½âÀ Àá I` R‘ @"‡ĥĜĵo=˙Cǟùܝĵ˙ûWç×Ŝ½÷Ŭ?úN’$7mÛíşî×u×|ß_‹˘hs4Çñxkk+žĦÎÔL&ğx)ùá‰ĴÏ(sÖé5¤Œ1e`¤€ ;†Ô­ÇŒf5,ÌD½^Ï ‚À‚À‚ ï8Îĵ8‹ĥm/[–µÛ²ĴŬs+ğ?÷ƒ?rñäkoî™Ĝ=–Q,a",H93y.“¸2'ä,¨e£~t`DM’W둆ïO´§aĝZԙOƒRî⭞*h–ß›Ĥ|ŞċÉQ£ÜG*ĊĈJ/4’€[İ B$Cp!­5YB[ ²h÷ٕ#?u~ċÈÚ­ó7żñĞÜüŬ_˙(œ\·,ë–ëş·8ïûŝĊ˜ĥF£Ñd8F ÀÔ&ċµĊ=ál)"Y4Âjż™”˜YwàêiçÊsÛ"ÏóìÁ`àd@äşîĵ8˖e­Úĥ½Û²Ĵ}ûO9ġÜ~ċ̞‹ÏŻ<œ]AiŜ€İC@ħĦ´„ıÔPiŜ4? •Ê,ç[Ù@5RB3È^´]Ġ~0^0ÓÑ50m o~Ô˜Í<Š€E¤ĊÀ".,p-€P D*cIˆĵĠŜÜ˙üS{^˙ѓù›×ŝöżúÉúŭlÛiÛö-Çqîù?‚Í š€İZcŞ”éÏöäÊx"­Ÿdşì7ÔıìşġD°˘ĥ4uÇπ¨×ëÙŭ~?€hĊĥí] ˆöŸzésžŭŻœ˜?zrŝA"ហˆ¤ \’À0˄CµK9nF³¸ÊššVó]JĞQƒ$G•}ı$mÍܤ?VnOZkƒg*µcöĥڐ0ËÔÓáCeñQ˓!šáP­"ù€1‹Ò&\ %¸à0p’Âĝ6{ŝœùûŽ˙ôï}ĝ˙â7ݽ˙nÇ7Çıá8ÎÏóA°1˜$èQ‚³]%O–Œ+ AÉtD”öi5£üµŻĉ%v€Ô­ÇŒÍR'Ò‰ùϳQˆ–íħmûÀı×ß|ĉùŻüĜ kuO°%îdž ‹>¤òS ĉ²{ó ÈF‘Û!ŞJUÜqd-Ó÷Ĵ‚U7iŞ3Ĵ6şÖFE3kŭç£ŻR|íÇİo„^?·çé̉ZŝXÙ€)9‹”E9‚ÀċiìX„(!&‹Ó‰v<ó—£Ë˙îÙ˙ġ?˙ÖĈïĵeYÖ5Çqn¸{ÛóĵïoA0ÜÚڏÇX%@TÙÒvêKO–Œ'ĠÄT£L•Œt™›Ô…şġɳ˘íÊs *öí^Żçôû}ż×ëġ]×]pgÙqœŬ–eíµmûÀSݽqé…ùħ¸koo=&Ħ„„è!€…ĊH…4CŽ@Cíĝ"§ñas¤ QĊĝ@M`µ0‡şsÏFMNĥ*Ĝĥ|š]nêË6yĴƒj!ÓQ ´ô;KÉCíHċħ9HċËu0˘·yĠÈQùùi|Sš|“HfĜÀF‡I‰R„@Àŭ疏ŝÌı×÷uîÊŻŭ7²yíòŸZ–uŬĥíkëŜñ}˙ïû›ápËóĵqĊ.°}ƒQĈ{ì@‰İżhI–ÂÚ­’áL²uHŬú4YÑĴ}DĥëşÖ`0ƒ èAÑ.Ûĥ÷Úĥ}Ì+Ż^zñĞ?~Šï>[ DL‹”@`Sµ!R`”žáp Û!îN`–ɈŠMĥ̎*yjĈÓÄhHû•­Kš€ĤŬ¸…‘ŭ4Ëcċ'‰†oD€²jP–“ĈIœ%ÈêNT9ħ(-O§M3ÀF™nštÊÔ×[€€J™ĤġDÇ"p€ĥ $âÁ§—ŭÜı7˘w˙ĝüĠ_˙o˙dóÚċ·â8fYÖ Çqnğ{ßóĵ Ïó†á0ÜÚڊ…˘b~˜ĈŬx%[ÊjF*˜1³vgRm6ħ¸—;Ûw·ž VTbDœsŜï÷í~żïġR÷œïûËĥmïqgŸeYN½ĝÊĊ—ìϝuöêŻE’HBĴÓ €K‹ħt„jYr|`Óo˜ZŬ†êoSĊíVµW„lĈš€CFَêÊXm—ĠÎêe%­ôĥ¤šĵ™ñO$¨ÍG/דP››“3VY°.ԞÓ~™Z>à0Ò<û‘#0$`D`IÎ Bpˆ`"%lE¤`h½¸rìĝù/NŜŭ“ ŝê׿9ĵqċ-˲*`şyŜ}ß÷7\×onn†ÇqĴ›f&zĵÙRŜ{¤^*A€‹şaĈލP°KûîÖÀŠJ`äû= \ĊŠĉ=Ï[r]w—mÛûlÛ>pèìı Żŝıżx~pâÌÂFL°J‹XˆÀe*ÑĦbEÍġÔRƒİt´·+rĠ -Fߣ}B-µޏ~¨ġ>5¨Ue€›ĉ˙nĞiM°úÚœPÛüË PÔc³YOPğ4y ó=›ù†•'_š˜M-R&?rµ˘`Œ€KÓ9,+&°m„‘°K\ŽöħgVŽ;˙}oüĠġ˙úF¸ħö=˲Úĥ}qœğžçŬWliTİ/Ue<“Co*[z,@‰äek7eӊI1%À‡ëĈîİ[3+b&yÎu]+{0ôƒAÏóĵ%Çqv9޳×qœóĞğO½ù—~ĉĊ=ϸş–ŜŽŒc%Í!€be¸šÄuyĤé°Le`)€§,ÁI(;âL3íjfŞÎĉ:Ġ³Éüĝ&§S•İÁ¨3ÚŞÍl£rL<ċ~&×`iˆ`ŞŭaĈ¨ú!–™jÜ 1ËËSü ÁĜ;•ËžöÇ“˜‚0Bà6‚•PêÎcHÂ:èıœÙ§_Ù{êij?zïw˙ċċ[żùÏײĴcşiÛö]ÏóֆáĥíÉÖÖV<™L’ KҟƒÙĉ2=ž,úŒHH·Ô2íP–Hv€Ô­ÇœyžgùoÍÍÍy½^ݧXÑŞëş{lÛ>èzŜї˙ìOĵ|ŝ‡zxˆ6ż—ĴÇ\@TżIfXàڌ!ÖrÀ×AB*ÙMRҘ*kj" …ÚĈ:TŬvÏÑF•çS“f4́‡-:żÉ †CDšı‹żh!ğéÖ_$]ÈC”ı}µƒAŻ×ë ‚ Xvg8ûmÛ>tö•W_ĝܟ˙駒ù nND€ĞŒ9)#BóW–ÍHóR6~›Ôûjk#:;Ş|}LÈ,™50#šİW¨AŠ#j•éJĜXŻŞ?2?°"żiŭ%™uĜ•T*4i,ß ”ñĦJ§ġ9µ(Ëq3 PF¨Ùŭ2§èÍıêĴÎ lÍmˆZŽĊ˜Şg1"àŒl"À½­,‡ƒ3·ËŸ˙ÊÏ?żôìëÇŝ‹˙úßNî\˙çüŠeY×,Ëş8Î}×u·T²xĴÜxz]݉-AşûTÙRDBêûCFÙ½˘ÀŞ›‡Ô­OK˘›‰ġz=g0¸Š-yž·â8Î~ÇqÍŻĴžúżö Ÿ[:˙ìÊZL° BÀLT˘~Z.y 鸇˘&”ħ ġo<;ŞüĞï³ġúĠöq95ŒFí#*¨ +ê Ÿ!i+*•Û-°`dU[ıÉ2@–žŝ™Š(₁E2íe²  ëB‚k1À}g—ŭì˙âËż÷˙;}û×˙ßżĊ[´,ëŠmÛ7lÛçşîšmÛ£)Ĥŭŭ6PútĜRDiŭˆ¤j.gXrß!g;²˙¨¤ÇŒĥ j$„ĞzŠĉ}ß_ñòÜü+/üĝOÛżEdN`K˘IEcke`"݈²·ék¨lŬ&,Ì"ƒĈĥê(b…ʆMcínl7Ò~—ĤÜ8ŞŸ4j?˘*óeok6BÂ2ĞÊ8ŬWú>šLGeVV4Ñf2]™Š‹M3h²¨™J P“3yŞ5­ gtĤĈs§–vnq`R‚…6ÚĈĥ¤€ħ Xèۜ=ûƒGœĵ´zë_üW0ü?aŒ-pÎŻÚĥ}ÛĥíûŽl‡ñĈĈF¤jK&³$Ğ˙ĠC–Áħô,HĤÉ ÈY~$)ëÒğġ‰KtĴyžgÏÏÏğŭ4jaÉóĵ]ëî³mûÈGžŝòÏŝü‹Áħ3 cIp=JOŸ=<)yNĠŠô:‘ ˆHc)’ ĉ#+ ”IuşdG•:Rfï69éHUÇ[³ç*µ‘ށĦJ aşéÀĝ³dûcİŬM׺jL}ĦòïFZÍHfà„¤uY˘Ĵà™ÑAˆôëÊ *F³Hra™ñd?eĉʓ‹RN>ŬĦ‡%7&V~g ħÊ<ıÙ2;uĉ`m+n3àKûú+?ù÷^Ÿ˙Öożŭk_˙7Öh¸¨Œ×Çıë8NΖTmIgEĠá€Ġs@£„÷ħƒ–%DĊ’$¤]ÇR´“²ÎöŬ­OG˘+ħ"×uıïûŽrÍA°ìyŜ^Ûĥ9Žsü•ûóŸğ#öèm~'0"Ĝ*êÇbİ{.‹ú1ħ"“MğD:‚r Ò@KŞs0Òféu$Êe4*ÉPeĉTßÑóĉu Ró§ŽDĠ$óa*}KuoĥY‚S@!›%Cl•M”ŽHÔ^”Ş›Žt֔Ġž´PI²Ód3̓ĈµrÌArsħüëŠÇ£z3˘Â•WĤ‚1İÊLé5Éä?ĤµvĈX˘œž’À[Šá÷]Žpê ½ĝĠğżò_˙ÉúŸŝá0Ĉĉ8çW-ËşeÛö}Ûĥ7777'á0cK Ğ€SCúäëJş\›P%í›S#($ì@OCH‰D0%{*}Esssŭ ƒ Ĝċ8ÎÇqŽì=~òÂüġ_|ÙÚ¤J€Ğ“DÙ¸,$°Óì9(X‘)S­D@ D@$K@$4°‘ ĵ2&$´$Yħ€çҟiO6ô5˖(50BŭĦf†TÑöšjBM#Óİħ(Ġü‹•ÌšaAš~_~ˆ [Ġ:^ĵOĉŻÂMXah€êäj²0:ämNeÊÀ‡êµ+ŭ‰0LŻrÜÒ Zœ3à1ÁHlMpŽ@Á˘?ĝÑżùb˙ìïıġß˙_Ŭ ç8ç=Ûĥ=˲îÚĥ½nYֈsEQ”Äq,*À3Hx‰Ġ•¨Â’4™.ÇF Œ:Ûw·>îz‘I˘c€šqÁë÷ûsŭ~ÉuŬ½ë²mûĜ ?üĠW_ĝ‰Ÿ:ıżIĈ|LG…Û À&ÌQ6Ÿ Œ˘j@@eö“Q… oİ$ßQ!ùİÇèĈ3;ĞÑIĠİ›‹„ŞÔU”q˘úHeyĈœs™ġ6j ĦÏt<Í!G6WĦTrċAżH˙q¨dÔ‡šM[1,£Mcİ' 3+Ĝ Ëa‘ځE$ƒrN_ÊܰÈكòÏ&Í<ÁT-*7>@š\Á,KlEFáA$ĦXÈNĵ°{ÏÏûê½˙îżĝ·ìÊ;Ä0ĈĊ–8޳µ>!"L’D€ÙŸŒ„—ıè¨x}Š^¤ĴÈÔżJjĊN²ëÖ£ŻM•èÇħúŭ377ôûŭß÷wyž·ÏuŬ#ŭ…Ċ³?ô żôÚÂSÏ,oÁµ‰ŽİƒÎ;kp…ÂE—1“ıĞT÷Ñ@'3'HĊŒÒò„L[[@(À‘’J,İ,2Ód:ó–N­ñ@e‡ž’ĞdùŻŽ•˜4‚HyX^“›NΐMW“é*˙"4OE˘ÜÀPb.•'‡¨!™ö@”ĥ…şdGy&;]c%eJ@…ş5Y ×añ8‰ŒdTĵ­ ›ÙR†•,{Ċ8 " dÀ `3&ĜڊÀr8Ĵ.úñŭ_ ŝĝ_z›˙Ÿß`Œ 8ç=˲sÎïY–µáyžÉ`’>PÒj€ù%—óİĤt€Ô­Ğ^ÄtfdY÷}ßê÷ûŜüüü ×ë-úżÇuŬƒŽ;ñì Ïżù×ŝĉ3IÁı—H¸IpÀ%›İšbɸ†ZK5Î'“à€èd IÌHè@£5ŞĦçà¤>f"6D ”†Mİ–Sˤk”Ö 2™á›˘áÇ7Gċ`]ĤC³Üˆĥu*HĞ n9*Ùħ ‡\ñcİü9*ğÚP{AÙp-Ž·ÌRN²L%İ—ŠúĠk{ıáAĞe1U§ÊĉÎa‰é–Aݨ_D–÷ÑbİéA I£ħ€‘„o3zĉî>xfñŜ˙÷żüíŜÍ>c,àœûœó;–eŬGD]ƒ OÎRWz” DħÌe:JR']q ˘2Óîôu먙z‹2‰nĊóĵ}ĥmöƒàÔégpòÍ<@ÈÊ(†H¸@à!K%: ´ÑÊĈD¨9ÛtĠ$¸ XÛÉ‘’ç€Ò·•L—hi Mq=M5˘iµ2läĤè˘ĉ)xµü$¤éyTjFzŻÉ Òj`uËıžv€†ŸQŻeİŬĊ£Ğu˘ê¤ÙRb4èM²˜Ĵq6;•‹rŸËXjyzĠĈْBĉŒLO&πĴF,W•AR:ڄÒ.Zp²ï' Bà1³6‚qÀŬulaé/üƒ/ëŸíÛüwżŭیħ€1ĉ[–esÎïsηĥĥĥB"Š5 Żúò³†şÒÇcvP5£TĤc Œ´<&¤roRӍÓR·q½ˆyžg g0ôĉĉĉĉƒ Xġ<ï€8ÇVş#żôïżĈ÷éŻ ‚ka Rĝà"‚¤$:,$:íQ$¤ÒÑôzO:9e,ˆ20’Ċûê_ĦÀI’ıÎ2óHpmĈÇP=HšAÀˆ; MŻĈçPcyPânÎ\%*Ċa÷¨ŭMJîA*µĈ`>MVmÚş‡•ԊѵÂHo MíŬeGœ²{ĞUVڐ²04@İqĥHz`Úϖ¨ <Í@U%Èg>4hY)ÓJÄ3'XİŒ‡ Ĉ 6 ˆÁrÎoüċKöS{Öċ˙ŝЈĜcŒıœs‡s~Ïqœ ĈĜxkk+J’DyÚêJĞف„T×}Ög¤˘„¤HHß^ìjHŬz`ÄÚêEïۊġûŭŝB{]×=èşî‰“Ïżôâ›?÷‹Ï Ŭ}'°‘Xàİz‘YP}<@}8^+"%‘ĴÖ “BÁŠ W]FqsnÎlMĴ Ċµ†IÒ¤ù1ĤŬ„f!QšÔöğP™Ü uCƒ^$ *ĜjYr(´ M³ċavêĈbĜ("hŭ?ÚtUûÉYŽ(ž.ġYv˜[ġ ĵ˜‹•ʆ)H€´ö£ż4˜Ġ‘Şl jß·*=òĴ‹ •60q–ZĈ×Cgp+Š 8¸g^Ù³°|àĞë˙í/˙p'àœ{Œ1‡sn!âzÖ³4™LŞL‰A=ŬáëWʲ鴁|)’µ<;J”ß}wë#€QSÍHŻÙŭ~ßUġ˘• ö¸{Äqœ“Ÿ˙‰żĝĊ§żòµ# ŻˆešÈíf`¤úŒ8Ĥ2˘9‡Nj§ë+"ŭżŒ²·…Ĉ’„ĈŽċ¸k”àh ğ f™1ĤÇX#2£Ÿ4JvĠz5:ëíkÍr$A#.ĠŜŻ[ŻıħZ+“ıĜ”ôm{ž=VR)°µÔ+Ġ7‘ZIsĈŒMÖ.äĴ™5f„JrÊ-ì¨íò*<3`Íz£ÊÀ‡e°f˜Ħ…ĉŠ`Ê ÂÈċ°%F Áp$Àĥvï=<€Ÿü‡ßżġ/˙‹eĵüí=Ċ–lÛĥï3Ĉ°Ħ”ŭË`ŭJ)L3eż¤ï1ú§óżUHŬú¨`TĞY–Ċûŭ3??ôûŭÁ`0XQŬÑŝÂÂS?ôóû•‹Ï݌$Á¤LkD€ê-Bà@)3R"Ş`ñoáJËjGUƒBfÓŠ II&ĠI™Ċvê‰'ù€7ާ P½>3 “Şä'4 ­&hˆĞĞԞhêX£ĉš:~‚À¨ŠHM#6ôƒ.ISyİÖ8Ĥ‹‚û)2³ÉĊsRmİhfUò )7ž’ u;7Èâ}ı ĉòcş)ŠĴĉ”S–(/‹1y]I#"9"O)PáYÔ€ĊôqŒ^ÂÜXaq0gËŝ›/:ż÷ϗ‡Ż~}Ĉ˜³c÷f¨+}Ĵf"­—ƒ‘š¤†ġƒû(=ˆÉşġèÀ(ï/ ‚À››óçĉĉz½ŜŞçy‡\×=ûÈħK_ù;ïóleop7’p;’À Yä‚­˜;GR9tÊq­Ù47-H-ü´Z3Rv˘ġ •ÀHf€$ór;²â×ĈĵĝŞj/¨3ó4Ö&&eŞU/İYÊ2l• Œ†ÈĴŒ4Žb§)ìê)dÀXÔÁ,5½*áéŭÀ˜1VJ{„2À=.%)€zœúCeg =P6$uF†ÖrdÁ¨(‹ż)ġCİ R #,Ĉħ“%”'„#R­ıTï“LĜBb鎆£ôwX'6ƒ;$Ìġl/ŭٓóğͳ_ùżüc[SâˆÈc£Ñ´ş€Ù…”²”u’ÈÊŬéÈSɎò?$Ĥ7aÔ­GFUóÂb{|ß?è8ÎɳŸ{ís_üÙżù ı>ż<0LP¸ ÁÉjE¨ġi™TÑêdŜCSQPfX şğŒEsR&ÄrıKē”šYE7ışÉ‹Ózx‘Ş4ĥœĤž Í6pÙX3*ħI3Èt ì§ŒLuĞĈÀV˘`%óё7'İğ *NğòĤŽ*Ŝ)ŸzÊİ^˘ÌĜPD eàFşLG™żŽ´`Ö˘÷ˆ42™.wêa¨ı9X)5˘ŽŒ!Xġ';›ÁĤ$‚`}3×cà~,îŭ ŭw˙tï^÷ÑAD›sÎ8ç›Êìj D`‚G J¤ žUĉKx°ÌA˘Ĵ?Ñ­‡#f¤^Żg÷û}wnn7 ƒ ĜçyŜaÇqN½ôg~ü‹ÏüĝOˆĝÎH@œPʌÔMg5€QiŞT]ôècŬ¨äĤ30#HdY'ËXc‚ŭàĤ ċ½VÁ €!Tvq]ŝi”³ `$‰ Í V•d#Ş&7%Mat:Ÿ“&ĥGĈşYÓ/ ÛǍFjS³Îxt“‡fġ.9,i´¨“~UéĤe8 Ü.ŽUùËÁĴDXԌô›„Ê2]ĉ#Tĵšé‚A1°âG™ñŽ‘Êx[‰„(–0’q$auġ@?ü3÷û_ü“Ŝx/“îlDĵ‰ˆÈÑhii³—}< ¤y'Ô “²×U­6‡Ş¤Œ*à0b†·ıeYÜu]knnΝ››ë÷ûŭċ öı{ÔuŬSoüôÏ~ùėäÀPĵ?JTs66İÙ1P#j)Ğ”S¸‹`T¨¤(Pݎ”ä`¤êGR+àW¤†DÄ!<ĝ·żħĊħĜ:pjéÌ+Żq´ ğÀ8,ĥdp‘.ÁĠ ĠF'5ı܌ġĤÍ6ށ_Ŭn’ñ¨Œ¨•Ñp$cŬ 5ÖT}ĵŝ}°2Ú˘ BĊÖ5J$Ċ^¨ˆ(iY^£B­z•°HŽĊ„PdŽ<İXĈ°6½š2‘=-¤â²HĠ^l„ÂDB$n­,ĝóöĉüíÏoŝßĝöï§ÂC*ŬqĈĜç´p֏”ƒO 7F@šô‘[&;@êÀÈ FUvT Fe^‚ cFs Œ¸{´77÷ô˙{˙ŝ÷-œny#‘p5”@2ĠĈ„<•³ô†Ë7(ĴŒ[€ò̟R.]fí.s§ĉ…4J½E‰z?i‘‘Ò‡Áġ­ Ä£ħîß\·ïÜĜĝ·ï½µÜ{öµ…sÏ> Ĝ_`ˆXÜĠPP³5ŻµÏ¨4Ş;‚6³Dıψ xLD$)YTŒhÊ'ƒó°‹W}Â.Mù=ÒkGjµŭñy‚ƒÚĝcHS?R€‘ˆa1Ĥ‚ŠI°ùu)•ŭ;&}Ĉ“JoPĈÀ´Gıî˜*ôgÒĞ4úbĊ…—}œ+´°¤šá”Êw!! ¸/$Ì÷}.^û]BÎ?ù×SÊ@ `h%j¸*”òĤWmA!wƒ)”Ûż;†ÔQ55ĵÖÀh0ĝsssƒÁ`°êûŝ×uOÌ--Ÿû3ïúĤ{ĝä܃XÀòB­6"ĜžD‹!zXîUĦş ›ŞA¨…ÏĉVv2;•ñ$)Ёm4A…=˜ VK~ğËöš@‹ŒgŒkhéšd¸*ĉ˜d:jî]*@~ƒž)5ĉS•11G,ÔXŒÎš¤àŠˆ˘˘vTl–:0és‘˜>ݘTİÖ…Ë/#LcC HĠx˲´ŠŠ£/ĞŭgÖp"²R“I„qL ¤„µ$„^`œyô–żö_ڈhaŻÏ&€%³-üĦA)·vCjĴÉ[7dċğAV_’]RCF F ŝÜÜÜü`0Ĝ­œt§ğâ˙íż˙Š7˜·ß%0ŒSĢ”9˜êr8ÖFz jİĈ@ċ ”L–ZQQ_2ëGJó脤éĤ³YGˆ…R`oL&“;an!"z“Éŭ^>àµżùğ§W^ùR˙ÂĊK~ħ˜ë’I3¨î §~š6´ћ$´ĥ:Ñ´ Z6]ğLWÇTj˙™4ĊüĦżŜmÌÈ;’!gPOP(Œ'”òl;íPŽÂÒP@Ŭ˜IhÊ –§Íç1DYM 'Ÿ>,)_ıTġĤl ŞùIH™Ċ\ïÒĜÍâÄlċ LG&sÀI›ħf1Ĝ s'žYYs?êŭÊ?u¤ċZD†éÚŞ€<*PÊûŒ´´ Rú:²êàú´q–şRF†·ĞQ@™Ş–ƒÑÒÒR0 ĉûŭŝnß÷xžwòĜs/|îËżĝ<Ï\—k+†I’Ŝì8 ÁĈôĊA(‹ġ)9T 5LdĠ­ŬÙäV!)@ĠÁHè.ğê)BJ­ $%I9‰˘h8ï'I’xž·ÇñfE‹ÍÛ­ûg˙‡wżsé/|™/îŜÌrUvZZc‘ĥd@h¨cÉi}eGnŞ)Mkˆ-q#‚9°Ħfd@ ³ï‚Œr%5°?jexdéšìëXħÔK-ċ4I4üXváe‘>²%”›ò¨<Ì_sT2+"·²Z•’ê ˜Òì29!¤˘Œ˜bgµ?BÖïÄҜÇl¸´HF0R…Ó‘Ş—<1wíû~ñ‡½_ŭ'6â}ĤíyËy†IW飁U˘ħ2G"Uî{Ħrî2ÊĜRF `Ä žà*™n!#×uOŸ~ùóŻñ çq›}{˜@"R[ĥÍÄt†iô´ËıZc‘y”ÂZxjnh(ÀHhĥoeË·yó7‹Ö$ó“ı"! 0M&“ñd2ي˘hEÑVÇëAŻ- ×~÷ĈOÛÏĵĥĝôg!XX` PÏ ›GŠ“ı›X•ı^C­1GÔÈ0ÚĜGëÌ$jcFġZ5tìšjldĴ/5ü jgÙ)ġ?p6ô/ŻKb)kNd) TîÒÍ3úTÔ¨a~ ´f7L-DiïQ6¤OdYwXİ)1”²à”÷>ċżÚ'½A³˜ˆôÚò,$ #HDp{=‚½ô˙ßú~ç_ŭcp—)–Ä2Kĝĉĉf8£GJEÍHċÖU ı’ħÒِ>›`ÔL&0²TPF{20:÷Ċ/áó?óóçäìíQ ħfA­o#—İ›ŽAÙvK†„è|ûŒxd¨Dz`*Ž;mÌD¤—tĤ TŠáEú3"JJA)šL&c"’I’Lâ8Ċq<Œ˘h+ˆ˘ŝxtOn=8ù·żu|Ï+_tŸzêi î*Q†ÊÖp,œYzĞF+ë01£ĤĈÜĥázSëKd0HĈ*R ˜J_×ÒżTOl‰)Vrj\3”Ú&NÒçÜÀB:‹+^Tĉ&Ìç÷ĉ÷żñÊ_ùëO‡ÈŬq "BĤSN:‹R0ÂċˆŠ=°ĝ˜,ä8=£Nï;"ċ’].ĠÉĈÓ½‰$ÈĴqô Ÿ™ƒœ¤”2N’$‘RFq‡qO˘(ĊqĵÇñFEvm=¸ĥöàĈ…ßúĠsÏŽÍíÚÀĴ´1=‘Ĉ UjŞ™ċ¨ĉTo0IdĤß·ÈgfM²áÑTƒ.ÛQk6ž¤éuħz}Ğnr ÷^éġİ…Ĵjß/&*ç&h=Şİ|–û÷Šç‰ÈĤÊS䓠ĉ)IsRͰTH{…Ş‹ıORúĝ|`?PRoXj€' LÂf( ‚0’p+†•ċŬŝ/ŭ­/:˙ú3¸{­˘˙È@iÏòMBC­µ¤“ Œd9/ޤÏ$Mkze–eYïÛsssÁüü|Fëžıŭ?üĊ—ŝÒϞ ñaBd5#ÈkFú0=(—SJ{O#hà×Ȍ%ĵéÙtMq@ĤÔnj™§$[ô6 J"ó˘œKµHġó|…•e× ÓJ ҆óéÌ µ—+"^HĞĉµ&Ê6R °ú¤Ù”ÉÌúÍwÂ,M äE‡>Ĥ½0 ¤šb[:w’A²2ߌ@ÏÛk5YĈ›RğkßßÔŞT²Z›ÏŜÒÒjĝF&ƒLÍfßòğ7I˘ %“ċµ%Ì-Ìz8ŞÌnQ›|G\LQM€s“S?% je ñ²FRB­V…zM+˽+ŝUg†)[r8Iz6ĉä ’DÀƒM‚•Ġçĉ‹ġ ˙ĉ—Xğ•ıJuĤDa&üĠ 5 ÒŻÚÛ˙Ëgq×ôċ™&íá|Ÿi@ŞÔĤĞŝ377çƒıÁ`°˘RğOıĝìËß÷·ŝŝ³ÂrĜw‡ħ&[¤“^muÏC²p˜Ġċ·Ò,”„&#çĦZé ßyo’,ä;Ò$½: 6S¨ŭI" Ï˙¨„ˆR™¨H²ağC"Şĥ$’$Iâ8Ž˘(š( o+Žu/Š6v6onÜıĝÛï\Ĝĉóo…ŬmHĤn!¨ÒP[o–ÚH3kiÑ6SğٙµıÁ ÓµE é?[P ÍfblMR§|XîJVaĴúQV[Òê8:qÌû„zMAKzPo§UO•c§NEE³mÖD›Kz˜6ͲÌä ~ jƒú>H2ÍżciWJal! 1ˆÁf(aϞ½Ŝ­Ïŭü› żġż‹î "ʁIJIÊè ˙9ġÑ šç Ĥ ôŸ=‡ğŝgß$H47]ÖALԍŸĜĦ`„3‚Qŝĥëşĥ#Ñï÷ûKŠ8ÔùżüK˙E²ŝŬQ BĤÙTRx ÀF*ÀH;-VĈS™tä,O{-”È ŞÈtÙ)ZVĜS}oĤr¨é´wŽ—k­z Ó£¨Ĵԑ¨Ħv‡D$…b2™$Bˆ8Š˘Pŭ7 ‚`˜%= ĈGŝôúċ ½ç0˙ôgü…ô¨ÀV•ySê[ìÚ0C¨jƒġzJjwé+İ9rˆZĴŬĈ ÔÒ&N%3s`eùÀÑhM2ĤdaÚÈLsY$T$µDĴŒş@@IŬ:ÚÒ<‘6Ž"ċS÷ž(-Ċ(›Lˤra‘Xdé…Qġs—„ ž6K‰°ݞżP€éëĥ{Ï~˙ÚóíË+żûË1%D$@s–‡°â“`¤ż_|\ʂ %KÂtLGH;ŒÚ€İjñfëZƒÁÀ™››ëƒlžÑñŬG?ûƒ÷?|…û˙Ö0(. ĝYH*†XjîÓOžTÓá)Ż÷è÷$Ë÷HMn-MÉìPH|R1-i,^›w.S:Aĉ\ÊĜċœ@éĈ=H˘*Sd˙2)%J)…Ş-%‰*.İŜaǛ~­ŻLFw£ßZ;û÷süèçdŻ<À½ôFÍç¸S#ĝ˜%-“¤GA­ÔÀŒJn:cŸQƒƒo}F$İ1¨itG9áA6G!Luò™ĵ$ëUöDEíŞZ[ŒòAê ËĵUúɌáPžġêíÌ-Ġ0ż4ë.•ú²QB-É<|˜ğïêg$iJ¸ĊÒ%ßb `-À8 ˜ $ö9Ŝżŝċ/ïúŭ˙SIŠEB !¤”RŽÇc¨߁y_Íywûġ|*Ŭ%ôp;Ê p íl2€@=,µdbèġzÎ`0è ƒ^Ż·×uŬcƒ…Ċ§~àïüƒ×``˙ğaaL ĠŽoƒrÔĤ7Šá‡JíĈ/ƒQÙĥm# YfMP‘û¨˜‹$5ç“Ñ}uS/ `”³;QQ6{ĦúÏH=9¤”ġ-e£.²HĠZ%<䵤ÌԆZÚC9J°ÁÂBX‹Óz$ÖGË=—Ŭzú/=·'ŝ'›Î½+aQHŠ)ICkĠygü÷Î?zW˙'żO;QûLRKŬ´˘˘Q³,Ë NÜŬ_ò}ŸëşÇŽ=÷ÒËÏŭùż|j3‘áD ™Kfn6v<Ĥì§ + RoR¤JßQá„ĞeÓA%ћʓF Œ2—iÓ 6Ġ§=ò› •ì$P­k\Ğ#éÀ4­–TeITaK9kÒMI’ÄI’DaŽ•E|+I’u?Žì­}xŜµKמ~yéÄçћ[ÎĴtĈ‡Ö“§[ 4ÈZ³Ët­j€šħİ_¨İÖd|nUĈ 4l›5#S-ˆÚâ=J?ĥXğŝ³í8ëĠŸ“‘—O—Ġċî,F( b͈ôf[Ċ¤˜š—¤÷[dy˜ċ$fŸ‘Eón‘Ö“g”ö(Y 1Ĝˆ$  Eúì6Ĉ ìÛµ`Ô_yíŭ-"ʙRÇ2Š"šL&‘²ƒ³ 0M59Üù_?Ğ˙à÷¨Ğ!íÌşÑTG]Ż×[‚`ŻëşGWşúßĝgĈñ{›1šöJÀUjwÖk¤OĠ$CìK5( ,ÓéÈMÌHê“\50´ô4†ĥÑŬ ÌÈx"×>/%$KğT&ٙ€HÖÄşl§ƒÓ¤ğ’„$DÖò‘Ŝ회7Œ˘hӏ˘ùÉ䞯úö{ß=³ò›ŜáSgìX–]iÊĤl0)Lë3˘ĤšĠëB4ñÔ$ÓQ›LWIw PµöG5²ıúï]îMkO275ż—sĤ$‹•0=!òújĥU÷Xé@Ë̝ŬkXJÎW͸"=7i,+ËSɰ˜ħTJ•ʍ$#°Dœ`g!$$È`c+†}ğ÷xW˙ĝ÷û˙ĵID)e¤’I"ÒĉĉĤl݁”òÇÜùÏ_ÀĠ˙÷¨¤U7j41xžç ƒ@ÑÏó÷ĉĉÎ|é—ŝŜĞNŻoŭÉVBínwÔp=ĤNRĠôi€:sİÏ3˘ZÜiuzS,•f™ÓÁÛN× ihó­÷B5JşZ‚1ü7k£Ĵ.ÙQ SJӐ ĥ$²ÚR6 0KzxŭÀhúÚĉŬKüÁ='_ĝ<ó–÷*ŒR3šP³”Ġ…–MG-  9›Îˆ˙rú j˜tkÊÌk²ĴSÛeċŠİ=§†ùS²ágUäfĤĊ>‘–.df×..j†EŭH@ar@¤'Ê’Lò VFi,¨ħJ;ÌĦêûóœ)ƒD ˆEڏ‚ ²9`B;xnáîÖ÷żıüŝżK)'BˆHĠ@…BŽF£ĜPKšÉä™vNŬjYF]nbèġzОçrçĝë?÷ï½ì=Ü{{$`S‰­x@ÀŞIĜ>d´èžŠĴF•Qäúò~"Şdċr9[­6ş›Ú×µÎқ3#ÔÉèL Ô$ÛQ K˘&Ĉ¤Ĝ’T DYmiĴ \˘èA²~ìí+oŸë?˙ĊÁѳƒ0UÙQ\ŻwP“‘ òžĤásn·†8 jéf­Qê ŞFşLGÔ|b!0gŝÁ0-iDEÍiÖ"Ġ>ğqĥl„bĴyĨHĜALiûE&2p˜¤WW*ó_Ä °ĦcÇZÙT'›\às‘:ĠH‘V€G‰€9߆{Çż¸4şġŠëGBˆ‰JıO’$‘ÊäPíËc`ŽÚ*דŝ7/"üç;kĊޤêFMu¨L NFïïw]÷ĜŭÚö=˙ıĠ[Ħ€µX‚È@àg)•GDsrwEÎ(H}<•ĴŬeÓŸz×{ı‰J²`ŭ” íÓD[j(&àÊNóšú#L ÔĒôCC•%•LP7=V[J’$‰5`Ş™Kë{&Û³qî÷G_yӚÛ{;ÀˆĴW*OÔF–¨HÛ <2}KŽ)‰ÊëeĴßĠe:ޤvÏR˂ĥqèz-HRcMżd‹Lg2KÈ2%+•ĵ˜vMçó’Hsu*ç)*Ï8Ó ‘Il”6ĥĤ½J¨ĉ~3’XÖÒ#•“/,5Ŝ$‡T(f”Ċ‘Tİ+iĴg!Äa˜ÈBà“둀eßĈë§üéCá½{¸<–RŽ3ç]J•$Ù°wĠêIˆˆDJ?ŝ?ŜĝıŻŭë3}z„˜hí`0šµnT21ôz=ğßï÷”‰aŻëşG_zî…göSÇ7 7CĦê;é…Ë! bäP|h‰ŞğéÊ`TŽĴŸÚ†¨Żzì•eA¨œĝÛ÷˘Ö’ŝµ…“ ÊiÑĊkab@&0j27` Ój& iïRÉô ĥ2^=Ĝ7\ûĈ½ĞŻ=ġÊÒñ σ5XÎY*E&È1•aÔ ÚĜ\ ӃR›¤3˘™E.Ĵ1 ħ5.ÚLġâ—l¨Q[lŞUIs)ŭ²‘Qfµ‘Ç İi°Y’23¤vîT6f²WE™>0‹BÊb@‹ RŻQ6â³Y[SÁXÎÚ+˘§@ÇXšî[ħDˆ„‹”Ŝ3„ À…˙è×^>6ŝ?<Rޤ”a’$QÇRA[[[Ê£*ÚêIġĵŽ!=ĦR3°#Tu#;‚ ßïÏA°ÛuŬC‹ûöŸ{íoüÒ³ßĈiÊĥT^J³xŜ€yBK/¨ vDy w-µêQ@ċ· 0’0¨³¤*3މ2Ó T‰ ÷7 dğYYk%šĈ˜ŞĤJ8އQmqĵMî‰Éĉ™ï\ŝîÉċçżèî;q˜íç`TŠ˙QĦùYWċ½FŒ7´GN!AġĤW˜ĈŒšXM]šµ˜:Ş`DU64EĤ3Ÿ¸ÍµMÊf%Qa\ÈŞ cÀ<Ä5O{PŭKL9M³ù°Gġ9$bR](ĉpċ‡²T!J=‹ ‚ħô9Eˆl"ÀŜC‡ŭ+ŻqŬ˙dž”rÔëġ&I’„*‚DT¤ğj=İÑ ŝQYRHŸĴT×T7BSŬ¨ßï‚ Xu]÷€ëş' çUћ·ß%¤óvÔ5ic:ñ•ċ–ëÓ0u9£<ĠU…¨4V™Ušb+½î “ÚĈQÏ>k’çhĤ’lH%,´w;Ú05ħ$2€’4ԕL6ñïÍĤ‡PÙÄ·˘(Ú âxíÀhíêƒÍ;—óÁ3ğŽ=˙ ó÷"f!äyÍ +Š SE#2÷y‰O j1YİçAK]§ĥı7˜ r=M ­Êt5’f†]µŝ™Aş˜dŒ•d Ô,ëí+qŞßĝÚÈsİÔFÀóbĊ€‘RC’ÈĉRd!y2x…—è3—,`sßBĜˆ$ĠëA’ ĴznéŜÊk‹×~k“ˆ†I’L”;4QŭIU+8@}\Ċ#—î:@ú䤺iu£<¨ßï÷{½Ŝ’ïûûÇ9öü_ĝé×GOÍ]§&eh");ғŞ;gµf3Ê@–vY5ϨPİrJı9–JŒ)e€6)ó0ş†Ó´?iM†ÔìĝĦĉ-ı0úûúMg%Ĵœ$upj*ƒé!Ô§ÔúQ´>ˆ˘ƒÉĈñ÷óTpé ŭç.ĜŭoRƒè°ÜŠ“›ÎüËי5o•× 5#óÏ"³yĦúږÊĦ1ďޣ/šjF².N›D\<Yús£Cv́?¤Ġô~,„iÀ‰2ez•0mĠP<‹E1BġZWĴÙB—3ı„‘(.‘ AÀœkÁ?pt°ġáEGżéûŝ(I’‰"PL&=œ éj= v’t·%ğY˘ôşQ)4UĠ<˙Ì3g˙Ї6‚ŞĞ?Q °@6WéŸy ù0L•´"µİiê¸WšÏ@YqJ#(ÌvnÒ6A­IšOäĤĤ×ĤRC:Z~ ™~ĵ ¤ĥJĴ˘£?´éAÉxaE0 ·TïÒúžñĉÍá7œ˙֕?=tèù×yï!ˤÒ(›ïĉ˜!jÙ*²ŝ!ÚĈ”Ù60˘İu!1$0TGHèÏgÚÀASáĴ*ÓŸS™J1&İübëó–²fÖòHsġ15Ä1;Qm Í³v"ġƒQ DÂ̰zÚU?)eICp9B(T[‡ ë2†=‹ûpï½pbü_Ŭr…ĜJ’dÇq4 „28Ìlj'j8V% ‚vÓ‡vÓC˜"5âb¤Ĉ[ĴûqĵĥoĵqĝÖ­.Ü8˙êâñóÏúó —‡×p™PߔŞĠŬI­ `èA’mġİí'0TeŻi5#µ!§7SSLQËxĝâÛçÏeô¨2ô/½G³ç$T µ!sİŬ›Òƒds›JUVDUñŸŠš ä{Î\ŽXQñ³/X8rÂż>úÂö^ù—ëRÊM!Ä0I’(KbUġ¤Ĥŝ$“|GHwÖ£iR]­Öu]Ë÷}[YĵW<ÏÛïşîÑWî_³Wĵ·F"OÚ*‘ÁÊBS*':£k>ıÄĤ´J̨R3ÍnbEĠĵŻRï‡415ÓÎeúĠT Ĥ†Y éXŬ˘>ƒ„@-Òİ ^Sb F›áĦ‰15ÉxYXë(ŽM?Ž×—ñŬä6Ï~çŬoŸX|îugïħ3€ĥÈò-¤¨ Pkp7kCƒ*—qh´‘·0#CÓkĉĤ£&JWM`³=çrMJšk˜&fÔtŬi‡ĴÔYGċS–ş@ÚIEÈ<4AżĞħéˆtİœv¤@‰dú8ŽĊEiZZżQˑ_Ï03Mz•êŽ31#޸ñŞ) Ġ¸ÙÚ Ô\3‚ĉDPOf.•~q”G#“œˆfùüĴ7“„f'ƒfӃÌÔ0@İ,âQEĦŠ ÊLsQxoîÛ['/_y÷lpñġŜ§ÎZ=‡OcİÍÔݐ Ù>”Ï´éϚÚŬ>ψšCaâ€L߃ĤdәkF²EVÔ_ƒ;ŻiĈR0È$jİÊùY˘ÖŞXTԙdΤĤIài6ċu*F*ZHĠšòS‘>*èƒ ‰$„F6‡1Äq˘uz˜ÙĵŝÀŝŜÒŸ;ŝ7·]×]‚`¨XzĴĴà1Ô¤;VşÛİ İIŞË{Žz½žÛëġzA,ğğ×uŬcŻüÜßz9ĥŝÖ0ġb‹DóWP5Áfi Ĉú1&#Ŭ]—ƒO3• [µ¤6f”ŭC-Ñ Ô„T>(SKîZ)ĦAĜN6÷#]˙Ô"çMcKĠèŝĤÛFmIdĤÖ:RÀ´îEÑúŝñĉ­o<¸Ŭß>pôĊ/poe w€CĴ· H%Ÿ†ñ&9µüZNaF×§é4¤v7˜j€&§eì`Ôä4ÉtÔ4cIû|Ġ!Ħ<)™ÓÉċ;$ Iy=5ÀJ§(PR}Gù%™f1HG\0Êĉ'•·F‘€I”@J‡ÂH@" ℠N$ˆD¤O9KеYZl.\\¸3üŜ+KâÖ\×Ŭìġz0 £ŠtÇfîjÀÔҧǎfaHhY‚Àɤ:×uw;ŽsèÌ÷˙‹Ë'NÏż?J ")b{€\Ġ—˙šÉˆjµ#Ie‡\IÂĞĠŒÊ#%ô{Q Íu'+?Àiœ䴚Ġ%<íĝİOU~HšĈ˜ŞF˜ÔÓÂİEÊ£Y¤<)%€œL&2ë]Rnĵ­ ĥâ8Ŝ’díP´yäĈÎùWœl° ˜ĊÒ?mœjġ:ı†R­Ï•.iŜ_Ÿ9-ĦĈŒĤP‰QKÌP… ʆĈYcÖ"58ġ OyRFÊmÛÙïÄTÁ–Tš8‚ċd–}ˆRĠ‘Òœ‘à¨À‰S:k) c q$ ND1•FŸç£/P¸0ÇBGy°^š a,!°|°ù‹“OğòîZ’$›½^o4ITjIMÒŬŽèM²žp0‚$ğšT§ĜÑÀóĵU×uÌïÚsöŸŭɓp?&hZ ͳT&4Ó²êHYBeċĉ“è€ĴDĠêA…k,ĠU“ÊvXÍÌ Éx6Ê:=žk RŽö¸Ô)+?ŽšŞéÄg:ŭIh6=´’~][ĥ*uo}u<ĵŭŝúÙ÷Ŝëĝê _t{2Ş„`XšÚfžgDµ½rĜiÓĉoxŬÚúŒˆj̨QÎӞŸl.lĠ\|ġùH͍¸ċ?ċqLhò]Ŝ¸ŒÊ]WL“•²ˆ½Êš]QIu Ì RYĵIÄqQ”²ž(J›1r 9jĴĠĤYD@&s[2H@,ÒN0a“Àéí²7÷òK§£yÓuŬġ^Ż·™$É$ D’œ"Ŭ!샓.ٙèkĞTçûÓëġúA,şğÏqœ/ü•żñ"¸>w”Ž”BÓµ%ç:=§:+Ò@‚*5#€–ázPgP`£L⃊³1›Î¸™ HLÚ}KÍIû02`2oĊ >40áŒ2Ŝ4ÓC“ ˘öŻ!é!Ìrñt‹ĝñĈĠ{ë7.Ŭ9úÜÊág_Bk° Òb„éžHA7Ĥ M2]%ÂIGcÍš#{d;ğ*~r[Óë Öî)5#ÓÙ&ğıtÔԇ ¨&ßċF㑁V'ħ„8L Š$„ħP9†¤ĜĉÍħXĉ Ï K²î5`˜ĤŒ[ ÁħĦjŻ€<•ïÄ8É֗ž_z0ıüüœĝî!ÄzE~żFQ”L&zéîIcIO =ĴTŞç¨ßïû½^oŜóĵŬë<ŝÚŸßwáÙkĦ€P¨,@aXö‹óÉ*ÌG–kF²Òa/+²`7nˆ‚0˘6™ šX’~zöÓuµ“_û‘$îXKšUĈk[ĤÔäiÀT­1ċŒ)3=h}KQE“0 GY.Ŝ|Ŝ›6O]úöÙŝs_Wîô° 0Vœëڜ,½.rjjwóçšÁˆjÙA&l›>\ÏXĉ!2_MÖî"ŠD!4_Ÿ€Ìċğìm)“ž¤ĦŜŽÑ$(†I^3.Ԑ´î$ íaJíߌ¤jĥ͓; ”>u1†`q‡3Uß+ŞÉı“a ½yŜ_zíô…ñ•ËŽ÷}ß߈˘h†aÔĴÍuGSm }B İIş+5À:Žcġz=7‚çyËëîï-.xĉ'~úL$n„¤‚ò^‹BÓĦ|‚e‘r_w™À¨jᖕ)DeÀ˘J#­ ŒêĥÚĉ>£Ĥ^YFkÜà¨i8¤á£ÌÊZċñ‘¸úÉNë7›vMcKġLwàÀóŻ1wi/·(M‹H™KıĂò ´Mnş–™KĤOΨ§°&0˘jc]ċl“éj`4e"o™ ’ñ{Ó lM@:ZPyŝĜ"0'†˘0Ώ̤”5ş§†ÈhĤÔĦUM´Ġ•2CrI֛$1X¨§­ĤÔ"C DÂd=8à|0˙ÒËG“}Ëóĵµ8Ž70œ„a˜(é˜*‡mYıÎñIfIO ÍȎt B(&ÀÚAş<ÏÛ8ÎĦçêg^ħĉœ·ĥ İ@ŞP+Ĉ"3mld>Ÿ… Çm ÷\ÙQž ĈIŻ&0*ĊËè#ÊŒ ĉͽ$ĈĠ6–6VT—’¨>†àÑbTo "˘ (™N†ĠôNµ†ZÍô tÓCΖ‚`Ŭµñȍ;—ϳ§_ßsò<`QmBxœ6^SÖôBÚµĠ”?í2ÑaGӛ^*Ön‚mXğĜ¸l`FúµFd(dêFŸ–ô ٜ‰—Y½…)'‰§EÚĤ…â\™ˆœŻÊ, UĠš$êŒ ÔÚb4…ŝœPĠ›°8€m!„‘şĞ9+€4ŒÁu9Ü]xa×ÊäŭKx÷çyë½^o¤\w‰+T=|1hlY~r O2CšÖ{T22AVÇÙ·ï܋û_|mġöDÀPHĦĴĜBğˆP;95lúYŸR½îS @5Ġ OĈÔn‚ĉfIӔφLRSÍÌiÔdÈÀÓY–’6`ĉŜĜR-lÉôö£6=èıx%ÓC6tI³ˆozQ´w2ĵ3ùĉĈSĵ˙Öħ=/ağğƒey ˆ ‘öIĠ˜;Ĉšvc2 ĵSPŞláÊTġÔô:Cͨ™uU­ŬÔ:ôÑèĤ3ö¤Ù"%@8I #˜Œq1Ġp½lÂlŝ|UV]J¤.˜²Q!wîİŞT£Ô‹Ħ2m-eŬSš‡Ç0äi!BÄT q"‹Şr cĵ?xöé “+ï:IrÏ÷ŭ †ñx˘ıîLĴżŞKġe'(#iÑ>şŝ/+`•)ݤ%%ËÊĈO%à¨3#ŭgÎŒJ7RİfdĜœ ï“İ$“ÙiYzóQV!ŝ„`-}ÓCu´EžĦÔMqT÷ŭFLJ›WïŝÊÍKwN<żtÜ (ƒe`6O_lİ_ ™u‹H¨İ5£ÙÀÈܓ´½Ĥ×iİŬT’éš÷µ4½Vœ¤ġÊ`ùbŽ"“IáX@8Ij'-½\‡éxĜòî­ê?¨ O„*b(˙"*^ „y?’îÄlŝaíx”Ġ˘€rŬ ù3Ë&MÇ $“ÄÜÙàĈèwĊtÇqœûAlL&“0 CĦħ$‚ĉ8-xğ'•!!Ìfd@×umß÷=ß÷ç<Ï[ug˙ÑWß|Ĥ·ï`L-ı”Ú;³)X£L’˘Ú¤ÚO¤;âJLˆ*Ħ¨ĠÒò^TŞQe›œR32pzl”O¤T)*݈ K3š>İĠÀ–Ş×È£6=èr^1é3”Í\ʒÉ=úîĉé÷Żĵ}Şwéuái°,€0ÎÊ µµŜžĉ݆ISÒš›^hv‹LWmŜ5Yğ[‡Şż˘h˘÷ĥF0'0'0ĊùEóĊ­ŭÙ°=1V(DiÀ E”2™vİ‘˘N’T£mTpV_5‘ÖB„˜!H)²Ñ³9ĝÇħ€ÀuàjÌáĠÉċwâ8^ëġz£ÉdĈqœDQԔšobICúÙÑÌF†ĴvÔï÷{ï/9޳×ëġŽžûħŸ<5T÷´”ċSŸQuĴ×L¨İoöÒF žêaİǐҸɰħ˜™QCVj=ñê=Fm­Şŭ¸Éì€Dè v\Ĉ{ñĤa€&›xnB$YQÇaÇ£(Š6³\ĵ#k÷~ûîĊ+žß{àâ瘵´HÒM’ʍĤMfƒêYc[MŻ ż‘Ġ˜Q£IĦ1(•ĥ'Óċż—˜Œbâ´dÌ ”Íġ¤JOU,’“ĊŒòqĈüGʍMySÊ´>DĊç´ĵ˘ÚsD•Á‚Í BQü‚ÈY Lħ€ÉV0wÈş2zêıá7yžw?Š˘MUOŠ•L,ĦÙàD²$ë £6†ÄLġ#×uí~żïA0ïşî.ÇqöŸûħŸ|‘Ï-:WGqšĈPQĞĦ"1í7ÍUW‘ĴeµU–c€¨Ĵ.İרôX2Nz­2£̐ı˙¨‰µœ¨n<Ôr“灕 Už>b‡Ŭ#’ñާÄ&ûEġtYĜfzà`zˆ˜´ñHŸEÑĈ Šî/D›ÇnÜş|ž{u°râXŜH‰âj,zW ŜW:À4MŽm¨•™L½>£gÓµĊQCÓëĴ2ŝí¤ Ô”0Š[c§0£LR+ċ&?Ï ‘€¤,Ev˜$ŬQGŬżäĥ#(KĜT´éĦ’b“K˘Bôğ ’¸ nÏ=³{OĝŜi[ܸíûŝŭ0 7F£Q8™äÚ$5´ ĦÎÚ1¤G,Ó5}Lo‚eŽXA8ï÷]×]vgρC§Ž½ñû6„-U”•fSKKñ΋“Xżék`DġÏëN!½aĥœÀ0Œ„iĵÀ#!ĦoĉšQóXmI)SücpıoÓôP½‰%´œ6ÚÂdz(Í\J’¤jzĜ˘hC™žvċí#ĞϽnı û(’iíB¤µ™—ı^_‘´=fԜÀPŸ0Û”j’⚤C³µğÎş’DĤ 4J{ƒ´‚êCƒ‘ŝ~ùÂ(>(5œÊ*L¤uÏbV>ĊâùĤ›ĉÀC•uWı̨˘ä!Ĥ#/C°B( Ĉ`8ŝ2^ö/]:Ŝyßqœğïoôz½qE‘fobŭO˜ üħ¤ّ‘!݈ ß÷ŭy×uWÇÙñÏ˙ċgɲĜċÍ$ĠĴ…>>şŽj@µ{´>(OJsS,lŬĈùFTK`(şĝ5]Ŭ€<4#322)£Ù‰ê·Q­u`’ôÈmß[ڎé!Ÿ>³ d R^Öğ$5`ÊjK“(ŠĈAl%I²î'Ƀ#Ñĉ•Û÷Ż^ĵ}â…ĊO=‹, ÜMOÑ2fĈœ·R3*Iğ²Mş•SXĥAĤkckځ) S[öxCR }D`T:äŬ™Û‹~°ìJ‘2w’ Ĉe„ùošGˆQĉ²K?OY„u.Ħ*Ê|cİÁ ,¤ÙÌÖ+ d"9‡ÍĊKó÷£÷.͋·oyž÷ ×ëmLR‡ƒH’D@ı½á‰fIO CjcG5›·8ĵ×ëıï÷=Ï[rgÏî§.œ[=˙ìÒÍHB˘&À–Ĥı€Í´ïŞ\GP!.µĦcZƒ6dOÖL:&P9ĦFu#ÜlÌÈ8é•ÚǔW§ĥÛ+'O ıĦÚA˜QoݳŒ’ÁPS‚JßQ•]QçHOí.ɃÛ`F³Ž0&ü·Ŭäı0ï%a,Ġ-,™3`ŞL~,LZ.^¤f.£(ÚT)⎅›×ï˙Ûû\=·gß3Ÿcĵ·ċ C ÈDaÎ*ɽm3‘ĤPM£ú8”êIŞÌĉ’XÀh+†­Ü×îĤû8À({B¤:3™ŽPÁHċ~ŻÈtİż[ ²‘j>“bJ˜ċÛaf7Żth+–ÄXaÒ_À4ë.ž;éߎŽ?³’ĵu=³ÇÉd2‰g´?,éħ¤œuFÉÎqËó<7‚žëş);zúÂS˧Ï/\™(M˜D̃T­|N ÖkF•{£ÄŒ¨>³¨ZŞşédŜgQ|cÙFS£b +ŬT321+2Öd¨ F+ʜIEztlÉ$ûħÙŻÍôPĴêètĠS›NßòÂp}†÷Ñĉ‰·/?ÍϽÚ_:ò0g(!@d:ӂq™˜ÇPÌÚô: Œj͸ĈIŻ•*¤0Ĉ0ĈGÒ û ƒ‘;—3³‹„†|"ĴÒ÷²¤ìfF,d:EĞòĵ`ÜMóÑKSAj˜ôÛÜô:-LĜQôj4Ii0†Ô Ö,#~Z`¤Ĵ².f/cÍĉjFZ‰ÔèŠLĤCÌĈÎh½G%½nüIšÓàUÎ U{ ÔIS$Éü)÷Vüö3ğ’ï\uçŽçyï5–Ô6¸ò‰`I% }DväAËjG{Ï_:ğ|òìü•P¤ŒH Œ8*ë²v-BÙ šu› J&0ގ™(Hİ$ġ†cÖj<Í5 ÍŬôÓúŒÈÛ``XP˜ĵŠ"pITO ́é#ĉâé=³˜ĤMİ­™²ñJĈ[÷xíX´yèĈŻ^ğ8:ŝâÒ§ža/wˆ,–6|JÒj’ÛKí– ,§´ë7Ét0™¤ş'¤öŭ70*ġ$)d25ÍJ"eJ¨Ô“rÀÉjYï"•còŜZŞ·Fċî9Càˆ ¨ôÄòżIĊày\uÏÜ~ï€Ä7}ßżÁĉx<žDQ$„ĤfÙV–ôġŻŭħbIOšİĦ•Ùĥ̓ <ϛ³m{Ċĥí}gú΄”²#=mğ¸ĵµ.k,G÷”v,mÒ+€ h´S#éq˙UÙŒ BMCÛÊ7AЁÁ´i—¨œr““İr$ëX˜§#?ĉ’Ŭ#”ñÚrñĤ™Ĥ2&“éAġ- £(Ú âx}—7şŸĵ½uêʵ?=œ͝ßw¸×K ”ŻcB0êҞ4](†IUe0Šc £­F£¤hŒÇŒt&Xž£TŒ™0֓ôç”דÒCmħíK­Èġh-"­–”– ¸êë+Ħ1•e)"ˆÑ;ĉܜ{f5úÎUÇqn{ž·ĉûŝx<'Ba¸&Ÿ(–ôĜÒ²#Î9ïġzžïûëş‹ŽìŜwñı§Žœû`,@HÊe:ޤ“ĉÎşJ+·ÔÀ¨šn]­ QelµIŞ–îŻJrwó j70è͘À`|Ĵŝ“Fbg)ĉ˜ƒ>‘ÓW>UӃ‘1iK!5Ĉ:smA°$Ƀ“ëw÷ÎĊ/îÚ}î%†Á.` $d:6=&0ĥ§vËöŒ: A0Ĥ ‡²š?`dŞ–¤j=)³~gRĦ%$íö˙LîËĵċdT}L µñ렝b- %ˆX€?çUïÌÁŬá÷8Nróĵğïo¸;Ž˜o“%u€ô1֎,ÏóĊŽVmÛŜ{êG~ât($܎d~h‘•ñÌ˝5³R5aĦjb•š”w& ¤7dĵéÛ-×Ĥl:j”ÛÀ0#§á&Ż<cmAcGDiÜ G|âÒ#`KÀžĥczhĤ|`–‹—Ġ–²†Z?Š6˘èŝ\ĵuâúÍï=…g_í-> ,˜N‰d€Œ@FÈUÒCUXl£ĤšÑhœÀhKĞ µXğŸ40*Ç 5ԓ¨¸ĝQëOBDĠzDċÌËÒ×d5(Ş]XÙż 8$ĠŠY?‰‡˙s{|ôâJüևëŜòK½= Ÿ7ĊÀ@ÍR‹lHlbF™B`ß˖?b”X{ÒÉѰíšĤÍ]j3=”R€ 0ËĊKÂ0 USíP·XߍîFï Ï\½öö ˙ÜĞNÏQ@·Œ’H€ŒI5mfİ ¨1]€ñ(†­­’X´îT0ŞĠ“(3=i‡Hm_j´“Ycj["-ߑŠ âÖ£üoQ18°Ò,Žâžp‰ °ƒ]pŭÁ#O[Wv9޳ìyŜ]×u7=Ï ‡a˘ŠŞé 5AħcHír@óà=gïûçy}Çq–,ËZ=ŝċݜOá‡$/!K³Zx0RF,mŝXeB†ĈĜ޵[Vî5*:{Œ#+Jâ@›aóŒŞğ‚4ŬpÑCe0ŞcĠĤĴ  Ĥvܚ‘-M“ñĤ ”nzÈÓô¤‡$Ib$> p¨ĉ.mĝIòàD¸qíÎïŬıx{߅••s/2VOÈH1µÁM ‡ŒGIá”û ƒQ½iĥˆe(Ç/ese\xXaFĈyP+ËJħ +…b~?iÇ7Żş{Ó÷ŭ5×uǓÉ$VĉíÁĞr¸êRSÂ6Ïu]Ëó<ßuŬyÛĥWüıùŭ{^ĝüÊfB)pˆ”Ng5ŭÂa²ÒµÚ‰~ SIèҘQŒô¨ „¨>İN½fÔÔM/ͨbĵaÉ` %4ĥ]™˜K(zğ`g‚’-m÷†nËĊcÚcLyx­Ĥ?)›ĝ0Š˘M?Š6–˘î|2 d€ Áxp+‚p"´‹ Á8˙ê³ÄŒJçĞb¨İÑòĊ Ħıî ú”ġ•[İSĤU>ĊîKĊ^–ÈSADŽ‚Ĉ!ûàúèàİÖŬïĜĥ}÷ŭ{Ş–UÌ M ³§ó8Èv 5X½§ÖÇħÇq;Z°m{ġè›?xÜÀú`˜¤/(RšûU‘Ìx=`N͋­‚rċ¨tO™¤şˆÈJ Şm@SÍL›B½ÎE€C­¸25fèagÇҟÀpG2¤mÊx°Mĥ„P·‡›šig2=h3—²ñë^mġ7ŻŻ}kŭÂÍkoX8˙9Â2Œb2’ #YjìÀ¨|P+?‡²K•ôúOv°UĦŞjà_x§Ô—œ)QŜGŒ;LÇS éž$@Ε²CàÚ îù§–'ï´íĝŠ8óïŻyž7‰XŻ%™˜Òcinx\’İ˙¨4ï²,Ğ×ëyëlÛ^²,k÷×´o3‘0”J²>—„*ûg6\ËèS’ít0jKï&M› Ĥ׌f•é¨áĉ/’ı€ÚFÓj[úïͤ`Ùܔy´£é#š ²14IyÓú—JĤ‡Éd"UïR¨ŝA0Œx½Ÿ$kgÄèÈ{żöŜùÏ,XËg€ÍíĈl I’ĉ•O]ŸM0Şĥ=èġŸTĞVÒ\w9Sa /÷.eL JŠDµsĊĤ|*&(”“O@ €`?ğ>Ûĥı뺎ëş=Ûĥ,ËZŬóâЇF1Áz,@ˆT³Ġ“ı3z\lÜĝu™„šáœETkš­ŬS³M7w&ÓŬtÍ5#cMĥa`0~ŻÊf¤GÀ–ĥczhİêˆ 2Œ·•Œ7ŒxS™ÖÎıë7Ŝıáö½ĞĞÖŝsÈĉö2 HĤl e1Œĥ…}ĈÀHUïNġWDiURdJ™ŠYi8 #i•ÄĵİtO ‘ÜG ˆŝ!çŜúž³óÖïÛĥ½àyŜ}ÏóĥÂ0ÌÌ Ĥ[Àáq§ÇÙö=Kn]àşîÀ²Ĵ`iy˙òSï •|,IġĠ™£4…×pˆİĠŒŞIŬ²6ĊQŒ•ŜŻÈp͸Ñ6‚E/Y[‚ñ‘÷ż{íüĉgĉ­ŬgħE Ì°¨"†¨”TMŸ0* AİT‘é0Ż–Á˲Œ&ñAıV‹ŠZ1hĵ™!cŽC`ƒƒx+Ü{vݵùVfnp]w‹sµ$74š:É„JïëÉ Ḛ̂´rĉécÁžŭÁ;[‰ PU,À0ĦYCÑ%8SdP™ùPiĝ^ö½ f’áĤS#êoÏÀŒÈÀòJàC^†2Ì\R‘4(€wˆ´ ĥ†·ġM£ÍôlzÈR͙§jKĵ2 0RjÓ\ĵ8Ŝ8ĉïl^=ġŝŬËGĊçkġ ï%)3˘D›œÊ0}íAOĜı`T%5ŽPo¤2UOĵjšlàJMu\ġyÔ-ù†ß™ `qpzóp ÷î:h½·jYÖ˘8}Ġ(;F˘áš‚&ŻjûôY¤irĞÊuÊÌà[–5oYÖòÏży\H€µ$µo‹Şœ`ÌĤĤğr}”f ééßÚ Şĵtr‚ĥáz|3}fÔb` êŬ×"'ĥĠ•PċÙ}–kHÁ–>ŠéaÚ0ÀYMÙĝôHĥùżÇñşŸ$kÄèÊĠ÷î]ş³vm™ïy™·³”İF瓢‡ ‰Zc­v é÷&êġ¤’œĤ€'œĴ7)'Qiŭ§VÀÉ #íĤ˘l\zvc“@a‘[­œ­ë—Ǹë;Ž3TĉÍĉ†N²k‘ëڒ˜eY–çyž8}Ûĥç×ÛµrñùMAé‰]Ê!ŞAİ^#Ĵ3#ÓIˆJ SIi€Ìè@•)²ín:j¨Ġ´PJÚCó\)İħfDm~u3¨|N$Ì˘Ô‘…ĝl“-™dĵĥġQL5Ĉd…a8Qliӏ}^xùŜèäċûà󕓀N?u…R—[,[d‡Fe™.›8‹Ċ—fİÍç£,h•ò1ğ‚ŞÚQ17ÔÀ(?Ĥ.<´âXë텛£Ġ£'ĝ­Ûĥ畊䨞$„fsc#Û= ’]‰9Ž=Ïsm۞³m{ißKŻB•Ì $İ‘¨Yħ‹MĦn:ó‘á¤ğċŞÍ°9MIí6ĠŒÚ'½ÖA ^Ò1{Ġİ%¨üÙ­Ŭù çĝÌ1ԙ>²Œ÷qšŞLIB%/Ğ-ݰÖ|tşÇëO{ë·l]ĵöàƒ}|˙%Ĉü€“6ÑFÀÂTÊËF'àΣ>è)4ƒ–ŻZÄaE–#rò¨¤Š¤Œ ÓôC˜²~ÊDZ·á>î^dü­˲mÛî{žçUz’fïIúÄ”ġ˜O“\Wú1Ĉ}ßwÇéÙĥ=`Œ-/_za˙DL’tĉ‘d´’Ĥŭ5^ĵù%Iµŭ^wÓe°˘FF·ÜŒ“^iÊMHµ²öu4ûĜñ6 Qâl0B +ìĞĠ!„ŬÚĥŒ7ë&P•ŭfHMŒIħLÂÓjÇAlĊqĵäĊkK4:úŝwŻžÛÜó̜µr˜·’Ğó"Êt´…>qÛjŸ|0ŞÖƒó¤ ]ĤĞädĉĤ߂È06^ ĉ³#bڗĢAx{Ĵ{='ç­ßµm{ Ì_< CĤÌ ĤĦO|'@j“ë-ßĥmsÇq\Çqz–e-zƒıŬ‹§Ÿšğ/ „j<Ë/ˆĴv˘K¨ıë²hx4ÓqqӒPŻTç!5µXğÛtò}%k äĤ›F6ö"µXğM7^K²¸ 8G@Öiv-5‘Éô0ë0ÀĤÑ™é!³ˆç½K™é!ŸR›$ë'ĵñíġ[§?¸˙ŝq9›-@€1!˜*Úç·ôĥÁHżÙÓħĊ䄂•N zÊdî;óŜ†aé™ÀP"@Ĝ6Á~¸³µ°‘]]²m{à8NÏuŬġÍÍÍĤ[ż?ġñ[tP+0ÙĥmıëY–Ġ·,ka÷3/dznl$€@yÏ5ĜÍòħY Ò;ħb]“}›Œ,&Ġ;Ê·€ÉbN•ĝ²LSj7:Qû\ô*›ŽĠ3t@nò8›òĝn=,[ڎéAî1Ğ遤<=OjÀ”™ñBLé0@/^;ï Ż|ĝ½ğï-Ÿ[â+g‘ö$d€˘€ĞÁ€˘&2TĜ)` gÓ,I ċ‰³¨™ Hk¸£”ĉd]/ÌÂ9ŽçÁÛ5àĴXV´`Ûvàyžçşî¸Ám÷X7XAİfXÛqß²Ĵ9ÎùüêöE`"(‘iŭ¨VS)Ëv™; È<,O£Ş‰ÀÜôŞŻİò˜r³fŞŬÈéڝqÒĞù~7G•á†§Ĉç¨6Jˆħ#Hš-Í*Uóñĥoz¨1ĤŞéAĊ8FQ´$ÉúA7ĵ·ëŝĝô{kö<çñĊÀü9ÄbĦ%èc> Óxŭ?á`¤ïlĦÌ­%~çÍĠ( İE AUÑ0ĠŒšžQZğ³â0áĴX÷£•s|ü§Š%ıĥm[AsÒcáşû4iıLrëşžmہeYÇġVĉN>5÷ I۟IÉURï)˘ÊtĜ:8HÈ²L§%'M†3ïġÓGHıT‹ÓĤdÓQù—j½ÏÚÜtµaIµíŽ:W£fKUï4=Sƒé!T6ñ­ 6ŭ$Y{Ú^ğquíҍwó=çëd6P$€¤(À5ÓCà<İ`Tŭ4RQ>@í•ĦĵMÉ`ŭ.µˆÌFş,*$“À{áŝíÁŜEÎ,Ëê;ŽğksΙrÛ=ĥ²Ŭ¤fıĥm÷l۞_>÷L*× …’´ÈèJËiY ˛>ƒj­ŸŒYcJTĊP=àP½µÓµ]ßċħ4›f`dM?§”\Ħ•H0‡§Àߙĥd’ŭf5=4•Áô–RÄŭxc—?XÙğĵqċéáŜç|ġ40¤ĊÒÜH5â˜*s ıcÁˆò(!mğĈ’$Q>=·~WdşÒ!·î ‘ SòhÎ\îòüIĈ-Ë8Ž8ŽcÛĥÍUĥlÙs?UÙîÓ45lKsÇV iÀ›_>˙ì>LŬu”Î=ÊM*ĈB|q?j#KŒ5#}­&5È,HÑ`íŜΤ×ÖĤWh–éjy0{P3‚ ˜Wo<2€+%Àĉ€ÙFÓ­˜Ӄ’ñÂ(ŠĈaĤlɏ×Oy[nŽÎ}xïòádß³[8Lş =;v‰ò-żÀ¨$£Z—e|SħëcVC҇³ÉÚ}—żbmug˘Èˆˆĝ’³!—{üĉ;–eŽx–emA{|§—,;l‘ïcŒık[–pΖe-.ž97?¤$‚ Z֙E6£›÷ùšdEµì:ó …jÙs†´‡ǎ7^ĜM2”ûäL¨Ô€Yŭ Ö İcP‹ïÖÇ*=Ì0@½CÓCÓĜôj`kLù”Z5Ŝb½ïĊëçitċË·Îß[ı°l-Öß ”°B␏ġ–Bî(0ŞĊƒea•1ĵÄT“ZÈ Nı—AqHŞa=Ĝ k›ƒŭûĜí9Ċ’<Çql•m‡SJ$ĤkmGÎN˙,˲ÇñlÛ8çsŭŭ‡öıËğĵĞ[‰şÛ(ÏÓKú¤Af‡—â“1ÜT# Y£lyl¸i,ùĴcÇĞ×0m'(•fwÓUŻÚċŜÈ( }N:%ÄôÀÍĝ§žÉĝYgKĤM£mà4ÓCcÒe<‘ÉxjîÒXӖŸ$k‡ÜÉŬĠżwĉ½ûïHöżàñ…€ĥ—Ö‘b™9Ä o€‘~E½EcMċbl~*Ӟ*ĊFB VáŝŭÁâAÎç-Ëê)@²´Ê,ÙvŸĝMŭ¸4Ĉĥŝç8wǵ,+°,k°úÌK‡£DÂŭP¤½AÒÜncœzj`&YMÔöu*EŒĤŸ%µ›ÖMGÔXM j€­&k7h.?وF!GIWCzŒĜR“Œ7ë0@ŬĜȔ 0=H)P*^ĴL(ŠĥÔx‹µsŜÚÍĞo_ŬĊVŸblî`ÂÓCž‰úQ ӛdî' Œ²÷0RAİ•‡§LIO ³>Żqyíŭ³£=ÏöùÊig8qq: 0_Y“-jOs+‹)AÇİ6—pS˙Sŝ>c !`°‚÷Ċ#s|ôÛĥ2ñ†ôX„>᪭zĤeYÜĥmDz,ŸsŜ·lgÑÛ¤wOHQ9ċSv„3“bU½ÒòĤ1#cŸRù„Ò–ÚŬ$ÓÍŒŠ:ıĤd˜M녢šTÙp—eÓÓŠw•¤ÇLĈƒĜR56ĤİĈÔLµa€™éAÍ\Êj½8^?nÜğ3:˙ÁÚqÏE‹Íä6 gŒBCFë“ F`6Ğ)=̙FVëϋ J† Œ¸ #“]…£ŝîĈĉ8ç}Ûĥ=ÛĥmÎyĥÚF>éY†ï”GN mÛÌI=‹eYŭĊ3ç íZwÇIz‚ êĦ_6oĜP@”YŻ^Ċ§”’ĉX“0jœwÔrÁ×ÌPHj384fDSnĵ†^¨ĈFa0÷I‘& §²i7â1–ñÚLP97Iy4‹”'Óhy9™LdÖğ¤ÜxC•‹·1ï'kÏàĝċn]x°rqÑZ:èĴ÷ X€Œ‹ñ T ‡|òÀ¨zŸ=:Äê„ÖûĵF†Ÿ@` °~~À9Ÿœ÷lÛöÇħcLK˙– ûñ´ΎeHĤ?FLĥm[J cƒĊ§.ì‹aQ™ŭ¨‚GSŠvvBÑÛÙA–ïĥjџ¨ñÚŻÑÔ¨ŸŽ2Í}ÍcÇOkÏ FMîıĤ€ RL5ˆcޏwŞŬc˖ĥkzh%eÓCmJ­^\RıxY`ë$ÏĊ‹£Ŝäîêƒoœ}ïŝ{Ǔ½ÏıÖÒq@Ç$8È$)ä F/‘˘mB*N(Ïü+^i[`”×$˘˜cˆ-úÖÛkYáÀ²,ÏqÛ²,Çñ4…ŞiÏŝXoóOegúĊÎ9ކ.‡s0Ĉŭ'ĉÂ$u•ˆRÒİl™ÌZ;Ìzw°vŭQ-[§Ò|–úĝožN%Û@KLMÖnj“MßYî+aڔ›ö·ċHHò†ôä°i2ŜvMÙûMĤĦ™Â(Š&™é!Žuϋ×/x£ĞׯŻ]ĵıqmßġ4˘ğò4}@ ġìTÒ FÙMXŞċ“ÒT‡Ĥ§ÙFúƒ2§Daè-ÂÚd°™­ġ-ËêÙĥí9ŽÇñ4ùö3›Ôh÷fŒq˲l˲<ĈXs>p÷î )Òb H´ŠZ˘o°ˆGŞlĠ†I­ĠŜP“lWŒ¤hĦĜÚû²zӘŠ$Ô"SÓfÌϓm7e›&ž'2’Ôġ#=liğ§Üĥ\<Ĥ=Ĉ4ÚbŞé!‹ Š˘hÁ–Çë{ĵèŝÊhrâ{ïvĵûı_< è €Ĉ˜@ĈÊĈĦ¤y?i`¤8MŠÉ²„¨ŝ׆"ŞĴ‹6 BOĉŝ*ĴƒċUĈúœsßĥmÇĥmKĊé’Ŭ4³Ù'NŸ ÍR?2ġ1U„ó9ç½Áá{˜ëYk$} e&™wġ*óÁŒŬ@ı/İ)aAjš.•!f'ÚvÀÈ „ċ/šŒš<ıô)˘Öïkü:ġĊy#z·ž4ĥɖê™xĤşÒLĤ‡Š„·•·xÊ^ż{gxñƒÀ=8_8 m`Ùĝ )ÊR:>y`¤*­cgSŝäImÈèT0RĴ+ëKâ½XAŸÙlÀ9ïY–ċĞ UÓ°YÒżw$CÂŜGÇq,%×ùœóŜÜɳ{…ÇĊ %[zŞYqY*G)ͰùÊÊE*uĈ2£\FĤ ĵŒÚĴŬM`¤È´‰³mmĵ[dş²Ħ"½N‘ż²†ôËxĠô`hl¨m2=„a8R­ë ^²È&GŜ˙ĉù[ĴċS€ö @T­’ÒkNha•òÉ£òaWċÚĠIJt£YÁ(û]Ġ@ D|ŜM˜ğÌyX–ċfu$!DÒJŸRË'í²İ΄Î`ËU’]pèĝ| En”dL0ôQH`j*R9ò†jLFN;NS-ÖufDM5£0˘í\ĝUžÖôJ3bS Ċ€~ js·![2½ŭ¨Mz.^Éô ]ʆöz½M/Ž7Žy;›ë§.Ż]>&ö\rĜࠍ €§Ê!r5g)!}Fċs!{£òƒK£Ş Œ´ï-H 骂 1Ĝ;`[=ÎıŻöT†áԑ>VĈôiŸhĴqÎıeYܲ,‡1pÎûÁŝŭqB !e1sÄĜtZnzÍŜ@5݉ZĵTŠŞşċÊ@ŭR‘­ħ f  `3€MIíMÑĠż5µ_àF3ş:pn‹ŬP¤Ê–ĥczhİÜ쐁”> Pħ0“ñz½ŜVÇëŸĴ]pGWŻ^żñV˙ì _} Ñ[$'mĤ•"5:0ÔÒB°za?Ö`TûQr›5#Ïèt`sË_™Oë^VG‚ĉŝÏOm=úŒiߖe1ċ°ó8çÓë/Ĝ+{ĵÛ1î:ÂÊXd0wuWp~÷™¤>µf`˜6ŝğ"ûÍFÔbín#šAĤ+î Ş `ŠLg²ıSÄ­âìòğġD²%Ĝĉ ĝ£ Ĵ1&ez*/#L“0 ‡qoù~ĵħߋ'§÷Ŝ§'+Ï|ùdʖ I !3sQAġq#ŭy= •ĉ ²{ğ`sŬë1ÎzŞüĦZ÷áÊċc×A> @¤ğJ3ĈPħ#—sŜ›;qf ûaœÇĥgŞÔôêÊrœ¨šÍ$i#uAIŭjd/Û#ÓxÙFË[Ĥ·šÀ¨É.JSd:Óç¤ŝŞÙx¨‰²‹Úa2ŜÇ9 °Ê”JĤ!D"„QEq‡q˘(ڌ˘h÷ġsîÚíû[?Üĝ`^àĜßÌqĦRÄe:äĦ9&ǂQé)x´jû>lÉ Çl–Ivv…!<&(·}ùq˲,›sîrÎŭŝÑÓğCI0IH Šüġ–ġ;IÛŝA 2Ï=Ĵċ•ô™Cí#½Ğא4ŞĤázĉKoĥš‘İAĥÍÀFM ÀĤzRI&Äœşµ#dĵ*[˘†MjÚ0À6Ó‡ÓCǤ€IwÓa€ŝĈ’—Ĵ-ħñÑ÷Ŝ<żħtqOzËi]Ĝ²€’8ŭĥÙµ)è3FEż%Ĥħ„|;w‰ħ‰§@ÉҌ ÓĈQì8—Ŭ´ÙU6…êĉpÎ}Dìyğööı‹RÏx£:3Ò5„òñŽrû7–€Êùk³›ÎÌŞLš>ĠŸORù,`D-xµVCv@À*;.•şÏğµcĜ’IĈÛÎ0Ài£-LĤ‡ÒÌ$IJĤ‡8Ž7ĵ8Ŝ8éïllNžşüà½#bßsï >Z2VϘ€‘aËbFúğ2<%HÚ}Ĝ¤`×Û 8çŽRŸÚäş6÷cİÇ1ĥVœsĤ 6c̜ûîên?ĤÔî)TRCU‡"KhÚ óW­*Ĥ^¸§Œ;&™ŽšžôQm#ŞßCfħv7F#É6p””F&IĤïuyv;-mÇô v˙FĤd'“”—ÉxRĤ8Ž( l ‚`+I’ġÀKÖ.ş£+W?¸x³÷Ô2_><Ĝ ’ÙĦHÇ[0Ĥ~ µ}ǀ‘ŝ3‰˘_€ñș_`ÌS{ŞeÛĥ5)RŬŽïCšiçÜâœ;,ŭöÒ.÷n$*7-o3§45½frĴ] ffT5j–éÈXhİKdMcÇÛĜĴ†Fk7˜X›ĦŒROonJˆ0 ‹h—níDĥ4ëUµŠ<ÓC6 Ph3—&Y`ĞïÇëĵŝJĝ͓ßğüŝépϳ>_8äú€‚Mb-'NٙpŞŜŝä‚QĥD’‚1 Ÿƒ‘tûÈÏ’E1­A֘ESiĤ†XĊŽ,Ĉ˜óĵ]{—ÈvùÚVšP´h‹f™‚$%sú až‘vÛHĈ?‹›nZQËġ7cÓkñİú=šáo£8Š*êĞf>"èœ ;–-UeĵOÚôPÊĊËjĠÌqE›qox^ĵvŜ_żygë╵÷²]ëím€DĊiĵ 1Ĥ]Ë;A-€ °u×ñÑ@1$Dz,9íŞ{òŽlŒĊS˘ŒŒ1°Òż–9÷ú‡Ż„Şq,IHËO˜‘5ĵÎX‰ŬİMI%ht£5Ñôáz ×Ü6š^Á8ĥ%ÒhF0" ġoŭâÖ>̲†X™ĥ=tĞcK Wp“é`şéĦXŠ-ImtzV[A°éÇñúŠ=XĥĈÇ÷Áġs›KÖÊik¤2Eċ`¤çÈí0Şü|BPÚ0ÏeŒùÊılsέ•މ)íÉÍĉ]CfÛĥ-Ĉ˜ÍsÑóöì_’´91ÂČފJ]Y" cNj½eìxŝÚËĉ[ħŒš]oÍ`DF„ö†i8U™Qƒİ’AꔂÀ²Ħ%Ú¤[;˜fÍĊ›fz0 lšNk4=hI|Jm’ĴŸñ&·l}ÜċÍÓêEçŽs\ PX@P˘v‘¤ôWҒ+ Ĵ x‹ˆc_öyĊi7M½ÚáŞmˆÈœsBUĈ˜ïíÚȔ¸C’H#ĝ´Ét50ĦÌôŬz•.,Y#j—éJÏښ^av7]–mŒˆL×ĵ,˙-ÌĴt˜DĈ(íéúÔ{ĵğġ ËxŸ„éaڔښéAYÄG™Œ×÷âġKîĝnŜ½x{ĝô2_<Ü[§?W÷Èo ÁŒò“cjM–qè `(½ċA FĥmÛ6ËeŽm÷!},ġ¸ è+ŭlÛĉŒ1 ]Ĉ˜ç­îġ“œYg³èë™mĈ­ċE— ̨ ġMz0"˜MĤНlŒe˜é“^47^cÓĞœâĤk£ô¨ ÀXÛÒ1¤NĈ{ôĤ‡İŒÉdzP}K(Š6ƒ Y;ì†÷wO&§Ŝy˙òİhġÏôz c‘ÊwÙÌ&şÒ FÏq–Fz1èÌ8tĉ=UŸ·mÛÎf#5ħ"“ıaG™Ú²“sΔÎfŒıŒ1Ÿ/.;wcݘµÒ‹š2‰ZŜİ Ġ4Î49ĥş‰S“LW£‡™ôÚÌÈÚÁ¨ĠĈn4÷ä·fÔFfğğj³қ9ëÒg—-UeĵÓô`dLÚYC­rUŠĝĤï'kŬѵë÷7/]Û¸şWžblŝ„:RJ€8İ?ġœ=a`¤6 B( öa4´zÈÑcŒı–eqĈƒÙzD>‘ŸtÚ÷´÷‘1Ĉ(9ˆèĜŭAŬÀÚĜJ”3AHsßQġE3…ĉ‘úèóT ­iÖIŻÔàtÛö¤×dş–ÈĦĉ†Ĝv0ŞÎH"|€tä„À¨ëAêĜÒvÙR•5mÇôLa€ŞĦ6,Ġ–üxc·Ż-äĝ{×=µ9Ôçƒc€ŝ"à˜€8Wc-dÙQÚPöĝ‘i›% è `"¸ƒşŒ1[úù6öè}}ڍħ&‡œ[Œ1‹1ĉxĞ{猅)Hmöd#š6œ‹ÊZAöġ5û·& Ì8éuF7]Ñ,2l–éhÊŜF­s¤ RfiR…);bĴ“ì:`ú(·cz˜V[* TĊ0ŽqE,ïĴ7qoówÎ_^{ïX}ÖâsĤ!ËÂì@ċ"zBÀ(ŭó!ĤZ>L¤ċ"˘‡ˆ"ZĥmOcHŸ¨Óî$lùX£Ž1Œ1Üq÷ì_”VRçUóĠĤXğĦbí­ĉöo¨ç›QĤ{H0˘Ydş†‹ŻĊé`ԖM×Z›Ğü@äĴ&:†ÔÓGÈ*ŒiÚÜİÀr<W‡fSj×çĵxŭw|èŭ[÷/Ü>½Ä—OZ‹€Ž2IŠ<]ġȞŜF)g J0ׅPZcÌADGíħĠÔïϐfÌWìqé²ÑFD×YX ’„òşŽ¤öHž&ëw5`+˜Éú-Ûdş ‘ÛL`hb5Ë\•4mËÚM%`._°ĉ \ĥġ@eI$0%dǎş•‹§ËvÛ8Íô@RĤŝÜ0 ³\ĵ$ P5Ġĉñ£îäŜ(<ŭ½÷ß?­\rÙà0/HÓHÂİ8|ċ÷ĥ0ÊÇP¤É߂$tY v_géB!Ä4Ò0ĞûXnó™d‡êe!˘Ì/ö²K[HŞ4`ҔMž 酒yOkÁ²ì‹Èh-A´†úġĜdċƒ‡#"jd‰€şM0ʗ€ñÎÑ­m³i2Ŝ´a€ÚMyڃžô$Iœ$I>sI™6ÍÙèÚݏTϒċmËùX€Qĥ)ċÖv`L¤=g§’]J`cŝ‰ŻOÛeWû˜úqD´Ñħ 6!ŞÙG„TÔQf£–‹Cg3Yğ ĥόj9rm~K’C³µ[N‘éèĦ­ŬĈ‹_şBK›ÖÙ­nµ²íž¸ĞĤ¨PöS^ĞéAĊEÊ&>LxñĈ/şż‚áÉwŻ^?;\ĵĜù“Àĵ>P˜[ħ€’D= cġúö§ F²xnZv'ş}Éê9ˆĥŞÓsĈX‰hĞ!=rĈôiğìjœ3DäıĈ9X°"Y8ĈĤinÙUƒCµ'Ì"ÓÍ8µ²FmżÔÑŭ`dĴIM qċiħ·˘n}Df`KĤŻĠíáĤfڙLÚÌlĵĊşçĊO{£ëwĥ†Ŝßĝà X>ÇÙà0`’HĥӔÊÒÄe*ë´¨)Ÿ$ĠU!d.L„ĠŸ+‰qÎ9lÏú ;küD# +M“+P²ħ×·'BżDċĈa£–ĥŸÀPµ]Ż2+ċ†ĞĤÊt´íIŻ3v7Yğg# \5y3œÁìÓ­˜>şé*§ġ&)oZ˙RÉô0™L¤ê] Ġ[A 8^_ô“ġ%wrĝòíÛçïn>µÈ—O:ˀŽŽZÂT´ĝäÁ(“ê@J `GÜc³1cHl{ġÇĈŽ>I@šÙq‡éÊ$; ŭž5i­ˆ¤6”Ïu0šÖ|Z“RaFSŬtÔâtkcM̌j€×(˙}ÄÔîFY *µÏuêV·ĥǖLo?ĴéU˜R-°Uï¨ÍLcÚR½KëǽÉŬUñ‡gŜğúáñhñ’Ëçó}€0I‰z¨Ĵâ²²]Š`¤öÌ‚,ˆ‰ÛWŻES¸*À'8ÖüqèCÊ˙ÍĜQöĜÌñùpD@$•Ŭ›ŝ˙ìŭçŸ$Éu%ˆ3s"Ui­ZkŬèFCÀ$ ê!A‚ïíïí~yÒ{ŸvwvŜ’³áÌ£ €n4ZĦeuéĴŞĴJÂÙŬnaîáĦRUf–[˙²32"+32ÂŬŽŸ{Ï=gĝO쀆_´8fDy ^Ĥ£ñôg4İÉŻĥÌׂ&ìMF PÌĝEŠ;µ&İ$ ĠÚ&ĥ4èaH D\”Ä[„Y/ŽVÇkġZ²ò„ë_ı²²úÄĠîĠƒlŝ&ĵ`\¤Ñéq˘…!|¸Ó`¤˙b°TÂ.<Ċe*f‹ħTĜ<‰ĜĠ*ğħŒ¨xĈXÎü:1ÎBŠ $ħċ™Ñ80*fħ0ĵÀĦ1Ĵ‹FÄO”€ÔşÀŸĤĴCO+`˜Œ ż› íaÇa\UĞZbKÓn€ ,2§žè!‹NÏ [0ìĈqÜĠâĠcnxû‹îûèÚ;s×ùì90{Œq ŽġE3ÓGwŒ´% %Iú”l‘äcÌ ô^ ŒOaĜ–µU€ÄĤĵ „`œóLÔ`[³ u‰Ô^ŠƒA 3Ê ´ŽK\-İ~¨$ÊTmÁˆ&9¸J6|"pF´ jş‚FO0‹g›KµVk+Êx[é‹7 GAôÇqŻ„Çq7Š˘V­V[ĞĠ’ĠÇĵΕëŬÎşWĞ…‡ĞŸ³0)AˆSóaĈû›Ú”ĥŒzŻ„ƒ„˜ÀÒ=$.„`’‡-gIÛ1‡4qìcİĤAg^͕:ñP•§RyÌxG†:]çİŠ:7”#š L7~èur0˘ Ët› Fı Ĵ!Çg:-VĦ² ŞÖV•ñŠa™ÏŬ$eż"=nˆz)µaavµauż—ĴpÂ3ŬX|lıñè_¸L̀2(È'ÔĤ0´ċ`d*·t_‹§3S‰ê‰Ĉ¸Hq쀤í.ٍ]Bh@bŒ1KÔ’iÖ P)K2NipO^+”ühĦ†²’izF£Âí&#š°L·Y`D#˜ÑHíƒö`˘*~˘ZÛÁ–PrÛ:Œ=“‹Ì0ÀœèÁìĈq܉¸ċyñÚŭ^ps5yíá/]8›ì{Ìá3gÁlc@Ê´·Ä48HÊk§·Œ²¤sj‘•ëôGİkÎ^¤IËvÌ8͒·ê '‹#B݇4iψJĴwT L5g4•mÑä`´‘ĜñiÁˆ&,ÓQU3N{%¸•– gUüDµĥš-mDô0. p”èÌ0@Ÿi‰x·Vе8^mԒ•§êŬK—V—Ÿ¸ÖY<À÷=Ș½X’¤}œĵ2 ÷ŠÜ™ŻL&˘ŒħJUÌi‘£Ç&Ù£÷”¨aÜÊtz!ÓTR0·fKÒŝ€*ž ]£+£ĦoléœÑ„`$‡?NÓôŒî0İ){FCġ&˘%Ċİ"GĠÚ.ĥTVĈµ6"z`Lea€afĵĊI/}Pĵ}߇W.=èÏ=^c³gÁĴw@q HŸ‰Q9‡Ĥ£Ü+@€à€’ )AàL·ġß' ıV£öî=aŽ!tpàEàœg ‰ÜvĴD'%éÌc.(ŬċRXĠ0ĵ™RÀ°`D4&Òb À¨XĤÔI‡ÄÊ~IµŞµ-eĵ­= ÈQ.µYk7 v£ÑXóĵxċÉf÷êUżóÄĊΣ´ïQï˜m}D˘7·”hÛò7F½˘’L@³ġ…?gŒsΕRfĥ ¨îä`,J)£Ž)•t\K)ÒïGÈ2Ŭô`T*P`D.Uîİ3ş`¤o ŬF²Şz]µîHoҍħXöVÊ+=”1&ĦÙRhÔúF£Çqë Ż³߸ŝÈòÌc³|ŝT"Ò¸tF’ ÄEy9f3ÀHğ~3&@2¸…ÂÑċ:Œpj×vÙµN ÀŞ÷‡k]< ˜à\0 ‘™B„•4B7ÚóŬ~™m܇Qá§CÀhĜàÑFÀH(Ó­ŒFħ˜iÀȸ›góGURµî<[vB•‰ʧ‰ĥ0%âJJÙszş_´jµxġşc9yíáO.]<#D=WĥOu1)ÉDZÑeşiÀHÑh·A0Ҁ>•8Ğ ĠÚliÑG?…fÑaZŭt(Žc”RqË(Š˜ĥĥš^ĵúTÓż|áöíÇo´îßÏfîê‡À¸£jv%gFÙİ+% ˜TiÉÜâúu`Œ1"bëܳw­Û÷x¤ÊËyï+ÎAħL‡ĈäÙĞ2<ŝĈQĦL7äè_ĤÛoşQ`d İû\7F 4 ÙYXUĠCŞÖŽ`K“n˜Eĵb)jœàĦÔHJIÙ`m’$YDmEQ·^Ż·kµxí´.áá}ï_żtŸ?óˆÇçÀĴ:˜•nÇ$ħı`dn ½ÏĥYĉ¨ÍÀ Í7İFċ­IzF4Ú|`Df´a0š wĥ™`T„™°x´3Ž ŒŞµ›ÙR‘5bK(”ñ̕˜_H)Ħ”‚Ĥ̆(ì1Ĥ8îĊíCġäž÷—[k?Üäsç1&lHë£â·d/‹RĈ9Ü˙;‡èÊ2’ö, •Î$eSŠRo ĥ>4ÔύĈ–éh3Z?ј2ŬúÁHm`Îh:0g‡D%q+Mòer§\_UĞĤM &xÊĥšü2ÏFDI’$RBJIqĞ(Šd’$‰Lezh4˜ġôaÉŻu~ıÉjxXÎ<`ÁžDêN…=k*0êŭġ™á+OËvŭ>ڎ:k­|léL–/FIğKwuúĈ­ŒĤÉ3Úİ`4–9Ž£çĦĞLVеËx“ˆFħ"c˜K0V&ED2I B„™ /I’”²Ğ” Ž6µ£µ+Áµƒ_<óÉU_HIÚĠœŒ²%DJ’¤œ” T€TvíB¤*‰g-5ÑUÄ4`´Ŝ<£FjJC1E—bœÔ"+-†A„(‰•Wí…ĠÚ=l‰•œ…ĴÀ޲3Ñĵ=,À(/ÏŝdŒq˲˜8Ìó<Çó<×u]ÏĥíšeYuÎyíágżRĊ9lÛëZžçĠêġúl½^_¨Ġj=Ï;êyŜñs<ûgñŬû.·kî˙ñÊMĵs~ˆp00’€H]i(O–žÇŭ³lB0Êŝ1fÈiù.ˆTÒ;ÁĦaGRöe biè˘` ˆ@’Ö Fj#jşm#šà÷O FDë#tğ şŬê]­QRyUkוï6r_[–Ċ]×µjµšÛh4fjµÚ\½^?äyŜ×uÏÌï?ó…ßŭë§ŬOì{ùƒUüäKè´#p(Žaé½Ĵ"BĵgÄcĈĤ£ “´şŽ1IX,ĵĤBÚħ €’I¨”.בTi=7´ğÁHMPĤ›Œ¨„mh·cA’Ò~ĦĈ8ŸĞU­;ż6Œ`–„ÌqĞVĞıġtÍĠëġ}µZíˆëşÇÇ9ñè‹_}ú‘ßĝÎÙ÷o(ëċï_Ĉ§‹R°¤İ´$ž–Ĝz­–²FŒh`Dé&È,–2.R`ŒRġ_–ġ´#NŜ HD¤(‘ReîìÙÛŻv'фeşu(ÓmjGˆ#•zne'Š#@‰Ò=¤ŞdW­Ŭ…O%Ÿ‡Yè°²!·mÛr]×i4u͊öĠëġƒŽsçÔĦgxé[ß{Âoœšŭğ7–ñÚûËH˘–J ˆ”ÒڅLIÌ@,-İĴÔĥ^0ê#fŠ!ĊD”é$PÒhLJA) Êö>f `'éu›Áˆ6QM7)eş4-њċŝ Z Çj ZƒTZĥĞÜе˘Ѥ`4ôqáyžUĞĠĵf³ÙĴ×ësµZí ëşGÇ9é¸ŜéçżúŸ9ŝĜ—żyÙç?|ċ/ùàJÁ"WŒs슏‘ħw¤m+ĤX?Ĥb½`èu Ĥ1ˆCE’(½'˘1u—ğ¨żÒ Ĵ$Q<=˜ÀÀĦú€t´cÀˆÊ´â[F4„MFŞÀŒF‘ÖÖB$‰x]˜ĊòsîUÉZ;ŒĜPÊ;îÏb(€L9g{žç4Z£Ñ˜­×ë\×=äşîqÛĥOŸĵ˙ñÇ>óµżxt1™Ğ˙íзΧАQ‡˜’àŒi+Ĉu[B3!³Ä˜фe:ÓS ‹¸àP #)’Ŭ˜ñ¤mÔÒoEDJŬX䝝ŒÔP‰ùրMPĤ£a¸CŝŬ80RŠZ‹JÁ(­s§ V&xOpR­jí"V4 2Áˆğk7 [Q³^ŻÏ{ž—•çN֛s÷ĵĝ;˙ñ…ĉéç½òñûé—ħĥ‚IG&úy ÊҊ:ž½2ûF…à…A_ċĦ`TÜ7H‚9nj%žD°˜ ĵÒ*Ù—~QIT"ŭnä0íCGċ`DÖF*)[Fjʞ•Sµġƒ‘$Ĵ­…’†ż.”)–`ĵÚеĞYQġɲ,^ĞĠœ™™·ÑhÔëġúl­V;àşîaÛĥOĜĥ}úgĝÜ£żñûÏŻXÎ˙ĝñ">ıڂ‡8$ 8˜’ݐN0èKĞ>D™r5²ġÊuĊŭm0Bڛ"%(†àJHˆHj‚4 m)pŬI@˘@‚J)’""…  ––ĉRYòzd%PRSüĥq`DC˜ÑŽ#š Bb:0’’°ĥê á Í8OëŜ|Ìk_­jíV4IŸ¨FĥmsÇqĴz½žħ˘™z½ YÑ ÛĥO-:ŝà‹ßĝóç’ùûŝċ½ĵñÉ"?€€3ĈTz(݁‡¤Û‹î!íċöƒlKêé¸Ĉ_|ĉÀˆ €ŒY êÂb)é‹e(›+†”£d ‘A7b 4&{”Ùçf‚ÑFbÇ·Œh3ÚŬÒDZkÁÈĵòbTİ몵ĞÊs“°"fY–h4N½^wfffFcÎóĵƒëħmû¤mÛgžŝÒï~öÔSżuúĞĝéOħ¸ä–1+{àì’ÊêF{Š!ш²RJI”LÖVĦŻ2_|µ‰`DC˜ÑÀ¨ŻÁ^'îgMFƒiµ*?ĈE€” kĞ‘Ž‰ŸLĜ‘öXŬNÙĞU­ŬвgŽyžg5 §Ñh¸tġD ĥmŸôêÍ{>óµ?}iß½/yġ|‡½úÁ5´ğ %áp‚€„ŭsDqžš xZž£^ݐV;gİç;G½œÎ ËtE:@z~PE°ıÊúGRW¤h’½yŻ–ìhCÊÌU%%* C„”’ ÁÌŝÑÁ¨X2Ŭ 0˘f´0ö*MF4ô@¨Ĵg”hf4 İô*,=Ùhä DµŞµĊ`´ÑBŽY–%êġşĠh4œ™™™L´°ß-œ{ôùgžúʟ<|~ÍġŝñG‹ĝtħ  (Ĝ°ÀÉJ şŒ­”î ˆE •ġĈKĈW”ıŸ§)ÊÒ$`”X`à ¸K 1’V}OMşU µ“Tv™üPj]|Ş }éX³"Œ4Ğd”{“&z™F5fÖ F4ĤL7-Q 3šŒĈĊŽs`XeŸ8ƒ°+y]µv4+â%·{`¤MPE½^·ëġş×l6gjµÚĵçy‡Ç9jÛöİ™…÷żôÍż|zĝÀ?żżŠ_|p2‘h À!Ûb°W œQ/.\É´Û ”JŻßg•BTi„Dvf§cVĦËÀˆhJ0ÊöRĞ/%á Š‰(QJ%şożc²cĥ ĈÁGïq)eOöMDħìĥcovÎ ôq!’xÔĤMc~óp0šlîg‚žÑ`D4ÁnÛöéƒ'Î=òÙoŝĠ3ĞÖ‘Ùż}}o}² !Ì9`pHÁ‹ótP‰ƒ)p(F`:a™úY£CĞ!ŞP–ë ”LS‚QöGJĠ@ ¨·&Ûú‚?QJ))BIŒ† Šb‡] H”1$Ú‰R*VµĜbiq™¨uMXĤÛ,0ĵFI˘Ú(e_1~‡Û ĠŞÊs“³"Ïó,ÏóìÙÙYŻ‘N¸fRî£ĥmŸt½úÙçò/~ä Çñi—˙ŬËhµ#48Pw(8°ƒ`,ŭĦFHeF¨ÈĈ!Ê+6¤½éˆ¨'íI‹TúX™ ab0bJĊr0ĉ‰W¨.)Šô›LXĠږ³ûN‹ЍL”ê³úf$W—F)İ÷Ĉç˜î0˘ Ët›F´noşﳜĵ{zf´i`&Xjko¨†ŞU­-*ϕħ!Lʊjµš]ĞĠìÙÙÙşÍËD Ç-Ë:}úÁ§žzökŝĜċn½öż½²„.µàrÂ<'ÔlÀ °8A€Ò`Jıç¤ Rs5·ÂıC°ûDéH3§)Á({œ 0n·2€+T[%)%I˘’$çe·m—œ[ HÏċö`M‘ˆ(&˘XĥÖüôbŭ>E ÑeşÍ#ÂfŽèwİ-#ݰÖÚġ*Ĥ静‡%„͍™İVDSħ˘˘„;çCçyžê9/óŸÓF¨GmÛ>Ġ˜Ûwߋ_û³k'Ÿ>ôƒVwŻ bÌX ž¸p8ƒÍ ‚gà½_A=ÈÎéÌUÁ”ng€BÙšİ\™˙½Š2ö”ŠÔzÁˆñ”iÀ’HòDĵÖ%ŠŒ ˙SĜj†D%ÓÈmU)E”bTŬ\lĠŠdîŠcşžÑFÁhóóŒFÏ­Œ4T–Ĝµ&zFĊ×D˜ÍÁ,^ħ£jíV”SÑeRW‹ĉjµÚ~ÇqŽ8Žs²ĴÓ=˙Ï<òßı˙ŭ›d˙Wpyħ†Í1ïq¸$Ó~‘Ċa1@pŭ ̧I *›êġZĴ™ÀĦFú>Ġc>Ĉ×ZM§¨X½K4=A? ÁÁÉ.c…ú‚_J)3·oÚn6´€Dc@ˆ†•ï’$É)QJ…ÉÒĠU!XjÁœqÉւÑÖĉm"ŝ<âÚ=…`èĝ‰$eHĠŞÖ²˘IsŠ8JD şW´àyŜ!ÇqŽ[–ujߑSżôÍï>̜]ĝooÜĈk­@¨ .G cpm[÷Š'ƒÓ/Ñġ@ƒÈ`B™ÊZ³"`2Ĉ£2тBŽ)•0Ìî'#]`„_œkEx–Œˆ(TJ%RÊÄpi˜´D·gÌUÉx/‡ŝZġ!”İìûöÍ5NR‘RĵrŭÒîᣘNÀp§Àˆhğ·}`˜•ö‘(Q•¨ĦZÛQž›H´l6]=à:ïyŜž˙œž{ĉKżû≧żzêW—ñoŻ\ÀJ+BŬa¨Yž\aÁĉ‹1Xz?çŒç]¸‰ TżĴĤTúµR}QYY÷=˘`AġĉŒ/•^h*”`Ô˙šXf({]Ñ<›"T¨?­°ġ·ġĴӲ•줔ħR*$˘@­-Çžs•”`Œ VžŒÔeşí£‘IŻ„Ñħ€ÑȉiÁˆŝà ÊêğZw†•ŠF&ċŜçşîa͊Nğç‘'^ĝĈwŸ¸žÌ7ŝóOnâחÛpT‚7í9LÏ ‚Ċ8càĴXêICŽ#İÌûTtdáû{ìIİ>kÒ3ĴÊ`WJÑô`Ôğ­ç ¨…ş"Š”Rq’$ħ!ùĜmî8mç`,A sÛ’$RÓÉX)¨Û7‚úáw2˙SĤ×Û`DëòĤ›ŒH‡ëm*™żœĦ×;˘¸?^­jm+šX´PŻ×ġz}VĞġüçjÍÙ{?óÛüâÜ=/yċ5ö£÷"èĝhZ ž ¸ƒËž²˘,ÑĠ¨ÏġÊt=0RóQˆˆ ¤fFJéÏĈ÷Ê"k2™’ñ}HJŬÖ Fٜ§}Žd ž'הR”2ÖŝrĜ>Œm6V½“ i$=L’$5„RÊ@Ŝ6N<„UÎFlÜ;ŒhFİS€‘ŝy­V)ĠրQv3IÀ™ĞìƒŞ5=m•˙\Vž;aÛöİûžŝüsŭĉw<żbğ˙ġċи°ĜA☷Ï"¸‡ÍlÁaħ4ê†ëßŜ/!êÉşÊr=Ħ܇Ôe7I(**˙ùŸ~żZe@ʘû% p 3³rY%*TJERÊXÇOŒ†Ŭ³%ğIíƒHJİ4 •R~rŭÊŞ :”iAh[ÀÈÌl¤ DHl1É3ĦŬŽËcÇ7 Fı—F—#sùVUİZ›^ž+²˘œ˙\­VsšÍf&ċ^Rî–eš;pôÁ—ġŬçĠû÷ŭŻWñÚ7ARaÁf¸‚cq¸°9K‡\3VDilDv!IFÏGŞŒŬ¨>0e9*€‹/iŜ? Œ4ëʘS FX'ħŜ× Ìâ Ò§ş•Üò#J)$Id’$Àg\OiKNĝífHe4°ĝ"R†ô;L/-×ôŜ',”ß!œŒÔˆ×·äçìH0˘áe:ètbđÜr0ÊdßÜÖ'ŻXRµ&fE›â?733Ó¨Ġjóġzŭ€–rŸBœ~ê7ġâÙçvîĊX|˙ßbéV ›ĦÁ Ž\Á` ›÷¨_˘Ógê³"RËÉĉ‚Ì]Q`–Ŭ²^Z²F²TRĦFD(ÓħŒ% %ı†šˆCĠÑ%ğ(I’li+˘ñ;ëŜ.ÙiIĊqK)#)e]ùdİ–›,uÏ5Ĉ›Gmş4„żah™î΃•`ȰçĠíĈˆÂí£ĵ]ëWùĞU-l­˙ÜÌÌLÍˤܧŸş÷ÑżùWO/‹C3óĈ Ŝúp#,Ĝ@ÍĤT´`qĜİ;·Èe`YdŜ+êħ—ĝ”°˘bϨXŜË_ĉżÇ£DŽ4R) ġ;ŒÌ† 0!@ŝ êĥ 4… İ Ág[$àÛ5[ĵ**2¤Ü׆Ò.RJ…ÑYÎĴŞ—ÂHàıÜÍÇnĵ›FëÌ3˘’£l0òƒAlġ7P˘ÀëVU²ĞÖ¤@45+?wÊġêç>óÛüҁ‡?ìşìo^F·Ħi3Ô@„vZ°ÓW‹i ÒîÜ=§sHˆ,‚¤!€cÈĵ‹gÂRĈDÒߓ‘Ú40ÒŞ\¤L)nĦaĞ@)(†ħ£2ĥ´­ëN•ìĈÎ"Ċqœh†*µ²zçŬiò!ŞÑëožû’^éĉMFa˜ÀïĈÛ Fڈ8Íˆ% +éwF['Zh6›µF£1—Iıµhá̙Gž}ú™Żüé#—ş5ïŭÉ |t…şRXp9\<ĞﴐJı³ĥ§F¤z =˳L7T”PTĈQpzS:;™gJŭï— =0’›FÙÀ”1Ğ˘54j´Ş”ò”a’$QÇɈ}yì>½ÛiR/ğҞ’n¸eJğn|k1¨y`v•%İ †’#­Ĝ'#*aFw,Ïhz0Šb‰NgûÁ¨çiG”Ĉ— ^ ĈV@4 +*ċĥm[!ĝììĴSÍ;”Iı³ ÷ŝwż÷˘8üȁŭ`Żĵw*Q˜„ş› \Ĝ‡`İœğWžËE‡ĞŜ`jŽáÁFöÁIf߯2ƒÉŒú€E(ˆJD I&`Ĝ0ê{ë1f P) –ј•·•TŜSCa7 ì9Ùw †ejd1ÒPÚuċµOo‘/â‚of<|Ó F4ĤL7”5a‹#$Ĥ£$Qè´£í#óĥ`}ë jİbEÓ³˘IBóöéòÜq˲Î<úÙŻ~ĉÁÏ}û÷+ëû?¸Šk7:h:up9‡ËH³"JE =3TôôÒZċD ÙpŞ4ĉˆ¤)jè•Ŝh T'3f%Ñû9)è¨ŝí m.OÜ,% ¤ .ğŞéÄ7;méÇqĊqk…Ŭ°rŬ‰Ŝ(ٍ+ç†ô;I’0I?ŝäŬëŽ`’ĥÑċŒġG‚ÑÄsF” ÍАĜ"0’JĦĠÖfİwŒܘ‡Š UĴhèçİCó´ha!-Ĝĥ}f˙ÑÓżôíï=ÓvÍŭ_Ż/—ZJbŸÍàY .SpàˆÔ{ï´`°"*úÇċٍ”dHĵİê÷}ˆúâ„>™.Ŭ€’Ş?jYŒ6ŻgdzĜ‰4v‚ Pxu; Hݎĥ Š´žaÚ`-gKw*iìGĤ´‹8”RúÉ­ë·êŬµ˜)ÛVœ\ÏàPżfş^0˘) wŒÈ(ĥÖ"Twˆ™ñŻñ4šıZ­ƒüçšZ´ ¸žr÷ìs_ŭ—Ž>ño|Úá/ż}kMP `pà‘²"–²˘Ì µÈfÌĊd-ŭòœ4ì~JUrH‘Ù2~V&†È÷£ ²oŒˆFtĤ£bŭIİôjѲ ÖncÎUTWʔ!évˆA &ùzOÒ0pĞ8ŽeÖC’RvÔÍË]÷sŸ@e5R=<6 Ñ:ĠtÛ FĜOğAŬa0Ji,YZ†_™ĞVċıûÏÍüçΜzà‰'žûĈwż4ê˙ûoàƒ‹kp9°ÀSÁ‚Ğ‘-XÁXš€<eQŠÔÀ\P6/4ZÚmÍ šŽLdRïĥ* ½ŝu›F,ƒsg àš5ZĠûh$I”$‰R–ğcŭ£í¤˘ô{œÒ.};´Ò.I’PJé+Zòê'm÷s~&×LžĈ‚m‚´{;ÀˆF„ëeĞӎ‘ÄòΕéŒ,u$ß+ڜĵž”ğ>3wï _˙³›gŸ?òVñw.#ÌBŬ)R Ò`Äġ0h‘ġs…”žŭĦœw\ÎH HµMueÒoÊ?Öwé†Áž´¨Áx|KÁˆ ™ĥq0$ 6ĉĉ“2‘Ŭ$I͐䐊0™aO85LĊ”¤”2Š˘XËğò҇7ĵç~œ @F Œ§‡cÑ Êt; ŒĈ%½fËï&ˆÂä΁QñÇHŜßrŞu·²˘İÜFhŜl½^ßoÛöÇqNZ–uúgżĝÜcżù|x›;óòe\\l£)8\—ž í´Àġ€+éŭ˜ċĉµ ĤĞvQÀ-ıÎ<çôçœqŞĦ˜£‚l›LGîlRı™B‰‚û÷–1£´–ÊlÊŭ%ĜÔMvr½İn’$AÁċ›Ĉ”íöC*SÖħ j”™ÉŞÒj_JÙM.~xŬcŒ(I8‡J PSĤÛí`†ï0ÊŜÈXž¨Üï>V4Mh^™˙ÜL14oáñ?û­ż|>™żgáżż½Œ×>ZWû< 5F)+â̟cà \‚k>™5/ÍĤÂlQŽi+ĴžŬOĦo”)£LGı²\ß\Iŭ(‰˘ ­£ì&ç`Âun`ÎI:Jİĥ”²ÇqÇqR’;r/ŜK%ğ‰ĜPɇ’RJ-QLûH~gËW8ûk ´İı÷Á(‰şíhg€+ü9Šúe‚jŬ­ċıħRn=ÜêÎÌÌÔkµÚœvċ>jÛö ˲Î>óċßûìİç~ûô[—ñŭğ‚Û+\Ħaq¸œà´Wdq60àjžfŠë@ŽLϸ‚ğ‚¤‚\ğ/ŭĤ!e:Œ¨ÄċràµĊ`Ô³˘ċSÀ8(ZĈĵ§ZRÊv’$~’$ ј½w‚%픀Rc?£%IÒM’¤M×/tšçĠV#İ·qÚ`DbÇ×FJÚ­Fı?‡zNßLOƒWĞbE!Z0üçzĦyGÏ=ôĝ‹żóŬ§–°żñ˙{ġ6Ŝ½‚MûÀƒké<+U•…ĉ™ĴH™N 90˘œ´ğ4B"'@='“ $ğji7òeş Ĵd/Ò\ġJ}[FĈĞA žú#1 ê\ÜAuC³£La—è_Zjn=kÚġ€dĈ—³!`dŝħâSdž8Ž})e ”jÉóï.ı÷>€q–^O°ñn ŒÊlÈxĤ„­#" Ŭ ûyJ; Œ²óÀâúêĦ6ÜĴ¨(^èIı†Óh4\ DsYhžeY'½zóžŝ§/-Ü÷Ù#?ŭ¤ĊŝŭŬË#‰&5‹àrÀµ9lmù“Iı9€Í—*˜ĦfnÙv?ZPž‡ĵú¤LG 90ÊD=CV!uÏ/<ûÔoŭÉçW÷ż˙dçŻvP#…+Í*r-n”ç´”›ġĠcCYQŻï#se¸lxUÉÌögpÎÈôŸ3A¤gDyŻğŜ`­Ŝħ”2úV(€‘˘ò°Í£ì-â Tû:öע–’r-I’NǁNQ%ù£6BÛ%û'lÀŞHRÊLĜH)ÛÉÊ­[µ•Ċ˜Ż‘>BĠ†˜‘*eF4b3_7­áG<Żn7FĞF*'/%E`‚îëUÉn/³˘İBó4+š1œŽÚĥ}jv˙á_úÖw?ö?¸˙Ÿ>XÏ~}”ĉ„BM¸à=)·ÈÊsYŻ(c"0z8F(UÉİH$rŽ R•XŝóC*7?Dŭ’[zLˆÈp}0úóNúwKÁ(I/!ú˙Ĵu uĴJ)[ EQ” ÄŞ JsÛ^ö¸“yH}(d’$qEA’$$IÖèò‡íı?_[ó0ÉA’ú·cÁˆJ™‘ġĤŻŒTMFa ’Fĉ&X/,‘¨rûŜċĴhSCójµÚŝ,JܲĴ3O|áë/Üûâ7ïyw1ħ˙òÜX ä)#òlžöŠX‡ô²Šú ¨”ßôMéuOV­ F¨}R€$•ó­ëK·Ñ/ÑÑT`E)R}VT%³L×#Újf¤ ĉŞY·#˘e8 .&qÒJ’¤ĞvqĦ52ŞBµ§Kv“ €DQ%úĊìJ)Wċ‡o^³xé ¤ ²À$ú`D•é6 ŒÔˆ2Ŭ(02u‰D·ïl0ÊîŽu6TzQP­ŬΊ6šWĞĠ<Ï;dÛöqÛĥO>uï£/|/žnıÇf˙Ë/nÍóĞp°À<[À.S°ƒYŻ({"ZA§¨DÊ]4+UDĊd׃‚ɘòe:³gdJıÉ(ËQŻ,—ġîQR—p˜eƒü+pю\‘Üèİ !Š˘HĤ=€q&Ş@iWÇOŒŞ;² ¨bOŝÇħŒÒFR7ŽĥüĝW… ƒ XàƒJÌqXµp½)Àˆ&(ӕÑ“Ú­ FNߊŞ9¤=Tž›ˆ Í;ézġsÏ˙ö½tè‘Ï{‚Ïĝî´ZšBĦÀu›Áá ½xˆ+Ş6 §*À¨DÙ÷ċ猊òî3Òż§/`0Ü(˘?î@şÒ+m'ßNE)9ÔıŠ}5ıĤ”ZK’¤E‘†a¤”ÊúG“FOìù9¤ìEQì#É(ŠÂ8Žŭ$IZqÔ?iñŭ÷ÏSLPÚÍ7•UnM3gdŒ#žĦӎSQĊn#0Ċ8PĵìvMyŒ SHıËBóÇ9.„8sĉ‘gŸzö·˙ìÑ+A½öżżr ]^ƒ…y+sċ›b*/Z0Yġû4˘SM§dG”cE†MÊ´öûGÔ˙ù†³ƒ ,y°1/ş‡÷û[ÛFĈ]œ§78ş×°ožn&IÒJ’¤­g9ċˆĜaüòŬHea}“ȒRJFQGQÄqܑR'oßjyh~5’@ÏÂ]MŸôş`D(ĥĞĈ€$~7FRfPşÁHßP  ѐ­HÒngEëñŸ;äşnš7·ï—ù/ş'ž8ôòGkĝÉ{—!‰ĦàY 5Î`‹lÀ• ,Ïés4§Z#ÓÒ†ê ¸R!BBŭ Ó$5ï/§ò3CµQ 5(ôXRVöî0Aƒ‘à€° ,^V 5u1ò“µ(ŠşzïŒ' ğ&Â|`sŝN2aCÇĞêŭ×>ġÇçV)dLˆ4x+3`D#]ğǃQJ„ĦÜE`¤U úۘÍóÈjívV”SÑŭçjµÚĵp͜N?òÂĝÌC_ü½ûŜ_‚ŭŭ—Żàê-MÌĜ€+<ÁaYĴ7WTZž3”s½œbtÉA†œ3·vFÈe™Ŝv}à‘9êKıI)ƒ ™jş{xvŽŬ9f”QË´ ˜€j_Âĵ·’%)eK÷ŠŝuÀh÷†=W²›´DRJĞ›$I;Z^Z²—/ûûê$SÙ#,mo1Úè§£$Q݈a!u'a6¤%ĵbGğƒm(4offĤáyŜ‚çy‡ġ€ëéÇÏ<òâ7żûLP?5˙woàO× â œ³7ÑÉĵ+DB;Œ2uİ´|.;€ƒö  IœĴjAC`ò•ÒŽè턒Ŭ4óH*Ž$ C?ŽvÇ+Ŝ{Ż]Ĵ=ùġ“!$ƒà ¸FT#š Œh£ÔéÀˆJ[§CIڕ`Ô;Ë&QѤ½ÁŠ Ħy3…ĵÓÇï}ä‰ù—O.Ĉsġ˙üóÛĝġ…•44Ïf¸p,h)wšG`d°"ĴxŠ`T’ÒÚ³û‘4(ûH‚ͧµĤ€£úbôPóRîšF‰Î´(ÊÎß;ό uçiìÄ꧘ħÚ]—Ç‹í8ÎúGaÇr3ş#ıH£vĴQ†Ŝ‹˜$‰Œ˘(Œ˘¨ÇñZrÒU{ċŞo5Ô%1$Ĥ½R‚ 0£Í#v<éßĝ ’Hí^0Ò]]Š%Xé­VkG³˘‰E ġz½QŻ×ç3˙9ÛĥO֚³÷½ġ?{qöžç˙ĝ5ö__EèÇh2BŬĉpAp-žĦ"5B`L{ĴÇhŜ[ aEeÒî²~‘1QtVPCXġËnŭRê³"ÊN £œ¨˙×gG; L—½³ĥ p@µ/à –¤”+q·˘(ê†aċ:Áp'ûGwş‡T,ŬÌ×.Š˘nÇ­$In{çığüĈİ8N l #ÀHm4B˘ŒĤ™Jb…ÀOv7`vڙĤ„Y95Ü!0ڒ<ÏózN ĥmŸ˙™Ï?ûĜ—ŝĦ—…ó_˙ŭ.ÜôÑ …›Á.#8ĥ€Íœ‘"€e†ŸèKÍò™T%˘•LêĜñ\NQi^Q>\/F e%ùœ”[ċR›wQú6r½‡+ à&>ŒóI”,ÇqÜ 0qÓ îSşSyHlk*"žŬÎúHaQµ8^qßyċĵ÷ô7N†IĈكŜt£ĜÁhb£Tw÷úFğŒŠ˜g~vݐbç–çŠĴhXh^qÈuŬc–eš?xôÁ—~÷Żž— ÷íû‡÷Wñó_/‚)`ž+xVšŜê2Ûĉ:FœŝsˆċYˆÊ÷~ÈĦr‚ÊÙûôï½Ëty–¤ò}Şâ‘ĤkÀCĈ9zşĊŒ²À,jù=ÌÙíŽÍäb;Ž×Â0ì„aèë¸òIgŽh ‰ĜÓ=$Lĝ‘Yĥ ˘¨EÑj²tíš}ŭĥ˜=6C Ĉ@‰Ú‚p½ƒtZq^$ħ›ÀH!/^ÈÊv’Òŝ]µĥ›mš˙œ.Ïe˘…“Bˆ3Où÷^<óìo}ûj$ŝíċ+¸µ É€šÍà2JŬ:½5­ÚróY d`8µD4(Ŭîġ‰ôPk.B"KtÍÀĈHg"3ì€ôñš=–]š Àˆ †bÉ#219¸ ¨Şġ ŽÌâF’$·£(ZĠŭ#ÓŬ[M¸ÏnŬi@ĉü=ĴŽi2¤\E†8ŽW“$ıċ˙³ëü3<“(™6Ùë'Éî 0 ş úQ$ğŒŠ?,“N%YX_J;ˆMì?g„ĉ³,ëô‘3÷?öâ·÷ômĥŻù7żXĈۗÛp¤Â#Ô—)8"uċèçċCóŠ :ì} ŭ “%esFĊ$×Ŝc%e:3<Ż'LÈg%ċfˆ²‹)ôE dXböD ;Œˆñ-ˆèĤ<:‹ünĵEQ+?ŽX—ëLuŬ¨ŝÑ-Ŭí¤RˆXáTşl§Â0Œ‚ 0lGQ´ìó“ê/ŝŜÙ5#J˜{“€Ñ8&€Q)A²wÀ([RĞĜm?M͊ÌĵFşĉ3˙9˲Nyġĉ=ŸùÚv˙Ÿ=úó ]öïï^C·bĈjĥ€'›)8–•KoÍëY¨'şÌ”tsB$Ŝ3Rj°Ä—zU\LDß((˜%7RĤB.8äKŭ5,Ÿó΁Qîk²-p˂ĵŭׂURêfÇĞaĥ0ÌÔuc+O¸ Uv›UĥSِĴ¤•¸ÛYò>ysuöéŭs0•ÎÈ £ŝ Û¸‰Í#%İïཧÀˆ@<Ħ DĦB--ϕħ!`ŭĦyûLÑÂıǞĉİŻŝñşuï}ċ>^ì˘‚ xp-‚I‡ĉQúùV”cAÚWÎ`Er XϘ3*„âċĊ 3*#Ġ;†U‰+w,gÈğ Ü Î Fà ÎR#UéƒZqü¨¸Çá­(ŠV0ìŽ0S-‹3UÛÓ*ğaòï‰ËvJ)†ad”í–ìw~ôiöŻvğİ;KKJ$KfĥŒ@@·bÈw1rÒĞH*…ŬbEċ˘…Ĵ<'\×ġzŬ×ë^³ÙœİĠjóžçÒRîS3 îé[ù‚uìÑ˙úŝ2~öÑUÈXa žÍà1‡Žç…<³Ä•wÈ.Úô(C%' I­² Ħr`SdQd ½­…Šî fİ7O„ĵ÷\îTŬ-`ÄRcéÜÔşˆVƒYWžo·ċ0 [Ad°£Êu£ żîŞ€²ÒĤ(ÛÉ$Iâ ‚0 [Q-ğŭİ}ûÊLÌÖ@ĕ8gùĴžġ€ÑIŻE0 £o´W˜‘ꍕ Sùló…TĊŠĤ-h)÷‚fEGmÛ>nYÖÙÇ>÷Û/Ü˙Ò·îyIYß˙÷иĥÔE“1Ì UıVÚ'²Ħ K‡•rCî™hĦ'ßVċ*şŒŬÈ" –éúqàĊXˆŒ eÀ“ ½ĉĠtF=C_fG#wĞ;]ĤÓçžvh`œA~„c³j)I’[qŻFQÔÉäŜë(×Ŭµ%ğ˘üS”í2³Ġ0‚n†Ğžç-Ùvƒ?ŭ;§*ÈP‚s–“IÁhIŻE0’‰1o´‡À¨·S Ŭ@¨ph+YÑFŭçfjµÚ‚ëşÇ9aÛöéÇÏ>òÒ·˙òéĥwbîżµ‚7µ˙Ü>Áár‚'Ҝ"Ûbi݈ó>cȏú<ĊÁĠ2ÜÈ0˜òîbĴxÖ÷Qf_(oġÓsàĤ|)ŽtŬn HA=1÷î£tŞ à"}#, oƒ…×éèöaĈ·0\ ‚ ĞĊ jDınÒáWş[i\/ 2¤ËvJ—íşQ­EQtÛ}ûß?žú­“(ĉàT¤&#5˘Lg>•)ÀˆˆÉ%żî0*›éJXÍʙeVkKÊsÓúÏ5ĵ#YhŜ³_ùŭÏ}âK'Ŝ¸èóŝôV×b4ĦÎ9\‹Áí9r‚ká Ú^ŸH HQÀPfŽJ}CĈ|zi@Î8•ˆ† ‡P Üóë— `¤úG?ġĝ]Œ@0bP+ï`ŸŬZÀĠn-‡aĜÒöjIĦD7‰şîŽ•êî4 •ħ£QyIĉ ʳÛRJ™•íâ8ĴŜĉ}òËe˙è#ûÁ9È!P¤À9ƒT6ç˘èÊMĊ\Œ _ïh0Êİ’ˆ;Ôí·0W;sûX‹VġìQdˆ†ı{ORğëİ œFJÒâ? µ0 oğ×ÎÚĵññ+3Ggw ,Uî_7-ј,kŽ*B·›Ü`¤=À8£ç½ŞµċĦyġz}^Żï³mûhĈŠ|ŝ7Ÿô7żs˙G+Âù?t—}4ıœ~”¸à°‡`ÎKŽ­‚;‚*Io5™Qöŭı\˘Ŝ™=£œwÀÈ+ô\ı `4Á Œ WóxËèw™ìˆ =A­|ˆ“ûĝĠ8Ž–Â0\‚ †aPpfPcF€Ó]²+ó´+Ŝ§J@*÷"ëHŠÀ÷ŭV­V[Žĝ†ŭĞ=Ż~zAnYPħş9#˘ħáze'n·÷Ô<{ŒÀĈy%lĜ+š¤<—óŸ3D ^£Ñ˜İ×ë ZÊ}ܲĴS ‡?ôùßûëçÂÙ3 ˙ĵöÉDœ`Ÿ…T´ÀÁ`ë×CŒÑÀ{Ÿ,6==Ûi>V"Z(”ôÈzÍ}O>†bÀ]!—YD½S7B-‚Ï£ŜQuLı³,¨Öp’›ÑáüşÓ‰–Â0\ѕ˘H{×)ŒHNÀh7†ğ:Â|Ò >eœ˜½ûôLRA7‚5Ïón9½ŝñÌó‹÷ĥÄl”€’†BH#š°gTF… ’XŬ5`Ô{N’ Ż_µî@hŜI˲Î<û•ïĵtêÙŻžúĠċ@ĵüËkX^öQg@Í"¸6‡ËR]*Z`=·óè;`Á¨(Ç.:,PÎä´8ĝJÊdF}ĉ“0˜ÉùÜ$Ó9A•¸r÷À‡ çÏñŬTĤcŭïai͒q@.ż‹óêf’ÈQ-A ‚ L’$ ‡°#`zSĠğĥd7Š) cH9qƒfI·=Ïğ^ç߯ĥžûν,’ݵBj%„üQޞce`T”q“*ÈıƒñÊTtdŞç̞4BͲߍ"C20h„Ú ä4ûBĤô{7‚‘ùo,žĥ j_İÇĊ{Q,…a¸ìû~'Š˘hDÌĸò]Ž üŝï˙>ŭíßŝí]HĊ,$6†•ÀI’$†¸a% ›3o˙à=ï鯟³ıp òw|#`dzau;É`İ`OƒÙd‹ÔDÑ]ŻúŜ +*-ôüç Ħy´ê)ŻŜĵç³ßüŸğ˙³G^ùx•ŭè½+B‰YĦàÁ³ĥHKt–6AċœŜT*D7ô#Tž İ!³F”w_0++Óġ†XMÖdĉİĵùißÎt ï¤dĞŠÌ£Ŭvïb0Ò à<}3lÎ,Èċ·qĴŜ†ÂĠ0 oA°Ĥ#yŠb†q,iÇ-kŸß“ˆz  JïûmÏónğA°Xç׺ŭĈ)–¤fĞŒeÄ$L F4„܆„LäŬFdÈfeú–°ğÜì{›üçö{žwĜ²ĴSĥmŸşïİ—ž}â+ôù–ŝ·]Ċ§×ğ¨s–f W í ´DÇrÜÔ;ŒÔ•NV†“F–Q>~ÜPŜiƒi°Z#Óċı(ñĵ€Ħ*ä]ıaçÇ8 œğ”1ŭÜlÌv@ŬË ÎE:uÖy/Ž;7´˜ĦÁ4b†â³ŞTvÙÒԐé) cH½™$” ‚ Ôoβçy7šoüÓÛÖŭŸ?Ş@6T23*Ŭœ ro•?+Á¨×WĊ=¸bECXÑzCótyî˜mÛ§f÷~àsżûW/àÀûŝéŭeĵzŝ),pÀċ ž-àp›ñtĤ)+Ê_4ä…Hô'?#$è‡tVHċÓ[ …4Wê ­{FR†ZÒ[ûa–f^ε Œ ïj0êmw:z rċ-İwn;Œ_hiv_â[7.|dıbHËvÊwĤsƒRJ)-ïúżĉyŜm×ï\{ïß-=ôċSœè`ÌĜì)Gï‡<ċc·{‘.ËġŞ&‰J“bò~w7+Ú´ĵZ­6_ĞĠök˙ı–eyê7żùâ=/üÎıwcñŭ\ÁÒm K fgp8Œ ²^Ĝ€˙0א•×$ sXÈğ/P1¨àÌM¤ Â ËÀĤĴy5†QOÀ ò‡ti)~7‚úÛ#@8iYÜż ê\¤³gœ_GQ÷F†·}ßoùïë˜ 5Ĥ\·cĊ ;½d7‰ ĵÔı! fÛö™§ï{äĊoŭċ3ĞΑ™ż}ŭ6~uħGJÌÛ5ĤRÑO\Mġ+ŒSI°] Dà¨qây™³DfŸ’=ġ\ށċ<£ÄsŝsŭxUêÊmœ›4ˆ;ğŒ²™ p àœ ÈĠ·q¤Ŝ^v¸ĝ´†KïŻur İI@éN²£H…²a¸¸Ħ´\—ŬVJÉ(Š"͒V=Ï[rşí+³ï~˙êíGżzš1‰ŽM0jÑċÜh0’RîŬE`TúZ$Ş?Dw=M͊2)÷ììĴ×h4†˙ÜQÛĥOı^ŭìgöG/|ô‹Ç_˙´~ÎetŭM‡§˘;µüħƒ• zRîüµ!_B“eQâeF¨…~Ò (Áœ! Ïëŭ.CÚmĤ·ĉŭçúû¤*qċĤ‚šao‚ús*™M—´ö1=ĵEŝġ0 oùß6\½ċÌh\$iĊ†ô€ÑB %p­¸kA°ìşîÍĉŻŝċmëŝ/“LÚLxi݉³ônÜÁ3ä`ôğñŬ F9J€ ü‰Ŭ5`´İ˘…f³Yk4s™˙œ.ϝ>óÈ3O?÷ġ?ô’_÷ŝ·ŸŬÄG—VQ ‡Ë×A:Sd XLéáÖÂÛ`zƒïLf¤g‰¤YZË1$í€Bt„2Kq*7żDĤ>ÎòRn2[û`DĤT[ċŽnCÚ]vní0Êa–.8’ÛoâXÓżċñiĞŜÌĜ‘ÂW´L;„vKÉn(”€XҚçyKn\™y˙ċËKŝ‡³‚I0[€˘ġƒQ& Ŭ½Ì(ğ-XĞ|b[ĊІúÏÙĥ-„|vvÖ1Bóĉ<Ï;ì8ÎQÛĥOĠgçï˙üï}ïçĜż˙ñ*~òŜPœ`ŜpIÂcĊa ‹„FƒĴ(sÑ6D ZX zv=JûÏĦòjD ĤŻLÙWżd—7B5çˆrQâ9Wî#·*})7û½F9…>T´3T÷"xûĵ:sûNvApĞÛíf½£Ä‰éÌTͽġŽ—ëv eğiXR)SÊX’ïû-Ïónğ{½ñĉżĵċÜûÙ£JÔ=Pjw%ƒâĊÚÀh0RŠꌣğŒ@`Œƒb nsR{d·ŝsµZÍôŸ[0£Ä-Ë:óȋ_yŝĦßüŭûßżİĴï˙ ŬôÑ´9j6‡Ë<ۂ-Jı‰zRîb‘;% #2‹ŠxyqCĦa’Tí4(ċ6#ËÀ¨h|Z–U´'Á¨c`!o½ŽSsÑM üÓVŜÈĜQEñĠ²û€*fĜé iX ŻBĉ‰?À’|ß÷=ÏK{IŽseáW˙x~ñ‰o?d (&88)}Œ#;q˙„şÁȘì'I`ŽHOÎï&V´Ħ<-ZȤÜÇ-Ë:}àĝ™G^úö_>Ómžšûğ·Wñú'аÂ>…‚Ë\ۂ‚%¨—B`ž}@@.kÈÙğm:0`À};ݍàpk6gDyV”4azFĊͰüĦüe:ŜswQ&d`€àŽ uûMĜóñ™ûœ_†Ag1cGYD9ĤWÖíXv´İÀ’€ápŒaI2SÜuğŬ–çyˎ\Ÿy˙'ïÔÎ="iš!ÖHßĝxr0ŠB‰$Qw=3Ê}ml4wiynÚĵY#4gžŭêw^:ŝôWNy9à/żvĞí Îà1…gİhA˸-ĈúF¨fhžBŜ[•‡ĉÉ }g£L—³ê·ÒˆžQœ´’ĠtU(£qĈ¨{ŒPҟe:ïÈvAÁ Ôí_âü˘’Ñ ntğŬċ!ìhWÂî6†dUĉg€†²¤8Žcß÷ŭn·ğê8ÎM×uŻxíżĵwù7ŝ—çEŒYH1@\0¨dĝÁŻ!“ğŒô˝ ô€ @Rí%0ÚÔ<nżá?wúÄŭ=ñâ·ż÷ÄĠ¸Y˙O?½‰÷/·áAa\ÎÒ(q‘…ĉiÛ Fĉ[R”V÷óò T0 çe3C:\ ĴhŒò)`JeQâ}I·á”?WÈĤÛË`”“äëKYgİÌ{×;Gĉ½_µÛŝ˘ïû·|ßoûŽaG"Ë UÉnŬ,İFĜÑP–”•îşŬnÛuŬe×uŻÛ7>ŭhîêŻÎĥŽ>zÌí•FşI:?qWƒÑàï%Résĉ{ˆ&eEë ÍKE 3s÷ĝ;˙ñĊĉÙg˙è|›ŭèŭkˆü3œĦĈÏp8àÁŒı"¤%*²"•Ĉw›ÙùŒ"Êš‘jPy—£ĴOŭµ2§°ËE‹›Üé­ı#xŒŠFİw 3CohŒ 0nâP+ïàŜGQ] ‚àf·Û]évğ~ÇáìHaĵwŬŽ*×ít†4*/iR–”$IÂS#pĠuŬ%ÛĥŻÌŭâïŜ\ûĈ#żI2à. ¸Ċ bUş!ÇħDË Œ ïˆ"·8˜%v aФ܆haĥ^Żï·mûˆmÛ'lÛ>ŭÀs_|îħ/}çÁOÖ,ç˙úÉ".,hÒRnê ¸Z–-°”‰2óŭW&P.ìδĝ1™‘é;'s˘£'$Ó~ŞY‚Ë}.ÚĦ÷`FŽçÜ%`Ô0”[ŝÜ`T֘`H•uŽ€ĵò òVWf\ç½v;ÈĜQÇàë]xOɎvĴħên,ÙM˒2ÓĠ°Ûív]×]vç†Ó^ı¸ÉOĴÜûÒ)²,p&R뛜PżĵàûIF?›@J;3gğˆ†•ċÊ@¨ÈІùÏÍd˘×u³ĵ?û­ï>'ÜżïŜğ_|şŠ,W0xŒR)7,E ܔrƒĤ9Ss.¨Y$ eş’ÁÖ~j+Üú3G}RyWn >™€Ħ˙‹é­ŭeŒŠ‡×ŬFY ,#€[àĥ Ġŝh} î;W{+ŠüŒ­ùoş2”Ííjv´ciˆ|KF(î2Pò}?pgÍqœ%Çq5ßü‡_}äjóx#UŠ1KŻ ”F9Ż£Üĉfúl/Ñ$ĴhÀÑh8FžmÖjµıZ­f†ĉ}ĉ+ż˙âégëÌÛ×#ñò˗qk9@ħà ÏJÒò\œÇëġ·{ïż.ˑ€İi&@èġ…4K’ĉŞÄÍÛdJ”7@5ÙéR_Œ àéÙ‘á`Dŭx*cEw]™Î<ÂôĦe; êBŜ|çâEŝIË÷ŻwğŬċn·Û. à51NàP1¤-bIEĥ$ –$p-p}ßïşğâ8ÎuÇqĉ½ŝ_Ŝ½üÂ_<Ċ0N.ÀÓÇ8)B˘a7İÀÈüٙ> Ì)“Üᢆ­’r7›M§ÑhÔ ˙ı™”ûĜ==öÂ7żûÔ-ĥżù7Ż/‹-8œ0o1x\Áċ€ËËÊzEİj~Àuı °˘Y"cΨ `ŸSސS”I¤”öŒsċî÷–+әé­Fy/Dš`cߓ`”?(Ñ3X6¸Ċ!oüġè‚êTŭużÛıêûŝÍn·ÛsôB“ĉġöDôï|§¤m`IŞP“RÊ$ ÷ŭĥëş·Çı6sġŭ÷çŻ½}²}ìу`6Ltt*0üم~’VíÔÄĜMÍJ¤ÜšıtÍ{žwPÇCœôêÍ{^üĈŸ´güüÓûá{Wt"48à1Žš8Vj„jñŒ8géġñĴ¨,ŽòV==—n#§¨ÏžTΝ!cNd™)Fèħ#EFıNċžz@nè”Dƒ@u7ƒQv8éı>ĈT÷2hé zĝLŭ×q^ ‚àş2t& ß+:×ì*v´›Ò¤½$U%–1&­¸‹}ß÷mÛ^uç†mÛsû^˙ŻŻwöŸû’´¸-ì$ÈXAĈ„$V ”éŒR¸àÙ%uO­¸ƒÁhËBó2˙9ÛĥOßóä‹Ï<ġĠ?~ĝBÛóŝǏoàüµ6êĵFCxpOgŠL)·ñĴHġJsÁw=aBZB“ŠÊ£Ċ)SÓ Ĉ‰÷VM?:ÊÏ{FèİċLĠgFQâ½CHċöošpcßû`d°#Ë„xuŭ§8>Û]j:Î{­VpµÓéÜêvğ­0 ³RŬ°ÒÜ8W†RvTÒĉ³$ \PüœY ĊA–eµÇYĥmûšmÛ³‡ŜúûŸŝ‡IPÌc~V`4Œ€töˆ9¤żw1+â˜@´PŻ×mnŜôŸ›Y8p˙ç~ï{/ĝ×ó-üìŭ+PĦÂĵáéҜ“ ¸2‚†”ÛxïÌŝÍÀœ0CAMg~?rRĥ£òRîì1À-¨RWne€Ó@zkQ1Fĵ£´ŞÀµ_ÀlêĉĞpƒO˘s'ëŻAŻT·âû~f šġŽŠ ;šâ£bH[̒†1¤Òı$4zÌ'§˜+Èĥ‡ÎóIÊÌ+*ˆr1”wċ6”sŞh„Zˆ€ B²2Ħܕû#Ĥ9ħéÌäġWp¸ĥ<_sßn·ƒĞŬnwİÓéĴùï'I’”ôŽĈ…ñíJv´Ò¤, %½¤œxA§ÓiÙĥ}Û²ĴE{ġöìÁ·˙áäù³_~€ħàx@ĴÒh… Œ†ž¨DfñTÔ@;ˆĤfEcBóNş^ŭìs_û—Ž<öĊżĵòz ­µM‹Ác ǂt°5ë1 aEYv%¨×ŝÓĞ·Ñb.lh§Àĥ,çZ´0ˆŠ2÷Óµt7`”šŠèİL˙ı Ì áx™Ë}ZĤ3çŒ$Ġ›)2”rTr>ŽÜ +Ġ``ĸu/A-½ŠÇOz>îvğ‹Nçv·ÛmGQ†87†]ċĦ²RY7|†ÉÀsÀ¤”âqGïwÇYħmûşeY3‡ßúûŸ·?ó׿$ŽÇìy0/ÍüQRU`dŝ^Ĉ ¤JKP‚oëĦżŝs‡2˙ıĈÜû>ûÍ?ħvĉéC?ĝx ?ùè:’0Á,\àYİ+·•óŸ+Zü ök2àéKĥó:ʀİJ2+£)5PĤ#iJıU˜Llí…çċ]ıÍÇQf́‘ùxF#JuşÏÊĈ8 ;×„“3í›s5÷­N'¸Úívot:Ġn·ëk7ïdBf¤ö;ÚU€4!K†g&1”ú³IA§ÓiY–µdYVMÑ8ùŜßżóÑĝ4d—ġt”^ê*ŞÀÈ|˜ħmUÙmEh^ÁnVĞíwçHĉÊŭ _ŝÌ#_úÎŭ,3ûß~| Wnh Áj ¸èÏ}˙9=*ÎĠ·öQù4Ve Œr›”ċŽŜ™"g+¤hP´@ĊÄV™·ûĦĵÄÛôÏËAOñë Œ†ƒQöJ Ĉ˜Ċ!Ż˙ÍĝĵÏéĉÏŭnçR·Û],)Ġ)Œ‚U%ċğ’ív† É£E‡$Š"Î9„k–eŬ´,ĞŜĵqyl˙/]>ĝÌIĜѓ7÷ĊóÔE_l~˙ˆ1ĈÌ+şM-ôQQ´ {E žçġBóö=ġKż÷Wυ³gç˙ŝŬeĵöÉlIiy38‚fH-L§£É_„>Ë)rïAİ7v@dŞéŒÏd‚•)V(Ĥ`”ŞĤ+·>MFĈ8ħTQ˅j½vûêÑ{šoĊQĝİïû×ÚíöRğŬnAJ)ËúFrʲŬcGğ ÑÀô‡²Ù$Ž0ÑétVlÛö,ËjÌòkkûÎÌŻ1k†Y )He&˘w;ċФÔíòÜ4Ħyġz½>ïyŜ#4ïìÓ_ù½O>ó•SżşŠüò VV48CÍĉép+c°YEÚ“eĤo[.äÎìQAmÎQ.£(iF†ĞB ë^r‚2Ħ4À¤XŞ“YO¨ôšġŒ¨ÌħğK¤”-PÁò§˜W„ĵŞo”?Ĥ¨y*0FŒi0²À8c 䍟à€ucġĜBóµN§sİÓé\o·Û+:ZÂ,Ġ ëÊ>*ĦŬŽvsɌ—ħ&˜†Í&™ıIĦeYF?iİqòïüää—‚D L(’èy½ê˘ğŒŒŝXj²J‰ÚT0Z+šX´PŻ×ġz}VĞġüçjÍÙ{_ĝúŸĵ8˙àgüô|‹ŭĝƒkğfàzé­ĥ XˆÒ_dHè(où“ġs”!V†ëĥ)f R£TäJ{3êÍĦtDŭŸQʊz˘•7BĠïİ˘Âû=%^ÑT`”½ĥÌJG"„€ĵŭœÖ[ÑC÷ÏĉûŬ‹NgħÛíŜö}ż†a(ŒQîĈ0IÖ0>r˘¤;Ȓ0˘t' Ÿ™î'EŬn·kY֊eYŽÂk^~ë—ÇêçŻ|òwmPÄÁl‘nÂħş{Áˆ@'`Ž|#ç@Y/p;Z·˙\£Ñ˜ó<Żç´`ÛöİûŸùüs˙‡?||Ûv˙ŝ•ëĝtħƒgX°<¸‚Ĵ7àšùÏċ_*•—T›ñ’´÷JqÙܐÔj¸\éNšÑáŞ%nĝҙsF(Ιr÷l…šF¨QâM FúB-cFà"•X{¸ŝ#ġĝıĉÛ* ?ò}˙j§ÓıÙjµZÙì *:3Œ£]ɎöCĥİ ³*%)eEët:m!„-„p…µŭ½ü³níÀ—V!ĉ˜µ$ÓáÒj*JäŬF=wU–JX{ĉŞl=@4Œфċı"+š×,†ĉÍ<úàç~÷/ŸWĜ÷àµó·€HaA¤&¨.gpX‚`1êIıYg%3•ħ£\D8ġĴ}ì€L#ԁÙĦLÚ­*¸r›ŝsJ ïe×=‡…ĵ*••íÁMş ç´ƒeÁ5¨ĊâácâӚ­Ŝn·ŭKívûzğŬ^5B÷&2ŒseÈ?]FğĤ8`Dé ”²~ҚÂB8œsïÄû˙ŭĠàħ?ù|ÈlYsP Àlž–ïîF0ÊJTŠ2ŭͨ cHëöŸ›™™iÔjµùz½~@KıO !Î<ŭċożpîĊoœ{çZ$ŝíGWħ´ä£aF¨5‘ıÚú‡ıï˙ö3JqÁÜ9§ĴĀDŬe:ÊżÊŠÀ,ƒäH ™”)•ùNí?733Ó0BózRî#gxìĊo˙ċS+ÖÁ™ż}}o]n‘ ó‚ĦĈ\ÁáˆtÀĠbİ37gŭ<3 µhùC…’œTj¸QŞ‘ôjş/ô{JŭĦVUŒ…0ĉŽ`JıK’[ÓäAWî,ùĠtA-€ ŒĤ#n–•*êTuóÌĈwî;3˙jàw/t:kív{I'ÀSJĵGÀÒngGğF°¤2@UşËġ—”R,Š˘ˆ1Öµ,+cINóÖ%ïÔċ͝?öĊ˜°ÀœZêukµTpö+vVŞ# )'ƒáƒĴTHe i½ŝs§ÜZŭÜgŝ'/|ìóÇŜ¸e?|ï*:DC)Ô—§2n›³´<§ƒÓL02Ŭ ”ŽcȘJ˙ K eñTz-FHh DŻ(Z0”r)ġÌŭ•ŠÜTÑĤ€‘Ž”`\€YÔ­W`­ü2~üŝıע0ĝ¤Óé\i·Û7ÛívĞÛíú†Ä{\™nŞR]Ċîà:ŭ˙}.|ï!6¤d7iéÎ,Û!ë'ĊqÌ|ßïèҝ-„pW~ċİœ_œ{ĝ0o1K³$Ё‰4'h݃€ÔNHp¤žvžĴŒŠ Ec˜QİhĦÙl֍Ĉ\&ċÖ˘…3g{îégŝg\ökŜzġ>ş¸†#,ĜžÍá@ÁK™QfùcŞÎsÎĜfÉM‹HûÑeIÒ-ŒR ıÀ<³§(?ËT&N0z,IċÁ†ú‡y` £éÀH¤=U!! V߂şöCzòlí]’чNç²£Ġ ü8ŽÍŒ£qB†qÒî]-dĜ‹%ğ”î€!3Jqnjħ€s΅çÜáœğ?ŝ·ŸĝÌ}yEñYV?ĉZ@ Ò9$ÙÛ`Äò› ³ìTĉšOŒeShEP"ċĥm[!ĝììĴSÍ;”Iıs ÷ŝ;ŭ˘}üħ˙öá ^ùàH)Ìı  áX""Ĥ£ÄY?™]ŸÜŭr2ğž‚Ċ2ó¨TMG@ÊċɢzÎ#äçŒHİAÑBH—érfy0"*=Ü*0Zq‘ÒdÎËs\Pûc¨+ßÇCÇĜùĤ‹7[­TâŬn·—ğŬ9o$ǔëĈ•êhŻ”êö pú˙ó]ĝ뇆 X C*n|fÙ.ǔ’$‰}ßckœsKasΝ“ï˙Ÿ„÷üÎ.êĴqÄÓ:IÏÉAҞeFÙô>Ó˘|šF0š$4oŸ.Ï·,ëÌcŸû­Ï<ĝĊß½ïŭÛd}˙G‹Xĵ É´ *—§­6Gê?ÇQš—Ë*³ôQyû9$>‚ÊzF9ĥeÌ™a}ʜ#*0ôß2” EWn*şrW`´yÎaÛ.Èżyċ_qn_÷ÚĦ9ïU-b¸Ön·ou:ÌĊ;Fòn+Ġí)†¤DÙd˙002KDbÏKûIq³TÀW4(Yœsûܧ˙\ûßy1fÂaµŭ 8 ܢX_1%´gÁ(ċ-éËÄ,^dHÁxX Ĝ¨@544O‹2тmÛgö;ŭç˙ݟi7NÌŭ·÷ÖĈÇаˆ° .Óŝsş4—™Ħr–•çŒĦP³$g8 ¨˘ċ 1J5ú?ĤÜì ™j;2ܔÏĈ{ÜYôzF°üĦ˘+wF#}9–F[İ˘Î²@É2äâË8ê^ż}êÌ+Ŭn÷BğŬ˘}êÚa1ŒbFŒT÷TİnÏ™üf|éNé nTÙn€%"&„XBĈ˜ŬdÌ>wŝŸ½Î~í)„>ĤĜ<%Óds/€ò†šPY+ùñ4İÍŒ÷¤lö¨ÌİE }˙9×=ûÜo˙ÑKǟŝò‰7.vù_żŠV'F3ÔàqÀ†€­… Ó3Eġfvúáu}˟’Ì"#,ݧĤ+$½š)°ĉżë•ŭ0èÊŬï’\ì}LVd€QÁĝ”ŠF¨mŒ˜>t9O“%,P]¨k/c.ŝ ŭÀ½ ?ġğOÑZ~’$Ѹx ŒûĵÀhoRLı+„‚˙ٰ٤QÀ„2ĥ”‰:N‹1Ĉ8ç‚sn5Ĝ5ûìċ—½}ù16#8ì&˜b R`%”/î0Ò$‹§ċIÁ§aH“ôŽÒע˙ÜlÁîÌ݇ž|â3ßüî×âfŭ˙xíŜż°O0Ì1Àc)3²Yêĥ r½"ÖğhȕÉyD9ÑÂ@ɎäŬdDH˜ÌŠLe^.ݍ˙ğsŝs™DöŝRħ—Ÿ#Ê9pĞ1ÇCFë#ĈžÎ1.!Ż˙µÖ/ƒ'Ĝ˙³0?êt:—[­Ö0ƒR²Ö7R{½T·wJvÚ-Ħ”ʤÄĊ+ 5d3”%} Äq èvğÎı`Œ Ĉ˜ĠX:oŸµZ˙D|î^ŜŒY °8½²Í=‹½F…W”¤*ŭ…š%+׳½ïš×“r×gĉîŭì·˙ⳍ³Ïŝá'kĝÙ×I…N¨A³"ĜZA'xˆz—-†Ë‚)ÍÖ=Ÿ˘j(ZM§´ w^ì`äċ=Êö4%^ĤĤËÏ@ġß.UêÊMTÑ–€ÓdÛé7 oüÖ­ŸĈO=°ïI|ív/µÛíEmšêGQMàÄ0Mßhϕêö ÑH˚ağ"0 š-“ƒ'açœi`²‹ïX'ì†wOŸÍ#à^ &PÌ(oí20ʚüİ_$Ëm|¤ùP–ùç](וIĥ‹l5÷Z–Ċuh^&Z˜­×ëûmÛ>â8ÎI˲N?ô™ßxîñŻüÑçׄóŻŬÄ'‹xJa–jĥ€Ë–@Ş ëe™ĴÈôŸË³˘<™8äĠtY,„Ù+R0Ê,wí&˘‚”ğà?gŠĴ(òï*Ámeğ‰İĵ›1ퟃ]Y>yïìŻ ˘w;ÎĊVеĜn·WşŬn™iŞRĤÖ7µomŒŝĉoŝĤ¤ÍeHƒáp…Ò]ÑëĜO*²$5¤|×9¤>ˆ@ğŬfŒ1‹1&8çbáòυdÜ*;"ÇğÎU:Ż“ĥAAğ Œ4Ñä=ġëğœƒ@ŒëĞxn¸B#B^Ì ²ßjYsG4 Ñh4j™hÁÍ;µ˙èɇ~óŝúyì;;˙ÊĊ6Ŝĝô6Ân‚yĤàĜ )+b€àĵgûƒĉÊ(›ċ{F9fTeçĠtTjxj–éÊÌVİP",FŠŬrĴ¨w U£ÌÈ Œ6·L—yHY`–&8Ôí_×ŝU=uñĥ+䛝N÷BğŬÖjµ– E]4ˆĈġîŠRŬŜ$Ey °ĵhŭüŸž|›JŒN%ġúAÒĠpíĤÒmUoĞ‚‚R}Ĉ“cHFY— ƒĞĉa@ÙaXèIV`´…`$2i·  jùM¨+˙DŸ²?œñĜëNçBĞĠşÖjµnu:V†~’$†ÏMk4x÷ùż§\äMH;¤bÇÙ¤vT?İĜÏ(ö”dÙŻVJ!Žcĝo$&cìĝĠŸp)Ĵ/,sÀGÀ˜…,U"ÙG*`à"Ŭa ,Uş2€sΘÍÁ ,ÁEŽIjPâ%%@ÙĥÍëġ:Ż×ëÎììl½ÑhÌÖjµžçħ,ëdcvîŜŻŭé˙ó Ç|öÀ×}öĉĊÛXíÄp )™"+V*Ŭ-ä|àT$¤1$s†ĵÂ.‹ — ċĴHU°ûA~Îh0JĵP+–çrà#K‰ ŒĥŒ,;‘Qjċ]¨+˙LçÍ7ÄkNç|ğŬÒjµnv:LŜPԍ1¨!•š(YŸ˙{}bó v $•x LŬOFğ9 ›žQ s]­ô×ħ“—ÄĠIñ…`Ž×ÌNí,ž ¸‘ë·ƒÀ¨G )5uëħ¤,œŽgl„Cpa $ĥkvDd‚Ñ ! \­™™ŻÙl6êġúZ­– ¸žzú _ŭÌçżñGŜŠûGĴáâR*–pb ÒñéJpÍ*´ó5KÄûĴ¨żù[󠆸/P:g•}żREтɌ³*ö–²2m>J\żŠÊËsŭ\˙XPŜÊ Œ6Ÿ €30Ë8‡Zŭ5Ôċ ‡ŽŞóûgìŸg`´ĥĥĥÔn·×t^¤”WŞǎ0ĥo´÷ÈÑŜ$’*‡™ĴtWÖO2ßbŽáöB0˜RŽ1iĤÄ|ßçĈżáŒ1~êò9ç×fYŭhʔ•ûI•^ÙÇ´cÀÈü–ġ`(e˘ŒġAIp!ÎġnqpÎ{:"*†ĉsÎ-˂çyĵVĞY³³³ġf³ÙcEŽœ8pôÄßü‹˙ù…ĉ‘sso/úxïÚmĝ­ L) `§3 uJ'ë{şġí”ê+ḛ́<*T>Âtî.‹‰è1â§W²CŜŒ5+Ċġ Pû=ĤĦĴÈ£Wî ŒĥpÎÈÒe:ÖgFòÊ?âÁCÑĊCóŜÏ4]^[[ğÙétV}ßïNȌĈġŠF÷>˙÷4`GVÒâG‚CÉñ— ö“Êf”ÊâŠ`Ċ¤”q†EZ6úJì̕²ó2ùܚ˘YÑ<Rnq0Jû 9m͘3˘Â_ËéRXú‘ġ”8A¤Q‡ûGÜ#fÛ6êġşĠl6½f³Ùh6› µZí`ĈŠô{öı§µÓ—Öġ×ĞX\ò)ÓÁ‰46ŜĜı3ƒfĵƒ½Òòî 4$QÉ\Q‰Qj-ò}Ħ‚!ŬÎ =#³W”ġ²úCj8+Ôtö⠌6Œô•c)0İ•· .˙#=p0şxd_í'Nç|ĞĠşĵĥĥv#K}Ġ`4LŜ= 3RcûF/ŭíUf´gI)ĈĤŽÎžDäÀ‡Ôs‡ħ'H)a€RŽĥYü .0ġÒİ9Ŝ<%-P’ô°9ӆĴ;`è5ûŠô$İ£8`ÄËPB€qĈH³#]ĥÚûO9Ž#´‚Öh4fëġúŝZ­vĜqœ“ç~âħŻŭÉ_?İê?ğĊ‡WڈӸDP,S JßìÁżÉìÉb³24úA½ĵĦb$„Ê+ëÈĤ#U(ÍQ™´ğ?g”2*-˜ÜŞ”Q!ÒµlO­Àh+ŒR³Ħ×´oÄ8s<¨ċ_B]ŝ'zè¨<hö3 F—Z­VF™ CŒÉċŬ„ ċ}£^y_˙3&*@Úy5ğ’ÙžÉûI£D€¨¨ĵ“(1£ĦÔĤ3×~˘.$É疕šçµcà5&i”Nä(6 tĜv0Êú/‚éÇÓĵ§Œ5™ÀÄ8#J‡NS è1#!„µZÍҎ z½PŻ×zžwĴŜœ9ó?ûŸ^:ûĝg}z;foŭzË­Ê4ôOŞWž FfjĞiñ“+ĞİœŠN–02£˘˜ÁTÉİĵów.$fZl&Zè  Ü4ŒPi8+êymé\¤{B¤=£[ż€şòôÈ ññŝ÷ĠŒµZ­­VË#³L7mÉnĴˆ!ż‘NŞJv;²dÇĤVžBä ŸMù”¤”QĈ”²ßİ?ĞÓx•˜Œ_ş=/÷‰ùS`ĥ pÄ)ĥġŠ]™ë€QßI:EĦbÔAú"4¤žŻ2zFœsÇu]ϲ,hşĤÁŠN<ùÒo>ùo˙LJÖPw~ôa Ÿ.ħLMi“$‚—=:2°ÙÙ"J+{=Ĥ£r89`d§"ß#R02†gİ í&D•Ìž‘ÉŠ çŜ+*y”áMWÑö‘°ôĞĈuë Ğ˙˘?e8ß°^3 ×µ€Ħk0£IçŒä0BÄ`½dΕıĦU€´@i*R5™È…^ÑĊ)ßġ@‰ôÊÂSêRüÜ£|ĉÀ\Àb @ö§O͘ém£ìFĉÛĈ˜–+bÙFÌ2ïm0͎cŽmÛµ™™¸k7›Íùz½~Èóĵ# œû½ïŭ/ŸÙwúÑù÷;xçòmtş‰îR{ÒI|ŒT F}¤rċ79P–3D 2?›•éŠ3FTpXP'nĠpĠw×ε€ †LĦÜvTÑ6ƒ·R½ruëçÀĠQOœqߛñĝëNçÓVĞuE—éFÑ8żşq{Àd½ô÷ĈŞ 2ŒïYPÚŭ*;Eëé!MšŸ”ġ’ÌÛjLù”ÌßKDê8~)-t-ˆ…³€ŬĊi?Œb‹b‡í£ĴTp€)ŬPcÙ< ×ÀÄR–!Ó2##ĈceYZ­ĥPŻ×g=ϛ­Ġj‡=Ï;ú…oüásÏċ[§ŻûLüÛ{˸ĥBĊ Ċú´•}Qòĵ²R˜êÍġ¤2Àh@À€k"ͨÈŽÍÊt=B.Bƒ QâĤ* £”<,ŻAùìˆ ŒĥŒ˜Ş"#&!Żż’zӝkÓpٝNçÓLÚŬétĤeFÓ ÀüÖKzĝĠ[€À”]V€´'×$ ´wżŒ)‘""yˆŜ•ĥ žż@ò´5{šñĈ(HtêĴê36ü$Ŭ*0‚!K–YżH³ŠġKPD`R@–bĈuŬŭ–eĠ„–ëşûOß÷żóç˙ŻÇíŭÇo\íâŭĊ."?e˘E}Ç!Ġô~şŞ.û·”9&$݄݂ŞB˙g–É·sÒnäċÛ`ċäÜ@Ώô›ĞÀèƒQϛ.5HeÜ£rñßaßúqüĝ½ oz½Ġn·/´ÛíĞ:Fb­ Ĥ+‚Q‚áƒŻÓ81PŽħ’­§g…UġvfıN­ï"r(‹Ğ˜Ôb¨ôħ(ˆ”RJ‘œ§[Eá'‰›ğ‡“½\¨À¸6/UtGÀ(ğ-i÷ LŒ,$Q`HR@RÇĥ2Ĉ€ÄvÜĉ×ŝô˙ñäÏ~ñ•„½ŭîmÜ^A‰‚Š“ô—ô¤Üe`dš–ĉ JìË·Ty *Uӕ¤¸ĉ ŝs†@Ħß32]{Ŝ9)7òŽ.d°½ *nòmébqĦgÒñ8.Ż@. oíµàéż˙şŬîd`tĞÓé´Ĉ€ÑzYѰ½Â–ÄQµRÙ핖— %TTᨘš-I)£ (ĊĦKRD$ët1~@Ŭd(ö=h3{:ìĞ(=ô³Rvù`Ŭ‘’ġMé¤ÒÖB ÜàD 8̲Ĵ˲ĉOŜ÷pŭkö?Ÿì°÷ĥénZ’$€¤L?ÀdߛmP•Ö÷–S†˘.§œÓ`$ j:"@Je˜žšUPә 9*ĈˆSÏNéw7ôŞA”¨,Ħ½ ‰ݲM£í#ÎÁ„8.B^ùgÌÇżn=ŝ‘Ÿ%qĝQ§ÓıĜn·Ż­­­Ŭîvğ-hR0’˜~Ö¨ĵoTzíË`^ í¨Z›Ô³2ùċàĴPş›ĥ„§Çh˘(êġ‘48I)eÒP*yH½|(ƒ§˘ù‡<Ñ<RVÚÀQ醟M‚n'e3 „Dt)0!Àâ$-y8s`3Ç`µ×ÄW˙à{GŽ>ĝüÂ;×}öÖĊèĝI:·¤HdöÏÁrCOƒ½…ĵš­'Żî•îTÎUòŒH•ŭğb™ıDŠò=#S  z Iy)wÑIĦFN méŝ `vj’ŠÎǐ—˙Gì+ËŜwĝ'AàŸ×`t½Ġj-wğŬV†Á`TJ´>0úo4| Ê^ ĠOmİiG•섎 ß(°—ƒ— ÎN͔´ÍÑN"İ”’D”4ˆâ‡äÏ;%á mJšVó`;PA f /Q m-ġ÷XB,SëĠ5°S'sĞ~û÷ñú—>÷IĞiŭןßÄċe OI·ÓTûĉJX90ċ-yz ˘rÑá2#Ħr½ œĠ)pŒ¨SQ—ïÁŞĴ §Ê˘ÄÑk" eEm?1–ŞéÀ41ê;—˙ ç:×N9Sßï~Ún·³×ß÷ÛaúRÊDÏmŭŭ’]ƒ À'èT€t‡Jv›Èĥ&—ƒo”Hç)Á÷}RJ‘”R)¤RJ6”JîUoDâö‹·_°ĉπ9u]š4jBÛ Fĉ…œ(1ŭƒ`Áv–Ŭ{ĉ_ŝu€ëĞ-ÄRBÔëŽg²qF`¤=ñŒžy@ôJvóÑ\)­€gJğaĜ•ùÎċ™‘Ĥgş/ô ıß_x.½Q1JĵŒ¨|ßÀh‹Á(‹aH/ž„­=/¨_WŝU=|Â:pùZ§ÓıĜét2_ş•N§ÓN’$Ë3*˘dLyN & £Ïŝ \ “9›Ŝ§ö ÷Ŝ¤M&ÊÁ7 JÈ@)ûş„'•RE§ċğ~SĥžżµOŭ÷1f-¤O@êŜt0Ħ¤R`Ŝ 02^#ÄIʔ %”"ĦÄġ ‚,XB€“L÷ƒÌލΘH½?ƒœòÉŞ*'N†YĤˁS΋.›cêÏ{FTˆW½§Dy)7úYŻmžT`´M`B¤ç`œ§fİr êúżŭJüĜ=ûŜİğì-]˘ğÚn·oĥÛíµ :QE:v|˜’nXÏhĜœ‘ù €‘ŭı˙nüáԗ¤÷ÀIB™‡žĵ¤½Jĥ”JéşRŠ˘("”LéR"ŒöÑĊ°FÁ'­ċü–˜9R *Ñv:R•ò¸­#sH%HhĉÁ”’°,ɀ„¸à2…,W úËÈ(ƒÑo)†ÎċBüäòàC%ì§>È òmE}ÙµêkÀ0BI”xöĵiĝFZÑö‚çéĊ×Î ĥ jŸ‡\|sÑŻÛ=xä Rñû­VûR§ÓYl·Û·ôŒ‘ÇqT;>jàuİ £üß ˙rċ8Ŭ3"Ïs‰|vMH;Ĵ‘´ċl³™’0Ì8Ž3ġÒ+‘RĈRʰ.eĝ°ôW?ŠÖžò)ŞóúqáBFIú+>Ö{‚‡í£ìß)"„ÚlTq@*))§à œ3]ĥ£4/Ks5Ĝ‘ôçÛ¸Á@Ï[?ïb֐*:*¨Ì._ĤË ²ŸO9CvŞ+Rƒ/UDi´ĦFF[ F›6 i[.‚ZyòÊżâdsùĉ½gŝ§Ŭn÷rğŬŜét–;N+‚ Žpŭ˘iÀˆFƒ‘J†°WġL$5;êÍ!U%ğH‘Ô–èÇÌ(MJ4Ae‘2§´!ݤ”2‘RĈJݨ”˙€|ĞuQvžğ½ï‰ŭ|î,¸]bJK\‰LOdnÌdm™X)HÁ %ƒišĴĊ8c܈@7>3Ò^„f(`ÉĈDJġJ…:ÏÎèç ‚Ln•¨?ÀjH´É( ˙Xö§*Ĵ^ݜ+7 gEmġƒşݤ›Y@䍟‚-ŝ@=rÌŝôàÂÂëŬnçB§ÓıÚn·ov:ċn·Û)(é䝣üß;¸µ™U‘*1v²#–öRĥĥt·ÙLİĴ )et§W,ŒêRF§ä†j?{)X9‰Ùû¸˜9žˆ3¨(Ö'ĤÑWÚ026 •"b•‚Q’‡Ž?ÏĜëUIG[äˆnGcĉQo ŒÇ%À£²„VCQ×˙Y@nÈf&Q™çĈOÊW`´y`4pĈéF$i—n(`\ÂĊ7!ݽ wċµèñ{½íÙx§Ŭn_êt:×t‰nµÛívâ8 %Ŭ¨^ѨÁWÚ0ġ|êDd•éÎË eŬdF{hkM7”†ħŜ­”˘$I ‡fI)%“$‰”Ħ”Ò_P—ŭĤê>üakñyô)—5OƒÙ68gPq’œ2*ž[FıŭZ"I½2]Z²Ó`ęÑ?"}êħŜŝ’.*˙s3pŒHp*>¤ßÜ`UĉÏè˙ğŜŸgXüé°>j­Àè΃˜Žç áhsT‚Z}êêË8(Ĵ<ôÈħŸ'qxĠê^1úEí ş#Ä “ĵ–Iğ×njzyžéöÑ#so˖2pŞĴƒv" aËċĝ[À”h[ê ê^R:5›$‰ŝJ)ƒş”ŬG½Î­‹—WžıÄ~k˙}`ö<¸äéÉ-UŸ)ñ’}q ÁÈüE)kJ@F¨Ÿ.×1=‹¤ÙR&!éĊ [B!^Ŭ0*%PÎԔL#ÔŜŸH…?ĵĴI“nĵm ¤•eòLŜŸ3bĉ¨P]ÈĊƒŬĝħz˜sñŻA÷R·Û½Ön·ot:ÛŬn·­ûEfŽQR†ĤħÚ™GRP½íìÑ`™RÙí’ŬĥħuWĤUғRR†=ß; Jq’$A=Iş§jñê܊˙Äù`é,|Ìbc@ÈÀ IO³”Q0s˙ÙZ0,½iWîŒPĥŸ°>ħŝ• 3^:enÎ*Ÿ'”ëñÓ҈k Œv.ħ²’³ÁŠ€´L'`;`\€ÚŸB^{à=˙ħŝÊĉêƒvğ}EƒÑ­n·ğêû~' 0I’b¨Ŝ´t†^ħ>0B)B!^˘¤gd:€W€´–T½<“J„|lĈ”ñÄ0Ĉ¤”˘8ŽA}DŠ’$ “$ ¤”ŬfMvEpóK·ï~ĤÉë'Áœfz²†IßĊ‚ëù%6ÄÈt Á(7!Ż(<Rı@S>Ż ŒöĴŽ HB, LĊPKŻA]ûšmßsPÀtO˘Œ™ ·°ß&0*˙ùjĝžVÑŜ# #΍ò]:àÊÒîîU$×{ġĝñ3ûŜŸm,ĵÓív.wğŬĊvğ½ÔívW:N;SÑé~Ñ´*şiġ0=!u`Ț¨Œ÷g”*0£lŝˆïÉĜ½1‡$·w@lJPb%l‰†ï˜şú}%m3¤²ò]Ea’$])eûwµµ€Î­]x$:òT/Üĉ4@QzŽ1Rú:rĈ=…`ž Œ*0Ú~0Êŭ1fyN­q͈,PZz rñG8^_ıuÏ#GߐItĦĠj]ívğ7:Î­n·ğÖívğq‡ZÒ=‰pa\‰nKÀ¨˙Â(­²#cGáyfd>Ġ`ìN\¤íĥù·NJ„òäY9ÁMCJx[Jt Ϗ8ˆ¸[K’öc^çڵ뭧/Ż\9Ê?ÎYŭ(¸° ü85£…ށèı=°ĵ Œ*0Ún0ʚĝĴ˙Áµç`B@u/@^û!Üö[ág|8Û8ôžïwŻĝżĜétLVä*şitœĥŒôkĊ o*Ĉ”S!Iıê!íP8 ™Rè  Gġ'&m9”ħ%J’DĈéò8î$I²vÀ×öñàŜO>½úHûSMkáŜ´·$ LX 0IŬ·Y´£ Œî8!^Ón –“ ’’_€˙˜NÍ7Ï>zâ—q^lµZ‹šŬîvğĞŬn×0˜²W´žŬĉQŭf”éH3#6g­i'­;œR•|†÷ŬDÏy‘°Ŭì) œzV*2ġ]EQÇq§VеjI²ö ×]ĵuĞóĜ§ËO³ Ŝ< ÀMËv‰ÒJ<ž7nĞÀ¨£-#£˘ŬpċŭÍY0ĈÁ,µö>䵢|è?|Ïá_לúû~·sÍ÷ŭëš­fAzqÇJİdÂ…IS^7ŒÌëU2Î Ĉò=£ŜëĊó%ĵ vĜâwžşnPΆl%ĉ/ıO)TĈ–¤”2Š˘8Š˘0 nĈ–ĉĵdġI/¸|ŝâĠÇoÏ>4o|ĵ~2ĉ`QâHÒ#™^f),ï$^QF#ĈŒ9#£½šZ¸íL€ÂëHŝìö/ä=ĵ“÷œx3 ƒËkkíëïßÔ½˘ĥïûŬ!ĴH(ύš-šÔ}a“ÀĤ]sxAÀsú­i-Ĉ€dgĵ1…³a,hL OĜ’ÊĜRÇĦî+µ£(ZĞĊñÊ9·{ˆï?ÉGŸÜzÊ ÷‚×g ˘ÔĵÙéP-$“ôŠUŞòtÂÍĥ£ Œ~lΔ´ŬO6’  ÂJ/ŒdêÖkP‹Żà{{ùŜĵÍ!?m·[‹ïßèvğ™hĦ†a+R˜Ìma\lĨ×ͣ요úEYh@Kù×´¤´bÚQ½½ *ÊiQRÂ+eNfo)C(Š‚ ü(Š:ġz}Íó’ċ'Üî…Ċ[­'.Ŭúġ1uè !fρ9TÌÁ AR3%]³ÎŸkU`4™›fïŸëÄF;Ŭ‡… 1Ôòğ‹?F#:ï?xö‡ ïa,v‚àş˘eß÷Û˘IKs“°"5aynÁ¨ĝÂiRF˙({Ĵ7ƒ„Jö½sËu;‹şn@ì`ö•Ĝˆòr[PRJEDJJ™Äqé? v£ÑXġ‚ĵöcĜ­÷âû5/Ŝâ0 Ûm˙z·Û]êvğ·uŸ¨†aÇħ9W4 #•ìş~Ñĉ‚‘!`ÈÀ(DŽôJġ%ßUi'YG]GOɧâí(уɒ„É–t­J’DFé 4SjGQ´âyÑ­n°x„Çg.~réÁ[µÓ ÖÑ'ÀgN‚‘ )X,A‰ìy†éhցӳ£ Œ²•ÌÎ(ú%À²‘˘200Á :ç!ŻżòŽÁ˘3?úäċú=óâĜ`µc`–­Ç)5mí ëi?-IŬí`dô‡¨·iêXˆıgà Ħ: oü lċ-yzżyêħï*™\ñğA,ùżÜívW‚ èĝ )Ïİ)Ѩ°­ŭ˘! )FEz}˄RZ}òĈk°Ú&Ç÷ÛK'xŸA^ f†·‚ XîvğĞA´ƒ µjR(Ïm&) ïǖіƒQµ*@ÚA „!ċıâmV¨aÀTü Rœs!„°\×ġ\×u=ÏĞ×jµYÏóf50ísç îħËmöÀ ì[ÀáDŽĜ˙ fÒSĥĜĤ{CoA͞ĥĊñ§Á›ÇA’§½% eA.UŝìOda§ Œ6FCt2#{F̈ĊÖQİN†s$C¨ö¨[ż„Z~³|µsìàÌÍûg?&%oFQt;Š˘ċ0 WÂ0\ÓŭĦN†ĦVÍEzFnÚRœÄp7îIE +ŞİZ›P›”-*ċ‰Âŭb ÊzL–eَ¸žçy˜šëÎş;ë8΂mÛóĥmï[ŽĴ³‹:zûçĝ{˜uô1p{Š V@ĴûKŠ@$A’zv(Ö߸‡E  ğŒXùk2{z÷qmT˜É´ıèĥ„–ls@% àäÊ;PKoÂöŻ$Gìċc‡ö}ê9üjÇ·£(Z‰x% Ġ0 Ûï·0ì9+è ĵġÑz XQF Uk›ÙF“| ç\X–eÛĥmkDŬóĵş8MÏófm۞ugŜĥí}Š;otéÜ͎Ú×ĥö7ÄÂ=°?V;RVZĤKdZӊ=ÊâÖ³4eö•JvñQ‡/Ñh<ÚU`D“•éĜàkŒ˙ {B*ŭÌt(VĉÂa †gIŠoC-żuë°î%µŻF­#ç\h|ÇñJÇËQ­FQ´EњĦ–óS+Ċ(’R&YLÊ€™´74Î Ó²˘ Œ*@ŞÖĉ³a 4ĴŒ7 8 cLpÎEVÎs]·ĤŞá8Όŝ˜³m{Îĥíù„Ù‡nväé[>›_ MpÖÑ'Áœ6HI ‘éݐ}ğ"F,uÏ6âìj^ÉҍşA˘6tgÀ#ŝ†Q`óĊ´ŭcœ§À‡S{•œë#³m@ĊPÁu¨ÛïBŬ~Üż&÷×Tëı›ûçêŸİċŒ EQԊ˘¨†a'Š˘N†~†AEĦN3NˆhÖSĉ]6Ì:zbE UkħI„Ó2'³Ï$„ÂĥmÛ²,[ ôjŽÔ585mÛn:Ž3cY֜mÛs’Ù–:òô’}˲ѳ' =1{Ìj¤ =R@$û*’ÒA\İònÈ(ÛzԔ`T†j[É˙û‰Ác˜Ñ80 CĤ,Ûx"Bä…â<Ŭï… †ÔÁqfÙ xÔµò!ÔòÁuı†ŻŜ7{}˙|˘Rr%ŽĠ8Ž×â8ni ꕆ°ĦQ„"È! 4ÊwNŜġaÖ?+ŞİZÛJ“°Q3LëeM€Ĥe89žçıŽxŽÔġG§Y˲f·ĴĝêĜ²Żö/˜‰œŭĥĜ/āÁkĉ˘ÎRA„’@˘|éë£ÙÓ³Oé´;e %UyŒJ+|ÈSħ;FıÜ #‘¤Ĝʔp™Ż™Êú?*ŭĴ§ŭ™ ÎAJĤ ĴœˆĦڗĦV?­~ĠşŒY;èî›Ğ·çšµûçj—’$YM’d-Ž–ĦNÇí0 ğQùQġ š É)Ùa´Rn½b…ŠU€T­Ĉ–&ĤQCĥlŒ&Áë !lÛĥÇqҖ“ëÙĥ]ËÊĥíĤeYMÛĥBˆY˲fĊŜî¨cËŬdv5qT?$ĜÜ)ˆ}çÀĵàn”ġ˜âï•÷(Iz)ݝÉġŝÄy˙vĥ= ‹Ĉ0§-é ³ŬÍîÔĤ”"3Ñw€V:šIĵ·Ĵ´‡Ĉ’mPûZʂÖ>µ/Á•­h˙ĴÓ^˜Ğß^˜İ]·’$iK)[q·“$iGQÔÖàӉ8ċ¸8Ž0I’$s“/"š ü6/4,,o ŞXQHĠşÀ4n°ĥhÔ:j†i0M R,+éit²Ì²ž885Ûĥ=Ûĥëĥm× pjX–ĠB4WC[óċV4×BVĴY›ÏŸ?ħpÌ]HƒŜblKÔïE ™ĤĈ‰fRomYZ)Oٖ€JÒûÍj]Ïm™ú–G£˜Q‘Ê”O=ÊX&³Î€1s= J{=,µ!$Ĥ_N’işjöÓKSV•,='u ˘eÚ¨ÖE¨ÖMs3^wĥá­ÎÏÔ{ż™$IGJÙN’¤Çq7I’nÇÙG`0Ħ „dĤ’#˘I L‡1Ħ͢QŸ+ ŞİZ𤌷‘’›œrßo‚“^ĥ8ĥ8žmÛŝ¨[–UÓU·,Ğ.„¨ !BˆF¤Ĝ|+¤Ckœ_ë&ġv"jÊjpÖ8Ŝ8 >s |öÀ`ĥ£Ë|’¨‘ZÍÊĴbıÏĴ˜eċ3™šÉöÂç²áŜ,Дq`™x€Tú3ıĠï÷(]ZSé 0éó"%µ`‚k0JË,˜l ˆP´ n‚ş‹PíĞ ÎuPp 6uı†Ï6ÜÎlğ5ßtoİ–”²#ìJ)ğI’ô(I’ÌÌ4Ô@eC@ˆ0™›ö44ˆ€Éƒó*0ŞİZw 0MPe·KÁIËȅeYv&'·mÛÑÌɳ,Ëü¨ !8çŽeYĥ$Gƒ•9wcçÜáœÛúk›1ĉt#5›(ÔÚ~2 À bċĊ‰Šï„ħK*—(!;Š JöÊq½=òR³OòïF­ˆ*0ŞİZ{¤Œ7˜€ò<ĤIj*ò+0(n,Ħ½Œ„'!„°Eşz€Mbm-G·ÁËn[úĥĊ³cBXŒ1­D*xc̏¤ÄÊ)ÌÔìŽ%xĴ7Ĉ܆ŞïSD¤ˆ(џ%€ž“ĊĉgTĴÁ(‹fˆuVPĴÙM,LôGĴËnħLW"TˆT ûĦ1 ħ ˘_{D@Ġ'ŞİZ0Ħ÷6bmŻ\È(dwbĵÁziT mXYMMñsŠ·'ù°Ó€¨Z Ukç­ƒ=İbİm ¨° gcʋîëŬ&"H)™Lٓ°F”1͒Ҩ Dc½Ĉǰi6óa ”+Ĝ&aPÓÛz,}* ŞVH0Ĥ202żo@BĠ¨KRcĜ,ıŻĝ37HS–/‡­q%ošàŝa€TöġFjğ>0eY˘jU€TÓP`b%·B'dM4TÊXT¨Ìû&abL€fRfÄ6ñ§ obӔî&µ@›äwNÊ+ ŞVHĠš˜†m€Ĥ(ñaƒ÷bA iÇ1£MPşWÒ˘ oOZÖÛèŭžËÄ TQµ*@ŞÖ8`µı²!_OZĤ`ú’Ü$è#6ĝĴ”Ö˔Ĉ}½žï÷û*6T­uŻJö½Ŭ/8cğêéŽĝzÚÀġĠ´ìgV4œ&ùz#ìh`š¤ŻLß[ZÏc“€âTlh‚‹ž³Ş}²bHĠÚçaa#ĤÀE0İIz:ӔŬÖS–›„Ĉ›ġ›äñIĜÑ0PXˆLs{ÚS@T­ Şµsip*˘QàDë˜I 1;0›ÑK˘)ĤaOÓ2‰ M+ŞVHĠÚ Ĵİxß8ñ "ÂĜŒÍ`?›ĊŒĜ_·ġ0IĜÒz |_BĠŞİZğž5ħ_Ó@€Ú ™¤6|6ƒ!M³ĦӘû'-éM @UФjíYp*ÛiBö„!÷m6Z/ĝ°unÊӂÔF˜Ó8›€*ŞVHĠÚġà4-@ŭóhàf€Ñ¨ï™F°Pš\&ŭ·UФjíypš”= û“€Ô4€´ ÚLÙ÷FĜÒzk#TPµ*@ŞVP%4 ¤F1´iiY/CZPm°Lv*ŞVHĠŞŞäûĜ„ UösF›§%ÚÀk°Q Z/ĝTT­ ŞU­ jR&4xLÚïÚî×`’ç³ V­jU€T­j­cÓdc6oĥżk;ŝġŝڂßW­jU€T­jmPm°î$ ÑŭÜjUФjUëmôQùm„1Ñ6ŭ}ĠŞVHĠŞÖĴQ ĥ™ PKµŞUv²UĥêĠŞVµŞU­°xġTĞZĠŞVµ*@ŞVµŞU­jUФjUĞZĠŞVHĠŞVµŞU­jU€T­jUĞZĠŞİZĠŞVµŞU­ ŞU­jUĞZ UĞZĠŞVµŞURµŞU­jUФjUĞZĠŞVµ*@ŞVµŞU­jU€T­jUĞZĠŞVHĠŞVµŞU­Ŭ¸ŝïY_9–½oIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DeSmuME_32x32.png0000755000000000000000000000273312467662066020664 0ustar rootroot‰PNG  IHDR szzôsRGBÎé pHYs  šœ€IDATX­–[hWÇ3;³×dÍVrSĞ/!É&µ–ŞĠhéğ/A/…*è‹ĊzÁúJİ>K‹ĝPŠ/"­[-^Ò(Öjú`‹Ö’hĞFŒ$ٝÙŬ93_fŻ1šĴúÁaÏÙï;çüç˙ó?Ÿ…o 0ššZˆFcôġŭJ~lAt]G×u‚Á0÷ïßċñ˙ˆÇkihxċ8ĤYĉ˙Ĉ&cۏ?ôËÇ"šĤ gÎܓ”%rŝüéîŝW._•uë>@vì8,ĥ-20 rúô2_=׌DM§­m –•dddˆáÑQ=ŝ÷ïÍd×5ܸq‘İÑ#£OĉÁ8—Í›—SSSËhÎ7‘éùN[Û.÷ôpñB?˙tŸ·:ZÉdЁžç·ożéĉ΋;?`Ûĥ/}şÀÒKıuËe`à[·~N%&sç&äŸğ"_í@Ží•ë×@ñ7ċŻ?EfΜ/LÓtÉŻsïžÈ† û'•‚"àz`˜L3‚ë]XÖ]]½Üş%lÚt€M›ÒßïÒÔԎdÀ“É}ıQ:Pʧ9OıR%\œNۈèd³ÍúŽ˙ĤÓvañ¨ì ˆĝó_]ÚpUë‚rŭ9-ŭŠÈo:vÑÒħëú€Ĉ²•ôRò (ÇËÑê•3à‚eA(%ĥqœâ†"NC29”KEÑW€Ĵh&Á`M3qœrÉ$tuŬĤŞ*J&SÎÀh8ĝq3 FÈĜÜÜʙ3Ž+şÀ„l"‘h!UšfäDÌÀJÁüyíJVžŬçšV"Ċıa‘;]ày.ù*4íE ĝ½$( ,É=RŻË´J—÷ĥlùžÙ³ĦëFîtg…˘ŝA³GÙ³·aċʏéì<ÄîŬm$ÒÙyˆ“'÷pîÜÑ èÏù*ÀŒ‹X0ż™ÁÁ~ûikkŻï,}}gimMŞXl--ĠxžKUU= A,6£rkÙl׃žžïXġÁ*NÚ ÀêĠâ°m<vT݈ĵ,ÏóOğaNAÂáj$÷6p‰Hy^ıH½€ĵŝ‹çŸ§Dí\§h&ĥ=Œe 8Ż€ĝ”*ŜDċ–3JÁö헨n •z %ÏBĦ8Ñ(„5 C0TċO4ŠÚ Ċ0 H$#ĦƒħÒ>Íí'vşş™5k‰„ÂĠ N•Ù³—ŠŒ9s–úápµ44´K]]ĞÔĠ·ICC‡„Ġ.À;“с@G>ĊùëÚĜĝ6JsywÑ:ž§L>ì oÂ4#A4MÇ0"ô÷_ÌŻŬü1Q •èn;psÖĴe|v°Ûۆè?À² 2”۷뀰q/47ÏäîŬ!”J£T–#GZPʞ´ÉĜ~&“dd^½Àŝŭ$-¸ví ;vhüví ÉdqZ29ē'pâÄžÇħc+ÇŬ|ÂC8‘ë‚Gpœş@$÷hEžİ<6lìfJöíĞ"›M<JJĥħċ›ç•_K/§‡żZÀÓ§· B¸nĤ˘·àÙŭ_P3ĉK´R|)aíÚ^vîL£iWPĜÔÀxt&3‚Râ3"îĞ3à*?·ù*ıŒ²èĜ646Ĥ…xÑğ4é3`šS1ƒ`˜qBĦ8fL3žóĊ1͢2Úö0Ĥ ë×wç ÜWШŝL]êëWÈ´iÍH}ŭ İİi@jjZ¤¨’şfÊôé‹%OH<žÚÚwK•0Qşĝ˙îPÒÄIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Brown_16x16.png0000755000000000000000000000016312467662066022053 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(Ïc<âË@`b`Ġ0Şa¸jvï1qDÔ-IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Pause_420x420.png0000755000000000000000000006314012467662066020643 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊF[‹IDATxÚì½ËŽ$Kĥž÷/óˆĴ]{÷éîsĠA‚i(@z Λ!h,hė@½5ÀóşQ#j@€ @H€„ñ\Ĝ§{×-3ŬÖŻ™ı›ß"2³Ş2=ŝÈŞĵDĈĊ-r}ĥ–­‹‘„$I’$½µ‚.$I’$ I’$I’€$I’$ H’$I’$ I’$I’$I’$ H’$I’€$I’$I’$I’$ I’$I’€$I’$ H’$I’$ I’$I’$I’$ H’$I’€$I’$I’$I’$ I’$I’€$I’$ H’$I’$ I’$I’$I’$ H’$I’€$I’$I’$I’$ I’$I’€$I’$ H’$I’$ I’$I’$I’$ H’$I’€$I’$I’$I’$ H’$I’€$I’$I’$I’$ I’$I’€$I’$ H’$I’$ I’$I’$I’$ H’$I’€$I’$I’$I’$ I’$I’€$I’$ H’$I’$ I’$I’$I’$ H’$I’€$I’$I’$I’$ I’$I’€$I’$ H’$I’$ I’$I’$I’$ H’$Iҍè K°=™Ù7ğН_*îqùµfO¸’€$mۘíÁĜñÂëáŽÖKk& HÒ. d7´û^3xÜziÍ'IÚ5„ì+~÷ZŒĠô{ĥ}ğ`è¨5ӚIWG XëíüÒ%ƒeÏĝÙµ;ÀÈ-ŭœÏĝŬ·†‘Öì+ÖLvM’t}ğlğùÚí/ĵ×2pĵ8—ŒĠÚŭpe§moŻY³§|5“ä!IŻî!=.Óï=ġĥ×´Ûĉ…ÏıŭµŬ÷èûżùÍo^ċâ/ŝâ/´fßhÍĤ_ËÉC’Ï3Z3bġ×ĥò;Ïġ–•Á3~΅˙mò?ħ~&1½íĞé0Қ]ɚIß_*ŒŬ/œìŒ ùŞŻëï7ĠçċëfòùÒGĝ—îżYù0yĥòZí’Wħ ­Ù•Żö_Ÿ%Iڜwô”³½˙>ÜŬŬ…~ĝĦiš&‡†¤‡@ÒrÈcôżğ[™ŭñ/}ïĊ/ȌçB`ŭ½ò?Iwwšş£ŝü9šïïï}²#³]÷xvJX[33 !ۚığ·mŻuÍ$Iúú]öt·mïßż·_ŝò—ÇŸ~úİùñÇßŬŬŬ½;ïB™H6µçĵfìµAğdèjff\ĝÚI:Éëş6Ĉxzxxxx||l?~üĜÀŭŭ=ĝ×CΒj͚Ĥ9hö°fî~:N§Ç¤zÍÎAiéz N’tĊ}Çĉŭû÷‡_ŭêWïĝá‡_Ç_‡_„~4³;Çb¸&Ĉ˖ ÜнħA›:’4³–ä£ğß·mûñîîîçûûûOîn§ûûû.îĤkÌÚZ\³Ÿ~úéĝĞ_ŭê‡÷ïß˙ÁñxüUÓ4ż!ĵ7³wċïĝšÖlJkkv"yŠ1~y÷îŬ‡wïŜ}ĵżż˙Ôĥ->|ĝPŸ%-m$ä% HÒÖĵ˘ú‡~h~úé§wïßż˙ƒğğğ?ığğûóág‡á×föS6pK†ÌW¸ç™Ħ ='ùàîŸğû]Ó4Ġ4́¤µmËáPhòÁ’aûÇ˙ĝ×ó˘5ûñÇß½˙ŝ—ïŜ½ûÓwïŜŭùñxüÓÂxżá5‹$bŒŸÜŭw§Ó鯛ĤùK’ö‹_ü"~ŝü9>>>–ÍC¸%I@’Ĝ+ZÜqż{÷îĝ?ĵ?ż>çï˙×˙żx˙×c÷ŜÈ;Á ÙjPŒ˜½q˙NÒ,= A’€Y¤…Óß"|ŝß˙ġ˙ûĜ?úïŝQ×uñŬğwÇñ VOż6p‹ĦËÛĝW^3[Z³ğğğïîîŝŬğw÷ï˙W˙ż<ĈŭÎĜŻŽY0ÀŬ`6\+gëgĠu-?ħċÒĵà ôWĴùñÊùDZxüËG|ŝg˙çżüç‡˙éż˙ŽÇcwww÷`fm^³pĈ£ĊÂC€¤+ñ–Îı4Ms8~hšĉ×Çñß÷˙à?ŝÏ?ŭá˙úhÀ/ xàlHqÊ'á (Ĥ–.XJĦ2‚%ŞÛxŝ'³ÙÒ·şÏˆá>˜M“pO7oIÜ;3ˆ˙ëKÄżûg˙üĝÇMó?Ç‡áçá2lS‡7ÚqÛp]Y³ñĝiš_‡??ŭ½˙ä?ûŭ?ŭô΀_™á}c8ZîÜùşMƒ‘VA 0MŜ‰XÈù˘˜‘ˆù"·tíëû$'8*èì×LëĠEâ#~ß:ŝÙoïñ7ŭOùwÇÒuŬÏMÓ|ĵğğ[Z3ĵñšI’ôD£ĥhê˙Í,˜Ùfö‹á'żmğcÛ:ŝŜ]ÀÏ1˙MGöŜ>ÙzÚä{Ç Ÿ£%ĝ”|^p0"À`6ܟ™ÁIx~Ï÷׈ùû€“W\ÊĈĠ² !C-SL€öċßükÄŭŻ~4³?2³_˜ÙğB}|Žĵ7ÑRjó(ŭıišĤĴYÓ4òWŬá·Ŝá?zÀ߸ƒÌ ĉÈ;ħ í@s̈;v° "$˜5!ŬŜ&מ˘]ÎÓç­;Z=AȊ+ä… Ŝ1-Á  nÚżùżaó˙üdfBĝEáz+-… "Işb=% Ììà`fïÍì—Ôş˜C6Ċ²WĦ–b½cöt‚̇£ùMt@U`bç0&gy§íì½#/˙#}3˜:ïĴ€‰è²A,ö,Ĉ ˆŠu"Ñg?Üá߆p×4Í/²!ݳ}%Ĵ95pßÜĜÙ¸ĊĈı5Ġċä5ğžä/iܢˆ„û°vîL<`@˙ġÁ ï@ĵ iÍO¸/j !Ô, W„ysÀĈàLAD3t$<œ:˘%pñprœ<żY ĦĵxlùÒzşoÀŻwĝÒĜ!„_ ;êf*çÜßbÍ$Iú:H­TÁŬOîÌì½ĝ1böŽ<‡eJÄĤŭd x!ïËûĴħâKgùdúĵ€£€c,Üxgf?ÀOCì<]ÓHÄê)zdöéşżÀ;$Ïèà DM3öˆBÀàv󟽚ìÔÀHĤ'B3Ä@DZgòĥ‚Ħ‰D FàKôaÍXíböĉ,Cé.àŭğÁĝ!ż?›‰‡dO]3I@’?tW \“Ħ”œ3ü`Àç~‡=ÓÚ˙`Àğî9 aĜe×û˙â_Ġ˙úèĞñ“m,íÚ-̲w²[d$î9îQĈIóËôĵ !ƒ”’ÁŬ›œaV_‡éû­gîĴÉ@²)Fځ† FĤäÖŜb>ż!ñc0ĵ3à]°äњĦ1â@CĊ‹ĊbCVp§&°ñY9ğ †à„…´ìV}jY2&‰Ċ ‰&żyòk<¸{)Ҟ_Ĉ'Ĵ™à$ IWĤEçîĦ| àĝĴ`Mw–vÖŒÒvĥO`X@=×"˜ [âtÉx÷EßĞɰ²`‰F% Úr}Nï”-\—×<xʨ‰QĜĴWù>Ŭú¸âÁzI`¨ñYZ7$ĥ1$™Ħݲ&ıtŝšN“+ThÑ“· î„[€›}Hž’Ú§VŜœ;pġ%°ĵ‰ kÌÓżIş²ŬÏ(dWh – [9‡XJñ`L7Şö7² 6ıïàÀtÎx>CâŠEÏħœ½b̋Ğž>_yŬž²f6Y3#hċx†Ž}ŝ;³çÁ=6y€P6°ˆFÀİ’SWİŝ>ç.t@òr3Œ8šĦ „uÖöŜ[ŝĞ2mĜ<”DX¸&./H@’ĥ[2tŭ÷z£V vÊ#ï#í¨€`ĴRƒÙ›6~§dı6&?ñt¨°$bœjœ §ğíµë2ÔSÚÔ|ï5³…5"lÙG Í+σHNG:гœT’ÖË*È“ÜÌ â @#/şúÂrĉB°òÄS‚D@ ĥ>"`>§Lï%맆ò:А-xIoµf’€$}#×{HFƒ#BcÎt 6ÎZ+˙İN6ûÓ'm›e.ĠbZ2pFŽf-rıke›­ò,ìLÈî-ÈϝŭÖlxDIX,YŠR 0 $³™ĠÑ2ö}“fD_XûEPMbğäpżÌàÉuËÉğB€,uQ%›1)é´faF&I@’ĥĈ³•°&;ÙÙaódV  ½L ^™c>™mÑ Ġ`ÌiäÀĠUƒwĊCZK˙ŞkĈʎ ÜKJwÎTĞŻ˘g ä“&ÒúìI/…Ğ9‰UíF#"-ž3• I‘búÇɀ²|çÎáêP ‡J8ô›nœž°f”€$mNabÜf7tšÛĊj§K³ĝ²Ż{\ù½E[·£\$ë 3ëó‰CP£”Ŭĝp19?ZÊĴ{Ğ·ár=R˙:úµĞ!ìµ3¤ë÷ë“}•âòÓş…Ù+öĊYĴġġmHRßĤFöuĠCĉŸ2ëê Eıè>t†¨_k8#yI’´ĝĴŭñŽŝĜ™ÓwŸt´O€–vĜġÉ2™ /‡Xžë°ĉqáFċu˜İŜÍ{Êîê·ŭı-Í8¤4ñ0ÖAÚëuiíl!ìX:ÉĤd,ׂU_:dŻ$uĊHy҆)U;ĠqÔu£ÜËèP†˜/ù¸ŬàċN‹ƒ3ŸmĠpœœsħ?ßb;JĴ˜†YŭJÖL¤g7,ìŝy99ë<Şaá™ ;Ü>ù ÓméÄy Hó£ ö;ùÚ[Šŭnż„„&ÙZY!‡§HwïwÙBvçΓŜr§“T­ŝIï9fïb°÷F9´Ĉ=CUóµFÇĝËٓk5x¤ƒgID÷ *ö^=ŸU%˜;ùzë=T§]ñ$—ŜÓò”$éÊun·F0Z¨Cê3V…~*XôÄúA8~ĥĵİr/€Ż|TŭîJxŞÀhšP1<'ŽžBÙ­…È^k$ƒ½pÍĉFş ‰ı `Ĥñµáú1·&-ûQKu½ Ö rş(µĈޝP6Ċ„bŝèá‘URĠL7şŽ°T Ġ'˘àüy‘Bv’´qŻi5cĵäyxċYNÛb•È`0ĦŠ ÙBFÖÈέ…î& X£€â´l&t¨Ú4ìsÖàŻ\ğ·(’]\³ú€Ožv•ݏë‰ÜĴ˘•,ˆ|;êĵÌ ù°JàO÷Ġ‰œxħİíÏ84XBtİ6:‘İÏ]L_³ê:Ŝż"šTTۈ‰×nOLjxí5“$é!ş³;ïIĉ™­àÏBj1÷F³<·ÀÌR³ĠÊ šY .?1N<š:ÔT˙ĴxGCWpŽ@6*ú/ğw[|ŭK! W÷’Î<öjXué9[ ƒe2{ċƒItžÚYñz’€’Ĉï=ˆlşµIö §aşì}ġiäıʙ䒈‘è<‡\kϨ0î#8i‘ OÁÔÏn:ۈ9ŝÙ1yÌó¤êóöéŒi´‰˜ô°ó‰gÔo <ġÌë3ìÜÓó›„é8ÑvD8‰3½,!IşZħÚ-s7û1Œ-ŻÂxĦÊ+ÇäV=Ȩá*Ç€áŒ"V *0*ğëĊLÀÑÀğ ÓĠwùöqĦ*8x9u×î.7 e`_°Xo0ĤqGwŽŠcKRĞĤޞCr]NjHó0ÎxĴkĜ!}Ós!.ÇZ#IşĠġ$ĥàÁÌÁÄ>›ÍJêpŬWÎĈ•ŝVŭ|ú¸}–8Îp§0âÜßbïd ‹'äğZ·4€>µë)ט\̎RjCșvu×Ö4oĜDKd‹ÇZˆyRnäıî¨ĴĞ/Ĵ[}ÎUúĜµLçK’€¤KpR5U4ú2€Ĥ*á´P`0?, ġ›&5pŜ(Ġ§˙cr0›&;é&P²ÄġÛkƒQ6ĉŜ× ħŞÏšz$Ġt€ ÈJ:=Gue5˜Ò§žŜ#£BĜ!SdÛù$-ĵ^ôÜç5eü5ÙûşSšœ$ IÀ(ÀV`´f,b6juĉVijm™\ĥ‚µ!ü3mŞ:4s5ö\ŒĵúYJY·°hĠt ÂŞP+'SĈĞd iP÷ –óöŠWë£ŝv^ĠE²ŭ`>z?v”ÀÀú>Êçùyş!‚h"—“$ݵÁ]âBÒ9(bUĞӊao£ <û°0„é0Qŭà2ÇóĦx(;î{͘şe§keÙ¤×!_ÜÜS· ”fĞ^ßŭÌ3*Ĉ‹×Ú÷, VêŒjOÍëŸçç;‡ܖëß$Iş= ‹sħéÜFŭÜ}b'Œ"l\‚ä÷–ŽXŭ’çTşNöĵçNFŬCnǜ—]2w_fŭ×U7Œò#+gI£š´‹BòŠé=Œfs’|<^˘†K$ÑO² Á£#xèÇL’€$ŬĴêP‚ġ!™µÛáŒ÷´ĉ”L3ħɅÂĜ…;™ ÄBuí(Pe½Çç{öb.FÍu>>êrÀ BŞŸ×aĵrŝT~ÖUµJ²NĈI B‚ġffÚq|ì ”žcŽħKñúQ$İ/.}2€.Nž K–êĤ ‹ÉrÎUĤŜZ‚ê7ÚyşŞ;û,’7ça:.Á¨u>żàÑÇ0*k³#”ç1ŬDT ëÓı—2&™4˘§ó,RX$yIg@ô\!·èÔÌïïLj7'‡H˙“]ĉû8aaâìpÁúToŻŸ²şU}×Ò"ד9İòşPĴš{ÔZ÷yV_Ŭo £´úéJj$İÚĠ.µġıèQóв:ââL˜¸iÈ“éħCê÷à-íU=l˙0*^939š ó‰P%0Ô`óI·îÁSšŽ½à(L‡Ñ™ÒŒ4˘ÁBƒċu“w$ I7# )l2¸¨vô żÍ…;İ= |é9yî`͝÷ğdğs\Ż5ñ`Êp½ÑZ,¸İ}6aÄéz–dç̅ĉŒêŸħöşn4–,IùI’tÓ*s„̆Ħx—’4ıáĜĉqĊ3š‚fFӝöôwĈ£1öBÎÜB`7>Ĵόú3·IÂÁhìı/{F3#,gÓMzùy”¤ş ñĈŸS„…&w됇$ I7ì a/Ÿ =£3C÷0éÀ3·Ây\ž²şágyL÷0wn§ —`#rĞ$ÎS'aşQ­*W<£2 žQaÏÛĠƒûĝ^½^>í"Ò˙ı^G HÒ­PihóS·âSà³™QmÊ€gÇ,$4}n“ħHÉËBËĦÊG‰ >ñ‚8ë·äġ)ĜOÍĤ›µWOq Ġ<êzħóȋƒÁBš‡t+q%I:§ÜÚĞÁiÎ'hÑSY†ÑŞW³ğO93â”l9ä˜í{ɜ²ëÜgİŜĞİŬ“´ê:3Żü¨?)zċÄ£eßùˆ³ÍPËTğJLiì(ĥ¤Ûu8ïÒKÁy ĝšWĊ ÔgXzpŽ“v<—FHLĦ³tfÄ30B*Şt“ۍknRQĴ#şí?\çİ0–$ĵótö ĴÌ3šnzÏhşV£Ôîù™Ñ4¤7Ğ3VğŽûäEĴAêÖà„ğ+İAä!ġĥż?_pL<5ĠmÒ]áœÇD,gàúġŭpß´Aƒm–ĈO`çI Ù³` {EŽĉ• 0ÍĤRjwÑl¸Ŝj6ÇuF+gFĞaşr_yä„5ë›úŠH’$iĵ™g²á|qìy-t힝MGnWFl´‹ßGŭëJh˙‡–’îUĝkRôş4éµ÷Œ&³Fİœ-4ÛqšM7‚IġfŞtÂ<ž@Œ`È}41V@Ò%¸q İħġÀĥġ ħO$$„…ħġŽ áĤém1݁bu~b)tç{Ÿ=êġPEĤ3¤êÏ9]0Ŭ¤èu-›•ó4‚O m+ù06vxu—qĤ‘óˆiŠÉCt nHœ„í0TâϏuxaÒëìf³qäÓ^kXÌĤ[*Ĵ‡éêĵ#§OËítÍÜÒN‚ĴlON€ÍyYœÀqu„²éXaqĥݨğˆİ"ۃ#‹%Iş]YĤcĤŻh}ÒëÄcZñj–ĤÊ.Áhê-Í!8ͤŬw í~HóU%Rço €wF>–²éŞëĤäͽß30êż7Ŭıœ93òQÓ*ë³_΅3£yQúĵóê\¨ġ…430rfO<}XƒäM9ä!I’”[yĝ6ÏĴ[ĴL½ó]€X=Ïh^ÇÄ §0â™ä‡²ÛÁŞ6Hĥcg`wĉ úÔӜ„éގuŽ:#Zİ3âÖ˙xßá˗§‡v9Ùá 0Şah†~ö‰FOH’3 ĉ]k–´Ò5³M6ž1\oħ¤iÚoBĵŞ )×ÀÜ@ú0‘’71Ì-Z€Ñz˜ŽĞaşşQŞ;q˙ıĊŭ§ÑYg¤ĵFċŬÓ1…ïlhŞ( HÒíj”Ġĉş,ĥëÁ…,öş#—ĉ s> pa„9ÁĊvDtVß_ ğ]ŻTJ KRsĠĤ[_^{C˜tN CÌ·mOŽûÏ'<|é*Àĝ7ñŒRá€`İ~Ìı˙Ú1I@’žâ!ÙÈny‹eÏgık÷R²ƒOZ8œK`X‚’cá |ş2qbxN!{|;^³@D/ŜQT2itÉ3%5÷î?·èş8I˙F0‚÷^,ŬÀ€N4’¤›—WžŠcÒDu!Ş/Àjiì8Ÿ£ĈŸ„ŻzNuÑşEQ?ŭvçÍ:ôMUXsµ9u­Ëç÷]ö,ùaT­›ìÒ"(^' HòXZ p‘‰g´ …˘×FKEŻSèĠ!ĥi?´)ğú ½?RöW“vğNĜÊç}^ZġúΈu˜ŽÀé1âŝS‹ÇÇnĵ ßFhŜg1°uXcN⒀$Ŭ*‘Rf]Jx²IĝgLİgÄġĠFgĈŽsÖ5Ğí€Ĥv-ŭ~UóbéFÀ£ ]Àw,v5OjŽË³ÔnN<#:àî¸˙’Ârİ_Fġ#v›yH’€tó"8òŒxĤ7Ŭ @Ób)›Ï<ħ7–%P͙ŭn SY“€ÚWŝïş İ*Ĥ§:Véñġ‚ċkġĝà¸˙rÂéĦв)ëqÓöLßFV½H˜…Ŭ&ĦH’ô,–?äÈÁÇéÖ˽ë0ùıÏ;ƒ/†é8ıÍêŒzĦ …ĥ–ÎUŒhŒˆ5wû—k@`Ö5g=Ê<]¤‡‡Ÿ?ĥèÚ¸Ú(ġUaTmtÒÊĜE è“$)ÉÂԖ†ÚŸ$°PôêË?_i4M˜XÓĠÓGÇp[LgR ´ç2Ñ]OŒµ‰*ƒ­&2@î;|ùtB1ÄëQy˜÷Z×ÁŽÇÙ&G¤[„êĉœĊ÷Œ80:vTÇ´Ôµ{dó–{ÓMaT7ġ\„SŝžÁàv ‹–½BG˙zKë—/mÚT\!ñf0êoëİQlİĦŝ$]ÉódÑ`†Ž>óŒĤóŒ›Ċąŝ~ıDuÒ(umTĊ8áĵgÔßħÄ’íÑEÊg/ƒ·tâӇÔ[d(^=Œ3$ˏ‚5H’d5x&!6N^ΊVıì9aıÎhÍ3šŽßëŒĉ³<£|ǁƒ:rçáñK—zÛa+0~ÏM ?j’$ IÉöXŸmı0PhÖÈWꐖĉ=£³ xšgÄéáxnC¸§×ĥcg4üğ'üí‡ü!ĉÀˆ6AŜE„ğ&·$éĈ‰”ĵ‘“rfôDÀ0‚CñnsŻéÂp½çxF\ ÛE‚ˆqß§]äŭĴ%û¨OŬĠ¨~™€Íq%I’›D‘—]€Ñù†‰´â-ÁˆœµÁIàżÏÔcuħOĉ%0rŽŻƒ'žìw†Qñˆ-Àš”âYjİ$Işy˘'ëNÌÏhR6ŻxMó0Ŭ9ÏhĉUqF Àš…í|\ĵk–RMH=Ŝö*ûÊĊ –^–`TÜi@“3tŒ$ éÜ8ŒPÏ£ŒçótÓ4îĊ†ĠŬ'PT0Âqê£'ĉ*/oÏĈÍ€Ĝ:<†W‚ÑhmżFċ WjL4’$ 54û1îÖ°î­Áˆ“Ôî1@†OÎÁhÖ§êOÄİו…`İÁŞï=ö $[Ŝ é+뵕ûwÀÌÒ( I@Ò%¸q̃íjH-ġù3£%`,€†•!œ™X˜Gy˜nêBşìÚ­EêLÁ6wÚhŻFÓ:ĥŝgfİuPìvßP¤‹0âşç¸w)ëŽŬœ[CŸtùċB6§Pázj7xt$<Ħpġ"@1§Ŝ;¸Aġƒ€$ HReÓ{O#{Fà­¤vn·ÒH“ŒbLÏ=€Ġ3¤q[™iA-ûğscJ˙^0|ğRא³íúp×`Ĕiù€Òއ4†˘š\, HÒ Ó¨tÍNSc9÷x0ïÚ=ú|2éuš1›°8 öB&ƒû&†rĤ™…ĉŽÇS½Oi¸iİM_ £I1ô÷„Q}ÛCHú’$ I΍ÌàôFç†ëSÂk߅çǎ/xF5ì.vO aŬ²ÎȐJtö½‰ÈqɐŻÜŒ†żÀ!s=’ŝ$éĥ¤B‰Î ÎÁè‰]ğ<£ˆs)µ{éÏÁ¨¤wçó/3"vċĥ;ö“"áSĜn ßF\Yƒ—yFUSĠPj#I@’j˜`¨·ä¤·Úċıìôœ3£'Sc`Xš™ħ3C8ZJf貁wnFŭ `LƒùÂħĈÎ L7­ Kpë0ì€eĠàqÖvg ŒŝÌi1ħ!×6ez“:§o £`qüöşfÎÔP•„55Œxŭ0êÌ~Ä6&8Iòt „¤Ñ€>`qZ,W<£yşÙ‚g„o £ÜÏÎŬXUë‰}ÊBΰ vĠ >ߌêV, w$ÉCşyY‡íž’Èıg4…QwNcMĵ-£-ÎKÚíVâ1Ĥ3˜s0âµÁhÚ­Áá]„›}§êK’ô˙`5/GTF*Opġ  –2îŜFġÍp 4J(4!u9(Ż›>‡Fkh€]„úÙI ÙŬş<· Ê6Ä#'{ΠےŬzeĠéâéÌA·t.ħëÖA@wX)ħaK0*ç“1Ġí>Ĉ*ÉC’žúHĤÜĘÏ'ÎÀh–œaD °Yƒ‘ciLEĥ³Ù½³ż³™F %C­[ñŒŞóÉŞ=ˆi„ı$IJ}€Ĵ´Fƒ91ûp>L7ĜŸçèĴ!\Ñò}BHĈÙIpÏI[eDHcà)ôċĈ`T {­Q–$ I…ID¨ÂvÓ^Ş‹0š Û{Œ¸âĠ•+÷ħ #n"÷ï![ÛèCv‚Qµ  DV˙I’tğÊM-Ŭ9>—ùF0:×µ -ƒž £2S0 Í‚ŒÜwZ; Ÿ’›Ş™}[0*ğ'ĵ“w$%é IÊÍI1Nğġ—Á¨nÔúŬaäSè|[ßŭ(">zöŒ˜FQL×ìšaÔgĝŝĜùÜyI@’.Ë ³Ië3`ô˘ _£2˙(˘OGï‡ ĊımÜĞW KEÀքŝúbK0A:#Ĵi^Âv·.…ìnŬ9Ş )Í,{7ë0r.ä|?'›îkaN6Ò%›ÌT߯GÛ_4÷Â¨ĵç°ë/O’‡$Ŭ,XŸrËÈ4Î|4|•›=FùgÎôüí`ğw“™dÇÔӎusÁ Árvċ†êÔ I7î"„ qĉxÌĈO|cqrî´Ĝ üŒËİ̆Ñ;6nÖôŸۄQİÂÁè@0•ĈJ ÙIÉfĊè£ñ×_#b”ë°#_ıç¨„ôİ$yHş’5èÓżŻ€ßFU×ïr(^w,ßç‚Ö+èÚ¸İêĞÀˆ/÷ŒF·ÍÏ=·°’$é†EŜĠĤÍÎÈħ‚Fü ihòóÏCrìh`ëŭDĊׇ^#ŬÖK NŸ¤›—§IÒ}%ú4BŽħ‹ô50òʛâĜˆ•ŽâO†ÒpÁĜ%çŬÎ=ÚÜ:Ț>vU_?n FyŽÉàċI’.Ä*ZB›ÔÍú×}Œz°MşvOšĥŽŠ^ÏÁ¨êu=Îè3ívŭWk}ġ/ûžOoóZaTß,m€ (I’4ìM³qñħaúĤ0šüÜħT€{F\†Qé̐ÒĦ™ŝ7췃tö.é"·£j|9€”ú­:$I@’ŠkÄĘÇp!ŭû;À—`T…ŽñHŒFùóR‹ñxjq:utßo•Ĵw)£°š­¸- Bŭ¸™"Iï‰@t‚VĉêĝWè)óŒ–aT"MŒ V<£ê÷a†÷~ŝübż;nv€,ġôŞíÓhAF£Ĉ½)…]I ’ê$ô%‰>ÉĤ{Œ8î˘:6„aÄıg42hO€Qŝùé‘ĝôEl,u/Ĝs Ħ>%Ҁ``äëÁˆ“s —À·ÑòI¤‹ҐTÀ”6͎Ğ0ê7âS@=FĤ{ ŒH|ıĝüĤÔï`ÀŜ#JgÎóZÍÁqµ0"@sôY k#ˆ%IşU yĊ£RXÊ%Ïèka´4Bâı0bjôúá §Sc`Ġcîz$vH“b ËSWĞsżk‡Qŭğ%äĜ4Êü–$)ıËa|ϽFôÙ(ÚK0šŜ_mĝNmćm,È4zŬš4Â`ïÓbÓĝò0\SçÂ5şb /"}ÙŜÊÜI@’.xGiĥNiŬgx=ñŒgT×~~ŝÒâ˗nx(ŒƒÁúÂÇú*fKĊħyPßEUçvo £!LGòA…ì$]‰žg!ı§šKñ‰aşrğSˆm½2Şİ§›…|8naë½W5vİv‡q£0Bñì"Ż“$ݲ?';}'ùı0Ŭ҈ŠüùcÄÇO§dûŠMsRË#îlèg·çE+…îsÏòı0Zi’û]aTĦN×Ô¤€$Ŭ<”˜ bcw}0"ŸZ<”¸ìħÏ$Oc™úwżÓ&ü“AïşşĴkú5Âh|†”ÒġY+( HşIµ)‹îİ0O#'KĥàwچTkeÁ€CŒÛQqgs˜ÎDSZž…ÑĴÎè0Š÷Nè"żFS—ïrî}×CÇï*6ş î‹@sòd6%7Üş¸½u)kBÙ}ghOûûo£*ġœ]2phĥïrËmĜJ˜n£,Ĉ4I’‡$Ú#kҐ7/ñŭï£|›û‡>µ£ß˙Z ÷cóßù.Â`@Œ)ԕëĈ£çŻFıІUğ¨ÂXI@’’-c, bŸŝ­aDŸ>µĝòż=Œr·ZZwžf׌1ÍE²œÄŻÜ3šŒXgéĊWfŸPSc%éĉUŽ]<ĉ„†ÀĵF闝ÀÏN8µŝ<£4z"X•Ô°ëóˆdÄB2ĉm7ğv×£ú,èô@ä!YN hBÊŜ2Ü3ò‰kċ@‰ß8!FF˘=K İŸ[j§Ó„ĦÙyš&€i°]ôPFÂvé}Óċ·Ž’$éĥ=¤ŜMÂu^ĝrFKĈ¨‚Ñcëĝñ4éĜa” a2iÏ󐘛e;Š Á¨Ŝ(ä¤ ùġ(d' I"’—ĉ¤Ùhx‰Ü½F_#>}jdžï¨Ÿb³ë,9s7p@ΒÄPB­ßFĘßF}ë ´xŒ„ĉôuéÖÀ­ •áĝ"сOŸğWÑèwOž‹+s+¤=Cİ+îkıQ§ı_;ŒFï§ĜÊLá:I’ÔÛ–£˜gÁˆµI‹À‡O-Oñu`ä>``H݁÷}‘ŬYşçë9nĦñŬa´ä‘=FF„Ö4Î'ÉC’ĉX=whàPkı#b˜äZÈ;àw.ÁÈż-Œ*£Èè@D*²4̳wF¤rcĝ\=Œê炜>~6’<$évİ”Â%Ž< ob<ü aşĜż˙ÂŬ/ÀßF†˙^ÛµysF–×çG›€Qµni@_“ż6!I’‡tóÊĊ¤pGÓXeÈüI0êNÄï~>½ Œ{ıĠ÷“ë”v$a84ŭġàâug_vU0:Ġ]$IB5ÌÎ*ƒá“’˘eRƒT’o£‘A5ä>v7ŭéâY“ FĠŭYša5ÚXH7+…ìnŬAÊœNx›,ĜFSc”?y¸w|üÔÎCBo#ĉB$ω{O!&ú>vۆQ갑2삀$ Hr‘,Ġ"5€·—aôċsLġF]˙.=îžÇ˜›ċTo³”ê΍Á¨jÄh€G%ÚI ÙIİıŞ5i.’•4j_.ĥüôħğ>W/m‡ż­Kˆ”ŠL·äĦJĈ(Epêe' HR‚P²û)–ÏeĝħĊŭCĵ>i‡ ҝèЎŭÒ?[…Q$öI7-…ìn\Ö’;ĜÜÀÏ?·h[żN ]`“mÛybƒ•PYjd“.í×£uÂ{D’‡$Ŭ°‡TŒ„§:¤q-R‚ÏĠ¨ş – "ÏwÚûÄĜbԛɟ<£úñ=V}ìtˆ$ I7O$3‡qO4'ûŸOW#0ujŽ9 dŭÑÄ.—,‡Ué94G”÷ùğĈ0]ż–eŞb†‘ĵ¤›—Bv·61K“H ŒIm30*ÏĠ#àì:Ĉ* HÒ`dftĤÙ$şŽĝyƒ0=xd‚ÓžSˆ²ï·ı=CqŻĠY’€$ŬĴ˜wÙÀÏ_şŜĝĴÏ?şBy:óOgIıóĎwɀ‡>úŝO‚Qŭ>‰&ĈJ”Ô /É ­ûğǗŬĞhaw˙\Ï(ċ6Lú÷ğ‹È†ÜûN훂Qí ‘)\§ĉŞ’<$ €ŭŝK›zم:kk0òê9tkĴ‡ìîċyš"kCîsžQ˙>HcÌSúşL‘$ ŬĵîğèóìœÎŻ F|"ŒjCè G÷ê •hĴ^¨OЁŻFÈO½9¤Ôïŝ,I¤ÛtÌR’Vƒ|H^ĵ‹+ÎÀˆ †6"µÒ!÷ŝ!Óĝ kS0*_wLj%IşEu]7Ĉ ƒ ƒÒF•áK­ƒpÈcĜÛÛ8C*Ÿ³/DÚ ŒÊ{γä!9Ċ#I@şy`—²ÔÈ ĥ-yğAÏ`ş‰ תOĜŒ0ž›ÎÀˆ}§EJ’ôd 9„KIácôñu<£r[ËMFY F÷ĵŬvä ú×ŭš0ⷀQ˙Ĥ ½)˘Z~ Hş·.KÓ£=ÍBż| ŒZ0Êb;OaGC*ôŬġ†›ĥKçem|ua F|&Œ€4-Ö#È4ËÔ:H@Ò%;ž?e˜V`TŬ–Hä‘àißáŸ>ˎyŭ6Ż#<F šáüËvîĠJ’ôĊ40ÍŬÇİÖ!•û5KóÂŜwÚLِé[€Q½ÑqOPŠí09V¤[~¤s# 6d:mF>Fk,eĜùP ğ_ċ„†ŝĵÌĥ#LêÇbİÈ$ I·Ş”;4TĜŒX=ß4Îğŝŭ}3)C74uÇ3aÄ7„Q˙ž~¤3$I@şy"•"ùTkÁ6£êîcLĦş°Ŭy·ï_ÈaŻ2á-aä[CzšÊ²ğyİıê­Ë,نÜÎë ¤/‚ÑBèè;¨ŝڎMŜfYó½c 6 “İħW£Ö J1vßóI’‡$Ŭ.B² $A³MÁ¨Nqĥ²aĉaT¸ËHÜa͸ Ϩns=•'S$I@Ò%¸m1lÙwhüÀ¨ou=ŭ8ìĵQgi•„‰CÄ Á(ï†˜ÓżÓ‹Òß­K!ğ[÷²}0ËI£ ğ Á–LAçîmğ˜ĵ$zò0ĥ£êWˆ˜Ëâ.ÉC’nĜC 3KÙvÙĞĜŒÒmYµÑı…„MΒÓU¨: yG’€$e@OĦğì]lF>Ü6!y?Ói÷Yß!¤YBMƒ]adMj!Duû–$ɉÂ! ğÔ FénĵÄáïû€Üo##Ĝv6a”×Ԛƒ`$ HR2nt£JÑüñ 4a÷#ÌûËV{³ßF|EU/Ĥd *ÉNnŜCŞZĥđġĜŒàLĥôÔíżÀ’„…;¤:žÁ˜û×ÁŻèĦzf 5:G’¤[sèa„9ĈFíŞaä³ÛZúĦ}{vksfšheûÁˆ/Qŝ^ƒ§' Hş·­ 4²!'6lF‡[!ħŸ˘ħ[ÉB?¤otMßFx!ŒÊóçŭĝ$IşA)wmħıÓÍ Ò`<Ċ” v> /gFz›Üġ³‘6#ݏZž·ş4H’„ÌŸ@ÁċĤ`ädžŬF@ İğFhŞ™H€Ñ4;äÖŠÚI’\¤ê ÀpyàÛ[ÁˆëžQù MéŬŬÀ™D?ĥ!ÏBÚŒ0ı|?’€$Ŭ ƒdUglzÚÑŭş`?Ó­!7†-T Ĝı—DÒRjPŠ ˆİ~ aĞ$ éÜĥĵTÇíÀ¨S•ׁñ Á}òÈFsHnF(›—‡$ HRm£Ĝżxmaş§À¨8xHġ9Ĝw·ïR÷ÓĥۃÑ4”Bn+( HÒM˂0#µÜù0â+ÀıK£çÇÚsë ³j,lFĠíÉ.o ĥ¤ÛV7EħßFĝŜ0*ínş˜Ġí|„ı;œžŻ™ÍUÀˆÏ€‘·ŞÙIҍ+MŠÍ@pÀ{ñë<#"y eÈ ıï:¤òú İSvr-0ÂaĤ]Œêö- H€``ÌĈ'ò`„zFŭzŒ`çİħ*­o…´{(ċ:¤MÂ!ŻĠ!ŭo Ù HÒmË Cš´jKYv= ĥ£á`ߪLğğHžĤĊ"úòέÀ¨ĵ_b.ŒÜV¤‡w;Í`Äk‡Qŝž… ŝsŸ´ŭÊúE#½OÙ˙:ñġ<£>ë;× 1Ït”$]‰]Ĝq#œƒßFĠcX€Gxd>KÚħqó”à1ŽÁûU0Âĝ÷7ŒÊë°ò‹x$ H7Ż&%xëC{žŜ=F8#ŒÒùWKèq÷ïjCJŭ.]³gáĥ݁^FĴŜvù‘$ I"áž]T Œ:0Ìús°=ïĥ™½ zs9Ż Fĵ£ò }?;ïϒ$Iş]™ ħT$ûú0âרICêĜ1eÚíyÇÍ!+fve0ÂS<# çVî°pP]Ĵ$ Ŭĵr˜Žm2ŭ `„¨Üvîrçë]wj°ÔÇáÀ1T6£|vĴYñ˘$IşA"ċßmÜŒê>y÷²îûïÔ0dŞ59íğ&Ì`„Ô³ĵd×ċI’¤s—Ò˜tİu•(15äü:öžöíq¸ >™˙tÍ0Şï£Œ ˆ-¨3$I@’À4‚˘·ßf‚‘ïÇ Œ>xwğŝË=ä|Û&Œú/ °7) HÒE1ċËD* V7£r[÷ŝ°Ÿ‘;Ùċs˘ÈÜħa‹0òjó£#I@’€~Bl‡ÎÀlÄ3Şg8Yhöß8şlÓŜF|&Œ†4}„&yHtŭ1J’T•ÖSútŬ-ûÚt½!KMbÙuÉsĜ³œ€wĠs_‹W‡^£òyÌcĜŭ JÒÍs(ĉ‘ċÀħI™vŻ #~ Œ*Ï(Q;4i„Ĉŝ]ÛN›„òùú"w’€t²ĈĈ!ñġό&İÊ/…QidM“ĤŜ.ġbÛŬN"Ÿ›Ħ:/ÛŒÒn¨ş‘İ0Vä" `Bçy@_°!˙< iß)İÁvŝgk°Ĥ €7ċMž‹Ĉ¸ğό”$éĵĵódÔ"Ò°ŽÛQu[Vó,Ĝ;5ݳy×Vĥ#C“f"í~dˆ$ IO’ÑÀS:ô}ÑF¸rġÑĊ!xç…ħ´}Œ‹Ü ŒJsĠ[X/I@’ž&–´iƒ{LÍ„,ä™H9élÇgH¤gˆ„zFU"†G¨‘$ I°ƒċîĜkÂh”Áf`ÔżË]żo`ËI(Û Ó jrÚzLĤHLt ä!ı;R]ĠĤÁ7£ú~˘ğ.}ğOÙ*)8µ˙QżÖ1 T–$ Ŭ< ݐ´/°´Şi#0b cqx-{oĠr‡†4xc[0Ş_GÚA,>}I@’nCêG€·^gK0âx>w>[§?Á—Ŭ–<£êu”Ÿ+ċ[$ÄTkf°Ĉ£Ä·#ˆkš4I5„}oĥÍRY+aÖ)t6£~²b>$I—@ïzf‚a܂f+0ê/uvì<‹Ĝ††ÚنaT{IPsUI@’:Â!h2^z Fĵ2U֎§yHÄ ciIJb7xI[€ÑèħO;I@’’1ÈŬħéL‡ċ3ÀT0Â9ñ<#`œ˘Ċ”Ê[ɇkFô=·#ôÉ'DX>“$éĈ`TÛrˆ_#ĴˆßFŻ 9ıÁo stIâÈg/×#:Œòóëo2=“$éödɀ?ĤĆï#|G•û !Ġ ùÎwÛä0şáŞ`„§¨˜2+ÊC’¤›÷JŬŽî>6HŻ #>Fŭ²Ï<jvĵÛyÂ*-Ġ_•áv[ƒ‘¤¤²^ò$éĥ=$$ Mş\Xú&0ÂË`T~ĉŝÈGżwİ\‡ÄÓûZ¤-yF¸Ŝ“$éöÔ¤0;ÂÍ6a”ŸŻ…fëì½ĤĊ,gÚu9Ôe3Ğ~ġ0b´ °êö- HRİAJF}.›‚CŽäî3ĥȘA„a„Ĥ`äs·ĤŞ}“›$ IRH›vŞ›‚QyÌÂòîîŻĥ&=âĥáaŒ“w$I’Ä.½ĜĦI' óŒ<}Ë,è+ğï=×!ċ3£r†´t=ŻFĊCJŸäÄ…í$éĤe†4şĵiŬù2`4L7ž‹Ää= ì|ÇÒÂĊ˜Î‘ì`ħ¨NÀ(‚’$ IÀÖÁ Ôİak0¤´aFVŭÑvğÛ÷íŻ#<F³7ĦBv’€$À1{fıû÷Ĉ`„T ËòDÂŜ‡óĊTšùäÜk…W`ʓ“$yG$•ñ6l·£ú˘aĴs;ñ½ĝHf`Œ9Di×£Ġ”¨nߒ€$•ċ|Aç˘1ıq £Y×qš&÷îy‘˙tKB}£0*)ߖÁ* HÒÍ󈝞;\1ŒV'ı é˙¸˙š–tı|¸žu!V` áş2~^çH’.Á+ĤyH=y“˘˙k†Ñìü¤÷ò|˙ĥÍúpFoFµ jŽM…t³:èܸĤ ü qßFV<#‚ @ûž‡ÔŸeïÂàŬa”½¤ù““ä!I7İ&¤ Ƚì²!M…½fġ·÷T( äyH;7nÎ!äċq›0‚ áFŞŸ$ Iž÷Û!¤n FĊË !/ÏPÚµmóâĈۍÂháÉÉCt n[ŒŜ§~'›àóŒXŬ‡ŬFçè’é ÍvaTŸƒA­ƒ$I²4ĥ!ġEcŜ}_+Œ¸# ­ƒÈÑÍöı‹ÈsŸÂ£°ĥĉċċ적H ¤ñÈ ìô˜Bv5FcÏmf Ëŭ8wnßgn‘äuQé†`Ôo‰y_,ïH’‡tó˘3ġc‚Si𳠍žShÇ{·HžQßİa|ŭ6£´#BĠ÷I¤Û~TÍTŬÎ·£ú1ƒ9AğŜE”×ìC†áaTƒġ§( HRîgMHóš0žĞ‡‘Lî$+žèÏxS0*/Ĥ$¤H’.Áó(wù& wöĤ›‡Û'#} Ħc71è[„RÈN}ì$IŞ\ 0:Ĵ>‹àĥ`4xukš}si´6CĊa”7?! H é£áo›€‘ĵ™ E}ßÇHXîĜ˙oFÀ6È5zB$hB ueçh¨CòmxF½Í%è@CĜ·‡äeó€!İak0ŞÌ I¤²QÙèĜĥ`4ş½'éì?İ€Y“ç qğ0*ÏQ ’€$ĉùRğÀ)eÙÙŜ=$0·³ĞÊnFucUĠ!I’„lĵ­x[ŞMÀ¨˙VP2w‹£jÊoŬğoSžQ "ÓsI@’ÉcŬ”t‹0ʇ`ĦışoSR@?muc0RÈħ>;’—$ éH}ï·Ê l'LWŒ[/ġH{_´úÀ…ĜĞŬ Œ€<ÏéŜGĦQbƒ$ Ŭ<Œúµê,ıĠÏĊSQï"v}ˆä}Ù<17lFS3$ïH¤4ä-ukH6Í6£âŬ1 é|¸L{ŭе~‘jy|0Ê#Ĝ$I@’‡ÔċÛ£oFészLÚwNCšìg!Ġ…›‚‘ Ŭ&HAIn^î)ħÁ‘½$_‡ŻFœŒ[(½}û£=7ÂtŜ­œ½\;ŒÊKÉŻ41V$CîlÀdÎÁW£ÚĤÖğìJ{öòĊ­ĊÖ`Tݽ`$ H9ĕ!PΒĥ£b̀.éO70ÇĈÂtġfÈrƒUĠ!I’TğÜ ŽÛ„Q˙³;ì·ÍrÑhUǃ Á¨x²ŜŬ&t†$ éHŭùQôjÎÎ+ÀˆßF<ûA};†’ıÓwEšĥŜÙŒ*/İŸа€$Ifİ˙Û!Ìàò]a„Ż„Ñè &£<ên× İ Ô;€Ŭ[‚PGe2E’€$YJ½ġS›zÀMjBŜF|6ŒZîÉןĞì9݃!ï‡ôm F=Yħ˙ġ’$鉊-Ġ!Y#öV0ÂsaÔßĦċ]÷-,œ'İöÍÁ(?ħ ƒúÖñ+ HÒÍĵèBîöÍ1ŒxÍ0òêa,…ŻúŝŻ[IfÈk·=UëfBv’€t#şl’h@×öŭàF0ÂŒx]0*‡üրċuĜ7ĵ>W·˘Ĵžö†aԟƒ]ì=HyL’´?qv›Rƒ`öD-À…o£ê>­9€ë5-ġ3½V(­=ÇħWQÚîd/i{žv2†ÂÌhf€$Ŭ °ú?ĝÒ9ş |3{ŒĈ0 MêôíŬÔŸ3nĵĤ5yÒzM<Ôü‡LÍùٝġĝÒġ¸$i£^ÓòŻìb:CŠuíÑ`T4Ĥ,ğ§0ç‹7fĈĦħj3qu7fž­<%Žĵç½%IşzM˙¸Y‡DúŸĤÄZucߌŞÑŬĉC5†=ï…ÏSBš×¸†s 9Lçmîô½Ħ0Ŭô}ì4ÍRê7ñÜ´$ IWáŭ<éçSMlšTñŸ GOaÒµ. %aßWı˙ŝqÓûcp˘Ì™wġĉé̆B€¤„ò–ŝˆd̏)Ž`,v8ĉš$ÂґEâCŒ :žŒ‹ t‡…tOá²ĤÛ8€˜'š"$°0Ñ&żíB­KçPá~–éG–ùFp<ĊŻx<$xÓcrf]™­shŠı;‘ìòk~N Ò77n$iv֍Y;3)FÚIv$OFÌ IïsQ°ġ›‚Ôš´Ŭß~ĝ<ü6ÌlÂA9dC2‡î ìbĠ!¤Náċ)8ŞF)´Ç{d0x—B9,ĦAXJ;ċpaÌaşÎsèŻOVĦ£ò81Ĥ1ì!>ŝ5b{zŒ1ŝcĵÏPò+םƒ#IĈcëî_bŒż˙íïÚĝñßŝyȲ+áTŻÂn‡ëD Q2* ÀЇU’%Ú³²ŠGĊì •`·,ÈûÌÍÊ;ŠĠĦ —f8ŭ :´÷1Ĉ]×ŬÇğ'†ê$Iڈ—45pcŒmÛ>œN§ÇñoŝĠ?˙ßŝ˙êġ~<O0ɓàĝÁ¸ô VS8ö–úG1Œ³PSç]=ÙöqgÛüÁ/˙íéÇî·mÛ~lÛö1ĈÂ?o½Ëĉ˜fkÖĥm×ĥíŭétúp8ŝú_ŝ‹˙ċŻ~üí?ùuÀéˆyž͵oôväĦ/o–l”áwҚyÛüú×˙ßéÔŭĥmÛO]ם&kĈ+Y3I@’^`äwÛmÛv÷÷÷CùòüoçĝgMó‡hf?™Ù€ÀV}ŽúsĵÎXÖy–Ù9ĞÏ#É’Ÿğû]Ûĥu˙W÷÷÷O§Óc>è<+ĝìšı{÷ĝĝĝĝċ˗ŸÍìßŝ§ôO˙›ż÷‹? !üúҚ‘Ó­Ğ\³yÍŝú˗/ġñáááĦë:ż{Ë5“$éa Ú›ğûcÓ4 ëşîx<ŝÜ4ÍO!„ܑ •A 6ƒÔ÷~M †ĴdžyŝÜÍ,’lIŜÇ?ŸN§Ÿ~˙ùóçO÷÷÷]×uO0n‹FîüƒVkV6~˙PÖ,ĈĜÇ߇~ !ĵĞ׌d˜İ/;½–5ĞÖ-ĉ$†ûë>·mû!ŻÙ—ÇÇǓğG\A L’tŭáşĠCûĥmğûûûIkۖwww§ñĝ!„Î̎ù=ÑdjW>ŻwÚßÉÈ-ĤŭV†­‘gC×ċÌÁSŒñħmۇÇÇÇÏmÛĈ£_ĜeżvHèİkĉĠš…ÓéÄûûûÓñxüıĴ™™ëġÚҚèÜŭc<µmûċñññŝááá>ŻY\ñfyášI’ôĈ0ZûcġÊyŒ1>>>ĥ1FÜßßÇñx !|˜YQƒ”]︋a3TÍ^ސ7×B~mÜĵúı›YP҅;]Ûĥ§ë:wo+ĉ8ŸħġVkfSoĥü?Y³îx<žÌ싙…'ÙJßkÍÎĠ MÖĴxI^ŻY^§ĥëşÖŬğĵfĵ%I@’Ô3zJÈc,›Oĝŭŭ}PŒYùúQµúß94ĞĦÂüÈЏXŭ_ĝÂè¤fĦօ5;mxÍĤk²´fk0”$iƒ :ë)­€ŒÏ0lŻiܰ`¤Ÿ%_ÑŬ[Ĵ×ô˙zÊ`}­m#kĥôŝ›ŝWÖîİkĥ&J@’Bµ[3äkżûœ]öšü^FúıPš·%/Éqŝ,›ßü†W¸fS5ùv{Z3šAŜ’€$]_¸n­'Út·ސÉҎĥ6S£.5ûĈŻmÍÈñ+ÜSÁżıûÍo~żĝ‹żxéšù…5³ŻYÄz8¸Ô]PڅŒÔnnцZÈ%c³dl²{.Ÿ7“ï]ÚaŻ…}ǎûİîÒı’/|˙)! ïµóŝkĥôŭKkö½×ë{Ĵ™ŻìâšÉÉC’σŞ˙*‹×£<#aûŜğís;î§xK|˘‡Ä+X·KkĈÉşYu[T˙żġšñ ëĥĥYĜҚI’´GYŸCĜÂê8˜Üĥŝ˙œWô&U˙+!›:œċàô”:¤×4p\Y§µ5ĞáTCÉ0NVñÙ+çÙıµ{JSU% HÒAèR·ïÚÀYeÜĤçÄùƒ×ŭ<7 tLç Û[dk}͚M7—6[\3â: @’´A@]2rk;é·öŒ^²ëoÛKÖĴŜDìqÍjHj$ I›‡ÑıŬÒΚÏ4jöÊŻíÒÎû)P:·ĤÖìUÖì9çKÏġ`&Iş3pKFíœħ…°Ïk7^0v— pÚ%àiÍ~͞rŬżĊšI’´!iiZÑı3‡sិĜm_‚žè ]ëaĝž×ìRÉיÀ$ IWì%糸Ν]ĵĨÙ7|-/.5<FԚ½êš½Äs€$iCP.ŸKĴíşy%ğìç·ç0>q'˙–kv)ÁAk&ïH@’6Kğ§3ˆk*}Ž×ô’ŻßrÍĤ€Ñš Fğ—ZmqÑìâ†÷)ğd{áï]€_ò½kìƒvĞkö”^‚Ïî7(ğ& IפK†ékĜ[Ö´|KP]{/kĈopûŻ™ìš€$]7Ä.¤§Ĵ·Ú}óŜv+ozûFë°ù5S·ÔېΐnGĵ`¤ĝÂûÙâkߚqÇŻ_¤Ô5ï´eĴ´fÒ H!;I’$é*t $I’$I’$I’$I’$I@’$I’$I’$I$I’$I@’$I’$I’$I$I’$I’$I’$I’$I@’$I’$I’$I$I’$I@’$I’$I’$I$I’$I’$I’$I’$I@’$I’$I’$I$I’$I@’$I’$I’$I$I’$I’$I’$I’$I@’$I’$I’$I$I’$I@’$I’$I’$I$I’$I@’$I’$I’$I$I’$I’$I’$I’$I@’$I’$I’$I$I’$I@’$I’$I’$I$I’$I’$I’$I’$I@’$I’$I’$I$I’$I@’$I’v˘˙ ÏìúöŻĦKIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Speed2x_420x420.png0000755000000000000000000034757612467662066021122 0ustar rootroot‰PNG  IHDR¤¤~LQ5 OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û pHYs  šœ IDATxÚì½ù³-Çq&öeUġrĥ{ï[ħ;H€‹(JäĄÇ1˙³íDX°5’,Éc“#G”HĥğœÓKUĉüPUŬĠ}Öû@ ïuF<àçv÷éŻÌ/żĤ˜bŠ)Ĥ˜bŠ)Ĥ˜â zÁ?7ĊSL1ĊSLñûÛħL1ĊS|uEnıĉÈ Ż5ĊHSL1Ċ{×9a}ĦÀBGN|)&@šbŠ)^q :@ÏÇj§ Ĥ˜bŠiŭ¸Ġ÷€Q÷}"‚ˆÇ‰fJÇ@g Ĥ˜bŠWpíĜWçĦ~÷¨c=²‡)M€4ÒSLñŠƒĝı‘²;…1ÉJ M1ĊŻŜš1:ñû­5€R Î903pzŠN&PšiŠ)Ĥ˜‚žçs"ÂjµRóùœ‹…ÊóœˆH‰‰ˆXkkŞŠëş–ġz-ÖÚۀ‘ħ)aĤK0ĊSÜŒd˘ÀEĈ, ş¸¸gggÙ|ħ0yQfZk€XDlÛşz³n7›M{}}m•Rîòò’sÂÖ%G˜ÛJ M1ĊŻCÚ Df³™Z­Vêüâ"_­VEĤ¨lÖ×ċĤİ3°£<3’/Î\~q·É‹ġZ+U‘R–™íċċ%cżxb@NEL1ÒSLñ-9•˙WJQY–Ĥ,gy–çsY™"[- -Œ"£1¤ħV¤ÈUı:³ĞŞÍLŻŻ%aI²‡ħúxŠ Ĥ˜bŠW„%í¨îó,ËTY–†Úşh×ĵX½óá[ï|òƒOÜ.ë|ŝĝzSùËĝĊÓ˙˙/Úê‹Ò`ħĢŞùÙ³g\U€FFLhM 4ÒSLñ Ñ^FŝßŭlQ*Ë2›ëÜ5fUžß}˙î'?ùŸï÷áWŞ\˙,/~ŭ³żËtĉÜ|!³ġÚE᪪:Xö1 œ&@šbŠ)^R0:”k­•RJkHQ(Yİ,{&_~Tew_˘ĉĝ"ËWË{fÏ<½ĝüçHÚj—(Š˘šÏçí³gÏïagr0M`4ÒSLñĊ)^u´ DD0&Ï˲Ȗ`wöx]Ož6ĝ 6×-ċ˘<{ĝİœŬû…ıyrm”rEQ\/‹ş( ëGÀgMµ¤oY¨éL1Ċ·`Hc„`˙ŻtF:› óÜ6­jZ‹zS-C-ï‚ï}çë‹·ïtöĈLÚ3“ËÙlV. ^ƒ’×Û ~{˜aêıœiŠ)ĤxiÙÒö‰ˆo€%Ò Ê ’kˆ™)ÂıîçwÏ/@wŜ\]Ÿ½ñžĠùëĞÎÈdË,ˊÙlĤ÷ü­c „ ˆ&@šbŠ)^n–tLò=ĝ˜™cÚN `D`„Y%îç$oÎ3,ï<„½÷ŜëĠy=ŸçyœÏçE’ÔPşíqO1ÒSLñ€ÒAf”0¤” (b pĤ÷ p˙üùŭwï\_ĵûQmfߙKs‘eÙÙl6›/—Ë €>HÇĜÒ M1Ċ/)(íúú.@Šžu"Àa(/g³™&?Léë¤î&€šiŠ)Ĥx èâÓk*0$Ċ"$ ä˙Y'h[– îŬ½‹Ù›Üİ/Ŝŝ°Òċ;9ÜŬÂèĠ|>/‹E–e™ĈŝÔ&V4ÒSLñj‚ÔÁT’RHÙy0 ’­£`AÛ8´u‹eQàâá›Ú=|˙ġâÁ{ñƒ„%³Ù,SJ)ìVÛİ=àxŠì M1Ċ߂ÙÓÎĊ?ĤëD„B ‰ B¤J vLmëÙVÎ+äŻ½ÖŜyëm ŭZ.öĴ0z>ói;cŒ9Ĥş›˜ÒHSL1ĊK̆vħ£}5šqcldG " ŝcˆ ‚ƒ˙˜ ‚ĤĊ,/pŝúwˆ_˙ĝëċkdÄJ%e9[Ìg³˘(ŠTÜpLywÔkoŠ Ĥ˜bŠo/(É1V„J;AdH{œZ'°"p0ûÏ3aY.Ï ^˙~ġ9Ÿ}'ß+Œ^•óù|6›ċ{XN£ ˆ&@šbŠ)^"P:uôĀ!A<Ċo‹xŞ-£u X@ĥĊ(Ċƒ·@o|üÎġêġµ˘‡ Íçùlħ\,ĉĊ|>72pڔĉN M1Ċ/SÂ1f”€Eǒ€ÈÓĴÖ1ê–ÑZËǂĤq¤Ĵrîż{çĉŜ‡˘\]ß3yqV–³yY–ı1fWşNM,i¤)Ĥ˜âĠ§½}@"ß%ßBá;pNZAë„,3 Xˆ¤ĥ˘„ /Ŝżöñ››ċk@İ×ĉE9[Í|-)áÒc;…íM1ÒSLñ0ĤÀÔì Y;N+u$0ûï:vç0[ î}çâêüwĜ”Ż-ќéĵXE1+ËÒh­ġˆ“òn¤)Ĥ˜b§À¤RÉ·˙š~DpDháA‰€+RÌ(@ óרzŭ{o×o}  ŻÏ —eı˜ÍçežçcĊŬI†Ż;šiŠ)ĤxıÁçÂߋb*'ŒÖ1œˆ×~ƒ Pc…‡b~ŭÚûwï}Q“-³${·(ËóÙl6ŸÏçıÖZ%–BjôoŸ§Ŭ4žb¤)Ĥ˜â%#:áçRÇï˜ş|]ɧé<y¨@B!f(k1'…ìì!m~ï­êü­rMo–Fߝ•eô¸ËŒ1Çç$µ>ĊHSL1Ċ·œŝëSvrĵÉŞ;phL‚×qk4eDÈ ’ğĊlzíó›X•çïÎÉŜ›ċÙĊlXÌf³2¤Û¸ß`§ĝ†ca>ĊS|S µká§î‹— ˆ`ˆ á˙)Eäwʊ„YĴŠœ?DġÓ7ožüꃋê곒Ŭ³Y™_×óYíœsmÛZk-c(ŸËè¸äÀħOcÏ'†4ĊS|KÀĉ "­ġXÔyĴB)@kό”"("Ñ0b4‘ÛFÊĴßÜ˙ĝŬşĵĝÎLꋙĈŞ(çċĴ,³<ÏÍs0£‰M€4ĊSĵD`´ïgvÉ!)S†ÀDPD ¤ 0ŠÈ!D3£$Èluíƒïys÷ƒ³Ìĵ9×rwVgċÌ7ËfYĥĞ–tʄ٠˜&@šbŠ)E!·ĝŜÖâïc[’ŝ7´$Ššˆ!˙/S@€\J×Ji2½ï¨ÍOŜߜ½ġQaô…Áy>_f³Y™çı!Ÿñ;¤´;$r˜˜Óï1ĤÒSLñ"˜Ó1k‚xv$‰$”u<+"2 bŠ@ ê„wFˆh+ˆ…¨%W>˙üñk›Çż^ò³'µlí|İëşnÛÖ6M!’·`Û$–öüŠ Ĥ˜bŠ—¤Ĉ_ *ğĜK ñ€d”Ĝ§!SEÓÎÎ êÚQ]o¤ĥšÖÙCĊGßY\ŭGËĉĉĞSm狛YUUu][k­03¸.†7Òï)Ĥ”ŬSLñ³§0İÀM!%gHrÀDÄ9‡şeĴ7×7ĠĈÁĠ ¨mĦLġòó'gßŭˆËówçÚ=ÈËٝù|˜ÏfEâàĤìnWGšÒv M1Ċ/ ;ŠĉŞ[µönĞ( ĦÌ´‘ÌŒşu¸\·ôôĤĊÍĈ˘i„œˆJr’1÷psç×ÖĞ·ßÍ?X(wV”³e1›ċyž›£Î';ĦĦ1ìĤ˜bŠo ŒRP’EòJşŒbA]³ˆ0fAkEûŸ×D( Ar!ÀVµµhtúüŬĠ£Í>,ŞÇ_­ìg›"żnĉóuS7MÛĥi8çğ{“v$_ŸÒv M1Ċ/Q uϖ„HyĦ]S9Ĝ›Z+j‰ż"…9"EÈ Á1ĦQ„‚œ´pTċ¸şĝôgë/>ıß\=ZÈĉ²•×mğ¨ÚĥħD$›ÍĈ£Ŭöܤ˜dPğSL€4ĊS|ËÁ Eŭ7 ¤u‚MÍÈ—˙"áç@Ŭ„YM@Ĥˆœ&†¨d’Ĥu°ÈagoĉOïüèrŭċgíÏjr}ŬÌf›Ĥñµ(ë:UŬí’wÓ†41Ĥ Ĥ˜bŠoĝĝœĈœc0 ´&dFÁe]'ë}ż}Žù%ÉQnS¨‹u-6ş¤ġòŭĊӋO>*7_|>·_>kr}Ó,•0³µÖYkÙ9ÇTRvD#À9LSL€4ĊS|ëAŠ:ĊH™ MȂm½Düż0’FrMÈQI$µ0´8ĜâÏÎ÷vyóÙ÷ÔϜssY—ċ°³MÛĥMÓXçœ à”û›awħ£c>xS|͘TvSL1Ċ1@9ĉtpÒëHtĝA+…L y§E$u!M'’"ùĤY1JIĤIr*”ı–…zù–ıĵóé{›Ċïϕ½·2|–ÍV˲(ò<ϵÖzŸĝ.F·ïü&0šÒSLñ{b6tä맀T# "™2"hMP¤[î½T\„È3Žb eÚ  C˜9BmĠΙn.>~dóù÷fĠWż]ò“˵^:·XnêĤi›Ĥá ¸‹,éPOҘM,i¤ßéƒ'Ïñ{ò{:^Ù³Xĵ¨xĊÜ]EáI!'ŜŻúsq*0ÉĞìˆĈğ!3ÒÊß,,ŜV¨Ġ,Á#Y""P8(äF[AADMÓHċ@Mv—Ÿĵ³¸ùĠ'Íß<>c׸Ċr½h›:Œ§pÖZŬrx'a·îb#żÇĊ^àDßÀyí“Ħ[,^ä"ŭ˘:Ö˙vË-ŽċUĤŬ'€°c@ĵHÁФµiCŬ/xÔñ,JâW"…wMˆB-IyĠ]IJ£¨iêĥİĠòŬĊ{ĝŬYġĠ—³ëßnŞ"Û¸ùbÓ6MÓĥ­½ıı BĊk,] Œhß3 íۑÓs>ĵràw_Ônäĥ‹úïz‘{Ŝê7ı`ŜĉĝċkÇïk˙şlíUĤC€¤pĜ9{Ûé[¤;AiE¤5Á@àüoE]Ä×JÊHĉúIß,kkE4™BíĴT­%›Ÿáúì“ןĴûé}[]ŞĞk;›mmSµmÛ:ç\Ó4‘)퓃MÀô{dH·]éÈù"ŠÛ07zÁ‹Í)JœĊ.îFàyÁHnyl§ž7ĝâ?'îħ(ô‚îo#0Ñ`:1e^ Ú;|Cëh³y’ôïW´÷íħED@5£F 2-˜˘Z+İ[ B›ß§'?z·¨?½°ût‘ɍ›ÏÖmÛ6ĥm5ÎıĜ0ĞF÷JĜÌLÀô ½ ‡ò”E†NXĝ䖐üÀèĜÂó"Ŝï*Uw¨#}Wa÷En`èŬc·ŭ9yAŻ˙ğ~Ż~߀¤NMĠí:ßS¤Bߑï=ŠÙşŝ- ê‡ä—#[ò·!uc+<0eFĦÌ@geŬTÄE‰zñöòÉĊ>*6żŭbÙüâ‘5ĉY=›ŬTu];fnšĈĥm›ÊżÇ@t*èLlé¤S€á›\Nħé #ğ|ÁñÙ,ż‹şĈ‹ÚİÓ-ıÁò^n_÷˘|ŬżÎù}Súm}€´oŜVjOÂ?"&‚AC`C&NRÌ=Cò ‰ %P„´B‘‰xĠˆ­¸rI×çŸö¤~ôƒĵyödÁŻšÂĴÛĊ²&ˆXksŽ™ù˜‹Ħg{˘oöù7ò}…NXÈӝùĦ›áÔïëÖÁäç%ϑĈ’÷Ĝǧ€úİÊ) ½Íqû[‚ʨcÀt÷uöŸ²Ħûĥ-bû˜JR[ê8‰ˆ.žiQ˘_Ĝġ”ùYIÀ¨S;PĴ%…ԝ ­PhkœePqÏ.~ĝ^Q}ġè~ûWşige ·­µmÛrUU2zOxcšêGż#@Úġ@ßf‡û"v~ǀfŸÑá)àHŽùyÀġԛQv,^§>üǎ÷”§ç\x^ÄÔLzŽûĉyĈGžcµÄSÒşt‹Ż{oNa‘˙’BޤĈà³ës D$ŝ£P"‘Rİ€,ÒÑ"ID tà  jŜèÎOù#" ZŒ"šhž)i İ+q˜ÑĤ|+rñߝU_|µ°?v&²ħtĈ‹ĤiÛĥuìÓwğ&ÌîsŸ&Í~ InıÈ}]–$'Òaìy³o[0'œÖà'Ïħàžz^·MëܐèǸ•ÈP—ç<ŝSïṲ̂‘#÷Éבäßĉŝŝ&7j˙Òt÷Ġv Âë*ŒŸ éärĦy"" GD‘(d ߎÔÏŻèŜzïN 8i6Ó$…&ЍiZħ¨aĉ%ÖgŜ{\}ñƒ˘~üdĈ_­gş`Y.ëÖÚօÔ]hšMh|Ŝ|(Miĵ˜²{ŜôΟ·÷ġZΤ`9^8Ǖw‡v ·İoQh”Îg nÄĦ|*ğï§Ñ÷%œ›¸ ċȎGRƒMžIz΍‚ìú˜˘³?·^h;<żçeĞ·a~§‚Ò>uìxżdtïí[PŜ;ÔżĜmĜÔËJğžó}işôŸͳ$ώ|‹kԄ£Çtò:òjF$w$}ŽÏ{Ŭ‘ ͲZ2G”+HĦ•"ޝĥŽl~—w~ĝnٟë²,uQ&\g­µÖD¤“”È)DÉBž2" ïO Ïk½^s]ת*I|ÀöH˘ÙlFóù\Ïf3çıʲÌh­M8^EDjô) Ž·Cúsñ˜=ı•˜³‘2gâ½ÇÌ,"6ĥŞ*·Ùl\Ó4\×uÚµOY–QY–ş,KU… ×\@ÒÉXìÁBŻ˙ĝÜvícà/AèĊá]zN;6 $"Š™˙;PJ?eYQ–ċŞP²2Ĉ,) LˆnŜâ (Eƒ$6 ÔM˘HTwéy£JhMa6ƒ´–iŬ´Òn„°X`½üàî£ûòİion–—żĵħy^ğĊ˘ħÎZk-×uŬÖu=^ŽĝóêHß0C:è[eŒĦĠjîÜı“Í‹<×:'v…8W(HĦ‰2"Ò¤H…·ËoD[íl]êùbQÏĉóúĉĉĤ†Ċ/ŬeȑÊ)‹î LD”çı^ÌçfyvffeYÀÙΆTĦµÊİS³rÉÎ;.rNX,³k Ü Ì7³ÙĴÎ˲QJµìz½v£ċİ5šÁM_…Z.—fµZċóĊ"×"…ĜĥŠ ctN¤2"2¨Î—²?îƒĜí· ÇÓ°;vlĊµÒŞĉb^mÊY£ièê*6¸š°‰<ÏĠjµ2ĞĠ*+Ë2×@N…Öáx•ʈHKo#“êĞ˘‡f̋"üܢ•&ovVYD,3[qĥ&ÖĉózS–µ6Ĥış²Ħ¨Ŭ9EĦ‹…Y.WYžgı.4£ ­MFJŠ›€ôöĥPwü‰†9RxáÖ/ĝUÇxÙĠ~dĝıŸ"!J˜Iġ@%Jă’ÖĤÈòliÀ”RwÙı™° ¤.ŭÖġ$ nħ`$á8{ĵ’Ž)Eċ]Ħ‰ZChZBÓ:QUMjĥÄĠù÷ßɚgġöĉj%_m\™UÖ-[g­#"8ç¸mÛħüP³ìĦôïP/ †D{ÒHT…šÏçfħZċ‹ĊbNm3ß<~ĥhŞÍR›|aŠ|”ÎI) Ċ1sëÚĤRuu]fĉ*żû`-–7 ŞÚĤ‘ġzÍUU1žßa÷˜ó0‘ʲL—e™­Î/fıыġW_̛Ë˅ùÊrĦ”ÉHİLéM •ÄϓëœĞQW7%Ûsvq­n Í³UUq™Œ€t/ğ#"*ŠB-‹lı:+ç‹ù²½|6ß\>[À腞͗¤u r”Iäħƒ^BÙµsŻĥU!a/,Î5bmEÍĉşnÔùµZœŬэm[Ĵ×k9PóŠŞçóyĥXfEfn}]67W Zérĥ Ì” ÊH4 ñuÌà\âq§Ÿ†=v ”ĵˆ8fn¤m+jĞë‚äĤX^Ĵiĥ\ hŬ6ÍĤŞ*Xk€(TQf6+‹ċÙÙÜ(šUżœÛĤZèùbEE1SÊD) Ó£Ñ>§1˘£Ûŭċ.˙·jµÛŻ{h''2*xÊàÊRpêNӓUs"Š€(X UÁċŠiÈ}g›‡hĞ"³!qÜRp‡ÚáNîN¸—}C"0ŠOU ‹‡‘%)ˆÑ Œ!QhŒ‚mmŬŠÒšlqO_Ŝùñ‡yóôêû‹›…lj7ËçV-DC`ÎKĊ8,\ú}út€tL‘6PÓdYĤŠ˘J¸Û.W÷>üàÇôîÙùÙÛ X1ó’EJñEM@àĦUJmœÉ./Ğú³/ó›˙V˙úŸ>ŸMÍbáòËK·‡E+<3êĤµĤ²,ġòìĴ´ë›²<;ğĝĝ_ŭé;çwï½§‰î9ĉ ç,’{–4,èSP*HĞ€ òâĉ†ôÓ'_~ñËË_ü?×J‘i—çıĠZ3îĉÎaŞJ)•e™Îó,א™X{ŝö'?ĝÎŭ7Ŝx?Óú޳íÒ1ÏX¤@:×JFğŬ°lGF4D½î9f"j°v&ğşdġĝñçżùeó‹Ÿ˙ŞÇeYş,Ë\UUñšlíà›<Ï CX³Ù;ï}ú½ŜÉóìĦ8·ĉ™ıÄ mÊ"‡Żztğßíò,êüĦ˙c"4аĥdžZyôĝóßü£ùċß˙&KY–n½^K]×€¤³,ËĉóĊ ĥYÎ.îÜŭîŝŭ{г³·Ċı3fž ¤Aš’Ŝ:^"Pú>$>nJ¸³˜'‡Ï@çpàw"ÌuK4ŻEğÖE~+LÏɨ˙Ú˙’sîÜŜùÇ.½>DÄPpÛ,IÜâŜ[ï.ïŸŻ¨AÇ냄ġĴ³#L)#’$Û'ŭïGPR>ugÈ5Ħ0ŠjËRY‹ĥÚİU³·²'÷ŝĝÓĵ½ĵ^=úğDzóyC`86aŒÓç@MwßP iïoŒQY–e|sS4u½\üèß˙ú÷˙î÷Ŝû‰QjÎmk4éûVDrÎŝĤİ>ûíÏäÏ˙÷˙M~ŝ˙nò˘´y^4Y–5€÷X<²óxnÖZE‘-..fżŭ›ż.÷îğöoŝôOĝo•1w]Ûh8§µżŸÓ§²Û12 NÀJİĉÒòßnާí˙óW˙‘ŝŝgk³Ŝä:Ğó<Ż1.äPĤğċöİCsW­çMSżġ?ùñûú?ŝ]šÍZÀR(aMI–Ş[ˆúYg´#C]â£[È“Öġ#1îñ£§_T˙ù?ŭ/ùßŝߗì¸Ê²ĵ5Ĉ´Ħv{òèJkmŒ1%šjžĵñü“wüG˙Ĥ\,ßn›&ÛjEORr4RÇĴ•eĵJ÷K?/•"&­ë/[ċúíÏŞżúO˙kŝóżĵbëê<ÏÛ,Ëâ}ÇT³Ùrµ¸úġ/ݽñĉk˙Û˙ïÎß~÷§MŬäİAŒ˘nQĈ ´ßݧÛ+I¨Ĉĝäh{ĵaWßdö9Öĝ+â8,ɲçñ‘”>ö§o’ò'$ÁŽÇ÷·Ó¨PDák ĠXêí³CR’²@ 3y>S2żŸ_m,Úĥí³v‚ahPè[Ò×°ôżÑħ8h 0„ÒY†ĜĈĦ•ÁòŒn–-Ŭżŝ4kŸ=]<ŭĊµƒX]ˆ³ĥ.u]bK(=G éĜdH""µÖTor%ĵ0óċ›êġ·~ ï÷û’ç(l‹•V(ÂV°bo ò ——<{ô,ck˙káÜßè%¸ÑZökúo”öŞĠKÒ&/ ĴŻfFäŽyĝúÇòŝG?qċ‚”³(Á(I!£HïÒŞĤ   %›MƒÇ˙ĝOX;ŝĠŒèïœ˘G֘ëXĵÇiCİRÒZ+­u›ffĜ›ğ÷ßċw>úñfʛjƒ™_0 ’mk|ZÓ9gğRK’¤xœ–NgĝüÙ>˙òêġfó³7šL/) IDATú[(şĵ&½QJé°iĜ7e˜´œšfĤıĞïÜ˙½ùŜ\_ÜżX×ZrŸAz¸t2ìN=…1Œİ€_ŝ™û”N£3üúÑ%>ûĠÓ×êÍĉï_7ú˙#Í5뚈êp^‰İÎòR5›y‘g÷ċáw>½|ó* ²- ċş£Ú:ĉ°ĝY<az‰"3a Ì'ÊĦ%ü :5- ëP[FԂÉ֝–ô–BşŒ€Fw]ŝc­ĵ·\—ƒŒçG Ŝ¨P?ĠñQ‚5İÀHô òüP6­àjŬâñU-McIÄŻî"€˜ DĈeşÈ{Ö$iz½êN)ñ, r̰µYƒs\­ûZ^=úäêÑWçígÏÚü^kçĞjÖ´MÓ4ÖZËIí4£S<'z˘†ƒàiYfLYfÙJDî^ ‰.™÷É`a ,€AĞ5žĥÀWW_àĉ7żšÙ“ğYY^8“=%ËyP‹Ñ oüx17ïADH)R,góež™;׌sR9IV"7Œıòĝ]qÜßìNÀÎèŞÁÍŸƒüìÜäÙ]Ì *ˆÈhG;¨c7ĉ.ë{""­µÊŠ,_ä„;ÇŸÁäOİDÁ%Ŭ vǙî8 =ôŠäĵÄ/܎€VċĝÍġWxúëž_}~‘­Î.LëžRĠŜ$Š°7*ZİÜ3×D•sw>sjö̸t†rwLöÛl˜˜ġ€C’_ĵ;6Ħ¨ûZšÎáp^L üĉéO~óÏóĊ“/î˳‹ĤiŸÑM³π iR£”ÊA(eyĤ•şû•ĊâY“á‹ 0˜)òÇ™‹ôôŽ’óñKbàXĜ; P|Ï: C×@ ú™YPµŒÊ2XVˆ\•F -£r<% ĴûX…Ô_``7›£‚Ò3ŞnŬUĤxpH¨§Žh!oN|zAĥu¨ĞuŬеŜÁۊÎÏKŠğ¨ œFFi~ Òi"Bż,Hi!MÈ3…’Ë@cÙşRšPžÓ³‹}7/Ú?ż>o6bgeëìŞ >wĵ^Ż%* s­p¸‰˙Ô5kŠ5¤ƒµ£¸ÙĞÖY–ë<[ğeU7Yf-ŒÉ œCùĊ ¤ ²ëK觏´kŞ%ŠbA¤ òǰoħ;u×AGށµha6ùl6SÚĴêĤ)rkĦCk*a0 úÉ /œi)چĉ7WÀĉĤ„Ögb²9Z—‰w×İğ¤­keŬDd´1eĤĠYŬ43iĴ\ĉ–nŞ7B‰zÁ3ô&‘nnŒ—& e˙kŝǁȚ Ëê†3WÏÙd+f*•rYóë„MŒID”icfаjšfÖT-žĠ-k c-L@ A%½$ŬâÉÉĥbZaÁäŝ<úP Ü3?g‡IÁ*FVŻħln¤”vĈ&[‰“h2ô÷h”P˜˘\8k›ĈÔ­CU[èĥ…óE‘L@xçDv#éç=¸*˘î5”"INĴĵñ(pN0£ħ‚Şqh­?y )´t÷!TŠıEéÁ3"QR*^g2Jéh/~îàóĜ`éŽK9H<âÜŭcsLˆ0„ }2;ž˘aú.IéIJäĠ*ŒİȔ÷¸k•żc´uÒuñzñôî}R´OŻW˙‹[‰ke>k™efÇÌĜRšS£˙c´†MN/ˆ!íġŻ î ›TFJ—`.ĊYSŠàŽf  " DÂ"Fg:7 _h[E%H•2€ÒÔ ž”è„cż `aT–jĉĴ ˜bÒuŠòÉiê) ˆEd– îe—eŽÖ˜‚Asrżá¤ôïîr>:³)ôë((* ġ ÎZ9µï>¤,Ca‡Ĝe„D 2 ImBZ¨—=ȎeNf9§şÈ +˜3P„ëĤGïÏxàŻ/`@ŞÑ ÌEQgАû1h€2ż+E ŭÊâšİ†ïy,µt‹:ġi™eżĤİ,"ÌCȑ@´Èl–ÓĠm™öİÌ-K¸˙ żèğfH‰Ö3ĉ3b şU€†}½^EŸ5égËùÚ#I¸Îäċf$Ŭ ‚àÏ9–b ”òżRtä£iYZËh,²@‰  o2” _ñ:Ŭ9‰€„(RÚ£jÚw¤%\K@Ù C á*Çíš@JÁ,Ŝd ÌÈ×{Ĝ˙÷ğ½žét dçCJí’Ú£ˆ`°/`˜"ïâàç&š`P9ÀµVÚMED3TówϟÜû“i×´³§˙µv‚†çóVĵJXnnnjçÜĜġCPŬZ˙žb 4|+mˆÁ`D$mÌCşk, ÒJE(´†ñ%#@&€Dw#ŽO³‘tËqXDD4”ÊÊà=ĦCŠ'îfġԑu$˙'2‹La–g0Fg !À@v­§żŞ°żi'ĝ'† ˘"Fy‚@)n²aMò}P$0 ˜àŠ%yŻüם4–Q5ŒŞe´N: İg` ;‹^ĵöuim&ĉAwÉùa@²ÀwÌ'Ĥâ‚ç\ôQè}"ÉûċqKsġ 6°ñŒ)N£$²ûDv*I!U…ş4(ĵ¸QhËèĞF4„ìrëĠ§•k~ôÀ× ŝ§Ú!kE–ÙqhÖĉ`/$;2:|KPšê90tżíÊ4U˘T‘–lÚb†ÀßÀ Š Òut3óünÓ{h˘eÊîzÇá°Qèİp‘ö'áJ!Šı€˘ĠV¨íŠ‚BĤ5´R$ˆ4ÁHáv;7ŝ˜I‹ˆ&›–u˙<ƒ£^(°!M$Ĉ7͐VŜ¤z•%İĦ H­PCFkµ֎E3³NĴaö=tŜ2ÒÙËhÊEPš (żŝ:“ĤH‰·`'K.P/îêÑRr÷¨ H$8oj­€Ü`Vd¸1Zµ"Ú{›Qş¸;WhQF@%fDpĦÖ@IŜçŻŭµNwˆ”Ê‘{ğ˜C5 µ‰ö¤G}×ğHHù]²–#ÀA˚SÌCRcŬìJ[ }ŜLÛ˘ S˙²C)ğ)’ƒ ‘   qvM,Ú˙‘í FÒîž2TöˆF„~£2 ˘Ù/sÜ\é„!ùû›Eq¸/9 ´‘D–ƒaŒö ġȕCÍL…Ĵ šV°nê–a„LZĵ%ùŬ¤f¸•ĝMÔ}²EzFЇŝÚvßkŞSö‘n0‰FġacU/”A—ž‹2uDè6È6Ĉž"NOĞ—×$”VtÇ}w‚íŠÊĊpfZP‚[3¤­j!€šù9./~ü^Ö^]ŬŻ˙³sûĝš³YĊ‹3žµ6L@o]¨'ö;9ì3!ĈTK:!Ñ ğö` ÛİİÑUNV”°•ìŠ*"ÄaħKĵq½eŸ–ŸnDH)°ħŒ `HòS÷ê܉wdX獝€h@¤Hb3È€½€ĤŜn6äoqàkCvû]q‡ÂĜSV™”Żk$êê´9†: ëJ{ԆjtNj:è`#£EX „”Œê7!šH2t_ê²r>Á“<¨’*a<›Pżâ d´êĝbBRP|éDŬy1³fĉHŭ9{2) M £½R PÜí§ú=ŭŠN}9#e$ ÍóżĈĈ 6CŬ:4VÄE^Dĵ”Ğ„[ĥ£2ĵ+cƒnìHMÔÒŬ1Pç~ïŻŒ;S{Wıí§/s"XE˙ä¨+ }AÜĠ‹Ä%jNö ˆ.,Ŭ/Kšĥ*úŬ›:½†ÎQŬÑSµ¤ŝH1u'â˜`­H '@SU¨*dîŝĞO¨½Y?ĝâÏ7ĠMëô]bÛZ眳ÖÊz½nNpr84{=€tl×VĈRçٕŞI‡÷t’V–Aôğ˙6A;è,áô™7û\ÓҘ‘W›"ÍeGßĴBœĥµ“ŠĞġ›eÁNĥG'(wÖĈCÍ$6çC:@ÒhêÛw#ĵŒX şÙê—0ցd<ŽHŽ#Ĥ¸öİŭïûŽċĊ‘—# éníËÒ9ivï2aû†ŠtżŒJ§ċż)Ü_ŬĊèÏ­×{—jñ09EI´ê\Ċ…₝Hú:déŸJĥçq‡Î4–Q·Bu¨[ç6"JU“½MġUµP"Juúş %)Ĵ´ÖĠ–‚#\ĵn)ž&^Ï%>§HQ/äğì\—ŝë€H’0ö2ïN‚Ïi#ĞD‘P"ÙïKQ0î;„tħĦ.½;"Ö}*=~2 Ĵˆ2Mž%YÀYÇ HğAP¨Š7çOîŭÉ3{½ĝê/ê3×/–ŽcÇŜ]b½^7IÚrÜĞ$8>? “èawÊîĜ\šîBGw_Ħn.ƒZi(Ċ’ÂráŬŒî’Ä=ĝ€zn_!PŽĠŽRqC_x‡ W/ôê6Ŭ}ÍÖ'}z6E]³"'|I^˜%ÖԞó””ÒkÍÂJ ;\×7҉<;R=ŬßMïUlHd´’¤YHú²ĦídéW&ewa$;w_‹Q˜Ħkqâ :fDĤˆ2tö¸ħÛH‡r§L&Ŭ›KE“FŠàDDÜŻ Ô-•ü“w„ìïˎ1nħ¤CÇxbŞ1,ôášyPêú`ÄïŜĊ 0$î³ŭÇħR-#UV˙’n3é ä´#]·SIäĊ.!uÙg“ôIқÍ%eè(bHò]1ŭD „¤kÁ(ž=ġŞe¤²ċ¸ Ĥ“KӍCǐĜ ÈĠHş–°ù Óç¤#ÓëµzvÉ:–Ĉz ŞZF2˜”zşÙşûk˙Ĥt*÷‘NL÷83öIKşKÚoSzfD=·ê˙–t)„ŽñHšvcbŽé8‹ŻÍôŒˆÁì™ĞD%áó lèñĵêég2ğ/uIu0 ¤M@úĝxY>4AD ċF çÌ@m™Ĝ9X›„ċëċÇŻ=}°ù‰fËóĞ´\šXÙx ÖëM Ö ‘TN6ĵÒ dŽ0“B# \_¤›µĠíRâî§oé‰÷´Ä2, Lqá–oK9&ĉ‡B²qÓúì(Mˆ\:Eh4ŝ€:PNUÙùcM^O›}é°'ĉĵş}vP&2ş¤™$>ö½›],ÇS*[˘è܌ƒÂ“ħ3[&S"!˜ SĦɒ‘˙â‚B”úÒIİ+´ĵ%ÛÍĤ}´Ĉwz„>…ğ=’ğS‘J—’ê²EáxÒż1š,AŻ@,‚Ö²lĤM"áNÄ ÛĤ…1HbÔÓ Jsŭߏ€Ôµşë„A:ħ£`1í…tG?aÜ?&,ÄÒİÙ˘’(FÏ~:CĴEëYZn!”{à•Azqpı;éÜúş7o0Ó1€‰Q Ü(Ĝ܋ [눝ˆ­[!ڐ^.°>ûŝ›™ÛÔwŬġÍêêWkSÙÙĵµ~šŸ8gŭp4żÓ86Şâ(M 鄝ú^¤ ñ줣pқIbáBaPĜYE‰C·Œ‡ËюtĜMœÊ:şúĊĴĝĉôÈêl8ŝDôπ ÈÁ…Ğixĝö!Nc`GŠqÀêvͽĦ¤Aż|Ċüޤ€ŜT{-“ÈŽÊk·éP#•Ŭö„)"^?Ĝ¸ (ҚE—R¤¨Núž›Ĥƒ‘zGRéĞ+ÒÁ2ӕYĥŻ~Ê<ÇİĠAKCïJž.'mÌÄĊ,£PbŒ:ö‚…†Ñ8/X@G1…†Ö ;vĠƒœf·rŻ„Qş0 %Q’Mš–†ÀĠ×\$­%ö5˘ô˙’Ô‹ú‰ŽLF HĠe¸k‚í2¨aX3’]÷dJ İKjJż!Iì%zî5(K…ĦFÑ$eĤÂÁ3'Ď½òNÑò\ӝ?üÀHŬŜ‘˙£Y^~î8׎—+§üdHÙl6İ(K„ûµ_S-é`ÊîĜâî á ĤÀ2 o_÷ä‘}8xŻ*Ó\¨EŒ†]JğSÄ ğҎİH€Ĉ…NÔÀŜĞÎEġ€_ÀSBÒo(ŭ 8@¤i ]€tĴ݊ŽûÌ:ŝ’ħG`×­@!wĉ{|¨Ï&ġµòT SK žbc1ˆ:²‹ġE;`‡Eg¸Ħx\HmÒ≴n’ê5†—‚$˜Tüi|G$ yP“îc_g¤Ä—4öрd( ĜcҞ-û´\zŠĴw@íx ÷=ƒtġ›´ĦBCş :İ™ …e£Ħ”(v™ĥA6Ġvğ$éU%ħ—Šî$#íšBħ5¤äâ÷D˜ƒpĦ(á dèuži…$u&Ħ›ôÏĊŝŻŽSŸŭ u#öÜ G&+JZ‘ˆƒĀk'­c°uh6•WĥÌï)}÷§kiÛ3ŝóvuġE˒;˘3Œ&Ž£LÔŽĠPÚç@óJƒÒ>Ù÷Ħ:ÌVİXà›ß\Ç0޽ÂÓÔ  ġğıdêä.ٗĥ;6‚b/XuĴN0¨}µáĠœ_0ĵÊŭÄÒA3ĝ¸o"Û}½ä„<òÁ”İôVnjğÒ÷qĜPÂ>z 2 ĥà‡ š—ilĤŬ›[Ê>¤ñħò<L|’·K^H{ŒzU!|I—c"¤Ìh ëÜwI^zĦúëÙf*@Ħ!C’,Çä}ċ˜CŬhÔX µuĜ4L½B2ÔvKjšÔkdß°SÓÒ7ÚÒc˨ñ¨2ÎÙkÁ1˜EÜĥ)iwHzġ:u\g2Á!%×K_BE‡V€–—/ñ é]uŞ} ´Ż`HGj_)(İ´Q—E`ƒ—CgÉĠ•Eeǜž4e!½_M:ġ0d4ĴiÄë,é´g0†Èj*6…‚ĥßÍ4{ħġ9m]=‘£5¤aJÏÛJu‹Rdq—ĴâΖhônĤŸËvClZ ,À4¨£Èö;Ŝi>‡ğŝkGÚKIú‘â߅ÊÉ ½)"ŭDŒMëíhF ȰÔ1T=î|v^‹qµAĥy·ÈV3î(Û5퐒ÈÀ°a8oÔÀ*2úzżIëšcCORúsϜ{ĉ)2b{éĝ‰D~Iİ%Ÿ OOiSí‡ úƒJY§ŝD)dš“qé Ô2È5Vjw X^½?ŭ>lŬĝ˙´gÖjš/YX˜K""„yJİߝڣÀ;ĊĠá•%sÓĜi˕ô“BµñĦMžż³ôĥï–NĜï@¤ßŭïQíkŽ=‰µË/˙sjj)‹Ĉñ™uÌ 8ç$°$Ù!\:Ĕv­Ż$C"ìݍ¤N€Ħ·tϒL0(eñ):A ŸnhOw×ìSĠÚSÛí•Ğ#QĜш¤ï6ODÄ4n‹ŒEéóċĜ/û&7‰=4Ħ7IHtƒEÁTĈJƒ~ħ‰•%é—D̐l,Ġċ‡ùğZƒÄ{ 4Lú‹Äà~ zä³Ó|‚vƒ´• äËİĵÂl$óÑ]†óSÛç׃3²ÀĥUeħjëï•Ü]ÚTdÈ@ [)3ŒDs4PÔñ µD)l÷paNYĜ`ŽWúyšž“a})eFƒZӀIġ 2L‘ʰnԿΈoéĜÉĵ‡ê‘gawmd Fìğ³{àâTށ„àݍà½EȗF=cÖRµ‚†…ÚŞ0‹˘]ïŬÇ=ŝħr]<ú++R1ĉ˘µşŽs5Fc÷ÍQb잏üJĠ’́dÉ1ċŬàğ,@&Şş$WÜ"LeA”$Òkˆ$ŽĠ€ÛI¨Ÿoħ–¤\Y‡c‚Ó>Ġ†žÂƒĈƒ-ƒŭ ħŽ}áx/Ġ!ħ8Ö=ìQ Ġ5 Gċí/3|Š,îhÀJ¤o}ÄĥrŞ·ÍC@żóş÷ĊŜù"‚ŝ "”^á­´vĤ·F·@Ú›2İn]÷`ı·é”vÛ}H* Ċú‘Àje.×-ލEÓ8X×Ğ*ĥ\;’/|Án‚×·†`4ÜhìxbwîĦeGZpä!ÓpÄvm`Dz¨ÒOÏA(żü+H]ƒgùÀ…u]ŸJiòġ•3d=uÒVJÂj3è IDATİ›wŸ<5-ڀY´"^a'!ċ!Ĉ·–zç•Ŭ‚Ù³¸K¸Ç&Ċ`½Ç#ô …ş‹cÀŞ~Œ(%bħĜvi¨ġߑĉĵô€´/Mçİuž$.0‡6(í(ü߆ş’_–ELpHĉĊb ‡fŠ£²û_ÔKéĜ˙cċÔ½ŽP ÜV"ĜzPáÔĴGĜÄmÁt§ŠŒÙ_oFż–ĥJ:PJ{—R·ÑanTşÔe_kIÍÎvZ!m1ï_† ’èéhü ½/#Bñ°ŸFÙ%@Î!ğĊ £E˘^ìsıÛ D5Nœ²àÇ)8NFq§ÊıDM·µ ÒN!ƒ$leP€ÚUd„)ÒÁħ;ëo"‰;nJëZ’(ñÀ!‹Ĵ3êúŠd›mġJşdœy*žIYTZ·’]”NfÒ_ƒ$kq¨“]›8•@úü^÷UĠ`Ĥ` %h˜fi6µ¤ÎÀüx|`ñċ_· ܢ,­cqÖzġ3sUUŒ(IםJÇêÒ/- ´¨JÈşrh|mC-†"8ÁK#Kò³_$í8ÔÜú".6mgu’víp“9ĝp+€îûiżœ+éûޘ9”C²ġSo mF‡Ż…żUvVÂàıN2<|ñĜĊ­ĴCv4Ĝ3ş…Ûr/c>1§¸7OëRvÒÑ8ŸCêĈşÍhPc°K.žLHˆĥI*1Ċš˘Ù.›ĤÁ{÷ù£N!Ĉ½j-J–iÔŻ6NÍQ²À͆†ÔŽFCƒµzkµŜNknħÊá"?¤!X¤èÒ§ód[Ô0°ŠҍPl¨MYCFHƒÔ€D1šĥş€ ­cJ.Üż*юTo°7£áĜùĝB*Š%To?LA@ŽĜħT;Ş['cı‘`)?z“’ıCŠf_ŭĦÚ³\ ȌĤPÓĠ”N—–Ŭ6e—ĉ£Ó˘pwUZxQC˽ÙjZCr/VQOĈñ÷ĉŠ´†EFçpqöj¨+QÂ4tċ³Á˙NžŞSv6t@!Û ßGĥÙu›K§żèĥ[äÔ{S'‚7.Ö|]8'vaŒ6a¤Y:EA˜6"ħHô1Œ œŠî Hf$a×Ç î@ʎ]ÎşuyVŽ²ï‘²Pv‰v’kíĠ‰OċĈŝ¸„…ìš›-ûOĈÉİQaòKi}m4wPÙF£,î63ÚS£K…ƒtžvÍ'Mí%ǵSî-28dNí}y(ġé•ëï‘ħ‡0n áĥbêż¤Ġ˙ǔ(Nî7̐ÎQD…–TBĉg4“ż—•eÔUíŬÊy)?zˆ‡ê§w4ûâ/İóRs‘‘RDD¤”Şëşĥ·HߝRcúVƒ”yŜ_”Në+ A#‚:hfĞ-CÚh;|òNI~Ŭ8*ħŽQ•vĤ$I^úŜ˙\ÙP$ew0îlìÚíM3r`Gm”:Qç-Ôò¨°{4‹0Ċ™GĠpĠócp­ĜèIDƒÚĜé,şsA‡0'na{­şÙ%½Ssœµ>LùQ²–&cf.ĦE‰/8À ç'}ö ²ë}ñBí YÇŜ:ÈEC‰Y1ŠĠşmè˙Pâ =F•=ŠĞ-uĦ$ŬÈàúÈV',Az‡<4Ë•k’|-%Rà]i²¤>–Úùpoz˜XšŞCçĉŬ­Òy\&* ‘!Zvïô iI}Q:·Ş˜†a1) F@ %ÓvŬ{˘hÀË(\öžŠG7Ÿş“˜:LÁc‹•óÖQëÚĊÊ 2ûàz |D³/˙Z£n´ÊVı>L¤”"T½ÙlÀŭ<ô˜ĈKwĵ‡%í3nŝւÒİ€4œ'4jŒŸı$M§‚Š*°#²ÜwğÓà9•SjG/DĜ°˙ùԒl^ò)~n (56d"’ïüˆĥhT—ĝÚ7FJEša£E„ˆJÔq²l4ġ"‘tĥ7”J“B7Ù­eß3Ĉİöĝm—Ф›‘Ġ§c E„Têĉ=È^ġîħİ}zWҐëÖvJd·}&tH·YëSĴ8znñŭŒŭiÖ Ú–Ħì‘>ġ”¨ÙeÛÜu„5’ ¨LAU’ɨ½ÉĴPşr£·Ï£!;˘tÂ_È$ÓuİSĊ%ƒG¨ŸóÔĠwÄ4ˆP°ÎCèÇÂaÖŻKƒĤóR£Ô%u<4$ġÈéi ×6ž–?ê†ô…ıíŠA„‚7¸Xu?ÇĴt×éä¤>gNAè ­àÇxĈFZ âŠeS{‡pŸ5^B/>ĵŻ_7?=7ı™ŭö/5Z[bİ=)RÑP×µmÛ£D’TŜİ ôJìh×§0@¨kŒuÔ÷öXö‹ïh‚•@G… ;p‘܃ò@ڐ'۝ÚևĈTҒ6xœİßÁ5¤yrX§͞)żÏî ·**íF×`Û ‚‚F"ûĉD‚¸;-züŭ’èï_íƒüÂĞÏ˘Ĝݏœ†g.W]u”ÁĊhsƒ„Î%şÍuwħ‰û`ş< ÌS·Ŝ´ĦŭÀ¸ĤC#Ğœ#ĤŻß ɲËh[!7LċëIšvËĠ|}=hFƒÚŬĜ=c7ñ”Ó„ iKĊ"$Ó ¤^Jƒç›’Y;˙³Ü5{û?İŻ#İdK'„$ŭGIâšü3Ç@PŠ@d‰„ħYÚÍFn"µ‚Z~p—^3´R™ùïä½gw$Yr%h÷ıG42•ĠĊ&‡#IÎp¸K{öߓËĦjÉR]şŞK¤€ŠpîÏöƒ?aöÜ#"‘`/ÎÉj2àòŬg×Ŭ;ŭé—{¨Š{{Ĉ˜Ì“ċyŜEħ´”TG†TŝéJÚnUżé›²“Ï‹ np<É%ŜZïà ÀêŒc†‚?ŜV¨ì¤wu’X!Ù°›Wkw/ÔĦ{b/“Tħ1÷óĈ5ö­sÛ&!eg3JNĜaµ•6lnzbÌ*–„b<‰ÌìcT Ġa,w™’=÷wMŝĦ§"mÄÀf÷+Ĝ_uBĠh2Á²tu,—roVv8ƒF‹Má\dŽ&ş1Ĵ;u`Q*^Ü;­8VN@‡„ >¨@ȵQ}O1Žñwq †I?L†Jbäñde'${F~C)ç’ÄqIàrŝñ÷ètÇPĥ_cı-Vnˆvr,Êş£ĥŞĝꌉğ=áĝé˙ŭßÍlşóß³™żéç­ŬÛ뺞v2]×QBke•468K×TH˙fxw$ˆ¨†8·ÑÓt ŜüséƒùnÔ>zë4%ïŬÒ°°v;'şL”1¨u} +&Ċé-ž[T;èُەf2i‰Ĵëż&ŠŒêŝïÙ~k-ÓÒS[¸ÛŬòѝP^’ËÁ6nT@Ë9e¸†³4zK>pÂÖ³[}…¸l;:Ż*ê%ïXĞòĴŻ{Bzz´wé\C Vîê9˜w#Òꑲ"V¸—H¨ħ„q5X,§#’ïôr ‰Ç­š˜“™ŞôxIƒ† rŞš“ĠU Ò#'ĠƒĈŝ!ë+žgYÉċÚâGXááü6{ƒE˙=“ħ”üŜG§aÑT NüfÂÄ`êĜĦl:jê†ÎZĥí>ìñí“Ù_ši>ûño'—?pf°żŸċYv‰ŝ‹‹˘ ĥmÓ%ŠG„Ğœ7q˙$á܃ÙE–/‰Ñ°§€ N~èÚj™°´ì‡é`ÜĴƒÜj%˘†o[S÷öÔZßHé"?$h“câK$.žwċlkGƒ;\ÜC²LK÷ùì3ÎIĥè$Yîɛ·êcâUì:ĤşħTÂÒUѐm[šħí\_% œ&:ëxéÎwMâïG\‘‘Ĵ×£6?şŠ€â1‡ÑOÑéOjèuĜ³ÂusJ4TŬÉ^”ÉŞ(Ìb˙G„şj…X) }?IÑt"ZE= $ŻŜ7ÀäĈŠG*#îD(è{ŠŠg߇ [XÏĵ€êËv=XOy{Pxı͚! ‘qΗŭƒ D™!*Kuki~Q03=zoŻ=ù_yŒ|şgŝ.?¸ĝ6(Ë'‡Ó̘<§,ËÊù|\.—-­ĥZBĞÄà’ “B7ÜĞQ,1–LÜñż ¸%ĉşo$#7ĆÌvŸ2ÛtnÇ<Ŝ`{+URXL™Â€ĉ’|Ĥ|PÏ!£ ¤EĈq—9Ċ페ˆa;çJ`…ñ0pk°÷-ᎉšÎ™˜YïŸ-Ż2Aµ#]D½ĤKĝVA­ÊnĥYöާʵyFmÛ˙~ÉĠFtyh; ÌÖ tqH1‡:şŜ2>vġàÄ́–8VFş€´´`ˆTàÄGOòZ‰"eGÀHñnqäG˘úÚ§K9Ħ$³3ĥ}2t½ÇĦ/™ÜcÔ‡ĊÏÏĊ8 Y)/´‹d#—r䨺^eÇ gâË}’·ġ’޵ÑÏċŽ‘òÏcêgó@”2dz5}^ÖürέetÇO§üèŝÌtş›ŭŬôàìËÜ0v9ȍ1YÖ7—Šù|NËċÒZkÓL%^Q1Ŭ„Êûì!‘ÜùĦM˘†ˆ`ı—‚[Ž&‰t2YO9Q0[ò‹¸7m[Ë9÷òöeÇd\F3€·~†,h"'ÉöĦ›dé&;U–uv) œˆ3·ëƒXk{ßs“LŜM£#c-Ûİi}_Ñë Ĥƒ°9ÛBí¤9œ°‘fQv@­È>³zÙ2êeÇEĠQ½´Ä™!ƒL8Póµ•QS‰”cçŸċ^YÉdIdŜ2R•N¤$ê^mĦe6)qàô`QĜÀšÀäaĊñÁÉ5pÂq‹EÔ0ˆÓ×AStĝ”ÈĦ]ïN…âp£7]ĝ‹â£ĈT,OÌ[³ÜG2À@‚óÊÂÖIà OĊ¸ç6 ú·† “t5/d>Q€ÀÉù<ˆ:VC½`ÁjİĴ[*..{qÍñŒŝú?S3Ŭ›üŬl÷ÍWóÄĉ&ËrŞŞjŞŞBÛĥĞA­WLcŭjŝƒ$ÙdöuDGD ùĜê^Bì6ġ·ŬlżĊŠ#QgsmˆaœĦWöy7nxĤcn,ÑÒZš°½_µĠ=†]”Í ŽÖö›IÛğP wOŻÈ‡à@úÍ`}[š–ËÚŝy@ëêÌ­FQqÒÖ-rħow˘ÛedlMkݨ:*ëmÛ7qÒ2ĴUñİe²èHş~İ/7£ÎŻ´gñ"Ó`!Í tŞ~…Šƒ=“çc}+Y­ĝ‡:Jğ…èµÒÁïHmq²Ç”Ìß"̑qšü+œĝœ²TÓ!*d„1#lšôuqEJ<ïÖݵOŠ7´ŒĈ]€­%2†`½0ÈÜÎŜ}ÊÊħ*iƒœ’ĤÇFëg—Üè’!,¨XZĉ8ë,ÙGÇàŭ˙ŝ§”ïLwò8Ĝ{ùÑÔ4MŽŭŭܘ,˲,+˲ÌóĵZ,ËĤi|•”Òx# ›}ğUHÉêwԖ]BĴ2ÍXċAœŝ¸ (d Y"Ş-ħSî#äÜpĦg0ÚÎġĊĝ~è:ıİp´ñ"Í!Ĵ%N„ÇĥSè_ ñ^Âmġ ²ŜîÉö1 9s܊[T]ÜdÚèNĥ¤• ” ¨)‹ŽxĵŜ̞˙ï,SUw\T-5M‡Îö;ŬٙÉX^)˙żö\¨ŻòBć…‘#PİšŞ6’}&p-ż‡k†kĊû&‹˜Ü F#`ä1[éáĦc2„yó@ċ6›ÍXĠĴġI!“P‚Ú~‘GÜb9˘%l!ü%ˆÎ+ –>DIè[sd;C?‰{z÷+4xïlbŬsäsÑlïmçZhŝĉ”z–Ħ8ĝ”ù€ê~ú-Ë‹Şz>§sĥ°Ç{DğöÁçûÓ½Énĥ˙ŭ?³xC”Ï,ïr–e†™ım[nÛÖÚŜĞ,£Ûô•$(Ŭħ‡”ŞĠ"ñĵtn :>íw"ˆ|LjÉħŭ"ÄFcµ/îH!Ž“½÷JŒĤ£÷Ĝd%m‘ĝĦyĠ1}òĴSÒ]iHfjcì´;t„$‹ äżÛ’KJ/!_ĥ–ʲ²ê¨mğ°T8ktĥĤoĉX—jȂ˙ßô—Z61‡ÌÚş;qŞĉĦd=HÒÀ*sPĜKğĠ—dœPz$­ÇC %ùĴ/}ò³¤#f#9†N:X•yûÁCĴ6˘Rc$“¨0û­‹žÖwdŭ Ħˆí$ƒ€Ħ“`>:kÜï˘(ĦçµÇ³q£ıì|…z˜r]SX΍%`Ñtܔ%Ÿ·ìÑ>µG˙áÙéÓŬ˙k?ÛŬŬŭŝïšĞWƒi6ɧ0™¤˘(–ËċÒ TeÊĴ]ħÂñ5}%˘4³”ogdĠ$µ17Q =ŭ (ö ĴP°éjÄíĝ† ß˙mt×Ú²W˙¸š”c¸sŭ jÉ÷s˜Mb!²]5yW eħ…÷żÇ†ŝ9³z:œ+Ş‹ Q,ç°,3šċ²ì¨Ş;Xá˜ĠÈ cB:ñ­î“—@{Ş ŝò²ġ\ߒ&â¸6†™0xóu¨v_ठ"˜F™Ù@Ȑx,~–xŒ6T=Żaµ#>'€‹ éÏ2)…^¸o,:€Ŝ)J )šûĈ,î$˘cDôó޵ŜsĠ[/E™Ĵż…½0Ll@ÙĈ ÏöŜÓmÔ Ĝ÷ŻĵÓ[RċÔB‘…™Wĥ"C?ż”e EĠR]×|~fħl÷İ{ô³G§§˙Ï_ä‡{;?üíNvñŬ4§ÙÀîÔ“eyn²,+‹EÓĥ­íşÎF¨ğħ'~U/˙£B,9‡I£a6½$–Ü1ú²WĴYJeşĦvŝ–™s>âŜBš{çHDÑQ#ŞLj’Ü™°à1€Ž{[⍇FŻeĞUĦ-…Òş™“h —”›DV÷+DÛġ-eĠaıì£) íŬäàĠ]N)T>Žż‰‰ÇŒbhœż%á⪀9•QÄ-mm Z/,?­÷Bu­ïÒÊÂÛNŭœHİҎS“`è /Ò­ú÷ ž'İ^Vı¨ßÜrì"…Ûzüĝ:‚‘ş~Cf^);'aÇÄÂö Ŝ?lz9¸ĞtĴ•˙ŸÈúŒ$ï(Rcĉŝwqן_fLïšBF/Ñ˘nĝòM‹= öäÙn{üżŝò0ÛŬۙüŬ.˙)1fĈìM²Ìäy–™ÉdRTUĠ–eılšĤK;—´™1+Ñx„ ˙›$­EéËy?ĥÔKÖV5IßUÄ²‡ŽÔê2L: _G„ŝ­•Ö'x7çಠcç—áĠsŽ]ˆ;x½ˆ ܔ}zÚíùĥ×WŒ‘@üñn˘RÇ/nL8˙b³ejZËeĠRYudğŝïµC”Òd.î‚nĠq/ö 1ßK’ <ıÈ˘IäŞ%xrfıß'`ց„°ŒŽXC“Q0lc µnaàü-9;e…FŞòA„aHġ„ ô ÀHü]áĦ䳄ĵŒ„^ò5t0ˆ••¨ô÷À)]ôƒœe{ïGĝ|^xÁ’f~”·ûó_żĜߝÍŝéñŝëwMYN²ŭŭI–Mò<Ï/ŞŞòb‡ĤŞ*˘è?O´^}—nŻK²ĉ3€4гbéf™u˘ĉÎyEtË8pȍĴ´•îïxY݆”žÀ•5’ˆ‚†Ú ³H™Ĝ2ɚċf $c¨I%Ċʍ‹#k™êş£²jİn:²ÖÙż@""ħ͑÷ŒÖíŞi‡¤­™sî¨Âc3쌄ö Ф`$ÀÀ/Ċ‰r­@ÒğĈyw–Žçâù‡¸frvJT0ĊWTßk£W)Pg=.8a`èÁ1*Eùó…ÙĞ̎M¨Rċi’À1š˘ï'yçom9ïÌb Gċ€˙9{K½µß{ê)x0mĠx™Ğâĉ ˜2äÈ ĝŞê¸šUgİ=Ŝ§v÷żŝñ§‡G{Ó½½Ÿ~ħkĉ3ììM³üd:›-.ó<ğʲÌcêŞŞàíˆà#4Ŝşíô;[¨óm.•H0)ŽÌ°ÖIòƒC$ı½ Ñ0FìÎKVĉ] ’Nˆlèù $ˆĤşL‹ġy½ż£XÌ·ü‘6}]8'–8NE†Œĵe:Q×ZŞêŽŠŞviÁ,\ĜĊ{ĊşR T,„/Û­„5VĝĠ9zÉ%ˆµÓYĴŒ| yP—‚`„ġ`„( –ĉ`Ä y1˘+&ÔxΌTÏ ħŽˆz…@)ŠûFÂi‚ÀŒ la]ϊz385ÄJXpäe–QóîZCÒ60Œß*=(Ô1$µ˘’Îİî„U”‹Ħ5,ä%ĈÁ´e§ÈufŬħA<[a‡ä6!îŭ]ĉ.ú§1@f ÍĞ–ĞâŠŜ45š£CZ˙éçO÷˙ûÁÎÁt˙÷?ÉÎ3†3Êv&Z“ŞŞZáƒÇ 0Ŭˆ˘w4Lğ=@Rô°†91ô)Ż $g‹ÛZ`ÓMÁ³·½ñ^œè|8N ÚHÓqÙKbŻY.¤}‹-óŬ+ż¨`êâÎö~P’è°ö„ ~ŸÚ 7K³\vTVUuG]`–İM\ eà›/w;+9›żZÊÄĈÒZoU{F¤†V£´Z8¨ÊˆœÀz0Š2x·Ĉ² mŠ ‘‡’ĊJ0’÷A+Ëâ“Ĝ?˙Ħ2s‚˜„żĈ˙£@G’P™I‚˘˙\ŭ‘Şë됣ŝ!q ÄŠ…ŒĞĤ T£À~``""3żİ;b뤪DÖöa4Œè‰'¨ÈEû!xKpmĈ3ê!ògÌXÊ@”!CVMçWÔÚCÉûÇÏí˙ĠÁäÑáîìoóןï—mó½™eScċYžgY–Y–Ġu]·ŻÔÑzW‡´jZ•v}ŻÎáù6Ë@q‹qqoNÈlo>r0P|ċtQ Şxâœ!î3E‘‰ÔhB ’ÊHƒ‘ âéİvטHċÜmsA4öĦ^ƒDĤ+žücŞë–ŞŞfi£dœhœ:ݏoyх™­6YDCš.^;(€Ñf•Q¤éTá0#„"<·×Q¤éX° UyœĤó39ŠĤœgԏ™Ĉ*LŽP‰ÊˆeżÒ"\?!+ûI÷÷llĦEŽç´›FÓ¤V€ <•ç6ğï˙À‰˘ZÏ‘EĦĉ> Ŭ€)3D˜ ŒgĈÒ˘éhqyIß-wİy|ĵót˙oŝìĝgLJ³xd^}ü‘Y\îä3ƒƒi–eçùd2ŻÊ²v}%0s7R)­Sà/ν ò·°Â“à3tžÍ½—›ñħ×Ä”hh×bYOï@)I‘‹4‘ìÉʉÀ "¤·ĜTää:#)V†nڗKKUĠƒÑ²KâĵGÎI¤Áİ~AŸ=–n.fžìJ=ˆóXFĴÙ;€QÒ3Jiş´ï&Kpâ›pï`ŠHz^ĞÁˆÏh=Mî²ĤÔmĥ8]G8Kј‚ÜxĴŻ#A`-T/ëĥÒ_P÷Ô]/¸î?ğ„÷2½ÈŻX’²G  ĊŜmìò”²ž4ŒÌ€rÓñ˘nıš_áûfIĠ#SŭùÏ?;<ĜÛyzş÷Ó?áüû½ÌLgy~8›ä“i9›ÍóQϤo=IÍk´rü$‰pYôWÂçúižCTĵżÙ!ȏbĠCD€‡e9Ô÷Ä+8ġièèÉÜg÷Żà‚ ,ôÁ´<Ż,/êš^½ş@UïQġĝç'OŭŸ‡ÓÇGğ“ż?ÌÎĜ3KŜÍvĤÓéEžçg“Éd>™Lê˘(–u]w˘Z’µ)­Ê[ş·jéր4Vì°O 5?71‚BïRñÎİF@Îäô)§Ĵċ¤j6ƒ-1;ĵS–ü˘‹ĤsŻ\£¸˜@İħċ}ÒSŻ˙›80bBÛġ*şŞZRÓXDßWę–ŜHŒ$Uz/Ǒ–Ž’ßè÷óiì˘ê}Š£9cߎ!#$`äEHÔtÁ'ITFHÀie$-ÒŬjş0{#*#KĴèù*Á#`Š`„Ħš.İŒ|i”TF.TF#…`î-ÁH:GŞ ÛäžÉnÄŝŒ’2q:ŭ’`á?ÊqĦ} Büh½ia_‘é-ƒrµO6ŭŜĝpùi)·4„>V=T‚Ĉd”B˙ħtUU|qĥIJ٣ĉädòìàoŝìègLJ³Ù˙>Î_xhó]³{ô&›îÌ&Óé›Édr•çyıX,šċr‰ċrÙ1–Ğͽ¤ÒĉÛZċ€€6w¤ŭ™‡Ħ_ëùŬ4 ?KĦbRNĵ+Ż qà–È †m^“°ŸŸp•QŻnˆ ˜H”!&²3ú‘ò¤Ĥıq*C Ž{0gè„ċÒrYµ¨ëŽÚÖµ‡MĜ½‡I }„Ÿ ƒH4żĊub-íğM˙¨Ï?û1IJAĉ}î@jè•רé‚İ€¤éR5¤Ĵ`ĵĈŒĠ€-´Žs@z–jşÄŭ'¨é8Ú)(Cô˜óki¨û *Żh“APCÚÂ9DÔ] éĵ@"@‰ŠÚqbġÔF—RG÷ÛÚnĦÚ q×Ë{Ù§u&İÁ×Î÷™,`ƒ œœLœŒ“”'{Z+pŠ]`cY˙ƒ:a2&£EĠqyuĊß/[Ó´‡ôì/>8yïpgïxúÓ/vŻż.-ìL plT×5ʲD]×mò&\għŞ2 Äğ¤Ö½ìtx?œ/Ùëò$08˜/ïĥTÑwú²:Ġ³§êÂh~4=ö`DŒ5)<™ÓÒÔÊùĥğ”ĝ™IŻÈ_okİ-•e‹şéÂL4óÇé)88‹M¨^4¸ŽQÚÚêĤ'Ħĵ`Ĵp­á84* HzFa M7 F40 ?ñàŽ-ĉŒôzċĠħZZĦĤKzFAÑ3ÂM‡´[HĜ˜óŒ$H“ĵHĴÁHT^ÒËWy˘/¤<½É·ä}š„xwٗ§}%ĈÉtğŸŽva +†Ż­Ĵ³=;çúFv7N ·è{kn·żÚĤ˙|8G‡ŝ22†)3@Vv(Ğ‚úÑ˘Şİ~üó'ÏO˙úhïŭÇ{?ŝÓGÙëOêşŜ3lfÙÑÑt2]TĊĵÌóĵ2Ĉ ,Küg“ŝ‘)VIÀߊ'^~‡ġfµL#Ò<@u]Ê;²5°šñ)N,¸äogÍùár€ó =);"íf9„ 1UuĴŠï!méĤ ËÔÜñu]/\(ˎ–Ë.˘˘”0 ‘@X˜Xğƒ‘úŬà;Zħ§6ĴÇİ·*`‚Ñ@M7bŽMCMÀè½@Kš.#ġ(EÒ1ıŜƒžĠ ­šË‹{>2‚òŻ"ëäs=…g£ìÛÍ%DqDżÄ÷"‹^ƒ1û÷NëúUΊÜq܆0é?אŒ˜rC´¨kx½DSPġätcżŝ󣞜îì={’żüĠo³ËW{™ĦŬ<ÛٙMóË|2½šL&EžçuQmכáÙ•ÖpZoÍ/żëz~Ŭ‘ÈÍÓÉD’ÈIé\ìŞ^M?ĵÒ Ĝ#NÒ×FòÌւ‘XdX”FaĠĈwġÎĴ]¤@=™ĥë¨,Û~ĥhi&FMôË>ĈŒ€ħ‰~i^Š‘¤ÔÛ\vÄ –ï²Ĝ°ÜŜáĈjş¤2"Ċ^£ĤÀoEMGş2ZFFFb.*8ùy(ñ÷b;ŻUé87Œ$•JûF’ô4ž.÷jş°g靴…ʍ]CÊyİù[x/ĵXh—C Ü!7Á™ԋG3êh^wĵ¸ĵBŬ4Tžšç˙Ӌ“'Ž÷vŸŸĵúçÇÙOŸ|œ-—ûÓéÁYžçݧÓéùt:]L§ÓŞ(ŠĤišÎ_ÓWZ×ġ_g?Ä÷H£MàHĉFkn ?ÄîŬ7ÌáBí˘‡ßáxW'ÁÁ6*ĵĜĞbi*Ysҙ£pşSú>{K¤¤tN0=ßŜ6UUGuŬ‘íħœĴN†^…€!ĈÚÄĤ™¤¤Ğ…|‹ÔNèĈç`e˲{&:I0PÁ8Ô7‰† Ĥš #’}3áû—ŬDMçùÌèž ŬğFMǁ…CÌ}ĈtŒà‡Ğ5úĠÓĥÄ*}ψ9fHpĤ8š.¨ƒ´QPPĴ· Dàĵ§< ‡öI¨ŠRÀÁş Ë°Ż”ĵÁĞ9ûÙ#6˘şb!w–áF^@ŸhċbâúJLàIĉ=ǁÌyà–¨î¸, ü´lİ,h~ò|ïùŝÁ{´óäÑŜìÇ_T–ġwfwgo2ŬٛL'oĤÓéċl6+ĞŞjŠ˘X6MÓ9ë!ò7”èĥŭü‹: , zIÇdí’ÇPê-$”#D½“Ó’-o9hʤ+#ħ5eS^ĞO“;|…½wm#‰l¸Î2ĠKKUÙÒ²ĥŭÌHUuQ+ȄĤ[Qñp_%ѸĊ*má,'ğg–Ù şċ~Qj¸07›3BRĊŞf7Ŭ€Ĥ“”bâ%¸Â›ŽWzÓ Ôt´FM7zż"mĈIQ;RuQ¤•;ĊÈ3WLo:Ç5d> 0`üâĉ ş@°îżĊJ)”eÊÇ×7K}EÛWPF³ÊqK‰Ŝ+‡7ód/Ĝ“!CÌ91:w¸—uEgŻZTeCċÉ>½wòçtúüôp:{ö${ŭÛOгŻ?ĥŬ3û‡ğ“éŜÎt6ğ¨Ê˘œN§eQMUU­SâÑ Ħ6¨ëœĥH2ێ-0ĜFi{ü&jԕW̰–_`d*ĵˆàwvÜâÍ ÔM0À/v‚‘´2Q ŒĠ¸ëŬŠC€†ˆş%SYvT”ÎŝĴ Q%ĝ²éžÑŞĊ-Ħ‰O1Ş”o"ÜĴD‡40‹ĵĜtŬ…ĤQӍzÓA˜†ß›n•šîv=£ħŞlMGi$3 =˙Ô90òÒ y š¤eġr„ˆI $ˆBÈ}ôˆŠĴÄllşxo DgKäf(öÜRt wwÑكûV“§oDq&½ApĉtLynhÊDvÚ[Y™Şċ’ĞË ŝħP×Ç(N^ŬŻÒŝƒ•Sӈ7VIAÙzo:„OƯ̈šƒ£15Ŭ*0‚#ŒôŒ¤šŒ€(œÜBM—ÌTI€müG¸! DĵÁTUëĊġÚ£n‘}˙ù£ŬŸ?Ë~ĝ§'gßü,‹ïšéÎY–M§³‹ét:ŸL&ċbħhšĤħÖZ?Dk0ıMŜÒFEĊÑOÓó JÌ2? 15Ԍڣw‚“9$~‡`d|$Yú¸ ŻŒXÌËÈXƒ&9%ŭEġ—µ%˘Ĉu,ò›†QÔ˘ŜLM7ZħĤX˜ÙŭRÓ“Üĥé!ÎÎL*ƒIG#lۛNoä˙˙ĦĤR’ M'¨] ƒäŞe)„AAÒwŠĉY„Äš ñlŠè ‰èBŜ !ê1ˆ4·´’@äk½irt‡T´U=B˙ᆘ ˜r²“œ,l[²ÚZê–5_7X‡TžŝìäéÁÑ˙qĝ'/ž˙â½É÷żúײ(~?ħôcnf/óI~6ÎvvvŠŞŞšĊbÑVUĠ&'u{£óhC:o°ÒÜ^öÍ#'ç@ÄpšĜÌîşĊ’T ³²\°#N*£ 鉰?1:™fBħ4!âàŒŒüçşŜŒ¤k7§NI‰’‚ôœQ"`ˆÈ(ÀÈùŠ€>çuˆ×KġEÀŽb ŸĞ;vƒË8:’âH.b?%Î÷Y1ŜëMWŭ'z‡—wN€Ĥé‚ğy÷pÏ&À0ôÁ+öEp„Ó8f:3@žžN2´£³-sk‰ş–š²¤WuCĊ|—.žN^<ú³?9}rúxwïgOó—żŭĴ|óùï 5y>ŬŸN&ݧ³ée]Uċl6+Š˘¨‹˘âc6CctŜ˜Òn#ŜD êöö#Í:pü ”ĝaùĞ‚F˘šXF’Q:%Ë÷D’·q·Î–™mĵŠżŝßlŸA¤òn‡Œ/ˆÓáQĉ[ ҆ŭEîi„ĦJDS½ŝ #M •ïÄôQWI$[(iç0du[‰§PïĤ£8Ò˙JMljšn•€!D0Dċ¤#9++ŝ[oF#u~ÂĜ-ÔÂŞy™Ñ:^Ċ˘Eƒ…”'áÀ ‘F7ħgĉ€A9#ĊLqş2â10ŠeÄY+éIƒ;Drf%’íFfȆ[܊¨ì%K`Óżo€éÑ.À³GŭÈ=Lï?ü^ëÀr~Cş  9s²3“WËÌċ†x’ƒ–­ĦÎ2YË@ײíZš_ĥhê%ÍûtuúâĝùÁ£żÚ˙ŭ÷˙ġ½ÙËß|8óŬç&Ÿä‡Çovvv/g³ÙĊîîîbgg§šÏçMY–­µÖ2³Ġ‘éĞ*ëRj™ˆp÷’ĵRìÛ~ŞŸÁH˘†b>ŸGħl(ŠPİ ÈıyżßdÙCH:“.`Q -¸c!n¸ŭĉ!nTHaf$Ĥ”´{LM'ŬœÒtˆ/ĜDşÉġyq's$êǨEƒXí‘,ŻÒ›n Œ¤Ħ)FÔtÂ+Ġt´ħšŒ ċMÇ#j:/AREôrĥj:ď¨é Ħ;¨éB°‹w|†ŒÜsáĞL?k”ĝSÊXa“ì|Âŝ™DüĞW„˘ #ğ}v´÷a&ëŞXŸW]ùŒżd@p|\¤…q‰6Öa½qÄOŻ7H,"Qd$@”Pž–-zÓMbd[î¸İ zŭŞEYĥtñh×<{ôŸŜ{zòôñŜî{OŽ÷~ù´|ŭğß-ĉçߘÉáÙtödĥSžO§ÓĞÉd²ĜÙÙİ—Ëe[×uç [í‡U=ÑÙ­ĉ!%‘3ÊPUQ=¤úˆĦn2‰ġS”ĠS?~r'÷è;’a,ûw=³Á‘ …r›€½²xX ZÂW2‚ùÚB‹TÙÑf v0`ĊâîJ ÌH> Tu’ÛTÉÏŠÁ=1ŻäSó\Ê,ġĥŜ&ğôŒĦ·R}.0=›‡"@½ëGeĦßc‚µ)Òöp$I´ó“‹Hï܋dïdğ%——\—%ĉû˜?y<{ïĝoŝóÉ=t|ôütïċo-.^~[;Œ|ŠŭŭI–O³élħ¨Ê²!˘Ĥm[nۖÙïUW(ñî,ûN¸"µöˆ­0!áî-HG}ħ*!›ò¸g·o¨¨â´âġÖ?Vĥ_™„nK7jI 6ˆ{ħF€ïĤ½:Vàş€Ĉ+#İFS ˆpâ€ğ7xÀ“Ĥxj;œÈ×Kğ郞3ġĤÛ$éġĤjş tCChë%iĊµ™€F ‰qXyÌâzS|¸•[vö°*‚”½˜‘ßb-ž°İH ÷}Q½‹ )b 7Ó$üRV_I š¨’,YĉG%ěß4=‚:ĜĤó×5—eĞâÈĵ8ŭ“ï<9>:ú÷/òWżŝ|úê£OĞùÙ×U]~ŸïLöfÓGġÎîb2™,ĤÓİ)Š˘İëşkۖրÒZÖUviKBÌêp"N£wĜ€X’]˘HrûsSñ=ôwÓ C˜o›k“œBGt@`19XTzó-àmÔ°~—‹Á°ê q\ò†1Ö0bé`œÍU8[èܜ["îThû†êX™-qÇL–!ò5€‘àğüw"픀Q( TlF"gHċ­RÓ§h„Ä:0’îäœHğI˘£×,)>„š.0PÔŻDïxœÑ!Ĥ™{§ˆ@ÓĊ³P`”8[Ęw˙ۄ”=>ĝΟr.áŻ) ¨%1#Dbnˆ…É4‰ħ <şœvİħt  áïÇrTµ‘ÂĈÒµO-[î,£ëED°..…e6•éѝŸ !ġ|Î?Ô5ĉóCşzr´÷âÑ_üÇç/žï?úìĵúĠ'‹Ÿ>ú¤*‹o›{9Ég—Óéäloo˙²(Ċbħ¨‹Ċ²ë.ñĈÛ”YKù–œA˙7V˜qkÉÌħ¤7ĵJñ ‘+Ĉ÷³½CŸün}$IAħ—~ƒÔU0í=Y“üމkû”w¨wd$YĞ„ħjŠK+½éĈÀHô. O*ĉŜHeŠ˙ğVü~Üĉ\8šÚ¸ñD´h˘‘p½( €Q\U˜ĠBşÊ›"ŝHğ‘t7İŒ P+šŽUžo:ŒHğ‘ôŒœ N‘ 3Ñ*0"\CHZ”HŽġT˜OÇPCµnñòáÂ*xdĉƒEĦËsb?ċWçŸÜF,ò…ùŞÒJ'{–Àµer DµÔY뙒˜-Ò ˘ ÜġZ´†ùòÍÊyIoÑó'ï=?|ô^ĵ÷ìèèßŭlçĠŻ?ž˙ôğÏË/gÓŬÙtúzggvħ··7ßßß/ʲ\.‹Ĥ,Ëĥë:;L…ŭm) ƒEž¤_Tjz€8;i-tQ˘!*ÂŜ‚‘)šéŝQT4Ĵ4fÑo‚ݳš =Y iX&ĥŭË*lù*û4oûoeÒb)ŞĠYH+#yKä)¤Ñ„ŒkG "é7:ıd> ÁÓ.LT%FHjíÁˆ“p=‚zI!ËE:NÓ@Uğ4_FHÔt²gÔ|IžF’^cH÷Œ„7ß ġ£02-7£4Ġ6ŞéX™ëFş’0‚n%×;™÷â(—ĈBÂóŽ£dCTĈċlƒ‰7ä3WWI•·£|Ÿ˙syá“(P0²¤g³ÀÔ+imHÔuLmkİmm_)‘Ĵâ)Ni#nò\İHÖ6\—KzılqyY›Çôâéż{úìàÉéÁ΋÷NŽ~ŝ~ùú³Żçß}I?9Ĝ½³ğĥ³ğwÑÔUqppP.‹jħX,‹˘ÓşŝÑÀĊakyHz½SÜÎі(.ßawĈ%PÜ$rd›•$÷ƒGƒ S>aÄOîTuOY7jeġäJ|ğ½v0§%„eĊäPŒôŒ Fğŭ(\âȈħà,ÚyòŽÇ6à d€ĴŒHğ1f”Í´6é˘/ÂC×îQo:‘gIJOçàġĤˆ7œ`o:ĴñĤK+#™·>"íÖj:Ħ’“=:èáWMSCäÚâ5 j8fèù%ҒԨk‘A\2=’E@œ,”‘Îóàë+&™*‡)(ùİt–Èv–şÎÒ²³ÔĥLë$eétËòŬ^ûœqß[Şšš~_6¸œïÓ듙ùÙÉùùӓ÷ŸL÷ŝĝOĤG_Ÿ}ùÙĠÙ_ÛÎü°żôf˙àx[.BĊT‹Ĥ,Ğe]×ĥëÔ¸uû˘†´ Im°ìz›Ŭw“!´YOFT<,²ğmëĠÄô=Ĵ’ûb ïkĔsÌŞ2bщ¨ĝ!PŜâA;ħĦib¤8ÔN÷µŭ"Ż Raˆġj“b/ÊÚĊÜXh'0OŜc„Œ˜ÛŸzt›Ž…´[T&CoşÄö6€ X¨édSi•7s°èŽuŜtcĤ&ĞÊZÔBĦá>bbH½j0r,V˘‰xvßhB´Œ÷–°ĠĠù ˆÊ;”ÚŜħà ig†Ì[‘fĝP*ŒhC½Èċ^Kt(bP:tEŠw`HĵÊ e?$]ÖĠΙŬ˘ebÛYtë%u½¸AÈĦ#ZF1tlúa[YêڂŻÎJ.;¸ş:ÄÙÉÑŜ³£żü÷OŜûÙÉáñ§ÏwŽŝġiuŝĠçĊċËoêÖĵÙÉw§“£ét:›ììì,ʲĴĞŞZEAeYR]×ĵ†ÂÛeûËĴL‘E"33nc)v/`”T8A2iǍë zï^OH’È–{£EJ-=X´Û™Ó&n4SÚ ŒS‚[9èhĊbKîeQ`–[c„E˘Ĥ#eO k‚„cAÁÈ 5÷Á|Vµ•bc„CÖÊ*o:óĤ“:8Şz%œ¨éÒĦ×TMgş"Ĥ 26Ŭ wSÓħDàDMljšNHğġ#QÓñ 5ÔJħŠbù´xğ _!L9÷–¨A3‰8–úK$áÓĈÌÄu¤S2 ”9/ÚċÖ·=ˆ`‰ŒúŠm•µ‰D8BŒyÓ!U#Ê@ğÌÄ/ÍW€Qş$"$6\ċ‰zG^e7x†Ż‹H“^ütƒp½zӉ §ê>toş´B\£Ĥ“…šú¤§!gá€3EW|™Ŭ& E›SŜŻ’iêšë6:T:-i÷ĝä}“|;'2ï˙ÁÑı߯U^Eǚ'M‰ӒÄc3ĵ83Ħ.ôCQÒùù.½:=ÌŜ?yñüéŝÑ?úŸ=*üĤzù›ó³/>ĥvù-“ÍêÜP†]0ĦkÛÎVUĠ-—Ë11ĥ); ğ8¨H„ŝ"òT=(NËzĦŒ|ZèêŬ/BĤŽ’SËYOé%•ĊVŽZĵċ^ï΢ŒvÖ;@hW‚u`ÄUJrAĈZ0òŒA“A›521ŝÍĴTŻ ×£4é+Ġtx'`DÒçvIŻ´IÒë]ÁˆV Á(=(œö“ïqGzp’œ> çd5%hG~^(<­\äÀÚ/S„—ñhß@ĵΉ“ı$½qiq ~Á 0R{ˆVY_^Ù ²ÌÌT]-ñmQқ×3zvz8}˙ôçœìœ8ĝàŜòü›|ñá?–Ż~ÛP[•íì‰mZ^N§ÓežçrˆvTĜ°EÊ ÜqˆÒ–Ĵƒüò–ğêTE´°.O÷Ĉ|˙‡*5uñ  @İ!NĠFÒ½ŭd¸R.Naoq‹Š)ħ°Ŭ-‰†+ÀH0Hšêj¸*€Qzï˜A&6Ôg>ƒn j'œÊÖċ°%’>0˜zÓáv`Ĉ‚nFÚ²0JÂġXtçĠÑmġ6#Ĵ#^F¤ŝ>QU9,œ: i!˜ ĴŒ°Ş—à–´íYü~ġ8G™ĉ€çѐÓÔ~B<ĠÒ÷PĵJ˜TF   {a$_Ó~ĝ.soƒm-—-.—ôúl‡ž=9Ì~öüÏ˙ĝh˙?>-—vú2˙Ğӎ>ùç#óí§;ÙĊ˘È8˳ ëÀhë=$Ŭ‰ °rË~hcħ,ĝğ ~lZ8δ٠h}g~v~†ĠiJġ?è‡UeiçĉPËè&ĵ•ÀŽ„$ÇnR% IDATF<¨$á(j…î‘´:òhĥ—w3˘›²ókà‡cŭ∛œġ|s¸f–…@`Š×x›#ĴHzEâÀµJAÚÔqlF ae…FĉŒV¨éˆEN•B€6#ĴJzĦšÎ÷´ĈÔt4Ú£ 1h,ÁNÒtÑħ aÔV+‰‘ÙtLJ£9é[ÄáZ YÍbL+ÌJD‰Ï>F·eŻ8HÚ1#¨û#6{mħE’ÚŭhÜûeœyß²ĥ£Ğ’İ~¸¨šárŻıZüċ"˙à€NşƒéĞßïf52XôîH,Lҗn{€$l³9xì¤IÏ˘$wî`­°?s#ŝ\b4ĉ~‡bĦ+¨J#UËÙ o =#ısġАéSiÙtÔ.[fkC'75‚“Ü·ùê”n½„ÏwˆqPáċb։sa„FxĊ;Ĝáœ,ÉQÍË<€7^ï lĜÛ"0„=,PĦ÷BM§Td˘ċœ†ÏħPÓñ¸´[UFCƒĜi@{ÓÎá5b†Ñ$İĤS&¤½é|„‰¤×›ŞéÔÏ+†ôâhƒ7_÷–ğIÊ$G’H˜Û1´”,m Ħíhâ Í$ Ħ§i˜ÚĞùıĝöƒÄ÷˘÷—lŜsÔùKN`Ŭ3Jb@c%›S!ˆĜcEó{‘: ċdò]ʳY"4‹—ôê‡ÏˆŠ/hÚ½Ħŭ)_î瓝ċ²X*ÑYNٖô;ßÊBIĞy ’¤xĉAĠH’x‹4d›úÏ,ÊéwR%éëÌÁıEzú³ÜiAş]’rĝ‘AŸÌWĠ-Ê%µm—4AS†œp 1Ï(lԝ°eƒ“ž³¤·âJ|÷ğ>¤Á݁Żkl²9kf/ŞŠ^ĠNİ&œİE?bĉÚ+Ì(Ž„ŞĦ×!î*5( GÁÂo‰“ž‘oRK; ֜iĴ’¸Ĉ›NGHh'Ŝt ’óCsWĞ餴{Teuìħbİħj¸4ĠÓ%XPÄóŽ—äô9ŝZĠ€ ğ£Ôy`i– ċL Ù$ÒqRrˆˆĊħ‘Àò£Q+zFJ *ÀHŜ˘X„ĊSa˜~îùŒ)Ÿè–ċoóO)/>ĵüédVŭâñùûŭÙÑŻşċlħh&Ü, î T7`°EŬ^ü+=€îħßk$¤AÌ ­rġëğé˘c ! b{/ëd´D˙h „8pxğ~íCş3óɃĈmıĞş£  Ĥ³!ċm¨1üàD\éôqÀɘÎàWhmqw„Ê͚„Ġĵij5 ˘ ¤vî3ĜËE5T# BM'w‚ĜñxŒ2v|DÀáMçËàxyĈ{F²2‹<ĞcÇ!Àˆġ1`ƒ/J †^YȋÏĈx„„˙'âÄO”pK5ƒŞP1ì“ĊäQÒ3ҟ/5ĝÂf P *l’Ê‚½ƒ27eF*ÜIúz*'޵ÒÂ'mbċ}‘ħġaSşVÀŬ# '*ŠL„ù$˙„dD&gä;DÙĥ]-&>˙ˆĤĠgt˜-Në/O§ż}ròä_vvfŸœ_.^žUUĠmïu×J•¸mÇËNXïpT!LÍĈ#fß5ċ½(A5P_q—”€é½Š5@jb%à 9xğ·Qš€6ĊZ˘jÙ˘h,u,öoàŠ½íċ4™)ÈĤuĵ‡—@İ=0V¨é\ŻYyĥÑ0-V‚7 n·qħ–¨eĊ¸Ċp!)~ ¤Œ5l¨Ĥ‹ğŒ˘ƒtIĜHMG˘êHäĦiìŠÁEqÌ úìŜtH  ñžQ FbSQ sËj:Ŭ3J?_Qú}ħÓYAÓĊ ] F‰› ¸žâöĴ舀òZ°ÖÎ šNÛk°g”ŞD5uYHc-“ċ;@6!Ĥ–şù—ÄÒ¤ü„Žè‡ù½ê÷§ö~vúü£ÙlöyY/xùfqµXeUWeY•mÓÔ>‚Vôĥ'jEñ 4§d”󅔌‹#‹3|gĊž”İĞkĞ#ʕf&#"˘cŞšŽÊş–ˆ²İ|Rp÷KÊħíÀ(vÓç!í ¤ÒîYŝùaÜنúĴ紌ß@Ô ‘_*ĠTîŽw¤HĠ߅´ûĈj:ÑKwà7UÓÉw˙–Òî Ôt”RXL1&q5]úù•‘Š5ñsN›€Ż#Ñ ‹KIHFO”+ÎQPĜ7UÓħžŝ Po^äĠ…†(ß!ä3"²ÜUß^ŝŽ&‹iŻŭĤ|<[üôâtçó''Ï?1ÙäûÖҏçWċOóEy(ŠËŞ,çu]WeYĥUUÙĦµŬœò­Ĵċ)ċ'NŠÊ“󐔯HġóŽTBkÁ­ûû²bŭ³.2EHĦi Ĝf3á ˘eËTV-UuKe2“ Ĉ€ì–ËWvn÷.Š…5Aû!ħ_/Ǣ°`ÂħïèÁO=£´ ÛìÑĉèŽîwZÖ&³_ÔFwƒ<#ĦĤŜtŒX‚UFʐU‘´ EôÇÎyyCñ0bĦ:ċ•Òn¨éV€‘pi`ÄĞÀˆ”€a íŽĵ 'J]1mFc³o#`[BO €ÑÀĝV‰TÔNےu`ÄÒİ0QÓQZÉÙ˘€n´ >Ä@ٌÍd‡Ĝêê3ĜËßQvġ!í/żiOf/ß;|qr|òùlgç+Fŝûв>żşœ_”UuQ×ġUUU‹²,ëşÛĤiÚĥíÓÏ× ĥR!qşĝx?4"bXDŝġ~ÉMRW 9Üû$Yöï‚~ähЎd ’VÊÎNŽˆ¨m™Ê²ċŒ,2ŜıÂl§ŠĊĜ%vÑÎÌ "„àOÂ3‰d€ıvcĦħÌa€[fĵqĝ)ƒŝÂġ*;™lzÂŞiÎpP˜ñ›ÎğİQB‘ÉX)Ô¸Á+ „üˆ€a¸ʤ×àƒ&ĵéT;(€Ĥ߉!è.δ"é•EÒk*T‡“ŞìDuœHĦ>{@Ó)ÏM$Ÿñ$K1hA(  sžxçE Áh(^ş·Şs Œ(s€ Âhψx½ƒd  Ü‹/C ‚1Lٔï™]WPwù5ÑċżÒĴü„çŻÏžžN;9~üĊŝŜîWdòïÎĉĊËËË7çËe3o—ËËşĉeY•eYÖMÓ´]×umÛÚMW”|[‹9¤,V´& šúR•­“}›~'Ï"ŸL=ĠÔÇ4ĝğ}ï2É3q) 0ĝ‡žu2-—–Š2‚µ~ĦǔYŜş…OmġügÔ·hQƒP3AxӅÍ|TÓŝA´8ö*Lc˘>¸-Ĵzq…ÜFÙĊÀ>1Je%íŜt MŜt²2‚_Â×80xoş µX#`€–ÒÊèÚ¤×WÁr{LMÉ/­ĤCT U[; ¤ŬPÜݵġs>˘Aƒ ħâsxĜ3RyÑB(a ÀH§nûcS( $5ó4 éü&6m+ÁHŠCÔú\C ·iu†MلÈL`yIĥĝžĝâ#ÊçÒ~(Ÿµß>}´óùÁÁÑ·„ìğËyñr>_ĵİëêĴëĞĤiÊŞŞÊş˙j–ËeËÌ>°ŻĞeĥ*jÈ&â€c¸i£.ÓïşmäC׌Rqàj‚ÚÓe&‘½WcUAaï*ı0ˆÖë?v`´({šŽÓĊÚk’ì– O$ê餿Á‰ÎhÏHĵ„`(.^’4Äw]úĜᆏˆeâÖwVWWœDÜŻì½CoşQ8%µĥg´ŒîÔ3ş7]Ú3RóC5ŬèçÓšŽ70`’|TM§6çGG,š’û˘{ĜIÏh7ZkEžßġù™x2D&2n²àú%uŸ>ĤCûm÷dgŝ“É—'žċ“oĉ‹êlħ(Ŝ”UuV–ċeY–óŞŞÊĤišċrÙ´mÛ2³½ACcûN bß½ÄVçjÀîá Râš#&ßĴ¤(a?&U…÷ˆ aQŠĈ̊Ĥg!Ĉ‰`ÄËEQ,İjş"„ôCĦßÚ6Ë?×ïқgçLL1‰G¤Ŭr‘àŒ8£`È!sH·ċŭ˙ 5ǝ>ŽĞ£ïQ;Ş2 ‘̚KÀHL邃;xt"Eĥ)  ,óŒ0J]ğY„ë ÜıHó oş"÷.²Xq  –èIšNTÓ F<Fœ¨éd˙/ÎB49ŝ(I. öñ ˜)ħÙTÀ0F,“!Gk=@ıXèŝñ2DÙ˜ì™ q{…öêsÂĊohŻŝĴ;ž\ž?=6ß==9úl6›}YVËççó7EY]EqY–ċ•ЈŞĤiĈç+"Yñȟ•òĥíôÊÑzl\´/ÚğÄQŞÑïĤəúİgı³ˆ;^ĉû=‰ħ¸ GÉ"ġS~{ÙZZKŞëNT$çá‡HùmTħ<ŒgáL°Â›ZMÀĦâ8û#GéX‘>Œé–‘ĥƒ}˘¨ü&Y-ˆ>–~3•6ĴŒ ÀbZĤdÎÍÔt¸&\#Òn–s=#IŻ‚N'áz,ĜĜ¤ŻH0‹ô:֕I"`@È"‘"™F:KQAì¸É_ÜUMp"öˆÏ„ê'F(MŬ,ĝùd†KŽì‚dĉz耐eSÂd‡Éu‹ŻaÏ~MÓĊGt„žµß>99üzow÷ëekż?ğXĵşĵZœ-‹ËşUUˆÚĥ] JÁ†ÇeoĞЧ­&ĈúEÇârhöÊÌCpüĈĜú#“ïb˙ŭxÄB ²ÄlŬŭ½—F’W iëŝÒÚ¸a%ħÊıi:”U‹şéJÒòà`ÇâĝN€‹´zîE`k%c‚A@ŸêßÉŬjÜÊ ċnï]Ĉ"H j^vÈÒñÍN šÒv˙îĵşoïÇHÒk›ĴNz~=éĞ= F"N,L+çŒ *#oçC; c•"] IeŽ%ğ?‡PŬħj ʉ?ñ}Y+°à(XD8ËW64–¨sĈóĦb ;‚ÔW$`„DM'A Ê]E–ġ.vQ¨ébĈߌ„Í‚tߐvˆVtb™˙1Dfâ†[s²Í9şĞÏ(ğü5֟5Ow?wşûĊáŝї–²çEóòâr~6Ÿ/.ŞŞœWUµhšĤnšĤîşµÖJ Ú¸ ]ÜĥHt—΂܈M*€í7DOHOÉĦv˜*Ŝ‘K…µŻ7Eµ¤cŠĊ%n–EÙR³ì‪¤@⌐›·£ÒàĦ> H˘°!çDflE)^ĜñŞ|v͐ˆ‹&ċâ¸áÁ‹·ÛïÏe+yôšŭ|:ŬùĤ¨šŸ..//ŠbqÑÔġeUUWu]—"êşÎG’Û5´Ü*âu†­‰ÑTîox: ]żŒÈŽD`ERšV‘j5fV Ñ{;Ÿ(.b9ôNJ#í÷–¨n:*ʖêĤDšİfĤ=ñ€ĝÖyĥFšdÀô”‰ċ°Ú%v@‚‡ˆí N­„XsNJ{”ĝ™*×ñ[?àƒCĊÁ‚Ĥç"WUĦ/‹=#DoŞXĤ¤•‘ é„ËĜ”2”d”şô­cñ+IŬÀÁw¤€A‡› zFJÈ!ì€ä1“Cmg½Û‚ß<·ÂAÂ͖‰ħ2ŸÈ‘Ú‚ġ“‘Š”bEëR4Y ÁœA?„QŞĤ fżâ6LŜĝ&ĉ¨‡‡iµ€AXžGù9{ê 2ÁL˜&{Ä&ƒ­_“½ĝˆÌĊŻé¨ûŞyzŭôôÑΗ‡ğ_´ŭŝċë³×óùüĵi–Wu]Î˲§çµÖÚ6ĦèÒ É^FüÖ)ğ´ö d•èèĦO èğ°‡j;fÉ!ƒ´šúÙ4ë Ù¨ħ%4uG ]a¤9Ŝ×ŜóÍĈu|›÷É+éz8ħdÑñ5FÔt`ía$3Ĉ‘|gí87ÈtÂÍŻş÷è$)>`Ñ·Pv@ Ì ì€de„•‘#Ĵ£dèu ĤˆFì€dÏ#j:éM‡ ÔtX£ĤK+£p£ee$"$t…Eq\GGZhu!#Ŝ`y)úÏ1É]JŽó˜7´§œ2JĊ 5¤›ş.öƒ€#`¤*$§ñ ޘŞn Lˆòi”r_~N|ŝKÚ)?ĤÓɛ×ÏĞGÇÇßdyŝ—q/ĊyY–WMӔ²Oä$ÜR´°êÏu`´Ž@ç­’ßµ3k•ÓC ê“nRiGZF)ĴÀ)Moĵ/1„=ˆl{ı˘Žêڒ˘éĈ•JÁX 8Ës\0cµğ%ĝ”İ6Z–°“¨Ĉ#$•QşÉ˘+ç =Ë$mĴÈŜĉ^‰É&×[?J,Àh›ÒnĴLzDH*0˘;¨ép;  “^EJT(I°ÖˆC¤yŻ£rƒÂ…I¸n""IyóĤ“ÖJš"TŜtzΈT¨1m Ĥ‹”p`ƒ!İ*"F6Ħ^AgVŻÈžLÙĠŻéˆż)Ÿ,˙üñîû{{_uûêüÍù›Ċ˘8_,eY.êş.—Ëċ²mÛ&݈䟴JÚ¤RZ%xĜn…Ä"e¤C[Iñ`*$ %W™hœŻÚĈÛqoó(CŻRg‡äQ³eÔ SQĥÜ,ğ@Ó@Lik0'aŬNM:ccKƒ{ǃŽ£ŻT#ıŒoŒ´H™™¤Ç$³%8eÜ67BĦ,óÚ9i[í|´JMÇ+*£Ô›Nx2D”È o: ZQv½7tíf5G%6?!eFĈƒ *tžQdš<•Ì‚˙ :Œ³á‘p½¨pa_-°ż jŝW€‘żERX/l„¤É7 Ñ ]£ĤƒwIzvIƒÊ˙݉°@i‘••‘ŠĜàŜ˘Ÿ€ ”Ïٔ˜–Ô^~Etŝ Ú-ǧ“³W/e_>:>ŝœÉ|w~Uĵš—óùü²,ËyY–‹Ĥiêċrıt‚…n€6ŭsŞn{ƒħƒß ĊjÊvġ7ó•IÓ£STIĴŠlÜ܁fûd]’wg ‘í˜êÚRYuŞ2r2×Ä`‚…ˆ7ߒŸGİšŒ•ğx½˜Ğ—\A'ùTÀ0Ì9ıÁaQĴ¸[ߘmĠNòĈ3 &†˜€G¸ŝÍ*#Zi”:ŞĤ“'éŝÄ ‡^oh”J´‰7 ~n7ŬşĜqĤ2"Òòé+#Z]E ÓŒÄj{ ùĉäÙñ›Ĵ( ÑUìz£ÔŜtRÑío:@0ÂtÉäÔÖo`Ï?¤ìòtÌ_ϟÓÏí>›NżĴ—ö‡‹ËĞ7WWuï9W8ÑBŬĥ­Ĵˆş‚oĜOZİĈÛe!2 Ÿí’³Ü+gYĞñŜ!&ɢ,v›ġ),Ÿx(tğï4¤·,Ú,QÓ0ŠŞ£vّxˤQÌJuFÎyÂ7@AŜy~ĞN¸žgd+ší,^ê8'™¨éâb"š{qÈŝv¤7Úm@V£–EïGĜôHżŒqo:am3#lèMç+£ËIzDH¨öĈPM7NÓQ2g¤½éR5´€!‚ј]Ïujş&A*d …oşDÀŬmYHϳ,Ie$üĦ­ĴVÓi"dŠ9™:ĝˆÇ½éĈzF1œW†ċşS#&“1œ+·%Fwġ5ñù/iĥĝ-N_ży˙dúĊÑÑÑ×ÄôíÙUñÓĊċĊyU–UU͛Ĥİœ”ğqEmBŬĥ2şNÔ@o²ÓsHĴ6nŝԘhÌúPÔ RJÊ:dhh T÷{"PžAߛİЎEKË zı#²Üivw{Šhù´5 ¸ü:ÛLj³ĤĜû~ÄNwdgˊ)=£ymw#ŝaµÊħÜӕ€{Ŝ•íÑ0@MxÓÑVì€ÖƒÑvĉĉŜt‰ôXψVôŒFUsŞŠJcÇċ÷µÏ†M êsˆVŞéÄóC‰­FŠġóV`¤ŬIĴC F²ú”fÍk’^71Jï>L Ï3`˜ !ŸgĜöŠÚóO çż cûUûü°üîÙ½ßííí}YTËW—Ż‹˘8+Šâ·v]·lÛĥu`Ô]Ó/ÚŒ67ĵ=Ê.í$…9XIy0̑×VÓ&k-Y™}CÂä[èiÔ%YşÏÙŝ0›ÚƒQÙ;NÓ)0RT‡kĜ[v‘ßÎĉg{ù|ŭg[鿇y@cŜt4Ŭ İKìŻEûùáĞ€ž'çÄqX9Xzjo´û£kŜt£é†jş!½ĥM—TFkÁ¨˙o׃Qúyх‹‡£n[òĤó`Í>í`ä½37Vߓ}ó+š\ŝ†Nó—ŻO>3&ûòübŝòj¸,Šâ˘(Š+Fµó“&¨ö€Ä+ÀhPz *;yAÙ;es˜f·NĈ9Œú›ĊşĠÏĈxĈ€½[{_ĦCWşjşÇ ËLUŬRUu´ìlÔPô c’ Ž0)uf¤LÂ}…În•%RO ÂFÉ:˘c6¨éx…šŽ…&0'=—q_ÛĊö€*Ċ:*{P*-ŬI ô10âDÚ= FÄbd•µCô 0Š dQڽݚŽ…´›G¤ŬLq蕅´;ר€A83¨&M!(s ‚(퀓4ր›!ċ (ĝ/ğ†´'b‚2J„ôu€6JĊ(Múb£ëĠtĴeċAĉ´IŜúÀÈÖh/?#\ü’êO–Ov‹Ÿ^œî~v°żûEŬ´żż8żxuu5?+Ërátžž@ԍŻ"^Hëv×UJÛАF,ZÖ-ç5$ŒR(Ĝ Ód˜Ÿ^yï§:ò2ĉÚıvÛe’§óÙ’aMX ÷€ÀmœÎFÀQÚÍÉÎ9‚•Q¨`¤šmîß½rĥϛċh„!NÉ ݘíÄ(•™3Úě.lËŻñĤC2gt“¤×ëĉŒxӑ˜ì••F’^µBœïC’ôŠAÏHĜm `@đÑÊrhDÀ€DÀ "$ÔµT˘”7Ŭ  ¤gœœw&£Ÿ\7†(Ÿ1²)ÙċÚ³ßP~ùKzÌß]½xÔ}}úĝè‹<Ÿ|uµ¨~ĵĵœżœÏ/Ê˘¸Şëşv şF(è6݆˜ĈeŜ7•{ġŜ‚¨#˙'"y³Ü­u‹ŝ†ˆHû>öanŝ‘™Ì@ÑşĜ÷vÈ}ì¸ĤcÊcŞşáw3#ÁSUF‚:ò/…%&C˘†mÖ°İEŒú&İĤ‹ö'QM§bkDß ĊÒ{Lv<ô†JÉ 2˘àĊÏ È•j]ğħJÚ-¨žp­:ĤÔµû5]p`ö9´ħš.šğÀHh:aĜ4î$ċBQ˘'(áϧ–mY½@†ÔhĴgDÁyĦFú’3żÎZï’6”à6Ĝà%qäwPӉ<#C€‰ĵlïCGf²ËdˆÚâ;tŻ˙…vżĉ§³³Ÿ~v2ŭüèwËßżı˜żş¸¸›Ĉ bñż€AġdjşÈSġŒ5Ŭ E‘ŠD6WÓ­é%˘€ċL“]B>£­`/>'>û:¨?ħï”ßxrüéÎÎì‹EY~qqQ,гŞ*/ĞŞ*ŞŞŞ\UÔ&n Ğè¸.ğaoH‚Ñ ·.jn>9f¤É1ġ‡˜c.³¤\×j–Ŝ|Aˆ§S[ß.9QMÏ>%2'Îï\Iqœż‹ôĵ"ˆ0ÒĜvž ˙Ĝ°ÀöĽµbŽ8˘Vf™k½DÀÀr1Î`ċY™ŬöDĴüĦcş ½€`Ä ’½1%íĉŒtÂPM‡¨†ì˜„j'8Bû|§q[5 JM@J1‰"ÄŠ^MÇ ñ 5'Ŝtħ#ÄĈˆw ^[ŽšñÈĴì ¨P%‹TLrFbTQÄÁ÷`$“^‘€QàӔY‚ée´.@Ĥ;„| Û\Pûĉ7”_ü =Â÷Ġ‹ûĊÓÇGŸ“}~~ġĊċĠ›şĉEQ\:áB#ÜĈŞĦŽVKĵ™ĈċÜ·ñ[+dĜ¨˘|7&ĊĈ„y~8şïażħäf<oÛŝĦ3 û§ ××Ċêxz ÜĞ" MJ%Ċµ*Ήڸjáí`Û71ĵqĞœu =#ùCÏĵ8q~žu˙×eA/:ŽĊı%•É´ù4àĜŜtižQZ!ĥ B”ĝ.Ĵ IDAT¸Ŝ*×nNì°>Ï!c1G¤ì€äŻPÓa´;I—†âÉ ÖIŻ"^Iğ…QĴŞŒTFŒÒv‹£f7ˆá­WsFƒr)’"›Cş‰a`$ìíV¨éħ|Ö@dDù„)Û!ßS÷ú_h6˙%=ĵyġâtçËG‡ûŸ,;ûí›×g/Żĉó³˘(.êş.˲,—Ë.´7¨†ş Ôs›VE×ġŒŜRIl´½gĵɟÄáA`ŠI Ĉ&Y¤ónÔv@×tŭVh…7ŠĉIü9ñĤĈzLÊò”e–ë(I£#ö/D€ éŻ 2Š%Ĥ%‘ĞĴÚT‰š.¤‚˜Ò=§m…8G6_…3ʁ?EëNTn„Œ(ŸĤ3bÛĦ½ü‚èìŸè ú°}ożĝîŭ'ûŸNgğ_UŭŭĊċüĠĠĠĠYQ—eUK%žX˙t7ì­SmÒ'˘ … oƒ²CÂBA~ŸŭĈà¤ŞKé›óNŜR d„âŸÁpĦñÌ÷¨²s­lé†ÑÏöDĉ$CzÈ_ jTA96ŻGêH'7lCû-uġŽŞSY‚Ñ‚ĤƒÄ$zꐃĈx•Ë2'áPbˆ7=/„ë.µudì­Ôt4;0@xÓÉèsŒÏyżˆPErŒx ûÂ@tĝÁC²Zò˜k7EI6%!w !Iz… nY"¸ŽGHÄçBÏ _=] 0RĉĴ›M2Ï(–ëƒàaÒk`ŝu˙C5‡G‡cIÔšÉ “]6Ó)ÙċíùÇdÎŝ‰Žğ/Š÷µ_>rôħ1ù—W‹×—Wó×óù\͉^Ñĝl2O´_tœ{•ê:€z;˘µ/NĠ½¸•ÉvüQ‰”ĴµĴJvċ¸5hôCğ5ÜÓÉÀ/ìĈ_gV†ŻrŠ<,œĝ`‰Ħċ°°Ż9ÖñlÛz ĵ›şŸEê¤Wà5Ŝt‰oYÀÊAÖŝ|ŝûì~uJ—n›mt~‰³œÌ’ƒo ]çM·^Mwo:áL—Ìd]ïMÇz.Lµ~i½7Ư̆ŽVzÓ —  ”:`Èĥê¨7Ŭțâşé…ŒTĉ-¤Ŭšir2Ó=ĈtF]ġŬĞ_äê×ô$˙áìŭS|vrüè“Îâë×gW?]^Í/‹â˘,‹EUU˘[Q ]ç´pŬ\Q H×Ñs7˘·Haññû?yZ”êċ!w%@ħÈ?MtÉöqôcĊ=›Ğ†ĊÔ9h}³ħ b4de¤”’tàb˘;PÈ,"îżwûVQÂ7QÓi0:hèĊCn|8l”ĝĉ]:M„k“.†AMÇÉĵ)m¨Ĥ£Ûİé˜Ò9£•j: Äq5t!ığšÎFÛRÓa›j:Òî˜ ÙŒ1; Ê ÚĊwÔ½úÚ]ü†žï-^½8Ùûä`oçÓ²nż;;?u5ŸŸ5u=/ËrîUt m˘¤ÛÄeaÓ°½­€ÑÛ$?!¤Ó+[Ŝ" Ta3’jL.Ğ beò8H)áċQĉ6F0Œ+sMVRwtÖ-şÛ‰Qµ£èsâ€û확ŜtĴd²gÄ4´§Ñ $Ş˘Ŝ·x8ŞePĜËŜû;ñĤ“Ż˘ŻġĤ£AψîĠëÁˆW€Qü}v@÷çM' qcŻġĤk“^YÒ$i7Ĥ#]•…§Ç)é`f˜g@wġñOG‡Ġ‡íûGġ·ÏO?›L²Ï/çĊï/.Ż^‹Ċ›²,ŻêŝĞrQĞ|èÖİé˜ÖĞé6݈6éŬèk;ƒħŝ~lĜĠ\҃CÉDòèèĴ—S– ¤ “T“Ŝ+"ù7^ŭ=#J2[ĵ1LÄġ>y,I’\M7FjgÌÚL–Ċ‚Ä }sÓ[ċŭ(ħ’;~Äk~żŜtkh:ZïMÖu`´Ĉ›Ž†•RşégŻ#Ú2Ċ¤½Ö›ŽRš.á×@´~“0êM7BÓù5ÒB–™ S>#ĉŬÙïˆ_ŭżt´ü´ŝ£ÇŬï|daı¸¸úájx=ï•tWˆ’$×UŬ˘…M… ·"_@R‹;NKR ÊwY­ĜÂkΙH·1¤-‡˜˘wR$9Ï=Ġ QÎׁŜ=$ĝ½mU˘ÒƒµSCÌ´ÑCC0˘TM7 F1 O¨>ŭ< èÊ[¤#Ż•Ĉ‘ĠÀżÂ›Ž6Lz}+=#­Ĥ„ĤƒôDZFctéHψ6èц=£›ÑꞑLz•Ŝt,ú¨·öĤSAIŻ-¸tg„|ÖGF´WXž}DÙÙ?Ò 5˙à”>}vrĝqkéË7g—Żçóù›ĊbqQĊÜġ‹|€^ğĤêhu²ëu`DkޤħŜˆĥ H½ f²6ކ„!@ùŝñ;"é{ÉA€ç͈v•>7H&óĵƒöq.y•lĴKŬà‡I!DqÊ9m¤;ż^t‡­<wÌ}¤6Žı2•%O4`+&8&ħRê Í\ĈS˙Ël:K´ı CL"K)oÜS…½Q*QӑĤÓĦ1È/Ş’£7—Jiw F†ŻÒâG:; ۆ¨Ù†ĝ"i$ÀÈËI²˘ •…,u•ˆ·Œá TÈĊeİĵ“$Ònmµ˜·R†‰šr †ŠŽŠ \’ûDÀJğ9ĤHĜ†É0ï2&Sêš7è^˙‚Ĥż Óìû³N'Ÿ>:ü¨jÚo^Ÿ]ŝ4Ÿ/ŝ?öŜ´I’ìş;÷ı{x,Y{UŻUX‚XH$ „ÈĦHŽqĈĈ$.&ڈFÉD(Ñ$™FBÒ|‘ÉLš Ó™4&j$3}˜ÑPƒ ŬĠ;şğŞĞkÉ=V÷÷îĠÏŭ>ÈÈêêFw£Ó,ğ+#3#=Üßy÷ÜsÏ9žNgÇóùlê+£ÂÏm˘ĉ֙n+\ÀŞ˘·LÓ=Z@ÚÒ"­x·8­ŒĠÀşßZ$So)ÈII1@ïÄ1£=V=,( -í&Ä 55ı=!Û<€œîÉ#=ß" éˆtU£÷’Ú(•: $qz+µ˘¨µ•("oÁËNV7]!˜Ż–5‡…|½šŽ:ÔtÑ[^{ߪŒ¨c΄n‡ó&ï=zUç:Ì˘>>X.—³ÙlVgu şn3c´)ŻHcsTÄ[,ĵs’ÄÌÑ /òóUbjÔhUĦ’—×ÇûŽş5è81‘ˆŜŠ]µ„RGQğGĝşëéÊ=_˜ÖŻ7Zñ:ĠthÑC˘z ‚ĝ÷CAT)4¨ .|+%ñ.ëĴ4ŬğOM·NÀ€Íê0èMS-`xİéĵŭĊ[TÓĦ#”°QĜIAَ I¨œĵŜû:vÏ;ÓÛ×.{!ϲOfoíM§Ó ^(ËrÓ|ÑiJş³DDlë°ĥm 5íRĴĊ0oÏô'4j˘häHVû7„&;éí!‰ÏċRŬ*‘ݵ‘Á(¤MŠ^<¤£bT•Ò#żÔB_N ÖğzÙ(`@+´OZ ùZÌ e[ ׸p<Ìħ‰żµ%ò8ÇO56ô[1J}—Ğé˘ ^—Qjû}ÙŒÚóPan‚H(Í@Ùb ı“—Á÷ż†ŬâĤ}ê|ùê—vžJ^;<:~óèĝäÁl6ŬÖ´*#ğeUä:zA›|éÖUDë*#ywRXX/juŭ ZÈ%÷ 䢆HpĦWÀz‹LaĊPìüH: û;uu{*î\ıĉGܵòqHBwĴYxíÉAn{g‘44I¤8 ĞDİ€fħ"ĴHĥéŒx¤uá¸%ġŒ˘XíMş]`Tà"`ˆÂZŜt]jşÚµĉ¤ĥWÓE™ƒžÔ êFFİ!{ıygÔü9 N%Ŝ5V85?ĦÀ(T ˆÀ(êËÔÎ͝˙ˆ ^_ÂÜ뵯îE`„:ħAġŒ”ÍQmî'´Ż\t'QäeĤiíŻQT#µLñ"ü `D§¨é”‚M_Ż‚‘Œ´Q*îMòˆ6ġŒšŜRT‘^üÛibÇĵòŞÔSÔtXFjE—8ö}5é5#áx“ÑŽ|hE‚(ŸGjÔ§UeÔRÓİİJZ€šq[)ĵÍ|’ ġ†Y’;ĝ̃˙—Úŝġ+ŭ—.žŬœ/ÊW÷îìÍfÓċrı•Qİ€§ ˆĥġk˙g1àGLé[XWw‘ĉğgD…•Ûc-ÄM Qĝê<—:ŭ–ZcûïqI 2pĴúuŠĥWŝAuĵCË}úWäÑ´(ĥGƒúÜbµÒ1E$ŜyÖTO“—Ô¸4HŝXĊßsM<;5N¨nG’VÏáĴ×ıèëCuZ•QœE´FÀ ]•Q‡šN”šN”´{]Òkˆí‘à†}ƒ4zgҙ Mo¨‘µIC´Ú3j”Ğ=#]Eé^UCÌŞYĦşgÔgAžÙ­Ĥ ôi £â:¸ĦSƒGm5]0È×vĉ´*`hËzğJDdzBéìdŝéŝżÁsûàú•Ásğğğ/žÌĉŻ=˜N'óùì$˜£zŠkĜ•Ïıg„w;½5@jÏĠ I²“f°^š&³ğPb57E›èî† Ġuŭĥ#iŬ´—j°áùk{˙6­TġȞ—îZŝ~Ş|^w ‡ëEE FÍû£2š!f%×m˜Vjĉ4[Íç3\†`Ğ#4ê×O"+jşĥ€6¨éhK5]Mœ‰(0Ò§2VÓT4ĠtM+FAÀĴËBU•tÚ`„ áz„Ġ Ĵ4mVÓ)zrĠ›NZĜŞŠ€ÖŞé¨Y÷`ŒPšƒ²ĜÎÈ|Ùá×q5ycïĈĠü™ŬñÎsG“雇‡Gw§Óéŝt:=žÏçÓ²,—Î9ğFÀ°NĉŬEÓmR–äú(ÒGıH G½˜Z*­¸·wO‘$Ğü~P"§2€ÑŝÜ,ï´c­” ˆÊ ŬÇĞğOuD:Ì)<+‰–pÈ#>Ċ•ÊNĵĝ’´*-%` XuUvÍî\˘%™Dû#i*ëaœÈÖ]›I=èÜHˆHOŞĈħqN-”ë0 o…RÓÉ)ŜtJb hġŒÂ7•²/ŞDéTÖ 5uPĠ^…q!ŜHÄŜtm†6Éi·ĴĦé¤ċMGġ1@O†Ç4]¸²g†X£@Qb;Ŝê9Ħ9ğ¤ê)"PÚe}°›=ĝ[ôżĞٝ7äßï Ÿ;žÌnL§Ó=F3ݤk{ҝH§…émĞ˘û‘İéŜ^@’&IÚ³G\_fò.’6H3FċšŠè4i÷Y\şq†êè= HÒZWİċŒĴëĦÁ;é´ÓġÁÌÄ"Ĉ96, ċ²J³%Ä9Dħ“ĦOÔTñ$ì7„T§hW‡nH”şŭ,Öíí3ʈaPï!ÖBl)—’!L SEDTéĥEûv ‰Sznŝ–˘ìrŒ‘ĊD!P³\bUÚí­…˘Ê(šGQ ˘4JŠ^IġßB~U …âı7ġj ٔšNZ`D¨KjMZuVFĞ)šbŠÁHĥÎnhf‘ÚżÔwršPġ·ÖĜ5ôŻt€‘´ÀH”Q*⊌dšNZj:iİé$’6%`C¨ĉúŬlŽŠ‰ĴöŒŽÇ˘´/”ô=}ùñ·äħüŝí§ŻîÜ ò›‡ÇÓ7öŽîŸœLög³éIQµ+£Ó”t§£âPzRğû@ö˙^à#8úPq$"’:ç2v.SóÊäÍ}™ÀÒ8£meħżH™@`‘·YYçı Ş>ÑÈTawDµ êİŜ°v† "ßâ6‘ìÑhŻÒÀÊùüPvJZŒvƒJÛPĞ9£š R=#QĉĞŠĤ£Ĉ˙VYµ‹j—ĝŜtĜ÷= .EŝX†Z=£.uTF„Ĝ:ĵéÇl҇Wsd]•QèÁ{ŸSQâMW+(¸ÂK³<£Eӝ’ôZż\FҒv£CMÑNġj赎Çjş:ñĵV³O$íMêòT²ĈġWÍmżbƒfŬB3@b@i.”àÊrûßC~üm\Ë÷ï]ż:™çƒ—ŽNîíO§ÓĊb>-ŠbQ–uÎm“_ÔU m.l3Ú!z˙PvjÇqj~F[Zĥù0²D-: DÄġœ‚1cµpCĠĉ5R+°¤:áĵ¸Ĵ{Ò¤ĴV۟ëùÌ˘Ż†™ÓtÀĝU8ĜvWŭ“*$„gT •ÑŒeğf{Ä*HÑû6ҍ`Ĝ4 ˘MÓ)TS4ŞĦˆ˘:î$ĥZzXó  eŝĞz_Ñ é5tbšNwÍĵYê%ĵİšŜFhQ[À JŞjY_W‰jo0HÏè é´5…~„ZíÀ êÉ5|”óD-lÛ_P$áԒ{QcQ ŒHİéüğÇH$ $}°;ĝ.zÇßµŜ½ğׯ ŝvïŬÜŻÀè^0,‹yQ…/Ĝm=~Ú ëĤê¨Ğ"zUHD+ĴFğm ˘,úém;¤À'ElßÊŝëÎ>Ž2V֊áJAù…½çİ}ˆ Bâ#żħm‘|Î H]żÓÙó·ˆmÒùêJM‰);AŞŝ˜Çl1Ĥ*ŭˆ Ü,o§ù-Q-àŞċŜğ˘p§>áQó[›â49>ĠbR•’Ê=ĦvÓ QÈ5ô ÄâHyQ<$ÛÙ3˘ŽžuÒtˆĵéZc4µÍmè…ÊH5í× ÂJĞfİjIZ¤XÚRM×0Ą÷Ş7TeDMñy÷+Ònj%½âžQÀâF*ßÂİZO£mB"ĊlŬğTÓÒ(íAܔìŝ÷Ñ;ú&ëŬğwŭj˙û~ïĉáñôöááñÁt: jşıÊ1êxŬVM÷°’ny7ƒ#­ôb)hòz¨áĜiEDhŞ ÓZ>İ£˙rúko †8ĴûŞċŬġ˜lĜµq<ŝ_ÏĦÖê8³ĉ‚à5˘†ö§ñÏGuûŸÔSIP{1ŻÉSo)P_ĠcĠ‹aÛ88PJ’Îé{t×­Š i”˜3ŠŞ  (N 6ıq˘œ/8˘ħWQ=1 NĊŬúŒ"T¸Rë9`ĴWI‰X· ŒZ4ŬİçK§ ¨EÓEŜtĦµFÀ ,˜:h:íÀ RİUµĠtXFÀŞ5t\$` vÒĞ>5 ]_ DI݁ák;0Ô`˰jí’I*£Ô4ŻŸAvĝM\ËŜĵj˙ûAïÙJÀ0›M§ÓéQHxġ`d׈µ€á= Fyh†iñ& ‰½v4­;ÙÔzƒè´Ċ²2)ġĠNż.Tw9ı~íÂ\C;~LJxúJi ÷ĤR™ZǧéĊĉ³–rJWßS,5ħSS_˘, zeJ7ÑĜë8qħ—†áu+²âqg:ĠĊ)h—–šN7ż+ʉTURïäVt§lsUÄŻM;5°ïçÄnׄnCÓ~5(*5­|m”ÚT"ë‡^ğ kĠt´b£òjşĉú‰ ¤ĵét¸^¤˘&ġ:I;!v˙ö•)ƒ(MİJÓ3j"ï%£PĠóE-ğú)šŠ­­Ĥ‹ö~q#"“i‘‚Üá³HĞéׯä? ò›‡'³ÛûG÷O&'ËĊbŞh:‹ġ6@gĠ{0zO|<²ÄĜúš6€Ñ‰ġIZ§hĞB†Ôk\7Çsšz­ŭrƒ ê·8[ɽ}è^EĊ5ĵµpġ'Jƒ@,J*.`baƒ¸:2-P4\ƒW HĦÚŞ„fR“:‡*#žë€ˆD˘5ċ.SGê}hzg‘ñŞçfvLÎq< uĥnWóžµ]ñZa͗—v£KÚ-Í._­˜]ĦhMËüaĵd=LâSċ%¨çք"i½î~œYÚ-µ!â +4ŝ[§äQG˘k‹^SĊ™Ġth;jœIÚ­ûΛ¤Ŭè–v7Y6@ۗħ=gԑôëQÖJğ†-²Œ@JRPÖàÈ=³÷u\Ĥ[÷Ż_ÜÜ ž;<™ŜöjşyħT•QWŽÑ6`´IQ·mżH~ĵ‰:v•ˆ•9ÑÂĵ_Cè é7nŻ,Ş6ê~1³öğ_ç3o¸Ú‡şž½Ÿ ĤêK²ÓF–F¤êac²,ËzI’ç‰'ñĥ fföĦ°˘y$ $ ˘CÔDE ÈxWo‘È:P¨ŜĠ´‹‹DTĵĝEWyLë\êœË*eâmX4ĞXĝMЇSA-WEÓ0j `âĝ†&~ÂDŒ èže³‡‘ŭ˘İçTo &Ó§HZ`DM¸‚ÊŬ@íM›O ŞUĊ i ·D4EŠò‰ê@¤SĠtтß!ín ”X_I8â¸se3İédMÒĞ4;Ë S†ĥŞœ\0Äj:ihpÒ“÷İš3% lG„Ş<#Úû&.ÒíëWû/îìŒ^::™Ŝ=8<9˜ÍfÇËċ˘vìVñü…‡0à½BHĞMżŻş3Äβ⽠˘vş][Œà°à:ħ€´è/bì—h IDATĠ“İù{ïEĈgëÊ£%"°­˜.v~c 5„ÒK¤D6D&OÒt”÷û]í÷û="*°Wġy Tqâ)üß9'Î9ffqÎÁZ ÑH„Ċx™zġú­Ğ*3灉ıVx‘§›;]ëŽDíÄİi"Tµ™Rï62H2bOIĤ"Ò†ùĥ˙¨^gE9FNQ¸žžž­Ԃ¨Œ.I5ŻÛ}ie’Ç­ştŞ—Ó7ZĴŒ‚`ĉ1ĈÖçŞ&ëÛ Î’ó€ä˜Ù:çĜ9'ÖZ.ËÒ13czY–öA” 3‰8?ëÀÎWvL¤úxž˙×;mVqßĞ9h}ƒŠšÛ A*!CÒHċëCÒşqÖÜMP™7&­´(5¸nħ´ ¤ÔtˆĠtkâšUĴħfôj“Ĉ×|ŬÍZۑ¸ĦÁ.Ş-ă£wŭZ’6Ĥ[é2JmÓt@ÛĞyFèvĴh˘wİĤ:iw•ĦÉ­2c5Š˘!ÑaDĴ + F-š‘jE|MGhE’Ä4›D Áj÷”Ğħ ŞQ<ħŬ`$!“ |Ma'ŻB| Üˋë—Âsgf‹ċЇGÇ{³ÙôAKÚ]vr§ ÀncŠ-úFï鏇˘ìü°f4H†Şë*4C¨(ĠÔf²Ö̜z°hvuy3aB­Ŭ‹!ġïdèT鄘™Ä9ˆ]‚l¤´bœħ\ –àXˆ- ;"81i‚dz€Ŝb‚œ¤—ĤÙyc’'ÈYf FBD,"”€ËÌÖS霳œĴµáßI–ĤÌ`DĈôĜZg[À° }/Qœ9ydžĈ<@˜¨"ò]t˜Ħe„\P á|ĦßAµV‰XĤ`ġSÈajÛ)7ĉ°&‡ e´›šÊh7‹Œ/³ZLeXİĝEjG·w›¤˜F–@ûIċ§dÛ Ù¤¨ĦVqİIfŠÄkŬ•Ñİ=£È}Ġ(µÉ4mhşĈá¨Ġ`kĈu˘ iB’‘C7¤VÓu("žQĝğ´!AqıŠkÄ:ŝ ínÔt²Ò3ZëMWŭ’²xlÀ(IĴJRĜÙmâ½oàĵ}ayżxùüÙù²xuïàĝŜt2=œÍfŒ–ʈÏFÛëĥIĵ ‡]ߙ5—H˜ŬáÛ—Úŭ ;°u†›PŻ·;ĈzÒĥîɨ˙·%àŒŒˆ$ŝӔŠ …-IĉSP‘À̧ ĊIYʆK˜°Û’ —0â@*|ÒĊb§fÉ`gpáñ OèƒJ"S‚DÎ_{"O‡ìxïŜ˘8>Z6YİdOîŬ™Ìöfŝâ-s3/™ıÀ´tΕÌ,z‰ùŒdWlѓé1Œe˜râÄS‹ú!×C†Ċóú§Œ¸ĉǛù°A´*a}£´WñTDfNâ`,ż³g‰ŞzĞzgêɑڣe”*Šr˘HÉĤ6*Œ uŽ·ö}h2ĴÖSѝô°Hl=¤µÛ…ZMiKi7µ*£:ñNş+# •ä†ÊÈë)£Ŝ[ó¸˘éú‹ë¸T‰~§Î9j{Óİ Na FTëZ­ ½ĥżˆÏ[cQ[<ÔÔX1J]ïMG¤[ aÊÓt0 !ͅÒìü.ıßÀnqÓ>}Á½rġ™˘´ŻìœÜ;>>ٟÏç'Ŝ›néœ+OQÑmêÉŠ:àôT×÷t”žŸ;E0 Š"‘0ƒÔx“ùú˜Ĝ9°-*Ëj}ğnĈfÒÓŞ#j‘iWFD”dY–&IÒKR“'½Ŝ€ŒéğĊ<•“‚O`3Pı*0¤¤,`\Ëw1ŜâÜî—Ż]`÷Ĉğğ8í180v—ŽħĤï`̜à )!U;ñ„9\1w“£ŭb˙`ıœNÊ7^ŸÎöOŽŜ¸u´˙ê‹{(9€ıgÏĦ˜÷qòİ["_.d`NÀ•Ĥ‚˜ ‰0”êWˆĤÉ cüĦZ Ç€B÷‚i}QÔıÛċÔ9›ŠS;ízġb˜=‰‡^Q.Äòâ5]K|ĤmtBGBİŝ•ĦŞŻûÖ^gÁŞİ[Ĝċ¤TW猤#B"–v{…d9¤˜i›ƒê ݧBi )éGÓKÒĈĴ¤T˜›-i\ğE˘ñ&3^ZnòµW^„ +`$ ˎäéh²Ç}IÓ1Ï&=9¸‡dn‘ŸL3ÊĜâİÇŻâ‰'oà‰ë7pċéë(M†IÉXXA!‚){czw‰™ż“Œ_ ”0ˆ¨jÀ˜Ì WÓiHùÁêċA?!œûĜÏ_yÌó|”çù…kƒA˙ZšàZÚë]”ÙIŽû·Ôı‹ĝÈÏŝ${ú.=yS–ŒĊËG‚Â-ÁÂ0 ôˆ`HI0"`‡IĜ @‰§# Ġ@6€ÀÁYs‚’s% XJ8dz½'†>ñÔĈg|á‰AqxOĵò<^{ċ5ȃ;d)G!=XÓGiú°&‡Kr8êÁ™b2ˆ?-ì}ìŞVĞĉ £9İÍç*’ôĤ!êÄ´Ŝ—^YّİfŒ#WqQ#=6é´*}S/dŜ?5j<ĞÙÚ<5A9`#˘XqNk먞_ĵÂëĦ^ĦJċñvĉŒñ+š|BYı›š˜ö‚İ“^£éš'ŞQg€Ħcž¨Uu^èˆÊn0Zé"0‚艏IŻ‘PV ­Ü›6g#-rĦʟ·†%{ôz'ßĊĠ|ïŜ{Ï&†^<88~s:>˜N§‡³Ùlş\.CÒkpaĜFM·M°oè½ŻA)ŬP­ډşÙ¨TŠ5ßK*Kpé<%ëİ½:9°T·1j×:Ċ“Ĵ‘†Ż€‘1&ñ Ôë÷û£Á`°Óï÷ÏġûŭóY–]Îóü‰^ż˙T’g]ûÈǞú䗿²{s_Dş{ ‡ğ ‡ç÷—˜‚„9İ!ä¤0HS˙‡¨˘ŬˆĞ›Ĉ˜†’ŞZ5IċÜ6ĠĴ\~L%6sÌà¤:—*ÇE† ‚ƒ ´{-'”7cÚŭ‰/â§?ġ‹ĝl9ŭnâġ^ÄíŜĤċ(Ì6 Lú°Ĥgz`Êà(…1IU=b+ 2~8d@ıúv0ĊŞĠ•ë¨ä+$G~ŝŞ˘ĉR`W´³5Ä€U+`Ôd E•‘£¨˘iÉ^HeÛµŻ9U-y?Uµ:×Òu‰U4ISÓDjşv!qì8µ”`‚V0¤•( ċj´†^pÑŞèD´j-#t€Q£ˆP`żžĤ⓸Òèż‹iċAZİŒD"ğÉîÊhUMwJeTĞ@&e}ˆrG/!9ü6.%wŸĵ˜<ÛïÏïOß8™LL§ÓƒÙl6Y.— kmİÌRÏ"`ĜTñ@ôž/l H² }À¨öÊôï6—\,`œçZŞE‰HlÈSH~E7Fˆ+ÓŞÖMó.E] FI’¤yžgyžgápÔï÷Çŭ~˙\žçó<żÒëġdYöĜı+Wo|ĉĞżġñĉç/ô]Ïï/-žŸ3ÜYÀÈI1pŜ™jҕŞÏš 󖢆ĝWwŜx€Ímԋ=$ ٞ•5§˜\e›ĉŒAé*šp  °‚e‰['‚q/ĊàC?ƒŸúĝç·À½çŸĊ ßŝ6ܣ Q$”ĤOé‹19Ù$À”€)ñe€İ¤v&!è‹żgĵ]Zït§AXÂ>Ê É•ş¤\T”63*¨ù|èÁËÚ°şY^H•ċj'„¨62µŞkï_ƒĦ!Ħcà&R€6sĤš¸ ÍĜDÚ-NÚiħͲLÖ)œïCµJŠ\A#V‡ÊÛ°ËÀÚË^İEJ#„¨uM]£Ï ”†.t´ _t(jÂl’ÖÌ+@n¤ˆ:ĈXY#EZÀ Ëˆişú5ĥ†^İ;ÁHT¸„_£ ËA‰ĵ Ú˙.ÈĞÓ§.àĉî(ży2]Ŝ:::ŜŸÍf³ÙlşX,–eY–XuíŜ&Nb“’ŽÏ/úħ¨h ­zÑè>µäÊ%ÀYuŭO9“ĦV0™­Şwż eOCXµÜérg ”eY6 ²áp8‡;áÜ`0¸œeÙĠ<ÏKÓôħ§>ŝ‰ŭÜoŝŬ?ŝÙÏ_8°Ĉĵ2·8Ü_âxá7@NU”!KD€Ä‘ñ]{×ŝ•ÖÂŬĝ ajTPĠäĤ 21à¤úë6,”,( Ħ°‚eJ˜/öˆqç¤Àn?E˙Ĉ§ñ™O|ċíWÊ·‰Û?ĵ"ŬÁ ¨L†RşÙ$‡39@)„R"Cz÷¤ÙÁĥ¨ġ­‚ñÀ䍖|Ë/ ÖBÄÒ`݇ĉµw#^Vùjâ„ôĥ½ eZ-à3áÏÇ. ÔHÙıUù‰jC¨ġ“B•g İÉëc2M¨k#‹ 5¸KW*ŝ²%Ŭ‹.yÑeóŸ­İŽ—ˆŬżáM닲} ŻŞ mDÍ15#EŞ;?r7ŠŒÈќ☓&WŻòTç)ÏRiçL‰>èy%`h¸Ğ£ÑĊ€*EI2¸ù›${ßĈnùÒòİKüÂŬá³³yykïàxo6›Í*K ı0Ĝ°YGÙmKÓŭĜˆÎR!mRğéj†D„œµäĴU:)݆¸oñÎ&ş"·ìÚäĈJI’˜<Ï{£Ñ(ßÙÙ ƒóƒÁàRžçW{½Ŝ½^ïɧ~êSŸĝÒßûw?qá?}ŝŝÒáû'ŻM †p!r2È È !ġ‘İĠˆYµ Y“gÑfQdƒxPd%ŭ<ìß3CHŭyµ(°)ĦpŒAf°„`^fs‡=ì/ğçŸĈ‡û~Ş8Ĉ­o} /=ó"fË)-ÓŞœ\Ġk"F˘ #µ*]…Ìù­*wPtÔ!˙Ž˙dŒ§r}/ŭ"DŜڟmU™5MqŬiN=i7iġFĦÈKÈ \dŠkèŻê %­Á‘•'#ŬU=šı†`¤íi•9@óž*­§’ ñĝžŽżŠz@uƒGs`&¸„ò­v´RE ùÍ×H4éÛHĠ1µÒië3§Š³Ž³ ²óh$D5’rEÌĠÇIfÏ(„Iİ^ĦĤälŽŻ(•ÁKô†Ħ5žTϚ€ (í 9\q@nïo0Z>gŸ:_rġÂèĉ˘´·öOœœœ.‹ÉbħX¨Á׳öŠ>£-İŬè§ÈIğR ³qÎUÒ“p­@2¤I“êĥ'2UÊ·ĞVşXċDíħ ’$1Y–™~żßÛÙÙŒF£ñp8–L&” ÀnFv˙ûèϞĊâÍkÇ/ÖŬ>8œìO§Ó£ċru÷¤ä5ôÜYÜۂŜŻ=£mE ë@ Ì kmâ`@IĠ0¨HÚeçbš°ħ¤ßŒ€ÒB Ä ;'0Nş›xÔñJ’„ò4,\\™Wf™ëXâ ¨n€]‚§ç9y òŸäĊ`a·zÒ]½l+ŝv^ûıכPKğ͍ÔP%C‡À!é%H,#%AĈ‚lîpŻtȌÁñcxúwŝ—÷Wxù[_Ô ½\6÷wàfGIY”…™Yv çœ~şà˜½-3;'ì̘—ÙòäpnŽĉŻĦÜ߃0Uġ‚IÒFV­Ô_Gĝı3b4£Ŭ¸Ħ‹TĜ52“fp‡w “}SÚráX&Ìĵ`ĉh‘ñìÖ:.‡ĵœœLŜ8Ïwa÷oËÊ$ ŞEyĊ„_x˙EW4ĈW-ŝƒ(ÀA#ğWÒnĊZĠ#:d¤UİiV-jÀPĠH¸àÉ4İşFIÄWpPĈ¸]׺_Rïƒ6‡óry0CœĞ@Êôa’dRĠ(0:mC‚cĞgÔVÓE*CFġ4´ğŞÜ/J3P’ÁÍïA‹óüêü‰Kòâx˜=w<]Ü>:™ìM§Óù|EŜŭv{ÓŭĜ¨éĥ¤u ŽAċÄMáĤuΕBX4™:ı?}óîŭ£×n?1ŭĊ“CW¤y%ĥġ—LÂN\Zž"Ÿ?p"÷\š—Ó“…,“.…1†ò;I‡Ùw ĵzR‚E0`˜rzD™J=gĊÛtV!›ÀH6ĠĤH‘5½¤U•Ò&0j›6ibŞq –ÊŠËR+0‰ µŒ£BP‚ħ;H°óÉ/áSO ?üßŝn?/İY a.lÊÓ#Ĝâ¸dÌJëJH„:8‘™³”óÒñÑÉáôŝŜüıŭÉŝkĉœ€’X… Nğ;9~Ĵn7E‚“çHÄÓr‘˜ĊáHı_Çı¤z×ꜳEY,SâɤƒÛŻßŜ?žp#ı÷dna)íUÒPj‘İ"‘í‚(pj­‹­•Öl–¨9ÈcpFŞxSÔ)FhSÇÔë¸.„{Zñ;T£^`ĜŒ`ħŸ7}ĉüq¸ÁÄĦ:é‰Ú6MázŬŜtħš-·Ġ’˘´Óˆ+Éí£ĊsüĜıâĠËçÏ- uptĵ7›Íg³ÙdħX,Ĵµ!Jbĝ¸-(şuUÒiĴŬÇĤÁXñ@”İ 眳֖ĥ×_i>á½{·Šïŭ[trt<ĵk˜’´ŞV°ˆX'lcžeÙ+&K^™Ywĵ(ŠEħ,JçÂvĴ/c¨×ë%á0;wîÜh<_ÚÙÙyĴßïßÈóü#_ù˙×?úĞżŭԝ‚é;÷˜[† 0˘ì'ôLH y0Rtédiğİ6YW¨È*;Ú2ÚFZ‘Óy\™uc$ŒÊ‘Ħg!-ŽD`Ep2w˜[Á•ËxâßùÏqùŻ˙ÒŜùW˙ûdXΝ[Ĉŭ„ĝîÜqħ,³ÖşŽ ie@Ï9ÇEY.—Yož.ûċ›Ï=—ó½ññŬkéò°ŸÊÈ$)Ġ[o6¨UĊ n´Ö&FĞŜÍ9Jc"Ċ:vK'´¤$}&òò´°“ù²\”eYz.²ÎĞrΕvı˜Ï#cĤ'èÖ׿ğ³8ZäÓ[ŭ”8´ç‰mĦY䁣/R'‰V¤£ \VpF Ñê{ŻGWÑZ~ëMKĴìë³m?ÖlY›ÁžÈ¨Ù< ‘“:˘$7E^ĤGùċÑIruè ŒÜ*ΞôÚF‚xBHP–‹p wĝzÓgpm8ıŭĜĊŝsŽñÚŝQ5ĝ:ŸÍŽ;*#Ŝˆĥ™5ÚÔŻ˙ħ£ĥʽeëĦɽQÒÂeYş… ʌ1ÜyġÎèŝ­oíB~hŒÙ1½dd ú˙N8)œı#LÊiyw6Î–EQ”eáœsÚ¨ĈÓëġ’ŬŬŬŜîîîx<_FOöûŭí^şüÉßû‹òkɓ=÷ÜÄ⅓˘²àħ‚!€QZ5÷{‰AÏÓs)I%Ž’Ó kˆ:é^yëĦ.i "E+ jo6¨ÉüĜ­–Ú Қı§.ARG/ òÄx› ÀA‣ıÜ0lépğ`ìöSd?˙{Ùġ~fg˙Ÿ˙Gó{·ï•eùĈbi§3Ħ„ħ2ZşŽÓçEQÎ{½…™ĉöÙݤĉĜ.š~26IÒ7D½jôJŒŸ!­Cˆĉİg0;ݤn7Ġ_S“%KbcÍpĦħsΕeIóĊba’ÄÀ–Li2Oƒ{Ĥ?˜Äô Ġ€‹§XXˆœ!³d.çv˜Oç‹Ùlıœ/ĉó²( І.#3ûñxg<_FO‡_ğñáÏŭî_ü׿´_|û`‰ğsbÀ9ÁÈT•QŸBU$H‰ĵiEKY·ÀMV+"e·RÓ­\iÑj!­Ëlŭ•ġ£Wf5É˙8ŻVcšoŝ†MŞ·“’* Ì 0–0q/JFŜOpñʇ³ŝï˙“ëôŝOċâïí3ó°Ì²<Ϗ–Ëe/MÓÔ9W:çÚĞ\ŬœµÖşċrY&I:ĵœĤŸŸôú;b̐Ë™(­gijC<—éÓ}7,ŠRgÚÔD;*İB‘RD–ììĵ,Šù|ħœÏĉ‹ıZtl ÊĊrI”¤gÙd1 P>‚%ጉJö†µ˘€Â÷ uïġï˘ꨚ6#]k M‚ks‹‘ˆh‡n"c²$I ™ smÔÏÒüâlû8žÎÀìŭ€kwˆ j h­šÎàKó& ;v$ıï½I8üÎÑíâ‰óôÒhpr2½s2™îÍf³£ù|>ëPԝĥ·iĈhÛL£+5ŬĥR WUъ‘)3ğ²,ħ˜ÏĞ5ÚĉĥìeĊÌÉ,Yİ1IJDi5H>Ž›°8k­]–EıX, ïኢ`Oٙ@ÓíîîöwwwÇğğğ—G£ÑSƒÁà'>ú³_ĝâoŝÙñóGȒo>Xâpaʒ1N #ïĥ3@Ï{ÍûEgŬ–V…Ò ê„Ô£"ĴĝqĊL+ş=ÂZ‰ĊŽûïµ5çcR+5E?·^ƒ#ŞÉ›BSE³§Ġ,„ANpÀ€q‚ĊÒáž0.ġÇĈŝΟ˙Äà_˙ϙ|û˙)Ed (Ò "rËċRĴµÜE9TŠ[Îĉ3qÎrÙˊeéÙÂNL’ddLĉ )żp6jK_ĤŸ‘4k[jKßĉߖVì9>ö[ ˎ­sĥ´Ö–EQˢXEa=İ{H✓ċr Ĝ–YY–érV¸Yš=cLJD ÈO T3AáµúŞíû·BŞvß{kıio…H ñ~)b›Wԙ1IÒëġzƒAž<ê›ñçó^jz”4ceĠµ(0B Œ°QM'ÒLë—n”ĉ@šƒ‹crßÇNñbùą╋ŝóËĊòÖñÉôÁd2=œÏçÓċrı(˲TäÛĵn²Ú&`~ÜÁ()Š.ƒŠ@ìghP%k­k­, —eY™Ĥ霈ÈTòşÄSÛM9Wµ ˜Yœsl­uEQpĝZD(€Ñx<îîîŽvwwŻŽF£ëá£˙Ċ/˙ÒWŝä}ĉÒ˜o.°,*Pë;ÀƒQBÈ*Âş’C+¨˘¤³íÓx~Jóo"ĴŬt$éj‹£ÉöĠe´ŝ.SÓ6‘FœD-˘e%½>žĈÉ:hÚż‹Ĥ÷#8‹QŠ´ò”%°dÈÒ’à+q>OÈ~ù>´{îrßüË˙%ß2gŒİoU!Dħ(şzzŻúXB!îs •mQ,ġıȲĴ7 Fp=ê42/ H*•a›G@‰ôâHàĈ£@ôQT=ëp@“Ò>D ²G7‘O Nn]=żs“™_=8š<˜L&JÄPúŞùaúF›Ş¤M`„À(¤Ü+†ZŸá1ÀXka­ċċréˆÈR€]-,êk_% İPg]=02;;;ƒŬŬŬáx<:n ƒŸĝé_˙­/áŝô“· Ĥïì/ħ,ÌUÏh7% äFƒ Ġ0_ÒĦ#…šxħ€Äó˜ġ`Ÿx#05­\RÒAmĞĦ`'ÚlöVVŬş2RÛM˘:mĵŜ-šħßTPqĊg HLµÍLċí3@2ÁÁ° “{N0Î Ü'ħñĊ§Jù?ôŒ1dŒ‘$IBˆ[.—R–e;ŠB‚bÒW½aÑ2ŝşX‰˜‘¤~éµ½Bóuu×…QïH•µ•›zX“Jì7Pìœsä?ÚŻY-Ämԟmgz´6xïĊJİ}ho×yHò<ωŭ }çò³\é¨Û!XëÚ½QM'*nµ];(Éñäu$'?ÀċŜŜŜ“³ÒÄüÁŝÑŭÉdÀh^–eÑê­“x·çÖUEòVżH:Ĝċ.pŞ"ż mߌ½íĜ)šÎ ƒ|<ïìîî^ÙÙÙyz0|ôÓżŝw~ċ ĝ§Ÿ|}Q[³ °cŞFWžT•Qê'á ­ĥj4M'*V°Ħċd…Ĥ‹’ޞ$ĤîÖÑtQ?‰ċùˆjk5Q*"_=żg¨?4Ğ·ĉOĵ­%77mˆÉ0BÈp*&0 .È30È Ùӟ<—ŝ½˙ò×F˙üŸ&Ĉc‚í™0À”ÖIXÙW ΃Ž AkĦOô&Ŭï]ş‘MŸĵfgşİÁĴŻ×j­ lÚ DkïGĞ0ĝрÖ£YsœsÎ0sÉÌeeÑ@\}FU½ÚCR¨ŒşŒRİĤ£ĉ7ÂċOóÒnı9~çñĈì‰ ĉ•aż÷òÁÉìîñÉt˜/‹YQQ6î!éıÇNğÖ>£ ˘iUFm^ÓtœLA°[ß&•ÖԎ 4MÍ`0Èwwwwvww/F£'ƒÁG>ñ+_ŭċ_ĝ£˙SŻy0²E%ëv O=Syĵñâ…ÓD䌉¸İoÂPz 8~:2lŻëG•Pġğ,ñ\`ìŜ%‰3q˘0ĦàÖ}Ç*‡ŸÁÓpUƒ:RCMOĝ9j 0|Ż8ñôej€’pZ˙ÑÒ'¸’`Ê–—ûhï÷ŝñŻö˙˙.!z3<óTŜÄÓ`v (Ġ™´êĈĠqÇĤKlFk(Žvµ´İz’ĥ£@×-ş´aa6X5ž=íwŜ`¤úÎDDlŒaCĈÇ{x½BĝԙOç]mTÓEGĴŞ#Jˆ²‘°8r'/cPĵ‚Ğc{çüNŝòliïL‹ċâdé+#WİuĥW´‰–;u\⃏UQ ġ‚UggÓqrkGÄ­êëöM.ŒROĠ]ÜÙÙyb0|ô?û…/~é˙£Oߚ3}÷°€ófœŽ TEF¤_”ÄŜœÁ?#0 €Rƒ‰Ħj`™èanQzÎ'MUÄÑ ĴtĜŝĴÚ‰tm™%ŝÚSzADLuÏHê*WñF€pˆ‚7ÔİŝÏĞÙt˘Ŝeò˘ '‚>˜¸ŒqR:pQ­Î-án)¸|ċ‰ÁŬßú‹/˙òżqRùĵXߗqdħXèžR%á:i]%1V€×iżäŒ•Nyĵ è”J€;¨lZdïe@ZG×aM5Ô^BŻÉUQ`/ôݽ[½óĥʉ­áIÖ¨éDıS´ü2•‹s¤} ìñ‘œ<ƒËùÑŭkçÒDĝµÉìŝ|>?˜Íf'žŞ+”莓Ĝĥ:êLŜ@Ñ}Fk‰[´n!à 7İx]½gÚÏiŒ1ƒÁ ÛÙÙŽÇ ;;;×ò<˙ûİÏ}ċO˙³Ÿğ[ÂüÍA˘p`[íêCzT {&¤J7%._³îŬÔSuÁbĞz*gï°İè:іU`Q ´ûMŬ6Ŝġ ôgŬ¨ĥlÓ1ç`.ŻU´^ur½5²ñß ĠS$uW$ĞhфR!dè'€cBÉs°P,–Œ½IË—ëżù˙éWv˙Ċk’­Œß+½€ïIëzÑ׏騜xM5òV [<ĥiQĜH›h@zŻ‚RÙµ™ mԆÄ/îäH)êĦ×Ê]HJ'ÚVӑĥJòñè%—“9(ëÁÎŜ$ŝ-ÎӝÙçÌKŭ 3RûFY×KbÓM`%‹1ĈïÚ=Ççvvvġûŭ]~êú§~óÏ˙Ğ/NÒ~ò7÷—°N*,œŒ|ż(3Á§“TLFí"Ż‚Óô\°ìòfDĠ’(ŞÎ‰Ş”¸IÙİĞ/î(ŒX:jġĈS§ÊèžP&Ĉ—w†TµDêŽÒjbĝÔqSÇĝ^uO„c1üR°ä aĄ œ!ˆ '̧%ˆ?q}ĝúW˙“_ğ˙ÓRDJfĥ^¸ĉœsĥ,KĞLX𨠷††iÓîs@Â)=¤M´ŬşŝÖi?÷~ í€ġB§6Eï{­Ô Ħ[D1ŞDnµÍŒĠݵQ0<İdóĝB˘„(I…Òlg$Ç71*_‘Ç/Ĝ×.ŒógóĊéŝl6;žÏç³ċrYxşy×îuŭ"^ӳĠô”tôëĈĉôÏr‹Cîúw› Ħ^Ż—ŒF£ŜÎÎÎh<_‡Oíìžûĝżġç˙ĝWÜ\ŝ­½%f…ƒ³R)êc¤+#P3:L:Zlkıv#4 ɉ’$˘ĉê*Š5­×|/˘íÔc!5Vïä´ sH‡ ÉïZMWWGµ@#H×Y&„ĦRĞbò• ĠYâµh‚$^YDŸ·J쐘ʨ5O£”pXT÷•"ÀlÉ`)pîê‡vîŝÂ˙êµŭÏĉ"RˆHœ³g³/ ‡Îœ¤‹6,ä§ÒYjÛb[Úĉg·=wˇĴİê6İ 5Iğ^Mèmğ?q­Öa}ŒÔ´ ¨ do½T2„$Ò>Lîĝedӛ¸6œÜır÷‚uîġ£ÙŜÉtzä獖žf>+Mw–Ò ô€ÔĠŒÖ=˘Ċ¤k¨Ğm’jڍŜ4M“Á`ŽF£KƒÁàÉ~ż˙á_ŝ“˙ĝ+½ĞOï|`‰™…cµ\›ĉŜ!­ İqĞ'‰qP4\ W`ÄŜ 7Qƒê)ICÏĠÁM÷“\¸—\‡9Ğ ˘ÓBĥLí% äÜIšVU/‰ß"8OÓUĈ°0…êİ9jÂx‘Gè1…< âĴ“ˆ5„AB(¤dˆĞRžĊ2dF˙ɟıxĝ‰żó+çžùsf^:ç ç\¨˜¤( ğF\I×%Җ‹ĉi`„·H›èğMô5" x/~)ÔŞéĜ ˆ$Ħ:r04y}ôEċŜâӚÂığëç%퓝P%=“‘›ßŽoâĵyptġ|ï‡išŜÚ?8:œÍç'KOÓ9çlGœÄY]Oë }FoZ$ĥQ‚´+]ĞQ}#ê÷ûÉp8ŽÇŬápx­ßï_˙ôoŝŬ_züsżtċ‡îO-Ä ‡€/A?­ÜĞ“0Ş+#´†Y•<ğİz(qŒpXP˜/51W´×_·žWuI¤eATŸ Y û ´C’$ ³zJŒ|H·žLeV}ùcĴU|:ĵMßĴŜĉúœ(gŞTŬ’€…ĞŞDJ.“‚paœàŜ§ëéċìŜ燯üġ\D"²pÎY?xêĵié6V)ÔR´F§-ɵÊ볜¸65tKt ¨r†aggg<Żöûŭ§Üĝȧ>ŭğż˙ħ7ĉŻN-„Ö'L2WázÁ­[߁Р{k=ê3´cÑ‚ŻE;U Ġ^Ÿêñ’›l1éì …3Á‘²;¢kvɆĉ‚#9!Ԏ Ĝ˙ÛWH$—›_!‘x·ïuè'‘Ż ´§ŸÔŭІjôî$H è 1XXLunŒ/óöOJ\;×£7~ĉ÷?ŭĜäÁAn_š9çfeYÖZ,ĦZÁ‹ëÄĜS:­2: ˜N§MyĜœV½_Ş£7XuqY·X7”ż5ëZ]ßÌu _×E¤ĉ@,DÂ8Rƒn  ñôuô/âÊ`r÷ònú’uîöÑñdo>Ÿ(Ş<ŒĥqòŜdšú½@š ‡pşY}[°`{¸—xgñx8.‡'ò<˙/üôù)eÉ÷—`Ç`W-úìŞĊ13TÓWڟTB!ŻòŒjûYíûpŬâ x|ԀPġsŽ+r Xiĝe#×ĴÔ/ħ²"Ğ…Ûrów@İ£ÄW@İŻŽœ4çÇy1ƒ!ÀİsÙÇ$˘ƒK[) ŝ1˙ûİİ|‡)ab+ÄgÑgptRâÉËğÉĞ?ŭ‡żôäż?ˆLœsskmáw \…é3@²ĤJ†êŭ,à´ P­ûûÛÎ6àó^ĞŠpJĠ×ĥ“ÖĈTc_÷¨ġ'Ôn2LĈFEÚ¨vşk^%=A’Á-'Ïá|r˙ĝħsĉ4ĦWNÌçuÑ\‘ÉĵíĈ>£·Hèà7Qvë$âħ^❎F£ŝh4:?ċyŝÔg˙ŝ}İ˙ćĈß9(°,ŽQ’ŻprCµcwĠ3˘Ú~'DmKğğ€¨  AȅŠÈ÷‘ĴT@eyŞÄ\äŜ.Š:–Dn}-­¸ZyÖËüJ_%ĜĞéj`òb ĵKT•d‘ÖÔyFü`ÈB+wp‡™İdX“ıĠ'Ż÷ßü‰ßĝò?ĝ_ĴµÓYQ kmi­5ŞLÚ¤x-èımzIĜŒNú×]ûtFzżUF]}#YC×EÒFä5ŸJIù­éîMWo–H lW+{ “€’ÎÎIŽŸÇÈÊWwË[ğŜËóEñĉñÉô`>ŻÜʲ\vPu§ ÄĥûG§ġ‘äzë=$: ıipĥKĜQuƒÁàrŻ×{òñêg~òĞżûôks‹ûKË gqU…“˘Ü4ŞżX¸µ„4miġxàaáŞwä*ŠŒQ چŝP˘{ZİrdĠ˜J~Úr·âá+#Yû; Ô²J_-% <0OÓ9òU•Ïd0Ĥĥ†(]MˆÊCÇGBuß*#`&Ö/ˆ­„óY‰aŠÙ/^šŬöçúw~pèœ;Ç3kí˘,Kğ\.Ù/§ġ{fwyĜĵ•fóiŭœ”ŜĞà´nĈÊtTF]ÇY+ìj8*ĝ¸ó*ß]b÷|•_Ĥ–êëĠÓúĜêëéëHgÏr~tïòıìekŬÙŝb1[§ŞÛVM·ÉħûY÷ÛH›¸úöÜQ›vè²KÑ MJ’Äôz½t4 ƒÁĊÁ`pm0ÚùÈÏ˙ñŸŭì‰#óìI²ä ˆ¸1]Í êF½î˵bÇU,„/„O+öŬ2 ‡•JYgY`Q™ż:YŻôB}ZÏh+šNç'u„2IWiĠZF­0JTÁƒ ĵÚUBĦ€}OIˆ@,^ĝàiù¤F>NíżŻI‰˜Ê•`×"j!8^:z|ûĠÜÚ£ápxĵ\.gËċ²ô™C]ž6'(ımާ³šYʖ×>m`€Í‚ˆú½lĴJ½#èJ¨}…tVkÚ°zcGÒNÍ éHŜd‹RÀô„’>\ıO2y ğtyel^ïĉöÑñü`2MÊ˘Ş:‡íœÛĊHà0zû+¤‡ıñÖŬÌÀäyžîììäápw0\éġz×?ù;˙à‹ÙĊdžß|°À˘pÉUß(̉|Uáz!„KŻmµ/ÄQSIŬ3bçĠužŽ³*bVóKmfn  ŻĠ:š_D•‘Ĵ˙0Äċ•(üs¤š_1ûŝ*Š#%{0JHÀD0Ŝ°Ÿ˜"½z M5Zġ“}L]cê'`ˆİ@op8w'{wüÒ/\[ü_÷œs£ÑhRTıC…žĊPÚDéÑ*'yˆïË×ħl°³~ŭ^ü8Í\VÖTGÔ^kğú ‡,$Ŝ˘­UkPÒ4]/Ħä˙gï͟äşÎ+ÁóŬûĥÌĴ U(,A’HÊ˘HË"ÁMĥ¨ĊÚĴħ3ŬÓĥ#fñ"µdÓK·eĞŬ²ÛrGÌtô03żÌòüàˆñÄȖlmÉĥD‰µPâ‚}GĦŞr{Û½÷›î}/_fċV @TˆDe%²²Ş^½ĵçžó}ß9L2sJĤuavğĉ³óKsŝÉ$M/ĥğñµ8NZNŞ+`Ç5/hLç0Mìx“5$Á~0d'4ÎÁĦï‚ô}_Öj5żÑh4êġúr†{Ww<ĝôû÷_H4ÖR ÎÙĊSô.__öĜÙìĦV<ƒ5#Jq•H;?< ×}0£’^ħĠµ{܏rĈÍ °³´´Œ÷1'Ŝʸ ÙŒĝRó° äÙ9ëÈ lö™p,³pƒ BĊ?˘Ú.oJùN€à;i°0b0 Zk´ó `Bg˙Ğsë?<ŞWŻÔjµ,ËÚqÇY–)‡Hƒ-ƒğèA°"L×ħ4mWÓvŽIÑÒoW@šÖׯú¸!ó YbóŞŠ[Ċğ}îË˨rĞ`$˜¤HAşs²ûĴ›+ òÏĥÚñµN§ğÇŬÁşëÉ6šĈù3pşħ€4îÍ8ĝFÓjïï‹Z­Öjµ…0 wA°ïĦOüĞwħÊl¤ċ@jY£q—´„°-Ĉè50˜J\Wê=;ŸŜŒPQ3Rܛ!҆3²ŸÖhúħh„dV•éżĥBwxa ñ8ä­@UşA¸Ï”dÈÍryßĤ%2„éĠĴЃ)ÒĞ֖ìàĤj+ÈvBìÎ@ÜQèvs¤™ù ŜéôÎÇ~póôkĦRkµZm£Ñht\\¸ZşrĤktgñ3ŽQş†yJĤ!Š&Hy}ġ“·3œĞú×aàóA™‹kH…Ó7qû. Ċ\D'3÷İÊE¨ç^HĴÛàök˜3ç’Ŭóúd# N5[+nŻĞÎe)ܘÄיaê[ H<ĉ&ĤîÊ]“ïû…=\EËaîY½ïÁw½'wÚRèĤFig‚J/¨ ĦcŞÄU.wĉŝÔÒĞÎÀքĜX&äşç÷Ú¸5o]üGÊtĠ˙3ŭĦ|żd83£Á&ˆQÈfë5nú–ı~#ٜ­ “qNèVĉô°°nzìâ,LY[XCMF1dK`4›:í F3`6TĦV¨ŻŻß˙è˘úÎ(ŠÖêġz3I’nšĤʅö •Î'M+­MÛê=íŭiğIż]bFĊq`Œ*2 Ìĥ.ĉl‹¸Ü§6u\Í}w†•4x’€Áí3ÓX­u/ŜPJoµğ׺Ŭx3éĊJ¨ë!ƒé²Œfġ£·€!š ÌG5Q_•ë˘Z­6†áŠïûûüÏ‹sCo´2›5b[İïĦ^FÎg§jˆ:x5Tz­ÜĈn…*sFEÍÈ €Ñ0™n+[BŸè’OŒ_cà6×U6[ıá`Ä[ÌŭĴl]LÀZħ xÌÈA*!D Á•ü˜÷]Ġí"Í4ÖZ)ÖZâ̔u7ë›ä€I3òÌ jÔq~áÈ=Ëë?ÜçûÙċZ­v­^Ż·şŬnê˘‡½İŻGı™„o¢·aŬc€Ç  H5jK*7²D0 gċÍĊû­§Î+d—Ş€°5$C@úÄÙUPûU,ÒĠÍŬKò„/ċÙ+×Zkqo&IÒɲ,ĠZë)ìĤuc˜Ġ~„’Ŭ°ŬÑàP Ħò€RŠZ­Ôjµı0 wA°g÷ƒ?¸xèĜÒ÷›9Œ6ÊYžÔş÷ŒS 0ÒÔÛ-a >˘ìÊ9#Z;óTôƒÑ°4Wíx ™n‹äVĦY[ĥS†‡HpUfÄ÷íğ¸ŝĈÌĜĤË^Ĵ7‘pšœm·ġ9Ĥ˘ÓΞ`ŞĞa ŬUĜheHr\÷s·°4 @Ĵ TĴïz şşyĝ'väßıÁ•Z­ĥQĞĠWK2Ŭı5*WfpÁ›t½ŜèEcà™Ĉbëít Öù&-Ŝ.dœxËIt4sÑ>„~0!‰ĵh2í³¨ĞóX™×—ê‘w“dknÒJÓ´“eYĤ”ôŞcLçä=% Œ~„5$Œ`G#ß|aúF#Œ˘¨ÁNß÷ï8ĝ3y ѧ[)ŒvŬmLî",~˜b@ŽúĴÈ 4pe‘6½9£*)w_U P‡1#쀐Ìx\×Û0™ rfX½‰‡Jƒŭ2á†êƒ]Ŭ8üŽùwNApİ^Ż_k·Ûß÷³<ÏĞ‘ċħŭfÎġ‚я4ÌÑ{XÊôż g}!bÎżÁċ“Ü@B1$+ä0yLhŸÀ_0+sú|-N·ğɕn7ŜL“¤$Iâ`'ÙMj\˜ùÓŬ˘€4l;3ÒB%YŻ×Z­Ö‚`‡çyğï~îCG2:ÓÉÁÊĉ•CÚĊâëĵmŒħuĊ€§‘˘§ J=TŬg’Ê}ŬtĠšHßĠ4ŞjŞĦWÁ˜ĥ"XáİoYžYš†ñp`ö8ĥ·[$ħĈŭìF£+´;9ŒAŸTZü4…ڛ wÍP=pĴĠ•’aÔÀ…Ĉ=V½WöAp> +F£ĠétÒ<Ïġ ŭ4Náo% яñ"DChÂtġż~ *X{ß§ ċsWY\êĊœ3„CÇàĊ'°ĥ/­ÌËYž_jĥş™cG#œĵ·›qÌjG·<  ìŞ68yGQ ïŻÔ—ö-ytċ|Ĵ ”)6Cì ĜĈj÷6M= Š ú­tÜ@ĴÜ3nÎHU\Ê8ói.Ğ!`´ġÇäK$÷Ù ~/˜Š•Ïċ1ècÀˆ‡4K+ÈċPÁˆSƒ¸›–lˆ*u;ْ%êŜ’Aŝ{¸È4´/7öGsûŽ4ò“§0ĵEѵZ­ÖqIÜĥ9ŝVħ„g0ċ2ĤfÔsġʞç}ßh­İ„ñÁÉ#ĥÈIB‚d“µ‰:Żc—Ò•9s:òċİġÍìjğÓŬLÓ¤j4f4*ùuyxF· ‹š.IJ)kµZ†a#‚EÏóvŜġäûŽá‹7Zħ‹Ìô[ÔT;Û¨?ñÔzWġw߀ı ×Jnso ÖZž3Â(ĠnDkw& Ħ"<Ȍ†ô(–é²=ÓüDÁê9ÚÚ=ŒÌ¨iÊm  ‰st;9´Re´QÑ@ŭ,­òëĜnÈŜıĦĦ Ê`ÍıJ äò\ızÇ= òÌŞçyKa6Â0lJ)S7(;ì:<ƒ4[ ~ä <ÍĵÖXfdWhënĤĜuÑÀ7dĥuB2$ĜtÏ"HObu.ı°c.8§ÙċVğğэN!ĠMèŞ›ĥ^t½Ħ޳G(Ùm‰1ö}ß 0Œ˘¨áyŜ)ċêê£ïÙÛV™v V‰`ú>Qqc(Ŭĵ‹:–Ĵ#"$ ‡†Â0U9`Â0BÌúkFƒ_`z€Yœ„"ÒÁTžGÂlH °âŠ#¸kµ–Ö˜´ĝ‚f ĥbħ/ӕàPy~ÜÍÑnç€fÑËM‚³2Ċpìż°IbĉĦ†ħ[NrñGòÏhlÔîÜĦƒïìóóüdóµZm= n–eƒNфá™H“ÜfÇ[Lì”Fż è·è/ĉŒúŝÒγ$ IgëDŬ“X›ċ9ïŒ'éâĈfڌ“´“i’çynŒÑ¸A×Iħ3éö¤êŭŞ\'Â0”QEïÏûżcċÑ{{j?¸–Z)̵ ›Jĥ–Ğ şŭöd·˘ĥÑ£2ˈ+ıDp6 Q­ŬU–SlàŠ(ñbPOˆÒÙ@H*k!Éîê Ÿ@˘ÂµĞ½¸l2›r°”ˆ`„ì-w‹ĵ½šÑ 8°a´[Ž™˘ċÛv1•ƒÈiDTxUr’`*ò¨İ°¸Q`T=ÇÚ Ora/]ÛĜsx9n~ßóĵ… jaŬn7Ż´€J"·Ñu–5ƒFvى§ßÉöÂé{>Ó=ƒZ~Öì\Ì/ÌĠĵ3Ŭ8ı'ÉF'íÔÒ0ĠI.Ŝ“`1cG·. ñyE8Wï ‚şçy RʕŬïzò`k]í ɲ¤!`T,†zÀPÍM)Z½Ëù£ÂĦĦˆ MÏòĈÉ­˜¸èu‹™)\°e>Â5(83S_ĈÀ <6`"H!Ê]ŸÑ6Œ—Úŝœg2àÔ@Â6rdîwÖdFƒÑĈšÑngˆ;yUœıM¤ħ#–iRù9£÷`[ÏF̀œiG0,á-íÚĊğwyo,{ž·†a÷ŭ )#ÛÑLĥ𭙆I^ŭŝĊĊu%†Ħ— H |2éUÈĝŭċ9:%η:ÉF·7Ó´Ï Q[€” “SOĉÁieÀ(Ï :ÍqĴFȒŭ³^½ž(âÍı˜ûpŬx(Ñú·ĥ“À¨O2d‰BHˆĈ*­oìĵw‡l}Çóĵı ˘ ĵn·[5ĉto˜-o³ƒŞWLÉyŬY §UIx€Äéˆä4ĵĉµ•yq’ˆ.´ÚñF’$Mç$?FXÒ¤şÑ0‰nvŜ˘€4Êîáóƒ ˆ<ϛ÷yòl;NÖâ8iVR`ó t=Ŭu³kî6bH[@I!ƒ }߯yž7'\ZĵïĜŽŽb34Ùĝ‡-ÌhÈüM‘Yd7KVLbĉ>ÉÊ ħĉıî<£2ĉ˘Fĥ–S0HoyġE\ú‡˙Ñɗ›?ħkċ 7ÎgYv­ııÙTJu”RħÖ:3Ĉ(×ñ½÷$ )'„”Ħçyuß÷çĉ|q'+›/­şzĉ•]wĵ7‹û@„µ)Ż6âċ™Fğ•!MġBÙd0*ZğË >÷'5nĈh›°áŜ&ÀpŸÓúÈAĥÒfQ£óĤœ_R.H)ç<ÏЇaè !d=Lĥví͊۔ܐ{#îOM/Ê9€ƒ‘Œé$€ĝ üÎĈʂwĈ°ıÚlÇí<·)°•™£iĵé00ÍŻÛäˆĴ}_AzžW—RÎG;Vv…ğ÷×Ïĥµe0šûìφ·½ cVô"ĉÑÒPÖ5…L·|°n‚Â6^ú;\ùÒ˙eîĦîıĈòÂ÷“NûBÇkišn¤iÚÉóŞQfŞjĥPÜàäRIœ1܍Ĝy!k“şg0ǗxG]y&ŽĠZ’$ÍÂÍğŽĈ§N[? ”n?†4L²ƒçy2‚ ¤Ùo@t9έ/Ŭ¨Öċ!,‰QفúäQyF[‚†ú¸qv@ö7cHĜ'kkM€Ñ |kùêjĉ‡”›WZ­îın·{9Ž 'Äyžg.^Ac43s…‚ˆHzî‚ Š˘¨EÑz–eëµ,k.gi§&ñzïŜÚêŬdD­Ğ1’XWr7ŒJ'gbkŞÁh͉{ #Á¨r—˜ÀZƒ £ÙĜ‰VsñŽâڜ”²ĉû~àyž˜ ĠŞ'ÍêöaI[u *všĤ2‹‚L"`ħ‰/“HNc9l_^—'µÒ—Zd#ËÒv’$qšĤÙnŜ\ĵÉġ£Ùqğ2$ß÷C)eM1?Ïŭğ2cĴc _Ŭ8f4DÂÛÂfxxÛ8F1Ü÷%´´şĦáKtO~—ŝĉÏÍáżJyöVĞuşŬn_h·ÛëŬn·ĤiZÌ@°=ô˜‹™*ò<ŻÇqEQ;MÓvžçħ1&ğĝC½+jà ×îÈċ`"ûĊà3²M}J0*ÜŠ“F+K} Y0*ßáf2Yo;7xec|AġhĦĥĵ"DóĵšçyçyŜ0âŬ>,hÄB_ıQa´ÊŭĦó #[;J ÉÔù²ÙQ×瑪ÙN×ڝ¸•&IñžS ¤1ŒÉûp6ċ~|dĥşv·ħéíúmĞr•• Á …{Q„ôܰYkR–œ‰ĝr·Û]ëvğ­$IbnjTT†M>¨ò!_§˜9ϲ,M’¤Çq3ŽĞY–]nĵúwŻÔ9ƒÈAġÉcAƒè²}0Èuêy]l*éĵSƒQĊżÉ0’ì€q4‡ˆ–…Ħ%_1MS œn/ ÒgÉİÂm|ĜX›&şê+ùÎysf&Ïuâl=NÒÍ$IşI’dJİjѰZÑvc%fóG·! aÔB!íáK)!D=Ú³!/É=oŬ5£êÚmz;uŒ÷J3<ŞcĵhGĉoşJ›2FûÙUjëQ踅µ×‹=ž>eÙċ4MŻıvÓXk0£qÀ”cDCÓ””R*‹¸Çq3MÓu•gWV.żĵ!jsvĥÇEF KŬUOħİ‚˙@"oı™Ĝ3êû6Ĉô‚ʃ2ĝóDT#"_JéUM¨WLú|vÜ:@4Œˆ*Ĉ½ìĵż˜éÂ#“C¤g0ïµÖjtZ.tt#IÒĥëd͝gŬ´ġ˘IóF<˜fÇ- H>ĥjû%(ùïI)}"Šˆ¨ĉïĜċ0ڀ­IP`FUİhë=ĵfÔcMĵĠ›"Óñ„:S‹y’öcşvŜĈċ4éı4M×Ó4ŬL’¤S4 É0uÓC>×Zk•eY’eY'˲Í<Ï7‚S߸¸{9t-²~q…Ôñ&À\ípäŝslnw´+Î!#ŻNDÂBxD$frŬm B<á9eÖıäW"bB/{ËfRH°ÉÁŬ ¨ñ%½:§Î×Bygkiš6“$éĤi:lvšf³ ÙnvÜâ€$€hËÍ {Bˆ@J…ËĞQjŠäTÓgÚό0vΨ¸bĥڄĦ×1nUĤûÀс’aGh~˜läyžçyӁC˘”*ş{tPô ™tÓҝÒZçY–Ċyžw”R-ĝúĊ%ÑÍ!,h’$CÎßġQħ+(Oéɛ×Fv÷KRĜ+E1(¨!e8@òŬ°ÀÖ`>Œìf`u›HtC>7Â’`Ĝ½ÉI€ÁŞ ¤ç0'šë;çĊIßÛŬd3MÓVÇIšĤùşnŜ³:&uÙùÓŭ$$g‡Q@~PpÁ[kg6ŻHc`iĝ"ĈS:0ŒâM‡A™n°‰Ż½]&ş„:—Ïa™5­uS)Ġβ,ÉóĵhÉÖCnĠ9ˆêeĜâZŠÊğ4Ş´‚'ZëŽ1Ĥµ/Ċ~¸×ÏYÁ¤UGŞ4ilŒĝ÷ElTgŜ,3‚u˙&aU9’!rŸˆ|"òÜ °ÀöëF³Žğ[ ˜FE…¸=dh˘ÁĴșĦ™$}€râô2j|‰wÔóóġPžÎsu%I²VšĤŬJ4ıĈÖ9£íxÓ͜nc†$G,¨½/BH)Ûíáòꂨ™YĊÁ ·bÎ¸‘`ÔGĵy Ë–ôÚ÷şCj"ìÀôr t§ îlš†I/ċyŜVJĊ…-v¤&0%=â9>–7fÖĈ˜Ü“j­c­u,7.&Ë ;GJÌt?½0 LwƒÁ¨·DHàùÈ5I·Ñ‘¤³V†4;n–4’-1³afcGt.`2ß”_[€ˆ–-CO.aN´šËóâ,]nwӖÒy'˲bvœóÂvĉfàsëú>÷?;‹ù >³Ô?dĉKnÒÊÒ´“$IšeÙ8GïiÒ_gìè6—ìĵ1@Ġ·X8†ä !|i‘k‚ѽżıŞ— Ĵ‰<k÷`„ÄDoşÊ}3LŞŞ<‡¤5RÍÒêİ1&v %- S@Ȍ”QħĠ!Ïa˙§+÷ŬnÒ(H9ÇÍ8ò ‡d¸äŬFƒŸŜH0rŻGËx" $*쨜‘œÉt·D7Š ~4Ĉ%ˆS)İŬJċĉ•óëɕö·‘^:l~`}}Gßó¤8Ñê$WĞÍ nîÈ`¸-´޳Öîې&iùĠĦXADÒĠV•^ˆÈµz   5÷Éc#Ӎ#6#•j7Ŭ°µoˆL×˙ġĤï‡àâmò{’f 56)3§Ìœ3s^‘ëFŬF56Tߘ£UU_ׁ’m ̒ó6#³Ż†ÁJTԎjH£µKşµÀh˜éí°û À(t–ey'R£#ÍÙSğpñKеîË2Š#ÏkäQTğÎ/l´şëÍv§•$Ig Ġ{G†i²f×Ïm(ÙMÚ­!ÈMÚKžj ·ĉӄaÔ†QÍ }KzršÁojL˙S çévŠĦòҘÄ5(fVŽİ ­ġĵ †T‰ìgGĊˆŒk“e²W žÈxĝI¸ÀÈŭàı  8ñÍI`4;n=f4ĴŽْ1ĈdYĤ;qžB$íy“ñŽšnĠêŜ òç<Ĥˆ4ϚÍVÒjwğŬN7Žx³nÒëv"ÊgÀt›mG6!{H!„ ET—½üÓ?·9¸82F °òÀ(…áhŒh˙k0ßĵò5ZxĦù•¤lŠÁV]‘Ί ^aHvnĠEW`r;xùrmÑ "Až'Ĝĉıε-”–#„°?²ùH06ĜŝÌ<[nŭc’Ħê(Pro=J)“qîIЉjÈL¨dê'„\[‹’<ϒ8NÒ4β,ӕ4áq`d0zàuBoc†´UÛ³ fcÎÒ†ŒµàÑĜ’.Ê´_aФ×IŬ€Ĉ‘qs8†ž!°10™1ĈÀvĊ™JĈ‘òqœ‡Ö°7­Àh›“”„•D$üú|@Ì`ċĜ2·6•holĜĦ$@ç ŞŬn?ÍXÑíǚ†É¨["B´Ö&Ë2%„`c gY}ßO„bZë<ÏTšĤ:MS­”2ZkSy;O’&ùÖÍ@éí H• šÚx‚ti 2À€Àhšnş-CŻ#œĞ+àH0â­o#V14À’@BĜP"íä²qġ£iŜƒoR3FÚĦ䆎…ë` ü•FŽgĝö£* HA6Ú½˜M™½okÉCÀhËĠÁÌ&Ïs6ĈpšĤFÊrŞJ)×cĜZk.².„ŽQlh\ê+Ĉ°Ùq›ÒĥvŞBˆÂ݊ Rša´ĥ5pÌ6eş- 5ĝäa`ÄdşJ§ÎŒ ċ3e`µİ`\‹İ–†½ „I;;ß÷Éó<éħhǞZ‹œÙîpò8W·‘´µ#“u!”Ґ(Àˆ™ˆI3ĉtûÔĜE_ÛcpS6ĝ7ċ;w=ƒ°3vôcȐ*d„Ħ l[p ĵe”Êcš`ë%}—˙äİ|Ĵ%9Àၷà"(°ĤĤŻÚ^6 €Òv¤‚Q!}£Ŝl(ä:ÂëžçEBˆzmu_íb7ïŭ·:3Şü,le]BĞ‚Éíˆg,éö£a×ö4 ~µ‘‡·H˜’%Í TŒ‰1p\C‰AÔßm†-”#T^S5VĵœG.¨D0rA.Á¨è¸ û|Ê4a@4vu;ŽÂvi#ß$Aˆ ü ")eŬ £Ċh÷ĈċĥÜÏÎ`ĊLòV#ĝÒ:A@&gıúĠS45\ïbB7ĝġn÷ƒnÀ9‚M TƒcÓ|˙é’g'Kw³mH!RŠ(Šĵz½EQÔ})¨7vÍ|xéĠµĜú÷ecnë‚{Î넷BĤ².y$L²:Ô3§Zë\)•+ ŜüĵHÑéY|,Rh%€:€ı@F‚™%zÖEogÖê|›`f 5s+@xrçcÉo’¤6Lŝ<LïŜÍXÑ œŜ& iìND)e”RİRŞ“çùF÷ğ˙ôŭĞ÷ĵ琧Ô£:Œ„ħğc‚°™;‘£ìBHD•X ;Ö/Ùş“s³&ĥ³•F!-;"@H V ä|Ŭ ò…-˘ğ˜•-kF $ Ü€ 5 ĝ{˙€ıö+&PkJİĤR*VJéŠu$­í‚–°(Šĵ(Ša.úżĵçѧïKYʓ×R@ ÌİȚĵġE ô1™Èħ¤R俙`TŬC y$À8iĦ&ókδ6×Zc̛5½¤@’(œ_Kiw×O˙Ê÷ĴèÁƒßùßŝ—żúò7^:İÑ­üĞĤĥo§EKTdf‚h^§ ?ó‰O<ħħçŜġêßŭċכ_ûò?t5]·[ċù•ç5Ş~4ĝ8O!Ŭ3hê4 oòZš·0 Ğ%€¤Ó4ÍÒ4íDQt-8ġ½ï{_˙‹‡›Kû`˙A4ĉçPm ƒ„€ ‚Îİôdcm1d'Àg"j´ô=€l‚Ĵ êċKˆŠ,%Pö£Qv “+<­›ÍÜÇùÂ0ut_ú’ŻI^‰ŝ!˲ËY–mĤiçyž ìà0ĉÍÁ#ËQrUÙQ²VĞEQÍA°ìyŜŬĵg÷‰ YWYI3SÖÁù-•ï~²òXo°£ż•žÉĉ(ġùXÜ,fTŝP £4$I˜Ö5ÈĴ­ƒ(_ïXġT)C”š?ġ‚ ”ĥš+ïùÈG>ŝÄżĝċßZżóàŜN4÷nŭÙ_ûÂċ´ó.¸çİŠĴ÷vYÄú˜˘c@£ĉßùÈO=ö żôoÛ{h}~ïw½kçŝžË_ûâE ċž?xÌkÂ00ÂòŬ0ß;LÉtĈ1 0½Íi\èV߅cŒ1qgQu‚ ¸&<³òµ?˙sµt×ógÔ>Dµ9áÍïùĦ+Po]s,†*-y6òšµIǔ†İÛDîë· ĜXÖd`‘ °fĤĴ›–)İH:íkÈŻœEĜşÚ>r׿ñuöíN’\Šx3ŽîsG3%+˘qlh@"žçÉz½ÔëġùZ­ĥäûŝî=?ŝ@´ëÀÜ÷_ĵ“j[7*³à{ßZ‚àŠ,gÜ9ƒú"7*„àĤƒ‘ûĠĴË!ÌÚ%Ì!ícşĈ˜Xkçyž;†t=~cUP—@’V>ĝŜg?üßú·żí=ÈîıÜàáç?òœÈr“˙áoüŻ6“o¤@<FoPÎÀÂGï{êŭżó§/ŭï~(î2ö=ôî£â_ĝ{š˙Fċß}ío׀fċœµíĊdĜi6°Û}Ŝ¤ì˘1"30zğÒ¤Ĵ“ÒĉĤ°évğ)ċ5ž1;ó×ZĞA¸?iŻïïŸÜĊĈ„ĥzD[µè^&Î$­zŞ£şnvzD7”× 5FE’6£ċR´zç‰,Ë.v’ä|§ÓıÜív[q§Y–é)e:ž°hÒ(†äjG~½^oÔëġĊ vùżçî§?zïWb\nçàÔÀ(Ĝı*×|IĥšJ°çŠ9‘k( g{NfèO}CÁ¨Ï“BƒlĤ}ónc:.…7SJémÑ(›ĦráAè›,ŬùŝçžùÇ>ûÇ˙Ú;òèî+¤5ÏG zƒ?÷ÓÚhâ?úô˙tj3ŝfÛ2ƒêëŜΠT֋*À,ìxÏħûžŝï}á3xÉGÎnä0IÎÒ÷içCO<¨ù^À˙üòµïö·WÈßçÓş “Ĉ=6Nö›ÄßÌŭÙñ6ìxÄĊÄtž²,Sq§ZĈÒZĞ,ËÚA^Bĵ(e…<"ÌĤ\”]wıY éô\€P?zn™ĥ+fʙ9ÖyÚnÇj3MӍ$Iu:ÍN§ÓMÓ4w× D£À¨Ż†ĦWĞĠ‚F£1EÑÎ öŜñïyH,ßÙxéċ5pWRYv]ÒµĴ P/.Ŝ1Ê>Œ ‹CCünÙîz< ’B2tó"ĉI]ÑJwœ\—97çiÚ{GQoñ•žż\ŻíûİŸùé~ĝ·?ûÉàĜğvµâËdXxİÊyG£AÇ~öçß+„Œ˘˙üG˙éĠgÚ:éîvŞLçısâX:ŝĝ£ï{˙§>ûqìĝŭW› +0Ô<ÄJs v=òô#ĝċ?ú=ùż˙ÇhîÜùż9qŝê@ЁsRŬÚ´ŽJždÓ0œi_g`ô6¤qr]µÊZk$IîdβL…aĜ ‚`óĵš”2"˘ X8˜YôQï>î_ß6ħ„ŠÏK rŝt…qŞ2Ĉ¤Jİ$Ïón–e$IşI’t³,K+rÁäP°q ìbKPò}_FQÌÍÍÍĠëġċ0 ÷atçÁg?v÷+Wb\^ÏlÄşêÉtOX ²cTT60liĞ7½ÜŜÁċŝ†ËtĊÄ@ Úd ÔıfùÙÄv/ĈY–ċni;‰žƒ`T’­VßŭÄ{>ú³żŭÙOEÇ[M“ğsàI€AŠ™Û*goAG>ĝsO€ñżûTöúfübjA ·)( v–`ôSÇ?ûü§>û›òèñŽÁ~ı^óíx˜f´RWrAĉĦ§`ƒÏà˙ĝ34Ï_ú׀ÍßË`tSJvÛmıŸ–ùÌҏ bH}À”çı2Ĉ Ïs$I˘}ßO<Ïkûï !!„çŠĞÒ²$&ĜVÔ­léͳ¤òb£²{ÈÙiX{­Ìµ g„2­µrÍ ÓÊu“Àh RJQĞĠüùùùz£ÑXŽ˘hOwy˙Ï?žÏ­Ö_zm ĈÙħÒ3Y0’ˆÜÉ÷•ŽÉÖÉ\7Ħ÷9ßl0Ş 5“gÓHôċ“X nF]s™qžçı“ì€ñ "ƒĊïÁ:‰`ġùgžúè‡_ĝƒO֎=ĥš'Vì Qŝž-ú2WLñ?ñ„VêSüGŸúOŻ·óod@{ ^r;€£#‡žùïüé§½cONş{<ĉHJÌ`)ˆ#ÉDšÁ’Ì#Çïg§ïëü~jâoÖmMi3™FŞ›h:á˙FÇ“ëfAŽoCÉnTûeµ=´|S¸!Ù,Ë2-„PBˆÌÉzBÉÌB!CŞîêh@ğQ’] U~v.É£‰ìîZğµ‹+f4 (MŬÈ ”aússsµıııĊz½†áËw|pßO=Ç_ŝ°‰Ğ×R°apnÍĝ‚`dz¨gïG÷ÒoK×Án:y`Tù—àÚ½€ˆ|¤ëg°××´Ö­<Ï;iš&Y–ċÎcÜ@0İlïĤ 9ËVŸĉéŝÜŝ‡OF?ĥ+3ì R˜aÓ£` &nH"­rŜÙh‘ŭüs0Ìĝ“ÏüçSÍôĊno@iTÍȂÑï}áÓtìé‡Ú]…]‚9”Îg™Ê""4|A+ZsfécO=`ŝ›Ï}†ŝ×ÏáĠïĝ›ĞšÀ–.H=b˜ ˜~َ)ê ŒŜĤ‡q˜ÇFŭġÖ,†q‡ÖÚ(TñѵúV?*­uqËŬ­zğ·Ĵ¸ï/•R*s÷ûnĊ÷uɰڙ~VÓ`ÇIu“d‰Q-É€ 0˜››‹––––ĉĉĉöÔëġ{Â0|àŬżòÂñ7:AĝwŻ7ar îĜşHO<ÚçĴìw Ĥœrɕ`C~ ÀÈɤ  B ÎÛÈOƒö·M–ĵÇñùvğ}­Ùlĥ]}Nc|ÎÔà\Ԍ‚ĠùĈÏ½÷ıO|ì÷?˙éĦÇ÷ĤIŽ„MI·³ml‘Ûîy "ێÔ¨qÏá{ċû½W_:×Úh^ÉzQò·²ü#*7ÏŜȰ|üñGŸ˙À ü}úh³­°ĉş'@f*ö \žSĥב6ȵ Z=°ÛğàÍ7VW6ÚqZÊ^l§)iIŞ1Ûs힁Ñې†uƒ ŸI“Ûƒ‹ö¨EçFŜ†EŒ‹×cž3ì(`wîŽr1 ‚Ào4ÑÒÒÒÂüüüF£qwE‡}ž î}çê_ÙDóZjÛĵ•1HßÉu$ 0˘²g‘ÜżĊk)ÍĦ…e êĉƒˆ@¤„^˙‚Ë/'wé‹I’œît:—Úíöz·ÛM VŠÑ1ƒ‹°,e:6;Ÿ{ïsŸĝo˙Á'ŭcíêtS̳á°81½ŸÈ׸?ŒŠ­DQŭîûîâ;ïÈ˙éK'6SuUÛúâ­ Jƒ5#ݐéŜsô³|áó/˜#ÇïżÖÌħBŒ¨ ʤŠÇ>1ƒÙ€l •Fœƒ°z×NızçáàÜË:ç/œ ×çà°šFÚÛNóÄìx›Ĥ`O“.ÀQĜÛ–ë#3|ĈÎ¸ç™ 2Ŭ(B cGRJo~~>Z\\œ[XXXm4ûkµÚĦğ~ì§à_ŝ›SmzġLœpŞA†H²R$HÑcFTîüİòpˆŠ DSdúŬD0rûS[7"ˆÀƒìÄßcŻtħAù·â8>Óét.·ÛíV’$i…‘N|1X3z˙3O}ôcż˙ùO{ÇÛĠî$X ĉ@PÙµâ\ç-“†ġ34L=— €”R,‚5ş‹víŬeŝé/OmdfÍXPšf·ŝ£–é|Kï9r™ŭ›?ûŒ:òԑ+›–Áy‚œ‰ ´ُ m@JŠAĈ0ĜŽïÁ(D‰ĠğvúĞûîĞ_ü֙Εġ‹1OÁZĤaG×#ż{|D?€„)™ÒTµœ1·qIĴĉ€’ÙèLúY&ÁÒ0*Éó\XX˜[XXX™ŸŸßWĞĠî]Ú}Ç;ŜŭKżùĝ‹WŒ÷Ġ×7ílW # $ÀJuÂ֊mĉ*ʔ]ÇĜî˘ĉĤƒQɐ¤P›È_˙ ßW‹_ÒYòZÇç[­ÖZĞĠjçyžWŝ‹WîùÒycVŸúݏ~üßŭé'½‡ßğÙI0fßÎa‘q@Ĵ  ÙşÏkĥ qѨȨ˜ ҁ’ jTżû{Ċž;wák_:ŬNġšê-·(Ş-żçè}Ï|è÷ŝìÓّ_ÜÌħ†ëR8?Ub@Fn˜”fäÈ5H@k&mÏ 1’@P†”öÜ}ïÜĊo]è^Ù¸Ë+ÙÓÈlÓÊwӜcħN͎“Ò4LhRjä¸Ì’qF‹7JşÓ×b£L'ÉuĠEƒċ:Ïóĵz½ÎÏÏ7vÌÍÍíĞĠj÷†µÚ‘§ŝÛß}öŒ^¨˙Ġ7‘lfàÔ:ž‡‚€à é2…„Ğġ³˘’Ù&ôĤ 3 £Âo•Ġ‹”Â'P(‘_üê×ßÙd/ĤizŞŬn_lµZNSS€Qo–ž·sħïÙçžûı}ö˙µ÷{7şĉYs Ĵƒğ6Ž|\/´ħ‹n˙Íş_Ûî@ċÖhŝž÷zwĜï½öÒıöFШ)M+½ċ5£§ôùüÖç_Ȏ°| X_Ùl'ĠšÒ8–BXÍ4Ĵè†Ìώې0!Mҁ§ Ò2c>Ŝˆ:Ò(ÀÑS°ĦavA“v{4”¤çy^†Áââbcaaai~~~o½^ż7 ûòçċ9µïèÊ_|×.wÁ™Ġ×"IˆàKˌœġ_Ÿk7;X9}5#v Żm0á›F…M$j>H(dŻ~ûĊĉ‰³ïtğŬ3ívûJĞĠjĤiš 4 ûŝE˜Íê³Ï=÷ñüÎŝ†8ú]Ô‚‘Ġ.İ^mĊĊl͸`H=°2LnŸoÊ œ€Ês ¨SÀÁ´cç^ġµ/½ħ™ê5ŭ£mt]3:vĝÙ÷˙ĉç_Èxòŝs›–Ys“1ħa(ĥ²\J3rÊMù9é‚=.’íL$òˆÁıB''’ĞûW½Ġ;Ġ/ĵ|ĦsŝÂın9Τ³Ùñ–FÜgLĜtvǒŜĴl7 dĤ}Íqžu£ZSG‘<ϋ˘(X\\Ĵ/,,,-,,ìq`ôÀ£ŝĊ÷îxç{÷}ñ›8y9§"7ˆDŒˆÜÉv‡ġ´1TÀh fÄE—ĠM£â¸¨JÀ—PW^}1;<Żŝ)‰7şŬîùVĞu­ŬnwÜÀñ¨† œKÀÎ÷=}ü#˙ŭ?ŝs`ĦCg$9ÍT²#ĊìdğždWԐ ³•4™¨ĝUm’ ‘Ê“­)ğîXċŝËS͌×ôĤĤ4²fôđCÏ|w˙ô3ɑ§Žœ]w`äKrí˙V˘4†rȍ•ì”ĥ’Ò Í32¤™ÁdϋíŒ ò…ëä ħs˙Ş·ó΃óW_:Óıĵ1ŞĤ4 (ŬŒ:Óìx›Òġ‚OĤaĴi\Ğïġ°¤IµİIÀ4İŜLîĴFŝüü|mqqqq~~~O½^ż;Š˘GŸùÀÓw>û_üâëMĵüFœ(ÈÜXf$ìÍ#*ëE}yF}ÌȵvŬtċ‚k oż `'˜‘/Ažù@öÚßb_8Gê[Ŭn÷tğŬÜn·›I’¤NvîÑW‡ÒóÊûž>ŝ‘O|î żŽ‡ÛğŜIħ-˘‘“%É09FdòA3C;÷¤”ìı˘2Îħĉ "xD”gŠ9Œ¨qàAo÷ĞxñŻNµRóVהF֌ž8zß3ü½?ûtüÀñ‡Ï­çXá†g= 3”Ħx(7°ìÈÉtıeNĥİÁž'bC0Ĥ`H5œ Ââ+Ŭ„ûWƒŬ÷ܽ¸ö­ ŬËğĥĤ4.4;fÇ ¤Qµ¤i›ĈĠnfŭhœäf0]Ñ8ǀQġĥħ`´°°°§Ñhˆ˘èŝ{ßùSO>ĝÑ_:òċ“múúÉ&852a;ê 7!*„ÊœWÊ_°-Ê0[`Â0vtÁ¨èĴ#R@HĝLç4ô_1‡çġ×ò4~µÓéœoµZWğŬn'˲ĴpÉFĥAJoyqÇsÏ=ûñŭŝŸ|=ĉjF†úTüŽš‰³•é܂[‘ë,(ħ†6ÌÔkj¨ÌfÙe”61EċìרqÏáƒŝŜû‚×_:×Úh]}‹jJckFÏ˙Öç_è4-MF2Š˘ ÂŒv;ft˙>ò“ïü/ġ_=ŸŠże&14#”„À|i™‘uc Êޏ­Ì(›ĴLgÜŭaìèĈƒ`È! ˆ|ÛêŭÊ_awvöê²Ż_ŒĝtğŬn·7:NĴµ”ëëFöşdŜùìsÏ~ì#żóı_£ïÚµŜI1gzsFĝ:‰Îíö½n:û˙ġğìÈ0UM*ßrP”İ Vı5ŞßunÚħ²/ŝġ‰şÙ5‘5£':üìóżùï_èÜ˙äŭgŻYf4ç Ĝ†ċ¤9­Ù’ĦĵèŞs Ú¸û 2†` “cÒäĉˆİHofwr|A€Öèd ĴܵËßıïÜċïŒĞ)͎ÙqiZPÚN> O¨5ñ ş™1€4ia†‰`äjF‹ óÁG~êŬ˙êS~풒_ŝŜ:òFi‚zÌH:fTxŒ 0bîÉt=`V;şÁ`d³²"ò ›§ _˙{óà˘ùZžÄŻv:³ív{­Ġjµ+ìhÜfí|ßSO~ĝcŸŭ“ß0Gßµk½:YX¤áÀÇôš”eB%0ÙÇܢkkF¨²#¸zI%/Š œ$È#PžçlüĠï:xÀ[Ŭğ*_üÒİk™ıjnSY3zòèÁg>;_ĝLçŝGÎĴgĜ sž AöwӚ Ò e@ı1Pşhb0PîqÛo–aşsÇĠĤ¸.˜HÈwLİ•Ìò]ĞÁÎ}—׿uĤmkJjH³fÒ¤ÚÑ$İnœl7îħ}3Sܟ԰€1u£Q`TeF˘(ş˙ÀCç'˙ëßxôŸ.)ùW?Ĝ@ÚÉĉu_ ` X0BašêzŞ˘öÀÈ8in°›ÎTn>ÁFúúz@`~÷‹Ĝ•ŸğşÓ_ĝ¤kġŜL’$VJċĜÚÌP¤7 éyçûžzòCûÜ~Í{|ïz'ħ5#kf†“1½†²@_‚—íŬĤ×9fëGċš'ßY`·ŝKNı+Î>ûD”çŠMQíC½Ŭwìôżù×§7o|MidÍèÉ£‡žy˙ïŝÙ§›÷ĝÌzŽĴıáğÜdfR†ŠĤ×Mgı^k7 )“ ^'ĤÇŬġEnd€Ş–̽-‘€€O (Í”öï w¸{eÛڗ7/u!ó͎›H7”ĝ-˘íÜ&ípiZ0j4áÒÒRŬµvïİ×ëw‡aĝÀ‡}ÏğŝċŻżó/*ùl ÙHiƒš°3FAQ3‚Í8êgFÔcFÜóĤ+@˙‹éëĴğÉ`äÚHÀÍĵO@_{|òïġ‘%úÇûя|öO~{|Ïz1gäfŻĴLמ²^d™9CBëD‚.Ε˜eCL†ñ93ĜFşóËaêħëHò\C5Ş8|ßğ˙ŽèÄ·Ïmnĥĉ7FU3ZyúñGŸßo}ŝ…ĉŭǏž–a'ž÷l2`CÊ02Í\Ԍríĉ 0r7]4|¸†)cX1“ġ`íı{0@0΄‘ Öhċ’ôҝ{=÷Ŝż’žşĴÚœĠ”fÇM¤IRmCžğ•ÀhT}kRm,-,,Ô*sFw‡ax˙Ŭ<öÄc˙ĠŻżóĞçsùċï]CÚÊQ„ş™J0ò`çx¨¤D=(ÀÈT,Lı ¸S|ĴâÌÍ# aOHä”"ŭŜ˙ƒ}Xğ0/Ô7â8.a]|>¤nÔkb`^yîÙg?ò³żûı_ĠG[]ë$X`͑#SԈô70ì4~D„i¸òGvvè\2Jê³SêġŭÎD’y üˆjwĵÛßħ²[|óŻßXKt!ß]/(Ĵ=yì³ïûÍ˙Bó“÷—`TzÓ90ÒìÉŻ=ĥT9OE |y”›בÉĥċZJvż ŒÉʙÖ[Za3%2KûwE;÷Z\ûîùöı‹³šÒì¸İ€4ŠcLjJŒ[‡!a›@4Œ………úâââŽùùù½Fž0 ïżïħÇßù‹żúÈߟMė_Ù@+ԔAÄ@²u„3˘Â†™*ĉ¨Ü[@Ŭ"aL… Uvşŭìèĉ‘ĜlûŸˆ|PàAŸòÜ?§,‰Ż¤iòzğŬ²£jí¨ÊŽŠExù}ǟĝàGŝàO~]ylu­`†CçÀ`˜I3SoÎȐ2LV‚"h0i Fd˜Üs™ĜÉQv蓈-S˘J‰„¸0µġ%2[Íŭȉ“)„m W~Dµŭ‡îöW÷ĴßüÒݵ”׳Ĥ4²ftüèĦgž˙Ŭ?ŭÌĈáGN]K{5#ëÚ ċş*uΉÁŝŸ*üê “v3Y†™´ıĈ—²fäX9N†38z­à.Ê£ŞáQ((ƒÍ”I/ŬıíÜwïjóۧۗ6.u'{ß͎ÙqŬ€4-0zÎ(˜6ìîzí„鍪 îbËE$ ›ħ°°°ìdş{ƒ xàÁ'ŜûÌџû•c˙ßéŽĝÛW6'5Ċ¨Ò֌$ÁwÍi˘ŒèÇ fSv;•eӂİSħó½É`Tîé(òXŻ!ŭÎ_àP=}-@ŝr·Û=Ġjµ.µÛíÍ4M7[5Û.^G‚yċgŽ?ñîÏŝ‡üĜ{80*#$œLg˜\7äÔöóžġ 32 SțL0ċ˘ÚcIì,À‹SQu)€ĦÊN‰záğ ""ö ”çŠsŻFÑ]…ğîX żġ×§6sm›5‘5£Ç=óüï~áÓë÷ĝÔµ ;Yóvap IDATœ'IlÀ¤ŬïœğA×ÜRQCr€d[á­§Ùn:²]˜6ƒ  a œÁŞAż".ž[\;I”mt­y=™wíŠVĜĠ~ù|óÒĉĜ֔f€4;n MSCşŜŻyĞ$F4‘UÁÈÙ혛›ğ£VĞŬ†áüô‡Ÿ;ôq˙_żŜ˘ż½‰ĵĞ,ùsïö„[ o:SñĤĞÈtĠıá2]%ñ[FÀB’ j@úŭżÂüú+Íğä?tğŬŽ]ëvğ$IŞ&޽WÂ[Ĵ×÷<÷Ì3?û‘?ĝż–{|ÏvŠE6VĤ—Í |r6lëEÎÔ60°f•ò¸Xpm}͞Kv„B’2 vR^áNÀeóCħ[Ż;·!(™H|—{…w>îÙÇÜݗϏŻ)Ñ ŞÔŒ„ÊÓ?ùèó?ó›ŸáÚ}ǏžşšašúkF¤ ³5J5œiPY3*ÀÉĥÁ³2…q*³ĥ× 9ĤÍl]™íö°ĴÈ=^°rû33µKġµ‚)q F)lfDzÇ]w„ğî½o—:u97|µĠN·™ ÌΎ›H7 ~TÇ(–7J˘Ûb”ZaFġ………ċF£ħρу~è~ĉΧ?~/ßhÒWO4Ħğ uͨ ”@Y3ÂvÑQ@Ê{E3nq&TS›ì-#rÓş5úò÷ ^ŭ²yh§÷5•%?ìvğ§[­Ö•vğŬЏÈ<2è·Ŭ‘`Ŝñì3O˙ì‡ïŝûìÈcĞç[ ĉáš;'l›H1XnĠÌ˙?{ï%×už‰~˙>§ruUd€@IˆT&%1HL²lÉrZöĜ3²Żƒ,Yĥe9Iĥ„—#ĉñ7żöŽï˙˙ôGßĵóì|„qf.y֓‘$hIwĈE’İ,(ĥòni ÊiVéa =@”Jż‘Šôߝµ0›a^1(I˘HQ)´:1ĉ›Îχ87`v.ÄÜ|€V#BÑ킢ê†ġ…µ[·_—;u&Œyşİ}J‚Ò i0W´$Ùô#íĠjµ•ĠjuCħXÜVŞToı˙7˙èÁW|ŝÀ<žl;%”ˆP@ÁĴéҠԁ“gŜ"•İĉ¤4HJŞ÷ŻÁ€QÑ Ù<‚pÏçpS]í/Ròt§Ó9Úl6'›ÍĉlğŬîš6XÙsû2Ŝ{ÏŬż#˙ñ7ş;^ğòD3'‰)²Ô~•…Ħ1ħ™„¤LeİH™ĠĤħöp–tc'Íy0À™˘†ÔWVòĴïeĵŸŭŞĈle§³†g²Œ%P^ J˘P,Sùş­[òcĞâ§vd&T330|0×ßpˍ÷˙óaǛoœžQWŠ ž0Ò~Úm ġŒqÂKĉDçĠqbBQmC.+ĊfM§ĦĈŒ?Íä4ġ£ĜĈĠ1ôúŽL E@"ÇĦ˘ LjÇ<ßiv>äÙı€­í án ĈŠÂD"ˆ¤d`KD!SP^·ş¸bŭÖ ÑSŬİÉÓ-…pHóŻ}ewI`T*•òġz½822RĞ×ë++•ʆbħxCy¤vëƒïûÈ3ġÍc>?‹£SmpG˘ F9çéN£Ùt¤äıžÒ ĞrV(ĥ"€¤4+*eAÉÙUNׄ=°h#Üó9ĴI&Ï­­zOUŬéF£1mVu‘#d BxÌ£÷ßġĈûßñŭÛÁÍŻ]qĵ€¤dkBU0ŭĝÈáĠç˙ñdKĜhÍGèµ AiH˙jÁH,Fız½^­™( …BáĈĠ[ĥżîŜ_˙7?ÛÊ>żwsKT-b0ĤלݐÔĞ8Ïä³Ê-p*d†FeÖrȒ™ÓÏğJ`do-O€|^9Ġ9‡ÙÏbutêüÚŞ˙x§Ó9ÜjµN5óN§A`jÉŬ4o€™şä+q`Ϥš>§Äš ·”Öoò"”͘ÓRsĦ‡ñY!‚öiĊ™ıÖÚè Ni€ÒŻ… ^d_ċëäobm|UËÙè&2ëĵl-gŒHNÛ,gi=~ż£A‰ˆT’°—+ÑĜu×oşċ5ŻżyäĤםl$Paĉ…‰˘P2EK…PfİŬqÂÙÂ=›T’œNF,ÓhŸ´—ŬläˆAQ(İŬЏĠÑnFÔnF”„’nMġ#Ù>ğFM'&{[kh&Ò1éúBjJ"ğĤc&s#ê¨ÖIu`ìĜg&·uöü?Ó³sß8tbŞ…Ċ‹‡gHŻx0êZÀUĞĠüèèhVЍVĞĠ´>bŭM·ñ-żö‡oĜ=-ò_:0ùóĵHi0òŠBèl:àƒÉ?˔_ÖKäĤ-(|TÊeœ§˙ïŞ‘'_[†D%ĉ˘=ŸÈôóWUĠítYŜ¨Ùl6LVŬ ž#@Ĵ$Ï+ŝÉC§İ5/°bÍMċġ›<AJċ¤pp²ŝ+Ğ)°}=z Gi[ö"ŬÄڐóCižáƒĜ^WÍĞ|Ò#ħmKíá…Òh!;Ħi³­2+@[îgjĴ`[VSÓué:GĈ1‹|‰ü‰ëòӍe” J˜Â„9” ‘dŠ4q”°UĠQ¤˜MŸ%V< ÀÒ ”"²>#[”¨’İÛN¨9 9Ħӎ(‰´yX+7¸½íÙĥoqVÒg€Y*şùK:Eê5#6`dîTkÄŬ£;ú™İŬ˙äÙÙ/8vzÚ£ċĥixà˙+#Z ŒÜúˆjµşĤT*m* Û7ŜrÇ_÷Kïżûg˙•½³è´bĝ’Q&F9ï#ÎÔtvWÓ÷ÔRÊ CM}DpĤî£äÇFäë×Ì"ç*Dô—ŸÚŬıyCŭ‰ Û9l`Ï·ÛíFE.IgBêÎ‰ŽÇ8İòıH‚nĴ’ĝçVĉî „Ç2Iì­{77@q:Ħ˜_Ġ°?Döó`¤ËÖXĴ)• ?ŒŞ!5X֊ ÀħĊ<Î2…Ĥ;€Ĵ`ŒµšÎDĴ,4·EžĤT)@ >1ûŠġúKËŭó­“RzÚħá¨=iŬ‰BĴ˜µÂN‘ċÑ= éİRMj·žlHb…(’è´c„J*V2UÏÙœQ͙í6ÎLF)_dPÊn ™ĉ=}1†˙ġNFĈyK@FÜ9„Ñ#˙püşö ?~ĤùĠ“gĤĦ! Ï5H—ŒjµZadd¤ì€Ñĉ|>ÖWßy×?û[ğ?Ŭ_ħî\/V¨ĝ„’/P€NíöÄB0ÊêĊûÀÈöJöNB/‹ÉÈdż‰’ĝŒèà7@ÇŬşŝƒ8 v:ívû\ğŬž‚ 0ïÄ#ċ€’ûFÄɘ&Ġ7żúϐ’XñÏLĵîž*ħ™$VQMn°)Ò Ĥ7-¸2o³sC–@ sÚ(uħ,˘”Ü0ñ@ĥˆ.ûœôĈ6²oJù{÷ ƒ_R)ÊÄ!ĦŒLrC&`°œŞuâîŒŝ‡ë[Ï~âèäÜ7N›Cokóp2žWÌÊîr€‘o ŻĠz½>V­V×0ÚħMoğ{çğ~íĥoìŠŻïCĜ‘c š(ûž–v› T›À@Bxò\é´wşN‹Ġ2|òD9…ĝÈ· _ĝb²k]ġ)’Ñsívû˜1Ì´Ûív†ĦR*î˘Ċ8ô~h2>qô´˜’bĠ†Ċġ›|Ë)Ù R@N“(àöD“•e9wvŜ&dB'Á5'gċ}ö{(¤rqf'nÊA\eŞ/ÌÏ"ӄ ¤ÑO‰§ĜPTŭ£E şhÏMíN²6ĜÔgäŝûahŸ|ˆN+")ÙLq\ış]Á1@zJudo^rn'F” qݚ)gT݇1vä‘İu=?69ûÍÓççfDB³‹ûĤê!0 Ï5 H—F=Ŭ3…B!7::Z¨×ëĠjµ:VĞĠÖ‹Ċ­…BáĤÛîû‰{·?üË;~´Eßzqq7F.*( ÒÙt¤›^2Ók–ĉ€÷‚Ñúqƒ‘ïÄy_ûr„ä䓈Ÿ˙ĵܵĤôlŽ“gÚívj~m·ÛÍ8ŽĞ:ı(ıißÜbtqêè¤ßœešXuSqŭfX@*ċĴíŒ`ÀüÎiŝİMĥÊ;¤˘Ż”[ê½x›gH%àyŸŜ°à–ó܀U³"eklJĥ#ed6BĞß(ħ\Ħ™~b“ÚmeÜR*D z…§Y“Ĉlï[)­VLÍùíf„°›@1C âŜğß&ÈSšÈ=ŒLşoĤĤÈıÛşÁˆ<`¤NÜ9„ħ£Lmü_GO˙úäùÙA ÉĠŬ Ï5 H— Fi–XĦPkµZ~dd¤RĞĠĈĞĠjZqÇ?s˙Ĉ·ŝÜĥŻœ§'Ž4!!ò’Q„²G(zÂԎ;Ùtİ,NğĞ#ik#0púħ‚‘YӑïA=PÉGrj7Âçċc´ŻìݧÚíöQШëvğ­0 'HX×İ>⋎ › ->~贘>b|ĠĥÜşM‚€’R+ë`×wLéßmî_Z°ÇVA&`Ġ‰IħĤĴċÔŞìlJAşÊÊ^D褀2îIczĠĉT  ùYŒ|ßGAÙdĔHE‰T³M^ŠıXWSœd|’0Eú{D‘¤V3ĈìL` Rï …ÙÌ)΄!ÊR:ú÷#eû7Ĝ&2™ŒÜ5œ5]ŞTL5íİÄÈ"{9#zMsF­ƒ?òİcëšÏ}üèééŻOŸ9k@(XdBNGsÍÒĊ€‘X ŒL}DĠ­Èçó7żáŬżòàŠ×?ĵé‹ĉñƒcM¨n‚#‡˘O(Ħë#„YÑ`¤œŞqİúÁ¨o5÷rXÓyžYû=ˆ’dêYÏ|ÛËÁáħ˘ĝİ“° ŜÍ0 )ebüFŭÓP?(İ“RÏŻİàäÑSı™É˜VĴٖ߰H$HJĊŒê]ÍĦ·HOó2:ŬÚ˘ŒµÇ°i84òž )oo§bc#˘ìtJG°“ı.Û=3ZÁNEiŠ„4&[iҚ›u₍ŝÑ“41QĈ{ĤLÀlJj5CÌͅè´c(@&ĝOÇüÖ°g·‹ù`úÚġdLFİĉ€2áFê˜]‚3˘œ‘ FŒjTûELùÔÑġ­>yĝôì·§ÎÏN;@ä‚Q‚…uö3<× ]Œ´ğŸ/ê£ÑÑÑŞIì^_*•ĥċóùw˙›÷>Tġîu_|ħŬ‡àv‚"U_ àC'0x>#vk úÁhÀšÎùsòc0ˆœŻ3êŠ>ä™gÑŬŭl-µŞĉż×étŽ4›Í“FlĞĠjAM’$6ĵQr5\dJZƒ5]œ:6™›Œiċڛsë·ĝA,µúÎÊßÜ4‡ĴzܘÌD›I•Yíé˙§”ŭ~v ˆ4XpFݎ8ŭM²Ġ`š m‚LÓ5ö+élĴ݊ÓÊN=f+p"AşġVGš& tC‰f#Bc>¤N;†µ¤ d¸#h€lĴ\gä§ ı%‡z‡ÙżĤ3‰~ j¸yG9µġüÇŸžùöÔôĵ]Óˆ"ôJ½‡ÓÑ\³€t1ez‹vŒŒM}ÄDRÙP*•ĥK›ï}ϤmŻ]ŭĜŝyĵpĴ î&(y@YIí6Ċz‚R0bÎÀH]K`Dxò}ˆœ•|ȳÏĦûôg°µĜ:ĥz¤DğŬ>Òl6O6›ÍsívğÑív-%&!ıÈTäîMIÊ€&.´f­ĵ)·n³O¤×wà,Ê‡Ó ÈT[ĤŬŬ01ÜÄ'›.,'e×xèÁür´ÒÏ!›2t˜ŝŒ”‰Œ*NÙî&§ÉĠ¤-Ä2+SÌ"IsóšA7’ĴcĦ[YÙ&¤`”>Dè8£ °lú\ŻÏÈċŒ8#§}F­ƒ;úÈݵŬCŸ5]_äĴéÔĠ#Ÿ@žáŒŠžžŒžù ĥ4™ôî“ÍfólĞĠš3`9ŠşĊ&£Ä ÊᏭïdSĦSGNĤO²0ĠAo8,eӖ[„çÔÑKSĵÈâXĦĠŒ07 $ÒTdĤ]ê› 5ËaŸÎ(“´‘v³+£è3‚l:"FNÜ:€‰Ÿ:ĵ½÷“/žšùÎٙı~5]ż€aFsÍÒeݏ¨×ëE“Ĝ½Ò†¤VëcğúÀŸżíLi]ŭs/Ìàäı.TG˘š({%„žŒĵ`dWE.I7ÁYĊÙwEwµÀ([Ñ P^÷‘O &o]]|š£§LÄ)35 …KĴéMFj“Ñ…Vwî{Ġ”hcêĝdéüÉĈ&ĥÒÚM%•(‡"ħÂ2Ġ›Ĉ 2İ(Mb޽ĞTòµûiñY@ğ’gùvézOéÀĠ´ PwlĈ˙[@I4çCtšÉDibw}h'£Ì¨êĴé,g”úŒÈdÓ+8GháĝŒàpFŭq@.gÔFèUÓH€Ş5âĈ ˜8ô÷/mĝĝ‹'ÏëÜÌĴë3²ï‡`4<×< ].0Jë#ŞĠêêrıĵİP(ܸjÓġŻ{ëoĝ-/´ŠĊÏïŸÜ\tTĦäé·ĵp'#, FRġVH,FĈwbxWıvÜDŜ7^£á _ö}9mŭÈÓEĦž1kşSŽšpFÉk:w"’X\ĀEÀhİ?§k&ˆxêÄdyĉtÀc+·ŠuחIx¤¤´+1Ò÷Œ­çf‡ƒ}‰Uö˘n/Ô.ĠÂNż<§Nöë˜UVĈ— ‰t½óoêK9 "ȄÑiĊh͇ˆCNd[ّœ÷€‘ċŒ\Ó+gDšİÁUĤj˘OMÖ3½czeÇôjw“Ĥ*Ëĝ³cU?gd}FÜĜ‹‰CpmçÀ'œœyüül´˜´{FsMÒÔGˆœQnllĴRĞĠêĠjuMRÙ\(n\wÎ7ÜóüѝOÏ{ùÏ??‹ù™&¨<-íöEşĤ)aY`$MTL,ı§é52PâĞFB9O“9ŬgÄÜDĝìc^üF¸kĜ=?×n·öƒÑ|Fƒ›°o´$9œN)ä3'§*³§BšX}­Ŭ\`x¤¤ÁAK(ÀŞşáäÑÁ1ƒÚàUgׇĜì*5êKyZ$ÈÎoeÔÄ0Š=·€`ÂTèt4çBĜ>)”îù,Q/gÔFVÚm#‚î nĦÏȉDJMŻÔ—Mg6v=œ‘i#L'#Q­ëÉèȧíĝĜ“ÓOœŸkÎôMFC0žW ]ĥúˆÑÑÑr­V5Ċz› … wŜ~çßóÁ×ŭàĴÌ}qß:­~,Qñ%gMçâD_6ÊúŒz“ıÚqGÖm)uü_I0²yÔ|xTpÁžFáĜw;ŻÚ<ñ$Çá &èt³Ù<ßn·[A,FÉÀH]`]w!`Zìp§òÙÓSĠÖù˜ë7šÍ"”T=|8ğÙĜb[żšȁU·éô ‡Bf~µŠ:09AfÚÑ_AHb…†É›“‰‚É HWpY5F FÈ|Fà3şP6nx Ÿ‘›M×ï34qşĤcòr@­Fhĵ€‰#]ûäcgż3=ׂÑĵ"鲁Q½^wğŒĥ …·úÎ7żĉß÷ê'Ĥbï+ûçt$ĵ(AEÓk?Ñ`0’ĈŠ!0ê—u'2{ö_q0J£€Ê{ ßwN£ûô§12µğyÛĤ•OÄa°ß¤vOš ÔV†ŬKœŒ.†7Z.-Ċ)uĝÌÉÉêùm›ĜŠ5›ÊšSJá‰ ´ç&•µž!K>Á€"w gŠúR—mĉKJĠ&³ŽR0b&3 Ҟ n;ĦùùQ twY˙O–ŭf<=ÄĴŒ×§ÇgԟMGg¤ġíXX!AݐbAÛ(Hpò˙\ÓĞë3b0‘€‘âĈs˜8ôİëş˙çgŸ™›?×FCĵ"érÖGTFGGÇŞĠêşrıĵP(Ütӝ÷ŜsëO˙ú­ß:Ñ_Û7‡°#)Œĝé 9/5½z`äfĤı`dêĥ!é3ZŒú×tWŒH „µs‡ŬŭV4^œŬħaâ;a·{°ĠjÙ ‰éN§Ó´{‹€Q‚ĊŻ—"b¸˜³(§¤ÎžœĴNŸìbtĊ6r8TLàde\ġpC&µ`Ye^šĈœ‰ña"=,` :ÚSÔl„h·b°2]ìÈ|KÙdd隁œQżÏȋ#+÷NEf2\à3˘>Î(KíÎ|F´x6`İ‘š{+ŭŭ5?ħ˙ÄùïÍÌ5fÑФNF󊤗R!`ê#FFFòµZ­ZĞĠĈM}Äġù|~Ç­÷ŭŜßñïv|h[|çpQ#Dž)­(úÂÔGè A`¤Ü5]Z7nÉ#„~,`@>Aĝ6 èyOëâÓg·?ŜѵǚÍĉ™f³9kÀ(Œ82AİKÑ…Vtj™`ėJ 8–B Îž™=ĠĊÄŞX³ı@äKéüиÁŞÍ8%zĞtz2Wu•›‘G6ĦÁ†ĵi ŽQĠĤ#&¤'’N;ĉf#D)3š™ ]FÜFfD²}ĞfUĤÒ =2>#§Ŭ˜İú|F`â,(ĥ\ÏġYΨßgĆ3b8>#JĠtÏaĊÑGŻiüĜçż73ߚ]ĉšN /Ğs-ÒK­l}D½^ŻÖëġñjµşÎÔGÜtÇ?óĥM÷ŭÜöŻjwöÏ!iEÈ%Œ‘ĵ@ÉŠ@΂‘X|2RfM§ĜqÜóÂÉ(UÚÙɉŻ‘ñ /tċxɃ<ŭşO˙ĥx³'7ŒWÛívµZ­FL³Ùœµ}FN…ÄbœÑ oJ`´äÄÔRĠùÉİzë|„ÚĜ 0œR JFş­˙^ё5*òßwĵ›_GLĈïCşŬôMÄBqÌĈSf£TĜÖÏ‘Ëрl:Bş{LÍŻŭœ‘#zÊġ.–3Z”JÂŞfMwä‘ĞŸĜüÌwgĉ›C0žW$ ]İúˆ­ù|~Ç~ú—Xu×Olŝòŝy|˙h*VÈ' #ĦèÓe”%0ô^>{Àˆ3Î({ÓiÍiTÛżgIÎWEM'D*b°iŬTˆ<ŽàéÏ ĠèÈŞ‘â÷şŬîacx=ÓjµfğŬn;Š"[·ĜTôr£E£‡Z]>wjŞ6}ĵ‰úĝV^³İL”ӝßL6qÁ”X”@ĴJ!ÍĤK_DpĤBK‡ hñöé‰+è&h̅ˆCi6sşÜёSߚn1ŸÑ >£ŝlş…vƒRÎ£q@|Á8 ="ÎhîiLŝÔŜ5Ûìì3sóç—Á k$†çš¤+Zñ–ó[Unğg—6ÔñT;A!QÉyz2J‹ġÈԍ÷^â™^•äš`Ó˙ÇÜgŒUWg26È3•ÑĦŻ#Ŝó9uëÊÜzÑûĦdréÚqGRʋQÒ-f~tş“Ñ’ß§)İs§§j³'Û¨Olċµ×WHĝYöEX2_ƒ AĞé[Î(íD2Ò:r"Òˆhî§ŬŒnĈP’5QdVb„ 0ú ƒÀȄ šğĜ6f}Fn6-ÒgärFäpFä€ ⌈<ĈHxnVùÔ kڇ?ħ÷ĝù'gç—Ċ Áhx9@ZĴ>b-ğ>˘X,n-–J;ï}Ï[_ğĉóûçñÜÉ8T(Ĉ *!İèݏ >œàĊÀÈᒤYÙÓgĞ:e•xWŒ|Dž Šy€Dż ùÜ’ÛÖVž-yĵÛ$vŸj6›gĈ|(ŠÂ‰ŬK1\¨B˘‚ıR`ÔÏ))÷ñԒz}7:{ŞCc+oâĠ›‹>AJP&p Ŭó`í;leᆓIİaĠòˆvÒ$E’šA7IUöÙzÏ]ûšöm¸uċc/ÌáÀdŞ#Qf…² ”}‚G†32]Fè_Ñġv³F=ÓODîŞNž>\Ù5ĤÊENgӉBĴšˆö~´˙ĞÑĞ6Ž>ċsòĴiy=Ŭh4εÛíFŬ‹ I]ĴlŻżÇèz.8ÁĴïÂdzòÌXû\@µÑxġĈ˘9)ÙtHE†[˘ž8 2÷ĴVşÍFHI,MQž‰Ï³fĠj:‹IÏÈ~žŒœ_f°ÏˆúûŒƒîhgDYlRgäHğHä5g4ğ+ŽXħmüħçgqĝ\ޝ D@™ĵ§ë#D/ñ0ÒïµÉRINĞÒuİPöÍYĠoWŒrún˘œ<‚(ĉÀñ4ÂçEîÈwşğ6NüIôĵI_8m*Çç.£K{Œ–3R‹Ġ£ĊŝĠ–è&ç'όNkˆúĜġjĠĉ*§ d†sñÎY…„² FJ2Z͝VV ûbsë¤ğXiwOuşċŒŒÏÈċŒÒïípF´´´{Él:£Àc"ò5g4ûVŝÔsĞğG?öÂħ³OÎ7ŭMŻCÎhx^€´œ.£‹­¸X,nŻÖÇv=ĝŝ?ğ˙lq]ŭħŭs8vş îJ”PñJy9aÄ #İTĉ9²½5ÒrG JB÷ħm‚5+;´_ ˆ‚*BĝÜ?£|ê­Û6ĝžŒ‚}ívûxĞĠ:e Ż0 ]ÑR’îkŒR0)iIx˘Âdzjjtĉx ġñëyġ–Ş9‚”VMM½j:Îê˘TZŜ—>0“H{‹Ân˘İğl:AÖF0œÑb>#r"}>£†>Ÿ‘kzuƒRŬ>£~ÓЛڝqF³ğħòß?ğŞ{ì“Ï?÷ƒùFsƒ›^‡`4<×, -6 £ ÖGè’×ÚÊrıĵħX,nŻŻXŭŞß˙‘·žôVV?·w“Ó8”¨zÔÛeä€QŞMi02ӏrÀHŞlZ²ë:½²”[şb`äyŒá5' J9¨Ĉ1ğ?Ñéĉvn˜ĝnt˜ô…ÓÍfsĤÓé´ ġë RÑ]k`´Ô¤D–“é3gĈĉN´i|ĊrĠĤ2‰AŞ´Ï)ŜKù6İŬ:‹ù“X‘ŽJ@Ÿ$<ċŒÈñ™-›²j¤ı¨LŻĥÏ(ëü[ÀYgq@KrFÜÇ v5ŬÌnĴ<úé}ĞşG?ŝüħs?˜ouĉ‡œÑĵÒé$vÔGŒŒŒĴ2ġÛÇÖĴġƒï˙?ï=¤Fˏ=7³ç V¨*F9gZ^=F6 ˆwċ5;‚ÛîÙ+ív€H9\“·Üírƒ‘^Ïċ|PÁƒ(úHĤ^@÷™Ocuçèù׍}ğÛíj·Û'šÍĉ¤ FRÊĜ£ċòE2½âeFy$÷–k+DÉìÙ3cí³Ô·İU›Ê ŸÈì>2£Œt˜ƒ:í­Ft e>×gGMGgD™Ï¨‡3"g2"ë3²˜B< (ŭ†ΨżÏÈċŒÈáŒÈ6ĝ‘—WGˆfwcċÑGö­ˆ&˙× GĤžœoµCÎhx^i€ôRë#<[QĞĠJ£££ġjµşşRİl* 7ĴÚtŭëßú[yóŜNħĝèžiÌĥP$QaFÙ(zHù˘K£Ŝ4 8)@9ÀĜ­”âËFÔF9OƒQQ>œ~ÁžÏ`#ÎMn^YûI_8a˘€f;N;Š˘ Ž˜™%.-—îB>£— ]ˆSâĥDŸ?sflĉHCÔF·È•›ŞÂ+'ÒĉÏÙ !(èî+–L­f„v+ÒkRÀ5Ë:D‹Ğé–è3Ê|NÈZ^ipŸQ6]ö9 ¤ŬL|F=Òn½ŒôÁ•*‰™bċáOíYÑ=ö‰çœùA£ÙZĴéu¸Ĥžk.[}„é2YmBRoXğíĤ7ĵċ7ŝä{ĉDá {g0×L@‘B…r^è( %ÀhAj÷b`dÄ Ò#e.Şg‚â4ÁᲁC^t—‘ïAuċxròûŸù o+vŽ­­—ż×ét0:Ûh4f;Nk€á5ÁÂB½úŒ~ Wb]lߋv˘âpúìùñ™£MޏoîŽm"GúNµë6˙*a-éîÄ tÍÛ[qî\Ó+-ÒgD ×tYHĞ£œÑiwġ•ë}>#ôġiP„ %ÑôħêÄ#{&:Ç˙żçžÛŬlµçûĝ"û6£áıfé²$vWĞĠüèèhĊ&v—ËċÍĊbñ†ëvìşó_ŭë4ÍıŻ˜Gc> FĦìŠDgä€Q† Á(“t÷ŒùXše׳ÓN}éx“.+‘Q^ĝžŽ*z@ˆ| ÑÓ˙¤vŒÒÁñrîívûp³Ù×Úœ]wÛëo˜/'iê5ÄŠšˆ£0!r9GŒlĴO–MG.-ËgĞäËĈö`„Ĵ\½“úÀÈñ!SÓÙl:²áv  ‰µ3_›½óÌg÷>óD£Ì#+×[ Œ†œÑ\ĠżÀ¨Rİjµš[ħİP(ÜpŭíŻżëŽŸïíß=ŠŻ˜C·•€b…Şİ/ú„<`dŬÀÈİ î#9`âé‰bNj¤ù$6­°V~YÁÈ3î(ĦYQôJíû${ż,o[S~äaOĞĠ:j Żç[­V1ĵTY÷µF=ġ}Ó`bÖN1€Òh­ĵê?ó˛ÏnĜâ:Šˆ˜âH˘5qËìñӓŭ–rFÜ;ÍAĈı}FÜ#í†ë/²­V‘×ë3rúŒR"ÊêÎÈZ•ìÄO°S(Èvĝ27MĵíŬ#ñ_żöä˙Ï·qŜÜNî›ÄBßÙ Ï51!]0ŞĠj³ĤŻVĞkm}čoĵçî]ïŝÍ]ß9ˆŻíCM c„€rÎCÑ#ä Öt.YЇ&0 £ŝ›ŻË&#ŭñË F$˘àC}€;÷~ĵ÷+ñ µ§óÏ´Ûm›p΂рşñ Iğ_)`Ô˙8ìç$=ÊġÑÚÖU£ğŜŭ§˙ù=óŻ{÷Ğ0íA!q˜PĞC&RDz]wœú8#MG‹Jğ3Î}œ-ÂĦ3˘Ùt=}F&ÎÜäŞRӒžÖn0K…6zjlûÖĠ%ż;>get°Pİ^Ĥ÷ġ éʀ‘[QŻ×Ç ]ŸÏçoşċŜ·ßwOüÊÍß<ÙßŜ?(” Ä1J9EAşXo`dƒR— FÚôêĴëÒ?Ûï{ÁÈ7iŬP)*xPá ƒwĝ›Áí›&~(LŬ¸I_8? nübb€^İ`ԓŻß¸|š‰WżëCù›ó·˙äë7%4:lŭiq$ÑlÄÄR„É^èOû†2z|FŭœMZMÇ="=10r8£ŝ ‰Aœ‘00ġ„½öĜt/ٞ[ Ŭóċ ûÄdÈ0D‡ËĈ·Ŝ´j4çĠ[ûLÍvÎ $Ò\+€ôRşŒl}DÎÖGÔjµ1’ş5ŸÏßtûƒïzÛĉ·ŝüö9Ú˘ïî›EÔI bĈˆ`”<‘UŽ0˘ ‘ê‹ZŒ`8$vüH†W2i Ì/ŒÈĴç „'´Ç¨èAuÎ záQO|ż½+3ĵچ×sN§Ap‘é ‹qE×:½ŠM@ÎĵŻÜ2QŭŝĞÌîzûëżwF‚[]. BA…¤f3&VĴż§žVŬ*ĞÒ3ġİé\Έ(“cÓ  TYވÌdDÊġhÎ}}Fnş‰Ì҇H &ˆżuïüVżé§ĥ|ġ<}˙pI;†P„ eOçÒ<‚O”vıOċœ*§vœ— FÌP0òn€ĴÈÁu'0bÓe¤'#˘  š§<ûYŒœ}Ĥħóş‰ï%Q°żĠjk4ÖcÔ|‰é ƒÄ ‹ċÒ] `D §"ĝ*·­(½ú§?úw8żë'Ŝôä Ñîòˆ'¨ ˆ‚@˘ÙŠlŸm˜ċ”ŠqïŻŜl:ĥq@}ÙtÔtÚÊÌ;}FéÔċôa‘>#˘ŜfŒ´\}ċzz¤#³ĥc Dħ/9$„ $ـÒÎÚÙ}äĝÏ;/\†gx^ö€t9ë#F0ÚV(vĵùĦÚû6|éà<ž:ֆlĊ TÁ(ç=!oÀÈ[ ŒÒ5[6ĤWÉú 킸WQ§z3ì2^IÛe##ëĤr˘äC͘şñ֋3;֏?t;Z­Öñf³9ĠjµR0’R&KĴé.Œx™`„kŒ<µÛV×^ŭŝííí÷qÎ#Šƒq™d}óŽñ‰znCìħshœô=ׇgx^v€tħ>£Eë# ­¨T*ë‹Ċâĥ|>żž÷;{7ĵ~Í_làıc-ÈN’ f”|˘§KġrÀȕu£”RQYH*zı#ĥ“‘M€Vî÷W—F䀑Ĥ:‡(ĉ Éé=v?‚ġrêÌÖUġÇ;Îa“pĤĠjÍĥÛí–ݏMŬĝR :ı,µžğŭ½Ĝ*–^&`ä›U]ġö­×Ŭù“úWpö–‡ßüs 䉜ĵG Í·b·ċÌ ûX€Ê¸£E²é0ôÂYÓġqFéĠña€ÏN6Îz|FÔ+°÷CZÌD°›lA‚„-öG”óˆŠà‚GˆÂóqٗµÍŻŻ×áĉ皳èMÁžáyY-ÂtiġċòÍ÷˙Ĉ>_wÛÊ/ìĊŝSmÈ@BEĠœ@Y6½Ĥ“ l QŻÇÈr==`”•éI*nb·rÒĜɰcÎüHVÇ|‰`€„{•D!Êû€PHĤžB¸ûÓĵ%ß:ı~Ĵü„é1:áԍ·£(ŠŒáġB‘ÂÒÉ |{,€è"ßÄd”PÙµ²üêwüéßüÁٝÜġÔyF-ˆxEŜCŜu‚óí$ġŽé”ï ŒX™T…TıFY\/g„q@ŭ>£4##ô‚úÀ=`DÜF:­ÎıaÈĝ!A:™Ü³“’ ò=œ'(ŸT=DAsQ‘dmóm5ßß=ġâħž‚ÒĵéJÔG\W,·Ujġ[ïï?Ĝ\ħ}üħŭs8|ĥ ÙÖ`T“‘ ä}Ÿ*Vr8œ— Fi1Ÿ#íÖü“Sܧ<t– F$Àıhĝ>DÉċ’cßEĝô?İkòȊJŝûív;mx5Ġ(Šlër@GaiÂrË–KĦ—Rŭ`$äTv­(½ú]ŭożwöևî~êĴB=ŽyEÁ£œGÔ %ϵJy@íAcEF,gè™t fĞÏŬ>#ÛêêĴëĜ¨Hğ{M݃ÖtÀ€l:Xċƒ­0ܳŝ€ùŜfJ""°H‚¤iKä ‚çPBÁwž K$G6Ŭ:1>B›˘ŬGÎpìşáyÒrê#–£úˆĠjġşBĦ°½ZÛġÀû>|˙ùêu£>7‹gş]Ž%J0Ùt)yúIĠ#(°4ŒÒTgU·İĠT aÁÎNF|‰`2`D$]Żn@<)Ħù!ç r‚â à™ DÉÈĤcġÜuÉsGMssÈ) ÏːŒ. Œúë# … ġĞow>òÖSŝŞ‘ÇöÎáôTÊĴé Ê:“‘·PÀ=i/ F6(5¤#ċċƒ·h IDATŒ,€‘灅f“EÎċ<°j#:Ŝ/ĊğÖVž- µÇ–ê5éf³Ù°“‘‘u/wg_É24òĝ?ĵ°Y\ècKMjKqF#·o½îÎwüÉ_}hjçCoyêc,‰yUÑG^u#I3͉RP d[7А8-`Ô¨Aİè0ôpFİn€ÏúŒÌ× äŒÇÙÔî^”“ömħ½wfêK"A΍M "ґ‰Ĵ<Êû‚‹@˜ Š~<²ċUcc£uâĉg[CNix~Ĵ€ô’ .ġ×GŒŻŬpÇï˙Ƚ‡äXùħçgpĉ|– Ž~˘PñMPŞOÈ ‘ ÜÊŠ™’4¨\qŸ‚.#zc.…3@9O'0=0ZŸ{ â7Â]FŸ2zŬn7£évğŬ ‚ pÄ jG´/–XĠ-Ç7v%Ah)[jµ7˜3úß|èÌÎîÚ}Va\Ĉĵ²à!'A$1ӊ'Ê&¸S˘'’)‘Ì:—P̤”­/g[wnwu Ĉ 5ġgÓ!ÛêêFօċz<0µĥ§ÂŬĜġôYΈÓÔnëOJ×{”NIöĠ9X$OÙ ù%rž ‚/…!f‚"ÉêĈÛVÔóŝĉx÷‹GgԐSž ]0ŞĠjĊħħħÑjµşÊÖGĴ¸nókîïŸŬ½·[*~aß,ÎOàX#b Fœ™ŒLı9Ê!ğÉÖiVMǎ™Ġ#ŭÊxI0’ŭ`äŝèŬ _”´[P^€r>ĵRžG¸çŸ‘?ŝŬî?RĤáĠzŒ u“$ħĠʝ[ŽİKĴ\q…Vqˢ>Ö˙ĝ‹rFùwżwfçCwï>§0bžÈ{”„0‘˜iFˆ]˜HF,%’‘H&)³Ôݘ2EİÔxş¨Ï¨‡3ÊJŝĴéRê"†úŒàô†Ĥ,2(šR J]½™Ĥ"+Ĥ´˙8eM~Ȟ[ÂÈ!|Ÿ÷EŬ.ÏEJŞo˜¨ÑĤäé£G§‡œÒüĝé’Áhtt´d&£4$uíĥ›^ÏŻ˙ñ]ÏÌûş>b:Ç *à(A9ïĦäOÀ'‘‚‘÷ĵÒËToTDû,FÊ0ôLFì\Ñ{zk.Œ@Ú_aâ[<Ġ>ıÏĦ2ġTë֍+žŒ‚ÎÁVĞuÒQÒÙêˆä%€Ñ…¸—ŝż \8UC`ùŞÊċÖr_ŭĞ`ğ˘Ë8£U#Żyç_üíïOî|ĝ§Î1&’ˆ'òš3ŠEÓ͘ÂX‘TLħdJ¤B"™’”H½ĤSŠ‘(ğ²³`D6-•–àŒÈñÁĝŒÈ„ ’;‘‡3˘…ċzL}DĈgärFİš.ëQ„<Ŭ-RRŬ´sb˘žß¨ž?vìĵú”†çŞÒru .\Ĥ>˘066VĠjŒ6‹Ċ7ìĜu×]ïùàëtı/ïŸEĞ-Ħş‰ö}D B ä ž£ì'`vKöĴšŽS`éġ݁â…~0RwÉ1½^ôšˆ@Ù9†àéÏ`ĴħoîĤuOöáf³yŞÑhœm6›sŬn·EQÜF‹ġ ÊEx˘A÷ŸÀâM½´L€Zì{\XeG9…û ċToßşñÎw|ĝŻ>tĈpFqÌ+ š3’JÑt3B'”š+’Œ$QfBbFzj’iÍ“ŒŒ°aħ TË‘‘ˆhΈݐ %|F´gô ˜e]p„Uó9Ê ‚ġSÙéÒİÍQf ¤í´žċ|ŸĤƒ˘W6żjtĴ^ş.wêÄñ3CŸÒ\y@ş0"è–WŻZ­êġzɀÑÚrıĵıP(Ü´y×kßô†ûWoRú_Ŭ7‹n   $8‘$P6kş|!²5]™„MßΤÙn§Ñ€0Ôe€› Kv1YFD#ʈ.ò<ÀP³ûì~kċİé­Ğëßïhñ‚£ùN§Ó‰ĜzŒ.UνœĝĤ E:‰‹|£%>ĥœ êBıè#ôšŸü°ñSO"^Y‘zâ™mĊhĊ²ŒĜ#rÁHqÊÑ˘`ÄV͖‰ÍĤğt0B/ TÓġĈQï¤Ö F “nòô²›´'wÏLJd˙c>‰:OÇ,ĉ-§Ô 0Ó-PRÙxëx=ŸğžŸ9tôĵrJsEŽż‡„ Ĵz„ïû^½^/ŒŒŒ”M—ÑÚbħ¸ıP(ܰíµozómïŝġ[ż}²+ħQ ´" ÖĞ6HF!䄀-EMsú)sËÛ 8+€ĦRÎGġx.ŒĜáÜ˽e È˘¤~p$èAHċ|/ŸÙhïc¸Ô<³Ĥ^{ÛíNvğŬé ZI’ÄD„BĦàçóyffˆ$IDÒüYÙ?‘rŜ+Òџ „JSV"Uב6ĤhğçŭÀ;v‰˙·œŻo(‡a(™YĊq,ƒ Qİ0 WS •EMYmĊ;~ú/˙ÛïMî|àUéšÎ76ÖıN‚fTÌ}`F¤³Ôòov8#²j³Ĥ>5;k:6ï-0zSğĦŬ>VÀ`& FÜgz…ÛgDYŻıËq–ì Î8#ƒ]œžÒġi_R3`ĤÌ~Q¸Ü)ó ÊĈA³î‡d!•˘‡ĠEâé.OÍ £oŭ­7'Ñ}ôñ˙ŝµ½ñ!èĤY÷ñ3Ĵ­žË H"½ÓWÇı\.í2ŞĠjc•JeMħXܒÏçoşù-Ŝ}Cż¸ëGÛôĝĦ˘NÙIİÀ‰V°ùZٓĠG™TÒ gF1ˆ¤ ìÊNÚĜŸK#'K†íkEvzpR28#êq(y RˆO> uË|c=9½Ş^›ìvğ$IBœËċrDT.‹9‰>Ê!„´Àcŝî~Že@ €.—}=}™ŭı™Y*")eEQÇqjµ’0 ùùù$ C5à1çġñGĠÛVUïxן˙×ß=½óĦ{Ÿ:+1Ç<^È3™Ù͎D£CÊŜÉ(‘€]Ó)ËĦ—3RİaĠÉĤ"ÙtfM—šKĝŒ° Ó+RWnż´;0ô}]ÖÌgżÎŒzR#Ìד žŠuŽ˘I:a‚.‡âôëà<„ T >Ż/Ĥğ<5W ÔĝëoîĦ˙ŭ?ñB"À‡Ä”†ç%-ħĥ¸Ëċr˘Z­ĉMËëXRYkÁh×ŭ?ġÖMoŭÙm_}ħAß;ÖD҈ X³­JfÏĈœo'#s‘W ó$T”vé F?ğOÌвK˙8Í£[Fŭë9Î~AdNGî0J›Ç}$ƒDuü áŻİ+½Ó#•Ĥ”R‘ŸËċJD4šÏç‹0íœ.à8NAìïĦ>ZxœËrħp· ‚– ‹˜9TJu’$iÇqÜ, ­n·ÛBD³³³‘3-рu]y×ġ×½ñ'˙à£ż;ıóŝ;t–1Ĥà›şV 0ۊ8’ФâDĞé²ÉHA*°ì0Ĉ! F”ÚË!Œhħl:§\Œ aÀšNK¸Ŭr½“ѳlÚñ—JLÙİPrDşOɳ›Ħ͎O (ûDf&3iáĴ+ÏxħLd<­BHэóOÎ \àW·Üèîò?û˙>çÔófR˘!( ϕ^Ù \Ġ•Ëċ\­V+ÖjµZRYY*•6ċrı›^ûSżĝàŞ7<ĵċËĉñ-Ȏ„ •&Íĉaë7`Dx([›ħë–7k:pŻ2n~$Œd_ĝŞUÓÏGQ§ŻŒœÙŠ\/Ù#°Ĥ#ôÄ äŒîÚ3ıAħ etPĴôgÖ#û2;AĴ%Ħ“Z*—œġŬl0zß/nğQ†÷ÑÇ˙ûמrJsùiıA˜”ÏçŭbħX(‹#ù|~e.—ÛôšŸŭĠ‡ĞŻşgÓç÷Íâım¨vĴ#ŭ%/#³²ÎVräx‹\Yy,³³Ĥs‹òĴ‰ħg%·1zžĵpTPÊ}Î8O íÎ4 ¨|€$à BB%˙d˜÷g^$!Cĝ>„g&œ–µû€Mbö 0yH?σHh/|Ï̆cSŞoHñ2ë=Ë ¸‰29|˘ ô É ë<7ɀ”J_Ôéş+ŠĊˆ¤­Ŝ`èüèlm¤¤‘žyK'Ò;³P(c´XĞŻ^³}íĝ†·Ŝ>³ûÛ/ŭß+T.—KŠĊ˘ô}ž+ûxĞŜ²˘rûOŭù˙ġ;“·<|÷Îh5ŬDÁ#ß\žĉÚVQ—Q"‘Ĥ0 àŒˆ1ë˙Ÿ÷N"ĉg0İôâÎ}>#vÀˆÓü:çŻÊġ\5Œ(m2ï5½ĤڅT@AéÀĊ}`D6§ÈŒĴ ‡m:3î)&°60Ż·˜Í>O1{fúS{ ß "TŠŻ™(Ÿxò˙oïˢä¸Îó˙VUwÏ ‚À @€ddI¤m”dQ²dûX›#ïŽe1>Vü䓓srNüäÑOyIžĵ$‚DÙ&$’²$Ĉ‘IK‰ @`ƒÙ—îċŜ?wİ[ĠĠ=pÉşç 0k/ĠĠ÷Ğï˙˙û—†7ŭòW÷Ŭ |üċĦZSŞ×ʐŞÌ aĞĠj6ñ(Š&'îĵûîÑğ?³ïG/-áĝtœH FİK-ƒQÁĤ.ğŜÊżÚG:ŞN›#WšS9+bG—ĵ·LÁĉ˙Œ %<ŭ)™DğtcN‚ D@„‚@ „!ċAm‘@(#“KQân X(ċÀ‰BJ$r–‚Ê$”6;BĤR²DjĤĦ€,•H!I%’L˘+ŬXĦg6şÈ2sûÊCk_83F†âÎ÷M6?ú[ĠÏ֍ĈZ†ŬF£‘ !R”0tמ[?öĞ˙ñ?˙ÉÌûċ‡Ż(lM3žhÌ4ĊÀj'ÒzŠLúŒĴfD2ò>#EìĴŬeƒqÊ ÖŒ Ùt(Zğŭl:Ê)‘Ÿ0°ÏˆŠšQ~ûVk*Yğóħ–Á:p´qDä/™÷ÙRĥJĴ/™Á‚\`+3J€•BÄ @P(˜Šx×vàò\—§Mlù?Ü{GüTôƒżxòÈеĤTŻë^wá÷ôĦŒ5ĈÇÇoŜÑl6÷ìŝċßŭÂĠĈö-?9³ّm $R3#U#@§=şA{"ŸĉB– ħr •'(Xs÷€òŒ›£b,÷cFLçĴfD0M!f ³@£‚}^$•N›0ğ))†P Ê$Hħv21ƒ22Rúû$µî&Ĝ|' Ì÷95œ.S9[҉Ħĉ¸{Ì4ÍLöƒ2éJŒ@ "ĊˆFF“€ĤZ‚ġ¸x(´ˆÑŒ–h²Dúö³8ƒÊ2ŭ’T`’êûÎ$XJ}Ÿ ĉDD„ùĞ—'n ^=-eĥÇñz§ÓI×Ö֘™‡ß·mèžŻüéŸŭûÙ|ŝ‡gnÎt6]H6‘€‰%ÏŻ&HM#ΤΤëFìġÙ-—†ëħĊ /ȖàÀŝm.(Ġê)ÓÁzólş*Í}F쁑3Ŝ|%W&´żdÀˆÉ¸8?ŭɑ­œĝÛ'gá³MĤ‹"ˆBÒ}JŬ.ĉ×[”Ŭz×ÍÍĈè…3çfë>z]? TÇĥĝ@ä"˙ÇĈĈZ[†††v4=#Ÿĝò§^i7s‹1Tb›^ĞÁˆĦŬĤa ÇIk€eŒ|BċT-ûñLĊ¤Ï n³é€J0rÍ2\]ĤË{]­žD…C­)Tdœ‚.…ôRbäzÑŸ„R:…‚Ù¸n97z°r dÇU+69Ÿ`8/ŬċC›ô×z76`ä}O×4íìüï3™ï|m)şô¨§óQ`>„@DŒÈx#€‚’˜Ü°AşÜ&p–@LHÖ.[ĊâB(ۗ“$YY[[KÛívôŜ-ÑŬżù_ŝÛÏŜġĊOé2]ÊÛEŒiĈ˜[Mİ›(’ŞÀŒ¨f„^Íèo„DQ3ê;^ÌĤ£mB3B1¨ÒÚ탊MŻä1#{ÍT£\#rf;€ (O Ï#‹V3£ĵÑÖ]­ıñD^é€Lá–ÔEa@q§Í ë ʆoûÀÍ7ûÂΝ›•uö]½^SÉn³ ΁˘AD-C]„´°Ce ŽUf”{4“`ÖÖnDôU§4µġbµÌ–Êċ;½Ż²§-ÁHı’‰½âċ<~¨\ŠCıו › ĴIùƒ:‹µN)5}9µ#òJiBh“‡ ( ‡@,¨È µß `!ücÉÂGħ Rŭ#ßâî'Ĉ𲐀ˆĦ`„Zß !ħÖÌȅNĴÍ+ŝíBٛ`Ħ Y‚˜ÑI19D4ÌÌ#RÊĝŽ­C·ŭúŸŝÙż›ıëK÷=}EbkšÍ͐³ŒĊr;E;–lÀˆĵ>#V 4 ÏˆŬF^pÓ9ğíúŒ¸şÏˆó2ŝ.qUúĥФQŸ.eÓġë3bvY¨…ĤWrXÁEƒ-Óé'}†Y—·ŸNN]2w Ĝ { ΄ĦK f7¤6 „&or¤%xÇÍ-RW;<½"şùs_Ŭ·ĝ,=—‡^hŸPkJġzÍR¤[ ‚À ˘KEœJ­QŻ&9%)ijvĜdHes(–Ùü‰ÊŜĵùœóœħċ­GÜ[s.İ’fT*Ġ˙HÙoQİXÁ%ÄóJBĴ< b€ôX)H0 ó1À0ÚhĝDi_à>ì˙&zZoàœXZ[h0XPŠ‘ İT…á°SP™ `H%[’ċH’$7íŜû…?ùŻ˙föƒ_úÈSÓF„· …u›!ÂĵڕXZϐI™—éül:6}FìiFċ>#öÜt…ò­§ÙŬ—ü2çĤsNĵR™Î$)wŻ›ŽK}FĤ)·}ûİŬèâ ÍÈZÍ}ÍÈ ™¤òœß֘AyÔS~‚2 ì$ a§nHsž °bf%EÌ€8X7ÏĥBžÜÚÄċĞmÀÌğS•Gërżò;ğto{U`ä;ë%ͨ'Ž{ ̨„¨áààA_neWduO"Ĵ>˘H—Í^ŬÄ$ÍAé# Ħ“ •"¨Pè̸ˆÑÌZM´­ĵĤ™ü5yvy•Ĵ˘$I†‡’µ;~ñ˙Óçîŝâ=?–hvbŜÖ !HOwµ•ÈnĤhÉÌ62#$úġ9kwŸ>#ò yT^ŞcôfÓ ÖîÒ<£\3"ŻÏˆ–銚ċ#.zúŒ|k7ċ礗•—kF–‘yX–ĈŞ #Ĝù~äÀJ?v"+ç‚p Íħ`ÒWPŒ@W…) 5lkìâ:O/ ĥ~ĉĞ{o>'˙×˙ĝ§şuŸR½ğd7ƒtFŒ°€î,q=N„Ác$!˜4[ÊGŒċ=AœoêĜkvнħ=`T3ŒÔ€¸²„× Fä#Ï¤¨Œä€@`KÂöUéòıêşHώ=z‘Ff  ,Óġys"Ğ·î˙-Ğİ‘Ñ˙ÌÌŞ0ˆጓù°OZg fÏ*ÍDYŜŭ™?úï_ĵçËï˙éŒŻuxĴP@`İ´ÖÓ]—ÖRt/Á{pŸQ$WĞF“˙żLĉ—éŠ}F\`FĜŠ TŒzm 6 T-¸ït“ı—&,$  íŝòv%V=ÑÙLL &vÇïMWŜcÙêŒJ0b/µÛ#U@Á‹B\T˙· ³?гŒÈcs”ğġĜ^)+`ÒÇD‘aFÌ6>Iècaß#„K"{ÁpeE˙䉺—* ħŸšc•”„,ÎbDñòÏ˙ŜŬğtïoÜöÓËñJ‡G„ ÁàL2IÏsżÖΰÚÉ\N]ĉ ×ë£ÑkÈĤcßÚ]‘MG0*öĦ˘Ï¨˜MGFƒĴÈ´ëÉĤ‚µÛ“•`äÎCŒĜx“`d_/"}Rš>%­oş¤™‘뤓’ĥÁ=żŻ(,AŻñôâñÖÏ}u˙^ÏÑ·˙òŸŽùš× TŻ~ ‰ú¨"=e;ŒrPb€"‘[rÎħ~›ÒKÑ6&”'À”Ío̘•êĦ”À°q3˘ž>£œUŞÀs*3>7†Ĉ^+-+3ŻFÙ2Ö1WítœÙìĵ—Ñï~`ä ĵì@ßAĤœ'•ÀȰ#H°€Ê°%›}żŝëÛ?ö[COMKÄËÈX! b[–$¤™r“_•”TZ"‚Iíĥ`Ä:µğ2›…†\3âRŸQ?f䏐àR™Žm9fd½×şŒF$3‰äèı„Ħ^7r=Ȗ š!,ĥn:Œ|2·M&àŽ]¤žÒg;Dĥ~ÌşyĜN“%•ÂD$(ïÁR’ ÓlÙ8’ROáµnqÙ]é…Ñ&núìŜ~[ĵ/ĝÁŸ?qĝâ Ŭ ĤTR½6Ĉöü‚Mï¤,œ(P ÀYÖSĤ+~ @R³Öe;˜ô>{.ĵ˘àžĞ#ö+sŝ1Ê%E.Ì\BU™ÊÀ0Œ ?3 Èù<ˆ½ÙhĥTböm‘#¨vÀ›*‰)ĠÙ+oe$%)à͍Òù€îaÚÈ!/|C0*1ÒB:†‰’J§3(gÁÏ˙ÈmXPh/’.ĈÔ%|ñ AüÉ/ ŭlF"Ynë0fJ™ħ–‚ S’TX]KN¤+ifä1raì8çÈ0`žSŜZĠg‹^Ók+ċ‰uŜp½B6ĦĴƒ4ÚèȎĦa³Oc\.§Ğ7}"b„ ™²7\=kw1Q^V^Q3ò ı›.Żĝ&#ÏcFyŭÑ%L¨ž½J²^5dêV@Ħˆ2 ĵ@ ˜SİÈL ŻMUĵĈWG[ïûêíğÁżÌßĝï=ß>“OÚS·3˘ Sƒŭ–ùğż²ŭ/@Ñ\ıRžî'c"³[4ġîŭÍ(Ï.ş0⁚‘§ġ żÁŜU”éòÁ93*üšÙ?lĞ ċz˜òȘíe™MŜ&|š¨1"@òĞrʃ_uEëÑ 6EïĊò{½Ĝ5QAÒè7J*ǘЧç dĴ@”a‹šÁŻ|ö6„Ÿü4~vE!]i#;ĦĞRè‘$iœa½-M:<ŜaĵÉĉĉñ5#ôgF@I3µhF̊)Ñ1âù˜|ġ‘—v5ÖÏN5Â͍|l’İĜ"údÓġӌÜıV`FעıŒ$Œĵ‘ĤlİÀî‚JŽ9!OrIü™TĤQ›Ì} 0q²ĈÓó£Ä7ŭüWï|hşùè_üôèÌÙv§£JÀ5 Ġ€T Fŭ@ÉV/òœQ[˘#€M³ċ 0*”Ò”ĠVLêqĊYÉ:½ßRóÚÁèÚ5£ÁÌÈ9—(ߌ‘32Î:dġ3A)4c„•”+Ó)ʓyÜ;™òJ§kĉuÄ·ËiÉslôhu^  CáŒYĤ ÍçyóħÏDmö@Ŭ|ô3{Üw~v9C²¸ÅY™Š“‰Ğ‘ dħÄÚZ ™Ş<,$q8MF™,ĥ^Lw# IDAT0˘š‘Ħ£ĥ>[jz­žgD‰­ŝp=_3"?ˆÁLA<:JXxçż{r´;ûٙµK“É#çñüÖÜG·s d ë î‚fD%͈J`D•`dÍ ×FfòŠajE£?¨,žÉR9@äß§Éd•gV·Qĥċ?ĜÙZşüŜÉŝüT3b‰œ-Ġ,ݤÚQO9Ï34P^›‡ËYcĉ ›êıŝQÊê! ›t]˜?TîÛAċÓdŜaSÂËĜ2ÀMçF•Û Á ܛÚͰfOżñ,µd‡@³5%0„ĜIaÀWıyOşÌ&•‚€éıiyݎċ[äĵĦĤI&;*'; êщJ†cöÇĝ@¸ÏsfċÀÈä?EáüÂ*Νı„Tl3z™r›£ğ9v;)ÒXı¸>2Ê]pŠˆÍFL7¨‚ıŜ&ĈCċ TöƒR+ǎğü"vcˆ3òÁH‹1"Ž-<ƒ‰W#x}F\žgä,JQ͈ĞúŒœV&˘€ytŒhá9Lœ=xìĉ΅ŽOͽĜíĈ]˜[—qÒİï‡%ïÂïÍ ßğ‹²Ĝ5TdÓqE™Îâ˘ÉM-hF\ĦıÁdbµfä$ZÊ“é Ħ<èĠš:ĴPs$;ËÌş3lc×dÁ ˘ ÉR­?‰;‚'ż½˙Ÿžjˊ½fG5 \ŭ⃊ż$t 2Ŝ4ÜtŝP À¨Ż{ï:À¨ŻÁg žÑ‚X§’Û‘ĉ^Í 6ıuşŻÈj>–|›\?ó7îûdu%]‹`䅛ùŭë *š8üÒŞó0ş—+gĤŜ\%͐˜óqá™B’)$İB*³â15,EˆeL ¸t [Ÿzê_†jí:]Şà/¨ÓΠ¤5hĜX(ÓTjA[êy™Ž+›^s͈KóŒœe­B3*gÓQI3˘>š͈ytœhá9l?÷ÉmWżġâùı#knÛïŻĴʘ^:ġĜ^úcWW[™5ˆTÂn˜eŜy6—Êt”'>¸2ÏŒ8ÎÎÀ@Q°à”Ì<áÈÔKm#°Ħŭ(­ûñg§^•YšĠÛo½ECê˘| Ò°€ 5tÒ3Rî ܃  û[ FŭîÏï7³wNŽ­§ñ(ëUĉÒ³ĜPV÷ıùW;ÙÈe/"73”ÁÈé¸ç” Ħ0•ÀÈ~˵iRUH3Fœ(Ävoaïˆ`ĞğJ„X¤]à—˙·ƒŬöÇ~·Ċ­¤AI2QKÎéô-Œòj”ËX2l1›ÎùŜ Ïˆûôù,ÀÎ%bo’„?éĠ06ëĤSZ3%,<‡íç:ħ-™ùĉ‹SóÏ­µ;kt­V"3+YJ/żtè6ñ€'ñûsCžÔL)eŻLg5#Œœ´}f”7ú4#ö4£ÜÚ灑yn ¤ÇžŒg‘ly17cXô&­#†L£ëO`ŸxêïB˙ġG§.B90âÒG½j@ÚP;*Öĝ`èQ§ĥÜ#UĵÀ¨êg~c.ÊÌfö“ÒWüŒ@Ê-S !WĤ“Çħ PÎÀëEŒçµÛö!ıßĦö£ÌJĈ†<žİP²c†6Uš!:EĦ4@Ŭ"Ħ땊ÀAój “ÇŸYUħZŭĜïïâĉ-„n—UĈˆ; ~[0²e:²ñ5°í4EÍÈï3*Ï3r›³×ôJžf„q@^EÑıé¨4ÏÈŻPĉŸÁÄ+™èzàĝÔüókkkKÒ @ ÓKŬ§ŽühŻê&´#ûÚĠÖGwçšRĦψĵÑÁ#äžSŸ+jFúŠÁ•é\ÎY€'?ê^îžMkș‘él2"+ûÌÈ0şpˆ5ŭ8ÙOO~?L—˙ĉ™—^ËıL5ĠĞ P•Ž?݁ŠÎ3Vï 0Şz:ŝT[˜Ŝ |(´#›p@>!·Ó äĥo¸Ÿ³÷‚x‡Şl½ŞÚ“¸· ™½Tukħĥ“+,(eŠ!3…4F$̞#@Ħc ħŠV2ñÂc/íĠ~m?š;İğ¸Ĉ2Sdçoâvr0ŞšgäÍ*2ò\a4½ë3â 4#żÏ}Ff>ƒëïAA3',ĈäÙïŬŜ½xàÄÔÜᕵö tTNb@İ H5½œÎá‡n'0&èŝĞ͏ì"˘,q (6½ĉO&oz’fÄš‘‰ŭÉċWr€RҊÌ}˜SÁ×à ¨DaӔéÇ~zò‡"]|ٓ—σ•Fŝ˙Ü˙Êİ^µ†T FĠżh2'ʉûĠ›ö;ŒŞ‹*8UÎv|ÍÈ#òœN3êïȳy—î—Ê}\ ÇÜ7°í÷aoDĵ+×1¤”=·MDşWÈ!‡È§+zĴ!Ż%á\éżż<*jċžß3[ HVáiF0š°ı>£Â<£×ıψzúŒDÈ'š?Œíç:9ѽôͧĉŻĴµ— u ù É w›ħ˜^–WqúÔc{ñ=â úú\,"­)é'E›ì3˘Íôċâ!a3òÁžfä—é<7]Y3z·ÓSRĵtÉËSĴÁȲĊĴF5SŞ×†€4¨ .;ĞÔclx·‚QñÛyó£aäƒ,žx†|J'ġù6pÓÑĤÁÈs+*UHKW&­ÁĤ6TšUÊ·oGı‰H0@‚dÀ„é\‚K[ö 2]ïŻ½_µvşħĤ`ıfä’6‘M§ıDġ<#òĉqEŸ—ĉQ…fÄĊ>£#^8Œ‰óÜžÌ8~qŝı•µġDħǐìl_3&<½œ^Ċ˧í˙;ÂÍüµÙĈ‡'4ˆ²Ĝ á‚NK`D}4£J0ò5#ʙ9D^ĤóÁˆ{Àˆ}0b£FÛOàvú飜Ĵ=xĝäô9°j›”cTŻ× H%xÊ]\œ(zĴv F0Ş|.Ĵ*âġò6·vS1QnŝZ8…$ò™Qááĝ††rZzÏs FdFäÒkfDHDT™Âö…Ğ‹—w=ŝ× 7§ŬxŝŭżŭĦĴı›¨Óe’j­Ŭŝp=.¸éĵ>#³é q@TŒr_”úŒÈKîьĵ2HŒžĊęƒÇ&‹ß8>5÷ÜòêÚ˘Döß|ˀd7d@M/Ĉ38uäöŜÙM°MŬµñáŬyFTʙ‘B‘ÏPÊ5#k`5#Ŭܛ—él&U”éÈ£<ÉYĦψ™9f´ŝXşžüĊ‹œš9ÎV u=0ÊJĴħfHġê H´‰2ġìD’ŬĠu FƒJı}UİŬ9X”“Ê97$lB3êF;Œò˜rÍ ‘;Ŝ@$8)„Ș¨}fníċ;žzè‘mÏ˙Üï|8mh÷ÉĤC)›Ž*úŒÈ7b”ÀÈ֐Ëê#”ÁÈ×UŒÍšA"`Œè8 ‰³ßya²{áǧ>·œkFqI;òّ=RAŸM˜Ĥ—ÒĞôÒÉÇöÜ `Ŭ?}x7‚ˆ%ÁjFTê3ò™‘#‡”§]/Œ _ÍK‚TbFÖ|荒ušrͨĊRm?}ôä)^8xôôô9VjŬ‡¸Ä޲ş\WŻŞ%^ë °ÊƒU)ŜŻj0z `4èy^kPê› FžcÁ$AˆD„iĈX?5³zšžzäĦm§9%Ó@ĞEÁy|ÓŒ\uˆü†WSc£ ͈òIfÄyFù̊>#çy&Á<:Fĵô<&Î=|j²ûêĉ,u€‘*ħ"i>2ó{ħ§9u//eWÏżtêħŬóß`"9|•I"˘ DÄD¤„JaËUʔ9‘,ONݜ~ßs?8Aaxġöŭá´ħƒ¨ÛuĈğRŸùšQEŸUôQİÏÈ%š²$B`lœxáyl?˙éÉî…oÍh3`´ÑĈ[ž˜*ûĵ÷èòR6‡—OÚs‡ Ŝ">+ˆˆ8ĥ'UôQŜĞdmá.žJn:Ş20TdӁÂ&K"gí5£z½Ŝ€dßÁ@"ÔwgŬ”Żòá|5Ġ`TŽ&Ê’J’ˆ|š&’ĠñéĠ“ï;öèßnóĠ=żú‘Ĵy‹%ò°E͈P004#2e>›µ`˙ħ™<ÖÀıµğŒŽj0:÷é‰dúÀñ Ï,Ż/yZÏ 0R›ı–Ğ(ßUŽ‚ıĵ˜Îñ™S‡nğ£ñ6+>8 ŠˆTŞ[—ÍÀ\W^ËËtyÔÑ`͈Ĝ–(™¸¤éC’ÒñS£Íĝ̨֌êġş’_ĥÛ(dµôv!@ӘOĊ,ğŒŜŬ`Ž…iôe"bHÒl^vO„i&“秏~ 9˜LÊ,™½í+ŸL]DŞöo§ŠPníšgÄ>#*Í3*gÓé2Ŭè(ñâaLĵr…ÉîùǧĉŸ½NÍèz@ݏĤÏKG´çŽ8còŝqÏn "Ȅ}ƒ eòĈR™WdÓùš‘ŸUĦ™‘ J}<ŬGOŝş‹֚Q½Ŝ(@²o†àšoÁ0#²Ÿ×ÌèŬ Fè=†$BÔ •Î[%͒ óüI[şSÂT޵—–€ù›IìùµOfÍĵOɏÉM“èÍĤƒ7BÂc.›.O)pÁ'^<‚‰³_˜ìœ?p|êê3ŻQ3şVPêĞ)]^Lĉò‰C{î`(ßE|h7¨APħ Jµ`dSğ‘÷ J5óŒ“ J4Ú~Üö=XkFġz£I]×-ˆŞ½£w=ıPK bUh§ĥe;óuV*QÙĞk$ xñĠ“w‰GĜFáì­_úXҘ$Ä]†ry§ÔgžQ1È Jċ23b›^Çĥ/Ċös½4ÙıÍĉžy4£kÁšÒb6‡3§íÙOÄ#âë³âƒ@4ÏĤĜҀ*ĵl:ÊûŒ†\ÓëíôÓGİğXkFġzÓÉjI›75(€3( 8•5Ġ`TĵÁ…×ĵÚKÖ⇏’·ĦİD!;vqċĊğ˙­IĊ|e÷ïM˘DIÌĴ¤™ozm}FTî3 "`d”xñˆÑŒ.óĝĊùg—W×ŭ Ôת]OùZSZHçĝ•—Ŭĥ˙" óŭ³tÈÊn˘ÏˆÑ$ħ£ŸÔšQ½ŜT@²o‚Ĉ5½qÈ4ĈşNEŞÁ¨#A ­$ TOQĜ%FoİŭYJżpöòów§ßMv¨,ı²ûWïK·hĤÄRÏ:/Ĉù}F7[ÈrÍHÚÀ°xÛÏ|qGç܁SóÏĵAšÑġ€RµĤ4ߝ!֚ İûŻ=ğ™"'ċ†`äġ‘µ‡˜8 x}FµfTŻ·6}•g6’|BvHPmÎg–Ö`Tƒ+q@m´ —³ÍÈ)$™¤.,żßûÖNV˜ġ+÷ÑN˘¸c:iúÎ3êÉĤ³`ŒÑqâ£Ĝ~öÁ;ÚN3Z§]+(ġה’9ĵ|òžŭÓŭWÄ=ğIiPÊǎ÷gF›ÈĤûAŸlşZ3Ş×›Â€ŝQB½'ëħċœ) ]ĞÁ¨#öfbĦ Dƒ6ߪ ‘ëKŠ%ĜĊċwÓ÷żµ“ÂèÊ-_üxܸ…wì ŞšgÄbûŒ(†ċ£Ĝ~îĦ—wt.\ ½Ñïĉ5…tgNÚ³ŸCôġ+ÁŬŒ&‘LZğ£eş"AkFäÊtÔĠMݵfTŻ·,(SNfF ¨×`ôn#ğ‚@ÏÈ ´İÁ4Q³cĜĊ[µ˜r)ÏĊ\Ċ™ÂÑ +'îŽŝï;@˜Ùùùëò]Ìà̸éàâ€<0*dÓat”xéĥŸ{èċ‰ĝÒ7Ž_\Áè͌§|×WSÂ+§½g#B ÷ÏŬ,B*á<ŜĜÌPâ<Ŝ<£'kͨ^7 qŸż·\¸i•:ÏNyÖïŒŜĠ`d‡9I4"]ĥӖL·q•@İÌÂmÙj„ƒJ2)½réèӇ“2Mfnùò§“Ĉ-Ä]Ċ e"òyF…l:7Ïèyl?{ĝÎÎù/^˜zyeġ­Œ”*5ËóŬàĜöì‹´äŭ3t÷nM"[k·ĥÉ÷Ì3b˘¨MWkFġşaIÿz÷}.^ÍŞ|˘)+èĉXYò÷ŞM€LÊ ĵmÉ °´0pĊûÙû›Âí^+ù0Í\(Aq(Pġm놭üîİ? ÷>…>ó¨X&@hî°/İŜK‘r6o’ٟ‡‰âkoÀÈ;—ÊÏĈßä|˘p>&™\=zañÄ=ĝŝ;žċ˟IFS2anĉOA3#^<†‰³ß9ħ£sîÀ‰İı§½†·B3şVPêŻ)ÍÇsÀÉC{÷3#â;ctP‰~÷ĜX!—ÀÀ ÈhFëµfTݐìĤPĊ”l Ħ=•É* Ħ7è,+JÒ¸0Şúd3,…ĵ{6Òë£>/oB3óñž7ÁħÑ1èó˜ƒ6£AÌˆŻY›· ï áU1³Ô‘ÑÄJİŠKwöĝóƒ`6C‰$c½°|ònúÁ·wP¸2ùùO$ÑNB˘SÂu§“‘*M·x ÛÏ}÷Ìd÷üĉŸ^Ú½Ġïĉ5ùt8ŭĜŜŭ‚_ŸĤğ&!šÚn^gFLá,ĠšQ½nd@ŞK‘e3³bĉŒ™ÓL1”+×I³óx ÉMU½WÜ>ûñŝ£Â½rŸżħ™&Tq%_b)=ŒËc l€í§>3ġıĉÊÇY,ÓQÖTñ˜úħ> Ì•ĴÉ>ßŜcÄċÛXĤ£ ÖZÍíëŽÀ´´@A¨ LœA UJI)޸ñÙı2›!œ§ZSšZ>qWôìdÌäç?žD;q—Ù L"Â2£íç:3_úĈ‰ O/­ĴŬHšÑġ”ïŞ5ùd8ŭĜ{îh48Ä×Ĥù“,"]ƒiO Í<£uŬôZkFġşQKvT²“RĤJİ„™;핵,Mo+Bğì@@@.X“hƒÍÖ:€¨âŭW.Ó90RĠ›07jîó7öaôżÏëWÂĞ|ž*ż{êÏ ċÍ*@zLDŭ™KċÀŽĵÓa3r]|î$„`…vÙÀE#éšRŞĞ”J¤”™RjĜXP  ÎW('™Ì^8séÈÓï%· ë^Ŝŝ…_H$²XÏ^%^:‚ígžĜÑ>÷ž^Z^™/ħ€A3şPê§)MÇ~´w#”÷ϨğneÑ È˜)ÒMŻë?N÷‹'Hñ҃‡ONŸךQ½ŜşôÙ†mIÄ|íŝo4AĞĠj5›Íá(ŠĈ“-{÷-†·l•RoŒD‚I³3QV8'ğA … Ç`¨“)4x(´>p ïƒ˘…ğRşO_ P‚Ħ?gó)}" ôĜġ@äèéû Aa ]ZQàn’˘@˙½ù…B˙ô,Â@çú…Îk@A I£@şçĞżú>íפŸ+èa‡BĜZ—>Âĵ a Ù‡@ĉwCs<ÂL‚ŝ]"wL Ħ+! “1ß³?d^§ ż} ÜñÖsŽ 7Í]÷ܙ„é? ! pû2ԕgxߖî?Ë´;ĠétĴ­­­ŻŻÇJ£Rıt—XÙäĈ $Ğı•îò­òÂĦ&·Gw항›‰†GˆbÛك'néœŭŸ'/Ì=½´²öFfÓ½ÙĊŭŽÉjG&*^œŬğuy) Ĉn_ĊÎqŠĈH™†ŭâ‰ï‰xñoŸ?yùXĥ“şLWŻ·”!‰Rù„ I™$Iœ$I;MÓE~ùÉ£Ŭ÷îßè’Ӎ‚ 2!ŜÀÌ& 0§¸YÀì­RžÁ* P*͆ Tf܅5NŜíU9ħĈXiôŽ@™‘"ŻÖ3R"O`€ ÒÜ6 ς…ı°žŠK™ÒÀc-ö4”@h´8‚’JûËȰF˜t Ó'Eúw ˘H—÷¤ÒÇ%Üŭëҗı0VB§‘ÚûkS 0ÒÇÑ\¨TB4ĤÌ9îÁJéjb™H@IİŸĞb Š6›.ú1ÚyG¤]ÙÌJ??Aùc'‰lú)L„ó—B„—şişÇq7ŽÔӐüó,°Xħñ–éTYS˘D2Žœ_<ñ!zôÀ0 fŜó•OÇĞsĜ~ŝá—néNŭĠ‰İù§W֗Ñ_Ĵğ°€MkJ—ĉ’Ğ„“‡öî£Ñü£i~ßÎħµ§pğxêï‚tùož;yé<3wjͨ^7* 1úŒĦPJ!Ž´Ûí5…‘…3'vœ>xۅlôž`bE;öá(‚ᜅ!’"H3òœU~3 €ÀYb ĵ, ĜÍŬŝ/•ŝÉz#–  nİr° 4 Hċ|[J)ˆ@èŸû˘ĵĞù10Ô2 4s²âŽ”4àb™0Ï% İ̀:€%ëû‚)ñed”Rtĥ"İË Ôjjˆ-pżOŸ9?ĉû"Ĝ•) ~Ĵ4c%Ki^H݁šđf­Rıçc‰HI7ŭĠVŭlHäšV² ^ı 9ŭÂùcñ9y(Ž;3Ŭnw)I’N–e²dj°çÛü€Mx#-‡ yäÂêñ{†˙Ğ›âÎJÜ^Ŭ:Ù½ĝŬӗW~ĥ°²ĥb6ڍÀH½ Ŝż›Ñ”@½:—Ìá+˙¸{ßO2nżôĊ19u&˘Ġ‡Ÿ;9}րQZ—éêġVŻÊ^£ n’R—XR@!‚‘‘‘ĉĝĝĝĜĝĝĝÄĜĜĜîĦĦĦ÷dÍ-ï?·ĜùXğŬow:-–™gN0“ĴÌb›i­˜Á{ ŠâM9LeĈܰÏTü ĥîŽÙmŞ}sġÑdrĞġ bÍfnŒżß+nĤüP}gwğğœCŽŠÏ‡Ğ^ˆŠÇÉ TĈ#Mꌅ³{vO<™œj·ÛWVVf–——WWW×ğŬnê]+W0ĜȀÒ9i?"èĈ†ù $Ğ@JÁFƒ†††:I’ĵž ıñĜ”wŝ9V•ÒH·ú}WŻ·C*ħ­†-‰>WcbÀĠÙF İ~Sĵ½@İ ˜Ê5Ÿ-q†<44 µggg_}3 Ĝ ß­Ż!mZÖĞ^7>C*ħĊf³ıšĤé„RjÜ{bË ĜÑfħ~“Üĝ+U ¤Jßse:!GQ„ááá`xxx}lllzvvödġ9ôîz½R‰-*ĥ+\‘½VCŭFzkÎş†×Ĥ<ġĠQÔl6ihh(]8wîÜj}ĜëUŻz½€d—bĞRj Šv[__*— ¨žŝĵĜˆĠúŻc@nYэŒŒ,_şti>ÄġŞW½ŜP@€(ŠB)ċÔHĊ}ˆ>÷Y•K³Q™jàzŬ_ûkaĥU9B> AĦ˘(²Ĵh}tttñ•W^IëC_ŻzĠëM$˜šRÊ1T;몒ÖúÈ žO R×ŝÓŸÓ€ żÉ–…aˆF£VĞĠY™ššêÖ/E½êUŻ·ì °™eÙtÈFWàĜ€ñ&~×ĝók9VŒŜäÛñuĎŞŝïôeFëQ:22²zñâĊvŭ6ĞW½êuCR ˜† ƒ]‰sPTÎ{£@è†>Ĥ×ùx6£2+(U²£0 İÑh Ùl&###ëŻúj DġŞW½iŭ-˜KĠFIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_DarkGreen_16x16.png0000755000000000000000000000016512467662066022630 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcdXhÊ@ `b ŒjĠ0t4Á­öUk½IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DSButtonA_420x420.png0000755000000000000000000017343212467662066021377 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFìEIDATxÚìŭI“$Iv-ŒU553÷˜çÈ9kx ô\=7xï£pCÁ†n¸à˙à’[nı˘wyĝyBïĈSUeVUVUVÎ1î6¨^.TĠLÍÜÜcÈYo‰WDzDĝ`nĤGï½çžˆ!B„"ÄóAˆ!B„€"Dˆ!B@ "DˆB„"DˆH!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆH!B„"D¤!B„)Dˆ!B„€"Dˆ! …"DˆB„"D¤!B„"Rˆ!B„€"Dˆ!B@ "DˆB„"DˆH!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆH!B„"D¤!B„)Dˆ!B„€"Dˆ! …"DˆB„"D¤!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆH!B„"D¤!B„)Dˆ!B„€"Dˆ!^ˆ^…7Á ŸdˆsŸFÏñı)ŝg:qèĠ:u˘‘†`óLAŠÎĝ<´B„ )DˆW €Ĝ9ŝö˘_ÛI C^W¨B„xÉ@ˆpžEùŽÎêĝwFDÔaY–ğQípÎ÷‰hP¨1O36C  "ÒKwŝo˙ϑ+Ú,@cġWżyg.œ5Ï:%Ş?€qtìNC’$bnn×ï÷Ò4ŬˆĝJE—…+œó9)LÏféħ½×O_˙ë 'Ò W˙ïż)¸Y\~ô·˙×pP uo-›‹à(…x1iq?;šMz½ŜLÇkRʛßŝß˙ŝwùú?˙ġaYBġŠÍşÖtĉ@Ş^ŬÇuhÚÓ?äŭ;™Ş³Ñ]½_Ûûŝc/ß˙żŝ˙où/˙í˙£µĤ~ż_ôûŭb_E)€)ô‘^µÜ~ŝ:,.&\#†lòö3Ä3ɎĤvû4i–Ĥi”Ĥiš$Éĵ”r=ŽóßŝÁOŝiŻÀ7™Â’`èsÉYaĴÂÎҁŞ^2!Áóû @„ @ ˆPÄ`:ìyf‡lJdîr" JÂa‰Gy‰-~rIʏµÖqĤi:HÓ´,ŠÂŸ"[bˆ1ĈèUó*xi Ĥ[¨Çİëü²!j×:|rBŒÍŽ0”¤”˘ßïÇI’ôlÏhsîÒĠ—Ŝxo}OŜLH›O_—şÊZ ĝÔ0Ğ=!á 3`Ä„pOhÀŠ1b€Öq@)³ù-ÁP!W„B j‚Q•i ažkĥažsüÓġ÷.ħÏ˙ġQnmEQ´›ĤéAšĤ™×GҘĴ‰²¤1ܧ†n [ċˆuè°¸-F‡>B<óìh*".„I’È8Žç„ËQ]şñ‹˙ü]΋L:h2à@iU›’˜ "f.€`ĉßĠ€Û½p2 àĉ14JMPŒĦ$ à ıÒ(ˆ0$ïımfe°MƒsMÀZÌħ~m½ŝĈŸ/îŜŽ˘èaÇ[I’EQT”eé*ŬÚ!Kz‘Á4>·}µÇhżuPġÜêĈêU.\Ċ/ÌÇĠ5ÛP8ˆ8êġz} HĞQ_ŜüΏ.6‹QšĵŻHàé3†>ôC*ΐ2†˜ħ ”tŞqĜÑ<×=C0(DQ$úŭ~’$I_ħEÑÚïüèOfâŬBCkm²"’%ČĦÇR¤ HmI2@rfûT­)ŝ­}ŭ ²@& †D0¤œĦ'8f4 azHÓH›7ԋ8n×^y_ħ.\H’¤Ÿ$IE‘h½˙I’B˜^¤³9Ĵ#Nܸ¸+–5kMˆg¸A`”şúFĦ!Ž(MÓTJ9EÑ2ç|ŭÚOu#&àX™QkS.qiÊ %ˆ9CÄ$cˆ8 ìN…l™&ìZê L0 iS2†˜3ÄHGO°äàžÇ{Şàe|żÈ4q§ž—jP²`WY’) jËàïmnâhó­ËBˆ )ċrÇsfÄŞ‘%%½HĦ¨^KB/)Ò¤L‰Zwĝ ³ Eˆg B'ġ‘ŞĊX!Ò4•I’ô” Q­\ŝŜ?œ]\‰·r3•Ş4UoÄjZ7·ƒ°ÌëútìĉiQg?zÜe nj rËŜ‹Ŭż²ĠÒɀŝÍ÷úċÒĉ›ĥ´`7²½¤i@)€Ó‹°ÎpV…ÁĜHŸŜíĜtnr’cáJ~(4ZN:İlÇp›%I’ÌÚaĜġë?ŭ‹› Ž FFUA[hˆ˜éј` D2 Ŭĵ4nhġƒ<Ó-LrċA“-iU—‰µ}Q‘&™2Ħ&ûܚ @ġsùéıŬEĴÎÀˆş4È5,Vnĵ-Ž6ßx_JıEÑRŻ×ë'IÉ’N$:„,é9,1ÚÛİ„£İkۍV™ĈŬávŞ#%šÏúi÷’‹mEQŻ×K8ž“R.GQ´qġû?ِŒAYdqeĜJŠħ½żNĠäj°ñoîŝ² R6³RD(‰,hQ`ŝcQu†Ħ„5ŝċ œˆŒrƒcܑŜ~o]BĴI)“$™íġzİ”rÛnÒq ñi˜rùżïƒšÁ–âí@d³òš Îìn‰”áêÂ,—ß]2^—R.ٙ¤4Š˘è eğ!|ú”€4ş3ŻÙtNŬğӊ3œ<Ï";š†â]}Bp§ÌÇñ˘”rċ_ŭ—cñ­B̨ŬĤԕa}Š·!-£ÙršË”\v•éŞlÇ-Ì¨Ŭ3ònŽä ĞÇ êߎ…GUÉÎ0îˆÜ,’¸ÑŽÈ ĊëoGƒ›ïK)WíLRÚëġâSPÀÀÀ{>çş` êwˆHRs¤k"?\şÏ<+ ‹*O’DZWĜı(Š–”ëW˙ÓuɘÍblĈf)L·‡_mYL›ßĠ÷£=àÑ Mioĉ÷t•ùsÓUÉd[ÍR{´€Ncâ§AáÚµë8X}šbUJı”$ÉlšĤħGn8Iŭ›M(—†xÚ yĠ˜xí úÜkĊ eşç B8![ò³£È²Ìâ8^ıôç?xoni5ı7,Ħ•†VT“`ĈÈÈ,Ž=ɚ:…Ì+ñԔ‚ß˙İ­)FUFjŬcW%B€Ş’"µ¨ŸdRĵċX ĵöî<}ŝO×ežÇñBšĤğq‡Mks˙Ĝ…³ùıĞ™v*¤I!Cêʐüž‘ż…óċY–ë€ñ”ċNŬ:Ğç6+\BĴ^˙ñŻnĈ8*} V1Û {Uŭ¤jŝĠh”ï*Ş·-Ċ•¨³§şœWg?~VT÷Ž0’uiŞ Ğ^jÖó½—tċĴh PĜĵù6Û[}ó½(ŠV” išÎĜ,)ÂéÈ a&éÙŻ:€&ğA İcÓۀfĦL÷‚dL]‹§? Û³BŞË3Ğë×Ö>üӅŭBWöäĤÔëŜ)oÀ1(İĦ¤ áhܰ .·9İçŒÜÏüŝS“Y§[3H5kO× 4)àvGÄk(€ğŒ3†7V–0¸ür͖ífĴ”@ 7ĵ¸ËÖ EÍT“sžƒHĠfˆH~T녧iV (6f“X°}6YN*1%I"{½^/MÓ9!ÄrE—ġˆ1”ŞÍûj_˜ÒœÉ@ê5ıˢŜ· @{€Ġ+ݍfÜÔXáۖ'hhŜQ5ŒëJŽÚ>K˙J"ܸ~Ÿ\żħöà³Uko>ÓëġöƒAĤ”rĠÇi”żÉm(t۟úŠ83;P% %ğ‰Ë ·‚P—s_8žĉÑÇ Ù’ËŽ„$GfXŜĝÓïĵ=·ĵžŜÍT5xhú.şdKj¨LùÍöƒt­Ì`(ŬNdµ9kä¨Ŭş1ë—ĝ44¨fÛy½%íä„tSšHy´oò,¨aŸ^‘4@Š°Ò‹ ż€™ùĞRÊ;“Ô‹Ĝï#F½!ij(Û)òMÖB„ İ6Ŝv–F”P+@zċ:àtd‘ĤİŒĜ‘ÖnŝâŻŜ” 8Èt%ûg6~QÊÌħêçÌݘ6˜•ž÷µœ%H×tÔv7ò’'êżë reZœ*£>xóRĠfİÔ`’#+Ğ×ßâko?s°ûqNjiš>I’ä@‘+4<ù„²]ġ}Ȓžŝzħ!B†„U¤ İDİp>ĞOd’2CdU礔K3ËĞWVŜ˙O‹{ı'TÊjŞw%Žk5íÍş"!èV†cç|½ş*ÛÑÊ~ß­ŝ]j TŜàĴ÷Ú$²ġáMÉ*MMG&‚)KޒΕ5]zk#Š˘ġ(ŠÜLRš$I„“{sÙÒsȎ‚…yȐ&fH­dhä: ™ÑÓʎN£ÌÀ}2CÇ RÊĠżĝġ2’ü=²6J{eĵHuÙ `jô<“WÚsjÔ²"Żż4gÙ|•Ó̓KÄlĈüZ˘÷Ú*öŸ%d(j9[p2Ì ˘ÒËo§ÙÊĠ·üó;v&i[Jy$„­,İëxÓ4Û³·Ŝ óHÏżç5¤ ›Égᤒ§Ì0km&Ö/ï'‚1cOn{¨„%‚VD %q\ż| ë7/Y)ĦĊ$If“ißĦŭhúÂŞÍ,‹@ĤÇĠ"K˜÷¤+‡ö˜…Zs} .½ğÂäREËqÏ%I’ĤiÚ%¸ ċ†ç³ĉhXߐ&ïXÜ ;şrŬ¸…°³”Ä9–Ì0#\BĴŬĝÉŻŜ” Ĝ+uµ Wê Xާ_çg1NÈ ˘şÌˆ<%‚*PÒÍÇjôPƒhy­ r#RA~vÔĦ‘WğÜêf/IÛAKĞ";Ì4fŻż-M–´’$ÉĵÙн²ŬİÜdC–ôtödZ8 €t"2ħş§äħíÂ%ùÔ3Ĥħd†4M]v4/\î/.]^ŭÏ·s RŽ˜@Fw͒i;0ëîó„L›e:ϟÈŝ›,QU‚CǍ,ȑç{äXMr Ż”¨-ĝîĊ†şŜʁ'YM(•ĈËW°żöĈU!ÄŞSn°şÎà&â˘Ó#ğċà<\ M>Q\†TYˆĞá‹ÎŽNCfp°IšĤ})ċĵ”rċÚO˙ò$IĊƒĦ‚Vڒ¨šòËj.="?kÑÔA"ÒµI¨‘ħ´Á¨ÙëiË6ż§F/İú™öÓ=‡vŞ äLK?™;Fɤ5ˆħŠq'ÀċwgĠüêM)ċ²\MÓ4l–4θošòjˆs††'Ĵ*/&Q­ÎÀ*Kĉdž,û"³"œP²I’HK]vd†ġĞ?ĝن` ıŞI& …j"4üŽÈ›32‹ş-Ğ5ôçš´À¨ÍŠóÙoTÈâÊ}”V¨‡oİU43U†Îì&İY²£Àl 2+ ë×ßdûĞ7ıa1I’™$Iâ1ä†5îBÙî‚×ŬĜn„€Ôħ6z×4Î!Rá²ĵ„ i„Ì`İËóqŻĴ÷­·6Żôï—ĤL´ġħ›&zM9 = èşŸKßvΞĞl'àèĤö܈Œ| u}0B³DX“*¨*÷94sÙk7êĴÏ>ž€Z_œĊÁĈ;kBĈàjp“}R¤!@:aËBMie°ö0 Ŝ%PĈ“FIÌ0Çñ‚bġĈÏ˙êí˜sìdFÒ[yŠm€0¨EŬ`äKġĝe:M£=#1êk–é|?£6H*ŞKƒŽ4AşĤ†ğÇĴúaş^³[s;¸ë†€Içceĉ¤²‚ğòVt¸rŭ8ŽWĴàjŻ×띙Üâ˘V\^ŸP",ż:6îĈŸÄĠèŬ×Úq‡¸°Œi2œ”rı7żpyOż³ô8Sà JUNjy1)45ÙnJëŭÚ˙ꔵ+Cħ[VĉížQçŭµĵ£hWêV6B{=£*C³@5jN•“?K¨Òö’P„k7°ğ|ŭŞbUJ鲤ĝĴä†Pĥğ Pş^_B Rw’4$gg‘Ş2\“g̎Ĥ%30Œ’˘(Z½ñÓżü0Šqo¨  m^uӚĦze E큀•öİz:vÉ÷çŒĵz2Ħu?ŞŝŽéCùn´äÑÈK]³ê\Ĥ¤½çò³?ŸÔ~î÷ĞŸ‘Ĉg(ĵ?ŻgŻGQ´l)à½8ŽE…y¤gX‘İ%="@ê#jx ĝ[çÖŻ†šïEdEÀx2G“Ì0+\”R]ŝÁÏ69ò\WêÔ"#T´nĝ%6óKšt]ĥCKÈ+ÓĠI=[4F-úĥ;7jy!µĵ_ZÌ=8ËôzÎHW%ûjJ{ċ Z´emĠ£úxÚJ%ġ…@vé֛½j•f-ı!Âé,)B\HĊŽ×ğ\ ‡8ÒèêYmŻspçîÙ̌)ĉ\YN(Ùu’~ôËË +jBwğ·¸_îbžĜ݃/oÎ8ğdïiŸ¨à½†ĥ{ F&v*Œ£)ÜÚh(ÙĤU³JÔ ëÒĜeg%a~ó ³|=)ċJNjišĥËvÜÌÉc΄İ#ƒö<(څŠQߜ§!œ!U&|m2ò›ï½1wéÚÌG%à•żB§žĈ›Óë!/Ûpe0c¤gg:Wé„ŝş}‹à=f‹Ààg^žËWWÚS §ĥpĞ…=݌Ìu•g5@1CÔ)K UhlĴŻaoéÍM!Äş€ÏZ)9E‹-=5'Ġ‘ˆÂ†ĊZNhç Ûò>òvĊaCsŞrp2C’$3q/DQ´zŭġnÄĥsm%Ŭ<ƒĞA@û #`´lOµô7ħÓİŜ†şK†ísÇÛPËÇ˙[í=·ç˘ĥya×^É1ë [ğŞ~PJĜĠw{{—ß’ù/¤”óišnK)„B)ígBcŠZOöfQ,G1dH#§ŻbĞ2]KÂñ˘ÄÉ qÏGQ´œôg.müÉw—ŸäŒŒnVÚ ¨‘ħ2 avGhmUî˜yŝĜqšš6f tt+ĞòİŬ µÓk[ÉĦöRJĴĦkE³dÈÀŭ²dû|µ§sIÀÊĠĜYĵúfEĞVJhĤßïǜóizHÁMöÂvÀgMĦ7iâÎŜzzûÂqÍó³£3‘loc^Jızŭ§ùaÜë‹ğÇ +ıâëÌiÉĵ}{CÄ´1+Ô,£5·Ñ`ù`@ Ñĉ†?Fİ 0rL;Xá1ú|!V·’AòzP Àí§Ú,Am³$VâR/ĊÁêğK"í_²ĉ}sVš)Bp“}Ĉċş°ò@št‚h`´nÓ!5éġ‰ħ%ğŠÌĤie3qù‡?ż¤ K‚*4cµ\Žŭȸ-gù›ŬĜ„ZPQÓPSÁĦĝ/ĈëעYĞ/ԚEržK¤ĵy·é!ż—TħîZŭ)è: k"ĞûLş~­,—ÇY‰™+oŠċDQä”úžàŞOlà䆧µk3Ÿ|“H'm[¨ù­o…„C:-ᄠi™ayùÍwo,^½1{簄ÒĈ³ÈÍÖ44Ŝ˜s÷ġ燜T˜É8J…Î’—Ÿe‘gFÔÖĤk–63>?HĞ›†|£¤íġxĈ“%š”o]eDÚŝ‘Ö~iÎ+9VqŭÀ µJ¸QÑ\ÚÜÄŜÊ—˘(r3I³–Ġ(1ŬPl¸.b­!‚…ŠK¤ó£Ġ˜Ĥ–ĥw÷ĜİÊuÀ9É 7~öë÷"Ĉñ87 sİhDއ1mÜQ;Êož?×;¸ĥ3 ox1K|ħ™˜*3€J0NĥGcêf#Öâ.3™WòHhRÉ£ƒĞ*3²˙F­ÍWĞšğ[Jĵj€ߨBJ#½ŝöL1żŝFE+qÏۍ€hQÀ§™K àt–PT ^?¤HŬûyĉeCĴeKĦ^w1Gx˘ÍD’$ÉĴ#3Ĵ˙ÙVfeċˆ jf3NÑğĥĝfĠƒWJÚD5  ò È§WûŠ Ê7\·ŭ[˙ê›Û:?:¨gKs°?kg[@íôŞĵìŒĵa^ §2a2#eÏ?Ÿ>Î<]=FĉŭĞĈl™RëC•„aĤ°r-l-]wn² Vı!&ÛeMÈ çZq™gĝ]¤2éÌÔàÙÑ™È .;’R\ŭèïGqOÜ=V€&”…‡Nmm‹ ÈsPĠž <;óİÈ>5†ŸÉ6Ÿµ½lƒŻ>Ĉ•O˙ûŽ„R•FW޳Z µ5ş? [³ĝ¨Êdš^K͕³OwĵNR¨Ħ‡‡Öœ%-uÒX2ƒGġ^^z­7Żż1ûĊħ2à  èhEµR¸ŭʧ ב†µ9µÈπ.gŒ³N¨2²ĤZx5Ĉß<};`á6üÇóÏW´Ĵ0”}2W†_A ëWagéĉU!ÄZEKI’Ìöz½ôĴn²!Nq‘pV}ÀĦ'i4…övÒ.3"O&dFS—ëşĴħğlÎıH’$ޏr…½ŝÓ_żÇgK *VĞÍ6eÌÇj£òĤu„jd@£Ž²ş‘qµ2d4ġñ*mäïáàĞÛjV ²,ËĠ­ß”‡ğ…ÊshÎjĈ£ÑÙêµèsġ5ċeUä›÷ĠóL¨ġ€=š:Kr<÷ĜÒĤw€ S Ì×ߚ-çVnZÁĠıÔDÔA%ğ§ħf Œ‡| ÒȂꎷÓô‚‚uəËuc)ßRJaÁ9)ċJœ¤›ßŝáòĦ‚ÖF‡ íaVwÂz‹°?§£=Ex úHÔĥhPŭ̃EÄŽïŜÂÜáÖA6n ƒ{'ôñ?ìçR‚,5]kk-!ÊŞ[3J %/3òÙtÊ:Ŭ’E_ÇO{ǁ@`ÚdrÌÍkĦĊĉS€.ŒÎy–ŻÉvoĵcÉ ‹I’Ì$I!7„²ŬE–ì‘ €4öüufP—é˜[Ĵ´L*œ0c²£S“z½^ÜëġúRÊy)ċòĠ˙â™ö£ŻŽK“i@k+äÍ ™2£–`V}ċi×ĦġóÛqOş§2Ğ –ÌâžïîàŜÇżĊ‚Îî? İßü·ğZk*Ì;ĵš9òċż5š?3޲!MÖC7J9šš>N ‘×Ê˙È£S ÚhùA1ΠK3(ğ47‡½Ġ·Ö„Œ7\Ù.¸É>ë=[Ĝċ@ê%O݁¨ŝ7ĉ`tş2ÄIّoeGQżßO’$™“R.GQ´vġ‡żĵŞ8. ĠZChËñêİ.KžûНѣî;Ŭ$34ĉœĴú¸)×=şñèëc żÉ²lk0l ‡'ù“ûĊŬOgç rĵƒŻŜ@ÁVŞÈ Á+:ÀrRHÊ7ôúQŝÍY Ĝġ{´^Röue™B´ùft°tí½8ŽWĴ]ÏSn8u–bÚ0|3üşjğž½+Ĥ Gk êşß_Ĵ*2CšĤQ’$½8Žçâ8^^¸öĈ‹7Ŝš½}T‚A• 6BÍöŸ¨ÒĤĞ,ĦkuêdŻy¤ş,!j%pÀ³nîŭîß°Xçy3 vƒÁÎp8ÜÍó|›˙ŝï ıAƒEµPŻëgé6£-£>ßİEçúbNëĤj8Ù|D`^ƒŞÍ&tˆîŽÙ ×XĵtÛ 7 !֜rCšĤñYÉ Ħlwš5'ŞHe§v=Ċû7[\Ĉj´‹ÏIċşjqsd;{´h•Ŝ{œië¸ê˜uh¨pfv.ğĦUŻ”5N¨KĈ‡Ù…Ŝy5z2Ċö}ßŭ\Íİá—Y–í ‡½Á`°?÷†á.}ü_EÙĦ‚*k;rkIŜ´Ğ Ĥ†žFhÑÒµgġÍ-]bĜUÉgĈŽÔĴµ9³Ç4j£µ›óŞżpĠú$Í[ĊuÑDÜpQR`×@š¸]ñKwÌcBÙÌH“ñÚĦ070mınZ2rœ¤ëßùÑê£LWŽ:Ĥ½›SΠQ{˘ÊïH{v ÛqŒ³GÊÜ-ênfŒaûÖ0w´½ŸO²,;‡‡ƒÁàh8ĉy?<>ŜŸŝÓnAÜĵˆ›òŻ$AäóRWS›–[–+ɳ:‡d½ġyoÊ ÖPŜa³­Òàq1ğöÛ]¸úž”rĠú$ͤi !|P n²†GM‘ŬF6,Uͽ^#3 ġŜ1ÙÑyÉ +W>úĊ‡2î&³¨suÖÀˆ0ÒÊ£Ĥ‡‘o1b;NkMŜ°/×ÎLُĦ<ŜĊ£‹eä_ĉy›çùA–eGápeÙq–e‡yžïàß˙_B0hU@)‚VşžO"j(M-úeş&ĠŻĊy$ĦÊuġ·îÜ­^żûO&›lËtQB—„ĠĠeì,żıEњ”r)MSç&!žĈµcèŜa= €4ĥdWéĜ İ•ê“)ĉّß™ÁWfˆ˘hġò÷~%S„£’ KkÂgéÍn%evÉ÷Ò>(ĦÙ_FUğG猨2û#ŻÑB`œC3`͈ĥîóáñ7yžïYʊ˘Èò<Ïòî3G(ÛMıĉP¨ş@³|ş,ÉeFÔB*" ÙQ÷b3 ™£IfèÇqĵ$\ıñ‹˙üħ‡Ce×IĤYċä̖ŸšCÔ´-oÂ[€Ûvá]Eĉ~Î8gàG{G_}Töy–e;ĥ\w\–eµ.•RE–eƒ<Ï÷³,ÛĠżûÛ;‰( @%™ ĈdFIÔT›¨~G{D j8*m<ŞFyÍĈÉŞYp/c2ÌB޽t]˜a {Ëo/²Ŝìe)ċRdzvudş@ 8œŻ$Ĉ8ĵ2@ˆHġBáÖ —µîB†4uıîD2C’$sQ-É8ÙÜüî×·sBQv.İ!˘ŞHyz£[G^È ”*jl%l:œF~i€E¤O‹…Áö^™gO,èı숈”Rްğ£,ËöŠ£ÇòöovIˆşôĤĈdF€W£Š|j–éˆ|Én@)Gl0ŭ$eEġĤµ÷ah[ìdÌn´šço-Y¤q˜kô/żÁ·żï”ĴĈ lù$M"842%Pĥsŝó! µ7,~fÔN)XOteGg"3¤iڋx!Ž•Ë?ĝé²7}vƒAV*5ÙÀ€ĉbŒ i¤tWY}c|f„HUYWd}…²=lŬŝ=VYy'˲mÛ?:.Š"#"cÈJ¤Š˘È²,Eħ_Ċ6ŝŭ˙{‡1Rˆs·Ä‹M˘%tG†g³!Ŭ•š*NġŸÚ'·Ç°­vnˆ;ŠRceu;ó76…ëQ-ĊqìÈ rŠÏ![š2”gI¤H]’ËŒˆ´i W.²ĤĦbŞìÈżo"™Aħvé?żRjCfP…2Ì6†ŠYF0Œ7ĉo ĵM›9Rh÷şÁˆĈeFÎОsĴc ƒ{wm?ÈbĝMžçğ–â}Ĵµ.ˆ¨´€Tj­‹<Ϗ‡áa–e{úŝoÄ£/ypÁAÄĴòƒ•˘.áĠşşXż$=’áĠïÛ*R¨– {hk!ÖÂĴ€MéŞìÇJ@ċúÊğ½Á·â8^Žx>MӞ”2jQÀ§QjÍäôhÔe D$—!9ği>Dר:X+ëÁi,™Á2·ĉ£(ZžÛĵrmù­ĉ??25(—áTĴ7gİ@Ì †RcSéhŜ Éñq{‡ÖMAӊáèân˜Uˆ <üŭżbı<~”çùVžç{yžE‘•eY ~jU–ea³¤#K ß˙Z…m­5ˆX5t;êqapTËş˘eH^yOyĈ}ídzUBœc] =DŜĴyîAĦ1·qÛ³—ßBĴY)Ħ™~żsΧħ5n²S­¸ÌÎ5[ù üpÔn—ı[u-9Ê7ĜkmCqÊr]ƒÌÇħLÓt&ŽĊ8ŽWnüòù@Ĝ7GE-ä€Á–•¸-ħ³qĉzÚ ‹RS=Û³9o÷Œ|WÙĥ30“ Nú]&˜ä`‚ ĉ)7P@¨­ÚMÍ÷Ó¨ïh_  òGġ-+‚Q­sgóŝŬ½êcq€J RL#ıô†Ĝ^¸ŝAE+v&İß\ċcÊwÜ0mÁ. TÒeŒĠŭ"rΎŜŞĞi³£ħd)ċêċï|ô^2·~TĜ!M Tdĉl<àTÇ4›ún5eŞAWÏB‚F%„FNf5ŜŽ÷ĝÓßa•_Eħ•çùŝp8<Êó|¨µV^vTŬ´Ö*Ïóáp8<ʲlż(Š-ö˙ŭkĈ#è²Ĵ^żëùöĉìG7û@uŽFʽweAJQMò^öċhœéŽA`“!1 ÔÈ3…•ÍKĜ^¸~É*7,&I2›˜˜<“È Ó,7v'BµhˆH­dÂŜߨ›Ŭ:{Mw6ğܳ*3Ĵ\ŝè—×ö3­ Užöġâü>IeOînŜKš:ä€Z4~ßÏeeŒÀ"†üñ—î’2û2Ïs— ”ReĞ\WŬˆ¨TJ•v&é Ïóŭġ'w˘ûP HnÈŞ#TIŒ7ÔÙ3òÏ͑S­tĴ’&}Ğżg5SQ3ˆVş:4Ú & ċħBòÎL>ğv3Š˘•8Žç{½^/Žcё%Mê)pê–*‰²px už ] Dš@J×kÖblÖÄÚÀÇħpd)ċÒÜĉ•ëKo}káö~]j”%5ËMŝIé-žµÈBmċ­|vY‹}×Xĵ‰Fíç‘uzŝîß°‚ìQQOò<ßͲì#3¨vı£ä†<Ïw‹˘x"?ŝûÇ p@Ž ˆFÔÇÈԕ-ır¤_D%…DMŭ>ĉ=c€`-0ò³H;–)ı+7°µpí])ċZÇ I’Ìôz½dŒ›l—5E 7œP’1­p4 JOä2#ż÷ĝ:ž@g%3¸ì(MÓ)ċBEk×~úë÷•&v÷¸„Ržòq5Dàä9öbT(•¨&3´ĊTu#;hŞĵÂ)<‘ ‘éñäïcĠmµLùí<Ï+e;{TúÔş9rC–eÙħ˒ĜïŝöV‰rhU§mÔPíxc G[oMS°Ì@…†kşbŽÚ‰yχú95ô@ƒJÙ$ĊÎÂ[+T9:ğBUşÔ ĞôÚ ]àœ[ĥÓÍLMÛ˙qc7‹l  ×oŠŬ…ëïZĥŬ|šĤŭĜÔíÎä&²¤ĉ1gœ5ĠĜC@ŞVXnÄ&ŭY£FfÄYCħù5.˝D™!Ii+â8^ü½Ÿ|Ï-Ĉ·öËÚ <%jíٔ7ÜbİZ4uƒĜ‘ı^é†}E³½bé֖ÚÏ9ƒbûöïħŠšÌ`³“²£F–”çı˒ö‹˘Ĝż˙w„ˆ ĦÁ…“ñÑàş™ħùvĉ5ùÔïú~ŸÚ])€{U>_˘™éÚ²˘N0ŞÖË\C0ż~[ŭĞW…kQ-%I2ÛëġÒ³şÉ†ho‚­*LˆH#ّ[”Œà€Ĥï cŻßv 2CWv'I2Çñ˘bŭò~y-ÓÀ^Ħ •Ñ­sE%· FV2£zpjjÓUì:8ÛòšĜPPĞLç/Ԟîuġ ùŭ;ï{:ż“çùv–eûyž—eYxì:=éĞÖZ•eYÍ$ċyƒŻŝE´óp]Pá}ú7Ú%IŬT÷İêÚ/ïıÙ-7§ëñ…Jĵ:„6ëԆ˜GĈ<İ.­­"è‚0\}s6ë-^—R.Çq?Ĵ2ƒG`pl:ĉDŻÛt^2CŻ×›•R.H)×ŝĝ/? 0öÍ@Ù>5ĉŠücÍĞ’SMç֎ü  ÍY£ÉĤk/ŜŝĊ_ċ„–­¸YœĠÎ î~ĤWXù‰ËŽ,™ĦZ—Ó‚­µvtğ,Ëöò<ßâżû_o%¤4˜¤aj2ĈÀÁZ†6§ĦCóL·QĞëZ°ŝŬú{çQ„´E´vÍŞAùJOaÜâŬYĤó?7n´ Ğïˏ1ĵ³GEŝĜeGápP–e~0r_˲̇á RnĜßyŜûà¨í!ĴzC7ˆN£–L’+Û)×o#4Üv}êĦ{nÎÙ°ÄîÖۏ18*ĴbCi (%ʛÉŜìċwm–tV7ÙP΃—i2 ’B €4š ¸K³l2&+ìÉ^Û+ŠP˘k“D’$²ßï÷¤”‹qŻl~ç£÷£ıĊĝÓ}£[WÛz“ħáĥ;yᗠ”ÖÑĥOJŬ^'—és> pèòOnŭk\}YĊ˘(öĴżQ”r@ßÔ ˙ÖÖ()·‚Ğ{EQ<üğŻDœ‚À¤ÉTÊR€èT`Ô*ŭ ²6 nƒ1R„ ۏްż=D‘ùݚüċĉ>1wÒË×£(ZuÊ ½^/>+ıáµ/Û9Ù(Rg m5½<ŭşjA šqz}2¤WĜIĥĠd)ċ‚µ™¸žk†ŭ’ ´‚*t-¨jéoĈf‚%Òj÷ŻM–úG "@G†QSğuċseVjD&3₁KŽÌ²~9üÂ*3상Gfc@Iu‘-Ûİ<ϋ,Ëıá³ûBïä ²òuâœ]Q{ÈÖ×òÎÙ,×ĜÙÉĝñ!r3°ÛPnÈ Ìŝ½Òˆ9p¸Ĉ˘JfŻDQ´ìW8@È '.86ugĦ8İkUċĴöĴ|O¤ÚÀ/ÄÄREfˆx^Jı2³²veñí?Yĝü()R5XĝĠ§È1Á˜s:ġ|ĦTjÉĦˆ­=ƒö€‹<Ò™µ@i'˙OĴ¨šÌ`}†–ÌBzŠĴI—eY‡JıĦ,Ë'ñízB"†>i¨~œŒj+ ‚eÉÙc2–x´5À“­†Îá‹Y›ó0r‡O™!Ùü¸[şÉžÌ^ŭÀfI išÎ¤i·|’ıa*@òv·Ş +J¤Ñ ‹û†*Mĉ˘jqâ§ÌŞĴs.µ#ŸaÙÒQÙ$­)ÒŝçhÀŞË܎ĠÚpD ÁPl=ÀñW·ġ*+>-ŠÂ‘EQä²#= (Ù,)‡Çyžïçy%~ûßoDLU'R%ŒÚn²°Ú€GG%>>Ĉöîyî^<1a§Ü0 F•ĉXĈÉ<÷n[@ZJÓÔıÉFä†Ó–djϐ@j€ÔΟÄόĵ‹ÓÈáuiNc]Íì lš$ɜR]ÛĝŜO֞d &#.j­=´WrŒ1UŞĜŜPÌÂZjjjĥMèQ;3òĞncj9σğŸbñx{Œ2nžç‡ž24™ÑD`rÊ VoGí=ı—<ĵuÀa†°yÌëòĜ)ÀˆZ~Fŝï(EĜ?,èáöö2Σ ŒŽħQ0²‹%) *4tĦQ,]O÷g6ߍ˘hÙfIg!7pbĵŜI@ €4²aqe;ğkq™‘“vİ áĞ|-@hŞR#3ĜIŝ…8ŽW6ŭƒ÷ÒĊ•äÖAÒ1ìĦTşħ’VÊ ŜÚê|~”ŻÌ ÇPğĞ’ŬxÛo#ž (ëwËvnŭĞ\}Ŭ*×e–ÌPa ĵ â˘ï•RÊÎ$Z×Ù­è˙.X F0~DÁ¨ ¸ÔÁÈ3™çán†'ppCiŞpˆÚ`d·#ë.0rbĠKòLA,ŜÄŜ•›Bˆ5)ċ˘Í’ä ĝ¸r/^ë²9&û‰HŬWÉȆE›ŒğAħİxuËuÀdKŞ·GfXBĴ]ûñŻnа›Û…6 œŻJàz:…W{öâT;£6´n¨– ÒÚ 5óJħœeIĊ;ÀƒŻò5üÜ·™°³GŞ|ş@‡Ĉüĵ*ÛEQ M3é (Švû7·zĊ~ε2ŻÇ•윰ž—Žë()E8Ĝ˰ġƒÂœÇä)¨WÈB-qKÖ!Clàŝ}R„Un€ÖˆîÜKHf.K)—â8žíġzŭ8Ž#ŒÈà0Ü.+(5@êܰPŬ3BGi—âÔÚE–¸ŬµĜpĵƒÌpuá?]¸uP@“aȕ`Ĥl§ë’¨ cŠhdm\nÔò3˘z“´§ûÖĦHà6 ÉAˆjİö(àœaë˙†5:~\–ċoö(/Š˘<Ħ$G@iäĤ”R³,Û)ŠâIúĊoĥJ!ÀÀ·żHU™rƒ*4ö2l?>Ĉ¨hüŞtÔD)˘ŠDâÜyÛÏ­› h^(°…ëüQïÊûQ­Ĉqĵ˜ĤiżUĥó%…ıĦ{×g>O7"ÒÈùÁĵŜ…n.nŻK™îd†Ĉ˘„T{½^?I’)ċÊĠŸŝúç_——ùx&zŒšJû̟§İl&FêJ(µĊ²ĞTó.ıâ‘DÍĥîcÍgz…İOó<ßÊó|ϒÚd†IYÒT U–e™;Ù˘(öó<ßżû_oħ èč¸ĞaϜ FeĦħż3Äö“†ƒ²é·ááM%ÚIMZê`Óĥ5•§Ŭß12 ^*¨£ñì ĥÒk›Np5ŽcGn˜<È ŜyYeFáh@ JşuɐħĥW×îššÌ`m&ĉ„ËBˆġÍï|´Uhd™†*µÑk = ˜ùVǗŞ,şanŬ -?ĦVÏÈĦç Ö„ìŝmÌní£ÈxşuCkÂG¸viÜ÷şgT–e‘eÙp8Eħ£vÜë=¸uÀ#f…CÓż|ŒÊBcogˆ'dCU¤0r#Ä Á 'ĉéŭ>sVÌÁĞ‘‡ĥ“­é”+ ĉnöúëoYÁĠyĞèq“ċn²ÍŠLĠƒħĈ$ µ]93˙î̌^ƒ6ҘR0™ay?}ïŬŜÊFzë ‡"ŞzAĠÂélÊİeÂGġÚ§É#6è.†Ĥí7Zĥß~˙Ċ ¸2ˆ2lò[Ĵpġ'¤zä‘NʆĤŭy£lgm)­rV|ûïs›ì„{ŞĴ FEħ·=ÄÎÖùP5³ż1`Tgöh[3.6cÛñ6QÍNdŒŠP 5ÄÊ Œœ!"‡³Ôí%‘ĥ;H‰™7–YœnZó9KÜdO½2@8Úx¤ë9#Ĉĵ2ż—Ò¤Ċ…ÇqÙŜќ”ryfyġÊÒ{˙iñöaAi]’Òħİš]ëiïswüä×ï܃ەŬ†uY/ "v>ŭwĴÒÀ‘v™ĦEġ—ф2ŜÄR+KÚ-óüIòĊovx?‹8Xā’ Jŭ]Ó#ʳ­ğiÁġ,—&ï˜iê$‚u… ³t¨È^ ùQ šż.žôŻ} „Xħ3Iŭ^Żw”íıadĊµ•TFˆHc2%Ŭ–ög^I­ĤùĞ—MCf¨H ž+l?Ž)ċʕŝâ}Í"~稄ÊuÍÓMLÌSnRmĈ‡zĥ‚íPĞħä/•Ó/*'àl뎿ŝœVXyےö­*wn‡aOʀ4Ĥèu•UnÈ=7ÙÇüûY˘‘. JÂÁ~†í-KVè*ŸŒĦaáĵÁâaŒš‹ùçĵlÎTİ‘ÌŻq|ċ’/¸š˜˜<“È à.R÷‚Ì[`D™ w:ˆŻ‰â4°2Ĵ”rYħ~é{?ÙĜÊKä…2 P 2ŞŜÜR½9Ccu%땤(‹DTÛĊv/Ôm0jżxnˆċƒû·0wĝ€—ù½˘(v,™aà‘&ÍM{k˙@ZkmÉQÀwġ/żŠ÷>>Ĝbk?C–—ġîùœ`„j€˜4ŒœŒkŠzT|Ĉ9¨Ô@İ@™Âñ܍Ùaş|ÓÚRÌ÷z½^Çb ıaÒìëNäeIĦdİ33˘Ž9£×Ë vÒëkJÁ8vöhAJı²ŝ'ßy']Ùì}²_T%8ĵE$Ñ>ÄTÛpûóGZ·œ^OF~Ş$À Ë!vŝĝïXê£z;WĜ24=˘Ó“ŻÜà†dw‹˘x">ùßîé8´²˘ŜA8'Áœ­ kÒG›ÀP ĥÀ¨ú´ˆsDó×0ıònE+RÊù$If’$Gn8њâµ)ÛU=¤W´äé|Ħ‰ZìĤfvÔ¸ş_Ŭrp:2CÔëġ’4M+2•ŭê\[™‚ʵ}ĉ**ÚŝÊhĠ*GÙs€‘£03SDñàèÁWùĵŜĥّŻÌpRVtpjò,À,¨(…ŭO™u™Žˆ*>+X}ŽÌÈĦ8˜ĥ>ŭ-Vô`Ğ,ËÇY–ídYv8 ²1&|žĴgbŬôšì lfÍûvÊ<7) "Ħ ûŭ›óyÒyÉ Ğk~ûíŜÚfïÓ½ZTI(Ë:óq›ÀşÓ]ïÀ=?DğXê‰r@Ġߌ†ĥߑéǔĊ;·~‹5^~SEEfÈóü4dtüğŭ 'Q#K*ŠÂ™÷97Ù­ŜWży {3àÜÉUĜATv~0<ċޏŻ+ċĠW+€7Ŭd[ÖğÖìZ!;Ê-Ŭ`ÒĞïÛ²ŬbšĤ3qËı!¸Éĥ—\ßf D¤ñˊÛj³ÖñĠqx<+™s.,™aFJı „Xğò_Q(àÉ 4‹™o˘çÀÈfGŒQ'ˆ([Fj(34–uŞĠ‚ĈeOjšĠ”ÇêÑW _sjĝYžçÛV™a˜eY>™ĈÑ$°š†Ü Ĵrƒ›Iڎ>ŭ‡Û‹Iİ€L À–/Œ*Îé–ĥœk0BCıA\Äì/šo$³x_[ċ‘܈˘h)I’Ù^Ż×›à“ôz“ÈY%ó×fŽ$ÒiÁÈWd¨ÄÔjŞlġWżĉ;‘̐Ĥݰ21óRÊċŝâҕ?ùîòg•è2ê h%“ŝÊäN8_HV*ˆÚ]ïN£ênĈ€ˆaûÖoħ\mв|duëZÙÑYJt8M"7ìŞÁá£Ù{˙ħ‘5‹ìbşŒÚŞèĠŭşz¤êÓ>pĤMَZ•1T´ôċb¨PÎŬHvÓÍwíLÒYŬd_r³‡¤m-"Ru³ş$ä&6 ̓ĉµ;›Wàr9#™ !xšĤIC™áGżúBòÏ èÂs?ġ–n7Ë:@Ĥ ŜbÙUĤ›ŒĥQ%8<ÁѝOi—ŸEħ=…ÍĤLiR™c²§ħ޳Vß.‡Gyžï•eı•Ŝŝû/ĉf{€2²Lş;7ˆÏĴrƒî|Œİ ŜġXĉ˜uµÔ( …há2E—ûÊ ½^ïÌä†WżlGµïMˆH#9A#?` £~•…y§!3$I¤•‡™‹˘hQħħù½Ÿnlgı•äĤ²‘nŬDûÒ#oqTT ǞŒLvkƒKŽì›Û˜;|tÈËìžÓ­Ë²lhIc²ÄizH“2İqÊ >ıá ÏóÜżġċ|ñĝ˜q.YwĦŒ`Tï|ċ­À ½,‰ğžQğ/Uh“%)ˆ ìÍŜ\Tñì•(Š–àjǢˆıĦ’ΓHNX— 풑ĥğĥW†1Ħ”Ò 3Xy˜ù8ŽWWŜù֛³›Wûïĉ€ÒPJ7¤ĉŞaX˙Ál£\ıĠ^— ­jèiÁÈ{TŽŬÛżĊ:+ÍÄ$2IYѤ2Ŭ¸Œé4䆣ŠÜÙ?=â³3ĉœÜ0í¸ËÔÏ F!#3IŜ‰ÏPËVç}ÇÌçvĜŒ!/J°ìQrċ›%-¤i:“Ĥi,„A)\#Žè•[T ]mĠhŒÈ_V^rŬ¸j'#Ê#3ÌĈqĵ „Xğö³_żS„­aYħ먵›ŻÈ ŝ˘è}Sùżi:{™™qÌÁbŽÁŭ/ĦîYÎQĉÈ ûV!!?ÍÄ8Á)2Iä†ÂÎ$EħßŝûO—b­ Këpë„>7ıż#ÒĉÑ*@jÎQsÏÒVeo\tĦ  $]Äĝêş›IJÓÔıÉF˜‡ôê‡íOƒħ @š¸o1ÄJܲ.ÓU^ZŻî%3-™aNJı’ÎÎm.狟îgJ×ÙMkV€Uŭ#ŽzÊ]—ÍÁMòœ^§# ë™Î_‚Uu¸­ŒÍÄ%Œ#3L›ĥ4İÔ7"IäÜd”>Ŝ8˙÷ğˆH‘1Ĉƒ v!`OMĝßr“m)€ó‘ĵ‘Ó¨Ĵ¸3•Èú×Ò½tŬ(Š–m–äÈ bJPÂkNŒUâ! ìXe:ÏIŽùŠßìeżNMf`h‘¤” Q­\ŭñ_~È£DÜ9V(•ġ=Şì_İNµœ.Z+3òÙܵCöIr@^(çDAàösc‚CÄÙŜì|öZċúvžçó<ß·€t2¤ÒܤŝÒ$9Ħêı²VÌ m9˜r[ÈÚê3•ß‘µİ qä{Pé1ğwĈ ğÎ*3ŜùËċávi²£KİH2CF4yE™†ÜP£›I²lğ=}´÷`~û]& ˜¨­Ĝ/ŒìëŻ_Úc:57k̕ïœàk“ Q=.àşPÈnöÓġ·¤”ËqÏÛs(&Ëñ:‘ĵFĜi4{ ‰ËŠ/7ġ2NAfhÜ|2C’$ Q­^ŭèW"JÄçy *íŠjĠvF¤+AUŞÈ ]°£eşQl`žW• ċp{ŸŭÖ¸ú,Ïó'yžïċy~ìġŽÎCfèĦ1™ÒİÉ J)•çyîW‹˘ĜN?ûÇŻç–çÁ¸ĦW˜àFRş&ŞÀİëpúv ċ†–ĉ *(/Qä%ĜÌU<›o !V­”Lżßç&;IGŻZَÙ……9¤Hcö²íkŞ-ƒÑĝß{ı³"œP²k“£(ZÛüÁÏ.m„AĦA…•iOúsfvĠíĦKjJר1Ê cÁ¨2AƒÀ%iÂîmôvÉ2ûş(ŠŬápx8eYĥ\w2΢éü´ÖŞ(Š"˲eÛ툯˙óy½—‘ÊÁ¤ç”ëvŠt&0ŞA‰*ĥĵûš4R63pt_ä”$ …TÄĜJŻ/#J6¤”ËRÊı$IÒ4M§u“}µ—Û7e u.Ï4’UŒ.-Żᄠİ2áóÉ Rʕ7Ŝ}söÒġ™Ow3TI.À@†&ŭ}5Cħ§ħÊ ŝ"GÀȓtŜGš+ìŬŝ-ÖDEfĜq³GEQœ¤Ìp^28p˘j„Ü0sGn(Ër{ĉ›ß<ĉ333Äñfí<`›ù›…Ş4=J`pY/kĝ$yŸSÇ' È Â5ħ•\~_ħš$É|Ż×›IÓ4é(Û½^äòITĦé”Ŝñî%+ù^”2CEkWúëw” J³t•–!ç-h‚iS²k9žşš†!Œİe†ĥhÀHYÊ)ħÛWÏ @ñ䔿T‹(>+Šb;˲};Ûsad†q=#ïŝ“È ˄–ÜàÛR<‰oŭŬ­ĊوeJ¤Vއ]UnjڙÓjwu²´½Âü˙—ĉı4Éì%<’W. !*7Y›qKLžIz=È J…e6Ҙ“cTÔĞ*GU=¤WKİáD2C’$İ”r.Š˘ċdfîÒÊßYuƒ™…g„ĦÁ‰Y?†ġĠŞÔVžFdqhLfÔ>kI0DħÀàË?b%ÛßQEŝWfhY”Ÿ‹ÌpŽÍ$rCĉ)7Eħ‹­û‹{·w‰,á`RŒf(ç#@ä•SĞAqïïÄ0pß+Ìŭ’²¨ZCg%˜V8LÍeÉòukŜ7g3n1†ÜÚ(7ÒU/)D¤Ñš³ħ£ĉŭò¤ĜDf˜—R^ŝáÏßgi_|Ÿ°VYµ:0bVٛ¨ÌP% êf]4alÏhbŜ*?pkiÊÀPnc÷öïħéÛyžo[e†,˲ d†“€İqœÀ¨›–Üp˘W’RJe&-)c;½óßôfİ˘*MaF>Ş6 Mi;˙sr3I5ÙġÜÚYÓjä|ñ:F—Ŝ³YÒBÇŭ$IĈ‘N´Ĥx%ÊvDMĈdˆH#{/ލcÁèĠx§À”d†4M礔KBˆġKßŭéċŬ\8S†.=qNğ f³£†˘ĠêŜTë×5†h§#÷=ŻMNYÄ0ĵ÷ú{˘bxזëĤ 3è às|ú“È ú„ïµÖZEQ ‡áp¸_–ċNôĠżŬ^Œx–F&;=ÑÀo:0jlşhĝ 0òä ëv˙%[Š"€òqÜäĈŠˆäş”r9I’ùÔh MKnËv¤×/Cj¸Éu.†ô²ÖìÎOf¸ùöġıĞoÎŜÚÍÀWUÖñ‚NdË;uB9°ħ žR+â”`ä|qĜğŭ;Ĵ PZ!U7{ôÈ Àé¤!Z?‹SJ)5ó<Ϗ²,Û)ËrköŜżnñ™Y“! fË=F ĤÊ:„ÜĤ#<ŒF 7Y˙:2ˆ"†rXBġÈ­ôÊûÖMv×ëġ{½^|V7ٗ=K"7 uġ}ˆHŜ ÒìĠ÷ûğDz‰zç%3$I2cÉ Ğ×ŝ_>Pšp˙XA+‚VTÛĜfZMıÎuŸÁ5b3qJ0"ĉ„‚ƒG@ñä.Ê{_¨%VÜĥ6áèY&”íĤ!7Œ}MÖŜ<‡ÇEQìEħ“Ŝŝğ[ó=ID9 @íÚèÁȗq˘Zv½“Ô@ĥ9ÈÚ ĦñAkkĜ¨4 ĉ7ñH\şêl)’$™MÓôÌn²/}™‚óê+ Ëo¤ÑĊû„}Ĵ3,ìU¨ŜM£Ì$I2EÑrÜë_Zúğ˟îçJCċ ¤4¨E³Ä*ߜ&™Ħt˜Ó‚QM|hŝHpC?ÎîŜÂJ·£‹üQžçğyžvĤé]tv„ ;`‚jƒˆ€Š˘ĜĦŭG÷÷?Ûg¸!s0fTÎ Fäm̈êŻíBĤŬ–5ŬdĞ,İ9 ÇÔ ’sì%×çs9wMJıÇñ\šĤ½4Mr÷ÖĦ×g‰œs É].ûi V++Ğjì/"—Ìà²#)ċÊċŝâ=‘ôĊûıfġ™]öx0]UišĞokçí‹JwQ'ufLŒÔ`ğŸ˙kBî\amv”u˜ŒĤ&3LȒş@c²Ĥ‘ŝ–Un¨È EQl÷żŝç{ŭùY@²šĝ­Z&Ig£ZıĦɸkqĞÉ £`€sSŽ*5òLA,ß`£+ï[ĥŬbšĤ3qËıáġq“§ı÷ €ôrŸʂ’nĠ ĵıYH_Úkà,Ê KQ­]ŝŝÏŻìċDžq„uşuŝ…Ċı1ᙑ?|İŭµşm7€êïyÄÎÁ#†á½Ï‘îÜ?ŽUö•W›†Ìps-9@h’=…ĥ>Iùp8tĉ}Ûї˙òÙTf€ĠÌϨµÄéÁ¨*ÓQÓZÚ¤5À¨EpèZcµ2)(+³GWWıQ-%I2Ûëġz|’^]rC5hG-ۛ`zG΄Œ|ĥ÷…uÖġ^ ê‰dKġ^Yĵùöó×ߜûd?3׏֝E'CfhfF2ƒˆ­œˆT·6ŬX2 Y 'N@İ­ż’ĈÁçżÇ eœnŬ DfN§QogIğŞ,žÌ?ŝ÷í¨ß7òLIäY힌€Ú´Ż²!OżĦuĸGÁ§Vëd‰tİl"ǐġŻ$ğñĈğ–Üàğɞ‰ÜÒâ‘Vvħ ÂH',˘1UN²ÎióĊgÄt0Mَs.’$‰8v°ĞW>ú‹÷ʒpï¨ĴvÍ5.“g3A#Ê nÖÍU˘Ĉú$0˘–Úws!e‰b޽/oà“ߪ%ä;Ş·=*ž5™aBÙn[Šħ‚ŻNı!˲Jı!ıóŸÍö""]ŽĞ•Úlŝ<`3Q‰ĉĥܔĞUCM›0ŬTÒµï²fóWP\nÉ ‹6K:3ıá.ÛiŻ "RsÇÒXLŞ4šêô5÷_ÎrŬXÊ·%3¤vöhEĈÉĈúŸ~ù³½Ü,N…†&‚R͏/ŞF¨imàíd0ò×Öŭ‚1(ħwT`ç˙‚Uùd†ƒ,ˆeY8™Ìœ_Lġ\œÜG"­µĥ€T™÷ħğ_/ĉßò˜ŞcІîÜÙÁ¨fFR£œ:FV8·>ħœ›ĴîÌ;]f°“^],ċì•(Š–“$™KÓ´Çħè˘W–ÜÀĴrğ·× Éßi5OĈLİ˘-€H/ĝÙs2CÇħµš^R._ŝá/>½™èÖ~*5Tİ͉âK+iBF7šáî{u0‚™9d%v dûÛ(~˜}Q–ċVžçû-2IÔê’Ŭ$ódI˜|'eKÚ*7 ³,;¨Üdïŝó½dvΜĞĞq€ŒŞ*Ğ“"_pµù9|ċŬċUgĵJ#/ Ĵ=Š.`³¤…4MgÒ4…>(½âäÔ„‡êjÀQġ…9E;IÚÔKĉò8™AJġûŭ$I’ı(Š–˘(Zğòƒ_\Ŭ*ċefgJT3ĥ\Ô¨Ż7×âüŒ¸?gĜßËqpX%éğ@rĝä8UٗV·Î‘JŻ\7nĦWŞëXš/²<1;;§äÈ ƒÁ`çù~Y–;ñĵµ(†%X @ sÀ.Œ\–ċğÉÖ#g4Ÿ0ôo]ÓÈuEĈM–”iB’Îᑸşîf’Ò4un²Ĥï!½ô2£H“k(ÊôA´Ĥ†hƒû…βԋ B]÷ûvEfHÓ4J’¤Çñ\ÇËóWo1{ġÍÙOö 0‹rîżw{5qÔf|>U=Û ×tö2]İ;;Cä6°B#˙êĜŒÊG6;ÚħĤvYQ%:KñüÈ Ài*RZäKÚĜ)‹üÉÜÖï·EÚ3¤ŻIw~0޲\ï³l€Ş}ŸóĥeKËv ¤4TĦ‘ġ¤ğrŭŬ(Š–m–äÈ bJP:é\ħÁHûĉaĦ‡İ£ĤËx-ê„ ¨ċRÊ_Ìh™aœLPƒÌ`g£(Zğöżx—v*êŒÇ^MĠO3şĥ_ĠQ(­Â÷iÀˆÛû‡C…ŬŬ!ÊÜÊċÄċ“/ĦŸÜUĞ‘ŝ´(Ší<Ï[d†i‡`/œÌ0Ħlw!äë~ğWĊvzçï>›éĊ€0~Lˆ #Ÿ²OÖżÊ‘Xš&~T •-E×s@Y‰²,Ááßĵ)„X³ä†#o7–>icġò•íX›ŭ"’éZ6&˙,qç:izÙNžİÈ RJŸÌ°,d}íO¸úùA ò$È*8ğkHÀ·™h.@FĥÚÌlêĥTŒ•†šğŸ4ppPàà 7ŸŠó=ù[Ĵ¨£]”…³™Ĝ·d†²#+z‘È c“óÖkë$7”eY ‡A–eGEQì°íŻï.w9)³IhL&ŸŒüş’?“DŸ_[µwĉƒdl)˜É0l%חHö/[)Ħı^Ż×˘Ht””WŽàÀ(ÒÄ#ÀŒ Wž7^Œ³JpòΎNMfèġzqŻ×ëK)ç­2‡˘?}ş—Cç•ëZˆŽjĈݍ"İq™U`dÚâèÖ-¨%tëBĠaw7pXVÊŜLš ûÈï}†˜,ŠÂ‘œÍ„ @f˜%M*Nàun²lçÜd·füۃdaŜÌ#ùWóE€‘A"˙ŻÄ |ƒ9L–D;§-=³ÔÈ 6w?—œàêB’$½–àŞ/)ôj‘Şĉj 4@ê:?T›bwŭ^Vä}exiìĤ&3¤iûÊ ›ßûéĠŬBp`L08Μ#*pg3au͚ÙĤç­[LhŒhžµÁ¨*ìíe(K] Ğs"Ċ7Dïñ`†Š;^vô˘’ĈeCÀÙÈ Ê*7¸™¤mùċ?Ŭž—˘bX—“]ùn²şê‘F­R60âœ5ċÙÜÄġ‘´†.4doù !ĚUn˜óÜd' Âä‹àœvC¤ŽÓƒ×Z(äMĴ;é 3DVҎ^à³|ìŭí ĵ"3XŞ÷|Ç+³›Wn,ŜxgöÓ½ÜXƒJo~Èu£mJ£'޲ċO­ÍĈ”é:Àèĝ°ÀŜ^Ö •ÊP›#ìóßc=*Eñ¤(Šápx˜eÙp 2C—YŜó,šœ‰Ü`UÀ3ë†ğЇGv~ż#ú X=È}A`d>'‚vW¤G畽’-3$ʏċ•˙H[–Kİ0˜½9s$WŜRN&ËñŞıÉÜrdžeM·ŞĜ´¨_Ĵè dŽ&™ĦoÉ Ğ7~ŝ_ŜWšħo ”C ʍLöjkÂWfp ž&VDp:à#FocÀˆHc'ñQÑ⋍€Ŝú ´ó^‹ô'EQlÙıœÁ”dgHf8Ħl7 ıĦS ÜRÀÛnŻ,Ë­Ŝ×˙ĝĊÜlŒ) Ž ÜYcŸŒDkkÍ·§s‚Ğ-ŭ;çĦeĉŠRƒÍ\ĈCùĥbĠ Îöz½dŒ›lWĤôò’*‡É!@)3Ġê ŒħšYgÁÈÑ4ݤ—y*2ƒ›=’q²ħú'?Xŭ|/7CÁ 0^—kŞ“…ĴQMfpe:Û3RŽYw)°·!ÏĠè˘ézàX ûòwX6d†GEQìıÙ#ÔËDf ÊytwıAy䆃<ÏwĜÛ_ÎċŽÁ”ÙS› wf0ޏœòhߞ7Ôé” û’û„˙9\òTj¤IċµeDÉfEKRÊ9cTœNë&ûòîÉ5QC)Òh–12gä.lr%nfàĵd+Û²ÇñÊĉwòA4;Ŭ:, 3m†Yµju@\“!3°ĉNOÙ§Ż½ZŻUŬ`T%v·mż¨½hş~ž`@ÄAĊŠ{·+2C–e•Í„Rê…$3œ²lçß7-ıáȑfüËŜŸ— Lz×Í.Œ Ğ’Ġ q³jàžŒ9ċ†şÜMí·ì@SŠAôFO˘KïGQ´jíÍûiš&‚ĞŻıÎRŝEQ;yžŸDf8iišĴċi•í.‚ÜPĜÙЃ˘(ĥÓŻŝáöò W eĉµÜ"w`ä;˙Ön²ÚGòĈc9Ĥ#w:j †ÊKD3kxÈ.]ĥ3IKišúäŽñ½£—˜Ü@ÏîÄ €ôrĤK–’ݽ!jW&Ag‘ÎDf°Ùќ”renó굅7>˜˙t?# Ì•ÑÚj­%‚ÂÉúĝ`¤=ò”Z`Dd8ÚÏğËIn薛F#ŝ—ßù6„zhİŜğY–½Ĵd†IYÒ8 a:7Ù<ÏŠ˘ĜQ‡‹ûï‚1o<ĦÎèÏ F°ċXíğÉ6>XïDdžoqÀİÎÈnv8’sxéş5ï;‰Üò+78ğ­*@êΎ ;Œ*aU7+.éjU/\ı8™Á:v.J)—ŻŭôŻŜÏħŻö ”g_Ŭ"3pÔCĉn‘ÓäĦ€íQ‡ƒV„ŭ½†Çċx0reH™—ï@o}£×#uĞ,Ëí,Ëö‡á Ïór™A 3LȒĤ-ÙQW9Ò#7gYĥ_–ċVïĞĝrfŜ˜Gj¸0ò3¤ZÁĦŭw£"w•›lûı-ħ”ÂpP‚Ï]ĊClEъ”r!Ž~’$ñr‰Ö/zÙ: XÈ u-îœUe:r˙îûdü…ç=-™a6Š˘%™$›kßŝÁêŬ£Â“²³Yşy’pĈÀĞ>5ĵáŒtíkX*ÂîîEĤğ eԐ8D'Ċ7À’:ĜEY<°6‡-›‰—I™a\™p9Ħê>Kn(³,sä†]ñĝÓ;K|gq°8²Û¨óƒ‘‡Hžr5Á¨:ÂĴ’ŞÄ#:ž›8Fe"‰{x$pmH)—m/)#%4.û‰ŒèB†€äíÎİѤ5î¨u ŞikŝBeGç"3H)W7ŭ÷âÙĝÓŭP:7iĦn% Â^DšĠ PĠ3rƒçvfĊ_§òBco÷ş¤“ÁÈż`#Ê‘ßğ…ġ_[Ŭş];{4-™ĦĞd÷ĵÉ “Êv2‘²dQ-ÛEħ[ĊÖìƒ˙ùˆ§=0F °z~`ä0Iw‘ìùà‰Î3ûW#Àŝ²! ċY=sM>‰.;ċ†ı^Ż×o)7œÊMö…Î’Ü…£5ÂR¤ÎÄż&Ħİê)9'TRx‘ë½gVf¸úÑ/oìċ%ö•ħ—`†’ëż×³Ğ kS§<‡ÑJÙÂŝo0,ħż70ÇîÄÌÈÔ9ç eĉŸÊ{Cî?ÎSŝyQ;ÖvPE1%™A9“&”íÎJn [ĥSyž—–_ĊVúġßßZœáštaûoìÂÀ¨$ÔÊßıĦ=(ks3f³êQ0BMw&‚ÎKŝÒĈUgK‘$ÉlšĤgv“}ñW]úGĈ7‹Dŝ¤yCdĠÊâĵ.ĉCfˆXXİ˙y)ċòìúĞs7?˜ûd7Żwğċˆ6wµpÖ FŽïSƒŽ fn£2#b@pÉhd_ŭ˘xlm&v³,; l&Nʌžrï|ıĦzÏŝLRQ{úxïÁâáí] jñóÏ F›,éÚxŝ°Ĵ:„Ûĵ8ó>Ö#ïñİ,AJA‚°—\ŸÏÄÜ5)ċJÇsišöÒ4l–ä‹ËżÜóHZ·JB@]ÇcM$Ws™ËWk,ĠÛÙLĴ^ŭÉŻ?,Kb_”ÖĤ|t@•“#3´$}¨VcÚôJ{ĵr ùô`ä$š„Nj˙>ô“ğz]Ò-ËÛ‡Ç^v4} Af˜%a€žHn°>Iı“*Šbğ]š³CĴŞxŒÜġàÔ8jŻ+t&Ħµ-E Œĵ_eÌÌN s 1=à—Ŝ·lğE{Êıáċw“u É Ŝ”€ôĵΏ’Zy?Uç cĉĵќ÷âI}LMfèġz=Ì°ħŝí­~uT˘,5¨P#ŝġìQۈŻ9Ğìŝ—ao/Cž§ÌŒ,{Q[aNɑŭ;,”{ĴÌĝTï2ƒĈËCfÀ eiä„䆢( Gn(Šb'zğÏ犽Œ¸‹¸- é‘Dé,`Ô]ĠTٛS˙xpóYV³k]g˜İP€Rˆ>ñ+Ğ\È +¸:Ûëġz|’^Rr…ċ7ÒIğVw6§Üz5´M^Ĵ²ÜI@T‘’$‘ž2òĉŸŭèŭxa%}X2ĜHùES½ WĊto³C6*à™µ(ËòÔ`Tۏ(â }Œâî-lHúĈ›=êRf˜vöE$3Œ[&Yžw’†ažeYeKħ°óïyŻßmÒ{^0‚#í+74|Îŭ³”*;>Òϲġo'ID„˘Ô(Ò+ÉN´ŝ³ÜdÏDnx1‹1GHh$@­ƒYVĞ×gsuΰZµĝ(×ueGP\Jġûŭđ„ë—˙‹kû™ÂŜaáíR=m:2m2ħФä™ĈŜn­ĠéÁÈm£8OÊo>A´?[@~ۑĵrŬ¸ÒÜ Mf˜Pĥ;‰Ü0x›ĴgKħ•~ùwŸ.ÍDĵ4ıŠ€/ó³ƒÈ{!-› ù}Vıt7ÙvÚÛZ²BĦ,ĝÜUܧÍë–ܰh³¤3“^Ĝ²~NĈH/5.FĉŸ3íá›i×9Dè‘ĉ¤”K3ĞWĉŜ|ᓝ DUÖ µĠUŻ7Ŝ6_ÓòLao"uĥÌÈ9ÂJ™GÍżü6˘Ò‘v²,;‡ı͎^=2&”îpR–䔲,;,Šb—Žw,ŬŜàR4ÄƒÏ FM½\íÀu\fûHžrCĞgBµ&PH@Ĝ•×ËhĉJEËI’ÌÙÌ^tÑËIn°ĴR J &WKêEWğíżû™ğ ùó9÷ÏJftëf¤”‹Q­]ûÉ_}¨‰ħŻòŠĉî–:gR.`]§áúGläˆ ‡%v÷s鳗é<Ġ:¸ġĝkZèĥç ;Èó<·6ċ§Î"ڙȋR›’Ü@˜‚ܐ™8Ìó|Ż(Ší™‡żùffiÄ4˜†ÜÀѽvŸŒü-˙ûĈŜŜ”qÁjmö 9X˙2{È.}à”Ò4ħe;Ñ>żñ2’ÈÒB ¤†Hó Rµğv³´à½HŻx"(1 HN™aĈÍ­˙ùGëw ”Š t[sÎü;bÌzĦv‡­1GÇö ż€Î”ÙÍşmzóH@¤ÙżĊB·/tqϖ뭐j1.CÀËGfÀ eÄiçŞıAEQ ‡áphÜdï˙ûíy~˜‘ĥ‡Mْl{m>ÑèüQ{ÎÈĞÚ9{snK§"; ÊPk’tqyŬıÉĤi:kÏáÓ÷^Ü›qa–ßHŬ›ÂĴ.u2òʗ;~a@˜ŽÌ ’$‘½^Ż/\ŒxeóÏ?z?ž[Š?ÙÎ@ı•RnŠŞ-÷´ëıóŭ‡ÇŸRŒ 'ŝİĴ9öù7Ÿb3ĦŻó<ßÎó|Ï’#3œ¤È2’ĈÓI™’ÈJ)†ažçyeKħ°ġ[LĤ`ħ°ÈĴ@g£ê~šFö 5YĠÊ Œu+…kT*ċeĦ1L.§ûÑêÛRÊe)ċBżßïI)#/K: ”‚“§š"Rçàì&ޞCPĴEsx^ċ:`|Í|Ġ;N’d6ŽE!ÄÚĉ÷v}?×ĜÏ5ˆĠe­İ!ˆ1ÑŜnÚµlï Àp¨ÎFîħÉÔı`(Ŝ†·|ôĊ>„™G"šì&;-ùwUsH4z.0FUşÄÀykÁİŝN7Ĥ‘Ä𴌨·i„ĉìıat@x™Žî :ÏwaĦ#3zÖšó’lınAJızġ£żĝPó;{9P tM ĈŒŞ7Ìj?jvör䅰ÌÈL™?‘úà>ÊG_ÑzD·Š˘Ĝ.ŠbßR™™áDċĵ$d† Y0™>İ·¤­rCƒÜ0ûĝ_ïġĉçÌCˆ‹£ĥñşŸµ ĉ$%p>fğ@ d{I ´pƒ;rƒIj žä—Ô¸n^˜,‰sÏd-P¤}(÷´p|C=1k‡AŸûtZ2œ%3ĴŻ˙ùOÖ9(PÚÌùò–˵6$n´˘Á­ê÷öžµgşÉ>+ÙûŬÀ¤èEÈïü Ùî~dÉ áÀSfèŸWÌ€ʊÓ:ÉVä†,Ëòáp8´‚ĞÛѽŭl^fĦ4ĥ2ş0éu€:ÀˆY‰.6ÁÚĜykYݤX.à.m:rC’$›ì¤ŜыMn 2Ÿġü i4GrŠÓšFËtäîİ€?':ˆà‘l#x!Ž•ġ?ŭŝğÉÜròÉ~nUCµB7ìµáĜÁ €Ò„í½˘‘̈ÎFv5bR˜ì(?F~ï.%¸km&öì.™a’+l{1NjœMN§Q÷³¤ƒ<ÏwU‘?^Úùí‹cóĦĥ-Î F•ġDuŸîFX˘z ž›Ĵ˙xÊŝ-g b`à8ŠŻÌŠċ7”Ó¸Érĵ,är™R 6@š´/u²•ĠC…ÏX2ŝĵd†8Žg¤”‹Bˆµ+?úĠ̓RcçX˜uÇċġ0,à)30@‘#M@.˘LW­bĴĥğĉ€zxÑŜ|ùçEQ8WĜa–eù2i˜v/ŝ)x:[ŠLQÛ,É ò<7n²ßüŭíı™˜ à˘ûä?Kf4r¤ġ˜Ö+U6.Œ›Ĵ+Ûé,ËòÁ`àÊv;Éŭµç%˜6Y’ŒÎ‘uìôİŒüŸU#~ĥnÇ;“ùİ5Ê\!žYĊ½qÙÎ$-iê“8^Frƒv,ĊPĥ €Ôuù{ĉ| ×Xżĉ¤ŸùÒ7nà];CO™!µd†ċġ˙ôŭ÷ÒġôÖ^n5¨…n!QÀŜ~"ƒ6”ïiÁÓeF€9,b`‚@jˆâŜ-l$p6ç!3t–ë^B28pšŠÔ€ıa8ċy£ŠüÉâŝĥıŒjksÎ/Œ:ä0ĈB+Y<7Y ĞvHD@YBĜŻÏ £ëÖĵŻMn˜FÛ/ 8ULUCÜİ$1ğ2klM[ĵgZNnÖ6¨ŜN™Á’ÖŻ|˙ç7÷s…í\ASíÁҘք}FL8s½I`Ô8Ó,­×.JċÏÁ÷‹È?sd†Á`0h‘NCd Ê]/SÙîBÈ yžğ™¤Ŝ½ż˙lnaŒSĊ´l˙ϒùŸğŻÚĜğÔż@Ì;a.ëÔñü DĝìÜ×ëï9ÁĠ8ŽûI’ÄcÈ 'ZS<ϲ]ġë@· ċ Î7ĥÒŭbžġ‹QšÔÀċ™aNJı<³¸|eéŬo/|ş“ŠwF# HEİq°— SJў²÷ġŒŞßĠÖ°-à)G~çwXÇp[+ġęM 3œJÀë1fĜġžG²H­µ.˲‡ƒ,ˎŠ˘Ĝá{wï.•÷5×@ÄmšYúñÁ¨33"ÈĤĊLž1Ş+·œ1pn„{Ñ%ħ§­È˘ÖHҕ.˘ )ċršĤsišĤcÜdÇ]+/F°0é¤Ğ\Q×VĤÉş{Gë”d†ŠÔàıÂö8^R\ùè/ß'pŝĊ~*Ĵä½ó`! ,5ör;bÊtĠ6,Ë;ĜPŜpëT`d”0Á v˘|ü%­Ç¸]Ċ“<Ï÷- ½vd† YÒ¤rd'ĦÁ˙( WĥĞÜdgŸüۃ¤7kĜnqRޞ˙9'µmÌŭOELŞÄ5ÊvD­ŒÉ Lĉ*ı"³ËïÛ,i×뵕Nċ&ûܲ$Ÿ†H*,Fq§ÒúòÎ74Z >'+¤ŽŜÈĊfÁ(M’d6Š˘!Äúĉ÷~ĥywż@Q¸†àL]ËRc/·‰ ĉCšÒ SdF5,‚CMŒ`†ÈÀ£<]|óÌg;ħÎïÚìè` ™ĦŬ'Á´ùê ëzş’íidÇLk­²,+†áq–eEQl'÷˙ċöbŞPÖ]PfäĞċûG£*àNEŜÓ{`DT˙€”‚V bnÊĠĞÖMv)I’Ù4MÏì&ûÜ]Ĉ˙JˆHSNECµ™‘#60ĈÚÍÏ „şhäÂsÙQżßïĊqĵÇñòڇß~'^XK?ÙËÍîµÔÖŜ, i"pĤ›|äïVǃ‘o¤Ë, ˘µh1s/,ĉ >ĊFL÷­2îp8<‡™Rj’Š÷´eıFŻàe‹΅iÊxĠħ³*àYžç‡yžïêìèÑÂáÇ;̒˜à^%à|`4Zv£ÎV˘ż1UÌ3€¤QÁU($)ìEWç3>{MJıÇñ\šĤ½4M#ĵln²Œ‡R¤).é9#ï´~š,Ís˘4MedzRÊ!ÄúċŝĊ›GĈÖq ]Ôk{YjxNĴ"6Êt8ıgT½(mİĵ'”é Ì|‰zò9ĝîŭr™·,™áö:üìh\fp(+s‰Ñe&6EŻQÂó(àŽÜ°ĠôÏwfçú`ş4Îϟé1`¤GÑÊùkyRà6ÓK"´B–k`ĉ*ğŻ/½oÙv‹išÎÄq,m–ôr¸É’²kMXz uV„uïÉ3écìı/V#SÇQŻ×ë[!Ġċ™ĊċËËï}{ñÖvf˜TŠ KŞÊtfĈŠ ĦÁxŻŒ“Àˆ*)fÀĴkĊ²‹ Ў²;żĊ*†ÛeQleYĉÊuıRjZĥ;|N ~oÓşŸžT~j/ë&[Mĉyí|~g‘‰şÇîÈ)Á¨“ü˘;2­1›ÇŞD#:74ĴÊÖI)¤éèU.äş\íġz½1ä†ÔMVxh@)Ò¸ċ½üq—]³ú÷žRÍ÷É Ğ—ô€KŝùA(3ŞTŒH“q…µ R]üe:j.&Ì™WĤh/*ä­)nΠ£|ü%mĈĝ̖ë†Ĉê´ òôgN.ežŒ^Û¸0ĥŒW–“:.ŠbŻ(Ší…í˙ù(ž[Ì`H×Nk"a¤ßH 0˘Î$£|µ÷ï8m„ŒĴHQ”(’+ÉVßupë“$OInxàĘÑè iôÂĞÉ D†ú\gE0JÊÍn<3˜NAfR. !Ö×˙죍Ż÷2dC2×P.3r ˆUfàŒ5ŻHšdNˆ6+½pĉÊ~Ĵ*½T@ÁÀ Ħ!ż÷Ìe;GReßEħë,Ê˲T^ı ”Ĥ “üq^ĥÛ¸÷ƒÓ”"mÙ‡ƒápxXĊnz˙o-öHiÊáúIžĈIe:ŒĈژ“˙ż1ó²TÌ;55GYUjŝÜ×ë× %I2ÓëġşÈ ì„M žOَBÉ.ÒÀ™ËpD²&ĈŒ %OġpšÌÇħ°³G RʕĠ÷żŭvŭrïÓŬ܊Wö (Œˆ ĠÖ-ĤäQ¸Ĉ˘“‡^Ŭ̈Ġš%"•C_‚HŬ÷T½‡a^–>€pRĥĝ’”ĉÎZΧܑ(ËR ‡Ü*aìêìĝñÂñ'ğŒ 8Ùwcàw2U›ŻìÖ´¤hƒU}%³ROŝ™ë­Ŝ`”,A0EQ"fÛìÚ˘ŭ+>ı!Žc“5í^€ 0³Öî a )Òĝâ†û§˘ĉ{ċôtNž³’8ç˘×ë%išÎX2ڕŭò­LÉq‰˘ĜÛÍ  ĠœİB½#5 Ò½Ñ½ÈT™‘[P[V80âŒApÖäŜĦÜşìÜ+—xùYQ;Žê]…Òµxà4θ²ŝ ßNzß3("˘<Ï gŜ—çùÎÌŝjvn LF5Ğ’ħÑVŽë:à×.0òżñ+îŽÌfê.kïd²şuÒÈóH/ñ†Ü°bÉ }[ĥxÁÉ ¤ĠsĈ|‘# İQ;S²à ¨ÎŠžġI4‘̐Ĥݰġóy)ċraéÒòğĥĝïÛCC`ĜÉQä4Fu™ÍòÑÑ͌˜J­6ŒÙżç {Șċ0Hp0ÎAÒ½‡_üÖĝ`Gù—eYVxÙÑ4F„ÜËÓ8^˙8 ™vŸÖ(ËR<ʎò<ßK·o}µtc÷ŭCB VÂÎħ–uµf•ü'ĦÎÔŝˆ˜úvB蜴ítvVÜ4€R !î-âÁñĈĈUñıs“MÓt/I’ìĝĝ¸ûÏjĤ1ÒË H^ĠÈŞa“í#9ñU]>ġ“h2÷È sRJc3ñŬŸn|sP`ggˆÁaa>Ùš@5%ÏĈ\ĝeşĈ a>R˜Í&cfÀ‘”ëgˆƒˆbɁûŸbĦĜ?ŠUv×y ‡Ĵ,K2\†İJs] µ³pż*·I $p2}|$Kʲ,‡yžïĈßügëó‘–\C2#qÇ9ƒ Âm0¸!s=BgçJç†ĤUµ+)ĠΒFĤ­tŭ·ÊôEóL÷/ÚxÚR,Ĥi:Ûï÷cÎù¤c1ĥ4ŝLÉ ôtÛĦd÷²gFn&ÈUIŞ*=ˆgQ4<™a^Jı²òîŸĵĠ[½Ô˙—[{tŬûrk‘· xğSŒh´LG-9 'ΘÙír_°ĠÓ¤5ÏÁİDñäsĴĊzG Ġ@)U@Dzßï§cL1ĈJûĠŬ4ç\œs €Z_Á#ĈšÓÌíżÜ{$bíû7 4œˆ¸ŭ7×Z "jß""œs×g!TáŝŝÂàöŝA²ı¨sĊ¸6n ]íGȕkŬ°3uċÔIíì[X‘7 k›UiX77Kœ›_W’4Ċcveùq{SÊb)I’9[ÂEQ˘Ŝ’uU^€s$ô‘ M ŬşÂ\ћĵ2n˘.‚ÌÇħ!3üWo?>Vĝf'ƒÊŒ•4BĜàr[*O²·ÎŸÄŒ›ĴßZ`ÖWÀġ¸0ÀĊ%‡ŜıqX-ñrghf§Ò4Mç8ç4777Sœó „ìżµ$ :Ú}€I€ôŞ€RµAÉŝ›k­y œ¸ŭ^‘° Ċ‰H!úI’ÌqÎĴ÷è7;ó×˙‹ÇûÇ(s—œƒCCkfÎ%F Í@œ ‰yµ —“7-Uf̰Ĵ\eÌmš”ë&5Jκ°,+AÉ%ŝ Ûĝ`#:%œOÓ´ßëġƒAne¨(ñzËÔ¸Îü+cìİ‹ò6zşĦ‡ib˘bvfĈ‚ºǖuɗ=ğ2 ™aNJı’ÎÎm.ż÷çK˙íë#è\16F‡Ž µ­Ì¨CFÌ/ßUÄ'…Z´_VkÚ1ǰ LÊ{ŸbAìqĦYE išGQ$”R‹J :ÚŬh€,¸> j½˘'ĉHı Éϖì÷ÜżY Ş €BÌĊqĵ,„˜‹ĥ>>šżĥŸ‰Ċ \ è˘„²XÍ-1#ÄɳŜv#5ġ7ÍêwÇ9ĉDŜU×:ÑÙèùKnD €) ™.áŝÑĉĉeùĠš\K’Ä‘&Ï$=rCíŭ–ÜHĥsué€q3„gfÉè°Ác]lv4-™ĦEfR.DQ´rċ‡ñáü‹Ŭ ”iPá, ›;KÎX]7²Aœ5ßvsŝ^Ùϕ9ı™.˜^ĕ°rĝñÇñ!D˘”ZPÈhlFzàCŻbyî ™óİ R>@ÙïŬı$c)ç|^ħŠÛ;ÉĈw7î>8†*ŠêƒÔd„…Mf0Í`BlŒĥkfI~ġĦğÌZœğ,IğîSĠµY“Ò ”@H^™9dËo&²ĝÒs“=ʲŒ{Yy×ÓÈHï˜?½ŭ{☐^b0rˆŬĥ×Ğῧׄ<‰ÌÀaÉ ‰‰Y)ċREëËöÑĉğ9Š\[ ŠFÊÜğ˜_?!o!ÑZ`¨CÖ8†SʸP*Ì\ĉŻ˙/W~xsİdà‚½Ëgœ30Ή fUŸ½żŻúwĴR˘qzdûaFEC¤5A“ı‘&(Mġïj" ²Ÿ'µ)ş¨ĝNšĵl°oäÓ#żÜkK[ÜQámYÊîô™Û3V *3&Ĵq5KA8ÂçÜÌ îf+}cI3ĞcŠŞZWAĉĝh͈ZU#ͳL|pOà›{l/Ç21Ŭiáꘄ­Wz޳'f>¸úïjBD €*p;~Ħşg—Œİ Ħäà3Wpíí·Ä“ßڙ¤Ù^Żwptt”[³ÇqÔïöġĉ6=OılGs$D¤ĉéĦu=kD5ħŠŝí-ĵOĦ3!C!3Ĝà|Ç+Ëoĝ–Xğ:óɧ{Š 3k¸Ĥ›`Ä,Ó´2ÁeTiÉ6ĉIÍ2¸]^­-ıɌ43ğZÁ84)0ĊP”ÔBú?Ċ&c’Ĥ¤'ay‚A N€ˆÌWŽ€݉Òĥw47˙֌CÛעJe^‹6@D Pĥ|RΧ‡UğTrĞ,ç@İ µÌ-Ž­(ìߗMc TWĤ ‹‘˜´6cF¨KĤnÑç܏e7WĈĜXÄÁ8jï¸{ŝ*‡&­Íİ ˆĦTÚj2(bPŠPA— Ċ@cX(ìĠôµùJ¸¤ĥ)'ŞÀ…<Š·éħZïÎ!˜KXG*BŜÉfьĥ(˘ĠP“2—E$Râ]Y~+ú|3Šò%)ċ\’$;išEá^r3Ż?Pż ?AK’d>MÓ~šĤGÇÇDžRjš™¤gGn°ŸiĤn „ë ĉù"™m"9"€ŬU?ċóç4d†eÙëo,|Ŭċ|œñW·@(!50Ĉ,ß­íĤ,O#}$²€Óx¨Föäi‘Ù•†i@Û@ÄPj€ğ,´P \J€"@[İpbThhÎĦĦ!D]zdÂe%ġü”[3‹§‘Š€]´½ïŬk,5qÛġÎ5ˆ™A^&ş (˜+YM–‹6Ò|wTŒêl†yŻV5g^QíàZj_ÔĤÎàK­ìß]ÖϘTnHĵ+JEİPj , …&hE(”‚* ŞúŞmFÉ taJ| UÖINìÔfLNϽ:”Ĵîı²pŬcjÑ:‘-/3Ŭ4|„Ù<˜aë“?íÎ0ğUQ š]Çŭ'—7˘Ż×¤”KišÎ%I²ï‘tGÉßî<Ûl‰L}6t uÖtgŠŞ )óë îBš‹Ì „X½üżĝp¨eôÙ]Oo…*İ~´&âÁ½òJ• ħ:3¤ġ›¨Q‚öż÷úv5qì¨ŞÈ,™B3³°ä„ :²%³Š½e)âşä\Ap ÜUÈÌÚco‰SmAÇŬğŜI˜ €fĤGâï ]g"ÂË|@€ĥïÊaŝî~fÄAJyçnàpıû*àqr:ögîù]™=¨A f¤´yŒ™÷Wz´™˘Kş 2ċ8M(µ)S–2Y’2`¤J’”RJCYàQš@ZAırv;÷Vµ£şÂíg“°ä2Kĉ¤˜+3/K˘FŻi¤leŒLbL#ŭL0nÏ[ Ħ ìòܐ/^˘âNıÁ—™:IFè€ `ir›ÑdJàٚW=’ïÔÊ ™a1Š˘ĠĠotéËÙPAgÊ,òŞnġd=Ğú2ĴŬ(ÏSUĦjáq`U=¤˘Ñ 10ĤĞÒ Ù*¨(ÚÊÏ"g@aô…L‰8qÛçá'hfg^lEpċ¨ZğeżXú ÚA}÷˘ÍŬhM+ÓJH]}·ĉkŻÊ[,Š ĝtóġPëıu[Á êҀ‰#MYÎ|5ĉŒ…ûıë'Ù+MĤí¨İ.ÓiSztĠAMĥçĤŭÒ];F­¸àÉI7ÔÁŭʘ1tˆı²zWĤGĵʨZ5DŽ!ÀÌUÜ;\{ïhç÷Rʅ8ŽûI’Ä'Ú T]üO­lG`i|¸Ì¨Áeöżl8]$aB†Ô0áóÉ Q­,\ë ıycö“O÷ŒE9³¨îäuċÈUí¨C™Ħb²Íë ˜ŞEşeF Œ)Ï΂x-šIà !È9š›Ĉ½ƒx´ ÍMÉ&âFA@0S ›oYç'S×iÌŭ£éşïoĠ0İŭ‹]Ï=q}7œÜñ›ĥœĴˆ ,¨˜ĴĤÔĤüVeJŭjëŸ×Y‘&‚ÒÊöÀ\´.ÓéNRK×û´ŬXCàèjÑ9ßû:Sbl„MçöPœ3kŸ2ĉ³cIšà!]YyK|!\NÓt.MÓ])ċ ƒÜÜWu£IzHFËhµħ+=¸YĈŞÌ¨Yâ9WıĞ_LIfˆ˘híòŝòŬA‰'‡…Y0Jí)3·[µVÄŞÌˆĴ…D£7¤ëžŒĤşŒ˘½ìÈ7-lÇŞBĴĉÎ֔h¸­HieÈ`ĤÁ mF+>‚ ħAs‚p Ä£šuĈ<6jaNP›yŭЁ‘—•8QdzAÊRşëĴÇfFUFÔİffäŝ^™r²ôpŒşä€&O˙ġV4näN{Ê(Ve m6#“kqnËŻíÌXŠĴ„Š7ċ#½ùŝrôĠRÊù^Ż×ïġzGY–‰Ü3D¤& X:V£| ëú?dKĝìi½‚‰d†$IR)ċ\EKqfsáƒï­üӓ z¨Ì,ŽjĠìBâĵfü2]ƒ5×`JéŞW myHS³g4 FMT=#D581€+' nvßÊŞk+à)´n€`f0Ùg€`̂U ç(™7äšëíÏŞĞ_q2PL Féç˜ä;Ġ8–ríJfä½µíñ˜ÌH+Ş˙­T 4^ù)@•Ô0óxĤRàžk¸N F£oŬĴóš)p×b•ĈC§:ƒċ6È ÔYêd * …ë_Ĉíċ+kÉ7ĞRÊ8Žiş'ÌlÙîT䆧YĥĞvp! 5sh³ U“è–şÁı²£i èd†^Ż7“$É|EĞ›ßûùûCžF·o›röš>Ò`TŽ:¨ŬdûÚ˒¨ƒÀpù?ĴûQfn”˘ BÛrž]\9#HŒYUi‚p ²÷Ġ6ÂJ™òÍXMBáĴAPĞ{ŽlQ{O•µ<-0˘‘¤ò³³Ÿ‰hu™‘—ıW[rÓTePŒ´Ò(5l6Uß´²%>";—ĠñŝÏ FġĉSUçˆ;Ĥ$QĊ57„¸Ô%êb@À hìk 9˙âjċ_Z ĝNÇÇá°JŜ;żgȰóŽaÀ£H×]7je$ĞëY =ƒĈ‘êŜme!ÄÚڟ˙äò7{†şÔ`%Ġ´ho…䣅ëĉzÒ#íÎ FġÖ=ŒÉ´U%àU)N(kyÀ™‚€ŭê‹2ósĈ´W²c çÛ:KòAÉC"ßżgÜâ9ŒşÔ¤ brùÏ{^Ÿ0BŜĤÁ*L4ÊtĤgTŻ-ı,Gëş|烑#,¨*“2ßk[öë^Š/ŒÜùR19™U°ĥ÷ŝ(¨ĉy „VÀ'h8²Ĵ—Ùŭ|ŭŭkÑŝÇRʅ4MgÒ4= EQmcÇç0“†a  n‘ân†ĊÇêĤ,Ë9OĤó“½y#Ŭ|cîwLO§4L6UFz;R‰!jö €§Fŝ"ĤŬ‚ŠY@aĤêÙŬ4·dîúIĥLÇĞÌÈ#Ԓ:¤Ftb&­“2#:Ef4/Ġá;EĠñĞNĞò§˙Yy4lmKŞZ) L>@Ş)ŞÁÊfFÔŝĴž25˙Ü*†³Öĝ¨ÓXû Rµñ¨U"Fz2ş„.´?ƒǗÖŜèŬYµ‚Ğ3išĤRÊá Cn¨ŽK 5@:İ?`ißT֒BNİá,ÒyÉ I’ÌÄqĵEÑê•˙Ġ{[GìċF•Á D69ÛġUC„'€µñ§F#‹’²+ƒ² ¨żLWgHµÛ­û˜wà*çQV{Tĥ8‘Àp*0:MftùċğQ@²½=òè׺.ӑí˙öúHd2#]ġ•ê^TçgġŒÀÈKfìX–5™-ŬUîEŜ§áywĈû²PJĦ”—“-½ŝŜ\t÷+)ċbŻ×ÛI’ä´ä<5p"£Ş"ÒD`r—AŒ”ûžÎĊ²“1¤Ì$I2EѲL{›sï~gċŸU÷Ì\NsjĊ:GEPŭ2Ŭs£ö˘§ìQÁ'0T ĴΌk 2ßZƒ*9£Ĉ18S™ncï4=£éÖ+¨ġáê5ËD*Fż‰Zë:[˘´ÖU&zâgġŒÁÈ' ²Iñ$˜,P56l†ß´Ho—O-O—(s –làŝáêäÁŠ”r!I’™^Ż·g}’TG–4šñtf’X=d"RghğA[m4ÛpuzZŒ³SĞ5œ—Ì`³£Ċ(ŠV6żûÓ÷ʸ}öd ZThçàԘ'b°.ŝhÏÈ߅?/0jŝ]-E£QËí0hÀÀšÙP1żì­.Ñ3˘“2£éËt#ŻÀ@ö͵ë)ıU€”2 cLQKmcšÏê9Qġ:4UJTeIZ§-ĵ,ÉmJ4µË§>ŠsÄR` W˙üŠ”ùWq?°˃ıa’ĝSZh\vÄ„l¤ìٞéZ[ŬCVÙ T:böçß$…̰EÑêúw~ġŜA,Ó RPmҙšz›ħä$ƒ*CğŻô€ÑèÏu5ċ ŭÇ͌Z;m0bç(Ó=E0ò)ß°:q 0²`£G}~Âör€‘˙Žĝíu‹*ŭ;'3äF—œ%'#7Fœ[#äY¤WĝŭrŭËÑá'֖âI’$Bˆĵċ“ôlÉ TÀ(R÷ ÂÔÉñ$C½ìHŸúÍ&€ÒD2ƒzŻÌ_}fĵŝĈÜnï™2‡'nÙԘ8§ĤEı÷ŠÎŭ”Ĝt FíLŭXñï˙ÂHЈ. gô”ÁhâħVïá£úgTWɒx£—T?Ğe `éökÑÚÒżKHÒ9ÜßYÛ¸Öż³EÑR’$³iš:7Ùò„ŠĊÓ#7èšÌ@q7ş‡Càۖ³ÖP%Uş›Ĥ{|Ĥr]Wf4ĥ\Ç9I’ÄI’ÌXWĜĠÍü꽝a‰‡G…Qó.+‘ħ&yl³Ĉà şËF] k£—Œ@ŝ†‚*}ÜöFİ=SĈj[‘Ċ^Á)ÍjĤ1ˆôöhċm)ċrÇ išö¤”‘B ›LÔ.ŻÛTžgıİÁ(àQ¤‘ó*ğêú×Ĥd"X=xzÓrš’#3¤ĥ\·Éxcé[ß_ù|' TVšRµg~ĦáQC•­ÎËPĤ `ôꃑnêV?Ó)‹7.7żÎ&ı1k™˘P °ŝeÜË×ßBĴI)Ó4í÷û1çœc2Ë]÷ħ ’j `iR&co5ĊÛYRVċV@éióÌd†8Ž^Żç¨Ŝ˗~‹÷ ٗ·ĥ3ĞĴÊÚğzkĠ÷šíµ/Žê+–0 `ôœÁÈŭ5y2„Ĥ}JCeÇ @[m‘×â<Şlġ ‰žèK˽M;“4g=Ċ˘²£§ĤĦ@Œ5UÛC@›F“ç Úŝk_›óeGŝ} 2ƒ”2ê÷ûŽê½EÑêڟŭìê7ğ9†Öf„ÚĠ[H™7oŞŬgŭµÁ¨ `Àè£ÚWÉÓWÔ£CÜġ[ĞKҍ1ž†O”‚†F–PÉU~żX˙ Š˘)ċ|šĤŭ^Ż !¸½ŝĝ˜ò]gïÜYÒIRî^÷’ÀÈ5ZtËÎĤÙt95uŬïŸì™!MÓ(I’^ÇsRÊċÙK×o&—Ŝ˜ûtk](PİĦ Ŭ\ütÀù3Íòj†Z£F/5tüĴ+ŻS’ OyŜÙğWÒP#ϖqŞjg_R@Ü_½lmӖ햒$™³ V9EÉîü…ú‰ċĊ@Ú§…›9rÎÒíAJkUŜ)Rí d†‰Î°>™Áέ^ŝáŻŜŬË𷝁 oÒM_˘Ê˘˜F#ÏŝI£F/ĠoY{wߟkôµpxjhžê÷•‚&9ùċ™CZzSJıâıÉ ›%MʎžıáÙÊı@zé@ɕ Ğ Ÿş}a]Hın,0I)EjbNJıÉx}ùO´öÙÖA—žu··p'Ÿc‡BÛFjĠÀ(€Ñ FÀĴJşµÔÙ³€¤Çœ; ( ï]Ċ½lím!ÄŞIšíġz ç\LĜ$ŽĞh\@Ù.È|@šPÔ­ÌȔ§êΤN8‘ÎCfèġzqŻ×ëK)ç2Ï>ÈxO~şAFĥHçşı`’+Óħ†é^{moÀ(€Ñó£ú[Şċ‘lšDcŜcFù½óĵ°CTHÓĠ•eˆd3Š˘%)ċ\’$išĤϚܠ;OĵZ׍OXKsz܂sêìÈżo,™AJıEÑêúw~rġÁaéUe:Ŭz —Ħ9KXéÔU5ġ #˙R­ŝIž}9êï|Q'DW´İê+9- t-cÀÔıŒœFöwİñwTżĉ­G“Ìġĵ÷G×<%5Ŝ+5ž›o†y/Ĝğ1j½‡ñ`TŞÖç_˜–İ!ì™ì=-0rx\ġ<µ§ìM]€TëÛu;;aG|X@ɍèaħö~EĞÖ'İŸĤiâ•íĤ]½rƒ=§X ~@êÚ°ĝ‹•j\TnF˜–Üp2ĵ”refʍôÊ;ó|4z`œa›@‰J cÖBÒt~0ò=kprĈ4qñŽĊ‹<ÓimljĤ#œ`!A unc:^Û)ÀhLtbfdMÓÂzÏuògfaí‚Á¨ĥ(!éfiä"Òµ5:gŬ`äĥKE­"]ƒáÚ%!ÄŞ”r1I’Ù$I)e›ŜU²;WÍs`ilzäzFÖ@Ĵ*Óù×0Mĥ2Cß İ^ùè×ïí𷛁r=zkTÖΠ1>?Şċ<ùä /‘èÌfĵ ˆĈfFÍßqىç²G]÷Üg³ŠIYY{]pbĴ,µ}EÇs´ĵùÚŭûíÑ>:2-š `%wF2&ߙ°ûXŽd€^Hè~öYM0],U›¨Jë~ jgĊ^…€3Ö Ždä„t™#â„]~en€ùëQ-ÇqYîœpŭĞ8̈́UžV ˆ˘*ûfÜĵĉê{çVWj}F Äsm²uG[Q%Iïu‘yoŒŞ4è-„%°ZıÀ$ÙÍk€QÊü­ëÀ’gDdÎû·¤´5nöyHHŻñĴ`ĝ>]Ìô•˜)ÓÁż}>F•ĊHċƒs€ €$Mq˙hsí­^Cp5•Ržı›,çv³"RUnħ­ËÊWž~C45™!MÓĜ‘„kßùùĠ‡Ž9 ĜC΁‘3Ğkˆ"kŞ6’Dt!™`‚ec´–F`šÀ{‘ɈJ³à3PLrPI`’‚×:ÖR›3Ñ|-D`Š‚iâĉ=ÖóWÖZ4‡Y@$Mà‰° fkĈl?–ZI0biÔ ġ3këMà2ĥç3™)g@0ÍÌBÂ9XİêôÄ„@QÚÇӗ€U‹w t=×ĈJĠħ˘Ré Žı&Œp¨è™ä×Ö´[¨£ú3eLÛ‡úŒY0öên,2@¨Çĉ³CŒZùŜ:ӂD Ê,¤Ġħċĉµyˆp0jt4ĴıWM¨Ö]ĥaÜÇTW QĉtŽ€²$”bC>.×ß_’wż°‚Ğ[½^ï´n²l\goÚ5‡4f= €ôÚġ‘ü íTıŬыİĤާ%30xdk6'\™Yż|-½öîÂoïCÖ÷ˆe"@G1›y8"ƒ"œ‹ÚÍ $fX˜'L °˜ƒEܘ2”Ô‰]Ô¨¤˙?{oÖ$Çuf žğı{Dî+ (R"E€*‰UZĞT£ê’ŞkžfĈÚLġĈşmúßÌŻ˜ÇyӌÙ<ÍÓLuW[UIb‰ $–Ü3cqżk?ĝu%#A0ĵ-,‘K2ïççžïžï| m’3^0†üO-ĉ„ĉŻQ|Dop[=3 - ^Í ¤èâçùŜ_ '9R§ ˆ9 ypDÄSpŞmò sñw.À€ÑŒZĵüäĵJ Žû ´ïñ˘hGıÁgQZr.g@Ċğ11ĝċ,݌ñ X9²x§r˜JıP{àQŝÇ.`™FƒPZšñ"ċħìàħĊ&‡ç›‰ÊĝÖüy>/´Î˙6Rh[‚Ój¨œvQ0µ88ZÌíòk‚`d}Á)ÌȔÜâs2Àhİ@ob·³}s³ŭtÓ;7,&Ir*„ÈjÓdë+‘%{N’µpċK@ €Ô¸HüNXûĉĜ*•fĊE·™­Ï!f ¨ˆ’$Yˆ˘hsŝÖ/˙ŝöI_“'‡i~Á0 eŒr”wŭóWÊĉö‚`T­Ï[8˜Â?Cúù˙µû)l÷dPn#×2¨° ^Ò 2Cñ£.)_˜ ŸJIj\£ŠĞMœqµKKŭš0îßĠÏäÜèçoúĵ˜°‡U‚בĞ;İŭµ˙S÷JnäòêLì›ŝ ġn9T€ßü5ĜÚAâġüœÏĜÁlŞ ‚ÑÀNȖ`d‹YIĠ:.|š&Û´è½OeD4ŬġIîżÍıüÚKÀ˘(êĠĤÉßÀ$Ù2ÂĝòHÍ`„òÜ(wjpƒcSUŬÍĵç3Ĵò(şĥòƒŸo~|,sİ·ĥùÎşbšoJÉÀ™ĦFċ?Ü}F•|·p ċêè–öŝtöço/>ÚJkŬħÖĤ(MĆ@ÚMı$‡¸|1ÜĊäF‰B8´Í[’ö>ûŻä£ïBÀ`‰Ú]ŒŠ…Yž!QŜç* ȂÂ•vyu³Ħ•ÖXoİe‘eHnŬlûÖwĝÙçBˆ•$I’$9ë÷ûJ)ġÍN“ÚɅÔ€Ô”†^" VcLÀÁŸ%Ñħìh.1ƒ/×-sÎ7·?úË[.^Žï½8Ì7áÒ³2e†k‡À¨ĥ,´ÎÍɌ)p?/šQ8"ĦžßÇ{ëKGJÉŭ,˞+޵Ö)S/ŭO¤Ú÷B|›•êaHĠfP!„Xˆ˘h#ŽßÛrg_‘ċÁú$ƒ^ ‚QYĥcyaĤ¸!0BMÜ0jŸ•ŻkZŠ[œ–ˆ[m<ííl/yX”íĵ¸!}u←&”†–XEi;;1šG̰Î9ßĵö“żùÎӎBWZ8™+¸Ĵ6CÉĊÊÙM£`äŠħc&g#âĵÔÚYPĈ@cŭüsŜ µÒROú½ŝ×Ŭnw·ßï)2HÎM(ıL—ˆ†@§DpÎÛ0J)eQ-ĥÛíSçœ^ë}ĵ‘,üOËŭN„rĉd^  ĵ쐋.hÑ"Ceğ˜\Á’Hn%d\C? xë+Ŝ×[·VÄîC!ÄjĞĠ:Šĝĵ✜†eb €TONŒ_ċgJ^eu>îĠ(fˆ˘ˆùAaËBˆµöĉÎÛÉw>\ıs˙Ĥ§áĴƒµvDĈJ½b— 3ÊËn~o:[Ĝé8ÁPÌâPğŸ`‡eÇJʧ½^o÷ôôt÷ìììXJ™úR…­’›•1…ĝöËtMl¨XŻŝ{³çI’´Œ1’Rʏ?Y^{ûïoôόpŽ 6p/Œ†ìİżxWÊvı¸„Tvı˜…şqC%à,´2@²ƒŬŜĉ;ë Ï7…+q/´Z­“~ż_7Œë@ĤÙËvĠF j€Ô„HĤ îÎ ”À İ ~ŽrŬ˜!I’B̰ÊÛ|ë/˙îöYfÈc™żżWİU aĊĦ-ġI\M ;<„o0*ꀄ1ÀXĊNî½(gy“§IĦŸŬĊĥ°Ï•R‡RÊ)eG)•Yk5]£Y)dâċ&f_’5Ĉ8)%—RžI)ÛéŜÓ öĴsÂÚKÄ:8ĜaÉŭÀ¨lO/z‹Ş@Ċ'kä°Ö[üċ}ş5ÓZBëŬ.,Aœ,`÷dóÚ;ĞĞÎ 'qg½^OOÉí9Ċ Ġŝ‡&&ÇÀ™a(_ˆó£dGÊuç)ŒŒ™`Œmm˙äß}çùq†N_ċ ˜é‘s ZÙŭTzCŞÈÎCÜÌy#¨6Ĉ ôÁ“§j½îŸuċ‘”ò4˲R*uÎ)ä‚;#K €tù‰V—\í+@1PJeY–u”ÇRÊċÓ?<ñß/)×LN*ı5ÑÁh“äà,ñí;Ħፔ•;7 䟃´ïg @,œè³·ZÇĉÁû B}ċ…]ĈĞħ¤ĤÍgSìä(-œ‚ì;Ò40rµ Œ—P“sŒ0Ÿ°Ó$u1Ck}ëfû;·V˙˗X`úş ù{26è=ô(ÚĦ ›­Ĝ9‡ë‘ŞÊÎĉb†Üî‡@=ùqu¤•:ƒr]ZaG“É@z-KvcÁ('êÎ) ìJ)ϔRG‹§¸żŝÖoŜyŜ3‚0Ğċxs‚QÚGŠŜ lWTÒIù[ämJI)nZp”ċŜv`J$×ñ¤żŭŬÛû[BˆĠ$IÛíöiŻ×Ë&¨í\˙ÙÄ …}äé! UגÉS€;ï½3D†rÙġ\b†Bê$ɂb…1ĥuó—˙‡òġA ' !°vĝ€(QN<~dkyëĉ£‘ŝ#z„18ı}ÈmGîKŬӇRʓ,ËşZëÌZĞ*ċşyXRˆKXĴFóÙQġĈ8k-‘RĤY–I)Œ’û›ò³£çüÖĥS*—€oŒ½0ÁU,„ˆ8şnUÌJòâSŸ)euJVÁ°×ÙYżÍÜB­Ċqĵä7}TħĈÇċú|kşhŽ £Ì 5‚Qŭü³˜vZOŠf†4ÓRĊ™aĦ˜ ğöżÜŝxݟ&7.÷]#S€Ñ ùNÏ%;²Ŝfċœ`TOfÂi^„gòѧX’Ç]A²'gRù3ƒR*Ğ•ëê€4IqÒċ£ĤġKǒÀĴµ¤(Ûyqáâéż~ı²ñ­½#âJ_ȗF%CòÖßEyš]ħŝW >gÊò6İ8,ú$Œ7‹eȤMÓ§éö‡×y˙žb9I’vĞĠêôû}iŒĦ•u\/ßÍ)n(›ŭ €TŻéúÜݰ!gmÎiE NÉ´rÇ$1‹X´Z­ĥbUħħġ£_ÜÒÉj|goÖ:Xé#ì Á¨œÔ2°Ĵ•éòqvf„Z:9‚‚ ġô.Ŝ‰í3­uQëfYÖ÷ċ:SıÙ0ĠËveğ×ĤdGĤħ#RĥëûÊQÒúdĵèžPħÎád6ì¤0*ëŽä^Çu,€Ñ°sɝì¸×·°F!ŠVħ{ĥµssġñVešl!n0hVĜóˆ °vÖÏ  İa³Rt•snŞ£‘½Âçë˙x{\Ŭ’ğzGq/úŜ£­í˙ꝽŽBW: Ğ ëŞ”ì¨ŸE”'Ĝ¨óîÓĥa€ß40Qe0ßvAŭü °³gz=1÷{}u”eÙYšĤ]­µl¤&†„ ŻW݉!Ù:a`…˘l'ìH)O”R+Ŭ?<Ú˙ŝûÙY'Ÿä|;3£²4]ÌI* İ{1˜ú8pnÈ YMÓ0Á”V@Xœ‘ë ]÷ċğ‚ËŻ˘(ZnµZ‡Qu³,£cÄ ¤JóïQ@*†Xéw¤‘ġáó…ĝÁc¤â´ìĴ—`[7͜wâ¨ò(ЏŻK/qÎ×[ë[oµżûgk˙ô  Óׅ;W9|l†-ĈLÑ™HĊŻ:{mnfD,H"@8ƒzú)ĥHvhµÚ“Ry1C_k]”êt Œf9G @tùËv´BĊĞ=8´ F ”’Y–ġ< .žŝñ‹µ_÷ùİâ ÎFîÂ`TVP8 p-ñ›ÊŞYşŞHİ:Ĉz1Ğ!S$ıÇŬÍïż}ô§(Š 熳n·+½sC=ŻĞëzvq!ıŠ–œu¤Ğ’‘y—Ċ!c1-Ġ˙á˙zûBb_[áœo^˙Ċo>ì*B>Êʳ#g‡ñbJ†u茌sáßEÊtŝšC(íîAï?ÄNìT}uPé=’Ö4€Ñ´s¤ jx=˜’­€’›ĥĦZĞ,ËRß pĴeoMß;z.³iGç"`4x /n}NEÙkĝÈ·€ğfç†ê[X‹¸àYwgƒĊ‡;œËġ(Š–â8>N’¤×`¸ZÏŭ™×ĥ+ÙYXxšˆñì§WSÖ97n#s^1’7RŬÚĝóżŜŝd?…‘ùyQħYŞšt3äf‘5%‘+Êtŝ~m´ù,`D* FxžĴ$—óÁÜĊ’<îÄL=>Sê(˲NšĤiCıÎbTig0^eÒċ£ê:²#ÛP²´:§”EO҉Öú`ùì_\ZŝáÖéá!ˆ`ıPÇú‘êV ³ƒQɒüšw””âG_Äo² #bB]) CêTXp)5lô–m}°ĊÓ/üœ¤vEĈĜ\ÓdDz¤êʐ†2’aàŽP#âϓİöÍ%fh·Û-!Ċb}óÏ~öM֒ҙAY8JïşBHGY1U• acÑ ë|.933*SÇċ°)kqnĦv?Çۑ}Ĥ½GgJİTk=LgÎQ²  tıİΎhßĴ܈YkµgIŭBÔ{ôh}u˙‡gÖ-8"ĉàœòĥ›Œ*@˜OĝġÀ%‚’Áż”×ŜÓUóÂZXbÁÄvû[7wVv7½s^ĞĠ:ívğsM“O‘B@z`O24µ#<ĵ ˜!Š˘!Ä*clëÚÏŝŬğ/ş §]—š\%§m› Ô 93 ²ĞÌ”üġ÷L– ”dZœŒ K˘ĵŬÀҊڠuP’³'J Ĵq£`Tü*ցS‡ğ³ÔwŜB=Œ˘h)ɣДR ¸›Ħd7œ‚ÊnôïuċKvċ™ ÉËVĥÒ[ΟšÈÍ……˜!Š˘e!ÄF²şñÖÂğĥz÷E?@RĒÊ[°Â;r(™Ŭ°3ƒ)9?3Œ9a^ħ”0ȇc‹÷ĵ˜áXJyê{†ċŬ“ÀÈbT nŻÇmûm”ú[kµÌëvŭ,ËN”G §żż·ħ+A‰×BzafT$ĞóBë†KxĠ2X5!ùĝóF0‚(h‘eh½Evû›pÎ7£(Zx!ŽˆÒ²c–Ò`N u\Ċ:(ŒC i´dGF“Âv/˙Ӈ³Š†Œ( #ĠVĞĠŽ˘h•sqwğĞ}t"+µġŞğ‚ЈFÄYW#4Î>šFŜ—ÏUvh„ÑÜÙğsĝ5vb|İRu TWÒÂ)W)nċoĈĵ3@ÌPaF0£ĵkŭ|`DHÍZ¨C ¨w° ş‰S”R…‘j_k­ĴµÓ˜,lÈaş /Ü^ÍmÜßĊÍn­µFJ™iڕR+WÎŝġÁÒâ NLkeŞ €‘Ğ–­kÌhe½üŝ,İñ} ¸#Ĉ@‰â…Ü-„Ĝ†Ğ­VĞ1Ĉè9Yi,ÓYŒŒéixmúfgJ'ÓÙv”#}Gg†ÄK½×7>üñnq3ı³——ëĴĥƒ„*-M\ FĊFkPÊ˕ByÑ {WÎÂŒŞŻU˜P*(@5ÔîçĜ‰Jg†“4MğY–e÷h– “xsĠB—œÜ„ „›ĥù°ÖšŠ¸Ħ£”:âŬŻħ£üyhÉŠ {£ê·ŠƒĞ4) ÷¸€ÒÈg €UĈ€&[xÒ]żÉÛB,)Bp4̉šÀ,GËv6œ@š&8ċòr9ĝ1T]Ġ™Ħ3üĝoŜ}q*qÒĠ°İ-NpPCN)ÉíNwĦğêŽù6:Ú|0j,$0€Dúàk“§f+²÷”RY–ĝ†GYaGçeBĠŻŝר&“RJgY–iڑRk­ײ_PŜa"ŸŻEY~^CȅÁ¨pâ/ĉ€¨/ŠbGyZê§.Óz‰ŜV „Fƒ;‹CucEbámÎùş—€·˘(b @4iÌù˜°çJ¤Ğ‚Eƒİ_„{0Ò„M­Á3Š˜aIħŜZY{kñŭÖîíƒV Ĝ™ÁƒĈ@̀£ÔÁL˜Š>nV0Iv*ˆ· ôóOħ‰Ŝ‘Uò…3t²,+¤ŜvJ‰ÇM¸LŸ$nŻo™ÏĠÊv…s™Rê`ħó‡ğëKÌ”ÔÉÄĊÀŜFÈV&%—,ÉÔt…Ż)*CŸÁbX)dáĴCĤ Ü Oz[·8çBˆ•$I*,i¨ù}–²Ŭ°¸!\vÇE}×Í?lŜ›ô?žKÌP-×SaÛQ­pÎ7˙âïnw3Bg°}ĞmîĦUŬ y?=JÊ­Ŭ gœŜ ş9Àˆ oCœ÷Êsòf˙!vZäÎ†ËužıÊs@³€Ħ|lúhçßFĝ ›Ġá=Ġż;İŻ ­µöÎ gJİ“Dv^Ĵ“‡ÇûôÚzŽÊż’›Ü™6 3%_Ş#dà] b0B\)n  g°v`ud4˘…E<=ĥŭŜâ×EÙnÁ‹ҋ‹lÀĈd\!ż.—‘ó³YĤ•ì<%q/rÎ7c[ë?úċÎW‡)¤4p™”-†ĤÂ`4ʌPšJjċs‘ĞÂ'i èŭ;hġz-'°išöµÖşRs΃šÎ‡½6‚FËv3ŸC@Ŝ!Ĉ  ġŝÁĵbž$‰ˆ˘hħ˜ ğóÓ_w˙LáDÂeNš²ĥHJ0ìÌPb£óóŽĵ²nž3#2œÌ„1€”S˜³Ç 'OÍvìî+³,;˲Ĵ—e™Ş”ëÎ{ĜћN“ĜÓȆĊ‹RïĴ”:XSŸĵp4!̃yi`TT9œsž-ĠĴâl5s­/‹{qCímË1VÎ"fjgU“Ö[^äφyĤt8ù÷ÈÛ·òT L)R} CÉPŸÄ”52î’À‹<­/Ä 7ß˙hŭÎA hâr ĴJu J 91JĜ¤À;ÏÁŒjÁ` w?Á&é[%ŸûŜ£3/fP˜}œDpò~CJwġÍ&ĞïóâíeOµÖ‡Kg˙|wmµeÂĝ¨ûÉÀ¨Ĵ¸j%Áĵ.ñ`D|ÎÓj’˙J(²LÂ%oÓ'½­Ûœóġ(ŠV“$)ÊvUĊŬÌâŭ˙ĜPG€4iE;›Ÿ9_˙§ıÄ ´A̰ıóó_ßîYNìġa3“‹ĥħĈíË ĥB‘Ê3#Ÿphvf8ċ˙  OaâZ‹<ÔZdYV83dÖÚYYí„Ŭ3;zĜÒ8 Y+ĊX ?ĵïòôùƒ°AÉ,Û] ŒŠâœ³]QÂ+ŭ!íX—Á™RӋùҝÑpÎ!Šñ´³y1ĥUunˆ˜Ïp@#[rCÈ! Ġh!“ĠÎ-fBĴ3ĈĥÖĝ˝‡G)TŞ dÀŒü˘ĵdW-xÛZıkvf˜ F¤áqÎꠟßAĞ·ß_„úŞ3xg†YĊ “f z½YÒ8ö;“$ÜcŞ=IJ݃•ŝǏVÖr]Q•xI`„"GJ‹­êÚQ•)Hɒ§(KX Ğşì­ÖħZ_ħ^87!x%ÍâÔ0%@XH“H ëÚĝà#bÌ!fˆ˘ˆùúò ç|cíŭÇVµïîġs£pÊĝšvàì]‚‘Vû+êΠәQĊ;Ĵpf ”9¨§ŸZl^(ö•RGišv²,Kg3Œ'²ëÍbD’V³ÖT9–B)u”t?˙r5éef6Zvğ ċ‹ĊÀı5Áâ†âİĦ|èlÉŞ”2 âv{ëß-Ä I’,´ÛíˆR:ËÒÈcö˙gâGR‡•İŝ —‚: |ŭż}8·˜ĦĠjĊI’b†ÍŸ˙ú½ŭÂŝĦ¤´ħĦ„€ş3CĠĵÛY/bpv¸ä>+UŽ‹¤¤$áǏANžÚk‘ğΤ”ŭĊ “ĤÁ1› NӘ҈¸!MSYˆ´Ö‡ëêÓ=¤’Pä00Îże}ÙÎ5‚%yod< X$x–ŬX‹Ż !Ö8^J’¤ċËv“Ĝ —ßHs°¤ÑMÛ†4˜„´*fH–V/÷ç럿H} Ώ)wÂP(ìFÓ½83²#ϛ™U‘Š|Ì8…~ñÖÑ;†Q/”R'Eï‘1F#ˆBÙĥıÀìÖBċ­pnHÓ´ç%àûKıżĥ’80’Û WMĵ €*Ġçßußğ2q}ÂQR)Ûı1—GkĤŒĜfğŬíc…sCğb¸Z6PÌ n°˙ĝż‰]¤ñ`TaGç3äGGqQÛĵöÓżŭ°o}°Ÿ‹Ĵ´ùeż‹.Ąäö&ĠĉUëkub‹27•Mż”3¸ôzïvZxXĝÖÎ ~*f3„˜ “Ä uçUHÀ•RÇTínŬӂ½;Ê󧖆ĞóƒÑ`íي·²ö7(ۑFĠAi­ïX-ÁMìv7sÎ7…Ğq/ĈyÌÖÛ6ĦdİN}Êñá Ĵ˜]̰$„XcŒmm~ô˝G‡)´´pY.÷ħU–˘\Gœ˘ÀĈ{Ž—ÌhHY7ó™rs ”œ€Ä z˙’Ŝ~şDԃژ‰qb†i}Hc. !Ŝ–4Ž ÏdÌZˆ|ÙîTJy¸Ò˙ŭ¤µGI)ŻÎż^Œ;èGB­İ̍ŠĵtnhKaŭûċğ: ƒ÷Öb×ĵË9߈˘hı•ƒfç†Yû’üqV(P@jXì…7.&fXöb†÷ÙÚ[ wöRĜÌä @h7H(F£›²Â&¨êÌ0o™.ï\QDhÎĈôÓϰéçJİŻ b†S `ˆ0CùÎZkmEÜp޵>ju?ûb%en%Ä)7îâ|0ÂÑŞw5q£Kĥ´BUÜ0\6tĠZŸĠŭHĥñ¨SN“-œâ1Ód)Ĥ‰ŝK(Û@jˆŻ˙ó|bJ)ób†…(ŠVc›×~ò7ßÛï)ìŞœéh7° òĞœúݰĠ7qUg78?šŒŞ6H,WĜ™³'p'ğv;v÷´Ö‡÷¨/ÔÄ AÌbòyĈ•îŒ1Ĥßï,éĜhıżéî jOǵ\œŒ†0¤2¸Ï£*J–4x~ J‹ŭ!ËĦÒRÈ"ĉ1žġŻo*v|£ìRÇI’$MVBÀ\£) …˜Pћ°Àh’$ÌĞm–„ëñÂâÎò?^żû´ ›z› ĦS—>yğ ĦĠ_m(êàç>3"C šà£#Ï?Ċşë£žĠĈLg†Êv³ˆĈž7ûĵ¸áD)u¸Òùçğ+K‰#¤¸Ĝğ÷†ùÀgF•3ĜĤQC#)ʲ]Ŭ˙ÎßħpJ(ĥ͟ġ·>àœoĝ9Ií(ŻÛÍ5Möwżû]ĞHìèÜc&’$‰“$iûݰ;?ûġ‡}ĊĜ—‡}˜žÊç*QRúÒÁÏgĦÔ÷B”b†3PÙÁ̌*€”äċyAáäÔÓ/°“GJİC)ċħï=šUÌ0é]9ĥ4Ž ­#k­ġs’Ò4MϔRGTìn’G§ċàHPÔGJÌ FUAj~Ğ ñó_‡vœċ ²&0Â@páĴÑ Ñ:vğ›7c›…sƒŸ =×4ِfaE˜R²£q ݲY,Ċ ñЏ:YÏ&߆ \½]E̐Û•gF•ĵ*Ċ Ĉa3£˘É–ú’ È“ŬìŬCœî§ËT}İ”:*œ”RjF1ƒE3\U–„ ÌxšĈcLŽIY§`IkúÓŬditĝüè%€‘˙찅ânÊ*%$˙£ÓdA^Ŝ,Ëp¤v–úvéïܰ”äÁ$àÓJvœ Í´0È$–TˆĵÊfYħħúî­ïÑġë Ÿ=íç`ĝfXWNĤĴ¸Ĥ ӚAByf4Ò{4•ĠZÒ­a”rïsì½çÇLgYÖé÷ûĈLLcF„#„²ŬÄ&Yk­Í²LĤišfYvŞ”:luŝ틕(S`˜(Ó˘`TRUààĴkLúr÷92MĥÚ`dĤ€Ö ò¤ğUˆV8^ˆ8#n˜êqÊvšÂ81Èn§"fX,Ċ ?ŭÛ÷;{§2ߝe6GŸ ŭĦ•EOàJ;ŻÂ™!/ÓıBp:Óf‰—z'úä)p¸k·wÏĞëNÒ4íUĜѤy7AÌc6$3ÉżXÒħ5j÷Ácâ:^œ^ŒÊĴ(ΐlġßÒ×7P6Gòi²¤ÁıĦlžuù4Y‘`·m‹2]5\0'işájˆHSÓÌb†¨½°³òáÏ6îî€ĥpİÍώŒ­M…Eِ×èçh}÷C£Ğ÷0Ş.qF@y^ĥs”@?˙ ĞsB½˜Ħz7ˆĤM  suËvÓÄ 62K2ŝ,İtnXî˙ŝ‹•ċVÙ˙àm :óQɒlUÜPŭWV·K·}’ƒÒ˸ÁĤ’ä—­ $6ċtëĥŸ“´’$IĞâÜpnqCˆ+Hv4И AÌÀÛĵŝó_˙ g8ğ˙Ĵ ÛÓù2Öf¸ŠĉPö‘ŞÒµ<˜J™ÁΌ*>êK~ŒĤ}%v÷¤Ò{ÔäÌ0kl3„À”ŜÈÙcUÜP°$ž={´Î^tr³a—oàΓĉ£Ħ^q+f&ÁĠf’ \h]ùZ|!4WÛYcHĵƒ'g7½ájÁ’˘yĊ ĦlR+Î'fXċœo˙—פPŞè9*ÍèÊ\" Î %2‡âıÀ¨`\…tÏ8 âôÁ}D½Ù*Ó÷ 1C\74Ä !0aqži²ċ}cŒ­Z )×ä'Oy{ÁĞ XĊ½áâ`T²¤!…ŬÀÉ5;BŞÓdGœ[Bá@à”BÄԍéŜĉœŻ{ x+Š"ÖDĦ)Òı@Ґo]UÌÀ9ßX~û½ïŠÍ·ïĵèI“ËGµÉ&g”ùf4,f83*kwœ‚0Êôî§U1‘”²›ĤİôìȌ)ĠAÌb<šTĥ+pe;U&ğ˙ŭµhB\.l ³Vĉ£âg‹i²Î“v×§[Œ)'6ȓîĈ-Îya¸şPaIçž&XÒ¤—%fàœoŬĝĊż˙ŝaGáĊQ—ċƒĝˆW+l§îÌPìżò$ħSaÏ F¨ħ$ïö˜ÎSĜÇn;v÷}ıî´ßï÷¤”Rk­qŝFÇ fÑ´A™*j(j­µ7t”ÇV/6ñĊ! £ĠĦ4ĵUÉMá 9h6ŝYRaKı¸ĦáeI X…(^ÀnçÚĥ7\]‹x!ˆ ½lĈ4QÌÇq"„X✯E텝…÷ĵq÷ ƒSĤ8ĵÉÍZĞÎ d^†oz-œ†TÏ FEc-g9CŠÔÓϰŠÎ)wzחë:ŜHUaŒC3‚˜!Ää²ŬEĊ Ö↣Ġŝż|ħ´ĵŸÑPž#Âè˜×ıÀċLħJĦ-‘à¨n¸:¤xġeqg-Ĵ!蓭x?Ûĵ%„X÷,İÇħ8§¸!€ÓU¤sˆ†n…˜ĦĠj-ÄqĵÌ9ßşöżı-ñ/^ôà”…M5ÊA••Uœó†ouìÒ*È^Œ0ĜĠQÎĠ…ÉĊ ”‡RÊH…˜aš#C3„˜§œWĞ&qCa%TL“=äÙîÍè C÷g5£†Ğó‚ÑÀ#e@n†–­~RÜ@É(•tËÖBĞ$‰'gëßñâ†Ġ$I[­V4%Û#”íCĈ‹†”2ugÎùĉĉG}ñqŠ,3ƒ ­…Ğw͙Ħlş+Ό€ĵiÖUĠ?ó2£b¨‹whˆôñDçÙ*Ó_h­ëÎ #Θî_7-ŭC\í²&ÑZSJ)e–Ĥi×O“=XĠŸ=íEÁ½Ħ))Áé˘`”H%×0h–uU0°¸Œ87"%›wŻ[ƒ˜Yìe×Ö IŜòÎ ‹^ÜÀq‘!0 ½ 1ğbó;Kwž÷ázNš`ŞĴehXċ{U#Ġ|çfĉfF#e8¨ŬO°é£ġ^Ġ™ĦĈŽĤġ91CˆùÊvĊ ŜıĦëËv‡Kı¸ÁÀh€0ub/Œ†§ÉÖ^$ Şrqn¨9§ ‡LJXĥMŸt6où9IĞI’´keğ n€4ħ\Ì!fˆxĦ˜ ğóóß|pÔ×xvĤàSÎ{/”Sö†Ä ¨ô? %‡,ìpià<`ä™!áĥżwôÄí´pÏá;ñn˲Á·nâ(j1CˆÙYÒÄ ½ĝâ(?C"apĈ Àé`TVç*Î ĥ"rpµUî0K1ŒrpÀ ÑZÇngk‡1ĥċÇR,úĦӏĜR`H˜Àê˙.Ċ Q-qÎ×EÒÚYùŝO6îî§ùx eóQáÖԊdDMg}2 µîÂÌ„‚‚ÄêéçXħ§§ÜŞ]ÔQšĤg…3ƒ/×Íj@'Ä8–4+5n| qƒgI'ZëƒĠ쏖–Ú ”À6#B. Fŝ³ckmž‹v“ĊÍÙê™U“§¤ßqZKÁ­E7Ú'jí=!ÄZEËI’´„œ1ĈĈltIÓd ]v4—˜ÁӜŭĝW·3Äü‹ŭ>l_WN‘4äċŭV;›öÉ`  µƒĥ/Œïž7Ŭ›AïŬN›<ñc&N|gü81ƒ„‚˜!ĔÚÙÈZqc˜w£¸AJy$ÒŻ%g=glFcÔvó€Ñ t砍6Î磅1Ú8( µƒ16ÏYk'żŸWÄ*™b ON×ÇÛôVB ív;˘”Îr†4òĜU-Û]e†t.1C’$K…3ĉ_üê­'‰´£a•…UzĜM¸2éĠX m󅍃²ÊXk†kÙs1£ü€Šp "rı·zq˘·'טúB)UL…M³,“1,s&9}‡1lW}ìÜâ†uóÙ / ƒàĊ áŬü`T½c­ƒ6J[( ´…Ö6ÌäßÚ,6½–oó€ÓHD„géu°xGħÇñ’—€s„i²Ĥ€P(M3,qÎ7–Ŝúî;bûŬϟöaµ!ÑÎĜa`İHğ­ñ,É:Xrš\˜³Zœu ‚r@?˙ÛB­÷½˜áĴĈŽĤ•肘!ÄĴeğyĊ `IY–)ߓÔQJ.§¸ğĥL-)ĉ Jw/ Œ†äıi7kí¨ÁqÓK8›—íĴ…”)´¸Ĉžtĥ>dŒÎ íŠájUĜ@Ä W&™L3ÄqĊqĵà§Ânîüìoowv38ma³ŠSŞEċëĉÍF^É@¨˙¸”Àf°‡ŬN w½UI–eŭš˜ĦħaAÌâċħq@52QVk­ĵżŬİRêÈİÎó-öĠ(¨Á öÒÁ¨ò£O˜Fƒ2à ŒħàÑ:žœn\÷Î Ğq/úVÙšbƒuP(×M3‘ĝŜ£ ‘´vVn˙lŜA–3"íóĴ:f½"0ÂüH”;3Èǟbٞž Ğv”GY–uÒ4-iš‰j2„˜‡%ËğĤ—› Š¸ĦW4ÊÉ?>\X^ö‹›z0ޝ%}ë`dәŭPœšë‹½ü—€/ûê ĞIÀgéK gHW|€Ċ QE­VАzo\û‹˙á–$-qŻ—™ŜYğ’nšôz0*X§ „Àİ>Ìŝ=ì´°;ƒ˜a+) N¸…ÑtݞĊN¨|̋´gò§Jİ£8{ĠF|Ò' zɘ‘­ôÚÒBĤHvèl³˜&ğÇñBĞĠŠÇL“mMq-…"CšYÌn·8Ž9çk^Ìpóñq†^?#dí·ÈŒŠŜ#Jà…>zŜyĦÖışïé´ßï÷Ljf­÷#°Ĥs€Ó,c)ʛRJWç$)ÖŬŬD,x/ŸËFĠŸħe™>O;Û bÇ÷$-ċš¨¤ÉJâ†+ Hs‰â8nĊqĵ,„X_ĜyûħġÎÒçğ=¸Ê™‘ĜtĠ:À_2ıšŠÁòğq>v[ÈCk̔òÈ+—Ĉ‰Ĥ…8GÙnš¸ÁbЏAJİ‹ħJ݃ċô_ï­­ÄÎ Îğ_60*.#NÖäj=Ÿġĥ>àœoĝ9Ií(ŻÛÍ;MöʀĠ›H³ˆFnMb†ë?˙Í­“ž&ώ28ë`•Żi׌R_ âĴˆ °òöà‘Ûiá ԔòÔwÀ1Cˆo“-KÜàÏ;;Jݨ³g[ü끍ÏŻûEùQuê4ĴLA£ <>ͧÉrÎ×â8^lµZÉĵÓdCşċşħŝuB–äħ$„XçB\[û›÷3Xe•/DòêÀ¨ÖĴîòa|úégX²ÇÈİG…o]–eé b†Ĥ Gˆó°¤qki&qƒ1ĈH)ešĤEÙîpU~ühqeĠ›­zżGg/ĠÊv„΀S‚µ³Ô3KïxĠ%=á P²ğ"€4·˜ĦĠjE­VĞ-„XÎĊ żşÑ–¸ğۃ“NGàŒ îzÌ(ŭñ‰e;(ègwp#3(ŽÓ4ídY–c,&‹,ÂTĜ/cHSËwÖZ£”RY–c)ŽZÙŬ/W£~8Ê*×ñËFn$k-dև‹Ż“'RܰÇñBÇÑqC(Û]A†4“˜AÁ 1ƒbŬ™¸ı{œĦ×QċúsZżş3£z…Àš ‡9}ÖŬÓÂÜóc&N½‘ŞŞ•ëĉ3„r]ˆ9ÁÉM¨qCšĤ²7h­7é=ÄËùÂgâòQġRbchbÁħ{ĥµEß.Êvašl$2áñêż3$IÂ8nEQTˆŜMŜúŝòçğ=@zêîÜß83*6bŜR…P"(ÔO°Í³Â™Ħ3ĝċAÌâU–íf74nĵ¸Aú ĠİRj9ŭŭ½ĠEî—ir Á9ÁypmI·Ċó^9–b%I’VĊıa–é ˘iċşrqTĊ Q­ĉÎ żŝà¸oÈîħ„S.÷­Ğ`Ï+)ӕ̨âÜÊ)ìÙ>ìñcx1a–e§RÊ^ċìè"bvâ%ħIâ†Ħ[ĊıĦ£”:Ĥúĝévĵ{LġÂRëMş`„Jŝ X £2xON×ŜĉœoÎ I’D7ĵñÀtĠdß3‰ÊŜ#!ĥ×nŭ|ëŝ~ §óú°sy•`D‰7Ĥ1…~ñ–ôa'†z¤”:ʲì,MÓ3ap11C˘ó°¤qkkĤYIĈ“ċёRžH)×Ôż=i-,Ħtn(Ĉˆ“ËFnô²Ş5"jp^_Q}SħÇñ’c€(ˆŜP@ş°˜!Š˘!ÄĈöGżĵ­˘EqïIVú3#à*FŞpŻ€!WÁĉÌœ‚8 ŭâ.{1ƒW×u”™Rjš3C3„ĝ&Ñ8†d§Ü·ÖZĞ”RišöÒ4=ĠZµ³ÏÓ,OŸ²„^B0ŞŒ8‡E& \´MžœmÜfŒmzĠ…$I˘Úœ¤™§Éé€uĠĴƒŞˆ’$‰ĵ˜a1ĥµġóöÓ£ Ž„•63)V_ì/Œj E8ġ*; sòhwOoDö ­ġa–e'ŜL1CˆKNML cJwĈcÒ4•RÊn–eGZëƒMzE€2€ñĈûö™‘¨Kk ’<îlosη„kI’Ód9‚¸áÊÒĴb‚Š˜Á³£%!ÄĈÂ֍·“÷—?{Ŝó¨Ä§ĞĝXıWFgpց ÊŭôSlñôÈjġ˘ÊŽ‚˜!Ä%(ÛÍ"nğYòÍešĤ=ÔİRêh%ûŭ½•ĊÈÁ) Ò/!9ëŬÉ œ5°ŞžÙNöÓġïsÎ×=KjĊq,Î)n¸àôĤÒyĊ b†vEkœóëżĝğÛ'ҒÇ)lOÊtö3£JíŽpp§N`Náş3xg†^–eÙ1,£Êƒ˜!Ä7ɖĤħ£rŬâ†4MϔRGTìnÇOOAŭhóŠÚîҀQYÊ y/­ mÉÉÚğŒħ-!ÄŞ/Û /ŸĉúĞLWEöMĈüq R3, !V¸ˆĥWoŭlóŝ^ Û7pÊÀi›Ÿáĵâ2rÄáù„Xùô3´ċa7ÉĊ ‡3Šì˜ ıR1DˆYÒ¤µ6m€ŸġÎ ¸A)u¸f˙´›´–ФÈ_ˆKFĊ˙[Éq‚D<ïoŻYÒş!„X‹˘hÉWc‚áê¤iċşBÌ Z­VÇñ2ç|cû£żş­’ċĝŜ`,Ħ£ÌÈıWFyŜä6÷Î8bĦ_ÜĊžV†u‚˜!Ä%dD³€PÓZµ~šĴôÎ §Jİ…ìÓûkËP€(‡£<Ô%àß&•÷˜ïIÒÈ2 ËŻÑ'g›·‹ħl7kOJÙîMUÙÍŞƒ‚µZ­B̰Ê9ßÚĝÑ_ß|z˜á,5°ÒÂj/1uŻ–•ŝu$QNb}ü´ûÂlĊ3q’Ĥi7ˆBĵà4mí •î*3)ċħÑro wÁb”ŠğB~™À¨´p1€QpÖBÄĞxrşħĠvĞŜp5òâ†YJv¸ eğ7 fÙIŒ°£8ŽËrç|½½qííÖÍÛĞwžġá2?Áĝr0–WŒŠé蔁sèçŸa‹ġœQÏ}ïQ'Ë2éĊ œ½ƒ˜!Ä·Qĥ;¸adÍÎ Y–ġвŬŠúŭċċEWŞÙĵñêċ£âĞöWĉGShœÙëícıöžKħT›&Û´ĦF!½a:€”$Ia¤şÊ9ßĜùÙonŸö5y´ŸÂiÀI³#ÛFMËgÒp½îĉ&”J› Nà8M`âz›<ìèĜ³£Ĵrv4“M˸’]`G!^[ši,ERo%tÈĠ³G[ÉŜXqĥŠj"MÁ‘JSŭFn -µ×p#—‡żċÛ*@lñÉê{Ŝıa%I’vğŬ—íĈӕzE“˘,×-,,Äq/FQ´*˘x{íżÜŝâ …SNŞ|Q™ 2Ú!îf£ĤğJ .ïı ŜŬ›3˜ŭ{XGŬ6Q_ĠÄ Mċş*af€(Ä7Á’êLi8M*ÛŜ£ñXk}°n?ٍ[Ë>GÄ t7ŒÎ[dœƒUġèU÷e£ÄÏ{×׉v„KJ’$ĦÊqÁËî dG#hÎ9]XXàI’$Q­pÎ×7>üé-,Çwžô`É]”)SĊÒĵË"¤ÜİıêÙÀ¨öI q $÷ "‚Œ‚ ŭìs\OìsİFŞJ)=ˆ‚˜!Äe`D“È50y[eIYŽH=)ċ™RêpIŝÛ½ġE§r2âÜÙñuâ‰ÎË#7úΖĴI*Íħ'­pÎע(Zn·ÛIĞĠœóiĤŞAöŭš4İ7m·Û"I’…(ŠVc[›ŭêŬçG„ëêPüّ›´°ŭnäŬŬ0ŭŻÜÏï’á›ÈY‘£$#F Ïƒœ>3Ûħğ[ˆŠfĜ1b†Y„ Cğ×P ñŠÀi`7=IF˽-vïAxUoĵJÈÈqċ½ħe·áÇ1µĴ7²ñ$h(÷·”Ĵ5à­M<9Ŭ¸Qô$ĊqĵàŻClFÀ *ğ71˘(˘QmĈĜR{cg§uƒĠÏu`û&/Ï)›{ÇE „”3J@a$Aŭĵĝ€yÀá,ż‘âgIÎx(òR\½fÍr Ëo4 ‚…yö96y˙V?-ÊuY–cĜÑ,@"ÄĞ*ÛÍ:–˘œüLJY”íöWÔÇ÷——Úıñ7KòÜZĜkħü>òûŽñJùĈZĈ€V.„ B΋(ɵŸüŭ{g]GfpYDT08Fcà,Ë_@[Àĉ4œ0š·$Y Â÷àÖċŜs,ĞLE›ïä aMa?Ä`@ Ĵµ œ"&bÎ`àZ‹Ü“RîI)”/fS€ÈbòA2; ñ-ħĤµZ S‹bšlšĤĊ4Ùµû`ğ}ôQ§#–iySSW)€Ú@œD4Z^splpŜC(à¨WǙ\ŠÔ dt£LÈÑxœ­ìñÏužżċÊ­·ñĠÑĉ{?X?ü˙)BÁ9ç”sN´Ö*Í:½ƒ~żívOÒ4ícêìh’Ê.°£—lçXRqĝ2ñ\ÉZг,Ëz½Ŝ!„YkíRòċ˙­FĞ”²%JiìóvHïꜣİĉç,9:”Šœ­än™Ë„KħĠPÎıµöÌs$ċы^ŻšeYßcBŽù€äšžÖÚ*lżß—:ĈH)cì˜RÚùÏ<Ñ|Q€É˙h}Ħ×ŝ]cÄ5€’Ğ-\GÑÎ9eŒ‘Zë”òĴßïwúŭ~·ßïgZk5Œf² úíoëŝáŝ!\5C|[ùXgI¨1£2u qC·Ûí9çˆQы˘è€1BbBżhŽNŠĝÔó×V@ÊÖo4éœKµÖ]ÔYšĤ~ż/Ó45axu҈ŞLJiÎÎΤR išZ!DF)=Ħ”Š ;*nĊâĤĤTìĵ†˜RuçE&ì\ ˜\nÊ8猵Vc”R*˲,ġ³ËԄrĊl~u)…ĝĥscX’mÈ%Ĉ•eħÖv²,“q§ŒħJ)'„Dŝ5XT4ĉdInÌf²žż9Bˆ!„›Gċœ“Î9%L½PC*ĴÖş>"ĉÊċ*yŽ*ċ€qƒĝŞùÊÏvŒRÊŭ‚fÎ9Fá•EMsċܒâħÚë£şègLÄĦ2]µÌĉ·Î9íòI_Ö£ ò_Mċ6t7IÜà †!^Eüîwż›'OYċkq£•œċ”RJᄐjž²†×>OžNÚĤÒV7µ|6Ċ&“Rl4sN[kµµVk­Í7îü÷MeHĠ2ÀĜŭʎ¤( ^WĦ~#Ş5ëDÇi6*”rUiş?n7í…¸Ĵ, =;²MϳÖ ŒÏGU.Ò°il4X~ ŸyZ×o“rxZ›ĈŸŻü ,v2eñ H*"ï‰`Dk;‹ÒĴ ş‰Í:Ĥnq“1`@Ĥ찚ó@ JÀl½IÓÀâ›fHó.Ì0ó(ÄUÉÛqgÀŻ:oϛÏçÉé+™Ïo’uP·f|œœóù/c‘Ï£ qsŝ\ˆŻUJ_âĵ½T9ŭĤY½é€t‘ĊKċ_˽ÄE"ěN—%o_iN/ğ×ğ´hŬkĥx…@ÈÛİgÀ!§ ½–‹|ÜÎʽ†‹9DˆĞ–·ŻCž•żi”/Dˆ!BĵžA˙‚!B„)Dˆ!B„€"Dˆ! …"DˆB„"D¤!B„"Rˆ!B„€"Dˆ!B@ "DˆB„"DˆH!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆH!B„"D¤!B„)Dˆ!B„€"Dˆ! …"DˆB„"D¤!B„"Rˆ!B„€"Dˆ!B@ "DˆB„"DˆH!B„"Rˆ!B„)Dˆ!B@ "Dˆ! …"DˆH!B„"Ä·˙}]K÷â*7Ž6IENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Turquoise_16x16.png0000755000000000000000000000016512467662066022766 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcdĜ÷“ÀÄ@"Ġ0Şaèhpd×RÄ'¸IENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Red_16x16.png0000755000000000000000000000016312467662066021476 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(ÏcüŻÂ@`b`Ġ0Şa¸j&C)i°IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_Emulation_420x420.png0000755000000000000000000037215312467662066021532 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFé–IDATxÚìŭi”$×u&Ŝûžíĉî‘ûžHd"ħ/‰$@à"."’"%RĠ’T­‘jëİŞé™>gNŸ3§ûÔÔ95ÓËô̜™žê:R-ÔRÚ(Š7q€$ÈıgFF„/ĥ½÷îü°gfÏÌÍ="‘ úqDş‡‡ğıù³÷½ûŬï~‰fc6fc6fc6ŜêÁf§`6fc6fc6f€4³1³1³1¤Ù˜Ù˜Ù˜ÒlÌĈlÌĈlÌĈ fc6fc6fcH³1³1³13@šÙ˜Ù˜ ÍĈlÌĈlÌĈlÌi6fc6fc6f€4³1³1³1¤Ù˜Ù˜Ù˜ÒlÌĈlÌĈlÌĈ fc6fc6fcH³1³1³13@šÙ˜Ù˜ ÍĈlÌĈlÌĈlÌi6fc6fc6f€4³1³1³q•†ġz˙ggo6×q½M^š}e³Ñ:1èí55ĴÙW:?Às-‚­óg@53@šÙ¸AèJż"%œÓlÌi6fú"ĵy½żğÀÒüŽ×Á0ÍĈ fc6m Â+ĝŬO+rÂuD=Ôòœ\3`š ÍĈl\c`´ Âu<˙§Iфû8áßÔ<“€iJ³1¤ĉxêݧfgz6êĝÜç>w%€Ó| ß`ôôfµ ­ñwӞO=ġÔ ”fş³:¤Ù¸ŜÁ×ówLß°ñ³y_íÛ¤÷jŜ°ċ'ĥ|ĥIàÛܳ1?ÛÒlÌĈOaà”ŸĜr˜½Ù4^[nhÒcÍcñĥhi­Èj6fcH³1oRt4 „Ê{žÇÇažçq"BĈœ#ĦRŞö÷DTûY[ù[[Z"ҤnjßcŒ‘”RJ•eiŞâ8V j:Ô@ésŸû܌ş› ÍĈlü”#˘ħ¨Èó<†!Ÿ››³\×µÇq,ËrÑBDĈcJ)4A¨ ^/M&˙VJ)EDŠˆR!„H’$8Fb0È(Ѝ%ŠÂI 4³1¤Ù˜7/:j†aÈğŬŬív×u×uğ–e…Œ1Ès8Ĝ>Ó"ĞJ-RñoADİR*B Ó4íÛĥ=DÄ4I’4Š"ÙòÒ3™ ½‘ñ˙œ} ³ħŜ…Z¨ˆŠ›mÛV§ÓñÂ0ì8޳ÑqœÍŒħĈĜ"úĉ5žĞµEI&ˆ4O‰h¤”ZB\âœ_.\ġ"Z U0…,ĵÚQÓëœ3çMÛëÍ@j *ĦŽ”Ŝ†%Ï3@š´È^ÇóhÒ{]…E×NÓcŒ3Ĉ,DtcÖé.2 ĜâZ %Jê ùaژGDĉr<8X˜GKĴıäĈHG;IÀ9‚-rP‹!#9ĝCJU†9ˆ"#ĜZdzç=D ÑDz,.„ŒJ@àM"ĵ†çÍÛc1è‰ú63@šѕ´hXݰÖ"ó˜µÊ[!A¤¸<C€ž”Ór•ĤsBĊp€Ë\†`#€­rÄ<˙ÔÔə9#*s!pI€ €İ|M‰B¤iú™R:§Ä`Î`y$ÌŜ€ˆ"ڜsKƒYƒTDJ“Ä Ż;RZçĵy£sg"@]ysŭòÏ'+á,‡4o Z%ΕÌöµÚ#Œ-0W²¸ĴĝÛrHŒ1Ĉ4½e‘mwz'! áQZZdyDpġÍFğˆŠiîž&oîk2D°€€Xao'‰@B=QCŞ—Q.²p‚ ,'"—ˆ°Çħ„ ĈiğĤĝ İíÖ8÷W˜Ö=w~ĉ‰@*Žy^óm˜DšÒ ˆÚ"×µLk0ĥCżJ öİÒoDdŒpì°ëy !“ı²ş"TGŠ`s›pÌoLCc‡şžUĥDQf„6"9…È‹€RŽBĈí°´gŒ1cÏÜüìsHWrŜ§ÌŸĞé’Ŝ<^‚5ú>ŭìċ`$ yç f:£µŝŭz Eià4q§ŝ@iŞÜğĝÉ9·t„d3Ĉ·Óµ{ƒK#‘ŻüjĵŽÈfıh£BkƒQÛIĦòSçj< ,† ˆÀfR*MĠċ÷9XŠ["ş`€ĊĈç%hÏ#Ñ[8Ö³\§÷ӛ1_HÊî·%Íég+*šTż°F ÏóÀu]t-ËB”J’„’$Ħ(Šԝ¨ÛäÇ“›É])M£ëLa'" s@ {Ž[1‚çŜÀÖıĤQ'\û4áITêû¨×V€NFĠÀ¨Xx@*7 b–WZ¨Á&€Ñ$Úî‚ÑşMm}ßG×uÑu]dŒ1!iJI’@ÇWŜûİUÒŝ³-‘Ê7QÀ1wk˜ÉgmDkĥ`p]0äaò ,×u™eYœ1FRJ9äh4ÊVWWċÊʊl€Ò4'jxğÜi´Ñe‡ˆùşèpßç²ÜiRÒPy1àށA½İIÓ5Àh ÷t jZ*^| Şŭ)A7 adٞŽŽlàúsMsİXOkô×s§ÎĦM›6YAXAXžç9<BÈ(Šäp8ƒÁ@4Ĵ¨ċgíĝ³ Lˆ†şnFÙÍĈġDÓ@gšR ; šŸŸ·;ŽïşoÛĥ˳ˆˆ¤”ħ8#×uGŒħ$ŽcH’Dµ, “vÂh.&oşk½i•çıͽÀşÒT}á`HÀ5(ôé8„Úրu€‘2µĊóQGK„ÀĈ~ÏÊoaۅsÜĥAĞϵÒn 5òuÓw-ŽëqĈÀ^ŻÇ0t<×uÛĥ}ÎıKùN'ét:£0 cÛĥ³~ż/Ò4mÎj™?kµÙ€Ğ0—Á@B!ñ ÍĈµ FkQ*ëñ~ÛĥY·Ûċ½^Ïîġz~Ïóĉl۞çœwcNáĞĥm/qÎ/+VG£ÑhuuUhP˘)”Ë›ÑĦµ0ĥ5h!€Í܀§ÚMĦùΤ­ƒ¨$×*RúĤò]Ş™S˘)d^h r)7Ġl…Ş?n+ş'P € ô=–c3Ĉjm3`ĵ(ĥyŜU7mÍ'×uY·Ûuĉĉĉß÷ç<ÏÛÀ9_°,Ğ (ŒmÛĜĥ½lÛöŠëş ’áp˜ ƒ&0MġÌİ·w´”‚†Â‡jH³q}ÒsSoĥm3Ïóx§Óħĉĉĉĵ0 Cß÷ç\×ŬhÛö˲ĥza¸ŽOŭêŭwşáG˙âŸŭkìŻž ˘×Â0„ıı9™Ĥ)$I"Z’ĉ‚2JW°³EXÛ9çL/ŜVAu1ß·R *Š”‘PE£q…2|ê Ê(/¨-ì‚ÊU‘*Ù8CçHƒRAŭ“AXċ* Şç‘”ŽÈ‚çy /jŞŠˆÏ5(xc*I˜eŻ+ít:vŻ×óÂ0œ÷}ĞmÛ;·ŬtëíŝÙo|ŝOżuöĞŝc)ċçü çüĵmۗ,ËZġ`z{ËÄQÓulH³qíÑziÖĥĝÏ}ß·Â0´;Nétşë.xž·É²ĴíŽìŜuó­w<úİ_ı;ܽżw1Up:’  xŬ7Ê£?~ÜzŝûÊqœÄ÷ŭ¸×ëÉ4Miee%˲ĴXÖÓ·§ĥxLX8Ö² ŞŬgzèš˚_è)*W ˜`T€ b^pHĴ˘ÚéŠx$m†%SRŞá‘‘9ä@¤´aĞ$MßÀUlxİV¤ĞħQ mCÜÖ’­ ÖÎ!´`fóŻħљ$Ğ/74a:A„ï/Úĥ½Óĥ탇ŸúÌÏğ·/_MÁ hq{oÇ'˙ŝcŝ–öoż™\x„s~Ò²Ĵ³–ew]wĊuŬŝ`0ˆƒA6„ħħĦ–ı„PwĤx#së:TĴMÇ /0Z·ôvÊ"ÂlÛfAXa:NǰyŜÏómÛŜfÛöŜĈMŸüÌŻ?¸óž6ex&‘°"¸°ĠĜ²Á/ûc÷û'_9-ċÒóĵQi§ÓÉâ8Ĥ,˚íµĠP‚5vòÓ>ck”¤ñȝC²{ ‚\@ Uġ‡Şıĵ1cġ+ÛB`!U”]ñ c|UnBĠÏ”‘W"“³˜aae¤ t%…Z°¨Ğâœs&œ&á=ûïġÌ#f€‘†Ħ†áĵ8[mÛaëM·=pá'n8+ùùÉÀ³ğîŜ|wnŭÊÓsâô˙oyœŸ²,ëĴëş]×]ñr×£ŸúÌ­voÁ]–§È\"V&ç X!"Ĝâ0Ĝòàğ/ñû‡ğâşî ‚8Š"E !Èp¤nöï™Z£tı£ÖóÁ9/ju8Ĝvw. Cx`ĥ—0C@ÓjĊ´f–ŠĜXż°eNċ+ÀCôLpҔž"#Ùc€X‘·°2Ë u; ^P’F„4İ.‹&ŝ:hÑ60*{MùïtğŬ÷ŭŽìtg˙}żĝkO,,nò{!΁H¨üójdGI°š*`ƒó‹ŜâÏŭú]›?~Éżĝ·ß_=~ä9ĈĜI˲N;ŽsÁuŬË:bF£4Š"Ħ79m Ô,Ά óëúÍ/nßEä-g^v³ñÓ˘ġròD–eñ Ĵn·ëv: ‚žçy ënĥm{Ğëşğwġ+w-¸i.U/Ž2HdĊ9)Ş" Ò¤REp¸g_=ŝÔ!ŝÚËÇís§W]×uğŬ4MSİ”˘ĠĠUjĉñŞ+¤îÚèşVOŻ×Eû ËğÇ"™ž˘÷İŞ#4aŜ\^Ŭġ/Şnä8)ş ĝ”2VM2ŞxN)\ë"˘B–ûèydÜòQĞì ·\ƒÊĵT]­­‡eYĵÓé8Ŭn7 pƒëş[mÛŜ·çû8p˙;7żĵ’Âj,@i0R™ÒŸ'ŸGıÊlŞÀĉóÛöööüÊ?},~ñğ7˙Ğ÷ídyéˆeY§,Ë:şîyÏó.÷ûŭĦçyÑp8L£(ʲ,k‚ÀúIĴë3żT€‘&œEH³ñEEŻ+Oäûíû†a w²ÇÙ¤éı]½…Ċ˙Ôg8Èc[$0<ċy"(zQ=!_RS¨Ċ!wíÚn}ëħ>Òû£˙çy)e?˲¨Óé$Y–Im/”µ°ák;҄]ûZ´]qJ"rMq9n·g{ a¤+ˆ*éu!÷6ó>` ˆ/z%Î!M]êŠG™Ğ%U€¤__)Càì·V䙄fq°Ü$·;·Aâ,O"]É9Y/ċÙ:Ÿ ŜŜ °ëşîÇqöv6Ŝ|˙'>{ÇjJxb˜ ¤ |ñ,Ġ…˜wÚeùn_"B*.Ĵdàğ7?°ċàÁğ?xéo˙üĜùŻŭÙ7-Ë:aÛö)ÛĥÏ:Žs1Š˘Ïóáp=ù·_ŭ’Ñ@²V#0¤Ù¸Ĉèı‰y˘0 ;şPqÑĥí­Žìp]wσùĜC‡î{,/°N'.g„”çIŠ‚œœn"*o*—Pċ³–_ 6ƒm‡ß1áĜKïp÷ÏóY–EY–eišJ)ÒÔ]ƒ kż½(­§B!ù.œ8"ZVħmĈôÂXo~¤W! ÀĵÖa-Ò)"£ñC?Ż…*Ch(íLqRCGȤ$°=$sÏà1‡1°V†µ @I… 2"Èb   ëÙĵóÈGö/ÜñÈö3_úÜO.?÷ï[–uÒ²ĴSŽœó<ï’ïûĞáp8 Òáp˜jŻi;ôĥË/•G#if:o =÷†òDžçġ|ß_y˘Žì>xïw=úÉÏÜlŜĉŻH‚ CB ` ;°rG@„  # ER‘'ÈÀ½=ŝòñ_ĜŻıÍ9ulĊ÷ŭĦ"N’D¤iJƒÁ 1.úI½{ eáĵ’<’yŽYQ‡Ä³ı^Tcël½Wbó0"£ĤĦĝcltDÚRŬœŒ×iÖ#/\œ…ü\t:]Z–[û9¤+¤ċh`4–/2¨:Ëó<; žçmħm{ï?ŝàŜÛï]|îrƒDyÑħ‡àr›Xˆĵ€ĴĵK„L!§ ½Mŝâ‡˙î=›î{ì†×>˙ON{Ŝ²Ĵ×,Ë:cÛöyÇq–<Ïë{ž7ê÷ûÉh4B f€[œ^W~éš%³‰`ĉe7oYTď³iy"ß÷ğˆ69޳Íĥí]ÛnĜóżôЇ·ŬrdžDœHdî$ıCFŒcÙí”ôŞ)À"›RŬĴŽI€¨(2• "B¸gûFö­Ç?ö@ïßŭ볚şu:4MSĦé;-5¤°>CíiNc‹ĞeYf„Ä1èXD¤Tè4Ï'AٕhI%ÄÔ£_ÁÊgİz$dnMèuĠ]ñ 4ŭ‚n§ Û+ĵì8äĞÓê^(djîÈó<[— ÌûżÙqœŬs›·Ŝzĝ£Ÿ>t1pz(@hÊ·ÎÀe6g9 AŜS àUŒBĦ2ĦÀ‘ ˆb ,ì¸i~ßg˙OŸ˙ĉ-Ż}á?|Ëê/żbÛöIÛĥÏş{Ñóĵ˞ç ƒAEQÖÈ/b~X‹h½öiĵĤ%ĵšÒl\=0z½QkËé…"ÔġD5í {sûßù‰_zà–Ǟ܆–ĊN$bIà€şäµ.ˆ5ċ³^, ˆ€Îg#Ħ SıġÍCĜqÛáîıcïyÔŭĉ_.ûßBDišĤB)$!DŬ  n{³ŜèhÚ\‰c /;Ë÷­TĞ óü dž™j•9Ş J0‚z9Hm}hÙ{7Á¨Ğ€İöċĊıFĦ­"@ŽëpŠ[cĴĴAÒn ëí6ŞĤÌ5fŜ\×µô< ƒ Xp]w‡çy7<òĞï!ßĴœ‚ÈPtmx<ïxksÔm=p<ÖùÁläIË&°K\dÀ‹uï|ÇĥûïüÒ·ŝüèùo~á;–e·,ë”mÛçlÛèûŝò`0ŽF£ĜÈ/­W&S¨c¸f˘%Í^ÀÛ²iHo=­'W4ĤžÓy"+;ŻÓ鄞çÍğğ¨“Ì;ÇÙsÏû>x˙}~j?ëtísÁA.Cp€ĈMÑj;ŭĤ6ä­½ĉIi„Jí!€€|—{Wρ/ë£;éäKwÚÇ^Zġ} „ˆÓ4I’¨8Ž P2€µ¨ğġFFċ^v…ôÛFÇ癪 c ċÜRGFĜĦÚ6šJ]˜Ö m‘Q AT?·Ġsu”ÔfCdüċ: /Œb-DäD„S¨·6 Zo”T1ï0 žçmwgÏ-ïŝà#[oĵeŝǗˆE›Ï|†àüf!ê(”ꟽŭ|“Yáa2Z0‹0“p!‘0ç…v÷ħOÜ´ážÇvŝüï?ğüâ~T\×=ï8ΒïûĞëƒA2A&~%–V×(Àċĵ ™ì{6Ŝ\0Z3*ò}ŸkêÄÍˉ‚9­žÛâ8Î˲vïżë˙Ògn ·ï RÁñ"lIà ĉMu`D-PœòƒÜe4·Î˙VŒ¤B€HŜ2ÏŝîŭÁż:­”ZBDN'NÓ4ÓĠòò Ĉà°ĈNġs‰/üÁ÷˘ g^àœżfÊă X ñ`0ˆµ ‘IrQKŽi]Žôo%(!3ÀH‘1g€4opn­ŒjôœVÎ9Ŭn·Èmp]w“eYÛmÛŜµ¸mûÁ÷üÚßıç‡ĵIè ĥĤçòDžâ”ÓtMTXëR#½“%…`#1ԉz„HdàÀž[î N>sï ŝÇËBˆ~4M³,Ëd–eRĞî¨%­•Ş]oÇĜÂ!WĜÍmb•_ V3(Ĵ"ŸÂĦ‰.€!™÷ĤD–E×ÄŻù“JGóoH‡sŠ[ ‘q¨ôYrHk5ìk;‡ĴĤ-ñ‚ÀévğBUç8ÎG~ċï=ˆĥË_\Š€K"x€àqÈi:†À™ï4‰i˘àçols$HD8‚y S”)8Cı?Ŝ†ŭw.îßwË{Vċ[Ï|éż™F££šĈ;kÛöE×u/{ž×ï÷ûQ’$b45=Mż\jĦŻv›”7LÙUVV0‹f*ĉÖFĥms×uKÔ :AÌğğQ×í şŬŭ|ôÜöäûw2ÛaÇ" —2ëlĜ˜ïTó[µRÑÔ~ ´=Âu/nróQb9ġİ\…wk‡Ç>´M~ù÷È3+RÊA–eq–ei’$R#Ÿ49ÀXû<ŭŜ²ĴJ̀hóî\Xˆ^r”Ê›ñb ˜ê]['ô+'5ídUwdƒúkÒq…ÚxŒƒVö2Í!GíÒÏN÷DZĞklS£Öy^KħL·Ûu:ùÄ[p]wğ8{îú/só}\JAˆ¸,Ïq†À[£Ħ M¤Ê]œës7O#Z,w.½Ĝšŭ½h- _Lrċ0½µ—Ú›¤Šàñm=ü³Ç?vGxĉĜk”+A …I’$™RŞ îZ |j2ŬġPKÍ訠í,DäîÜżpH@•TçiTkŝĴž÷irM­›Ĝúİ2Ïĥ­Ó rĞ&U´ @²mÜrŠ.¸şÖŠ)ÖÚĜ¨F$0)odş1Xë:žçùNgÎ÷ŭ-žçíÚvÖ;o}âğġ3X‰3‘‹ à`dBo£Mü¤pœZ1‹$° ÀµJ²öíEBX 6öĉÜîż|ëÂŬïÜ}ĉŻ˙à‡ĞG_xÖ²ĴE Lç=Ï[ò}ßïµ Q6D MŒSèğ·~GŞrÍÎ fġEGm`Ôĥ²  ÁB‘Hîyž·à8Îf˲v8޳gïmwÜŝĜ§~ċŽùŬ7ôFŠàċa‰fÁ Ï9KGBĵeӋۘFĤA}üġ™îĤlcı…P£TÁí7Ŭäŝĝ‘½˙ë?¸$„A0J’$ͲLԝL° ˜8Éäs]gcîj`óΜ/uc=ÒItfĵzî%§Zġĉ-ÑSÛù£v ŻKÉĦÌżĠV=*ÚŬˆ˘8‰ċ-/˜í‚àva°jqέ)€Ät([œÖnĥm[NÇívğ=ß÷7ığ ‚ŭ}ú7ïM‰áÉ~! ¸Dà T‘Qž1*İÇIçel>M0§ȋi- °0%_II툞*Žpz)Çc°uÓîîö˙£wl:ö£C'˙ê\pD Î8ŽsŜóĵË£Ñ¨Ż[Óáp˜ij.ġ&€·m*é­#’J+ífŭfêäŒ&RvŽn·ku:×÷}?‚^a÷Sä‰ĉ7m>ĝäg>ûàŜ{ܘâË#Ğ˘XlİlWĵ(/”qúíL_µi—Á:Kú5PÓL leè…°Ċċpü‘ŸÛŸ|é>ï'OŻH)N'B¤B5RCu0žx† ğùVÓOroӁËAÈ<9c‰ÌĠ[Ž)àŠE o:š4Ö-€Ĉä*7…O+•]k9Èâ$Kîú1ğ4X-LV[@‡'´äH&ċ¸VĠÙA„şv›ëş{ïŭĜŻ>şaËv˙™‹ĝ À‘.°”Ï3Ĵò`s“N­ç”Ó,&NyN@húñ‡ïz߇öpÇċ' çÓÜĵ@& IÓA¤;˘^ĝ4ĦĥÇ)ĥ‚ëĦ隴JKPĴ‚H‚Şz€G=ĝËÇ>vKpúĠ“ĞBˆA–eIÇ"MSjĴ&‚’‘?²Àv{<óZ*‹ċ ,vò-•ZÀˆJcöÓ3YÚ]›†pĦĥínpVL&!A`ÙÌvAZŽŸ›äžvşÖŠÁxbŜŒŠ]?‡qqƒyŝ¸eYÜu]GûÎ{ž·ĠuŬ]ğnżç­ïxbëÉAR(€Í,À‘ŞèĤ8ÖêħÚçRñ ex)š*b>Ϙ.ĜÎ)X‚aníÄF# £TAϳıs÷ÏŬpàö‡·Ÿŭò°òoÏĥí˜lÛhÛö ç| =Ûü›y··6JR ħ™ì{6Ŝ*ñëÚA„AÌûżŬqœ}ŽÜpèÁG|Ç'?s›µa£w)SZ?Q¸ŝRžkÈÍwŠˆ¤BFQ$Ó4)Ŭ[ F$İfŠ8“}ÏĈëÉM“x—qÎYĥïûëş‹ŽìŜwÇ]óżüä†oZŠàÈ0ƒHĴ(Y֚™ËMéPDFĈjÊ´ĴLé0†™tÓ$>‰ÚrùUE'£|ád@9-VDj `gÀàÒC/œ?ġòCî÷ĵ"„„a%I’iޤ”$‡Frµ}8m'c6çÜ ‚ïĜ †ZCAZ)PÉëFŞĠÊ]İé&Š€Z£!l„PE´ÈŒ.Ôµöúä3c1/òq¤`ĦӃ‘ĝˆèhÚÎÖĞÌ8mњq‚yŜ8çÜó<§Óét|ß_ôu`ùä‘âÔñbíví£Ñ¨Y“´ž$|>–n†ëş˲:ŒħŽß›³ıvĤ(Üâ Jħ\ܨï+„Ş6â-4MŠ 9£ÚNĥìòI­dduî Ħ"lكSAà1Î;–eu<Ï ƒ T>PDRJš°³ŸŒs΃ °‹Gïoq]w÷m=y˙M‡\<ıš’ŽÒnŬh8Zà8ĠÙĈkRËúј³]Wôá*@Iêû ŒJmú|P"7 –™"ˆABèrlıkÏÊoüğÑ3_ü£î˙äÒ4]ĥ,k`Y×’j‰ÖñZĦí 0šÉgjĉ‘j ¤m`":ä-l;ÖWlşkЎŒ¨BeĉwšnTQĉÒdV´]ŜšĞn¨P´Ình_ êÍÀhW&a…é(ÉÒu÷έü;ĝċĊ˙ú/ËŜIŬn7ͲLé›)Ċm$Î9³mÛĥ,‹[–e;ŽpÎ]Ûĥ]Îıïû~aŝıÉĥí×óı’Et˘8€RXzיtP‘Ë)½éZÔ_f,MɽUĞŞêġÛ*Ӑ°b‘/rMš‡„mĉà‚ÚhÛ]×Ŭ†áUŽ”2BÄÚĤ)˲,SJÉ,˄”ċ ‚I€dY–íû†aOÀîŜ°eÛ͏~üWEp9νċPGÏÜ<|wOŻ~¨2Êlĉé̍L˙VùżÊżİ(7`%)sZl›Ì/CIUƒ`’Žŝí{sg_ĜÒC t´É +&œ½eġHÈ˜áŻˆ€8£ìfê€ÑĜMQîpÎŭĠŸüˆ}úwvïf–îh–ï‹eZµĴ”ġ‹œ@PNŸĦ*(<íVĵİeuĉ ڒ9mMéĈe[`P89ħ}¸ÁbpÎ{{/<öĦGä—ŝx%˲a–eħ.VTJ)”RJóÂ眣mÛÌĥmĉyžmÛĥí8ŽcY–WÜ8ç>ç<`ŒŽ,¸ğÍóĵ]ë.nìuyĤ8V6=…üşPp•t]Ŝàğ{2?“qnۘ¨êıÔ.‡†ôû"âÀŠ6-)=ŭ82t ·y‡ênBôcÊq/ )ċPJ)"!D$„HÒ4Mò–TiÇħȲLjj” şmÛĥ|ßw0ìA°ÉuŬžçíŭÀoüîŬ°c=·§jGŜ6·nE­Jğ2ßiä‹jä…ËRGOB˙[(! 2•?6–·#żô˙cısşHϽ ÙĞÏd;ìá³B)&}ŭA Ŝ&lxk†˘’j~›ĥCšÒ[ P& BéúœÔyĉÛÇáŬîŸŬ²µğİÛÉU_[íXŒÇ¤ŜBƒfR€3èâK.§è’Ú5›z×xŒòŽÑüȍ”" -û{Ò#?SĵúâŞb˜ĉC!(MSdŒmÛè8NÓëşĥmğ–eĥm{ŒħPƒPÈ9cĈX×ĥíEÛĥ·,nÙĥóáûz7ÌwĝóĞ˘”(M1­è*[šSEߪ.¨˜‘5)İ–\ Ö"ĦœdÍ6úĊ Ùtş0½1´\Ĝ÷ÀğÜċlyáҏż{óh0èĜĥ½Q)µ,(RÊ! ”C!ÄH1ÒIšĤiEYÇBZĉÌ<Ï3%Ŝ[<ÏÛußžzdßĦ[ĉNö3P‚€v#*ÏçS&°Ô]™`јDġïışNStZ´“i%iĤ2ĴÚĴŠ †Ž2–~üĜD£Sœä U*BÈ,˨ĊĴöš˘êj2ĈYƒÙxòI5@ŠX&I’ĝ?̲lżògGN˙âoß³(ħœüÀúĊ?)JÈHU} (bĊ’û/šRıƒƒaŸƒcÚ]“I›àÄ0ß}íšTŸYİàÖMó,ú…_9œüO˙â´b „ˆuğžeYĉ8¸k{žçşë:Ž[–<2Ĉ:–euħ9Ÿ³,Ğ·çÖÛwìżíÎíğœ_Ĝşğ=[)€ ‘(›l½žšĈ¨T£ÚŠEµ½ i£&‰š ŻÏ Uù£RO‚ı€*ómĠߙġŽ5y¸ÌE(–Í`×âëö_üŬ½ÏüĉîÁÊĊƒK§ODç^}eéĝ³ß?uñäħ³RÊ)eŸˆúRʎœúBˆ(˲AšĤI’$q]A¸ëvğŬ97Úµe÷ÛŭùŬO$ĴĈ2Z MĴ¨L2Tq@…L7ğċQ­Ž šŽtG_Yä‘TÒ,"£Lĉ. Š&97|óZy‡ZdéÊèŸ|QŜ°g²HĴ¤iĊqœĤiŞ`íNğoé VmÇ ŭôÀ§-:F£‘F‰çyĞĥm_°Íçw}ôP´mSàĜĤ‚¨ĤĤ›|µäğKӁAnÄ0_(0Rƒ€y´ĉ>?Xehê´hͨŞá@P€Ó–Çö¸Ù˙ï<ó'˙ĤŻ”J‰ˆğğLD™eYÌqÏqœ²ĴŽġc=˲ĉğ6lĵéŭ{v8´mÛî}áÂĥmZËTNí,gŽ/g0’*÷ÛS:dlĉ¨^gÔƒ4šé€Ġl#ÑÜ ä§A·RPZLRäï %˘ ¨9Ġ§ Ë")£ Ê–l]ÁÛtóFoÇ­÷nxç?µ_ÄCı|ñìè‰ŭS/=öÈwŝ²bY)µ"\Bô5ĝÒ4&I’*ˆsîĝżÁž nĝoŝŭlÛeG—šä­ÈĞ™mm—˜ 4J+ÀÀ&óg!γ{Ħ˘ÓuHŒ¤$”ƒQ"óŸBĥÉïKÎÓBPàµgżE˙"`v2MÓ8ŽÚJˆ”ĥċŜÒĊë–LŠf9¤Ù¸:ı£ÖÇħ‡İçyÇq–-Ë:ë|óÇ^üàgnıÍ€Œk…Ŭjìö r…R%qmñ£´ìğè$Q)+ÌЏÚÔ à€/SIu!żfÁ[•‘‚Ĝá[0|ô}[‡/>s˜^ĝ‘BDÏóĵeŒ1DzĴĥížeYóĥm/ş˙Ħn9üÀž]7ìÎmÜä%”/PBœË†#á|‘CIy"÷*wì²Üá`T,²Ċîĵ[³FĤA1•YóÜhD]eZÔAeéTš³&ݐ¨0^Ħ"ùñ £Tı4Üa.·6ïéîÚş·{àáÇ·żû³ïîËgO ÏyqùoŭèÙW^8™eÙe)ċJ–eĞH€ë8ÎF×u÷>úñÏ<şsïŜĜJ "£RF]DDµ<Qĵޠރ3E cQP#ú,jĵİê5UĦC "0mڛ™yݖȨyi0€<˙½X9_zVŬìá³i”žO’äòh4öûŭ4Š"“?^Sr6*ژÏ"¤Ùx3ÁJJIá0ó}?r]wÙĥíóηżôlôĜ‡oH½9ÏĥÙx;„1ĉbĵJ(#Ğtkt…f$ÑÁ˜çĤ›ÀXó!Ş+Íj x˘Šz˙ġ˘Ğ™ô>0âࣟıù…˙áĜˆ1ÖSJ­€´,ËïÌÍ/Ü÷äûşë֍;w…ÌġX”dJÁñHÀ(£2OU~ê€ ŻĠRd€T@Dèà´XDQĠŸH@T.şCĊP†¤¨+*˘` KڋAžËb:nÂFn @1$(0žË~I! Ċr*J( È‹C2 ސmĜŜÙóàŽÎĦw>ıS ûâô+/­žxî§Ÿ˙ê_ż „XQJàpÎvŬtËÍż÷Û.$ôc™Ÿ]ÛSgŠêN E”Q‡dF›P)ĉL:´Ĥ£QYĝ-(W× ÊóG’Ú(jwgדV)ŭ8 Nï\Xbvúê(I.ĊqÜ q’$ĤZòH×Ô(?Îdß³ñ&ÒyRJˆX ƒÄóĵ뺗mÛ>kŭ/_{ċŭżxA‹€34j0 =‘d-ĊQğ3Pî"kĞsËV´e Ş†•ʳR+^“!T0•—çJĈüü‰€éĥĠ ˆÜ}`ż+é·o>ŝû˙Sà!żóÍßŝàC ›vì9ĤDp)Q0ègyğtRıĞxÉĞċë†R9u(@hi°R`ÔŻä g)zá,’çDıMıȂQ¨ Twkh;몺WQYĠ·ÍôâË4%šŞ2b¨mžÊbĉl--<Ĥ@J,k•d!m“LÛDİŒò‚I Ĥ H)ˆƒ•DgùÖĉ[î^ĜsÛ= ìWn9÷ê‘ŝ+Okéèwżb;.ûĝoŭŜ -<7HòÏ-5x(U}ŽHUÀ­4êç_•`dÒyµ¨‰ÌĥU„TtR/Rd:‡$¨½µ™Ùêv`#  áìsOÓM.=ŸĈyt4‡£Ñ(ĠâŽëÂħT‰˘X[½-=íf€ôÓÛL£ZĦ”‚8ŽĊh4Š<ÏğlÛöEûġìàÚ£\´ÑqµòĞŒ&9QËrA9$BK"`EÂZ×8˜–£ċTNeœJšv*rFBÌG ĥÁ1!”M°Ü—ì‘ûĜȁ½ŝîÛ\ 38IÈÌh9žsmemI‘`‡Ĥ*Ğ˘ÊÇôż>Ç òzF½XiäÁwo?8çv šŜÏHRAıéhĈĜyqu•3¨ğr·m‚š$á‚Z8—‰|ĠĉXĉOòÄ|½ WÖTkġrQŒY*²À ×ʈÈÈE$Bï%T`¤èh#Ï=…­‘£Ë)Ñx„ÚBŞÖž[·$Ŭĥġ9)X'Ԃ{Ä2ŻT´úP @ê(Š“†`´!Ş´ùÔXÜQUb~SeXBLŠÎ~Rœ߇•QԁŒŠ 4hUÒJÉĉĤ`BdTû§Ò 7Ï3 ”ĴÂéç{]:š%Ùù8Ž—˘(êµG4Œèš(£[l­ĉbH³ñf—BĈqœEQ4ô}ÙqœóÎWŝӏ‡÷?ħdĈ;ÚzŸÚ#£ †–&½!İ^ŠÎ°ŝX1áY•²İZ‹ZqmE{† ĦxĮ́§ˆÄ$Rŝ·`ôgŞċ Vċ⸔;íÂ˙Œ´€A[Ï(­à2 ’êÒm˜FÍ.²“0Zd4ĥˆµN$ÈÜj8CŭYóNݤĊ¤¨§(ıHDɜŝ˜‹ŠÖÍzħñ¨ıjŻ‘o 5U‘d,…ÀARġwĊĉ )ß&C(fž ò¨(AƒŸŽNÁh§2‰* ç*8ï‰pñ•çÁYzmäA­DQF£L)5İä5-_+ c f€4W7RK7”›ĦíÙzbHo&ê"â št!TìJ)!„ˆ˘hEÑŞëş—Ü‹çNşÏ÷òÊ]÷-n°ónık—×Ĝ–ŽÚìVŞÇUn ñ‚IËQğ§ŠħĴVá—Wyi‹a!U.%ŭ×RŜ;fi“ħàIM÷Ô JLSuÔ áڒÔ^dĵ>šŽ&µO4ħĜYêȁA I-Dħóܒ=pÀUђİä*âKŞé™ıı:ižgEĤĦ˘á$ô”97e䅔ŞK‹ú£19½2ëšr0š6M‘H Ñê+IŻŭ఍'…ç“$ıEÑ Š˘D·8i ZH½ċ€…ˆ@şCî fDE4˘›x!dY&Œ\Òċ$IÎÛóÇ?9s׃ôD–·OB£ĠvÛ³…b˘ í+”!ÍbĤü[a­(Ö\ÜÌ| …ô ¨\­İyµSYÈ¨LEMQ=w¤#¤âgùğ:T µŠŒi’Ğ:/”4N76#­’†Ríԓy?§²òü‡ˆ8ÓŬ uŜéßĦ^˜™ÙêÍ ÑİiëSseòdÛ­+sFT/r­Ù ŸŞœ iˆ"Ĉ§mSÀ@“u&zÒĦĊ€,K/˙èüĞÉI’,izŜúÊżròĈÛï9À˜]B‹*‰Ö ñ+C὆U£9,!µîmgĥ2Ż”\°ċ 1”Ù o\Q³Ü!ސ2)·µİdŜ¤Öú>ĤE$ÓrF4vlµî§4)Üj·j`ÒûL‘—÷•ŽX2íÀ0ż¨Tµ^ĴèŽkäpÂ×nĥ§†OŸ2ĉ‘)|(€ÔlÖWĥĝ€JMW4ßSk·hËë›Ĥ70+ŸUƒ3Ç ~íˆĜoİç£Ar!I’Ëq²,K”²y]Áú„ ×D¤D…Ja…˘Ŝ~îŞ3@z뢤Ĥcƒ2WF¤¤Š()I’T+îV\×½èüü+xüĊÑŜ}ŬµĞĊq,%A-9Žñ˘Ĉ…_,BhP?e7ÙRÀ`öúÁŞ[j}½¨żù”ÂÒşĵ› ó*İ)Tğx˜ÌM}ĴžŞß$µLó°7#£IÓ,ÌUë˘ôꛇŠ'£Ş"е!˜°éĥÄf§×Z]³+lÖĞîK3·†CCk¤Ú.í.˙İĈİFÂŞÍ 1ĉœŝÁ7`£\P2=Çñ8ŽW#Ŭ·İzüšTĠĠŻ$Ê=˘×é f‚ѤY3Bbf””$IÇq?I’$IÎħ/˙ÉĞ'?óï8hK@äÚ ênʽí_jPèV ĊBVˆñÌD•­ğ57TÛġDŞÌX´ á­)İ%bh€ÑÔ@ebtÔX„§ô›R^`rÎNµt“"#jùŬ´MD!oû;Yt ւ²ÂŞİ”,]´ ²5b4şê‚>mçŜ´v"£'’j$šèĢW‚Vu]µ›ËwFŒd—Nµċ~‡~<ê'…‰ê I3:ÒMáפéÚmzËWâ*RS:uÎéúÚ 7Lɽ0‚–IŜJĜ¤”R2ŽDËWW<Ïğàƒ#xŝĝŝlǎv@mêב3jÄEġȨħp#Q­¨&EŜĠbN€F3$jYèT­‹şí=Í#Ÿ ­;í}6M£6 ħ=÷s…‘QÛñĴ#2j‹˘Hµácğ=Qќ°ĝˆĵìuU"“Ñßj|šRKĵ hì]kPݰƒŞU[ĜİÚhı À… ´ĜqȈœúÑ·`£è_R˜œIÓôRÇŭ8Ž£,ËÌèhš˜AM Ô_×uµÖ˘MQY>¤·-­Ç•{Í×]çdäÎ`ÒvmŠ;RJÉ(ŠbÏóúï/izÎû꟟8ñ‰ßy—€ÀA’šL´ Ôt/ĥŠ–k*ì&ĵ\ë%mžeîĵÉ@Zßq·,ÈÓDm4&MXvZÒI"•i‘ĠÚĝ͜ÑÄoŝAYMygxJmYJeŞ[/dh×ñ/\µĵ·RTŞŒˆjRd4J­1İ5˙E­;²ċ3°rô9u›K/Äŭä‚ĥ FQ”LÉ)¸B1UŸ7ĵÎlŝ/ŸÎž³ ½M€èJ_Ğ–èJ&ĉ4ŬZôBˆ4MS#Jşèŝè/¤ïŝè^ĜşÙ'ĉéúR텄4aµ'jŬĥPĠFÉ?5>Q[5òY“ê£&Â:M2Ŝœ,BXKÀ*† $?&ósİvjÍhgZñrs1§ĊßÔ¨JWïÚ5îßDµfdNJ×ÔhĊ !z ŠĤƒ&Í:µèµċ{ĤqÚĜ|-Ȑœ{î{°!]ş ˜œH’ä˘Î„لş#5!2‚)”ŬĠÚà^é:S;;ç˙Û°ù˙ôێ³{[҄ ƒW¸Sy½Ïu‚Ñz%àĤÀ@×%Ċyl_×%÷˙öó§ŽWnÜ(` ËŸiÓÔ@j[4ÛY–ħ•´­ŜĈÜċÓ*llñéÇM“A‹ÚÀhŠŬ LÍMvĞmĉoĈÀ~ZΈÚAıµ°ĥy>š‘L9WT/V­ EÓU‡e:£7)W5 Oúü4ċ{Ĥo3‚f::bûÖ%—ÏÂґgèf[½â I’,F£a’$ħöĴ›­':z½kÄëáÓpĜ˜ŝĊaÄñĈ$èûĜÇ^×ß}îsŸ[/Ŭĝ³ H-`„k|á¸ÎI4iż‹Sg-`ZŻĵv!‘LÓ43wÎw˙ĉ…èÑï²ü d.¤²9[³è\ÜhÂäĦ5 –ĊŸÍhƒ&òxĈnzÂâ×ŝĞŞ(s"÷IÓ]ğ'ġ3j£Èh ĥĥĞBKKóĉùŸ’3š&Dİ(Êɑd3/ÚÎĞ˘uшcóbžAŒ%ˆ&~M×ÚğĞ-µY9Ë[0 Í,„ËG~½áùeĈ’şîh9I’(MÓĴ‘;z=Rozƒ ´^ Zk}™tß*çñĞ=ŜV$dŒLWš6OP³½ÏznĴċ>›>cbW0Ûè„Ú}”JÓ4K’$Ž˘¨Ÿ$ÉRGgÙ·żpĉĠH‚’š Ñ}sLCĦŞÚĥşWŞ  %ÒİyĥU˙żŻm;U‹£x³†ĈÁ¨îUg.Œġw4_żÙs‡¨½†§™Ż(ojÜAÜ\LëžlbÛf›òòhü­İXkóœ#ރ‘)%ĞÉ·U{&™ıŞÎkXTóğl9ĥړoş°}Rm4qBjŻßôTşŸdŭ‹páĊÑ6^NÓ´¨;&ı·œµċĤÄZk ĥĴ-l5d­ġe­÷ı’TÁŒ²{‹ÁhÚż'ŭĵ’(İmÂÒ:¨ıiŜzoŠˆT’$İNÜ^v]÷˘÷Ï˙$yä;¸ËlĊŬ\„ èÒÈï¤h†‹&ċ<ÔO!`[²ƒ&Ò8SrD™fÎhjËkĴzĝ´×wL·£†Ŭ 6_wœÚœhÔJÈUUßPĴ™ĈB™ v=Srx“r= Ĉ#£É.kÙÑäıBŞR”Ħ–\ YĞG áʙÍWWu{òÑh%IbÚ]İ´›ÖM[W^ïÚ2i i‹ššÏ[DJoÇÒz&GıÓ}Ÿı‹ĥm3˲rwPAY–Q’$”$ M™iJœIüïZÁZ ”’Ú½!ÑNàKI4:ë}÷ŻÏxç‡wîcZs &×è´ÑyÔ@cWF-ٞ?|M9Ĥj]Cì0AİES ûhœ‹k£ÖóÒ ’ íaşTġHaŠ cì)C0ġ³Ö£ÖqŽTM>ǍïŻFeNëĞÚÁzŬv@m\İè !FY–ĊY– Ŭž|Òu Óż1Jlƒë$tğŬ.îġzŽïûëşeY>cıR*N’dä8Îâ$I’(Šä:ÓoPz;Qv“˘Ö‰ş. ‚Àét:aÇÙèĝÁFF*Ȳ,#˘UÛĥW\×]ñ<݆aÔï÷³8ŽĊ`0Y–)¸ş&×ĞÀ ĈX3SD$o~ŝRï‘÷nŬ4Tµ$á'£BÛ]Z;ï4AYĤZĥ4Ì&½NÉe\QÛqŬî½k³q]rÈHj™£Î[ gyù ƒ2ÏË˙ÍQ;™káİÜ3Žç $֗ ]À“[/1ŭ7ız €¤* T‰ÖâÖTŽR“Ġ’Ó¤ċrp­9£ĉwCí4Ŭ8¨ÄÏ&û†Úi# ¨A6ˆ780ì'Tğ9ç˜×Ânùö´ĵ/ÂÚBĤœU´m†ĦĠívy·Ûġü|tǙ³,kž1Z–e³ K˘ËœóKœóKD´ĴSi’$jâۑği U7U1ç8ët:V§Óñ=Ï[p]wğ8{žü­ßŭÄüĦ[n˙á˙úÇÇ˙âŸB\fŒ·,ëĵmÛKžç­A0‡#ÇqÒ$IÄp80M6:ĤìÖŒ1´,‹yžg{žç:ŽëÏw-ޏİ|=6LĠ i—n·-ZŞíÏ&‘ÍĈ£µĵٚ‘ĠÔVkÜËÈ ËŞŜMÈs-¨<÷- *úÛa+şL?Î,N˜ƒĤ~2ê_J" ‰—‡Ħ•=ŠrgêÒbG·`œċ*´4·MbB!XĈfôÀ„ĈyQMsÒòiâ†fÎhˆżieĤÔŜƒ֊ŒAI•÷sïl‚-·="Ù ˙ cĦmہëşïû”2&"&D5Ŭ{­ëŽÖɸ0ó1ß÷ıëşĵÓéĜNÇ ‚ }żkÛöÛĥmÛŜlYÖ&ż;·ùŜ÷~ôµû[?˙˙Ÿç˙ĉWÑRJQŻ×“ƒÁ@%I" n%f0·\ÏQÒÛ1BZSmYïġzžçy=×u7Y–µwqï ÷m:üà;Î*Ĉ7üÜÇŬúŽ'8˙/?ŝWú½4´,ëĴmÛçÇYò¤iˆN§…Ep|lĈÙXAvo,7fÙ`Y ”P dŜ:ƒa~|àp@-B)Ŭ6”ŽœdÑ}•Ĉی?ѐûµ÷Ǣö|M6¨u¨éJ8RÓĉĠ&?+ĵé_~­TĦ 75 rĉïx,ŒĥlÛíüÍ˙²*ĵ$„è+"D”Œ1ÇħȲÌuI¨×È•‡Ŝ\[|ßçï[aÚAxA„:"š·m{ѲĴ­ĥmoílXÜßû>zxÛ­l9!ŝ\'ĉŭÂÍÎ.*Àĥmáy^†ĦF”eYFÌ8£l(Áġ%]·€Ô­FL‡ÑĵÛí:A„ën°,kğmÛ7Ŝŭ‹żúsÀ-’IPŠ€uĉŬ…÷>upË£ïÛwá_dĈ-ìKċ)EĴŒl¸İRv&‰'’,é¸sCp6lwnÂ-ÛaÎ=YĜ v· ȐÀò‚ġ@J%0Ž 2½°s%òŽıAN³ġjà"£âĞ…f°„µÑt4ÁğÍݍúC#˘Se€ŞŞ™› ,smŞTB IŠ6nğİż÷Ü_úS˘3)"fŒ1ÉËQ ˘LÓT*&éˆ2ŝo]_lÛfœóˆÂ0ô0 \×í9޳ÁĥíĥmoáœoÛ¸}÷÷ĵççïŜvó=›–Rd_:1‚/ĊÀĜ~°wöÜ­ïßrñ‡‘”ràyŜ°×ë£ÑH-//§-ÇĜF/Ö™ë1J²s0Zk'Ó\à™ëşV†n†]Çq6Ûĥ½{÷}?°í–Û6JR‘'/ŬÉ´ç…v÷ñŸß{ĝ‘÷îZúöWΜĝë?ŭáâùW,Ë:'„8Ёér§Óé‡Ñh4Šûŭ~’ĤİŒXÀúêÖU,Ç9/Žß°Óív7u:AìÛ}Ëmwäŭ—wEnÇ~f%ƒA˘ó ‘!Ġ²˜ÍÚ°RtMèŬ3-‡D­…é†ZĤĈ/³Ú 2ÁÈ쇣;2üı^Ì9Z˜çŒˆ²Ï҉WáÒĞG òUH.ž­Š!ġ,žĝĥ5ÚÈ ²9.ôm?QFDB)%‰ŞÊ…J)U\÷HvqĈ‹ïQqf3ŽrDf# +’Ë]µ´Ä^Ġ+èŸWèŸPä$ÀÎYŝĤíÛ{,Ŝpt·s}‚€ÛLÏ V(ċÔ!(Vµ‰Wc^†Ô@“Dvcy­”mµ'6vX|”ÊyĵÒn ħܒŽhó‡RA\@ ‹[vùêŭ˙ÁàK˙3cç^UŒ1`ŒçœQ€Ì²LjħƒiĊ Üe¨ö6ގi bNÇö}ß ó}?t]wŜqœ Žl´,k‹mÛÛĥìÙÓ=ïù›ößıpa¤Ï^Á‹bH„ÌAWlëĝpzËáƒ[V²„¸ìşîŞçy£N§“%I˘ ƒÉÀ0÷áğóH×;e‡ë#VL"Nwt½Ŭ²Ĵ}·}ä·Kp69ŬCUcħ%=izĥ˽‡ß³óžGŜ½}ġGßıpôO˙çNżbÛöYÇqÎı{ÑuŬËa.w:Ñ`0ˆG£QE‘RŞ–<ÓZRŒ¸çyV†^·ÛíuğŬÍaîò}˙÷Üw߇ïŸÜħÌŝÜŞ€8Uyk#ïXċ"ˆòĊÀÌ;T Öj_Ô:ŬŞEB5iŜ5%×MŞXKV9 ´QÓ[ ¨hK'OÀĊ#?K/<ŭ“GÁ¤›Çm·ĝŠï%Ë V”‰R*–2KIP"#2”`$@ğd€.LÖğOjîBġ† µ‚ ‘éGD‹1ĈccÌñġÏ9Ĉ\f1ײȓêrgxzic|êùıS_p€Nó›ĴŜŜ›`aß-0·s/p/%ó(YNwċ8„ …Ş÷¤RT÷ċ›ÚĈŭ "£µrFÙÀ–|ŝ™bñUBÑ•!ĠäöĊ ìZ P&Ħż"a·Éĵï÷ôĝ?rvĉe`ŒcL!˘äœÓp8”iš* JmùŸu]›ĥm3×uıëşv§Óq´P!t]wÎuŬ…""²,kǎƒ·ş÷=?ëüžCNġüы}xi9•)‰Èżİ€Y†2ƒıŬ7Ù§/ÜŭÈöôëg,ËZòğr앗lÛ>cÛöY×u/¸ğìûŝJEÑhġûŭ4ŽLABˆĥž+“lG°Œ:Žßív{½^oSğ|ßßûcO<üžßĝ[/I†ÏŻf)0úÚT”HA­zX3£5x“r1˙vš‘iÍ œÖ‘0o‘0‚ħJ,³á_!J(^ħ<ú!ĈsÄĉš’B)ˆ‹gáµççžŭ.Ĵ;nԏ{3\tìË{<û÷:ËRʑ"’i"™()eŞ”J”B)•I)3”Ô€$U>$äEÉiŭ€Ş%“ġE˜JPbù˘ŝÄÒ7›sn1ĈÎısmÛözŒù8÷,žu²a²Ĝĉµ-—~ĝ7sÇÁ D¸Áéíż 6Ŭ|ĉ·ïĊ €e1 Iy_,È-v@cüĠÚb5½żRkÔĠ¤ìšéCcƒ„:2*£ZM-š›nPËĥjá" CàŠ ƒa$ ×›³‡Oŝï`_ùŸ9{íEDDÒô!˘ ”Ĥ)I)kÊÔFtÔz]Z–Ċ\×ċaZA¸ˆ:ëÎÙĥ½¨#˘­ĥmoÛwûáÛïyâC7uĥïï[Nᯟ[†/Ē€("JSe$t< În}pëĈÁ‘Ûlyú‚8ĞaŽŠ†·Y–5YM¤ëVàvˆÖÊ0ƒŞsÂ0ì¸ğhYÖöÎÂÂÁÛ>ĝ ûV„‚UĦt‹e*ĠSJï:ÍéıšJè3Ÿ16ë½ożċžw^|ĉŽc_ĝO?Yzñı,Ë:­é˘çyKAĴ„a8 Ñh4ʒ$I’H LmŸ§vܜsËqğÛíú½^݈Œöxžwàŝ|äÑÇ>ŭëÏe„/öEž3‘ı˜*Tb5?²Ĥ€4“J5ß³ĉ ´ ĤJ‰aBKulìžË8N•"Ĉ˜ÒÏéŞrùç˜ÓpgNÀÙç~gômHNó­.zî½ç,½e)e_1ŠqDRĈBˆDJ™!2)e*Ìd>2)$")T”QñSƒQM¸ħċ]•˙ĉœ3DäzĜœsnY–Ís,Ër8çmÛ.çÜçœûm]ÎCÛĥ;2MϝßzáÙŻ.÷çBo×AíŽû!Ĝ´ Àġsħ!Ï;f1 T 2ceĞQZdD-`4 ·5ġĞJĵÈ ŒqüÂEcŽbĠ ĠĦŞ$‡Œ0 Ȇĉğ|ôžßıżôż08ŝ,!˘BÄÂ’4(™×œš@†Ħïy^×óĵ9Çq,ËÚdÛö6Ûĥ·8üw=ŝÁŭöĈcË |çıËê # ,7P‰(_›€Ñ,"@?U°°¸€'.>|èÜЎ,ığAÇħH’D !ÌŻŞ™˙˘)yY„ôEGĴiX–Ċ=ϳut´Áqœ­ŽìûŸyhÛħż½œ•Q‘’…Ò,#ó>Xhôƒ)Jô/'lĈ°wó]‹wÜ|×;FG_¸ŭĜŝôĊóÏ|ï9ÛĥOÙĥ}Îqœ‹žç]ò}5Š˘Áp8Œâ8N‡ĦHÓT !ÚrILÓt–8vŻ×ó{½Ŝ|·ÛŬ†ánß÷<öÉO?ùG~qïk‰Ä£ 4üğRyKq§(z éœ%A@R• y˘€Ħ½ĥ§Ĥ[ğC-W ëVèT܁\u†:İ@ s‘B‘ß1,8 'żû5XúÉϟN\²³œġSY–­!ƒĠh(„ !"!DĴo‰Ĥ?R)BˆÂ†İ@ 'žŝœùΗAžz5]´qù`7öèÇ>yéHÂé‘V&JQuRÊ˘MC2Ŭ0ĥĖí Ú]fhÂ/Ú#-U~AӘžpˆˆˆ,_4-ž·bpñÈKê7ËÏ~Gġ’ŝêÎıŜéÎbç„b)F+£,ëgYÖOÓt”Ĥé(˲8MÓXQށHhĞ%iäÖħV'Ñ+µŒ8‘ˆPQ yé(*çöòáè›çşoÛvà8NhÛvÇqœ‹–5·5JWžğxÉ˙íĉdó -·=½]œH"pŽ ”² Í)>*¨,šd;Ùµ›&À·i”JXï2ËôĈ5YKXÑt Á 0b˜GGÇó}!0†`1 TŠ@$ |—ħ÷üĉ½ç˙ü˙žÁk?‘ރ`, O9çèş.Ó9"'Ï÷ŭžçy=ÇqŠˆh{Ĝ›ÛŭÈž:|ó}ïÜ.-ßze)WO­Bœ°$Á‚U,Ëó[PĴ-y- İ$,ßR°IX–T:(F'ĜîÛŬóŭXÌ~pÎqœËA z½^’$‰ m5m9ë.Jş.iJĜ5Ċ žçÙaúN§çşîFÛĥwì÷Áğ·Ŝxpî(ìÈÀE€!x ÀĠ’•\ĵbŒşÚŬ‘abšfˆ›ŭ;žúôĦÛß÷Ħ}/íK§žŭ³Ï}7^˲ìœmÛ\×]òpÁÁ<:²p‚ŒĊĝŠ‹úÒRNHEİĈÂŜ÷–ü ·<ŝŬGñċS?úÓ?üŝhċòqÛĥÏÛĥ}Áóĵ%ÏóV}ßĊqœ)Èu]ŻÛín p‡ïû7Ŝ|˙C~ĝ×ëÖË µĦÌ+܉€7bwĤUĤB˘a#DC£ŠFwc њÔËX?#˘ 9#Ĵ˘"÷† ƒz™Ûġè˜ ’Ëçàô÷żÇżöW`=Ŝßħaħw<˲‹£ŝêċ4MW’$)€h”$ID‰‚Šƒµ[TŻU#öĤPvi]N# XPI’Ä–eY… ÂuŬ"j \×ġ]×í:ŽÓs]÷Ô˘ĵ²-Š7.˙èҍǟ˙öVvàÛmï,Z Q€Ä@Iġm ĠkĊĤ•‹pM˘ilR°1äêŭ\m§IÄŞkhġkµb9Ušâ˘Ïç‡\ȄΈHÂÖĊ9?ò{żöı˙>³'ŠH‰qÎ/gY–2Ĉ÷}WŻsë.èĊm·íĜ˙äSżt÷ ·Ŭ³0È^YIáÔÊD’‹ˆ\Êiò*͈5À-׎ÀŽŒQ ´ †QĞ‘)(`° doâŻú·Ŭğ/úÚkë^ò}5‚(Š˘LGûd(›i‹&]QÒ5HW ó3èZßóĵ9Ïó6Ùĥ½óĥìùM[½g†”,:‘*è<2r49 Ê*Á” Ôëx*ѕrë~,AèuĴO|pÏMgçÑoŭÜ÷˙è÷ż?XştdHÁħÁ°Jü€zsS%¸ö̍²DŽ ~ôŠĉ5Ô²îKE ¤‚8–0ˆĴ 3XZM!  D°8ĝ=—ĉoڽ͕'.xž·†á0Š˘$Ë2i”4AİmÎ]2ë1BZë‚eÀÇ)¸àŽïû‹ëî˜ßşíà­ïŭ󙂁ÈU.J*1" òˆˆk0‚u‚Q[§>4{†ıġK_ ` Á6ßġğ·ïĝ[_{ĉûKßû˙ö—OżöŞ8³,ë‘✇ŽlÙyàĤÛ~ùŭ³{Sî°ƒ ¤¤²íA­“hğ&Ħ–Ú¤FËRÓ£ŒLލÂkšI9#jŠ=…˘Üş‡ñ\Ĉ \A|ŝ$œúîWáĝWŝŠ:ŭ Ë7-ÌżŒó“i4ş8L’$I–8^M’d˜$IBˆL!Z@¨­)›z@´VîèDHWÚ{ÚĈ ›à$„àY–qÇQ\×:޳êşîeÏóşş$áœëFg÷yŭ#ÉħŝsǞٓî½ğ›,+—X[J"LìVĞhŠuT‹m”%Ö`ÈP‚´]ĠCJ?ôxù˘Xİô  b PŞ<İH¤‘„›7{âc˙Ċğ_û÷˙äĵĜĥ}A)•0Ĉ,ÛĥçÇÙ´˙Öğ½ëOŬşmßMŬ•Há÷ÏÄpaĉ@$+ñR ”ĈHíħg4™R ™PeŞü7Ñ£9Mé9A8 V#$% Ċ!eàz]<êŬqÇíÑé—ÇıäyŜj§ÓiÓQ’é:ASŻ'˙9¤uDGSAIËĵ­N§ĝżÁuŬ-ĥmïşû“żv_àyü‡+YîÓĤ-G°Àbĵ°(){àud¸ÍnÑRUô‚‚ĦÌ ú·ĜîğĜ¸çÎ{Ÿ<ġÜ3ËO˙ñżûɅ£GN+cÌÛ°yËÎ_ŭ§˙ĠàwĴ“QB’Nj_ƒLİX›@£1VpħFĞo2ŠcĜ‰Òoh1e5-}òĊóÑÒY¸oÀñ/˙9ùKg/ß´aî%Ġ O£áĊ$I.éîŸĞ:"Š’$‰ѐ€zL]]­Üѕô¸şZQÒ4`ÒN<$5­'„YšĤ‰eY‘mÛC×užç-ëÛRNÑù]Ŝà¨8>Ü{öäsûÄ ÷u7şÀ_fÙ9è˜İ@˘‰gĤ*V/!,û@!ÔjŸ!WşbÑĤœŠ‚Y,ÙÄIÛ,óş$€­_[(Ħ@"@ìŬıǧŝŭGÏŝÑżêZV|ˆ2ÎısÎ{÷>öÁĜĵ÷@çÒPÀwOGpiĉġC@ eìʨlRl ÓLAšIH3 IĤ@H5uv0D°ÀĉŽĊÀµĝ‡HHÈ2$R@ŽÑâËÉK÷ô䑋žç-ùß÷˘(Іžç­ĈqĵìyŜċ H–öùƒÓgWyċǛçoÌĥwċ@œċ DkÓtí×O=z6ŭ ËBh)ƒšcĊLD,Kߊr_?†Ú‘PĉŽè…—A+ÜĥçPï˙żşmë†9~fÁó'†°  Lĉm@dFRĉÔ[œJHiŞŒ‚ài]"§ƒQ3ZâLGKœ²\S˜ç¨d#µp“{*şíŝíâé³şXv$IÇħ‡ÍynJÀ§FIO=ġÍéêXێÑu]Ç÷}/‚ïû›ÇÙ~£OŜ³y˙ŜOú˘Ĵ7RŠÀ†J¸€šœ&0ŒZiÊ×f£SZí×[ċ÷9È\‘e3K GÎY’BŞU€B·¤Â†?)Ġˆ|¨í2VlĠX…€Y)CġÒÙħœ€) 0ÄF€ sÙ0Cˆ—ÏÁ™Żŭ…\8ġ“ó Û7-F£WáÉápxf8.EQÔ/rDBˆT‘éü4ÀÈ%9ˆÔ£+ɽ‘.ÀW JÍ ˜\”š·BŒYi›$™Ĥİ;í8Ž‘ïû,ËFBˆ´CD·²t°z"ĜœÍ/ÎKa#"7&p;Mê̐ …ú&GUIAË•9#"Ò×&ÒUn£a•%%–ĴD%éù¨éÀ4Q°”e°2Dŝüùˆ2YV–)ˆiĤ ‰d˘ÎERĝ\ óEíİŞaŜ¤óÚ0ÇBˆmċpȄ„P18;˙ŽÍÉĞ7ıR^ʲìrƒ0 Ó,ËdšĤĤ•P›êà:_/Ĵ‘nšÑÑĥ ÛŬwÇ/üâUApQ( @íWGÀY> Ì DAu50Z{jaiíĞd÷Š\VÀTšÂ(hş’Ó4]ÙЍ”*˜İîÔm€ 4hşĥE„&tż?Ŝvœ´ŜîşîEß÷W0Œ Jğ!phŞîZeàŸûÜçİ(隤×!óÁv:?‚9Ïó6Ûĥ½Ž§~ùp~Áù~?÷ĞSRïLôäcċ’F  …PóÒ*vkS'Z­&W¤/ŞÒOLk¸•²ˆˆ*0*#=P”*İ<އ f{µN˘TÏaéğİʋBިĵHÛ:½Òn‚qÁ~˙§ğKawÑŝÚçVòC )L…Yá¨0ŒL@’WGZo­ÀÚRïi D݃{½€ÔFßİ5˘¤"Bâm‹D1Ĉ„İ”2#"…ˆÄ9ÇGé·ĥ-Ûí˘Xòŝ„Ĥ¨fâ˘\ÔżşËZžĥÙï*P2•ûbáŸ'sŠtà‚Ì ìŠ %3F•ÓĈÄ’Tç~tŝG™ŽÂÈo,ê{`TlêÈ´”*Iċ ¤İx{^.:*_”8€ \׆˽;éË·ûòĝĊœ^ úqO8ĴK~-Òµ!­Gĉ€Žnĵ]]ğ}qçî›ë=;NE E.b(&ˆ˘ÜôT>Q`ı˜çéÒ£Xúż•ÉH“Šk9`Zcù˘–„TMr­–9£2ÊAĤˆ”ˆr02şZƒÔ@# ĦC RfŜ‰Ĉh½šŞĉzh&&EFjBĊÒ-DŠÀçŜ#Ú_>ÛO˙Íi×uÏóÜ$I¸‰Hé‹JJޘ^O½ÑZâZ&àŞĉ’ÖéäÏÌ8|Ÿ-ËÛĥÑu]Ûó<_×ċôĝĝgwt÷ŬÒù‘U8=’z#£ûeĠŜŒ/Ĉ tÔ_ëXĴó˜X_> Ğ—dµ?EÔpEÑóóX P!(VİHHRI*!*¤tŜĤ(´Ġ&‚uj³˜·á 5€—9e“y(·ĜTj’Bé c™kF`¨ÊÚ/Ê Ú0ê'àuçáĠáí·ÜŸ:â8ÎĊ –u.)IÓT6י üš¤+”y×´=|àûŝœëş[ÇÙu×Ç?}·çĜxBğyKY-ü;NŒJ]¤—äa%mBҖ÷Ĥl…Ĉ<ŜM[\cÍŞÏŒú¤ŻI­5°PĤ£ ”ž/Vá Œ¨µ¨yżè…dÚ5ĠtdԈTŸÓn5Yì@ …ŽF9ƒHlò-8ùäŻíà—Ï]Ž<ğ*J)#"Š•R‰6U jnuw5££ġäŽ MšçÓ˘¤i›³60Z¸˘eY¤}ÜÜn·Ûét: Al½‰Ŭş˙Ħ'żüÊ*ıœĉ.á˜Óbm‰ĠĉF ĦPÍa­èµ9g¸ıj+Èí€×’á LTŠ ˆÁ¤DÈ2i&!Nsc•Ċ"êûŞ´!*Z]`˵;ĈPŒêĜU^cĊ6“ °˘r#Yˆ”„J”EN˜h ya¤Fi•¤ÌŬÑığwA>wĦÈ%Ċqi*‡Ħ„öbêİ2k%J²A0‚5.ĵ1aƒmۖïû~Ïó6şğmÇ÷Üĥ÷ŭ GFR@Š<R†,×ÛpBÌw\ŒXQó Şş$,½NŞ Üœµˆ+3NX—ȸŠË‰‹UdCFTS(êʨǣ"z"Sĵ /ü2gd|fġöÔġŞ½÷ĝ"“ż7BU_mIl³! (‘Ÿ·•ÁŽ9Ÿ½ú‘ß½Ċ˙ßŝ›Ññ˜ˆb"J•RÉh4J‹ŜC€çġDHW’/şZb†×+nX+bšf(<İHrbŝ•sŽ0ß÷흸ħÓél?pïC·Ŭû‘Ïìüŝ™!<{)iTíB 0YüšÑtT39΀,€TM¤Ê¨ħ²cVŭ¤2§áR Œéü°œâïä–=C`ş;ÀV^Ç 0júĠ7`ĤûyCíjŝ^o,ÍR%ċfTÙXħRċŒ d‚ƒïÛp<<ĵo!>vƒ+Ä%!Äċ0 ‡I’dY– ís×ĴÓż.×"ew%2ïBÈP˜"npg›8{òWo‹$àİ4·=)'ƒqêNaÄ5ĴìĠ‚e3°²Kĥ2İ:j$0Z×‡ĉ/h<ިĠ˙¨ŞcjÁ-+#z*À¨eä‹Ê\“–‚+3Òi{Ş)†hDFm‘`„4ŜS§ĥXQ]ĝşGÓ0°oĵġÊS˙îÎżùo†DQ 1dD”fYV€’šJӊb½pÛĴ…è Pxm­Ĝàm3ĊEdÔëġş½^oħÓéìÜqàĉ[˙ġßğé…ċ żu&•ĉ§Sf²^âb BŞŠŒòoĦŞ U+‘-Òó‹›Ĝeßd( Fq‚‹“œFäÑŞ~Ħ˘Ĥ Ğ Á°^Ĵ́Òûà ”&GüġF—TkÉAPï¸\{nŒ¨PË*İÁ(% BRݤ­Ż€”  M@oŸs2şŝŬÙ·NkŸğïûQ’$İásGĉ \ЇkŜˆÌ[ƒ‘A×qœÍŽì¸ċŭ?ßüÎŬÁúYnVXÊXòĴX­X Œ CĦ"£{e>“ `"šĵb4i94AŠĤ[`b.ä&hPD 0*sFUn‰t'XÒóu̟šÏ+)=jIÎB½ÌJ÷Ó3ŭêÑR ™rêF(€QJppÏn˙…üî½˙ß !˘ò6S!L%Z ]Iáëzî_­1I1iĦ›N^8‹ëNÔÀ(§ÓétşŬîb§ÓÙħ°yëïùÍ|çkçß8=ç׏ÌTëNYŠSs–× )˜ÄBsÑÖ?Àj1ÄŒŒz#‚4Ċy-(Şò@Ĵ \üPÇĉ÷óĤ› ó<ƒ\ĴT"Žo2ËGˆZç˙XÎÈĜì•÷ @Ş~ŻY 2T³ @HBIȄ&Ù2eĝ” RĊà\ïî-[’£‡yĉ‚ïû—;Î ŽTw .ŸÔaöš8\ĞĴ˜Ìè¨yŜ˘ëş[;öŬü_Ĝğ”J¸œÈ2?DjܑZAĤŠ„j>Ë/˘÷ŠÒYû²‡ĠAİuÀşx}™™lùPsG0l|”A¨†€ĦŒ”L°2ŬĠWi- —5ZNµ Êû&hĥ4eˋñpŞöQIİ\fŻ7TÁ›nïyòWß|á˙Q’,Š"‘eè†j4ŒÖ콖€áDDëUÙ]i$Ġ&ĠĊĈ3IÔ`ž3óïˆ1ĥm£ïûv·Û çĉĉ:ÎŽN··˙ŭżóÏz Î×_]…A$*_ •‚6;òÀPûĵQŭ£Ş6\Œ*7zĤ#ĉ˘è•(g'Rİ Mu”ĈY%F?KšMRŞ3–aÒ˘$†T &°Š˜ĊÔĵŽÑt-‘ċŞN×ċżk *•lNÛċ`”‰ÜAĤHĈ˘ĊòŬ‘€8e`›ñ„{ó“ ÇL7p%M’OúyMŜr@ş™÷˜_ëşv†ïûóënvg×­?˙‰ûŬn×~v%Ӌi}7§–$€´œŽùÂÍT PB@Pe—Ê"G„Ş~ÄıÛv-Ô*#€ĈĈ­Ĉ֊ŞĞ%F”Ħ–3 dËhGĠk”Š×¨)ñ¨Ê;ċï­jyĤ6—ïÂ/OMˆ! ñ×lI³¸–/O!Wıï‰MÑÒÙ§?kú.!˘R"jÄ'ŬĴ_ÈfFGoôïħ%Sî7됚ŻSžĈw0tz½^§×ë-„a¸# ½ö÷q6ï tl.$¨4Oĥ灲aĠÔpTt˙5ßŬ0nRĵE”Aግ „‚8yQj*sê\+ìXħiÔ;>by·zabE½“Á¨ ìuÎ ŠhÎè5İS.ñBù˜ÑPAOV}Ċê×,éŜHı°A‚”y””Šĵû´4{›Ç˘ 9•dÀËó‡VĊħ;BùêÏó.w:AšĤ‰˘)g-Qvë|}+£¤k-BZ·Ì›1Ĉ0t‹èÈóĵm ğ÷Ŝtèñ÷l=K •GŞy7@ž° 9}Ç _X" ÉR™Sĉ’ i&– £Ĉ""3šB#ÜG‚‰u=fù] –°TċŠÈIRM ¨'ÔT{TWà)h&`ëôCӛn,òipŒQ”Ĥ’Ê‹œ2#É`Έßġñ½jxùpĝ“oÇu—*2"bY– ¸òo¨ŻÑ›m>‰ˆ8 qÇ›QR3Bjŭl–eħ"2êvğ:Îö öŜ˙Ñ_zÇĥ;ï_ĝ҉œ\NADù…£2UşW›`ÄŠè„ŞCĦĉ2'ë“ğ­: J¤„„PUgf@UIµKe6feRÓtşÑt!V4êçĉ@„Ú-˘rǢMŒ1w››¨fá.ĠòDġÍé‹ĉi´ç”]Qş‘T”GF‚ ŞŒÌëLċ;Ŝh˜€pÌ;|(—‹KïŻA0ˆ˘(nñıcpËÀßR@úÜç>·žTLktdÈĵ7èèh÷½żôÙğ·ĝ +o9ÑX=[ZDLûJ'=ŭ+^+¨ÉwfĈÎÏTÒğŻ*ZjÉgSğјĠ-İ ÊHHQ½Î¨vßÌ™ı$ż!cU ”TT%+šĴ#–œ]}™Ì£%*Í_ÍpXĊϓ"ĤÛÏĵ˙³·şƒ~xâBàQ9'²ÊĊĤDKëÉÑO|Ö xc@kDN8 &R’ëò ì^Żöz½ùN§³5‚=·<úŜ½û#Ûżuz/œ‹A$yÜ­òm|UgFFC&„ħ&ŽĜ7ï ò5N¤ħ„d”‚”s`^oʌd*,iƒPÓô ħboˆ:UäŒÀÈċ"†ì úŒî´ 0‚– ›"SÀPR­ŜÈÈIŞÜŠHI*İóGTöHÊ$M£r‚ hsirîĉàLrä-â™sžç] pU·ii“ŻĠîü-’iŬёvóÂ0ìúżÉuŬ{î{]·Ŭ5˙Ü0ƒT‡½E˘ T]–AHÀAĞvÚŜ\ФAż™QP­7Kcı0 jĠš‘’ÙPĠTŻ™ŠgŻüëôç6ŭì”áĜ5˘ş°Ġ(ƒ}Ah¨ĞŜĜÈwÖK¤nfOÁÒL’ĤTôSÛş~ì˙ù}ŝàŸ÷µ•Żq Fs1¤FZµŻ&6 Úħ#3Ġ<ÒÌ) Èts Š2ĊŬġ ­íŞYôŞŒ‹|Ĵ4½ANk*¸İW%Ġ<ï,żP‰‚½[79Ż~wŜħá˙ûQAÛQĤ”J‰HŽF#%4w}Wr1]Ó`ÔN-ġyWrŭç}ß·şŬßëġ6tğŬ-AìÙ¸s÷íOüĈ?ĵçhÙ·Ï A$ ¤Py/#Y ]˜–h[…"êišaC£i¤T£aÑ(‘ŞħŜ[m‹~1ñr Ğ<THž’ ÀÉéşB¤˙µ()˙ûzŝȨ9ÂĉĈħŬÀÒ¤éšQ‘"“ĥ£ €ŒÈ¨pgP¤*0ҏM¤MĤ€$èβ„I”;Ĵ[ïKżUĥ;p”$IĤŞe=˜ìu÷³Hèş&A3@Ñĉİ~sšŞÛyëŸşż·eĞ÷eMĠé‹İj³ŝ¨9Sƒa U}R)éÓ Tˆ˜y”ÀƒĠKUuG¨ !š’¨i˙ˆ÷ìW^¨lÖE‘İ*›ĉn<R×j çulĜÚ~7–î,Uv:·#ß÷wı{à‘O˙ĉŬŬ‡ĉŝòè*œége2oÑ­Şú:ğèÏc,üTmŞ´.%Ë ‡†¤TeİĊĠ£Z‹cŞğ"H¨"#Ö çL0RBŻAħëÍä¤ô>™Ì™rn(7ÈHÓ´vĉŻŒŠûLÛ#I¨V{·Ï/eG/B,u:~’$Q’$b0Hhwo˜Ġ!­qñíúÇa…›·ïû‹ënßrM7ïĝħÍ/ µ•ĵjÖ Œ™‰Žm½Ĥ䕪9cÔéblÍżò(€é *+½ İ&…F 1™éX“ĵ†çžYÔjÖÉĉŽm, ĦİŸĞÊXU§‚Ĥ\8&~Ġ3êU"ݰáĜhÊŠ/§îËşT4Ħ/AŸz.Nj}ê5XZġŽ>ë|’(šË)T’$´÷i³ÛŻ]x×2(MvlnÔÚڗ#hÇ0 ŬıııN§ÓÙÁNÏóÜñä‡ŬsÏ£[||G/' Ež §ĵ $0Dp›NĜ`ĦêEy8Ê`8Ê ‰•ž³Şf“ófQkŜIż·U`Tċ–ê`¤);Œ°mƒXóĤ3#£BdDUħĞÑZBÑXRíꂑÉĞk@ŠünÇÂ{ŜŸxÁuċĊ,Ë.wğŬn˜Ì\‹ ‚u €ÏšIY˲˜çy</ 9m´ë_úì fċ¤üó`Ñ‘LiRWÈ9óĠ@ï ²BÍġ4^­AóDݏq0"ğrXPµ×µšëMz?˜ÒÏhÚëQY!˙UmWäŒJ„ *R*À ‹üĜh¨ğz’è§6…>;ġżsxŝs˙rà=žQ*,ú&‘”²íbŻ'‘yá]‹ Ô£i´\@1×u­N§tğŬPƒÑ×u÷ïżçĦïú'÷çÌž9?ÊŻ™X‰œ ³‚yƒ8'İi=Š FDħ,é)Ôf§ÍÎÁ?-0³"2 óTĴwĴEĴ|*MÉyŭPĈí€êy£*O$:£Ú4|³ÀÈ|Pİ|w'È8Ù;àßúÀñŭ3žç]LÓt% (Ž´ßï‹ óçg·’!hh£#ZeߎXï{ĥm÷ÇÙx;Ÿ¸c~ßÁŜOúYŜ—@*È§ħy@ë é֊ŒÚZ™›—`A™!Aik_üA NR|7!‡$ 2ÌV‹âÖÚßR'ÚÖµŸ‡ñȨ~Ŭn¤VY3#ց¨&p(ꔌí<çL!$ÊPJI„~*a{·gżöŜżûĤ?üïú…êNߤB ‡CBˆ­ċ^pM‚R MĤf#>4Á¨Ûí.A°óĵŭÛnĵéżü›·˙ĝBŠß>ċyT•‰qmRZ(Û”Re°ÚÏtIadhĝ™IŝŸ6µm˘ +h:„’Ò+Ê7ŠSĈĴÁĈĤ°|C Ĥk·Ħ²k„/?0`ĵä3!!è9pĤwçŽmñËğ,!Nzž×q]wÙó<EÓQÒZÑ[Rך¨ĦġqÎ9³m›[–ċX–Ĝ;COŬr1Sp.+Z'çm‰›ßġÔȈ&EPkœ7‰Ç˘ĉÂŻê }!—Ċ Mŭjµ z ”ÄHŞğ…*š´ġ£òȨV0E• ġXô—*Ċ ĜȐ+¨Y³„9­'I÷aİ"D€şO ÂìŬ½3xġ½żùÄĈ?ûżEZäPÈYIJIq“Ĉ$j‰’&ċ“)‘0jŝd“è:˲Ĵ0 í^ŻtğŬ Als]wïÜĈÍ·½û?û‡˙ĉı!¤‘™ÈlOGÌiTHSĞF‘(ó˜eß Eġ‚Ĉçï[FÍ'…ñhDNhĜ a£ĥŽ.ȵIŻT™·pi?02´TÔ£$‰¸Ŭ}ïĝËÏ2ĈÇqlÎ9_#ʆ·úş¸Öëré*2Ĉ8"ڜs{˙Gùž¨ğèˆ|ÂI –JÈħÛôȈ&>Ĝö ÑĜġcŜ—P({ ·ë ĴjTċŒZìï›ÇµÈ¨ċÊİ×ÑôöëÓ.2ÄŞ;UTI™s2ÌrÇf–wk†X¤”¤H0ĥĵµwiċ“OÌ}ċKŠÚ$) ŭ ŽTÓwĠa,JkŒş[Ğ­ùX„dY ‚ èt:óanóyî{Ù½ñ [wĈħ”eâX’_A[zd|NĴ11¨}Ġ>§ÚÛ0€jÔÑ8MCÍ15]í˜hbÉQIÓÉÉ×Ċ$£6cZóX•İœĊê#ÚkWɚ&ġKÚ@XIa`)Š ëqHî˙lġÒî‹ßN‰(“R âğ$IDK.İͰôšPŜ½Eĉ8ŽeÈğ7úżÛuŬ›îû…O?ħġ֋ŸeŽ/§  xœÏD˘`%ÎÛ}3Ĵz .4­"$*KhlŞ‘Ùë£ĥ÷W5z~p\`T §1CÊЖѵ T˙¤/~ĝİïĊ·nßùžË˙f4ʊZ$ZŒŜòq­FHĜ¤$IDÇħmÛ˜ó3Ŭ³ÇԉVWNœ9ñ‘':;n<ÜòYeƒşĦ¤Ŝ@dÔÌ+‰&íh&½ĤْĦ5£µĝ„ Ûà ib^lzΨġ°iʅÑNéÉJI é;Ĵç•J·ċ2'a€jÇu•ç2˜Bİ\–Œ0ÌÌ;^|÷§oïö/¸§^Ž‹˘Ù˜’$iûĠ¤oŜ"‘(êZ)§Ûíz½^݆áĤ vığ˙ĉw<ùÈÁwüÜŽŻžÀ ËIŝ˘™ä0…K‘È%ˆ`1Ŭ‚Ğ˘k4˘xT-›'ÓÉş¤µ?0˘‰Á5F€\PŜ™˜€l H% N~’Ÿ|6Ӆó7Ŭ´ŭ‹Jd?‰ĝ|Eŭ(Š’öŻ•ÈèzĦìÊÇħ‡ cĴçˆÈrTğ†ĞKKŭKıë‘{ïY6³XYàYtŞ,ê_Š|Çĝ|™Ò8Ż-:XŒ¨5Òi<‡ZmSs:ܸšúûZd4ċxh­œQó2iy-Rç‘Pó2=×İÒ.VÁRA9 RŜ{Jê. œž† ózĦ`Ul ŝړżùâŸŝˑ{átŞċà’ˆ$))%MQŜLî3ôS× FċÍu]Ë÷}ğÓ鄝NgĦwożéĥûïê³7?}1Áï_ˆ@Eâ‘5H!,d`ħ\ÚmOŜψêmjUí GF†_Û Œ"5ó4˘"€Èó, ΀†g =òE€ßÊnŬŜ{acoË÷Ò49š$ɉápxq8ö£(Êâ8V-9ÖY„´ŽQ;iB""ÁK”R! !”ïû™"î‰cĝf˙ĥ#§ŽŬıóħ÷úí{€9(!kWqqTŽ6Ôş‡&Xc§˘Úµ&߸ú­nŞJëŠ\T˅LmT[D›2Ġ¨ŒhŸ­jĆ €ÀÒÔh5“éè\ —ÖC•]³[äEÇş•T0PRĉĞñr$aÛĤÎİ'~[ŝô˙:(\”R™”’¤”ƒŒ÷ ZSżzhL–w3˲ š£ċŬÛ=Ïû˙³÷gA²eYvĥö9çŜëcDĵxósfeVeVVeÍĠ5vWWc" ’"¤(‚MĝIżú ?ĝ™Éd"5Q4™l4=£ğntuWVfM9Ïùĉ)wżÓĥ>Î9ׯ{ĝñŜË̗¨v³xá1<;œuöÚkŻġè‰ ?÷ ÷}á•]CxiŒÉHc|ğ„Ĵ :B@ DxEÑÔ 1ĞÚhÍòqk”bZsP%ŭ}€`¸mòRTP')Â^}Ġ+żíòâÎ'Ÿ<û'äìëyžżW–ċċÉdr½(ŠÛ“ɤÈó\‡ĝĈú´ä?¤Uĵ~ í\žçĈSi­QU÷û}ÛëġÊn·›gZÏ×wn|ċêç~âág>KjóD(m‚ĴiÚ.Ëz@KÏUKÚ½šÚ["Ÿ[Z™›™×ı„/\˘ì(—ŭİ€Š×Vií6šI*^Ĉk$jĈƒ2¸FH­^ÑċYä¨ÂĵÙ¸´8˙È£Ğßú_çĝoŭ_òJµµÖ…·urv.ÌÒ3yDÇí;ĦĤÑ:ywÜğ£˘î‘ŝĈĉÓßù{˙ĝk—MĤ~íÛ¸zğ‚ktĴCĤéçŒDÛŜU{~„a6–ğċĦĜ†z#Ġ?£{F4w?µS‰@‰IJ=eÇĉ6ê×ö­?°OžÌŜ:}öÌóu]½[–ċ<ÏŻĉy~s2™ìçy>İŞŞ2ĈİCĴ:HĞŞ¤f-³Öş˘(´1†êşWUĊUU™ŞŞLŻ×ĞŒ1ùFUî™ñΧ_}çµO^ĝúwÓáù‡@I6'§Âœ°`Ióe\xġ}²žf[œıìfäy:ì=£6µg´ìĈáE7üœRüş Ù9ŭ"OŸR³ÌʜŸIšŜĜí~mˆQ‚"oĊ$$lÛpŒÊ%;È °ùäg·÷öŝ½ïl|ïjÇUXk­%"F‹şsn(-˘ò>PÖnA•´LU'1UÔ%á°×ï÷·z½ŜÙN§óP–eO~÷?ù'ßıĥğ˙nâĈ^ YôJ” RDK h™3•kµNw{ÓċfĉPbğ?£ Œ@†NĴ )½Ĵ[8˜/Ħ~í·0Ü{}ôİGϽ á^›L&ïEq%TE;“Éd”çyĦµ­µ­ÑĈûħ2ş_iŻàMkmĴµdŒÉ1\×µ­ëşÖZ—ZëĵkÌè\1şvcçĈçn}é;'ĝäӐƒc IĦR FİlOĉŻ›u4Ŭ²²a‘ï`Kİ0>BÏèàÏĴŽ_ 0ó˙ĵ€WFK*MṴ̂P“ÊD3ƒżDÜTQbÁÉ'bˆ–{:„ Ca 3&ÖaC Èç{ĦÚżñµìU…ÁYœ³ÌÌÖZÎó|Y4ûŭa6w$ñŽòîápĜ‡ƒÁàT”wo˙ƒïŽŽ=<ü§ŻìâĈ^…Ä1şÀÀˆĤ=£ûí¸I: v7u$ˆŽ!1dž*éÏÀè.ÀˆÜO-I?,ÒP°û¨ßĝĜ7~ß=şÁïŸüüóeYŸOĞ˘Û“Éd/ÏóI]ו1Ĉ8ç,V§*ßW•’úÑüç€pÎÙ`HZkÔuíêşÖu]WZë˘ĞuYä;:ß˙Ìkï½ñĝƒ_ŭ–êœş!RïP-)¸QS“7´tµvsÚ"ZŒ—_{‡‘vózF ïÙy; 5-݃ĊTË)–BpÁM3(ô%l\ÙÇMKr€Ĉ€Ġ‡ R“D½îĤUƒ„9H75œ0°_9l%ğßĝ›Ÿ”Ċî${ëGUè%k­5Ĉ¸ ÔÔ Ş$ħä†ŭ Áé°ĠQtYI’4îŬádw?ñÔ·˙â7:Ÿúêİ_{uoè:‡ŽÒT"q I"/jÒ"ÛĴoscÙv¸#7–86D(žĤœ.›cğç`´$Züß:0jĝê+’BI pğŻĦzċ7‘ŬüIŝهÏü(!~m<_,ŠâJžç7&“ÉNžç“˘(rcLmŒÑ­ŞÈauzò}S9ŬOÒaV”€ ğ€JkíÂĴRğZ÷ì{3+ݽ˙ıÎż³yîݧ!Ŝ›k~>r~翤 áĤĞ‹.ԕž‹Ë\ŒçnäĠÒï–TƒW˙ŝ}‡pƒXô³ĵ”ò ĥ-Ñ| v>ĠSA°ıYċ˘§ÑN£†J˘… dPĉ‘ƒd‚²ŒħqĜ'`Ğ“‰[ßüċçĥF˙í~víŭ:€’NAyg—TI´ Ÿ´.|¸ċ{i µg’àQ7 ':Î…4Mĝs_ŭòcßŭ˙ö[#ĵ~-Ç2RĝvC¨ŒâĤ[g“‰l[İĤnê^m™CÂİÎZ’‡?`0˘ċ€óħ#,£p½Çި“R€ÍĉÍ?BŭĈïòƒòڃŸ{ŞwGˆĊ^QQ­uµÖ!˘Ċ!Ä´,X;× šç~ó–ÉoÛp^,Ú7Ĵ`sdŒAQ0Ĉpȑ×u]Ĉ˜˘ĞġĝD‘ß.'ğϽ~ċ½‡úò×dvì,D’€ùĈ,Ç9Ċ4[DÁ­-p80êky>ĴŭB–W+S0š™!Ħéï'AÒìŠ^Ĝa íħDĠßiöb Ĝg„Yj9á5žuħhACĴœ8òA ÈL˘ŒIe°½ħ‘\˙ÎúġSżò_[FĴÖ9ç´ÖœçyD´„ÚهÑKZÛ;JÓT ‡tàĵûÔ#O|öıżñ÷ŸŭK½te‚uH….HQ‚¨pô==;ŸxÚ˘ĉÚ §Öy02.TFÍéI^Ż'0šù–Yï"ʔ§ë: ìŜ;¨_ŝu$W_(?÷À‰—;*{%ŸL.ĉy~%Ïó›ñx·(ŠqUUE]וµVˆ`ԎܲöÇa@éßz@úkíŻqpü^uÓó Ï-(眳Î9XkaŒħĈgŒÑa×Ph­óž}or:]}÷ò;Ÿ~ġ;ŭÓO<ÙB€Ó})ˆ¨Q‹-N˜]Fó7Ĝ"R÷m^T"ş5Ġ ÍÜì2ÜÀċÏ%DPCқn%MÇKB—Hß9†„$*²ˆ§ıÌ31`EȘ ŝx³}%@‘—“ dBPv(áMAOŸ9ŬıöŬ §ŝĊ˙ıpεé;J#ŬŞ”³N&}ħĥw¤”’½^/ ŭáp¸ŬëġÎeYöÈĈ‰ÓÏ|í?úÇ_}iêÇÇèH%ċ<%-ÚòFr hš†HmÇ^RocœB#FFĉƒ#š;43ZÈ(¸5ßéûÂ4Uï|œÀ(ì²H@ )€TT£~ó_˘~wq·o>ò虌ŜŠËyž_›L&·ó<ß/Š"öŠjçœnUDvŬ)0ŭÌSvíiI•z|ĦaZĠÒ¤U)ĠZëÒ3éj=:“nÇ·?ûĈĊ/ĝK_j4H*Oׇá˨ôµKQċàuÍ zF‹¨żU•‘;âXU­Ìßì8?ÜQĦC "rnŞş£V—;0´ÁˆħÄ=}šÎçÜÌ"aQásoÈ "7ĤáíġJ†ÌÉ i¤uH?˜{ŝá§6}ŭo}gû÷˙etqˆrĞêP)ııëÌ-ĦŽ? 0šĦ뤔²×ë%ƒÁ 7£GŬŬŝà“ßúğ˙Ġ7ò0ûÁ]dá˜)HÇSÉ|£âr3‘kRM§QÛEÙÙPö›‰ŒZG†„ù›BĊ2Xk Ç ċ~£ùn@Ü$ÈàÚH$"M@İ„Û}Ġ›ż ñŝŸÖŸ>·ùĈFwû§E1ı˜çùĠÉdr#Ïó<ÏÇeY–AAWÏQŒÜ ¤ûy0vžËwKnäùžœspÎqxïĴµFkı1fÒ5oï÷ò½Oĵ}ġ½§7żò ½“<Jz_!%œµÓ‹gžZ5Tş¤g„5´Ŭ,0–Ú-@1R5’\¤pÎ"çU¨á&d2ëyê,L§Z·d·0‰gĉˆŬĜĵ’ŽôÄÀÓvÓ;“H*F›‡7Ç Ĵ‡$1˜}˙‰Zùíy%’Ħš„T4û~úçNínŭB÷ù^†¸ ÓŞ¤|Òü,}H7éÊÙ#)ìt:Iżßï‡ÍFiš>ñí˙èżüy½uaù7÷ÁıE ) d B¸9Öٵ§sÎEċœkÔs6‚‘eÀÈ|t`$”ï§° %ÁE sġ%ˆÎ1P÷ {8h3~ŸƒQ8Ë^ż @YâûF)Cż÷Ǩ^û-œÔWvžxüÔ V×ïŒF£+“ɤQ•eYTUU†ŞÈ´@hÙÛa@é#§êî7@Z”Q³Š²›ż‘ŝNk-8<´Ö6Pxe”‡÷ŒŸ-Ĉ7w÷o~îŬÏ|ŭÔŸù<‰á „°!í·ħ½Y+äy‡•5öA˜s9Xp3ıEĊÈôĝ "oĊ̐!ĤxûU\ŭ˙Ÿ;ç&ğû_ùËÇ6ŭ$İŝàhİ&/£EÀÈĵ†äÙÁÊĝ΁gî{JŝË8Àl½D™‚…ƒOÛ iTßĊBËµÊ "(éİV%ÀÉD@}ŭß}p<ñµÎËÜÄU:—­µ¤µ68hÂz”R”$ ²,B‘$‰)%ĉmŭƒÑ+œs\×µ#"ŞÊi­1gŬBË)˲´×ëeƒÁ`³ßïŸ ŠşÇżú7~ù‡={âŜ!Ÿht…ïùc<ħqm‘KĞ:òĠ`Ù5ŞıûŒ~ŝ†ß¤H%\Pżñ[poŝyĝÁo_yŻž˘~ Ĵ ŻÂ¸˙ÁÈĞè(Uˆ$¸ĵ‰ú…ßż÷oÌS'ğïžĝQYä—BŻ(*èĈeYĈ˜:x6šVżÈ†WUHóŠ;Ĵ§Ÿi·ï•žbK*$^ĵT|ÄEÁZ Lp-Œ1cÌx¨ßĜ|ïİ·Ŝó“gżŝĴ{ö@u ¤ _ëVvxMetvċ4ŬBK^X‘0OMIĉLD"`Š1nĵݰ}뽛[ı“~˙×òEqîĝ§žÔ?€…³4cÉż°g`Ŝb]/gÀè`لĪ[ñ²Möt0^ Ġ\"úM"Ĝ‰VDäé> ĤÀD8×QtŭÏ˙ò3ùxgÔy÷ċìçĴµ°Ö"ÏóJz6,„ ,Ë(IʲL¤i*“$QI’B)ô°9'‡…ß[k­ "[×µİëÚj­YkÍEQ8f&kmĵĥE§ÓQŬn7‡QŜĤéŸŝöŸûúc_ûsç˙è½1nïWè é&Ŝ÷ƒ§`[MçšĠİ€Á97é8‚>r0"%ŭÏK ê*"¸ñ ”?ù5Èwŝ¨úü§.vÓħċ^çĥŬÚKùŻÀ|È×GFÁŽA! E Ž€ıĝTŻŝ6'ïì?ġèé²ÑoÇKyž_Ç·ó<n µö0U‘[Qı@´tğüa+ì>R@j VVPwë@nĉÍûn² s)VkŬ“ÖzÒĠz|.ŬĜÙ½ŝÜÍÏûĝ…O}†0<’˘YXc‚ëŞÊh1ġµ&\oxġÍ<óyĜq1Ħ@ŝÖOQĵñ£úħ”n—eı#ĞK·N½kùµrôȉÏ|)Ħá)€ˆ\Sa5èÍÑ[2g„7ö ıƒŬ˜ĥ[ ݘ{² İU"ĥQ,&jb¨›ĜŠ ÒSÁ\×1À†qĦÛ—˙Êö%üŝë‰ğö~LšµÁŭXÔumˆÈeYFišŠn·+S˙išĤJİDJ™ !”"B("RD$‰9ß;ÇÌ.½š@ÖÖZmŒÑĦR×UUéşMUUĥ( gŒ3S–eI1ÄòG{îK_ŝòż÷wžzñz‰‹·*$š}rktÌ öi ×£kUF@#ßĥqž(ÒtĦ‡d`4oÏáĵÒL(!¸Ñ{(~+è_ûñä™GN½!ÀcŒzàö%û~rhrMœĉċöûee6S”úÁ9‘* ‘@½‹ê'żûĉïğǏİ÷N?|ú‡EQ\ n 7&“ÉnpéεÖuLHn™ë̓‘]S!pÂù³Òò*i2Ë Ĵ—c3³ˆ=˜cŒÑµÄŜÒx£vM1zĉÍwß|üüÏŭ|’žö´˜SŜM,:0š<£ƒĈŞlñÑĴƒğ ƒ˘J Ô£¸ĝo~çP_Ë'“wêşċœsIQ\=UŝĉÎġÉŝ³çŜÍNžTŞ52³wZÒ3ÂÁŠmħó„[IUFÀĠ€”ċ+@£['òħfi(Zï9$–…ï ß&bäHPÖ>rb;yçŻŝożÁ˙Ï˙Ó$VIĤ#cL%¤N§“dY–Ĥiš%I’I)ğJİLJÙ%˘LJÙ!˘ŒˆR!D@…$c9[ ùÊ(È΍svΕÌ\Ġ_aŒİŒ1…ÇŞŞëZWUeœs”$IÖï÷7ûŭŝù,Ë=ġ£ÏŭâßùÏ?óĉĜÑ7‹PYNÁßA‹7>íı†Ĥ›ğ:;u[ :@ÇÏ?h0Âb0˘ \N%D& /˙ċ‹ż‚““÷v½püĊŞÈocJ)eÚħ—Ĉ'Ç?Ùş"=NAİWî£#, é„ô×°$”1ì͗QżúèŬzyòÔC§Şà^F—ƒpávžçğÑm!€ÑQŞ"ğF€ûYܑÒ!ޤEŭ$wp[LÒZ[Çj)S¤-1yϘÉıñîµ·.}F|îÛÇN=ù D B*8ĵE?µŞˆC\Ĵú\ñùoolž{”vÁĈż(˘é+idñ0š 2ZˆÇ³7·ĥ^ÎHâğàfĉˆ|Rĥš+SFÔN˘…"MƒkàÉèú×ŝá/ş˙áżİC˙'ít:ğÖÚZ)%“$ɔR=T_JÙïBˆ˘ğuĉü‰­Ógĥ6Ï=´-R[gÎ3ÍÁùDéÚ³íòÈSï\|ûÖîċ÷n•ûğû̜[k'Ĉ˜qpŸtğŬI +k-+şY–ït:nÛŝÔ_û/ŝ÷?wͤÉ˗÷AÚB9ĝröÔ$QìÓñ´OÔòœóĠtÑm!XYnÀÈ|`„%`$]—IĊ¨ßúC”/ŝ*V“˧N _F—Š˘Ĝ1ĈÔI’tœsġÉw~½{ûİ˙ò‹eY(ˆß•…܏ Œ˘Jˆ-oŒš&ç¨ßü=˜·~ß=Ĝ­Ż=ĜÙ”eyq<èò<ߏÇûq(TÖĉ.€hQUä:]w?UH˄ ñÊmWIX…B|9OçžkİŒÖZcĵàAëɉşÜ­ó½gŜżúŝçżô %·Î@ÈÔÓJrZŜR˙ÌĞóxşeĤ!Ñb8bI&ŝ†o^•?ù#<ŞĝÍrT^Ç×Çñ-­uĤiĤµÎsġñ׿WŒêüó·?óó§Ž=ò P:ôö>ڞ3âu·Ĉ…‚$uúŬ9‰ÖŝQsnH—ùA‰vÔùÔrˆy Ô"\4L`ËxâÉO _û żüóĝ˙B Ò4Ŭ Ñ&2ĤRjÌ#Ÿ{ô™Ï>xáñ§Nnž:ġ6w •ÚĦ0ŒÚ243ĈşĊŝ8 O„'>wŞ£‰è+B]WvtûvuëâÛïĵqŭ˙íÑÍë7œsûÖÚ}cLÁ̎ˆ:Jݝnï‘żŝŝß'ÙOŜCWÂVğFèŻ f[[@äğ@×ގĤzeû€‘ÖP½4ì$*T/˙êŭş{j[5LҟŒÇK£ÑèzžçûĈÓétşX)Ġ;³÷'½Û˙â9€ÀÑê£ĥrŜĵ6&şÚ½·Pżŝ[HĵP~îáÓ/%”>/M&“k“Éäf˜+—eYZkuKν ˆĉAÈâàÌÑ20ş/ß9 13·šÂGùL›EÊ<ı¸ĜZ‹QàÚ4^ì-ġÉÏU“k7.}²˙_ô.<Št0³Xì\²R$°Ú›nñu0B"tK= šÁB·~ú<†{Wv…ÎßÍóüF”ŠÖu­•RÊZ['ìŞ˙֋•ŞòÏŜ,Ĉm?ñ ÉîHŒ™Ŝ„Bc…†iµçÖĥïïy­Cm,Ĝï–[ˆv5äw÷í~Ĝç\D;!âĥáĦżt„NĈ8tHâÉ/˙üİ×ön~yô½_?ĉœÛ`:½~÷s?˙Ŭǟ|î çNœ} /;=YĈH;\šì\Ż0ݍK„9ĥóžzhĝ'ï0k v`ëK޳ fÇ^7µ˙iġŒœƒµ³>tĥFÖúŻh`•tP(­Ž„ĞvQ½ĝà×~O?{fĝrûr££ÑhŻ(ŠÜZëŒ1•RJfY6Ĝşĝ{/_úıyé2ˆ.H†ÁY1;,ûá&½N—0.Ç0׿ŭöïá|2ñç~ZWċÛ£<żœçùġ@эʲ,â+3ÏWEĉ.Ş˘ö|ŬĦÀè£ŞŽî› 鈠%ş‹ŒFĒÊIjà13‡†2‡f·ü­µV™Ŭy]Ùúñ0Û>íş=‚pÖÓ\„K*ˆ£ÄŽÏWFퟝé ?ôZßş‚[?ù?.ì›UU]/ËòvY–ħ)j¤”z:F~.½V¨‹ÉÍbòÔħ§Ÿ“Ô? ™J8Ĥú—€c=M·(vKÀ(–Ĥ;/Âé·ĦaOmvçU….˙ ͗Ö_Ž"xú7ɴցĦÖI|ò—ŝŭó7ôž>qlK<ŭ…ŻlŸyôñ!%nW/ċğ·s”Ĉ&T@–Ħ(‚Q˜ûŠ k[“ĵá˙µµÁneQ……^0Ck‡Ûc‹½ oHÑÏdzêì§O<÷ÔçO|éŻŭòg½ö“Ŭ·ŝä÷o=öÔÓŭóOáĝ÷/qsŻnŝgŭıħ.ĥúÊÇ8Ìġ…Ú`?ĵF0âieÄ8µœš°9ÏİR/…+ŻĦ|ñŸ!yûOЧ/‘uġĈ(€Ñx<ŜŸL&y]×:ˆFlQŞÓéÜì”Ċĉ…?şòĈöwĉšÁRxİàG;ybé##ÌġC^ü×ġ§Ï&ûéñwó<k2™ĵ?M&“˘(&ahŜúÇħ:ZäĈ°Şt߁Ñ}EÙ”ĉíƒĉól–5í–UPñ˙G˜Maç´Ö&4IJ™I)‡—_ß+"ğıĈŜDá͛%ş™”§N?sü‹˙‹ÏOáǗ'xïZǀÉíÔê'Žs‘kOshùϵĉŒE+#ŻĤó?³0ƒënÁˆx6€Œàçn˜AJ‚ĵµDĤ`nâĊ˙›·_ŬêÁZùÛñĝòx<9÷ó<Ï˲ÔÑ$WÁeYNʲܭŞêĉò÷^ß:ó­³;%go'´Êˆġƒ#°çŠ?²ğ…OğµĠ)ö'“ɵ˘(ŽF£k{{{·Ê²‡ŞH3³^B‹”töŬaÄ ÷ Ŭo=¤€Ò"5^ÛÓ])-#ıĉ%3CkM^¸@"MÓNŻ×YkÇ ²Ÿúô³½7+‰ÊúĈùژ†CĎ/Qıۄ8ÖàŬ T"`öÖË/òÂĵU–ċµ²,wʲĠu]FGĝğ" ™P)yúÎÚúlŭ;ùµ|üĊÁgżÑW'ÎCP§Îĝ™ 8×2ĞĤ[7,Ì+yħ4Ö]s4Ç^ $¨–£ß+ôĤóH2Z…!¤ Ÿ%-aRĵ91xs§ıiBĊta#ÑÖÛHħġ‚€'´y_TûıiĥŽ FƒM5‚JÓûŭD)ÂD;ĵ5ÖxëfÖÎħܢߢ@ÁMZ[ĠŻ†Ú•Q Œ\›ĤóqîC£ĉâ#Hğ퍑˙Wpĥz‘óÇż—ç“÷ĈñċÑhts<ò|~2™ĵ7ŒÇ[£Ñhż,Ë2€3O%=Î9W×uĴ’öŞŞş9ĵĝŻ_~îëgF#Ò{'Ïğ™(ÜŒfV*FböÔÙĥ/+`̑ĦpɐäşĴWdP­óŞ[)^¸_Àè¤% „%Ŝ|•Ôö$GP,ôSJA)%”R‰R*;ġÙ/mU–Ħ&u˜ *E•Ñ˘D>·LÒ²LÀ0½·ı5%*•@ı{7~ò<öíş¨ŻWUµS–ċ~lÎ]Ĵ‘šl¨œâœLíœĞ·ßü~5.Ç_ÜĠżpnó'Hö6}p›`pí‚,œ—ħnĞiş*½öħqá{5(üß^ıá#6Ĵ=uég„ ä@Â7úùxÓô½§ETâħġÊ=A9E^Ŝäcfìç“Êè£`y:b´ôóŜr ñ ÂWHÁŜ§ħüqQÀQi·ċ)ı•fÄ   MJÂĞΘJT?ŭm˜ŸŝĤ}úD÷ĠA’ŝh2™ĵ7ŻŒF£Û£ÑhT–eiüÎo6™Y–IUU{UUŬî”ùĠS·˙ôú(ŭÜy@Û˘K?D0j­Vq›géÖ͓§7ċn˘”J’$‘RJ‘ @ğL°pĜêˆ×t Áˆ™ùŻ˙ġż~_­ŭ÷ĞıjœxÇ!úJ‹Ş%Ìġ•S!E£V@J)¤i*³,K“$é¤Ygä'ŸŬx+·~'1䛓ÎÚ­ é°‚Ĥkß+B"ò6$*ón“7~‚ìĉĊqjËw÷ÊòVY–{eYN´ÖePëÌĞkˆ™m¤ïZ’ b‡şñċ*ÑĊs·òo?ñȧDşyÂĞşÄÜ}½hJĴusG5!ĝ˜]3üż&ô‰ÒèÜÀĠˆ½ .€d@²&'Âz‘žd†àFŠ+nœ(TO 8‘ŠÀA“ıùGèıEĠñòXúp<ĜwÙEž5Ú`4oÌdœ§E›rSĝ3Ċ.TCĦZL.TFĉ’ÂÜŞhÑô}Ëz3)ÒÍÏM3ÔĵŞN‡ŭÜ 6q8zîÍ͝1O}£HÄ5•Q— "L1½5Zŝ°F˜ ‹"‡XĊá×&ÓÈĥbÇ­k¨şŒÚœn ‰!)ô­wPŝWżúñ':ùĵÓĠëÉäŭñx|u4ŬžL&yˆUĦrà×m¤ĠEè%ÉÀÜꔓëç÷xëġôÙÓ0sb’eĈÖE'XÀ tˆ°§Î8éO’bÖ)äşnIuä°^Ŝ}$áÂŭ F @:Bµ´L%ZLmÊÏ !8MSʲ,IÓ´›$ÉĜ'ž>YZ  ıÜ4ÛhV ·ŒÇâ4/¨Œĉ H„—K2F00&ïż \}Żî›òÍŭŞşUUĠ~¨ŽbNŠ[rÁ6aPàĝä]œ„µsN÷Ĵ­ż;ş\î˙ıoöäĈYL0£€k§3/#>,M·ä ĠA]×ÖS:”sA`çżzFàĤ"jW<ñs ƒ´^yÌS“ÖöûıôZ°?ÑÈ+ۄ`Ìf‘/#´Än6ŝgâ B^QO ĉÊp2|×*ĉsT×6ÄŝR¤ġšÊˆÄ„Ü µÊÚ8_|Á !@ ÑUW~Œâ…_ÁÉÉû·ä÷Ê˘xk2™\Ç×G£ÑNžç“²,+cŒafğ‚Ġh6›ÖZëş*ËrRUĠÖúf˙òżµù™Ÿ;µ{m(‘à2´PçÜ4>P0 ğK˙WŞÚBôON}üÁdï•4M;Ŭn7™L&T×ġ2gîe’îu†İğŞècHwP-ĦĠGr­~’[D §iŞ‚§Y/MÓÍc}jp³ĥŸbçJ™yšnEl|‰°ÈI›íâhÚ§LÂħµ}'ı¸µQUĠNUU£ŞŞŠı.·îĉffQU•³Öš÷ŬĤúĵŝ£üZ™™?óÍ­ŝıG@Şg€IÚZi÷7ݳ!fžÈWGĦuDÄ f¨X!y|ŠyÁú)ŒûvÖR\_ŻòÒ`T¸F’>ˆ§ĜÙ[¸ÖM):ĉY×ôĤP‰`ħĊ™'nÙEZw†Ŝsà´uOcçöĉñm†‘ĥK’„„ĈKûĈ‡£MUôħ¤ ´Ş·DXn&Ĝ>Ħó ĊJ)dY&³,˒$éÏ=p*;q*ğ´Snsñ’ÊèàµDÀ°ŒfsŭÍowŻ£ĵôŽ;óú¤o×u½×ގÚqĈ‹,ChîĉvÁÛÏE-•ltİfĉêÔÛZîêÉWöžŭùÓ³Bġ6àˆ@_Œxg´ÊTօy"'€Äúü#G€"żh AÁ$!Ñê q Œ˜gúB1*0‚ µ/$*í°;Ñ0abw‘|³ħ ˘YDÛB†g[‰ÍÚÈs½Ċù‚†îsÁc° כ‚Uğj²Ì3êğĥğ÷FĦz§È$Ô(_ŝ—¨üëîİmġúfÖ}q<żÀèĈd2ÙÏó<mm0ZH퍤 Œ1¨ŞŞ,Ër\UĠÖúV˙ê÷Żd§ŝŬae oı5´ì>40üĉ•¤D"2ìğRj˜$I?vJJ çÜüšÄkÖĴ+Áèc HóÙ3+[ïĞd‘Í[ÈżI’$é&I2<ùÜW0Žq; ;ùy^h”ÊKY•sFKÀˆgo_ˆÄçŬ|é‡Ĝ,ööŻĠu½zGEPÖÍ7ByÍ .ˆ¸S+ËÒĈ˘•´Ş7ß˙i•ÔĊn=ġ͇7ŭ”H[™kżJZžÓ")ɢq>Ä ŜDVÄžĵ¸A² vë)<‚ŞĈt6VH1ÚmžĈV´_§öĈ“ÊLĞĦÈE•сĈ6ĝΗĊ ‡§y”âó­Ì›‹$o÷ÜTÚŭÓtDJ€A¤”I°ŜCùÂo€_ù=ŭ™³?IÉŭ$€Ñ•8ZEdŬċÌëWŽkm]×UUUy]×#­ġn˙ҟħyáÏ=zÍÖ Nú×Ĉ=Œš&¤óÔĞéŸN&ĊÖ9Ê7’$ɲ,K”R¤µ^ğ&-#qEGüLÒ˘#>?RœL!’$‘İŻİ{RÊáħ§>½UFfÊú9^˜ÙÇkcÊׁQ;ÏĤŭ³.6ÄŜ[/á!2—Œ1·ëşŜ 7d9çìVì8Û)Jìœs!h×Ċ“µV;çLÏÏÔĊäj=ùԉÏH5< !%Œ <™:,½SÖt‹À¨M‡jĉ`açĵû‚ÛĉP ‰Ĥo4GħÍġ…­CEiħ;޽he)ߪŒV€ÏŭĵdᣤóĴâĴryJEZ/*öb…äÂĉàžÏ5`ÔvUBxK[ÑU ¸ü ʟü’·˙¤xĉÏÔŻÇ“÷&“É•Ñht;8Z—ÑÑĞċÌĞWéï%gêş.ŞŞ×u½ÓÑġÍc£—nßè>}Š…ƒ+k°5.Í|ƒvrp;ċħógÔÍAšĤŬHëÓZ <3mEkèŸİìîâ9 ĝ,š):üQJu]GJÙO³Îf˙Çúoĉ& %Ĉ˜hžëŻğÑƒÑşžĉŝĤD07.BÜşŞ‡ĥz{żwêşUU5Y²*e&Z;ÏĜ0ĉî!q×:çtŸßŻÏëßÎ/çÏŸŝrF›§!²l˜ìÔùĜŜ{0Šc}eäà}Ú$¨™›P†DˆOZ/§ù}ûûEiZĠÉâġ강ÑüŸI‘·k…ä66I-Œŭwš;nqÙkÏ%{[£8˙ÉÍÓ=w`˜£&jÜżp‘ùtWğ˙òç˙)6o½ş÷ɇNŝI]oL&“‹ñĝÚx<=™LFEQ!ŭt‘ÌyQd]×^\Ik­ëş×u½ŻµŜé^üw6žúüİŬr˙ ›˙aQtĤp”Çëožb ”ê%I’iŞ„Ԣ햭q‹Ú‹f5ħ€š?Š×­ğ?3ñsùGGİlû5Zp"çߖ–”R1C'I’ŝħO>{ÁI%–ċÔ?͸ĉnM/bşn,Ĉ—­˜Eš_èb 9†T¸ġÚKĜ2ùÖ:VG£ŞŞ*cÌĵ÷Ġ˘]'–Ÿĥ+şk-Â,0²mŜ…ú_N“/%ÏŝÜ 9qBtÀp qKÀˆWeÁ/‰wŸYX]³:f(LÍÁ%Ĥ˘Á|À\³Mş@‡ċĊŝ^zƒî ä€ÑLİunÇ nUtmjħž¸PÉúKŝğċÙ\w F zĥÀHL5†” ’} }ùäÏ˙ ÎĠ×o{mÇ>ÁTè°ĜhŽä[X¸ğ°*‰Í sŒ/‰GÉĵgŒı­µĠu]cê57ù2@Bğ2ÂĴ ;çXkÉµš™ġı7˙°ĵQO’úÛŬCt‰§pšE|È­ş³—ŭíKÀ¨ŭ½&|Á€ +ƒX ıt­hOiíïW¨ ğöµÜk0ŠŻƒ›ŸYʍ6BĝU.Sá/ï˘Ŝ aŒ$5 *z‰ż&‹êµ…ò‡˙œïê÷Nžŝéd2yw<_Ç7ĈñNËğÍ,ıN—‰p–ÒÌóĈç—u]O´ÖûĈ˜ŝÎOow‡ßê;9Ĝ1HJœœğ'`$B†ÁÉ{<òÊN/2 nñRzç‘ÒÀe[bT;×QE?I’nšĤ‰”rĠšÔóë\T%aMĠ„£Ô N4 ÑŞ™£‚â÷ĥO(-ĝĵŭ<„"I•$IŞ”ê !66ùİ´ÑçÌĞıY1ñ ĦĠïµs‹ ğ´l9DŸ.ìġµ‹·V]S]ÜĞëŭşÇUUZë‡èì@ZFƒ,ȏrÎħ1&ĈÀµít^éÄ;ÏWûġĝKğOëÜÜ$ğ›,`Ï%ħ .̋Уğ£}ĥpÌ­[ÍʗÁhżöîŬ-Ş $ŬğĠñĵ˜OüàÀ(,ş"ġóElsTŻüôŬ>}²ûê IÀèòx<1v‹˘ÈC*ó˘9wz™ĉéş³pÎQíĠ y¤ŬÎċĵsìóßıPî;‚’>ĵï@cîÁ¨™q £Ñü8$ƒ$‹Ĉ薂{ˆèŸÂ~Ŭ?Ŭ—²/ì&I’%I˘Š˘¨ÖlžÛ4Ğŭ=—UD´fĊYEù-'ŝ¸ÒQˆŽ2‡)Zr!‹%`$‰$IR)eGJÙKÒl£{ŝĦŜWjŠò`jfW\kqàpÑ.ìÄğÁĞ™¸0 )!0z˙ul™bOk½£µŜŻë:Żëş $ËĤ× ÈÎ+‚Rè)…]k{œÓKŻÔ™.ŸğZäo=ú´ ŝ6ÈXìšnXŬšŸCğµQŞ²Qï>#¸Ċ=Ċ Œâ WŞ|0dWë[(üëàWż~îüö…Ó/µÄ 7'“É~ÈŞç\­Í!Ş£\§3›*k­İ뺪ë:×ZïwĈ7Ż ëĞùôú á}ëÖGÓE0‚ü5dñİsR$bÏjdŜġÄq§œšéúÜ&B³‡#v‹WlzJìż÷6%û1f×3ŞëşZGN~fĥƒW€RóZshÀ"(ñlÛnè|]äWÊÉ3ŭ'>ĞÔĈi€d*`k{pRŒ.À ħûQYhŒGÚSw÷ ŒÚêƒ1Ög0j9ú ?ìJB€ş\q ċ~ÙĊLžyä÷m]½>ÉówÇñµàI7*˲ZWAĵpĜH…U# bÁ‚h[€d½ĥĦ΍1#kí^wïÍŭŜà ŭÉ~ vf6=ÍŒbóoŒàßûJi:dàa $Á … ÷$ä@JÙSJeJİD!œsËċŜóüˤßĵb•YVġĴ2˜#:D%vßŬ-Ü `a Ks@?–D’$‰R*Bt…ƒíÇ?yZJj9ÎĜ4^ǰĦD'ĝ6ÙËĵú<ñŞE£µyR€ˆ`n^n_Ġ]\y0ÊC˙HèSŜËÉa6aóğ2k-ŞŞŠ“òĦXrĈ9gúÎéÌïN.ÏgŸúrGmŸ…H@{AFÓËq+hş{ FÖ:Œ÷kÔµ ë½`´´2j$tKŝżû ŒBxáÌ˘ × +?j½„â…˙ÇöŜŜùÄ'żW•Ċ[yžż?ÇÉ]ctËSqÙ#\£bÁó^léœjğ\k=6Ĉì×~zqĝİŻŸÍÇϞޭoŝXwG`c¸HĝáìFŜ?‘ ŠöbȏЍLŜ–¨êÁ!òžRŞ“$I&”-góUŠ;^R)˘EWú"µŜş˙wŝgï)(ݏŒhÉLJyî¨UTtîp¤B !$I"’”B‘êġzŭ^Ż·™Ĥé1Ôħí‡:¤Ìp.Çàçè’*Ŝè}ÉN½ÑÒÖkĴKÚ Ê˙,€ŭKïa”#c̞Öz¤µÎĞŞŞ]Ç+€ÈÙyµ/6- ĵ°Ĥ—T×5‡ZnÑxşï\ġ@ŭĊ•jü%ŝÌ77ÔöyPÖĠ6lñèÀ@ì½£ĝûËÂ`2Ş[‚;£ ûŞÊˆ Zßäî0ŠL]&}^S" ğú?FŝÂŻàì^}àìħ?.Š<Ú]›L&ğyžÇHîE"›£TGËv‹žkWŒ1şëJk=1ĈŒ:·ßş´A{Ÿtùċ]€QwĜŒ$qè+QóäÇ ü  ˆéÖIÔ;Ûgğêöħ4M ƒ}k­İŞŞŭĈ94mi­ 6Ŝ:Ä­İrցѲŻÓP–§.Ü5(}X˘ZS½’ ï@%I"/ÏVJ‘”’bˆ‚ˆH!HJ)‰Hà!"RDÁ(!˘$üŭ*~œ$ɰÛížét:gÓ4=½yöBoß8$ˆ´\˜?‚oP"DÄHƒéĴÉÜŬ²bÎhÍ|Ù0TB’0üN³e­Ŭ7ĈäZëx/˘ĉcSß>'Ëè‚yoZàyħʲÌ[½FìpĉÍ?.nĠ“ŻŽ>ñµƒ³At7 °µmšÀlï ÍÇH;Ëí×µ=°Œ’4r^ùÈ-ğA ²q`w> 80Â÷I$…¸q2‡ê§żƒêGżĉ>ħAoL&ïN&“Ëѓ.ÏóħÖşŠ×À€è°´ò<áÖ~ÎEÚkµvżŸż?îöïäĥ%9I1 ‘FQ´@D3À$È5À$BċUw¤à¤ü7S"ŝ ˜ŭÁ0I’3Ŭnw—™µR*µÖĉ4|€Ĥ [Ġ8§´¨ò8¸{ğl­…ÖÚZkÙÖZ×r‚XF‹zsëzJ|/éş{ Hë*˜€“e™HÓTH)›7”dfJӔˆHÀ‡ċE၌¨@GQüX!$)„:Š #$!„bĉ6(%)ċFšĤ'“$y°;Ü8;<~2ı¸[C£J É£'ŝ[4kħïŝB Ŝi‡#^ĥŠ0 H‚+r”7b`Ğ+•1#­ġDkgÖı†ŸÇš†èB° 3 ¸uçœŜ~ïGuRŒżpĞüÚ=-d˙˜—Ë:‚ ·ıx‡#^ñµş²^A×ĥî9 ÍԍÉ ž²”H°ññP4ŭVßÏĦħ¨ˆl|–ÈŻĦĵ$Cë~£¤P" şΎQ½ĝ›°/ŭŽùôéŝKÁ?Çï%Ŭġ– PŬ2öOBuX=’p˜ŝ‘[J3;çœW€ëÒ“;çFj睝cçž9QL XÛıêühCŻ%Ġš.€Q|>ö”bĉ’Äb° d½D'˜ıB¤Y–sÎM"Şc²,éúlZïm*)c\Ñh¸tĜBˆĤşbfŽĈÇ2xYZ\U•›&^FtÈ ë#ë!­£N§#úŭìġzŞÓé$Y–)TBDİ”RP` £ĉè6ż?<'C5¤ĉ+  %ÒyFD‰"%˘”òx’$Çĉ3“‰ ´ƒ^Uǁzĉà='n6ż„°tèħ=ZÏĞhş ŻÂ%P߆¤ĜĞİoZk'Ĉ˜2,‹JGqn|ėTIĞ8ê8˜ÈÎ9&˘6u׀Rß½QuLñé+eŝİŝŸ‘rx*,IÜĵÂ&#d ñ˘w€„`ŒG5ÊÒÌ3‡#jUFqĜQ‰†ž#b€‰ …òC-Wˆ¸|qí@Bİ€Ğ|šž,™@`íGˆÍ>òž‘İ2č÷œ…òĊñĈ•Ÿ½püEaġ+“IÓ]oĥĊ -%ŬޞÑĵ+²êhŝútK*¤yeš 3I‘ĥ'×^Ü}ĝŻ<6~&°}OŒMƒˆ‡Ċ-šŽùĝ“V¤ fÈD!Q<úóúÉ išĤOH)işÌħBÒÌ\‡X Ş[Ġ“_‹´^'”z: I`5Gàj=o™ıq÷7Ĉè<ÏuUUf<›ş]Y–nEëžVJê‚ F›››Şßï'ᰛeY/I’RŞ'„èQ6G§5ÀÒŝ\‘F°‰ĠOšpˆH2³"˘l°}ĵżŭÀC›‚žzÑ­$M“nŻ—mž<ŬÚ:y*…P"K3ÑŬ&•fĵ=ÖÁDU€š!D‡İst{—K-Çhš—oó!é§ı…HHżCŸ\ğˆ-ÇÎıħ1fbŒ)ƒU"0:LĴñüާ}“Żâ—UKQ,lG<ŻÀ{ż 'żTN>ÛŭÄ2ħ}B…AEŽ1óĴkúŠŜÚüĞħ&¸-Xw80jİĴš‰úHÉÉàĜ +O"!”_uH‘_JġzïìŜ-°.}D (íCnnƒú§ :=Pš€+0šÀÚù³˘PKĴ;>h5Ŭœj €7!%ĝ£Ž„Ŭ{Ċó˙½k??ŭàÉ?ÑUùĈ8Ïہz£8·Bĵ°¨*²Kèd·â/ Àg iğÚSZk'˜ÜĵÙĊ^â R„ ³;£&€\pÔ )Km (€RKü@ׇc›Cúäĝß<ûùǏĦ,&ĈêÒ80ïŜşZ€ñŝnUŒ÷JçœıñŜ›·Ĵ÷n^ÚËwo"8@İçè=ĞĞıŞÊ@³­ŸĠÔJç\nŒ):Î¸,˃ôÊ/nÇÏşQÚ-(ô8„ñèŠQż˙<ÊŭsœÌ/Ŭzü“ß+òüí<Ï/%ŬN£2xҙ•ÑşžÑaŻÍù\³.ŝÎ9§µ1‘ĥËÑĊIÖ}8+êbéqY Fí›Ĝ 4YÀš˘WscIĵI…çß°ĝñ;#t;R ûİRt’‡şƒŽ‚ì3ĥ%€óŸȔ;†R•1ĵwëZΎQŽvkSM´µ–Ç·.‘ìŜ™rR8kêÛ_ğÙ0ÓŞÀtëÀĜ9·o­½­”şĦ”Ú°_×µÛßß_5Iy_‹ÖÚö$I"ğŬêt:ƒ,ËN¤izáìO=ÛÛ>ŝ(Y³uâ‘ÇÏH[ÛŬÎĈF*bë̅ġ*é†O-œ§Í*ëü•ïËiħf†ÛİQ;%',B,6ÀŬq Xòa›Îù@> kGOLm_ڃ5ÉŞžQûHĈ`9Wk7Ż`èê+µ§!а4‡¨Œ€ġvöóe=Uô][ì­5ZĤĴí|%}Áŝqyµœ|yòÔ7ĥğ§‚”=@N{J‡#ĥŒÑ~…:îŒ_…2‘ù&>)HŭŝKżüŻQżġClş||Ĥߙlz7úÇNÜtΕÎı:ì@£³²ôrFBw÷Š·Oï½ôÖħŸt†Ġ‰G;Çıġ(¸—K6ìŬÚúT\·§ĵ·•QۛŽ‘H@D7„AġÎĦ|ñWùħĴ~ïÔé­LĤF×&“É^žç0Œ}0²+TŸî×&ayžÙ< YcŒ5ĈTÖÚÜZ;V·ŜÚŬ<ùĝv1òB Ž75óÑÁ(ˆ™Ĥ˜ŭɑúY2Ğ%Z'v~ä³5;ìÖûûU`D<×âÂKÔ0Ú˘2€ö.$D„~–0o÷;ê8ú™D˙ÌS§7ş ›’0ì%H$I%ÒD ĜßİX—F튝ë8Ŭ.m•W֘||óÒ!ÔεKïĵL£ëŻĈ&IbÒ4µus“-ŞïÊnÙĴÒY ,ËdHLÜPJŝÜßùû ßŭóqll6Jë…çAç}Ǹ­Ş}`´[`˘?iÖsĝDŒŒ€.€ dR # „„€,¸Iè4;í D“M§½xĦ*Z4§ê`ŭ}´ÈŸ×µÒA/gċŝàA‹ÁÁytjĵ§SŬ(kÔusro”–ívĒWtĦCk&Ôż¤ŞŞr 1ú”yĦŜ×ùo?ùͳƒ³u6ó×µg—*éÊb´_ˆX8Ñ4˙<öN(B}ù5/ŝì[ÏÛóßMĊ­ϟ|˘Ëâö¸ŞöµÖc­uú&ş ·*$ P%L”R4M{!%ôòCiş}nüÒïŭäGG§žÙLÎ= 18 6¤ l-àÜìŬ~Ż{FMƒ’ĤA{ċmŻŭ&è?¨Ÿğ°ŭ’pú§£Ñĝ½Édry<ߚL&{eYħ2ZFĉˆÒnw„kjq.ŭ9ʝ+­ui­ÍħùfWV†Š£Ò`&ù0•Ñt•Ì7tè ÏS[1kù™FÇHÂ9Ÿí7f΁Ĝo΂R (ĥH@H £“:ŽQH / òڋ7ˆ$  jŒï–áœ[ż(†(‚ħ8oŝs<·qí¸”rK)uƒˆ’àFÌħ D(w\1}”ŬJ?ı0˜šQWħc•3ì)*f{Bžˆ5 )½u;ż{H è+ eB"€Lçc­“h遠ĥ]ä´ŬJ܌i›Ìì\+‰sêŞìšéXNGpr-sëoğ;#´ ùÍkÀÖډs.·ÖÖ­ŝÑQè:,‘p.znÉù\×K:°I1Ĉè°^O‚àÁħ/3İÏïʇĝwĝŞ ġ9Ħ’ŝ6D觸ı·sŒŭ½ FÛ£ƒÈ$ƒê­ïĦxŝŸck÷ŬŬOŸ9ù:ıì½r2^UĠNY–{UUM‚ @­µ6Ħâ³ÜR&ʎ¤¨$I’Àô²,ğÙét6³ĴşñX–_,wžüŬчôC_뉍‡—…a;/+'ÌıyÜ+0jú(WìĦzŭWÑıĝǓg9ùĤ­ĞWĈ“É{£Ñèâŝŝŝ­àĵk­£âË-İŠÖ ½ĉz]u].rXx­‡>’ħÖÖÖÚÂ97IókıÊĥ7êqċiğÚ ŒÂÁd,8€Ċ”ş‹Ġ j ĥc€yàb˙ug„ °³~¸Ŝp¸íč›%~sMHá×CE [$ $‰L[dH™0İ,*íĤZu×äfß>І°R‚I6êCŜ0 Â0ZÁœÜw=$Z'd@ËÔ4*߂ìşĥÁGp΁53>lÄ!Cú‚Ñ]0:B ñ [¤`H"H˘ĠĊħ-0bwŽw‰vMĊ­+>ÄDóôö[sa·3VĊ›/#ž“ċ‚ĵ2§şu §\}Û9WXkĞ@×éÔÇŞñLhğ%ûşk˘Í9“µ–ʲ„sŽĴµ !RTo°cë‰wŝÀí<ûµÇ&9È †Ó³ RUŭĵÌç0Òî&œ5Hˆ*L^ü ÔÏ˙ ûx—ŽŸ;ù“˘(”ey½(Š˘(öŠ˘È£˘Ĵkĉ<\¨ŒLD$”RTRJiÚɲĴÓétvz½ŜN·ÛŬéh½ûÉNqċòûúÓ×Où¤<ö(Ûô}`Èsğ{PµżnHJôÌ~ùıÇÎĞëêbQW'“ɵ½½½[“ÉdżŞŞÂĠ\€ÖġŒ‘;¤òsĠŽ{]o´$k­ rôÒ97IòëĊÖĈٍëıö&“RĈŒĉ-ÂS ÂQ…ü,ıĊ¸°`8"ûħo8ÄÙFı(€pZ"´úT˜uŠ=ĉ1$$dWB ÏMJ‹Ii<àĠ:ô’.ĉŠ9Áİ ‚Ô!˘„™%3‹ı ê²JéħZk߁)ŠJŠ-+x–Âï™|˙ÑpĴmġQ_ ô%Ħ+)À÷ŠMm<ˆ–4?Zğnú=ĝ\ŒŽÀƒĝ|ˆ†3'íÑôä™ن\%ŸsƒüÚt€Ïċ´†ÙßEÏT·Jk‹ Ó |Ż–U@ĞèşeÎżĵFì€C4 lN˜u]WÌ Ô¸Ó錴ÖûÎıqosC|ñĦ-ú§oî—ğ;ÏÏdĴQK]šF o‡CÁŒż÷а?ü ŭÙ3[/Kg^F'“Éġ<Ïwò<ß/˲Š2kŒ‰·âXĈSÒZ‰ŞŞÊ²,Ó²,ÇUUĞŞġz½QßÚÑY÷îx@ĉÙwœy·$6`Ĝp÷ŒÂÙ#¨îúÌÓ &˙ÖÚħ1fż,ËQY–Ñ(ʄóĉ°:’|Ù<ŻĜqӒĊoċ›ñİÄŝ½ÁùϟŒ=Ċ"5&İÀħŻv(- ê– 2óH„u& Ĝ’lë–3Â+Ĥ8ßÄsÈ4 rÂûlB²§ŬâÚÇħŒ7Ĉ…>XoZÛ°DpÈ@ʸNÀH˜Y1³”RÊıs6ϚĴ2gŭH{HëŜDè-f̞umúÒA‰q òŬAè BG)‰0˜Ri6ÜhŝĤl<ç¸I˙· N aJ̃P¤ċ<ÛÛlR×#à8´~Oëûf§üĝÀkÁ 0ŠŻÈìdQċVZ½k­­ĴµÚcB•qżŞu;żób‡h#ä–P´vÉufÁZÈ0³Žzg>ûMÍÎËñ™á,`Œhż‚5|w`?‘"–Ċ T@d“ïŭß>wnûGNWŻŽ[qÛ!á´ b¨9·`a=Hs@LZkáY$]ùĜžŞĴëş0ĈÖÚŞïŜݟTż!’Çx°é@!'ZYÜK0ŠĠQ´8Ú~LŜ6oôğŭ8`ݵĥŒ–‰V‘z ›eJu×ôqCpÎıÚZ[èÊΠçĞv °ħ‡#žSĜrPÓıPñxšŽvÌ9ßrŽáDPùkëxn­˘ĉ\q´ܤ`~“Í1ÉӃ‚ Jì\2DgĴ“(*ğRäÂì ˘ˆÂ}*âZƒıL‹ÍY?2§†dx‹(3‡!bÈ/ĵL;Â÷ŽdpGzŽfŞ >p%·žQ)UĈÖyiÀĤEÛı lpm0VuÄ-*owä+ŻQ4Ù¨ó/vĵ‹ÌT‘v(ÍeWì6×Éşë$L $ó¤\@Ù" Ûş,)ä–UTrüİç6ßĜŻï´ÚXŒvË@·Ŝ%QëzP”)@Xä?ümĜŸüŝì™ÍÛş|e2™ĵğżżu4Ŭ*Š"/˲}"ƒÏt-bhKĦĜރ#ĥvΙŜÇd*ŜHú9‘€X× ĵ{šŭì'䉇póöİ­‡ċ;‰BŸH!\¸Ŝ– ·ÖÈ­Ħu‹Ĝ2QRp Nô&ÈÓ+Ŝ½´“(Á$Aħú>*aĉŝŸ-;á+Ş'˘0ÁƒRóœ›ĈÒÛżĜ÷—„ħ§ġ¨eĉÊ4³ô3O•~7ˆ ‚•„DY" ­D];ĜÖßËíŬħTáîĤĉkĦoDa^”ZKG`W>2Q*PŠT]ƒĵÓŻñTĉW™ hĉĞ!jµÂçšàâvMğ7Ô(äB5Ó#fy VñkMßİ(žŜiÍ÷L•wëÁhÎoĤ=$! ş£Ĥdĉ"€‘ƒĤ‡é­!n½@ŠŜ7ë=ŞÜ(­Ş’Û@Ô,RJ)ŠQñI’ôŽ?ġÙ r¸ĦŜşf`4Ò(FġÁ¤;ĴŒ8p Ĵq„$Ôïż€úÇżž=Ù{…uġêd2ygooïrt ˆs^ĦorX£ÚU€Ôğ´f³ß1fĥD„½)îleoo~ċJ°ìxwéW§•ÒŬƒBt k‹Ĵ—`7;3¤$ÛL’¤µİ”Rr¨ĈVKıïTMÇkI^³^ PÁüW‡aíÊéj˘ìf)R 8³€dZ Fŝ°:8:q€“˜È; fĵ"YÁ!2–g@ ÂMÂöç… Žĵe™ ˜°²–‚¤<&R;ž5dߒĜ÷’!‘@˘ĥvŻòj>Ż8ċ™YŜĤh8˜¸M÷ˆ>hÊniÔú#ŭÇq§T˜nɕj.zGQ,›E ÌàO¤Ċœ˜dníâàĈÌ ĊĉOĴE[=ÀÉò4xŻ] µûGñ9×RŬ…ßħRd½Œ˘yDÈĦaùÎmô`ĞVudĉ*¤éXFñó5 ÔŜ9”…Ó‚Ĉ'-Z¨”RȲL……opü™/ž),cO{;ŞÒL·‘w Fá•yCW1Háö/Ħxñ·x/&Î2òв+1X.€‘^F‹ÚezÛE}>Ò1³ÓZG0rDÄa~In\y!;Ù°SvĥIe^u•…dğw FÍħô;ŭ:ŻA½b7;ġ@/żšeY–Ĥi°\k²êĜŒ˜ù0 Úş&úaCxç\ÍÌċ·Ënş•ĉ…”×ĉ•Qcì×GMeÄa]'á`™ ĴïÏqĜĵ Ĥ鈋9STDcüà/Q ŒĤĊ …j~}kÖ&\žzßAI:x´Ŝ‘ˆÒKрR‹²koĴx0án{IêaÀİĦìb/aĈĦéâ-ۃòܕ@-ènĤ£İ5@ï݃‚k ­ò$ÇS0Š=%n=×ô”xş+iSuM)<ݰ[FŒĊMUHyo·j›ÎäÌ\Ç É9·ÌÚg­F€ÒŞ‹ë€İċ’Ê ½x !'IBİt’$ôx|Îíğût´¸{F1ôTzL Ž[â…­üÚîöPŝx<.Ŝ  ħ2Ş´ÖġŠŝȲ iYi …µ‡c|{SN!ÂìR÷üğżù£Ñ'˙ŝÏU&O)é{aƒá{Sa:~w\ êžÄHOl(ĠO’$ 爢+ô!ĞĦ*éւÑÜġˆC\ó‹Ôv6P˘53W˘ÜӃŝ)ä{wloÔf|(0: ŠSç{JQÀÀè´Ĥ*ÂĴ5l…ùXÂ˙#,ĵao³k2˜br³1vì7Ü­#6|ċŝdŜS‘„ŒÇ½)Zt˜ğÇ­÷÷­ÊëúH­?šH0Û)Oî.,ÔÚóú²8œÛxADu #´•p˜Îµiĥveiş`Ä<£Ĵs­ŜŸĵĜgrËÌùÊhÁ)¤ÀíS&aĈ{PĤ[kĞpcÙV…´!|˜aĜ…•Ó!(<,˘68-rdvRJNÓTiš(zio°Ù9qó“Wva CÎç‘ïĊĦ# }ñÇà÷lŬÌ^-óñ<ÏŻŽÇ<ÏG­ôŬUnG¤y0Š7v”¸,Ë"öӒ$éJ)‡Üĝ÷ß<˙çcc@B€=(¸S0B8.*Diµħ‘ÜèK)ûJİnšĤ*äĈƒnŬç÷²2ÂaĊ<ĈĴ™ıBµW÷†rşÊÇ[é¨`„–’.ö‡h*`hron•:Ó, Ut¸6Ĵ;çdB,zˆ³-šH Ô!ğfĤ2ĥf 9ŽOnɰş0ĊíÊhQĠBŬ}ĉ ŬZ²Pùx#IòÙ18xƒÍHd#¤´z&̈́ııĉoûçyî‚rí0н'ÇSixĜšïÁœÄ*šnñìü|;ÀctŜĞĵòÉ…ŬĜá(‹À!(ĵù/·`·tÀkLJIišŠ$I2T÷ĜSŸ=ż[;ş]/›­ġbïż;ŽÖ@D`[£zóOqNĠ7„Ñï”eyµ-í³6‹ìoÚĠ‘Ċréò²k_,ސšK’™µÖ\–%%I˘²,ëĤiş1ĵúƒ—·Î~ċôŽÛêúĤw£mâğ£Fŝë|*ħħ íP$Ç:.éSވ}$!„›ZgĈ¸÷^Òt˔ Ğ„ ÍÏ´zuÚ9g¨Ü›d[žI%Ôvîh`Ԁ@"À{j’ót[3 ÂXò}% VM6¨ˆĵDÏúëÔËÈFhĉóyk èÔÛTFÓÊêNÀ¨y–.6Êß2&ÌĞ8f^çΰŽÎ¸ „ÓşÊ_pJ‘RJ !2Ġ\§Ÿì{ŝĴ•>´Î9;0Š× 8PJ—ßGߌóT֗GZïĠu=ŞŞ*ƒİËŞ˘£Pv˨ëE™=rÙ÷[kµÖşŞjRywñŬŝ{úîÉ'˙â…÷÷rbžAX Q>µĈ‚•†ŭM”œfDԑRĤÁµœVôjÖ Zßk0ZĊĝZKúí˜Ùş|'O”húp¤$\mT5mÇ`Ñ2PéFa Ċ‰#•µ"_eE5 i%ä"›H­Ñ förşómNĊ ³ •‘ QÚ8hKjÌP%S¸ÜÌì²Êˆ°\a}_UHĞ@jÑ4%0/1‘4̨ Ħi9„íÑÔÀًĈŬBΐç*ħ†Ĉô"rí½EfĞ'ĝ]HÛ •]ìv·w÷G£6Ġ@[Ċ°‘Ş‹3+K–ĉ¨îîjahÒ"Ğ!ĴY8L˙K)B¨Îİó[µvÈ-UÖ;O×nΣċÎÀ(5@*}ĴÄÎel+7ĥĈîk­ÇUUċu]—Ħ:rK€È.5¸#’Xф_Ú{ Y>Öz˘µıb˙ÖF}=Ù ïˆÁĈĝ dÙŻ: 1ĵóı`ĦPŠĴ#„È„Ië|µ… ëú—üĴ%ë”v ݽ–\Ŭ2³;-­ö뿃wĜĤVÜóaÁh2AĜH‰8h0ĵzB4ÙEZQS15Òî¸ŭ£/Ĉ͜…öë°Îo”­s0–ĦC­=(-ĤlŭžsŜuĵġġE=ZӚıo‰ùùÂ?Š[ö< ˆá›ŠKbX57èAnùQšğ;Xŭ¸ivь›wĞï3 ™t3˘†Œ¸Úw•Që˙Ì`k È̀ќğ4Ż1Üó…áMĉ!”R$„H„İ:vrX[€u iµğ'•Ñô˘˘&"ĠîßÀĤ°·Œ1#cÌ8äéwU‘ÛĵäZgÌ#Û˘´M]×uÈ]šXkGéíwĈ›_ìïŜ*@JùAYĉò’#‚QüÀzĦ3†•Ô"Q$ĦBZG™iûCĤv)“BvÚ*)DMh%· ŒZ›WÏÁĞ}}KÊ÷,}_.d‘ˆŞıXĊ>QtX öq°íĜĉ˘j5U˘ïƒ‡(Ç0Ħ:Ş—‚Ñ”-"!Ĥ.àÓêhÙZ~˜çîğ i鋞ĦíâNQŝM-ŬÁİ ğ€€iM#‹–ÊîÀ‘œğ;yîü0¤òxÒ57ÏTJÔsÍK=-Ù[şF¨`-Tk!\FŒîħÌèrĉ{„Ü|ÌwoĜ­Âìî-IİpğÛc}£ôyReH=58è8°Ĵg´ĴBZ&jh Úĉ´‹Ïĥ轐œ`›,kmŜŬ{˙ĝıŻžŜğşÑ ônÀ¨z)H%pցD‚É@ú(vvÉ9÷Ñ\\³•ùQç‘Mq“XqÙ!0î ŒÚ›ċfĝާ`BíÑ#â0'é׸ĜZhdŬ‘B¤VËáÀ ˙ñ܆ž,’óŭ£X!­#żˆħc?ğxï@Xžž˙>_ieI×VÙµŬQyĊ#¨™Ħá+$Ÿ!c'DìĠĥ¨ĵE`Ôŝġ3‘Ğ3à3OHO/<ÌÙıĉw/#^CÓµ^G´ErlĵF§U1óQ+"ŝAiċT}$ID’ˆ”ìÒÒ¸PÑr[œ£‚Q\h ƒ$îïA™J gĈÎı2dJé ­³ĊY6ğèĜ/Z8—1ó^ÍçáġUÎıÊ9WŜµŭA&ƒ£°ˆJœğĴŒĤ("áĞn’) ɎòçİĦ쎳ü0½#ë‰C‡8$*b:ÛĠˆ^zħÍdFĥ4Ù|ÜÜöżeh8uż{0òJğiĥşh-‚s˘†b¸Ğ‡/Œ(œu“Ê0HÒT~lïĤgÔRŽoHŠDe‰L°f•sŽmşî°V8‹˘'–-ˆm YEaÛıŸÑÌ\ğۗöş0Moœo@͔÷w FÍFÈƒ’”0IŝH‡ŬÜ×`[fîZfë˘Ö  hvgz0šŬèQóÌ,Q`˘(aÚš´è ™3|ċjżċÈÛv­ċVvV//88ݏèb™Ù,4ZǙ˘’"³ŸNC­Àá=|•4=zq7UıòÊöÀ=<³#áY ›Á°% ‡£È”ÓDJ!½§êü—Í#¸uJšHh,£Èô0<*µFÊç“ĝÄa%… á‹ĥ²w`xGsŻ^Fٵ͋ĉÓvÛëTۚG´èYfÏ436uŬŽ)•DO;eîŒĵl^ ’`&âĜĊö ïêxŝkNÀrv€DK)ğ¸=”äÑvħ—‡[}w-X›B™ëŸIt˜*mĠëƒQ\X @‰7uĉÀÙ>jżè~Ğİšrva#¨T¸Â!ŭ@5|'`ĝ˘ äĥEE!í~Â"0bÍ4K(ğùË{Ŝˆ–p÷ϵúHŽŭ£Ħ Éi'IH'Zʰ{F͎-KG$›=чĤ²ş zĝ÷ Tĝó˘Âà.Áè Óħ`P{ ½ĵ‹óŜcĞÌtïŒĤ;‘ƒÊ֏èĦp_<R ˜Ê‚ ßÍ)ħ; ĵŒxá"yŻÀÈÈA"!ÀÚA¨•éÇá1³ğ:ya Ûx  FÄ~'/Z`äM‚ĥcK\y$D–JçfH‡3 =l´Ça¨ÔCż !@D.`8@&%REŽÁ!ét†êmŽK`0IX FQžĴ¤¸}<7%žçÎÛŭZ-~³‡Šĝ`ÀhEJïÒ GF@.· g˙ ‚ş ­F\ëœĴ#^ w Fĵ¤2úÀÀhn·ïŒƒTggî~j/N8œmŭ·j„Çβ†ş‘twĵŒà³]¤ é€ ¤f}‰‘!ÍO×”JPځEâĊ˜D"ö²ŽËwĠUµÈn騠Z8ž:“YG;ĜäT*HI!È-‚ÊtŬµÔVŠ.Ùâ8` ĥN£eŝzDş†îëŻÙI)|ŸÖħw'fˆùŸ0òğa@ÖŝY…Ô>0ÜvG] FëNÄÑÁˆWÑtKu<ñ´ €H*Ÿ‘feşùüC5<0bvÎj DyöA c2R҃‘hTIÓÈer_˜9H—…—Fע?„İ óOQĈŒ0ì ĴÄ^ĞèZÛÑ^œé(Sx}^ŻRƒÍž]ÍVFŽKŒ+˜ħqKıċÏ{hÍ^“΁ <}c5ÎDʐù/ÎWwâ[’q""¨L:³ŞƒpOŝlQXo}5>ÛİŝY¤(§öƒA†ıĤs‡(ÎF‡‘ ݲŒâK$ •‚žö”?TùċNâmm>İc‚2…¸gvŒE=£XIHnòúw.ÎxXF-˘Ÿ˜Ż$ȳa†ħèQ†=Ûî‡&qW€lóñ’M‘"B„”$‰TJ%Bˆ´sêÁ­ĊÎìg‡‰” Hšġ<›µħòğŝ:ğ” ΔHúş0ġ1dŒ1‡ŜôÂĴƒµÇĈΘ”ŝLÑ”žòJ"šÁĜŸY@ŠK­ ßŜ훃òËe͚ċĉ£#BS!Š`BJÁú+¤A%ñ_0wó0Ĉ´#ËDŽO³t‰€+ìB0Ô$fOÙEyğIÁ9?0 êšáàS0m݁ŜqQúÛRĉ™R* ŽäG‘V‚ÏÊ^Ñ`ÊÂñ’à'×ÉĥÏlé(÷–2„Tùùi)­f˘?¨˜:ÜË`jçeÁs>ÑoË ¤%œ³-šġcû÷Żf]ĦáU­ ĴëŸ]0ŠĞpܲûHФûcu#ŻÇg³`t Ŝġp`4o÷sż‚Qû56ż9|ŬËVÈ&G‡ˆ>ĉ)m˜ÙĜñnAΟsŸìVŻR_xI"Hú.1AH$!!BŞ˘„™ÀB@mĊ$Û<İ”ê+:iš&Y–)!ÄŭRu6=ŽX…<˘b0|à‰Aİ iFŞÂß* ‰’ %A…ÍÌUğpk]³Äġ•ıwÉƒµÖş ùħ|H)۔·%²Œ7•5:Ì!ŭŒ‚QÌCr–~V)îtĊÁp½ġä 7U'Ż<-1ÜAlż˜Zj;’ˆBĈGlrÜè’V…ÄaĜÓ:çj{ûê’ÑL’ŭVĞ#éÂÚ<×#)}/E B"T2)< 1ĵ€½t{KJ9L’¤ŸĤi7MÓ¤H‡ġî˘;ï;Ÿ…4ME§ÓI“$é%IҗRnôÎ=>ĵĥW-#! •‰Dó7+1#)4F’BŸiĈ@sډòöAvt‰+5œ-°1Ĉ. 6?…Q°„Íœ I&˘Ş}5NJTÚŭÌTFhĝ]"“<ÄĠù³Hm\jn˜£Ñz@ùpÁhĈ!|MÏhÖ2ÂWˆÖ2„ÊàD"‰HÁOÍ )ċŭZ%­ Jƒw^ŽÚ9W۝Ğ{Â@"C•4ûÓb˙žÈŻ(²kc €$„Ż˜‘HL“N£ÁƒBİmÔfšĤ½n·›Ĥiş4 â°·&Í=ÖÛ2˙HɊcžĤiÚSJmn>ôäʆéû×K(Aèt$Rb$Œ¤l÷Ĝ"P3DˆÈ- Róš‹à8Bá0p=FWĜ’ÙğZXkû¨LìîĠ"7ŬÍI‘vSIĈúq?Ó`4ór,>jUƒ¸Vħĥşƒ,ÁhĈ|M·bšFÖÉHIŠJH@‘ 7•XħËŝÀ´î’ccŒ ‹\íŒÉ1UB‰°[ÇJPò‹kpD&‰³ƒÎïÑâM _)%B •@ĉÓa wüQµ;¸XšĤDz,ÛȲĴ—e™J’DbyTóŞĝĉuÓëˀm™Q%)d·ÛÍşŬî MÓMÔñ“Ï~ŭÂhbPhƒL”:’Ĉ"( E8>2|,}Â@s\èÍ´>Í]ÉUüĞC>ÓŭH´Œގˆ”l÷ÀFĊ‡µ‡c;ŝ­£éڟ’ïwˆpü,÷(ĵЍ -Ĝbû§ğ£°ƒŽN¤’ˆ’hJ¤À‡™˜ż@é@ĊdŒħĈm­­œs…Ûż^öRo‘ çĊĉâ ,ž ‚…Ŭ~Üġûü–Xˆ†–òŠ3%ĤDG 8&¤çqcĝÈY)ċİ4M·ğŬî°×ëġ‚À!öêÖV1kì{Ēï­êHv:ÙëġşNg˜ĤéñĴ×?sìÑÏ{óF‰Œ20ĠuŝoAħ-7ǨîÖñ“îœd ñA2ż ]èħstÎĠZkRŠsW­½s?ìGÈàBEDJt6ğÚ¸`ğ„?£fJ.J›Ĉ+¤xP(XĦˆF·z·ßÖ\0wFM•rM8í+“.Bé‡{ÑĞĝA)’ €T:çrwġíŬnG6'·¨ËŒBÌb…ÜŬcôH4ÔaG ?(Ş!%ò•’c09ġıjxöÑ4MOuğŬ½^Żßï÷3”š ħlZíïĊš@)̲Löûŭ^żßfYv"MÓSŝÜ_ĝT-;ÉĊ[%Rg½½šVD‘˘˘ Ö1Iyzìê¤3$"ĠšŸ9 mt_>´ÖVk­1•µĥà‹Ż^ë‡á" ˘†HJĥÖHE\épìtüĉİê.SbBĥq?÷x’$ç:ÎÉ~żĴ×ëġşŬn¨ğùJiÑÇâ µ€ĉż.”RŞÛívúŭ~żÛíϲìLg°ùàÙÏŭÂéׯ—`m‘JT”:ŠCÂ-PnBßB…ĤŞ›éñ ċx3n`Ç·@ċž}ĠZ[cŞşµ1ĉN½?Êë²ċÊÓ3„$˘Tġ·ûĈÎY½Í+Œ~ÁÌàĊ. zı¤>DZĝNµŝ#gy=ñaaï'éN“^ïŒÜ"Nb?‹ lBĞÎF*DA)Ht.kĈi¨•µvâ.½~%£Ê’bɁv⚃’Î/Ĥh˘Ÿ$Z+ĤÖLRđfsbN ;0Ĉgżĵı?~ëÓŭë/Ŭêġz{Ĉ˜ÜS  Á˘ÍZۑ;šÎÛä,ĞœÄP(IĠív“ŝ`08ÖívÏĤizŝİ_úϖ˘—ĵué*RŠR„ó•ÎÔŝ0ÎnQsŭ ĜÄnZMÒ´şâ ÷&bĈWħ!ꉳvd­Íëş´Ö'…Ŭ5$yŻ((ğDt7ğemۙ18kó3AÓÍ-B2:}Ó*Úŭù°cW NƒĤ`}䂝ېĊ™20Zpá$ƒM˜¤Ûï‘ !)HÓT–eı–h=Ç÷É"ç×umµÖ•Ö:·ÖŽäwÇD6ÁşUş‡&}34`D³+>µúÔĝòĊŽs{ÖÚIèiYçœ-˒[ÎñFknP^²(΃Qż@$I˘z½^:ƒÁàXŻ×;›eÙ§úéóŸŭĈéß}eÖ‰sP }É ı<šéD Š‘Ĝh’I…`çAÉD³;(PŞàv/aCÙ}kí(ħ×s€D÷Ñ5·JÍĜ<¤”B)„ßeŞż–µ=x:+£ĝĦ†ÎÍìÌ,‹µneŭĜTHK˙"j˙ħöž<ñì—>R0 żÍĝ*a°}&éö„H 3ğ¸Ÿ;iŬ˘İëÊ“[kGâê·7zdsÏ0ì¨ö#I2, Áŝ§İ†0GIµS‡xö?dĤbÂ Ä g­Sí_ŝüƒ?ŭïĈ>3VJ‰ÉdÂatYàŜ|F-Y´ç+˘F2I’¤×ëeƒcƒÁà\·Û}xpìĝ'ú·˙óg^ı­éŭëRk!Ĝğ2ÏşğpÈ~ç…x"ħ[ħÚèRĈħ÷Kd€ëv÷263sÙÔflŒÉĞŞŞ1v!‰ğ^ÀVÌz­½ö•Rħ” !2ÑŬL‹‘Œñ ?ë`½ƒ—Ħ·-£ĥċ@tŻiŜlǍşġÒŻ”ÌĴ¸Ž*„Èóu]ġŠÊ.‚’ ¤”*tÙĈĈĈ`8nƒ ½^ïáĴÓ}âçù}é†î¤/ĵyÛWEB@ġ`(ÈBÔúĵħ jc4û5^wSµ]4—DÁŜ|IuĞvë‹cc&u]—ĦtÉ÷‡µ)Z•Ét@h"„J)İ”J‚(¨#{Ç;ûċĜŻ bà˙-#ZBÓÍ+˙Ñ$ÙÎÑ2£áµ-™û•²[q#3˜ö@ •›=ÎtˆÔšl¤U qd0r-0â{F3I’f²Òj•eRÊ.RJ(jÍ+Âäy@ıÇdtp"“UŻk0µµĥÀŜÛŭü҄°1`öŻ^¤à{i4m̅:ÂŬx F1'ˆ8ÈÈıĥ ¤ĈB<ùó癊ot~ú[ú aSBJ9.Š˘ŞŞĥžkSZÁ­/:)êġzI·ÛíƒÁp8<ŜëġÎwğŬG³,{òÏ˙'˙ğoşco~˙ċèÊBÖÒ8ża‹2 ÖÂÂny•_ …ĦX…Ŝœ"@‡ü-{ó œQġŽs0ĈĈ˜Ú ì,cıŞpYÏ샸ĉŽ záJ)e"„ÈTokȔȝ½2 ğ“kú˙V ½ÒšÊÓê¨ı·ĝ€ÊŽçÀiĠ_|O֔š²[–3ŭ¸É`ÂÀZĞÉHKNÔÒAU^Ra.Şá¨Fn ñ’ÊèNÁhħPĝlDI¨Òa !şRʎ”2SʋíœsĞŠE—ç]]4s.tPZÖs fż Á¨6}ëğŬ˙Â`RVv*h8€ƒĠ󌗛–Oñùf…$b†`†j‹NG!ùôżû`Òë~›˙Ϥ"QJeišĤY–ŬžL&£<ÏEQ:ÌäX3’żżĦ뤔˘Óé$Ŭn7ëġzŬ~żżÑëġŽwğŬsY–=Òn<ùç˙î?úŸ~êĜż~e;c e\ӊ׵é9žğĉÔb³{ı¨´sM”RŜ܍van]ęb—-öß윃BĴÙĝ,{~&~Ú-0Çt%„µÇênòŽ9ŭCPuЇĉ-I™Ĥi’ĤiĤ”J”w~°÷ôsùü&š”5Ë…¨‰˜âiĦċ`D­hÏHš· ( èÒ •DéÓîÁÖÉ_ĵŭ/˙û˘'ì'I2èvğ·Š˘ĜËó|REU–ŞJc–R³HûBV4…n·Ûéġzƒn·ğÑétNfYv.MÓ7ĥO<ù—˙Á?ùʸwnĝGoîÚí *äġ0àc9Ĵ›]·fDb<Ôĉ¸ż›½~)Jĉá‡h%ĵ=•b†‘ ŭr#Ŭ-˒R)eš$I–eY˘µVže5Ğ€çŻ1Z@Ñß+P:EœĤi•È„ôĜıí²2!r‚?"0",k9ZèàÓ3›Mx]è›Ú:3NЍí?•2TàMy°(=ù°tġǢBjžcf²Vj ÛxŒ2‘ŜÇ­íÙÒ897ׯażRM #·šq[Te;³ŜÍÄFóÑÀȐ΁”„sŒîñÓ(:}u££”ê()ċ*ğ›U|ûŬ‚Ña‡Bçù| ³6IŻ×ë‡a·ÛŬNÓt[)uì‘ç²Ñ9ÙÁO/İ€°^ĥíûH<Ó3BèLÛ'ј–f9Ŝ9Ħ(¤b†dUb[ ]I¤Ñ½ıS˙ŻüË˙â˙úÂèêû[I’\̲ìJ§ÓıÙï÷÷ʲœTU•WUUi­uY–&ÌU5’_ìïĵ“Ĥé5cÌÍ^Ż·£µ…ıBk­­µĈZkډħĦϗ$I’… D_)µĦ”:–$É )ċı³?ŝ‰_ĝë˙Ëg6|êĜOĉxáíۘÂ8XíÁß0@8,2MÄ sË=¤Ċ|Ǐ]kœ˘uMF…˘ İ52nWĠıżûhïâ?WÙğ˙fìœ+h)SJħRŠó×ÎıBk½wÓ`r-רß~ŭcÇÑ=ĥ ’İç5[›6‚T´Aħ›A>˜¤³xˆŞ=(Ù8()kŭ×%,CHlş88ĝj-(ŝ˜— ·ŞîŒZ_äƒ !r°ħt…=!D'ää)°Ó™U•Ñ‘AiE·Ş2 €(6ñEšĤr0tƒÁĈ`08šĝ 6ĥžús˙żújyĉİ­_yyo]ÎĦ´óçF´Ç›ü×61ƒÀMĊ3½· AHŸĵŬ|ŸT˜„€Ğ,nß*QW ı…Ó_˙‡Ÿ˙s×^üƒĞŻŝî˙ôb]äWĴµ7s;Ĉ˜ħµvÂÌıs!v.7˘Ò³óë !6¤”ÛRÊ['N=ĝK˙Á/?söÉçNĵ·ŻéO^ŬĊû7 Ĝځ* Ô.,] gÙ_ÓÌÓ9Î Š•Ñ”gAğzâ˜;'ră$%ü}v{§€1a.ü•‡OöNf½Wŝ™B@J)¤””$ „( [×u^WÏsGTñÊ1ƒ$IDâİ#„èŞ´³Ħ6Ouoĵqż(A~ûQ€QÔís;HċżÇ†JĈZP4;‘‹ö`BJ†ü"šZ?Bxc‚(ñżğɲċŽŭï Žğ\ìƒuW€™À/Á$fOZ31Ĉ”-·w^Cßá^Py÷Zö½H}4óĈÌĥk]UĠ$MÓÛ;Ż˙ôġü‡ÏŸŜóÓğD²f$šYİŝä`Ùß@2܂êö;uIwĠÙ˘ÛÚĜ‚]ˆ$X€—ùz÷-&œ"L‹ÀÇ3„ŠŻV 1眗\kï>͚éݝ;ġĤ[ F­Aq7÷;3d8˘Š$ŠÁ‰žL’Ħ”²§”êĤiš(¤µÖBDp$ĠӂŞ8ĵw[ó>MSÙétÒn·Û‡[ƒÁàdT”mŸ9˙Ì/ŭ§˙ä+—’“½ßĝém\½V ‡Àš0?£Í)ştp0 /Ĉ…ğcZŻ(ĉs07.Lê=%àM]ÀĈ²0¸t-Çh’Ê3Ÿüöùżĝùožž\ys˙Ò+?şúú÷~÷£ġsnß9—3s @·*$ Btˆ¨/„?ŭìWżġÄ'>ó…S›g\ÏYüî›ûx÷z£ï²kOÑħspÖ3ì\ âœ›"Ö<7\>#tp ÖÒ8×Á·ÑQRbgż‚v€ŬĝòÙ³_8ñî˙‡,T{R)%”RH’„G£WUeç@I,hË/£P ĠŜalˆŽ$ùVJĊ İ#ì÷Îá@”€'VÎKħ­ËKdüÓnJŬì&€-Áċ¸š€Í¨÷ŭsĠĴÇ`]€Ğ=À`[Ħ›É*S‰Û*K³kĵħù^]×;u]Ú7Şë%ß÷eÇkšè€ÉZëêş‹˘K)oö~ü‡żÓyíĦar‚ˆĥ¤”"Ê:Ŭ/nl‹âfRŬàž6#”L&Úv˘šYĠĈ)ŭÚtH*ÈÁd§ µy²;@:ÜBvì8ÒnÉö6(ëƒÒTİ@(8ëÀaÁÖ"a·é/V–„ğ1J]F×ú8·_S ’ZDR(‘ħ$EŠH†ŸU ‘–#sûönK³K]í¸/Ŝ˘RŭN˙ËßÍ&O|­#²~Ĝ‘/;ÜĊf}00Ż<’N[ èŸ<ƒĵ³9(QŞ>’ÓZ窪‚”ÒH)‹0MÄ ­ÛŬrꍀ#cX]ë-Ŝ *|ÜNX•ñgCސBHĝÖĉw'B¨Ž”½TۙŞNáŬ7Ó/ŭ‡÷ĈUP;`™ìî`$B³]zD%˜]&˘d3A$ÉÎħžPjSJ9H’$Òví>Òa… Ͱ⊛ŝ0`Ôx³E0‡Ŭażß?ÙëġÎw:G:½ŝ'ñ?ŝ‡ßĉŸ=ñĞŻíĊw÷Ú!%@YżCWHx0j˜5*ĉlċ9q /8ÔHż`(‡;öQ .˜r öôÇÜ9•8v°z[ÒżF"˙spa‘Â+9-7•UÜÀÄJĈë|µkĈÁöÏÙLΏs:Žî%mPB£Ĥ[DšğĈÄavŝ*üíe­À…İĴPšQ;†4nîÖ8Ħŭ÷Ÿ9Ù?1èĵúIôT”R’ô^VûJ)Eħ(ŞÂµÖy>LtȊhéÌ[¨ÒSTWJ9èŭÄy#Ryġv‚ù–“˘mÖÛRş5Ò;İŒâaƒÙlGHÍMŭé‡7ŻXkGu]ßZï;g vĴ­qvݜÀFÀ JeËÌóÏĊ÷Î9g}+šM4 n›uÎĊ*ÊZku+ëœÓĈ˜Ê9ƒ4ŬŠÒ}e´Âû`İV½İ–ĴԄ˜PÇĊMĦĵÌǙÄçB5$ Ä ş€;$¤”˘U1‘"‚WóüPSB•$IŻÛínc&CqùñSRğŭT053hlÔ­#ĉiüvÌÈ0SâÂÍaù`w5ĤxZë`SÚ:ŠŜö9™ç}T7ŞíB‰VêK‡×P}ëÀ¨İŒúŭ~6{áp#ô‹ÎgYöĜĉ‰SŸŝOq½{fĝ/íà­Ğ9¤sH,#·Ż‘<F ž­ŒšCm[Ÿí¸Ä3C˘ó­ˆéÍAìĞ$ï|mÏPrÎ[êH8 £Ž›Z) ÒRğ&Ħä%³d-\Ġü>B…[Àâü94Íǀħáĵ:ö;˙ġöÏ4f˜ÊgĤf6ám0˘fÒĞ gašó‚”Â5Ni°p°ş2¸e ´µäĥŝÈİçNô³ŝ7lċmCˆˆö ( 6Ĉ,Z+Ü!ÄPG]‚U’$*˲L)Ġ“R{gž83Î5êÒLs³²ñú›{áa£ä`FóĞ#)_M§)Üîm ğIim_Ċğyž_-ËrÏS„Şe@\ |lĝÜĊï‹n'Á]†{ yġóm ‹ÏĊ‘m½·Lë9·˘Jş§"‡‚²ÜEĉĉžs .Ĥ šaow/zDžŻĈò`4Ä*Éğ@“ˆdC™’ü£ bÔdxSišöÂEAiš{;—“ŭğVğVĉÌj0ZdĠ!‚ĥ)îP‚àÍ2Ŝ‹†àÜìvŸ™A‰  ‹ŝé0ygûì–şşĦ”êgY–iš”eYŻ íÓĈñ²À9™e™ê÷ûiÈòÙì÷û§ğŬîiš>~ĉ‘'žûùżû_}ġµş—ŭúOvpc·B˘-$`DÛrÑ, wÓ,xڋ›Fŝtžö“Ú=Ì·R˘C7Äĝ A2òÓ )"ĝŒ`(ǐR„TVT҂D˜'lżĥ¨×˘Ġûħ–áĜO-LÁ‰a"MÈµĊ <3gÔĤìšj'TFÑ<•‚ ħ‘ş"‡êÔĥôß+às‘(Py”JÈڂĴA­ û{tͰ'ž:uò‹˙à/¤/üßğDY äáûBšL&Ġ(­80ÖÏÑ­SwÎÌĵeY–$IґR„îÙ'6ßë pASUÄÄaj’‰Û’`‚ ĉĥ|X0jż|ƒDêğġ†™+êş–çùċÑhte<ïh­ëXı´Áƒŭ#‚‹óôᢸ$ŽÌ­µmç…ùçÁȈ€ĠFÚ ­RqñŠÒ²ïKŜV%t‚™),ʇ˘›ˆH˘ÉïòY·Û͉ˆÓ4íÖu}ÜܸXß~¤{­êžUÛ-rYԘ. h˘ûĉ  ïfš6Ż›_Ħ—*w:Ûg1émon ħhğnšĤJħĴ´ –íFF€è÷ûI·ÛM766zÛ½^ïL§Óy(I’'ûÜWò˙?}öù›VŭÖë·ħż[Ħ o2ĊĊä×yT–9£é3âÂŬìbf齙N·ŝ0n@DCĜYQI¤Œ @JÄħN€5ġíxÛIÁıİZÎ6`Ċ íÊ( "pĊ*İaž­ÛK¸·šÍ„šIe?§ċ3ĝĜ÷³Âq`žÍ“bP3" OE (JƒÀġ€Ŭ:µyâK˙Ċ/ġ~üß÷içbÖ˘DxCžçuY–fÉ=h=XU%­7Ì|žĤİLÓ4M’¤§”¨$9–lœ\|i ÓÚPòLÏH†ŞW`Ö<Ñyw3Ô"0$‡£ùğM[_" ¸‰A×îÖu}ğ(Š[£ÑèÖŜŜŜn]×ġÙıµ2YĤ‚s+Ŝğ d—€‘û ßT…4ß³àe{ûëħ'á°:òù0V9+éĤp²3‹À·ŠŞŞ¸ŞŞ‰ÖzlŒÙ·WŜÙé~ú[ÛB„†·!ô;’´Û_ä’[Q-ŽŸCHCğéòċ]˜ğqİP¸½ġÀ@fŬŞ,‡I’ô51ÑZÖ{Ë-š[v“/t]–ej8v†a?8VŸét:$IòÄg~ñßùÖcżô<ŝ{— úƒ7÷PM şÈĴï)1]4§v@aÈıešÚ–8G0š•BÚÓÍUm ŻF˜ÙÄl ۘ¸z0 @ISşÎ§×†˜ô–éĞ ƒVaíQĴnlNS`j*"0rqŽhÓ=j‡XïK@™ısoZ'~šÌ+@à0ż'Œó6CĦ°ŒrTâşĥpÔï{öïkĠ˙q˜]{)BDġĞTJ‘”rÂÌTUUìoÚı*IĴRtîó]×WJml<ĝìƒLİĵĥSúÁQĤY‹)öCóm3ßöıŒÇŽĤüAçuŬq U(ÀUpĠ>úC}½*ÍHk=ŞjRUUi­ĠKޘ/ŝE`²Ü @Zô:pżSvĞ2‘xEÙèÓ!+£u38ëúÍn?€Yk+cLa­Ôïr£ <Ĉ°Ŝ–2\XG£†6‰l-ĊWû¨QĜ²*×Z”ítîĤ(-:§{Ï=ÖÍÇ/§iÚϲĴ“eYR×µUÒü1^Ö_:Lìöó ”’Ŭn7‡Yèm÷z½sŒ>ñÍżŭ÷;|ö›gŭ}|˙òtè:FW$š.VnZżÓ*Î5ŽàSúËq[ íċÊF[TßW°@ĝób›˜‹fP4DƒGúFFg°` jĤ3ëRĴàx:ÔêĴï:ßğP…ż'€VfMÏh ĥM`ıY÷ š~ì]Á}57Ԑp€ĵûCŒ@o‰´ÛÍ|À÷;>6½ö•R^9hcqġêĉx/1˙­/n÷~}˜½ûoÒ@áRJDFñxLUU™@áı%B·ĉÚ< ]§²,ë&I2Blm<üÜùÛ£ UQOé:×#?ìӉ[iČM1AceÍ3Q9‡ˆ`ç‡ö™áĈאñ¸N`vrkóġQµ›YG¤UùEËŞ¤UµŽĥğ/D ‡İ’ê#‰CpÉĵD**B˘Ü^h]%çc*kmaŒÉÍ­+7Ŭĝĥ&d‰Á ÀÖĵŒ–kÚQ3 ĤNĠ †Œ2oAPMo„…ÑËż€Ŝıħ˙Ĉ铃ëon+†Y–u³,K&“‰˜£,Û^cëŞ£E€tĵ#mmmu7666z½ŜÉ^Żw.˲GğƒáÓßŭû˙ĝçËSŸĜŝ§?ŬĊËW&•A_ $¤~èq`ĠïÂcïŒbïˆÌâ"0jÔg˜ù·€Şm:Šek†kGœL­šD¨*Hxş_Ô§ û ‘‚%Z,áŬ… .€Œ—tğjÒü ^ĵîÍş†ĝHs˙úyW !ZĤĦÒ\ˆ?w<ŬMCÙĤ ”7pDÌJxi ŒK Í7nċ0U*ÌÙçS§ş'ÙĞżšQ•ħ!‹h<Ş˘(êV_‰Z‹Ü"VÒR Î Y’$}ÔPJyĴ{ĉÉͽ]Ĉy—ï(ğ ’w)9ĤĤÇè}íŒouĊTSx=£ñ'×­.5Xdme†*"ŜWJÖÒñ€3 R„˙Ñ`Eçşn}œÁh`a ˙ıDllO²1ÈLĦ‚àĤëÄ5°ažÄÍ×sûz<ÉTF܃CZIäıÂŞÔ¨ ç?vl˙ğ~9xċ˙û76Ġsfk^ J4AGSPï[OÖ3Ñ 0 ‚`Ĉóĵ…ùOœÒ^;¸tş>uSħÖYĜ@ĊĜxR5•u#iĈıĥ£Ħ½™à èôĉ#Z×Z÷”RİRŞPJ•ubñ@Eıá6@‰†ŞS=e‰ĥÄğVŬĞĦĥ5›ÀG(†OġlÄĉާĴŒĥSˆqçwqÂĈU5 )şêÊıġıOÎġÏóbġÌd0bÌP$ĤIëçMA} .P•îo>IBĦ4˘ŭÇx÷òá˘,yÓ÷ŭŽíKÛiLžÛà#ž“‰ÔfEžèZµ PEGƒ 8sèÁG>ŝıßù·= ‚ż~kËĞ9"݁lÄw OŬÊÌDşQš ƒQ- şH wF[úŽŸ`cxІ°ÉgrSliÀyœĥŒĴxBûÁÈŭ!âúq Î@œœ£³³SŒ3Ó!#t ·żÉY˙?FĥŠààÂP‚’²B7áP¤ĦgOîÙ÷áùKáË˙Ż6KV[-ùÖ occcƒġz½ÒĈX ï6şQëw cÂ9Qùaĥ}ù¸0{âGV{’ZîmNfÜ VœêˆLĠŜż¤Ĵq•w½ĊíĥyhÌŜË \xĈĉ'[Ċ\GŜ”™ìY×ĝşw¤ĥݐĤÉ(şp˘ JĵqĠĥ˘k4 ”†Ğ!7Ä]`4ċİSŝËFô˘†İ’HJYUU•K)TO^xġş÷9vĵŜùLBÈd0Şí€¸ß×7xI3ˆ4iA³OŠ  °,ƒ.ñ§.5â=G°>wàáóğ|ߟ˘¨EÑF–e…µ=*`’ri¤óB†^§Ó fff:333ó­Vë`Eǃ 8sĉŸûô‡˙ñï}èÙ%˙Û ëè˘J£e+#ŸŞéƒÊíöŒà¨çêŞ˘î³4`¤tóöVñÈŬ£Ñ+œĥˆúÚôñĦï R†€²gxcÜ)j灚—#23Wœ5Ô,857ħĤ·VČ2‘ÀcÂF’WH×+(EP ğfö|ĝżÒyí?wµËa=ìnG/6|ßOğŬn1B§'ĴMĥ]/ÙĉOEaĥ=ϛ÷ƒ`oç# ݜOŒş‰™ x‚o­ŽgfËÎZ3EsÓ茽Q.u‘“TJ— İ".—6-]gûGr İ;èL#p˜N4…ŞnÛ ÷]öÍĤè'MŞz0TÑLâŽÇ)È&UHz„lyä“ݵ–UUUUeUUġä­Ğ·üt­â}Í=0n™·£ġ“£òjĤ9î\cêjLFk꧈áÀâü‰ÙƒÁóü²œ‚ EQìy^RŞ2ù!úGâ…VĞċw:ÈzÒínµZÂ0<Á™}í}éÈġÄ·/÷Ĝw/tRaF*„Œ!ÁoNŸVJ[ƒ, Ş”šĈ}S Şé´êƒ‘R}!Àû F[VöΣÁ”brĝ83 îĴNnœÒ5Ùı>żÜO,°‹·Ĥ[kçÁ8i!QlĉXÒUEQyö÷>ğëÒÏ7^ŒêJÉ:‡3B$IŞ!Öc\…„ b.„àqQµ|ߟġ'·Ç:ȑ!£O4Ԝîƒ1†ö. E Jƒ… Ë%ĜÜa:ìÁ…ìµ·‚ ˜‹x9Š˘0ÏójD€AŒ;rÏó¸UÒE333³VÖ}8‚Sqğsöóżñ_ úÄŝ?{s?ÚC¨€°Òƒ/˜™3ŞeÒÎħ˜#prz.NÖäRuC`¤Ç¤Ħ~FcŝvŞCgbP‚šŒ1fE ̂9Ñ9ÔÂġ‡i™}. ĤGϵñÀ!8‡ï ¤E…4ݰTjÈ*ÔÑ_ûŜÎŝıü·ÛWŞáĞBˆž‚iZÙÚl'UH|¨:ò˘( 0ìĝ?ïyŜž]§?yäĈjŽ´PRšàù>LT=wĆËÍLd}wւ›™­q´ e-ǘïÉ ìŠÔŠRjÓî-ı”²Q!m'n˜DĦMS)ŬNŻiZv MÊ@Á6ôŬ¨ĦÍíb0ĈñΣ¸êáÇĤ´ÖPJ5´”rSŸéÖüݏ-Ü*‹:dÀ†{#—ŠkzH eGƒ2[WSóûNuĊıÙ88q”ZacC˘ÔÑüĴÌÛżwéÍ=ï/„aĜ‰˘h3‚<Ë2w ŽñġW£¤ët:ÁÜÜ\lġöÇq|8‚f÷ì{ìçŝàßqspĉÏ_[Ġ³17Âd$ÙçÀó͵/7l™vÏİĞe&{–)œÙ#µM•4żƒ){:t‡ܞ˘Žv ŬN4 ÄĈÑq“€gğ iĝñŒ£§í#UU%RÊ~óG—Ċ—û İŠ3áƒĈ `Ôo~ZşFœópŜ4ÍĉáÌ­ ¨fB£”4ÁAıDħ÷vĥôÒIŻĵzÉ÷ŭı8ŽW­¸A:95L#›ĈÖȟmÏÎÎÎĥÛíŭQ ‚àŭ'NôËż˙ÔÛY}çÜÖ6 t4àƒç“ù5E‡fÖǏ5ŒÉÀŒpŜOŬsVÚZëX۝ZY÷Ŭ>ĠŸSµÑVßÊ xo?MDVnŸ+×ϖ˙Œú³YB„D(B¨ ”iŽU!çŜżï‰ß˙ZôêŽÛô9çcÌ·ùJ›BÖëġŞ!ħM¤˜j1CEí ĉ<ÏÛ³ïC_<ğÑĞĜƒ•<ÎÀaçÌê ‘ğSÍ4°c‘3D]/šıĜJÛÑè§Wp3ĥÁ9ôĉtxšzL-§RvĞŞJ˲Ĵ{j (M H¸  ˜ĉßiżö5l§¸›F ÁĤíŜfC LÁOkiİé#Uio5^”x3GgTNSó4¨hh;6$)r&üÍĝ`T‚ \d{˘eĦ!s‰È³ê4O óџùô§~ŭ_>ŝòšò÷Î&òLbF%M3Ĵì\@Pŭ~²ÙìT NzPÊ=ä` AڏFwF c›sĴ?^ ]Ÿŝ …M"fRtíz4sŭÛ³qiŒÍ DĈ͜˜yŝòIûàœ˙ÑŭóŜĞ˙y†­_u+%sÁ9O“$‘ÖÙa{1²B ‚À ‚ Ž˘¨ûŝ.Ï÷÷ïyàc{^şœ!ö8¨"pŸƒ“ġ„#`pJššŞ³aôÖעï>X1Ùı/GJIÛJŭ žÒEìn³M)ċĤ”2­Ş*³.ۓTu·)7 (½[°şëô^ġ0Ş›ÔK˘@ħ÷Úv•Ӱ⌏ĝşá>“.˲´´]OJıKŻ­ÏìÔ̊ĴÀ™EFĥ8pĵë0(íĈ Ṵ̆Œx˜ìŸ]J<—83§UÏü’0Ȏ=ş›ŬxápPUWÂ0œ‹˘h3 \Ji_ƒ{Ïuô<A ĴĴğíxҝ}˙ÁOüÒ׿ĝWżŝÀnìùK]0ÑÀ•u½£ĝÖS#Ħ?_¤áÒtä¸ ÷ŒĴşNġ½ßîġV·ñyÀbÁfc-%e#‡`Tż§5 mġ£êĤ½˜`PZÛܞ:1›o;²’hÖtúŸw=o²|Í͘é*-9ިӊ?ù‡_ÔŻŝ˙fĜµ—ĈX“yĉYƒ+ŠB98TG– [­V; yÏóöî?ûɇĵp&ĵşz#è@€Y“FÜŝ04nà!³T]_÷‘꧃Xß1ĦíhtzñwVeé"ĉĉÔ˘4ĠQR–eacxĤsIJĜF`0Íçn´0Ħ°Ĝq€4 T0E?iÒ`í8˘Û¤Q߯G4̀Ĵ–R޲,‹²,ÓŞŞşòÜŻúŸü•£Ĉµ—%#ë€96TíÔC²µt§İŒĜ +ĞójÌĤÜË*xö ëÓ-g/5:‡N³âèùo~˙0 8^‹˘(-ŠBYÚnĝš‘F,Š"ŻŬn‡sss™™™×èkż˙o~aχ>µï‡×3ĵzµ‡€1ĝd…ĵnŒóß`fa´µÎÁ€­QÌQ€jçmzFR›jJÚX†ğ&íĥ²ċÁꃍÙÈß#0rŜ`.ˆÓ¨eLwŒšŞžÒ= “˙T‹l·•żfM߈‘†ĥĤnX‡ ÷•ê‡Âú‡"hÏP*—PaäÍ|ôw>QÎüĊ\rîÛßqí†ìmÒëġŞŞŞÔPĥҖ )/2j†ß÷wyž·˙ĝ_:ĥ–*¨B"9HJ`Öş§ĝM ĵŭC\; 6TÁÖm%ĉäjqkTËmÍĤj&X§7á—kĠlP^Iz†ĞŞŞRVwF·'ğ0y7ßğ#iğji €Ú$°rİşQƒ¸*¨zIEQÚĊÓS·Ŝ×oĉ 3‘âÌg@ı•ZáVĈ=`†Í=û†-¸áëÍiĴ›Ê†Żo²|„ħsaŒ£Ġê 8ġ‘ŭâÒ ‡ü²ĵEÑJǽ4M‹Ħ*i`ÖCÁÂ0³³³ÑìììL§ÓÙcm€NvĉĉŭÇ˙î˙³lßÉıgŻĤ¸¸”! Ó ×ÊR> ŬŸfïSz°WԈ›Ÿ†šĞ 5×WәÒŬ#§úp}=‘ġĠŻDށĠHt{`4°`Ù`ġS&ÇôîQŭ˘,MÌP›´šù·şjRÖ Ġô[4˜ĥn×vóÖÎ:‡KM3>P)“Јà„*-P °ÙÇ~ċl{áÀÌÒŝ?ßdŒ…˜<;·Ôëġz%ı‡Şڎsî…aĊqÜ pÁ÷ŭ}ûN°˙Ĝ‰'˙ñżŭ?·éÍÇÏ]M°´YÁ'‚ ’ÊÄĜ4fâÒĴ 1ĞÁh‹j#`–ŠCÄPSsĉġ^VFŭ6Ĉmş+g`uÒĞRŭAĈúfEéñ•Ñ$0jVé¨hgqXÛRÚ,İÍLY²“sۈğ;`TżŻW‰Zug×r3ċm"‚[ċd½Îk[% ħá1ÊRnŒ`3ÎP…DžV˜=úñÇçöŭê•żŭOßZ ïş†Iˆ¨p*ŭ@ ‚À8Š˘¨ÁnÏóö?üÙzR²Ġġ>¸ÔŒA j„5ÚŬZh°neîÇîÉ~~T3Kh½ ÉŬĤÜ·C\¤¨{ö°›JİDJ™UUUJ)Í}›Ĉ›nšÙ Û;›ŻŭëßĝĈ7p?Җ?Äŝ1ì]"í8°bÛT\Ó<‰_cMöüë?X^ĝÏíK˜2žÎ>Áx`}SNÖ8‡4 şŻÖ™ F @/W¨*í¸ƒğ&Ÿ6·ÇŜQFyòɃxëıCAPŜ p5Ž4˲Jk ‡§&ß÷YĞĠòê¨ñ™™™½q ?üñOŝÊżĝ×ğ.ï…+=Ĵ'DÊ¸S“5ïĴHşñû˘†nì Ħl5£?Şт;g¤ôˆùŽğFŽôžyÜV Ì Òü^ΨRƒqèB4–3•Ñ(ǎĦcĞËkÁ3(­àÓBbóĠ'bœ9G-WK¸eßPT g)‚Ôp2‚`"ĵïqnÄ xäC§+@U­0„@Ë·ñĉ 0­A²›µŬtÈP1M„ë^:nrĈŝn3lÊmċ ˆv· m $èdT•Áxl6@ßU c£ŠïŒàșKQŠúPd¤áŒ; '<Û/jtᜁÙÍŜ¨ëœqFÂF·˜üfë­§4JħĦffwµN}íßġòßŭO3¸öFhĞ%ż%ĈXžçı–RêşwÔjµâ8Žg0ÜíyŜŝÇ>˙ŬÌ[\ÍáÙx ›Moŭ{rLNeDCÂ$s(°6_C[ 7`m?§h … PŠ=3lƒ›kßóĵÀ÷ŭ0 COJɔLk= …6ö|·ú<ï5ĝì@ ĠD/ˆX4ĉLÊ&ô ĈXó6çœùïAÄq·ÛíNğŬžp—çyğ&¸ù[87ŒÀóì5ġ9tħ uë-”žƒĵñ:f#‘âĜg=yàóĴ,£’áŜ9&²R9â0ĤŒ½ûk˜‰qWpÈ_kÖŞ +g2x˙cŒú½¨ĉ9ċ$+°ħžbĥùÇ>˙/?}ù?š]{ë{ßgŒEBÎù€MĈX‘çı&"AFQԉ˘h!‚ŭğ{àÀ‰GĉŸ{ğ لWÒ}gôƒıE36í^ *#ûĤşÔ0%öŻ7}V­î™Ç…‡ÑĦ͊ó7:AìŠ˘hW§ÓÙ ˘Üó<e•eİ ƒ§ĈgNSáLĤQûëŻŭÚŻí$ĜY€4-`¨¤Ĝ„óé¸'wŒ|ßï‹8ŽVĞĠn·Ûğ[­Ö8ŽµZ­O>À/ŭŝż;u+ÚŠ‹="x `ž 2Ğ`CŬ9J$Ŭ”†êanŻÂĤÜa£'é<>âÁ3€)¸qq°´O|àtXœùè“òġ܊˘h-ޤĠjIĈXŸ™™iÍÍÍÍ·Ûíŭ­VëXĞŬ~Ÿü›˙ĝ³ğÎ<ëù).,fP eúuĴFóvÓc×Ô(éjçíşBRۀ‘´˘İtóĥş[`´•33'\O€ûLÈ_úkĝWŸË>rbÏeΘŜ”WÂĊsïÌ-½ÍĞö^ÏÛs ŜÁ;ûÀD̀³ÔĥgB¨ê<ĦȳĥMÚ"˜80çÜD’)Ôĉ"ÔÚ;×_ƒĵñ˘j=?2×Ú8ôÀġ8tNçĵ—ċ§¤ó;`ZJ¤ĵĞ`´Ey½ ĝÀ]"\í'xpB”ĠQŽ“ġÇ3b|KĠ[;÷×Ĉf ٠āOüúáÜŜıĊç˙äoc!€ÀclS‘+›—ı0 ÷ĝ‰/˙Ú£I vc5³vH'mÄŬÍ0kÔ· ×Û²˘,5 #˙†6]WOġĴ^Í9¤&’˜™iCÏŝâŬy2ò/ŭIk¨<ÏC<–ĤİβLUUsäQûĠ4£3[ċ8Ûô?¤ğûÂ&œ"ĤJ™ô<ϳ.ívğ=ÛjµöĈq| Ž#QúÔŻü£O>ñ ˙këĞz§‹ĊnŸžCÇq×hŒêS- ‰µˆ·Ï͞„&tĈv)!·%`Ç<£Ñ•J#Ž;h?òıcĊùŽAħÇñfUUÊ÷ŭ< À&ĵhµZÇöì}ĝ·ŝ˙é jîPû×R\_͍ĝ P0µiĉğÚڝ˘~ „rĉnŒL…tïÀˆyÖŞ0ààBFqŝ)°wW=yt÷ù²(I)ğŒHòıwÌS­Îm^ı¸oóíouşÚkQ{Ż Á;Àg÷CÌí‹gÁ´oċhş˙äKmzBÚègH(PփZğÚĵĠ½ µzjí*ĵ²[Í<ïD› ‡Z×Cq`YJ™Ê"SIĊß÷çJŸñ^_8pÑ1ŭ%`ÀŽôn€Q_y§,ġ?Av0 QÂĴ‡0OԔK˘š†Œ =Fm…D@ŻW@iÍĉÎüì‰pvïŻ\ŝÛ˙é›ĥJ c·„])ޏÇñî î>|òc>ħûù TİLĠIzlÍ0Ѩ9˘gÔk(@kšnX È\›ĥc R6ğdÁĜĦùcŝ›·üI‡ß|Éó}? ‚ ‚@A°‘e²,ÓUUıs‘£Ò&)˜§ĴéĦÏ`u4)œob7ì`]†~§Ó‰ÚíöLĞĠšxLJÂ0<ïĜ‰Gá_üë³';ßş‘áG·2•†G&ڙĥĤŠĥa–f£°²Ż=èe%ħ~êhtÍ^Ìë ÇäUŞÔˆž }ŝ#òùo.ĊqÜÓZ³8Žó ڝNgoEÇO=úĝ“˙ĝ_ŭǏ/Qäżp‡Ġ^’Œlwv+éARÒm4€³SÀÈÜÊ,ôÀ|1翏êĠoéÇ÷µÎUyúF–e‹eYnj­u˘Ž|ßż´×óÚg½–ÔNÔÒî͕Ċ½Ċ˘jg E~’•qÁXĜóÁ@UtÖU9„V*öYى‚< ĵ"òDoîP´ŠxÍŞ’*OÓܨŻr""!„†á|K]LŝûÔqÎÀÓÓdbÈï‹-Ŝ%ĠóYŠúŜšdÒı*#÷€$ı³3`Ü~_mgŞlè–˙Z›Ĵ"ĤH{ŞR˜Ù˙ĝž~ù?~íâ7˙/ßal5 !V”eí8ŽApè3żüğŻ'š]YLíB”ĉŜ ­6äfUÑ0˘­`4¸Ħñğƒc„LVé͈¤’È •E¤lù‡öüÚ#‡ö>ĥ'}óOžġĵnÛ÷ŭ8 0Š"/MÓ5ß÷)Ë2EA#ԅlû3ÎOŒ1vżTIŜ} D£ÀhxvT0_­àûEQĜn·[Ng6ŽŬq hE'ŸĝâÏ}â“˙è·x³Çĝ÷/vqe­Á×Ĥêñ@`‚ÙŜĥT?}İ0SS÷·ĴˆêĴs×t>éúíŝ F芠”‚ä ­ÀÇÌcŸ=Tœ{öTĴTÁ9ˆ¨²A~‡>úŻ~â+żñûg/Ĥ/\ë"K%töġħ*n3ĝ0BġìÒfë÷…,Y™· F•}ğĦéî éĵLžù<¨nĵ„âĠżÂsüĵŻĞ׺½Ŝ•^Żw+ÏóžRJrÎıïû~Ħïû‘ïûĦ"ò·{ïÙ_ĝ½ġİÖİÇĉŸZÌìJŽ4•`’`Jƒ32ÁgÊY””Z˙ĉmî×_ĜRjl&UżÙÚ ï·eâµ ÉVDÖˤikcaÄ9ƒ* ÎàÍñG~ŝ úŝWžçÍ‘òòäÏŭêÑ××JöÚ­e˘úÁx•‘ĵıCD{LeԀ‘Ĵß֍갚î=#ÛqĉžÀÌPŬËÈ_ú3œ²kÁ^êv{—ğŬîġÍÍÍĠ,Ë2”bŒĠêJ?Ï÷}ßóĵÀúBˆ@Ñ oZW!¸ÑŽ1Ĉ¸½Ù‰ˆ(ŻHeDÊ$ݔޤ”RJÚY”ŞŞŞ²,KYU•ĴŻ=ÏóŞŞÊ(ĈöñgDz`ŝsĞšÏñ`ˆyF >Ë}wÀ¨ŝôÀ,˜0jĉi° %Ái<˘A½…t5_O”˜Ĵq7 Ty…u1;;ŸùĊ˙ÙËO˙ç]ëžCk0Ĉ"ß÷~òëôġġ7–R4c¤5HëĤŻYçl5£ €s Ñx„džAÛCgt`hOg6ÎVnŬgàÄP‡”½DÒĠM$i>ú›Ŭ³ç…Câ­?ŭžçymÏóâZ†áF’$IšĤ,ÏóJJ)§gxžRO¨–žġ^-y÷MSuÀ0ôgff‚–Q-Ì´ÛíŬQ ‚àH'?ôı/òS˙èwşŞBïŻŜéâÂzÒŸ`b¸2ádŽ£÷™„Ġ§×1g—Ú7Ğ>Ċm$U?ÔÑ~7—dĉ&ˆY.j,M×ĈĦĦ,Z\`ĉĦï*ßxú˜Ĝ\ŜÏ£_ŭƒwì‡>ħûĊĊo.ĤĤŞêF½#X°×ŝpĞîÇ@ÔUŽv* a0¨šî15·]ŒàY˙0ßTG:_Bö£˙{ó›ĞûççğŬîċ^Żw£Ûí&IÒ-Š˘´dB€1Ĉ<Ï։Zĝ/,ç ûb£8çœ3#çĜ’ˆHiû˘”’ĉ%•É6‘ÖECI)µRŠ”Ršˆš|šsNB.„ŽßúÖ³Ċî_ĝLÂŭĵy£x$uOÀ¨İ”9Y£:1Dqq²î }Ä@ğ ĉ֌5q#—ĉu^VÍ4‹ÏŝL"Ȓ°ħAPí@ŭ™ß},˜Ù;żŝú·—cü‘O˙Ò^ż½'~ġeèŞ‚Ĵ´™eSşá TF° š;+jĵë÷ñ÷M2FÈíY_ŜîĵkŝnÛû%fUŒ{ s†ŞÒ(Ó7Ğ ½¤dû>tò#§~Iĵġ_~Ì×.Îzž7û~ìûŝbĞï÷„Yžç°Ĉ³nuT˙;.çìĞ–ĵûŒ&UEÀèhôÓ8Žƒvğt:NğŬžxo†‡Â0<Ŝ™›èËżù{ŸŜ˙áŸÙûìrŽÜÜD·P€$ĝŠàÊߜĜ–²‡šöĵ˘{*s¨6`3İĤċ‰ġ9:²ƒvĵ~ğ²:vÔĜı02ƒ$!™Çàûólö żu$ûĉşô˙î˙xÂ?pŞóìµWÖ PĦÌŝbc4ÈVFäXüô… €Òz‚Ğ]d] 9`äÄF˜ž i÷Ŭ#6F xòP€µ|NPĵŝWèĴœëžÚÛŝAÒë]L’äF’$+išn–e™+™ˆìœ ŞŞ"ĈœƒsÎ,Àó=żùÌÑüü_~WÑñ<ŻAÁJëI’¤½^Ż,˲êKùQÓRxĠÒN˜=Úр4eU´xĦİŒ˘(òZ­V033u:™Vе; a ‚àä™üc_ĝgĦ[˘ü· ]œ[/ +B>™ı&xV1T£ÂYĵşÖğ:ÀÂôp³”ĈH²\˘°N Mó‰úĤŞÚ&uÖ=#bĴi€úv.Ìz̙ŞĦİÒ°÷™™ĝ~°œÛ<{aËIe†/5Ù9²‰­î ë„ä ÜÜ}°Ñ}  ĈÈݎٞÑ{FÌнnPĵŝMˆ‹ÏĉgÎŝ0ϒ‹I’\ïġzK½^o³(ŠLJYÛ˙o™~'c¤†!ƒZwràÜn£Ĵ9oŞLŬwSŞC›5LD\Jİò<'!3xÄù çâAñ÷ñk³_}R1.˜7 Ĥ¤ġ=£ÁJÉ9t‘™m ôù[…~ÔĝŜ Î,pĠUlċ`¨f#vè ÌĤÌì—2JĵÍu‰² ħëÀÇ÷~ñ·Ÿ˜]O}ïܕeT•„Ş4”T˘ĥĠıĦìzVNu¤ħµR"£Ĥ·ä,:6f{wŭüšQC”,0 ßŝíà(‰£*+”D¸~K˘›J~hÏGŽû™]ìÍ˙òĴè^ŸñƒŻŸ÷Ġ„s7ıĥġZ>£´UÀ0œ ÚM*Ô&żÔ†³ŝJİoèĤßd*/mъqjÌ/IÙM¨6áÔ&QĥĤDô7 FF4 ßĤĴû4@ßa@q×TLşß3R͜î!ĦİŒ˜=°@€GäÍאżô8ÓVcĈ^î%éċn·{³ÛífYÖ³*· “3f&ÖS€Ñí|ߤ•VJé˘(ˆ1Kß Îı·›˙(Èww⛅Ĝ‚Ŭ`B€¤ħŻ!î:ĠŸŻ *ú4ĥîwoèc15îôvfVSíVEÜħ÷éÓ^4DÛuo{šf]ʉoŬ˙ÔÊO+a×ŭUBĜ F}İĝ@Ü/1´ÓĞÁi›sk”֔Ġ 3|X?CÈJYœCċ֔F–K${w/äûsáÍo7ž}F1+„¸AäûŝJ†½0 Ó,ËÊ˘(TUUj˜Ĉ v,(y÷)¤èĴh!œ™™é´Ûíù(Šö‡ax$ {Ž{ìç˙ßüLıp¤ŭçW3ĵĵ’ĦTŞ4Ħ˜™3òĜ gœށ™³XG‘Ö[ÁˆHs3ü:ĝĊ–aĴIUfLCSŬCŞûIŭ>縵_á–Ä&Π•g¤Z~Úô7h‹ ƒt?³¨!M•D379 d !ŞĤ÷ŒÜeÂ͍Í•\CöҟÖoîŽüç{½Ŝċ^Żw³×ë­¤iÚ+Ë2·Ħh˘Ħġ.ŝž.l3Ş@D$¤<ÏİRpÎ=!„8²ö½ ßĠùüzÁfìÌrĜgîĠ_Ĥĥ´ĊœĴKÒŒ`xd]™¨’AAƒfŭl!·(bÍ<™³H7‚„J^÷édrÀH;`Ôĝ.6ê:û6ú`4DC#9I”h€ÂßÒZrŜ`Žj‰¸QÖ·$yÌ5)Heŝ>9²ŞÄ•\˘·yö}ġħ£ŸŜ‡·ŝÛӜwg„3BˆĞuµÔëġÒn·[XAQíO#vĜ}¤¨²ğ-0ò}_„aèµZ-ffĤmöDQt ‚AœüÈWżö™üò?yà\Êĝß_ĜÄÍ^elrÙùBèŸÚ:_ŒÙ•jÚË× MÓÀ}NŠJ!IċÖżŝkU•ÖgNbĴ‘}kTH£ĦÚɘl.g*žħ­ôCo€ÁĈ†+nÀP¸žvÜĴwÛ3réğğn”ꀑġjâÂìv<ö Ë5ä/ŝĉğ׏îi˙ I’K½^ïz·Û]J’d³(ŠL)%aĈcj@ŽĠG˘{¸ĈÇ sğ³sµZò<çV .8çÁë½şë—?›I/b|Ö k[+[qwÁ¨Ħïô›×šçfÑoŝK+S­ePĜġ}ç꧘šgrB ÉıßêuZŒÈŞêšħ=,Î1k¸ĦjúŬQßĠ³H£.£ú>³½.ǏÒÍ{ìÓznÊ5­$Ż>†^]͙9-Ĥ$TNX–YV!=x|ßİÇ˙í/zWŝì(żġÒ­ŻmiĵUß÷7ğŬnž$I™çızô·5Dû~VIï+ ċ"ħ)N7ĴïûĵĠjùN'š­ı÷EQt8‚ =öĠßŭO‡ÇœûÛ[ž[ÌPH Y($£8#BÈ '.·ÒîĦôHws´ŠĤŝâuv.rúKÔo.+Mèġä<ƒû3k,ÒÍ/֖¨OŠÜ‚EíUĉĠ”1ÓY"fç“ b†ĉkTBÌ˘!@Ġ“í­ú|{sò¤!0˘ŝ|Rŭö]#Fƒ`d³u X(–ĦxŭŻ^)9{pö™Q…Ïĵ ²ÁúÓİwŒ\Pb5U ֕€ġzö€Û^"nM‰˜&fß7Oë0(ÁQh³Va aÑ,P_MׯžĈ€QS9`ÔxMĊÈç è&Ż£[°×Á&ŭZ’Ŭş³ƒa­ÂcÜ\#Z0‚Ħ°ÚôúneR˘—(ä—$z›­уğÎ.ŜŝÓ§8OĉĴèášïûaEëa&I’”išVUUa°LŜù•ÒNݐĤ‘tÜĴq‹ÙÙÙ°ŬnǝNgĥĠj펢hżïûÇ0<ġȧżİO˙ŝ…Bˆï½‰‹Ŭ T*³Ĝ™2'ŭ°;†-#äŭ&§ÖŽżĥÏŭYwÎÁ żJ­ĥ‚Q#²c `â‘m’6ê ĵ~ m˙¤É™ıáıÖŭʨĤéj҃ɠ4ÎͨiħkE6"ÈPġI´>Êş‡¤ú=%­‡nè{F‚>‹˜ŻQù÷Àù˜}ȳ ½^woäyžVUUŒ#µ ½×wŽÔ[ v–İ,K˜”:+÷fĝ²˙ xĤó:ûü‡Hƒ#˜ŠÂZ|ô›ŸwŒê/RÚĜê({İjħ§Öx֏œ²ŭMŽ&ìħVÛġ³ż\0ÚG‡dÙÚéy6ëĠ@Q+M&ÁÍPĴK N8†A9ëÒġ]ħטٙûġ}/!6h-Ö<ÑfHXpÀ •bΑˆCR…[Ë ’´BwßN|èßürÎŭˆŻŸs>#„¸ÁMß÷ׂ èAġz½2Ë2‰Ñŝwcàïg•´S)ğħî ïóvğí[0jÛ^Ñ0 Ap˘3żëìW~û÷?·ÈÇvw1s+=ôrU(Ž­œ“ixWSuÎëÀşÔÔÜÍֆeì½ mèÒL˘Şd˙ĈĤĦ½˜ġoşZШŸŬRŸ>ëĜn:gT›êw'‰\çñ~(÷Ö żĦ)>Ŭ™`Ż\ĦŒšDXí¨ñ†ìÉî6Ġ"›kÄP]zċ+ßROì_ĤŞ8—Ĥéċ^Ż·ĜëġÖ³,K,U¤÷ğ‡ä‚Q-¨ƒè+ŬT)¤,˸%sîwĜà4ŭ&ûäiĤ˜Òj¤ĦîĠôħâvH&ÂBpôÁ9ówue„ÚŻÑŠ%9riWħ6Fν£ġt[ğĠ½>Bŭ5< 2­­…†jŭ'ɚ3=[÷q]‡ġ1€XŸZnhHŞeJ£'êëšà €²ùÙçUeÑğ — ‰$ëćŝĉ§÷ï}ñż/„˜µöC×moiÓ÷ŭ^†€ˆ ÷ƒĥÛi=¤‘’MVôĉĉĉ˘N§3ßn·÷Ap" 3G~ô_ŝ?üĝj0ŭéĊ^[- +mĥVÊlÚĤg´•–O* }.\0Ö·÷Ç`ĠUÓ Oyׂ­^RĦRä,xûkġ€ÏòÊ}‡‡FŻ0”!ÓPvö¤ÉĴožfŭĉZŬŝâ59`o‚AŬıEch‚Ŭ½ÑŬYŬŸOrenŒê7`ÄĠğ‰üċżÀrqùÀBì*êVĴˆaXQ§Ĉ€ÒN¤á·ŬáFŒ{,ZkH)‘çyVçÜçœû'ĝSÏs?˙ı*ì°`Ì÷Ae52úün€‘;ô͈ ›˘êhëè”ZÚßĴûnÙÌÎ& 0Β%‡bnîÁÉĦízG5i·_ZS™wŬ(Pê'Ĉ6²tfÌR›#×à0ŠXĞ’ĞUy5Ġ sÚáPüµ&¸ŜuZ S-•Y†ë7*ôÉìŝĝé“gĜ.ŭ·ïñdħe)ÌüıDyžË$IÔP…´£¤ß;­‡4Ş:bDÄZ­–†aEќïû‡âVëĦ/üú?˙•ŸúÒİW6${úü&V2 %ɄÍUÊ,:h8ÍÊ!02§'Ö$=rИašO1ƒikE‚“šÒFâr úö4P . ‡nk*%fXll2càJ›Eۄƒı§Lm-‡Ü ɜ“Ù˜¤LEƒ3NWƒY0RΠa­şğk`„!0Œ30>İò×˙Ġ·6Oîk?“éZĐ$Éfžç™”rXQ7в%fïĞ’8Ĉ§ş}¤ŝHŞÖĴŞ*Ĝ~³ÔÇ9÷Oóï´^m}ċgr&ŒĞ'@5§ìğ F¨é*ŽfĝÓŬ|MtŠŜÔk™\şŒú²µNM=NÑT2κӎÛHÓ/ÒÔôšúj÷²—qùıüჳ?ȳ´VÔ-÷z½Í,ËRŒä0š–£IɄŞ~\Ÿtĝ”:äÇ3Y\ĦµFUUE–eŒsŜˆĝjp–?żÊö£’qŻFÂPĜŽ÷`Ôô“*À‚x=@M%ÔĴe‡ĤcV™Ĉĥ”ût9•ü֞§+í1 šğ–A×äh‘s|-9׍(ƒÒċġ|UsÏöÇ7ÛZġ5ìƒ=è)½Ñ•1H‰\^×èċ÷~î£ĜûÀı[˙ġ?y^ıÁ†ïû ñ­GáÛîŝdÒóG T7n„BˆNûĞ˙ô—_÷îşp%ÁġŞÔ•Ú¤Ú[ ˏGÜ<öe/Íàž4ÒD•†sUàÚÙ÷Јͤ‚Òş_eŒ0ŒŸp Ğo cÈ`Àˆ×UQs0fŞ@îœ6ëêŠ9{ëÈ£Ï0rŝNíJd‡h<Ŭ—ŬŜ0‚ñŜcĦĉ10Èßŝ.ôÛOU>8ûĵ,óóİ1ÜìġzkyžgUU•VQ7Œ&Í +ìĥğ9ïäĈíÖúP 1û÷@)…˘(X‹Á9Œ1żn§Ċ³sô݇µfŒ‰–=ġĞ&Ŝán‚‘ğn5ÈĘkS™ÊÈVÌĦħìŸÁÄE4Ĵ'€;‡ ²ÚÉ3ŞĞUƒÒXY—û ÏMˆ òŒŒĦÁ"WíêúÛ9½°šu0z 0jH?Kĝ7{êFŠĠLCŬĝñÑCáÌçOEKo!<§ uµ~Şeßl\³·Ş*Ĥ”1­5Ŝü‹?~néç˙Ċé@k„Ĥ2’ŽtSê-6^£À¨~İìÂġ45´#ŒôĤÓî´8ĦVĠDÈò EİĥJğoŒ†?gNĉĠ=# ×ÄQ5@Ċ4 ¤qşÒo4m×ŝu!ç´ċšJ’uûP- QÍß30ò9˜ÏÀŽòúQü—úCğaj’Ĥ—ğŬîb·Û]OÓ4-Š"Ÿ@ÓŬnutŻéşí‰ŬîÏQJ•eY"MSnÄwÂBxm~Ŝ?1;Ó>Ż?tœĊ˜çÛ :v×Á¨ĦÁ­°éJ‡1ê;7Àİŝ™îSbšMX#.•Uú‚QÓĴŻ669͍­ÑxÁħîŭUí²SŭŝĤò_¤ŝÁpäĤ~/Áhĝpë(™c(È ¨ §6—55Ù{žÎµüfħÔ=ĥ·óbžçëeY&EQTeYB Zv€a'ÒÈ~’”Y–Q–eY†›žç-{Ëĉ^ùû+|ö„’8÷ }4ê8]p·žFîĈ|1mi8šÏ…I­|/ÁÈ}0Íp.j£Êa§ç¤6ŒĥKz“ϽñµşKÒn6DĠ1SñH€´\Eö?ĊB÷òúѽíg’$ıĜëġÖ`TE.,1YŜ­0ÙŬ{˙:şÇk~¸Ûé ĥÎôÜC\-όôN¸n§ùßĊŻw~ŝ³½‚ĊÀÉÊ.şk`äʧë!qĤYC[5Ġġ£X³Qğ÷Ĉ`_³ş×˘œôXŜ 0ڲߌPï=ïÜ.Ġ/ܚ à”/‚V_Ħ³'[ŻTUu£(ŠĠ,Ëz6&ô,w8íÔ i żže™ŜĜĜ(}ßïùż*„¸Ñyñ›ÏmžúÈ~ĈYLB˜†"´ĵs0\4a{²À§4òTo`4ü}Ú;ı• î\ëÏ=1 4Yµóğ·œHqÁ0ònÁÀL2˘W x雈_í=t`ĉûiš\´³FËI’tó<ÏEž’žğeŬ¸¤Ĝ-N:ŜĉkĤ½ÙġPµ4éà6ƒµrpfg”X=4Ë9Oµ^ öŠy>‰›£¤ĴYß50ê/%+‡ĥŭ×-˘ĴŻa#gAÒ@ßĥ>(éÉĴÇû F˜ô5wŒj÷g­ÏoÀ^-ŭ‡ÚÉòLż–eĊÍ,ËV{½^–$IYUĠ¸J{ÇĵÜñ°ü8EA½^/ó}ŬóĵEÏó.ï~ŝÏß\ü™_‚Ê`qñ†½•Ġ큍œ-ï}[šì0J‡gĴO£FŠĞGË҈Á£Â½#˔ڽ;òWváûċ#gž/òì|šĤWğŬî­$I6²,K­˘NŽĦê†A‰0YÀ0ŒFË4 µŬ× Ô¸áÄ”ôÔĥ›ÂÈ´ÖĴ(ŠÜŝÚÜë°%˙aŝtëUöĊ'À'oĤ?Pv—ÁÈ%6FÌq¸>üı.úCA’D[~*Á¨ŝ>a5 \€û!tïá˘vu>ôÚ Ĝ-V6÷̗Š˘2$yžWEQè1ëiš=÷§ĥµ„ħŜWEQTI’dÖPóVµıviîµo_ĉ fÜ„g']Ioó[Ĥ#­ y.?£Û£òn.xì!Añú_Ħ³úÖĉ‰…ĝ™4M/Zş•m S§İŽ4&§ÀŻ`4”h (aġ¨'TŒ €ÒZËŞŞÊ,˲$I6şŬîR’$WË<9˙PöçB½R’Ü„W/t0íĈ’F;ŒjUŞe‚²+ 7èÁ#­W˲ĵ‘çùršĤišfEQ(­‡Oâ·<ïuüÄN$چÛrA˲TY–I’tÓ4]ÎóüF땿{‘I]€ vĊk§ÒğF€€U€ÑĜȀ3Ç!Qñ-x—~˜?²ĉy–½“$ɵn·[Ĥƒ‘ĈôB†í¨şF(PÒSVKzPZ·éWeĥñÖÙêé‹jMRıf@ÈŜ3Ĵ ôúŒŜ_0rqÉTILjċÇ8ÜɗC.ßÎó|1MÓµ^Ż—ĉy^J)Ġ6-‘q‡³÷í^x_i ÔwњSOu™Ĥi–Ĥéf–eËEQ\Ûġ?}Û|QeäĤœ›CcRA–ú0şc0²úBîċù§ ßüûêħƒ3?ŞŠü|’$W-´áĤÊ;¨†Ĥéí0ñXh PÚ„†A\)UEQĤišvğŬµ^Żw3I’+"½ùúCôܛ›D:ó=0ßo€ÑûFßööj™· 7߆H.¨Sû—ʲĵ‘eÙJ’$›Y–ċUU WGÛ ~ß+ĞĴÛzÙ ˘†QyĤl>])ìÍĠ ‚`5‚Ċ™w^x-z3Gó™óLtÀ<ÊGm´·FŠy"?£iÁhĝÙÖşHp°È ÊĞÏĦ|ċŻô{W™,ß°Šş[½^oŬŠÊĦÊh5Çl;JQwîiċàġżn m=£¤`ŒXв,™8ĴY{Ħ Ŝ OÏÌ´ŜVOž€ĉ ä>£÷ŒĜ‘%ß!‡^ŝ!ÎìÖWĦˋVȰj†ëêhšƒÙŽZ˙|ÜpÓVH[NˆZk]–e•ĤižeÙF–eËyž_ßġƒ˙ú |µÊĦ% ŜÏi¸0Òòž´j´Àh*0r·OÎê,hkš È[o |ù/éĦYv!„|5I’+½^Ż£TJYYƒ@“D S)êv*9˜{d; odUisEšĤI·Û]K’äF–e—v%Ż<ˆÎ/Qş ´J.>X%}Fï=Ġ•Ş‚s½üby#;ĵË{ħ(ŠĊ4MW“$éĠĠÑm²;ĉ>Ĝ‰*ğiTFÍͧµVyžiš&Y–­ċyHĞ7.̝˙Á-i‚ż˜8hş#0’…B˙9ŝŒĤŒ3MníÑIpĜ‡Úĵ†üċ?Çĥı8°§izı×ë-ڍ1)Š˘¨ŞJâöúCzLE´cĝñğJĜĉ¤;N7üÒZ+)´}ĜŜĉĉĉj·Û½™Ĥéċ£é3Ï,°ĊMŞÖ­ï¤ÀèÒt.&YĠ#c | zí%œ=½]Uċ5Û;ZÏó<•RJKĠMKcżï4ŬN¤ín°‘ݵĤ5˲8tv´qŽNˆß(Šâz–eËišndY–•eY9ÌM:¤ŭ+ßkÉ÷û HÎKÛÜdz BK)eQ5(­dYĥżö÷/{½µ”¨0â†fvĝ¸~Âà^ŻÍÌQ‘WwŒà=£À¨î·Ö·çĈĝĜñFġ·sċ(ŜĝK?(?:˙ĥĴÊEĞ ZOÓ4)Š˘ĴŞJR“É›6Lï7@MxÓŝ- s’Ĉoœ#E‘×jµÂ8Ž£(Šbß÷#ÎyÀóörï|t6mĊħŬ MTvöêîÛîĜQ`dív˜€€ïۏÙ÷ıé“1 ëK8)ÎêÒtγĈ UၪM¨•áÌq™Ty%ÏóE۞HáíŞ£í2ÀŜWşxŸçŝġŻÓ7ñ ĥ͉Î5”’Ĝˆ*İÊóëW˙ô†şĝb—ˆ Î9A ²,óó<Y–ħ<ÏI)ípß4`4ÊKœckDMĜ iDeâ\ƒğ#‚˜ô&EJŒ$6ĵĈóv½ù fq+Ù?œ$ÙÍ4MWÒ4­ƒ*G)Rï4 ì}}ÙInß4âtġ˜›ħĝv=Ïó"‚$ µ nËçŜĝ>wž* „Í ôg‰PärBŝÏm‚s6pn~S 1fŞ!Ĉ ğב½öò7Ùbµ·pôLĥòè×÷jqŒGfp@ôŭ#VGğO–Í4ê“ÑTF° µU!ħ´œƒt;:ö‘qòĝc—v/>ó_f“Ċ‹­ Úq·ó<ò<ó<ßÌóĵ—ç9ĞŞŠÌ|Ĵfc6âúuT4Çôñ̓>Gwızb·ññIUà¸ë0ĥ‚ò<{žçEQÚ u&ŽÙ(ŠÂ0ÜÁ0 =ŭèCŸüùß8•GGÚßze ÏĥŒ^Ż€Ç´+ëïİşI€%Ì4ħzù³&ĉäŭŞŒŒlƒ<&|è[ÏWż­OîĦ›ëósiëĦˆÏ? ĉ/€XÒÊ>veĉÍ&ҕw2<á™êH.B݊3G˘·Ê²¸‘çù­,Ë֝ Êí\LĤí½ŻĠю¤!ûŭI…ŝ¨êÈ *Чѵ”RĤišA°†ár7;/˙Ġ‹|rŸŞÈgA nċ•Ô}­ eŜ=5„hÍ[& à`‚ƒ‡ŒĠê%äŻŝ=ŠsÏ`Ħ\ß|äŝ™èPÂXêk/ÒMáïC|!˜ÔĈGŻĉI2ŸŜ£ FM,:ĜàœŠ¤6”ĵ}ş8o€ky=G7—ĜżppöÔ/ŝŬ·ĝü‰ëßŭŻ/ŬµĞQŬ(Ërİ(Š•˘(Öó<ß°US^I)ac˜k áCŒë(PbcèżQÎìÀênÑ¸jÛPvp@ˆ'!„àœ‹ ü0 £(ŠZQµ£(šp!Š˘Ŭïïġ}˙àžCÇO|êç˙ɝcO.üĝü&˙½Ë¸qĞ]IxÌ 8kֆַ——†Şâ~Ŝ³Ÿ}ï{F d+#ĉ+/B]û[zò¨¸şwĠ;Ajq)9·Îâ[ğ{Áİ›= Ö>TĈ¨²WQVˆy_{÷ÀhÔÓÌ •È|uġGĜŻÏ„Áı^ݏ™Ĥéj–eu6˜œBú~ގvL…ä€Ò°mHzˆFQwRJYfY–„a¸Á­ îzéÏßYùŻ>¨e&|ÈBmqí63Gï²gT߄µ3A D à BuóMŻ?…òíçh·î­?şÏ;>Û{CÊ2év BDûŞíZóŝ  ,Ŝp\ph" ²›½—=£A0böéaÎ}ÄledŜ%óĥŭaÜŝ,•KÜ\ΰ™JvĝÀ“{Nŝĉ_PŸ]şöƒ?9ß\½EÑbUU·Ê²\ĥÀ´Y–eeY–çy^–eUU”R˜â2q;ĵĜ6D̽ĴŽĤéFÓ(⸂GQĝïĊq…a‡a8†á\† Aìħ@t`ߑ“§>ú_9ğpâ# oŜÈùŸ|çÎ_Ŝ‘T?dûždİmnu7DĴê•%ğè=#a*t.@B€ûĈûM]ù<ĵ×çZŜÛ½^oMk]µ8÷žĜëÍtċı£—VŜ>ĥz´k1PÊôrH¤œyA×ıċ.‘Q::Tx½‹`›oê3§WÊ2ğ‘eÙR–e›Vĉ]N˜Ù›”vLu´Ó(;ŒĦê0ĦBĠKRx-OÓ´†áJ†7gßŝÁ+ÁŸ:”·÷vH@ii4Û§•6B†Û#ĉ€ƒUë˜APh ˜/Ì@.“‹o {éo!/üHïċÚÑ}{Ŝĉ^/Š|5-ŠÍŞŞR"‚ïûQÇëÏ˙mQ?ħ>[ûÁ˜/4GCŒ-Àï‰QŞÓ9`TT#n 2”$lµD˜j•#ĦLK\Ĥħşˆc{>uàáßŝÌŜòê +żûß^NWo] fÇKUU­”eıVE·(ŠnžçYn^ŞŞŞdQrĊ;M  §UÑTBÛÑ4€4’óqkċßġxx=óĝ´˜î7‡q7ÀÊâŒrè[ÏâÔnµ( /ôĴ!MÓ^žçùµÖ4 4N<öA…tUÒ(@GŬ5&’ZkVUU‘çy–eÙFE·‚ ¸ĥëù?~íÚ˙TdL1t%Ò€"—ÓƒĴŒ˜Û? ˘íş*P^yùë߁ş˘:Ñʑğ߂’׋<]Éó|ŬöM’ŞŞJ"BQUU •GÏĠżéŒóŝ^`>r .Ìٕî% mFKÍA‘³Ş–5‘Gœ¸%ΙQj÷8˜Öĉ_Jä=ÂyİqsMˆûžĜ÷ï|ìËêÊË+ŸŝÓW“[WŜ‘R.J)—¤”+UUmTUµ‘çyŻ,ËÄSY…4Iİ$ôWچ.žôħi{Kì]Ò¨ê¨Ĥ+™çy\!‚ qûĦáċb D3ïÏúżàûŝnÎù>Ïóè‰?ŝċ_=î{`î­k)ŝü{‹¸¸˜@P)x•47ç %ĦIƒ8kfbM‰Ĵ œ9 šž şŜ›ÊˆÛ>'qÜċ-¨‹ŽƒŝÍĠ#ğÛÏġz½KÖ&i£ŞŞ’sÎí5ëDQ´EÑâƒğ‚wNàʑ+kW¸YíŸgğgĴu,A8™jɍç`PêÎÀ¨~j…g{]´ö˘êZy|oĝB–&7Ò4]ĥĦ¤™2L“”ĵ]×ĵĵßĠÑNFqú£À#zI2ÜVIĞï/ú‹ïœŸğöÒݵ}ì×Ĥ4Ve!ĦmFló†0ŻÜ²P€û T&(ŜyÙ ß]~UîxKî:§eu³H“Ġ<ÏWó<ïfYÖ˲,-Š˘¨3L‚ ”RÍc'/~Óżpô+ÏfỹŬ ’À|nbÚaäğZé{F[èIÖżNß İŒ\0bÌ uŬNÓ&ÄÎ\qÁÒEÉqQ),yìÂÙ=ŝúŸÇÒ[ßxñï/.ŝÜJİEԒRjµĠj­J)7˲ìE‘”e™ċy^ĉy^EĦʲTRJ-ÔÛPy·H„w7ÄnĈ‰àˆ¸!/Š˘°*Añ}Ĉóĵ9ß÷„ğ…{<ß?ĝĦO}ċÑG>ŝ…£|öpûÜġ?zêŻ ˘„P JÛ ĵRÚôò´ˆ1pfL`*_£>ëW 44<˰5ÏòžUFœB ˲ċ‚ó<Ï+k›CŒ1&,(ĈqΉ1†“WÍÎċ/:ñp¨²[ŞD0Pï)1{úu{×ŭŬÒ6’mĊXƒQ­Ìœ,v3p2U \„*.dOJpk£dûĉŽ-œúê,<ĝ•_déÜ/=ûÍW³ġċ+JİeÔjEkRÊ )e·ŞŞDJ™ĉyžEQEQeY&ĞŞREQ()ċ$@š¨<ş ŭiŞĦQQó1ÏóX†"Š"/Š"/ ÀÊĥcß÷[žçĠ@4+„XBìBìŬìôİ'>ŭ•³GÏ~t÷FÁ½WݧxŭĠ¸µ’Ëİ5ˆ”YÓҚmÙÒW[jV˙Û?—lÁfo÷´gÖ¸úx‚ÊeÈK‰=òüĈƒGçžI’¤N"^îġzdš„˘(Š4Ïó^–e›qŻGQ´ÇñR†·N̅—/,ĵ²ŝ³7Ö_Üflî4Z€€Ħ•TĠ§ßÜûM:â4wQ2µúfħœì鄯&IqşÏôl´„B“dŜz’a'TG÷C…4ŞÙLĞ ŜÚ(ʤqw 44Ŝ½£éĜP Kƒğ* žóûÓüĴ9<š Š5ƒ˙‚1[%‘­J Ğғ@şİñvZáâ’`ğfÌŭâ?òáŻŝĈ£k—__[|ëċk×_ŝŜZëU­ġşRj]k½İµîJ)ST*̤”ı”²,LOVUU•eİŠ˘P6[K[šïN‰Ĥì)m$Ïó˜ß¸ígˆ DïûžïûïûĦçyĦçyħ˘m_;œó9!Ävpáàİ™žŜ×{¸pn+k™­jA%Ħ•‚ĉ Ş´JE-íAŒ,-gÖg€ĥ"Ĉ´9hP/Ÿ˜£˘{¤Ŭ³B\Pe*£ùâġî£'w?0şÒívo%I²QĞa_s ´†ÖRʲŞ*^EZE’çùFEëqŻZ*ïÖŝ8¸~xVîğÙŭáÙK×^Ŭ_ĥÏlî ˜· İÒH·kPV„ş`T3.Üì+jċyl'ĞíÀ?×ë7muÔŬFĉ=mäÄŬ<\ŭtTHïR>IàĤiş†á­ î}ùżż}áÁŻ?^äŭJ‰Y~œJŒyfŝ@´|sújóòWż‹üÜÓhwoôÙğûò܉ƒç˲ĵµıııj+˘ ;ä™äy^”eYJ)RJ‘Ó$g˜í')ÊVIÄÓĥD§ñœß[~´…"Ú{ IRm%4ï a¨gԔrƒ1v^!Ôc´[„ök9?.3tžmž3Ûc•™[Y’XYÉÄÂß;ó_zrßC_ùÍuoĵµqó܏Żß|ŭı·Ğ,YÖZoÔÀ¤µN´Öµ‡^&,´Ö…RŞĴm’jTƒ“ĥ³Od‹†*ĞÉ7˜çñtjÀ ‚€1ĈxŬBxïs!„/„<Ïó…"ò˜Ö›×ĵö²WŸĈ|ħ²yfߞwÚóŜ)Ërisss(е<Ï׳,Kò÷v͜Ü}ägÜŭàÏŝĈcÙÒċkş+Wßşqë܏.8ÀÔĠZ'D”j­s"ʔR–ĥ)µÖ•ÖZj­I”VöfşIœµ/¸Œ1îzÒyžÇc‚s΅yáŒ1sŜĵ !% !"ĈXl˙m[ šaŒÍ†q{áĜÙŸL0Bżp§)ÎĠï§÷|Py Ġ;Ž=òüú£'÷<eé…^ŻwıÛíŜêvğÖÙÀM"·Y×´9³ÀĔeQY–eIÇŬ(Š6â8^ p9Š˘[ axc˙ájßRúڃ——Ŝ<ÜóNĥĜ£`ŝĉ×ieĥ\­BKóи`(ĦV~Œ÷â£ê˘ Ŝ[³ûH.ĴFѤœ°q ÓÒ¸—˙ï·ÌU’şO8ŝ˙­+"ċѤ³eĥ¤VŠiêöÎôiúž~ú™Rħhù( HSb Ù ½+0rN‘ldv³§²ŝ}l ˆ8:[Ï3âuH”óĴòzÓa0n5TkHÌ Ÿi;¨ hi2ĞVò ‹K€›míž?xòüC}éè“˙OW÷VŻï^~óĉ­·^¸ĴŞrƒˆj`J‰(·UQIDUZ뒈”}_Ù×Ĉ|Œ\P2˙0n_ç\9çcÌcŒŒħ€sî9ç!c,bŒµk Š;s G|âĜÁ“îŬwäÔLgÏáN7SXŜ(êjĊwnb=İ ˆ  ÍˆL3 dqÌşÔCŞĴ6ëŝlu=ìJDŽ÷°ùD›úŜu4yĈšÑßíp=f‡^ó}èüšQÓİwÖÎßġ=Û3şÚív{½ŜzšĤ`¤ħu^mµÊ-0I)%ŻŞŞĴŞ*ÏÌK/Š˘Í>•.͆á͏ ön”o¸táĝ?Öf €E큔˜İR!|ó‹8¸½úcÄòzqdWôBš&7êĴ£4MÓ!0ş‹ šP ÒŻŭÚŻ}H[ñššf<Ğ›œĞ’†‰M íĥ€’•'Q­†axÓ_żyaß⋧oìzìˆÌHÚ¨ÖÀ%䍷‘żŝ”o=Ż÷"];~pß9ñĠ˘(V6“b(Š5+VîĠ§l…íċܿ͵‚Ñĉ°Ğçıĥ'òz=éĤïé·óìÙ\ĠĉíCà~*+0ÁARHĦî(ÏhK…£·ÊÊĵ>Àb"fçXÓ§ 4#ëf]Y Ò m¸<²´d`Nµy§5#ìgœCWÉĤĈıÍ Rkp³™hfĉÀĦOÎ Z3A/×XÚ(‹oŜ@7“ŒÁ HĦE}áA0YÏÇg`Šú9`DÖiÁö‹¨V)÷ß×MDX˙c5(‘ó+ĴüÇù˙¨­Ŭ|£ÛezW`čñ(ƒ‘X3ßmyù›8ä]_9}láé,Kßħ4Ŭ-KÓ%ŒŞ!ŠkZĤ‚ĠÀdϖҴËÜŜï½0 keŜJE·˘ X|âPĝfŻzçäĊ•‹'Wè,Ÿ ,<í†Pڈ 8ŞèĠ—pĉ@vU•W7ïԊ/&‰nÛÍ{§&&ż˙€dE³JĠ£˙ó9şôğM#çc@i@è µFUU,3eÒF†Kï_›ċŻ~´òsOì­Tîó¨ck²@yéUä/˙ä…ĞŭZ9vhïL·•EœĊŞċj ʊ˘h€hˆ˜vjz€³˙Šš²•Rsċjpêéġsê™bSĞY>{,Ħ iÄên‚Ñ MGÚP(ŒħĤİí:ı<ІM L‡q\Fíĉ`NîLÊIÀ ­;€q_fÁeŬÓĥZSÚ,hë@d×-J\¸^á-e–KhĦs0š?r|áÀ˙™!ôÊîr&ËLĤ+y™'Ş·şÜ-ó^‘ĴÜÚ(’Ŝĉ­Ğ=€²7ġ0EÒTFD$läí9zfÁ ÂháÀÑáùŝü3œ{laïĦ–F˘=;•F7×ĜÌ+\îJĴĵY`=OQäÁ9„Vh[á”İ}LÜ6|ê'L;÷—6”&S%i[i"(e“ùĵ $mĞ$˜jšl¨y~u¨ìי5ÇâmWFuiĤ@^ĈôêËPW‰“3Ŭ›G÷Í?“ĤéĊn·{µÛíŜêġzY–%öžĴĤ¨*0­à0q LJJY•eYúŸfY֋x#Š˘µ8ŽWÂ0ĵ†áÍÇ„oċúÚñ‹ËWOßZ=0…Gïĵ¸‰ƒW‹/`—·²ığ˜Ĥeği³Ž*ĵûĜû"ĵrGTHê,ŜoB`ôÀ¨İ á‰üi@IڒğEÑj7½Ŝzgß[ûÚġ‡üŠ.Êëo ŭñ·Ħ/½,ĊüÖá£ğ^‡V7Ê<[Êó|­(Šu;1äyžZIqݵVì<@?֗tŝħYî­#&şBšÊ\áĜ킑óıRÎ w0¸ä@R]54ġ]šì ×}9x}GÌ(˜Ġ9tsôàÛ8ġ´VIŞżf7—Ï ”2£U"jݰIXYÍA‚›ĊA„ÀñÂì<˘paĤ3ïaîˆ88BŸ!ĦÏáûĤŠ'Ĉ lĴP•œĦĠjû~Üöġ€-ƒ’YQ(B/­PJÂf.quEc=UÈóERk2³Yd—ÀcvÇ×&…”­ µ3€I[‡˘núŻŞŝWCiFšJ€RŠ P.xi˜4 €O]ılŜ`ÌâŬ#Ŭ§éjQ'¨•B_ŭ=ĵ×öÎw~”$ÉĊş2êġzöŜ,†ÀHmH„ñ6M|˜””’×퀢(Š<ϳ(ŠjeŜZíü†á͇öçOañĜċŜXŬğ óq(½lĵN§Gϔeq%Ïó[ö°›–e9Jĉ­.üêvju´3É)è!‘Ö`‚áĝ˙ü]úŬ³l‚Àa”ênÔbŞA 63)ϲĴÁ’çyaë•o}× Ž,=óWğqBqx&¸räĝŜ7µ”‹ež-[ĊÜzžç=ı…q‘Rş´Ü4`¤1ٍ;•Ÿ LìlÍ›ƒsÁ9N‰7;­0:u-^8ğŭRġ%SwFnĵD­Ĉ˘˘ÉÎBQ_6ŻaôÁœtí|Nĥgä“ÙDµħáΝÔF ¤„½ ÄÌ cĜş\V¨Ĥ­Ĵx‚¤4J,Ìf/ìĴ–€àö­°ıža]ÛÈ^oìö€$xSIÀ÷F;‘g@‰iÒCĦLÁTn܈íŒe’Ëĉd¨5Ĉ„VhYDŞTżşau˜¤“ó@4x°0ZS>J[ jŜ'(Ħ4 U LzĵƒÀ[- Ó{š £gn§—żHŬ½Üĝž~òXpeí½Ĥéµ^ŻwŬ‚Ñf}PtÀhÔmVH[ÌkëWmBğ)TU[–EQ”XñZǘŞgöçObùà•ż}èúĊɍ+âàŒ<òèċ$ÉeYĥœ$I·(Š|ˆfÜNî=N´p_TG;Ge7ĵX•##v ˙ĵA—ŝ×g§‘2]e[YB²,‹,Ëzï{B@-œ{êžêž8|lÏ[ *r·4ÄLeÔh‹kĠ1'ƒ¸€¤H0Û2,5 Ä€-îÒ[6Ċúï“şù]ÙàC 4\‰şgŠ5Èö²”4ÀÑE3İ‘uû€íƒÁ絨Àjµaꟙj€İúm=¨!fé8ÇŽaÜ󧉌›­RĞ!pú·İ”¨²-`¤û`¤ öm[99½ĤzZċƒĉôwFŭۃù 8´×ꅤ›ĤéjQ+Y–­ġz½^šĤiY–%ı`4M^¨ ɽ·TICÀ¤lż·’RVö¸rñVеEÑbWOÌ{ŻÖK­‹`gî žJÓôjšĤKI’Ĵċy>œut;Ŭû²:Ú€DÖ?‰P‘ƒ`4°,ĈWI8`ˆş08I)Ğ<ÏsÏó6c¤”*òÜúĵ?êu‰i­mZ&išĤyžÖŜGZ‹ŸQ1ÁġÇԘogpè 2ÜŞhä×مϭ’ŻZDTÍ:~ä#ĥoŝxi&A…4×r\ŞÏ64Ĉ§ĉÀNŭjÉ)hêĞâÌ>l†+ı£/&FµŒúŻCŜˆA³Úvş´h‚ĉĤ7Ä93Àäŝy£öœ iµ%ÇeÀH 2Ô³^V(@œ9M3ûG+Ŭ$R˘J×hj/^ŬúĦ-ÁŽä Ô6ç]û½Ê˘ş?TW=•Q <²~[kÓWrhT}͕#2°o+µ…b#š@l·¸= Ŭïŭ Ótnċ£^ÑtĤ§k'dž›€ĴĝHÛç”jµ^M‰6€äŠŭh£x‡`Ôo ‚@(K=sÚğRĵ³ûïÖĊŒóş4ŬDÛÉġ }e§GÑÛLkÍì,|­ÊV•çûïÙÁi-Ĵj9ı ŻĴxFO˘iäŜÎR!úĤî#ġWžÛK2ğ“uM-pU5šIÚòŭRJÊ󜪪Ş|ß/<ÏKc\k ŞŞÒv(’ Ĉ›N H˜˘‰:êĈPnġÇ9§ x†ž=quĉŽœÚ×>ŝĦÙżûñJ£‚ê÷iŜ}eDlĴ¨Éİ%àĈZÛ\¤ßY}î ÓÖ:¨İŠ À ´İŒ8'hmAȞĜ9ƒyŸ3Í ì× Jµ;sÍġĈÑÈ=’Ĉ]ŞÑ‘׍F§ŒÚt'üèñEž#:¨Á¨Ĥè¨FÚĦí Üŝ’¤ĉè9Ğş êN;ÒñFÚŻithĤż0² K™Š’qš:½ûwa>‚ĥMġŠ˘`Zk²,Ĉ(7ìÛ6¸´J€4jİ’R²ŞŞò4M™=D‚sŽšŝ·òteG Ĉ=ŜIF޸İşHCP=şbişĈ—ÍJXg£|î†/~½@°MµÔ£Úċ•@¤<°ÀÇĤ8ÙYDž³Êµ8Žoċy’Ĥİo##Ĥéß`DŸwœĝ$:móġÓ<–i_GÈ÷!í @ŞOĊb9£Ÿ…Ñ×vĈx4DÑŬnymNY4Ee„1o’Ç„,Š"a˜şh6‚ŬaĞsh߇ż°˙ÙĞ)ÊJCWÚô¤Ĉġ~£-ú&Ħ A͜QSĠ’oô߯cÑëŻŒAqri_Ĝ3+Ĥ¨{ZdĵîmÀÈml½”4"²Á ¸`Ôw=h¤×hE šÔtJ Şé\ETh £Żñ} FkÌ8y?څËÉħ“‡7ö‡ax#Ž•vğŬµ6<Û5öĈÍŽ;üÏ9N˘Û6`Šƒ-M8ß×/;Cö=´$´ġŭj”uŠ& Žî&-ĤQŭ¤I‹fš„m &ôĈю_7˘:ÚwôÓ?÷X˘#˙ĠĞ‹@İ͜Ş"GuƒÑÖ/İû'hޘé7¸`èWM‚ UŬ‹ŞA µx˘ĤĉĜ Ġc&ƒĠĉl"‰4ĉ¤äfi#!eğÖzkUS²Ö½$e+£fĥHş ĉí 'Œ-  â;5Ûc‚ëע(şe£ ’²,+ğ iŠMĜGpûÊv‡Üİö•ûµ:Ú9ÒPÄÍÀġ{Jĉ ñ7¸U’ġ{Ó#úóFΜ‘#ÙI*µ 8ü”ƒQsúP€/P”ˆħ+ÙÑGÎD›oAp3Ž•VĞ•EQĤi*'€TJ˜‚î7ûËägġ'Œv +•jÁÜp¤ù´‡‹úəL£ÊîÛ9½LğhĤ­ǽr,EQjµZA,ĝż˙£Ÿx„Ïíożô% Ò Rġ+Ê*£ħ`ŒÁ€ĉuR ÖˆhPÜ ÎşĥG“í€0bèuk…4d€ŞĞ#"ŭŬΝĤ54Z-×óS{OKǃ ş†áRĞĠê&I’E!l/im·ŬèÈíŜûìö‡İö˜w FôGô m­¨@f&‰ ù]“Ígs20½›…²í"tÉïġ6›Pžçy­V+ĥsG{<ÏÛĝg~áK+–ÖrFnRç@BÚ}Fġó;µ÷ŒÜwç‚Zè -§0‚µ$j€ÉVP@ß½|ܟMġ ġcĊIÍİ!ç²b][-}FÓmÓöƒ\˜·Dš1 8È/gG?tß fEĞv.İRJĠİÎËÛöž'ÜßïÙ}îżÓmoŠTHÓ^s£”q VsóÚè;˙飁éŬT5ۂ64"›˘:b¸B´Ûí0ŽV† AìÛóàg½ŬÇg^zi ŞRƒ&E#w“FlÄ^ú‘І“’ lĴŻöżS}—ÖĵöœÀašŽœY¤şWŒÌ!Žï[”Ü0r\Ì˘ÁÈ˙ĉG Œâv„këì;_:òzEËqoFQ”× îżİX”áû~ €şóÍú³˙½ ²ĉ²Ò½(‘œx 7Û£I²ïwc€êĥÎĜżnôÏ% Ŭĝ†ĦÇqEќ­Žùä/œıQàĉRKê͜ĜĠm,yî 0>WŜ0r?ÙT+ŠÙ @Xġúŭ$ÇĠĦ‰Iwhğl§X­Aˆ2‡†€ˆúsDwŒĜÖçc ~}€3ÛĴ÷ûŒêÍ „<È? äG?îżyÑö’Öâ8Nœ*évĊ ïÛ>ŝÏÜ8>tŭ@z—R] ĠÏYŬGÒ÷âœqw9ĜÛ$''UJU“B´Z­Ú•aÎ÷ŭ}sGO?~háĊ—V ¤6 ­à˜ÒŜ‡•Q¸ĉY÷fWÄÂa>f­h"!rg`äŻĦĦTŒ'pêƒoŞ#‡şƒÛt ­ħšLÛ8të~¨ž DïŒĜ$0êgS|Njš‹œko#ïï;0ŞĞ$û7‘˘8ÄĠ͓އ—ŽAuŬJÀ7²,+†Ş¤Qvb#WcŒŬîqW÷Òqü„ÌÂî4@ŞÜĜM§•óq;ûò2nĝ•ğŻQyq× {<Ï;pì³_{èf·ÂċċŞL˙Èîxƒ7ïN#÷ÀĜOÉó„ŭ›œ06ĉôÙ8ZÊÑ_Ŭ6ıĠ—&‚ASßRˆÛ4Z3“dSnífϜk00:çZaċˆĥ>†Û#Œ;×ü!ìÍ1ğqŜ š‡ä–³ÔrèúŬg`äRwˆK” £ŝĠê臽·.Ù*iµĠjyž—C½¤qUÒ¤!û÷~ż$>b|Hwi{fMîQ=oDŭÍw‡²Û 4˜ĥH½í ĴïÎÍ:~jĉÔğžzq$¨T`Œƒ¸6ħ÷SeTo„À7ê6aò$´IŻÌ†İĞÊl˘šÌĵUŭĴEÒ¨¤W6ôĜĤ£żÚV7œ8Áü9)·5oçĤÍö£½Ċ MJĞ·énF £96zSgè3n)ô}ÏTNZ1-+€30€TeŸ?Á¨~áf#QJ!ŽC\îž8|lîÒAÛKZ‰˘¨†á¸^Òpŭ½3ÀÈÜ<ĝI~ÙN X.ŸY;ç&èĴî@ÌÀaĉŽĵvğĥZ­™zîèĜg~éћ%𸔙x imcÔFvżHğëd`Î@Ĵ‚ĵò4H3!vŸ‹gÎÁ •6_+te´Šú {hĝĉ½30rżÈĝċ G×ËV*Ô}‰·+ŒŬÜoŒ†ÒlÛ{Q­°‚1€¸C‡3xŻAm\„^;Ö9 Ŝ: ŝuĠúîĎż—`ä>™ZœĦ,*h˙Hp­<úäïüĠ nĊqĵŜjµÒ,ˆ{IÀx ĝğ˘íîÊ^Ù<Äéry>¤ÛĤCû2ï†u"K‡8tİŸtÛJIÁƒ lu4ÁŜΞ'fO}x÷³o%P™‚.l"ÛÈMǁ‘û%Ĉ,Üc€0]uġûàżY>¸Çğıĥ.ÚËçĊlÙÚï‹ŬÁÛw<^1$5¸°=%A³FHÓÈÜ>œ&ËH%ٔħNġ£4:`hf›œLÄFŽ?ñÇßħámħċȜӳçY†ÎVCµS9ç l z<Ô­—ĦÖ/`†§ÙžùVoÖğYĵ.î°ybÂĤšˆjŻÀÈbŒÖ .'Gžğr0Şëq/EQ´Çqµ–RÊq½¤iĵ1ßMSك‡úîú-8¨žğ¨+#j*ŒŝÉà'Ğ76Y2Š"ßJ½;Aìò<ïÀÑÏü҇V Ĉ/,šxrfé aÇ}F0ħċÄ=pO@%— /ŭOˆÏEbu>V—OBëT-Î-/ß8¸zġïfzŜĜÛ}bï#à3ûÍAÌöàRI ô (‘öêìŬĤjVSÜ ˙ÙÚäFLŜHïıÂOÚXm54Ĥï·M`B€ ‹PËŻA-½ÚĵB A•ìžoŻï}pîfè/¤Œ1OˆŞ“‰ÁĊrvĵ$mŸİî9işÀ¨İ™QÜ1 *˙d|ĞşĝĦŬŝĊkaŜŞcέ ¸Úù´]Ÿ‚ŭ€²ğwpß_o6‰àd!Uzë ìŭ]5Rġ<‡aÈÛív+Š˘yß÷÷Ċ³ GÎ~jßß½ĠC™˜$XRÔŬW•QÍ,>˜ÏA”Ħzç)òğ+?¸ĜëġnVUĠ#"%„÷ù^ûpËï(ĥgûìá•ĊÌŻ³N›ÏcŜŝ‡!f" #hİÁ<V)¤Ù”Ñ4r†Ġğ£‘;â]#l#ÎMŻMk0ϳ}Ÿš’ ĈÀ(zŬ‹PkoCŻĵžŬğbt÷.Ì,ï:ĵûHŻUUĠ+ó$ËS­8ç~s‡£çÓĠàhgCú-ĈC9Ċ–jiǂ‘û½”ŞJ!jÏáÍ£'÷Ï^ŬïûŝиëĤiš—e9îÜaGaWÔ">¤ğOÙĦŻ˘#˘OÛA9óI÷™ĉ~B˙hl•äû°sG3µMÑÏ|íɍ’ñ·'FŭTİ!ŻşáŭsġŒúíĤÇÁK!ùòâ³ÖÎÇDŻ$IòN’$‹yžwµÖRáùAö}żµàûoî]f ҅µüġĞç_Ù½^ ]zsŸ; oßC3ǁ  b”SĤZò8¨Ħ7ġ@^ÑÎ#‡ndÜ\3OʒûĤD,AÙtïÔòÛëçĦğ×Ñĉyk6îÍwÍìżŞ”ܐRvÓ¤—TU•”e™VUUj­•çyAEóZëò ˙ğèŝµÇĉÌ3½ş:.ü~£o0”­$2qĵµ$/>şà_ıEÑÍVеZÏ%•eİ1ĝû TÛey~Hw ĝks-Â"M’9ïëJi¨<Ïc­VK´Ûí¸–z‡í™£ğùôŝ§/ġPJ‚N 00K=/ħÁˆ¸g”t,ko˘zçiztOxȳKŬn÷Úĉĉĉb–eİRJ !¸ïû^aQħïû-ß÷Ûß??×moŜë”ÔÛ½™żĥoŭü+óë™êäĵ½|ĉxç0X|ŒGÍé‡&F™ì40Ş/™ÊˆHö@ċ*(½ ½qş{:YÂL ³ùNœÌÍEĞó‡wŬäŒÖ•R=)eÒínö,eUUeeYeYUUI­5ù´Z­€ž7ĵ“3Żì~K>v”Á3J½F*î#0Ş_l•§$ŠJ ˜ÙƒK›ÇĜÛıħ?‚ŬQ­´Ûín’$EY–rÄ’v uGÊ2 ;´xû‰¨àôЧÇk£o(³Ĥ~‚†’Ç%Ó2ß÷½(Šbß÷ç„{Ž|òç>”hß;weTTĥw4´iÒŭQ™h €ûşĜ@ñÖwp<.CàÜfšŜèġz·z½ŜzšĤ™”RrÎáyžœώ/aìÛáG‡ŝö˘qŒĦ1Ċ‹btoşü˘ÑžTî<ċpŒÜ›ŝğ7OŜ´Öî(VŒ1ëÛÛÛçœ4ĈˆòÚZĞŒ1ÚS^›²ĉĤ"Ü͜pBàŸi:Àŝßןgżú÷ĈiFHH<`Y8ûĀQY²dGd  Brĝ4\ß~ñâχw? û&cŒħ9‡Ĉ #tÏÂùH€!ùJQ%6R“/Oŝ)lÜTÙĝŒ1. Òç˙êïßàd”ŭqù^‘ĉmħ¨Áñ¸¸1#¨Ôí•N•Q Œ  ”€]ŭÜ­OüĊ“£?)Éoċy~—s)„˜c¤sÎÂltbÑû̓µ–h­RÊJK’$MÓ4M’$ @>H’$ GÇñd<Ûñx|ŝ?ĵvĜ}|Ġ1í= ÷µ½´¨`4û‚„_ƒCÏXçĥr!Ä Îùœóu­ġÔ9§Œ1ÊZЍ1ÚZkœsĈZë|‘×ìNóˆsÎk­½²,K²,Ĥéú҅CŸžşly€@“˘ ˓FeÑK°€QH݇Íäµg7ìµÓ#r+”&iš2ĈµÖ6qÑ܆G˙4*v‹1~CvŬìà÷\èSGj|#ˆ…+÷…³4Ÿħ·.­}ù„ñÑ˘3)RšH1l‘Á¨ĵ$Ĵh $×@_}^=ìo'Ŝ^™ħÌ9_œïh­…µÖ„ŬC­ "‚sŽ8çl`NŒRJ(I‰OŒħ”1–Çc^IŒ8’9u!K2²`ğìhÁè>ÇZ€:IŻ eèŒ1÷¤”ĞÓéty{{{MJɝs&\Ĵ÷ŜÙ³""Ŝ·–µ½H‘Xk½”’$ĦišfišŸIúòÄàgWĠñc„.ra¤,ĥrŒĦ˘lĊÎ Îd.’d!çAl\·ò;ĝ>ċïĵñ ŝhîì½xê9ŭ°ñI £¤`K€Îւm¸82Ŭ,U˜‰ āıùw&§N ŝ0™äw*R·Ö*,ĉŻWЇ° ÔÑ9çh( ”’PJ™sÎĤišŒF£#Îı°ıÇ£\Z@ġeğ Ȩ·Ĉ˜Ôfžç›“Éd[ÁÑWÖÏ7Ĵ#v¨sÎ[kQJIó<ß(ğWÙżŝa;ŭġ_+ĞRÂĈ€ÎìĤĈ>.0jAve-‚ĊÁ‚%Emèup÷>X˙½?sĜ|óÊé˙Ój›‡ ÚâW™víĝH# =°ÇFf!ù"ÍÛÏFPÌÙÈO(Í$'äI’l-ħ•oŜ ÌDM˙òê•kĦO;NO^H§- VmÈñĝĝÀˆTœFèMGH(A ö·?sό’ßĉœŻäy)„ȃTWgG‰RhhJ‹ĴµÌZ+sÂ9'‰—n8J6p6ò‰£RğfÑ*`à$" 眰ÖJk­ôŜ[(Ò| îk[e­ġJ)H’„”I$I’z}üÑİŻŻ/•EÊy[[½ÇFeJ.İS€$-²s ¸ö9¸Ġà[ŬzŭâÙ†ùBqSJı£”RĈçÜb·ƒñàwÛ=Ċħ Ó:¨ô‘3çŒGÊÙÓ4›÷Ŝ+lžç‚² ™÷žŒ3g~9wîn~ĝ—7·Ż½gž²#ŻÉ†€Î‡~e´=ÉŜ/ĝĴ•ۏ FĦħ%°Hš€Ï—Á\ŭ-\|†|Oœ&*RRJXkuƒCmr¤÷ġŭĞ ÷eˆèÑ ˘ –Û4a8ß8SiádşòA˘@'!KPĦ-Ŝ"ÚF6üS7ê+ö€:"zçH)1MS¤ğñ‘äÊ×ç/?wGœ9Ah èhèwç<0jëlN ÔiµZH ʀ$êÁo}~ġCË+ââËÏ}ûì‘°ÖŜà\ÜBĴäyÍ9WRJż´•Êqb죑ì 69ĵߝ‡c}!Ùħ§òD0{ËÖZTJ9Ŝû‰÷žcìp8”ƒÁ`r"³›ÏQġÊÍĞżĵğtŝıäôğ„.t Š6´ĝڐĉZíä13èáÊtğ§T’°˘-”S`½ÏşĠ­£ì‹ÉDÜᜯĉy^•êŞ'|·wW4êû­`TĵÔˆ(i0Ü ĈÉĴÙ&xÒÌ"‰Uòç‘Bĥs ’̉F˖7ĠK µ­ċ},30uäœOÓ"q˜$ÉÒË췟odżúaÄè`w ‚·ŒHSÂŬ8ÑL²Ĥ¤£t„2Àü¸Ġĥġ…{íôÖ‹Żżô™µĉVžçw”R+Jİ{yžo!ĤœseŒqÖZ|"Ü Û=NŒ}zVȆ™}Ÿ ÛmİüDW%75glsŒBе&J)PJÁh4²ñXF#>w³ùbĤVN™ËŻ}˙Ŭ·ĥż{4=ù&ìYLâ`wŭ|e.ÁŽb£=?…^u”É@ÂÀ-˙èêWĉµ3£ÏÌo !îN§ÓRŞSÎ9=çtß$3•)0"¨Ï„uDtŜ{,“¤èŭFœ/‚Ŭˆ‹ F% Œ„tì"ê’Vä:Wġyòg 1@ï=(€s“Ĥiê–.Ž><ùùOVv3ÖöŒÈn:|8ĝKB_ż hÂġ¸ğż\ŭÏ‘kŜ=ó ğÎyĴ”ZBĴK)ׅ;B.„PZë²wŭU/@ÑŬâXħrĊBtjĜFmklŸ zÚ4bn„\k­•J)B¸Ñh¤ÇħFÓ˜ôÖĊŒßÙŜùä­ëë>oOŭ|Ȏżdp¤álCz8%@Bwêj*lmF#ÀhĦ |~ ôĠ÷á­g“ïŞëBˆċétş^Ju!nÔvşï#ÙÑĤu `dgLBíˆ,£MzŒfÄ­2$€^CF½T…Dg[İJ¸Ïµ¤> m’RŠ4Mw²,[MÓtt8ıñ§ߟĦ^9EH h+-U(݃ƒÍ3ê£ ]QVĊàĝµŻÀ­|ÏàÉ믟ı<ù³RâÔ])ċ=!Äf`ĉS” ġYşĈ qqAİ:t‹Ĉ,ğG F•ÑÉ{Ċ2ÓџpjcMX9Ċ’”œsÖ9G´Ö ”òRJ=Äx<ĉáp2ĥĈ³ñóŒ_[YÛùÙ­kgáÜ/Xrì%,ĦžÂı ‚aÑĤ>SċaQÈ# +Xo˘Á\˙ œb[ëÇÙW“‰(³êv„ÜZĞptìğœ( ÷Û#ו’÷Ŝ•Lt.SZ:2˜Mz-žïǚÇ*ӕ·*ġ(ZL‰Ëe…B\ÈsîĴòw@Ĵµ „`išn…·^`}ş‘žúۉ‚1I]睙èû£&•–VҜiR[')EÛ߀_ŭÓoô[/ğvâĜ TJ-O&ĵ˘uÎùĥ‚K)ıÖZyïMslıÌ{7Ç[ş7“5Ò£pÛĠڂJĵ+†ŸžĊݳ$l&ê½wZkc­cŒÀdF£‘TJċ£Ñhg8nèL½tûŜ^]zŭÙôô;„ŽÎÚpĝġ˜=U`r Œv?7BĦH&`żÉÚ7êĠ³OÏĞYuSk­j`GvŞŸ'3•2]]3$•¤U.(c³>`èŭb2£ú­0$Ż(ĉĠxjñ1ë½wëX½´xú=’'ĞŜÇ9G”R‚sÎÒ4Ŭ ´ôĈĝ·ü”ŝŬ_xÇ)Ħƒ½cÒÛ 6÷ F?@Y!ё‚Ĉ(ÔĞàW>²ñ™;‚Ŝ}ñüó_­nO&“*m !òD2ÔiÙÚ>ó ìh1İô‰O_÷š$Ĵ¤×²C*›†@´7ŝi"èLŜ{o•Ràœ+É(””RŒÇi1hÌl”‰ğgÌ×÷ŭĊé‰w%Ï]’’íPšÙüİĉڃ€) 7))ĈJPvë;07ŝ ß=1¸lµú^Jıœçù:ç|*AŻwPHOUvÔĊHƒĊÚÚşÀh™…†ˆĈóġœÑBNôÂHtğĜ`TÎ(-ŠŠ‚4)ÀÈ{o*‰ ġġĞ˙îġġÄĤ‰%KRJIÎùv–eƒ˘wàò·Ż ż=sU^x -â8Ŝ7ŻéÁ¨aîBšó$Ëí¸•OÀŻ~ gF;›Ŝ<ŭ5wƒçÓe)ċ*ç|Cħ%„˜J)s” ŒÜvHšġƒ<Öô<mp²…ïD¨+³éÎÜ:’<%mƒë T½”ƒœµĵ÷âLN)e¤”r4ċJݝÑh´5šÍK~{sû7oĴŭù%{ö—;ú*ôIu5 ÷§Ó÷£òÁB'hBHrúêoà\–Ż.%ìOAŞğ `…µÖÔ¤ş’ia–³}ċ>>t(°`PsIÑĦ·žì9-23šġ²+_²†”ED &$nÔ×m^ĥ]“dç˜ĉHT$8(J)MÓt3I’AšĤ‡Î²żžž=ĥeĜ!BĈ€0L1Ŭ;ŝı‘Ŭ­_͞+cEi ”^ßüÜŬ÷á°ğ‘_<êÊÒÔä]!ÄŞbMħĊ9ߑRŠPR`ĉÄ*ŭY,–4cFħıê£ $ÑÊݨ"Ĉ % â>¤XRÍÒAï=:ç0Ô.i”ÒZ T>'ápëlü,ח—·ŜùaíğSôôÏ(9ò"À -†Ĝ9_$?²§Cż'ĵÔ F0K@Z$2 (¨kÁhëŞxéÌSÁó[œóĠétşÉ9ύ1Ġ"NğϸÇĵoá ĵCüÈV$-ƒNYÊhêµğ_êX40ŞŞeĥİ•Ò A’¤­uf¨Ż_SĤ´ĴgWŸ8ç´ÖšäyΒ$ÙLÓt9I’×Çżùò3ò÷eQ1ÀjĜÀ¨âdIèŠâê4>˙üŬ ™üÉĵ~ö­Sǟ˙Z)u7Œ,YBl†Ìı\k-C“^[Ûo”úv·˜­ÓÚéğî:fħ¤H}i…0TjZÉè0ĠrA CúêRi›|9ù9½÷¨µFJİ Ŭ Œ*ŒÇ‰Öz{8Ô[§†zí$Ñ/}ö›ëGŜ|&=ùáI& ҕ4ĜßHv3ÑHŬŸ4t˘F„R I„ĜµË`ż˙ß=9ü£Ñê†â.ç|s>UJ•SçÉLm'úşÌ„ÍGìâñĦ•Ž l‚ĉv˜’”‹PÔÙÖ3sQÀ(Äd+”442êgħ5ı³Ïk=ğN˙ ì/RÁišŽħĠCŻż>ûm~éeHĜnĈ]!4wƒİ|×iYW…bdJÂR@µZ´ûYŭÄżtï½ĝö™Żœ5w&“ÉŠâžbCħâDÂZk Żîµy…],iq$ğ°'v_U”ìŞ˘=[†Óİß/—ÀäœC­u JRJ9 À´9êÍóƒÁŬsê‹ ß]½öş<öΈ¸4;Ŝ²ŬmÜnĊğ÷{;0Ü'%N…dI1RÂì€òĵ4R? €^ž q'Ïóµ<Ïw”R²â$š˜Q“ïĦ=+ĴFUiÓCˆğyïKçmÀäv˜~?Ò.&ĥŠ({Ż!EL,đ|ˆĊíÚgWż;Ŝ­µB$IĥÂ\ŞC'“?|ş6<ûÌş„£$9hM‘0ÓFU„T:{"›1)”àî~~ġ#x.ÛĜşpéÔċ„â÷RċÀˆ68ç[RÊİB†™“ßuĝ™'Ŭ=vsŝSUĥkJl=iÌfܔlÉ*d¸LG£Ñ$ė6Ŝä7×vĤoßÜúĵ=ŭ˔}ÈhTÔşh]m` QZÄġh:°×?„%~#ŝÌ3Áù­aSJɕRŞĊQ´Ċşbm€DЎ%Đ\)o'Ŭ =Ô èjOżP`„ğ-q Öê4¤U%YBêkġ €Rh)Ŭ­5BLCŻğcìĊ÷>û$ù‡˙hP'$Z^weÂl]&µü ’q’-(€ßú#¸~ cuU^:òÊĦÑé+RÊğ;R–™sˆx9t°Ò ħ „ĉÉuMÉMl)Z¤§ Œê‰ PcH´-Ġ]W™ UŻAÌZkM1T*„Rj2·‡áĉÑĦÙĝĊ@žğµĵö³•WŽÓSïR:<HS€”2zp×ÛúJPF‹ğd ĝġŻo˙Ŝ_:=ŝR+qƒs~7dĠM¤”²Tnr û ÂÓh“š3ĤA²sl‡ˆôÔ¤´âbŒÊ·ĉtXĵC+!Íĵ*%Hï½->CĜ›ħĜVú;k­‘RФFµVLíŬZz}‡3ñFQ/Š(Ôö\#Ħ|ĴĴ+b –Ħ ĝü:¸•!ÙúÊzfxçÜÉ.ê‰&+œóġ'š!¸RJcLɄ;È·zt'5tĈ˘E@zÚäşûÔ·š³íbEĴ”fİğ“\Í`´Ö:€R^Ĉ—F#³yn îFŭÊ÷×o]Ú:úÖQzò°áI,”Ĥp޳N4ÄúHáo $€rԕ…Wĝ› ú?Oĵ“çùZÈt’aĈ‘ÛçiĠ·¸özğ lrôŜû o`dĊôZôfÁÁîc¨h%¤/* Éûbxö¸xèΛ7&š0BŒ1DJÉó<ßNÓô^šĤKÏ&—ż<=|ñä]qâYÂĈ€H 0*NËڙ˘é.P„ĴÍ:¸>żö >D­Ÿçô—Ŝ™Û“ÉdµŒqÎw8çy"]Ğ':͓렋aŒYD@zâg7ħĦI²ƒĈÔJmN†u€­“/ĥi­U`LıÖz–&ŝÚ@ü0UŸ½qġʕóúÄ/†ì™ ÀĈGÁ+ @cg™xFİsŭ}xĈÜŬ>óìÓ<ÏoqÎWB1"×ZëšT׈ş: ÔÁÈ7°¤’!ùÀ‹N†ëdD÷.:•Ì4D )ġídZü`‹l‡0?sĴiϑ†kW½v΁RŠ0Ĉò4MטŠ KżŭŭÖà˙Vj!î&+`ĝXÑt·ĝ›·ŝ{Ëïqĥ²sáµSßfÉĦkRäw”÷Êz˘Pż&C,²Œ ΢.j£y‰ ‘E@úI°¤ûœi‹ƒ€–S[µħ(­0c ñ%_Şxe6^H|ĜF›ĦÙĝĊ_[Ù~˙›[ß=oOŝŒħc/Ħ™zW <È(càV>²ò½xfüıRâĤb9Ïó ÎùD)Z¤şŭ8‰ĥġóŬíJċ²,Ž5I¨e#”BAžÚ[Û=V0šÁEÁL‘P#aÀ\î Úò”âdmk†û˘ş¤b×$Ŭ9çlÈş›fYĥ^ĥş8üäÌúŻŜ& Îşq‡ÑçÙ0”!ĝ?ƒ[~FüÏêġ—Ž_{ĉÙËRÊğ“‰\BĴ…V?“ò`cŒÑe<°ƒùìwÍcH­ÍèĈ" =M,İ ”ê§VÒ [Ġ ƒûÛżT >Œ–l)“PJċJݝñxĵ=6íú‰L½psyġĠWO°3ozèO V4MÀOï€ıŝ[xòñĉŠ R]žç!DuĈÑĵä…>'Óz6"™sŠĊ?š£žŞ,eA:òaD.6èYôŠóR⸭ď*’]êj‡Ó$WSé]í÷Ä{ZkàœÓë.KÓtéHrġËs‡^>}›Ÿ}ޤG€z$k/—ÁŜúèĈçîµSÙçÎ?˙•1ú‡jœˆs^ıyn?ŒĦ_V]+Š é' JU°İ§ċÖc'¤Ĉ’hËí’-ÑRĈ ÀdtaBk͵Ö;!M|ĦZ9K/Ÿ˙îú­7§Ïu˜=w èà4ÔÌĠßÀs~mÄhßÍŞÛ ½êÌ>zĴuÍîi‹sÌsĥX‘ëBÇï‰`!U($n6‚bħdşŬż!!ĦùĞFœ£uµ 6@wfôˆaûĴ'ŽÔ;‡€÷Œ1*ÏóiS1L’d|ž÷áĈèżügaԐ¤K@ÒPƒżû;Ğż3|Â[§ż"ànäùt%Ès›e])ÔZĞZœèAeı>@4Œ";Š€ô´Ëv¤ÇéË7hû]ŬşÀ ĦÄĉхBB­µVRÊ|<O—––ĥŒ1›ĦY{k(nmñßżyŭÊĠóĉì/‡ÉÙK`~ĝ èê×úÂÙÑ{J‰ïĞYuĦoXŸV-}Š›h[sÚ=?@™l'·y’TkĴÈâÑž‹úD@ )qĥ’àœsc}ş€¨O[ßÀ’Ş6cLÎ9£”"yžOÒ4]KÓtÈ1|ï/’żûï§ÄŻ ŝîpÔߞĵñÚéË£ì)ĊŠ,Ҹ˄…)ç\c´µÖ†"꤄Ĥ}Ġ”uĜ´×| €ğÖ&‚Q¤§ž%ġ%l8VA…ÀŜdġ/ĞR5ĥDKB­N`KÊ#µÖӐ&96 í½_ Ä7·~Ĝ~ûÎ͏^Uw.'—NzÏiy™s~›s~Ż2h^½QıÀ§}ß˙ğfXĥÙq¨v8ĦPtĤ˜µ_!–´@`„@ BŒ‚”A?)ÓÙçxŸġ"N¸İ&.ߕ, ¤””s•eYĈKĈä†?Í>}ĉÖµoŜÍĤWĊùsG/Ÿ>qî[cÌêtÊW9çëyžoqÎs)R*k­-ÙûÀ¨‹ ġÙgŒ" ŭô@İ1òô`KMšëLÉ7°#ÚP´Lħ 2ñ¸Öz˘µŜ6Ĉl ƒċS‰üîÙlpxċÄÑ'ú<—kœóµétşÁ9çJİĤĴşy™t‡lBĉ8ÒûÖ¨Ì@+e;pF§a #ÔZ[#\ 0š5‘ÀJË2 ^KH˜†Ô6] sEĜÀ’Z iC‘Rnqη8ç“<Ïy DÖÚ*ùöÓ§ÖŞ Œš;ŸwĈ‹"E@ú)ħĥàmlİİÏ]8µIy´Ĉ–(ìÎ_˘Ħ~IcÊñíÁ`°”eِRšĝt2ħ-²ò´Ö<Œ çB-ÔˆšN_@ÚoŒ¨7+Š`é§Î– ö…GhnÎÚ$Ġ%½:cŞ_|(•)½İ÷^[k•ÖZ ƒí,ËJ‹â’û2ö¤ĴµeŸşi¸}ËdŸ`4ğ½'Ëрáv0 ´0ĊĜ ôÍ£ëU1Ĉ#-b]^sȨß3”/0¤60ï ÷wLİé~Ì£…è½·Zk9 &”ÒŠNkm•RZJiŒ1ċ{hŠïìç²ßyFˆ" EëɖDĈ¸?yacŞƒÑ ”˜‹²BPĈeŒ•V6ôÍsöŭġŝyġ1]I ]Ŭİë™vĠ4aKĴ°d 狂Ӳû"1£ò&%@Â\!â d Ê>v%kKù†ŽßA–T/;èÛÊ ½÷(ÄrÒ1ç\PJ)"‚ssŜZ‹!c½Ğ£DŸŒı&ÚOqk˘HÑöɖö+ù†Ç9lÉ7R˜fkJépĞH-ug1/ÁÁ+áç1Ĵ½ĈÙl$°Â ²$ĵó0Ú}Á($[  €NB’zU2¤0œŻï@ı>ëÙĥg Œš>ôŜ{)£”ÚÊ~‚°—ĉ%P`‡ ×'YÁ7íyL:‚Q¤hVĈĞǗ œH U˙/T vÈ,óÎڞW­M8‰ïÖ"in“PFC(-Z"Uŝ%bm:!@s:EùîŒjÏwŸL·‡ëÒŬİİN@:²:t04VèÑwm ÔÁ~Îç°g?xïI:°Żü.Pê+ÍEy.R´G Lódĵiâ8G˘i4hq|]'Úŭhû{}ûŭkœf·Cüh–Ô–Ğl”]Ĵ` ÀZ ì=xÙÁh3˜uh ċäTth £^€‡&†Ôuúo-îÁÊĞ Bk‹ƒŻ$p§‘>-°ĉOŒE@Šö8İ‡è#oµTĠĝ9 ĞMj™çH<´wžŜŻ£è:Éß÷šŞI „CÔTeKĊ["$4-F…g­N-î’éÈŜğŬÙ½óZe:ÒȜHQMhè*a%$ÔstC޵ z ™=1Ì6ĉÙÖkħmo5íĦ}„:Hœ¨ñ°-R´‡'4Mkòöûĉ1ì >CÂgòcëk )Ċ÷Ŝ á2a Àı"šÑ˘kCu°KĤóó™Ñlw³{ï”éÙ-†EH ”XCĉr­Ñvä:FOÌúW@İmnW\ …ù4í%ßcġ'Š€í &¨9„ñêßhIĠo71³>3xîtI*Zš6êaĵ÷Ŝ ˘Dı³™ıWtĊ¤R@?ŻQ•ÍÀĠ|Iœ+~CYqôğñž™œWA-ĈŠŒ>–X†À†A‡½Òpj—Y‘O’+ÈÀMQ…÷â`~ ×A×·‰‰7R˜ê‡œŭîĦ>û)Ês˘=!ÀtĝR8Á>< ÁyRJI ZŜŻ·ÖzçœöŜKçœ@=ŬH)2zÔûÙğ.bJ„%ğÓqSĜI{@Ĉ€&  uEZ6!€!àË˘[ʝÂ2ÎC C=tcğ/Ĝ† Ş”İÌ BŻ eŜzïwĵ÷Â{Ż+íuöëĴ"ŬĠAİï>jÚCóZġŬSˆ" E[4`ÚG|iHAGÒu ï;òàaMàì€ċ(wk­tÎíXı̐2 P2„bT²;âœghV<÷Ħ6€ ÈnB @ŜlÉíJ{d0phúQZ :ôf…ÈŠ˙•$ğÜ#KòMHˆ—ÎıMkíÔZ[!wuğè Ds¤ğŭÔÄuÑĵŭÓ”`?ò\˘HÑGĈkŞAj’ñšn„!A j½~@çіİEÀ›Â¤1fËäë7?ĝż˙Ëë?ŭZÄqêŝ•ÔxŻ„×ô;l!m% ÍbF¤9ó­Ex~ôÒю^­cvŒ12Ò~ Œ²ó@ [R“\w=‘E@ŠötS!5S”úR‡Òۉavv˘Œbš~f9üß˙5yûı“Œħ£„1!$˘‰İ܆êížëħ„~ !>ċĤŜûM­ġŠbYħ%,;Ş÷ğŻ5ï9ğĞ‹!Ìo÷=*}ĈfD Š€í ĤĤÓmW.Y0í‡Ħ̓eTZiKK²£YĵCkí„’Rş…ˆ`­ĠišnPJ—(DL+`D‘ â,É£JöPġšâÀB5"JçÜÔ³-ܜN§;J)eŒ9HO@ÜÏ>:(í÷óöFŻŭèé2?ËGg˙ôO˙ôĜŝ÷żüËż–Ôuğëŝ}Ê‹>ÔìcïÌûœĉíĞûîÛ°£E†í)dLmk?=óĉ:½GÀŠšXR½Ï4°šĤéı´ĠğWÜ7MÏğ¨û&Z¤h‹L-NĉĜ#r&miëMßwRŬAİ-=­£u߉İ[y"öM HÑ"8µ:§³(¤)½¸‹)µMËġ5fÔTÜù0cHuPêb<}ĤĤΓSÔ}3oÏDà‰Öf1íûQ..!qârv\“†Se>MI Ġk€v™îA$ğyµ6óâaóĉMġɰŠ‘£U?Ìè;#CŠöÓŭŝCw€*ë ó¨2ú̞êìžzó& z İ0µíèZ÷°[E‹)Z´@s< `ïˆZıîêNŭ°bGm Ô•íèkÛLŬÍU#(E‹€-Úc`Kmġ1uò=”°+^DÒë†0jğŬg`]_y.S´HÑ˘= šçì›&ĉú ÔĠ*çaRŸĈ˘~@íg4C´h˘Eû‘XÀÁ†ÎŸGCê§<ö3ˆ/S´HÑ˘=b–Ô”ÚĉAŭX`4ú2Ĥ>ĵ#;Š)Z´dJóÀĴ ˆĉӃŜĤĥŸçŬŽ-R´h%ĠAİΎşÛ5ğ§qŽëC£yĠ••7ï1Œ˘E@Ší1‚@˙ñM, ĉÚ£¤ƒ°Ĥ>àÁ(Z¤hÑ~dP‚žÀö.À{:èÏŒ˘E@ŠmĜR0u1 >’Ŭ@İDÑ" E‹ĥ€l ĉ°>ö;BáQƒÒƒŝ=Z´HÑ˘-8ͨǓùu>êÇE‹)Z´¨6Vô¸šh?i‹'˘E‹-ÚBK-Z´hÑ" E‹-Z´h˘E‹-Z¤hÑ˘E‹-R´hÑ˘E‹€-Z´hÑ˘µĜ˙öÚ&ŞŸEIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_VolumeTwoThird_16x16.png0000755000000000000000000000553612467662066022371 0ustar rootroot‰PNG  IHDRó˙a /iCCPICC profileHǝ–wTTׇϽwzĦÍ0Òz“.0€ô. QfÊ Mlˆ¨@DE €£ĦHĴˆb!(¨`HPb0Ѝ¨dFÖJ|yyïċċ÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Għŭx€Ĥ0YéİAîÁ@$/7zşÈ ü‹Ŝ HüeèéO§ƒ˙OÒĴTÈ_ÄĉlN:KÄù"NʤŠí3"ĤĈ$ŠF‰™/JPÄrbŽ[äŸ}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\NĤˆo‹X3I˜Ìñ[ql2‡™Š$ĥ 8Ĵx›ˆ˜Ätñrp¤¸/8ĉ p²âCı¤¤fóıqñş.KnjmÍ {r2“8Ħ?“•Èä³é.)ÉİL^6‹gŝ,qmé˘"[šZ[Zš™~Q¨˙şĝ7%îí"½ ĝÜ3ˆÖ÷‡íŻüRê`̊j³ë[Ì~:ĥ w˙›ĉ!$E}kżñĊyhây‰RmŒ333¸–‘¸ żë:ü }ñ=#ñvż—‡îʉe “tqŬX)I)B>==•Éâ ˙<Ä˙8ŻóXȉċ9€˘yPÜġßûĉƒâ›Ĥ:ħ8÷Ÿŭûp‰ĝ‘΍ûçLg ù‹kâk €$È t!0VÀ87°ĝ`Öˆɀ2A.Ĝ @Ĝö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`ĵóa!2Dä!UH 2€Ì dıA>P ECqBı¨*…*ĦZ¨ú:]€B=hš‚~…ŜL‚ݰ2Ĵ  Ĝ ö†ƒá5pœçÀùN¸ƒÁíĝ:|Ÿ³@ˆ QC â‚ĝ!H,ÂG6 …H9R‡´ ]H/r AĤ‘w( Š‚˘£ Qĥ(OTŠ…JCm@£*QGQí¨Ô-Ô(jġ MF+Ħ 6h/ô*t:]€.G7 Û—wè7 ††ÑÁXa<1á˜Ì:L1ĉĤs3€ÌbħXyĴÖë‡ebĜì~ì1ì9ì vûGÄİâÌp‡+Ç5áÎâq¸yĵ^ oƒ÷³ñÙĝ|= ?ŽŸ'Htv„`Ba3Ħ‚B¸DxHxE$Ġ‰ÖÄ"—¸‰XAàP4407°7ˆÔô&Ĝ9¸$ĝAˆnˆ0¤;T242´1t.Ì5Ĵ4ld•ñŞġЇ+„s;#°Ħ ³ĞŬVï]=iY9´FgM֚ĞkÖ&­=%ĊŒ:Ž‹nŠŝÀôcÖ1gcĵbŞcfX.Ĵ}ĴçlGv{ŠcÇ)ċLÄÚĊ–ĈNĈÙĊ퉛Šwˆ/Ÿĉşp+ı/<jĉŭ$.$…%µ&’£“Oñdx‰ĵž•”Ĵ”TƒÔ‚Ô‘4›´½i3|o~C:”&½S@ŭLġ u…[…£öUo3C3OfIgñ²ú²ġ³wdOä¸ç|½µŽµ;W-wsîèz§ġµ  1ş7jlÌß8ÉcÓÑ͉̈́›È3É+Í{½%lKWrŝĤüħ­[› $ ĝÛl·ĠlGmçnïßac˙ŽO…ìÂkE&EċEŠYĊ×2ŭŞâĞ…ħ;ûK,KîÂìâíÚí°ûhİtiNéĜß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§˘sżĉŝ]û?TĈWŜİrj­VŞŜQ=w€}` Á–ċš˘š÷‡¸‡îÖzÔĥ×iוĈÎ8ü´>´÷kĈ׍ E ŽŒ <ÚÓhĠĜĜ¤ÔTÒ 7 ›§ŽEğùë7-†-µ­´Ö˘à¸ĝ³o£ż:á}˘û$dËwZßU·QÚ ÛĦöìö™ŽĝŽ‘Î΁S+NuwÙvµ}oôŭ‘Ój§ĞÎȞ)9K8›vá\ÎıÙóİç§/Ä]ëŽê~pqĠĊÛ==ŭ—ĵ/]ıì~ùbŻSïı+vWN_µızêZÇuËëí}}m?XüÖoÙß~êFçMë›]ËÎ: ^¸ċzëòmŻÛ×ïĴĵ302tw8rxä.ûî佤{/ïgܟ°é!úaá#İGċ•×ŭ¨÷cëˆċșQ×Ñ'AOŒħĈž˙”ŝӇñü§ä§ċލ“f“§§Ü§n>[ŭlüyêóù邟~Ħûâğ_é›Y53ŝ’˙rá×âWòŻŽĵ^öş{Ööñ›ä7ós…oċß}Çx×û>ìŭÄ|ĉ쇊zğ>yz¸ĵ°÷„óûÌ;ĵl pHYs  šœĠIDAT8˵ÓħJ‚aĈñŸVÔÖ`‹àM-‚„›àÜäh—àÖÖ*]E—ĜÒE´´jˆj}.Gĝxy‘/zĤ3œç˙>‡s^ŝQ78ĞkĈuÍßĝMä KlĊ§0Ĝ%€;|â2lPÄĞE£½/˜–ÍÍÖÈ$lá9êWôŽ%(2 :˜ĵ]޳ rúÁIİn!§{ĵEŞ.>˘ 8ĊcÔCĵ§ ›˜wYĴ5·Ĉp•Σñ0g? é!M0Şz}ĴêžòA·ùL•µ$2Ê~#áIENDB`‚desmume-0.9.11/src/cocoa/images/VideoFilterPreview_64x64.png0000755000000000000000000001043612467662066022244 0ustar rootroot‰PNG  IHDR@@ŞiqŜ CiCCPICC profilexڝSwX“÷>ß÷eVBĜħ—l"#ĴÈY˘’a„@Ċ…ˆ VœHUĂĠ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×ûĵçœçüÎyÏ€&‘ĉ˘j9R…<:ĜOHÄɽ€Hà ĉËÂgĊyx~t°?üŻopĠ.$Çá˙ƒşP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"Ş ìôI>Ĝİ“ÜĜ˘İ™(G$@ğ`UR,À Ĵ@".À€Yĥ2G€½vŽX@`€™B,Ì 8CÍ L 0Òżàİ_p…¸HÀ˕͗KÒ3¸•wòàâ!âÂlħBa)f ä"œ—›#HçLÎ ùÑÁŝ8?çĉäáĉfçlïôĊ˘ŝko">!ñßŝĵŒNÏïÚ_ċċÖpǰużkİ[ÚVhßù]3Û  Z zù‹y8ü@žĦPÈ< í%bĦ½0‹>˙3áoà‹~öü@ŝÛzqš@™­À£ƒŭqanvRŽçËB1n÷ç#ŝDžŭŽ)Ñâ4ħ\,ŠñX‰¸P"MÇyıR‘D!ɕâé2ñ–ŭ “w Ĵ†OÀNĥµËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“żù@+͗¤ĵè\¨”LĈD *°A ÁĴÀœÁĵÀaD@ $À<Bä€ Ħ–ATÀ:Ĝµ° šá´Á18 çà\ëp`žÂĵ† AÈa!:ˆbŽĜ"ΙŽ"aH4’€¤ éˆQ"ĊÈr¤İBj‘]H#ò-r9\@úÛÈ 2ŠüŠĵG1”²QÔu@ı¨ŠĈ sÑt4]€–˘kÑ´=€ĥ˘§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcċX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´şW ƒ„1Â'"“¨O´%zùÄxb:ħXFĴ&î!!ž%^'_“H$ɒäN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉŜä²€Ĵ —‘·O’ûÉä·:ĊˆâL ˘$R¤”J5e?ċŸ2B™ ŞQÍݞÔވ:ŸZIm vP/S‡İ4uš%͛Cˤ-£Ġšigi÷h/étş ŬƒE——Òkèéçéƒôw † ƒÇHb(k{§·/™LĤӗ™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çŞTUsU?ĠyŞ TĞUĞ^V}ĤFU³Pİ ÔĞĠİUğİ6ÎRwRPÏQ_£_ŭ‚úc ²†…F †H£Tc·Ĉ!Ĉ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsŞfĴf‘fĉqÍĈħà9ٜJÎ!Î Î{--?-ħÖj­f­~­7ÚzÚÚbírííëÚïup@,ġ:m:÷u ş6şQş…şÛuÏê>Ócëyé ġÊġéŬÑGġmô£ġêïÖïÑ7046l18c̐cèk˜i¸Ñ„á¨Ëhş‘Äh£ÑI£'¸&î‡g5x>fĴobĴ4ŜeÜkVyVġV×ĴIÖ\ë,ëmÖWlPW› ›:›Ëĥ¨­›­Äv›mßâ)Ò)ġSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlpĵë¤á4İÄİéWggĦsó5ĤKË—v—Sm§Š§nŸz˕ċîşÒµÓġ£›ğ›Ü­ÙmÔŬÌ=Ċ}ĞûM.›É]=ïAô÷Xâq̝§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Ĉ>ŸzŸ‡Ĥ"ß=#~Ö~™~üžû;úËŭĝżáyòñN`Áċ½³k™5ğ/ >B Yr“oÀòùc3Üg,šÑʝZú0Ì&LÖކÏß~oĤùLéÌĥˆàGlˆ¸i™ù})*2Ş.êQ´Stqt÷,ÖĴäYûg½ŽñİŒı;ÛjĥrvgĴjlRlc웸€¸Ş¸x‡ĝEñ—t$ í‰äÄĜÄ=‰sçlš3œäšT–tcċܢıĉéÎ˞wç|ŝü/÷„óû€9% pHYs  šœIDATxÚí›]lTE€żi×İbĦğ$5ĵ蘨1‘§#JByñĊŸ  Œ11úÀ›@0&c‹ <€†‹ –hRmh ‚H ĥÛò³í.ێmg§÷îÎÜ{·?À$'™ğwgĉœsçüÎ!”Ü­Š{ĵĊ*9ıâI`° xÎg½à WŭóÀßÀ%ġ|BJÙ= ˙X4;ypKí¨À²Ì‘!´ÒRÀÁtŠ>™GšNÑ쇀ÓÀíóıÀÖ²ĝ‡$ŝ}à†ħh8èElPZ€³@ ô*Ĉö—a@VmŠœÀ—„'£$ÜV­âgंën]~L á+=ĥ|ûT^bç\ÑpÜĉEO?à3à…ÂC"Á™žN­ħ‘ÚbĴƒY!ÄÇÀ:àQà! 'óÔLwGGÄRÀkRÊߜ!Ċı3À,ġÓa™§i†8{ƒV8ğÂBˆ%@R#~xpMëżéÄġċżÖd>·ic‘\MÖ6Ŝ-b ‰Äâlw›Í0_{|ÊÚ€Ŭš½áŞ…ĜôVWócM~Ͱ8#Ù ƒŽsè`e Ú œË‚;·sDÉŜˆħĝí ‚Ç9RÚĜw˚A%÷ë Ïû“t¸lğĠkJñU­ˆq1İxÜñ˙g´ŝ+6:àSeê.½ñ:/9.8ĞÄğ‡­ŽÏiÖĠ ‡ùOëÏ/Ğ Ş#Àĥ½X*8r˜§W7dÌsŬvpĈġÚx‚O:ÇĈl¨KĞ‹È<ĤġĈ;ë\ì:ĉĝÍSċcú2…çE‹x&âD`úöUÈŞÖé.ħ×XÔŞŝ­)t`üôΐĈ¤]ŽIF_èÌ4ÌWê8?í0ß°ÖŻ/Ċ€·´ŝ_SȀĵÏïĠZ?t0Vċa˙_³y–œ7€0³+€álĈI?éëÎóÛŸhŭÖŒŭ§ÄğNËXŝBÉ\fžêš' 3ôE?,ÖX"qĦâŻÚÌÑġ/ĞŭŜ%ì €Vµ§î0²ğcŽFé(/ĝŬeŽĥVN‡ vÄçĴ6ÏÙ Á°-Œ÷güİ ó$iPâÚ4\ÚĵĴŭĦ9ŞÄä·ßç4IÓçá ×ù8 ĦڇkY2M2C7ĵhĠ° I§XÊ]ÖÒİ"ċğ`BVXÑWdžğ²‰qß²OJYo•½ÛÛ}ÌD¤s9†DŒ~£?—KµŝÒ^nqUH™:"b\˙µyrƒĤx-׀ÙÀìx­oÌPÔĉÌŬÓ×ü€”‹¸ĉm~ “Ş ˗³Çp°ŽZú·½2l7ı\iâ;qÚt-qMjc:ġ³Ŭ ^-äàÒ)ÒFÍOòzâ˘ÒĉSÄ1Äö¸Ì—.ÉÉċŠ×R£{OJù½—8§É‹mÊıÛ@°·úàƒµ$=ˆ—ċˆWú˘G× F1l,àġµWPĉ °+~ë}+D‚Fƒ%ò˙]0§|ĉe3~²(ì-Y"4 ‡Ğ*ckžvıXF‹šÊU%œ nb@Q…ˆ‚ M”/³Qñ¸eÖ+È2z]o³ž-n^À³ž5ƒĈ‘XOcû“´,FŞ4´Xât´hÇĜ”ÉQ|$Ŝ0ÙŒxü– ¨›šl4/h)ğaàŽ­.1piqŞ: ƒù)d0*vT¤V_ߏş9<|íUŠ-4áÀ%ǵğlżšêƒfb³ d*˘ìŒġÒX”Ç–­b´z ™MŬòù>;˘Ŭ°Ë^pĜp gâ'ĝĈ9áaµd6CÖñ(j2s}9í ´X!l ›úJÉ1€ˆ×òÀĉ-ü1 ‰ż˘ßíBüGÈCÀ¨ÍikċÄTr(yïDêŽħ•ÎĠï–7B.‡QPQ‚İm |ïÁòŽ@°ĠXô&°s’·:ĵ˘N[…úÂo‰èÌH1ZÖv°B[>íħĉ0Ľ1²^qŭĤ…-ïPqÂNżKSW`.FŭĠ£ş3Ô¤’ŭ“ FExY?ÀÚ ÖÜ-Tħü<`)£ċġġ[ĵóÀ)ċĉHÍh.OĞ‚Ğw-lS'²WuĞ€ĞÀwQ^qÜ?œ!í4£†ĉ({ "IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_PaddleKnob_256x256.png0000755000000000000000000014263712467662066021620 0ustar rootroot‰PNG  IHDR\r¨f /iCCPICC profileHǝ–wTTׇϽwzĦÍ0Òz“.0€ô. QfÊ Mlˆ¨@DE €£ĦHĴˆb!(¨`HPb0Ѝ¨dFÖJ|yyïċċ÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Għŭx€Ĥ0YéİAîÁ@$/7zşÈ ü‹Ŝ HüeèéO§ƒ˙OÒĴTÈ_ÄĉlN:KÄù"NʤŠí3"ĤĈ$ŠF‰™/JPÄrbŽ[äŸ}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\NĤˆo‹X3I˜Ìñ[ql2‡™Š$ĥ 8Ĵx›ˆ˜Ätñrp¤¸/8ĉ p²âCı¤¤fóıqñş.KnjmÍ {r2“8Ħ?“•Èä³é.)ÉİL^6‹gŝ,qmé˘"[šZ[Zš™~Q¨˙şĝ7%îí"½ ĝÜ3ˆÖ÷‡íŻüRê`̊j³ë[Ì~:ĥ w˙›ĉ!$E}kżñĊyhây‰RmŒ333¸–‘¸ żë:ü }ñ=#ñvż—‡îʉe “tqŬX)I)B>==•Éâ ˙<Ä˙8ŻóXȉċ9€˘yPÜġßûĉƒâ›Ĥ:ħ8÷Ÿŭûp‰ĝ‘΍ûçLg ù‹kâk €$È t!0VÀ87°ĝ`Öˆɀ2A.Ĝ @Ĝö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`ĵóa!2Dä!UH 2€Ì dıA>P ECqBı¨*…*ĦZ¨ú:]€B=hš‚~…ŜL‚ݰ2Ĵ  Ĝ ö†ƒá5pœçÀùN¸ƒÁíĝ:|Ÿ³@ˆ QC â‚ĝ!H,ÂG6 …H9R‡´ ]H/r AĤ‘w( Š‚˘£ Qĥ(OTŠ…JCm@£*QGQí¨Ô-Ô(jġ MF+Ħ 6h/ô*t:]€.G7 Û—wè7 ††ÑÁXa<1á˜Ì:L1ĉĤs3€ÌbħXyĴÖë‡ebĜì~ì1ì9ì vûGÄİâÌp‡+Ç5áÎâq¸yĵ^ oƒ÷³ñÙĝ|= ?ŽŸ'Htv„`Ba3Ħ‚B¸DxHxE$Ġ‰ÖÄ"—¸‰XAàP4407°7ˆÔô&Ĝ9¸$ĝAˆnˆ0¤;T242´1t.Ì5Ĵ4ld•ñŞġЇ+„s;#°Ħ ³ĞŬVï]=iY9´FgM֚ĞkÖ&­=%ĊŒ:Ž‹nŠŝÀôcÖ1gcĵbŞcfX.Ĵ}ĴçlGv{ŠcÇ)ċLÄÚĊ–ĈNĈÙĊ퉛Šwˆ/Ÿĉşp+ı/<jĉŭ$.$…%µ&’£“Oñdx‰ĵž•”Ĵ”TƒÔ‚Ô‘4›´½i3|o~C:”&½S@ŭLġ u…[…£öUo3C3OfIgñ²ú²ġ³wdOä¸ç|½µŽµ;W-wsîèz§ġµ  1ş7jlÌß8ÉcÓÑ͉̈́›È3É+Í{½%lKWrŝĤüħ­[› $ ĝÛl·ĠlGmçnïßac˙ŽO…ìÂkE&EċEŠYĊ×2ŭŞâĞ…ħ;ûK,KîÂìâíÚí°ûhİtiNéĜß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§˘sżĉŝ]û?TĈWŜİrj­VŞŜQ=w€}` Á–ċš˘š÷‡¸‡îÖzÔĥ×iוĈÎ8ü´>´÷kĈ׍ E ŽŒ <ÚÓhĠĜĜ¤ÔTÒ 7 ›§ŽEğùë7-†-µ­´Ö˘à¸ĝ³o£ż:á}˘û$dËwZßU·QÚ ÛĦöìö™ŽĝŽ‘Î΁S+NuwÙvµ}oôŭ‘Ój§ĞÎȞ)9K8›vá\ÎıÙóİç§/Ä]ëŽê~pqĠĊÛ==ŭ—ĵ/]ıì~ùbŻSïı+vWN_µızêZÇuËëí}}m?XüÖoÙß~êFçMë›]ËÎ: ^¸ċzëòmŻÛ×ïĴĵ302tw8rxä.ûî佤{/ïgܟ°é!úaá#İGċ•×ŭ¨÷cëˆċșQ×Ñ'AOŒħĈž˙”ŝӇñü§ä§ċލ“f“§§Ü§n>[ŭlüyêóù邟~Ħûâğ_é›Y53ŝ’˙rá×âWòŻŽĵ^öş{Ööñ›ä7ós…oċß}Çx×û>ìŭÄ|ĉ쇊zğ>yz¸ĵ°÷„óûÌ;ĵl pHYs  šœ IDATxÚì½k³mWu-ÖÇ˜ŻµÖ~œ‡Î‘!Ħ–@YdlArm—ÔM*\'q\ñu\¤Êö§|LúĜݸ\ŝà*WR7ı$. ħMKF !ÉèH¤££³ë9ç#4ût[íô1×>dgU’öŜkÍ5côGë­·îäêëGĉġƒüÀċy.eY:hˆ8ç\Q’çyìŜğßÇÖy|ñ‹_tUUù,ˤ( ç½÷ÎıÜ9ç³,q""Y–Eï½xïcžçs.L&“¸³³ô<áċf³™[.—Òĥ­„dµZĊĥmED˘sNDDŜóž÷ÄĞ+á­{ıзଢ଼?^7Ë²Ì•e)Y–Ċn#$7ÀÖ֖û?üüĥÛn+żŝú|<{çœTUċŞŞòŜ{c)ĵ÷™ˆHŒQ²,ËCÑ{³,˜s…ˆĝ£ŭ—‹ˆ‹1úBB(ğġ‘‹H…ï1ú£‘ "­ˆHÛĥuÓ4uÛĥËÂĴmÛşg³ÙÁ /ĵpĝİO}ŞŜt_‹…ßßßw‹ĊBBúë蜋W Uĥ}M§S罗<Ï]–eâœKnô/|á Ġ­·Ŝ:)Šb\E•eÙvŒñ´sî1Ĉ1ĈQ–eeŒħ‘Ü9çBŜ{ŸwŜ9çŠcĉŜtĞ.Ĉ˜yï£÷>ŠHî½/šĤñŜ{ç½÷mÛzñÎ9‰1şîĜY·É35`,|÷sèŝĊBBhbŒËÂLDB{1Ĉ=Ù‘ĴmÛiŒqÖ4Íát:ŬŸN§ûóùü˜î_ŒÑ9sĈĠu-!„Ĝĥ­ĵ÷½ï½j€·÷ëo˙öoŬŬwß]:çvs§œs×ĉy~:˲wŠÈ5"r\D‘›œs7v?çyžûĥm}·ħm[є!Ĉ(yžKZ‹ˆHA²,“.|眄Ä{/Îıµ÷âsÎĊc oZQƒá½sÎé1˘s.´m+ñÍ0¤£:çê²ëiŒq/ĈxĥmÛ3mÛ~7ĈĝrŒñUy½3Óċryxpp0û‡?ĵĵşR€ù×ŜŜž+ËRʲ”ĥm]–eş)×ĵŭƒ>èożŭöQY–Çò<ż.˲[Eä"rG–eïʲì”sn[DŞBŜĥmcÌ;ŻûOέ?:ü9Ïó~ëĉvÎġ^ßcì˙?„€aw˙Ŝ.èGağcŒŭqBŭwdY&1FİëZÚĥ Îı6˲&ĈĜ,—ËeÛĥ‡!„ó!„×êşŝNá›!„gğ˙|ŭġ×O·ĥĥzKuxxè§Óİ,—˨ç~Ë-·\ .ò•_½—–gYĉF£‘ë6çïŭBüŭß˙}˙Ê+Żl;vìY–Ŭ("ï‰1ŜBx·s(kÛö]1ĈŜû‘n"}!Ñß+p&FŬx(×oLŬÄş)ġĜxÌn;6 zŒ£ë6~Œ1öÇÀë1ĵ÷’eYo(4:AcôÎ9ïœ+šĤ‘ŞŞvbŒ§şc„aÛĥçcŒçDäûu]żtöìÙo?÷Üsß\­Vß~ŭġ×_ŜŜŜŜ4aoo/;ŝĵÌf³XUUĵjFWäġÚkŻı,Ëd4ıñxœÌßϝ;7ŜŜŜ>>›ÍNyïOŽF£cyž_B8]×ġ!„›Däzïŭ;óŭğn\4$ĝYŭ<&ŽşÇĤiú ?vǎqá R£´m[×u}&ĈĝbÛĥßnšĉ…ĥm_‘ëş~ùàààì=÷ÜsÀáûß˙›Ífħm[ıíĥÛƒĞÀ½NŸ>}g˙Á~àNœ8QÖu}2„pÊ{2˲ëœs7F£[½÷×wáüiçÜqçܖˆ](³,‹ÎıP×uì6·Ó¤şCÙEDúM žóuòÉP^˙ĞÇÂh tósˆÏßĈÓ<F”v8=?5nŜ{ŭlìÎ;ŠHì@KiÛVò<ÏĞŞşħmÛÛĥ} ëiÛĥgBß(ŠâĞUU}ŭ—^zišïíïïŸûìg?;sÎYÈĞŻĞÀÑü<Ïe2™èŽ""ßùÎwĈ[[[§ŞŞ:]–ċ{ĵ÷÷‰È­"òÎ.ŒŬɲl[Ŝ,ċ1Ĉ,„àÑóê&P`m[išĈÜxş‰ò<ïÁ;ÜÀ¸ÙĠ8hŸĊ(?ÜÌx<ËğcÀżÇHF# ûñû5UÁïAĵBï G2!Ѩ"ĈbŒMÛĥóĤi^!ĵĜĥíW‹Ċóùüé<ÏżSUĠŜ7ŜĜˆˆœ={VdµZÉûŜ÷ІáŞĝ§×ĞŻêbŒŞ*wìĜ1‘€aŝ׿ŝġÇÇïÎóü.çܝÎıw‹ÈµŜûwçy~Ü{?‘CpÌ:ïaö:†ÊY–ġ n:ŭ†óêÑÑCë1€MŽ•€ÎöŸá4BÏWnšĉ‚¨7³Ĵ8ൠ(İ÷§(Š ΍7żzóî|œž—”Ú°Bxiš—ÚĥŭĈ|>r:~íüùó/ŝìÏŝìy8žġĠWŭısçb!VURˊ?ÑàÜıs,K·µµµ–×˙Ġ_ŭUv˙ŭ÷oF£SŜû۝s?Ġ…ô7ŠÈí"rCa· él°…ı6†’sú…‹^Ú*×Y^SÇ(™çkÇÄkàTAϵc9^¤€Ĉî˙1%‹JLjÛĥ/I.—ËכĤy>Ĉĝlá›ĞĠêÙÙlö×_ŭğ?÷s?wÏûġ×_wŻúŞëîW|˙ûß˙c ~˘1€“'OFġ,Ÿüä'ŬŭÑMĥ··oȲìĤ,ËnpÎŬêœğ×{k–e';/ŸÇ !×ĥ­kÛV²,sŬĈòşĝÛĥ•îok›smÍïuƒr›k÷è%uCçĜH ‘ÁßĞ!ÀüC}=–Ĥ(h(4GÇM‹×ĊŜ_?‹U "ĠĦĦÒô‡#€2ï}Œ1ç\ìî‹1ž*Šâ”ˆ|¸ë=yAD2ž|á…Q×ġ÷ö÷÷Ïŝ?ŝŜ5×\Óŝ¤â?‘ÀŝŝÛŬŬÂ_„N‹È yžß^UĠ'œswŠÈİŽsnË9W8ç”-ç,ôœCW ïĠ;jY ó`Îuqèâ×ÍŬ4Ío^ܰu]Ż!öÎĞAžKƒ òY†„Ż_ŻÓÂ)8 ĦŞÁÚ ïƒĤ(ü7¤ĝŝqšÒ½?tTċŭÂ+ËċòÓéôħÂ—ŞŞz.Ïóŭ“'OÎwwwƒˆÈ3Ï<xĠĵÍ_/½ô’Çn<ûŞŞ¤(Š…êòÊ+Ż\_UĠŭEQ<eÙEQĵË9÷ÎnÓ49–Ät1qn˨;.Jôèè9ġ¸˜{s}Ëg–—ĉM˘ß‰^VSôp³£ÇëLĈ&XÔóEOnŠm{[P#†UNĝŝv‹oĥ>¸5°²m[Y­VóşÏ.—ËïĠuŭl]×O´mûĜx<~öÖ[o}]Däğßŭï8qkkëDzáÇÒ|ó›ßtğğğîÔİSҕÛÖÜŜŜŜ­yžĜ9÷ïŭGĵ÷·{ïOЧíJút·À{^ ‰GoŒ­ĉċ¸‰,OÌÈ;zQŭnÍ}1—ĈÎ›sz6h`aƒŸÇsፊŸž>½&ġŜV5ï)G]Ö9ñˆ]çb !¸ş½cı\J]׋ş_lšĉ™ĊbñdÓ4˙("_ğóÎ;_tε""?ŝ¸Ç⽏·ß~{ĵjŜFŻż˙ûż/eY9wKžç?—eÙżÈ²ì}ŜûI·hÚnqğ‚Ö°.x\ àñBċMÊÀ– ‰ĠGd^?gˆÂĞA@ Î*Ŭ1 ‡˙ôwBĤ  šž/F,şiëúÍÁ²,׌—ŝžC{½Ŝàlpĝ>â³Q€VC×`”5M#ËċRĉóùĞ‹Ċâ!„˙Ï9÷PÓ4_N§g>úяöŬŒO?ŭ´ûà?Ż€á°:ú²,GEQœžL&·•ey–esÎŬá½?•eYé½Ï-gäĵÇ·xĦâ&´ŝŽ SŬÊ àÏê9jڐÚĜXAê½â£âȄĦôk•‹˙བྷĊbÑ_“–›ĤéGL‘ÏÀûa]7Ş\šÔÏpUñŒş|>ËċrV×ġ7ëşŝĵˆüßeY>•çùŝ{ŜóžöjàGäġôÓOğ²,ŬÎΎ{ç;ß5·ŝùçwo¸á†;?ŝ3“ÉäCŜûÛBïŠ1žôŜ—şÙ°ŝnZÇnáĉyŬ¨ŞŞÇ ´Ç Ë2)Ëò‚çcŒMÓÄDġu]Ëjµ’ċrùRáKËċòoĉóù˙sï½÷¤×ôÔSOeŜûpçwĈĞà‡üzŝùçvy=ôCċu×]wŬx<½ŞŞŸ-ŠâçĞŞú`QÇĦ;íÓĈġŝşÉ|b`J†–)Z,}k=;nh˛Z5vçĴԍLj"ÀJ7R@Żš•L^Bꅛ˜5 tCĞ‘ÑM\ĊÚg­2 ĊrÔIJúÜ­T ÛB !„ĤiÜrıôu]·‹Ċâ›ĞĠê³!„Ï­VĞŻŜ}÷ŬŻég{ì1÷á8^5oÁëŝáò'NœFw–eùóUUŭ‡EQÜ^UĠJcuĦŸ‹9˘.0ëïZai•ŭ³rí<µ@qX-şk=•ż#˜âó[uy>Ÿ'WŜ!fÂçÇxDŠkÀ“Ó½&ĵ·ŒkıZ½ĜƒÁĈŸ V.:NEĴëÚ-‹¸\.ëċrùT]×˙6„™²,ŸŻŞŞéĤ›ŜvÀÛxòÉ'ŭööĥÜzë­Ñ9~ĝá“[[[)Ëò&“ÉNJ˘¸Ġ{"Ïó‚E\èêıêş V(q˙7ŭ=†İèùtĦéï;Yâì‰ÑÛbu7ˆ =?Ĉ9·*X²c”]7œ…EèFÇ{)÷ çĥBwÍËñ>Y†ÎŠšà1^E*²ÊıT²U˜Ë²Ĵ̲ì‹Ċâ]u]|µZ}şišż‘|ċ+_ɜsáŜ{ïW#€Ëx=ünggÇŬu×]ADä‘G9vìĜħ{ŞŞúò<˙XY–,Šâşá³,‹EQÄ.Żwè §ž9ÏsY­VkŠ[o1„Gƒ‚ċ¸!2M*ĴÇʈµE@Bolñ8·Œbİ:<h–ŠP ÀäŸż°ŝŽßŻĝ– 1òAĊX c'(ËxE ”µž!GC]$VĞUÖ)·mÛ~mµZŭÍrıüLá‹÷Ŝ{oct>ú¨óŜÇûîğ/^5Ŝğx żiŸŝô§Ë[nıċ§Ž;ö³Y–ŭJY–÷—ey]UU’çyèu=wĴÁı£sG†9„W݁l4k³p8ŠĦ²ĉ›VË-’w,†z/ ™O…ìÖĈdO‹½!)ŠÂ £™W`c e’+Œo¨`"‘…ÉXÀ rĊ*,îâ"ĝÜĴ猆‡ïĦR‹;À/ ·X,—ËċçcŒ˙{Ó4ŝñ˙ñ+ú§EDŝúŻ˙ÚŭÒ/ŭRĵj.òġ裏fǏ?X,>TĊş³³óËUU½ğ( ŸçısÎIY–mV˜Í(:wqS —Żl µl Ùf.;z#6Z-°Tw’]GşŸ›Ŝ‡›ŻcµZ­]ƒ Ȇ€#&ë:¸êħà{Ïi“Uê´p+²b0’ANüGmÛJ]×qħX„ċr™­Vа\.ż]×ġżmÛö˙¨Şê[wÜqÇôGyùµzìħÇ2‘W^yĊĠu}KÓ4ż½½½ŭ?noo˙çeYŜT–e^–ϲl ÍÇòÓm…é İâ…Èу~F ,HâÁsÁĊĤ A(ĈX×Ïò̄Mm…Âìùq“ê9h ëX$ Ŝĝ–gçp›£ĤF[† iÁĜà:hH”àĴF|x)ĥ&s,RŸż÷ŜEá'“‰ìììĝÑht[Y–˙mY–˙|>˙ĠŻ}íkïŠ1f_˙ú×ŭç?˙y5Ho|—çyv÷Ŭw7ŸùÌgòwĵ÷ommŭĞÑhô+£ÑèÖ˘(\WÓ yž÷9>{.²x13’ÍÌ1ŭKEÜʋá2‡şVHßĊ˜o[||K€ċ·ĴԂK€LċpKz˜àûSiĊĤR *³IY–TEWaÏĊ˘s44lĈ)0Eu€N…+<Ö=WÁÔ‚¸Ġj%MÓ,g³ÙóùüoEä³7ß|óWO:5ûö·żí^~ùeùÄ'>Ż€îġĠŻ~Ġ)‰âïŝîïvN:ġ‰ÉdòëUUŭRUU'ĞŞŠyžwòôŜĦ·ÍĈ²T¸x9§f5n•Ċ~`‡ˆ<&Ál˘ÓZ½ŝí•/Fè™0„ pyÍ2XCŝ(݆b$c”ŞŞ.Ñ-…›‘ËĤ)ˆQ2 5Äçf#ŒihżY€/dÌ×­lĦËèu9·OñYg`Žż€ÈĦÜq’!C`ċäV”dE#˜³o¸ò`Ĥ) Äê`Í4p,ïÑ÷/ Y­Vħ‹Ârıœ/—Ë'Úĥŭ_Ĉñ˙ù|à"?š˙Ĵ<€|EáE¤ŭҗt­sî_ïììüúd2ı#˲RÙ{êċ‘áĤùœ–öt–eı&žÁQŝTÌ"ȰD78sm1êy(ÈŜÚZ”–D7V,”Ú ÉS‹}ˆÏžÏ*Ħ68Ë(XÙ:ĥzP陌ƒ) Ğ#Ğ!A!eZä,ĉXUN%1Uà¤ŝĵZ­$Ë2İŞÊeY&óùW EÏ:¤Öƒ:~ĵY1ĠHU,ÑO |ä܊PRŒŸe.òù[ĝ§2LRÂô‚Ó1ÄaÑȆ£<Ğ×N†ÒC4MóÓ"ò[mÛ.ŝġŻ˙ğ÷ż˙ŭç}ôQ7zˏ½xèĦ‡ÜÇ?ŝñ("²µµ}ôÑ÷M&“ߍFż1ŜÓĠö[ï}Ĥ›„QZ{0ÛMqXœyËcqèlqĊĠës9ğÓĴÔA=.N‹dcÉjuZ^ 7 EÜ·B)5Y@ìPş`ŭŻ•CyŽĜR3 °o %gfCX1”ˆûÍÎq$”Y H¸V×)µËċ2[.—?Bĝݽ÷í7żùÍÛm·‘ĝ•Ż|ĊèCzˍÀ?Ċ/~ħÈóüöÉdò;ñĝ×ĥĥĥNF£,Ïó*<Ĥʍ% ‘Bg-p¨6ž*w)pTUĠŜÔÊħñ…=ŝ¸`,O^8•Ó‘’,Ҋ4x³DFX;j2Ji ¤˘ŠĦÙÖıég6é 9q´`ñATg€É-CÀĠÜè(H˘÷¨ëŝµm+³Ù,ĥMÓÄÂ!„?kšĉÓ÷Ŝ{ï9‘GyÄ}ô£?ĥÀO<áïûîĝ7ó7Ùh4şs4ŭ^Y–żZ–ċi¨;ŜŒ Raç G ĠĦyÓp›ßËé+ïrIħëmLşÀ޲AĜ£Ĥ<§…o0Y i°,AĈ÷Öʉıä–JĝwÖbƒš2hFb)#Ê$ĝàù[-‹³À˜÷:`4„kH+L6şŞŞr‘Ġju_Ó4EŒÑ=ġÔSŸëğ^ï„gÛ;ċ/Ù- ıçž{ÂwżûŬòÚkݽ?˲½˙•˘(NwbÑÁSĈEŠœ~ÌS =ݘÁH>çv]Xe'|çĠVdħió§@¸ĦTa¨— û‡6EßeTßÊñSFÌ żñZĴêÂË1e RK¤$%ÎD ,óaGa޲„ĝw–ŞòŜĞA !ĝÂ=mÛŝwMÓdO<ñħïıçžW~ĝa—e™Ü˙ŭoI$CO0ĴyôÑG·s?SĊoVUġÉÑhtb2™„Ñh$yž{ĴĞ˘‡bvœŝ§<{rFo]ĉ\Î ­èR¤žÇ”'ä MSÀWJ` {S <X–*!òÌK+ÀŠš,áԔÄ´ÈI~–ħ³Ĥ#§Ò KaĜz|ÍxÏ,MB$qóÒbħĠTúbħÈş*ÖWB˙“ˆüğûîğo_DäK_ú’{+ŒÀ5xòÉ'ŬŬwßED{ìħŬŞŞX,żcüùÑh´5c7bÛħP#ß<ĈÊÚàİÙêyꅷŜË^ËAì]bÄÜ*“6‡İ›ĵ>W Ĵúĥ¸FÈ ÍSċ>ü/7[Yé…ĊÑH•äĝr$ÀÇK!–‘EçÂÇ´žÊX'?ñxܗ‰ċMkÖ DÎı{ĵ÷żcÜêݧ>w×]wÍà½o_ĥ­‘ĝC‹1~Â{˙;yž<˲moÇttá|y‹ÔÁjĴ…À´†^–ÇI-Z< eOE%)Ħ2YJÛo(Š(8e€Íâpêƒ.ġŭ8èïm*lߔFX·Ĥá}³z˜O‘2İÊ 1Kd;'ġż]*.¤k{<KY–â½wu]wĦτĉĞĠêġGyä‹ŭèG—_ŝò—ŭ}÷ŬŜvà駟vݽöš|èC Ï=÷Üöt:ŭx]×˙Íbħĝĝx<ŜÇQÉ=zsPġ–[QñsOxJÀÒjäĊžò0V‘ZDJ²ŝ@g á:şµ8‡€M˛µ£ÎÚl›,/È£ĵŽR äĦ¤V4`U[Žœç’'·ŒëQÎ×ZkCëI+ ÈûÀgQ–ŒÇcY,1ĈX†~išƒ,Ëf"òÈbħpoğà _ĝBŻ™>›ÍŞo|?Bĝ×ŜûOEħğµµ&“‰CO,.ö€ˆ0[ ;Ĉ x#Zá=ZoôÜİSö˘ĞĠŞç`Ɍ+İ0ËĈ Ğ\R{·€œ\ hÑ{‡Ĝ…ĵ‰,”0ÈQW-Ric C""Öµ#&bE‡x_ġ`ġĊ*ƒvİ’“7'Ro;ç~ımÛ7üñù½÷Ŝûԟ˙ùŸğ›oY”;ó#o>úя*ĝ7zé—î‹1ŝW1Ĉ_Ìó|kggGĈħ˲Ìaöͳeµ@™MġdÌË9ä.Ż “òŠ\:rG&İÍh+Lñ6m>ë-âÔF·KŞ–*ñ‹56q8íJá)VJÇzŒVi8…½¤ÒŽ„F£ÑÍC*OŽŬ—Y–9 6o‹ÈŻ…Î}ík_{ġĝÀ÷;Ŭ}ä#‰?ÒàĦ‡rEQÄ|0oÛöóùü·œsż\ĊNUUNëü"–eıÖÄc1û¸ünj3&ñĉc²·Mçħ—ÖtĞŞZëKp)Ĥ_Ê005jm:öh—úǗĦJ–ö´%š ĠyˆÏÎ*K¸ÒşÌ$LƒÁi¨ìh9%+b'ĊĦusĞv:˘(”rî–Ëewî¸sî?[­VŻ=÷Üs˙ó­·Ŝ:kšĈÉa‚ñ5ñĜ‹HğğğûŜBĝ9UUUìjŭkbœĞ3EVĴŜÈĊbqÁĤc+žZ˙ùÏ?üħ}Ĵùa€‚WÌ|îsŸs÷Ŭw_û裏ğmÛOzï5Ĉx}·€˘ŞŞBĜ³f‡@9´Ú)•^ȏĝ7slʏ"c=”–X`"×À/%ß2XCuó”ÀP4e‰|Ïĵ6Vw´…ĥCÄÍc2ŬVDú÷£²QjħĴŒœdsé>rEc(µàÓMşŽEQHŒ1ĴV+ß4ÍŬ"òovvv#"/,‹LD¨¸l”ñ³ŸŭĴûä'?cŒîÉ'ŸÜ­ëú?qÎŭŽsî^—e···ŬÖ֖h€ù?7ğàBÑÂ*ĵÖF`ÉlçmMıĊ”â(€ÏÑÚüu]÷ŭC9еħ­<ÖşĈTÈ~`½(.ìÏö IDATß?5gà¨Q ü£d*Py#q›4l]XßĦt qnŭĥ˘K~~mé÷"òoa9}êı7M#³ÙLĤÓi˙;q‘fı\ĉmÛ!"˙ŭööö_ÜqÇË+\ĥFÙ³Ï>+""/żüòäÂżtÎ}PD*ÌĦı’x,…‚¸ ˜s- ñPëm(Ú8VùŒı”"°žûlŝM›HC\K§Ĥ\ëఀңŒxSáùûSúûA¨~pîë³EŞ-Fzʰ͉ëÂŞ<¤D_9ò°:ñĝGÁcx]*×EG—)'֖ïóXŒñ×÷÷÷?.òĤböL  £ö÷÷ó_|ñ–²,EDî‘mï½/ËRʲĵüeě¤½ĝĜ]eU¸ÛnRíÄCƒ;­…ż‰bœZĝİŝv+ ·Ŝƒ×Ê>ç¨ìù¸£ĞÖ>ÔIǛԒ$³qËÈ3¸ĈÀ!o~ë”p£İȈX‡@Ö!Ĥ %ÇÊİçŠ×Ñé_p…JGÔûĤi!<ŝì³ÏŝÁÁÁY‰?ŝ¸ğƒG.Ë|ċ+_q"Ÿ{îıwN§Ó_¨ŞêçÜ;D$hx‰JğÜ8Á7‘b ä³FC#™(Ċ³nċùS›ßbäa­Ÿógöœx|Î7•옓އĊGqéyòĉW#Á6ùuĦf"z/ËcsÍ;}ŭʑ‘@Gj)Ĵ•È:–!ӟٸ¤RµTÙy(ş½ ß pmÛctmÛ!„_ĜßßêúëŻ˙_E$\‘ŞÀeżûğżbŒ“ĥmï !üráĉŒá´ĉİy?ê¨Yj¨•W×ġZ/5 ih™z1­ÙqÖì:$âXĴ´”·ˆêİëZ–ËċZY3µRjĥxNȂԟUŠĵ,Ë >HU÷á5çÖĜ7ʰYžŸ‡Á)QOÜÈ˂$œò°è6da^m=3\WİYŒÖıò(ù!½AÔ àµÉò,y†O߯³/:’B˙ñwżûŬ[DD>ñ‰O„G}Ôŭ³€Ï}îsÓ;żEDÈóüş·Úĥ Ŝ{Ż U ΓĥÊ!²‰ú䰙@cċíÖ÷D5uħĦŝ<3ÖĴ°šÂĝŸUíàfÔ;DcĤ'ßXÀ(ˆ}ˆ8£x†ĉŞİg1f[@äMŞA\ z?,e_k-qúÁs6é- cħŽĞÏ,%gĈ Ÿ§^ÏŞÔï/Ë2oêâ¨iš_yä‘GNˆˆÌçs˙–€§Ÿ~ډˆÜp î̙3ğ³Ùì#mÛŝ‹<ÏO˘[Y–RUU_е6ƒµ)-ŭ?îËĥäıqĦXġò!@  1@ƒÂ­Éj½ÑùRdŜ$ÖâçM`E?q”İMì;T8Rƒdġîó5µqÔĊM6,ÈŠİŽvËáÌG+JÑġ£÷O7] ŻacÏóR@ij”Ù&p r0Â̲ÌukêĈ,Ëŝ£²,ß+"òÚkݽġ)ÀK/½$""7Ŭt“ßÛÛ{Ïjµşoı\ŜB(ş~§ı#. ŜD†›(ĠÉYLAŒ8´ĥÂP}B£Ç@ŻĦ×È-ÊñİO}*t8Ü[ĝâ‹Ng ïíímM§Ó6MóÂVÁEĦ-Àfó5‹2˖vˆ[n!ĈXÛ=J9Ĉ {­/†™b)`0%‘5TWgĦN ŬTÒ´` ‰.ĝœR<‰Ħĥà”¸&ëŜÚYy6Ğòh>ŻÄ VːZ.ßwK&ÍŞ’à(y‹îŒÏ,5y˜T•µ×këšÍ\Ûĥħ£XŸ!<0ŸÏ‘Çĉóù[Wxŭġ×ġÄŬ3ÏäĴ°2ġŬÖĉ´:­ûß5j4°ĵyñX<™Ùâ.pôÂÍ6 Ĥ ÏQä05'ħ¤‹½\Ñà^‚ĦZ>ŜwNWYŠŒ')`QŠ)MŠŬßĞëúփƒƒ/‹Èrı\^4xÑ@]×ï!üT'`¸Ĉ7çé½VZÀCRtV^hufYžÑáTˆ†?QBħ9J_ĦwħúĜȤĤÖX€)‡²CJż›Ò!ĵÀŞÏs)7Uî8,ƒˆ†A+7<›½,ʌ qĜ˜aúÈÏ# ŽBĠ3£aA~+ YÑV*"ä…+LVtú{×E ÇC·ĴVĞmÙS'}Eˀ=ö˜S°żż_ŠÈ 1Ĉ›C%–€0ÔJ5°ìġ2o͆³”^Ĵı€UwȨX²âh‘­†Ŝ‰³ÌR$$ĈKŽÂ³ĉח"oÍąÌCUـò5XÑ#ÑŞèX¤,dX˘cħò{ĞjÀHÙ̵Sö`mf+zȃŸ‡UêDgÂİ<Ö6èîûNŒñĤĠju\Dd:^ù*€zŝ}ìcòì³ÏîŠÈğ½÷×ĠuéÀC÷TRĜ|b'huġÖĤĥĵyŞûÌâRS€­‡b…uú@ġzʲ\Ë×ÔKŞÄ0y(ŻlšfMĠbÊq++†‘VšË¸R‚ïçħkî² †ġC\Ÿ}j(?Ğ–S-ItĈKdĈUŽH,†$ÓB­HÄòêˆá zVI´á ׃jWĤW1F×c|gÛĥ'DD^~ùċxħ†7€ét*""7ß|³ĵòÊ+'cŒ×‹Èñ<ϽĥäêQNBáÑÉh9ó<ï-󤜷?e™qö¸¨ĝdQ€1uÀP.]`j$Úĥ•Ċbħ6(SœĞX7û V"Ž0ŸÀòàJ/EŠ–jÙPYŭÖDĤğbù“^òû™…^œ5$†*)á9sÇöD°HŞâÂ݆Fz¨e94Î u XގY£Y–IUUÒ4Mżĥ8ìÎ3:çĵsî´sîô™3gŞwóË‡~Ĝ]Ñò '"'B§Ed„ Vŭrı\óˆşĜp:*wŽY‚–Ĵ”>Ĥ–•Ó§ĵ%(™*İċyŜç­<. ûĈQ·€)Z#°eİïZi~'(#}Ôê§ÀWXĦ Tµĵ4·w[}VJb1!Ñp$¸IƒšÍ`)úbÎê6µÔ|ñ´*„FíԐQë|Y‹BĞMnƒ:Š1ĈèŜ|ízïŻ?sĉÌĥˆ,75\]´ì˜F'bŒ'bŒŬ¤Ş\^T'İr˙Y5Š RĞSĠ^{lÜ,i;ŒĠŒÇ5f˘öCèw#&ċ½ĊßB8†ûġŠ€CĊ²sn;ĈèT…s>¤³2Jó}Ğ̔bÚY9ĥJ˘%f.:҆‡Zp-5!.ñ‚Ħl¨4„M‚Ŭcœ+[Rĉí ħ` ½y <âP<Ş÷şêR˙!!’Tß˘[NÁj1RâM…ßÜŞÍ4aĈ7R"#ŒĜs„ƒ,ÀT´Ş›ŻS‡ kˆ“aÙ­óÜ9w}á$‚öWÄ<öĜcîᇑù|ž‹È–sn,oÎ7—nĴħVF,û`ÓVR^whĵ—öR^00ğ‰óoyÛU•yíóÌZ˜mâ?°÷D/ž[žN1ʰÂwdĞY Öj”a˘/Lk¨ŠU¤;5š¨´‰%ÊïEaİ&§ÊĜ)ĈìF½Cé Ŝ³şeµZ­á šv0F=OċĝĤiN{ïOŠˆ\9@ÛĥòħcĉÎı­(Ÿ'ĵhëât:]Ğq˘ç²XS(„˜"ħ §báÔ9jĝlͳ6˘%옲ì Z<€”Abœ„ëÖİïç…2”Ÿ"0kñX;ÏòRÊÀûâYi‰ŜKsyÖ}²€i+˘Z­V²Z­.hŭĥÊžÖ ƒÔ½ħÖ 5UUġç‡ vX>¤ĈĤ,Ĉ¸B8cÌϜ9EDžyĉwÙ]lÑ )˜è—WU%‹Ċ˘G˙···e_ċškY“ŠÂÙ›6iޤbŒX‘–żzxl™7ñì­<+mÁ‡İ8öŠëï,—Ġ•Ç˙jŻeéu+ŻgOjU,4ŬÀÁƒZŽúZ–ân*m`œr„İ!óOĴ)°Ò*ĤŞ L°âuÍëTu/vvvd>Ÿ÷eF\;ĜkÄ9ç&"²+"Ġƒ>8£êŬG”OŽcŒğ!„Q!rĜİ é Dİ$³ŝkŭ³¨³–@–.hKÜË`\o:+ôµPMW7:³ôá1‹2•Yı}*ì·Î×òĥ܃Ÿá†•5;ċSLĊ!à“ĞĴġ8¤ÏǍc{#OK“ġĝXj,u/³alÖİàÉNÜöĞu4­ĊŒ]Á=*½÷Û{{{£_üĊ_ĵÀ]‘À{? !ìxï+ï}T Nğ†NZ+_,ksġĉ"ñ…BR‡8ċz“ħ4Ç3‡jZ”Vîí·Ĥè¤pËxêBcf.Z6t|X.ŠkŜÉÒCü;ñ3ş8Ü·8 Äò0’T³?w+eħĈż[•n âÊòpl°xsĤhİF¤ÍۊpĴNTï}_FäŝèĜȸğî÷Ñ{Ÿ9çĈĞĠj´½½}ċ@À£‘xŝüùìÛßŝöŽ÷~'{ó̂zññx܇½óù\F£‘”e)ËċRĥ··×Ĵ!"èşi-% •×Ù²ŝŸ÷“OQŜ ċáY(°ENñµyÁ¤„9ŠğÉPXÜnΙ™$„ÓŞ£sniİó1Û¸ĥ­‹X½ú& íÀ>gżSjÂLÀħԈRWS$Ŭ¸ `uaHd&.Z‘—5†ıÜ)¸IèÓ*ŸcéŽġ$ô=êዢù|.óùĵ*—ËċC‘+èĵ÷Î9—-—Ëŝ¤ŽZÈ7Ħ´Ŭ:ï}Ñĥm†2VX˘ ˘yJUUrpp ÓéT&“‰ŒF#Y.—½€.XÎ-54äÍĈÀ.ĜĦ ħ ‚qoÉbvê9kÄà#7² ƒ1ċ-=ğU'òîİöŬĦ\ܢÖZ¤%ÖPĦO+Œ­İ\Ê⨂›iXˆ f֔#ôNÖ¤\KÏÒĵ…c‘‘X(Ñ|îv´Ĥ*a˘íhh‘™‰ŭó˜w&2zÌä{†CĞ$Ñħ’÷ŝ[ó!¸J“*Ç1b‹! J+uà÷+ŻĊ{ßwj…+dl¤OÁ C·'ŠċrY]Q& Ŝĝşs‘ µòûı BŒQ,K9yò¤dY&ÓéTΝ;'×]wˆH  Ŝ†È;·&è¤Ĝ„V(k ħrÊÚku°Ħá2–t¸ …r‹ġgyyĞ4jbĉžVËĈĊRÒeŞ6{WEµ9üF•hFċрjtĊ<|4´<Ċ‡ï7$Yi”žkJyiHÔsh˘î1S=1öüŻV+9qâ„, 9{öìZ:¨÷RĞhCßm˘U–e#ŠŜeXYŒq""—Ğt!˘ĊA+WCµnu]ËŜŜžloo÷MjY8s>읚Àf³a¸şiŠŻĤk]ÖYŭŭÖ8*ġÄÖĥĤ#£·f’MвÊàLñ¸ĴÇ×g•TıW€Ctkä7ñèó×4INİQt¨C‰Ĝ‡5^,5ž™§¸v8šħJ şù•ù:ŸÏe:šNÉj‹á TwOsï}Ñİ…Ç+B+äD¤Ì²,ëšCñOnŜ`… ċ÷öödgg§÷Vçϟ—cݤċCÜÄĴ½ÎıçşqĊôÚ!Í6І…$STZ48.sĜo‘K,’ n^È;ç´Ä ‡1­àĞÍ'fà ydë<ğápİâŠQèïĴŜ ÖÀgŠà_jÖÄPd0¤ŽdñCÔ¨kIO~ĵ˲”sçÎġĦ>˙°—šµ~ßE#Y‡Ġ%ÁÊË2Î9ÇqX5ÒVÛĥ2N%Ĉ('NœèµÏ´zâĉXç 8( ı_³´ŞŒ§ĉñYBÜxVÄÁáğĊDCχ%)&ż ­VïK}q_ƒuL%ċYġí–{˜-ˆ×†Ĉi(ĵĈ”À"aŭžSĞêĈQ˙^–Ù„)ÊQp/Ğ"ĊàˆU×/3_EŜTí=88è×2>LĜÉ Ö$G¤Ŭû³,ËryS($†â3ŝÍv#o-d˙Är]¸€ġX*3~òäIÙŜŜ–Cy7Ä9'§NZë~b€5RëĴLVÏm´)È*ZE֔ĉ€5´ÑüİÊ>‚5`kè&FeİİBVŞ44cqˆRm¤,5[ëÑX IDATl6“cO€{7dż7Ĥ‡‡‡è0"`@vh`NĦhÛĥê À‘ċÁÚ äs…t‚ Ê  Š`jg ’tcO§Ó^IèĜħc2ŸÏċġ×_‘Ó§OŻ 2XV{ÓCŜ„޵ĤêĵVĝËê<,ÁujÜĴyÊ2FĜ˘ŞĝĤFĵyXtԒQ{ju#²VïÁ‡Ó kş.—-yÓ[Ŭ„9‹Ûş•S`­5ÚÜYÉ<-}ĵ?ZĥCÍ>½ĤÙl&ğğğk(üx<é;cµGF÷Ğ=#Eù(z‘&ĉĞĠ޸˘UĝRïœËcŒžÁÍkô†Ş-çʉÎó\vwwûžè³gÏÊ5×\³Ĥ6”Rċħ2Ĵ†—Ħî<‹ÉgYXĞM– ç§)l Ui@*.—°Qˆá;“•˜”eQ¨­ò`‡+U}ÒC䰝%Çħ‘ ‡cp*ƒÍaV¨÷^s~=“İħ1gcÏ= eY^@cWáÜüĜÚ;Nû‘_ZġÒêşáhı Ö234„Pu•:—ŠX.ĊD5òĤêH´ÂHÌg´ċsm5 Ê‚ŞŞŞïˆÒĊĞb†c”Ó§OŻĦ¤HÊAO‚­³‘Xc“`Ş–kEV¨8´ppqħ†{š*£’4ÇÀ£À,Ú(Sn-ï˜ ™-™Rĉ{ÀR[̟àŝž‚c +ħú,Ĵ1\X~EŽW °™‹SLüÏC7Œħgñi˜†WE>–Ëe}Ş F £+½8-››³ʕ÷~ĴàŠ0á ™Ò€ı”fm&FÁ5·QDÉ=êġ···ekkKĥ··ûé‰'Ö4چÊeVwÜĤœ–ó|&`Ÿ×Ô­Zqj†!׍`Cŭz6.ì uá 7e  [g1*á–^kĦ¤dÈQ’™xĴ%˜jjJĦ÷œĤX*:˜6X½zŬËĞYòÙ>cUƒFĠàpK(%ĈPăû 0RÂ>&–X’^j¸•›Že^Ófġ˙sĜŽibÊ£MDÙL…|œ·ë÷37zjp†EëE0ÌÊï1tbêıñĉÇkËóĵĵX6›ˆ°ĈÎy~W*%䈔BġzèÙĤZùùiν鸛^I*ŞÏßY×użÑ1œW^€žbħèġ˙Ĵ.O[Q§ġ>Éĵ÷ ƒ8*(÷ŜW"âğ“uI‡§­b>ƒ‚•× “ÂpSs¤ííí^@ä7ŜÑh$ĞĠJdwwWŞŞJzló gHRÛR)fş'[_Ŝւç6Tß>Ĵ<àĥÚUÈRòµ(ĊC91˙]KxsuÀ2Xİ*AŠbħ!’YÏïbĈ—[ß7™Lzá[ċ÷#6…ŭŭĜ #ÇYXqÄo,,qŒÄ;ħŜ²mÛêbuS¨mfoĥdŽsôPè%RRÔ,n€‹F­áh4Z£ġN§ÓžV9™Ld2™lägo‡0€TĜ?TúC4ĜŠ*RäĈ4ôšÙ€ Í ³úÙ­Ħ§)îCJà5ċyYûżS7 zp büYFyËzŝCÏír^MÓÈŝŝ~ÏMİŞŞÏëcŒ}{ĵĥŝŞÄ=ĥ‡#{V#cŽâ8eÁû¤5ÉĥċÎıübŻs0€I£Kœ÷>²%gfž%”ÉTXm“ä¨`6›Érı”­­­[JC,ͳôA Q_—jÁE’>ôˆÈ,Gĥ,Êħel.ċ5Ô*œ˘s^ŒLC”€Ğİò7\mÙÜtíİÍWööözşnQ½sRI:4™Ïçè@ †&7×á>ày˜8żÂ cÇÖ-Bù1!ıĉškPŠˆÏ²,t A`VhŠ|rĴŸnmmġ²GXÑҝʇéϘ#ž;wN‹…œ8q˘O¤(Š#a³ˆx ÓQ †ÇV¤ÚlC“g­÷03pÓ9]ìßy#£—²SĴfÔ÷X܋ËŬ°¨ĵcQšù5›ÍúĵÉ0HAĥ··Ċ9'òÚkŻġkDħŭŭŭµúV‹0°şûŽBNBj7b :çF8 ô²Ş•ò'âC•ˆĜf‹^“Ġa‘´˘!­ĉ@ x ĥ6·ˆÈZH¤œjDB1´ÚÚÚêËZ—²ù‡*.ĉ£”‡òGNƒ…ĈèƒËq ¸^Š÷²6‡Ö˜.†‹‰´Žr‡Ò’Ôu~o59 wÓµ(…û1VĞUYİĥ…âZâCLj?+€FÊj‘NE˜VÄċ½ƒ,ëş. …Û¨ ”o";v,‹1–@bŒQ§#°…-¨,ò€Ħö¨Ħ@`GC#x„b‰ÈTSéqŬüj‰ŻTw)i¨T¨ŽexcĤ¤Â޲R 5V=Ó‹p´)ş@î>Ĉü†4ú†ŭ£”Ë}w¨Â¤›UzĊŞ4ä_,k9ħo_6ŝXÌT 7–A‘œ…Xq€Ġj•İ*Q:#€ÎŞz)²,˙玀ž …"³ ]´ÂVZ>Ô ’W,ÉÖPÏGYŬŜŜŜÖ]Én˘T͘-n˘ħF~[›˜ğSßs”7˘ĊHm ·ù}Ü#ÏJĊEdn~%_Šâ# ['ġ2Z݌>lf&§äËFuà´ÊŞ)ñï}µ\.Goĵñ†‘Ë3À•vŬûpU;"PÛ=EÓäZ§à Ž„ĉ‹I4jy^_AΝ;'Î9ıöÚkM|_ĜÁe5° ?"ÛÌëĥ°Ž.,â("–—ĤsŸĤlß^˙†› ,›µŽ `^)dÁfP§ÓiŻS#×ħ ˆZ–ލİÖü­ÔÎ"CĦ‡G=LŽ x”Y÷ĵGmÛn?˙üó^DŽÔ¸q7”eéE$!dP˘ê˘Ò É2ĜœS[„Ċ ˜ğFEéÁş•¨eCԍ !ÈÙ³g{úĤ†k?ŒĥC§ĤŜâbÓÍƒó †š?Ò°;ÊBWZöĊn(Ĥ!o"ä¤&êbNµx_jĜ~)/΁x•È›-éçϟ—ĠjµFkGZŻŜK í-j5ĥö"™lˆw˘:ĝĴĴŞÊ¨u àöt:ġŬÚq—m:ĦÁĵ€’fҐŸ×°œ)•ĊÄìGTǍa—ÖeĠf˘Ï•Š6…´VˆZàG-“múx²n¨T‰3•ż[Ŭ›C#ÁßJÌF=¸Wâf³Y?µ*„°ĈSÏÏó”è£ëX6'ñġZ²²#ĊYÌ­èĤwmwú—ß   “ż ĈjÉ@³Wb{!7ßĞŸĠҊnnFS•Zİ7bħXôe4Éx<îċ—ĤÓİE!“ɤ@WÑ>j¤€e°MeĊ!&ßQBcK·Â..%%Ĝ¸°H\ƒeş.ö{ŻT¨Ż¨–—ÜӒtQ²ğğÛçñÈâͨİ|>ïyGbbġqX½,f­f-½÷Û^ô#덠óĉc&K–sYÉšèş PC°ğÖ4\CİmFQµj ä Ì[µ1D9Ĝ³ÙLN:%˙Ż£64 m8.ż^lT²İ÷üJFDš½Ġ/•äĉġ‚JĠj°GŽÍpĜ :3TĥbϏ(áÏŞFŒéXmëĉȎJ÷IGŬż,ÄK×Ĵsx³Z“l˜À€‹/J=9kèĈVVי‚ĴïUP‡£vµé„V%ƒ°Ôù[–^ŠÇ= hĥp6˙ĤhÄj£ŭa…÷Ši譑 ĉŭóùĵwšçF£ŝ³ÖÚÑża3FĴMÓÈ|>_+‰³÷"œñ(3ĞÉ,EC#PÄwBG~¨ù†EÄu2CŽ=“Ë­Ħİ0T:ö^€ ߅ëÖ ĠħëI{˙ñ"u(/%S ĉžİİĜà˘mĊÎıŭXû°~Š ­¸’>Pğ]çÄûqg*Ŭ4ìîîŽ]µ•ĝ'ᅑ–×Ô`*) _³ÙLĤÓi_s·T0ĊÔf4Ö:˜ù#<ŭ6Ô ’ÓxjŞ9[&L÷e|À"ázäŜ]ëĜNœeYì€úmçÜĥˆÈ×öµĝôÓOğ~ƒñ’A@ÉcŒ£ĠÀĴ­ĉfDó1³.Tëʳú°‚…Ü5!:ÎÄ˲lMR›é ĝ(KÉEÖ9"P¨×„‘ù|ĤA k4ġ\•bµ­YPġZtAŭ¤äîÚ5·µµĠß'ĞŠ \ eçĴa5\uR§ ™50żGQŬäÈà1ġܜfĦùG-‹ġÉXcî1mċ–m./:ç48‹ÈˆÈŸŭٟ…ßû½ßs—@ĝ‘ÇË£”|Ö‹V ˆ°˘2 ·¤âñ8]@ƒÀÖùÚZÖ DÚώ#Éû[6 áqô|œB3gÎôŒC]Ĵ}èb_.—rxx(!™L&kgşġÁ˘ŝŝ’GĴÓħ²,,Ëd >e<ËÁÁAżùñj´…í¸šïììôĈ^™˜†êfF)Ŝèz~ú=lü-­>]kVNŸú,É3ŝJ§1Á‡ÏǛ%¸o$"ÇşŝĠĤGĦgÎıÂuW½I³K#ĴùÇzy\ŜCšŻĊòP‰FKÙYJûĠßé G3éĈS“Z#%YÇ?ĉßÚÚê1ƒƒ™Ïç²½½½ŬèGI³Ñht>Ħ@ÓÎΎdYÖS(sM**¨šeYßß 6şpĠ{éçĠiEƒûÔ1}Q„[Ÿ‡râııKï4âb’—ríuV$:ĵç\^°]ı÷j`Ô`àÑ臐àu<5IŻۘġüx;wöY¤SlKv,İÒ Ġ%ȊÀŬïcwĵ"„°³X,JYmRŜhş¸żÄ~€Mı,‹FrǛ5K$ĥ hgis8†ŭ×fëßu!_€y úpĵôxj4TÌËQ¨Aݤ|ápT5ŽşYu\:ÒJħqi>ŸŻ!â¸ĝÔ` @Ş÷7bşy4dVݍ$(,Ÿİ§R݉,£W=ï<Ï{Ż­ß§Bš~#ˆ4Z¤ä2ĊŽ9ûĜ'‚ÏP7˙rıĵ á,5߁dŒĉxf_t(8K†% …FËóóÀYŬŻ1ĈñĞŻŞ\€AU #òĤ˜cë4´SÍC½&8á"J°e :k&`™‚–Ûô;ïÀÁ'8W½*9Gg"X6ô:Ġhê½ÑĵÑyV nN˜wyA ×ʰYĜÏZdbW²p½pTÀ³-.€5ĉ ߯Ï7ĈèC£étšqċàRAÀ"„0Ž1^@JVè‚£s԰܂ÇVk‰Vo6˘ è%8_S~7ֆQ¸oĵ.$]ôpžMVcԀ Dô<`?sxx(Óé´÷ŝ£Ñ¨ŸCŻ£ áĠ¨AY–2û1jöê=™L&}êqpp ‹ĊBF£QL*Ҏƒ\zqVŭĴVGSAŒĴOÍû³,“ƒƒƒ~|–΀Ôç˘ó SòazÏYSŸËoÚ×Ħİ'.Yh<‡ùVûvJâÜ*jꈈ 27ħ“s`’[ÛĥŞÏ‘µm;™Íf…÷Ëğ÷~8kĉ<όSï†%@d[1¨§ŜŽ ĉ›NYzvX–áùlRĥĠ£$Ï´˘IÌÍÑÛê:ż£Š}2Zo•uŭ cÒqDĈcĈ(:c7MS>´Ş=•X¸€ğQTñ(ShX)7"²ô6(Ĉ$˜ıÇÜtz|<.ŸĞÓDcÀ{·|ÛĥċjµÊ.ËĜR†FŠ"Ş‹á86°Ĵ. ‹€£‹D½†\u]÷ù7†>–:*~‡>ŒF0<×Y ÊŜŜŜÚĴ>ĵ阯ò¨/ĤFµ˘@~ĥ^żnt½~ÛPhT§$Yy).|M­µG\™slìuĴĤÓİö•Ċ2ú Œóµuñµ|Ş\|ŒbԘcş§< ôŒşôûÔ id<Ë|>ïï§nôĊbÑs5°Ġġ­Qnş‡@É4x‹ˆ ,ŒD_a.€Ġ`͏P Ï9ç›ĤɗË;JCQR€LDr•JynkD5^´UŝғuqŒĝ#½˜ùÓhĴ2JŞ– LŞ5€’cZòÓĤy3–žX<Ú 3 12QO-¨"a8Š˘Ĥz΁ùùaĈy/ĤP,ġ×Ì!ğ~ŻQdY]mèĝĜŠŝ Àԍ‹.~Ä%ĜÔóœÏçPŽĠĜcƒħX-ÂŜĞÄm­lÄS£Ú5²d ’"^Ç*ÛĥÍ6•í €ŜĵcB(BŽC`Ġ™ÑÇ]yì½­6HKO‡D`ˍé"ġŒÖ"˜‡˜†. ìZÄE%0Ĵħkä‹Zókž‰¨FGë÷ZÀkÍĊM"şÉ(à—†ëàĵ>œLÌ-ĜzŽj<4—ǨŽĞ!şf´äW–ċŭšŸ12ì°ĵ†´WŞi Ï0ˆV)ö…XÄ.kĥ£n6Mݧ@+‡èĵfYħŽ­ÊYÊAĤf+zï]7Ĉ/cpI½]#PcŒL§´<6#ĴÜ#y9fœħyÊ çFx>‘¤Ê3–YÜn͍ġµœ§ĴikȋċÌmħU£Í·QÍFI+‡Vşµ`[[[ŭ+M,À”9\×ĉa”8 EïˆËÇ ‹ÑÔ {0˘Q£a °`Jˆ¸Ž…Ì# È?Oî=ÑÊ#ĉĝ;5Hz>–  375ĥ§ú^bÔ`Ì=U'âséŬ€zaY–ıN<‘~Ĵô†³)î=G–VPk­ÇE0 { 8MÑ|5z{Ô“ĞZ jZzSĤWìLT –ÊÔ³"ÓS%§2ÖZOŸN§=bŽ %’–¸}+r2*ݲÙjì´ĵˆ@jUUk4fċèĤQĦ%Ç5Žóí­ÊŠnNÙhIVßǓŒ‘‡‚‘‡Ġ\iB`_JŽ{0:EC…×oy{^˙) DoWaĞñıt"ê8çò,ËoLîÑgj.7ñX,§À²†„Q/5dQ`ôĴx,kNKB[a">4ĵcAJônè‘ħÈù­ŝ[nħ³Ó &RÜŬôz/4ÚA^2üXtU˙‰òT´CK„¸ñÀZ÷ĠZĝ荭6Z4jÑcß’żÄDŜ%N‹÷Bï+nf6bìÍÙA Íf`fmj”X÷ÏAôµŬun,&µĴñx3,v—-XŬ—Ñ×ˋżŸû ¸J€Ö‘7ި—ÓÚ4çbˆÔëbċ2³Ê¸ÄİÇFCÈcĜĞêĠŜyn‚!>n5ˆÜ+g_…40ÜĈ*²ŭ<ÔÍĴ,E”ĠÖ4G?ŻÏEŻSKwŠ“hï…%.aŽëJ§×)"23ÙpXmŬLTC@ 3síaäÖÚ9às·>Ÿ*e[òùİĵžÓX–1cŒĤëĤM´Gċ’ €Zşî‹âPûŻUà›‡9 RmıʛŸµÖ,€%ĊÒbá^0Ȱh˘!0‘S6\ú˙Ĝˆƒ –nĊl„5j,™İ·Â1Vê]ħĊ•’›@ _RTt³€ Ä_´5ۍ™„ϧhT²żżß§ –G˘69ħNƒ~—Ġ*Ë%=Œ\RlCujX&qí×àJ ËàħCħÂ} ¨5ÈB·–ħÊó܁DĝNÈŜŜ^ĵ$U€èœkC‘ xc·³Ópr8çV1÷ì³b6ñŒ IDAT5P”›ÔSZ O´Ċ°œG@c) ÁN´Üz­¸¸OŬ Ê ¤nNVĞáŽJŽÀĜ ÑIûµ[ĊUQġĜPñfLH54²@=dtr (ŝ?—'­tOÏIMLíf0’=.ÎİD˜žE W£‹˘&ìÔ8µµÂ{,£b݊ĠÂD˘NÁk,"²żż/—eŠ˘½q¨cċÚ<Ċ ‡ĴĈbKqİğé,ñE,µXĦ5ˆDcyŠŽ‰†½ĥŞ˘ӐCM^dډ‡’f–)—ÁQì#àiJJ}U‚¤ÏàŜ{Žl0Âsı¸XѓkşƒĴ;^Èè=ĠĦçÄ{ˆêÓ¸p.%³4ħkÓJùRCWXɇ:ß/No‡&+§ĉjZ˘8İn\2&ˆLbŒù™3gâeġt'íı+ÉÔĜ:YD͑ÒËĦ{ ‡8Ü(a;‹?0ÏKK¸Y­´eèĦY¤ÌÛ°v"<ËeL·ĠÔûċıkŒU¸ħ$eÔĠHİq°_lD¸ġ ˜EÍFïÊàÈ,V£ F5²AŜŻ%\{!`“’Xċˆ£áT“ƒz)ÁÎĊZ{İ)DŬ÷"R‰HŝĜcµ—zŬĉŞh£Ħ4êĥM.ċ‹³¨ı|1ÌÀPŸë£V8gEÌC@-99£‘ Kƒĝ`¤b,‚½˙cE‹ˆÂa$z 6”¸ˆ,ĵï ƒe<#‘Ġi|éLXûĈûĦ碛ËÒÒg.ċr‚÷ ġ&Yĵ†+A\_gpŻ›×·Ò U 6çü3ĤĈV¨oUMh˙e"’}ë[ßş´Ĵ[‘/“? ·€‡F^˜ĵ AÏÉġ[Q eÖn`´ä–f; wU?”ȃ0xŽİAXĤbÙ3Ĵf0`Ë÷ u­^ dÜáq4zR eıŒÌ¨9ß3Ĥ+ó¨xŒ ĝ^*Àrg)Á ,ĊŞ£ü³6vŠíÇÎÑZ–QIP罈¸étzi)l'"s8nhÁM€­‘݇a L°ĤİâCÀ|Ìß,>c›0ô –ÜP\îÄvX ³ı*içûìmZÄPó€Kœˆ]àĈ0•7QkX£à0żÇg…QƒĊÒ˘×Ĥ¨V”¤%]L=X*l¨r•RFPĠŠTyƒr´Á`/;2 6İ(ÂjêŜEDĥĥĥÀĈ™V]YÁ‹ˆ³4Ólá2 ? M™Äaħ°,ËÎĴœÌJpa§ş­ĝaĤNs8:J…ˆdĞ—Fš2ßğ­”Ğ|—éÑèñS-ŬÌRÍŞes%€ÓŸÛ-%c…â\K…ŜŒAqw'§k œ2;SŽ>x[Ŝß2bü;ĞlÈ·ŒŠ•w˙"ݽöÚËk !DK̓O˜½‹ċɭɒò²ĉĤqç`*÷aï„Z7ĈdŻá7[_Ö$°ŒG<”‚Û`q1PÉ KN)ŻÌuġTžÊÏÁjâê)Ġ\Tİċ*Ĉ° ÄZ½žİÎSœá‡MbˆY¨şUµâÔ!…sZÀòhĝ;ŝNK!ĠâΟÇf1|>`BÛĥn:ú^xáòR€Ĥibžç­‚€hqx&‚D|âÏßÊġY*™o ċÁq³°w³6ùPèi=bģùó›<8+WD/Ì@*ÍXÀ "Ö,ĝaħĉR2mİèêMG ¤M‡8êc0Ò҃`†‹ž˙ħt[ê^ZŒPTz²äéqMħ\ŻÓ”6sp§c•*¤ŽƒĦ‹!wŝüù~ò úĊcà9˚sT€ ë ŠG.§šAôâ›ËŠV£? y@Š,KFĉPÄ&YBxżŝaĵqĊ%Óùŝ óÍR,NE&X´Ĝjèi-í>+äÇç¢\ÒӍÀsù•jiñYĊ™žŽë”× w2r¸ÎŜ12ı’šxµIħ‡ÖXgҜsW×uvÉnt+"kËĵ0S"Gµj)ž4n+żâĉĦr ‡ÚVf}É<¸ÑĤDKH›$Ó9uJċĜlܔ  Ï‡½ \,}„Ôw³è$ÒÄ9•³p–³Ú’YġÈÂe†R|ĥDòĊg†Ñzo…ßè` ĜR²dÇ-à×Gi|ïħ”ڝƒóŜç‹Ċ"û‹żĝ‹KSR ï}Û“ΛÊߕjÊ!§F &²L¸.3°È›@n,Ż˘<È44M1Ş=×ùvê PœSE,Úĥ]“CP ÑwìÔs@İ)̑e–Jƒŝ33ÑbrŠXnL9 lxUÏ"ñ´]Œ ôzGáf$ŒfĴ4)ĉzVu)Ġ¤ÇÄùƒÇ?‡ä/ktc*8iŠĊFñ{8DĊlk b$ŠL|>uח‹H9Nóßĝßˆ—xï›cÓ4M`KÇ'=Ô{Ì4ÉA†{ŻqsX„ ÷´d3ԚŠdµ[­àLÀ“NĊĞ+ß_ĥŬâu|3S›,EVHġ;[]yL_bóڑS‚Œ¸A†HëûĴ\œ=˙NX ÊïX˜nnN›Òj‘Ĉsħ¨ËĈ°‰d]ÓÎŬ‡Œ:FRÊS–ƒHbú˙Û{÷`ËÊêZ|~ëħßçÙM?èşAAÑĦ$ıĉ'ó3R¨ċ/˘!V†XħÔhE “JY$£%U–I¨1ĵ*K É D%¨DñuÁĤièĉ4}şÏ9ûœ³ß{í½Ö÷ûƒ=w3˜k76ˆ ½ĞşhNï³k}ßüĉsÌ1Dċڗ\-B֤΃–œ Xז1>àpÊS½Ê7¸…šÇQAÜCÛË#£îï£ò‚ paîħdžzǒ&Ĉ …<áĥ^(ħ@>n"ϧ.ƒ€œ^s6ƒŒĈĴ!ˆşì#ÀÀ’Ç{çÔx…Ù’b³ZLŸċÔ'ċt¨ L/ĥ&"­Ÿċu_DOiÍhP 7cŜ샞†¸1'¸ .#ˆĞĝêGäkJlĦ#ài´ÜǁߤùƒÀ‹H”Ĥİ;ĉÀeBŜ)Š'3J3ç•A"CÎAÖĥNì33U7§Zĵùdá,$IžDŞÂ:ËœŒËkĦòϰS!Ë*7'uê½TESp³[í+ÌҘ(s4ş/oHí:h Ċӏ'˙8+´€2ž£°ìž h¨A½$& “p&ùàiÎŬŠ<ÑĵY/Íìĝ‘1HAs öÇôġz½(‚BE.➤%.t›EVSŜÈeŜ{càáşj’0CžŜ/dË_@+´vµXƒJÓÔYj·yƒ+V]‚7Ċ’·èŞySPÌÚĥ o(K{´¸qÌTSH}_–½Ê›T;ݝ7ĥÂò„Q-üBëV­ħäşôyĴ¨ƒ²e˜ia[‘Ë"ÜÈ´­ÑIb¤l*Š“d0ĊFÖ'×ÊL:NÄ$m ġ5µ£Â‚ĵó˜‚yĥvlcá Ì%y˘ĥô:İs ßË99çbü <*jùŝáÏ-İnĉ=s€áì€%ħĝ&Z‘“­ğ,A LiFò FbĴq­aÜyċ’nFN×X´„7z½Ŝ¸eM•ñġT0ف\‡"ç^Ż û0â‘U˘a@`DÜ:0ċċS-oĝ†Êò§Qò[ï!ı0CúŬ˜´3‰8–†À¤ÙkLXƒï‘IĜÜa†cA3=öa ï}0"XÂŒavË;Ħß.qòGŻ×sëUĵgĝş[â”x ââg­¤ cFÁ§:Ĵn"SS;¸!ñùh$ĈÔcŜLĝ=lD.SÇıôdpµXp…[8½çË=Ëˁ1*bĠİ ˙ÚqÀH]4–Çd†Mz5L›Œ-¸kġvùTÁ ‹§wòL:Ĵ@Â:t˘Œ7ñì'OÒ`` ç(ĜUxRûİËZŸòĉŸ$ÂÁÈX~Š<şŒìIvŬħž”³€Ŝċ-èkj`báSK&LË>tmbsv˜ÂòË ĞÓd6óĜ2rò¤ċ¸—7-›Ç[aü…÷›Ç„a˜…a˜>Ù eYÁ9çò"Ÿˆ.:ğLC…Ž7žÉ&ÌÇĊiÎHX²&í,M7qäVÓJ qñ#qûq7––ò,Ґ‘ĉË?˺瑟ĝħS3–\ÌÄÌk…éÏtCé=ì÷ûcY3vNFd9|=˜K ™ “šx×-ĤÚüŬ'ÙÌa&g‰ÌbıbeKúY1ÛÀÖ-—5y—fĦ Äĉ|C>İ MS—eY˜e™S BCbkŽA8îE[Ĥ1Ĉ²„1@X U×1İɒ’ĥ˘vŜÏ80MÊL¸ŻÍ (ñuf*ñÑĤĈ& Yċiß1ĊO\N—ħs‚d$‹÷€R™QĝDÂ13°tPOtŬEŒ³F+íĥDRÙ`ĈrgB Ër âá8+YA`ĝÇmĈÑ{ş'5ĴuD–eÙèżıŜ~xát +µdİf ɳƒÎ³òʛĈšDε̳`ĉùoĥùbÔ9ôH£eħÊIîĥ–dö$÷È9M·2§§RİHĦP×­V‹Ĉҏ4G­/ îlX¤z²²Y‹5 ìÖDŸÀx­°çM}uÎzœK`f&–=yA::‰/oÙÓ[k“³ĵ†ìɞlqg™ÁĉMaİ] Ëx4ï`#yú–sù¤@†ˆ–ĞjŜfFÔ=O0“eŸ­:Ùh–Ċ3§r|şċùqbñİ-Ïu6—Ìh˜Žcı¸áĜ}ÈâĠç•h1"­‘â< Ğ˟GSx$8Ħ+žšĜIA OkÖÁ`0&4YÌCd/bÂr ˆ‘p„Á½xâ JŒwàZĥìĠóşĴMn)7[ 'el“Ô€ĵn…aĜzRÀ9—yïS˂™ĠgĜÀysëDäÌ`R˙ÔÂ,á Ğ ™I^FÁ@Ñ$ŬADß1k`Í|.g”÷Ž~zxÊċmX6•°zÏÈ ì Qi<,˘.<ÔTà{˘ukı\oŬxz Ĵ”V݃ l˘·ŸsNJÒ0´×b_E•+·J96ħî#³ó n°CcQ‹ñw,3^‡V½ÀtŜŜ˜$´Y1ó[D$‘ŝ“Ê˘x pzŒ¤ŽŒyœsü†ÓVlòĴ;+ÙòH+ÂpKŽûëĵÉ0…CÖËyY¤ËM‡>ĜUÈ/ESQĞ'Œg—½YËRĠµhĜÜ­ÀŜ½^s5ĊT;9L“$AÚq›QïmŜw´|]œ–DODÖŭ³H_y-[Œâ2dNĊ‰Ĵ­Î<ÏÌÎÀ{?xR `ÁÈ^h§@…,-T°F:y„ BÈĥÚK8A†Ì)ܓښ·: ê,lĠ‹–`*éûajÊD#TŜħ5y”]{ĝôàĦz°öW Œġòj½ŝœŽ³N? ‚h;“mÌ0;ÒëĞ×I3!,YŠADÜLV‹ÎÊÖ,³ +0ĥÂuŜûàşâÎ w,ĴÓ_ıy ,ŜkA-_‰‘Ô'ÔŒŽÒp#STÖ+”Ó`|°NÌeĵġyĵQ•Ë^ĞĠP­ĝq’d\[vÌĝÚ¸ĜĜπbĞ?­K )X˙ħQĤ ¨Ëş€ÚĞĈùTòĠ`ĊŬĊúŭŝ†@×x£$9Oâ”z˘Eµž’L²ĝìLjOL.3yĈÁJÁÑòż k âĤĊkÍôbv‚bÀËJ"ŜlX“ĴMÊ˘Â-ġgŬÎB‚ è‹Ċî“%e#FĦ~,‚# °È#‹nhM§›…Ĵ6òş-îwž€†ċ¸Êv,"Ħ^k¸à,a ¤H³™b¤›(oŽ‚‡˜Z[i(׃xräM˙1Óu¤f[Şœ.3KBàÄv§³Èoà)Ëĵf&ÙXGœà”£nc@aÚµ?-Ġġ‚<–·œ&Ù¸ñ÷äRƒ`XN÷Të›6mzr]€bħ˜ġz=罏0BbŠŽ2Í֗Ċ6òħGŒ‹ fĵ ˜6jµò<ĵÂÏÁ§ĦžŞ˜•p+‘§y•IŒ äqĜ*[ÇS{½žTĞĠ L•thDDn0ĵŞ*di+âŭaô§L­Ùv –ySŽÖuĥÒ|¤ë,10XñIÊtff˘ÀˆĊZeĠgÄò@l‹U•\‚f˘yóñ“ ۟á°c",ÛÍee*9 ¤×ë=ŽÏ€i!Ž)cĤƒÈ:DKkŜ…e´š{Û<Ĵ„e³àĝ4甗éĥÈAáIFÙò‹Óf-3˜.­×VkÂnâB–„=cRœMrW€UžLµÊm,ĦġàFyĊ9×Pìè˜J€ßĝßpğvíêEQÔ) İĊ*›¤Ìġ0 [0ŸÓ_~ rêÌ Ä²áĉ9ƒ2vYCOÖĝ3÷ÊħtÑE£'ıµHĴû< /ĥá°‡,ö—qòn0ʙŸT|/˜ó|Ş IDAT™³×™K%ܓOÛş–x†EċÍcñéyNˆħsíU­Ë™>ŽëŽ×x­Xs/löÊ0Ž3÷šw°„EûÍíIšĤY–e{²,[̨žPpîıçşZ­Ö/—ËmIÒ4-ŠˆSĦS92YÎğxòáFÒzKžÎé7T*m`2Šž'UÎFÌ^³&ùaĥ˜Ġ à1’—ŜYFĝğŞ# L9NÍQ_~ĴÑ[ĞôÉĞ]­A"FĦ-Ë3Üp`­,ËrHĉÓ4ŻFĥ²ĴŸÑ‡@7?'s>, ‘…OyĴ™ħ0ÎPùŜ"¨je‰ÖĈ×ŝîGŻÛ‘ïĈq|pôıü1e[ĥlç\†áZ† Ëè‘S ¤sò”ĠżäZÉşX|cœ„ÁÂ<ħNÎVŽ2dˆÓèŜ°„u-V_ĥ(Áx/GŻÛqÎŭh÷îŬK£’ÛSP­VZ<’eÙĦÁ`p˘sÎĊqìEÄa:‚u;ħ°%.­xÜ2OyÁ1ޤ–pŸn\·Yhµj<É@ż?ħÎ c$hż-1ĤûbK 3ŭ´­f£ ŭŸ4 Ċ½,òĈ`ù`-ÍcŽbġşyjђëâϔç'ÈÔkœga, ċ½°eiMN˘ĉĥ0Pb·Fƒ‚Á“Ôµ‘`—×z†ûé½÷Áh=dYöK_úÒΙgžéŽ6{ûŻRɏ6Éy@Dú£óŠ‚jdċš‹çÔı]†h7ş ˘R.ğüê—FĞ2Ïps3èƒvßìŞƒAƒĊI9Uçl·#ñÔ×Ĉßç§íNŭ^Ì2äڑË,v0FÑOĵ&,XĞ_7ê Z ™œNgƒ€)>ߚuà:nö‘ìt:Òét6`+ ’ñ@êr PJÒzŝ¨qÈT^Ë&?ğĠÚÄ-Sĉ-"KÒÍÂl, È˘}–eˆ ²,ÛÓëġŠˆ\tÑEÁ—^zl%€~ÁBĦpXD~äœk1ġÔÈĴI>‘9Eĥ. ağ…˜cnéä,Ö …5š‹ÌCn aÊhÉrs}oQk™k€Sx˜†Àùü<_LĞó$§Ĵ6ƒz–š6‹µÈ[zMqĈ@4v âZË &Ó9+sÓ×bp“‡›tƒÛĠÖhş…Qä³X^{yĜ ‘™›r–8ŝ^†+""³³³Ç. E‘Ù½{÷Šsî˙A°4ZÌNߍ Ç?do9FxYûdÌYž¸@4[*³–Á>Ÿ‡lñFû*}ŽnÍÔD7‘…Ts°`MÂIB\0Ĝk-h ˘L1ĥ:.|ĤLœeäI|caú·µ‘ĜIĜÂŻ& äé²²u;“UŸ,‹ZŸĤİa.I’ƒÁ·O?ŭôE‘÷ĵç=ÁÛŜöĥ£fGcê 4ĵ÷w‹ÈËDd§{ìaÒ=-ò$Ïw€ôAJO^܌Š…İ'™‡òd£NzïX,ŽŻ)ĥħ$à?hĵi ŒYLAnÓZ›7:ŭ ˜ŒJšñpŞS!éJ1K†ŻŬѸ Œîç ´Y´xż}ôŜŽîÇ· …/}éK‡´w}¨Z­z‘³Î:ĞWİTöfYö“Á`°Ê=Tkˆ£ZK[>x<%ˆ$ĞŻoŻ,ƒ=)­e*İŜl ´ÁS…ƒžHhöaiúY ĊPd$keĞÖFzĥ˙Ǟ‡Ö–@l`èï`ğŒÛ·Ö0Î$ċ^½–˜ŝsÎ€Ż‚~ZfĉûúŒÈèxĴ foúYù>çaÖf·ÈNVéjµŻƒ ët$Ir8I’ğÎ>ûìûŝêŻŝ*yßûŜ÷”yá _˜•Ëċ•ápx§Óy¤ÙlfÚâĊ§,×Á–£žLzÍîġzÒívÇ­2ĉ³5k ċ6÷[­–Œ5(4É µç0 ĈœGXâ€ĦXŠ.\4éÄé0m#êĈdĉ•:OŞoó܅TĉK˙ 9iHËâµ[óÜîbBŽ[î–Y(Glżi@ P__K+k™'Bó²[ŝ<ÖÔ)ÏĴäûĉ˜îd£ŸœsßrÎŬ{Á ħ5ŝ¤À%—\â/¸à7J!›AÜßï÷÷6nĞĠò âaŭ¤Ao·ûXÊÖîè˘Âϵf,Z/~K¨S˙ -IX6š5ŬĴéBäy[ĈT0ÊÓ%`àŻnÒ<Ġ™<• ëHpŭÇĵ †b ş^ûŭ´ÛíqàÑ5ˆ˘°“Ĵı¤ĈӇVG…%ÑTƒ”îÑµġ£Ÿğ(Šö”Jݟxâ‰ûœsŝ˘‹. ŝĉoŝĈ˙ÌÀĉ͛EDäıÏ}îRı\ŝaE{úŭ~cmmMÖ××3ĥÁż³²,2-j(f HŬäŒà1MË÷Ċ™ôìFî^àà n6Ëp’‘suYêË1ŬĠӛ§%Ñt¤P(l@´y“ċy9Ĥ ˜iŞÉ'²­,"Ï4Gœ9ps?ÜÖÂë xCueKœ'/­Q]Î&a=V;;HCĴi´~Ü(ŠÈµZí+ï|ç;û£ñŭŸzó˙TàòË/÷/ùËŬyç×­VĞ{ …Âw£(ZôŜgívÛĞ\•E,z&CżóĉG!L^ şÀ-2žÈyAL+ĥ(™VŜÛäkRœM·T“-ê)Ÿ~yƒT˜nkŸ[ŭöòüħNgċ[‹äÂ`*N˘¤8wN0˜`M§#·ĠxÄBÈq!ê×ŜċûÎĵbħ(ÓÓÓ255µáçlÊ(Ğ #}Ĵï–×Bg–ċ(gFC†ït:?NÓô֏|ä#{ŜúÖ·""W_}ġÏ6ˆˆœ}öÙ""255µT*•UĞĠh­Óé¸f³9à͐§ˆƒşe7f]$<Âş Ŝ‹Lcğ|“™Ġ†Ž³ĵÀĝäħÒZ^,ŒP[İ!¨Œ³éc% ,Z÷ݵ5+ÁšŒxÒĦ`–Xót&oÖ½àġ­>ĤScYÁ:‰y´] | …VgŒ}XYÇ$pžm—7èġˆ,„ĠëuY\\”ĠĠĠġ^Ż÷ĵ÷ß~Ì$;ĤL`ëÖ­""rñĊ·ĞĠêĤ§§˙3 {şŬn{eeEÙlz\@z£ġTǓÁ-íóâ‰ËCE(˜aE_Ï1UĉòCûÍlŸ•׏ETÖ ZŻqoZßGż=9ó&ċx†ñ l“&I"­VK:Î†gXĞQI0–÷ תĴ+VħüĴZ™A/Ĥg[ñ:XVÁÙ tĤÂÎÒq8Ìê:°gf:x@XÀ(ÎËXÖzá0kµZA£ÑH²,ğ§X,Ŝòħ}l_µZuŸŝô§Ÿž÷ĵÇżë]ïr£–êÜÜÜע(ş)˲û—––:?ùÉOd˙ŝŭÒn·ÇeR6‘Ài({°H£u’YBL{e‰-Ċ™€'’›ôô€À'#çÑA­ÉN‡Ò÷âNjEQ´á:çÍ3 máV·@…5´GŻ„Ĵ[' ‚· òñ´$ŝ?‰Öɞ'ju.PÒ­˜äe ĊXÄ+“³“•Ħ°Á §$IüˆĞp­VûòŽ;~$"òš×ĵ&'ùĝİ_à£ŭ¨yûÛߞŭÁüÁ£µZí–BĦ݃ÁàÀ‘#G҅…·şşê‘qe¸ò  Œ.`ôĝB3KJ7¤n\+Ġ´j0Ę„‚ ŒrkŞ1ŭċv§xXZXZyÚ\úp]>‰ŭÈw;—vP‹€},€žN˘ s@gĊ]Ğżo)çĉs!bQ<Ï´.“\Z›=o³ ]ÇŬn×÷û}Y[[ ³,kU*•onÙ²ċ?ݏâŠúÏžlˆŽġŻĵòJ÷ŠWĵÂŬ}÷Ŭ{˙üÏ˙üĤ$INlµZ³ŭ~ÛÚښŻĠjŽÇ1ċ䛂§P°ÒĴEkµÜ‰5zóžl ^X·›°“ÁĉX XŠ;8‡`ÍÙ³T9oúJò¸”ŬŬà›  ƒ— :âû°0GeÍ1b×>eĊ'kܕ3VnĉïÊe r&tn‚q&FڙšßĊNóèĵ“ìx=ĉIkG…Í`†ĦÔëui6›n´|ߙššú·bħĝ°sÎ_xá…Á?ĝÁìiϰ8çœsÄ9çO=ġԟÌÌÌ|qvvöî0 {#´r\ 0ލ' {´¤İĞ–B^ÛĊRuµ\d­‰-kĴY…;‘› œMħFĥ8™Ĉšĵc’˙֜4+rpŜ‚O K‚KߣÓéH³ÙoTCâ€Ŝ;Vf>hŭŜœ!ċ áhV‚ÁJğSÁ1iì^YĤžVpĥ^7OàÔ~aĵBw½^÷”ĊĊĊl01è<w~¸£ci ,˜ĊÙgŝ†5:ÍeÎ6°v˘¸ŜÇK£ÑF#K’$œššŞ×jµ;á„zùċ—Ż(ÛOKñŸ[ "òÁ~_zéNDä½ï}oknnî?˘(ş9MÓĊtß}²oßĴ^Ż/@Ż×нjÍĴžmÊ׋ÂÔP^è8§oŒVyÀµ-o&îġZĥÛQA-ĞħœaòË[YäÔÀVŽcàĥi^Ï%ژŒ‚Ù[Žħb°ġÀßµ:GÓ@€Ôâ0yÊ"ŬXÀ ƒżˆĞX:–ì¸u1ûуC‰^X1ˆĜSŻ×ó­V+ëvğaEÍjµú_sss7ŝù<÷ıϕ§úñ¤Qďü™ˆÈßĝĈàCúq˙{µZ½µ\.ד$‘ċċeWŻ×ǵ£žÎ˜ĤáĊä…`™G0zŽésĝ-yĞ~ÎLzLBwó]Ĝ'€u­–˜Fm[òé`"oNŜÜÒb‹‘,›4“Ò!.“83ı%Oë?wR­Î% ó:ĴiOKŒ[s\Š0n0 ÈĞí•JÌ^ŠL:ŽĴŻŻK½^÷KKKnuu5tÎġÊċò7*•Êĉççï=ïĵóú/xÁ žò=U/tŬu×e""Û·o˙ÁÊÊÊ Îıù4M}0Ì­ĴĴĝC‡ı͛7Kı\oTŒšjco°– °FL$ëh† vZìöƒ'¤>/o‘â´;c*ÉÂjé…eŽG[\ —ÀÁ.QIĈvŠĊ˘ôz½ÇĠ­<v4ù-$àX6ŻËÂ'5â\Jaې V\şàX5^Wäù[³y†y´Ŭĵö"ĥt:Yˆ†ö!Ĉµĥĥ&‹‹‹ÒëġÜèöKÒí›7of~~ŝëW\qĊšˆÈŻŭÚŻù[nıċ™•àüóÏwW^yekvvö›ċrùŸkµÚŬ…Bauuu5ı˙ŝû³={öÈá‡Óél¨‡Ħ´Ûíqo[G‚yd•g x˙ ˙ßjGrϞ0–”ĥD$ı½™7äÂ'"NEbV`HìħÈĵîLXI¨‰*ş,³R äÂßaĊIm[ЃcíÜÍ£ġ2˜†?T݁5“`e˘VÛ/O\…Kžbm·ÛÒíve8J³Ù”ĠĠUżžµÛmñŜw§ĤĤn=á„>½sçÎ[ĵòÊşˆÈŜ÷×ŭ×ŝ›ˆˆœvÚi""òáxċíoû­išVE$X__?{qqqş^ŻğC‡Ɏ;ÜI'$ÓÓÓÚ-qËÔԔ9…ì(˙ôyH§ÌcġéİaYpá Ä´Ŭr"f—i·`Ş ÚĦkVĦ†§y=bŜ,¨HdíV°á gÏAk,ƒbVêk•\¸ıovÚÄ3Ŝ€˘ytf9àrÛĠêѳ:4Öèy:y8µxXÌŻs’$²ĥĥĉ[­–ϲ,(•J™™™Ûĉçç˙ñœsÎùê›ßüĉ†ˆÈë^÷:÷/}é)ßüOyĝûż˙{˙Ĉ71¸îşë²]ğv->ĝàƒ_‘h콨ÙlÎ×ëġ ÛíúbħèÊċòxÌT7†:+/›9ë¸ÑœS26Ĉ´êI$öiÁE˘•îâÏóXkL e?à€ÂÄ"ĤżZ„"΀x0È:YıkÁC? Öâ4˙Ál3ŝ(>j)I3Żŝ‰L8bPÓġ€g^ڏĞD²äoÑ–âŠÓ´ÛmY]]uŬn×EQÔ¨VĞ·ÍÎÎ^sêݧ~ġÍo~só‚ .Ï:ëĴìÊ+Żü™lŝ§< pÛm·ù“O>ù‘RİtsħXL+•Ê0‚³Ûíö|³ÙŒ–––djjJfff6ĝµ+6€›RŬwU)Ho0j(É'‰Š_X|wĤk²6ŒâÄÁ%kˆĊ'uññ˘Ċa(Ĵa™sµb·Û5Ñh,8͵H¸ Ñϒ§ĈÌÈ˘ óL†^ċ Xž mš§'ıœ°äı,Ĉ!ßc]ì=˜÷ÈÓ,àÙ k:íÚ­×íġz².kkkÒn·ÓéHŻ×Ëĵ÷+a~­T*ŭŻBĦpûŸŝéŸĥë·~+¸ùĉ›Ó›oY~–ègġÂ7ß|³‘Á§>ġİ‡ï¸ŽŻxï³8ŽçÜ9ŬnwóÂÂB”$IP.—X,ÊĤM›d˖-RĞĠĈÈ(Ž{j˙0ÔÇMr4ĊÔ²û²ş-G´)çú[aYÄ:§ŻÁ:Ü츠--9Ĥ9k€` bÑ Ċ;4SÁĊŠ-Dö4Ô÷a¤<Ì*XžKı5Çj9?­d‹'beZyÊG|Ú[êÏĴR…ÏÓġ‡-@-·ÖÖÖäÀ²´´”ġû}ÇqV­VÖjµ+—Ë˙ĵmÛĥğ?üáwEDfffĵ< ègùâçwž{ë[ߚ~úӟŜ˙­o}ëĞkkkCï½Ï²ì×Z­ÖĤn·.œÛĵy³œyĉ™²{÷nñŜK³Ù”(ŠD[Œñç6 ž;N+À"Ü>Äk§×Ÿ=™‚¤6-żP%İŬnËÚښ´Z-iµZ²ĥĥĉ’$‘bħĜˆĝûY–]Çñż.,,tÎù‹/8¸öÚkSyšÑÓùfW_}ġ³Ÿŭì­·ŜzkY†Òëġ^’Ĥéĉ âĠĠĠ IY\\”ééi™žž–ÙÙY™žž3ÏôĤ¨™Ŝ\şAQ¸‚ #0UĈ4ùšĤë˘ÄԙĊ3q!rĞ54h°†@Ŝ NF*‰GSJ‹ ‡TúŜšÖë&a1/Ùa—°<â“7'OöaÉĦß_ ^y ™½<ÑWž4Ċ!,}`ëK&Ĉ0K`—(ĈqKĦP^Ż'ív{ĵŽ:ŽTĞUY[[“‡~X–––$IA–e™ °^,żQĞĠPĞĠn›žž^şêŞĞ2‘kݽ6“Ÿi çž{{ӛŜ”µÛ탗]vÙ×8vĞĞĞŜ{˙’$Iĥ´ÛíX£2×ĥnŬ*§Ÿ~şlŬşuƒ}XERİTç*‹ŭXlkq˙‡It‘éÏy. fÖüAžÀež .ÓpÙјÉCVËOĵ$I¤T*=N)WŸƒ^y–eY^ŭ́R³ ”’„Ë ĉ°n€ĊäÑ`Ğ£À=ó‚O‰2pİMK.ÍBQ-X‡ÏDDşŬîXU¸^ŻËòò²o4†ĦĠû‹Q}½\.˙óÉ'Ÿ|çßŭŬß­‹ˆüŝï˙ûüç?ïċçôxZÀwŜé_ġŞWıjµê?<ş´´ôġ4M3I½÷˙OĦPĜž$I¤İàêêŞôz½q& ÑW#°ÊQ£QĤŒàĝ*ğîXâ–ĦDÌ9ÀÓâÀça# •ĥmžLï‰u+sxüX€…—0IŠ….Ĵ ñÄ—‡a[DJQÍAP 0‚Àñ(§úı•J%)—Ë͏öá¨\#"3zHÓtL2Ò4ßBïµĥӀ£‹Cí£’$‘n·;Ö×ÓÚQme)‹ĊñÏtaéç ‚`ĴäĞ%›ŞŸ}=-‹tĝ;(qżƒŬ˜ŬnwCdÑO}Ž6ĥñ}´,’ ħÍİû€³ĝh^‚ÁK7Ìj*K5ÎȰŠ¸–ŽNÀEúK’¤i*>ú¨<ĝàƒrĝai4räÈi6›Î{ïKR3Ž—Ëċ›ŞĠêġĊbñî;ïĵ³·k×.wŜyçÉ?ü?ü\7˙ӞK_úÒÚkŻ=tÛm·}]DzQµEäNçdï}%Ž ßïËĦC‡\ğŬ–Z­&ċrYĤ§§eóĉÍRİT¤Z­nhsġz=İT*zkWĴ{Q: M/cr Ÿây;–yĤş°°™‡ ˘.f]Œd4é@ ĝb– )Ğ%•†×ǒS“–uÑ:LË l/2C[˘ËÁWÍôòÈ\Ü~̛0µŝ>é:if éaʈŻ/""KKKr˙ŭ÷ËÊʊ8çü¨4ÍÂ0ÌJÒjRı§X,ŝ{İTúÏÓO?}ß{ßûŜ18ñÍo~Sž Ÿk¸à‚ ÜĊ_œ‰Èá?ù“?ısyyy=Š˘ċbħĝ›ívûŒN§3;ZhÙÚÚZl6.ômÛĥÉ)§œ"ğví z„a(Ġju,.|r=YpàˆÁ0kÀEDĈ§'vxC[(9ŝ;.2ËUh’µ´Â)PÉŭiˆŒ9ùĝKĠ–?n$œÊDŒ7œŝûĝùPzÛ yƒ³†!–D–°İĊàë̔b<é•EŞ€v—TĞ˘ßïK£ÑG}TFE‘˘(ŜğRİ”‹Ċ‡ÊċòíµZí–Jr×?ŭÓ?9ċ”SÜŝŭû½<ƒáÏóÍ÷îŬ+oxÜ}÷Ŭ'ßŝö·ğŻ|ċ+—Â0\ôŜŻ{ï3ï}%Š˘Şs.‡NDü wÚÊB&\Ea"ŭwtûĊ4[Ó]Mm/‹zNDĈ#̚‚"ĦHş*k:ašmh jHšâ£U˙ğ2‘L¤8‰šZ”ËċqpBÛkÍ^´ŒPK(ìj(è…XšÎ+M×Jż5kÀA³–š˘#WA³%,y•¨˜Žŝ;’–°¤2bR €€<Ç)Í^´ĴÒdeeE<(ËË˲ĥĥĉ———}½^—,˂bħ”J%W,ĞĠê]SSS7NOOyçΝ˙}ġĠW/‰ˆ\xá…Á]wŬġŒÚü?÷ `Tĝ7½éMnqqQûŬïöĥoßŝrı|È{ż/ ‡z½ŜŻ{ïO‡óQĊˆ ,..ÊÚښÔjµq9°´´$sssR­VÇY£ĥnNÀô˙8§Ċy>vĴÌn½ÈVd…Y´݁ŸË­6Ğ]ˆ@ÓvñÔEüĚ:ÄL‡§(-B ‰`+ Sr>Uó<sÑçĦîċ“È *Sĥ1Á6-kâuÂ, Ŭ‹{½ž<òÈ#²oß>Y[[Ó@é²,s$ê"ò@ı\ŝĈÌÌÌ×6mÚtOšĤK×_}öҗÔíÜıs<#s<Ï~ö³ġżG.ğì²ÛêġúŜo;ç~³\.żĴŬnŸêœ+‹ˆ‡.MS×h4ĈĊ#˘…œvÚiòĵç=OfffÌÍÚíöׄF£1Ö+À1VL/qBN‰&¸ùq#²]5ĜT<Â2ÇTQKDÁħûœb†fİ-nżY-NÄ9„Ċò…J0èàgÀ‡,PV F†žf9LßGARĥ˘b1O xĝ^<£Ö¸ét³ë÷A KäÄÂİ×ë²iÓ&Ùĵy³lÚ´IjµÚ¸ŝDÀg8ŽOUu°Ô\°ĉdñMĊ6 –Àf‘[Cûä|£L€ĝ™$„ÚˆÌç×÷Áv&‹rpšoi9òġb9mîpicY›YÁÓ2‡µĉ48•Jq Y)à½^OÖÖÖdaaAŽ9˘Y‰÷Ŝû$Iï½ÓÖsĦPh…a¸?‚ğËċòm[ĥlùÖ5×\óŭŝgŸ}v°cÇÙĵy³żĉšküñpŒkݽ֋ˆżôÒKŬŝŭûƒGyD>ó™ÏĴ½ímoûf’$>|ĝ‡Nç˙ çġz½]I’Diš:½ù:;ßíveyyYzèĦqûpûöí²mÛ6İĠj›ÂÓN7“l˜5(ȧ‹¤'×Ŭ“ *°P4[|bZ-­Jò8LÉLš˘çـYݘÁ ‰óòqCs§…fyĈeğ1:1KÒ 3)d"oß§ÓéH§Ó‘%YYY‘vğ­ïçâ8v£{Û HĦPx$‚Ÿ”ËċïLMMŬv 7Ü?ê¸sÏ=7(—Ëŝ_ŝċ_²ï}ï{òlzDÏä÷™Ï|Ĉ. Ÿüä'³Ë/żüH†77ûÛíöwÛíö…ívûĊ½^o:˲0MS?"’8% t:Y^^çœ9rD:Žœzêİ233³Ħ&ĊÔW‰%…BA*•ÊoĞ–ÇSVJ‹[ϳùìßǎC¸é4´ĉpÓĦŠ~F &y›œġPˆıĝ÷,y4¤-c€ÒŸck“yHFbıs6iEsWԅDBĞĠ’••i6›J‰N§3Ĉs²,óŜ{EQZ.—GQtoĦP¸­P(|+ ½RiċşëğĵĥÛmË-·¤ò,}DÏĥü·û·^Dú"ò“?ü?\ ‚à‡Îı—Çq|~żß?ğßïWG 9~.ŽcÇħët:RŻ×eß}ÒëġdnnnÌìÓt|~~~|‚ê†ïvğŠ#şpÑi;Ÿ„Znà†B€ §ŬP´)µï€Q{k^žqê½öÚGEä_ßúÖ·~ĦC˙³ÛíŝVŻ×{I†Ïé÷û›“$ ÁÖ´ĥÙln ³†a(SSSc,@[Hz")W@O9Dğu!#G]p#[S|–5ëċ1} òÜvYÓeÁKË=H KʎVĞáryb9çrù„⨘„™ƒ–WĠjUÒ4·kuaqqQ|Ai·ÛR.—ÇßOIZišJı\v£ £żëœ[‚`_E˙],˙sëÖ­w]sÍ5í[o½UÎ9çœhóĉÍ>Ž,Š"7fò ôˆž­ü†nĜ€ˆˆ|êSŸZyӛŜtKÇß, g–Ëċ úŭŝ+;ÎI’Ô²,‹ıÎĊ‘Ïf³)=ôĴĴĴŒ‘{=ñfggċ¤“NÚÀyÇĤ€!‹”²7 ħı&˜â)ˎ:8p§,ËR†Ŝ9sôw•‡ _İT·QY€2qċŝ>b.šMá{° ÑÚÚÚX§T&.IY]]•ĠĠUÙğwŻ:th̎Ä`†ÙD†™ˆtsGâ8ŜS.—żEÑ•Jûo¸á†5ĵGwß}÷P~Ñ/—xċ+_éò•Żĝİ(‘µÁ`­ßû½ßÛ×n·ż†áŻ ƒs“$9{0ìèġzÑèTġaf#Ǎä›\ğŬŜ°s²ĵĵ,½^ON=ġT™•~ż/ÍfSœscLM7™.‹½uӐçŽ!·bÍDÌ2HÄ1ilŬñ/šn#†D$œJÔy=a1`rĈ ¸p2R'0•–‹ĤĴġz]|Á  Tߑ~tâ‡#°0‰˘èÁ8ŽżÁíRéG333 żó;ż³ò†7ĵ!c>Šü‚?~!€nŝ /ĵ­ŻŻğċċe‰8‘EYĵä’Kî[YYùv·Û=k8žEÑ˙è÷ûğÒ4‘†tüp8̔é5ZĝN腅 >²*ôDQ$ĠjUĥmÛ&Û·o£íÊıŻĠj†Ħ4›Í1’ŻV½–ÌD˙Ù3³Ŭì $²Aħ<Ğ*iĞ ˜tö@?ŻŽUcŠÎà*ò(¨ŠŬ 4ŞûˆÜêA¨3ÍfSdiiIDdœ ïdĦP"âÓ4uQŞÒT,[qߗĤé]a~{zzú‡Ïŝó÷|ƒ슈|á _…ÁöíÛRİĝ/ùËż›˙&èc„Èz‘WżúĠA·Ûu”Ï}îsË"rÇğŜġğNk·Ûg·Ûísz½ŜŻdYĥ+I’Í##ÇħcP-ïœsNGöïß˙8QHUái·ÛcZ1Ž£rlx>3& aĞ {Û<ĞÀ>82ŒB ·eÓPĈK7ü¨í5&ĝ(‚Á ;¨p PO{ġ ÒívŬnKĞĠ’$IĈïġ~³Ù”f³9ni"eğT*ù,Ë\–ent%Š˘AÇ+q(—Ëß/•J·W*•ŻŝóŸDŻÏYgnŬşU …‚żéĤ›²ŭèGòËôpòKöxík_Öjµ8I’-ŭ~˙ŭ~˙EívûĊŭ~˙Œ,Ëĥ ƒé,Ë ŜûÀ{ïàƒ˘şItĞèĈüüĵÌÏϏSe•6+ 2;;+333R(Ĉb‘ˆbëIX­V%Ë2ét:2 6líZhPÁú\7bR‘Z­&ŬnW9ìRİTDä1€rı,sss""²şş*Ngü94 cn}}}Ü'×Q,ǣ׊ÔjµħÔwĵ÷‰@mÍÎΊ÷^ÖÖÖÔ#O§í6ˆpە‚pî" ,Š˘^†+Aì- ß,‹wLMMŭ°VĞŝÔ§>•žwŜyRݨwĊ/ġŭ2ù÷ĵç=‡zhĥÑhœ˜Ĥés†á™I’œ™$ÉsƒÁ‰I’ÌxÌgYĉ;t½7Z€NO),BìġċĉĉĉdÛĥmR­V%Ii6›Í§mÈ-[ĥÈÜܜ¤i:nié(/ĥ½òäÁtĤRİÈ`0F£1Ĉ)4}W=Ċ ĈD˜Rİ4ž{ït:ĝşÁ•;ìFžW÷" ‚jòÚëġdiiIĈ(½:}ŭ^Ż'Ng<ô¤ïĊÚ#ìĈ;ç2眂 * n$Äħ7ŽoŠÈ7œsß/ ĥoßzġĠW'rüñË^ûÚ׺~ż/GŽq÷Ŝ{ïHŝ#ùHù{ßûŜ–ĠĠĠNgW’$§$I²;˲çdYvJšĤ[Ò4­*Ĝ5Z˜™n~çœbŽi4Ŭ.‹255%ċryĵ)4E‚@ĉĉĉdëÖ­2???֓×Í 'rR‘İİİħ,™Ž:£ …êèĤ*•J2??/ĊbqL“Ĉñä4MZ­ÊÔԔˆÈ =ñEDZ­–t:1;R;%ƒÁ@VWWeqqQêġş ™šš 2ġz]Ĉ†i<ÍK ŸwÎyñÎ9?úYA’âƒBĦpŻsîċrù;ĠjġÇsss}ìckèŭQv]İTúİ ×żŝġÓ鸵µ5÷ŝ·Ûíq@ĝ‡>ßwß}Óġz}{§ÓynżßŜ`0x^šĤÏévğ'yï79ç*š–ë ."Òï÷=´ ÖâÚOGYpT!֍‹š…8TT­VeÓĤM²iÓ&)‹Òív^Ż‹v-4µßşuĞT*•ñ‰Şev*d×:[–’rı,RI’$—*ëëëRŻ×Ċ9'sssRİTĈä›ċċċ1ÍZ3u>F"”*qKTOvìvŒZwİÉÀ”ì‡a¸†áÁ(Š~PİTŝkÓĤMw|âŸ8¤Żħ{÷îä“OvµZ-›žžö_ĝÂŽoüÀ~üöo˙ĥëvğ².<€ôû}yùË_.óóóa³ÙĴ8çĥuğŬ3Z­Ö‹’$9+MÓçŽ0ƒç\EQ˜ĤİC"ŒÖ­È}Ǐ`#ÓsÑ,m4 ‘ñhĞĥç …‚ÌÌÌÈ]ğĈÊĵÍfSêġştğ]ñŜKµZ•N8AĉççÇÊËŞİ Ĥ&SSS²iÓ&İT*cԔ §6"ü<ċIK†Œ NP;À9çGZ{IİTjÇqĵT(~Á­…BáöÙÙÙ}˙ĝÇ{ÚÛ´i“8çžġ4Ŭàöxç;ßYZXX˜é÷û'&Iòœ4MÏôŜ?ß{Z–e;“$™ èÑ{ĊFi­tn”ú:äÎ#I†½ÏrÖLRŒí¸ħŻ ¤‚™È(DÙ1uÚ\.ÉAJäQ´b ŠU`8ÛgY6NéŬc ‚1-¤šaî+‹÷„axo†DQôh†+µZmġŸĝDûĝÊ<žÒÇë^÷:§/ÍfÓ=ÀŬno8MŝìÏŝĴòŸ0 ĥƒ“ƒÁ)ƒÁàä,ËNN’ä¤4M·‹È|–e”ĈŸWAŽqH"zl„aƒ-•Cz0ž¸ĜRDöۉóè­ŝ҃‘ÄÄĈ§úğŜ{":'1âRè{z@靈8ï½Ó …™Žs. ‚`9Š˘Ca>ÁÁ ö‹È£…BáÑıııGvïŜ}/˙ò/×ù~½ä%/ ĥnŬ*Ċbя¨âÇÇÀS÷xÍk^Fè¸;räˆ{èĦ‡2 ·Ŭv[xŬu×MµZ­Íŭ~G£ÑĜ•$É4MwdYĥÍ{ż%‚ı,ËĤûŭ~m8VÓ4Ġ.ÂXtl†9Â<ĤÊĜ§GÇŜè_Ç*Àĵ5ˆÏħÚqa:d,Ş,ŠŽès•0 HŬ(ŠÖÒ4]múċ0 GQ´EÑBı\>PİT\vÙe /xÁ 6PqĞĠjâż8˜™™qÊÏżŝúë³ĞôxxZ\pÓ–Ġž={$ CÙşuĞìĜħŭÊŻüJ8z½^ët:›³,;IDNé÷û§ôz½S†áçÜ "2“ĤiĠ{§D–4Mƒ,ËByLµÙĦŬžÌ8RÌÁëkvóѓËv!Â÷Sƒêâ Ïh²2 ŭ8އċr9qÎu²,k…aĜ,—Ë çÜĦ^ŻwŸsîŝJò@­V[ĜµkWó}ï{߆ıú;wşÓN;-áT*ù8ŽU'âĝxxv<ŜŭîwVWW ívğĜívkišÎAp‚ˆœ”eÙÉŜûMŜûİ4MĞišV²,+ ‡Ú`0˜‘ı(ŠÊa³,‹úŭÁ!t¸áô?Ë2?ê>xBàŬèĜw£2DÓusÎyï½C,b”û 2IsCç\*‰e …BGDZŜûĠBĦp0Š˘ƒ"òˆ÷ŝ€sn!‚zħXìAët:ŬJÒ˙Üç>78BŽ€_Ü MSYXXĝŜğwĵSív{:MÓÚp8, ‡˘÷˜ĤiÔï÷Ëáp:˲Ù8Žçƒ Ĝ콟‡óišnòŜ³, ½÷… JADY–Y–EŜûÈ9WpÎEŜûPD"ç\¨´Ĉ‘ç‚8ç‚ÑFï{ï8çé+Ž@şa½$IA4â8^‘eç\SDÚ"Ò‘^ŬJÒñŜ·’$iÎÍÍ­—JFżßoÌÎÎ6şêŞ\"NµZugu–SG§QûGQ¤òpÇÇÀ³ëqÉ%—¸IG‰A.IWŻ×ŭ?ìWVVžPŬê½ßġwĠVVVfÒ4ñŜχı4MK£2Ħ "ċ4M}9‘Ĝ{_tÎE$‚ vÎĊ"êİ`d]ŬġŜ÷E¤'"=ïŭp”ĉûBĦ0°“$I9׈˘h% úÌÌLğVĞġfggû—_~y2555Qkjj*8ëĴ³‚™™E‘ôz=Ĥġŝşë;я€_ŽÇë_˙zƒ>Ž-Εá·.KKKĠjÓĉ¸á†‚ğï;Z[[ :Náħ,> sa0BéÒ4M0ˆHÁ0ŽÁÔÔTöŠWĵ";˙üóúĠjĠUĞU·eË9ᄜ–"#‡&Żíbħ(lj8ÏĵÇ˙…ß>"|IENDB`‚desmume-0.9.11/src/cocoa/images/Image_GuitarGrip.png0000755000000000000000000046136312467662066021003 0ustar rootroot‰PNG  IHDRS™Ş pHYs  šœ IDATxÚì}yx\ġyġıëÜ{gí²$o²„wƒħħ ‰„%û—„JR–l¤†4¤%Ħi›6͓44I“ïk[€&Ĝ`l‚ "clٖYĥĴ}×ÌhĥğßïÑûJ˜ĥO›ĥI¸çyô ¤™;#ñ;sŜ÷ĵçċ @€żG8tè_*•ä|>ݏ+‚×uÀVUUÇ֊+Üà•úŭĵĝ]ÄsÏ='tvv*CCCĦRİĉ˘Ïó„H$ĞnM$çɲ÷|XÙżżröìÙÊl6{áÔÔÔâD"Ñ$Â2AêŽÈžç)ÇÉ<Ïó<ˆ˘ŽÀó<\×E.—ƒaPU˗/LJ?üa̙3½½½mÛEUUğ,ËzĠuŬMÓ^Ğ­­=&Bú²Ë.s‚ßF@Jx‹â駟^yċċèÑ£ÑÎÎÎúL&seYóBĦMÓV<ß`šĤ @ñ˙ùÏÚkŻĊĥmÛ0<:‚d2‰RİT …BsçÎ}¸X,n¨¨ˆ) ü>cÛĥm³Ï>Ğ9rD¨ÌçóĞeYnu]·À AAP=Ïc="Ó4ÁóŻ •éèƒ8FP˘(²FVžçÁq\ׅmÛp]ÇAȲŒİİ)èşAÏç1gÎ|úӟĈÇ>ö1<˙â 8rädYF</zž×1oŜĵ‡KÒfEQ¸âŠ€˜~ /A€ŝ#Ĝ²e‹J4Çqâ=öXÑ£G7e³ÙkÇıJ„÷[–ġAVH’4@Üqœçy‚ëşp]—H ) ɲŒP(EQ Ë2$I‚(Š€Ĝĥ͌ĦPŞŞB–e<|>İİ)H’„X,†P(„žžœ:u ²,½ï{dYFħXÄÈȈ$IRR×ġښškjjjàOŝäOò>ĝ``”R€~ÑÙÙÉÏ~6“É P(@’$˜Ĥ‰l6 -Ĉg?ûYÜvÛm8uêöïߏŜŜ^TVV%IêX¸pá===OêşŜë­· )àGċ8 ½üòËê‰'Ô3gÎԗJó%IZ …šDQ\ĉy^8Ş$IŠëş2ÈG†Ó4™Ò1MĤiBUU$ „C €r N×uèşĴ\gĈŒÒžż˙ÄóŸ‡Ĥi¸ŭöÛqÇwàáĜ½{7 €az*•êliiyĵ³³óQY–{ŝĝ˙8 Ĥ€”߁'Npğwï^zé%íäɓ݁–BĦ°\„QjšÖjYVj:ÚG ʲ̒h@Ġ0 F*ĥmC’¤N8żˆ8– 󠧝˙ë4ëwàÑĵR(‚$I"H’Äŝ ”ûLDˆşC’$H’„ÑÑQd³YĤ˘DQ„Ç’$ajj pÛm·á+_ù Ξ=‹çŸı\ĥmëñxĵïĵóÎû×L&ó°çy§ŜûŜ÷ZÁ_O@Jĝ-ю;„½{÷Ş}=½áÑÑÑú\.w€ċ<Ï/–ey$IqÇq4²8"ıŬ¨ôE=#" F ‡0Že1uîġ#†›6<e:ĦÁµ_W8öx¤‚LӜñX³]y¤šüÙx‘Hı\§NBİTB(*¤×sóǁë¸ċ–[p÷Ŭw£··/ĵ T*ٓ““cétú™C‡ŭxɒ%í?üáġàŻ) ü'q˙ŭ÷ ;wîT:Íf³ġ’$ïXö"×uçq·T„ZŽ4žçŽxÇq Šâ B!ċy,˂$I‡4•ĊJ …BYLöt“iÊo˜&ÏóÀMœ,NÛ½8Ïçáş.âñ8bħ,Ëb³GD:’$ħÇ4 •••HR…Bp]²,3Ršœœİ=NàQ,á8˘Ñ(²Ù,AÀÍ7ߌŻ|ċ+8x îż˙~´··#NۆaŒÄñÇĈĈŝyŭúġŻŝò—ż,Y)à?ˆ{ï½W8~ü¸râÄ 5“ÉTş{!ÇqK<Ï[àşîbÏqkeYÖ8ŽS<ÏIĊù†P(Ĕ„ßÒÍó|Ŭu׈€”xëa×]Bgg§òâ‹/ާOŸNôôô,ugI$i$iħ8óljN/Sxž—ŭiǕ{;Îëá§Tş³,‹)!ÇqP(à8RİjjjÈf³( PÑhápÑhˆD"2!ËċP*íYĜĥ BĦ<ÏCH’!zşÏâôéÓÌDQ,1ŝ|Ĵ\ı²,#ŸÏ³p˙%I’àş.&&&ÓӃĦĦ!$ öœ(AĵşşĠĠĠˆĊb˜ÊçÇqòäId³Y466"‹ÁĥmLNN"—ËappĝÀpçw"ŸÏcá…Ĵl À,~ç;ßyŝµ×^ûğn¸aï'?ùÉÀ2”ïĝÇŜ½{…óÏ?_KRñûïżżñݧžÚÔÙÙyU6›½2 ½OÓ´Ë9ŽğÀĥí<ÏW¨ŞRUUe™ıÒȤàyšĈ”%*(Š‚p8 AP*•Àq‰ŞĞĞét™L†a ˘˘uuu¨­­EEE‰TUPÎŻÄòŒ‘”SzüKù$I‚;=/T*•`[e_>—G&“FŒUUUhlldĥoMÓĜĴ“˘(ŒPé9:Žˆ‹2öbħ*++QQQI’P,QW_h4Št: ¨­­eêìç’$aïŜ½èêêÂĤM›PUUĊŒ–eq‰DBì²Ë{{{›·oßŜŭo|cà‰'žzLR àÛĥmŽ=Şìßż_íêêŞœ˜˜X],[EQl íĴB2ÇqŸg‘A˜˜˜€,Ëh>ŻÉ$#-EĦżż§Nv²$ˆH$‚ .¸ ,@:FħXD$a¤Ħë:SsŠ˘€çyLLL`ppCCCÈċr¨İİÁ’%K irıE)“‹\6YLNNÂ4Mˆ˘È^‹RİČÔcşè˘‹—ù—¸à‚ XJ„ë”`Ħ?ġÔSû>ü•ġë×·½óï òòR à÷ğwï~ŭë_+êñÇ+³Ùìê|>ß*BƒŞŞ´Oġ>ŽŽŽH‚€h4ŠH$‚İ|ĵ/ĴĦııuuuĦPÇĦT*•b§‡[)ü4—ËÁóϔà`oFFFÍf€ċêQö^Ñ4Éd‡ÁqÒé4–/_ŽÏ|ĉ3¸òÊ+ÙïŒ\ŠôBĦÒÔÔÔ_d2™ŭK–, ˆé·1x ĝŸĊž={„]ğv)ûöíSo½ġÖÊt:½Ú4ÍVEQĴH$ ‚ ¨(Ż —İ7De9ŠÍĦµ d:pmù|R‰%PψÊq™L†)…p8ÌR´EQ„=f:99‰Üt˙(•JAär9ĥ –˘†H…Ñïş.4Mc×VYY‰††xžÇÔġŻ\×eANżM›6ĦşşŠ˘0˘!Bò<áp˜ċìù³÷ÈÂ^SSQ‡Y‘ċàà Ž= ]×axžgĥuzN6ÊF‰P(„šš‚€C‡áŸ˙ùŸ‘ÏçñĦ}ˆ}}Z1)ápx£aµ`Á‚o8޳W3ĝ H)@€ßyĵ –-[”‘‘ġöÛoŻìëë[­ëzk$i4m…,ˌˆÈ¤(½  Á?àJŭšE-̔Êĥm#‘H †a N³ŻQù*—ËÁqFbşCE̙3•ĠUĴÇY‡ d%'£‚żç€9ó …bħSQSSSèîîFOOĉΝ‹5kÖ ‰0eĠÔÔ„ŞŞŞ=)ZNĈ *R9ħÉdÑht†ÍŬ², c||UUU¨İİaÉ”•ç8ÒırüPĦP@ĦP@UU,Ëbk.<χ>ôĦòï´Ħĥm%™L^ÌqÜ7<Ïû{×uŸçy>² H)@€ß=ĵúêĞüÖ­[•—_~YğíĥÛ*óùüêBĦÊó|ƒŞŞ+TUmà8Nu]Wħm[&˳Û*¸şÏ胐’Àúpˎ;ZzGq=–eĦT*ĦŞŞ gϞe$F3G²,£T*ħm­‚ `ŜĵyX¸p!M-ğċÊċŞ_‰ˆ¨”Gƒ´äӞİ}út­išç[–µĜĥí&I’VşÛ ŞŞ*I’R*•d2(ĦO{ˆŠĊ"Ë}óĥR ÊHôŭ뢐+—îLÓdF*M͝;çŸ>Ξ=‹ŽŽFlĠĠĠpŬrz6rż¤ĥĥK–-++Ïeċ¸BĦÀT‘eYĴŸCĤêÍD"VĈó'‚;ŽƒRİ„‰‰ äóyTTT ııŞŞbrr’íJŠĊb¨f„JÄáO#§’%9 I5ÑçôJ̑‘¨!…İŻt:ÍH•ĴĉÑxŒ ŽŽbdd„™/$IB6›…ŞŞ¸ùĉ›qÓM7!‰0rž&BÀ ?ġ<ï_ ñ<8óR à7Ŭt“ôôÓO×Ûĥ½QUĠġÇ­ …Tžç5Ûĥe:4é=ġhHñPŝ\4EUUbħAÀ0êêê˜Í™T‹mÛċû¤Ói¤Óid³Yäóyd³Y‹EȲŒùóçCÓ4twwC×uĠCŞÂÔuÄb1,Z´Móĉ•żĈsì'%ç8rıĤĤĤ`Û6+/RhŞĤWC`rržçĦĤĤħX ş³5ÔĞĦÙĤİİ)¸ËžĞ?ŝˆ…š”%2‘RħX„Ĥi, ‰8d³Ùò0Ż,CUĠqFFkYFFFŬŬt: žç‘H$Éd Ë2n½ġVÜxLuÁ° ĝ€<Ï;Îó|0dR€˙ó¸âŠ+¤#GŽ,²mû}‰Dâ½Ç5[–s]W”$‰§°Py‰ŜÙĥx<Žh4ŠX,†X,†T*MÓP*•099‰‘‘̝;µµµŒÈh„ àÁħät:VĥĞfvqÏ77$I8ÏüùóÑÜ܌x2Y&UaYw˜2)‹(‹p]Š˘°è*ċ‘s.‹1•ŭÈd@¤B¤`Û6+ŞŞÊ‡ĴíSSS…BlnIÓ4Fêë²´ z|R‘ŝuëAD}*ZğAŻ#Í$&''ÑŬŬÁÁAÖ£×öÚkŻĊwŜ‰ÚÚZ?)€ `ÀŻüÄuŬ6A Á˙!)?†ÛnğMĜĵys£,Ë×G"‘ĜĥŬì8ŽF%$U-÷fÈñE&ÊYШ¨@uu5‰›ËĦÀQ²BWTT@Ó4`şÌFÉ ì°ǔ€ëPUİT ù|Żú*úûû™ \$aäÒԀE‹•íßӏ-H"# [!S˙’="´%"PUÚô$IĴĴHċJşÊħ£r%ŒÓó#âVUŞŞBQÄb1hšĈbˆ ˜Ħêhn‹Ê‹ı\Ž-ôż¤‰œéwU*•`Û6²Ù,úûû100€ħħ1$§ {||W]uúĠŻbŜĵy³‰ òöğûSÏóĥ ‚ĉ8.è3ŭ;ŒüñĜcñwÜqG]eeċûxž˙€a͆ah´ç‡cİÎ4M6ZYY‰––hšĈ} F%@ w˙ŝ "*eɢĢy>Œşş:455Ħ²²èëƒ$ŠĤj(„\6 Y–ÑÔԄ ×]TvĠI"DY‚’YéŒvz,rŻQ_‰ıíÈ2NÄIj‹zbÔ/£r™ĤiŒ€iĝ—Ô$mµ “eíÑà.xŽ MQa”t¸ĥˆŬq8ĥƒ$C%ä§rˆhaF‚Ĥn@/>dìNï‰"EŻw*Grq 5UĠ8qâÊF•UxîÙ_#3™Ĉ=÷܃ĊK—0 ú4ÑE,ËşX„*Çqj9Ž{ĜóĵĦ€˜R àż[ĥl +Šrİ뙜œ\<>>˜aRešĤ1³€,Ë̽U]]ŞŞ*‹ĊËí¨ §( ’É$K&ĊE}rÙÑQ'Ë2.¸àÔÔÔ T*A×uTUU1{4İĤšš°nŬ:ÄRIfġf;Ĥ‰HÀ4M‹EĜĥP(„H$‚RİÄzFD¨äœ0#üĠŻ$èúİ„Gω^+šA"“‘údŠ—ŬE?óOQFy –ĉ³¨¤I‰âôĜ–eAžUş£çM›nÑ(ShZ+<ˆ;ïĵ_ë+Xż~=Kž˜&SY×ġóEùSÓ4Ğ]×ŭ‘išŬ²,ˆ€”ĝícçΝÂwÜQ'Â%gΜiq]WĦŻQßFÓ4D£Ñû‰üĞÀÉJMF*‡‘"Ħı#2rğÙëĈħòQcc#2%ĊrìĜ1ĜĥX,Ĉ‚LCĦ.şè"Ĵ]ğ•••m‹‘’kĦP` ‚Tġµòù%Dt0ÓġÙĝ‰ˆHÎO¸D<^ŸI"bǙ3gÛۋĦĦ!f^e‘H‰D‚ġ˜‰ğÖÙ.;˙*]×Ħë:ŠĊ"³Óïkbb†a@UUö|ˆ-§ĴàTUĊg?ûY|îsŸÇqÌĉNÏ€nYÖkĥm˙(ŠÏȲSP àż†t:Íŭ?üCĜ²ĴuRé˘X,‹Ç<•żHYPiuu5svĠÖÖ²†żÈ³ŻŻ‚  ĥĥ–)2?@]]ëƒáN @xŽËĉiLÓÄéÓ§ÑÖֆW_}µ<¨Ú²ëÖ­Cssóë„áRH†(ż~ÀúUŒż”E˙$ŝœß‚MFύ”•$ŭvp:¨ŭóFT¤” Zyn›TUEİTÂİS§Öֆŝŝ~ĥrŭ˘‹.BMM ŞŞŞ@o èş(H–Œ³GŽ@”ËQF˘,! fZġÑŭŒ—Ë€===eñLd‡7í²RššÂ׿ŝuŒá‹_ü"bħĜì?E„ ĝÚô‚Á_…á`–)PJüç°yófaß}ámÛĥµŽßÂóüûĞĞĞSSSS<) &ŝ-Š""‘bħ{÷FgôOüŞ?“ IDATÑ8dd cÄá‡Áóò‘àÏŝìÏPWW7cUĈ´ċŬ´mğC„ğCĦsÉd2 Ĥ€”ĝ÷qâÄ ğğ[ĝÍo~£ìŬğWéêêŞÌċrkñĝFŽŜĤ(Êĵ\.'K’„H$ÂT z†B!ö9EքaTVV²ŸV“Z Ïóù<ە488ˆ­[·"Ŭï~7êëëف›Éd040ˆRİ„öövèşŽe˖á’K.aq8ĥë0ĊCäá-%ċB*…ĴŜŝUéT£Ù(Ĥ™2kà_ÀG½œÙŭ&RJt`SŽTÙÔÔNž<‰Ïl‡ë¨ŻŻÇêĠĞÙ"@˙ ”f‰ĴŝëĤמúnù|…Bĥm3 <)SR}TJ4u0::Ê\ww7şğğË;¤l‹‘=•U …6n܈żù›żAkk++ RŽĦ fĦPĜ›Éd‹Ċö´´´ĵċ‰) Ŝ>ĝ ÖÖĤ?~F˙˘(ïL͖J%dĤw)e2Dc1̙3ĤeÎHB÷Żî ² =M-§PŒŒŒ°X"1úŭ†}ûö!K_ú#RİI–yÉP(´èìÙ³^{{{÷׿ŝġܓO>ù–Š% ,áŜ²8x ˙µŻ}-ŝòË/ݐ$靊˘\&ŠâBAbĥmËXÈߨ'‹2Ĥd AYZ ( Âá0Âá0;ôéP&R£C[EĥlÎO"ŝ˙Òaîò—àü‰Ù³ñ‘²ñ—Óf“‘‡_QĞ\çWFôxí/çù#|ÌXÈç˙>Vĉ‡îînlÙ²CCCĝä'?‰uëÖarrÇħù-êĠ麎D"|>×^{ Ûġ sż‘˘²²’]ƒmÛÌ966†ÎÎNœ:u ĥm—M'‡t:cǎA$ĥĦVD£Qöš!Rî#| ˜?>N:…t:P(0 ë:Ëö£ŸğïûN§q×]w!bóĉÍ0MšĤ‰Ž4ʲ|İS§ìŸŭìg=Àŭ˙ĝÇß2Š) oIüĝÇ?nıċ–Şñññ·…á÷‰˘¸žçù:×uJ û²?û- 1Ğħ?çràˆˆè6˙}ÙÁŻ"ü$D19ç"Ú(ë"˘Û¨<ĉû!ĝ׉ûï×_˘óĞ4ż²ò—ï¨ôÄqlÙ²'OždK éàŻ¨¨@Q/ħÒ'`OOž{î9ìÛ·Í bÓĤMX³f ,ËÂÁƒħ˙~ŒħÄÛĥQUU…ġë×cûşğğñÒK/Ħğğñh‘Hù|ÀÂEÍ,‘żïç7{hJy 6²Ż‘Ċ~ftt´é¤ëĝ§ú' áž{îAKK ŭ@:FUUżvíÚı 7 ŜısçÏżŭío|ñ‹_|KS@JŜR8rä÷À„÷½ïÍğ2  -ÏċrİX,&ÒÁC¤ĤĦ&³]>´š‹’żFŞŠ+‚ż—C%˘Ù}?)‘óÍ_ĉóÍ8ùç‹üî8żùá\½úŝÙ*ĈŻlüKÏEZ³IÏŻÊ¨Ĉ”Ñ,òËd28vì$IÂÜısĦŞ*ŠĊ"TUE6›EH-—éhȲ,ĵôÒKĜğw//^Œ˙ĝ¨¨¨€8xöÙgħcÇĤX(\Qœ:u ¸òÊ+ħfÍ„B!ĵ 8}êûŭ§Dd4÷DfRĈŝÁä(¤çNİꤠĤĤĤi" ĦĤĤ;vì@WWîğï>Ü{ï½xá…à8ŞŞŞDÓ4ÄñK’äLMMmùîwżÛżiÓ&cĊŠċĵ€”ĵe ·Ŭv[òèÑ£ËTU½,^ċyŜ"˲"UUU<5À‰THéAÑ×f“Í"QżÈݲHÑì—O‡<–³ĉïùMtÀÓ÷ħ!(kĝÓ5K’„|>|>Ç)Żt ûò e¸ù£‚üŞĈŻ„ü%:şÍĥí$ä' ˙@­Ÿ éġE=ŬgÙ Şçy¨­­er=ÏxŽÍNɲLvjär9lܸ<9ÚŞĞĞħ|ùrȲŒĦĦ!ôôô@QèşŽ|>ÏԂ Àó<&ĈĈĜ~+İ”Ô-Ùó‰˜‰ÄŒíż’P.ÁR˙ÏOÎTĤ­¸´7˘··×^{-~ï7ĠŻ~[·nĊ‘#GÀóĵX,›cħĜëVŽŽ>ğcǎû÷ïŸ\³fR€ż'8pàŸÉdB===Êàà ?66†ÑÑQŝîğï²m{£˘(WJ’´R’¤:Q"˙žzÇL$DYj~’˘ĉ7ġ4MyS#Àìšç…}YYCœŜeûI‰rAàà8îŒDljŝG´0BĦ\×Ċ‰'0<<ŒŬğw#NškÁÛŜ‘))Û&bñ_— ž/ß6K òkŸ­X,²hĦÉÉId2$“I Ĥ"=DžnèPC †‘Mg‹Dħç•Ŭ˜ÛĜ„yóĉ!‹áŠ+@4E"‘@İTÂ]ğĜĞ˘(˜˜˜`Š×u]$“IÔÖÖ˘½½šĤĦ²²UUUÌ$A‰~UêÏŭ£Ġ!´Äżİ— DÂMÄÊ~š†L&ƒżĝê×}\ŭġHÄâxŝùçĦŞŞœŸÊ5ó<Ĵ„Z xúıçžÛk×ĦM›69);H@}}}Ħŝŝ~ċĉüİS§ĝ~ô£Éħħħe™LĤ•8-ó˘( ‰D˘ZĊó%IZ išĤ(ŠHäCVkR>¤ŠèƒHÉ? K½úYAx½\w.wÚlċpÛIMÑaIïÌeYžÑ3À›B_ġ˘ĥĥ6´µµáµ×^C__xžÇu×]‡M›6Á´ ĤÎ(µÜ݈üŸûŻ‹Ï˙3³³ûS~SĊëß͈0ĠÙŬŬŭû÷šk™Ñ£×†YÉLÑсÇ—_~9Z[[Q__bħˆ3gÎàȑ#ĜµkÛë:°xñbˆ˘ˆ|>ŽP*•‹ĊN§Ñşx1ŞĞĞY·뺈D"3’iĜĜ0ŒriÒ-ß>55žç™ĞJ³Š˘ X,Â4Mf¸ óE}}=ĈÇÇñ½ï}étwÜqâñ8žzê)(Š"Ûĥ=§X,Ĉ9ŽĞ ŝĉ7żyrÛĥm×\sR€˙‹xâ‰'„ŽŽe`` Ô××'|âŸH.›˜˜hEQ³m[â8BÓ´%•••seYùoYEEQ™?:,ü†H$ˆ‰‡Èhvż‰úEe ;·/ú 8ùżßO<ŝ™#š}ĦµèŽ ğğğvíŭŻáäɓ(•JH§ÓˆÇĝô§?›nşİ|xZ:+Óù1;ċaö5Ï&7#% Ğż7E÷išöŒ9'˙}s‡yóĉħRĤišxñĊħlÙ2,Z´“““Œ”ieĒ%KĜĜˆ£G"c˙ŝŭH§Ó˜3gEA>ŸÇĝĝ8&&&022UU‘N§ÑÔÔ„Ğş óĉ̓a‡˜œœÄää$#Œ•+W˘ĥĥùb)>)<˙@-/”‰-›Í²ŞŞH&“,]ܟŭG‘D´â=‹axx?ùÉOßߏğîş 7Ŭt~ñ‹_`dd„Ż¨ŞŒd³Ù², ĦPˆßğwïĉ|pà†nĝƒ"Ĥ`x6Àï4žzê)áÀJoooèĉBwwwĊÈÈÈjÏóš¨*8Ž[ÂqÜ\ŽBÓÊF ‡ŠĤi2ÇqĴWÇgô†Hċ)ÑÌP$™á°ó[Àŭs=ŝOùcfŠ•u¨üöfE áT*ÇùÊ&Ñh˘("“É ½½Żĵò öïߏööväĤĤP[SËz2ŸúÔ§ÙÏ~’$attRH|ƒB›í€›M”³oŸŭ3Dd¤ÎEJŻŻ…pÎİé{D^Àí·ßΆOÇÇÇqÉ%—à˙8–-[†ÉÉI6K›i·nŬŠ_üâÈċr‡ì5¤ÁX2Pısá…¸úêĞħrċJvR <Ú„aXğv-Ŝ˙Á"™L‚Ëı~Ôoó÷ŭ&Çq×CWW{ì1ÖË[ż~=VĴX-[ĥ°…ˆ¤öhƒ.ġÈTUE$A:F&“Áüùóq÷Ŭwâ‹/Ĉ÷÷=tvBcc# …BÑ0ŒŽŞŞŞ‡]×Ŭ‡/|á xá‡pàÀˆ˘¨É²ĵ4—Ë]Ż( zzz6˙û߸íĥۜ€”ĝ-àħÇöîŬĞìŬğWŭà?˜\eÛö"QŽŞ=Ï[ çy€ @ñƒêêj|ûÛßĈ‘#GPQQwĵhiiae%×uË!žŭĤ*í\Êg6ıĝ‡}ߌÜÎĠ§zŭ…7Ì<ùmċ˘(2@ÁĞápÑh£££Ĝĵy3ÚÛÛħxñb\tÑEXħb€r"xEE¸â Fäd¤%RŸR SSS8x ž{î9?~’$aá…¸áúëÑÒ҂BĦ€žžž2yŽsì EÑߋß)ĈÇÇÑßßÏz^K—.EUUJ–-[†ƒbxxŞŞ˘ĥm£³³£££H$ìo-—ËÍpûI’„ûîğĵ(àĤ›nÇqxöÙgQ__Ż‹ĊŬŬŬ7TWW+½½½[ŝóŸŸYµj•ħxñb/ ŝ<ôC³Ï>ĞìÙ³Gŭ‡>Té8ÎjI’Z]×m$i…eY Džxž×\×Çá颃˜ÊmdßĤFħ_ÍVKáp˜YécĥsğÍŻŠèħŭ‘>ŝD…™+îœŻŝA×sġ•ü·Ñó:sĉ žxâ ìĜħ}}}0 ùĵŽd2‰UĞVá’K.ÁĈħrċJ<˙üóèèè@*•‚mÛXĥlŞŞŞÍf‘L&Y3félb™ÔföĤ‡É9ÖUĝ‰Œî~ökB=(˲ÀMGŭTUUħ-ÔEèïïG[[‰êëëħxñbTTT ĤĤì÷JU*•099‰ÎÎN?~ǏÇÈÈŠĊ"ŞŞŞ°zġj,^ĵGĊΝ;1<<Œİ|ĵ42ĦŞ*êëëñŽwĵĠĠĠĴ¤çw#J’„> AQ¤R),Z´İT HRhmmĊÔÔۖğ~ŭzĴ^½8zô(ĈÇǙj/•JĴ4X,Çñŭïı\ú§ Y–ħ}ûv¤R)ÍqœĊbQŞŻŻíÜısëŽ;N>óÌ3ÙĞşÊ H)@€YĜħc‡ôÓO+Ï>ûĴz 7TX  @€Ĥi6P-ËRÈŝÔlcĞ˘(ˆF£Ìŭ6Û1çWF~£‚żgDdDïvg„Ò£?_ÎŻ„¨w0›`üû†x^œ˙ï+•'ü%–Ìàϰ˘e£ŻO>ù$6oŜŒžŜŝòL‘ˆ˘Œ5×âêw]‰ċK—A,œßŒ°Ĵ`¤oœnAŒŞl­şëş,2‘lċâfgÈÙv>Óëċ;ïM{Q³o³3îʤg3kğë:‘Ċô„aä3Yô÷žE,˘Ás,èF jH‚İYùOà8p<RĦ€\6‹îÓ§ħç•WĜNètTŭt]G&“A6›Ċèĝ8+£F£QĴ\ı˖-ƒ,Ë8~ü8EÁÊóÏÇۓI(Š‚–·ûċWp赃¸úêĞqġĠWCàxVÌçó° ǎ…2M"K—.ESS\xpá!¤*XµjN:…l6‹ááaìÚµ ï|ç;ñŜ÷^x!ÚÛÛ1::ŠÁÁA–AdLċÌ|/} “““8|ĝ0ÇQLÓléïï˙ĵyóĉuuum½˙ŝû}äȑÉċ˗{)xËcïŜ½ÂŽ;”­[·ŞïyÏ{*MÓ\  •¸êĦlZPĤ{D3ŜmÏ\w”’Mċ8Ì…tú³çè>üÖn*ÏQ‰ÎŸ¸àoÒû˙í·lÏV7~•Có,tŝ…xä¤ı 'F£0 gϞĊ“ż|O=ġ ĠuRHĈĊoÄÛßŝv,=Uyo“ŞĦqN=êêĞŻZYSĦħaD"<ñÄhmmĊâeˆÇMƒE yžÇˆeYo°ŻŸÛ1Ói7ûżo֋ò—ë,ËbÍŭÉÉI‚Pvıñ<î˙Ċ˙ÈÈ “„I’‹ĊàşċR]ħXdżz`z{{ßFK ¤ ëêêÒ҂7"—Ë! !•Já]ïzAÀÈÈz{{qâÄ " áâ‹/ĈüùóħsçN<˙üóhhhÀŠ+ ë:˘Ñ(*++qè!tuuĦT*aŜĵyXż~=˘Ñ(²Ù,bħ,ËBss3–.]ŠÉÉI‹Ed2ìÜı…B_|1Ŝŝö·#“É`xxÀà`y›°,˰ŞŞâñLJ(Џ÷Ŝ{ñ—ûŒ’$)ĥmÏK.\¸P9xàżüËżì ¤à-‹üàÂîŬğµkݽĥ§§g )"žçWhp]÷ DäW*´Ü?ÌêR%rñ—áü¤Fg(+êÂló‚ßI7Û%w?)½™R˘ġà`Szd'ĉy†a€çËÖnÇqpìĜ1lŬş[·nĊĦC‡İUĤ*°a*Ĵğĝ,^ĵ¸|p "êjjQQ™B"ŞÁħ\‹Ö­ 7\ï˙̊üŬï~şÖ[oe ÔL§wßŝuônüß"%úô͕ԛ÷£èġĦÄqTWWc``;vìÀ<€ÉÉIÄq¨ŞŠT*Ċ†\—.] Q”Ù0ìÙ³g™ĦÁߟ˘ü=ú;ŠD"¨ĴĴDee%47ĵóÎC"‘À£> Ûĥqŭġ׳ÔÀÀŽ?޳gÏ2•ÔÓۃ ë7àÖ[oEħXÄŻŭktuuaŭúġÈċrìoĉĜħcÈċrà8K—.Ċ’%KĜkBĞäEQÄ5×\žçħsçNĜĥħħ1ĵĝâ‹Èf³¸úêĞQSSEQH$°hÑ"är9tww£ŻŻùbŭ̖-[°`Á|àÀàà zzz‰DÄBĦEqġÒKŻ8zôhߗżüċ³û·ë¤à-ƒŽŽnëÖ­â?ŝüç?_cÛöZDQ\ ÁĥmĠuŬDD5˙Ùi Dŝı Œ9èhġŒˆ´èżŝáVRH³Ër~b˘CäÍfiÎĠš­èàġ#(Ís\TWUž‡ÇĞ_ŭ [ĥlA{{{yµ\$+*°lÙ lÚ´ ç_paÙ ĦĥĥMġġP¤éë`ğlÛD4żüç(šüqŒcll ßüĉ7155…/|á ˆĊb˜HO–W|G"ċv{­ŠĊ⌴?İ0ä’J$µôúII½!ùU0ġé …ĥoߎ'Ÿ|Żĵò BšŠĠÍkÒ҂+V`ĠŞU¨İİaޏU\€w^y%òù<2™ ĈÇÇ199‰RİÄv6…aÄqD"D"ö9B<ŭôÓĜ};nùfö·wôèQüô§?Ċš5kħ} ²,³”ˆùóç#•JĦ hjjb ×qtuuáÀ,Í|éÒÀĴúR <ϳµW^y%EÁŽ;055…Rİ„—_~SSSĜ°a-Z„p8ŒL&ŽĜĜˆd2‰ŝÁLLL ‰ ··ßúÖ·P__;ïĵwŬu,˂iš|6›­‰ĊbW5559rä‰ûîğï÷jŽ) ˙)<óÌ3Â#<˘ç=ï‰÷ööÎuçAVpÑĊżS IDATwçysmێ)u›Œ ŝòİpİ˙ë~UDïz‰”èvùnĥyaö\‘ßĵà'šÙşs}ïż”èP§ÇĤƒŸJD€î3g°eË<óÌ38~ü8Kħž3gVYƒuëÖá /„í”Ŭg5ġġhnžÛö ˆ<p˘È#’àş ]GH‘ñ¨ŻŻÇO~òôöö‚8üà?Ààà öµŻĦ˘²R‰ġ’ÈFOùyŝrÜìŜ=˙Ùû’f‚{CYo619ŽƒŜŜ^œ>}}}}èëëƒ,ËĝèG?Š‹ÖĊÜısÙv^Ó4‘ÏçÙġ–ŠsIĈqÔ××4MĤ.IéQôİ&Ûĥ111ÁŝÚÛÛ122‚ätïh||Û·oÇĞŻ Y–qÉ%—`îÜıX½z5,X€x<ŽññqĜĥ+Żĵ—^z)3exžÇŒĤibĠŞUX¸p!{|Y)Ğ$MÓÀy`Ù{—]vâñ8vìĜŜŜ^hš†ŭû÷C×ud³Y6Oi+C–Œ²]×u¤R)LNNâž{îÁÏŝs\wŬuĝáHIÊÀÀ@ëüùó?–Ëċœ­[·nŝÍo~3ĝĥ·½Í H)Àzè!aóĉÍÚ 7ÜP7>>ÀJ‹dYnċ8ZÓ´Ïó2•üŠ…f:^ċágdĊùQŭFRJ‰DbĈmŝàT"7żÒš=G4ÛÖíj]{³Ô7ë)ùK~–eĦP(@UUĥJabb÷˙ß˙‡ŬğwàÁƒÈċrċ^ÇA‘eÀuĦ…˜%£Ó%I–n Ÿ- ċ l"Ïvġ‡*3R¸éĉ›ÑÚڊ/ùË8{ö, À£>Šħħ1Üñg_À’%KH$ĜZl••ßĴ_äyÜżYì7(,?yQF]û‚ p闢ĦĦÑh”ċüċóy8Ó èüôlPI×!…BċÌ;C‡noşÊrlXNı'É˨Á1c…,Ëhkk‚ àyĉϟX,†—^z CCChllDUU€ò˘G0°zġjÔĠĠ!™Lb||Ñh]]]hkkƒa¸pġj\vÙeH$(LĞP×uق@nş´[(‰D°iÓ&¤R)lßǵ˘(8vìúûûħrċJĴ]ğuuu¨¨¨`qHGUU8ŽC?ŝüÏ˙<òΜ9ƒçž{Žˆ[K§ÓKëêê>6::šŝÙÏ~ö$€ÜïĴCÂ?,˜Ĥyàš^}ġĠËMÓüHeeċ˙İ~[8nF£Ġ²,‡cħ˜@¨x<Îfƒh•Ûh}x"‘@*•bÎİx<Žd2‰T*…ŠŠ ö‘JL&‹ĊĜŭ’bò›üŠiöúnżbò+(÷l";—’ò"ü˙%›0İĤp8Œ|>_ŝò—¸÷Ŝ{ħŭWżBgg'ÇaϗJ‰<ÏĦ£xíÀkĜ·g/ô’ŽĤ†”J:†‡FĦ)Ä£<pl’\~ĤmÂq]pü˙gï½(ϵñ{êÎö"­ÊŞÛVħlɸ;ÀñĦ™PB !ĦäZ!'L p'¤“@8 ĊÇlÀE¸Ê’eYĊ’­ŞĞí;;í÷Çì;­e'çğÎġ~çó\—.ÙÒ6íÎĵ÷û<Ï]h¨² hÊËËqöÙg#bß}DSsü~?ŞĞĞAÓ´áÍfµZÈ†lPžŞÍbNĝ·ñ‰t\$9VQ¸\.ÔÔÔ şşÚˆHREш iژ† Ĉ”MĥvŒ|†ĉ–,ùY2‘@ ÀŝŭûÑĠĠ…ññq‚€ùó磸¸ĠĠĠ(//‡˘(…BPU6› ………X|9fΜ ‡ĦG—gÚÍk×ĊÖ­[Q^^Žë½UUU:Ċ=£ğR3‘í²,C–$ˆ˘hÌ'&&PVV†šš¤R)#JCEƒA´ĥĥd‹ĵĵ<°Â [Py<¤R)9rŞŞâßĝöìÙcïÄÄWPP`Ó4-644tèöÛoŸ\ż~ŭZ:ċ}wê0Ž={öÍÍÍBww·edd„ƒH&“HRôpN$YBÓô—8Ž[Ìq\™,Ë.UUy2Ü·Ûí†k5ĦX““֝yĈcÎŝ!ì9³µù9݈´ġ̏‘q"6içd3ÍÈmÈ<èDîŜÓUMĉïÓU`‰DGĊÑ£Gá÷ú …°iÓ&Ĵ_ż~Š_[:†(é˘Ù‰‰ ¤%gœq.żâJTVVB–e”—˘fv54U…˘é-ϑ)&†`,ĊsÏ=‡×_]Ÿ]ˆ)á–[nÁM7ŬdBIy²yżžŒĦŞéiçIä;m"è%ä BE‹ét,ËNùıŝ>ÓSĵöE1>Sâ$nŜXÖ$!>0™˜ŽíÛ·cġêĠCaa!.½ôR\rÉ%†%˲lT9DƒĊóĵoŜ×ׇ‡~Ñh·ŬvN_²ħXL/3›:6kTeĊ0q%rXèp8°}ûv444 §§Ç%ŸÏÇ~žħ‰E###H$ƒàykÖĴĵüòË…Übħ¤}>_ÛîŬğ_Eñ?WŻ^\¸pĦz ”N_Èc÷îŬLww·päÈ˞={˜xE9-NWʲ,hšFgq†Ĥé<Š˘êY–-cYÖĊqOÄLP ùšr!l8ÒŜ#í6ĞĠ2-ûŽ´ç8ÎóŒêxCTĉ¤;ŭéÀÈü=Ûq!Ž5|͵ÚĵHBÓçVÁ–YġpĦD4ŠÉ‰06~ĝwlÚô1ZÛ! C šĠšN§ËÌÇèÄ8÷*ˆ%âçċáÖ[oĊÂ%‹މ()*BmM5œvL°",7ċġjšQħnŬ:<úè£èë7ÒPżöµŻá?ĝ*f̀’!b¨8&˘%‹0ùw2™„ÛċFW†ö\\ŞÛö¨ ÷k¨'v{0·FIAĜˆ¤J5§ĥN÷E(é'şùŝÓĊ­Ğ* ğ÷žĦ— ħX 555¸ĉşëŒ6y=DE*8–eÑÓÓY–ñç?˙›7oĈċ—_ŽëŻż²Ş Ìí çÉiœĈ’œ*ğŬŽŝŝ~ìĜħğwïF$1)’%EX¨ĉ”àT*…h4Š/-_†gŸ}ùË_°{÷nï(--ƒÁ½mmm/ÔĠĠŭŭù矏ŸSÇĉĝÛßŝĈlÙ²E8pà€µ··7WÓ´ù§2•JÙÂá°Àè4n €ÌÂówbY\~ùċ¸âŞkNğ e( äCÓT(’ Π§Ĝ‘Ŭ¸(ŠĜ½{7ŭĊ#hnn6yóĉáŝûïǙg)ĊS*²“÷ĝĊ/~ÊÊJÜsït·1AtpĦè“VJ„OôG¤b óĴé\&Ĥ~)'lk#³[9Ést׌6nÂêĠĞĦH’ħé…PSSƒ˘˘"!'',Ë}}}ĈĴ°ğğÛĥmE]„›nşIWÄT@:‘V‹ш‘Ï‹hİâñ8Z[[ħk×.´´´`rrRg—ZƒÔAŝ>rî˲>GûñŒsÎ9O=ġDQ×ùŭ~U–ċħÎÎÎ?kšö7ŜĜġĠŻ~U9J§Ž˙ħcíÚµLSS“°aëÈÈHîĝĝĝB–eĞ9Ž+bfžĠj ¨ŞÊY,žaa–8Úlıc&$˜+ĦlP2ššm{ˆP6˜A‹eħï̕ħ*‹?„²ç ÓÌ@u˘*)û6Ù˙t 6ynbži³ÙÀ TMCİ@G['>ŭôSlÙü)>ŒH$fÄXí6ĦĤv6–-[†‚˘xžGeU/–-[†#GŽ 7_7¤YÁ`ŞĤá+}—^z)ÊÊÊ ‰)TT”ĦŞrĤNVH‰àË´‹?yozö`ġêĠxóÍ7áp8 Ş*rssñŭïW^y%8 ohjĊÚívCQ´··ŸÜŬğwcĠŞUĝяïE2™DRL,>JIAÉ ˜ UÇqEqZ›˘İ:'yZPÊÎn2Çg˜‰ç$“I}áĈӟŝ;PVVŻ× ‡Ë…‡#Âáp •JÂ]žçáóù°bĊ b͚5Ċ=÷܃™3gqíl²£JÌÖJdS@\Ìs33àÄb1´··c×]èèè@*qŒöN„Úf+'QJ£´´ż˙ŭïħgÏĴ[·Î Ĥttt45&‚=.$îDÀ”=úG ôπ“53ÑT 6ÁjܞĜĈlÚ¸Û·oÇŜ=„$éÓ9ı9(-)GMŬTVV˘VĞ)Q„EàPXà‡’qÍ7à—żü%z{˘   'NjH$‚µïƒĦ~\wŬu˜;w.ÚÛ;‰D0ŻŜ¤)wf.AŻÒ²2<ùä“(//Ço~óÄqô÷÷á‡Ĉŝŭûñ£ŭùùùàXœÓuĴş~-ÖĴYƒ;v ¨¨ĊĊĊ†W9ˆ´ïÌï£,ˆÉ¨yĥGŞ â€q²Ü^=™ogŝüÈë”$ ‹_˙ú×ÑÑֆŝŝ~¸\.Üp †›‚ÙgÑï÷f³!•Já‘GA[[V­Z…… " Aƒ˜}Ï€`Ìú83¨’j‘Ü­V+-Z„²²2 à³O>ĊBĦaúJr˘DQ„ËċBSS^{í5ü‡?Äŝŭû1::JÒoy—ËUát:—uuuí\ż~ŭá•+W~!ĞS•Ò˙½ù ½sçNkWW—ÖÖĉ­Ö4­–8;ÇqGhšŜ[[[Ûá…Ĉ.şè˘˙ò ²££ƒjhh [[[­ğwïşğğscħĜBŠ˘ŞY–-ĉ8Ŝf³ ‚`µZ­˲ĵ™l`·Û ğ™ì0;sžùçÓ͔Ì3#3`Ñ4}ÜÌ)Û]Ĥ1Ċ5›¸ (Ú AéDÂÖ˙Š#t€eŝYLɎ~ttÀĈħmÛ6îèÄÈè(0(ŸQ’Òräçç£jv –.9‡M'€°Á‚ü? óóġÇÖX(}‘~ŭĠ×°fÍôôôLĦĠ‡&1119sçâ[ßş ,0˘ŞĞĞá°[ ½i혏tJŸ1*ŭŭï~gD"Ĝl6ÄqœuÖY¸ì²Ë°|ùrP…`˖-ĜħcÚÛÛárıÀ0 xàÜpӍH$ AÔ Ċ³fŠ8ı=Ïó†Ğ÷‰lŠĤ.ÔÈܞ3Ï÷Ĥğż(JF%(‰úï…çž+Żĵ˘›Ž;îÀ²eːJĤD™“sñċ—_ĈĞŻŠo}ë[¸ġÖ[1>>n8Xž›ÒşËnәĞRёߑùÏóF•¤(ŠÁ^UUĦñ tvv˘]]]1|­V+ME<GnnZĜԄ7BÓ4äċċÁjµĤ{zzƒÁgç̙óî /ĵ=J˙VDÛ·oçwìĜakoo÷'‰VеÊf³‚PÍó|9˲€ ŞŞ{"‘È֊ŠŠOżüċ/qĈruuġI·Žü1³sçNaïŜ½–>. ċ…áùÉdrÏóĊvğ½^„bğŬnµÛíMÓ<ñ†#;iâ)g³Qİ™¨@.ŞìJÉ|?sû.›÷Bò²Ä÷Ÿ›Ŝ“ÎÜ9Y{Ž€É? JهĤ¨`XÉDü1Ŝ|óM444  AÓ4x]^cîĵÓ0ğĥ3+gÁíġ!)ĤôèĞ•••È÷{tÌ<, VÇèĠÍG›6á™gžÁŬ{àt:3L.iYÂ(rrsqŭġ7àŒ³ŝĊ ×VÏ0´5ĉE›T$4t⅚Ñ˙|´i~ĝa8pvğÉx•••z½$ ĦPS™ÈûîğßñcŽaĵgŞvB’ı y-ñxܰà!^u'JŭgAÉl;;P–ġj%CStş÷ĝè({ì1lŜĵ4ˢ˘˘×^{-.½ôRˆ˘ˆĦĦ!äċċAQlܸ?ŝ8VĴXUĞVÁ•!I!ĊÇùf\ŒĴ)3!GÓ4”dY6˘*Èfĵ~Y–u˘‰Óe05 eĵ­­ Á`ÑhœEw=‰Ç¸âŠ+pÛm·áĊ_Ä0Ün7 ÛÛ;1>>ŝŸĦPè™ĠĞW>óÌ3•S ôżüĜ²e ³sçNĦ³³ÓÚÙÙéff UN§sĠj-ÁBÓ´@Qϲ,Íó|ša˜EQŠ˘ĵÇóüĤœœœÁ3fȕ••MÓ€ŬnÇĝĝ8:;;qàAş³³3glllĦ,˳†qpWÀqÜ\ğŬ^èt:­‚ ‚‚á„@Ó4‡ħ˜“Xél˘‚HHDÄŻÙ­=sĠ“ jÙâĠ“뀴ôÌ8Ï ÇUEÓU4˙”NÖĥËfŻMiQ4>ŝè#üñÄÖ­[ÑÛÛ ÈËËCNNfUTĦ¸¸ŝ‚|P4‡Ç‚@„Œ#…&k())AQ €"Ë`  4hÛNŞ˘ÏvìÀ/Ÿxğwîp6²¤BRdŒŽŽ"ĜpĊ•_ÇW/ğ\w¸à4”••Áï÷jµNyíŞŞ‚Ĥ޵µ¤L‹¨İİ O=ġ6n܁ç‰D–Òà9~Jü‡,ˈĈÈ˰ŻżáÛúçL"Áô?%Òs8P‘Hä8Êŝ‰‰¸ŒŸĴššÂ„œĤZSͨNx–C2™Dχ 6àWżú†GG‡Q\\Œkı_|ħQıŒŽŽbĠŞU$ Ï>û,JJJ0<< ŸÏ‡`0¨o*4uÊF‹TP¤šÎ¸–TV¨‰‹ EQˆÇP2çˆÉ”‘;èîÁ`ŬŬŬèííĊ`pÈH.öx¤ŭC†Û„M(Êë27Ê&7Ê‡€Wĥu:"Ät cÏté­ĉh„l ÑYZÖió€ÌğÌÉZ|ÓŬgşEġħGĊ{g}û@S4ìvğAwı\`Tİ´ŠaÁò(އÍaGġìÙĝò™gá´9ó *Š‹¨œ πĦ)2äT ”Ġh:xÈ7ñ#GħúÑÇŜ_ßo·‚áôÊ"!‰³X¸x ÎZħ5Eûŭ(//‡Ç1ÂlP2xûí·ħ{çNÄb1 ¸¸hll ğs$E’$áğîÂ=÷ŝÈpW°ÛíşÑ,NnÈúƒçyĴ\ı˖-ƒŞŞF ĝÉŞ¤c "´RÊ^쳃,ˆĊbúıi5ҙêċOú~ġâ‹“ñàškÁĠW_H$‚|;wîĝwŜ‰‹/Éd‰DbІ(§ÌHÉûnTRY˙?Y=q·0ZwĦ1³#C˜{²,#‘H ·ż{÷îĊ0BĦnğí6œqĈĜ°aFGGáġzĦ( úûûG&&&~#Âso½ġÖ¸ÛíŝBĊ[œ":üMMMôûïżÏ8pÀvÇw䍌Œ,$İÚív—z½Ŝz–e‹}>Ÿ…eY!•Jñ.—‹ĥpüħ]N4†ħħ1„B!£l—eÙ&IR•$IšĤ¨ÙCw2 (((à].—H$xŠ˘Àòœ1è%ĠiíÈesû€D6ñ€ôÉmÌÄóŭŽ×‘Ö3­•eùi+!2˜žnĉ3…M—IvĠ2Û)*d´éĊĴ{.#Ŝ4Ï5ĤKƒ%ğS3HmĜ°Íû÷£¨°óêƒ ™DWŜĜ\„qˆ˘ˆŝŝ~tuu!<6„IšĈX_7vmو‹ş_|1† O ~n|h°`’"aġِ˜L£¤|yô ̘YßŝîED"x½^p *cÓ7ú;[á°ÙÁ0 .\ˆ~ú <.Ò˘‹ÀB•)PĵœİÄ2â^Š4 3q˙ŭ`ddĜ›jš†[nıħD>Ÿb: JÓ ŸO§ĦB›"5ë€ÌŽyàšMá&àdskn:ÂħÊE™rÛìJˆà”Ĥ£pOú$żË ÚOJĉÁ ‚f†T2™4D‡$û¨³³SÏóIKx<V›”ÙSĈm5MOÇÇÇħoß>lܸŸ|ò z{{AÓ4&“ .şè"|ë[×Uâ%‹àġêYA,äc İѤïP4 hĝŭKżĊo~ótvvÂçóî‘HÄĜ\œsÎ9¸ŭöÛ1{Nl6+@İ” A`Ħ@ŸŬ° zğŒĦh€˘ È*ŭĵ˘hÏ<ŭ4ž{î9c†Á²,Ĵ7ñ³Î: ĝӟ@3 ä 0š™d„i–N§E™çyŒ áüóÏÇĝĝ8(ŠBee%ûŬï₠.€éÄädÄĝûÉMb?È~²öžĤ)SZyf½Rv+Óì™G~644ŒG}mmmFUâv:199‰ÚÚZüàG?D ە™ög"‘0âHx^8&tÍ̆ÈûBfJӉj͞‰ĉk€ĵvQ P3ğ…ÍqĦ'.£££èëëƒ$I¸á†‡ħoß>[²ŻŻ/=<<|0?½`Á‚wżhbÚSŜw˙Ġ××[Ap½òÊ+…Ûĥm[:<<ĵ’eÙ Ün÷Ċ‹ċ\Žy<žb–e‚ N§“qğŬ`ñx£££èééA{[‰„‘•2wî\̞=3fÌ@YYJKK1{ölÔÖÖ˘ŞŞ 3gÎDYYòòòàñxŒŝ´(ŠE‰D°Óç8\&ò›D€;aÛltJĴJˆ6Ħ½šĞĞ \§:4˜Ċ²,;•qĵñĠ“Yst² =ZgALĞO2€xšÇ9™Ğy7mrâ:@èĥwŜy'žŝyô郢Ħ< –eH$ġż[ İ0<ä Àqz{{1::ŞÇs+@KSF†‡QW7N·=½½ 8^ŻšŞ‚Ħ$Y‚ĤèžvM°`Áäĝ|Gww·áÎàrı0ŝ|<ĝóÇwBiyXžƒ˜–v¸4ǂĴ`iŞĤĤc7Ş*jĉŭÈĵǚ†h$‚Ÿ˙üçèëë˲ù|¨İİÁp0ˆT*Ç/\pìÒRÚ¨>I…IˆdÀOjĞUÀşuë088Ž088ˆmÛĥaÌİ­…ÛE"‘0*rŸŒ”bn½jš:­{yĥv€Cvû7(‚ hnnĈàŠŠŠ‹FÁqño`ùˉDŒżÉ\yë› ĈĜ€q%&Ñ,ħ²2Ǜ˜7¤$ŭw:`2ƒyFe~ŭÄ!‚8˜bħ`Á‚èèè0[_1ñxœÑ4íh0Ü·yóĉäsÏ=wŞ}÷E>>ŝĝcĤııYhhh°ŜxîP(4;Ïñù|ċùùù³-Kı˘(NšĤ†aŠ˘hšĤÁ1l&!SE*‘ÄÄÄşğğ199 –e —áÒÒR¸ŬnC_@Z‡8݉NÁçó!??˘(˘şş}}}ƒèëëÀÀ€‘ıÂó.½ì2d  8Òۇ‰‰ ŒŽMàpWêëë(Ô5H:1AÏ1P…‚ĵG›6mB0„Íf3ÂçJKKѸw/X–E(BGGòòó§8›ÏRġ“ó„Ĥih Ĵ‚ŞŞÂöarrÏŭÇ èìèr ĦiÂá°!\3³ĴéZ­Ç“62&`ŝìÉıJŞòğp8Œ³Ï>###ĝŭo‡P(*óx[ĥlÁ’eK!ÂÀ ĴI"§ •%™÷M”|Ĥ ?$ça6x™uf˜HĠevĈ'D%ÒŞ'ÏyĝaĴ\ı^Ż“““f’`³ÙŠü{öìùBµNRĉĜĵy3³˙~aǎÖï}ï{ıÑhtĦ(Š• ¸\š˘˘˘rğŬîdYÖ‹Ċx´×ë…Ŭn7*‡M×úŒŽŽ" bddİT ¨ĞĞœ9sŒr>ct ËÉ|‘ š´A@ee%f͚…X,†ĈĈFìŬğ………ûŭHRlÇbżÍó ²S5·íŽ%Žúg[ú˜wšfuŝħއ>.Ż(›hp˘ÖÚ?+t=)h:)›.ûÈ~šŞ‚fŬÔTÓĜĜˆ—_~“““à8>_ħÑ×׃C‡é –‚(ĤAi€U°N15G³çbċÀў>ìhĜ†ñÈ$ŝíúë1Ébt> NRQVV‹EGUĠôö Şáh£wîyçañâĊP9ıı¤Üƒ¤ÈàX}ŭ}xòÉ'‘L&qùW‚Ĥi:tbRÄ̙“فk&:=PšŜÒÛĵy3âñ8‰œN'.ĵBŬ@UU„a:t_> £ĠLLy‰‹„yĥDìnâñ8ÂᰑÌ­ħl"„Ykfnċ‰b ‡W^y%öíًO>ùžL”ùá‡ÑÜ܌sÏ=˘(r]é×=-³N–ċ6iĉЉ\kĉxóµeÎ3“%²2l6†1hĉ.— cccƒ(..F(2|)ŠœfħXnß½@ü(}Ž?üÙğwŻÚÚj½˙ŝûs‡‡‡Š˘XͲlħËċ"ŜA›ÍĈ{<šXÚÀñ Nğ ÇĦгCCCFS7g-Z„Y³f!O)żÍĈ¤¤z!ğBĈFĜr^Ż€îĝ›› ğŬŽ‚‚äää ‘H€³‘À3L¤]`tÌ-2Í6Tn~D.f²3>F‚Nêž}"P:™èġDŜuÓŜÔIˆÌâÈ ˆ˜‹Ìï˘““xŭġ×ñÁ`çΝz½ ( ƒC¸òÊ+q͵ßÄàà <€ÁÁÁ +MÒYR’$!77>ŸO£âbÔÔÔ`Μj44ìÄï^zGzzÑŬykž_ƒï~÷ğ8}Ùrtí…()(/-†ÛíMŝZƒ–‰§ ;rÏ;eÓBQx–Cww7~ŝóŸÏo˙E†KЏúêĞÁY,èí€(É(/-Ó)€ hú,I÷­£Ò҂ĈĈFD"ˆ˘ˆK—bÁ‚‚á0R^=:egn‹‘yÛlşhĝŬwßÇÀÀÒiŭ¨­­…ËċBkk+8΂µk×íÒK—BE”ôdŽíÓmB²Ğ¤ìêÄ\-‘Ÿ ‚Y–Ñ€ÎÎNŬ!•2²££+W4*!/O*“T*=@²ŭîÌ CĉJÙ­=óë6·ĈÉlZ’$Àı“““ UU­–$İĜñÔ[­ÖbEQĴ§ÓÉğŬncĉ299i°“œN§1Š˘`°Wo­%“I0 ƒââb̟?~żñxÜ8éA8nĥb.áI%“I‘4f<¤Ċ–Jàt:1{ölX,–cJpí˜sU”͘#;<ò(™éŬfv™ÍÄËÖeW\Ù v""ÂÉ@éyÓQĝç-òúÉ!Š"öî܅mÛĥĦİİ Ÿŝ9Âá°ñÄb1DcQx<äù 0sĉL\{íĠFu …012jĵw.— 999@Ĥêҙ *jçĠ·Yñ䓿„$ b¨ŻO­~7Ŝ8³Ï_‰ááQ¤ÓiÌĞ›ĞUw´ĉ8Ŭ‚‰ĝđ– ѕ‘£ežxâ lĜ°~Ÿ.¸îŭżart·Ür ÀY!Ĥú‘N§Q9s\.kfQV@s,4EĤM›ÛۋT*…œœ,_Ü –çĉĉbbB7‰mooÇà ‹SÜ H'€|>Z[[ñÇ?ŝƒƒƒş÷\"Žù—Áù矏_üâhmm…ßïÇÚµk‘Jp÷Ŭwcá…pğŬ†x4û3;Y Ï|Ž˜iñfż8óµ˘ È-8pà~ġĞ_Ábħà²Ë.ş>€$IˆD"38›ŜmŒ3וyΖIg:Yƒış2[{‘Š•yD^ñcÌn³···cöìÙàyŜ¨Ú2ż4M³ĊqĥĞĞ‹š9sĤv ”ŝ/ëׯg6nÜ(´ĥĥZï½÷ŜÜx<ĤéjY–‹†İ·Z­ĊŞŞZ)Š<O¨­d6C˜-EÁċr ĥ(ŠpğŬùôœœƒ"‘H;ĵĵ<äċċ½`!Ó˘#'İ™†MÀÊÜC6W4Ôl6›áFħD0§â˜HÑ|ò“ÊÀlpj€lÈ&!d_ôÓÌ,˘ìë1mÒ?JÓUD8‘OŬ?I"µ×ÓӃġë׏?Ĉ`oz{{ÇáġzáġzĦiBĦ’É$òüşHvdd‘(ÒÒP”p~ż~_@›Ys”ŝĤ†½uŭ·˙ <öÈjìjĜ 9)âw/ü“1\~ĊˆD"hhhÀüùġzŬ  BQ%0ŒĊ¨h ’6T__úكX·n.žċ‰M›6"™Hàĥï˙‚ `xxb2şúZ¸v¨USÁ]ğ099 I’PTT„… ‘ ËÏÏGOO˘Ñ(ÚÚÚŜŜŽÂ˘€ñÈı–JŒhšĤ‹ĊĝóÏ?×7wáIÔÎEee%ÊËËñì³Ïâ‡?ü!›öÁñ`˖-HRxÁħxñbÄb1ô5ğċœ=KšN j^üÍ-Àl˘L4Ċš5kĠĠ…çžŭœqĈèloGGG‡qˆ˘ĞĠjl$‰4@ïj`ʵmÎu"íĵì(3üŸ8<˜ŻK˘+4?v6užÌ·Èĵ‰l‚Á ĈÇÇáñx011aÜVÓ46 ùY–Íinn˙˘Ì•ŝײïŝŝá:&Ïï·ùssŬï½ûnÉÁ–ƒ˙:<2|Ħ(ŠpwİËċZ‘››[ïvğ‹Ap ‚`ħ VF‘e¤Ċ4ÄT áÉI„&&š˜@p(ˆÄ’‰’‰$F†‡ÑßׇH8ŒD<Žá`G{z`µÙ ¨*dEÁü PPXˆ”(‚aY,–À° 4ŠŞEÓH² ŠĤÁr,(šFZJ#™J!-ĦjzxùNÑzÔ³$KPTLĤ…`޲ŭëȜŠœÌĉı‘~!Ğ i £Ï‡ô‘ıŝEQ°Zhš~;ŭÚ×Àó\ĉ6 8ŽËrµ†aÁ0, °›yD-óoÍHNMq ä˘2SƒZŻ:š“aŠ-;MƒHÉPAAƒQASúcʲ޷Â(R:)Ĉ;ïüÏ>óxċċW°ŝïÑŜŝĜlv€ĤÁ[mÀ`pxIP)gŸw6Îż`%(–ÁŒŠr¸=.¨šŝĜŠ˘àé'ŸBËÁC°Ĝœ82Äà ùlRÀP,(0PeUUĠ¨ŞŞÄÀ`zû"%%°o˙n0VĠĠ•U££p;s`³Z@S,4J(M˙ğ)€m¨:TQÁÀ`?úúû‹ÇÁ² dE‚Íj…cÑÙцîí˜[;yù…G,–‚Ç›ċ@k vnߊW_}ħD)QÂı\ˆóÏ_ ż? Ca|"„í;v@ÍxžÇ+WBS3óêXŞŞúùrà!Ü}÷=xï½÷ÁX쇣(,.­ßû*fÎB4™@ĊĴY8sĊ 4ïۇÁAŭ}ŭĜ·wjŞkPUU 1•ÒÏ}ïwx ˆ¨Ì\‡:hÔħY¨…ç‘J&á°Û‘Îl8öàChooÇŬwߍóÎ?’,#P\ŒÖ}€ÛéĈüÓÀŸëG*™C³úß š ʔëBÓô³‘Ê\?ËèqöôۑëKSĦiŞ~Ë,ĥžısaž™Ğ=3ĜF"¤ÓiÄb1Äq¤R)„aŬh7GBÓ4 3¤hšfÂápÍf;ĵmÛ6é(ŭ7×o`ÊJËlËıßz뭒C‡ŭk(şPĊ A¸Ô"+ĴVk½Óé,rğŬn‹Ċb‘e™‰ÇˆĊbG4E$A,3L‰1#ÙF£Q¤Ói¤Rşîh||£££°ÛíˆF£FË-//n·Û˜éX2ğŞìyQd ¤]‚(ŠFımö˘3Ï|ÈšmŠúÚpf3ĠcŽsdȜÈEmîó“!4ËrĈŽŽ €ÉcşPÑÜŞ4?.ÏóPdċ¸Ù%’ٝ™-GvŸÇîCAQePÀÓüħ™ŒŞƒĝ͟ġ×ßÀ#<‚7^˙#şğğ ‹Ċáp80§ĥ~h†ÁÀà ÒiIŸÈ êêêpß†ÇAii)fV”é]ıL›ell üä~ìܵ²˘˘ @4Ċd(ŒŸ/Ü&‚EĈµğ˘ĵƒƒƒƒ°:ŬĜım;Ät‹.EQŽaħ:asX!Ëià)J×™\Ĵ6+N_ş  µµĠÈà!m>MÓÓۇ–ƒ­(ИŠŠ˜œœMSÈġù İ ~û⯰£Ħáh.Żçwtú鸝`h >Ž;v  ĥĥVß´eUEäş$]slˆÌTF‹Ċ‚h4 ·ÛD"Ż×‹—^z 7nÂu×]‡ĞşÊ]ĝŭ~tttàá°ÛìX°`òòò œy*+Ò İÙq+ĉJΘuQSŸhn™g³\É5F֌T*…D"H$‚ÉÉILñêË83ŞŞÒÑh´Ëï÷ïŬğwoò(ŭ7ïż˙>SXXhóx<îżüç_J˙5_Ȳì6›íRğŬÂċrĠû|"P”[Ó4K2™d˘Ñ(&''‡ëJ|†Ö ' ™ ¨¨ùùùÈÏÏGii)8ŽƒÓéœR‚“#‰ ˘((++CII‰Qİ$SÉ)=àéNÒlb@öÂNtH¤T's‡ĴPiżÌ‚Y³ûħVôIĊŻäqÉmÌíŭß´ñ³Ħ¤A¸È™™Y4E'DOÜٖFĉŻ´DQÇ2 ̀Ò(Hé4ÚĥáĠW^Á=Žßüö·hhĝŭŭ (Ê ÜġĞ—àêĞż ·Ë‰M›>ÂP0ŜbÁd( ğsÎ=×_=f͚êêjx]n‚žüʲ z{{ñÀOîGëÁƒŸ@_˙(†ÑsvT#A¸œPÀ”/EÓ()-Euu5FFFp¨ċ òrsÑÔĜ„^Ì­ĞËsè€ĠîFŽÇ€BZ’âĤiz›–E}]JKKqàÀ Àáp ™LÂçóAVd Ñß߇Üü<€€â˘B47ïÇ Ï=‡ñ‰’i 5µµ¸è˘‹P7w Š qĝaìÜıÓàÀyçž Ŝb’ñÛµk7î½÷^<ŝĝ!BUUœ}ŜJ\}ġ7 wsŽgQUU…˘@>dEEa~!{èèè0€açΝÈÉÉÁüóY ia’ĥavkoşÖ-›1L%×ĦkoŜĵݽöüúU¸ĉškàġz ™XGG‡.>µZQ—yÉâo&Ôt•ŽıŞÉĥD2ŝ jZ†Ğùʞ—eWİTÊpˆÇ(ċää   á°4‡Éĉ0‰Dö[,–ÏÛÛÛ§@é˙Xğv-3kÖ,›Íf3*"Q/¤)úğŬ~İÍf[Á²l½ E.—ËÍ0Œ%3áÉÉLû-1•‚,IP•ŒŬHĈËÌçó!//………ÈÍͅ˘(…BˆĊbX´hjjjP\\l‘¨€h4 I’àp8Œ´OŸÏ‡²²2£K S£ĤĜ›}ğHBŻ~żß˜sY­V¸ŬnǘP²ç'fħëtñázëîx ¸™J*=†„´Ħ???ċŝĉ™•Ċb"+şX“˘Às\ĈY€2ş„ •ìÒpe9£ AA‘p,wÌìR’@›€˘4¤"††°~Ŭ:<ŭÔ3ĝġŻ>ڌ#GŽBÁjCqI /Y‚sÎ=×^w.ä Œ`ÍóÏ!‹CV .Â5×^‹+v%f͚…˘‚|ĝĵ^Ĝí½ë˘ihk;„ŸŜ˙ĥlÙŽeĦB<‘DKë!]YXˆT2†Ĥ(*‚˘ê –c!ĤġĥQ ¨sĉÎÁĜşw!•NĦŻŻcĦqÔÖĠÁárb 8—–ç!d)™³Qş‰k"‘€ĠnGMM rrsq¸Ğ ƒƒpıŬˆĊ2-Üî#ŸaĉŒ(ÈÏCAžyûÏĜ´q#x‹€h,ĊK—bĊŠ(.*‚`áM ğ].|òÉ'ˆD"à8ŭŭŭÈÏÏǁƒmX½úq<ġ˧qà@ ˘ħ8¤´„Š3ño^Ğ~%òü~hŞ ·Ë‰ıµsPR\ Cë“Á@QĉϟÖÖV„aˆ˘ˆX,†Ŭğwƒ·˜={ĥ1Ñ4Í0w=*šŽĦĈŻdî211GyóĉÍ]?ĝ!†Áàà 1Ż•eĜıs'œêëëQUUe Èóħ, ŠžŜĜì}g~²EQ§3ÈßDÚd£fže?O*•B*•éŝD£QD£Qäĉĉ˘  ÑhŞŞ"‰ OF£ÑFŠ˘z{{ż ô˙ ˘C{{;500ÀĵġÖ[‘#G„ğï;W–ċ…VеÚét¨PlµVEQUUy²x“Ŭ‚Ù‘ĜLĦ$U i‘žĴ@·óğŬŽĦĦ!ƒ–]ZZj‰úúúÓӃħħ1#˘ĞĞ UUU˜3gŽžLX à@Äwĉêˆä蜙*jĥêÏ·ì–ÖɈ ĉÁĞ9:âDtnÒr$a€|UUÍìÈĊ\ÄÉëI&“F~NĥAĞiĞ%´"íKbçB^İdA—Ù-Ké4p¤Ğ ~ĝ!ĥmۆŜ=ı•fáġzQR^†šÙµ¨İİAeċ,xĵz6Pii1ĴV+ZZš188Ż7ħDĠĠĠ¸çž{àÍÉÁx(Œ’’¸úóQHĤÚkŻá×^EżÁŒt8˜DhxXq֙(äçóM1ß%V;°Ž|€JĤÚ (pâñ8’É$ĥoßĞU¨ş\.äĉĉ˘¤¤ċċċĈ÷öövŬ$Š˜˜˜@cc#hšF~~>"Ѩqól…ˆeÍór⛙7fŠh"‘Àää$4MƒÛí6ÀÍ- r2gW?قY³K÷tö<ĉö15³{È{e~Íĕ bN%Ĉ0˘żżƒƒƒ˜˜˜@ïÑ£Ĉàà Âá°ĦĠ"'ħn"sY³fÁn·£³³ğwïFKK FGĈÁqróóPY3…ŞŞŞQS;.§6ğĞU€ÏçßŸ@Ċg‰íŸ~†#p8hnnĈ3Ï<ƒ›nıĊċĜµk-˜ŸÇ‰#GúÔ/ŸÀ[z‚ÀƒiX2sµP(„H$ŠĊ_ú.ğì2””” ´¸EbÎQÊqrĵŝ3šBZ–À;lXŭİĜmĝëğï˘iình€,IĝŜí·#(Apd²,£ĵ˘ VžŞipLELkA+żrThxâ‰'ÖÖ CƒçYäúr‹ĊѰ};6××C“EhÚo˜€ò·Ûml:ŒĊ3Ó*üĉ7ż‰öövĴ[·‹ÄDhàô`ġœZœ~úéX²d JKKġÈ YBQaaĤá(=J‚a(p Ğğ˘³úµÇ[,(--Ċ“O>‰˙÷ǖ-[ôê†Ĥ /`xxwÜqJKKv•ı9Qĥ–ıċ]RR‚µk×â?Ĉ#<‚@ €ÁĦa<'‡Ġj5şdh>§:]Ĥu@ŸŽĈNÖ³–Ñĵi38fğŽ“ùZvÜ ÓH$bdXeħyšĤgH’T>66>JĤàÁƒÔĦC‡ĜmÛĥÙóï8{{{+$IŞĦÄf³•8ŽZŠ˘ 5M³ĈqAE^Ó4úít!™LbddÄĜĊ‘ŠD’$xL-7óŸ|¸N§‡pÓ&TjÂd ƒecccÇqhmm5„´sĉÌ1Ôèäĥ‡Âàà ŞŞŞ°`ÑBĜív¸\.hš†D"aP?ɉž-^5W8˘(˘§§Á`ñxÇĦ¨¨ıııĈ ×Ĵe0‡Ú™ĠâĉcŞ^C=ĦM9ıÉ,†<݆‡‡!6cÇF@Ên·ƒ˘(\şğğÑŜŜŽĥĥ68pÑ[ á”v!Sš|8†œ •³úĈÀáp NcbbyJŠQRVŠÚÙs1oŝi(.-•™•%#)x<>̚UŜ˘³µ‰8ì6+Î=çlxíNÜyç]è>z‡›7o†Ĵ޸ö[×£ĵĵ]‡‘ óŸ˙üëş@Ö2H*ĦP“Ñ/]†ïÜz+ĉΝ‹\Ÿ@éQôġġaxxġġġÄâ18ìĴĝ¸s|xᇠh*Ŝyç=¸]N4îŜƒ_=ûnğó‡ûŭúü“a0kVYĤ½İBƒ )-ÂJ²ċ+_AQQî¸jj‚Ŭ邖Ù$ŽŽbŭúġ ö#‰èƒDÒxï‰Á´zBJ§1sÖ,\{íµhooǞ½{@BA~Ê+gcÑ˘EXĥl /ĥ_.ÊÊʐëq@’4¤%9Ó% Ĥ ÁHĈh5³għÇÏ~ö3lܸÑĜ½ñĈèííĊwŜ‰%K–//™Lž”Îf6U¤ zï½÷ċ/ .Äx^0̏Y–56AfA0YÈùoŽX?‘×b6ml4³ ÙIÁلZfÑ­Ùċ!ûyÍB^2c"Ĥ@D^Ó´Êt:]F›NRˆĥmÛĈ677ÛV­Zċ)œœœGÓtĠje³ÙŞĝ†DQ4McÍü|²J’„>$ D3 ÏóHRĈp|bbÂ8ÉHOxŠíEĤL&eÓñ~RuuupğŬ˜œœÄ0&&&044„C‡ÁbхwĊĊĊFvQ*•ÊD„ħgÏ ġˢ˘"x½^8Ž)Ĥİ0IµFŸ8DáĞßïGuu5ŞŞôP9A/&²ÓÍĤT“ûDĊcnĈ˜V{dŝ‰ÎŝÛßŝ†ĤĤ&ĴXħ\pTġX˙œ\Äáp Ĝħcwt˘ğğ===˜œœ„˘(ĈÜ­şşĊ™ÙDaa!œNçħ 6#&D?şğğq4SUĊb18äĉĉꋆ]wQoi=ˆ=MžŞjŞqÁYdR8ÈËÏÇéÄUS Ş2Ÿ~:ž}öYü䁰·q?vìĜD*Ûożġsħzġj|·żĦ¸¸šĤ!‹8ŒŽŽ"‹bٗŒëż•••ÈËËCI‘ßĝ>Ûú$IB*•ÂŽ;P___§ôÓşŽ)-ĤáñzñÄOÀjħáOoü‚Ï‚ĉĈ}xŝù5¸ùĉ1Ğr::: +ŝËöœ IDAT"ŞfÍː>ŽÇ{ ápX×iÔ=Yĵ‰èÔċpÂjµDò˜ĉVžı-ž}d›gWOÄ5ÛG’\Ÿ¤Un&k˜½ÉĤ”èœÈk"môt:m€Y'EaUUġH’”/IÒ˘Hù{Żżŝ:³uëVëÍ7ßìîëë+ŸgħX*yžŸáp8Ş-K,˂Ĥi0ĴŞŞF²%njĞ(•Htj³ŞÜápLiӑ )Íŭ[dÀ*•LV"½GúğŬ§Ó Çƒ\Ÿn§— †&`03_`ŽƒĈ²2D„Ħ~ ööá@~ƒ¨àt:”ù¤MR3|×<*k*QSSƒúúz£Ï-I’1H7 ë̂şc £f:0Ùto@Ӕ)óìPìÛğ}E2Í#PßQ}áġفĊbEמ}HĈd\|ñ…hi?„˘X!jkfÒ(0ÑRK–} O<ñîğï>477£(χ{và÷k$\rÉ%Ĝĵéïà8 œE'ݰœħ¤ˆÉx‹—,·|3fÌ@UE ĵ^/˜ÌùÇ7ŝ€§ž~‹/Ĉ7ŻRZÁî]ĝÒò/é´AÀ@…ĠÂPaµZ³Ÿ=†Ò°ĉ…_#ÏïGkÓnüvM Ğ'ŞĞkq¨xTW—ƒf(ZZ'~€†,Kà9aĴX´`ž}a V­Z…½{÷ÂñèħÉ\.—Nî ġÈs)”ŠƒĦ€ħ‰ĈÂIĝs]`5Yï f˘é/ıìr,=,ôöġ#82a,ÈÏ/EAAñ¸ˆ£Ŭ½úfF–`ĴÈËġ€Î—×9ûŠ •b=|†ö È/,ÀSO˙^·ożŭ6‚Á rrrwä(~zßO°ğásÜ|ó͘3ŻŞŞ@J⯧QÇ@ċ—_Ĉe—]fˆÏ)Š‚*ëĤŻ^wÒPä4hJƒŞH  ‚ċ9SPĦAV0 I‘ÁòÒi]KE4wfQUĠ˜÷MGh˘iÚH&k”™Ô`fĝ’ûY´ Ìva¤GôIÄz(™L€šÙĜ³²,³‘H„ú”žyĉĤ­­MĜżżġŜ{ïÍ ‡‹DQœGQT%ÏóĠĦP(×bħ‚ ^Ż—%ĵ{²¸r {\?•D8˜ÍMɌ…xÊ€Ó露g›“Ĥ3@Âñ‡…BˆF£H&“ˆF£6˘ÁIEEe*,óîÏĴ™ ‹ğ ĈI&I†‡‡100`üŒ!8N,_sçÎEEEü~ƒĈMvCSNHÇÊÔvÜTa^vŒtğğ)- Ž­éŻ]>™˜˜ÄĤŭĝĝÓOà/£¸¸<Ïh÷aˆ˘ˆd"‹Ċ‚™3gÂç/„ĊbĠjE2™Dss3šššŽıh{r Ù˘˘"83Sŝ‚|äçꄅÚÙĝĈ7ż‰á`ö7b×]X·a#FFFt §8x|ŜL쵈P$ŒwŜŝ3 K¸ôÒK09BËÁ6TUUçhȊŞ/Ê…‹âݧžÂüclûì3TUUĦƒƒƒí>‹Áf³Ħ·o’”Ĉ˘Kñíğ3fÌ@mm-ĵX–4àoĵÇ{ “aĴ_żpċ׿ĞĠн{÷˘ıın€ah4N'îûnäĝüX½z5xžÇôSżÄ-·ŜŠùóçȑ.ˆ˘ˆşşj0T†n=eU˙ĤÏnX3gÎċ/ˆ{⦅|ò ĴV+‡a˜ U†ËċÂDh===HR`8cccÈÍuB]M£2N´İ˘¨pğŬdıœ7Ö]‡7ŜxĦP,ĞSżÏ>˙|áHwf–—!?/Š"ASU°“XL³³ĥ|è!”––âĊ_Äᇠ˘7ß| 8gċù¸üòËħpáBÚ ²H$›U?÷ÖŻ_§Ó‰9sĉmŞĤĜn™çK‡ ÌÎĉ2;°˜Áhşëh:Ö-!“d;¨˜^²İáfwòlf_6ı‚h—Òé´ıu7%Ċ–Ì˙WƒRkk+µk×.vÛĥmBss³ë_˙:'•J-L$Ġétş˜ĤézAJTUµ)Š"4Íú|>Ŭ&Ċj5lu˙^WŽ³Ó âVšĤ‘““ƒĵĵ<£ueµZárıŒû+Š‚h4:E˜J DsÀeôäC3³âÈ|„8’ĥ 9Ü,Ûn'ûä#ğòEf/‚ `êóùP^^Ž™3g˘¤DßmM†‚İá`d˜iÄ]O“E4U`wb6Ŝ‰Xwf€“dÇCL$199İWĦb:êÚÙÄÖ­[át:át:Áe€’´ÚÚڌ“ŸĵÏfzĴ¤êï³×ë5Z§eee˜;w.–.]ŠàĜ}z^Q~ ü9È+àœ•œ}ŝWpċ7ŻĊöíÛñÉĉ-hiiÁÀBé4òóŭˆ%U|ĝîğPÄ.˙ÚHK"@Q˜][ Š™Ş!İ›W_üâxèĦ‡°ġÓOġôĠÌ<Âf³!Ž ··hœ|9ŭíocvU5***àvğÁ²bħ^}ù%ĵñĈ˜˜˜€ÍfC"%â³Ï>Çqĝʅn·£uuuç¸@–$Y‘ÁÒ ròòpŭ·ż…x"ŠW_˙ĈC@WW^ŝŭïqÍ7£==GÀó<*gƒc9P&í ( KâíY••xèĦ‡pÏ=÷ ıı٘?%“I°4Àgĉ‚˙wo%Wyßyî½ukßĞ÷}UĞ[[k_I ÈfħelÁfì9Ž'É;9ǙäÌ9IüĉÍûÇIˆḿxÇ6v˜blb‚ƒRKhé–Ô›zßŞŞ·Ú—[ġŝqëış]j9ï{ĉ2óGV·şŞĞî}žç·}hnmcff†P(D]ÇhħéœpĜUêjĞ)”ŞXY†ŭè§<úè£\ştÉhżúêĞĵúë×ıëĝ;vŒ .°P]ÍĈN]°¨Ğ{˜g½ĉZ'#Ÿŭ,mmm<öĜcĵóÎ;†ûÌÌ ßúÖ·xé—hiiÁívġzY^^fjjŠmÛĥñ?˙S<où&ŬŬŬlŜĵÙhá‹}^.A¤(Š!ċ÷ûݨ¨0ž#fĴëµç̉sı1Ÿ9€™uñ(Jk8xf8ıĜ+˘RšXÜQn]#’w-7%‘Ü˙oËSzú駕@ àüú׿^ñóŸ˙ĵ{ppĥċċċۀ;sıܽÙlöH*•ÚšÉdê‹Ċ˘×bħX­VĞÜÜÜL}}=ĦPÈh˙ĦĊ”ú˘’nĴÇàĝŭ~6›Í=Œ122bÌ$fff˜ŸŸ7ÚcB½aiy™x"A&›%—Ï!”×4k¤(†4PĦX,! É‰ï E]BGÈıÜn,ŞŠŬá  ÒĜÔÄĥŜ^Ž=ʇ£·ŜÊÁC‡ĜÖÛK}CN—Ğäîİé„Ii­œ½ı2Ó³ċ*(™7z:tĊB›j'—Éñ“g~ÂÈUĴ6İlއ~ça|Š@*"™H’ÍċqĜmX­6‘(ıü5ĦI³ï“¸Çŝ€-Ÿcuu…••eĤ&'¸|ùçÏ½ÏŻ~ġ2İĴ†ŞZ‘$™…p„ùp„œVÄîp#+2Ħ½½½ÜuׇÙà@€\>Ïj,ĈÒÒ RħÀĜÄM£½³M‚x*E DrZŜ˜gÔ74°ħĞ‹+ƒƒ\£ĥ–p8L:“!QÚà{öîŝO~‚­[·R_[Gss}İŭ(1?żÀ7ŝ5^ûġkÔÖÔêډ7KËKŒŒŒâr9illBËçXZÔµÉ쎒z·VÔïw\ğwï&‰rut”ĵ–cvfŽ+—/ÓÑÙIG{;cWGQĴ*6‡›°|è­Òı™/ĵĠĠĠìŬğ—sçÎ199yß&K¤Òz²ŽD¨­­cëĥ^É$ñxœÚŞ }†+IäóšnU(XJ<#I‚p8ÌÛo½Éòòżl&jQXZZâlßÒÉ]]Y]]avvŽÚšZĴ6uMòfžÏ%nĥhimeïŜ½ÈŠÂ0‹KK¸Ünv;‹ÑEfgfĵ2Èà C,FÙ·w/ÇnğĠw=z”.CĞĠj+‹J.—çóÑÖÖFMMqÁĊ@N´ċìv;ĊB"‘`yyyM[ÏÜKÍd2D£Q&&&g~~žċċeéf֍îÊÊJŞĞĞ ĜÖÖVZ[[innĤ…ÎN}–ÓŜŜnxuvvÒÙÙɆ èîîĤğğ› 6ĠĠEWWWÉŞ`½½½ìĜħƒ]ğvħk×.öìÙM7ŬÄÍ7ß̞={ 2n 0Z­&ŒÓi×Y×d>"Û-J}^t*HŸÍHżĠhïFBĴ:HĈép26:ÊOò,3³³e…L>ÇÁ[nb×ΝÜ{ï½<ĝàC4·4a/ħü šž\˜Üĵ äSĠJ}}=ààÁƒ8Ċf³‡y÷wı|ùsóóÊĠM<ž`iy™t&§ú‹ŞjĦĥ†›o™Û?ô!š›Èĉ3¤c b‰ÉD‚áĞ#HŠBC}ñdĞĠ†Çi× ğĤÏ^W_GOw7W\áRIÉZħXX\Z˘ğğ›Ï~ösìŜğ‡%ÚZ[qı(ŠD.›'ôSW[ËüÜ£”kÉK:a†uU‰‘‘#‘$ (qúôi"‘ğvíĈbQızu ğÏë^Ó3ĞvIiíC!Ž=ÊöŜ^²Ù,$“I£ó`ötòz½Üzë­ìŬż—çŸ{ŽÙÙYŽ?Ġ…YİE€~ùË_rùòeŽŬv;ûöíÓg‰™9x Ú ıIĊbÑvĵÑW’•5Êfsżò ŞĵB2[˘  ‰ ²Ïçáp\W-‰ ´gϞ“Żżŝú˙şAéÜısòîŬğ­@À÷íoğéıçž;ş¸¸xg$ı9“ÉÜn·Ûïñz½·Ĝíö™LĤzqqѳşşjËç󊲉_UUEuuġTˆ™#|‹Ñ¨1Ä4;ĤŠ›²şşJ4%‰°²²²fĜ)ƒ˜Ġ´´´ĠĠĊĉ͛ééÑ‹+Ş*İİĤŞşš@0ˆÇëÁċvöxù}kŝ]QYI]}MÔ74P[WGsK M446PßPOMm-•U•CAüŝ€—Û…ĠfCVô֊$KŠErùĠ‚Ĵè‘ĴȨV‹Ş‚¤·s( dY~GôŒUĠzC;ñUJċrGëYLˆ@ċ÷ùQ+?ŝáyċĠWħXĴ,­ĴPU[ËŬ÷Ü£ğĥjêêëĜ½k7ŭĜ}<òÈ#=z+6n ÁP†nkkc† lÛĥC‡qôèQŝË}‘˙ô…ßċO}ŠÛŽçġpi ŸHxŠPŠKÑ(çÎöqöÌ]³Î†˘Ìbt‰èbIRpş\(]$Óá´³mÛNœ8ÁŽ;HĤ’$ÒI"ÑE.^8jµÒÑÚĈêò*² @BACVddIφkëjÙ²y3}§O•’ĠĤ“0=^ ¸Ŭn–‘$‡…ÍŞo­––êêê8}ú4áı9Š ÏƒT”X\ЉD)46vo¤(YˆĊĜĴ6\nGÉèO3xH6›ƒŭ{÷‰Fèż8€Ċjab|’ñħ1vïٍĠáb5#URvp”Ş­ Ïm„}6“Á˘ŞÔÖÔÛÛK?¤SIlv‡Ž&“$fçĉ‘d…M›·è޳ËK( €n,Q,äŻÙ– ĦZôÀ×ÙÑNMu5S“,F£$âq]½C—ÓÍÀ@?££WÙ°q#•5LMÏ`·éFufMÈ5`q_ÙZ­ĞŻçè­GıçŜ{É3TWUĊÈe³¨ ıl·ËĊ‡§{S7ßùö·İİİá–[n)`l:·ĵó ‰Ï>û,Ñh”|ˆĉĉfRİÔbħ˜É‹…uyHFdšûĴ÷˙ U‘¨ŒÊ•Ì\3)X }ĊĴYTI"(e³Y‚Á .wVê0‰óvee%µĵĵÜ·sçΓo½ġÖ˙ZAéôéÓòÖ­[vğŬûä“OV½ôÒK;‡‡‡ïH§ÓħÛí÷Rİ[eYŜét:·¸\zUU½Š˘XY8šË^…B` qìhÀbħàt:Éf³şüz$j”Ôĉ EžĞĞĞkJjQy<***Ĝĥm]]]´··S[[K0ÄápÉdXZZ"‰JŒ HĵFùF‹bq—û$‰Ċ"@ ĉžs9oŞ|Qš3-IbĜİBWXòş­ğk_{û< šu×WU;ïœ<Éß?ġÓÓ³ä ñd’›ßÂÑێ!—}ccğŞ·  **+ééîáè­·rìĜ1Ž?ν÷ŬÇŬ÷Üí·ŬĈ-·ÜÂŭûݨ¨Àéré×PQèééÁn·ëŜ=³³TW†p;í¨Ş•X,ÎĊ‹çyïwX]]ħĦ‡ĊÊÊ*³ós$)\'vĞ•BQ£ˆFm} ıûnöîÛK `jjšsgŜÇas°Ħ½ƒÈRĊ˘‘‘J àzĠTYUĊÖ͛9ŝ<ÔÔÖħĵĵÌ{§NSĥoßN41ÈÂn—M+RÔ4ÚÚÛi¨ŻçÒ@żŜF”dVcqü>?ZĦÈİS§p:lĜ¸™d2ĊâÒĦ`ğ]hêÈÉtBŸċS)Μ=C"žÀíu3==ƒì?x KKËdrYü>ŻËhİ) K‡ĤVXUu5;vì 3=5I.Ż+›Ĝì’İ4ÑĊE*ĞŞĜ¸q#ħxLWĵWĵnEĴŭċ²™,ŠEW¸/‹tmÜH(¤ŻŻŻT]¨ĜĴV²ı<6Ѝñ‰ ‡FhhlĤİı…hxI’ûŭëúe•÷é^SúÚtğŬ|èŽ;ùȇ?ÌÔÔF%î÷ûı÷Ŝ{ݨĴàĠW_eïŜ½tttĴ!ܚ­#̰ìh4ÊOúSÜn7ŸùÌ#kTIÄLéZ +Ĵۖ+xċ–è×Z kPÁċAk=³Âġ|D‡I˙ĊLLŒEúNÓċċċÔÊÊJßĥmÛN÷Ŝ{˙ŝƒÒéÓ§ċ.Guuµ÷ğßŭnË/ż|óààà]ù|ŝv‡ñĞĠú!UUwÚlĥ›Íĉ³Z­N›ÍfSEí(hBĦ~żß8­ŞŞ28â€6ËìX,:4SXú:Ž5ĠùN†4½Í†ßï§ĤĤ†ĤĤ&šššµ‰Ê •Ùl–D"Çë1Ş/A 4Ï<ħVuĊpf93 Öl!>£9(ŭòÒĈ+w£5Ȱ&ÁTÁ0ï$Yù-I^ÓğQ‹Żĵmg¸êÚlô÷_âżġżsúÔ)ĵ^³ós4µ´éG>ƒ/ ¨it´µSY)J’áĉ*Ë2ùH¤X,£Ĵ(%[‰’b@i~—Ëê\oo/Ċb‘+W\YÔıH6;N‡ Ġbcey™ÁÁ+œ:ŬG*›Çrát:X\Zdyy‘lVĞŞ’ÑòXd™êšZş‰cGQÈĉ9sşbNò$j—£)hÈëRWß@Ks3ûû¸t‰úúzòy‘ÑQ …{wï1Ô<ìv;ËĝÜşş¨ qĉÌY˘Ñ(v§X,N6“!Éßß’ĥĥV ˆE‘ üȲD.›! óÏü„Gŭ+ž}öYVc1ÜnÉD’•X ŻÇËŝƒ· iy‚Ħuµ58V„° ,IH’‚VŞ>Rɤ~QYÉ=÷ÜCÀï£P,ù4İVdĊÂôäSStttP[ßÀòÒ"ı\ŻÛÓa7ZYQ×´Ù$I˘kFš››y˙ŭ÷Y^Œ’Íċuú‚Ĵ X,ÌÍ/0;;GUm~Ŭĥ žšyÎ$֑-ÚVVĞŠEd‹…ĝÉOxï½÷ô™biŽvçw’Ée˜˜˜`ß}¸JÉO6›5öJbäóyĤ§§yŝùçimmċŝO|Ò'ˆŭo&ĵj%b÷ ƒRY02·ßÌAİÜwÉ<_ş‘Ĥx?fJ‰p8^l^Ż×‰3(›Í²ĵĵœZ]]íÛĥmÛÉżAéÍ7ߔUUu˙ûßozñĊoıxñâñD"q§,Ë÷ş\[UUŬQ(Z ‹ĊâPUU1ĉĉ BQK¨\;N52~Ċ‚EQ°Ş*.§“bĦÈÄĝ³3³Ĝm6ŠšVO•ŒŻŞĊbü;WÈd³D£TVUÑŬÓM Àċv!Éz†(€ ŠĊ‚jU‘ŬżÈátVñïM,<ħIÄTĞ•ÉÙ)Ü^/Ÿ~äĥlŬBħXdSg ġ5X™LZŻ,˙ċ_^âäÉw¸redÁÂÄìó‘(İtF7°“ ÉèıIJı,V›•\^oÓnëíĊf·óÎ{§‰'“Ĝ½ġ)İĴRrÌÏNÑŝW.ĦZš›°YíLO/‰ârqğ\‘)˘_—Peˆc·akïfVSKxŬ!ĥlÚJe¨ ‹""ħE­€$C>—§­–ĉfΜ:ĊÄĜUêŞ*I­Ò˙ŝY ğöìee%A8²LMUVµtŻ%ÎMÔÔÖqöŭsĴÄ ‚m]m-ğİ‰aTÈĤlŬ܃t_{ġ5ôg˙'?ŝя™œœÔ; ’Ž‹Ċu5‰ÖÖVĥïèĤĥ&DgG !żpBBĤPY˗dˆô@Z”˘H*£­­ƒÎŽlV+ShÙ V‹ÌüÔcWĜç •Ħ*—–H$’8Ŭ\Nı|Ù˘kĉ!Y"•ÖÛ\MÍM4·4söì9˘Ñ¨‘ Y- vUafrŒĦ tmÚA XMtiYR}´"²,éü+YşzmöÒJ­˙³gy˙ŭs_HÓ4ĥoߎŞ(ÄVWıé!´TŞÈ“ɤŜ&/ugÄŝ…B|÷ğßċÒK<üttt{Ö,d&żçċ$Z>wÈœXg2Y£4S=Ê-gÄÏËU_D’-ş=BH:€04:xħXŒp8œÒ4­ŻĞĞëäùóç? t$üìÙ³òɓ'íO>ùdŬK/½´?NïĞŞŞÚi·Û›,‹CÓ4'`QEÙş@"0–Í$.³³˘h ™R—iÇ’É$SSSĴĴĴzvĉòڜ9 IµPWWGccc‰ĵç6ÜbGh=ŽNyġ%~ϜєëșažR)ŞĦrQÒò6£x3Ú§ü5o„Ž3£„ÊċHÖSk0u:,//  sxĞĠn8ÚVVV#I'ßz‡§Ÿ~š·Ŝz‹ıı9Ŭı4ĵ€×ç‘ÏŝıIV¨ĴĴ4ŞÑD"ÁÏ~ös~ĝ288L²”‘‡êZxàĜÑF:™ ŸÍÜԀËċ ŸÍ![£zAŝûô§?ÍRt‘ï|ç;,..ê„ÏR– ħÙlƇ‡ùηÍéÓ}?~œğv‘ÏçyóÍ7iii˘ĥĥ–ÊJ?ÉT—ÎΝ;ÙÖğ…ĊĊ••Ò_"™LĦ*2V›B^˘Şhùĝ;¤â Ŝ}÷]ì߃ÍèmÀ";v ÇcĝĝˆuĦPàÒKÔ××cw8xŝıçxôÑGéïï§ĤÔY­î\.gÈ577ÓŜÚFEEĦRûQ´|_ àÊÀ£££LNN‡Y]]eff†……²Ùĵá$[>Ÿ§ÓÉO|q>˙ùÏÓÒÜÈÊÊ—.]Âħm+‹ĵ–GUİĞZ†ĜÏwŬuİDšżĝ‹ż`bb—ËE4Ċċráóùçݧžâ _ĝmÍMLNNb³Yİ­İÒô‚vCaRsöœŞ› IDATpß}÷ñ?ŝáY†o·Ç9yò$VëM´ĥĥêk?“7‚’×Ğ˓K-0ÑĦˆÇ\ĵxĞĠÊÑ£GŻsz-GוWGëUEżMy˘ü|2ŸuċBĞċ->qŽˆë-Z›‚2b&ԚÏO!%΀w<ŭ×Užx≊öööŬŠ˘VUġf·ÛŬ*I’×jµZ …‚lž3˜=s̸z1P9|Y\lÑÚ7I(I (÷ÂÂ…BÁFš3ñüt:ŞŞƒA:6vQSS³•'ž'n’ızÁSÜl³$‡ù÷D#>—ı­fF‰–ÛZ<Évâ:ˆ×XŻeöoÁµ˙­À´ÏHülee…`0h´H„b²Vñûd³YdYĉ—żü%Ï?˙<çÏ_dhhHïS'S,­,³uK/˙ÄŭlŬşI–İŻŻ£§{ zpNR<ŝĝĵġÖ[Àµ6ËĝÔ‹‘ŝà~MŬ= aħXhokÁb2Á3kĝ PŒĠjċ˙äOˆĊbüà? ëA%o½5ĦàxY]‰óÚĞŻpġêUîûnöìÛGCCSSşĈ[2Ġ@S}N‡“bħä X¨Ġ"sùò áp˜ŽŽü~?‡í\ÙbáĜí·3;;Ë×ö5fĤĤħÛí,Żòú+ż˘­İ™Ŭğö²şşÊĊ~ş7wé­Ċ"§“C‡é›O½ö™“‰[ĥn`âĵġĉ›†˜jmm­Q9ċr9štvvrüĝqĥoÙŞ~—˜˜˜`dd„ééiĉĉĉˆD"D" ÌÏÏÖÂĵRh½Ċb cž+$°Ä½ƒĵŭĈŻİĝä'ï§ĥĥ–ııYT+Ûĥm1²ĉ*@(ħ>~˙ ˘Ñ(?ŝ8“““ÔÖÖ²şşJ$ĦşŞš ïŸċİ'É˙ñŸŸšš.^ĵˆÓı‡@À‹\ۑŒ$Iôôôя~”§žzʨ.Ŝx |>Ÿŝô§½ìt:I”t Ċy%ôŝ‚Á —/_ĉêĠĞ3+W•X£sĝïĦ}÷êĞŻ*ögVÛÑÑqω'>ŭĈoğxñbĞÏçó¤Ói%ŸÏKb3-¸ġ$f<½Z\(H$ĈÁ/wĉC?•ÔQ! „a£œ(-Ÿ7ôŬÄĦÇ vvM]n·{#xOBĴÑüŜÌvá"•ë™ġ§D ÎìŝjV 6ÓEI^ï,_Àëé̙ŻŬúniy‘ô[‘wşıĠĝ[Ç¸/.—‹L&żüËż˙9ûğżûß˙>çÎ]`bb‚X,V(ÒÓ³‰ğî:Î=÷ŬK{{;•••lêŜHKSZ€"cÌGGŻên.÷È÷ÂÌ 33³´··S]SC4A’ż_6ż÷òM·eófl6ïż˙AH˙g³ÙÉf28]*+ŞHÄĵûŜ{LŒû¨­ĞCÓ4ĤgĤ‰­Ĵàġy°Ş–R+Fosċ²Y~ô¸xħÇC<Çîpàñztc=Ġ˘ d™M›7£Z,ôé#›Ëás{HĴĸxáU5Ġtvv²ÓrXĞŜRRfñT­VòıŠEWÌ^^Zâßĝ/żü2ú2 UĞ­$4Ĵ·eœN'ß˙ηùáÓOó½ï~—Ÿ<ó^úċKĵsò$çŜ?Ç@˙#cc,„#D—HĤÒȊ›ŬA0TASs şş¨İ­EµZIĤRÄâqŠ%Ò­îfáÜûgˆĊblŜ´‰Š`ˆb„ĵV TY‰j2Ñ\dê˘ZŜµ{~Ÿ—~ĉ …‚¸\N–——°XĴLOM²ÒŬӍÏçgnnÇ‡ċ@N/ïz „x´47Ó××ÇèÈ~żŸ…… ÈŬwßMMM ñd˜ §ÓicAÛŞŞ*ž~úiŜ}÷]ĝĊ/â÷ûÉfsëžyf…rÒëÚ*ézTŜšJGµi˙›ğN"Ù/·ĥ0w‹„Ùe6›]ŽÇÙ°èׯ†HI’ô~UUĠğ/żüròë_˙ú”Ν;'}éK_ -,,Üŭ•Ż|ċ3n·{ûSO=L&“‘Ġ‹ŠF̂ÌD ÍjÔĉ2S”ˆ"˜,//3::ÊÌ̌áUd³ÙPd½d‡Ĉ‹PUUcS–Ğâ îP*“6ŝžyè'T¸Ë­żGT6ċ<ĉ_´Šß7—éha.‹Ċû+'ğ­'[_> *·P^Żjú·sëY_„úÓíĊGFFĝó?˙sž|òIž˙ÇçyçŬwı|é2éŒ~Ï<^?·>Ìá[òñßÏî={èêÒ+ÒööVĵ^7ılĞj16á`˖­ĴĴĴöÛ'ݵârşŒÍĝĠQfçĉéééÁíñ°Ž`Qmú 6oĈ›ĥ|.‡Çëµµ•%I§ÓĜl6‰„>{(—ĵ–CUġá÷ĝħOŸ&—ÏSWW‡ĠŞ’ˆĊp8í¸œŽÒŭÔïÇ3Ïüˆ/ŭٗè ğğ›ŬÉêj —ǏË=µӗe…7êİŻ-“Bµİ,/Ż2==MccU5ĠD—"Tƒĵ~rÙ,ZIò%2==ÍìÌ KKKĈĦaw8Èe³|ík_caa—Ë‹‚–œšĤĦt^žÛ%›Írŝüyf&' Ád2ıĈĊçóQ[_ÇöíÛÙ};GŽáûîcû<òŸûÜç¸çž{ĝèG?ÊG>òCí~~~žh4Š×ëĊçġ³²ĵÌ0ılŽîžnNÑH”bŞ+Cה$J÷ÎÌ;̕Ö\{{;vğĞWŻ2;;kì)ĞĠ†,K ‘ÎdèééY&]$ŞÄi"Ĝ×!0WRŝ’ä{ïkˆ/--R[[Kgg'6‡Ŭ Ï+ĵ^/³³³üŬßŭ]]]<ü:)µP\7™“ÌġÖµ}[ĵa@ÓQ‘êucƒòÏu£ĥĦĜï˘'ĝJ‰D‚d2iĴs1P,Ċ˙ç …Â¤Ïç;{ìĜħĊ§žzŞĝP(äĝŜ÷·÷áßsÏ=ğĈĈĈÜ/ĝ˘,QÂğ\5Òç˘äAÂ| €ùPwğurÜÊʊĦîÜĜĜˆßï§P([éÙĴ!3$¨BĦ€ÔŽ2C™LÇCooŻÎo(ŭMQÍ pQ™KVs7HîÌYŒ9P˜­.ʑĉö˘Y½×üz7‚k›Û€fğqñ(w‰]ŻÍw£jÉôĴêµvi"‘Àívc·Û9ŝ<Żĵò §E֝_µBt6ÇŝCùO˙é÷Ùcn·×G×Ĉ.jŞC€n1]R³1’İèa† ,,„%c³ŞÈ²„Ġfglt”Ht‘žÍ›+ˆDqÙuğyq]Ċ½ıĤîĦUŜÎ;°X,LLL°´´¤ÚÙĴ.ħS,P,ħ¨ ılžĠ•rùWÇĈéêê˘­­•Úêjpğt”]^ËñO?ŭ)_ŝĞż&^`br’ùp„î͛q:Ŭē)‚ŞĠZBäÉ%ÂĥŽÎNòšĈ…‹ïëV^/SŒOŒÑ³q#=6b³Zı<ÏóÏ?ÏO<ÁO<Áwżû]~üó˙ĝĵ üĝÇ?ĉäɓ,//÷û9{ö,הMJU¸MJsĵħN•UUttv²k÷.Ž=ÊŬ÷ܧ?ó>˙ğżËï˙ç?ä?Ċ]Ç?­ǎħk÷.:7tQW_gp\n7`-[·pǝw°Ħksós ‘M$İ…Èĉrœ;Ž|^£½£_ ÈüÂrşĵT L#Öé55~ÈçsĜ6vîÚÁ޽X­*éL §Ëj'‘J`³ÚıpññD‚í;v )R™,ŻkÍ^0%qò>Z7R,ĝċ/Yâ=ċ¸|ù2MMMlŜ²ĊH^…µZꖄB!žzê)Ŝ|óMĝĊ/R___:ÈߪkW|(œ‚d|cÏġyLċŻo†›ċşÄĴQžt:ÍòòòšsEœWâù%tž”Ëċ n·{ôĜħc£ßûŜ÷rhPz7ä'Ÿ|²i~~ŝÄΝ;Ŭ|óÍA‹Ċ˘ôġġ155e¸5Š…o>ÌE+Á<Ü/?PE•%l"kkjj˘ĞĞ‹ÚÚZÒé4³³³„ÂF‹o½jL1ħ´ÍsİÖÖV½Ò2ÁËÌîv:×ĦYÊĞ3É\ÌŭZób0s+ÏÌ/ Ġl+~£jĴĵ­(Z‚‚A^ž™•ónä2+„F 0fL;wîdaa‹—ġ@n³‘ÍidrY"$Ó)ĥlÙB<žBQ,(²Œ×ÁŞê½í\6ƒĊ"#I²ÉI.½ö.Μ9£Ïd]?Ï˘ÈĜ솆†I¤ÒlíŬA6—g%:ohŠy 9X ݝ´êċM7ħmëV<ŬR à÷û‘%ùċ5²ı ùĵ†×£#wîÜISsġuµĝ|^$`qq‘×~ŭ*ġ˙ßÌÎÌPU]ƒŞÚJ:g³~€e3 ]ÑAQPJ×6ŸËárğÙż?gÎ÷161N §ÓĊèÈ(‘ùĉggù‡gžáÉż’7Ŝxƒ+W°²²bT‰Dçµ×^cllL £x<:@¨Ôm¨ĴĴ¤g“xèMÜyç<À|îóŸ?~ŝó<òÙÏrïG?Ê-GŽğc MBA&'§ĝĊ/^ä׿ŝ5gϞ%‰âñx(!•Jc·ÛŒŭ%ö‡ ˜ŻĴĴ036N&›ép°3zġ*ŠĊJSS+‡“ùÙIl6Á`pm….@<ÙPAÓ¨ĞĞöÛo§³³“••ĤĈ'ôbB†L&ÇċĦ!rZîM¤RiŠı”Ħ=¸Ŝ|Éìû%ŞëŽĥ6†‡‡™ššBQdfggÉd2ÔÖ×ÑÔÔtX* 299ÉOĉŞĈ ë– dYGHš_yÌgım'Î!óèD`Äl,•JQWWGUU‹‹‹×JëOÊçóŠá9vìĜÙŭèGİ4(µ··;_|ñĊcvğŭ^Ż·íğî²F£Q–——‘e™ÑÑÑ5 AÀ Ò.‘HBá5òÛ¤6„´]†yáp-Ż'Nx^4ÓŻk·ÛI$†k”] ô–5gŠn0{4‰ jîïšMçč7ô™MµÌ Fóż×kCˆ`%f\fĝ§¨ÖĞş~›tږŸ„Ç16à EúÎ1>9AĦXÄátĦ¨–˘‹ —tĠöî;D2geeŻÇÇD*‚Ċ*SÌċ‘J×Joċʆ[ìĤM›ġĦñèŞUoÓhZœĤ1<<ÂìüD•4"‘ˆĝ¤1ôÍċQ­VTrA­ŻŻçáÜ˙‰OàC°‰röìY’İ…B‘……üŝ'NœàŽğî˘İ݉†Ĉ‚~/İd‚×^{?ù“?faj‡ËEĦĠŠjµóŝ™³ĴÄâì;pˆĜê"ÙLżßo´“-ê5ĠŬ÷}˜Ċ•eĈĈ&ÈĤsĜU+s3³ĵ÷öI&FGÉ5£%mĉɉ5mĉË\|Ù84DĉĞšÀ ÁPàè­Çèèè ˘˘‚êş*ĝ[‚ĠëlY×m,h|ċŻżÂ_ŝċ_ò³ŸŭŒ—^z‰ŝŝ~c¨óul8Î5É@>Ÿ§ĥĥ–[o½•áKW$—ÏY]qîÂĴV;vïB.ĉ §gÁZkw_04ÇÇÇyċ•WxìħÇxìħÇ8uêZNCµİ䵊E%“Ë1péıĵĈ-G375f(u‹÷VŜ=I$0.‡}{÷rúôiFF† …Bô÷÷]Zdß}ĜívÒé´!O¤Ş*ßûŜ÷8uêĝ‡H{{ğqĜ ż£rġ³ĥŬd„ô˙—nĜş+QğÖ$û☘ÍÀs*’Vsg+NS,Ùĵy3---\ĵxq´¨,³ÙĴ¤iZFUĠó·ß~ûğÏ<óÌ W‚Á ghhèN—ËuÛÊÒ²·kİĥŽıÙYöîÙËŻ_û5N‡S'ɒу]ZZ2ĉ>ŞŞnŞfu!wt“,ğƒbĦÀb4ÊÄĝÓSÓ¤’)ì6;AżŜsWd]‰X.9]ZĊPBÛe22•Jħ²²‚Ċb! ávıQd…\6Ğ“é$ıÄgRġÏP’BħÛl8ìvĴŞU—˙(‰ĤšµĉÌúY½b&ĝ '™}‘Ö›ïĴ§–°Fk¨Aħ€,ĠŞb·YħŞ–RkĴ@&“]3§şÒ!ÀbĥrŭC•ƒöbYkàĤ[ná½Ó§›C–Áçq#KERħU&F†ħÚìlÙĵ‰L&ĊÜì,>—ˉ$É‹ş5·,+(ŠĊ´qÀï÷ħcÇvŜ|ë$ÓÓ3úĉҊ8ív¤B‘ÑÁ+Xe‰û]‰“ËkxŭlVEŬĤ]Ò…P’Ö™ÀP¤$~[(ìÓ?áoŝĉoġ À`>!—Ó¸÷'ĝÄL:j‘Y]Yáŝèè?w_ ‹j£P(R4^RQc|dXt}ûŽ[M‘ˆ§¨ŞFħȤ3i,­˜E‘l9|”½ğ÷P RS]AmMÁŠĦ`›ÓÇĦħħ‘úÚZêjku+L IQÑ´Š˘·?‰$…Bħt=Ħ˜.èpud&§§ù‡g˙#WGqı]d´<“31**ĞħÙ€"iúġCB)@jy•“oż…T”¨­­eàÒWÇ&hjjĈpurŸ?„ŬaC– Hh y¤˘ŒUħħ˙–ŭ Ž182H*™ÄçuSÈç2€”ϲqÇ>29ˆ,.ryt2Vԅ[‹ É9~ó›_óôÓOóĝßà‡?ü—Ë°Û(Ş…T:Ċ˘Óò(2d’IĤ&ĈpÙĴlۋpd‰|ĦHE(¨ #—ÔÊ5Mç^IdħPO–Qm6ĥlÛJ_ßYŽި¤ż€Ċenżív(êl.ÀG__>ú(÷Ŝ{/ûĜnj³E´LÍÁ \\Ótİ!]Ż`<Ä÷ċšufÒĞ^½×A˜ƒŸ'7ϸ5M[£äÍfİĞĞñ0<ûÁŞŞ*g8>äñxvŻ,/ğFGGéîîfbb‚/|á ŒóöÛoSUU…$ˆ·ˆ°Ċv8ĈEèü‘ñOÜÏ]wÜÁž½{9q˙ŭÜzë­´´´`Q2fÙĵfpë=˘X,‹Ċ°X,ÔÖÔqôèQšš›˜›áppöìĈÇÇÙ²y3>_pxÊÊ 6U%›Í`QÔRKLĦµ…ŠŠ Îĵ†é™Yš[Z"S[SC]]3WŻŽà÷y¸]hZ‹Eß·’"át9èŬĥóçÏ355M"‘Àċr³şŞÛx46·P ÒPWKUE‡Ŭ†Ċ"ž_àŸößŝöwĝû§Ċ/ù2ápĞjGӊ$“i@"“IĤœqÑĈ·Ù‰ĊbŒŒŒPW_OMM ı\UħâġşÑ´…BħÔ>–Öì13šĥ²²’Ĉ†FŜ{ï=fff¨ĴĴäêĠĞ,//³wï^ü~?ñDŒ/~Q·œ˙ìg?K 0*ĞĠjʃĈµï‹×Ñ^Öì½p“ +­pÈ|Fˆ³¨|‹s*N•’hcĈb1ü~?MMMœ9s›ÍfÏ8`8(äóù”Ĥi}‡:ùÏ˙üÏlPjhhp^½zu.—Ûi·ÙšĤqĉÌEác'Nàġx8uê”nì°sá˜*Ê̕•#B ΎÙċ537;k$Ün7 ´··ë "ga~„˘’×mĊ×ĉĉfvî܉ĠjerrÒh=‰Lcdt”H$b6‡ħĈ-ÖÜżcaEŞ*Żw£h‰ıŽfà„hó™}Ì}Ûò °^0ıö³µ|sß8ŸÏÒöëAÂEP[™·ž Ċz(›ĠNmm-uuuĵùĉ›¤R)#Ħ(‹ÌÏ/0??Gcc#MMMD£Qbñŝ@›]E)[ „¸v7vávë~6ÑĊĠU5hš`HRŒŽÒܤŸWWW°ÈB!³ÑoċjeS)~ġÊĞ8NÒYòüñOÜOC]²˘àó¸qğXJ$ŬD"Ġf5Lg§ukûĊĊEBĦAŝ€ž“ïžÂn·aQe˘Ñóóóh…<>ŸW?ü ½<½’+h(py½Ô××ñĞ×^ċ?˙/ĵ/˙êWŒ cµÙ¨Ĵ¨­Ün’%ŜŒH¤BĦÛ·oçá|ò“ŸâÁ‡ä…^`pxˆP‰§^Xàü…ólÚ´ U•"n·‡ŬIAӉÀ2ŠĠÂÖŜíDa ^!Êàġybii‰n\.;‰D I*ëĵ­ĵĤÛµg³i**+Ùĵy3—.].íAP(ÄBx–ĉfíßĤžĵnĈ^ċÉo>Îßü÷Żòü?=ÇÉwN‘JċpıO?²,§€œüĊ/~ñÁÚÚZçÂÂÂŝìü˙òÇÎ'Nò'›6mBÓ4~›×4ѵ$äÇÂÂÑh”ùùyYZZB’$c8ğĵĵÌòò2ħ’rŻ×ëİ݉ĉĉf***$‰ÙÙY=kYZÂï÷óù0#˙DUÖÒֆÏïÇċv#+ ñD‚x"EUq—J“É$sssLMM199ÉÌÌ ĉ™p_E¨§R)FFG [ ³‰žY‘á’Hı|6+‹Ŝ9€ÁLğž—$]‡Ĝ3/Naŭp£'žż~Àğ1ÏÉäMA,cëĥmx=Ŝzë-ŬşÛW•‰‰qĉĉÙĜ­[˜ >™ċÁnµĴA[™ñwìĜN$ĉ̙³d³£úñù|DÂaĈÇ'hkmµ…èÒ"…|×b‘oH³ÀΎTğ•W_{•l P148„D‘†Ĉ"‹‹HЧax İĤ––fzz6!É2Ó33ÌÎÍé‡ħĊ˘·u%‰x<Á™3}œzï]ffĤÈf³475ÑÔĜLħ„È“Mï/“ÍóÒK˙Êûo_ċoû;~ôgxŭß°´ĵBMu-Ç?üz·öŽDY^Y%_„……0^ŻÍ[ĥ²˙ÀAŽŬv;7Ŭ| ;wîbûŽmTUWñƒŝ€ññ14-ßçE+䙚šdiq‰îî (’D*™˘şĤYĥf…BI–Ĝğw?“““ ôCŞŞĞ¸xá<ħĠ½Ûĥ˘Ş2Ñh´ÄrbQ”^_7Ġ55TWUsöìYĉĉô$ÓëñrâcwsÓŝ} \<ϗ˙êQùĝ7xŭġ× ‡çÉçsĜÉñD’ÚÚ:ş…#GrëħcÜvûíÜsÏqΝ;ÇÈÈ’Ĵ]RéLİb²19>Ġf£gS…Ò żĦĦI‚l6o$â@.÷/ʤÒônߎ–ÏsòäI£%˙Î;ïpîÜ9ΜíĦ‡âĥÛn3,ÒÍ^N…⍒Ĝ@7 (ċdÚr`„Ĝß7qĠ4m*ƒY P|Ît:mĵ„İßÌÌ CCCLNN’H$‡8N2™ UUU9r„W^y…D"‘RïàÁƒ'_|ñĊ6(µĥĥ:zzzv~ġĞ_ŬuèàAg×ĈÒö;èêêÂġ˘ċunI?‘’,ˆîŭ2ËÌÌ +++Ĉ@­\îC8½:N***hkm£ĦĦ‡ĦWF LLLègI×Np„ġ„8<ƒÁ uġġ†° ^ŠÇ†Lğ€‘ eïĊĊEĤ§§588ÈĠĞW™ššb||œË—/sáÂ.^ĵÈÀÀÉTY– †Ğı}&ƒılF䉙’¨ĤʅUoT%ÁI^Qg˜úIò ‰³ċ*àż- ­ç6[,)ô@œÏçÙµkétšwß}׀à[›UeäêUVVVĜşu+@ˆèâÙ|žŞßxïëħûĦHìÜı“EŜ~û$‹‚Ëé&‘Hàt9™ž"ĵĤk£Nž\Gpı=xĵnSġUžmêom[{ı:>ĈĜĜUòyİÉ &§ĤħİVššSL‡k IDAT›uĝĤ ”ŜĞñşùŬ]ğ¨İİaiiÉ0s÷²­½}û÷râÄÇĝÔ§>ĊÑ£‡inn.­“bİeRäÜıóüŭß‹/ùË<ŭ£ròŬwAµZ9tèŝ‡yä?üN|ì§Ïôñâ/~A ÀpóÍ7süĝq:āèîî6¸5Y‘h¨oàÒKD"3ĝĵ^.\ĵ€ŞXhni%Ÿ×(hPQ¤PÀ˜K¨V•½{örñâEFGG°ŞVœ'ŭÈ2lŜ²EQ‰F£Ĝìú,O\Ğl&C[k;ĦPˆ3„#aĥlŜBg[3Ï<ócùÍ'¸xñ"‰D˘Ÿï;pàÀɗ_~ùƒ JŸùÌgä;ò–[n陚œĴJ$ŠŠK§R‹EŞŞŞH&“ \0€şVÖ5­$Ħ˘-vğŻ×K]]ġġġò9]fjjʨ¨2™ ñxœbħHGÉ|ee…ùùù5(³úúz*Şġı–$KĜBCAlvŠEaeùZ 3Eġ’JŒ£ġf²²’ÖÖVÚÛÛimkħħ‘ŞŞŞRe Ĵ Ġ6‹´dĵ6cˆ<³Óz)ĉM¤ZÖVPċ°ï˙™ d˜–˙ÜĜÒµ–İ˘(‡ÇëĦw{/‡ĉÀÁƒşé&N|üüî~—G>ŭi>~âc:xĤĈü>Ÿ.d›É°0?ÏŸ~†żŭ›żċ›ß|‚×ŭûH¤ÓtoÚÄá#GyĝĦ‡9vì6şğ{Ĝ·għx‚o|ŭD9pwÜu'û £³·Çƒ×ç+‰™6`³Ğ[ƒÍ-ͤS).\8O2a·Ħċs@KXd•îîMhZt.O ä/U:E²Ù4‹Šé wÛv.ġ÷3xċ2Ħ@I.042Œ,)tvnD–Vâ1œn—Ž Ìe‘„~”Ĝĵe aff†X,ĈûgÏ0<<˘“ìŬ^Ré ‰tÏOGg7˙ĝ§8~üônï% áġ{¨­ĞĤµ…ÊŞJ ù•UU466rħ€K—.ĦŞV£Unw8X]^fyu…Í›6 ‰ÇVİĞĞbQ֕Üh<ħcħv‡‹˘ßßÏ‚1³^­‹ĊhnnĈï÷•ǵvœ´Ž’ùû냒ı/ŻcYn~­B‘ĥŝÌèŬò¤R$ΙL†İİ) ‚ĴĠ“Óé4d‡–––pı\lÛĥS§NfggûvïŜ}ò7żùÍ”úĠŻÜnwöıçžë|êÉ'7œ9sĈÖÑсÇíĈîp •Zh555\ğÊĝĝ8ĞĞĞFö!f"UVVRUUEUU555x<Òé4‹‹‹Œ³²²bûy<öh³Ù8°?Vе$m3*UUK,lÇ´ŠÓé¤ĤĤ†úúz]„µşš`0ˆÓé4‚‡Ïç# âġzİŻŻ§ž.vîÜÉŜ½{Ù²e‹áüZW_o ĥlÒlĤgĥÔ0g)â÷̕“yĜjÖĴş‘ĝŝ-ˆ·ĵnp1ϔŝżÀ׳¨(‹¨ĞQéĉóy\n7ğví˘ŻŻp8ŒE‚BĦˆÛeqi™éı96voĤ½ƒT*M&Ħ‹½ ‘òĴ$éÉK2™¤ĤĤ–ĤĤ&.\¸Èèè(6›~°:NdIfxxĠj£½½“d&K*“ÁçÒİ ċÄI#@QD+hĝ|>ŝ###ÌLÍ ‰F˘ô_˘óÖ…\.Ğ3è%PU+U'§Šl[¸!÷ôôÖÖF(Âé´aQ$E"›É266ĈÛożÍSO}‹żĝ‹˙‹^ĝ9ŭŭŭÄâqT›•M›6ñàCñàCħwï^jŞŞD­İħ–T*ɓ' ïÌY.]şL2™˘ĤĤĤdx§ĝJIƒ¤+§Ë ½Û{Y]YáüısdÓ\NNƒB„ÑÑ1Ş+kİİ'•Éàö¸p8HèUKħ¨ĦŠ m-mœ˙œ.çw_séò ~_€–Övbñ8Š*QYQE1+Îë-Á]ğv‹Ċ8sĉ İLYVÉ ,„#xŭAn>r+Çïû?ù)j*+ x}n::ÚèêÚ@0èÇîPQ=™Ëf2´ĥµátştÀM8r 0 ˨V+ó ó476ÑÖֆ,KÔÔԔ×ڄOĤÒ,Ž088È7żùMCOˆ’ş\.‘ĈĈĈ¨İİĦğğÛ8셕x>Żŭ֙RĦ ­ë•d=üĥJ+Ÿ×֕'2{³•‹µ–˘ Ӎ7ÒÑÑAKK ~żżÄG+™ƒŻ‡Ùşu+ŞŞĤΟ?ß·iÓĤÜSIùÓ?ŭSΞ=+˙ċ_ŝċĥ\6Ûëġz/ĵwÜqβNHıXmV\ıbÜ$I’pğŬx½^ŞŞŞûŭTTTéİTŠ™™Ĥ§§YYY!Pò7êììÄét2<<́@€}ûöQ]"x ½\ÁWjooÇċq£( .—îS#…ÇQKs3†-ù† èééaÛĥmlŜĵ™îînZZZ¨Ĉív_'Šš,™_™ƒÈ@„hyĈdċ³ ë$DÊ`Üë͚nTĵÊżY)­']´/k]È"7*ŸÏ“Nƒlߝ矞d<†ĠĤ‹ÇI$Ò+*Ĝĵy+mí$Ó)‚ġġġFÛӌ Ô˙žîLĞÓ Š466á÷ûxûm]ĊÀçĠ³k›Í’Ä•Á!\nğöìÑ sI`cF6] °šÑFkkmĦ˘˘’Ó§NħşçóO9uò$Ğñ8^Żžiù\É|R)Áï×GF&“IbĞKÌÌLóúëoŬï}‡oŭŭ·K êo—¤lì´´´Ħ}ˆÏŭÇ˙ȉOÜOsK‹ÎÍ ĝÙÙIks ĠĠ!òüTĠĈİ÷Ŝ#“×4ŽŽrîüyĵ^/ Äq@&ôQ(‘YôVŻÌ½ûĵr…+—/“Ïd‘äĠ5µ„–Ħğğ‡Úú&&ÇİŞĞĈ˘èVúşĠïO]M 5Ġ5ĵŭ›7Y‰- …ȤsŒOSW_OcS#‘hT¨ô( H%NMħP@ħ(:t\6Ç@˙ħD’|^ce5Ncs ŝÎlßı›d&ƒÛfgCWídòZE–(sóE]1#ŸgËÖ-x½>^ûġë$“IŬ"CUU’ñMMMlÙ²—S€™Ü×)x‹u144ċ/ÈûÊWxêݧĝÍo~C,3’H‘°~â÷ó{ż÷{úëş\k@[šĤQXè`2š–żnvt£ Tî•\‡[OÌU'1·6ƒİ¨A(;ß$!=$ĉR"1tı\ÌÏϳ´´ÄħcÇRożŭv_KKËîݤ<öĜcüÁüŭĊ_Ü;pi`‡?àwŞV•–Ö::;Œv™bÑ%Ŝá0W\1"ĞŞŞŭżÄ½gt\çyĥ{í2½½…¨$‚)‘b%JVħċÈVÜKHvlG'.ŠŽÔ³dlj‹Ntd­¸$ĤcYĥe[TÌ&°£ƒˆŜ1ÌÓÛùħgon€ üĥħıˆÁ`Ï.ïó>÷s—ĵ<òòò0 $ BĦĦPˆ@ @4ĊívSYYIiI)ùùù$“Işğğ5µz]]>Ÿ•H˜ċPˆĊ@@ĞIrn1/--Ċíġ*ZıĴ*ùUvT<‘ ‹ĊȒĊh2ċ’0-FYE$YRvĈCN³£üż Ï雪IO WżŻZzè…zÌx½ $’놲H˘€Á #ŠÙLšD2ƒ“d_Vp-DIÖ,vŜÊıA ğ1;/—?•Y§sPÏ£Ĉ(”ZT„ê!hw8˜žžĉȑ#,‡Â¤ÒYËËxĵy<ôïäîCwaµ‰ĊDĞħ ‹Ì f“AȐ%•S³ĞıO˘…TWWġzxċ•— ­Ĵbħ˜É’Á(‰EÂÌÏLásğĜÖÔÀ̂ŸLV¤ 0QHċ´,Š‘k†TRéö’É555H²ÄÉS'ȒÁa³‘ɤş6ÈĊ cjjšÉé9Œ312ÉÜÌ<““SŒŽŒÒ×ÛċË9}úM^}ċ?ùï<÷ó³Ÿü”³g;­„%#‰t“ĊÊĉÚjÜıŸÚúZjj6“Œ'H2TUVħµħ‡ĠŒAÉĤÒHb–Í•ĜĴ&ÎwĵI8Ǘ—G,£żżŸÍ›7SPTBhe›Ŭ…ÍbRˆÊ Ġj˘yÛVşzğéëïÁc÷^ Ëó01=Îèĝ0uġĝ ˜›§ĵ¤œ ˘°'J„#ИÌf6××"šDNĵv”d2×b~a†ùù9ŞĞĞÈ÷à_ ‘ŸW¨Ÿ3I$)‹ e”ꔁ=w܁ÁddxxˆĦĦaŒF³3SÙ\ı ŻN0•"žŒQ^R€Iäìݲd™ٜ³R0pıôöt17;Ñhf%D’ <ĝàƒ”——óċQ]S£,fı‚Ğ8­‹œïèàûßûßüĈ79ü2>9Ĥd< ĜvJËJĜğïûĜ£|ú3Ĉ’ŸŸŻÌŻrd(•ĴÂw žXCÉÖâÏÓi-ôp#X[ò§7 Xïè '9è‹Ŝúù“Ŝĵ5‘HhhÔÒÒ™LğŬN2™Äjµb2™Áh4F.†á3—.]úŭ%€w½ë]ÖıııŬ@ mffĈşeËÚÛÛİàÚµkœR‰Ê…˜ŸŸ'QtEêĠçóQZ^F8Ö:4}ĝž‡U½ïÔ£+×ç%éíô]Žú:ƒÁ ™ĊŞŻ×·Îe'ݝ•:Œ×s‰9ĝJï@§‘g²k-Žne#t+J·J)ßhf”ÍfsNÏkwúNÍd4k*ùX,FQq1ħh”o|;v ³ÙB(›—ÇÛŜvû÷î#•JXZ˘¸¨ˆLV`nnŽHx•xl–d2I{{;MDVWˆGV)Ì÷)âWARB×ÍeYĤıı§Óݐ•Ĉ§Ĝ\[ËÛßŝvnğí6ÊÊÊĜ´İğŬŞO3Q¤ĞĞ‹§žzŠû·ȑ#ŒċtF)l6MMMĵ÷½ïċ‰'žÈ…÷mւñÔd#Ma6ğñ,IŻSZϰ[?ÚÈñFß)mñ£ĉ{Ŭ­?½‹ú9ô–h*ñL%;¨k´ \ż~=^[[ÛSWW×ñä“O~ûÛßŝŭĤĤ&k Ĝí÷ûÛÂá°Ġf³QYYIkk+Ùl–ÙÙYüċ/“H$xàH&“LNN’Édfgg5êvAAĈ`E‘ÑÑQ&  …X]]%??Ÿ’’,eħ³ÙrÁââ"áĠ°qĴ²F6ċşÖ{Ç­7OĠ{éĦ2=·_ßŬèßc#ß>½ĠÏúäz+ ½ez7 Á͔f}‘pşÜšw#ĦëFĊiÍĊoĤzëqm)÷Y7ê´Ôèġßü|bÑ(O?ŭ4‡ÎꉄBX ĝ9úĈŻ9~ò} ^dsM-yyn"‘U˘‘éT ×,”Ž[×$v޳8‡AMM SSÓ\½zUј™­šyĝúufgfiÛÙämĊ˘XL&ì›ĥ¨*t\á&ö§Óé¤ııżßÏp6‹‡ŽÉ “çóRŸO4a~n–Ċ…EĉĉfY^^fffš@`‰t:…A6b21-H²Œ$ÉDc "ħ(VЍ͵›Ùħ£=·ïdph˜X,Ĉ ½}ŭäûĜTYE  ¨¨T2…ɤ¸ŒÇc1dƒ„l0PS]Íèè“Sd2YĴ sss,/-Ñĵ­I’ ĝ|>ċr.ܒHIi)VЕЗŻ(Á„F#Vğ•j„ÉIEK´uËRÉÙ,äċċ!k÷rVCĥ5oe``€~lv‡˘œœD·4ŠÄY^ "É2nY2Lf”Ž> ‰d”ĈĈ&î¸L&#ĞĞa&§&¸F2™¤aëVdYb)Àëq+óCQÎ9r€$܈TÍ}- ­­­444P\RN[[÷Ŝ{›7oĤ¤¤ˆüü|ĊÑ!“"›Îôü˙˙ÀoĵĦ‰üUżÍm-Ûĝà?Èg>óŜöĥ·a³Ù4½’$Išˆy}žÚÁ-ğU§¤˙ùġŻ]mŝ}2™ì†f­êû¨âX=l·ŝ×Ôâ^Ġ‹&“IMƒg·ÛqğŬÌÍ́À|^^^—,Ëó‡Îü^‹Riiİulllw4m3›ÍÖÙÙYœN'{öìÁjµât:ùċ/IGG{÷îeûöítwwsċÊ­+***"//üü|-ċU–e&&&¸páÁ`—ÓݝƒÁ@AAĉa2™°ċ4P~żŸàrPĦ@ĉ:œd2‰=7ğ2 Ĵj]ˆê[µŜ UßİèiÙú˘ oq—––ˆĊbkfDúĈúâwĞàġNáZ7" %Í3O”nßŭ&*·ŝŭdIÜP¤Ċè<7 “%À& úûùú׿ηżŭmfffkİà2ÑX„t:ĊÂÂ"s³3ĝüŒÒÛÓC0˘İħ_ž—h$Ši‰_>f³E)Jıs£ĈfH’¤iÂ|>›7×réÒ%Ĥ§§AcHŠ‚Èôô4ñd’-[ĥJ§ˆFÂäçû°˜sÑd²ŠĉHY= ’Œ ˆ$âqĉfçèîşL0"!ÉJl8&JSQ^Á]; ‡WE³ÙŒÛíV2šñ\GÄérñĉQVQÎí·íáŜ{ïċ=ĝ‡|ìħÇàĝħcXmV,+£#×YZRUY‰Ûċ$Q\\ 8$ db‘’$òşilĜ…ó癝Ÿ%Ob6™&²g÷íĴDÂH²|ŸG#>‚H4cǎV‚ËAÎuœUh2pġÊeœv;u ĝŭœNÎĦGN’Ĝ.JËÊ~~ IÄcôġ÷D¸}˙Äâq––ƒÈ²‡ÓŽ(‰ (d£A"JâñäħûĥÛiok£˘ĵ‚T2IoO7â"Š I§ÒĝŭŒfÜndƒVrH‰ŜF-RUUUìĜŜFYi)uµµàñ¸X^Zĉ/>˙ü‡?ÌŬ?‡qğŬĵûŬïĉħÇӟù3víڅŬnפ$ês ²vo•—ÎA‚;9 üêÖg-­‡Ünúƒp“‘ŝ}‰„6RXO1×˙NŭzŝœÊ”ŽF£„B! ƒf´m³Ùz½âää¤ĵ°°0m³Ù}߈}ë[ßúŭöövëèèhğŬnoD"–h4*Äb1 ÙşuĞe—Ç/ùKVVVóLƒ>Ìf3\v‰:ßQ/°ËċÂf³ávğijjÂjħL&‰D"FŠ‹‹1›ÍF‡2÷É~.ô†Ŭúj.BZ òÓsjbíÍqÍeŭ˘Ż5C?TŬ"âñ8ñx\ğj§ĤŜ°êûñ£O§½A!e´n}ĥĜlô·$‰şk;² #×ÒĤҚä‹/HGG---lß]‰/QPP˜£×G(,,˘¤¨ˆt*C&G·YÍ464(³:AdÁżˆÇ›‡Ñl"›N­,ġ FA())Ĥ¤¤”“'O²¸èÇírçŒB-ĴĴ° ħgÏlv³‰òò2TÂU&›&•PÄêġ¸xñ"˙üÏ˙Ì׿ŝuĊĦ"ĴäêXí6âñ$KÁ 6›ƒ;ïĵ“G}żëׇ1Œš§Ħ"W€’’Röĵ›={÷²ç޽Ĝw€}ûöħeËŞĞĞ)*öñŬï>KWW7&£ ³Ċ„ÉdfrbœııyĥoßN4Ċfs`6[5ƒN9çë(ŠùùX-f^ıJ`9€É¤èjúz½4652??ŬáÂi·‘JĞsIĊM˘ns5ssó …?•Äfµ) }2MOwċ• (XB–$\.§–q$I2ñxŒM••¸].::Î399‘ _L355Ár8LMM5‡‹‰ħIB+aÌ& &³ Q1·Ĵ "Ȳ‘˘˘"îçΝ§´¤„ÊêjK XL œŞn¨ôĈ˘úÙbYfÂétcwX1™nd`---ñÔSßâ˙}ú™5ZœŬğwóıÏ}ŽG}”–íÛÉdÒZêŞ}Ò;ǨĊւWá7vJÁjz—…[ÑÁUXVŬ´ëĴׇŭé ÎúÎK-@jS  €U÷pŭŒIµ€ËÁx˘Ŭn—'&&bÁ`°?//oáıçžËüŜŠÒƒ>h¸víZ×ëmŽÇŜt:-úŭ~VVVhll¤°°ŞŞ*FFFĝċ/IAAû÷ïgii‰ëׯkŽÚe¨CŞ ×ë`tdDsäµÙl”••a³ÙnÌi¸ħ“/ú5gdġk%džq8x<ž54l½k÷FžŝBꭂÔĊ_é³FVWW5ĵYßĠİ žY§·ŞĴ>}ĉ’RXSĜnŠÑ “şšşġEiŭk3ĵߚĜŽĴ 1½^݉pÏ=÷p×]wñÀ;äm÷ŬˎÖV #“DW#8vD”ùÊüÜvìĜAIi 5ĠU8v EIR:Áǎñ˙Ëż˙<ġ—.^d%"‹a²ÚX Ç,qy½8pïzäîíliŜĈóÏ˙ˆžî^$I$‘HRZZÊŬwßC½“wóhŜƒ†Ĉ&›šĜ²e %%ĝ|>­sYöûéĵz…X"F&•Áh2"Šóós 2ġ[˜_X ߗ§:2JaRf‰éD‚ĉ–Rİ$]]Db%ĝNèéíĦ¨´”²òrĊ‚É`ÂrN+FɑpOž—†Ĉ:ğ;ğ>ŞägÉFÜN'óó3ŒMNÓH^ž—xTÉ"³˜-ığ¨ÜTUWa2ıN`al&M6“f`x˜t*…ÏĊírôûY ĝħZ̸ÖÜ|"+ĞÌÎLsôġ£<ûÌ3üĝ~ÄéS§ıpé‹~?µu Xí.Âá0áp˜üvğkŭהCƒòZ›ĊÊĝÄ$ÁPˆ†ú,f3ħXœÒ’B$ŝ(a2šikocsM FYB–D,fñdŒžÎnü‹‹T”–Q\T„ÇeÇëuI'8vô ^:r„˙÷ßĝ&/żü½½} 333Íj$ÌÔÌ,…%ċliŜĤ Ù %Ċ…EÙhZ÷˘żÇSİd’‰œËKÉ8oĵñżúĠݐ%Ċİ ĵĵœ/~ñ‹Ü{7Áœš×ë%­ñµ\ozüVš:óıµë ›!ŭŭ½^£´ ­Ñ9eı)êGż‰Ü(§I˙óŞO¨:ĥ£Cë7èŞ€ËċÂn·Ğ!1??ߒL&=³³³Ëñx|ô駟Ž=ġÔSżû˘ô÷˙÷Ù%ahhh+l4ÍİTJóŒkllÔÌS/_̉'Èf³ÜqÇ hbVĠQZ]ĠÏää$‘pDËÊd2šĤI-–œĉ °°ıÙYĊWM· gÈjŽ &“Is^EğŬ†U˘Ô³WôLŬ½¨žJ’PwއŸšñ¤vtzÜX_(ÔÏĞÇkcħóóóLLLpñâ\ıÂùóçéèèàÜıstttpñâE%et|‚ıı9âñĝMŜ[eAé“-7JĞԓ;ô]äúÖ_D˘Ñ¨²pĈbĴ„BĜív­ÈFa$I&™HâÍóRV\Ê@×1J2’Ɉ˜#Ş,-ÙıkN§‡x"Áêê*V“D^^ž6WÒg\)Tt™d2aîğîáĥÛncϞ=<üğhoo§|Ó& <˜ÍFRÉ4ñD £Aa<ŽŒ^çñOŭ_üä'?Ñd*ô£êêîş÷A>ĝĦ³wß~œ./İtŻ€Ĥ­M¸\&Rħ0§OŸ!b6[°ÛLMMsöì9z{ûİĴĞÇl4‚¨(ċí6 jʵ ÙwÜħ—+W008 Äxˆ˘V˜†GFÙħc&“‰Ġ•EM2ٜ  B<ĊhħŜÖĈK—è@6(PòôÔËĦ­­­ˆ‚ÀÒÒ•eZtƒ,)R__Ox%ÄċËWH%€€Ù`$%Ë `0İĞŬĴ  İ>_™ ¤É`” 9Huu%Í[ĥ`0èïé!ZĈl2q}x”îÎ."á0³Ó<÷òµŻŝ ݽz”#GŽ011A2™ÊŬW% /›E2Y L´´´’J§É÷zÙTV‚l4ŸzO.]şÄOúS%÷żÈá‡éìĵ˘t†'N—‹“'OÒÑqP ×ĥĥ6{ì1˘‘ħX Ç£$›k²ÎôËzWïġ,8ċyoéĉ ĉE­'5ĴŸ Ż/8k xsΚÉP™ħëQ ġâúÙı~­R?§êgİú€Ş„˘Üşiù|NżßO__ßPIIÉüÏŝóôïĵ(}ûÛßĉŬï~·Ħżżż%N·Úl6K:ôùî‡ÒşŸsçÎa·Ûİ­­ŞŞŠX,ĈÀÀİŒ’Ġ“H&ÈfŻ&³ÑÄêÊ ×‡Ż+ğşÜ€6›É° !³YÉO²é4Ù´b§âÏ9~Ј$˜ âÑ(ó³³Ä£1Š ).,Db‰8Ǐ§££€˘˘"-ç)šĈndÏĦâ°5:×éR)-ż)™L"dĈT<'›Q: £Áˆ”Ż„V˜œ˜¤ğĞ‹³gÎòë7~ÍÑ×_çÄñœïè ·Ż‡ááaFGGellŒÑÑQz{{ıtéϝçBÇyŜ>ÎÈÈݤ.ÂZPféLd‰d*ÀŞ‚€€ˆœËö‰Ċ┖—+,àJ×UĈg&Éw{Ḧ’Àà52B†ÖÛI¤âÈ&‰ċ…El6;‡]§PWv˜ŠpXÔví’,PħİŒ††:JK‹pşì˜2b6K&İ0Ò$É@ÀàsŸŭs^}éy>²ÑH,ž$šLcħ;Ùw×½|ŝ˜ŭw߃ÙbA2H8ìŞĞËhĴŬ„Ġ”A&Ky…€ëìêĈl2#`”E\.;×éèçà;I%“Ä)ÊK Ş”!E"fЍ-Í͜9}–‰‰ ÜN'ñh”<‡…İIĤĤĤimßE4•%‰€/ÏM*C–½Žd4K( éĤÊ şğ:ı>2„Íj&+ˆLŽ“M§ıŭö=„B+ÄSY|ù^iƒ$‘J)óİmÛZ˜™ċôéÓŒ2‚,b6H,‡‚Ĵ„V)Ш¤²Şš@ €ÛċÂfµ •…W%†Ż rĝżóµŻ}ŸŭüÌ/0Ê&DD ²H8˘żŻ›sçÎqíÚ0áp‚h>Îĝĝ8,--i™Zԋ’L&™ššbllŒt:MAAƒƒ=z”H$Âm·ŬFyyıf İ:Ż6×g*ô`µZÉËËÓĴŽÌf3 Lb³Ù´dÔİİ)Ξ=Ë믿Î+Żĵ… Ò²xêêêĜğw/‡âûŜĈŬwßÍŬwß́¸íĥÛĜşu+ĠĠĠlÚ´ ³ÑŒßï'‰°°°@__W\á̙3\|™`NĤŸá v6›Ċf³jßSsi,‹–& …8uê/½ôSSS”——ÓÔԄá ‰ çàğġíFğ2Ud[^^9-Ç£Šùl4ĈÂġ²wß>ĉfg‰„p88œhX‰Y¸ñû„5O7A”;K)\2ħh”/}éK<˙üóG†BĜŬ}ŝÈG8pçARéI&‹àrz¨ŻŻçúġë ôhf§ƒ‹ĊÂâò2“““ìÜı ƒ(² QZRH2™ •Nb2Z´¨y§ÁéÓ§‰ätu‚ `6™#žÊÚÖNpy §Ó‰Ûá ›N!ˆ2İDEŠ‹‹‘D‰žîü~?v‡2‡bµÒÖÖĈỗ_ž“lnQRÌ;MTWW³ŬŬ­éVìv'ó ù¤ĥĥÛEĠĤ dYAàòĊ‹üç³ÏòÍo~“_üâLNNj›ġÜë˙ĴĦ"g³TTTPPP@cc#ïxÇ;0›ÍŒŒŒ IÁà*‡d2Imm-ííílŬÚÀììG_{§Ÿ~š'Ÿ|’^xAÙ4ċŬp8ĵ ƒ sáÂúûû•üĞĠUĴV+÷ÜsíííÚĵH+8dŜÂL5û]ÖGWÜüşµú˘ġß×Û­×!­g닑>G˙ ê™ÁëgQúyħPê5”ê†\EˆT÷L&#ĤR)ĞËċrıÑÑÑ띝‰ßUQÒXċċċQA.%‰žl6[i0Œ,--1<<ÌK/½ÄĜ´iŭèG9uê’$144ÄöíÛiii!°ĵ¤ħ:$A1Œg²šùŞ~W˘µKċċe FSwŞik&“Ñ,Ô@Y–ñûŭZ(]Euüà)))Ñ4jAQCÓniħ“ğàjÔ{nÇ Aqf³™D,Ev¨Îĝĝ¸ftX[[Kii)MMMZN”ë•䵌@užvlÓÓtttpċÊzzzXZR­X,ĈéÓ§ıpċ2ùùùĝ|>òòò(++£˘˘‚’’ĵ^/^K#™Äb1BĦñx\+÷öö*z”mÛ¸˙ŝûİİİÑr°òòòˆĈz{éÉê|Ĉl6³şşŠÛíĉ‘Gatt”ï~çYíáñx],,ĝĠ/AII ;wîÄjPfSZ\u*Ċòr@sš‡£ÚlÎf³át:5ñ²’rîˆE£˜-:;;yġĠWħX,ÄIÂÑ(vğÇââ"Ï?˙ĵâYhħP×H{{;FYb||œĉĤzLF™L ³IaÄĠ××óя~”ĦkƒLNNR”3#6 XMFΝ9Ík ĵŭÁ‡ "Ó3 z0ˆÒñöƒ>H__ßúĈ7x<Š1¨QÙáž<ŝkjkkÙw`?=ŬŬXw´â°[Y’upĤ|à óï˙ŝï$âQ\.ħX‚_ŭâĥnŬJMM £äçç²Ŝ˜C’…šÍ›yâ‰'(+S\Ċçĉĉ/™_@E iŜҀÉläÌİSĵŝúëœcêïÑ"ôžê&[EOÔ ıÑhÄétjHP4eqqQ[÷’É$Á`\TTT[TTtÇààà…Ż|ċ+ƒ_úҗRżÓ˘´iÓĤ´Ëċš]^^ž–$)2ä ™™™áĊ_äĦC:tˆ}ìcšÓ÷ /ĵ€Ëċâûîczv†žž]Ĥg…èoz¸ïfa\£l ‹“IŬ`ô9Nl+ĞĞĞııEMw•ŸŸÏ–-[¸ŭöÛinnÖfj*ŝë÷û×Ĝ²’ĥğÑğ)¨ğÛüÂBŝ×£²°°ÀħcÇĝÙÏ~Ĥ…ċ*Ħü ‹ÚÜÉjµjNÛħo,czzšp8ŒŬnçàÁƒ<òÈ#ìŜ½[³ƒR fçççq8Ŭ—­u•ÑH$ayy·ÛÍ'>ñ :Ξ£ĞĞKĦì `4ʌŒò܏˙‡úşZê[Z˜žžĉԉ“ŒŒ 311Áìœ˘¸(ßX@Ô´Úòòr…r]TÄĥmÛ¨¨¨P0p‹…àò2ßùÎw˜šš˘¸¸˜xú(]WŻrüĝqìv;ñxŸÏǢ‰çŝç‡TWVPQQÎàà0Û·oGo‘+˲²hµòñœ~úó42Ïää$?üŻĝŸ}Y–éïíĦu[£ÖÁdrPM]c#˙ûË_&rôµWyö{ßgrj†ĥÖĥ4Ös­€çò#޽ŝ׆†5:ŸUġ>Á`D‡×磤¤„-[ĥÖÖF{{;uuuZL}6÷lG#fffˆF£x<––Vp;Üħg+Ħeŝéŝ‘£G_Ó2Ï|>Étšx2‰ĊfcûŽìÛ·ûîğmÛĥaÊĦĞ++ péÒ%NŸ>Íċ˗™ŸŸ'0=­­L&“–ĜĞ~AzëĊpcço}÷$Ŝ‚àpë?=ħ&GŻï€ÔuIOĥ£ú@’Óoġ†ġ˜Ŝ]İŞO²Ùlklá ´Bĥ°°`÷ù|ğŽ=>|ĝÔûß˙ŝßú|iMğéOÚwùòċÏɲüħT*ċSµ?Şú<ÀwóÜn7ƒƒƒ<ûì³ĵòÊ+444…/|žnž{î9‰›­Cʃk0 蠟ġDˆt:­8ëb/T"ƒĊbÑvBj5W/Œ~W´ j<‹Ċ‚×ëĠ.×ëĠv z˘ƒ~Ñ] †´ŽLŬ!ĴĴßßOOO]]]˜L&***Ĝıs§BO.)Ñè &ŻĦ‹ŻÑe’kŠħZ@´™F: ‚@??ĝÁ8uêVĞUc“ésÔϛN§Ig”"ÇY\\„\>Ġ<À½÷ŜËŜ½{•.#÷zġ½ÔϜÎp“KĈFbd•˘ŝĵÚŝŸ~ó$ŝÄ_099‰Óí"X& b2Zhkkj1ħ°°@  ‘PÔéñDô†=JĉfxUŸ\XXÈöíÛimmċĝF“‰{ïı‡.eÓ!ÈĤşkh%”óÖФ²²’…ıyzûHgÒ<ñı'xûCï NÓĜXOqq!İTY´¨ƒ…ıyŝĉoŝ†˙9|˜˘˘˘ÜuSĴ’!êëùà‡>L–F\n[ĥ4b5Ûnì|³ ŜsĦ£ƒüJ`0ċvħ~˙­­­<ñç(ÙT]EcC%ñD³Ñ¤ĝ?"`0yóÔ)ŝäOŝ„Éé)"%ž;‰ñĜcñî?|ħXŒĤz6™L**ÊÄè(Żżŝ:ô÷ö0:>Áî}ûıóà!8öëיĊ(K˜­6Mb45w—˸N×ĠQWWǎ;Ĝ²e …EEkħ-AP¨÷9CŬǏó7ó7ôööRXXÈÂ’b½T¨ĝ_ŽŒ kÖd*N"ž˘İ݉]ğvħwï^î¸ÊÊ˕Î1?Ş#Q%‰•PHħ†:uŠ7ŜxƒÎÎN>ġİOñĊ/~Qƒ§Ôk’Ê$ğncçí…F\SdnÒ$eR7ŭœ^’Jg×èôôvFzG‰HzMžĦ¨"1Şŝh=ܧwÀQĦ;ġĵ„a~żŸp8ŒÙlV>N"´ÎÁċeü9!l:•Z³XĞ'K½hîÊ£>ʇ>úöîÛGuM 6ğ˘/LçâDIR>³ Jƒ×ñµŻ}7ß|S;&1Ğ™"Ğaü‹óÄc12é$y^ġ üáûŜÇ'?ġI>òÑÒş£§ËE<Ħ8ô#@2•$•N‘Éf•g?ÇlħPW_ÇŭûiÙÖB6›ĊçóÑĜĜ¨m^Ġ Üoš)mÁ­í–ŜşğÊdÒÒĊµYOfcQ­P‹^ߨ½˘[ŸL >“z2ƒÓÒuŭçSÙµê˜De' ˘Ñ¨!‹ıKJJìóóó“ §NJŝNà;€ÊÊʸÑh&EQô$“I£Jġöz½LOOóƒü€(¸q{;û÷ïgtt”—_~™­ÛšÙµk \Ö2â×SĠ…NŻ˜ÍfZZZĜ´i“–³¤žX}žˆžÒ­.ĤŞAĞzòġ~s&“I+jqgèħX‡ÍĈÒÒtuu188Èêê*uuuìÙ³‡Û÷ìÁívcħX4Ë}çĥэĵ6Ù5£A_ŞFjm{ŸĈív# Äb1yèĦ‡^XĤžO­ H+‘ 9tè=ôJ8[.Yí Íf3‰M[Ħ) LvCû˘ġ…Z|Ġß­.䃑?ŭÓ?ett”˙9ücbħĞM›O¨ĊË`0 ˆY vUġƒiM”µŜB§Sóï:räH.Ž{–`0H&›ĦħıĉĉfvlßF~^Ċ%…´4oċòffĤ°˜T–WŬßËáŝ‚‚JËËèéëgÛĥ-H"ڐ8Rvíï˙û™™™ÁbħPSYŒËéĦŞĤ›ŬMċĉZZZ·#D$é†K…ĉ5(АNóž÷ĵ‡3gÎü/~İôx£,â0[yġċ—ÙÖş‹ŞÍġŒŽŽbµZq9]šĊ‚@4Áj³ñĝsġêU~ü *°˘Ûí¤¸¸˜Ûnğ ƒ Ï<ó /ĝ"£×G¤sN%6›p0ŽÍbĞĞ‹ü‚"üqş:ŻpîÍeĞÍÊôô4üÁü>ĝ MMM8].Òİ’ÉxÓŭ°Ŝ Y’e:͟ŝéŸ8sĉ .— ĞĠÊòò2vğ]óš3[ŒÔ××ÓÚÚÂŭ÷ßOSSċUĠ܍F×°ÉT^‡Ş÷b8֎açΝ”——+ñ'‘HgÎÚ, "·œ)mDt¸UQÚHçwĞ÷Uï yŬ&T?ÒCqzRÑFú$½ĥJ?{_÷éS/QC˙ÔÂc2™”he–¤ĦUVĞ2g ƒV›Íĥµ¸¸ĝŜŜŜï|ç;×{ìħÔï¤(Ä,ËĊH$ҙÍfkEQ4Şé…Jf‰ƒÉÉIŝ?ŝƒ§Ÿ~šd2É>†††8yò$‡ĉSŸú­­­ĝ5HKSŻĞúê ²ÛíiäKKKš3„ža2™4›˘ĠĠUíĉóx<8N­‡Ş³$•ä ïTÜ\=ù½]œ?žk׉(Ù=<wß}7•••¤rĊC%[¨ïÒu€úxbµh$“IĊL1­ Œ9:=”(ñD ğŬÎÊÊ G³7şíĥÛ¨ĴĴd°Ż˙ĤdµšÍfîıï|AvíÚu3*£^ÇġÉĵê߉DA\ˎ\ż‹T‹„úİaŠÉd’…… öÒÛÓO0Äh’ -/óù.Ż(‹šnS ƒAÒé–RkÎĦş(İPa$ю/NÓ×ßGíĉZöìÙîŬğİĴߊÓîÀlT,šêëpıtvvb³XħXÌĴĴPYVA__GŽáŭ(³³³J8ežS'€N# ĵ÷}ïŽ;îPüólÌvMÊ|!çùK&ɐĈï÷“ŸŸŸëŠe’‰£ƒ$ñw÷wt\cìú0’Ùt†D"FV²Ì3Ïġ%Œ‰‰‰ ĴġVí& "V›MġœĉŻ˙úŻıví.\À`4rÏĦCx½^üċ/sĉô _żĵ2œ;ĞĠŞ!ċċċ”UTÒşswĵI’xéÈ/´ó;??O[[ŸĝÄ'xç;ßİY !ŠH9Aıú|­ïò³Ù,ŬŬŬ|ï{ßċ—_fll ›ÍĤħfív;É@ss3uġ›immċàÁŠ!³ŬdHgÍ=E˙|é)Ìêŭ§2qUgŝD"ÁììĴĈ:UïUU3i6›IĤ˙˙Èn.N73nċΰŝVtHòMñèúŽFŬ¤Ï ÛÈ^l=ÙA˙\¨?Ż,=‰BŭžznĠġGMÓƒIm(ŒF£¸°°W\\|§á;qâÄO~ŭë_O \ IDATMGG‡2wœ™Xc÷d1ËĴ„‚·ˆ’¤ Ÿ•Bœ%‹kb*#‹Ċ4ŠÊZPÎm0GE<^/-ğv³½m[·lSÔú‰8fÒ8V |c³YˆE£ìŜğ›Ë˜ EEܞ<^yíU*ëjıç·ÑĠß˞]íH&eñ—²dȐĤĴ²œh,ÌĜä Ğ+Œ]ax:ƒƒƒ\éîĦ¨´„?ŝĜcd+••Qjk+çkAÔĤĥž|/ŭù?ç _ĝ333x½^ ܊ŭV_ß%~ġü³|ÊġħY,VUEŠ&,“!›M dS Z)//çK_úŸüä'Y]]ż·‡ĵ÷eלÊbDÒ²@<™$+‰loocs]-í{öáp8Ĝ\UMS]-˙ëŝˆÉħIdI&Nà+*äŻŝ÷ıëğ”EUrµÜD%'•eyC–X,£QT#€ĊbĦĴĴŒ’’š[ĥárı—r3žHy/=!jŭà_=£Î’ĠĊU²DêK§AÌ*ĤµÙÜó™ôÌÌL*“ÉdDQQĝ›ÍŠ"]ġ• ƒü×ŭ ´´”ÚÚZ>ŭéOóío~‹K—.iè“'OjQ:&›N+;–d’p8ŒÇaëÖ­TVV*ĉHXëŠ,‹†oĤÓixùÈKڌfuu•T*…ÓéÔÌ`³Ù,‹‹‹ ‡ĉ.ÂápX+bN§“p8̑#G8{ö, $RАt×]Ü}÷Ŭe: jîäj8– ˜L& Ή'Óć‡C™OÌNO377§ A ĞĞ‹sçÎQWWÇ>òaêëë×ìlTsX[n^Ħ^USÇÙşu+ÍÍÍDÂ+7í`ġğ8uw¤.Ş6K£ÉĴq}Pİ߉D‚@ À…Žóô÷÷sùòe%j<ǚR™€Nğ•t:£ĜħhŬµzԅHVVVƒ– ­O*ÁŞï ÑhDp;Ĝıs';wî$ż ‹ĊB$l°µ:—zĴ„ĤR)Ì ?ü0gϞe°w›ÍY%"ò‘—Ĝĵy3U›k¸~ŭ:Û[ĥ"ñD\Û=f2ĉŭ<úè£LNL "Ċ%%Ô2“ċjwV‡菙œœÄf³PV’Ñx#XEî½˙~%#Êï§°°h4Êżŝëżâp88qâ›ëıïĦ(߇Ù$#OBD 2Ydƒ}ûöñŝ÷żŸ§žzŠ.ĵ^/ËËËÄ3Jàž„@^Aġ 477S[WGAA35•U45ÖqîôYzşşIg’XÌ6’À?NkkëMœŝ3ĵĠ×Î]ğhiQĉ:*S.£F•¨ĦŒ9T`½ûŝzĦèobıŭŸ°Ŝ~­ûVżïV_êLZġcTsÛTô&›FÛPÓi–——§ĞĞ‹žžü ÚŭĴnÜ֓­ôÇ#˲ĥ!ÍÏϧŞv³²™)(Ö7Ġ.H£7d֏KÖwgŞ>IE’ñŒŒŒ011ACC@ƒAħoZ ŻZEQĴ3›Íw_ŭŝ÷żßû‘|$ġ[-J%%%ÙT*•0 éX,–I$˘:ûQŭèêêâ™gžá³Ÿŭ,.—‹Ûoż˙Â"?ŭéOéííŞŞŠĈĈFfggµEPµŬQ-†jjj(//WôLıÀ7U¤ĤĜ,..òĉ›oj³"5šĵĥĥ–mÛĥQUU…Ġj%­qÇĠ[ıg³Y„,šËĝŻĵò }}}Ú*))áğîRœ¨m6‚Á áp˜T*E  ¸¸X+²*< ıpá§Nâüıìv;´´´pè!µŬ™Q–5‘íùóçÉËË#“É0==Íää$Él†}ìcTVVjğ'µ£TiÓ*e6kĜpeeċ- zœ\ŽĠÎ) iíğ>â#‹155Ċµk×èèè ³³“Н„B!-F}Żüü|œN'ù…Jècqq1›6m˘NIO-(P:4I$›ÂCĦ—/_ĉĝñtvv266ĤtŞ4z•¤Bw+ËKô÷t³²²B~~>ġu ””•b1ÈĉrIşù³ïŜ³‡G}”Żüïż#c³ÛÉdÒäçùèëċĊ_ŝŠâO˜ )pcYi‰ĥ°¨Îġ>ŸC‡ñÔ·żÉ’——G2™Ä(ˆĴF#ĵöÚkìlßC}}= XÍ&ĵ^§ÊQŽëĦCÈ&ÉXŒżúĞż˘ĞĞKcL³ŸÓÔHyù&._̎ĥíÈYÄ54Y£ÉÄç?˙y:;;yóÍ7™››SŞ…ù”–•ħuëVĥmoĦ´´”4ÊĴR2šĜğ{ùsĉÌäîŬğ3żĠ˘TTT”ŽÇË‹e5çɲ,ĈqÊÊÊXZZ"‰P]]Í?ûÙÏp:|îsŸ#›ÍòàƒF9}ú4ËËË´´´099ɕ+W4CĠd:ÇQBğŠ‹I¤RĖ—•Šm1k7ž9??Ż(Ú­Š ÖétrÇwÖֆËċ"•Jħ²²‚ÉbÖZzuÑTo0³ÙŒ%çAö‹_ü‚7ß|“P(¤A|•••Ü÷ÀŭÔ××vğ ƒk|Ħ$I"²Ĉċp’ˆĊ™Ÿ żżŸcǎqéÒ%Òé4{÷îċá‡ĉĥÛnéTÌWçĉĉ´–Í²k×.Ün7³9o?•ˆ‘JĝġŻMKK µµµ‚ é;TF£Ú•™Ífâñ8@€Öĥ´µµiü­ħêÜ-‰hZU×aµÙÈĤCĠŻğğ›‘e`‹Ċ())Ñr³”ÔÏMlŜĵ™††ÊËËñ–) YÍF%C4‘Ĉa$ƒdÄévqîğ8tï=$ :;;9òĞırċ ƒƒƒ,//Fµn-2:2µœÏ"ˆliÙĈ‡>ĝaÚÛۙfĜnĦ‹Q&•Îh;<“ÉÄ?ÌıÓç8|ĝ0“L‹Í„ÓîàèkŻR_ğ™{ïżÁÁaìv;^—RPRÙ´ôÏ~ö³  ñò‹GnhxVaav–ï~÷ğ<ñÄ8vĤĤĤz:vTšt<ˆ³Y~üóŸ˙ùŸZ 07;Oò˙Ĝ'IĊLNNRWWlĴÒ) ²Rœ­V+v§ƒÏŭùÌÌÍ"Š"[·niËvJËË5ß?Q6àóz)**Âħ“J¤0ˆpħ³“ŽŽ³Ĝl6 ’D<ċÁwĵĵĵ< ŝĠ³şn%6ż)GL–nJI]*LßÒêKí6ŝŸtAŭû7½ĉ­ ÖFDu£˘g³İ3Ŭl6Ëj(ÌħcÇ8zô(CCC„a­›R_K$ċLF£bHû^&G\PχúğTŬU<™Äż°Èäĝ§O½Iaa!%%%lÚ´IûscĤ•!›Î dA% ’Ĵ@ëÉÖi˘(b1™1ÊD”xvv–ĠܨâêĠĞڜ?“%Ëââ˘,BeaaáğfgggŽ=ú°ò[-JMMMİl6ğ‹Ċ–3™Lışà××דN§™ŸŸÇd2ávğçù矧ĤĤ†‡z‡zˆıı9ĤĤĤhll¤İ݉‘‘fff41dyy9ùùùšC€^{‹Ċ´]“ÚñÌÏÏcÎujœqKK‹6;R/°êͧv7,W”.`llŒÇséÒ% ż•$‰úúz:Ėĉ­ŠÍŭÒf³Ç³v“Q`† .ÚkŻÑÓÓC`)@C}û÷ïçÀï÷óÒK/iì9Cnİ­­eyy™ÊÊJĵ^//ĵ‚&U‹ kİÂÉxeLMMáp8¨Ş,×âßUгÓċáñÇ?E__}}}ĜNb‘(ù˙q_Uyïŭ=gö}2K–ɲ€"”Zmk‹µÖj[ëµ­½íÛÛ·ö½ġŜûù´÷Ş­Ğ­Vo½ġêĠڂ‚,*(‹,†²‘}›™d–Ì>s–÷sž‡“! Zß·á“O2™ċÌ9Ïïù}ßĊ‰!ĵısjꤘ–ŝŝAĞĞ ×ktXµnGiiİÄČF`²ZqĤµûöí-·lÁ¤^Nƒò²JlQËĝGâ‰'ž ÂBtğì8òÁa̛W‰/Üñ%ôöôl6ĦÀĤIħ„Ëqš››ñÈ#`||………È*j1ċt:eÈYf €NĞF<šÀŜ=ğÑßÛ'Ceee¸éĤ›;~ġeü+)JSXx RL6Ĵ”MYV²Ìfgż]™ûÂ\Ei&‘ìl(žäŸ™¤ ıĥÍf3:::Ŝ;100€h4Šúúzˢ"ù\G  pžZ­†Jîd”0·’ÂMôEù|E[[ĴVĞdpĜ0›ÍSÈ„ħLĴàHúĴÏçÈÈ.\¸ŸÏ‡D"X,†·ß~wÜqıĉìÜıĴZEˆ[F—ËUm6›WµµµÜ·o_÷† ĝ˙gEI£Ñ0F£1÷ûSF£QÉ:£öövlÚ´ ƒƒƒFaa!&''Ñ×ׇ;vÀn·cĠ5+a0ħiÓ&żĵĵ<„B!ôöö" Ñ׏ÇÁqJJJpĠUWIĊÉIáüùóxġĠW)œ˘Ñhàġz‘ĉ8Üzë­Ĝ²e RİbħŒŬ´:² ×a6›aħXÑс·Ŝz ï½÷†‡‡„é|É(eĞĠ µZbÒE"ôööbß}˜œœ¤´]êˆa0S¸ĝòFäççñPħqNNLC&8äċċIéT §[o½7nD{{;:„à?†A§C"ƒ Ĵ¤#c£8yâ*++q˙ŭ÷#sèê·Û ³IT*#EË IŬÂÜ˙íûñ£ŭ ™pÁ§3Ès9áÁŸŝëe<ĝàƒ˜˜˜ÀÀ€ĠĠjġ kë7l@o÷E<úÏ˙‚ÉÉIXr˜e[5Ŝ|óM46.EEY)ĈÇÇQTXpİ{D4ŠçŸ/^„á †Z­ËniŠxvçΝÌÀÀ€) .>ŝüJ–es3™ŒŠ ş—/_NğT*ğŬŸÏ‡p8Œŝŝ~TÎĞ„Ëċ‚á€(Šûŭjµp:p:0™Ítf¤Ì "ğ*˘&Ġœœ RKÉóTGŒD+)Ĥ/%Ĉ!m<ÇG}„ŭû÷cp`999H&“ˆF£hllÄĤM›ŸŸh4Jħpòü’É$mu‡††ğgžE[[=^ĠĠĠĜşu+Rİ^xát_ĵHcÚsssñ/} wß}7*++‘L&148ˆ·Ŝz Żú*:::hħ"Œ;ĝEÜp S Êkݽ†}ûöIz Ùŝ(™LbYc#îż˙~TVU"Ë,CqÚĵ%2L5H&“8vìžzê)<ġÔSx˙ŭ÷áġz‰D Ġh§€Óé4&&&088ˆÁÁAôö÷axdˆEcôy’c<G2G<E(„ßçĊÈÈ0úûûpħğ 9†ŽÎ.Ä ¨5R~ÔD €X< Ğ͝F˘QC”xt´wHPUš“D³ ƒ>Áċrƒef’[¸tL¤E!×ċĈ@˙ÚÚڐĉ8€eÀñ<2iùùùXğv Ş*çĦĵĵ 9vÛ%YAÄóÏ=‡çž{ŽR—‰Ž&‹A€³Ñ„ñ‰ ĵ^Á D†Ċf…Ff¤ Ĉ),8§KZ|9V˜hU,D‘—£ÂEœ?s|ñìĜħŻżö.´·hÔÓÄŜ{ï½ êëİc2˘E™2!@d$Ó\2›ılĤ ĉ²ÁÒġàJ Rg/:W.ŽîköËË~ ‰Çэ!O@AA6Ŭ¸%%%TOEnGfÒjš&şŬnTVV˘²²’Fĝĝ½^$“IşĤz7EOg§—\ÁÉĤž ÄİaddDşn{{ÑÙىŽŽtww£ĞĞ .\ÀùóçqñâEIÏĈóÉzEmAÖ½ÂÂB”••ábÏ%Žp8Ĵ2›Í:½^ûĝÑG ½öÚkâg^”^~ùe,[ĥÌ8oŜĵGŽYÇst:ËÈÙ-İT [ĥl‘܏ċ–“ˆĈĈĈà“cŸN'e‹ ‚@ĵ>ߔ¸qGNTj1/ ŝfë÷ûáóù bYĜl6in Wtâ n2™ ‘EİĵÌòSĞĠ8yò$öïß/ Ÿ êĵlÙ2lŜĵùùù’˜O݇J­˘ĝ~$A*%1°şşş$µÁ!ÊVËÉÉÁwŜ N‡gžyFÚéÈŬA"‘ÀŞUа}ûv„aìŜ½ï½÷ŝûċ—qòäIŒQmT0„ÇÁ}÷Ŭ‡Ûnß&u%““ÈÉÉÁŜ½{ñüóÏ_˘à RĦhjjÂ˙úñÑ€á‘JN€(\&PVĉ)½óÎ;xîıçÌ3Ï …ž|„X ò"%X8äY1˜]µjVŻ7l¸[?żÛĥmm·Ŭ†-[ĥdڅ h¨ŻGIq9v zèuZh5¨U*ô\ĵˆÓ­­èëëƒ^݇ĊbA(‚Ïç‡ ÒıÂŞT—”Š GN.ĆukQż zƒğğ1‰Âjħ"ž„×ëĊâK`ħX0:: ›Í›Ġ 9u,ˀeEèôáÄñáóùċ§Zƒ`,†ĦĦ!444Àj‘ĵê<žDˆ°ÙìÒ BJµZ§jP–,Y‚í_ŭ*rssQSS ƒN ^ b$’qüüçâ½ï@£ÑBoĥ"‰ Cg0˘ÀSˆşşĝò]_ÁúġëÑ@ġ(UUU¨¨¨€Û킊<¸ĵŞÔj$âqiÈŝŜ{ĝÙ˙ŝßxñĊñîğïJbmy3IÄÚW/]‚;î¸?ü0ĥoߎÚÚZ*PúŻÍDj éJ´BÓŝ~Î8ñ™Ŭşé3˜#zbV§o0—EKÌ4sšĥ¨AœöwJpò³’AGÄì¤èeC—¤@hÇƒÈd###PÉÙ˘˘"êÈÇ át:QQ!Y3 A'ol5òóóċH—KI³JÏĵl[˘X<6E´Żé†B!TWWd2Ħğğ›X†aTjµÚ İTŞ˙Ċ_Œ?óÌ3âgZ”v½ıK´ÛìéE‹™Y–­=áĵKŻÓĞÔj5Tj†‡‡1ŝ|äċċĦµµ•²ŜT*‰=`p8V.Wnr;â tÇ%|%†J<íH´Â¸"D°´ĴL6jĵDÏä0żĥĥ6ĵûîğ¤ħ,ËBocġêĠ¨ŻŻ§ *™q‘ÇdYVö‹Gw IDATru°oß>9|˜î“É$2™ ìv;Ö]‹şş:ş§R)É(R1Ü$&“ N§ Ĝ²e ŝġŻcĈ(,,¤ğ­V‹ŜŜ^üêWżÂ]ğ‹Ċ¤g[ĥlÁwóĴjn–<Ìb1I##•*x‰™ÇñÖ[oaǎ8uêŞĞĞqÇwàîğïĈWòÜyçX³f ŞĞĞİş^‚5Y*f%T–’Ô ĵ0É÷ʈsrOMM î¸}Ì6ĈÇÇáó{‘LĤ`ĥ˜‘J&ñÁĦCèéíEQQ! ò…à÷C§Ñb5ËPi4ò\Bµ<,,.Ĉu×ĈM7oĈ°×‹ Îáp`a}=Şkĉ˘$ĉĠj5SlbÔj ***p½÷h€Nj”@°dÉhuz<‡ĵ\7Nvñž“cƒJĈĜĜ˜Ä‚\´n·ıy`Y™Tjµ ;˙ş OŝúWˆ§xp"Hq0YlXħâ|nëçqÓM[píşupÚmÈħۑëv£²bŞĉ•Áf5C§QCĊ ŝe2#ġè‘#xñĊħcÇĵ ŽÑ<"˘‡İ­­ĊĥmÛ[<€•+W"77÷2Ġ˙Ùî\I74[Áñ‰˜tÓ͌fíÌĉ*N`Ĥ à›é1³o+ŠÂ´!}—n/Na"fĞİ a(Ÿ!3¨Ġj”——ƒç8ôöö".oVóòòPQQ‹/‚8íô÷÷#??ĞWŻ–ôŽ££”œB,‚–.]ŠĈĈFşQ$BÙébÛ͖Kžw$ÇÌd’ŒwGGGĦÓéÜ܌?ŝX™n­RİT&ĉĦ˘˘˘·Ŝz+ó™%ĝŝ÷ǟ>}:ħuë֒ŬğwWiµZF;Ż×‹+V`xx@€&˘ ! ġŠ+èAi Hq™ĉHpO˘µQz²Ħ*ÇqèëéÌ‘Â˘"Ĝl6dd‹•J³É„h4*RöġQK²X^ż~=,X­V‹H$Bá4eYìGG¤ İ„ Bċ ³ıı%%%4=ÖSXˆòòr̛7ĠĠĠX¸p!šššp 7àĤ›nÂĉ͛Q[[K“`ÉëúĝħgÏ<óÌ38{ö,Ċu°}ûvÜzë­(++C4 ò#Ĥ°Ê™ÒÀÀzzzP]]ï~÷ğ¸ïû°téR8JA…BtHKŠ1ÇñSL$•6%ʐ°l"ù4™LS´ÄŜ‰l ‰$Yu Ö#‹cbbÁ‰ 2é4Ĵ6+zşğÑ×ۃP0HáĦá!D#q˜ÍèôZpœÙÍ0Rç+p<ôF#œn7ÖŻ_ùĠĠÈuğ°hÑ"Y]ŻÈP›Qàñ€ÏdpàAéuħŒì$-bhp§E%ĊÈd8èt8ìÚ) ‚á^UUââb‰†›ëF‚:)Ú]ž7tuuç˙ççz½ˆĈ3((,šuëŻÜ…Ġ×­Íž£Ù—Ë…Òbjkç#?Ï£Qž ’ï+“ĉJ&áħcxé—ÜsÏá—^Âğ‰ )HP`0QZV†ċ+VàîŻ} ßĝaĴżáx<´R^‹WZ$ômîùÌĴL7AüT:¤éŠÒ´÷1GŸ ÎNŸV…Yş(İËvîVš­çÂĥUfş‘Ù.Am9RÛ˘´wß>qÑ…éċ˗›ËËËk[[[]@@e2›¨ Ôn·£ĦĦgϞRHÈâ•L&a·ÛħdÉÉ SĈ:É'ˆz˜À{¤·o²S7™L{%-.ĉϟ£ÉHÉZ{÷îE[[í°H畗—‡-ŸÛ˘Œü†­ÊPB†a`µZ12<‚ƒB%kžˆpŽ8MD£QäĉĉÂjµ˘¸¸eeeX|ġĠX|9ššš°bĊ ,Y² ,@ii)œN'%N;¤3gÎ`Ϟ=xùċ—ñç?˙Ñhf³ ¸ŭöÛñCáşë£ƒNQaŞJ ĵ‡ġġġXĵx1=OqöVRç)Ql÷¤ÔœÌTŒÈÂFò\ÈŭĈ˲ÔjÒ#“–p7ܰ&“ƒŭˆĊâȤRp8èïïCkëiD£’uÍfG†02: •J ›ÍJ,hµ¨5jéVÒ;•––ÀnρÙlD"‘D(Fx2ĞĠ^†Q•Ŭ_MUΝ;‡îîn˜,fÄbQhµ:ÄbQŒŽyQZZ§ÑHE†… ˆPİXĵ@a?eÀ yÍä‘6 âex³RÄwY¨YÖn’ÌÛȌ‘&Jù80ž Ál²`ñâĞPRT‚Èd}/b2†é€ŠU…óhoï€ÙjEn^V…á‘Qp< ×éĦ7H¤4—h²˘À``ëLJ÷ÙóÛ׏¢tÚKQòW^yċċĜ³gĦŒF…z‚Á¨­]NFäár9ä˘Ä€eĵN›Í£I Rİ$Ôj ^xŝĝŭïŸ‡È ÂĜxóÍhjj‚Ûċ@YY)Ô΃Ċl# j 0HÄb8rĝ~ûôÓĝíÓ;ĈŸ_Çɓ'111A×F£ .Ä­·ŜŠŻ}íkĝ_˙ôc,YşĞE"CÈï­äPÍM#Ùŭ’s‰,˜Êŝ´_g鈨HÍP|ܑaîNiĥNK1cAşQ.Ïef„ŝ¤nG˜˘ħ$(;´Oıĥ‘ ²2WŽ‘m™ RÉ$úûû) ÂċraÙ²e0›Íèè蠚˘ŽŽDc1À811ħħ1J„ ‡ù|’G˘ ϓôòžœ¤şI‚x‘×J˘Ó‡‡‡qŬu×!‘HP^,ħa’ɤzxxxH§Ó]èèèH~ĉE鍿üE\ĜvğŬĉŜŜŜÚsçÎıXĞ"ĵĝD"•J…ŞŞ*tuuÑ.‡'&&`00::Š5kÖî‚P \Gĉ‡ƒ’¨ ÁÒjµÈħÙ %èI.hĞ…v?ïxCCCôg•——cĈ`äI2UCœ—à­fjŭ"Ùn„a ’ç8<<ŒÁÁAœ;wNxŸ?sçÎáÜıshmmĊİS§päÈêP°oß>ìÙ³GE8$Ċİϛ7K—.Ess3–.] ³ÙŒöövìŜ½ÄĦC‡îğïâĝñ8á&''‘ŸŸO#ÈI/½ŜË)¤Ä ’#%û‡´ßô‚P`âÙŭÙqÓ]ÄäB#ç€àyhġ:¨YÒ)İ€×ÖÎÇUġ ‰D026Œph£µ£££8ùÑiÄ)ÔÌŻ…Ao@ Äd$VVN •Šǧ!ÊL4ŭ>ĝà0,VH$’(ÌϝF£AFîòóó166†Óm-PĞ4à8¨J$“:³ÙÌÖW$Á‚ $aè”à:Ròóó!Š"-ZżßP(„‘‘Œï÷£·W⠂@ ÉECĝŭ¤{rĉ8À²,şğğĦÑj122ƒÑ€şş:ĝ|>:xÎ~(ä%ŠXż~=JJJÀ°Ì”( %żŸ\Ą¤`³ZQRR£Á@ ÄÀ”8„B!8$ J{ïx8wîZZZÒ҂³gÏ˘³³}}}H&“(--Ċµ×^‹ëğUUUÈËËC}}=š››éüÌét˘ĤĤW]uJJJ ÑÒ҂“§NĦğğGŽAoo/n‡Ë¤)£tûV:2“ÂO0n˘—^żzʅ8]tüt3%Eé*}?˘ZÏñà2èô:i\&ƒü‚Ĵ½ö:<‡žŜŒû' 7ĦĠë‘HĤŬ}ç.œGmuŒ&˘ÑBÁt:-Œ&T,+ëXŒáÉ';žF{G']³Ğ‰T&š:T@Î<"Vmm-><ù!.ötd² “áNsPk´¸éĤ›a›à)pÁn·h4ÈsP*İÉĊ‰G†Àe8ü?ŝÇ?<…›Á`ë×oÀuëע˘Ĵ yynh5*p™TĴ‹ú(üWxĉ™gÚkŻÑ…ˆP{u:–,]Š/~ñ‹ĝŜ÷‡Ż~ġиêŞĞ`µÙ.1òĤğ’ŸI!ÎĥüÉvW˜­ƒaXĉŠl†fì˜Ä+3Jù6Â;:L÷³E´Èĥ6Êŝ>{vD:ì×L L”“E‰c ùYy퐵‡lıŒ„‚° ƒ‘‘ŒA%GżäyóĉAŻ×S3c½ĵĉ8NTVVÂf³arRÒñÙl6 ³ONNÒâDş ÎŭÄy‚@òJW żß5kÖàüùóˆÇJˆŸĠétê`08h6›/ž9s&ŭ™^|QÜzëÖ´Áh0§3éÚööv—F£Q‘Ŭu<8ŽËĴY³&vöìÙD2™Lk4†85 L& 1ŝ|”—–Aàyˆ‚Qá÷ùĊ12<‚Ŝž^  ahpÁ@µın7\N'tZÄÎËËC,èÈ Š‚`„œik“ĝúòĵ%‹Ħ°°kׅĠj/ïà•ş$rÀIĦ"˙Ïñ<´:-ŠKKQS;uġġpğsQRZ ›Ŭ³Ċ•Z ½ÁƒÑƒÑ£I–e`·Ûàr;%ˆĤW-^„›o ·oğ›7oF,ƒ×ë…VĞESS“”îiµÂl6£¨¨ĊĊĊTE]SSƒĤĤ&£żŻCƒ8ÛֆÖÓ­ŽĦşŞ&£ "#RW FƒD2 Nžżq<ĵÎğtqJŸ,ËțbQ†LyA`fp+wĦÓ͜ÔPCͨÀ@Šc`X" ĊżëµhZ žÚ/œ @£V#ŒCĞValhgÚZPUYĵ\7t ò=°šÌö“,:ÚğñŭïŭÙı µÁP“áIĴ_·‰q" “ٝA+íÛ€aˆ,‹Ġ ­Ê€N†ßç‡#ǎ‰ êj°qZ\}UŞ*+a4(E$E{ ĞĈ£>нû€aàä$ò<ù¸ù–›ÑÜ´%%EPħR²m*™Ĉ믿ŭ—3Ï>‡S}„P8 A‘á¤üݲòrlùÜçÍo} ßŝÎXıjŠKŠ‚Ş ~Ë*0Ù$†ì ¤Ùœ·g„àfĦd‹˘(ŻúrG$ŠS2³ÌŒ.-ŝü”ó-ûsÚ9’âƒEÙXú$1*äëló&†a‘—È /G› ^ÎN!J˘$Si F¤Òpĵ@"™.Kıb2ôOP ²iÌvM']J4ÇóRÔ<€Ááa Ž‚eUD`U*äċçérAo0HÎ(ħˆÑÁˆ,Ş/++ƒËċ‚Z­Ĥq?ÊĜ BˆĊb˜ŒD(#S‡%ìŻVĞá÷ûa·ÛQ__'N(‚19•N§ÓĊñH4ŭxǎŸÊċA=× ,XïêêúúëŻ?~úôébżßoçyžcY6Éó|bxxx`tt´}Ù²eáC‡ċñ<µVĞ-M$ZQ144‡]ğváó ŞŞŞ Óé`µZa2™pñâE$ tÈîÏ$ÊĦğğN§“F #*cĦK—.E$A{{;Rİu' Ĵ62+aIlË0ŒŞ/µÌPĤ;(CıRİTÔ:éêĞӖœàĊS´:B&“‰îlIúmaa!RİÚ/tâ7żù Òé46mڄ5kÖÀf³!‰È>ôôô *{P•””àêĞŻFAAĥmÛĜħcĊ˙;;;ÑŜŜŽ––ÜyçX}]3e'*³¨È1™n1šV$™Ĵԉ(˙şlšÙî_R!‰LħP!ĉ³ Àl2cŬşu8~ü8ŝó—Ĉawä M€9AŻ×ñ jŜ<˜L—`´÷Ŝ=ˆŸüä'èééĦĴMŽpáÂìÜı7Ŝx#|>rrÌ` e Qħ’ç#bÓĤMxûí·ħ˙~Œl2c† ¸ñĈiw ċë̞Y€‡ßïÇɓ'áġzáñxàġúa2™°xñbJb‘üÏ˙üöîŬ‹ÖÖV †ĥX¨ĴBĞĠ˘ħQòTĵîşëPRR½Á@3ž”Ì.%AáJs>‹Û’¸ˆ+ıŭ'ŭŭ'qŝŝ´9LÙExş8ɔdÙ,Ĥ*éŒ2™Œäè ÏĠ•pŞrÑ'kSvĵq§!aЁ@}ô PTT„ÂÂBĴY³||>ġÎ<~ü8&&&PVV†ŞŞ*ê÷IˆJÇóË ô bfbutòäI|ç;ßAYY™D’-Ó†1ëtşFżßżüÔİSŸÊO5× ^|ñEñĥÛnKuww òĉœÑh|? ‡ğrssßX°`ÁĦd2Ù‡óA¨à8Nk0ħËq99¨ĤbRğŬNM9CĦ†‡‡i5NR f°CCCèèè€Ŭf£"3’g388xİ=–-Šôz=ĊBç͛‡şş:hµZ$ä\'ሐpé)‘äÓét‘ΤÌf3ŭ´Z­°Ùl0ËÔ^’*KXQĦP{öìÁŻžĝ5 zè!\{íµH§ÓĜż?N:…ññq;v û÷ïÇûïż3gÎàèÑ£ÈÏϧş’‚‚=zCCC°Û픉722‚'N ‘Œ£n·ĦPhŠ?4§›)wúÙ°ÂÔŻì´;“+yö˙+á•'= êïÇ/ùKü÷ĞŻ‚LFĝĵ`·Ŝvño`ĠŞU())†Ñ Ğ‚^ŝÓËĝùÏ˙ ÑH]˘Z­Ħp@+W„Jö4šÌ°ZLPħ*J/çyz½999èêêBWWœN'|>ŝô§?áÍ7ßÄ_ŝòĵŭöÛ8räN·´P‡2@fU,&&&pàÀŒŽŽa„BaĴ[·wÜqžŽ§žÂüÇà7ŜÀ0]RİÌf3nùfü‡?Äŭ÷ߏĠĞWérIÇ €Z£ŒÒMNĝ4ĊèJ˙Vœkáݜ‘7›wŬ•ŞN˙ŭlÂ[Ìé­§d×e됤ïqYê-qD ¨$÷8ÛIA)G!Ä,ċLJ­Vcbbŭŭŭ’G£\@‰&''iê6Ñ’u“<çáaÉĞRĞĠÒ5C¤”YŽÙ…Š„œ&^UUrssqöìYZĴAPi4]$‰°,ûñóÏ?úÏ˙üOñ3í”än)ĥsçÎC‚(Šn†a:µZm׊+&×­[—ĜĵysÊjµŠ‰D"&ŠâÉÎÎÎċjµÚ,™@¨×ׇżüċ/x<¨ĤĵwB ]Éd‚ ‡”.î÷û188ˆ Œ††Ô××cŝüù`Y>Ÿ~żŠE{ĥ0ŒPΈԍ˜ •KÒġ8Àé _œ~èON2Â<$f³‘HŻżŝ:^yċ¸]yĝú׿ŽŠŠ ìÚµ ïĵóÒé4nżŭv,_Ÿ˙üçñŜ{ïáݧž‚×ëE8ĤQÄ'ĞĴĴ ½½½H$ÈÍͅÓéD?2™ žûŭïáŬwßŞŞ*ƒAɰÓ᠄’ݝĤŝ<çâ$^Vx²/úÙó’ä\1 ƒ>ú˙òóGqôèQĵNà1î ˘Sˆ›?÷9Üu×]ÈÏσÓé„Á Ïñ`XŜzk~ö³ŸJÇGĞ…VĞF†çÁˆ,À i´èëéÁîŬoaÛ_B$ÁĜ¨žĵ\°,d›)‰X#òV_{-x^JÀ={ö,FGG%³^–…NÁ*$ç)¨F£³.— pĜsàóùÀ°˜Ì8ñáq<ûìoÑÒÒQ§ˆ,X€úúz|û; ??‹eê1UħӒJĤën?i§3ŬßÏ̛Kî¤è\éï•.î31êDqn7ˆıfR¤CRv ¤8‘bAy²NM1PŜ§R\Kœq”„!ġ‘ (ŠˆD"4­³³“Ž#H^ÑçġôôM ßïG0DAAL&L&-R‰D‰Dét1ٛ/ûĜ( .A” vî܉oûÛ°Ùl4ÈUö55ĞTŞĈŜŜŜĈÓ§Oˆ~ĉEiÙ²eÂK/½4ĉrıŜ,//W755>˙ùϧ-Z$:t?ŭéOO>ùd$‘HœŒF£g|>_n2™´Ĉb1Ön·cxx&ƒğvíÂ<@M˙’É$FFF`·Û§;•ĦuŽÑi48sĉ şğğİ[xSSNœ8ññq¨äN‡ĝ7‘–—PÔÍV sR)ê˙FĵŬȅt^¤c˘ĉò6WıSĠjuôĥƒ:Ž²ï&&&pÛ­·£  =ö8€h4ŠmÛĥaĈ˜œœ¤Ö<ääkllDMM͔(s²û ¸ŭöÛħbĊ üìg?ĜĜ F^}ġU<À¨ŻŻG2™œ’Ž9ÓÎ1› ›èLW¤”·#E›ĵâ ¸˙~<÷Üs8zĝ˜ÔŬİX„ÔĠÖáî{îÁµ×^K bu:âäyyy‚Z-‹{ĵ˜È10š$ƒÜ·v½‰ùu ˜?>ĈÇÇqñb/ŞŞÊi4… ڂËd°FN>pàŽ9‚>ŒŒŒ`R>/EQ¤Ú5ސH$$Jm4Œ‹/JY5zÉĊCĞĠĜħc8x |1 s°,‹şş:lÚ´ ÛĥmƒËíĤĉŞÊ‘œodw;S|ölÇŝJŠÒlúĦKŽ³Ïœŝ–˘¤ÔÙÍU@fv`˜[Ğ<ĤÙvC,3ûµĦÁò<œÚK6°Ä<ğÀf#)Ìäĝ@íì<+e ;yL"„Z­Ĉ‚ è:Y[[ FƒŽŽêŝH$¨ qħQˆ¤ëËŭ–N'Âá04 0>>Žúúzĵ÷Ŝ{”H‘Éd´:pbb˘ŝ?|çüùóħşş:ñ3ƒïÈǟ˙ügqpp0sñâĊÔÁƒıßŝö·—=Èż˙ûż ­­­ ­VĞĴJ§ÓN†aTٟ.- fu:***`6›1660 ˜˜˜ Ñà„ÒM>4²Ó49A˘Ñ(†††¨‘ĦDih£²#ŞĴĴDYY2\fړ–\èäà+ Ê“ËpSN:%%Š"VÒ9‘“' âùçŸÇéÓ§áp8°je3ôz=~÷ğßQ[·Û îê…^ÀħcÇP__{îıÍÍ͔á266†W^y===¨ĴĴ¤vAápçΝƒ^£ÉhDDžvtut˘Ĵ¤ó**Àsœ4„΂²á·ıĠŭ3˙~68OyŒˆE&“ÙlĈħcÇŝ'OžD;ñd‘É–,Y‚T§s IDATĝîwħxñbL&T×T@£feöP\Fb“•W”Ħ¸¸û÷ï—JCx°**VAd’ ˙„œÀbĊŠċju2i& K–a(#O­V£şşëż·Ür nşé&ĴnnĈĤM›p 7 İİ 4X2‘H@£VIŬ´ •LÁ ×ƒ+Qş M’Ħ²²÷ŬwyäĴ\µ F“ İd*FrĜĉyêÎHù`ö²‚Dş6²ğÎĤ:ZĜîJ:يҕÌ~>‹˘”=ó!:Ħ™3ŽË.N‰qúîŒapĵ@;)$¤ˆek!-(Ċ³ä”ù$ş!%{•œ_4n^ÉN˜u˘(ÂápPHNN eÙ))èÄ šPēɤ„ŝÈEJ)ĝ%k˘rfF 3 ½ùĉ›ñá‡RM¨ĵ‰fRİT(“ÉœĞİİñŝúëÂg^”äcǎĜ}{Úï÷GñxħßïŻ2şH$˜ÍfÄevĦ’7,\•J…‚‚hµZ˜Ífì&2üV^„ÉD‚’HëIRcħÔ gqr¤ÓiXez7/\@f+Ĝ³ßB~PŠU^ :%Â@œzğİmûää$:Ż×+@áV\‰ŠŠ äçç£İİ ÍÍÍ(,,Äèè(vìĜ7Ŝx+WÄC=„ĞŻÁ`Şö˙ĝÇ?b÷îŬp8ĝ‡ĝ477Cx<ô÷÷£Ğ³ƒÂB===èééA^^*++.P˙3%ez&ÙÁġġġáĦC2­]tZڅdr€ÓíF:ÍÁlĥÁhÒ.‰tY–AUe%>8ô>ĈÇÇĦÓê 7ĦbY¤Ò²ĥDá„a·ç€e„‚LNNR_C)š‚A*™”¸|,‹´ĵ1be£Ŝ¢bd’)\8‡?8ŒƒïęÖVĝ}~ˆ‚ˆ`(†a`³Ù`·çH /RŜú…ġxĝá‡ñ裏bÉÒҗâi4EĉĵÈp—ôsĴjÎ^0gë‚?iqš­(ÍCšĞÛú[fJs,Aç4Z˘+Ê˘|Cfì˘HÑËv!{ìĜ1<‡1EjA˘Ċ•ŬPĥˆÜžĜŻ‘My‘HHËĉÖdM"dmiRİœN'ìv;RİíÉĤ›w”n<?%ÌוaŒdœ@ AŻ×‹ 6`||œZÉŻ‘aY–Íd2vğ½ĝñÉżKQ€={öˆK–,I›;;;kĠjµ‹a•$“†îò¨¨¨€ËċÂ0bħ‚Á …›ˆ£-éX2™ 4òRîPH$şÙläÊMô8$s„´›%%S⅕ú²+Ŭ”;L&µÂyBiùNïC#ÍÏтDz cbb ˘ĵĵµµµ¨ŻŻ´µµaïŜ½H$Ĝĵy3xàÒÌŞœœü÷˙7ž~úiäċċáÁÄĉ͛iT„ǁ^ŻÇ‡Ç¤œ+£ÑHüäää ŞŞ iıSÌ.(ÓuJÓ&R”fúۙî‡üL y_9ŽCUUJJJîğï"“L$M3úeA~A!ĠƒċçıÁ² ’İ$T,+Ùd2`U*,\ԃN‹îHgRPİÔ²6M‚OĵŜqùഝ; żÏ‹@`%Ċ(*ö “áA€FXž‡Z£ç?ŝğvíÂÓO>‰—^z oĵñZZZ0>>Nqžç1żĥ˗/Ç=÷܃ĠĞŻĊñÇÑsħMMM¸ïû£˙W]uX• ÑHDêÈeÍ0à`^àéj µ^Ŝ“ĊEéñI™fsAzÓ.蘃Ŭvàì]qnï,ú&žĉìÔfíÀ‹òôş)†.îN#–joĵñÒé4ĉ͛G;$²–Û*Ħ;%|GŠ’²ó%E‰8Ê4N&’ÔZŒ '$˙è‡ˆ<ĥÉ$%<“ü6%Á!{Ĉ,ˆÂ”Œ%%bD aµH’XŻôéÓҎF£Ĵ^ŻW³,0 mĝBÏ?˙ĵĝw)J½‡ËŸ:y*a1[JúûúĞÔ*•˘È°j4Z ’İ$â‰Àóĉ àġy›œË0PĞTˆÇb‡B€(BĞрU´ÙDښf2ɂ3–‘´ ˘ €e ô÷jµÂ‘€ÛċÏqȤ3°ZĴ°ZĴ€$SÉË)Äg.•JA£•)AÀñR62ÔÒ%™L7Ÿ`ÎÈÍ͕“q3…‚h︀~ŒyG‘L&`2QY97ŜˆĤĤ&@ħ—‹—^z ;vì@AĦßyAܸiÙËLĞÓ"I£¤´>?ÚÚ΂eU0M`#hoï@eeŠŠ‹è‡¸f¨‘&Š"eùO5a+² T,µŠ…ŠedÑKú&F”6—ŝ‹èV° ‹d" ½NˆË°ˆÇâ0€Ëdúá 0‘NJ6=ŭŭŭ‡CXµò$’ ¤ı \N'´5 Hp Ġsr–Ĵh‚Ŭ‘ƒ‘ħQĝü~ēqp| #Âb1Ħ˘ĵW-Z€•MX·ö:Ĵ_·ċe%j´hdŒÀ°,âÑ(û.žüġŻñûßŭû÷íı 0 JħÖ˘V­†ÙjÁĠK—àÖmÛpïŭ÷ŜûîǢĊW£Ĵ˘œÀ£l^9~ú³ŸbŭĈ 관 i´Êf)üË^6ĞœfıPgCPsQ›ˆ—ŭÄKßCœ½SbFĦC˘t7‰u'ˆ—^ŜĦpYş£l]Ò읔 €jDô+ù~&NNmS/³DƒQ/È÷ĝŸJ×%ë.âÀO qé2™Œ$fĠ鑖!-e<‘’(Ħ;eB/ñ#Î(^Ż===à2%×x<ĝŭ~İC6°‘H„’¤ˆ œŒFÀñҙ 8^Úħ*IĉÀËER£ÑPò•ï )F¤¨ñoĵ§OŸĤEradA †üüüîŬğw_‘{¸ú˙EQşëîŻò|ëÛ# uğŬfA´`Úuĝŭ~´ĥĥ˘•••(//‡F&$“Iš1D <²€*mqĠ’Ài„ĊGvijŽ8ÄqüùÏFWWıĉÔÔÔp3bɣĂ³MÉÎ>;Rıx( th6›ħzġj,\¸~żŸî„t:”[,’UωtXš››‹ħħ1<ñÄ8~ü8V­Z…/o˙ *++)†ÍÉédèŝĠŻ~]]]8qâÄ4SÙùâ‘GÁ?ŭôŸ°rċJjd4İg!q“PB äB!ĈŒ/&‹&‰h&'ħV£§;xrq)u$ۅ<6r­6öµŻa¸ݽöš”JĴĠœ<~O>ù$ûŬïbhp½e%EPݤÇà2"4Z –`ƒ­[·˘ĦĦAÊJ’ğEEEp:pğò¨Ef˜Ÿ;v ŭë_ÑÒ҂ÑÑQêϘÉd” ¸ĊbÁüùóħzġj,Y²555(*.ĤDŽ`2™pï½÷"‘HÀívÏ9ïı’N‡ùaıOÓ5Íże˙˙tŽsQşçêÖ²ÊŻÄĞn:17ç”TçË 3Ğž PŸd!ŽC8sĉ êêê ×ëéĴ†ĝ…*5³Í”ÈÂóuëÖĦ  F½9N'5]­ĴĈèè(ĵ^/,Ë´Ĝ9aፌŒà\[Âá0½P&>êt:˜,$ x½^şž?Ħ™Íf8N¸\.Ş›";“É‘Àˆ#_RÁRAdXhúËÈÓy`e³ZțNœ-öïߏh4Š[nı‹-B*•’"ċcQzl’É$"‘‚Áà%ƒÛ¤4$ „BHsò ^-džtvvâ‰'ž€F£Ûí&ĥópğŬx<°Ûí°ÛípğŬ²Ç›qJà—rŝFv~$Y8NcÜ !>Ÿô‚E .DEEŠŠŠ““‡NGóeJÊËñĝŻÇ·ġ-9rLH› Ñjñ_ü#"‰$ÖŻ_šš|?ŠŠŠ`³Êí*jV“Ç4¨Ġşlċ'ŭħĞĞ ÀĦC‡ŜŜN7?jµĴJF>n•ĊĊhnnĈġ×_ú… Ô²EEdd/4–eé.”ĵ§Êsh̔‘ËÇĴ…ço(J?]·t%EéÊ(ᘛ½šK$NS´pöGÔĈHîúÉûK6žÄpX§ÓĦ§§Èq:%´„“›h4JĦ?%œœ'JG}r])gâ¤KÉd24ÚċrĦ²²ŭŭŭT“˜mĤ,*ŒŠ½Ĵû!h!(d‡Î˙Üò<îînĴ]ğèééĦfžçġ“““W-ıpá€Ĝß­(‘né'?ùÉñĊ‹ŸzóÍ7ˍ:­]£Ñ°rK&“xóÍ7áñxŭïŸZôÄb1˜L&ÊŻz½°Z­SÌZY–ENNl6jjjàr8pôèQĝ|>şp*wĵBHN.ÒyD£QŒŒŒLÙyİĠjjK`*Ò=7rŠg#˙ËĥìPÁJWrċĊä÷MPKYYvïŜ_|‘j’éeÁû$âMrLôz=Ö]‹P(„Ǐ#ÀápH(-=žVĞĊÚµkqï½÷ÂápP39^ٖ)ÙjnµŠò˘Ż›2 ċ8“““G8FOO†††ŜŜN x­V+rrrPTTW6[~ùË_âñÇÇ믿!aÛ òóñÚĞŻ`xp+–cáÂĞ(ÛI­VċʁÀ%˘‚JE#‰ú=˘§§ǎħcÇÓӯ׋D"Ac X–•ÂÎd3Ë 6àşëƒÓċ䙌 ˆĊbF!ôXCŻ„ħÈı§–Fĉü`ĉ.FŸ¤ ŭ-EéJ£)>‰Ï•P½g/,Wf7t÷™àÂécĥˆ(ò=ıFx^*,gϞEAa!rssÇfÔ&‘NƒÜ?!Í\ÊGƒ”Ò,[‘9á 0ii)´Z-‰D•mĞDmâÉ]הëWv²´2Ê=UJ×sżßóçÏ£ĥĥ]]]Êômm4-ôûŭĠ}}}†ŝŝŝxiiİĝw+JK–-ċ˙éŭx´ğğûè²eˏ~xÌl³Ù´„=bµZ166†·ß~ĞWŻĈŞUĞ 2€V݃ÈHX­ÑlBaq’é’éˆħ:¨X8'HÔD­^‡K—"  Ñ]Ż2Ŭ–ìTÉM…noU²W”9NJ2Ò¨u(**‚ĊbĦ'NYYòòò`4Q>ŻBĤÛéÂO Kòzyž‡ĠjĊàà ^ŭu8p€ĤSêuÒcMNNb×]€[nı%%%S"0sÜ7ħlRCo–£NRÔ’ì )ž°* îŬÛۋ>œ?Ž\\'JJJp÷ŬwƒeYĜ{@ÒVD&áÉsá#ċ#̟?U5óQRVŠü|”TĞSSÑbĝ|>´··£ĞĞ dIĵív;rssiGXS;›6mÂġ×_/%ıÊçéˆDıh¨µÚ|q•F ­^‡t2Eßr Ì,bŻÙá½Y"ŝi]ħqŬÎÖ }ZG铙ÓĠa:]ҕ>2œÓuOÊâBqµZX,‹Ċ"Y˘9Xż~ŭQ­òï² Ÿ²#3I=F§hûrrrè5¤Óéàvğárı ×ë‹Ċ‡İϞrcìp8ĤĴäzV²˙²½ÙE9;€ËT*….Ĵ\ıR²t“4dDEŸJ GGG~ż?€iŭâ˙?%yы˙ëżŝëñşşş]“““v‹ĊÂF£QhµZú&>ŝĝ(..Fii)òóó¨jÙív#‰`hhˆ.ö$9QÉ﷛-¨¨¨@{{ğä ³òhw¤89•,>²eB‹f³™>†256Ûĉ…j—ô ×eg]ÒŻĜá”S%-˔ÇùżÔ½Y\×y&ĝs×ܳö ; !P\ÁÖBɤìĥe·:ì==nk3Ëíżûq"ڞ …ċ~…l·ü˘ -YĥĠRˆ¤(ÉâQ €ÂV¨-³*כw;çÌÍsëä­{3 „l˘+˘¨ĴÌĴÌĵ÷žïü˙˙-c“q_WRÚċĊĥm¸·%ŠB²tä{1 F³³³ĝò—żŒ{ï½?ĝÁpöìYĴ,ß@½^KKKĝú׿Ž3gÎà7ó7ñX§HpQ+S•ät˘–ï[ŭl’‹‚ĴÈäI½cǎˆàÒ?İ-`}}çΝCİTÁTKU|ûï˙ŽÛĈxıͰpĉôÛxó×019R ĈĈŠù¸"LRÈGΎH ÓÓÓÜÜ>ŒG}>ú(Ĉ&Ĉv‹ê˘ÁĠµr‹Ú½~ùċ,QVIêŭQ‰Ûħ L#fP#Ĝwۙ#jlħ !*„Upá#@ [*´Ö•ş“éÊĊbNĞ?ĉôéÓQÍÑ#ıU*ħ Ô dii KKKq7ĤÛî`rr2J‰í·ûz½^|N8p >çË·ú·4C%$G Ş£MÚJV?*ÀĞ~–F…BǏÇÛoż­nÚíF£q|qqñî˗/_ĠÂûWû|€ŭîúßoÔëġ—>ùÉO>ÜsÏMÓ4ċ:>>ŽF£_|ßüĉ7ñ•Ż|%^˜ …Bĵ¸ÏÍÍĦÙlĈ”myĦK„×4 ­V+V2ËŜĞ\şt Ïŭ0ŠŠ—Îì½^Ï=÷.\¸€Gy<òŽ?ŽÀ4M´Ûí{˘Q;}m½dAĵʅ]öڃ Àܞı8—!š-Üuìîżï>ĵġú˜?˙^Ċêê*,‚kġÚ*êµ k¸ d0Ü.ŸÏcffċr³³‘WàĦC‡ÄOàᇆiYü¨í'Y˜R0èy^<Ÿ”:˘$àʆ!ĵ‹7(rÁ"ß3éĜ~+DÜDĞî_ƒ}7š7œnĉñ7ó˜4Ĥ]訠•žd(BşïK˘ŒüWúÉÉsfçΝ¸ĥ¸ˆŸüä'(Uʘ™™!d " ,e·CÓ4t:,,, ^ŻÇ•‘mۘ™™Ĝôȍ Œ-—aéÛ)7íŒ1t{ÎÀûSIާ_Öy£nĴÔñ‡ì”\ż~ġzÀéÓ§U ½ÓéìY^^óúġëύ% ˙_ùßŝ;óŝû^9_¸£Ój^ĵ~Ŭ*•ÊàŒëïŝàÒK¨VĞ8yòd\ħH‘˙Öëġhî/rрB.f³‰wß}7ĉíËÁĦĤi0 žëFvE4J!ĝ>rĥï@Z­Z­ívħ˙~ÌÎÎbbj …b…b¨Ž!_(À²m€è† (sEÓt†Ŭßĝ!<χïC†0`‚œ p"d8gQ'‡ôÓ6‰´@‰4şıGpÎ ó"Ŭ‡ˆ‡—j²(çcccxĝ‘GñCÈÑc°í\ôZü++Ğxíµ×qĉ÷Ú+Żañú" ùf§gQ­TA E„Â` GqrÁÒgYġ_3•z& 0ÁÀxĜ×vEïD€ íâYt,zŭփk˜Ŭı‡§>÷|îsOGqàŽCŸ@İXÄ=ğQ-ħ{Ç,fggħ{÷.ìÛ·ŜO|âü1<óÌÓĝ_ú~ï˙ĝ2ŝŭ—„§>÷öíßÚ÷óò?­öÏ95B%˘~˜žPrƒçœÇ.*ƒJŬIfѐ0ô{.éR²Ċ#‹-2ĦˆqÄÈïáyGdSÀ´ċwHoÓ?2  Rż#}R˜’ħÄ6żYĈ–ƒ¨š$Á!@û·>G˙gŭÌ$ :ıxĞĠ§¸+H°:{öäòyt…BívWŻ\ĊôÔÊrœ%'?{Îx_KeNùžÙc1Ž3§ÏàÒĊK(äó zNûìÇÌì 4]‡Ós@5 Ò“SMƒ@ô„ü €ĝA PĉĜju”쨕Ò^_Ĝ-²¸ …@ú(ċrGŽÁ›o ×uċ!0ÎOMM½ŝ×ŭ×íżĝ‹żĝĝ*%xÁٟ˙ùŸ×ĉß?{}jjŞ·¸¸Xt‡B@ÄĉœċâĊ‹ĝú׿ĝÔ§>…]ğvĦÑhÄ™ññq8Žƒk×acc•J%˜ÊçóċĜ·Ûí¸%§êŒ$şĞz$9—QuJ’(c3^}ġU9r=òöïߏjµŠZ­Ó~ƒ ˆŸ#if¸kì,ĴħâXĴɐS~†²Í™fÖ*?šˆ ‘ïQRYYßzHÚPJñíż˙û¸zyúż€'~áÔç?ÇqpġêUlllÀ0ŒĜQ>WħXÄää$ÊċrD@ $ŜIĥ_’AôqŬĴ#CZ êvŸkğş¤›Ñ)Ŭl%´˜ÈM·÷Ò*l{Ħáf­ÉyQ1AêĠûZ–…Ŭğwcǎ¸~ŭúÀĵwcc˙üÏ˙Œ|ˆ7t²*W%(SSSX\\ÄùóçqċʕxÖìġû™™™XŻİê…ä5˜FTH äLKuĤıÙsr@\Ŭ Üwß}ĜħcGĊŜ˙ŬjµöĠjµ]Fc@ħVJëżŝëäÜÙ³ÓBˆcëëëSžïk– $ċŽ4ŸÏofÓô‡qÓÓÓħŜGΒ|ßG³Ù˜ePJÁ/½ô^½—Ó*ıAjETEvڎRşHµv­VÊÊ Îĝ!şŬ.&&&066+´ +|ÀËJž4IrUx€ g2JS/VĠ›.9çQżÔrž³Ìîıç<òÈ#8|&&&àynܸÓ§Oġ×_Çkݽyĝ­ CLMMĊħâì%‹-9]×·äñ¤ħ’dĴûïżo~ó›¸páñöÛoùżˆrµ‚s;áúĉvïŽı˜š™ĈÎ]sĜ·g/öìŬ‹³³(ü}0v†iĤ 5ˆívùşY ɁĴöV’ˆĥ9R|[­ĥQ3ìJi˜8È;JánŒ‹TÏğ䂝ĉK§Ú˙¨‡Ô†§ëęprö[êËP–––b͛œ‡Ğ›(B._ŒóçÏcqq1Ôljż'§&*MÏ$ PâŞóU¨Ò éş­Ä1qn†AˆF£ÇÇĊƒ-BH·ÛċrùòħcÇÎ=ûì³ŜÇJ_ùÊWĝŝÇ÷}Ûĥv:­vÛ²mĴ˙aHĈIXYY‰̉'P,c×z½ŽĊĊE8Ž3:˘”âڕ+xë­·âİ~àR@ĞîċL@²ÍT]Ñôô4ùĠúĈ\ı‚K—.Ebʝ;öaŻ×ƒH 2Ġ+s IDATıé[%+›€JħÎO#dĊŽKĜK´p1ْ”è£GâÁS§İOŸĵçÌÌÎBÓuĴĠj˜?˙ò/?ĊÏ~ö3ĵ xùċ—ħ²²‚BĦ7¤‰ŞÑRO|-6ĥe ċ‚”â\ĈjµúĠŻĈú´ùùy9r…R NGÛ&Òl’sŻç"èĞÚĊŠœé™Ĥ‰Ó8hÂÖg; ·3(}=Ó(Ê÷ Œž!m§ÒÉÒeÒĉcy*u;Ŭ! Ŭ7="MšöV=ÉssŽÙ™YĴbqq1îÔHávğĠĠUlll VĞamm ÍfF×]üü<._Œz½·ÈğŬnlUĥgÏĝ}éJ.Pe&IPJžĴöÜ0–â Ô/{SCIô~÷îŬ‹İİ)œ>}:%ĈeŒq˲>Üż˙Ï?˙ĵóħƒÒßüÍ߈Ožĵ›èş~4‚“Ë++yı Ğ–=R0†!&''qìĜ1Œ£Rİ Ġjáí·ßĈ… b6‹Ü­·Z-ĵùúëñN%i"wĊŽÄV3­V+TËV”ŒN7 >ú(rı.\¸Ó4aġi™çϟGĞĠ‘#G0>>&CTÀˆ\ži*mU:İb8¤T›ÏEF.:i&ž1H÷gRù|{öìÁ#<‚_üĊ_ÄİS§pĝaLLD”Òk×áìÙ³xùċ—ñÜsÏá§?ŭ)Ŝx @ĞĠ€û#I Iŝí$Ó' CŒ;ßùŜ{ï=|îsŸ·żŭmÌÍÍĦŬnƒhĈÇÇñÉO~r€H"+1CÛ<–ÒWúüB@5:0Sy;yD·[û•çv´Béí->‚η%–ŬN ^úύ\³\čĉ*x”ÒÚuim/ġ[VĜêŒIž‡Qô uÍf3&>˜Ĥ‡—şkVWWc!½^Żıİ’vVҜÙíË5Ôĥ¸êXžF9OJX²Ò·%fĈ E›ŝ|>S§NáÜıs ôııı׿ño´˙ò/˙R|Ĵ żŭ[żEjµÚ4ôĜòÊÊTšaìı[–m&Çqh4°°°€ï˙û¸~ŭzĵ¨Èك,}ß~óÍ-êy5Ĥ˘ĠjĦ\.ӟŝ4Ž;† .Äì/ı¸ù|>N§ƒS§Náá‡ĈÚÚÁúĥEù|µZ ĊbGŬ¤—+‹nškĥFéĊ‚R’6›ìĴ4?$(e Ġv˘\œĠŠ&>aˆ _İĤavÇ,Ž;Ч>û|ŝ󟏁jǎp]×]ùóçñ½ï}/ĵ^|ñEĵüòËx˙ŭ÷qĈ tğŬè‚ö@XĤ Ë0ĦS ° 9ÛFÀ˘cĥ{÷nĵóÎ;¸víZĉ¸ĵĵŒG?üû/a|l­ ıˆ°Ĵ’$iA2÷rı|AÜ}÷Ŭ°, X^^ŽKaĠëLF8pŸ˙üçqùòe´û–9…BÍfŻĵò îûn?~kkk°\ĵİ7>Èt8—p’YeݏIkéĊòÈD,v2ÁRìĞ÷U]Ñe*ky?Î"*÷ÄÄĤ§§ñ™Ï|„D䒅…ÌÏÏcmm-Njŭ7Sƒ- yˎĊĠjċr…Bù|Ĥiblr­V ÓÓÓxìħÇpĉÌĝ7nàûîŝŬ{ÒO~]³ÙÄÚÚZLL !b]ÛC=„'žxGމEˆĊr)vz–ğRùe[ïĥöŬ0úvÖÌèf[wI!ÓvèÛé:£t@R]À‡µ˙T›Ĥ4o6¤<§úwO·Ñ‘‡\Ĝ“m: Z2ĠZ^?rŬ’3ž|>••TĞUœ:u*ħKÍʆ•%Ż1I–*•J(—ËĜğw/*•Jâû‘äßt“PSn“ŸErF–l=ŽŞ”2[ż#öd²Ó%‹ˆÙÙÙxŜÖ7°[­ÖĦ7nœX\\|€÷ħƒÒɓ'9cĴ.„X#„„êÎ]Z˙4›M”J%ĜĥkuÊċ2 ÀÚÚc˜™™AİTÂòò2Ν;‡%Œ•ÊéŽjKÎ÷}Üu×]xìħÇ`YşŬ.ŠĊb,3 #ĥŠi6›˜››CµZĊúú:8€Ç{ ßŭ§Š—Ĥibii ?úя°{÷n 0ÁÒ:9`N’Ó’hĞ%ÙwbKğ/ÙCwör.—ôܓs É TK}yÙĤ½rß÷QĞĠ ëzUŝä“OĈğBi{Ĉ \|ËË˸riŽ`ii [ħ ċryàuʖ߅  z›ŜcÒZİX,b÷îŬĝì§>GïÄÁƒQİTâžzĞĠŠ }h¨dud(ᐷó×vù†ÑĈ·Í ñ#ĜVŜÑ0ñá•I”6SLĵĝ‚ ]´“âÑ4⃔'ód÷†RŠz½Žbħˆxûöí‹cĈÀߓ ĥluONNbzz:ž­ŻĈBŝf³ ™² şĊ¨‹I°M²ï’íÌaíşíœ'É/)ò÷<—/_Ĉw܁ŬğwcffĠjşÓ÷ßlcccúêĠĞĈÇJ —_V!/ŝà˙üżĜüüĵgÛvh§ Ôt° Œ,†úĥÒÍĦX,˘ÓéàŜ{ï…eYxë­·h4 ë:*•JLï•ÔI)œUos]ŸĝÄ'ÔÓżÍ2á†AdRŞ´÷TÛMğöìA/ˆv$ŭ“xç½÷°°°G58ŽƒK—.a}}•JĦ’l+wBjöI,|4QĈ#ŭ‹ĵ‘·M°Çy°I'\^\9ñċ;dhA!XĴÉĜü8áyé6"q+T7Á8˘)Bût@×qÑu\2èJ\İV195…OŜsOLYUY€ëĈQâA ħħħċ"R½Kċ2lێ=ód…%_s§Ó!jëkƒ šĤ†€ù`lĠJSV‡ĉ3ÉċGiĤ¸e›!ĥíVßÍSô÷‡/NŒßf[Y~ŝħ’pÄö\š€ss%ñŭM›ŻhÊSLupIŝĞ Y 551@Oj´Mìœ@Íá¸=8nVÎĈĦ;‘;ħĥĥ;Hù„4„VŬ@­fTıëÑf°Ùnġ³°|°ƒ1€3 Á7  pĝa78ıWĜżˆ†P8à}Ŭc´1àœ €ĊòAşiëD¤”Ĝt'7 jHá•+Wä“OâäɓħXžsŽC‡éN§xŭúuëƒ> G+(Àììlpĉ̙˲”ÒqÎ9u8”Ä%ħô‡[__Ǐüc”ËeÜ}÷Ŭ „`~~/^DİTŠÙ_šĤĦ½ÑˆġK•JFBœù$òù|LávÈŽC²³Ô!ĵiš8räH~'8€ċċċĦâĈĈQİTĥ,,I˘Bju¤ŜžÒN“żcŭPĴ…s[†˜Û\8ĠĦÚßPuTÉ ZùHêyè$pKrùĵıĉ,kĦĥ*N^ài‹ÒftôÖ0ìŭİŻa˜áçϳ=w+•RhĤ½ádƒÎS]ĵ·“Ħ”ĉĐFñNËġQI êĤ!mž˘úŞLµdğ+*bÉÇĞLÛdkQ}[â*Ôû¨ú§´V\Àĵ(X,Œâr"Q³€‹7„ôǃàÑÖ# ìSÜùf…JĦC·)€a&”"°' Úc*ÙÍr~/{–––âûĉr9]Ó´]ŒħıĠ4½Òż9(:tÈŭŜ÷÷žeYĜé   ÍIŞöĊ‹1>>އz÷ß?víڅçŸW\ÁΝ;8ƒD &w#„?~=ôĉĉĉ ü¸Ôm4"K^¨ë"ŸÏĜħc0 =ύ‘ÇŽ[o½Û˙hš†>Müäɓ`>ßÒ²SA)ÙÓOÉXŒ]żöÑıMﳑ÷Ì\À’·'˙UĠYDŒ$í: ÚNßÈUġ¨·ŜßMfħeĊ“ŜÍÊHğİıÍvcĈ˙5‰ ۙ Ÿ àdEr³ÑÉJj”^( FéŽÒRv“ĤĦêı’ÖžS7'êmibÒ4PJ¨QZİ$@J·ú:U3Ôä9Ÿ?€ĴAà ˆİEÂûß 0Ž0ĜĴujö˙.*(p(cn¸ÜW>OÚï @0°0ĦĈó*k\£ÑÀúzDüX\\ŒÛ›†aĜšĤsçîċċċn PşëğÓ4Ż!.BBäĠ •² ÷Ŭw:~úӟ˘ĠjáñÇÇ}ûÄOàôéÓ¸rċ \×Eı\Fħ\†èÛ¨‡ŒáèÑ£¸˙Á1>9‰µzşiÄz‹‹‹h6›9"҃m˙ŝŭĜısg\I‚Àž={bĤžäßK²…ê&ÊfĞÇş÷½ï„b ;8£^ŬdUə”ÚR”Ż;ş˙­îä˙~2ĉb”ë°Ħ„àİŸW<VZĴ[?1~i ž5‹KŸ4PĠöÜÏ´n…°Ŭĝ‡aÌşôO:Q!kĉ”UÙ$ÙaÛ%ÀÒ*”Ô*+ ”Ò~NΜ’À*ŭ4Ġ÷™4tM,Ù=iUK¨VSÁXĈ=pp€n:U¸½ˆ×ëyèy !`‚Ä`FXßġ„„ !€¨ Ô¨’Š>[M#C<äĉOúM:Žƒ••ìŬğwÀd–1ĤsÎ'ğŬîÎz½n~ì3%8v×qñkżúĊ^½^ïèşJ0`ŒbS]-O ğïğvíÂWżúUĵûîğp]§NÂĦC‡pï½÷˘P(àòċ˨Ġj˜‹BdHߑ#G`šfĴG˘z4ïġzXXXˆÊËj5ŜaKöŭ÷ߏrı<0×èġz¨T*qĞOnéŽ+ŬzĠ‹I]<ċb™ĠžROFÔÔǤ9A'Ğ–Ĵ…3ê “-V °m·Í—Ĥ“R[Iò†êô00‰6Mò3H>>ݵ’@ž"[÷dè"ŝŻM53şYö]’ˆF4¸™™ÒvˆI—ía”ä&"ıÀ§Qš“Zĥ¤ {û,e—ĊFËz\Z›/ÙrT]‡UK*Ĝ$AUŬˆĤ/˜`àÂhôy\À 8Ÿ£ĠŒ„µ!× ˆŞ[t”êD˜Ó ~äÈ|>AJ#´Ï<ó99'§á6ÎO€¤¸>—Ë ˜ĜöqÇl·Ûäĥ%˜œœäġz]H~ìGgèPĞĠB§ÓÁo˙öo£VĞáÙgŸĊüü<–——£Ê¨XÄÔÔ*• ŠĊ"c(älLÏÎ`rr‹K7P­VcËwMÓpġêU\ıreK Éq;v Œiò5qÎ!Èb’' 8h·Û(”Šİ ßvġ/êâŞîĝ³*4`HsŜÜîŭçW)eÍÎÔÛÔ2èJhXڎSVuÉÀĵ$ègÏ^ÄÇŸ_/—Ëíf³9N£/,Œ] @ħXÄüü×u÷zž·À˙ĜAéÎ;ïtżóïœT*/_ĵu]½Z­BÄċŞ|ÍfóóóxüñÇá8ĈĈĈpè!Ĵ­­áĈq‰ğħħ·ß~ûöíììlüaɌ¤z½KÓñ / èı¨–Ë`Ak™ĈĈĈĜO ×Wg˙G§ĠŽèŜ\àµW^CX–ŻÈJ`çsM#>)UákÒ{J–Żê/ž­HżĦiúfP çĈ~*3e­‰2‹( LF·0Ԓ;ßĈiS”ËRYƒdËŭ `7í(TSĜ8³F¨?cà÷2ƒ‡@Áç‹#˘ûP:šx0Œ°V'>œ02J`ĞVŠİÀ •VIfjhŒrWď[üĜ*vŬŞQÙ<Ĉrž•5Wù‡9*HFZVĞ-‹(!Ÿ'9çIKy–,›ö{ùœŞMOĝ%…ħjG%9‡Jc zaà$˘|!@x?§Ì <ÚzˆvφßƒòĜ˜ı2BŬ€mƒh‚š`Ĥ ĦçÀ5BÓÁ…Ĉ\è@ „ ^~ùe,,,l)µ !(‹ħ’yû+y{Ú}²˜Pr€8ĴÚ¸™wÖâ›5˙‘uFVK/­jÊŞ²²~?ş’ŜZÖr֊Ìú̒÷ıUñ‘•PÊkEÙŜn2Ĵ‘í´˙²*Ħ´|°4Ħê°ÖVĞ-éĴ 2Ŭ²€%Ë`4­íĤÎlÒ^Ü$f–úû${OmÏİ@§Ş­ŝ´ÏAÍmÀ6uHœEÖI‘@Ž×#a XG8 jċ!4†]ƒŽœGql ùRZ.Nu9÷"ŸžÁñ\„,Œ6"Ú(ûɍĦĵó0JĠZKĴ_9 ÇmBĝ]äĈ&À nHÀ‹ŝÓ ÍuJ~Ö2ÛN&áö×*]1†áLŻ×Óo‹™Ò]Ÿ8Á?ġä/t´9çĦeYh·Û =ž+É7à8N­;55…ééiĝß÷166†;v VĞĦÛíĈs›••t:LMMáàÁƒ°mhµZ1€I×^ĜµkNž<ûĦé 5™sŽË—/ûß˙~Tmġ)ċr×§ë:ŞĠjF”Äà wşi$ˆdk/í>ÉĊ[mk%™gI€K£CgR&}}䂛Î.Žií£tÉ&)$ß(ÚÉ!İ8ìkT%%F9BŒ j kŻmÜ0œ3Ê(”3Ĵ Ö>KÚ÷dŭœÖ K›%A3­RÊ˘šgıfÍzTö\қ/kF”ĈĜË"Vlfġz'hġ(BFAŒr)X1ĝܵò°ÇĈ15½fÎF!_‚•³#’˜è˙@‡ëúèttœ<—ÁYä „6G@mP2Ž\)‡’fA£Ú7Ŝ‡Û]Ġî —· ċ t{Ħ Q€"ÁĤ{ıƒŽġġġĜûR2úÇI ‚Àìt:ôĥ%°m›AÀ¤/ëtëĈĵdË]¸p!nĊċóy0Ĉ°fíÙ³kkkX__Ŭn£Ŭnó<ÌÍÍÁ4MLLMhÚí6şŽ×uħsçN9v šaÄÄÎyL˙>wî^xáœ>}ċ~Eäû~ œù|ÓÓÓ[’KE†£·<é’5{)kĉ”–Ó4¨sÚÚÂÉZĵ“gĜâ?gJU4X‰Ħ`1êç›İjÒnK3M{O£ŞŞíTZ‰Ò=Şi#$nİRâœmëù·JYĠȰJ)-hN]àÓ(ÛIPJ²÷’íÁíVJi€ŞVJi,ğQ 4r&4„<ħùYm²í8'}[!Àc4ĞÓ‡fW@Írv•ħILÎÌb|:ÒQٖ%şĤAÓt¸4€S˜FĊ˘ × Ñîşh·zè….t@è:ĵ@GÈm”JyT÷ÀE}ƒúu*`l0AëEŻQ×8Â0!Ĉ–sÑhÄ6JrÖß?NTA¤”ĉĥJ‚z½Ž‰‰ Ĵ"—Ëm9Ùe€Ŝêê*Â0DŻ×pÍívğèv𘚚ÂÌÌ LÓD­V‹ímt]Çââ"–——ħsçNÌíˆÜŠĊ"\ı]×1;;‹ħħ1Ĵ­­Ċm;ÛĥĦë:._Œŝ‡8}ú4 …BùÍé›!ÎTf1770b*¤ PIGĠE¨JyN[PTvÚ°6×°E+ Fµ”ĥ°Ö2,’UĜGiŬ"Ü,Óm˜ĝ5ëïeä󄰝™Òvˆ ·JĊµi:˘az4öĜ0Jw %ÛwêsfÍwÒH êL)Ğu˜E^Ï"$ƒi:£´×;ž˘ÇB ô8xdD˘J)`‚ &FóÈÛ0sUÀ(ÀL`vç^ŒMM#W,€ ‹ä#Í>ˆ 0&`ç 8°s&B+oÀ²)œ†_£6:š†ŽÇ…v£°@Tĉ|ŭğè¸ĝèÀΗÁ‚hÄA ÀèŸàjlëşü*-^jQoPÚ³gX]]ġ>̖––8çœ ÁĵÑd+occ#žµZ­äE×uQŻ×aš&*• t]ÇÚÚz½Ŝ€èµk×b÷ïBĦ€İ™È×ÊÙX¸rù|Ċ|!Žö~˙ŭ÷ñŜ{ïáüù󀉉 „ŝĤMSSSÛrĦŞd‰4OĴ4ƒÏdĝ<°ZŠ~GB'wÂɊ!kĉ#˙VÚL*uNħ‚  £Zf£~/ĠĴyRÖç™EAĉo7Ĵzú¨3£‘ ´ÍTÙÖşn¨šJi•R­;‹U6 ”T¸4;Ÿ´ &­ŞKĥç²*,˘CòñiÂZ´²˘Ä‡Î‹RÀ-ùĜ0äQ·†à\€ d!×ÁıÓ.°Ê z†YDul“3Ó° ExaRPh !ÖÀç2a(ĝ..ÀBA9ìĵÒasnä|  ô|ÇÁġèÌ\Ĉ‹Ż0Cy³§' FÄ#’\ıfIò— oUğ;Òċüĥ“'OzoĵñĈĊ;ïĵóúO~ò“1Ĥ*”í1éS÷Ŝ{ïáàÁƒñl}}R Ġjë˘Ûí"ìĜħ•Jׯ_ÇĈĈFĵ°KÒD§ÓARÁÜÜĈĈĈàû>–––Ïç19>z½ŽZ­†……4  èşŽN§ƒœeĊmÄ^ߑ|ß}q\ğzÂ&iÎiwÉِêÊ-g_Ĥi²Ĵx•´ĜĜi¤£‡nzĈÂùˆûÜZ51şm'F’†RÒbTE²ÏífŞ·‘íżm€Ò­°­™UZk+Kg”\ԓí·dġ“ĦĥÂÒ*­dE”|YÔó4ÀLĞŜÒÚxiĴ?Y¤ùêamÇĝ³ 8‰ V98NÀ¸šnÂʕa9Xı2*S‡a|nCoڈš§ÈQ}µÖˆ’}BpAJ#gŬ'`` •œJ"=çU IDAT!žKÑéhèyy”÷~-ÖCçÚ+p.Êv–n `Š>€z|sı666">d2ïmJ‡vu]sffĉ=‡4M3!65•ğÌŞŸŸŸÇ<€ÙÙYŒ£ÑhÄ'½Ôı‹……LLL`Ϟ=(•J¸~ŭú@e%éívµZ ‡ŠġLg—WbwÎ9ŠĊbìFÏç!ÑŬ{÷îE>ŸG½^˜İ:j;2-‘6YuHáŻ!Ï –½ÉŬ èJVĊµ§µÜoÇPħí°Ö\Ökۘu;3Ÿa>w£žo;Ñ#3™nR§´™Ò0*ù֊iûìğ,PÊr7‰´Xñ¤ jÑAmqg†µç²Z{ÉäĠ,!­z­ŞŻ5KüšĥiĠR–ÛChÁtpÊÁû Ä8€€Ĥ ĆiÚ}ŭf SSS¨VĞ šĈŠùH?ıY ŻÇÑìöh´ê8`µ ĵBDI`Y{D i!tÒíĴÁ²LĜV• XHÑkt0³ïNp÷œċëà ËŞ ƒH˘’t“Q?#ĞżĦOnŞċÈĥ{w†Qßğ{÷ځ}ûÂ+WÀÈÙqàžjxʇ~ˆJ‚ÙÙY …ĝë[V ĵSxRÁÁƒQĞĠ°>÷cħvrrp]LXs°ÈÜÔ,xA4§§ÑcמŬ¸ëğbĉŸĴPd˙TeäÉvdĊ7ÉܓuÇĦiZĴĜtU§[D§\>¸èh%„l*îöGĉ)EŻ'ܢOl÷_OĦ~}sGeŝ¤>‡À€ÎIÍّ?'×ì$ŽR=•.o“•Ĥß=ĝ$Ò\´·Ŝ‡á †|(ËQĞOoŻñÔ6cÚgĤK6ŬÙyĉ<ħ˙ ,”I&]£.™˘œĉ^–ÔšĴ&’ÉÉùLÒžg„öeYŝ$Żj‡ĥc¸*Żıa†ĴÉj1ù^Ò*µ´^*İ„€³ŝÖ!„yP{Vq˜ž+`|vĠİ ¨€PKÓá{!46ÍÖá µFµzN7ó)À\ş3è-Ħ€0ĦƒCƒĤuÀX_phŽ^ׁm–aš‡a>Ž]và|ŭ˙ƒkĴ˘d[6Ħ™4ÄĈ²"êġzX__Çää$.]ş4FhôÉe· (Š/<ŭL¸şşêœ8q"87Ž›ù•3YÚÉEúĈ0Ms@+gJrÑVġMòv˲PİT066†+WléUw:8!uzzĊb1 ìëÇ­Ë6š!\ׅa˜c,ĥ’ĠX’ ^ÀiÎÖj `š;ĥĴe0Xr ŒäN=íBÍN­l Ó?Ŭ :‹Ĝ}1ĵ-—63•{´ŬÔÌ,0ÖÌ"šlçñ£^gÚ 0Íjö­6KiĠş9J:Ž ÛŬ§µ×†µċҒ]ÓhÚòiŻ%kOγ²§Ĥ$ƒuHµú²héIïşĴ6]V o|܄€Ñuhšuv!;Ÿ‹ş'cT‹´Të`£é˘V÷QkúèyœPÍ{ûAÀƒ~ !B·?Ó78¨&Àx—ùè aÁöKÈtLĜ>ÖÊÛàn cZ­BîĈäÉ ‚ëëëĜħcǖÖ'cŒ2ĈÈmJpâÄ ïÜısżĝĊ/^öÙgÇ|ß7%ÊJ0°ĞWŻâòċ˘žžŽw4²Zñd…8<Ċbù|wÜq666°üdŸġĈ(—Ë‹ˆĊbĵ“ğ<ÙĴVĞĜµkW̔Ĵ½¤{µzbŞ %ێò@I÷qĠ’$Í9|Ô,#+†Z0ĤY÷¤µß’‹é`ÌĊèaüğ!•V9ÜìÌh”ë÷vfZiì›aŜmתhXë- ¨³d›Ż1”6ŸCÛ:ió™QTé, 4PÊbÔeix†µ³tOi³šĴçBi.j4Œ,ħÍVZxá& pDG’€k&¨–‡nXuv!jµŠB¨Ĥƒƒ‚3‚µĠëXoxĜhrĝ̌ŒXö„Ž çC#4€ àQD”$šC˂ Ñ 5cyı’w<Œœmáâûρĝh\C÷ĥ ún7’ܰ²²‚$]1¨"†aî̙3äğî·(}á _p˙ĝŝèßùßyûèÑ£wœ9÷>99Ie‰—ËċÀ9‡8¨Ġj8sĉ >§ĵŞí²^Ż7M"ËGÎyĴYšœœŒşŬ.Úív\½ÈöF£F£\.‡jµŠjµŠ|>BšÍfĵÈċ˘ŬJ½^är9xž7ɐĵ¸’Ŝxj)+³¤T JVU²˘ÊbŠ [´“Ĉ­IÖ]2Oi;Tña´â´TZta(êöGÑ óĵÙ*/ĞşÙŻQŜr>ß´™Ö0PJ›EĦm|Ë&'İÊZ”ÓèYùEi5j64Ĵ˜lw4:ıŞQV ÒY #2¤Í”Fyï\HŸ¤™µ 6L#]³aÚ& "¨Ħ#94KƒĦçê¸hĥZ¸~gÁİ%Î2çĦQEó:Xè"ôÜzn

VPzäħGÙİûî_ùя~tĉ÷˙÷˙?ŝ/EÇq¨mÛ1¨ÈE´ÛíbaaO>ùd\%ĥmÇ'—Ĵ˜T“Ĉµµ5är9är9”Ëe†N§×u£˜ Ċ£×ëÁu]´Ûm”Ëċ¸rÒu=ŝ˙ĈĈ:JÄĈƒ*xHT9ù² ’íÀ¤ Veáİb×4wrù|òŭ[à“m°d`Ŝ°VÚ(qVu5°§¸S¤yËe˙í›kï%_ó("BVdŭÍT[!ÛíĥI·~ó!ż1(eċQ݇̀²ZaÉêi ~!ĵ5Í3/ùڒ­÷aÙKi`•uŸ$˜e99d1ùÒĉni Ş‚VZNDDRàš NMhFšY‚ċ œgà0L „jèô\Ĵ­c}£Žc#"J†&P &(<݇Îê‹Ŭ6:œö*¸Óˆ'Tú ézzaıò.ä*{QĴìA8ı >÷ÑqC,2Ġ½;ħûÎSè6VÑÛèĈïIƒQš·4ĴVZ{ĤeYwPJ{ž÷ŜmJĊ/~ħûO˙ôOo|ík_;sâĉٷŜzĞHĦĥmuŬxVäş.cÑĴ¤fË-íҜĤċ˘-mĠ}߇mÛ(—˨T*h6›h4Ѳšèt:pşcjj*nZ–…z½]×áû>şŬ.ŞĠ* #J·5M3Šh7Œx§ş(¨•”U5qW=ùU€Ëj‘e(ò‡S[{ŭħyĤĜvĝdĜÀï)YŬ oۍ”²´HÛİt†1ìĥSİ%É͸po‡‚žUùf'Áò-ď4QhZ”ċ¨ Ĥfı9¤ĊQ¤R²Ċ¤\§U*ĴèŠaÑY•Ò¨àÁQĴż4×Hv‚è@t=jäa˜yÍ Áġ<´;”ŞäM ŽbñĈVW›C€  LĜ‡ÔÑŞŸÇĈÚ´Żż€ r`ê€İk(EÏÑÀ"`üĈU´‹h™§áŒÏ :6…üާAL@ÓKXŬ¨!gkĜ½ö^Â{?ù(Ŭ%•qÜívĦiZl0?u0&4MÛáyžqÛ̔à—ù—ƒĝ‡˜˙ÛżŭÛ>óÌ3/]ştÄu]3yq2Ĉ°ĵĵĵ…Ĵˆ’ ~V‚$1X–Ûĥ1;;‹f³ ×u7]z Šċr9ŜùT*A€\.‡^ŻÛĥ‘Ïç‘Ïçc‘(ı[P_ŸşkU[sÉ*&͞(ùoÖ{Ö~”ÓôĜ•Ú>ĴzJĞD@1£’Ĝĝuô,)mĉ•Üİn·I;oĥCéÎ#‘ú˙´MIrGŸá‰>ßì<Ħ´Œ£$=Z~†I7ƒa‚ÔĴ™KZû.M„›Nüé²@I%: ÓEeU€i-Äa1ïÛ%ŬÄçMŸÎMu\ZwTρR `Ñk÷^ Ġjau½‰ċ•zĠ,è&Fƒû^îĈUtÖΠµr³,@#šn‚çèıç€iĜ š€­3Ĝ”÷]x^ •zëbŞWDnĉ r³‡aĜÀJğƒħòf÷Ŭƒ³ü áZkàŭȍ}£UdĥmǏŝï5!„éy½­@éÈ]ÇĊ˙û_˙Ĵño|'˙÷Ÿŭ×{żŭíoïşxñb5*ÛqŽ_żWHr‘L:&$´Ú>ó>™NL Z­˘ĠjĦX,Ĉġ–e!—ËĊlBiêŞ2îTDZH×ġĜPĈ²Ë­ĥ­Ôܝäbžĥ–ż ÂÁĊž .HÄ â›•JV%xzÛ+~)ŽÉ×ÁÀħ •ŸÛ\,ˊ§šĤEż‹?£n·ƒf³‰ġġġ¸">tèĉ}•…CZ9qŭ„_MroOÒy“ïs³Ë¨€İ<ßRùÉĥZôzÈJ4°UĜŞŜ‰e9`ŭÏÍ÷ŭÔQÚh ¤Ff‰aÓĝĴöZü’Ȱ œ‡`"c!ŜĞÖKÈ÷ ,Œĥ !@Âg>@BP* àB& ĉĦƒsžç"AŸpN@™ŸñžĴTÓI.êñ§ñżòp3@3J ¤Ħ =„ÍÌAĜ °ôòğpàCËÛ`ÜsË(Ñ.̰ƒĊ·P_ĝ1DEÑ Ĵ{ˆÎĦE$U]×˙à& €@$™ŠQB(‡-´oüo`×ħ'°Dv ‚&lì8‰kx)Ŝ¨d.ÇqétÏçħĥĥ0âkײĴxs[|éK_êŝ÷żŝ›WŽ?ŝ<°÷­·ŜŞêşNU7îf³‰˜}—ÜÍŜê—dàIXRAħXD·Û…8‹…Ĵ²‚ @Ż×êê*&''Ñívc{˘jµWPR)ŜÁɃ"Ğ69{’‹†@ĠÈ@L“OžìIƒ×ÔÖYżÊS™}ÛqÑĴDFÙàĦ3鍗E›–YòĖÂhÎyäpÁ rı\̒,‹(•J›Ç`m~ĝ!Ŝ}÷]Ĵ­­Ċ™['NœÀ}û2uñÌúì†U:əPšŒ6„=ŭóÙݽöÚϞyĉ™{Ŝ˙ŭŬn×.•J}”RÔëuœ={“““q5ÔÜʗd‡¨É‘šĤĊó!×uôEj†‘ïûX^^Ž‹Ċ"ŞĠjĴ{Y{҅Ü4͘d[/Mè¨ĥÔתÚék’)¸Şu|ÚÜ#é '+͒›m/ša˜VJmÉÉ÷%: ˘fİTŠÙ ĝàƒÎ;ïàwߊ5d§NÂSO=…C‡E›À;Ya'5eÚiİY”î4MX8Dg$uDiğa 8j£ĥÛüĦ0öÜ(RVġ3 ”’ɳbʳÂıÁ9çˆĞ Ú7!e,„aÚ\ŽÓç;QUĊ<„,@úpC?ô7E섂ÀĦ4̀0ş rŠ0ä}ƒT‚€àœfÎyJ`kú³zLµ€˜&t§& Ñ•íZÄ\Ġ-ĝ$€F=0–D 1aéü°†ġĊ°~ŭ"àÔaZ!ŸBh¨·JĦ€3ĝÎ26?ÀÄĝ>è$‡N@‡eYp'ŜtË/×uyğşîÈëíĥlßİĠÒ×öµ—~ġWġĝŭ÷ß?ŭü ÏϕIY—-ŻN§ƒ³gÏbϞ=ħP²Uu+_ŞY:5È6™eYÈçó1uğ]¸;pAʋŜq8Žƒn·‹Z­ǎĦ\.Çm= v ŠĊ″xrGĤRáÓvÏꅑ\ ’Ú¤´|Úŝ;ždçaà˘ĈF˚Y–gZÉıĦĴ5MCıT!­V oĵñ^}ġU\|×]êê*öìŬ…_ú_ÂÓO?WFŽ hÀÔE19+J›İ ĴŞ#FNÈ"J° Êúf[uĞMNÖ"‹é•ċÄ-AIVLIë4pKĥĜ²’[“ ³,PJ{Ĵ:ËÊr֎ÁSĝ †/@DdÊxäéµ:üÜ^!ëB§ Ĥ)³4›!Â0jïùĦ@ôà{=ĝœ‚[€aX0t :(aœJF·ÌĞÓ×ÙĴRuĴ@˙D·Au &´~@_Ô6ĉ0ìBMÀçBF@IĠ u¸³Xıô3PĜ–S×ĝL„ú”Üâ2ÙôCä-ÓEwŭĈ{ĞȗgÁ¸†N@·´âäù+;ÒNŬìÈÎm Jżû{˙™ù?˙ŜbĞĠúáŻüÊŻ{ġĠWÇ:NħT*Q!˜pñâEÌÎβ,0ĈĉB·ÚÂK›7İŬ’ žÏçcŠc\.›ÂÊçÏċr[tKY4mużxO}˙iÔí4ĊÍFQlğĜ|]R|ĴşËj’‚%ĵóÎ;xñĊ1??ß÷Ñn·aY>ó™Ïà·ŝ×˙ˆ]ğvĦRİÄnrV'ÛÀÉ6]Q!máOôĴû´yÏplĜ<bèß̲ Jĥş²rŠÔۓ@Ô)eyÍ͎Òî?,ĥ<Í;/)nM%7p@g:ë³ğBž×‚tQo,Á²5òJE ùE>O·5˜†]ËG×3g½Ž˘Óöiûèġ|ÜX|ߣĤi2lPƒƒ \0‰9úÔó`ĜÚ³y ¨ĠŬÒÒ#ÔĦ&@4pġ úĤ”€C~HÁ¸€MhĜB·>ĠËŻ‚ĝ@ÎÒ@Aà÷I`”ÀŬh€uk 4ŜK1„½ ŜhÙ`"yl˘­n@äçâ8Nñ£ÜĤe*ŬV àŭ?ŝ{?ü˙¸ïûvżĝY–eJAêÚÚjµZG³€œE`™@LP  Œ÷C8C§ÓƒÓġqeQ Vocuµg£‰žnÁÎY0l šĦ÷™p[_v6hÙ\T•n€ƒB‘³Ġ(ˆA‚<(lè† =íKhœXż„˘eA×Íèĝ B B<„iSˆà×GŬ ,Ş!Cà÷ú. +]³ş4j%K˙;µ].ÉM·5(Ŭġ‰âo˙û7׍Ĉ~í×~íä|°§ĠjU)”‚N§ƒĠĠU”J%46ÌÏ+İ ’éÖ V@òo†BĦ ä`Uí£ËaŸçyh·Ûh6›ĜĜĜ˜?UĞU”JxW!™{ı\†aÄj&‰ş%+*5 0Y]eÒ°™R2Ĥn˜&(ë:Ì˘9 !b:½ü?ç§OŸĈóÏ?Ÿŭìgèvz‚cccèt:Ĝıs'ô/áÉ'ŸD>ŸG·ÛˆóVòùÒÜħ‡Ñ²ĠÏm‹Wĥ ‘Óިĝï Ñ.Eç’ÈÌ0JĞ4³„ÒĞ13ž½&3‡²‚ŭ†Íš²€f½{TRmêLI‹œ‚Ħ p[`a–ía|ÒĈ½%Š9T 6òy “rX:ƒeĜ& šNûd y oÁ÷C>D°´daᲆĞ׺Xİûpœ·`çr(‹‰I²ŬŸĴšnF—Ĥşp ŻQ҈͒ÈĤ`žh²Żƒ!!Š04€‹hÖŜCŻŝ!òµ ĦP!àħàQô…ŝ-ĉ0‚=vgÉ`ĴNr³,7äi3ÜÛş}'żŝoŭ/ì˙ù³?_|úé§_úğżûğ^}ġĠ"S–|­V+R$*ĞtïŸGûNVKrƒê!Fŝ,K–ŞIú yñI‘nĞĠŠMb+• *• şŬ.z½^L”^{Ri‹ U}}êP’'ÔU²cĥÚÏlmĤU4i”äÌiû/+HŜ.gr2Çê•W^Á³Ï>‹óçÏêǁmÛxĉ™gıÏ}”R¸ .X̑ÛĥÖÚvIG„,‚A%\\'ċœóTPœ? ×!%OZ\²RR/+÷46]²RIñÓÄıió Q 4Œ>Ú:ˆ 8BßCè90M†é™ öì™D1×A>GQ)hÈÙrş€İë° S×£ì ÁXP]7ÁEŒO¸˜›-à;p鲇wÏĴâüU´z!BîÂ6µáÖó+q°#ĥYQ7xt îEk“¨ĤE<˘Pqô–Q[9ÒkcŞ@`Œ3Pƒ‚@ Ó*Á…ÛqAoħ{z&Ġ-„@Trêş ÁÂ-áĴêç! Éĵ˙i@ vÌít^yíĠWç?ŭoŻÍx~o³ÙĴVĞUZĞĠbA–Ĥi1lG­?ê+YU¨ ĵäßHVfêĊ,ç qÊcÀĴ>‡şˆ…a×uÑét°ŽZ­†™™ÌÍÍarrïÇqı\ù|~‹³²$ƒ¨Ġ›|nù³ïûqëQé&ġRIÜĉĊÇR-€äċÂŻÚ:İ÷÷‚0vˆ^‡Îl;şMx!&&˘ôßï~÷ğĝÁ~µèĈ&#²‚i Ñh ŸÏßŭêŻà—ċßÁ#ƒÇ€EïÓúŸ/Ġ!@úÚ)B˘û´í&˜ÊÍF´aŭE×0 ôz‘^-ŸÏC€Âü]œĤÑM x´Ŝ*. 3¨ò˜ÂĦN$É6‡:CJ#6$ĈUCÑ,ğœaíĵ,;ĦQ–pˀĥá‚ħ<½Çı†˘á£‚žf@û˙É{÷hğú÷3ç\ŭŜû<%!! Û²Áò0ixŒ†‘×·½”BHIŝHšÛÜ6´ 7)Ém^’Ë-#„Œ››”N nppâ&äQS×/llŒ-Œ-Y²léHGÒyï×zÍ9ïkϵ·ö9Ĝ gŒ3ŽtÎ~Ĵ½ö^żÇ÷÷ŭ}żA“4]ÇĞ„Äinï£SŠ~/.Šz÷ıuñè[s_oûÛġ>SoxîŭİŸ<Äç IDATúİïıéĤ›RÊ VĞqêÔİÂgÉ İ>Wççëkr‰ĠÁ~nĥ49h/u×a•e˙’Ğ(Üíàĵ2”PNĴν×ŭ=ŽcšÍfÑĦ9Ѝ­­­˘ó¸Tb¸;Ĵ|;g+ïlè]ġÔëġĜ57ϓO>Éí·ßÎ}÷ŬW¸˙–}¤Ò4ċğëğ¸ñĈñ}ŸġġuÂ0,H';y9]Š‚‚£ë—çƒá°x²œô'IÛÍf.f=1]Ù[ìĜiNΊÊZŠ“v; Ż–gnÛÉMcù]lYv;Êù´N-͆X#3’ĠÑf´Ü)@kKšöñ¤ÓİħkħĈâ|Hğ)iÔ$a5ĦÑ ™­êĝTB‹Tı½8ÖV*è,Wĥdİ$M4IbÈR§êHZ”2ì{I“™™9f:MZ­Ü÷À ç–5ĠF %ÏRkÖ¨¨ŭ­!µj$K§Òäϟ§Ñ˙³óIÉX êĵŠ~~ĥž/ñÂʨëm}|O"LÌĉê³èáJ€İ•(Ħ_°87͐s§Š‹Gn†T5ÈÉıÀ·lR¸öÚkO=ġÔŜöĥ·=pûí·_öĝwšÍĤ\[[+²îäÂè·BB*w.q”Ŭg'Eı}u ıqEÑ8??_$g`Xv uUYeÜC†|Óh48{ölĦ^6 œ„ˆĤ1òÊb9À–)úÓhÍRÊ˘s,/ÊÎÏÏóÔSOñ™Ï|†ğï!ġz½˜é9ĜöÀĵùÍoĉÀERsIw5w'ižÉNÄ şû{žGµZßïÓëġ Gd×—­JÜżwJ0“‰k;5é‹“*ÓXvÓ:§És0-)í´żt1?£íşí’Ôä˙8ííXt6:/¤İ1™%K†`ԛ’Ċ…³³>íŽÓ„J%eïî:ġzHĞR %ˆk,r´ˆêİ!ÖÍaµÍ;ħTG#ż´¨ J˘EFfb ĤÙhÑiµÙğï ĵp•żûğg‰z/XGÛMê•ŭHÚ¤iDĤ³_£S<ÑYš‹ŻJItŸĵĉËÁ†Ëµ3 AìT”@Ĥ›œ=ġ$z¸A(@¨€$UT_€¤´ÓÌX)U@Ô0eĞä ;w­c¤ÖşĦ”Ş=öĜcòúëŻ7ßòIémo{›ŝµ_ûµS¸÷}ï{ßkĉg~ĉún·ÔjµbRİíßóµŻô|ĵiÓèÓnĈ>¨n íà•2½Œñğ`á`1Ç*sÄKw.²,+’µƒŬÜ­ÙlÇ1Geyy™N§îŬğ/XŜĥQŝ÷NQÓ€ ú•JünhÜh4xúé§ùÄù_ŝò—ħÖ²¸¸HE…ËŻ›•ĵîuŻêĞŻf8Ç1µZ­èŝÊ zÚÌf'K¨N™Ŝ÷}VWWB0;›/nmmŬßU|H˜„ÇĥS\ĜÉGhğÏS9áOvc.é8rÍdRš&ôµ¨5|­Ii;-ıIÊ÷vD֚‘cŞ4:KóP:¤QWìZ¨2?Ò¨%´’Ċ…€ZĠcמ ~ ĵ KF–% BHéċ˙Ĉ"•/AJ²LmZ2m°Â’êŒŜ°Çp¸I4ıì>?ŝ–+ ĵ€żüÜSt×Àè*&Ŝ ^ôŬB%{š\@ĤGׁÎ;7-žOHBI„!—ĵRÎîA ­ÂÊ*‚-Ó?w”0 0ŒÈ/`ѝËX9ÏxRšV\9§… ĜÚÚÂó<´Ö1ĉežç½l0,ñ·|RĝĝÁ]wŬu˙ÏŭÜϽöïxǛoyÁóÌĠW_ÍĠW_]$À~ż_išÒï÷ fĉv°Üdgt) iòó3Mµüʳ£IFŜĊ4çv‚äĥSŽĜÉùġR;iD‹ósW‹%%ËbÒlHÓOètÚ,ÎUh7ĦĠ,ÎWÙ··M­˘ü) Ĉj¤ĝ^>'TV`3 ŒĠ䈑ÉUà¤-ĉĴ^ÒT䎭(Âgg¤YŒN"ö,ĝĵċǰħ²Ċ½uÑŭ:ZĊô†'˘šßwŠêy9)I)ħĈ Ċ…]½q’BJbG;MùüÒ E İ|tşBĥy’‚ ùħ‰’€ŭĉĊ;‡,°_Zżß/àñÒġPÑZ_ \? ô˘IJ?ĝƒ?¨oşéĤ˙ñ?ŝÇ]ï{ßû^ùÀԏ9Òèt:Hç|³żÊ{D;S9@”IŽ€àäŒëf.e}ĵÙÙYFH‚ (ĉkŽìl6İVĞĴŻŻsòäIxàò•Żàû>?ĝƒ?ȍ7Ŝˆ“qêġzc ÓĥÖ'™3“ÁÉéÔMÂbîġş¤êf€N‡³gÏrë­·òàƒÒi6ÇÎE™È‘$ ×^v{öì ҎU8ÙL{“Ĵşi×÷ŭbĈVŻ×yêݧxÁ9x ozӛ˜››÷}ĥĥĥ hÔUʝÌvÔîíóÀ$eFÓ´¤4 ×MK;%%×iM.5)mÇěĈ¤ò"ó|#„E›c#À27°0Òj*ĤŬPÌvŞ4*Ŝhv”+5H RċEƒBċĴâDĉY†Öîùϳ%y5T˜,żŜ:Ÿ,Ó 1Úħ¸ó˙*Ö7žĉÑ ˆ#*žAI,“SUÏÏ_3ĠüżVP”'\‚LmnMĊĈ]ĥ֞ĊSıpÀ0͟ÓÙ šŒĈ:Òç3/ŝ4JŒwXÙ(Ğ:Œ,ÑÛÀBÇŜ‹bĤäŜüĉ7˙èŝèŜW½êU{ßûŜ÷Îĵï}ïğZJ8;ˆi[ÁßĴ™ÒNĤu; Ü]Òqä„òn‰ zĞĞĞE5<ı †a!Ó£”˘Ġj!„àĉÜ˙ŭ<ôCœ8q‚½{÷ò–·ĵ…׿ŝġ‘ÂİGL³AĜŽ.>É8,Sb]šf+ₔ³¤żóÎ;ıëğ¨×ëT*ÖÖÖ¨VĞ4 z½^afŒa˙ŝŭó7Ż+ӝËĉIżĤítÚÜùwżK’„Ë/żœëğŽ[nı…%677ıᆸüòËɲ\ÚĈÍġ\'ğS§´ëm;šĝvé4gÔI­ğiâĴ;͔ʤíöŽĥ3óğ•ï‹Áw0Z¤´ĵ\­;ÓA(¨7*,ÌZf;>µš¤YtÚjaÚä3š0ÌWNĈ ‹N4ÙhŻIkCw0JÚİ)Äè'@J¤%[E½QEG)½d‹W^?ˏŭƒ],l‰sĞ ĵ*^-ĵò9ıšŭۘÜfVkĴRçY£çEJ|ߣ^Ż#ü*˘ï#E€2)¤}ĥ6N(Bbñ¤sˆoÑá‚Ġ áĉEĦâCċBĠYk½4MĊ‹*)½ĉ5Ż1üàÏ~úӟŝë_ŭĠ_½ĉÏ˙üÏ÷9r¤3ëĥ³dĝfĤAy“⪓Ÿc¨8=ĵò¤ ş˘rBnàAÌÛí6QñÀpß}÷qêÔ)<Ïc÷îŬĵŭíoçĠŻ~5SÉ“]ß4%l×uLjMÒÔ''gc÷ß?û·‹‚JBÇÌÏÏÇ1T*Â0,¨ğwï.ÈŽzï`NGÖ(Q—L §Ê2CȽžsçÎ1??Ï5×\e—]Ĉòò2wŬuËËËĵá oàÚkŻZ­Ğ AŒÍ6·Sf˜<†òyfï0ÙqNŜw'™ĦK1œ6˙َè°ÓÒîP§où„È‹%Ġ÷Ğ´Ûm*Ġ.•ޤVġiĥ<:í:µJˆ§2<%I´D*ò ‘ Q4$D9Û3ЍžW€•9İÂ:Zż@ Cݧƒï+¤2 .BfGKz´ŞmbyŽW_Èß_Œ[n>ÁÖĤ¤3Òï&c…Š*ç‹m ƒċŜgÜe†RĠZˆ•!BXB§a‡[@j,ÚJkqvÊÍf“×|÷kÙ·o_ħçä¨òîı'ğŽ2œċşB§òP§-wNNʙBAÀñÇyĉ™g˜mµY_]eéÄ Úí3q’wHċyà¤˘Bı™ô§iĕ?ċÇ,?î䷛ݕŸwšĉ]™\S>G6.ï7•ŸË‘fܒóvÖċçœT–ĜÎ@Z ş’,³¤İĈ’x ³Í”½ğ=vµ=šUÁÌĴb~Ŝ§ĠñŞ „Gj$’~hAÄt[lv ˘ŝ°EŻ×Â3 „‰­Z‹@#E†² ÒdԤ³˜ £SLf‘ĤŠĠ tRcËô Ġ"IXlnħq‘­smŽžX#öğ4ZŠh`ÂCŠ ¤h!•G˘ÜÂmĵ‘E…à!ÊĞ!K*Sj—íı†ġC&šl!™c…sOŜ†—Ĵƒl’"‘: ñRä78œ+cÉdu$­…WĦe‹z+ =ŭçΜÁ Öd€íìYHÄÊ´ù$GċèÑ£Ċŭƒ àŻx×_=µZ­x —Dʋ·.ısċ’žKîÓÜh]Ü›šĴÄh4XZZâŻŝêŻXYYĦÓéív‹ùXY:É%O÷ğáp8Ĉ0 H) ÖàvLÀíş—Éı‰KĈċ XXX ^ŻóЍ îż˙~<Ïcq÷b7â=I9Ÿœ)nÇXœœ?îôşÊĞ;u"ӘnÛİsOğíN$ˆ,)Ĥ˙´˙+,FëÑ´E"…*Í ĠÀ§Ñ Bž'‘ÒÊMĈdtğ1Ħߤ‰À“u*&Ízln­R™ÉÔbĥ9ğ ËËÖ7¤ JB­˘hÏ,.´gĠj‚R1é°EĊ‡(’Ä™|†+ŻSĵ럂ßú“ ğj•6‰¤†i}äÈPĵxñ…¨›sĦDQıNRú²tŽż5³Ì9ñŒk Ĵ5…“÷ììl!&Pfܞá‹.)ĵġ­oí˙ÁüÁçoğíĥ…Ÿŭg˙Ĵöž÷ĵçêûîğ/8}ú4Êµ4â8.f.eٝI2ù씌&qĠI„K´nnâ:&§X^Ż×B°|ê4kkkXki6›EPżüòËıòÊ+ Ê· äeqÙòžÍ$}}ÚRè´tÇĉJ9!ıż÷Ŝ{ı˙ŝûs üF£XŞsvÇ$t¤cµĊqÌúúz‘0“ëèÜíË󏲤Iž›@OÒÚŬí܅Òh4rŻ˜Í­öŒÓ”cǎñ²+.gïŜ½cö%Ûôm§è0™Êĝú´Nf²KLJë”vÚ#Ú)ù\Lħáb âÓ(ócs5,Új”İ oi5Ş´ÛjĦ$Ó~P'ĵÑÓ¨Kֆ^oÀêz/Ÿ )EJ´Ž‰’„0hµö1>'Nlrä ǎ-qüĝK[t£ ‹@à#„EYR ³3pċ•U^y¸|—ìií’bİŞkg·è„}Ŝûxĉí=>{ÇY4ēx İNPžŻ|2lĞz".@Gäô]žÇ–“Ò7‹uĵ"Jyl"G0в,+D”Ëׂ‹ÉQ½x“Ò÷Ŝĝ}ĉ?è˙Y~ĝá‡˙êówŜùŠ7éMûŝù?˙ç˙ŝƒtĞĵ’Ñ Ġ)]J2şX <ÍAÖuŽ˜0‹Ÿ+++(ôúĊkB0 hµZ\}ġĠERJꓤו”½Nœĝä¤Hgùƒè޵l§Q^(­VĞxžÇ™3gĝËżüKúŭ~a=ŸëÊ VczžG³Ù,^g–e<óÌ3lllÖòeX MÓ (éeá\§’1I2™ Ĝnßİl„W&2¸ÏT­Vcmmcǎħ°°Pˆó–ÏϤ Ĉ4QĜíĴµ§ħë&;œÉ¤TfÏí­]Şbv:x;uZÛÑÈ·KJcr÷·=Ž=}†cÇÎÒˉôŞ&Q!$I„ç5L“t§WΤ<òġ5Ŝĝĉ6ŻĵnëŻŬE´Ġ%I*$›-„éóöwÌòÔÑ-ùÒÂÔÊéżI„µ`ìĥü˜š;Y§ĵèQÙ…à‚Žż<:)³ïçI^½^jµZ\·)qóÛmRĝ…_üß³˙Ğżvòżŝ×˙z÷e—]öŞ÷÷½Ż|ìħÇj˙ä'¨T*…²ö¤‰Ô7Z’èRÒN,•iIİĴí\pË퍍\;‹.½ŝ}ûöħgÏĥĥĥŜ8$àèÌ.oGŸvÁ{6›\Du<.9ıšKİÔ`Œ)ûÎê;Š"ÖÖ֘íÌJqS­VÙ·o/Ÿ*ë'bZL“òûeÌ·|›òŒ¤|q•=¤Ü˙=Ïc}}G}”{ï½·Ñu”ápȞ={XYY)nïşžƒröìYŽ;FĴŻŻóĜcħ¸¸HĞĠ“crÙd5éèôeKôi0Tùĥċ™˜S /¨ċ÷˘,ë4 OV’ċEïiIéb„iğGÓH ;ÉĝLƒˤ”fB³KßNÎiš âTù'$JI|eİTNzÍCÉÜŻÇS>Ö$¤‰a8H0Z0ì÷щΝb=M/Š ›3µy?ĵĈŸ˙ĊxĦ-’Ĝ! $ž€5$qF˘sµ„Š !N„oħ6&£BĠ-Äq‹ğżp†£ÇNóOêU|˙÷î&Vħú+×]?ċ/Żsĉ‹}²ÔÏ#3e3eIí›ÌM~Ü×l;]G!Ä è°];(HŽœċĉ.9„al ÷Ċš”ïu7šûħ;}òäÉÛ>ġİOŭñµ>ùo˙íżöïßO·Û-öe;óoĉŬN·›ĉ[ŜkroïûEĊá.öÁ`0FûM’„0 C<×):ˆÓIä8Ŭ¸IuYäĠu4ċÌr qÔ_÷o7ïr·?yò$÷w7ĉKEĈšÍ&a277Wĵ6—@8ÀììlA˘ˆ'žx‚S§N1]3 eMÂpċ-ÏċÜm\÷UÖeHÌİm¸äVËuÉlšËk™½{u{’Ĉ}İÛîħÊçcğÛOŝûbÛnŻi'ĉŬNä‡üs.E­V”Èġê´ÎĊU­ [›=’Ĝ dˆïUèVè´f@·¸÷gù“›żÈ=÷m‘Ä ÂĉË@Γé†CĊ ʰhB_à{Ğ#<ƒbÒFG` XE–ĝ ‡!6ÜÂg8sn7ûŸàî˙y„Z[3ˆÎa²ÍFËĉ¨„h‹P˜÷Êş”x0m6:Y}аî.rŞžçÍûG…š;żh“À?ĝ_˙Ħñû_·ô—ŝóÏŜŝÙÛ˙Ñ[˙ѳ˙ÛżĝùdĤŬ!FxRĦÓ ‰@"0&CK–%H™SK³,ÁZ ĉ.$;|?O¸ì6Ĝñ¤Ċ4“·rGh4Š9е–sĞ+$YŠdFS­×0Xâ4a Ú· ,FsC}¸µğì½ä˜h“JÒ.¸ !i†ĠŒE§ġj~·Çx£GžÂ ”ô<’,7²yĊ5×§)I–‘jò}’Tk½î:¤çÑiÖ<}ôwßġ?ÙX[§VHfù÷è8ŬñXk Ğú$I (%â2: ‡cÓuqÎv}8İ{Ÿœĉ`y×iڎKî=vÔór‚(ï!ısZŜ JӔA:$ÉbLĤóŻ(˙&`&J Ó0Ú ÉŒ&ֆÄXR!ˆmŠĥYC’iH2LĴÉ2CĤ-ħM’‰Œ!)ƒ,"Éb¤ħÈâ½Ċœï¤R[ok;ŭġO*LLÓUtçĞx Rï$£c4>&˜!Pë˜A_E<f“F]Hö¨·„?½f|ìOžâËOD„ ¨Ġ‡„Ù2ž Ċ%3<9Ħĥ İ’ÏzP!ˆBċ·O›ĝĝÔ*ëœÄüñŸġùòÑŬTfgô— !ß{cßËcIĠĤT´‡6)Ħ0BŽ–ƒGŻƒ'€,FÚ /3xZa³A€%Ĉ÷RL’PÒG‡!)ıʄ •ƒòĵŻ)ö|=ß!ûùìYBbú $i’NñZó}oÌÓmkk k-ġz½¸†Ò4•ƒÁ ‘ĤiíħÇ“/jĝÎ}ŭÄOü„ŝŬßŭŬ“÷Ŝ{ï;ó‹ï}ïŻĴĴĵô7oúMÏî²$Í$”âÔħŬ@ŭùî„oğŻÉ…Okmar8 ˆĞVĞQŻ×QJBˆsssĊìµe÷L·i=Ñ‚GıK˜ĤwV­V‹EÒz½N–eÜsÏ=Ü}÷ŬAc’_ĞĠ¨Ġj<§ƒJEżß' CšÍ&O<ñġz7½éMTĞUĥĥĥFpíy¤n·{%}Yħa’}ç~şäSžw­ĞŽÙHóóócàtšŻ™:G™<†íçáDH³š‘úµÀZAŞŬ2kvġYF2ê¤F  cħRaİ0RÀ A[ƒÁ"”Ä—MGdIŠK*÷#{C ‚ÛfV4­²ŸœG !•D IäŸQ),j$RŠ6`ZxAŠôÏI4‘ĝ Şġ^Íçŝö îĝëĴĴ'ĝa€’e<ŭçxÍZŒÍĠ#Ş•€3gÎñÈOrĠŝE/EëœÔÓjĠYïàn@İ’ÛĥÓp}aĤÂyç?Ĵ~áOñ‚tEċîM£b\ÏFŻßÊ˘u£CQFv`­}™1ĉeŭ~ˆ_ôI àġŻ}²ħħñĝ'?ùÉ?=räȞ_ŝċ_ž9~üxëOnù9ĥÔ9<:LÓmĤ;ĜÊóÔóšdŜûOğ`ː^Ù9֑˘(BkMŻ×ckk‹ıı9Â0dee€ÈÂ0³§p³GL(çíĉċ™fùîœa1|ùË_ĉá‡&Š"fff.`Ÿi­i·Û´Z­ q]‚Ğ×ëĊ‚­ƒƒ<òïó=ßó=4 Ö××İÔŞc ˘¨H6;½WN%£^ŻÓív ÜûÔİSıœèuzžÇVŻGĞĠb×]E‘3MÄt;Ğ|Ħo7Cş`&”iĴ`\Ñ{„xAN­luI˘›&Ĝ4#‰bÒ(†‘ߎ°ıg ­F Œ´İ!Un:gŒ%%ĞÖâù’¤,„-ĜXĊk2·ßĜNùaĤĵ IDAT@yàKz- z£È"h“‘Ċ5j­!*ì˘ĵ ‚ĦV÷1Âç %üĊ_?ĊħŻ2ƒï t!‡Ġ üçg´N ĵcÀ }zŭ˜/|á0oĵq‘—ĥëd:ĤŜ¨23Óĉ™ÓĞhmñ…@ /‡§İIʎ-͖&Ì(ċf&a.üŬ7„}7‘6l.ÉäIbtĴRĉì<››2z’‚LċĴhܜzÇ*Zë+³,ğ~eeċKß6Iéşë³?ŝĝàÁ/çΝc8Rġƒħ™™™ÂĤ îd ħ“@ëĊLlša…À r¸Ì¤#X%?ŝġġU˘ŝ€Áf=â[K(ġ<“Ħ¤*‰A’èŒĜ@”hÀ²Ħ3¤ï/0Œä¤ĴĈ—O)Ĵ<_¸äXNJvBKpòܖ =Ó4 È=C­âJh¤ŭŬX ~áûyb…Ú’X/àèфO˙ٓ<³ĴÁĞSkT‰“-ĴŽÊŞç£¨³„ ÒdĜË%‚°ÂéS=Ž<ħÉKğƒ1}|żJ­^AïéLur;ğç×V$!Ġù2+Q#_skÏ_§rŠ+ñ7âËXœ/$´ÑĞóÄkG,!ÚÁ£šš.[÷¤i*£(j§iş°ħħá}[ÀwîëÚkݵ·üñŸlŜ~ûíóó?˙óÍN§#çw~ç µĥöÙÛ?K§Ŭ!Ĵ„ĊP:I’Âk¨\ċ~³ÒĊ  ÷s’Ŝîk΂ÂÍyΜ9C³Ù¤ŬnÓëġŠ ïfPŽĊçşH÷!)'Iµrġ6ݝeùìÎöŬy睜>}şĜ+'R÷ÓÁ_î˜ËAŬyeYV`.ˆı}*­5÷ß?ëëëĵöµŻĊƒbV4i™ħŬPùÜ:{·Û-\qOž<ÉĈĈFÑ]tğ]šÍ&(œ4Ŭkĵ˜òÁ´}K,µÖ⠏a‘ê ë/èŒhĞË ×gkm‰ " ĤuݨJA(mÏ~Ú@Œf¨ ‘ÍHŒĉŒ$:!K5Fĉ‰] A–hÒ,Á‚FŽ ÁÔŭĴÉ5‡2‘gRħ ĝ˜>Ħï„%-‹”°$~-7|ôP(üzF­òÌ Íûܳyz lâ)a´2Fùm†HïığäES‚ m •zƒîڀgžîĦż·ƒ%'O䈋ÉŠ!gĦIµ#;.ïšÌHÒH•DĤG’÷’xžSR`Á{/ŒüPŝĵŞà… kd`Òó°^–A3)MĉtCóXċÈîĥY–Ñív=cŒ§µßVI à?ñOô/ŭësêƒżġÁÛŜóž÷áĝ'o½ġփoyË[j˙ŭż˙w†1Ôjµ˘Ğp,/…x^-3SšÖ)•=†\µá‚pRĦÙl²ŽçyĴ­­qĉÌÚí6›››cweL¸üXċÀ?­Úfá‹Öšf³Ċá‡ıëğ8zô(ĠjԘĉU9ĝ6›Mĉĉĉ é$wLÎz%%ċ•·ÀŬ‚íÚڏ>ú(išríu ò‡#¸Ĝï÷/DšĵˆËç×͒žxâ Ö××óc0ĥH@ûöícß},áèÛğİÚİRAsf뤌F›Ñ<'ÉHÓ>ş7 ^ß îöÙċû„ž˘î{T„Öàkƒo3$瓰ÈÜÌ.RšÔB*=šĦd˜ft£ˆn–’hQ)Cd% ;œ˙<¨#ÔS¨Ċ_ìğœ˜Ĉ›R +DbFÉ('Wĝ¤Z7x2@ òŽŞ°ĠU<ĝĊ>÷ÂPJ$}° µšOšiâ$VS=7x+ô|’4"jO'],U6·4ÒϰÎòœIßùY0ʚíà:ĤtJYŜÏÊĉh%ž °ĈI•\^Ñ\ ŸĵXÒşXL³RaFMÖj’‘ƒn–Ë•Q)s‰!÷°àsqÀ‘`677‹ŭÊoğ¤ŭÖġÏżç_,}äw?rÛżûw˙N(Ŝùûż˙ûßġwUîà>677ét:APH[APW=—$ó\*•K™)•ĞM7Û(ÏšÍ&ƒÁ p+++´Z-jµZñû2 ,IŞĠê Á%r0,W³ċ.¤LI’„'NpÏ=÷päȑ‚™ĉŒ½ÚívA[wݧÑhétxúé§Çhéï°˜ÛYrPkÙ>MÓ˘‹zôÑGÙĜÚäŞĞâòË//(äî>nv;K ÷Ú܌Î%¤ċċċ1Ӕ.Êż =Kµâ(‰µ%sQVĴĈW"QRVĴ­ñ•/¸çž&NĠ™eĝV Uˆ0>V ĴÈHôs·D°V!m"'=$i4FÍk5ݍTƒQb´œïxĥŸ),]t~ٙ\"÷M#Mç1 GÄh>/,HkħiÂİS§À„çaŒ³q9ß²KsyËĊĦĠĠĠoϤ;żûŭÓ˙ôŬKû£Ŭŝ/˙ċżlŭ§˙ôŸŞwÜqÇċ?ü£?TyÁ ´Ûí1ö™“.y>a¸çûŝċ­i×Q¸¤eµZvğÍÙ³gİT*DQijÏ>ËĞ^ġŞbÑĥ,ĵê’ëF\@.+„—ÉN¸µ +ıĊÒÁ`Àû‹\ħAJY$Â(ŠĜğw/7Üp÷ÜsÏX‚ĞVĞTĞĠ1M>·ììƒ èô˙ÎÍı‚ àáĴŻŻsöìY^ö²—1??O†\{1ğzómmmqè!Ž=Z’$!‹bÚí6/ùˋ/Š£â‚›ì”Ĥ%½iÜvIirĥ'…Oš$ô‡=z[›˜^–´Â³a•vż‹Bà M(Ħ˘$% •À˘ĵĴEê|Fƒĥa1Ĉb„dŻġécY Jƒ†5œJRN#zƒ3ízħç•}A'èùêۖrRšÔĵ S !ĴäbĞWĵœ_‡°ĈÏ³à ƒAŻ|y“£Çúԛ xşŸ^|ŸL[’!ĝa ż"è zTŸc´KӔF 3„g| é#Ó§"2ü@ħ­AŒ`ĥŻ).ˆíÔÀ]RkD‘e…xaö–ÄD2´ä"ĜXħçΝƒ‘,/Ĥ ïş\;dbyyùÛ7)ü—?ú˜~ûÛß~òSŸúԟŭâżzŻĝñü_ŝâö;^ñîwżğvÇwÛêv&3ĝ* ĠÙXWV˜dÂ|½‰h§.èb/_ìÓlˆƒAÁr[[[£RݐĤ)_ŭêWıâŠ+ ĥaYl´Rݰµµ•›ì sqÔxÁxï3èġÇĞ£küqò•ݰşşZt1ÖZ677Ùż?ïïŭ=Ž;ĈısçŠÎF)ĊW\AÇlnn:}[[[ìŬğ·h÷\ç~şdäˆNµ^ŻÓj4ôúzô1ž>zŒ}ûöqàÀĉçç݆•1 †,Ë£ı‰{ì4Myü‰Üúc0úANeäc£ÓĉšëcqÏşŭ^1´-{]LÇn;‘Tk-‰ˆ‘ jî/•˘­is{ë1Üìݟ£™,>sG$qDS'ĝÊ£Q­Ĵ7è4šT+!T ^lˆ’œ’›èŒ$M‰ÒĝGdÁË`Ż‘ì1‚RpBiŽz)gtÊSŬJXfk!RHzŭ˜Ĝ*DPÁd‘î2XÓÌÜS+s7X“‚MQžA)AŬ4}ƒ/"”ñ0݇Ġ‚°#ñŞC9ôSÙ ö[|ċÑŸżûDe2Ô•w•$Pġž;]Ú2˘¸J"fëCĈ:’}¤6²XŞ:CˆO&,iAâr]?‘+W =ìhÑ(=LaµF…Qb ‰I,Ħò…!ÓÂóڂ$Ĝ,Äè£"”hŒĜp;Ä ­°Â d Ò`DžÜÌ(ÉÙDYK‰g4Ĉ&¤2%ġ Ú³´×_J>E¤ q+`~×[İW/£/qĝĞÍşùĴ;³(1RñÎÏsüÀ:t¨(T\ĦìĉäßĥI àSŸúTòÎwó‰O~ò“7˙ò/˙òVĊ˙äĉ›o>ĝîwżğöé[?çyDQD£ÑÈaOUqRrŞ—jıŝġú(}=/˙ÎÁ+ĠjµHH.xŸ9s†VĞÀÚڍF£ÀvgggÙÜܤVĈ’²Û-(SžŒÑ`0àèÑ£?~œ'N°ĥĥF­V# CşŬ.ĞĞĞìŜ½›oĵ‘F£ÁÑ£G‹ÁĤ֚™™ĉĉĉ œ={vŒ™×h4Š’Û{rs¤IÍ:GäĜÜܤÑhêçQñÔSOqêÔ)Úí6ġzÙÙÙÂÍÖ]çîġz,//‹ĥe҇Ûíşîşëèt:Ċ²­;IÇŬí ¸í`ğbž¤GŸ=c0Y~ĦZa°L–1ìġ‰ğ]šêTĴ¤–XT”rŽH€œ£Ŭúö.ĵš@Μ>Ìı‡ 'h‡ĤLÊ"ıxêfnѝ³………o˙¤ÉO~2y×ğŜuüŸĝğŝÊŻüŠ9~üĝO~ü?xÙe—Ġ>ĝ[¤V­7\0ì/ëş]ŠŬú׳{İ]ĠNÌ&ç9ĉšÖšĠĠĠ˘9wî\ƒ9•7œwôi];/YS–"*“VVVĜÜÜdyy™%Ö××h·ÛcÊív›n¸ŭû÷süĝq–—— U`c N‡N§ĈĈgΜ)’RŠN§SÀDïÓëġĈ\p……òĝċ—_Îêê*ǎ+\‡ĴÇ1kkkĊ ġĜħcĊërÉ­Ĵç BGG˘ˆ Ĝµk{öì)ŽË½Fg–çd;ù]ÌDÏċµü¸’ŻWç5ù’­$ 5ċ1ëWhĤ)M˜­TĜĠžáÀ=„aH½z~Ŝ`Y‹9‘…,&¨y„İO'ÄCêP1ìċЉ”ùR­°`4‘ÌAĠĝhĦ¨UĞ<&2ċĤş†–8 IĈf•îóXf>êQ´F`5›Ħ¤Aş˜@ı•÷>çŠÔžŻ…çk„×Eyu–N(ĝÂQħMbùF'%9ġZMSK–ž‡´Ü. 1éÙK’¤›œ/•Ñ™ITäBĤ%T'#÷[…Ä#*gûi Z#LO|İAD`#R- H,•…½ìÙóŬÔë×SĞîÁ÷cVÏ=ÀÒÓ÷@ĵ…ŞXÇ(ĥîÚu{Œ.ıëa„~È~ż/#’À'>ñ‰ìç~îç–~í£ŭ(?ù+żò+ŻşêŞÚoüĈoì‰gé´;Hïĵ„O™KïNÜĊ’ÒóAùŜ‰}7ùx“•ˆğœò“ÖqXîÒÒÍf“N§CŻ×+’šsN%Ÿ—ĴÒ4ecc£}]__gee˜ı.ÂÉòc˜ŸŸçċ/9W\qE!˘Zfĝ9­;+++ôz½"aıy’£·;ua×ħ”í³1ìÚµ‹]ğv1;;ËSO=UH )¨T*TĞĠ"è;Ĥâp8]uŻÁUyQ”SX\\d~~žz½ÎV‰]TNjŽÙ¸ûĴ~1Iûëž2 ²ÜmX”†4’ †ĝ:êIÚJRK3ZR²kvž—ÎÍħkn–J£:"2¸eV0Ö`Œ&ŒMež(*Až¸Z•CżBßïaû[!° 2A%KŬĉî ˆ MOŽ bĥ˘­JŞ ‘ñyÁ<Ĵœ” ġ‡QR²˜œÈ0R*}żáր0H%•EJDà Ȳ6_}|Àz_QiH´ÈÈ2ü†Ï˙e1óÉċŻ Rz$ħ&MMPZKx#°2g9ä?·éĤ,SK5nŽıŬLù<Ä\ÒÑ+ß'Ë &M‘Hßâ{l‚Ö)›²EèY|RH4ĈBÚEçòWPŸ})Ħw: Â:Au3Ë_àÈ#w€5´kŠa˘ĥ5¸,Û锋ĥÑëñÂ0œ}öÙg;?üêwDRĝèG?ŞêïZşíĥÛnûÏŝÏĴŝäo˙öoœ­}ààĦC4Û­1겛W”Íä^ˆŻ‹ÍĤ½áċ*=§·çğKÎGÈó<ƒÁĜĴluu•ápH§ÓÉá·JµèÊzqçΝ+SË:|A3—äöìÙW\ÁÂÂY–ħĵĵÌÙ³g‹óE³³³ìŜ½›$IX^^&I’Ü8/ŽiµZ…5‡qtjċç.{>µÛmsssœ>}šB”·Lħ‚ €•ÊĞċnÇ÷}:sss,,,h4 Ù"c͘Èoı‹tŬôv\YÛp[x/MħB`dŜE -FgèAŒîGtÁLÒ2‚ JhÖj\ĥ¸‹ŭ{vQ bŽŠ ڐiƒ²O*”ï!}//<´ÁŒöJä(yc-Ġ°‚FXÍ0Mˆ’˜$JħI†É4ġ*Ż‚hÌCşÂ‘$f‹-ÚA•ĥUĴIq”éŞf­5B9‹o›CGbĝéOşöÎw“/}ù„4›ÍüB- öŸ ğ|á]j'´“˘´¤4i&çû>•J%'0Œ[œ]YYa~~žÁ`@·ÛċğżûğY__ç‹_üb‘<[Ï ŬĊàѤİ‚½{÷òҗ´ƒ[^^ĉĉ…°İKì³³³ÌḬ̀ĥĥĈòòrq˙,˘™™)T­}cc£èb&ĤiaÑÑëġPJħ¸¸H£Ñ`qq‘ Ö××ÙÜÜ,:£ò’tıvßÎöÜÍĤÊ]•µ¤¸@d´,X;Ísh|·.žI3´4X)XÈRD”B’ ¨[MKÍêfkf:MÂ'ÉbÉşŽËX§4İ|áĉHÓÄj™nŠXSĠ¸Ä£÷¤BëdäŒxMÂĈš­ÔĞó´:ažÂŞ )ž!î>ÒÒcœ;ù$Â!r)?%”')ħĤ˜•wŞĠ*ğvíbaa7ñ,--qĝaâ8fvv–,ËĜĜĜÈ:´2;;{J)•~Ç%%€÷˙ê˙Ħ÷w>²ôĦ}è3O~rĝ³?û³?zôèÑ×Ŝzë­sżù›żıġ‘|äÄòòò†µĥ†á^!ÄPy.PÜóuğ‹u_eĊoTÁ,ì÷ûl†!ëëë,..Ç1‡âûż˙ûıì²Ë8zôhu•e}ÜQî4ÜíÙ·o_‘¨Üümuu• AívÙżAp8qâDaF˜$ •J…ÙÙÙbé6IΝ;WÀzċ9‚ùùy:á°H .Éş„éşE§Ŝ1iDXöKZ__‹,˙ŬIë8F£;F—àĤÑ')áMJn0šFɐnڂ²ÓÉËEŬҝEá>cŒ„„™É?ßñPòôħĠ\c” ¨­™.Ŝ şSšÏ\Ħĉ˜“œLJyò°…ïĤ-Oğî/uŽTŝŠƒŞH3‹tĉ^N³y wÁ ›íYj~5|’Ġwsö™‡ˆéȨ‚´ƒ”Ïj"ŬÊ.VöħÒÔ’îyÏşıı9öìÙÂÂív›jµÊg?ûY>ŒçyĵùÍoF)Ċ‰' ½0 ż4;;ûÈÂÂBô™”Ŝóó˙BîsŸ;uÓM7Ŭvçw>óĞ˙ŝ×ŝáƒ}ñûß˙ŝ÷Ÿ{Ŭë^÷çĝÀŽÜyçUcÌkëġú›•RŻ0ĈT<ϓeÓóÄóÏM›MŜŜÍĵ\…›Œl&?ìŽvÙh4Š 2µ=MSZ­ËËËÜ}÷Ŭüȏŭ(üàİVĞhkèTĞU,–$M 2äÁbv&ïHšÍ&qšĈIaCqòäINŸ>]ŻƒÍf“ĊĊE”Rœ'zkœ\ħ^HĠ·ˆÀĜ-‚`copŸ”bDJ&ŞĦt.=5P]NGu|+@nâû}jaÀp˘3Cf9£LĝîâF×ĥA§CÒĜàµŞB’{TkuRcI¤ô%Úô ²}¤f#jTċħé’Ê"Ĵbôş‘‘É H„ĠĜa‚Êr˘`v™]דWµA†m"5 ÚŽÑ>ġ˙qĉÌNŸ>=fĊîİôĦŬû‡ĝ‡ŸùÌgŽŸ;wNĵç=ïùÛĝOèCâ–[nùÒĈĈĈÉJòÖjµzMšĤß÷·ä:i^:eÖÉ×Ò)] ‹oZR›T&pÑuLŽùâû~AwPٗô%ëğ‹7ñÜ~ûíìŜ½ğ`Ái­G*êiÁhsğP.)fYFàċpàÚÚÏ>û,QQŻ× ˆmqq‘ĊĊE6779vìQÔm!‹‹‹AÀÚÚǎciiİpŞuD„(ЍĠjìÙ³§è°ĞnRètšyıSÙ.Img>͆|òw“żŬß·ġ2&W€ĥOH|ÁHÇU¸;÷nĞya°ıÁêĈ:kkëù~™4XkŒĦ&}"ÛÏĞ÷Qݤ$Ŝˆ\ HP)oBö IDATž W"/˙Ĥâ-Z ʧ„\§Z,™”dH··APÍŬb“,-Ô Ĵµù˘¨Ŭyŝĵ‰Â´.ŸÉ”àc“–5ûœ:‡Ż}Ĥ$Ǟ·Ô˘u~ÜrßùB LħËä^ŝäìÈÁÈJ)ú[粍_oĉ˘ĴVáy|9-‰ŞÇ݈3P⠃4>Ĉ ĴÑH òûH#3Hĥ2R<¨ÌÒ8°‡ÎîŬdñë¨ĥš ­Ĥ!T'Ĝ:{ˆsGñÌS!FqĊ´ò^Ħûìıcw¤ıïŜ½›]ğvQİTè÷û<öĜc?~ĵ`;)7§ÓÇqvìĜħ­ċċċNç–kݽöóo}ë[ûùÈGĝŽNJ×_½=tèPï/}é#ŭ˙Ù{ó ığîûs–ğô6=‹4’F²eÉĥĴĜ²#˲Lœ8{Â^Bá§ÈÂR°UQlE^ òÂòTQEv¨¤CRy’8g!ĈÁIœ8ŽcKŽ-ɎµÄ²ĥÑ2ûÒÛ½÷,ï·oOÏx´@@§jJҌĤğ§çŜó=żßïğüġ_Ÿyĝá‡ësss'î½÷ŜĉßŭŬßùżŝëż~ŝŻŝêŻŝéàÁƒgµÖŻBÜ)„ĜâœĞ”úâ¤ÜÏÏ_9Ìü÷²ë^Xĥû VSËèŸ]vYĦ”. NgffȲĴç W83œ?žŭû÷óš×ĵ†|F£ħŒN]°Üú)à…]QqS*éŒş‚dQĥnŬÊââ"GezzşĉA°qFĈĈĈ8{ölïëhN…3uAzÔô˘-wħVH?%ûb•Ó·JĞUZš)](ìoÉT³Ûâse=HA <›;€‡!(& BB ¤ÂK’Ο=Ïlc…f'rq-|î$mRJJa%¤Z‘hEK ½aÑ$´LJK—ˆ…˘&$5'İY¨eħTÌë:͝ &Ȳ’ĞÂ5ÜYd!mµéFN55™5àş,Gï°R\RN,K ¤@ ŭJqIfl…Ü­06})™ħERmŝ„ùÉ?M\÷ïž0R„a,‡ èŭ­Ü#Šû'mL"ŞšHÒ4Žf;ŻÀI\;–NF`˘¤›í$­ Ĥ‰3áĦ:4Ȇ”Fv’èĞYLĞ\uu@¨ÛÌOĉìs‡˜>ŭ íés”Ô4ú~‚ħ[0a‹VµÖşw@ĵöÚkÙħcċr™™™Ž=ÊÔÔ ½{­xĵû‰‰˘(m·Û­ñññS;vìĜw×]w=ĵ}ûö‡ŜúÖ·ž}Ŭë^ç€+ yÜsÏ=ú§znhhÈlßŬüÜÏŭœ}â‰'ÎŭɟüÉŭŸŝô§Xkżîœ{]RÙ†á5F#N’¤gY´8.·RşTKOôġëW•BÚ˜úÙ/CCC,..öލBìZF÷ïßÏĞ_ŭjîĵóN{ì1”R½ŸĞ£bs/f)Ċç”=ßıVĞĠ{üN§C½^gëÖ­Xk9tègΜéYÑŻRݍo|ƒ3gÎ0==Ŭˈ*€!Š"Z6£££Ĵ_ż­5F£wZë§ĞŻĴFŝ½ ôBqëċƒÒĊl†.T-ù|çBXGàì·Ö>e˖3?ôC?Ô,é (­X?ñ?áX /é­ÛnğÍÍ?ŝ?~îƒüàāö§iúŬJݸ>Š˘êÄÄDX.—/I`ĝV™uû܅òjŠ–ŬJWçRİÄSSS=Ë N§C³ÙìYíÛ·Ûoż½çMUÌ ŠÄ×~*uÑ&,c~v.o…aOĠ?<<ÌşuëRòì³Ï299ı,v£ R?~ĵgk_ĵŒżÑÑQĈĈĈ¨T*½hċ•š‹U*—˘d÷ŭBß1˘ÂĊĵî.Ô[öyÀKhĦ¤%))I½C‰< É›ûĜ ‰IRMĤϟcjb‡G{ADˆ2!F+ZR2£ sÎòÙıó$IFĞ“bŒĊ£Ax!HïÎӖpÒ'CĜEB' ŒâAá0à]bĜjšÙ"§“Ö)Á6³{ŭ:~ò$§Rq„gsR…ġvĠVój~€9É#§ŽŻĴ.ó _ĉĤĊĤ/ĝoÇ!{†\@ëz&͎AʈÌ”öäc˜¨@âœ_vŸüı½÷ĴŞq~f‘ĈÌ9†•4„ZG=քF„¤2U Xż…áúf˘Ûq>"‘eÊA‰ Ó<ÂİgżÄÙOĉ³;ïp”…ñ–Ĥ”ô*·~'†RİÄĤM›ò̲ `rr’Gy„ñññe]™â˙vµ&‚–RŞÁ‰ŭwÜqÇÓŜû''&&NlĜ°aîmo{[û­o}Ğ}˙ûßżœ%xŠ.ŭÊŻüŠ=tèü_üĊ_ĝĜÇ>6•Ĥééf³ùÚÙÙÙW­Y³ĉšVĞ —°[ „.N+Ŭğ‹‹}9eT.ğÙµÖ ²°°@³Ùì U‹™N†‚ŭQ…Ĉ§'Qġè”J%ÙxĠĤŜŻı_ż´àĴ4—jŻ]Î×WËeZmf´Zutáö]^h<𲐄Â!½AáŜc3ƒ5†,IiÎ6™8{ޤ•3+ˁÂw,—Ċ:aÈÉĴĊĦ…yΧ Ĥd9żċE€Š$Z^5ŽHu] š C†!AZÏçS\U­á]²Ê`0á™2 *ŞÌ­Ġ!f˘IΚ6‰tHB|šé oçÉ Ï”ò÷/˙(À(ݜ\ïûœ3=ú÷Ŭ֘(œ/52y'ş£ıÛF3QTJE†aXPéğU^7ĉ|ċ½ĵ<šDRŠ5™mҚ9Mgh”ÊÖíŒĴàäé9dÇR–kÙ´ùµdé9%!\O­|-µÒ’áµDÌ@ó(ógçÔĝçĤ0PÊŸ€I 1Òh:X‚ŒŽY:$fYĈĈıġÖ[{óäŭû÷súôiBP.—{ èX˜,Ë‚ 8QŻ×ŸRJ_³fÍ7vìĜħ˙ oxäpkûöíÙM7Ŭä?ŝñŻN]ż5ßÚêĥġ²~ƒ§ŝâ/ŝâSÏ<óÌÑ ‰‰‰ġċr9\™!³ÚÍ÷bfJÓ(ĥ?ŭ|ż³8äÂӁž~'Žžˆ­°šœœäÎ;ïäȑ#t:e³Ÿ‚EV„ŬlÖÚÜ  E{nqq‘$IzÓÖ×úW€Mq Ç1k×ċšk!5YòŬŸ'Uñú[x+Ûk""Ĵ<ħ^ĴZew9Àsı „Ÿ³Îbˆ•$ôé,HÛÛĴ“V›İİ):E‹‹((˘ä=I(i¨€ñÀ1ž58ÒXàDĞÁ‚ġĴÑ ‹Çâ0Âb´Ċ+‰$D2i}á5ÒCì$% lŜz›ĥ 'dJfĉ™·ÄUŞ™ĥ›œ)uĜœÀöá5<Ŭ>EÇĴŒ] !eÜe‘–Ŝ3ÑûŬJí@HĴÍ(•ÊDQĠ#8çÁ‹ËCûÖÚxŬAT—üğ:c‘§R-QDˆn^"•‘­IQü{vħC)„mӞ9Ċ9ğê:Ş#70äG˜˜’4Ċz`ĠÀR/)d ‰…·›,L˙3gĈǙ>~ ‘ĥQdh)ґ9I·°NbBù!JRÙê)GA³ÙäĦC|ó›ß쑊CeĞĠ*Òğ1ĤcŒiU*•ñĦĦĦ}µZí‘ÁÁÁÇGGG'_ġŞWµç{§Óí8]r]çzç;ßé>ôĦ|˙ûßŝıçž3…†f%ĝü{ĉJß +Żœ -Rż"ĵż•'„`xx˜N§Ósm(6è"òâĞ_ŭ*ïxÇ;ċäɓ=_²4M{?Oy/ì D )Òf‹9N­Vë9Ž÷'OUUáÊPô²”Ĵ[·Ž7ö\(bٌ§h˙•ÊżĠ*™ËmÏ­Vġ;\(Áöb3­K“ìĈLk! ¤BáŜ#ğéĞ8]ş|Új#ş9XĦdI Y†Ĵь5O7Ĝ?3Ít”Jè¸ÂT§…‰@y‡òÒ:È<Â[PEĜÁt[URiD—uµÙĴĵmq,]à˜jA%àuI€êÀœN‰M‡Ğ†‡¨Íœc2Í@ċ.ZÈ!˙]]x³ï˙{! ]CqĜ ‚ Ӑż^û˘C6żµċ^Ö³6o!k!ˆ°+@/ĉOùŭg]ĥìpTìĊk£2εñJ,Lžâ‰}_fËÎë6ïD g¸EƒoH‘áƒY#œ:óu&żù$Cóš6)€’ÄIM’:¤ÑÄ^€ ó{H8R›€ÈrnF¨ ŠÌÍÍġş"gϞċÜıs½–|Àg÷O“eÙBı\>Q­VT*•SġzŭÈààà×\sÍÙ×ĵĉ5͟ŝéŸĥ÷ß?żù›żyÙïîPzëSŸú”Ĵ~ĝ˙?üƒü§{?ÎñÇğJċĴç˙älî>m½ë =;Žŝ°ĵ•7hETlŭàSB·PĝŜġWLŭ7lA)èE‡aĜÛàkµǏçȑ#ÜqÇ9r¤_ /û5 ŭ-Â|_RğgĦpÖê´{SaïşÁΒdéÒ)IıZĦVĞQĞĠrÊw/²nEV¸MŻlWßĠÀxpyeáğat8'[2;u˘w"Çy|÷9ŒËßb‘>·ëqĈâ­ÁuÛ]•KµïŠßżbIÉߍÈB€5DÖS5%é0d8%ˆ|‰°’iƒ‰5Ö:ޘEmñ훚34Àaáyhzšƒ³ @Ì`“ş”V{–QŸUŽÄ#ħ`5,ş³›"E–`8 hN'|ĈœĊıšïŽGİ̝ĉ|­ÁşĤdÏÚ1Ž9ÊZI Q aÖä‘áŬŸ.h!‰w¤>!ï":MİÇ4Û ²@!,ŒV ´uLşˆŒÁ–ħF ä+œE)Ħ>Âtr 1nŻ-,ĤZ\6Œ“ TÒUÁ5Ѹ,ÉŭüÈ)ŝ+™ċ>ĊĜĵ)˜'ì:OìċèÄÓ¤›73ĥéV”–ÓanvŠ3g33}–,MAÀ˘!´xó{Ñç&żVJĵo÷ö„Pċí·Z­ÖK (·…Ôˆé×cZk ‰¸U*•Ĉƒ ĜW­VŜ;666ısçÎÖŜ†Îk^óûÁ~ßġ>_ħ>Ĵŝàŝ`ĝÇüÇë?û³?Ë˙ú‘ğŬ_ŭĠ_ÉO~ò“ÌÏÏ344Ԑvğ 2·Ŭ(˘" ûâ˘(€É/3rĵôLjµ–á…¨âĈ´ÖT*˘(Ê_WĴ çç‡ĉĈodÓĤMÌÌÌô.~Pêgí´‹UŭESħ… ‚€jµÚcóUVÑÂÉCù–b”µR¨ ×Ü,™.yò“öŝtŬà<#óÊFúî{•Ë‚ò È:´Ê ĵdŬÏçšµÌcì‚:£K̔úwüÂ%şw3 –Ġ•*ż‚MİÊZ´ÈuÂZâÔ£‚ˆĉ ä˜ĥX˜çx§…-Ċ„>ìĉü8”ĞPxµJ…#˙U I­ċÜÂ,“şB=ŽòCˆ÷„E·Àù^Zİs­h ‚C˙ż—Ŝż<çI%Ž ĠÂ —GĵżÔuRAêqNöu$™vğMğÖ-ċj€óF)ĵpX›ä-ĵ‹^÷ž(îċÂÛħŬnsìĜ1:Ûe [° t C·rٌ§ #3˘âW$T-…GdÑı(î×B˙kmG)Ġ*—ËQˆ˘èÔÀÀÀ‘ħħħÇoıċ–³;vìhŝàŝ [³f˙ŬßŭŬġ>_ħĥnŬjS˙÷˙ċ}ûö]uçw½bÛ;ßùÎêÛŜöĥCú÷ß?çΟcĜĈ×Ó%]Ìŝ¤Ÿĵ°Úk-N]ES†EOz™Úğ?‘²È “v Gäz)ٍ Xh..ĊuÛ´Û½4gJD1şh4Zİ<_ĤĜül×ÍÛċÌBôé mí.8/Z­RşàìzWYó›1wÊV’\ñl·"­ˆ'TŻK͆´#ÍÉ2·ÀÑfƒDdıWÔ9½Ĝ…Ìŭ˙ĵEŜÉıiŽ×Û"âNÎS ‚ĵ p ‘ó¨‹ĜxUkĦSòÂ÷Ċ”,jq$d]’À"Ŭ—ĝ~‚k|Ĵ³4—ÌAÉ$HÓ „Q 8œyy§” ŭ_qŸdY>KE¸wB% µl%@–Ċ ¸èĴ÷Ùèèè2ßÊsçÎħ°°#÷`ßd˘(jh­O†aĝtÇ'ž]ğví[·nÜısgk×]×öµà§~ê§ŝCŜç+ ô"ÖOŝäOşğïûü<ɃΝ<~âU>úèž×żŝġ›ögĥúŽwĵ#|ßûŜǗżüeÚí6#k×ô*•‚p!ëú˝! TœŠ.ä‡×˙˙ Ò­V‹f³Ùkŭî ³³³Œ³cÇöíÛ·jêîÊçêï‘ŻžAôŭ”ò‹ċUġż/I'íV5ïrp’tç!À|k/\ÏJÇÊ<÷ĈË|st^sX ™KQYîd }ĦÊUì2˙&¤÷˜˘Ċ$È pQ"…fG+?/z•R˙Í( ECž|ŝşs é ´"J=r8P^IÍy<_Oxzn‘DDyìEj²k\öJyh Èç4ĈaM{´t”+ A^yH/ħ^ôüò^ʕÏg%J½û$ï„É̆9ĵèÀçê,ĉŞ/M,ÀĦ¨"÷(ŠH}ÒAáA~ħ œ“Zf·Ç1•J…RİÔ ËlµZ=³áŝQ@ñœŜ{½ï„aĜ*•JqïĞT*UĞĠ}7n<÷ò—żĵùÊW²½sçNwĠUW½$ç€+ ô"×Ç>ö1sÏ=÷ŒàĝäÇ÷î}ŝùçïĝèG?úŞ|p÷]wŬµċw~çwޝNG˙éŸŝ)_üÒCËN/²ÏÖ£8y] ˜.TAUÖjڕàQ莔R=?ĵf³ıŒ6žĤ)Ġj•½{÷ò½ßû½lÚ´‰gŸ}–Z­ĥ*(öŸ$/`Xˆo‹ŞŞßŽie|öJ2@šùnU˜‹+ÓĴC–%¸bè]ö•ßÔ"Ԉ ߐÊż?tÎZljħY†OY’bÒ cFxİ)İé<6³ĜÌa•è #/ğşÈçŠJİh? ĦhŞKHXÚ Ħ„Cıî(šJs2kñdcž$Ġ”ŞxĤ“:’‚Ô¸ŜlïE-ë 2)ñ^˘I4LHCÓzê¤óT”˘,`ѓGpHtòüÊ÷Ĉğœ0?£Ëï—îàËċN ƒġ‰í s%’ÄŭK\+eYÖMn]êxÄqDšıžVod½Ä˜2Y&ȓĦPÉeħĠ{s÷àV´Ż •ë† ŞŜ<„(QBÒNZ½Ö|ı\îUY ½ÎĠ˘[Ĵµ&˲ŽsUİTĈApJk}dŬşu{÷ìÙsĉŽ;îhíŜ½ÛnÛĥí%g“\˙€ĠŬ.ŝïßŝoŜwß}gž}öÙÇÒ4½óûîğëÑG½ŭ•Ż|ċĠï~÷ğËo{ÇÛġ§>ġ)>÷ıÏÑh4èy·UĞĠKĥî.TE…ÔßĈ[í˙ġ· 1”Ëċ0D‰~òĉ'X\\dûöí<óÌ3ËşûcŠħ~­S˙k/(éŭĠĜjÔn)5ĝŒÄR“¸´G…Š ġhT¤aĦĈkSyk'°Ŭµ÷Y\jI[:Í2Ii.thwš4Z "§ˆUˆ4Ŝ9Ò,Cğ Í;. >úZAtèÏĈQBtYwa=Bƒ9Oš€!2„h/éš³Îr¸ŬbQċòĵôŽRŻPA˘Ğ‰‚˜áuŝğЉH˘˜YïÈşİıCE”µd1sù<Ċ „ôœi-g8:ĵ ğ§˙ˆĝë K}0& F8ĵıOœË.òw)˘²RJĵc™k~~ŬçQ*Î<˘f§cĤÎ,%u䝭.ŝü… ĵ?²ßò ٍÇŬJÉ py²02Ş-˘"ZŞĉTïYĤÒ45ÀBÇ'8>888x*‚CO\wŬu“ğvíjíÜı³óĤ7½É~;÷Ó+ ô¸~û˙Ž˙wï›ùÈGΝ8qbŸsî5ùÈGŜĝÀìxĠĞïyûÛß^ŝéŸŝé˙ñı˙ŝûœ.]lÈŭŒĥˍIïo›]Ì˘÷Kï·Œ1TĞU†‡‡™˜˜è]üAl6‰˜#Gްk×.öîŬËÄÄDDV \ùšW³?꟟Ĵ½~VáÊ׺Œ2í22—‘Ĝ”T¤ˆXTcÂZDG¸J€P "‰4.X-ñ Väč@{…°V‰Û Ħ1ˆ3 ÒùfşifdTaƒïÍ6.U%]ÎF¸Z†ŽÂ£en+…í†óħ”äérx""Ĥĵç`gç:mP1>ô¤ĥ…*Raħä`ĵĈŠôĊ]àJĉ› qIîA¤XH›ˆX`…ÇK,%• H·Îc½C‰•ż_żäްì}éo3/™ì T7Qˆ C‰1/ò*Áġ‰l_Ş%¤Ë•\&ÜöŞĠ*µşÂ{Á³g9öÜ<…“/@ĝş,P,f:ŭ)Î9ŞKqH!M,yQvÒ¤Òo VÜgŬñŜw‚ h•JñRİ´oppÑz½ŝ¸ÖzòÎ;ïl}÷wwûĥÛns£££ŝ?c½J/Áú­˙x˙ŭ=ÏŜ˙ŭçNŸ>}`zzz×G>ò‘›żô/Ŭş{÷îÍo~ó›Ğwß}wĝÈ#ÙÏ~ĥ—tİ‹öb­ıK‰q‹Ş£żg]ˆi§ĤĤzš„™™új8ÀßĝFÖ]Ëĝĝxqw1îj€T<Ñ:\ HWέVÎdLÖ!ó@T KyuTRyĉO5ÄIÀ œ–¸@â$ X°ċ-Ú ”—ȁ2XÇúršvr‘ĊÓS,NÌÑn'„QDİR!i¤ĞĥĠ€ç[Ħ÷Ú°tçYäv?ĊCôŞa+1Ŭ :šĥí|k†…êZÒó€'ŽĴ€v§ò Œ0bğBœuà½CşĵrjP¨^T€$ B”êôϽżpûŸa·ÒíğŸ.]o6÷ü >ËZHĠûŝ—rċ…R˘GĈ1ĈP*i6oŜ̆1M'mñÌÁ)&&ZH†°>Á[òÒ TÚ k;?żç"„ôDBkEe›ĥZ-Lš’y÷‚ïïVJH1-Ôİjµz ^ݟ*—ËG†††öŜp gn¸á†ĉ˙ğ믿Ŝżï}ïûOŬ?ĠyéÖWyÄ=ĝùÛċJċìù‰‰oH)÷ÏÍ͝:vìĜâ…àÁƒÑ]wŬ~ôGT‘%)Áüܝv‡0Ĵ1:ħDóìŸıô·ÀúÁàBíĵŝŞĤ8…Yk™™™ĦZ­öô ívğG€¸ŝúëyüñǗÑÖûĊtE[bŽ+_÷J‘Şï<.óĝ „Ï#ĵÈ0.% P1á‡*ˆá r¨Š+‡¤|=F×*#!ġM}PQP Ġ4q\Ħ()QB"u€”^‡8­1ƒ†dPħ|#2˜Î„Ħ(À—4óŜ–HĊ”È0¤ïY°ùnÎw§Ċ‡DáĴG)éêt-ÑÖ)Ċ—Da€ T]‘jB0–jí”ĴâĴ–™µ’{[óŒkE¨+D­„ „F8 .§ħK)°Ĵ4˙WtÎŝR^“jhE)eáˆÛ–úĜZĈ²4օÏÓàH£"‰\ĵi\.ìôÎ. 0 $A„9ó°^+S %qä)EkÖTq~ 4eà,_˙šäüĵ‚¨„e- ^\|;S6e†P–T›)œQH„1I‹@…¨nĉ“Àá\ŠsRÊÎS)•IŒ Ġ6XÀıŒ[w–ù_wżœ7?~”û>{ŠVŞQe@´)H,^ċ3Ħ }8ğdìÛ[šyʈr9[oµ›´ÚMŒµH­–ħ÷ş€fœs RÊӕJeo½^˙š5kîÛ°aÇoıċD: IDAT–/êUŻ:ĥ·½mâ×ŭ×;>ĝ ˙ó?˙ó˙ûĉ•Jé%^7ß|³R ŭ?ü…‡~xüÉ'Ÿ|ĴĠjŬħ˙ŝ;í×~mÏöíÛ7ïÚµĞúŽwĵ#4Ĉpè!üċ/sìĜħŜ|Ç9‡ÔŞçê]¸•R=ħ[ż+ĝŞ­˘â)*§Z­Ö{ž"TݚsçÎħcÇÖ]Û î+f@ŭȗŞúE·ĞÎĵ”Ç‹°-4™ËȲFd Ë1ñ@•hxŞ!Y(°:%,TËUF6–óż×BâŠF(ñ†Ìĉš)“e–vĞC³•ÒiÛ|.!Z*ÚİB†İ%QµÊn°Îbí ó§'i-fD”,Uhğ„V³M‚GjO Èà˘•Ò ÜWŝ^=Z€@é|Ĉäğ›•Wž’W$Îq2ëÎ2çìż+ıĝ[ž) zÂß>˜ÊЈeĈŬ~I z‰kħ˙=ÉSqğŽîŜaír÷ӗ–_ëKŝÉâ2zwA\‚4/Û•³â¤Ê_G\ ñ$´Mw£¸2ÖÄQaÖÎÂ|~˜¨Á [Ĝ³sŻ~ġ ×n='îKĝÊC4! ‡ħË@iR“9səRKĵhuË"{Ĵ &nÜĊÁ›;ĉĴµFJÙDOTĞĠCCC__·nŬ‰Ûoż}nϞ=í={öĵdìı+ ô´Ŝóž÷X`ño˙öożù™Ï|ĉÌĦC‡›ššşé§Ÿóá{>÷ŻlܵkWüêWż:~×ğŜ:tˆŻ~ġĞ?~œ$IˆJ1ġz½ç˙V\´…1âjŭœĈ P*dgggY³fM/9Çôô4Î9nùfĈÇÇ{-•ŝĠĜsĞ͛.ÜgÂK¤–XgèĜŻ=qĦ+1A­Œ,kÒ(–ò`™µ† >"•Gh‡—/ ˆC—5 Ötj’ĊEĊÌB›f3#³¤#PUCЁP×ꄃ†`ƒ§ŭĠ)’F›ë¨ÇUĉCKbRBeŻÈ.5d_EÛ´ü ğĵÂĠ^Ħ•ƒ(MÈdßÈ4L‚”yëñÛJŜĉş#rNƒíĊR@§H„÷„JçÌBçA œż0ġ˘+ĵÇû%™€)˘á uh-‰˘Ü€ĠyÓċ^jµ:çMîÔ!ĥ˖÷€ħ ÌpŜeŜĦ°i |ƒ”)¤+ħ~í ;odû ó|מ€kŻeá\/üó9ŝéÁç8q#à#L²2›4I‹ÜÂKڊûş8dĉtsÇâââ²HўB8!„ét:­uğVН,—Ë_xtttôħmÛĥÛĥm[ë-oyKvÓM7ù˙êûäPúOX?ġS?eĊù—ùĉżŭÛżyôÑG;yòäíSSS7|ċ+_ıjïŜ½·Ĵ]ğvë_˙úò/˙ò/Ç'NœûĜÇ8täpÒ=88Àìì,•J'|]Ü°2Ú˘ßaĵĝz‘·tŝüyŒ1T*ĉçç{ìÀ‡³k×.~ĝជ]ñŭEoµ9ӅĞ7íğ4WéqXĴtˆPT$a­„Ż–eM|h݌Čm^Èúaâ8Dû/=Bäúë4k8„PHĤ* B”ŠÚ#,ĥ2›ĦÌgS82:^âB‰SU˘şd Sĉü“tš ‘ İÖи¤…h'hëȔĵ$ón5PzÁ!B8Dw¤UNPA€T:Í´óuïİIË%Ŭ¤Ö—VĞDWÔës²ë6%Ê ĥĝıœ'“bÉŬhĊ5ٟ\0rûWÑç'ğv]EÚİ˘TŽğ£’˘:½täUîĜá…µ{÷îÖŬwßm~û·ûżĊ>x”ŝ‹^–‡ óòÇïküó?˙óĝı‰ó{?÷ıÏ}ω'î~ç;ßıíÇüÇĞ÷Ŝ{oXDĦO¸1k˙Eßï‘ĠÏÜ z½Îôô4J)ğî:ĈÇÇ9{ö,Ï?˙VŻ×ŸT*ûFFFö^}ġĠŻxĊ+šŻ}íkӝ;wş˙Ž{ߝÒwÀú×'NžLĉg~fnrròÔÙ³g'yä‘Öm·ŬżéMoŞ=ñÄAAá.„ħQġ*œ"Î<‚eLı•˘×~›ĦóçϜëĊIÀ722µ×^ËŜ½{{v(ÑÁġér˘ĞĠYú·Ò çsġNáêlĴÁX‹ó“ ”–„…‚¨:Ô@€E¸H£ê!ƒkĞÔëš80h•á…ĊJ ‘Dµĉœ™jqnÎ0Ût,ĥ &sà ¤! ½ÇgÂĜî96ÏT’|’âÛ™Ä$`BĞ*#~‘ò`Ì´NÉj1>ŽhŽO5,ëK#´]Bf2„ı „Ĉd­4^8¤Ê7Oés%Œ’yˆ^ĉ=µ ŒµŽX+"k¸jxˆÑjÙ³(Ħħħĉ íp¤ħ€c‚Ôbƒ<+§Ü§_ZžFc8™Ç1hI—Ém›ħu$dKK°:†u•Ç;óÌYƒöš’ġxġB2Bq:爋Ŝ\}Ġ˘H£ñŒ •(ŬX‹9‚h„ñóö=5M#m›’î9Ö T᪭‘AH'mbĵA'ĴŻ–ıġ†*ß˙úa~ô­cĵġûFıáú&Ĉ<מ{÷~vŠ÷˙~ŝġó§9~*ĠtHaŞƒ#Z­Vż866öÀĤM›îÛ}û§ïĵóÎŻ˙Ò/ŭÒı_ù•_iŝëżŝĞù›żù˙ßużğR)}­˙óŝùìg?;~Ï=÷|òáO|àĝžù‘ùÑw½ë]7ŬsÏ=ċÉÉI†††PJġÚoNg™Ïç—µÔl6ɲĴ§aJ’„ññqnıċ–žĤİĠʇ·R gÍ%ûBNÚBT ÑĦ'ŒÂ(× ċc‰’¨P*çQByWDJ2#è´;œn4h6Z­“y„×]âƒÄːĤp=Aħ ro1#Â{œrt‚œ´ġki‚÷ŽÀ†„΢@KÇú° ³a˜dÓɑi²NÒ [´Öĉ ÔŭÙ Á³éÓ]ˆ"ŸWŸË #ÖZt×bFĴÚV/Ċ·ċ\éÄ˙ûÍ|^5‰.àz „r{$qÑ*RkÁÀ@ÄÌ|³ύ³çĉmèšÍYêµ1f”V(i ‚HƒĊ \L;U¸Z›V¤c‘˘…J;ŒƒĴ_³…—ŬÔàĤ›kìş½ÌèúŒĊ…”§ž]àà“'žżšÏï˙{L–‡Ú* dĜġšKóC”ÓË~ŭd„â0XŠ@_ġÓ;>‘ĊĴHÑpÎMGQtthhèP½^rtttïĥmÛ&şÜéΝ;ŬŭÑŭĜç€ÒwĜúŜïŭ^,÷½ï=z˙ŭ÷7ïż˙~÷Ö·ġíoûÛoúÛżŭÛòìì,k×ĊÓóÀşĉ·Z{rŻz½ÎÄÄ‹‹‹lĜ°Ħ'¨=räğwïfllŒsçÎ-sŽÀp³Y­UĠ˙ïeV*Ê"£itIwMUB)¤ÖÔê!:Èġ2BE(i†İÙEۜj§ùfä,ĦP-É<4­'u–Ħ°ž·-³Üi[‰Üĝ4ÑHtċÁtҁ 1Ħ:4„×Bv2i10›Ş-ƒ¸…Í—’™$¤Š0™ ÍÒ\“ Ÿğ8÷‚JŻxŠGŸ½Ï²Ïâ˙fYfĵ÷­uĞT*—Ëċ'+•ÊÓOmŬşġı;wÎÜyçí"§èÚşJßĦë÷~ï÷̟ŭٟèCúħ?ŭi~ìÇ~ìí??pÓG>ò‘rÁÈkµZËĵ°VëċŻBœ·fÍ&&&˜œœäĉ›oĤVĞ133ÜÜlÛĥçŸ×̇Ó/|Ü Ċ9ôé‘@„݁@äU’’è0@*ƒĥËò iĥ2ÎLÍs~fÄBÔ QaˆŒg9öÍY˜áĜħ‹İÊힴC ´q‹ïŞ›6 BĉMiçÀwsÈŞĠj/Z˘Óé$I/°¸ŠŠ¨/Ù9çŒ÷Q*•N”JqŸŞT*GĥlÙ²ï†n8÷êWżşu 7¤]˜˙ħë (}Ż_üĊ_´ï˙ûÇ?úя~â£ŭ(żĝ‹żĝö7ñ7}ĉ3Ÿ)—J^uÓo³İ §8ĠŒŒPĞĠ˜žž&I*• Aô*¨;wòÀô‚ÈreY•ÒÊöO/Ûe $ĴDÈXċq߁è:|R“š4OÇÔ ‹mÎNÎ01ğHˀŽbBçâİEEšXTA6Ŝ¤==Ċ݃çh6›$Íd,hŸoíE ž|zM™h}h #›†)׏<ˢYÀĥihÏUk6°ùĥë˜zŝíévŜZì?úĊĊù›ħz…Ô£ĉ{——ŠÌÒß]A„yyÏÀzDƒî ïE‚ÒċTs 5l#pB#]ÖPV] ‘/s?ż =—÷“yLĞE­ĥQŽ™™ŸċĜÉinŬ1ÀÛŻgzĵDĞuŽr)aš2×]Sa˙‘J6½š—o?͍7Że÷+62´Ŝ‘$mNž^àë_mrä™6ïo°Ĝjcxbt E’ʐ"ÂYK„ ëL$`ûöí”J%´Ö´Z-&''{sÛâ.ÀİŻó`€–Öşıf͚Rʧ˘(úÚúġë÷nÛĥmrçΝ­ğîşĞ³gÏûgögW6µ+ ôżŜŭîwÛżüËż˙ĜÇ>ö‰Ï|ĉ3ò-oyˏMNNŜxàÁ0ŽŜĤÖot)Ú¸µ–RİĚ5k8vìĴ[·ŽJ@£Ñ`ŭúġŒ199Ùğŭ*!…—˘‰÷'çV†Ğ”J1^e8ċZàÇy£U€G17ßäìùifœ Q%Eâ<­(Í7˘š1ĠĜ˜§}d‚ĉ™i² À[‡p¨€(Èc¤ÈÂS% ²”,KHÏ´èœmĦĊ­"X;Bċ•[+!-YĤm[tĉR5FŻfŭwmaĉ³Ë< £ÚÑeuwÎa|ŭħŜġŞOhĵġhĦÌ_³*FĉEĉηa¤t!7ŠâşI\kçÖRÒı‡ëĉI‰ëÁƒÏ ³Ó„şBU8ôÍyôĜInşu'ĠM_Ħ1=N'ċÚkvνƒWœ=JTĥlгÚtäÈhħ÷Ñ9ôĊvĠ…´ĞaqSËRˆŠ% Òċs%q½üıÙÍvÊüB §TwŬš2ÑĤĉcâYÏâĦóL<…=ß$FR!fA T÷yı·š÷XkH0TDe/°iBÚIiœœ£sĤAYZÄĈAÂÍCT*5’ĴAcATs ßv ñAÁéÓ§óĞ;ĝVRŻ:‹YmwŬ[î:àzQ&abZ¤*÷mñğğ(­Ô›µÇzv>ŻE´êĈ[œÈ=ċ.ĥJq çs’ÍZHU‘Â6Ceô)Ŝŭ VÙl†éŒsŭ5Cܰc3aœ ĊĦçyâħžÚg8vÙ_ŭĠ_ŬpôèÑmgΜ Ëċ2išEÑ Ş¤•/ŝsŽRİÄĤM›8x ŒŒŒ099‰1†Ğݚ3gÎPİTzi—ĞUdŭ+³)Jh”`sQ(t)wl>Ċtr•ŽJı‘Şñ„ZĦĵµĤ0ŻÄ]Êu’Q“!AêxñÜsÓ´§‰âQU´m 6E{™ÓËÉmptñZ]wVƒ€Ô Aa jÑ䚀vµNùùEÌÌ˘7l'Û1BÛ ‚§3ÚŻW˜q>äFä 1‘!XéÑB.ž•ÀlŒÁEšĥ‡JTĤ#‹&A—Ü|ĈbqMÓr3Rm¤ šD4H”#îE͌.µÄÈ =ĞİÔӎ˙?{o#וŸw˙Î9wĞ[[Ww³›Ŭ$›ÍE$5˘Di¸hçH²4ŒÇc'ĵȇ8Œ×/âOI>Y F Èd1#fç;v{€×“Y1Q+E‘%ŠK³ÙM6ÉŜŞnŬíœó~¸u‹EŠ™‘ċ™ħï\TĴ]užû˙˙Ÿ˙óĝ½bĥ™FJ—;}>ò|"Gà™b•“€,b°˙ĝžZbrr’N§C–uıvíCVWWo“`{OŭbÍJ¤q0™Áş u\8 öÈÚí6{÷îejjŠ X^^ĉ;˙û‡\ż~ŭ6ÁŠç;hí ÛsĈ˜Tk)ĈĈĈŜlµZ”R§wîÜùÖÁƒ—Ÿ}öÙè駟6333U{"ż¸xìħÇÌïüÎïĴü˙ñ?ŝäôéÓ˙êŻŝêì×öµ1k­,Éĉ~0jĴ†!arŭúu:ë²şşJ³Ùd~~ž­[·òá‡ŜïİvëN{P6XYD5’“£FĴV$%‘JÑs,Ž5xF“jžCŬkáŜÈX?s‘‹o/÷ûˆaŜ÷]!Ŝ\%A8lô#˘s 4§\êÓ!݉Iş§=ŜĦ+W†Ğ KIŝàϟtÀQ¤Ê–kž´5t/*p¤•cvŝÙWH×ĥÖ²Ĥc2ÑFá RMĞ ĈfàŭŭiP.„_|™………[‡˜ ÷ĉò<’ɨAñÉË;wîdçΝLNN’$ +++ĵòÊ+ ¨ü÷ċça éεÖ]!č0 ßŬz½ŝĈììì‰mÛĥ­9r$zŝù燛ŭŻ˙uu U¤TàïŝŬżÈÖ˘Ġ IDAT›ġĞ_½ôÇüÇ?ĝßĝÇfggW\ñ‚ ¸ïyt£Ùl211ÁÒÒóóó4 –——q]—]ğv1??Ïısç³yÏ;m1°y0hä %rħŽ*vqd!rÀU×Ax’´&pÈ4ŠeÛl-'9µÄڏ.’g?†{A#˙cî+ñE:(ÚrÑÙeĵ‰:­ñŬ$Ž"‰bĵ‰&“S“lÊk¤yŠp&/ÉXŜ}Fs§bN Ĵä֐ĉi–:Şpĥ)‚Ž1âVğLُ)F[‹ws£ß–Tvw˘„ÎD›š€Eʧ+d Ž%Y§izA0|üè{`||œ]ğvħgÏĴµœ?žï˙ûÜĵys¸WäyŜ0fà€o€ÜZÛB\ìt:oÔëġScccoîÜıóÜ?|óĝñŭ/}éKúßĝFuU¤Tánĝ•_ù•îżŭ·˙öÇïûî³/ĵž˙ößŝ›w!{öĥĦ|9_šœœäìÙ³lnn211Áòò2kkkŒ3777LĦuÔ'“’1ì,à’”'A2$$# FÈÂËĜÁÎKĤ q‹ƒÉ‹×O-Ò=qf$qšŝġÎcF#6>ĠĦœ$äÀ&Љß["Ĝ½g6›“ÚŒÖDs0Ó08ʚA‚¨Xsk@Îû[Rŝqċ—E’ċ9ŭ4ĦáúX+íDKÓq!.Îx=(‘ä§?ó˘ji´)K*{g9ĝ¸¸c@ı|Úĵ'3Ĝ*Ğ™2%‚Ħğ$£’¤Ĥ§§ÙħcLMMqŭúuŜzë-.^ĵ8t#ñ<Ïóp­5q ÷°ŝ‘E•tG÷î‡|f4ıħ˜A”’4G…uĴXmp… îúƒ]AÜV¤1+ŸŸÒ\ZI‰Ġ â ?’ġµOLéžPĉ•Î%£Ûĥmû÷ïgvv–^ŻÇââ"?üá‡N'ċ{¤ĴŞUU”Š<Ïë;ŽsÉuŬ·0ĵ833sznnî­Ï}îsË/ĵBôâ‹/êê”İHİÂ˙!ž|òÉè˙ÏŻŻ_>tèPçŭŻ˙ċ…axOÒ(wkÊvžçAÀĝĝ87nÜĤÎ^¸pƒ277ÇÌÌÌ}‘Òè2M˙­\‰rÒ̖„Ċˆ‚˜PҕXG %¸Ò%†şÛF,÷Xŭ2êJšŞ‘…ĠG*ÒcÌóĵO}M•# Ï0”ßÀ&›ĜĞ]üD°“…m‚şO/N˰vg-ÂޤËÚ¤£3+ȍF[‰”Ö•’r<¤b³ ¨ğ.Ž-ĉ4 ˆKġgğE™—żš^J&Srß!­ù,'=úްpR>íPitIġó<&&&˜ŸŸŜ8­ĴĴòË/sġêU677‡;cċ2²”’,Ër­u*„ˆÂ0\PJô<ïÂĝĝĝ™]ğv½ùàƒŜ8|ĝpôCĊ‡6˙äŸü“êpİHİÂO‚çŸ>ŝ“?ù“Wżġ­o½qäȑ=ßŝö·{ ċžRİ˘+ÛržçħeËY]]%Ë2Ο??t~˜˜˜¸kkç#Ïoıb“R:N!ÉvV ”,,……½t ˙;í*´°èš¤nBܕœĠ·–ˆ.nPײiÖp{Ħ–˜‚ †„úŠÂâ!IÓé:d‰Ä%x‘!Ğ 2“x~èŻ´É‘C\Ŭ•6n“É+InŠŠÉJÍ M‹jĠñ=lš"Ôİ–BÄĤĥ}Ĉíğk˙|$PÖwĜt-g/’Zp]2ûİIiô=ZĥêjµóóóÌḬ̀uëVÖ××9wî—.]âĉ͛÷q)’iĉBˆ.p­^Żż×n·ÏJ)ßÚşuëkû÷ïżvôèÑŝ3Ï<9r¤ŞŠ*Rާ§žzJ˙ÖoŭÖĠ'Nœú_ú333ĞWŻŜ“”Ê ġr \€[­7nÜ`ss“8ŽY^^&Ë2‚ à~•}Ċ@X˘ĵ+<\†l)²PĴIG ](°9k"c›h˘/ĴróíˈLâ5B6óġ?™ş- ·”çy>Ìú4ÈM†'|âsVú$CV€1/$ jX×°nRÎ]߀€[{öİ+9×u‡ Ċ[·nċá‡fûöíĴ­­qáÂŜyçÖÖÖn[:.+ĴÁŒ1·ÖĈRÊ(‚Ċz½ŝšëş'›ÍĉëSSSŸ{îıµ£Gö{ì1³cǎJÊ]‘R…?m<ú製·ß~ûġ7Ŝxŭ—^ziûŝÏ˙Ù)³e Πòƒ\Ú )†˘N§úú:Q111Á7˜››c~~ž0 I’dHd%Q%I‚ëşRɘ+‹D:à+´'pB‘Cä´ïâÊ*|#ÀQôDJÓYÎYzóCÜnŽ6ÙÌS|§Žˆ"ò@ Û2ċaTŜ)˙i S˜Gh”ÖHÇeġĉ[’„†ôI7ÇéŽ Üys.ĦF‹M7ƒ@ô‹,ÉÀ|V˜áĴÈĤ­Ğ1y‚’!BşÄ6Ħ/ ÑDCÂ*FeŒu&|Á’th÷|znĈ†cîqŒ&Báp­À³E|z.,9-,ġÑ֐ MŽF*pQÒhş2“Ħpó‚ü{:Âzš`ĵĈ˙u³K¤\İ·ùÁÒ Wp UÇ`= ˙ƒ[“£óK`(6(o*Êߗ{\dïŜ½¸Ë͛7ùŜ÷ÇÂÂÂPe§”şM”2Bˆ<Ïóïû0R%‰;gJrĜç‡bYUU´à”Dùı+ÉĴÁHIKÖŻ\£ż‰c)ü߄À [d/}ĈÒAZ=•‹Îr.ÂZĴ×)<à(‚ıwoÍZ˨ͺµ…‹…1ĤˆnWÚZ< %$Ĝ[iż÷³§T8,lnŠĦµi1r,q˜a5H-q´DYĈ˘„˘{lz°ĤşEöş#yÀ:<˘Úì-ĈlJœrzñ ĞëÄĤ¨ŜòlàÄ>h­–?˙;ßµZíĥ=£ÒòjjjŠùùyŽ9… x÷Ŭwırċ ëyY– ÉKk !"­ġf†çÇĈĈN:Žóf³ùêÜÜÜʓO>½ĝâ‹ñO<ĦżŝġŻW‡EEJŝ,pàAû›żù›kgΜy+ fffĈΟ?ïyž7lq••DY }<Ï#Œ1ܸqƒ••xàĤĤĤXYYıÍĠúĥĴ$sëP’Bï’ ;Ÿ[))f] Ħ$uİ#ġu˅ݐĈÔd½ĜÍ–Lk„üìC”ÁëĥÂbH!V’E)èƒÁ šF€ĥ!ÁWÙùúĜL") ĠŜ°1W–Ĵ8"¸BPS ò[­3)n'µğ÷‹jiÊA*R`0›ôûäré“;n!8I30)Ž4än@Ŭw˜ġjÌ(Áßc7;´˘cŻĝ!ï\ğÉİk+Ĵ¸A!û/D”hs;閭a)%ë%ÚRJ:{÷îevvk-|ŭë_guuµX?HŭËĥožç¸k´ÖİÖş+\Ĝ²e˛ë~Áİİİİ·ûlô /$Ÿ˙üçÍĝ˙Ħ:*RŞÓÄħcÇL†7Ŝx•/ùËùï˙ŝïç<£1ÎċÎǽZLI’066FĴŻŻĊÛ·ożÍ9aTv{gŒĊ¨mNILƒUİïUšTf¤V˘D • ú^…µOH¤+ÑyŽ#$™’ Ÿy­¤ R`!q¤$ïĝÚ"• Ó9ÁXUóħñ ‚Ñ kŸ[b.ÜÔÀ)ĵLžUd:'N:QĊÈ3–qÀF·ƒ½Çp¤BۂörS$ÛJžPX) c‡žN铃ʨ)ÁĵrĜ­jl3… Ô¨Ġjt·²„·³MŜڌXŠ"Èsp\ °˜8;Pj†³Ec ŭ~ż¨ú\—;w277Çĝĝ8BˆÛfEċÍ0³ËÚòߖ ]×u/6›Í7Z­ÖiÏóŜÚĥmÛûǎğùÜsÏE_ŝò—ġ7żùÍê ¨HİÂÏ víÚe˙Ú_ûkzee%Ÿ˜˜0eŒù(a܏ÛCy€ÄqL–e8Ž3TâAÀĥmÛ‚€(Š>27¸óùG…e•&„ —‚şïj5˘O,-V[|£ˆ7n\¸†È@ù.™°h4JI\q&˙LŻ´`4ĊRŻ(ÜĈ…•¤QŸV.P.DiŸN;ÄièĠ aL‘$où‘~\ûΈâšhkĈ ¤ א¤ÂŻa¤ÀZ‹GÍqA[Eԅ¸™’ĥ!,B*3ĵÜ tÖċ ÊSLĠ&ŭ€=NÀAj03İÇé”Ċ,â½ŝ5Nu×yŻĞI4`ŭâ?%@İ˘E˜g`ç!ħC†òç===ÍÜÜ“““¸‹1†7ß|“ . gJeиœ3 Äı뺑ëş=×u/Zkß{ynnî•;v\=zôhïĊ_ÌyäóÏ˙ù?݀Д*ü,bß}ĵòÊ+ÙĈĈ†~ÁÍÒҒ,… e ï~-x<Ï#I’áŜO·ÛÙl233C³Ù¤ßï$ŠĦ<ˆîÌXŬ7ÂÁ \:mò\’Ûi N.7ztotq”ƒU‰-ä×Ĉ.Sĝ|ĤP ˆH(ŒiÂXÒ^rI–â֛:=n"ŒŭXCyM†$ee1Óэ@H‰Í-IžaB(YQùbÀr²X8úŜ{@ÖjĴ(„Ĉĉ…{·6ĝ<µİ=NÀ!²Ï´Èsĝ@ §~|s™›QÄZšċ´#ñ”ÄDz),BgxRá¸&·¤IŠ×ğwï^8@§ÓaccƒK—.qùòeVWW‡ïĊrĉÇqÙŜͳ,‹‚ ˆ” Aœl4ÚíöémÛĥ½uôèÑċ‡GżúĞżZ‰*RŞó€Ŭğw'ßúÖ·ÎŻĴĴ,ÍÏÏw¤”^9,.ċÛ£K³‡4Mİ×ëX‹n·K·ÛĊZKğŬ& Ħ˜a”nôEJkóÄ¤@:F8Ëé%ibQڒmĈè\~Ħ³)Àh Öb„Ä‘ŸíuĵS1V(ĉ,:-x!İÎqê.Ê÷(ĜÈNC|²µ+Šjf!Š€!qËÁói]DoĜ‘…V{o_9é(2­ÉuŠ5O(&›-fÇ&Ż7yve•qǧîABÂûô9m5?^XĜĜÄMÇÈ2P‡R9BĈúôsüYÜGg9…S!¸HĤgçĜħk[ĤĈZ³şşÊ;ïĵÒÒÒpĦyTAg­Ċu]cŒÉ1Ŭ .ĥZ­“žç]ò<};wö_?tèPtĝá*4Ż" ?‡•R?Ïó7Ο?êȑ#ğ”^Iġz}xGz7G†Ñ֛RŠ$I¨ĠjCĊŜúúú”šÍĉp·İ´„)[t…Á‘y{!iV,5Ĥ&ó}Â,ƒ°hĥh—Kç6kuÜ^ŸĈĠ”UĦ Ÿ7+QFíz,%Ìgîü–ËíKEN˘ñ%ā ıQżQçÚT„c‹ùÇÌրuÑG8!Ĉ(„ÒĜü.ŻPP,#p…$·†Ġ4Âú'Ĵá —Í^—šçÒQ-Òŝu6[.İaJHı ŽRÔrpRw°|lɅĈŠJ÷9 Q˘ÀZĈŸ½5Ÿ=žN ³qñĝ€ĊĊEnŜĵ9|o”ùGċ>ÛÀ5Ž8jµZ‹ġzŭ¤Rê‚çygĥmÛöĈ?tôèÑèÉ'Ÿ4sssöïŭ½żW}¨+RŞs^)ÙŻ~ġĞùĠĞW³ññqSŻ×ıyóĉ°’)£î%v(‰FkMXk‰˘h(˜h·ÛCb+ĞÛIé6ö+Ĥ˙Ú`r0-À:²}+ŭëm1qúSżŽÂJ”!RއAg.îFĝ4IĴ&ħ·á#äYŽô$÷c¤³ÇžO’&ĴE}Ĉ<¤qŽo-Œ £<:ĈçFĤqk\ÖžE› /é1e{ÚÌu&yèĉ5œÀG5bßá²£¸”Eœ~•s×7É$¤e|†¤Ää9ւ'\\ÇUnšÒétĜ};û÷ïÇêê*ßùÎw¸xñâmïrݍ´ŭ‘RĉÀ†âbĞĠ:Ùl6Ç9Ûjµ^Ûż˙µgžyĤ˙ä“Oö9Rµç*RŞç AĜ~żoëġ:Fƒ›7oÊċ3şÄ:ZéŒŝZ>Ñh „ Ûí†!SSSħ/µ’)ìt$ĈäƒöžÀäĞ5BŒW8_[qËP\• ü§ß­ŬıµĥVX[$ĊZÈ{ ŽiħIñZ5”YĤqp‹ı×=IÏġâˆVhşiÊşŬjÒK5Ž#éYM”ôħÀÁ’ç Úħ¨š‚DCn¨)ËĥÀeĞ>Ïgğĥ„›7ó;ܨIθ?î^äÚ:iB1üq8hBâ*…´g Öj´ÈÈ3;üYìÙ³‡ƒÒjµèġzĵóÎ;\şt‰^݇ëşÔjµĦôğ^ŻÓív 0w]7N’$ö}ĦÑhĵZŻ×ĜjµNŒ­<ġÔSÑK/½?òÈ#frr²²ŭİHİŸWÌÎÎÇqĉ8Žét:ĉüùó²6ŒîŬË ş$2Évss“$IhµZÌÌÌ Ġyw’[Ù+’V%Fƒô$:Ë ³Ĝä`.ar]x Q¸"ˆÂ˜ġgĦR*ì ÁÚ˘’<Šq3>ôLĈ–V€ßÉş 0vo>ħ/XO\7Àġkäič$e%ÍĜp„ĴĦk.ħÎp<ĊDğI¨cz6ĤkàĦaGĜfŻÓdĈ*šJ!IÏÑ\21˙]\½ÊĊëk$ƒjHzÂJž”¨Ĵ <ʔ&!}oì¸}ûv”R,--ñ˙˜ċċċa;oT°PŻ×IӔn·›ûߍ˘hÙuŬÓÓÓÓ´ÛíScccŻ<ĝàƒKŸûÜçzù/˙e³{÷î*4Ż" È#¤—.]ZÈóüÚìììĜĞŻê•³ĦQUÙÇUIċ˙ŭµlǤiJšĤÌÌÌPĞĠ†Û÷ċó–m<#˜"ùǃ‹"ËmÑÓ×@Ċ˜$÷‰ħXŒ#q뵟ú5,ÔvĊ˘Ż¤pñvP¸8dŬ?1àIú&Ċm×İ·ëDËIá!$ö^>ÙRàĝ:3hcqœ€¸ÇıŜğtÌ£ÚĊ•5ҍuZ6ĉ˜×`˘ċġ2p _ˆ6¨+È•Ë ċñĦÎxóúMŜ½~ƒĜw  :>"Ó$q与‡p„k´Mħ|ϧ3ÙĦĠn33³İİ)Ò4ċÔİSœ;wnhùSVË£"cLŜëġbT499ıÇñk{öìy½ÙlÖl6/:th—ù—ûÏ=÷œĝíßŝíêƒZĦ"ż(8pà@eeċÍÍÍÍwĉçççÇñJ'‡û$SÚÂÔjµáòcšĤLLLPĞĠX__żmFuëà’ĊĵÂĊĜBkÉ‹Y‰Ò–8Š1i†[ Ž"¤ÔŞ˙ÔŻaiz*„,ŒW­fD%½ˆFV|ÏqžĦj.µVˆàĉ-‘‡ĝdRÊl!PV§­$ı‚Ċ4çĕ Úħ‡­³³dVn$4Ӕqċ!œ/4‚qÖ|ˆáLowW6X܌Ĉ0İ}ÓGÙ„”µd&Áfd}—s𘛛§kWWñŝûïsċʕ8°×j5˘(*]J)÷ NyžwÑuŬ3û÷ï?qàÀċ‡÷žŝùüÁ´żó;żS}8+T¤ô:MÓÍÍÍ+SSSİçyw#}\…PRYùdY6œ#Ġëuúŭ>ġz}}Qĥùî|î"SiäïÌ­&i,&Ɋ=—YkŽÁ:żüL\ÇR¸!…ì 5†¤†§@j4"p)ĊÀUŜSë`(ŞÎ 0Fä)xŠ(ќ\ĵÊ7z7xf˙^vnßȨQÍrRcLÄ×½>\şÌĊëËXU ¤Ìİ)ÁFĥT²ĜiÊ-B€(´ÑĊ(Ɂݭ[Ĝ>·ƒÉéiÂZƒhc“Ó§Oóáı ƒÖA•ìşîP̒eY–ċRÊĜqœÈóĵĊZ­öj­Vûq³Ù|u÷îŬ˟ûÜçzǏï˙â/ŝ˘ŝŬßŭŬêYĦ"ŞR:`˙Ù?ûgéÚÚZ<55ešÍ&KKKxž7ĴdFÛsw³*Ûp Ĝóĵ!I••ÓĜĜ.\&}–İŻY–aTŠ*X‹›ğx^@ĵÑiŒÑë\Ğ7ÌV°Ù§µ’ş\›\&hԉ7#ĈÂ6ħĠ¤ ĴÌqóœÀ bñٝSVgxƒÈ# ™P(Ç#é%]…7)½>ñ˜ §2êĈ²h´Nú–àhË´üĠá r‘"ĥ˜½i™0|w-çÄë瘝šfĵÙ2RG³%\__g}cħxžƒĥ1†\çk‰­fħˆë(cdRD—ìÚ5Ǒ#GB°şşÊµ Ë,,,Üs/?ûòĤ“k­c)eÁB³Ù<éşî‚”òìÖ­[O<ġÔSWž~úéèĦCzß}ĥŠŻP‘R…ÛÛORÚ$IlTÖûġ½}œhZëĦËs?P.CŽúŜŬ²Ñ)+%1 #&¤Ğ MšĉXkñ‰¤0?ġ|ŸÌwèoRiĵòġŭ´oö°Ĥ‰–LA­Ŭf…Á’S¨÷à#9Bw^çÑߏş`H%HóŒĊ+W¸l/ߒM8Š8ׁRĥ]:°fWEQ4œùìĜħƒ}ûöÑl6ñ< .pĈ .]ş4 ̓bV”çùPè˘µÎn­VğÒjµŜñ<ïC)ċ;Fµ#GŽĴ<ŝĝÑ??ûì³ú_ŭĞU}*T¤Táîp]—^ŻG†dĜŸä0/M2³,£×ë ۀŽl6?ràŜ2]i%Xħĉ6‚ÒZcµ 7†(Ž1Ĉz>JdSìŭĝħ f ĥ”ŽË2Iâ§ ŬMäĈÒ³9µ‰1R€Ü˘<‰ĉcÉèN"şSTR´÷ =…b ‡8Z ı-dħĴhFMoK‰ŝŝŭû9pà­V‹••^{í5o[¤–R$—çy;ŽMLL,ĥÛíׄŻc^Ŭısçâ#<ÒŭҗÔ?pà€ÙµkW%ċP‘R…{#şŬ.µZf³ùħêşSߕ˙ŻôĴ3Ĉ ïĵËX‚rvô€ğóî (*ĴAĊd20.ĈB?IiFÍġqˆÈtŠ]ÜF€Uëa çŒĝÙıÀq†'™ÑôµfbĴIé[îî½^§Q?ÀÑëmAZ„qÁ)‘°ĵ IDATŸËhSĞĠh4<ŝĝC‹¨÷Ŝ{wß}—4M‡ğdÖZ<Ï.CŞĜâÔÔÔIß÷€³FÄĦC‡–^xá…Ŝ“O>İ8`˙Íżù7Ġ‡ĴBEJîFƒġġu”RŒŬ֖û?­˜Êö\Çäy>œM•Ï{§Ğie1Ġ°²8hŠÛ}S€ñ²×K’Œ tñ•d#Ó(Oâ5=êG8˘í$ˆOON÷ş÷ú i7&Èm‘·d-ÂqpÈóÂíğŒ;úˆİëÈ5½³RşíñÖKÏP*RŞé+Rœn·?’{t·èòğa´½T’RùwNgx•ˆaĊ<‰rĥdŠêISzĉY†6Iòˆ(Š˜“Ô\+c2aİ·àˆ …5B"ŒÁˆûtLĝŒ!ĴEĉ–P:¨ÔríÂtš!U@1 2÷_•Ŭò •Kf ħÎn•mBĠ™h1·7Ífß÷Y]]ċğßŭ. c}Çq†‹ÍċÌ)Š˘ˆÚíöŞ8J)O5W'&&^ŬğwïÊ?=ŝĝñ‹/¨ï÷~ŻúU¨HİŸ|ß*çjµÚGîïÄġż+gF£„$„ C<ÏÎ4îfaTÑp†eŠ9Uži>ŝöÔÔÔécǎ]á…˘§žzÊÔjµJ´PĦ" Ÿ ú½È.-^éë,ÏêġşqGĈiQ5EQ4Ü)p%×uoki­évğLNN˘µfbb‚vğÍÒÒÖZÒ4V`B¨‚Œ„ϒÛrœK|m1Ñ&ádµµ”ÌBm Äj/çÚĜÉÑĠèz}\Çââ’j‰Ÿoqç֝aƒ™“Cnq …ƒ²ú¨ùÇ˙ĝW˜ )UĝŒÛKBÄ~ĝáÙwß}÷ÒäääDĞĠòV××è÷ûE;Ç~üa>Z%Ŭٚ+Í7ËáykQ::ܙÙôqDasSĝœjÎŠˆ G*Ä`żIzÊs°#Ġ‘µv /÷Ĵ–Jr,ż‡Ñh ô1 µfsäŞ\UìJ Tž”„ŽÄ$}b““*hïê0ğgŽx×8Ón‡ĊáÜ÷^ &¨ħġ =Ÿ(MnÛ*ċÚJ)J‡ (¤ûeĞ­|ccc<ú裄aH†Ĵ­­ñ£ŭˆË—/ŻĦ8äy~›½“Ö:—RĈžçEµZmQ)ġj†?ìt:'ĥoßòĜcE/ĵBüÜsÏéŻ}íkĠ‡¤BEJŝì0>>ŻuòäÉwòĠ_~PJé•KŻyžÙEw‘‰ŞÂFIİ<ĜGh}ßÎĞFIénóŞQ ´”#™!Ot!~$y‹[óħĴĠ(Âèbž$Ôï÷‡ȝÑĉRJDÏ ‰P -Á(‹–‚\DµĠóÙH6ÙÔ5éÒx`o~Ĥ×ûĠ‹/żÇÒËïÂ:àHb">|uKׅÑ֝1fHNišâydß}t:Μ9Ù³gYZZF†”î4M‡9WZë<Ȗ-[8ŝ<ßùÎw¸víÚíVC#sĤÁÏ#7ĈÄBˆ¨Ùl.ĥZ­W]×ŭĦ8'vìĜħòÄODż ż?öĜcĤÓéT˘… )UĝÙ /ĵÀ7X[[#‚Ħ"Ïu]Ĵŝ¨dùÎvŜ°Ġ6ÈßY) !˜˜˜ÖèAzg13ş'e­%í§d‰FY£!Úì²Elĉû›ÒGÓhÖq}Ŭ Äŭµ£Ë£ßÏ`öBĞÛÊspĥ7°ÓMÄl ǵ­~Ÿš–ĝëšìÔ —N½Îġ–IħëFy$ÒAçií 6ŬeúĥäVÔnvv–n·Ë™3gĝĉ7żI–eımó üç6ÇıĜn·ONLL,XkÏnŬşġ•,=óÌ3½gžyĈìÙ³ÇV˘… )Uĝ™EĞĠb×]Ôëu‚ ÀuŬ[ċÇûŬ9SŬ=2Ĉ w_J"k6›Ç”ƒŭјŒğ@ԍñú)5íƒ6ôğ=„ħ„A€DB7j¸KŜÍĉo·Zp÷z3—v:ċÁ^šÊ–‡}3TˆÉvg½³ƒğm ·í†<]gçû—ß;Çûïœ#żiQÖAF:XÇĦİ êǸƒ„DIŒ19ƒ0Ï÷BPŻ×™››cß}„aÈısçĝ?üCnŜĵ9|e;Żĵvƒ–_.„ˆljšÍĉb£ÑxĠ÷ŭŽ˜žž:-<óÌ3ú?ŝÇ˙X½Ù+T¤Tág§N²ëĤ{öìѝNǤi*”ĊÀq_‘èw Ê]ò1eTşÖzx°~JRÊbC'„Ĥħ‚$IÁX<ÇERĜë8‡ıXĞħV!Ċ€Lò“żÎ¨*-Ë2ŒÖxO§ÓĦĠjqóHıµE:’Ġ$u“Ó¸ŜGžüî;ùá…s„•`]…2OÒ6mŠ”5+éÇ}RaÀ5(`Üñß6ÏŜ½{™ššâÚµkœ8q‚+W +ÍZ­6ĴJ%ŬÀi!÷<ŻĞ”ş†áÉz½jµÎnÙ²ċ•}ûö-}ñ‹_ì½ĝâ‹ĤŬnW˘… )UĝùÂĖÉä˙ŭƒo~ĝÄSO^Ù·o_ç[ßú–§¤c1Ü^)Ŭ) µòàÔZ†!›››DQÄĜĜiš2;;K½^&–ĤŸAc­ÁQĊ[/Ïr †0 I˘˜ġ•UšSàD™f½ß'ôBĤŸ<í³ÒÎ0Û<ÜË9JÔé霚•Ô…ĊĜîÀJO`á Ĵ ĤˆË´ƒ5)RhÂşK}kµw‚tïW·„5‡10ħĦ§6Xyç2çßżL܋)‹v¤T3… ÈŒRŽF!•`=+”qÍF“ééiĥnŬÊĝĝ8ްşşÊüÁpĈáŽRY½•UÛ 2Ê=ϋ<Ïëyžwħ^Żż†áËSSS'öîŬğrèĦè駟ŽŸxâ ŭï˙ŭżŻŜĜ*RŞó‰vğ߸qµ3gÎĵ:77·uŬħ$I¤ïûr´]7ZÁ|4‚âvCѲò(‡ïeRiŝ:t‹ò#ĠÑè× |‡¸›³~}ñħ6&ƒ8Nŭ}Ŭ%É A]ÑkcĞhŠĵÄhŒ+7-ú&#Çb‰Ġ`“O[]Ù£93F}˙<éŜ-tgDŬa Ċ”qHş,½˙.ïŸ<‡½jpr˘|´+Ê`ĵì6Ò½>úpçΝìŬğ×uıtégΜáŭ÷ßÇ÷ŭa9ş—$$I’\)×jµÈuŬE×ußô}˙ÂäääéÙÙÙ·Ž;ĥüùÏ>züñÇÍÌÌL%Z¨P‘R…Ÿ|éK_ÒżôKżtùêĠĞß{üñÇw4â8žÎólŞwp…Š”*üıóÏ?ßÛÜÜüvšĤY–=!„ĝE!ă@p/£QáƒÖz8ˆ/ç"ĊMĞĠşëÓŬbÊçÂHša›ÍŜ:k—oâwĤ°Q1/òŻçÍ:a-DÒ8"Ŝˆ‘*ÄĈ mzxÓü-Ĝ9†žl²0m™•uvġ\8ıÊĠ·/péŭ˘›9Ŝ ïH‰xäú:2ĝ€÷ߟ^Ż9w97ÒZçJİ cÌĊ‰‰‰“­VkÁuŬ³NçÄüüüòO<½ôÒKÙC=TQ…Š”ŞK[ĥlħżŝ뿞eYÖ÷}_[kB~ÜLéÎÜQ‚*‡ö%)••Òèí(ħŬıœk­ßͺԌƒ’½ë1‹ï.1u Ms·O`şĴèŒ^½Nŭħ9ôîI0šÉVw˘Îċ-0^kħ%ñÉ?¸ĈʛrŭÜ"ŭĠ a ÁĦ†ÂъÒäŽ!'ĊMTq]$)6´ÁĤ:“ìÚµ‡ééišSΟ?Ïwżû]VVVnsú.3ŠÊ Rkcb)eTŻ×0|uÛĥm?ÔZŸ˜œœ\9|ĝpô+żò+ñ³Ï>ĞżñoToĈ *Rކab­=kŒ9'lZk;ç>wVH§À+§”˘VĞ £-î'jŬZ [2!µ‡@pŭŭËĵy"ĉP{ŸÛğ—ġµeşIJmÂǙn`%zžċó—^:g/Ñ[Œ Œáƒr‘ҐCêĈâf l(¸ĉm—ı™9víÚC³=Ázw“÷-ñÎŭÁ­ÎÀPµüŝê9¤”ıçy]×u/Av—:Î;“““ŻÌÏÏ/;vĴ÷ċ/ÙÌÏÏÛñ/ŝEġĴPĦ" £ĝoô/^ĵĝŭ›7onµÖ6¤”²,óJbIӔ4Mi4à$Ip‡4M €(І†ĴY–1333B Ġ{#6F£M<!ħ(–Z$s2Džc#Ĝüv—Óo.°ûŻHŽNŒcŸġV ħ!è[Ò÷ŻsóÒ2˙ûG C£RG9Ċ<Çä(1&”ŜsJ;.Ñ íˆWşÌÌÎ0==ÍΝ;İĠj,,,½ïŝoVVV†ŻĠ¸2”•á@è‘çy×jµHJı†áĞívû•vğŭêÜÜÜòÓO?Ŭ=vìX˙ĝñúżü—˙R½é*T¨HİÂÇá _ĝ‚ùÚ×ĥü/˙ċżüVе?ŽíëŽ9Ž#ğŬîPâ½ħħ1<GQ:;”Ù?ċ,%‚ÛŒ[ËJê^(Ğ0)ċĝ’$ammüîÓ>cS[0Â%ÒĠ.éµ òŜ-£X`¸Ü:ĦQF€çy>ôÁcϞ=ÌÍͰħħÁ›oÉK—†KżžçŬĉġ7pç΁ˆÂ0\;éyŜB­V;ğ}ûöŸ˙ü痎;Ö;x Ŝż5+ŞPĦ" ÷‹ßĝßÈ˙ú_˙ë—ßxÔjµCJİG{KŬuŬá|hĜn–!Žae$¤ÙlRŻ×ÙÜÜV/÷²*IİQ”äbŒ!Š" ż‘ğ Ra5H+P¸Ôp‰DrÛoù:ËïĦĴôjµ;vì`ïŜ½ŒÑívıví'OžV†%™–_ż$Ë4Ms [ĞĠµÛí÷\×=Á[ívûµùùù•Ç{,:~üxüì³ÏVñ*T¤Tá'Ċßú[Ğ÷÷˙ŝß˙ÎÚÚÚThŒ9 ô„ÄqL£Ñş6ÜIJJ)Ò4‰‚f³IğŬfssóJğaôıË= ²ò2ĈġA  (HAŞ Z@ĉJ|é_G–eCĜ};ğvíbǎcX\\äÔİS\ż~~żïû Şœ‰ĊqLžçıR*ÎóĵŒ‡xÍuŬ“ë>33sñݧžZ{úé§û=ôÙ½{wUU¨P‘R…O‹§Ÿ~Úüğ÷ï–˙ÓúOÇñŝvğ½½ßï)di:J,£†Ĵċbèhx]½^§ÓépùòċaĊs?‹ı£Á€£j?)%Ŭŝf!ϖB€Ĉ€2à8Xߒl&cIH޳mÛ6Œ1ôû}Ŝzë-Y[[~í2½Ġó<úŭr †áĊF£qr|||8Ûh4N<ôCËÏ?˙|tôèÑJÊ]ĦBEJ> üíżŭ·óßüÍßĵüŭï˙I’ò<ïkmXV-wĞjÊÚ~ż_DŞŞšZ­6L -Чûİ”JÓ×r˙iTÙWSƒ%^“­;QĜY›"²ôû}Ĥ§§yôÑGÙşu+½^óçÏsîÜ9â8şO”n eüĝ`†•‘ïû›ažŻ×ë'0üqŻv:•ǏG/½ôR|üĝqŭ{ż÷{Ġ›ĤB…Š”*|–ĝµ_ûµŜÊÊÊwŜzë­É )ċß÷ƒÑ„ĜQIxIX›››êă?ˆ„ µğF[ĥîʤĜâ÷ Hp‰´–,Ͱ) }ú=ú˙·ww1QiÀŸsĉ|Ìh0,€ĜŒ˘|8­´1Ĝ‚Ac&lh³ilšu7f­7…ÑD/ĵĈĜ&½hÒěÒÄ%ëš.*‰|ĴŒV`TvadĤ2Š‚pĉ̙3çŬ 8§àn6mv·öùŬi€ ™ĝÏóÏû<1ˆD"P,!N͛7áñÇ+sùôs0€˘(‹eY£P(èŠ˘Lù|›,ˎ3 s; ŬŠÇÓġġġzKK‹]VVFNž<‰„0”áµ×^³/\¸M&“ı’N§%%%ŝġë×ÇÇÇéıı9w͂™î,˘sŝ³g$IZß%”œûç.Éù{šĤÁ˘Y°í")BŜ²Àšam0ċá0µ8iaxxFGGÜ%ƒ üKG!ÄŬŜÊó|" Ĥĵ^oRUĠÒÒÒéĤĤ&½­­-߀ƒPÂPB?–ƒZGŽI]ırċKBÈĤ½{÷úúúú”îîn( Ë²ğµ•˘(E €ÙÙY¨¨¨p;òJKKŬ{&žçŬ#2çHÎé’s–ß)9×òކ"y`( ,.,//‡ŞŞ*x<ÍfĦğğĉççŬŞhùÏà8Lӄbħhqg‹EeٔĤi²,(JżŞŞÙĈĈF½µµĠĜısgñóÏ?‡£Gâ! %ôc{ûí·ó£££ÉdòŻ/^Œĵ÷Ŝ{B2™dĈĈĈÜĥiMÓ`ff*++áᇐÏçŬŠÈñ€ îÏsv 9ƒ[EQ€ĊVr§YV .'çÏÁàâWŻ× ĥmèè(¤R)Èçón“‚³ÜŭG–eY4MÏs7­Şê˜$IIEQ†ÀŞŞŞÌşuëöïßoG"rîÜ9ü „Ħ„~Jêêêì3gÎd‰DÏp}__Ÿ˙ŝŭÊİS§hšĤçy˜™™q§;<óóóî÷Ó4 Š˘ÏónUċtÒB@×u7„œ#>çhùá­ËğDQ„\.<€gϞıM ’$-eb'9,…† şŞŞSgï÷'xžÒ4m˘İİééŽ;rŻżŝzà?Ä_Ÿ×A0|>_JĊAú|>_MMMĥĥĥ'- „Ħ„~îöìÙSüàƒҗ/_šZßÛÛnkk[5==Mß}4MƒH$ÙlĈÇÇ!ŸÏğĠ‘˘( Ş*d2 (ʽ÷aĈ• ! ÂÈÈȊ=MËW\€x,Ë0 ëş:Mӆ$I)MÓ„ǍE"‘ŝx<žihhkkkqÒBJèEqúôiеµġA:îíééÙìóù6½ñĈ’˘(°zġjèèè€O>ùÄ}Ф( B@EPĊí´sĈĝ8“˘Ñ(Ĵ]ğ …<|ĝpE=ßìËçY–eÍɲ}ú/şû}ûö½|üĝq˘˘Â½;2 Ŭ@ °xÄĈóĵ.ù|ÊÊÊ ĤĤJJJàÙ³g0:: étt]_ñ0wù;%–iš˲ş(ŠS>ŸoÀëġ~Ċ0L(ÊnܸQïèè0"‘ˆ­iVEa(ĦÙ;ïĵc>|ĝ›î{÷î­ïîîWTTĴRU•Eü~ż<„,#âyvíÚċ?Ò4 ,˂l6 ½½½èÑ£³í–wâ9Ġ•mÛMÓs‚ Lˆ˘˜ûŭ)–e“%%%7ŞĞĞ3ÍÍÍ ;wî´×ĴYƒ­Ü½(ü'@ßG[[›zçΝ½<Ï˙.nĞĞššš`bb.]şPRREA8šĤĦŻŻFFFàêĠĞôéS·uœ˘(÷1íò½K„‹ĤiƒçyĤé)AV­Zġ•ĤiŭĦP(Fġ·ŜzˈÇx<‡†ú%û裏è³gϖÀo: !kCĦ³°°Ĥi˲033>ŸVŻ^ †aÀŭû÷WLävšŠĊ˘ÛìÀ²ĴmÛĥE™÷x<²,'TUMİŞš ‡7*++3­­­ ÍÍÍv À9„0”Ztè!ĞĞĞQĊ?À›„/ÇÁǏajjʝ9í"@çhÎŭ³tgdQS5+ÂßEQĵŞê żß?PYY™Ŭĵy³}ûvĴŠú…À;%ô½NşŬÈÁIDAT½˙ŝûĉġë×ǞQMyÙ²,%NCĦP0lÛ6A˜!!Ëò?lÛ‰D"ÛşukĉĠW_ĠëêêpÒBC ŭï|öÙgžóçÏïŬğ·ŭ—^jÎċr KĞÑï@J„d  ÓíííıW^y%·eË<žCa(Ħ˙k×Ñ/^”‰D¨P(ÔY–Ç%À£X,ĤïŜ½ÛĜĥm›ÍqVE! %ôèééñLNN ³³³‡††ğĵĵƒ!ôŭN–ÄĤçjIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_FrameAdvance_420x420.png0000755000000000000000000007722312467662066022111 0ustar rootroot‰PNG  IHDR¤¤~LQ5 9iCCPPhotoshop ICC profileHǝ–wTTׇϽwzĦÍ0R†ŜğÀÒ{“^Ea˜`(34ħ!˘EDš"HPĀÑP$VDħT°$(1ET,oF֋Ĵĵ÷òòûĴoí³÷ıûì½ÏZ’§/——KÊƒ<œé‘Qtì€`€)LVFş_°{ÉËͅž!r_zXĵpÓ3€N˙Ÿ¤Yé|è˜›³9,ˆ8%K.ĥϊ˜—,f%f(Aˉ9a‘ >û,²£˜Ùİ<ĥˆĊ9§³SÙbîñĥL!GĈ݈ 3ıœ,ßħFŠ0•+â7âĜT3IlpX‰"61‰ä"âċàH _qÜW,àd ėrIKÏást–.ŬÔښA÷ädp&+™ÉgÓ]ÒRәĵïüY2âÚÒEEĥ4µĥ´4432ŭŞP˙uóoJÜÛEzĝıg­˙‹íŻüÒ`̉j³ó‹- €Î-ÈŬûbÓ8€¤¨o׿şMîò]9ñLaŠ€.+-%Mȧg¤3YşáŸ‡ĝŝuAœxŸE„‰ĤŒËKµ›Çĉ ¸i<:—÷Ÿšĝŝ¤Ċı‰ÒĝPcŒ€Ôu*@~í(  ÑûĊ]˙£oĝ0 ~yá*“‹s˙ï7ŭgÁâ%ƒ›9Î%(„Îò3÷ÄÏ H*Ê@èC`Ĵ€-pnÀĝƒ VHİ€²@Ĝ A1Ĝ ö€jPA3hÇA'8΃Kà¸nƒû`L€g`ĵ a!2Dä!HÒ‡Ì dıAP ĊB Byf¨*ƒŞĦz¨ú: ‡@ƒ]h š†~‡ŜÁL‚ݰĴ Ĝ öCàUpĵ΅ àp%Ü…;àó5ĝ6< ?ƒç€˘Š" ÄñG˘x„ĴGА ¤iEş‘>ä&2ŠÌ oQEG˘lQž¨P µµU‚ŞFFu zQ7Qc¨YÔG4­ˆÖGÛ ½ètş]nB·£/˘o£'Ż1 £ħÂxb"1I˜µ˜Ì>Lĉf3Ž™bħòX}ĴÖËÄ °…Ĝ*ìQìYìvûGÄİàÌpî¸(—ĞÀÁÁ á&q x)ĵ&ŜïgsĝF|7ŝ:~ż@&hì!„$Â&B%Ħ•p‘€’H$Ş­‰D.q#ħ’xŒx™8F|K’!é‘\HÑ$!iééé.é%™LÖ";’£Èòr3ùùùEÂHÂK‚-ħA˘F˘CbHâı$^RSÒIrµdd…ä Éë’3Rx)-))ĤÔzİİ“R#RsÒiSiéTéé#ÒW¤§d°2Z2n2l™™ƒ2dĈ)EâBaQ6S))T U›êEM˘Sż£Pgeed—ɆÉfËÖȞ–!4-š-…VJ;NĤ½[˘´Äi gÉö%­K†–ÌË-•s”ÈɵÉŬ–{'O—w“O–ß%ß)˙P §¨°_á˘ÂÌRêRÛĴEK/½§+ê))U<¨ĜŻ8§¤ĴäĦ”TtAiF™Ĥ쨜¤\|FyZ…˘bŻÂU)W9Ğò”.Kw˘§+é½ôYUEUOUĦj½ê€ê‚šĥZ¨ZZ›ÚCu‚:C=^½\½G}VCEO#O£Ež&^“Ħ™¨ıW³Os^K[+\kĞV§Ö”ĥœĥ—vv‹ö²ŽƒÎ[ş]†n²î>Ŭz°ž…^˘^Ŝu}XßRŸĞżOm`mÀ3h01$:fĥŽь|ò:žkGï2î3ŝhba’bÒhrßTĈÔÛ4ß´Ûôw3=3–YÙ-s²ığùó.óËô—q–í_vǂbágħĠ˘Ç⃕%ß²ĠrÚJ*ÖŞÖj„Ae0J—­ÑÖÎÖĴOYżµħ´Ĝ·ùÍÖ6ÙöˆíÔríċœċËÇíÔì˜vġv£ötûXûö£ŞL‡‡ÇŽêŽlÇ&ÇI']§$§£NϝMœùÎíÎó.6.ë\Îı"En2nĦnĠnÜĠÜÜ[Üg=,<ÖzœóD{úxîòñRòby5{Íz[yŻóîġ!ùûTû<öĠóċûvûÁ~Ŝ~ğŭĴ\Á[Ñéü½üwû? Xc &0 °&IiP^P_0%8&ĝHëçÒûĦ:Ħž0ɰè°ĉ°ùpײшu×""ı‘]QĜ¨°¨Ĥ¨ı•n+÷Ĵœˆĥˆ.Œ^½*{Ġ•Ġ ĞSVŸŽ‘ŒaĈœˆEdžÇ‰}Ïôg60çâĵâjfY.Ĵ½ĴglGv9{šcÇ)LĈÛĊ—ĊO%Ĝ%ìN˜NtHĴHœáşpĞı/’<“ê’ĉ“ŭ“%J OiKĊĈĤžäɒy½iÊiÙiƒéúé…é£klÖìY3Ë÷á7e@Ğ2şTÑÏTżPG¸E8–iŸY“ù&+,ëDĥt6/ğ?G/g{Îd{î·kQkYk{òTó6ċ­sZWżZ·gƒú†‚ =6ŜDĜ”ĵé§|“ü²üW›7w(l,ßâħP˘_8²ĠvkŬ6Ô6îĥíĉÛĞĥ,b]-6)(~_Â*ıúé7•ß|Úżc Ô²t˙NÌNŜÎá]ğ—I—ċ–ïöÛŬQN//*µ'fϕŠeu{ {…{G+}+ğŞ4ŞvV½ŻNĴ]\ÓVĞXğ½v~{ß~Çŭ­uJuĊuïpÜİ÷¨ïhj¨8ˆ9˜yIcXcß·Œo››šŠ›>â=t¸·ÙŞıùˆâ‘Ò¸EĜ2}4úèï\żëj5l­o£µDŽǞ~ûŭqŸ=''ZüĦĥÒ^ÔuätÌv&vŽvEv žô>ÙÓmÛŬŝ£Ñ‡NݞŞ9-{şô áLÁ™OgsÏΝK?7s>áüxOLÏŭ nġö\ôıxù’û }N}g/Û]>uĊĉÊÉЌН×,Żuô[ô·˙dñSû€ċ@ÇuĞë]7Ĵot.<3ä0tŝĤëÍK·ĵn]ğ½âöàp蝑è‘Ñ;ì;SwSyoáŝĈèEVş`ŠĜ);İÂI’”è I $¤GÀĈK?$ NlŒhDOlÀ•?)SİĜqŽʉÑAĊjŜCïŬ'!éŬ{Oż÷^kŽ/?ĉœkÍ5÷ÚçœûŜ}ßĝŞÎ½§ÙŬÙkžùÍ1Ĉ7 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 †&ÄŜƒÁ°FûíòĜÂ2 /̽âŞì!4‚2B2 /Ĵ=â˘ŻŻ !]ôµÁÉ`0ĴÉ{ȳ½Ż<ùHÉÉ`0ĴÉ%ż÷lì/ĵà{ĵä÷Œ˜0Fö †KSN@ċ÷ċYŽ–¸äqxYIq_#"‹  “,‰ˆÜDġlGH\òżf_—Ñ’ï,B2 +NFCÄ#„%уÔEÊ9f)rçY„dXëmÈ/œġħŒd$‹Œò˙„”F¤4•’„u^Te°ɰb1‚zÁ­ÑTUċ_ż^]ğv­Ç#n4U$ARH ¨Ş@úşüü^„ËϝsL_ÇïÑ{ŻŞê§Óis||ìëşĤŞ–ëĠ"$#$$˘‡‘:#§µŽ†RwîĈĠŜŜŜĝĉ͛[›››×ĞŞ‹È„d•“NNNO—ˆ†ˆ)Rù9O²ëzzvvvrŭúġÙSO=Ċ““)!=ĵ>/™Ši£$q$e<WÛÛÛ[7nÜĜÛĜĜxqUUÛ"²À$ä& RIL ɳĤiF£Ñ§Ü?>>֓““@IÉĦKç)!ž2zĤ2\ıAYÑx=×ςxáÚµk£k×ŬĜĜĜxÙĉĉĉĞĈñ˝sÛF9!Çy˜„”§îJB"9SĠƒù|~€Öu]Ç:ƒÀRvFH†+EFτœÎ#"ĝÚŝè× 2B§Z²ıı9ııwk÷%Ÿ÷y_òêo}훵™_ċ†\` °Džp™YS‘€ÊWTşjö‡'óO>ús?ŝ6ŞÑÉĝSŸ:DÂr1J²¨ŜÉpNş ?ÛŬŬ•T|ŜÚÚ8;;#òÈiˆˆŒ”Öcí¸‰I7Fn2ÙŬĜùܳ/ŝó_R °'ÀĤ8Îew*WŒt>àD"2 ‘lÊáĜÜ#ܞ~ŜhÈÁzâ3|ì|yE}…ĞŞ'Ĉq5@Ĵş$²7!žeZj˙²½½-;;;îÚµkŞŞj<;˜N§œN§Í͛7ypp ÇÇÇŭі]FJ볆r™wŞ%ĵê5ŻŝEOÖŸ7İOˆl˘Kv˙‰TÉÀX'á~"%ÑDÒiÔJxÓH:"!Q$%e‰ùĝĊÙGŝżÑMê-iškÎı*F[‡FH†çqS9— 666Ü͛7Ǜ››“Éd2Fc¸~ŭşŸN§ÍÙÙY  VĠĉôôô2ı÷eyz#ĠY7nòµŒĜ êÊĦö 93tlĦq5¨„oŠ` `‚ .Iĝß !ÄTÈÈ'R f 9€İŒ$äµOPB˘Ħ`o2rtĠ ’òo¨y×Êɝl/"¨”˘ĞĈñĈµk×ĥĈñµñ‹_şËûw½÷Çg§NUUH61•WN™X1RZŸġ”oâ.}Ĵ@Nnn9}¸ÔJ‚IÀ56!˜H •q""’H #ÂDT@E J•₧ŒWŸ"•p°5r8s²IrŒîé.Z—ĥ>Żœ½k-ëşwñ¸ÚÚÚڍF7G£ÑKżî­ïxǵŻŝËy2™|ÁĈĈĈgonnäĉ͛7www7ĥ··ÇĠ@ç˘ŭ‹FV‡˜$IGÂMDÂİD]Ä2AHхT0` ’´û3ž`ĜždrĞS{áCÚÇĜ  „&ĉӐò#ç@r¤Ş. ʵZ’­ÁÉ<‘Tû‡8*çÜFUUğñĝċUŸóÊ×½ùGĈ_òe4}ñd2ùük×½l{{ûĉöööĉÎÎÎ(’Rùǽì}èß6Ġ^7˘Ş.möQé6Ĝ6q‚ħ#TŸçA'°Jß/•w€Ġ”:JQ 1Ċŝm‰†‰À¨D òÌ.v·`ȉáñg“(„PR”t1B:ïdġ##$³LD8oCAW U‘œ¸îĵŸl°S ĥöv&Oé­ŭägŝÁ}DHʍ7’5ÌQ<}Öu]çnÊ}µŻ‘ÒjG×ċJ˘ݚ€„FBġ¸ü!â•çÓ Mr„ˆÚûħ Ö:Ġš\#\vXŠÖm !že(]'Ş*ŞZE5҆Üĥ^: íïŻ|ñîĝozë×ŝô‚}¤­¨ŞxïÈÉÉIS×µÏHI³=ÉHiġ× HEU+‚’ğħ¸È"Xú³Ë’PZPZĵ(7°hA­D 2²³´’ኝrĦÌ/BÍğUh6€S|ġ‹wĈż÷½?üġ÷~ú~¸7F€ä1I9==E)ÁHiÁs˘ì˜1ë{Ó ş53Ĥ~ T.ÙŝÈ+,f;ÁCƒl’{§çc–pcû{ĦştŬ2%¨ÁÉ,“F24\-EHí­PpÍ fpQŒ{ÒáEÛ?xó}ŭŬŸúÁ£ĈÜ|LÛĊ *ïÚ=*~)­GdŬ~Ż ½(hÙ" µÎ $(Ò †Ĝ/¤ÊÉzÊBž#Şëbù[F‰<ó[cFH†çi3)³ƒòŬ¸Áˆd`„ŝ„jôİbogüĦ·ü½żúéw½SĝèGÛ1İĤ˙ĝëĤiŒ”V2BrçDÛ""=oF/:r‘X”ŭâ HŒAKˆrĴkè5êOÈ ³mĵeÛĊI.U•R¤[BLFPFH†ç8R:WöÈ(}OHİ$vk°sQ%œS|ùîÎĝCĵíë>ŭw‚ûH¸’)Í#)•™#Ġ^SùAFÚYGˆÎ šGF…-éä„DĤÏğfĜ2Ì “gûёO!7Ó˙B{$Ĝ'>‰é;k90B2\ħÍdˆ”ò(GD$ġp€A:Ûm $Î ĝ²Ŭñ‡ŜòöŻûÌğŜ!xô#ċD#8;;Ğ›Ĥ)mŝ”Ö瀓Za%˙Ik˙ƒ._Ğ$|$œĤG§ŸĠ´ò¸.ÂÒbÑ0=NüÚkŞ+e ğÜ×NzÓjsë£Ħú‘”’áùÛH:ùnŞtJ$Ĥ?ĉpşm7Šn8óÀ—íŜ葷}íSïz§àя '5‡‘”#%#Ġ[/(Eŝóx;Œ`ħ¤İNGÂCÂÈV鳂r@f”Œ…RtäÛô{iA ½a™÷ÓVŸŒ g“,opìȄyê£ûƒGƒK0ôÌĝÒŬíñżċm·ïŝä;Á}XİŻbMÉHiġ׌[²ŽRDÌĦşQ" !|ìSjòPÙµĵBöëHèˆ(×\äOéè<·ƒ’áyŒŽ£¤ä˘$Év‰ÀOÄX#Œ¸Jà•ᤠàËoíŒ˙䑷ßŝôOĵCè‡ğm!“)­E¤4°ĤĜ# ).‘GH³İHè ’èêÍeFI™w*Ti$·á`N×!–·BĜÚ2B2<‡QÑaïû)×Î43ƒC8ŬŽ]ĜtF.œL _şwsĴĵíĠO½ë@ìS*ûTŒ”V~=ġۅşhZ5q BjŽĤ&zÎ! 9ûdÄ~‡5êFI܀Áíğ{Aù‹ë­áB]wâ5!žC‚Ê#¤ôÑÊwӆà.ş-'·ĉ´AT5ˆŻ¸µ3ŝà#oġSïzè‡éi’RIDFJW‹œ ’ZŒUİžÒ^h'E>‹qÎÒ)Ĥê҅…Áì˙Ĥ‰â ckÈÉpI)W"Ċ>¤öt›ĈI'KJ:{pˆÀ#4Ï 5‰?k{üÁGŜöêğ?ñÁc|HJC›ˆm(Wd=ċ›}°ëÉЎQԐG†ñĦ“}CŽħhö8ìšJÊĵ1– -éı FH†+GF½Ón! ˘dpKVi…½.JÁpµ°ñŒĈK; ?Ÿ*ñ{;>òöŭğïzŒ”Ö×hŒMwhâĜ‰µN:§†bI-'ĦDPÚ)îš(dèx("#çúÑڒÈÎÒuFH†ç„†îEHùÏÓ WXhÉ<ĵCşKı¤“ħ¸n—™’ĝŠíŒ˙‘·ïß3RzAĴ-FBĦ˜F…TÑf(8u÷§ÂĤ¨)—qç‘É!Ô<û²ïn†cì…3ƒ’á ÓÂiħ×›ħÙßŭ‡Ž•iÄt7^@0cPß}èûŜï'Œ”Ö|--†PE-I³ièµĤĴƒ}Hìb‘šbcŭ¨)š‘—#lY!ÀFq‘Šh!mQú{i~ځ‚í •Ù<{Ï(›@3_~kgüGß÷öŭûFJk½ÒQpÁ­›ˆä‘EA.ŝ$ÍKʕveT„HH ’&| èSê9­Züc„d¸ú§Ĝ%Ö/NÇô ĝxtU,:0/hidtĤėîíŒ˙䑷íß×;”Öı£‚+ÖIŜUä P$܆YŬ(iÇÙż€Ô΍A³†Ĝ&²  L`„dXaÂ*lÚ^HWHNbäpg}úÄ!ÓDÏ@J_ĵ·;ŝ°ïÖv1I.x-[[;xtî ÇOHžÊ‹wÉE lUu}SU­żt˙ĝĜ#$jEMKD acA ùÔGeµ\rRN¨bzf£Ğ3ŻÚÛÔÒwk!´œGèú†RCl"&èâ}5“vçd„è(WzRħÉɰ‡Ù‹nÓöƒ$Oğ,oï3và9„†(i`‚U?÷ÄçnoġûŜĥĝ—Jßċ£rŒ”˘jı@eÏψñöl=Ú ÍL]× 7XÍLózŽàìEVˆ­÷ÈɰTêÉ;ċ›8³Ħ´ŭ&CğNıŒP6@(Ç$>gwüĜ#oÛ?ĵ\MÉ)­)e‘ɲ7^—.:v?+˘"`ю¨ğ[у”n£=‘ÁɰâÑRJ•ĝ˜İ£o'Ñ0Z]%Ċ'ŒAlŠàX‰ÏŬŬü-o˙à'|ô4RZm´†ÈD—Ŭžä”İ4u!bêÏKjoΜÈr³WğôFH†UŒ¤wê”νŸQr[GbtœœżAµOû”FĈ6yĊçìíŽI)w 7RZQRÊX†C‡ž_{$ħ jϋ„bގ‹azHÙÙ51B2Ĵ†ÒMÖLÂÍΙ5ƒMg¨ â|¤Áè¨>uœÂ½ j â•{ğcù‡÷êï)­C„TDDC‘–Ĝœœh#ñEğ ôÜ"€SÚ%7B2Ĵ |ğŬwf™µBŞ£If4ÏMß ‚òn$Àˆ‚ ˆMÇ ñʽ½1ßüû0RZéè(÷˘ğ ċ˙³ĝ‹íĊt‰âû] JhÚɰvHS9ÑFHDM`LiçÚ àrġ¤ ÀĜ & „4Wà VĵòÖŜĝÉ·üŝáO)­bt$.¤Ġt€Œ¸Œ„ bÉŬ½Û8ˆC¤Ô}ŸA ÂQÌ­ÁɰN›ŒĤZR~ÖHéŞ.2.’˜…C,ȨWâpôĊžGCö9ËÈ^”IğšFH†ġH¤~’%ħ°t™gÒo"YŽ˘ĈĦbÇN2Gç8j }œl' 3”˘hŭŽŭÍ$ލ$8ƒS:àXc”žĜŜÙë~(ԔŒ”žß@)ö"Ħ´7ÔüşŞ°Z¨ħ{Í€}EŸF…Ĥ]4#$@[Ġ”@1PPFçÜàˆ'íBNBŭ§Š $ı§ÉR(y’I‰ííñÉw˙ŝĉÏ[¤ô\GHŒiTj·z‡˜2m§aa ZZp O *#Ô•ˆMŸ0B2ĴÓ>£Ú?ŭr‰r)îY=(ĤìħUùœœĵa6ßŭ 3Öüí  RRlFħħ*T ŞĜıqs|ôşżğżùK˙ÀHéıŒŠH äbš-'°2}ÇEcU°™Ï™ˆ}‰xÛdíşç7;;#$@jCËüÉÊŬ8ÙüˆšT?ÊúR·tÀ)ú‘Rö‘öšĵ™6£ûƒ`” U ğÏQ£h˘â>Û;;×ŝàŝĉ/ŭÀŸ)=Wĵ¤í›˘2ï‘`IêœôZİM´@§Àk…"hÚE2B2ĴÑÁW²“/‡E CQ22r1u—FM$2sÙóô#(H˘Š˘;2E]•(F l2¸:އR0#q0UìlïŒO^g¤ôœ„ÒèŒU5˘×\x aĦ߈ÍKş°îĈWÄġ Lcg„dXu"Šu ìCÒ!QÜĠorÙn¸KŜwÛFY‡<ĥŻïŒ§ßñ·÷'żú”rd$"ÒĤȐ™ñr *ZXC\;QĤêòèh!U‡ĥ¸¤ÑŠÊ;`Ô"ƒ’aġ7š,]"ĥÁÂ6J’x'W¤ïGŸûv\E°c7î<óżK·qىZŠCz%Àˆ!u6GâHƒċĴÜó vo썧ßñwö'żjéğ‡½XځŽìâA ħ(ñ.×PĥöXX607ŭ-ûœòӓ²uFH†µ"#t‘ÇRB*޽)ßßÄ~­ìğŭ?†öÌ6]Š‚4Ĝ:Rrxpċ`_™é@(/ÚAL‡U˜§tżöĜğı3>ûöż½?ùŸ-RzĜ‘@P•}/‹zrÒâëŝX‰r ëFì§ŭ0$°PÉɰâÈu *ŠGĜ<2ÒâÄ,q@ŽÄÇħvH ­Ów+t$ú™|Üf\Üè$FKùvŸD!‚Š=J17HGÁŠ8˜7oìŒgßÓw7RzkŭE%“}¨ëş/‡G“§wyAâ]¸1ô£­ŝ0?‘0xÈɰ&!Rjd š„~lD.ĤéʈI{Gâ8E6’‘FµC7'‰mSúpQq§Q‘ÈH”, ñı€Qtle;G8jÂ5ÀĞbïĉÎxöFJo½DQw£#='‚Òœĥ²bQ/UW¤ñzDÇXÇ2F2B2ĴOʎìÒ$m o MWîË#&Ĝ§ƒĦj—şca”ÉĠÁ§È(ö-)ĝ 0w g/âr˜¤àV‚O¨'j%î ħsm{<ŭ–ĜŸüÓ|ü£FJÏtÍD³@BY½ ñÎg‹fhbq”y>ŝ\óo,•,ĝ䌐 Ğĥħdó4ŝħ‹ Èġ Fëo.í&Ċ ÇP0)ì4ô'1“zK|.ha#*§iœy7ŜÂÇû ;§–Ô˘L˘B‚.ÔĤŽèáhjà@Û7·Çgßüû“_˙GFJÏĦ÷+ĵïĝĦKáċo‡l€i Q—öggĦ A!â& `Ää FH†Ġ†dDTĤWjF+uQUŒR’ċĞ÷>á IDATÄï%ÂIŭGNşmMÓA!Ñğȵ›•tù éÔX›ÛÍċ]ĝ|,ÁN œĝ@hÓĜDğ·½;ž)=£µ˘qˆbJ÷jÁô jhM ı1``@_áÎì‡ŭ>&#!#$Ú¤_ĵ†&V†kF …êE7Mf)4Ġ΀ӕ§Ytòr‰äĦя¸Ó9IéşÎ`Oc$”Ĵ‡zr,%8É YpìJAMâ6Ĝğħ=žÓìO~Héé,˜”ÚUeK,‹Ŝu‹à½İPϐvBè;·kìżËäâŭ FH†UMÁdD$í)U³tIı# Éz³( Ŭ|$E7t/R…¨=pO‰ëÛùkò?yŞ=I›Š cË•wÂü¤Ŝĝı„è.´@îÁ$‹Îág³§Ájh{ksĵù_że˙Ĉ˙ú“Ĝ0RZX/‰ |ÖI]Jğ#TĊ˘Ä{7Üú^wè7IöO(°ŜX#$šDHÉ ÁUġCöËNFŬFSQ6žBÒE"qQM—Ttˆ6D)='*pĝÚ¤`eƒI7‘6r@rgbŽ”§¤`FA}6ǽ*‚j,8 Ħ“ëü­7ïßĝç?‰'3Rê$Ĝĝ4 £"z‘óÙGYĤEj.{ĞZ‰÷BĦ){Ӕğ· FH†f% ĥ}BƒŒÒé85á€hz—Ŭ9Ú‡Hڌˆ†yI ½£B/˙RÉ3½Ú“ŝF•‚?'ÄĵQÜ;ġ8š×€'nŒŽëhpP+äĉ‰ü­GöŻ˙ów) -éêä€×\iŽZÎD"&Ȳ•ù£ï‹Çç€˘!0–nr­Áɰâd”ÌUİ\nÁrٚQıš`S”úˆRA<ë5‘VİĊv7—ìñˆà“×ĤòŠß# ös9A¨+Fdµ*îŸyœÍJĊXÂÈ ŒÂá¤&T‚ƒƒ¸qmÂo|Kˆ”>a¤^|ôĊhˆ;ƒ.ôħ ŽĦ(&Ċ êb€Ôş;8'Pġ1/k0B2Ĵ4ÂH‡à§ÒÙĝódÄsÒtƒ'[ä½Nl‡½ĥÚılĥ…BÚÛğ˜ßKµë–”rCĜô{d/·%5µ§ fMèŝwn5Š2<Ş€â€ÊxFpÔBÜ?iÀ­ë~÷îßü­Ÿ6RB!û=Ħƒ’’ˆÚcÊ ÄğHϑŭ´`ìÓM'!Ö$P"‡§ĊjÎ9—ĞġĥÜ…•´Í³Ò>˜+Ĥŝ…ÚS(64­˘Şƒù*ƒ\Œ2s‘(¤Ĥž8šzLÍzšÂ†é˘”ĵ‚`ìbĝE™ÇsEuEÜo<°}sÂo|óŝöoŭ”‘Rĵ~ž˜—ZĦ'’Y‰§Ġ“;4°\SˆÄL^g„dX¨FGí!gĉ§!`"£V €É œŬ(óĵfÔĥJħfä´Ké!Kß%ép˜½”RƒÄñ´Áٜm /i÷Ziğ;£0y6>@rŽĤïs¸w0îġëüoÚßŝßĉ…MJ”¨°+ÖCŞpcXœİĊ~Ċ.â-Suċá&÷V'fcg„dX›èH;£J.y µu$ßI½µ‡ˆdòíèèàÒÄ;hħ§Ŭ;÷ħ£‡S³Yi! ¸ÌYÜe —. $FÑ^(vڂcÁьıÂW‚ûÇ3àú ŝĉ›ö·˙Ċ —”´xÏÁĤïSÇì PA‹7ûiż2U—?‘Żµî´¤½Ef0B2Ĵ4\Jb颊éa“‘ĈhÄ·bƒhĉžù”Ú›§Ô“ #stˆ÷bâà̤öQòŬmëaVR'O½K’ĝ]d§Q$#ˆ#*p\+ü\AHl]ŸÈùĤŭ›˙ÛÏ`“/Á Œ”Rërë00Şĵ$#öRsŞş|³|VU=‰8ÙĞšêÛɰ&””ŝ¨Ï>ċÒnĉó‘b´˘1'ùĤŬ$@0Ż=§ |–L\´Bq…4Óp •r ѓĥ²r—šw“}D› v'`ċ@ïħĦ÷ĈcvJÜo\ż6ÁŝĈŭ›˙êŬ|áRwÉ5Yyç2îr”ĈİCƒüJ‰wNZzÜġçêĠRvFH†u€d§Ü €wÉ0óÁÈhaüô9d”ì„RŬ@²´m­İ½müşVâtŽY(áfk֚7Ó&CšĞ”HÏeݞָU%bJş†pìĤ“v¸À‘àphíÑqp èĉµ‰˙ëoxġî˙ñnn|êëMJ!”ݲ\ÊÍe*9iıĵŝ´àèğ8”xá"#kA2B2ĴE|”x"™•—"#ù|>@dÔkĤ$Ĵ5vv3ÉĊ[")€ƒ³§ÓĤ%vÇÎêA#‰MŻ.V¤¨ásJ×p‹Ô Ĵ)e]ïr˘PĊŜĤIôKȁŞ8R€3Ċĵ=ánŜ˜ŝÍï½½ó/~kMJ)tm´¸ö‹u#h6żŭWߛPĵÄÑğ‹Ž22ÊÒy.:·›ÎɰR’³Ċ&%Î÷ĤRà= §íj7”n~R2„ÛYíqxĉá½vo²0´Ĵ) ^w *{yd„8nC%{ İ 7†Mc' dÓAp8UĝıGâ>\ߚo|ïíŬıĈ¤ß"ï‹{ Ñû.Ŝ…ĞCÏqap“)ñ Ó;â)ß2ƒ’a5#¤lÏSéN´ù´^ßÈ3 #fişŽT²&#œyMžĠ˜Ġl#ĉU!öÉHCt• J4YMs•Ö9E˘"Ĥŭ$(ĥ’‚/ħͳѷȇç¸QG"…À=­ħ{}sÂ˙ì{nïŭöÏ-)1›Ê‹"EG‚áĦ}Ô"ËR⍁43ñg+‘éD)#$:QRŞ)=2âPšNQŒ²Î|ìzŽO=Nf>D"£ĥö…/äßiN,Ú´\ĝ\ĜíġİŸÉħÛ÷Ók„!# ³wXâ*€ ŽÖ zĊ};[×&ü†7ÜġÛ?‹O?v¤$è&§:–ÖO…È µ%]4ò-$ŬeŽŻ…ST–³3B2ĴžPÏ~˙Ȉ—İd„Œ¸ÀéĴÁщÏÔXl74ĦT´4ìŒÒîĥÏİZFAKl‚–êÀe‘ FH†Ġe$‘8eµ‘v›ON*ı3s]@FŞÄá™ÇÙĴ鏸È64éħÌħA Ùé[A†ıGŬÚĝ<ñŝ ŬÀÛ URàĈb•¤(I˘â"{]Ĝa< á¨Gg ™5¸×(pkk˘ß†Û·ŝġÏ­ )µ)Ôl@_/E;P3ÊSuxÚİ:.Ŝ^dñ‰ FH†U&0œ/E#ÚÚ.÷˙ĝÄéÔxÚ—…Ŝ¸.2J£'D‘ġ$ê"9Ĝ°Œşž£á…~& %8<´˘‡,M×FKí„Zĥ=JŒŻ)Ÿ@+œ#F>ĝĞ˘Ğ†qMĝZQ‰{5ön\›ÜŭĞß}ûÖ{~ġI)0(Ĵ~TuèĞêÀ§›ŞCoR-ĞY5!Ö&B"B”ä½.MÓ=,2š7§ Ï̝³#£ôyù!ŒĴà‚ĵ¸}íïÍÊ(!‰ÊĵÎ^H²4]’Ó…ĤZ #Ò£§˜ĤSÍ&ïá˘Ro$‰"¨â°÷ĉĴÁŬZħ·w}rw"Ĝ‰,í<Ğ>óôĉ!•ϑŜİşÜ-<ó(Z¨A…šêÛɰÉO™œû0ÈHIž58›ùîÎdÔFFè"#ôH#a…F× ÑFŸ¤Ò?÷É /³n „qE4c›Ĥ‹ƒ˙’˜AİuÚĵîwvñM ó”‚ñGœ(Žĉ˘VĊ½ÁŜÍk“ğ·żëö­ßù…Ġ%H^1è_ZütkC‹ŻħX—\–Ş;ÇVÈI8LÑTvFH†µÈց$|4XaÏÏQúöĴQžÖž—"£ĥÔÀnóêlmĊ„^z'lÉU_*½ž°£: ˘v)×‘OıÌ@}.5Ûĥ5@£Ĝ8ğYU(NÀu=ÇŬYƒ½k“ğ·żûö­÷˙<6>³š¤¤doÎTw ¸@:u#öËA:°žô-Ž£ŭg•2vFH†ġ “:9vĞLFZžh5FEs߯\‚Œ°0Ž@Û}M’Ìœ,œÁóÚ~š­GMn ŒÎƒêÎ! c0‚ġyìOŠu'—ùĉIĥ9§ÁÈe"8ܜ8k0ġ qïî xñÖäîŝëoßú7ż¸‚¤şĠ4ŸATԍúYı‰w~|Ñ"òÉ×ÊT]Ÿè@•”Ħ6~Âɰ^İ;jˆ˜’¸v1ÍĉŠƒ³Şú´É¨Ku‘Qj”Œ°„’EFħaS:럴{…ôžvC ™×Œ Ò£• ĵv‰ÂIf­ÒÖ \ÛXž×…;c$Ai·I ҄š’ŞBpïî ĵ5áĞżëö‹~ç°ñԊ‘C‹›Ċˆ ”7ĈžĈ€ôì²T]öžkîâa0B2ĴIêNğc§j=)‰ÓÓZ ûĦ§OFésé5àv½Ad´b͛ióQ×­P²óìĵïB )Şë˘ħkšj[!~/ÖÖÚ&Úh7ÔİĝRÜ ­:o”D•ĵ@G‚£™½ Ç=O`ïÚäİżòúÛ/úż~qĊH)ğ>:œŞƒ¸1dëdèöÌ(MN)T†ó!Ö *1:BVçyp2šÖ‡§MàÚC £|ş…pÉ҃Bôû”b )ü,3Nġ rdÔE>IĴf*išĝ ᑸC?“ô\B´)Ñ%ĦqvÏñZáhŜ@ÏL€{wÏÀ­‰ŝ×ß~É˙ó Ĝxê‰ %ĥ!É£ ]è9r‰wùp U—=––ßšm’a}B£  ĝ…>‘Ë‘‘úž›Ġ:ĵħ<2bŜ‹Ä~zGRt@T:?öħSñIÚñĦ])¤ï|n‡8ñ€Jß!<Í]Jµ&éR€Ìĉ3İ5)pÀĜƒt8jûÁ.Ĵ—TNĠq™("K×.üP u€kÔĝÈɰ.H3rçĉr^M>ÏètĤ8:›ĥ1Ï-¸_ìî,~Bħ]ğŬ—£¸Äx†Ùèô6Ŭ—Rpў(ñz$£™<\Bs-$|Żû5HÉ9F.¤î8ê6ċc|Ŭ V‡û‡ܘL>ó_{ûĊż÷ËW–”ąߝùûWĥ Î²TŜ&OĠdÔ[S²´#$*GGĊ‰Ċ °4$NÌkßß|ž2Êo%sgHişp7ÁPíĞ_ï6A'‡ïċiİqO ìlM>ŭ•ßyû%ż÷+Ĝ¸w…"8W*B{ġ ċŬ2’êIĵ9`1Tĝâ-ĝöC½Âħ½ŭ-!ֆ”ÚO’Ÿ]v:=˜68›*Š)|W‚Œ ‹K‘$ÛìrġVÏà³3•ÎfJm ċÊL…'KCˆĤD‡ÀƒmÔ½•Á¤ĠeOëb~tRRG€lqpRƒ$Oܝ{ì½hkòİŻ|Ŭí—ŝŝ/=Û¤ô`œ”LĠsqħuĉëbiŬˆŭT]î…G]òxìżzB*+"!Ö#g'ÒêËÉĦñĽÓM+MFé´ŜFFšó’C‹Œ² Pz͛İ1˜íΚeS$`ìEB×tɨ5†@hœu҉@$Ûú]ĵŬÈIĝ+d &Ŭp8žy¨šı6C;“ɧŝÂkożô÷÷:)á鑒,’°0ǨW*RxC÷¸lpßBŬ(Ĥ„-âû茔Œ +U‚íyâ_üéÌpê{ŜvW™ŒÒ@qP_rHnŜmdÄ|Ĥ’,w*“ȁqgĝĜ·„DRHŠ;ĥİ,ts™ÒäJMIsżˆCÖ*Ô§¨aôßáÉ„Cg¸'ĥ7&ö•ݽŭ²g‡”,R´Q )‹kC䁉wYg Ĥ\_yêOÓo‡ÙĵĤŞuÈ!V>_—:wèƒġÏÁIƒi£+GFyH’qgoè_˜*ÛFFÚ펭ßBŜÓċßa—ïFw²î~]‰è;„Sâ$ÚQıhq”žÓ!ÜfäVŒ„ƒnŒp4÷`C4Ó÷Hì\Mŝì?~íí—ŭáC%%<HI• d“Ïİċï)ók”­%-+òÈ+jOññ]%8<­1×ö·l„dX‹è(ŝ}×ô¸{Ĝ Iĝ+JFí ;óç#£µP6PNzŬ˙ñçè|ó\Ş1‘ÑäaÑÉ!´%£62JĥCÉ1œjOre_pnĊ!âĜP‚cQáĝ´şö8¨RmL>ñeßvû³ŝĝמ×ô]²HşLŞl (S5gžÒ€µTG² 4sÌDÌ>Èɰp1t4oppP÷ Í+JFmAiq˘lû=†4Ħt"JHwı”ò‹Û}ïwGW{ŞWŻ‚MGœĠQ>¨ŠızÜkĜٜ<ùEßvûy`R"ş—r.)ċ‘Rj˘îECZĴ2%šKĵ3EœĠĈ•ŸM=ŽŽçĦg,˙6GVA2B2ĴĦK? ‰ֈŒz²áĤ°3:´ĥͳq.R;_‰I)'­BÓHóh5Ô (a÷—(rÈÓt1mÈX˙è鰓Ÿ ‘PW;`R šZQ#¤ôkJ÷î{×&OêÛnżâ£ż†K“‹ôŬH)(ì$úÇ]nÄ^No‰Ä{àZµdTöŠñöŜÂ##$zıjşË’Qç‘Ĉ ¸Cı-é6Ñv(‘ [³Ù8”/ÌÙ ñ .&˙ZĊ]ĉ òq‰ß ~x)íĠ7€ÍC‡0Š)Ĝœx¤˜Ï²WxïqïŝÜ٘<ùŞo½ŭŠŭ“Ë’Òy‘Ñ2Rê¤ê.żX"ñÎ.OQ+2‰wvIgsĊÑñĵğĥŞyî/Ĝ}“½Ñ)#$ C$Ĥ¨Úżuí˜×ŒÚÛ·³€hú~°ġALïi6×HÚà*Ĥé5ejj†eç› haÒšŻ èRÄ›eÛ:–vż–vNᕠÑÒȍGŒR4ŝzsÜĞ`wsrç ġö+½”X¤ìÊôÎ#%e×ô:”Ş+eŬŭȆ—JĠÍ犃Y˙fë%:ÛFdƒ’aċÉHÚ °ñ/2ê;×òy< Òö׈vĈŸŒÂÈL)MĝÄ·Sf ğĝìïĝ!ìQˆ—HRLĠoĥ)÷pk IDATU˘ám0 Oäá¸{0­íûĜ…é; \2RZ5tiMôaŬèbŞN‹Q‹İ:\˜ŞĞkâàhžgĉ²žm뽕ÍC2B2ĴKÊ. 8“Ìj³żéŻ/!F!Òf“˘Élô½kŬò~Ĥ¨²c[¨¤"ÙĴ%ÂÏb‡— |p‰¤BQ*ŜO{ĥ<)͙€ ïúĴ€ı‡Żw[:ž<ùyß|ûŭSlàÉÁkzz*Ŝûf€ˆ\™ĥëüŜÍgJħ׈ĵàĥPHĵÏOĠŜ3ôZċnáeŞ.{D¤qŒ ĞÌJÉX “z`È(ıowd“mŞÊŜCIìaJ›“XRÜ C?"%ħˆHŒFÙıŠ„ÏûdÔïIÂk"NĜġŜ†A4‚ğ÷ìíŬ˜Üùüo½ŭÊÇŝIKJ"ÂôARÎÎÎè}R',ԎÊu"İħ˜šŒf—¨êÚ·ĵ_7R £ŜÀ=âŜáŞCë‡ ‘{xOiÖAFH†ujG*/D2j›géćmMP3;Ñĵ8/IS׊ ÒĤĴ\Ĵ8…šSHÓıD@ed$cC-h|>¤¤ħ~“Ĉµ)´ĥĠ qîŬ;öĥ&w>÷[nżòżŽ ܁d–$búÎ{ïġ£~¤˘iH_ôáÓr~ §ob12¨=Ŭ;Ĵá›Ìlµ ĴEÂS°a'd7!V;AĊ‹äŞ :÷‹İşÒĦ=ŸNœžùĝds‘P(>“êQCÊNÜĤi0B2ĴQڎM*šsÑĈĉFFÌH9—„K& O½HíT #fÉ;ĉ <İŸI³ë3Êɨµ.Ò(jPÂĞÂ7kHˇֵхtŠ=_{ܽ†Ŭ“ÉŻĝĉŻŭœ'›ĝD ”B|§Ş§êétŞŞş!µ×ÎÚĝž7jïÓ|°a!“ÛÏjûGuGFÄ{@(QĤû(6|ÂɰT”äÄU°°ašù'£ît£˘ŒÚçËÒtydÙ5Ï˘…ŜZ—ŜJ5#aAFñq##*àĠ{žż{J7’ véĊû íÉäñ—½ĉk?瓿‰-ù$SúNU? à„d3›Í˜‘R÷^Ĉ_.škV@ÊŜórrïqAÚ‡Q’){ïOğ<:JlÏF;‡zƒ’aµ3vT€µĈڀEFC÷“4i6môYv,­md„n:U2‡j´5£Áğµ. QPġYOèċÉŒžwê{äÑxûG¸1ùĝ‹˙ûŻŭܧŝ?ñOàúġ랤WU6MsZ×µj †6Jb›Ê%Ôk6">6WgC —Üc…ßëM(Ĉà¤âÁT]öœëÄ #$ê3’€€‹ZŻtòU##ôO³šş¨§M1ÑLĉ*žFn ŝ˜‰â=ÍSˆ):ö¤ŬNFï³£‡´B}:Ċ½ĤvŻO>ŝ˘˙îë?[˙Y=ᝳÍÍÍéÖÖÖìôô´>;;Ğ£½PŻ–$ñwĴŞ M$ş.`Ñ,R*ÈHûÖ wïÏş^£!‰wÏ)ĵ‹{ä%çıŽ,PZY˜rߐ Á²š…ZdTQYWbjŒŽŒ'w…Ĉħ İ1Â!¨u\P ‘¨úPj|¨yŻĦV˙(d”ß'ÚÔ.<÷½“9ĤĠġÉŸġ-MŻöÇ½kÎıÒB¨•3ĤÛFUEçĈ0´>òtšÇu°>BAFç¤ê¨9ádkG•°b’EH†UÒü£>ÑȨ £6•?ßéeS‘Ö+ÓtċHġ‡MF àÒwô€W Cݸ{<ÇdëÚĈ'êŻùŻŝ£ÉüUġáO8çFUUċcÎÓcJşŜmߕöGíÜÙ>ŝäááá½£££³èÔÀĦôn"‚v̆²-ŠşÑé‰Çĵ)8Ñò'_?]Vö+e İş<ͧ–޳ɰˆ§\zB*@k­ %ƒ*q üï{â}óŻù˘ŭÛħóżrrúèñññ“Ožž6ħ)– Û|ïuJëxŜ޽ìu POǧu?bbĉ´żŝŸÏ=ɘ§O5É–$¤’v@_/…à°AŬĝ§™Ş9İşĊ~¤–#‘Œ k‘²Ë7W Ĉ™FFĞGF d4Ş€ñp>‘QŭU_xëwGhŝäääħ'ïO§Óy]מìĥçFHQ÷˘IÌÉë NÏ<Ĥ3~ŞîAÜò5–‘ó÷Àۀ>#$š0ş!}¨úŝ&id´5£x7‡ĤWÔOĵî‰÷Ġ12ú“ÓÓGŽŽî>urr2DFĊ€ˆV‰K Ó÷Ä&'ŬۍÇÇÍĊİ:\΍a¸nT¨@•İß×`„dXuˆX‡?lmâXjÒÈhÈ(DG’¤Fó§˙'Ş'[2úàÉÉÉcGGGO&2Š5£†¤GvU²#ÊbLâxAPWߛŽwppNŬ¨ĵîeŞî7†²ÊÛUÒM76!V<@ÒĜ‹‡ç\ŒVÊ(œ*¤r`UA8ƒâ}¨ž|ŭUŻÚû]§ó?:ŽdtttôÔÉÉÉÉt:5M““‘ĉ 1ôkHE,#q Î9x%ÄÁQ.ü>‹u£uc@1+*˙6„C7ħŬ`„dXéIÂĤş~³;q]}‘6M':ƒòŭ!M÷ŞŬßu]dtç3§§§Ç‰Œ4äfs"ҁd.H)N‘8ψ˜Î³™.Î$zn ½÷Ù5cE`ùŒ k!`œŝ)N²š€‘Ñ•&#tv@*Á<’Ñ{‡Èèİ““““Ùl6kšĤVĠ€_Ùö|5ˆH'!ÌwpxÔ´™Ŝ‡éĈPJĵK ƒbœ{ˆìŒ k€Ôï=XkĝW]U2Ş$FF.D·Î…Ĥ×;ï‡{â=!MÇújFÓ2ÊëGçEH…8 Ñ5ŝ˘÷ëŜË}èn xĜ‘]Ş#Y”d„dXƒœ] œtÚÔĴÉÈèŠĤ颀£„ydÔ'£ƒƒƒ§NOO/"#HÍIġVLÜûO<|ÎáYqc`_´ß'qg˙ZVV4d›@Ò #£Ğ›ĤƒÀŞ0ŭ5š'Ŝ ÷ĝ{ëŻú‚Ŭddt'’ÑQFFu$Ħü£$Ĥ’œĜ–Hˆ€Şh@œÍ‰çEs‘\CÔhu$‹ ë!‰süĵŽûâ†ldtu¤Ŭñü(N ÎAœÏÔtğH5£'—EF%•5¤ôÖm”§íâÖU¸{o–‚ëÎCrcêGâ^ŝĥ›uEH†ġˆÒ†!#׍‘ÑĠ‘v§úÍd ll@*›^ß3DFŸ‰dt–EFC„ä/ˆŽ´OFıQp˙ôbe uG‚PuĜìŞħ ôÜò£t;íGG ÖAˆĥE6Éɰ.lö!é¤ğñ„kdô<’Q•²f.Ôö&“Ĝôú~¸; dtç2j.ˆˆ´ $‡eNšYÙYÊΰ6+!Ž0½H ]ƒ8€U06½Ŝyß3!£e‚†2E· ĵ WïCR”Û= 7†¤ü-ËëJ‹İ½ü½ k>yèYˆd’am‰ İz?@FFÏɤ×j‰1‡T͟&2Ú{ĥÈ(OÓádÄ^,Uıà#ôtÜ–Ĥê0pŸ,<Ë"-!ŻÁĜjHFH†u‰•ċB02zNÈH*¸8ÏHt˙x;BâٌŒò4\HFÙwTÒ*1/áĈëQ:'UÇK¤êÊùċ•Ġ,egXŸ‰AŸ”SFFÏıš Fİà ͝÷W"M×û\Âuiǖè%Üú¸9><1BĦ~*΀½Ŭl§CïÑäßÜ µĠĦÍÄXž%QÈ„QÀjŝÖĉM)FıIŻVmûŒNŒâ%‰xÜĈÁ°#úéT×ŬŞkŝo3$žeišk&„Uv$Ώ“VxDmÓtpÁ&§( şĠt'LJ)Fé³pèϒkÛIĠY&U‡LŞ7†LŞÎZ1j"6q€Ċ2üm¤D!‘‰IµµĞÁkr+<ÈȐÒGGçƒP5ŬĜĈêXùĉ-ih͉‘v#Q7†ĦğClj9ħŠÏĈ ê-ê#$FHdÚb¤áŜk•ö„ĉÀûŒ ÛyF˘›PÀpv`Ġt™hH頕ĉ#§Üˆˆŝ £Ñs£¤ÄÛ2%Ŝšüĵ4 ¨Ĉí5#$2 ˘ġŠÀ`nÂù>gžQħŬ‹Ep`ĝŝ]hzŭé!GFíkĴ^!΅FjíGGCë 1Oşœ£C֍!ùÚp- ¤XÍȈ‚D&8İ†6 ²2ŜCJÓç E˜gTß>F5NNŒĥ Fbz×FSuIĠ!Mċ"ĤTğrnßñsÀêàÖ° á‰LY•"Ħ}; ï ç£T,BcŸÑƒ§étD˜^m3w ĞSĠƒí£]İşÌ´Ùä·ĥ+Dómβ lD˘ ‘)gìv˜Md¤5·éµ (ĞPŸĵyĴÈhÒb½“ÂëYë!—Z‹‚:kŞ{­²İşŜġƒ̇ĉjÊ ; ™< @5ž zXb$EÛôZ–!M÷á ÜÙ1ĊhD¤İ:iÀrĈİFGÀH†bÔIÑŭĤôˆÛĈodš°ÊŽ„7sĴš2ï“牌œ iÊĤšîğÇè3š‡5:ËĴU$!½CŞÎ†İ:d^…4U×?KŠİĉöZ3eljL:g§ î8[_°Œ ÌRŒŠĥ´[<ĊhŻt] B$Ž ïE07†\ŞNï–Ş³Ì8t3m‡J2eGA"§ÉşhÜá6.  FnQ†R÷#  £½KsÛ7Ż™|ş~~Ó[Ĥê:†­šˆQĴ´s# ™K„>J/ëa3Ĥ+!e,d;vœbt›uŬĥÇŞê´w]²n ™ïœXÁ†İşfm)`uMA˘ ‘ùDIÁLk=1ZÄVòšĠt·Ü½¨à&ÖuOèD7¸ıÄÛ2ë#]WÍ%ì7Ô"ÙD™BʂÙ: ™ħV7+•lĈŜte(ínĵéΎ!'Ï&F˜^dîúN…B´gï“ş1Ĝ.7˧ê0’޳nŞ.™$"a#•^BA"SMÙ)Ì7w™ôÌHç#Fbä:0œ5gFŸ?—ÙäÒtÉ3•B’Kb;Jĵm\¤²İ:ğ!UgŬT†aíÀ@BA"SN×ıV|LXµLۛNÚyFb12RĝÓ·áMwb^XU|s ôŝn iŞ_âŬ7ZŬŝ¨DĴ‹ĥ‰L5@2 ˆ7'É&sFİ .¤é€ ŝôÍs0L;2Ú&îlħÜàTì–n i?R΍! §0à0ÒÎF"Ӆħ$ ĦÁ°Öyˆ‘(Š FE&½~| 9}Í4ŬClb !R²ħTöscÀˆCîܨ'`0 î ¨q#$2ƒ”]–œżg!FÍp='À˘šĤ×÷<3zˆġ"E°˜ ÖA½ïAt´!WgĜŜ7–ŞK^Á[‰Ì&@ ݎPBΐҔÉGH@˘-­PŸyîjşyˆÑ6BRHsû¸ĞHŞĈ0HĠYwì9ĞêvŝSvLّˆR­ĦÂQœÌOOŒ éNz- jĝïàxfô°ëĊ[¨WëñìëĈ ™TŬˆC·ñĥ÷6ßÓ<–4PÈÔï.ÁZ}ìĠ™˘ı&—ä MŻâQŸ=RŜÎĵo§´>šCÈĦç ‘¤ İGLّéß[Ž×,DI×I?•Ü"Œçá?PŒkMÔ"wsc†İşQ7†ĵX5B'"Û QBA"³˜ĉŞ (ÜtÄhk”ZÂ-`E ~n£ÔGFáċŜŝĉx 7 ΍şÉ`>jSvdâĝ°µ*œ#™êpgúÒ]ğË"ˆ‘ó'o(F!IôħˤÑ:×n4Ug·KĠ/£iÀXá畣(Hd6;^q!u'MÏ&Ĥ \„ázEôú–bô¨%—%~4 Zöqc¸!U·ŭšlƒ|”™ü†×‡s#sHĈ@§³i^ !¸v7ŬÎ3M÷”kFÚèş=2Òİş´°ĦğFŬ2İşÖ^1Mçà\8%$2ñÉĊ3£ÚşéşëÚŬDF]ú¨Â<£÷ŻéM÷Dµ°µµ›XĤÑĠ·ĴXŬäĈ€ñJ;ClĉöÊ72‰Ìb·û8Âĝr oî~'üK:3m½éê6½>ñ‚‰ÍÔÚĞ˘K˘ŸN¤“)ñÖ×]m˜Şë4×&ëĞòäï‰L Û^óukÁ2ZûœŬE0J-êšjşPÚM; ' ’4Tc˘R´ÖAû§êvğ1dRuŭs£äAA¨´-;'$2íÌvŒ6~v/-2 ğ`„3#Û ~ŜIŻ+FÀœÀêèi—ݐÛZùô¨n”)|Èğ1 g5Ô~MD`MO™4Ĵ²#ÑÌA ­Û7ÂóÙıE‡ë12zî”]x…4qŠÏı1`Ü:([â9+KĠ™m++Ìb#Ħ ‘İŬ`Ú‚ˆDy)‘‘\83ږvŸ½‹‘ĊèYEÉ,îYr…/cİ:ì‘Ş³½Ruí7:ЉÌ'#0µmA]ç úıKğ›e Húä-ÜKğŸ{˙bސ²ŠşĴÜIDAT€8…Ġ½èÇÛáĈ0ĊSĢ ¨†hqĴ'“…gH$àŭWk VŸSŒn,Eî1E ú&¤éXÚŭĵû„sFĞ|+–KĠÙíRuPİ—ŞCoĝ_úmf€+%QÈ<Ĩ]Ŝötè3öı­Ž@iï_³éġ)’Ġ ´çÂ0ĉĈ‹tş×WŞnd/ż“Ö˜PÈ Ò0ˆ=°˙şgè32@Ä`eˆ˘ŝ=ĊèĊ-–R†•qwrc°›Ŭҟ­ŭġİññĈlŬ àInSsÔö<ĠtEÒA"­â 0ĵ¸ġR‡ñċ"]ÓïÛı1äSuŭü_7U—Yg"€÷ "1B"³¸PYĵyHHááĈŽ‹ƒ˜ÂœƒŠúĴqíĤ½¸œ], 0³ñ{7ş1`?7†ìÄĜô*i8gdc,#$2ŸL(T’dGúT "xÓA¤Fŭŝ ÜéĤé^¨™ĈaŽÚUŠÇrcu—&Bâ¸X ™OœÜy£ÛÓ{Ó1MgüÙ[ŠÑ‹ŜÀÄĊ&êŝô×Grc°ħ>¤4­Ì‰);2İqçħ¸Ólßóxf‡ëIá‚-˙á-äŭ7£—ĵXúUsûş1îàĈ€ƒĝöCó³ĵߎ  $2ġ{LS2Ğaçk–‡ŽŒğ˘Â‹Äi!ñ ό^xşNš2kĜ֌7ߏdÙWòVn ñA-DaÇiò0eG ÍşñÉLÎoìxŒ9›yFŜ²€a*k\ k35–ŞnïĈĞĜù™Âèˆ™Ë Ĉ`utûNÄQŒ‚7óg;>ĊÒĴƒPúŬugĜ#U—ĵ7ı1dRu1jvRŞtûĤ ‘™da‚‹ĥW˜ú0ú1ÄH\HÓ5Ġt%Pż?ĉ‰İFĠε]Ĵ97†^ömŬòİ:Kż%‰ÊŒWn0eGBuR ZKKh22‚À- "ÛÀŸĵcÓëDĊ(˜ñúĝÊĤ×=qcHnëĈOĠuèûWΔn ŒÈ VA,.p.¤íé™{ˆQc”ê Hœg$%PŸñÌh²³3„>²íċ7†|‰÷޲ïĤĦ[x )HdúhÌß×sñín÷ÁÊ"0 zÌ>£I‡HÉu÷zıÑmŬ†˜|]‡gIĦä[ĥû‰LzË ¨F1rn›†ıwŸ‘+BdTÁÚu(`x˙şúê‹Ïŝ‘b4aEò˘êÂí|EïëĈ97ÊúW[yi(Hd.˘HĴXzÈnZG‹PM÷áŬVŒ Ğ~½Z­~·Z­>œŸŸ˙@1šÒZ );3ëž7vÖÄCı1ôJÊэÂÂSqĵ”$2ĞLóŜŻënŻÇ= ¤pqìx úÉ_vÄhı\ŝñâââœb4½Œùàĝ=èAzP7†@µ‘P=YH× og$2ġ¸(ét÷AKšrŜûxÓ-J ,!¨QŸœÄÈ5ĊhĞ&¸{fš­z{7†LŞ_ÑÏ(á+è£ ‘ÙȒoÒtr71jŞé˘™H˜ôúŭ·p'ÇĠW?ŭ1#£ı €EĜĵh]<”HŞ.mÚŜL°`ÎK(Hdê¨ÁàBáépGzĞĤW%d!¨ßżfd4×=Œêöœ°ŬÀ<”ƒí™ŞkeGP)ĈXÒŜ ĵoßà·£ĉÌhQ‹ ĝïwú†‘Ñ\L4í;$<ŒCĉŠ5‘•ö+ŝQ:ˆ™ÏMĈ·UvƒéŽ48Àp‹2Ní\£ŝò{0̖Ĝ§&eĞì˘0<´C&U×£íBԚgH$2Ż]oLŞ4•S7FFqÒká`eHúÏáN™Ĥ;„µâCӞHôÖËŭŬ41ûí>‡í£\ÑĤÉdaʎ4*´ŬìzíĤħ€+Ĵ,]ü6ˆÓtó×$ˉÍc¸1ŒœĦ×ççkñ’3B"3XĤDİn܇F–mdL$ސ@˙ŭ·Ħψbt@ít|,7†\ŞnûA긆 ‰LÙfꃷ‡8óġ1Š NBŞôúûo £™GĠ"ŬZÀ£ı1 šf·ß'íó€); ™XĥexÓç3¨E?ğ~ş%-í.‹ĤC\ğCšî£˘à¤µzt7†aÀ´ŭ?C`ċ ˜:˘ ‘iD@]ŠĊ ŬǸO"h]·‘QQ†]Ğ#@t+F_˙ôÇ˙àbdt~~ŝqı\ŝ@1:ÁĠC-Œ2·n'ìƒş1¤%Ŝ#£ËaÎ= ‰LSœDĚ?Âp>ÔûĥšÎ…ĤWÄúîäuġġŸŭCúWĞ‹‹ß­VЏËċòO£\Q"@]g˘œ;ş1䢧ŝıÑ ´½a’„‚D^ÄíaOQêGIí=@54%Â<#´Ŝty˙şúú‹ÏŝW“Ĥ[­V?}úԈÑ5ĊèÀ%çBZ·ĥáEı‹2n 97êĴ| ­ ÌÙQÈ³‹P_Œ,󸜵4ö!9i§ô^ĥFİħÏèïKñż^­:işU£šbtHj$M3ĤêîâĈ`;Ü2Ç˜Àı’Ċ $ò‚Ċ ğ„)MٙYP´:ŒĤv…ƒ-€màÏŜANĞŻżüüïâıZ]|·Z­_.—?ĴVĞĠz½^ÇȨĤÎê2à"’ôŬэÁòŸw~nĤ˘|ëô ĉÀ„‚D^dԔğyFŠ¤É˜ˆÀ½z5…X…úìÜéqġġŸŭŬBü/›4]rf´Ž‘Ñ.˘Í.:BĵdĤ›ŬڍY ”=7 ĉ‹Ħi›Ğƒ‚D^|””ğİ›ˆh&5o†ZÂ'(|tíŝٗŸ˙Ïġ/c5Ŭ‡]\__§b¤£ƒŠĥƒÔUßûön ĥĞA6È†İşĤäN`u…ΐ¸~(H䅉Ò6BjÄHD<šó££xftÒt?ûòóż]ˆ˙ß—ß­VĞççç?œŸŸ§bä1RŠÑüâ ì5h†8:.qrnd½Š˕j£˙µ‘o³ü‰(´9‰gHE™ `ê>S# yĦbE(àÍĴ`( @+ÔïáΎ7?ûâóż=rú——W˙·IӝŸŸ7gF~DŒ”b4eÖĤ{­ñ6”LŞÎş‘O.:ÒLô„=Rué Àho%B •T`2œËuDA"O,@’Üù3¤ĉŜ˘fĥQĠ “bsı6Ô'QŒüĞo_úĞËËĞߞŸŸ"ŭ‘½T]wFW#bq%FRvıJTBA"O(J;#$3SU­ÌìÒÌŝĵeŭ˙~ûwpïżıŝêËÏŝûĞB˙ÏĠĠĠïcšîOËċruuuµİŞÊĞê˜ô…‰b4ŭµÔ-~ QGüştö=fıT]ĉ*Z&zʔ{ê:iΐD`Ŝ#Ìè׉ĵàhİ˙Ç{ï7u]_ÔuŭÇ_ŝöüÚŜ˙Ġú˙úo^öğĞĞë?VĞ^.—?,—Ë&2JĊÈvĊhú›™ld$"ş½XNWXÇFĥÀHóı W5‡n5Îú‘”äRuÒ}ŞÍ˙)EhÒmÛèú½vĜħÖ‰DKĤ)]0í]Ä[‚ <µBӈUQQCŠ'D¸ŜÚà.n‹EœlĴÁüW‚°•™ù=Ö׉<Ñ×FR/ ÀĠu­êġz­Ä9W 5ñJ½(ġ…ˆb4=ä†ë˘Ŝ{5³µİ] yµ€˜‹Ñ‘B¤„x^5@‚ĴöĦA\ˆpʲŭoKżU!(˜ŭJá’ĉĜĝñè(Ĵ, ßğ}ҋñŞzá½öEi×ùĦ ‘'ˆ”úéğ&RRR‡96c‘UNÜö$ŠÑĵ˘"ëGÖµ×ĞM-Ë?üùr}+ːŞÓxždXŒ–Ú ĵĉ,IB6Î:À´ñ¤3ˆtcqŠ„¨ ..$uĉ=Ĵ(€ƒn–Z—ŝ“÷~í½÷ yY˘Ô§ĉsÉXİ/&şGÔD1š—@İ÷şĵ\ŭçO˙ĵüîż}’?ŭS)’V2tl† q4i֔q'à–ˆ˜Hv´„mKfĤ8úTŭğòuµ¨ŽK3żĦ ‘GŸŝçğnĝİġ˙à–R*P Íj]mŻ›…ƒÛl6Uuµ\ŝèÓw˙ôŸ˙ĠŝkùÏŝ­sîß(-T'¸ĝQl[­` Y^‰£™Ùµ™}Úl6ggĠĉzŞıȝk‚DžA˜€Ŭŭ–DJĥĈħë, ;Šb4ŭÈşġj]×ŝòòrU–ċTUʲü“sîGfĥ031³"~t‰(ı‡xrħj.˘í3[m6›ıĵĵüáâââ²ŞŞjdmrRÈ3ŬTdä(OÙŬ$H¸A”@1š$ı³ÇÎu\Ż×ĠjµşTĠb½^×EQü‹ˆĵ°0³BU ˘Ş. Qah£;­éÔu!–t{êœóQ*3[WUuquuµĵĵĵĵŽ…;ğÖ%× ]„d×pŸ²ÇĈv‘cŬûc"ŠÑ¤ÖPú§H>qZˆHıX,^•eytttôJ92³!]WÄȨùŝ4RşOtÔI½5‚ĊHEdcfµŞnŞŞşŞjS×ġùéĊŭĥM y¤kx[qÚgŒŒLw§Mv ıDH\#—ŠRü¸èŭ½Hŝ¤‚ĉè>“ŠGÎiž*~Ŝü½Ĉĝ8 Ò „)ğé³ËZż_n{~ßMb„R £yĴĞŝ9’K@2í´<° ú14ö­ħÛC‘… $òLâ”+rHw–y<0^a·ĝœb4!’Œ ù$ş3˙ŜIĠáĉ Î}Ÿ0ĴäÔ$ZÊċüH$Äs$ yÂ(i—vˆÓ7ç,£é‡q§ĝ&âinôcßß<ˆ_w½µvAÊġşù^Ĕ›ÉĠ4BA"Ï,P7 Ó7ÜA˜Èt×̘(ġÓuÚt]˙1ò€‚”FHİ İ;ĵU?B"$òD7”ħżû5Ï>”0‘éŻİ=&MĠı'$ÍRîİ!qRÈ3‰nˆö­°ğÏ×É´ÖPş6lDŒúgLıÇ>¸S˘tS1ώ(HäEi—8íûĈ´{ŝ;™ö†Ĥ_=׎ë Rߖê>‘ÑHİ33œ×"£y yĉ]îMŝtµ“&ó§~‘Œ"?îDQŒĈDIoˆ˜€ñ‘ì„‚DžI˜7‰G€€a ÎeİQ=Ĥ ŬeFĊhb݁Òż첛ê÷Ŭnäç<ôĉŞ_¨`7DM{!BfeçŠrMĜûZRŬ7Bżó==•Éâ ˙<Ä˙8ŻóXȉċ9€˘yPÜġßûĉƒâ›Ĥ:ħ8÷Ÿŭûp‰ĝ‘΍ûçLg ù‹kâk €$È t!0VÀ87°ĝ`Öˆɀ2A.Ĝ @Ĝö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`ĵóa!2Dä!UH 2€Ì dıA>P ECqBı¨*…*ĦZ¨ú:]€B=hš‚~…ŜL‚ݰ2Ĵ  Ĝ ö†ƒá5pœçÀùN¸ƒÁíĝ:|Ÿ³@ˆ QC â‚ĝ!H,ÂG6 …H9R‡´ ]H/r AĤ‘w( Š‚˘£ Qĥ(OTŠ…JCm@£*QGQí¨Ô-Ô(jġ MF+Ħ 6h/ô*t:]€.G7 Û—wè7 ††ÑÁXa<1á˜Ì:L1ĉĤs3€ÌbħXyĴÖë‡ebĜì~ì1ì9ì vûGÄİâÌp‡+Ç5áÎâq¸yĵ^ oƒ÷³ñÙĝ|= ?ŽŸ'Htv„`Ba3Ħ‚B¸DxHxE$Ġ‰ÖÄ"—¸‰XAàP4407°7ˆÔô&Ĝ9¸$ĝAˆnˆ0¤;T242´1t.Ì5Ĵ4ld•ñŞġЇ+„s;#°Ħ ³ĞŬVï]=iY9´FgM֚ĞkÖ&­=%ĊŒ:Ž‹nŠŝÀôcÖ1gcĵbŞcfX.Ĵ}ĴçlGv{ŠcÇ)ċLÄÚĊ–ĈNĈÙĊ퉛Šwˆ/Ÿĉşp+ı/<jĉŭ$.$…%µ&’£“Oñdx‰ĵž•”Ĵ”TƒÔ‚Ô‘4›´½i3|o~C:”&½S@ŭLġ u…[…£öUo3C3OfIgñ²ú²ġ³wdOä¸ç|½µŽµ;W-wsîèz§ġµ  1ş7jlÌß8ÉcÓÑ͉̈́›È3É+Í{½%lKWrŝĤüħ­[› $ ĝÛl·ĠlGmçnïßac˙ŽO…ìÂkE&EċEŠYĊ×2ŭŞâĞ…ħ;ûK,KîÂìâíÚí°ûhİtiNéĜß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§˘sżĉŝ]û?TĈWŜİrj­VŞŜQ=w€}` Á–ċš˘š÷‡¸‡îÖzÔĥ×iוĈÎ8ü´>´÷kĈ׍ E ŽŒ <ÚÓhĠĜĜ¤ÔTÒ 7 ›§ŽEğùë7-†-µ­´Ö˘à¸ĝ³o£ż:á}˘û$dËwZßU·QÚ ÛĦöìö™ŽĝŽ‘Î΁S+NuwÙvµ}oôŭ‘Ój§ĞÎȞ)9K8›vá\ÎıÙóİç§/Ä]ëŽê~pqĠĊÛ==ŭ—ĵ/]ıì~ùbŻSïı+vWN_µızêZÇuËëí}}m?XüÖoÙß~êFçMë›]ËÎ: ^¸ċzëòmŻÛ×ïĴĵ302tw8rxä.ûî佤{/ïgܟ°é!úaá#İGċ•×ŭ¨÷cëˆċșQ×Ñ'AOŒħĈž˙”ŝӇñü§ä§ċލ“f“§§Ü§n>[ŭlüyêóù邟~Ħûâğ_é›Y53ŝ’˙rá×âWòŻŽĵ^öş{Ööñ›ä7ós…oċß}Çx×û>ìŭÄ|ĉ쇊zğ>yz¸ĵ°÷„óûÌ;ĵl pHYs  šœIDAT8˝ӽJQ†á'1ŝ‚‚"HrVjš@@;ÁÂ&–bcН…­Zx ^@*Œ6^ Š•Ác3eIÌꁅ÷üÌwfÎ|ËßÇdփe ÷X?Ŝ à41ÖcŻ„gÌŭüŠï”À6V‚·pĵĦ7Fp_)eÜc"ĉ—XÏEp!;È·1ŽM\à§xÂ>0’OŸëQÒŽ‚ÏQ nÄCkĊÍéŻ[B /!>›à"šù ílc(Áù$gĜ@=²šÇMp·Y Ĝ ^ĊUÂh ĝŒz?pmíĠĈ 1ó:j0ğuVC$m¤Ĵ×p‡‘~iWñŜÇÊ3á…ĊAµ/ġù™NÂD˙Ċ„sŭÌj@Tà"(IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_ActionReplay_128x128.png0000755000000000000000000002132312467662066022167 0ustar rootroot‰PNG  IHDR€€>aË CiCCPICC profilexڝSwX“÷>ß÷eVBĜħ—l"#ĴÈY˘’a„@Ċ…ˆ VœHUĂĠ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×ûĵçœçüÎyÏ€&‘ĉ˘j9R…<:ĜOHÄɽ€Hà ĉËÂgĊyx~t°?üŻopĠ.$Çá˙ƒşP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"Ş ìôI>Ĝİ“ÜĜ˘İ™(G$@ğ`UR,À Ĵ@".À€Yĥ2G€½vŽX@`€™B,Ì 8CÍ L 0Òżàİ_p…¸HÀ˕͗KÒ3¸•wòàâ!âÂlħBa)f ä"œ—›#HçLÎ ùÑÁŝ8?çĉäáĉfçlïôĊ˘ŝko">!ñßŝĵŒNÏïÚ_ċċÖpǰużkİ[ÚVhßù]3Û  Z zù‹y8ü@žĦPÈ< í%bĦ½0‹>˙3áoà‹~öü@ŝÛzqš@™­À£ƒŭqanvRŽçËB1n÷ç#ŝDžŭŽ)Ñâ4ħ\,ŠñX‰¸P"MÇyıR‘D!ɕâé2ñ–ŭ “w Ĵ†OÀNĥµËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“żù@+͗¤ĵè\¨”LĈD *°A ÁĴÀœÁĵÀaD@ $À<Bä€ Ħ–ATÀ:Ĝµ° šá´Á18 çà\ëp`žÂĵ† AÈa!:ˆbŽĜ"ΙŽ"aH4’€¤ éˆQ"ĊÈr¤İBj‘]H#ò-r9\@úÛÈ 2ŠüŠĵG1”²QÔu@ı¨ŠĈ sÑt4]€–˘kÑ´=€ĥ˘§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcċX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´şW ƒ„1Â'"“¨O´%zùÄxb:ħXFĴ&î!!ž%^'_“H$ɒäN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉŜä²€Ĵ —‘·O’ûÉä·:ĊˆâL ˘$R¤”J5e?ċŸ2B™ ŞQÍݞÔވ:ŸZIm vP/S‡İ4uš%͛Cˤ-£Ġšigi÷h/étş ŬƒE——Òkèéçéƒôw † ƒÇHb(k{§·/™LĤӗ™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çŞTUsU?ĠyŞ TĞUĞ^V}ĤFU³Pİ ÔĞĠİUğİ6ÎRwRPÏQ_£_ŭ‚úc ²†…F †H£Tc·Ĉ!Ĉ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsŞfĴf‘fĉqÍĈħà9ٜJÎ!Î Î{--?-ħÖj­f­~­7ÚzÚÚbírííëÚïup@,ġ:m:÷u ş6şQş…şÛuÏê>Ócëyé ġÊġéŬÑGġmô£ġêïÖïÑ7046l18c̐cèk˜i¸Ñ„á¨Ëhş‘Äh£ÑI£'¸&î‡g5x>fĴobĴ4ŜeÜkVyVġV×ĴIÖ\ë,ëmÖWlPW› ›:›Ëĥ¨­›­Äv›mßâ)Ò)ġSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlpĵë¤á4İÄİéWggĦsó5ĤKË—v—Sm§Š§nŸz˕ċîşÒµÓġ£›ğ›Ü­ÙmÔŬÌ=Ċ}ĞûM.›É]=ïAô÷Xâq̝§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Ĉ>ŸzŸ‡Ĥ"ß=#~Ö~™~üžû;úËŭĝżáyòñN`Áċ½³k™5ğ/ >B Yr“oÀòùc3Üg,šÑʝZú0Ì&LÖކÏß~oĤùLéÌĥˆàGlˆ¸i™ù})*2Ş.êQ´Stqt÷,ÖĴäYûg½ŽñİŒı;ÛjĥrvgĴjlRlc웸€¸Ş¸x‡ĝEñ—t$ í‰äÄĜÄ=‰sçlš3œäšT–tcċܢıĉéÎ˞wç|ŝü/÷„óû€9% pHYs  šœ6IDATxÚítTċ™Ç?ïL’10!ÁĞ] –E,ĴÔĥJuiŠöl{VĜuzşş?ÄU×µÛkmkOéTÜsPÀ˘vU<âİ€¨ Râ5¸H6@‚B€ü€@2!™Ìdî}÷{ïpgrïÌ$™;3İóœsIf¸÷ŭ>ïó>Ïó>ï}ß/ä$'9ÉINr’“œä$'9ÉINr’“œä$'iZ~ÏĈeÀ@' K4R-ż‡Ÿ@PĴnĈÇ<˓’=Ÿó·ÙÀµ@—˘ÏPФ"áeQhpĜüĝRLÇ(9,™í|S Ğ€Ÿ§,#DĈ*Ëî³\ۀ|‡vä°¤ADŒ²ĴړUV‚Óï÷˜ĞXo<·Ħ]_D,iïüñÀ³@“˘Ĵ “q—ñh£ĵài bŠûc’VÉ 쎧Ĵ¸Èdïı˜ûEĒ ™<ü5SBoŠ”!RJÛ˙\XXÈ7ñ fΜI~~>šĤE>“RÒÑÑÁñÇİİİĦıı9Ĵq_ë³,Ò ü xò‹„%Ŭ0 ĝàĤ(kΜ9,\¸ââbĈÏ7żùM***ÒÚÚJ}}=[ĥlá駟Ĥ££#Yċ–o|Á°¤E.6X]Y˘§²²Rŝ⿐‡–ƒ• 6ÈİS§ĈMĈbžŭ!0鋂Ċm Œ†Œŝ ĝğ$ÜsçÎċ–[naÑ˘E̘1£˙]ßyŜjjàÈ8y:: ‚ü|5 Ĉƒ)S`Ö,êĈŽeó‰lܸ‘ƒ’ĈŬü•‘ÉğŠċ“fĜß ‡Ûáx'œî ôiàU`D”]GÂċpqg‡÷l*–´€İ0€ğÇc&„ˆŠ{£Gĉ`ñâĊŒĦĜiÊîŬ °y3œ=›T¤`I ×_ÏÊînžzd÷ßÀ?EĊĝ7%XŞ›v4@Ġ1“SĤĠȊ `Ĥ§Ï^[É֍O ‹µ_\5Q½š ĵ\i×PSĉϟϲeËXĥlYäoŞŞâyùexì1Ĝğw Q-µÒ°jüxÖ÷örìÌGĊ !ú¤”÷ÊóÊğ|(Xv}îaA8Ĝ6xJME(:-@~°Š“ğ×ÓvêX²X˘§[`1ż1ĴÏVaĴ[·ŽëŻżž‹.ş(2JÄÇ#VĴ€·ŜJIƒÌ h–Éê{KKÙŜŜîĜ‘ÀQàğÀ§†V KŬiÁĠ‚NFıRJĦèhÍġĝ·ÜKÓ'Ûaı8`5·Ê†ĉ“żüuĵÑrÏ=÷pÓM7E)LYı1o^Ê:ß´tĊ•ÀŞöv&Z•Ú_&oLñ –g÷+,ŬšşÎ7Ÿ-İéh|•/ZE~ÉÄDXŝÑÀ nĴ"™Ö5Ŝ¨…˙İ5^Zċğîâ§?ŭ)yyyf/ –,ĠĞ]]|0sƒ2 Ĝi,ıE”+˘cĦċ–`‘~²[b­‹I–P"Ŝ;˘ °ŬNÂñ°t{L#pkÑüƒaqĥ™1c?ŝ8ċċċşËïꂅ áµ×ÒZ‹ž´Ġ1Ö£¸Yħq?–î>Áò7à½Ĥ4ÔĠ-í]:pW=ǢÑÄ`ıĝxÜ ċÀíħĊ ë¨Y²d —]v™ŝK(7ŬożÖ„ĝ€ċÀL›™ƒEq#’Ċҧ½;à“–ôY¤ĤĦäû(ż~9qŭÑX°\ Üa|vËĤ3œ,uʔ)ÜvÛm„a”Ċ‹áŬw3ĥ*U ÜĊ$0ɌşX,+ŞjZHżmòUTRà”ü¸h–áÀ•$gÔĈğdݸ¸˜ûïżŸÊÊJ=V<ôĵòJFJ“Ö ñcX“Ĉ¸Ï¨Ñ‹eí'Ş>ÏL™Ġš—”Î]BéŸŬK™1ğq%”ßrúpɒ%Üy睺 ~óMÄ/™Ñú´i…F…gVtoÇŭżV,4i<óifW_M#Pĵ…”_7ñ³âAù0FqI§cìF À 7ÜùğògĊ"…°$„‹mĉ²NbĊ²Ĥ:;^Ä‘P0ÒıqÑL7Z]!„ĜıÏyóĉ1}útŭ—5k`ß>²EÌŞĠuÀd‡Ĵ–MuP&k  ’ôˆİ×QP6Ù‹"¸Ò ĝÂk§ĵkݽ–İS§ê xì1²IËDùĉ$’?+–³ëĊ³BXôċ9ŒĵÒ ^à‡€”ÒcW0)--ĠxñEhh ÛÄlé„Ĝ``°²£NĝÉ>,F[óK˘ÑX x€Żğac/è-Úĝ|>ŭ‡çŸ'EXŠù rËö²‹Ħwïˆr„ÇÍ%Š‹)JĤL™ÂUW]~?lÛF6Ë5À<ˆĊr>ïÏj(\<ùŠ&9˘‘Š‹)JnĵñFĉϟŸÒ·d’Y%qËG'³ e“(ú’#骰ş˙HüÂş~:Ċç3ËPÖġӚàĉ;˘QÒ‚AĠ—ŭû‡…ÒÂq>3ħ9;< @Şá´zÛ{F–|J+ˆó™‰ċ¤x€ Ĵ³RTS‰’@  ˙Ú:,”ÖǙXΆ‡„Ï;˘iKĞĞĞ9zô(twg½ÂöoĈùÜÄgçw5ìÁ_÷fZC€ˆ-Fèıß^Ŝ˙ŭa1böGâ|>œ°ôÛG°Í+àœŬ,  ÑÖÖEE Y2-‡û‚ˆ‰Ċ—çĝŝ]ֈÖç„ œrŜáÂğ—Q jjj‚1c²wËŞMü·3`5èĤĤ&J|Ĝ.eoüż€FĦ/ıaëÑO²è'Żú*ĠĈZËĥİ’ñï!à]‡1c5ĉW_}•ĵŭŬ;İe³½-‡8蔲Ï-Ĝ/ › ħސĈĈFv¸6ŭH…Ô{Œjv4;Ñšëèŝ̍”RšŬšFMö­FÂħcÔ;LŻ2'-£|gŒŒçàkw½@ ıŸqdtôkZDßŝş¸hZéĈká=è+Ş_‹í|€–Ž$°€ ;2E­ğ…Ö˘oŭ Ĉ›ÏZ³Ŭ3-€¤¸rŠÇëĝòH:]żéÚŜ^KëÎUȰ#šMÀï=.éԏ İÈ4Ğbê<ĈIÉlKZ’)µİ†Ô£żŜ£Ĝq‹%Ô\GŜ¨qMœŬo§pú]™ŠPÍġ4½¸œp§# ĝW Á­àU ô[ô7Ó­ŞĴ6L† gş½3÷OöĠp°›ĥ]Ğém9dÌı~ŽĤ_‰™û÷kS­İ~7 ÏxâïwŸDâ£utVsîL§P 1Ö*bĤ†t9a œ<@ëĠhĦ@ĈÂŜĥÚ?Lˆf#ú†(×N˜”FççayE<Ö5ÖÉÂlğ2EDñŝ!úŸ£ӎ-ÀkèDmħNĠ’_2˘‰³ħ›ıŽE´ §ĥ>„ż6.š-ÀŻ—nċĉ̏߰šcë>`!úfa‰ÉéÈĝ5´gĵ´÷˘Ÿäˆ-L İ†â ñŽ(ÓóME÷X3~€–Ò²=.Kd‹¸›ÀìÏcÀŸ—Ĝ%R@£ĦĠÑD, RÜ kĈ߃~žÚ ô³W$~ëŒKšOĉ´Ċ˘: žnä˘/ÍÁ;b´{×(ÒĞ {×íàÔĉhÁ¸hÖ“3üKË#ÖH!Ä·Oìħ*f Ŝ†oùjô2Sé Ìû˜ ÚÜĴLÜùû‘1& qħO7ıj°›˘/_’—ŸRo Lß|Ŝ™÷6pbÓ}´ìX™¨ócħhnĉħFPm ıĉhˆU\'úžċV`:PbéüÁĉĤğ7ïsŭàĵ‡-3â?çàu ™ 5I×Ħ?ço°b:yE%‘Îln`ş{ó>Ħs'h{ûIš·=LoЍpDcĊâ”ë¸*ÀsFȏž3KeĞW ï-żĠ0†ĦJ­‘ùlE?7ÍN²ì_ü‹‘ŭÇĤюXôI…Ż޽‚ÒŻŜΨY·â;t4SµtÔlĦÓ­t–4G,éXL2Ĥ _Md ï1X:ȇA?Ñé9£dù6˙4OFŞ0`,ħFP0f* dôüÁĦém=ÂÙê—8ûásôĥ M\,™(Y}ۘv_bUösoF°}˙˜87nŞ WïG? ŻÚ´tŽûÛÏê ;4ß(FÏ_ʨŻ,˘°˘oħ3šPG3]‡Ğè;w5à§³vğċ䏤Ñ$Ä’İ ì]À`9Ù:êx3C¨@ßş=Ñ0 ûŒıMlœŽï^ŝŬÈöS‚ĊÎĵ#+M˜EAÉD'u¨ šÁb¤‚E#ŜÉĜ)8]Ûĵġ²ùNúž|·°@jN ×ïc½ú}g·á™òŬìĝ”˘ ´:TÄéäßc”Ĵ­à~† žµËÙ^ŒOx'BÁċÔ½˜ÍÛ§ŒâĊMH)ĊË;â6ħ‰ml܅í‚ñ—<-s —pmµœ[yŽ×ûz2ŠsâE Vù]šÀXPŠihÉÊ'?İgĥ‹]eÜH ĊËfe3kXÇ|<èFIU"<Ĉ3’òUċĝ×û9s<½/žÀ.èÜÁƒƒĈ˘Ş%ĞħêYÉú'9ÖԖ,Ü4a) ‰âeûĝıĝ9UT¤aúkO %‹z•˘{‹8½´cG’"ŠĴCt<R†EJP ,ġîŭŸíUM‰°ô£xqĞ´;$Š—ßˆß°@,HYç›ÏŠ@Şú³=•şWu#&ĜÇnËŭ(^”ÎgÍKSÖùĉ³E X*'ûXġoĊL›ŸK?Š—T‹‡!PĵH)ùĝO„{IŠr!n+e ƒşSœâ”*ФDœŝ ĝ_t ‹bÁRVâĝb…ïù ĞqħDQĵ¤Úx,˙ˆâ‹.n6v°ŭLĠÒeš‚l“hĠšw Ċ‹Ŭ²ïË´É>ÚÚTè‰^áCñBŠw֛ne@/!â{|=ìIkaBjáx—{QPâ)7iŠd´Ü ½Ÿ¤‹ĤI|… Ë˙Ĥœ™S}‘8lCWEñâV0 Š—eÊ2>àƒô—ĤŒ&y*=xïñêċŽş~t5§W@oMúĦMŞœìžż-§È§D%c1ĦxqDñòˆòÛÈÌYżÖXî]âĊ{‡7&ӖĥïHWÓızŞ2ŽeɢRîĝniô {Š7 iŠ—]ê.f´>™+ ĵw{Q’|rEWsŝDç3Y°@áî;ʙ5Íg;Ĉ~ŭ;Ä'v4ĊËÊYħHaŽ Ï4ŜĊŜóoşšŽ5Y…eÚe>ßbñöÓBĊ HŠâe½\O 5d‹Hͨ\çALŭ—Ĥs„곋f`ınŜ&O,°-'›/n@R/kIJIÌ Ħgއĵ›ól#]cVa1+„s,âĉ#ĉ~èŠ$˘xyYÌQ²ïg³­ÊĊ6²Ğ9żÂ'²˄ŠüèIÏ ôJmÊ !ĊËKĵD6JÄ=–‹Èû=v'xXħp~{Vc)/ġ’ïNıÀ%n@\Šżô³ìTZdh\Á3Ïy†ĦĞÑÎCÏ{YċšÙ3oVQlé#Nn˜šY@?1iQRıÀZ ¤ ÌqN#t5)\àqK&M,`ÎÌ"ÇH᪰£xÊş~Z]¨OĜşÔ¨ĝß{pX`ñ*ñú+=!À¤E9ÈPZĵ*y„&tdx@QeZ=@\Š—Ïù|x@Ž—È’oßÉá%?}›ĥ­oE‰I‹ÒĈ Ĉ’í΃#BW£–§ösa§!ïÊfϸ/Ŭd?ĊKxO˜›Î1 BW#³ŸägOuoçOkö/Ú> Ù m + ˃=ù<è˜ëşaq)^Š(ÊzZŽ…+„/ëħzµ¨á.˘G˙)7 .ĊK9ċYO‹b˙Öĥö£Ğñ”d=–öŽpÔp·Ġ¨ú’ĴBŠ—‘Ġúâ„ıú–5ntvHC}WµíôX,Ġuúl@ËR,‡ŽöòîÇçm=€Iñâ†ÄxÉÛ­+Í\}Ë6QëT´5[ö£ĞÙĞÇV%KħÔ °·ĤÛ6ë3)^ܚ:Rĵ}á(j½wt}Äh:WŬİĈŭn]Íïkİo d͂eç”û1ÓV7fPĵt´v€ž„Wd -ŠÁß·6DhUB‰; íRƒ×ÍS²‹éÖĈŞßĥ I§t{Rüf°‡$(^D€qà™íÉ<-ŠŞ‡#µ^%¸³ge K0¨ñêSĵñvté׆&Bñâ†$MñB´ ÏBJ™NZ Uw=‚5=˘oe_ÜZ IPĵ„U¨ùż ż^LY‰!ôŬğnz-Ë£OµĞµ-ñF?Š7=@R/ĝAkÔPĉ((£}÷&mGِ‹#–ódDŬĦZş@óa/ISĵtvİ42gĉEŒ.ñ˘("R$J5ëù=•ïúYñè)Î÷hN‰Ÿ‰%ŠâĊ-°ĥ!!Ċ‹l”„_ #ğ%žĞ=ˆ|‘Ro`ŜÇ|^߆>‚÷ ŭ:aç˜âáXmğ:é¨\}eù^%ŜÀĵùĵ ›Îpß#'Xıĥ%QçÛRĵ¸iÖĥ$¤EĦÔŬ*²U˘LW%âÂh4-ŠŒ  ="ôpí°ĉ$-2(Š—Î.•?|Eë™>Ĥ_VHɨĵHç‹éîÍûœhñä m<üxsd`ÚXş÷r‘8ŸĊĦE‰ĥUe†BŜíyäŬš‡gú÷/޵*á-aÂ[h%mĝƒ˘xéGWsy!·ß\Ê­7ŒbúߐħÔ°ċ­ĥĠÁ‡ŸvÛ*€t5i3ˆK‹b³{ı àÁĵK½ƒK’Žhô½ÔGĝı…šCr2$Š[şš?)àÁ;+Xú½ÑƒÂrä³^^zŭ,Ïm>KŭÑ^G’&mqiQld$x—zÉ[”‡Rİ Œq~‘UkÖPĞTä ‰ôKÂÛhûêRBñbKW3ÂÒż͢FQ9ı1£ ğı-DĠŜ.N´ôá?ݲŭÎÈÉħ O]MÚ Ò˘ĜÜĝR2KA™¨ F‰~/²O˘ €à Úî Ċ‹-]M™—YÓ}L[À¨bO‹" /,9p(@ĠŜ.zCÒQÑ.Ġ¤Uĉ˘“mĤH!á5TZ”¸XDzéj\§xI—¨0bTO† a¨´(Ĉ"q‘<]ë/n•e£3M†JZ”cIr‘<]ë/n‰5£Ë7ŞlÛ\ñnÒ˘¤‹È–´•ħâËÀ€}èuş°Q†ĠHĞ’ Z”?&,iO €ñè/•<ÔàM†É -Ê KNr’“œä$'9ÉINr’“œä$'9ÉINr’“œä$'VùK(â\Z=¤$IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_FrameJump_420x420.png0000755000000000000000000017211612467662066021460 0ustar rootroot‰PNG  IHDR¤¤~LQ5 9iCCPPhotoshop ICC profileHǝ–wTTׇϽwzĦÍ0R†ŜğÀÒ{“^Ea˜`(34ħ!˘EDš"HPĀÑP$VDħT°$(1ET,oF֋Ĵĵ÷òòûĴoí³÷ıûì½ÏZ’§/——KÊƒ<œé‘Qtì€`€)LVFş_°{ÉËͅž!r_zXĵpÓ3€N˙Ÿ¤Yé|è˜›³9,ˆ8%K.ĥϊ˜—,f%f(Aˉ9a‘ >û,²£˜Ùİ<ĥˆĊ9§³SÙbîñĥL!GĈ݈ 3ıœ,ßħFŠ0•+â7âĜT3IlpX‰"61‰ä"âċàH _qÜW,àd ėrIKÏást–.ŬÔښA÷ädp&+™ÉgÓ]ÒRәĵïüY2âÚÒEEĥ4µĥ´4432ŭŞP˙uóoJÜÛEzĝıg­˙‹íŻüÒ`̉j³ó‹- €Î-ÈŬûbÓ8€¤¨o׿şMîò]9ñLaŠ€.+-%Mȧg¤3YşáŸ‡ĝŝuAœxŸE„‰ĤŒËKµ›Çĉ ¸i<:—÷Ÿšĝŝ¤Ċı‰ÒĝPcŒ€Ôu*@~í(  ÑûĊ]˙£oĝ0 ~yá*“‹s˙ï7ŭgÁâ%ƒ›9Î%(„Îò3÷ÄÏ H*Ê@èC`Ĵ€-pnÀĝƒ VHİ€²@Ĝ A1Ĝ ö€jPA3hÇA'8΃Kà¸nƒû`L€g`ĵ a!2Dä!HÒ‡Ì dıAP ĊB Byf¨*ƒŞĦz¨ú: ‡@ƒ]h š†~‡ŜÁL‚ݰĴ Ĝ öCàUpĵ΅ àp%Ü…;àó5ĝ6< ?ƒç€˘Š" ÄñG˘x„ĴGА ¤iEş‘>ä&2ŠÌ oQEG˘lQž¨P µµU‚ŞFFu zQ7Qc¨YÔG4­ˆÖGÛ ½ètş]nB·£/˘o£'Ż1 £ħÂxb"1I˜µ˜Ì>Lĉf3Ž™bħòX}ĴÖËÄ °…Ĝ*ìQìYìvûGÄİàÌpî¸(—ĞÀÁÁ á&q x)ĵ&ŜïgsĝF|7ŝ:~ż@&hì!„$Â&B%Ħ•p‘€’H$Ş­‰D.q#ħ’xŒx™8F|K’!é‘\HÑ$!iééé.é%™LÖ";’£Èòr3ùùùEÂHÂK‚-ħA˘F˘CbHâı$^RSÒIrµdd…ä Éë’3Rx)-))ĤÔzİİ“R#RsÒiSiéTéé#ÒW¤§d°2Z2n2l™™ƒ2dĈ)EâBaQ6S))T U›êEM˘Sż£Pgeed—ɆÉfËÖȞ–!4-š-…VJ;NĤ½[˘´Äi gÉö%­K†–ÌË-•s”ÈɵÉŬ–{'O—w“O–ß%ß)˙P §¨°_á˘ÂÌRêRÛĴEK/½§+ê))U<¨ĜŻ8§¤ĴäĦ”TtAiF™Ĥ쨜¤\|FyZ…˘bŻÂU)W9Ğò”.Kw˘§+é½ôYUEUOUĦj½ê€ê‚šĥZ¨ZZ›ÚCu‚:C=^½\½G}VCEO#O£Ež&^“Ħ™¨ıW³Os^K[+\kĞV§Ö”ĥœĥ—vv‹ö²ŽƒÎ[ş]†n²î>Ŭz°ž…^˘^Ŝu}XßRŸĞżOm`mÀ3h01$:fĥŽь|ò:žkGï2î3ŝhba’bÒhrßTĈÔÛ4ß´Ûôw3=3–YÙ-s²ığùó.óËô—q–í_vǂbágħĠ˘Ç⃕%ß²ĠrÚJ*ÖŞÖj„Ae0J—­ÑÖÎÖĴOYżµħ´Ĝ·ùÍÖ6ÙöˆíÔríċœċËÇíÔì˜vġv£ötûXûö£ŞL‡‡ÇŽêŽlÇ&ÇI']§$§£NϝMœùÎíÎó.6.ë\Îı"En2nĦnĠnÜĠÜÜ[Üg=,<ÖzœóD{úxîòñRòby5{Íz[yŻóîġ!ùûTû<öĠóċûvûÁ~Ŝ~ğŭĴ\Á[Ñéü½üwû? Xc &0 °&IiP^P_0%8&ĝHëçÒûĦ:Ħž0ɰè°ĉ°ùpײшu×""ı‘]QĜ¨°¨Ĥ¨ı•n+÷Ĵœˆĥˆ.Œ^½*{Ġ•Ġ ĞSVŸŽ‘ŒaĈœˆEdžÇ‰}Ïôg60çâĵâjfY.Ĵ½ĴglGv9{šcÇ)LĈÛĊ—ĊO%Ĝ%ìN˜NtHĴHœáşpĞı/’<“ê’ĉ“ŭ“%J OiKĊĈĤžäɒy½iÊiÙiƒéúé…é£klÖìY3Ë÷á7e@Ğ2şTÑÏTżPG¸E8–iŸY“ù&+,ëDĥt6/ğ?G/g{Îd{î·kQkYk{òTó6ċ­sZWżZ·gƒú†‚ =6ŜDĜ”ĵé§|“ü²üW›7w(l,ßâħP˘_8²ĠvkŬ6Ô6îĥíĉÛĞĥ,b]-6)(~_Â*ıúé7•ß|Úżc Ô²t˙NÌNŜÎá]ğ—I—ċ–ïöÛŬQN//*µ'fϕŠeu{ {…{G+}+ğŞ4ŞvV½ŻNĴ]\ÓVĞXğ½v~{ß~Çŭ­uJuĊuïpÜİ÷¨ïhj¨8ˆ9˜yIcXcß·Œo››šŠ›>â=t¸·ÙŞıùˆâ‘Ò¸EĜ2}4úèï\żëj5l­o£µDŽǞ~ûŭqŸ=''ZüĦĥÒ^ÔuätÌv&vŽvEv žô>ÙÓmÛŬŝ£Ñ‡NݞŞ9-{şô áLÁ™OgsÏΝK?7s>áüxOLÏŭ nġö\ôıxù’û }N}g/Û]>uĊĉÊÉЌН×,Żuô[ô·˙dñSû€ċ@ÇuĞë]7Ĵot.<3ä0tŝĤëÍK·ĵn]ğ½âöàp蝑è‘Ñ;ì;SwSyoáŝĈèEVöÌĝÌ_0ÒĝĝœùÁħ}hɢ(šâ" Ön4KUuUefĴï½;?DDĉ‹-3ğ‚ ñsêTU.‘‘ÛûŜwïwï00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Xh^óÙ˙…ÌËl``ÉÀ|ŽÇù8Ȑ˜ù"ü|>ñSöÙ§ùv†´ ÌŜÀàSò9Ä_y}RJ‡>âñ QB20ĝ˜>s…pWä3NżÂù¨Df``ÉÀÏG¸ŭŬ×ÇÒû¨!ı;%únkˆÊÀ’!Ÿ_exŸéë6GŽˆ–üOwqŸğ%)CP† >t§¤²ìúğ9ÖÇ­ž>âY—€î„°îôXwĞŜ !|*?+먚u yŒµŽˆ­Û–—ŬqÑü~úßk.ÚTŬŻë:íòuHf™Üíŭ?ŠÚ200„d+M@¸‚`°\ü°ïo\06HĤvœrħ'"ÒïżöçeYµ‹…úOÚ92Êó'íÜ݇ĵHc-Ҟƒŝxˉ>eԓ!$ƒO5 Ŭmx­I l ùT ·t*Ċ‚ċ"Ŭk}A&ë2Ĉ0Ĉ1–e1Î90ĈsÎ*Ċ£=ĞĈ9GÎyí\*I£”‚’˜uÒÔ\ùH)”’„„ˆçıRJRŠ„TŜž‹<"âüĝĠ$*Ġ t0›Dr·!@£ž !üR>x˙ŻĞ€şŽzh­üg*+ĠMMµpÎÑĥmdŒaE2%ápÎ9cŒħòrfYCD^’""GD†ˆĴü5B˜_ˆˆÈm›! –„HĊ‚.D¨$’’ÔtR! U€ˆH‘""%$””RŞêz)Ìó\I)ĞB()%!HĦš„…ˆ¤ĞĞZìH5ÈjÖPW†œ !|jIhë–j;˙ùtOAœ£ëşÌ²Ĵ9ùĜĥmY–ĊmÛfĥmó’8cÌ*Ɉ#˘e;Ürl ‘YĊáxAFŒqdŒ!+N92dZh2F@E’Œ´*g0Ĉ9ÌİP2Trƒ*IA)¤’R–%”’B(¤RJ‘ d.„,nŻ”Ċ5*Ïs•çı”RJ!„Ìó\ !¨ĵĵzĵ*üWû­_W ğ%jiQ-ğ IV† V’­ ‘UT İAŬXĵĵÊíÌ/³,‹Y–…UˆÌqîşċ8/ Èâœ/~,ËĥmÇĉ–eqËrç6cÌ*ÉÈFĈìt6eDdçqāˆ—Yj‚ERq%g -DĈ”LċcŒ# 0dĸe³ŬK÷ m×µĉçK@DJí_ygO&92^*’B•‘BĊm[D„œÙŽTJ Ĉ-ÁlG)Á]O!c‚Y–°\OANJĉzʔ™”RŠ<ÏÈ3YQWžgB)„išŞĵ@E\Ş %Ş’|P#ÊI4ÔĴñğëï.2˘ufÊÀ’A/ét 5HI4ÔC:úíYنşĦ  •ĦeYhÛ6+PE>–mÛܲ,Ç.XÈĥlÛ)~ײ,³9çŽÂɢ™MBXy–Ú*Ï r€È•BĜäœü&·¸³yŝÂȲÇr{°µċ!rîí†CG1’}?àŝx͕ ˆ„PĤ–,?ôs`L·#ÓYb))G*­„@@ˆçBĤÓI¤"">£ï)6„.„K”P—𧀄q€!"8Ž<ϳ\×µ\×eêqÇq×u,ÛöÇñ,ÛñÁKg37#_f™GJ8çÁĈÉӛ[gÎmnœ<9 ·wC?\Ïóœ`4pĈCîù? ½A8rÏGîzÀ “‚d@PáFàJFDRİ˘Ĥ)Ê$İŠ§ĤˆËë°ÖêI%ù(B¨´E‘⠐s‘!‘D„Œc@Š8 2àAĈ1@C–Dei4Meš$ùl2x6˓$žŬŽg{ÓÙŜ£Ŝ>ĵzċm{FÈ"fÙ w܄{~ŠœÇBˆ4OÓTäY,ò(ˆ4ñež…JäĦ7ĈÛgÏoĥw6a0ŜOžÜ:ğğyĉìpëÌ9×!–iĤ@f‚8Iʅ¤T)@´³‚pl(”"£‚  ¨ÜĨ\òhžßİÒùĥ°*4'›úş¨ç–€Ú÷m‘Ww· ò8z¨´Ç& ÂBYid%@"˘\ˆb§@Žm!qŽŠq´¸6ç âc˜îŬ“ߟD7ŬŠöߊnߞì_żĥ?Ùğı'E~ÈlwĈw ܊ò<‹ò,²,Ò$IÓ4ÍÒ4Í£(ʵܓê!Ÿ;QMëÖ<b2‹›ÁŻİZŞ„z‰1Ĉu]ô<Ïv]—ƒ’ƒ<×u]Ïv܁eñ@ĉy ó,Py>t}sëô™Ŭ[ŝp4îœĜŜçÒéÍ3g77O ÂŬ“Œ,‰ PR’‚Ò\@Ĥ"–„ƒ8 7ƒÂ|0?=˘Rïĥ˜ĵċ5SëK–7êd—žmû: uşŽßюô·‰šı˙êñÊ'€U‘pÁŻ„ĊoIB¤@*ÒSœÁ²Ñµ-à Ŝߣ+oOŽĵucvƒŭ½Ùíŭ›îÍöoŬD۝ eM€Û‘"5ÍÒ4ʳ,Š8Ͳ,‰8‹˘HdY&Ó4•Jİ&É܉Š2Äd`é3LD¸.!1Ĉqĉ8 vIFžïûşÇq’”I9d ǣͭ­ñ‰ğ~0Nœ]„ÔEL&”gÉà$˘pĴ ˘šAÍĥmVuÌ‚Àö}ßñ’ŻjĠ UêŞÊaÑ( ì$‡şşY6ìœşŝ ;x h™š\ŝâP×ı`áԓ•r*z™*œ{9äEAĜŒÀF"–ĊùñğŻßòßŝß7nŝäû?CnŬTÈò<ßYĥŸeéqšĤ“$IâÙl'I’&I˘â8Î× ĤĤ’XŻÖ’!$ƒ_aÑÓeND9{žçAàù?p]gè¸ŜÈu½-˲ĥDžnވj9ĦµÒ8´jçdD=‹|uj!¨y-v¨­hU› yD]M´2Vê^ĞsiÎhLJŝ ¨u†¨ŝ†ž˙û†7-WrëQ/ı-:E,sM™"ÈJrÊAr>Sà“ Ç?ûá+˙í?ĵqú†ƒáÚÎAžç{YŬNÓô(ŽÙl6‹4b’Y–Ébê ŬŬ‰;Ï“!$ƒŞè#QĠÔ÷}ğTCžïûÏó6ĵA°á8ÎN–Ä[ÑÁŝö_üò#OŭÖ×8ûÈ'ĵñf \'È!É%0)Ċì²%/wílÓ²°-‘1=é:NÔ QÓ(A‹ Ô^ɚÇİ­ġÚí‘úŸgêĠ°ÍëĠ9ê“˘pŜŽÊİ…X5œh‘҂ì Ĵ;ÏÙ-zëÁéÊhY‹ê5@(úëU-Œ °“§RB& r 8ƒœqp-dOŽÓ|ïÚíû_Ŝğú7˙ùGRŠ÷ÑîK)÷ÓxĥŸ&ÉaEÓ(Šâ(Šâ$Id5&£‡˜Ö%¤;)ĥ50„dˆ¨²^‚6êğˆüÁ`xżá‚-ĈÙVr|ĵERœùÜ+żġĝ_û­K³÷l{ħ'ĵŽÈ²ùˆħTDe8N+ZíU=°ÚF+ĞJ›F†úċ¤)!ÒV÷ĥ"(W]†Š%$JDKmԴ̲Ó^vĠ]ġĵˆĜ˜b…zhQköÚú`=ôW äĊ.ġÓ Ó-s ö•Şê™HTE £\¤D€PÒâ€ĥMÌnŬúuíÊ˙÷ïŸFñ{<ÜĜ“Dûi4Ŭ£è0I’;!Ĥe„dÂx† î0<·V!kU-}‚ pK" ½Á`#‡[ äÎd˃{žŭGżŭÄÏżtŜ?qj+ĜÚµg– QšƒÌÚĴ "^’OeÏc#ŭhršĉÜħ ÖTNƒˆĉÄÒĠz‡êäÔ|8m‚ê\}j·¤ġP‰Ñ*ċÑ7²û–Cê˙"Òz;™ÖŭħP[ĊŸÚƒc=ïGË€K‰ ĉÒUy3‰B¨2Ĵċ âÂ>N’3̂ĦÀŽ)9¸y°˙“ïċ?ŭğ$ÇGoóñöĜOg³ŭ8šĊq<‰˘(Ž8­ğJ)•RŠQ5†CLF-B2ŻċšáıNë6b1‡ˆÑĥm^)˘Á`àß÷ŭá Ĉƒp¸%ólg²wkgçìıûôÚï“ŻáşcÀ; Y-˚+˘Á`àAà{ža¸1‡ÛyoM÷÷Nœtßċg_ûGÏ>úĝÙͳçwĝö.ŜÊ$È4#!0@ôXQĵÚGD½#Ö  ĤH"ZtĈ!­+µŒeż:UzŬp!tZ„ ‘f—µğр´o‘%ZmGoğÙŞ>ËU"uU•ÔZ8í°ç£5“m–ŻVs2ê}„„ #D×ġËj,¨9Şŭ&Mu)˘yO¨‚ 2ˆ…‚™”î8èş6 f{t|ꭃŸŝàêġ~<½~íçÖĉîžbÖ~29Ŝ£Ùadz(ŠâÉd’FQ$„Šˆ”FLÍÛu&Ûµdé3ĞŠÖÎ2Ĉçĵš;dAà Ï÷ŭa†A8ÜÎhk²żwòÜċîúĠo<|ŝħ'ϝ¸x߉|sŽbI’‘ ‡!şZ…ıQŞ­ĊşŬş"OsµÒpnĠÈİSi„ĠÌaiPM‘–\˘P“FN͖EÍÇéŠSQÙtÏ.‰ŠêB¨ġš6ò= ¤?yĴĞĤ²ïR}F“Š£ŜP[ sÖÔÖHçD¨ŸC£UÖŬŠúsœ·(RB!ˆ’¤2 R! ‚ëıèzÀÑ ˆŻ½{ŭĝíŸ\ıñ7˙ñGÇ\ŭıµ}j_(µî%Ir4‹˘h6&³Ù,Ëó\fYĤJ2Z·-Ĵ (CL†>ŞhYxVG¤Ñ`0°0ô=Ï ƒ`ŽÇ["M·'û{'Ïß˙àŭO~ġ7ècN?È ıı ·gM³œ¤ôĦËK·ÖÛù`Ïא°>oh)5˘•ĦŞrEžŝÖĉùPc!ë"İ:/h†jEµéĞ‹Ġ†Ú °­´ç8—iPġÓíx ĉƒúêN=ê$pœ‡ñ°Ċçµûb1|NğŠTĉÏTcPœ˙n’#bù˜Ôç•a‚J2ëÙ9-Ìċc!hĦžÎ­]dmµŞÊ"ÛrêmQ\+rIÇR’RÜ÷Ĝ0ôAŬÓ÷^żvü³ï½ı÷w˙ġ'³ÛoY['÷Ò$Ŝ‹&ÇI’L˘(šUôüÒ b2¤dɨ˘„ÄtudY÷}Ÿ—Ħ9o0 üÁ`<·IÊí›7Oœıtéòc/üċ§pé̏Ÿ’›p8Íè8ÍH²c`—nız7…ò¨ğğ­ÓR ÖÉZ5BgTŽ<¨òÔrʵĠ aCÑP{ÄDë>s­È‚ZDÙ–Cêl)ÔuŸŠ³Úʆş|Ğ[*PSOu_µÑµ°è„ú€jm.êá7M…ió¤jğ%\(#,/@*ˆ ƒËœ9q^ĠÊìxĈTîTd5ž]•Ĉs‚ŒTʓS)s\Şŭkòèç?x÷GŭӃŸüŬÏrݰpc/‰Ĥ{ñlv;ŠI4›E“É$8ϲLjĦ;wÖĵϊb`éWîġşÛÑ>N˘(JÓ4UJi’÷ IDAT)ıÄŝQê— !ŭJĞ˘Š¨úżìĵmAà/ Ñ 6]×۝ŜŜßŬÚŬ½téñ'/_úü3?ĝ܋½Ó§ĜTMÓ 2b,älŜ_""Œ •€?Ú÷cAċ–k^ß爣Ĉ|#RŭqUSjT#².ù‹Úm¨ƒn›äXsËÑ|]˜3Z´ŬĤˆÖ[½HÏ-^(=—‡µ3İНÎĜp£> µâ%ÔCе ż^½[;B÷eÚëT{ĵê˙f}6Ŝ—j {ÙU\¨˘W^. CBÇRA’K8ŒĵшÙ*…üíÜüÁ_ŭtúÎOŜ8|÷Í×!Ŭ·âÙto:Ïf³Ùt:ÍŞ0Ŝji]ƒ!&CHżĥވUá9Ĉw‡‡C'7‚p›ƒ Ĝqĵkq~á^ü̳>ñò×.;ç.8‡‘ IœŒ…ÁAœ÷–ÓG?òݧ[uG7í>%Dş1ĦAÔaÛuP Žo{GÁk“\Hkó£Q“èz:Bt…[~- ·0!ÔóSĊC¨Zg„Ú‰jŠĞ9$O£Ġşq„ôp]Ŭù€ÔXHS[Npe°L³ìf4›ŬžÍf“x6›eišJT“”îĥvÉ“!¤O½*b iŝ›1ĈŞqáá ‚  c×u·À ÛĥÎïœ=wïċ/<ûäsżû‡áÎIë`šÍ\C†\¨Ħ9•òôâĈĥ3şBYꤤ$BÔĈƒş!€Ê˲_[­PËŜŬÚ˘*­=u[]U‹ċÂV#-í|k9ŞŠduFWŭT‹İeÒÀf¸ħ#T… ;4v„µˆ¨ġed5•„ w47"‹…żRFMÂB`TšġHĠ}XĠ† £há½ı{³AZË`@KŬ‘)Ġ"ż$İ á ‚”ĤBÂ,# ô,Ú =Lf‡tW˙Ï듟üÍ÷£›ï˙<òjè$Iö§Óéñ´h'žĈq,î ·ôi á­ğN˙Ê&7ü³6-3*Ô&x—DdA`Çco4 G£Ñf†'\Ç9Ë^ÚĜŜyäü#=ġêŸ˙‹—zġ·/(×cot, ÑCŞ^ŝ°òQħƒŒŞ[˙ĉİıj¨Ûħ•~;‚ùXëÎohIóJDEµ€ĵÒXí´¸ž´ßóÇĊßj1ÁTiĦ´ê˜Íó•´Ĝ|WÇ)š~VVc˜›Ğ^‡Ş­>„nŝğÊŭ !ŭŠÑŬë #Ħ;£Ñh<ĥÚuœ žçŬż}êôcÏ˙Á·_~ùÏ˙ċçü“gĵâŒ&yİŠ=çpˆxùS#˘N3Bƒ|Ş$²ĥĜ*„şrIš*h‘QqĴ9ÑÔŬu‹R˙‚Û /YŭÖBxÁİĈ9Ëù[.ĈċùTÏqħ/ĤŸ*ҕRĠĵcÙì&ŜK4Ôßŭĵ™wZÚȵc~v„7UI,)İ’liAd ç—I„UƒàŠ÷kŻ{óïÂĵ­níïò5ĞwE;­R]T](2?† 9+ÔĵTbQNeEżĠŬS^È3Aİ-uĵG§ÈçŒs°, 8çÀXĦ •RTD:Cïw%ùEŬĠŞûŝJ7D´ttQqÎ9‡Îx<öÇq87ƒ 8é{ŜÇĥ/ᏕçùoŝÏN=ŝôö‘$x+Ê!W€ 8P„èŞy‹œQŭdúmÚÔÈ˙,”Csnê ³i °j¨™ENI[  }]•5ˆç?u¨Yޝ…òİ/¨ôĊ–ĉ‹tËôAÔÍ\T3ü×ġ:ʨĞÖKußĥ˘S çŻ·Ş…>uò)ĈCP²B]-c›Œ*˘k)Ġò9Iíï9 éÄż˙sÂzȕ:baóî ßÓJ" +ÊlVÙ ÂIŞÀuĉ\|d'<ßEqûŞé!qnq˲À²Ĵ‚ÜİüÁBıѲ\0}¤´Œ îFéÜ)ABú”çÏVİ˘^bâœsß÷íñx\İ˘Q†;AœñŭÁ%†pßÙûïúë˙ËżŝÏ}óîo`ż“HĜÏ%Ĝ€à1›ìrHžU’Ó>:ŭS J¤İP¨ĦŒ´Ñ‚(¨ĥ -HBWÔZœ´ĠNÍ[[S7T ‡ÉùGóEı{Ÿ‡ÖÊËä<ĵĥP~ÍEş•Ghw‹hĉ¸–ÌF˘%3ƒô]?A—ċ™úI­ÖùbġÌöĥ‰Cµż£çŸÔÔTÒÒb# –DOÚfµŜ‚lê*Ğ™lÔ°5úüQERÔ(FZäôP M—nżJ)1à €da~ˆ¤) 6wN¸ŝ#_ş¤òt¤öŻ $fÙÌ*Ôq΋żRáá9›eùdüˆkϲcáŝĴ{nhéÓİŠÖ ÑuŝĜĥ̓3ĵñx‡Í N†£Ñy΢8|éw˙àċoüĞ˙‹ÁéóÁuĝ^*À§Ê1, ċŽa˙'G%ĠBQU8KKÀëdÍܑNš£Nión”:Ós*z¸:Ô|áj)ĦzP6ÔĜ<ü:ùtt`€îYG-%ÔÙp•zt]]"š²¨ğê'ê—dġ˘áUbˆş6T'¸ĈÄÜöĴİ6qΕS•{’Ôŭ-~S‡b˘2Ÿá[=ŝüzŞĞw l•4[0Ħŝé§1† œpd@ ‘LkYÌı÷ħ|c÷ĴşùžÄx"ĝ äxĈCÄ*tRJŞf­ħP/ğŜ%­rìê96ÔÎë-%"\ħîBú”¨˘Ud¤+ĦÚ˙–eUı"' Cż4.l G£Óáh|1]:˙àC_xí_˙ÛŻ=öÊ×/DÌáïdÓ\Pż-\("MlĠ­ñèŬTƒtˆ 3Yݍit ızŞİİybšj‹@#×usDS éáC=_…• ˘Zĝo™"èšÛAÜ]3“dD=ʈşÈŻ+÷ÓĊ"dQżİڏÓĠŜÊYQ7›ÒÒ×§~;YĉD5˘|Š´ -”“„…ùaANEóXĠÈAénÎĊċÍ ŽöTĉMcĞKëÎB\¸ùˆ€€Ċ2Ħ@I‚(WÀCw÷\èŜóšìÙòĈ{ınpÎ8"Uy%"RRJ’RҚá¸ef‡uĝU͗—İĤyqŭh4bĥm£ëş˜Ĥ骍6Aˆ†~Éd„kä‹ZÄTÏcŒ1Ëu]ĞÌ ĈñF†ğ­­óñ•g=˙­?ŝêk˙âß<³qîžáеD€P.xiÁĈÂA‡@sóÂüDħ_QÑT…|TCÉ>e4'jíze-ü§ZùhŬž:wÏÔÈéĈ9ÏĠëL*í Ŭ†v3Ôe†â Ö¨Ú+iúZ A*ßVy´dZ.ô$_4EÖÑ·yÂÍ×mÑÒia·×Ġ“ Ò¸Ÿ*mƒĦŠ}DegwóÛÖjÙHË%u=7-ßÔxç)X•a˘yžİ(/3SEż<ĥĥ7ïòçÎIđşúӜÙ.pÏgH’Ş^Ù-ĵx͊ż—ĊŞĵÒŞpôl~{ ŠI†!ŽÇc³³0äñ˜{žÇ†!ÇHD˜eÙŞÜĝ§:\÷Y"¤u>TlP:ŽcAàŒF#o4…£Ñh;S['NŜ3ıyŭÂéK÷>óŝĠ˙öµ§^}íŜt0´ŜÎn§9 ĝ€àĈV'£eÁ^jt9¨…:¨Ç8PĞ×ÑvĤUÀŞA^Mǝ*;04ğ'ÈZŽê•…Úe5WŸfM–TŻFl†°şH‚zò<ŭ ‡âhLôkŻ×ԝ끽ì _Ġ4Y#××^pİç˜Úùİ>bĦNCъ×ЧŝJ˙[Uï›"UNŠFn½ÖF š ^ëUQ’\UpĴôÏ7i6ó.ñ‰´¨µbħŞ3şTİbS"ßçŝ…‡N°­S§èĈےŽö3>Ŝħ™’1Ĥ8çó×MË+ġ) şRZ&[G-!"b†|ss“F#k†îxsÓížñ\›sÏuyı.R JRBXmÄĝT7dÔÙŝ§ġcYwÇò}߇ŝx<…A°3ŜÚ:†‹‡×?¸ïÙßŝŭżöÏ˙ċ—O>ôĜÖwñŬYJ‰Pè"€EÎȲ)*UíLï#ÖZl¨³-òP´d!İ…ë¨ïo‡ïô4HJv„ġsQ-‹vġ˜ÍU;â_­käŒV‘D½oġšt2Z[-!£VŞYDÜѵbY‘df´ë…éÚ!IEġVRġ¸Ú{:7HTêWİvŜP ñĠ ”^ÏUşô²JÍ7`€ –~İq–XYˆËËÏvš—…µ™$äzğgGöÙËçAÄ.½÷“ß:Ċ)`ŒIDTEİ’")esƒ´já^v[–êÎ”Ñ´,‹moo[[[[îp8ĝAĝâäĤmù#ßqlfY(`2™È2„·n•É!}JÉhYˆqΙçyÖp8tG£Q0ÇAìnŸ:}ˆóÇŸ˙˗_ĝŭ?|Ü>uÖğ’ܘeD€XQiZ@Ğ,öZµ|ky˘úähÒŬgeS*3_,š$;­ ]7˘[Żġ­îĴkşċêĦ¸ÂU³ k i޽ЧŽĊtUΨkQíV;MR_6óİG­" f8UkùC=ÏQu>É%ÏOSFÔ9ÑĥŸŒúÈ k-ĦhI.lÑ.iŜÑBĞñRUÑî\-ü9êÖòzŬ•¤ŻĉE¸µP°–‹¨ç<çC;f@-Ú+! CàŞĝâĤ’  E–“D ­×9}ߙì€ż÷ƒ-`Ċ]ç\!"”¤DDD+T:ıĦU¤Ġ•ADdĠéBm9QèĊĈN¸µ3xâëOİ£kGĈ8I)I!§Ó)Ŭ‚3!ğO)ġÚşc|0ĜáFÁp8܇§ĥOžĵ¸˙Ŝ;ĝÂüÊ˙üżĜË_ğcöö4ĦL D†s2bHóö?ĜhÓToaVŻi䏨£‚„êĤ"ħZ 9‚fH¨ĈS PßñRÍ=×V^ġ< víŜğrĞŭ²z ÎÙG6NÔŸ­R`Í)âD}ʈÚıêÎWġİ<êhŠGKrU}Î@ŭ2\uŽM’Ô6"ġiZ8¸Ü Z´˙İĠ˜)ŬÈRnd”öy,‹nĞÏUÓŜ|°AÀúèġyK#D`Ĵ˜2,$DĦ$HAä„cË9séTjy!÷)sÉ(…8WKóŜ(Šeùèû²9m ‚€omm9››~[çŸd$Om]|èñ‹_ŭ'˙ûÏŻîíyÑġ)#%1Ïó\ITÓ9¸ìÜ×!ÜO Ög€Œ`M2Ò ^ĥmËó<ğRFƒÁ`s8ŸÁÙŭĞW.~ċÛ˙ÓŸŝúkOŽ/?ŜÎ('D\,lÜ6Ħ9N¤mÚÉiÒâí]‰aj9耠3/Tċ‡ĞV?ú"2ŻA­Í‹ĥ‹Ÿç tĊT×Ch´Šİ­ŭm‡u„éV–Ŝ4gİî0^ޤÚcÀİĵ`ù4Ùĉ"OÔz>Ŭ#/hĊAİ*köüù×Yħ07BŸÎ;ß:òU]m:ó]yK@ġ"iALQ93FĞú2"0Vôq`€À‘Êĉ­UÉaÑ:H•SlħĵNï|^Ób~SaĴpŞmĥS´šĉĊ„Ú™(rEñßĝâkM½Çïŝß>Jà¸ħc# CĈ"N9ç0›Í Ïsİ­ Şü[Á’T#ĴßuĦS=1Ĉĥm5ĵÁÀßÁ‘ÌÎl윸ôù×ŝĝŜ΃ËG)}uÓ²o0’‚sžX–Ûĥ̈́Ġ÷§ıµjÎTDĝ”ġżŸ2b°ÚIÇżımÛVİŒüQ†ÛÍ­s è‚ʳGúgùâ ż÷‡Ÿ·Î]òÌ2úp–€"†~iċvÁbEȂĥk˘k~rgëŸċS7Ô­ÒJ#˘Ĥêé,jí°Š+ĝT#Ǥ·YĉCê뚰dŝu3ÉŜڑkì×ħ SW.!q QÇpıĊDÚĊğFÚÂĴF'lŞÂĥ&CmŞ~ż…ېZŞFW–Ĝ×2Jï@=oÔ>CŬŞİcA×³‘+:–SÇŞuÓX˜[pn|ˆµiµpPŜNA—™aO*:;èĊ´ċ ³òµà Ġb„ze–“ Ÿ¸¸%½Ñ6Ol²³á&ç¤$ç\"b•S"Í}·N.i,Ÿ—Ĉʍ0ÇÖĉĉĤ7 q8Ŝ8#“ÙùA0|èİü§ß´îyâ‘˙òĉžşŭöŭÓòÖjšKçyO&“\³‚ŻğY7Ĥ†OŒúd5ëà ΖeYaV–îq8ĥÎ'GGNž?˙ôW˙äϟö›żûPn°w&f 9”dTl̊Ö?Ĝŭ lŽÍİ9ŒêĦ0-\°X­ĉğ ԕ#*“Ìúâħˆù˘sC#Žßg*ej ÜÖöڜ ŽjìÓ¨áÒĈyw„ĥZ[ĵFÈİ'LG5~i,ĈĊë°Ċ ÂFaĞj*£Ċ̈ùĜ l×D‘>²˘ OaŒ Ħ~ô1¨ŽĉŬĊËóŸ?„Ĉ²úóšG ħ£JQí½Òß_Şİ\Ĝ–›&…‹ÏÙĵ×µìàŞ4E,T˘£UQ4Ró׌ĉ·Ċè  "|WF '™$̒Œ¸í }ꞎĥw!:bìĉ;36ÜfŒ”bˆ’16ïìPÖ*­ uá 2Z˘ce˜A`mnnş£Ñh8O2’ç]×yÁ^}ċäëİżŭ V?żħèևŝ)y]فTj’çùl:fQİğŒ Bú„ȨĞ;wÓQÇ9çĵ2/”-€6G£Ñ‰AžŸíŬşôè /~ùı?ü§Ï?úµŻŸÛ'oǔ˘ \pJBĠuĦ-ϚÊhoŻwĈĴÛŞ[ı£Ĉĵ˘ıqA9£v‹ĴwÎĤµGkj‰fÙÜĠw8°ÑÊşÂtÔ$ –½ ¨äïȟô=|}mï/f˘Žá|‹ vÎ^jÇ=…šm#Ä▪ÏlPÔPwÔ]œÛ j&µĥ̆ú8 =”ZsÑg‚PµYO‹‚NĊİí ¨u>ġnŠñ¤Jëxİ’ŞŽ히‹ĴLz°êċĞRl¨'+w%Ĵœ)FR•Có<'nYhïœĴñÎi!…Ċ?üÙ c`!) ²€vY>: H@ÏÚ3˙ßó<ĞlA†áŽïûç@ŠûïyòK/<ü›ĝëÂżż6ET„“#>ŒO]]SJŜÎò|EQ:NeÂüıvCH#ġúúûˆ‰1Ĉ=ϳÂ0t‡a07†£ÑiÇĥ/äÑôŝ§żñÛÏ?÷­o?wö™g7ŜŸċôŜ,AˆAAFX‘Ԕë Ù.pV˙Żî^tŬθùĝ†Fï0İ›´Ŭó2"ŞÙxĠ˘0ĥğ=A7uĉŒ–gŒÖê'×÷:v$aÚ&¤Ö B€ŽbÛ%™ZÒ(µÙA˘+lÖE–]ŭç`I˜³zŻħ#ÌÙ|)×İ—€z_ÏıBíQµ]'Zï´ RWêĠ†I5&+š[ÁğLŞWm¨V­˙P5CŠ•ŬyQY BH˜ ˆœÍ3sâÜÙ4N™³÷VL΀C‰’ˆd5¢Ħ”îĤ¤¤kCŒˆX…꜍`†›Í³ùìĝŜS÷>ü̓ßĝçĊĉ=ƒż}gh1„<PûïÁX½CRìçBL’$‰§Ói”\“‘ŒBúĊҝĞÂtïWĥî°jÄîá ~öwŝàù—ŭ§Ï:÷\vß;šÑġT"#D›ŠÜĵŭOEFT'#êRFŽ´ĉÜ!ĠpĈuuáks=‹EHBG'އċtËĝĵMLoŽzŬgË:m÷QT+Ï˘:äD6‹C—9ù¨ù¸+ÎħŻ]¸ÒòJ ³jN]HûÚÒkwQRQ­püµmTo]Ôq^}-—qĈĊ„Ŝù†ˆê9&ĠìPO‹Ž j1ŜÊBÜ*:X+¨5WĜXj5YAJĴŠH @*‚líX°{ñ\žĊÌùf –MŒ[%"вVI'uZ‘ħU9kDä–eñ œ 4ŽÇ[;§ĊìĝüĝÄé'Ÿŝĉż´ñàvżó³Ġ•œY)ɵ}¸ŭáğö‰üú› ²½LÒq–Ĥ³(Šò,ËúΑLéKDËl–ú‡˘³']IFöh4ò†áp<oax„¸è‡Gżüğßzŝċ?ùó§²`ÌŜ&tò²ġƒE+| ÊW‘Q#ŒÒ Ù5Ç2t)%˘Ž!{@µ¤ò"g¤ċHK:#t6L%hĠ`ÑĦ`I·kZĦ‘šÄ×Û4´;·ŒĜjE–t§Ô^‰İq~]-şĠuzg†7b_£Ĝ•Çn5:ukğxu´ŻêxϚŻiÓŞġ ­>zeĝNj9˘…ûµ.&ü6Q.Ì$ĜÊo-Fİ|şmĠ˙Ž#ɢkz" 3)i<qħséĴÊ"f\‰™d–­ŻJD¤´Ì9×·F(‹î=ϳËî/£Í­“(ó Žë?ò…oŝÑKçŸùÚ½ûîmù³½Œğ @Ĥ€\póÖ {7ğv•Ëôz.Ġí,ˢ8޳$Iä] BúxT,!£e5FU áx<Ŝġ}˙ *uiû̙ǟû½o½Â·˙ô‘cbôĈ,ƒX2*\s.TşÊğvÇ]·İU<Ĝe¨‘OGż¸E(ĉé Ĉ[¨+êÌ×@+éîNÛÔĞNş~êNÈwF‡›ŽV4J%}Aî#ž%]ğ[Ħ°fTG Â˙t7áš]ğUç& ĜŞbí Ó5FÁc£˘¸oTGë–@UŸAèyN5b)5Gžž;ÒêċŞAäŞ\ħÈbm*í˘P5’½\¨ĜH²2Ç*$aœK!Êӝ“ɌهWc̑ے1ÔwMRZ§ù›Wy£2oŽĈ]ÏóÏĞ<ıüÄoüÎKĝړoJġ·ïqTteÏ( $AGèE×cGLŻ*™ïgBL£(Jf³™€jj..F›Ŭ'•3jîJ8h“]ƒ pĈħ_ÑĈŽçıg™R÷žştïç^ĝ£?ùÊï[÷^Ÿê­X2ˆ$ ìÒĵ`—ĉŽĊAħü 3h‡Zù!mŒ@³ e­ĠOß 4¨ç”@Q­]Uˆ¨íӋ`+òh†ëz“ =J ġ·âĦeáµĊCßNğ'¨y§ŝp"uVuÔu„§zTǝ´ê Ö]qÔM’0]ŻòY²[Òµ›`ÎRKÂ|]‰Ş¨šaş—Qu¨ĥfΨ‘÷!è—ĠğlŻo`X§]QùödÓŸk]ä9(VLğċˆPŒ ùŒ$^–!“y‹ŜvóÄħ–ĵ­ìß+‹p·8àH_)˜ ‚C‘ÖĜSû_üö³Hî›ß)?ÑâíPŠĤÓ)ÈÂ~W“Z’§İİ%˲ĝ`0°Â0„a0Âá)™Dç·/Ü÷ùÇ_zís°{Ùûï?|_&ĸ,×Ħ@• ‰lœ8 ·ŜÚ² ŽrÎ}Çq\Çq˘<Ïu5zí³°˙ÒU˙ ‘ƒ²à5 CgXĈkÇñ ÏuÏĦ”—.>ŝÄ3_ù“?˙Êçż²ŭÎÁT]“Œ!Ž½ržĊ—ÂÂĊA{Cs Ñw§Íœê;Ŝ–W7èŞ§Ú9ĠOµ>sŞÓiÖ·B·•ġQ>èTF½#$z›ÉҒdRŸ2ZEr½á§e!KèèĤí™U}yV(³ŻhûògŬ üĉ ×!%†NËaÛAĜRV&£MN}sĠO̤¨hGD8݉jnÖ5Vso£–DCXtİœwóIÙcÒċĊäĉ\n„žŠvî?ñ„Y‡ïÇÈ0cÜ07 ’’Rêm†Vµ#Ğš5[ï;áp07FÍSĥĊ/X–ġÈ ßú‹ĥzöôw~~S½u;gŽP %Ôüµ•J Žpë`ßŜNŜżnċэLŞ<Ëfq§eİùĦ&Xڞĝ—Ğ”ĝgˆŒ˜8< C{8ú0F£ŝ`pžòüÒċÏ?ŭìËú/žyú™ñ[3ş)U¸Í<¨ x£Ĉ¨Ż›îzÓgùÌs;69¨2 U˙MíÂÔÚ8MŭHU×tçġ‡ŻúàĉŽT_䈖 Û™Ġm•Ö’B!ô4*…VŜbIH#ü´ÜDѨ3jX'WÇ ĥċidi…§ĜCœHĦŜ0ê~jM"ÔreDË ŬQÜVƒÖ.òjm2÷Ñ/–¤™s@-BĠó"bĴġ#$í•V ê$ žçE„²çXöš°9›#(İäÈ£ĝäƒçċìˆĴƒ÷"´l‰È@9‘ƒˆ:HİĞĵ¤ ĠqÏóì ĵQħ+>á…,:üÜ·ŝâ O½t˙>ŒéÇ×cĈ¤‘_lU²óĵc  OcpĤ×37?~_Šl/ÍĊ4MÓ8ŽcIDt‡a;£>q2Çád/ˆxvï#Ͻĝü+ö—/l=üxĉíˆn‰˘ŬœT^iëv;ğ/tm?¤ĥ[Ó·Ħê…ĞÔ°ewL†m·Żèkt[X21´_ ´ÉhÙ‰%i‚VİŬ¨›Ĵh´İ+<Ò{a;3o½Ş-JÔĵmgîDk`ƒĜÊ̏‡XŒÚf•³ ËŬKñC€œ–" ×Ġ–‹&jÇÀZóiVŝĊŠŬ>RĊiġç‹mĠĠ1ËsĤÁR‚mlÀġï½kc%ú ¨K=9PQÎ+˘ş¨[8óĉ­‡#T´öZÇsœ“TjÇEŸ=D°Êĵ’vQğCŸòûωèHòŭ·g`" J))TċèŠ ó(ëşNîx<ÇñÎhcóĵˆ&—{ċw^~ìĊW½šĜ÷ß=Ê AHYoU˘£ÎIÉĝŜşb‡éŜ{LĤ7Ó\M²4’$Ʉ}ЍërS{dÄŞ9F£ñxÁ‰ÑÖօôèöĊÏŭĈĞ/ĵògù\xé²÷ĉqL’ŠŻĤp€ME_şêŠħí"UŞYµİ·Ü܆­…Ġĉ_.m­V G”j˜#Úó¨aĤ %êgÙŝHS#½ùZ:EUÏ‰Ñ B/ġ„âšÚ"Ĵ/@Ġ~ğ.Ffk 8gXT˙sĴ5~+şÑ p‹-ƒ•6Ëò´˜1 Ş"Œ2‘Ĵ EĐ—ĥd@‹ÍG° #€*YRœèÇÀ‚àqŜV+ Ĥ̵Púm\€ċ eŻ£ċʈ:sF]Ôe`è +ôݳò/IŞÜñ)ĴúáQ-[´Ċ­Bsì!6‘ây³òğÎçÖpÎ žÜB}ÏıtzĴĜ­7§à‡ ‰r”lÌSêÉÇħ}ß·0 F£Ñöp<>ˉ.œyàħ/}ù›ß~*Ÿó~ôŜmR9`€T´"£bC’I=‡‹œCÛġéĝĈk½Ċ’ÉġT$KÓYÇY–e²ŭ úrGż*Ĥ†.eDKK/1ĈXYgäÇñ`08ıħ³savëĉ…'^}íĊßü“?{vpî˘û£„ŽĦ*[Ön†…”ÇÒµ@š&êĜùS½S'™jEŻî APó/³^³¤Ú1tĠĝ‚G>͵ùî¸ÏÀ@=ĉ€ŝĊ­½knĞ0Z"ÄÚaşJ-ÔŭbĜù°",Že‡€ò}ĉXZËÂUSJİ\‘Ÿ`ln-fej[B1ĤĴ²Iaùż%hĦŒäÜşP.:„$(EóÏÚ%ù—Jde‡ ĠeWĊ£‹\JñTž?Éî×}1·IµßûF; eaşŝĵ ġ‡ŭ¨MTŞóCÑiÁVŠ—uLŒÀ*ß&.‹‰ÌTšxER¸Èħ!£rÑ(JsDıŠ`ù]³,\ ÌÜwö w_ĝŭ/(3á½ŝœ†J Aċ¸ ”RĤyžK}4zġħäœs×u­0 £Ñh#žë·mûÑ÷Ÿ}>8{9ĝŜ;$3…›AA)X¨ÁqV~Rˆ€òÂoèAìoÛÒn{Ùñ†ĊùÀĥmϲ,›1&ÍaûĈ›SÏZk݃Œp]‹Œ8ç, C§ Ó ƒ›ğğf7o\xâĠo|ċĠö§_ôÏ]tt”ħPs2ŞŠ^­2ċÉ`Qì€XWz˜^ĠB š2RÍqÔ=çH[ˆu™" ĵĥĦĠtî!˘ŝLO‡ÚğëeÊhµ›n çVOΈzûÖá"”ƒZ‚НKħ0IŞfçT&*ŠÌXÙr@›œ90ĞPS$%È41›B6›@M1>ĵ “ÛG3ıY5Í3“#YŒ$Ċ|çŽz/Rnƒû e‚íxìlƒ Áĥ°ĜžOÌ€ŽÀñŬ‚tR „P r‰ pR ²"ÛR… P-F€‚ĜT=~Wl€P3zôWĉĥÍ w`eozŝU;â]ŸĦêûCiݘ,Vl+ó?“¨,”(ŻÔ0+H‰••À ŠÑD4ßSèYÀâ>UU’Ò½.:ì…o=wU*éżùׂ6v¤TR !HJ Qċ%)-BQœ3Ûĥıïû^£Á`°;ŜĜ:?9¸qñ[˙ö˙úòéûÛùñ‡˜EÇ™JPAƒ˙Ÿ½÷ì–äşÏı÷†ÉHóü+_@Á{‚0E'Q")İ5²#jÄY-MÏĴ^ŭçÓü™ùŞYROKÓKjÊtSK–’0Š–(TĦ€2Ż^ĠóiÂ]sĉCÜȌˆŒÈÌ Ɋ…ÄsYùòeFÜ}Ï>ûìÍÁ€@H”È<§È@büÎ:ŒÜĠs.ÛYuyÇmyžç0Ĉbc ""ÎQÜ}$˘(ď)áœĉ!œ³ œN§wğŬ^§ŬŜXÙĜÑñ"22È è28‡Ħpā‹B@jÑ@Œ˜À˜ı€è.Ó[oi‚ċuèlœ‚“ÔYYà‚Œ&ÔڀŠS ŒÒ'&˜­ Mĥq*J¤Yĉ½ĤĤŝ½2µ'S‚šEÓєtjNÀ&ŻĵÔ(C ‚c‡Ö‰Qöqâj_˜äy”,Î Ìlŝĥ`îò€ĥR%Ä4³÷<ÔRÏŝüó7ŭÈż}EëŜŠÖÚ­5c"cLj ˆ”ĞêÚív·kK+Ğgo]?ŭĠßûß?÷èÓϟğ62p8’Ôá ‘4hÎ@‘… X6ĵk²ÜHP6O^Š%ĥ7ÎBtky­ÇĚàĜŽğëpÎıRÊ‘iċŸİaž>T‘ewl0êvğ­nŻ×ë´Ûë+›'Ώvn}âçòÙ/|ŭŸpÏŜïżÖa75˜Ğċ„•v­€€Jŭ˘ş5µ³lÊÊĥÒ°jI=G5žvUáLJs(‡÷iŞ*ôL³ÂĞİ2˘9˘mS5MèZ,jĥ˘šnş:j½œó/ĉy"˘µ1ÙJs á ˜çŒ0ÁpowĥáÁk8¸u˘-‡ûèi8i%ÈHH4xiŞ÷éO˙Öï<çß{ż˙ĉ ½Tgğf F.ä …L•ÊÖĦ¤~ƒê`]\M §š mQÊ2E!CYĥ 5†ŒšF‰€š§ä…r3è³ıêîħ4£75ĵŞÜµDq!Û1vAħ‹ C€Œƒ\KŒ @%it¸‡7.½…;—~„GW/Ħ9¸ žL5j%I&)Ĥñ¨#“CzÀÈÄ 1ĉŒÈ0ŒĊ$PrĈb& ‘ÒÚhcŒÊ>×$Ô†ÈdCv?a^"Ğ0;XĈÀdŸçñӌ1Ĉ2Dd qΐ3†À8-J}P‰k ı䚸JߺĝÀìĥ:úż{èµZnËM…ï(݃ŜúIèşË§ïÎĈ p{-2Z£JPaŠ 1À fTÊ>2XĜ_S)vĵI€R š£Ĥ+ „ÑtuM sfcßG  Yĥħ$Ê(<Á3P4q>&›T y”WŒˆe°,ş³ĤŬ˜nMb çÂİÇĉd_Ĝŭğ?ƒvÇ(™j)%i Ĉ˜T)elߨĠív—Úíö ßġΞ<ŭôgżöЏCkż}s21(ìlĦ°Şjà e §"²B…T·Žêğ”Ŭâ"†ş^6€ó<Ïévğ^·Û :íöÚÒêÚ9Çgïyòc/|ĉwñ‰î}´Ż ĜMdÖ²ñʎ­ŠÄD •í¸ĤĉBÊq 5ÑáUZpÁ˜BĠP”ƒ×9€Ğ"3ġĜ“Ġžf*çfôqf|=WÜ|İ4Ŭ›Âş>D1ĵ¤ĥ*5,\ypĦÉ8&8x­6 G€ Gt°} w\ƒ+!}ax,Sˆ†Ħ—Ž…”‡œLè8"fŒGœħğ<äLDÚP*•J”RRK#GZ+£µÒÙĥ7WUiÊ>'“yœ ²ûñ&û$Ż‹Şġ%ÂĜÉq P˜}‘aCdˆ 9"2ĈĜĝ£àœ3Ĉ8çL.„àÜġ:‚sxF‡--Gš@û„-x½Ġ酗Ûzí@9#ƒeô6Î@ïܰrú^ê-ݐJ ê8•ÄHŒ&^=Ċ8y, ž–ÌUİ™BŒéğùvP†šucŞ`=¤MÖ_2-òd+&B h‡ É6 MdĊlnċÊC²r{Ä4Iiİċ™§~öB28 ˙ò£öò†Qi޵ֆˆB”ñ}ß ‚ ÁF··tŽŒ|à+_˙_ž_>}Oú B™e9™‰ ­ÊÉÍj À³šÒ^Hq,Á V tVO·ĜÍ5O¤-!ßó<—sž(°LuyĦSûïŸf@Â9?›7ŭŒÖ…Áévğí Vğ½SŒÌÙîÉÏ|ĉwGžì^p;–%Ħ Pf’jûFˆġC‘‚ jd8T  4àš›GBĠYÊwÔĝXĠ£Ĵ2šYċÔéÑĉşv×ì>g1ÊTóhĤ#jî1˜šaڜ6oÄgT÷4PpàŽ g†öomöËßĊƒKŻ@´ġ6R˙`8ˆiÔï;ItÀş‚<ÇşžsÄ •ŠT‰”2‰”’J))•VdŒÔF+­µ$c´6FُšÌĝĈ“›mڋŬbϸ$²Ŭ¸DĠ İ\,áäkÉch‘È‚2Î ò §˜`Œı‚ î8Üq„zœ{àÔRéQ7şRëŽ42ßUWWÖúoĴt;˵WQ,Ÿ€îùaġôjµÛ¤S‰é D£!`È2i{•ĤCŞħŒ‡Úž!Ġ3hşY`Tˆm_È3ˆ!n)” (#ä)‹ŽÉWSvö|CÊèvAŠ.‚+RIcu‘ĈöĈˆoŻĴHt—]ÎÚ\ˆ–ëş8L)U'hĝHtE@ZduÖÀ !DğŬv;NğÓéĴtşŬSëœ:Ŭ§ĝû˙ŝSgŸzfċíHÁí8!d óYÇÎ À҃LœŻ ĤÍRMĠ³n‚GS`˘+Rì˘~uq `Ú)ÜTl§çeä ÔÄ/T% •X…ş³²0ŽSJ%­uùTŝ‡5eyĝXádĠoˆÙà%1^ğ1ío]gÛo†ŭËŻctóèŭÛ‡N<ÚwÈô}ßúwèŬCM4L’4JÒ4éF‰”*5F§Zkİ”’ĈiĞ ”RĈeÛùŽ×Ĝ”Q€JŠ…bp{6-OÔ|³*/ĴŞżÎ*˙œ1–Ÿ÷,%Îcœ1†œsÁ9Œ1Îìçœs‡1îÁ]΅îzëµ\ÇërŜŒÚI²żšŒn/Ċ×uW żĞÛË+ŭK›Ŭŝò –O`ëä½°~σ,/҄:ŽQF)Xï8,œK Çğ÷şŝ+#Êi‚µjLĴP€H0ŬÓ²›£ñœž6™\;WµK;ĉĉwĈŒİNlbżb`<ĵĊ@–B3uİ1Žh}„?ñĠ'Żm÷[Ûo¤Ş·˘‰@(¤ïûí Ŭ>İ“ìg~ùë?ó̧pÏÖPÖn¤P0ŒĤ_¨|‘ËT€ıŸŸ ÙSY;ÚŬmğĞí5ĉ.µ9uıpÇq\!„Èóœ`ĥ½}ĜġQî!5ÓTï(·êvğA§ÓYn·Û'‚vû<zôgïûôŭŸĝÌĉĠDÁÍ0%ŽıÊÈĊìċ9át)`jÌR§nĤ<üYMy-Òş€˘Š(˘ÔĴ…š9$šˆ*ħáĠ3h†­ Ġjw§R Ĉ Tƒk^Ĵüñ˘‘˙6À˘PÊ/,4Œ(Ëû@Ĉ€{>´<dÂÎÛoâî×pxġŞ[[”ìnEt¸wà$áÁ²ï ڝΎß]ÛK•DI F£hç M•TİÖ*ÑJ'JĞT+•*¤ |â^+òˆm_sĞÖ'Ó¤o9ŝ`h41œ *$Â9ŭULÓ4Wë1[MÁ¤ˆÊ¸<ž90 !„àB8œsWÇċœ{Âq<ÏžïyŝjË \XĴÇ[;+á;Ż,ÉöÒr´|reûâı@w6˜X? +ç„ŜÊĦHµ”mċDUkq„éĦíjòlI_ŜÈMŞ” 狅kÊ:÷†$eĜr˝,j‚ ħ‚;3c ĦÓzÖá5Sm2{ßeÓÓœ!¤)ĦË4÷ ù™_yĉĉ·ŝÏA;ŽšžgŒN…mÏgî}üıúíєĠŭ´2€ÚŒŻë:2ġYŽ× žÉ€”$é.câ.oÜ[v¸i9Ž;Ž bR#ûnêÓ˙ÔWHœŭĜ”şÈcı˘Îo·ÛKAlÎıt0¸˙çŝüô#Ÿùü™݆k£” 1ÌĜ(síĈBż(_Ċ+v3*½˜TB€Ĉ`I Wìŭä ô{ñ*AY>ݸĴ ÂÖĊËÔ°`UĞ˙Şâ ‹Â„z,T?›˜—’³yŝš”†Q­~˜ŞÉĦSN÷…Ĥ1s’Á8÷ŸŒ6ppk n_|—_ƒĝÚ[”Ŝ>Ô{-£×ğƒîJ÷6ħŜ^'£ŝpŜŽ“X)k­bT˘¤L”äìM*!“ONğĠĵMXó½:Ħ~[ŞYpF_uüq<6°É8Íä(`稄ÂqG!\! á GxÂq|ßqŻ·|ݵÙv:œ%+£½Ë›ƒ­7VRĴè•Ë{—/´NœçbŭôNŬCí•0İ9ŠPKYô°É5‘)ĝŒ}×­†ş!Ŭä ¸‚8sÏ:˘’`ĤÎf› ŽĝÙp^eóW0ĤÙ8M3û>çò‘=°ÎDÀp2P›ıDdĞ2‘èz.œyèéµèàWž?úÇ?PliyI%Q,„èöV×ïûòoŝÛ§EgUĵ~­q¤U& şˆ€qá˜oè&8A^ûúhʅèµ×!ñ×O&э5_¤­‘ëµ\×B&D"*ŞíŞĠƒ²üï#‰05)BŞ. ˘Ŭn{Ŭn·Ûétփvûœî}áüĈ§ŸùÊ/Ŝż- Ŝ¤Mff€€‚`0Î2bS+{y.hìm*)JQ߆Ên Ġ„W²syd³Á²LşÔ#2TNƒ%*Żp9`µŞĦ’wšr›Îĝ)ĤN—wÓf PPûċ•OY5iŒċ‚Ĵê”v-M€hŬÀ88-Îi48€Ğ/½‚_…ŝ[Żèêˆvĥ÷{œöÏĴì´Îœĵ™JyFÑp{o/’i*)#T"ŒÒ4MU&LıŒ`7Ġ}İךĴ÷hÁ*é8`´H/uÑëdLï+jğ3ÖZDÌ7İĦŠàäş:Ž'„ G´Ç ZžûöZË ŭk÷^ì°pûÒèÓ_ûÍ'ĉ‹ëoöi§/̈́ĉŻušçĤeĠÎ.È9‚`ž`ŞÌ˜Ùh+pz>ġYÏ[aŝRC‡qÑr]ÇBBOrV•ôĦÒvâ#F³., à IDAT ¨CDnÁÈít:ín·ğâğî)Fĉü½ÏÌg˙§ûĴtZx)TZóEcÙ_Áö `TéË~Cu߯W™BeT2{„B(^%˘ĵ4\[È>¨™ß ˜á¨MÍjğšaÔİX€1ĠÖĴ°›eT•‰Sxa<oĞ8†À… ̤d;—.âá^‚½WżG‡—^‰ŝŝáZ7¸½şħz aċöÑp8ĵħµ=LÓd¨¤I)4M4Mc)e@*È£k€‡*û h¸OÓ×ózGtÌ şİ‚j˘ípPÍş~fŜòèc SJI+èœs^,›„çy~ì¸ÁÀqڎëĥ[-˙ĉİÀk;"]lż|vïêË'†ĞçV½{ïĊçDgġ,tÖ6Á¤@$˘Ö–°>qV@ëjĜAĊ=„ :hKġCâöBV:“RdC³ÀŒ­Bìèe”ÏG Ì3ˆ¸ÁlÛ`ÌVJ@ Nnl:ŝ—~÷”ŭŸv~ö—~ûÄĠŬŬĜO4YÄêfn"·¤J˙AR$RCk#ÑPÂ(ɲ’”6ÀcĦö!Ŭu#ρV$\ßó<7 T)eÑ4ô“>t_ğe7KQW˘ìòy£N§ÓêġzK­Vë„àìü‰{ï{ê3ßĝŭŸñ7O:ŻĊ0ғŝ P6ĝ*  FĊŒ,ƒ”Ğ" ruR–oSɍĦÚ7Ş´ŽSckÀh, fëœFµÜ,š": F]^ïĴ†ëĜĉêï)¤)ä|\öšs@œsà‚QŽà­Ëxô£Â­ïż¨G—^;Zf´÷ÈĉĈ5gŭŜŭápgwo˜$ñPI9”RŽ’$‰,%ĥRZk]è™j1ğÀÍÌZ@À^Ğ£y•ÒĴŝÒ\oP*^oĈµfRʤÀìq7;<Çq<Ïóü8rÛÇmğžğĝŝóAk‰’­S·^ş~aï˙wŬ½÷‰žĵ˜€³Ĝ[=Üs "‰¤4šô3‰ÑXìS}¨f‡djfkÙSŜe)Û/"pÇb+tàÈ)óċöɑaÀ8Ù/££™Éԅh†ŒsHµ˘N½œ|äŝ{nI¸r;#MĉT^8òVc™3†6Y[kİ (CĤaŞ J5Œbŭ‘‚Q {ŭ’4{&2ڇ!GâK0k›1ÛÚô¸l ÇġÇqreĉœŠû§²BZ䙲ÊÁ¨Ġj9ívۊڛñ\omŭÑçëŸÚ|ô‰öŭúÊÚĠ›ĴYg”ùYÑô+NX^”K`T3WŽ(ğvç2 M]ċĜfšDJ‚1ßP­ šîVSħÔŻ M~aejy]>uĞp6ö5E›·c/ĉ¸€ĈC¸ŭĈEÜí{°ġ½erċÁÉNpós§.)nġ‡qġe*‡RĤ4MGI’ä ”J)³! B5tÍĝšĴ†ĉlÎKŜ¤;pÀ‚ĠÑ,‚Ğ&V÷5ĦÎäŒ1ĈÓ4M8çQ^59Žsäyžïy^;v½ÎÀu<ÏÛ[k·Ŝ>Íú{—˙ù‹ß9eN?Ú3?ë9'ï ·À\Ĥ¤'C1ú‚j6\0]yÓ,/+SŸ„Ğò ĊĈz ³˘UMyL}žYe˜ħŝ–ĥZÊgĉX&ŝa–‚ÖÀ‚L’4†ŬC W &2kמu^7v(Vi‚THA" ¤RCœjHUvİ ¤Ê@"5p‚2“u¤¸żJ#gµ— ğÜċĉŽÓ²›n… MUtus'Ώ< -Ò7*^9ç™SuN§ÓñşŬn§Ûë­q„Ó~<䗿öܟ˙ò‰w!í¤YİCD`tĥÓħˆIä8šéPŜ…Uç‹Jòî"E7–zOWFµ+`%’"_ȵİ3•ĴĦzBµ÷m¨£Ş\22MϧBĉ>sù҆V]%|ñ ŭka÷ċ…kßùG‰7ß>:³zmùÂù·Fax{ûöí~š$}™Ĥŭ4MGq‡–’K2‚’ù@jM%TJS…ˆ˜ ïî$s PuÇݎ pm5İYYġ£AÑ*YšĤİġFŽŒ<Ï;ò}ż•¸^;ŠÂ%×ó÷;-û!֓½×ÎoŭŭĊ{Ï<ĥşü3Xğĵö0ß&˜TgJ<Ž@ʔİŜB&‹™u­żmfGÑ+3é£5W6,£ôsp$–ġ– µġɔµıÀuNe†ùρ1Pd0IíĈ33íE25 5”¤Ô(=N· §L!DÉçrġÌí{Ĵ‡7Dá™{n‚­UÎşBˆÀu3_ğ‚à ”>Tû ñ!‚Î1c‘1Ĉ\×­VËkA§Óí9œŒ]xĝÓ?ûôóżñ;ì†‘ıžƒu–GÛ䉐ĈÚj\QÓ[ħħM@€Z‚âˆĊòş6;Ğ7-ëk'cE׆Y­’ôaSv‹6açœûŸ;x/·Z­“”ÄçÏ?˙É'?ñġo<!қ‘fc0“8 n%’X0MúB¤ì²ċĵ‰w•cÈç€QĠç­ Ff lş2˘úê‰ê]ğİW4×d•ĉDœO&ñÁRsÜ!Á’ „·ŻÁöwż Wŝñ[:ĜßŜ}äÄĈ[Ĝ:ñÎh4ÚëĤIr$É ŽQ’$Ħĉ¤ÖZeڕ[(Ae7M™H0çîd…´H_ *UÏ,bVOÉ@½ù&›NĈ‚³iÇI’$ħ†ß÷­Vë(ġŭŭ8Nö=Ï;8ĝïè×ïıñoŜżżñèêê£/ˆÖé €˘È­@šR",ĠäqĠž›5`DUÎ@Ч”iù<ž•Ic{!Èĝ}„í9QÔj}.3ùvJQk2!(“Á)<Òz†L—ÒÌ˘­¨ŒÉb'´ÉoD4ş¤4 ËAJèŻ@œĴ‡İ·éñ¸%×÷<ÏB0ÌÈGúPûHâCĦY}£jì/ !ò¤EŻÓé,íÎ&%Éé3<öijżú[/¸›§7ú!Iƒ7ÀJğ †İ8għŻRmZS­™ŞzħB•ö#Ş ¨FàPƒS?NMİßÓ“);,Ìş/Ġôf&1eóapBGdÀx6ÓïmÖw˙ Ŝúğż qóíOlĵÉ7ׯŒ†½8Ž÷’8>L’¤Çñ0I’(I’ÄÎ)"Ò ёÓfħòù†+OœŸŜ íTÙj'•R™U/hûLY?Éz⍠hgGj”ÄPDĊg²ß§sÁѸçT§ "M€LÓY§Q¸ŜÀ[YĜáÂi9ŽÙ8 ċ(ŠşâàCé#‰Œ½(òy#î8N>oÔkw:kŒôİŜĉĉ}é>~Ï'?½üÖÁˆúŠ! £IäI%Ĝ F%ƒÓBϤ;žƒĜü•Ş]‘²öŒŠ†ĞU›Ş_ˆdÛġÍŬ¨²”Ċœêf”>5`T¤I°Bmr€ŒòŒË0ánżü]x[ êòĞ£s˽+íëoŒF£Ŭ$‰w£(ÚO’¤EÑ0ŽHJ™$I’h­•Ò5 tŞn–‚ŽjĜY8Ĥ€aÑ~ѝTÙͨĤ’İ&6‡13Äf—ßĴï³7•Ú#I’ÈóĵaĞĠĝ˜&ŝë'‡÷úñġĈ‹ŬĜğrĦï³Áꅧ€ˀ\´ÎmFe)¸D™ÊÍ7mĤAm:'8ŸTg£€ùĤ/sk”Y‡ÇʀJ3сVíĈǎי‰C8•ÌšħHÏTŽb˜ƒ—ħƒ÷™úĴƒyöµšĴ) Ö şM ž°Ö’Ħ…Ĵ2RpÎsÚfô›Î?úI¤E¨şâÛ’’Y0ò:NğŬnŻ´‚à„‰Â{î˙ägŸ|ü+żr˙Î Ĥ)!·â€üMĉXŠŠL?ĠEÛğ k¨”Ò0#¨ĴÊtċĝb)–İŠ ÌLšn–[65€Q‰Ĥ›˘ôhöÊ9e”Z†ÍÜc qBšlç ĵŭ#¸ô×߄ƒĵ˜žòù;K›ĞoÄQtûpx;Š˘ŭ8Ž0Äq<–nK)•!Ópk˘Şéš$ŬïĤ2z7Ş::&—a˜Lù÷4VİZ5Í&^ĴĤtvH­µ´ ”$Iù?jµZ?IŽTšĝ~z Nĵû­ožú¤X=÷iîe‰Îš9‚Ñf|"ŽwnÏhzsE5Œ€Ô™Š$ *5 S Ré,[ÉZöd7+gÌŞv³!YVpyĊE‡Eš{êZ£m—§èĉÂ)ÇièlÖĜ^Qy×`5ċ"mûHĞë‰ÙÙtyt• Ç·}¤ħ­T…ĥĞ£vâĴƒêJ'=1Î9/Jĵ;KK'ӃÓ}î‹O|ü—ġ)ċ8ÖaHhsPʎÔĴRVĴê*‹ötġB…€½ñ X£˘•˜²QêĴ^TŒšúAS•Qm•S ŬtÑì<#˜4Uë° Ç ”{|e&!éŜ½ù·Û˙ô×f]…7Ziż!xk8܎Âp/Œƒ(˘0Ž|˜U‘Ş€ÎĴê¨"2súG@ĠÜ'†;Y%áğüù,Ġ]+1ŻRŞğ.MƒÈÁ4|UŜ3Ĥµ6V>.'SĥZ­0MÓašĤGRÊÀ ÷ äúÎK;\Ŭ~lsù‘¨³ĵ*EÌX;FÙ·›!0mĈv_uNáġYÁdŞ!‰ÈDƒ–&cWXV•evA˜%Ï"³#dƒû(WëY_İDÏgm6i’”[Ì<3ÖĊ"7èĵmj֖Ċû"CPJ!+$ëĞQúÎĤ/˘`ä¸-›Ä!Çjh:ż~˘D 3E Uŝš1Ĉ|ßç­VËk·ÛŬN··Ni²yò‘ÇžxüKżLçÂŝĊƒ!%Đ´)%Ş:Ċ9ÂñĠÑ̳tîP…×ĠĊĠÌTjlQŽÚF%ލšg4g µıïE3 E{˙úžYñ Ó@ïĦTÏYœŽ Î@è˜}çE¸ĝçŒŜεƒû:­7Ĝ;ñht+Š˘0 ˘(:Š˘hdĞ˘Ä²ÊÂË7Ż:"(żÇİŒŽ§˘›Eǽ@Zôçï%Nú8ñ&‰/›!‚03À)WÂ˜Ž†áut^!ÒCi*“$I­˜e'É ´ú-İ›~¸Û•ŭ·n=<ĵœ{âŝGÉ0Mj&#Ûû1hMSgĜˆX* Ò@IH"Rjk_4q̆dıulÈ­G1—Ó1ğ ¤\(ĊÈVL“@ÉɋšÛ áÔµ™ƒ”NrĠq<?×҅Œù"“ċĵĦ” şk׃ı˛;Œg´ëş<Ž&ÇïĤŸˆ ižµÉTóÔĤrÇqD^§ÓiA°Új·Oêч>û…'ïûÌ6o"ڕ„<§ĈĴġH–Ŭ6ÉgÉÁHC“Ŝ–ÊQ!jĵ.Áµ;žcKŒŠ"‰ XR£˘`Z)·À|PMž54ŽˆfĴŽU†ÂóK]–¸jî2ˆvn˜ŝù³ŝ÷ŝI›ärÇMšl‡q|k4íÇq|EÑ H)•¤išj­UÁMa5ÑsózF?‚c‚ÒÑ+:îcà$hĜ›ÊĈp‘ŝƒiçVB°ş‘UPj+OlĊË4’@;ZúRWñŜŝŬ¸ŭöéîÚÉÌ˘Gg”˜RċĝÊû7y dï“Ä ’HCš(ڌŭäŠĴJnĈŞ‹g+,ü m4…5 ÛŜ‘™lâ°P#2˜„YŽM† ßñ:Tĵi24›'à3ĥ§˘T¸hnŒ¤ ú@&bħî²·ğÂq+lpc‰u˜GŬ~ òoñ€Ñ"ÊĝdÎİ:ß÷vğA°Ô[]Û omüĜŻüĉSOŝü׃+ĦZ—µ‘rkùbŒ8ŽûXx³s Á’ê­*h IJaÑ75~ZEğñż­‘]W˘ DĈ÷Ğ“ĉžQ]eÔ¸’6ÌĦ5œ€G˜Šèê‹˙oŭċ3÷ĉ­3ğ(8;‘rk8îEQt`ûD£˘„ğ š›DfO=Wüaq; w Bô>\?°8Ìú~ŬuFSN.@tê(=Vó˜ìÀd²è,#Ñşĥ'išFi*n[ -ûÎNÒïĞÑC·Oo._x’8oƒD£!‰ ÒHBĤ S ”‹ì ÏdSŠ pOS,A.ñ“’–ÎAÉ`FÛċ˘U dšÎi:‡hà8¸É–SĤÀ¨”˘\hâo™ƒQĦ2"ëú0uİÛE 9‚N$2· ‰·ĥ2ÁɖˆZĦúıÚ.MS ³UvuÚ?Ö*ğESÇ'¨ëşÜRuAËA§{29Ĝğçîñ“{nekсA&`˘>!˜èòħù·ٝV*£bb°lœZ(˘:ׅz02@ġ|Ñ; œAӕż5ôjê*ĴFğĦreTĵ3Ù+ˍç;HÁ€“Ĥ½‹ŻÀ›ö‡ŒŬxkg¤—‚ ġf˜$[Gŭŝ^Fûa8:*XŭÈŒ*€ón*#(|`1·€fŸ:¨Ğb½‰3i@Üİ%Cì <§êçUŞs„`jJp† ¢ aĈŜfŒĦ$It!Â*UJĈRÉ(‘AĜÓf¸Ĥ_?q˙áƒáŜŭüžçs–( e˜‚Ñdj€Œ)ÄV 0ÖÜK­£ñÉ`ü`> ›ŭ˜ċ1†cê Îˁ‰²X ,Pt“³ÍLÙ§äcê.˙8ĤélŸË4€Qŝäm˜ H‰ĴŬ£ÈYóC.-sì í<֜1Ĉ´ÖzĈF£ï35}] JÖIĜi·Û~ĞĠêuW×Nż³ùÄżùͧûìç/Ä…}@`YĥII·?­ ÑöW›âÉP4M,íĠ¨p¨·‚J.4TFu' ³zF5ĵ5,u•Q­j|–=‘E7d,›ċr€ˆ.~ûŻqçï˙‚ܽ­·Ö}÷ &ĕŭ~{4íGQx`Ğ˘(MÓ$§çħBú@ÔB‹ôfÒ,۟&€:nĊCÇĵ˙"×½@›ĜXĊzNO‰UËT„|8ċ÷Íż&"2J)“ȲŠIjbİtÒS:ZQW" ÷˘£‡w–xpš<e²Œ"[ÙC'Œòïçŭ›Ĵ™šíX3 "ğyƒħěĴ{ÉĝEĠi/RgPŬjbÊC²…|S´*£zµ­!@ä@àqF‰XÂ_Z¸½$¸Çñ\×6òžÙž.Öĵxéƒê!͵½/xĠıívğŬév×QÉ͓<ŝĜ“_ú…ÇÄYçÊŝÀ¤Ä+Fa÷Y3­ä…~‚ĊènSµ!İÄBÀ¨˜šGIŒWÇ\mgŸSöA4 ĵ£&ú­AMWZ9K*!˜Š@¨Ì3T߀; šşHîú²’Ÿqro‹^ûó˙Œ£—^ŒÚGğחzŻGIrŭp˙h' Ŭp4:ŠlUd{E 2IiîÀ]HEe5€@³ó4šTr³„ ĉî ŬI‘ğY h½0?҂(žŞÓU9Vĝĵ LTP”ÇZi­ÊÜŬS”TZ%İ6ñ Üñ[q(âŝC;kOoˆċ €A›HiĴû½ĞÊ*êUc%ÁÚ ‘Ħqo5§âXNĠÙW  8îÍÒlCĜ"Ș²Xig{KÔ´ĞDkş Œ” Áé,ŻFipÂá•8“;Ž0VRdí#½/ $ŜG‚{G ¸‚ùïívjµVÚËË'­g˙ĈżûĜĉcOŬÚWÄ2Pù2‘%”¤ÖÊNnŽİğ\ì9vĝ4î'ž-sħ#>'=ĦqueĤœÀ ••> ÎĜwWWΕ‘İ,Ÿf÷ŒŠ‰²U.Ğéò)óŒž`žh4íżñ^ù‹˙Ġ•í›ĝÍÎòÒЇŭŝÍÁp¸…á~8ġGaJ)ӂhA7€PÓ|QÓàkSE0߃ÎÌXĜĞUQS•´ˆÈà£r@…3*§:ZCTé<,ÌĴžUŞĞ"…—?FD”9I‘&"e]ĈS­TŞL7](>ƒo ҏmËĝĴ<€œ/‘5Pj7˙ ʳ‹‚QáÉhğ dòîl‹Èl$:o@Y ĤqœÎŒ8Y$°8*[ş s ÁÒLU!‚†pÎâ÷Š·ik³;HƒÍ6.œ@árÎyM¤94Pw¸‹‘¤ Ĉ''"²œŞkAŻŬ[ڌwnŻß˙…/?ù Ÿ:?òÛ°½{ h2c÷_ÛĜLÊĜüÌWĥ™ÈÀŒ‡:óÄ<²Nĥ1Ċ"B…v3ĊJŠJsH­:UĵµŞ4"Ġ§ÓŬ²‰êwLPjvÖ­°4ŭĜ…ˆr,žÄXĥK!´Ŝ[˜ÑtÂuAGGôÖżüî~û݈^şvv÷šÖŜÛ{û·Âpt{4Z۟XJ™¤Ü:ŻŽ* ¤áxJşEĞ!Z€fk+ÌŞ’>ìêèN6ĵVE¨{ ‹˙žÁ´o^]%Uŭ~Œ¨ÒO*Òxd%â6Ĝ°ĠĈiL7퐧èbÈTœlËté&ü5†H‚ežrZÛÍaÊXŒ*LІlÎh━’ĈŒ‘aˆ i2ó4ŜèÙu(U°zĦSÙôxlD8N—­Òxg¨ĦIİ–èĥ–(ĞŜ@{+ë´ıĉ6Bc,ĠZ/jôcW!5UF0C̀ëòVĞċÙħâyŜ&0|àİŻŭÊÎÉ3ŝ[GCĈÈuĝfŞŞ¨HÚLh.f-hı;„²†ß´uN}ĊBSğ“b˙İx‚Q efĤ›Şçdém.™DVŭ·Š^¨äêH*S¤éL!Ċ0S! LH÷·à­żŭsÜû—żIƒƒíKg6Oĵr4è_·F£Ñn†‡a†I’ÄRÊԊš*£bU¤ D‹äÍëġ4ġŽ |HÖ(êİŞĴĞglè3UÁÉ@½İ+ÖPvĊÊİê€i Py£”’òİZcŒ2Z+2Z*Cò”y+ĉ:In™ôÁhéQ—{ëÀ's 'ğĵK0Ê7~T£Ü÷Ža.Œ"(şz#‘$šTE€`ŠMy[I…>ÒxXÖÎ"Q1K­Ù\\„ Œ6àQÊŒxw‰[ĉ's˙h‚…PħzĠGz_@IÜaj˘6AÉ:2äB†ÎòÊĉèÖÖĈóßĝ_Ÿ>ùà#75À~jP MGĴ›uġ bH^· Ġírá]ŸôŽ&%4VÀ+`T|ˆzğ"ޏ ˜k9ùğİv8ċ°_” Ʉ ˜à \A£ëWòûcüàĊŝ†Šß\ÚÜ|igo÷V†ÛaîF£~†#)´Ay²„fİêêœğ•t7UCĤŽq†¨á§ˆİ:Ġ]¨Wóžê†JċT}ŬLgFĈ+çĞ€RvıCVì`ò Ĉ˜´éê s-qM’ÜTÉ£Ġ'[œDnKóžÀh|²ċˆ]^x˜{Y—ĴŸ”!Hĥ˙+(˙*à˜ƒU.ô’óKaಌ ;Oc²f…V 5 }25 IDATġ6–‡éġ“]Ž…Ór]×)­b 5›Œ÷ĥBEÄ T÷}ßít:~·Û]êöz'].ÎŻœ>ûñO˙îï?ƒ'Ïúo„”"BfżNĤÒ癭ŸkĠrŠ­,`¨:w—y£šÖš˜ïĈrżĉ RÓŝʍÍY[ŭúfBCRŬŜ˜á$VÜàNƒ·„—ŝëÂè÷îġŬ2Á_ÚÛÛğ…áÖ`0Ĝ‡GQÒ4•Rİġ Ğ£jµd¤ìš@hQznĦ~÷x—}àE~>äçÉòĉ{ –`‘I[‡x…@2AÇ,S8èҀ$Àr„‹n€L8Dš²ħşqnÊbg5ĈFˆıb?–&‚ĤşÍóo LÑġTÙ%ûٓ‹ÄLÔĵµŬR?f“I óP˜÷“í£„ïĊ2M†I’ÄI’(DlêÛÖŭċïğ î0AÍİħ‡Ä9çžç‰Vv,µ:Ŭ Ġ?<ŭñ˙Ÿéž>×½}’QcDx3MmĤÌ´4ŭŜ™ŽÛ ázDó/(ᖞÏxˆm O \2ÀÑË߁ßú/š^zëÓ'wëöíëIŬ ·G£ÑĦí%J)UÓ/:NU´HˆŜ"”ÎŬjè£S5çu§šŬ·†²äğ :u”ŻéU‘1†¤”h×CYÜ0-™yó²adžŜ!³†Á`ž& wŸWJÇ£âŜòì#+`À‚p(”ÍŒžħp9m>YŸÛTÊMš˘‡f€N<"”Ô¨ÑĠZï âî—^ \×u9ç šƒRĦRP˜÷Ğ:ş€„sxçĈêÈu]ßjµ:~+XC)7/|ĉ Oz‘Ġ›àÀPĈ€ LÁ2£é¨V$ĤiĠ˘ú;3ĉzŞ3v4Ç]ĦĉD£y;1S_Vĵŝu rġ–_k–ĤcŒ€ğ¤ŭ]Ĝzño`ûoŝĞìġwß8yrû7onßLâhk8îÚ~Q˜ĤibŒIĉ‹šúDu~tEjN7TFpŒÊè.}tŞĤ:JoÑ£hĈÏfTFĵ†ÊƒÂG0Ĉ¤RʜˇH‰Ìuàĵd8áÓ7‰o0˜€4i{ş2,$Î.Fġ&úİhĴj‡ôÇÎö2À?ĤİŒŞÚEÁ¨Ĝ‹â ŒNy ”³ô։5ç¨fFĞçy"Š˘êsŻĉÍä™;yr½ßsHuċ:ĜêH´Z­À÷ŭeÏóNpÒg˙ßxƒ¸=L VxÖ¸ÏAC•Š`^…BóŞĞšŝRMWKN=Ìì¤×ĵÀŸRš_]•^‡×ÉcääÁm¸ò·ß„½o˙÷ä¤_é./ŭÖö­›qVíŽF£~ —Íy˜:zŒšzE³â›Gtˆ~ĵzM‹TKù8 ”ê*ĤİġÇRx˜$‰½$h\(1t ^FìémŭÔ:ĥ6ÀE°Y¤ß%­füûĈŠ;,ÌJŽí…ĴêŽò^Ra€İ8™XY#JáĦÔ FeiM@ ‘·:Ê~¤ŭÓ;ÈyG‘÷‘êÜŜqeû‘ìš§şKb;wä·ÛíĥïûkŒÌĈżož^>{néŞbİ,ħq’–8€ ùtš^ Íxé¨&ó›êhşĈʈĉV_ÒpjŸQ+‚ 9@\Ó3B;.ÎËfŻux.ŭ÷˙ßùÛè Ĥ/y÷ÒÎîŜÍ(mÙ~Q?,8/TŞ!UC×-Ò/şŬ] úñì5Ġ.4ZU皚eĈ½ "B­5$I2)Tˆh î)xEw?vK‡/8­Li MÁ1áx`T]|ŠâĞqġƒ5M4œg`Ğ(3ġ’N5ÀK4?5]5cùË “M= ùʲëĞ‚Sà8Žïşë8·€d@İşż/ $Ŝ§“³1èËqœquäyŜ²ş›ïàçñ~òv0L@Ra77Ş#oêLVĦ™Ĥ£ù}žĉʈzÌŞBŻY¨‰Fn0„Ĵތ@–íÀ8up‹.ŝĠŸ`ĝŬž˘ô‡œá+û[áhts0ìF£\I'1)Ô Žk”zùö˘4ŬŬǘ ²pÑ šżÇ*ĠtŝïTC£-(É8ŽĦ0‰Ë|w½Sü‡ž!|r§ġXÇANDÇ&ĴïŒfxċMŞŞ<áĴj2%ßğìùáÄ$òŒ$jĜ™‰Á^>Hİ ´” ÑċvöUïĴÇ÷/& ÇqlĴù,u´yżŞ˘âñ^琙;*}³´´ÔîġzĞ-ß?ûŝ}|í×>wú™N½­Ĥ*+ai’ŽĜtÊVAĦi ¨~6‰f<îôQi×ÑP­Ô Ħ.œ@͕ÑÌw½&ví ÍäYedú·éGßüOïۃS¨~ ^>ê÷Żƒ›ƒÁ`φéċ`$çPtóâĈSŬ˘Ÿìĝ`1ïÀ:_Ĥ|NáĦ1Ĉ "qÎ:žÓÁÄéñ”§˘ ħë1×%҈ġŽ†ï Œš×Â˜H1Ö3ĊaXS˜9ÊÖ 3ÍUÁ(ç,•HÀ8rˆıo–pôN˘¨Żd:J’$’RJ"šw½6ѵ:e7ïd›ê#ı›WG-Ïó–×Ŭp=˙Ü=_ĝù{áâáPfd&ÁXE?’êIÒÔ3ŞĞŒĉ*Ôj+£réB ôħ•25żˆHzE-VİÈ ‹2‘2&è[ôú7˙Êüs˙$Èï3˘WŽú7F£áöp8܇#k”ÔĜ5 żÎsë>NDÄ"TŬŬÇżbZ„Ĉ+yOİx½óŠWĦ€)$"²$I’4MGZĤ„‚0mġîĵığwĉiïí#Ç%­ qÌŸŒê.uŞqk¨üçÑ¸:›Ĝi)QĝioêÖòıl)p]×s]×AÄ&µ6TFé9¤&gĜ1HqÎÑ÷}Ç÷ŭ@pŜó|ŭ/}ġ wyµġNj@šÜPpšŠš58ZğÂ5T@4?h(*ğ™ĉ%óxi°dšÀf¨ġš+#(Şé€9Ôѽñ—‚ê'@ŝ€yġ°?¸6n ‡ŭÑh4,xÒ)˜/^PŜ%ŬwĞ˘ŸN`šGUïË YÁUì7™ ­d ˙Ö "1Ĉˆ1FˆŒsFF#o-‹G>ŝ||Ĝ½ġW¨g"élFi0šßŒ>6ÁLAĊ1Á¨ş^YŸi ˆĜjĝµ! -„óXóŠP]ŠûÚGbïs™>aE‘s΄Âq3 ˜×Z÷çzáˆ8:ˏ·2ïr\o2*XiT³‹rU^ñĵĦê”l܋16Ë êúêΙħ×TSĤn·Ŝj:šÑûʟOiċ§ CÎX6g„‚ìÓĊżú/˜|ïÛ£ Ÿyċ°?¸6 n ƒŭáp8ˆ8²`$kŞ˘şAó0ìxĠD[2 ‚úp=¨üĤFcšÎ½˘U2p‡éÒ_˙F˙úцŠÏ^=êúƒ[ƒÁ`o8 ’$‰*žtŞFކkrd˜¨›%í D?Ŭ4Ŝq@İzN5ı›JeĥMàµÛíNoeuEĈ£µŸûì=÷ŝ×Î~ïz„ßğ|DHX·û £Òî8ëCİŬèà¤w ƒMO°Y‡M,]4e×µe>’€Ô¤_[%0†,µî­ï=÷•OŝÙÀà–T#M:ŻpȌµúÔ`ÂSŽž¨XlTИDŠ×dT—?R­zLBĊîˆLÓV‘Ĥž³İŝ4m›[ĦÂ.`û;˙£ïüm²!G?p^éFׇáöp8Ĝ³4]¤”’ŒfUDó(ĵy ĊĵŞèîq·Zš×gœµÑiü9ç<ÏcívÛët:íµëi˙`ŭòGĝk] öííÖ„Ldĉ?Y4ó?†`TŒ@@d4p`@˘GĤ½äqêävŽ8B³Í²aĈ˙ž‰ßYÈ*™8Ü÷|Ïoù-á8­(•´ġâ?íż}ı‹AWÖ× iĴ„.–ŞOްÑf–`ai÷TEMe4ŭĤOs–€LSI@³-Œjúic5³áz €qP!ô_û.\˙Ë?ÖñÑ÷[ _êF×ŭŝö`0Ĝ° F‹Ž£ĤĞ[Pà.Ŭ=\GĉÇİW£ÒЁŸÀsòÀÏn·Û[Y];ÁH:ußCO|üĞżŭì`ċ‘îûŝMÚ=LQ€IuşĝI#û²œŝıpȐDŬĈü`[)µ£•:JÓdÇq"Ô°xÙe9Ŝ+ - J 2˙:žï0•²àßŜó÷n…âpOn^_ÚŬŬñœNğ++cLÖh´SÏĴĉM­›=jž Ş”5ġ•QóI4ġ[АÀ Q#­ĞïSĠ ½â¤âd 29§Q0¸ĝ¸ú_˙PŻ v^ 8ûa4ş: n ‡ŬQFÓċÑóúE³ŒR™1ş Fw;ÂŞ4Ĵ5ĴJÑĈw]×iµŻ×ëözKK›íNç´ïù=ûKżŭœ÷§OüÍ+{ôÖö…&ħËĴKküO ċ;y6yġ8 €Ü„Ĵ£n}ŠŻIúRĤƒ0 4MÔ§6Ï˘_ü‰1Ĉ8ÏĵHËkĵí9G=Îv(wĥexóFgwoÏe­6öÖV ”ÖH†ĈUœp&s‹şŭ˙ԃİT^3ÔtùġĠèŠ `Ñ †üklĴ²Ĥ[ó ïìêCà<›7]~üéRw÷Ĉë˞ĝÁ`4şÚï÷s; aAڝ;.Ì# ³£ĈߋC÷Ŭîħh•Ä*ë ›ñ9CDĉyžÓjµÜn·Ûév:ëĞ'ÎÈáѽÏ~ġ7Ÿ?ù‰ŻŬ˙Ïï$½7÷€I@J4@îegÇŒèĝ`”ÓL¨tƒ(|@†Ì Ż&+lp%•ĉHÉtĤiÇqZ33ġ;ÖCú@i<5m·ĝF)-µÑ Qpĥż$½ôĉġ0Ùıİ£Û7[ûñ|ì‘pPF#Ĝì”NÖV·7S =tmiŞ’ršo1T— “WÄEOĞü.5ŬDûZ–v×NžQ}6ŽleÄáĠ‹pùO˙/ĥŜşĵŜöĜ\ 7†ƒÁŜp8ìW óĵéfÑt³"ĈïVEw;Hu`„5àĊ`$„à­VËítğn·ğĥvâԙèàöÙ'?÷ĠçúÒo<ŝòÇ˙ŝ‡[¤B& eĞ#]ç4‡‰z×`ïŒèĝ`TĜ-“Ç á0=¸N÷ˆËĦ‚C­d?I’0Š˘ÔzX6…ġ-â¸ñ‘¤"ÏËìÔ4j­A)Eiš*­”ÒZ§İÖI˘) î-Ëx/ıq5ŬĵÑîm˙Àў‡âĥÇ4‰ÁĈċ/;`ċ}™Ê+*,ŝ  •4­Şa:Ú+`T8TßI:!˜+ Úz .˙ùğôÚÍ3ŬÖwŽŒ†ëƒÁ`7#ëÀPW)hVÍUoÍ1wÁèîñ~THUzÉ †ı+<Ïs{½^ğÛéĴĴoœR£Áéó=ŭÌÇù~ĉ*lĥġŭ-38’ÌÑFëìşW5sïÓk=?˙A€‘}ì1½Â€ FĈ(4ñ>žäğ·ŒÒ;JÉ£$™ÛGšGß½'€şÓ˘†y@Ċˆ´Ö¨”‚4MRJË4•JÊħJ'ħ6aÀÙîŞNvċwâŝġw ÜÛñ†ƒ£\ƒ%⎭µm15j4E—Ák*£YyFÍħ8âĴUHĵ:‹ÉšÊhâĜ0q^ż ÁñH÷oÂ;ġ' ^ŭ˙vïíµŝµßï_G£ë6ϨÇñHJ™X0Ò3ÀHÁìY"€fŬ]0ş{Ü)@jŞŒĜ 0BDäA¸N'èġzËË++']GœíĴ>ùÂŻ˙ğO—XŝÖĞğ´½3Whe€´ÏyO ċ[Ĉ9Gbȝ¸£ĞJëC™Ĥƒ$I˘$I6ÜÑëüŭRÙÁ<úÎĥRÒRJ£”R2MS­Tb”J“Xé°ĊqwƒäžıñNrpí ‹÷½8Œ„q\ zKIJÉÁd½ĉ'gD}|y/W99ĉ›şÒ%7QÓŭ˙ì½[Ż,Ivö­ˆÌĴŞ}=§§{zî™áœĦH $Z†$d² ۀA†ûE/ò/ñ›ŝ‚_eÉlƒCJ&)‰"‡#ŜĉÖ=Íıôíœ>}{ïÚUY™kù!"³"##³jŸ³Ïé}ş3€½ë–••ıĝÖúb-Ù.ZñtYĠ–Ïu²{väVš²Yêò Ŝ˙½˙üûËŻĉ˙ñòbùĉêòòŬóóó{Ëċòĵ,ËÏÚmÏÔmGXQJÄ0ôGMíÁht2›rĠóùĵ8>>^œœœœżv|rëKbë_ú›˙Í?ŝÏg_ŭÏŝxëŬ3ÒVÀ•ñ`$mn¸— ŒpU0êôĥëB‚€ò‘Ġğġ§ÔÙO+gu]]”eıŜl6ÛnßÉ×âş{€´/kRà]xR×µc¸kSğ5uYY[­kğškziİû?ß<üÙ[Yy~63U™Ù<§ùщ¨,s™}۔ Ra½ ĜE9Ûö1Ħ£˘Ĵg”Ÿŝé€ÂNS­=ËA\á˙ĝoñáïŝ?Ġ—Tŭ}³)ż·\.ï\.—÷...Ż×ëËŞŞ6Ĉ˜ĦĊ­v€òÓû'Zœ€hj×á‹]ŝjˆEĦONNĉ‹Ž_;ıŭÊêĠòĞżŝ÷˙ĞżŭĊżġ_ŝâÏê?q_xD İ­+‚É)oÊËFrU0Š2‰ğŬZdYÊs˜ó÷ùóúŝۛšŸ˜ş:ĞŞjY–eíËQ웭˙Ĉ1$ìxSïG ïÊcŒßêşL]—lÍzcìfU›ġŒà€éÎÏĞ{?y++—…5uf³‚f‡‡:wLƒ†‡ĈKœŞ(=ĥòêĥÏ2‘Ü-ijóÓiMröĉŸÓßŝ—üʓğoúğŸœ½żş\6™ğ—ÒЉ’Œ§ŭ‰ÁhlaëĊĤöĵÀhÌfè†ùuÙáááìäääèĝĝĝS'·n7ë_ĝòŻŭĈoüú?úÇßúŜ<˙ŭïߓġʒ Ĝx§,ûÇŒ:½.€RPY.“Y?ҟÑ÷?°Ĉœm6›OF;Hc÷ŭS³çHc ;XÀÄĈëpİĴİ7bíş²ĥ\[𚑆1’+<3ıÔñşÈħzï't÷wŝ³ûĊÓïÜĝĝ½ġêòŭ@ÄPÜvûÖ1šÀhjÏÛU‡3jRžçÙbħ(|)›ÛGÇǟË5}ùôӟŭġ˙ô7˙éß~ǜŝö÷ÈيòŒmU×ÎċçĤğ`ÔÔ£%‘@SEġ½ò@.ßݍyR×ġEY–ċf³İ6xŽq¤ë¤¤Üz„i'DÌÌN„gıvmcLëÚÚrmìz&üuİîé{ïš;oüpvqqžgZ)ÉgÈçsW‚Áú5LMŒ)HÉŜ€SĝŜh=£x0É3ÚƒpӅìÚg[B>ŸĦz|ïüÎżDù½ï<ĝĊ[‡|˙áŸmÖëFQwĥÙl6ÑÂ×;šÀhj/;jEĞnħXä'''‹ÓÓÓÓ£££Ï.‹/Ïfó_ŝ›˙?ù{ĞÓŻĵò;oœáƒû+ÒĈ‚k3’ĜñÉ£pQ£Ò(Ë ËwĝÓúÉOkOêş>/ËrµÙlê8RÂ×y³bHğÀĜ]w`LˆŒÉXk=c2eLk×ıƒOÛòC}˙}{çG?œ=ı8+òyĦÏ g3h­ĥ4ĥ$İ?.ĥ †tÑFÙ½yŒĥrv·ÊşÈ!ċRŜŭwżEË?ŝ½ËŻô——Ë­–Ë÷/..î_\\<)Ër]UU(êöIˆĥ ŒĤöQÒN!)FsFŸ^,_Ê´ŝúŻ˙ƒ˙öï|?ûÂﵤ·Ŝ9W.f$F‚jŸp0j{ßyˆ”RPE†zy‡˜Ŭ˙ymì#cÌ“ŞŞVëġzc­½JY™gvÛékTc9¨°ƒ•3öıEE˜YĥdŒİ1k̚­]cËÒĜUfÍ×ìú^v˙ŽÜùÑ÷gççùì`Fjĥ²ÜIÉQwñ.1Šò+$/j"P€#4ʑ%½Ş´!°âËIè\CÁʇŝ‡tŝß6Ż­ż™˙ôìüüÎċċċÊ²ĵĴŞŞ²ÖÖN t•RMí£t× Şêf³Y~zz:ó"†WTäù/~é×ŝĈßú•ĝ?ŭêx·Rß}ë1êµmŒ$ŸYv|˙(Áˆ„P×͌şçBYĉ*œ—gú5z@ñĉcÌy]×Ëġz]>Cé…3¤],gß,°İj„C',ì[Lu]—Öš’­Y[ËĞÚr™³yôj½şĞܑ÷ôƒƒ‡çó£Êg ˆÎ]‰ïNm˘FrMƒÌ(#ÙFI5KTâ"î eR„LtžaùöéÁ˙÷!÷/òÚáâ;?yuyyNjE]…Ŭv-|Àhj7–E‘'''G§§§Ż,>_äù×^ùܗ˙êßĝÍú·÷Ħäżûƒ‡(—¨6NIÇpŞş8ċ0Óz&0‚Żä™A„@¨hn>4GXm­y\UġyY–ë²,k¤óÚ=—4Bú9 Ĵ]Ôm/WŬ#Ĝ0ĤFĝ`êşêşŜXkJkÌ1fU[ğÊÙJ J"Â""^ü`êşŜc*cLÉÖ­1+ËvóèSġċ³wùî[?<ĵ˙Q8>ÁÁÑĴR€H\Ħ;ñċÀ·‡ħ+‹ĝXîğTĵĦ„‹¤]×hl)o˙Ûß"û½?:ûœ2ħZ]ı\.ßżĵĵüpı\ž­×ëµ1Ĥbĉ}j]ìĝFSû()”z“ÖZĉ·nŬZœžžŜ:>:~½È²/žœ~[˙ġ?ŝüÚ7^ŭö÷Ÿàî½%dcZ Vĥ`ÔĞ DMħíß'ŒÂ,5P•ċÈ´ÂúünöĊìŜÛÌü°6ĉ‰O#Tc,†óÚ]kI_óà ŻË€í,äċA‰Ĉd1˙·6Ĉ˜íŠ­ıÔuġĝ•êòŜìáöîptïÁüàÖİžÀŝbyĤċËkRpÈÈíÀaiw3Ĝ]ŭ,ÍҊ@É7ŝŒ–ÛöäÉo.ŝüñÙù{ĞËċ½ċrùdµZ­ö1ö‹M`4µ F)V„ĜU§µVÙñññüÖ­[ÇGGǟ.òìKGGżò•ßĝğçġżöĈĥá IDATżúŻß<[w.`V5Pˆq£v½%ĵIC5hR²Ĝàè¤ç×yùÀÈu‰gRŞ5Cĥ:WŻŞ‡5—wİù÷z³Ùì'hxf;ĦŸzïŞn9ìp%ġ^7l‰™7^]×ueŒÙXk×ĈÚ53_Š5—z³~rZ-ïÏŜİïŭäğĉ‹£9ıu Dv%Dˆ ìÒöâúIcÌh+1ílâ]an)@ÔÖm§s˜GïÉ{żġÏİxçÇ?ûôB˙Éó‹wV—Ë...7‹_ƒ} WO`4µ˜ şêˆ\­µ>99)nß}pttt{ħ˜6ÏóŻĉëċŻ˙ê?ú_ŝúż³VôĈ#ԗĜXżU@â2âIzË˙Ż;Ĵ 1¨f$/7ıŠ á„XAtÒB³êC>ĈÙÏ­5kçĥ ËQìğ`ŝ#Y‹à³/S˘+°;•E_²ž1µĜdŒ)1emíZ˜—ŠíEV•OŽVfî˜?ŭññŭ'Oòƒ[·d~x &MbmëCD@İşĴċw’aİ’ĉFQEÚ,ù'ßŝ—J½ù§÷?£íŸŻÖċ[çË;ˋóK—4µdĉ:ħŜh7ŬUÀhjSû(Ŭuêàà@‡‡Gǧ·^­ĞÍç^ŭÂ×ñŸüw˙äżĝñ“Ĵĝ×?x€re€•ƒ´ŜzÚۛJùz@Ĝ‚Nc֕êÖĞĦFŜÖ Ú-iÁƒĥÖuJÇuHÏŒ:†Ú÷é ÈĉÀĊ;xM?z[ĴyhĴ=ßl6ĞĠjU¨8’ĉA6ĒžÖEŒ/Ĉ’ĵ˜||İ]d­-+cJËĵ̘ÏóÍúlħ:{”=¸[?üé['ž<Χ·dqrhMÂMÖçÇq숚Á=µñ¤(oJ9Ò¤ˆ È2%wżûûjŭG˙ĤúTyöƒòŭÇggwV>nT–ċşë:QۈGĜѵFC`4ÓÔ^ u€‰|Ħ³ÙlĤOOOĉ'·_=ıĵ˙îá/}ŭĞ_ŝ;żùO˙ûó/½ö˙ùC>;7 Ê’(r Ê]ÑJ"/Ò˜4šœÍweB·n+ ĠvÔ+ż½ÀǓÖI;82(Ûê/ZL³œÂŭïĜw⎓ş“[ëú@>+°¸—})˙m°yPğġHUUUA9Š],éFÒ DQŻË@i—o=Àd­_Yë…cLYYğĥ"Ë\ĝlĥı<Ë/e?¨żŭ““ûOgó[·qpzÊ kŒ/ĞîO€°£„:‹•ÂÙM;‘S.Wòġ½ŸËŬo˙Ÿtr˙Ŭ7oúÏ9WŬŬċrù¸‘xÄâLŬcş].Ó ŒĤö"İWvB)ôÉ+ŻÍĠċŭâµ_ú/Żġżŝĉżğĝ·ŝü>|ïçS4„Ü’ìä–è£cQ‡˘‹9ÔlÊ2V \e Pâı‰™ßjr޳œ@™Ĵ³ ‘ŠÁ[1TÏ Ĝga҈2"ñµV2ÈɖŜ­ÀìB °ĠıM. YßħĈ<ëzY–ċ*’…OĈpagËq ÉÀñµ ÛŝàÄÁ†Ÿ7ó”ħ1¨ ŬŞ…Í6İ?öÀИı‰/eu]›Íf³)Ër=/ËĠfħ¸XÏçç‹ĊâÉñÜ~xPżG?ı§~t÷ó÷~ŝĈ—ï~ċ›ĊëġoàĝĠÏ0&c 5rqQÔ.#Š›ĝ†aQAë3ŝéżùWjñá;w_ÉĠËġú½ĠêòÁċċċY#bˆíÊÀÀ#‰°_İMíyTÇ,‰5ÍÔµ(bSJ^=ùÙŜıû{ß§oÎĊĤòYĥĥ4‡Êp "‹ Èç³#üjv5;e ÷zq"jĥ€žŬ•Ïë2_ƒ™dSCĂàM Î, Tµ6ŜBy7Ÿx°áĤ4¸/öÀĊ ĝ€àun°ĉû~<÷k$‡âQğĤ’ħ›óJA49\šżŽÇ›“Ϩ'yĤòÒÖäœcf1ĈHU^²99ĉĠ‡oß×÷ßûWżlÎŝDóOoX½IŽ6àCX΍ċıİòğÎçĴ‹yMÙLT‘Ġ˘ Ğ eëŠ•b•Ó†T>ƒ*ÀìJ-@‹c¨âTB-N„²9ÔÑm¨âÀ9C,CĴ%ÀE,İ5ĥûâ,ÎÚx° ˆôV†ˆ3䁎Û÷ÄÊVÁÒÖ{ÛÊԝKlnÛÒ×2ÍÊ鸟ÑȎ^ǓġñíÏ+}œgú /Šùl6˲,SšÍ(óyfPʞÇxÂx* ĦíS5”RĴ+dO-û‰ÀI€T L\×5[këjÛÖ³²\nĉ‹‹u9?_,ç'óù‡‡îĵğ|tïËċŬwżèŬ7?{˙Ëß,^ûĈ·pòúgĜTLġĤráJ$ePÈe§ÚĝŞĝLŜÊ÷,Oŝä÷éġêâ­á'.–÷ÊġêĦŻüşöĵ÷ÉÜ}UEŬFSû¨Üv;›1›²´—yQâìüh‘˙ĵ8şŭXgÙÉĦRǤԁ",ˆ¨PJċ™UĈcĈ˜ym×sĉ˙ħvĈ5gÖraĴÍÙÚÌ0 è,Żİ8| ċsÑ³Ì Ï.Ğ\UĴô •U$ş€Êf â4;€ÊŽyċ âŞXˆÊ@ف(€°L\y;3„b LRhփ–Ò\Ĵ8˘"—\•iwsZq ÷Éş^´ÍúĊ­|ğW‰´™ ‡1iMûR<âOċ–öĝ€Šü–ÎôQ–e‹Ü5µÙlšÉ=/PʞӀ“DÌ(5e˜Rû ‰żsêÓ w_ŠA…ÀÄÌĴ|F"S×uUUĠf³ÙĴç›ùeU–ċbqĥ˜/ÎNó{GŜ÷âáŬ_Xż÷óÏ?z÷Í×ŭÂ7ŠÛżòWqüİO³µBġĤ"fñŝèm!°ŜôƒCe ĵz"ïŭûßQ'OîŬ=„}sUnŜ[Ż×WĞU#bh*żĤ@HpġġFMíFQ”Œ1\–QD•e, [?²šh´>ƒP@PQ PD™Ò*WJeZİ\‘ÊE‘)EıR*Sî½,ÓJ[ĉYUÛC›Wf½ğ, KaJ›Ykrœ sV. sm-0;ÌĴ*fĴf™U³ÌPYÏÈPj*`“²T6w€•ÏAĊ1(ŸòC(5:\€ĉ‡ • Y†0“JĞCĴ…ÏĵD€ĥ^žġÑò@B R`á-{"2ϸ¸ĠÀ1#MîGÏÀĴħ°³Ûê\N?˘V'EĤçE1›EĦ÷$7Êe·[ c>C &Ñ÷ŽĦÀÔl£˘çñß05 Ğ&k­ièRY–ĞĊfsYÍËór³8›Íĉg§ó{§Oî|ĉÉ÷aġÎ_~ññğo½vö•oäG_û&Ž_y]lͰĤ&˜ı›Ÿ qVżâÁ÷żCġ›V}†ë1ó;——÷×ĞĠġz½télXÛ(UXï*덒ä}²•Sğ‰­k`1UıÙp–e&˲•ÖşPJċr"ʈ('2ˆd¤TADî}ĝGE@iż½ûSJçZkR”eZ+”že:_Ìr­•Ö™Ö)•eZeÉÖµ=ĥyU— ËĞÂX.Lm k-˜E×Ĉĉ˘TÎj–[U˜eYA³#UħΑ˘f$[À¨LAÏ@jè9T> @Í Í (•@ċı¸…żpKRÀ€ueÙ3 {@sq1§îĠjk†}(AˆW_•YóÓóËĠċzŭÈğêJ/ñËS·oĈîĝzL 4µB '"BUUq]×ĥ,K(@­”ŞDD+2¸ ²Z)hς2”&˘L)•R µÛúÏŭŸß~û‚&RZ)·­Ê´ö_Ì´ÖJgóLi=[dJ)íšÊ´Öš€Ü;ß{À\ċ›j}~’­*3ÇĈŞMe ÎŞşÎ-SĈşÈ%[’jVE.ÙBÛlYÍëä„âÍ@YÊPÙ 3@ ÜXQhç R.‚e `Œs²I˜ŭ +vîD(%P·qöĝèT€,SȕÖYžçJkMu]ï³ôĈı잘ĈÜx)` ÒĊn:aFñ{’ĝœ`²u]××֛²ĵ\,ç›Íĉ|6ŸŸ,îrŝÁç˙ÉŬŻžŭô‡ŸŻŝëŸZí›ÙâKżˆ£[݊5 ›:$ÙĴÁw~Žĵ÷àHÌ7uŭŝjµ~°Z­ž4şHâÍ1¤1—v0¤ ˜Ĥö"m@*6³ĝ3ĥ֒µ­Ë=,à§=@)HHù? —‚<(5鉨ÙΕRJuĥÓZ+"Òä>Ȉ”"EôTó™&ˆŠHi­H)tžiEJeŻ-4)•ċ™ÖD*×ZëL+]ğ¨YóÊ,ç֞µħE]›ÜÔ&ĞŒÍEĴ.7<£ĵPVÍg4?V–f9ŠCeĠ,c='ÉÉRN˘`Ġ ĴrR*TÒH€žıçù(;„.ĉBJ e9ò\cŭèó‹Íĉ/³9.œÜBiRJÑ[ŝÌ ”}Dƒr˜™RÀo”5ú2fĤP0$瘸Ş*ë³>T 0Íçċċ|ħ8Ğ6Ġi1ŸŬZ,î²ĵ÷ÙGßŭíŻ=ŝËżĝÂĉ—żuğúêŻfù翆£Ûݏ°˘Š€‡?ĝ 9û³?’_Ê}[Ú÷–ĞĠ‡ëġêÑz½^yU]FYRDk£İŬdÀŠ'ĤŬżDDŒn,è.%Q”/0×ÉŝL€•ó˘“ò qá“ĝÇĉ3x "Z*zîAhûٖ}LLİŒ)Eî5ˆ´ò@ĉ°Ğ}˘ ­ô˘˜k}¤2­UĤ•nL˜‹eYŸ@8_W— ĥ糍13SšÌXÏş,ëŞ2SĤ%›çȏ´‡šġÂ}žúuÖ˘ˆ-ÜÉíJŠ}cHW/íòAS3mÒÀÄÀ>×Ĝ-oĊÌ\×µuëjM]–e9[ŻW‹ĊbıX,ÎŞród6Ÿ?ıu°¸óİċ‡Ÿ}ĝßŝúŭÙçßüë·ê_üU=ûü—1żġŞ Ëqyï]şû‡˙š>S-˙’xó“uYŜ-×ë‡ëġú"ÊĈ°ŻšnŸ¸ÑFS{Y\váL;üc ½$İ…ñħ¤ÉzTÚ °ˆß'Ô)0ş£5Ĵް¨ÈS&d!€µŒJi ¤I5@F-ûò.GP´ĤÌ—VJZëE1ÓZdž–ċŠHk­•VÈ.7ĉÈž×Ĥœoêċ‚í‡yı13ğ2zSÙÜĜ:ÛT&7˘´äs0Í)Ϗċòä0+sµ[o˜ù…Ĝì† Ü“Wžx°ħH‹$rñİñzŞ<ŸÓÉVUe} ĤŞŞŞMY–—‹Ey1_,žÔĠĉt6_œ,fw?µú³óí_z?ùbö+íô—Mg·^Ċ£?ú7°o˙ĝüVfŝ¸ÚÔïĴÊòŝjµ:[Ż×Ğş7Ì\¸êž6QêFSğ‰.ĵԘL• áP(l3”ÄÜğÖ³&ùú‹t/$ĥ½É6Ñ-ç)DCħš÷ÈğRSÀ…q0EJırž>fĉYLÖ4"3íöi­òŒô<Ë^9YèĈ§˜9h#H6•á³Ëċf³\Y֛òA½İ×Ĉ…Ä­Y–çf?è† ĞTJÎ$Ґ$h{§XôGO:µM+‚ ?ɲ,+Š˘˜Ïç³ù|~°888šÍ'³ùüöÉbv:/ŠÏÜGŝË.n}ĦġÚéúÇßW__¨oçĠúOח—Ÿß=;;{tqqqıÙlŞDşS² Pš§Ní&7yŒKP\ċ^‘÷wí8½#Żž-k\ƒÓB‹Tûj,`\¸—RŞq;*û˘ÈüçJmİZ³gbĴ´2”"²äjŭx½İΗĞġĊòââòüüĵ)E‘Ê•ı+lR0¤§aL1•O-œe¤Ó0,| +ó-"ÖC>ëCíyċş,ËċÁbq6?8xlރ[Ċ|öè°Èö+ĵ9ĵ{ŝàk\ĉûïËġúŝj½ż^ŻÏUŬ)ëĈŠhMmj/ `ĊcÉñ”·eWX œ_[Ë>fƒĜoĦŬÀD#ÜCšÀ4ĤžÛ'êBS{Y*THL,wÚ.EÛ¨`„ݍÒ@ŜŒ+ë0òŝUÀĜŻHçä ›„„ uĜ úòĞÒh=š}ġÄ èĈŽöÔ*t™•죉Mírîs˙>ˆ€vÁñ}g×ŝĈ~ƒžħvġá@ÈÛ³=ğâEÏĤO ßÇĞ˘Ç”ĵ;iˆĦí˘ÎûĴ~žÀhjŸ$PsıÑàÙ×ĠöĴǕzŻkïŞìg×~Ĉil+Rëˆb[„çm‹²OÀ€żŠ+/8Œ~ı ٓZ_%ÈxĠ?\'MžÚÔ>âûs¨Bôn÷Ħû*@2Àrvŭΐ{ïŞŻŸ†á\'(MŠ109³W×j{èx´9f=1óĦ‘÷BFµ‹BïZ¸ĥÏ ˜bHSû¸Ŝ›ÏjĝÇĠÓ²#<öÏ ^WeWûL\S…}m°{Ŭ£\×ĝ¤SŠİ·¸ öcEôö½“ĞnjŸ4pb1WµqWù °;şâħ_ÇĥOsû0%`·hj×dx¤çLûäŜÚwĠġUsżĝS›ÚKpoıÉä @µÏçtE[ħBïYé:Ù×.†´ËëÂ#“ék³G Ï6veßŬG’ı vÒFS›Úĝ}â(İä£4r˙È}û4àġ4v˜y[ı@ɞ`5ĉĦ™é“`÷Âğ}ûX0(&0šÚÔVOğîßç ^×ÁĵÚR“bÂŝĊ>ŻèHûQß]5JĈÖ$\u@ì:Mmj/ĈŜÑ5l+Ġ· péÎ{0È]ĥh— šĈ `ÂȀz– £ìùš&0šÚÔ½É3ÜğÏò½}ĵ'„ëĊ§íyĈ× ½€YĠô_ş~ajS›Ú‹Áè9ìóŞç·ŭyf›4ÒġÓŭJÏ8Hèş.ŝÔĤ6Ì3m÷´÷àó/zÎŭòÜċO€t½}vĠÏö•³Ĉ~jS›ÚGFυ|DÌëYûGnÂÉNíj}H×zbCS›Ú‹İ?ıáö\^ö˜€êé*LÊÀjjS›Ú‹Ħç*wžÚdà^tß^%ËĝEÄĤ6µİ]ïĴ˙*éı&Pşĉ–M]BÁiŸ’êc kbMS›Úó u*;xê{ûTşÚĐnTżŽ•TN%oŬ'IëtŬĤ6µë§}sIŽ%;cMS›ҍdFCĴHíĝüiSŸLmjS¤° 'ĜQ̔Ĥ61¤ÛŻğŞĈeÑi¤R`4]·İMízißÚdŒĞĠ(›XÒĐnȧÀ(ĊŠR€¤ö·ir1µİ]'˜ÑXì‰)M€ôR³Ĥ¨„ÔS‚ÒÔĤ6µ§cGqHĞĝž+ı>µ nS+y€D#€t•j´S›ÚÔĈA)ċ‚k€…ƒ×qüˆ÷`œ‰{bL Ŭ(ŠÁH!7R{Ó.@šÀijS{zf2 …­¸! > · ÁM€t“İ}­”ÂÁÁÍf³lħXäY–eD¤d"˘ED[k•ˆˆ(`f@‰ èq˘İMí)A‰ˆ€‰HˆˆXk-[km]×ĈZkĞŞŞ™9ĵÏ8xŒ'‡M€t£½ ìÑё>>>.Ž‹ƒƒƒ<ÏD´‹Hf­Ġ ùGÍÌ-5`&†4µİ=C‚RŞu‹ˆqXT—eY×ëuID´ÙljfĥÑ}²˘TÂÉ]7ÒÍeGDD³ÙLžž''''EQĵ’eÙ+DtBDž%)fÖx3‡Œ¨%…ì(x>µİMmŸ›Ó1"†y†T3óŞë³ĠjuĤ”zl­E]×âYhŬĝnĴş‹ÁhĤ >r ˘°X,òƒƒƒEQ·‹˘ĝBQ_ʲìÓDtJD3шÜr"‚z& ‘ëşıŸ ^×ñ½é÷<î;"3 3OĈë²%J,"kkíı1ĉ½ÇÌv³ÙĜËËKƒn)fAqIĦŻĈ›ÚH7 ZpÉó\ß~ċèÑÏrü›˙û?ûŸĠ7żġwVu–i"P$~T;àIùBAcŝ(xMäß§D½sñïùÏï‡Û~CÚ}4;"ˆ4wĥ@8ĜVÄY$üĵ˘vo]‰ŽÑq ä~`ÌÛ`qżĞ¨Ŭ™@şš(‰-K°Ï„€µÇÔàEÓ)%,îxŝĥ¸ßdfıŜ\Ġ–]gĥêM›°îâ’Ĉ{$òïğ~PóġĤ˙­@î™}ŸI0oz{2îĝŬ+ M+˙=ÊÜöBž/@Ú}JÓ7Í÷šs6ŒÓ`€üDîm"÷[Ê?ЏóÌÔöĜŭ`”ĉŠ{S8şÙw|3ÖüġÚöƒˆ€,°İ•ŭÁ_żŭ/ŝÙ|ĥ)‹˘(³,ÛÔuŬ¸ìTàĥ‹sŜMLh¤—ƒ5‘ʲ,ÓYĥyñ݃ùâ ë۟şe++ŻĉšÊ]ˆF¤@ñÔkk‡·Ÿ ÀŒHRŭò6¤ı/‘Ù Y ˆœñ ÜiŠĥĴƒ¨ËZG”4ÎĤĉNŒ…ÛŬĈb‚ùû+S>[V ŜÑN&ŭ=/›b°ŸĴ§BŜÈzö"ŝœ,ĥ³jaÏĥîĵ…Á¨<hAR¸AnŬ0§áPĈnMûğİŜşĈ˜O7Ĥ–Aĥ”&Xğ€ŒœdÙħ°wAÌ€µ­œ{’ë†ĦIËUFZ`Éħг•Ŭx÷[íŬwâ€YX€Œ\zWdj’š[W›ĉÇۓ›ÖYìŬ†Ò‚§eŽA:òáXHmCivUY ×[h lŒf`-ÄÀħ \zDàҀ”rcĦ² Œ=csÀîĥg q?6‡ÌÌ·)πĜš0IğAÉĵuĠ:0g ùÚĝ ÉÛ}·Û0ƒ²ÌħN İ9ċŜFjl×Ċħ£ç €&@z)@JDˆY´Rj&=ófµ™… “z.Ñ8oÜO‚Ûn띐~l†ÑÉvöïA°“0~ÔÜiH`è0â­Ż­ÙpÀ˜$`, PáíûŒÖċÔ£4GâĜ²F (áà$ÜïIOŽ5¸ó˘Àŭ²˙͖ğí+rn@nb>ÂÈ­g4Íukĥ`ÍÖGÄu{"àJZFwħ40ȽĈžĜ3!lÎĝI5@+AÌF:Ë:ݽvŽ™r(ÍĊVäĥÙx—XÍ­+Ñ1@Œuß³ (Y×hè½Xß&Hb`ĊıĜ°e9ܰWkڋ'†}L΂q,çêóŸ·1ž€g>ċî`ÏL!Ô[7]³/ò;²Ûñç|ÒÎm‹Ú8Öj-ÈZ*PhÖ † ‰L)^?ÒH7·y†ànĉjK˘$1~{™ êćŝ,ŜĤóıt§s6èû[o#µ-cÛş%8èNÜßĠÖ:7xğ_Ĉ–Ħġĸ=Ùfğ`_\oá ˆß‰´6LĈğGÛ R·“Ċ ` ´,Òż@Ŝ‹ĠIïKäeuüŞ´(KëĵE'èú·Ó̌l1xşÍ% Û×Í9iÏ߁ oŻY½46Ŭc”š}˙ÚmK|d²Ċ‡Û“ċ ^³ŭĜ ż‚m‚k%álİ7’š9q$ÀHí+½ÌŬĜU;&y4:wîB÷ıòK-´˞˘À4µ§ljê‚Âknç QM܁cħċ§W1 ŭ†ŒÜIÛ¤".@!ˆ1µÊ/àCĵğ(ÀĦ2N›Gáä8–¸qF)GĜŠYgFÜ?7éÏÚ.£ŝE¨jĈòÒx·at.ñ94J²ĝ%şžÜ5Ĉ=•`dü;ŝĈx'Št‚‘Ûk"QBé*Ŝ$ŝ= œİGA|^ 0’10Š&DáÄÒí@"Ç⸑ëSÂ?tŻİM éċdJùO-ñîˆFì*°ĞóÓBZôğMĴ\¤œ$0RÒUáv˜QLÑ$4$İG`ĞëŽtlel”R†ĵŬ‰ /¤·­÷ĴġŒŒ$$[]ÊÈC°?ËÀùEí:>—ö˘EŒ8ŒÀuÊĈcĉí¤ G·;û€IvÀ(86‰/`g_ĵc‚ Ñ%è^ é^ĜŜùwґÓ)Ùwá8 ×4ŞËÈÍǓÌ“ÛnbH7…1$Hœ‹HùNğœuWŭżWġ0ŜĊĵdË|˘QL`"Äıkhûë{$" ƒ–Ĝ§Œ"0KMšƒÁ¨cċûä"<;Ğĥ`Òs[ÁH$2şC`4bÛµLPuúm Œ"Äl3#Áà5ìş6£ŭ‡,kŒ$ FiiFñ8”N£ÛÇŜwá'aŞùp!ÍpÈOmbH/?jIdÈ3˘Î¨wJ#iï{+n-a P†€&!Òëç;d])÷Ú I”ğ­ïŝpҐĊîéĈ`4d´’"éşéҊ’;I8íZ“>û"žœĠ°MÌkÈĠ”£ÀĊÈŭóéÈğżs)ÖÓ£ÀâƒQ×]Ùs"šĦ‰D¸ ‚Qrw€&£ĵš‘áĠ™$"ä³iÄ5ËĈ²ïOĴh¤—{\˘TŸ •şúQ“ûkF~ó_ÖèÀ-N eçKŜ£6xĴ’Ê;Äaé³ uÜm½íğn=( ½Ĉ^şs4ğPqÄë£OZ‚ÀxŒ’FT (i¸ċ.çUĊ]·cF èoADħ˘%€9h`„}t@6F ÀêĈäߍû1d%ğI‚d\ètFħ²tŒÂqDa&625÷ìCĤÚd ½¤D¨sż„£˜ÈÌ!ƒKÔĈ˜hkÈÙ/Ê ċ QĥM*K]Ù÷cÚ9…°[=w×uÏW:v­7Ámu½ìĈ€$ċš@ڔÑ2pÛġ;qÜNúnĊ0΃0Dî-R‚ġÚ)êz1°Œ8ŸQµY貋ÀH€&ê3 gÜg|-WŽA0Ċĥ8×0‹U`„p"ċĉ Áˆ£lŒÁ¨3ypk`mW…ç“ï`E)0˘÷&ö4ÒÍ&A7;7Á皁0óìH‰ċ´Ížâ×é°ß…í‚Ôĉ>³Ï:ĉ)”À„³§¤’vHȄ$íÊA:ƒ$‘ÁüRĤì_ïó¨Oúòné²ĞΚ İ——6nÒ£xSjك­$ÁH’îÎml‰ûàmc AÒġ‡@ˆħŒÄ'’ô#KŒ f´;™Q˜1ì2ĠäÉ#ÄġÇ0^ġ9l*˜âL@4Ò #7ûjq2r+ròšR˜ĝ™ÜÂx—@K7` ú“ó.Ĝ‡]E.‘ž·PÛ4H„ô‚\*’tóġ$ÑÚ>I.’$BF݇u)W] FÂ`ÔgbÌÀri`lĴ•äŬŒQ@ċŠ:I(ê`˙VRŜŬ1Ä â¤Ïz†üżñc¨¨K ŒRŠ:H#AÉŭ‚h°ıĊÒ ÛĵFÛ<”x:™÷F Ŭ(7qI(L„•ÈĠVÌ Í!§)°+DíÌNyPb(Żé”ë.!€  Dâ£0CDÏHâ'b÷€‹%4ŽIE'G^bÂ<r›%;`qʵĜmĀ)[]Zl*ğMŭÓÇğ‘8Îò,Š:Ž™Ҋ:ı‚ĵğFÜdô@}ywâBŽ]WIUS`À}ısC0‚ri‡Ĝ“S‚;Qƒ´[GŬq“Ô{¤—˜b—]ç–(!#w!ˆ°MZÎjÑĤzsbjĞ@ûÌĠäÊ­‹dGİ÷÷ӁÀ‰.„ŝş˘Œq£VÔ0 Fĵ{alǃ3äĈëd‰\ZƒD˙¤*—Ğ: F£ŠşIŒFu’d&Šşkw'hô¸ĵ;>ÎE]rñuç‘Ç£Œ "‚ÔġÍħ6ċ9¨ïĤ„ a|ij×ĜĤuH}çĤs`D´Íâ8Ĥ1m Ğó9ġe@{7Iğôšç”özŒ20¸&G]L64|=i8'zI%0§×%g";˜Ñy÷`€ÜĊùrŒFu 0ê3wĥE*ĉ´#Î%‘ûq§ĵğןÜg+= #‚ĵ{HQ—#‘ŭÀ(xJy0R]"ÍëN§jJ§·7ÒÄs&@úÄuŜ-TĈe´]ċ.;XRGRŸ…n<4kù"oÇ!\İY7”ÌÚM½ ”Š­'ò4p˘Ŝb†Á|u²ƒ9ĊĴ‘qĜԌËK“£§I˜şJw)êRòîĦ„İ!S}Zy·\UŜ½ÁHFċŬÏ ¨ Ù^ğƒÛëí5&—ŬHŸL—òAŸ?Œ ɘü{`Ùx”=‘*$ër?‹ĵ;F‰ßRÂÔĜx‡ ÷Q*a*ĈuáX(‘R”Œ0Ĉĵû)uI÷Ŝ¢T‡ċOm¤OŽÛN\NruûFÙQüŻy`V×.’í1éğÖRÒëÀÈR,ïî˘Tf†n9 Áz§-é /3cÙħž(1¤²ì’wû7™ÇÁˆ@8ğ¨şĠagN˜ `PLĴŠş$„Ç™J˜şÊğŸEQ7½[F*Ñ(ğ`$’š`Q˘Ô&@ú1¤68ò w’ˆ ıᇯĴï Ù † çößF’,;ÎŒ>L˜*}|IH1¨K¤$â„KŠ։‡Ĥĥ`,WµŻo„ŠşTIôtĉolK($sßíĦ¨³2`TĴ'ì·ĞÊğ˜HOŜ’à$LMÉğ‡ĤŽpÄjĈ„гÍö=İ&@ú¤ĥp‘ÑŝÜŞ[‘ |+YµżŒTù“Ä X2:ô²‰GU˙d Şk'q0Šfġ{“%È`Ċš@U3Vk›0œ²³Ė•H?3Ë0kb¤uƒòîDĤ‡Ĝ(ïÊŜ-2"PÔAú뀧–w#Fòî1ĦÄn҉M€ô‰Ç#¸\`{ċ4•qhJĊöS€ĠŸdJTä4%3Ž&Àˆw+êú—á…Ż§‘B/Ŝ'XN Œ×Q…ŒŠe+ñNT‡Ŭ;aj/MϰÁïä~Ù&%ïîĊ–z`„¤˘nPŜ=¤¨ëı‡ÉÒòònınywDÁ·›`ßvR4L€ô lÜÄLFD 2:2ÄzĵÏ_éˆÔ9ċçmÁ´˘.eĜşFâYk§ĵA#)ïk)d ‘ñÔħ ž%'ĜFjÖÁzcÛµ`]y÷@ ŸTÂÔD÷‘w1w·—#ĈÛ£V’’wËġ\‡W—wËs•wİĝ‚ŭ7ıìÚiâÔ&@úÒ#–(È?Ȏdt=Q'N.ŬSd"v’Bğ^fI–Á¨Ÿí ÎŜX›XÊğ“Ù_RònfNáAˆŒ¨³d|`jĈĊÒ@ g7ĜWŜ‚îsw÷Àh,ÑŜ S1ĵNlO0zn SS“¨Žĵ;ínM)W~˘M!4µ >!-´UV%†ĥG/ħ@g˘Û°žF 0 “ $îOŠ'›Ħğ-ájĦĦ…ݐî¤>™‹N"=Gœ`üzŠşF>]òîĉù“óŞWÙÙ`îŜ¨KİcDŻ_ŜŬ‚'Üz1Ûşy7CŜ-×!ïN+ê’ۑb Ĥ`ÒHŸDr ƒúk‚R÷‘t3/öhû‹ß—8°KÌöe$¨Ìŝ{ñ .‰ƒjm‚kŻBm䢑Dyé”n"(ê† NO]Ċ„ĉĜ 8ğ¨`9xëŠ-”0•Ÿĵ{›ġ{@ĠwòîĥŸOÂÔ§–w#v'À¨ ‹mµòİM€ô dJĵc>6H‚ç˜}‰’•JßǑĴôÚ*ò{/|ċXŞşŬb½ é2 ĠQ]%œ¤]HI0Ú§ B"ÏH0§î÷ÀzmPn¸ŸjgG9ˆ>+ĜSQ÷ SċŬWUÔ M’µĦ(ïĈŝ S‘żğäŬC’fíşİËSbĠ >İ€$€‰! ÒkcğÀ‡"ÈĤ-è&rF2ajßĝPpÛ&—|`À^D²žmiÇĈLİF"¸}Á(´)uĠywóµŒċÊìTŽu ˙Ny7ÒUgCÖó SwËğ‹Ç}1GŠaÉğ;Ĥ€_AŜ=äŝLQÉkŽ4ˆµ‚]6ÈÉc7Ò'Ġog…aGŠÏµñ tÙGÇV°Ï°í?8j˘”DGĴñvH˙žM¤ìRÔ%BBƒÙğä €Ò³]ÙŒBP ˘Èğ›×˕…1QĤìAE $LċŬœdSCìn4ajRr=Fíy°~Tj-×°ĵ{ Pv1Ĵç ¨“ÊS`ÔôеDEšéïCÊ;gᄠ=m2˙5YjÄKœé’ñŭK½r΂Ħ\İ„^NÑH ~ ÔS*Ï]Hd §¨‹”cƒÀLĠî‘ġ”FYšN_+ê`$HËğ‹w·Ôv(ΕPÔäŬ‘ŒÁs‘w÷Á¸3H‘ÈĠÀ(•0*I?ı/‘†€ Ì×qŻOí)[6uÁ "DñÌK÷§kŽŒkGU×ı‡gÏi—W*½XǰÀ¨È>5‘˘ï÷2 x…ÈkKÓ tcgYIħˆÁkŬX–­iuiy÷›“wóSÊğ;CHĦzbX—)êÂ~NòîTÂT ħ†kÀ½V‰ÊÛ ˜É-zWo˘R }|(“P1ÀÊ1$òï…ÊbEĥŻÛÄÍŜMé{eşÂ}àé­ÜO0£„¨UíI´+éĊ´ÑqÁÁk ImjñTš­ġKËxĵ#9+Ž˜FêdòĴÖuÍnlŒ#‰bHcòîH¤ŒäŬĜCŜf+]5°˜9e܇jQI DSnÒkw§uİÌ£ħ­ˆ9“@„@,}öµ‡§cj ½lîşdc•Ïú !_ĴoèçÀ×ĵn˜ûÖz;Á¸ŝšEİœPÊġnàDYìH%ÇğÂÜkÂv-U—FĦJI,¨L˜šw ÇI=#ƒ5–0u0’ŒŒqċȉVÔ%Ĥî-ïŽ]~ϔ½{(a*úŒA¤/HÙn‘Á ½2š½;ê—+ÊğûÌċ òîE]°ÇÀˆ·3A[⣔’.=µ ^np"ïş ı~%§ï‘Ŝ:žˆĴlİY3dƒç܀ƒÈJGìş|­A„ÄäR˘”Ï)WŒ%L Ë ·‰$})è+ꂃâ r4ëH/ éÙE…03µÉğߏÁi0€ÛrTQgû ›¤ÀH†äŬ 0ş˘ĵ{8a*†û>#Á@b^#ܤ` Ûò /9׉5M€ôÒxċĈ8S³î§WBBK׍Ŭ0 †ùXïĤ³ž Ù`l Fáş"éş‘JNN‘2]W™ ‘d òÈöŠgX½LÍû#ònŽgû€Ñ`m 7Ù&.–Ör:—ŬUċŬ2l;òîžh"£Qy7FäŬ’H˜Š´˘.£k“w£F£Ğ&L‘wéŝï§’Ĥ’ılyÑİvID""Cˇ\yS\i¤—„ ‘↠Yż?–‰ ˘ı[6lAˆi×04뙆ŝġ‡ĝ"}6ĥבÍaïB”ĜÍn? rˆÑ“n+ Ĉ~’YĦ{`4ĵf)• ".WŞşĴK³_ÂTD`4–05ĊDb Ŭ%ċŬ|yw­íPÔ!íĉ{Ñ S{`„0ñïùuGš5kҟ}R:µ nD D Šĥ…ġjsĉ G ĜCr;·}+—´ ĦCi§Ĝ€Ùğ‡˜r˜E^˘ŝbq7Ĥ÷ş5 ´íŒ&Ĥ4ÒÍ%§ĜĦŽKİî Ó0žGGZZ?.żCą÷hëŭÙĊÁx’Ž'z —•$ĵçŭoœ05ñ£’2V;JD¤Rê¤ŞöjucÍäÛĈz]§…]˜ÚĜè!y·½‚˘Žc·ĈĤĈŠş0FӓwËn0Ú)ï~E]Äİż‹Aħ¨˘n°şywXÒ¤S R ıqwÔÀÄ#À4Î5µ)S bGnօĤĥˆw[e* +¸ŠìPH UĜ|kTc× •ĤŠc÷Œ½ —$ĜN²ğùd$a„ĈäŬİ,à’˜ŝ2tOdĴĉeiPUœ`7’#Œ)ꆊ=íFV†'ċŬ)ĈUHŬ)ïĈĤ3PIÄĈ’Šş‰`ĵü{琞RŜĠ×ê–0‘ÎÍHÔşëb ÚJ“¨a¤ DÍĥ\•HĥЍ|‰ ÈûŜ—ˆ¤Ĝ~ÍyO2ô„Ċ àHÖV ܆ à8w˜0UZEĦ¤K˜ÇEÁ…„U_9…ckB€ôuM3–qı2PŠeR³öĈx%ÀhPQ7Àpby7!Lüw…„İ€}äŬIEŬP͒0BZŜ!pMQ‚w:iy7í–wG_ä¨á ×L‰†4TŽlbH ½ĵ­IÔĽĊU^·œVӔò&¤g¸­­+%ÛĝĝO"§› € Q×éÚ)’&ĉTƒ }†CaP }cÖY7Ġ“U k¤)ÎÒeŠIÏ/Ş­‹ SJ0 Ô֓4ׇÜġJ˜J#€GĦÀ‹Ú‹'½˘R[Á q0­ĦíIJCı):†°(‘0µó;„8Ámû@Ññ‡v­ÁÖî‹ÇÑô]sNHäïNϕÖ5çgé’X°£v‘s·ıDĊ²uÙĦŸ4%UEë*1ĤİM€ô‘3%'û‰"êŠÀ¨Oô)|;° ½¤Z3êMBÓ7ŽOB›Öüm €$rڅ?@£,äŞğŒB…xAtü‰i%XŒhÁĥÄZ\˜ŠOĈĤ¨Ëz˘+Ĝ‹käĊA˙ġ‚çĜ&š—•ÏÜABÛq A‡ì\`ß Ô\ÓÄu Œ{Ûİġ\5OÉmÖʑôŬw‰Û@‚ëŜ-ĉ%×<¸Ú9ÄhFu²éLîÁC _ƒżÉ(Ë@l¸%-; “È0M,i¤—ĦË êÈġETwb šébQ4ÈûÛ ;u/x'‡¤gM "‚xż–;&Çn”Ú~WùɏRíÌrkübfĤ‚‰)şO´˙ĵ-½NŠ ÚóĤö÷›cPŝxİ€ GžÚxAe[à²ĴAÈ˙v ”r+÷@z{ĴJ‘3ÖüŽ(SQĴé[!ßiâÎ@+÷\PQ[&BïHĞÎĴ„2Ĥ#ÈŸ€IĤ_C £+~ßAwgşIPÀè”eÍ9İösï ¸zAíçJ{P?d;)r‰µ P}gj tä;™=pugcßĦ í gIDAT!˜ĞV{ş=Eîû”ù‹Ġì3`eJmQà=8fÑ\ × –ˆ,™|šµéc.ğ ”žħM*ğÀ’|cYĥ\‘Y3Zƒà@Àşf–j½ħUÍUÚNÍZ÷öÌ@,>ŭ‘ËRMÍ}G;jnJ@ùÄdŭïcûûZ)—%"ȊJŜĜ(E0€˙i'[׊ÀD`Ÿy‚Z&`,Cy„ ÌĞ°‚@k@D}PYi€HÉ 'ċ@ƒĊŭy"îlĥ8¤|–ZíŬ/pFFA`  3†"àl]; ò^šüLŝ;D=fì:L”"¸vkœŬ~@4†” $“äÁ ˘œ½Ë4ËÀ%ƒX@…î‚Y`ĈBH $ YĉÄÂ@îCì\­â9Ú‚tĉbw$ µeä™ )r~c] )ŞEıòPıï÷[Täŝ}wJùħ¤<ğÈ!Ĉ×B–A™3C‘‚&L€ÎşJÂ$âµKÄĴ¸Ÿ,@²8 (ağS·–ċÏ׺߄;gÉt{MĦµ÷.h))ˆÈ@-"~EÂmp†Om¤ŜEN ÌÌ ÔĈÔ+"µ9k³%((’vŬĴMjC*AĦ0xëĈS3y£C[×7‰rYŒ…œ1ÏDıŞŒĵ p @„` -mJ#†3PD ƒ+vß!÷-`h4á´ A+[*œ´Ĝş´˙™VXˆ/+ X#nÙv¸ “û=/H``{N…‚ĝT¤(Ä ²œ°.-jTĥĠÜ Pd+mGëÂ16ԊH{à´´Ŭqŝ8ĉn&!Ŝp‹áŽëİıĴb\t}”*;@ŒuiÙ·&ǖš•Ñ wĈ,íñRĤ!•ñÛ džy€Pn‚CÊĠù@MżÁŞ&;%­@ÂîĝTQ”ċ`ž™{ Ġ Ş~UĥŸ"iµe–<‰g’¤}bFèÜmç³&›UµrK!ŸŻ¤ĝĥİdŒ\.ëĈaĉn†Úx€³gx€˜¤30éÖEH S" QnÄk"Z‹H²‘sj Ŭ@""03[AU—ċÙ9ÔĊ›+ƒê§?ÁçNq ™R­+ŒˆŒp›'ôż7ÂuFq İgY’ö–ÀUĜ³Û'yU7Ûħ™ıƒ…ŻÊı½Âœ{Îĝ¸ï4‡k=ú°âKQ;?†€YZ`uۈŸÙ£Í&Ŝ+^¸çĜ/j´y*{ÖçŽ @ĦŞç—kÔiלj*ċÒÖ}Ṳ̀9pmZv,D¸)lïßC4hi+ŝ°´üıX+ío7.C`>Ş R1)·Êşŭs‹ôîÚvİyŭB5RŜMU{U‰# îĝ,·×'ĵ‘Ö[fVn[¸Î'È ĝsû™??§’PvÎh³|¸U†×jĠÈŭÙ_iŬÒĴĥ€°uËû9VlìöFhŬĊ[7¨˜íaÁÎğ˙È Ó Ï!5‘ĜĈĜ'JÑÒZğafĊ‘vR*ëÔ&@ş1Œ‰˜™ëş6ër³>óèïŜ˙чoüŸâŸ½up§˜Í9)Q: V’‹H7Š„`?şÊñn2ĴœeB_ÀÛ)|Xԍ/wkÒiÌ${ƒ(’\Vˆs§ĝ˜3"ĠF¤ ~@ż $礑Î}dŒÌ7ä6öH1îğ£Z¤í„ĝh]™ö˜%·HÓ×Ċ{yQ´-1ßA|ܽ²"Qħ71Fl.2ĉŬkAŬu@Ĝ2z˘-°JW‰Ž¤2‘*JÛ ÌôÑU"’UÊv×ëpĥÔócWı‡d#RJħY‰*ŜŻŞċ™1fH6J<CšÒ³ÄÛ§.¸öŝŒ˙Ñg?ûÙÙ믿~rttôÚ|>˙|–e_$˘W³,;0gfċH†x%Ĵ(`f ŜoŻYúĤÌn|@oĤS 6@RZkÏêş~°Z­Ŝż¸¸¸÷ĝñÇgggĞŞŞê”şÉ÷ûb‡ĦrS›ÒGˌHëġږeYj­33EqID'D´`ĉÜ3)%"ʃ‘˜  išPLmjWż7Ħ”jeÛD$Ì\[kËşÏ×ëġ“ËËˋ²,7ÖZ3B!arÓM€t“ĵ é;I]×|~~^Yk/‹…Íóü‚ˆĉD”1sŜ€‘¤ĉyT!‹@ijS›ÚĠ˜Q̐€µÖšşËÍf³^­V1ĈĝR FİxRè%‰SÛ÷úL]\ú³ H)EYžç*Ïó,ÏóL)D$ ™™˜Y7 ID´ H³†b–4µİMíـÉOYD˜™­olŒ1ÖZö )vÍíĞĵ›i¤џ”xž\× WI |öEÓ5œÚԞÊ{ĥX˜Ş‚Pĝ|(k”ÁáÚä²ğŝê²âÁŻ‚Ïc­• |N 4ÒÔĤöô€ѐ(e&•ŬH7œ€nÉ" À(|-è'Ob]ӝÚԐLS ´kŭQj0M€to çĤĥ3HİMmjWğÇħLŜ<²ÍÔ&@şñÌhìyohô^›h š€ijS{z0Jħ%yoJúÛd̞ożĤ@D%ĜĜûûČĤë8µİíïĜĊ–bá‘Ï&pšéÔšÀhjS{q ”J ¤Ġs²ëšÚH7oià½!ĉ4´ÍtŬĤ6µçN‚Ŭ‡}ÑF Ŭĝ‹ÑÌjşvS›Ú˙ß\èŝgĥ¨+Ì|%B „ö):QÍ ’ •ŒÒìs¸!ÁïAŠÁ­§%Ŝ • “ÁyÊŽĊHXożqCÍH ÑÇKàCX 9íp\œ˜ñRk’çĵ#WIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_AutoholdSet_420x420.png0000755000000000000000000013116712467662066022026 0ustar rootroot‰PNG  IHDR¤¤~LQ5 9iCCPPhotoshop ICC profileHǝ–wTTׇϽwzĦÍ0R†ŜğÀÒ{“^Ea˜`(34ħ!˘EDš"HPĀÑP$VDħT°$(1ET,oF֋Ĵĵ÷òòûĴoí³÷ıûì½ÏZ’§/——KÊƒ<œé‘Qtì€`€)LVFş_°{ÉËͅž!r_zXĵpÓ3€N˙Ÿ¤Yé|è˜›³9,ˆ8%K.ĥϊ˜—,f%f(Aˉ9a‘ >û,²£˜Ùİ<ĥˆĊ9§³SÙbîñĥL!GĈ݈ 3ıœ,ßħFŠ0•+â7âĜT3IlpX‰"61‰ä"âċàH _qÜW,àd ėrIKÏást–.ŬÔښA÷ädp&+™ÉgÓ]ÒRәĵïüY2âÚÒEEĥ4µĥ´4432ŭŞP˙uóoJÜÛEzĝıg­˙‹íŻüÒ`̉j³ó‹- €Î-ÈŬûbÓ8€¤¨o׿şMîò]9ñLaŠ€.+-%Mȧg¤3YşáŸ‡ĝŝuAœxŸE„‰ĤŒËKµ›Çĉ ¸i<:—÷Ÿšĝŝ¤Ċı‰ÒĝPcŒ€Ôu*@~í(  ÑûĊ]˙£oĝ0 ~yá*“‹s˙ï7ŭgÁâ%ƒ›9Î%(„Îò3÷ÄÏ H*Ê@èC`Ĵ€-pnÀĝƒ VHİ€²@Ĝ A1Ĝ ö€jPA3hÇA'8΃Kà¸nƒû`L€g`ĵ a!2Dä!HÒ‡Ì dıAP ĊB Byf¨*ƒŞĦz¨ú: ‡@ƒ]h š†~‡ŜÁL‚ݰĴ Ĝ öCàUpĵ΅ àp%Ü…;àó5ĝ6< ?ƒç€˘Š" ÄñG˘x„ĴGА ¤iEş‘>ä&2ŠÌ oQEG˘lQž¨P µµU‚ŞFFu zQ7Qc¨YÔG4­ˆÖGÛ ½ètş]nB·£/˘o£'Ż1 £ħÂxb"1I˜µ˜Ì>Lĉf3Ž™bħòX}ĴÖËÄ °…Ĝ*ìQìYìvûGÄİàÌpî¸(—ĞÀÁÁ á&q x)ĵ&ŜïgsĝF|7ŝ:~ż@&hì!„$Â&B%Ħ•p‘€’H$Ş­‰D.q#ħ’xŒx™8F|K’!é‘\HÑ$!iééé.é%™LÖ";’£Èòr3ùùùEÂHÂK‚-ħA˘F˘CbHâı$^RSÒIrµdd…ä Éë’3Rx)-))ĤÔzİİ“R#RsÒiSiéTéé#ÒW¤§d°2Z2n2l™™ƒ2dĈ)EâBaQ6S))T U›êEM˘Sż£Pgeed—ɆÉfËÖȞ–!4-š-…VJ;NĤ½[˘´Äi gÉö%­K†–ÌË-•s”ÈɵÉŬ–{'O—w“O–ß%ß)˙P §¨°_á˘ÂÌRêRÛĴEK/½§+ê))U<¨ĜŻ8§¤ĴäĦ”TtAiF™Ĥ쨜¤\|FyZ…˘bŻÂU)W9Ğò”.Kw˘§+é½ôYUEUOUĦj½ê€ê‚šĥZ¨ZZ›ÚCu‚:C=^½\½G}VCEO#O£Ež&^“Ħ™¨ıW³Os^K[+\kĞV§Ö”ĥœĥ—vv‹ö²ŽƒÎ[ş]†n²î>Ŭz°ž…^˘^Ŝu}XßRŸĞżOm`mÀ3h01$:fĥŽь|ò:žkGï2î3ŝhba’bÒhrßTĈÔÛ4ß´Ûôw3=3–YÙ-s²ığùó.óËô—q–í_vǂbágħĠ˘Ç⃕%ß²ĠrÚJ*ÖŞÖj„Ae0J—­ÑÖÎÖĴOYżµħ´Ĝ·ùÍÖ6ÙöˆíÔríċœċËÇíÔì˜vġv£ötûXûö£ŞL‡‡ÇŽêŽlÇ&ÇI']§$§£NϝMœùÎíÎó.6.ë\Îı"En2nĦnĠnÜĠÜÜ[Üg=,<ÖzœóD{úxîòñRòby5{Íz[yŻóîġ!ùûTû<öĠóċûvûÁ~Ŝ~ğŭĴ\Á[Ñéü½üwû? Xc &0 °&IiP^P_0%8&ĝHëçÒûĦ:Ħž0ɰè°ĉ°ùpײшu×""ı‘]QĜ¨°¨Ĥ¨ı•n+÷Ĵœˆĥˆ.Œ^½*{Ġ•Ġ ĞSVŸŽ‘ŒaĈœˆEdžÇ‰}Ïôg60çâĵâjfY.Ĵ½ĴglGv9{šcÇ)LĈÛĊ—ĊO%Ĝ%ìN˜NtHĴHœáşpĞı/’<“ê’ĉ“ŭ“%J OiKĊĈĤžäɒy½iÊiÙiƒéúé…é£klÖìY3Ë÷á7e@Ğ2şTÑÏTżPG¸E8–iŸY“ù&+,ëDĥt6/ğ?G/g{Îd{î·kQkYk{òTó6ċ­sZWżZ·gƒú†‚ =6ŜDĜ”ĵé§|“ü²üW›7w(l,ßâħP˘_8²ĠvkŬ6Ô6îĥíĉÛĞĥ,b]-6)(~_Â*ıúé7•ß|Úżc Ô²t˙NÌNŜÎá]ğ—I—ċ–ïöÛŬQN//*µ'fϕŠeu{ {…{G+}+ğŞ4ŞvV½ŻNĴ]\ÓVĞXğ½v~{ß~Çŭ­uJuĊuïpÜİ÷¨ïhj¨8ˆ9˜yIcXcß·Œo››šŠ›>â=t¸·ÙŞıùˆâ‘Ò¸EĜ2}4úèï\żëj5l­o£µDŽǞ~ûŭqŸ=''ZüĦĥÒ^ÔuätÌv&vŽvEv žô>ÙÓmÛŬŝ£Ñ‡NݞŞ9-{şô áLÁ™OgsÏΝK?7s>áüxOLÏŭ nġö\ôıxù’û }N}g/Û]>uĊĉÊÉЌН×,Żuô[ô·˙dñSû€ċ@ÇuĞë]7Ĵot.<3ä0tŝĤëÍK·ĵn]ğ½âöàp蝑è‘Ñ;ì;SwSyoáŝĈèEVYŞŞ˘-cbü˜FÛ·mÛ²<û˘wmÓÁ £mğö‰Ĥi4î,yrÈrU(íŞËö“ċùĥÀè*Ë0ʒ”e/(= ˜2ˆnĥĈtˆ2Œ²ì”"‚,—L@´ċñUŜ—át= t™–tĠç²dÙ—A–$!8çèMúažÏr}`tĜì|>kGY²†”ċqjMğ4"şâ—Aöì‚ç*Ò^ûÌ0Ê2%œA–' t…×Q†Ñ3qèŠçí‘dÂ_™%K֐²<2lö1×ċÉçù_Lè–×íòf-(ËYÉfırI”Ŭ.ĝdH]/Ñ=ĥïĵ°Óĵ—MwYò¤ċŞ0Ú7äû*ÁYž_8í“o´w´]†R–$Ùd—ċŞ0Ú')vŸDÙ Ğg_#ÚĤá Íq4ÚĤƒqĦŻ?Β%OYĥiÀv— ˘GS–gRz…{ŬñüäĥĴ%eÉC–}a´ DW…T{× FşÇßÇJY&%›ì²\FóùœïŬğW8ç¸( 7›Í\L¨eU€Ş’ŞvûÛö8Ë36ˆtÛô·sN‰HCêş!ż^ŻeħX„ġz-#ĝì[ċ#KR–ĴMêŒîŬğçîŬğWUóù|^–ċĵ(ŠŠˆJ"rŞšŞ. ey>á˙ÖĝwPĠ ŞmĦ^Ż×Ğġz]ÏçófħXĝ°JcßS–,HY&µ£IÍf37ŸÏŬíÛ·g‡‡‡G÷ʲĵËÌ·˜ù@™ĈÔF PùP?—@šÔ’xUmTuB8+Ëò²,Ϙyé½W2ÚŬ6(u ¤lĥË@ʒċRÍVĠƒЃƒƒƒƒƒg³ÙkUU½îœ{‰ˆîÑ€bšŒn ”ˆˆBò˙„)Ó]ҎTU[U=pBxß97àDDf³YâëejŸ£1‘A”%)ËVP\€QY–|ppP•eyĞŞŞ—>ŭoüêß˙ċ˙à7~sU·4¤…Òĉžúħ(ÀH\s;,™UÁLpD1Ĝ‚4~˘ŜÎCvƒ0=mĦ›êhŒL£)PSċpŞ:Üá`]ż{ŝlC˜~j·UµïÂUµÍÚżĴûb ¨ µíÚ=€v?CâqĠ…JĵD!˘*‚*ԋ?ŒÑ?N;}wI¤È˙ö[ËşùŬ˙ñżÉ_ŭ‰÷~]UĠşŞ*nšF°ğúC†Q– ¤›.˙m…›ˆ0•Îı#ç܋çä>ñ§|çċo·%GATĦĦŸÔu”˘AA‘J3G˜; Ħt„B Ž >.ÁGwš(ˆ?h"ùt‚6à¨Äƒ£Àq=ϛ@‰ FÔMÖç­àĴP²ß§C¸0ĦÒ š6§>t‰¨{ŸŠ€Ĝ Ĵ HhšÓ°ÔÙ{$*ˆÂ{ "(EPAÓ*ÖM@+|G`"ûÍAlċìğ*O ‘&ĝ³öĝ™ġé'˜ùğÌ|ìœ;SUĈĠŠñf0e eɲµŞÂ†–äœsH3"ş+m{ïA+ĝŝ: d@ĵBĵ€™‚‹Âı8ӈÍAsn•‡Žl²t@EO„Ş x²ù‰@˘ö€mAÄèAdšuóğŠö+}N+˙Xh_ƒ›fä‚hT1°ŽP, ³ö1nG?bçÀhŞ+²V”%)Ë.ÍhR;À!VU§Ş%€JUf, UómĝF !z5TâҘàĵÀ„Û‘iIsfŽQ` |şOf-ƒQçÇñƒ)Ì÷ß.™’7›ß÷Ħbĉ/égBê}%*ĜÔfĞ™I n´œ·'K@Dl@RlîЃ,E[Ħö_Tıè“jġ━ݝm£­ôÓ|È`{€™½QUí8G3 p¤8Ĵ%kR¸ pj˘:àD€u£é2Ğ Ë`ZhĊ Ò%MnÇF ËIp$›ê²d eÙJÛŞ0t7Uea‰R‚l²“8ñ‹ô³ĤxĦt¸Í„£* 5Ӗz\´İ•‹ă—ëhâÖ¨ċtÖ=E7§Cí`ĝ´Ì }à@–-Úĝ›m‚Ö ÙóÚLeâ³usF֑rÀíöĞŸOo ›ĤMÛ7Ġ§Ĥ?(ÍQµ?‚@=ÁWŒĈ‹J´ƒŜ™àèĝóÊŞêâá‘v4ĵé³]֘2²dı4°ÓŠ7„àDÄİ*AAĤ)|cè`'­#ǘ3Ħr„’Š m†“ ËèeF-‘n:ˆ ÛdNLĝ—˘˙DNj€óĈÇÏĜͽĞrÛĝ:Ĥè´şŞĥ­a€†^|R'‡îUŸğ Bċ"•cT…bî Ár5 \ Ì(퉟.BàÁĜÑ&á Ħ,HYö֖ĈZR§- ŭfħ’ ÀÌfL( pDà8=ëÎ siR2T{…)š; '‚HÒ{†ûĉFœgë§+0ŒŻžü~zñN÷„ġĦ逿ħJ‘"ÙIû0x{ğn1~í#À|h,šÑ1ĦdBYĜbb9†Q2w:€4€1QUNšt4Ùɖħ”›ùeÉ@ʲWÉ )( Ĥ+ µ$ĝ0€ĉâdç˘)M)ĉJğêŭ`¤‰Ş…2ĞıG4"mRPv98 \èrhz0igÒۈÔm4Ïù-’K`$ğĦ 1`Û6 UŒnÎçávÒ$²§ívöÀkĞ7zlĤWty[LB‘”Ħ9R€ Y€Ŭy˘Œx !)ĤۗdeÉ@Ê2 "şLS !$˙€Ċ 89…ĥ'é ĥĜ²ùOb7‰nNš{B;€HԀD-‘Sbn…DĜtɟƒ×J ­•¸½’tŸc;NğJ,œ,[,Vağ?gjû•4£A^T:B1ßj˜L9êAñyĤ<Ž LfµĊ^Ë5)ş`JÔ bñ$˘½é à˜ĉCŒÜÛ0Ĉ<*&h^‹šôSŬVċï ¤,F˜€Fĉ:N4ĤHÔ8ôÂôB9XU€"ħâ   ’\¤ƒ‹%t&ˆX^SˆšQTó[‰ŠĠİ‘c @Pé?W dĥoT0€@½ò89kDFáÍHġâï`d*8šÄ“…kğ6îˆ"”â f -`Ĥ6ÇöGèŞ_¤´(ŽÏ OpŠ ’*9Ĝ1MĦ.R}ÀH7,TAŽ홛ÚónżÑx””%)ƒèR‰Ĥ $"< ô""PӔâvGĜt‚(Z6ĊĊ<˘4‹Ô3­§ƒŽÚhE‚˘U ˆ˜Ö¤Ĥ1IIŸöw5ްo’:ĊÙIzí·CglĤӇ0Óm›ÈE³eÜa‚Ž+b8²Š „˘†T8 `ÛV0uIĈ=œìï¤Y }J˘#A¤û{£œġöMr1¨Ħġı£Îĵû0R– ¤,7F—uˆŬhĜĴâMĵQ:S6§v"„@ÚÍg!î;3]Ôf4i@CM(B¨Q}ìEъ ‰}ˆ ²4]úÚġ:àìdm‚ÏŒÒÓÓ“ fŻ žhš+Ħ"Fá FĜEPsŠ`K!p|b HèJ Mžüd­€ĉşHáÂ8âĉßmc2C*)K– &”}ğĈv[‡98yL,è!ÂGKR_.e+iˆZQ!+ÉC€x‚˘E£Š•—‹“ûa$˘8;mPŻÚŬĉ¸§£Éîaj’׈'{sé…#”Ì(™­6 Û6G„˘°°{GM×9}@Ñ˙&ZŻ"İë$ĴİŒÑ)T¤Èᢅ'ĈΔV>ÎKÊPÊ@ʒe?³Ŭ ŠŠş‚qH şBÓb ĉ Š dĞ{ŒĴ–i60éÙë½(ĵ>ZUÔ˘h‚ŬĊ´?Gĝô°8͖ĈÍÊôĴµbC'WxUö‡Q_²|ò³·ÂHeƒÒ˘MñßğlĤ^M|n+ŠÖ+֐.lÛ9+ÑT8Fáİ+^ë\òQĊ`‡¸˙ây͟óËFĜ&sŻzÁ׸e“ÍvY2²<ˆĥjFk1›ïFħĐpM\0+m:ôğ ƒdzSA+@MÖj0Ú…˘Ş[4£ Qœž4hš°5PáÊ0šÒŒöÑ¤f¤[ûŒ.ùÜ&(š`fşĈJ'(‰˘I JÑ?E$ħf_ŠRӒ‚ĈF½ıêTrô-02鎴¤,Y2²\ BÛ& ‰ħQÉĦnµœœ²9a6”báß@šüz3]rAy‘.ĦñÀJ~ ™XLïŞÀ0*çıZyœĥ1"p ŒtÍÓÚ¨ÎŬÎnJûšĝ>r Œ.|w„6Â6ÊÍ}öƒ÷ħöMĞ(G“ž˜)/†ˆ3¤Ôi­>XH#‚ttè|Öï3žöñ!eÉ@ʒek€ÖÉ#%ĊĤ˘Ŝk?Ï&ê6-î’ü Ħ+è˘éĵ*ZVĦÏ/â.v}£‘ö óœĤšcÇÙ>ˆàäĴES‡~_ Ĝ ôÙ)İ7}LÎ4#šĜWĜìµD1pĥH‡`Ô-Ÿ+CÑ&5­kÀÚ Ĝ#ú—…Sƒ˜´Ş˜vëíÜ^ hòĤĝsÑí —í‹œ,Y2²\ RÀĊ²A4|…DżÑa ‰v<Ğ.ëyvĤşVì5'_*.Mzĉ4Šŭ~Äzŭ¸~ċOœZLĄMMŻ "ĴjÓ“&ĥŸ0pQÜ5Ö|Ž@‚…2Ğ·"£İ†ĥbı6ÑtĊ1HƒmÜl4cĞ×Ê ı^l} lf&ö Şâŭ ĥŸz‰ĊN À‡îRi}7şß,ÚùÏÈÙ~şşĦż‹FuTĦn­SĦ÷)ġív5ú’ Fm¸Xo‚ŭhPı!Ô·iÚ´çĥ,HY²\Y“28tÙ&ŒúUu˘ĥçAI´ ĤÉ$şrÌԕǁ#€ĜÀ –ôšŞ Œû *4Ô9(ÍĵKDPûĊ}iêHëÜtyOƒ˜ ĦLÚ2è°o`‡9÷Íç -ÔŬ>36ÑŽÊĜŞÂ²€İ2 hl%Á‡R à|TX%´ñ Ê`I@cwŬÔú Şuġ­Şdˆ}[T´´" q\X„èÜ£ǔq;֞·›·)7dÉ@Êrİ)eğÙnhNSX#7ï/ĝ5@-҅zk‚׆S$6ĥ+âäêT\Z%<³ i4M)x5ĠĦp‰n#„“e =(àdA}ï"Uӄ´TÛ> Ŝ¤G) J˘#ż"h#àYejÌéĴiHĥí6ɓômËİbh˘­-B+¨µLoĊ­Ê´³"j`mŞÒ4Ĵ.=(,<1i)êħP`+ $e!sĴÑ RÇ"Ğ×'ħbDl ¸£-‡ŭŞŠ¸Hħ³CSʒ%)ËĠÀ7 §ĥÜŝBtĜ°çΰN'˘‚mËœ}Ÿ£~ïÛX˙è}¨úhĥ“^ñTèj´"şuTќ//hí–ġƒ†|é‡E@tmhx€8â͘‚tİW0wvçĝúÏKŞN|Ç!D‡Ç*Fµi:qqz['$ÛhlÉċ'˙ÊWîà5Pċ€`…jğ3%îL:U˜ŞŬji›&%KR–ÇŞ%m‘~Ĥ␚6ĥ a4~‹ÍiIû`0\2ê Üyç_µ/}í÷šĥ "Ae‚x`<ïmBPê"ĥ˙"™™Ĉf§ ġĤ„?‚3ħ%UTĦ4ñiĝžÏQÁÌs(ÈéŸÑ_?ġş?¨*9oí ڈ\ĝm!î äV½uÊàv™™.K– ¤,LÉü%f"˘A˘ éD„ÔÑâ F£ìç$ç˙u½ŝ@ÚöLEê´k"OŸJDÁh¸Ä'A×èĵLh­¤ÚUŜ3ÏŞŞş[UĠKž½ĝ³Ÿû˜~óĴÂq+ •h6ĵŒ:i0sĤˆt½u– ¤,ω¤•2ƒÂ×~£…Ä6ÍhFƒD¤m۞œŸŸż³\.ß[Ż×'!„uz%ÉpM?ÔpÛġ<ê›ŝ™AmÁm "ÂeYÎ^8<Ċ5ÈĠ5£Aç7ŠyF*’ʈ*…&oKù mƒ&´kĊ˙@â) ñX Ċ’ìĴê…ĝ+Àhc³‚ŠÂŞçÊfKŒ,Y2²< M… *Ĝ5ßxXĴA$"Â ]fğ@Úİ!Y""óı°KNÉĴƒœĞĞÀˆ ż]ĞĈQğŒ,Y2²<ÙqX­aŒt[ğhħëòa`‰h #Ás(×Ûdw)Œât큚£Cú_ £ÑJĊŝ˜ğÊßY²d eyz’(Äk7AġU bċè-Ópn“paŭ,4„T/.„t?€Ñ6(M™î ”h‡†” $#ûÎ\GDBl^ğŠ̃{À(%Ŝz• 2ÌCʒ%)ËÓ ‘™jĜBK}[„+À¨+lG ‰ùDD"’˘étFc0é(Ŭ$ ñ„•™ŒìĜÄ ĉL=meĤa”î],ïĥVkȒ%)ËG7Ešy-V•~›„Ñ–NŻD†-ŽÏAëó04ÙE i£p‰–4n¸FGüB0”f”´£¨ı ¨ ‹Œ˜É-ĝĞÁ(->ˆ I5Î@ʒ”ċİjHİġD‹š‘êvŭ$VíN×mÀ9<ĵ(ÊfĥŽÌu—é:û‘Ĉ’Œ`4‘^<Údb5)¸äŠšQ·š`[Pdí(KR–gBCJÎì Ñ%Ħ—Ëd³íĝùÒcÙ ¸èĞZ' i}4¤ħù×JêÙ<‚ÒTTa_C½×4SçİNi‚cÒUa”ÖR˙ŝ,Y2²<Ġ™reTĵ^^a#ĊÉi /ħŞcô}Í4‚Ñ>ûDÜ]7 i¨.s'ÂÌŭ1IáŜ Ğ2YÓ}a”$¤ĉ‚:•+K– ¤,OER´a1úŝ?—À(ĊÉiï%6•SƒQôФĠüHcm‹¸›ÒuѐĈˆ ]šQ‚QòugSîQҐÚĞÁhP°ÁLµ!kHY2²< LħVقÍ×0jkÁÉYcĉ½dDrèĈC§})b”.– ÚĤ! or,@Ä[^³¤Ĝ£ÖÉVİÁÔé\¤×]fş!•R;x[dɒ”ċiϒjŭı5ètĥŝFĞs³EğıĈÑZ'F*ú fÖŒĥAhWĝuÑ8<Ħù‹òH)„*Äċàé~0ÂÄö0èĝ›²d eyêó$\İï-0RÎÎĴ×ar²B#1·eSC˜ítMéşiĴŭŒA… ÍȚݏ*£4hWŠ£>ŒÌĥ ¨òÑt͒”%ËV‰!żdF…ˆâô¤A›0G“1A½ÂÍ H­İzt‚‘N€hŞÊ÷ĥ××+¨AšGÙÉH{Ú8>4lZ¤ b£G×f7ì #,"’É53dÉ@ÊòLˆH4‘5ëĴ´ŠàÇÇ äB°C?™IP#HkA äún˘ ߈.K}ŜĦ4ôs†ÏwzŜ%SŬlg„ ­ßĴù´f´VA4C)KR–gbĥ$²áÁD%P´uÀÉiÓW ššÔ$jYkÙmîwĴċè%ÚĴƒ†¤#(bÛCÀ/˜-UCĴ='1ä[ö„‘àyD­……è 6D–,HYžÚ<™JI£ġıÇÙY;ĦŸèDÊj|àÚJlk0ıŞŸ‚°ğĊuÒ½buÛö‘– UR„°ċí‚Ñ&İpP0 —HY2²YNŽÍ’”ċİ‹T2´ħ İdBI J6À FV.Mv]¸$ġÉ´+rİZ–'§"İA ˆĠ1¨Ww‘ÎYmA°u@Ʉ‚ e×D1×+zU8K–‡—l²ËòÈêĥ,ß²p½‡e;žÛè§#Pöä[ÊÒ^DhwŻ˘ĥb}•´p.(’íÎ9Bé ˆĠy²ïÜ~"KR–gbÁ ޸Šv1 °H.‰šQZy÷> ^A%uŬgs)š'}ÂâɈ!ß6ë,İó%%³žJ%ˆʂÑD •.‡êgÉ@ÊòôEC{VZ0CAôċħŞMaàiĵ IDAT8áĜ Oƒ$ú6²†ô¤‰vÑ×^„âı"ĉÎމ°A•áEÑÔĤiré ,HYžİ­°Ĥzf ” ÎĠnŞ™ï(ĉ´lĥ3WU (G(ey²"…Št-?:3Ş‹Ù}RĤ8žğ´Ĉ`BU0fAPi–%KR–§Ş!yWŒ*Ż(` okÒYĞ$ízlw}â†w €T1ôŠq—%)Ës.UUÑĄ@;&Œáŭ…בc„JE¸è3ÒXšĤóKt`ş‘Ì>D3 ÑÒ 9ÈîIiX•ÌßkIfç˙@]è~²Üİcĉäì×pjLŸÓá8½~³d =î‰û:kDÇ´ċù­*E1w3J†Á–Sdpû›–&-)Í|Á6h3ŒÀËòÄ@Œ°#Ž9_Ŝo(I½;ÉjĜ1”¤ħ²;)*b(Z.°’­c.K„-mÙŻë5˜A›ô8às].š˜ hbò “ T•ˆ•#Tިf öVÄL;*€’tUeh£4h,g€5GÙ=q @ÁP Ŝ[RĞ„Ñ: VùĈ jbˆ?€B¸ ?`Âĵrc-Œ0ĉĤ´ïëTDJ/›o2¤n8v@èŞÛŸw ñhRà‚ŞRœlˆˆ0+•J‰y+ÑΣސ‘f$HeÓF‘] (h¨§Èj–'"ġÌaÚ0“&3k÷|z‹šoHQ¨Ġµ³*ï„CvXÍ+PMDô·ñ$~Ŭ‚NÍG7N7H[@DW€Ï>÷,‚‰Ż0YtŻMĞ_GDc”%ƒWÁJÍ Mh†QĞN#ħËAPí½ {i5{ş?’iP­c,4Hߟ*ž ‰çHâySÔi †Œ ΀ƒBiɳ Toġ;Ĥñ#—Œ/E_Têy şÇs´ċ9Ú§›Ĥ¤‡ÑeŽ˙çQsÚ6Y:S÷PUšbˆbEo‰MöV *BPQxQxŻAúAB×ĥ@!Ak駤,Op ”"'Q­W´NQz131… ÷u 5Sf³2i^4Ô˘/ÏPÒY>§ÏÑġ4ġ}ibğnyŽĤÀtÓ t“}HtÉcşâëŸW ñ”Ĉ€kHœ|HLħ ĥÖ5TĊ4!1ĠAm‚ u´^F—]”P ‰È>¤'ż¨—X•Âfċ Z/hĦNċŸH JPGP%{Û`úd²ËTòi#hG 6ŠéÂÎ:¸=/@ÚĤ-鞯ŸӍ…ҍ҄v´ :ğàt ´Ĥĥw0ìˆ)ÚċTQE€WEL3jƒ  Šĥ53QÌ=EÎCú(,vÊElĦÀŸ´G™ÙT£ÁÌÉH5 (´`ëK"B;ĈÖ8× Hc¸Œë%Ûúú›k¤=a´+ç†çNÛÌ(ûÜş÷P ñ&‚´âaä0jƒ˘iM Ċ2µAoċl²<Ħ³Ÿ:ĚİUċâÚŜEíˆ\,’+R“Şp˜†ì@\ÀRUÜd²ÂHöžÁ”F´ Fûm>$ÚbH×ÌL·Œö ~µĤáï¸Ìd×Ŭ˘İŽğɆbç=•è'×FAáEŠ˘ñ2 £Á¨­ƒ ʁ …ĝġ?ššVĤÑş.)–c ÂĜú×.RÂ|ˆˆ ·Ñ\ïyí(EyŽ´#ŬJGwhU×\ĜvS´¤›ž‡´šC>88 ²,y( "Cg-Ĥ‰.çb[ɔ=Kİ|„&›ŝw W´ŞJ"’à†7(ŠYQ36vÌ|'ŜÚKˆÀ"AÑxó!… [aX“?*h3+>q`ö7ĥ~HA-_ıñħ#0 Rĥs—2Üx€ÈşÏ;ç\ÁÌeY–³ù|>‘ˆHˆ(Q Ì,q›‘ô )=S“ïÔ÷noA^€644~Œhl°Éĉşàä[ëyf Á”gl·m½Â‘ŒÀĉSòĤ_8ݘ‰fž;çîTUġ;w΋˘`ž™C‘8ç$ŝ-q×ĤîŝÙĥv^„>=ffµéBlï½oêşnïŬğ×V+ÀG(Ñ%&Ħ%e )ʝ;wÜ­[·Ü­[·ĉ‡UUŬfĉ#fžQ Hŭ‘Y—éYRú Àµ%Žˆ$3]Y–ċù|ŝZY–/VfŞkĦUӒ"Œü%š‘=hK ı­Ús6ÒG`p"ĥĈ|ĊĈ0Úp 80ĞEħ‚B„TUt=˜è°,˗—Î9:<<ĵKD>ÂgxÓ!œs2˜ĜġyÒĝ~ê7QPĠ ‘UaYUĠYQ+ï½Îf3‰@ÊÒ ÒeA T•eYÌçóùl6ğ[–ċKÌü"3ż@DGĉDä˘&ÇMiBO]CÚ'lzš‹)óŬ¸4Ì|TĊKEQ||ĈàCfQB1ï((š hĵŭ½Fbĥb‹ĝ’ È} >ñÁLuÀNA gê›Í2v$ ­=hvpʲ|ƒˆ\UU/ˆÈ"iFI˙LĜĈ&ŻgH£ïĤÛĥ'mIU=€µŞ.D䏢EÖëµ/Ë2 ÏÁşñ YCèàà€™™g³YÁ̇oüğżù÷>ó‰×˙.Ġç/ˆŻï†Ĉİĝ(˘?Ec`Ĵ’â`/BŞJ{ƒnûÂşqulŝb "Âd°´((&"€ÁÙVШÀ1$*ĉŭQW)&ş"?˘$ˆ~´ NDŞzĝÂ+³•*Ú6EÒ3ÑEÓXBìešQ·M†íJ³†ôÄ5¤Â!•b.1vbħñËò‘†ĤUbÎÌ@y˙ó8şÓĝ7_+î–żNÌ`çğĝ&ĈfŸ˘Ä‰X(UÄÊŝxW̵àxñŠĤhP{A]ï#‘u #È!û‘ž´0Ĵu9„ Żı0Cĥ^Ħ B•ĦˆgĦ8œU8|ġ—^ıó7îbvPZ“ĈÒÁ1#¸Ü ­ŭFôs7¨­XĞ0C˘oҋ@D"H ˘‰ )Uĵ˘ÒW~Û”Ôé"¨΀à€àĊOÀIğëup­„xl\̊÷:ĵĝƒÄk€÷Á_ùoâ?úŸğûÖ˙Ŝĵ­,×H;ò†&ğÎTċ½×ĥmĠ{/Ġ÷ß>]ŭÏ˙èĝêO˙Ú†O˙Ä˳×ŜÀĴ¨pP1|Ä+¸ ¨W›ŭ•bkkfÀ* ?U 8só’QaN@Ʉ’ĴuCQœÒk]œ¨÷•êˆi·*#ĴEÀD`ħƒ‚(ĥàÁĊEö‰ż>ôGEƒ@‰ /Xŝ!²ˆ+/v_{E½òhÖMQ7Š:šµĠBğFƒmJÖ¤ÂB‘óEù‘hHñO %ĝ !Öş ÑÊ9Ğßzo‰Ş ”óÊÒĈu9+şĊ3w ñ|ğ¸âĦD< jßOl)‘ığ‚˜&EV‡O˘ĥĤ nĦ§ÁŞP¨HDY%U|àۀFĥ XŻÖĴÏ[,WV]ÙÙ“¸t΀CI³· mUĞbïAÚà˙ê·qgŭŻġ…ŸúÄ?öŜû‚Äùf*éí(HϽÖÔĥ-ÖëµÌçóĥ,Ëġüì~ú_|ġŭ6ÂoGwʏ˙ÚVĦS -Ì1LÜ-ú(.Žìšë WĤkpĈó8ôŠ”Ž0PÂ.ŜdyDàÎĠ™.+Ô3i|€of£ŸBÊOŒv/Î*:“%”@}$[µf„°q9ˆ(BĝKnM!QĴW­MÑ´‚µ·×Ôë&Ú^0J]ŻE,ˆ\Ŭó“ùĵ3ÉJk\l=FCKëş1ˆcZ„@Hp‚L³.È|‹M@9sĜQĜ96pˆXµñĤOşME_Ħ "6­CÌö–xq @Ìö;4~İô[ [eEîÚk*À  BDh!h´­ÇšUĦ¨Z…#XħhZhŬJ? –“Ò"µèHîX"@[Mı[ì ġ{ß}/ĝ·Ŝŭ…Ÿùä˙|{ĉ½_Ż×kż\.µëħIn'€{¤ŬMÒ˘¨–tvvĤ³ÙLŞŞŞ‹˘X8çÌÎOßŝÌżĝ/}ĝwê˘8â£W@EeQa6€™:QòÉô×ñp„9ná”c,9ĦRBé+ &Á´-bíߛ|<ñN;kDàÜCÛ`ĞL" V(…Ŝ'€6S ™‰Ĵ*ışXċ9ÁÇ J°{o˘ZM-Ĥ yT½½ı*šQúÍ,BÉŸ}HO^Cb‚€A½ï0ڈk‚À‚0DZÓZJŽ]i Z8hh âP0A£rè£!žoñ½ŬX˘Ĥ£Ä8✴b@½iWŭŠÙŠÇ:ôĴP,(˜À5ĜuĈVöʏB=œ´à& H4ğ‘‹ŜT[ĵi2Q°³ì÷ƒ @1‡ĥÀ˙ġW’˙ĉ~á§Ŝĝ˘÷íÚĥ=>??_­VĞfµZI0]ˆġĈù‘nb†İzuÔ4 ‹…0sMD "úÀA'‡Ÿŝ—żsWÊżV~öo÷^Iaöig­eĜ›yiˆ?C\=†¤êw/ >KQŬOoĠ ˆhĴxDpĵlúı" *6Ğ™át4ĵĠëè;Ċpß %cZ‰!Û˘].QuLtµş€şUÔ^cQĠ‡„"l›Ì‹ĝû²ŠôääfˆĝıŒRÔ@+@XzȌĦ%›ĊM*&)³‚ĦA!ŽP:„²`3%ëĉŝ&§dġfïô:Ċ=£†­éĤ+7™ĠE@Şv bż_bÛ /İ‹“­ğzëĤs€²ÈÍŭ&^jżñá/|ŝo†à˙Şišw–ËċNOOôêğ„‡‚‘v]°Z T¤¨:3ى- D³Â"éLûáĜʂP8šğ ĵİqğĥƒ oòejÁA!V ÷q‘ĠÔ-êĈ÷ S×W·˜£ĝ˘°ÈE"Pĝŝ{oâ~c0jÛĉ­ġzŭWËċò½“““ĠÉɉ_Ż×ÛÌt76)‡}/‹ "AD–Ŝ{Bp·nŬâı*òOżÂ ü*>ûS|û5kğt³“K˜‚Q?¸[–^P€Á>€5fğ+›)À˜tò:U(ŽWÁË֋ċâ²ċ˘ŽZWHġçÄ4 /‚6Ä6AšQ°`†£xûÁH1^ ÷ĉÇèrċ%ÒGg'PljFru eŬxˆ8‘Xp‹Fĝ¨*DZPgTGPaĊÄd £ ġĦ`$]Òĥ iu+¨›€Up^·XĠëVĥÀ(í—bqYîLŠp *J ŭüw„ûÍ7>üğ?ñúW›ĤŝĈùùy£ÓÓÓĠééi¨ëZn:|2ö”óóó Ş^D–"âbw¨ÊoüéWè{ŽŝĦ| ċ½×@ÄÑ5£ &1L˜ïç^--Cٜù`ŒEE„‚İK@^§ë€ĥ}t‰D§tW.^¨1€ĦĠıëtñF-İi R£žID2ž ²Ò[3šNôR ɛ!A Œ:+@P„uÀĵŠŝ$eH‘Z£3Bì&\„…#8gÍ›uÀ'Û`¤[`´aÚîÇğcÛAÛŒ’f´ób‘Ú…Â+KÀLό– %\ 8Ô^°\ùX}a˗^ĵÒ;~“‰DÔ²Ŝƒš™ÎşşÚäàĤŒ6uzmu4Ó5m,ô¸adĊ‰ ìúxùŒĦ''Ŭ0‡ħë_ÀœT™G†QbZPĊŞöd³z˘7×!”N„mœ›ċ ÌÖì‚Ycâ9ĊZyĜİI2 Fs´Ċ*hL_05Ĉ€ӎ–ç-Î×Ë:ì#âĜ˽˜ÀEġt0úıϽúğMSsħX|'Áèììlµ\.}ğaÚ¸â9˕%tĤ˘XĥpMPRĠVUÏEäAŞ„}¤Ê˙ڗèàߖ7~b^Ŭ{ TĤ܈݀‡Q@ŜÊ $BiĤ„™” xâ˜3(8^úhֈÉK*uUú A64˘#ğġRj3žüG!IJ?ħĦ^BgĤ›ìôú4£˘>€ Ûo^C>^öĞ8F‚èc‡QV~¤RX~·ù“AĦ b)¤Xħ„b…ЉŜ1É;iÓ+/è`|kŒd A$.´ÚĜ›Ğ Xµ‚ĠÊ`´sbŒÒ”á@ .çĉ‡oż‰ûġ[Ç?÷ıW˙i]Żżı\.żsvvöƒ“““§§§ĞĠjµ FÛ2ï&ÏiöŭœJÓ4:Q­a”ĥuoÔuŬA)µbPU>Rċ×˙ĝ‹ô.oµŽçĊŬW@½l#Ïú"ŒÒkjUĝFÑ:…wŒF 3"”dĞĥ“ekĉ ²*Lbŝ%5Ñx²ÁàBîïA5F¸j×*"Än/°VŜ4²ĈÛĴO F1ç„Ñgï§:G˜,d9nàĥëb֛p_XǓ8ŭ&hûĝaÔXĠ•¤-)TRp\1|ĦpLÔ }yŜż4ˆÈDĴ70Ï—÷ĤY$]×­`ŬxĴë€ċÚÇâż{ÂÈE­’\Í,Ïè;_Âŭö›Ç?ûŻüÓġzġç FÇÇÇÎÎÎÖëġÚ·m ċjßùbŬÓԄ§MÓx J]çÔwT˙ÍöS:/ï aAZ‰ıµ‹“-C/p*ŠV£a d`ħôXy!‡hÒ ËY"ŠI´ébU^§})­Ĥ£ÎœaĉıÚahw\M޵™iÉF½â}5#ĠAˆ;ñgA6à=¸ÖÉIo£ĝ"b’Ĵ>v _³nbŬ;qeˆ*Ja[9…ƒ‘gŠ…€í{şXhC;Ž!ô€̃ZĠx\­·ŒµXפĠĜD· Fìl|’+˘fô/á~ó͟ŭñWŝŻş^kħX$GµŜ§²(Ú³ïkŽËyH7ŬŻ'µmµzp%( ’—ħXŭvš‚ÑPäÔYTg†#”…C`sÄCÖ&ĊĈxjo`´ñ}4UğÚXl%yQ´MèuÖ­ùŽĥ­]ÑtÇh 4ï›Ï¨ùĈñßŝìË˙÷z½úÖbħĝîÉÉÉNOO‹Ċy]×I3’=4#Ŭ[³Í@şö6Òĥ›àĥm=€ĞêƒA+p~ŭëoÒğà_§~r^Ü~A”ebbž†Ğ<ğ}P´lEXËÛµĞ`ĞĜ‹Q7píí^*½7ˆ•:’È`t!.Á肷m—f¤[ŽB›'"4e .œjĵ²żäBİš^˘E^l‚gÁÎ[ÓĈ*Û]!8(xbazj¤Á iÍhĴiIPĴƒ@œù‘ G(ÄĦe‚ó¸3 nèĈö°hpĴ–jÄÚKıFqLGm-í°5š.jF……£öG)šîäg>ûòïŻ×ĞoEÍè*0Úe é:˙¸‰À†Ğ˜íi›·GGe£ŞK;É2zŭk_Â÷_j swçhëkĥù‰z]Ò×óbıl7.èVle™œ[Ùµ‹çïè—ġHQ‰ ‚§!Œ¤ËĝۄÎŒdZ3°Üm‡‘ÊĜÒ²WĊBĉG+úvt£WŽ[‚tv-´ş1=<†ö8ċ̨pVG0nK0ڈd£AU +C0>ïħ-ąċ&ĵX};ïl|;Çĉ7JÒe7ĝY:^h‰@B1ĵtÁ9şiSĵŒt×jÓùïÙÁhµ:˙‹ĊbñŬhĤ{°X,VMÓ´ŜŠàÉ`ŜĈóÈe::H×ßl‡-àƒixcÒĥmêöÈCŸ’ŞÒk_û"}_ċïµoüÔĵ|á5ˆçíġëĈ¨h¤šnÀÙ˘Ô44jKL*–—û(Q·šÔÁg¤&fp„‘Z#2Á괋ĥ2“C[‰‘nlÎî$œŒÙÓ;­.ġIĊ2GÍ÷RGP}Ż*Ĵz9ğ(b”C_Ó.ĥB #-Io¨™îŞşŞ:l4À;kŸz48+°J)ÈA‡éxcuĦòäúŞäúHĥJò}° Çפ™ß4a!ÂZÜ V"`rpbjC,:ÌVE{˘¨:ħ’WŜkç#z8ĊAìb^aQŒŜ~÷›·NŝÖg^úƒóóċ_,—Ë·ONN~pvvö`ħXĴêşnB~"ŬĦËĈóÓ7=¨a_-IĈ0J'óZS‚ëc_˙2}_ñ‹­Òĵĵû2¤r€WhJhFPàlÙĈŝ/a´‘çcğ‡`Ĥ;Għ¤×’ÒÛcÒ£x@IĦLfšs ¸‡Êx˜Ħ^@óĜs:¤6vÑR h Ħ²•€!UÛvÀ@kĊVé°Zµò(ä(şŽ-4 €ÄY‡XP1è¨ĠÉ$£uĴ”![Ì—ù“n*Œ.,ވHUĠĞj£ŞuW&ˆ\öö·+bÏ,2ż gúI—˘rġÁ@ĤQacWäĴúC§×¨v b†ħ{oŸK€H@ ‚ Vo•D˜&ÓŞ’Z†9GÒċÓ酊ZW„ğ^5dŒĵµˆ0úĠùò/‹ĊÛ'''?\,Ç#ɎÛ60]–‡”£ìnˆÙn_-i ħĈ´Ħ)ub€ÂÇŝeú>á üéı›żb~bÀĞYë™ Aħ\zx/—Âh£ĉ@J4ÛÑF´•;×ĈŻ[°%é;€ ĵX4`4'Ò-gŻïŽĊÏcíJìëZ ħm³iTÁ‚ Û_á ŜZPi½d´‰Ÿsˆ \2B+ ı–Ÿ˘@K6ĠŞT5dü^ ĴI[AbÁàZDŞ–ÈĉŞp ö܍„|UltD5÷5&Ò @ëğ§Ĉ†zŸĜê‡ IDATf}pU"eSSÚGĵzĴrĉ¨ö_W•Ä#ҘÚRép3)Z­<튏ñCÁ(µc€˘°<£ĉĝïĵ9„Ñ·ÎÎÎ{zzúƒĊbñ úŒê£p Ĉp’‹ˆÉy,éĉhIIm\‰w£QH’µ@ )ÀĦӔöe|ŸÜ/†ÌĵbĞíĊb­ëZP×áÊ0\ĊŭŽÈĝ÷߆,߇úà˘żİdt]haĤ2 b6GqbJ ˆÒçФvêÄ[Kt4kİNŽ Ğàì¸!{ïÏÛĥ­ƒu@ÔšÒMĠŒöq–ĞކBBXzïüÙ;k˙Áw­ûÈÈnDÇ!/ñ|‹Œ†X-unM;ˆ^m9›R¤Z×ٕ;­IClƒ!èa¨0󗠃׀ÙŭOX\ña”|FÌft%´‹Ĥ{ëä§?}˙˙Y/żµX,Ŝ>==}/jFË …-`šÒŠöñŬ¸1}#€´‡–4|œŒĉ"6 6Â(]%J×ÄkUèc_ûmĵĞú‹ŝ:+î½ vm†Vħ\ùG†Q÷͇ŝ§ t@½ÒÛñğ§ròCĠöÜ ÁÛñL)N7M@“íZ†Ïo7ßZ˙bĝ ’ïˆv?ˆˆ6AħšŜúvMġûMӜĥm[˘–mî{CJp!Ô&gEQüpù֛˙ßíïŭÑkVsfŞ6ĠƒÔ_ajÏ:ŬÍWAğ/ĞÍñÓEŭëh|mDx2ĝî#eħ¨^żU×>İW[Ż…Gò•-¨R ‰·ßÄŭúÏ:-—ËœüìììxħX,›Ĥi&`$;41”vù“n¤vt5¤ñU³Ët·oEµžJmÛ€ġx*fŝŻí‹xĝEñ­W€‚ħX˜#YÑçŝ<QAÖh³¸7>OEĝ€?û/żK¨@DÚĥíïŭ"šĊü„ !×Óy-[|8SÁÉıCş‡j-"ËÂqÓ,Ŝ??_ŭàüüül½^ŻEd—ŭŭĤûŽp™³ë°^ŻWUUQùqŭƒ˙ş_½äÜÑf>P!ĉĜò@ix?çÉ=1ö16WO,ä†Ï{k`OT8çĉEQÜ.ŠâŽŞ’kwëg~îoŝ ÄŸż}ĵóZx$3]Ô ÉU@ŭùŒê Íèğ§§§)€aÑ4MBha…—èvUMé*ŝÑ ¤kŞ%킒 |A²>;/Ê^Qşĝš×żöEzWċ á“<[ı퇐&ğŭ£hF°àA˜nŭüŻŬ>ŝÔŻżĝû˙ĝàÛóĤi>\Ż×ĥmğŜŻ£Ó;Œ!2 ğ'İb |0ġú ¸MˆH"˜‚Şĥ"²‘óĥmçççVĞĠ²ë&†Ò^–ÏqSÁ´-/İóuzïŭùùy̋…Ú²,s‡ĉDTĤèTydt-LĤ 5~mg1.½‰ˆ™ı,Šâ ŞŞ;óù\˜ùö‹³ïŭçoĵġƒÙì˙ò{z|ß§äq¨,@ÚXµğı£÷"ŒÎ0Bh˜v7\ £›V‹ñFiH J{ÉN(}ŭËxGñ…úö§g|ç5ó8‚ĥÒè(™RrlŬx/€{Żüäí_ŝ?~ç˙üŸsvŻÖëġÉjµ:kÛv%">†Wsr& ´U+ş˜Ӆqw0ŠŸÓF(µŜûUÓ4ëş×ëġş>¤}˘ínÒêrˆ.hJ!išĈ/‹sï½Ĵ×ëĤ(Š3—DT(#„\ŠkK[€²ma6~íx?VŠ‘¨(Š˘(ËòàààŽsn‡·_œŭƒ˙żĝä[?˜Í~뿇,cÈ8÷ŝÌG…³AΈK |8ċ3Ú#˙0’ £ ¤gJ|ìk_Ôċç~ġ ÈÜŬ}*Ş´v­0şkiì2G1U¸şœ,ZàċÏßÖĝŸ|êèĞ˙ŭqÙ4˜™E¤]Ż×Ëġz½öŜ·Şš.¨‹'‚ Ĝ#—bĤñ>: )Ŭ§h:" !„6„à½÷ €0j¸J¸^c‡ÈĥRW@чÔĥmĞu] 5ÎısUuÌs9ŒR‚7O2lӒ€ ĊB:-}jÚî˜Ù•eYÍçóç\ċœseYÜyá•ûżòŝ—Ÿü³£u?ĉU.ˆGьY§×#ĝoiÊL—a”t3 tÀg˙üw—Œ/4Dsşŭ1@ÊÔEqÁÖÒûŞ0|s­TZhöšxñ'nëŻ˙§?sôĠ˙n£ŻVŜûóĤiV!„ĥmÛVDöË£.Ż8~ßĥLöħ >Lğ£ín˘ Çîäq&ûò¤ÉÔ%ĝLÜ.ÀhtÛĦĦoh˜ğ×íÓ9WTUU9çÊÙlVŬ:<<ĵ˙ĠOĵñkżñ_ŭä[ïÏf˙Ç?˙>~tĵ2Íh#ĉâ’^‡yFU ĉÒڎ÷MÜo‘aô ˆğİ?<„çÜVçë6sۖí;}Jby"")AQˆÈ˙ÒÙ÷ë“ğŻ…ò €;Σ.\öŠ0 ¤&x ßxĝÖ+3úĝg_ġ½?9#‚'"{>µÑtçcŝÏSŬ6gn¸ä‚zŬh%}0™ruM.Ö~ĵnƒĥ€cÛXĠ=—ċÒLŬĈ‹”îÜ8縪ŞâèèèàΝ;wîŜ½ûò;w>ñòÇ>ùżŝŭ×?˙փÙoŭ³wñáƒsh}ċĠGӌ(–wàœuzm߇û+FHJPZ|ż=nżÜĴ@ur.vɌğzMH[…_ ¤"÷^›ÑkŸ~éÖğzF@ËÌ–”ÚĈ* JÛ4Ŭö‹<ÚħmûܕTx#.î-@ÚgŒbŒĈOÁFħ_(óÎÏ˘(h6›•·nŬ:¸}ûöğwïaôı_˙Í˙ĉçżñà`ŝ[.><^CÛ6ö<&Ż=²Ï¨pಊšQŒĤûL†QÒ ‡€ĦJ ÍKË÷ÚÓ£ğŻJ5/hv˒ġ‚ZżĠG‡QjˆgEïĵÂнüħ9½ŝ闏ŝúOL䉨˙Ÿ½7Ž,ğîüçܷ䆺ŞĞÔÒ"Ċ–=²F˘EÊ Ï8FjJ–‡ápĜ֌¨ħb&Â1iŝíôĝ"EžĉX3ĤÈ)QâÚĠ#Ùb“ÍU…-ó½wï=ŝáŜ·d"H ŞĞĞPçۍ@"‘ËCVĉŭĵïıg!*½÷•÷ŜĊ½eY%·Âm—i• ÷3úşËäŽĉŜĞt7´ì}ğJ¸ĠŸá¤ÎÜÓK’„³,Ğa´ŝÊ+Ż\F·_Ŭ~í?úŻŝé'~îÎNŻ÷É?0*ĤĦ`Ö×ïûÎàIәg”…lşï~W‹·F $…Ò”\ğĠŝx³ßI]>żCpAuw€­œÉ•­Ŭĝġá÷żĥĦԄj—Ô ß-:k^“Ó s°ägXĤˤ]Ò˘÷YŬI°|ÁKÜêÌċ$ILtFƒ[ߍF·Żm˙ĜOŝêoŝáöönŻ÷İ?ğ‡½½£ö_ß?Y˜;v>ëC½j Ôŝ°Ï½?WŬ+:;Zċ5>3Ŭ>Â(ÇġġġWÖ××·G£Ñ\żġSżò›÷îìċ½O~áGĜÙ;ĴŠR}bg„ŞK8ÀhÚIíV)JOà”zë›.í%ȇ€Ŭê·<]F Çâüña˘ĴŞÒllödûƒ›k?ĝĈ35ÙwÑ)ÙxĵĞôêşèl˜³êÎltŬÑ .é´y_3#OĠYÎZH)MSÓï÷³ñx<ÚĜĜxe<oF£^ŬşŭSżú›ĝ÷ïìözŸüÒ=ìoa$uFéE·aş4 aşrgYo:…‘é€ÒY÷9?”úë›i‚|'gĈfuĊı\Fhħrh[ĵxÌÚġ>n~psĝŭŻïfĦT°Ŝ{ŬÒYáµÓ²³V­/:W˜î%ÒYP:ïÂwÖx9ċä‹"Œ’áp˜­­ #ŒnŒF£^Ùĵġw˙Ëüû˙Î^ż˙É/ü;ğ‡ÁU"qôŠĠ{F& !M”šħ #ÒË %yêP:üQġ(oúĵŸPo­‘Xé´ï?'Œ€NìâÇ-<–µĵħĠÇö·†?h T1s‰ÎžÒ‚‰rN'´JÉU`ôÒ|èWx_žö>=³Kû94“vžeY:³Ĥğ:£˙⭝ĵ˙İ/ŝğ'@QU`zrq½oÄ!µÛîĥuF #’Bé)B ĵ6½W=ĴoZJ$ħ1‡Ö\<×êkeĦ¨†èyÀ9X!8 $ÛÜ~˙kûĈ§DDB3ÔÓ tç³Ê²ÓR‹_şŭÜ{ò´÷%-ÎEFw,­Şa´>ÚĜĜ¸²ĥĥvs4ŭĝ+›7ú—÷ŝÁ½^˙S_ş‡Ŭ½cHQ„BH`xR™$†é’àŒüCĜw>£0R )”ŜK§tíènġ8oúĵ— ż6aT8œoCwç…Qç>Ä.Š r€Ż÷qƒ[~cŸ •1Ĥ†RĞ÷”ΝÓ6ÎWÙD_¸ħ~™Cugĵ'ÏV–s€iÙ{¸éu—çy2òŒnF£߸~g~ù7~˙ÜÙëġ?ù§?ÂÎÎ!PYÀı€Ÿ'ÍĤë½&&ĵËuF $…Ò3ƒÒä^ġ¨żé(á;CŠ{@O£Ŭµ{K†Ò–JnëÛ£~cŸ‰,Ç+"Ö9çÏpJçÙZD'—탔–½7Ïë’NĞ{⌆W×ÖÖn ‡߸vżüñßû…;ğy˙“_ĵ‹Ŭ˜ÀP–!µÛKëŒdŝMşŒ(ŒŻ“8ë…0ŬğŸĠé[ #’B际ïŽBñĴ5Y‚t2Óe0â~9`ÔŬ2T`€ `-à@àġ­ż~{kíî·öMÈĞj(pŜ{˙â)éÌĊóeŭà/ÒyÁtÖ{x!Œz½^²ĥĥV;£W#Œ>´qíĈ‡éż÷‹oíäŭOŭû{Ĝ}<&SÀùM×Ŭ3şŒâ²³éÂĜñ!Ħ@Òà}ƒÒä^ùh¸::¤£ÎžĠƒh.#ďb\vÄz€Şm†ĝ•큿rk{tï[SŠ´6ĵêolı$K¨7!8ˆŒXÚÉç…ĝúqĥòpàíßĵ½=şû­}&TŬRü û9(a ppÊïDAôž‰V€Ï˘}Üï÷Ó£q ÓŬî÷ûŻo\ğñ‘}üwC˜îKwp½Ò†=£ù†'QšLàĴFHĵ£cÇHŞ÷J3ûD\uíĝnñ(_ßri/!3€0ƒ€síC]FÒ,Ġuŝ†à<`€ú›ıŝڍá½oí×Nİnĝ§¸˘•ö'ÓYcÇy”L×­ŻŻçëëëÚġz½ŸXuûg?öëżóĈ½^˙S_ĵ‡`Z֝ltÑ0]íŒRğínèM§RHŞçÇ)5PšÜ-eë[ç‰é›ĠĥÎĥ£ Á(\–NR8ÛuŽàĵ€Żl ܕÛ7F÷żµÏ’ŬPê~—kÒ*ݵêœĠ€´Ì5_ƒÁ [__ϔ×WG£Ñk Œ>ŝğog`Dħ–­ÉĜ|’=£&L—DFnö;³0:::úîŝŝŝ=…‘IĦôAéqUq–0÷ Báì²ù(х`T_™Fb$ï*ç`Kı²=°WoßŬûÖá0KiS’§ñ:ОH‹ÜÑĵ3š‡Q:{5Œ†ák½^ïġġW·?òK˙Ŭ7îìöúŸúÂħûĈZ$ֆ>‹Î‡“˜'…‘1Ħ7]Ö óŒ7Ĥ;::úîǏF $Ġsi„RÒKLA ßùù’níÊ0R&$LHˆÀpH /­ƒġ^Ûĝk·ĥ‡÷żu`Â,%Ħä"”pN(x-Œ1¤PZ]Y–­êŽş@2ëL £µñx|­ £ŭúïqgŻ×˙䄃)r8¤ïCùĝŭ‰`”Ä ċΉŜt #’êÙBiaÔéPşW>ÎÖ·lÖK8B\l-Ԁé|0‚İá'Bš°aÇxmkàŻD(ħBé2ÁhmmmFżóĈŬĵ˙İ/ŝÓIÜ{d$H ÀíÜmàâ{FI˜g”ĉ@µ ûΧO„éF $Ġ³…’\JĊ½òQ²eó<á|Š]İΘ“•a’„ `J ҄‘8&AYX”VÀ­à”ڝBé2ÂhŻß˙W_‡rZ!÷9 Œ„†ż"çU“]w17-8É!Ċ½vì¸ÂH¤znÂwç‚ÒĞċ½òq2Ŝ*)KL ”& Ïëfg)#8 M€ÔRf$ŬIÜR’&¨*‡˘Š)áWnÜŜ˙ĥBé²Áè!L÷ÙŻ<@ytŒ>ú†&„pN`½GYù ‡é8Í!ċ}Ĝïŭħ†éHŞçJ¸”RħĠĞĊŭ2ì)ċ s/6Q%ˆ‹hÁaèß)0 F™1HjÂw†9ì+1œ‡Á¤hsàŻÜĵ1|°”dĠżUĦô~:££ÏŭĊ}ĜI}HÙ@À@pF^à\¨YĞĉÏ;V‘‰RŬnÈĤë½*ŒHŞJ׊ûċ,fßċ% ¤’B§À˜(8$MbCš(%†Á˜Ô€½‡uÀ¤’à”^iĦGWXħDÔM ?kšİBéıÓġú˙úË÷`'S  g) B34Ò{À:‡ÊzÖÇ=¤`ÄÛ™°gdw‰Ra¤@R]B(Ŭ+÷Ö·*ÊNzÒuY:EŻK` íĈÄL;fŒĦP9i‹€b¸fR x}kàŻŜĵ1ĵ˙íÇLpÌ\‘S(½haş~˙ÍŻÜCe-†!LÇӁ‘sFEéQ”Dž;FŬ˘×ĜµğéÀPĵġĝ§?ôŞÂH¤ş´Nİ·ħUqžP6ȀHÇĦ/QówX‘3…"0…ï!ÚR̙ìÊ9Lœ‡o ìĈÍkñˆ™½BéĊ‚Ñ[;Y˙óùċtŠ!=ö!ça+ҋ r‚²r˜–“İáÔ6 gNz5 g}HĠ;0R İ.żSzdÖĥ,g ÷†1ÈP€’,‡QH|hC0LħĞ8Ì–¸ÂqXhfk=Ž+•wċö͵û *L·›÷?˙Ġ¨Ĥ%†È98eö‹JëQ”“Ââxbq0ħp3ŭOÙ3⟎Ó<Àè;ŸžéÚ­0R İ.7”ì5û Ô)Qžp:|Ht  Ċ‰qèá 4P"" Hj§¸ÖxT•GáZÛ¸ĞŻJgŭ½/-”žInŜóĞPMCCN>ÀHäÉaÄÜÎ3â(﷓^F $ĠK%—е×Ê{Ġ|cә~ÂÙ0ĥ ġ#X¸Ŭ1N‚=Eqµ‹û-”– òfFYXL o ÜĠÛ7ğáğN›!™ƒÒ*ïKgċŒŜüꔓ)F qĝ÷}"Q ÑYîÀûÇ3“^F $ĠË%¸êzyŻz”ŻoZd ċˆ¨qK²Fu͒@`­„Q4% N‰9 ôĈ0J'Ñ)m ܕ׺P² çFĦ7]Ŝó+÷QF ##iöŒžFÀ„ázl²6›NëŒT ¤—J^Dl kĊ½êQocÓ"M ÙĞŸK?Q@ÛN£]%Ša–'ĦČò¸BáCĝÎrûĉÚΙP‚BéÙÁ譝ĵ˙ĉ_î *J Ù#'ay ΈÛ0!P’ċƒ6L§0R)^J(ùP*ïU{ÉúĤOò„Ò!À$ĦÍP³—4£nD/@ à&́Úŭ¤Ŝ58%˜$„ï&S mìĞŻŬ/pJDä­µ‹†ñ½”PzÏaô#ŒzUQa@9ÓÓI`à˜0鵸ûîç4A@R(ùúÛLž½nï‡=¤—€{€aP@@u7‡ĊM2[ $B) ô 0Ş“X âêh˜”4¸>pWnŬXÛùĉ ”êD…Ò³I`xk'ë>†é†ÜÍĤ{ @“ÀÀI)cjwùĥÂH@R((‰ˆ›RyŻz˜Ĵoú,O(Ċ—%M2#¤<[E§D!í›êŭ$P¨Yâ8A8&• ·†îŞBéŭ Ӆ:£ŞĴB˜›Úíž0LgL¨5޳éü^€‘:#•IĦt&”Ş{ĠdcÓIš€ûaAİ\_γ ٝ½¤™=%Ša:Şk“”ˆ$J‚s"8L* tċöYPzİö”žUoşÏġ>Êi!ùĤгéžFáEcÇ9ޝ0BBSğU $…Òy ´—½²ézŭĜÑĦ[—)#³0j%Òî)Ċú¤²  Ä ò‚‡µ“İÖĥ†nĉµŬo-ƒ^(=‹Ôî·vóàŒŠ CrÈ ‡àɨ5 àtž‘J¤Pş(”ÜŽŬ3k›Î' ġFğ1Ô½ïĉaTgċI ßuŠg£cŞÛ ˆġ>Ĵ:“İm܊PúĉK gқn·×˙üWwPN&Á%ĉéÀˆMġ2Y 2i€Ñß~W Ŭ3R)J+@I‚(e°ĠuûÀî뛎³„ò%q- ]£N$/ÏJÓf¨D†Bö#6dµëA£íĦ{ċV%"zi ôĴ`ôĉ_>İŬ$FpOÇ!†v™B×îâv`P)JOJşîĜ½d}Ó!I`ú cB-ĊÂ#‘Ċ£+x„Ĥ›„ĥ+Ig/)NŻejWWç$8ñömĵ\PzİŬwdĦPQbÛˆè)ġĤPôšġ v7ÀH;0¨H ó@ yïŬ”|W^wìžozÓK !HóÑ÷ a$uĠRl3ÔdÜĠá;tRA!ÊC!Ż*,&ÀڍĦ_ßÚ^Ûûö#fv—JÏÄ=h‹^ˆÙtŒ§Ó(µ;Ï(ËŒŜù NŜRg¤R )”Î% …FËĦäwì^2Ŝtœ'” Âè]³q ĦÎÒl‡PY‰À[!†ï¸“•ÇÊİCQYÈh{è_ıı½ĥ÷­Ç—JϤÎh7ëŝĞ;¨ÊèŒêÔî§Ò(Ġ´Î(É!ĠN€‘ĤvĞH ÷ Jî}hÖ6]ÒK( )á$Ä}E0Ş/K‹#ÔJJMŠxÓO6ĈŠİEá2ÜúÛk{ßtPz&aşŬ^˙ó~Ue1×Ĥv?İ3ŞAD²4ÀÈîtĉ)ŒT $…Ò{씚ŽS²Ò>™,†:áğ2B)$:ĝ°(ĈPBCV ´2ĦÍPáĴŬúñööÚËgÒµ{§Ú•%Ô Ó==# 4JMg¤R )”Ŝ/(=°{<Ŝr&7” OïA†, ÒqI=%ĝ&ħiJqş³AY8†›1|÷âC降˙óûaψ%4J5áu†óO#cšFİœġB; wÔİH ÙEìÙ@IT{<Ŝ²”Jû”:žÓ&<È<›|ÜSÂ(Ċ}$&qpJ>ŒÇ.*Œĥ‡nŭĈöĝvJÏĴèġĞ÷QUU;\ïi„éšv@!‰³dr74J-4A@R(›÷Ò)UğÉx˙ž!3è<ärĠ=ñê:(ĊCdŽ£+ MFY ĤÖA[Cż½=~ôÖ gÖè/wPNĤĦè•K1+Ö IDATžòĜqš;İŬ*’Bé}‡ırÓïT;XÛrInL-ŒCït_#tĤÚñ稛ħĈŒğz-PÓÂCÖĥ‡²ħ½½öĊÒ3Ù3ÚëġßĴaÄhGH<l:˘¸gT÷Ĥ{ Ùt*’ê9ƒ’ìT{Éú–Ej8i’t f—t )á>:v–:#Ñ9Ö)‚¤ž<[8ÈڍĦomݽNéÙìġúoŝĊ}T“z„DŒ=)Œ8.Ì@š„ħU=v\a¤R ݞ;§ô Úµ-—ö QH àÄžÎ/Y+DZ§$ġjĦÔ´Ĝpë–ĵGY Šİ…Ĵßşáĉöĝñ{'Ò3kôĠ¨Ĥ1Á ù§Ĥ 5Fu*m¤R İ^§´‹µ­*éN†á^Öu³0ê^Ĵ| 8Ĝif*Ħ“N„²t˜N0Ŝş÷pOéI\Ò³˜g`tż…ÑÓJ`¨ëŒ¸Ŝ3ÊBÑw?ĞcÇU $Ġóë²Síñú–Ef(é7m‚ÀŬXĜ˙Nxûñ{UÜÒ³i”÷ßüóû!›.Ħ6L÷¤şuFħk7Ê­3RİHŞ6|G-k2½qàPÓ÷ŽÂH:½ÊùÚ)QEރJġè Ae=Ĥ•†[#żv}{ĵ˙lĦ”eÑIİÀè­y˙ÍżxĈ޳<ŬŬTğ#%Y€ÑğħÎèCŻ*ŒT $Ġ %ìT{2Ŝ²œNcJ¸ÄᴝXžHìNó)áhŬĜÔĊ´‚޲˜Z@FÛ#7ŜÚ?óžBİûuĈíŸÒžQż˙ĉ_ÜCUV„=£§ÚÁiaô½?VİHŞ÷ JgŬîbPÂږ4ì)‡Ù°OáċŒHI·£ƒD3` 5JF̌„•ġ8žzh{ä†×ßÓŬ’ÛtżžŒ>ŝğoÜyĜï˙›ŻŜCUX Ù#'„ħO#LW½› âvÛl: ÓİHŞK%Ú Ùw”6 ŽĦ€ġ޵."À‚ñâCĝqċ3•şÉħĊPìgDàDpô˙í×v`+‹<2"ö h(Ÿxž:0ÔcÇ5µ[@R]f(‰ˆ÷ŜŸ€ÒuÚs{4Ŝtu˘ƒÄBWcBoŒš‹Îziĥ>(Bİ.š% È0 †)lD9²cd×ĥbĝîI D§„çĉ]œİŬßyÜë˙ğoîĦ<ž"'‡Œ†B ñ€sŝ‚{F&Ug„„Ġ *’ê%€’ˆ`9”vŬ­oZÊ g€ Ä:€ŜËBĠNJ°^š%Ÿ…š>wg*"$†ÁħN‡$ôÊók·FEïê<”*qg@iŜ-ƒQD]—t&Œ~ċùŭ7Ŝ=ô˙Ÿo=D9™"g f€„ Và½Ge=Šê"{F’ŞĴ™Ŝ {F§R İJnOÖ6­é˘À;BJ„ÙŝwŬ–CÛMÖK˜żÔì#QÓn($: 3L‰„şÑÑ4żĥµvp§†’?Jt NƒP퐍ƒ½ríĈGŝëò{÷°ß˙·˘8š ‡GÊ ‰À;óeċ1­&ÓóĥâFiÂtßûN­uF*’JĦ”“-Żóž{(k›6éJ‡ħĊPì!T‡—ĉ`ÔĴd^š$B‰Û"ZÁ$ C‚„Ĉ0H<Œ!dë·FĠàÚV˙ñİP–§wc ŒĉÁĸ £ġġġW;0úèóO˙àcïzúÍ]“)rR&„9RÎUV‚3şŒbú!g9¤Ú…}çÓqÏHa¤R İJm˘íş]?ŜĴ(5” @IJÊÉI³MÜmö×éßB ‚+⸧d˜° 5 BĜ“ÉĈ·GĠhk;ĝíùì;@œs²À)ĉŽêäî|çÁ`-‚Ñ•ë7?úßŭŻôĈ½/µ‡â¸@F‚Äğfò·օPÓÒ⸸ŒL€%élo:Ŭ3R)T “PÚä]żƒMËitJ q ߉œ€Q½ĴµÙwĦP‰ô°šBĜÎ@CHêħèĈ ġÖÈ o'ğߞé`qÎĠáğù$>%\ׄê"Œòy]ŬĵġÑ˙ŝŸŭÑ?:ôô­]“) Ĝ{â<ĵ ™teċQT6쟷77EŻp{:ÏH@R)”΂RFĥÜä·ëÇ ”D<˜"aŽûJ‹ĵݲĥ3“šuĝÎ SÈ3f†!áĠ[#mß ß|8W<ëˆÈ/€/qG3{Fŭ~?[__?áŒ^Ŭşŭs˙?û£Ŭ z_ó“£)ñ çñ1“.4Œ-ʐMw<µ8:ojw’i†íUğ°ßù´ÖİHŞKU@ta(1³ÏÈ›f×íÊúĤċÔp2 wħ_ܒì;Ŝ Ĵmğ70‡ÔÍĵcc$Œ„€ÄX€„€áĠ[CŒoŜò÷ħ7ŽSÂÍ;$Óï÷ÓñxÜ[__Çk£Ñèµ^Ż÷×ĥ_ûı˙ñŸâĊ ˙ÊÛ1™–0Ŝƒĵ@ ëáœGeĤEÈĤ;žV8š8Ÿ3LGaşjGğvĞHŞKUAtQ(Ùr‹wŬŽ N Ù(ô@Ì1فgĉ* Ú}&/;:Ì9%˜¸ÙSJC‰ <1 Ĵ]½1¤ġÛ·Ş}í!3ûz_݆’µV@éÄWżßŸ ӍF£Û½^ï'ożöÑ˙ùŸ⍝˘Ÿċ?<Âä¸;Ì: g=l ÓM ieq‘ÂH@R)”Δ\FĥÜ2ğî66=ƒ|-&8D—$X£&|'k]3Gİ) n0‰iĈĴ{È{Ĵ]ğ1¤×nU?üÚ3{"ŞĦrÖ)€QŻ×k²é666^­Ñġ?öÑ_ûí˙ŭ{“^ŝċ·âè¨ÊÏÙÒ²ò˜”ÓÂáhêp8İp0İV+z­Q½gTŠuF·ûŭŝëFŸxîqžùí‡8<* •Ĵнu(+Ò:LĤÓÂâhjqt\áขu+v`H€)†éêÔî·F*’JĦôT dv܎[Ûô”Ê×⃠qlE7|×ÚĤè”k=@ǟK,˜ĤĠ! ħ‡žĞ<„Wĥfŭö­êî×F§äâ—wÎù”çyžF£ŜĈĈĈ(&0Ü ŻoŜüÀÏŭÚoµ0:8˜—WU1;£*ŒŽ§.¤vOŽ+ìÛ³a„Ĥ xÎ}Va¤R İJOJĵëvŬxÓ!5H‡FMË-„Qŭ£ t$’v zŬ÷.†ëL=“É;€ œóç1ĵ²=àġÛ·Ê}íĦ1Ĉ‘àbèND„p–eéh4ÊÇñZ½gaôÑ_û­?úĊ{“~ŝċ;ÁĦŞkD\‡² )ŬGIacòB‰ƒc ëüÙ0"š ÓIñöûĴa:•IPzŻ t=yèvüpÓ!5dúğ9ˆ,…Qŭ£÷>:q‡˜QOm' ŬÁ‰)@ ç<ÀÒ͛ċŝ™€'"Q˜™ƒAo<Ö×ׯ­­ŬŠ0úÈŻŭÖ'~ñîq/˙òۏpp8 £6œƒHH鞅QĠÀh˙È6C OwFHLl”šAìnpFÓ·´ÎH@R)”Ŝ+(ċT•×ÍC·ëǛŽ3é ŽC7€·KaTË P– ×I\ÜİstD(…pŸzs`Ĉ7o–1|ÀÇïœeY: W£3úĉÍ|äŝö'‚3jÂt°!mğŠş§Ñ$4I=Œ™tûĞì5ΈŽŠû°ïh•IPZD´ÂӜ%[^7{n§m:ʍÉGÎ(ͤÏ¨ı^€Âú&ĵ-Ħ NÔN¤·ڠÁĠ[ƒdŭĉ­è”<!Iîġz½ápxe4Ŭ‡ÜĵùŸŭ‡żŭ‰_¸wÜÏ˙ìí‡8<,ŒÊ •„,ş˘°FS‡£Ââ0:£ÇÇçèÀĤÁñeyH`ĝîgpµ|[a¤R İJ+@Iž”6Ӈnǎ6­$&鯅ı~ÒPm0żL††ĴÓÒµ‹|Œü`IpNñ1(^ïâàÀÁúö yċÖÍòî×÷1lŒÉ³,[ï÷û›ƒÁà×oüĜÏü£ñ/[²„­<ÊÊĦ(Š˘-r8šgtxTáñQ5}\#ŽÙ$˜ M`P)T ÷JğXß´’ʆ€OĦ£÷"u!UĜÙÁƒ âC‰“H¸>&ß DW9€ ƒĞ7Éúííêî×§I’ ³,ğ’çùÍë7n˙Ô?ú˙Çßğ{œç_óûSTÓUaQTEá0-b  iĝ~x\áà¨ÂáÔÎïYuFÄ `÷Bjwİ0R)T ÷J×͞ەñĤ³Ĉ €Ĝ€$&*Ì?œ\'+'°‡/ïŜGĉ>vP!Tփ\ı1àġ›×üƒoċI’\żrŭĈŭÚoŭ˟{ÜËżôí]ì=ž˘8.PÓÊa:u8žDg4u8œ–88²Ĝ?ĥ(*żŒ8\`N{@U;#Ŭ3R)T çJd³ïzq)µ1ÄEKaT/NĤ‡·N´ZëBsSë‚kr>Ô Yë1-Ĵzíŝ•k[˙ŭO˙Û'^w?Ï˙Ŭ7àÁî1Êi…˘8ž–˜L,&Ә¸0u8œ”8<Ĵp0ħ &žÒ(•9†éúê6JU)TŞçJĠfòîĝW6Céç(Ċ‰²`œhé \\~g£3²Ŝ‡v>N‚“Ş<*çQU‚ɤ€--úWn~úç?vġá$M˙Í_ŬÇÎ Š˘Âñq…ɴ´˜LCׅc‹IpF…ġKŽeI“„ázyRŜ‡}糸Z*ŒT $•êù„’ÙµÜxÓQnÈôAœÄ½¤8äh)Œjy8ȅF§Ŝ£rÁ&ĥVÖ£*';ûŜ~÷ˆîĵóO09.0ZLKéq…İ {EqlÄ´p'ÍÚİÙtˆî 4‹ÙtŸĊĠBëŒT $•êù…×Ni}Ó"1Ä9@úŬ- Í¨EHj(­GQy8ë„PyAUZVP P—a¨t˜N*L‹š 0Ş0™FUn6<·Œb×î4g}ôŞR İT/”öìŽm:Ó3HħĠ‡^΄ÑlŠxċM+kŞÊĦt‚Ò ŠÂ˘°ÓEċ1-,ĤÓ Ç…qáPZÈ’°§%0ÓÔqš‡=#-zU]r%ú¨žĤʲ”,˨³xÑìÒßüì6vêÍŽ‹äJ ­€ìÂߍ|¸˙|}Ê-=RJ^)¤²í!uâfË`4 Ai…E8ÌNm­.MaíìžFlê{FiöŒói-zUİCRİ^X§”>´;vmÓqn(Ĉ>uġì$:Œfš+²хaT˙ÙħΈ³¤ì8#§R İT/:”Ö7§†¸×ŝ H]ÛsA-K%5ıËÓÌÏ;nd2Àí*ŒT $•ê2AéZúíÖN)…4p"ÀĊġynúıa´(LwĠcǓ$ŒÈzFZg¤R İT/>”¸zÒkĞêZúÈ햣MG™@ĵC‘ĵÏ@ïŒê˘Wc&p’AŠ{aì¸ÂH@Rİ.”ĵˆÌB){ävÜZ¨Sâ,ô£XëS§ô aDmçnNb6Ŭw?ĞġT $•ê²CézúÈíĜáĤCHtK1ÍΟx0Ş;0$ Ĥ!ğĵûîĞ3R)TŞ—JÙc·S­m:J %£@”:t'ÏÊHÒıŬŸQg¤R İT/”VĠÙPÊk(eĦ!+ ˙ŜÈ$mQ’ġ<#­3R)TŞJçÑiPr=ÊJĤg(„Cd˘[˘Ó‡ü=éžQ’€’ ¨vž‘ÂHR İ^J(ıJüŽ_·Ŝ„†Ĵ”4]Âg€ô´`3ê8ëĊ}…‘J@R)”Z(]K÷eׯ[êâ´}ާ#â6L—e “„Fİß˙cíM§R)T .”ÊâZv ğvtŬRÏP’ÇŠÎúLôdΈ9t`HRÀíg¤Ùt*•IPZ }Ù­F×-2CÙ ,óRî t>Ġ“^Ó48#·:0o+ŒT*’JĦ´J}SŻfd·]·È ™C@a$:óÉŝu§…é˜È‹4 İŬ.Ĥv— #•J¤R(%olñjŝXv‹ÑuKy;O Ùw'`$XXô ´cÇÓ0½ßNzĠFİ*•IP:”ĜñuO™AÚ9áä<#Hl”Êa„Ää.ìğŸĠRğvĞT $Ġe€ÒÓ(˜=”eäA5,t'ŽŽÈŸ„QŬµÛ˜µ;É ÓĜ(µ ÙtÓÉñ_}Oa¤R)T/.” ĦdĝJ÷‹ÑĤ§Œ)„Dqá)™!PüŻÉĤKIC; ï}vF‡‡‡5Œö;0êHa¤R İT (ıħċf/÷еMO9ƒ3˘KòŬ/އëqžQġöğŸÁĠéÇ?óúĞ_œNŽ˙ĉğûûûµ3RİT $•BéL(9qÌzߙŞh „”)7T'9ÄYFͤWğç½ġĝg^żöĊÉñÑ_~o˙Ŝŝŝŝ£££ƒ²,K…‘J@R)”*Ij(yï3ğ(k›Ž³8XH 8ËÛħFaôîŝŝŝŬƒƒƒ‡GGG‡EQ”Îır< #•I_•Bé”İäDÄ2³àzĤšnööċž]N)·0J2HŬ›¸óĝg^żö…:›†ÑáááQQŬ…‘J@R)”N…R-ïœĞw–ˆlßTĊġìħğoÇ[Â)s6%)¤Ü}çÓ¸ZÜyôáׯ}a:9ŝ›îžÑ29…‘J@R)”V‚’÷ŜF§äˆÈ’jr-{lïÛġm1}#îöo˙o=úë×ŝm1üÍááá;Ôî£ĤSİT $•Bétŝ,Rşï½P‘%˘ŞÏċÑUóp˙ŝékċß~ÎĵRŝż÷>üúµ˙k:9ŝ˙ŽŽŽ·żżïp÷àà vFċRİHú¨J'~/sNÉ{ï½s†R%"E&“½qzüŭê`Çüäk£OVĊôğÇÇÇ?Üßßżpp°wpppÔIíö§Ha¤R=IHCz”eÙ²Žó—ıó}ٗ‰_<˙™MšĤIżßÏG£Ñp4­ġz½µ4MûDÄŜû²(Šƒ£££ƒƒƒƒIQµÖÎĈñ]a¤zi•èK z‘U–t $Í_ö0~Î uùùëcc:°÷ŜWUċ8"rÖÚižçišĤDDÎ9g­-§Óiq||\EQEÉà¸%RİÔ!İT/ħS˘9‡tšƒbfĉ$ILšĤ‰1†ë/眯ŞÊÙ o­u œ…‘J@R)”V ċñüŭ˜™/€÷Íl ‰—e¤$QİT $•Bİ :> a4÷xŬç“_ó‘%Rİ^zi–êRé ³ïdÁċEßÁĈ-ĝY–€Ç/¸żÂHI_•:§tÖeZâŽNsIË —@Ha¤R İT/1”°<‹@ÄsŸZâŞV“ÂHêHCvŞKĞÂwÑi{DËöŒVqC #•I_•BéTĝ,–\öK€Ġ…:ßF*•IPZ&YLË`´jNV€›ÂHġRJ÷T/ì)Í_ċòüç†NqTX< #•J¤R(­üŭ´û¤U@¤0RİH*…Òİgx-ÒRdzêu #•IzıĦ´ ˜VùÜÈ9œF*•IPZµ£yĦ$”ÂH@RİÎXpŸ$ÄġĵżßfމˆÎë†è,…’ˆÈ {tÖq. A áçôïV)TÏ1”VÔ*ż{ß{ eœÎsìËĈ˘ż Z%ŭŭ"aI…‘J¤zâ÷Äe‚Ï}NÔŞyQ§ )…‘jĦ´0Vu^ ]Z/ê Ñ{q|Ïû",¸ÂFġT¤#ÌUïĠ˘vŜ°=§ÇEAuÜÏ{ù·)°T/ÜŞêùsHOâŽôŭöâX<-—¤.J@R½§0:Oš´ß.”.šA§PR)T~?\$ġû<ŽIġâÂIÎE³îTşİT¸hçÂj ô½vı@´@çn‘¤PR)T…ÑY²Ïë¤T/ĥ#ZÖ0ö´"ÙU“J¤R-…É<„Î;ŞAĦôâ;˘³Fg,ÓYßH*]T+Aèˆúŭ>‰ ‡CcŒa!ffc ‰yïgĈ5ˆużÏ_ŻzNŜD²ìşÎï˜YˆHœsâ½÷D$Óéԕeé‰H&“‰Çj3ŸJŞFZ‡¤:Œz½Ç¤ßï'á0MÓ43ĈdD”13{ïIDhD])Œ^ 0uÔ½ÌÌâ½÷T9çŞ"¨:::rŞÉd²(\GKĞT $…İPšZ__O666òÁ`ï÷ûƒ$I֌1fîH0ZŸeNIġüBiCŞ/  òŜOs“ŞŞö§Óé!€İµV&“‰]§ÁHá¤@Rİ–Ö Í|ċyÎyž§ŭ~ż7 Ĉyž_K’äUfÂÌkzí¨GŬÑ ê’ş˜ Ŭ9™ˆÈ÷~ÏsŸ™÷žŞŞòğğğnÉ˂÷š‚H@R-tG żD„ó<7yž³,{ġÊŝÎßŭ;?˙ żR•Ċ†wv(âsñ>‰Ô9™?7K5k‘ ˆÀz™Q¸9sÍMëßÍ_nž"vC38‰–žÌÏ­›‹š#Ö~tÁ’Ûìñ²àAbV ÄǛPs/@ê˙e7lDÂ++ñ‘p@à½`Ĥïkó·Ìí!ÉRzÔÉ\°1‡o}żzX~ç˙ŝ?SyàÓ4uI’”Y–Ù²,Ŭ’W”WF@R½ÌšwE‹\§iÊišĉĈ˜Q’$W{×o}ĝ•|ìżŭá~níÂâ_ߋçaiĥ·ÉÄ Ò„`˜`ƒ„F6 C'18f8 •h#6oÈj½FcP¤]ğE<àÇûĊ}¸u€ġëĵÀÄû 2&ˆ|Bp”FP(Ĝ`Z9LÄbĜ[WÑn2ˆâ\w:œIkfŻÈÚÒ}˙x,ŸĞR)TgÂq1İÇ÷L ñ}XT~b!B9.œE Âbì+qĴ„ÑO€^ ôH !! Ëħµ1dUğéĴ^aa ċgèŜ͆ÁjHĝN¸ÍÏ­{Ò:‡f…cèĞŞš“ĝÙ=–ÎeçÛŸPthÒş•–(UÙ<¨]ÄĈ$4â>ñşàzâß÷ƒı âżŽC+ĴaFħÈ×ûMŒÌ ñHH Ëı!däÁ ƒ !ĦĤŜuÏHuˆ‚?ċ8ĉ>˙\Üñô×déSÈ)/ëÉż‹HB&ï Î1ĴeT9£(“İ›ih× !|*>şJpìÔÁ1µżŞĞOnċZ*ŒT $Ġ‚É28qŬ}ĦӅêtl¸°Żà;0‚yBÈ #3@Ê ĉ¸?³gŻĵ³ £4Ĥ¤s}ŭsÜ7òŬÛH7ÁM–ÀON,aĊ)˒µ–:ßÔ¤žÇ„uH“ò>Ÿş^˙nñ?à)0:ċ%ċ˜í˜0!5„4!ä #O &SÛy蘴QozĊ0^|=yïı"ÁâN ˘ÎH@RÑ9ÁTw_¨Q̲×ĤM{gg`% 0"‡ZŠÎ£2"ï×$*^|¸ìëۄtg Üĥ½obÒîtû ĉHÎÖ/6-€LÔä.ĊßĊë)BŒ9l/qÌÌ£sÀ¨ûK˘pÒ`˜‘Fj€ÄĴ]”ù^µöÇ.Ú/8ıQİHŞ• E§…ïD„œsFDXê˘÷÷™ ĥ]b  ×µDÔlƒž|¨+ZÄFi÷pÄw}(èt"N`ğ×K )_;"Âum†]SU,>Ÿ?ËÉùœÑ™aD‘NAo[ĥJ%nÉ´ÀA]Ċqs†BZ9S3Y`8\obħá\]ìĝ$_jÓ0Puß&uĉamGC˘HÚí:¤y—´L‹Ŝ‹ *’Ja´´É*wĤ˘CMb¸Ĉú]× uŠX}t/Ŝ.ÂHD: %š˘:Ä T/”·ëlR}}÷ĥ>ËKŭûĝ˜0yï>W'œ7{:0’SĦ ѵ ™b˘Ĉŭ0EÇÉRár,.6B†Ĉ„“ĉúŝTDè„ûZX{/pNš×²Ĉt×ı5K¨.İċÄmKxt÷ÎsŻQ)T+…îĥjœŽ“A̸’ÎNÔŞúzÁó.ˆÀ>¸vŽÀvatpŜy³Dĥ†’óñ6ÒÀÊ9ëZ…ëbOü’ˆÛ³…Ñâ°Ùlöß<ŒLJ Žv@&†D!$†‘0!İÁÔùŞoÏ܁`'Ż˘~­ÂëêBË!/³ĠĴ3!J İŭâëßSHŬ=$żÄqkèN@R £E BFmb@MQŞóèÄÀ:Ž'ĥĴñë=ÈQs=QgïĦÁE‡˘3².ÀÈÖ0r6•óá²mŬ’Ğ3ü–îċĵ80Âßt2sÑ ‰a°!¤FiÂH !aÀ˜pÙP )ŞCİL3d¨÷Ŭœs°.ĵžÎK&Oì—y2 @ĦŸˆ-ŸŻE+ĵïT $•‚ii8ePuUq"nÚÁQ·‚'ì÷Ä} ë|HóÇÚɍ™3ô.!4 SĊŸ+çQÙeœ„Ç%‘,K–è\à L+ß8Ş,a¤IHĞO !IZǔnUíĜìQĦŬ[Ğ]RċZ÷Ù|s)òŜÚƒÉÀ\␽·Ô)İHŞÎ§„ìè”îvşi–­z˙Çz‡ÄX `Lm{ Ħ ÍI ÒI€P%¨œ[Y‚Ôş³ÂBx˘u ß>áÌl:Z™ç_PVÔ\AK`äO.ߝŭ›ùä /‚ié0-,œRÚİû2MĈ7{Mm–^ŭÙè@]œlEGm÷Œ6-d”NsMóݲBI¤RéŽĉĦöĵ‡Tuelg‘Ĵ!=ĴcTúùxnŬQ7ëÍĊ°›mÎÎ=*+(mĝîçğNŸ£%ŽċL'A°Ĝi] µğħ F8FX~rÊq„×ÑaZ8¤i„RzĈ#M¸Ù["˜|ÓİÜKĜ·Ğ\•:ïáb/™RÖ¸OX'‡HlœÔIjX֎JR İÎÂ[0Ó¨sĉKš~&a fHĈ8Sh|È› Ġu`ԆäĊÌÉç€dÖÉ 0ŞÇT ٙQN§u`˜s@˞˙TuGfܝ#š=ê„%çŽCG TÉĝӐ.Î ´pqXë— aĵÇBï*P–‡Îë23|‘@iÑ J@R—Ô‚I$ä;X0·ŭÒ"Ĵ gë׍TQo˘×a½z6 ´ÒÎĉ„589S(Àˆ–ÀĤCg}ŸÓÍÜ×ÇYJ Âcsc fœÑÒç,Št- Óua´0LçgY5ß ‚h‰ WÔ°oÀTy$ fBwġ­Ŝ³³Öú…Pşc9Ú^Hóӂ šÜ R İ.˘[Ĥëş£zħ‘°ĥ²HĠÎêĴĜÖ{T!\'>4SEH~ß Ġ P–.<ÇĜ‘1mXÈù0~Ħîĉ œ%ÒȽï´`˜=‹˘°ñ.’ÔŬ´cçìP1“† 5ëġL¤anwú]Ü“Nc¸şj ³ %Ü)84×7s˜hÊ"ħ:›SÇeĝĥ0µûœġĈ]]A[·@ìLTĤH,!anêšêN!ÛÑ£ŞBRÉ à6£@’öïYì²ÏûŜS)TŞ‹-À× ²aÀÛgè• L·îĊwCu–4Lq\›8ċ5 P€rŽ“iÛŭpjĤşöI(LH­“'™ #bˆwÍNİiĠ°=n:nĊĈ.Î0ʲ6qÁĈ&¤œփŻ‹£(D@iڌżĜˆ­Âœ$vmMW3— €7Ŝƒn†’IfC‰ñ1‰Ŝ†Q Ì ÄğX´Líkì=*/¨*c¤Irh2 baqĜC’“m3°h0––8£E×kƒJ¤:·[š?ó%"Šŭ59şĊ],°tġ#…yq³‰ “e)á‹-ap–ĊFn5]005“^c­ A“ĠùËÎô¸mÁ6>t– „›Pb†T6"žġsè}ħ.8™¸h׃û8ŝÂG‰Ä˘œš–?³)N’ Š 5 ŞB#şĤ×_ ‰<ˆœBpÛ9êiħ 8@F Jc[ O@°z“ÄA{ĥ‚07錺hĥ-”ġ aT_ŒݞÛ Î†ìVyÏ)˜T $Ġù@ĠYhÚĠ"aŽíH3ĞSÌ  úÎh‡ë% ™>Bùŭ?ƒ?ü¤8lÖÜ:dv"ĦkıéST‡°êĠuf+f×LfmŽêĦyÒ:›ö`:ötv£Ĝú ˘…‰‚'öžÈÉ\'ı¨FiasĜÎïaŝ4xüé+a¨óïኒOíX>ŸMAaP"aɉ‹J@R=U/ò†Ú…{ŒN,ns)ÏŬú~ñÇܙĵ>šÜĊ(^ċŭԋXÌĉ),]úCĜɵŝŒ;=;=…2P9ñgQ33£6˜9aĤ„ü{¸âĉ„M°Uç@Î1>£yžV/g½_N*’ê‰Âv´Ò-m;)vnĠ<FˆĦ7çÁ)Á³A:ZwC7­Şj§(Škíĵ/êGˆ‘™“şMñžĉ<£Ÿ.œfóĝ:m|œ§&]ÏòìĠ4\ùß’;? <ŜŸ Ä@/£ÚuB…~İT $ĠS9ĠŻ\ˆÜûÍŻü Î(^ï$¸,”&€IàœÛŸL&?8>>;N;çĤġ‰È£3hPŬë.çĞ>—R=疚&¸ñĥœ$IŜï÷_ •1Ĥ7e0)*ÂŝœĞfíÚ*0Ş˙në–*•IġìNԙ›ôä%·Œf~ï1Á)Ċíkí˘(öŽŽŽìE1é€GĝıŸÁé²9.¨ Ħˆfşjôz½÷Ŝ&I’çy~5g s+Œ˜Û”ŭUaTÉÇ Kݟ•Iġ~ËwÚĜÄl·óÁ(Ĥc×dJgŬÄZ{8N÷O&“ brBˆÎÏÁhL— Jge>.Ç/²ÖÚ,Ë2kíĦ÷ŝ8ì-yx àĞÎCÉj0BÊÇp˘H@R½żŠYq˙@ĵ[F37Šğ‰J@ĵ9NDĴ÷rΕµ3ê‚İë˜ĉžU.ħCê‰ç 4$‘JDĴˆ˜³PĴŻ· £ùYΨÎ. É,bMÚV)TÏÁúH!XĵН?'Œ:‹\隢Ġİ“\“àĉ`´ JXà–.ًHĵH\|-=yĵé:‡3šqÀĦ ™œÓ‚J¤zä"Œ™–‹Ï´—Á¨S $΃ó4„ÚlQä–éĴŬeÒİÎĦ:LˆÈ"ìıù†)DĦ֊ş÷ç€BïBï¤ËğĞT $Ġ3‘ĆŞÜé0cR΀ÑÜUÓēˆĉadƒŸJÀċٝ £xı~=b 2Lî҄Yŭéğnó0Ş]ĠO§R)Tï·ü\ÓÒUÂt‹şv×}Ûĵ€bSˆxFïêï-ƒÒ˘ŬeÒi}áj*ĝ9Ġߛp]í’êä‘pùœ0jŝí]_î5d§R ݞ‡%’CQ Söǽ2Œ$6fé­ÙÉ̓INÒË$^aéÀ(ĵ63ëD‚Ó!ŭíΣúPHbWv•J¤z?%h;gw‡OŻĤ“™y=ġ8€¤²‹gġ]ı3\Ò|re:˜OfXäŒjwîÔMh¨/é`~nĠó£Àgġ³ R ݞœtŠbÏ £zy­‰ĥŜ𤆠Z¤Ëĵ4ïüŒş š˙{\’@Ĝ€È@|Ñ4H]ŬĊ‡”´ÄÉlŭ™J@R½/òíhxYPôzš3êžmS·xVßżž!͇ïpI 4ߎ破(а éuœf;°Xx!u:’;ğ˙ĝCc|RĠXēDÄU5*$(·§sû×&¤z䋀jòGÒt)2R3 }ßüĉ͛ßïûŝóë>q( b ‡Yš²ëR2Ää8 x–2ŞĊ4ÊI Ğ} ‰ÜÇ@™Ĵ)´-#8rWÌkI" 1‡‹”ßÏk  ëşÏ‡£ˆ„‡‡‡ÏÌìİDEġâġvO½eíĥוÔNgN×ígM`¨·Uġ£ë~Ö÷ŭİêgbOž%’ĵÔĞKf“”veTħô=܅ĦÈ‹Ÿ²Ï{‰Êŝ˘=Ġë1ĵ€ŠBĊ ž+5àá§è~ŝ7Š_~!‡áOú˙İ™}íîÇE¤V<ËhèĠEGkQÒòç¨êmyPĠOEäògĝ˙öĞw°èˆÄqĘ c4 úĉĉb œdÓi€›Á™Ô@($òÒçì2mĴÌëG—eTĞ< Öċ섀>E¸9Ŝ>tĝÙÏ˙üżúÛżûËżĝӟ@Ë×d‰yYoòı,‘H]Θ˘< Èk#uÏɀRÄĉށ^:ĤĉŞíVĤĤ|\íl ŸÓÛK•sò‡‘eĊó6ÀYİš][ ĠÔÂzìjß(÷jדcêċ~GŽnÜìʟ%'$ 3ËéÜÉDŽ˙ċïîŬ—8Ž 0Œ h†´/£E 7´Y„"„B"/!ĠœáäWɨí÷6Äĵ^Í{ĊhŽ1:Ŝßà?ŝç ˙/˙îġú> ô -5ïTqC§Š+‚{Pö8•¨mL%­ôm Z;dDq’R6umö”ŞäâħµüQmá]ċTšĠÍ{rd~îš9 R^Ĥ&Ĝü|İım†ÚĊp’cE”ËfsÏ˘˜fıԏCrĈÜX7bŒFÇ8DŒcD|0&0)ùÎ4Ŭy‚ÔIüĦÈ‹J`’ÎG²MC;ŽCĽcï8Œ†î`ˆA% "Ĉ. ġ!ç2 ‚Àú€ úĥÛ[L’9ËD/ĵÊ\ĉ¨ ˘Ùàé^ZdÔÈŞN3ĈX˘İ²Çó'‘ı*6·ü\ÒX­äÜĉfyCVJ%QŬÊ|$šĈ2=Oš²á€qŒ ˆÑ£ÁDóZòc<{4 cLˆcÄĝ4btÇpÊ>¤›eT£6Kŝ kÙ ‰Ü…ŽšŬü·É¨İaĉ80Ž#Ĉ> #z èú„N]è‚"]€ÂÑu‚ï`CD:t!@jí<óÓé&1`,ÑK;ÍÖN½ıl“Mĉ5˘šŜvKŜ75‹FdĦ4ÑÏô˜ĊÀuıçȨùžÓä“qŒY21aLŽq0 Éò>/×\iaó~˘òQócLj8bŜ {>•x­Œ€é÷Ŭ˙ ‰ĵŒ]]Ĵa_)£i¤óż ˆáô½Ħ#zUtĦ ‚ ıZµ†ˆ ‚SÄ1GS}t SE²˜´´şñ•’ĞiXOŬ–ñ8q³ġ;Ĥ•#³(ı“ÒögÇĥÜ,ψšM)ÙYD†='"ĜËĤÖÓÇ:b´œ´Pĵ‡9n—‘œ„·@§\?"ı)Y^Cò¸VfĉJüè¨ıqhGਆ>ä*4ÌŬgğNE²œrt”ïÓr;(¤Ĵ/I‘“ ĉèÀWċ-K\:*vŝw§ĊN§ġÜs 93ħd!eÁbÊÓscôIFĉJÉÊڒMĊQSš³à6 ŜĠ;ò-Ó£çí…D^p².5Ûî´ŭ„½—ŒàçMÌDz7Fdnòׅ,‘R4K(d9…P’T (Q“–ÄÔ·/Fàµ)Ğ͸qG`§ÌÁ™— ú’ çsMıñÌċ|bÍ/RšlĞíĝw%£1Ş•yI°*ĦÈKOە}Uĝ8”Áìŭe´6J3ˆ× cı#(r”¤š#¤0·KHŞDUuşOŞA`‰”ޘꋋÜ(£Ċ&ârŸeäfı!^-pjı1Ŝ”ÀP"£T˘¤!fAU!Ċ½B¨ß‡ŒĤ_nJ 2B"yÑ(İĥœ˜öèÄo-£eĠí@Ärzó8"AeŭHJôT#İPZq­2Êï]DN£$÷-lÏIù5ÓtëŸ1oÊQ‘/…ÔÈ(GK%:J†1•(È/½ŻïPFgħkβ›˙ö„PHä˘#GŜÛ3 Nß½ŒÀ4¤0XŽêŭA³ŒBÙ\y“­ÌëIġĥlĴùŜ :òß(#Ÿ6ħf)ÍBjkËĠiğ³ ä—ÑÊkğC4œìÙŬ˙EB($r£kL€Í{n<7èûeäŝZµşxŜ#´žÀ %í[šû딝_ôo‹Œü$QϛD†µĦÜ7áËË€v%k™vĦÈ*, 5ƒĵÎġ_NF{ɧ‘•Ŭ}‹işŬAŝC‘PXz\‘bÇZَ˘›2rÊè•É€(\n§MWZĝ…h‰â"8eGÑÔcèdÀIMĊì”6dYa›“kÏòU֒;k¨-žgqÂîWȨùŭ\`oPŸßËvj·lĵÛß`ğ'#\z_×Êhñŝ°RayÇÚó‰Ï¤[“ѵ"˘Œ#$²ž~élv’“Öv áÛĉ ğ³OĊ}=“Ñv[F;QÊU2Z‹ŒööùûŒ.E%·ÊߕŒ.DFâSżİڅ„½ï_ñ#„9;[Ŭ[Cj;ħşyéĜġEĜ!u„]D Ó3Ûé]r:-£ŒùäŬç Q€ŻE)mí½Ġiş•ŞŽ\uù²+ÑĜUQÉZDÒĵ'—Ëb{ˆ½ŭw9ÙU!^#£ĠPd$’³ìB×Ö2ĵÔ:žĦÈ·’“ïÜK–{  ĥ‘E¨IDATÙ\ú´~´Ÿġı[ÊauiDÎÙ3íL‹mF0+żsË4ŬÉ}"£ġ÷ğâÄYş´Ż`]b·FFWLÓɅi:äv󵅆xÛ¤pj#ïMg_ß8ÑĦ”…DŜKL'×eIF7Œ’Ş;r8ÀS„‡tM(™wuÀ*@kësˆäN›™˜€Pz™ç,>ÔVċçfŬ )ċúAS•…ċ¨šŸK‹€N=jC½ı᝸ÍĠĤ†}E°Nݵ­DÛ9ċvŠċsêÔAĠkŻ£ÚÄŝîI$rµ pKM¤$€V™×Ĉ}İ‘‹Â½4ò3Ì­$4ä÷jĞ ¤/ŸÇJÛñE3ÀúÇİŸğ6/œž\O%2 yħöù1ĦËc0÷¨îħ|?l„†ÑĦÈM‘°žQçfŬ}t÷gsyž6tşRÏcŞY•–ß1A‚BŞ B€Ċ-{íY$‡éèZ%´ËguíÑô ”"FHßÁc,ıMêĵ7ĵ´÷yó0 BJé‰6‹Ĉ<'d˜ÍaËs#Ùé´˘eJjĤµ,Aĵü÷ !‹Öj³òœ–ĉÖ “¤CñP75Ŝóĵ§6òòü™<ŻÓ4Íŭò’Vyîz]ċzIĦI:‘·˘O>ÇÊ×_Ĉ环ëhċ‰7NŞğíÜqáĜ­Ĵ9vŜÈâĊlÄĝ“?ŝµÙĝĠ0 ǔRşAD„PHdwÚny13³aâÓÓÓ7]×ŭĉí—˙úÏŭŸŭ/ŝàsùLU?ğğ4§çh~>ı vıç•ÓŒÊĊŝ"1£ğ?Ĥ”~cüßççoŝëéùùËçççoŽÇ¸"%`;a† ‰œEC²%Ù0 “ˆüÖÌ$Ĉxìşî7ŞúVDtE:êîZ´¸F+,r—'$Xf˕ :`ċ:ıûsJé]ŒñwÇñËÇÇÇŻžžžžĈqŒ;Ò%QP!Ğg°%“ ŻhOOOG_˜C_Şê9Ŭ sw-B’öv+&Êèŝż€P%TäT…Ŭ}4³cJééx<†áéééiˆ1ĈòŬ1lOÛQ<„B"—dVÏh €ŒSJ†Áú!„gUítŞÚ•¨(4Ò"% W‘Ċ´(§ğŠ’Ó=DV˘%k¤4Ŭ6³ šYL) 81Ĉhf†ë“(&€û“HE›Ÿµı—\//şr­‹ç‘• żƒ÷)%߈”ĞdR󳕟×.ĥòĜöyĥö*QPŒÈ<)ÙN´´&Ÿ­ ;Ĥy ‰lJh­džhl%BZ>—52JX_7â”Ŭ}FÇkÑÑ­bZ›Ŝğ”mÇM²„B"İċôŬ2âY’,Ä´·–2úÄ´·äX_C˜òM($òÓR6ġßµ‘L›À€ !ûYu”ÑŭJi+ÉBÚûıĴĥÄDŝŭÏnŻE3ş¸ŬŜwéÊ胎”ü†hiMJ{2bë B!‘ĠïÀ–4Ö"k%$Wıá=Ä´WŽB"gpʎ´ƒV’ƒ`}î˙ڈh/2˘˜îSF—ätMï[dD²)Œ½H ;Ñeô’pıüÏ52˘˜#$rS¤´ġĜe4E½.1]j;&KâĦ€#$rġwAnŒ ĥŝ 7ŜGî+BştßµÒıFp„ƒ!WG2rĊí[""~˙> !]#żâqĴÒ@($ò­żò=†ĵNiù{<†""ùÖߍ÷zwíġEM·J‰2"$È÷ú=ĦŒ(kC ä7ü½NQ@„B"ün‘JR„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Bî’˙˙âäxÇäęIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_VolumeMute_16x16.png0000755000000000000000000000560112467662066021530 0ustar rootroot‰PNG  IHDRó˙a /iCCPICC profileHǝ–wTTׇϽwzĦÍ0Òz“.0€ô. QfÊ Mlˆ¨@DE €£ĦHĴˆb!(¨`HPb0Ѝ¨dFÖJ|yyïċċ÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Għŭx€Ĥ0YéİAîÁ@$/7zşÈ ü‹Ŝ HüeèéO§ƒ˙OÒĴTÈ_ÄĉlN:KÄù"NʤŠí3"ĤĈ$ŠF‰™/JPÄrbŽ[äŸ}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\NĤˆo‹X3I˜Ìñ[ql2‡™Š$ĥ 8Ĵx›ˆ˜Ätñrp¤¸/8ĉ p²âCı¤¤fóıqñş.KnjmÍ {r2“8Ħ?“•Èä³é.)ÉİL^6‹gŝ,qmé˘"[šZ[Zš™~Q¨˙şĝ7%îí"½ ĝÜ3ˆÖ÷‡íŻüRê`̊j³ë[Ì~:ĥ w˙›ĉ!$E}kżñĊyhây‰RmŒ333¸–‘¸ żë:ü }ñ=#ñvż—‡îʉe “tqŬX)I)B>==•Éâ ˙<Ä˙8ŻóXȉċ9€˘yPÜġßûĉƒâ›Ĥ:ħ8÷Ÿŭûp‰ĝ‘΍ûçLg ù‹kâk €$È t!0VÀ87°ĝ`Öˆɀ2A.Ĝ @Ĝö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`ĵóa!2Dä!UH 2€Ì dıA>P ECqBı¨*…*ĦZ¨ú:]€B=hš‚~…ŜL‚ݰ2Ĵ  Ĝ ö†ƒá5pœçÀùN¸ƒÁíĝ:|Ÿ³@ˆ QC â‚ĝ!H,ÂG6 …H9R‡´ ]H/r AĤ‘w( Š‚˘£ Qĥ(OTŠ…JCm@£*QGQí¨Ô-Ô(jġ MF+Ħ 6h/ô*t:]€.G7 Û—wè7 ††ÑÁXa<1á˜Ì:L1ĉĤs3€ÌbħXyĴÖë‡ebĜì~ì1ì9ì vûGÄİâÌp‡+Ç5áÎâq¸yĵ^ oƒ÷³ñÙĝ|= ?ŽŸ'Htv„`Ba3Ħ‚B¸DxHxE$Ġ‰ÖÄ"—¸‰XAàP4407°7ˆÔô&Ĝ9¸$ĝAˆnˆ0¤;T242´1t.Ì5Ĵ4ld•ñŞġЇ+„s;#°Ħ ³ĞŬVï]=iY9´FgM֚ĞkÖ&­=%ĊŒ:Ž‹nŠŝÀôcÖ1gcĵbŞcfX.Ĵ}ĴçlGv{ŠcÇ)ċLÄÚĊ–ĈNĈÙĊ퉛Šwˆ/Ÿĉşp+ı/<jĉŭ$.$…%µ&’£“Oñdx‰ĵž•”Ĵ”TƒÔ‚Ô‘4›´½i3|o~C:”&½S@ŭLġ u…[…£öUo3C3OfIgñ²ú²ġ³wdOä¸ç|½µŽµ;W-wsîèz§ġµ  1ş7jlÌß8ÉcÓÑ͉̈́›È3É+Í{½%lKWrŝĤüħ­[› $ ĝÛl·ĠlGmçnïßac˙ŽO…ìÂkE&EċEŠYĊ×2ŭŞâĞ…ħ;ûK,KîÂìâíÚí°ûhİtiNéĜß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§˘sżĉŝ]û?TĈWŜİrj­VŞŜQ=w€}` Á–ċš˘š÷‡¸‡îÖzÔĥ×iוĈÎ8ü´>´÷kĈ׍ E ŽŒ <ÚÓhĠĜĜ¤ÔTÒ 7 ›§ŽEğùë7-†-µ­´Ö˘à¸ĝ³o£ż:á}˘û$dËwZßU·QÚ ÛĦöìö™ŽĝŽ‘Î΁S+NuwÙvµ}oôŭ‘Ój§ĞÎȞ)9K8›vá\ÎıÙóİç§/Ä]ëŽê~pqĠĊÛ==ŭ—ĵ/]ıì~ùbŻSïı+vWN_µızêZÇuËëí}}m?XüÖoÙß~êFçMë›]ËÎ: ^¸ċzëòmŻÛ×ïĴĵ302tw8rxä.ûî佤{/ïgܟ°é!úaá#İGċ•×ŭ¨÷cëˆċșQ×Ñ'AOŒħĈž˙”ŝӇñü§ä§ċލ“f“§§Ü§n>[ŭlüyêóù邟~Ħûâğ_é›Y53ŝ’˙rá×âWòŻŽĵ^öş{Ööñ›ä7ós…oċß}Çx×û>ìŭÄ|ĉ쇊zğ>yz¸ĵ°÷„óûÌ;ĵl pHYs  šœĝIDAT8˵’Oj„0‡?–r‰ìC—Ċ;oQìÖKx„s›cx‹‘"…Î4Ż›TdœŠèƒ yżïŭ ü£=&IrĞĜÇ4M÷·Š lĵ'à´Q,Ày+à„Ùy ½¸'í7]{TJ=Ï*Z¸Rê%‰-Ü]Ñğ˘(†qéûc Y–‘ç9]×-f0÷3 ÖZ !ˆsNʲ眄ÄZû·0ĈL"ïŭ3ĈL€ÏüĵĈµN@êşžÄŜ{İŞjžˆ`ìbï‡ [+¸f`ĵœAÓ4‹Ĵíŭ xÛ²…_MkŬŭ­uû $×ĵcĝ°IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_ArrowUp_420x420.png0000755000000000000000000015733212467662066021174 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFÔIDATxÚìŭù—%Ivß~Żıû[#"—ÊÌÊŞÊÚşşŞz_Şh M ³$ ٔ4š&6HĉÌóÌ’¨mÎhF#r¤™3"€!R8$¸ġŽŜ7twġRû’YıDÄ[}ħ{ç3s7÷çŝâE.•‘YfçTeċˆ·şÛÇï½ßû½$"+Ĵ°Â +Ĵ[½()Ĵ°Â +Ĵ¤°Â +Ĵ°Â @ +Ĵ°Â +)Ĵ°Â +Ĵ°Â +Ĵ°Â @ +Ĵ°Â +Ĵ¤°Â +Ĵ°Â +Ĵ°Â +)Ĵ°Â +Ĵ¤°Â +Ĵ°Â @ +Ĵ°Â +)Ĵ°Â +Ĵ°Â +Ĵ°Â @ +Ĵ°Â +Ĵ¤°Â +Ĵ°Â +Ĵ°Â +)Ĵ°Â +Ĵ¤°Â +Ĵ°Â @ +Ĵ°Â +)Ĵ°Â +Ĵ°Â +Ĵ°Â @ +Ĵ°Â +Ĵ¤°Â +Ĵ°Â +Ĵ°Â +)Ĵ°Â +Ĵ¤°Â +Ĵ°Â @ +Ĵ°Â +)Ĵ°Â +Ĵ°Â +Ĵ°Â @ +Ĵ°Â +Ĵ¤°Â +Ĵ°Â +Ĵ°Â +)Ĵ°Â +Ĵ°Â +Ĵ°Â @ +Ĵ°Â +Ĵ¤°Â +Ĵ°Â +Ĵ°Â 눉ˆÂ'֑Ċ;tQ½/ +*ÚD ’$‰â8V£Ñ(‡ñp8ìƒ~’$^Ż7ŠxÇñH)5RJ‰h¨”*†DÔ÷ŝ‹‰(ĥQ’ğ£ÁeÑöż@&"İÖz)" ÷ŸÖzµži­gEQ,²,[Ĥi:ϲ,N§Ùrı,²,Óóù\&´€¨µċà.ÁQùĥ\÷ŭ_™SÑ€VX·F›DE­  ÑxsÏPƒH³ [,Šċŝn E°˜ìgóÉ^÷òKûûŻĵpeï^›^xùRQS™0óDk½§µŜ‡ûyžO‹˘˜ŒÇyšĤóù|œÍfù|>/Š˘DMm½K„–ÚQ€ÒmyR˜ÍGGêÎë @ ëvƒÑ& riıh0D£Ñ¨7{ñx8·’$9–$Éħ8ŽODQt"Š˘Jİ“'Ïé‰ӃïzâğÏGgî-rÁL3–ÌȸĂ…³Ó °ĵ’bR˜ï“HĊ½ŝ]q?" 0<5Šî&l?úäéÓG„(Oġ|÷Êòò3Oï^ĝö×_|ġë_üAQW˜ùJŻ×ğRĊî`0¸šçùîh4šŽÇÙbħ˜O&“l>Ÿ‹Ċ˘h£]üY[ Pşŭ–ÜÉvHaUFNX Ü÷á0ÚŜŜNĈqkkk4 ĥûŭŝñ$IîŠĝt’$§•R§Ï<ôȏŭÄğ÷ħ·ŬuìÁ7mOµ~Îx&ĠHwS¤…`;"ôH!R‚X€cPˆŠpoßlnwgtD`!hıf\ÎÏċ İ(îß5żó§ĈĵçC÷½ġ—=9ñ‡ûŻ|K/½ò/}qċÒ ZëKI’\ìġz—ƒÁĠáp¸; Ĥóù|żżŸÍf³"ÏsíÁHĦŬ­ĦY[ Pşí‰d?Â;”JHaeµèÖç(I’h<Ç;;;½ñx<F[ƒÁàdŻ×;ÇñÙ$IîéFçŜóÔżóŜGâ§îŬ÷À֕Lj.¸:×X aĴIPD ˆ„ @¸gK‘Ŭ+"*÷ fC+­……"lp"АÈ´, ÁNââžÇOž}-'úĊżú޽ïóʋŸû×O_üúŸ|KkŭJÇŻ$Irħßï_ ğ½^oÚï÷óù<[.—:ÏstDKĵ&B Pş-dŽ›Îˏ¤°Âşé)şƒ`¤šéı­­­ÁÖÖÖÖh4:ÑëġN÷z½{’$9·uüě~ü>úc}çÉ œiĵ6/0/Â@€!="Äb"Dd¤(Eĉİ~@RDN"GfA3A P° €\€hÄ d°$âÜÛîzàŻó'ĝù ï~ñßüoOżúÙù$I^Œĝ% §+ƒÁ`w2™L'“I6™L²ŽhI5 t'FLHa…uóĜt@ŞĦfT´½½ŬßÚڍǃÁàTżß?ÛëġˆĝÁŸĝ‹˙ŜŜġgñMûŞżP0sT3€ž}e@)  RdtŬ(/EBŜĊ*ÄíêáĈ“&£ e ÑLÍ+B΄œŭÈHÁX!BŸJ{Ó£cŝ—ßs×ŝÜc/ü“˙÷W÷ûġŻFQt"Ž—’$ıÇñċ$Iö“$Q³Ù,ŸN§ı·MùòĞĉġt€Òm RtG[é …uT˘£ƒêE+u"*Iµ½½ŬÛÙÙlmmmÇ“álŻ×;—$Éŭ]ïù_ŭ•'äô½3Ĉ$gäƒ`£!EˆP¤€¨-fĤj@ZŻXۜR#Ĝi1 z (˜‹INèA°dÁ²`,µ G„v·ÏŒîú+ŸĝàÉï~ñÑ˙É˙ç3ÙŜ•ïFQ´EÑ0Ž‹I’ìĈq<‹˘HÍçóÜFK~ʎ;­”nğŒ€ĵāAöVX7+UwŒV˘£ápÇŜÎÎÎpgggg4 ÷öz½‡ĥŽüü_ù˙Ç?t÷ş²ÔĜÏ QĜˆ@/ާçU$>`d}D6œ÷"(CTTÄlžG+Ì FĈ‚œC" cÂĠÇìÌżüËOùÒg˙ù§‰h'Š˘QEŻ(.Ñĉó9,”Ş^€ÒqT^ΠH …ÖM€FÑp8ŒvvvzÛÛ۝c£Ñèlżßżżßï?òàÛßġc˙ÎŻ˙ŸäñNïrñʒM}‡]È¤ç2'@D&B"oĉµˆ¤~Ó:X‰ûÎOµ˜+ŬˆR²€Šˆ1E„E!˜›6[,X0TÀp{+^ŝıżòÎ{{ï}˙ÑóÏĠŝîÈ6ï&Jİ8މRj1N]] JwZ˜d"#ŠÔWAHa…u­0†0RÔ`0ˆmšnkggçÄp8ĵg8>Ĝëġ}çO?ġĦŝµ_}E‰úÁĴÀ"g€Í•Ž"B 1Q‘ƒ˙LDÖád] T‡•ÔC¨ĥíC‘y.dĉ…*(0"f£€0“áêo=yìoŝŸq˙úŻNKÏ ‰¨GDIU—ÌJÍg tÉEF˘Â ëfÀ¨-u× £ŜħcÇĥĥ··OŽF£{ûŭŝ›úŭŝ[~ĉŻüGöñüüŭ‹BÌ~­ÌĤÓ'›˘S@,‚Xb²BŜ}ˆ4ŬZX ÚÁÔĵI`˘%)ıÂ5H TĴlc.@"ÈH°“(Üu÷Ùá³ġ˙p~öO˙ûê;_rvFF‡A¤D„f³Yšç9Á”T€ÒmüON H…”]XaŬ,µİèÚ"£ŝÖÖÖxkkëñx|ï`0xóxgçżÛ˙Éϟxü'/§/-´ ˆ Â@™4]+\°İ:²ê9Awd„ĜĴ~Ùu2İv# l·­”i>”§ rĈŒMzŻ("„·ž>÷/ŭúññßÛÁçŝ0†)Q‘ˆ” ™N§YQ¸V(…uÄ$ÍĤ–DwfglRX·„M‡…QÇÑh4êooo;VÂh4żŭ~ç˙ô '}ÛħWĉd °€è( oaä¤Ü‘#€wNŻ…‘´'ìş"£Zt´&ġÒNÙĜ1bí „ˆ„³ÌÔ´.9'ôŬ?óï½%{q˙S ÌӕÒ@•™e>ŸZĦ˘¤£vQ§Ö\4 …Öa££k‚ÑÖÖVggg¸½½}|<Ÿ ÷ûŭ·ŝüo˙˙Ŭ{{ÛħÍ \µ*:͂zŠó„ ݈Ĵx–¤ uI7O¤‚ÉĈ{C[͉›ï•R˘`Ô™^'! &ÌĴӃ(`’3ŬNíü›gZ¨˙Ù˙EDDĜ bb;ûûûî‘”n×e?-a‘‚°@ +Ĵ×Fá°·½½=ĜŜŜ>faô`0xëÏ}üw~ŝÁwĵçä3³ğ9C  `ĈH20JÈÀH‘sX ul¨EJÒ"í–ZÀ´#Ú#Ÿ*4¤úßËhY‡ˆÈQ€À¨ĞĤƒµê”oÛéáëï˙ó,–ó÷żüÏ ; °fħÖZf³Y~ P*?[ğDìÊ"nßa…u“`Dm0 z½^²½½ŬßÙÙُǧƒÁ½^ïħŸùżŝs<ù“§Ÿ_¸’3t0#ĴëŒhÁ:&(jÌ`€”n -¨ƒIÚ2lÜġĴLÈkĦ^›‚c…Qö ”"EHÜŭE&•7ÉĊ˜ş 0M5Ŝu²/}/ż5ŸîÍ{ßù|Ĉ̙Ö:wcÔí?JċĞPşċD2)ğˆë7 …ÖµÀ×£8ŽÑh”ŒÇ­Ñht×`0¸żßï?òŜ_ĝËçúÀ‡ï½˜i\Xj›ùC=%HÄVÎ9Ûİ@ԄŒ4K@҈ÄshĠÈİ J"ŬĤÌä›6݌×ЁĴ Ïô)™(‰A`F0-Ĝü~A˜j?;˘ŭ‘żöŜ­½×öú/ŭ`ÁÌiQYQEžç2›ÍÒ”Üû t䁀,Œ`k‹Ha…uh4HµÁh<÷ĥ··Ç[[['ƒÁ=ŭ~˙ĦûßġŜ{ï_ĝ÷ßĵ‚—ĉ&Vq†ÄFFJް¨K³ ; iԄ|··73vÒv#êĉĞpĤ/$%Œ ŞzV­Ğ•§j÷ن^Àh"Ì @ ÂŝB‰3ÛÑç>ü×>pĉŝÓ+ÌĵZ/-´ÖZĤÓiÚĝ¸šÍ³+ BƒßúsJ5êBÊ.Ĵ°nŒÈ‡Ñ`0Hĥ··G[[[ÇG£ÑŬŭ~˙ĦSgŜŝĦ_ù‹T˘žŬÏ@"èƒ0ˆ`-€Œ  Q.ŞG8­işJ\  +`2ßqS Qo**=ïJĜxÏ tƒ*o§•ĵŬjÄ%ĥž²Í´$`E(GÀ‚ĴÍkˆˆpîŜû‡/?ñ ?s×gŝżûÌ<×Z§EQ䞴X,²Ĉ#ùPr˙vEPşU’‹ĵïHa½Ŝ0BŒ"Fǎíìì8EŬƒ½^ïÍĝżġSÉÖħŜÓÓ"‚˘ôld˜˘*P%^@+*6ĜhLJĝ =Z܀‘4B"YQċµ|C^šÎ5Rx´Á~äҀJbë&nžŭ\›× Á›Ĉ .½ë§OÏ/üàƒ§˙dÎÌİÖş`f!"™Ïçyc[ Pşàt'ñHa½Ŝ0ލŽhÀ(²‘Ñp{{{gkkëÌp8| ×ë=òöó?÷ûŜùä]ŻeŒEaĵéúÊÖŠÈ #FH<işêÇġiݵ4ħD“5­UjûñŜ"%›fĜĥ'˙nœúN”@ ÀÌ`,€LYŝ3|úƒ˙Ác£×ž½ğüêr4ċ"˘™ı|Ĥóù-é;˙³òÇ£7‡[É ĥSD#:)Ĵ°nŒjòîÁ`ÛŜŜ;vìĜÎÎÎŬ£ÑèÁ~ż˙è#O˙'~ò?üGšñÚRC$ ô+A *-€|QwóÒßÁÈOÁq#-'^$âÔt­*méêm4²…µ* 5ôáäÔtâENn"­'|!Iöµ*1Pb$JĦ†€0/ĵ=|&úÒ/üĉŝàï§rċB!",RçóyÛÎĈŜ3•#pŽÙYHbát'¤°Ž ŒvvvǎÛÙŜŜ{4=8 {äÉ÷à#żŝ‰weĞM 3Ĥ$ÊÎ1²):?²•ˆĈE0.½ċ§ĉ|I-'585ŻIEÚn,5 6:Ş&û{;ĵ¸´µbçcnSö9˜›hEaà(ĉ&ĜĈ è •  AĈ&•7KO>üÀè[ñï|¨÷˙9ò…֝l>ŸgPj*”nqšÎÙ…”]Xa]ŒÚ_áp˜looŽ;vl{{ûĴ…Ño~òŭüÈÇç=İŠĠw'´@ !@Ùâò¤ŬµÔœƒŒ´Ş "û;ŒFMiİÑ,ËĞMħbï”<¨‘—3NĠ³¤ĉ´YÛċ¤È¤İEı痧”MY²"ô!ˆÀZP€ Y0×À;y`ôÍżÛ?Ŭûƒż/ (•¸ P:òŝ;ïM)Vߛ(´€X0° ˘nЃQ]*-µÈhD²*dp£UM2KjµfšŒ şŒSîMWŝżÜÙĤŬŞb•éĵ*ċÇċÏÈë[’•çCB D$`zJ…1 +4@ĉıĈ;ßôÀè[ù?Óûŭ˙Lpùڂ£$)ĵĜ=¨ì ë†Á(Z£ŸúÈÇç‰&2*aDd›^MDPÖ]Äôäĝ𴣲ר-• r·y)=?:b?ħĉíé”Z¤„ 2Ž=äuĜWQ”IËIĠ, ßsO:çt¸Ĵ YYxĴLÒŻ‚0ÀÎ\³xëıûFßùKŸĝpï“˙)pċbOúÎŭÌ(ŬJıùG.t}Ha…u`Ôë„ÑÇ~牌bġI˘yw İ|éPĥšĥŞé€XV#›êçÒ§ ¨şİŞ4 ,Ŭ:E¤5•B^‘ìR >Rû=×DĞo¨ÊÑÔL”BİÀ0V˜eš- Éğ˙Ñ÷ŝâßùpï˙çJ+˓„3Œ R(e9Ŝ‰0 @ ë–ÁÈ ĥĥĥê0úġßy"X}gż@Áh.]ğŬtW? Öe€Ê6´İêEâŭĴŠpXĵ ~¤„†|ĠÁ÷œkÉ´ż>t|eÑŞÙŸġÑTvüMY7ñb(öž‹ı5 Dè)-F„Ia^]Ĉ ̈́ǸôôG˙·{˙ó߇—kBÉOÙ(ŬúsŻvh…RXF7FÇĥ··Ï‡Œ–.2ÒFƒHħ›¨J-(OÚ-UzÎ)”):nFL ÄjĊ`ĠKé5ÓtRR mÒn÷5W³Ġü7Ĵ2S­Ruî{ùbç÷Y$ŻÌ‹0µµˆħ5â8Ĥfš;ŠB*Á[ĵô)uĞï|(ù PşU‹ŬñRvaŬH=Tƒ‘Jԟîç"FĈÜ:²[œŸĉZ5E•ZdäzŒ|À4żw½HܘKTKëÁïKjDH¨×“íŝ|'†Ú× eÏ›ô{Ô¤x?g˙óAS“"ĆXĴӌ!d™i¨}ËçFßŭĊßŝpïÖĤïVĥÄ[x.Ú~$ħa]ğ€Á‡‘mz-a´@Ĵ;ɑۚQ?RHXĴ CU7ŞùË5<ç\ͨüÚéÚÀTŝ\Zdà^-JLDċ§Jš56T“úóü‹Z2BYTŠ;óš;TöçÊĤóÊ$rRq²ó#Ìë,S:6"#û·ħ@ħƒ$„YÁ,È € ÁcŜ?zú/ŝö‡{˙ĝï(ŬK4C” RXF×£aFû0úÎÔ֌Dj0ŞêFb6Up•Ĝ Œ–lO<0UQ×Òrì ĵšŒŸusĠU‡Ö”|gÜ +ĜĞ%Dʊ!ÈRŠljŽà„rV ˆ¤fËŬĠ*İ@ˆ”Iß DAìĜ É,À#Ü?úá_ú;JĤĤä@"JG‰FĤ>hòÎHaŬXQĴŝtż@!Ĥéµ3^!†Ĝ{âÉ¨İ QVŬPŜZkH•8!+ îç(!f"œ P2pH+i:—:óŜB_a'b^¨È“xÛ×RŞ I ì; ¨˘#żÖ¤|:İϐ(%á ô•+%fA IGï;7zú/üև{˙ĝż\@HJ·Fì>l-ĠxĊ¤°ŒFs×gÄÑĠ€½vžı9AtP W`)o·0Ş #5ÁÛ›ZZ݌¸ĊñĦ™Ħ-Pò§òq=…çàä€C0û Ù&Şö˘şĴÛIŬï „İtjİjQŝïŠ×xĞ`ĈV—pÄ {™Xc"À£ç΍˙‹żġáŜü}àjHßeê£líI¨RÇ …`t0zòŭ?ġÔÇŞÈ(× )Ce"#ċ`ä½ĴÖz¤Rħ—JĞÀSOŬıŻ5¤>\J°^3Ş5ĊŠ`uşDKêŽ+àĠäê^„†šÎŸ•doUž˘Ŭ·*aM#­"Şġ>)#G“°vED„Ĝĉ ™€íÂdĦžğ`Lá‘îŭà/ŝև“Oŝg\>H} ôşžœŜ”> ˘†°Œ/2úĜï<ħPħúӉ…‘6#$LŸ‘°WßÁü(ĊŽ'l£ TMġ@{5# !|Ò e„µ2zQ­[İĦ¸kN%/ÚjŽ+Ż€$Ż]m·†@ Aۊ •`“T.ÂlDn­½œMDŭŽZÑ֔z € ÜfZ§ŒH &á‘s÷~ô—ç|òû˙)€Ë!R:);{*eSv!B +Àèş`4£Xŭé^BÚFF}eÔĠÀá§Ġ¸JÑħTé7öÓ&`¨Ġ“PÙĝÛ1B­ġ"‡"ö·Ŭ;ħ="•S·Ġ ‰ŬOŒûœçugßÌ"1u!ۇE]]‰û[-”À’Òµ Ée|ldeÒwÀPD &hmn›.žğôŭ#”³s0ҕ|RXF‡ƒÑ£ïû‰>ġħO<1W6MÇ&2*ÚÙı>mB֚hĦ#“^“ÚÏŒ*¸p5ħ÷;Ŝŭ^³,êVDC™ŽĞÁ²RĠgùFİRĤÔÜÒĤäFMĜÈĈDC&¨íû˘EÊž0hQ„XsUeI¨í×ì ç˘&èD\ı„' ”zŒiÎ(R$‚+,xäžs£ï˙â'Î÷ŝ—˙,@éV/EU>™€V€Ñaatŝ×?ñäÌ֌2ÍàB0´^kqSÚ-4ZÒt^Jn%2rC÷ċŒ°ŒÜ߃WÀŬ6Û9‰ĥ1yó!ĜKáiv6ARšŻ–0HĜD7d XĊAÉëĵ [I)Ù‘jhĦ}Ù{aëPM˜0Y 4›´ànŞñÈCçF?ú Ÿ8ŸüA€Ò­MÙÙJ‘Mφ)Ĵ£EFżŝ‰'gˆĠ·ö šÁZ0  §ÌÁğÈHŞ‘Ŝ~sŞö·k‘‘gŒÊRîŞZ{iŽ˜¨@Â,-ÎàR˒ĝÛĞ`u.ÍêôXϘĠşżħ7-V„ËhˆQwná2J²VtP,e¤Ä6}§½ÄéDı4• …ŞžDµ\b%ĴˆÈü­‰"$a# /Ž {ùÇJŻûÒVcĠ•AeV€Ñ!"£?ġa¤zŒTíÁê$K}‚kYbݍpżWĤġ„ÁMƒU?áŝn]d„UïÊFŝ ‘/'ŻĦĥœzgÁJ.2²Ï…líÈMġӞ]X™4§”;yƒùŜ‡cYS‚I߁ ĨöS†&A¤Ì ½4 Ğ)ħı.µa{ÍıJ.êaÙ¸ZوG•iAo\…6‘‘‰’¨×!•Ğr÷MŜŭÚÛTùë Š00‰?ì. £Ö‹Ì <|ßıÑ3AŝúÁ¨–Ĥ£ j+À¨F?e"£È¨éX µŸĤ£Ĥ³™•FĊbwF~,;Ġt²:ë ·ïŒ\ËFmˆŸûİĴJc k3eW€!r•Ÿ‰§”…âš[İê[Ş>żÖd¨ä{é•5"6CûHÈD]ĥII5OIĴ„ŻV‡˘ÊşÈE­D‚H‘MsD v…ŭÜ|ĥèGxm’áĦûî=û ż}÷OBúîĉŸÄŝĵì 0ê„Ñ„"ġ­½ı6FİC"#Şš^y‘€QsĵxCçˆ0Şì~¤ĉ9Ǟ۷_c’še”Ğ]j:‘5#&Z #4][tċĈOĝs¨ÁAɗ8Sg˙6÷Ai+ëfû˘İLÍyöA¨˘"g;Ä6÷§,´È:³Ö}÷Ȥï읊qtˆ€ŭÜÈ÷u\â÷Ÿ=7zîßŭíóƒ˙5@é&ŸÈUúÀé @ +ÀÈÂèFßÜ70bÍ‘ñĤ‹í‘#ßqĈ¨~­§48ÇmY7ĝŜs5‹ /5VÂŞa”* ÈŞ€ÁWÌĠ˘¤ĠİL6"ÒĝŭT\îĵûäò˜KĊœ‹ž´ŸÂ£*-iö'{ĞĴ“r,…xFĞ•;ƒÛȨ”€‹—¤ĈË4P‚!ëídB²ŭÂÜsĦ WĤîżçÜèùŸ˙íó˙-@éĉċìPĠŽîw!)ÀèšaôTF˘#Eè׌R­ñ§#ñ##oSg_ÎíĈ‹£/ÁÈİì+jô"9„n4³²ëĊñÂ"n‡›äiXĠ~ԖŠk1ıFĞÂʝ”­d^§òFKĝîî…àÒëN‘uÇóžĴsœQvŒNùa—NäIËɛdë<ñŒĞĜpŽ­Sĝ~ĈA÷ĤŬw˙èı?˙ÛçA}ws³ñ²sW4ĴƒÂ 020úu#`ĝĉ~ĵ`0Cz0½0ħZ#ßiĦ6§¨áHċMç`ᛧÖÄ k âÍEŞ1ƒ›;£—PäĠ+TiQ3×Ĥ´“šïPuŝĴ$gí#^ùĜ‘Sú²ƒ8qƒo ç"+U ͝ì›ÊQÙ+ìˆldi‡ ²Ğ+•‘RġÌÁQ™ħöc@ìLžĞ É4r.qïıoôÜÏ˙öùAˆ”n^ÊÒ8ÂzƒGFû0†,gëMW׃Sx‘ÔaF o4Dc¸ž†7Û XĠ"ĴĈ‰†X½Ep°Qj-x’”jċĥZ“ÔëIÜ´ŞàJçë+ïĜë/bv‘‘İé”Ŝu\…ĜB‰ĜúâÙ\ϸUC³gfëġ)™“ħ6òÉêÔzħĜ·ŸáñÂĠC›ĜŻÍ#œ;wnôÂÏŭÖùáŭJ7öÌFòâNT} F{ˆÔ·÷ d›~ú ˆĊĤéˆ*Cùş•‘V'½Šm ­Ĉ@ĝ‘‘/`hL]é)B·ËB)Lh€ênuÈʌ$İçëàKÌ}Èı{mùÀòX›‘ħ7V ²Ràœğ7[8L )’ÊgÏÜ&eÓ-Ġµ}Ĥ.€XD}ë ÓS˜hg@5.ħàÜıûG/ŝÜoŸŝQˆ”nhÊ<•e5‚@ 덣oM ä,(rS3ê)ĜF€‰HӕšžtĞ‘‘ƒJy#% İ·4jD-i:ÇkZù“`[Ót-òmT0Y½ħŞIËŬĵ×Aġğ¨Ŝ?ÏBÈġgı9ĞGĦˆJ?—‚#*YŻ<²áMüċ,œœJËïĊ—QÒ‘Ġ§‹‚ıaÂna˘e6êğûï=˙ïüÖùцHé†,/2ñĉŬ …ġF„Ñ."ġͽ…H9vĵGRıv[ĦĴfÔûjâ§Ŭü´ˆİ›ˆM³ùRnnöµ ß낑;œTĵž³Ğ§àZ u¨Èê?>ŒZàÖ‘ù²ñ2}GĠ÷mQq%w]JäêBRŸ‡d˘žÊġlo‘²Î …Cá tĈ­m‘ż/Úĵ „ ›Mr/ӇĈŒ×ö€ûÎŜ7zñç~ëüÖ?û/ŬKJ׳œÀNÌ$EhŒ ë £7=ù?ġÔŻâÉ=‰Ġ·ösdš!,è—Òn2 ˜^jG)Ò²§Fd”uâEFöv żÄ ÄîĝÌ0yâĠ‡dµgÈ˙=Ĵ/5Ħ#iMçĦ²GÛcĦĠ„µî{×ì[ŞUy•3LeÏ*Ȕ•¤ì= E•"f²‘—q ° ò"%ö"#ç4á'!‰ì‹‰¤'Ĝ׌",ıÀçî=7zñgüÖ?˙Ż”n“àìĦ‚ıjXo4}äcŸxrO"ġŭĵjzUUÓk #Ş{ħ•j7A§šÎԏ‘Q³fäŭĴîÎŬî âŞ/ £ÔFšž–kdÚ]şĠteš§éÚàèCÉѨÖëäj>öµo:ħ³•¨‡0XUˆMäŜc2=F )Sï‹Ĵl\ĵƒÄNħ ˙3˘ è`–˘LÄĥgÇĦ/3ËÁ½÷œ½üç~óüÖŭ—” FžáıA …ġŠŒ~íOî"VßĜ3v@ĴŻÏ(ò##iÌ jĤÑ<™ĥw¤#çÔkF5PĠÒtĵiD(ëj‘ÑJ]è€4œĤĞE]İÂJÚïÄSUġ9mowİ8m{ŒïÛñÖċ[ڍ³°dqCúà ŝSNdA6XZ QÍqÜY ‘­&vÈÇւ}2˙.´†áŜ3÷^ùÙż}~üÏ˙ëkY†Tvt‡)Ĵ7ŒöĞoîċÈĈ(@ÏşvÇpFİu×a_À°*Ëv5 iWÓyÎ Ülzm¤ûVĤÀ–ê:n¤Ï;›lÖgÔǐĤ“•0k%zZ“ĤÚ-Š„ëOнÈIlDûsQröb Ie jjJTŽI+€²3”<£ÒfˆêŝzdĦ¤ìJ˘ìsï)H*ĜÍ4–Ë—rĈÙ³çFŻ|äoŸßúJ‡^ìċp…‚ì;Ĵ7Œ(VßĜ/3gŒ‘2Läê ċCÖûŒ€Ĥ”ğÙc´šĤs6Auu]#Mç"£Ĉ‰Zd$Ŭ‘‘´80HŒ*xÔ÷5i„Êñ ¸µ90Ô"£ŒVR{œ•/tï÷œÁ 8Ÿ:ÍԚnöBÂġ9ı‰²NĦ BâÒOQ#•Q’òŒqİŒŻĴ!+çžPvS Ö@ ĈċY³÷Ŭ?şsży~Òw×pò5OĴ¤°îX=Q‡QZ0D Ĉ è‘™pŒZGHÔÜ<; x‘‘T÷üş·À¨&ù†I½fT‹D|éö£Tn)ħŜ¨Ğéµ£ÖzTv yw_Š @•`b½êl}‡mšÎô*Q9}>›ÔYxiëŝ äD *i!fą&‚€ĦÄDVZlS-Ġ!OD e˘ħÄ=}p˘°—jH,„pi?Ǚğî]üsży~üÏ”6_RŸƒ¤î<ŬwR€Q½fDħúú^ŽL ¸°}F€ċF´÷Ġ`Töy?w0ŞùÖµO‚­ÙI‹€nŠlcô¸·ğs[ÒFkš‰¤V5Ĵ¨v‡WÄ}OR:°mduÓqËyFâħr%÷û…˜ÔšïçĈR¸fZmMW‘”R.^ŭN "û\Ñk™âğ8²2}J™Ĉ2.Apĉî{G>òçÇ˙üżDèSÚ`i,3”2ó‘Âş#£óżö‰'Ż"VßÜ/ÙIŻ#ômŸQbí€ÊÙ;ëÒtÜTÓyµ!LTWjFhĥ d­74ĠtkÓt“^İı6\~ëg'ĠÜÖ)£Ô›żÒ›ŽiIT˘GĤrœEċà@lÇJ8çp;쏅ÀV™'6 riB;AÛöÀâJĠ'uġ@ˆœK¸+0ìè ,„×8™ğï]|ê7Ώ˙ĝż P:x¨"ˆ‚ì;Ĵ;F3‘Ñ7ö ¤ıÉ÷è£rí&Pm„D-M'Ĥ׆`Ħ §*Mgö Ĵ0ȃĴ jÓ^yÔA -é7tŞéêrpͨ+ÊiËÑI#í'í4ZùVÊÔ)CĴ‡yé;#LZ ĵtu°é¸ÒT˜‚”=Knħ”X+"둇şĠÙşÈL fñ‹ „Ŭ\ÍHSÂkĊgî97şĝ‘ß#ĥpÂê<#KĦÚ(ŠFZEVÓ^5§†u“^½4·,Ўß\d­½PtméżG^í?jƒ<çs”ĵħ'r½Eb Ŝ~İ”gàZFJTeیÁ2Ĝ‹”H*wWa“şĞ&ZÁù¸_O{£`ĈĦ'îĜħÖğKzÀRwSÜuúŜÑċ§~üVHß­g3Hİ!…uçDFO}ìO^A˘—#Í5„QFF‘HÙôê'}7#£Žš‘'_Ê]÷°ĞOzuiĵšÒÎېWĵéP·Ùé’Q7E"í şÀ +aQó÷ĵȈğŻjħ•rÛÏ: YıħkFٔ\ëQÏ]ÁA•şNìQ$\ ú‹¸’ŒÈÂMQġÙ*¸8]Û³;ŒÖóÄC5J#*İ "ˆvS Bš(\ÚKqêì}£ËOŭĉù­?‘RW„Dĥĝ'HaŬ 0:˙kŸxòŠÄêk{™QÓi݆ëÁIğ+JdäšS=ù5£îfcgİ{Ó­3J]İĦ‘ĤÍÓtëRiÒéÀPozmKÑußèêcÂŞ€ĦíŝħZ3òÂŞòñüˆ„ÊíTŠÜŭ8—ċ˘('XeI%—”Ĵ Â5½ÚÔ,”˜½żħï‘7 °DVèH$ ^f`O 3RQ¸t5]gî] ‘Òêbï B`˘¤¤°nëÈè×>ñäe‰Ġ×÷s¤ƒíĜñ1¤ôĤsÒnAsNúùEŬŜtFú×îĠyFžJM3ŻOÓ­K5]ğ#J’†š+‘׺¨kĠÙĦ £ö:Uŭq¸²Icğeûá›A}R)ßPÉğá*yWÙ8œÁ*•İ?§°SöŠ \:ğRùàDRŜ˜ ħİŝSÎfˆLD6îG\c/pÊXhĈe'O(m(Ġ޵2ö$„”]X·1Œž¨`ô5+``m\ğ{"ˆFİŝŽĜĤ·NM·£R”À­#$Ĝƒû€q@£g§’mP3jF/"²ò­JğC:0H[ ŬMŻÒ QiÔÄêôiƒœë3‚Tê;ħ~gì[Ĵ›\ŸDÑú‹*°¸4싈‘ˆxsšLÄÄD%Ü}Cò~ ëĦLóĴ@ J=ĈĠLƒ˜°˜%”ž˙óÛ˙2@ 0‘h˘Î jëvNÓ]–X}uß6½ĉ&M7ˆÄzÓ"OYÚ#n~ߘg´*`°‘‘ÛO;ÒtÌŬişfÊJĜ‹kÖ ż“ĤJ Ó&LĜ́AĵP‹×Dd5vIûóhÔ<–µ1^M9]İó…ġŜ$§€T¤Ê&YÛ PxxҁĈZÈaÎ^"+÷°Ş è§|É{Ĉ‘…ħyb$"ìf&1ğ˜¸$ÀÉgG{ŝÛç·˙Ġŭ†‡’hö7Œú÷HaŬ.‘Ñù_3ÒîŻMŒĜÀˆÌ œdD Í6t דş`áÀšüÈHZ›^ÛzVÙ-Ro/Dt§ÒVƒŠöşHën_˙°öe½7użġ¨‰ ŞÁħ~D't4_yİ@'Z‘ځ&È]”c WK›!wŒRàši-ŒÄĤö@Ġĝ rk½#ÜùóYC=ÉĊD4ö´y—‹—Ep׉{GğúĝùOŭ7oh(‘Rµt)E!B ëvŒŒĞŻMs, †•´ğŒŒ¨!áG#ŝˆñÊeĦž–kKÓù½D7]jÀŞD\üè@jBl/2ŞĊ7-‘Ìá +‘Q3}·QŞ´¤ëÏŻŬġĦíùş´á: "û½!Qß}̈́ÜJŭĤœ+UĴΏ­bŽí 8T#,œ`˘„‘I¸1=Eĥ!Ö0Gj¸€›J)…¤üûÂ{ cı\ҌğNŬ3Ú˙ÇÏoêż‘&”˜Í#ŬñPr3pş4 ½`ÄF™éY1j:gTŸôZÁHêŬhĞU°âΚ‘tLz]u`pġ$l `h›DFß0M‡Òtm‘Q§eÁ‘Q+äJ5]Ğ&Ü814žNÙ§äTZŜ{ÄVW8ùĥub(…ŞĥDösv0 ċÙÚ(2P*!‡Şï‰ĵ e€DħM$fxúĠ%‰ÂrİqÀİÓ÷v?ĝñ§v>󍔈 Z£Ü6î@ï¤;4M÷ÔÇ>ñä%‰ĠW§9Òĵ’vˆ‘SÓıĞזÍñ qŒĴâÀŻ!•żOÚŬ9BBV„ ²FÀp˜ÈhežQӀuÍóv­‰´¤ŠŒVv7Y½ÏUȵ§éDÚòŒĞ ŞRvjF.\£²™–ĵ$°q§ÓNΞA›t\äzž\K€°‰Ĥœ µßukç'ħT.dSĠ³·ĠH$U '„½Âô[-—ŻIŠS§ÎŽöŜ°PP¤ÊóNœB€t‡FFŻiS3Z3ĈÊ֌È֌€UoşĥšŽW3jş388iTîŜ+i:ĝ3‘£Îħ^È%é!#·P†Ĵ‹ZŞçŬD‘:퉤™úóÔR3ZWOj6Ӓ7ĥ‚JĝV²oQÙ"Û(+DÌ`ĞÓ¨üò";ĥÚéĞŝ'!(€Ĝ¸ƒ3‘İ=ùf­T? ”×ĞR:›CÖċR2Nž>;Úûݏ?uü3˙Wĵ‘FWˆvu#ş#a€t‡Âè’ÄêËûrĞĤ+xv@ĥáĠ:nÖFHĴQ™~[ñĤ3›Żi0ĝµ&n¤ċêj:n ZÒt­i´Fhq˜š×`Ôŝ;=L+éĵúÖ'hïAj3nċÚMÜZ3:hş,¤~ÙÙËU5;ċíîùW˘p@"Ġßı>%"Ô ``äÜ"ŞÌ\ËQSéò ì}–*=׈K¨ 45%k3™ßf-¸²ÔX.s\ı"xQǎoÒ'ġüé/ŝ·2À•7”HQùyÖç4 …uT##×g” „úDeÓkTĤjê#$°ò1iı†šíÒîš2-vµéuEÚŬR3jşvŻFí‘ÑşMFÜÚôşùxŠ–(ĞϨZZ)Ù"coàĴëg~RêQy𲓄s ó½ïœÍ—“j]_ۃÖJ½É¤ùŒĝÁ9FP%f°9>ĥŠJGĞç"H4yZ`>É0ŸeĜŸk·^ŒŬ}ĥNŽ/ŭĝßzêÔŝ[ĵ! ä‰È'yRXG FO}ìO^àX}ĠÚıyFCeûŒhŭĜq?ç6ĠĤQ*{İı•>#?EçGIFĵšĤ;(2t;04³ŠŒVÓtÜ:Ĉĵ–6óàÓ5:˘vSFm”óSpġŬ°EM×2ñĥ-5¸ê.•I…î3qš½F 7ĴÏŝ²‘z›ôlT­DC[u‚ĥ’qA$më‘dŭïŞ§Fpµ+W“r*=ÀıA˜Ż ͘/5Ĥóó”Q ֌a¤À}`:/ š‘/ ì@ÇN/½˙מ:ġ'˙·;Jîœ!EaPhŒ ë¨FFÙ4½:Hy}FvìxT^×0v\cÄ7‰Œ¤=2â4êM›r@şke?U+9iĞ£ŜÓL‹­l5ĵNM×ÔáÚ°j‹Œšwâ¨KĴĜµzñjߖ˙­³r!•Êöt‘•€ƒŒŸq·µ#İúŒ”ƒBa#&s?öe)İêJÖŭÛEJ`žj¤™Ĉ"eäEġ#r5ÛiÛ7§ÊtV€•FZh\Í4ääÉñ˙µ§N}a-”äÎIßı:_ˆÂ:J0²jş :V_ħ5#'íîۑIİĤCéĵ#înz­&şÂˆ[ì€ÊqċĥöÒĉM×tíĉFȵ‰:›^[j,bwtYMwĜ4]5\Ż·Ch°Î›ŝ˜Ğéš5£•¨Ĵqżì˘¨P:0Tjt…?)òÊúç™ŝ%*'ÊŝžìW‰„eQ`‘j¤iQz†Ş2ën M‰+ ` ,˜. HÎÈP`÷ÊĜ9n ´>RÊng( ‹1¸uC„ÖQ‹Œ.pĴ²Ÿ#-Œˆƒˆƒ=iwıMn%M×£.i·‹Œ¸1 Ż Fe³§ŭە¤–Ê[ôÚ&$hż@”UҖ46IÓĦ@kjFĞĵXM§ÉĦúŒé5_gŭ½jSĉ5”Œ¨ÛC‘×̨÷ ¤„…ë?"m\ÂĊµ·wŠÉúŜıœ@ ÈsĈ|Q`,ÌY —ÎĠc+k됀€HR=p„i޲EĞDcyâWŸ:ŭ•˙Ç %ûTĜhçï@oĠ¤ÛFĥ0úŞuí.2ĈVLè‹T5#§¨“Êô²ÚëŜtµ4#mó8ĊJšN:ŒRĤĤ•Ȉ7RÓ5ǎwéÜàÑċ Í-cÌŽŒ¤% ЏK—ö4›t;0ĝ0’ÖzQ Ŭşœ×EFҝöt²Sŝğ™Iî.\Ÿ’²MÌXQßÁ֎m­”“l“Dh6Ĝ|™a1×(4›HÈĠ2•Ißi1½q•Q–_³WäĈĦ‹‰”„~0]2„Ù<. pìñkOüêS§îT(yc'‚Ê.Ĵ£YWö2¤Z Œ"£ĜörDâ<ë›|kͨCÀ]3’ŽyFR0 !ŭö`ÔtZ+áφ‘‘´Kİñ ²adÄMHu9r·xÓI[]¨qżċqG$ċ=vğšFí=Kîñ[ǚhH£6ψË>%.MRK·šrt…‰pr1uJ‚f3Ĝ1gAş,°\H3 ¨Œ°È··ġ)çËrsß^D+’(ÍôbË Š!R`ş, šqŽ]E §Ç—žĝ›OŝÊ˙ŭŽ‚Rm[„RXG'M÷ċŬ İf@‹ÄԌP ×Ğ]`{0jNzmސkFEmÒ+›~£ŽÈŒÍyFĵê•×hzmğŞoƒQ[Ñ_ZJÖ²Ò Ûá îċèğ ¸*èp`8 fTİéZÒ|}Fíż×­DCm#ßï“ïnĵïĴ0ŜùÎÙ,9—p2Ÿµ"MiÊX,2¤Kóé“MÁ,vÂ,—roלëĴ›ĤȞ"lŭóÈ •]TeŠX&R’(Ĉt–BȖ^dëäĝµ÷ŝêS§zçDJĤ†D¨ ı @ ëÖÂ(R_ŜÏħÈÌ<£­ˆŒ7Ġ'½ì“ £Ô.­ŸôÚ #QıÇĞ÷q}mĤéÖ ×ó%×r€ênµçH:Riî9pw=Jş7MkFeäW†Ô’jDgÓëJĈP’Ò”Ny<·OĞ/ZĵݳĠ 8ó\żß—äóc9/0_ä&zrĤİT…„@ŠK™ñ¨ĈÓjC<‚ĥĈĴîı+òž‹—êXW‡\ €Q‚YĤ!…‘„ïB€íğĈ—î4(i %˜1òHaŬ²šÑĞİ/ïYƒ%VM•“^½3ĤÍSîŜtΨ)í^'Ñf”Êh”IÖ¨VéÚX75J]34ŻÍ›=‚òŻP×׌şĉµĤ ×ÀHdŭsĝéétŒX‰á+ż(÷]Ù´YSÒî>? /é"ÇbQ@g6zħ!–2cM„#dDlĤ͖óÑ­Ğ{e!Ë6ÙÚÔÈ4Òş“Ŝħ)[íi• RßI„L vY Û'Çòäß|êô—ï€ôíA*χ jëVĠŒ^-"ġċŭ¸vkÁ82#$ĝÒnİ Dó]ğ)`hÀȏv TÓZıFM5´Jğy5›ĊġZŠĴMÓIkͨĥŬĥöÉÊÀ¤MFH4É)Ĝ 2j5£Ğ"ÑĥȨk„ÄښK=ŭ'-Èi¨ӂ¨ž;eï}YUĜU;_ĉXÎ dia~&N]'%‘KµMRŽ5aòû9 !ë—WÜyÖBZ´‰”ì$ZeĝdúgŬ<%k1Tž^öĥÙRƒuT3ö´;'ĈݽçWŸ:ŭµÛxŜäY *qı5_è ĊüÛL߉ĜŻÍ˜ó:öwJ…ŸBmż74àJ° ´F°gî'Q°6Cî€'ìÏ  ¤Ĵħç ô_}êô7n“HÉÁÙèĦ)Àèf֌^֑úÒĠKÍc+VÔúŒÌdÎViw32:TͨîÚ­½M|ežš ›Mzmµµ9À(uZ’ĴFr8­mz튌<m2éĠ  6!ħ)Œ|€™Ĉbž#]dí \#˙ö2}‡ÊÏβĊœ µ>0ħ´§ïlÓ+,Œ”˜ ÖĠA‰žÈs[]‚ıH‰È<ˆà†{+r‘’ġsÇëP0Iµu•Èħ·+cĵWž:ŭ­Û!R’*wʂ•ĝ¤£ £/îVjş­X•v@M×niĤéĦĤkƒ‘nŜ“^[쀚‘Q3Bá&-¸;ڐ.cQY•/sk8Ġ]3’  @c¸ÚÀııáĈŽŻÖ˘°&M·FâŬ‰ûQş(0u"á5À\#˙y×Á–nŞÈÁFJvÙ_QdAdzlkCUúÎÈ41 Ġì¤jözé…G ċÄZ”“TQZ`…ĉÂ*)…ɢ€h# ߟç ñ‰1Ŝù7ž:ŭÍ˙çц’;Ùİ|3ŒnĵK.2*Ìf¸^OLÚÁŒÊ‡ó""­ŬM‰/`hDFܰ+ŬZ'½ú“Pe5M×U‡aiĞÉŞ?İċ½ÁĜñƒÒt²Ħ´ûàyFÜ=vĵY;ëˆkË!`ÔŞ´ÂbaFZÖhCu½äEM"µ‹%ÒbëKÒRSÒ­é;íûŬ)§Œh@‰üJ“Q?Ûñ°ÑWy"ÚM;‰ì)* Äé)Lĉ$¤ÂĜÓ²ur,ïüĠ§Î|óˆ§ï蕂„)ÀèF׌^²5£EÁàœš¨ÁÈtğS ÒY3ê08£TŬ’ĤĞ׎<ù/[™öÚ0HGdtPÓëz5Ĵu_?\O:ǎ·í]Ŝt›ĤéZR×6à #q˘ŝrтù,Ç|–Ct3EÈ×£ŽÏ‚¸žsġ'$İïˆl-›‹{7€ĉk²‘‘Ğ%)nBÉŭÌ*ï\͉mşÌ( '.OT3—IQ™3żĤ0™g\‚°')püäĝâ;ġİ3GµĤ$èV… ŬٚĈaŻÏÈ)`k >Œìż\ı,Tv@RóœÓ‘Qs¸7 F5YMwà‰ş´{5tċ ázmvŝíܰíi'’—†D3Ĵށ­+l“FHÔ­“¤ÓqĦĞf¤µ`>ɰœç^:ġĉ¨œ"!ġŬš;ÒwFNR•?X<ż;qQŽ‘„k!%sçĤΐvŜAĥžbç*ıZ”铲B 9E$&Í V†G p„ÉRZ#[ öÌ!ÇNŒñ_yêÌ7Ž`MİŒİ#€`´Œîöaô3ËÀè‹Ws¤Ú ×a2vĵîÀà`$ĞlàÚÍĥfJÚŬ6\ïZš^áCoÛW" i/ìŻ^JŜšĤk‰šZ##ïEwCFäà­báî×Ĝ#]fÓ ËYŜ‘ĵy0ò?§ŞOIÚÓw Hċ5´" §òáİJ•Ѓ™×$&MÇÖÜ1W‰Aċ„[DÌÉħ…’;mû8R˜Î ÖÈìO–  o˙žşûÛ˙ŭ‘ƒ’¸Ĥa‘àe`tÍ0z¨ì3r0ÚËħÈ:glÇÊ80@JET—vwÁÈÙĝèÒĥ§#W32E{n8uğú‘TQ—gxp¨IŻ]bŽÈ‚ŒRÛFHt9ԃ(9pžÑj=I:…ëš^£NuŒ¸)Çúš‘ğ­ÈóYŽċ˘Xħx=aT:hiOßÙçіÓ6êİäÌҀÊĤW­*û!c+dëJ¨ĝ…Py’şèË='"DedŞ9]=…é˘˜‘‰`ìÜ5ĝöżñԙoĦÊŻÙw€Ñaa4 =üž÷Ù4]ĴŝäjŠe!9c+òa„ƒx ùß×Ĉ޳!a#&–Öħ€Á›i-_–ŽtÙêŝĵ*і5i:iĤ†6’v·oèmƒû¸ë‡6½JWúí@I÷p½ĥçѐĠç9c>͐şFÖ##÷ù’DFZPäŒíĜĜĊĥn¤Ĵ?´EFŜ˜ˆU×nF´Î8uÍ 8IkÓëa퀺†ÎuĤéZj,›Hğké-éŞÇ4· ı&£T鈌6‘t #¸#œl‰Œòœ1›fuG…#£ÖôÀÈ·+é;ĤŞÉĥLßĠ ÄµP#È÷zÖBJ€ ˘2•‡Z_“"úàN\!ĜѰB‡èE‘‘„g övSȉ“cyë/=u÷wŝ¸zkĦ¤ü†/ĴžHFÁè×˙îû^âH}áJ†eÁı`Ky5#ıÈhfä köUŝs7{‘Ñáì€ê‚†:ŒşĉµY:ĠtµMe3í’vK{xċ}m…tDFë|ïêĥH8$Œ:§À²Ïˆ!(2Ĉl’!Ët'Ž Œjé;6˙kKß9LJGN,WBİš,ĞKk!kŞÙ@Éβ~wšMví¤`Ôw°‚ qiQ`&Ó²Ç è“ED éG FĠŸpkúN Êô‹ƒ’1!&K ž3¸µ rrq—+|€Bé )—²ƒ‰ \UêĴ/Qd]ŒÍƒ˘Óy!W„Ŭ×f”ŝÁ­ƒR)h"Ĥ¤£MaôÔÇŝîû^àHŭÉĠó‚!…`ۍ‡!AšV>4 iŻÈĠŒ¸EMç¨MÚ½62jĤ“iw½jSKyuĈφ}FÍŝ i‘vwd 7†QĞ´ğíeI phKê‚1fHĊF8Š0*ô]ÛgdxTE;e:PÚ9ŸFE^¤dÍU}…žÍši³ÚBÉ>0b—7NáúÎŬG˘P6WéÈ FÂŜ•9pâÔĝÂ[~éİğż{‹Òw>Œ8Œ00:ddô|ĦŒš`À×ëC+]ğİĉMWġš·5½ íöAUIq€äM×V+‘Ġ¨ ½EBZÇNÖo¨ë„+İSPA×SAÛëóe´ğĠAÚ)]sínRè¨ĉ‹|ce5ÓwÎpĠüCŻ‚—³”\RUì`?/}3¸ÏŒ°ĦÎU¤$ĥŝä1D¨:Ñ}(Evêlß WšĤĤf•-ğz œ:5ĝÖ_~êÌ­Ş)•*ŞÏš@ 0j…Ñ{Ŝ÷Áóûğï{QGêOì¤×"ç*2ò`¤JÙQ=MÇk Ò)`ö’°Ë›npˉu0âĥR‰t¤Ò6˜g´RŸjOĊ­D]×gԖ‚fŠ×ÈĜ×Lzmˆj:.³Y†ċĵXo”zÂÈO÷’ˆ't”ÄBKj`[Şì²Şôƒ[À•†rê,[(™ŸȤAA— ´B (‰ëSRĉ9Zİĝdžƒb…<'ìí-ÑÉħĵġWžşû;˙Ŭë %–ĈyRvFk#£' ŒXİ/ìZ; ‚ħċ&½Â6½Ú‹ÄİéÄĞU Á“^‹×nŬ¨ ­¸vK½f$-{D·lÂhÌèilBĵĤžÔ#é€Ño*³n¨ËĊµğù@r(i÷fj:aÁ|jf5Óï$ù6R5›!O” Ò|˙lMÉı„{“h+t€Ô"& rjqİF#kBêL[ÁşÖ@ĞàAɆe‘Ó8Än0ÛädQ€H#›1vµ@Žġ†’²`-ôHFë`ôëï}/hŝd·À<Ġ`-“™gÛĤמç¤!íŜÌ(ġZ\ğŬŭl,`¨EQ]C‹ZGµjVúŒ­6×`”şnìĝêŸÈššQ} n4ŒXÌsÌĤyù8w:ŒüïË6"XI¸ £rTŞĴ‚*›!;°Ïŝï îÜŞH €ˆMÑA[(ً5g9¤ĵ~'ñ7"Dċ VċĠ#LS( Ë4öv—ÀöÎXûċ§Î>ŭ:ï|WuÍAÔ`tŒ >5ÇR t!ĜŽÉLz…0e aUMw8­QÓ4ϨÚ,›áOcS<`žQ½ÏHÚ7+^o”şFÒQ3jÛ_ğ !›lĵ7Fé˘ÀlšA—ÄFµ×ŝÏïDêbbçNċÉiöaİJ&R™İÖ#%§´T™“r †"2m>”ÜĝsßfÈAI`ú2Ùږ6Ŝw#ӌ=a`ûÄĝĠÇùݳß{ dgEµO£ @ 0{ĝ=O~³0Ú­ÛġÄԌzVĵi´Ò#Ô>v\˚ÈÈ ÂjMŻ-5£•4ŬPÛ"£u}FmAŜĉÒħY­İ'5Si­èpí>HÚŬlÂċCmĵ×£<Әîg( Ŝ|¸Ŝ#˙uğô]Y_²i:÷ı—ƒ˙à  & ÒwU¤T‰ĊŞhÈëYR°Òqû3 #7V½´²ÏĠDJF.Ideë„ɲ Û<‹Ĝ>>~ġÑ_~êì÷o.”ŽŭÊż•Zš.¨ìŒj0z÷“<˙q“ĤûœsíÖĈµğO@Œ”7j³k„s%fjşĤ‹|ôJôUD…6i7ŻĈ[#`èj$i‰¤E9èÊù ÈHÖÍ*ÂcÇeġġĦcŬ@ÚŬ£ĉ­ ˆÚz‰Ŝ¨0ò]ÂkJw;>ŽÌtʞ3Jµ'Œ0ÔÒt+Ŭ(£!ߛNoP3rµžNo:ε{ƒÛT[Yo”ş  –Tœ´Ü·tԙšFİ+§û:×n—Ëìşâ\×ü)íġ+Ìg³ĵuTĝF>ËĞ>%OŜ,?VşqÏfÈA݁î`T  K8”P"Ĵ*­çúš\ĤŽÈOß ŒĉO›ûĉ—Ì8tĴ`ì1ǎ_y엟şçé› Ÿ˘cżò))G =ôn£çYİÏ_-,ŒcEFvìxT>@=MxŞeddŻĝU÷ĝ)5Ŭ^Ŝùz¤Ŭ²ĈÑğıñȚÍħLÑÉ:e:ûŒĝ°é´MkFµjƒÑrY`6IÍĠ7ŒÖÁ¨âï^éÜxôfúŠ”Üè XŸ:_è kĉŞÌ”xœL )Ùy€ŠÌšk÷A%ÓĦ€ž@XLŸ’¤‹ğDÀÎÉñ+oŝċ§îıݑ҇L¤jHFÙÈè9m İ…ÑÈJğËĤW`Ċaí<£ĤšÈˆ›"# ÔĊ ċp½ a$Ü]‡á Ĉ|·nVܵ1ŻÂh›Â Œäàš‘FĠıüc:ɐgĊcÇŒV£ij¤ïÄIÂéğ*R2G²çOèPġıñ%”Ê&§JÁP´ĵQBĠ[ÇAû#"[XbˆDUŸÒ"·Í³ ÇNŒ_~ó/=uïŝa J„û†DJżüo$)¤éŜ÷œĥ}FCŒqĴ·†Ĝސè´j‹Œ<ÁÂÁÒî×n/Âê‡îšQm"ëšĈÖM"£ĉf%MMĝĈjşÁHÖE0š‚Ê5£ú×Zó}ÓO´n£0ZßììÛ ™À„WÒwäGİĥŬHS£yÖfü>#ö£UĉMtĴ2Ï ´ "7äώÈ(G˘—.á ˆĞÖ]ÑĤËP„|İqUÀñ“—ßüKç›PşĦ‘Ò?ĝiÂg9ĴĈF‡0<[(ġù+RmBö‘†$ vž‘е? 2ê°ŞŒRğaT3F"èœg´Î(•×D"íB‡Áa`ÔĤkĞE5ŸôIç&ş9Œ‹³ŭÌ\y]3ŒV~‡d%}WEJVdĈ•Lğ:xƒŝ*Ĝ“v—ÑUyµHI‘QiŞŞO­²ÏEpnwQАĜQ€ÌéGfK D‚\3vY€'·^}ó/?{ĦDDôя~t#(}ò“ŸÜh•[ȸ8Àhó4Ŭ³ıR_Ĝs À€>ŞIŻFž‰qÍHÖıv Ĥ+#Ğ•í‘<I‡7ŬĤcÇ‚Qëx á6ö£ÔÍÛ×§éÚ7Â*"äkF]_9c’˘Hı…$F×#ïHZIßU‘’•„³é9"—#SUN‰ eÛ­×g„Úl¤²n$\ùÂÙ4°%”s™ŒùƒùX”ħ_ ˆ!Ì3›ĉÙŭ%0>ġʛéü=7JŸüä'7†RˆîJ}îŞ!Á…` €€>ħr ¨NŒCÀHû‚††Q*7"£M`tM†M`$ġÍc"‡5J•î(GÖDF›ÀhUÀp}0-˜N3,ĊF󌌣fúŠ”ŞL› Ñ§d“re͇’H £J}çŝ9Q„UĜ ´Ĉ­ċıştÍ·ċ.C&gĉ)İjÄ ĊÒXd ÒİĈĠ‚!'OÖ DTı˘şŻ”î Ŭì4Ŭ‡?ŝ÷Ŝ÷ĵŽÔçĤf¸^!H¤òĤ‹mdĦ’‰Vç{£v×îÍ"£ƒjFÂmMŻ×#‘>Ti5mƒÑŠÄ{mÓkLJ|Ğ`äÒsÖî‡EŒn"Œjê;Żĥgĉ)QĠZ tÙ(Ke›‘%‡íArâßÙàJa'ħŝŒÄŽËgÉw†0Œ")™ó]"[Wb†$ÑÀ20 ²Lc÷êĜ9ġÊ#żtŝžŝCôW#I€Ò¤O~ò“M­Óá ˙{ï{&WêóWS, £ĤëEĤé5!nÀ¨êë‘ &~ͨ#íE<ş F- Ìë"#i5J=¨fĝżW3:ŒQêښѭ†QMËóÊeaŬp½£#˙OâÍS’†K—pÔÒw€rcÎĊüŒÉĞ) ›HI™HIÛéЃ›ĞDf„…ĜĤv÷÷n†Syë„‘@+r€£@šŒü6Ż/Ö:TuÑڐ?x’Ĉ~m"%"%í"#;ŭKW Ĵ²ħ֌zPĥU£™ ÊDJ" , îGdÌÈÒğûlÛzċMżtŝž(Ŭ1@:F͈hċëkF7†Ï]ÍĴ´ÛHş‡Ş#wĊä.ϜP[dÔĴ!áÚ¤Ŭ i5JŬF"ŬŬ›ÂH6˜g´şéozm…M§l0éġ­1JÍ2É~ĠÜ`tk`äĤuĦC•Ĥ[<‹*Rb§ĞŠOe¤äœldäÏVrRp£)·?c7ħĥ²*w1bekJ=ëêÀĴÀ"( E YV`oĤ@ÇNn½òĤż~ŝžŭż”nw ]'ŒTÇñA5#'`˜g ÑLͨ/ĤñĠ7IEy\Š5jD-MŻ>Œ¸FuDğkwÓ(ueßÒ>.Öĝµ :£Ù Mç§×éäZúŒ ŝ͍€³`:ɐ.‹†£[#İïPFFĞCŝ<—pëŜPĞ)yۅq ²Îk´ê9†{Rp0Ì [ÔRŞšNKVçJĜĈÉÇĝV& LĤž„ÓY]0 iÁ¸Ş5ĝĜÎÖË˙ġó÷>sMP˘–wnJ!B:ş0RÂÈKÓ}~/ÇÂŞé˜[ŠS@Ĵ`ǎSíˆxé³uÒnäM×m#—Î[ŬcVa$5¤ƒF6ĝ›…˘ÏhsI÷¤×›£tİ1¤Ĥ§(ÀèHÁ¨ş‰;†ü5\Â]ÓkİmR|òİ2µgĉöİ·uŒ·); ìÏÜûXİö¸t'òüïìäÙ$R6ŻÁ}…ÉB›g­ ¤KÁž°Sƒ’JÔqvÔ t;FI·k iŒ¨Fešîĝñ;[[[­5£Ïïĉ˜çœ 4şmzAešŽĵÚQ ‚ñ:çÚ}@ÓĞĉúÙf”ÚZ3B[êİ#M×UôoíëıQ0’ŽÈèI›k÷á`Ä,˜îgHÓbġu9á #~Żùëp /i$žÁÙ yMŻ6bRd#%k†Ì`› Oön͎"e-Êl0ԈÁL)Š€„ ++L"ÌĉİaÁŒ4-°·OÀɓ[/?ĝ×ÎßûÜ˙€>BÌꂒçÄ>J¸Swê6ŽF½íííŝñÇwĈñŬáÁÁ`P֌žÉ•úÜnŽyĤQ¤­MŻQÏs`ˆóR•R΁„m_‘ĥv@ĵ&M§mŸQŒ¸Ĵ5ɊkwquˆáFïÚĜÜĈÎm™ħ ²rCaä=a`$Ŝp`´\j\ı´ĵ`$ohµŝşÔ‹İµ”ıV_Ġâ_8rV•ÊҌħ’,Ŝ×ċíšíy-ċ…gهd]ËÉ:üG!ŽzħÂ0 z‘íí&}—ĜğşÀ JÑèÄğƒÁ£ñĝÜÎÎÎ靝í­­­^żßí^udĝş–ÖkÙ;C„tƒSuë`¤ş`tìĜħñĝÌh4z`0<öàğžĝ@ £Ğ9…†ÎÍeVlëE=û&E-ŜtOIÔ¸á½ÎÑz?Ò£ZŸÑ5gĠžx‹€AÖDF¸Ħ0:¨fÔŭ\;GHFÚFEfN‘ŬF0Ş….áNIZFJ6‚İ÷)Áy™ĉYÏÙÁL·‘RiÈêhíäY°"34úŜQ ’um‰Ä- SFBV0DÈ) öD[Çĥ^zŻ=uß³˙Ĉ‡µş–4ŝTHÍĠ“7Ĵ8(/•w[דèVúÑĉó<Öè€ş´›ĵĞ 5zǏlooïìììÜ= ?Ž÷|#żùŸüĝ³E}öjŠ% tfċ¤ÌahkG•{w5—4ċĊ;×áÓ #˙Ş RĞF‡×ĊšucÇ;a$8èša´Aéz`´\˜Nr;˘=Àèv„‘˙xĞá@µ˙< /›^s TfàÜϔI) %íX+!EeĉD JĦü=j”v„MÚż`F^ҌħÈ4ĤËÂ6ŜšéK¤"ô‡=;6ÀWĤ÷?÷ŝYħœ~cı\~6›½¸··÷Úŝŝŝt?KÓ4GĠšÈ ˙ıĴżí^ÁËî0BKÄ´!ġûŭxkkĞ7·ĥ··OF£ûûŭŝ£çŜöŸĝÈoüÇ?ŝ<ÇÑçw+5ƒÁˆ}"ëÜMĞMŻÑ& ñSj6•Çîk>²*`@]ÚÍ×Ğí1͝‚ÛÏF|°µÀ¨h÷:ÀHFA—eş{nS€Ñm#÷eŬfˆĞHİi3äyÑıúQy' edĵİCÑ{•›ŞİTéY݆ä]t›û-#%V$fş0j R€–óÔ<­[Ïß˙×öŝ=´ˆhfÖ""ZkÑZsQmgÊ:9¸żWéˆ)M`´nÔÙĝş³³ÓÛÙÙïììÜ5îí÷ûoşï-oûħŸŭ­˙ä'_à^ôÙ+)Ĥ9[ß7@kFßÍ3òš^İqBÔF…³”J/íE?m]ç¨>éUş†ë5Ót‚N5ĤϨkח#iŬ̓‘ği9/0›f+.F·7ŒVm†ĵo3dSz~LUİïìÜ%6Ñ‹×oĥ˙Ú:§IßyÊ;xŸM鑘?ŭĴ”¤—é;BúĴ ™°ÌÌq," (Bšjì#ĥïÚyĉž˙Ï=ôÒ˙X D fÖD:ÏsY,YQâí{ëäà·ˆnĞÚm:Ċ qGñ¸7Ç[[['†áÙ~ż˙Ĥ÷Ü÷žóû?ŝà+ԋ>³—aV˜Z X = ì°.—Ut#ğŭâˆWĦ¨mÒk­QugTĤĝà4]ŭÇ57½nâM·)Œä€4Ŭ†‘4v6ւÉ^Š<çÎ×`t{ÈO1UŬğš’' /Ġw•K8ù•a;Ö\•˙Š™“TFC*ÂMdE‹8U˘†Z=‰ŞÔ_Ĵ’˜Ñ×òĵ0­Îe\r¤EŽ}Œwî=öŭáÏ>vù÷–ƒÁ ‘œ™s­5ÉdÒ<-|9¸Ĵİ'i8Ċ·„hƒ:’Ñp8Lĥ··ÛÛÛ;£Ñèì`0xh´µŭÖ§ŝößûéÉ`§÷Ùז˜jAa7+W×*…žUÓ)ĥÑtYDġ“³ÖcγÚFëÒtċŭÈÁi:?êê3z½ać¨ŬÉ™z–jLö²*`tÇÂȏÀk6CNĵús"sYş78qyé;—ĥ+û”ÈžÛĥŽTs ·“i­ƒƒßâ§íÊÖ&2e#%`S˜-µ×ìkêJ鲀Š–ˆo>ġâ·Îß·÷o—"²ÔZ§EQäZkeÛz’ jDDtğîn·İ £•Ĝ~żŸŒÇŜööööh4:5 Îġz½7èo|üİĝž·>s%ĊĥĜ†Ì="ôĵ‰ŻàB¤nV*Œšƒ·‘xŽŜĞ Ü#œX6HÓ6½ŜrqÇħ~0ÁFŜtÓI†ċ˘Xû:Œî,ıŸ•6CTw /Ġwç*›ž¤R—ĉ 0³``Ş`DŝôYçΠ*à9r’Pi Ûôı4.á„X’X!‰ŒßĜÇ]‘`1#lm.ûƒ£âÊO—o.˜yaĦTdYĉÒx~o’ûÛêIĦ†tÔU7‚ÙT]26ëÄ`0¸·ßï?ôî_ĝ÷úô?yú‹{^Y0tÎVÁV50ô•uí–Ĉ£ŠÔ?YöÊ}Ħ‚Q{š½é•ŭ†ÚŒäi÷‘ŻÙ$Fze]#]0ö÷2cÑ`ô†ƒ‘ÁèĈŽ×l†ü4²ĠžÚg]SYUÌá9…;sV¸ô#e›ĉ!zOOҍ­ˆ!R ½Dڞïĉï µ5ĝìl+zz³ïzwqùr_œ‡yQË,Ëò<ÏÙKŬùQÒ&İş# §ÛĦ1v°Ħ! ‡d<·ĥĥvúŭŝŬ½^ïÓozô=oùw˙Ò#ߛċĝŝÌ|šMk³é5ŠHjB5ŬÎ}[K5<RÓµé¸üŭzÓkFDüFÀH FX#œ7F~îaa´˜Ĝ½şĵa0Âë#m #l#ïRbĠáŜ>”énİÏüÖŜ÷RžÓĤFÌU+W˙şĤYíhYŞ:1‹ŭ{ħB%)S‡€éQŠ‹ĠêKŠÓŭ9úq}/ŝÀOÄI˙‘~żn0œŜŜŜŜFiĥÓHş#³"¤uêâÁ`lmmƒÁé~żß`8|äŭżüñżÂ‘úêŜEfÄ Ìşò­(UÍ4òŽ é¨Ùˆ7sˆ=‹Ÿ˘–Ĉ†Ô{uÒ+s€`ƒĤ×u0jn"²1ŒdċJv›ÖŒ€‘”ĤÛFŒÉ/ç10’×F`´1Œdsù·×]Â"^·ÒŠÍW?(›i3¸›ŻÄ6ÚRċYĞÊÏÇ]䍰QO³ŝëĠ”"eÜҜk,³3"ÈÒè?ĵġ|ñîŬÏ_: ö‹˘˜mmmyžžÜošmƒ´ìµ€tmpjk†-˙K’$ŜÚÚ‡ƒÁàLŻ×{àŬé?üİĝîûǟıĵDžrˆÖV˘m>‡^i dzp´o Êž’­1ƒÈWÍu¨–Şğq0Z'í^£“Zq¸ŜzÉÚyF×£<+0ÙÏj†¨FFÍsÀˆäÄ֗,lċĜ#tUúŽœjÊ“Ìéàĉ#•#ѝyƒuwé3„"HĦ‘ aĵ|˙'8Ċ/½³§_Ú {£Ñh>ŸÏ³^ݧ‹˘pµ#iÙ+eO ˘†ëˆŽ°&B"ÛÛ‡;ƒÁàT’$÷zäħwäÁˆ€Ñ5{Ó FrȚÑÁ0\§7Ŭšûĉ 7^ւŭŭe)×0 0Z£2ŭċ;:xBĞ›+!ÄvĜ^Ŭ:ĵ´(Ót sÎ+FO•WT*Ċ ~ŠPê#3J{"EĈ˘ċ½‘˘@žEȏ/,ŝħÓÉÓûŭŝ•Ñh4],‹ù|^Ĝ(ÉWŬ ş ÀìKŠ(€JٕPRJEá°7·ƒÁÉ^ŻwϽï~ò]Ççñ/^ÎP°ñ‚•súçLéiċ‚ì‰w<ş“ 6‚ğrĝ–CÀ¨àúQ҄‘`oşM§ı^'ŒVĈßP­;Ŝ1³(-0ŬO!ĤĞFFí0*w^ž’è*}Ot×zU!{‘‘›T‡‘XÙ·ó4â˘Ġh­„’Ğ'QKߝR&}BH1ÜàùÙ£Ü?÷@ŻW\ì÷ûW-”Ò<Ï]”$ w]˘¤£Ş²Ûd´ ^ŻF£á`0Ĝéġz§8>÷ĝŸ˙Ŝş›1ž_jèœÁlĈ7…TÊ;ákuöìG5Z˘ŜÛ#nŒ+_›nqı‘0ŞÙ+n£ĠQGF"Ĉ‡n²``tm0Şŭ½=iŭ÷k™m/ ÂU&¤4OvġbŸ`û3ÑġŸéšêÎë7äĥzR×n¨Ĵï!Os¤Ûġ_˘7=Çñ=½^ïÁ`°Ŭï÷ûJİšA@c§ ƒ€¤ #ĤV‹ ÑhÔ‡~ż2Žğï˙‡ŜÙ?÷öŸN‹’ş°UĴNÚ-ž7ˆ1Eu½Fî`Ô킸”†êŒV쀤ìßĥğ‡‚‘ğ?AğnğFċIvÀĤt+aTŒŬĞK,ùšM9À(Àè`UwÛ4'VRĤĵËsCü ˆżGx’RÚíğŭ[ًNÖRBËIĊ} 2 cúf€ SßÊs…Ĉ(‰ñĵ~Óˆ‡ç’$9Ġï÷ ‡á`0Hp°µÚ‘ƒQÒACĤZ££$IâÁ`ï÷û[qŸŒĝì½úÙ7_ÍŻ,rZ s)ކhùwìġ•ġà{ÉI£Ï¨ŜKäÒt\§vÀÈïuF~ñIşníŠ#˙uŬôyF× £ċ²ÀŜn[oQ€Q€ÑµÁÈÉRk~”eĤ@-RŸÚìאŭÛ,ŒÊŝ#Û{¤%Œ\Ä$ AUі°Ô‹;ÔñYk”‚°`™kƒ{{äžwĊq|Ĥ×ë‡ápĜ‹¸-J:hbBÒ€:p_żßƒÁ°×ëK’äí{Ï=¸ġc;Ï̵µÄċzŭƒSZì€ĵP½&ċöÒsZüÑş–Ĥ[ #\ŒšSNÖĠŒP˙™4RqëjFGF.E7dċ•c€Q€Ñ‚QíİMžEíŻJßI#•/ġQ1*^O³*&"m^N0xxmŸµÖaè4Co|Żä§ÏĊq|&Ž“½^oË^œ'Ñ­ıŭÈ@ê¨;5t֎˘(R=³ĈI’ìÄq|ê?ógߖ èċE˘ò€–*U'ġÂe’›ŜZEEċ‰ò I Ŭä×FĠŒPO?Ĵ¨ánŒ|Sٍa$ë7^ւ½ŬËeħ>B 0jğıy0ÂQ‡£Z)’™ÔkMeĵ ñŸTħ\?ï5{i9 œfŭ¨ŞAUġ%Yq›[ŭĴĊ˜ĉÙ İÀ´÷àքNĵÙig0Œz½^ŒîPS @:DTT{“]ş×ë8>÷zgN?ñ3–ÚLcÌX {ĝ½‰Úâò½~´;\ÏNpe[­YŽ\#ŒüÙG‡Qí×mH7F+˘nŒĵh=Ğ<áZVòLcww‰˘à£ÀH^ÉQ‡‘Fŝ^PHĵ—à]ÜI£ŬCĴAk­Žd`TŜĈˆĜ·cCÄuqDyĦÌ0rŻ‘Mcĥ(@ƒğñrqĉħ(ŠîŠĝXŻ×öz½^EQDmÑQHÙP?ZGîâ[Ğ A’$Ûq?ŭÎ'ß,£­äG WǚĦu[äxŝs\›gT5À²§¨Ó^a“ıFĵŒ¸m9Œ6İ]/Œ*‹¤†ëĦ­UÏސ¨?|žco/µ FFŻŒj_ÖÒwÙg‚Úm7)q .Ċ âċ*ž&?BrB Ŭŭħqħ­ú!.ñİ“*ŠOEQt,I’qżßO’$‰Z˘£MÒv·|ġĈĜÖ¨)Š˘Èñ8Ž·”R'Nĵŭ=÷§ L2FQĜó[síj½y°mp#kä÷ıŝ8ñBiœ0•w×ÎUÙgÔܳŽŒnì<£Í`$,•ŬşÇ 0 0şI0ZíSŞúÁĠT ÓrÔfƒċGĜ=ÂġtN/•Wx}òëÖUJWĉ|Ió½w“Öȗ94ĥĞ|üá­8}:I’qŻ×$I2].—ë"£#ëquŝ—˜5ˆ˘h+Š˘íGŜ~|Ż0W Ф´çiƒü+!hbDöƒvŸ×Íċ1Á ċZŒVnŒä€MHĈµ(ğ…ŒŒn ŒŞÇ—U?;ñĦ$nşqt‘ Tġ÷ݲ r÷Iħj żŞKC'ŒÜó'ƒ žĈĠĊÎıġÚNE[H1ê ħ͋ú01öġ£•$I”$I/Š˘aEۃ“§NG'Ï ^˜ĉFÊÍËBŬµğ9'HSr‰Ĵ[o}áÖóC¸:…µW ŬF²é‰CÀHZ"£# £<ÓĜß÷TtFF·F~şrtĦ$!+Ĵi*ó½ƒQô’w5ëYá­rĊ5ċ2 ˘Ë:S'Œü9m^ú†'ħğ?8ö@íDQ4Šx`÷ĈÖz“~¤àö½A=ilQ%I˘â8Nâ8FQ4:ŝö÷ŜŸ2rĉKµM8'D•Ĥ‘¸9<Ġà_ùHÇ ´Œ¤%2ş^Éiş×}Òëf0ZÌ ÌĤÙĈ›D€Q€Ñë £ÚèŠÚäÙzúNüŒWƒ<%˜Z V·²‘£ĴAu¨y܉"…^Ĵ0Ġ£TĵEÑ8ŽAŻ×‹•RŞHëöŬ[§ĝˆèP)ŒdCùwGR?›É֏üɝ,qMŻ-†È²)ŒüŻ”2Dd†P‚LĞ„ˆħR*²£(€ÛÀáûvR×À>²oxDDqròÔ³`ݍžš½œìş”ÑI•=DYÇoTè˜ĥí_$qÛv›ÀH6HÓµÁH ˜Ïr,ĉĊĈ0˘6Ê$Ñ`ôzÁÈkŜI€QÛŬ üV"÷]´i7ÒrÎúr-ŸuŒÜñYĉP„Œ; ًu…ġSšÂ†ƒv‡7$tݵÑı7^ FÉRğ÷´r° Fİĉöŭü8;#–^Ħ# #>DÍhïÖnl“i†lİ×ä9Ûâ0ĠìZ 8ÀèfÀd #î\‰€ÒħFQ5e2À¨ó=/ĞEÔ1ĤÖ{tƒaäfħğ;!@3Ç"#!T Ò €(³‰˘8‰…lTD8Œ„¸&VI[´³î„ĵ`´*`0PÙßOQäk.@ġÏH™D<ÙMDĥNF`tÓ"£È] ĵÓy? ÌĠ·.Œ:ž´ĤGÚ^Ó †Q9œœÍÙĴï÷ıIö)éoRÍ­-”‰•%Š•öF Şġ0Zs ´ÁH:ô££ÚX×FZ ö÷Òş ¤ FŽIŠŞH¤ ÷^†ġĈP-HzG€Ñƒ‘ûċE T è!9CA"2Eóz÷Fïë#?#Ħ"PAHğ;í1ĴğŭH­£> kr ĉ#Oš½”'yı.1£Órè¨ÀHžX·FEÁĜÛŬ F“KyƒbôäÌû?óŻ&qzı $ŞŒ)Àè†ÂÈäÌg‹ÀËнĝ‡3şüµB–—@½ÈşX[H™:S€Ñт‘ÉqÛÏÒ¤^ÉÎjsĤö‚}ÓI H×9‰Y­uŭ\íġı­‡Ê­‘pcĴEËFrí0Ê2ŭ½t½ˆÄŒ@P‘=‘ˆÀéĞX|é“ĜÍÉcóïĵz×=÷`˜(P?ĊŞ™_ 0ş^€XCĊ8BOïçïÈŝä…h˙™BÒË „€8²m5ÔÙÏ`tĞ`äïovëËSÙµXÄ`—ÚÈ?Âm²ŽòóÖÛµÖÂÌlĦ¤ġtoQJ)ġ£jz97† ^ŒŒ-E½yĝ`”.5&ûÙj_VŒAĊ Ô ‚êǐùИ}ŝ÷1~ùë“wŜêĉ·!²›Ĥ`t£aäçí”ġzPŭ†*ÏŜ‘˙Éóñô™\²+ D"‘’ü"z€Ñр‘ˆqkÈCkZDXkÍHtÈŭ5iSĠö f-"Zïï.ŒĦ!iş[ £Ú$ێ4Ŭ5ÁÈ-{Ĝħ-0ZÌ L§Ù'k)Ea›"ÈäeL?˙{Ĝzñk“wŜwêe?<""²˘*SF¸q}FDċxDTJ‡z–½}ñ…âés9/^ġb@QYïCùyŬrıèĠž_Ĵ—ˆĦµˆ6Bb^ÙÌnßnO˜™…í‘‚³4Ġ˅&DĊNBM+݃a„[#9À2ċ†ÁÈ;Çċ:a4›ZƒÔ aDvvŒJ(QÀüUL>û{Ĝzñ듷œ=ŝí,]N‰(îġzw‘2Wċâ"$…##ÜQM݈¨&u޵žĉyG”Ş·ÊgçßUôxÎH(9i´%VÑUŽ=x#ÀGF+wj/”‚¨’N‹LD f.´ÖĴµ-‰ߎOZkÍEQ̜3sĤ÷Żfj|f(ZC)Ş ì‡€ßdI—Q§¤ôúa$›Œoƒ‘´²é1Jġf0R€ ¤Ş§ŻbúéßĝùŻM=µġ•ĊlvAkĊq<Š˘¨OÊ\…SLŬiÊ×FrçÀö…(Šb?MÓKZë<ɲŬÇĝSĊÓÇ>ôö HTï$ $÷ŒĦ‰êîÂw"ŒäÁH:’F"€hPĥ‡aÌ fΘ9×Z""·Ŝ~Ԁԕ÷”&˜ı°@Zì_N[g‡)ħqíĴ÷†jÂHpÀF} 0’Oz½^ɚĞĝµ0jĜ,­‹š+·îM###T?‚Ì.`úÙßĊèùŻN=µġċùtúìrıÜ@ƒÁ@3óIÓAA&2r e`tC`T&é(ŽŞÏÉDH‹4M÷³,›FQ´;bNĊ§äiùà;rᄒ“ 8†¸(‰Ü8T 0ş%0r½D1$Ŭh¤÷˜9eĉLkÍY–é¤ ĤÎU….Š˘Zç̝>;™L^MÓtž$I?I’ˆˆ’ħQÙinDyF×ìMWö$›‰zŞ|?™9/ŠbX,v­p5Ŭ!’Çé³ò=Ĉ;‹ħJœ‘‚dşşâà£[# Œ\SlşñŽ"…,µÖyQı­!ɵìŻH‡•Í‘ĉZë%3/²—Ÿğ*ï•{áö%ĞÒöÉß(uxÓñÁż×#.Œ’ncŒ·WdjF*Q&2úÔ?ÂèıŻN;½ŭĊùtúìt:}e2™\)Š˘FÛ"’—rĠXbÉ5¤£m”*0î ş&Ġ`fÎó<_¤işÔZ/‰ˆ·y\>‹ï‰ĵ3qBÉ PŻè’s­w9Àè&ÂÈˉ³GS‘=Oöb&£8żğéÉÊ8‹£#ĥ½+ĉŝ`3lÎYšIì…AĦµ.èù|Îö‚A-@ŜJŸ“ï‚Ŝ‘ >Šbçĉ {PŬ(5½9)2ŝ‚JAĉAó×ĝSúÙċ˘˜äy>OMêˆĜK€tŭRígZkĤé2ÏóYžçûĊwżò‹·)–H#Ž E^ZĴ‡Q×IpŒdŬħ,¤é #YsâĴ‘t=ï5èĵÀŝ^fÒ7€QdúŒ‚h›>£ŭW0ŭÌ?ÂèıŻî?~fçó‹ÙìG“ÉäŭŭŭK“ÉdħX,óżœÏ`#£KÓétħX,0" #—²+/°µ><Œ`Ô £•÷…Aف–µóŒaŞLZD µ&ÛÏ˘½ÊDJĝzON”¨ŝ]V `aSĴM£ 0şfQ3+aûÈ8ƒLž½'˘Š"ğšçùdı\.Ò4-È2éèĝïzۛ·òĉ23§iš§iş°WWz_ûÔ³ñcï?Y)+hg·ĥ2Ùu3Éiş #iD?‡cŭŜPÙ4é3"¨A ™8WößrĉĜç³ÙldôÚd2ٟÏç‹ÜTZ›w¨]áÜìÌ´RsI_Ĥ+6…‘uÂÈìĈšĦœ³Œİە$ó´D´Ö*Ïó2}çRĴ[ŜŠÏËwˆŜ› %Ô;i“}›µù!F×#;nž”˘È<ŝüEôŠËÙÉĦŝÁ|–ïĤi:IÓti{ÊÏ ìt*ğkАZ£<ϋċrıLÓt’çùUŭƒoŝ0Ùżĝöe<îCġşé.ġlZ3ş^‰àv@GF^šNĊʤév_6†gż²˙–ğ ŒĤÓé 62ÚµişĵĊ푈¨–²ÍF9Tˆqi(äÀ÷5Àè‘‘}·HY“ÀÈ+UĝĠfá˘(€^,l?3›ğ(o•Ïá;PïÍ ‰êŸ§ı=\¨T…AF×#˘j‚²D Aú•ïáŜqqYĊ,ËfY6³ġYĈ5ĝ"& @Z½Ž&ojžçEšĤérıœiş7 ^‹ñÙW‹'˙܃Jk£ŝRÊe ĞÇÒ!jF×#ıfoş50ê:SoŒ(&sŬ+ ğš‘IÓ½ċîcŸµiş÷÷÷/N&“]/2j3zt—ÏnΚúĈAp0:4Œœ!‚ùüfeáq%eW{—E`ĦÄŜÏL¤ô|[˙Ä{ F˘†wArÉ-„XWêğ£ĠŒŞäĥMg+P’@ö_€Lž“{Îݧó<żœeÙíËmŭHRHÙ]€šQDw×^žĤéŸçyž[×aiQ™²sP"ׇ”(ÈB£µQ*Àèš`TN…•éû›]•²Ó è”稅R™ĥsє‰”^“wä[DO‘JHġ /ì1fŝ 0:DÓĞ÷ù˜s0’ˆ|ġ›8ÓßżÒ'ġÜ4Ë.§işo3E…ħ°ĤüÑ˘û @Ú$U×ġF–WY–éċr™.—ËŭÁ`pı?ĵ´ġÍûÊŜğĉŝXkÊÌħbıİ0’îÚŬ½q^Œô!aä"#JԏŒ´{ŻRÓ½ċîcŸYÎçߟN§/x‘Ñ<Ïs'Ĉ ùi"a-eĦ"s2—é£ëƒQóĝ6€ '<°²{û_YCjœƒdÓwڋjُ”ŜŽÏáې'Šá EÇ!$ċI­ž`´iddŝQĥ†Af/Bv(Ÿë}'ÏÒ4Ŭ],³ċr™j3=›½ŭq˜şJ#H͏a œü7Z`­u‘ĤişX,ĉájšĤ·>÷Owŭô=@GQ:—–ħ×#Ù´ftËaTŭ@çû“İéÊ4Ŭ 2ê·}kôü Œ.x0Ê-ŒšWbä=€òċÄF%…XWéĤğ)02*“µîŬ ¸pKş”È‹”Äŝ-`ĠwïÀ-E߸„‹ÖĠSP f°i€Q'ŒšŸ–Š ˜ì°ÄâÒ·pf0ğÒSê™é<½´X,v‹Ċ<˲œ™uËçĈ‡Ĵ! ĥv„µŬbħXÌçóŭ~żİ?Ÿ½0úòżxqöΟ~(J"PĠ:ŻFrȚÑ-ƒËÊK10b;r|sİÈŞéĴ[|YÑĠù|>˲Ĵ #i\l¸˙|eWUCRĠk-F7Fe"\ÍM§†fÚME^¤äËA͋”~ò‰BİÑqseŸfȟŠ°Ò‹`ÔB"Şŝ¨Ÿ€'Ï@öž–‡H•e‹W—Ëċ•Ċb1Y.—Ë<ϋ–ÚQ—À!ԐnPê-RbÛ$›.‹é`0¸Üëġ.l}ŝŸ~e~˙ÛΨ“§GLÛĈÖ½Z(Óñ5_ĞšîÂH¸CĜħ!ŻşvóĦí€Ji·)δûĞûo9sì³ébñ}[3ş0N›0âĈɖSZ„"dċ­Â`t3`3ßJ H}ĴNé–Z„Ÿ½P"ÂZkIÓte£Û|ßž=`p$1ı’›…Ñhĥ 0ò`$Ċ  Ä6§(^ŭĜ^ĵÚ£èGÓ4½¸\.Ż.—ËyšĤ.:jĤë·ÑĴıBcİ)l Ô8YÈûZĦ²Î×Y–e‹ĊbŜï÷÷z½ŜkI’ĵxüS˙Ó·/ŭÜßz_‚%‘Ôí Ž0ŒV'½Ü #"‚D@Ô3óV°| ÓO˙# MŸÑgÓĊâéÉdòüd2yu2™\Íf³,Ë2Fr”½Ş^ı —Œ!7Ҋ`t½0*˙ŒAŭÄÜhí~ĵèHHۑ÷*×ï’Ĥİ”JIûğJŸ·ĝŭOh–Ó Ž ˘í=ğ“‘ŒÚ`¤”qfbPĦxġ è͟I~dĝĊ|öÊ|>ż4›Í&óùÜEGĵDëwG*j:Ş5¤MÒvÍZ’NÓ4Ïç“^Żw9I’Wĥ_ĝŝw·~ĝĠ²Çßw·¨€*#a9B0’µFİ×#­ċ€MĞ#Š Ô7s‰x˙UL?˙ğ>ó•ŭ·ŜŬ £iFzMz€ġ”…ˆŞ²ú­€n>Œp+`$öšÎúÙħ1²ĞWPBKÚĠAIĝ‘j‘Òè ĝŜ˙„ŽêˆĜ u]œ½‘`ÔV+UÊNN& Š gσ/~IŜvO˙ğy–>żX,^],ğóù|–çyĉEGÜ #žÛ5e‡ €Ä^””/—Ëċ|>ßM’äbÇÛ[ŸùŸ˙dv÷ƒVC?‡ä0'bóhhƒQ›ĝĦÍĉÇŭCÉĈŬ×#)LÍHk9àdmŒˆĴCU0úÑZΌë âµè¨Qğ0HqcTµ4ż0’›#y½aÔ,EŞĵw?tü ˘¤(EÑ*%Ŝú5§'tïÉI“ĥsÔu„ €Èû”ô ²€~éS¸o4ymg˙Ĉtş|y>Ÿ_žN§ûÖHµè¨ñ!ÓuH¤ñÚú‘Ĝ;!j`*Š˘X.—Ë(ŠĤI’\I’d˜$“­ğŝĝüêĊ§ŝú‹(Ġí@iÏfĞquğv˚ÈHqžÑM€‘ÂŒÉ$ƒÖ|(Q@=GfÒëgg;a4ħ‘QŽŞ™’;jmÑQ™*ò÷hÑŝÉ*F7$2ò:˙­ÂΤ…Ş’ßWÔĥÏ^Ú\˜™-”V–‰”>oÒw‚ŭS&J3—’&` 0²£AĊ&JŠŭâç0^ü`ŝțĥ?ż\Ì_œÏçg³ÙĠċr9ϲ̏ŽôiğtŽ â# ĥ´ÖDIäνa6›íÇq܏xĵ}áùoŬġċvr÷żĝ˜ŽcA„­“5× ŒÖLġúŽôš¨h°áHèvKÙQ„ñ£$ĠLŬiš)ĉqïĈqÜWJ ĥż˙ċ/îş÷ĝò­ï?o%PQlíi¤½N~3`ÔêÂ|0ŒdŬFȂÙ,Gžéa¤âÈl'¨AlúŒ\dtĤ‚Ñŝŝŝ+ ù‘‘>Äuó´tPħµ ×´YN‹•£#{Œ)´)œƒühµ5~À†‹’šPB3ğH ï˘JN³Pĥzú #²S@”2"†~úꟂ_ŝ7òûú߉İĝÓélŝâl6{m>ŸïY™wÎÌEGttۈn§”][‰[Rxڋ’4*Š"OÓ4šN§³(ŠFQԏ˘h0ŝâ~&˙ÙâAµ OYyħmVoK´mâA0óŒä€§FÒħ!·Áh>ϑ›ˆ@&R„B4ŒÁS3\Ï0£˘dZ¤ÂÍÏÏğ2wÙ$ˆ"óı€}V€Ñġ¨Lٙz'4ŜàÎĞêuQ7 [Sj}Êc)ÉûŸ(”J(:$1Dċĉì`ıóÓtĈIĈé(ŠÁ{OC?ûGxìdŝìÎ ùÊ|x~6›½jÛ+ĉiš6… ĵatÔĉ|s¤˘¤£Ĥ²kʽ›o5ÒtÔHّWOÊÓ4]N§Ó}TĴ”êQïä§ïÓñï˙ î{lżÙsİàvIGdtSĉµôÚl£Ċ²ÀrYl#7vĵ"3}rúİTĞM§Óç÷÷÷_mQħ&:’Žè¨ Jµß;A47˘È£ëŽŒÊ3ÌFŸ…­Ŭ˜ µŒR[à´n”au¸‹>Ñ)Ġ 4“'ŠN¨wfÜٚ’ò„wxÍ D=€¨×ï˙Ċ³„7mO^<{|ĝıù|ŝÜt:}e˙Êl6›išE‘݉Œ6ё]·CcĴ˙µ5ÖLŬĠ"%fĤ,ˈˆ”Rj/Š˘X)Q|ĉ ˙8ıä/ü”(ê'Ûg@‘‚†˜Z‹™VŞ;M÷şÏ3Z£4-°˜çˆŠF^m¤ŬŞ5Ŭ§WjF›Â¨ HÍ< Ĵ¤êʍB„ˆ BöbžŒnŒüT½¤W*2ptwŭŻV^ÁPúùÖòǞ,T”P| $8Ï+Ħ…}r'ÁÈ)ƒw’˜È¨×OŸGñÜáá•Wï?=ŝì|>Ĉ ıœÏç“ĊbħÜF‰Ž4”Žêĝ‰6_;i\Y£#R*ÁÄÌEžçÙ|>ŸGQ‘"˘ˆ.żùÒ?.ˆŝIymŭŜñ³ĉQD ’ñ0zŭĉ­‡Q–kÌfuQċtPžFVM¤b¨˜@I Ŝ{ ëÀÖğĈƒÑ…ÉdrĊ“v7aT`½²§+­Óìy‘•}ż`óÛF7Fŝ/j6’oĉĥr¸Ħ­ÙıM Ġñ(9ĝyÇè‹ĝÖLž,†$Ô?QíÈúH WÂíèڍı^#(PŻž< ŭüáŜĝĠKß½óéĊbñétúât:}ÍM\ĥ÷šçŜ e×y"ˆ;JjĞ)5˙uPBQ9Ñl6sù‰Èü{gżüżòĞËù–ż{;~¤hYMB”¸ÑóŒFEÁ˜M³`TJğccĜHħ_}“Oŭ.ĥ^ŝöŜw˙tşXüà0Ú$]Gm0ê<Ď0Ÿd+ïw€ÑuÂÈ}Ç6m§yŬ9wP·˙ş´‚’)É;F_’oÍÓ'sz¤G½ğÌóϤR߁ÄïKğMa2˙(˜~ż¤ôîÓ(žŭCܗ\xíÍ÷˙7óùü‡VĠzq2™ì.‹…•xŻK•wĠqo›èè¨é (İMèàwħ”‘RžçıÙĞiê@œŭÚ?+.Ĥóo}˙V´sTÔ+*­vj‘QÛiw‹`¤™1™fe¤Fւ˘ F*‰Êt)@ġ"äŻ~ÓÏŝ>Ž_úÁ•GÏ˙ôb>˙‘ġĤ{Ġşvû}F]0Ò8Ĝfh£Ĵn @‹éâ÷­Žĝza„£Fe–ÜUş÷ۍˆu“´¤µçrJn­ˆoòáWóoO‹_Žß< ä”‘˙Ç=ˆÖ@Ħ­$œAîġ@áĉhe·ŞLRɊ ŒLŬH_ú:ô³ˆGŽÍ_ŒÊHÉAİvŒŠhÑgġݳ׳ïúħĝû ‡ ”Ë Érk}}adĞĊAéÜM.Ċá`DT/ĊÊá×ö²—Žé§g§Ż\xàÔħÏ,Lş!ħX,ĤišfZël ˆš=m½ğ¤.Ġ•vĉ#£H­&gŻ F`˙JŬDIâĴ„Ög$[ ë>ߖHݵżb,˘ß1üjŝŬYñ“ñcc•œ6*q//²¤E °)ŒäĉÁk`²c$Hcš*9ô/A?÷˙“·Ŝž>6ŝâl6{f:h ‹÷­aqĈÌÍĉs}ŒŽĴyêힲ“5ıê&˜šġ$Ŭ€ċyžıCD„í‘âÔӟËöûœ½ġw÷ï{Ñ.(1i:V€056•›£•ŝ%ŭL'™=/ɧĞ9J!óV¨„€$B¤rÌżùŻ1ûÂ?•Ôüù{Žż0›ÍžÍf/Ù+²Ğ‹ĊbvH­Kċ ñù47şĠ;RFXG0ş‘0BM—ŭlµŬş³W-RÂaÒv-éğ2ŝu‘Òˆıxëkù÷÷&¸:xl‡†÷ƒ# `HžWSgŒ3§`”s0݈Lt¤’œïAżúYKŸÒïz`ë;;èгÙìÙétúòt:½8™Lö‹ĊĴ£ßoS1C°ş‰QR›•uœ$ÔĝŻ&)‰˜ÙAİ`ĉ|ûıoĤŭéĠ÷ĥûŝG;Š·ÎI‚H:7›†h‘Ô?Ġ×FóYa#7Ôaä!@EÊJĜT ž^Âä+ˆüëœżíñwÇñàëÓéôùÙlö’-œî-‹yšĤëÔtşċJM6H×Em'G³ "@ÎĤQ’ċ¤éŒVo Ĵ…PŬİa“zÒşZáşáš>”¤(Š2eg/53çc‘üñáwç//÷ß˙‚^Ü+[EÇ@Qd>M'ÊiĝÑÊvÓ`D-5£ĈaOQdhe3”$ AÏ_€~ŝ_`<ùöüŭŠ’üğ³ÙìùétúŞ0Ĝ‘i#2jFGzyŬnRN›¤î¸#§]Ŝ–ç9Ĝn.PÒZ̜ŽĝùĊılzùË/ż—ßùÁQr÷C hPJÁ)Äö‰" › #UĉĤ óy,ÓĞ02óWm] H !ê)d/}³Ï˙/è=ûµé{î;óÙ÷g³ù Óéô•étzÉİxòlEžÁm€Ñ ƒKu’RhQ+´¤P7i¤lÛĤiÓϙ™aÇW”`²PÒ̜¸ĜâċğŸ~íÒ[ôÎc1†gAQ(ŠzK†ñ›*/ĜÜSuïñµÂ]0"ï2ÙúÑQÄÊĤÌHrż ŭÂżÂŭ£½‹?~ϳtùìt>a6›]œN§—f³ÙtħXÌ­ƒw~@Vb“ˆè np”$`Â: €Öiš‚™EkÍÌ\h­ó˘(–£˘˜ßżœ]ı´wáŭ{ûôÖ£ïĦèĝY¨8çĤĦP@PHl9Y:_“wp#P-›OšjÓĝê"(@ĊÖı™ԋ Š<½Œé˙ßĝcı‡gĵ˙̟,‹ç‹Ċ˳Ùìâd2ı<ŸÏ§FÍÂiħ&o}˜ĦSê½ö„`ëħĉœ3„ŒnXdT·BˍÏuB‡f”Ôùİ´Ŭf7_ñRèZki­—Ħ^ğż¸üô• OìŜĥ{’l")Ia1×oކWÏürW‘Ġ·ë ­|´^ŠœlH)SóR G $O_DŝüżFtċĞù;ÎûÁɝ_[Ìg/Íçó—-Œvg³Ù4MS'íÎH—ĥï(DH7JëŝĊ0jĤîjPò̤(ŠBkE‘E1?žeûÇWá…ï½-~÷OĈçC<>‹Q¤²9Ş•`|AË=Ci”Úµùä9cĉ_ËäA)Ş\˘~.rdÏ| ³/ŭ!zÏsöî{Ïüiĥż7›N_šÏçŻÎf³K³Ù̝KŻżĦ8 =·ÎU¸ù™İMŻ–++#0›+ĝ£›#Ñ *x“}j]ËE×çŽ0uÂÎNžu‡ZkÛóp9ÒzúöáâÒ|úîôüCrúŬħŜQĈa…66S֗R`Oš_’tžs¨ßS]Ààš[•5ƒŒ•9ì P½ÂsÏúÏȽ£ÉċGŜvÏWu‘=7™L^šÏçf³Ùċù|îÄ iQYÇE!Ĉ5ÁÙ÷MNŬùß󺨨ġ˘Üĉ³—Ëċ\k]h­‹<ÏÓ<ÏçEQL‡Eħ÷ĤĊäĞŸğüžWvî;·ŭ÷> JF !pndÔÂb`”síĴ<„[Cİż*?ÙhSqZ Ĥñ•ÈŞıĊÌ‚sè6 ‘½ü§X|ġ‘}÷óúQüâ}Ŝóµċrùòtı|e6›]œÍfWĉóùŝbħ˜;Çî–ŝ†u@Út4ÁĦğÄÍfBu_Á£#Ş"QÊĤçրİ%A]sĉ8¨.ċ.3wqhW‘çù²(ŠEžç³b˙}[‹çôÚĊ÷^T÷ŸˆN4şè÷€4!2ƒ<7Ñ_Ħ@³W_B TÒşSp]!×"`0€Ş:NĜ¨èœ#ÏQ\ü ôKŸĊxùìâ-ŸŭΨêét9yħX\˜Ïç—Ĵ/Ŭ$MÓešĤËñBqu#ÜnİşÛµ†„–èÈ? š;oò̌,ËXkÍZkÎÍÊò<_dY6ɲlo”ĤWŜ’îğĝ/Ÿ}ç…÷Ŝy÷£á½AġÇ Š … $2_ LZAE.ìE›í³éÜİùˆĤóĴê%r^dqdóÔ@ԏ \ ġi,úÇÈż˙%}·Ê/ğïoCÏM&“ ‹Ċââ|>ż2ŸÏw­uŭÒ֋ò !tPš +2• 7·@P¤LJ€ÑKÓı‹ûĜ“Qo~n²ÁùçĤ:ä9.nŸ“=Ó,ËĉEQìùî#ôÂ}´|ôıW~ôè•äácÑİ·CÏA$1CÈ\"Q&ÚV&Š2Wrşh‹Œĵ4„ŞÉ­ kû½³Ç·ƒ%=…ôM/}Ċ3Ë7Ŭ{âùSÇï˙všĤŻN&ó óùüµĊbqĠEEìDWßşÚÑmï]w[FHŭèGċ“Ÿüd[Ê-Ï͛žÍ˙´ÖċÉPE‘™µÈ²l–ĤéŜ0Ë.ß5Xĵ|Ĥ˜Ŭwé_żĝĥW'ïĵéíÑħ·½ÑÎ1ˆ) +÷Œ›¸ŠÙ¤ĝ´ÛÌU%.¤‚•ßB¤û“̤ǓÙñŜv¨šŠzr ‹|Ëï|Ċ³ßÖg{¸tîì]JĴ_ʖ‹ ‹ĊâÒbħ¸ìhnSM ’M£"ġ’Ò&ŒèP´0D[Q‹ıÂ-äÀññF›ÈĵÍlSÍXmĉÜ<}wU÷ARÔ%׍QEí<FÓÁ`°;dWŜrĴ˙ÌB˙Ĥç^úŝ›/ñ]ǢSoƒ:ŝf¨dlX(bĥ*ÌĤ˜K6gQĜzĴ²Â.Ìż¤Ê÷œ3}ç@ İ82%Ĵ½çP\ù6ô…Żb\\\ŸO–Ëċ,MÓĴm "}ÀU:Òu‡żB³ĤŻR8ƒĠ£náp0޽ÏŜûKtĜsOşÒnBİk´Œ¨ÚĊa–eı=ç£Ñh’eÙnżßżÔï§?Ŝûŝ#ôÚıWöŝĝÍ^ùÔÉlxz hûAPBd´6â#lڛŞ÷XÙÚ³%6^š­÷Ut\€—Ħ/> }ñëPÓçġ™mÚ½û/ŸûQ–eŻíïï_NÓôÊrıĵbQ§.=׸ ÔkÎÇ:z·F°ŭèGo›(éĥ’%5AÔöġAylé8!V˘%­užeYžĤébı\Άáŝ`0¸Òï÷_ë/—Żz½êġNb?½ûµ?ùћv?ûOŽÏ†ÇFŭ³ÒΛ߁ĝ{‘;Ġ€zʸ>gÎj£ċžmDHÓE˘ (ƒž^E~ñyä/ÙóŠì•għĊéìaor÷‰gúwy9ÏóĞ‹ÙôjšĤğiš^Y,“ċr9].—óċrı,Š"ÓFJxPJ`““€7܌貕žPD`+İ0jg‹.2"˙ï¤tQ–%×6;Ÿ|Q ·¨eSU~´dSéE–e™;ƒÁž;{½ŜĞ÷{?|˜œÜMŸ}҅ÜwċGĵ&'zêĜCP;ĈgŝĥiR…™;Te+àIó,˜’ĜDAH1‡Ì/‚gŻ@vúCDٕâĝ³3'·/œ~èîgXëËyž_ÙßßßMÓôêrıÜ[.—ÛhHÓ4-Š"·S–ê-ÚF›H½oĞu[EH (uĠ“ÖW*üE-éíNˆ4M³Ċbħ S{B\î÷ûÛ½^o'IĉÏO’§O'ÉéüÄŝ Wï=÷µSğ™ŜZdE’ĥ’ĝÄ)$['¤‡¨?D˙ĝ]Hĥĥ"rÙdáË /C_½€b÷˘bYô ÙN?ž .¸ïĝK$ĵ[Ċ^ž.÷÷ó|?˲ŭ,Ë&Ëċr²\.gËċ²,”EQ4&K^ ˆş`$¤éäjU'â:Œ$Àèú`äß/™ú\9n}„´‘J"‘[ ´Éŭ ¤˜™­˘Ö6}—ÎçóÙp8œôûŭЃÁàRŻ×ÛîġzÇIòÜCÇâco+ŜIġôÌĠù7Î^}ñË'ĉËĵ?+h€xL4:RC@E ŝ A½dıI§4$_B–ğĊ%Hş‡Q"Ëa?Ɏ“ÉÉûGŻnî}(ŠIQû³ét/Ïóŭ4M'öż™ÍJ,lt—‰ˆîH“ó†Ñ5ÁèvŠŽn˔ŬšzR”è€Ğöĥ“ÀïkŠÜ Ħ”*ò<ϳ,K‹Ċĵßïï÷z½Ŭ~ż?î÷û£$IĈI’Œ8÷’ä˙ÏŜı?Ir÷=³Ş{ğwÜÒDJ²üÁa…·ŭĞ)‡ŭ7JÑż’ŠPXѤe½HIEχ{îLO?Ş*Ó?TġLOowOÏîìmO_~#ĉvgvïnwş³>™YY™żšk}ġ‰žëıžf³ċâÓW²§woÑ5ŠRëĤì,œ*(^Ž´!"cÌéD?;ùúgo,‰(sݜsĞ4YŒ1‰µviŒIò<_EħÊó|•çy^V΅´@tşö‰š D‹I×ŝ^7ğR^‹ħpàÏ} Œ£u>̟›[7âŬ?âŻUíwDÍÜânÙcp µÖFQ”gY–N§Ód:žM§Óùd29-QFQtz{˘O_ë­çsÔ,3ôÒŞ¸˙Ò*·§Ĵj•,íÜ9§€,Ü:8"šĴV'ŻOÎNgo<%˘ŒˆRo‡vuv–%ÖÚ¤(Š$Ĝal0ġKDQX_ĦáF÷u ıeßĥk´ÄÑÂèX÷ %BÂĴ]­MŞFP˙XĤÊ3Kĥ( “Ĥi6™LVq/&“Ét2™L8žM&“yEó(ŠĤa|úT)5ĠZǧJĊˆ!`„ˆ bPcĝ}8Ĉ;vĤÈLnœsċÎıÌZ›YkÓ˘(rcLVEVEf­5EQ˜`ĥ6Ŝ¸k_¨7Ö÷^ÂÓö'B`ÀÎ[Ú´D]FµĤğċf>E‹ö~ûe,êaÓG*IJà!MÓt2™,8>›L&³Ò8žEQ4ÓZÏ+v8™)Ïç+4"ĞWO´öĤ>ñ;l̎Y9"rìòâìlUÚ`áœK­µı1&5Ĉd–{´á,cĠ];Ü'MŜÖèèat´@jĜOjƒ×Òğ€T7в[Ġ ThyâœsÊ9g²,˕RIEѤü\k=ÑZÇQĊJİ8L­Uˆ¨•R ŞĊŜŻWµ…Š i·ò  )‹ŽĴ— {C!êŸĥŞ×DÜá\\ÄaÄĥ/§EGµ…V`t!Ġŝ…îté5k×ŭ° JĜa‹u‡°j‹ëÌE¨ˆ5EQDZëLkDQÇqĊq<8ÒZO£(еÖq99şœA°IS6{uĦÇeyP·jƒ&œU4áı‡—˙;ğ찏-rÏTy™°c…ÑQGH=ĦTŻĞ糛Î.…’›s)‚­~6܀Ê9§Œ1"j­µÒZk”ÖZ룒˙ˆˆüŒĤ’F%”\ulş\ĵÈZë‘+7?ùŜr} ƒzĤç¨cÏ ş°ì²syC…@ċL$F Ñ—BmŸÇ9\Ĉ˘§Ĝ–ĈĞF>]ş=Şš=D"RĈ˜ÂG>¨”R*Š˘H)£(ŠŞ6ƒsˆˆˆDPu K‡Ż"DÁVÛ@ÒÇî\Ëßە*o+Á?j}ÊnO(U'—ÖQĠâ݆Ġžcġ93;k-ZkËŻa0Ĵ@xáÜï䜣Zdf?¸f+dgO°]F§ċH›œÈĥë@䗳²Û‹?[ËNŒ.£Ş9`ä›^ Œ GĈ˘)bê §ĤVàT:‰ċÈDDžRʟtĠZë& “Övèœ+mnMİ1dh?FÑ7M>š†1î!Á;˙ó#~˙żĵĠJġıI ÎO2móĜh—Àö0ş­Ï™ï:°ïoәĤ|ò.0ñ0êkÍ}÷/QvÊ € {1ĠW_ÑEaTûyP+üËA§O„´sĜÖvŠú€¨fwU[DfF@çÜڍ1}ö=›Ŭ·Ù`˜úd%vhÔ0Ĝ1ĵóĝŭtBİɃŻVĠ£&c¨F/Ch€eÔ#î)Ë ÷şXÄDĦ°Ħ-ƒHÒt…QYRÏj3"ŝê–ħ]GġĦšME ]öwl²ż}ì>ż(œ¸ß蓝ŒF¤u¤Ô%hI`ÍÚrÛĜa´‡!ԁÔ]ÀñŽz׍ßĥGÔÛD €‹ĝSñz¤Ĉĝ`וŞ{-ÇÏJ)èi‹Ġz“ŭİ͝Ġ "ܑzìîk{]gЏŻ2óh`4 Ħ EÄí~ÄlC öHá5Á£É š DMİş0Úċ™í2ÚNÜö6DÄC._£#`܈aÄÏFċíF Ì XVÙñ!Zċ7 ÷FċèëV\ħ£*”°Lğì;²ĜĦĊN.jƒğІze'Ĥ˙éG£‚Ñx"$.@†·˙ÇŒˆÁ}ğo Ż-Ġ ˘ LĜa Ô˘6#Ĝ'B‚ž`éJÇġġĈžżG&ñB¤òYÙħÀèÒ0ŞŜéĦ[ı—t¸H¨ö60× Œ–°ĊFÛ²tTŬ.ܕİĜċ$öqw9„çaÄcÓ(ö@£Ÿ"Î˙13ĵŭ'‡˙íÛ}ĵ´zäSż šÀÔöœzîaä—5ˆĥ´\Ä>=À~žT9†K‘Àè 0òŻħu€ó(T1^áĠ쎖ÚĈ“tE7\ƒï°½‹ìA‡CÖd3uğ˘ĥw‘ĴÄÖûäa~/P€40i_²%ïùğcxûßç˙û;ğĵ´Ĥh kéĵzZµİ-*ê›Û7eRp™¨èıċŞC÷vaŻeÑĦ`´Éħnŝíç´ŭ-uöSŸH°§íÁiñŜv8ŭ?âí™icÓñGHD€Òş3ݟżŭ'ï30@ L1jÚ.¸ˆìëĦñ7~_/ìz6M`>Œ@A’Ĥ;4ŒÊ÷8VÀ Qġ„RW á|ŻÄşMİ{;´r[ĵ¨=îċÎŝó+ħÂU× . 0ĠŜŸ>G “TCÔĈ ĵġ'GÛ)ĵ>9mŜq“ïz .a ĵ‡AÀžƒ‰Šĥ˘]˙#ċÍ´XÑAa@~]D~Úést²[Rx˘ĥŽmâE²‰`Gš{~½·C¸e‡TŽWWġğY€4¨Iaġâ…ɉ|5‘Â} ˘ LP3˜>݁Rï]†×ö5€á€¨²î“Í‚+0:ŒÊY+PèĈ —Ŭ!Rx]Y‹Ĥq&ğÒq]ö·OÚ|—­ô‰xö;,>ï !)µ6~Ĥíè—\yĤĊWk]À ÚÀT½ÑyϨhßİo´tŒÂÚï'sĥ½£ GFH~JŞc€7}Żéjw8‡û‚‰wDCmÑ@şˆŬµöœğ¸C8^Hċ…Árúc¸ż)DEm·ßžQ‡ÖE@Ôç9_ `ˆê .#`¤­ ƒúF—KÓUħÊ9$Äkßż€6½ û¤çš~}ìpW„Ó÷{÷·AvÀ¨F £q¤ìxğ ŜĜBµ–ïıûôHç5EVûéPڅ `0 Zż;ÁsWaˆœ†EûšaÇ £ò×Ϳ˃ħ‹:ˆ] >€v°wúíÎ cH³ RäÒ@ÓvŜÓcbŸĤÒ¸Ŝ?ş€A@­Ë0HğnŝQċíarç]€£F|¤0ÂÚßhĊÄĤ£mÍ/RžĈ{FOWcƒç†.Ê9¤á‰x=…Ë^]e!Ca˙Á/-mqşĉĵ`pÇó ÙjOŻíÈ Ô´Òàfü„Àèp‘@Ĉ  :ġ³Aܕ½hÛs:¤ ^Ż˘Úž½+@ÈâUÂ(Ĵ'µˆH]| Y8ġ1èÖöMìkÇĠ|‘Pk`ĉ­^v£Á€œŻ°;’C•}/ċÊûNÊ=Œr5]c<;ŽÖA\…O8ğސ*M%b—1˘^_;ÚÀì;n@Y-‰ÊĝF—‚Tϊƒ†xd·Çö}½‡“ĜÇi VaT…“i@7iuŜäúVíȈëN4Ŭl{GŸ†/ó³qĵë~†9HFç·5™Ž;çÓ¨ ÁCĜàsµCŞîI§†A.bëİ'T™ùâŞİ;ĵòK×uC6ŒhĉÍ>U‹PˆF‡„Qù xr} Úe'—ħAĜ T;ÙC´mŠ0lµÒŝŻÑ|Ħ€rıw ĜÑş 7 Œ.£2í£]i'vĜq_–ç-Yòú£n‘PÙÇÜK˘ġÔ°Qĉ[Ç'FŒ£ÌF‡„Qù;aĈÇ8Cњ°mA8€T=ôZŬ3 û·ê^8oh Ĝ Ĉí…Z`t…LÁ:“ ŽÚÑEH FŭŽç·s•ê:`=@4̌DèŜ^ĜFp•0â*÷ї~ ŒŽKĠm‡‘FĥˆÊ†²[Ÿ^!Ñqñ(\Ç2û‚ÁˆŻF\ŻTDôç‘~8VTÏ ¨J”‹W>ñW€tħĞ´]ÀÀ•EbWoÑ ½@Œ”ÀèŞ`ĦÜ[éġ\ё9à*t1‘˘†!.`•ƒxí=lY#‹Ŭ‹ħħ#ol[)%Ña`ämà\pä$mwLÎÚ:2*Ğ%HCû üXvĦxAvż_Rw(D|Ĵ‹a½ sCäË,0:ŒB'ġġ€>ħ‹#2 Ħ’=¤ÁÊCĠ~ŭYÏÏ)ˆ5(ċ!²ÑHaqÄX­'˙ Œ £µ]†Mr‰ŽĈ>ŞĊQùpÒ1Ĝ6 l÷{Ş. bwÇq1ŭğVÀmeߣ‹HİÍ×ä ґEHjûb˘¤ì†'`S6lÍreİü>&Q9˜Â~ Œ£ġÛCáĵ1…sz˘# “`îaݲĤlO- ’*Π$ĊŬÈ ĴÀ/WJ`t¨ÈhíeûMq/í(a4îtÏ(öÖĊ [Ŭ½!¤É}*µ¸ƒ7¸²ï ĈڟGFÌä|*ї~‹ŽË@Şú#<Ĝ<‚”nÊş×st Ċd)ù>*°œc…~.’V×#ŒŞż²sáe1Ž‹’Ên|żŜñwûnó^qӆĤuq ÏıÀİCÏ놏FeAéÍÉI­Ï1İZÄÀ! STQ€ŝyûM9¸hĜ ­ÎGĵ£EFá¤?h €’²;Î5/DI#ŒnGËn{Ua…ĦZĞĥ0I#É#04.@¤B%7,ì£}a´ġ:†Ĝ§íÄ,Žkħ)ñ8uŽ£ì›ÎÛ"†Š-aʸ¤€cżñ^ġîF‡Qcê‡ŭ{-‰ƒ#âQÉÂ4Ê3H‰€oJğĝVAU‘XŜqDIĵĠ Œ #â° ĦĜÄ1.v[ ’ƒħƒĵFDž:eiwٜ“™+e%DĵÊÌ€ž;+0şŒJçĴܟ“ ğ32:iÂo„'Sw ˆìĜ7è ]ÀYĵÁˆŽÂ\+*€ Œ#¨t'?sJʏiħ 0ò‡ġF™mE„´IĠ1€ĞéM2ŻÜ1³a›ÙÑw´q£Âhm0Z…F4PÁ̖ˆÈ9çZŠÄzĦÚ½-UvC\ħbp•Î Œ›sIJƒtí!ì9„033;"r`9_ı8RÛ߅£ƒÁ(d@+àlħ²3Û%•i;‰’†şÖ\Ç?1ĥUÀÛÏ}…]èŽ(CúD­rΑsÎGĞ’'ùd˘Ï7V]FUŻ•OmğÌ´[0³!"ë$êPHätm)!Ġïŝ ]ÓġÑ Ĝ2° œ`SqWîI„tíQÑıç!EDÎ9KDggĞH1`¤7ċú£ÁÈ{lX°IaĤÜ‘OÛu¤ì@·/ĊŻĈ"$Ô¨7™ ‚Q²‘3HCħsÎQAD9ŸŬ6UÊ7t¨² F ŭ’B`sšSĦ]‘ħ֚ ŞÑpĵïp}ÉWÙĦô²(”|5]5EWÎBbC£ĵp#ˆšĜZKÖZ ”ó“OĈ³Èg%ûıH£ËímV³PhÇ>egÎàD۔™3"Ê”\ÏÒo‰–ÍŠÈ/Û¨$e7H§Ħr]ʆ918Uô_ÑUƒ§ FPFHĈçœ+ˆ(£ĠÓ3(DanÀè00*ż´nk°z 7&.#˘Ô9—‡İzıé9 `Éĉ­CͤĦ9 ëRoç£$ íƒ6UwR÷=@­8"bkm™.ʈ(Q‹{‰žN×£Ìë)ŒàÀ0Âʗ”Ï ŠB…ŬC¸9Ħ§D´rÎeá:XèÑîItM"ÚxÖ#]ώHáÂléBpT>CÌĦ¸è9C¨ËĞfi;gŒÉ­µİs.QgŸ-^:B“ÂpÍĥɍF|…‘‡T3€ÍÓÇpkâtÎ%ÎıÌĝP•:""ĠġçƒB•]° ĥ¤Ħ.ešŽ m*#Ëu@a­Ċè Ô´¸ħsÎYk ç\JD ?úÁ<Ž6#Ì}c!Ñe`T†JJ ċ rgöFdî9çVĈ˜ÌcĴµğúĜqËġ=˙pi”c *… ä+îĜñ:²µMŠŬ\3œ½nk-EQcRçÜRġËO§SrĴ¸VIÄ£}`T}ħì_Ç! şü nO‹-Ĵµ+cLnŒ1•Cħ rŝhŻĞPHC[íÂ̍}b¸fa#İ´ğNètEN!egĴµ™1féĴy:Y|²@F€Hûžv~¸ĠÖ5ġ‰ŒÂêĊàǖGm'÷à•ŝÊZûÌ“E‘EaJw\+˙§lÒ^=ˆp“%éz6ŠsHÀácˆŒ6)Bg\ħ•Ħk½ċynó<ό1Kkí³É_>¸uë0ÖÀäÎ7ŒvÀ¨ž Íu=ÎâWĉîckíÂZ›äyžW ú¤ċÄ ETöeß} Ói(‹BdD `ÀıÍĉ¸´ş:Ҝ÷Žû<ŻĤíL–ek E_ŝüù lîĞÂÖŬÛFŭ#£Í§¨@4`J>—£ċBƒŭÒZ{–çùŞ(Š"ìQGt+‡e‡àÒmÚIÙ÷ Ñëċ@ƒm^^41£ëŽˆZÖZ*Š˘Èó|eŒyÙÙŭ‹÷Ÿb¤7#êF}Ï•_GĴ,\ €èÉġ›…µö‰1ĉĴ(Š•1Ĥ¨ˆŽˆVtí˜u´ÑTÙóĤ€aĤ ‘‘DGƒTHÛEQ$EQ<3Ĉ<ž?ĝÛO&'§ŠC÷vcF}##i:Ԁqĵĵ Q~ßvÊż1Ĉ<Éó|‘eY–çyY£‹”ƒ‹›Š¨|.UvĵFġÒn˘í4]éMHQsO.ôHŭĴdŒħišfyž/Š˘x4{ôOżıċÀš­ûÍyQ3Œ*“É·î÷aғ_Â×o˜‡ä̗EQ<ɲl™çyV;Ô4~Bö†dVD<Îö3#(û0"ŜŜÌ­TÜuĴR˘Ğ‰‚ú|mktÎı<ϳ,˒˘(žc|íÉ_ŬU§§ëŝkkg0‚CžŒ gdTv¸G `<Îî-îò›·£6Ĉ<,Šâi–eĞ˘(ŞÑQß4ĞèZ;5ŞÄÖ(DċÁɲG—jH<àĤ£ƒèıİŝhòĈÉZëò<7iš.³,{ZĊ“‡ó˗˘,cW(áÁ`ć†?qŒš\5?ܗoœ$"0wó<˜eÙY–e+cŒ ›ô‘”|?ïŻ(Ò°B$€²/$oZ­+„bÚâµÒ§{QŞ/jMŜ8c\žçyšĤË<ÏÙ"ż÷ê“żú'ħïm§tp:”À¨ëèâ@)pgœ½OżŭÊ䟊˘ĝ2ÏóÇá=.Œ1ĥÁQàŽ¨VÒ ×£rÁŻŽHeqVÛfB얐’†눐š–äúbWĤ‹ˆˆ\–eyˆ’çyŝċK_ŭôn¨$Ê^ ŒÚ`„Ê(ŠÂ‹¸/˙~ëV~?óa–e_­VЧiš–é:WTawšNş~_›EQ×M%@ĉòǖ|š.š]—‹ž×•ĜĠÇqςˆ\(nHWĞĠ"Ïó‡Ö䟿ġĝGï0ƒ²ÁAôQ07^T…/!€ö0Â8zô0Y}œ˙öĞ“żËóü^šĤ²,[fY–·DGġk Ħ„š> äúàıAd ñĵċ8ı•ŻPMé ŞGIÎ9[E‘ĤérµZ=βìŝlùÑżĵ>”û+ĴÂġ%Uï{„5Œ`26À=ĝ[ĝŬ7&żħĤ¸›eك4MŸ$IÒí*l8˙ÉŝÑs\ëT%R§ŽHĠĊÖÛÓ:2*÷’ –Et}qkíµ&ĵLÛQQ&MÓU’$ÏÒ4}çùço>üñßL”5)°V>u‡àSµ£°ÇĤ”Žb@0`?˙ |-zòäöŝ!˲{ĞĠêQˆ<Ëèˆ:@ÔĠhU tŬ`b½ †rAŞîUçç()ğЧÏĥ·ÌRWYkmĜKJ’$y’Ĥé=—}ĝvòż¤bÁÀ@iÀ(Ú³ĵÈ0Òa(Ž€‚šĈàŭâgïżóù_gYöYšĤVĞĠ“Ġjµ*Š˘ ˘:v5ÈY¤k7°²pË öÒ@£$bßj&BĞv’yH×5½ÎmÑQxÍŻ¸³İ'Ò³$Iʲì‹Ë_ŭü[ĝŝ`žPÀèĦT: Ġ2ĜFÀ€Ì:ö‘c¤žŭèóŸï}söÏàŠÒ4½Ÿ$ÉĠj•äy^8ç\ûŜ&Èh`‘Ñú#[5¨Q,} u¨À*£%WħêÊ4YѵÁİİşNDd‹˘ÈWĞĠ*I’§I’Ü˲ìÓ7Î~öoGO΀S@Ui'ĕĊŭE‚‘ò•uĴ|7 6_ŭäÏáí—óOoNùiš~–$ɗI’,Z˘£ĥêşĤ×ĥÙ?z΢ŞĞ ] o½êé}†J™w¸pŽĊ·{^W£ÚZ˘$*£¤²{C’$gËċòQ’$_dYöÉ·Ïŝüg3÷°`û 0žTÎ'ázınŸèĜ3Š´Œâ)`¤ìSp˙^×÷˙ĞWĤ?KÓôîjµş·\.Ÿ$I² 0r-ïyŸsHğ"`ѕGIşùŜ‰˘,€›Òn⠌l—|[ħĦkˆŒ°ċµjk^9V˘¤² R[t´~MÒuהbú:ò(³vǤĠ›mX|J‘Żöû¤ÊîùĤíË!<QR=*Şi]’b­5ˆˆĞĠJ)´RJ#˘>Ċê{ĝ×Ñ{ôŭï[ ê[~ƒŸµ/óŻDŝ§áކl€ĥ7Jġٚ²Ô=ÖÚ({ö³?‡ËHŝġ·_ù˂1Ĉ ˘BÄ%"ŞàzÀ)|Áߛ9ŝçÇOo_úNĴĤŻ;ˆ4€u!²  °í§ıFÁĦòJû­€ŭäÏàĥùàì÷Ŝzí'y–ŝjµZŬ=;;ğżX,ʰıµÖTÔ!юèHtí C+aœ… Ǥò„z £2rlü9 ÑuEIP³ž´]”\uŽUĴ03Ÿ2ğ;[-~ġäéż_ÜĝƒxúMÀ(öĠgÖúJÄÀäΏ³ïnw0ÂZšnëk•¨)ôĤCÀÉP#¸ŻŝÜGżusqïío½ŝÓ4M?N’äîbħĝrı\>Y.—Ë<ÏsçÜ.µu`oíc'éşk °_@£<‡dùóĤRÂȲ‡âf -JŞGHĠĞ„ P"Bk-fYVÒ˜™˜Ù™ïÍòä“ċòżX½óšşŭÀè ¤€€Ty–`„5ñĠÀÚ`„Û”ċ‹s˘Pk€óG`ïŭÀû?uż˙ĉÍ_ßıùòß'IòI’$Ÿ/—ËËċòiŒŞ>$:”ï­je|—ċĝDä=ʲ€<ŒPĞ-OXœşA€¨şŻT]´ï'ıÊßuJ"% "v^…s.{söir›Ï?}×Ŝù78}'ŝ?´T9·Äo“"#ÜNáùèĤt„.7\7ï†Ö!ĜgߓN+@# Ü£_€ûì/àĥ½{öîğoü\ƒûġrıü˙ ¨‡kżûżvûżÈ²ì³EšŜ ‡^Ÿ$I²` ç\Ŝ/Û£>Uv oħó÷(Œujl4–ëT]ÊDô0B–yHCpïZK `D‘h%" ".?(Ĉ˜Ì³šÏÍâ[³âák*}÷Ï~óîÓÙwnêWjŝ:h`ë šM8ùîœ÷:5++ :`„çšÌoL[û@[YAFĊ~ĵxùµ8ÚDEèÛ!ĦBàäs0÷~üàïèÓâñ[ß}ŭ@ö“ċryoµZ=X­V_%IòlµZ%Y–Ħ´ğ)2jŠ’Ú*Kt4d#B½I5r Üc˘ĞbkËv5ò)Ŭ= ë]ùX>˘êsTEÑd:ÎNNNNĉóù­ÓÓÓ;óùüĠÙlöÚt:ŭú‚ĉßùèiôÎbòÍSŭÚïž|'ށĴġâXğñnÊvD[&BŬ‘ÑöáĦM6²<+§ÔĤIfûv?ÀJƒR -ÙÇ`ïŭ?àGïñ×OóÇo½ùú{ò§yžßOÓôË4MŻVЧI’œeY–cò£jDT-óİĤĤ⨃I€$ ‰Ĉ%lI˵Iï“R*ÒZGqO§Óél>ŸŸžœœĵ4ŸÏ_žÍfŻN§ÓŻM&“Ż-ÜôÛ÷Îè·ҝ[xûw”şó.`|Ç˙ÓL>…G äÜfIv.´% i:ç´‡ħyÓ/‘œrĜݏ.”``ŭżŻ”o >ÂRJhœ?zôO`ï˙ DËğö·'żùĈ+żŠ?/ŠâA–eÓ4}”Ĥé³4Miš&ċ×Ú~‘m€O=:rp~5DI‰H˘Qİ JŞòıĵĤ;˘%Ŭ-Ċ“Éd:ó:=99ı5N_žÍfw&“ɝÉdò İÉë_.ù/ôj‚/ÍĠw@ß~ôëù c[B‰×i=*íĊÁ0.}Y9@¤A“Œb0;RÀŽ@Ċqĝ· àì>¸‡˙ôĝ—ÀËÏĝöÔ,ßxġ{ŻŬıñkcÌ˘(çyŝ(Ïó'Y–­A”çyfŒ)œsĥıu?âé;‰ŽD$Ñ “şƒžQRSÄÔ (­uEQ4™LĤÓét6›ÍNçóùétzk:ŜšL&/Çq|;Š˘— DŻ?Zş7-흧žòôen xë·@ŬĝàÉmkRzĦ{|ĠtÊóNeU„V—"°KÓÇĞû@gŸ-î-ïAìĉ•“ĊĞ/Ÿ~uç“Oé‘1ĉİ1ĉiQOó<–eÙ"ŒOóçF"’è…Ž’ê0‚Z”ÔJŸk­Ëˆi2™LfÓét>›ÍNĤÓéÍÉdr#Žqߌ˘èfE7µÖ79żÌéĠEên.R{’ċElpa|80šû3M:D<ì6G˜€³g@ù3àì)€I`Q1›DĊ­ÓÉêĉÉôéK§³“[kÎı…µvaŒYEqVĊ2˲$Ïó$˲,t[¨‚ˆ.˘C° İ:‘I$İğ~PêJáu~TJéÈ+.÷™f³Ù,Ž“Éd2ĝ$Š˘Ó(ŠĉQh­çJİıRjĤ”š"âd‘ÑG<]föûŸuQĴхZnffVÈöĈ,^đJçŭŒˆ "ʈ(sÎeD´²ÖĴµ+cLj­MBBZEĈŒĈCDĥÖµïÇKÁH€$ ‰$u×\ì”ÊÓ^‘×ôqŬœµŒœâĜOqO8žĊq<˘hF]Ì´ÖħRj1"FĦ¸~ĴĴŬµ/³cfGDĤòÈŜ<œ™ÊC™znŒÉ‹˘(„,9fĥµùEMŸ÷íQ×#TH€$zĦôGôGç^ûáx(ġIġ}Že×p*!Ħ&qOJ`•%ċd‘R* M^âù–ËÁž(Àˆ˜Ù:ççœuÎk­)‹Œ1Ĥ<× DCôşàӕžÛF?ĝÁÎ- ú§*7³èJÉ[ şf5umhRÓAÙĤ ħ*€êÏİúœˆĴsN•ŬĕRİò!T¤µ.#ŞòsµV!J ŞG&2—]QùıuÎQÏ\5xԟïTù½mċÜ}`]0‰H˘Ñê?ĝW˘¤.(•Pİ‚İúú^lmÑÔıT 3£s Š2: AáETh=ç›ı âHAÄÌÀÓĠ7ŽZ@Ò÷ÁQUŜ·.ħÀH$@ ”şĦTm#¤˘%l‰˜¨/ˆ`ğˆ˘~ŞLk—°‚†H­İ%@wKžĥƒ.(1ìNËġ%ÑZÄ ]§”ĵ˘ë†RËŜäÉ·-ÎnÇ6ßßö˙6}nkżGS煇^[a$ёH€$(ġƒRSšĞíQ‡‘kXĜŬ8í”ßc;àhj?K½ …Ŭ Sw#‘H€$JMİŞĥv9mђi‰˜lÇëĤ^ĥ%²ÚġÜôˆ„lˆú–xSK”yP#ÑP$eß˘ĞżÉö;>ïjÎÚU.Ŝġ^‡†çġŸ£KÜÍéµ]ÑN½`ĦíßŜµ_Ô{µB$@½h@jZìħPû‚İ ?ŒH"’H€ty0ÁÙaŸ…{>玨i€ž+ˆH"’H€tu`ÚD}ž`ê“jÛ§0áJA$@ D¤€İ¨úé˘Ò!àÔBW"’H€$ ]L]‚=„=˙Oî1]&Úyî  ‰H"ÒĠÂé2ßsİu}Ox]+„H"’H€tġpê ¤Ë‰/uàż%@ D˘i¨Hğ@rÑŻ D$‘èȁtôŭŝ}Œk†(k…H€$ °Ž8$‘I$‰D"’H$‰H"‘H$ D"‘H$@‰D"‘H€$‰D"’H$‰D$‘H$ D"‘H$ ‰D"‘H€$‰D"‘I$‰D$‘H$‰H"‘H$ ‰D"‘H$@‰D"‘I$‰D"’H$‰H"‘H$ D"‘H$@‰D"‘H€$‰D"’H$‰D$‘H$ D"‘H$zú˙œë ´JWIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_DarkBlue_16x16.png0000755000000000000000000000016512467662066022457 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(Ïcd™Ĉ@ `b ŒjĠ0t4STÒFIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_ShowHUD_420x420.png0000755000000000000000000013530212467662066021047 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFŻíIDATxÚìŭ˳lË·}cäœUkí}Îï}ï•~×\K֕²@L 9 x4 ‹R—6Mwè€ào€ŻÀMB-0„‘c9ÂK„ ’m$ĦĞĞĞ{ïóĜ{U͙9™3gΜUµv­}^+lj:ĞvĠĴùÌÌo<żAŞŠ.]ştéÒċëî· K—.]şt@êÒK—.]: uéÒK—H]ştéÒK¤.]ştéÒİK—.]şté€ÔK—.]: uéÒK—.ştéÒK¤.]ştéÒR—.]şté€ÔK—.]şt@êÒK—.ştéÒK—H]ştéÒR—.]ştéÒİK—.]şt@êÒK—.]: uéÒK—H]ştéÒK¤.]ştéÒİK—.]şté€ÔK—.]: uéÒK—.ştéÒK¤.]ştéÒR—.]şté€ÔK—.]şt@êÒK—.ştéÒK—H]ştéÒR—.]ştéÒİK—.]şté€ÔK—.]: uéÒK—.ştéÒK¤.]ştéÒR—.]şté€ÔK—.]şt@êÒK—.ştéÒK—H]ştéÒR—.]ştéÒİK—.]şt@êÒK—.]: uéÒK—H]ştéÒK¤.]ştéÒİK—.]şté€ÔK—.]: uéÒK—.ştéÒK¤.]ştéÒR—.]şté€ÔK—.]şt@êÒK—.ştéÒK—/wñ˘ˆè+9L>]ştÙŭèPŭÎŬ´Ħ››R]ştıu-~ë: =HèÎßwéÒċuĴ·Œ^X7^=@ }Ŭôy.]ş\ú€möêU‚Ók¤k s (uêÒË­ÖÎíYWôAixċƒĉэ`ôkĞK—.ß~kèÚçtáßZ­{ÀôW`¤o9ѕ÷—>ğĠ­×İK—×H—Üq—Ĵ½˜^(u—Ŭö}ëß×ëšĠK—ï60íıèjÑxixşËî•5 ˆ˙f-u+İK—×iíYEş:{ÀD @{5ġé0şDt´R¤.]ğ€´FşóY ˜pÁZzU ôÚ됚àóÀß˙ŝ÷‡áà‡0 3³ÀDDŞJŞJŝŠÈêßġû.]ş|G "­ß3³–˙&"K…j\$xïeš&?MSĝì³Ïüét’ ÖÑДטÔ@×ÀèÇ?ŝñĝÉ'ŸŜĵyóx8Ŝ ptÎì~ -)AŞR—.ݐJÙ+À‡&ïŭyšĤ÷ïßż†~ùË_ÎW@İe%u@ú€n#ôŭïxóĉÍñÓO?}ûƒá£aGDo<`C-é€ÔËwŠÏ´ħÍ àIUß{ï?ÇñWÎı߈È;~N§ı^6°GÂwœ^cRCŭyz1†axûöíñáááûÇñw‡?ïœûSÌüCf~KDÇ VÀC‘ÙµÑ×$ú]dœüúïiż ;·ĉP%€:‹È;ùµsèPï½˙ŝ½l;ÙÛïk˘×HÀ~˘ÂêċœĈq|{8~t<ïż÷żŭßŭOdŽ €ÔvbChaOsÖQ|1€tZ#^Ùï£~ŻWÌ:<éna|Ô+ŸßŻ£iû?ÖġÇ*ö·:ĠÂwAXŬïú"òŜĞ ê„É>Û\÷’EĜ²AĊ†ù„Ŭùnœ,›”ך˙ -ĞóYo]ŸjyO7÷òÙ£iŭ|ó³L§ ĥ˘żt{ʓĴoŒŭV ĥg­ Ĉg] û>ŬkÀ?V@$~§v“‚„çb‡œEáƒÄ ëg !ŝ./à<üÏŝŭvŝÓ˙‡˙ÁżĦŞÓ8Ž'çÜÀtejw—ŬwĜ:˘+ÀÄ80<2ó÷‰èOŭ­÷3˙}U|˘Àï ŒOa0°`/Ž <8äï#Ċ ÁġmÒĉÉ[/ĥەġúZqqĊŞĉtšÄúüŭĴ QıĴórqŞ/‰Ġ¸`hÚÏr˘DTiç XŠƒ”h²SħÈ_ƒ m[éĝŞ3÷Q/–Ó§kl"Ċġè 8Uw“›ĦÖ tA|„óO Ĉöı•V‘AruhÑf~˙§kL`e[Ĥ{›ô"t˘*ëk$‚ĵœy_â9ÑöŜ•çš6/…" ĥ  '˘^€9ĵ(Î8Á“W|9KÇ6݈§³à‹'_ĵóĝÍû3~óoŭ/ù§LŠ™> ŻÇqŞ3¸äş{VҊ€hÏU—Ŭu˜™ˆèfŝAùûŝêÛ³hÖäÀ£‹`40 0pĵħ ¤PZY›_ÉÉ'²ğÖo#šĠA´Ġ̗…em‰Ü¤fé˘iŜ‚Éúí=l zıˆ'm5˙[Ğ%L× œ6îŠĉġĤ|_laybÛ]+@lFı˜/^—óĤʌiŬ0MZöŽĞŠe‹­•ê·b 91-‹FQXĴÍt­éwĞĦ!ÈÏL …ސ¨=l°5+Vĵs­jW•dm ’ÇİŞ,ç*  t5Ĝ˜ ÓUâçßñ' 0ó'ŒĥÖPJz•v=†´í¤—‘Áî́|?k‹H%şFµïĝéËϤáhıh;„[›â daè­Ħ½Ĉ+İW7ĠOoAÂښşt ĊĊĜşàĵ{mn—? {ĦŸUóŜn-CŬl¨M˜Öç ĊvAó~òbÂúÄë1˘ş?R´u µyO“WmûüuwkönŸ•VŝAŬħ>K+h;Ùu;?R<·ôĠ…V³0ÔÏpÑ€Š @`à g(NAòZ!­=…âÍс$ê­ĥĈ$ İIzÚ÷wÚmw ˜‹Ğjz‘"šäIħKÊbú<*2˨–ëŜ/Ċx‚[IŠl]ö­ĞÉğ^v{½‚ÒÀèÊuèĠƒ4ßÛb:Wñ°uŒ½}î-ĥû›È+Hğ]³µñGÛñğ ğ ş·ĉë€ZżĠ½{Ğ;×N’Ĝŭĵq~—biĞñĞzÌÛÇĤ*\Ċİtoƒà pL`b-kv"£…ŸĜ½O 00a ÂÀ„‘˘ċäMÊ1Ċc)4(ġEDë¨gùşšÇÒéğaí‚2@"U%²(ğĞâ#É×Ï6˜İFè ‹k9îEu@É[àÓżuÁ4­”ÂäŞçQtżşx6#Ö×fċ‰e×L˘Ğ wt9uÙÊÓKRsßM}˘q>şĴXT´-½dááâ.µK¸RˆÖğÒ} –[Ö› M fë ĵVş¸Jwîċ%OCšĵ9óĠ>gKä {ψ^ŒŽfÀĊĴX²ùLċBĦ…Ż6N5¨%°(œĊ‘gɞÈ8? ĉèⳚEU%$ş”Z,×JşÇè5—¤ĊŽ,€ÖÉ\Ôp#è…E;OUE°ÏƒPè)x{Ÿ@Ğé.yî˘Ŝ£Ğ ĦMOÚe“˘ŜDŻl{ċşToÂÉ]7YµĜ*öĠwŬħ´ôJÈĉ]ĴĥÖ­€/ŸnëĜÚm}^í[[·İ•,SƒîX_ĊhĜj—™^£ôŭWmƒ—ê֝Ë-£##3F6ëĈŝ:Š™”Q'0bÊ`Wû[D’ ”ÔÀ(’="Ĉ{²Zc`TŻK\ġ•Óꕴ—TìJfԋj3B“^ĦHiċĵ@-n71 p 6!”Úżg‰~éöÙkËŬŭ,ƒ$]ùeTÜ%mà5KŠÚ'B5~ŬğÔb‘˘ëG½…ÍÔiŬ*ñş³ÍÚ$Ŭœ§nÏıò]QĠšŜQcß<Ï*]_µVöâdv½Ğë óĜş€u†Ô= ¨ġ,ݧ°’Œ"ÚH‡LǓĠ}× 0'€D£D)ˆ 8çk0€£#8F&8& ˜V”K—Ŭ˙ ë‘dQ&µ°ŒàâwÄ:KĥĞ5fïġ*ÛPĵFrĠŬ ğ¸,yÀ纘"W TÈRËĴÒÒ çuħĝxM/½äkğr芕¤×n‚^˙S…0› ĵçČêŬSÛBıĊšĜ,Xh,ÔĴÉk.µ8š ßòFÇ£U™îżU(hmkb{ĵ—²„|ÍEf`+¤y^ Ï!î+/şeÍYċâÒܛ˘;Ϩa9-çB Ŝç͊ÔÙq5ç*ŞxòŠ'Ûnáè"(L‰˘{É,(…#'‹))–^áƒıĜĊ< vL ÑU§)³/éZÛ5†v,W×éµvŒmµà ˜â€Ñ2Ûv½@b}Fvı!–’ˆ€är‹.¸ĊTXFé ˆiñŸSˆ— ]‚ċpM`XÔݽÎ+Óş‰’†l 0S3U{ó{ğÔ0–š+B°ôĞœ²[,ŠTÔa-˙ĥ¤ìâ>3m÷Żyħ7zaq(Ğoħ5ŬÛ˘È–x9VvĊñR_fpŬtAQÚÎîħHħŠĉtââşh/™ĝ´-Ò,SžÓuéÂ#‘Kx¸pKÙu2Žħ ĴÔk§kê‡<’Û‰ħJß§\Ûc?p€úTJE)V•m›!T"-Ğx*ŒŒ:NŞPrħ)1mLĦ´€ĴÁd)ÊäDŸ„˘"Ŝ4ÊUñj H:=ĞĵàĈĊ£ĵè’ŬPâxjµ$‰ö…­Œ­ÒIHL1Ċ—9>#^#hşÏìâòÌ.–ĝĉ2ħû‘éT´‰‚)ÀÁÛ'ƒ#™%AC¤X€ˆ2°‘=ßt,ĠXğ’" œsd$ħŝFĞxR¤ÌYêšÒ˜TQÒZÁa*܁1XBjlB}&ÄR&c­Dµ.óM33ÔK5³,)Y|ˆ÷"‚ Ċç‘ŭ >Sğ§˘ ‘“ùŸó°b*p–  ‘VYD”RşmPĞĠ*ŭl^Ó#ŠĊê1->ƒçú#"†zĊY3:k1+ÒÚyŬnš-"dU'Nĝ9ı¸¸³{ÏĉbÖĤ)tÒ G5QĴU}+U ëğeĦÂzm])bñ’’MıèvÙwQ:ʕEŽ Ž°…Ó‹säıŠ6-´™^È4V*Ż8-ÀOS;žEvŝœĝ˘3€eC†SbJF&Ó#8dG{Í(zCê\“6§&ÑԚí†Éşf1(ëQÙVĠÈ9‡ Q:–´xÛ.PßlL…Ğ1Á-îšğ[ħ×TŜv-ÙJ²ĠœŻ—“< Ğ(ù…WİY'Ù Ĥċ·Zm[sŞ­ĴŜF'ğġ8iëŒ2"l8çTkNUÍħÎPTĞRq=¨È"´EP#ċ}Y˜´pÄü­ş›JJ@0ëfŭċç·Lr BvR­‹*Ù#rbÄ6~–ŠS)_sİJaĠ‹ˆıu —lPğÈ!A Añ…(Üĝ >ŭäÇx||RΠì½à$şÎtÑâËvˆÊRŽÖ]Jj¸”ş…ô²šv3îʁÂĤÈíĠxxdïE´ŽHñîó_ŭßŝÂ˙óoŝ_Ŝ}ŝë߈a5[• °c”íÓ­]Ê'Ĝr^jÁp]’lĤ\§ Ĥ+ß?gğ'ħĉîĵV w͒}IIhžv²#n8Ğ cy‹³¤éݘÍu_ıú¨ĜżÈ-Ĵ_ê•z‹jWĦ£­Ö4ż´Ê N9F­³qéGĉ/1ŝÒŭñs÷{Á1Q„­¤ĠsQ‚z¤4imÙ£KkU!}GAè"ûwö]+-dsgIÒ"A ĝğçożûŜû/ŝ˙n ÓŻĵ÷_ŠÈlƒ½.ĵÔWË·]ô4ú/a<Ŭ ş}—ËĥĤµ3+<$ñq†O÷ÇÏ˙żŸ„éŻüîÛĝéğI˘E€—²ĵ@ËB%î‡Ŭ´ïKëSo÷½mÚ‹.™sĞbÂu% +Ĥ1 xGNè|~÷Ċ_üÓéô'çóùs™hÑ]²l{Üê6فİK—´&\èúĵ²b˜ùp<ż÷€?ó;GÈÛOĝì—Oy=j‰œĜ‘Ü‘4ĊJsüĝ’ĞîV›²Òwˆö4’ĠÀL\v‹K' jRÔĵ‘…*żôAĤiúĠétúÙ_|ñGïŜ½û÷~ % íĵï`ÔËW³>Ĵ,•Ĉ{†áöíÛ áİòûL q„ybYNJÓ/-ƒ‹|šû]•`xɃsmŭêí'€µĞ,ČqÀIK*GFYP ˘Ŝy>Ÿ?{÷îŬo>ûì³_ŸN§§°AĜN]şĵ 5À(Má =<<<ÀápĝÄ{˙¨ pì/"ˆ—eŠJÑòB ÄH{* ÑL!/"Ó<ÏçÓéôôôôtŸŞĊßò=°%ùîÒË˵5RĞ–­iĉ͛7"2‰ˆ×4+CŬ,EË­U@H]]bn]Ğ: ½B-jħ×uáo“F)WŞKÁĉŒè²ĞĴ£#i€ÓĤIl,]ş|´ŒqCá„ÂJÊ\_‰WqqÓ­™+·d$’Ġ Ó ş‹ÒóG0-Tû Ά–żdI^(]´p(éPêÒËË(›5IJéċLħ ŒÉĵ,”BR½jÙ†"Á.<àF곸Òŭ˘Ğ>.ĊNŬ·'1~'Ŝ²8€÷À¨L-@ê¸K——·’ö2ê2lK.ZÏ-V0ŞĠÇÏ˙ìTQS3I­K4÷YÜ酤Ġ]S7_ƒPÒ JU‰:“N°ï²kñÛuéÒċe@)‘\ĜĤL ĴZĊPv׉·~ñÁê‘Vk‚€\lû.ݵ}—H÷‘'ħ҄ê\ĤƒÓb!ĠŭZI —²ìöĴ¤>ĵğtıŞF6ç‹`Ÿ­ž—ŒžpħĴ=1 St×I᲋íè * ĤX³t1ŝÜÒsŒü:fıŭK+éEôÂëv†Kŝín9uér;(éTóÚm^jıÜBlAA֖ĤK š=+-·—HÏѲ°ônK; ½ˆHfjÌ£¸£zäVÖTœË%Àıe2uéòŠĠǕÓBŻÌ³›ĉ`9‡£sIJhURùl1ïUĠÈÀJ×ëb; ½êU÷BÒĈèOšh37ŠĥètaR0 4Ž#ŽÇ@D: 1ss¤}nZW˙îÒċğ=7×Ê^ú÷žğ\DÔ{ŻŞJçóYçy†…­tIÙ[Í+”MAÍ>ò›7oĝ͛7‡áà†apÌÌ[MR B-@ê`ÔċµƒR H8İŞŞˆˆ÷>LÓŜż?½˙^žžžä|>{O€i&@‡IÀLšÈƒÖğÔ*IKÓ´.>|´Û€É ´vÇĊ›èh)ëž@àöXnÒà33½yóĈ}ú駇ï}ï{oĈq|dĉç܈ÈDL-Ù³”şty Ô°P”\„Â,"§yžŸŜDDÓ<ÏáÂ]á‘:2Î'9Ċ“×5ż*4Żşĝŝğt@ú`IÔR7‘}ÄZŬÀ"b°iAŜ1Ĉqà•–Q*ĵ£qŬ›7ooßŭä͛7ßxxĝ­a~0 ÷ĵ!˘aÇ êÖQ—.Ĝ¸î´ġıŞzU}Bĝ|†ßÑÏCŸ…|˙ŝŭ4MSÀşi_sÄ|88ĵ],“u ĊğĠ‘HŒA½C_¤èËxÔun]ĉ­g%Ĥhĥ˜0ş~kÑ´\|<Ŭñx|xóĉÍ÷ŝôżöoü÷˙ğóO‚o$ĝGUu–ÏcʖnFU”.Ñ,*zĞoĞU…‘~¨ġ›/oÛ×Î&­Í7{nŝù*Ċ3>Ċ6Kñĵßßŭğ-‰÷NRu??Œî8ŭ€[LûÇŝǗkQ?n•H§[×CèTék‘@…3? Üû˙äOž~ñŝ˙ó3„ çóُÇîŬ;E^{&Ç80á@ FD˜Ró>QL~B˜ž“ĝi† ŬLê€tç'lzó%·0Ûp1ÇžÀäĝVYH Îıáp8<‡Œĝğî_ŭŻŝ·äĝ4ü¤ fZµP'­Ğ ÊsŽó‡‹EŠ‚Ŝҝ­­z½½rÁĜb5.ĥžĈï-„é'ÔĠê$iYŸ­,ŝ›šW|ת×XD—cÄĊçĞóĴV×Ħ‰m“Ċ@ÓzčûÛd­F°pÈz5Ö|‹gÄĠ¤à˘§ċ|U4^' ĊYĜ¸Û*r?²vĥîĤĵşUIÁÉ ’_=¸¨Ġ179˜°êtQİè “~ĞĊyËòÌÄ ” ïN‚éŭß?ĝ7‡ûáäœ;#ĉĊqe!mô8ÇD#€q`ĝy3ažŜ1ó÷3Ĥ“‡Ÿà8BĉÁŽÔ݃: ½(İĈş7ZĠˆU*ÎGÀ` A‘€°÷bÎ9wdĉï1ó˙ĝ—ŜcTàGŽĈ8,Œiò–AÓĵ QZħ¨úÚ,ÓvqÙĝ:Šu#­/ŞqHkD hkƒb9ħÈ߅L2I{‹m TƒŸ&4µ…UmÍĠÍâĴ ĜöyÁ˘ôıqŞnñVlѳ/]ׁJ °Îà% èjy-‰ Í'Ed97£–I×AL  %ê]žŠĈĊŽŠµ›—sK'J.µI Û·nty™" kİFˆJ9ÎÀĞĥx {‰,hž€R`ÏÎ&Jˆ@˘iœ–C·¸?µÑ¨ [F™ KŠbT…(áó÷ïŸN˜˙à˙ĊÎıŸ0óŸ8ç~óşïÍÓ2‘È1˓Ç/?›î‹>˙|ĈÓÉË'ÓTœT¨˜ew9ÑİK¤Á(8Ĝ“2N|PʔBYİŒ*1ZŝçJßeÂ̎™Gf~tÎŭ€záO "qbúʀ@Ŭ{E+}NKġ‚[²IháÖÓdŜÒ˘™ŠƒJa:ÔĜĦ%XSħĝŒ6E7ġZ”4óúşò$ŝ“#™eé2UHîàü+€È a lĉ%\V1UInN(ˆĜ€ "+Ê(- •– ĞÈä° WgĦx1ËEVV†–Ŝşâ9Ô#§/ÏtÙFŜµdĠ’]>}àmèÊlä‰ĞQ5ž…x<2€Ló#1ĜnĈ LiàÌşné"‹Ċ­Áh¸ÌʁCdC ŝgáñÒD£°xšÓŭ´ëU—ŸŽˆ‰ˆèûÌühsÏ]ˆa1* ~ŭòîŭŒù@™;¨Rï˜âü W`JşÊZLߓ.ñ:²…Ò23M ™úÉhqú,ŠE_ħ•,1ı”‹•™Ûiqħi•ŝżr‘Ùb^W÷rñ1™…b|fZ ğR‹…”@ ‹ë‹9gzÖĠ¤<,~FZĴŸ`@+²Pħ{,R~”ŸŜ7ET*4ˆÚµµ^‚tÏÉÊ3 (Y¨ñYÒ˘ PéZ´û äÎ8M_¸ƒ”!ĴĴóJS*,;r€áÍqHôÑĉÜhs ´'‘hšR:SlÒ'a5´T¸µĉ]: ½ ÁÚíUX ˘”Ö´H3/›ìÎÚeWD$â{ûžM ‚6‰U—ŭI;öħYèġr¸D7û2 =]$”Œ 4Š9ïĈѝ×AŬ(”ZúĞŸÉĊ}.Ş‚îĔTd׋‹§Ğ/×Ì+`Ż–ÚşÛÂDµÚW-²Ŝ‡´nk;‹ ş§Ġ ÷nyàr1ߢ•_ħI/-€‰À¤‚Ĵn˜Ĥj_Ŭ˙U[çíùKşo>ÖhŒ#'uHşbÖs•Ş9lÊA‰‚ÀOA>YcIQ ’* ͟ߗÓHwûì̵mîĞZK ĤY N)ÇCl²ìÍÏ2$ UeábàƒĞÍnÜ^ġJŸĤí:ş,´Á\>ÉÛD#‰ŭ[tħbJ…?-’uĵ{K@Û VULZiı…Y‹Íz˙²>îp ħ¸5·Ñ ·@ê6°Òö)2ÈÊŭ).0‚Û(HEvÒÍ i;`£hXâŞ+Oëâ’[ÒBÉ2jVUšƒ¨WŠAҜv½Ä_ì>onĞYÍ=§ÀĊ ÂÙ+ĉ “%Ȝ҅İXĴ°¤tçR*MÉş*Â]‚Úù£"Mš,Ġ{I^ĠÙè²ïúnĈ‘iċ.Ëqí\úìż… AĴĈb)éb M‹µğ0'8%†‚TO&ÈĊ˜DİÂßîÊ~(lÈÙqíܤ(Ȍ…Ĥħ–'Fƒ5Ĥ1<°ĤÂbrë"Y2™;T_"k‹bÇbÇY#'&ˆW0Û9ӄAHí÷ĵ¤ĉ§b\ój´evG-Îİ(„)犓£˜3rÌä”V^ ~ï‰ÉU·„%ŭ˘ ÑĴ Ŝ+4)T$Ï7ĵ- iGS„ !a"ínLL˙ïI ^€´ Ó6  B°–'ÊÈYj;ñ£š kh™ıÛtÄ šo‘Tˆ˙ÄĴÒ  !ÂĴŠ 1Hñĉ¸-Y%|ıX)hñ}[ád.cIûiÌıv[6T*luÄyħS)‹R]vIĵÇVĜˆĠâı,ÖaY?4²³4á*<ĈçÄĥ­Ġġ‚F ’kbÈY-LbmpÉÑb1‰1}eÑ“Ċ§ĥ`!Qh1FĞKŒ €††Â“zdˆ¸£D:—Q“G²úਘ¸ƒ³¸˘‚­ĞLµÎƒ‡ ˜£–š,x…³ħà({\ĵcùXJ–™ f˘³ A&=88d ğ"*Ş ›{ĊûàheQñĵ;ĥVA~Z3ˆ–Ù]‰!a Ü.n:"´3ï R€-NMRZ„VöÒÂ×ñ“–ït­$h$O~MZÜt6Í4Q&-×Ĥítñš8ġëĝ*·˘ħmNvXS ĉ”lJkî.óxɚ³{2÷áwf£HôQ+ÒSڜ{²‚êëiş¨ Z-yóìğïŠĈ(é‹/&_ߤвLDµ ÷“ßÇô§˙‹xúÁïâáˆ#ǀqöcp‘˜`f°ı(UfïñžŸ­%`5?5hdJâ¨P…Z{­S4}ˆ+˘Û.î´’BŽ!m³‚Ċ7$ǽws<ë,ğ²‰RĴǛ›2öRĉœ·ż³D0šm%œŜ?úż˙ÛïŽ?˙Ÿ˙dšDD‚ˆžTU°),,Ÿ½Ğ­İÄġù÷ìR7Šfğ‰ŻòaÒÎI|mħgŬ¸ï„ö(Ĥ^Ż´ÖÉ{£ü`MĤÊN0"f⎀Ĉż÷[ŸóŸŭŜé†W#ü ƒeĉıX50ƒÎ8³µ;ŭÒÜ\ßRKàićÒ?_iXş {NC¤{%’(ë’u$mdİŠ á‚vn cw5ŻÚ’ò 8+R• Hˆ™sˆgL)6ìOŒwó§ŜÉ<ŭñ4M?ïż‘9G–feĞŠ”Şıً-Yzç÷]ûˆ"Œ×j>YwC&fsŸ‡ß:¸óï|ò{żċŝó'ÌSˆd ¨2t ˆœÜࠓ€$ĥ‡Ĝbg9s…ĤÂñLñ.[E€-½Ïî²ë€ôĞjNŻÙí¤´dżĠ<[ ĥ† ƒ=ò¨ÙĤ¸Q°ì9ŻŒĉŠòċ˳‡2ëù|ŝċétúwïŜŭñétú,„0àH H;]6;Ntù:,Ĥ½f–éßĴŞäœ;<<<|˙͛7g"w~úùqÈ.Ĉ9„èޘF£ó Dôàb,** ì*tcÒ„0…Ĝf˘QsGWwÙu@z!+).^ˆQˆ# chƒhs£ŭ•n•D’3éÑ}j0Ò% ñŜŝôôôË/ĝâg_~ùċݧi:QrÛ%PÒ€ŠÏğÓċĞvŬÑĊ•¤§ŞÊ‡áĝÉ'Ÿœ™yÇñG óÄÂ#€³•Ğ t` Şœ&X€¤~͆Ĉ5`%–t 1VW²pٙĠ“: ½È´İ [äb À<)XvH-÷'dIcBħŜ‰0‹,…şĵJQ,I–=–²˜Eäižçw§ÓéË/ĝâó§§§SD˜ déÂëVR—ŻË:ŞiµÒßlàÇÇLJaĈ7oŜĵ‘'r„˜JgÖGwÚdY|@€ş˜.Ä&a·:$4RşŻğî,ÉH#‡]vĊmßİ‘S,W t İÒŬ.ğ53uÉz]šPJK"Şî-魐ùĈwÄZωZÜh)ÍË&+œoħmšŞ!ĝ‚GÁ‹ZT@Ԍ/uéò¨{5(Ġ­ 2×\ÁĞjÓ!ĊPyt ˘]Ċ4ǎä1 ‚@S@¸Ĵz^§L4,aĠÁıÚ*Zi˘ rŬZ—H/ƒK66eCjşdGù àár?"´SżW°(fQˆQŝ”œs‹S!Ġ ×Ċ” bşPQ œş…Ôċ›b!m@¨Ÿ…ûYó/­AĦĝP4‹'/P!èÀ<ü<üTUÈ,Ŝ˜A˜c#ÂŞ…T&1ìıë,J”³Aiâeä†mŸ!üÉCߎà9v{ŭàùİP™­F‡ş;ċÒÂ<ñ/míÂ.> Jm4t[(öI\òá‹yäî´vé„Ì~ĵš`@ĉ›Ó‚8‚ˆZ`*0 hğí¤ƒQ—Ż”êİ€¨ĴŸ i|SbáxĦ*鉰î°K‡DÊ->|0@$…S-5“mÚsdŸM^”–ÈPîÖşjž,(1çR&ÈĴU jÉütjLF WUò³·iÏJŞÁ¨OĦ.Z TğëÖĴ"Ħˆ!!2’cè6íàK212‡à‡’4H· 'a~pħ5Igûî€t7il%’Z0W¤•e×VÄÎħû)R]çühĠìL"ó?³•< L¤²ˆnIrèÙv]jë(½ûq£…n5^co*PĥjÖşPĠZݤ˘ÔÒäôÓĜğ*WĤ§V-µeÄĈômìey¤4ʖĠĥèĦˆĉğyÙîΨQBnV²)—cžr1ll`dI TP ˜ô‚•ÔAİËÇ£Ú:RlŬuċïRB2Ĉ%-üJ!‚ƒoŞz:‰ÇJŞ$³+„n5u!HlËѧQ¤—œB˘Öâ¤ĤĴŞ8ĴˆbvœÜ“Ô@€†Ċŭĵjfg–QjG˘ÜÑSË´o)²íêxR ¤[H]& İ´ŽhgüY³ĠĜŽ Ì?tIÁŜto5 p u‚ğ2 LI„&öZĤMu\rœşXġÙÔéeì£Ô–;T´<0‹tİ…ù3L²ÔDè'S+`İ6P4gYRƒV`TżĊ‘z-R— F% •:nlO…ĥ$4Xz¤Ĉ€ıMùFkŒ;r.ZS ğµĤ̈Á§°Ä’êYñ=·Ŭöuêw. ŒJÀAc Öià-jШ0JLŻsôjÖ"ŽÒà ÷èŒd½f’{0Ó{Uó>iŒ‰ġğK¤—hk‚Ô  RÊŭŞlĤ×:èz”S›œeÚm'ŭs^İĦË×e%Ħa ŬúŠÊ³1òKcä.è¤j–†èKœ>XuÜ:*&1ĈĠ'S¤˜:KÍB ÚŞÌfÛŝŜ‘—=‰½JKiF¤‘ĈÄà¤$X­Ĵ$Ċġ6ş|VŬ˘LUcÛ½BE²µ²ŒZÁÊ7gµJ"÷OP•¨p?·g‰§2½HlıRŸ*QÁëkÌM†5y#YĤ›$*“;ĈY¨W$Óżó%²¸í³àRŬ‘j'ßêòQt<*í‡kšêf“ÄjƒŞŻV0G€úp_Ĉ[vŬ+Èı8?ËcëRû”ZêYv7I´]{fîê è_uH]zƒ‰èŬiß%yknȗ|*·Ŭ˘ġéġi„+–Ouù*­"½2ŻW+†%Syëµ(~½¤cßÙJœÊĈ¤Ş}•mÊ%ZnK€.îÖĉ,.YŒšĈ'‚„ĉĈy÷‚Q*°HiŜĦ(ÈUk´3XJï“;ž{˜ @ÜĠı.KÉğ:ĥn{aĦÍZ%‘oÀ¸ZA×gžże÷Y+˜JUÁĵĊÖğê: ½(*ÙÍâKÏ˘ĊJŠ}VÄPŠp_%xVi‰Yia•ş;) c7,]şĵ†ıİ€z‰ÖHË1Ğ…˜b­ê–fèCTıÄYÙàÏËs7wrĠH/ÑI´Fĵb(Ŝ7[D|è37D"i]‘oħcĊİ´3“ty" ¸AŞZL˜ô]Ş$ż§4 ëcÔĉ]ĊĊ˘è1¤H/F‹URHHĠœO ÷eò¤cĤÄŞ-£rÔSŒ]£÷\éò:ç(ŠXKZmµħn–÷ƒEĈ‡ŒtŬ ;WRr÷ċĥÒ ĝ#‚ˆ.QɖäĤDáŜÁÎd-/" ƒ&&/]ú2•Ö9Û´ÛH]^ċ ¨:WÄsÖ@‘è…â÷÷Ó{i]ßÛ£ü}²”ş…ÔéŝÑı”aq͵HEe¸hì–z³ÜÏ!d^<ħ˘:İ'D,™˘ö.ŻÓ<2ÖmÉ ‹?µ.ǽ´^ĞŭjtŻï‘ê}ì›Ô³ì: ½Èx'³HP5Ùt9îêzÏ1eÙ_rŭ Êx•YjĦLxèÖQ—׉H”óm0Bú^˘Ac]\ï³Ê"mPÇM0ÊÄŞ‹n–^{‹&dÖĥˆ–Ò†b* ´°¨Ġb)äİ0VVˆ˘à/̓ /RûÔË·…ħ0•ˆĥÛüЉŭ}NS\JŞÊġ2 Y$ċÎÓ]ş…t§K9Ĥ“Û“ëš.XÖCtŻŬ0Mj˜T4EĞĴ>Ğı#SÎğ×ËĞ„¤Tµ FQğ£Ô$È VïXĴ(–ŻSÈĞ(âEĦNÔé0”­ İ.š´£Ġĵ"ĝe7.nşR;“"%\:żB—×Üg!%KlU-ż£²ıs\#z.l·îí ( °Û™•¨èKäî?Ĵ„˜¤^0JİċcFA"ğ8şÖċµêŒFn*Úµ>eĤğ˜iwŻ…”ĵR%–Ğ+'Ͳmµué€ôÁÏê$,Ê×ò’•F&w'5˜FċŒQ)Í#XÜÊxÉuİË+œˆuF%ñŒ˜-cU— }’JXê÷ê.lrf‰1v@z‰Żd‰)fS£‡F‹fi½r'2B‚Ñù…P5qgebUscSWşĵZ†L06•uH…‹,ˆ5şLÚċË‚¨Ġí¤|Û?Ôz!­j ğt@şX1ˆÖ$ĞVûPĥœˆ@’ğ¨d ĦìƒÖ"–UÉRÁw×ËkTipK?$İ “"ÇĉkOä ÷0ݨ%H÷ĊÜVdW zal¤—ÑÀdĠ÷+dżpnÜgĉ<ݚö}€8äÉC.ñtm ŝD%ÒIˆtZ}ĵwy…£Î!²0$RÇŒ$€¸×ƒĦWNfdŝĵÊM¨°ïÍU§*ıY—Hw >µVÈ+"U,h¤… ôŜžHĈl"‰N߂˘K+ġ˘1 ĠIqwQwy• #2{JĞ(˙+ilı8öÎc†˘éßÊM¨ëcڋ¨+Œ^jÄ`DT[*…Ĉ/W‡”ÉDWìßĞΉĵX£Żşĝ.ŻÑƒBLċ–F ólÑXo˘ŞÊïàğĵJ g4>-0Êïiħpîİ, 3tŒbWgד: ½„FFƒE+@(ùU—Ö*÷g•f:"Š~ğş=ùXX[d}ÀwyFRTeMş]‚Q%ÛÈËŭ+Ÿ—è޳d‰ĉÔ3°JçĠҋXID 1–†PKühİ ÒT·R“>ìİ(YĞTĥ4_܂œšŠnùîşty-s4ÑòTDĵ‚—â=zo-€CĉŽÛLù~ğĊ*dñtté€tÏĜk‘,]vE.½Ö˜ŭP ‰€Ĝş<(J&ײ/r7ȸûëşĵĉYĴßQ şŜN%Äız/68ĥNµŸjĥˆ!;Ĥ€úRÛé%]ëú#ĴèCk̇ŠıË*‹ğeDž ˘(-Î#Ò i.]^yd󀨠ñi€1È…³÷êoŞÑ2Ğ ^ËbܢCôŝbÜH]–qq¤Â2*Ú!!€^À4— ^Ví\°5Ìb²…–HÙË+$Ğ_Ġùl:™kv™ĊĜì} ¨ `L{ÜɲK1ĤÔsşğĠ; ½È€Ï}‰"g–Ĉ‘VV“—pXÛr"ñşĜ{ġĜ ô´ĝa—.Żjn.T@*²F“¨˜'/ħò•-%š–™. +Úçg¤ò,T#²;¨’ÒĊDw7Ë#Ğ}"Ž â-×8ĴG“„¨2¨ÛG]^é*9ä¸ÑŝA–Î­Š˜§zÖ[ê@[S¤Ĵ²acfRT.ûRÛé%IŠ^CÍL™Ü "WŒßƒÄ€ÌšÇŝjŸ²ĝ윳<×KÁğĵbQ ‚ĠĊ>YeĜQ˘Kpü=ˊú¤1Ö­Ì5ÄĴ>¨÷JÒŭRúS`rI^XÒ°‰ !Hĥ–îë4¤F`E³‹ U˘%+—D—.Żh~jĴ ÊîğÒ2Úşîç²CÁl|êZvÓ ­£Áu…ħÒ˨`ĊŻ[‚Ŭ] 15üŜĈ*Ñ 'ĦÊ’jFäIÚÇz—׌JÏÁÒáıÑBƒŻRfï8dÒ:™ĥ–Qš¨ÄËDC¤H/G6ŽBŞÖGKÏc9/à —‰a9Ĥ4&cŬ뢏÷.ŻO_\€!(ÔÑN˘X ]vî8o‘^N…[Bk}Š/Ç.µ]: ½„òEdlŜEZŬ& ;ŬÉN;gYH“?œi41­i %wD—.ŻÍ‘\ul´@-ÔÊġG´ÌĠûV HĴEb^[FĠvBĉ´ërY†~ nPˆĴĈH$ĴjK#dî*â;éíëH°ŝ°‚”(RT×ĝK—×d!İʒö]YFÖĈJ ġ"ı_w#Ê/ k–qPyFzĴ˜íÒ-¤ïÉ"2jûĠ˜’ġ†bğT^†+‹ty@+†ñbçÎQ,Žu İËëó`v‘QğFÙó  aˆŒ /³0mì%œ.‹tF¤—ÑÀˆL‘ʇZñĠuzĝÔAÙAhĤ ÁĞM°}uy…Ŝ‹l•PvŸµÀ(öÔÏÑ˘ıkş˘$†XŠÍR!ĦëYv^ÌJŠŝé”ÖŬ"RL§ê×µĴ}%ŽĵRĞRĊ†LĵĢ>ŜğĵJFjĵË “-@ÄZŠċŭSTÌMGŽĞŽħâhž XËéCê€tżO`iNDkVïBQoYw֞â^ĥïèbˆÇĊn58ĉîÒċ•NPĞÏ£”f½c­"˙6óŬµHı>qĠmíĊP"csÀ:ĥK¤ğÁ²7Wiß@äDMQ½oŽY˙/İSI[$Ğ9Mĵ›H]^…µƒFMPڀŠŒ¸ûÀ!6Ȕ˜ċ ,EŠ%HġQ„>?; ½ •4şìêU&öx˨ •Ğíı‡³É’yìv]rĉ.L•ğ]ëòÑÈ9K,Ĝsa)†Ġ ?N1\ç,{}M+sà‹0Dt@zí"dÖzÀ Ëè%úž$7`>è}0âò”şÖċ5j‹f­¨”I •ÛĤÄ$}—!Ĉ†,Ú#vñÌ=ÉÒKÜ!ʜuTŒñÔı5eùˆĴŭÈw w8xÙĤk݉‚ħ}£7ëòJĈ¨½qQ˜Ŝ£Tá.…›í^ VìjôA[Ë€ĝ—³Ì: uÉ,5#d7–˙KµC/á6#@ĵÂ9süU”Ei|ç ô /AÏĠË·Ò@„`NŠĤ”LێßÍ Èüċ;`¤Q³TéîşH/Fyá—e\ie­ĴZ%ÉËdمY+Góy‘AÂı!ğtyeÊ"³çöhğ˜ALPÓ]1ŜXsH ™Ğ엃D%ĥóĜu@z1 L ß\1ŜKî*Ùjm÷҄$OQšjÁġEr’£žÏċĠ"’f-m'ċ‚l+İ9ßó“ÈÀ(„87ëÉWî;u•íµë^lȋĝW–QQç bHBzï‹ZŸĠ:¤ò Ù0~+ˆêïoyÑË·TcL5û £k‚l2İÜçÂPU‹Dnƒ‘"ƒE àŽH^È%3J˜.Mú c)‡Ü=îˆ ÌÓa ˆw“ıvéò­žŸXÈK‰ĥ´^Ċĥ˜ıj%ólŒ¤ÇéXĥ`T¸:tÓòıK¤ğĵbáóm¤ÑéÒH‚6ĝçžïYAĈ‚6g!ċıñ¨Ëk_ÁÈıuòÀ Œ"€QœW÷.}eFö\êŭ²XP_n; ½€GL™<µF@¤ïÉwrÙ€aHéċu:÷ˆ’&œè’vŜËkS­aŜŠBĞEµe ÌtŬdÄĥÔ(×)Â9Ëĵí*c¤—ïıùžn“ù½DeIJHıóĦh‘ÍÓ£ĵ­ú2”ú]ş|'¨sfhŝğIĤX; ˜ï[ú–Ĉ€a÷´b\Ë$B@ŻÍè€ô2žt×2JÌÂÉ*"ÇíĈ‘ÏħT1KEı4ÀÈb[â„X·ÔŬÔ]^xYڊïµ~‘U…cğûcHDœû0ĠqĞÜÊ\"iêÛuĈH/á ó=kP‰BOJeHÁ(ĉĊšùŬlÇpœ†‘z^$:¨ tĥ.~=ïğËĞ”u˙Ġš "883\î ç˘ċxiiQƒQBi°wé€tÇàSÑHѓXµÍ2Ò* ;}w74(à˜0(ÀĞ ŻŽe­Íi °NÔċ•jŒéŬNóÌäupD`XìÜ]‡ÔDY¤ şiФ\şÒĜéîážèŞĞoŬ+À]'@|r|0NħAèŞĉ¤‚CĞ'tyµxDÁ¨În-4Ĉa08‚\œÏw—fġOÚ`d ü¤ĥ€tòHwHdÄ݉Ħ÷)£ÓEZÁŭuAdqځÁ1Ž‰è¤£|lÑĜ4p•TÑË뙠J0×Xğ_ÙÀŒÁȲìîċœT²KIäMœZ‰jSİK¤; cD̄°—ŝ-r\ÒßqLÙ+F˘F{:èÂ4,ÒÇ{—WèÁ0eŒyħˆ 0rLÂà" ‡L´t|ŭàu!şL$xìSü-kDƒH^LÜHëZŸ’Au™rżهށqàHNq Ê0•ħ~ż TĠ_ R5ĉmMÍú9İ€ÀKá IÖ ä"MPĤŜ_ı;ÔıŜ1ĥÒËCW‰HĜdÔDnG;Š1§;sĜÄ&˜Ĵ#Ĵf2‘äQ4vó#äÖ%| BT¸MJ0ş3-£K—gR‡|¨šħ$3džuPñ1Ĥ³ Û2éN5ĞĴù#Ô·§Kê“Dxߟx¤žL J”Ħ5`iV~Xc!í=ĉıAP3§Àݳy<€ÀAŒÉ„ W†²MZ.^zp}ßËǤ‹/U%ĠĦDDÌPL4Pm¤`Ç:$Mm*îŬ‰àÒbI°Ž-E6Ö 0=ËÒŭ)tĦ‘ŻÁˆÂĠäÔNuC>U„‘  ‘ ç„QM€{b+e İ£½ĝ6İë ÔċcvÓĠŻÍ8^’Ä ·Ù6ż€ca,Ċ˘ÙûÑ1a~ZǔËcZZĴŞ€‚ï³İÒK ’ZÒ@‘ú]XFñâ6Ĵû—r•²ò³ĥÁ}mŽáUËÌr²×֑ğ4ɍ×-¤._‡…TŽW·ó~ĊRŞŞDŽ 'ƒœ£ĵt·‡—HÁV@ĵ5ÜfÜĈ+LaZ4ô)ĠéeĤMT(s*–‰ 2+ÈIî0{Ĥ8T¤Z›lbV™Áİ3AgÀHD4YHĤE^sוéŬÒ°Žú,êòħĴ#Ü`!Ġ.ğ•…D‚6£e%02nHN_À}fn?vñ½„ꘒ v£‹°Ì€êÒéEHSĞĤ¨]ĦÑ):³#C Ó}=‘CÏ mÎ,£<á,™Ax:Ÿq<ÏBDçÜaLJ7oŜ<‘D$DŞżBDÂÌé}8{ßËǙVE‰BI€“^ü `x|||ÇñÁ9w ˘( à’ÜhešĞYIn4ĉⰐDb&“—ÊÚ*c][h]: ŬƒHĞàŠe/Ĵhİħ(ÏX†ċŽÑİĴŞı $ZI^—ŭʖŞbš<ŜŝGQfĉOÇqüÁ›7o~BDĝôÓOßèd0Jdµ#ĜżµR— HéUü›U•0Ù_gïŞò0 o2Ž˜ùSU!]üÍ+÷YċJSĝĠ{3ŜhmaIµ”oÙZ^p/Œí€ô"†˜ĈÍLħž`ŻëàRûr¨÷–(2Q¤Îb¤Ş[ê"fÂ4|y BŒĝù)Ç·"rJ “@ ‘H ‘€ş…Ôċ+µj@*\rT‚‘Ş3? £ñĝÓq’ĜUÊBUŬÌTÛ#İ÷y­c,hÛ)Ż $@uˆÌ=ËÒ ’QhlOŽZ*­–%t×K üÖ- €_Ÿ<ĝäÇ÷_TúôÉñxüœsŸŠÈÎI?,Ŭrġß „:uùj&ĥîğúo'{™ùÓa~‹ˆ>ùíïĝ£_-ĦšĜÓ7$2ƒ{`¸·ÉRjŬ°´žĜëÀĵ°}wé€ôŞ\̖r°mÀ¨z ƒz…„–:Ĥ„ñċ?v„'?Áĝû˙•·żû/ŭùîÏŝ†ÁŭE780Ċ6ÎD‰9ZqÖ6&– ĉŽËŞj--ˆ"­*[§'&Úş#ҒRħàŞic=(süŭ¨œü‰¸róëg£qÁ˘âçĞ÷ĠÏWד KF˜+ëUëhk;;\òĴi•ÇÒ|RñiĞ-×Ê]ş£8ž]´sßÓq6y/ċ˜ e^ß|RÂ'İ.ƒmI=àHÀáÀ8ŽNÎQÌĦu1c…@ÏW%ŝFċOáƒEÁ[Óú>¤ß­f¤´€ZÀDGĞE0²ŞÇ(֕ˆi½%Bb”->l­[Çôìš.•ŒOFċT,0 µd@ı:ÏT½U^BJp)A%‘ÛnF×àGÊ‹ŭ–ƒŠí'ÊyÒĠż•˘â鵸Ódnëä5P•›Ġ£*Ż Y[ WBŒT0–9ÛEŜĊRV‡ âk4IĤè¤ù]ÓħN(EP…Ï ³WLӌ³W<Ŝ½;7Ÿñ‡?{gc˘Ld<óA!`ö‚9ç9`öŠÓpš§ÓŒ§)~Oì@Şo.:JÏrí:ӂIeéĜÊK\çïòÇ·ĴÔcBv‘Q…\_K; ½ÓNñ aË[ƒPrU<_ûZ;ŝ¸tÄMŜż÷˜ÎaĞĜÎ!N2*ÎCñÁ kcíÓyabE´€ˆà†ƒc ŽŽ£ueVÒ8°YVĥ½-RìbV!İı“ ‡8Ër~E *ğ×òG²€M(4ŭ’ÖŸñ*$‘DU{5—×6ó‰@P֝=‹öñ7˘%Kä)†Ş6¤È\ĥÒtöÙr„Ô’ &U∀óĵµĥŬâzJñċ%Ħ(hrrĊĥÖaŸ€tİ™a^\—”ög&Š.İÂùÙO™ÄÏ5,ֆäĦZĝÓñÔG}@>Äż!f‰qĦ)Ó,8ÏÑ::=žÎ§³GšŬ·š&`bI ^ĴŜÚ2*5<6­1 ċ²ÓgM×`AŞìşòÚ KJ¤×!u@z 4ŠŞ3bê,E?‡†x7éúĝÖk“@4iĠ2E;?œžüÖĠ•ë˘$AÁjQYßyé²yRĦïäó„&Ç8”-¤ÑĊ÷GĞÊY†‹@vӝİ7Ĝƒ›m}—ZúŞ^<mŝĵ•‘ïİdw& OċА-ç£şú,î)×Ċ%˙lyhŻÛû#;Áż?¤4ŬŒR‰ò²ÚVë@R(~-•k²ŝ|ïĜxà–‰–zxM³`òï“Ì>`òŠópžç)àép:Kò:VÏ5ı$Ö, *gŸŬŽ.*Ü˙bĥWÎ\D19Ğ(ĥ´ttñé{ĥZ•”ĠUXFiUJıĥJÀ`ġE^AAç˜Zœ‹ ë…@8ʉXš˘ßûPżÌi-Á1eÎİĴ™\şZÎÇÉé–J“ĜŠÏDÎ@Ñ ‘sñú]ñ=›Ċ’dĴ)€U–¤vÇ10Ï.Ĥk—÷2Yy”ĥKą‹†h×+Ĵ8-â<+ΤÀG_L(QĈat ‡a` ¤”³œ8ŭ5 bìdİì¤ÁR÷ckJQĊ˘öìSÚyJ˜1÷@²~ ħġ‰†€D„/ż ^à½À 0û€9Óäc1ëÉ4yœĤ˘5CÊÀ#äbe­-êòŝQÙ³îÔŝY‰q$+0.Ž …ħĥw|FS´F ‹51À=†Ôé%-¤T”ÚtóÄ ¸ ¨ĉEZ]›Ŝ@Ġ Ş^U'Ċ“· 1;'{%.t°ZQȅĉHyáNY=jÁġÄò%³èâL˘A™°$0ÚöİĥÄÒğÁL1ŭâ?W€Ĝê†^"[ıWhŒ=Áq´|°Ú nI›†Üh <ĝà–tï 9•][DĞFàá£uÏŒî†0"[ĥ‘=s1Ç´ô3£@Şѐj|pħïPáżuV˜l ÚsQïAƒu'ġ]ü.ÜYÊuÌĤ`ŒŒš li)2Uá…ñŝĴÀÉ(ÍĈ8Ĉš2§À02X%Ô?sY7œ€DAä v„˜ˆġ`NjcúÄ߈ÄàaŸ‰÷E,>¤Ä‘UAÁ‡Hí3yxpLZ˜gĞ'òA"ëƒ3 RŽ×9Ž–^îA‡ƒR'˙fj'!‹R49UÈÀ-XñuéĥNÊ8Î_7Äg ê Ş“Íı€6¤ĠM+—9]PŠéFá¨0xİ—êÒé.0’bô‚5mò" YANW=“ZàS)"ADf9‹È;â"Ĉ£Éêxbĥ£Hċ’X´¨“,€qt+*˜úë‘dÉ0²}hXÀ*+Ԑèm(‚…_gżħ{26B´8Váƒ~°ExDĉòR‰™fJF?\Qς lÖ)/ĊżĤdÊ""ÀGj6*" 2ĥƒÄd dF‰D€Šû2†èÁAEÀŽ—”aQ ĥÀİħ&(ĜzPYs›dÉ"Z LctŒ N‰eApcTĉ:ŽyŬ£¤ì˜•˘ûlQ(<^OJÀ ààc#78 “À9† ÁbNqIfcÀàÁ>Ž "€NaQ°´@Q"¨R&VÔ>"0לĿJıĥȋböŒéì1Ğ ]>à ³77ZĴa"vf#TXŠN£R5ËÈ‘dQi´a´C9gcşµZ–#ÜhLŸĉŬ;›s³ÄŠw½Ù›AĵÔínÎË"Bc_L; ½ ‘Ú"KQ³Zpƒ™@˘ ‘[†żî¸Šd•ÂBx !üĉg _üâgP˙˜­Ò²t¤ĴöçÂĠÓĈ‡ż…£²Ŝ°ĤR,l)ÉÉÍ´ŽĦĤüÈTLË%&³ÄçğBá3›s³ŞÊŽğnëŬÈuȲG7h˜‰ŒàeFT—H÷G‘â€_d•ü`E‰'ĊˆvƒĦ+)„àçy>MÓôùù|ŝÙ?úżŭŸ~öŝßûß˙Óû@” âbB½Ü­„òçpfuĤmZpèo96P;9°0Ğ•óğpÎ9ž­Eò˜˘PÑ8†6ĜɵuŬ^”?Êl öLZûmf[5ÙB…şX‡ËùP+Ë£|K‹—mĊT^ì^ÌpžwĜÔÙÈe)Ñğg>@Ìâş·.<”Aƒ`í…Vû& â o?wĊE‚·:YĦŜnë ÍUÑW@EĠ;7üfútüÙ4MŸÏó| !ĝÑ·MŭV@%X ùlk´Ÿw`İ.î3‘4ğ˜£ğBƒlĉKr)kË]—]^²Cá|>Ÿßż˙3?ŭ˙Ĉ˙ôéá'Î}ú="zk­šıjjFu“³›1§K—o•6ĝĵħ]gÌÙżĊbFïBŸOÓô‹÷ïß˙ñû÷ï?;ŸÏçR jsÜŽĦÂê½Xy,ĈoĜıì: ½”°cĉVÎ8ġ1ċ›‹ŒûÎċ yïċt:s_@͇á7ÎıGf>ÑX4,ş‰™iĞtĊfjYk]ş|Cġ@AjÓ\²d`(:$ĞŞÎ"r!Ÿ§B -jĦ”P”bH2·ÙNĦëŞğc—Hwβ*ym0*§§LĞŬ?½2݁ˆ`š&=ŸÏÓ0 gçܗSŒı˘3–QÙŜ9Ÿî5—Ĉßwùx DwüöCÜ[_™ħóżĦ ÛĴ”ĵäžkĵKï–D$ŜûYDÔ{D¤Žr1ö:›,Ö"ı§ F(êŝ@è ‘: ½€ë€Ä–`Z3+×ì²ù\µH—MӔœ>O1’ıxQ{şqqê óÍ(zĉ6ßf@Ò;Çh eŻ|/ÏZÌ ujL+Yó´Ô˙şIŸĥ8Ş´ğì: ½ÄÊA …@sÌŒ€XkB…Ïġ‰ÓŞK*F à‘€Êżx(ġñÍĦkŸÑ•íoŬç7ˆô˙Ġš/çġÂßksh³/M³dĥ4˙@vF™eâ›Ĵ/t@úvYHR™f–†í\!£ÂÉĠĝ+P#­&JKS(•ÀD PŞ[óôÑ˙Ŭ°Š=Ó[-âo0é –Î­ ½k tiŜqµŸFܕ—´oĞEÒ½†]!, ]: Ŭ5›LbİAS‰Ü’M#^pÄİ'ÌŜBEĠD‘`Q£o =€è†mżİÏ]o|ŻĉÊ-àU[IzAñğÔ:²žcí˘ö…Ó Ğ&‡ġ^ii•L¸Ü҇Ż&ÎĈ'E0JŬ§×½|"#“DŠĉ–utĞöÖZhZ–Ò50êÀôÍ[€eÏê½öÛ½çŝħÇÂsÜsWÙïqÉ]vyğ[_ġ~Ê{+ PjħòC}0Ĉó°sĊıßzħE¤—‘°µ‘>ÔĊ”–15k—Ŝ•ÄıàB¨Îŝ‚öâĠAéÛe%µÀ†nĝwùù­\ßĞHo”k t %pAċ…Ĝ›c-w]Œ4÷MħĉĜ§eíÙu^TĜÚ&É\\e”Ŝ³³xÓÎÔo´I%–TOiXJĜÑ ğ|3-£kÖħ‰sŽsŽ™™ÖÜ>Ğ}](Šŝ*ǕԨÁ³ÓVµì "ˆD,ûV€z޵té9Ġ`”ŻĦÙ1V,f¤z!êE‰D1²œw—]¤û§YtR* şġKPCäğ³ä‡ bġ‚µÔšÜ—4én}{,˘ĞÖ0 îp8àp8 ñx<2óèœ ˜jĤŽÍñî‚Úwcí%UU Ĉ8Ïçét:é<Ïb5y{îìKYĞ·ZZġsá ss{m)~ÄnéwÔrÛih@dĝu=ĊµÒ é}L`ĜA U›l¤XSbĵ¤kîŠK5—´ıKuˆ=îıŒòkG~||toß=}ûö“ñĝÉ8ŽosÌ<À¸L „+ÖÒWj)mşĞt>ö‘!LŜûÓ<ÏïN§Óç_~ù%Ŝż/!_´ƒ¸lnµ˘öĉ“4”†ŭ$ˆ•ûnŬÂ|uJKIzsH/ċ²“ĜAfYş>ÖMǽġ”‰ö’u7‰öbIŠÛӁ;(}sA‰v´òtÎıá@Ÿ|òÉáÓO?}ûĉ͛Ÿ<<<üö0 ?dĉO™ùÁ‰–}K,$˜…4Ğ꓈|6MÓ/ĈqtÌ,Ş:ŸÏgçù–tíkà„ĉRímn>Š–O"M ċ³3rU²FÜgF¤;h‡‘@!µêĥš7ëùCŽ ³Bl¸òV;ĵ„nñ{_Jñî€ôÍ–›NĞ÷ @³Ž~ĝÓżĝWŝò_ŭo˙ë˙Úiòo4ÌŞ:6O7[×`âô>~û TÔÛ%Í_³˘onêèg3£@c[ ÚYú‰tۏ#µĥˆ[xš=žŝŻççżxû˙×˙+“÷ŝéé鉞žžZŒ x8áĈ9„ĈœÜ¤|×í'ŠEĴ£mZÖ­ëU‹5ĠÒŬŝ‡°~$0™0 şï&µÏlmĦ­áĜÖuwÉ}÷!Yw×4ó.ß 0ÚuÑÚı03?<<ñx|8ßwoĝgùĉ÷˙ó˙Ë'SĥĊFGшo¨‚ċÁDÑ9Wá."&8,mÌS>²¸IÉRŠMħVìB‘ıDE­YĦnûJµús$^mx ĝ{˙ïŝî_=~+„ë§§§ß @h³,û5E×2òpÁ2.ÇĞŞı7‰}ħ"8Žk‚0y-n…³BĈĦR¤XY!ÉS"ĥWˆ02˜ ˜ `1ê ġN’[xĵ.Ġ'µ&Ċs€¨Ô7˜‚vÎİsÎ p†áÓiö?ĝ{ü„ïïŭ2\Ÿ}œ”jàœĠ$žıÍ:-G÷b­Öh vlD’Ĝ97bŸZZÍ )£éŻKKñì*(µˆŒÀšƒħuNçîCüÍ0@çÜŻŝžsżë~èœ{3Žh€ô\êĊċšò™(ĥ”\ŠçPİš‚@PĈà"рÙÛîĜsi9ué€ôÁRˆVElR)FFŠÑ(8‰s̆û<ä|’ù I?ş|sÜuÁ(=cçYFŬİĵA@È$À Ó ĥD!&¨úċ½ˆ9·R‡(Èıl‘Äï4¤Œ0‰n7f:ŽíÄKKuĠ˘{™Ĝ‚\¤èg—–ĝ@nˆŠ™"óĵijéMĵŒĉyԃ˜‰™?qÎ\Âċ"ò[3Zs§4áj0ş6G—Ŭ-ìpdÁñàà˜ A1'M¤Ş\µҋûîl˘Ž0A Ê˜(àäêOçoEŻzq{•yı-íh|]=€Ä­çV ‘#˘‘€YÉCç:…l…È$&!îˆ:û…²†ĤĊŠQ…Ş/ZĤ“@  ˘‹.‡&÷ *ཱུFO–RıN“ċŒ²żğŞòçtxÈa ÂèÌ˙îž§IŝäĦsÈñ£FĈÑ-ġu ·ŜŽnv-tùş]uċ3Ğ­")ÀİX× XΑ|?C§9wÍş²Sİ„ô̐–uUWc=‚ ŞŭĴ‡ZœĦŬĴ‘ލˆĴ’\2ĞkMĵ§ĵŬB˜Š+sCĞ{~˜LÏâ´S<G‡HQ™P`LQ{ĵâA‡cϲë€ôB ä%Wgƒ"0G cK^d­´Ì{ċÖ ôK­+`ß,{şÎ¤ğ¤X(šŒYä§)öáJ`$Ċ°Ĝ+oQŬ’_Ù·ċsAĝ•}bŒêí5ŻïéTúŻK@TÓ-n`o=—ô,FĈáÀ›ħ§BLrŸ,Œë3£ҝދ…ä4Ĥ|…£ğn°Œ%r 'ĉcÓ:éĤEKo´”YBŬm÷Í%\P>Öğ$ÏäÓ Ù\×]Ö¸½ĵpınĊèp;çÁ1ŭ[,ùâÙódŬäZf^P€Ûh†loŒá€‡CÀÁ1#ç w“À9Âì J %]: ŬğĴd%Žb>‡8(HçÓGbĵw(‚¸ÏZĵZËÁ­€ÔÁè›ċŞÛ[é j|AÌRWkePí„ Ëˆö€ƒ[F›ŒígXFe†7éÎUYÌÈâeJ”3ŝnœ'גntaîŬp&£âxqÀVŸ%‰Ví'’BÑÒŭ˜déŞbüˆ‰Àˆ`40á| p ˆp$àáC2jşèTµĊ­ĠGù7Ë*Ú ²·"e›ìT˙R,nşĥ€t¤vKƒ(ŠïYF´¸Ġ>é‚eD[ˆĥ‘uQ" nô6_"'Ŝ€Q9WhiġLß?ßğ ħ ĝáèpp˘E¤˘B`Ž/ĞšO1²î²ë€ô+Œ(°¤¸Š‚ `R8 RN³ààPw¨Şî€Ò‡ÍK8‚ÁĦ|0@Z)h_j; ½”Ò;20kg'{´‘€§SÀÀÑġp`Á3Fĉ8ÈFĜAç[6b–ƒ~kLĜ^Dg%şĥƒs0 Ğ_S—ÛÁħ7WŞA"vK-svĊ‘ħÓ+T)wŸ$ï#Š<Ĉğ9ċ› pT‚ıĥc:V.Ğô^òıÒ0‚G—1TuRĠ ŞrÏÜı¤¸5…[ÚpÇGĈÀš2#cĤ]ı1ÛĞŬ³Ŝé~a†„çÒÀ˜gAFPĊ—§€bŠ'TÁP8%Éj—.ϐ‚Z? YDNż‡(à4ŒÀÀ\‚,ĊĴqħµ&’” \‹%p¨D)8Gb_ hiËmn&Mżcħˆ¸P•–‘P,Âġt|(ökͳ­sÎġ0ZÎ[Hxñeá˘Èh|C–Âèn`°e‚Ğ1Z„ ^àbÂ1l*l—H÷ˆ$7 S9Â)Ĉ ˜ÏÇÁĊÖċĈÍĊ–.}ìuù@ !ïŭä½˙ò4ó?ŝÜCÏ?‹Q,ċ›cğġa)1 eŭÖsˆŒ gcnP͝Œ“BìâŝÌÒĦXż Ÿ \ì÷)}ıĤ‚BÉÀ*4Ĝ1‚ıSm­jäĵdJ„¨´‘Ì˙$ŜûÏBO!„ùċÖ7B1)HŞŠ •€yLö:MÁ_ À+ݐ^DÂBh‰H%tV…?Ï82À\œô` 0:†§‹İC·tzÍác"˘îĥûöÈ=‰&Ö îép8üĉó_ŝêŸŭá˙ïó ú'ëÀœĞ–íÉ f6ĈîHö—reÊ,ŬĈG§˘‰;ħwï…óŬʉ‹FV;ĥöxşMêiŜUïÜëù‡o~>MÓÓ4çyÏp£Ŭ””P<“KóíĤV.Ì GÑÒ(BPL~# e<&—fŸÁ^dIîïĦ“à7O3 à‘âÀ„1Ğ‚G…žGşDÚAéÛFÏn)BÓé4ż˙ŝäœûĠ#ŝî˙/˙dĝŭŝ˜™żODF,ùö:Ç~ċ½‘ŞŽ°ùoŬœbZ8ĞêğÂgó<˙üéé韽˙ŝ³Óé4yï/ıì.Pŭ,ğksìv•ìĜb_3ĵݘ½`šĤ)öÜTâXL/ COûî€ô.ğÈRLŽ gAĊû“ „ƒspAA¤àèÓX‡'šĵX HıXmZXW˙ÖÚRê䛏Iż{Ïz³žN§îŬğ€Ïĵ÷|<O0ü‚™ßÑÁĉ,İ*Ğ*ÛĜŞ˙~]]cKĥ ­şÄ*) ‰ŞzU=…Ŝyï?zzúÍÓÓÓûwïŜMÓ4]jq){QKî‚tmî­>Żç0“R2 ÎgÁiší$91Ş„Aê€ô.;ŠU°@<½÷ ˜À˜fĊ@j)à‘˜,˙Î9ä˘ÛsÛMÛ“ħË7-|›mC:ϳĵ˙~ !4M:Ž“sî3f‰h0Ô`dïİ%4ڛEV’–VQ²ˆ ˆJ@šc&Ħœçy>MÓôtŠâ­[ì­ ßrÖsüžŻ9j.;Û¨ñÒúiœgPĈÚ48të¨ÒKYHùĂâ|òHîí³œÂ(fÚ,ŬS̽·”ŸßÒçĤÖ]ÒĊĊpš& !ĝyžÏïŜ½ Îıi†w"rq²”ÊżWĜfU#R€”Q,Í;¨ê<Ïó,"Ŝ{BzEY+ÁEp½¨Ġ>ŝıó1˙žkUà=|@£iĈÓı$¤5]Rêí': ½ˆÚµÀÓÙ²šĴ#äÙ+F8RPj-˘… …İÏW€G‹ż—À¨ĞYß.`jĞuŝ,„ OOO)WZxû]zıb_|Ë"úU¸ëf˘(şË÷Ħĝ,/½˘ÀıQ‚R‹uáRâBŭ¸ñÙêµr‡Z:w ġó0ͧ9ZJĞËĥPıK¤{uż÷g3f ċí< ³hR¨0Teix³v›ìQŬ'§Ġ8ĴË·×RşE3żdu´E˅ùë$½”J`Â3Çv}eç~ë û  €ki–sYUBLf˜ĵà4œÎĦÁ5"Kuö–.n˜iޘfŸêkfcĊÙ "pÖ5R4!Kĥl0—Zî5>³ÛùÎş|Û\wŒëñKcĦŻÛ:şĠJşÖùpH]×âħğĉşkÒĊ—ŞR›bMp/„ó,8Oħİ}W$3ĵté€t÷²òô ³ZËh˜Ë.É+Ž-¤YSħ\ÉAı£½ĝPkB žÏ`ÜċÛH{n£k Ò£–Ë÷ë¤=½EÁşfé]k7Ž+ûĈŽ›~mžMJ J˜&iò8OÒ>$q¤ ÒŬŜéŝUEÊ y°rS[}áyV8RYÀC€Š֓͘ݴŽÜ… T3Dw0zVÒ%KİĠğ…ċ ·ĠW‘Ĝ ;€„ VÑ5w]Ë­;ÀW”‚—k½/A*ÎiUˆ*ĉiĈäçYá !rğu?Ş.>Dž‚U·{t-sXŞ8û7œ5äRS3³ŠÌ¨Kîş2½[>`Âuùĉ€Pë}ÚÁġ[ŠjġÂçÏê·ôĴ#ìÈŜı\³ˆä‚‹N/%Ċ€ouÛUs À…÷‚iŽħäö F$>ÂCê€tßÊBD‰·‹F†œ§œeWfuŠÙ+ĉ pƒ½ħ1œs‡qŜĵyóhi°Ŝj1BġWˆH˜9½/k9:} Nhİ ,m‘+ßsñï:­;ğġJ–4 8ñĠĤ|ïZJKƒ4>O5KıF ›ƒ}–ŝŞÀĥĊqëóÈ÷[Dग+˙Çq|pÎˆè ŞLqž‚ħ×ê€dVQêÙcHî‘Ì:\uÀ\wgVk6L 8Q Ş^ˆ™?ÇñoŜĵù áÓO?}k “Á(ŭĠŒPLÈ>’żċ T€˙ÎàÔİ=0ÛĦŻş ĥRâš=ZĴ öù.ĝc3Ê9ò@*ï{İ$`²żÎŜ;UċaŜ<>>ŝdÇ0ó§"J³÷˜f‰iŜ{mœdIfÔ§ŞK¤ğ$Ñì‹1,KĠÏıhĉ9½pDïgT0ŽODä§p<ߊÈ)MşJXWħŻİ[Hß=+İT(â5H•ßĠïkàù)ƒš–R@jċj—j¨µŬ°{γĜRŝŒT•˜ùa†ÇŸŽĝ ‚ ÀyšÍ-‡mÁòߑh(7@ìÒ酣ğ˘Uћn<Ùä€É >ù1܏˙,èËüÉñxüœsŸŠÈ΅ĞBv´Ĉz’ġQüŬzPUàsÉúFXF·ZJïš½µÍµŭ>ç9´€że™ÚëÈ̟[DôÉo}ÏáÈ]2vÁ¨x<Ò§q¤RĝtëÚLÑB*Á¨´½@Dq:~Ç?÷Żùç˙ҟ˙ÏŭŜàœû‹nd0Q,˘%ŠŭÔ8µì˘‚“$5ĠÈXLq –~—ÖÎZ—9›¤in?­yO‘i"µ”Ö"'=}žğLëşk€µ.M˙("ÊÖÖıÇA(Zaoע˘/w#MéĥKĊRûËżDĞüĥâĥZwĝE|<&ÊÏ*>çüLDñ™kú7ˆ8ncš´ŬŜµ=òs/{‘c“Y3ĵésĤ–!š:# mìŞu0ĴۖÓĉŠ]Ĝ)oJöaşüb —}+§u>áNÎŞĤħŸŽıš7éR­ż‘ŞBDT"UġŜS‘Cìŝ֛ó?zÄc•ÚŬÄ>А¸'5t@zħâkbŠ=NX#‘K=!8nKMżĈ§˙ÙOž†Ĉp` Ž08‡q 8˜#ëĴŬ4xRËCċTìMy‚ċêoBĴJÉżŽrÏ•jÁ§œÉŭ(²tĵTĜïÛZç\Ŭ`ÌĈżWÑÜ=[Ĵáš"f" Sŝ^$NxUÉïE5ŜÇÂ5$[–Ú‚ & Ĝ{ŞÌ ÛXs ‚ 8[u#ĞŠġ´$-ĥ@äLĴkĞ5İKŠ.Œ(ĜE°ax`°*Ĝa6J)f€A ĥU8-Ú+ MÀş\wV„¨àDK]YKí;uƒMßċ.²•ĤžžâsD$fHlg.Ö˘\‚d…c9´.}œ)VÇ1T—!GRGfüÊÌ1ĠĤuċ6çK·ÀÂN‘òzRD ”ŞËvì:rğvÄk„Żß+!Ì/•|ŒÏ‚iö8ŸfüúóŝÉ}ŸğĉĥÀP ˸¤ÎÜéNĝê 1ifÖ͖ħ#Ĥ- ĝ)àW˘ĝĠo&üÇGaÇxt8B1:ĈÈ_Žàˆà†X\Ë6ÁIÈ 9§*Yi•fŠE(SWš³Tb-ĵİ—S°d-e?ħEjÙ,‚™5| ë2ÒW"/ ²Em.ŠOg÷”)‘…ċµ–Ç÷Ac^îÀ9–ÇŽ–ÄĵdébÊ €,?CÛ½ĦµĞUUÛM d äİ}xZpA ĉB/H–,8wfċĵ-% 1°ÏĠûÉzLœgùĜħ—8 J°)¨AÚ˙ʲdŽ×­ˆÏ ĵ(TBŒ‚2B†“B‚Ä `hféĈçWú@HJ ‚€A†Ÿ';Ž@í\|îŽǑßıx½dώjCÑîM²\7íÁòs[şâŞF*(aš!DZ@ïDۍ{Á,„y˜˜NSP<N³àtšmŸH€†9ĥˆßuÓ%nUX–ú£­Û#Ô+¤½ú…˃ƒiÑnÙzIN…Ġ¤֍ĵ c/”“Î>›00áààpp„AÀ†SD€r„á LP&¸dMXŻt%Ĉ·|ԀĠ+hH ħäĊTmMÏ›SËi]ı|4iÙ.î3òóiL4Ìż4-rÖÀPĠ4l³L„â%^ CôʨÀì˜š×U(Dâ‚,>öĝ LaÉMGĥS"-]_är;ô¸:?ğ?P1X<  8˜˜Îèĥ†âw.ĤKëŠĵB £§üÎîGÊ`KĤ;J1΃bšç9ÀûŻ×ĝ€ĜvÜ+ĉ ˜ÎΞ0Í>v}U{*P–†àíY…ċ™5Ŭ •‚qğ|m­ê€ô·†6"O“Ğ$i˖q·£Şĵ•˜#@pty‘M…â鄘µ7脰XJÇGĈÀ„#üqÀÁ &ĈĈLÏ!ğ‘T$Ι´¸ê2–ĠšpŞq0;ob6Ħ8‡f_³şÔ›ġĉĊm”‰``EVœ,6âĊ…Ħl÷ÍĊcekÑjŠ%VH(ĈŒ‘r=Ĥ"ŜËB$…%€dıˆYK${ÙVÒĥ…›(há² žÚı½HÄİÜ_I)‘ċµ´rdmŬĴĴÜDöı˘–éµk*+qH”Ÿ7(ı|ĥ$ĈHâP‚ „ĤHbß)A‚_\³ˆ×œ[ż\› o÷ßܤFŠ-°H£bŜCˆÀâċŠĊàñ.2žPˆÛ:ÍÖó’‘Ĵ>q¤E_€àÄv1gݘĤ€ó4c ïó,˜CİÉĜşÏ“@Ġ:½jü왐Ŭ Ş…Ġ³FIÉ`‹ˆ9­>ôĈµ¨[HŻĜE×ùÖŽYóÜ#ÑĊÇnŝùûW_eĉIÀ Ċ4u-ZMgàcš‡‘q–ï&¸Â·ÖçìµéNhuAÏħ•›Í…ż(“$j÷Ÿn]*i"Ĥû–m];˘%Ybħ2kŸĵl'ğ։%ÚvŸÈ*cauŽËb__‹6½ĉÍX'µhhĴ%Ù·vÇHŜħnW`}~›Z+èö¤kM@b€!ĉb͖‘ĊCŽ™{Î>Y~×fÉI/šrYìÜët‡FšGfkɒâgSdĈ— Ñ£ŽÎdäż°X %ebü|F1N‰hŭ„%ŝ3͂ópž<ÎSÀy˜  –:˘Â• {fċŭ şÇíñŻ8Ѩ…15wÀôê]x+ ]Ƀ…–x‚ÎrÙ2ŞÒ@µŜHÖnU]Ży˘8ĊÉ&z¤‡Ñáa$`"†c˜~)o‚ÑĊğ mw¸ÊíwN÷}êuf"Ħ1§7ż‘ġOġ†GĞW.V÷‚„ġ?ugݐU›ˆ  à·}ĵ Ô·ŻCrnFŒ$ƒ‘ĉÏb’I´˜*§ÇÒ%ݲ4w¨™ÁNGcBB WâĜԒ‰È,'ŽqԔücP‹÷4Z3Vb 3YxÑú‰`4͂ÓÙt8Mç)ìĜ&zyxİ^i# Eƒ%*qŞCzNĦûШ×l!íqnUÈd›â²żèñEy“ĥA^X—ÖHÚ&ù½?{òx#ap”ŽĉĈÌb˜,µ\mRİĥ¸M—ƒ>ïîí'ğŞĥ÷àêÎŻ‘>iZFUó².zŬ‚.;Jîíì­M,ĞĴ°fÄÈ@5YCöïliFĦĜĥ£bŸEiAu{tġ|sj÷˘èĊġْr–)Ӓ Â˜ †…ŸŻ DSo"ïÍ7 ÎSŒ]ŒÖ@/‹+ƒĤmEWxt×Ŝ•µçĠZJße@şÔċbrCIG˘ĤnĈĴYb- XĞJv ²Ġ²7–U ·ä( Àiœ&#lĴèŜ‹Y{9k‰–÷LI#]Ü ”+ .€Ŭ2IwÀkşŒ´FWQ÷뛚›ëëfê`şŒ.˘ú thÑĞÏsLˆŠĝBħ­@ñ~Rĵ7­/[Ba-V“K EdàAɁXÁZù鳋„7MÚÓĦe€•Úrñyrï, pu/:5÷İEñq.`Nħɢ.Ĵ(JÎYuZXLRşñ Œ‚ÄUvçİB ë˜‘Z~¤)ğ/§Î—psÜ\ižU9ŜDK¤,9Á˘š\‹)Nbƒĵ[?l ÖsĤzUe$ĥV ­–ŬtyӅEX€ )}41VĴ‰c/xln/Oé€ô§ĈÙrTT5¨êUÀǢX(ƒȲÚ䆘蠈5;€ñş¸X²S‹£ib CkÛÇdßĊş˘iİ)Zvm5DV‹¤sÔrŸDqò9‡L¤8ŒĈ!×aàÖĜ…Ì\d [Ú9£ż@*ıx" ĞĦ˘JžÊı˜0› ĥ]j¸Ô )XĊ~ˆÌÄş´MÍ­c֜2 @èFş{iëxLġ^‹ŭI£ 91- Ê~Ğ]yĞ$‡wÑŒBZĝÁD Râ˜içF¨PR9¨¨3&°/@y°L<‚"E+8âJ°ÂÚ9Ö‘•(Hb‰ô:˘>NÏ!SĴ °"TĞ„fûÌRĵ݈—´lF$–7@P‰nşòûT*Ûbː´ßcÛïrp-gÓqĦ¨2À#ò¤&—™&[[D£™yK İ×!½pjšÎD¤ŞêUġĴŞïEbí ? V›#ħ€ÓıX4úàòzCÖVO:p&›şÊÒ  7.ŽċY@Žò˘Ż Gg<_<ށ’B™@`8°E J5­1È+ŽqRĵ€˜1¨ÇȌvw8 Ĉ°PidŒ0Ŝ5i‡HĊÈ8WÇgž²¤$ğ)2AâCÄ iÎAmb[­ÙU‹†\ëTş2İa™P;ô²ŻşŒôZ½­˜1´@\qƒRW@ıÎt×ĠïJ9]Ċ•*w[ĥ’,Ó.Aµ°Ž€ÉĴJ ĦP†Ċ’´àĦÊfċğĊšâ1gÁϸh‘ù!ÁĊXJ丏ˏ¤Â^tˆ0Ĝ:MŽËߏ‡¸‰ €CR<ÄtD™ ĦDqÜ ÇeÛ%O0†ŝ/ⳋ4C]¸ê Ù~Ü``d~Ġ÷ĥĥĝÊBÒgĐ: }GF·]ABsá]á3(İ{M4Ht˙_KkC£IÀßs€È40F<Ĉ˘`ÔCî@)şFĝ-CƒĈB^ğ´`PÛŠ÷äŒ?s™YMid_`£WáT(ɈYTŽñdÔG@dŻÑ§ƒ£ÌÏĈ˘pCü·s 8Fž²ĦàžSµĥÍ qáĦ9^/Í ¨İÁxàÑeg€´˘´€Pċ*)=3Ş‹§dċ ŭË;éòzSj·êí–Ñşo[ \K"J]AZĈo6–ր”,£? ’ dĠâG-%Ô"hñ°Äo˘ĥ1 s‚ ³Ĝ.iŒ qÀሳ3†›(Eħoˆ˘ú8 “+Xƒ…Ñ÷¤ŭ ÖàE-g|Œ5ƒaİ;K…錋o`*ĵ&rù~QtŜ…`…²)a!`ĊİÇ´T‚C}€÷Ĉġċ3[[fë·v­ûíĞŠ'½ İŒÀ\|yïçyžŸĉyŝržçŸ˙Û˙Îߔßü[˙ ¨Ÿ–Ċ$|lĝċ6ŭÛ½rISDĠWĜ’ŻAşaÈ^dVlCDpìÀŽÀÌĈZÎFÊV[’˜)3aSÁŠÍ‰„?÷_Ĉĝ;˙˙SP0|7K-ó­’,J+)ñĈĦXLĥ—MïĊËH/ÇĈ7žĵ½ş4mgp­Ĝ³›eşŞ?.cK))¤vë•É %kğ–1£‚{PB‹S1üùKL˙ì߅˙ì?Cxú5T°˘˘‹MZ,ìÍÌmOçVà•!5ƒs|ݽè…ċĦ>íĠ5Ò “ ;$è˘ óOûçĥĥZ_Š…6k²íĠ_ —ßĞž¨aħ,†çnşĞ··Q3~7&µ­3*µ:"6`²ßT²;oİCBÁÄ`/!`ü1Ĥiú£óùü³yž? !œŞ…vċbú:šI~Ċsewïµd·ÏÀ,"'yï½˙ÍétúĠğwï>?N'ï½TkЏ#½6@Ş­¤Íë|>ÏÌ1Ĵî½×Óé4 f~ ˘‘ˆkmœÛۀĉ–ePö½.˜_•Ġò&î^7ÓœIUùp8<<>>ŝHU•™?™:{Á9HŒCyYYFl=R[¨²ŒtÇZÄ%r½ ŒîĤş½èµu,U4bUZ×eoÀ’Z%`ިĜE†oJŜûÏO§ÓŸĵ{÷îŸ>==ŭjšĤSħ–Ö€îŒiŭXàñu̟9\ƒħX*·`é-– 5‹ÈÉ{:ŸÏïN§ÓûÓét>ŸÏ3×$½*Pzm1¤ˆZÀ$ĉ²›Ct>ŸƒsîÌÌ3ıVÀT[¸=ħâEÁĉŠĈG/> ĉx<~1ÁçɃDbcğ’òhĊcVk–PĥçÛwÓíßí `„ç‚‘\°ĥî£úTW´=UQjÜ$X­ gczvĤ"…òž4(B_œÏç_ż{÷îWŸ}öÙ/žžžŜ’ì- µÛêcÏ @÷Qĉ‰%8%@ ‚ˆÌ"âC“÷ŜOÓ4.ğ= zuÀôš˜êȤî¸í(MˆÍ ĵY?–F´zOżÔĤttççô‘‰Ëëċê36÷'½÷'™”€³hŽU-¤…e„%nqÍU S¨͋ŭ:,£{À¨µÏji]¸‰Qd ‹%Ĵ,‹^Ċ=ŠZÍy{8ˆÈ”´ùwïŜ½ûòË/ßc‰uÔs\MúBó÷ÚgúÌyġÜùÖú} JÒĝ[ĈˆBñ7˙nıëöŠe;SwÈ2j”îL0ş˘é}ˆ•töF7~÷\ù‡R#İîI˽³|S3¸Ôv;ȒÌPôĠ‰ħN -4šrlÑ<> ›îÙ`ôñ-#´,£Ò—˙'Ùe'EZù’ŝ½ĉ‹Ég:Ž1íşĈF­Ì5PşžcñÜZHŞaMİŻWv€I.’ì€ü5êL ßAKiĠ•èW/jXb!Ŭ @t÷÷ZJ´³ïò%8˞‚œÓLÍ`ŬQSZeĞİihÁħĈ(5‹ëZF_Iâ·)•uÍR}€Uş4-Íü,M_™ë;ĤĊUŻhġ/•%ĤWÀàÒç ûĊġ{€ÔĤÖ÷ŻşHöµ&5Ônĵ•ËîÂ,]Ë-uŻut pŝ½Ġ÷œó£ /÷d†×P†1İéħZ_ZKˆ´WŸ²Ù^µ<<ß2Òo…e´żtËö2.e îô²ĥçzE@Żhö/Áżv  <÷ïs\€÷ZI׀)T÷P>²Û³Ò7Ì]wdU WïhġuĴ‰Ż,Ĉ”¨{Ö v,5şñX׊ĜİÎR€ÒŒDf‰”Fê$rúmVÊ6a·µƒÑM`´šV%KĞ>P{ ti!ŭ­ŝĤĉ&;óöÒ"~5ûïÀW@[ŻXKzċ^~UnÈH_#0í’k­QÙq]pċšşŒîĤK1şHtĊrÒtċĠV&ŻMÖċĤzI6gyÑï`ôò–Q˘Ħ ˙š^ó\нÊh÷×.Íµ€KÖĈ=VÛ­ ´—ì 7Xš—€µ[Hß1wŬ'Ċ•ħnÇ ˆ.Y2ğÖ3³sÎ13żDÄDt ›ÄkYoTşçŠ4^Çñ8ŽÁ972ó@L‘L48kŻŒ20²'ċt"7˘Ì<8çĈqÇñB˜KÍ>6cIsÁHŸY{t1YĦN'7ÑBĜßkŻ[“"^ ˜ıñ:m+¤=²Ġ uPċTZ\Ò%7Ù=`„Üq€†ap4Ž#?<<Ĉq<02óhĵF ]Ż*ÛÁ ïœĈ>>>>~ïp8|ÂÌob ŽĦsĜƒF/ FĞYÁWêQ3ż9Ÿ<>>~ODĤÇÇǃĠĠ„l¤U,[wB½˜.ÒÖ $"˘"2ïäùt:Mó<ËétRï}¸ÁŠî‹séw˘6ZXM·4êëuHßA ÚĞIŞEv€ Œ™gĠŬ H·ZF+‹„™ùx<âíÛ·c”O?qνqΉh "nÑ}÷^ ”¨ġ˘V"UufÉ=ÇÇßÇñħ'TAw-ÒÁè+£rdkNûÇñÇñ·UĠĝ "O6ĦbiÚ‚iĵ˙9ğúm vÖGȇÎ!„÷OOO_>==}ñôôô¤ŞŜÀJpıFê^KéZëñçėž[{ÔÓżƒ.ğ[@İĥšž›ùwì³~İsǑß}{ĝä“O>}óĉÍOŽÇo"ú”™é·8ö>€ïn7 ˘fk(9ì½3™ù{8ŝ÷§>1Pˆ'v0úÊÀ(_[lžGÀŸü9˙‘;żÇ̏Ÿ‹Èı Ċĥ ×ĝ잵ˆĥöU|ĉEdRĠ/ĵ÷ż9?ÇÌĉyžĤi 7şÀ^˘^êıħ[ÜsŻ6Óîµ6èĞÓ^’µ8ÑÇJ­DÙ­ÈÌx||ä7oŜĵyûöí˙Âóżóßĝ‹˙Ê_ŭŻMóüFEŽ˘2,C\·ÇÑ­ıéÊĴEƒ²úïê”×-œBĠÜ`NïoGñż†ˆŭ´6ÛF Œ€ĜPÎπ@î€Ûż<Òïŭ™ŸŝËîû Ĥ?“А™ÊŬ֖ŽîÓŬ/;Òµ55#Oàóú‡Oï˙ŝßŭŝŬ·ô·ŝ™ÎçóûwïŜá+dÏZúPëWÀWŽÏùt@úğíZJ.Qëßϵˆ>ÔmWî?ĊĞÊb\qÎáp8 Çñú½ßù żüÑ_ĝ—ŝÉoÎ Ñ&ˆfĠ Hıy’Â÷!`ǽkXú irç¤ëbïƒŬ+°TY\o4°Y=iM­Ï%ĥ)…Á< ~ŝOŸċ;o"äXF£ŻŒ€Ëjˆ…îŜŭï/£ÏıĜ¸ì„šž{™ÔŸ:ĤĤÎĞ´l·`‹B5µO–qjÈgƒNԚßYĵ kl'˙ç˙O{ó?ûÑñĝwĉyŝġápœs@;³­üüšëî9€tŻĊ´g ½Ê6Ż•\ġ’Ëds ´SĈŻYB÷Ĥx׀”2ŭÊĜ;çäp8°%2|ïËóôÉÏŝĝ=ŝÎ~ yò9ĥ['bèäA#CĴ,$6ÄÓĤêT Œ"ŸœÊÒı è<›‚͐'q÷¨·^Žcg[€Áş‰Î!~O={¨†HĈJŬÁè+£ŞÑ^˜'|ŝ™Çç_<á?ŭƒwPXçD^– rÎF!Aƒ_Ĵ,] šÜ5vˆ#[;€äÙU5 aù-ğ8^´PPBˆ‘]l7NˆÙ߅{üĠ'Ûá{8‡;çö2Ùä (ĵ”ëî <‡Dµ“Ğb€Â`Ú1¨—°Ž.QIÁ³â†s΁ˆ˜™ÌüH!<Ş(ÂɳDPšBl‹.}Šm§ÁÑ2˘Ô†} ĥĜ4P:De×ħBóEĵÔN|\°Ò™ŸCĴ1b‚ Àb+x…zżhÖ+0’F_@ë{/ 'ÀıhoLʆ”¨H°‹€‘Ĵ"Àh9›ĜĊ–ıMĊÏT `8`šâ3‹ûˆ–›µĜÇ6ää(Ó#3?2óˆĜ,¤[RŻ÷â%Ĵ¤kÖÒ-ĞtŬ½ÖŽħĜħj:Ħ=’Ġ–uôĦEĤ¸âŞĞıáV“ÈjŽĊà §=ÍPŻÖÇKYڔĞı¸k9€’ŠT)§´àÓPÇ9C.Ö!˙N%Ĝ{‚D­›(ZEl½È}·Œ60ÒMÎuüÉÜy˙1;U½ıÔ°ˆ.;Y\‚ sÓYj(Š 5˜[N‹ôsɊŠf Ì)L€‘,J#ˆÈY™C+^£;Ö҇ĈmnMÍĊjşˆzRw”p#0á8íÛs… V‚’à2ûĴĝ5ĤZĞ2RÜ(H‡4ı\íç whÀúèÔWŠß…bËyOy4f/Sşeµß5i£Ż ŒŞ.˙NC3,`”ÇC <0U?Œííè"ƒ4ˆ%J¨ €-Ĝy.à6ĉ„—&ƒ}.8u ꀴ ({ÀtÉşĊe÷€ÜË9’µ]ra›KD-i S&Ìĵĵ a!+mZ Ż4²Ûž^[ğ›îF;÷ı$ħ½ĥLÖudzùûöµì$ĥd Ž@eÜêò"˙ÜúŸ— {\}ŻÖeÇx½r‰ÄRzĤ~à6·jm×ĝ­.VUÀ`ö1N“úßhÊŝ–ĝ™VŻT”š2¤Vï +K‹cuŞÚE/ĦĉJ„`@–Ö·ĵ”tëÌܝÔڜ´Ê‘ÏŬgµ]Ĵ…aZ_µÒC6 ù7‚QñÛ¨3è…tgÍçĦ›s²Qñ*˙ŭĦ`TžÓŽšĥ FzáùÊŞS‘Y—{Ĵ7ŝ-Ċ¸h€ !,_ìr ˜%=|ÈëC׉,íŻŭµiu éğ$6²üżñ7žëŽÓ;Ĵ¤=ËíR‡ÛŭóJGÀ$kŻ ŠԕP.Ĝ}Em]Ô[–ÑÊùYdòmÜt´clÉUrËçĠ‚ü|+F.,sşcÁì[ağÖÖ Œ.XF—\ùp0‚^t"]£•F@h=ÖĉÚĥ w/7§Àq0Ş^›·‚ĈWa]]wşt@úàRÖ½fvËe§\yş;-‚@ĉ= ĂÄTĥR­r µŠ5XmVgbèTï+µ+Ĵ-ƒTŠuµa níc7?/kĊHnŻI]pÓÑ:›lx·`D[ĠE[?lîOym7‚A JE€v,²'´˘¸{QԚ÷š›yŭ–şçPOŠ;K!żĈ•|WƒżŻd éÒéĊAëß˙/ŭcô?üˆFqÁ¸ÄqÓàÖ UÔè\¸a”6{µ ;ĥ5´ġrq܀Qġ]Ĵ.ş·pÓzqĤf2ŝTU/ŸSĥŒˆn^Ä7`´Ù§ì[F¸p—,#Úè M ­7ż`an€˘—ló³ŒèšeTQKUCÌȤd-ı!í÷VŻÄU IUï‘żŝ×˙z_; }½’ÀHEîŜö# uëġb§ŜĠ{ €Xá)Fg“˜²?Ÿ˜­ĥHaĴ@ñû\ƒ¤ .µ`1Ċ‚[v1&•ök²1…¸9ÖĦ"ÈKHA}I£‹Û1ÇßÒÏĊq,˘5K†˜cĉQÁ a v*ÚĠÂĊ“nX…Û'ĊêĊÜbİ%ı¸ 3/)ï>XŒÌRĦƒì3ğĞġZ%—†”â\d²ı%6¤)mşÜ.YqÎj~V`$qaÎĉLÙï<êìw²lŸ[¤Z—Ÿħî)uÛ1xĞ)Şc~²#vĊÒo÷2m˜!ŠMÁIµëÌ÷zÈï‰Ŭò>Ĝ\Q@vċ·\·f: }7$ñyñWs¸BDÖĈ‹ÈYg ~€ĊBDĈĦċĊ--˜ĦŠ]Q´Œĵ.ƒX*ÌÍn7ğ7*Ô ĥXñù’hJN?@Ġ˜@0Aĵ%ĞÑ'–mì!Ä{Ħ€„°|/S$˜2$şĞx€oÀZpF@6t0NµBVÁ+Fˆ%°‹"ĝ˙?{÷“ÛĥĊqü½Ħd9È˘›ĥ@‘ ô ½FÎÔ#ô=A÷í˘ğşêĤşI€ NbšĉMJ!İe?€!ÉÖ?Sŝĝ†äL\ĈÙîdĠĉËok<)k–_gı4ogµ_-­ocxÇ ‹šïR;ŞşŬÛéÜM|ÏğêHWk1U1ÓÂÌ 3Ğc[m3 žzûBì‘^lÇ{êşöu]fvgš}rЕ荓àT²—ĞŬôY<15їëŬĉĴ·ŬymcĴéò3ı]7˙ۋĠn%&ġaWEđÄ{ ë&ä4ËvŜŬ#ö‚HX‡íÈ!‘Ê7ÁWHÛjŞjÈ,ŽÑµjžżEoov‡·›IˆcĦéş3ìM[U9ׂùfeïÛñùl·‰ÑާևŞÙÜÄiâëdÍ˙­²Š+ó°"Gĵ‰[…ŭ˙%ĴUˆŻDe-"MUèno·'/kqÁ‰ú&tµ­˘$ˆk›­‹!ŻŠŻ _‹È‡íÙfiÍò˲Ŭ`ĥ1ìš"ʚ§k—Ġfż+s>îUbAcÈt(ŽÎ ó:m•o·ù,lN;!ĴM$´aéb•,"ÖܐÚÂ'3ğĞ뺨ëÚ{ïŸĠt ¤ß1,n eYVUUċeY~ĝûßwwoŝüEÊ~O ß=ÒĜ˘:´QıŬ&ÎAéġûkïœŜÀœûû;3f­NTúG¨m&—ñƒŝÂĜùM{û>Ĉ¸Ÿt ­&;‹VGzqCjğ÷9êŝ²^Èó&_û|G?ž°ß¨úĊ¸yûӍLœŽŜĴ6#?TŻ~¸+7Ġ‡Ĝ*VHÒ3$÷•<چĜvġ^U•/Š˘Êóü£sîíwo~ûġĠÍÍُßëœûFU_ÄÏXS“êÒ­1s>%ùX=äñ8O•úŭÈäz“_ô#'ĉÛûnwž§½!äföÁ{˙,Ë˙ò<›çùǢ(ŞŞŞĵsöDXz0Íéʛ ˆ@‰U’Èü#îúMUWİ"˜°„ šúŬܙê ÄÂ<ɑžÌ‡óċsĞœcğĉ$,%ĉ„H8ĉo•ÎV) UH:ç­\ch…3ŬŽhˆİ@ §İĈI%„kœ !‚ˆ@Âç)ĠŽÒ8ñ„BéÒ‚@PlÀTJ¸Öʈ"pĊ XiÀx†!…+ÂQv€Ep,  €@€@HH  @ @ $$  €@€@HH  @ @ $$$  €@€@HH  @ pĵ˙Ħı*ßz/ĤIENDB`‚desmume-0.9.11/src/cocoa/images/Icon_DSButtonB_420x420.png0000755000000000000000000016164212467662066021400 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFĜÍIDATxÚìŭù³lYv߇}×ŜgÈÌ;ĵy¨Wó\Ġ]=7#€ d“–(),’Ĥ%Òĥ¤pĜ[ŠŸàC˙ °öO–%ŠlA$H˘4ŞÇŞyzót‡θ×ò{Ÿ“çœ<™7ïĞ÷ŞnUïġ"_ÎÍaöw$"ĉ͛7oŜŜoSŝ-ĉ͛7oHŜĵyóĉ͛’7oŜĵyó@òĉ͛7oŜ<ĵyóĉ͛’7oŜĵyóĉä͛7oŜ<ĵyóĉ͛7$oŜĵyóĉä͛7oŜĵy yóĉ͛7$oŜĵyóĉÍɛ7oŜĵy yóĉ͛7oHŜĵyóĉÍɛ7oŜĵyó@òĉ͛7oHŜĵyóĉ͛’7oŜĵyó@òĉ͛7oŜ<ĵyóĉ͛’7oŜĵyóĉä͛7oŜ<ĵyóĉ͛7$oŜĵyóĉä͛7oŜĵy yóĉ͛7$oŜĵyóĉÍɛ7oŜĵy yóĉ͛7oHŜĵyóĉÍɛ7oŜĵyó@òĉ͛7oŜ<ĵyóĉ͛’7oŜĵyóĉä͛7oŜ<ĵyóĉ͛7$oŜĵyóĉä͛7oŜĵy yóĉ͛7$oŜĵyóĉí` ü[ŝŬµ‡òïĉ‘3ñoÁè˙qy yğñp: ˘;¸7oHŜ>°:ìċŜŜğÏê ÈȚŸ—‡•7$oGDô. äAu÷Ŭĝlċ•–‡”7$oï+ŒÖ=ïĠÔ½…Îş€ {)oHŜŽŒè­sÚCiġ‚NïòŝĞ ²ìyä]î{@oŜ<<Œ "ZP^!Ŭ=•´îíe 5ÓJĴîôu´ž÷Ğ_ŭêÏ$ öµŻùo²’·{£UÇ}§‚Ġ‡Pò>>ò6Ënß*êı ­óżöµŻÑÏ:œĵy yğ{`Z!Z¤u”·÷Di¤ ('oHŜ !ĴĦ€h8REj0è(Š4İêPŻ@"ÔëBç0·ż@y8yó@òĥ6˜VÂh0¨ííí`{{;‡aE­u¤” hş ĦîùŸ%(y\݈ħ;/ÌĵôzvfŒc `c ‹ˆc 3Ku(Š‚1’ecĜÁk`Ö½ĵ !éù.NLŜ<<„ÖVFèĜħcÁñǍÑp8܌˘h[k½ `HD!€ ĞŽŞÇYrı·ù˘."ÂÍĉġNĈݨRDŒˆ°ˆÔ§™™ĞˤJÓ°˘(LY–ežç†™%ÏsnÀŠ×„QßeËĠ28-(+ݚĵy yVgµAáp0Ċq|&ŽûˆètÛ"2rJiAuŸCiA‰Ô0PÁ¨ %vʉE¤P6 T0ĠċÌl¸ Ğܝ.˜ı(˲‘˘(Š’™ ޲(Š"ÏsS–%çyÎĠ醪’%À’ġ´ NkĞ&9"ÍŜžĝÚ "ûâX‰˙ĉ˙àżıHŜŜ(ѲCEz4q˘(:yêñ'Ÿŭ•ĝ˙aQä`3QŬ¸•Üê#BÊ­ĤŬíòA4<ÒY#9ZŞ˙…ÚÑéıXşì߸–ċ³iN ê-ƒ"ˆÂB2ıucšíí& *÷Ż^žÌnŬ‹Há`TA§‘܁Ş0Ĉd2Éœ2fÎE$3Ĉ"’2s^–eÁÌYYZ6•eYfY–§iZĤijŒ1œe™éj]8Ŭ‘j"÷…zßÁÄCò{)$oï…:˘`RHkj­7´Ö§ôh‘âݏ|òj!ĜRÀĥDˆ ¤ħĵt×aYRCʞi=1Í_ˆÈ’L š?öašwyAKVPjĤï-HcM%ğĦ^ĝ[Ċ½?â• ÈJÁVsi­ò"€& $B@ı÷ZŒ‘ɍk 0½};/“i™9ï_ı4fĦbçí7vöŻ\Ŝ™Ŝ¸ĥÌ)3'ÌûsÏ>ŠÙ¤Ĝżĝödç­×önĵòҕk?~ŝ­²,÷˜y—™÷˲Ü {eYŽ766&EQÌò<Ÿċyž¤išÎf³"˲r:–.ƒÖTNé}SKÂìcHHŜŜ·]˜TcT3+fDDCD 1ÍâĦ#"D°1ŠlÚ-ü ŭâcö}—ËĦö³²ŜKJPċ€'ċZ˜ÉÁOÒ°t/œ_)ÎÚÒ2W‘J*UjoÁNn2Ì L¨ĦT:`l§äÁ(ÌzĉÄÖ#Ϝ8÷ËżùÈgÉ|>ızirûÍWǗ~ĝ½·ŭàğŻ–ey[DvŠ˘ĜaĉŬ²,÷1<ϧyžOkÙt:-’$)]֞9LË> zßÜx÷ž} ÉÉÛûâĤ£ĤBŞ€äRĥI ÊŜà ;@¤l0>$˜×°É şñwuí¸g‹R|¸‹ ġß;ċO,­•MO_K­ÚÓʝbs"€¨Ê½Jö  1€Ħ 2˜@Qyꁭ­³n=÷ıŻ\ĝĝlúٝŸŝhçꏟżxéÛßxİ,˛Ì|ğ,Ë[qï”eı7ö²,onnN˜²$IJ— ÑLq? œêğÇn<ïó,ò@òöž+Ìğ*ħDD9÷u§Ñ˘Şá·­aD dÛ9P›tG@XXÓ|RYzß% lEÓ9(§\VÜâ€<‹úqòWêD‘ˆÈş÷HÁ@P²URıX%•A&‚ Ú‡ŸĝüÙ§?ġù³Ïŝğ˙àûŻŭtïò÷ż}ñòwŝüĊl6½Ê̷ʲĵEÑ­áp¸À4žN§Él6Ë:îĵU`’%0Zĝ ï”HÙ84ÁSÉÉÛ{Ĥ:Ş@¤*(U·Òpñ’%BÉfÑ٘‡"{Lï‚B÷@yĠäŻ#Yáŝ“ƒ­O-…Ù!@×q3ĴšXdNĜC!L9€) bxâ§{ú“§žŝ;˙ásğŻĵ°óúŝŜ‹·~ú—0ĵRĊ(ŠnÄqĵ3÷²,۟ÍfÉh4Jf³YĤ>W^7ö´ÊwÏ\x̍`¨ç‘’·{ވ£ˆ¨LÎegĠ ħM`ÓÒrVıˆî”Aï‰:@ Ô"{µœZ\[`Áħ/À&+ï/+Àĥd…g{Zlö$ޘŸsç)BA BfıÌ 0R‘6}üôSO}òÊ+oòò7ŝàÍËßĝƒEq9 Ğq߈ĝö`0ĜFét:‰8N§…sċ™Œ[ş7.<òÊÈÉÛ{ )ZqY•öMĥ@¤]Êñ²ßl/Ŝ·Ûodƒî|2Üş ;hŜB7~³´MV;ÔdEÉz/–ĝCèy&İ3YáÖë\Öş'Ù”"‚v5PZBDŠ‹ULIÎHIP2#8óÀÖıżù÷?öŻŭͧn|çO.żġo÷ùtoç-­ġĠ(Š9Ġt{8î ‡Ùt:Í&“I‘$IéŜŽe(­B͈…²`Z8=<Ç_ŝë~öËżöĝ'Ïß|í÷ŝ‡ïN.żó²Öúr†WÂ0ĵEÑíáp8 ³ŭŭŭÜÚ6ĦÄá½ĥ ï@‰Ğï‡Oûö@òö~ıîVŻúDŭ‹ġ,„Ü,ùʲî?éQK÷Èòŝ5‹·‘Öyé¨ Y Z•˜°Ô×i—ÄX>r· (İOSŻŞ’•“W)£E…ĊġF­bg RM.[R 0˘@af³R@ Èt¤ƒ}áÜG>òsu˙ù?ŭԛżûOż™ÜùŞÖú0 /GQt3 ÛaNƒA²żżŸ'IbnĤхӽ‡RU”ĵFFİ7$ow_%-ULM—ÀµbY’ ħ½Ú~ëê#ô;]h%$ËÛOwáĠjÁÓÀK³ÎG–xfZ·“sÀğ‰ ‡)–Ş C5–ÀE¸âĜîŽAúo ZŞ>µUKbQba8—"‘@ƒ (B(‚„‰a€PİÍO˙Ò}ŭĝçŝĈ?ŝŸŜ¸ôo~ûσ4}CkŭvW˘(şEўÖzEQ–€ĊĜR³+:ŬK(I)–ĵ’’·{ UÍU€ÔLj¨O£³‚t][]·1.ÛN5ĠÁšżóu 4W9ŭ.¸êuJ"Ŭ×ß:]ŬFúVœ³˜·Zô¨I’vóXê@ 4íۓŬÊ÷d§ĜωàĞZ3QĞQ,/çAîHíRû şN+',H˜ˆ`š1ˆ€Í0Ö£Żü'žŝÄç.\úg˙Ÿïíżò“çµÖÇ´ÖµÖׂ ¸†áX)•N&“Ü%< £’Ô’ŻÁ]ƒ’4›úN HŜŽ´ZöDĜ:1H­PHğ…ȉĉ›ÚubH²Ä]&ÀÒ&A‚y·í&€ŞqÇ'$ÍNÀ# êLZŭêZÂEÑœH_ 5têĵ íÙ]ż½Ö.˘sj¸ûê˸Šġ‘+m@ë¤tvU+¨^sġJ,¨X ˜‘À6ÑŬ3J+Ä'΍Îŭƒ˙—Ž˙à_ŝ˙Í×ĠŝîĥRjCkA ƒ GQD{{{EšĤeDž÷¸ïĵ7$ow D ìÊMׄRĠW͝œ÷rk.î(7v 8u$à<µ]H½ċ2²tù ÷=ô“żuċŸü?5{óċïj­GJ݁RêŞRJ‹È$šL&EßŜžAİşwéÓì<ĵ½ިP (Ñ|ͳÁnB˙o•JašC¨šİZ ñ’Rô{şñY ĈJĊÜĵÜŞ:îİg⎠p1!@Zñ%,Ş4ߌ ĞĞ‚QĠ›+Kv-7ΣRDÒz›)“Mġ5żŸ@Q_<ŠÜ\*Éb„o™:&!èŠÀÊĊ… *‰1HÜ(ŽiÊ4áÌÙû†ü÷˙ó_Üŭ£˙áüî×ç ‰(RJJ)µž@–eecìz7qóîBÉ4²7ü°c$oï™*şc[öÓĥcĴ*ŞÒU”hyv™,ۑŻ ıĜ ;—wÄèÎD’Ċ‘ §Ĵp_uà‰´Z„Q薽ıÒÍ!áàĊsh VKöĥŞÖQ2?-<´¨á”NC'}•ë6N$ €ìûìšË?A +E­âv'$ D‚İSE)¸>el…ĦÊ˙Òßyg<ı÷µ˙çżVJEJݐˆÔMÇ @•ìpoĦ¤\ûvòÍU=ĵ½ß.ğ–—¨‘eRkl. éኤĦŽh·¤ı_63ğTh¸ÙXš™È "]ġÒß|Aú´Ĵ³CŒ¸˜V(Dé$TTĠÑMË ı+NħġĠİFGġʧj7U2­>QNÍV]kdîĉkıó¨SûD/”Kt€95Ï´”Òúoǃ][İ}1ĜT„ĝıϝĊöİß˙·˙·!voEöîTġäŬŻ˙Ŭ@iíŬV5FĊ'5x y{ÏŬt½·İcGî2fİĦ´ld„ÍŞkdÒÑ|,ê…MaÖÁêŭ1 v<ÈşéLċ‚“Ew߁î'鋐t´´kB@ÒËD;)è'™H—iÒ~mêŞÊĊĤ¤9GÄÂE nĴvçI E¨¤[Ş?Ëj†µ‡)ÎsÁ[…ÀuR ´ĜùMħÈ(”Z03V=‰„ŠĝSO{ġŝŸ˙ŝ˙Ġ]y+ šoƒDdì^V~§PZW%I×WìÍÉۑÍ=T˙FûzOÖêEl R ›ĉîşwˆŬ¸ĦfÛh;-UêÖ oÙ•Ë;4´ /ĠLs-óÀ-QFíaítô…çáX7ŝNÓùcĞ´lT@޲1ŸIeċ %Ĵ;4âO4ïO¨œ2Ğûr-ê47%hL‚‘²ÙÛܸÛrn <|îÜċżûżûKòßŝ_5ĵİìW*oŒ7>ŭ°PÂ:ğĠÑMoHŜŜk÷ŬÒjµûíO‡vn;Ĵy İx_B½>a•jıë¤Nċ–Jgı›Ÿíù҇£%ħ$Yê֓~5(=ʨy{^Äú Z=~éŜ´ĉĝċş°ĞPÖ}gœşjBŠPxSċ*ldó9ġÔûĊ‘9”*Ĥ  ċ Ĵ5ażÊf#A)„½Ìàñ3§£—˙Ŭ˙ŭWÂŻŭßĵŭ’}¸*àµoĜt:Í ı€;H)oÔàä툪£zqżS–ċ½'í(7äĴĦ¨H–÷ğC€yžVİÌĠĴÈxJÙ2œ´2ċz]x½“^ħ4ôòösKż ´Wq,şîş‹żôô9*ııÛàyû"§–¤îôMD %dc<ŞJl¨'¸*şu.>˘Vjy3Ŭ½zŬĠ÷FìˆbDŠÀBĜÔÀ¸dÛu\&ìà‰3'Ÿŝí˙äËÁ˙_ħĵó Ä;“²,%˲b”¤gÏs0fX îo„ïeçäíhJ\Ĵ€qàˆ[YӀ’jĈVtĉžv>M5T'*,SBÌ’FNtaԏnĊÁ­.ëoyƒô­RŜĞÂ:…ĥŬşĦêş’ZqÊ&pħžÊ­§óĴĉ*ʂG1ْÖĊ§q,¸û ‘íWğ,eî:T $ˆ”‚aĈHĤ@Jûìż*‘ÄÁ~jÑ gïü•˙è—Oŝ˙ċTD )˜Ù”eiŠ˘à$IP–e³/í²†òëĊ“ĜÉH/<ĵa u[pğŞ²½tê@ĝ2—_ĦĤЏ2²DÉ:nı7ŬR֑ôÌQZ<ŬVw§7v´ÄÍ(mµ´ŝó-*£¤‹úµ-ÜTìÈr”™ÇzĴkÏŞ)íş¸ĞFĈžr=ñ”Ĝì9j;"ô œ·P²Ŭ4be_C.qÁA)cb=üèĉ[_ŝ÷ċÄüżI™ı0Ĉ”ĈXżÚx<ĉ>ÏñŠ}ʒxÒşƒĴĵy y{?ċ„ì"ÙÊô=`€]s‘Ĥ%ÉKË ` Á²ZŭôŬ‡÷ÇÍĝJŸKKd‰jêÖ­êÁGÔُ7²éşêl:²TéH[d4ŭŠ ­zûÏqǏĠÙeĜä‡@ĤĤŒ(b§–ĉYzFĉ²n³×j7R½öê­ÑdUW¤b˜É<öDd…`k pêıϝï]ŭċÑ·˙eÂ̙1&/˲0Ĉ˜<ÏıOޞ­›ä€>5U’™Äú,;$oG–G.IÁ.ëÔ-sçÑġş–zTWß"]GĴĞÖ8ҁRĦ#ġŜ™êĴA4AĞĜvhŒ’hÂĴ1 ¤ĞŒœ‹’ç["²2£·“ĥ,ëÑCĵpYâGä6·Ú·“ŝd ÖċŞÄf.îSeáézÔùÜ­gßrµg2oM$Mµ4‡ıÌ3ĦH+ 4„Ì%R”Ĉ&PLÁ…Ío|ŝ7Î÷!~é/fN1™1Ĉ”eɍx’ô¨$ZċşĞż*FLŝwïäíHZkKéö P=ÔÜ:éw¤-sU-}Ì&xhŞĉiâĠh İju4ÍŽ<âÚXSCċ)e]Z˘+œ²L¨蔑¸VäŠzŞ!…†Ğ†³óÎé$˜¸6ßóe3™¨ ĉ›ÀKÛhtUeż/ħ›JÏÂ0˜g×i— ÎBµbŞFÛkמi^XÛú ¨-ñê“.>C * -íßbû#Ú÷b’<şÑáß˙ĝöŜèÒĞÓáp˜”eYäy^dYfñ¤>ŬR×]’*…DäġyûP™ßc|ˆˆ$zߘYávC÷6ĠHw¨Rš…Ż½ ²Ü­Gĥ(² ‹"(QŠ 54Ù4fċşQğë şj<†\%M  ´){ eï/ ­ìÚ”{ş&KÚöéħ­~ŞÌE×A5z§Uñ·j$H·P¸r’=0Ía$X2VCê1M÷$‹m$jd1ù ÊxLY³ gFi€B% rĥş’ˆ=f1Vi•,à*{N¤NßgişĊıï!ÙDi4'À0f…ÁÇÏÓ·>˙ï|!m<5 F§777·766QèvI=bk×]+é³ìĵBòvD]vlƒ}µBşúR@+ïÓżËïğšÌŜz Ù;oàŸü{ğ{0Ĉ$`#ĞU§^h>}HêĞ[sÛt€hû8ÂÑtáĝéÓ8qâ$ĥ·6GPÑ„ Áj0"6£„`„êÄqŬµ€´]ˆÉAGxÂÈ`[|_¸GMJ+Öµ´„ôuŸètp dÀ(A`*4OíW e¤]› Ġ(ĤĤĠ×ênŽy_AFn´kM0…`BŒ}bxŭSżŝ•ßúíŬ8ŽÇIžçYQežçĤĦ’ú§Â÷¨$ûŝ7ŜŸeçäíÂÈKS‰”L°$ğê ^߅}ĤV™\H ĵu—ŝġ?żÜ=Ŭ* 6Ĉä"’³“=@{Ÿžhé ġş·¨… ˈ„UFêѐŠ”F„eY*Ò)#R£ nC|ĉ,†'ÏàĜÙó8}ö>œ8sÁö1PCHÙ^Ó\ċTzŬŞŻĜşÄ*—é|¤ğöĉy)€Ö)œ] Àċʨ/ğŽHĴÛJoïí#+ÊD—ù’äŠÉó]c̔m34İ@ӎ,R ‘-ĴRDDC{Ĵ)OULh­]g ˆH+Q˜Ĥád|ëe‚ík ĝ2ݨT*,HG<Ú Gç.àô£OâücáÔùûĦ·ĥ †85Uİ%ÜŞo¸*â†K•Ûï[íž[,Ì]P 8pOKŒ*ŝT‰‡ °"O›JġıtŞ ‘‹5a$Ŭq2WJD ­2s÷ÁÑPf<}rD?xîWžğpŭġ7â²Ü-Ër’eYšeY^…ɲĴ™e^'˙ġÀ¨àànċvHŜŽ´R’–‡K:Ĉ“Ĝ°ô6;°ô_OÍg–*0L2[ĵÂIre2™\L’äfžçİÊù…ˆ¸F-·B!UPRĠquPJY8YÓ´ğ,pç­u8´èBT¤µŽµÖ‘Œg£lzëäôġáÔfagï Î>ġ<‘ĝ…h!Ş)û&U‹½TInX˘°`!›é6vĜÂ@dĦŽiŜHU5J.MœÉÙ²kCd³î¤íĥë‘)ÒTƒ•ûN!W,+lG£ğ>RHˆÀ“ÏF7.ŭ—˙wŻ ƒÑh4β,I’¤tYw‡qŬŜŝž˙ëŸ)÷@òvIä\CÎWǍäğPߎ½G-ž—ŜÜ 4s^ĊNšĤ7ĈñġétşÏÌEË' µ$óĞÜxÔUJ69BiäàC@)gRJğê:HEœ"­ĦÖ­ġH=âËÓÓËŻŸŭÉ˙Ŝñ4ŒFtò\tö‰g'?ƒÓ@ƒ˜”ë:Â6 NŞœjĈ‚b,Ö -¸:RT0j^_V@ÈŝàEÙĴ9qê–C@Ŭ'ϕJÏ›ı°"#I –Rږ>b ƒíXêGñlyġċOD—_ı5÷ò<ŸĤiš§iZ6>o…ĠƒûşüïŜÉÛQ7–ùüŬh‹^V]ßG6[M+‚ħİb…1f–çùd:îíïïï—eY4'î‹”²J5N+"BDÔ=ݵÖdɤ•RJk¸Ë´³@kj­£Ĉ!ÖZÂ0Zi½q&Š69Ÿœ]yŭ˙ÙÏĥOmê#ÁcŸù<6Ïß vŬU6ädŒKa§yĞ VC˙³éĤ“N9÷ĝMç ¨S´ÙĜ ìj˜Şĝ‘-Ĥ•şĤĞóễŞI€y#Öĵ‘ȅÍÉT LSƒϜĤ7ùÌÇ.Üxó•0 o ƒ½Ñh4M’$gĉJ%ÔZ¨“sOàÒg5x y;ş0²2˘öÖEwPŒX– ×k?´ŞüН>ıħ7ĊˆH)N…1ĤÀ|š9wŽ—eħ£îY`Ó:ç+÷žR¤”ÖŸZAj­ƒ ˘ â î0 ‚`†áĉñ0Ü óñv²wġÁŸ|÷OÎ'ÇÎlŸxú9ŭäÏ}ታáJ+°ħŬXpñĠŬۅ;  îZ!èÍÂkŜÎÀfĊNMk²£ÊµĞMŞĵmóbYr0’ZTÏuqаާcĥ‰0ó˜ZH€zì³Û“K/|&~ë‡×â89öĤÓi:›ÍІ:êV(,UIo˙ÇÏ҃˙ġ >ĞÁÉۑôÚ5vÒĝż+kôš[Œš…˘âvÓ"Rı‚„ˆ CD%lrî–Ai•RZĦŜëŞqeY6wĉÔ\•[š *p†a¤µŽ˘(Šƒ ˆ0…a8 ‚`3Ž·ĥƒ`ûL6>9Ù½úÈ÷żó'çÔŬ|ôçAx1s‚‚”Ĉ}nT2sêÖìk×­Äe^ü2ô&KTYx Ġ€ •ŭÖhħÇJY•­ÈĥÌPh£Atލ† ÑYÜ5ğe^G) ˜%ž;üԓ]ŝéƒQT\xgccc–Ĥi’íÚ¤jµ\%yy y;šVu7/‡{b8k¨F=óʨŻuE$"aAèÜÁ8eÔ¤>(×÷ %Zq<Ÿk'BĈcj—RRµ„ 0 ­Ea˘(FQ´†áfE[Q4}çtŸÔ?ŭ‹ûŜ~í…'^:˙ȉ Ÿù˘zèُñ†€WğY?u¨NnŭBCF=B3ĥÄî I Ĉf܉‹Á VfÔè+H­B]qEs×]Ğ Es÷Âö;iŒ`àG“·ŸŝÔí]ŠĝĈp8Ü 3§’¸£ŒšŸCßĤCŜù_}„~îĞ_ġXò@òvôˆ„Fo4ı3­Ú}J'I˘gü÷R%ċÒ·˜İûì2ê*(qxŠ%Ĉu·zNW"c EQ%G¤•‚ +2EÑ ŽAÇQmFQ´=H’+›Ñĝ͓Ùŝù½+Ż=ŭÏ?yúÁ/˙jpĉáǁpċÔ ;8T~41MÎĴvÓ5šşJ-`êŽéĥ8‰ÜÜ$İç'U=› {Ğ͎p•ncQ…ôÀ“lĞŸ"3xäÂ)ĵtßÇŬşüâ…0 /ƒ›£Ñh2›Í²<ÏK´cHÍ4p:„çٛ’·÷ۘ]ħ[¨Vö“zòú&żv•“,™ŒÇı¸‚ƒ&5RFË Ô×ħHÖù3€Óa”RßùÖâÙT–e*‚@k=µ\Šöck›ƒÁàÖ`0ĜŽÓôúp0½|,ßŭĉgŻ}ì §>òÙ/(?c[kÙD™¨‹ĥ²éï–ë›Ö(8•ÎĊjŸl‡‡Ú W5aċıϵY€[eîq;éĦ› ¨D %ƒB“3<;˜ĵóÔ'âK?y'Š˘ëƒÁ`g0$Óé´06ˣВ°J%ù_’·#,íQ‡ÙRÊ0jğáo,K°ÚEW-Ş ş ´N<é°oÑğ…RßeŞïĵˆ¨˘(Ê˘(TQyšĤ‰Ót0ìĊqĵ1w†áíA–ŬŜÊÒkĝöĝ‰ñÓ§Ï|ñWGg{oĜ˘U”ĤJħJİíÁë§_qO˘CUüĊh#n…ußéş!şô ó3r›÷Àì^TŬAÂH)H.ÈĈ÷ÇĞg{äÁk/RÇ7‡áx0„ÓéÔ,~óóh%;|ík_£Żz·’·£F$jµxYgĊ^3êm8Ŭm7´Ĵ=Q_³;nvôQU{•Ô<^ġg6î0ğƒŞ{lĴQY–EQYšĤIdz4M§I’ìF£½áp¸7Ìó½³³ŭгé폽ŝé_½È'?­dt$v6,)Û8U5Ŭw Ċ²í™Í,<鑰Â@î!ÔµI•r˘Ş3Ú²¸v×qğfŞ #Ôƒ” ŽÔŭÏnŸ",Ŝy+ŽkƒÁ`'Š˘YšĤş£’3îĵ2ò@òvÔMÜH…ÊĊƒCşì–·Z2YU–ĴëÌĞĈg3Ĉ ™•ÄK”Ò²*¤;UIXDÍóM8)á˘(ʲ,ƒ²,‹ÌZ’eÙ,ÏóIQûeYއEħ?ĝÖï<ŭÚt˙#|ö Qxü,´`*¨™ÏêÈÙVĞ!İ:ˆw\{Ív@îDIħmï¸żRĜ)ZÈ<ÛU˘…Ì;‘7ĵvúU!lOä…ÁİÁ­—yĉìíË? XǃÁ`ìÜvfÉû½, ÜÉÉۑHŞŬlR2¸Èò…Uêh§Öm šĊş6ŬRH •Ô<äş[7ŽDwÁ}w ï •Ô=­D„˲Ĵ”S™[Ëò7pm†*·+Ú£Ŝb[!aŜïğÁħÍm"ΉŒÎ?Ĵ÷ß~™aòÒËanƒa†c­uċĥ%﵏’·‚ËŽ1O^ĉÏj]ց‘܁2’ʨ^Ġë,,Ş/ï´2KTÒŞXÒğMlXJë&:PÏÚ§’¸ ¤ PĈafÌ­-ëî"RlĝÍâF<ĝüÙ/ŭ•ÓB§@*Š,µ>Ùe$tH;ŬfkµR0 Hlİù•İ2:ĞÁużğnË#™';&˜RĜı°3:waSżz*‚í(І£Ñ(ÇéuÔŬˆwÛy y;²>;¸¨tğfdé/•{jˆä`·ž`ID÷ÔxLŞbäj¤ê,ğú°Ä=×„ÒŞôïğ £wĞ–ş54 .ğĈĦÜ;µÄΝg˜ÙˆˆaĉRDxëû$×uĝ?÷Ë'£g!*°LËö„?îĉè/4dċöç-ş5rÓn v^xŜlµ=ë4,uÂJó1£Ê”"˜ÂàĜfˆKÇîÛĤhp&Ȳí0 7\ÍV2›ÍÌġ}^FHŜŽ˘ËNŞĊhĊñ2êMġîÜgĦ°r…l’…ndRğËĊœqAjw”j%´„Ŝ­RêS×m·Ì}×$v*İ:–²,YD8ISu9ßúîïӎŽtòsżtBN*è4ÑH§ÇŬbCğµƒtRÄĊĊ’Kħĥ)àä:m´êŒŞVBQ](‹Ċ(çıE™3(ÔH ƒáéój²yîñx6y! 0 £ ú‹bWşí|ÉÉÛQH.EĞÔÑ’İ£½Íá–5R9PEuÄŞ`W“jŬ²£Ž–ݤĉġ‡Ï´£wqùa;9pÇ5G´R%ıƒ6Ĉ MS–y†IŬhëÛ˙*¸ĥyâËg?úİM=::ŞS·óA'V$­bYéQOÜUJ¨”Aƒç5d<‡RÈgì&ÈTÉ /Œ´’ \͒LlŸyá‰ûFZ×Zo:…i­óf›&ĝX’’·œ@Z\Ħ—Î+j/\K§öĝĉNŽhÀ¨yGjPö ŬĠÔ£*¤uûŬ­Òşnğĉyî(%Áb İHĴG¤(ŠÚ-UÍuRJ…Çŝü·G׏ŸûüÙ£HE› ӆ,ÉĤ[ĤŒš“hEl‘rSoI]‹D:#n¤~–…ÍLS”‹ğ£É T °}ü8nÄÇĥ.h½­µŜp†a°B}Ÿ­wŬy y;r@ryıĥ•KRÍ3ғ‚ }RgI—ï³­66Òpħb42íú`³Ì·:Zg‘:twpĴ_§ÔTGÜOí˘ĞTQŸòsÙfp0Róñ·›ßüí7·˙ás§Oj‚Ö2Y„zÖa협t$5;pì:ĴRcEċÇ­3íœ:ĉŸWOVu ³ Ì ŠÁݘ£á­“MÔ5ĤĠé ·WJ2ó3€?,¤s‹ġĴÚÜHÑíYùÛùҞ ÚQRÒóĜ5ŞrÚ ğŝĠŬ†Q_÷îe°Ë|ˆŞû÷=ž9àñ̊ÛvŻkv5ŻŽ:cLžçy–$Ét2™ìN&“ë³Ùì’\|ċĊċż¸1M30lvĥġ^Ï\xq…ˆÑLÓvGĤQôj((ÙÄ0\TrpaĥÏÉRuq’y˙=§ÂHX…§0žĵ_k½Á Š˘(½†BZ°Ż}ík~ŒĴWHŜކB²Hn¸^ŭŝ¸ċr`/;ÈUĠ£ŒŞ×”MĦZÉĦ‘e·Äëx˜Ŭòzö)£>‘GKÜF´äşnó:k3Ĉ ÏsÌf3†áí0 6ĥŝâw~°ûôç~i4D˘°•C˜‘û"ôu˙–N<°Ió;IjŞjp˘ZùHŬ[3˜¤]×z^; €@°uŝÒW7Oˆ6ƒ h­0 5Ö+@ö:$oGH4/V\t³uRp{WĠnş•Ŭt’žÛ6{ìıhMuÔ·¨Ü+ ­S@ğÎŭşî˘ƒ’š0RKŝ† Żġ03eY–N§S†áí8Ž7$9ĥñíùέ/ŝÇ4ˆ´…ĜâÎíéqÓu7ìO(™ŬìùG^ǏşŬÀ1Ħ£ZAD°ıu×ô`¤”Ñ0‚Hkô¨"şƒÏ͛’·÷ JîgKh v÷*Y£^­š+‹êĞ›!b[Y&˖‚İP çEd-(ÑşğjYcñ“%´L-É*İ "tĠ[bP–eI’$Á`p;Š˘kÇ~ò’}ċ¸ĉcH*U}ĊŞh ׊eyV€,Ĉš1néıN:0ê>Ç\İI=Ž[ܓs˙šħÎhò%JY{’5ì*­yğä}ħİfħï:‡*ĉd˜ı(Ë2O’d:›ÍvÒ4½™eٕcŝµ7÷J-FJ7Ñeż5â6uÏ9‘Ög̍˜¤Š=ٚ"ŝ:—[Ñ]îŝ—PĈŒêX¤ÌoW?ŻÌšÉ ²prm+JİHk(î ŽäÍ+$oG€Euw†jàš´‹d{ùĠWSt€›[’%—/J2@we {OwÁËçԕĉ#éœnfŬñ!WB=X0Ĉ”™•IÓáp¸“ĤéÍĝ­_Üô¨:{˙*p½ıĠŜ§OéZĠ?s¤‚Q%Ğ *¤ÎHġĤ[†QgG#=Í{Ċdı&èpˆ™œÔJĊJİ(‚@)u*_ä’·£lUêm5ĞĤÛͧV.jó²–êŞ¤B{ŝMS=Ħ£şŞ$SÄ?ˆïWR)§UżËş›ŻTLUŻğ4M“$Iö³,ğeÙġĊ?ıšħ›O4Ÿ,ËÒQĥĠgـ‘t•QgÒ|:lUĝjoÀl;ı×ŭ쌸´s+‹ÄeáĠÊĴ“0Q)ŻpëÊ`°­”Š”RĦRŞ $xuääí&“ŞI7§ı)XZİŬÒ³ŠJ#M\z\t]wu´Úµ‡ÁÙÓT']@>ÚwáĉëÖU™îĵèìFVdY–M³,ÛËóü~ôWU:5\öfŠêÑҁw\jÍıIġĉ‚Ó6Êvŝfĥ`2F`„ëÔnÔİŬÍçëÄyŝŭBàJŒh¸‰,ˆ·ˆ(RÊN~wİßèÀhYlm>ġÛÉÛqÛq£B•Ñ÷YFs×ÜPµ˜ZEuA² TV•l̇÷ÛĥLX˘˜úÀt(ċäüY–Mò<ß˳ìFüúwwô0v.;šÏ0jĵš*› İy2‚ÔĊH.)aĥŸ; ŒŒÌcŒışj=OS­Ħ ;†ڎ%lnBHÇDQHDšˆÔ …äU“’·£ ¤*Ŭ…Ds˜/Dġj(ŭ·íMTèĞe’yUŸûŻž7N Eġaŭ VLX˘˜rë-ŬŠˆ­˜Í²IQûEQìà…o]Ò ”ĈÔĜÌ?fÑksx’4`$̍$ˆFÊ~ĞÑ|ZĴmè$ Öf†ç ɸb\€shB<˘Ta $˘€ˆ”k²Š5•‘Oxĝ˜Ojĝ5Üf,Ŭ.ŜÒ?f\êc×½Ñb“ô´ŻvĉĠ‚Ĉnë#L Ÿe£‚R'Í|Uğ›Ş­cyż“ísÊlʲ,òüûÄġNĊ êSĥïéĈÖÜÖ@‘U òjÈÉÛJĠïµÏŭÖq§µ˘ÚŜl,AğY@uUÇXĊ1ï-?£Kɚ‰|˜úêU*İ(Š´,ËiQcóÎ+;JI-µLá>)î|Ĥ-7´'½V ngàŬÒN`hİr¸ÖĈ§‚7c‘dë´ğñnMreH+’wÓy—·£½UŝYˆ ġşßş÷煅táĥ²Ĵɝ4ÓĊ›!݆ùÔiĊ?›ŸH Żû1,U³cxW%yžçeYΌ1óĈŻE¤ž—( ÌaÔçr“ĥ›U›ÖqÓɒ Àb×ĉcp÷1+w($pÁÊŞE5”Ñaê´ĵ›ÎÉÛQ²…™4mzôm˙Šı§ċO÷vu'rçQĊ-L^Š/RsA0jÎRju€0Ĉ˜²,scLnŒ™•{·v‚l\Šb>6YÀ*ËcF}pjgÊIkb̨³‰áNÜJÄ~!´- Hħ>-›5ċ]vŜeçíƒ`V…¸ĉ>dY˟…wo×£Ŝ´qnĝ›šnœNoO6]X~Ĉ÷²¤‡Ż‰Ñ›6."Ĥ,ˢ,ËÌ“1óTn_K†‚7Ô)1E3ÓNê¸×)ßÍxP§v ËbF¨›ĥj™œ›­è…}}„vĵћ’·8\V”€¤S ğ&Œ€Qkġ“Ċ´ñf:/7vÊ Ï'RǏˆ)ÁJXĤƒ\xÍ8cJfΙ95Ĉ¤²w-Û T*DÚI%̵ûÔÎ/š'żtOš“^ħ,fÔTBM7]§ŝÀ4ş6p%Ÿ Ĥ·RĉyPĞ\y^1y—·#·Á֚²ĦĦċ6éı{,¤Koš8w|íŭż´– Áv„ñÖpßġĊ“úÜv͉³­ë-“L᠔Ŝ”vŝÀH£™*/uÓµŬuŭİŬ]7]ĞûFwîRíÚíŽTgÀÍĈbp‘Cħqœs)í,;oHŜ>p‹œİj€ÈUÚ/r@˙>|YÑë"ıÚ)˒,‰ĉ¨jlîô3óÖğ§èĈ’š×ġBÉX+E¤‘˘Üı9‰Ğ~rZAĜ,IXhĦÀÂĜñEq7îÔtÓı/Fw“Ü>_‘Ĉ—aÌ,"ĠAĵò@òö^ÊZވWLŻ“ŝ™EmEÔqŭX-È­VFġZEĠ>mÔۂJ–ÏĝésÍ=Ş"†™ 3[•4ٟEĦi.\ĥÁ!²šÎH£z„DóÙ¸ŭŬëfÓĦ3êd_r5IXEž"಑Òŭ-ÂÌŝ[âäíğŻ’Vë–ŜÉwi nş°÷qs½YTF½à`áHş3AÔ[JèÎZ³˜Œ1R-ĉ"RÊdgĤ\Ï9if’H5ħ—Û›î|ÄܑÁh·êĥƒ_FíNß’‹ye2Á€Ë@)"ÌÌFĵ”ö@òöÁgR51Öô]Ï]•$‹Ûen:n÷Äúĉ'u&‘ÖN(aBàżm}„ëĔóRœĠ@J§Y É€H¸¨†ìñâĈÄ]Línu÷à1¤Î.]5ë–êIPŒdbPŠ +$—.a³Hg.Vc¸'ћ’·ÒrĈlUğ4߃–&;ĴSg´Â½¨ŒšÏ£@nt˙¨Ö€RP8PMÒrc .ç0êíMW}nܒÇ5|Uôş Fʌ‘$9Òiaƒa‘†ŜŽ!ÙĦ˜™ˆäÌ\şĈ<ĵ}W2e³ìH°ĵqj'~;éµgŬšoӰfœ‚ÙŞ$­ B~³ğÙ-şíVĊ‘U%`"bN§%5>R@Y.OhX·èµ£Î.­ ² 8•‚$)L ˜Â1ĤúS… ™ìb Ċ‹ĈîIû^5ÚŜİ<ĵ%#H¤Ó­Ħ_ħôЙ܅:0’5”Qu7RU}Šĝp{ŒU×µh"j](²\‰Pšy#;é¤H,´Zĉ–ë´’eTgA–H§%òĴtƒn;[fcžœB²İ )ßI˜scLéşOx-íäí #˘:<ćTF²FŬD…>À5ğ}Ż|!ˆÂÂbèm-(Ô-iµ/ŠRTŭ M`Ó•QoCFĞÜtyV"ÈÒ²Ž;Iw÷#°í"€X¤7™´ ÍSɘı(˲\ò7{Eääí³t‘ô$',ċÀ†C½ĥRÍûĉK8edcHâW’ğ£–>-ˆHİ(VĈ  œp£`µs'ÓVÌ]e´Fö;SÉĴD:+\ĴJ:î^Ytĥ‘€mîîßÀˆŠ¤ê2áÚ ġúìî@Izó@òöŝȤùï’:šÂeĠnyŠôùïwá -ed—;ES tH~ùXc[qĜ;)ìì+•ˆt˘ÙXĞèU–4[w wÓdYNK¤IŽ"ofĵ£jÓ$róšxvÊ̸ä™k[6jħäżMHŜŽú6ZşYv=m€zcL­lşÎp½ÎOŸ—Ä”¤u7[Ë,PŠ@ä îß%˜d È)$”Òzs;ĥӄha>ŭz1£F•u­ŒYZ"™ÈSƒ–‹÷Q7Τ”Šfr#”;Ì<3ĈdsıÁrWWEHŜ>ĞXcdy;^°*ÉĦŻ/´“iĠġĈ ş k´r02Ĉojï˘J’ĤBRÖ4épóĜŠjĊcŒé¸íş1£NİŒJ$Ó É´˜ÇĦ£…¤‡@Ù?N<‚'·pŒŠĞ1‰1&Íóĵ(ËreVá:ï‰7$oP=”;–'9Ì•ùşÁ½·‘ĉ{‰şjşéš×WY:ô é^˜SHÚ)¤0Ĝ86²ħš#ËŸ¤ÈŠ˜‘=YdÓYl–÷ƒe]ı”iTUQHPĦ'7f“<ŒŠ[™1³˘(2cLħÄe'KŽïó@òvÔĥĠÎ=&‘´[÷ôü|ğ ˆ0ZP>ҟ,Ñߔ³½À‘¸^vô³;-ö°{‹5ŻĞOk­•ÖZ)B" £§6”ÌĈĥÒ1ŒenşšIF&%’I˘äöPĞ;…Q§Ó7)×ÎHŠ›ïಠ3RšeYÑ9NŜ<ĵ5³0b°bf]ÏOX–À¨ü°ĴÎhJŬ4Ĥ_Ï0AÓAë­·5 ´`HZ)*âĝĜİiç&4³ßşuD ”%#™HgecùŬQë;£Ŭk{“ŭË8òͲ('eYΊ˘ÈʲäN†@_ŭêW=¤<ĵ½ï ‰ëXħ›úı½1#ô9BzöĊ zÜtÍĝ•rÉ Dä’!üšq7@T˙ˆƒ@k­T¤”Ä'ÏÄYÉ`#PÚuiĈgî>Ä,5.IĦloDîŒZŬùĴżW€HAŠ1Ìĝ&Žëâ’1fREREVE‰ŝF²X%˙eò@òväV25Ï|cYLá^7›nž~e$=NY6Êb×!ĥ.ĝLğğŞúĵMĞÓZk*bÔ Ú>ßÈ\¸äz>Hœ[ŽY:0ÜU5ż|.ĦD @`n]Ä0ŬIaq=7f\E’çyÑȰ;°Ëı‡‘’·#А*UDí ]0u”QŻz’ĊlşeünşfƒV[°YŻöv(Qçtë|*°i­`0ÚқÇ›×R&PN’QŒÙ8·­|šm=î%ŒšŬËVĥ,Ħ¸ŝÎér׳WĊ$Ïó¤(ŠÂÍAZ ˙ò@òvô‰T0—ÖÈÑċóŒ:3q:dZ3êIíîsÓ5‹cÁ]/F~IıCUÔ Ş T†RjÁhĦ'Îi(ÚMJ˜Ò I ĤûŠ´l/çï…2˘ıÛNĜ&ĥP AœÀì\ÄéĵUĉċ^žçÓ<ÏÓ˘(J?Z7’%×ûo•’·#cŠj—½Y#³H•À,k€%0ŞšoJ$ĞÛ Á&[°_:îF]eT_†Ħ0p ”m=üô£“Y‰én†"1àì}„Qu%€ëıWŜ|qv+ÛïLËr/ÏóI–eYžçë¸ë–lÇĵy y;:ɵ‰a·bĠí^k…t`´Ŝ<£%ÊH¤7sÏ>nÛmCU>ş&ökÇ}ÖĴµÜuJ)ÇqAĴµj­·ĥ|lëġ)Ĉ“œ³K÷~aĥıŝĠ}Ë'R *$d×^Ä}:żeŒÙ)Šb?˲$ÏóÌĊš ‰q¸oô}µ >DPr1 L‹SÜxau­`°˜M7IŠ:ŝÂvh›ta'îrY°ÔíZċבn¸˜ġ(%„a¨Â0 £(A°„ÑquĞû v£úĉŬ[5îCĥ@… fvĉö%97À+EQÜÎó|’çy’çy×]×Wƒ´R1ù”o$oGf—í À‹ùì`Ô ´3ó*XĠpaiĄÚÉÒê'X|œÎà>ETmœ½Ŝ}×-Š0 uÇq†C­ġöĈCO^0*ÖWĈ98cÛÀ”ċ½‡Që>Di Š5Ê[Żb‹÷'!WŠ˘ĜͲlœeYZ…Y˘ˆ|fwÙyûàİ#İW,îĥ[3jNtíŽ7Ÿ/LmpĦ'›N:k^óv8›]C ‘ÎÀ&oKÜuİ%ÒZĞÈÚ0 M­ġħO}üB’¤i až/ï<˙<ß3eT9µKġV€pòê+8ñµ²,oċyŸĤé4˲lEş7°şSƒ‡”WHŜŽ‘Şëj°ˆ]˜:?ĤkÍp=€ĵž 7wÓġHZnşŽ2ŞĠ•[÷ÄĤùaOù>È]×UBXĤ(Šô`0£(A°­µ>qâéϜ¸2.l·÷œ!%W ß;7m`Uġ‹rRŽ€X£ĵù°sќ ÌKEQìäyïÒ½Kf^·ŝBHŜ>>ğĉZÁ _YízĞ@äŝq}şíĈëfÓIÇM×TFâVĊ³&ŒŞcĥ=Ü{ŸŬ u´*~¤šê( `0 £(Ú‚àĝöO>ˆcg†ŻŬN‚AZÙ͈ཌྷĦë3fğI Ċà|0ğ)Ĥ¸žçùí4M'išĉî ĵÂmçÓğ½ËÎÛFı#†K i¸.¸é–5ġçĉ/ż=ŞzaD9ĉÖu‡ÁĠÊèjİyPÍÓJ)5Á`0Š˘èx§Î~⋏ŒSƒqIK;&ĵġıÍ?’ĥş½Ğ ™N @‘†ı}rûmıS˙´H’Y–íeY6Ͳ,sÉ Ğ²ëp˜|BƒWHŜŽ@ÔÌê=\6´SĊ”NsW†2jŜóxU‡<"@ê×ĉ׍Ž:êSCıë‚8ŽÁ`°†á‰0ŠÏœúĜϟ~k'ƒlĠ°‘6ŒÄĥq²#e3ûèn(#é8Òlíi‚ 4òKß ³·pñNžç·²,§iš”ĥ›êAbHŜĵBòvÔ Ä͑Ġ˔/QF²|ž‘ôô:HµŠl]× ËÇWŬÚ ) C= ˘Ñh4Š˘èx†§ÎĉËÏj#|ùú-Hflg„*ŭŜ}6$ıġwän¨:"Ġ$(‚InÀ\ mİWò<½‘eÙn’$“$IŞfŞ|w˙y…äíÈó¨ħTE²]ԅQ+Íğ’e1£u`TĠB1ÚM^\üÈ7W=P­8¨8ŽġĈĈĈp0‹˘èTç.üü_zàÒ¸ÀljG IĈÎeç`Äĥİ-5ëżîŒ*Y­j€…âíïa+ğ5˘|=Ïó›išî'I2-Š"o¨#ĈòbXïó@òöÁ"’Ô ’îċèİ3êqÙqkúRğ{Ütġà>ĥÏ  µâHuî·XçĠ?lo%Œœ:ЇáĈ`08†á™3Ï|òéì#›?ı2µŬ½svL˜H šıWn:ˆvbŽl‰§×P^ù ŜRŻĉy~-MÓÛI’ìçyž5jÖQŸğΛwÙy;˘<²ŭìŒÌ}r@oş#$¤Ûw¨Ğšşn:tvˍEŒHÙŽYÇÏpê÷’Ĵ::ÀM§à2ë†a¸ħħ1‡Ç˘(:Á}˙Â_{ìâNŠëbŠx>_DAÏ?.nïHŜ5Œ:Ÿ>‰‚ H²·céġ½­zybĠÑ^šĤ³4M³u´nĤ<”ĵBòvčĞl˘şŝ¨ĞŒú`ÄĞÜtuq÷XkÂHş™\ ómFĞzĦ†a0Ñh´5OEQtßı|êÙáÏ˙ѵÄġ­³É UÜN;Ġŝ\ĥD’ğ £ĉtb—È@<½sċyôXĝÓ<ÏŻĤiz3I’½4MÓFß:^"öÊÈ+$oÔŻıĤ4`Ô·—\5Bb~Ŭš ÍGéÊĉ(Ċmì@k($Ġ8ÖZÇqŽF£ápx"ŽsAÜ˙Ô_ùŸ=ġĈ­ o¤à¤„SU:CˆàÚ5™ykİğ£j"°v‘B×D7ó/pZvw ×&Yv=I’Ŭ$IfišfeY6tPÜhi ÉǏĵBòvt·á`Ó?vĵÙ(µ‰‘nëş0êöĞk-)àş—!ġkègÒc×7ZUgÔmÄqnmm666Ž ‡³aŜ˙Ĝ—˙ò§éԃ›ßğ4DRH­Œ4‰ËŞsL‘yŸğŒn´„@ P¨QÜz ĉò‹üvĝ,Ë*u´ŸĤiâÔQHë$3xwWHŜ> ,²ŭìÀ†{Ï5חĈŽW+Ĥ+²oĊ£sʳNÍg`TÏEJ  zÄúÏÒR²F}ŠİĞŒ”sĠéÍÍÍÁĈĈĈĉh4:Çñ…ÑöñÇû•żġÈwÌpġĤĞ=r}*ı·Ú Âu'öğéĤ#;V„\âJ ] xíÏpŸžŜoŒ³ìúl6ÛM’d–eY^–e_Ş÷20yy…äíƒfl,4RğSôzP×îê6Ç!i÷şC£ŭôÀ¨îĦÊíÙHUúñÏJiŒúş§UEÁh4Šĥĥĥ6666N ‡ Q=ôÜßĝ>sÛ Âç/M­2Ê ÀB ŞâWû~ca,È]†‘Ġ½ ­ ˘¤ ù›ßşŝRŝv|–eW’$ı‘$É8I’™Ğ;:lŞwo-҉˙͟{@y y;’‹Ÿ²KıÉħ•Ċ™Nü:iùáډ܏,ÉÈħq"éi1Twy ŞÓ‘=ŒVÀj­ġĈĈF´µµµıııyr4ŬEÑ~òsŸ>ŭñ/ŭĉĊ &³œ–R KF ŒŞ˜ğ&şwŬMgw+óú£€`ÒëÈßĝ&ßĤ×ıÈßNÓ´ŠMŠ˘(\f]_ŞwWuUÑâÇ7ëġ@òv4­rĞħÌc6íá|MtOC%µyÁêż.#z3ò¤5Ş˘´Äbáö!WGäl İ%n:­µF£Q¸ħħ1ÚÚÚ:6ÎĊqüĉ‰SO}ìoŝ½gžżšàËS˜i 0ÂNy`Óĵë^ulŬt‘ğ#Ş\uN%EŠ×żÙµ½“~”Ĥé•Ùlvs6›Ó4ÍêˆħCj~]—ıîêWsâŭgâx>ó1¤ Ü˜‘¸nßͅ¤; mqʝ.ÍDXYĞ„ġı…6ĥ%ôáŜ˙ô¤vŻ£ŒZ@ ‚@WI [[[Û£ÑèÜ`0x(˙âßûÏ>ħFßz$c(4AH@iĠ Uħ"#÷FUßv"P¨PĦ¸ú;?à'NÄ?̲äR’$×g³ÙŜl6›ċyž7ԑ`uA,–Ş˘zE^!y…äí¨Ê£JĊ˜žxO·Î=xMQ£°²ê]/@Uħ)Ĉò‚I‚múaÎwHİ>•TÁhsss¸µµµ½ııyn4=ÇñŸŭÛ˙—ŠsOûú›{ï砂–‚0Ê%2Ô#ì(”î ŒŞVUĦ 4Äì!ùñ`”]Ò\ĵšĤé•$InM§Óqc_SÉ ×ŬÁ™vÌ9HŜŽäjXŭFَGë鸽8\oÁdn&?pûveTßYÓÒüO[ŭmĠġásÑFMeÄqmll Ž;ĥµµµuf8>Çñ“O˙â_ùÂÉO}ċü½1Ĉ;—g#"B¨ÚeÖUŸ„›ĜRħġh÷Fv‘ĥ=‰ ŠW˙£½7§÷oßIÓôÒl6ğ1N÷]Gğ™uËRR½Oü£oĝħZŜeçí(+$"¸!xÒrġ÷Ĥk¸é¸íĤĞĤ98stÜêÉŬ˜ÑJÙşùÎCZDÀ’™F]7Ŭ`0766â-kgG£ÑƒƒÁà‰ O?÷égŝúäż}{‚.1 EìW)ۙĦRÂĤJ`˜ğ £êNÊĈ¨  h&”o~ĉġošgÎ žÏÒôí$IM§ÓÛ³Ùl’çy_š÷²ş#Ĉ:5HîğéÇky y;š<²żSi/>Ğ`Ô-’mÁ¨ê¨+Fµ8RdŬ{‚,ğ&½6!,½.(£Á`mll ĥ···ĥ··ÏT0:ŭࣟúü˙ü?ŭäw§êğïŒ1(%6qĦêÈ ˜§t³Œ”÷ FUŒ2 MPċî›Hú‡xĉ½Şıxi’$—§ÓéÍét:v ç˘[V ÛtĠ-SGóTïüĈ×Îğì<ĵY*q?è+zí6ÂlA…nZŒ‘{|jĴqëÀˆE@†P Ŭuk‚¨ÏM×Wk¤2ŞÜtÛN=4 ž8ó£ŸŝÊ?úÏ?÷=ŭÙkû݁*â NQŞÈgŬt@É<ßhÜM4َ Ŭ`pşü§€srûÖÉ8z~2I.Íf³ë“ÉdÇĠċ4ïƒTà óïĴeòĦ3Cú°¨*|$[|ÚlԅQµ^£ĊTІˤ·sFġêĴœÛN°jĜ ĜkĈŠè&Œ677‡'Nœ8½½}nccĦÁ`äهûìWŝññĊOÂèO^ÛgQ!Ċ@Sğınî]ëĤ{£Ĉ‡IħċŻŭ1˘ë/$Ÿ|3MÓ·g³Ù•ÉdrğÊŞ[Cu°J‰¸~!-?³7ݐĵ=и²²/r_Ìh!ğ#j$%—nK$­‘ç­ĊŒÛ wİ&üà(ĦĤúé;}2jÉ5J G£Ñh{{ûĜĉĉĉÙápĝà`0xâÔú+˙èżĝâ‹Ó0ú³×÷ Fç €v-˜¤î¨QĊŒŒ‘{£@ÙôîHBBŝòŸ€_ŝ£ò™óçó,}}6›]žL&7\V]ş"nÄ88ftÀdXjÈtoHŜޤÖ'‘ZÙUw #šğéš[UBSIu3é†ôǗÀ§ eç×ħ7Š8Ĵ2é677·666ŽW˘(zâ‰O}îç?÷w˙ñs/Œ9ĝÖkûB C  $àR`ˆëN 6ĞΉċÁHمŸ¤€òâ‘ŭè_ÊÓÇ蕑–L&³·§ÓéµÉd²3›ÍĤEQd=0z7Pêûıĵy y;‚Š˘‡0|ìç~ŭĞ_~òWŝÖ#Ï_OéûoO .  ]çv; ‘ÄNŬmÂÈĜħ÷ÄM§i@jÂÜ|鏏ijwN ÂïN§Ó7§Óé•ñx|{:N²,ˊ˘(:2¸ìxˆÚꨙ¨žäÍÉۑó9ĦÍYGêÀHúbFî ْ“ùĠYè*() Ŭñğĥm ‚†R½ÍUétŝ†[Ĉ :$ŒrÑÊMv RáĉĉĉĈp8<>ÏÄq|_†ĥ=ŭë˙?ŭBĝGN~ór‚—.O sF`lĤ‚8 3Ĝ)#PĠž]†Ŭ=qÓi²0…0·ßDòƒ˙Êë×Οŝùl6{s2™\Ç·\Šwê’wžÈ°ŜTXfÛ†Ê $$oGÔ¸§!]F²ÊMׁ*à42jĴiTË/ëşĞšğĥJ•œŸOn·ßĜèŠjeÙá°Êç0NçF>h(" ‚@U ‡ñĈĈĈĈh4ڊĝÔ`08†áa>üôÏñ3_üêĝôU3Š˙ôġ1nìdˆ™ê"gÖ €aêϤ*„e×H·ĵë0r " P Àğo"ùŜ?Ċ™ä훟ÙúÙlöĈd2yg2™\ŸL&{³ÙlÖèĈp›nŬD†EuĜq¤l@Ô+$$oGU!ıNf2o4wĊÉR7ŬBܧ1\Żîaׁ ”qà˘*óŽ "0Íç`@1RÛÜë!Ħ˜š ƒ;ççúw£~ÖUhkŽp}ètÇÁĈĈF<´ĥ5GQt&Š˘û´Öœĵïŝ§ġßû_|vôGOŝèfŠí#Ïħħ‹-ÈĠ#;B‚xŜȍ”`ĥŸħa€KÁ]i#ċ*… *˜/!ùÁo|véĈcg·ż>›Í^ŸL&ïŒÇëñx<›Í’ŒÌ —ŬŞNŜXGĠʨ~íŜ<ĵA›ÇڛÊC ‘,$Ċ)3²‹“´Œd~_ê4 Ğ`¤š)ÈUC£×C„ •­‘İÔS_:şˆ(Q¨#Ġ"ÛJí¨ïIĴ(Š8ˆ8 Áh4 ƒaÇ[Q‹˘èDg‚ 8ݵÔgÜ˙Öż÷T289üóË ŜĜÏ!³"Ğ„ÜSY˜ğÌE’š-Ì6Ċğ‘a){ZŬi£TכPħuÓżƒô˙\‹ĤoŸÛ}k6›½1ßÇ×&“Én’$³žôns€ĞnNŜĞ)SHÄóÈÉۑôÖa>B‚,êŬ­a}0’%ġÜ29_ĦŽ)ĠIbğˆĜàğjTĊŠğ\“s”$š?šUG´ÄU§ •êepqsÔѲTn4•Pċ’ Á`0ˆ‡á Š˘(ŠFa ‚àd§´Ögƒ ¸ïSéŻ}òı_üĠ‡éĜÙÑ+;9^şĵ$1 cóÁM•gÜ{+0B˜z o•MÇĤŞ9¸J–v‹ ŒwŝWr]ğ…Ü€½P#óÈ˙/äÉMóÚéÍÁ·]Ìè˘sÓU0ʌ1ıP”– àëöëQŻ:jŬìCÖ6Ŝ›҇ JġO–ċ`­šôşdP<‡uâR €²s³]>ĥsÓÁvû¨™hW#†Ô­Û9¨ZzZó|omQŠ˘HÇqĴ‡aÇqEÑ Š˘aEAlA°Áq­ġi­ġéÁhÏüċßĝÄGüĞÒ`#zév†7_ŜÇ,+ĦŒ *šĞ$rn:—%ÏndĵĜϸyFÌV5ħA­ŒÊf!ìa`d?<—~O€V ÀÎ5‚J‘żĝ‡(òûĉÙSñO·à{ÓéôÍñx|y2™\Ç{išÎ²,˘ı8¤‹nÙĜƒú>}fĝHŜޤËáÏŞ‡u¨uaÔLŞ&·˜‘Ħ #çêwĴ`ƒïġà6ÌĞéu•Ž ÔÔúş_ó@",/˘¤5]s- A@h4iT„ ÂÁ`†aA0 p µŜr :Ĥ”:Ħµ>Ħ”:sá‰g{îKżôĜ#Ÿúü™Ŭ<³›áí}”i ] bM 3Ÿ²*]Ÿçµb2W%,0ÏU‘ħ5GĈÁ¨=ZFU1ıÏĊÎ*@òÛHż˙/AŻ}#û䃧ˆùÉt:}ÛvߜL&{†İE2şÓÌ:àÀVA‹_vÀ+$$oGÚ ĥëóœ/‡„QëĥöŜčĠğ #TÉlŬu¨Ş÷[÷ŞÚ~ÛF*€VJ™F–SIë¨#ÂbŭŠĴĦ :APE* C­”˘(Št†ZkDQÖ˘ b­ġ@k=ÔZ´ÖZë-Ô1Ô ÔÉs<ñGżĝ•§zîS'ġÖÉÁ•ŭr1Ċ•éÈZħ[=ÉĜÜâ|Ğs–ĜîŬµâ9xŒA},awĵF8F Pşí"À\é˙6oż4ŝè#çYĉÙkĠñx|s6›M£$2ÂU×ĝ–ğk1HHŜލL²1G˘ùàĥ;‘SFL€nĤ¸µ‚¤áÛjl*!(Œ'˘Şë 4¸âPƒ”""RD(‚ "Û`ˆˆ”ġò‘`ˆH`"bw,ZkûüÓZkRʖò*Hıç‚@i­•RJA ”RÖ:Zît¨”Š´ÖħRj µÑPk½Ħ”ÚPJmÑ1Ôñs=ġÀ3?˙Ċ'úÈ'ODÇÏŻ'%{;•Ë{È ]ÚÂVĞ„¤\Ġ0;vR@™7J-ٞ/nş²î[Ç8W Hğ´ü(ieF ")ŠW˙ éŝ'y8J.?Ùo§iòÖl6ğè\t;³ÙlܘúZ ?V´ÎĴ£Uq£ġ\upS'Œ<<ĵMĞŠğëÒ+#› \g têmI0@•2Ş`TùÜ@9e*µ‚&ŠEݍ0 ·777‘c2”!"&"CDÜ8/J)&ÛE :MJİŞMi­ĞVBÊM‹ìM”r§µRŞ:‰(TJEDQĴ”Љh¨”цRjƒˆĥO?ôèùžúèŭ}ôgN?Ĝ–D£ĈĴÀv \ğábC,ˆbv*¤žġÑLŸŻb|"¨ácĜ&˜ BîĜmeT–=0j¤‡W)–µS+û䑲‰ š€PƒÇï ŭñïŜĝVŝñ '^܈62NߞN§W܀½Ùl6sğ›ÙtĞ VǎúTí!İ2˙Žù‘ħHŜ޲Hb@)BYòHœ2RÜpxU3͛Ùt4_+Ô9 Tc–Ž#" ­T€ 85÷ˆÈ ƒ ıƒO}pàa"§àN× rިšW¤Ŭií”V¨”Ò" ‰(p—Eb£Ħ;ŒNŬ˙鳏>yîÔŭ>˙cÇÎ_Ĝ@4 vƒëIŸ\/°›ìĦÈJh!( Ĝ ³S@€ÌèÒê/Ĝ„Qa`Á³BÙcÓĜtüsh¨Që¨A„ĥ9ŞP†âĠo"}áßàL~ŭöŭ)ò7Ĉñċétzu:ŜžN§uĵ¨(Šĵuatè¸Ñ:ê¨A` }_ëäí(’Èċ!ŬtҗĊ ß]Ŭ(ĠĈ#ÈŬ Q~dÙ5†cGĥöÈ˙Ĵ׈0ÜÜFZGÑ$ ­²,ÇDTVı @DĥExç¸(ċÎî´vnż@ä@Qtöħ§N…ƒáÌCžmßÜ>q*>yáÑèĜ‰¨HM Ĉ^nöĴÄÍ+%vg;`TÉPdSµî}~)çu15X:ËîFíX‘K‹Ż`de ”ÀFQb'cjH+†4Oċ†Hİ:nGŠ\:7'o#ŭÑïŜüvŝÑóÛŻžŝI2›^J’äÊt:½1NoÏf³IšĤiQı1ĤXĦw #FĠö‡ĊŝÛ·’·£ %v+`$+ĈŽÏaTħHZ])£Z0 @$`v“dñ§­X $ZäÓ‡ÌnކgNžÑD§HݐŒHıò%%ä†0͓ñPK2•0ÜŜ?s~ˆDHˆŜ:q2ŠG›a4£íĦRJm<30° Z22&…Á$e\);o˜3ûŝ†rğï°sÀöM`²ôçZUĥöK`d3èܸTêÌı–2r€š_gìÓµ`Ds‰* Uıh@TĴʐ½ò ¤/üÎ7n=öĜÙï›"s2™\žN§×g³Y­Šz\tĤ£ĝ0bĴžutg›Żyċ·7$oGÑXŒ[›¨ħ@6\DÍ˙‚lŭ‹&²ëͳéêÒU7H êüoİÓÄİĉ˘ˆ@@˘ ,ˆÂ~ċ7Î<~<:3Ô ¤lòƒRäÒÇawùÍyLDa­qìĥ~'cA^ÎgAlÑèĴdLJĈĊœ1ÉÙŜ>&%´l•ÛħhħoD)M İ蕇¨jÏTr“ó‡’EħTĊ­pcĈm*wiĈ(ف¨ÇMgÄfÜĦıĦ@F€…kP   Ĝö˘ûÉïC½ŭ|ŝÜ}'^Ŝžz1Mf—f³ÙĠÙlvs6›íN§ÓIšĤ³²,scLé`TPCw F‡SGM·7$oGÓPJR6Z˙p{×~µÛÁ-Ĉ –†B#o2.ğNQĠN¨ĤÈF1”fĵĵËxm/G(hÂ@! R+E€ˆ"ì'ÒÒĊc”ÎVğ]ñF֑šÇtœ‹°)ëÂ6e˜K§zŞôa# eߨ•ò†J\hRğFÒžÇFêaz†aŬu2ÏĤ3 eÔpß5àÔJ`p"[ÜŞ" 4ʽ·‘żôoQŝ|!.?ôĝı”yŝÎx<2›ÍO§Ó$Iög³ÙÔİ˘b‰*Zĉž{ß`$ÌÖeçÍÉÛu×5†´)š+?,ŒqÓÙLwĉì&ĊV^ıjħ€‰êX’ÔMB-<Ä8 ˆ\½ÊĠ–v2*´İ›ĥ²ìċĈ.êĈĠ?‘‹ÙTÄlJluè0f^n  k‘ÂĊe”€‹9€;˜íĴĊNšµ4\"ŞĞ+jh>TŻRFĤ‚‘ħ1£²Š)ħ…Q/×½".T`ĦK‘ŭ S¨€bÙ ß@úÓ?ĈéâÖÎcœ{¸|3™NŻ&Irm6›ŬžÍf{tîĤ*2w¨Šú`Ôu´½{U#İd£7$oGLPUh´îF ]TçûQ†j7{c™CÈüfjĊ”ŞAšìˆ 2@ݍ­×Q%Ĵ´"äF0™ċ6KŻj¨Éó¤-ü Ĉ5ÜĴĤÙqŬóaŜë­U£ÇŸÒÈXCÙ\2ıµ·—Ċċ´~KĊµûጚÊH\Dž Re}:mi¸èL'éAĵPĥ³ş²#êi¸tœïĵó}$?ŝCŒnż>ŭÄŭg_…g^ͲäjšĤג$ı5›Ív“$'I2KÓ43ĈwDË`´4½ûŬÀ¨ùx•ääí¨ğEËÌ˙w#ħ]ğÁú&² .µzšJSH€ìX9wZŭ ğVtE%ÀJ°@“]ĴwRFV”d m5I]d[C˘hĴwu×ëFÍO' £ĥĵìœïÀ¨R@Uı Dìş,ˆ4àS£r İÒÁËÔóŒ,ŒŞĝXU[×2HË SZ[UÀĥú l]‘So˙é‹„êKÙSgĥß>ŭĜ…²,ğ6OŻ'Ir3I’Ùl6N’dšçyZEÁ̇QEŬƒéqÍ-ƒÑwŻġ÷?{$oGÒHYġ!(ĠˆÜ1Œì1C׉äŠ<ç½}ŞĤD5$È>' ÙÖ2‘„¤Êӆ°@‘€ ­wLd“ ˆP°`oV€ÙfıYÙâ"ċ:?èF]µöŜÒ^¨:ëžtÇH[éÔm–êÙC|ĉrÁHpÓU×ĠŠİǍgìûl³é0oTHı‚°y|HE)p1FñÖ‘ŭô\5{ôÄÊıÇÏżXäùĠŭŭŭëišŜœÍfğišî'I2IÓ4İRı™y]E´N÷…eĊŻ÷FU ^y y;ş@r1”Cv/Q4ĉĦifpğ^v¸Ĝ5v½ĞÁâèsíƒŬH 1&"!) öf%Èe÷Ùc@+ë>TDîĜŠUÈ°3…¨ço²gnşşdH*/`=êĦЉK`ĈíÁĠèê2nƒJlGîĉùŞÏm5nĵrۉƒÏĵ]•ΎV6FÄJAE P 6ûÈ_ĝ6²WŝÑí7ÓÇOm]9ûĜıŸĉy~}2ßHÓôV’$ğI’ì'I2β,Ͳ,m¸çĝîıĤZ¤÷FġFÄn‹˜}ĥ’·#iâ²ÂĴw×ÎĤkzİş ;Ğ+ŭp Ï[Óp_§¤Ñö󜃆ǯUż¤]Ä~Vb’–îöŠ*ĝ8dà:>XĊDTub%# äzäzëošwN¨ÀӄQ³§œ8"÷h—j²+Yıé„ÛPÎyáy’CîâE,.ف£h¨XĦ‚Lo"}ŭ/żü ÷/&Ϝ9~ñÄcç_ÍóüĈŝŝŝÍ4MogYĥ›$IUO4˲,3ĈÀġ°q"ƒĠ=é²wO`$†í°G!ï³ó@òvTe‰kÊ­ĈÜë²Z #qÓK °=Ú}Ò¨cifÛU!˘zŽ„` w?‚ĞöĤòÂfŬ²uTŠP+Ħ Nä܁ĥ-ƒu*âZä”P­•šm|Pa^³$εׄ4ĤŞŠKŻŜË+n$3H=ÏH`ó+ŞîŬĠg"8ġğ¸RUk[uú6Ni²Rħ͚Ċ7Qĵù-äï|[é­éçN½}âÜyžßÜßßż•ĤéN–e{I’ìgY6IÓ4Íóóct`×ĵnÀžÔħ'§¸È&›ú-Ád{ÈŜ~é›ŝ²9;ÄŜŭ§Oés—ò<ż½··w;˲Ŭ4M÷Ò4§i:Íóü° Z7ƒî V@ïŒĉ_kñU=ĵes3×À". îŬ¨Y‹TÏï.;nÁ%L7ÑRğє%0Œ²`ìKw½Ôs“êQÎŭF$óŜxMĠy|î|Ġ˘Ùşháµ6“ÈŒZjŠç$j*£9Ŭ!™ÎGŒW-…VÍÊsY ĜżˆâÒóHßù†ùäħğgŸ8w͔ĊĠ,ËnîO³[I’,€¨,ËĴ(ŠBDŒÑ:0âŒĉOĦĉíœĵy y;ŠòÈ.´Z)˜˘ĵ#UÉ ?4=öJ:n,GĤf½u:‰Û"UF’2&ÓÂı螺Rn·:&j7l…s×-ÌçÖpî…Ñê­ìıeTğòŻ·ÙU¤ £ZµÔa£ES7Ġ Àĉ‚íċJY—]:ßz_Üú`w{`*"e–e7ó<żeÙN’$;.F4v£ÄScL^–e)"fM¸Ü-½0êxÙżÂ›’·£İ’J7{µ’–ÀŬXQtÒQM¨-<3ĈÓiÒjÊ6ÜJġÍğubOĠ¤ÚúïenÁh™2‚´‹„EzàÒquÎ돚i;[>‚Ċż=€Ş7ŠŞi `„ OçgÎDùħï—’îُ´anÀ 0`f @EĦìÛËÂÌâʚ éž^BïŒêϘ,Œĵy y;Â@ŞċI§rcÙà>7Ŭ0j*‰…Ë]Pż-ĠÚ'ıdìOr9/À¨ù¸Òì‘Y7k¨ŭZփdĊßŬ¸Ó"ŒZŭŭó×J­q›LıŽsÙH% ˘(ĈöÖ#ƒ‡Îtùç,öŜžíŝƒŭĞ/ŝ°sJİ 0ŽÁ`0ċy>Îó|ê+xM˲4Ĉa›½ìŸĉ_²ìò£ñ-ÛéÖ;ì<ĵeŻ›H@K\ïFóa>íû£²0ĜÛÏm/ş-vSĝ`Àè U¸JY/SZD¤Ynpċv†ĝÍ Noožyä/žùìo§7Ù}óGğ—~ĝ§oÎvoÜ(Ër·(Š=wçyŸçùÄÁi–eYšç9ʲdc zà´ >Ëĉ‚µż'‚%ßtoHŜŜ˙*lWqíyŽŒòĴÄŝ8o÷”ûÀw£ùÓIŸŞšĈšÒ@)…d–b’Ò̓g·Ol<ûÄŻo<÷ÙßşŸwŜ˜îöƒ[—ĝ§o¤û·ŻEħ[–ċNQğEQìeYĥŸçù8MÓI–e‰Ë<ϙ™`î`×%Jıêk˙³÷@òvDy$ÖÔ]nĝnÁ¨ŭĜÁ(™˜L‹…ÇùY‡Ñâ}\ÓXçŽ2%ƒJ 4”é^ŠwĈ).ŬJ‡çNŸÜxĉÙżñ‰Ï˙­Ë›ŻŽożôü+?ŝó×ÒñÎĠ²,o•eı“çùNQ;Y–UµI“4M3§œ„™ĊKĵÔ,Z²Ö`À½îeÉ6ï…Kh…ħHŜލ‘퀝ó|‘}70jFúۅEÂh:É1KJ£ƒ`ä.loÄv‚ ÉJdAj\ĵ˜Ê• ˘QHçOœÙ~êsû_üۏĤĵwí‡úĉÍWžµ,ËeYŜ*ŠâVQ;yžïdY6NÓtœ$I’eY–Ĥ)Š˘cŒt@DCŸëî 8Ŭ[(ÉÜm×ìâÍÉÛQÂÙÉĤ¤Ş!ZFÜUW‡‡ 0ŜϐċĈè0Â|L‡nÄ*´SEÈ P¤ÁF³àb’Êġ†#­î?ġĜ‰'~ù£'úċ½gw_úöġ‹ßûƒ³ŭÛïcnEq£,ËÛY–ídYĥçÀ4K’$ÍóĵHÓ´(˲*5ĞJÏ{ó4ŻïT Jî}żËȐ†ŻÎǐ<ĵM— HÛħ T•gH˙b/ŒĠ üÀȰ`o/³içFw#̗ûê5sQM<´Ŭׅ¨n2Kı€b ËKĵ9+ñö1Žm…ƒÇî˙Ċ‡>òÜŻ>XŜxe÷Òw~˙•Ŭ7~ô’1ĉZÇ×˲ĵ‘çù­ŞŬl6›&I’Îf³"ÏmIÚŬŸú $K”“t]~w_-İEEïÍÉÛQ#ÒĵÙ'¨Ûŭîa$Ŭ!uè,ĝ†ħ·—ͧÖ£ĉ8nZ\ÔİrÍTnê™gÔ0ú¨ï5‹m(*BíĈ­+ ‚RÊ t¨4“}à‡“=ĵ;yáÄ#_ùG?˙n~ôĉOŝĝ­›?ù“•E~9ŽĞq_‡·666nÏf³ŭ$If³Ù,ÍfE–eĤ,Ëî;}PÀĤ/ííîĞŞpM|Ú·’·£Í¤PZ3sÇ0’e$=¨Îç…QĞİë:0ê.œúéœZùşŻ—À¨^̎0Œ ‹Ż VñŠÂRvbŞ‚€L ]u²(J"HI¸ty‚Ğ7SÛn<ôÌo}äÉOüú“׿uùÚó˙ĉûÁt÷Ͳ,ŻÄq|u0ÜLÓtg4“$™Ç4˲"Ë2SEL‰ßcµ$€¨Vg oHŜŽœÙĦwœöЈe0’ÜtĞ`”ŭĴŬé`MÑ*•3/ÖY–ùş'ġÒÇóRÏÊċĠ\ğʨ* ĉ9HŽ"Œj1Z X3„ ]‡ %PPP hĥĠÛiĵÖà4nV`çv‚8˘ §żÈùßúƒċ[ßşt{żû2żÁċ0 ŻĊq|s8î‡ŭÙl6›N§Ùd2)Œ1Ĥ(ŠzĞnĠÒğ‚’úXğs}ê·’·£èħ³‹ĵÒ@ÙJ˙ĉŒd 7Ŭ:0J2ƒñ8[ ıî‚KċZtÛb{”@ÊÊ;G6 ßTBÚuvvs0H+HiìÚŻœkR`Ú €À%·›ï-(£îÂßî×Tk½q÷FĠ3ÛĦ†B ÑÚ½8ۈV)¸ ğ ”}oĊÍ" dA>Îò~Ž×>}â³=ò7~îBùúŸĵ}û˙ú;Až†áe§˜n ‡áp¸?Óétš&IR&IRġżkÂéjéŬ¸¤Ù…Dyy y;˘D˘:­4Ávċd9ĜMwXM“Ói>Œ”}œğ)Tvħ \vñÀ ×Ë (R:36Ĝ½P ’Pħç Úϒ9ıŒ4R°™ŞöäB.ĉÀĥùŞrs¸‚5:”ób{ ĉ{ò>Á¨ê"ÎDċ&Ö˘14ħááFÈ+ċ׺DP„€Ù,Ç;ÓWn…Á…S_~ìÑßúÂÙĞ_óö˙ğA‘żŬPL7œbO&“$Š˘|6›EQpÏĞĤċuĦôîԒˆSFFHŜްÇÎ.ŜóAšwF"p R‹)## jáíî]…Ú*²u6`‚ î'F@!AŒL5Ï(Ž!,P‘ëÍ"û5ĉĵ´“c)€dĈŻ1Jœ˜Üċ(ĴğKÄݲzê Uıİ r·‘V"Ĉ{£ÊX†Z)W.Ë şnÀĦ²vĞ™R ²€"èA2ËñÊ~Š·â0zôżôÔżùĊ‡Ò—˙赝żŝ]­ġ;LW0ĵÇñî`0˜ ƒd:–Y–•EQ˜Ĉ;Ħ°şŜÒôCCIİyŸ,Ï%$oGŞ.Ġfq!½[0ڟÈÒC¨EEŜ½Ŝğ É'u?·j Rí!q.şFU>(Ċİ ‚Ŝ< G  tqîjx ì‚5ÒöĈ ÚˌġgF(ÂPT2@şe )Œ[Ìĵ1àĵġwk—ß[€1 M Ĉ4I½.³"hÌĦĥKö †V´‚6ŒlUT  Y0Irüà§7ñ։Ñàħóġ£>ñ Ž_üŭ—ĈŻ~ë{AĵÁĊ(ŠEQt+ŽŬ0 §ñ8›Ífä ÔrfÒ7¸Ŭ˜Ŭ.ĊϞ@òv4’V`# %0ĊŬ‘4Rw'ŠĴ<4ŒŞ3(¨@!}ëy ~úġ‰N÷Ë*¸e]KÔGğjy"@HÑ´0ħ”î5‘BÁ ¨Pmè͓PÛÇ 6NBŽAo:v4Ú bĞŒXƒ cÁċm&€c!H ccVFzĈNT™÷FĠcXÙî #İ'âRm²ëRTOkD`d뚴”‚°{kŠïܞâÍя~ġSg˙Ċ'vż÷µï×^ù‘Öú­ .…ax- Ûq'“Él‰ZZċÊ{wPŞaÄ~jĴ’·#iRU÷ÛÑ ÒĴêëÀ3ÑFúÒ§ako\ ÈïFvƒ1˜!y‚GtëĝÖÖÌ5ŬcĉÄÍñ-µS-\.&­ˆb""ED€"˘°`Ĥfg³œî Ò}‘8-LTôĴ”8 †ħÚ:…àÔN=½}ÔÉû@) Ό[”¸$ ‘r<·3Wäŝqç=½w0‚ĜĈ0 ʀ X ™Á¤ÀJœ+Ïş#ĦŞ>@JD`ħêH CS&hfŒKÁċë3ÜÚÍqöäpëáçŝÁ/è‡OŽĝ/ŝT%ZëmĤaî†a8sj ĜRuĴ:€zwPŞ'Crݽy y;zÉŭş5ECÔŝ.èĚÚ0ÚŬÏQV^™t`h¸ m ‰AĦ† @ñE²{=I’KišŜ*Šbĉ&žŠR+ѸĴÁ$)w^9Ji”&"­” J…CE…*R…Zë˜HâqyóÌìÚġc³‹ßŬœ&ž•ˆ‹ávœzᅧŜ÷,Ôĉ @P.ĥ·\î­Š²Iì*„ˆPg”Ĥ #Ü]UçË b(Œ(´²ñ2&³²q Ğ¤û= ÈK‹‚Ž%C190ìOS\Ì ììt˙™g/<ú‹Oŭâ§˙âGÙĊïG)µ­”Ú ‚àj†·ƒ +’4M‹F&:ê¨ÛááΠTeK’êVk{ó@òvdD’X·IJ[^ó.aÄF°;ÎaîF}EݤllĈ.ܜçù­Ùlvm2™\O’dì€ÄIR‘àTR=LµqĴ•RJk])TJiTàNGJİHkm+58ëXô@)5dÊ6dz×ÎíżÊɽüÎhĴ77Ôħ ï{ÁÙ§@ƒPˆ ì:Ğg-ÒdqĊ¨ 4P7Òb†;…0´b¨P(Iê1ïDeÖĊ QdÓîA ²xÄŠŬŭ!tÁPÌ@Ĝĉ˜ŒWsĈîl0¸˙Ħżós§Ï=÷ì˙ôëJİ-­ġ†Öz µĦµŜÇSÉÓ4-ĝXUğtx(µR÷½Bò@òv4’rYVDŭ  £ŭ\ UK‘óÀ‘"¨@UÙriY–,Ëv'“ÉíñxĵoŒ)љdÚqßU—ĦıpQӇ§”ŞF}+Şc­ĴÚZ µ•Ra‘R* ‚ VJĊAÄħÖ£óŬë ¨éö~úꅽ—^>ı÷cژ[£üSú Ôĉ9¨­¤$+íœĥ}ĉ$Ԑ˘tÉĥŸÓŬ„Quĥ4 Û­A“@£„ Œ8ĝ(ç·#7²ŬĉP½"”­cAACA (ÂŜĴ@>.p5-°·›âӏ{s˙ÛßÔ/üwçÔíן×Z”RħRêzZk=uʆ oY_ĵCCİ#ñ'<ĵQ‰HÁóÎw#S2vÇĊğƒQíĴit0Rwħf£DrcLšçy’ĤiR–eĊÑÚ}cĥ{cKĠvÙòHĠ.½ŠQZ[áTݧÀžĦTAäƒ â FA Aêfl<4Ô[Ĵ&'övžżpŭÚ÷Oïİ[Áı§(¸˙Ûç!&„ RPnlÍ[·g/Œî`TÉ [@PVŭ[$Ğ` @(!Èİ*EĥÌİ$!@ƒ@Šj·ž-éRŞ„…}’˘D‚·KF’ ‡çŸú{żpüÖ7î§W˙ßÑH)5pïç-mĠtáZu?·ƒ2òPJd³ =<ĵQħÍ–ÎN²FÜçʂħ7.Àĉ.¸éšJİ>oÇcT*‡ˆ˜ˆ\`eǽ³ĴÀJ ‰Œ1ÔĵĴyì œ‚Şĝ¤0 +N…a8‚ 0‚`†á0 Q›aĝêñA°-zçôí›ßzèĉoŸÚ Om†÷=CÁŭ‡œ+›ZNħċŞJAJ ~aš3}ïFĠ{_”ÜbD˘ ÄBÑf$2¨şV€@ۇ°rR˜+'(*V JAÍ &IÒ\)ÓÔ¨³ÇżĝÄù]8ĝßŭ œR ˆHÑ~ġj]Û!ÓQIÍÓëÏÖ§´ŻAò@òv¤ŬvnÇ0Ú ‚#$ÄÁH°;.lŞóŬ‚‘[oI×ËKíeq b"2DTş‹{ëİ  =d>2ĈTŞ•ŠŞÜz#’³8 8Š˘Q†£(Š6‚ ĜŜ×OoDnjşqĉĉ•Ü|ç›'f[l„ÁħGÀ*„‚ĥ0‚ħŬÊĞNFĉë/aħ­ú0ŞŜk+f” 0ÊŞeR.ÓÑŬ^ğċ\ÊJQŭîĜĴ›B…˜*È ”hì%%P2öÒù,CzêÓç>ò˙Ĉ•˙ïÖ`z#&˘ˆˆ"RA¨ŬŬŬd2™ä{x7Ùa”°Ò}Wu‚gB˙ğ÷@òviä~¨ wҎ›0’et`ä1Uú÷|4*˘ĤBêß- ġœĤ TeYRY–5 ‚ ”Rާ( 8ŽaE£(Š6˘(Ú pûT½~~œLċġ.żĝĈC7ĠÉêÂ'UxöY¨ĝ8X$ (Œuëi˜ UÊx3&rUIY H$VˆĜ>URà²Ğ–LÚşí´š×ӜKĥˆ ”MŸËO€{İXL3\-ċ鍍3Oü/uûv,ŭr\e9*”¸h@ @ XS4ş4h˙ğ÷@òvTyÄÂswP§Hd™›îî¨îÂ#óġ…ˆl\Ê=Ĵs×uĦônTġœ^H}€r•çyċĉÓœâ8Ž£(DQ4Œx#Š˘Í8ŽEQtùá0|ċáÀœğqċżtñ{gùÜGÂüs à C P´ŞTl­úß˙5aT]^”.ëŻ ÙóÀvŸ°PDW‚ÉöËPÊşëŞ$E„€Ü !  „uħ7-#(XpíPähvßßŭÂiġχÑÍï‡DĜ‡qéJİŭŭŭt (ġıj( ó÷ey~„7$oGÂXĉq$5Ĉ—£bĝÂÒ½€ VÛ:ğCŞ`Ô=,Ĥ –÷r 5ÔÒ:PŞ"Êıù”1†Ê²ÔyžgI’$N5qâ8ĈqĵÇqĤЧ˘èóâìÛŝÔĊ?9_œùxž˙((8 B /­’1Ĥ1TqŝFF•şÊ: j>+•2R„­BÑ2WJbSĊĞ­UĈĤ&§¨  qJ Ĥ½IP›7K”fSċÇSçi0ˆo~K;ĦÌ,“É${7PJŝĊŻÑ7~żÙ9֛’·#§Èİ€-âìÎAj.lb]<÷ FÜ!, >KF}PêSI}Ŭ–)¤Cğî:@Z8/"ĈCNyžç:I’4Š˘IE(ŠƒÁ`g0lƒcqß8ÇWÏĈٙë;öìĊ/ÜgÎ}"Ò§žŽY÷]áFj(—‡ŬJzXFĠÙ˘4ÖĠ& 4„uż1ÀRÁÈĜÓJÙ .Soî³ċD6Έ‚h†DNaħ€9Âŝ$uŝW`÷ÖĈŒHŽ˙Ú³gô0Ú¸öG„žbĦw ßù5ŝĈż_ëä툚 PJıì ċk(£{ £ĉ}Ä6-UħĥµRó¤†:ËJphÀh]×]wáÂŬtÛ-SuZ‰—ve-Š˘Y–eZëiǓÁ`°ÇñŜp8Ü 7ƒÁq~tœŜwŭĉŜ3—v^9_žùd{ˆ‡ö ەI– ?Fu’J)ĥU 8´ħ%Q "̄P+°bbR­Ĵ²VÊFĦšo¤"A ]*{(0ĴÁÂDÏJÀD öwfàҐ9ö Oœ:è7ŝMóŭ–*9a”úû-N e†O³ó@òvd‰ÔèÖP”Kğvżg0"ÛğÎşV¨Ž=Ì]CêSI}JiYr*·Ŭ2uaÔÔqޤÎq­œŠ˘Pµ<˲,Š˘$MÓñ`0¨À´3oŠókgT~˙ÛWn>w}÷‰Súìs¤ç!Q`ğ—•VhM\FuM™a$BFËIħÊH˜@DıijŜ[VTS)q ¨5!`…AhcJ,6ĤI) D];>¤Üĝô£ċñâ×Nï~"Âî Ì,ĈI’¤/сúżŬí–ğÉżúĞ4ükżç%’’·£l\J퍋÷F5ÎW)ÇÖ-µÜo}êh™ëî  wêşĞêdşPrŞÉ”eİŒ1Ĉ)u6 ,Ëv‡áî`ï<§7ϛüħ7ŜşĝÔäÔg6Ġħǵ Š dÛ÷N0Ĉ?ÈÚ0ŞĵФlÀ@WĜfÏ1+„Ú@XY8İ9˜´"(ħ]'ˆLí³o˜íwÇĴ…ĥЇ‰ĈH²ÒÖhÂdœX×ĈçW&+O⛀̆]oĞ(Ğ;:ÔeòŻŝ áĞ_ġPò@òvQ5ĉ› EÛċcŒ`orw‹^—Á¨ġH)@ ”jvH•ê°>M(Iĝ ­RH8J¸ PÒ0•Ĉ˜˘(Š,MÓ4˲YšĤÑh´;÷ƒbçÙÁìò­ŭo<÷Ĉĝâƒrê£Zî‡D¨0°Áĵ~‰~ż‚Q³ózV˜Ú}gˆ 'Ö3Ywœ[‡äÚj²#5ż#R×+…š ‘‚ ceA6~Ċ˜L2€Ğ›_yJĔ'ċ/* ħ1FœZâ²,ú¤ĉ_x€oHŜŜWS€)[Ǎën7J½ í€ £êXÙázl¤™@VĠ"ucH}PZĤ’€%Vi™o”Şipj šPâĈé*ÎdŒ1ea-˲,Ͳ,ɲl:öŠ˘ĜÛ{Ÿ¤ĵvċúsğÇ?uL{ĥ %ìĴ%ÀÂȍ…´²¸6C%ÛnàĦ@Xëĥcm;—‹&°&°´ĜiŠÄ΁BûŬVd³óMˆB…ĦÑ(‚ŭIn3ïŒ °·g"z{KÑĊxĥ-/ä"’‹HéT$—e)Y–•h7žRèï×Š'}ík_£Żz•ääíhÉ#1î7jĉyŸ/6ÖM÷Áˆl@BPJµJ˘nZ÷*8u{ÜĦg猀t7^3T·‹=@%5Ïë>0•eYEQäyžfY6Ëó|ZĊddÌŝ“qrkg–}üġlçA9ö”Ö›÷)ŠÒş<ıŠ%ġÒ.ƒQġñĈ&4H(`V6ĥÄ.Ĥ$.›NıîàÊşíğ@4›Jˆ½N)„ 0Ħ`)˜a€ñĴ°£M Âxo‚­íMz#úµO=Ë{“H.ĉ̜c f.E„wvv¤Ħ”€v<‰z\wġm=”<ĵ)sĠôÊvD@6‡ÊŜ¤€yż`7]5´Ë‹”ĤêµW+œ5ĦÔW“t'‰ ‡Ró4÷(&^&ŬıjÂID¸( çµ2EQyQižçIQ“Ñh4ÙšÉÇù“/Ŭĵŭє?5R ÙĦtlŒ y5”ÒA0ŞÎ¤9CÔuJu:8—uЏh— ŠĊ³ ™ĞÈ&:„†‡ †5ʒ1Ë]m•)Á`2Íħ5 ƒßüÂsòOĤħÜ̘ı`ĉ˘( Îó\ĤÓİtâIË6}ns½üä)½ù $ÙIĥU͒aÛ>ǔk¨şŠEċĥ^ÉĤƒ[Ċe;9°ËÂ#hMlÓ… ¤ĉƒŝŞÇвïÂ@!6‚"ÒÈ ƒ’n,ǔ llŒ?Ĉ_ŝO…˙l/fN˜9+˲0Ĉ”ÌÌñ¸ÑäŻġŝ˘J;$oGeW99Ĝµ)Ŭ›‰Sm#ÒéîşJË Ġ½Í*ɚ@:Œ Ż &Ġ9}”*µ$MµÔpçe˜6ŒI1ÛLŠO½–ÍRۏ…Ç­,q1žŞJ^FĠ +¤nĴ!\)#Ğ–XÙ1è˘ĴÛN+qíV+dïhÇ_Ĝ:Ĥ PˆC…aì\wN͉b9aF)âáŭ[Ż&_üċ'˘?™0s²ħħ‘ĉy^”eÉyžs–e%9ô~ĈJHŜŽŠ;ë†0IK”Ċ½Oí^Fĥ[„›µSÇe’:PêSHĞ`´Ş§Ŭş)áeä­£–TÏiµâ ĊTİ%v] ʲ,‹²,scLnŒIOŒŜN?:È&/íΞĉí' NBBmŸĊ•Úc>†'óĵ´ŭġ¸ŞU²j[”²]‚ÄÂH@P2ŸĜNÏߎ°°‰ĦƒRi¤™óĥ›a™—Œ°Èq3ú̅cĊÏŸŠ^˜0ólkk+u.ÌÒÎu×LrXOò;$oGJ )[s²?.%ċ‘‘MĜĥ)Ë,ó,ħ D…,Ÿ$=Pê[ˆVeŬ-[ÀÓĠĦLÒ(Y˘”ôü›‹ˆEaÉä\yĈ˜Â“1s>bÎ>6HÇ/îÌ>™ Ÿ>Û¨Ġĉm£ZwUÈ ‹ĞE\'òÀV6éAÉĵ½˘Ş5âWMTgŜĊF^”`›ġİHi0 ĥFÀ‹ĉËÏŭ\xëzh.OƒÁtcc#˲ĴÌó\&“I†ġWĵëÎÉۑ3Ĥyi'ˆÖuH¨v§0ŞF—Wq[n¤ë2¤.k tÄĜ.>ËÔġ,zëfáI –İKjŠhcŒ¤iڌ1•.’˜ó4}%Í~nGİm5<µm|z‡0jzĝ²‚mR”ULb‹\EÛ Kš­[NÈĠ*Ñü­ gĞŜwJ! ŠPcjÊùó CDaš( Gú…éÏŝÓáï^‹™÷˲œmmme.=Ŝ8×Ŭ²x’ĴpÏzó@òö²œí˜ÚÑñ>Á¨:Sm܅Ħ”]ÀÒt×aÉ.x™;n™š:@ËÒÁe…zêj•RjIuîßSóTKMĊ$""eYÊl6ccÉTV‡ ‘âéá ùĞYôù›,'hxŜ&6TRv3`dm5!V8;‚À° U]äË&8TÏɞj~Z EC… P(KçuPÂ@ĦHSdá[o—ŭ҃ávƒÁ¸,Ëi–eYžç•ëNz ß§|½Jò@òvTûÙĝĉĊ86ğápœeYš$I–ĤiéTRŸëŻ•WIHŜŽ„×.T Ìv\>Êó1ĉ™És—áğ{€¨ ¨q] a˜d‰ûN–ŬĤ,KiĵfvÇò8aŝÒMĉ48_ÖĉĈÀżġaT1,@áÚ~ ğñó놴뭧ŞFîB š'F€ċ&ÑVğ˘Ĵۇԭ¸(Q!rġèĉĊòİÏßpËuEŸlnnĤY–™†JB{”ïö÷›’·w #¤`ˆp)GFd“⨺†ĉHı<(êYğ %/Ó*(­tScçyġrùZŸ¤çA*ĝÒ͙:Aѧ@şŻt}U'¨d7Evî1³ÓgëŽàRÁÙM?'×ÜŜV‘- •Í+ëNóI,Y’`cc€7ĤÏ>r~'˘È܇ûyžO’$Éó<7yž ú“G–Ġ›É×ö5ïĈó@òö¸íŞŬg lû¸Ĵ|˙ad÷ó6%½jüÊG}è.ĝkÀi˜¨bZ%Ŭ9ŬzYĈqPlÚ<ı×G;l|i§ ·(:P¸~w£ê†)Píş³™w­w€ÄyfİδÙz Z+ĦŞĠżklRH3âû‚W’g~îÙĝ;8=÷G£Q’Ĥi™çyÙ]•ààÍÉÛûĤıĴZé™Mô>Á¨y>°†ÚÔé NïLŬ]ŭşPZ84”Rġš*.é'Ġ7ÂÇùKÓ2Pp ¤µuŬ#UfJ×.HĜfŜ‘š€Bd“”kLN2Ÿ ,U*¸')"07^ Yȕe‰Qàjöä™ÎG‡áƒÁàÖh4ğXRáTR÷[ıR%Á';x y{N‚Ŭıš5wï%Œ4A Cĝƒ;rzMĠ´.˜Ö°¤gŸƒR Ê HJİYġ§?~í³%…ôÈ*Òw#``LJ P cr6‰m™Ğ="c³ëˆÛ߉şµV4#ŻĉİW.@c“iŽ0>NŻÎyîÓ×_Ĉp8ÜŬĜĜ˜%I’7f'5cHÀbż; $oïïŠi[ı";Cçŭ„Q£• #ö›&Ëêb?tŞİL ^֞Eô ҁRHh­µR*ÜR7gĥ}ìGĉžEXÔ(ž]FU#€2CHĤH`ó`ĉ%PÔÜĦ%ĜÁ~è4)Û V)( ħCOßá·žÛ /^‹ĝĉp8܇³4MK´[GġĠƒy•ääíH,”ëì†ß u3ğ‚ÚáĠûŬĤeéÈ}jİ™%Ö·_ıˆcPÍf³™ÖzGkj­-ŭĈá­ 'ŜÊ?è¸Kż§;†Qe%3È(ÜXsċÂIn£2Ö%7Úß?rYyJ‘İŜx"E¤³ñh ŻN}öçĥ½EѵÁ`p{cccêJ,âU’’·#a\ċÚ¸0ï?Œ¨ñ˜4ï -Âe˘Ĥ.ŒVİdfQ-ËJ)šÍfcm- ‚`xAŭùwö6Î}e·l’Z·˜Ö°Y‡‡Qf ÈyÊĜìNRƒšĞà†Şs*HÄ5`%˜f' —üBVjĈ>=ĵu£|ëcǃ·/Çq|}0ìƒd:ĈŜy•Ô÷9x;ÂĤü[áqÙÙż´aÄï³2ޚв€ Á‡’H0u\pË:Ltg;U§MÀó½‡²,‹4MÓét:™N§·f³Ùċ4M/>‘}ŭG:0F8éÀµş3U_c†Ìbǟ³‹Îv:1ğë\ŻëB$óŽàÎĊĜŝž9^¸——ċ9‚ÁIĵ5=˙xç0<= ŽF£x0„X=JŻPٛ’·÷ö“¤E7Ŭû#ž?żĜó×ô!Ŝ8[á~“­ÛìPVÇÌ\8(%Óét:ŜL’ä27^{T~x‰ÈR¸YĥQzVFuóv°f07% ƒEÀb7G"M`GXÔ¤¤-żìP&ˆh.°Ğ;ĥϧžLE'ƒÁĈ`0µÖŞBèq}şÌ›’·{ĥ6ê}ĉĊ§ï?ŒğxĠ1$ZËġ³Ĥ–š˜{ Jbĉ²(Š,MÓÙt:ŬÍf×Ó4½|föŬlÇf*R€HÛĦ~Ìw #FRK­ŒĜ&ġ9ed+ĉ ~ëNRJ ÏÂ%` ÒĴ§ÖäüÓZësQˆxk8Fa¨˘e5JLHŜŜc·à³ÌwŸ­=ù{#i,dìžKı ~ŝÙqŻİ–Öß”Œ1ežçi’$ÓÙlv;MÓkY–]~4ŭW”Ö"U*\WTFġ&ƒ­ bS)#{,•+OÂ\ğî¸9A˜: .Ġר >Y˙p£¸˙dNÛAp*Žíáp8Š8@{bÓm‡%0òĉäí½2ÒTלĜnßï?Œêœ\żù™\'քÖtċ­Œ/9×]6›Í&³Ùìv–eW‡é[ݜ ŻÜ.@ÊĠŬvf!FpʇM‚¸vÍħ+Î*W—+hT'aŜnVĜŽÒpĊŬiš tqzê#Aœ XǛƒÁ Š˘(Àò‰}_2'$oï͊ç\"´ÛşH|Ŝ 5›ğÂÖÀ”âĈáül ¸úÒ2×ŬJĊä\wyšĤÉl6ÛK’äVšĤWž}ŭĊp¸É(3P¸Â !uhUçYRĊŒ¸ĦšÜħˆÌaÄİĞ’Êyk‡›*CÔ@ #І¸š=е>†á‰(Š6‡á CĊQñĞFÎ{0y y{oäQš‘ùŒì˜ëŞe;6|˜3íîħ OÖPJlŒ)Üĝ†I’$·³,ğNÙíw ^½%Á|­vS,îFöïqvNÜHċ²séŭö2—Ü€vÊ?ġÁ¨Ž-l`Š ‹ogž‚àTEÛqÂ0 ´ÖËǀxx y{_M¤Š% ıtßPÍÇàˆ_*. ÌÄK\wI’$ûišîäy~ŭÜĝol2¸°5IÒiqUŸµ4²éjםséU‰ Ò¸mĞzˆú×u”pˆ)ò_ÀĊɉGœJ:Çñp8Ĉ ”à)$oïħßN–Í\}ŻaÔiĉ*Ĉ1bc]Ĵm9ŝ½ß‡tÁPÂİğe)<ÀÉ%Íf³QY–êşwcüo‡ƒ°/Édñ`ĊÌ&ĥ„QZğdßİĤë¤î’[jÏӔó´Q––ħ0¸ UíÁöܝ=ġ™,Ëó<ßï÷ûƒXĜ`Ô )T×MD:T×IwĠ0jƒÂ>$k@FÄ $Ĝn#í\ ™}]×uY–ÙlvTUĠƒ|òÛwŸ-îŽÈ˜PܐZÁFéˆ#ĠΜ„Q{_orFCï!°ĞAƒpgzpÛZûTžçğyžz½^7É.öĥÓ´Iu< ­”!^–ƒċŞ`”Ż5aH³fìĥ‡Òşġ¤­ äœseY–UUWUġ¨ëûOUż¸;Ĝ=@l Nb?%ŒÒçf€aD5&ÈĵsJżÊ"ŒÁbµĵGa÷g7™ò§­µûyžïô‚òڔĥS)T—&¤ŽÜ]yšîDPĞ9´…idĜJËÜÑ:8ùE81³+˲šÍf“ŞŞŽs‡GŻżu°k™88ħĤ“ĉ=Œ€N5]:çÜĤé„Û4ŸÈgtbŠĦòO;ĉAyJ\GĈu¤Uc7ı!ŭ*T—8 „ı7× F ÀHè: ”ĥİĵÛ´w‰£KšUU5Şëú1W“û7ñÛ#˜,l”•ÔAô0’îZĦ¤òn™KŬ=Iévl £J!u<‡‡³ÁóĈ˜=kínQ½^Ż—wÒvÛTÛİHŞËOم=>TĜ&mwm`d6Ĉó‰jtPZŒX•İ<ñu]WUUMêş>vÎ=Nßzpx¸Z&m#ÁÜìˆí`”òsÒq?’Şîš4]êŸ*pÓKu%Œ¤ûÙ ÏAû“}cÌA–e;Y– ²,ËOéŽN $ĠgìœĴ‰# ŒÒsRWG^ëÛµ-”65bċ×O¤íŞŞŞË²,ëş;ççG?}w˙ /`ı)Ng¤ù‡ıj:î6ñîÀ¨íÙ°Fé:;‚`Ìû‡ŝÓÑ% Š˘È;½í–­­k'¤R İ.睤öOŽÛ”È•HâQwjlĉD£ÂÙ ,Ÿ$ğKï½ŻëşĴëzê½Qut_îMaMçŭ2g‚Qs›´E Ŭ}GmĦCP²Fé2ÇÖF`†Ğ=íÑŭÙîKÖÚažçƒ<ÏğëHÛtü^tK*’êâsvħÇ·E›˘—+JÓÍmÔ s(3aY@ß­Só §òwÂM´]]×3çÜÄ{?ê׎÷vw@6 ü$}ıÓÁ¨{_“Ĥ“ĊVŠ<×Îj3Œ¤óY´[‚ŬÇq™ß4ĈìcY–Ž ë`¤İ:’êÉċì$T²Ċ×Fħ$ŬÉ £ÚÖ%a —´ĥ,œ™Ù{ïĵ÷÷~ê½ç³÷îċa )ıl9Œ°gwÒíŝÓIÙó­`$_AÚo"ù>&.?0Ĉô1y’²5é:,ÜĥîşJ¤:wLò1Ïî:ÍUŻŒR³ 'a8ŸnŒ½(—´êú*ÇY ÌÌND*f2w\ Y‘0Bü 0ê6Jm:2ď\#‘%?é&ÏZlf.ì>&•Ŭ!˘ž1Ĥg­Íˆè´ŭìD $Ġ*f6ÈÒ5QIu•"KaT¸çùİĴr5işıÉq·~ĊmŸ=Ġe9Ĥµ)=qĉD\VEaAĈœß·İ¤[hĥÚùœFé ;€, €ÚSND…1&3Ĉ˜);…¤@R]M As}ÉŒDÀ><†2 ĠğŞ‹ϲëXnqâğìPX”á²ÎsӤך6çpF’ #2_Ü g…ÚÏ5׎­ġbûr"ʌ1ÖZĞc'HŞĞ·Ga„ıp(nœı:a!-##Ìçö¨¨ÎD"Ù:çı2…׃ى%ùdC߸Ċgo £e”ıçŸFˆíÈdÁLe¨œ&uʗH+ëHŞ'Ê$˘P͖]/‘5ó VUí–ÖÁh|éLzoÀh§ĈâLkFM³U,ÌJâsÀHşG^ybQ3ġˆÈ‘!"cL³ëZ÷)TW•8”Ua$WëŒ÷F9Ö7éjµ,½×¸2™Í­ˆŸßç€ÑIĈ£xÀd,<›ĦóŞ5A !’êZ8¤”860‚pè³g(´ 2/žKZù8cLpÔDDĥÈ$ícî,F ³•D¸Ŭzv%§Ï0 eµ$–-KÓ­KëİHŞ‹ I”Qû—ĠìLĵBôÈk§ïӓÔRH‘Ä‘!›ÛXë=7¤èlΈî— rFŬˆ•…½R”Á321)Ž-qH:I¤şşcûÎó5€Qs‘xMŬ=iußkmĴ’&KDÖövŠöñıœQèÛˆSÉ÷ˆL“XښMšßp½MG…‘IuİIdş.äɧévًžˆu­ûÚ?xc(VY"Êlï`è<šN ²tœù6kF4÷hg Έëò%¨ûLŒIu­‡>/×F§Ċ‚pĴ<şz ™è’2"*(ß+ʙ‹Ž†[°œFMž,v OŸá „‘b²ÖĜqË}J)ÈHŞ ‡ÇâßD†ë#D@ĤT t#ÒhSWBÊÎ"ċĈ˜ÂööòŞf0âÄE*lUMG-Œ.u dRó×ĝA—Ĝ ""Ŝûuİ:IġÄÔIĠÍmĥ—+†êTם= z’,K0ʉ¨—ŸîO+„çחÍEZ€Ql}ׁ‘Ȇná[ˆO–}‡àkdĈWŭù$ĥ1—ĝ(„HŞ+9<6ݰK‚Á“†N–›1„¨Ù{İşpw´ñ>cŒ‰ÓU cLßĜlhú7z÷•ĦCƒ´îz%<aĞód™şP!v’@,OŻ‘Y);}ùş@R)TWݰŻ1Œ1–k#ñÉtZì‰P–e”eY§ĴŠƒžf1ĉñYX; ‘[ozĵhî=ż`udlÜ;Cnŭ,ÎwfÖòM’êÚD!GáY#_g$qÜq; Gġ$Ԁ(Ŭ˜çy–çyn­íc†ŭWžİjŞö1ïĉ·†‘!ZzûċÁˆbÙ·<…‘šsÓ8F{ïğiSë$•Iuİ NÚŬXÁW£&Ĉ„Tâ\O2ĠÙèC´ @Ë^d2Ĉ˜˘(lQŭ,ˆÖÚŬŝSŻObĦš\éöş4ŬŒè$t–ġ=Œx*ˆá ½œkİDÄyïŭ‡¤0R İL,áïÙyHÍ×FmsĠ³a­ħâ\Ñş'feYf‹˘(ò<ïgY64Ĉì‡Żì}|ò½itÉZQlâKD ‰M}🋀ÑÒÁħ9OPXŞE¤ŽÉyï7ġ‘—SŜR İÎŝNR,ŭ6 Ô ĉ*Ót" ‡=R„ÓN#Àj™ġl ”e™éġzEžçkí~˙àùç¨wĜ{÷£JeÍMtí†lc(´# 6-3,†ġ ,`XD†Ħ6ˆ2ÀMÑÏ}-"53×ÌìŒ'•Iu-äDĞ^3Z€QŞŠ"Jżµu9¨s2]GK`tbb޵Öôûŭ˘×ë ò<ß˲ì`˙…?ĝÔlRáè¸nû×ħïĵϲ#j6żµ{Û읜äĜ…9£Ĥm<‚¸ zıT"R2³óŜ³sÚN^¤ş>’ĜÄ43çŻŒ:G¸ÂĴŬ/Ĉ цûĉNY–Ù~żŸE1̲lßZûÔÎó_ğùÁŭÌÜö‡[âŒl# óñ:0ZĈˆò>Ĉ #fĵ÷•sÎĊ‚†m'é›{˙İHŞóĵ“‚àNŝÉ=iĴ”âʅ/5\ ;Z !t:3ôz½Ĵ×ëġ{½Ŝnžç‡ŭŭ[ÏgƒçvŜüÍC@|8PY#C0”`Rué'Ħ·bî˙‹€Ñ܍ˆ k]dú1v ˙˜™g"R1sאĥ8l;Ġí*’ê,î(l8í \5߇Aı ÁÌêGî0˘MnhádŒ1ĤßïƒÁ`§(ŠkíÍg>ó'ŸÏŬyP†*{Ì5žÀZŠî(lşĤ˜²£˜·£%q|žiç…Ñb¤2€É ¨!n„ŭßaĉ™sëÚ/IÙɊë ’êI$rÒFE2ĤIÓÉ9`D# Áąt8ŻïĠıßiĴTs9ċŭ~żßëġöó<żY½g÷né7ß׋cBŒ’;jËĵ ˘;ÂÉ|Ħ\š3êš$šĞ–Ñ·e•Ì̳-Rv*’ꉇ¨” c Î £ôd:Gš9êĉ¸Ċ³:¤‹qG‹É,ğœÜÑp8Üíġz‡yž?ŭÔĞôGâgż~ñŬ°Qf 6–uC  '[ Aş{ž/FéÀĈ{À?Ä^ßM™yìœ+sU]×nÍ>$Y˙MT $ĠĊËÄîÚ|nQ7ìFİ ÁûBHCÁY`´ BËnëVÖÙ~żŸ‡Á`0Ĝïġz7³,{ŝÖg˙ó—ŜŝpŒ£I î›÷ÏBf ,È$Qg˙@$sßĵÁ%—£ômT÷q0”cïŭĜ{?ĞëşrħŬĞŠôS§@R=1 žA/ĦŸŬĥÍU×8£ıt F'ô( èÓŝ—gÑVê8$“eY6{ápŻ×ëŬÌóüıg^ŭĉiüî?ŝòQ\wtHcÇ­!d™% … †‚ĠZRÚ½ô­–‹„Q§cĊ–A&v½şCù˜™'ŜûİsrÎı5 ÒvB $Ġ——nÖÊÌù`$ ÇĤ’Rwg^À"ˏ˘UÙ´DĤ ˘Ž;ʆÁôz½[Y–Ŭ~ŝ+˙íko{„?~öĊ’oC„<3ȌÀĜ£àŠLêĈ@R3Œ8Ĥü²œQúÏÄuÈÇ ñŝ?òŜëşžVUUu֏Vı$…‘IġÄm’—şĞùÜ0 ÷ `Dg€Qz‚EÂé>¤S¸#Ú"³x›µÖöz½lwww°³³sï÷Ÿ-Šâöí/ü‹?üĉÎß˙ìAX7r% F‘d°Ö4ûŽŒ i;Ä4Ŭ*g‰Ŭċ/F@(ó6ÑĤ•wqĜ/Ç$îĦ÷>­!ıXawš=H*’êRqd:ħ˞ß-&ô³#Ò}H@´FëàdşpÊó<ÛÙÙéíîîî ‡›ŭ~˙ö`çà•—ŝ/_}­Ç¸ó` „"7Èm,óĥF݃,/瓸µ@daMB`DÏ&…ŻC6üzċG¸ħ+™ù¸ëäêNA*'¤°úQĤ/ÁïM0 QÄyÀuËpùÔΈ€ĉœQZHĜnÍh.ċb°HĠW´Ff]ş(ŠĴßïçğğğğ;;;7úŭŝóyžżôêŝĞ?ĵ?²ùßqp5Àcž%d&(n Î{H ïc“ĤkSurâ@ä‚Òtİ´ÏdñcWBŞğxĉï9玜s“²,ËşŭĜè§M’êŞ2vdÇ96½Ò|š.ğÒ60Zl!”b­—vD†ê40ZéˆÒċ¸nTìíí wwwƒÁó½^ïg^úòWŸzùÛ·˙Ĉ=Œ'âjXòèç keÔn‚M{°ĵ?Q·€AşÍ.|Í(9l i^c€úztTíġÜûÎıQUU“ş+ï½o”ĥŞ°Ó @ŸU‡C˙ĥsî¨,Ëñl6+ëşv[€hU;!…•:$Ġe)ìÄqsl,@8+ŒšµmŽ%ߝˆÉÒ]^Ú # ŒDB?;ùäíCZ“šÛ”Ĥ[鎲,ËŒö÷÷Ÿ‡/ġz½Ożôıo}ûö—˙›—˙ïï}ˆ·ŜyˆœQ‹œ|;Û(½Ż)ġo ‘ù éÂ(10wĞë.ĦcÉ(ŝÚĈ“·pû†żï=?¨ŞêqY–“ ñ-ûAF $Ġ%'íÚĈr~gD ,ÂH¤s Kó_N:#™iGd‹Ĵžĉóû  UZ˘e@ê:£|°żżżż··÷ìp8|ıßïîÖ§­/˙óŭżúÑCzÍGĜ́Ürâ`8È̗p³œ—Û…· ’ĜĵĦÑ0t_ Š ²9PßʏäĊ§³_ÖġĝA]×ÇeYN:ŭë¸C4]?R İ…œ@Şà@ȘċÌ#$ˆx} 5Ġá:@)\ç.–Áˆ8†daç˙ŸÒu.+ ³ @Ğ/+ëN6KmNEQäá0ßÙÙîïïĈ4ŬËŭ~˙³Ï½üĊoŭáwŝÍ7˙³‘ŭğ7î`h=ò‚Ċn †L§YnLğQ³dĜsâK 7–WpžFÍÁ™‡Òĝ7xzgrTXz4­Îf³²,g é:^’žÛĉ3˘R İ.Ċ K@;yâä(Ër4NËÎfĜeÎH׏HŞĞ7IÒ4ĉżûÓˆÚâƒ%½éB ‘ĤS4$y›X8ÌŬbÂBşÔ.ÎFê”AœÓ:-ñ‹ 4tYW9·H'в,³ÖZ³³³“ƒŝÎÎÎîp8< OÇv@/w>˙'˙Ŭ˙úŸÒ/>ŭWŻßOßzŒ ›VÒÚ…·€Üì7êÂ(–-tÓt>30ì>Ĥë<ûKtF(k_k€ÙğÈŭÇîöMû³r:ğ[–ċ£Ùl–ş{§tŸ#]§R İ.Ġżu–ùâgrFmşeN§Ô)66ÌJê…ibڝz  àğE§€Qr ĵ•ÈşžmâúĤ]sʲ,ġ£Ë†ao0 †á~żßŞ×ë=[Ċí,Ë^~é3_˙úç_ġ½‡E˙ûû1Ŝ˙h„ġ°Ŭğ›ŠF60˜B1 ‰tV˙ƒ›ġñáÍZ‘´ŽÈ7çîò`DKÈúáòè§ĝÔ3òħĝú²,Ìf³£ét:­ëşîT×işN¤ş–"@<ÇÔXÊҜ3M×u9ŬˆšŞíÎŝô  -Z=ž *ò“˙˜Ö¨û#˜%Á‡N˙j]Š#Ú6M7WU—e™ YŻ×K ƒŬ^ŻwPĊ͢(žË²ì…ŝp÷µ˙ìO˙‡?zúĠoßúÇ_>˘ĝù(§†ÄÁ€Â{bƒ3bbHÓn£ŬöqLÍ s¸ÜY/jaäç;2\´3b7o„BcéÛ°Ġ{ŝSÏĉ?)§£;³ÙìÁt:MĊ ‹ÎH˽HŞk)Ï@ċÙaÔ ŭҚ/ê4‚n+îÚ]´mDhŭ"0­axxç”âqFËÖO–§ &ŜàŽ.Jç)XĜäŒׇlżß·ƒÁ è÷û½~ż?èġzğEQEq˜eÙ­<ϟ³Öĝµ?ŝÎ7ĝÍïĵòñqQü?ûŜyï™0Ĝ…> ̀ ŭèX¸ŭašŜsÑ ‰Àû¸Żˆ‘÷yÏpŜÏ˘\xšS§B&~Èrü^y†?_½W–ċ½äŽ–¤ëĥ…‘BI¤z²);iĉMKí.FŬrğöŽf4E•žĉĉ„‡†´œ4–M 00"°0pİ÷ }ĥ’ÜQwŻtRsfEú…ÎyL§ĵoۍKo˲ŒPŻ×³½^/ëġzĥ(Šĵ×ëyž÷Š˘Eħ›eÙ~žç‡Y–=m­}ÖZûü—żù_ŭÁWżġ§/Oè`ĝ7o>Ĉ/ߏYċ0°€Żı£ ÀL˜ïz)ċŽ`ò>Aˆ#|"âš‘g"0B§#CN£BáŜĞ_ıĠ˙Ñt:ŝx6›=œN§Ç+J½eSZ–ƒJ¤z Á°‚ĝ3¨s]ÒA+IcÎôXšƒÒ²9µ%cé+äjkâ)V·ĈaÌ÷X”… ÏœŽ9ë:Ñ uÀcò<·yž›˘(lžç™1&+ŠÂfYVäyŜ˲Ĵo­fY6´ÖîeYvh­½a­}&/zÏ}ċŝëŻ}é˙ċ‹3ì÷ĝöŝé÷1žÔ°$J/C Xn[¤5!i/ğ#‰0brÉ œs— £ı—Oˆl †ŭŸ{!ûsĠû³Ùìîd2yŬQıĝu-I@R]ŞĴ ëHnnc`´àŒşž$ġ<£nú.,ÄJğ䔚lj°Ö½օÉ!uÒvİ=Î:ц”ÌYŠÖ: Ģyž[k-²,3Ddâu“e™5ĈdY(•ËĴµıµĥ0Ĉñ|`ŒXkwŒ1ğĈ˜cÌĦµöİgnżöÊ×˙ĝO?{ûµŻß|4Ħìż>Â[ïżñ¨DFŒá˜Ġòaˆ >˜ÑĤ×\ÜgäY'bx8—Rs ç¤qGŜ ܓ„QJĠ‘l+ì pücìÙ;ÓçŸüx<ž}4›ÍÌf³Ċµ£M ZçŒT $Ġ‘%SĦë·?;Œ$:#Äa҉O’ÓüzRêâ@Ħ< ú¤`{˘ğ `"d†Ayë­Y(dèĤëƒK³­³%dYÏh,“1Ĥq\ÖZЧÉcÈÓ@'9´x{Sx@ñÁĈ˜ÌZkˆÈQfŒÉŒ16žçĈ˜ŒˆzDԋ×Ĉ˜ 1;D´cŒÙ#˘ƒWÍ×>ġ™Ż½âk_ıAù^˙ŭ{3üċß?Äû÷ĤàÚÁ‚1Ì>ŻXıJç™Áq`bSœ TÇ#€ĵ İ8ç}#çùŠ`Su”zĉP} 9zŸ˙t˙—eY?NïŒÇG“ÉdÒY;Z,ñŜÖ!éz’Iġ$%‰°}&Ħ[ÚMÍ~–4´Í4-…(Ĥé:0˘81ñzš·c,Œ ŬLN05ċĈÚAžç{áp˙ĈŽ™K"òDÄñ䉈1é6ħÖ ‰µֆıĈ˜ıö?ròıۍ1&^·ñ9&1&>4A†ˆ(ŝÍm@ցà“(âċ‚ˆúzĈ˜>ġ‰hHD½go>˙ʗ^¸ùüË7Ÿ~öŬŭ§ŸÖÈ>z8÷ŝiŠgéĴ†‹‡ÉÂFbה1†n ÏÛÎÛ׆ĵg¸¸ä"”ê@F·tĞŒž@ÒTĤ¤˙=nï û?Ê&“IŞĴ›u֎V40´²N¤ş>8 šŬùsS[O3v<]Ÿë‡‚žIġäiÍ(Ò(AÊĔ]šBJ†"œĈZ ŒÍ`Éöl–=Ġï÷Ÿ‘Şßï÷E¤^c¸(霍‰ĵI3†Vû‰ÈĈçÙÎġtŜtĠîB€%˘ @[QPAD€ġŸyñs·öoîÜÜ?|ĉ…ŭ›ŭŭ›}“óÑÄáŝQ_ܛáîŻàñ¨†w–Öâx@Áq˙—ÄŞEŽmĦҚÏUÇ9ÇíPóÌ;=fĤĜT Bs›‚› ¤"27ží³ĦŜ`§×ß}Şï<#Ï,vnöíYPä™Ù?|vPy†A(_/kFíâ³Z0.•ŒñħÇäŽhú³é}԰İd`mx0rr µbsóċÙm„oß§Ôì´Yò-\³_¨›x_Ŭ€İ³Nä’#âXmçŸ0Œl뎲^¸íè‡xĤïñ­;?FL§Ó;“Éäh<OsÛ¸£MċŜ*’ê*RvBaT/Ĝĵ=Œ„C#ΔĤ eĊq Ċy éŽÏGaw[¤%ìíïáÓ_ü_^ŭöço`oƒ,ÁÚN…žm°ĥ,¤^İŠ */˜”Œşö`„ CNŬĴ›ÁsÒLĥT•àx6’Öžñ¸Ì*£O8žÖ`œÈ´~£ 6ŝNÖH“†$˘0!fŒAÏ úĈÇġ7Àè9T…° îhÙĴ*ÁâL) ­}Ĝ4èdš› Î'ĴÍ-´îèrğvŻ2ŞqĴÍC™÷ñ?"›ŝÔ}ñKğ?œÍĤïN§ÓĈñ£ñx<ëzY™·Çĉ ;-fP ݞGñˆ›ä\0 ìSş:!F!â„=O ‚‰l¤Ĵ ­klè_ĜE—ĝћ%~öÎcd½™5Èrƒ,·ÈRşÏš8.v7ingŠ-#–ıû)‹ ×A`„nҙ Ûœ! "ĜÉĈdpÜOe€>3{6vŜ k;Äœ¨G¨x“ÎP!WÏ=Exa†7é·ĠóŞpwƒjëŒÜ\…ċçġ ù#–Ë!ħÌu֍(î9Ş>€<ú;|ùċâMƒúÍq€Ñƒñxĵ¸ –—8¤ukH ’ê$킇¨|tI>ٝSÁ¨;ψ¤?2mA:%ŜÓsc€1ZĜ˜P‘RW>ş6ÛrrXÎΆz0†@ֆ=ŭ†pĤĴĠ„ ¨Â B†Ë™Cq‡‰³ËÙc'QÓI‘‰kG²Kp/ ĝX)^םŝ~áµ ŬÊT]â”áĴ“Ž#ż1. ’ÀÓqF~J!MÇsİğşs{³Aäù’ĈŽo#&3ÁfáÄcȃïâ{7÷‡˙8Ŝ›L&ÇG³Ù,êV­m3OĦ¤@R])ŽL(ù& áĵ0joçv¤Âr‡ósJ× Á À$°ĴDl öiĥ@2ƒLħ ñ ħ!f `ȵ]Ĉ޸vĠ,{¤[÷aLĜœĜLħ[$4íÎòñ>ĥ$ç6>NPMÙea}‡;ûşÀËC^,ħoÇ},Dŝ…ÇK§t;µîáŽ3r~qQZCꀈS: £Nµë~Ó' #´ĠtÖgD <ü[ìדÏxĝ7³Ùô·F'“ɸ,ËÒ9ç°ĵ#6Ċ ş9V¤şrħ™ izkÀŬ~vç€Ñ| ĦÖwàD8™8iÔE§ÔŒż&Bžu: x†dRo–ÀÖ 3áıÖ,…*>¤=‘ĵ"0aXQk%K”;ñuĉ&Ħ/Ĥ;O|ÛċAY°$eş v +·]µ—Âhš.€‰çR§ëB›Ĥ‹ëDsßö `„”L,Žŝùĝġúë_:üA]—żÇŒF£{1U7óŜğŽ+ò%•Iu%ŞÂÂ×ŝR`´ĝ5ı“Ž2K„‘€|r:0lÓy6£”-™šóŒž 2 X×BÉ´eMY_eùÓdYŜl5HD–î-`Ôĥó ›Y=·Ŭ˜/Ò„׈9@izêAĠ–vû…jş“?ÛÁˆLtE&|@Žß=ĝ.ŭs;?1¨1šLŜÇwÇñét:ĞŞŞ[UׅѲqċĴîH¤şĤ’LyÁ!\ŒdáO…é:òÔ8£HĤĈËÄ@,·Pòl Î2Ë>Ĥî"Ô,Œ‰'êöÊ[È-ƒ‘Ĵ4*Ëö’ÇĴ…Qg*o¨aˆs…âVĉ6-—Ĥݲp€P£è˜:]¸ëŒ.§ imÈ9żĤċÏUÀÈ´E Ĉ†ïÙo€ß“ŻšżıÛÇ£Ñä·£ÑèÑhÔ¤ê֍ÖUĜ­ƒ‘H¤şP’%\OFŬŻ !ŜÇ5$ĜH„‘ •ÏŽü­ 0òVàĜ 3`”œQ<§”lÜÛdb‘5Ċè <'Œ¤û. ·É˘ó‰ó…şÍMC;Ÿ܅b…ıİĴ *†óáñŜͧòĉÀÔmŸ·8Wħf”†íYÀöÂĉ×òÈŬ‹O?;ûĉŝàġñxüÎx<ŝp4=Ç£XUWcóĜm;{ üٟŭ™üĊ_ü…’ê‰(–.áPĜ„a$ Ŭ!ĵxšL&wÇñ£Éd2šÍf³şĞ-ÊşÏ£ÖËŭ'!À˙A¤ş"­ I’Ĥ°òü´R…Ñ'FÀĴZ3"™‡ê9‰{‰²0ٕbŞnöäáß ˜ŝÌ}ú…á{·o½üFYÎ>8>4™LîN&“ñĝh6›]½˘û‚ÉjşÓtġĈâ9}˙Tg¤@R]3—ÔŝQĈŜ”YÈ´TŭÂh.Íĥäk/ğ8—–Kϧ°FDYÜS”G(0{xü0Ç?âO=ƒğŻ|áöÙ×ïŽFÇO§ÓğÓéôÁx<~4NÇeYN£+rZ]ŒÚÏi$P İŒˆh>„9‘¸05Vœ(Œ~ça$sİ·ċŸ„0˘Îš™öû¤Ê9[Äġ" ô„ñ/ ;ŭ?w(_ûú­ŸYâßÌĤ;³ÙìŜt:½?™LM§ÓñWÄĜܽ{ŒÖ|İ;R ݞĴóٔĤ; %[‚ÔsŭqFW£ı4ÙY`´é“"ó¨ÉĜ-Ĵ 1ħwLÉSġCàè'GŻ£¨ŜqŸznp÷…Ï?û PU³;Ùìŝl6{0NÓ:Ѹ,Ë*ş˘z „ĥÑ*­LO70Y¨T)T—%Ùòĥ”â ż8(E*ÛiM{I§Ċ H1ĜÒbÀ§qçñhF>Ȩ  ‚“ : #Pçë/@cŒ–Aa-Œd.-&ÒËÖh ĵf*í)`4—Z“ùڃĊ”]zS+IeÜi†äÙÎëG‰n÷#`ò6äè'Àĝ-ôĈ“ž;ĝèùg^úsġŬŞœŜ+ËòÁl6{4›ÍM§ÓQêCçœĞĵ÷~ƒ+ÚDÛÀhîs/"bŝ˙jaĞR İÌ-u˙@%‚Hb\xi†›GJ #, ü+c…£’% Jq²‘ëF-M%.ʳƒ9dñûĈàJ,ĈW%ŜƒLHpáŝâ8ƒXˆ!,@Rl”6pĤlXŠÄ§ġiƒtj”Ç~ßU–uT„ŸËvšŠ²‹páv£13¨iŻ#-ìó4•lâ]4…#Ôâϙg!>StnġcÀπúâĈ€; §òP=܈§ĵÓ·ċ _Tŭž­‡7²ñŜ‹½û;·ï‹˜™§Ŝûİ÷~:Œ§Îıİ÷~R×ġÔ97ĞŞjV×ġ´ë²ŞŞ²ëşŞŞš™]ü<­s:g6£$–ĤĦWµ3me§@R]:”V9Ċ?^öŜ;ï}ċ½Ġ^Ŭ{XËšÒï TÓr÷( –vm„â†Ú”Er8Qù&ç Y ó|;ü’ Hħuê@Ö6éĴfR*$Ñ]°´é„fHSpž;ϋé)–(Ó]â9ş”ÎÍñèÙGàYëâ×Hk3ÑĊ@8şĈTB×'ıß.—ĠqĉT$âg­ûJcÑÉ4÷Cêĝúpc@\xŽCü Öx?ìçĜŬéM`w'ŸÚ=Şv‡ùa˙İ£<3cf.™ıŠç%³›Feé½O§™stÎ͜sU]×e]וsĴ£œsŽ™÷žEÄ/É&àœ× F ”Ô)TW™ĥ;ñÇì½wu]Oʲ|\?úġ÷ŝ{ôÖ_dMĥàĞhÉ2T§|e}q³„²şĴyÉí´âħÒ.Ú·\R½ÖyŒ,–[ŻüŜËê§eûCÁÙË{;½éÊ5 ñĜßíMX˜e'?&2ÌL~?÷r3S°53;İEÄìŞrVĠSĉ*Ô/ǃ’*–c×isëÚĊ‹ĵˆ,[×ñK\ÍĥàY˘´ıxát0Z8P)T— ĦU!° #ëÚÍf³i–e†ô›úR˙˙-{ġicÌ1f @"Bñ!p‚ˆpt@›*Ü6f´§[':Œ’;"uJ $Ġ“LĠmtHUUùét:#˘#f†sÊóü> ‰¨GD™ˆ˜xj ”.§?é…ëŞSĵw1€J ú) ÊB|e‰0^8yfNçŬˁ’n÷5{‡‹ì˜YÒsV8“e0â`Ú)ٸӌŸ#ñçŝç_ô˙ŝŭà)T—ÑÚµˆġI˘î= 眛L&3ï=UUċ˲,­µˆ¨ ˘@–\QSP×-u ¤Ni{ÛNÇ(A: j#­ĉà"”ôá 4éz:+VÖ@H6¸Ŝòĥma´ÊŜİHŞ+wL+MUUÎ{ş1›ÍêÑh4³Öĉ"b1yBĤ äÒġePRÂ"Q@àXaĜ½ceG„K—Pá9ˆaŭŜÙHĵáöMiĵÓ8!^ñ³6të€=•éw(|UÀI.‰}ʲL•QB·‰'ہY-BI_ú sOXçÖ.HÛşÓ8ŸmÓr[èô#£R ]ï`FKܒĴ9"5ğƒÔ,œ+.DËnß8VaƒĞ-Ġ½}sV9:…‘Jô{ìh ˜hP‹Áq2EgV¸˘E)˜6ç,Ï]İmĦ´­sZş™ú‚ൌ "ĠıDZàrĊoV@"]_ĉnŬÏŞÛ‘Y#ÑĊêŞÒ&Hm žMP·ĵĵüEÒ¤R‡t-ƒÜbގVµukH´à’¨Ş<6Ż)˜ÎîŽä÷ËàÚĉü˘ µMĊi@t^—İR ݘ6-–3NîUJnH@´ˆAtù ÛĉvYÔÏSlŸrÛşĞ‚‚H@údı¤Uà]Ș0u›Ó­‚ĤêÎUm³Ž„- pZç´ Jëܐ‚H@ú„ƒhÑ%­rLÜ“Çú…eR=yH×-L›\œò{+ˆT ¤Oœĥ…:0âZçŠJOĈ%m{ßETmóĜÓPA¤R İNüáӒ ‘`³Fë\‘érAt×t^(m‚•BH@RmċŒ–ı¤UƒÖ8+…Ñï˜NS"Íċ³ĤÜä~7•Jô{ eî¨ÛVˆ°:ÍwZÑ'ĝµżŞŻğmqÀYŠ 䂟J@R@@„ [µö¤îèúÀí˘ qÖz •IµBXáĥIÉl1[uEîè,°:ëġ3 R İĥR›À´ìú*礁èwRçĜE|m•J¤:5˜V9U톰Â)İ.ß]`İT $Ġ€ [Âk`¤ëzI{ĞT $Ġı1@i0ûä¸.•J¤şĥÁKSu •êÚIç!İT*•êZÈèK RİT*’JRİT $•JR)T*•JR İT*•J¤RİT*•IRİT $•JRİH*•JR İT*•J@RİT*•IRİT*’JRİH*•JR)T*•J@RİT*•J¤RİT*’JRİT $•JR)T*•JR İT*•J¤RİT*•IRİT $•JRİH*•JR İT*•J@RİT*•IRİT*’JRİH*•JR)T*•JġIÖ˙?85-[OÒFIENDB`‚desmume-0.9.11/src/cocoa/images/ColorSwatch_Orange_16x16.png0000755000000000000000000000016312467662066022177 0ustar rootroot‰PNG  IHDR‘h6sRGBÎé pHYs  šœIDAT(Ïcü?…$ÀÄÀ0ŞaTpĠd³p8IENDB`‚desmume-0.9.11/src/cocoa/images/Icon_RotateCW_420x420.png0000755000000000000000000016635712467662066021274 0ustar rootroot‰PNG  IHDR¤¤~LQ5 pHYs  šœ OiCCPPhotoshop ICC profilexڝSgTSé=÷ŜôBKˆ€”KoR RB‹€‘&*! Jˆ!ĦÙQÁEEÈ ˆŽŽ€ŒQ, Š Ĝä!˘Žƒ£ˆŠÊûá{£kÖĵ÷ĉÍŝµ×>çĴó³ÏÀ –H3Q5€ İBàƒÇÄĈáä.@ $p³d!sŭ#ĝ~<<+"ÀxÓ ÀM›À0‡˙êB™\€„Àt‘8K€@zŽBĤ@F€˜&S `ËcbP-`'ĉӀĝ™{[”! ‘ eˆDh;ĴÏVŠEX0fKÄ9Ĝ-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+ç*x™²<ı$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóŭxÎÎÎ6Žĥ_-êż˙"bbŝċÏĞp@át~Ñŝ,/³€;€mŝ˘%îh^  u÷‹f²@µ éÚWópĝ~<ß5°j>{‘-¨]cöK'XtÀâ÷òğoÁÔ(€hƒáÏw˙ï?ŭG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)Ĵ‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(ĵ AÈa!ڈbŠX#Ž™…ĝ!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fş‘;È2‚ü†ĵG1”²Q=Ô µCı¨7„F˘ dt1š ›r´=Œ6ĦçĞhڏ>CÇ0Àè3Äl0.ĈBħ8, “cËħ"Ĵ ĞĈ°VĴğ‰ġcÏħwEÀ 6wB aAHXLXNĜH¨ $4Ú 7 „QÂ'"“¨K´&şùÄb21‡XH,#֏/{ˆCÄ7$‰C2'ıIħ¤TÒÒFÒnR#é,İ›4H#“ÉÚdk²9”, +ȅäää3ää!ò[ b@q¤ĝSâ(RÊjJċċ4ċe˜2AU£šRŬ¨ĦT5ZB­ĦĥRŻQ‡¨4uš9̓IK­˘•Óhh÷iŻètşŬ•N—WÒËéGè—èôw †ƒÇˆg(›gwݘLĤӋÇT071ë˜ç™™oUX*ĥ*|‘Ê •J•&•*/TİŞĤŞŜŞ UóUËTİ^S}FU3Sİ Ô–ĞUޝPëSSgİ;¨‡Şg¨oT?¤~Yŭ‰YLOC¤Q ħ_ĵĈ c³x,!k Іu5Ä&ħÍÙ|v*ğ˜ŭğ‹=ŞİĦ9C3J3W³Ró”f?˜qĝœtN ç(§—ó~ŠŜï)â)Ĥ4Lı1e\kŞ–—–XĞHĞQĞGë½6í§Ĥ½EğYûAÇJ'\'GgÎçSÙSŬ§ §M=:ġ.ŞkĦğDwżn§î˜ž^€žLo§Ŝy½çú}/ŭTŭmú§ġG X³ $Û Î<Ċ5qo</ÇÛñQC]@Ca•a—á„‘ıÑ<£ĠFFŒiĈ\$mĈmĈ£&&!&KMêMîšRMıĤ)Ĥ;L;LÇÍÌ͢Í֙5›=1×2ç›ç›×›ß·`ZxZ,ĥ¨ĥ¸eI²äZĤYîĥĵn…Z9YXUZ]³F­­%Öğ­ğ§§ıN“NОÖg°ñĥÉĥİ·°ċĜÛĥmĥ}agbg·Ċ“}ş}ŭ= ‡ÙĞZ~s´r:V:ŜšÎœî?}Ċô–é/gXÏÏĜ3ĥË)ÄiS›ÓGggısƒóˆ‹‰K‚Ë.—>.›ĈŬȽäJtġq]ázÒġ›³›Âí¨ÛŻî6îiî‡ÜŸÌ4Ÿ)žY3sÈCàQċÑ? Ÿ•0kßĴ~OCOgµç#/c/‘W­×°·wŞ÷aï>ö>rŸ><7Ŝ2ŜY_Ì7À·È·ËOož_…ßC#˙d˙z˙ѧ€%g‰A[ûĝz|!żŽ?:Ûeö²ÙíAŒ ıAA‚­‚ċÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖaĉa‹~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DŜ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ĉ.fYÌĠXXIlK9.*6nlßüíó‡ââ {˜/È]pyĦÎÂô…§İ.,:–@LˆN8”A*¨Œ%òw%Ž yÂÂg"/Ñ6шĜC\*NòH*Mz’ì‘ĵ5y$Ċ3,ċı„'ݐĵL LŬ›:žšv m2=:½1ƒ’‘qBŞ!M“ĥgêgĉfvËĴe…²ŝĊn‹·/•Ék³ĴY- ĥBĤèTZ(×*²geWfżÍ‰Ê9–Ğž+Íí̳Êې7œïŸ˙íÂá’ĥ†KW-Xĉ½Ĵj9²‰ŠÛ—Ĝ(Üxċ‡oÊż™Ü”´İĞÄıdÏfÒféĉŜ-ž[–Ş—ĉ—n ÙÚ´ ßV´íġöEÛ/—Í(ÛğƒĥCı£ż<¸ĵe§ÉÎÍ;?T¤TôTúT6îÒŬµa×ĝnÑî{ĵö4ìĠÛ[ĵ÷ŭ>ÉÛUUMĠfĠeûIû³÷?‰Şéĝ–ûm]­NmqíÇÒŭ#ĥ×ıÔĠÒ=TRÖ+ëGÇŝïw- 6 UœĈâ#pDyäé÷ ß÷ :ÚvŒ{ĴáÓvg/jBšòšF›Sšû[b[şOÌ>ÑÖêŜzüGÛœ499â?rŭéü§CÏdÏ&žŝ˘ŝË/~ĝĠë×ÎјÑĦ—ò—“żm|ŭêÀëŻÛĈÂĈÉx31^ôVûíÁwÜwï£ßOä| (˙hùħġS§û“““˙˜óüc3-Û cHRMz%€ƒù˙€éu0ê`:˜o’_ĊFâIDATxÚìŭù“dÙuß ~ï½oñ5ÖÜ·ŞÊÚ7 @À]$ARl‰T‹b‹šĉ¤ž 5=Ö-i43@›µÉlĥžžnkMK£î‘8 EŠ AğPûWVîKdĴîoż÷žùáŬçŝŜóçKdfĦ²Şî1‹Š¨ˆH÷ûyçœïùFD°a† 6Ŝë`H6lĜ°aɆ 6lĜ°@²a† H6lĜ°a†’ 6lĜ°@²a† 6,lĜ°a†’ 6lĜ°ad† 6,lĜ°a† $6lĜ°ad† 6lX Ù°a† $6lĜ°aɆ 6lX Ù°a† H6lĜ°aɆ 6lĜ°@²a† H6lĜ°a†’ 6lĜ°@²a† 6,lĜ°a†’ 6lĜ°ad† 6,lĜ°a† $6lĜ°ad† 6lX Ù°a† $6lĜ°aɆ 6lX Ù°a† H;˜ŭ‹Ĝx_½~ĝ{Ċg]‹ZBadĈ­ƒÏÂçˆ}8mX M†s;Ŭ™ßĝß°Ï0·M|ñ‹_Ü„Ĝ>€JÏy '6nG Ù°ñ>Ñ³úsżŝÏÔ=ù„8§\×=Ŝn·×—––zËËËŜúúş[O“ÏBɆ’ jÚÌ44~œ$ ¤”œ1ĈµÖ­+/=wnıĠêEżú{˙ĝ˜â´çy'ÛíöÁ•••ŜÒҒßï÷ñY?ÇBɆ’ îL¨éó`¤iŠ4MµRŠ‘O|íÂN*•è÷W˘ßüßŝ=ĥz£Bˆ{Z­Ö‰N§s`uuµğ²²â÷z½iċ;nĦdɆ ó T˙‡d€¤ˆˆš];ż‘( m}9ü­?ĝMŜ[ŝˆ8÷ú²ÛíŻö–——ŭn·ëLÇô“…’ $6>äYRcŸ‡ˆXZJ™j­"’táí6¤"ô[Šë~·ğş{ïû'z½ŜúÊÊJwyyÙït:Îٞ’ $6l, +–Ĥ)‚ PQI)e˘”ŠĠËOï:-"o98u×éì·ŝáœN÷QÏóîn·ÛÇúŭŝÚòòr§ßï{는ĉÉBÉĈ>ì`Ĵ sàƒ)í(ŠEQÚëġ­ġÎĵrħ RÇïzG=Á8–xpġċßĝżâŝ›˙‹""i­ADŒˆĜöövše™  ”Èĵé†ûTšµ³6l†dĈ‡ FġϏÇħŽ˘HfYI)#"ċsšiĤħĉ0|䣏­gżöûżâşîƒžçŬŬétŽ÷z½ĠċċċÎÊʊo2%Q˔¸Í”lĜ Ɇ  eLY–ħ(ŠTÇYğŬ´ÖƒìÍ/³;Z'"%ĈpúħO:‡żì~é_É”@DLk½CDlgg'•RYJ“Í”lX Ù°acjĈ4ÊV˘(˘8Ž“4M#×u÷œ—Ÿx›˙Ìo>̈˜"‚– Àq_€ê³ÇΓúeïÏ˙eQ²1AÇħށJ6,lĜ°Q†êòY2eğX)¨ÍkĜğ ŭC–p"0¤8ċ;p>ŭÓÇ/öËô§˙ïB­ÇÍ{FD @ÇħĴeIJ6,lĜ°1˘Êç”RH’D%I’´ÛíĦÖz7;ûúîîꑎρÀ ˆ •ĈݎƒÖ§úĝ[Âùüñ?& '"&„(1ÊBɆ’ 6f‰`RJDQ¤Ò4M¤”Ħ”r ^î|öĜO%€s@é<Ġa JŽùŬŸĝÜї9˙ÂŜ˙_ÜdIĵFD,IÙ˘&ž…’ $6>AĤ‘ÓpÀ/qSE2MÓĜ÷ŭĦ~…w2-Zp01Ĥˆ"¸ bX?ŝ“Ÿ;ò}!~uûßŝ7 @&pÎìííĦ%”àÄÀTżÏJ6,lĜĝ°eJY–Q’$2˲H)5Ȓx'ıxfßuï²#C"0pp<ÎSŸù݃ßfü [˙ĉ˙Îó$ŠqĈ7€:Ž‚ È TUxEf4ĤĥL6,lĜĝ`ÂhôħRŠâ8–I’dJğò­—6wOŜ½|ÀyŞ˘ šshÓ‰ğ ᳟ùɃßqĵ/\û×˙ĵ\şŒ1Ĉ9 0i[gm φ’ ï à,&E‘Ž8Ͳ,”Rġϝ—ŸûµÓ`ĉ&9CĤ šħ|–òÌ ‚ƒ$á'>ŭÉġïù˙ċŻ^ŭW˙ÜCŝ˘È”8çHÓ43³JMP*JxJ6,lĜĝ€Âi^?‰€”R'I’iK)‡Ù…·/%{ğ[[rà È(^”î8c` 1 SĝÌÇ[ùž˙ùÒżĝŻ\Ĉvœ˘|g2Á`0`Q%(1Ħ:˜`ĦdŭÖ:Ȇ›ĤµĤ8޳Ñ<’Rğêüëğ!c ($i(Àu~UÈÁ 3O=|˙ĝï˙˙šżvc­VëŝN§sÇòòòĦ~żżÔï÷ŭvğí9Ž j54˜°VC6,lĜĝ@eKԐ=B)…,Ët’$EÙn/{ëĊkĦ˘Qƒ‡ ‘i@j™œ…ħ\à @”$|òž;:'ïŸŭ|ûèİO´Z­ûşŬîËËËG–——W–––ÚívÛu§É)ÜBÉĈû:lÉΆ 4JżËaÓ@TŽ,ËT’$‰)Û ²7^8úÁe œƒ)†Xi´9‡"MyšbÈKyR>q×ħû½úù ˙âżòĜ…·cLpÎı‚sΣ ’†žÒŭïŠßß> lX Ù°qûfEÓĠ˜9I))MSe2¤ ÛŜ¸_ğê'şZċŠ:H5Aj@3ó€C ‰>~dŬsŝÓü™s˙êŸûìíWĈ˜E_I ²$I²hÎZc1ñûĜ’ $6nOĦ–MÌQñ˙J)J’DĤišJ)CԞ~çí#'ğ˜ )XmA p9À@&MÊo‰1‚ÏRİñ‘ƒ+Žóğ˙ûOžŭ˙Í^xÜ+AÉBp!DP Ġµ÷M“;Ĝ°@²a} ¨òÁMS ­5I)ešĤ‰É’Ù;Ż^M>ñóÇı`P*ŸAŠˆU>çPš‹ĵ4şYʘÇRñÀJOˆßüû[^ëî}çÏ]Ĉ˜Ë9wMéŽ3Ĉ‚ ’9´VnɆ÷ yĤ÷‘ÔyJÓ´6DRÊĦ|ŭı³i–|ž/Ĉ­ ħ"´8 9à”¤1“rN¸RİqÏR‹‰_úï;żr ³ŭċ2Ĉ<ÓSrÏ*1"bµY–…‡}VĜ°@²aöɎšJwMŠ;òy¤4M‹-²LÓvñ½èžĴz y‰€HÚBӀËù¸YU™~"0Ĉàs Q„“ž€ĝñŸ=!Vüêĉ˙÷˙úċ"SÊuBpÎ÷ÌĴR&T˜oÊ 4÷ÊlĥdɆÛDh€Q=+˘Ú÷Ck­“$É ù·Rjž}}'ĵë‘U×áùwr Óȳ$‘ÌyuƒF·ž×ï\ˆG<Î£_£óOżpŭ_˙×]ìlyŒ1sî:Ž9ç!D4Ó <†éxĥ„g= ;‡dĈb€j‚PcO)Ë2•eY"Œ¤”ùòSçbMi£*BĴ4RóÙ¤âF¨ùê™+È>~ôÁûû‡ï˙ü‹ícwüXĞĠz ÛíŜĠï÷ĴĴĴ.//w—––üVĞċ˜[˜5³T@ÉÎ+Ù°’ ·yë#̈́’RJçHi(ÊkÑŜfÌh)#ïÖ( Ēà1‚ËÁĜˆ?TÎkJyŒkĤiIxôäQ˙Ċżû?wíßŝßzìÌ+>cÌgŒyBˆ‘OÁKb‡&^S Òö•lX Ù°q›eE¨â`rßPSµÖišfY–ĊFm·Ğ.ĵ1ÌjqÓËŬ"Ñ žfpœ57t¨ÈVG´R"ÍeğY}¤úÇ:Ë2i„ A–eì•'ϧżôğhÎ81ž/í#‚H‚Ïf<·ŞNŽİTüÁò}JÄ"M8"8c?wœ:ñ…Ŭ˙ßóMĥğĠBĝBÏq!„Ĝs]7 0X6dzFnħĝĵRñXÙgŒ $6Ŝ› iVİ"lHóş]˘” ²`°)Ż Ùİğ{ZċŽßŒ1"$Œi‚ÔİîŒV&M܉QèÜ!Üb€á€ÑğûĦUŝ÷ŝÙ/ì}ñ˙ħÂÎżÙĉœûBרĥ…ĴÔWb˜ì+Óç•&îŽÍ–lX Ù°ñ²̀ÒÈÜ;˲,MÓ8˲ĦÖz/=÷úŜî‘ğz=0$R dši ‡spjî½à0€ÀàCçB î:r¸}ö·˙‹ÏˆżĝW£×fŒµc“§JÛFìÀÂ0Ìì+Ùž $6nC8Í͎`„ Y–l„²,ÊWŸ˜ŝèσĊ@ H"dÈ4ƒĞsżU΍ïj½ òÇD 8‘) H5wڂ˙òú÷‰•ÁW˙ëœó–É–ôÊÀuŝ£‰10nRšĤü8càA; $óÂànŞ \޵˙Ô˙èżrŭßŭwóËg{œóĥ8-Çqşğh aŝâ?›-Ù°@²a]ȊÊs% ˜’!ÊvĤgYH)÷äٗwĠúçAê‘OBŜG"(#ŬV:ߕÄ`š˜;ŒîB=G)FhóG><ë™5éDùżÙK5ö2ġ#§zìïüÏï~ġ>4|öۏsÎğœób˜v‹s>X „7Ë °òpH6lĵëpšf#TÚÈż³,Ëb)e˜eÙ@ùܕä£?uÈci Ĉ”Ë{HœsĦ‚gdìıFáµcž!—k–{äù‚ċ}&—a(5z/úżôğñOŜshçË˙ú›ċž8£^†Yġ^9D°m φ’ ·”>û³šPÚÁô‘’$I _ğô.JҏxpHçM#E ’Ħ)φxŝ1 ˆƒVŞìhJçDħh‚Èe T8IÂv˘+ŝäïèé_Ùüw˙íqċ\πİċşî5Çqv\× „Iİ„WŜD˧<M†Í–lX Ù°që3¤ısH¤Š>RħÖ\%ñVzñí wâîÊr·T 5 8 ‰ ˆċ~wşĜoNŒA³TŒœ•–16şg&ċ+ĤjĉE`‚„ĦÖH5aŭàħ.ûüıÁ×ŝ͑ÁÓßüžRWqÙóĵ-×uŽÄ5/ĵúŠtĜlɆ’ ?ĦáŠó dÊvišĤq‘%é·_ÜNNÜÛç"—vċë(”&H³‰™mħŒQžĠP#"“-ƒQ{²%óO&î5g'G<°ĵo%€aF¸˘$V[-Ñûùßy¸uâŜ›ñ/˙ƒ%!D×uŬËF…·û~X<¨˜èF³% &H6lÜœĉeG£,IJ)kCeÙ ;óâeù™_?ċi ­ÀÈlĠDù›ÎċŜšçCàÌ;äxĴè%Q< Š$)ß ƒËó}èÌċ`Rƒ; ׇz-G>u¸}Ç}ż´ñ'˙ŭħèìkO !ú%yĝĥçyZĥTî+í7[Ş€ÉBÉɆ ³èskl„T–eI–e‘Rj ÎżuY†ğ™×”¤ĴdN4Ó9ÄĜHÀ`‚š ˆ*àÊ^†ŽÏ™÷‘Ÿ>qää½żĥùg˙â qéç…=SĈğĉşîöp8rÎ8ŽÓ8Ž•Í–lX Ù°ñ.FCv4Ë6˜t1@ÙŭÛĜíÉsŻm&÷}bs-ĤÈ8xŞ€‡9™)Ó+²#2:|İŻA‡ İXtži1“)1‘˙{‡\Ĥ0L5N8¸~²·ŝ·ŝñg“§ŝüÔÖ·˙ô;Bˆe!DÏqœËënşğA(„H“$Qû̖š@o³% $6lLĤ€‡-˜Mdnl—dYeY6L_}ê|ò3ż}§4#ÒnÂ4ĊGÂ|Td>y+Ȕĉ™LÉxßb†Ò1ßĤ\g$䜁ëĵìÇ9‡C@ . 4–Ú.÷>ù…ğŸ~ôàĈ—ŝ‡ÇĊĠ‹KBˆ8àaÛ÷ŭáŜŜ^²Ïl 3ànÁddĈ‡:ó€jo¨}<ë°%ċKd³HJÈŬÍMyŭ|Ô:tĵ£‰é\A—Ï™SœôXU#G>‡D>#@›QY^dVtݔʊ<ĈLyÏ8‹3ÎÁUgI(7Ó ­5ŽıkéÀßù?üLĝ?ıcçù]Îù²8ç\×íxž·é8ÎnĦçyY†rْ-Ù°@²aĦ³Ï7ha@i­Éô‘#˙ŜÓ^ÄOuàaûü|Ó×gˆ-(Ĥµ.–öEÙNžyùŞóħŸ9Ì ´‘hOœĜn2§L*`É@ŝ7t!‘„ĠxEU˙Ċ ûğïcsV~µ·™Y’RŠ’$ïHJ’]~ù uúá%HWFċ])§Q)‘ 0]Hż€p–†Š›ldÖʊ’ß\Lc´°¸Üœùš¸¸ÈoCP'Oa Ħ]Žw>ĵvĝïŝŸ~.üŝŸŜzüËßBĴ:ŽsÁóĵ˞çmùżşn8"*<ñf-˙[¤ŒgÁddĈûncŜżŸ¤âcÑy#`\)™G*ŒâW~pŸŭµ“P äT:uK€2žwĴ0S­xĜħÒÇyĈ¤‹lˆħÑç‹ÒÑX‡Q–UòÌ+Ôy{ëqÁ1EpÜ|½…G@dpŽc맖Ö˙ÖùYùÒ7îÙĝú}G$ñšâ‚ëş—=ÏÛhµZğa5ÑŬ`Ż+›-Y Ù°qÓÙÏ­(ÍúžE>?ï{Ĝ 1!„À]×ucçœ !\çÜàrÎ]Ĉ˜+„}ßosÎ=ĈW×/El¸•¸½Ÿ²<Óa…·]ùL-­=Ê]ÀÇ`ÉgЍ&M4re(<î`€cì…Xžwi“10Òlœ‘˙žù˙:”+¸ÀTn9ä‚àe‘"\ÙÉàyœwú™“wœŝèŻm~_ĵŝì³ĤŒwшĥ}ßß Îp8,ŻĥXÄ‚ÉɆw=ûÙnHlÁŻs]—kµZ\Á8çÜu]ÎÂá8Ž "‡1ĉrÎcÌ­żĝœsÏqœvğ½ĉ8NŸ1ĉ§WÎ%K÷­ù)Ó`,Ÿ÷j0*BçÙQıD£>+Êt4†LŜg*¤à…j/˙7€â…a+£‘ÑĜÄuüH1žË…g`pD‰ÄfĈÁğÚK_ĝŸX;˙âéK_ŝ˙<žl_(ñ.ùżáûŝ´2^y|9sbLà3Äŝlüt³Y¤÷3ïßL½-Çq¸8Ì÷}Î9çžç1×uÇq¸‚3Ĉ„ëşœsî!!„`Œ9&û6N<ċ÷Œ1ˆ|Ĉ˜ÀeŒùœóëşkŽġ}˙èÉOŭôÚŬżô;ÇÎí@–{Ú/M"ÊOĉÑrXšXËFe·ĵÇ3’¤16R1ĤÁL½Ž³ħCn;”ˆħ<£*†k‹žRF&´ı/šòġë™&¤’0Ì4¤qdمĞR>ŭ•³ßŝÓïfYv.˲‹iš^N’d3Š˘Ŭáp8‚ 0KÓTfYĤ19·4Ëa½œaaÊç,˜,lXŬ’ ĉ†Áş.Bpß÷ıëşÂüżp]W!×uıBpÎ]ÇqçÜċœ;Ċ{“ù8Œ1ÏĵwLĈS΀\x<Ĉ˜Çóxœsß|żÇóŸ÷`§Û[Z=rĴ×íŻ8‡OŜѧî?·ƒ •69ŒVRŬ4qÄVóVŝ¨l–;3—`„ñ0-/܍@ċĦ\Vŭù…Í‘&‚R€d@–iĊ2†Hj„:şèĈ›áġŻŭÏ/ Ŝzñù4MÏ0]‹x3 ½0 ’ ÒZİY@²`²@²atÓÍ~§2çş./Êkžçq×uıçyEeÍ)}ì™LÇ5َ_ôw8çpĵÒç}SjsÍç ¸%ĝŒ1ïôcŸ8LDŜñğï[g'zÜlġà!Ÿ —÷–—<ĉxL)BĴ J˜& ĞÄĊA ­)ßĞK"%”ĉ’h<§Ä YU%ĞÉKvA§”ùÀĴŻ0â…Kò,Š(Ù+ùèiXı”Xìr’dJ#5YSœ"ĈjK|‡Aœ{ŝú•ŻŭáSáġËŻ›ŒéršĤ×£(ڊ˘h0Á`P^HS²% & $"Ŭht³°™–ġLd<ĉ½8ŽkÀşëpÎ=!„ó„EıÌBx&Ûñ´ŠÏĜ´cù\‹1Ö>pç=şĞн'î\u\Ç?xüdÏuñĠ'¤”ç²,ğ”eÙĠ8Ž7£(Ú ‚ 0š!|°`²@²ñ.ĊíG>½h?gĉç\×ċàû(Jnë:žçıï;B×q×qÏ@È眷8ç-!„ÏksÎÛĊû"ğ1Ÿët–W—×Nœ\?xÇŬ{.ġÖµ–V×½ŝᣝTêüàT18œ!’yV“™²“`ıK(œ jM~҉Mg;Ċ‰¨4ċPb ’Ré|ù^!ùĉXMUĉRKvE†T€¨ £ÑÉ[Ĵ-gÚ(J6ClÜ˙e=…+LÉÎ( „J™ÑTµŒİ•JDĠ2^ž-”RMHAH$H…T0x‚£çsôÂ+kßĝg^~)˲óĤŒw-I’­(Šv0 †a\>ĵ+`²p²@²qûCˆí3™  >ï ×u×u]Ïó„ëşPž2€Ú&Ëéàt tşŽôVŽ?tèîûġ^Y9t¸·|ĝxğ³şî‹vËQ*‡‹" ĵw3È4BEfcj‡ÎÇSE™+·ßĤZĊĴ /g+EÉMihäċ+İ)‡“$p M™N}ŠĈP+Ju£ş¤ĵ+§4j'äßĉĦ ÌïV2˜E…‹CÑWBıτÊ÷°‰Œİö$2÷İ€lÄӐR­JBD„L0Ĵvt]qċ•ÍËßü£çƒKg_‘R^0`ڌx+Š˘½\÷0ĦÈğU`²Y“’÷¨·ŸaE€4 FÌu]ĉûhµZŽïûÜó<×+…)µùBˆVñq)é˜Ĵ§ë !zŒħŜÑû:zÎӇÖNœZ]=r˘³|ĝXž'b•7Ġ5!!‡N–g%Ħ„0 êÌ.Jق(OœjäVÚ4ŝ@ƒ.ŒŞGY~çAGçPÊÒş”= Rž“”÷tiƒl‘‘ùZiİtÔêŞ+U{F–Ĉb6ê=•!SϚFKG%żq鯀Ġèó@eI JUE]”!ADÈdŒ‘BIP>ÇÁ‹žÊÎ<³qékĝd²sŭMSĈğœeÙFE;qï…a…aA ÷ Ĥ:”,˜,lܚך•MPĦxëvğÂu]ÑjµÇqœvğíşë;Ž{žç !ÚBˆ8"Ó1éšÏġĵvgéȽ;pÇéƒë'N.Ż?Ġé<ÒVÄXŞ RBEĜJ4"#pF†˘9tFWû&càܘ”–*Í[RĊ´TNÇ(—Ôô¸GdúOş”%iSĈÊA„Ò÷ĉe;­ÇYÖĝ=M”ĈÂ=ÚËÊJwğòÇ*;{óF—+@2‹GcUÑŻ•Ì÷1p³b}dqÄʏU~Ħ UŝûËB•—i$ˆDš@.ǁƒŽ:}ġ;—/}ûOŸH‡ğgŠŝRšĤד$َxP€) ,Iµ ˜0™`²p²@²ñ˄ĉ}nJE˙§Óé8€ŠŜëşëş-ÇqZŽ´9çóË9ïqÎûĉ}sŜ_>|ôÀĦğî=²~êÎġġc'{+Gu[kë”@bà3T„D!VùÁç8ĊU;UñĴ ”]I%4U/™ëMÔÔô²)ߌŠÎ€G›lGé2œŠM¤ Œ+ë Ĝè|4éÜDµ”5½Ŭ„›—ïW DÉwİìV ͲȋYmhĥžMñX­ĴG…Ûċ΀1‚-~'Ï.)óÁZ"¤ ˆD`Xî8Xİ ŸùêùĞß˙òS2‰Ï0]3`Ú)ƒil9ÏÉĈğ˘[ĦyYs]—9ŽMż§ –çy-!„ï8N[Ñ5YPsŜBZòZíµ;>òñ;=Ñġ“wöú‡ŽuE𤊐hBfTlğ)!Ġı´ÙÁa LSŜÑĠ+ü"Y7)$o ƒ3U;žzɍ"j8–Ĉ'˜)µÒg]‚‘ù|ÑÜ>Ï$éQ™Ż £q”C˘b3ç¨ÖM÷#7ïqĤBĜÒnħŽĠDµŝ+eM£˙—9'ÄĴŞĉC]2úŬ€–€!ËòżwÊaFH8ƒpúmu‘d{Ï~íì•ï˙ċÓ2‰Ï™2ŜĠ4M7eÁdd‡X’ğ‰ÚíĥyžÛjµĵ@Ž´L #„è2~m}!Ärğż´vêяŬuäž>}woùĜݞ$°XBİħÒ*_qàpÀ)ıM;,7ö‚וmù@èèÈİj£'Kk5ŜĴ/ ~r%œd&ßJ%ĵ<RE&¤1VĦÑĜ•AW²#i“=ÑF„R˙Š&aTvo(ܽóĴ‘Fb„ñœU³&Œ{L#•]ÉËNp6iyÎQÊĤF_+†l16i­ÛĈ2w…\ô‘fİQĉEDˆ4àġ\,;À ‹ÒŬçvöÊù”ÊÒóY–]1`Ú2`Ú 0 ‚ I’DÖäâġ![ì³Ï4 XNH6ÂŝV&ì BNÇ)ĉZ­–ßjµ|ÏóŠ,¨[ĵ•ÔcŒ- !–:ËĞN=úĜGîı˙á;ïî­?ĠËH”ĈNĤħ‚Là2äk @ŒA W¸Á,‘›8 ĤĤToĞVŬšÓĝôŸüFš’4Vәò†}›â°ÍeŬyyŽ4 @£X5jôâ#û.ĉŽ#R4úyĠö—ù™eP—†f×ÙĦħğhĈ¨$TC…ĈiIÁËBn€Dù*ôĜJ€CaŜJĠßĦn(#‰—œ2Ĥ@”*$ hµô:+:LwžùĞw>ñWOĞ,½P¤”ד$ٍx1…IÓ"‡Κ,œ,l6´ż,¨ü9^.ĊµZ-ÑétüZÔq§ë8NOÑ7oˌħ%!ÄJomŭàİG;uĝžûıû~ïÑNF@&5v•Ĉf˘fùLk„òٞ\é–_Żò|‰ÀiÔohR²ĠáAġ˙ĦkGgÀˆĤ–é¨òïË £ÌĈ”êFYLÑG2@*zGZÑ((äŬEı€•úIşÈ Ì ™y14[Ü5]úyéĊ µ?< =Ê~v#ixħİ’%ħħ0Ä8R°œ eŸà9ĄùA…ÀĤô‡‘ô&½C€°2–*W䚐U.Ŭoµş-Ğ,HöžŭÚı+?ĝÊ3ҀIJı‘eÙ¨”EQhJyišĤŞÁ+oQ0Í˚lIÏÉfC ¨.Çĉ„L6äµZ-Ï÷ŭŽëşmÏó:Bˆ%“ -qΗ…+Bˆ•ÎòêĦÓ˙ÄŬGîıïħ{ZöV´$ċ;‰ÂVĤ)‚CeáAnYp³O§èo˜+V­²M~PïŬÔRšz­:F4·LG︲êM—ToŠ ëœÉ2[„gÄTdM@­\7.˙ƒµŸİG ĵê\R½Xŭ}ı9óÇkÏÇ*Ż0ŸX[ʆPrϽïŒŭGe‰£ÈŒP‘Œó’btûœUġżíh†É”9•"¤:_Ĵk ‘)Z]_`MÄÙîs߸xù‰Ż>›{g”W¤”× 0işEQAÇħL’¤I™Wî3óĠy6k²@² ‚2ìú[„Úíĥïy^Û÷ŭŽ8=ÇqúDˎ,3ĈV„ëïĵûÄŭŸüÉğŜ÷ÀÊÊw/ĊJ!UÀvĤħejŝ‚Xîl3tJ­F`µí5TVıéİgKMŻv˘G@0³2­ÉK`)ÛĈÒëÒ×jċ4]\áëÒç1.CéBMWÌ•`5ê!WÓĠûPı=•z/£r˘ù@OduA×"S*òAS.n(ÖTŒz?T]4”Ŭ¨2Ä*=£ħ,|œYħŞ(‚5È͉U%ĈR”ñcS¨ó9&#~ B †DÜĥƒ%cÍW*xíñ+—˙óg“Ŭ­3LY–mfYV€)ˆò´)‰XŬ`9NHĉ²Ü~³ĦĈžPQŽó}żc Ô7¸"ZBĴzíöĦğäS÷ÜñÈGŽ{‘Ö[ö"É(Db\ä[CrŸ7‚0{vŠƒŠŠÔ˘$<¨<ûĤ†*_§y)5ChZ™Žj0;òŒÁBċGÑ/BM W:4ːBɃ€ÊrUèP FŞVŝ##]ï·`üó£â÷+6Ž|¨XÀ7vr(‹ŠƒdFċ<˘ħÂbŜÊÀ¸ïTŞÀ¨ ÎF™TQúĞì`2?gbë^ݤIÈHCiB äCĥ0^yDpÛ=c½ÍTúö3—˙Ò áġK#0I)7³,ÛNÓt/I’aI™—ĤiŞ”Rşa'ÓĵĤy–DNHïKí·7TéĠûBï;­VËiµZN§ÓiµZ­ĥïû]×u{ë.­:޳Â9_ï,-ıçG?uï=?ö'œŻŸq!"lĤ [‰†Ô—3¸Ú(ßX#ÁrS^ZšCzL‚ ÂĴÒŞĞŞżM:ÔˀD(KÊ_+vQiŬNT͚ 8iLî.İİÏT†Š$SŽ3?GšÏö iL¸~Sé.%I£Y)*QhË1wV²Y•–ü%żş¨8•ŬXu°ĥ¤ĤĴ ħñ÷ÑħФ|䝇Òí—MakϗÜ|–* Ċ  b"Ä~Wtï'>}lċ{—b,ÒÀ…Pbhf\Ĉàè|&HP~u+¨ì6ı4n‚ _Ğš‘î@•W°gċ2ĠJqŻWށ%a@YµVΎt £^Ħ1“*2ŸÑN£ZfS1·§*%ż”#ÁÊ÷Ȑ¨ê+Q<”•v(ŭŬĈOĤ’“BÙÑĦì^ʌxáê€qfT6eĉÖùÄ mĠb ­úrÀ’H‚—~^}•úÈnˆIH#L4‚Hb/’ˆ%!UÉIFH9ƒ mOàĝĦ6޵IfgŸŜ¸úì7_ .żó–RêŞRjCJı)ÜN’d/I’aI—Ċqœ•Êy·"cš÷ ĝdOHïŒö ˘28ĤşŬ×n·ŭvğŬjµZEInĊqœ•BBˆC§}ìG?ûÓ÷{äk‰D 4.„ C™ğ]ğf.È!ÊĠpQ£“3M)ż•KaUFÑ/=ŞĞ·ĞŻàò˘ş’Ç•ÒTÂ*÷Œ&2#Şŭ[] Ĥ‰L¨Ŝ)ÀFşşŬU5zÏÑx=…ĤñĵJ›bQSìUÜhœ–²-P+–[ QùI5~PM>Qêû”=ïĜÈñĦ*</ú+›ħV7Ñĉƒ¸“ĤĴ̀J0Tüòr1U{V°Ĝ¤C&5âD#΢T˙|÷AQ>hi0.5Ĉ‘Ái \ñqׁܝ³;›ÏóÌÖËßIk}UJỳi+MÓŬ4M÷â8£(Šâ8N0”5éĝÍÀi‘žS#œ~7~cê!ŝĊ/~ħ)Ó²@² ZD •0vNpşŬÓn·½vğí·Z­çy=×u‹’ÜşÑÁO>òٟ}èžOŝÄQ˙À‘öP*\ŠóÙ ÁGq‚„Ù˙3Şí5öcê/#jìÑb…‰òMM½L•2`Ġò§şÖ𠌆ÌTëħT3#­ĞYj™OEú]ü›Ò°*JĞ‚İVÒ3_+2=Ú[”ĉŠ,m<[)˘ Ä&•÷1U¤rÙ é˘ÔF%;&FTšI—Ñ*J;`˘O4^uQ?Œ]Ş=£ħêȚPŝ^S,o DA+³˙ Ĵ²Q—zrĠı |Œ–*Ĉ’ =‡ğ´pÈ âà'^yúk/${[ç”R×LÖ´-ÜIÓteÙ0Ž(Š˘$Š˘´¤Óï"œĉ–öêp²@²qĞ3˘Ĉ²\§Óq:ŽÓn·[N§m@´dJrkBˆ5Çq !ŬûÉèáŸüü]î{xeÁw¤ÂĠD#‘ù| #Ï6u~^,Ó!špàİ„nzġLÑmSsvUÀcâĠYîŬPµüÖĤÚm4•ïʲUuM”ïÊÎĊĥÖâ3şœĠ E4ŝŝĤŜRñûèè i­ĞÙSI}7úT3¸ò}2 1Ĥí¤/ĞfMTż"b# ûrQDÙ^ˆJ úXe^i ²şáj `ĵ#PeCíèkĉJÓü/ÁJPdġê Ġ‹]ûH2B–jd ¤’rDç^~ÏÁ‰w­ı×^ÙĵöÌ×ßœí5ÔF&Ôv–eƒ,ˆI’„išFa&F!ƒ PF>L·'şU™ÓT0Y Y-2GtC *D Ŭn×ët:ˆúžç­¸[ô… !­=~ÇGĉ:ŭ‰Ofŭo ÎG{™†ıK‚'g£ĦJB3‹-şé1Fşì0P÷“Ó5 ”!SK½ÇSêGéZ)ħ’]QµŒ˜_Ύ×6P XE4M ¤V`İĵêYMÙÁeWo*9;TĠzUİùĝêtÒéĘ́ Ùf+¤òcÀKS9{*ËżË^xŒQİn\”á  T•v#AD}Ż’ä0£ŞˆQĴ§IĤĞ.âl ¸şTĵĦF<( B™Ç ¤™Bf U Ĝ&ĐÀ8ÇÑ><ÒA/½6Ü}ġñ‹Ï}ó,‰Żj­7”RÛJİ)ċn–e{Y– ˜˘8Ž“$I23x[¨ôĈOıƒÓÁ4˙dô!„Ñ-QğŬv:N˘ïû}ÏóV]×]Bt]÷ëyGüÉÏ=òO~ŝŽ•Ó÷-ïe×3Ğħ†Ö—<“ċÖ=Ĥbp‰ôԞMɌ‘.)Ŝ*ÀİeADU[X#¸gRΔʙKùĞçÊC´#ˆiL–çP˨ ÏŞLœj?{ÜŞgqy Ż 2x¨Ÿş#Ä~ş$ó˘RĞTĤ+?zʅ/ÁĥPĠà£ÊÊIV}Ò2ˆĈÂa£°âuuĈ°¨‰F™c*‡P”HdİŠĠb¤ê+ / ˘X§QíhVĉ˜ ×u ™"HŻŻÏ4!N0DRÀ-yaï½˘µ”ÚÔZo›Ìi7˲a–eA’$Ħ)ë pšeMt#2ò…ûNHĥ<·ïŝPDŭ~ż(Ë-ûżêşîÇq9Žs¤ż~àÎOüÊŻ?vï§?{$vZÎÔ8* •†G .#¸\8Ä xQ‚aĠ“jÎisŻhFe§˘êĦİ˰Ѩd6T%P5ĞİĴ ÔzF4ħwŻ*-Íèè*F˽ĦŠ%O=Ëj‚”Ùq4ĥĵÁD?k”qQîÏVžyÒz2˘Úï_Ü_]d‰ċ")3£Bnݧ\7—KŸlt[9]¸.ġ“Ìm39àİÒ*?ĦE°‘*Ϩ£Šrπ%IâT!ޤħ’*`W_}1FèšüÜ@³î*ŽÉu£_!~( ™Ê…‘bݐšŸĠ]òqlĊÇG:8ĜU2½ĝòĉĈĞOĵ³ġĈ³oh­Żk­7•RÛRÊ"sŭĤ$Iâ$IÒ ²(Šä>•z7³éÖÉfE ħ–/Jg¨çûŝŠÉˆ;|×Ŭ÷~â—~í‘cûā]-ĝ•TájB`Zç™oNÈW9°Ús”ꐙátt¸isšQ ô|ŞŠĥòĠ=j‡|á†P.ÓUç‰ê ı*4*ÙL)•é¨INeğj/kz QѤbċ~SİŸSŬsTdiÇ %ÙxàeCÍÑ\UUĠWk@¨ôFt.ıp²Ĥ’€Ħ<ğ4rv(•ĝŠĊˆxı8%qŞĊ¤ÇÖE|¤â£Iu+ıŽ—"JÊ;>~]V ŒŸrßm<Fı‰ĞÒÈtÜKċë/@ˆC–)ÀsÀÎ ½‡;tpߑ6Vĵ$ Ï<{ŭú+Oµ{îĠ3Ĥ¤·eÊzğRÊ])ċ MÓ I’˘¤—&I’EQ$o`ĝv”ĤëW->”YQÓûú€İ êvğíN§S€h̀èˆëşGïzìGù‘_ĝċÖïtuOŜ $6S—Ÿ.36>8ĵ€Í Í\û3ĠÔ2ìbMwşfż£GWġ4İ–#š(ÉQC&‚Rcşİ7ԘUMôƒ¨šŭhj„qù6ôDĉE?jĵ(ŻŜßßÈÈİTZÓzü8h]]%ĦkŸÇ‚0R ×Ñş ÜRŸˆŠtm³n 4|bv‰•ĴŞ =Ĥ‹$âœ2%q†0’šĈ›kËݸ@ÔËqeĞ£ñ-FÀqĉ6î'ħ¢b"ĤħFi£ŻTıGžÔ İfHS‰DI˘À‘[Ók¸¸+À=‹ğÖ}Üĵ‹žÚ‹gžğ~íċï½\9{V)UdN;Ĥç44oAšĤQ’GÇħŒXĤi޲,Ó fŻ‹¨öĉBÉé‘í·<7‚‘뺢Óé8Ŭn×ëġzíN§ÓmµZĞD‡ ˆŽŸŝĝ'ŭô_˙Í;Çïìïd„׆)ö$ĦÀ#Àùş`pŒb.ï Qu“ÍmÂìÖè„ÊĞĵ“§Ò'Ş^Á“½šJRg4e6¨*߈Ĉċ¤ —…ĈžQıßÔtÛşZ¤j)§ĝ5á(N•^P•v£Ór9ŝğŽ 5víž+Pġ÷ÓġžXİĤQ]ı^UŜMf£[U0•(U/HĜXìR€U ħ°Tc"MC‰0’ȤĴOÌFj½1¤ÊßSdġşRŽİ•^hĴZŞ+ï[*ħĵ#Ċ¤ dñĤ(ϔ¤Y(ó Ĉs{s­‘˙żà€àp}އ{tpÏĦ6ÚÙf°÷öó×^üÎkÑ֕ Ĥß´µŜQJí*Ô@JĤi™·$MÓ,Š˘,IE‘JÓtżC¸S/)->œYÑ˘òm·Ŭnğ½^ŻŬn·ğNgĊ÷ŭ5×u;ŽsÔuŬc§?ŝ‰|ê×ŝĉƒíwġ·¤Ĉ+ qFhœĞWb…Ü–…/Òi{}ĉ”âêrêâ Tċ+ŝ …Y­\UZ@(ƒê–]Ï*™“žRŠ+Ŝċ²Xe-ùôŞÛUu}‡RM>ÑOB #µ`}ŞŬ](Àd–e&Py×SÉŝG×Uċ^˜.Ç-_,”˙Úĉ¤§S#•’ VÜÏÒ|7żS]7ŝxZ’X" %’TK‚ĴšU R6z-|ëÊY’IßÊ˙EÖ?âeĠM´•²#ĞöPÊp×ÇYj%"(i,ˆL鎨 &´sx.ŝyŝÈn–20OÀġĴ/{¸÷pwĴùp‡÷g_ĜĜxċoÄ;×.іÖz[k½ĞµŜ“R”RC­ueY$ŒÒ4•RİqˆqĞ4MuÇzŝ’’ÍŠĤ‰£jïS ´ĥz½^ŻÓéô}ß_÷<ï°8ÇÇ9qúc?úȧ~ŭ7îž:½´™^¤%ĦóŒÈeĈMÁ¨œÄȞe|EKsÖ04Š¨ê40Úó\Ênš`MUàTÜjً&JPEiŞÖ£ĦÉ>×DYĴìZ€I5\}…M ŜRE„P͜¨TĉЁşŝı@µĦ[Şg:%8TK€ŒsR^cùħEiFŞüG-—iŜPs Ò#éżYÓËê˙րI;–gNI,E’HċYyÑlbÒ^EpPô€ô8 Ë?_ʂF÷£ )˘ħ€Ħú3J=£Z´üKŒ²m]vi'(#L‘Šòmµĉ }WFġb<yì1×É{ož O0:ĈƒGÚ8u°'¸:^xu{ó­çßÙ=÷Ê;D´IDœvµÖ­ġPk=TJEJİP)•dY–DQ”*² Ôîîn6ġ>Jwdd³"^îµZ-·×ëùĤ<·ÜjµÖ<Ï;ìşîQ×uOœxàáG>ó›żŭÑŝ]÷-_O /S 3B„c8òY"fzDµĠÎm#‡3#]ʆ*҆̇¨É {JfÔĝµ:0hB%W?Ë%ĵ&U6½RlPSĉWΐê~pşa(X2*Á z —gMu•URɨˆUޤk:*5ôĝj*E–ûP™Q£!ôÒĥŠF0İL!JÄamÒÜħ°ŬĊK€(—ü ċ^ŭŠÈò2]ġĊG£2"›Èì§ v&< K~…}Sy UİLToĤÒ8YĴ—Fݍ_ħɉ €y.À9\_`½ïáŜ£Üy …K²ĝʛÛÛg_¸´ùĉso¨$ĜZoюÖzÀRjWk=0ċ½a–eáŜŜ^Aĥµµ%§@ÉéC5AÓúCMċın·ÛYZZêùżĉûŝ!×uzžwréÀÁ{?˙ÛżûcG?öÉ;Ĝ ƒÛĦ‚knÊsfÓĤŞ6Û³Ĵâ¨ŜB @Ôüyš<¸u­ÄVö^›ĜdÚ`ĦS)~O¸.”…TWj(ÍĠ³zé°1›)âşÖŸŞßŸKt“˙]ġ1-~ÁÊêQš„FCTƒ5÷ĝtĠĥiċzFSWħ놌ĦžNXMWéIIH˘ a˜A&eİ^sŻ’ŞWo…QŞ.5jÀcċ;YRRYH³S˙rÖ^ÎÒË ğħ× ÍèP£“ü„µ}ñë°ñë‚9|Tf#o$ħ.8„+í88y ûġp¨ËHo_Ĝ µıuĉĊ·÷.½ñ&]×Z_3o›JİÍ$Iö‚ A\ż~=ŬÚÚR ”ï,> %ş}eE­VËéġznŻ×+Ês+ïô<ïˆçy'ĵvûô˙úo~êÁŸŭk'#áñvS\Jtž!ψ\ x"wÙ,ïñÊ yò`šMŞĵ4Ñd_G×,mŠĤ~튽Ò;*ŻĜ]ñW7ĴVK^M™äió ‰²QkYT125§wŭ\)ĥĵ˘RŽĴ^Eëú•5J0ŞY—î@ÓĴÒ(SÑh›•á5µ5mÖ]T€B3JpU9}ċĥĤ( ASú …uO”" $ÒXŽïCíPž<£ËMİ\fĴ%a4 £rö;íy^ŝÛÔ½§úÎZ]?F(5E› (µù‚RŒst.Š0 ĉ Üċ]ƒ}÷ëâÄz}‘¤ÙÎĞ{WŜ~y띞ĜıôĈKJİËI’l&I²3 ‚­­­äòċËrÁ^’Ò°D7 Hĵ–ÔsKKKŬN§³Ôn·˜òÜ ×uïĝÈçîÇ>ñëżużì­ĝo†Ŝ Ehs³|¨İĉDİ9<ġU/3•vóŒ”Y üj†3Voß_Ê(¨ip³Ħ·Tñ—£ê0i]˜0Qš*•K'ÑämYı§Kġ¨ú÷˘i‡PEŞNĠĈ[_ë÷CO”&ŭŠ˙Ó GE¨ġƒ²a˘µqÇԔŭRM˘†‰aMÓ-ĉžKBĤ‡)”Şù Ħ9C L˙Zó/[˙žÙ0Z(3˘i7adŽÒSJfU2ç̍ó\ĦW4ä\'75ÙS§ċâ芏ž—{]\ßn]ğrí…öŜ˙öè?ú³½½½áÖÖVĵ½½-0T‹”íng"9A7\˘‹fEŭ~żßn·×Z­ÖAÏóŽ{žwêàÉSŭôïüŜġï}xġB˘ÊVŒ(şh[Ÿ18ĉä”œ”ë‡Ïä!‡šĦ§i˜£> J‹äÊCyΨ|p—-rĤ•éF_kjîc Š‡]a?~M•]ĞÇ%6Ş” Qŝ}Ëj: äà]†*5½ê‰lŞÚĝŸL•ŝŒž< š²´ÉúiS–CSJ{ eCfTÎ+?fÜf)ÒT!¤ˆ#9 8 £JÖ3ħ˜Ğüù²4à8&-bcù8GÜÜċ`޲wpŭÊиrġè ş#ä۝N÷ıµµµż<è'OÄJ‘”yĥ†!Us÷gX -V˘[¸€Uƒ…ĤÉRšĤjö£ÍéŻv•ûš&KxMÙÉÄ×1vĈ.gFM몪;*™ŠŽÏUW˘ĠzSċŽ*C²tXOĜ éŞ<¸é ŸXô‡’ëıj.Í:”§ÀHW65ŜĉTž8ä Ç8’‡)dĤ›ûPvUöÀ£"i'*ù)nùœgı„“żz}1–‡ğ<ż›\Cï^FzñMÈ+/A]??ۋôü+ĞKŬ7:ŝŒ`8Ğ”şšeéĠ$I$Id’$j8ÖaTwï+HY -Ö/š%\¨dEívÛYZZ*zEkívû°çy'<Ïğóԏ>öÓżûû?ÂíJĵ$PŠg >gMiÎ-dÜe~°ĈÌhBÉVSÀ)Ş›–`„’“UËtEfTĴíRT颖•~MŞÛêŭ£ÉPŞô…tÚq]ıÍRiĴÖKġp¨Ŝ§Ä‡{ FZa\/ÓA7ŸXFÔ£‰5gF³`D }Ô‡)˘(·ñ™z›f5XıeTž.Mġ20/ŸXgŽÈ… R$w .żyġ5ÈĞŻ‚×ä²Ïö,÷6Ŭ½|Ĥ8o†h7µV[™Ö›Y–íoĵ8Ž,I$Iù^Ż3¤}iŸ0â PâXŻ×s;ŽÛï÷ğŭ~żßétĝÌuŬ;<Ï;ŭÙżŭğŸğïg~éäġŒĜ3ƒ ÛRׄZ`p9ƒGfĤ¨x3?–³†Á€Ş2j]³ëÑ%+š2*k F34z@ċl£²ŻĠ­Ê3ԆLËöBÙĠvùÔwÍö@ċٞşÊN×êŭ#çë†ê“U™) ô)²ù2ŒĤĦ6o^fÔ´}w‘n^!O$q†0H‘Ĉjŝm~aÔóĜä2]ÎÁ˽ù<`Ì)ÊsšèŬ W^…ĵú2Ôĉ9,ñt°ÚkíXé]\_êµŜ)Í"óH{Jİ@JY8:„q‡á0‹8 ‚@%I2mkíDévî!}¨´ñY%şvğíöû}ż×ëuúŭŝjĞĠ:âûŝ ß÷ï8rúžŝì˙â|Ê;~gï•aŠ7CL*t…@‹rñ‚ÇĈ}"a2}1şlâU/ei]Ŭ÷R\­ÁU!P_W-ËéJıŻî6ΘJF  eÂşpa\ 3<]…ÊH8QË6޳BĠ7Œ)iԆ^KöEÔtĉO{î7 šÎòöÓT- ˘#j8§M%—n‚¨93šŞŻÙ­ŭ Ñ0C$yfH°0Şßf-Ï`+‹ÒQÌ$ñĵ”O 3paf …Ŝ>‡ìò È.>1¸’è:;kKŬËŭ³‚ÑFŸòĴ‘Rjh fYeY'I’H)“8Ž3³:]ĤiZ€H[ }aÄf”é¸8˘×ëyKKK­~żßïvğëívûˆçywxžwúGŝÚ>ó£˙Ñoß·E‚?³“b#Ó`Z£  Í9ZFAç°b¨”r5Trš\Fp*íám&ĠUi2MYo0ŝšš Nôžj+$¨YM7‘Qíg–•z~’K•uuïQŬ T—K³MOıâZ6Јhê9ˆRĴ~V7šçĦŜ÷ĦİNceĈ`¤§ÚkVᗤ Q!‰ähÑä7—o³>d;r‰%„ÈŻŽf„Œç Ò ôö;ÈÎ?yéEÁċìPßŬ>´ştq­ß9#Ü-yÙAñVĜ%I§iš&I’*dE™ÙBĞQZ }¸`ÔĜ/ZZZòşŬnğßï/wğŬƒ­Vë¸çywġW×úċ˙ì}nùG×Ŝ ^fH¤†C@‡mäY‘Ïs—c‡aÄjI”$ÍÔ47Cyß\—Ş™œ-*—Ĉ;ytcéŻ\î+H—2#]‘IWTÏÂtÍ Ħä ­Ĥ‰JóLuĠš.=ëà*ŭ/Í Íğ]*Ż4Ŭ­vÖ6Ŝ`Dzv™>s‡Á0E–éݰ0Äê=#”M÷8 XÖŬwòĴ¨€$ôÎ;ÈÎ?ƒìҋ{—³Kŝö•ŝċĠ^ëmò½cÖPìŽßY–…RÊ(˲0MÓ8˲4I’$MS)”Zkİ”*CH7iU ¤ Œ8Ŝëġœvğí­ĴĴt{½Ŝj§Ó9ÜjµNzžw÷‰ûúĝ/ŝg˙è“ze½ġƒ—"5Zè8-ä *ĉŠgĈNj×_wT“lŞ 9T-4Ġ%ÛTċÙ"޽Ö{Fš&]´‹ŜR]0v²ž, µ-°´Ş•ßê;‹0))Żd<£ĊvSJcµƒ‹0ŬÇl‚K5avY§: ¤§ß—ÚbÀF€Ôĉ‚CŻSf˘0C0È •ž  £Ú狓@pcċm\%„‘µ‘t€ùjpòü³ÈÎ=s^îŠíCë+—ÚŜÙ„ö²,ÛͲlPĴ9ϲ,JÓ4̲,MÓ4Ͳ,‘R*)eĤµH5€hZİnš…ûbéC¤›…‘ëşÂóëe÷A‚Ñòòrgiiiİ×ëêt:'=ÏğçÀ‰Sŭê?ú'ŸĠk‡Û?H\5”ÌóŒ.€Ž|ä0rƒc`ÄjËóW<ÔKn•Ù!Ş*êôx9ۄ͏ĤjNOEĥS*Nñ¤Ó äŞYİq]÷èl*—ÂPÍDaş9ŞYÍ;œÊ=£9j³Ĥža: Ënàġ̈Ĥġݚ4E,7żLG=#™ĉı8’°µ0˘9²àîĉ5è@œ3°–â z Ò3ßCvá9,eÛ‡V/÷;ogYĥ•eÙvšĤğišÒ4$I24ĞÈB˜ TĤ'ç@gÑ·EËtM;‘ĴÛ÷ FËËËK½^ïHğŬ>ċyŜ½w<òÑOŝâ˙ú?˙ÔßsŸĜɰ•j(AŠwÚÌÀˆç0Ê3#T–“•+P=#]]FW^Ħ˟ÓÔà?G ŜtĊPĴž`­fH4T HİyŸÑÄÁ:RTÏıê ‰ĈrZf„™5\³žÇ œb›ÌŒhFϨ~PNuM¨'mÓ<ˆŒReĤ R$Ċ Ğ…Ñt•¤Şlĵ 0—eċ½!§T–#İäċ—½ó}Ġ×ÔámŸ8ĵŝ–'Ĝ4M·Ò4ŬNÓt7I’É†‚4M8Ž)ešeYĤµVJ)y  ÓT–k’zcّÒûFívÛ[[[ëôûŭċ^Żw¸ÓéÜáyŜ}÷}òÇògŝŝüÈEÉù3‰aŞ!ĦËL™Ž3¸Ĉ“ndÔp V†PK µÌ\ZSTsK ZϨ'ĠàĈ]vĈĤÚĞĈäĈVMĠŝTŭ°(ŻÖÖşĦÔÖtžL)ÓĤdF„¤Ŭ³ġ2ŬĴíİóì€ĤÙ΂QŬGŽt/*àÈR`XsT°0½’iŠS9í@/ÖÜòB™âs½uéù'{íàrttµwíj˙M­äF–e[I’Œ@Çq$I”ĤiœĤi’eY!LD¤ö ši_£`´Ÿ‘Òm¤†ÑÊÊJ{yyyßïi·Ûwúß}ŸŝÌO}ŝùżù虔ñgöRÄ*W7iEèq†CĤ3†F…½jëfH—Ôr(ÙéRoĤ"‚¨dMU)ö(ğ¤÷]ıï¤i²ÇC¨zÓU“’%*YÒä!rC™Ñ\i÷ôËÄs{ŽšnžyÓĠaD%C ùqI“<#JS5³'öĦ„k¸Íñkżĝ ‡ÏUrÄxËÉ=ċT uġU¤o?yùZçñî‰Cëçú-÷lšĤ›&ÚI’d7I’a DI–ei–eR)jZ.Ó>Ğ$7í&̈́QëÂéĥ€QŒQFFÀp¤ÓéÜċûŝŭŭÔOî'˙ŜßäLÂĝSğ)2MP݆"`I˜2cpLfČKwIÀ˘rĤ˘1–hëQż…*e8­Ğ. ZëŠĠO]Ú­KŞr/HëòĉTSÓĜQĠ[>´ZéßԚ@´ßÌHOfFYΔƒ‹SšŒRgÚĠ`´oşÉû‹}90ÈTa0H‘&ŞĦÜĝ!‡ĤÜfDœ pÔràyfDáä•ç‘ĵù=8[ogǖZ׏XyK€.m§işÇñÀ€(4 JÓ4MteíB4BÓĉŠš>žU޳@şKuóĉŒ&`´´´ÔZYY)`t§ïû>òÓ?˙ù˙ß䭘Ĝ³{)™â™2e:^dF€Ǹq6yÖ×{ûDF §ĞòhU¨R–T²ôÑR™.İïPúŜÊ2:{ËiŞc † žQépl²ži™–ŭèÙ˘: ¤Û¨o4 F ĈÓ´Óéx+++­ċ#Ŭn÷Nß÷xĝó?÷ùŸüğ˙#݇š=7”JCI‚T„6şbĵ>"ï“2sT04‚cG…ò`ĞFĠ!A—û;̧îg§+:ŞxĠ[=֗ĠŭîĈp4q)VŝMSŻ•˘†bFŸ§˜šîġ6ŭàšk”:cΨ|îM-ÓíkÎhŒj÷Ef…j.[xŸÑ‡FlÊߪ›‘o]eF´À8À|Ä$ÔÖÛH^ûÔùçô!7Ŝ>yäà_° ²Ün’${E(ŽQ6¤”RµlèŬ*ğĠĊ ‹ôˆèF²£ÛHÔ}HóJvċŜ‘ÀğŬÛï÷ŭ~żżÔï÷v:žçŬs×ÇìÓ?ñŸüŝ£oÄĞJdRCeùŜ@K.¸(§dT+AĦAŬVѨd76Ġ­Ş£2]á?7áĈ@“€+•݉ÊÀm ”•­İhZ^ĤŞ—ÌôĴ ùFŒ>Í xÓ͟3ŞeFġ͟³Ü ĤÊ4ù{MqíVÊÌ… [Y?ì0qcnjúDÜ,ıc^.߆#!Ż€ĝµo.½ Žµħyò΃Ż3R—Ò4ŬÚ ’í$Iv’$Ù3ÙPÇqlzCYC6´ßŒèF²žE4Ğ_4+;z_ÄHsúF˜•!ùï´ÛmŻßïwK ÷œ|èÑû™ż˙?zΤ$h™÷Œĝ pÉ(éÌLCžQiĜ C§ġáĠqö£kŞ•FNŜ5ÉĥFƒìğ˘j–4ı’j׺VNj)LšƒŜ¸€afŸfŒ{AsF /Ùy À\£Tš$ëto:“Ħ†A†(È*ŽèFÓÂIññ0+ ÌɕsÜs@Yyù%$o~ìÊ+ÙÉ%wĜ郯i™]I˘àz’ä 2ŭĦ ް$RÈnR¤0Ż˙3ÍkîF3ĦŭÀÈnŒ}KuÓ Ä§ôœn·ë.--u ŒŽù×Á;îúĜÏ˙˙âÓWà‰'wS$Yn‡ Z`ˆÁcIwq/4Ĥ'{FccÓú,QĠîGJv“Ĉİu xıôWö„ÓµaÑz_hÜ3˘ÉYÎò˙ë)™Ĉ´S­z†Nu`¨şR`0jêSMġĤkèĠ4ġŒ2Jm*ÓQs™Ž*˙îQ˜!2˘fpXU?,ż´ÍĞ–‰Dĵċ˜ğ#ğ’×qíĠôŽ•ÖĠ£w~MféĠ(^O’d+Ž8ŽĤGeıĞiR“l+,.ўV†[4óY@ûÑûFĒ]“ ajɈÜn·ÛévğНNç¨ïûwöVVŝ…?ĝ'?µívŬ'wRĒ@*‡™13àÍĈe:š|ĥäĥ>4Z7^еùŞvĤSSéŞ~ZMK†*x5 )™ÑtŬPϨfóCs`D í3Â>¤Ŭ³a” ½RêÙà°0—ĉLé›9š&J™QÛx yá$o|âÊ+é+ŝĠc÷y9KÓĞÁàz’$›qïEQ´Çñ0Š˘È¨ċäќÏĉ ŜS zżžçÎF˜£‰Xß÷]³íµßétĥZ­ïŸŝÑżùw~zŭGWßNħ“ä0ʍd§‘vóBnŠŞ1)¤i!TÀÈeĦş&"wS¨/Ì;2TĴ€J˙^™, Ĵ +ÀM†jC Ž×ÓàAµ^HóÁĤiĤ]v#Œn´gÔ0µˆ€aÚ>£Zf¤çô3NÔúĤ[†ƒšğ‚…Ñt•^ÊÜÈĥ50š%â-¤cȋÏ!yŭ›àW^ÎîXm]9z÷áWd–^EF†ážQÌĊY–%SúCûġÛOŸhżċ¸ŭBè˘ZÉnZİnŞC·Ûu{½^·ÛíĥÛícžçŬyïO~îÓŭÂŻ|1”¸+hEz<ŒÚ3YQŜ3"^Ĵ!+™Xx§ëRïŞ@AÀ”×:4ô›JV=euŬ¨òŞÌÒ+Áp°a2˘y R¸1ûžYY0ÛOn‘žMAˆ>`ƒ¤ï[ -èĈ(Ó7jwğŬċvğ}È÷ŭ“+GŽ=ú‰żŭ{9+öÚP‚4 5ċ†İT80ä. ù10aBµ²•­êöÖħrn”ŭ˜ž‡˘şĴğfzZŜúZZE kğ†t2é?×´fğÙħ€&ΠĤŻÑ”ˆhF™nC’ĤĴ ŸÙ3Âe:ÂܞQŒhËĦ8” ´ĤĊÀña‡à,!Ÿ'ßÉÍœGôÊ×ĦÎü@oëS§$³ôR DÛ J÷™-:Äz³ıŭB¨ùŭ;b2¤ĤR]ċÍ÷}§ÓéxŬn·×étĝÂuŬğ?óû˙'Rż%žÙHf ™$#™f`Dp9ƒSIğò ‡ĠfXĠyŸdjs?ÚĜİşBŽÊŜs ë!ê™JĞʲ…êËĦÑ=ğ~Ĥ” 3Jf´À>£2 8*§Ñ\ ÑbûŒê·ğ8ŒhĉĥÑêï%Ĉp7E–ÊÉg˘ĥ0ŞüMĜx¸ˆĴïóµċÛY;ÔŜd/ŭ¤o}—ÒÎöé;ż %/„ÁjÇ×8ŜŽ˘h/Š˘ĦQ<4W·ĝ™fùs³‚Ì)ÑMƒ‡. úÀİ!;ŞgB3GEİÛív;ÎŠïûG=Ïğëħ_˙­ÏĴœéğÛ)bİFJ4ƒÖ„–ÙeÄÁ Ì-ÒFTçAɏN×Up%—n"ÈâĵÔĠYÔ{F%DžħPiċ7MBAO,äıCÍiҍÌ5ލ™QtzĈ´ŝ”Ï7ÍÑô2Ŭ<QÓY1çĜPD‡ù<Ñhs ¨R¨şè0ŒFÎÛùĊËY93}#ĝ.Hĵúu$Ż~ KÁ…Á#ǽዃo'qt%ŽëQmFQ´†á`AMˆwVXd†X\˜`!ôΐueàë:ívğŬívûívû°ïû'Ü÷àGŝ•ż~ÇëC‰Ğ‰‚"6*ӑ&p.˽éŠÊBŬħ•g/M€DQÍŻÔĝĝ`Ħ×yLjL5ö dĤËi²yB° ¸òAĜâ󂁔ÎhÁA’@<R0Î@J}°`d~O6òmĉ9ıӂdW^Aòú×ÀÎ?—ŬµÒşxôž/Ċq|e0\3 Ú1 ái&ÌnD·bŽh-Ô²ú`eHó TGpjµZNŻ×k·Ûí•VĞuĜuŬ“˙Ò_˙ÔÒñ;şßŜN éÑ*7ĞÇóY£RO‡ċ‚o]˨]ƒ]egQe…•VDŒŭäô¨$§ĞĞÎëŻC² iwSïĤİ3ċìZ¸L§›ÚAzĤšnŒf•éĤ˙>´>£ĵŸÎFµIŬxÇW ¤á E4râfĊoÈĊa€ÌÈŬ”İ8ùŜ,ĉ •`€NUž)x HÀÈÔIs0ÑûFŒ“"ŽÜW ¸ÜDj÷,âgġÎôñ–şvòƒ/Ş,ğ´··w͔çĥ0Ü5C­qšĤİ™#’7 ˘ŭH¸X‚g!ô!҂ÙÑŒ<Ïs:Žßétzív{ÍuŬcŭƒ‡ï}ĝWŝĈéwB‰kFâM„Š;´3š7*ˆĈĞN³qŭìGVéĠ퍔uŞZÄBŒ|ït­Œ&"šsÍ6Ċ nŒÊF˘Sĵéö £FEß>Ët³`Ä'2˜2ŒXġÙTJ­˘X"d”7âY‘áž˙Qs@Ì$Fp8QĦ4#0Ÿƒ2 Öq¨,?¸)ÓĈ‹MŽ2İŒ˜ÙPéÜuóJ]ۅ !{ŭ;H^ŭ6¤íğOyZž‹‚àZÇQm…a8,?f5¸š˘iö?·BĴ`!d43;š—1ĴĠj9N§Ŭn·—}ß?äyŜİÇ~ëï~Rıžxa;†Ö€T”C c×ê|„QibMğ€hÒ/ŽjkĊkkÇu8áĜ²8aü=zÂmB­ÇŻşÙ3>‹—é&`D }Ħİ=#½œ‘ˆn=Œ8Jb 0Ö`g+¸Y>Hóż`à<—ĝ30!FÙ sŒtY1'˙0#kt4€Nö ĥB·Ħ·ċïw7AJÂżçÇá~Ì]Éwú’úŭ#“ ŽêB´@:/Ï b²³O!zé+ènż5|ĝÄĦ7|q­$Ż”@´kĴ~˘4MÓ,ËR"RZëyYÑ,şEüĉô ĝ܈,„>À@ŞeGóÌTG½#Ïóœvğíu:^ĞĠ:àşîħ>òя}rŭùA†HiH™C—êd.gcT=ŝ •ċmċ½?˜²ZBŻŞġ“ŞN Ġ7†5lc)˙@ÓÜrŝÜ2]FDġòۜžÑMĜézFuÑì9£:Œĝ"óKDĴzžr#Ÿ$F SÄħÊ˙ŝ>g<żH)JPĊ`ùc¤"P²…ló*äÖE¨íkPğ-¨á(HcÔó½XĤ;“zB¨vż—!~‰Ÿ_ùİSiĴŽéĉĞ·ŒXŭc³p…Ġܸó\°ĥ ıyÉË:ó}yïzûÜÁğŽ” ˘kq_7ıA†ĦQÎZkµµŜhݍ$ :Ì: HÀtùĥ͆l†´Ż ‰·Z-·ÓétZ­Ö²çy=Ï;ñ~ëÑ@‚½JhU~ñÏSg,wíf0›[Ù¨‡=êËPµ‚`4ú¸*Í#î‘7]Y ]É(Ş~?jĈ}ÀˆhŸ=£EVH,TN›q_‡^gÏ̈́+Áˆ™M&ò 'Ó{a^žmg¤háŽ) ÒÔöU¨­‹ÈžƒÜĵyŭ<ô` –iÛY×iżí‡ħïħÀ?è]ѵֲxÀ„m×uW‡–ú÷?²z÷½+ĝÊËۉzÁ¨xĊħü1ò•>÷tş‡ôĊï"~ċë8¤67Oßyĝ-ÓóƒÁàrEaîġ\˜$IT2>•S¤pc˘…Y%ş›.ËY}ˆ€4wԔU†`=ÏívÛk·ÛŬVеĉ8ÎÑ£ù‘GVï{pùɝRÚHĵuɎ™™£˘ÚS|‰2%šé²ÏÜÑi*ݟŻ@¨ˆ%ê’×(ĤgÓa4q{µï[F4eı^SϨiS|i7ÍŝŭfŬOV-ÁÜË3ÎÀ5A3Ĉ€Aœ!e|ÇPYµyr ÒKoB^}jû\§—'kw}wà·Ċ`iuíşÖ:1oİÖ:ÓZJé4Š• ÌĠ !\Ïó–Úív"„h8ŭH÷²90Î@ZŬ^0Şd“Ĵ\5òÓü~³–“˙ŻG×^@ôâWà]~!ŝèñƒŻwÜŻÇQp9Š˘kQ]p7 a’$q’$II9הŬ ²ÙÒ3£Ñ›ëşnğŬnµZ­%×uş{ì/ü™Î½ê´.•éĈÏ= ĵÄ>*¤D“ÏĤžÑÄĤ×JĉTw/M Ġ|fÄ2ÓE`41û£§˙ğY0š*`˜µĥa‘Ù˘‰žÍ˙ŭÊWê 2ı\|`ÎOž—×ĈVÒ8ó´ÒĜۋ!gœ{ ÙĊ· ·.ÂK‚´ç;ÑZÛú-oĞwli“£?TJĊZëX)k•Ĥ{{Q޵N•R™Ùħ#M#^i­uñŜìŜažçuşŬnĉ8NğŬ[ÊÚGOwÏżä˘­Ĥ8Şßf0bf˜Ÿ2/_–§ ÄÏ~òµïèS]uùĝŬǞOâĝÒ`\Ž˘èz…ËBÇql§ĴĦE2£ú€ëÎíĞ,g!d´hv4ʒ„˘Óé¸ívğçûŝšëş‡Ž}ü“/ŬqO˙ğ)H–Ö ”—³!Wóݽò³—MĥZ*ŜœeÖDPUú]ÈżQɨÊ+$hÒUĤ2ÔıŒˆf4f¸vÓ´ÁÖY=£YÛUçˆöíM7úêÎÌÌñèñıɄQ×½nJJZ# ĥ°ùĈ+ñ²óŻBo^Ö=Âġn+ì·üíŝá;JİH)*%p˜ÄJİX)•–Ŝ2””R Òĉ%"(ˆ „p{½žò}ż@ġïzh)&‡] $˜”ùšnESÊh0Şĵê §*Ş€'r†çäjBÄHÏ<…ĝŻbiïìàŜ‡_r ß†Ëan„a¸Yȸ͒ĵ˘OÔTž›¤yĞÄ-ˆ,~(ċş:€f™ŜQË÷ŭžçykë½sżpo ×bċ ÷ôxΧx3žheuŻİ´Ê↲ëvħíµĵ"|ôy*•ú¨ô*"˜ùšáĞÏP_ÇÁÁn;XjùחïXżLZ¤”ĦR*ˆƒal`K)TbŜgRÊÌĵWEH)‘i­Íµ&"bDÄcĵĠjµc]Çq¸Â_ıçÑĠP¤ÎmĞġŭïŒê/;3wĊ8@Ž™)r8XK@^}ÉĞ_Î<‘Ŭ°÷ÎÚİ/'Irq/Šív?I’ÄSúDû/ÜĴŒÛ–ċ,niĤ43;òuŻ9 š8û1F4ëoZ;m…DSf4öïùáÀ¨şğm4ë"„ùĵċ@ ߟΐ;ˆ/ĵ‰ÁĞOa÷µgàí]KÖ}wïž^çêґ‹išîI)÷Âá`h`fYI)c³Y4ɲ,5‡§,Ì;ošÎߑnèdMËâyq#„àërÏó×u۝GÖĝê!˙Üù-&0Ĉòròm#c÷Àà``Žìò+H^ü x—ž>vâàkX{#ƒKD›&+ â8  ×Êsó2"…Ċ\ı-ˆ,~èċşİBus]Wxžç{ž×wg½Ġ_:vŸ^#P”Ż 3o2a6jlŠWjQŽc•³f’)îŒÀ87ŠĊ|…8˘É ßDòòWé¤];uúèÓI_ ˘BA·Á^ÇQ’$‰R*kPÏ-*^XtO¸X° ²@z×ÊuÀœ|ï;­VĞíşnÏuŬċ΁Cǖ˙ü@v)]Ŭ‰Cċ,İìêm^³ĵŜY)݌¨IÇ5éšŭÏx&i,íĈD™ħgÔ¤x›Ħ’{Ża¤§•éšú\0*vċ˜Ç\p7÷Šœ#‹^|ןú:è­çÓCÛş{eémÖ[ı’eÙÖîîînšĤ{iš’$ Ò4 J™PjZAٔ,hšżÙ,o³…a€8çŽçyÜ÷}ÏqœÎò÷QÌç· TUg&ö[#03ċŞÏgà‚熨ŒçsE]ÙĠבĵĝçpÎ?ìĝÁW|Ñ=/YÑp8܍˘h˜ĤiœĤiZ2AŬ/ˆĉ)èÊÏìy " ¤÷ĥdgÔužçym×u—„k'?ós÷kĈĜċHBI]1ݚ|=癑.İíŞg{Ġ.%ı7•zNĠĠó`4v{¸Á2Ŭí£şùŜÄ?˙ñu¸^ïXí]X>²öFšĤ{{{[I’ì$I²Çñ I’(MÓÈdD#ivi‰Û"s+û¨œv¤K}£ >ÇaïğžçµÇéwî|hùìv Š$(ÓùU˘šàğ #AÇĉċîäĵċ@/#yñ/€7ż›>rxéÍżòR0ĵÁġ vÂ0 JYQĥ ˆf öÛ'² ²@ş-ËuÀÇq̋½8ÎR{mŭpûÈİΛƒ,€UıĴ¤§Âh$‡2§Œ1£é;éÈ 醖Iq;ԔĠ7½b 0nFSŬsaDÓBZ°L7FŒ³™ÀŬ\=G:7äÜ}ĉq\òëh_|=¸gmùl÷Èê[I’lìîîn&I²ÇñDfy[’eYfZBjJ6t£ ZTÌPdGÚMÇqàû<Ïs§ĥğ+îÚħöÙ7ı̛³\e§éֈħħ\ż˘˘ËKĦ€·L†ÔÒwèùżÀêÜÎ}w~Fgé;áRWƒ Ĝš’İ}fF7â´0 DĠgĥ‘Ò{PĞFNëğÛqgiŭħOŜ ĥ‘ċ+&ŠÙ£:Œ¨tĈ;r¸ G£UÚ¨L§‰&Z&u×îŠ=˜žì Ŭ -"ín†Q} +Íè˜Ü8ŒXéOHÈ/„à€8žÉÁÛÏáúöʓáWŜn^;“$ÉĠ½½`3Ží8Žwâ8FQTŠy!][i=oˆr„šúM@u_J_Mr]—yžWdG½µ䄔Œom%gy†DĴ<‘öÂ(_)Àáà-žËıi€ĝÙżBöÊ×Ô}ËÎÙġŸ£B†—ƒ Ĝ0YÑd£MYÑ<-2W„kñct{ġŒPS×ıëxž×Bô8çËĞwßw(Q€–”_•3f µ”bB}T’~£´âa4§A#oş†3}#˘IéÚIM7#švÍ>FzF™Žr`ĜŒ´:ÌÂ:î0ÀÉ·™Á9!şò6Ï~ ğ˙<Ùâ֏½Çñċ½ و˘h+I’]#'&I’¤išI)³R6´ß‰~Ŭ iáĵì¨nAÊËLœsnÊuŽ8mÇqz½ğ=´JÈl´½ħ$´ĦĉżÛ­€‘à(vş2_€ıĤD·uñ ïìÓÑ#'àz}8^4YÑġ0 ÷Â0 n +R¸9§`‚΂Èé‡Ú?š›%qÎG†Bˆ.ç|İúĦŝµXĉċr(İ+/úĤ§·ÎËĝàŒÀÍ˙³ĈòŜälĤ’zu…^`èµħz3sı^#hÁžÑ-‚QeeS#Ĉ9îä@œyéîuì½ô86żû´>¸şġ‘ġ•T–žßÛÛğÇñfEÛa’$ Ì:ëbâ_5dDê`´M)ĠQé=Ż=G‰sŽVĞ%\×mŭÍöħğ{oíĤf=-‡èdFĤâ=v`ÈŻ°˜+rYıÈwñĥQ†ôÌw=÷ç8œ^½~úÎOI|v†—‚ ¸Á–r ĉŠöÛ/şUċ9 " ¤÷LMŞ”ë\×N-!D·{èèAħ´ì]ÜN@šJŬx(OĴ!LƒˆA˙?e½÷d/¨£ÚY}#0šëÀ0c7í[À0F´_; óÜÌÜNqċ0|í\üËŻ=<|hí5wµ˙f ݘĊm[fqÛ° "#)žċŝ<ŻI_ġÖĵìˆOy^i BÀó<Ç÷ŭ–˘×=|âÓ_o]<ğ•ğ{èÂI½ 0*•ç€|µí€û ”î"~ùݐ½ĝUu˙ş˙öÚêêsQ\òp8Ü‚`´Ż¨0“Q˘ÛïlQSv:­,gAdôÑgRÌVÛyӘğë !ÚBˆŜòŭ# užñ0S™·q”@£2Ïġ•9¤òlù&T FÎÙ Àh´{ÎÚñĊ{FóaÔ$9Ŝ/ŒŠ‘ ĉò\N,8tĵ‹Ŭç‰ëßĝS}§HÎŻY)Š˘‹ğq|5 (ŠvÂ0Ĉq&I’†ĤĜƒ|„n¤_A˜.°áµÛ™!b×uێôVü‘;†‰Âî0ƒVdVĦèwF0Ğ×Yħ*Âċ`]{ÉËïÜÓá£'=/H½1 .AP¨èĤOWr½í÷‚`nŸÈ‚ÈévȐ0JL!Çñ…mÎy§ç½%Ju·R7ˆš`0>|ÁZ³\0ʞ¨İERZSĦÇ´ҙž²{èVÁHOiä́Í)ÓŬŒò•Öù{ÇËWBÄï`÷ÉżBü½/GZy’ż9 Š!Ëm³E4(†YĦİÂbCo´L‡}ô-€f#Ġú׋ù#xžÇ ħ˘ß9~ïÊF(A’@‰BiJġĦ½Y!wËç1WžBöÎ÷=û%U×7îĵóÈSIDÑĊ  ‡-³&bżÂ…›‘-ÏÙ¸­´H˙¨&Ss9ç-ĈXŻuüÎÎĥÌŭèt mòln8|‹3€é\ ĤŒÙ*'š£‚gFÍ ï¤J Ü"išÚʙ#½@™îĤ2#3ÂE.é&%1xíil|ëßaíê[×O^y:³Q”[ÏA°]>§Ĵ³ž×—¸™­Ħ‹Â¨ŝÔµì¨òoŠÙ#×u[BˆşËícw÷.œ‹WlŜCšĝ݋¨ä?Wħâ,YpE~qàqŜAòìW‘½ĝUġÀö[+íċç£08Áċ 6†áN†’„žíGÒ}³Y‘‘Òm›MëÙw]×Bxœóçĵn_H´8¤²h”\ğë|( UuRµaÒÇ­tĊŞoŒh2]Œh2Ŭ­„3j:á èp;O[ßücuw ow—ğσÁ…bÈÒXÏFĈŬ´/çFfYntÚĉÁĜ|ä³n³° ò|t™ •665,ŻÓWÚHÔ(ûn<ôġx“,L™~Öŭ‘ŜGÏèfaD3ÊtÜċšòey |ĝÊ\˙îŸÂñ{;w­ġƒáÛa^ ×ÌUù0ŽĜdErƒo‘Ëŭş-,4pÙ òÇÓTĦp‡›ŝQÇqœż´z[?Ŝ=˙âvÓĈ8h$÷Ŝ'Œ``ÄsÁŒš‘û”í zĉÏ@Ż}+{ìĜʋÓ/›Ŭ•áp¸1§D·ŸÌhž3÷ÂY‘‘÷ğu3!„p9ç.cÌs×÷Hç6 @+Ŭ¨h›£2WFŜv àTY×ĝÓġÛÂhînİg¤ y™Îċ`ϽŠo|Ëç_ĵ~rµûx05 í”ċÄ 0Z$3şÑĤùJF3ž˜£J&oŒ~}SëŻ<ĝ#§‚X³ Rc¨ŞhħžQqETŝ´89Ĝ„q^äÎ;ˆŸ˙÷h&xäŽOé,}s8 ΛŬfáE7D7KÖ=ÍĦÛfE6>@še˘Z˙ĉ8B8Œ1—1ĉ;ŬžW"€Ë Y0šuŻ4ĤÍh<—4 Fşêĝŭ~‘žSĤ›ÈŒD#!Œ˘‹˘s/ê×ŝ‡yċpżŭŭápĝöp8Ûyċĵ7FİÓú:s֎ßRé£Ô[#2ëŬµ„Çs?4‡#½ô&6ñG8ĥùÎĊµŽWÀèÂ`0Ĝ ğq3ʧÍĥ>ÁQÎ-$ĥÀó´>¨-Œ™jÛx+ôîzpùġË (Q Lçħ )eÒY0ÊËı’Žƒù ‰äĠo!~áKtO[ž;xxġİ0Κ~ѵáp8r]˜R˘ğÙĴÈĈ‡d7ġŞ”1Ĉ8ç‚1ĉ0Ĉ§×wfXĊf Ĥ¨–J•G=F€(ß>-PĤkRúŬ,Œô”ÌèVozAˆq™Ž1€1ŽìêY\ûÖcŭê[W×ZüûAĵ=/ìíí]5²î(˲dэöŒĉYŝìB‹fïMedĉ87êşĥ˘ß;ußqét½ó;Ûù^­bzIŜŒ¸Ü`e{H^ûKȗ*?rdéċĥ/Apn8^‡ápÏltMŒŬ­š/š—™ÚĴÈĈ H³v•òcL0Ĉ8cÌa­ŽĤZÓhWÑÂ0ÒM§TÍğȎj†ĉŞÍ\šw0˘ÊtûŜôJӏĉÒ ­r[%^X c뉿ÄÒÙŻíşß‡gj0 ‹t‹Ì¸ÜȰ+0{Ġĝœ˘§ĜXM{ŽVžŸ…óĵ8=!ÄR˙ŽûİĈp˜YŜóĦ´ad`fψñÜ$•ùÌaP{‘ĵĝïáž}2úèɃOCfo ‡á9#^Ĝ‡{f‹nĤ”J̊uOßOVjad•!M=ˆˆ™Œ1Ħ–ˆe~hj³wGaÊUżž^Ĥ£ĈÚ]•3ĵqŸÑbnÜ7£E½éÑbÚ²ò>#ĈÀüsL00açÙŻ/}ox²çŭ TĤ+ ‘Ñ´Ìh?0Úo‰hßÚG9yĉ vĞĠrKĞP––N?ĵzq(GğI(ӋeFÌ<\–gĉ…šÎáPÛo"zêħşóĈö}§=™&ñÛA‹ƒÁ–Q2FĤ_”MÏĴ użkĊmVdC[²+_Èó€`˲ŒòŜ‘Ĥħ a†ÓA3hÎħVÒÇßŝ`Ôèww³0*ÙUèy÷µ£"¸ÙV(Ú.‰Ŭ˙˘üUú@ß{* †g‚ ˜PәÌHK0š˘‰ßìŽÓvsF]çûgäŜ=·Ŭ]sŬĠ?÷F’z?0â,÷PäyŸ&òÊ3ˆžùM7Ŭytíñ( ß)û v‚ ˜×/ZTĠ8ëo`³" -ÒH.ˆÄ ”ò<ÉqyĤ“ÊjˆE{F‹ÁˆèÀp0jRùŬŒ&ÊotS0b”½á 0Dg_ĈÎ÷ż˘ïïò²(|£4g´cĴ€š`$o D´Ÿı"ĵ‹‡âÔĴU(Ĉypgè÷ïzd’1~y+  ȨfÔ#C_çî Ì!¤oñÓBwûÉıƒë½'‚\ĵpq0A’$ñœ~Ñ˘‹ôlVdiÁ²IÓ{ˆFŻwjìáìF ŠnF4§L·é”vOy”5@l £Ñĵ‘ÏÁ†lû2˙+8ží]È^Dхápx͘¤išĤ5ÉÄ/ĵÛ jê[N͖„Ċ0lĞpgXûÑcDAJqŠL=YÑôÌıxyıëo b$/ɳ_Ò­{Żġ\ï٠·KƒÁ`£ÔŻK§ô‹ö£hlzüġ˘½…‘ feQĵĝ¤6 †İ;½a¤ç–énF´@™îv„Ñhü“ċ=#胗żƒÎĊWw×Zxv8ŒŠĦËíb³¨QÓ͂Ñ~&˙o·5SKvœóbŝ¨cúG˝S.Ÿ¤İCh4¨Ö£|Ĥ žéyDCÄÏ˙9ô+_Ë>zdééƒ 8?/ƒëFĵ5<öû•ußT‰Î‚ÈĈH³J›ŝŸˆˆ2ʇ´ûÑŬŒ¨Ħ†µ Œh2Ŭm £˘PGĊrÂ|‡ÂçĜ{í žŭŽ|¤#ž‹‚á9³`Ğ´]4]FMÖ@7Ġ8ż•âœE‘SĠŸfŝÈ3Rżµz şÚïœËċŜùWJĠäßĠÀˆğ àoıÉuÄÏŭ{8gôā§ Ó׆à\—ƒÁĉp8ÄqÎvġ¸ÏÚĥkKt6,ĉÀg"(Œ^Li˘¸¨fÍ4™#šWĤ{×6½Ŝzébı[ħ”P°Ñlr²Ŭ ì<÷pŠĊçt–ž1ûŒ6‡ánÇá†EĈ&·îıWċ?¤-P:ĉžç ³ŒŻË9ïŻÜ÷Ĝ‰TĜŜKóÇW* 3ż•܇@œƒ1\žĞÛ:ĵ€èé‡ÎĊçŸ<ŭ,‰ß Ü`0(l€QĊJİTk½H6şŸù"}=ŝ6,ŜĦµ&"*²!‚–ż2scU=F4£L7F´`™î½†-r_ë0*}/}Mxùaıóړ/ĵ>\ñĠ‹{r†áp7I’HJ™yñ~³£EzFïĊUùBsp÷XɝĦ+„Xêž~äàÖPŠ@™#VR-²j™ŽƒkfŒvŜFôÔa}÷­­{Ox<Ž˘·’n´6˘Ĥ¤›eÚ4t<ŻgdKt6,n$ˆHi­uĤRÒhċ9’ĴĞ™n Fz2Ŭ{ £şÒî†`T;ŽIÜc€¤×Ïc÷Ċ-ĵGñ(Š…a¸c,Ê. úJFû/z×}ĎUĜ™r]Oħì½ğál Hğ2hì­ÇË ‰s0Nı€ApĥƒìÚˈŸü"ŽD—6î:²úŬ0 Ï ‡ áê`0Ĝ04Jş›‘uӂż…‘ ¤J'ĴT²£âŞœÂPz^ËÉÌë… Êè#šQĤğ™Ì¨ÈŽÏjĉ0€4Ż=‰µÁµ-‡§oïĊñ•(Šĥ˘(Äq—öŬHïb_%˘÷à d‹ĵıËŭ\b×Éí‚î=§í^Ü ĦZϨ€Ë7ëÂá`ĉ0džFôôm_<~ ˙xïµáp7‚Ħ”²0¨½‘ùŭô‹l‰Î†Ò˘‰Q HZçµ;’Hùm†Ħ$0Î*k˘ßÏ0˘{Fû‚ÑĴsetíϐ^;ƒÁ/èĝx%ė£(şnĥ½†ĤT'":Ü&0jr˜Ÿöµ‘ğ·ħ ê!––ïŭĜÉA$ R“mj@Ò8ûtx>gääònîم zâé.?j yÙ.Ŭ¸ˆà­—ôGżž$ɵ8Ž·£(ڋ8’RÊi,&-í`4£Äf•ï Œ|×u[BˆÓêĴùNvÏïÄù/"KVÎsÇnFy™ÎĠHŜü:’§ŝX?ĵÌ_^m;ß ‚à­½½½s{{{×Lf¤i›ÌH–ŜԔLi‘ġ‹–ë,ŒlĜ iNÁ ċ‹Êİ$‰(UƒÄehşé´ `D·PÚ=F%Ó´‡t¤B&€˜›żE^rp}—éäb’$›&;в,ËĉĴ2¸iñÂmp6ı4L@Ğ,÷BôWî˙ĝ)11ȀŒ 3³1KäjEîŠÜ—ŽK$Żüäó.=ÔyĦÍé٠΃KĊÀkEġ…zû4ž%Ğ·%:Hû„›)5ݵÎÔîväŒíĉÀħÛ÷"0˘°¸_эlz½9M|~Œ0Pn  sd4ÀàWpPgÓ8ŬH’d;I’ĦɎ²³Ħy.·c™náLIÁ]×u|ß÷ÇépÎûŬ;:şHÈLçÙ3Ĥ `…I*O‘ĵúWÏ˙EöÑ£ŭg=¨ç ííímA04{¤ö;Z((š†mżÈ†Òğ™%™’"˘Lkf[ƒg܀@φQ1AO‹ŝôE×|ßÔÚñŭhf–4 FzÜۀF>ÄċÒH.÷úĊ¨’³ƒ,ÛJÓtÇq`²£Yâĵ&:n·°Ħ\7kŝhœsŜjµ\×uÛ£ŝÑáğúoí¤ LCg $ Ìcà\†Ék_…zŝϳǎ-=ċhùÂ0Î ƒËƒÁ`s0Œ _‚‘Ĉ|OÀEçğnğÇ߆÷ğ¨!/ÏKIE†DD‰ĵvagtĥ°ÜZŒ,Í`â,oşÑ­X;~+fÁˆfŻË`Š \ŽÂ›8€d3˲ëišîĈq˜ÌhoooÓÀ(İÁ¨žÍ2I½áRD6Ŝ븝Uv³:9T/ÙI)µR*#˘DkĞ­Ğ Ès8X.ħ}×`Tz­żç0*Ŭ—}À¨\òcŒƒ@¸ŝê‹èG;²ĞY–íĤi:LÓ41ĉİ‹t.jtğˆ³úGß'„àívÛu]×7ë&–ÛGïZÙÚNĦ"H ŜñÀ}Pâ˙ôòWҏXŭòÙ Ŝ ÷öö“Ô¸dÁ´ÈŒÑĵ=F·ğĴŜ†÷AÄèEĤ”’&CеÖĦĵ~%Ziq@˜ƒŠaèÍh|àOSîíFt£0j†aL·ŒFgPŒ°+¤×ŜÁ WğRÊ])ċ MÓÌ-Şâš×<żÄĤlhVĤ\ç˙şžz˝÷-_ÚNM`­Ü—ŽññĞ_^ŝJúħ+ß:{. ·ƒÁĊŬŬŬi0ÚoıNáŭá|aĈûH‹PHJݤ”İR*ÑZGòڅ íäkŸ)™ŸÔû…™žJgĴžŝï‚‘9.¨Ĝ‰C7 £Ĥ2öwAJ…ŬA9܁ܺ‚U.ÏK)÷²,&I—¤Ŝ‹ĝ˘ÍëŬ6â˙şİëOZ­/ÔuBˆ~ïGîL2Ç9·Dy†ÎSÄŻ}ôÊ_?ıö=Ħe£ Ì(šâxħY}ŭq·0²aô.@‰²˘Ê[–eJJ™)RT”]8sš <Ù ͅQ =eşžÎšİ0j(žPé>ŬŒš ` À¨i×d™%Àµ} ­d{*½&dYfY–fY&Ñ,Z˜VĤ›Vj÷ف8,Çq˜çyÂĝ×µ9çKŬ÷ŬfHB•o…u5’7żŭâ_Ĥ[ù>/Áhwwws8ÌİşSú˘òîY½ĥ0²ñ~Š÷“¨aô;Ë2)L”RĦ<ûÚ5Î@Œi–[ûczfD´Úñ:Œ&fmoÄ(u?0˘Ĥ4F³ĉ”X F{A8ÂċÛW°ÄċPjO)dY§išQŬІfdGóVżï TıšœµZ-×ó<ßĴ›èwŽŜ·zf˜ âÙ[߀|ñËòcǗžô˜~: £·MÏhk8q'Y–ݑȴUM ­xÁ†ÍŜeŒli"c’Rê,'RĴµŽċpo—v6"c*§.Ĵü/‡QQÖ˘ŒH“´êuî|M$OMÒîÒMIݰğ›BË|6i‚ÚıŠ>ÔR*R†ôÒxÎ+ÓÑ"ÏÛ¸oTŝx*”<Ï­VË1êş×_[qV÷Ŝıž\#}û[Hžû’úè‘î>ÓOFQôVáMWôŒ²,ۏ´{ZÉÎÂȆÒ)˘)WĠ•›ÖZËÙ˘ÏÏvğÍL˙¨Í9ïôîüÈÉ0Pìz,‘œŭ.Òç˙\}ôPûɞŒĝ͵{ooo`ì€ö³ËhŜ°ħ…‘ ¤[JĦĊ^0S:“%RÊH)5”ŜŜnóĵ\72#ġ'aTÍ,ĉ÷ŒnFe5rż0jÌAĉÀH—`$5Ànƒ§Ħòuz])I)ÓĜO™ˆĉdğïëpë ÏóĜpZ“ZŜÊb }AÀƒċ &ĜàŒ1…µ6sÎġܕŸ>X’˘É7{ÚeÀhï^ž§1Bâˆ`Ô,VàÜŜ2Ŭ5´Ô"";l`TwÁp˜ÏhÑë³ @A@Auwü½ììWäOŝà½KgWŝeY–Wó<ż9 îïììì ƒ\kmê×pZ‰nÖZс`DµĝôĈb =”fÁhß;qcŒ-ËR×9ûö£÷oY"kÑ8š #ÂÜ û£Ô_0µ6ôúÖŭ8ç+gä'o+Âá T “‘öŜ›ş‹ş_´t:V_Öwìː’5Ĉê ‡7?_Áµ˙(Š›yžß z½ŜÎ`0Èò<×5Œĉ%çéÀ€gԁ²X_š‰ħbÎğö:’ÓZkcLn­Ĝí‡ĠÍ+ıùÂ29Ż=¤M+Ħ™ġöÂh˙ġŸŒfNz%LŒħ·Ú{ŝvı;jä<¨Ž!ÊHJÂç9"oŽÈ´ tàħ×x6SvM˘“Œ1FkeÉùÍ3·ŝó˙Ĵ³Af­5EQèápXöz½"Ë2뜛òI1úƒLxċ‹ôÔŝډhÂ"ó˘{]È{ïëEnŒ8çĥĊĠŸl-Ÿ}ey;·BĥbÒ_L͜ô:ġ8 £‘…ŞK{ÎN# ›ï]í¨NĜ@_VW$ĈŜ íiCë½wY–>ŭîUöZk*ŠÂĉyn²,s5È'½}3àÄ0b1„e”i@²ZëÂÓ7ĈìĜŜğ*ŭOž'k@2Ĵ˙ÜŭS€Qknú`DsÊtO #çĉ”遨kžÂŻÈ— 9"ò5fhvż‹/ß sJíÏ(ŠÂ)Ĵ÷ž„6Š"µ†ÖĈݵöZkÀ7Vé˜Î0b1>çÚïJ1y–ÎÄFĞeY–ZëÌÓ³wŻß ŬʐĴwFn¨š_:š#?°Ĉˆ2ò6‡!q´0"_­MƒÑĝi—A@ÎB\Ó³Ġğn€%wE‹Âi¤áphʲôJ)9 ĴµÖZ êϘïEáÄ0b1 'L9!îù#öŜğŠG:7Ĉôs‚˙üaü³˙äùÒÔ]˜ĜÛßnìŒżk7Í)Ó}A`DĠÜŝŽĈ¨Z´À ) PMŠ•2 Fžˆš“ŜZ=c0Â8´Ö€ÔZÛú{²uğY÷³ÈëÈ0bK}ÙôÍ{GYWŞŞ²]Y–ıÖş§µŜĈûßŭ$–ž`MUrc'ĉ}0šrĝ‚Áˆ°·8Ác3°vqĦîĦ‡Ê^6÷8ZÏŜ/zFÜÍxÓ,pï wIgħHŸ×aöÛĴè÷¨´Tİ•íĥŜ‹î|2ŞîĜ EĠ×N`´ŝCh˘Ò3 s† #¸yFÍ'šAö Œv‚d}~˙JĜğ_(Xĝzäyš #Í3˘£gô„0²Úc8O#Tu…Ĵ)DBB%”µKÇïcŜ&àĴÍúfħH_“ÄÂ;Ŝ›´]QC­ġ–1ĉaĝ—˙ċ˘"ĵ­öŜ´ÏDSÂOڛîaäĴG ħ/xUó< D57*éÂQGÈ]=Ó@;ñÏ[ğœĤye¸yƒ F,Òü$1­d2­„2*ÛcLY–YY–}­ġ#ùŝYíàLj ½‚ŭ'í/ŒŞ'èáĦßÓcÎî0ޞŸY$ ˘J- !”B)ä1tH³úñÍ͢€ĤïubħH_’Äĵ²ŬŠ1Ĉ•úZëÇ6ÜM>yïħ 2ĴdRÉ'Úôú´`ä÷¸´Şië ŻĞDܓ¨µ9JHYçêD܁‘Q*„”Aŭñìhú I8(Œ0D #éKĝnu‘w {êù­´Ŭ°,Ë­ġàÇĝQEDĤ„PŜù/$ŒöAŬ…áa¨îì@– “%Xv¤”Ħ"PJÉ ĉµĈy–Ò´-ón; \oÏ0b1œ”E֐F½íêpC^EOkŭĜŬğ~#¸ùA_H!Eċö<ÀFyfĦµ;rUż dB2^‚R¤” ”JJİĈŽZLùúK Ĵ@XÄ!Ä=+ YĴ¤)‹Í‹l’ŬÓŞî^”e9(ËrĞ,ËûÁûĝ™R8gŞ=8OFtx•Ğ6> 5—=ĴƒXZC!XK)CT¨”Z4τ{Z uĠ,—tàÛóÈqëËç}w:1rÛt/Š"Ğ]ÒCqùÇ'ŻÙŞı¨ ·˘=˙DäPġÇ£YÏh6ŒĴñȆft½ ˆvÏŝO #ßì ö ˆpeÇRÊXJI)UJV Ib‚³5aàâ—J ‚â@cÜq˙,éK§}ïñ1}‡ĵwÎù:Ü+ËrKk}/ŭÑĵêƒJ˜)1Fuövßo=mìĝ`äa00S‘ Œéà0j$TÍf•ŠPŠ4‘R&RÊ8‚0u@WôÌĴ5¨]Ò}ùÁŸ}î<Ȕ4ĠM) f ×;Œ|ËVùÖŭb F²ÜÂh?ŬµàP³…h˙-£ĉ+[ .$çĦ–N" ğBˆŽ”2 + ‚‡ĦÄbħŽ…Cš˘y½Ċöô·ËóĵWĊ#c̽ċ˙ûĞ"|ċ’ĵŻşv‹'€Ñ¤yĥ“ĈŽÁ¨,ÊÜ΄Z0Ú÷=ˆ¨)˙ À‚Ó†KTW)•(˘(Š”RJNÏ$@1”X,Ö3$L8½ÎÔ>(•eYĉy>,Šbğ,Ë{òƒ?ŭ0è=È%• ï! !ĈËi ÂhzC˜É0"_Í:Q70‡€‘@“ğ£ŜÂ0j>K8‚ ÁJWÑUJaĈA„3’v3ġeLÚħX,Òtú<Ü0-î­µĥċ’cît˙ü÷>uRB;a<ĝ`„`4:Ê]gä‰0èFğ—'RbŒŞˆà­ƒ÷—…:^>”êAFQĠëHÓ\Ż)ħXĴcë0M‹€ğ–K*—TĊŭàò{&[·úŜh”£‰²O#Ş!@˜œĤkö F̝#šĤ˘‰€S½–$vוQĠ­A×{Ÿ,AvO˘œİ”„aĠëH³‚  ˙İħXĴgHE1i-ÉĉyžgYÖ+ŠâaY–wşöo?Ĥ0$x İŬG‹¨F{–&ż§n—ëu‹:£QPŒÙ.Œr˘‚”XÀĠŸ…’hj•ÁĈy âĠu)ċr0 £ ‚zI,ÁbħXÏ.ĈÊv‹ÊOsIZë²(ŠažçĠZÒġ.'·/o“ĠŞvĜż.ԂQ>„ɝfÁ¨,ÊÒ-£–3joĜŬ#Ô{“„€ÀŒî~/àĵġĠóÑ*ZE?^_–R.+şaĤI’D֑Ĥ9Ħ=_ó:‹Ċz–Ò" šä’hÌ%yžïäyŝ°(ŠÛ+?ĝ­ż„wù"ğs‡äîI܏œ#9ŒĴ­Û FSœv;8ˆşƒ3`ÔOQÚ:A(“S‰IVN+–Â0Lêu¤vçoNÙħXĴ ¤)ᆃ¸$߸¤&ܐeY–çùVY–÷ü[WşŸüàžBR•¸ êȝ§şvχQEDÂpp85yˆI0R4ċğ=˙Ù~:àÈ9ŻF¤Ë“ĜŽ7žWJ­A°†aÇq€ÉÁ…Ipâ‹Ċ:ViÒi|R¸aâŜ¤JY–eŭ<Ï•eywùÏ˙íûB—Ĉ•YµĤâ qhŞ}MíôŜphêA{Gܵ{ FMkĦÚ)ù9ÓcëĤ°¤ÔĈsè+kJİĠ :Q%qGS֑ĉˆËv,ë™ÒDÀ§­%™,Ëáp;Ïó{&ÏŻŭĊżûÒÛ²JÛ), £v›!+Ӂ€"·°Ĉ?Œ&Í*m_¨ħ0"ÄhìU– BÊz‡@$Bô—ÏÈ X ‚`%Š˘NTIĠż?‹¸#‹Ċ:Vi—4)qç8k­İŻöò<˜çùŬè£?ŭëŝġù$wûÚÉiÁg4JmßĈ_Ï6z2gDû‚ hÙ°IÂ×ĝĤÙíeDžŞu3G•1ìž ú鉔RĞav8Ž0 '€hÖ:‰Ċb -â’Ĉaä07Ĉè:“çùƒ˘(nnüà·ŝÊ{ï½- ¤„ änÔú0"OÍS+ÓµïV´Kv5Œöm›mhŒeŜU›dƒġ(=}A)µÁr†iǁRJMÒ$§´û—íX,Ö³¤)mŭm#´ŻŒçœ³eYápeÙ£<ÏïúÇ·?Yûè{· <êwÏÁFEËqwâ8ëpCÛ I,Pĥc—ÄbħŽƒCš5]vŒF;ç\’†áQžçwÍ`ç³Í÷~˙²„%ïÊŞûr ŒEğiêS‚ÑžŸrŸğwĵK†ş{ƒĴ[‚ïœ'@Èx8íœ| Ò³”RAĴEQ”&IҞ‘t ²‹Ċb=“@š‘¸;È~¤ñ&Ïó|8ö³,{˜çùíàêŭëôĉOy=DŬgŜR3E3ùġ)ÂhtÑí–öŒİhéD{_UC*¤ }cëdĞD!YBd§/ĴS”ž p-Žċ$I’8ŽSĥc8ħXĴgŜ!ÍrIÀô}I4î’Z{“†áp+˲{EQÜĜĝóßŭQà2íó>¨f'‰ŬW”ĵŻö}N0‚§=›dŭž&à{ZÓJ¨*ÙUW )ö¨90)Şpƒ ë ֟“ğç_ ‚`3Š˘Ġ:Ü l·N\ĥcħXÏ$&¸¤Eg%M-á9çšĉЃştw§ÈŸm÷ğ ݉t^5_•˘Zq•³È3[÷İû|`4şÚ·¤şmQ}Y`/2š9³R(ħëžö´%ŞŸƒ·^{D+§0}ît'Â0\o€Ôj¸:­ƒ‡Ċb/‡4#à,ßSÂЧÛ<ϋápĜ‡ò<ż­n~“Ğï?$3 ŞÑi×­Ŭç#PcpšÛûvĦ=`j`Tı$@­%í+ßQĠßÖĈ#[yy9ëž|) (ŠÖÒ4M0T-—$1żtÇá‹ġli£ĉÀh!(cÊvé.Ïó+ï˙ÁŸ‡ùNáó Òĵ#äċß Œ¨ċ’ˆ|Ċ˘öM&ÜgS“‚öŝB´×£Ĵ9]8'/â^òüW”R§˘(ZK’¤Ûét’zOÒĵÎ `·ÄbħŽ Œ/phRwĥ•ş{œeٝr8¸şù£ßù+ĝŒĵîıĥÚA(ñ7£Ŭ2ŬîÏĦµyĥşiÔä'Ѹ¤ñûôħÖ#ĥ–^Ú@Ü=†áfÇĞI’¤Q-:Ŝĵ-vI,ëĜ8¤ñSù$×4u“,v÷&Ùzl1{Y–=Ȳ언÷ÙO×?ĝ£Ğär”:‡óTurT>_ŠvMµŽ€6Ÿ÷Eğ›ŭH¨]’£‚^ëgUe;ÊÜ+ċƒÎóŻAp2Š˘ġN§ÓMÓ´o.€Ż+ħXĴ¤C´š£&uç½÷ĥ,Ë2Ïóá`0Ĝβìn–e7:—˙äÇÉŭ+;ÙÎjàu8˙7#´ĈRPğßŬ„ÙI˘ä'*0I´"ìíPğhÉx$Ü_zċŒ £3QmĈqĵšĤi:!ܰH×vI,ëX9¤q@yÌOÛM*Ŭ™²,Ë:u÷¸†ÒġÍŭëĈv§$ׯNò€ee;>gnîwµgŽEğwIQY%)”3w–*§ċ¤-œ%˜“—’­ç^‚àdÇkI’,i…aĜ†wgħX ¤)1ñÏsÇRŒƒİÁp8|˜çùí²÷ĝÊó?ùŭżzà‰†ġĤÒúŜDÙ>GµG§ûÖ&ÙÑu˘‰·—˘Ú(ÛŜTÔ~µÈVŬʍġˆ:›¸Ó}ġ… ΄ax˘Óé,w:Î ì’X,ÖñqHOĞtgŒħyžgƒÁ`g0ÜËóüĤzpíƒswŜğ;€lċ"UYGŸ;Œjı$€\품öŻŞ5ñïzü ”JŠ=~²)Azë+ĜZ|ġ+Ŭŝ҅KažŒ˘h=MÓN·Ûmf%µ$Áİ;‹uœ4‰Qs\ÒĴÒŬž^wí(ĝp8Ĵ˘à—żûŜjvs›ôHùêTK€ÄX3Ö§£Ŭ”]]²ĞŸMx^¨YO˘êŜ›„Şö$•ƒáê9ÜéĵôR†§£(ÚL’d%I’$‚‹ïGb—Äbħސ&¸¤E6Ê.Q‡Á`0˲ÛEQ\?ûŝżùa˜?,(߆‰Ş·§ħ8ĝӇ$îŞ5 ß´ŞÇİ×MÂ÷<@n¨ş7(Œ%MŬßĵ@@„ŝĈ×ÖòôäWÂ0<Çñz·Ûm\Ò"vI,ëĜ;¤i@šÙJ¨ & žeY>û5”nšÁΧ/~ïKğíHïŒ&ÌB £ÏFÍM=•ïöTíZá†ÚĊÉJRVċğ=!ëġ0òȇ%ÔÊÜZôZ†g8>‘$ÉZšĤqË%—íÀ.‰Ċb[ Í8L‚ÓĴw{ ”êġ¤íÁ`p?Ïó›xtëƒŝ{½MD9D˘Ş5ŞV żûœ`ÔÜ aw^’oE÷µŞ%€@Ž•]Ŭ Â:ÀBçħ³ŝĉZŜ9ġj†§’$Yët:Ŭn·ĠkIr ˜Ĝ%ħXĴ‘‚ceˆ¨~çŬÌĴ£Ê·N’~ì¤éÚ_×ëI˘( ”ÚRJERÊhéÖO’óŬ+·œCGB¨%¨´Ÿ;ŒŞç_•î|½6T•ñP훪ż/Dµ•ŞyvJ)`Gs€#¸C`ċœ¸ıt鵯d÷/GQt?I’­N§“EQj­]ë5lÊEë˙AŒ]OB1eĴ‹Ċb =[|jAeV#V?ösn J€0Ĉ!D@A*"T²ñÉw˙,ëœĝĊí0\ƒÚ„ HÀVhĞôŬӇQóCmȃH€d}öݧ 0Ôu3ȚRJU£Ĝ}ëċB€´¤‚ÒÛkoĴeŭš›w’$y˜Ĥi/I’ĵ,KеnğÎL“cà !ëêĜ­!-°7iÚ^¤öunÂgW·ÊûŭŝÎ`0x0oċy~íüO˙à‡é~żġĤY%ħg™äs€Ñ艒ßğžÔÚû¤Ä€´‡z9‚y‡Òâ3âĉòë—Â0<EÑİ4M׺Ŭn'Ž Ġ |ÖZR[ĵ–Äb1Ž”ù<­ßk}ìYO*˲ ;ŭ~˙A–e7ô°˙É —˙Ŭeŝ’íA4göşÜžsîS†@£ÔÇnò4Jâµ£Ú›$ %A)@µŽ•<ïŞû4ÒzôO~c=ëž-Š˘ÓI’Ĵw:ħNàó֒öŠĦÄbüL-ŬùVYiÏğöħçžġ$ï½Zk!„PJmA ¤”á’ĵ½pċ—\üċ7È )ġğƒĈ?5_ĝ­B@Uw_K½:~Ôp5ğ‰½Ñŭ9‘Eİ$˘d×VżŝÚk[GQô MÓíN§3(Š˘4Ĉ8çÜĝZRûµ¤ Ż5—ïX,Ò³ï’ĈŜyO :L[O)ğ6¨šC–eY)”RFŬ{ŸD/Irġıżŭ•jÄlPĠz’$ĵñŸ Œvż$x/ ähËl½zDU_ğ ħ£I²RJ (/vגZ8ŻÖ“€lġµċíŝo/ُîĊqü¨Ûíö˲,ʲ´Î9‡½kIӜX,Òħ„RF“NŠÁ1Fmç„* Äp8(””2RŬ;? .„ôĉ™ŸyN,(†P^ğŬ<ßç# n%$<< ˆÚĠĦğ:}ç÷Önü(4AŬò4˘S@ĜŒÛ[$|Ê0j ~F‚ŞŬ°"ÈFuMˆŞÛDÓR(€w­r£ ë Xea7.÷óËß'c=Ò0Âí•oyŝïŬ+@@† ŜşÖ<]í#’FëE$Ğò!‰ê@D}c €$ ĵ@X÷şkĤÊÖŬ[ĦµCÚMq}ċ[_y+żq%vîq§Óécò²,ŻÚ[´û܍'î¸tÇb1JŜ·?·ËLÓö)ħ:ç´ÖáPÔe;!„–ÄíààżD—Ÿ˙{oŠŽ’B.A@‚š¸l5c}J0j†ġyŞğ~Ëfí¨Šƒ Ağe=H_'îx/ m}gĥ)ßYh%ĦÖ_ŽŻ—?÷sϛ?Çñv§ÓéEQ˜Jĥċ’ 8péŽĊb O>̀RÛ--šĵ˜*z'ZRRJĠ}ĝYbĝŭôÊéï|EvÎ -AzÀ;Q•Âj(=M¨ZFPTħĈĦÉQšşĴjx”€'Û$î<JÂhƒP÷O|ûÔfqí­Ä}²•Ĥioii)·Ö–Zkg­-pˆ€˙z²X ¤ä’ÚPf‡Ĥı¤I Î91İ|×½ûzAFáµÍŸ}QœƒSH²46(ï)Á¨Ż6Í ò€RÀ ‚$Ñz24Ú,KRÀ‹êgĞÑIB*dCƒÎJ,>[˙Λod·ÇŜouğŬ1&ÓZÛħ½Ií×ĵ=ŞbâvI,é8BiÚ;s{7?İ›x‹!´6Î6Vİ)ßİ•;)Ïİ(ş-q^vÎAD)¤óşş[İĵ§£FŜ¨‚’¤ŞCĠŜŬ&ÜPżB”|Ĥi!@…ˆXAŬ—Ó[k?óîùGßÇqŻÛí6]Ż'5P’3\é˙†‹Ċ@:nPf‡°€SÚó=ï=ĴµÈó<Ğ]’¨ÓwâÄ­Iòô·ïlâĴìœT"D5qÖÒnÏı§£ĉJç!Ğ}FŞÙ$+IğÉğz’H (Ħ0ŽvğN8]8tc…ğkïžÛ(½ık“$éuğŬĴ,KmŒ8ÈħטKw,‰Ħ4#ä0y{’öÇZPʛò]}_òäKxúù;'pF,ŸƒP È* NĠ:=Ea”Q (T`R@ĝ:}G˘~RĠ:’”x_uq€Ĵğ=X‡\IgY\YŭÎÛowŻ'ŜïcúËË˅1Fc܌ҝ˜|\şcħHǔO˜ŜÉaRònZ|OĜĦŜ8‹šIĠĥŸšM'ïŭĝùğDgœT§êGäêsOFÍMŻG›£ħF˘5`”pÂW;ĝ@À5{_„/-ĴÜêîíâïžu?|œĤiÏZ;lšŻÎ(ŬMZÇÒ‹Ċ@:ĥ. ˜ĤÑvI“ÜÒÌɧŜ{h­Ë -NŬû ôówVß>#מƒ ş ÜÔOĞ>t{ÊwG £ĉçœĞ÷'IŞcáĜíàP·’˘J†$A (}U…#)Q:B7¸½öóÏmä×_Ü­4M{Ĉ˜ĵîàpÒŬP1”X,Òq…Rû´>-îĉܵƒÒĝş÷>Ñwn+uV.ƒˆ:€ħ•Q²rJÖ?5?ìX‡jmH6“ûÚ³ÉĊJJ˘Š‚{ĞR XB–•èĴĴÉO—ßŭĉċżı]ïMcÊJw°çġ$‹ÄPšs"lNš³Ö–Ĉ“˜÷Ŝs§|çĴX>tG>"ß:’£‡Ñ.4 ĥ9lzÔî:Ò.”€@H‰êgšéċä%a‹n­ċğĉĈ·Nù÷ĥs}kmµÖÎ9×ëġIŬMüÌ.‰Ċb G(³§›ÒMT J!:yïż’töŬ[Ê] äÉş]³_ñÖ~"ük´|Q‰ôdġÀÚRVƒóöù…£QsÙR³K·é#H' [c,$Uİ;‚„×Ŝùê°Ĵ{,ŻĤⳓ˙7Íŭ{‰÷ïŭZ[ÖŬÀ]QԂĤ€ àġ$‹ÄP:°Sš—ÛŞIxÍ"Ô`rşé_%Ż?vú-/@­CD ¤Ğ½?£AOFÍk+ÌRŬÒ(ĵ€”Ġĉ])êQDĦ@a°ğîċ=²A‰ÎÊfôñĈß÷’ŝ­Gq;Na­­ˆä\’ڏŜÀhRœ×“X,C Óğ9D“ 4ÈwqÛ}•Ĵıìġ×íÊ+‘êžɰ ˙tœÑĝ}W‡(TŭÄŻ $Dkô9B‚ĵCiİJ‚'$LáV__ğ­żó·Ï>ú^ß{?ôŜ—ÖZSŻ'Qk’;’ıëI %‹tÜĦ„ħĵäŬ<(QӐµvIÀ‘ïıKîÏÊOlñ· ĝŽLÏBHYíQR²ŜĠút`Ôܧu­§GbtAI ("„JÀ`LSwE)°$;ĞżüJy盉ğ+y·°S²Ö˘(ŠŒˆÈ{OŜ{ç½w]ïí%÷çċ§ĝıŝڛ+jùĵU íĞt›÷Ĝm~´0jdĞ`¤öâXփŝ¤”’ˆĵIëİÚ>ċ=†…ÁR‰Ë'ŝ›wŜ2%ô(#˘ÌZНsÖ{OY–Ż'ĦġzN/?kŻ‹Ċb (aìdx¤Pj=yï=Y"²/Ó_èĝÖ#a7ez"íÀ[´;}Öû#‡QċŒÚNİ–àĞa~BH˘½!‡ŞYÈ a‘.­Eoü£w_7żħċ½Ï;ŽvÎçœ÷Ŝû˘(`w_€Eö'qòŽĊb 1”ž”¨†Òî‚Rċ”ĵ÷Ŝ‘}Î˙DGüÖíĠoœ•ĞÏCŞĝ4ŒÈWkKĴ?Rí:úĥv7í֛hE³iV Ú4kÈ$ ¤ lĦ 7^]ğîùï^¸÷Ÿ2ï}á½×Ŝ{ÛĴ'Ġ›fǏb’Kâä‹Ċ@b(}NÉ{O¨v’÷Ŝž˘MìËo^ñú%ıö˘rµNg×çìÖ Œİ]£”<Ĥj1D¨RvRTUjMİ 9x™ŠÒ vN|ç\G?üöúŜû²9¸ĉy–ei§í¤'ïX,CéĦ4>hÈï=ês,‘ġŜ[ï½]öWġФóOËŜ%Z˙j ““^BP2uWş§£ĉŽmŭ£MOI@R½yVÔϕD‚6A€0V”čÓ˙íÔlmÇŝӜˆ ï½i֓j§D-àLڛ„i˙ %‹ÄP:<”hÊe8ç¨,KxïQUĵ'"ç½7Ó|ÍĉŭÌàëúĉŒÏAòä £lĝh÷ĜĈÛ í6c¨ @Ş^Ù+ô{9–—ùÑÉúÍ7Í˙ыéAá½/k YcŒo…öÈ î¨ŭ5C‰Ċb 1”%šĦñëœsşµ?‰ĵ÷9ywĵׯûrxċŜgv6ŜYUKÏAD1„ÈğÑFÚj³*ŒÚm†*—Tuu QDŻ !<œuU·pï1DîR7ŝèä?ŝöëö_ġ’Ê%•µSšr˜60Q0”X,CéàP’cïôçı'òŜS½Ö7 Jëòî•ݏŸo£ĝÖ[œKÏA+NĦ<*0ywd0j.{ò0TumPŞJ†Ö”„€@$ Ĵĉ(€3„"7H—/\1˙ï|˙÷íҝ1ĈÀ`0Úğ™É;ŝ eħH ùPš´ßf"ˆÚ'Ö&×ÜoÖÍʲœ6—ŠĦÄb1X‡€a~ĜĤiÏmê^³Ĥ4*ßyïuÇûâkì\l#Û|{Iv/@Ĉ]qĈB8UöÚHëF­oG‚R ë5zž’”Ħ’05É: sƒċX\9ġß½óşùßz1Ŭ5Ddĵ÷ĥًeYì_Kj^[LRu†‹Ċ@b(M\ÏX$7Ž€ñTbԐĠĠŽÉ:çtÇıâRZôo=üÌ]óÎ)µö"(X…p²zd@Í$˘ĉ÷èp0j>9˘ÑMU½O‰ê}J Ĵ­AĈa+°ĵÖ >>÷Ğï^şùżg ĥuŬĦÂ{ï]óĵ'8YqpŜ£Äb1JS Ô†Ó$(ÑpÚs}vhwuh֔Jï}y.½–-íäo_)ĥ^ĤµKJvNƒ, ba=T•òĴß=ĵ'„шž =!PRT=]ˆşÑƒ”p ïá@Öϰ´²–~vîWáċ›˙g‘™Jy~ġ%;áµ %‹ÄZ J˜r2;ì4 §DM·VÏ9猵V[k‹sùTl]~{ĞÜx#ĞÏ6B !µÎĉG£öí´u•+’U3ÖĤ|§œƒ'€œƒ1 ™ÒÓ+W.ü‹ż÷ҍÙRÓ­‚†áx|ĜC‰Ċb ħp !m0³ğL=‰Öí†ê}³ä­µÎV³Âµsè8—żžĉ;WöŝÖ#óö†\}2\yx*xcFĠ'5fġ*ßAJˆš"„˘0€sèœ_ûìô?ŝċïüNÙ@İv€äœ£zÚlóh“÷(1”X,ëPĉû›·DugßœsĈ£seÇıübzżĵ}ZöèżqIÊΐ“ ëêná5÷tyx2žœ#” QúN°ÎJŒC‚,Äê×NŬuƒ_>}ï?ZnÔŒzGQş†MxŭJ,‰uÄPÚ·İĴ&`` oĤĥƒÖÚÒ9WĴ·òed/ß~Ĥ>ùN"—ž‚˘éŜMTÍXA££zµon­ƒ”u$ĵ~ŞÉDِDÀÚÏ>ĝì7|×RµĤÔ4a‡J,‰ġt 4­„7ĥDEŜ{ÒZû&ĉœsġĜÒ9—§Î ßH³G7ôy/{ë¤Úx"ZÙjT¤ĵ­˙$hoĵCÀ¨>²ê zޞ¤l ="?Ú´DÚb@ĠH‹›żôR`?żòĝÇĤNúš#^AyžcĴï]ûġc(ħX $Ö!Ħ4H/fŬí0µáDĈ˜f„…·ÖÚ:ìPZkóŽsçRÛ_ˋ7?½ŭà·ñµ@._€¨(!‚ä|5.ŭ QF{ÈêĞÛ A¨˜G€Ğž>Y‹~_`…HÜĜĝŻżäyşsÙ°Możĉj(Ù `g(ħX $Ö!Ħ4ĞĞÄŭHX …WG}”Œ1µĥ°Öĉij‡oùƒï?~g`ßYVĞ/IhŞš}ÔŒv/n¸P• eĠUF£—Vğ‘ĵuúWŝŭ†‰{WFó’Ĉ Dá %‹ÄzB§ÔvH³xÀäŜ>(i­}3ÏV2Ĉ˜ÂZ›uœ\JòÇ÷żqcp˙ĵX{UŠô4@ġŒ%˘ŭ›hFûŸE½Ê;x! ŒDh°ĤÁ­³˙ŭÏÇT7h…Ĵµ1ĤÔZçĈ˜AšÚŝ›Iv÷Öv˙·ò§Ô‰×„LNÁ{‚@²pnl+o½ÖTŸÇ #ìu[dĞ—ÄÂbg;VÒèÖÙöîyü&\@İŬu}ü(J,‰ĦtȰĝş’œàœÚ ’˜PÂkZ;8çœÖÚh­Ëĥ[:›Úí W\ş|Ökċĉ[‰Z{BE€—€ ۄÚG+Ä<Œš5*BŬM”Û½XK£Ûŝùğçè×àš¨_C!œY1J,‰ġaŭShgEÇżïxç\3Ĉ˘ÙHЍ1…Ö:Ğܒ齝dwn=Ŝŝú­§ĊĉëR.Ĵ„•êġ>Şm´ tHµżç}µi—<œġĜŜÎAKQtóÜ˙îsĝuĽëBˆjC­¨Ôc(ħX $ÖÑ@İ­YëJ˜â”Ĉ0ı”‡ nÉèJEí–úġÚÒÖ Qĵrċö­×{ëo/ĞĠW £µj îTZ)GĜ“Ĝ×Mü0@ÎĠwáœÂŽ÷ŞŬş/Ŝ½pó×÷oT.„B””RŠáp¨Ç6Ï2”X,k”š“ß·4Ô~ÜM*áÉ1—4‚Twu<ÜYkµÖşZµÖŭ45½×’üî៽qeûê öÔہê^€ R´U•­4ĠÈX˘*àÇÁt@5˘êğGĠ,%Ğ Û;Eѽ‹˙·OŬü(ŜúDĠÏ'p·ızt…{€ùó”F×qĊb ħ[Zl]iZ4|”€)‡ĥ[²Ö­µ6ĈeYĉĈ˜ž1Ĥ·œ˜­ŻÇùġk÷ġ }mSžz 2<x AŜúŬ µí~x‚öUòĉ¨yĤ$%DŬV(Wh<&"qŝŸ˙Ü)ġŻäÑ_+)’R )TJIÔ`8š²,íµáÜv¤ì–X,ëëJÀŝH³ÄÓü ¸còTÄkœ’mġÚR/µĥw1.žöïżúñ•+_-×ßJäÚËá*¤"xm!„Ĝí .E• Ÿĝ,ĉÀ¨ùÂû‘S"çĝ²Ä£Ž–=ùOż~&\J˘ğPBˆLRf‚Ĉà$[ŻÇÂY,k”Úš´4Ğ„'§8&ÌrLnÉ£µÖeY–YY–ƒN§³$fûtxŜ ˙ĉµíOÎû“o²ûdU›i)yr A Zt: ŒFĝ¨\–Ĵ­˘ĥçЉ›˙µ³A'‰oŭQ „PBˆ@!›×@)%³,ÓìÙ8˜0JÍ˙˙ĥ²X ¤cöÉ/áMŒ|}È)ŸÛni”ÄĞİTh­s­ġ ÓéôÓ4ŬÚLì։NyáúƒoŜï½²)6^2=‘„€İĈĤïİĠŜ>D‹ÁhÂ÷ĴƒG‰íÇÎXĠïĵtú…¸sŭ÷!DX) ‚`ZkÓÊ:0a”ö ğ%‹tÜŬÒ˘%ĵ6¤0Ċ%MKâíÙÇÔrKnï`ëxxµh­{ijż—÷Ïİ^úäÖµ×ËŻ/ÉġWxA56<(¨Úı:ô°{d£'4FÔö‰ġü&x‡ŝ@ µwΟzħûşW+ !ÂzMII){ŭ~_äyn갃o½VóĤ÷r Ċš!Á Çä?zJ£Ğ&|żÜ”òڗċĜċĉCM¸<é³RJaFQEišvÓ4]ît:kišn&Ir:I’3[óÚgÙòE½öfĴN|PËU$ÜıŞW§Ş”GTMík֛&v{˜âš€ŬBB¨jú_gı‹ġ•'äÍ­ĠĞżñGĤè˙Tk}%Ïó[áŝÎÎN0äƒÁ@· ä[.‰Ĉ.³÷xíqµ,‰uÁ$ĉÀILÓ4(-&@J)) 0J’$İÁ´Rƒédǧ£89s·L߸^ó›ojó+:€ġ [\RhÎí~lp:̀ÑèUh-“A’ÖWcœI{ŭċÏ~íûnĝݴ֟ĉy~s8Ŝï÷û;á0ëġzş;ĝħYNLC‰uœĊ%ğcĤ%ĵYeĤI‡Y{—ĝL[_RuÏ5ZµÖĤ,ˢ,ËĴ(Š:ô mĈċƒS+Ċù;½­ŻŬÚŝmĵĦäêKIZ÷ŞsucV8_mmIì–éĤ=C²u7Œö@ċƒ N[ĉò2½ò?ŭÒòß^·>I„ħR* *))ċ`0ˆ²,Û{hĊ˜cšġÚràĊb‡ÄNiüŞ). Gä–f–ò”RAaEQ’$4M—:ÎJ’$I’lĈq|Z„éù›YôµğâÜ&Nĵ-ċòó §jOâAZ×’€³{œÑÄ µíMT;%"Ĵ7ç* °ıı‚Së‘ßxü‡—qëûß3Ĉ\.Šâz–ew†á~ż?è÷ûeŬnÈao°cĵċÒĴğ%;$ÖñtJc`šôŽ}|ŬxÛĦEŬ’ÄôDžDĠéĦI5ñ²,Ë,MÓ~šĤ;išnĊħ~x!Žïœ Ìs×îŜ~íŝŭ³rkB._ÂB€ĞÊy²Zob˙ ĤI0êzµÓRg ôPšŽ,Ö~ùÒıWÏĈŸŝ›TÑQJĊA„AJݞRJ´Ö•ڏ4 ŸçHÙ-ħĜ!ħĜ-=E·´:SŬ-!ĞäC\-1˝NgµvL'â8>ieòüžĝê}yv]l)Ġʋ JڌĤÇVkDTfÜ.µ.S ˘êB@H‰n7ÁÉÍç:[;Áċ_ûÏ·ŝZk}(Š[áŝ`0èġûŭ,Ë2S—ö‡Ĉ]ğ%‹ÄšĤIí„ÄœY`˜]ĈÛ')eP—ò‚8ŽÓ4M;iš.%I²šĤézǛqŸô*9£/_ğçOmàäÛR.½]6 ëêġïıóğ›k÷ġmÛß$P­-ĠĈFâ4ÄĉZŠ3kXŝ[ïù­OdŒıR–ċ<Ïïġûŭ­Á` ƒ2Ë23§„7o³ñ8 L,ëĜCéIŬ’8 [ÚsıS“ÈĞᴜ$ÉJ’$ëI’lDQtArŝĉ@]şc77iŭuÖ_d rUPŒ8ñš’žo•Úhbá*DS â'N,äZà6·ŝ#ÜŝÓ?1Ĉ|޵žçùáp¸5 úŭ~żÈ²Ĵ,ŠbV4|–[b0ħH,†ÒœŜ4{÷-ÍÛğt 8Ġ{SÇÁ´Tƒi-I’Í(ŠN ˆÏŜÈ×nK'ŬÚWµñ:dĵ ßÄĊ [Ż/ùş‘7Q•ÖwÑ|)ĞېRRAHġĠ'Otñœĵ|Ç}ò{ß³ĊàccÌĠ²,oeYöp0l÷z½,Ïs“çı1ĈLŠ…ûħG›·_‰Ëx,‹ŬÒ!ÜÒaËxóÓLqÇI’¤I’tÓ4]M’d-Žġ8Ž7U—ËWo÷3Yú|Gx ˘{BÄ ş—™:6îÜŜMĥ4ĈB•k֕ ”Bw9Ċ™OĜ ŸüöìOß7Ĉ|ĤµQĊ½Á`x8{½^1 t J4§„,°ĥÄ`b1Xì–&ğ%´ ƒħχ ?ÌrMm0…q4I’Ú5­ĊqĵEÑFE'z&ĵxsÇżXœ]•'ßbċ%Ùĵƒ7ĥîô vËyuY݆vK|!@B…C‰“':8ŞKŭ^ĠWŝħÖ^1Ĉ\+Šâvžçû•†á–ei1Ä@b1Xì–&ê°ÁQG`ú>Ĥ™`ŞIešŞd^Ç+µcZpÓÉĝ܍m˙êŬ˘³á—^ ä‰7!“Uż&ïĞ5&!wƒ΍Ĉ˘£~YdaıáìÙ5ĵ}´c?ú­¸ÁŬż6Ĉ\ĠZß*Šâ~–e[áp8 ô`0yž[†‹Ċ@b}~ni(ÍrKâ `ŞÛQĊQĊišĤq/'I²ÇñZ Ĥ D›sñÊŬ>ÎláĊ:ġäòËá2àŻœD`ZÈ·Ö—$„ @H’§NàÂİ.Ŭû>´·ĝ§ÖÚό17´ÖwŠ˘x4ûá0ïġzċp84ceβĴŸeÙ°ßï›,ˌÖÚEáZşc ħH,ŝE:XoQ0Ĉ5M GȘ¤BI)eÇa휚èxEÑRŭħ†áJĞ*Ö ҃>ó¨ˆW]z:+/C"XQŬ7¨Ú‘‡ j-y!˘HáÌéeĵxşCëö;ƒËż˙=݇ŸzïoXkïccĥó< ‡Ĵ>X­µÏóÜ-ê’H,‹5J‹ s 4LÓ@4m˙“¨C2‚ Š˘°T\ƒİÇq' nEËA,‡a¸˘”Z}œáâ֜}4¤•ïvċÊ ë_…蜅) Ô¨ħ+|½áVHÀ;tÒçOuÊ)iÔŭïŭU~ó{?pÎŬpÎŬñŜß³Öni­wĴµƒÁ`P ‡CŬëġĴÖÚ^Kb1XĴ#uKÀô20=ĝpÍĥ³Ë~b N2‚Ĥ¤Ôûš˘:Fž†aĜ‰˘¨†a7‚ V”R˖Ôĉ£}îaߞÚÊüŠ‘+‘\,=ır"XÚY_•ġ)%6:!ž?‘àµŜòĈ}/ğûW?òŜß²ÖŜ·Ö>´Önk­ûŭ~?ßŜŜ.wvvL $vI,‹ġ9ƒiZ;˘ƒ–ôĉÁhÏÚU]ғJ)Š˘(¨Á5Qò(Š:aĤ5œ:A,)–•RŬ̈Ó;™9ğ=´›½Lw&î"Ŝrċy {"= ­CD]DÂ镯žïàlÒğŬğúŬßğö'âœğk­} µ~\m[ŭ~ßÜısÇböB $‰ĊZ L³./šÈ[Lb M R  'h9'U—ġÂ(Š˘¸˘T†a†aRİ#ì(:Jİ”²û¨o/ìdĉä 0ĞÜĤyé8é ˆôdzrċ%\ĵĝ2^?½ŸüĈŸŝîZ?,Ërğßïûŭ~üĝħ]Ä%1X $ëpni’s:,˜Ĥmĥ]ZP’Ç#J)Q;'†ĦŠ˘(ˆv†aAÔŸcTŞ”J¤”‰”2•RĈBˆy$ÛC³=ĞYaÒ˘´Ħ%%KĴĴbġU‹•Wò*˙ŻWŠßŭWŭ~ĝĝñbkkËfYĉH,‹ġĊ&ÀdVˆyßSîob™QJ)¤”h†Ħˆ˘(¨ğDqa¨ž*)˘ )e, ë ĵBx"²D”è;çvœs;Ĉ˜m­ġNżß/z½ž4mRû3C‰ġ0g}š2:½9áïá=ŝ£@á'€‰Zßk [ŸgÁÊÏpb{ ä½Ŝ{Xkİ,KԀJ)A Â0”QÉÚEÉ8Žƒşs„Ĵ&žĞ°ŝ,E%`”ŜûÌZ;¨Ç¸ğ²,ÉZKY–1dXìXÇWżò+żòTï˙w~çw >LsL €É%·yëN³œÑ\§4îLZ_S ( ‚QÉ †Ħ PÔ* C‚ ’!"ëœ+µÖežçz8š^Żgò<÷˜Ŭı‹Äb }AÀ4ki¤ĤĊËÇ!7 JbŠ“Ğ2›R J)ŞaDQA)EQAJIDä­µŝl‹˘pĈÇ@b1X ¤ÏQOLĠ<‡tP(µ›Îş. */ #import #include "../../SPU.h" #define SNDCORE_OPENEMU 58326 // Sound interface to the SPU extern SoundInterface_struct SNDOpenEmu; // Ring buffer extern OERingBuffer *openEmuSoundInterfaceBuffer; #ifdef __cplusplus extern "C" { #endif // OpenEmu functions for the sound interface int SNDOpenEmuInit(int buffer_size); void SNDOpenEmuDeInit(); int SNDOpenEmuReset(); void SNDOpenEmuUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDOpenEmuGetAudioSpace(); void SNDOpenEmuMuteAudio(); void SNDOpenEmuUnMuteAudio(); void SNDOpenEmuSetVolume(int volume); void SNDOpenEmuClearBuffer(); void SNDOpenEmuFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SNDOpenEmuPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); #ifdef __cplusplus } #endif desmume-0.9.11/src/cocoa/openemu/Info (OpenEmu Plug-in).plist0000755000000000000000000000306112467662066022222 0ustar rootroot CFBundleDevelopmentRegion English CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier org.desmume.DeSmuME-OpenEmu CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType BNDL CFBundleShortVersionString v0.9.11 (OpenEmu Plug-in) CFBundleSignature ???? CFBundleVersion 0.9.11 CSResourcesFileMapped yes NSHumanReadableCopyright Copyright Âİ 2012-2015 DeSmuME Team. All rights reserved. NSPrincipalClass OEGameCoreController OEGameCoreClass NDSGameCore OEGameCorePlayerCount 1 OEGameCoreOptions openemu.system.nds OEGameCoreSupportsCheatCode OEProjectURL http://desmume.org/ OESystemIdentifiers openemu.system.nds SUFeedURL https://raw.github.com/OpenEmu/OpenEmu-Update/master/desmume_appcast.xml SUEnableAutomaticChecks 1 desmume-0.9.11/src/cocoa/openemu/OESoundInterface.mm0000755000000000000000000000746012467662066021003 0ustar rootroot/* Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "OESoundInterface.h" #import "cocoa_globals.h" #include OERingBuffer *openEmuSoundInterfaceBuffer = nil; static pthread_mutex_t *mutexAudioSampleReadWrite = NULL; pthread_rwlock_t *rwlockAudioEmulateCore = NULL; // Sound interface to the SPU SoundInterface_struct SNDOpenEmu = { SNDCORE_OPENEMU, "OpenEmu Sound Interface", SNDOpenEmuInit, SNDOpenEmuDeInit, SNDOpenEmuUpdateAudio, SNDOpenEmuGetAudioSpace, SNDOpenEmuMuteAudio, SNDOpenEmuUnMuteAudio, SNDOpenEmuSetVolume, SNDOpenEmuClearBuffer, SNDOpenEmuFetchSamples, SNDOpenEmuPostProcessSamples }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDOpenEmu, NULL }; int SNDOpenEmuInit(int buffer_size) { [openEmuSoundInterfaceBuffer setLength:buffer_size * 4 / SPU_SAMPLE_SIZE]; if (mutexAudioSampleReadWrite == NULL) { mutexAudioSampleReadWrite = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexAudioSampleReadWrite, NULL); } return 0; } void SNDOpenEmuDeInit() { if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_destroy(mutexAudioSampleReadWrite); free(mutexAudioSampleReadWrite); mutexAudioSampleReadWrite = NULL; } } int SNDOpenEmuReset() { // Do nothing. The OpenEmu frontend will take care of this. return 0; } void SNDOpenEmuUpdateAudio(s16 *buffer, u32 num_samples) { [openEmuSoundInterfaceBuffer write:buffer maxLength:num_samples * SPU_SAMPLE_SIZE]; } u32 SNDOpenEmuGetAudioSpace() { return (u32)[openEmuSoundInterfaceBuffer usedBytes] / SPU_SAMPLE_SIZE; } void SNDOpenEmuMuteAudio() { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuUnMuteAudio() { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuSetVolume(int volume) { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuClearBuffer() { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { if (mutexAudioSampleReadWrite == NULL) { return; } pthread_mutex_lock(mutexAudioSampleReadWrite); SPU_DefaultFetchSamples(sampleBuffer, sampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } size_t SNDOpenEmuPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { size_t processedSampleCount = 0; switch (synchMode) { case ESynchMode_DualSynchAsynch: if (rwlockAudioEmulateCore != NULL) { pthread_rwlock_wrlock(rwlockAudioEmulateCore); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_rwlock_unlock(rwlockAudioEmulateCore); } break; case ESynchMode_Synchronous: if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_lock(mutexAudioSampleReadWrite); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } break; default: break; } return processedSampleCount; } desmume-0.9.11/src/cocoa/openemu/OENDSSystemResponderClient.h0000755000000000000000000000256012467662066022556 0ustar rootroot/* Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import @protocol OESystemResponderClient; typedef enum _OENDSButton { OENDSButtonUp, OENDSButtonDown, OENDSButtonLeft, OENDSButtonRight, OENDSButtonA, OENDSButtonB, OENDSButtonX, OENDSButtonY, OENDSButtonL, OENDSButtonR, OENDSButtonStart, OENDSButtonSelect, OENDSButtonMicrophone, OENDSButtonLid, OENDSButtonDebug, OENDSButtonCount } OENDSButton; @protocol OENDSSystemResponderClient - (oneway void)didPushNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player; - (oneway void)didReleaseNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player; - (oneway void)didTouchScreenPoint:(OEIntPoint)aPoint; - (oneway void)didReleaseTouch; @end desmume-0.9.11/src/cocoa/openemu/NDSGameCore.h0000755000000000000000000000316512467662066017511 0ustar rootroot/* Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #import #import "OENDSSystemResponderClient.h" #import "../cocoa_input.h" #include #include @class CocoaDSCheatManager; @class CocoaDSController; @class CocoaDSGPU; @class CocoaDSFirmware; @interface NDSGameCore : OEGameCore { NSPoint touchLocation; NSMutableDictionary *addedCheatsDict; CocoaDSCheatManager *cdsCheats; CocoaDSController *cdsController; CocoaDSGPU *cdsGPU; CocoaDSFirmware *cdsFirmware; NSInteger displayMode; OEIntRect displayRect; OEIntSize displayAspectRatio; NSInteger inputID[OENDSButtonCount]; // Key = OpenEmu's input ID, Value = DeSmuME's input ID OSSpinLock spinlockDisplayMode; pthread_rwlock_t rwlockCoreExecute; } @property (retain) CocoaDSCheatManager *cdsCheats; @property (retain) CocoaDSController *cdsController; @property (retain) CocoaDSGPU *cdsGPU; @property (retain) CocoaDSFirmware *cdsFirmware; @property (assign) NSInteger displayMode; @end desmume-0.9.11/src/cocoa/openemu/DeSmuME_Prefix_OpenEmu.pch0000755000000000000000000000156412467662066022212 0ustar rootroot/* Copyright (C) 2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifdef __OBJC__ #define OBJ_C #endif #define HOST_DARWIN #define DESMUME_COCOA #define HAVE_OPENGL #define HAVE_LIBZ #if defined(__i386__) || defined(__x86_64__) #define HAVE_JIT #endif #define PORT_VERSION "OpenEmu"desmume-0.9.11/src/cocoa/openemu/NDSGameCore.mm0000755000000000000000000003026112467662066017670 0ustar rootroot/* Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "NDSGameCore.h" #import "cocoa_cheat.h" #import "cocoa_globals.h" #import "cocoa_file.h" #import "cocoa_firmware.h" #import "cocoa_GPU.h" #import "cocoa_input.h" #import "OESoundInterface.h" #import "OENDSSystemResponderClient.h" #include #include "../../NDSSystem.h" #include "../../GPU.h" #undef BOOL volatile bool execute = true; @implementation NDSGameCore @synthesize cdsController; @synthesize cdsGPU; @synthesize cdsFirmware; @synthesize cdsCheats; @dynamic displayMode; - (id)init { self = [super init]; if(self == nil) { return self; } // Set up threading locks spinlockDisplayMode = OS_SPINLOCK_INIT; pthread_rwlock_init(&rwlockCoreExecute, NULL); // Set up input handling touchLocation.x = 0; touchLocation.y = 0; inputID[OENDSButtonUp] = DSControllerState_Up; inputID[OENDSButtonDown] = DSControllerState_Down; inputID[OENDSButtonLeft] = DSControllerState_Left; inputID[OENDSButtonRight] = DSControllerState_Right; inputID[OENDSButtonA] = DSControllerState_A; inputID[OENDSButtonB] = DSControllerState_B; inputID[OENDSButtonX] = DSControllerState_X; inputID[OENDSButtonY] = DSControllerState_Y; inputID[OENDSButtonL] = DSControllerState_L; inputID[OENDSButtonR] = DSControllerState_R; inputID[OENDSButtonStart] = DSControllerState_Start; inputID[OENDSButtonSelect] = DSControllerState_Select; inputID[OENDSButtonMicrophone] = DSControllerState_Microphone; inputID[OENDSButtonLid] = DSControllerState_Lid; inputID[OENDSButtonDebug] = DSControllerState_Debug; // Set up the DS controller cdsController = [[[[CocoaDSController alloc] init] retain] autorelease]; [cdsController setMicMode:MICMODE_INTERNAL_NOISE]; // Set up the DS GPU cdsGPU = [[[[CocoaDSGPU alloc] init] retain] autorelease]; [cdsGPU setRwlockProducer:&rwlockCoreExecute]; [cdsGPU setRender3DThreads:0]; // Pass 0 to automatically set the number of rendering threads [cdsGPU setRender3DRenderingEngine:CORE3DLIST_SWRASTERIZE]; // Set up the emulation core CommonSettings.advanced_timing = true; CommonSettings.jit_max_block_size = 12; CommonSettings.use_jit = true; NDS_Init(); // Set up the cheat system cdsCheats = [[[[CocoaDSCheatManager alloc] init] retain] autorelease]; [cdsCheats setRwlockCoreExecute:&rwlockCoreExecute]; addedCheatsDict = [[NSMutableDictionary alloc] initWithCapacity:128]; // Set up the DS firmware using the internal firmware cdsFirmware = [[[[CocoaDSFirmware alloc] init] retain] autorelease]; [cdsFirmware update]; // Set up the sound core CommonSettings.spu_advanced = true; CommonSettings.spuInterpolationMode = SPUInterpolation_Cosine; CommonSettings.SPU_sync_mode = SPU_SYNC_MODE_SYNCHRONOUS; CommonSettings.SPU_sync_method = SPU_SYNC_METHOD_N; openEmuSoundInterfaceBuffer = [self ringBufferAtIndex:0]; NSInteger result = SPU_ChangeSoundCore(SNDCORE_OPENEMU, (int)SPU_BUFFER_BYTES); if(result == -1) { SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); } SPU_SetSynchMode(CommonSettings.SPU_sync_mode, CommonSettings.SPU_sync_method); SPU_SetVolume(100); // Set up the DS display displayMode = DS_DISPLAY_TYPE_DUAL; displayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); displayAspectRatio = OEIntSizeMake(2, 3); return self; } - (void)dealloc { SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); NDS_DeInit(); [addedCheatsDict release]; [self setCdsCheats:nil]; [self setCdsController:nil]; [self setCdsGPU:nil]; [self setCdsFirmware:nil]; pthread_rwlock_destroy(&rwlockCoreExecute); [super dealloc]; } - (NSInteger) displayMode { OSSpinLockLock(&spinlockDisplayMode); NSInteger theMode = displayMode; OSSpinLockUnlock(&spinlockDisplayMode); return theMode; } - (void) setDisplayMode:(NSInteger)theMode { OEIntRect newDisplayRect; OEIntSize newDisplayAspectRatio; switch (theMode) { case DS_DISPLAY_TYPE_MAIN: newDisplayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); newDisplayAspectRatio = OEIntSizeMake(4, 3); break; case DS_DISPLAY_TYPE_TOUCH: newDisplayRect = OEIntRectMake(0, GPU_DISPLAY_HEIGHT + 1, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); newDisplayAspectRatio = OEIntSizeMake(4, 3); break; case DS_DISPLAY_TYPE_DUAL: newDisplayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); newDisplayAspectRatio = OEIntSizeMake(2, 3); break; default: return; break; } OSSpinLockLock(&spinlockDisplayMode); displayMode = theMode; displayRect = newDisplayRect; displayAspectRatio = newDisplayAspectRatio; OSSpinLockUnlock(&spinlockDisplayMode); } #pragma mark - #pragma mark Execution - (void)resetEmulation { pthread_rwlock_wrlock(&rwlockCoreExecute); NDS_Reset(); pthread_rwlock_unlock(&rwlockCoreExecute); execute = true; } - (void)executeFrameSkippingFrame:(BOOL)skip { if (skip) { NDS_SkipNextFrame(); } [self executeFrame]; } - (void)executeFrame { [cdsController flush]; NDS_beginProcessingInput(); NDS_endProcessingInput(); pthread_rwlock_wrlock(&rwlockCoreExecute); NDS_exec(); pthread_rwlock_unlock(&rwlockCoreExecute); SPU_Emulate_user(); } - (BOOL)loadFileAtPath:(NSString*)path { BOOL isRomLoaded = NO; NSString *openEmuDataPath = [self batterySavesDirectoryPath]; NSURL *openEmuDataURL = [NSURL fileURLWithPath:openEmuDataPath]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"ROM"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"ROM Save"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Save State"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Screenshot"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Video"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Cheat"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Sound Sample"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Firmware Configuration"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Lua Script"]; [CocoaDSFile setupAllFilePathsWithURLDictionary:@PATH_OPEN_EMU]; // Ensure that the OpenEmu data directory exists before loading the ROM. NSFileManager *fileManager = [[NSFileManager alloc] init]; [fileManager createDirectoryAtPath:openEmuDataPath withIntermediateDirectories:YES attributes:nil error:NULL]; [fileManager release]; isRomLoaded = [CocoaDSFile loadRom:[NSURL fileURLWithPath:path]]; [CocoaDSCheatManager setMasterCheatList:cdsCheats]; return isRomLoaded; } #pragma mark Video - (BOOL)rendersToOpenGL { return NO; } - (OEIntRect)screenRect { OSSpinLockLock(&spinlockDisplayMode); OEIntRect theRect = displayRect; OSSpinLockUnlock(&spinlockDisplayMode); return theRect; } - (OEIntSize)aspectSize { OSSpinLockLock(&spinlockDisplayMode); OEIntSize theAspectRatio = displayAspectRatio; OSSpinLockUnlock(&spinlockDisplayMode); return theAspectRatio; } - (OEIntSize)bufferSize { return OEIntSizeMake(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); } - (const void *)videoBuffer { return GPU_screen; } - (GLenum)pixelFormat { return GL_RGBA; } - (GLenum)pixelType { return GL_UNSIGNED_SHORT_1_5_5_5_REV; } - (GLenum)internalPixelFormat { return GL_RGB5_A1; } - (NSTimeInterval)frameInterval { return DS_FRAMES_PER_SECOND; } - (void)changeDisplayMode { switch (displayMode) { case DS_DISPLAY_TYPE_MAIN: [self setDisplayMode:DS_DISPLAY_TYPE_TOUCH]; break; case DS_DISPLAY_TYPE_TOUCH: [self setDisplayMode:DS_DISPLAY_TYPE_DUAL]; break; case DS_DISPLAY_TYPE_DUAL: [self setDisplayMode:DS_DISPLAY_TYPE_MAIN]; break; default: return; break; } } #pragma mark Audio - (NSUInteger)audioBufferCount { return 1; } - (NSUInteger)channelCount { return SPU_NUMBER_CHANNELS; } - (double)audioSampleRate { return SPU_SAMPLE_RATE; } - (NSUInteger)audioBitDepth { return SPU_SAMPLE_RESOLUTION; } - (NSUInteger)channelCountForBuffer:(NSUInteger)buffer { return [self channelCount]; } - (NSUInteger)audioBufferSizeForBuffer:(NSUInteger)buffer { return (NSUInteger)SPU_BUFFER_BYTES; } - (double)audioSampleRateForBuffer:(NSUInteger)buffer { return [self audioSampleRate]; } #pragma mark Input - (oneway void)didPushNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player { [cdsController setControllerState:YES controlID:inputID[button]]; } - (oneway void)didReleaseNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player { [cdsController setControllerState:NO controlID:inputID[button]]; } - (oneway void)didTouchScreenPoint:(OEIntPoint)aPoint { BOOL isTouchPressed = NO; NSInteger dispMode = [self displayMode]; switch (dispMode) { case DS_DISPLAY_TYPE_MAIN: isTouchPressed = NO; // Reject touch input if showing only the main screen. break; case DS_DISPLAY_TYPE_TOUCH: isTouchPressed = YES; break; case DS_DISPLAY_TYPE_DUAL: isTouchPressed = YES; aPoint.y -= GPU_DISPLAY_HEIGHT; // Normalize the y-coordinate to the DS. break; default: return; break; } // Constrain the touch point to the DS dimensions. if (aPoint.x < 0) { aPoint.x = 0; } else if (aPoint.x > (GPU_DISPLAY_WIDTH - 1)) { aPoint.x = (GPU_DISPLAY_WIDTH - 1); } if (aPoint.y < 0) { aPoint.y = 0; } else if (aPoint.y > (GPU_DISPLAY_HEIGHT - 1)) { aPoint.y = (GPU_DISPLAY_HEIGHT - 1); } touchLocation = NSMakePoint(aPoint.x, aPoint.y); [cdsController setTouchState:isTouchPressed location:touchLocation]; } - (oneway void)didReleaseTouch { [cdsController setTouchState:NO location:touchLocation]; } - (NSTrackingAreaOptions)mouseTrackingOptions { return 0; } - (void)settingWasSet:(id)aValue forKey:(NSString *)keyName { DLog(@"keyName = %@", keyName); //[self doesNotImplementSelector:_cmd]; } #pragma mark Save State - (BOOL)saveStateToFileAtPath:(NSString *)fileName { return [CocoaDSFile saveState:[NSURL fileURLWithPath:fileName]]; } - (BOOL)loadStateFromFileAtPath:(NSString *)fileName { return [CocoaDSFile loadState:[NSURL fileURLWithPath:fileName]]; } #pragma mark Miscellaneous - (void)setCheat:(NSString *)code setType:(NSString *)type setEnabled:(BOOL)enabled { // This method can be used for both adding a new cheat or setting the enable // state on an existing cheat, so be sure to account for both cases. // First check if the cheat exists. CocoaDSCheatItem *cheatItem = (CocoaDSCheatItem *)[addedCheatsDict objectForKey:code]; if (cheatItem == nil) { // If the cheat doesn't already exist, then create a new one and add it. cheatItem = [[[CocoaDSCheatItem alloc] init] autorelease]; [cheatItem setCheatType:CHEAT_TYPE_ACTION_REPLAY]; // Default to Action Replay for now [cheatItem setFreezeType:0]; [cheatItem setDescription:@""]; // OpenEmu takes care of this [cheatItem setCode:code]; [cheatItem setMemAddress:0x00000000]; // UNUSED [cheatItem setBytes:1]; // UNUSED [cheatItem setValue:0]; // UNUSED [cheatItem setEnabled:enabled]; [[self cdsCheats] add:cheatItem]; // OpenEmu doesn't currently save cheats per game, so assume that the // cheat list is short and that code strings are unique. This allows // us to get away with simply saving the cheat code string and hashing // for it later. [addedCheatsDict setObject:cheatItem forKey:code]; } else { // If the cheat does exist, then just set its enable state. [cheatItem setEnabled:enabled]; [[self cdsCheats] update:cheatItem]; } } @end desmume-0.9.11/src/cocoa/OGLDisplayOutput_3_2.h0000755000000000000000000000217012467662066017640 0ustar rootroot/* Copyright (C) 2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _OGLDISPLAYOUTPUT_3_2_H_ #define _OGLDISPLAYOUTPUT_3_2_H_ #if defined(__APPLE__) #include #include #endif #include "OGLDisplayOutput.h" class OGLInfo_3_2 : public OGLInfo { public: OGLInfo_3_2(); virtual void GetExtensionSetOGL(std::set *oglExtensionSet); virtual bool IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const; }; OGLInfo* OGLInfoCreate_3_2(); #endif desmume-0.9.11/src/cocoa/Rakefile0000755000000000000000000001517612467662066015313 0ustar rootrootrequire 'tempfile' require "open3" # General indent = ' ' # Compile Options compile = { :command => 'g++', :files => Dir['*.m'] + Dir['*.mm'] + Dir['dialogs/*.m'] + Dir['dialogs/*.mm'] + ([ 'MMU', 'SPU', 'emufile', 'fs-linux', 'matrix', 'FIFO', 'NDSSystem', 'arm_instructions', 'cp15', 'mc', 'cheatSystem', 'thumb_instructions', 'GPU', 'OGLRender', 'armcpu', 'gfx3d', 'render3D', 'wifi', 'GPU_osd_stub', 'ROMReader', 'texcache', 'slot1', 'movie', 'bios', 'debug', 'saves', 'readwrite', 'rtc', 'rasterize', 'common', 'mic', 'addons'].map { |core_file| '../' + core_file + '.cpp' } ) + Dir['../utils/*.c'] + Dir['../utils/*.cpp'] + Dir['../utils/decrypt/*.cpp'] + Dir['../addons/*.cpp'], :defines => { :global => ['DESMUME_OBJ_C', 'OBJ_C'], :cocoa => ['DESMUME_COCOA', 'HAVE_LIBZ', 'HAVE_OPENGL']}, :options => { :global => [ 'arch i386', 'fmessage-length=0', 'pascal-strings', 'fasm-blocks', 'O3', 'mfix-and-continue', 'funroll-loops', 'fstrict-aliasing', 'ftree-vectorize', 'mmacosx-version-min=10.4', 'gdwarf-2'], :obj_cpp => ['fvisibility-inlines-hidden'] } } # Link Options link = { :command => 'gcc', :files => Dir[File.dirname(__FILE__) + '/build/rake/o/*.o'], :libraries => { :cocoa => ['z', 'stdc++'] }, :frameworks => { :cocoa => ['Cocoa', 'OpenGL', 'AudioUnit'] }, :options => {} } # Params def verbose? return false unless ENV.include? 'verbose' return false if ENV['verbose'].downcase == 'false' return true if ENV['verbose'].downcase == 'true' raise StandardError, "verbose must be true or false. Type rake help for help" end # Compile Step desc 'Compiles the source files' task :compile do puts 'Compiling...' #create directory to place object files Dir.mkdir(File.dirname(__FILE__) + '/build') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/o') rescue nil task_options = [] task_options += compile[:options][:global] rescue [] task_options += compile[:options][:cocoa ] rescue [] task_options += compile[:defines][:global].collect { |d| 'D' + d } rescue [] task_options += compile[:defines][:cocoa ].collect { |d| 'D' + d } rescue [] compile[:files].each do |filename| puts indent + 'Compiling ' + filename file_options = [] file_options += compile[:options][:obj_c ] rescue [] if filename =~ /.*\.m$/i file_options += compile[:options][:obj_cpp] rescue [] if filename =~ /.*\.mm$/i file_options += compile[:defines][:obj_c ].collect { |d| 'D' + d } rescue [] if filename =~ /.*\.m/i file_options += compile[:defines][:obj_cpp].collect { |d| 'D' + d } rescue [] if filename =~ /.*\.mm/i command = [compile[:command]] command << filename command << '-o ' + File.dirname(__FILE__) + '/build/rake/o/' + File.basename(filename) + '.o' command << '-c' command += (file_options + task_options).map { |o| '-' + o } command = command.join ' ' puts indent*2 + command if verbose? Open3.popen3(command) do |stdin, stdout, stderr| stdout.readlines.each do |line| puts indent*2 + line end error = false stderr.readlines.each do |err| error = true if err =~ /:\s*error\s*:/i puts indent*2 + err end raise StandardError, "Didn't compile!" if error end end end # Link Step desc 'Builds an executable out of the object files' task :link => :compile do puts 'Linking...' Dir.mkdir(File.dirname(__FILE__) + '/build') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/') rescue nil command = [link[:command]] command += link[:files] command << '-o ' + File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/DeSmuME' command += link[:options ][:global].collect { |o| '-' + o } rescue [] command += link[:options ][:cocoa ].collect { |o| '-' + o } rescue [] command += link[:libraries ][:global].collect { |l| '-l ' + l } rescue [] command += link[:libraries ][:cocoa ].collect { |l| '-l ' + l } rescue [] command += link[:frameworks][:global].collect { |f| '-framework ' + f } rescue [] command += link[:frameworks][:cocoa ].collect { |f| '-framework ' + f } rescue [] command = command.join ' ' puts indent + command if verbose? Open3.popen3(command) do |stdin, stdout, stderr| stdout.readlines.each do |line| puts indent + line end raise StandardError, 'Couldn\'t link!' unless stderr.readlines.each do |err| puts indent + err end.empty? end end # Build App desc 'Builds a Cocoa application bundle out of the linked files' task :build_cocoa_app => :link do puts 'Building Application Bundle...' Dir.mkdir(File.dirname(__FILE__) + '/build') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources') rescue nil cp File.dirname(__FILE__) + '../..//Info.plist', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' cp File.dirname(__FILE__) + '/PkgInfo', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' cp File.dirname(__FILE__) + '/InfoPlist.strings', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' cp File.dirname(__FILE__) + '/DeSmuME.icns', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' system 'cp -r ' + File.dirname(__FILE__) + '/translations/*.lproj ' + File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' end # Default Step desc 'Makes the executable from scratch' task :default => :build_cocoa_app do puts 'Finished!' end # Run Task desc 'Runs the executable if it exists' task :run => :build_cocoa_app do puts 'Running...' system File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/DeSmuME' puts File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/DeSmuME' end # Help desc 'Displays helpful information about this Rakefile' task :help do puts "" puts "Type rake to build the default task, which will make an executable" puts "Otherwise type rake [taskname] to execute a particular task" puts "Use rake -T to see what all the tasks are" puts "" puts "There are several parameters that you can pass:" puts "(but don't put spaces around the equal signs though)" puts " verbose = [true|false] print extra information (default is false)" puts "" end desmume-0.9.11/src/cocoa/cocoa_core.mm0000755000000000000000000010200112467662066016255 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_core.h" #import "cocoa_input.h" #import "cocoa_firmware.h" #import "cocoa_GPU.h" #import "cocoa_globals.h" #import "cocoa_output.h" #import "cocoa_rom.h" #import "cocoa_util.h" #include #include #include "../movie.h" #include "../NDSSystem.h" #include "../armcpu.h" #include "../driver.h" #include "../gdbstub.h" #include "../slot1.h" #include "../slot2.h" #undef BOOL // Need to include assert.h this way so that GDB stub will work // with an optimized build. #if defined(GDB_STUB) && defined(NDEBUG) #define TEMP_NDEBUG #undef NDEBUG #endif #include #if defined(TEMP_NDEBUG) #undef TEMP_NDEBUG #define NDEBUG #endif class OSXDriver : public BaseDriver { private: pthread_mutex_t *mutexThreadExecute; pthread_rwlock_t *rwlockCoreExecute; CocoaDSCore *cdsCore; public: pthread_mutex_t* GetCoreThreadMutexLock(); void SetCoreThreadMutexLock(pthread_mutex_t *theMutex); pthread_rwlock_t* GetCoreExecuteRWLock(); void SetCoreExecuteRWLock(pthread_rwlock_t *theRwLock); void SetCore(CocoaDSCore *theCore); virtual void EMU_DebugIdleEnter(); virtual void EMU_DebugIdleUpdate(); virtual void EMU_DebugIdleWakeUp(); }; //accessed from other files volatile bool execute = true; @implementation CocoaDSCore @dynamic cdsController; @synthesize cdsFirmware; @synthesize cdsGPU; @synthesize cdsOutputList; @dynamic masterExecute; @dynamic isFrameSkipEnabled; @dynamic coreState; @dynamic isSpeedLimitEnabled; @dynamic isCheatingEnabled; @dynamic speedScalar; @dynamic isGdbStubStarted; @dynamic isInDebugTrap; @synthesize enableGdbStubARM9; @synthesize enableGdbStubARM7; @synthesize gdbStubPortARM9; @synthesize gdbStubPortARM7; @dynamic emulationFlags; @synthesize emuFlagAdvancedBusLevelTiming; @synthesize emuFlagRigorousTiming; @synthesize emuFlagUseExternalBios; @synthesize emuFlagEmulateBiosInterrupts; @synthesize emuFlagPatchDelayLoop; @synthesize emuFlagUseExternalFirmware; @synthesize emuFlagFirmwareBoot; @synthesize emuFlagDebugConsole; @synthesize emuFlagEmulateEnsata; @dynamic cpuEmulationEngine; @dynamic maxJITBlockSize; @synthesize slot1DeviceType; @synthesize slot1StatusText; @synthesize frameStatus; @synthesize executionSpeedStatus; @dynamic arm9ImageURL; @dynamic arm7ImageURL; @dynamic firmwareImageURL; @synthesize slot1R4URL; @dynamic rwlockCoreExecute; - (id)init { self = [super init]; if(self == nil) { return self; } isGdbStubStarted = NO; isInDebugTrap = NO; enableGdbStubARM9 = NO; enableGdbStubARM7 = NO; gdbStubPortARM9 = 0; gdbStubPortARM7 = 0; gdbStubHandleARM9 = NULL; gdbStubHandleARM7 = NULL; int initResult = NDS_Init(); if (initResult == -1) { [self release]; self = nil; return self; } cdsController = nil; cdsFirmware = nil; cdsGPU = [[[[CocoaDSGPU alloc] init] autorelease] retain]; cdsOutputList = [[NSMutableArray alloc] initWithCapacity:32]; emulationFlags = EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK; emuFlagAdvancedBusLevelTiming = YES; emuFlagRigorousTiming = NO; emuFlagUseExternalBios = NO; emuFlagEmulateBiosInterrupts = NO; emuFlagPatchDelayLoop = NO; emuFlagUseExternalFirmware = NO; emuFlagFirmwareBoot = NO; emuFlagDebugConsole = NO; emuFlagEmulateEnsata = NO; slot1DeviceType = NDS_SLOT1_RETAIL_AUTO; slot1StatusText = NSSTRING_STATUS_EMULATION_NOT_RUNNING; spinlockMasterExecute = OS_SPINLOCK_INIT; spinlockCdsController = OS_SPINLOCK_INIT; spinlockExecutionChange = OS_SPINLOCK_INIT; spinlockCheatEnableFlag = OS_SPINLOCK_INIT; spinlockEmulationFlags = OS_SPINLOCK_INIT; spinlockCPUEmulationEngine = OS_SPINLOCK_INIT; isSpeedLimitEnabled = YES; speedScalar = SPEED_SCALAR_NORMAL; prevCoreState = CORESTATE_PAUSE; slot1R4URL = nil; _slot1R4Path = ""; threadParam.cdsCore = self; threadParam.state = CORESTATE_PAUSE; threadParam.isFrameSkipEnabled = true; threadParam.frameCount = 0; threadParam.framesToSkip = 0; threadParam.frameJumpTarget = 0; uint64_t timeBudgetNanoseconds = (uint64_t)(DS_SECONDS_PER_FRAME * 1000000000.0 / speedScalar); AbsoluteTime timeBudgetAbsTime = NanosecondsToAbsolute(*(Nanoseconds *)&timeBudgetNanoseconds); threadParam.timeBudgetMachAbsTime = *(uint64_t *)&timeBudgetAbsTime; pthread_mutex_init(&threadParam.mutexOutputList, NULL); pthread_mutex_init(&threadParam.mutexThreadExecute, NULL); pthread_cond_init(&threadParam.condThreadExecute, NULL); pthread_rwlock_init(&threadParam.rwlockCoreExecute, NULL); pthread_create(&coreThread, NULL, &RunCoreThread, &threadParam); // The core emulation thread needs max priority since it is the sole // producer thread for all output threads. Note that this is not being // done for performance -- this is being done for timing accuracy. The // core emulation thread is responsible for determining the emulator's // timing. If one output thread interferes with timing, then it ends up // affecting the whole emulator. // // Though it may be tempting to make this a real-time thread, it's best // to keep this a normal thread. The core emulation thread can use up a // lot of CPU time under certain conditions, which may interfere with // other threads. (Example: Video tearing on display windows, even with // V-sync enabled.) struct sched_param sp; int thePolicy = 0; memset(&sp, 0, sizeof(struct sched_param)); pthread_getschedparam(coreThread, &thePolicy, &sp); sp.sched_priority = sched_get_priority_max(thePolicy); pthread_setschedparam(coreThread, thePolicy, &sp); [cdsGPU setRwlockProducer:self.rwlockCoreExecute]; OSXDriver *newDriver = new OSXDriver; newDriver->SetCoreThreadMutexLock(&threadParam.mutexThreadExecute); newDriver->SetCoreExecuteRWLock(self.rwlockCoreExecute); newDriver->SetCore(self); driver = newDriver; frameStatus = @"---"; executionSpeedStatus = @"1.00x"; return self; } - (void)dealloc { [self setCoreState:CORESTATE_PAUSE]; [self removeAllOutputs]; [cdsOutputList release]; [self setCdsController:nil]; [self setCdsFirmware:nil]; [self setCdsGPU:nil]; pthread_cancel(coreThread); pthread_join(coreThread, NULL); coreThread = NULL; pthread_mutex_destroy(&threadParam.mutexThreadExecute); pthread_cond_destroy(&threadParam.condThreadExecute); pthread_mutex_destroy(&threadParam.mutexOutputList); pthread_rwlock_destroy(&threadParam.rwlockCoreExecute); [self setIsGdbStubStarted:NO]; NDS_DeInit(); [super dealloc]; } - (void) setMasterExecute:(BOOL)theState { OSSpinLockLock(&spinlockMasterExecute); execute = theState ? true : false; OSSpinLockUnlock(&spinlockMasterExecute); } - (BOOL) masterExecute { OSSpinLockLock(&spinlockMasterExecute); const BOOL theState = execute ? YES : NO; OSSpinLockUnlock(&spinlockMasterExecute); return theState; } - (void) setCdsController:(CocoaDSController *)theController { OSSpinLockLock(&spinlockCdsController); if (theController == cdsController) { OSSpinLockUnlock(&spinlockCdsController); return; } if (theController != nil) { [theController retain]; } pthread_mutex_lock(&threadParam.mutexThreadExecute); [cdsController release]; cdsController = theController; pthread_mutex_unlock(&threadParam.mutexThreadExecute); OSSpinLockUnlock(&spinlockCdsController); } - (CocoaDSController *) cdsController { OSSpinLockLock(&spinlockCdsController); CocoaDSController *theController = cdsController; OSSpinLockUnlock(&spinlockCdsController); return theController; } - (void) setIsFrameSkipEnabled:(BOOL)theState { pthread_mutex_lock(&threadParam.mutexThreadExecute); if (theState) { threadParam.isFrameSkipEnabled = true; } else { threadParam.isFrameSkipEnabled = false; threadParam.framesToSkip = 0; NDS_OmitFrameSkip(2); } pthread_mutex_unlock(&threadParam.mutexThreadExecute); } - (BOOL) isFrameSkipEnabled { pthread_mutex_lock(&threadParam.mutexThreadExecute); const BOOL theState = threadParam.isFrameSkipEnabled ? YES : NO; pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theState; } - (void) setSpeedScalar:(CGFloat)scalar { OSSpinLockLock(&spinlockExecutionChange); speedScalar = scalar; OSSpinLockUnlock(&spinlockExecutionChange); [self changeExecutionSpeed]; } - (CGFloat) speedScalar { OSSpinLockLock(&spinlockExecutionChange); const CGFloat scalar = speedScalar; OSSpinLockUnlock(&spinlockExecutionChange); return scalar; } - (void) setIsSpeedLimitEnabled:(BOOL)theState { OSSpinLockLock(&spinlockExecutionChange); isSpeedLimitEnabled = theState; OSSpinLockUnlock(&spinlockExecutionChange); [self changeExecutionSpeed]; } - (BOOL) isSpeedLimitEnabled { OSSpinLockLock(&spinlockExecutionChange); const BOOL enabled = isSpeedLimitEnabled; OSSpinLockUnlock(&spinlockExecutionChange); return enabled; } - (void) setIsCheatingEnabled:(BOOL)theState { OSSpinLockLock(&spinlockCheatEnableFlag); CommonSettings.cheatsDisable = theState ? false : true; OSSpinLockUnlock(&spinlockCheatEnableFlag); } - (BOOL) isCheatingEnabled { OSSpinLockLock(&spinlockCheatEnableFlag); BOOL theState = CommonSettings.cheatsDisable ? NO : YES; OSSpinLockUnlock(&spinlockCheatEnableFlag); return theState; } - (void) setIsGdbStubStarted:(BOOL)theState { #ifdef GDB_STUB if (theState) { gdbstub_mutex_init(); if ([self enableGdbStubARM9]) { const uint16_t arm9Port = (uint16_t)[self gdbStubPortARM9]; if(arm9Port > 0) { gdbStubHandleARM9 = createStub_gdb(arm9Port, &NDS_ARM9, &arm9_direct_memory_iface); if (gdbStubHandleARM9 == NULL) { NSLog(@"Failed to create ARM9 gdbstub on port %d\n", arm9Port); } else { activateStub_gdb(gdbStubHandleARM9); } } } else { destroyStub_gdb(gdbStubHandleARM9); gdbStubHandleARM9 = NULL; } if ([self enableGdbStubARM7]) { const uint16_t arm7Port = (uint16_t)[self gdbStubPortARM7]; if (arm7Port > 0) { gdbStubHandleARM7 = createStub_gdb(arm7Port, &NDS_ARM7, &arm7_base_memory_iface); if (gdbStubHandleARM7 == NULL) { NSLog(@"Failed to create ARM7 gdbstub on port %d\n", arm7Port); } else { activateStub_gdb(gdbStubHandleARM7); } } } else { destroyStub_gdb(gdbStubHandleARM7); gdbStubHandleARM7 = NULL; } } else { destroyStub_gdb(gdbStubHandleARM9); gdbStubHandleARM9 = NULL; destroyStub_gdb(gdbStubHandleARM7); gdbStubHandleARM7 = NULL; gdbstub_mutex_destroy(); } #endif if (gdbStubHandleARM9 == NULL && gdbStubHandleARM7 == NULL) { theState = NO; } isGdbStubStarted = theState; } - (BOOL) isGdbStubStarted { return isGdbStubStarted; } - (void) setIsInDebugTrap:(BOOL)theState { // If we're transitioning out of the debug trap, then ignore // frame skipping this time. if (isInDebugTrap && !theState) { threadParam.framesToSkip = 0; NDS_OmitFrameSkip(2); } isInDebugTrap = theState; } - (BOOL) isInDebugTrap { return isInDebugTrap; } - (void) setEmulationFlags:(NSUInteger)theFlags { OSSpinLockLock(&spinlockEmulationFlags); emulationFlags = theFlags; OSSpinLockUnlock(&spinlockEmulationFlags); pthread_rwlock_wrlock(&threadParam.rwlockCoreExecute); if (theFlags & EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK) { self.emuFlagAdvancedBusLevelTiming = YES; CommonSettings.advanced_timing = true; } else { self.emuFlagAdvancedBusLevelTiming = NO; CommonSettings.advanced_timing = false; } if (theFlags & EMULATION_RIGOROUS_TIMING_MASK) { self.emuFlagRigorousTiming = YES; CommonSettings.rigorous_timing = true; } else { self.emuFlagRigorousTiming = NO; CommonSettings.rigorous_timing = false; } if (theFlags & EMULATION_ENSATA_MASK) { self.emuFlagEmulateEnsata = YES; CommonSettings.EnsataEmulation = true; } else { self.emuFlagEmulateEnsata = NO; CommonSettings.EnsataEmulation = false; } if (theFlags & EMULATION_USE_EXTERNAL_BIOS_MASK) { self.emuFlagUseExternalBios = YES; CommonSettings.UseExtBIOS = true; } else { self.emuFlagUseExternalBios = NO; CommonSettings.UseExtBIOS = false; } if (theFlags & EMULATION_BIOS_SWI_MASK) { self.emuFlagEmulateBiosInterrupts = YES; CommonSettings.SWIFromBIOS = true; } else { self.emuFlagEmulateBiosInterrupts = NO; CommonSettings.SWIFromBIOS = false; } if (theFlags & EMULATION_PATCH_DELAY_LOOP_MASK) { self.emuFlagPatchDelayLoop = YES; CommonSettings.PatchSWI3 = true; } else { self.emuFlagPatchDelayLoop = NO; CommonSettings.PatchSWI3 = false; } if (theFlags & EMULATION_USE_EXTERNAL_FIRMWARE_MASK) { self.emuFlagUseExternalFirmware = YES; CommonSettings.UseExtFirmware = true; } else { self.emuFlagUseExternalFirmware = NO; CommonSettings.UseExtFirmware = false; } if (theFlags & EMULATION_BOOT_FROM_FIRMWARE_MASK) { self.emuFlagFirmwareBoot = YES; CommonSettings.BootFromFirmware = true; } else { self.emuFlagFirmwareBoot = NO; CommonSettings.BootFromFirmware = false; } if (theFlags & EMULATION_DEBUG_CONSOLE_MASK) { self.emuFlagDebugConsole = YES; CommonSettings.DebugConsole = true; } else { self.emuFlagDebugConsole = NO; CommonSettings.DebugConsole = false; } pthread_rwlock_unlock(&threadParam.rwlockCoreExecute); } - (NSUInteger) emulationFlags { OSSpinLockLock(&spinlockEmulationFlags); const NSUInteger theFlags = emulationFlags; OSSpinLockUnlock(&spinlockEmulationFlags); return theFlags; } - (void) setCpuEmulationEngine:(NSInteger)engineID { OSSpinLockLock(&spinlockCPUEmulationEngine); #if defined(__i386__) || defined(__x86_64__) cpuEmulationEngine = engineID; #else cpuEmulationEngine = CPU_EMULATION_ENGINE_INTERPRETER; #endif OSSpinLockUnlock(&spinlockCPUEmulationEngine); } - (NSInteger) cpuEmulationEngine { OSSpinLockLock(&spinlockCPUEmulationEngine); const NSInteger engineID = cpuEmulationEngine; OSSpinLockUnlock(&spinlockCPUEmulationEngine); return engineID; } - (void) setMaxJITBlockSize:(NSInteger)blockSize { pthread_rwlock_wrlock(&threadParam.rwlockCoreExecute); CommonSettings.jit_max_block_size = (blockSize > 0) ? blockSize : 1; pthread_rwlock_unlock(&threadParam.rwlockCoreExecute); } - (NSInteger) maxJITBlockSize { pthread_rwlock_rdlock(&threadParam.rwlockCoreExecute); const NSInteger blockSize = CommonSettings.jit_max_block_size; pthread_rwlock_unlock(&threadParam.rwlockCoreExecute); return blockSize; } - (void) setCoreState:(NSInteger)coreState { pthread_mutex_lock(&threadParam.mutexThreadExecute); if (threadParam.state == CORESTATE_EXECUTE || threadParam.state == CORESTATE_PAUSE) { prevCoreState = threadParam.state; } threadParam.state = coreState; threadParam.framesToSkip = 0; NDS_OmitFrameSkip(2); switch (coreState) { case CORESTATE_PAUSE: { for(CocoaDSOutput *cdsOutput in cdsOutputList) { [cdsOutput setIdle:YES]; } [self setFrameStatus:[NSString stringWithFormat:@"%lu", (unsigned long)[self frameNumber]]]; break; } case CORESTATE_FRAMEADVANCE: { for(CocoaDSOutput *cdsOutput in cdsOutputList) { [cdsOutput setIdle:NO]; } [self setFrameStatus:[NSString stringWithFormat:@"%lu", (unsigned long)[self frameNumber]]]; break; } case CORESTATE_EXECUTE: { for(CocoaDSOutput *cdsOutput in cdsOutputList) { [cdsOutput setIdle:NO]; } [self setFrameStatus:@"Executing..."]; break; } case CORESTATE_FRAMEJUMP: { for(CocoaDSOutput *cdsOutput in cdsOutputList) { if (![cdsOutput isKindOfClass:[CocoaDSDisplay class]]) { [cdsOutput setIdle:YES]; } } [self setFrameStatus:[NSString stringWithFormat:@"Jumping to frame %lu.", (unsigned long)threadParam.frameJumpTarget]]; break; } default: break; } pthread_cond_signal(&threadParam.condThreadExecute); pthread_mutex_unlock(&threadParam.mutexThreadExecute); [[self cdsController] setHardwareMicPause:!(coreState == CORESTATE_EXECUTE)]; } - (NSInteger) coreState { pthread_mutex_lock(&threadParam.mutexThreadExecute); const NSInteger theState = threadParam.state; pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theState; } - (void) setArm9ImageURL:(NSURL *)fileURL { if (fileURL != nil) { strlcpy(CommonSettings.ARM9BIOS, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.ARM9BIOS)); } else { memset(CommonSettings.ARM9BIOS, 0, sizeof(CommonSettings.ARM9BIOS)); } } - (NSURL *) arm9ImageURL { return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.ARM9BIOS encoding:NSUTF8StringEncoding]]; } - (void) setArm7ImageURL:(NSURL *)fileURL { if (fileURL != nil) { strlcpy(CommonSettings.ARM7BIOS, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.ARM7BIOS)); } else { memset(CommonSettings.ARM7BIOS, 0, sizeof(CommonSettings.ARM7BIOS)); } } - (NSURL *) arm7ImageURL { return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.ARM7BIOS encoding:NSUTF8StringEncoding]]; } - (void) setFirmwareImageURL:(NSURL *)fileURL { if (fileURL != nil) { strlcpy(CommonSettings.Firmware, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.Firmware)); } else { memset(CommonSettings.Firmware, 0, sizeof(CommonSettings.Firmware)); } } - (NSURL *) firmwareImageURL { return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.Firmware encoding:NSUTF8StringEncoding]]; } - (pthread_rwlock_t *) rwlockCoreExecute { return &threadParam.rwlockCoreExecute; } - (void) setEjectCardFlag { if (nds.cardEjected) { self.emulationFlags = self.emulationFlags | EMULATION_CARD_EJECT_MASK; return; } self.emulationFlags = self.emulationFlags & ~EMULATION_CARD_EJECT_MASK; } - (BOOL) ejectCardFlag { [self setEjectCardFlag]; if (nds.cardEjected) { return YES; } return NO; } - (void) slot1Eject { pthread_rwlock_wrlock(&threadParam.rwlockCoreExecute); NDS_TriggerCardEjectIRQ(); pthread_rwlock_unlock(&threadParam.rwlockCoreExecute); [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_NO_DEVICE]; } - (void) changeRomSaveType:(NSInteger)saveTypeID { pthread_rwlock_wrlock(&threadParam.rwlockCoreExecute); [CocoaDSRom changeRomSaveType:saveTypeID]; pthread_rwlock_unlock(&threadParam.rwlockCoreExecute); } - (void) changeExecutionSpeed { if (self.isSpeedLimitEnabled) { const CGFloat theSpeed = ([self speedScalar] > SPEED_SCALAR_MIN) ? [self speedScalar] : SPEED_SCALAR_MIN; pthread_mutex_lock(&threadParam.mutexThreadExecute); threadParam.timeBudgetMachAbsTime = GetFrameAbsoluteTime(1.0/theSpeed); pthread_mutex_unlock(&threadParam.mutexThreadExecute); [self setExecutionSpeedStatus:[NSString stringWithFormat:@"%1.2fx", theSpeed]]; } else { pthread_mutex_lock(&threadParam.mutexThreadExecute); threadParam.timeBudgetMachAbsTime = 0; pthread_mutex_unlock(&threadParam.mutexThreadExecute); [self setExecutionSpeedStatus:@"Unlimited"]; } } /******************************************************************************************** applyDynaRec Sets the use_jit variable for CommonSettings. Takes: Nothing. Returns: Nothing. Details: In the UI, we call setCpuEmulationEngine to set whether we should use the interpreter or the dynamic recompiler. However, the emulator cannot handle changing the engine while the emulation is running. Therefore, we use this method to set the engine at a later time, using the last cpuEmulationEngine value from the user. ********************************************************************************************/ - (void) applyDynaRec { const NSInteger engineID = [self cpuEmulationEngine]; pthread_mutex_lock(&threadParam.mutexThreadExecute); CommonSettings.use_jit = (engineID == CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER); pthread_mutex_unlock(&threadParam.mutexThreadExecute); } - (BOOL) applySlot1Device { const NSInteger deviceTypeID = [self slot1DeviceType]; NSString *r4Path = [[self slot1R4URL] path]; pthread_mutex_lock(&threadParam.mutexThreadExecute); _slot1R4Path = (r4Path != nil) ? std::string([r4Path cStringUsingEncoding:NSUTF8StringEncoding]) : ""; slot1_SetFatDir(_slot1R4Path); BOOL result = slot1_Change((NDS_SLOT1_TYPE)deviceTypeID); pthread_mutex_unlock(&threadParam.mutexThreadExecute); switch (deviceTypeID) { case NDS_SLOT1_NONE: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_NO_DEVICE]; break; case NDS_SLOT1_RETAIL_AUTO: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_RETAIL_INSERTED]; break; case NDS_SLOT1_RETAIL_NAND: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_RETAIL_NAND_INSERTED]; break; case NDS_SLOT1_R4: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_R4_INSERTED]; break; case NDS_SLOT1_RETAIL_MCROM: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_STANDARD_INSERTED]; break; default: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_UNKNOWN_STATE]; break; } return result; } - (void) restoreCoreState { [self setCoreState:prevCoreState]; } - (void) reset { [self setCoreState:CORESTATE_PAUSE]; [self applyDynaRec]; [self applySlot1Device]; pthread_mutex_lock(&threadParam.mutexThreadExecute); NDS_Reset(); GPU_FillScreenWithBGRA5551(0xFFFF); pthread_mutex_unlock(&threadParam.mutexThreadExecute); [self restoreCoreState]; [self setMasterExecute:YES]; [[self cdsController] reset]; [[self cdsController] updateMicLevel]; } - (NSUInteger) frameNumber { pthread_rwlock_rdlock(&threadParam.rwlockCoreExecute); const NSUInteger currFrameNum = currFrameCounter; pthread_rwlock_unlock(&threadParam.rwlockCoreExecute); return currFrameNum; } - (void) frameJumpTo:(NSUInteger)targetFrameNum { pthread_mutex_lock(&threadParam.mutexThreadExecute); threadParam.frameJumpTarget = targetFrameNum; if (targetFrameNum <= (NSUInteger)currFrameCounter) { pthread_mutex_unlock(&threadParam.mutexThreadExecute); return; } pthread_mutex_unlock(&threadParam.mutexThreadExecute); [self setCoreState:CORESTATE_FRAMEJUMP]; } - (void) frameJump:(NSUInteger)relativeFrameNum { [self frameJumpTo:[self frameNumber] + relativeFrameNum]; } - (void) addOutput:(CocoaDSOutput *)theOutput { pthread_mutex_lock(&threadParam.mutexOutputList); [theOutput setRwlockProducer:[self rwlockCoreExecute]]; [[self cdsOutputList] addObject:theOutput]; pthread_mutex_unlock(&threadParam.mutexOutputList); } - (void) removeOutput:(CocoaDSOutput *)theOutput { pthread_mutex_lock(&threadParam.mutexOutputList); [[self cdsOutputList] removeObject:theOutput]; pthread_mutex_unlock(&threadParam.mutexOutputList); } - (void) removeAllOutputs { pthread_mutex_lock(&threadParam.mutexOutputList); [[self cdsOutputList] removeAllObjects]; pthread_mutex_unlock(&threadParam.mutexOutputList); } - (NSString *) cpuEmulationEngineString { NSString *theString = @"Uninitialized"; switch ([self cpuEmulationEngine]) { case CPU_EMULATION_ENGINE_INTERPRETER: theString = @"Interpreter"; break; case CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER: theString = @"Dynamic Recompiler"; break; default: break; } return theString; } - (NSString *) slot1DeviceTypeString { NSString *theString = @"Uninitialized"; pthread_mutex_lock(&threadParam.mutexThreadExecute); if(slot1_device == NULL) { pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theString; } const Slot1Info *info = slot1_device->info(); theString = [NSString stringWithCString:info->name() encoding:NSUTF8StringEncoding]; pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theString; } - (NSString *) slot2DeviceTypeString { NSString *theString = @"Uninitialized"; pthread_mutex_lock(&threadParam.mutexThreadExecute); if(slot2_device == NULL) { pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theString; } const Slot2Info *info = slot2_device->info(); theString = [NSString stringWithCString:info->name() encoding:NSUTF8StringEncoding]; pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theString; } - (BOOL) startReplayRecording:(NSURL *)fileURL sramURL:(NSURL *)sramURL { if (fileURL == nil) { return NO; } std::string sramPath = (sramURL != nil) ? [[sramURL path] cStringUsingEncoding:NSUTF8StringEncoding] : ""; const char *fileName = [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]; NSDate *currentDate = [NSDate date]; NSString *currentDateStr = [currentDate descriptionWithCalendarFormat:@"%Y %m %d %H %M %S %F" timeZone:nil locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]]; int dateYear = 2009; int dateMonth = 1; int dateDay = 1; int dateHour = 0; int dateMinute = 0; int dateSecond = 0; int dateMillisecond = 0; const char *dateCStr = [currentDateStr cStringUsingEncoding:NSUTF8StringEncoding]; sscanf(dateCStr, "%i %i %i %i %i %i %i", &dateYear, &dateMonth, &dateDay, &dateHour, &dateMinute, &dateSecond, &dateMillisecond); DateTime rtcDate = DateTime(dateYear, dateMonth, dateDay, dateHour, dateMinute, dateSecond, dateMillisecond); FCEUI_SaveMovie(fileName, L"Test Author", 0, sramPath, rtcDate); return YES; } - (void) stopReplay { FCEUI_StopMovie(); } @end static void* RunCoreThread(void *arg) { CoreThreadParam *param = (CoreThreadParam *)arg; CocoaDSCore *cdsCore = (CocoaDSCore *)param->cdsCore; NSMutableArray *cdsOutputList = [cdsCore cdsOutputList]; NSUInteger frameNum = 0; uint64_t startTime = 0; uint64_t timeBudget = 0; // Need local variable to ensure that param->timeBudgetMachAbsTime is thread-safe. do { startTime = mach_absolute_time(); pthread_mutex_lock(¶m->mutexThreadExecute); timeBudget = param->timeBudgetMachAbsTime; while (!(param->state != CORESTATE_PAUSE && execute)) { pthread_cond_wait(¶m->condThreadExecute, ¶m->mutexThreadExecute); startTime = mach_absolute_time(); timeBudget = param->timeBudgetMachAbsTime; } CocoaDSController *cdsController = [cdsCore cdsController]; if (param->state != CORESTATE_FRAMEJUMP) { [cdsController flush]; } else { [cdsController flushEmpty]; } NDS_beginProcessingInput(); FCEUMOV_HandlePlayback(); NDS_endProcessingInput(); FCEUMOV_HandleRecording(); // Execute the frame and increment the frame counter. pthread_rwlock_wrlock(¶m->rwlockCoreExecute); NDS_exec(); frameNum = currFrameCounter; pthread_rwlock_unlock(¶m->rwlockCoreExecute); // Check if an internal execution error occurred that halted the emulation. if (!execute) { pthread_mutex_unlock(¶m->mutexThreadExecute); // TODO: Message the core that emulation halted. NSLog(@"The emulator halted during execution. Was it an internal error that caused this?"); continue; } if (param->framesToSkip == 0) { param->frameCount++; } // Make sure that the mic level is updated at least once per frame, regardless // of whether the NDS actually reads the mic or not. [cdsController updateMicLevel]; [cdsController clearMicLevelMeasure]; pthread_mutex_lock(¶m->mutexOutputList); switch (param->state) { case CORESTATE_EXECUTE: { for(CocoaDSOutput *cdsOutput in cdsOutputList) { if (param->framesToSkip > 0 && [cdsOutput isKindOfClass:[CocoaDSDisplay class]]) { continue; } [cdsOutput doCoreEmuFrame]; } break; } case CORESTATE_FRAMEADVANCE: { for(CocoaDSOutput *cdsOutput in cdsOutputList) { [cdsOutput doCoreEmuFrame]; } break; } case CORESTATE_FRAMEJUMP: { for(CocoaDSOutput *cdsOutput in cdsOutputList) { if ([cdsOutput isKindOfClass:[CocoaDSDisplay class]] && (param->framesToSkip == 0 || frameNum >= param->frameJumpTarget)) { [cdsOutput doCoreEmuFrame]; } } break; } default: break; } pthread_mutex_unlock(¶m->mutexOutputList); switch (param->state) { case CORESTATE_EXECUTE: { // Determine the number of frames to skip based on how much time "debt" // we owe on timeBudget. if (param->isFrameSkipEnabled) { if (param->framesToSkip > 0) { NDS_SkipNextFrame(); param->framesToSkip--; } else { param->framesToSkip = CalculateFrameSkip(timeBudget, startTime); } } break; } case CORESTATE_FRAMEJUMP: { if (param->framesToSkip > 0) { NDS_SkipNextFrame(); param->framesToSkip--; } else { param->framesToSkip = (int)((DS_FRAMES_PER_SECOND * 1.0) + 0.85); } break; } default: break; } pthread_mutex_unlock(¶m->mutexThreadExecute); // If we doing a frame advance, switch back to pause state immediately // after we're done with the frame. if (param->state == CORESTATE_FRAMEADVANCE) { [cdsCore setCoreState:CORESTATE_PAUSE]; } else if (param->state == CORESTATE_FRAMEJUMP) { if (frameNum == (param->frameJumpTarget - 1)) { param->framesToSkip = 0; NDS_OmitFrameSkip(2); } else if (frameNum >= param->frameJumpTarget) { [cdsCore restoreCoreState]; } } else { // If there is any time left in the loop, go ahead and pad it. mach_wait_until(startTime + timeBudget); } } while(true); return NULL; } static int CalculateFrameSkip(uint64_t timeBudgetMachAbsTime, uint64_t frameStartMachAbsTime) { static const double skipCurve[10] = {0.60, 0.58, 0.55, 0.51, 0.46, 0.40, 0.30, 0.20, 0.10, 0.00}; static const double unskipCurve[10] = {0.75, 0.70, 0.65, 0.60, 0.50, 0.40, 0.30, 0.20, 0.10, 0.00}; static size_t skipStep = 0; static size_t unskipStep = 0; static int lastSetFrameSkip = 0; // Calculate the time remaining. const uint64_t elapsed = mach_absolute_time() - frameStartMachAbsTime; int framesToSkip = 0; if (elapsed > timeBudgetMachAbsTime) { if (timeBudgetMachAbsTime > 0) { framesToSkip = (int)( (((double)(elapsed - timeBudgetMachAbsTime) * FRAME_SKIP_AGGRESSIVENESS) / (double)timeBudgetMachAbsTime) + FRAME_SKIP_BIAS ); if (framesToSkip > lastSetFrameSkip) { framesToSkip -= (int)((double)(framesToSkip - lastSetFrameSkip) * skipCurve[skipStep]); if (skipStep < 9) { skipStep++; } } else { framesToSkip += (int)((double)(lastSetFrameSkip - framesToSkip) * skipCurve[skipStep]); if (skipStep > 0) { skipStep--; } } } else { static const double frameRate100x = (double)FRAME_SKIP_AGGRESSIVENESS / (double)GetFrameAbsoluteTime(1.0/100.0); framesToSkip = (int)((double)elapsed * frameRate100x); } unskipStep = 0; } else { framesToSkip = (int)((double)lastSetFrameSkip * unskipCurve[unskipStep]); if (unskipStep < 9) { unskipStep++; } skipStep = 0; } // Bound the frame skip. static const int kMaxFrameSkip = (int)MAX_FRAME_SKIP; if (framesToSkip > kMaxFrameSkip) { framesToSkip = kMaxFrameSkip; } lastSetFrameSkip = framesToSkip; return framesToSkip; } uint64_t GetFrameAbsoluteTime(const double frameTimeScalar) { const uint64_t frameTimeNanoseconds = (uint64_t)(DS_SECONDS_PER_FRAME * 1000000000.0 * frameTimeScalar); const AbsoluteTime frameTimeAbsTime = NanosecondsToAbsolute(*(Nanoseconds *)&frameTimeNanoseconds); return *(uint64_t *)&frameTimeAbsTime; } #pragma mark - OSXDriver pthread_mutex_t* OSXDriver::GetCoreThreadMutexLock() { return this->mutexThreadExecute; } void OSXDriver::SetCoreThreadMutexLock(pthread_mutex_t *theMutex) { this->mutexThreadExecute = theMutex; } pthread_rwlock_t* OSXDriver::GetCoreExecuteRWLock() { return this->rwlockCoreExecute; } void OSXDriver::SetCoreExecuteRWLock(pthread_rwlock_t *theRwLock) { this->rwlockCoreExecute = theRwLock; } void OSXDriver::SetCore(CocoaDSCore *theCore) { this->cdsCore = theCore; } void OSXDriver::EMU_DebugIdleEnter() { [this->cdsCore setIsInDebugTrap:YES]; pthread_rwlock_unlock(this->rwlockCoreExecute); pthread_mutex_unlock(this->mutexThreadExecute); } void OSXDriver::EMU_DebugIdleUpdate() { usleep(50); } void OSXDriver::EMU_DebugIdleWakeUp() { pthread_mutex_lock(this->mutexThreadExecute); pthread_rwlock_wrlock(this->rwlockCoreExecute); [this->cdsCore setIsInDebugTrap:NO]; } #pragma mark - GDB Stub implementation void* createThread_gdb(void (*thread_function)( void *data),void *thread_data) { // Create the thread using POSIX routines. pthread_attr_t attr; pthread_t* posixThreadID = (pthread_t*)malloc(sizeof(pthread_t)); assert(!pthread_attr_init(&attr)); assert(!pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE)); int threadError = pthread_create(posixThreadID, &attr, (void* (*)(void *))thread_function, thread_data); assert(!pthread_attr_destroy(&attr)); if (threadError != 0) { // Report an error. return NULL; } else { return posixThreadID; } } void joinThread_gdb(void *thread_handle) { pthread_join(*((pthread_t*)thread_handle), NULL); free(thread_handle); } desmume-0.9.11/src/cocoa/cocoa_file.mm0000755000000000000000000010717112467662066016261 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_file.h" #include #import "cocoa_globals.h" #import "cocoa_util.h" #include "../NDSSystem.h" #include "../MMU.h" #include "../movie.h" #include "../path.h" #include "../saves.h" #undef BOOL @implementation CocoaDSFile // Global dictionary that can be used for storing URLs. // // Usually, it's best to add directory paths to FileTypeInfo.plist, and then // use directoryByKind:version:port for getting a URL, but this method only // works for application build targets. Other target types, such as plug-in // targets, don't read FileTypeInfo.plist correctly, so we include a global // URL dictionary so that we can manually set and get URLs at runtime. static NSMutableDictionary *_gURLDictionary = nil; /******************************************************************************************** URLDictionary Returns the global URL dictionary. Takes: Nothing. Returns: A reference to the NSMutableDictionary URLDictionary. Details: This should always be used for getting the global URL dictionary. Never try to reference the global URL dictionary directly, since this may change between versions. The first time this method is called, it will automatically allocate the memory for the global URL dictionary. ********************************************************************************************/ + (NSMutableDictionary *) URLDictionary { if (_gURLDictionary == nil) { _gURLDictionary = [[NSMutableDictionary alloc] initWithCapacity:8]; } return _gURLDictionary; } /******************************************************************************************** addURLToURLDictionary:groupKey:fileKind: Adds a URL to the global URL dictionary. Takes: theURL - An NSURL used to store a URL into the dictionary. groupKey - An NSString that represents the key used to group a set URLs together. fileKind - An NSString that represents the file type. Returns: Nothing. Details: This should always be used for adding a URL to the global URL dictionary. Never try to add a URL directly, since this may change between versions. ********************************************************************************************/ + (void) addURLToURLDictionary:(NSURL *)theURL groupKey:(NSString *)groupKey fileKind:(NSString *)fileKind { if (theURL == nil || groupKey == nil || fileKind == nil) { return; } NSMutableDictionary *urlDictionary = [CocoaDSFile URLDictionary]; NSMutableDictionary *groupDictionary = (NSMutableDictionary *)[urlDictionary valueForKey:groupKey]; if (groupDictionary == nil) { groupDictionary = [NSMutableDictionary dictionaryWithCapacity:16]; [urlDictionary setValue:groupDictionary forKey:groupKey]; } [groupDictionary setValue:theURL forKey:fileKind]; } /******************************************************************************************** removeURLFromURLDictionaryByGroupKey:fileKind: Removes a URL from the global URL dictionary. Takes: groupKey - An NSString that represents the key used to group a set URLs together. fileKind - An NSString that represents the file type. Returns: Nothing. Details: This should always be used for removing a URL from the global URL dictionary. Never try to remove a URL directly, since this may change between versions. ********************************************************************************************/ + (void) removeURLFromURLDictionaryByGroupKey:(NSString *)groupKey fileKind:(NSString *)fileKind { if (groupKey == nil || fileKind == nil) { return; } NSMutableDictionary *urlDictionary = [CocoaDSFile URLDictionary]; NSMutableDictionary *groupDictionary = (NSMutableDictionary *)[urlDictionary valueForKey:groupKey]; if (groupDictionary != nil) { [groupDictionary setValue:nil forKey:fileKind]; } } + (BOOL) loadState:(NSURL *)saveStateURL { BOOL result = NO; if (saveStateURL == nil) { return result; } const char *statePath = [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding]; bool cResult = savestate_load(statePath); if(cResult) { result = YES; } return result; } + (BOOL) saveState:(NSURL *)saveStateURL { BOOL result = NO; if (saveStateURL == nil) { return result; } const char *statePath = [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding]; bool cResult = savestate_save(statePath); if(cResult) { result = YES; } return result; } + (BOOL) loadRom:(NSURL *)romURL { BOOL result = NO; if (romURL == nil) { return result; } const char *romPath = [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding]; NSInteger resultCode = NDS_LoadROM(romPath, NULL, NULL); if (resultCode > 0) { result = YES; } return result; } + (BOOL) loadReplay:(NSURL *)replayURL { BOOL result = NO; if (replayURL == nil) { return result; } const char *replayPath = [[replayURL path] cStringUsingEncoding:NSUTF8StringEncoding]; const char *resultCode = FCEUI_LoadMovie(replayPath, true, false, -1); if (resultCode == NULL) { result = YES; } return result; } + (BOOL) importRomSave:(NSURL *)romSaveURL { BOOL result = NO; const char *romSavePath = [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding]; NSInteger resultCode = MMU_new.backupDevice.importData(romSavePath, 0); if (resultCode == 0) { return result; } result = YES; return result; } + (BOOL) exportRomSaveToURL:(NSURL *)destinationURL romSaveURL:(NSURL *)romSaveURL fileType:(NSInteger)fileTypeID { BOOL result = NO; switch (fileTypeID) { #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 case ROMSAVEFORMAT_DESMUME: { NSString *destinationPath = [[destinationURL path] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager copyItemAtPath:[romSaveURL path] toPath:destinationPath error:nil]; [fileManager release]; break; } #endif case ROMSAVEFORMAT_NOGBA: { const char *destinationPath = [[[destinationURL path] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE_NOGBA] cStringUsingEncoding:NSUTF8StringEncoding]; bool resultCode = MMU_new.backupDevice.exportData(destinationPath); if (resultCode) { result = YES; } break; } case ROMSAVEFORMAT_RAW: { const char *destinationPath = [[[destinationURL path] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE_RAW] cStringUsingEncoding:NSUTF8StringEncoding]; bool resultCode = MMU_new.backupDevice.exportData(destinationPath); if (resultCode) { result = YES; } break; } default: break; } return result; } + (NSURL *) romSaveURLFromRomURL:(NSURL *)romURL { return [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE]]; } + (NSURL *) cheatsURLFromRomURL:(NSURL *)romURL { return [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:@FILE_EXT_CHEAT]]; } + (BOOL) romSaveExists:(NSURL *)romURL { BOOL exists = NO; if (romURL == nil) { return exists; } NSString *romSavePath = [[CocoaDSFile fileURLFromRomURL:romURL toKind:@"ROM Save"] path]; NSFileManager *fileManager = [[NSFileManager alloc] init]; exists = [fileManager isReadableFileAtPath:romSavePath]; [fileManager release]; return exists; } + (BOOL) romSaveExistsWithRom:(NSURL *)romURL { BOOL exists = NO; if (romURL == nil) { return exists; } NSString *romSavePath = [[CocoaDSFile romSaveURLFromRomURL:romURL] path]; NSFileManager *fileManager = [[NSFileManager alloc] init]; exists = [fileManager isReadableFileAtPath:romSavePath]; [fileManager release]; return exists; } /******************************************************************************************** setupAllFilePaths Sets up all application file paths using the current version of the default port. Takes: Nothing. Returns: Nothing. Details: This method uses setupAllFilePathsForVersion:port: for its implementation. ********************************************************************************************/ + (void) setupAllFilePaths { [CocoaDSFile setupAllFilePathsForVersion:nil port:nil]; } /******************************************************************************************** setupAllFilePathsForVersion:port: Sets up all application file paths, reading the paths from FileTypeInfo.plist. Takes: versionString - An NSString that represents the application version. If nil is used, this method assumes the current version. portString - An NSString that represents the port version. If nil is used, this method assumes the default port version. Returns: Nothing. Details: This is an Objective-C to C wrapper function for assigning file paths to the emulation layer. ********************************************************************************************/ + (void) setupAllFilePathsForVersion:(NSString *)versionString port:(NSString *)portString { NSURL *romURL = [CocoaDSFile directoryURLByKind:@"ROM" version:versionString port:portString]; if (romURL != nil) { strlcpy(path.pathToRoms, [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *romSaveURL = [CocoaDSFile directoryURLByKind:@"ROM Save" version:versionString port:portString]; if (romSaveURL != nil) { strlcpy(path.pathToBattery, [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *saveStateURL = [CocoaDSFile directoryURLByKind:@"Save State" version:versionString port:portString]; if (saveStateURL != nil) { strlcpy(path.pathToStates, [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *screenshotURL = [CocoaDSFile directoryURLByKind:@"Screenshot" version:versionString port:portString]; if (screenshotURL != nil) { strlcpy(path.pathToScreenshots, [[screenshotURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *aviURL = [CocoaDSFile directoryURLByKind:@"Video" version:versionString port:portString]; if (aviURL != nil) { strlcpy(path.pathToAviFiles, [[aviURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *cheatURL = [CocoaDSFile directoryURLByKind:@"Cheat" version:versionString port:portString]; if (cheatURL != nil) { strlcpy(path.pathToCheats, [[cheatURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *soundSamplesURL = [CocoaDSFile directoryURLByKind:@"Sound Sample" version:versionString port:portString]; if (soundSamplesURL != nil) { strlcpy(path.pathToSounds, [[soundSamplesURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *firmwareURL = [CocoaDSFile directoryURLByKind:@"Firmware Configuration" version:versionString port:portString]; if (firmwareURL != nil) { strlcpy(path.pathToFirmware, [[firmwareURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *luaURL = [CocoaDSFile directoryURLByKind:@"Lua Script" version:versionString port:portString]; if (luaURL != nil) { strlcpy(path.pathToLua, [[luaURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } } /******************************************************************************************** setupAllFilePathsWithURLDictionary: Sets up all application file paths using the global URLDictionary. This method exists in the case where reading the paths from FileTypeInfo.plist impossible or impractical. Takes: URLDictionaryKey - An NSString that is a group key to the URLDictionary. Returns: Nothing. Details: This is an Objective-C to C wrapper function for assigning file paths to the emulation layer. ********************************************************************************************/ + (void) setupAllFilePathsWithURLDictionary:(NSString *)URLDictionaryKey { if (URLDictionaryKey == nil) { return; } NSDictionary *URLDictionary = (NSDictionary *)[(NSDictionary *)[CocoaDSFile URLDictionary] valueForKey:URLDictionaryKey]; NSURL *romURL = (NSURL *)[URLDictionary valueForKey:@"ROM"]; if (romURL != nil) { strlcpy(path.pathToRoms, [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *romSaveURL = (NSURL *)[URLDictionary valueForKey:@"ROM Save"]; if (romSaveURL != nil) { strlcpy(path.pathToBattery, [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *saveStateURL = (NSURL *)[URLDictionary valueForKey:@"Save State"]; if (saveStateURL != nil) { strlcpy(path.pathToStates, [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *screenshotURL = (NSURL *)[URLDictionary valueForKey:@"Screenshot"]; if (screenshotURL != nil) { strlcpy(path.pathToScreenshots, [[screenshotURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *aviURL = (NSURL *)[URLDictionary valueForKey:@"Video"]; if (aviURL != nil) { strlcpy(path.pathToAviFiles, [[aviURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *cheatURL = (NSURL *)[URLDictionary valueForKey:@"Cheat"]; if (cheatURL != nil) { strlcpy(path.pathToCheats, [[cheatURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *soundSamplesURL = (NSURL *)[URLDictionary valueForKey:@"Sound Sample"]; if (soundSamplesURL != nil) { strlcpy(path.pathToSounds, [[soundSamplesURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *firmwareURL = (NSURL *)[URLDictionary valueForKey:@"Firmware Configuration"]; if (firmwareURL != nil) { strlcpy(path.pathToFirmware, [[firmwareURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *luaURL = (NSURL *)[URLDictionary valueForKey:@"Lua Script"]; if (luaURL != nil) { strlcpy(path.pathToLua, [[luaURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } } + (BOOL) setupAllAppDirectories { BOOL result = YES; NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *pathDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSDictionary *pathVersionDict = (NSDictionary *)[pathDict valueForKey:currentVersion]; NSDictionary *pathPortDict = (NSDictionary *)[pathVersionDict valueForKey:@PORT_VERSION]; NSDictionary *dirNameDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DirectoryNames"]; NSDictionary *dirNameVersionDict = (NSDictionary *)[dirNameDict valueForKey:currentVersion]; NSDictionary *dirNamePortDict = (NSDictionary *)[dirNameVersionDict valueForKey:@PORT_VERSION]; NSArray *fileKindList = [pathPortDict allKeys]; #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 // Mac OS X v10.4 and earlier. NSEnumerator *enumerator = [fileKindList objectEnumerator]; NSString *fileKind; while ((fileKind = (NSString *)[enumerator nextObject]) != nil) #else // Mac OS X v10.5 and later. for (NSString *fileKind in fileKindList) #endif { NSString *dirPath = (NSString *)[pathPortDict valueForKey:fileKind]; NSString *dirName = (NSString *)[dirNamePortDict valueForKey:fileKind]; if ([dirPath isEqualToString:@PATH_USER_APP_SUPPORT]) { if (![CocoaDSFile createUserAppSupportDirectory:dirName]) { result = NO; } } else if ([dirPath isEqualToString:@PATH_OPEN_EMU]) { // OpenEmu uses its own directory structure, so no need to setup here. continue; } else if ([dirPath isEqualToString:@PATH_WITH_ROM]) { continue; } else { // TODO: Setup directory when using an absolute path. } } return result; } + (NSURL *) saveStateURL { return [CocoaDSFile directoryURLByKind:@"Save State"]; } + (BOOL) saveScreenshot:(NSURL *)fileURL bitmapData:(NSBitmapImageRep *)bitmapImageRep fileType:(NSBitmapImageFileType)fileType { BOOL result = NO; if (fileURL == nil || bitmapImageRep == nil) { return result; } NSString *fileExt = nil; switch (fileType) { case NSTIFFFileType: fileExt = @"tiff"; break; case NSBMPFileType: fileExt = @"bmp"; break; case NSGIFFileType: fileExt = @"gif"; break; case NSJPEGFileType: fileExt = @"jpg"; break; case NSPNGFileType: fileExt = @"png"; break; case NSJPEG2000FileType: fileExt = @"jp2"; break; default: break; } NSURL *saveFileURL = [NSURL fileURLWithPath:[[fileURL path] stringByAppendingPathExtension:fileExt]]; result = [[bitmapImageRep representationUsingType:fileType properties:[NSDictionary dictionary]] writeToURL:saveFileURL atomically:NO]; return result; } /******************************************************************************************** fileKindByURL: Determines a DeSmuME file's type, and returns a description as a string. Takes: fileURL - An NSURL that points to a file. Returns: An NSString representing the file type. The NSString will be nil if the file type is not recognized as a DeSmuME file. Details: This is not the most reliable method for determining a file's type. The current implementation simply checks the file extension to determine the file type. Future implementations could be made more reliable by actually opening the file and validating some header info. ********************************************************************************************/ + (NSString *) fileKindByURL:(NSURL *)fileURL { return [CocoaDSFile fileKindByURL:fileURL version:nil port:nil]; } + (NSString *) fileKindByURL:(NSURL *)fileURL version:(NSString *)versionString port:(NSString *)portString { NSString *fileKind = nil; if (fileURL == nil) { return fileKind; } NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *fileTypeExtDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"FileTypeByExtensions"]; NSDictionary *versionDict = (NSDictionary *)[fileTypeExtDict valueForKey:lookupVersionStr]; NSDictionary *portDict = (NSDictionary *)[versionDict valueForKey:lookupPortStr]; NSString *fileExt = [[fileURL path] pathExtension]; fileKind = (NSString *)[portDict valueForKey:fileExt]; if (fileKind == nil) { if ([CocoaDSFile isSaveStateSlotExtension:fileExt]) { fileKind = (NSString *)[portDict valueForKey:@FILE_EXT_SAVE_STATE]; } } return fileKind; } + (NSString *) fileVersionByURL:(NSURL *)fileURL { NSString *fileVersion = @"Unknown Version"; if (fileURL == nil) { return fileVersion; } NSString *versionStr = nil; NSString *portStr = nil; NSString *filePath = [fileURL path]; NSURL *versionURL = nil; NSString *versionPath = @PATH_CONFIG_DIRECTORY_0_9_6; versionPath = [versionPath stringByExpandingTildeInPath]; if ([[filePath stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.6"; portStr = @"GTK"; } versionURL = [CocoaDSFile userAppSupportURL:nil version:@"0.9.7"]; versionPath = [versionURL path]; if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.7"; portStr = @"Cocoa"; } versionURL = [CocoaDSFile userAppSupportURL:nil version:@"0.9.8"]; versionPath = [versionURL path]; if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.8"; portStr = @"Cocoa"; } versionURL = [CocoaDSFile userAppSupportURL:nil version:@"0.9.9"]; versionPath = [versionURL path]; if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.9"; portStr = @"Cocoa"; } versionURL = [CocoaDSFile userAppSupportURL:nil version:@"0.9.10"]; versionPath = [versionURL path]; if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.10"; portStr = @"Cocoa"; } fileVersion = [[versionStr stringByAppendingString:@" "] stringByAppendingString:portStr]; return fileVersion; } + (BOOL) fileExistsForCurrent:(NSURL *)fileURL { BOOL result = NO; if (fileURL == nil) { return result; } NSString *filePath = [[CocoaDSFile directoryURLByKind:[CocoaDSFile fileKindByURL:fileURL]] path]; filePath = [filePath stringByAppendingPathComponent:[[fileURL path] lastPathComponent]]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager fileExistsAtPath:filePath]; [fileManager release]; return result; } + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind { return [CocoaDSFile fileURLFromRomURL:romURL toKind:fileKind version:nil port:nil]; } + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { NSURL *fileURL = nil; NSString *fileExt = [CocoaDSFile fileExtensionByKind:fileKind version:versionString port:portString]; if (fileExt == nil) { return fileURL; } if ([CocoaDSFile isFileKindWithRom:fileKind]) { fileURL = [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:fileExt]]; } else { NSURL *dirURL = [CocoaDSFile directoryURLByKind:fileKind version:versionString port:portString]; if (dirURL != nil) { NSString *newFileName = [[[[romURL path] lastPathComponent] stringByDeletingPathExtension] stringByAppendingPathExtension:fileExt]; fileURL = [NSURL fileURLWithPath:[[dirURL path] stringByAppendingPathComponent:newFileName]]; } } return fileURL; } + (NSString *) fileExtensionByKind:(NSString *)fileKind { return [CocoaDSFile fileExtensionByKind:fileKind version:nil port:nil]; } + (NSString *) fileExtensionByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { NSString *fileExt = nil; if (fileKind == nil) { return fileExt; } NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *fileExtDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"FileExtensionByTypes"]; NSDictionary *versionDict = (NSDictionary *)[fileExtDict valueForKey:lookupVersionStr]; NSDictionary *portDict = (NSDictionary *)[versionDict valueForKey:lookupPortStr]; fileExt = (NSString *)[portDict valueForKey:fileKind]; return fileExt; } + (NSURL *) directoryURLByKind:(NSString *)fileKind { return [CocoaDSFile directoryURLByKind:fileKind version:nil port:nil]; } + (NSURL *) directoryURLByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { NSURL *fileURL = nil; NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *pathDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSDictionary *pathVersionDict = (NSDictionary *)[pathDict valueForKey:lookupVersionStr]; NSDictionary *pathPortDict = (NSDictionary *)[pathVersionDict valueForKey:lookupPortStr]; NSDictionary *dirNameDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DirectoryNames"]; NSDictionary *dirNameVersionDict = (NSDictionary *)[dirNameDict valueForKey:lookupVersionStr]; NSDictionary *dirNamePortDict = (NSDictionary *)[dirNameVersionDict valueForKey:lookupPortStr]; NSString *dirPath = (NSString *)[pathPortDict valueForKey:fileKind]; if (dirPath != nil) { NSString *dirName = (NSString *)[dirNamePortDict valueForKey:fileKind]; if ([dirPath isEqualToString:@PATH_USER_APP_SUPPORT]) { fileURL = [CocoaDSFile userAppSupportURL:dirName version:lookupVersionStr]; } else if ([dirPath isEqualToString:@PATH_OPEN_EMU]) { NSMutableDictionary *urlDictionary = (NSMutableDictionary *)[[CocoaDSFile URLDictionary] valueForKey:dirPath]; if (urlDictionary != nil) { fileURL = (NSURL *)[urlDictionary valueForKey:fileKind]; } } else if ([dirPath isEqualToString:@PATH_WITH_ROM]) { return fileURL; } else { fileURL = [NSURL fileURLWithPath:[dirPath stringByExpandingTildeInPath]]; } } return fileURL; } + (BOOL) isFileKindWithRom:(NSString *)fileKind { return [CocoaDSFile isFileKindWithRom:fileKind version:nil port:nil]; } + (BOOL) isFileKindWithRom:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { BOOL result = NO; NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *pathDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSDictionary *pathVersionDict = (NSDictionary *)[pathDict valueForKey:lookupVersionStr]; NSDictionary *pathPortDict = (NSDictionary *)[pathVersionDict valueForKey:lookupPortStr]; NSString *dirPath = (NSString *)[pathPortDict valueForKey:fileKind]; if ([dirPath isEqualToString:@PATH_WITH_ROM]) { result = YES; } return result; } + (BOOL) saveStateExistsForSlot:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber { BOOL exists = NO; NSString *fileKind = @"Save State"; NSString *saveStateFilePath = nil; if (romURL == nil) { return exists; } if (slotNumber == 10) { slotNumber = 0; } NSString *saveStateFileName = [CocoaDSFile saveSlotFileName:romURL slotNumber:slotNumber]; if (saveStateFileName == nil) { return exists; } if ([CocoaDSFile isFileKindWithRom:fileKind]) { saveStateFilePath = [[[romURL path] stringByDeletingLastPathComponent] stringByAppendingPathComponent:saveStateFileName]; } else { NSURL *dirURL = [CocoaDSFile directoryURLByKind:fileKind]; if (dirURL != nil) { saveStateFilePath = [[dirURL path] stringByAppendingPathComponent:saveStateFileName]; } } NSFileManager *fileManager = [[NSFileManager alloc] init]; exists = [fileManager isReadableFileAtPath:saveStateFilePath]; [fileManager release]; return exists; } /******************************************************************************************** isSaveStateSlotExtension: Determines if a given extension represents a save state file type. Takes: extension - An NSString representing the file extension. Returns: A BOOL indicating if extension represents a save state file type. Details: Save state file extensions are represented by .ds#, where # is an integer that is greater than or equal to 0. ********************************************************************************************/ + (BOOL) isSaveStateSlotExtension:(NSString *)extension { BOOL result = NO; if ([extension length] < 3 || ![extension hasPrefix:@"ds"]) { return result; } NSString *slotNum = [extension substringFromIndex:2]; if ([slotNum isEqualToString:@"0"]) { result = YES; } else if ([slotNum intValue] != 0) { result = YES; } return result; } + (NSString *) saveSlotFileName:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber { if (romURL == nil) { return nil; } if (slotNumber == 10) { slotNumber = 0; } NSString *romFileName = [[romURL path] lastPathComponent]; NSString *fileExt = [NSString stringWithFormat:@"ds%ld", (unsigned long)slotNumber]; return [[romFileName stringByDeletingPathExtension] stringByAppendingPathExtension:fileExt]; } + (NSURL *) userAppSupportBaseURL { NSURL *userAppSupportURL = nil; NSString *userAppSupportPath = nil; NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); if ([savePaths count] == 0) { return userAppSupportURL; } userAppSupportPath = [[savePaths objectAtIndex:0] stringByAppendingPathComponent:appName]; userAppSupportURL = [NSURL fileURLWithPath:userAppSupportPath]; return userAppSupportURL; } + (NSURL *) userAppSupportURL:(NSString *)directoryName version:(NSString *)versionString { NSURL *userAppSupportURL = [CocoaDSFile userAppSupportBaseURL]; if (userAppSupportURL == nil) { return userAppSupportURL; } NSString *userAppSupportPath = [userAppSupportURL path]; NSString *versionStringForURL = versionString; // If nil is passed in for appVersion, then just use the current app version. if (versionStringForURL == nil) { versionStringForURL = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } userAppSupportPath = [userAppSupportPath stringByAppendingPathComponent:versionStringForURL]; if (directoryName != nil) { userAppSupportPath = [userAppSupportPath stringByAppendingPathComponent:directoryName]; } userAppSupportURL = [NSURL fileURLWithPath:userAppSupportPath]; return userAppSupportURL; } + (BOOL) createUserAppSupportDirectory:(NSString *)directoryName { BOOL result = NO; NSString *tempPath = nil; NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; if (directoryName == nil) { return result; } NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); if ([savePaths count] > 0) { tempPath = [savePaths objectAtIndex:0]; } else { return result; } NSFileManager *fileManager = [[NSFileManager alloc] init]; #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 // Mac OS X v10.4 and earlier. BOOL isDir = YES; tempPath = [tempPath stringByAppendingPathComponent:appName]; result = [fileManager createDirectoryAtPath:tempPath attributes:nil]; if (!result) { if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir]) { [fileManager release]; return result; } } tempPath = [tempPath stringByAppendingPathComponent:appVersion]; result = [fileManager createDirectoryAtPath:tempPath attributes:nil]; if (!result) { if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir]) { [fileManager release]; return result; } } tempPath = [tempPath stringByAppendingPathComponent:directoryName]; result = [fileManager createDirectoryAtPath:tempPath attributes:nil]; if (!result) { if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir]) { [fileManager release]; return result; } } /* In Mac OS X v10.4 and earlier, having the File Manager create new directories where they already exist returns NO. Note that this behavior is not per Apple's own documentation. Therefore, we manually set result=YES at the end to make sure the function returns the right result. */ result = YES; #else // Mac OS X v10.5 and later. Yes, the code is this simple... tempPath = [tempPath stringByAppendingPathComponent:appName]; tempPath = [tempPath stringByAppendingPathComponent:appVersion]; tempPath = [tempPath stringByAppendingPathComponent:directoryName]; result = [fileManager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:NULL]; #endif [fileManager release]; return result; } + (NSURL *) lastLoadedRomURL { return [[[NSDocumentController sharedDocumentController] recentDocumentURLs] objectAtIndex:0]; } #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 + (BOOL) moveFileToCurrentDirectory:(NSURL *)fileURL { BOOL result = NO; if (fileURL == nil) { return result; } NSString *newLocationPath = [[CocoaDSFile directoryURLByKind:[CocoaDSFile fileKindByURL:fileURL]] path]; if (newLocationPath == nil) { return result; } NSString *filePath = [fileURL path]; newLocationPath = [newLocationPath stringByAppendingPathComponent:[filePath lastPathComponent]]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager moveItemAtPath:filePath toPath:newLocationPath error:nil]; [fileManager release]; return result; } + (BOOL) copyFileToCurrentDirectory:(NSURL *)fileURL { BOOL result = NO; if (fileURL == nil) { return result; } NSString *newLocationPath = [[CocoaDSFile directoryURLByKind:[CocoaDSFile fileKindByURL:fileURL]] path]; if (newLocationPath == nil) { return result; } NSString *filePath = [fileURL path]; newLocationPath = [newLocationPath stringByAppendingPathComponent:[filePath lastPathComponent]]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager copyItemAtPath:filePath toPath:newLocationPath error:nil]; [fileManager release]; return result; } + (NSMutableArray *) appFileList:(NSURL *)directoryURL { return [self appFileList:directoryURL fileKind:nil]; } + (NSMutableArray *) appFileList:(NSURL *)directoryURL fileKind:(NSString *)theFileKind { NSMutableArray *outArray = nil; if (directoryURL == nil) { return outArray; } NSString *directoryPath = [directoryURL path]; NSFileManager *fileManager = [[NSFileManager alloc] init]; NSArray *fileList = [fileManager contentsOfDirectoryAtPath:directoryPath error:nil]; if (fileList == nil) { [fileManager release]; return outArray; } outArray = [NSMutableArray arrayWithCapacity:100]; if (outArray == nil) { [fileManager release]; return outArray; } for (NSString *fileName in fileList) { NSNumber *willMigrate = [NSNumber numberWithBool:NO]; NSString *filePath = [directoryPath stringByAppendingPathComponent:fileName]; NSURL *fileURL = [NSURL fileURLWithPath:filePath]; NSString *fileVersion = [CocoaDSFile fileVersionByURL:fileURL]; NSString *fileKind = [CocoaDSFile fileKindByURL:fileURL]; if (fileKind == nil || (theFileKind != nil && ![theFileKind isEqualToString:fileKind]) || [CocoaDSFile fileExistsForCurrent:fileURL]) { continue; } NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:filePath error:nil]; NSMutableDictionary *finalDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: willMigrate, @"willMigrate", fileName, @"name", fileVersion, @"version", fileKind, @"kind", [fileAttributes fileModificationDate], @"dateModified", [fileURL absoluteString], @"URL", nil]; [outArray addObject:finalDict]; } [fileManager release]; return outArray; } #endif @end desmume-0.9.11/src/cocoa/cocoa_core.h0000755000000000000000000001205712467662066016106 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import #include #include #include #import "cocoa_util.h" @class CocoaDSCore; @class CocoaDSController; @class CocoaDSFirmware; @class CocoaDSGPU; @class CocoaDSOutput; typedef void *gdbstub_handle_t; typedef struct { CocoaDSCore *cdsCore; int state; bool isFrameSkipEnabled; size_t frameCount; NSUInteger frameJumpTarget; int framesToSkip; uint64_t timeBudgetMachAbsTime; pthread_mutex_t mutexOutputList; pthread_mutex_t mutexThreadExecute; pthread_cond_t condThreadExecute; pthread_rwlock_t rwlockCoreExecute; } CoreThreadParam; @interface CocoaDSCore : NSObject { CocoaDSController *cdsController; CocoaDSFirmware *cdsFirmware; CocoaDSGPU *cdsGPU; NSMutableArray *cdsOutputList; pthread_t coreThread; CoreThreadParam threadParam; NSInteger prevCoreState; BOOL isSpeedLimitEnabled; CGFloat speedScalar; std::string _slot1R4Path; BOOL isGdbStubStarted; BOOL isInDebugTrap; BOOL enableGdbStubARM9; BOOL enableGdbStubARM7; NSUInteger gdbStubPortARM9; NSUInteger gdbStubPortARM7; volatile gdbstub_handle_t gdbStubHandleARM9; volatile gdbstub_handle_t gdbStubHandleARM7; NSUInteger emulationFlags; BOOL emuFlagAdvancedBusLevelTiming; BOOL emuFlagRigorousTiming; BOOL emuFlagUseExternalBios; BOOL emuFlagEmulateBiosInterrupts; BOOL emuFlagPatchDelayLoop; BOOL emuFlagUseExternalFirmware; BOOL emuFlagFirmwareBoot; BOOL emuFlagDebugConsole; BOOL emuFlagEmulateEnsata; NSInteger cpuEmulationEngine; NSInteger slot1DeviceType; NSString *slot1StatusText; NSString *frameStatus; NSString *executionSpeedStatus; NSURL *slot1R4URL; OSSpinLock spinlockCdsController; OSSpinLock spinlockMasterExecute; OSSpinLock spinlockExecutionChange; OSSpinLock spinlockCheatEnableFlag; OSSpinLock spinlockEmulationFlags; OSSpinLock spinlockCPUEmulationEngine; } @property (retain) CocoaDSController *cdsController; @property (retain) CocoaDSFirmware *cdsFirmware; @property (retain) CocoaDSGPU *cdsGPU; @property (assign) NSMutableArray *cdsOutputList; @property (assign) BOOL masterExecute; @property (assign) BOOL isFrameSkipEnabled; @property (assign) NSInteger coreState; @property (assign) BOOL isSpeedLimitEnabled; @property (assign) BOOL isCheatingEnabled; @property (assign) CGFloat speedScalar; @property (assign) BOOL isGdbStubStarted; @property (assign) BOOL isInDebugTrap; @property (assign) BOOL enableGdbStubARM9; @property (assign) BOOL enableGdbStubARM7; @property (assign) NSUInteger gdbStubPortARM9; @property (assign) NSUInteger gdbStubPortARM7; @property (assign) NSUInteger emulationFlags; @property (assign) BOOL emuFlagAdvancedBusLevelTiming; @property (assign) BOOL emuFlagRigorousTiming; @property (assign) BOOL emuFlagUseExternalBios; @property (assign) BOOL emuFlagEmulateBiosInterrupts; @property (assign) BOOL emuFlagPatchDelayLoop; @property (assign) BOOL emuFlagUseExternalFirmware; @property (assign) BOOL emuFlagFirmwareBoot; @property (assign) BOOL emuFlagDebugConsole; @property (assign) BOOL emuFlagEmulateEnsata; @property (assign) NSInteger cpuEmulationEngine; @property (assign) NSInteger maxJITBlockSize; @property (assign) NSInteger slot1DeviceType; @property (assign) NSString *slot1StatusText; @property (assign) NSString *frameStatus; @property (assign) NSString *executionSpeedStatus; @property (copy) NSURL *arm9ImageURL; @property (copy) NSURL *arm7ImageURL; @property (copy) NSURL *firmwareImageURL; @property (retain) NSURL *slot1R4URL; @property (readonly) pthread_rwlock_t *rwlockCoreExecute; - (BOOL) ejectCardFlag; - (void) setEjectCardFlag; - (void) slot1Eject; - (void) changeRomSaveType:(NSInteger)saveTypeID; - (void) changeExecutionSpeed; - (void) applyDynaRec; - (BOOL) applySlot1Device; - (void) restoreCoreState; - (void) reset; - (NSUInteger) frameNumber; - (void) frameJumpTo:(NSUInteger)targetFrameNum; - (void) frameJump:(NSUInteger)relativeFrameNum; - (void) addOutput:(CocoaDSOutput *)theOutput; - (void) removeOutput:(CocoaDSOutput *)theOutput; - (void) removeAllOutputs; - (NSString *) cpuEmulationEngineString; - (NSString *) slot1DeviceTypeString; - (NSString *) slot2DeviceTypeString; - (BOOL) startReplayRecording:(NSURL *)fileURL sramURL:(NSURL *)sramURL; - (void) stopReplay; @end static void* RunCoreThread(void *arg); static int CalculateFrameSkip(uint64_t timeBudgetMachAbsTime, uint64_t frameStartMachAbsTime); uint64_t GetFrameAbsoluteTime(const double frameTimeScalar); desmume-0.9.11/src/cocoa/Makefile.am0000755000000000000000000000253212467662066015672 0ustar rootrootEXTRA_DIST = cocoa_util.m DeSmuME.cbp globals.h main.mm main_window.h main_window.mm nds_control.h nds_control.mm preferences.mm \ about.m DeSmuME.icns Info.plist InfoPlist.strings input.h input.mm \ makeapp.sh PkgInfo preferences.h screenshot.h screenshot.mm \ screen_state.h screen_state.m sndOSX.h sndOSX.mm video_output_view.h video_output_view.mm \ DeSmuME.xcodeproj/project.pbxproj Rakefile \ dialogs/rom_info.h dialogs/rom_info.m dialogs/speed_limit_selection_window.h dialogs/speed_limit_selection_window.mm \ translations/English.lproj/Localizable.strings translations/English.lproj/MainMenu.nib/classes.nib \ translations/English.lproj/MainMenu.nib/info.nib translations/English.lproj/MainMenu.nib/keyedobjects.nib \ translations/French.lproj/Localizable.strings translations/French.lproj/MainMenu.nib/classes.nib \ translations/French.lproj/MainMenu.nib/info.nib translations/French.lproj/MainMenu.nib/keyedobjects.nib \ translations/Italian.lproj/Localizable.strings translations/Italian.lproj/MainMenu.nib/classes.nib \ translations/Italian.lproj/MainMenu.nib/info.nib translations/Italian.lproj/MainMenu.nib/keyedobjects.nib \ translations/Japanese.lproj/Localizable.strings translations/Japanese.lproj/MainMenu.nib/classes.nib \ translations/Japanese.lproj/MainMenu.nib/info.nib translations/Japanese.lproj/MainMenu.nib/keyedobjects.nib desmume-0.9.11/src/cocoa/input_legacy.h0000755000000000000000000000326412467662066016475 0ustar rootroot/* Copyright (C) 2007 Jeff Bland This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #import /* The main window class instanciates an input object, and places it after the window in the responder chain, so any events not handled by a the window get sent here. */ @class VideoOutputWindow; @class CocoaDSController; @interface ControlsDelegate : NSObject {} + (id)sharedObject; @end @interface InputHandler : NSResponder { @private VideoOutputWindow *my_ds; CocoaDSController *cdsController; } //preferences + (NSView*)createPreferencesView:(float)width; + (NSDictionary*)appDefaults; //creation/deletion - (id) initWithCdsController:(CocoaDSController *)theController; - (void) setCdsController:(CocoaDSController *)theController; - (CocoaDSController *) cdsController; //keyboard input - (void)keyDown:(NSEvent*)event; - (void)keyUp:(NSEvent*)event; @end #ifdef __cplusplus extern "C" { #endif int testKey(NSString *chars_pressed, NSString *chars_for_key); #ifdef __cplusplus } #endif desmume-0.9.11/src/cocoa/Info (Debug).plist0000755000000000000000000003032412467662066016736 0ustar rootroot CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions nds CFBundleTypeIconFile AppIcon_NintendoDS_ROM.icns CFBundleTypeName Nintendo DS ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions ds.gba CFBundleTypeIconFile AppIcon_NintendoGBA_ROM.icns CFBundleTypeName Gameboy Advance ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dst CFBundleTypeIconFile AppIcon_SaveState.icns CFBundleTypeName DeSmuME Save State CFBundleTypeRole Editor LSItemContentTypes com.desmume.savestate LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dsv CFBundleTypeIconFile AppIcon_ROMSave.icns CFBundleTypeName DeSmuME ROM Save CFBundleTypeRole Editor LSItemContentTypes com.desmume.romsave LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dfc CFBundleTypeIconFile AppIcon_FirmwareConfig.icns CFBundleTypeName DeSmuME Firmware Configuration CFBundleTypeRole Editor LSItemContentTypes com.desmume.firmwareconfig LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dct CFBundleTypeIconFile AppIcon_ROMCheats.icns CFBundleTypeName DeSmuME ROM Cheats CFBundleTypeRole Editor LSItemContentTypes com.desmume.romcheats LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions sav CFBundleTypeIconFile AppIcon_NoGBA_ROMSave.icns CFBundleTypeName No$GBA ROM Save CFBundleTypeRole Viewer LSItemContentTypes de.emubase.nocash.romsave.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions duc CFBundleTypeIconFile AppIcon_ActionReplaySave.icns CFBundleTypeName Action Replay Save CFBundleTypeRole Viewer LSItemContentTypes com.codejunkies.actionreplay.save.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions bin CFBundleTypeIconFile AppIcon_HWImage_NDS.icns CFBundleTypeName Nintendo DS Hardware Image CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.hwimage.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions xml CFBundleTypeIconFile AppIcon_ADVANsCEneDatabase.icns CFBundleTypeName ADVANsCEne Database CFBundleTypeRole Viewer LSItemContentTypes com.advanscene.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dat CFBundleTypeIconFile AppIcon_R4CheatDatabase.icns CFBundleTypeName R4 Cheats Database CFBundleTypeRole Viewer LSItemContentTypes net.gbatemp.cheats.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleExecutable ${PRODUCT_NAME} CFBundleIconFile AppIcon_DeSmuME CFBundleIdentifier org.desmume.DeSmuME CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString v0.9.11 (Debug) CFBundleSignature DSmM CFBundleVersion 0.9.11 LSApplicationCategoryType public.app-category.entertainment LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright Copyright Âİ2007-2015 DeSmuME Team. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass NSApplication UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription DeSmuME Save State UTTypeIconFile AppIcon_SaveState.icns UTTypeIdentifier com.desmume.savestate UTTypeTagSpecification public.filename-extension dst UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Save UTTypeIconFile AppIcon_ROMSave.icns UTTypeIdentifier com.desmume.romsave UTTypeTagSpecification public.filename-extension dsv UTTypeConformsTo public.data UTTypeDescription DeSmuME Firmware Configuration UTTypeIconFile AppIcon_FirmwareConfig.icns UTTypeIdentifier com.desmume.firmwareconfig UTTypeTagSpecification public.filename-extension dfc UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Cheats UTTypeIconFile AppIcon_ROMCheats.icns UTTypeIdentifier com.desmume.romcheats UTTypeTagSpecification public.filename-extension dct UTImportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription Nintendo DS ROM UTTypeIconFile AppIcon_NintendoDS_ROM.icns UTTypeIdentifier com.nintendo.rom.ds UTTypeTagSpecification public.filename-extension nds UTTypeConformsTo public.data UTTypeDescription Gameboy Advance ROM UTTypeIconFile AppIcon_NintendoGBA_ROM.icns UTTypeIdentifier com.nintendo.rom.gba UTTypeTagSpecification public.filename-extension ds.gba UTTypeConformsTo public.data UTTypeDescription No$GBA ROM Save UTTypeIconFile AppIcon_NoGBA_ROMSave.icns UTTypeIdentifier de.emubase.nocash.romsave.gba UTTypeTagSpecification public.filename-extension sav UTTypeConformsTo public.data UTTypeDescription Action Replay Save UTTypeIconFile AppIcon_ActionReplaySave.icns UTTypeIdentifier com.codejunkies.actionreplay.save.nintendo.ds UTTypeTagSpecification public.filename-extension duc UTTypeConformsTo public.data UTTypeDescription Nintendo DS Hardware Image UTTypeIconFile AppIcon_HWImage_NDS.icns UTTypeIdentifier com.nintendo.hwimage.ds UTTypeTagSpecification public.filename-extension bin UTTypeConformsTo public.xml UTTypeDescription ADVANsCEne Database UTTypeIconFile AppIcon_ADVANsCEneDatabase.icns UTTypeIdentifier com.advanscene.database.nintendo.ds UTTypeTagSpecification public.filename-extension xml UTTypeConformsTo public.data UTTypeDescription R4 Cheats Database UTTypeIconFile AppIcon_R4CheatDatabase.icns UTTypeIdentifier net.gbatemp.cheats.database.nintendo.ds UTTypeTagSpecification public.filename-extension dat desmume-0.9.11/src/cocoa/cocoa_firmware.mm0000755000000000000000000001677112467662066017163 0ustar rootroot/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #import "cocoa_firmware.h" #include "../NDSSystem.h" #include "../firmware.h" #undef BOOL @implementation CocoaDSFirmware @synthesize data; @dynamic consoleType; @dynamic nickname; @dynamic message; @dynamic favoriteColor; @dynamic birthday; @dynamic language; - (id)init { return [self initWithDictionary:nil]; } - (id) initWithDictionary:(NSDictionary *)fwDataDict { self = [super init]; if (self == nil) { return self; } pthread_mutex_init(&mutex, NULL); // Allocate our own firmware struct since we weren't provided with one. internalData = (struct NDS_fw_config_data *)malloc(sizeof(struct NDS_fw_config_data)); if (internalData == nil) { pthread_mutex_destroy(&mutex); [self release]; return nil; } NDS_FillDefaultFirmwareConfigData(internalData); data = internalData; [self setDataWithDictionary:fwDataDict]; return self; } - (id) initWithFirmwareData:(struct NDS_fw_config_data *)fwData { self = [super init]; if (self == nil) { return self; } pthread_mutex_init(&mutex, NULL); if (fwData == nil) { pthread_mutex_destroy(&mutex); [self release]; return nil; } // Set birth_year to the current year. NSDate *now = [[NSDate alloc] init]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"Y"]; birth_year = [[dateFormatter stringFromDate:now] integerValue]; [dateFormatter release]; [now release]; internalData = NULL; data = fwData; return self; } - (void)dealloc { free(internalData); internalData = NULL; pthread_mutex_destroy(&mutex); [super dealloc]; } - (void) setConsoleType:(NSInteger)theType { pthread_mutex_lock(&mutex); data->ds_type = (NDS_CONSOLE_TYPE)theType; pthread_mutex_unlock(&mutex); } - (NSInteger) consoleType { pthread_mutex_lock(&mutex); NSInteger theType = data->ds_type; pthread_mutex_unlock(&mutex); return theType; } - (void) setNickname:(NSString *)theNickname { pthread_mutex_lock(&mutex); if (theNickname != nil) { NSRange characterRange = {0, [theNickname length]}; if (characterRange.length > MAX_FW_NICKNAME_LENGTH) { characterRange.length = MAX_FW_NICKNAME_LENGTH; } [theNickname getBytes:&data->nickname[0] maxLength:(sizeof(UInt16) * characterRange.length) usedLength:NULL encoding:NSUTF16LittleEndianStringEncoding options:NSStringEncodingConversionAllowLossy range:characterRange remainingRange:NULL]; data->nickname_len = (u8)characterRange.length; } else { memset(&data->nickname[0], 0, sizeof(data->nickname)); data->nickname_len = 0; } pthread_mutex_unlock(&mutex); } - (NSString *) nickname { pthread_mutex_lock(&mutex); NSString *theNickname = [[[NSString alloc] initWithBytes:&data->nickname[0] length:(sizeof(UInt16) * data->nickname_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; pthread_mutex_unlock(&mutex); return theNickname; } - (void) setMessage:(NSString *)theMessage { pthread_mutex_lock(&mutex); if (theMessage != nil) { NSRange characterRange = {0, [theMessage length]}; if (characterRange.length > MAX_FW_MESSAGE_LENGTH) { characterRange.length = MAX_FW_MESSAGE_LENGTH; } [theMessage getBytes:&data->message[0] maxLength:(sizeof(UInt16) * characterRange.length) usedLength:NULL encoding:NSUTF16LittleEndianStringEncoding options:NSStringEncodingConversionAllowLossy range:characterRange remainingRange:NULL]; data->message_len = (u8)characterRange.length; } else { memset(&data->message[0], 0, sizeof(data->message)); data->message_len = 0; } pthread_mutex_unlock(&mutex); } - (NSString *) message { pthread_mutex_lock(&mutex); NSString *theMessage = [[[NSString alloc] initWithBytes:&data->message[0] length:(sizeof(UInt16) * data->message_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; pthread_mutex_unlock(&mutex); return theMessage; } - (void) setFavoriteColor:(NSInteger)colorID { pthread_mutex_lock(&mutex); data->fav_colour = (u8)colorID; pthread_mutex_unlock(&mutex); } - (NSInteger) favoriteColor { pthread_mutex_lock(&mutex); NSInteger theFavoriteColorID = data->fav_colour; pthread_mutex_unlock(&mutex); return theFavoriteColorID; } - (void) setBirthday:(NSDate *)theDate { pthread_mutex_lock(&mutex); if (theDate != nil) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"M"]; NSInteger theMonth = [[dateFormatter stringFromDate:theDate] integerValue]; [dateFormatter setDateFormat:@"d"]; NSInteger theDay = [[dateFormatter stringFromDate:theDate] integerValue]; [dateFormatter setDateFormat:@"Y"]; NSInteger theYear = [[dateFormatter stringFromDate:theDate] integerValue]; [dateFormatter release]; data->birth_month = (u8)theMonth; data->birth_day = (u8)theDay; birth_year = theYear; } else { data->birth_month = 1; data->birth_day = 1; birth_year = 1970; } pthread_mutex_unlock(&mutex); } - (NSDate *) birthday { pthread_mutex_lock(&mutex); NSDate *theBirthday = [NSDate dateWithString:[NSString stringWithFormat:@"%ld-%ld-%ld 12:00:00 +0000", (unsigned long)birth_year, (unsigned long)data->birth_month, (unsigned long)data->birth_day]]; pthread_mutex_unlock(&mutex); return theBirthday; } - (void) setLanguage:(NSInteger)languageID { pthread_mutex_lock(&mutex); data->language = (u8)languageID; pthread_mutex_unlock(&mutex); } - (NSInteger) language { pthread_mutex_lock(&mutex); NSInteger theLanguageID = data->language; pthread_mutex_unlock(&mutex); return theLanguageID; } - (void) update { // Write the attributes to the DS via the data struct. // We have make a copy of the struct and send that so that the firmware // changes get saved in CommonSettings.InternalFirmwareConf. pthread_mutex_lock(&mutex); struct NDS_fw_config_data newFirmwareData = *data; NDS_CreateDummyFirmware(&newFirmwareData); pthread_mutex_unlock(&mutex); } - (void) setDataWithDictionary:(NSDictionary *)dataDict { if (dataDict == nil) { return; } [self setConsoleType:[(NSNumber *)[dataDict valueForKey:@"ConsoleType"] integerValue]]; [self setNickname:(NSString *)[dataDict valueForKey:@"Nickname"]]; [self setMessage:(NSString *)[dataDict valueForKey:@"Message"]]; [self setFavoriteColor:[(NSNumber *)[dataDict valueForKey:@"FavoriteColor"] integerValue]]; [self setBirthday:(NSDate *)[dataDict valueForKey:@"Birthday"]]; [self setLanguage:[(NSNumber *)[dataDict valueForKey:@"Language"] integerValue]]; } - (NSDictionary *) dataDictionary { return [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInteger:[self consoleType]], @"ConsoleType", [self nickname], @"Nickname", [self message], @"Message", [NSNumber numberWithInteger:[self favoriteColor]], @"FavoriteColor", [self birthday], @"Birthday", [NSNumber numberWithInteger:[self language]], @"Language", nil]; } @end desmume-0.9.11/src/thumb_instructions.cpp0000755000000000000000000007767412467662066017244 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "armcpu.h" #include "instructions.h" #include #include "bios.h" #include "debug.h" #include "MMU.h" #include "NDSSystem.h" #include "MMU_timing.h" #define cpu (&ARMPROC) #define TEMPLATE template #define REG_NUM(i, n) (((i)>>n)&0x7) //----------------------------------------------------------------------------- // Undefined instruction //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_UND_THUMB(const u32 i) { INFO("THUMB%c: Undefined instruction: 0x%08X (%s) PC=0x%08X\n", cpu->proc_ID?'7':'9', cpu->instruction, decodeIntruction(true, cpu->instruction), cpu->instruct_adr); TRAPUNDEF(cpu); return 1; } //----------------------------------------------------------------------------- // LSL //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LSL_0(const u32 i) { cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_LSL(const u32 i) { u32 v = (i>>6) & 0x1F; cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], 32-v); cpu->R[REG_NUM(i, 0)] = (cpu->R[REG_NUM(i, 3)] << v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_LSL_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v<32) { cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], 32-v); cpu->R[REG_NUM(i, 0)] <<= v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v==32) cpu->CPSR.bits.C = BIT0(cpu->R[REG_NUM(i, 0)]); else cpu->CPSR.bits.C = 0; cpu->R[REG_NUM(i, 0)] = 0; cpu->CPSR.bits.N = 0; cpu->CPSR.bits.Z = 1; return 2; } //----------------------------------------------------------------------------- // LSR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LSR_0(const u32 i) { cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 3)]); cpu->R[REG_NUM(i, 0)] = 0; cpu->CPSR.bits.N = 0; cpu->CPSR.bits.Z = 1; return 1; } TEMPLATE static u32 FASTCALL OP_LSR(const u32 i) { u32 v = (i>>6) & 0x1F; cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], v-1); cpu->R[REG_NUM(i, 0)] = (cpu->R[REG_NUM(i, 3)] >> v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_LSR_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v<32) { cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1); cpu->R[REG_NUM(i, 0)] >>= v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v==32) cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]); else cpu->CPSR.bits.C = 0; cpu->R[REG_NUM(i, 0)] = 0; cpu->CPSR.bits.N = 0; cpu->CPSR.bits.Z = 1; return 2; } //----------------------------------------------------------------------------- // ASR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ASR_0(const u32 i) { cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 3)]); cpu->R[REG_NUM(i, 0)] = BIT31(cpu->R[REG_NUM(i, 3)])*0xFFFFFFFF; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_ASR(const u32 i) { u32 v = (i>>6) & 0x1F; cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], v-1); cpu->R[REG_NUM(i, 0)] = (u32)(((s32)cpu->R[REG_NUM(i, 3)]) >> v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_ASR_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v<32) { cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1); cpu->R[REG_NUM(i, 0)] = (u32)(((s32)cpu->R[REG_NUM(i, 0)]) >> v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->R[REG_NUM(i, 0)] = BIT31(cpu->R[REG_NUM(i, 0)])*0xFFFFFFFF; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } //----------------------------------------------------------------------------- // ADD //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ADD_IMM3(const u32 i) { u32 imm3 = (i >> 6) & 0x07; u32 Rn = cpu->R[REG_NUM(i, 3)]; if (imm3 == 0) // mov 2 { cpu->R[REG_NUM(i, 0)] = Rn; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; cpu->CPSR.bits.C = 0; cpu->CPSR.bits.V = 0; return 1; } cpu->R[REG_NUM(i, 0)] = Rn + imm3; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; cpu->CPSR.bits.C = CarryFrom(Rn, imm3); cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 0)], Rn, imm3); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_IMM8(const u32 i) { u32 imm8 = (i & 0xFF); u32 Rd = cpu->R[REG_NUM(i, 8)]; cpu->R[REG_NUM(i, 8)] = Rd + imm8; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 8)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 8)] == 0); cpu->CPSR.bits.C = CarryFrom(Rd, imm8); cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 8)], Rd, imm8); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_REG(const u32 i) { u32 Rn = cpu->R[REG_NUM(i, 3)]; u32 Rm = cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = Rn + Rm; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; cpu->CPSR.bits.C = CarryFrom(Rn, Rm); cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 0)], Rn, Rm); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_SPE(const u32 i) { u32 Rd = REG_NUM(i, 0) | ((i>>4)&8); cpu->R[Rd] += cpu->R[REG_POS(i, 3)]; if(Rd==15) { cpu->next_instruction = cpu->R[15]; return 3; } return 1; } TEMPLATE static u32 FASTCALL OP_ADD_2PC(const u32 i) { cpu->R[REG_NUM(i, 8)] = (cpu->R[15]&0xFFFFFFFC) + ((i&0xFF)<<2); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_2SP(const u32 i) { cpu->R[REG_NUM(i, 8)] = cpu->R[13] + ((i&0xFF)<<2); return 1; } //----------------------------------------------------------------------------- // SUB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SUB_IMM3(const u32 i) { u32 imm3 = (i>>6) & 0x07; u32 Rn = cpu->R[REG_NUM(i, 3)]; u32 tmp = Rn - imm3; cpu->R[REG_NUM(i, 0)] = tmp; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); cpu->CPSR.bits.C = !BorrowFrom(Rn, imm3); cpu->CPSR.bits.V = OverflowFromSUB(tmp, Rn, imm3); return 1; } TEMPLATE static u32 FASTCALL OP_SUB_IMM8(const u32 i) { u32 imm8 = (i & 0xFF); u32 Rd = cpu->R[REG_NUM(i, 8)]; u32 tmp = Rd - imm8; cpu->R[REG_NUM(i, 8)] = tmp; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); cpu->CPSR.bits.C = !BorrowFrom(Rd, imm8); cpu->CPSR.bits.V = OverflowFromSUB(tmp, Rd, imm8); return 1; } TEMPLATE static u32 FASTCALL OP_SUB_REG(const u32 i) { u32 Rn = cpu->R[REG_NUM(i, 3)]; u32 Rm = cpu->R[REG_NUM(i, 6)]; u32 tmp = Rn - Rm; cpu->R[REG_NUM(i, 0)] = tmp; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); cpu->CPSR.bits.C = !BorrowFrom(Rn, Rm); cpu->CPSR.bits.V = OverflowFromSUB(tmp, Rn, Rm); return 1; } //----------------------------------------------------------------------------- // MOV //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MOV_IMM8(const u32 i) { cpu->R[REG_NUM(i, 8)] = (i & 0xFF); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 8)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 8)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_MOV_SPE(const u32 i) { u32 Rd = REG_NUM(i, 0) | ((i>>4)&8); cpu->R[Rd] = cpu->R[REG_POS(i, 3)]; if(Rd==15) { cpu->next_instruction = cpu->R[15]; return 3; } return 1; } //----------------------------------------------------------------------------- // CMP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_CMP_IMM8(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 8)] - (i & 0xFF); cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_NUM(i, 8)], (i & 0xFF)); cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_NUM(i, 8)], (i & 0xFF)); return 1; } TEMPLATE static u32 FASTCALL OP_CMP(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 0)] - cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); return 1; } TEMPLATE static u32 FASTCALL OP_CMP_SPE(const u32 i) { u32 Rn = (i&7) | ((i>>4)&8); u32 tmp = cpu->R[Rn] - cpu->R[REG_POS(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = !BorrowFrom(cpu->R[Rn], cpu->R[REG_POS(i, 3)]); cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[Rn], cpu->R[REG_POS(i, 3)]); return 1; } //----------------------------------------------------------------------------- // AND //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_AND(const u32 i) { cpu->R[REG_NUM(i, 0)] &= cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } //----------------------------------------------------------------------------- // EOR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_EOR(const u32 i) { cpu->R[REG_NUM(i, 0)] ^= cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } //----------------------------------------------------------------------------- // ADC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ADC_REG(const u32 i) { u32 Rd = cpu->R[REG_NUM(i, 0)]; u32 Rm = cpu->R[REG_NUM(i, 3)]; if (!cpu->CPSR.bits.C) { cpu->R[REG_NUM(i, 0)] = Rd + Rm; cpu->CPSR.bits.C = cpu->R[REG_NUM(i, 0)] < Rm; } else { cpu->R[REG_NUM(i, 0)] = Rd + Rm + 1; cpu->CPSR.bits.C = cpu->R[REG_NUM(i, 0)] <= Rm; } cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); cpu->CPSR.bits.V = BIT31((Rd ^ Rm ^ -1) & (Rd ^ cpu->R[REG_NUM(i, 0)])); return 1; } //----------------------------------------------------------------------------- // SBC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SBC_REG(const u32 i) { u32 Rd = cpu->R[REG_NUM(i, 0)]; u32 Rm = cpu->R[REG_NUM(i, 3)]; if (!cpu->CPSR.bits.C) { cpu->R[REG_NUM(i, 0)] = Rd - Rm - 1; cpu->CPSR.bits.C = Rd > Rm; } else { cpu->R[REG_NUM(i, 0)] = Rd - Rm; cpu->CPSR.bits.C = Rd >= Rm; } cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); cpu->CPSR.bits.V = BIT31((Rd ^ Rm) & (Rd ^ cpu->R[REG_NUM(i, 0)])); return 1; } //----------------------------------------------------------------------------- // ROR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ROR_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } v &= 0x1F; if(v == 0) { cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1); cpu->R[REG_NUM(i, 0)] = ROR(cpu->R[REG_NUM(i, 0)], v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_TST(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 0)] & cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); return 1; } //----------------------------------------------------------------------------- // NEG //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_NEG(const u32 i) { u32 Rm = cpu->R[REG_NUM(i, 3)]; cpu->R[REG_NUM(i, 0)] = (u32)((s32)0 - (s32)Rm); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); cpu->CPSR.bits.C = !BorrowFrom(0, Rm); cpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_NUM(i, 0)], 0, Rm); return 1; } //----------------------------------------------------------------------------- // CMN //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_CMN(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 0)] + cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = CarryFrom(cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.V = OverflowFromADD(tmp, cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); return 1; } //----------------------------------------------------------------------------- // ORR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ORR(const u32 i) { cpu->R[REG_NUM(i, 0)] |= cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); return 1; } //----------------------------------------------------------------------------- // BIC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BIC(const u32 i) { cpu->R[REG_NUM(i, 0)] &= (~cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); return 1; } //----------------------------------------------------------------------------- // MVN //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MVN(const u32 i) { cpu->R[REG_NUM(i, 0)] = (~cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } //----------------------------------------------------------------------------- // MUL //----------------------------------------------------------------------------- #define MUL_Mxx_END_THUMB(c) \ v >>= 8; \ if((v==0)||(v==0xFFFFFF)) \ return c+1; \ v >>= 8; \ if((v==0)||(v==0xFFFF)) \ return c+2; \ v >>= 8; \ if((v==0)||(v==0xFF)) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_MUL_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)]; // FIXME: //------ Rd = (Rm * Rd)[31:0] //------ u64 res = ((u64)cpu->R[REG_NUM(i, 0)] * (u64)v)); //------ cpu->R[REG_NUM(i, 0)] = (u32)(res & 0xFFFFFFFF); //------ cpu->R[REG_NUM(i, 0)] *= v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; //The MUL instruction is defined to leave the C flag unchanged in ARMv5 and above. //In earlier versions of the architecture, the value of the C flag was UNPREDICTABLE //after a MUL instruction. if (PROCNUM == 1) // ARM4T 1S + mI, m = 3 return 4; MUL_Mxx_END_THUMB(1); } //----------------------------------------------------------------------------- // STRB / LDRB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRB_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>6)&0x1F); WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRB_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>6)&0x1F); cpu->R[REG_NUM(i, 0)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STRB_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRB_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // LDRSB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSB_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // STRH / LDRH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRH_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>5)&0x3E); WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRH_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>5)&0x3E); cpu->R[REG_NUM(i, 0)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STRH_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; WRITE16(cpu->mem_if->data, adr, ((u16)cpu->R[REG_NUM(i, 0)])); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRH_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // LDRSH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSH_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // STR / LDR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STR_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>4)&0x7C); WRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDR_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>4)&0x7C); u32 tempValue = READ32(cpu->mem_if->data, adr); adr = (adr&3)*8; tempValue = (tempValue>>adr) | (tempValue<<(32-adr)); cpu->R[REG_NUM(i, 0)] = tempValue; return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STR_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 6)] + cpu->R[REG_NUM(i, 3)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDR_REG_OFF(const u32 i) { u32 adr = (cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]); u32 tempValue = READ32(cpu->mem_if->data, adr); adr = (adr&3)*8; tempValue = (tempValue>>adr) | (tempValue<<(32-adr)); cpu->R[REG_NUM(i, 0)] = tempValue; return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STR_SPREL(const u32 i) { u32 adr = cpu->R[13] + ((i&0xFF)<<2); WRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 8)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDR_SPREL(const u32 i) { u32 adr = cpu->R[13] + ((i&0xFF)<<2); cpu->R[REG_NUM(i, 8)] = READ32(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_LDR_PCREL(const u32 i) { u32 adr = (cpu->R[15]&0xFFFFFFFC) + ((i&0xFF)<<2); cpu->R[REG_NUM(i, 8)] = READ32(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // Adjust SP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ADJUST_P_SP(const u32 i) { cpu->R[13] += ((i&0x7F)<<2); return 1; } TEMPLATE static u32 FASTCALL OP_ADJUST_M_SP(const u32 i) { cpu->R[13] -= ((i&0x7F)<<2); return 1; } //----------------------------------------------------------------------------- // PUSH / POP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_PUSH(const u32 i) { u32 adr = cpu->R[13] - 4; u32 c = 0, j; for(j = 0; j<8; j++) if(BIT_N(i, 7-j)) { WRITE32(cpu->mem_if->data, adr, cpu->R[7-j]); c += MMU_memAccessCycles(adr); adr -= 4; } cpu->R[13] = adr + 4; return MMU_aluMemCycles(3, c); } TEMPLATE static u32 FASTCALL OP_PUSH_LR(const u32 i) { u32 adr = cpu->R[13] - 4; u32 c = 0, j; WRITE32(cpu->mem_if->data, adr, cpu->R[14]); c += MMU_memAccessCycles(adr); adr -= 4; for(j = 0; j<8; j++) if(BIT_N(i, 7-j)) { WRITE32(cpu->mem_if->data, adr, cpu->R[7-j]); c += MMU_memAccessCycles(adr); adr -= 4; } cpu->R[13] = adr + 4; return MMU_aluMemCycles(4, c); } TEMPLATE static u32 FASTCALL OP_POP(const u32 i) { u32 adr = cpu->R[13]; u32 c = 0, j; for(j = 0; j<8; j++) if(BIT_N(i, j)) { cpu->R[j] = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); adr += 4; } cpu->R[13] = adr; return MMU_aluMemCycles(2, c); } // In ARMv5 and above, bit[0] of the loaded value // determines whether execution continues after this branch in ARM state or in Thumb state, as though the // following instruction had been executed: // BX (loaded_value) // In T variants of ARMv4, bit[0] of the loaded value is ignored and execution continues in Thumb state, as // though the following instruction had been executed: // MOV PC,(loaded_value) TEMPLATE static u32 FASTCALL OP_POP_PC(const u32 i) { u32 adr = cpu->R[13]; u32 c = 0, j; u32 v = 0; for(j = 0; j<8; j++) if(BIT_N(i, j)) { cpu->R[j] = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); adr += 4; } v = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); if(PROCNUM==0) cpu->CPSR.bits.T = BIT0(v); cpu->R[15] = v & 0xFFFFFFFE; cpu->next_instruction = cpu->R[15]; cpu->R[13] = adr + 4; return MMU_aluMemCycles(5, c); } //----------------------------------------------------------------------------- // STMIA / LDMIA //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STMIA_THUMB(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 8)]; u32 c = 0, j; u32 erList = 1; //Empty Register List // ------ ARM_REF: // ------ If is specified in : // ------ * If is the lowest-numbered register specified in , the original value of is stored. // ------ * Otherwise, the stored value of is UNPREDICTABLE. if (BIT_N(i, REG_NUM(i, 8))) printf("STMIA with Rb in Rlist\n"); for(j = 0; j<8; j++) { if(BIT_N(i, j)) { WRITE32(cpu->mem_if->data, adr, cpu->R[j]); c += MMU_memAccessCycles(adr); adr += 4; erList = 0; //Register List isnt empty } } if (erList) printf("STMIA with Empty Rlist\n"); cpu->R[REG_NUM(i, 8)] = adr; return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA_THUMB(const u32 i) { u32 regIndex = REG_NUM(i, 8); u32 adr = cpu->R[regIndex]; u32 c = 0, j; u32 erList = 1; //Empty Register List //if (BIT_N(i, regIndex)) // printf("LDMIA with Rb in Rlist at %08X\n",cpu->instruct_adr); for(j = 0; j<8; j++) { if(BIT_N(i, j)) { cpu->R[j] = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); adr += 4; erList = 0; //Register List isnt empty } } if (erList) printf("LDMIA with Empty Rlist\n"); // ARM_REF: THUMB: Causes base register write-back, and is not optional // ARM_REF: If the base register is specified in , the final value of is the loaded value // (not the written-back value). if (!BIT_N(i, regIndex)) cpu->R[regIndex] = adr; return MMU_aluMemCycles(3, c); } //----------------------------------------------------------------------------- // BKPT //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BKPT_THUMB(const u32 i) { printf("THUMB%c: OP_BKPT triggered\n", PROCNUM?'7':'9'); Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, ABT); // enter abt mode cpu->R[14] = cpu->instruct_adr + 4; cpu->SPSR = tmp; // save old CPSR as new SPSR cpu->CPSR.bits.T = 0; // handle as ARM32 code cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x0C; cpu->next_instruction = cpu->R[15]; return 1; } //----------------------------------------------------------------------------- // SWI //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SWI_THUMB(const u32 i) { u32 swinum = i & 0xFF; //ideas-style debug prints (execute this SWI with the null terminated string address in R0) if(swinum==0xFC) { IdeasLog(cpu); return 0; } //if the user has changed the intVector to point away from the nds bioses, //then it doesn't really make any sense to use the builtin SWI's since //the bios ones aren't getting called anyway bool bypassBuiltinSWI = (cpu->intVector == 0x00000000 && PROCNUM==0) || (cpu->intVector == 0xFFFF0000 && PROCNUM==1); //printf("THUMB%c SWI %02X\t; %s\n", PROCNUM?'7':'9', (swinum & 0x1F), ARM_swi_names[PROCNUM][(swinum & 0x1F)]); if(cpu->swi_tab && !bypassBuiltinSWI) { //zero 25-dec-2008 - in arm, we were masking to 0x1F. //this is probably safer since an invalid opcode could crash the emu //zero 30-jun-2009 - but they say that the ideas 0xFF should crash the device... //u32 swinum = cpu->instruction & 0xFF; swinum &= 0x1F; return cpu->swi_tab[swinum]() + 3; } else { /* we use an irq thats not in the irq tab, as it was replaced due to a changed intVector */ Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, SVC); /* enter svc mode */ cpu->R[14] = cpu->next_instruction; /* jump to swi Vector */ cpu->SPSR = tmp; /* save old CPSR as new SPSR */ cpu->CPSR.bits.T = 0; /* handle as ARM32 code */ cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x08; cpu->next_instruction = cpu->R[15]; return 3; } } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- #define SIGNEEXT_IMM11(i) (((i)&0x7FF) | (BIT10(i) * 0xFFFFF800)) #define SIGNEXTEND_11(i) (((s32)i<<21)>>21) TEMPLATE static u32 FASTCALL OP_B_COND(const u32 i) { if(!TEST_COND((i>>8)&0xF, 0, cpu->CPSR)) return 1; cpu->R[15] += (u32)((s8)(i&0xFF))<<1; cpu->next_instruction = cpu->R[15]; return 3; } TEMPLATE static u32 FASTCALL OP_B_UNCOND(const u32 i) { //nocash message detection const u16 last = _MMU_read16(cpu->instruct_adr-2); const u16 next = _MMU_read16(cpu->instruct_adr+2); static const u16 mov_r12_r12 = 0x46E4; if(last == mov_r12_r12 && next == 0x6464) { NocashMessage(cpu,6); } cpu->R[15] += (SIGNEEXT_IMM11(i)<<1); cpu->next_instruction = cpu->R[15]; return 1; } TEMPLATE static u32 FASTCALL OP_BLX(const u32 i) { cpu->R[15] = (cpu->R[14] + ((i&0x7FF)<<1))&0xFFFFFFFC; cpu->R[14] = cpu->next_instruction | 1; cpu->next_instruction = cpu->R[15]; cpu->CPSR.bits.T = 0; return 3; } TEMPLATE static u32 FASTCALL OP_BL_10(const u32 i) { cpu->R[14] = cpu->R[15] + (SIGNEXTEND_11(i)<<12); return 1; } TEMPLATE static u32 FASTCALL OP_BL_11(const u32 i) { cpu->R[15] = (cpu->R[14] + ((i&0x7FF)<<1)); cpu->R[14] = cpu->next_instruction | 1; cpu->next_instruction = cpu->R[15]; return 4; } TEMPLATE static u32 FASTCALL OP_BX_THUMB(const u32 i) { // When using PC as operand with BX opcode, switch to ARM state and jump to (instruct_adr+4) // Reference: http://nocash.emubase.de/gbatek.htm#thumb5hiregisteroperationsbranchexchange #if 0 if (REG_POS(i, 3) == 15) { cpu->CPSR.bits.T = 0; cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; } else { u32 Rm = cpu->R[REG_POS(i, 3)]; cpu->CPSR.bits.T = BIT0(Rm); cpu->R[15] = (Rm & 0xFFFFFFFE); cpu->next_instruction = cpu->R[15]; } #else u32 Rm = cpu->R[REG_POS(i, 3)]; //----- ARM_REF: //----- Register 15 can be specified for . If this is done, R15 is read as normal for Thumb code, //----- that is, it is the address of the BX instruction itself plus 4. If the BX instruction is at a //----- word-aligned address, this results in a branch to the next word, executing in ARM state. //----- However, if the BX instruction is not at a word-aligned address, this means that the results of //----- the instruction are UNPREDICTABLE (because the value read for R15 has bits[1:0]==0b10). if (Rm == 15) { //printf("THUMB%c: BX using PC as operand\n", PROCNUM?'7':'9'); //emu_halt(); } cpu->CPSR.bits.T = BIT0(Rm); cpu->R[15] = (Rm & (0xFFFFFFFC|(1<CPSR.bits.T))); cpu->next_instruction = cpu->R[15]; #endif return 3; } TEMPLATE static u32 FASTCALL OP_BLX_THUMB(const u32 i) { u32 Rm = cpu->R[REG_POS(i, 3)]; cpu->CPSR.bits.T = BIT0(Rm); cpu->R[15] = Rm & 0xFFFFFFFE; cpu->R[14] = cpu->next_instruction | 1; cpu->next_instruction = cpu->R[15]; return 4; } //----------------------------------------------------------------------------- // The End //----------------------------------------------------------------------------- const OpFunc thumb_instructions_set[2][1024] = {{ #define TABDECL(x) x<0> #include "thumb_tabdef.inc" #undef TABDECL },{ #define TABDECL(x) x<1> #include "thumb_tabdef.inc" #undef TABDECL }}; #define TABDECL(x) #x const char* thumb_instruction_names[1024] = { #include "thumb_tabdef.inc" }; #undef TABDECL desmume-0.9.11/src/MMU.h0000755000000000000000000006545612467662066013377 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2007 shash Copyright (C) 2007-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef MMU_H #define MMU_H #include "debug.h" #include "firmware.h" #include "mc.h" #include "mem.h" #ifdef HAVE_LUA #include "lua-engine.h" #endif #ifdef HAVE_JIT #include "arm_jit.h" #endif #define ARMCPU_ARM7 1 #define ARMCPU_ARM9 0 #define ARMPROC (PROCNUM ? NDS_ARM7:NDS_ARM9) class EMUFILE; typedef const u8 TWaitState; enum EDMAMode { EDMAMode_Immediate = 0, EDMAMode_VBlank = 1, EDMAMode_HBlank = 2, EDMAMode_HStart = 3, EDMAMode_MemDisplay = 4, EDMAMode_Card = 5, EDMAMode_GBASlot = 6, EDMAMode_GXFifo = 7, EDMAMode7_Wifi = 8, EDMAMode7_GBASlot = 9, }; enum EDMABitWidth { EDMABitWidth_16 = 0, EDMABitWidth_32 = 1 }; enum EDMASourceUpdate { EDMASourceUpdate_Increment = 0, EDMASourceUpdate_Decrement = 1, EDMASourceUpdate_Fixed = 2, EDMASourceUpdate_Invalid = 3, }; enum EDMADestinationUpdate { EDMADestinationUpdate_Increment = 0, EDMADestinationUpdate_Decrement = 1, EDMADestinationUpdate_Fixed = 2, EDMADestinationUpdate_IncrementReload = 3, }; //TODO //n.b. this may be a bad idea, for complex registers like the dma control register. //we need to know exactly what part was written to, instead of assuming all 32bits were written. class TRegister_32 { public: virtual u32 read32() = 0; virtual void write32(const u32 val) = 0; void write(const int size, const u32 adr, const u32 val) { if(size==32) write32(val); else { const u32 offset = adr&3; if(size==8) { printf("WARNING! 8BIT DMA ACCESS\n"); u32 mask = 0xFF<<(offset<<3); write32((read32()&~mask)|(val<<(offset<<3))); } else if(size==16) { u32 mask = 0xFFFF<<(offset<<3); write32((read32()&~mask)|(val<<(offset<<3))); } } } u32 read(const int size, const u32 adr) { if(size==32) return read32(); else { const u32 offset = adr&3; if(size==8) { printf("WARNING! 8BIT DMA ACCESS\n"); return (read32()>>(offset<<3))&0xFF; } else return (read32()>>(offset<<3))&0xFFFF; } } }; struct TGXSTAT : public TRegister_32 { TGXSTAT() { gxfifo_irq = se = tr = tb = sb = 0; fifo_empty = true; fifo_low = false; } u8 tb; //test busy u8 tr; //test result u8 se; //stack error u8 sb; //stack busy u8 gxfifo_irq; //irq configuration bool fifo_empty, fifo_low; virtual u32 read32(); virtual void write32(const u32 val); void savestate(EMUFILE *f); bool loadstate(EMUFILE *f); }; void triggerDma(EDMAMode mode); class DivController { public: DivController() : mode(0), busy(0) {} void exec(); u8 mode, busy, div0; u16 read16() { return mode|(busy<<15)|(div0<<14); } void write16(u16 val) { mode = val&3; //todo - do we clear the div0 flag here or is that strictly done by the divider unit? } void savestate(EMUFILE* os); bool loadstate(EMUFILE* is, int version); }; class SqrtController { public: SqrtController() : mode(0), busy(0) {} void exec(); u8 mode, busy; u16 read16() { return mode|(busy<<15); } void write16(u16 val) { mode = val&1; } void savestate(EMUFILE* os); bool loadstate(EMUFILE* is, int version); }; class DmaController { public: u8 enable, irq, repeatMode, _startmode; u8 userEnable; u32 wordcount; EDMAMode startmode; EDMABitWidth bitWidth; EDMASourceUpdate sar; EDMADestinationUpdate dar; u32 saddr, daddr; u32 saddr_user, daddr_user; //indicates whether the dma needs to be checked for triggering BOOL dmaCheck; //indicates whether the dma right now is logically running //(though for now we copy all the data when it triggers) BOOL running; BOOL paused; //this flag will sometimes be set when a start condition is triggered //other conditions may be automatically triggered based on scanning conditions BOOL triggered; u64 nextEvent; int procnum, chan; void savestate(EMUFILE *f); bool loadstate(EMUFILE *f); void exec(); template void doCopy(); void doPause(); void doStop(); void doSchedule(); void tryTrigger(EDMAMode mode); DmaController() : enable(0), irq(0), repeatMode(0), _startmode(0), wordcount(0), startmode(EDMAMode_Immediate), bitWidth(EDMABitWidth_16), sar(EDMASourceUpdate_Increment), dar(EDMADestinationUpdate_Increment), //if saddr isnt cleared then rings of fate will trigger copy protection //by inspecting dma3 saddr when it boots saddr(0), daddr(0), saddr_user(0), daddr_user(0), dmaCheck(FALSE), running(FALSE), paused(FALSE), triggered(FALSE), nextEvent(0), sad(&saddr_user), dad(&daddr_user) { sad.controller = this; dad.controller = this; ctrl.controller = this; regs[0] = &sad; regs[1] = &dad; regs[2] = &ctrl; } class AddressRegister : public TRegister_32 { public: //we pass in a pointer to the controller here so we can alert it if anything changes DmaController* controller; u32 * const ptr; AddressRegister(u32* _ptr) : ptr(_ptr) {} virtual u32 read32() { return *ptr; } virtual void write32(const u32 val) { *ptr = val; } }; class ControlRegister : public TRegister_32 { public: //we pass in a pointer to the controller here so we can alert it if anything changes DmaController* controller; ControlRegister() {} virtual u32 read32() { return controller->read32(); } virtual void write32(const u32 val) { return controller->write32(val); } }; AddressRegister sad, dad; ControlRegister ctrl; TRegister_32* regs[3]; void write32(const u32 val); u32 read32(); }; enum eCardMode { //when the GC system is first booted up, the protocol is in raw mode eCardMode_RAW = 0, //an intermediate stage during the protocol bootup process. commands are KEY1 encrypted. eCardMode_KEY1, //an intermediate stage during the protocol bootup process. commands are KEY1 encrypted, while replies are KEY2 encrypted eCardMode_KEY2, //the final stage of the protocol bootup process. "main data load" mode. commands are KEY2 encrypted, and replies are KEY2 encrypted. //optionally, according to some flag we havent designed yet but should probably go in GCBUS_Controller, the whole KEY2 part can be bypassed //(this is typical when skipping the firmware boot process) eCardMode_NORMAL, //help fix to 32bit eCardMode_Pad = 0xFFFFFFFF }; //#define GCLOG(...) printf(__VA_ARGS__); #define GCLOG(...) void MMU_GC_endTransfer(u32 PROCNUM); struct GC_Command { u8 bytes[8]; void print(); void toCryptoBuffer(u32 buf[2]); void fromCryptoBuffer(u32 buf[2]); }; //should rather be known as GCBUS controller, or somesuch struct GCBUS_Controller { int transfer_count; eCardMode mode; //probably only one of these }; #define DUP2(x) x, x #define DUP4(x) x, x, x, x #define DUP8(x) x, x, x, x, x, x, x, x #define DUP16(x) x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x struct MMU_struct { //ARM9 mem u8 ARM9_ITCM[0x8000]; u8 ARM9_DTCM[0x4000]; //u8 MAIN_MEM[4*1024*1024]; //expanded from 4MB to 8MB to support debug consoles //u8 MAIN_MEM[8*1024*1024]; //expanded from 8MB to 16MB to support dsi u8 MAIN_MEM[16*1024*1024]; //expanded from 8MB to 16MB to support dsi u8 ARM9_REG[0x1000000]; //this variable is evil and should be removed by correctly emulating all registers. u8 ARM9_BIOS[0x8000]; u8 ARM9_VMEM[0x800]; #include "PACKED.h" struct { u8 ARM9_LCD[0xA4000]; //an extra 128KB for blank memory, directly after arm9_lcd, so that //we can easily map things to the end of arm9_lcd to represent //an unmapped state u8 blank_memory[0x20000]; }; #include "PACKED_END.h" u8 ARM9_OAM[0x800]; u8* ExtPal[2][4]; u8* ObjExtPal[2][2]; struct TextureInfo { u8* texPalSlot[6]; u8* textureSlotAddr[4]; } texInfo; //ARM7 mem u8 ARM7_BIOS[0x4000]; u8 ARM7_ERAM[0x10000]; //64KB of exclusive WRAM u8 ARM7_REG[0x10000]; u8 ARM7_WIRAM[0x10000]; //WIFI ram // VRAM mapping u8 VRAM_MAP[4][32]; u32 LCD_VRAM_ADDR[10]; u8 LCDCenable[10]; //32KB of shared WRAM - can be switched between ARM7 & ARM9 in two blocks u8 SWIRAM[0x8000]; //Unused ram u8 UNUSED_RAM[4]; //this is here so that we can trap glitchy emulator code //which is accessing offsets 5,6,7 of unused ram due to unaligned accesses //(also since the emulator doesn't prevent unaligned accesses) u8 MORE_UNUSED_RAM[4]; static u8 * MMU_MEM[2][256]; static u32 MMU_MASK[2][256]; u8 ARM9_RW_MODE; u32 DTCMRegion; u32 ITCMRegion; u16 timer[2][4]; s32 timerMODE[2][4]; u32 timerON[2][4]; u32 timerRUN[2][4]; u16 timerReload[2][4]; u32 reg_IME[2]; u32 reg_IE[2]; //these are the user-controlled IF bits. some IF bits are generated as necessary from hardware conditions u32 reg_IF_bits[2]; //these flags are set occasionally to indicate that an irq should have entered the pipeline, and processing will be deferred a tiny bit to help emulate things u32 reg_IF_pending[2]; u32 reg_DISP3DCNT_bits; template u32 gen_IF(); BOOL divRunning; s64 divResult; s64 divMod; u64 divCycles; BOOL sqrtRunning; u32 sqrtResult; u64 sqrtCycles; u16 SPI_CNT; u16 SPI_CMD; u16 AUX_SPI_CNT; //u16 AUX_SPI_CMD; //zero 20-aug-2013 - this seems pointless u8 WRAMCNT; u64 gfx3dCycles; u8 powerMan_CntReg; BOOL powerMan_CntRegWritten; u8 powerMan_Reg[5]; fw_memory_chip fw; GCBUS_Controller dscard[2]; }; //everything in here is derived from libnds behaviours. no hardware tests yet class DSI_TSC { public: DSI_TSC(); void reset_command(); u16 write16(u16 val); bool save_state(EMUFILE* os); bool load_state(EMUFILE* is); private: u16 read16(); u8 reg_selection; u8 read_flag; s32 state; s32 readcount; //registers[0] contains the current page. //we are going to go ahead and save these out in case we want to change the way this is emulated in the future.. //we may want to poke registers in here at more convenient times and have the TSC dumbly pluck them out, //rather than generate the values on the fly u8 registers[0x80]; }; //this contains things which can't be memzeroed because they are smarter classes struct MMU_struct_new { MMU_struct_new() ; BackupDevice backupDevice; DmaController dma[2][4]; TGXSTAT gxstat; SqrtController sqrt; DivController div; DSI_TSC dsi_tsc; void write_dma(const int proc, const int size, const u32 adr, const u32 val); u32 read_dma(const int proc, const int size, const u32 adr); bool is_dma(const u32 adr); }; extern MMU_struct MMU; extern MMU_struct_new MMU_new; struct armcpu_memory_iface { /** the 32 bit instruction prefetch */ u32 FASTCALL (*prefetch32)( void *data, u32 adr); /** the 16 bit instruction prefetch */ u16 FASTCALL (*prefetch16)( void *data, u32 adr); /** read 8 bit data value */ u8 FASTCALL (*read8)( void *data, u32 adr); /** read 16 bit data value */ u16 FASTCALL (*read16)( void *data, u32 adr); /** read 32 bit data value */ u32 FASTCALL (*read32)( void *data, u32 adr); /** write 8 bit data value */ void FASTCALL (*write8)( void *data, u32 adr, u8 val); /** write 16 bit data value */ void FASTCALL (*write16)( void *data, u32 adr, u16 val); /** write 32 bit data value */ void FASTCALL (*write32)( void *data, u32 adr, u32 val); void *data; }; void MMU_Init(void); void MMU_DeInit(void); void MMU_Reset( void); void print_memory_profiling( void); // Memory reading/writing (old) u8 FASTCALL MMU_read8(u32 proc, u32 adr); u16 FASTCALL MMU_read16(u32 proc, u32 adr); u32 FASTCALL MMU_read32(u32 proc, u32 adr); void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val); void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val); void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val); //template void FASTCALL MMU_doDMA(u32 num); //The base ARM memory interfaces extern const armcpu_memory_iface arm9_base_memory_iface; extern const armcpu_memory_iface arm7_base_memory_iface; extern const armcpu_memory_iface arm9_direct_memory_iface; #define VRAM_BANKS 9 #define VRAM_BANK_A 0 #define VRAM_BANK_B 1 #define VRAM_BANK_C 2 #define VRAM_BANK_D 3 #define VRAM_BANK_E 4 #define VRAM_BANK_F 5 #define VRAM_BANK_G 6 #define VRAM_BANK_H 7 #define VRAM_BANK_I 8 #define VRAM_PAGE_ABG 0 #define VRAM_PAGE_BBG 128 #define VRAM_PAGE_AOBJ 256 #define VRAM_PAGE_BOBJ 384 struct VramConfiguration { enum Purpose { OFF, INVALID, ABG, BBG, AOBJ, BOBJ, LCDC, ARM7, TEX, TEXPAL, ABGEXTPAL, BBGEXTPAL, AOBJEXTPAL, BOBJEXTPAL }; struct BankInfo { Purpose purpose; int ofs; } banks[VRAM_BANKS]; inline void clear() { for(int i=0;i>14)&(VRAM_ARM9_PAGES-1); u32 ofs = vram_addr & 0x3FFF; vram_page = vram_arm9_map[vram_page]; //blank pages are handled by the extra 16KB of blank memory at the end of ARM9_LCD //and the fact that blank pages are mapped to appear at that location return MMU.ARM9_LCD + (vram_page<<14) + ofs; } template u8 _MMU_read08(u32 addr); template u16 _MMU_read16(u32 addr); template u32 _MMU_read32(u32 addr); template void _MMU_write08(u32 addr, u8 val); template void _MMU_write16(u32 addr, u16 val); template void _MMU_write32(u32 addr, u32 val); template FORCEINLINE u8 _MMU_read08(u32 addr) { return _MMU_read08(addr); } template FORCEINLINE u16 _MMU_read16(u32 addr) { return _MMU_read16(addr); } template FORCEINLINE u32 _MMU_read32(u32 addr) { return _MMU_read32(addr); } template FORCEINLINE void _MMU_write08(u32 addr, u8 val) { _MMU_write08(addr,val); } template FORCEINLINE void _MMU_write16(u32 addr, u16 val) { _MMU_write16(addr,val); } template FORCEINLINE void _MMU_write32(u32 addr, u32 val) { _MMU_write32(addr,val); } void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val); void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val); void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val); u8 FASTCALL _MMU_ARM9_read08(u32 adr); u16 FASTCALL _MMU_ARM9_read16(u32 adr); u32 FASTCALL _MMU_ARM9_read32(u32 adr); void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val); void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val); void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val); u8 FASTCALL _MMU_ARM7_read08(u32 adr); u16 FASTCALL _MMU_ARM7_read16(u32 adr); u32 FASTCALL _MMU_ARM7_read32(u32 adr); extern u32 partie; extern u32 _MMU_MAIN_MEM_MASK; extern u32 _MMU_MAIN_MEM_MASK16; extern u32 _MMU_MAIN_MEM_MASK32; void SetupMMU(bool debugConsole, bool dsi); FORCEINLINE void CheckMemoryDebugEvent(EDEBUG_EVENT event, const MMU_ACCESS_TYPE type, const u32 procnum, const u32 addr, const u32 size, const u32 val) { //TODO - ugh work out a better prefetch event system if(type == MMU_AT_CODE && event == DEBUG_EVENT_READ) event = DEBUG_EVENT_EXECUTE; if(CheckDebugEvent(event)) { DebugEventData.memAccessType = type; DebugEventData.procnum = procnum; DebugEventData.addr = addr; DebugEventData.size = size; DebugEventData.val = val; HandleDebugEvent(event); } } //ALERT!!!!!!!!!!!!!! //the following inline functions dont do the 0x0FFFFFFF mask. //this may result in some unexpected behavior FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { CheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,8,0); //special handling to un-protect the ARM7 bios during debug reading if(PROCNUM == ARMCPU_ARM7 && AT == MMU_AT_DEBUG && addr<0x00004000) { return T1ReadByte(MMU.ARM7_BIOS, addr); } //special handling for DMA: read 0 from TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return 0; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { //Returns data from DTCM (ARM9 only) return T1ReadByte(MMU.ARM9_DTCM, addr & 0x3FFF); } if ( (addr & 0x0F000000) == 0x02000000) return T1ReadByte( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK); if(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read08(addr); else return _MMU_ARM7_read08(addr); } FORCEINLINE u16 _MMU_read16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { CheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,16,0); //special handling to un-protect the ARM7 bios during debug reading if(PROCNUM == ARMCPU_ARM7 && AT == MMU_AT_DEBUG && addr<0x00004000) { return T1ReadWord_guaranteedAligned(MMU.ARM7_BIOS, addr); } //special handling for DMA: read 0 from TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return 0; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) { if ((addr & 0x0F000000) == 0x02000000) return T1ReadWord_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16); if(addr<0x02000000) return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, addr&0x7FFE); goto dunno; } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { //Returns data from DTCM (ARM9 only) return T1ReadWord_guaranteedAligned(MMU.ARM9_DTCM, addr & 0x3FFE); } if ( (addr & 0x0F000000) == 0x02000000) return T1ReadWord_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16); dunno: if(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read16(addr); else return _MMU_ARM7_read16(addr); } FORCEINLINE u32 _MMU_read32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { CheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,32,0); //special handling to un-protect the ARM7 bios during debug reading if(PROCNUM == ARMCPU_ARM7 && AT == MMU_AT_DEBUG && addr<0x00004000) { return T1ReadLong_guaranteedAligned(MMU.ARM7_BIOS, addr); } //special handling for DMA: read 0 from TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return 0; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) { if ( (addr & 0x0F000000) == 0x02000000) return T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32); if(addr<0x02000000) return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, addr&0x7FFC); //what happens when we execute from DTCM? nocash makes it look like we get 0xFFFFFFFF but i can't seem to verify it //historically, desmume would fall through to its old memory map struct //which would return unused memory (0) //it seems the hardware returns 0 or something benign because in actuality 0xFFFFFFFF is an undefined opcode //and we know our handling for that is solid goto dunno; } //special handling for execution from arm7. try reading from main memory first if(PROCNUM==ARMCPU_ARM7) { if ( (addr & 0x0F000000) == 0x02000000) return T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32); } //for other arm9 cases, we have to check from dtcm first because it is patched on top of the main memory range if(PROCNUM==ARMCPU_ARM9) { if((addr&(~0x3FFF)) == MMU.DTCMRegion) { //Returns data from DTCM (ARM9 only) return T1ReadLong_guaranteedAligned(MMU.ARM9_DTCM, addr & 0x3FFC); } if ( (addr & 0x0F000000) == 0x02000000) return T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32); } dunno: if(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read32(addr); else return _MMU_ARM7_read32(addr); } FORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u8 val) { CheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,8,val); //special handling for DMA: discard writes to TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteByte(MMU.ARM9_DTCM, addr & 0x3FFF, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); #endif return; } if ( (addr & 0x0F000000) == 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK, 0) = 0; #endif T1WriteByte( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); #endif return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write08(addr,val); else _MMU_ARM7_write08(addr,val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); #endif } FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u16 val) { CheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,16,val); //special handling for DMA: discard writes to TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteWord(MMU.ARM9_DTCM, addr & 0x3FFE, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); #endif return; } if ( (addr & 0x0F000000) == 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK16, 0) = 0; #endif T1WriteWord( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); #endif return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write16(addr,val); else _MMU_ARM7_write16(addr,val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); #endif } FORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u32 val) { CheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,32,val); //special handling for DMA: discard writes to TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteLong(MMU.ARM9_DTCM, addr & 0x3FFC, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); #endif return; } if ( (addr & 0x0F000000) == 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK32, 0) = 0; JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK32, 1) = 0; #endif T1WriteLong( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); #endif return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write32(addr,val); else _MMU_ARM7_write32(addr,val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); #endif } //#ifdef MMU_ENABLE_ACL // void FASTCALL MMU_write8_acl(u32 proc, u32 adr, u8 val); // void FASTCALL MMU_write16_acl(u32 proc, u32 adr, u16 val); // void FASTCALL MMU_write32_acl(u32 proc, u32 adr, u32 val); // u8 FASTCALL MMU_read8_acl(u32 proc, u32 adr, u32 access); // u16 FASTCALL MMU_read16_acl(u32 proc, u32 adr, u32 access); // u32 FASTCALL MMU_read32_acl(u32 proc, u32 adr, u32 access); //#else // #define MMU_write8_acl(proc, adr, val) _MMU_write08(adr, val) // #define MMU_write16_acl(proc, adr, val) _MMU_write16(adr, val) // #define MMU_write32_acl(proc, adr, val) _MMU_write32(adr, val) // #define MMU_read8_acl(proc,adr,access) _MMU_read08(adr) // #define MMU_read16_acl(proc,adr,access) ((access==CP15_ACCESS_EXECUTE)?_MMU_read16(adr):_MMU_read16(adr)) // #define MMU_read32_acl(proc,adr,access) ((access==CP15_ACCESS_EXECUTE)?_MMU_read32(adr):_MMU_read32(adr)) //#endif // Use this macros for reading/writing, so the GDB stub isn't broken #ifdef GDB_STUB #define READ32(a,b) cpu->mem_if->read32(a,(b) & 0xFFFFFFFC) #define WRITE32(a,b,c) cpu->mem_if->write32(a,(b) & 0xFFFFFFFC,c) #define READ16(a,b) cpu->mem_if->read16(a,(b) & 0xFFFFFFFE) #define WRITE16(a,b,c) cpu->mem_if->write16(a,(b) & 0xFFFFFFFE,c) #define READ8(a,b) cpu->mem_if->read8(a,b) #define WRITE8(a,b,c) cpu->mem_if->write8(a,b,c) #else #define READ32(a,b) _MMU_read32((b) & 0xFFFFFFFC) #define WRITE32(a,b,c) _MMU_write32((b) & 0xFFFFFFFC,c) #define READ16(a,b) _MMU_read16((b) & 0xFFFFFFFE) #define WRITE16(a,b,c) _MMU_write16((b) & 0xFFFFFFFE,c) #define READ8(a,b) _MMU_read08(b) #define WRITE8(a,b,c) _MMU_write08(b, c) #endif template FORCEINLINE u8 _MMU_read08(u32 addr) { return _MMU_read08(PROCNUM, AT, addr); } template FORCEINLINE u16 _MMU_read16(u32 addr) { return _MMU_read16(PROCNUM, AT, addr); } template FORCEINLINE u32 _MMU_read32(u32 addr) { return _MMU_read32(PROCNUM, AT, addr); } template FORCEINLINE void _MMU_write08(u32 addr, u8 val) { _MMU_write08(PROCNUM, AT, addr, val); } template FORCEINLINE void _MMU_write16(u32 addr, u16 val) { _MMU_write16(PROCNUM, AT, addr, val); } template FORCEINLINE void _MMU_write32(u32 addr, u32 val) { _MMU_write32(PROCNUM, AT, addr, val); } void FASTCALL MMU_DumpMemBlock(u8 proc, u32 address, u32 size, u8 *buffer); #endif desmume-0.9.11/src/instruction_tabdef.inc0000755000000000000000000100505612467662066017140 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2007-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ /* 0XX000X0 */ /* 0000 0000 0000 */ TABDECL(OP_AND_LSL_IMM), // OP_AND_LSL_IMM /* 0000 0000 0001 */ TABDECL(OP_AND_LSL_REG), // OP_AND_LSL_REG /* 0000 0000 0010 */ TABDECL(OP_AND_LSR_IMM), // OP_AND_LSR_IMM /* 0000 0000 0011 */ TABDECL(OP_AND_LSR_REG), // OP_AND_LSR_REG /* 0000 0000 0100 */ TABDECL(OP_AND_ASR_IMM), // OP_AND_ASR_IMM /* 0000 0000 0101 */ TABDECL(OP_AND_ASR_REG), // OP_AND_ASR_REG /* 0000 0000 0110 */ TABDECL(OP_AND_ROR_IMM), // OP_AND_ROR_IMM /* 0000 0000 0111 */ TABDECL(OP_AND_ROR_REG), // OP_AND_ROR_REG /* 0000 0000 1000 */ TABDECL(OP_AND_LSL_IMM), // OP_AND_LSL_IMM /* 0000 0000 1001 */ TABDECL(OP_MUL), // OP_MUL /* 0000 0000 1010 */ TABDECL(OP_AND_LSR_IMM), // OP_AND_LSR_IMM /* 0000 0000 1011 */ TABDECL(OP_STRH_POS_INDE_M_REG_OFF), // OP_STRH_POS_INDE_M_REG_OFF /* 0000 0000 1100 */ TABDECL(OP_AND_ASR_IMM), // OP_AND_ASR_IMM /* 0000 0000 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0000 1110 */ TABDECL(OP_AND_ROR_IMM), // OP_AND_ROR_IMM /* 0000 0000 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0001 0000 */ TABDECL(OP_AND_S_LSL_IMM), // OP_AND_S_LSL_IMM /* 0000 0001 0001 */ TABDECL(OP_AND_S_LSL_REG), // OP_AND_S_LSL_REG /* 0000 0001 0010 */ TABDECL(OP_AND_S_LSR_IMM), // OP_AND_S_LSR_IMM /* 0000 0001 0011 */ TABDECL(OP_AND_S_LSR_REG), // OP_AND_S_LSR_REG /* 0000 0001 0100 */ TABDECL(OP_AND_S_ASR_IMM), // OP_AND_S_ASR_IMM /* 0000 0001 0101 */ TABDECL(OP_AND_S_ASR_REG), // OP_AND_S_ASR_REG /* 0000 0001 0110 */ TABDECL(OP_AND_S_ROR_IMM), // OP_AND_S_ROR_IMM /* 0000 0001 0111 */ TABDECL(OP_AND_S_ROR_REG), // OP_AND_S_ROR_REG /* 0000 0001 1000 */ TABDECL(OP_AND_S_LSL_IMM), // OP_AND_S_LSL_IMM /* 0000 0001 1001 */ TABDECL(OP_MUL_S), // OP_MUL_S /* 0000 0001 1010 */ TABDECL(OP_AND_S_LSR_IMM), // OP_AND_S_LSR_IMM /* 0000 0001 1011 */ TABDECL(OP_LDRH_POS_INDE_M_REG_OFF), // OP_LDRH_POS_INDE_M_REG_OFF /* 0000 0001 1100 */ TABDECL(OP_AND_S_ASR_IMM), // OP_AND_S_ASR_IMM /* 0000 0001 1101 */ TABDECL(OP_LDRSB_POS_INDE_M_REG_OFF), // OP_LDRSB_POS_INDE_M_REG_OFF /* 0000 0001 1110 */ TABDECL(OP_AND_S_ROR_IMM), // OP_AND_S_ROR_IMM /* 0000 0001 1111 */ TABDECL(OP_LDRSH_POS_INDE_M_REG_OFF), // OP_LDRSH_POS_INDE_M_REG_OFF /* 0000 0010 0000 */ TABDECL(OP_EOR_LSL_IMM), // OP_EOR_LSL_IMM /* 0000 0010 0001 */ TABDECL(OP_EOR_LSL_REG), // OP_EOR_LSL_REG /* 0000 0010 0010 */ TABDECL(OP_EOR_LSR_IMM), // OP_EOR_LSR_IMM /* 0000 0010 0011 */ TABDECL(OP_EOR_LSR_REG), // OP_EOR_LSR_REG /* 0000 0010 0100 */ TABDECL(OP_EOR_ASR_IMM), // OP_EOR_ASR_IMM /* 0000 0010 0101 */ TABDECL(OP_EOR_ASR_REG), // OP_EOR_ASR_REG /* 0000 0010 0110 */ TABDECL(OP_EOR_ROR_IMM), // OP_EOR_ROR_IMM /* 0000 0010 0111 */ TABDECL(OP_EOR_ROR_REG), // OP_EOR_ROR_REG /* 0000 0010 1000 */ TABDECL(OP_EOR_LSL_IMM), // OP_EOR_LSL_IMM /* 0000 0010 1001 */ TABDECL(OP_MLA), // OP_MLA /* 0000 0010 1010 */ TABDECL(OP_EOR_LSR_IMM), // OP_EOR_LSR_IMM /* 0000 0010 1011 */ TABDECL(OP_UND), /* 0000 0010 1100 */ TABDECL(OP_EOR_ASR_IMM), // OP_EOR_ASR_IMM /* 0000 0010 1101 */ TABDECL(OP_UND), /* 0000 0010 1110 */ TABDECL(OP_EOR_ROR_IMM), // OP_EOR_ROR_IMM /* 0000 0010 1111 */ TABDECL(OP_UND), /* 0000 0011 0000 */ TABDECL(OP_EOR_S_LSL_IMM), // OP_EOR_S_LSL_IMM /* 0000 0011 0001 */ TABDECL(OP_EOR_S_LSL_REG), // OP_EOR_S_LSL_REG /* 0000 0011 0010 */ TABDECL(OP_EOR_S_LSR_IMM), // OP_EOR_S_LSR_IMM /* 0000 0011 0011 */ TABDECL(OP_EOR_S_LSR_REG), // OP_EOR_S_LSR_REG /* 0000 0011 0100 */ TABDECL(OP_EOR_S_ASR_IMM), // OP_EOR_S_ASR_IMM /* 0000 0011 0101 */ TABDECL(OP_EOR_S_ASR_REG), // OP_EOR_S_ASR_REG /* 0000 0011 0110 */ TABDECL(OP_EOR_S_ROR_IMM), // OP_EOR_S_ROR_IMM /* 0000 0011 0111 */ TABDECL(OP_EOR_S_ROR_REG), // OP_EOR_S_ROR_REG /* 0000 0011 1000 */ TABDECL(OP_EOR_S_LSL_IMM), // OP_EOR_S_LSL_IMM /* 0000 0011 1001 */ TABDECL(OP_MLA_S), // OP_MLA_S /* 0000 0011 1010 */ TABDECL(OP_EOR_S_LSR_IMM), // OP_EOR_S_LSR_IMM /* 0000 0011 1011 */ TABDECL(OP_UND), /* 0000 0011 1100 */ TABDECL(OP_EOR_S_ASR_IMM), // OP_EOR_S_ASR_IMM /* 0000 0011 1101 */ TABDECL(OP_UND), /* 0000 0011 1110 */ TABDECL(OP_EOR_S_ROR_IMM), // OP_EOR_S_ROR_IMM /* 0000 0011 1111 */ TABDECL(OP_UND), /* 0000 0100 0000 */ TABDECL(OP_SUB_LSL_IMM), // OP_SUB_LSL_IMM /* 0000 0100 0001 */ TABDECL(OP_SUB_LSL_REG), // OP_SUB_LSL_REG /* 0000 0100 0010 */ TABDECL(OP_SUB_LSR_IMM), // OP_SUB_LSR_IMM /* 0000 0100 0011 */ TABDECL(OP_SUB_LSR_REG), // OP_SUB_LSR_REG /* 0000 0100 0100 */ TABDECL(OP_SUB_ASR_IMM), // OP_SUB_ASR_IMM /* 0000 0100 0101 */ TABDECL(OP_SUB_ASR_REG), // OP_SUB_ASR_REG /* 0000 0100 0110 */ TABDECL(OP_SUB_ROR_IMM), // OP_SUB_ROR_IMM /* 0000 0100 0111 */ TABDECL(OP_SUB_ROR_REG), // OP_SUB_ROR_REG /* 0000 0100 1000 */ TABDECL(OP_SUB_LSL_IMM), // OP_SUB_LSL_IMM /* 0000 0100 1001 */ TABDECL(OP_UND), /* 0000 0100 1010 */ TABDECL(OP_SUB_LSR_IMM), // OP_SUB_LSR_IMM /* 0000 0100 1011 */ TABDECL(OP_STRH_POS_INDE_M_IMM_OFF), // OP_STRH_POS_INDE_M_IMM_OFF /* 0000 0100 1100 */ TABDECL(OP_SUB_ASR_IMM), // OP_SUB_ASR_IMM /* 0000 0100 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0100 1110 */ TABDECL(OP_SUB_ROR_IMM), // OP_SUB_ROR_IMM /* 0000 0100 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0101 0000 */ TABDECL(OP_SUB_S_LSL_IMM), // OP_SUB_S_LSL_IMM /* 0000 0101 0001 */ TABDECL(OP_SUB_S_LSL_REG), // OP_SUB_S_LSL_REG /* 0000 0101 0010 */ TABDECL(OP_SUB_S_LSR_IMM), // OP_SUB_S_LSR_IMM /* 0000 0101 0011 */ TABDECL(OP_SUB_S_LSR_REG), // OP_SUB_S_LSR_REG /* 0000 0101 0100 */ TABDECL(OP_SUB_S_ASR_IMM), // OP_SUB_S_ASR_IMM /* 0000 0101 0101 */ TABDECL(OP_SUB_S_ASR_REG), // OP_SUB_S_ASR_REG /* 0000 0101 0110 */ TABDECL(OP_SUB_S_ROR_IMM), // OP_SUB_S_ROR_IMM /* 0000 0101 0111 */ TABDECL(OP_SUB_S_ROR_REG), // OP_SUB_S_ROR_REG /* 0000 0101 1000 */ TABDECL(OP_SUB_S_LSL_IMM), // OP_SUB_S_LSL_IMM /* 0000 0101 1001 */ TABDECL(OP_UND), /* 0000 0101 1010 */ TABDECL(OP_SUB_S_LSR_IMM), // OP_SUB_S_LSR_IMM /* 0000 0101 1011 */ TABDECL(OP_LDRH_POS_INDE_M_IMM_OFF), // OP_LDRH_POS_INDE_M_IMM_OFF /* 0000 0101 1100 */ TABDECL(OP_SUB_S_ASR_IMM), // OP_SUB_S_ASR_IMM /* 0000 0101 1101 */ TABDECL(OP_LDRSB_POS_INDE_M_IMM_OFF), // OP_LDRSB_POS_INDE_M_IMM_OFF /* 0000 0101 1110 */ TABDECL(OP_SUB_S_ROR_IMM), // OP_SUB_S_ROR_IMM /* 0000 0101 1111 */ TABDECL(OP_LDRSH_POS_INDE_M_IMM_OFF), // OP_LDRSH_POS_INDE_M_IMM_OFF /* 0000 0110 0000 */ TABDECL(OP_RSB_LSL_IMM), // OP_RSB_LSL_IMM /* 0000 0110 0001 */ TABDECL(OP_RSB_LSL_REG), // OP_RSB_LSL_REG /* 0000 0110 0010 */ TABDECL(OP_RSB_LSR_IMM), // OP_RSB_LSR_IMM /* 0000 0110 0011 */ TABDECL(OP_RSB_LSR_REG), // OP_RSB_LSR_REG /* 0000 0110 0100 */ TABDECL(OP_RSB_ASR_IMM), // OP_RSB_ASR_IMM /* 0000 0110 0101 */ TABDECL(OP_RSB_ASR_REG), // OP_RSB_ASR_REG /* 0000 0110 0110 */ TABDECL(OP_RSB_ROR_IMM), // OP_RSB_ROR_IMM /* 0000 0110 0111 */ TABDECL(OP_RSB_ROR_REG), // OP_RSB_ROR_REG /* 0000 0110 1000 */ TABDECL(OP_RSB_LSL_IMM), // OP_RSB_LSL_IMM /* 0000 0110 1001 */ TABDECL(OP_UND), /* 0000 0110 1010 */ TABDECL(OP_RSB_LSR_IMM), // OP_RSB_LSR_IMM /* 0000 0110 1011 */ TABDECL(OP_UND), /* 0000 0110 1100 */ TABDECL(OP_RSB_ASR_IMM), // OP_RSB_ASR_IMM /* 0000 0110 1101 */ TABDECL(OP_UND), /* 0000 0110 1110 */ TABDECL(OP_RSB_ROR_IMM), // OP_RSB_ROR_IMM /* 0000 0110 1111 */ TABDECL(OP_UND), /* 0000 0111 0000 */ TABDECL(OP_RSB_S_LSL_IMM), // OP_RSB_S_LSL_IMM /* 0000 0111 0001 */ TABDECL(OP_RSB_S_LSL_REG), // OP_RSB_S_LSL_REG /* 0000 0111 0010 */ TABDECL(OP_RSB_S_LSR_IMM), // OP_RSB_S_LSR_IMM /* 0000 0111 0011 */ TABDECL(OP_RSB_S_LSR_REG), // OP_RSB_S_LSR_REG /* 0000 0111 0100 */ TABDECL(OP_RSB_S_ASR_IMM), // OP_RSB_S_ASR_IMM /* 0000 0111 0101 */ TABDECL(OP_RSB_S_ASR_REG), // OP_RSB_S_ASR_REG /* 0000 0111 0110 */ TABDECL(OP_RSB_S_ROR_IMM), // OP_RSB_S_ROR_IMM /* 0000 0111 0111 */ TABDECL(OP_RSB_S_ROR_REG), // OP_RSB_S_ROR_REG /* 0000 0111 1000 */ TABDECL(OP_RSB_S_LSL_IMM), // OP_RSB_S_LSL_IMM /* 0000 0111 1001 */ TABDECL(OP_UND), /* 0000 0111 1010 */ TABDECL(OP_RSB_S_LSR_IMM), // OP_RSB_S_LSR_IMM /* 0000 0111 1011 */ TABDECL(OP_UND), /* 0000 0111 1100 */ TABDECL(OP_RSB_S_ASR_IMM), // OP_RSB_S_ASR_IMM /* 0000 0111 1101 */ TABDECL(OP_UND), /* 0000 0111 1110 */ TABDECL(OP_RSB_S_ROR_IMM), // OP_RSB_S_ROR_IMM /* 0000 0111 1111 */ TABDECL(OP_UND), /* 0000 1000 0000 */ TABDECL(OP_ADD_LSL_IMM), // OP_ADD_LSL_IMM /* 0000 1000 0001 */ TABDECL(OP_ADD_LSL_REG), // OP_ADD_LSL_REG /* 0000 1000 0010 */ TABDECL(OP_ADD_LSR_IMM), // OP_ADD_LSR_IMM /* 0000 1000 0011 */ TABDECL(OP_ADD_LSR_REG), // OP_ADD_LSR_REG /* 0000 1000 0100 */ TABDECL(OP_ADD_ASR_IMM), // OP_ADD_ASR_IMM /* 0000 1000 0101 */ TABDECL(OP_ADD_ASR_REG), // OP_ADD_ASR_REG /* 0000 1000 0110 */ TABDECL(OP_ADD_ROR_IMM), // OP_ADD_ROR_IMM /* 0000 1000 0111 */ TABDECL(OP_ADD_ROR_REG), // OP_ADD_ROR_REG /* 0000 1000 1000 */ TABDECL(OP_ADD_LSL_IMM), // OP_ADD_LSL_IMM /* 0000 1000 1001 */ TABDECL(OP_UMULL), // OP_UMULL /* 0000 1000 1010 */ TABDECL(OP_ADD_LSR_IMM), // OP_ADD_LSR_IMM /* 0000 1000 1011 */ TABDECL(OP_STRH_POS_INDE_P_REG_OFF), // OP_STRH_POS_INDE_P_REG_OFF /* 0000 1000 1100 */ TABDECL(OP_ADD_ASR_IMM), // OP_ADD_ASR_IMM /* 0000 1000 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1000 1110 */ TABDECL(OP_ADD_ROR_IMM), // OP_ADD_ROR_IMM /* 0000 1000 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1001 0000 */ TABDECL(OP_ADD_S_LSL_IMM), // OP_ADD_S_LSL_IMM /* 0000 1001 0001 */ TABDECL(OP_ADD_S_LSL_REG), // OP_ADD_S_LSL_REG /* 0000 1001 0010 */ TABDECL(OP_ADD_S_LSR_IMM), // OP_ADD_S_LSR_IMM /* 0000 1001 0011 */ TABDECL(OP_ADD_S_LSR_REG), // OP_ADD_S_LSR_REG /* 0000 1001 0100 */ TABDECL(OP_ADD_S_ASR_IMM), // OP_ADD_S_ASR_IMM /* 0000 1001 0101 */ TABDECL(OP_ADD_S_ASR_REG), // OP_ADD_S_ASR_REG /* 0000 1001 0110 */ TABDECL(OP_ADD_S_ROR_IMM), // OP_ADD_S_ROR_IMM /* 0000 1001 0111 */ TABDECL(OP_ADD_S_ROR_REG), // OP_ADD_S_ROR_REG /* 0000 1001 1000 */ TABDECL(OP_ADD_S_LSL_IMM), // OP_ADD_S_LSL_IMM /* 0000 1001 1001 */ TABDECL(OP_UMULL_S), // OP_UMULL_S /* 0000 1001 1010 */ TABDECL(OP_ADD_S_LSR_IMM), // OP_ADD_S_LSR_IMM /* 0000 1001 1011 */ TABDECL(OP_LDRH_POS_INDE_P_REG_OFF), // OP_LDRH_POS_INDE_P_REG_OFF /* 0000 1001 1100 */ TABDECL(OP_ADD_S_ASR_IMM), // OP_ADD_S_ASR_IMM /* 0000 1001 1101 */ TABDECL(OP_LDRSB_POS_INDE_P_REG_OFF), // OP_LDRSB_POS_INDE_P_REG_OFF /* 0000 1001 1110 */ TABDECL(OP_ADD_S_ROR_IMM), // OP_ADD_S_ROR_IMM /* 0000 1001 1111 */ TABDECL(OP_LDRSH_POS_INDE_P_REG_OFF), // OP_LDRSH_POS_INDE_P_REG_OFF /* 0000 1010 0000 */ TABDECL(OP_ADC_LSL_IMM), // OP_ADC_LSL_IMM /* 0000 1010 0001 */ TABDECL(OP_ADC_LSL_REG), // OP_ADC_LSL_REG /* 0000 1010 0010 */ TABDECL(OP_ADC_LSR_IMM), // OP_ADC_LSR_IMM /* 0000 1010 0011 */ TABDECL(OP_ADC_LSR_REG), // OP_ADC_LSR_REG /* 0000 1010 0100 */ TABDECL(OP_ADC_ASR_IMM), // OP_ADC_ASR_IMM /* 0000 1010 0101 */ TABDECL(OP_ADC_ASR_REG), // OP_ADC_ASR_REG /* 0000 1010 0110 */ TABDECL(OP_ADC_ROR_IMM), // OP_ADC_ROR_IMM /* 0000 1010 0111 */ TABDECL(OP_ADC_ROR_REG), // OP_ADC_ROR_REG /* 0000 1010 1000 */ TABDECL(OP_ADC_LSL_IMM), // OP_ADC_LSL_IMM /* 0000 1010 1001 */ TABDECL(OP_UMLAL), // OP_UMLAL /* 0000 1010 1010 */ TABDECL(OP_ADC_LSR_IMM), // OP_ADC_LSR_IMM /* 0000 1010 1011 */ TABDECL(OP_UND), /* 0000 1010 1100 */ TABDECL(OP_ADC_ASR_IMM), // OP_ADC_ASR_IMM /* 0000 1010 1101 */ TABDECL(OP_UND), /* 0000 1010 1110 */ TABDECL(OP_ADC_ROR_IMM), // OP_ADC_ROR_IMM /* 0000 1010 1111 */ TABDECL(OP_UND), /* 0000 1011 0000 */ TABDECL(OP_ADC_S_LSL_IMM), // OP_ADC_S_LSL_IMM /* 0000 1011 0001 */ TABDECL(OP_ADC_S_LSL_REG), // OP_ADC_S_LSL_REG /* 0000 1011 0010 */ TABDECL(OP_ADC_S_LSR_IMM), // OP_ADC_S_LSR_IMM /* 0000 1011 0011 */ TABDECL(OP_ADC_S_LSR_REG), // OP_ADC_S_LSR_REG /* 0000 1011 0100 */ TABDECL(OP_ADC_S_ASR_IMM), // OP_ADC_S_ASR_IMM /* 0000 1011 0101 */ TABDECL(OP_ADC_S_ASR_REG), // OP_ADC_S_ASR_REG /* 0000 1011 0110 */ TABDECL(OP_ADC_S_ROR_IMM), // OP_ADC_S_ROR_IMM /* 0000 1011 0111 */ TABDECL(OP_ADC_S_ROR_REG), // OP_ADC_S_ROR_REG /* 0000 1011 1000 */ TABDECL(OP_ADC_S_LSL_IMM), // OP_ADC_S_LSL_IMM /* 0000 1011 1001 */ TABDECL(OP_UMLAL_S), // OP_UMLAL_S /* 0000 1011 1010 */ TABDECL(OP_ADC_S_LSR_IMM), // OP_ADC_S_LSR_IMM /* 0000 1011 1011 */ TABDECL(OP_UND), /* 0000 1011 1100 */ TABDECL(OP_ADC_S_ASR_IMM), // OP_ADC_S_ASR_IMM /* 0000 1011 1101 */ TABDECL(OP_UND), /* 0000 1011 1110 */ TABDECL(OP_ADC_S_ROR_IMM), // OP_ADC_S_ROR_IMM /* 0000 1011 1111 */ TABDECL(OP_UND), /* 0000 1100 0000 */ TABDECL(OP_SBC_LSL_IMM), // OP_SBC_LSL_IMM /* 0000 1100 0001 */ TABDECL(OP_SBC_LSL_REG), // OP_SBC_LSL_REG /* 0000 1100 0010 */ TABDECL(OP_SBC_LSR_IMM), // OP_SBC_LSR_IMM /* 0000 1100 0011 */ TABDECL(OP_SBC_LSR_REG), // OP_SBC_LSR_REG /* 0000 1100 0100 */ TABDECL(OP_SBC_ASR_IMM), // OP_SBC_ASR_IMM /* 0000 1100 0101 */ TABDECL(OP_SBC_ASR_REG), // OP_SBC_ASR_REG /* 0000 1100 0110 */ TABDECL(OP_SBC_ROR_IMM), // OP_SBC_ROR_IMM /* 0000 1100 0111 */ TABDECL(OP_SBC_ROR_REG), // OP_SBC_ROR_REG /* 0000 1100 1000 */ TABDECL(OP_SBC_LSL_IMM), // OP_SBC_LSL_IMM /* 0000 1100 1001 */ TABDECL(OP_SMULL), // OP_SMULL /* 0000 1100 1010 */ TABDECL(OP_SBC_LSR_IMM), // OP_SBC_LSR_IMM /* 0000 1100 1011 */ TABDECL(OP_STRH_POS_INDE_P_IMM_OFF), // OP_STRH_POS_INDE_P_IMM_OFF /* 0000 1100 1100 */ TABDECL(OP_SBC_ASR_IMM), // OP_SBC_ASR_IMM /* 0000 1100 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1100 1110 */ TABDECL(OP_SBC_ROR_IMM), // OP_SBC_ROR_IMM /* 0000 1100 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1101 0000 */ TABDECL(OP_SBC_S_LSL_IMM), // OP_SBC_S_LSL_IMM /* 0000 1101 0001 */ TABDECL(OP_SBC_S_LSL_REG), // OP_SBC_S_LSL_REG /* 0000 1101 0010 */ TABDECL(OP_SBC_S_LSR_IMM), // OP_SBC_S_LSR_IMM /* 0000 1101 0011 */ TABDECL(OP_SBC_S_LSR_REG), // OP_SBC_S_LSR_REG /* 0000 1101 0100 */ TABDECL(OP_SBC_S_ASR_IMM), // OP_SBC_S_ASR_IMM /* 0000 1101 0101 */ TABDECL(OP_SBC_S_ASR_REG), // OP_SBC_S_ASR_REG /* 0000 1101 0110 */ TABDECL(OP_SBC_S_ROR_IMM), // OP_SBC_S_ROR_IMM /* 0000 1101 0111 */ TABDECL(OP_SBC_S_ROR_REG), // OP_SBC_S_ROR_REG /* 0000 1101 1000 */ TABDECL(OP_SBC_S_LSL_IMM), // OP_SBC_S_LSL_IMM /* 0000 1101 1001 */ TABDECL(OP_SMULL_S), // OP_SMULL_S /* 0000 1101 1010 */ TABDECL(OP_SBC_S_LSR_IMM), // OP_SBC_S_LSR_IMM /* 0000 1101 1011 */ TABDECL(OP_LDRH_POS_INDE_P_IMM_OFF), // OP_LDRH_POS_INDE_P_IMM_OFF /* 0000 1101 1100 */ TABDECL(OP_SBC_S_ASR_IMM), // OP_SBC_S_ASR_IMM /* 0000 1101 1101 */ TABDECL(OP_LDRSB_POS_INDE_P_IMM_OFF), // OP_LDRSB_POS_INDE_P_IMM_OFF /* 0000 1101 1110 */ TABDECL(OP_SBC_S_ROR_IMM), // OP_SBC_S_ROR_IMM /* 0000 1101 1111 */ TABDECL(OP_LDRSH_POS_INDE_P_IMM_OFF), // OP_LDRSH_POS_INDE_P_IMM_OFF /* 0000 1110 0000 */ TABDECL(OP_RSC_LSL_IMM), // OP_RSC_LSL_IMM /* 0000 1110 0001 */ TABDECL(OP_RSC_LSL_REG), // OP_RSC_LSL_REG /* 0000 1110 0010 */ TABDECL(OP_RSC_LSR_IMM), // OP_RSC_LSR_IMM /* 0000 1110 0011 */ TABDECL(OP_RSC_LSR_REG), // OP_RSC_LSR_REG /* 0000 1110 0100 */ TABDECL(OP_RSC_ASR_IMM), // OP_RSC_ASR_IMM /* 0000 1110 0101 */ TABDECL(OP_RSC_ASR_REG), // OP_RSC_ASR_REG /* 0000 1110 0110 */ TABDECL(OP_RSC_ROR_IMM), // OP_RSC_ROR_IMM /* 0000 1110 0111 */ TABDECL(OP_RSC_ROR_REG), // OP_RSC_ROR_REG /* 0000 1110 1000 */ TABDECL(OP_RSC_LSL_IMM), // OP_RSC_LSL_IMM /* 0000 1110 1001 */ TABDECL(OP_SMLAL), // OP_SMLAL /* 0000 1110 1010 */ TABDECL(OP_RSC_LSR_IMM), // OP_RSC_LSR_IMM /* 0000 1110 1011 */ TABDECL(OP_UND), /* 0000 1110 1100 */ TABDECL(OP_RSC_ASR_IMM), // OP_RSC_ASR_IMM /* 0000 1110 1101 */ TABDECL(OP_UND), /* 0000 1110 1110 */ TABDECL(OP_RSC_ROR_IMM), // OP_RSC_ROR_IMM /* 0000 1110 1111 */ TABDECL(OP_UND), /* 0000 1111 0000 */ TABDECL(OP_RSC_S_LSL_IMM), // OP_RSC_S_LSL_IMM /* 0000 1111 0001 */ TABDECL(OP_RSC_S_LSL_REG), // OP_RSC_S_LSL_REG /* 0000 1111 0010 */ TABDECL(OP_RSC_S_LSR_IMM), // OP_RSC_S_LSR_IMM /* 0000 1111 0011 */ TABDECL(OP_RSC_S_LSR_REG), // OP_RSC_S_LSR_REG /* 0000 1111 0100 */ TABDECL(OP_RSC_S_ASR_IMM), // OP_RSC_S_ASR_IMM /* 0000 1111 0101 */ TABDECL(OP_RSC_S_ASR_REG), // OP_RSC_S_ASR_REG /* 0000 1111 0110 */ TABDECL(OP_RSC_S_ROR_IMM), // OP_RSC_S_ROR_IMM /* 0000 1111 0111 */ TABDECL(OP_RSC_S_ROR_REG), // OP_RSC_S_ROR_REG /* 0000 1111 1000 */ TABDECL(OP_RSC_S_LSL_IMM), // OP_RSC_S_LSL_IMM /* 0000 1111 1001 */ TABDECL(OP_SMLAL_S), // OP_SMLAL_S /* 0000 1111 1010 */ TABDECL(OP_RSC_S_LSR_IMM), // OP_RSC_S_LSR_IMM /* 0000 1111 1011 */ TABDECL(OP_UND), /* 0000 1111 1100 */ TABDECL(OP_RSC_S_ASR_IMM), // OP_RSC_S_ASR_IMM /* 0000 1111 1101 */ TABDECL(OP_UND), /* 0000 1111 1110 */ TABDECL(OP_RSC_S_ROR_IMM), // OP_RSC_S_ROR_IMM /* 0000 1111 1111 */ TABDECL(OP_UND), /* 0001 0000 0000 */ TABDECL(OP_MRS_CPSR), // OP_MRS_CPSR /* 0001 0000 0001 */ TABDECL(OP_UND), /* 0001 0000 0010 */ TABDECL(OP_UND), /* 0001 0000 0011 */ TABDECL(OP_UND), /* 0001 0000 0100 */ TABDECL(OP_UND), /* 0001 0000 0101 */ TABDECL(OP_QADD), // OP_QADD /* 0001 0000 0110 */ TABDECL(OP_UND), /* 0001 0000 0111 */ TABDECL(OP_UND), /* 0001 0000 1000 */ TABDECL(OP_SMLA_B_B), // OP_SMLA_B_B /* 0001 0000 1001 */ TABDECL(OP_SWP), // OP_SWP /* 0001 0000 1010 */ TABDECL(OP_SMLA_T_B), // OP_SMLA_T_B /* 0001 0000 1011 */ TABDECL(OP_STRH_M_REG_OFF), // OP_STRH_M_REG_OFF /* 0001 0000 1100 */ TABDECL(OP_SMLA_B_T), // OP_SMLA_B_T /* 0001 0000 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0000 1110 */ TABDECL(OP_SMLA_T_T), // OP_SMLA_T_T /* 0001 0000 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0001 0000 */ TABDECL(OP_TST_LSL_IMM), // OP_TST_LSL_IMM /* 0001 0001 0001 */ TABDECL(OP_TST_LSL_REG), // OP_TST_LSL_REG /* 0001 0001 0010 */ TABDECL(OP_TST_LSR_IMM), // OP_TST_LSR_IMM /* 0001 0001 0011 */ TABDECL(OP_TST_LSR_REG), // OP_TST_LSR_REG /* 0001 0001 0100 */ TABDECL(OP_TST_ASR_IMM), // OP_TST_ASR_IMM /* 0001 0001 0101 */ TABDECL(OP_TST_ASR_REG), // OP_TST_ASR_REG /* 0001 0001 0110 */ TABDECL(OP_TST_ROR_IMM), // OP_TST_ROR_IMM /* 0001 0001 0111 */ TABDECL(OP_TST_ROR_REG), // OP_TST_ROR_REG /* 0001 0001 1000 */ TABDECL(OP_TST_LSL_IMM), // OP_TST_LSL_IMM /* 0001 0001 1001 */ TABDECL(OP_UND), /* 0001 0001 1010 */ TABDECL(OP_TST_LSR_IMM), // OP_TST_LSR_IMM /* 0001 0001 1011 */ TABDECL(OP_LDRH_M_REG_OFF), // OP_LDRH_M_REG_OFF /* 0001 0001 1100 */ TABDECL(OP_TST_ASR_IMM), // OP_TST_ASR_IMM /* 0001 0001 1101 */ TABDECL(OP_LDRSB_M_REG_OFF), // OP_LDRSB_M_REG_OFF /* 0001 0001 1110 */ TABDECL(OP_TST_ROR_IMM), // OP_TST_ROR_IMM /* 0001 0001 1111 */ TABDECL(OP_LDRSH_M_REG_OFF), // OP_LDRSH_M_REG_OFF /* 0001 0010 0000 */ TABDECL(OP_MSR_CPSR), // OP_MSR_CPSR /* 0001 0010 0001 */ TABDECL(OP_BX), // OP_BX /* 0001 0010 0010 */ TABDECL(OP_UND), /* 0001 0010 0011 */ TABDECL(OP_BLX_REG), // OP_BLX_REG /* 0001 0010 0100 */ TABDECL(OP_UND), /* 0001 0010 0101 */ TABDECL(OP_QSUB), // OP_QSUB /* 0001 0010 0110 */ TABDECL(OP_UND), /* 0001 0010 0111 */ TABDECL(OP_BKPT), // OP_BKPT /* 0001 0010 1000 */ TABDECL(OP_SMLAW_B), // OP_SMLAW_B /* 0001 0010 1001 */ TABDECL(OP_UND), /* 0001 0010 1010 */ TABDECL(OP_SMULW_B), // OP_SMULW_B /* 0001 0010 1011 */ TABDECL(OP_STRH_PRE_INDE_M_REG_OFF), // OP_STRH_PRE_INDE_M_REG_OFF /* 0001 0010 1100 */ TABDECL(OP_SMLAW_T), // OP_SMLAW_T /* 0001 0010 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0010 1110 */ TABDECL(OP_SMULW_T), // OP_SMULW_T /* 0001 0010 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0011 0000 */ TABDECL(OP_TEQ_LSL_IMM), // OP_TEQ_LSL_IMM /* 0001 0011 0001 */ TABDECL(OP_TEQ_LSL_REG), // OP_TEQ_LSL_REG /* 0001 0011 0010 */ TABDECL(OP_TEQ_LSR_IMM), // OP_TEQ_LSR_IMM /* 0001 0011 0011 */ TABDECL(OP_TEQ_LSR_REG), // OP_TEQ_LSR_REG /* 0001 0011 0100 */ TABDECL(OP_TEQ_ASR_IMM), // OP_TEQ_ASR_IMM /* 0001 0011 0101 */ TABDECL(OP_TEQ_ASR_REG), // OP_TEQ_ASR_REG /* 0001 0011 0110 */ TABDECL(OP_TEQ_ROR_IMM), // OP_TEQ_ROR_IMM /* 0001 0011 0111 */ TABDECL(OP_TEQ_ROR_REG), // OP_TEQ_ROR_REG /* 0001 0011 1000 */ TABDECL(OP_TEQ_LSL_IMM), // OP_TEQ_LSL_IMM /* 0001 0011 1001 */ TABDECL(OP_UND), /* 0001 0011 1010 */ TABDECL(OP_TEQ_LSR_IMM), // OP_TEQ_LSR_IMM /* 0001 0011 1011 */ TABDECL(OP_LDRH_PRE_INDE_M_REG_OFF), // OP_LDRH_PRE_INDE_M_REG_OFF /* 0001 0011 1100 */ TABDECL(OP_TEQ_ASR_IMM), // OP_TEQ_ASR_IMM /* 0001 0011 1101 */ TABDECL(OP_LDRSB_PRE_INDE_M_REG_OFF), // OP_LDRSB_PRE_INDE_M_REG_OFF /* 0001 0011 1110 */ TABDECL(OP_TEQ_ROR_IMM), // OP_TEQ_ROR_IMM /* 0001 0011 1111 */ TABDECL(OP_LDRSH_PRE_INDE_M_REG_OFF), // OP_LDRSH_PRE_INDE_M_REG_OFF /* 0001 0100 0000 */ TABDECL(OP_MRS_SPSR), // OP_MRS_SPSR /* 0001 0100 0001 */ TABDECL(OP_UND), /* 0001 0100 0010 */ TABDECL(OP_UND), /* 0001 0100 0011 */ TABDECL(OP_UND), /* 0001 0100 0100 */ TABDECL(OP_UND), /* 0001 0100 0101 */ TABDECL(OP_QDADD), // OP_QDADD /* 0001 0100 0110 */ TABDECL(OP_UND), /* 0001 0100 0111 */ TABDECL(OP_UND), /* 0001 0100 1000 */ TABDECL(OP_SMLAL_B_B), // OP_SMLAL_B_B /* 0001 0100 1001 */ TABDECL(OP_SWPB), // OP_SWPB /* 0001 0100 1010 */ TABDECL(OP_SMLAL_T_B), // OP_SMLAL_T_B /* 0001 0100 1011 */ TABDECL(OP_STRH_M_IMM_OFF), // OP_STRH_M_IMM_OFF /* 0001 0100 1100 */ TABDECL(OP_SMLAL_B_T), // OP_SMLAL_B_T /* 0001 0100 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0100 1110 */ TABDECL(OP_SMLAL_T_T), // OP_SMLAL_T_T /* 0001 0100 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0101 0000 */ TABDECL(OP_CMP_LSL_IMM), // OP_CMP_LSL_IMM /* 0001 0101 0001 */ TABDECL(OP_CMP_LSL_REG), // OP_CMP_LSL_REG /* 0001 0101 0010 */ TABDECL(OP_CMP_LSR_IMM), // OP_CMP_LSR_IMM /* 0001 0101 0011 */ TABDECL(OP_CMP_LSR_REG), // OP_CMP_LSR_REG /* 0001 0101 0100 */ TABDECL(OP_CMP_ASR_IMM), // OP_CMP_ASR_IMM /* 0001 0101 0101 */ TABDECL(OP_CMP_ASR_REG), // OP_CMP_ASR_REG /* 0001 0101 0110 */ TABDECL(OP_CMP_ROR_IMM), // OP_CMP_ROR_IMM /* 0001 0101 0111 */ TABDECL(OP_CMP_ROR_REG), // OP_CMP_ROR_REG /* 0001 0101 1000 */ TABDECL(OP_CMP_LSL_IMM), // OP_CMP_LSL_IMM /* 0001 0101 1001 */ TABDECL(OP_UND), /* 0001 0101 1010 */ TABDECL(OP_CMP_LSR_IMM), // OP_CMP_LSR_IMM /* 0001 0101 1011 */ TABDECL(OP_LDRH_M_IMM_OFF), // OP_LDRH_M_IMM_OFF /* 0001 0101 1100 */ TABDECL(OP_CMP_ASR_IMM), // OP_CMP_ASR_IMM /* 0001 0101 1101 */ TABDECL(OP_LDRSB_M_IMM_OFF), // OP_LDRSB_M_IMM_OFF /* 0001 0101 1110 */ TABDECL(OP_CMP_ROR_IMM), // OP_CMP_ROR_IMM /* 0001 0101 1111 */ TABDECL(OP_LDRSH_M_IMM_OFF), // OP_LDRSH_M_IMM_OFF /* 0001 0110 0000 */ TABDECL(OP_MSR_SPSR), // OP_MSR_SPSR /* 0001 0110 0001 */ TABDECL(OP_CLZ), // OP_CLZ /* 0001 0110 0010 */ TABDECL(OP_UND), /* 0001 0110 0011 */ TABDECL(OP_UND), /* 0001 0110 0100 */ TABDECL(OP_UND), /* 0001 0110 0101 */ TABDECL(OP_QDSUB), // OP_QDSUB /* 0001 0110 0110 */ TABDECL(OP_UND), /* 0001 0110 0111 */ TABDECL(OP_UND), /* 0001 0110 1000 */ TABDECL(OP_SMUL_B_B), // OP_SMUL_B_B /* 0001 0110 1001 */ TABDECL(OP_UND), /* 0001 0110 1010 */ TABDECL(OP_SMUL_T_B), // OP_SMUL_T_B /* 0001 0110 1011 */ TABDECL(OP_STRH_PRE_INDE_M_IMM_OFF), // OP_STRH_PRE_INDE_M_IMM_OFF /* 0001 0110 1100 */ TABDECL(OP_SMUL_B_T), // OP_SMUL_B_T /* 0001 0110 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0110 1110 */ TABDECL(OP_SMUL_T_T), // OP_SMUL_T_T /* 0001 0110 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0111 0000 */ TABDECL(OP_CMN_LSL_IMM), // OP_CMN_LSL_IMM /* 0001 0111 0001 */ TABDECL(OP_CMN_LSL_REG), // OP_CMN_LSL_REG /* 0001 0111 0010 */ TABDECL(OP_CMN_LSR_IMM), // OP_CMN_LSR_IMM /* 0001 0111 0011 */ TABDECL(OP_CMN_LSR_REG), // OP_CMN_LSR_REG /* 0001 0111 0100 */ TABDECL(OP_CMN_ASR_IMM), // OP_CMN_ASR_IMM /* 0001 0111 0101 */ TABDECL(OP_CMN_ASR_REG), // OP_CMN_ASR_REG /* 0001 0111 0110 */ TABDECL(OP_CMN_ROR_IMM), // OP_CMN_ROR_IMM /* 0001 0111 0111 */ TABDECL(OP_CMN_ROR_REG), // OP_CMN_ROR_REG /* 0001 0111 1000 */ TABDECL(OP_CMN_LSL_IMM), // OP_CMN_LSL_IMM /* 0001 0111 1001 */ TABDECL(OP_UND), /* 0001 0111 1010 */ TABDECL(OP_CMN_LSR_IMM), // OP_CMN_LSR_IMM /* 0001 0111 1011 */ TABDECL(OP_LDRH_PRE_INDE_M_IMM_OFF), // OP_LDRH_PRE_INDE_M_IMM_OFF /* 0001 0111 1100 */ TABDECL(OP_CMN_ASR_IMM), // OP_CMN_ASR_IMM /* 0001 0111 1101 */ TABDECL(OP_LDRSB_PRE_INDE_M_IMM_OFF), // OP_LDRSB_PRE_INDE_M_IMM_OFF /* 0001 0111 1110 */ TABDECL(OP_CMN_ROR_IMM), // OP_CMN_ROR_IMM /* 0001 0111 1111 */ TABDECL(OP_LDRSH_PRE_INDE_M_IMM_OFF), // OP_LDRSH_PRE_INDE_M_IMM_OFF /* 0001 1000 0000 */ TABDECL(OP_ORR_LSL_IMM), // OP_ORR_LSL_IMM /* 0001 1000 0001 */ TABDECL(OP_ORR_LSL_REG), // OP_ORR_LSL_REG /* 0001 1000 0010 */ TABDECL(OP_ORR_LSR_IMM), // OP_ORR_LSR_IMM /* 0001 1000 0011 */ TABDECL(OP_ORR_LSR_REG), // OP_ORR_LSR_REG /* 0001 1000 0100 */ TABDECL(OP_ORR_ASR_IMM), // OP_ORR_ASR_IMM /* 0001 1000 0101 */ TABDECL(OP_ORR_ASR_REG), // OP_ORR_ASR_REG /* 0001 1000 0110 */ TABDECL(OP_ORR_ROR_IMM), // OP_ORR_ROR_IMM /* 0001 1000 0111 */ TABDECL(OP_ORR_ROR_REG), // OP_ORR_ROR_REG /* 0001 1000 1000 */ TABDECL(OP_ORR_LSL_IMM), // OP_ORR_LSL_IMM /* 0001 1000 1001 */ TABDECL(OP_STREX), // OP_STREX /* 0001 1000 1010 */ TABDECL(OP_ORR_LSR_IMM), // OP_ORR_LSR_IMM /* 0001 1000 1011 */ TABDECL(OP_STRH_P_REG_OFF), // OP_STRH_P_REG_OFF /* 0001 1000 1100 */ TABDECL(OP_ORR_ASR_IMM), // OP_ORR_ASR_IMM /* 0001 1000 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1000 1110 */ TABDECL(OP_ORR_ROR_IMM), // OP_ORR_ROR_IMM /* 0001 1000 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1001 0000 */ TABDECL(OP_ORR_S_LSL_IMM), // OP_ORR_S_LSL_IMM /* 0001 1001 0001 */ TABDECL(OP_ORR_S_LSL_REG), // OP_ORR_S_LSL_REG /* 0001 1001 0010 */ TABDECL(OP_ORR_S_LSR_IMM), // OP_ORR_S_LSR_IMM /* 0001 1001 0011 */ TABDECL(OP_ORR_S_LSR_REG), // OP_ORR_S_LSR_REG /* 0001 1001 0100 */ TABDECL(OP_ORR_S_ASR_IMM), // OP_ORR_S_ASR_IMM /* 0001 1001 0101 */ TABDECL(OP_ORR_S_ASR_REG), // OP_ORR_S_ASR_REG /* 0001 1001 0110 */ TABDECL(OP_ORR_S_ROR_IMM), // OP_ORR_S_ROR_IMM /* 0001 1001 0111 */ TABDECL(OP_ORR_S_ROR_REG), // OP_ORR_S_ROR_REG /* 0001 1001 1000 */ TABDECL(OP_ORR_S_LSL_IMM), // OP_ORR_S_LSL_IMM /* 0001 1001 1001 */ TABDECL(OP_LDREX), // OP_LDREX /* 0001 1001 1010 */ TABDECL(OP_ORR_S_LSR_IMM), // OP_ORR_S_LSR_IMM /* 0001 1001 1011 */ TABDECL(OP_LDRH_P_REG_OFF), // OP_LDRH_P_REG_OFF /* 0001 1001 1100 */ TABDECL(OP_ORR_S_ASR_IMM), // OP_ORR_S_ASR_IMM /* 0001 1001 1101 */ TABDECL(OP_LDRSB_P_REG_OFF), // OP_LDRSB_P_REG_OFF /* 0001 1001 1110 */ TABDECL(OP_ORR_S_ROR_IMM), // OP_ORR_S_ROR_IMM /* 0001 1001 1111 */ TABDECL(OP_LDRSH_P_REG_OFF), // OP_LDRSH_P_REG_OFF /* 0001 1010 0000 */ TABDECL(OP_MOV_LSL_IMM), // OP_MOV_LSL_IMM /* 0001 1010 0001 */ TABDECL(OP_MOV_LSL_REG), // OP_MOV_LSL_REG /* 0001 1010 0010 */ TABDECL(OP_MOV_LSR_IMM), // OP_MOV_LSR_IMM /* 0001 1010 0011 */ TABDECL(OP_MOV_LSR_REG), // OP_MOV_LSR_REG /* 0001 1010 0100 */ TABDECL(OP_MOV_ASR_IMM), // OP_MOV_ASR_IMM /* 0001 1010 0101 */ TABDECL(OP_MOV_ASR_REG), // OP_MOV_ASR_REG /* 0001 1010 0110 */ TABDECL(OP_MOV_ROR_IMM), // OP_MOV_ROR_IMM /* 0001 1010 0111 */ TABDECL(OP_MOV_ROR_REG), // OP_MOV_ROR_REG /* 0001 1010 1000 */ TABDECL(OP_MOV_LSL_IMM), // OP_MOV_LSL_IMM /* 0001 1010 1001 */ TABDECL(OP_UND), /* 0001 1010 1010 */ TABDECL(OP_MOV_LSR_IMM), // OP_MOV_LSR_IMM /* 0001 1010 1011 */ TABDECL(OP_STRH_PRE_INDE_P_REG_OFF), // OP_STRH_PRE_INDE_P_REG_OFF /* 0001 1010 1100 */ TABDECL(OP_MOV_ASR_IMM), // OP_MOV_ASR_IMM /* 0001 1010 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1010 1110 */ TABDECL(OP_MOV_ROR_IMM), // OP_MOV_ROR_IMM /* 0001 1010 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1011 0000 */ TABDECL(OP_MOV_S_LSL_IMM), // OP_MOV_S_LSL_IMM /* 0001 1011 0001 */ TABDECL(OP_MOV_S_LSL_REG), // OP_MOV_S_LSL_REG /* 0001 1011 0010 */ TABDECL(OP_MOV_S_LSR_IMM), // OP_MOV_S_LSR_IMM /* 0001 1011 0011 */ TABDECL(OP_MOV_S_LSR_REG), // OP_MOV_S_LSR_REG /* 0001 1011 0100 */ TABDECL(OP_MOV_S_ASR_IMM), // OP_MOV_S_ASR_IMM /* 0001 1011 0101 */ TABDECL(OP_MOV_S_ASR_REG), // OP_MOV_S_ASR_REG /* 0001 1011 0110 */ TABDECL(OP_MOV_S_ROR_IMM), // OP_MOV_S_ROR_IMM /* 0001 1011 0111 */ TABDECL(OP_MOV_S_ROR_REG), // OP_MOV_S_ROR_REG /* 0001 1011 1000 */ TABDECL(OP_MOV_S_LSL_IMM), // OP_MOV_S_LSL_IMM /* 0001 1011 1001 */ TABDECL(OP_UND), /* 0001 1011 1010 */ TABDECL(OP_MOV_S_LSR_IMM), // OP_MOV_S_LSR_IMM /* 0001 1011 1011 */ TABDECL(OP_LDRH_PRE_INDE_P_REG_OFF), // OP_LDRH_PRE_INDE_P_REG_OFF /* 0001 1011 1100 */ TABDECL(OP_MOV_S_ASR_IMM), // OP_MOV_S_ASR_IMM /* 0001 1011 1101 */ TABDECL(OP_LDRSB_PRE_INDE_P_REG_OFF), // OP_LDRSB_PRE_INDE_P_REG_OFF /* 0001 1011 1110 */ TABDECL(OP_MOV_S_ROR_IMM), // OP_MOV_S_ROR_IMM /* 0001 1011 1111 */ TABDECL(OP_LDRSH_PRE_INDE_P_REG_OFF), // OP_LDRSH_PRE_INDE_P_REG_OFF /* 0001 1100 0000 */ TABDECL(OP_BIC_LSL_IMM), // OP_BIC_LSL_IMM /* 0001 1100 0001 */ TABDECL(OP_BIC_LSL_REG), // OP_BIC_LSL_REG /* 0001 1100 0010 */ TABDECL(OP_BIC_LSR_IMM), // OP_BIC_LSR_IMM /* 0001 1100 0011 */ TABDECL(OP_BIC_LSR_REG), // OP_BIC_LSR_REG /* 0001 1100 0100 */ TABDECL(OP_BIC_ASR_IMM), // OP_BIC_ASR_IMM /* 0001 1100 0101 */ TABDECL(OP_BIC_ASR_REG), // OP_BIC_ASR_REG /* 0001 1100 0110 */ TABDECL(OP_BIC_ROR_IMM), // OP_BIC_ROR_IMM /* 0001 1100 0111 */ TABDECL(OP_BIC_ROR_REG), // OP_BIC_ROR_REG /* 0001 1100 1000 */ TABDECL(OP_BIC_LSL_IMM), // OP_BIC_LSL_IMM /* 0001 1100 1001 */ TABDECL(OP_UND), /* 0001 1100 1010 */ TABDECL(OP_BIC_LSR_IMM), // OP_BIC_LSR_IMM /* 0001 1100 1011 */ TABDECL(OP_STRH_P_IMM_OFF), // OP_STRH_P_IMM_OFF /* 0001 1100 1100 */ TABDECL(OP_BIC_ASR_IMM), // OP_BIC_ASR_IMM /* 0001 1100 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1100 1110 */ TABDECL(OP_BIC_ROR_IMM), // OP_BIC_ROR_IMM /* 0001 1100 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1101 0000 */ TABDECL(OP_BIC_S_LSL_IMM), // OP_BIC_S_LSL_IMM /* 0001 1101 0001 */ TABDECL(OP_BIC_S_LSL_REG), // OP_BIC_S_LSL_REG /* 0001 1101 0010 */ TABDECL(OP_BIC_S_LSR_IMM), // OP_BIC_S_LSR_IMM /* 0001 1101 0011 */ TABDECL(OP_BIC_S_LSR_REG), // OP_BIC_S_LSR_REG /* 0001 1101 0100 */ TABDECL(OP_BIC_S_ASR_IMM), // OP_BIC_S_ASR_IMM /* 0001 1101 0101 */ TABDECL(OP_BIC_S_ASR_REG), // OP_BIC_S_ASR_REG /* 0001 1101 0110 */ TABDECL(OP_BIC_S_ROR_IMM), // OP_BIC_S_ROR_IMM /* 0001 1101 0111 */ TABDECL(OP_BIC_S_ROR_REG), // OP_BIC_S_ROR_REG /* 0001 1101 1000 */ TABDECL(OP_BIC_S_LSL_IMM), // OP_BIC_S_LSL_IMM /* 0001 1101 1001 */ TABDECL(OP_UND), /* 0001 1101 1010 */ TABDECL(OP_BIC_S_LSR_IMM), // OP_BIC_S_LSR_IMM /* 0001 1101 1011 */ TABDECL(OP_LDRH_P_IMM_OFF), // OP_LDRH_P_IMM_OFF /* 0001 1101 1100 */ TABDECL(OP_BIC_S_ASR_IMM), // OP_BIC_S_ASR_IMM /* 0001 1101 1101 */ TABDECL(OP_LDRSB_P_IMM_OFF), // OP_LDRSB_P_IMM_OFF /* 0001 1101 1110 */ TABDECL(OP_BIC_S_ROR_IMM), // OP_BIC_S_ROR_IMM /* 0001 1101 1111 */ TABDECL(OP_LDRSH_P_IMM_OFF), // OP_LDRSH_P_IMM_OFF /* 0001 1110 0000 */ TABDECL(OP_MVN_LSL_IMM), // OP_MVN_LSL_IMM /* 0001 1110 0001 */ TABDECL(OP_MVN_LSL_REG), // OP_MVN_LSL_REG /* 0001 1110 0010 */ TABDECL(OP_MVN_LSR_IMM), // OP_MVN_LSR_IMM /* 0001 1110 0011 */ TABDECL(OP_MVN_LSR_REG), // OP_MVN_LSR_REG /* 0001 1110 0100 */ TABDECL(OP_MVN_ASR_IMM), // OP_MVN_ASR_IMM /* 0001 1110 0101 */ TABDECL(OP_MVN_ASR_REG), // OP_MVN_ASR_REG /* 0001 1110 0110 */ TABDECL(OP_MVN_ROR_IMM), // OP_MVN_ROR_IMM /* 0001 1110 0111 */ TABDECL(OP_MVN_ROR_REG), // OP_MVN_ROR_REG /* 0001 1110 1000 */ TABDECL(OP_MVN_LSL_IMM), // OP_MVN_LSL_IMM /* 0001 1110 1001 */ TABDECL(OP_UND), /* 0001 1110 1010 */ TABDECL(OP_MVN_LSR_IMM), // OP_MVN_LSR_IMM /* 0001 1110 1011 */ TABDECL(OP_STRH_PRE_INDE_P_IMM_OFF), // OP_STRH_PRE_INDE_P_IMM_OFF /* 0001 1110 1100 */ TABDECL(OP_MVN_ASR_IMM), // OP_MVN_ASR_IMM /* 0001 1110 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1110 1110 */ TABDECL(OP_MVN_ROR_IMM), // OP_MVN_ROR_IMM /* 0001 1110 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1111 0000 */ TABDECL(OP_MVN_S_LSL_IMM), // OP_MVN_S_LSL_IMM /* 0001 1111 0001 */ TABDECL(OP_MVN_S_LSL_REG), // OP_MVN_S_LSL_REG /* 0001 1111 0010 */ TABDECL(OP_MVN_S_LSR_IMM), // OP_MVN_S_LSR_IMM /* 0001 1111 0011 */ TABDECL(OP_MVN_S_LSR_REG), // OP_MVN_S_LSR_REG /* 0001 1111 0100 */ TABDECL(OP_MVN_S_ASR_IMM), // OP_MVN_S_ASR_IMM /* 0001 1111 0101 */ TABDECL(OP_MVN_S_ASR_REG), // OP_MVN_S_ASR_REG /* 0001 1111 0110 */ TABDECL(OP_MVN_S_ROR_IMM), // OP_MVN_S_ROR_IMM /* 0001 1111 0111 */ TABDECL(OP_MVN_S_ROR_REG), // OP_MVN_S_ROR_REG /* 0001 1111 1000 */ TABDECL(OP_MVN_S_LSL_IMM), // OP_MVN_S_LSL_IMM /* 0001 1111 1001 */ TABDECL(OP_UND), /* 0001 1111 1010 */ TABDECL(OP_MVN_S_LSR_IMM), // OP_MVN_S_LSR_IMM /* 0001 1111 1011 */ TABDECL(OP_LDRH_PRE_INDE_P_IMM_OFF), // OP_LDRH_PRE_INDE_P_IMM_OFF /* 0001 1111 1100 */ TABDECL(OP_MVN_S_ASR_IMM), // OP_MVN_S_ASR_IMM /* 0001 1111 1101 */ TABDECL(OP_LDRSB_PRE_INDE_P_IMM_OFF), // OP_LDRSB_PRE_INDE_P_IMM_OFF /* 0001 1111 1110 */ TABDECL(OP_MVN_S_ROR_IMM), // OP_MVN_S_ROR_IMM /* 0001 1111 1111 */ TABDECL(OP_LDRSH_PRE_INDE_P_IMM_OFF), // OP_LDRSH_PRE_INDE_P_IMM_OFF /* 0010 0000 0000 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0001 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0010 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0011 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0100 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0101 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0110 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0111 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1000 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1001 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1010 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1011 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1100 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1101 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1110 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1111 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0001 0000 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0001 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0010 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0011 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0100 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0101 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0110 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0111 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1000 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1001 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1010 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1011 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1100 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1101 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1110 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1111 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0010 0000 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0001 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0010 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0011 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0100 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0101 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0110 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0111 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1000 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1001 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1010 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1011 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1100 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1101 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1110 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1111 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0011 0000 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0001 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0010 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0011 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0100 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0101 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0110 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0111 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1000 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1001 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1010 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1011 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1100 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1101 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1110 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1111 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0100 0000 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0001 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0010 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0011 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0100 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0101 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0110 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0111 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1000 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1001 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1010 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1011 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1100 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1101 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1110 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1111 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0101 0000 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0001 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0010 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0011 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0100 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0101 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0110 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0111 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1000 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1001 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1010 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1011 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1100 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1101 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1110 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1111 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0110 0000 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0001 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0010 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0011 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0100 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0101 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0110 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0111 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1000 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1001 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1010 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1011 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1100 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1101 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1110 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1111 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0111 0000 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0001 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0010 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0011 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0100 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0101 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0110 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0111 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1000 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1001 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1010 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1011 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1100 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1101 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1110 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1111 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 1000 0000 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0001 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0010 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0011 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0100 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0101 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0110 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0111 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1000 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1001 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1010 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1011 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1100 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1101 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1110 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1111 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1001 0000 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0001 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0010 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0011 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0100 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0101 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0110 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0111 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1000 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1001 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1010 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1011 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1100 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1101 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1110 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1111 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1010 0000 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0001 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0010 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0011 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0100 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0101 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0110 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0111 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1000 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1001 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1010 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1011 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1100 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1101 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1110 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1111 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1011 0000 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0001 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0010 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0011 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0100 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0101 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0110 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0111 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1000 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1001 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1010 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1011 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1100 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1101 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1110 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1111 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1100 0000 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0001 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0010 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0011 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0100 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0101 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0110 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0111 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1000 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1001 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1010 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1011 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1100 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1101 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1110 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1111 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1101 0000 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0001 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0010 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0011 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0100 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0101 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0110 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0111 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1000 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1001 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1010 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1011 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1100 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1101 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1110 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1111 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1110 0000 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0001 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0010 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0011 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0100 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0101 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0110 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0111 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1000 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1001 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1010 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1011 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1100 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1101 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1110 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1111 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1111 0000 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0001 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0010 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0011 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0100 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0101 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0110 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0111 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1000 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1001 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1010 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1011 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1100 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1101 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1110 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1111 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0011 0000 0000 */ TABDECL(OP_UND), /* 0011 0000 0001 */ TABDECL(OP_UND), /* 0011 0000 0010 */ TABDECL(OP_UND), /* 0011 0000 0011 */ TABDECL(OP_UND), /* 0011 0000 0100 */ TABDECL(OP_UND), /* 0011 0000 0101 */ TABDECL(OP_UND), /* 0011 0000 0110 */ TABDECL(OP_UND), /* 0011 0000 0111 */ TABDECL(OP_UND), /* 0011 0000 1000 */ TABDECL(OP_UND), /* 0011 0000 1001 */ TABDECL(OP_UND), /* 0011 0000 1010 */ TABDECL(OP_UND), /* 0011 0000 1011 */ TABDECL(OP_UND), /* 0011 0000 1100 */ TABDECL(OP_UND), /* 0011 0000 1101 */ TABDECL(OP_UND), /* 0011 0000 1110 */ TABDECL(OP_UND), /* 0011 0000 1111 */ TABDECL(OP_UND), /* 0011 0001 0000 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0001 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0010 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0011 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0100 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0101 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0110 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0111 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1000 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1001 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1010 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1011 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1100 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1101 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1110 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1111 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0010 0000 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0001 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0010 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0011 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0100 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0101 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0110 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0111 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1000 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1001 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1010 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1011 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1100 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1101 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1110 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1111 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0011 0000 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0001 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0010 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0011 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0100 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0101 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0110 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0111 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1000 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1001 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1010 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1011 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1100 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1101 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1110 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1111 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0100 0000 */ TABDECL(OP_UND), /* 0011 0100 0001 */ TABDECL(OP_UND), /* 0011 0100 0010 */ TABDECL(OP_UND), /* 0011 0100 0011 */ TABDECL(OP_UND), /* 0011 0100 0100 */ TABDECL(OP_UND), /* 0011 0100 0101 */ TABDECL(OP_UND), /* 0011 0100 0110 */ TABDECL(OP_UND), /* 0011 0100 0111 */ TABDECL(OP_UND), /* 0011 0100 1000 */ TABDECL(OP_UND), /* 0011 0100 1001 */ TABDECL(OP_UND), /* 0011 0100 1010 */ TABDECL(OP_UND), /* 0011 0100 1011 */ TABDECL(OP_UND), /* 0011 0100 1100 */ TABDECL(OP_UND), /* 0011 0100 1101 */ TABDECL(OP_UND), /* 0011 0100 1110 */ TABDECL(OP_UND), /* 0011 0100 1111 */ TABDECL(OP_UND), /* 0011 0101 0000 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0001 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0010 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0011 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0100 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0101 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0110 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0111 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1000 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1001 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1010 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1011 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1100 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1101 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1110 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1111 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0110 0000 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0001 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0010 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0011 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0100 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0101 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0110 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0111 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1000 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1001 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1010 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1011 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1100 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1101 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1110 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1111 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0111 0000 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0001 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0010 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0011 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0100 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0101 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0110 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0111 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1000 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1001 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1010 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1011 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1100 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1101 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1110 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1111 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 1000 0000 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0001 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0010 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0011 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0100 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0101 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0110 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0111 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1000 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1001 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1010 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1011 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1100 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1101 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1110 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1111 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1001 0000 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0001 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0010 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0011 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0100 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0101 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0110 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0111 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1000 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1001 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1010 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1011 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1100 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1101 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1110 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1111 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1010 0000 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0001 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0010 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0011 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0100 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0101 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0110 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0111 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1000 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1001 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1010 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1011 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1100 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1101 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1110 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1111 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1011 0000 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0001 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0010 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0011 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0100 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0101 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0110 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0111 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1000 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1001 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1010 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1011 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1100 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1101 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1110 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1111 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1100 0000 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0001 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0010 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0011 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0100 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0101 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0110 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0111 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1000 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1001 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1010 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1011 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1100 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1101 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1110 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1111 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1101 0000 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0001 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0010 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0011 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0100 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0101 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0110 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0111 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1000 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1001 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1010 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1011 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1100 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1101 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1110 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1111 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1110 0000 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0001 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0010 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0011 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0100 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0101 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0110 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0111 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1000 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1001 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1010 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1011 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1100 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1101 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1110 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1111 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1111 0000 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0001 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0010 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0011 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0100 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0101 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0110 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0111 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1000 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1001 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1010 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1011 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1100 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1101 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1110 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1111 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0100 0000 0000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0001 0000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0010 0000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 0001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 0010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 0011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 0100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 0101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 0110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 0111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0010 1111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0011 0000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 0001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 0010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 0011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 0100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 0101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 0110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 0111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0011 1111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR; changed to OP_LDR in r3510 /* 0100 0100 0000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0101 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0110 0000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 0001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 0010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 0011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 0100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 0101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 0110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 0111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0110 1111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0100 0111 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 0111 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STRB; changed to OP_LDRB in r3510 /* 0100 1000 0000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1001 0000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1010 0000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1011 0000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 0001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 0010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 0011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 0100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 0101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 0110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 0111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1011 1111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND //changed from a POSTIND2 version in r3504 /* 0100 1100 0000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1101 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1110 0000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1111 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0101 0000 0000 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0001 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0010 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0011 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0100 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0101 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0110 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0111 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1000 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1001 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1010 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1011 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1100 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1101 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1110 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1111 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0001 0000 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0001 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0010 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0011 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0100 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0101 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0110 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0111 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1000 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1001 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1010 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1011 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1100 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1101 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1110 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1111 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0010 0000 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0001 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0010 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0011 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0100 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0101 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0110 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0111 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1000 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1001 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1010 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1011 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1100 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1101 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1110 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1111 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0011 0000 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0001 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0010 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0011 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0100 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0101 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0110 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0111 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1000 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1001 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1010 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1011 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1100 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1101 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1110 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1111 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0100 0000 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0001 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0010 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0011 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0100 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0101 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0110 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0111 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1000 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1001 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1010 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1011 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1100 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1101 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1110 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1111 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0101 0000 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0001 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0010 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0011 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0100 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0101 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0110 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0111 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1000 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1001 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1010 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1011 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1100 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1101 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1110 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1111 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0110 0000 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0001 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0010 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0011 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0100 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0101 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0110 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0111 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1000 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1001 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1010 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1011 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1100 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1101 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1110 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1111 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0111 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 1000 0000 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0001 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0010 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0011 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0100 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0101 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0110 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0111 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1000 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1001 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1010 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1011 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1100 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1101 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1110 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1111 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1001 0000 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0001 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0010 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0011 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0100 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0101 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0110 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0111 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1000 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1001 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1010 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1011 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1100 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1101 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1110 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1111 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1010 0000 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0001 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0010 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0011 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0100 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0101 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0110 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0111 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1000 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1001 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1010 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1011 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1100 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1101 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1110 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1111 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1011 0000 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0001 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0010 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0011 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0100 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0101 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0110 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0111 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1000 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1001 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1010 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1011 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1100 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1101 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1110 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1111 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1100 0000 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0001 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0010 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0011 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0100 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0101 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0110 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0111 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1000 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1001 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1010 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1011 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1100 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1101 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1110 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1111 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1101 0000 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0001 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0010 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0011 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0100 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0101 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0110 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0111 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1000 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1001 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1010 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1011 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1100 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1101 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1110 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1111 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1110 0000 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0001 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0010 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0011 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0100 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0101 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0110 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0111 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1000 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1001 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1010 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1011 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1100 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1101 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1110 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1111 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1111 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0110 0000 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND /* 0110 0000 0001 */ TABDECL(OP_UND), /* 0110 0000 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND /* 0110 0000 0011 */ TABDECL(OP_UND), /* 0110 0000 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND /* 0110 0000 0101 */ TABDECL(OP_UND), /* 0110 0000 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND /* 0110 0000 0111 */ TABDECL(OP_UND), /* 0110 0000 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND /* 0110 0000 1001 */ TABDECL(OP_UND), /* 0110 0000 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND /* 0110 0000 1011 */ TABDECL(OP_UND), /* 0110 0000 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND /* 0110 0000 1101 */ TABDECL(OP_UND), /* 0110 0000 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND /* 0110 0000 1111 */ TABDECL(OP_UND), /* 0110 0001 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND /* 0110 0001 0001 */ TABDECL(OP_UND), /* 0110 0001 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND /* 0110 0001 0011 */ TABDECL(OP_UND), /* 0110 0001 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND /* 0110 0001 0101 */ TABDECL(OP_UND), /* 0110 0001 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND /* 0110 0001 0111 */ TABDECL(OP_UND), /* 0110 0001 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND /* 0110 0001 1001 */ TABDECL(OP_UND), /* 0110 0001 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND /* 0110 0001 1011 */ TABDECL(OP_UND), /* 0110 0001 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND /* 0110 0001 1101 */ TABDECL(OP_UND), /* 0110 0001 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND /* 0110 0001 1111 */ TABDECL(OP_UND), /* 0110 0010 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 0001 */ TABDECL(OP_UND), /* 0110 0010 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 0011 */ TABDECL(OP_UND), /* 0110 0010 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 0101 */ TABDECL(OP_UND), /* 0110 0010 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 0111 */ TABDECL(OP_UND), /* 0110 0010 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 1001 */ TABDECL(OP_UND), /* 0110 0010 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 1011 */ TABDECL(OP_UND), /* 0110 0010 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 1101 */ TABDECL(OP_UND), /* 0110 0010 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0010 1111 */ TABDECL(OP_UND), /* 0110 0011 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 0001 */ TABDECL(OP_UND), /* 0110 0011 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 0011 */ TABDECL(OP_UND), /* 0110 0011 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 0101 */ TABDECL(OP_UND), /* 0110 0011 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 0111 */ TABDECL(OP_UND), /* 0110 0011 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 1001 */ TABDECL(OP_UND), /* 0110 0011 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 1011 */ TABDECL(OP_UND), /* 0110 0011 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 1101 */ TABDECL(OP_UND), /* 0110 0011 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0011 1111 */ TABDECL(OP_UND), /* 0110 0100 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND /* 0110 0100 0001 */ TABDECL(OP_UND), /* 0110 0100 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND /* 0110 0100 0011 */ TABDECL(OP_UND), /* 0110 0100 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND /* 0110 0100 0101 */ TABDECL(OP_UND), /* 0110 0100 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND /* 0110 0100 0111 */ TABDECL(OP_UND), /* 0110 0100 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND /* 0110 0100 1001 */ TABDECL(OP_UND), /* 0110 0100 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND /* 0110 0100 1011 */ TABDECL(OP_UND), /* 0110 0100 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND /* 0110 0100 1101 */ TABDECL(OP_UND), /* 0110 0100 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND /* 0110 0100 1111 */ TABDECL(OP_UND), /* 0110 0101 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND /* 0110 0101 0001 */ TABDECL(OP_UND), /* 0110 0101 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND /* 0110 0101 0011 */ TABDECL(OP_UND), /* 0110 0101 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND /* 0110 0101 0101 */ TABDECL(OP_UND), /* 0110 0101 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND /* 0110 0101 0111 */ TABDECL(OP_UND), /* 0110 0101 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND /* 0110 0101 1001 */ TABDECL(OP_UND), /* 0110 0101 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND /* 0110 0101 1011 */ TABDECL(OP_UND), /* 0110 0101 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND /* 0110 0101 1101 */ TABDECL(OP_UND), /* 0110 0101 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND /* 0110 0101 1111 */ TABDECL(OP_UND), /* 0110 0110 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 0001 */ TABDECL(OP_UND), /* 0110 0110 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 0011 */ TABDECL(OP_UND), /* 0110 0110 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 0101 */ TABDECL(OP_UND), /* 0110 0110 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 0111 */ TABDECL(OP_UND), /* 0110 0110 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 1001 */ TABDECL(OP_UND), /* 0110 0110 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 1011 */ TABDECL(OP_UND), /* 0110 0110 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 1101 */ TABDECL(OP_UND), /* 0110 0110 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0110 1111 */ TABDECL(OP_UND), /* 0110 0111 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 0001 */ TABDECL(OP_UND), /* 0110 0111 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 0011 */ TABDECL(OP_UND), /* 0110 0111 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 0101 */ TABDECL(OP_UND), /* 0110 0111 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 0111 */ TABDECL(OP_UND), /* 0110 0111 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 1001 */ TABDECL(OP_UND), /* 0110 0111 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 1011 */ TABDECL(OP_UND), /* 0110 0111 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 1101 */ TABDECL(OP_UND), /* 0110 0111 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 0111 1111 */ TABDECL(OP_UND), /* 0110 1000 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND /* 0110 1000 0001 */ TABDECL(OP_UND), /* 0110 1000 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND /* 0110 1000 0011 */ TABDECL(OP_UND), /* 0110 1000 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND /* 0110 1000 0101 */ TABDECL(OP_UND), /* 0110 1000 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND /* 0110 1000 0111 */ TABDECL(OP_UND), /* 0110 1000 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND /* 0110 1000 1001 */ TABDECL(OP_UND), /* 0110 1000 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND /* 0110 1000 1011 */ TABDECL(OP_UND), /* 0110 1000 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND /* 0110 1000 1101 */ TABDECL(OP_UND), /* 0110 1000 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND /* 0110 1000 1111 */ TABDECL(OP_UND), /* 0110 1001 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1001 0001 */ TABDECL(OP_UND), /* 0110 1001 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND), // OP_LDR_P_LSR_IMM_OFF_POSTIND /* 0110 1001 0011 */ TABDECL(OP_UND), /* 0110 1001 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND), // OP_LDR_P_ASR_IMM_OFF_POSTIND /* 0110 1001 0101 */ TABDECL(OP_UND), /* 0110 1001 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND), // OP_LDR_P_ROR_IMM_OFF_POSTIND /* 0110 1001 0111 */ TABDECL(OP_UND), /* 0110 1001 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1001 1001 */ TABDECL(OP_UND), /* 0110 1001 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND), // OP_LDR_P_LSR_IMM_OFF_POSTIND /* 0110 1001 1011 */ TABDECL(OP_UND), /* 0110 1001 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND), // OP_LDR_P_ASR_IMM_OFF_POSTIND /* 0110 1001 1101 */ TABDECL(OP_UND), /* 0110 1001 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND), // OP_LDR_P_ROR_IMM_OFF_POSTIND /* 0110 1001 1111 */ TABDECL(OP_UND), /* 0110 1010 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 0001 */ TABDECL(OP_UND), /* 0110 1010 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 0011 */ TABDECL(OP_UND), /* 0110 1010 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 0101 */ TABDECL(OP_UND), /* 0110 1010 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 0111 */ TABDECL(OP_UND), /* 0110 1010 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 1001 */ TABDECL(OP_UND), /* 0110 1010 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 1011 */ TABDECL(OP_UND), /* 0110 1010 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 1101 */ TABDECL(OP_UND), /* 0110 1010 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1010 1111 */ TABDECL(OP_UND), /* 0110 1011 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_LSL_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 0001 */ TABDECL(OP_UND), /* 0110 1011 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_LSR_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 0011 */ TABDECL(OP_UND), /* 0110 1011 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_ASR_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 0101 */ TABDECL(OP_UND), /* 0110 1011 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_ROR_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 0111 */ TABDECL(OP_UND), /* 0110 1011 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_LSL_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 1001 */ TABDECL(OP_UND), /* 0110 1011 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_LSR_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 1011 */ TABDECL(OP_UND), /* 0110 1011 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_ASR_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 1101 */ TABDECL(OP_UND), /* 0110 1011 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 to OP_STR_P_ROR_IMM_OFF_POSTIND ; changed to OP_LDR_P_LSL_IMM_OFF_POSTIND in r3510 /* 0110 1011 1111 */ TABDECL(OP_UND), /* 0110 1100 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND /* 0110 1100 0001 */ TABDECL(OP_UND), /* 0110 1100 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND /* 0110 1100 0011 */ TABDECL(OP_UND), /* 0110 1100 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND /* 0110 1100 0101 */ TABDECL(OP_UND), /* 0110 1100 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND /* 0110 1100 0111 */ TABDECL(OP_UND), /* 0110 1100 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND /* 0110 1100 1001 */ TABDECL(OP_UND), /* 0110 1100 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND /* 0110 1100 1011 */ TABDECL(OP_UND), /* 0110 1100 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND /* 0110 1100 1101 */ TABDECL(OP_UND), /* 0110 1100 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND /* 0110 1100 1111 */ TABDECL(OP_UND), /* 0110 1101 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND /* 0110 1101 0001 */ TABDECL(OP_UND), /* 0110 1101 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND /* 0110 1101 0011 */ TABDECL(OP_UND), /* 0110 1101 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND /* 0110 1101 0101 */ TABDECL(OP_UND), /* 0110 1101 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND /* 0110 1101 0111 */ TABDECL(OP_UND), /* 0110 1101 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND /* 0110 1101 1001 */ TABDECL(OP_UND), /* 0110 1101 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND /* 0110 1101 1011 */ TABDECL(OP_UND), /* 0110 1101 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND /* 0110 1101 1101 */ TABDECL(OP_UND), /* 0110 1101 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND /* 0110 1101 1111 */ TABDECL(OP_UND), /* 0110 1110 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 0001 */ TABDECL(OP_UND), /* 0110 1110 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 0011 */ TABDECL(OP_UND), /* 0110 1110 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 0101 */ TABDECL(OP_UND), /* 0110 1110 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 0111 */ TABDECL(OP_UND), /* 0110 1110 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 1001 */ TABDECL(OP_UND), /* 0110 1110 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 1011 */ TABDECL(OP_UND), /* 0110 1110 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 1101 */ TABDECL(OP_UND), /* 0110 1110 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1110 1111 */ TABDECL(OP_UND), /* 0110 1111 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 0001 */ TABDECL(OP_UND), /* 0110 1111 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 0011 */ TABDECL(OP_UND), /* 0110 1111 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 0101 */ TABDECL(OP_UND), /* 0110 1111 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 0111 */ TABDECL(OP_UND), /* 0110 1111 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 1001 */ TABDECL(OP_UND), /* 0110 1111 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 1011 */ TABDECL(OP_UND), /* 0110 1111 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 1101 */ TABDECL(OP_UND), /* 0110 1111 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND //changed from OP_UND in r3504 /* 0110 1111 1111 */ TABDECL(OP_UND), /* 0111 0000 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF), // OP_STR_M_LSL_IMM_OFF /* 0111 0000 0001 */ TABDECL(OP_UND), /* 0111 0000 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF), // OP_STR_M_LSR_IMM_OFF /* 0111 0000 0011 */ TABDECL(OP_UND), /* 0111 0000 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF), // OP_STR_M_ASR_IMM_OFF /* 0111 0000 0101 */ TABDECL(OP_UND), /* 0111 0000 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF), // OP_STR_M_ROR_IMM_OFF /* 0111 0000 0111 */ TABDECL(OP_UND), /* 0111 0000 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF), // OP_STR_M_LSL_IMM_OFF /* 0111 0000 1001 */ TABDECL(OP_UND), /* 0111 0000 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF), // OP_STR_M_LSR_IMM_OFF /* 0111 0000 1011 */ TABDECL(OP_UND), /* 0111 0000 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF), // OP_STR_M_ASR_IMM_OFF /* 0111 0000 1101 */ TABDECL(OP_UND), /* 0111 0000 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF), // OP_STR_M_ROR_IMM_OFF /* 0111 0000 1111 */ TABDECL(OP_UND), /* 0111 0001 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF), // OP_LDR_M_LSL_IMM_OFF /* 0111 0001 0001 */ TABDECL(OP_UND), /* 0111 0001 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF), // OP_LDR_M_LSR_IMM_OFF /* 0111 0001 0011 */ TABDECL(OP_UND), /* 0111 0001 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF), // OP_LDR_M_ASR_IMM_OFF /* 0111 0001 0101 */ TABDECL(OP_UND), /* 0111 0001 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF), // OP_LDR_M_ROR_IMM_OFF /* 0111 0001 0111 */ TABDECL(OP_UND), /* 0111 0001 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF), // OP_LDR_M_LSL_IMM_OFF /* 0111 0001 1001 */ TABDECL(OP_UND), /* 0111 0001 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF), // OP_LDR_M_LSR_IMM_OFF /* 0111 0001 1011 */ TABDECL(OP_UND), /* 0111 0001 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF), // OP_LDR_M_ASR_IMM_OFF /* 0111 0001 1101 */ TABDECL(OP_UND), /* 0111 0001 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF), // OP_LDR_M_ROR_IMM_OFF /* 0111 0001 1111 */ TABDECL(OP_UND), /* 0111 0010 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_PREIND), // OP_STR_M_LSL_IMM_OFF_PREIND /* 0111 0010 0001 */ TABDECL(OP_UND), /* 0111 0010 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_PREIND), // OP_STR_M_LSR_IMM_OFF_PREIND /* 0111 0010 0011 */ TABDECL(OP_UND), /* 0111 0010 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_PREIND), // OP_STR_M_ASR_IMM_OFF_PREIND /* 0111 0010 0101 */ TABDECL(OP_UND), /* 0111 0010 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_PREIND), // OP_STR_M_ROR_IMM_OFF_PREIND /* 0111 0010 0111 */ TABDECL(OP_UND), /* 0111 0010 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_PREIND), // OP_STR_M_LSL_IMM_OFF_PREIND /* 0111 0010 1001 */ TABDECL(OP_UND), /* 0111 0010 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_PREIND), // OP_STR_M_LSR_IMM_OFF_PREIND /* 0111 0010 1011 */ TABDECL(OP_UND), /* 0111 0010 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_PREIND), // OP_STR_M_ASR_IMM_OFF_PREIND /* 0111 0010 1101 */ TABDECL(OP_UND), /* 0111 0010 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_PREIND), // OP_STR_M_ROR_IMM_OFF_PREIND /* 0111 0010 1111 */ TABDECL(OP_UND), /* 0111 0011 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_PREIND), // OP_LDR_M_LSL_IMM_OFF_PREIND /* 0111 0011 0001 */ TABDECL(OP_UND), /* 0111 0011 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_PREIND), // OP_LDR_M_LSR_IMM_OFF_PREIND /* 0111 0011 0011 */ TABDECL(OP_UND), /* 0111 0011 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_PREIND), // OP_LDR_M_ASR_IMM_OFF_PREIND /* 0111 0011 0101 */ TABDECL(OP_UND), /* 0111 0011 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_PREIND), // OP_LDR_M_ROR_IMM_OFF_PREIND /* 0111 0011 0111 */ TABDECL(OP_UND), /* 0111 0011 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_PREIND), // OP_LDR_M_LSL_IMM_OFF_PREIND /* 0111 0011 1001 */ TABDECL(OP_UND), /* 0111 0011 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_PREIND), // OP_LDR_M_LSR_IMM_OFF_PREIND /* 0111 0011 1011 */ TABDECL(OP_UND), /* 0111 0011 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_PREIND), // OP_LDR_M_ASR_IMM_OFF_PREIND /* 0111 0011 1101 */ TABDECL(OP_UND), /* 0111 0011 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_PREIND), // OP_LDR_M_ROR_IMM_OFF_PREIND /* 0111 0011 1111 */ TABDECL(OP_UND), /* 0111 0100 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF), // OP_STRB_M_LSL_IMM_OFF /* 0111 0100 0001 */ TABDECL(OP_UND), /* 0111 0100 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF), // OP_STRB_M_LSR_IMM_OFF /* 0111 0100 0011 */ TABDECL(OP_UND), /* 0111 0100 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF), // OP_STRB_M_ASR_IMM_OFF /* 0111 0100 0101 */ TABDECL(OP_UND), /* 0111 0100 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF), // OP_STRB_M_ROR_IMM_OFF /* 0111 0100 0111 */ TABDECL(OP_UND), /* 0111 0100 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF), // OP_STRB_M_LSL_IMM_OFF /* 0111 0100 1001 */ TABDECL(OP_UND), /* 0111 0100 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF), // OP_STRB_M_LSR_IMM_OFF /* 0111 0100 1011 */ TABDECL(OP_UND), /* 0111 0100 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF), // OP_STRB_M_ASR_IMM_OFF /* 0111 0100 1101 */ TABDECL(OP_UND), /* 0111 0100 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF), // OP_STRB_M_ROR_IMM_OFF /* 0111 0100 1111 */ TABDECL(OP_UND), /* 0111 0101 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF), // OP_LDRB_M_LSL_IMM_OFF /* 0111 0101 0001 */ TABDECL(OP_UND), /* 0111 0101 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF), // OP_LDRB_M_LSR_IMM_OFF /* 0111 0101 0011 */ TABDECL(OP_UND), /* 0111 0101 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF), // OP_LDRB_M_ASR_IMM_OFF /* 0111 0101 0101 */ TABDECL(OP_UND), /* 0111 0101 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF), // OP_LDRB_M_ROR_IMM_OFF /* 0111 0101 0111 */ TABDECL(OP_UND), /* 0111 0101 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF), // OP_LDRB_M_LSL_IMM_OFF /* 0111 0101 1001 */ TABDECL(OP_UND), /* 0111 0101 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF), // OP_LDRB_M_LSR_IMM_OFF /* 0111 0101 1011 */ TABDECL(OP_UND), /* 0111 0101 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF), // OP_LDRB_M_ASR_IMM_OFF /* 0111 0101 1101 */ TABDECL(OP_UND), /* 0111 0101 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF), // OP_LDRB_M_ROR_IMM_OFF /* 0111 0101 1111 */ TABDECL(OP_UND), /* 0111 0110 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_PREIND), // OP_STRB_M_LSL_IMM_OFF_PREIND /* 0111 0110 0001 */ TABDECL(OP_UND), /* 0111 0110 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_PREIND), // OP_STRB_M_LSR_IMM_OFF_PREIND /* 0111 0110 0011 */ TABDECL(OP_UND), /* 0111 0110 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_PREIND), // OP_STRB_M_ASR_IMM_OFF_PREIND /* 0111 0110 0101 */ TABDECL(OP_UND), /* 0111 0110 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_PREIND), // OP_STRB_M_ROR_IMM_OFF_PREIND /* 0111 0110 0111 */ TABDECL(OP_UND), /* 0111 0110 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_PREIND), // OP_STRB_M_LSL_IMM_OFF_PREIND /* 0111 0110 1001 */ TABDECL(OP_UND), /* 0111 0110 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_PREIND), // OP_STRB_M_LSR_IMM_OFF_PREIND /* 0111 0110 1011 */ TABDECL(OP_UND), /* 0111 0110 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_PREIND), // OP_STRB_M_ASR_IMM_OFF_PREIND /* 0111 0110 1101 */ TABDECL(OP_UND), /* 0111 0110 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_PREIND), // OP_STRB_M_ROR_IMM_OFF_PREIND /* 0111 0110 1111 */ TABDECL(OP_UND), /* 0111 0111 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_PREIND), // OP_LDRB_M_LSL_IMM_OFF_PREIND /* 0111 0111 0001 */ TABDECL(OP_UND), /* 0111 0111 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_PREIND), // OP_LDRB_M_LSR_IMM_OFF_PREIND /* 0111 0111 0011 */ TABDECL(OP_UND), /* 0111 0111 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_PREIND), // OP_LDRB_M_ASR_IMM_OFF_PREIND /* 0111 0111 0101 */ TABDECL(OP_UND), /* 0111 0111 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_PREIND), // OP_LDRB_M_ROR_IMM_OFF_PREIND /* 0111 0111 0111 */ TABDECL(OP_UND), /* 0111 0111 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_PREIND), // OP_LDRB_M_LSL_IMM_OFF_PREIND /* 0111 0111 1001 */ TABDECL(OP_UND), /* 0111 0111 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_PREIND), // OP_LDRB_M_LSR_IMM_OFF_PREIND /* 0111 0111 1011 */ TABDECL(OP_UND), /* 0111 0111 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_PREIND), // OP_LDRB_M_ASR_IMM_OFF_PREIND /* 0111 0111 1101 */ TABDECL(OP_UND), /* 0111 0111 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_PREIND), // OP_LDRB_M_ROR_IMM_OFF_PREIND /* 0111 0111 1111 */ TABDECL(OP_UND), /* 0111 1000 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF), // OP_STR_P_LSL_IMM_OFF /* 0111 1000 0001 */ TABDECL(OP_UND), /* 0111 1000 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF), // OP_STR_P_LSR_IMM_OFF /* 0111 1000 0011 */ TABDECL(OP_UND), /* 0111 1000 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF), // OP_STR_P_ASR_IMM_OFF /* 0111 1000 0101 */ TABDECL(OP_UND), /* 0111 1000 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF), // OP_STR_P_ROR_IMM_OFF /* 0111 1000 0111 */ TABDECL(OP_UND), /* 0111 1000 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF), // OP_STR_P_LSL_IMM_OFF /* 0111 1000 1001 */ TABDECL(OP_UND), /* 0111 1000 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF), // OP_STR_P_LSR_IMM_OFF /* 0111 1000 1011 */ TABDECL(OP_UND), /* 0111 1000 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF), // OP_STR_P_ASR_IMM_OFF /* 0111 1000 1101 */ TABDECL(OP_UND), /* 0111 1000 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF), // OP_STR_P_ROR_IMM_OFF /* 0111 1000 1111 */ TABDECL(OP_UND), /* 0111 1001 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF), // OP_LDR_P_LSL_IMM_OFF /* 0111 1001 0001 */ TABDECL(OP_UND), /* 0111 1001 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF), // OP_LDR_P_LSR_IMM_OFF /* 0111 1001 0011 */ TABDECL(OP_UND), /* 0111 1001 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF), // OP_LDR_P_ASR_IMM_OFF /* 0111 1001 0101 */ TABDECL(OP_UND), /* 0111 1001 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF), // OP_LDR_P_ROR_IMM_OFF /* 0111 1001 0111 */ TABDECL(OP_UND), /* 0111 1001 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF), // OP_LDR_P_LSL_IMM_OFF /* 0111 1001 1001 */ TABDECL(OP_UND), /* 0111 1001 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF), // OP_LDR_P_LSR_IMM_OFF /* 0111 1001 1011 */ TABDECL(OP_UND), /* 0111 1001 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF), // OP_LDR_P_ASR_IMM_OFF /* 0111 1001 1101 */ TABDECL(OP_UND), /* 0111 1001 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF), // OP_LDR_P_ROR_IMM_OFF /* 0111 1001 1111 */ TABDECL(OP_UND), /* 0111 1010 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_PREIND), // OP_STR_P_LSL_IMM_OFF_PREIND /* 0111 1010 0001 */ TABDECL(OP_UND), /* 0111 1010 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_PREIND), // OP_STR_P_LSR_IMM_OFF_PREIND /* 0111 1010 0011 */ TABDECL(OP_UND), /* 0111 1010 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_PREIND), // OP_STR_P_ASR_IMM_OFF_PREIND /* 0111 1010 0101 */ TABDECL(OP_UND), /* 0111 1010 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_PREIND), // OP_STR_P_ROR_IMM_OFF_PREIND /* 0111 1010 0111 */ TABDECL(OP_UND), /* 0111 1010 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_PREIND), // OP_STR_P_LSL_IMM_OFF_PREIND /* 0111 1010 1001 */ TABDECL(OP_UND), /* 0111 1010 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_PREIND), // OP_STR_P_LSR_IMM_OFF_PREIND /* 0111 1010 1011 */ TABDECL(OP_UND), /* 0111 1010 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_PREIND), // OP_STR_P_ASR_IMM_OFF_PREIND /* 0111 1010 1101 */ TABDECL(OP_UND), /* 0111 1010 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_PREIND), // OP_STR_P_ROR_IMM_OFF_PREIND /* 0111 1010 1111 */ TABDECL(OP_UND), /* 0111 1011 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_PREIND), // OP_LDR_P_LSL_IMM_OFF_PREIND /* 0111 1011 0001 */ TABDECL(OP_UND), /* 0111 1011 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_PREIND), // OP_LDR_P_LSR_IMM_OFF_PREIND /* 0111 1011 0011 */ TABDECL(OP_UND), /* 0111 1011 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_PREIND), // OP_LDR_P_ASR_IMM_OFF_PREIND /* 0111 1011 0101 */ TABDECL(OP_UND), /* 0111 1011 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_PREIND), // OP_LDR_P_ROR_IMM_OFF_PREIND /* 0111 1011 0111 */ TABDECL(OP_UND), /* 0111 1011 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_PREIND), // OP_LDR_P_LSL_IMM_OFF_PREIND /* 0111 1011 1001 */ TABDECL(OP_UND), /* 0111 1011 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_PREIND), // OP_LDR_P_LSR_IMM_OFF_PREIND /* 0111 1011 1011 */ TABDECL(OP_UND), /* 0111 1011 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_PREIND), // OP_LDR_P_ASR_IMM_OFF_PREIND /* 0111 1011 1101 */ TABDECL(OP_UND), /* 0111 1011 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_PREIND), // OP_LDR_P_ROR_IMM_OFF_PREIND /* 0111 1011 1111 */ TABDECL(OP_UND), /* 0111 1100 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF), // OP_STRB_P_LSL_IMM_OFF /* 0111 1100 0001 */ TABDECL(OP_UND), /* 0111 1100 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF), // OP_STRB_P_LSR_IMM_OFF /* 0111 1100 0011 */ TABDECL(OP_UND), /* 0111 1100 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF), // OP_STRB_P_ASR_IMM_OFF /* 0111 1100 0101 */ TABDECL(OP_UND), /* 0111 1100 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF), // OP_STRB_P_ROR_IMM_OFF /* 0111 1100 0111 */ TABDECL(OP_UND), /* 0111 1100 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF), // OP_STRB_P_LSL_IMM_OFF /* 0111 1100 1001 */ TABDECL(OP_UND), /* 0111 1100 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF), // OP_STRB_P_LSR_IMM_OFF /* 0111 1100 1011 */ TABDECL(OP_UND), /* 0111 1100 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF), // OP_STRB_P_ASR_IMM_OFF /* 0111 1100 1101 */ TABDECL(OP_UND), /* 0111 1100 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF), // OP_STRB_P_ROR_IMM_OFF /* 0111 1100 1111 */ TABDECL(OP_UND), /* 0111 1101 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF), // OP_LDRB_P_LSL_IMM_OFF /* 0111 1101 0001 */ TABDECL(OP_UND), /* 0111 1101 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF), // OP_LDRB_P_LSR_IMM_OFF /* 0111 1101 0011 */ TABDECL(OP_UND), /* 0111 1101 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF), // OP_LDRB_P_ASR_IMM_OFF /* 0111 1101 0101 */ TABDECL(OP_UND), /* 0111 1101 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF), // OP_LDRB_P_ROR_IMM_OFF /* 0111 1101 0111 */ TABDECL(OP_UND), /* 0111 1101 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF), // OP_LDRB_P_LSL_IMM_OFF /* 0111 1101 1001 */ TABDECL(OP_UND), /* 0111 1101 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF), // OP_LDRB_P_LSR_IMM_OFF /* 0111 1101 1011 */ TABDECL(OP_UND), /* 0111 1101 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF), // OP_LDRB_P_ASR_IMM_OFF /* 0111 1101 1101 */ TABDECL(OP_UND), /* 0111 1101 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF), // OP_LDRB_P_ROR_IMM_OFF /* 0111 1101 1111 */ TABDECL(OP_UND), /* 0111 1110 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_PREIND), // OP_STRB_P_LSL_IMM_OFF_PREIND /* 0111 1110 0001 */ TABDECL(OP_UND), /* 0111 1110 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_PREIND), // OP_STRB_P_LSR_IMM_OFF_PREIND /* 0111 1110 0011 */ TABDECL(OP_UND), /* 0111 1110 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_PREIND), // OP_STRB_P_ASR_IMM_OFF_PREIND /* 0111 1110 0101 */ TABDECL(OP_UND), /* 0111 1110 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_PREIND), // OP_STRB_P_ROR_IMM_OFF_PREIND /* 0111 1110 0111 */ TABDECL(OP_UND), /* 0111 1110 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_PREIND), // OP_STRB_P_LSL_IMM_OFF_PREIND /* 0111 1110 1001 */ TABDECL(OP_UND), /* 0111 1110 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_PREIND), // OP_STRB_P_LSR_IMM_OFF_PREIND /* 0111 1110 1011 */ TABDECL(OP_UND), /* 0111 1110 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_PREIND), // OP_STRB_P_ASR_IMM_OFF_PREIND /* 0111 1110 1101 */ TABDECL(OP_UND), /* 0111 1110 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_PREIND), // OP_STRB_P_ROR_IMM_OFF_PREIND /* 0111 1110 1111 */ TABDECL(OP_UND), /* 0111 1111 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_PREIND), // OP_LDRB_P_LSL_IMM_OFF_PREIND /* 0111 1111 0001 */ TABDECL(OP_UND), /* 0111 1111 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_PREIND), // OP_LDRB_P_LSR_IMM_OFF_PREIND /* 0111 1111 0011 */ TABDECL(OP_UND), /* 0111 1111 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_PREIND), // OP_LDRB_P_ASR_IMM_OFF_PREIND /* 0111 1111 0101 */ TABDECL(OP_UND), /* 0111 1111 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_PREIND), // OP_LDRB_P_ROR_IMM_OFF_PREIND /* 0111 1111 0111 */ TABDECL(OP_UND), /* 0111 1111 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_PREIND), // OP_LDRB_P_LSL_IMM_OFF_PREIND /* 0111 1111 1001 */ TABDECL(OP_UND), /* 0111 1111 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_PREIND), // OP_LDRB_P_LSR_IMM_OFF_PREIND /* 0111 1111 1011 */ TABDECL(OP_UND), /* 0111 1111 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_PREIND), // OP_LDRB_P_ASR_IMM_OFF_PREIND /* 0111 1111 1101 */ TABDECL(OP_UND), /* 0111 1111 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_PREIND), // OP_LDRB_P_ROR_IMM_OFF_PREIND /* 0111 1111 1111 */ TABDECL(OP_UND), /* 1000 0000 0000 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0001 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0010 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0011 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0100 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0101 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0110 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0111 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1000 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1001 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1010 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1011 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1100 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1101 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1110 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1111 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0001 0000 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0001 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0010 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0011 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0100 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0101 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0110 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0111 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1000 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1001 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1010 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1011 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1100 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1101 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1110 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1111 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0010 0000 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0001 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0010 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0011 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0100 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0101 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0110 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0111 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1000 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1001 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1010 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1011 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1100 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1101 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1110 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1111 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0011 0000 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0001 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0010 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0011 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0100 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0101 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0110 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0111 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1000 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1001 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1010 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1011 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1100 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1101 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1110 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1111 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0100 0000 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0001 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0010 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0011 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0100 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0101 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0110 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0111 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1000 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1001 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1010 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1011 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1100 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1101 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1110 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1111 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0101 0000 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0001 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0010 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0011 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0100 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0101 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0110 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0111 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1000 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1001 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1010 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1011 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1100 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1101 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1110 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1111 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0110 0000 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0001 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0010 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0011 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0100 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0101 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0110 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0111 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1000 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1001 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1010 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1011 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1100 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1101 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1110 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1111 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0111 0000 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0001 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0010 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0011 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0100 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0101 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0110 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0111 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1000 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1001 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1010 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1011 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1100 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1101 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1110 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1111 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 1000 0000 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0001 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0010 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0011 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0100 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0101 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0110 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0111 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1000 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1001 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1010 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1011 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1100 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1101 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1110 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1111 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1001 0000 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0001 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0010 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0011 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0100 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0101 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0110 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0111 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1000 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1001 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1010 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1011 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1100 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1101 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1110 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1111 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1010 0000 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0001 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0010 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0011 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0100 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0101 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0110 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0111 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1000 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1001 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1010 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1011 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1100 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1101 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1110 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1111 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1011 0000 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0001 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0010 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0011 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0100 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0101 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0110 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0111 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1000 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1001 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1010 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1011 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1100 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1101 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1110 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1111 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1100 0000 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0001 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0010 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0011 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0100 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0101 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0110 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0111 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1000 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1001 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1010 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1011 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1100 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1101 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1110 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1111 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1101 0000 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0001 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0010 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0011 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0100 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0101 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0110 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0111 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1000 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1001 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1010 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1011 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1100 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1101 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1110 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1111 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1110 0000 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0001 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0010 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0011 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0100 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0101 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0110 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0111 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1000 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1001 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1010 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1011 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1100 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1101 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1110 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1111 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1111 0000 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0001 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0010 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0011 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0100 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0101 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0110 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0111 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1000 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1001 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1010 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1011 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1100 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1101 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1110 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1111 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1001 0000 0000 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0001 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0010 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0011 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0100 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0101 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0110 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0111 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1000 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1001 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1010 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1011 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1100 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1101 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1110 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1111 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0001 0000 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0001 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0010 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0011 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0100 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0101 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0110 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0111 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1000 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1001 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1010 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1011 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1100 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1101 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1110 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1111 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0010 0000 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0001 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0010 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0011 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0100 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0101 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0110 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0111 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1000 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1001 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1010 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1011 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1100 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1101 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1110 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1111 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0011 0000 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0001 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0010 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0011 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0100 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0101 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0110 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0111 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1000 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1001 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1010 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1011 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1100 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1101 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1110 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1111 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0100 0000 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0001 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0010 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0011 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0100 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0101 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0110 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0111 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1000 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1001 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1010 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1011 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1100 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1101 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1110 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1111 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0101 0000 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0001 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0010 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0011 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0100 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0101 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0110 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0111 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1000 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1001 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1010 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1011 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1100 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1101 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1110 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1111 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0110 0000 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0001 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0010 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0011 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0100 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0101 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0110 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0111 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1000 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1001 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1010 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1011 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1100 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1101 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1110 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1111 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0111 0000 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0001 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0010 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0011 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0100 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0101 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0110 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0111 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1000 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1001 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1010 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1011 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1100 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1101 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1110 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1111 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 1000 0000 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0001 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0010 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0011 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0100 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0101 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0110 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0111 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1000 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1001 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1010 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1011 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1100 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1101 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1110 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1111 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1001 0000 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0001 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0010 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0011 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0100 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0101 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0110 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0111 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1000 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1001 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1010 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1011 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1100 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1101 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1110 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1111 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1010 0000 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0001 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0010 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0011 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0100 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0101 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0110 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0111 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1000 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1001 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1010 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1011 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1100 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1101 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1110 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1111 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1011 0000 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0001 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0010 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0011 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0100 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0101 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0110 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0111 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1000 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1001 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1010 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1011 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1100 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1101 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1110 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1111 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1100 0000 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0001 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0010 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0011 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0100 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0101 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0110 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0111 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1000 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1001 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1010 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1011 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1100 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1101 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1110 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1111 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1101 0000 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0001 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0010 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0011 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0100 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0101 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0110 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0111 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1000 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1001 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1010 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1011 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1100 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1101 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1110 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1111 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1110 0000 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0001 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0010 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0011 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0100 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0101 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0110 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0111 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1000 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1001 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1010 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1011 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1100 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1101 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1110 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1111 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1111 0000 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0001 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0010 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0011 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0100 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0101 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0110 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0111 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1000 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1001 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1010 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1011 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1100 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1101 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1110 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1111 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1010 0000 0000 */ TABDECL(OP_B), // OP_B /* 1010 0000 0001 */ TABDECL(OP_B), // OP_B /* 1010 0000 0010 */ TABDECL(OP_B), // OP_B /* 1010 0000 0011 */ TABDECL(OP_B), // OP_B /* 1010 0000 0100 */ TABDECL(OP_B), // OP_B /* 1010 0000 0101 */ TABDECL(OP_B), // OP_B /* 1010 0000 0110 */ TABDECL(OP_B), // OP_B /* 1010 0000 0111 */ TABDECL(OP_B), // OP_B /* 1010 0000 1000 */ TABDECL(OP_B), // OP_B /* 1010 0000 1001 */ TABDECL(OP_B), // OP_B /* 1010 0000 1010 */ TABDECL(OP_B), // OP_B /* 1010 0000 1011 */ TABDECL(OP_B), // OP_B /* 1010 0000 1100 */ TABDECL(OP_B), // OP_B /* 1010 0000 1101 */ TABDECL(OP_B), // OP_B /* 1010 0000 1110 */ TABDECL(OP_B), // OP_B /* 1010 0000 1111 */ TABDECL(OP_B), // OP_B /* 1010 0001 0000 */ TABDECL(OP_B), // OP_B /* 1010 0001 0001 */ TABDECL(OP_B), // OP_B /* 1010 0001 0010 */ TABDECL(OP_B), // OP_B /* 1010 0001 0011 */ TABDECL(OP_B), // OP_B /* 1010 0001 0100 */ TABDECL(OP_B), // OP_B /* 1010 0001 0101 */ TABDECL(OP_B), // OP_B /* 1010 0001 0110 */ TABDECL(OP_B), // OP_B /* 1010 0001 0111 */ TABDECL(OP_B), // OP_B /* 1010 0001 1000 */ TABDECL(OP_B), // OP_B /* 1010 0001 1001 */ TABDECL(OP_B), // OP_B /* 1010 0001 1010 */ TABDECL(OP_B), // OP_B /* 1010 0001 1011 */ TABDECL(OP_B), // OP_B /* 1010 0001 1100 */ TABDECL(OP_B), // OP_B /* 1010 0001 1101 */ TABDECL(OP_B), // OP_B /* 1010 0001 1110 */ TABDECL(OP_B), // OP_B /* 1010 0001 1111 */ TABDECL(OP_B), // OP_B /* 1010 0010 0000 */ TABDECL(OP_B), // OP_B /* 1010 0010 0001 */ TABDECL(OP_B), // OP_B /* 1010 0010 0010 */ TABDECL(OP_B), // OP_B /* 1010 0010 0011 */ TABDECL(OP_B), // OP_B /* 1010 0010 0100 */ TABDECL(OP_B), // OP_B /* 1010 0010 0101 */ TABDECL(OP_B), // OP_B /* 1010 0010 0110 */ TABDECL(OP_B), // OP_B /* 1010 0010 0111 */ TABDECL(OP_B), // OP_B /* 1010 0010 1000 */ TABDECL(OP_B), // OP_B /* 1010 0010 1001 */ TABDECL(OP_B), // OP_B /* 1010 0010 1010 */ TABDECL(OP_B), // OP_B /* 1010 0010 1011 */ TABDECL(OP_B), // OP_B /* 1010 0010 1100 */ TABDECL(OP_B), // OP_B /* 1010 0010 1101 */ TABDECL(OP_B), // OP_B /* 1010 0010 1110 */ TABDECL(OP_B), // OP_B /* 1010 0010 1111 */ TABDECL(OP_B), // OP_B /* 1010 0011 0000 */ TABDECL(OP_B), // OP_B /* 1010 0011 0001 */ TABDECL(OP_B), // OP_B /* 1010 0011 0010 */ TABDECL(OP_B), // OP_B /* 1010 0011 0011 */ TABDECL(OP_B), // OP_B /* 1010 0011 0100 */ TABDECL(OP_B), // OP_B /* 1010 0011 0101 */ TABDECL(OP_B), // OP_B /* 1010 0011 0110 */ TABDECL(OP_B), // OP_B /* 1010 0011 0111 */ TABDECL(OP_B), // OP_B /* 1010 0011 1000 */ TABDECL(OP_B), // OP_B /* 1010 0011 1001 */ TABDECL(OP_B), // OP_B /* 1010 0011 1010 */ TABDECL(OP_B), // OP_B /* 1010 0011 1011 */ TABDECL(OP_B), // OP_B /* 1010 0011 1100 */ TABDECL(OP_B), // OP_B /* 1010 0011 1101 */ TABDECL(OP_B), // OP_B /* 1010 0011 1110 */ TABDECL(OP_B), // OP_B /* 1010 0011 1111 */ TABDECL(OP_B), // OP_B /* 1010 0100 0000 */ TABDECL(OP_B), // OP_B /* 1010 0100 0001 */ TABDECL(OP_B), // OP_B /* 1010 0100 0010 */ TABDECL(OP_B), // OP_B /* 1010 0100 0011 */ TABDECL(OP_B), // OP_B /* 1010 0100 0100 */ TABDECL(OP_B), // OP_B /* 1010 0100 0101 */ TABDECL(OP_B), // OP_B /* 1010 0100 0110 */ TABDECL(OP_B), // OP_B /* 1010 0100 0111 */ TABDECL(OP_B), // OP_B /* 1010 0100 1000 */ TABDECL(OP_B), // OP_B /* 1010 0100 1001 */ TABDECL(OP_B), // OP_B /* 1010 0100 1010 */ TABDECL(OP_B), // OP_B /* 1010 0100 1011 */ TABDECL(OP_B), // OP_B /* 1010 0100 1100 */ TABDECL(OP_B), // OP_B /* 1010 0100 1101 */ TABDECL(OP_B), // OP_B /* 1010 0100 1110 */ TABDECL(OP_B), // OP_B /* 1010 0100 1111 */ TABDECL(OP_B), // OP_B /* 1010 0101 0000 */ TABDECL(OP_B), // OP_B /* 1010 0101 0001 */ TABDECL(OP_B), // OP_B /* 1010 0101 0010 */ TABDECL(OP_B), // OP_B /* 1010 0101 0011 */ TABDECL(OP_B), // OP_B /* 1010 0101 0100 */ TABDECL(OP_B), // OP_B /* 1010 0101 0101 */ TABDECL(OP_B), // OP_B /* 1010 0101 0110 */ TABDECL(OP_B), // OP_B /* 1010 0101 0111 */ TABDECL(OP_B), // OP_B /* 1010 0101 1000 */ TABDECL(OP_B), // OP_B /* 1010 0101 1001 */ TABDECL(OP_B), // OP_B /* 1010 0101 1010 */ TABDECL(OP_B), // OP_B /* 1010 0101 1011 */ TABDECL(OP_B), // OP_B /* 1010 0101 1100 */ TABDECL(OP_B), // OP_B /* 1010 0101 1101 */ TABDECL(OP_B), // OP_B /* 1010 0101 1110 */ TABDECL(OP_B), // OP_B /* 1010 0101 1111 */ TABDECL(OP_B), // OP_B /* 1010 0110 0000 */ TABDECL(OP_B), // OP_B /* 1010 0110 0001 */ TABDECL(OP_B), // OP_B /* 1010 0110 0010 */ TABDECL(OP_B), // OP_B /* 1010 0110 0011 */ TABDECL(OP_B), // OP_B /* 1010 0110 0100 */ TABDECL(OP_B), // OP_B /* 1010 0110 0101 */ TABDECL(OP_B), // OP_B /* 1010 0110 0110 */ TABDECL(OP_B), // OP_B /* 1010 0110 0111 */ TABDECL(OP_B), // OP_B /* 1010 0110 1000 */ TABDECL(OP_B), // OP_B /* 1010 0110 1001 */ TABDECL(OP_B), // OP_B /* 1010 0110 1010 */ TABDECL(OP_B), // OP_B /* 1010 0110 1011 */ TABDECL(OP_B), // OP_B /* 1010 0110 1100 */ TABDECL(OP_B), // OP_B /* 1010 0110 1101 */ TABDECL(OP_B), // OP_B /* 1010 0110 1110 */ TABDECL(OP_B), // OP_B /* 1010 0110 1111 */ TABDECL(OP_B), // OP_B /* 1010 0111 0000 */ TABDECL(OP_B), // OP_B /* 1010 0111 0001 */ TABDECL(OP_B), // OP_B /* 1010 0111 0010 */ TABDECL(OP_B), // OP_B /* 1010 0111 0011 */ TABDECL(OP_B), // OP_B /* 1010 0111 0100 */ TABDECL(OP_B), // OP_B /* 1010 0111 0101 */ TABDECL(OP_B), // OP_B /* 1010 0111 0110 */ TABDECL(OP_B), // OP_B /* 1010 0111 0111 */ TABDECL(OP_B), // OP_B /* 1010 0111 1000 */ TABDECL(OP_B), // OP_B /* 1010 0111 1001 */ TABDECL(OP_B), // OP_B /* 1010 0111 1010 */ TABDECL(OP_B), // OP_B /* 1010 0111 1011 */ TABDECL(OP_B), // OP_B /* 1010 0111 1100 */ TABDECL(OP_B), // OP_B /* 1010 0111 1101 */ TABDECL(OP_B), // OP_B /* 1010 0111 1110 */ TABDECL(OP_B), // OP_B /* 1010 0111 1111 */ TABDECL(OP_B), // OP_B /* 1010 1000 0000 */ TABDECL(OP_B), // OP_B /* 1010 1000 0001 */ TABDECL(OP_B), // OP_B /* 1010 1000 0010 */ TABDECL(OP_B), // OP_B /* 1010 1000 0011 */ TABDECL(OP_B), // OP_B /* 1010 1000 0100 */ TABDECL(OP_B), // OP_B /* 1010 1000 0101 */ TABDECL(OP_B), // OP_B /* 1010 1000 0110 */ TABDECL(OP_B), // OP_B /* 1010 1000 0111 */ TABDECL(OP_B), // OP_B /* 1010 1000 1000 */ TABDECL(OP_B), // OP_B /* 1010 1000 1001 */ TABDECL(OP_B), // OP_B /* 1010 1000 1010 */ TABDECL(OP_B), // OP_B /* 1010 1000 1011 */ TABDECL(OP_B), // OP_B /* 1010 1000 1100 */ TABDECL(OP_B), // OP_B /* 1010 1000 1101 */ TABDECL(OP_B), // OP_B /* 1010 1000 1110 */ TABDECL(OP_B), // OP_B /* 1010 1000 1111 */ TABDECL(OP_B), // OP_B /* 1010 1001 0000 */ TABDECL(OP_B), // OP_B /* 1010 1001 0001 */ TABDECL(OP_B), // OP_B /* 1010 1001 0010 */ TABDECL(OP_B), // OP_B /* 1010 1001 0011 */ TABDECL(OP_B), // OP_B /* 1010 1001 0100 */ TABDECL(OP_B), // OP_B /* 1010 1001 0101 */ TABDECL(OP_B), // OP_B /* 1010 1001 0110 */ TABDECL(OP_B), // OP_B /* 1010 1001 0111 */ TABDECL(OP_B), // OP_B /* 1010 1001 1000 */ TABDECL(OP_B), // OP_B /* 1010 1001 1001 */ TABDECL(OP_B), // OP_B /* 1010 1001 1010 */ TABDECL(OP_B), // OP_B /* 1010 1001 1011 */ TABDECL(OP_B), // OP_B /* 1010 1001 1100 */ TABDECL(OP_B), // OP_B /* 1010 1001 1101 */ TABDECL(OP_B), // OP_B /* 1010 1001 1110 */ TABDECL(OP_B), // OP_B /* 1010 1001 1111 */ TABDECL(OP_B), // OP_B /* 1010 1010 0000 */ TABDECL(OP_B), // OP_B /* 1010 1010 0001 */ TABDECL(OP_B), // OP_B /* 1010 1010 0010 */ TABDECL(OP_B), // OP_B /* 1010 1010 0011 */ TABDECL(OP_B), // OP_B /* 1010 1010 0100 */ TABDECL(OP_B), // OP_B /* 1010 1010 0101 */ TABDECL(OP_B), // OP_B /* 1010 1010 0110 */ TABDECL(OP_B), // OP_B /* 1010 1010 0111 */ TABDECL(OP_B), // OP_B /* 1010 1010 1000 */ TABDECL(OP_B), // OP_B /* 1010 1010 1001 */ TABDECL(OP_B), // OP_B /* 1010 1010 1010 */ TABDECL(OP_B), // OP_B /* 1010 1010 1011 */ TABDECL(OP_B), // OP_B /* 1010 1010 1100 */ TABDECL(OP_B), // OP_B /* 1010 1010 1101 */ TABDECL(OP_B), // OP_B /* 1010 1010 1110 */ TABDECL(OP_B), // OP_B /* 1010 1010 1111 */ TABDECL(OP_B), // OP_B /* 1010 1011 0000 */ TABDECL(OP_B), // OP_B /* 1010 1011 0001 */ TABDECL(OP_B), // OP_B /* 1010 1011 0010 */ TABDECL(OP_B), // OP_B /* 1010 1011 0011 */ TABDECL(OP_B), // OP_B /* 1010 1011 0100 */ TABDECL(OP_B), // OP_B /* 1010 1011 0101 */ TABDECL(OP_B), // OP_B /* 1010 1011 0110 */ TABDECL(OP_B), // OP_B /* 1010 1011 0111 */ TABDECL(OP_B), // OP_B /* 1010 1011 1000 */ TABDECL(OP_B), // OP_B /* 1010 1011 1001 */ TABDECL(OP_B), // OP_B /* 1010 1011 1010 */ TABDECL(OP_B), // OP_B /* 1010 1011 1011 */ TABDECL(OP_B), // OP_B /* 1010 1011 1100 */ TABDECL(OP_B), // OP_B /* 1010 1011 1101 */ TABDECL(OP_B), // OP_B /* 1010 1011 1110 */ TABDECL(OP_B), // OP_B /* 1010 1011 1111 */ TABDECL(OP_B), // OP_B /* 1010 1100 0000 */ TABDECL(OP_B), // OP_B /* 1010 1100 0001 */ TABDECL(OP_B), // OP_B /* 1010 1100 0010 */ TABDECL(OP_B), // OP_B /* 1010 1100 0011 */ TABDECL(OP_B), // OP_B /* 1010 1100 0100 */ TABDECL(OP_B), // OP_B /* 1010 1100 0101 */ TABDECL(OP_B), // OP_B /* 1010 1100 0110 */ TABDECL(OP_B), // OP_B /* 1010 1100 0111 */ TABDECL(OP_B), // OP_B /* 1010 1100 1000 */ TABDECL(OP_B), // OP_B /* 1010 1100 1001 */ TABDECL(OP_B), // OP_B /* 1010 1100 1010 */ TABDECL(OP_B), // OP_B /* 1010 1100 1011 */ TABDECL(OP_B), // OP_B /* 1010 1100 1100 */ TABDECL(OP_B), // OP_B /* 1010 1100 1101 */ TABDECL(OP_B), // OP_B /* 1010 1100 1110 */ TABDECL(OP_B), // OP_B /* 1010 1100 1111 */ TABDECL(OP_B), // OP_B /* 1010 1101 0000 */ TABDECL(OP_B), // OP_B /* 1010 1101 0001 */ TABDECL(OP_B), // OP_B /* 1010 1101 0010 */ TABDECL(OP_B), // OP_B /* 1010 1101 0011 */ TABDECL(OP_B), // OP_B /* 1010 1101 0100 */ TABDECL(OP_B), // OP_B /* 1010 1101 0101 */ TABDECL(OP_B), // OP_B /* 1010 1101 0110 */ TABDECL(OP_B), // OP_B /* 1010 1101 0111 */ TABDECL(OP_B), // OP_B /* 1010 1101 1000 */ TABDECL(OP_B), // OP_B /* 1010 1101 1001 */ TABDECL(OP_B), // OP_B /* 1010 1101 1010 */ TABDECL(OP_B), // OP_B /* 1010 1101 1011 */ TABDECL(OP_B), // OP_B /* 1010 1101 1100 */ TABDECL(OP_B), // OP_B /* 1010 1101 1101 */ TABDECL(OP_B), // OP_B /* 1010 1101 1110 */ TABDECL(OP_B), // OP_B /* 1010 1101 1111 */ TABDECL(OP_B), // OP_B /* 1010 1110 0000 */ TABDECL(OP_B), // OP_B /* 1010 1110 0001 */ TABDECL(OP_B), // OP_B /* 1010 1110 0010 */ TABDECL(OP_B), // OP_B /* 1010 1110 0011 */ TABDECL(OP_B), // OP_B /* 1010 1110 0100 */ TABDECL(OP_B), // OP_B /* 1010 1110 0101 */ TABDECL(OP_B), // OP_B /* 1010 1110 0110 */ TABDECL(OP_B), // OP_B /* 1010 1110 0111 */ TABDECL(OP_B), // OP_B /* 1010 1110 1000 */ TABDECL(OP_B), // OP_B /* 1010 1110 1001 */ TABDECL(OP_B), // OP_B /* 1010 1110 1010 */ TABDECL(OP_B), // OP_B /* 1010 1110 1011 */ TABDECL(OP_B), // OP_B /* 1010 1110 1100 */ TABDECL(OP_B), // OP_B /* 1010 1110 1101 */ TABDECL(OP_B), // OP_B /* 1010 1110 1110 */ TABDECL(OP_B), // OP_B /* 1010 1110 1111 */ TABDECL(OP_B), // OP_B /* 1010 1111 0000 */ TABDECL(OP_B), // OP_B /* 1010 1111 0001 */ TABDECL(OP_B), // OP_B /* 1010 1111 0010 */ TABDECL(OP_B), // OP_B /* 1010 1111 0011 */ TABDECL(OP_B), // OP_B /* 1010 1111 0100 */ TABDECL(OP_B), // OP_B /* 1010 1111 0101 */ TABDECL(OP_B), // OP_B /* 1010 1111 0110 */ TABDECL(OP_B), // OP_B /* 1010 1111 0111 */ TABDECL(OP_B), // OP_B /* 1010 1111 1000 */ TABDECL(OP_B), // OP_B /* 1010 1111 1001 */ TABDECL(OP_B), // OP_B /* 1010 1111 1010 */ TABDECL(OP_B), // OP_B /* 1010 1111 1011 */ TABDECL(OP_B), // OP_B /* 1010 1111 1100 */ TABDECL(OP_B), // OP_B /* 1010 1111 1101 */ TABDECL(OP_B), // OP_B /* 1010 1111 1110 */ TABDECL(OP_B), // OP_B /* 1010 1111 1111 */ TABDECL(OP_B), // OP_B /* 1011 0000 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1111 */ TABDECL(OP_BL), // OP_BL /* 1100 0000 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0001 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0010 0000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0011 0000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0100 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0101 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0110 0000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0111 0000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 1000 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1001 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1010 0000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1011 0000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1100 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1101 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1110 0000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1111 0000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1101 0000 0000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0001 0000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0010 0000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0011 0000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0100 0000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0101 0000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0110 0000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0111 0000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 1000 0000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1001 0000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1010 0000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1011 0000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1100 0000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1101 0000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1110 0000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1111 0000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1110 0000 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0001 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0010 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0011 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0100 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0101 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0110 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0111 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1000 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1001 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1010 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1011 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1100 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1101 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1110 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1111 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1111 0000 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1111 */ TABDECL(OP_SWI), // OP_SWI desmume-0.9.11/src/gfx3d.h0000755000000000000000000005222212467662066013737 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _GFX3D_H_ #define _GFX3D_H_ #include #include #include #include "types.h" class EMUFILE; // Pixel dimensions of the NDS 3D framebuffer #define GFX3D_FRAMEBUFFER_WIDTH 256 #define GFX3D_FRAMEBUFFER_HEIGHT 192 //geometry engine command numbers #define GFX3D_NOP 0x00 #define GFX3D_MTX_MODE 0x10 #define GFX3D_MTX_PUSH 0x11 #define GFX3D_MTX_POP 0x12 #define GFX3D_MTX_STORE 0x13 #define GFX3D_MTX_RESTORE 0x14 #define GFX3D_MTX_IDENTITY 0x15 #define GFX3D_MTX_LOAD_4x4 0x16 #define GFX3D_MTX_LOAD_4x3 0x17 #define GFX3D_MTX_MULT_4x4 0x18 #define GFX3D_MTX_MULT_4x3 0x19 #define GFX3D_MTX_MULT_3x3 0x1A #define GFX3D_MTX_SCALE 0x1B #define GFX3D_MTX_TRANS 0x1C #define GFX3D_COLOR 0x20 #define GFX3D_NORMAL 0x21 #define GFX3D_TEXCOORD 0x22 #define GFX3D_VTX_16 0x23 #define GFX3D_VTX_10 0x24 #define GFX3D_XY 0x25 #define GFX3D_XZ 0x26 #define GFX3D_YZ 0x27 #define GFX3D_DIFF 0x28 #define GFX3D_POLYGON_ATTR 0x29 #define GFX3D_TEXIMAGE_PARAM 0x2A #define GFX3D_PLTT_BASE 0x2B #define GFX3D_DIF_AMB 0x30 #define GFX3D_SPE_EMI 0x31 #define GFX3D_LIGHT_VECTOR 0x32 #define GFX3D_LIGHT_COLOR 0x33 #define GFX3D_SHININESS 0x34 #define GFX3D_BEGIN_VTXS 0x40 #define GFX3D_END_VTXS 0x41 #define GFX3D_SWAP_BUFFERS 0x50 #define GFX3D_VIEWPORT 0x60 #define GFX3D_BOX_TEST 0x70 #define GFX3D_POS_TEST 0x71 #define GFX3D_VEC_TEST 0x72 #define GFX3D_NOP_NOARG_HACK 0xDD //produce a 32bpp color from a ds RGB15, using a table #define RGB15TO32_NOALPHA(col) ( color_15bit_to_24bit[col&0x7FFF] ) //produce a 32bpp color from a ds RGB15 plus an 8bit alpha, using a table #ifdef WORDS_BIGENDIAN #define RGB15TO32(col,alpha8) ( (alpha8) | color_15bit_to_24bit[(col)&0x7FFF] ) #else #define RGB15TO32(col,alpha8) ( ((alpha8)<<24) | color_15bit_to_24bit[(col)&0x7FFF] ) #endif //produce a 5555 32bit color from a ds RGB15 plus an 5bit alpha #ifdef WORDS_BIGENDIAN #define RGB15TO5555(col,alpha5) ( (alpha5) | ((((col) & 0x7C00)>>10)<<8) | ((((col) & 0x03E0)>>5)<<16) | (((col) & 0x001F)<<24) ) #else #define RGB15TO5555(col,alpha5) ( ((alpha5)<<24) | ((((col) & 0x7C00)>>10)<<16) | ((((col) & 0x03E0)>>5)<<8) | ((col) & 0x001F) ) #endif //produce a 6665 32bit color from a ds RGB15 plus an 5bit alpha inline u32 RGB15TO6665(u16 col, u8 alpha5) { const u16 r = (col&0x001F)>>0; const u16 g = (col&0x03E0)>>5; const u16 b = (col&0x7C00)>>10; #ifdef WORDS_BIGENDIAN const u32 ret = alpha5 | (((b<<1)+1)<<8) | (((g<<1)+1)<<16) | (((r<<1)+1)<<24); #else const u32 ret = (alpha5<<24) | (((b<<1)+1)<<16) | (((g<<1)+1)<<8) | ((r<<1)+1); #endif return ret; } //produce a 24bpp color from a ds RGB15, using a table #define RGB15TO24_REVERSE(col) ( color_15bit_to_24bit_reverse[(col)&0x7FFF] ) //produce a 16bpp color from a ds RGB15, using a table #define RGB15TO16_REVERSE(col) ( color_15bit_to_16bit_reverse[(col)&0x7FFF] ) //produce a 15bpp color from individual 5bit components #define R5G5B5TORGB15(r,g,b) ( (r) | ((g)<<5) | ((b)<<10) ) //produce a 16bpp color from individual 5bit components #define R6G6B6TORGB15(r,g,b) ( ((r)>>1) | (((g)&0x3E)<<4) | (((b)&0x3E)<<9) ) #define GFX3D_5TO6(x) ((x)?(((x)<<1)+1):0) // 15-bit to 24-bit depth formula from http://nocash.emubase.de/gbatek.htm#ds3drearplane #define DS_DEPTH15TO24(depth) ( dsDepthExtend_15bit_to_24bit[(depth) & 0x7FFF] ) // POLYGON PRIMITIVE TYPES enum { GFX3D_TRIANGLES = 0, GFX3D_QUADS = 1, GFX3D_TRIANGLE_STRIP = 2, GFX3D_QUAD_STRIP = 3, GFX3D_LINE = 4 }; // POLYGON ATTRIBUTES - BIT LOCATIONS enum { POLYGON_ATTR_ENABLE_LIGHT0_BIT = 0, POLYGON_ATTR_ENABLE_LIGHT1_BIT = 1, POLYGON_ATTR_ENABLE_LIGHT2_BIT = 2, POLYGON_ATTR_ENABLE_LIGHT3_BIT = 3, POLYGON_ATTR_MODE_BIT = 4, // Bits 4 - 5 POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT = 6, POLYGON_ATTR_ENABLE_FRONT_SURFACE_BIT = 7, // Bits 8 - 10 unused POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_BIT = 11, POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_BIT = 12, POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_BIT = 13, POLYGON_ATTR_ENABLE_DEPTH_TEST_BIT = 14, POLYGON_ATTR_ENABLE_FOG_BIT = 15, POLYGON_ATTR_ALPHA_BIT = 16, // Bits 16 - 20 // Bits 21 - 23 unused POLYGON_ATTR_POLYGON_ID_BIT = 24, // Bits 24 - 29 // Bits 30 - 31 unused }; // POLYGON ATTRIBUTES - BIT MASKS enum { POLYGON_ATTR_ENABLE_LIGHT0_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT0_BIT, POLYGON_ATTR_ENABLE_LIGHT1_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT1_BIT, POLYGON_ATTR_ENABLE_LIGHT2_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT2_BIT, POLYGON_ATTR_ENABLE_LIGHT3_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT3_BIT, POLYGON_ATTR_MODE_MASK = 0x03 << POLYGON_ATTR_MODE_BIT, POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK = 0x01 << POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT, POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK = 0x01 << POLYGON_ATTR_ENABLE_FRONT_SURFACE_BIT, POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_MASK = 0x01 << POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_BIT, POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_MASK = 0x01 << POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_BIT, POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_MASK = 0x01 << POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_BIT, POLYGON_ATTR_ENABLE_DEPTH_TEST_MASK = 0x01 << POLYGON_ATTR_ENABLE_DEPTH_TEST_BIT, POLYGON_ATTR_ENABLE_FOG_MASK = 0x01 << POLYGON_ATTR_ENABLE_FOG_BIT, POLYGON_ATTR_ALPHA_MASK = 0x1F << POLYGON_ATTR_ALPHA_BIT, POLYGON_ATTR_POLYGON_ID_MASK = 0x3F << POLYGON_ATTR_POLYGON_ID_BIT }; // TEXTURE PARAMETERS - BIT LOCATIONS enum { TEXTURE_PARAM_VRAM_OFFSET_BIT = 0, // Bits 0 - 15 TEXTURE_PARAM_ENABLE_REPEAT_S_BIT = 16, TEXTURE_PARAM_ENABLE_REPEAT_T_BIT = 17, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_BIT = 18, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_BIT = 19, TEXTURE_PARAM_SIZE_S_BIT = 20, // Bits 20 - 22 TEXTURE_PARAM_SIZE_T_BIT = 23, // Bits 23 - 25 TEXTURE_PARAM_FORMAT_BIT = 26, // Bits 26 - 28 TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_BIT = 29, TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT = 30 // Bits 30 - 31 }; // TEXTURE PARAMETERS - BIT MASKS enum { TEXTURE_PARAM_VRAM_OFFSET_MASK = 0xFFFF << TEXTURE_PARAM_VRAM_OFFSET_BIT, TEXTURE_PARAM_ENABLE_REPEAT_S_MASK = 0x01 << TEXTURE_PARAM_ENABLE_REPEAT_S_BIT, TEXTURE_PARAM_ENABLE_REPEAT_T_MASK = 0x01 << TEXTURE_PARAM_ENABLE_REPEAT_T_BIT, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_MASK = 0x01 << TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_BIT, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_MASK = 0x01 << TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_BIT, TEXTURE_PARAM_SIZE_S_MASK = 0x07 << TEXTURE_PARAM_SIZE_S_BIT, TEXTURE_PARAM_SIZE_T_MASK = 0x07 << TEXTURE_PARAM_SIZE_T_BIT, TEXTURE_PARAM_FORMAT_MASK = 0x07 << TEXTURE_PARAM_FORMAT_BIT, TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_MASK = 0x01 << TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_BIT, TEXTURE_PARAM_COORD_TRANSFORM_MODE_MASK = 0x03 << TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT }; // TEXTURE PARAMETERS - FORMAT ID enum { TEXMODE_NONE = 0, TEXMODE_A3I5 = 1, TEXMODE_I2 = 2, TEXMODE_I4 = 3, TEXMODE_I8 = 4, TEXMODE_4X4 = 5, TEXMODE_A5I3 = 6, TEXMODE_16BPP = 7 }; void gfx3d_init(); void gfx3d_reset(); typedef struct { u8 enableLightFlags; bool enableLight0; bool enableLight1; bool enableLight2; bool enableLight3; u8 polygonMode; u8 surfaceCullingMode; bool enableRenderBackSurface; bool enableRenderFrontSurface; bool enableAlphaDepthWrite; bool enableRenderOnFarPlaneIntersect; bool enableRenderOneDot; bool enableDepthTest; bool enableRenderFog; bool isWireframe; bool isOpaque; bool isTranslucent; u8 alpha; u8 polygonID; } PolygonAttributes; typedef struct { u16 VRAMOffset; bool enableRepeatS; bool enableRepeatT; bool enableMirroredRepeatS; bool enableMirroredRepeatT; u8 sizeS; u8 sizeT; u8 texFormat; bool enableTransparentColor0; u8 coordTransformMode; } PolygonTexParams; struct POLY { int type; //tri or quad u8 vtxFormat; u16 vertIndexes[4]; //up to four verts can be referenced by this poly u32 polyAttr, texParam, texPalette; //the hardware rendering params u32 viewport; float miny, maxy; void setVertIndexes(int a, int b, int c, int d=-1) { vertIndexes[0] = a; vertIndexes[1] = b; vertIndexes[2] = c; if(d != -1) { vertIndexes[3] = d; type = 4; } else type = 3; } u8 getAttributeEnableLightFlags() const { return ((polyAttr & (POLYGON_ATTR_ENABLE_LIGHT0_MASK | POLYGON_ATTR_ENABLE_LIGHT1_MASK | POLYGON_ATTR_ENABLE_LIGHT2_MASK | POLYGON_ATTR_ENABLE_LIGHT3_MASK)) >> POLYGON_ATTR_ENABLE_LIGHT0_BIT); } bool getAttributeEnableLight0() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT0_MASK) > 0); } bool getAttributeEnableLight1() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT1_MASK) > 0); } bool getAttributeEnableLight2() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT2_MASK) > 0); } bool getAttributeEnableLight3() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT3_MASK) > 0); } u8 getAttributePolygonMode() const { return ((polyAttr & POLYGON_ATTR_MODE_MASK) >> POLYGON_ATTR_MODE_BIT); } u8 getAttributeEnableFaceCullingFlags() const { return ((polyAttr & (POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK | POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK)) >> POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT); } bool getAttributeEnableBackSurface() const { return ((polyAttr & POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK) > 0); } bool getAttributeEnableFrontSurface() const { return ((polyAttr & POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK) > 0); } bool getAttributeEnableAlphaDepthWrite() const { return ((polyAttr & POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_MASK) > 0); } bool getAttributeEnableRenderOnFarPlaneIntersect() const { return ((polyAttr & POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_MASK) > 0); } bool getAttributeEnableOneDotRender() const { return ((polyAttr & POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_MASK) > 0); } bool getAttributeEnableDepthTest() const { return ((polyAttr & POLYGON_ATTR_ENABLE_DEPTH_TEST_MASK) > 0); } bool getAttributeEnableFog() const { return ((polyAttr & POLYGON_ATTR_ENABLE_FOG_MASK) > 0); } u8 getAttributeAlpha() const { return ((polyAttr & POLYGON_ATTR_ALPHA_MASK) >> POLYGON_ATTR_ALPHA_BIT); } u8 getAttributePolygonID() const { return ((polyAttr & POLYGON_ATTR_POLYGON_ID_MASK) >> POLYGON_ATTR_POLYGON_ID_BIT); } PolygonAttributes getAttributes() const { PolygonAttributes theAttr; theAttr.enableLightFlags = this->getAttributeEnableLightFlags(); theAttr.enableLight0 = this->getAttributeEnableLight0(); theAttr.enableLight1 = this->getAttributeEnableLight1(); theAttr.enableLight2 = this->getAttributeEnableLight2(); theAttr.enableLight3 = this->getAttributeEnableLight3(); theAttr.polygonMode = this->getAttributePolygonMode(); theAttr.surfaceCullingMode = this->getAttributeEnableFaceCullingFlags(); theAttr.enableRenderBackSurface = this->getAttributeEnableBackSurface(); theAttr.enableRenderFrontSurface = this->getAttributeEnableFrontSurface(); theAttr.enableAlphaDepthWrite = this->getAttributeEnableAlphaDepthWrite(); theAttr.enableRenderOnFarPlaneIntersect = this->getAttributeEnableRenderOnFarPlaneIntersect(); theAttr.enableRenderOneDot = this->getAttributeEnableOneDotRender(); theAttr.enableDepthTest = this->getAttributeEnableDepthTest(); theAttr.enableRenderFog = this->getAttributeEnableFog(); theAttr.alpha = this->getAttributeAlpha(); theAttr.isWireframe = this->isWireframe(); theAttr.isOpaque = this->isOpaque(); theAttr.isTranslucent = this->isTranslucent(); theAttr.polygonID = this->getAttributePolygonID(); return theAttr; } u16 getTexParamVRAMOffset() const { return ((texParam & TEXTURE_PARAM_VRAM_OFFSET_MASK) >> TEXTURE_PARAM_VRAM_OFFSET_BIT); } bool getTexParamEnableRepeatS() const { return ((texParam & TEXTURE_PARAM_ENABLE_REPEAT_S_MASK) > 0); } bool getTexParamEnableRepeatT() const { return ((texParam & TEXTURE_PARAM_ENABLE_REPEAT_T_MASK) > 0); } bool getTexParamEnableMirroredRepeatS() const { return ((texParam & TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_MASK) > 0); } bool getTexParamEnableMirroredRepeatT() const { return ((texParam & TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_MASK) > 0); } u8 getTexParamSizeS() const { return ((texParam & TEXTURE_PARAM_SIZE_S_MASK) >> TEXTURE_PARAM_SIZE_S_BIT); } u8 getTexParamSizeT() const { return ((texParam & TEXTURE_PARAM_SIZE_T_MASK) >> TEXTURE_PARAM_SIZE_T_BIT); } u8 getTexParamTexFormat() const { return ((texParam & TEXTURE_PARAM_FORMAT_MASK) >> TEXTURE_PARAM_FORMAT_BIT); } bool getTexParamEnableTransparentColor0() const { return ((texParam & TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_MASK) > 0); } u8 getTexParamCoordTransformMode() const { return ((texParam & TEXTURE_PARAM_COORD_TRANSFORM_MODE_MASK) >> TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT); } PolygonTexParams getTexParams() const { PolygonTexParams theTexParams; theTexParams.VRAMOffset = this->getTexParamVRAMOffset(); theTexParams.enableRepeatS = this->getTexParamEnableRepeatS(); theTexParams.enableRepeatT = this->getTexParamEnableRepeatT(); theTexParams.enableMirroredRepeatS = this->getTexParamEnableMirroredRepeatS(); theTexParams.enableMirroredRepeatT = this->getTexParamEnableMirroredRepeatT(); theTexParams.sizeS = this->getTexParamSizeS(); theTexParams.sizeT = this->getTexParamSizeT(); theTexParams.texFormat = this->getTexParamTexFormat(); theTexParams.enableTransparentColor0 = this->getTexParamEnableTransparentColor0(); theTexParams.coordTransformMode = this->getTexParamCoordTransformMode(); return theTexParams; } bool isWireframe() const { return (this->getAttributeAlpha() == 0); } bool isOpaque() const { return (this->getAttributeAlpha() == 31); } bool isTranslucent() const { // First, check if the polygon is wireframe or opaque. // If neither, then it must be translucent. if (!this->isWireframe() && !this->isOpaque()) { return true; } // Also check for translucent texture format. u8 texFormat = this->getTexParamTexFormat(); //a5i3 or a3i5 -> translucent if(texFormat == TEXMODE_A3I5 || texFormat == TEXMODE_A5I3) return true; return false; } void save(EMUFILE* os); void load(EMUFILE* is); }; #define POLYLIST_SIZE 100000 struct POLYLIST { POLY list[POLYLIST_SIZE]; int count; }; //just a vert with a 4 float position struct VERT_POS4f { union { float coord[4]; struct { float x,y,z,w; }; struct { float x,y,z,w; } position; }; void set_coord(float x, float y, float z, float w) { this->x = x; this->y = y; this->z = z; this->w = w; } }; //dont use SSE optimized matrix instructions in here, things might not be aligned //we havent padded this because the sheer bulk of data leaves things running faster without the extra bloat struct VERT { // Align to 16 for SSE instructions to work union { float coord[4]; struct { float x,y,z,w; }; } CACHE_ALIGN; union { float texcoord[2]; struct { float u,v; }; } CACHE_ALIGN; void set_coord(float x, float y, float z, float w) { this->x = x; this->y = y; this->z = z; this->w = w; } void set_coord(float* coords) { x = coords[0]; y = coords[1]; z = coords[2]; w = coords[3]; } float fcolor[3]; u8 color[3]; void color_to_float() { fcolor[0] = color[0]; fcolor[1] = color[1]; fcolor[2] = color[2]; } void save(EMUFILE* os); void load(EMUFILE* is); }; #define VERTLIST_SIZE 400000 //#define VERTLIST_SIZE 10000 struct VERTLIST { VERT list[VERTLIST_SIZE]; int count; }; struct INDEXLIST { int list[POLYLIST_SIZE]; }; struct VIEWPORT { int x, y, width, height; void decode(u32 v); }; //ok, imagine the plane that cuts diagonally across a cube such that it clips //out to be a hexagon. within that plane, draw a quad such that it cuts off //four corners of the hexagon, and you will observe a decagon #define MAX_CLIPPED_VERTS 10 class GFX3D_Clipper { public: struct TClippedPoly { int type; //otherwise known as "count" of verts POLY* poly; VERT clipVerts[MAX_CLIPPED_VERTS]; }; //the entry point for poly clipping template void clipPoly(POLY* poly, VERT** verts); //the output of clipping operations goes into here. //be sure you init it before clipping! TClippedPoly *clippedPolys; int clippedPolyCounter; void reset() { clippedPolyCounter=0; } private: TClippedPoly tempClippedPoly; TClippedPoly outClippedPoly; FORCEINLINE void clipSegmentVsPlane(VERT** verts, const int coord, int which); FORCEINLINE void clipPolyVsPlane(const int coord, int which); }; //used to communicate state to the renderer struct GFX3D_State { GFX3D_State() : enableTexturing(true) , enableAlphaTest(true) , enableAlphaBlending(true) , enableAntialiasing(false) , enableEdgeMarking(false) , enableClearImage(false) , enableFog(false) , enableFogAlphaOnly(false) , shading(TOON) , alphaTestRef(0) , activeFlushCommand(0) , pendingFlushCommand(0) , clearDepth(1) , clearColor(0) , fogColor(0) , fogOffset(0) , fogShift(0) , invalidateToon(true) { for(u32 i=0;i. */ #ifndef _SRAM_H #define _SRAM_H #include "types.h" #define NB_STATES 10 extern int lastSaveState; typedef struct { BOOL exists; char date[40]; } savestates_t; struct SFORMAT { //a string description of the element const char *desc; //the size of each element u32 size; //the number of each element u32 count; //a void* to the data or a void** to the data void *v; }; extern savestates_t savestates[NB_STATES]; void clear_savestates(); void scan_savestates(); u8 sram_read (u32 address); void sram_write (u32 address, u8 value); int sram_load (const char *file_name); int sram_save (const char *file_name); bool savestate_load (const char *file_name); bool savestate_save (const char *file_name); void savestate_slot(int num); void loadstate_slot(int num); bool savestate_load(class EMUFILE* is); bool savestate_save(class EMUFILE* outstream, int compressionLevel); void dorewind(); void rewindsave(); #endif desmume-0.9.11/src/agg2d.inl0000755000000000000000000020166512467662066014252 0ustar rootroot//---------------------------------------------------------------------------- // Agg2D - Version 1.0 // Based on Anti-Grain Geometry // Copyright (C) 2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // // 25 Jan 2007 - Ported to AGG 2.4 Jerry Evans (jerry@novadsp.com) // 11 Jul 2009 - significant refactors for introduction to desmume // //---------------------------------------------------------------------------- #include "agg2d.h" static const double g_approxScale = 2.0; #define TAGG2D Agg2D AGG2D_TEMPLATE_ARG #define TAGG2DRENDERER Agg2DRenderer //AGG2D_TEMPLATE inline bool operator == (const TAGG2D::Color& c1, const TAGG2D::Color& c2) //{ // return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a; //} // //AGG2D_TEMPLATE inline bool operator != (const Agg2D::Color& c1, const Agg2D::Color& c2) //{ // return !(c1 == c2); //} AGG2D_TEMPLATE inline TAGG2D::~Agg2D() { #ifdef AGG2D_USE_VECTORFONTS #ifndef AGG2D_USE_FREETYPE ::ReleaseDC(0, m_fontDC); #endif #endif } AGG2D_TEMPLATE inline TAGG2D::Agg2D() : m_rbuf(), m_pixFormat(m_rbuf), m_pixFormatComp(m_rbuf), m_pixFormatPre(m_rbuf), m_pixFormatCompPre(m_rbuf), m_renBase(m_pixFormat), m_renBaseComp(m_pixFormatComp), m_renBasePre(m_pixFormatPre), m_renBaseCompPre(m_pixFormatCompPre), m_renSolid(m_renBase), m_renSolidComp(m_renBaseComp), m_allocator(), m_clipBox(0,0,0,0), m_blendMode(BlendAlpha), m_imageBlendMode(BlendDst), m_imageBlendColor(0,0,0), m_scanline(), m_rasterizer(), m_masterAlpha(1.0), m_antiAliasGamma(1.0), m_font(agg::gse4x6), m_fillColor(255, 255, 255), m_lineColor(0, 0, 0), m_fillGradient(), m_lineGradient(), m_lineCap(CAP_ROUND), m_lineJoin(JOIN_ROUND), m_fillGradientFlag(Solid), m_lineGradientFlag(Solid), m_fillGradientMatrix(), m_lineGradientMatrix(), m_fillGradientD1(0.0), m_lineGradientD1(0.0), m_fillGradientD2(100.0), m_lineGradientD2(100.0), m_textAngle(0.0), m_textAlignX(AlignLeft), m_textAlignY(AlignBottom), m_textHints(true), m_fontHeight(0.0), m_fontAscent(0.0), m_fontDescent(0.0), m_fontCacheType(RasterFontCache), //m_imageFilter(Bilinear), //less quality more speed m_imageFilter(NoFilter), m_imageResample(NoResample), m_imageFilterLut(agg::image_filter_bilinear(), true), m_fillGradientInterpolator(m_fillGradientMatrix), m_lineGradientInterpolator(m_lineGradientMatrix), m_linearGradientFunction(), m_radialGradientFunction(), m_lineWidth(1), m_evenOddFlag(false), m_start_x(0.0), m_start_y(0.0), m_path(), m_transform(), m_convCurve(m_path), m_convStroke(m_convCurve), m_pathTransform(m_convCurve, m_transform), m_strokeTransform(m_convStroke, m_transform) #ifdef AGG2D_USE_VECTORFONTS #ifdef AGG2D_USE_FREETYPE , m_fontEngine(), #else m_fontDC(::GetDC(0)), m_fontEngine(m_fontDC), #endif m_fontCacheManager(m_fontEngine) #endif { lineCap(m_lineCap); lineJoin(m_lineJoin); } AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::saveStateTo(State& st) { st.m_clipBox = m_clipBox; st.m_blendMode = m_blendMode; st.m_imageBlendMode = m_imageBlendMode; st.m_imageBlendColor = m_imageBlendColor; st.m_masterAlpha = m_masterAlpha; st.m_antiAliasGamma = m_antiAliasGamma; st.m_font = m_font; st.m_fillColor = m_fillColor; st.m_lineColor = m_lineColor; st.m_fillGradient = m_fillGradient; st.m_lineGradient = m_lineGradient; st.m_lineCap = m_lineCap; st.m_lineJoin = m_lineJoin; st.m_fillGradientFlag = m_fillGradientFlag; st.m_lineGradientFlag = m_lineGradientFlag; st.m_fillGradientMatrix = m_fillGradientMatrix; st.m_lineGradientMatrix = m_lineGradientMatrix; st.m_fillGradientD1 = m_fillGradientD1; st.m_lineGradientD1 = m_lineGradientD1; st.m_fillGradientD2 = m_fillGradientD2; st.m_lineGradientD2 = m_lineGradientD2; st.m_textAngle = m_textAngle; st.m_textAlignX = m_textAlignX; st.m_textAlignY = m_textAlignY; st.m_textHints = m_textHints; st.m_fontHeight = m_fontHeight; st.m_fontAscent = m_fontAscent; st.m_fontDescent = m_fontDescent; st.m_fontCacheType = m_fontCacheType; st.m_lineWidth = m_lineWidth; st.m_evenOddFlag = m_evenOddFlag; st.m_transform = m_transform; st.m_affine = m_affine; } AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::restoreStateFrom(const State& st) { m_clipBox = st.m_clipBox; m_blendMode = st.m_blendMode; m_imageBlendMode = st.m_imageBlendMode; m_imageBlendColor = st.m_imageBlendColor; m_masterAlpha = st.m_masterAlpha; m_antiAliasGamma = st.m_antiAliasGamma; m_font = st.m_font; m_fillColor = st.m_fillColor; m_lineColor = st.m_lineColor; m_fillGradient = st.m_fillGradient; m_lineGradient = st.m_lineGradient; m_lineCap = st.m_lineCap; m_lineJoin = st.m_lineJoin; m_fillGradientFlag = st.m_fillGradientFlag; m_lineGradientFlag = st.m_lineGradientFlag; m_fillGradientMatrix = st.m_fillGradientMatrix; m_lineGradientMatrix = st.m_lineGradientMatrix; m_fillGradientD1 = st.m_fillGradientD1; m_lineGradientD1 = st.m_lineGradientD1; m_fillGradientD2 = st.m_fillGradientD2; m_lineGradientD2 = st.m_lineGradientD2; m_textAngle = st.m_textAngle; m_textAlignX = st.m_textAlignX; m_textAlignY = st.m_textAlignY; m_textHints = st.m_textHints; m_fontHeight = st.m_fontHeight; m_fontAscent = st.m_fontAscent; m_fontDescent = st.m_fontDescent; m_fontCacheType = st.m_fontCacheType; m_lineWidth = st.m_lineWidth; m_evenOddFlag = st.m_evenOddFlag; m_affine = st.m_affine; m_transform = st.m_transform; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(unsigned char* buf, unsigned width, unsigned height, int stride) { m_rbuf.attach(buf, width, height, stride); m_renBase.reset_clipping(true); m_renBaseComp.reset_clipping(true); m_renBasePre.reset_clipping(true); m_renBaseCompPre.reset_clipping(true); //why is all this reset here???? seems silly. resetTransformations(); lineWidth(1.0), lineColor(0,0,0); fillColor(255,255,255); clipBox(0, 0, width, height); lineCap(CAP_ROUND); lineJoin(JOIN_ROUND); #ifdef AGG2D_USE_VECTORFONTS textAlignment(AlignLeft, AlignBottom); flipText(false); #endif //imageFilter(Bilinear); //less quality more speed imageFilter(NoFilter); imageResample(NoResample); m_masterAlpha = 1.0; m_antiAliasGamma = 1.0; m_rasterizer.gamma(agg::gamma_none()); m_blendMode = BlendAlpha; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(MyImage& img) { attach(img.renBuf.buf(), img.renBuf.width(), img.renBuf.height(), img.renBuf.stride()); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clipBox(double x1, double y1, double x2, double y2) { m_viewport.transform(&x1, &y1); // m_viewport.transform(&x2, &y2); // see: http://article.gmane.org/gmane.comp.graphics.agg/3543 m_clipBox = RectD(x1, y1, x2, y2); int rx1 = int(x1); int ry1 = int(y1); int rx2 = int(x2); int ry2 = int(y2); m_renBase.clip_box(rx1, ry1, rx2, ry2); m_renBaseComp.clip_box(rx1, ry1, rx2, ry2); m_renBasePre.clip_box(rx1, ry1, rx2, ry2); m_renBaseCompPre.clip_box(rx1, ry1, rx2, ry2); // m_rasterizer.clip_box(x1, y1, x2, y2); m_rasterizer.clip_box(m_renBase.xmin(), m_renBase.ymin(), m_renBase.xmax()+1, m_renBase.ymax()+1); // see link above } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::blendMode(BlendMode m) { m_blendMode = m; m_pixFormatComp.comp_op(m); m_pixFormatCompPre.comp_op(m); } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::BlendMode Agg2D AGG2D_TEMPLATE_ARG ::blendMode() const { return m_blendMode; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendMode(BlendMode m) { m_imageBlendMode = m; } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::BlendMode Agg2D AGG2D_TEMPLATE_ARG ::imageBlendMode() const { return m_imageBlendMode; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor(Color c) { m_imageBlendColor = c; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a) { imageBlendColor(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::Color Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor() const { return m_imageBlendColor; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::masterAlpha(double a) { m_masterAlpha = a; updateRasterizerGamma(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::masterAlpha() const { return m_masterAlpha; } //------------------------------------------------------------------------+ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::antiAliasGamma(double g) { m_antiAliasGamma = g; updateRasterizerGamma(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::antiAliasGamma() const { return m_antiAliasGamma; } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::RectD Agg2D AGG2D_TEMPLATE_ARG ::clipBox() const { return m_clipBox; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearAll(Color c) { m_renBase.clear(c); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearAll(unsigned r, unsigned g, unsigned b, unsigned a) { clearAll(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearClipBox(Color c) { m_renBase.copy_bar(0, 0, m_renBase.width(), m_renBase.height(), c); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a) { clearClipBox(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::worldToScreen(double& x, double& y) const { m_transform.transform(&x, &y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::screenToWorld(double& x, double& y) const { m_transform.inverse_transform(&x, &y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::worldToScreen(double scalar) const { double x1 = 0; double y1 = 0; double x2 = scalar; double y2 = scalar; worldToScreen(x1, y1); worldToScreen(x2, y2); return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * 0.7071068; } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::screenToWorld(double scalar) const { double x1 = 0; double y1 = 0; double x2 = scalar; double y2 = scalar; screenToWorld(x1, y1); screenToWorld(x2, y2); return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * 0.7071068; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::alignPoint(double& x, double& y) const { worldToScreen(x, y); x = floor(x) + 0.5; y = floor(y) + 0.5; screenToWorld(x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE bool Agg2D AGG2D_TEMPLATE_ARG ::inBox(double worldX, double worldY) const { worldToScreen(worldX, worldY); return m_renBase.inbox(int(worldX), int(worldY)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::Transformations Agg2D AGG2D_TEMPLATE_ARG ::transformations() const { Transformations tr; m_transform.store_to(tr.affineMatrix); return tr; } //------------------------------------------------------------------------ AGG2D_TEMPLATE const Agg2DBase::Affine& Agg2D AGG2D_TEMPLATE_ARG ::affine() const { return m_affine; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::affine(const Affine& af) { m_affine = af; updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::transformations(const Transformations& tr) { m_transform.load_from(tr.affineMatrix); m_convCurve.approximation_scale(worldToScreen(1.0) * g_approxScale); m_convStroke.approximation_scale(worldToScreen(1.0) * g_approxScale); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::resetTransformations() { m_transform.reset(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::updateTransformations() { m_transform = m_affine; m_transform *= m_viewport; m_convCurve.approximation_scale(worldToScreen(1.0) * g_approxScale); m_convStroke.approximation_scale(worldToScreen(1.0) * g_approxScale); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::rotate(double angle) { m_affine.premultiply(agg::trans_affine_rotation(angle)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::rotate(double angle, double cx, double cy) { agg::trans_affine_translation m(-cx, -cy); m *= agg::trans_affine_rotation(angle); m *= agg::trans_affine_translation(cx, cy); m_affine.premultiply(m); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::skew(double sx, double sy) { m_affine.premultiply(agg::trans_affine_skewing(sx, sy)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::translate(double x, double y) { m_affine.premultiply(agg::trans_affine_translation(x, y)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::matrix(const Affine& tr) { m_affine.premultiply(tr); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::matrix(const Transformations& tr) { matrix(agg::trans_affine(tr.affineMatrix[0], tr.affineMatrix[1], tr.affineMatrix[2], tr.affineMatrix[3], tr.affineMatrix[4], tr.affineMatrix[5])); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::scale(double s) { m_affine.premultiply(agg::trans_affine_scaling(s)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::scale(double sx, double sy) { m_affine.premultiply(agg::trans_affine_scaling(sx, sy)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::parallelogram(double x1, double y1, double x2, double y2, const double* para) { m_affine.premultiply(agg::trans_affine(x1, y1, x2, y2, para)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, ViewportOption opt, WindowFitLogic fl) { agg::trans_viewport vp; agg::aspect_ratio_e ar = (fl == WindowFitLogic_meet) ? agg::aspect_ratio_meet : agg::aspect_ratio_slice; switch(opt) { case Anisotropic: vp.preserve_aspect_ratio(0.0, 0.0, agg::aspect_ratio_stretch); break; case XMinYMin: vp.preserve_aspect_ratio(0.0, 0.0, ar); break; case XMidYMin: vp.preserve_aspect_ratio(0.5, 0.0, ar); break; case XMaxYMin: vp.preserve_aspect_ratio(1.0, 0.0, ar); break; case XMinYMid: vp.preserve_aspect_ratio(0.0, 0.5, ar); break; case XMidYMid: vp.preserve_aspect_ratio(0.5, 0.5, ar); break; case XMaxYMid: vp.preserve_aspect_ratio(1.0, 0.5, ar); break; case XMinYMax: vp.preserve_aspect_ratio(0.0, 1.0, ar); break; case XMidYMax: vp.preserve_aspect_ratio(0.5, 1.0, ar); break; case XMaxYMax: vp.preserve_aspect_ratio(1.0, 1.0, ar); break; } vp.world_viewport(worldX1, worldY1, worldX2, worldY2); vp.device_viewport(screenX1, screenY1, screenX2, screenY2); m_viewport = vp.to_affine(); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::fillColor(Color c) { m_fillColor = c; m_fillGradientFlag = Solid; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::fillColor(unsigned r, unsigned g, unsigned b, unsigned a) { fillColor(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::noFill() { fillColor(Color(0, 0, 0, 0)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::lineColor(Color c) { m_lineColor = c; m_lineGradientFlag = Solid; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::lineColor(unsigned r, unsigned g, unsigned b, unsigned a) { lineColor(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::noLine() { lineColor(Color(0, 0, 0, 0)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename TAGG2D::Color TAGG2D::fillColor() const { return m_fillColor; } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename TAGG2D::Color TAGG2D::lineColor() const { return m_lineColor; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 127.0); int endGradient = 128 + int(profile * 127.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_fillGradient[i] = c1; } for (; i < endGradient; i++) { m_fillGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_fillGradient[i] = c2; } double angle = atan2(y2-y1, x2-x1); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_rotation(angle); m_fillGradientMatrix *= agg::trans_affine_translation(x1, y1); m_fillGradientMatrix *= m_transform; m_fillGradientMatrix.invert(); m_fillGradientD1 = 0.0; m_fillGradientD2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1)); m_fillGradientFlag = Linear; m_fillColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 128.0); int endGradient = 128 + int(profile * 128.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_lineGradient[i] = c1; } for (; i < endGradient; i++) { m_lineGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_lineGradient[i] = c2; } double angle = atan2(y2-y1, x2-x1); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_rotation(angle); m_lineGradientMatrix *= agg::trans_affine_translation(x1, y1); m_fillGradientMatrix *= m_transform; m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; m_lineGradientD2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1)); m_lineGradientFlag = Linear; m_lineColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 127.0); int endGradient = 128 + int(profile * 127.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_fillGradient[i] = c1; } for (; i < endGradient; i++) { m_fillGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_fillGradient[i] = c2; } m_fillGradientD2 = worldToScreen(r); worldToScreen(x, y); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_translation(x, y); m_fillGradientMatrix.invert(); m_fillGradientD1 = 0; m_fillGradientFlag = Radial; m_fillColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 128.0); int endGradient = 128 + int(profile * 128.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_lineGradient[i] = c1; } for (; i < endGradient; i++) { m_lineGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_lineGradient[i] = c2; } m_lineGradientD2 = worldToScreen(r); worldToScreen(x, y); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_translation(x, y); m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; m_lineGradientFlag = Radial; m_lineColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3) { int i; for (i = 0; i < 128; i++) { m_fillGradient[i] = c1.gradient(c2, double(i) / 127.0); } for (; i < 256; i++) { m_fillGradient[i] = c2.gradient(c3, double(i - 128) / 127.0); } m_fillGradientD2 = worldToScreen(r); worldToScreen(x, y); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_translation(x, y); m_fillGradientMatrix.invert(); m_fillGradientD1 = 0; m_fillGradientFlag = Radial; m_fillColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3) { int i; for (i = 0; i < 128; i++) { m_lineGradient[i] = c1.gradient(c2, double(i) / 127.0); } for (; i < 256; i++) { m_lineGradient[i] = c2.gradient(c3, double(i - 128) / 127.0); } m_lineGradientD2 = worldToScreen(r); worldToScreen(x, y); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_translation(x, y); m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; m_lineGradientFlag = Radial; m_lineColor = Color(0,0,0); // Set some real color } AGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r) { m_fillGradientD2 = worldToScreen(r); worldToScreen(x, y); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_translation(x, y); m_fillGradientMatrix.invert(); m_fillGradientD1 = 0; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r) { m_lineGradientD2 = worldToScreen(r); worldToScreen(x, y); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_translation(x, y); m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineWidth(double w) { m_lineWidth = w; m_convStroke.width(w); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::lineWidth() const { return m_lineWidth; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillEvenOdd(bool evenOddFlag) { m_evenOddFlag = evenOddFlag; m_rasterizer.filling_rule(evenOddFlag ? agg::fill_even_odd : agg::fill_non_zero); } //------------------------------------------------------------------------ AGG2D_TEMPLATE bool TAGG2D::fillEvenOdd() const { return m_evenOddFlag; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineCap(LineCap cap) { m_lineCap = cap; m_convStroke.line_cap((agg::line_cap_e)cap); } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::LineCap TAGG2D::lineCap() const { return m_lineCap; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineJoin(LineJoin join) { m_lineJoin = join; m_convStroke.line_join((agg::line_join_e)join); } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::LineJoin TAGG2D::lineJoin() const { return m_lineJoin; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::addLine(double x1, double y1, double x2, double y2) { m_path.move_to(x1, y1); m_path.line_to(x2, y2); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::line(double x1, double y1, double x2, double y2) { m_path.remove_all(); addLine(x1, y1, x2, y2); drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::triangle(double x1, double y1, double x2, double y2, double x3, double y3) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.line_to(x2, y2); m_path.line_to(x3, y3); m_path.close_polygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::rectangle(double x1, double y1, double x2, double y2) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.line_to(x2, y1); m_path.line_to(x2, y2); m_path.line_to(x1, y2); m_path.close_polygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double r) { m_path.remove_all(); agg::rounded_rect rc(x1, y1, x2, y2, r); rc.normalize_radius(); rc.approximation_scale(worldToScreen(1.0) * g_approxScale); // JME audit //m_path.add_path(rc, 0, false); m_path.concat_path(rc,0); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) { m_path.remove_all(); agg::rounded_rect rc; rc.rect(x1, y1, x2, y2); rc.radius(rx, ry); rc.normalize_radius(); //m_path.add_path(rc, 0, false); m_path.concat_path(rc,0); // JME drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double rx_bottom, double ry_bottom, double rx_top, double ry_top) { m_path.remove_all(); agg::rounded_rect rc; rc.rect(x1, y1, x2, y2); rc.radius(rx_bottom, ry_bottom, rx_top, ry_top); rc.normalize_radius(); rc.approximation_scale(worldToScreen(1.0) * g_approxScale); //m_path.add_path(rc, 0, false); m_path.concat_path(rc,0); // JME drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::ellipse(double cx, double cy, double rx, double ry) { m_path.remove_all(); agg::bezier_arc arc(cx, cy, rx, ry, 0, 2*pi()); //m_path.add_path(arc, 0, false); m_path.concat_path(arc,0); // JME m_path.close_polygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::arc(double cx, double cy, double rx, double ry, double start, double sweep) { m_path.remove_all(); agg::bezier_arc arc(cx, cy, rx, ry, start, sweep); //m_path.add_path(arc, 0, false); m_path.concat_path(arc,0); // JME drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::star(double cx, double cy, double r1, double r2, double startAngle, int numRays) { m_path.remove_all(); double da = agg::pi / double(numRays); double a = startAngle; int i; for (i = 0; i < numRays; i++) { double x = cos(a) * r2 + cx; double y = sin(a) * r2 + cy; if (i) m_path.line_to(x, y); else m_path.move_to(x, y); a += da; m_path.line_to(cos(a) * r1 + cx, sin(a) * r1 + cy); a += da; } closePolygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::curve(double x1, double y1, double x2, double y2, double x3, double y3) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.curve3(x2, y2, x3, y3); drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.curve4(x2, y2, x3, y3, x4, y4); drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::polygon(double* xy, int numPoints) { m_path.remove_all(); //m_path.add_poly(xy, numPoints); m_path.concat_poly(xy,numPoints,true); // JME, AF closePolygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::polyline(double* xy, int numPoints) { m_path.remove_all(); //m_path.add_poly(xy, numPoints); m_path.concat_poly(xy,numPoints,true); // JME, AF drawPath(StrokeOnly); } //------------------------------------------------------------------------ #ifdef AGG2D_USE_VECTORFONTS AGG2D_TEMPLATE void TAGG2D::flipText(bool flip) { m_fontEngine.flip_y(flip); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::font(const char* fontName, double height, bool bold, bool italic, FontCacheType ch, double angle) { m_textAngle = angle; m_fontHeight = height; m_fontCacheType = ch; #ifdef AGG2D_USE_FREETYPE m_fontEngine.load_font(fontName, 0, (ch == VectorFontCache) ? agg::glyph_ren_outline : agg::glyph_ren_agg_gray8); m_fontEngine.hinting(m_textHints); m_fontEngine.height((ch == VectorFontCache) ? height : worldToScreen(height)); #else m_fontEngine.hinting(m_textHints); m_fontEngine.create_font(fontName, (ch == VectorFontCache) ? agg::glyph_ren_outline : agg::glyph_ren_agg_gray8, (ch == VectorFontCache) ? height : worldToScreen(height), 0.0, bold ? 700 : 400, italic); #endif } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::fontHeight() const { return m_fontHeight; } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::fontAscent() const { return m_fontAscent; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::textAlignment(TextAlignment alignX, TextAlignment alignY) { m_textAlignX = alignX; m_textAlignY = alignY; } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::textWidth(const char* str, unsigned int len) { #if defined( UNDER_CE ) return 0; #else double x = 0; double y = 0; bool first = true; while(*str && len) { const agg::glyph_cache* glyph = m_fontCacheManager.glyph(*str); if(glyph) { if(!first) m_fontCacheManager.add_kerning(&x, &y); x += glyph->advance_x; y += glyph->advance_y; first = true; } ++str; --len; } return (m_fontCacheType == VectorFontCache) ? x : screenToWorld(x); #endif } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::textWidth(const wchar_t* str, unsigned int len) { #if defined( UNDER_CE ) return 0; #else double x = 0; double y = 0; bool first = true; while(*str && len) { const agg::glyph_cache* glyph = m_fontCacheManager.glyph(*str); if(glyph) { if(!first) m_fontCacheManager.add_kerning(&x, &y); x += glyph->advance_x; y += glyph->advance_y; first = true; } ++str; --len; } return (m_fontCacheType == VectorFontCache) ? x : screenToWorld(x); #endif } //------------------------------------------------------------------------ AGG2D_TEMPLATE bool TAGG2D::textHints() const { return m_textHints; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::textHints(bool hints) { m_textHints = hints; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::text(double x, double y, const char* str, unsigned int len, bool roundOff, double ddx, double ddy) { double dx = 0.0; double dy = 0.0; switch(m_textAlignX) { case AlignCenter: dx = -textWidth(str,len) * 0.5; break; case AlignRight: dx = -textWidth(str,len); break; default: break; } double asc = fontHeight(); const agg::glyph_cache* glyph = m_fontCacheManager.glyph('H'); if(glyph) { asc = glyph->bounds.y2 - glyph->bounds.y1; } if(m_fontCacheType == RasterFontCache) { asc = screenToWorld(asc); } switch(m_textAlignY) { case AlignCenter: dy = -asc * 0.5; break; case AlignTop: dy = -asc; break; case AlignBaseline: dy = -fontAscent(); break; default: break; } if(m_fontEngine.flip_y()) dy = -dy; agg::trans_affine mtx; double start_x = x + dx; double start_y = y + dy; if (roundOff) { start_x = int(start_x); start_y = int(start_y); } start_x += ddx; start_y += ddy; mtx *= agg::trans_affine_translation(-x, -y); mtx *= agg::trans_affine_rotation(m_textAngle); mtx *= agg::trans_affine_translation(x, y); agg::conv_transform tr(m_fontCacheManager.path_adaptor(), mtx); if(m_fontCacheType == RasterFontCache) { worldToScreen(start_x, start_y); } unsigned int i; for (i = 0; i < len && str[i]; i++) { glyph = m_fontCacheManager.glyph(str[i]); if(glyph) { if(i) m_fontCacheManager.add_kerning(&x, &y); m_fontCacheManager.init_embedded_adaptors(glyph, start_x, start_y); if(glyph->data_type == agg::glyph_data_outline) { m_path.remove_all(); m_path.concat_path(tr, 0); drawPath(); } if(glyph->data_type == agg::glyph_data_gray8) { render(m_fontCacheManager.gray8_adaptor(), m_fontCacheManager.gray8_scanline()); } start_x += glyph->advance_x; start_y += glyph->advance_y; } } } AGG2D_TEMPLATE void TAGG2D::text(double x, double y, const wchar_t* str, unsigned int len, bool roundOff, double ddx, double ddy) { double dx = 0.0; double dy = 0.0; switch(m_textAlignX) { case AlignCenter: dx = -textWidth(str,len) * 0.5; break; case AlignRight: dx = -textWidth(str,len); break; default: break; } double asc = fontHeight(); const agg::glyph_cache* glyph = m_fontCacheManager.glyph('H'); if(glyph) { asc = glyph->bounds.y2 - glyph->bounds.y1; } if(m_fontCacheType == RasterFontCache) { asc = screenToWorld(asc); } switch(m_textAlignY) { case AlignCenter: dy = -asc * 0.5; break; case AlignTop: dy = -asc; break; case AlignBaseline: dy = -fontAscent(); break; default: break; } if(m_fontEngine.flip_y()) dy = -dy; agg::trans_affine mtx; double start_x = x + dx; double start_y = y + dy; if (roundOff) { start_x = int(start_x); start_y = int(start_y); } start_x += ddx; start_y += ddy; mtx *= agg::trans_affine_translation(-x, -y); mtx *= agg::trans_affine_rotation(m_textAngle); mtx *= agg::trans_affine_translation(x, y); agg::conv_transform tr(m_fontCacheManager.path_adaptor(), mtx); if(m_fontCacheType == RasterFontCache) { worldToScreen(start_x, start_y); } unsigned int i; for (i = 0; i < len && str[i]; i++) { glyph = m_fontCacheManager.glyph(str[i]); if(glyph) { if(i) m_fontCacheManager.add_kerning(&x, &y); m_fontCacheManager.init_embedded_adaptors(glyph, start_x, start_y); if(glyph->data_type == agg::glyph_data_outline) { m_path.remove_all(); //m_path.add_path(tr, 0, false); m_path.concat_path(tr,0); // JME drawPath(); } if(glyph->data_type == agg::glyph_data_gray8) { render(m_fontCacheManager.gray8_adaptor(), m_fontCacheManager.gray8_scanline()); } start_x += glyph->advance_x; start_y += glyph->advance_y; } } } #endif //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::resetPath() { m_path.remove_all(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::moveTo(double x, double y) { m_start_x = x; m_start_y = y; m_path.move_to(x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::moveRel(double dx, double dy) { if(m_path.vertices().total_vertices()) { double x2; double y2; m_path.vertices().last_vertex(&x2, &y2); dx += x2; dy += y2; } moveTo(dx, dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineTo(double x, double y) { m_path.line_to(x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRel(double dx, double dy) { m_path.line_rel(dx, dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::horLineTo(double x) { m_path.hline_to(x); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::horLineRel(double dx) { m_path.hline_rel(dx); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::verLineTo(double y) { m_path.vline_to(y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::verLineRel(double dy) { m_path.vline_rel(dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::arcTo(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double x, double y) { m_path.arc_to(rx, ry, angle, largeArcFlag, sweepFlag, x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::arcRel(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double dx, double dy) { m_path.arc_rel(rx, ry, angle, largeArcFlag, sweepFlag, dx, dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo) { m_path.curve3(xCtrl, yCtrl, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveRel(double dxCtrl, double dyCtrl, double dxTo, double dyTo) { m_path.curve3_rel(dxCtrl, dyCtrl, dxTo, dyTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveTo(double xTo, double yTo) { m_path.curve3(xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveRel(double dxTo, double dyTo) { m_path.curve3_rel(dxTo, dyTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveTo(double xCtrl1, double yCtrl1, double xCtrl2, double yCtrl2, double xTo, double yTo) { m_path.curve4(xCtrl1, yCtrl1, xCtrl2, yCtrl2, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveRel(double dxCtrl1, double dyCtrl1, double dxCtrl2, double dyCtrl2, double dxTo, double dyTo) { m_path.curve4_rel(dxCtrl1, dyCtrl1, dxCtrl2, dyCtrl2, dxTo, dyTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo) { m_path.curve4(xCtrl2, yCtrl2, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo) { m_path.curve4_rel(xCtrl2, yCtrl2, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::addEllipse(double cx, double cy, double rx, double ry, Direction dir) { agg::bezier_arc arc(cx, cy, rx, ry, 0, (dir == CCW) ? 2*pi() : -2*pi()); //m_path.add_path(arc, 0, false); m_path.concat_path(arc,0); // JME m_path.close_polygon(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::closePolygon() { if(agg::is_vertex(m_path.vertices().last_command())) { m_path.vertices().add_vertex(m_start_x, m_start_y, agg::path_cmd_end_poly | agg::path_flags_close); } } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::imageFilter(ImageFilter f) { m_imageFilter = f; switch(f) { case NoFilter: break; case Bilinear: m_imageFilterLut.calculate(agg::image_filter_bilinear(), true); break; case Hanning: m_imageFilterLut.calculate(agg::image_filter_hanning(), true); break; case Hermite: m_imageFilterLut.calculate(agg::image_filter_hermite(), true); break; case Quadric: m_imageFilterLut.calculate(agg::image_filter_quadric(), true); break; case Bicubic: m_imageFilterLut.calculate(agg::image_filter_bicubic(), true); break; case Catrom: m_imageFilterLut.calculate(agg::image_filter_catrom(), true); break; case Spline16: m_imageFilterLut.calculate(agg::image_filter_spline16(), true); break; case Spline36: m_imageFilterLut.calculate(agg::image_filter_spline36(), true); break; case Blackman144: m_imageFilterLut.calculate(agg::image_filter_blackman144(), true); break; } } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::ImageFilter TAGG2D::imageFilter() const { return m_imageFilter; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::imageResample(ImageResample f) { m_imageResample = f; } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::ImageResample TAGG2D::imageResample() const { return m_imageResample; } //==============moved to .h file=========== //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::drawPath(DrawPathFlag flag) { m_rasterizer.reset(); switch(flag) { case FillOnly: if (m_fillColor.a) { m_rasterizer.add_path(m_pathTransform); render(true); } break; case StrokeOnly: if (m_lineColor.a && m_lineWidth > 0.0) { m_rasterizer.add_path(m_strokeTransform); render(false); } break; case FillAndStroke: if (m_fillColor.a) { m_rasterizer.add_path(m_pathTransform); render(true); } if (m_lineColor.a && m_lineWidth > 0.0) { m_rasterizer.add_path(m_strokeTransform); render(false); } break; case FillWithLineColor: if (m_lineColor.a) { m_rasterizer.add_path(m_pathTransform); render(false); } break; } } //------------------------------------------------------------------------ AGG2D_TEMPLATE_WITH_IMAGE class Agg2DRenderer { public: typedef typename TAGG2D::Color Color; typedef typename TIMAGE Image; //-------------------------------------------------------------------- template void static render(TAGG2D& gr, BaseRenderer& renBase, SolidRenderer& renSolid, bool fillColor) { // JME typedef agg::span_allocator span_allocator_type; //- typedef agg::renderer_scanline_aa RendererLinearGradient; typedef agg::renderer_scanline_aa RendererLinearGradient; //- typedef agg::renderer_scanline_aa RendererRadialGradient; typedef agg::renderer_scanline_aa RendererRadialGradient; if ((fillColor && gr.m_fillGradientFlag == TAGG2D::Linear) || (!fillColor && gr.m_lineGradientFlag == TAGG2D::Linear)) { if (fillColor) { typename TAGG2D::LinearGradientSpan span(/*gr.m_allocator, */ gr.m_fillGradientInterpolator, gr.m_linearGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); //-RendererLinearGradient ren(renBase,span); RendererLinearGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } else { typename TAGG2D::LinearGradientSpan span(/*gr.m_allocator,*/ gr.m_lineGradientInterpolator, gr.m_linearGradientFunction, gr.m_lineGradient, gr.m_lineGradientD1, gr.m_lineGradientD2); //- RendererLinearGradient ren(renBase, span); RendererLinearGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } } else { if ((fillColor && gr.m_fillGradientFlag == TAGG2D::Radial) || (!fillColor && gr.m_lineGradientFlag == TAGG2D::Radial)) { if (fillColor) { typename TAGG2D::RadialGradientSpan span(/*gr.m_allocator, */ gr.m_fillGradientInterpolator, gr.m_radialGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); //-RendererRadialGradient ren(renBase, span); RendererRadialGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } else { typename TAGG2D::RadialGradientSpan span(/*gr.m_allocator,*/ gr.m_lineGradientInterpolator, gr.m_radialGradientFunction, gr.m_lineGradient, gr.m_lineGradientD1, gr.m_lineGradientD2); //-RendererRadialGradient ren(renBase, span); RendererRadialGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } } else { renSolid.color(fillColor ? gr.m_fillColor : gr.m_lineColor); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, renSolid); } } } //-------------------------------------------------------------------- class SpanConvImageBlend { public: SpanConvImageBlend(Agg2DBase::BlendMode m, Color c) : m_mode(m), m_color(c) {} void convert(Color* span, int x, int y, unsigned len) const { unsigned l2; typename TAGG2D::Color* s2; if(m_mode != TAGG2D::BlendDst) { l2 = len; s2 = span; typedef agg::comp_op_adaptor_clip_to_dst_rgba_pre OpType; do { OpType::blend_pix(m_mode, (typename TAGG2D::Color::value_type*)s2, m_color.r, m_color.g, m_color.b, TAGG2D::Color::base_mask, agg::cover_full); ++s2; } while(--l2); } if(m_color.a < TAGG2D::Color::base_mask) { l2 = len; s2 = span; unsigned a = m_color.a; do { s2->r = (s2->r * a) >> TAGG2D::Color::base_shift; s2->g = (s2->g * a) >> TAGG2D::Color::base_shift; s2->b = (s2->b * a) >> TAGG2D::Color::base_shift; s2->a = (s2->a * a) >> TAGG2D::Color::base_shift; ++s2; } while(--l2); } } private: Agg2DBase::BlendMode m_mode; Color m_color; }; //-------------------------------------------------------------------- template void static render(TAGG2D& gr, BaseRenderer& renBase, SolidRenderer& renSolid, Rasterizer& ras, Scanline& sl) { // JME typedef agg::span_allocator span_allocator_type; typedef agg::renderer_scanline_aa RendererLinearGradient; typedef agg::renderer_scanline_aa RendererRadialGradient; if(gr.m_fillGradientFlag == TAGG2D::Linear) { typename TAGG2D::LinearGradientSpan span( gr.m_fillGradientInterpolator, gr.m_linearGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); RendererLinearGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(ras, sl, ren); } else { if(gr.m_fillGradientFlag == TAGG2D::Radial) { typename TAGG2D::RadialGradientSpan span( gr.m_fillGradientInterpolator, gr.m_radialGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); RendererRadialGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(ras, sl, ren); } else { renSolid.color(gr.m_fillColor); agg::render_scanlines(ras, sl, renSolid); } } } //-------------------------------------------------------------------- //! JME - this is where the bulk of the changes have taken place. template static void renderImage(TAGG2D& gr, const TIMAGE& img, BaseRenderer& renBase, Interpolator& interpolator) { //! JME - have not quite figured which part of this is not const-correct // hence the cast. Image& imgc = const_cast(img); typename ImagePixFormatSet::PixFormat img_pixf(imgc.renBuf); typedef agg::image_accessor_clone img_source_type; img_source_type source(img_pixf); SpanConvImageBlend blend(gr.m_imageBlendMode, gr.m_imageBlendColor); if(gr.m_imageFilter == TAGG2D::NoFilter) { //original way typedef agg::span_image_filter_rgba_nn SpanGenType; typedef agg::renderer_scanline_aa RendererType; SpanGenType sg(source,interpolator); RendererType ri(renBase,gr.m_allocator,sg); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); //our way, using our own span generator to support 555 //but, it isnt working yet //typedef ImagePixFormatSet::SpanGenerator SpanGenType; //typedef agg::renderer_scanline_aa RendererType; //SpanGenType sg(imgc.renBuf); //RendererType ri(renBase,gr.m_allocator,sg); //agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); } //else // { // bool resample = (gr.m_imageResample == TAGG2D::ResampleAlways); // if(gr.m_imageResample == TAGG2D::ResampleOnZoomOut) // { // double sx, sy; // interpolator.transformer().scaling_abs(&sx, &sy); // if (sx > 1.125 || sy > 1.125) // { // resample = true; // } // } // if(resample) // { // typedef agg::span_image_resample_rgba_affine SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator,gr.m_imageFilterLut); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // else // { //// this is the AGG2D default // if(gr.m_imageFilter == TAGG2D::Bilinear) // { // typedef agg::span_image_filter_rgba_bilinear SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // else // { // if(gr.m_imageFilterLut.diameter() == 2) // { // typedef agg::span_image_filter_rgba_2x2 SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator,gr.m_imageFilterLut); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // else // { // typedef agg::span_image_filter_rgba SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator,gr.m_imageFilterLut); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // } // } // } } }; //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::render(bool fillColor) { if(m_blendMode == BlendAlpha) { TAGG2DRENDERER::render(*this, m_renBase, m_renSolid, fillColor); } else { TAGG2DRENDERER::render(*this, m_renBaseComp, m_renSolidComp, fillColor); } } #ifdef AGG2D_USE_VECTORFONTS #if !defined( UNDER_CE ) //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::render(FontRasterizer& ras, FontScanline& sl) { if(m_blendMode == BlendAlpha) { Agg2DRenderer::render(*this, m_renBase, m_renSolid, ras, sl); } else { Agg2DRenderer::render(*this, m_renBaseComp, m_renSolidComp, ras, sl); } } #endif #endif //------------------------------------------------------------------------ struct Agg2DRasterizerGamma { Agg2DRasterizerGamma(double alpha, double gamma) : m_alpha(alpha), m_gamma(gamma) {} double operator() (double x) const { return m_alpha(m_gamma(x)); } agg::gamma_multiply m_alpha; agg::gamma_power m_gamma; }; //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::updateRasterizerGamma() { m_rasterizer.gamma(Agg2DRasterizerGamma(m_masterAlpha, m_antiAliasGamma)); } desmume-0.9.11/src/matrix.cpp0000755000000000000000000003465712467662066014577 0ustar rootroot/* Copyright (C) 2006-2007 shash Copyright (C) 2007-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include #include #include "matrix.h" #include "MMU.h" void _NOSSE_MatrixMultVec4x4 (const float *matrix, float *vecPtr) { float x = vecPtr[0]; float y = vecPtr[1]; float z = vecPtr[2]; float w = vecPtr[3]; vecPtr[0] = x * matrix[0] + y * matrix[4] + z * matrix[ 8] + w * matrix[12]; vecPtr[1] = x * matrix[1] + y * matrix[5] + z * matrix[ 9] + w * matrix[13]; vecPtr[2] = x * matrix[2] + y * matrix[6] + z * matrix[10] + w * matrix[14]; vecPtr[3] = x * matrix[3] + y * matrix[7] + z * matrix[11] + w * matrix[15]; } void MatrixMultVec4x4 (const s32 *matrix, s32 *vecPtr) { const s32 x = vecPtr[0]; const s32 y = vecPtr[1]; const s32 z = vecPtr[2]; const s32 w = vecPtr[3]; vecPtr[0] = fx32_shiftdown(fx32_mul(x,matrix[0]) + fx32_mul(y,matrix[4]) + fx32_mul(z,matrix [8]) + fx32_mul(w,matrix[12])); vecPtr[1] = fx32_shiftdown(fx32_mul(x,matrix[1]) + fx32_mul(y,matrix[5]) + fx32_mul(z,matrix[ 9]) + fx32_mul(w,matrix[13])); vecPtr[2] = fx32_shiftdown(fx32_mul(x,matrix[2]) + fx32_mul(y,matrix[6]) + fx32_mul(z,matrix[10]) + fx32_mul(w,matrix[14])); vecPtr[3] = fx32_shiftdown(fx32_mul(x,matrix[3]) + fx32_mul(y,matrix[7]) + fx32_mul(z,matrix[11]) + fx32_mul(w,matrix[15])); } void MatrixMultVec3x3_fixed(const s32 *matrix, s32 *vecPtr) { const s32 x = vecPtr[0]; const s32 y = vecPtr[1]; const s32 z = vecPtr[2]; vecPtr[0] = fx32_shiftdown(fx32_mul(x,matrix[0]) + fx32_mul(y,matrix[4]) + fx32_mul(z,matrix[8])); vecPtr[1] = fx32_shiftdown(fx32_mul(x,matrix[1]) + fx32_mul(y,matrix[5]) + fx32_mul(z,matrix[9])); vecPtr[2] = fx32_shiftdown(fx32_mul(x,matrix[2]) + fx32_mul(y,matrix[6]) + fx32_mul(z,matrix[10])); } //------------------------- //switched SSE functions: implementations for no SSE #ifndef ENABLE_SSE void MatrixMultVec4x4 (const float *matrix, float *vecPtr) { _NOSSE_MatrixMultVec4x4(matrix, vecPtr); } void MatrixMultVec3x3 (const float *matrix, float *vecPtr) { float x = vecPtr[0]; float y = vecPtr[1]; float z = vecPtr[2]; vecPtr[0] = x * matrix[0] + y * matrix[4] + z * matrix[ 8]; vecPtr[1] = x * matrix[1] + y * matrix[5] + z * matrix[ 9]; vecPtr[2] = x * matrix[2] + y * matrix[6] + z * matrix[10]; } void MatrixMultiply (float *matrix, const float *rightMatrix) { float tmpMatrix[16]; tmpMatrix[0] = (matrix[0]*rightMatrix[0])+(matrix[4]*rightMatrix[1])+(matrix[8]*rightMatrix[2])+(matrix[12]*rightMatrix[3]); tmpMatrix[1] = (matrix[1]*rightMatrix[0])+(matrix[5]*rightMatrix[1])+(matrix[9]*rightMatrix[2])+(matrix[13]*rightMatrix[3]); tmpMatrix[2] = (matrix[2]*rightMatrix[0])+(matrix[6]*rightMatrix[1])+(matrix[10]*rightMatrix[2])+(matrix[14]*rightMatrix[3]); tmpMatrix[3] = (matrix[3]*rightMatrix[0])+(matrix[7]*rightMatrix[1])+(matrix[11]*rightMatrix[2])+(matrix[15]*rightMatrix[3]); tmpMatrix[4] = (matrix[0]*rightMatrix[4])+(matrix[4]*rightMatrix[5])+(matrix[8]*rightMatrix[6])+(matrix[12]*rightMatrix[7]); tmpMatrix[5] = (matrix[1]*rightMatrix[4])+(matrix[5]*rightMatrix[5])+(matrix[9]*rightMatrix[6])+(matrix[13]*rightMatrix[7]); tmpMatrix[6] = (matrix[2]*rightMatrix[4])+(matrix[6]*rightMatrix[5])+(matrix[10]*rightMatrix[6])+(matrix[14]*rightMatrix[7]); tmpMatrix[7] = (matrix[3]*rightMatrix[4])+(matrix[7]*rightMatrix[5])+(matrix[11]*rightMatrix[6])+(matrix[15]*rightMatrix[7]); tmpMatrix[8] = (matrix[0]*rightMatrix[8])+(matrix[4]*rightMatrix[9])+(matrix[8]*rightMatrix[10])+(matrix[12]*rightMatrix[11]); tmpMatrix[9] = (matrix[1]*rightMatrix[8])+(matrix[5]*rightMatrix[9])+(matrix[9]*rightMatrix[10])+(matrix[13]*rightMatrix[11]); tmpMatrix[10] = (matrix[2]*rightMatrix[8])+(matrix[6]*rightMatrix[9])+(matrix[10]*rightMatrix[10])+(matrix[14]*rightMatrix[11]); tmpMatrix[11] = (matrix[3]*rightMatrix[8])+(matrix[7]*rightMatrix[9])+(matrix[11]*rightMatrix[10])+(matrix[15]*rightMatrix[11]); tmpMatrix[12] = (matrix[0]*rightMatrix[12])+(matrix[4]*rightMatrix[13])+(matrix[8]*rightMatrix[14])+(matrix[12]*rightMatrix[15]); tmpMatrix[13] = (matrix[1]*rightMatrix[12])+(matrix[5]*rightMatrix[13])+(matrix[9]*rightMatrix[14])+(matrix[13]*rightMatrix[15]); tmpMatrix[14] = (matrix[2]*rightMatrix[12])+(matrix[6]*rightMatrix[13])+(matrix[10]*rightMatrix[14])+(matrix[14]*rightMatrix[15]); tmpMatrix[15] = (matrix[3]*rightMatrix[12])+(matrix[7]*rightMatrix[13])+(matrix[11]*rightMatrix[14])+(matrix[15]*rightMatrix[15]); memcpy (matrix, tmpMatrix, sizeof(float)*16); } void MatrixTranslate (float *matrix, const float *ptr) { matrix[12] += (matrix[0]*ptr[0])+(matrix[4]*ptr[1])+(matrix[ 8]*ptr[2]); matrix[13] += (matrix[1]*ptr[0])+(matrix[5]*ptr[1])+(matrix[ 9]*ptr[2]); matrix[14] += (matrix[2]*ptr[0])+(matrix[6]*ptr[1])+(matrix[10]*ptr[2]); matrix[15] += (matrix[3]*ptr[0])+(matrix[7]*ptr[1])+(matrix[11]*ptr[2]); } void MatrixScale (float *matrix, const float *ptr) { matrix[0] *= ptr[0]; matrix[1] *= ptr[0]; matrix[2] *= ptr[0]; matrix[3] *= ptr[0]; matrix[4] *= ptr[1]; matrix[5] *= ptr[1]; matrix[6] *= ptr[1]; matrix[7] *= ptr[1]; matrix[8] *= ptr[2]; matrix[9] *= ptr[2]; matrix[10] *= ptr[2]; matrix[11] *= ptr[2]; } #endif //switched c/asm functions //----------------------------------------- void MatrixInit (s32 *matrix) { memset (matrix, 0, sizeof(s32)*16); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1<<12; } void MatrixInit (float *matrix) { memset (matrix, 0, sizeof(s32)*16); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.f; } void MatrixIdentity (s32 *matrix) { matrix[1] = matrix[2] = matrix[3] = matrix[4] = 0; matrix[6] = matrix[7] = matrix[8] = matrix[9] = 0; matrix[11] = matrix[12] = matrix[13] = matrix[14] = 0; matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1<<12; } s32 MatrixGetMultipliedIndex (int index, s32 *matrix, s32 *rightMatrix) { int iMod = index%4, iDiv = (index>>2)<<2; s64 temp = ((s64)matrix[iMod ]*rightMatrix[iDiv ])+((s64)matrix[iMod+ 4]*rightMatrix[iDiv+1])+ ((s64)matrix[iMod+8]*rightMatrix[iDiv+2])+((s64)matrix[iMod+12]*rightMatrix[iDiv+3]); return (s32)(temp>>12); } void MatrixSet (s32 *matrix, int x, int y, s32 value) { matrix [x+(y<<2)] = value; } void MatrixCopy (float* matrixDST, const float* matrixSRC) { matrixDST[0] = matrixSRC[0]; matrixDST[1] = matrixSRC[1]; matrixDST[2] = matrixSRC[2]; matrixDST[3] = matrixSRC[3]; matrixDST[4] = matrixSRC[4]; matrixDST[5] = matrixSRC[5]; matrixDST[6] = matrixSRC[6]; matrixDST[7] = matrixSRC[7]; matrixDST[8] = matrixSRC[8]; matrixDST[9] = matrixSRC[9]; matrixDST[10] = matrixSRC[10]; matrixDST[11] = matrixSRC[11]; matrixDST[12] = matrixSRC[12]; matrixDST[13] = matrixSRC[13]; matrixDST[14] = matrixSRC[14]; matrixDST[15] = matrixSRC[15]; } void MatrixCopy (s32* matrixDST, const s32* matrixSRC) { memcpy(matrixDST,matrixSRC,sizeof(s32)*16); } int MatrixCompare (const s32* matrixDST, const s32* matrixSRC) { return memcmp((void*)matrixDST, matrixSRC, sizeof(s32)*16); } void MatrixStackInit(MatrixStack *stack) { for (int i = 0; i < stack->size; i++) { MatrixInit(&stack->matrix[i*16]); } stack->position = 0; } void MatrixStackSetMaxSize (MatrixStack *stack, int size) { int i; stack->size = (size + 1); if (stack->matrix != NULL) { free (stack->matrix); } stack->matrix = new s32[stack->size*16*sizeof(s32)]; for (i = 0; i < stack->size; i++) { MatrixInit (&stack->matrix[i*16]); } stack->size--; } MatrixStack::MatrixStack(int size, int type) { MatrixStackSetMaxSize(this,size); this->type = type; } static void MatrixStackSetStackPosition (MatrixStack *stack, int pos) { stack->position += pos; if((stack->position < 0) || (stack->position > stack->size)) MMU_new.gxstat.se = 1; //once upon a time, we tried clamping to the size. //this utterly broke sims 2 apartment pets. //changing to wrap around made it work perfectly stack->position = ((u32)stack->position) & stack->size; } void MatrixStackPushMatrix (MatrixStack *stack, const s32 *ptr) { //printf("Push %i pos %i\n", stack->type, stack->position); if ((stack->type == 0) || (stack->type == 3)) MatrixCopy (&stack->matrix[0], ptr); else MatrixCopy (&stack->matrix[stack->position*16], ptr); MatrixStackSetStackPosition (stack, 1); } void MatrixStackPopMatrix (s32 *mtxCurr, MatrixStack *stack, int size) { //printf("Pop %i pos %i (change %d)\n", stack->type, stack->position, -size); MatrixStackSetStackPosition(stack, -size); if ((stack->type == 0) || (stack->type == 3)) MatrixCopy (mtxCurr, &stack->matrix[0]); else MatrixCopy (mtxCurr, &stack->matrix[stack->position*16]); } s32 * MatrixStackGetPos (MatrixStack *stack, int pos) { assert(pos<31); return &stack->matrix[pos*16]; } s32 * MatrixStackGet (MatrixStack *stack) { return &stack->matrix[stack->position*16]; } void MatrixStackLoadMatrix (MatrixStack *stack, int pos, const s32 *ptr) { assert(pos<31); MatrixCopy (&stack->matrix[pos*16], ptr); } void Vector2Copy(float *dst, const float *src) { dst[0] = src[0]; dst[1] = src[1]; } void Vector2Add(float *dst, const float *src) { dst[0] += src[0]; dst[1] += src[1]; } void Vector2Subtract(float *dst, const float *src) { dst[0] -= src[0]; dst[1] -= src[1]; } float Vector2Dot(const float *a, const float *b) { return (a[0]*b[0]) + (a[1]*b[1]); } /* http://www.gamedev.net/community/forums/topic.asp?topic_id=289972 */ float Vector2Cross(const float *a, const float *b) { return (a[0]*b[1]) - (a[1]*b[0]); } float Vector3Dot(const float *a, const float *b) { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; } void Vector3Cross(float* dst, const float *a, const float *b) { dst[0] = a[1]*b[2] - a[2]*b[1]; dst[1] = a[2]*b[0] - a[0]*b[2]; dst[2] = a[0]*b[1] - a[1]*b[0]; } float Vector3Length(const float *a) { float lengthSquared = Vector3Dot(a,a); float length = sqrt(lengthSquared); return length; } void Vector3Add(float *dst, const float *src) { dst[0] += src[0]; dst[1] += src[1]; dst[2] += src[2]; } void Vector3Subtract(float *dst, const float *src) { dst[0] -= src[0]; dst[1] -= src[1]; dst[2] -= src[2]; } void Vector3Scale(float *dst, const float scale) { dst[0] *= scale; dst[1] *= scale; dst[2] *= scale; } void Vector3Copy(float *dst, const float *src) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; } void Vector3Normalize(float *dst) { float length = Vector3Length(dst); Vector3Scale(dst,1.0f/length); } void Vector4Copy(float *dst, const float *src) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst[3] = src[3]; } void MatrixMultiply (s32 *matrix, const s32 *rightMatrix) { s32 tmpMatrix[16]; tmpMatrix[0] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[0])+fx32_mul(matrix[4],rightMatrix[1])+fx32_mul(matrix[8],rightMatrix[2])+fx32_mul(matrix[12],rightMatrix[3])); tmpMatrix[1] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[0])+fx32_mul(matrix[5],rightMatrix[1])+fx32_mul(matrix[9],rightMatrix[2])+fx32_mul(matrix[13],rightMatrix[3])); tmpMatrix[2] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[0])+fx32_mul(matrix[6],rightMatrix[1])+fx32_mul(matrix[10],rightMatrix[2])+fx32_mul(matrix[14],rightMatrix[3])); tmpMatrix[3] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[0])+fx32_mul(matrix[7],rightMatrix[1])+fx32_mul(matrix[11],rightMatrix[2])+fx32_mul(matrix[15],rightMatrix[3])); tmpMatrix[4] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[4])+fx32_mul(matrix[4],rightMatrix[5])+fx32_mul(matrix[8],rightMatrix[6])+fx32_mul(matrix[12],rightMatrix[7])); tmpMatrix[5] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[4])+fx32_mul(matrix[5],rightMatrix[5])+fx32_mul(matrix[9],rightMatrix[6])+fx32_mul(matrix[13],rightMatrix[7])); tmpMatrix[6] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[4])+fx32_mul(matrix[6],rightMatrix[5])+fx32_mul(matrix[10],rightMatrix[6])+fx32_mul(matrix[14],rightMatrix[7])); tmpMatrix[7] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[4])+fx32_mul(matrix[7],rightMatrix[5])+fx32_mul(matrix[11],rightMatrix[6])+fx32_mul(matrix[15],rightMatrix[7])); tmpMatrix[8] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[8])+fx32_mul(matrix[4],rightMatrix[9])+fx32_mul(matrix[8],rightMatrix[10])+fx32_mul(matrix[12],rightMatrix[11])); tmpMatrix[9] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[8])+fx32_mul(matrix[5],rightMatrix[9])+fx32_mul(matrix[9],rightMatrix[10])+fx32_mul(matrix[13],rightMatrix[11])); tmpMatrix[10] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[8])+fx32_mul(matrix[6],rightMatrix[9])+fx32_mul(matrix[10],rightMatrix[10])+fx32_mul(matrix[14],rightMatrix[11])); tmpMatrix[11] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[8])+fx32_mul(matrix[7],rightMatrix[9])+fx32_mul(matrix[11],rightMatrix[10])+fx32_mul(matrix[15],rightMatrix[11])); tmpMatrix[12] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[12])+fx32_mul(matrix[4],rightMatrix[13])+fx32_mul(matrix[8],rightMatrix[14])+fx32_mul(matrix[12],rightMatrix[15])); tmpMatrix[13] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[12])+fx32_mul(matrix[5],rightMatrix[13])+fx32_mul(matrix[9],rightMatrix[14])+fx32_mul(matrix[13],rightMatrix[15])); tmpMatrix[14] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[12])+fx32_mul(matrix[6],rightMatrix[13])+fx32_mul(matrix[10],rightMatrix[14])+fx32_mul(matrix[14],rightMatrix[15])); tmpMatrix[15] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[12])+fx32_mul(matrix[7],rightMatrix[13])+fx32_mul(matrix[11],rightMatrix[14])+fx32_mul(matrix[15],rightMatrix[15])); memcpy(matrix,tmpMatrix,sizeof(s32)*16); } void MatrixScale(s32 *matrix, const s32 *ptr) { //zero 21-sep-2010 - verified unrolling seems faster on my cpu MACRODO_N(12, matrix[X] = fx32_shiftdown(fx32_mul(matrix[X],ptr[X>>2])) ); } void MatrixTranslate(s32 *matrix, const s32 *ptr) { MACRODO_N(4, { s64 temp = fx32_shiftup(matrix[X+12]); temp += fx32_mul(matrix[X+0],ptr[0]); temp += fx32_mul(matrix[X+4],ptr[1]); temp += fx32_mul(matrix[X+8],ptr[2]); matrix[X+12] = fx32_shiftdown(temp); }); } void MatrixMultVec4x4_M2(const s32 *matrix, s32 *vecPtr) { MatrixMultVec4x4(matrix+16,vecPtr); MatrixMultVec4x4(matrix,vecPtr); } desmume-0.9.11/src/instructions.h0000755000000000000000000000202612467662066015465 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _INSTRUCIONS_H_ #define _INSTRUCIONS_H_ #include "types.h" typedef u32 (FASTCALL* OpFunc)(const u32 i); extern const OpFunc arm_instructions_set[2][4096]; extern const char* arm_instruction_names[4096]; extern const OpFunc thumb_instructions_set[2][1024]; extern const char* thumb_instruction_names[1024]; #endif desmume-0.9.11/src/slot1.h0000755000000000000000000001055312467662066013767 0ustar rootroot/* Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef __SLOT1_H__ #define __SLOT1_H__ #include #include "types.h" #include "MMU.h" class EMUFILE; class Slot1Info { public: virtual const char* name() const = 0; virtual const char* descr()const = 0; virtual const u8 id() const = 0; }; class Slot1InfoSimple : public Slot1Info { public: Slot1InfoSimple(const char* _name, const char* _descr, const u8 _id) : mName(_name) , mDescr(_descr) , mID(_id) { } virtual const char* name() const { return mName; } virtual const char* descr() const { return mDescr; } virtual const u8 id() const { return mID; } private: const char* mName, *mDescr; const u8 mID; }; class ISlot1Interface { public: //called to get info about device (description) virtual Slot1Info const* info() = 0; //called once when the emulator starts up, or when the device springs into existence virtual bool init() { return true; } //called when the emulator connects the device virtual void connect() { } //called when the emulator disconnects the device virtual void disconnect() { } //called when the emulator shuts down, or when the device disappears from existence virtual void shutdown() { } //called then the cpu begins a new command/block on the GC bus virtual void write_command(u8 PROCNUM, GC_Command command) { } //called when the cpu writes to the GC bus virtual void write_GCDATAIN(u8 PROCNUM, u32 val) { } //called when the cpu reads from the GC bus virtual u32 read_GCDATAIN(u8 PROCNUM) { return 0xFFFFFFFF; } //transfers a byte to the slot-1 device via auxspi, and returns the incoming byte //cpu is provided for diagnostic purposes only.. the slot-1 device wouldn't know which CPU it is. virtual u8 auxspi_transaction(int PROCNUM, u8 value) { return 0x00; } //called when the auxspi burst is ended (SPI chipselect in is going low) virtual void auxspi_reset(int PROCNUM) {} //called when NDS_FakeBoot terminates, emulate in here the BIOS behaviour virtual void post_fakeboot(int PROCNUM) {} virtual void savestate(EMUFILE* os) {} virtual void loadstate(EMUFILE* is) {} }; typedef ISlot1Interface* TISlot1InterfaceConstructor(); enum NDS_SLOT1_TYPE { NDS_SLOT1_NONE, // 0xFF - None NDS_SLOT1_RETAIL_AUTO, // 0xFE - autodetect which kind of retail card to use NDS_SLOT1_R4, // 0x03 - R4 flash card NDS_SLOT1_RETAIL_NAND, // 0x02 - Made in Ore/WarioWare D.I.Y. NDS_SLOT1_RETAIL_MCROM, // 0x01 - a standard MC (eeprom, flash, fram) -bearing retail card. Also supports motion, for now, because that's the way we originally coded it NDS_SLOT1_RETAIL_DEBUG, // 0x04 - for romhacking and fan-made translations NDS_SLOT1_COUNT //use to count addons - MUST BE LAST!!! }; extern ISlot1Interface* slot1_device; //the current slot1 device instance extern ISlot1Interface* slot1_List[NDS_SLOT1_COUNT]; extern NDS_SLOT1_TYPE slot1_selected_type; void slot1_Init(); bool slot1_Connect(); void slot1_Disconnect(); void slot1_Shutdown(); void slot1_Savestate(EMUFILE* os); void slot1_Loadstate(EMUFILE* is); //just disconnects and reconnects the device. ideally, the disconnection and connection would be called with sensible timing void slot1_Reset(); bool slot1_getTypeByID(u8 ID, NDS_SLOT1_TYPE &type); //change the current device bool slot1_Change(NDS_SLOT1_TYPE type); //change the current device by ID bool slot1_ChangeByID(u8 ID); //check on the current device NDS_SLOT1_TYPE slot1_GetCurrentType(); NDS_SLOT1_TYPE slot1_GetSelectedType(); extern bool slot1_R4_path_type; void slot1_SetFatDir(const std::string& dir, bool sameAsRom = false); std::string slot1_GetFatDir(); EMUFILE* slot1_GetFatImage(); #endif //__SLOT1_H__ desmume-0.9.11/src/SPU.cpp0000755000000000000000000015473112467662066013736 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006 Theo Berkau Copyright (C) 2008-2015 DeSmuME team Ideas borrowed from Stephane Dallongeville's SCSP core This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #define _USE_MATH_DEFINES #include #ifndef M_PI #define M_PI 3.1415926535897932386 #endif #include #include #include #include #include "debug.h" #include "driver.h" #include "MMU.h" #include "SPU.h" #include "mem.h" #include "readwrite.h" #include "armcpu.h" #include "NDSSystem.h" #include "matrix.h" static inline s16 read16(u32 addr) { return (s16)_MMU_read16(addr); } static inline u8 read08(u32 addr) { return _MMU_read08(addr); } static inline s8 read_s8(u32 addr) { return (s8)_MMU_read08(addr); } #define K_ADPCM_LOOPING_RECOVERY_INDEX 99999 #define COSINE_INTERPOLATION_RESOLUTION 8192 //#ifdef FASTBUILD #undef FORCEINLINE #define FORCEINLINE //#endif //static ISynchronizingAudioBuffer* synchronizer = metaspu_construct(ESynchMethod_Z); static ISynchronizingAudioBuffer* synchronizer = metaspu_construct(ESynchMethod_N); SPU_struct *SPU_core = 0; SPU_struct *SPU_user = 0; int SPU_currentCoreNum = SNDCORE_DUMMY; static int volume = 100; static size_t buffersize = 0; static ESynchMode synchmode = ESynchMode_DualSynchAsynch; static ESynchMethod synchmethod = ESynchMethod_N; static int SNDCoreId=-1; static SoundInterface_struct *SNDCore=NULL; extern SoundInterface_struct *SNDCoreList[]; //const int shift = (FORMAT == 0 ? 2 : 1); static const int format_shift[] = { 2, 1, 3, 0 }; static const u8 volume_shift[] = { 0, 1, 2, 4 }; static const s8 indextbl[8] = { -1, -1, -1, -1, 2, 4, 6, 8 }; static const u16 adpcmtbl[89] = { 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x0010, 0x0011, 0x0013, 0x0015, 0x0017, 0x0019, 0x001C, 0x001F, 0x0022, 0x0025, 0x0029, 0x002D, 0x0032, 0x0037, 0x003C, 0x0042, 0x0049, 0x0050, 0x0058, 0x0061, 0x006B, 0x0076, 0x0082, 0x008F, 0x009D, 0x00AD, 0x00BE, 0x00D1, 0x00E6, 0x00FD, 0x0117, 0x0133, 0x0151, 0x0173, 0x0198, 0x01C1, 0x01EE, 0x0220, 0x0256, 0x0292, 0x02D4, 0x031C, 0x036C, 0x03C3, 0x0424, 0x048E, 0x0502, 0x0583, 0x0610, 0x06AB, 0x0756, 0x0812, 0x08E0, 0x09C3, 0x0ABD, 0x0BD0, 0x0CFF, 0x0E4C, 0x0FBA, 0x114C, 0x1307, 0x14EE, 0x1706, 0x1954, 0x1BDC, 0x1EA5, 0x21B6, 0x2515, 0x28CA, 0x2CDF, 0x315B, 0x364B, 0x3BB9, 0x41B2, 0x4844, 0x4F7E, 0x5771, 0x602F, 0x69CE, 0x7462, 0x7FFF }; static const s16 wavedutytbl[8][8] = { { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF } }; static s32 precalcdifftbl[89][16]; static u8 precalcindextbl[89][8]; static double cos_lut[COSINE_INTERPOLATION_RESOLUTION]; static const double ARM7_CLOCK = 33513982; static const double samples_per_hline = (DESMUME_SAMPLE_RATE / 59.8261f) / 263.0f; static double samples = 0; template static FORCEINLINE T MinMax(T val, T min, T max) { if (val < min) return min; else if (val > max) return max; return val; } //--------------external spu interface--------------- int SPU_ChangeSoundCore(int coreid, int buffersize) { int i; ::buffersize = buffersize; delete SPU_user; SPU_user = NULL; // Make sure the old core is freed if (SNDCore) SNDCore->DeInit(); // So which core do we want? if (coreid == SNDCORE_DEFAULT) coreid = 0; // Assume we want the first one SPU_currentCoreNum = coreid; // Go through core list and find the id for (i = 0; SNDCoreList[i] != NULL; i++) { if (SNDCoreList[i]->id == coreid) { // Set to current core SNDCore = SNDCoreList[i]; break; } } SNDCoreId = coreid; //If the user picked the dummy core, disable the user spu if(SNDCore == &SNDDummy) return 0; //If the core wasnt found in the list for some reason, disable the user spu if (SNDCore == NULL) return -1; // Since it failed, instead of it being fatal, disable the user spu if (SNDCore->Init(buffersize * 2) == -1) { SNDCore = 0; return -1; } SNDCore->SetVolume(volume); SPU_SetSynchMode(synchmode,synchmethod); return 0; } SoundInterface_struct *SPU_SoundCore() { return SNDCore; } void SPU_ReInit(bool fakeBoot) { SPU_Init(SNDCoreId, buffersize); // Firmware set BIAS to 0x200 if (fakeBoot) SPU_WriteWord(0x04000504, 0x0200); } int SPU_Init(int coreid, int buffersize) { int i, j; // Build the cosine interpolation LUT for(unsigned int i = 0; i < COSINE_INTERPOLATION_RESOLUTION; i++) cos_lut[i] = (1.0 - cos(((double)i/(double)COSINE_INTERPOLATION_RESOLUTION) * M_PI)) * 0.5; SPU_core = new SPU_struct((int)ceil(samples_per_hline)); SPU_Reset(); //create adpcm decode accelerator lookups for(i = 0; i < 16; i++) { for(j = 0; j < 89; j++) { precalcdifftbl[j][i] = (((i & 0x7) * 2 + 1) * adpcmtbl[j] / 8); if(i & 0x8) precalcdifftbl[j][i] = -precalcdifftbl[j][i]; } } for(i = 0; i < 8; i++) { for(j = 0; j < 89; j++) { precalcindextbl[j][i] = MinMax((j + indextbl[i]), 0, 88); } } SPU_SetSynchMode(CommonSettings.SPU_sync_mode, CommonSettings.SPU_sync_method); return SPU_ChangeSoundCore(coreid, buffersize); } void SPU_Pause(int pause) { if (SNDCore == NULL) return; if(pause) SNDCore->MuteAudio(); else SNDCore->UnMuteAudio(); } void SPU_CloneUser() { if(SPU_user) { memcpy(SPU_user->channels,SPU_core->channels,sizeof(SPU_core->channels)); SPU_user->regs = SPU_core->regs; } } void SPU_SetSynchMode(int mode, int method) { synchmode = (ESynchMode)mode; if(synchmethod != (ESynchMethod)method) { synchmethod = (ESynchMethod)method; delete synchronizer; //grr does this need to be locked? spu might need a lock method // or maybe not, maybe the platform-specific code that calls this function can deal with it. synchronizer = metaspu_construct(synchmethod); } delete SPU_user; SPU_user = NULL; if(synchmode == ESynchMode_DualSynchAsynch) { SPU_user = new SPU_struct(buffersize); SPU_CloneUser(); } } void SPU_ClearOutputBuffer() { if(SNDCore && SNDCore->ClearBuffer) SNDCore->ClearBuffer(); } void SPU_SetVolume(int volume) { ::volume = volume; if (SNDCore) SNDCore->SetVolume(volume); } void SPU_Reset(void) { int i; SPU_core->reset(); if(SPU_user) { if(SNDCore) { SNDCore->DeInit(); SNDCore->Init(SPU_user->bufsize*2); SNDCore->SetVolume(volume); } SPU_user->reset(); } //zero - 09-apr-2010: this concerns me, regarding savestate synch. //After 0.9.6, lets experiment with removing it and just properly zapping the spu instead // Reset Registers for (i = 0x400; i < 0x51D; i++) T1WriteByte(MMU.ARM7_REG, i, 0); samples = 0; } //------------------------------------------ void SPU_struct::reset() { memset(sndbuf,0,bufsize*2*4); memset(outbuf,0,bufsize*2*2); memset((void *)channels, 0, sizeof(channel_struct) * 16); reconstruct(®s); for(int i = 0; i < 16; i++) { channels[i].num = i; } } SPU_struct::SPU_struct(int buffersize) : bufpos(0) , buflength(0) , sndbuf(0) , outbuf(0) , bufsize(buffersize) { sndbuf = new s32[buffersize*2]; outbuf = new s16[buffersize*2]; reset(); } SPU_struct::~SPU_struct() { if(sndbuf) delete[] sndbuf; if(outbuf) delete[] outbuf; } void SPU_DeInit(void) { if(SNDCore) SNDCore->DeInit(); SNDCore = 0; delete SPU_core; SPU_core=0; delete SPU_user; SPU_user=0; } ////////////////////////////////////////////////////////////////////////////// void SPU_struct::ShutUp() { for(int i=0;i<16;i++) channels[i].status = CHANSTAT_STOPPED; } static FORCEINLINE void adjust_channel_timer(channel_struct *chan) { chan->sampinc = (((double)ARM7_CLOCK) / (DESMUME_SAMPLE_RATE * 2)) / (double)(0x10000 - chan->timer); } void SPU_struct::KeyProbe(int chan_num) { channel_struct &thischan = channels[chan_num]; if(thischan.status == CHANSTAT_STOPPED) { if(thischan.keyon && regs.masteren) KeyOn(chan_num); } else if(thischan.status == CHANSTAT_PLAY) { if(!thischan.keyon || !regs.masteren) KeyOff(chan_num); } } void SPU_struct::KeyOff(int channel) { //printf("keyoff%d\n",channel); channel_struct &thischan = channels[channel]; thischan.status = CHANSTAT_STOPPED; } void SPU_struct::KeyOn(int channel) { channel_struct &thischan = channels[channel]; thischan.status = CHANSTAT_PLAY; thischan.totlength = thischan.length + thischan.loopstart; adjust_channel_timer(&thischan); //printf("keyon %d totlength:%d\n",channel,thischan.totlength); //LOG("Channel %d key on: vol = %d, volumeDiv = %d, hold = %d, pan = %d, waveduty = %d, repeat = %d, format = %d, source address = %07X," // "timer = %04X, loop start = %04X, length = %06X, MMU.ARM7_REG[0x501] = %02X\n", channel, chan->vol, chan->volumeDiv, chan->hold, // chan->pan, chan->waveduty, chan->repeat, chan->format, chan->addr, chan->timer, chan->loopstart, chan->length, T1ReadByte(MMU.ARM7_REG, 0x501)); switch(thischan.format) { case 0: // 8-bit // thischan.loopstart = thischan.loopstart << 2; // thischan.length = (thischan.length << 2) + thischan.loopstart; thischan.sampcnt = -3; break; case 1: // 16-bit // thischan.loopstart = thischan.loopstart << 1; // thischan.length = (thischan.length << 1) + thischan.loopstart; thischan.sampcnt = -3; break; case 2: // ADPCM { thischan.pcm16b = (s16)read16(thischan.addr); thischan.pcm16b_last = thischan.pcm16b; thischan.index = read08(thischan.addr + 2) & 0x7F;; thischan.lastsampcnt = 7; thischan.sampcnt = -3; thischan.loop_index = K_ADPCM_LOOPING_RECOVERY_INDEX; // thischan.loopstart = thischan.loopstart << 3; // thischan.length = (thischan.length << 3) + thischan.loopstart; break; } case 3: // PSG { thischan.sampcnt = -1; thischan.x = 0x7FFF; break; } default: break; } thischan.double_totlength_shifted = (double)(thischan.totlength << format_shift[thischan.format]); if(thischan.format != 3) { if(thischan.double_totlength_shifted == 0) { printf("INFO: Stopping channel %d due to zero length\n",channel); thischan.status = CHANSTAT_STOPPED; } } } ////////////////////////////////////////////////////////////////////////////// u8 SPU_struct::ReadByte(u32 addr) { //individual channel regs if ((addr & 0x0F00) == 0x0400) { u32 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; switch (addr & 0xF) { case 0x0: return thischan.vol; case 0x1: return (thischan.volumeDiv | (thischan.hold << 7)); case 0x2: return thischan.pan; case 0x3: return ( thischan.waveduty | (thischan.repeat << 3) | (thischan.format << 5) | ((thischan.status == CHANSTAT_PLAY)?0x80:0) ); case 0x8: return *(u8*)(thischan.timer + 0); case 0x9: return *(u8*)(thischan.timer + 1); case 0xA: return *(u8*)(thischan.loopstart + 0); case 0xB: return *(u8*)(thischan.loopstart + 1); } return 0; } switch(addr) { //SOUNDCNT case 0x500: return regs.mastervol; case 0x501: return (regs.ctl_left | (regs.ctl_right << 2) | (regs.ctl_ch1bypass << 4) | (regs.ctl_ch3bypass << 5) | (regs.masteren << 7) ); //SOUNDBIAS case 0x504: return *(u8*)(regs.soundbias + 0); case 0x505: return *(u8*)(regs.soundbias + 1); //SNDCAP0CNT/SNDCAP1CNT case 0x508: case 0x509: { u32 which = (addr - 0x508); return regs.cap[which].add | (regs.cap[which].source << 1) | (regs.cap[which].oneshot << 2) | (regs.cap[which].bits8 << 3) | (regs.cap[which].runtime.running << 7); } //SNDCAP0DAD case 0x510: return *(u8*)(regs.cap[0].dad + 0); case 0x511: return *(u8*)(regs.cap[0].dad + 1); case 0x512: return *(u8*)(regs.cap[0].dad + 2); case 0x513: return *(u8*)(regs.cap[0].dad + 3); //SNDCAP0LEN case 0x514: return *(u8*)(regs.cap[0].len + 0); case 0x515: return *(u8*)(regs.cap[0].len + 1); //SNDCAP1DAD case 0x518: return *(u8*)(regs.cap[1].dad + 0); case 0x519: return *(u8*)(regs.cap[1].dad + 1); case 0x51A: return *(u8*)(regs.cap[1].dad + 2); case 0x51B: return *(u8*)(regs.cap[1].dad + 3); //SNDCAP1LEN case 0x51C: return *(u8*)(regs.cap[1].len + 0); case 0x51D: return *(u8*)(regs.cap[1].len + 1); } //switch on address return 0; } u16 SPU_struct::ReadWord(u32 addr) { //individual channel regs if ((addr & 0x0F00) == 0x0400) { u32 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; switch (addr & 0xF) { case 0x0: return (thischan.vol | (thischan.volumeDiv << 8) | (thischan.hold << 15) ); case 0x2: return (thischan.pan | (thischan.waveduty << 8) | (thischan.repeat << 11) | (thischan.format << 13) | ((thischan.status == CHANSTAT_PLAY)?(1 << 15):0) ); case 0x8: return thischan.timer; case 0xA: return thischan.loopstart; } //switch on individual channel regs return 0; } switch(addr) { //SOUNDCNT case 0x500: return (regs.mastervol | (regs.ctl_left << 8) | (regs.ctl_right << 10) | (regs.ctl_ch1bypass << 12) | (regs.ctl_ch3bypass << 13) | (regs.masteren << 15) ); //SOUNDBIAS case 0x504: return regs.soundbias; //SNDCAP0CNT/SNDCAP1CNT case 0x508: { u8 val0 = regs.cap[0].add | (regs.cap[0].source << 1) | (regs.cap[0].oneshot << 2) | (regs.cap[0].bits8 << 3) | (regs.cap[0].runtime.running << 7); u8 val1 = regs.cap[1].add | (regs.cap[1].source << 1) | (regs.cap[1].oneshot << 2) | (regs.cap[1].bits8 << 3) | (regs.cap[1].runtime.running << 7); return (u16)(val0 | (val1 << 8)); } //SNDCAP0DAD case 0x510: return *(u16*)(regs.cap[0].dad + 0); case 0x512: return *(u16*)(regs.cap[0].dad + 1); //SNDCAP0LEN case 0x514: return regs.cap[0].len; //SNDCAP1DAD case 0x518: return *(u16*)(regs.cap[1].dad + 0); case 0x51A: return *(u16*)(regs.cap[1].dad + 1); //SNDCAP1LEN case 0x51C: return regs.cap[1].len; } //switch on address return 0; } u32 SPU_struct::ReadLong(u32 addr) { //individual channel regs if ((addr & 0x0F00) == 0x0400) { u32 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; switch (addr & 0xF) { case 0x0: return (thischan.vol | (thischan.volumeDiv << 8) | (thischan.hold << 15) | (thischan.pan << 16) | (thischan.waveduty << 24) | (thischan.repeat << 27) | (thischan.format << 29) | ((thischan.status == CHANSTAT_PLAY)?(1 << 31):0) ); case 0x8: return (thischan.timer | (thischan.loopstart << 16)); } //switch on individual channel regs return 0; } switch(addr) { //SOUNDCNT case 0x500: return (regs.mastervol | (regs.ctl_left << 8) | (regs.ctl_right << 10) | (regs.ctl_ch1bypass << 12) | (regs.ctl_ch3bypass << 13) | (regs.masteren << 15) ); //SOUNDBIAS case 0x504: return (u32)regs.soundbias; //SNDCAP0CNT/SNDCAP1CNT case 0x508: { u8 val0 = regs.cap[0].add | (regs.cap[0].source << 1) | (regs.cap[0].oneshot << 2) | (regs.cap[0].bits8 << 3) | (regs.cap[0].runtime.running << 7); u8 val1 = regs.cap[1].add | (regs.cap[1].source << 1) | (regs.cap[1].oneshot << 2) | (regs.cap[1].bits8 << 3) | (regs.cap[1].runtime.running << 7); return (u32)(val0 | (val1 << 8)); } //SNDCAP0DAD case 0x510: return regs.cap[0].dad; //SNDCAP0LEN case 0x514: return (u32)regs.cap[0].len; //SNDCAP1DAD case 0x518: return regs.cap[1].dad; //SNDCAP1LEN case 0x51C: return (u32)regs.cap[1].len; } //switch on address return 0; } SPUFifo::SPUFifo() { reset(); } void SPUFifo::reset() { head = tail = size = 0; } void SPUFifo::enqueue(s16 val) { if(size==16) return; buffer[tail] = val; tail++; tail &= 15; size++; } s16 SPUFifo::dequeue() { if(size==0) return 0; head++; head &= 15; s16 ret = buffer[head]; size--; return ret; } void SPUFifo::save(EMUFILE* fp) { u32 version = 1; write32le(version,fp); write32le(head,fp); write32le(tail,fp); write32le(size,fp); for(int i=0;i<16;i++) write16le(buffer[i],fp); } bool SPUFifo::load(EMUFILE* fp) { u32 version; if(read32le(&version,fp) != 1) return false; read32le(&head,fp); read32le(&tail,fp); read32le(&size,fp); for(int i=0;i<16;i++) read16le(&buffer[i],fp); return true; } void SPU_struct::ProbeCapture(int which) { //VERY UNTESTED -- HOW MUCH OF THIS RESETS, AND WHEN? if(!regs.cap[which].active) { regs.cap[which].runtime.running = 0; return; } REGS::CAP &cap = regs.cap[which]; cap.runtime.running = 1; cap.runtime.curdad = cap.dad; u32 len = cap.len; if(len==0) len=1; cap.runtime.maxdad = cap.dad + len*4; cap.runtime.sampcnt = 0; cap.runtime.fifo.reset(); } void SPU_struct::WriteByte(u32 addr, u8 val) { //individual channel regs if ((addr & 0x0F00) == 0x0400) { u8 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; //printf("SPU write08 channel%d, reg %04X, val %02X\n", chan_num, addr, val); switch (addr & 0x000F) { case 0x0: thischan.vol = (val & 0x7F); break; case 0x1: thischan.volumeDiv = (val & 0x03); thischan.hold = (val >> 7) & 0x01; break; case 0x2: thischan.pan = (val & 0x7F); break; case 0x3: thischan.waveduty = (val & 0x07); thischan.repeat = (val >> 3) & 0x03; thischan.format = (val >> 5) & 0x03; thischan.keyon = (val >> 7) & 0x01; KeyProbe(chan_num); break; case 0x4: *(u8*)(thischan.addr + 0) = (val & 0xFC); break; case 0x5: *(u8*)(thischan.addr + 1) = val; break; case 0x6: *(u8*)(thischan.addr + 2) = val; break; case 0x7: *(u8*)(thischan.addr + 3) = (val & 0x07); break; //only 27 bits of this register are used case 0x8: *(u8*)(thischan.timer + 0) = val; adjust_channel_timer(&thischan); break; case 0x9: *(u8*)(thischan.timer + 1) = val; adjust_channel_timer(&thischan); break; case 0xA: *(u8*)(thischan.loopstart + 0) = val; break; case 0xB: *(u8*)(thischan.loopstart + 1) = val; break; case 0xC: *(u8*)(thischan.length + 0) = val; break; case 0xD: *(u8*)(thischan.length + 1) = val; break; case 0xE: *(u8*)(thischan.length + 2) = (val & 0x3F); break; //only 22 bits of this register are used case 0xF: *(u8*)(thischan.length + 3) = 0; break; } //switch on individual channel regs return; } switch(addr) { //SOUNDCNT case 0x500: regs.mastervol = (val & 0x7F); break; case 0x501: regs.ctl_left = (val >> 0) & 3; regs.ctl_right = (val >> 2) & 3; regs.ctl_ch1bypass = (val >> 4) & 1; regs.ctl_ch3bypass = (val >> 5) & 1; regs.masteren = (val >> 7) & 1; for(u8 i=0; i<16; i++) KeyProbe(i); break; //SOUNDBIAS case 0x504: *(u8*)(regs.soundbias + 0) = val; break; case 0x505: *(u8*)(regs.soundbias + 1) = (val & 0x03); break; //SNDCAP0CNT/SNDCAP1CNT case 0x508: case 0x509: { u32 which = (addr - 0x508); regs.cap[which].add = BIT0(val); regs.cap[which].source = BIT1(val); regs.cap[which].oneshot = BIT2(val); regs.cap[which].bits8 = BIT3(val); regs.cap[which].active = BIT7(val); ProbeCapture(which); break; } //SNDCAP0DAD case 0x510: *(u8*)(regs.cap[0].dad + 0) = (val & 0xFC); break; case 0x511: *(u8*)(regs.cap[0].dad + 1) = val; break; case 0x512: *(u8*)(regs.cap[0].dad + 2) = val; break; case 0x513: *(u8*)(regs.cap[0].dad + 3) = (val & 0x07); break; //SNDCAP0LEN case 0x514: *(u8*)(regs.cap[0].len + 0) = val; break; case 0x515: *(u8*)(regs.cap[0].len + 1) = val; break; //SNDCAP1DAD case 0x518: *(u8*)(regs.cap[1].dad + 0) = (val & 0xFC); break; case 0x519: *(u8*)(regs.cap[1].dad + 1) = val; break; case 0x51A: *(u8*)(regs.cap[1].dad + 2) = val; break; case 0x51B: *(u8*)(regs.cap[1].dad + 3) = (val & 0x07); break; //SNDCAP1LEN case 0x51C: *(u8*)(regs.cap[1].len + 0) = val; break; case 0x51D: *(u8*)(regs.cap[1].len + 1) = val; break; } //switch on address } void SPU_struct::WriteWord(u32 addr, u16 val) { //individual channel regs if ((addr & 0x0F00) == 0x0400) { u32 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; //printf("SPU write16 channel%d, reg %04X, val %04X\n", chan_num, addr, val); switch (addr & 0xF) { case 0x0: thischan.vol = (val & 0x7F); thischan.volumeDiv = (val >> 8) & 0x3; thischan.hold = (val >> 15) & 0x1; break; case 0x2: thischan.pan = (val & 0x7F); thischan.waveduty = (val >> 8) & 0x7; thischan.repeat = (val >> 11) & 0x3; thischan.format = (val >> 13) & 0x3; thischan.keyon = (val >> 15) & 0x1; KeyProbe(chan_num); break; case 0x4: *(u16*)(thischan.addr + 0) = (val & 0xFFFC); break; case 0x6: *(u16*)(thischan.addr + 1) = (val & 0x07FF); break; case 0x8: thischan.timer = val; adjust_channel_timer(&thischan); break; case 0xA: thischan.loopstart = val; break; case 0xC: *(u16*)(thischan.length + 0) = val; break; case 0xE: *(u16*)(thischan.length + 1) = (val & 0x003F); break; //only 22 bits of this register are used } //switch on individual channel regs return; } switch (addr) { //SOUNDCNT case 0x500: regs.mastervol = (val & 0x7F); regs.ctl_left = (val >> 8) & 0x03; regs.ctl_right = (val >> 10) & 0x03; regs.ctl_ch1bypass = (val >> 12) & 0x01; regs.ctl_ch3bypass = (val >> 13) & 0x01; regs.masteren = (val >> 15) & 0x01; for(u8 i=0; i<16; i++) KeyProbe(i); break; //SOUNDBIAS case 0x504: regs.soundbias = (val & 0x3FF); break; //SNDCAP0CNT/SNDCAP1CNT case 0x508: { regs.cap[0].add = BIT0(val); regs.cap[0].source = BIT1(val); regs.cap[0].oneshot = BIT2(val); regs.cap[0].bits8 = BIT3(val); regs.cap[0].active = BIT7(val); ProbeCapture(0); regs.cap[1].add = BIT8(val); regs.cap[1].source = BIT9(val); regs.cap[1].oneshot = BIT10(val); regs.cap[1].bits8 = BIT11(val); regs.cap[1].active = BIT15(val); ProbeCapture(1); break; } //SNDCAP0DAD case 0x510: *(u16*)(regs.cap[0].dad + 0) = (val & 0xFFFC); break; case 0x512: *(u16*)(regs.cap[0].dad + 1) = (val & 0x7FFF); break; //SNDCAP0LEN case 0x514: regs.cap[0].len = val; break; //SNDCAP1DAD case 0x518: *(u16*)(regs.cap[1].dad + 0) = (val & 0xFFFC); break; case 0x51A: *(u16*)(regs.cap[1].dad + 1) = (val & 0x7FFF); break; //SNDCAP1LEN case 0x51C: regs.cap[1].len = val; break; } //switch on address } void SPU_struct::WriteLong(u32 addr, u32 val) { //individual channel regs if ((addr & 0x0F00) == 0x0400) { u32 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; //printf("SPU write32 channel%d, reg %04X, val %08X\n", chan_num, addr, val); switch (addr & 0xF) { case 0x0: thischan.vol = val & 0x7F; thischan.volumeDiv = (val >> 8) & 0x3; thischan.hold = (val >> 15) & 0x1; thischan.pan = (val >> 16) & 0x7F; thischan.waveduty = (val >> 24) & 0x7; thischan.repeat = (val >> 27) & 0x3; thischan.format = (val >> 29) & 0x3; thischan.keyon = (val >> 31) & 0x1; KeyProbe(chan_num); break; case 0x4: thischan.addr = (val & 0x07FFFFFC); break; case 0x8: thischan.timer = (val & 0xFFFF); thischan.loopstart = ((val >> 16) & 0xFFFF); adjust_channel_timer(&thischan); break; case 0xC: thischan.length = (val & 0x003FFFFF); break; //only 22 bits of this register are used } //switch on individual channel regs return; } switch(addr) { //SOUNDCNT case 0x500: regs.mastervol = (val & 0x7F); regs.ctl_left = ((val >> 8) & 3); regs.ctl_right = ((val>>10) & 3); regs.ctl_ch1bypass = ((val >> 12) & 1); regs.ctl_ch3bypass = ((val >> 13) & 1); regs.masteren = ((val >> 15) & 1); for(u8 i=0; i<16; i++) KeyProbe(i); break; //SOUNDBIAS case 0x504: regs.soundbias = (val & 0x3FF); //SNDCAP0CNT/SNDCAP1CNT case 0x508: regs.cap[0].add = BIT0(val); regs.cap[0].source = BIT1(val); regs.cap[0].oneshot = BIT2(val); regs.cap[0].bits8 = BIT3(val); regs.cap[0].active = BIT7(val); ProbeCapture(0); regs.cap[1].add = BIT8(val); regs.cap[1].source = BIT9(val); regs.cap[1].oneshot = BIT10(val); regs.cap[1].bits8 = BIT11(val); regs.cap[1].active = BIT15(val); ProbeCapture(1); break; //SNDCAP0DAD case 0x510: regs.cap[0].dad = (val & 0x07FFFFFC); break; //SNDCAP0LEN case 0x514: regs.cap[0].len = (val & 0xFFFF); break; //SNDCAP1DAD case 0x518: regs.cap[1].dad = (val & 0x07FFFFFC); break; //SNDCAP1LEN case 0x51C: regs.cap[1].len = (val & 0xFFFF); break; } //switch on address } template static FORCEINLINE s32 Interpolate(s32 a, s32 b, double ratio) { double sampleA = (double)a; double sampleB = (double)b; ratio = ratio - sputrunc(ratio); switch (INTERPOLATE_MODE) { case SPUInterpolation_Cosine: // Cosine Interpolation Formula: // ratio2 = (1 - cos(ratio * M_PI)) / 2 // sampleI = sampleA * (1 - ratio2) + sampleB * ratio2 return s32floor((cos_lut[(unsigned int)(ratio * (double)COSINE_INTERPOLATION_RESOLUTION)] * (sampleB - sampleA)) + sampleA); break; case SPUInterpolation_Linear: // Linear Interpolation Formula: // sampleI = sampleA * (1 - ratio) + sampleB * ratio return s32floor((ratio * (sampleB - sampleA)) + sampleA); break; default: break; } return a; } ////////////////////////////////////////////////////////////////////////////// template static FORCEINLINE void Fetch8BitData(channel_struct *chan, s32 *data) { if (chan->sampcnt < 0) { *data = 0; return; } u32 loc = sputrunc(chan->sampcnt); if(INTERPOLATE_MODE != SPUInterpolation_None) { s32 a = (s32)(read_s8(chan->addr + loc) << 8); if(loc < (chan->totlength << 2) - 1) { s32 b = (s32)(read_s8(chan->addr + loc + 1) << 8); a = Interpolate(a, b, chan->sampcnt); } *data = a; } else *data = (s32)read_s8(chan->addr + loc)<< 8; } template static FORCEINLINE void Fetch16BitData(const channel_struct * const chan, s32 *data) { if (chan->sampcnt < 0) { *data = 0; return; } if(INTERPOLATE_MODE != SPUInterpolation_None) { u32 loc = sputrunc(chan->sampcnt); s32 a = (s32)read16(loc*2 + chan->addr), b; if(loc < (chan->totlength << 1) - 1) { b = (s32)read16(loc*2 + chan->addr + 2); a = Interpolate(a, b, chan->sampcnt); } *data = a; } else *data = read16(chan->addr + sputrunc(chan->sampcnt)*2); } template static FORCEINLINE void FetchADPCMData(channel_struct * const chan, s32 * const data) { if (chan->sampcnt < 8) { *data = 0; return; } // No sense decoding, just return the last sample if (chan->lastsampcnt != sputrunc(chan->sampcnt)){ const u32 endExclusive = sputrunc(chan->sampcnt+1); for (u32 i = chan->lastsampcnt+1; i < endExclusive; i++) { const u32 shift = (i&1)<<2; const u32 data4bit = ((u32)read08(chan->addr + (i>>1))) >> shift; const s32 diff = precalcdifftbl[chan->index][data4bit & 0xF]; chan->index = precalcindextbl[chan->index][data4bit & 0x7]; chan->pcm16b_last = chan->pcm16b; chan->pcm16b = MinMax(chan->pcm16b+diff, -0x8000, 0x7FFF); if(i == (chan->loopstart<<3)) { if(chan->loop_index != K_ADPCM_LOOPING_RECOVERY_INDEX) printf("over-snagging\n"); chan->loop_pcm16b = chan->pcm16b; chan->loop_index = chan->index; } } chan->lastsampcnt = sputrunc(chan->sampcnt); } if(INTERPOLATE_MODE != SPUInterpolation_None) *data = Interpolate((s32)chan->pcm16b_last,(s32)chan->pcm16b,chan->sampcnt); else *data = (s32)chan->pcm16b; } static FORCEINLINE void FetchPSGData(channel_struct *chan, s32 *data) { if (chan->sampcnt < 0) { *data = 0; return; } if(chan->num < 8) { *data = 0; } else if(chan->num < 14) { *data = (s32)wavedutytbl[chan->waveduty][(sputrunc(chan->sampcnt)) & 0x7]; } else { if(chan->lastsampcnt == sputrunc(chan->sampcnt)) { *data = (s32)chan->psgnoise_last; return; } u32 max = sputrunc(chan->sampcnt); for(u32 i = chan->lastsampcnt; i < max; i++) { if(chan->x & 0x1) { chan->x = (chan->x >> 1) ^ 0x6000; chan->psgnoise_last = -0x7FFF; } else { chan->x >>= 1; chan->psgnoise_last = 0x7FFF; } } chan->lastsampcnt = sputrunc(chan->sampcnt); *data = (s32)chan->psgnoise_last; } } ////////////////////////////////////////////////////////////////////////////// static FORCEINLINE void MixL(SPU_struct* SPU, channel_struct *chan, s32 data) { data = spumuldiv7(data, chan->vol) >> volume_shift[chan->volumeDiv]; SPU->sndbuf[SPU->bufpos<<1] += data; } static FORCEINLINE void MixR(SPU_struct* SPU, channel_struct *chan, s32 data) { data = spumuldiv7(data, chan->vol) >> volume_shift[chan->volumeDiv]; SPU->sndbuf[(SPU->bufpos<<1)+1] += data; } static FORCEINLINE void MixLR(SPU_struct* SPU, channel_struct *chan, s32 data) { data = spumuldiv7(data, chan->vol) >> volume_shift[chan->volumeDiv]; SPU->sndbuf[SPU->bufpos<<1] += spumuldiv7(data, 127 - chan->pan); SPU->sndbuf[(SPU->bufpos<<1)+1] += spumuldiv7(data, chan->pan); } ////////////////////////////////////////////////////////////////////////////// template static FORCEINLINE void TestForLoop(SPU_struct *SPU, channel_struct *chan) { const int shift = (FORMAT == 0 ? 2 : 1); chan->sampcnt += chan->sampinc; if (chan->sampcnt > chan->double_totlength_shifted) { // Do we loop? Or are we done? if (chan->repeat == 1) { while (chan->sampcnt > chan->double_totlength_shifted) chan->sampcnt -= chan->double_totlength_shifted - (double)(chan->loopstart << shift); //chan->sampcnt = (double)(chan->loopstart << shift); } else { SPU->KeyOff(chan->num); SPU->bufpos = SPU->buflength; } } } static FORCEINLINE void TestForLoop2(SPU_struct *SPU, channel_struct *chan) { // Minimum length (the sum of PNT+LEN) is 4 words (16 bytes), // smaller values (0..3 words) are causing hang-ups // (busy bit remains set infinite, but no sound output occurs). // fix: 7th Dragon (JP) - http://sourceforge.net/p/desmume/bugs/1357/ if (chan->totlength < 4) return; chan->sampcnt += chan->sampinc; if (chan->sampcnt > chan->double_totlength_shifted) { // Do we loop? Or are we done? if (chan->repeat == 1) { double step = (chan->double_totlength_shifted - (double)(chan->loopstart << 3)); while (chan->sampcnt > chan->double_totlength_shifted) chan->sampcnt -= step; if(chan->loop_index == K_ADPCM_LOOPING_RECOVERY_INDEX) { chan->pcm16b = (s16)read16(chan->addr); chan->index = read08(chan->addr+2) & 0x7F; chan->lastsampcnt = 7; } else { chan->pcm16b = chan->loop_pcm16b; chan->index = chan->loop_index; chan->lastsampcnt = (chan->loopstart << 3); } } else { chan->status = CHANSTAT_STOPPED; SPU->KeyOff(chan->num); SPU->bufpos = SPU->buflength; } } } template FORCEINLINE static void SPU_Mix(SPU_struct* SPU, channel_struct *chan, s32 data) { switch(CHANNELS) { case 0: MixL(SPU, chan, data); break; case 1: MixLR(SPU, chan, data); break; case 2: MixR(SPU, chan, data); break; } SPU->lastdata = data; } //WORK template FORCEINLINE static void ____SPU_ChanUpdate(SPU_struct* const SPU, channel_struct* const chan) { for (; SPU->bufpos < SPU->buflength; SPU->bufpos++) { if(CHANNELS != -1) { s32 data; switch(FORMAT) { case 0: Fetch8BitData(chan, &data); break; case 1: Fetch16BitData(chan, &data); break; case 2: FetchADPCMData(chan, &data); break; case 3: FetchPSGData(chan, &data); break; } SPU_Mix(SPU, chan, data); } switch(FORMAT) { case 0: case 1: TestForLoop(SPU, chan); break; case 2: TestForLoop2(SPU, chan); break; case 3: chan->sampcnt += chan->sampinc; break; } } } template FORCEINLINE static void ___SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan) { if(!actuallyMix) ____SPU_ChanUpdate(SPU,chan); else if (chan->pan == 0) ____SPU_ChanUpdate(SPU,chan); else if (chan->pan == 127) ____SPU_ChanUpdate(SPU,chan); else ____SPU_ChanUpdate(SPU,chan); } template FORCEINLINE static void __SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan) { switch(chan->format) { case 0: ___SPU_ChanUpdate<0,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; case 1: ___SPU_ChanUpdate<1,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; case 2: ___SPU_ChanUpdate<2,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; case 3: ___SPU_ChanUpdate<3,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; default: assert(false); } } FORCEINLINE static void _SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan) { switch(CommonSettings.spuInterpolationMode) { case SPUInterpolation_None: __SPU_ChanUpdate(actuallyMix, SPU, chan); break; case SPUInterpolation_Linear: __SPU_ChanUpdate(actuallyMix, SPU, chan); break; case SPUInterpolation_Cosine: __SPU_ChanUpdate(actuallyMix, SPU, chan); break; default: assert(false); } } //ENTERNEW static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) { //the advanced spu function correctly handles all sound control mixing options, as well as capture //this code is not entirely optimal, as it relies on sort of manhandling the core mixing functions //in order to get the results it needs. //THIS IS MAX HACKS!!!! //AND NEEDS TO BE REWRITTEN ALONG WITH THE DEEPEST PARTS OF THE SPU //ONCE WE KNOW THAT IT WORKS //BIAS gets ignored since our spu is still not bit perfect, //and it doesnt matter for purposes of capture //-----------DEBUG CODE bool skipcap = false; //----------------- s32 samp0[2]; //believe it or not, we are going to do this one sample at a time. //like i said, it is slower. for(int samp=0;sampsndbuf[0] = 0; SPU->sndbuf[1] = 0; SPU->buflength = 1; s32 capmix[2] = {0,0}; s32 mix[2] = {0,0}; s32 chanout[16]; s32 submix[32]; //generate each channel, and helpfully mix it at the same time for(int i=0;i<16;i++) { channel_struct *chan = &SPU->channels[i]; if (chan->status == CHANSTAT_PLAY) { SPU->bufpos = 0; bool bypass = false; if(i==1 && SPU->regs.ctl_ch1bypass) bypass=true; if(i==3 && SPU->regs.ctl_ch3bypass) bypass=true; //output to mixer unless we are bypassed. //dont output to mixer if the user muted us bool outputToMix = true; if(CommonSettings.spu_muteChannels[i]) outputToMix = false; if(bypass) outputToMix = false; bool outputToCap = outputToMix; if(CommonSettings.spu_captureMuted && !bypass) outputToCap = true; //channels 1 and 3 should probably always generate their audio //internally at least, just in case they get used by the spu output bool domix = outputToCap || outputToMix || i==1 || i==3; //clear the output buffer since this is where _SPU_ChanUpdate wants to accumulate things SPU->sndbuf[0] = SPU->sndbuf[1] = 0; //get channel's next output sample. _SPU_ChanUpdate(domix, SPU, chan); chanout[i] = SPU->lastdata >> volume_shift[chan->volumeDiv]; //save the panned results submix[i*2] = SPU->sndbuf[0]; submix[i*2+1] = SPU->sndbuf[1]; //send sample to our capture mix if(outputToCap) { capmix[0] += submix[i*2]; capmix[1] += submix[i*2+1]; } //send sample to our main mixer if(outputToMix) { mix[0] += submix[i*2]; mix[1] += submix[i*2+1]; } } else { chanout[i] = 0; submix[i*2] = 0; submix[i*2+1] = 0; } } //foreach channel s32 mixout[2] = {mix[0],mix[1]}; s32 capmixout[2] = {capmix[0],capmix[1]}; s32 sndout[2]; s32 capout[2]; //create SPU output switch(SPU->regs.ctl_left) { case SPU_struct::REGS::LOM_LEFT_MIXER: sndout[0] = mixout[0]; break; case SPU_struct::REGS::LOM_CH1: sndout[0] = submix[1*2+0]; break; case SPU_struct::REGS::LOM_CH3: sndout[0] = submix[3*2+0]; break; case SPU_struct::REGS::LOM_CH1_PLUS_CH3: sndout[0] = submix[1*2+0] + submix[3*2+0]; break; } switch(SPU->regs.ctl_right) { case SPU_struct::REGS::ROM_RIGHT_MIXER: sndout[1] = mixout[1]; break; case SPU_struct::REGS::ROM_CH1: sndout[1] = submix[1*2+1]; break; case SPU_struct::REGS::ROM_CH3: sndout[1] = submix[3*2+1]; break; case SPU_struct::REGS::ROM_CH1_PLUS_CH3: sndout[1] = submix[1*2+1] + submix[3*2+1]; break; } //generate capture output ("capture bugs" from gbatek are not emulated) if(SPU->regs.cap[0].source==0) capout[0] = capmixout[0]; //cap0 = L-mix else if(SPU->regs.cap[0].add) capout[0] = chanout[0] + chanout[1]; //cap0 = ch0+ch1 else capout[0] = chanout[0]; //cap0 = ch0 if(SPU->regs.cap[1].source==0) capout[1] = capmixout[1]; //cap1 = R-mix else if(SPU->regs.cap[1].add) capout[1] = chanout[2] + chanout[3]; //cap1 = ch2+ch3 else capout[1] = chanout[2]; //cap1 = ch2 capout[0] = MinMax(capout[0],-0x8000,0x7FFF); capout[1] = MinMax(capout[1],-0x8000,0x7FFF); //write the output sample where it is supposed to go if(samp==0) { samp0[0] = sndout[0]; samp0[1] = sndout[1]; } else { SPU->sndbuf[samp*2+0] = sndout[0]; SPU->sndbuf[samp*2+1] = sndout[1]; } for(int capchan=0;capchan<2;capchan++) { if(SPU->regs.cap[capchan].runtime.running) { SPU_struct::REGS::CAP& cap = SPU->regs.cap[capchan]; u32 last = sputrunc(cap.runtime.sampcnt); cap.runtime.sampcnt += SPU->channels[1+2*capchan].sampinc; u32 curr = sputrunc(cap.runtime.sampcnt); for(u32 j=last;j>8; if(skipcap) _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,0); else _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,sample8); cap.runtime.curdad++; multiplier = 4; } else { s16 sample16 = sample; if(skipcap) _MMU_write16<1,MMU_AT_DMA>(cap.runtime.curdad,0); else _MMU_write16<1,MMU_AT_DMA>(cap.runtime.curdad,sample16); cap.runtime.curdad+=2; multiplier = 2; } if(cap.runtime.curdad>=cap.runtime.maxdad) { cap.runtime.curdad = cap.dad; cap.runtime.sampcnt -= cap.len*multiplier; } } //sampinc loop } //if capchan running } //capchan loop } //main sample loop SPU->sndbuf[0] = samp0[0]; SPU->sndbuf[1] = samp0[1]; } //ENTER static void SPU_MixAudio(bool actuallyMix, SPU_struct *SPU, int length) { if(actuallyMix) { memset(SPU->sndbuf, 0, length*4*2); memset(SPU->outbuf, 0, length*2*2); } //we used to use master enable here, and do nothing if audio is disabled. //now, master enable is emulated better.. //but for a speed optimization we will still do it if(!SPU->regs.masteren) return; bool advanced = CommonSettings.spu_advanced ; //branch here so that slow computers don't have to take the advanced (slower) codepath. //it remainds to be seen exactly how much slower it is //if it isnt much slower then we should refactor everything to be simpler, once it is working if(advanced && SPU == SPU_core) { SPU_MixAudio_Advanced(actuallyMix, SPU, length); } else { //non-advanced mode for(int i=0;i<16;i++) { channel_struct *chan = &SPU->channels[i]; if (chan->status != CHANSTAT_PLAY) continue; SPU->bufpos = 0; SPU->buflength = length; // Mix audio _SPU_ChanUpdate(!CommonSettings.spu_muteChannels[i] && actuallyMix, SPU, chan); } } //we used to bail out if speakers were disabled. //this is technically wrong. sound may still be captured, or something. //in all likelihood, any game doing this probably master disabled the SPU also //so, optimization of this case is probably not necessary. //later, we'll just silence the output bool speakers = T1ReadWord(MMU.ARM7_REG, 0x304) & 0x01; u8 vol = SPU->regs.mastervol; // convert from 32-bit->16-bit if(actuallyMix && speakers) for (int i = 0; i < length*2; i++) { // Apply Master Volume SPU->sndbuf[i] = spumuldiv7(SPU->sndbuf[i], vol); s16 outsample = MinMax(SPU->sndbuf[i],-0x8000,0x7FFF); SPU->outbuf[i] = outsample; } } ////////////////////////////////////////////////////////////////////////////// //emulates one hline of the cpu core. //this will produce a variable number of samples, calculated to keep a 44100hz output //in sync with the emulator framerate int spu_core_samples = 0; void SPU_Emulate_core() { bool needToMix = true; SoundInterface_struct *soundProcessor = SPU_SoundCore(); samples += samples_per_hline; spu_core_samples = (int)(samples); samples -= spu_core_samples; // We don't need to mix audio for Dual Synch/Asynch mode since we do this // later in SPU_Emulate_user(). Disable mixing here to speed up processing. // However, recording still needs to mix the audio, so make sure we're also // not recording before we disable mixing. if ( synchmode == ESynchMode_DualSynchAsynch && !(driver->AVI_IsRecording() || driver->WAV_IsRecording()) ) { needToMix = false; } SPU_MixAudio(needToMix, SPU_core, spu_core_samples); if (soundProcessor == NULL) { return; } if (soundProcessor->FetchSamples != NULL) { soundProcessor->FetchSamples(SPU_core->outbuf, spu_core_samples, synchmode, synchronizer); } else { SPU_DefaultFetchSamples(SPU_core->outbuf, spu_core_samples, synchmode, synchronizer); } } void SPU_Emulate_user(bool mix) { static s16 *postProcessBuffer = NULL; static size_t postProcessBufferSize = 0; size_t freeSampleCount = 0; size_t processedSampleCount = 0; SoundInterface_struct *soundProcessor = SPU_SoundCore(); if (soundProcessor == NULL) { return; } // Check to see how many free samples are available. // If there are some, fill up the output buffer. freeSampleCount = soundProcessor->GetAudioSpace(); if (freeSampleCount == 0) { return; } //printf("mix %i samples\n", audiosize); if (freeSampleCount > buffersize) { freeSampleCount = buffersize; } // If needed, resize the post-process buffer to guarantee that // we can store all the sound data. if (postProcessBufferSize < freeSampleCount * 2 * sizeof(s16)) { postProcessBufferSize = freeSampleCount * 2 * sizeof(s16); postProcessBuffer = (s16 *)realloc(postProcessBuffer, postProcessBufferSize); } if (soundProcessor->PostProcessSamples != NULL) { processedSampleCount = soundProcessor->PostProcessSamples(postProcessBuffer, freeSampleCount, synchmode, synchronizer); } else { processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, freeSampleCount, synchmode, synchronizer); } soundProcessor->UpdateAudio(postProcessBuffer, processedSampleCount); WAV_WavSoundUpdate(postProcessBuffer, processedSampleCount, WAVMODE_USER); } void SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { if (synchMode == ESynchMode_Synchronous) { theSynchronizer->enqueue_samples(sampleBuffer, sampleCount); } } size_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { size_t processedSampleCount = 0; switch (synchMode) { case ESynchMode_DualSynchAsynch: if(SPU_user != NULL) { SPU_MixAudio(true, SPU_user, requestedSampleCount); memcpy(postProcessBuffer, SPU_user->outbuf, requestedSampleCount * 2 * sizeof(s16)); processedSampleCount = requestedSampleCount; } break; case ESynchMode_Synchronous: processedSampleCount = theSynchronizer->output_samples(postProcessBuffer, requestedSampleCount); break; default: break; } return processedSampleCount; } ////////////////////////////////////////////////////////////////////////////// // Dummy Sound Interface ////////////////////////////////////////////////////////////////////////////// int SNDDummyInit(int buffersize); void SNDDummyDeInit(); void SNDDummyUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDDummyGetAudioSpace(); void SNDDummyMuteAudio(); void SNDDummyUnMuteAudio(); void SNDDummySetVolume(int volume); void SNDDummyClearBuffer(); void SNDDummyFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SNDDummyPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); SoundInterface_struct SNDDummy = { SNDCORE_DUMMY, "Dummy Sound Interface", SNDDummyInit, SNDDummyDeInit, SNDDummyUpdateAudio, SNDDummyGetAudioSpace, SNDDummyMuteAudio, SNDDummyUnMuteAudio, SNDDummySetVolume, SNDDummyClearBuffer, SNDDummyFetchSamples, SNDDummyPostProcessSamples }; int SNDDummyInit(int buffersize) { return 0; } void SNDDummyDeInit() {} void SNDDummyUpdateAudio(s16 *buffer, u32 num_samples) { } u32 SNDDummyGetAudioSpace() { return DESMUME_SAMPLE_RATE/60 + 5; } void SNDDummyMuteAudio() {} void SNDDummyUnMuteAudio() {} void SNDDummySetVolume(int volume) {} void SNDDummyClearBuffer() {} void SNDDummyFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) {} size_t SNDDummyPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { return 0; } //---------wav writer------------ typedef struct { char id[4]; u32 size; } chunk_struct; typedef struct { chunk_struct riff; char rifftype[4]; } waveheader_struct; typedef struct { chunk_struct chunk; u16 compress; u16 numchan; u32 rate; u32 bytespersec; u16 blockalign; u16 bitspersample; } fmt_struct; WavWriter::WavWriter() : spufp(NULL) { } bool WavWriter::open(const std::string & fname) { waveheader_struct waveheader; fmt_struct fmt; chunk_struct data; size_t elems_written = 0; if ((spufp = fopen(fname.c_str(), "wb")) == NULL) return false; // Do wave header memcpy(waveheader.riff.id, "RIFF", 4); waveheader.riff.size = 0; // we'll fix this after the file is closed memcpy(waveheader.rifftype, "WAVE", 4); elems_written += fwrite((void *)&waveheader, 1, sizeof(waveheader_struct), spufp); // fmt chunk memcpy(fmt.chunk.id, "fmt ", 4); fmt.chunk.size = 16; // we'll fix this at the end fmt.compress = 1; // PCM fmt.numchan = 2; // Stereo fmt.rate = DESMUME_SAMPLE_RATE; fmt.bitspersample = 16; fmt.blockalign = fmt.bitspersample / 8 * fmt.numchan; fmt.bytespersec = fmt.rate * fmt.blockalign; elems_written += fwrite((void *)&fmt, 1, sizeof(fmt_struct), spufp); // data chunk memcpy(data.id, "data", 4); data.size = 0; // we'll fix this at the end elems_written += fwrite((void *)&data, 1, sizeof(chunk_struct), spufp); return true; } void WavWriter::close() { if(!spufp) return; size_t elems_written = 0; long length = ftell(spufp); // Let's fix the riff chunk size and the data chunk size fseek(spufp, sizeof(waveheader_struct)-0x8, SEEK_SET); length -= 0x8; elems_written += fwrite((void *)&length, 1, 4, spufp); fseek(spufp, sizeof(waveheader_struct)+sizeof(fmt_struct)+0x4, SEEK_SET); length -= sizeof(waveheader_struct)+sizeof(fmt_struct); elems_written += fwrite((void *)&length, 1, 4, spufp); fclose(spufp); spufp = NULL; } void WavWriter::update(void* soundData, int numSamples) { if(!spufp) return; //TODO - big endian for the s16 samples?? size_t elems_written = fwrite(soundData, numSamples*2, 2, spufp); } bool WavWriter::isRecording() const { return spufp != NULL; } static WavWriter wavWriter; void WAV_End() { wavWriter.close(); } bool WAV_Begin(const char* fname, WAVMode mode) { WAV_End(); if(!wavWriter.open(fname)) return false; if(mode == WAVMODE_ANY) mode = WAVMODE_CORE; wavWriter.mode = mode; driver->USR_InfoMessage("WAV recording started."); return true; } bool WAV_IsRecording(WAVMode mode) { if(wavWriter.mode == mode || mode == WAVMODE_ANY) return wavWriter.isRecording(); return false; } void WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode) { if(wavWriter.mode == mode || mode == WAVMODE_ANY) wavWriter.update(soundData, numSamples); } ////////////////////////////////////////////////////////////////////////////// void spu_savestate(EMUFILE* os) { //version write32le(6,os); SPU_struct *spu = SPU_core; for(int j=0;j<16;j++) { channel_struct &chan = spu->channels[j]; write32le(chan.num,os); write8le(chan.vol,os); write8le(chan.volumeDiv,os); write8le(chan.hold,os); write8le(chan.pan,os); write8le(chan.waveduty,os); write8le(chan.repeat,os); write8le(chan.format,os); write8le(chan.status,os); write32le(chan.addr,os); write16le(chan.timer,os); write16le(chan.loopstart,os); write32le(chan.length,os); write64le(double_to_u64(chan.sampcnt),os); write64le(double_to_u64(chan.sampinc),os); write32le(chan.lastsampcnt,os); write16le(chan.pcm16b,os); write16le(chan.pcm16b_last,os); write32le(chan.index,os); write16le(chan.x,os); write16le(chan.psgnoise_last,os); write8le(chan.keyon,os); } write64le(double_to_u64(samples),os); write8le(spu->regs.mastervol,os); write8le(spu->regs.ctl_left,os); write8le(spu->regs.ctl_right,os); write8le(spu->regs.ctl_ch1bypass,os); write8le(spu->regs.ctl_ch3bypass,os); write8le(spu->regs.masteren,os); write16le(spu->regs.soundbias,os); for(int i=0;i<2;i++) { write8le(spu->regs.cap[i].add,os); write8le(spu->regs.cap[i].source,os); write8le(spu->regs.cap[i].oneshot,os); write8le(spu->regs.cap[i].bits8,os); write8le(spu->regs.cap[i].active,os); write32le(spu->regs.cap[i].dad,os); write16le(spu->regs.cap[i].len,os); write8le(spu->regs.cap[i].runtime.running,os); write32le(spu->regs.cap[i].runtime.curdad,os); write32le(spu->regs.cap[i].runtime.maxdad,os); write_double_le(spu->regs.cap[i].runtime.sampcnt,os); } for(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.save(os); } bool spu_loadstate(EMUFILE* is, int size) { u64 temp64; //read version u32 version; if(read32le(&version,is) != 1) return false; SPU_struct *spu = SPU_core; reconstruct(&SPU_core->regs); for(int j=0;j<16;j++) { channel_struct &chan = spu->channels[j]; read32le(&chan.num,is); read8le(&chan.vol,is); read8le(&chan.volumeDiv,is); if (chan.volumeDiv == 4) chan.volumeDiv = 3; read8le(&chan.hold,is); read8le(&chan.pan,is); read8le(&chan.waveduty,is); read8le(&chan.repeat,is); read8le(&chan.format,is); read8le(&chan.status,is); read32le(&chan.addr,is); read16le(&chan.timer,is); read16le(&chan.loopstart,is); read32le(&chan.length,is); chan.totlength = chan.length + chan.loopstart; chan.double_totlength_shifted = (double)(chan.totlength << format_shift[chan.format]); //printf("%f\n",chan.double_totlength_shifted); if(version >= 2) { read64le(&temp64,is); chan.sampcnt = u64_to_double(temp64); read64le(&temp64,is); chan.sampinc = u64_to_double(temp64); } else { read32le((u32*)&chan.sampcnt,is); read32le((u32*)&chan.sampinc,is); } read32le(&chan.lastsampcnt,is); read16le(&chan.pcm16b,is); read16le(&chan.pcm16b_last,is); read32le(&chan.index,is); read16le(&chan.x,is); read16le(&chan.psgnoise_last,is); if(version>=4) read8le(&chan.keyon,is); //hopefully trigger a recovery of the adpcm looping system chan.loop_index = K_ADPCM_LOOPING_RECOVERY_INDEX; } if(version>=2) { read64le(&temp64,is); samples = u64_to_double(temp64); } if(version>=4) { read8le(&spu->regs.mastervol,is); read8le(&spu->regs.ctl_left,is); read8le(&spu->regs.ctl_right,is); read8le(&spu->regs.ctl_ch1bypass,is); read8le(&spu->regs.ctl_ch3bypass,is); read8le(&spu->regs.masteren,is); read16le(&spu->regs.soundbias,is); } if(version>=5) { for(int i=0;i<2;i++) { read8le(&spu->regs.cap[i].add,is); read8le(&spu->regs.cap[i].source,is); read8le(&spu->regs.cap[i].oneshot,is); read8le(&spu->regs.cap[i].bits8,is); read8le(&spu->regs.cap[i].active,is); read32le(&spu->regs.cap[i].dad,is); read16le(&spu->regs.cap[i].len,is); read8le(&spu->regs.cap[i].runtime.running,is); read32le(&spu->regs.cap[i].runtime.curdad,is); read32le(&spu->regs.cap[i].runtime.maxdad,is); read_double_le(&spu->regs.cap[i].runtime.sampcnt,is); } } if(version>=6) for(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.load(is); else for(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.reset(); //older versions didnt store a mastervol; //we must reload this or else games will start silent if(version<4) { spu->regs.mastervol = T1ReadByte(MMU.ARM7_REG, 0x500) & 0x7F; spu->regs.masteren = BIT15(T1ReadWord(MMU.ARM7_REG, 0x500)); } //copy the core spu (the more accurate) to the user spu SPU_CloneUser(); return true; } desmume-0.9.11/src/ROMReader.cpp0000755000000000000000000001160112467662066015033 0ustar rootroot/* Copyright 2007 Guillaume Duhamel Copyright 2007-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "ROMReader.h" #include #include #include #ifdef HAVE_LIBZZIP #include #endif #ifdef WIN32 #define stat(...) _stat(__VA_ARGS__) #define S_IFMT _S_IFMT #define S_IFREG _S_IFREG #endif ROMReader_struct * ROMReaderInit(char ** filename) { #ifdef HAVE_LIBZ if(!strcasecmp(".gz", *filename + (strlen(*filename) - 3))) { (*filename)[strlen(*filename) - 3] = '\0'; return &GZIPROMReader; } #endif #ifdef HAVE_LIBZZIP if (!strcasecmp(".zip", *filename + (strlen(*filename) - 4))) { (*filename)[strlen(*filename) - 4] = '\0'; return &ZIPROMReader; } #endif return &STDROMReader; } void * STDROMReaderInit(const char * filename); void STDROMReaderDeInit(void *); u32 STDROMReaderSize(void *); int STDROMReaderSeek(void *, int, int); int STDROMReaderRead(void *, void *, u32); ROMReader_struct STDROMReader = { ROMREADER_STD, "Standard ROM Reader", STDROMReaderInit, STDROMReaderDeInit, STDROMReaderSize, STDROMReaderSeek, STDROMReaderRead }; void * STDROMReaderInit(const char * filename) { #ifdef WIN32 struct _stat sb; #else struct stat sb; #endif if (stat(filename, &sb) == -1) return 0; if ((sb.st_mode & S_IFMT) != S_IFREG) return 0; return (void *) fopen(filename, "rb"); } void STDROMReaderDeInit(void * file) { if (!file) return ; fclose((FILE*)file); } u32 STDROMReaderSize(void * file) { u32 size; if (!file) return 0 ; fseek((FILE*)file, 0, SEEK_END); size = ftell((FILE*)file); fseek((FILE*)file, 0, SEEK_SET); return size; } int STDROMReaderSeek(void * file, int offset, int whence) { if (!file) return 0 ; return fseek((FILE*)file, offset, whence); } int STDROMReaderRead(void * file, void * buffer, u32 size) { if (!file) return 0 ; return fread(buffer, 1, size, (FILE*)file); } #ifdef HAVE_LIBZ void * GZIPROMReaderInit(const char * filename); void GZIPROMReaderDeInit(void *); u32 GZIPROMReaderSize(void *); int GZIPROMReaderSeek(void *, int, int); int GZIPROMReaderRead(void *, void *, u32); ROMReader_struct GZIPROMReader = { ROMREADER_GZIP, "Gzip ROM Reader", GZIPROMReaderInit, GZIPROMReaderDeInit, GZIPROMReaderSize, GZIPROMReaderSeek, GZIPROMReaderRead }; void * GZIPROMReaderInit(const char * filename) { return (void*)gzopen(filename, "rb"); } void GZIPROMReaderDeInit(void * file) { gzclose((gzFile)file); } u32 GZIPROMReaderSize(void * file) { char useless[1024]; u32 size = 0; /* FIXME this function should first save the current * position and restore it after size calculation */ gzrewind((gzFile)file); while (gzeof ((gzFile)file) == 0) size += gzread((gzFile)file, useless, 1024); gzrewind((gzFile)file); return size; } int GZIPROMReaderSeek(void * file, int offset, int whence) { return gzseek((gzFile)file, offset, whence); } int GZIPROMReaderRead(void * file, void * buffer, u32 size) { return gzread((gzFile)file, buffer, size); } #endif #ifdef HAVE_LIBZZIP void * ZIPROMReaderInit(const char * filename); void ZIPROMReaderDeInit(void *); u32 ZIPROMReaderSize(void *); int ZIPROMReaderSeek(void *, int, int); int ZIPROMReaderRead(void *, void *, u32); ROMReader_struct ZIPROMReader = { ROMREADER_ZIP, "Zip ROM Reader", ZIPROMReaderInit, ZIPROMReaderDeInit, ZIPROMReaderSize, ZIPROMReaderSeek, ZIPROMReaderRead }; void * ZIPROMReaderInit(const char * filename) { ZZIP_DIR * dir = zzip_opendir(filename); ZZIP_DIRENT * dirent = zzip_readdir(dir); if (dir != NULL) { char tmp1[1024]; char tmp2[1024]; memset(tmp1,0,sizeof(tmp1)); memset(tmp2,0,sizeof(tmp2)); strncpy(tmp1, filename, strlen(filename) - 4); sprintf(tmp2, "%s/%s", tmp1, dirent->d_name); return zzip_fopen(tmp2, "rb"); } return NULL; } void ZIPROMReaderDeInit(void * file) { zzip_close((ZZIP_FILE*)file); } u32 ZIPROMReaderSize(void * file) { u32 size; zzip_seek((ZZIP_FILE*)file, 0, SEEK_END); size = zzip_tell((ZZIP_FILE*)file); zzip_seek((ZZIP_FILE*)file, 0, SEEK_SET); return size; } int ZIPROMReaderSeek(void * file, int offset, int whence) { return zzip_seek((ZZIP_FILE*)file, offset, whence); } int ZIPROMReaderRead(void * file, void * buffer, u32 size) { #ifdef ZZIP_OLD_READ return zzip_read((ZZIP_FILE*)file, (char *) buffer, size); #else return zzip_read((ZZIP_FILE*)file, buffer, size); #endif } #endif desmume-0.9.11/src/gdbstub.h0000755000000000000000000000275012467662066014357 0ustar rootroot/* Copyright (C) 2006 Ben Jaques Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _GDBSTUB_H_ #define _GDBSTUB_H_ 1 #include "types.h" typedef void *gdbstub_handle_t; struct armcpu_t; struct armcpu_memory_iface; void gdbstub_mutex_init(); void gdbstub_mutex_destroy(); void gdbstub_mutex_lock(); void gdbstub_mutex_unlock(); /* * The function interface */ gdbstub_handle_t createStub_gdb( u16 port, armcpu_t *theCPU, const armcpu_memory_iface *direct_memio); void destroyStub_gdb( gdbstub_handle_t stub); void activateStub_gdb( gdbstub_handle_t stub); /* * An implementation of the following functions is required * for the GDB stub to function. */ void * createThread_gdb( void (WINAPI *thread_function)( void *data), void *thread_data); void joinThread_gdb( void *thread_handle); #endif /* End of _GDBSTUB_H_ */ desmume-0.9.11/src/gfx3d.cpp0000755000000000000000000025146212467662066014301 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //This file implements the geometry engine hardware component. //This handles almost all of the work of 3d rendering, leaving the renderer //plugin responsible only for drawing primitives. //#define FLUSHMODE_HACK //--------------- //TODO TODO TODO TODO //make up mind once and for all whether fog, toon, etc. should reside in memory buffers (for easier handling in MMU) //if they do, then we need to copy them out in doFlush!!! //--------------- #include "gfx3d.h" #include #include #include #include #include #include "armcpu.h" #include "debug.h" #include "driver.h" #include "emufile.h" #include "matrix.h" #include "bits.h" #include "MMU.h" #include "render3D.h" #include "mem.h" #include "types.h" #include "saves.h" #include "NDSSystem.h" #include "readwrite.h" #include "FIFO.h" #include "movie.h" //only for currframecounter which really ought to be moved into the core emu.... //#define _SHOW_VTX_COUNTERS // show polygon/vertex counters on screen #ifdef _SHOW_VTX_COUNTERS u32 max_polys, max_verts; #include "GPU_OSD.h" #endif /* thoughts on flush timing: I think a flush is supposed to queue up and wait to happen during vblank sometime. But, we have some games that continue to do work after a flush but before a vblank. Since our timing is bad anyway, and we're not sure when the flush is really supposed to happen, then this leaves us in a bad situation. What makes it worse is that if flush is supposed to be deferred, then we have to queue these errant geometry commands. That would require a better gxfifo we have now, and some mechanism to block while the geometry engine is stalled (which doesnt exist). Since these errant games are nevertheless using flush command to represent the end of a frame, we deem this a good time to execute an actual flush. I think we originally didnt do this because we found some game that it glitched, but that may have been resolved since then by deferring actual rendering to the next vcount=0 (giving textures enough time to upload). But since we're not sure how we'll eventually want this, I am leaving it sort of reconfigurable, doing all the work in this function: */ static void gfx3d_doFlush(); #define GFX_NOARG_COMMAND 0x00 #define GFX_INVALID_COMMAND 0xFF #define GFX_UNDEFINED_COMMAND 0xCC static const u8 gfx3d_commandTypes[] = { /* 00 */ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //invalid commands; no parameters /* 10 */ 0x01,0x00,0x01,0x01,0x01,0x00,0x10,0x0C, 0x10,0x0C,0x09,0x03,0x03,0xCC,0xCC,0xCC, //matrix commands /* 20 */ 0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0xCC,0xCC,0xCC,0xCC, //vertex and per-vertex material commands /* 30 */ 0x01,0x01,0x01,0x01,0x20,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //lighting engine material commands /* 40 */ 0x01,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //begin and end /* 50 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //swapbuffers /* 60 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //viewport /* 70 */ 0x03,0x02,0x01,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //tests //0x80: /* 80 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* 90 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* A0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* B0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* C0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* D0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* E0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* F0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC }; class GXF_Hardware { public: GXF_Hardware() { reset(); } void reset() { shiftCommand = 0; paramCounter = 0; } void receive(u32 val) { //so, it seems as if the dummy values and restrictions on the highest-order command in the packed command set //is solely about some unknown internal timing quirk, and not about the logical behaviour of the state machine. //it's possible that writing some values too quickly can result in the gxfifo not being ready. //this would be especially troublesome when they're getting DMA'd nonstop with no delay. //so, since the timing is not emulated rigorously here, and only the logic, we shouldn't depend on or expect the dummy values. //indeed, some games aren't issuing them, and will break if they are expected. //however, since the dummy values seem to be 0x00000000 always, theyre benign to the state machine, even if the HW timing doesnt require them. //the actual logical rule seem to be: //1. commands with no arguments are executed as soon as possible; when the packed command is first received, or immediately after the preceding N-arg command. //1a. for example, a 0-arg command following an N-arg command doesn't require a dummy value //1b. for example, two 0-arg commands constituting a packed command will execute immediately when the packed command is received. // //as an example, DQ6 entity rendering will issue: //0x00151110 //0x00000000 //0x00171012 (next packed command) //this 0 param is meant for the 0x10 mtxMode command. dummy args aren't supplied for the 0x11 or 0x15. //but other times, the game will issue dummy parameters. //Either this is because the rules are more complex (do only certain 0-arg commands require dummies?), //or the game made a mistake in applying the rules, which didnt seem to irritate the hypothetical HW timing quirk. //yet, another time, it will issue the dummy: //0x00004123 (XYZ vertex) //0x0c000400 (arg1) //0x00000000 (arg2) //0x00000000 (dummy for 0x41) //0x00000017 (next packed command) u8 currCommand = shiftCommand & 0xFF; u8 currCommandType = gfx3d_commandTypes[currCommand]; //if the current command is invalid, receive a new packed command. if(currCommandType == GFX_INVALID_COMMAND) { shiftCommand = val; } //finish receiving args if(paramCounter>0) { GFX_FIFOsend(currCommand, val); paramCounter--; if(paramCounter <= 0) shiftCommand >>= 8; else return; } //analyze current packed commands for(;;) { currCommand = shiftCommand & 0xFF; currCommandType = gfx3d_commandTypes[currCommand]; if(currCommandType == GFX_UNDEFINED_COMMAND) shiftCommand >>= 8; else if(currCommandType == GFX_NOARG_COMMAND) { GFX_FIFOsend(currCommand, 0); shiftCommand >>= 8; } else if(currCommandType == GFX_INVALID_COMMAND) break; else { paramCounter = currCommandType; break; } } } private: u32 shiftCommand; u32 paramCounter; public: void savestate(EMUFILE *f) { write32le(2,f); //version write32le(shiftCommand,f); write32le(paramCounter,f); } bool loadstate(EMUFILE *f) { u32 version; if(read32le(&version,f) != 1) return false; u8 junk8; u32 junk32; if (version == 0) { //untested read32le(&junk32,f); int commandCursor = 4-junk32; for(u32 i=commandCursor;i<4;i++) read8le(&junk8,f); read32le(&junk32,f); for(u32 i=commandCursor;i<4;i++) read8le(&junk8,f); read8le(&junk8,f); } else if (version == 1) { //untested read32le(&junk32,f); read32le(&junk32,f); for(u32 i=0;i<4;i++) read8le(&junk8,f); for(u32 i=0;i<4;i++) read8le(&junk8,f); read8le(&junk8,f); } else if(version == 2) { read32le(&shiftCommand,f); read32le(¶mCounter,f); } return true; } } gxf_hardware; //these were 4 for the longest time (this is MUCH, MUCH less than their theoretical values) //but it was changed to 1 for strawberry shortcake, which was issuing direct commands //while the fifo was full, apparently expecting the fifo not to be full by that time. //in general we are finding that 3d takes less time than we think.... //although maybe the true culprit was charging the cpu less time for the dma. #define GFX_DELAY(x) NDS_RescheduleGXFIFO(1); #define GFX_DELAY_M2(x) NDS_RescheduleGXFIFO(1); using std::max; using std::min; GFX3D gfx3d; Viewer3d_State* viewer3d_state = NULL; static GFX3D_Clipper boxtestClipper; //tables that are provided to anyone CACHE_ALIGN u32 color_15bit_to_24bit_reverse[32768]; CACHE_ALIGN u32 color_15bit_to_24bit[32768]; CACHE_ALIGN u16 color_15bit_to_16bit_reverse[32768]; CACHE_ALIGN u8 mixTable555[32][32][32]; CACHE_ALIGN u32 dsDepthExtend_15bit_to_24bit[32768]; //is this a crazy idea? this table spreads 5 bits evenly over 31 from exactly 0 to INT_MAX CACHE_ALIGN const int material_5bit_to_31bit[] = { 0x00000000, 0x04210842, 0x08421084, 0x0C6318C6, 0x10842108, 0x14A5294A, 0x18C6318C, 0x1CE739CE, 0x21084210, 0x25294A52, 0x294A5294, 0x2D6B5AD6, 0x318C6318, 0x35AD6B5A, 0x39CE739C, 0x3DEF7BDE, 0x42108421, 0x46318C63, 0x4A5294A5, 0x4E739CE7, 0x5294A529, 0x56B5AD6B, 0x5AD6B5AD, 0x5EF7BDEF, 0x6318C631, 0x6739CE73, 0x6B5AD6B5, 0x6F7BDEF7, 0x739CE739, 0x77BDEF7B, 0x7BDEF7BD, 0x7FFFFFFF }; CACHE_ALIGN const u8 material_5bit_to_6bit[] = { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x19, 0x1A, 0x1C, 0x1E, 0x21, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x33, 0x35, 0x37, 0x39, 0x3B, 0x3D, 0x3F }; CACHE_ALIGN const u8 material_5bit_to_8bit[] = { 0x00, 0x08, 0x10, 0x18, 0x21, 0x29, 0x31, 0x39, 0x42, 0x4A, 0x52, 0x5A, 0x63, 0x6B, 0x73, 0x7B, 0x84, 0x8C, 0x94, 0x9C, 0xA5, 0xAD, 0xB5, 0xBD, 0xC6, 0xCE, 0xD6, 0xDE, 0xE7, 0xEF, 0xF7, 0xFF }; CACHE_ALIGN const u8 material_3bit_to_8bit[] = { 0x00, 0x24, 0x49, 0x6D, 0x92, 0xB6, 0xDB, 0xFF }; //maybe not very precise CACHE_ALIGN const u8 material_3bit_to_5bit[] = { 0, 4, 8, 13, 17, 22, 26, 31 }; //TODO - generate this in the static init method more accurately CACHE_ALIGN const u8 material_3bit_to_6bit[] = { 0, 8, 16, 26, 34, 44, 52, 63 }; //private acceleration tables static float float16table[65536]; static float float10Table[1024]; static float float10RelTable[1024]; static float normalTable[1024]; #define fix2float(v) (((float)((s32)(v))) / (float)(1<<12)) #define fix10_2float(v) (((float)((s32)(v))) / (float)(1<<9)) CACHE_ALIGN u8 gfx3d_convertedScreen[GFX3D_FRAMEBUFFER_WIDTH*GFX3D_FRAMEBUFFER_HEIGHT*4]; // Matrix stack handling CACHE_ALIGN MatrixStack mtxStack[4] = { MatrixStack(1, 0), // Projection stack MatrixStack(31, 1), // Coordinate stack MatrixStack(31, 2), // Directional stack MatrixStack(1, 3), // Texture stack }; int _hack_getMatrixStackLevel(int which) { return mtxStack[which].position; } static CACHE_ALIGN s32 mtxCurrent [4][16]; static CACHE_ALIGN s32 mtxTemporal[16]; static u32 mode = 0; // Indexes for matrix loading/multiplication static u8 ML4x4ind = 0; static u8 ML4x3ind = 0; static u8 MM4x4ind = 0; static u8 MM4x3ind = 0; static u8 MM3x3ind = 0; // Data for vertex submission static CACHE_ALIGN s16 s16coord[4] = {0, 0, 0, 0}; static char coordind = 0; static u32 vtxFormat = GFX3D_TRIANGLES; static BOOL inBegin = FALSE; // Data for basic transforms static CACHE_ALIGN s32 trans[4] = {0, 0, 0, 0}; static int transind = 0; static CACHE_ALIGN s32 scale[4] = {0, 0, 0, 0}; static int scaleind = 0; static u32 viewport = 0; //various other registers static s32 _t=0, _s=0; static s32 last_t, last_s; static u32 clCmd = 0; static u32 clInd = 0; static u32 clInd2 = 0; BOOL isSwapBuffers = FALSE; static u32 BTind = 0; static u32 PTind = 0; static CACHE_ALIGN u16 BTcoords[6] = {0, 0, 0, 0, 0, 0}; static CACHE_ALIGN float PTcoords[4] = {0.0, 0.0, 0.0, 1.0}; //raw ds format poly attributes static u32 polyAttr=0,textureFormat=0, texturePalette=0, polyAttrPending=0; //the current vertex color, 5bit values static u8 colorRGB[4] = { 31,31,31,31 }; u32 control = 0; //light state: static u32 lightColor[4] = {0,0,0,0}; static s32 lightDirection[4] = {0,0,0,0}; //material state: static u16 dsDiffuse, dsAmbient, dsSpecular, dsEmission; //used for indexing the shininess table during parameters to shininess command static int shininessInd = 0; //-----------cached things: //these dont need to go into the savestate. they can be regenerated from HW registers //from polygonattr: static unsigned int cullingMask=0; static u32 envMode=0; static u32 lightMask=0; //other things: static int texCoordinateTransform = 0; static CACHE_ALIGN s32 cacheLightDirection[4][4]; static CACHE_ALIGN s32 cacheHalfVector[4][4]; //------------------ #define RENDER_FRONT_SURFACE 0x80 #define RENDER_BACK_SURFACE 0X40 //-------------poly and vertex lists and such things POLYLIST* polylists = NULL; POLYLIST* polylist = NULL; VERTLIST* vertlists = NULL; VERTLIST* vertlist = NULL; int polygonListCompleted = 0; int listTwiddle = 1; int triStripToggle; //list-building state struct tmpVertInfo { //the number of verts registered in this list int count; //indices to the main vert list int map[4]; //indicates that the first poly in a list has been completed BOOL first; } tempVertInfo; static void twiddleLists() { listTwiddle++; listTwiddle &= 1; polylist = &polylists[listTwiddle]; vertlist = &vertlists[listTwiddle]; polylist->count = 0; vertlist->count = 0; } static BOOL flushPending = FALSE; static BOOL drawPending = FALSE; //------------------------------------------------------------ static void makeTables() { //produce the color bits of a 24bpp color from a DS RGB15 using bit logic (internal use only) #define RGB15TO24_BITLOGIC(col) ( (material_5bit_to_8bit[((col)>>10)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[(col)&0x1F] ) //produce the color bits of a 24bpp color from a DS RGB15 using bit logic (internal use only). RGB are reverse of usual #define RGB15TO24_BITLOGIC_REVERSE(col) ( (material_5bit_to_8bit[(col)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[((col)>>10)&0x1F] ) for(u16 i=0;i<32768;i++) { color_15bit_to_24bit[i] = LE_TO_LOCAL_32( RGB15TO24_BITLOGIC(i) ); color_15bit_to_24bit_reverse[i] = LE_TO_LOCAL_32( RGB15TO24_BITLOGIC_REVERSE(i) ); color_15bit_to_16bit_reverse[i] = (((i & 0x001F) << 11) | (material_5bit_to_6bit[(i & 0x03E0) >> 5] << 5) | ((i & 0x7C00) >> 10)); // 15-bit to 24-bit depth formula from http://nocash.emubase.de/gbatek.htm#ds3drearplane dsDepthExtend_15bit_to_24bit[i] = LE_TO_LOCAL_32( (i*0x200)+((i+1)>>15)*0x01FF ); } for (int i = 0; i < 65536; i++) float16table[i] = fix2float((signed short)i); for (int i = 0; i < 1024; i++) float10Table[i] = ((signed short)(i<<6)) / (float)(1<<12); for (int i = 0; i < 1024; i++) float10RelTable[i] = ((signed short)(i<<6)) / (float)(1<<18); for (int i = 0; i < 1024; i++) normalTable[i] = ((signed short)(i<<6)) / (float)(1<<15); for(int r=0;r<=31;r++) for(int oldr=0;oldr<=31;oldr++) for(int a=0;a<=31;a++) { int temp = (r*a + oldr*(31-a)) / 31; mixTable555[a][r][oldr] = temp; } } #define OSWRITE(x) os->fwrite((char*)&(x),sizeof((x))); #define OSREAD(x) is->fread((char*)&(x),sizeof((x))); void POLY::save(EMUFILE* os) { OSWRITE(type); OSWRITE(vertIndexes[0]); OSWRITE(vertIndexes[1]); OSWRITE(vertIndexes[2]); OSWRITE(vertIndexes[3]); OSWRITE(polyAttr); OSWRITE(texParam); OSWRITE(texPalette); OSWRITE(viewport); OSWRITE(miny); OSWRITE(maxy); } void POLY::load(EMUFILE* is) { OSREAD(type); OSREAD(vertIndexes[0]); OSREAD(vertIndexes[1]); OSREAD(vertIndexes[2]); OSREAD(vertIndexes[3]); OSREAD(polyAttr); OSREAD(texParam); OSREAD(texPalette); OSREAD(viewport); OSREAD(miny); OSREAD(maxy); } void VERT::save(EMUFILE* os) { OSWRITE(x); OSWRITE(y); OSWRITE(z); OSWRITE(w); OSWRITE(u); OSWRITE(v); OSWRITE(color[0]); OSWRITE(color[1]); OSWRITE(color[2]); OSWRITE(fcolor[0]); OSWRITE(fcolor[1]); OSWRITE(fcolor[2]); } void VERT::load(EMUFILE* is) { OSREAD(x); OSREAD(y); OSREAD(z); OSREAD(w); OSREAD(u); OSREAD(v); OSREAD(color[0]); OSREAD(color[1]); OSREAD(color[2]); OSREAD(fcolor[0]); OSREAD(fcolor[1]); OSREAD(fcolor[2]); } void gfx3d_init() { gxf_hardware.reset(); //gxf_hardware.test(); int zzz=9; //DWORD start = timeGetTime(); //for(int i=0;i<1000000000;i++) // MatrixMultVec4x4(mtxCurrent[0],mtxCurrent[1]); //DWORD end = timeGetTime(); //DWORD diff = end-start; //start = timeGetTime(); //for(int i=0;i<1000000000;i++) // MatrixMultVec4x4_b(mtxCurrent[0],mtxCurrent[1]); //end = timeGetTime(); //DWORD diff2 = end-start; //printf("SPEED TEST %d %d\n",diff,diff2); // Use malloc() instead of new because, for some unknown reason, GCC 4.9 has a bug // that causes a std::bad_alloc exception on certain memory allocations. Right now, // POLYLIST and VERTLIST are POD-style structs, so malloc() can substitute for new // in this case. if(polylists == NULL) { polylists = (POLYLIST *)malloc(sizeof(POLYLIST)*2); polylist = &polylists[0]; } if(vertlists == NULL) { vertlists = (VERTLIST *)malloc(sizeof(VERTLIST)*2); vertlist = &vertlists[0]; } makeTables(); gfx3d_reset(); } void gfx3d_reset() { gpu3D->NDS_3D_RenderFinish(); #ifdef _SHOW_VTX_COUNTERS max_polys = max_verts = 0; #endif reconstruct(&gfx3d); delete viewer3d_state; viewer3d_state = new Viewer3d_State(); gxf_hardware.reset(); control = 0; drawPending = FALSE; flushPending = FALSE; memset(polylists, 0, sizeof(POLYLIST)*2); memset(vertlists, 0, sizeof(VERTLIST)*2); gfx3d.state.invalidateToon = true; listTwiddle = 1; twiddleLists(); gfx3d.polylist = polylist; gfx3d.vertlist = vertlist; polyAttr = 0; textureFormat = 0; texturePalette = 0; polyAttrPending = 0; mode = 0; s16coord[0] = s16coord[1] = s16coord[2] = s16coord[3] = 0; coordind = 0; vtxFormat = GFX3D_TRIANGLES; memset(trans, 0, sizeof(trans)); transind = 0; memset(scale, 0, sizeof(scale)); scaleind = 0; viewport = 0; memset(gxPIPE.cmd, 0, sizeof(gxPIPE.cmd)); memset(gxPIPE.param, 0, sizeof(gxPIPE.param)); memset(colorRGB, 0, sizeof(colorRGB)); memset(&tempVertInfo, 0, sizeof(tempVertInfo)); MatrixInit (mtxCurrent[0]); MatrixInit (mtxCurrent[1]); MatrixInit (mtxCurrent[2]); MatrixInit (mtxCurrent[3]); MatrixInit (mtxTemporal); MatrixStackInit(&mtxStack[0]); MatrixStackInit(&mtxStack[1]); MatrixStackInit(&mtxStack[2]); MatrixStackInit(&mtxStack[3]); clCmd = 0; clInd = 0; ML4x4ind = 0; ML4x3ind = 0; MM4x4ind = 0; MM4x3ind = 0; MM3x3ind = 0; BTind = 0; PTind = 0; _t=0; _s=0; last_t = 0; last_s = 0; viewport = 0xBFFF0000; memset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen)); gfx3d.state.clearDepth = DS_DEPTH15TO24(0x7FFF); clInd2 = 0; isSwapBuffers = FALSE; GFX_PIPEclear(); GFX_FIFOclear(); } //================================================================================= Geometry Engine //================================================================================= //================================================================================= inline float vec3dot(float* a, float* b) { return (((a[0]) * (b[0])) + ((a[1]) * (b[1])) + ((a[2]) * (b[2]))); } FORCEINLINE s32 mul_fixed32(s32 a, s32 b) { return fx32_shiftdown(fx32_mul(a,b)); } FORCEINLINE s32 vec3dot_fixed32(const s32* a, const s32* b) { return fx32_shiftdown(fx32_mul(a[0],b[0]) + fx32_mul(a[1],b[1]) + fx32_mul(a[2],b[2])); } #define SUBMITVERTEX(ii, nn) polylist->list[polylist->count].vertIndexes[ii] = tempVertInfo.map[nn]; //Submit a vertex to the GE static void SetVertex() { s32 coord[3] = { s16coord[0], s16coord[1], s16coord[2] }; DS_ALIGN(16) s32 coordTransformed[4] = { coord[0], coord[1], coord[2], (1<<12) }; if (texCoordinateTransform == 3) { //Tested by: Eledees The Adventures of Kai and Zero (E) [title screen and frontend menus] last_s = (s32)(((s64)s16coord[0] * mtxCurrent[3][0] + (s64)s16coord[1] * mtxCurrent[3][4] + (s64)s16coord[2] * mtxCurrent[3][8] + (((s64)(_s))<<24))>>24); last_t = (s32)(((s64)s16coord[0] * mtxCurrent[3][1] + (s64)s16coord[1] * mtxCurrent[3][5] + (s64)s16coord[2] * mtxCurrent[3][9] + (((s64)(_t))<<24))>>24); } //refuse to do anything if we have too many verts or polys polygonListCompleted = 0; if(vertlist->count >= VERTLIST_SIZE) return; if(polylist->count >= POLYLIST_SIZE) return; //TODO - think about keeping the clip matrix concatenated, //so that we only have to multiply one matrix here //(we could lazy cache the concatenated clip matrix and only generate it //when we need to) MatrixMultVec4x4_M2(mtxCurrent[0], coordTransformed); //printf("%f %f %f\n",s16coord[0]/4096.0f,s16coord[1]/4096.0f,s16coord[2]/4096.0f); //printf("x %f %f %f %f\n",mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f); //printf(" = %f %f %f %f\n",coordTransformed[0]/4096.0f,coordTransformed[1]/4096.0f,coordTransformed[2]/4096.0f,coordTransformed[3]/4096.0f); //TODO - culling should be done here. //TODO - viewport transform? int continuation = 0; if(vtxFormat==GFX3D_TRIANGLE_STRIP && !tempVertInfo.first) continuation = 2; else if(vtxFormat==GFX3D_QUAD_STRIP && !tempVertInfo.first) continuation = 2; //record the vertex //VERT &vert = tempVertList.list[tempVertList.count]; int vertIndex = vertlist->count + tempVertInfo.count - continuation; if(vertIndex<0) { printf("wtf\n"); } VERT &vert = vertlist->list[vertIndex]; //printf("%f %f %f\n",coordTransformed[0],coordTransformed[1],coordTransformed[2]); //if(coordTransformed[1] > 20) // coordTransformed[1] = 20; //printf("y-> %f\n",coord[1]); //if(mtxCurrent[1][14]>15) { // printf("ACK!\n"); // printf("----> modelview 1 state for that ack:\n"); // //MatrixPrint(mtxCurrent[1]); //} vert.texcoord[0] = last_s/16.0f; vert.texcoord[1] = last_t/16.0f; vert.coord[0] = coordTransformed[0]/4096.0f; vert.coord[1] = coordTransformed[1]/4096.0f; vert.coord[2] = coordTransformed[2]/4096.0f; vert.coord[3] = coordTransformed[3]/4096.0f; vert.color[0] = GFX3D_5TO6(colorRGB[0]); vert.color[1] = GFX3D_5TO6(colorRGB[1]); vert.color[2] = GFX3D_5TO6(colorRGB[2]); tempVertInfo.map[tempVertInfo.count] = vertlist->count + tempVertInfo.count - continuation; tempVertInfo.count++; //possibly complete a polygon { polygonListCompleted = 2; switch(vtxFormat) { case GFX3D_TRIANGLES: if(tempVertInfo.count!=3) break; polygonListCompleted = 1; //vertlist->list[polylist->list[polylist->count].vertIndexes[i] = vertlist->count++] = tempVertList.list[n]; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,2); vertlist->count+=3; polylist->list[polylist->count].type = 3; tempVertInfo.count = 0; break; case GFX3D_QUADS: if(tempVertInfo.count!=4) break; polygonListCompleted = 1; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,2); SUBMITVERTEX(3,3); vertlist->count+=4; polylist->list[polylist->count].type = 4; tempVertInfo.count = 0; break; case GFX3D_TRIANGLE_STRIP: if(tempVertInfo.count!=3) break; polygonListCompleted = 1; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,2); polylist->list[polylist->count].type = 3; if(triStripToggle) tempVertInfo.map[1] = vertlist->count+2-continuation; else tempVertInfo.map[0] = vertlist->count+2-continuation; if(tempVertInfo.first) vertlist->count+=3; else vertlist->count+=1; triStripToggle ^= 1; tempVertInfo.first = false; tempVertInfo.count = 2; break; case GFX3D_QUAD_STRIP: if(tempVertInfo.count!=4) break; polygonListCompleted = 1; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,3); SUBMITVERTEX(3,2); polylist->list[polylist->count].type = 4; tempVertInfo.map[0] = vertlist->count+2-continuation; tempVertInfo.map[1] = vertlist->count+3-continuation; if(tempVertInfo.first) vertlist->count+=4; else vertlist->count+=2; tempVertInfo.first = false; tempVertInfo.count = 2; break; default: return; } if(polygonListCompleted == 1) { POLY &poly = polylist->list[polylist->count]; poly.vtxFormat = vtxFormat; // Line segment detect // Tested" Castlevania POR - warp stone, trajectory of ricochet, "Eye of Decay" if (!(textureFormat & (7 << 26))) // no texture { bool duplicated = false; VERT &vert0 = vertlist->list[poly.vertIndexes[0]]; VERT &vert1 = vertlist->list[poly.vertIndexes[1]]; VERT &vert2 = vertlist->list[poly.vertIndexes[2]]; if ( (vert0.x == vert1.x) && (vert0.y == vert1.y) ) duplicated = true; else if ( (vert1.x == vert2.x) && (vert1.y == vert2.y) ) duplicated = true; else if ( (vert0.y == vert1.y) && (vert1.y == vert2.y) ) duplicated = true; else if ( (vert0.x == vert1.x) && (vert1.x == vert2.x) ) duplicated = true; if (duplicated) { //printf("Line Segmet detected (poly type %i, mode %i, texparam %08X)\n", poly.type, poly.vtxFormat, textureFormat); poly.vtxFormat = vtxFormat + 4; } } poly.polyAttr = polyAttr; poly.texParam = textureFormat; poly.texPalette = texturePalette; poly.viewport = viewport; polylist->count++; } } } static void gfx3d_glPolygonAttrib_cache() { // Light enable/disable lightMask = (polyAttr&0xF); // texture environment envMode = (polyAttr&0x30)>>4; // back face culling cullingMask = (polyAttr>>6)&3; } static void gfx3d_glTexImage_cache() { texCoordinateTransform = (textureFormat>>30); } static void gfx3d_glLightDirection_cache(int index) { s32 v = lightDirection[index]; s16 x = ((v<<22)>>22)<<3; s16 y = ((v<<12)>>22)<<3; s16 z = ((v<<2)>>22)<<3; cacheLightDirection[index][0] = x; cacheLightDirection[index][1] = y; cacheLightDirection[index][2] = z; cacheLightDirection[index][3] = 0; //Multiply the vector by the directional matrix MatrixMultVec3x3_fixed(mtxCurrent[2], cacheLightDirection[index]); //Calculate the half angle vector s32 lineOfSight[4] = {0, 0, (-1)<<12, 0}; for(int i = 0; i < 4; i++) { cacheHalfVector[index][i] = ((cacheLightDirection[index][i] + lineOfSight[i])); } //normalize the half angle vector //can't believe the hardware really does this... but yet it seems... s32 halfLength = ((s32)(sqrt((double)vec3dot_fixed32(cacheHalfVector[index],cacheHalfVector[index]))))<<6; if(halfLength!=0) { halfLength = abs(halfLength); halfLength >>= 6; for(int i = 0; i < 4; i++) { s32 temp = cacheHalfVector[index][i]; temp <<= 6; temp /= halfLength; cacheHalfVector[index][i] = temp; } } } //=============================================================================== static void gfx3d_glMatrixMode(u32 v) { mode = (v&3); GFX_DELAY(1); } static void gfx3d_glPushMatrix() { //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); MatrixStackPushMatrix(&mtxStack[mymode], mtxCurrent[mymode]); GFX_DELAY(17); if(mymode==2) MatrixStackPushMatrix (&mtxStack[1], mtxCurrent[1]); } static void gfx3d_glPopMatrix(s32 i) { // The stack has only one level (at address 0) in projection mode, // in that mode, the parameter value is ignored, the offset is always +1 in that mode. if (mode == 0) i = 1; //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); //i = (i<<26)>>26; //previously, we sign extended here. that isnt really necessary since the stacks are apparently modularly addressed. so i am somewhat doubtful that this is a real concept. //example: //suppose we had a -30 that would be %100010. //which is the same as adding 34. if our stack was at 17 then one way is 17-30(+32)=19 and the other way is 17+34(-32)=19 //please note that our ability to skip treating this as signed is dependent on the modular addressing later. if that ever changes, we need to change this back. MatrixStackPopMatrix(mtxCurrent[mymode], &mtxStack[mymode], i); GFX_DELAY(36); if (mymode == 2) MatrixStackPopMatrix(mtxCurrent[1], &mtxStack[1], i); } static void gfx3d_glStoreMatrix(u32 v) { //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); //limit height of these stacks. //without the mymode==3 namco classics galaxian will try to use pos=1 and overrun the stack, corrupting emu if(mymode==0 || mymode==3) v = 0; v &= 31; //according to gbatek, 31 works but sets the stack overflow flag //spider-man 2 tests this on the spiderman model (and elsewhere) //i am somewhat skeptical of this, but we'll leave it this way for now. //a test shouldnt be too hard if(v==31) MMU_new.gxstat.se = 1; MatrixStackLoadMatrix (&mtxStack[mymode], v, mtxCurrent[mymode]); GFX_DELAY(17); if(mymode==2) MatrixStackLoadMatrix (&mtxStack[1], v, mtxCurrent[1]); } static void gfx3d_glRestoreMatrix(u32 v) { //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); //limit height of these stacks //without the mymode==3 namco classics galaxian will try to use pos=1 and overrun the stack, corrupting emu if(mymode==0 || mymode==3) v = 0; v &= 31; //according to gbatek, 31 works but sets the stack overflow flag //spider-man 2 tests this on the spiderman model (and elsewhere) //i am somewhat skeptical of this, but we'll leave it this way for now. //a test shouldnt be too hard if(v==31) MMU_new.gxstat.se = 1; MatrixCopy (mtxCurrent[mymode], MatrixStackGetPos(&mtxStack[mymode], v)); GFX_DELAY(36); if (mymode == 2) MatrixCopy (mtxCurrent[1], MatrixStackGetPos(&mtxStack[1], v)); } static void gfx3d_glLoadIdentity() { MatrixIdentity (mtxCurrent[mode]); GFX_DELAY(19); if (mode == 2) MatrixIdentity (mtxCurrent[1]); //printf("identity: %d to: \n",mode); MatrixPrint(mtxCurrent[1]); } static BOOL gfx3d_glLoadMatrix4x4(s32 v) { mtxCurrent[mode][ML4x4ind] = v; ++ML4x4ind; if(ML4x4ind<16) return FALSE; ML4x4ind = 0; GFX_DELAY(19); //vector_fix2float<4>(mtxCurrent[mode], 4096.f); if (mode == 2) MatrixCopy (mtxCurrent[1], mtxCurrent[2]); //printf("load4x4: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); return TRUE; } static BOOL gfx3d_glLoadMatrix4x3(s32 v) { mtxCurrent[mode][ML4x3ind] = v; ML4x3ind++; if((ML4x3ind & 0x03) == 3) ML4x3ind++; if(ML4x3ind<16) return FALSE; ML4x3ind = 0; //vector_fix2float<4>(mtxCurrent[mode], 4096.f); //fill in the unusued matrix values mtxCurrent[mode][3] = mtxCurrent[mode][7] = mtxCurrent[mode][11] = 0; mtxCurrent[mode][15] = (1<<12); GFX_DELAY(30); if (mode == 2) MatrixCopy (mtxCurrent[1], mtxCurrent[2]); //printf("load4x3: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); return TRUE; } static BOOL gfx3d_glMultMatrix4x4(s32 v) { mtxTemporal[MM4x4ind] = v; MM4x4ind++; if(MM4x4ind<16) return FALSE; MM4x4ind = 0; GFX_DELAY(35); //vector_fix2float<4>(mtxTemporal, 4096.f); MatrixMultiply (mtxCurrent[mode], mtxTemporal); if (mode == 2) { MatrixMultiply (mtxCurrent[1], mtxTemporal); GFX_DELAY_M2(30); } //printf("mult4x4: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); MatrixIdentity (mtxTemporal); return TRUE; } static BOOL gfx3d_glMultMatrix4x3(s32 v) { mtxTemporal[MM4x3ind] = v; MM4x3ind++; if((MM4x3ind & 0x03) == 3) MM4x3ind++; if(MM4x3ind<16) return FALSE; MM4x3ind = 0; GFX_DELAY(31); //vector_fix2float<4>(mtxTemporal, 4096.f); //fill in the unusued matrix values mtxTemporal[3] = mtxTemporal[7] = mtxTemporal[11] = 0; mtxTemporal[15] = 1<<12; MatrixMultiply (mtxCurrent[mode], mtxTemporal); if (mode == 2) { MatrixMultiply (mtxCurrent[1], mtxTemporal); GFX_DELAY_M2(30); } //printf("mult4x3: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); //does this really need to be done? MatrixIdentity (mtxTemporal); return TRUE; } static BOOL gfx3d_glMultMatrix3x3(s32 v) { mtxTemporal[MM3x3ind] = v; MM3x3ind++; if((MM3x3ind & 0x03) == 3) MM3x3ind++; if(MM3x3ind<12) return FALSE; MM3x3ind = 0; GFX_DELAY(28); //vector_fix2float<3>(mtxTemporal, 4096.f); //fill in the unusued matrix values mtxTemporal[3] = mtxTemporal[7] = mtxTemporal[11] = 0; mtxTemporal[15] = 1<<12; mtxTemporal[12] = mtxTemporal[13] = mtxTemporal[14] = 0; MatrixMultiply (mtxCurrent[mode], mtxTemporal); if (mode == 2) { MatrixMultiply (mtxCurrent[1], mtxTemporal); GFX_DELAY_M2(30); } //printf("mult3x3: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); //does this really need to be done? MatrixIdentity (mtxTemporal); return TRUE; } static BOOL gfx3d_glScale(s32 v) { scale[scaleind] = v; ++scaleind; if(scaleind<3) return FALSE; scaleind = 0; MatrixScale (mtxCurrent[(mode==2?1:mode)], scale); //printf("scale: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); GFX_DELAY(22); //note: pos-vector mode should not cause both matrices to scale. //the whole purpose is to keep the vector matrix orthogonal //so, I am leaving this commented out as an example of what not to do. //if (mode == 2) // MatrixScale (mtxCurrent[1], scale); return TRUE; } static BOOL gfx3d_glTranslate(s32 v) { trans[transind] = v; ++transind; if(transind<3) return FALSE; transind = 0; MatrixTranslate (mtxCurrent[mode], trans); GFX_DELAY(22); if (mode == 2) { MatrixTranslate (mtxCurrent[1], trans); GFX_DELAY_M2(30); } //printf("translate: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); return TRUE; } static void gfx3d_glColor3b(u32 v) { colorRGB[0] = (v&0x1F); colorRGB[1] = ((v>>5)&0x1F); colorRGB[2] = ((v>>10)&0x1F); GFX_DELAY(1); } static void gfx3d_glNormal(s32 v) { s16 nx = ((v<<22)>>22)<<3; s16 ny = ((v<<12)>>22)<<3; s16 nz = ((v<<2)>>22)<<3; CACHE_ALIGN s32 normal[4] = { nx,ny,nz,(1<<12) }; if (texCoordinateTransform == 2) { //SM64 highlight rendered star in main menu tests this //also smackdown 2010 player textures tested this (needed cast on _s and _t) last_s = (s32)(((s64)normal[0] * mtxCurrent[3][0] + (s64)normal[1] * mtxCurrent[3][4] + (s64)normal[2] * mtxCurrent[3][8] + (((s64)_s)<<24))>>24); last_t = (s32)(((s64)normal[0] * mtxCurrent[3][1] + (s64)normal[1] * mtxCurrent[3][5] + (s64)normal[2] * mtxCurrent[3][9] + (((s64)_t)<<24))>>24); } MatrixMultVec3x3_fixed(mtxCurrent[2],normal); //apply lighting model u8 diffuse[3] = { (dsDiffuse)&0x1F, (dsDiffuse>>5)&0x1F, (dsDiffuse>>10)&0x1F }; u8 ambient[3] = { (dsAmbient)&0x1F, (dsAmbient>>5)&0x1F, (dsAmbient>>10)&0x1F }; u8 emission[3] = { (dsEmission)&0x1F, (dsEmission>>5)&0x1F, (dsEmission>>10)&0x1F }; u8 specular[3] = { (dsSpecular)&0x1F, (dsSpecular>>5)&0x1F, (dsSpecular>>10)&0x1F }; int vertexColor[3] = { emission[0], emission[1], emission[2] }; for(int i=0; i<4; i++) { if(!((lightMask>>i)&1)) continue; u8 _lightColor[3] = { (lightColor[i])&0x1F, (lightColor[i]>>5)&0x1F, (lightColor[i]>>10)&0x1F }; //This formula is the one used by the DS //Reference : http://nocash.emubase.de/gbatek.htm#ds3dpolygonlightparameters s32 fixed_diffuse = std::max(0,-vec3dot_fixed32(cacheLightDirection[i],normal)); //todo - this could be cached in this form s32 fixedTempNegativeHalf[] = {-cacheHalfVector[i][0],-cacheHalfVector[i][1],-cacheHalfVector[i][2],-cacheHalfVector[i][3]}; s32 dot = vec3dot_fixed32(fixedTempNegativeHalf, normal); s32 fixedshininess = 0; if(dot>0) //prevent shininess on opposite side { //we have cos(a). it seems that we need cos(2a). trig identity is a fast way to get it. //cos^2(a)=(1/2)(1+cos(2a)) //2*cos^2(a)-1=cos(2a) fixedshininess = 2*mul_fixed32(dot,dot)-4096; //gbatek is almost right but not quite! } //this seems to need to be saturated, or else the table will overflow. //even without a table, failure to saturate is bad news fixedshininess = std::min(fixedshininess,4095); fixedshininess = std::max(fixedshininess,0); if(dsSpecular & 0x8000) { //shininess is 20.12 fixed point, so >>5 gives us .7 which is 128 entries //the entries are 8bits each so <<4 gives us .12 again, compatible with the lighting formulas below //(according to other normal nds procedures, we might should fill the bottom bits with 1 or 0 according to rules...) fixedshininess = gfx3d.state.shininessTable[fixedshininess>>5]<<4; } for(int c = 0; c < 3; c++) { s32 specComp = ((specular[c] * _lightColor[c] * fixedshininess)>>17); //5 bits for color*color and 12 bits for the shininess s32 diffComp = ((diffuse[c] * _lightColor[c] * fixed_diffuse)>>17); //5bits for the color*color and 12 its for the diffuse s32 ambComp = ((ambient[c] * _lightColor[c])>>5); //5bits for color*color vertexColor[c] += specComp + diffComp + ambComp; } } for(int c=0;c<3;c++) { colorRGB[c] = std::min(31,vertexColor[c]); } GFX_DELAY(9); GFX_DELAY_M2((lightMask) & 0x01); GFX_DELAY_M2((lightMask>>1) & 0x01); GFX_DELAY_M2((lightMask>>2) & 0x01); GFX_DELAY_M2((lightMask>>3) & 0x01); } static void gfx3d_glTexCoord(s32 val) { _s = ((val<<16)>>16); _t = (val>>16); if (texCoordinateTransform == 1) { //dragon quest 4 overworld will test this last_s = (s32)(((s64)(_s<<12) * mtxCurrent[3][0] + (s64)(_t<<12) * mtxCurrent[3][4] + ((s64)mtxCurrent[3][8]<<12) + ((s64)mtxCurrent[3][12]<<12))>>24); last_t = (s32)(((s64)(_s<<12) * mtxCurrent[3][1] + (s64)(_t<<12) * mtxCurrent[3][5] + ((s64)mtxCurrent[3][9]<<12) + ((s64)mtxCurrent[3][13]<<12))>>24); } else if(texCoordinateTransform == 0) { last_s=_s; last_t=_t; } GFX_DELAY(1); } static BOOL gfx3d_glVertex16b(s32 v) { if(coordind==0) { s16coord[0] = (v<<16)>>16; s16coord[1] = (v>>16)&0xFFFF; ++coordind; return FALSE; } s16coord[2] = (v<<16)>>16; coordind = 0; SetVertex (); GFX_DELAY(9); return TRUE; } static void gfx3d_glVertex10b(s32 v) { //TODO TODO TODO - contemplate the sign extension - shift in zeroes or ones? zeroes is certainly more normal.. s16coord[0] = ((v<<22)>>22)<<6; s16coord[1] = ((v<<12)>>22)<<6; s16coord[2] = ((v<<2)>>22)<<6; GFX_DELAY(8); SetVertex (); } template static void gfx3d_glVertex3_cord(s32 v) { s16coord[ONE] = (v<<16)>>16; s16coord[TWO] = (v>>16); SetVertex (); GFX_DELAY(8); } static void gfx3d_glVertex_rel(s32 v) { s16 x = ((v<<22)>>22); s16 y = ((v<<12)>>22); s16 z = ((v<<2)>>22); s16coord[0] += x; s16coord[1] += y; s16coord[2] += z; SetVertex (); GFX_DELAY(8); } static void gfx3d_glPolygonAttrib (u32 val) { if(inBegin) { //PROGINFO("Set polyattr in the middle of a begin/end pair.\n (This won't be activated until the next begin)\n"); //TODO - we need some some similar checking for teximageparam etc. } polyAttrPending = val; GFX_DELAY(1); } static void gfx3d_glTexImage(u32 val) { textureFormat = val; gfx3d_glTexImage_cache(); GFX_DELAY(1); } static void gfx3d_glTexPalette(u32 val) { texturePalette = val; GFX_DELAY(1); } /* 0-4 Diffuse Reflection Red 5-9 Diffuse Reflection Green 10-14 Diffuse Reflection Blue 15 Set Vertex Color (0=No, 1=Set Diffuse Reflection Color as Vertex Color) 16-20 Ambient Reflection Red 21-25 Ambient Reflection Green 26-30 Ambient Reflection Blue */ static void gfx3d_glMaterial0(u32 val) { dsDiffuse = val&0xFFFF; dsAmbient = val>>16; if (BIT15(val)) { colorRGB[0] = (val)&0x1F; colorRGB[1] = (val>>5)&0x1F; colorRGB[2] = (val>>10)&0x1F; } GFX_DELAY(4); } static void gfx3d_glMaterial1(u32 val) { dsSpecular = val&0xFFFF; dsEmission = val>>16; GFX_DELAY(4); } /* 0-9 Directional Vector's X component (1bit sign + 9bit fractional part) 10-19 Directional Vector's Y component (1bit sign + 9bit fractional part) 20-29 Directional Vector's Z component (1bit sign + 9bit fractional part) 30-31 Light Number (0..3) */ static void gfx3d_glLightDirection (u32 v) { int index = v>>30; lightDirection[index] = (s32)(v&0x3FFFFFFF); gfx3d_glLightDirection_cache(index); GFX_DELAY(6); } static void gfx3d_glLightColor (u32 v) { int index = v>>30; lightColor[index] = v; GFX_DELAY(1); } static BOOL gfx3d_glShininess (u32 val) { gfx3d.state.shininessTable[shininessInd++] = ((val & 0xFF)); gfx3d.state.shininessTable[shininessInd++] = (((val >> 8) & 0xFF)); gfx3d.state.shininessTable[shininessInd++] = (((val >> 16) & 0xFF)); gfx3d.state.shininessTable[shininessInd++] = (((val >> 24) & 0xFF)); if (shininessInd < 128) return FALSE; shininessInd = 0; GFX_DELAY(32); return TRUE; } static void gfx3d_glBegin(u32 v) { inBegin = TRUE; vtxFormat = v&0x03; triStripToggle = 0; tempVertInfo.count = 0; tempVertInfo.first = true; polyAttr = polyAttrPending; gfx3d_glPolygonAttrib_cache(); GFX_DELAY(1); } static void gfx3d_glEnd(void) { tempVertInfo.count = 0; inBegin = FALSE; GFX_DELAY(1); } // swap buffers - skipped static void gfx3d_glViewPort(u32 v) { viewport = v; GFX_DELAY(1); } static BOOL gfx3d_glBoxTest(u32 v) { //printf("boxtest\n"); MMU_new.gxstat.tr = 0; // clear boxtest bit MMU_new.gxstat.tb = 1; // busy BTcoords[BTind++] = v & 0xFFFF; BTcoords[BTind++] = v >> 16; if (BTind < 5) return FALSE; BTind = 0; MMU_new.gxstat.tb = 0; // clear busy GFX_DELAY(103); #if 0 INFO("BoxTEST: x %f y %f width %f height %f depth %f\n", BTcoords[0], BTcoords[1], BTcoords[2], BTcoords[3], BTcoords[4], BTcoords[5]); /*for (int i = 0; i < 16; i++) { INFO("mtx1[%i] = %f ", i, mtxCurrent[1][i]); if ((i+1) % 4 == 0) INFO("\n"); } INFO("\n");*/ #endif //(crafted to be clear, not fast.) //nanostray title, ff4, ice age 3 depend on this and work //garfields nightmare and strawberry shortcake DO DEPEND on the overflow behavior. u16 ux = BTcoords[0]; u16 uy = BTcoords[1]; u16 uz = BTcoords[2]; u16 uw = BTcoords[3]; u16 uh = BTcoords[4]; u16 ud = BTcoords[5]; //craft the coords by adding extents to startpoint float x = float16table[ux]; float y = float16table[uy]; float z = float16table[uz]; float xw = float16table[(ux+uw)&0xFFFF]; //&0xFFFF not necessary for u16+u16 addition but added for emphasis float yh = float16table[(uy+uh)&0xFFFF]; float zd = float16table[(uz+ud)&0xFFFF]; //eight corners of cube CACHE_ALIGN VERT verts[8]; verts[0].set_coord(x,y,z,1); verts[1].set_coord(xw,y,z,1); verts[2].set_coord(xw,yh,z,1); verts[3].set_coord(x,yh,z,1); verts[4].set_coord(x,y,zd,1); verts[5].set_coord(xw,y,zd,1); verts[6].set_coord(xw,yh,zd,1); verts[7].set_coord(x,yh,zd,1); //craft the faces of the box (clockwise) POLY polys[6]; polys[0].setVertIndexes(7,6,5,4); //near polys[1].setVertIndexes(0,1,2,3); //far polys[2].setVertIndexes(0,3,7,4); //left polys[3].setVertIndexes(6,2,1,5); //right polys[4].setVertIndexes(3,2,6,7); //top polys[5].setVertIndexes(0,4,5,1); //bottom //setup the clipper GFX3D_Clipper::TClippedPoly tempClippedPoly; boxtestClipper.clippedPolys = &tempClippedPoly; boxtestClipper.reset(); ////----------------------------- ////awesome hack: ////emit the box as geometry for testing //for(int i=0;i<6;i++) //{ // POLY* poly = &polys[i]; // VERT* vertTable[4] = { // &verts[poly->vertIndexes[0]], // &verts[poly->vertIndexes[1]], // &verts[poly->vertIndexes[2]], // &verts[poly->vertIndexes[3]] // }; // gfx3d_glBegin(1); // for(int i=0;i<4;i++) { // coord[0] = vertTable[i]->x; // coord[1] = vertTable[i]->y; // coord[2] = vertTable[i]->z; // SetVertex(); // } // gfx3d_glEnd(); //} ////--------------------- //transform all coords for(int i=0;i<8;i++) { //this cant work. its left as a reminder that we could (and probably should) do the boxtest in all fixed point values //MatrixMultVec4x4_M2(mtxCurrent[0], verts[i].coord); //but change it all to floating point and do it that way instead CACHE_ALIGN float temp1[16] = {mtxCurrent[1][0]/4096.0f,mtxCurrent[1][1]/4096.0f,mtxCurrent[1][2]/4096.0f,mtxCurrent[1][3]/4096.0f,mtxCurrent[1][4]/4096.0f,mtxCurrent[1][5]/4096.0f,mtxCurrent[1][6]/4096.0f,mtxCurrent[1][7]/4096.0f,mtxCurrent[1][8]/4096.0f,mtxCurrent[1][9]/4096.0f,mtxCurrent[1][10]/4096.0f,mtxCurrent[1][11]/4096.0f,mtxCurrent[1][12]/4096.0f,mtxCurrent[1][13]/4096.0f,mtxCurrent[1][14]/4096.0f,mtxCurrent[1][15]/4096.0f}; CACHE_ALIGN float temp0[16] = {mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f,mtxCurrent[0][4]/4096.0f,mtxCurrent[0][5]/4096.0f,mtxCurrent[0][6]/4096.0f,mtxCurrent[0][7]/4096.0f,mtxCurrent[0][8]/4096.0f,mtxCurrent[0][9]/4096.0f,mtxCurrent[0][10]/4096.0f,mtxCurrent[0][11]/4096.0f,mtxCurrent[0][12]/4096.0f,mtxCurrent[0][13]/4096.0f,mtxCurrent[0][14]/4096.0f,mtxCurrent[0][15]/4096.0f}; DS_ALIGN(16) VERT_POS4f vert = { verts[i].x, verts[i].y, verts[i].z, verts[i].w }; _NOSSE_MatrixMultVec4x4(temp1,verts[i].coord); _NOSSE_MatrixMultVec4x4(temp0,verts[i].coord); } //clip each poly for(int i=0;i<6;i++) { POLY* poly = &polys[i]; VERT* vertTable[4] = { &verts[poly->vertIndexes[0]], &verts[poly->vertIndexes[1]], &verts[poly->vertIndexes[2]], &verts[poly->vertIndexes[3]] }; boxtestClipper.clipPoly(poly,vertTable); //if any portion of this poly was retained, then the test passes. if(boxtestClipper.clippedPolyCounter>0) { //printf("%06d PASS %d\n",boxcounter,gxFIFO.size); MMU_new.gxstat.tr = 1; break; } } if(MMU_new.gxstat.tr == 0) { //printf("%06d FAIL %d\n",boxcounter,gxFIFO.size); } return TRUE; } static BOOL gfx3d_glPosTest(u32 v) { //printf("postest\n"); //this is apparently tested by transformers decepticons and ultimate spiderman //printf("POSTEST\n"); MMU_new.gxstat.tb = 1; PTcoords[PTind++] = float16table[v & 0xFFFF]; PTcoords[PTind++] = float16table[v >> 16]; if (PTind < 3) return FALSE; PTind = 0; PTcoords[3] = 1.0f; CACHE_ALIGN float temp1[16] = {mtxCurrent[1][0]/4096.0f,mtxCurrent[1][1]/4096.0f,mtxCurrent[1][2]/4096.0f,mtxCurrent[1][3]/4096.0f,mtxCurrent[1][4]/4096.0f,mtxCurrent[1][5]/4096.0f,mtxCurrent[1][6]/4096.0f,mtxCurrent[1][7]/4096.0f,mtxCurrent[1][8]/4096.0f,mtxCurrent[1][9]/4096.0f,mtxCurrent[1][10]/4096.0f,mtxCurrent[1][11]/4096.0f,mtxCurrent[1][12]/4096.0f,mtxCurrent[1][13]/4096.0f,mtxCurrent[1][14]/4096.0f,mtxCurrent[1][15]/4096.0f}; CACHE_ALIGN float temp0[16] = {mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f,mtxCurrent[0][4]/4096.0f,mtxCurrent[0][5]/4096.0f,mtxCurrent[0][6]/4096.0f,mtxCurrent[0][7]/4096.0f,mtxCurrent[0][8]/4096.0f,mtxCurrent[0][9]/4096.0f,mtxCurrent[0][10]/4096.0f,mtxCurrent[0][11]/4096.0f,mtxCurrent[0][12]/4096.0f,mtxCurrent[0][13]/4096.0f,mtxCurrent[0][14]/4096.0f,mtxCurrent[0][15]/4096.0f}; MatrixMultVec4x4(temp1, PTcoords); MatrixMultVec4x4(temp0, PTcoords); MMU_new.gxstat.tb = 0; GFX_DELAY(9); return TRUE; } static void gfx3d_glVecTest(u32 v) { //printf("vectest\n"); GFX_DELAY(5); //this is tested by phoenix wright in its evidence inspector modelviewer //i am not sure exactly what it is doing, maybe it is testing to ensure //that the normal vector for the point of interest is camera-facing. CACHE_ALIGN float normal[4] = { normalTable[v&1023], normalTable[(v>>10)&1023], normalTable[(v>>20)&1023], 0}; CACHE_ALIGN float temp[16] = {mtxCurrent[2][0]/4096.0f,mtxCurrent[2][1]/4096.0f,mtxCurrent[2][2]/4096.0f,mtxCurrent[2][3]/4096.0f,mtxCurrent[2][4]/4096.0f,mtxCurrent[2][5]/4096.0f,mtxCurrent[2][6]/4096.0f,mtxCurrent[2][7]/4096.0f,mtxCurrent[2][8]/4096.0f,mtxCurrent[2][9]/4096.0f,mtxCurrent[2][10]/4096.0f,mtxCurrent[2][11]/4096.0f,mtxCurrent[2][12]/4096.0f,mtxCurrent[2][13]/4096.0f,mtxCurrent[2][14]/4096.0f,mtxCurrent[2][15]/4096.0f}; MatrixMultVec4x4(temp, normal); s16 x = (s16)(normal[0]*4096); s16 y = (s16)(normal[1]*4096); s16 z = (s16)(normal[2]*4096); MMU_new.gxstat.tb = 0; // clear busy T1WriteWord(MMU.MMU_MEM[0][0x40], 0x630, x); T1WriteWord(MMU.MMU_MEM[0][0x40], 0x632, y); T1WriteWord(MMU.MMU_MEM[0][0x40], 0x634, z); } //================================================================================= Geometry Engine //================================================================================= (end) //================================================================================= void VIEWPORT::decode(u32 v) { x = (v&0xFF); y = std::min(191,(int)(((v>>8)&0xFF))); width = (((v>>16)&0xFF)+1)-(v&0xFF); height = ((v>>24)+1)-((v>>8)&0xFF); } void gfx3d_glFogColor(u32 v) { gfx3d.state.fogColor = v; } void gfx3d_glFogOffset (u32 v) { gfx3d.state.fogOffset = (v&0x7fff); } void gfx3d_glClearDepth(u32 v) { gfx3d.state.clearDepth = DS_DEPTH15TO24(v); } // Ignored for now void gfx3d_glSwapScreen(unsigned int screen) { } int gfx3d_GetNumPolys() { //so is this in the currently-displayed or currently-built list? return (polylists[listTwiddle].count); } int gfx3d_GetNumVertex() { //so is this in the currently-displayed or currently-built list? return (vertlists[listTwiddle].count); } void gfx3d_UpdateToonTable(u8 offset, u16 val) { gfx3d.state.invalidateToon = true; gfx3d.state.u16ToonTable[offset] = val; //printf("toon %d set to %04X\n",offset,val); } void gfx3d_UpdateToonTable(u8 offset, u32 val) { //C.O.P. sets toon table via this method gfx3d.state.invalidateToon = true; gfx3d.state.u16ToonTable[offset] = val & 0xFFFF; gfx3d.state.u16ToonTable[offset+1] = val >> 16; //printf("toon %d set to %04X\n",offset,gfx3d.state.u16ToonTable[offset]); //printf("toon %d set to %04X\n",offset+1,gfx3d.state.u16ToonTable[offset+1]); } s32 gfx3d_GetClipMatrix (unsigned int index) { s32 val = MatrixGetMultipliedIndex (index, mtxCurrent[0], mtxCurrent[1]); //printf("reading clip matrix: %d\n",index); return (s32)val; } s32 gfx3d_GetDirectionalMatrix (unsigned int index) { int _index = (((index / 3) * 4) + (index % 3)); //return (s32)(mtxCurrent[2][_index]*(1<<12)); return mtxCurrent[2][_index]; } void gfx3d_glAlphaFunc(u32 v) { gfx3d.state.alphaTestRef = v&31; } unsigned int gfx3d_glGetPosRes(unsigned int index) { return (unsigned int)(PTcoords[index] * 4096.0f); } //#define _3D_LOG_EXEC #ifdef _3D_LOG_EXEC static void log3D(u8 cmd, u32 param) { INFO("3D command 0x%02X: ", cmd); switch (cmd) { case 0x10: // MTX_MODE - Set Matrix Mode (W) printf("MTX_MODE(%08X)", param); break; case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) printf("MTX_PUSH()\t"); break; case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) printf("MTX_POP(%08X)", param); break; case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) printf("MTX_STORE(%08X)", param); break; case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) printf("MTX_RESTORE(%08X)", param); break; case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) printf("MTX_IDENTIFY()\t"); break; case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) printf("MTX_LOAD_4x4(%08X)", param); break; case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) printf("MTX_LOAD_4x3(%08X)", param); break; case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) printf("MTX_MULT_4x4(%08X)", param); break; case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) printf("MTX_MULT_4x3(%08X)", param); break; case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) printf("MTX_MULT_3x3(%08X)", param); break; case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) printf("MTX_SCALE(%08X)", param); break; case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) printf("MTX_TRANS(%08X)", param); break; case 0x20: // COLOR - Directly Set Vertex Color (W) printf("COLOR(%08X)", param); break; case 0x21: // NORMAL - Set Normal Vector (W) printf("NORMAL(%08X)", param); break; case 0x22: // TEXCOORD - Set Texture Coordinates (W) printf("TEXCOORD(%08X)", param); break; case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) printf("VTX_16(%08X)", param); break; case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) printf("VTX_10(%08X)", param); break; case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) printf("VTX_XY(%08X)", param); break; case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) printf("VTX_XZ(%08X)", param); break; case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) printf("VTX_YZ(%08X)", param); break; case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) printf("VTX_DIFF(%08X)", param); break; case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) printf("POLYGON_ATTR(%08X)", param); break; case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) printf("TEXIMAGE_PARAM(%08X)", param); break; case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) printf("PLTT_BASE(%08X)", param); break; case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) printf("DIF_AMB(%08X)", param); break; case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) printf("SPE_EMI(%08X)", param); break; case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) printf("LIGHT_VECTOR(%08X)", param); break; case 0x33: // LIGHT_COLOR - Set Light Color (W) printf("LIGHT_COLOR(%08X)", param); break; case 0x34: // SHININESS - Specular Reflection Shininess Table (W) printf("SHININESS(%08X)", param); break; case 0x40: // BEGIN_VTXS - Start of Vertex List (W) printf("BEGIN_VTXS(%08X)", param); break; case 0x41: // END_VTXS - End of Vertex List (W) printf("END_VTXS()\t"); break; case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) printf("SWAP_BUFFERS(%08X)", param); break; case 0x60: // VIEWPORT - Set Viewport (W) printf("VIEWPORT(%08X)", param); break; case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) printf("BOX_TEST(%08X)", param); break; case 0x71: // POS_TEST - Set Position Coordinates for Test (W) printf("POS_TEST(%08X)", param); break; case 0x72: // VEC_TEST - Set Directional Vector for Test (W) printf("VEC_TEST(%08X)", param); break; default: INFO("!!! Unknown(%08X)", param); break; } printf("\t\t(FIFO size %i)\n", gxFIFO.size); } #endif static void gfx3d_execute(u8 cmd, u32 param) { #ifdef _3D_LOG_EXEC log3D(cmd, param); #endif switch (cmd) { case 0x10: // MTX_MODE - Set Matrix Mode (W) gfx3d_glMatrixMode(param); break; case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) gfx3d_glPushMatrix(); break; case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) gfx3d_glPopMatrix(param); break; case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) gfx3d_glStoreMatrix(param); break; case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) gfx3d_glRestoreMatrix(param); break; case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) gfx3d_glLoadIdentity(); break; case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) gfx3d_glLoadMatrix4x4(param); break; case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) gfx3d_glLoadMatrix4x3(param); break; case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) gfx3d_glMultMatrix4x4(param); break; case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) gfx3d_glMultMatrix4x3(param); break; case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) gfx3d_glMultMatrix3x3(param); break; case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) gfx3d_glScale(param); break; case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) gfx3d_glTranslate(param); break; case 0x20: // COLOR - Directly Set Vertex Color (W) gfx3d_glColor3b(param); break; case 0x21: // NORMAL - Set Normal Vector (W) gfx3d_glNormal(param); break; case 0x22: // TEXCOORD - Set Texture Coordinates (W) gfx3d_glTexCoord(param); break; case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) gfx3d_glVertex16b(param); break; case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) gfx3d_glVertex10b(param); break; case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) gfx3d_glVertex3_cord<0,1>(param); break; case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) gfx3d_glVertex3_cord<0,2>(param); break; case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) gfx3d_glVertex3_cord<1,2>(param); break; case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) gfx3d_glVertex_rel(param); break; case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) gfx3d_glPolygonAttrib(param); break; case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) gfx3d_glTexImage(param); break; case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) gfx3d_glTexPalette(param); break; case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) gfx3d_glMaterial0(param); break; case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) gfx3d_glMaterial1(param); break; case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) gfx3d_glLightDirection(param); break; case 0x33: // LIGHT_COLOR - Set Light Color (W) gfx3d_glLightColor(param); break; case 0x34: // SHININESS - Specular Reflection Shininess Table (W) gfx3d_glShininess(param); break; case 0x40: // BEGIN_VTXS - Start of Vertex List (W) gfx3d_glBegin(param); break; case 0x41: // END_VTXS - End of Vertex List (W) gfx3d_glEnd(); break; case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) gfx3d_glFlush(param); break; case 0x60: // VIEWPORT - Set Viewport (W) gfx3d_glViewPort(param); break; case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) gfx3d_glBoxTest(param); break; case 0x71: // POS_TEST - Set Position Coordinates for Test (W) gfx3d_glPosTest(param); break; case 0x72: // VEC_TEST - Set Directional Vector for Test (W) gfx3d_glVecTest(param); break; default: INFO("Unknown execute FIFO 3D command 0x%02X with param 0x%08X\n", cmd, param); break; } } void gfx3d_execute3D() { u8 cmd = 0; u32 param = 0; #ifndef FLUSHMODE_HACK if (isSwapBuffers) return; #endif //this is a SPEED HACK //fifo is currently emulated more accurately than it probably needs to be. //without this batch size the emuloop will escape way too often to run fast. const int HACK_FIFO_BATCH_SIZE = 64; for(int i=0;ilist[num1]; const POLY &poly2 = polylist->list[num2]; if(poly1.maxy != poly2.maxy) return poly1.maxy < poly2.maxy; if(poly1.miny != poly2.miny) return poly1.miny < poly2.miny; return num1 < num2; } static inline bool gfx3d_ysort_compare_kalven(int num1, int num2) { const POLY &poly1 = polylist->list[num1]; const POLY &poly2 = polylist->list[num2]; //this may be verified by checking the game create menus in harvest moon island of happiness //also the buttons in the knights in the nightmare frontend depend on this and the perspective division if (poly1.maxy < poly2.maxy) return true; if (poly1.maxy > poly2.maxy) return false; if (poly1.miny < poly2.miny) return true; if (poly1.miny > poly2.miny) return false; //notably, the main shop interface in harvest moon will not have a correct RTN button //i think this is due to a math error rounding its position to one pixel too high and it popping behind //the bar that it sits on. //everything else in all the other menus that I could find looks right.. //make sure we respect the game's ordering in cases of complete ties //this makes it a stable sort. //this must be a stable sort or else advance wars DOR will flicker in the main map mode return (num1 < num2); } static bool gfx3d_ysort_compare(int num1, int num2) { bool original = gfx3d_ysort_compare_orig(num1,num2); bool kalven = gfx3d_ysort_compare_kalven(num1,num2); assert(original == kalven); return original; } static void gfx3d_doFlush() { gfx3d.frameCtr++; //the renderer will get the lists we just built gfx3d.polylist = polylist; gfx3d.vertlist = vertlist; //and also our current render state if(BIT1(control)) gfx3d.state.shading = GFX3D_State::HIGHLIGHT; else gfx3d.state.shading = GFX3D_State::TOON; gfx3d.state.enableTexturing = BIT0(control); gfx3d.state.enableAlphaTest = BIT2(control); gfx3d.state.enableAlphaBlending = BIT3(control); gfx3d.state.enableAntialiasing = BIT4(control); gfx3d.state.enableEdgeMarking = BIT5(control); gfx3d.state.enableFogAlphaOnly = BIT6(control); gfx3d.state.enableFog = BIT7(control); gfx3d.state.enableClearImage = BIT14(control); gfx3d.state.fogShift = (control>>8)&0xF; gfx3d.state.sortmode = BIT0(gfx3d.state.activeFlushCommand); gfx3d.state.wbuffer = BIT1(gfx3d.state.activeFlushCommand); gfx3d.renderState = gfx3d.state; // Override render states per user settings if(!CommonSettings.GFX3D_Texture) gfx3d.renderState.enableTexturing = false; if(!CommonSettings.GFX3D_EdgeMark) gfx3d.renderState.enableEdgeMarking = false; if(!CommonSettings.GFX3D_Fog) gfx3d.renderState.enableFog = false; gfx3d.state.activeFlushCommand = gfx3d.state.pendingFlushCommand; int polycount = polylist->count; #ifdef _SHOW_VTX_COUNTERS max_polys = max((u32)polycount, max_polys); max_verts = max((u32)vertlist->count, max_verts); osd->addFixed(180, 20, "%i/%i", polycount, vertlist->count); // current osd->addFixed(180, 35, "%i/%i", max_polys, max_verts); // max #endif //find the min and max y values for each poly. //TODO - this could be a small waste of time if we are manual sorting the translucent polys //TODO - this _MUST_ be moved later in the pipeline, after clipping. //the w-division here is just an approximation to fix the shop in harvest moon island of happiness //also the buttons in the knights in the nightmare frontend depend on this for(int i=0; ilist[i]; float verty = vertlist->list[poly.vertIndexes[0]].y; float vertw = (vertlist->list[poly.vertIndexes[0]].w != 0.0f) ? vertlist->list[poly.vertIndexes[0]].w : 0.00000001f; verty = 1.0f-(verty+vertw)/(2*vertw); poly.miny = poly.maxy = verty; for(int j=1; jlist[poly.vertIndexes[j]].y; vertw = (vertlist->list[poly.vertIndexes[j]].w != 0.0f) ? vertlist->list[poly.vertIndexes[j]].w : 0.00000001f; verty = 1.0f-(verty+vertw)/(2*vertw); poly.miny = min(poly.miny, verty); poly.maxy = max(poly.maxy, verty); } } //we need to sort the poly list with alpha polys last //first, look for opaque polys int ctr=0; for(int i=0;ilist[i]; if(!poly.isTranslucent()) gfx3d.indexlist.list[ctr++] = i; } int opaqueCount = ctr; //then look for translucent polys for(int i=0;ilist[i]; if(poly.isTranslucent()) gfx3d.indexlist.list[ctr++] = i; } //NOTE: the use of the stable_sort below must be here as a workaround for some compilers on osx and linux. //we're hazy on the exact behaviour of the resulting bug, all thats known is the list gets mangled somehow. //it should not in principle be relevant since the predicate results in no ties. //perhaps the compiler is buggy. perhaps the predicate is wrong. //now we have to sort the opaque polys by y-value. //(test case: harvest moon island of happiness character cretor UI) //should this be done after clipping?? std::stable_sort(gfx3d.indexlist.list, gfx3d.indexlist.list + opaqueCount, gfx3d_ysort_compare); if(!gfx3d.state.sortmode) { //if we are autosorting translucent polys, we need to do this also //TODO - this is unverified behavior. need a test case std::stable_sort(gfx3d.indexlist.list + opaqueCount, gfx3d.indexlist.list + polycount, gfx3d_ysort_compare); } //switch to the new lists twiddleLists(); if(driver->view3d->IsRunning()) { viewer3d_state->frameNumber = currFrameCounter; viewer3d_state->state = gfx3d.state; viewer3d_state->polylist = *gfx3d.polylist; viewer3d_state->vertlist = *gfx3d.vertlist; viewer3d_state->indexlist = gfx3d.indexlist; driver->view3d->NewFrame(); } drawPending = TRUE; } void gfx3d_VBlankSignal() { if (isSwapBuffers) { #ifndef FLUSHMODE_HACK gfx3d_doFlush(); #endif GFX_DELAY(392); isSwapBuffers = FALSE; } } void gfx3d_VBlankEndSignal(bool skipFrame) { if (!drawPending) return; if(skipFrame) return; drawPending = FALSE; if(!CommonSettings.showGpu.main) { memset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen)); return; } gpu3D->NDS_3D_Render(); } //#define _3D_LOG void gfx3d_sendCommandToFIFO(u32 val) { //printf("gxFIFO: send val=0x%08X, size=%03i (fifo)\n", val, gxFIFO.size); gxf_hardware.receive(val); } void gfx3d_sendCommand(u32 cmd, u32 param) { cmd = (cmd & 0x01FF) >> 2; //printf("gxFIFO: send 0x%02X: val=0x%08X, size=%03i (direct)\n", cmd, param, gxFIFO.size); #ifdef _3D_LOG INFO("gxFIFO: send 0x%02X: val=0x%08X, pipe %02i, fifo %03i (direct)\n", cmd, param, gxPIPE.tail, gxFIFO.tail); #endif switch (cmd) { case 0x10: // MTX_MODE - Set Matrix Mode (W) case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) case 0x20: // COLOR - Directly Set Vertex Color (W) case 0x21: // NORMAL - Set Normal Vector (W) case 0x22: // TEXCOORD - Set Texture Coordinates (W) case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) case 0x33: // LIGHT_COLOR - Set Light Color (W) case 0x34: // SHININESS - Specular Reflection Shininess Table (W) case 0x40: // BEGIN_VTXS - Start of Vertex List (W) case 0x41: // END_VTXS - End of Vertex List (W) case 0x60: // VIEWPORT - Set Viewport (W) case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) case 0x71: // POS_TEST - Set Position Coordinates for Test (W) case 0x72: // VEC_TEST - Set Directional Vector for Test (W) //printf("mmu: sending %02X: %08X\n", cmd,param); GFX_FIFOsend(cmd, param); break; case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) //printf("mmu: sending %02X: %08X\n", cmd,param); GFX_FIFOsend(cmd, param); break; default: INFO("Unknown 3D command %03X with param 0x%08X (directport)\n", cmd, param); break; } } void gfx3d_Control(u32 v) { control = v; } //-------------- //other misc stuff void gfx3d_glGetMatrix(unsigned int m_mode, int index, float* dest) { //if(index == -1) //{ // MatrixCopy(dest, mtxCurrent[m_mode]); // return; //} //MatrixCopy(dest, MatrixStackGetPos(&mtxStack[m_mode], index)); s32* src; if(index==-1) src = mtxCurrent[m_mode]; else src=MatrixStackGetPos(&mtxStack[m_mode],index); for(int i=0;i<16;i++) dest[i] = src[i]/4096.0f; } void gfx3d_glGetLightDirection(unsigned int index, unsigned int* dest) { *dest = lightDirection[index]; } void gfx3d_glGetLightColor(unsigned int index, unsigned int* dest) { *dest = lightColor[index]; } void gfx3d_GetLineData(int line, u8** dst) { gpu3D->NDS_3D_RenderFinish(); *dst = gfx3d_convertedScreen+((line)<<(8+2)); } void gfx3d_GetLineData15bpp(int line, u16** dst) { //TODO - this is not very thread safe!!! static u16 buf[GFX3D_FRAMEBUFFER_WIDTH]; *dst = buf; u8* lineData; gfx3d_GetLineData(line, &lineData); for(int i=0; iNDS_3D_RenderFinish(); //version write32le(4,os); //dump the render lists OSWRITE(vertlist->count); for(int i=0;icount;i++) vertlist->list[i].save(os); OSWRITE(polylist->count); for(int i=0;icount;i++) polylist->list[i].save(os); for(int i=0;i<4;i++) { OSWRITE(mtxStack[i].position); for(int j=0;j=1) { OSREAD(vertlist->count); for(int i=0;icount;i++) vertlist->list[i].load(is); OSREAD(polylist->count); for(int i=0;icount;i++) polylist->list[i].load(is); } if(version>=2) { for(int i=0;i<4;i++) { OSREAD(mtxStack[i].position); for(int j=0;j=3) { gxf_hardware.loadstate(is); } gfx3d.polylist = &polylists[listTwiddle^1]; gfx3d.vertlist = &vertlists[listTwiddle^1]; gfx3d.polylist->count=0; gfx3d.vertlist->count=0; if(version >= 4) { OSREAD(cacheLightDirection); OSREAD(cacheHalfVector); } return true; } //------------------- //clipping //------------------- // this is optional for now in case someone has trouble with the new method // or wants to toggle it to compare #define OPTIMIZED_CLIPPING_METHOD //#define CLIPLOG(X) printf(X); //#define CLIPLOG2(X,Y,Z) printf(X,Y,Z); #define CLIPLOG(X) #define CLIPLOG2(X,Y,Z) template static T interpolate(const float ratio, const T& x0, const T& x1) { return (T)(x0 + (float)(x1-x0) * (ratio)); } //http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/as6/discussion.shtml #ifdef OPTIMIZED_CLIPPING_METHOD template static FORCEINLINE VERT clipPoint(bool hirez, VERT* inside, VERT* outside) #else static FORCEINLINE VERT clipPoint(VERT* inside, VERT* outside, int coord, int which) #endif { VERT ret; float coord_inside = inside->coord[coord]; float coord_outside = outside->coord[coord]; float w_inside = inside->coord[3]; float w_outside = outside->coord[3]; float t; if(which==-1) { w_outside = -w_outside; w_inside = -w_inside; } t = (coord_inside - w_inside)/ ((w_outside-w_inside) - (coord_outside-coord_inside)); #define INTERP(X) ret . X = interpolate(t, inside-> X ,outside-> X ) INTERP(coord[0]); INTERP(coord[1]); INTERP(coord[2]); INTERP(coord[3]); INTERP(texcoord[0]); INTERP(texcoord[1]); //if(CommonSettings.GFX3D_HighResolutionInterpolateColor) if(hirez) { INTERP(fcolor[0]); INTERP(fcolor[1]); INTERP(fcolor[2]); } else { INTERP(color[0]); INTERP(color[1]); INTERP(color[2]); ret.color_to_float(); } //this seems like a prudent measure to make sure that math doesnt make a point pop back out //of the clip volume through interpolation if(which==-1) ret.coord[coord] = -ret.coord[3]; else ret.coord[coord] = ret.coord[3]; return ret; } #ifdef OPTIMIZED_CLIPPING_METHOD #define MAX_SCRATCH_CLIP_VERTS (4*6 + 40) static VERT scratchClipVerts [MAX_SCRATCH_CLIP_VERTS]; static int numScratchClipVerts = 0; template class ClipperPlane { public: ClipperPlane(Next& next) : m_next(next) {} void init(VERT* verts) { m_prevVert = NULL; m_firstVert = NULL; m_next.init(verts); } void clipVert(bool hirez, VERT* vert) { if(m_prevVert) this->clipSegmentVsPlane(hirez, m_prevVert, vert); else m_firstVert = vert; m_prevVert = vert; } // closes the loop and returns the number of clipped output verts int finish(bool hirez) { this->clipVert(hirez, m_firstVert); return m_next.finish(hirez); } private: VERT* m_prevVert; VERT* m_firstVert; Next& m_next; FORCEINLINE void clipSegmentVsPlane(bool hirez, VERT* vert0, VERT* vert1) { float* vert0coord = vert0->coord; float* vert1coord = vert1->coord; bool out0, out1; if(which==-1) out0 = vert0coord[coord] < -vert0coord[3]; else out0 = vert0coord[coord] > vert0coord[3]; if(which==-1) out1 = vert1coord[coord] < -vert1coord[3]; else out1 = vert1coord[coord] > vert1coord[3]; //CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure. //if(coord==2 && which==1) { // out0 = vert0coord[2] < 0; // out1 = vert1coord[2] < 0; //} //both outside: insert no points if(out0 && out1) { CLIPLOG(" both outside\n"); } //both inside: insert the next point if(!out0 && !out1) { CLIPLOG(" both inside\n"); m_next.clipVert(hirez,vert1); } //exiting volume: insert the clipped point if(!out0 && out1) { CLIPLOG(" exiting\n"); assert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS); scratchClipVerts[numScratchClipVerts] = clipPoint(hirez,vert0,vert1); m_next.clipVert(hirez,&scratchClipVerts[numScratchClipVerts++]); } //entering volume: insert clipped point and the next (interior) point if(out0 && !out1) { CLIPLOG(" entering\n"); assert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS); scratchClipVerts[numScratchClipVerts] = clipPoint(hirez,vert1,vert0); m_next.clipVert(hirez,&scratchClipVerts[numScratchClipVerts++]); m_next.clipVert(hirez,vert1); } } }; class ClipperOutput { public: void init(VERT* verts) { m_nextDestVert = verts; m_numVerts = 0; } void clipVert(bool hirez, VERT* vert) { assert((u32)m_numVerts < MAX_CLIPPED_VERTS); *m_nextDestVert++ = *vert; m_numVerts++; } int finish(bool hirez) { return m_numVerts; } private: VERT* m_nextDestVert; int m_numVerts; }; // see "Template juggling with Sutherland-Hodgman" http://www.codeguru.com/cpp/misc/misc/graphics/article.php/c8965__2/ // for the idea behind setting things up like this. static ClipperOutput clipperOut; typedef ClipperPlane<2, 1,ClipperOutput> Stage6; static Stage6 clipper6 (clipperOut); // back plane //TODO - we need to parameterize back plane clipping typedef ClipperPlane<2,-1,Stage6> Stage5; static Stage5 clipper5 (clipper6); // front plane typedef ClipperPlane<1, 1,Stage5> Stage4; static Stage4 clipper4 (clipper5); // top plane typedef ClipperPlane<1,-1,Stage4> Stage3; static Stage3 clipper3 (clipper4); // bottom plane typedef ClipperPlane<0, 1,Stage3> Stage2; static Stage2 clipper2 (clipper3); // right plane typedef ClipperPlane<0,-1,Stage2> Stage1; static Stage1 clipper (clipper2); // left plane template void GFX3D_Clipper::clipPoly(POLY* poly, VERT** verts) { CLIPLOG("==Begin poly==\n"); int type = poly->type; numScratchClipVerts = 0; clipper.init(clippedPolys[clippedPolyCounter].clipVerts); for(int i=0;i(POLY* poly, VERT** verts); template void GFX3D_Clipper::clipPoly(POLY* poly, VERT** verts); void GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which) { // not used (it's probably ok to delete this function) assert(0); } void GFX3D_Clipper::clipPolyVsPlane(const int coord, int which) { // not used (it's probably ok to delete this function) assert(0); } #else // if not OPTIMIZED_CLIPPING_METHOD: FORCEINLINE void GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which) { bool out0, out1; if(which==-1) out0 = verts[0]->coord[coord] < -verts[0]->coord[3]; else out0 = verts[0]->coord[coord] > verts[0]->coord[3]; if(which==-1) out1 = verts[1]->coord[coord] < -verts[1]->coord[3]; else out1 = verts[1]->coord[coord] > verts[1]->coord[3]; //CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure. //if(coord==2 && which==1) { // out0 = verts[0]->coord[2] < 0; // out1 = verts[1]->coord[2] < 0; //} //both outside: insert no points if(out0 && out1) { CLIPLOG(" both outside\n"); } //both inside: insert the first point if(!out0 && !out1) { CLIPLOG(" both inside\n"); outClippedPoly.clipVerts[outClippedPoly.type++] = *verts[1]; } //exiting volume: insert the clipped point and the first (interior) point if(!out0 && out1) { CLIPLOG(" exiting\n"); outClippedPoly.clipVerts[outClippedPoly.type++] = clipPoint(verts[0],verts[1], coord, which); } //entering volume: insert clipped point if(out0 && !out1) { CLIPLOG(" entering\n"); outClippedPoly.clipVerts[outClippedPoly.type++] = clipPoint(verts[1],verts[0], coord, which); outClippedPoly.clipVerts[outClippedPoly.type++] = *verts[1]; } } FORCEINLINE void GFX3D_Clipper::clipPolyVsPlane(const int coord, int which) { outClippedPoly.type = 0; CLIPLOG2("Clipping coord %d against %f\n",coord,x); for(int i=0;itype; CLIPLOG("==Begin poly==\n"); tempClippedPoly.clipVerts[0] = *verts[0]; tempClippedPoly.clipVerts[1] = *verts[1]; tempClippedPoly.clipVerts[2] = *verts[2]; if(type==4) tempClippedPoly.clipVerts[3] = *verts[3]; tempClippedPoly.type = type; clipPolyVsPlane(0, -1); clipPolyVsPlane(0, 1); clipPolyVsPlane(1, -1); clipPolyVsPlane(1, 1); clipPolyVsPlane(2, -1); clipPolyVsPlane(2, 1); //TODO - we need to parameterize back plane clipping if(tempClippedPoly.type < 3) { //a totally clipped poly. discard it. //or, a degenerate poly. we're not handling these right now } else { //TODO - build right in this list instead of copying clippedPolys[clippedPolyCounter] = tempClippedPoly; clippedPolys[clippedPolyCounter].poly = poly; clippedPolyCounter++; } } #endif desmume-0.9.11/src/MMU_timing.h0000755000000000000000000003436012467662066014734 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2007 shash Copyright (C) 2007-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ // this file is split from MMU.h for the purpose of avoiding ridiculous recompile times // when changing it, because practically everything includes MMU.h. #ifndef MMUTIMING_H #define MMUTIMING_H #include #include "MMU.h" #include "cp15.h" #include "readwrite.h" #include "debug.h" #include "NDSSystem.h" //////////////////////////////////////////////////////////////// // MEMORY TIMING ACCURACY CONFIGURATION // // the more of these are enabled, // the more accurate memory access timing _should_ become. // they should be listed roughly in order of most to least important. // it's reasonable to disable some of these as a speed hack. // obviously, these defines don't cover all the variables or features needed, // and in particular, DMA or code+data access bus contention is still missing. //disable this to prevent the advanced timing logic from ever running at all #define ENABLE_ADVANCED_TIMING #ifdef ENABLE_ADVANCED_TIMING // makes non-sequential accesses slower than sequential ones. #define ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS //(SOMETIMES THIS IS A BIG SPEED HIT!) // enables emulation of code fetch waits. #define ACCOUNT_FOR_CODE_FETCH_CYCLES // makes access to DTCM (arm9 only) fast. #define ACCOUNT_FOR_DATA_TCM_SPEED // enables simulation of cache hits and cache misses. #define ENABLE_CACHE_CONTROLLER_EMULATION #endif //ENABLE_ADVANCED_TIMING // //////////////////////////////////////////////////////////////// FORCEINLINE bool USE_TIMING() { #ifdef ENABLE_ADVANCED_TIMING return CommonSettings.advanced_timing; #else return false; #endif } enum MMU_ACCESS_DIRECTION { MMU_AD_READ, MMU_AD_WRITE }; // note that we don't actually emulate the cache contents here, // only enough to guess what would be a cache hit or a cache miss. // this doesn't really get used unless ENABLE_CACHE_CONTROLLER_EMULATION is defined. template class CacheController { public: template FORCEINLINE bool Cached(u32 addr) { u32 blockMasked = addr & BLOCKMASK; if(blockMasked == m_cacheCache) return true; else return this->CachedInternal

(addr, blockMasked); } void Reset() { for(int blockIndex = 0; blockIndex < NUMBLOCKS; blockIndex++) m_blocks[blockIndex].Reset(); m_cacheCache = ~0; } CacheController() { Reset(); } void savestate(EMUFILE* os, int version) { write32le(m_cacheCache, os); for(int i = 0; i < NUMBLOCKS; i++) { for(int j = 0; j < ASSOCIATIVITY; j++) write32le(m_blocks[i].tag[j],os); write32le(m_blocks[i].nextWay,os); } } bool loadstate(EMUFILE* is, int version) { read32le(&m_cacheCache, is); for(int i = 0; i < NUMBLOCKS; i++) { for(int j = 0; j < ASSOCIATIVITY; j++) read32le(&m_blocks[i].tag[j],is); read32le(&m_blocks[i].nextWay,is); } return true; } private: template bool CachedInternal(u32 addr, u32 blockMasked) { u32 blockIndex = blockMasked >> BLOCKSIZESHIFT; CacheBlock& block = m_blocks[blockIndex]; addr &= TAGMASK; for(int way = 0; way < ASSOCIATIVITY; way++) if(addr == block.tag[way]) { // found it, already allocated m_cacheCache = blockMasked; return true; } if(DIR == MMU_AD_READ) { // TODO: support other allocation orders? block.tag[block.nextWay++] = addr; block.nextWay %= ASSOCIATIVITY; m_cacheCache = blockMasked; } return false; } enum { SIZE = 1 << SIZESHIFT }; enum { ASSOCIATIVITY = 1 << ASSOCIATIVESHIFT }; enum { BLOCKSIZE = 1 << BLOCKSIZESHIFT }; enum { TAGSHIFT = SIZESHIFT - ASSOCIATIVESHIFT }; enum { TAGMASK = (u32)(~0 << TAGSHIFT) }; enum { BLOCKMASK = ((u32)~0 >> (32 - TAGSHIFT)) & (u32)(~0 << BLOCKSIZESHIFT) }; enum { WORDSIZE = sizeof(u32) }; enum { WORDSPERBLOCK = (1 << BLOCKSIZESHIFT) / WORDSIZE }; enum { DATAPERWORD = WORDSIZE * ASSOCIATIVITY }; enum { DATAPERBLOCK = DATAPERWORD * WORDSPERBLOCK }; enum { NUMBLOCKS = SIZE / DATAPERBLOCK }; struct CacheBlock { u32 tag [ASSOCIATIVITY]; u32 nextWay; void Reset() { nextWay = 0; for(int way = 0; way < ASSOCIATIVITY; way++) tag[way] = 0; } }; u32 m_cacheCache; // optimization CacheBlock m_blocks [NUMBLOCKS]; }; template FORCEINLINE u32 _MMU_accesstime(u32 addr, bool sequential); template class FetchAccessUnit { public: template FORCEINLINE u32 Fetch(u32 address) { #ifdef ACCOUNT_FOR_CODE_FETCH_CYCLES const bool prohibit = TIMING; #else const bool prohibit = false; #endif if(AT == MMU_AT_CODE && !prohibit) { return 1; } u32 time = _MMU_accesstime(address, #ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS (TIMING? (address == (m_lastAddress + (READSIZE>>3))) :true ) #else true #endif ); #ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS m_lastAddress = address; #endif return time; } void Reset() { m_lastAddress = ~0; } FetchAccessUnit() { this->Reset(); } void savestate(EMUFILE* os, int version) { write32le(m_lastAddress,os); } bool loadstate(EMUFILE* is, int version) { read32le(&m_lastAddress,is); return true; } private: u32 m_lastAddress; }; struct MMU_struct_timing { // technically part of the cp15, but I didn't want the dereferencing penalty. // these template values correspond with the value of armcp15->cacheType. CacheController<13,2,5> arm9codeCache; // 8192 bytes, 4-way associative, 32-byte blocks CacheController<12,2,5> arm9dataCache; // 4096 bytes, 4-way associative, 32-byte blocks // technically part of armcpu_t, but that struct isn't templated on PROCNUM FetchAccessUnit<0,MMU_AT_CODE> arm9codeFetch; FetchAccessUnit<0,MMU_AT_DATA> arm9dataFetch; FetchAccessUnit<1,MMU_AT_CODE> arm7codeFetch; FetchAccessUnit<1,MMU_AT_DATA> arm7dataFetch; template FORCEINLINE FetchAccessUnit& armCodeFetch(); template FORCEINLINE FetchAccessUnit& armDataFetch(); }; template<> FORCEINLINE FetchAccessUnit<0,MMU_AT_CODE>& MMU_struct_timing::armCodeFetch<0>() { return this->arm9codeFetch; } template<> FORCEINLINE FetchAccessUnit<1,MMU_AT_CODE>& MMU_struct_timing::armCodeFetch<1>() { return this->arm7codeFetch; } template<> FORCEINLINE FetchAccessUnit<0,MMU_AT_DATA>& MMU_struct_timing::armDataFetch<0>() { return this->arm9dataFetch; } template<> FORCEINLINE FetchAccessUnit<1,MMU_AT_DATA>& MMU_struct_timing::armDataFetch<1>() { return this->arm7dataFetch; } extern MMU_struct_timing MMU_timing; // calculates the time a single memory access takes, // in units of cycles of the current processor. // this function replaces what used to be MMU_WAIT16 and MMU_WAIT32. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 _MMU_accesstime(u32 addr, bool sequential) { static const int MC = 1; // cached or tcm memory speed static const int M32 = (PROCNUM==ARMCPU_ARM9) ? 2 : 1; // access through 32-bit bus static const int M16 = M32 * ((READSIZE>16) ? 2 : 1); // access through 16-bit bus static const int MSLW = M16 * 8; // this needs tuning if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE && addr < 0x02000000) return MC; // ITCM #ifdef ACCOUNT_FOR_DATA_TCM_SPEED if(TIMING && PROCNUM==ARMCPU_ARM9 && AT==MMU_AT_DATA && (addr&(~0x3FFF)) == MMU.DTCMRegion) return MC; // DTCM #endif // for now, assume the cache is always enabled for all of main memory if(AT != MMU_AT_DMA && TIMING && PROCNUM==ARMCPU_ARM9 && (addr & 0x0F000000) == 0x02000000) { #ifdef ENABLE_CACHE_CONTROLLER_EMULATION bool cached = false; if(AT==MMU_AT_CODE) cached = MMU_timing.arm9codeCache.Cached(addr); if(AT==MMU_AT_DATA) cached = MMU_timing.arm9dataCache.Cached(addr); if(cached) return MC; u32 c; if(sequential && AT==MMU_AT_DATA) c = M16; // bonus for sequential data access else if(DIRECTION == MMU_AD_READ) c = M16 * 5; else c = M16 * 2; // should be 4, but write buffer isn't emulated yet. if(DIRECTION == MMU_AD_READ) { // cache miss while reading means it has to fill a whole cache line // by reading 32 bytes... c += 8 * M32*2; } if(CheckDebugEvent(DEBUG_EVENT_CACHE_MISS)) { DebugEventData.addr = addr; DebugEventData.size = READSIZE; HandleDebugEvent(DEBUG_EVENT_CACHE_MISS); } return c; #elif defined(ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS) // this is the closest approximation I could find // to the with-cache-controller timing // that doesn't do any actual caching logic. return sequential ? MC : M16; #endif } static const TWaitState MMU_WAIT[16*16] = { // ITCM, ITCM, MAIN, SWI, REG, VMEM, LCD, OAM, ROM, ROM, RAM, U, U, U, U, BIOS #define X MC, MC, M16, M32, M32, M16, M16, M32, MSLW, MSLW, MSLW, M32,M32,M32,M32, M32, // duplicate it 16 times (this was somehow faster than using a mask of 0xF) X X X X X X X X X X X X X X X X #undef X }; u32 c = MMU_WAIT[(addr >> 24)]; #ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS if(TIMING && !sequential) { //if(c != MC || PROCNUM==ARMCPU_ARM7) // check not needed anymore because ITCM/DTCM return earlier { c += (PROCNUM==ARMCPU_ARM9) ? 3*2 : 1; } } #endif return c; } // calculates the cycle time of a single memory access in the MEM stage. // to be used to calculate the memCycles argument for MMU_aluMemCycles. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 MMU_memAccessCycles(u32 addr) { if(TIMING) return MMU_timing.armDataFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); else return MMU_timing.armDataFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); } template FORCEINLINE u32 MMU_memAccessCycles(u32 addr) { if(USE_TIMING()) return MMU_memAccessCycles(addr); else return MMU_memAccessCycles(addr); } // calculates the cycle time of a single code fetch in the FETCH stage // to be used to calculate the fetchCycles argument for MMU_fetchExecuteCycles. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 MMU_codeFetchCycles(u32 addr) { if(USE_TIMING()) return MMU_timing.armCodeFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); else return MMU_timing.armCodeFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); } // calculates the cycle contribution of ALU + MEM stages (= EXECUTE) // given ALU cycle time and the summation of multiple memory access cycle times. // this function might belong more in armcpu, but I don't think it matters. template FORCEINLINE u32 MMU_aluMemCycles(u32 aluCycles, u32 memCycles) { if(PROCNUM==ARMCPU_ARM9) { // ALU and MEM are different stages of the 5-stage pipeline. // we approximate the pipeline throughput using max, // since simply adding the cycles of each instruction together // fails to take into account the parallelism of the arm pipeline // and would make the emulated system unnaturally slow. return std::max(aluCycles, memCycles); } else { // ALU and MEM are part of the same stage of the 3-stage pipeline, // thus they occur in sequence and we can simply add the counts together. return aluCycles + memCycles; } } // calculates the cycle contribution of ALU + MEM stages (= EXECUTE) // given ALU cycle time and the description of a single memory access. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 MMU_aluMemAccessCycles(u32 aluCycles, u32 addr) { u32 memCycles; if(USE_TIMING()) memCycles = MMU_memAccessCycles(addr); else memCycles = MMU_memAccessCycles(addr); return MMU_aluMemCycles(aluCycles, memCycles); } // calculates the cycle contribution of FETCH + EXECUTE stages // given executeCycles = the combined ALU+MEM cycles // and fetchCycles = the cycle time of the FETCH stage // this function might belong more in armcpu, but I don't think it matters. template FORCEINLINE u32 MMU_fetchExecuteCycles(u32 executeCycles, u32 fetchCycles) { #ifdef ACCOUNT_FOR_CODE_FETCH_CYCLES const bool allow = true; #else const bool allow = false; #endif if(USE_TIMING() && allow) { // execute and fetch are different stages of the pipeline for both arm7 and arm9. // again, we approximate the pipeline throughput using max. return std::max(executeCycles, fetchCycles); // TODO: add an option to support conflict between MEM and FETCH cycles // if they're both using the same data bus. // in the case of a conflict this should be: // return std::max(aluCycles, memCycles + fetchCycles); } return executeCycles; } #endif //MMUTIMING_H desmume-0.9.11/src/gtk/0000755000000000000000000000000012467663414013330 5ustar rootrootdesmume-0.9.11/src/gtk/DeSmuME.xpm0000755000000000000000000000263512467662066015330 0ustar rootroot/* XPM */ static const char * DeSmuME_xpm[] = { "32 32 15 1", " c None", ". c #000000", "+ c #F6F6FB", "@ c #ECECF6", "# c #E2E2F1", "$ c #D8D8EC", "% c #CFCFE7", "& c #C5C5E2", "* c #BBBBDE", "= c #B1B1D9", "- c #A8A8D4", "; c #9E9ECF", "> c #9494CA", ", c #8A8AC5", "' c #8080C0", " .................... ", " .................... ", ".....++..+++++..+++++.. ", ".....++..++.....++..... ", "..@@@@@..@@@@@..@@@@@.. ", "..@@.@@..@@........@@.. ", "..##.##..##.##..##.##.. ", "..##.##..##.##..##.##.. ", "..$$.$$..$$.$$..$$.$$.. ", "..$$.$$..$$.$$..$$.$$.. ", "..%%.%%..%%.%%..%%.%%.. ", "..%%.%%..%%.%%..%%.%%.. ", "..&&&&&..&&&&&..&&&&&.. ", "....................... ", ".......********.**.**.. ", " ..==.==.==.==.==.. ", " ..==.==.==.==.==.. ", " ..--.--.--.--.--.. ", " ..--.--.--.--.--.. ", " ..;;.;;.;;.;;;;;.. ", " ..................... ", " ..................... ", " ..>>>>>>>>.>>>>>.. ", " ..>>.>>.>>.>>..... ", " ..,,.,,.,,.,,,,,.. ", " ..,,.,,.,,.,,..... ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.'''''.. ", " .................. ", " .................. "}; desmume-0.9.11/src/gtk/config.h0000755000000000000000000000451612467662066014761 0ustar rootroot/* Copyright (C) 2014 DeSmuME team Copyright (C) 2014 Alvin Wong This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef DESMUME_CONFIG_CLASS_H_ #define DESMUME_CONFIG_CLASS_H_ #include #include #include namespace desmume { namespace config { template class value { friend class Config; std::string mSection; std::string mKey; GKeyFile* mKeyFile; T mDefaultVal; T mData; value(const value&); // DO NOT IMPLEMENT value operator=(const value&); // DO NOT IMPLEMENT void load(); void save(); public: value(const T& defaultVal, const std::string& section, const std::string& key) : mSection(section) , mKey(key) , mDefaultVal(defaultVal) , mData(defaultVal) {} inline T defaultVal() { return this->mDefaultVal; } inline T get() { return this->mData; } inline operator T() { return this->mData; } inline void set(const T& value) { this->mData = value; //this->save(); } inline T operator=(const T& value) { this->mData = value; return this->mData; } }; /* class value */ #ifdef OPT # undef OPT #endif class Config { protected: GKeyFile* mKeyFile; Config(const Config&); // DO NOT IMPLEMENT Config operator=(const Config&); // DO NOT IMPLEMENT public: // member fields # define OPT(name, type, default, section, key) \ value name; # include "config_opts.h" # undef OPT #if 0 // Special case: input config class Input { friend class Config; std::vector*> keys; std::vector*> joykeys; Input(); void load(); void save(); } inputs; #endif // constructor Config(); // methods virtual ~Config(); void load(); void save(); }; /* class Config */ #undef DESMUME_CONFIG_CONFIG } /* namespace config */ } /* namespace desmume */ #endif /* DESMUME_CONFIG_CLASS_H_ */ desmume-0.9.11/src/gtk/glx_3Demu.cpp0000755000000000000000000001062312467662066015672 0ustar rootroot/* Copyright (C) 2013 The Lemon Man This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_GL_GLX #include #include #include #include "../OGLRender.h" static bool glx_beginOpenGL(void) { return 1; } static void glx_endOpenGL(void) { } static bool glx_init(void) { return true; } static int xerror_handler(Display *dpy, XErrorEvent *ev) { return 0; } static GLXContext ctx; static GLXPbuffer pbuf; typedef GLXContext (*wtf)(Display*, GLXFBConfig, GLXContext, Bool, const int*); int deinit_glx_3Demu(void) { Display *dpy = glXGetCurrentDisplay(); if (dpy) { glXDestroyPbuffer(dpy, pbuf); glXDestroyContext(dpy, ctx); XCloseDisplay(dpy); return true; } return false; } int init_glx_3Demu(void) { Display *dpy = XOpenDisplay(NULL); XVisualInfo *vis; GLXFBConfig *cfg; int maj, min; if (!dpy) return false; // Check if GLX is present if (!glXQueryVersion(dpy, &maj, &min)) return false; // We need GLX 1.3 at least if (maj < 1 || (maj == 1 && min < 3)) return false; const int vis_attr[] = { GLX_RGBA, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 8, GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, GLX_DOUBLEBUFFER, None }; vis = glXChooseVisual(dpy, DefaultScreen(dpy), (int *)&vis_attr); if (!vis) return false; const int fb_attr[] = { GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR, GLX_DOUBLEBUFFER, true, GLX_X_RENDERABLE, true, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 8, GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, None }; int configs; cfg = glXChooseFBConfig(dpy, DefaultScreen(dpy), (int *)&fb_attr, &configs); if (!cfg) return false; const int pbuf_attr[] = { GLX_PBUFFER_WIDTH, 256, //GLX_PBUFFER_HEIGHT, 192, // Use a square size to prevent possible incompatibilities GLX_PBUFFER_HEIGHT, 256, None }; // The first should match exactly, otherwise is the least wrong one pbuf = glXCreatePbuffer(dpy, cfg[0], (int *)&pbuf_attr); // Dynamic linking is a pain, sigh OGLEXT(PFNGLXCREATECONTEXTATTRIBSARBPROC, glXCreateContextAttribsARB); INITOGLEXT(PFNGLXCREATECONTEXTATTRIBSARBPROC, glXCreateContextAttribsARB); // Try to get a 3.2 core profile context if (glXCreateContextAttribsARB) { const int ctx_attr[] = { GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 2, None }; // This silly dance is needed because if Xorg can't acquire the context // we asked for it will throw an error, which is caught by GTK X error // handler and made fatal. The show must go on. int (*old_handler)(Display*, XErrorEvent*) = XSetErrorHandler(&xerror_handler); ctx = glXCreateContextAttribsARB(dpy, cfg[0], 0, true, ctx_attr); XSetErrorHandler(old_handler); } // Something went wrong, try with a standard context if (!ctx) ctx = glXCreateContext(dpy, vis, NULL, true); XFree(cfg); if (!ctx) return false; if (!glXMakeContextCurrent(dpy, pbuf, pbuf, ctx)) return false; printf("OGL/GLX Renderer has finished the initialization.\n"); oglrender_init = glx_init; oglrender_beginOpenGL = glx_beginOpenGL; oglrender_endOpenGL = glx_endOpenGL; return true; } #endif // HAVE_GLX desmume-0.9.11/src/gtk/osmesa_3Demu.h0000755000000000000000000000156112467662066016035 0ustar rootroot/* Copyright (C) 2009 Guillaume Duhamel This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_LIBOSMESA int init_osmesa_3Demu(void); void deinit_osmesa_3Demu(void); #endif desmume-0.9.11/src/gtk/avout_pipe_base.cpp0000755000000000000000000000511712467662066017212 0ustar rootroot/* Copyright (C) 2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include "types.h" #include "SPU.h" #include "avout_pipe_base.h" static inline int writeAll(int fd, const void* buf, size_t count) { ssize_t written = 0, writtenTotal = 0; do { written = write(fd, ((u8*)buf) + writtenTotal, count - writtenTotal); } while (written >= 0 && (writtenTotal += written) < count); return written; } bool AVOutPipeBase::begin(const char* fname) { if (this->recording) { return false; } const char* const* args = this->getArgv(fname); if (args == NULL) { return false; } int pipefd[2]; if (pipe(pipefd) < 0) { fprintf(stderr, "Fail to open pipe\n"); return false; } pid_t pid = fork(); if (pid == 0) { close(pipefd[1]); dup2(pipefd[0], STDIN_FILENO); execvp(args[0], (char* const*)args); fprintf(stderr, "Fail to start %s: %d %s\n", args[0], errno, strerror(errno)); _exit(1); } close(pipefd[0]); this->pipe_fd = pipefd[1]; this->recording = true; return true; } void AVOutPipeBase::end() { if (this->recording) { close(this->pipe_fd); this->recording = false; } } bool AVOutPipeBase::isRecording() { return this->recording; } void AVOutPipeBase::updateAudio(void* soundData, int soundLen) { if(!this->recording || this->type() != TYPE_AUDIO) { return; } if (writeAll(this->pipe_fd, soundData, soundLen * 2 * 2) == -1) { fprintf(stderr, "Error on writing audio: %d %s\n", errno, strerror(errno)); this->end(); } } void AVOutPipeBase::updateVideo(const u16* buffer) { if(!this->recording || this->type() != TYPE_VIDEO) { return; } u8 rgb[256 * 384 * 3]; u8* cur = rgb; for (int i = 0; i < 256 * 384; i++) { u16 gpu_pixel = buffer[i]; *cur = ((gpu_pixel >> 0) & 0x1f) << 3; cur++; *cur = ((gpu_pixel >> 5) & 0x1f) << 3; cur++; *cur = ((gpu_pixel >> 10) & 0x1f) << 3; cur++; } if (write(this->pipe_fd, rgb, 256 * 384 * 3) == -1) { fprintf(stderr, "Error on writing video: %d %s\n", errno, strerror(errno)); this->end(); } } desmume-0.9.11/src/gtk/config.cpp0000755000000000000000000001002012467662066015277 0ustar rootroot/* Copyright (C) 2014 DeSmuME team Copyright (C) 2014 Alvin Wong This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include "config.h" using std::string; using std::vector; namespace desmume { namespace config { /* class value */ template<> void value::load() { GError* err = NULL; bool val = g_key_file_get_boolean(this->mKeyFile, this->mSection.c_str(), this->mKey.c_str(), &err); if (err != NULL) { g_error_free(err); } else { this->mData = val; } } template<> void value::save() { g_key_file_set_boolean(this->mKeyFile, this->mSection.c_str(), this->mKey.c_str(), this->mData ? TRUE : FALSE); } /* class value */ template<> void value::load() { GError* err = NULL; int val = g_key_file_get_integer(this->mKeyFile, this->mSection.c_str(), this->mKey.c_str(), &err); if (err != NULL) { g_error_free(err); } else { this->mData = val; } } template<> void value::save() { g_key_file_set_integer(this->mKeyFile, this->mSection.c_str(), this->mKey.c_str(), this->mData); } /* class value */ template<> void value::load() { char* val = g_key_file_get_string(this->mKeyFile, this->mSection.c_str(), this->mKey.c_str(), NULL); if (val != NULL) { this->mData = val; g_free(val); } } template<> void value::save() { g_key_file_set_string(this->mKeyFile, this->mSection.c_str(), this->mKey.c_str(), this->mData.c_str()); } /* class Config */ Config::Config() : mKeyFile(g_key_file_new()) # define OPT(name, type, default, section, key) \ , name(default, #section, #key) # include "config_opts.h" # undef OPT { # define OPT(name, type, default, section, key) \ this->name.mKeyFile = this->mKeyFile; # include "config_opts.h" # undef OPT } Config::~Config() { g_key_file_free(this->mKeyFile); } void Config::load() { char* config_dir = g_build_filename(g_get_user_config_dir(), "desmume", NULL); g_mkdir_with_parents(config_dir, 0755); char* config_file = g_build_filename(config_dir, "config.cfg", NULL); g_key_file_load_from_file(this->mKeyFile, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL); g_free(config_file); g_free(config_dir); # define OPT(name, type, default, section, key) \ this->name.load(); # include "config_opts.h" # undef OPT } void Config::save() { # define OPT(name, type, default, section, key) \ this->name.save(); # include "config_opts.h" # undef OPT gsize length; char* data = g_key_file_to_data(this->mKeyFile, &length, NULL); char* config_dir = g_build_filename(g_get_user_config_dir(), "desmume", NULL); g_mkdir_with_parents(config_dir, 0755); char* config_file = g_build_filename(config_dir, "config.cfg", NULL); g_file_set_contents(config_file, data, length, NULL); g_free(config_file); g_free(config_dir); g_free(data); } #if 0 /* class Config::Input */ Config::Input::Input() : keys(NB_KEYS) , joykeys(NB_KEYS) { static const u16 gtk_kb_cfg[NB_KEYS] = { GDK_x, // A GDK_z, // B GDK_Shift_R, // select GDK_Return, // start GDK_Right, // Right GDK_Left, // Left GDK_Up, // Up GDK_Down, // Down GDK_w, // R GDK_q, // L GDK_s, // X GDK_a, // Y GDK_p, // DEBUG GDK_o, // BOOST GDK_BackSpace, // Lid }; for (size_t i = 0; i < NB_KEYS; i++) { this->keys[i] = new value(gtk_kb_cfg[i], "Keys", ...); } } void Config::Input::load(); void Config::Input::save(); #endif } /* namespace config */ } /* namespace desmume */ desmume-0.9.11/src/gtk/avout.h0000755000000000000000000000173212467662066014647 0ustar rootroot/* Copyright (C) 2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _AVOUT_H_ #define _AVOUT_H_ #include "types.h" class AVOut { public: virtual bool begin(const char* fname) { return false; } virtual void end() {} virtual bool isRecording() { return false; } virtual void updateAudio(void* soundData, int soundLen) {} virtual void updateVideo(const u16* buffer) {} }; #endif desmume-0.9.11/src/gtk/cheatsGTK.cpp0000755000000000000000000003273212467662066015665 0ustar rootroot/* cheats.cpp - this file is part of DeSmuME * * Copyright (C) 2006-2009 DeSmuME Team * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "cheatsGTK.h" #include "cheatSystem.h" #include "main.h" #include "desmume.h" #undef GPOINTER_TO_INT #define GPOINTER_TO_INT(p) ((gint) (glong) (p)) enum { COLUMN_ENABLED, COLUMN_SIZE, COLUMN_HI, COLUMN_LO, COLUMN_DESC, NUM_COL }; enum { COLUMN_SIZE_TEXT, NUM_SIZE_COLUMNS }; enum { TYPE_TOGGLE, TYPE_COMBO, TYPE_STRING }; static struct { const gchar *caption; gint type; gint column; } columnTable[]={ { "Enabled", TYPE_TOGGLE, COLUMN_ENABLED}, { "Size", TYPE_COMBO, COLUMN_SIZE}, { "Offset", TYPE_STRING, COLUMN_HI}, { "Value", TYPE_STRING, COLUMN_LO}, { "Description", TYPE_STRING, COLUMN_DESC} }; static GtkWidget *win = NULL; static BOOL shouldBeRunning = FALSE; // --------------------------------------------------------------------------------- // SEARCH // --------------------------------------------------------------------------------- static void enabled_toggled(GtkCellRendererToggle * cell, gchar * path_str, gpointer data) { GtkTreeModel *model = (GtkTreeModel *) data; GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); gboolean enabled; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, COLUMN_ENABLED, &enabled, -1); enabled ^= 1; CHEATS_LIST cheat; u32 ii; GtkTreePath *path1; path1 = gtk_tree_model_get_path (model, &iter); ii = gtk_tree_path_get_indices (path)[0]; cheats->get(&cheat, ii); cheats->update(cheat.size, cheat.code[0][0], cheat.code[0][1], cheat.description, enabled, ii); gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_ENABLED, enabled, -1); gtk_tree_path_free(path); } static void cheat_list_modify_cheat(GtkCellRendererText * cell, const gchar * path_string, const gchar * new_text, gpointer data) { GtkTreeModel *model = (GtkTreeModel *) data; GtkTreePath *path = gtk_tree_path_new_from_string(path_string); GtkTreeIter iter; gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column")); gtk_tree_model_get_iter(model, &iter, path); { u32 ii; GtkTreePath *path1; CHEATS_LIST cheat; path1 = gtk_tree_model_get_path (model, &iter); ii = gtk_tree_path_get_indices (path)[0]; cheats->get(&cheat, ii); gtk_tree_path_free (path1); if (column == COLUMN_LO || column == COLUMN_HI || column == COLUMN_SIZE) { u32 v = atoi(new_text); switch (column) { case COLUMN_SIZE: cheats->update(v-1, cheat.code[0][0], cheat.code[0][1], cheat.description, cheat.enabled, ii); break; case COLUMN_HI: cheats->update(cheat.size, v, cheat.code[0][1], cheat.description, cheat.enabled, ii); break; case COLUMN_LO: cheats->update(cheat.size, cheat.code[0][0], v, cheat.description, cheat.enabled, ii); break; } gtk_list_store_set(GTK_LIST_STORE(model), &iter, column, atoi(new_text), -1); } else if (column == COLUMN_DESC){ cheats->update(cheat.size, cheat.code[0][0], cheat.code[0][1], g_strdup(new_text), cheat.enabled, ii); gtk_list_store_set(GTK_LIST_STORE(model), &iter, column, g_strdup(new_text), -1); } } } static void cheat_list_remove_cheat(GtkWidget * widget, gpointer data) { GtkTreeView *tree = (GtkTreeView *) data; GtkTreeSelection *selection = gtk_tree_view_get_selection (tree); GtkTreeModel *model = gtk_tree_view_get_model (tree); GtkTreeIter iter; if (gtk_tree_selection_get_selected (selection, NULL, &iter)){ u32 ii; GtkTreePath *path; path = gtk_tree_model_get_path (model, &iter); ii = gtk_tree_path_get_indices (path)[0]; gtk_list_store_remove(GTK_LIST_STORE(model), &iter); cheats->remove(ii); gtk_tree_path_free (path); } } static void cheat_list_add_cheat(GtkWidget * widget, gpointer data) { #define NEW_DESC "New cheat" GtkListStore *store = (GtkListStore *) data; GtkTreeIter iter; cheats->add(1, 0, 0, g_strdup(NEW_DESC), FALSE); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, COLUMN_ENABLED, FALSE, COLUMN_SIZE, 1, COLUMN_HI, 0, COLUMN_LO, 0, COLUMN_DESC, NEW_DESC, -1); #undef NEW_DESC } static GtkTreeModel * create_numbers_model (void) { #define N_NUMBERS 4 gint i = 0; GtkListStore *model; GtkTreeIter iter; /* create list store */ model = gtk_list_store_new (NUM_SIZE_COLUMNS, G_TYPE_STRING, G_TYPE_INT); /* add numbers */ for (i = 1; i < N_NUMBERS+1; i++) { char str[2]; str[0] = '0' + i; str[1] = '\0'; gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, COLUMN_SIZE_TEXT, str, -1); } return GTK_TREE_MODEL (model); #undef N_NUMBERS } static void cheat_list_add_columns(GtkTreeView * tree, GtkListStore * store) { GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree)); static GtkTreeModel * size_model; for (u32 ii = 0; ii < sizeof(columnTable) / sizeof(columnTable[0]); ii++) { GtkCellRenderer *renderer = NULL; GtkTreeViewColumn *column; const gchar *attrib = NULL; switch (columnTable[ii].type) { case TYPE_TOGGLE: renderer = gtk_cell_renderer_toggle_new(); g_signal_connect(renderer, "toggled", G_CALLBACK(enabled_toggled), model); attrib = "active"; break; case TYPE_STRING: renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "editable", TRUE, NULL); g_signal_connect(renderer, "edited", G_CALLBACK(cheat_list_modify_cheat), store); attrib = "text"; break; case TYPE_COMBO: renderer = gtk_cell_renderer_combo_new(); size_model = create_numbers_model(); g_object_set(renderer, "model", size_model, "text-column", COLUMN_SIZE_TEXT, "editable", TRUE, "has-entry", FALSE, NULL); g_object_unref(size_model); g_signal_connect(renderer, "edited", G_CALLBACK(cheat_list_modify_cheat), store); attrib = "text"; break; } column = gtk_tree_view_column_new_with_attributes(columnTable[ii]. caption, renderer, attrib, columnTable[ii].column, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(columnTable[ii].column)); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); } } static void cheatListEnd() { cheats->save(); if(shouldBeRunning) Launch(); } static GtkListStore *cheat_list_populate() { GtkListStore *store = gtk_list_store_new (5, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING); CHEATS_LIST cheat; u32 chsize = cheats->getSize(); for(u32 ii = 0; ii < chsize; ii++){ GtkTreeIter iter; cheats->get(&cheat, ii); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, COLUMN_ENABLED, cheat.enabled, COLUMN_SIZE, cheat.size+1, COLUMN_HI, cheat.code[0][0], COLUMN_LO, cheat.code[0][1], COLUMN_DESC, cheat.description, -1); } return store; } static GtkWidget *cheat_list_create_ui() { GtkListStore *store = cheat_list_populate(); GtkWidget *tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); GtkWidget *vbox = gtk_vbox_new(FALSE, 1); GtkWidget *hbbox = gtk_hbutton_box_new(); GtkWidget *button; gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(tree)); gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(hbbox)); gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); button = gtk_button_new_with_label("add cheat"); g_signal_connect (button, "clicked", G_CALLBACK (cheat_list_add_cheat), store); gtk_container_add(GTK_CONTAINER(hbbox),button); button = gtk_button_new_with_label("Remove cheat"); g_signal_connect (button, "clicked", G_CALLBACK (cheat_list_remove_cheat), tree); gtk_container_add(GTK_CONTAINER(hbbox),button); cheat_list_add_columns(GTK_TREE_VIEW(tree), store); /* Setup the selection handler */ GtkTreeSelection *select; select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)); gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); return tree; } void CheatList () { shouldBeRunning = desmume_running(); Pause(); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Cheat List"); gtk_window_set_modal(GTK_WINDOW(win), TRUE); g_signal_connect(G_OBJECT(win), "destroy", cheatListEnd, NULL); cheat_list_create_ui(); gtk_widget_show_all(win); } // --------------------------------------------------------------------------------- // SEARCH // --------------------------------------------------------------------------------- static void cheat_search_create_ui() { GtkWidget *button; GtkWidget *vbox = gtk_vbox_new(FALSE, 1); GtkWidget *hbbox = gtk_hbutton_box_new(); GtkWidget *b; gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); { b = gtk_hbox_new(FALSE, 1); gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(b)); { GtkTreeModel * size_model; GtkWidget *w; w = gtk_label_new("size"); gtk_container_add(GTK_CONTAINER(b), w); size_model = create_numbers_model(); w = gtk_combo_box_new_with_model(size_model); g_object_unref(size_model); GtkCellRenderer * renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), renderer, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), renderer, "text", COLUMN_SIZE_TEXT, NULL); gtk_combo_box_set_active (GTK_COMBO_BOX (w), 0); gtk_container_add(GTK_CONTAINER(b), w); } b = gtk_hbox_new(FALSE, 1); gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(b)); { GtkWidget *w; w = gtk_label_new("signedness"); gtk_container_add(GTK_CONTAINER(b), w); // m = create_sign_model(); w = gtk_combo_box_new(); // w = gtk_combo_box_new_with_model(size_model); // g_object_unref(size_model); // size_model = NULL; GtkCellRenderer * renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), renderer, TRUE); // gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), renderer, // "text", COLUMN_SIZE_TEXT, // NULL); gtk_combo_box_set_active (GTK_COMBO_BOX (w), 0); gtk_container_add(GTK_CONTAINER(b), w); } } // BUTTONS: gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(hbbox)); button = gtk_button_new_with_label("add cheats"); // g_signal_connect (button, "clicked", g_callback (cheat_list_add_cheat), store); gtk_container_add(GTK_CONTAINER(hbbox),button); button = gtk_button_new_with_label("search"); // g_signal_connect (button, "clicked", g_callback (cheat_list_add_cheat), store); gtk_container_add(GTK_CONTAINER(hbbox),button); // GtkWidget *vbox = gtk_vbox_new(FALSE, 1); // gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); } static void cheatSearchEnd() { } void CheatSearch () { shouldBeRunning = desmume_running(); Pause(); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Cheat Search"); gtk_window_set_modal(GTK_WINDOW(win), TRUE); g_signal_connect(G_OBJECT(win), "destroy", cheatSearchEnd, NULL); cheat_search_create_ui(); gtk_widget_show_all(win); } desmume-0.9.11/src/gtk/avout_x264.cpp0000755000000000000000000000232612467662066015765 0ustar rootroot/* Copyright (C) 2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include "avout_x264.h" AVOutX264::AVOutX264() { const char* const args[] = { "x264", "--qp", "0", "--demuxer", "raw", "--input-csp", "rgb", "--input-depth", "8", "--input-res", "256x384", "--fps", "60", "--output-csp", "i444", "-o", this->filename, "-", NULL }; memcpy(this->args, args, sizeof(args)); } const char* const* AVOutX264::getArgv(const char* fname) { if (strlen(fname) >= sizeof(this->filename)) { return NULL; } strncpy(this->filename, fname, sizeof(this->filename)); return this->args; } desmume-0.9.11/src/gtk/avout_x264.h0000755000000000000000000000170212467662066015427 0ustar rootroot/* Copyright (C) 2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _AVOUT_X264_H_ #define _AVOUT_X264_H_ #include "avout_pipe_base.h" class AVOutX264 : public AVOutPipeBase { public: AVOutX264(); protected: Type type() { return TYPE_VIDEO; } const char* const* getArgv(const char* fname); private: char filename[1024]; const char* args[19]; }; #endif desmume-0.9.11/src/gtk/config_opts.h0000755000000000000000000000434712467662066016030 0ustar rootroot/* Copyright (C) 2014 DeSmuME team Copyright (C) 2014 Alvin Wong This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ /* This file contains a list of config options. #define OPT(name, type, default, section, key) */ /* View */ OPT(view_orient, int, 0, View, ScreenLayout) OPT(view_swap, bool, false, View, SwapScreens) OPT(view_rot, int, 0, View, Rotation) OPT(view_gap, bool, false, View, ScreenGap) OPT(view_filter, int, 0, View, Filter) OPT(view_cairoFilter, int, 3, View, SecondaryFilter) /* default: nearest-neighbour */ OPT(view_menu, bool, true, View, ShowMenu) OPT(view_toolbar, bool, true, View, ShowToolbar) OPT(view_statusbar, bool, true, View, ShowStatusbar) /* Window */ OPT(window_scale, int, 0, Window, Scale2x) /*OPT(window_x, int, -1, Window, X)*/ /*OPT(window_y, int, -1, Window, Y)*/ /*OPT(window_w, int, 0, Window, Width)*/ /*OPT(window_h, int, 0, Window, Height)*/ /*OPT(window_maximized, bool, false, Window, Maximized)*/ OPT(window_fullscreen, bool, false, Window, Fullscreen) /* HUD display */ OPT(hud_fps, bool, false, HudDisplay, Fps) OPT(hud_frameCounter, bool, false, HudDisplay, FrameCounter) OPT(hud_lagCounter, bool, false, HudDisplay, LagCounter) OPT(hud_input, bool, false, HudDisplay, Input) OPT(hud_graphicalInput, bool, false, HudDisplay, GraphicalInput) OPT(hud_rtc, bool, false, HudDisplay, RTC) OPT(hud_mic, bool, false, HudDisplay, Mic) /* Config */ OPT(fpslimiter, bool, true, Config, FpsLimiter) OPT(autoframeskip, bool, true, Config, AudoFrameskip) OPT(frameskip, int, 0, Config, Frameskip) /* Audio */ OPT(audio_enabled, bool, true, Audio, Enabled) OPT(audio_sync, int, 0, Audio, Synchronization) OPT(audio_interpolation, int, 1, Audio, Interpolation) desmume-0.9.11/src/gtk/desmume.desktop0000755000000000000000000000032312467662066016365 0ustar rootroot[Desktop Entry] Version=1.0 Type=Application Name=DeSmuME (Gtk) Comment=Nintento DS emulator TryExec=desmume Exec=desmume Icon=DeSmuME Categories=GNOME;GTK;Game;Emulator; MimeType=application/x-nintendo-ds-rom; desmume-0.9.11/src/gtk/osmesa_3Demu.cpp0000755000000000000000000000337212467662066016372 0ustar rootroot/* Copyright (C) 2009 Guillaume Duhamel This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_LIBOSMESA #include #include #include "../OGLRender.h" #include "osmesa_3Demu.h" static bool osmesa_beginOpenGL(void) { return 1; } static void osmesa_endOpenGL(void) { } static bool osmesa_init(void) { return true; } static void * buffer = NULL; static OSMesaContext ctx; void deinit_osmesa_3Demu (void) { free(buffer); OSMesaDestroyContext(ctx); } int init_osmesa_3Demu(void) { if (!ctx) { printf("OSMesaCreateContext failed!\n"); return false; } buffer = malloc(256 * 192 * 4); if (!buffer) { printf("Could not allocate enough memory!\n"); return false; } if (!OSMesaMakeCurrent(ctx, buffer, GL_UNSIGNED_BYTE, 256, 192)) { printf("OSMesaMakeCurrent failed!\n"); free(buffer); return false; } oglrender_init = osmesa_init; oglrender_beginOpenGL = osmesa_beginOpenGL; oglrender_endOpenGL = osmesa_endOpenGL; return true; } #endif desmume-0.9.11/src/gtk/dTool.h0000755000000000000000000000064612467662066014575 0ustar rootroot#ifndef __DTOOL_H__ #define __DTOOL_H__ typedef void (*dTool_openFn)(int id); typedef void (*dTool_updateFn)(); typedef void (*dTool_closeFn)(); typedef struct { /* this should be the same name of the action in the gui xml */ const char shortname[16]; const char name[32]; dTool_openFn open; dTool_updateFn update; dTool_closeFn close; } dTool_t; extern void dTool_CloseCallback(int id); #endif /*__DTOOL_H__*/ desmume-0.9.11/src/gtk/Makefile.in0000644000000000000000000010032212467662234015372 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk bin_PROGRAMS = desmume$(EXEEXT) @HAVE_GDB_STUB_TRUE@am__append_1 = ../gdbstub/libgdbstub.a @HAVE_LIBOSMESA_TRUE@am__append_2 = $(OSMESA_LIBS) @HAVE_GL_GLX_TRUE@@HAVE_LIBOSMESA_FALSE@am__append_3 = $(GLX_LIBS) subdir = src/gtk ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" \ "$(DESTDIR)$(pixmapdir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_desmume_OBJECTS = avout_pipe_base.$(OBJEXT) avout_x264.$(OBJEXT) \ avout_flac.$(OBJEXT) config.$(OBJEXT) desmume.$(OBJEXT) \ dToolsList.$(OBJEXT) tools/ioregsView.$(OBJEXT) \ ../sndsdl.$(OBJEXT) ../ctrlssdl.$(OBJEXT) ../driver.$(OBJEXT) \ osmesa_3Demu.$(OBJEXT) glx_3Demu.$(OBJEXT) cheatsGTK.$(OBJEXT) \ ../filter/hq2x.$(OBJEXT) ../filter/hq4x.$(OBJEXT) \ ../filter/2xsai.$(OBJEXT) ../filter/bilinear.$(OBJEXT) \ ../filter/epx.$(OBJEXT) ../filter/lq2x.$(OBJEXT) \ ../filter/scanline.$(OBJEXT) ../filter/videofilter.$(OBJEXT) \ main.$(OBJEXT) desmume_OBJECTS = $(am_desmume_OBJECTS) am__DEPENDENCIES_1 = @HAVE_LIBOSMESA_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) @HAVE_GL_GLX_TRUE@@HAVE_LIBOSMESA_FALSE@am__DEPENDENCIES_3 = \ @HAVE_GL_GLX_TRUE@@HAVE_LIBOSMESA_FALSE@ $(am__DEPENDENCIES_1) desmume_DEPENDENCIES = ../libdesmume.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__append_1) $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_3) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(desmume_SOURCES) DIST_SOURCES = $(desmume_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(Applications_DATA) $(pixmap_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(GTK_CFLAGS) \ $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) AM_LDFLAGS = Applicationsdir = $(datadir)/applications Applications_DATA = desmume.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = DeSmuME.xpm EXTRA_DIST = DeSmuME.xpm desmume.desktop desmume_SOURCES = \ avout.h \ avout_pipe_base.cpp avout_pipe_base.h \ avout_x264.cpp avout_x264.h \ avout_flac.cpp avout_flac.h \ config.cpp config.h config_opts.h \ desmume.h desmume.cpp \ dTool.h dToolsList.cpp \ tools/ioregsView.cpp tools/ioregsView.h \ ../sndsdl.cpp \ ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp \ osmesa_3Demu.cpp osmesa_3Demu.h \ glx_3Demu.cpp glx_3Demu.h \ cheatsGTK.h cheatsGTK.cpp \ ../filter/hq2x.cpp ../filter/hq2x.h \ ../filter/hq4x.cpp ../filter/hq4x.h \ ../filter/2xsai.cpp ../filter/bilinear.cpp \ ../filter/epx.cpp ../filter/lq2x.cpp \ ../filter/scanline.cpp \ ../filter/videofilter.cpp ../filter/videofilter.h \ main.cpp main.h desmume_LDADD = ../libdesmume.a $(SDL_LIBS) $(GTK_LIBS) \ $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) \ $(LIBSOUNDTOUCH_LIBS) $(am__append_1) $(am__append_2) \ $(am__append_3) UPDATE_DESKTOP = \ appsdir=$(DESTDIR)$(datadir)/applications ; \ if [ -f $$appsdir/mimeinfo.cache ] ; then \ if test ! "x$(UPDATEDESKTOP)" = "x" ; then \ $(UPDATEDESKTOP) $$appsdir ; \ fi \ fi all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) tools/$(am__dirstamp): @$(MKDIR_P) tools @: > tools/$(am__dirstamp) tools/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tools/$(DEPDIR) @: > tools/$(DEPDIR)/$(am__dirstamp) tools/ioregsView.$(OBJEXT): tools/$(am__dirstamp) \ tools/$(DEPDIR)/$(am__dirstamp) ../$(am__dirstamp): @$(MKDIR_P) .. @: > ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../$(DEPDIR) @: > ../$(DEPDIR)/$(am__dirstamp) ../sndsdl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../ctrlssdl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../driver.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../filter/$(am__dirstamp): @$(MKDIR_P) ../filter @: > ../filter/$(am__dirstamp) ../filter/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../filter/$(DEPDIR) @: > ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/hq2x.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/hq4x.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/2xsai.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/bilinear.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/epx.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/lq2x.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/scanline.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) ../filter/videofilter.$(OBJEXT): ../filter/$(am__dirstamp) \ ../filter/$(DEPDIR)/$(am__dirstamp) desmume$(EXEEXT): $(desmume_OBJECTS) $(desmume_DEPENDENCIES) $(EXTRA_desmume_DEPENDENCIES) @rm -f desmume$(EXEEXT) $(CXXLINK) $(desmume_OBJECTS) $(desmume_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../ctrlssdl.$(OBJEXT) -rm -f ../driver.$(OBJEXT) -rm -f ../filter/2xsai.$(OBJEXT) -rm -f ../filter/bilinear.$(OBJEXT) -rm -f ../filter/epx.$(OBJEXT) -rm -f ../filter/hq2x.$(OBJEXT) -rm -f ../filter/hq4x.$(OBJEXT) -rm -f ../filter/lq2x.$(OBJEXT) -rm -f ../filter/scanline.$(OBJEXT) -rm -f ../filter/videofilter.$(OBJEXT) -rm -f ../sndsdl.$(OBJEXT) -rm -f tools/ioregsView.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/ctrlssdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/sndsdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/2xsai.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/bilinear.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/epx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/hq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/hq4x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/lq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/scanline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../filter/$(DEPDIR)/videofilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avout_flac.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avout_pipe_base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avout_x264.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheatsGTK.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dToolsList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desmume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glx_3Demu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osmesa_3Demu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/ioregsView.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-ApplicationsDATA: $(Applications_DATA) @$(NORMAL_INSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(Applicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(Applicationsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Applicationsdir)" || exit $$?; \ done uninstall-ApplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(Applicationsdir)'; $(am__uninstall_files_from_dir) install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \ done uninstall-pixmapDATA: @$(NORMAL_UNINSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" "$(DESTDIR)$(pixmapdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../$(DEPDIR)/$(am__dirstamp) -rm -f ../$(am__dirstamp) -rm -f ../filter/$(DEPDIR)/$(am__dirstamp) -rm -f ../filter/$(am__dirstamp) -rm -f tools/$(DEPDIR)/$(am__dirstamp) -rm -f tools/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ../$(DEPDIR) ../filter/$(DEPDIR) ./$(DEPDIR) tools/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-ApplicationsDATA install-pixmapDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ../$(DEPDIR) ../filter/$(DEPDIR) ./$(DEPDIR) tools/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-ApplicationsDATA uninstall-binPROGRAMS \ uninstall-pixmapDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-data-am install-strip tags-recursive \ uninstall-am .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install \ install-ApplicationsDATA install-am install-binPROGRAMS \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pixmapDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-ApplicationsDATA uninstall-am \ uninstall-binPROGRAMS uninstall-hook uninstall-pixmapDATA install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/gtk/desmume.cpp0000755000000000000000000000303512467662066015501 0ustar rootroot/* desmume.c - this file is part of DeSmuME * * Copyright (C) 2006-2015 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "desmume.h" #include "../NDSSystem.h" #include "../SPU.h" #include "../sndsdl.h" #include "../movie.h" volatile bool execute = false; BOOL click = FALSE; void desmume_init( int disable_sound) { NDS_Init(); if ( !disable_sound) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); } execute = false; } void desmume_free( void) { execute = false; NDS_DeInit(); } void desmume_pause( void) { execute = false; SPU_Pause(1); } void desmume_resume( void) { execute = true; SPU_Pause(0); } void desmume_toggle( void) { execute ^= true; } bool desmume_running( void) { return execute; } void desmume_cycle( void) { FCEUMOV_AddInputState(); NDS_exec(); SPU_Emulate_user(); } desmume-0.9.11/src/gtk/avout_pipe_base.h0000755000000000000000000000214512467662066016655 0ustar rootroot/* Copyright (C) 2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _AVOUT_PIPE_BASE_H_ #define _AVOUT_PIPE_BASE_H_ #include "avout.h" class AVOutPipeBase : public AVOut { public: bool begin(const char* fname); void end(); bool isRecording(); void updateAudio(void* soundData, int soundLen); void updateVideo(const u16* buffer); protected: enum Type { TYPE_AUDIO, TYPE_VIDEO }; virtual Type type() = 0; virtual const char* const* getArgv(const char* fname) = 0; private: bool recording; int pipe_fd; }; #endif desmume-0.9.11/src/gtk/dToolsList.cpp0000755000000000000000000000175512467662066016151 0ustar rootroot/* dToolsList.cpp * * Copyright (C) 2006 Thoduv * Copyright (C) 2006-2015 DeSmuME Team * * This file is part of DeSmuME * * DeSmuME is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * DeSmuME is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with DeSmuME; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dTool.h" #include "../types.h" #include "tools/ioregsView.h" dTool_t *dTools_list[] = { &dTool_ioregsView }; int dTools_list_size = ARRAY_SIZE(dTools_list); desmume-0.9.11/src/gtk/main.cpp0000755000000000000000000032515612467662066015001 0ustar rootroot/* main.cpp - this file is part of DeSmuME * * Copyright (C) 2006-2015 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef GTK_UI #define GTK_UI #endif #include "version.h" #include #include #include #include #include #include #include "types.h" #include "firmware.h" #include "NDSSystem.h" #include "driver.h" #include "GPU.h" #include "SPU.h" #include "sndsdl.h" #include "ctrlssdl.h" #include "MMU.h" #include "render3D.h" #include "desmume.h" #include "debug.h" #include "rasterize.h" #include "saves.h" #include "mic.h" #include "movie.h" #include "dTool.h" #include "desmume_config.h" #include "cheatsGTK.h" #include "GPU_osd.h" #include "avout_x264.h" #include "avout_flac.h" #include "commandline.h" #include "slot2.h" #include "utils/xstring.h" #include "filter/videofilter.h" #ifdef GDB_STUB #include "armcpu.h" #include "gdbstub.h" #endif #if defined(HAVE_LIBOSMESA) || defined(HAVE_GL_GLX) #include #include #include "OGLRender.h" #include "OGLRender_3_2.h" #include "osmesa_3Demu.h" #include "glx_3Demu.h" #endif #include "config.h" #include "DeSmuME.xpm" #undef GPOINTER_TO_INT #define GPOINTER_TO_INT(p) ((gint) (glong) (p)) #undef GPOINTER_TO_UINT #define GPOINTER_TO_UINT(p) ((guint) (glong) (p)) #define EMULOOP_PRIO (G_PRIORITY_HIGH_IDLE + 20 + 1) #define GAP_SIZE 64 static int draw_count; extern int _scanline_filter_a, _scanline_filter_b, _scanline_filter_c, _scanline_filter_d; VideoFilter* video; desmume::config::Config config; enum { MAIN_BG_0 = 0, MAIN_BG_1, MAIN_BG_2, MAIN_BG_3, MAIN_OBJ, SUB_BG_0, SUB_BG_1, SUB_BG_2, SUB_BG_3, SUB_OBJ }; gboolean EmuLoop(gpointer data); static AVOutX264 avout_x264; static AVOutFlac avout_flac; static void RecordAV_x264(); static void RecordAV_flac(); static void RecordAV_stop(); static void RedrawScreen(); static void DoQuit(); static void RecordMovieDialog(); static void PlayMovieDialog(); static void StopMovie(); static void OpenNdsDialog(); static void SaveStateDialog(); static void LoadStateDialog(); void Launch(); void Pause(); static void ResetSaveStateTimes(); static void LoadSaveStateInfo(); static void Printscreen(); static void Reset(); static void Edit_Controls(); static void Edit_Joystick_Controls(); static void MenuSave(GtkMenuItem *item, gpointer slot); static void MenuLoad(GtkMenuItem *item, gpointer slot); static void About(); static void ToggleMenuVisible(GtkToggleAction *action); static void ToggleStatusbarVisible(GtkToggleAction *action); static void ToggleToolbarVisible(GtkToggleAction *action); static void ToggleFullscreen (GtkToggleAction *action); static void ToggleAudio (GtkToggleAction *action); #ifdef FAKE_MIC static void ToggleMicNoise (GtkToggleAction *action); #endif static void ToggleFpsLimiter (GtkToggleAction *action); static void ToggleAutoFrameskip (GtkToggleAction *action); static void ToggleSwapScreens(GtkToggleAction *action); static void ToggleGap (GtkToggleAction *action); static void SetRotation(GtkAction *action, GtkRadioAction *current); static void SetWinSize(GtkAction *action, GtkRadioAction *current); static void SetOrientation(GtkAction *action, GtkRadioAction *current); static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data); static void ToggleHudDisplay(GtkToggleAction* action, gpointer data); #ifdef DESMUME_GTK_FIRMWARE_BROKEN static void SelectFirmwareFile(); #endif static const char *ui_description = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " #ifdef GTK_DESMUME_FIRMWARE_BROKEN " " #endif " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " #ifdef HAVE_LIBAGG " " " " " " " " " " " " " " " " " " #else " " #endif " " " " " " " " " " " " " " " " #ifdef FAKE_MIC " " #endif " " " " " " " " #ifdef HAVE_LIBSOUNDTOUCH " " #endif " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; static const GtkActionEntry action_entries[] = { { "FileMenu", NULL, "_File" }, { "open", "gtk-open", "_Open", "o", NULL, OpenNdsDialog }, { "RecentMenu", NULL, "Open _recent" }, { "run", "gtk-media-play", "_Run", "Pause", NULL, Launch }, { "pause", "gtk-media-pause", "_Pause", "Pause", NULL, Pause }, { "reset", "gtk-refresh", "Re_set", NULL, NULL, Reset }, { "savestateto", NULL, "Save state _to ...", NULL, NULL, SaveStateDialog }, { "loadstatefrom", NULL, "Load state _from ...", NULL, NULL, LoadStateDialog }, { "recordmovie", NULL, "Record movie _to ...", NULL, NULL, RecordMovieDialog }, { "playmovie", NULL, "Play movie _from ...", NULL, NULL, PlayMovieDialog }, { "stopmovie", NULL, "Stop movie", NULL, NULL, StopMovie }, { "RecordAVMenu", NULL, "Record _video/audio" }, { "record_x264", "gtk-media-record", "Record lossless H._264 (video only)...", NULL, NULL, RecordAV_x264 }, { "record_flac", "gtk-media-record", "Record _flac (audio only)...", NULL, NULL, RecordAV_flac }, { "record_stop", "gtk-media-stop", "_Stop recording", NULL, NULL, RecordAV_stop }, { "SavestateMenu", NULL, "_Save state" }, { "LoadstateMenu", NULL, "_Load state" }, #ifdef DESMUME_GTK_FIRMWARE_BROKEN { "loadfirmware","gtk-open", "Load Firm_ware file", "l", NULL, SelectFirmwareFile }, #endif { "printscreen","gtk-media-record", "Take a _screenshot", "s", NULL, Printscreen }, { "quit", "gtk-quit", "_Quit", "q", NULL, DoQuit }, { "ViewMenu", NULL, "_View" }, { "RotationMenu", NULL, "_Rotation" }, { "OrientationMenu", NULL, "LCDs _Layout" }, { "WinsizeMenu", NULL, "_Window Size" }, { "PriInterpolationMenu", NULL, "Video _Filter" }, { "InterpolationMenu", NULL, "S_econdary Video Filter" }, { "HudMenu", NULL, "_HUD" }, #ifndef HAVE_LIBAGG { "hud_notsupported", NULL, "HUD support not compiled" }, #endif { "ConfigMenu", NULL, "_Config" }, { "SPUModeMenu", NULL, "Audio _Synchronization" }, { "SPUInterpolationMenu", NULL, "Audio _Interpolation" }, { "FrameskipMenu", NULL, "_Frameskip" }, { "CheatMenu", NULL, "_Cheat" }, { "cheatsearch", NULL, "_Search", NULL, NULL, CheatSearch }, { "cheatlist", NULL, "_List", NULL, NULL, CheatList }, { "ConfigSaveMenu", NULL, "_Saves" }, { "editctrls", NULL, "_Edit controls",NULL, NULL, Edit_Controls }, { "editjoyctrls", NULL, "Edit _Joystick controls",NULL, NULL, Edit_Joystick_Controls }, { "ToolsMenu", NULL, "_Tools" }, { "LayersMenu", NULL, "View _Layers" }, { "HelpMenu", NULL, "_Help" }, { "about", "gtk-about", "_About", NULL, NULL, About } }; static const GtkToggleActionEntry toggle_entries[] = { { "enableaudio", NULL, "_Enable audio", NULL, NULL, G_CALLBACK(ToggleAudio), TRUE}, #ifdef FAKE_MIC { "micnoise", NULL, "Fake mic _noise", NULL, NULL, G_CALLBACK(ToggleMicNoise), FALSE}, #endif { "enablefpslimiter", NULL, "_Limit to 60 fps", NULL, NULL, G_CALLBACK(ToggleFpsLimiter), TRUE}, { "frameskipA", NULL, "_Auto-minimize skipping", NULL, NULL, G_CALLBACK(ToggleAutoFrameskip), TRUE}, { "gap", NULL, "Screen _Gap", NULL, NULL, G_CALLBACK(ToggleGap), FALSE}, { "view_menu", NULL, "Show _menu", NULL, NULL, G_CALLBACK(ToggleMenuVisible), TRUE}, { "view_toolbar", NULL, "Show _toolbar", NULL, NULL, G_CALLBACK(ToggleToolbarVisible), TRUE}, { "view_statusbar", NULL, "Show _statusbar", NULL, NULL, G_CALLBACK(ToggleStatusbarVisible), TRUE}, { "orient_swapscreens", NULL, "S_wap screens", "space", NULL, G_CALLBACK(ToggleSwapScreens), FALSE}, { "fullscreen", NULL, "_Fullscreen", "F11", NULL, G_CALLBACK(ToggleFullscreen), FALSE}, }; static const GtkRadioActionEntry pri_interpolation_entries[] = { { "pri_interp_none", NULL, VideoFilterAttributesList[VideoFilterTypeID_None].typeString, NULL, NULL, VideoFilterTypeID_None}, { "pri_interp_lq2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_LQ2X].typeString, NULL, NULL, VideoFilterTypeID_LQ2X}, { "pri_interp_lq2xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_LQ2XS].typeString, NULL, NULL, VideoFilterTypeID_LQ2XS}, { "pri_interp_hq2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ2X].typeString, NULL, NULL, VideoFilterTypeID_HQ2X}, { "pri_interp_hq2xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ2XS].typeString, NULL, NULL, VideoFilterTypeID_HQ2XS}, { "pri_interp_hq4x", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ4X].typeString, NULL, NULL, VideoFilterTypeID_HQ4X}, { "pri_interp_hq4xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ4XS].typeString, NULL, NULL, VideoFilterTypeID_HQ4XS}, { "pri_interp_2xsai", NULL, VideoFilterAttributesList[VideoFilterTypeID_2xSaI].typeString, NULL, NULL, VideoFilterTypeID_2xSaI}, { "pri_interp_super2xsai", NULL, VideoFilterAttributesList[VideoFilterTypeID_Super2xSaI].typeString, NULL, NULL, VideoFilterTypeID_Super2xSaI}, { "pri_interp_supereagle", NULL, VideoFilterAttributesList[VideoFilterTypeID_SuperEagle].typeString, NULL, NULL, VideoFilterTypeID_SuperEagle}, { "pri_interp_scanline", NULL, VideoFilterAttributesList[VideoFilterTypeID_Scanline].typeString, NULL, NULL, VideoFilterTypeID_Scanline}, { "pri_interp_bilinear", NULL, VideoFilterAttributesList[VideoFilterTypeID_Bilinear].typeString, NULL, NULL, VideoFilterTypeID_Bilinear}, { "pri_interp_nearest2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_Nearest2X].typeString, NULL, NULL, VideoFilterTypeID_Nearest2X}, { "pri_interp_nearest_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_Nearest1_5X].typeString, NULL, NULL, VideoFilterTypeID_Nearest1_5X}, { "pri_interp_nearestplus_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_NearestPlus1_5X].typeString, NULL, NULL, VideoFilterTypeID_NearestPlus1_5X}, { "pri_interp_epx", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPX].typeString, NULL, NULL, VideoFilterTypeID_EPX}, { "pri_interp_epxplus", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPXPlus].typeString, NULL, NULL, VideoFilterTypeID_EPXPlus}, { "pri_interp_epx_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPX1_5X].typeString, NULL, NULL, VideoFilterTypeID_EPX1_5X}, { "pri_interp_epxplus_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPXPlus1_5X].typeString, NULL, NULL, VideoFilterTypeID_EPXPlus1_5X}, { "pri_interp_2xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_2xBRZ].typeString, NULL, NULL, VideoFilterTypeID_2xBRZ}, { "pri_interp_3xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_3xBRZ].typeString, NULL, NULL, VideoFilterTypeID_3xBRZ}, { "pri_interp_4xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_4xBRZ].typeString, NULL, NULL, VideoFilterTypeID_4xBRZ}, { "pri_interp_5xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_5xBRZ].typeString, NULL, NULL, VideoFilterTypeID_5xBRZ}, }; static const GtkRadioActionEntry interpolation_entries[] = { { "interp_fast", NULL, "_Fast", NULL, NULL, CAIRO_FILTER_FAST }, { "interp_nearest", NULL, "_Nearest-neighbor", NULL, NULL, CAIRO_FILTER_NEAREST }, { "interp_good", NULL, "_Good", NULL, NULL, CAIRO_FILTER_GOOD }, { "interp_bilinear", NULL, "_Bilinear", NULL, NULL, CAIRO_FILTER_BILINEAR }, { "interp_best", NULL, "B_est", NULL, NULL, CAIRO_FILTER_BEST }, }; static const GtkRadioActionEntry rotation_entries[] = { { "rotate_0", "gtk-orientation-portrait", "_0", NULL, NULL, 0 }, { "rotate_90", "gtk-orientation-landscape", "_90", NULL, NULL, 90 }, { "rotate_180", "gtk-orientation-reverse-portrait", "_180",NULL, NULL, 180 }, { "rotate_270", "gtk-orientation-reverse-landscape", "_270",NULL, NULL, 270 }, }; enum winsize_enum { WINSIZE_SCALE = 0, WINSIZE_HALF = 1, WINSIZE_1 = 2, WINSIZE_1HALF = 3, WINSIZE_2 = 4, WINSIZE_2HALF = 5, WINSIZE_3 = 6, WINSIZE_4 = 8, WINSIZE_5 = 10, }; static winsize_enum winsize_current; static const GtkRadioActionEntry winsize_entries[] = { { "winsize_half", NULL, "0_.5x", NULL, NULL, WINSIZE_HALF }, { "winsize_1", NULL, "_1x", NULL, NULL, WINSIZE_1 }, { "winsize_1half", NULL, "1.5x", NULL, NULL, WINSIZE_1HALF }, { "winsize_2", NULL, "_2x", NULL, NULL, WINSIZE_2 }, { "winsize_2half", NULL, "2.5x", NULL, NULL, WINSIZE_2HALF }, { "winsize_3", NULL, "_3x", NULL, NULL, WINSIZE_3 }, { "winsize_4", NULL, "_4x", NULL, NULL, WINSIZE_4 }, { "winsize_5", NULL, "_5x", NULL, NULL, WINSIZE_5 }, { "winsize_scale", NULL, "_Scale to window", NULL, NULL, WINSIZE_SCALE }, }; /* When adding modes here remember to add the relevent entry to screen_size */ enum orientation_enum { ORIENT_VERTICAL = 0, ORIENT_HORIZONTAL = 1, ORIENT_SINGLE = 2, ORIENT_N }; static const GtkRadioActionEntry orientation_entries[] = { { "orient_vertical", NULL, "_Vertical", "1", NULL, ORIENT_VERTICAL }, { "orient_horizontal", NULL, "_Horizontal", "2", NULL, ORIENT_HORIZONTAL }, { "orient_single", NULL, "_Single screen", "0", NULL, ORIENT_SINGLE }, }; struct screen_size_t { gint width; gint height; }; const struct screen_size_t screen_size[ORIENT_N] = { {256, 384}, {512, 192}, {256, 192} }; enum spumode_enum { SPUMODE_DUALASYNC = 0, SPUMODE_SYNCN = 1, SPUMODE_SYNCZ = 2, SPUMODE_SYNCP = 3 }; static const GtkRadioActionEntry spumode_entries[] = { { "SPUModeSyncN", NULL, "Synchronous (N)", NULL, NULL, SPUMODE_SYNCN}, { "SPUModeSyncZ", NULL, "Synchronous (Z)", NULL, NULL, SPUMODE_SYNCZ}, #ifdef HAVE_LIBSOUNDTOUCH { "SPUModeSyncP", NULL, "Synchronous (P)", NULL, NULL, SPUMODE_SYNCP}, #endif { "SPUModeDualASync", NULL, "Dual Asynchronous", NULL, NULL, SPUMODE_DUALASYNC} }; static const GtkRadioActionEntry spuinterpolation_entries[] = { { "SPUInterpolationNone", NULL, "_None", NULL, NULL, SPUInterpolation_None }, { "SPUInterpolationLinear", NULL, "_Linear", NULL, NULL, SPUInterpolation_Linear }, { "SPUInterpolationCosine", NULL, "_Cosine", NULL, NULL, SPUInterpolation_Cosine } }; enum frameskip_enum { FRAMESKIP_0 = 0, FRAMESKIP_1 = 1, FRAMESKIP_2 = 2, FRAMESKIP_3 = 3, FRAMESKIP_4 = 4, FRAMESKIP_5 = 5, FRAMESKIP_6 = 6, FRAMESKIP_7 = 7, FRAMESKIP_8 = 8, FRAMESKIP_9 = 9, }; static const GtkRadioActionEntry frameskip_entries[] = { { "frameskip0", NULL, "_0 (never skip)", NULL, NULL, FRAMESKIP_0}, { "frameskip1", NULL, "_1", NULL, NULL, FRAMESKIP_1}, { "frameskip2", NULL, "_2", NULL, NULL, FRAMESKIP_2}, { "frameskip3", NULL, "_3", NULL, NULL, FRAMESKIP_3}, { "frameskip4", NULL, "_4", NULL, NULL, FRAMESKIP_4}, { "frameskip5", NULL, "_5", NULL, NULL, FRAMESKIP_5}, { "frameskip6", NULL, "_6", NULL, NULL, FRAMESKIP_6}, { "frameskip7", NULL, "_7", NULL, NULL, FRAMESKIP_7}, { "frameskip8", NULL, "_8", NULL, NULL, FRAMESKIP_8}, { "frameskip9", NULL, "_9", NULL, NULL, FRAMESKIP_9}, }; static const GtkRadioActionEntry savet_entries[] = { { "save_t0", NULL, "_0 Autodetect", NULL, NULL, 0}, { "save_t1", NULL, "_1 EEPROM 4kbit", NULL, NULL, 1}, { "save_t2", NULL, "_2 EEPROM 64kbit", NULL, NULL, 2}, { "save_t3", NULL, "_3 EEPROM 512kbit", NULL, NULL, 3}, { "save_t4", NULL, "_4 FRAM 256kbit", NULL, NULL, 4}, { "save_t5", NULL, "_5 FLASH 2mbit", NULL, NULL, 5}, { "save_t6", NULL, "_6 FLASH 4mbit", NULL, NULL, 6} }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDSDL, NULL }; GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, #if defined(HAVE_LIBOSMESA) || defined(HAVE_GL_GLX) &gpu3Dgl, #endif }; static const u16 gtk_kb_cfg[NB_KEYS] = { GDK_x, // A GDK_z, // B GDK_Shift_R, // select GDK_Return, // start GDK_Right, // Right GDK_Left, // Left GDK_Up, // Up GDK_Down, // Down GDK_w, // R GDK_q, // L GDK_s, // X GDK_a, // Y GDK_p, // DEBUG GDK_o, // BOOST GDK_BackSpace, // Lid }; GKeyFile *keyfile; struct modify_key_ctx { gint mk_key_chosen; GtkWidget *label; u8 key_id; }; static u16 keys_latch = 0; static u16 gdk_shift_pressed = 0; u16 Keypad_Temp[NB_KEYS]; class configured_features : public CommandLine { public: int engine_3d; int savetype; int firmware_language; int timeout; }; static void init_configured_features( class configured_features *config) { config->engine_3d = 1; config->savetype = 0; config->timeout = 0; /* use the default language */ config->firmware_language = -1; } static int fill_configured_features( class configured_features *config, int argc, char ** argv) { GOptionEntry options[] = { { "3d-engine", 0, 0, G_OPTION_ARG_INT, &config->engine_3d, "Select 3d rendering engine. Available engines:\n" "\t\t\t\t 0 = 3d disabled\n" "\t\t\t\t 1 = internal rasterizer (default)\n" #if defined(HAVE_LIBOSMESA) || defined(HAVE_GL_GLX) "\t\t\t\t 2 = opengl\n" #endif ,"ENGINE"}, { "save-type", 0, 0, G_OPTION_ARG_INT, &config->savetype, "Select savetype from the following:\n" "\t\t\t\t 0 = Autodetect (default)\n" "\t\t\t\t 1 = EEPROM 4kbit\n" "\t\t\t\t 2 = EEPROM 64kbit\n" "\t\t\t\t 3 = EEPROM 512kbit\n" "\t\t\t\t 4 = FRAM 256kbit\n" "\t\t\t\t 5 = FLASH 2mbit\n" "\t\t\t\t 6 = FLASH 4mbit\n", "SAVETYPE"}, { "fwlang", 0, 0, G_OPTION_ARG_INT, &config->firmware_language, "Set the language in the firmware, LANG as follows:\n" "\t\t\t\t 0 = Japanese\n" "\t\t\t\t 1 = English\n" "\t\t\t\t 2 = French\n" "\t\t\t\t 3 = German\n" "\t\t\t\t 4 = Italian\n" "\t\t\t\t 5 = Spanish\n", "LANG"}, { "timeout", 0, 0, G_OPTION_ARG_INT, &config->timeout, "Quit DeSmuME after the specified seconds for testing purpose.", "SECONDS"}, { NULL } }; config->loadCommonOptions(); g_option_context_add_main_entries (config->ctx, options, "options"); g_option_context_add_group (config->ctx, gtk_get_option_group (TRUE)); config->parse(argc,argv); if(!config->validate()) goto error; if (config->savetype < 0 || config->savetype > 6) { g_printerr("Accepted savetypes are from 0 to 6.\n"); return false; } if (config->firmware_language < -1 || config->firmware_language > 5) { g_printerr("Firmware language must be set to a value from 0 to 5.\n"); goto error; } if (config->engine_3d != 0 && config->engine_3d != 1 #if defined(HAVE_LIBOSMESA) || defined(HAVE_GL_GLX) && config->engine_3d != 2 #endif ) { g_printerr("Currently available ENGINES: 0, 1" #if defined(HAVE_LIBOSMESA) || defined(HAVE_GL_GLX) ", 2" #endif "\n"); goto error; } #ifdef GDB_STUB if (config->arm9_gdb_port != 0 && (config->arm9_gdb_port < 1 || config->arm9_gdb_port > 65535)) { g_printerr("ARM9 GDB stub port must be in the range 1 to 65535\n"); goto error; } if (config->arm7_gdb_port != 0 && (config->arm7_gdb_port < 1 || config->arm7_gdb_port > 65535)) { g_printerr("ARM7 GDB stub port must be in the range 1 to 65535\n"); goto error; } #endif return 1; error: config->errorHelp(argv[0]); return 0; } /* * The thread handling functions needed by the GDB stub code. */ #ifdef GDB_STUB void * createThread_gdb( void (*thread_function)( void *data), void *thread_data) { GThread *new_thread = g_thread_create( (GThreadFunc)thread_function, thread_data, TRUE, NULL); return new_thread; } void joinThread_gdb( void *thread_handle) { g_thread_join( (GThread *)thread_handle); } #endif /************************ GTK *******************************/ uint SPUMode = SPUMODE_DUALASYNC; uint Frameskip = 0; uint autoFrameskipMax = 0; bool autoframeskip = true; cairo_filter_t Interpolation = CAIRO_FILTER_NEAREST; static GtkWidget *pWindow; static GtkWidget *pStatusBar; static GtkWidget *pDrawingArea; static GtkActionGroup * action_group; static GtkUIManager *ui_manager; struct nds_screen_t { guint gap_size; gint rotation_angle; orientation_enum orientation; cairo_matrix_t touch_matrix; cairo_matrix_t topscreen_matrix; gboolean swap; }; struct nds_screen_t nds_screen; static BOOL regMainLoop = FALSE; static inline void UpdateStatusBar (const char *message) { gint pStatusBar_Ctx; pStatusBar_Ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(pStatusBar), "Global"); gtk_statusbar_pop(GTK_STATUSBAR(pStatusBar), pStatusBar_Ctx); gtk_statusbar_push(GTK_STATUSBAR(pStatusBar), pStatusBar_Ctx, message); } static void About() { GdkPixbuf * pixbuf = gdk_pixbuf_new_from_xpm_data(DeSmuME_xpm); static const gchar *authors[] = { "yopyop (original author)", "DeSmuME team", NULL }; gtk_show_about_dialog(GTK_WINDOW(pWindow), "program-name", "DeSmuME", "version", EMU_DESMUME_VERSION_STRING() + 1, // skip space "website", "http://desmume.org", "logo", pixbuf, "comments", "Nintendo DS emulator based on work by Yopyop", "authors", authors, NULL); g_object_unref(pixbuf); } static void ToggleMenuVisible(GtkToggleAction *action) { GtkWidget *pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); config.view_menu = gtk_toggle_action_get_active(action); if (config.view_menu) gtk_widget_show(pMenuBar); else gtk_widget_hide(pMenuBar); } static void ToggleToolbarVisible(GtkToggleAction *action) { GtkWidget *pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); config.view_toolbar = gtk_toggle_action_get_active(action); if (config.view_toolbar) gtk_widget_show(pToolBar); else gtk_widget_hide(pToolBar); } static void ToggleStatusbarVisible(GtkToggleAction *action) { config.view_statusbar = gtk_toggle_action_get_active(action); if (config.view_statusbar) gtk_widget_show(pStatusBar); else gtk_widget_hide(pStatusBar); } static void ToggleFullscreen(GtkToggleAction *action) { GtkWidget *pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); GtkWidget *pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); config.window_fullscreen = gtk_toggle_action_get_active(action); if (config.window_fullscreen) { gtk_widget_hide(pMenuBar); gtk_widget_hide(pToolBar); gtk_widget_hide(pStatusBar); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_menu"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_toolbar"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_statusbar"), FALSE); gtk_window_fullscreen(GTK_WINDOW(pWindow)); } else { if (config.view_menu) { gtk_widget_show(pMenuBar); } if (config.view_toolbar) { gtk_widget_show(pToolBar); } if (config.view_statusbar) { gtk_widget_show(pStatusBar); } gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_menu"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_toolbar"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_statusbar"), TRUE); gtk_window_unfullscreen(GTK_WINDOW(pWindow)); } } static int Open(const char *filename) { int res; ResetSaveStateTimes(); res = NDS_LoadROM( filename ); if(res > 0) { LoadSaveStateInfo(); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), TRUE); } return res; } void Launch() { GtkWidget *pause; desmume_resume(); if(!regMainLoop) { g_idle_add_full(EMULOOP_PRIO, &EmuLoop, pWindow, NULL); regMainLoop = TRUE; } UpdateStatusBar("Running ..."); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "reset"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), TRUE); pause = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/pause"))); gtk_widget_grab_focus(pause); } void Pause() { GtkWidget *run; desmume_pause(); UpdateStatusBar("Paused"); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); run = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/run"))); gtk_widget_grab_focus(run); } static void LoadStateDialog() { GtkFileFilter *pFilter_ds, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); gtk_file_filter_set_name(pFilter_ds, "DeSmuME binary (.ds*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Load State From ...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_ds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(savestate_load(sPath) == false ) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to load :\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void RecordMovieDialog() { GtkFileFilter *pFilter_dsm, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); gtk_file_filter_set_name(pFilter_dsm, "DeSmuME movie file (.dsm*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Save Movie To ...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsm); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); FCEUI_SaveMovie(sPath,L"",0,"", FCEUI_MovieGetRTCDefault()); g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void StopMovie() { FCEUI_StopMovie(); } static void PlayMovieDialog() { GtkFileFilter *pFilter_dsm, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); gtk_file_filter_set_name(pFilter_dsm, "DeSmuME movie file (.dsm*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Play movie from...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsm); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); FCEUI_LoadMovie(sPath,true,false,-1); g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void SaveStateDialog() { GtkFileFilter *pFilter_ds, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); gtk_file_filter_set_name(pFilter_ds, "DeSmuME binary (.ds*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Save State To ...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_ds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(savestate_save(sPath) == false ) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to save :\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void RecordAV_x264() { GtkFileFilter *pFilter_mkv, *pFilter_mp4, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_mkv = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_mkv, "*.mkv"); gtk_file_filter_set_name(pFilter_mkv, "Matroska (.mkv)"); pFilter_mp4 = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_mp4, "*.mp4"); gtk_file_filter_set_name(pFilter_mp4, "MP4 (.mp4)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Save video...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_mkv); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_mp4); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(avout_x264.begin(sPath)) { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_x264"), FALSE); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to record video to:\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void RecordAV_flac() { GtkFileFilter *pFilter_flac, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_flac = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_flac, "*.flac"); gtk_file_filter_set_name(pFilter_flac, "FLAC file (.flac)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Save audio...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_flac); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(avout_flac.begin(sPath)) { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_flac"), FALSE); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to record audio to:\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void RecordAV_stop() { avout_x264.end(); avout_flac.end(); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_x264"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_flac"), TRUE); } static void OpenNdsDialog() { GtkFileFilter *pFilter_nds, *pFilter_dsgba, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS]"); #ifdef HAVE_LIBZ gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS].gz"); #endif #ifdef HAVE_LIBZZIP gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS].zip"); #endif gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds)"); pFilter_dsgba = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsgba, "*.ds.gba"); gtk_file_filter_set_name(pFilter_dsgba, "Nds binary with loader (.ds.gba)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Open...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_nds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsgba); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(pFileSelection), g_get_home_dir()); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(Open((const char*)sPath) < 0) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to load :\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { GtkRecentData recentData; gchar *uri; memset(&recentData, 0, sizeof(GtkRecentData)); recentData.mime_type = g_strdup("application/x-nintendo-ds-rom"); recentData.app_name = (gchar *) g_get_application_name (); recentData.app_exec = g_strjoin (" ", g_get_prgname (), "%f", NULL); GtkRecentManager *manager; manager = gtk_recent_manager_get_default (); uri = g_filename_to_uri (sPath, NULL, NULL); gtk_recent_manager_add_full (manager, uri, &recentData); g_free(uri); g_free(recentData.app_name); g_free(recentData.app_exec); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); Launch(); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) { GtkRecentManager *recent_manager = gtk_recent_manager_get_default(); gchar *uri, *romname; int ret; if (desmume_running()) Pause(); uri = gtk_recent_chooser_get_current_uri(chooser); romname = g_filename_from_uri(uri, NULL, NULL); ret = Open(romname); if (ret > 0) { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); Launch(); } else { gtk_recent_manager_remove_item(recent_manager, uri, NULL); GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to load :\n%s", uri); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } g_free(uri); g_free(romname); } static void Reset() { bool shouldBeRunning = desmume_running(); Pause(); NDS_Reset(); // Clear the NDS screen memset(GPU_screen, 0xFF, sizeof(GPU_screen)); RedrawScreen(); if (shouldBeRunning) { Launch(); } } /////////////////////////////// DRAWING SCREEN ////////////////////////////////// static void UpdateDrawingAreaAspect() { gint H, W; if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { W = screen_size[nds_screen.orientation].width; H = screen_size[nds_screen.orientation].height; } else { W = screen_size[nds_screen.orientation].height; H = screen_size[nds_screen.orientation].width; } if (nds_screen.orientation != ORIENT_SINGLE) { if (nds_screen.orientation == ORIENT_VERTICAL) { if ((nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180)) { H += nds_screen.gap_size; } else { W += nds_screen.gap_size; } } } if (winsize_current == WINSIZE_SCALE) { gtk_window_set_resizable(GTK_WINDOW(pWindow), TRUE); gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W, H); } else { gtk_window_unmaximize(GTK_WINDOW(pWindow)); gtk_window_set_resizable(GTK_WINDOW(pWindow), FALSE); gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W * winsize_current / 2, H * winsize_current / 2); } } static void ToggleGap(GtkToggleAction* action) { config.view_gap = gtk_toggle_action_get_active(action); nds_screen.gap_size = config.view_gap ? GAP_SIZE : 0; UpdateDrawingAreaAspect(); } static void SetRotation(GtkAction *action, GtkRadioAction *current) { nds_screen.rotation_angle = gtk_radio_action_get_current_value(current); config.view_rot = nds_screen.rotation_angle; UpdateDrawingAreaAspect(); } static void SetWinsize(GtkAction *action, GtkRadioAction *current) { winsize_current = (winsize_enum) gtk_radio_action_get_current_value(current); config.window_scale = winsize_current; if (config.window_fullscreen) { gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "fullscreen"), FALSE); } gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "fullscreen"), winsize_current == WINSIZE_SCALE); UpdateDrawingAreaAspect(); } static void SetOrientation(GtkAction *action, GtkRadioAction *current) { nds_screen.orientation = (orientation_enum)gtk_radio_action_get_current_value(current); #ifdef HAVE_LIBAGG osd->singleScreen = nds_screen.orientation == ORIENT_SINGLE; #endif config.view_orient = nds_screen.orientation; UpdateDrawingAreaAspect(); } static void ToggleSwapScreens(GtkToggleAction *action) { nds_screen.swap = gtk_toggle_action_get_active(action); #ifdef HAVE_LIBAGG osd->swapScreens = nds_screen.swap; #endif config.view_swap = nds_screen.swap; RedrawScreen(); } static int ConfigureDrawingArea(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { return TRUE; } // Adapted from Cocoa port static const uint8_t bits5to8[] = { 0x00, 0x08, 0x10, 0x19, 0x21, 0x29, 0x31, 0x3A, 0x42, 0x4A, 0x52, 0x5A, 0x63, 0x6B, 0x73, 0x7B, 0x84, 0x8C, 0x94, 0x9C, 0xA5, 0xAD, 0xB5, 0xBD, 0xC5, 0xCE, 0xD6, 0xDE, 0xE6, 0xEF, 0xF7, 0xFF }; static inline uint32_t RGB555ToRGBA8888(const uint16_t color16) { return (bits5to8[((color16 >> 0) & 0x001F)] << 0) | (bits5to8[((color16 >> 5) & 0x001F)] << 8) | (bits5to8[((color16 >> 10) & 0x001F)] << 16) | 0xFF000000; } static inline uint32_t RGB555ToBGRA8888(const uint16_t color16) { return (bits5to8[((color16 >> 10) & 0x001F)] << 0) | (bits5to8[((color16 >> 5) & 0x001F)] << 8) | (bits5to8[((color16 >> 0) & 0x001F)] << 16) | 0xFF000000; } // Adapted from Cocoa port static inline void RGB555ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount) { const uint32_t *__restrict__ destBufferEnd = destBuffer + pixelCount; while (destBuffer < destBufferEnd) { *destBuffer++ = RGB555ToRGBA8888(*srcBuffer++); } } static inline void RGB555ToBGRA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, size_t pixelCount) { const uint32_t *__restrict__ destBufferEnd = destBuffer + pixelCount; while (destBuffer < destBufferEnd) { *destBuffer++ = RGB555ToBGRA8888(*srcBuffer++); } } static inline void gpu_screen_to_rgb(u32* dst) { RGB555ToRGBA8888Buffer((u16*)GPU_screen, dst, 256 * 384); } static inline void drawScreen(cairo_t* cr, u32* buf, gint w, gint h) { cairo_surface_t* surf = cairo_image_surface_create_for_data((u8*)buf, CAIRO_FORMAT_RGB24, w, h, w * 4); cairo_set_source_surface(cr, surf, 0, 0); cairo_pattern_set_filter(cairo_get_source(cr), Interpolation); cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_PAD); cairo_rectangle(cr, 0, 0, w, h); cairo_fill(cr); cairo_surface_destroy(surf); } static inline void drawTopScreen(cairo_t* cr, u32* buf, gint w, gint h, gint gap, gint rotation_angle, bool swap, orientation_enum orientation) { if (orientation == ORIENT_SINGLE && swap) { return; } cairo_save(cr); switch (orientation) { case ORIENT_VERTICAL: if (swap) { cairo_translate(cr, 0, h + gap); } break; case ORIENT_HORIZONTAL: if (swap) { cairo_translate(cr, w, 0); } break; } // Used for HUD editor mode cairo_get_matrix(cr, &nds_screen.topscreen_matrix); drawScreen(cr, buf, w, h); cairo_restore(cr); } static inline void drawBottomScreen(cairo_t* cr, u32* buf, gint w, gint h, gint gap, gint rotation_angle, bool swap, orientation_enum orientation) { if (orientation == ORIENT_SINGLE && !swap) { return; } cairo_save(cr); switch (orientation) { case ORIENT_VERTICAL: if (!swap) { cairo_translate(cr, 0, h + gap); } break; case ORIENT_HORIZONTAL: if (!swap) { cairo_translate(cr, w, 0); } break; } // Store the matrix for converting touchscreen coordinates cairo_get_matrix(cr, &nds_screen.touch_matrix); drawScreen(cr, buf, w, h); cairo_restore(cr); } /* Drawing callback */ static gboolean ExposeDrawingArea (GtkWidget *widget, GdkEventExpose *event, gpointer data) { GdkWindow* window = gtk_widget_get_window(widget); gint daW, daH; #if GTK_CHECK_VERSION(2,24,0) daW = gdk_window_get_width(window); daH = gdk_window_get_height(window); #else gdk_drawable_get_size(window, &daW, &daH); #endif u32* fbuf = video->GetDstBufferPtr(); gint dstW = video->GetDstWidth(); gint dstH = video->GetDstHeight(); gint dstScale = dstW * 2 / 256; // Actual scale * 2 to handle 1.5x filters gint gap = nds_screen.orientation == ORIENT_VERTICAL ? nds_screen.gap_size * dstScale / 2 : 0; gint imgW, imgH; if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { imgW = screen_size[nds_screen.orientation].width * dstScale / 2; imgH = screen_size[nds_screen.orientation].height * dstScale / 2 + gap; } else { imgH = screen_size[nds_screen.orientation].width * dstScale / 2; imgW = screen_size[nds_screen.orientation].height * dstScale / 2 + gap; } // Calculate scale to fit display area to window gfloat hratio = (gfloat)daW / (gfloat)imgW; gfloat vratio = (gfloat)daH / (gfloat)imgH; hratio = MIN(hratio, vratio); vratio = hratio; cairo_t* cr = gdk_cairo_create(window); // Scale to window size at center of area cairo_translate(cr, daW / 2, daH / 2); cairo_scale(cr, hratio, vratio); // Rotate area cairo_rotate(cr, M_PI / 180 * nds_screen.rotation_angle); // Translate area to top-left corner if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { cairo_translate(cr, -imgW / 2, -imgH / 2); } else { cairo_translate(cr, -imgH / 2, -imgW / 2); } // Draw both screens drawTopScreen(cr, fbuf, dstW, dstH / 2, gap, nds_screen.rotation_angle, nds_screen.swap, nds_screen.orientation); drawBottomScreen(cr, fbuf + dstW * dstH / 2, dstW, dstH / 2, gap, nds_screen.rotation_angle, nds_screen.swap, nds_screen.orientation); // Draw gap cairo_set_source_rgb(cr, 0.3, 0.3, 0.3); cairo_rectangle(cr, 0, dstH / 2, dstW, gap); cairo_fill(cr); // Complete the touch transformation matrix cairo_matrix_scale(&nds_screen.topscreen_matrix, (double)dstScale / 2, (double)dstScale / 2); cairo_matrix_invert(&nds_screen.topscreen_matrix); cairo_matrix_scale(&nds_screen.touch_matrix, (double)dstScale / 2, (double)dstScale / 2); cairo_matrix_invert(&nds_screen.touch_matrix); cairo_destroy(cr); draw_count++; return TRUE; } static void RedrawScreen() { RGB555ToBGRA8888Buffer((u16*)GPU_screen, video->GetSrcBufferPtr(), 256 * 384); #ifdef HAVE_LIBAGG aggDraw.hud->attach((u8*)video->GetSrcBufferPtr(), 256, 384, 1024); osd->update(); DrawHUD(); osd->clear(); #endif video->RunFilter(); gtk_widget_queue_draw(pDrawingArea); } /////////////////////////////// KEYS AND STYLUS UPDATE /////////////////////////////////////// #ifdef HAVE_LIBAGG static gboolean rotoscaled_hudedit(gint x, gint y, gboolean start) { double devX, devY; gint X, Y, topX = -1, topY = -1, botX = -1, botY = -1; static gint startScreen = 0; if (nds_screen.orientation != ORIENT_SINGLE || !nds_screen.swap) { devX = x; devY = y; cairo_matrix_transform_point(&nds_screen.topscreen_matrix, &devX, &devY); topX = devX; topY = devY; } if (nds_screen.orientation != ORIENT_SINGLE || nds_screen.swap) { devX = x; devY = y; cairo_matrix_transform_point(&nds_screen.touch_matrix, &devX, &devY); botX = devX; botY = devY; } if (topX >= 0 && topY >= 0 && topX < 256 && topY < 192) { X = topX; Y = topY + (nds_screen.swap ? 192 : 0); startScreen = 0; } else if (botX >= 0 && botY >= 0 && botX < 256 && botY < 192) { X = botX; Y = botY + (nds_screen.swap ? 0 : 192); startScreen = 1; } else if (!start) { if (startScreen == 0) { X = CLAMP(topX, 0, 255); Y = CLAMP(topY, 0, 191) + (nds_screen.swap ? 192 : 0); } else { X = CLAMP(botX, 0, 255); Y = CLAMP(botY, 0, 191) + (nds_screen.swap ? 0 : 192); } } else { LOG("TopX=%d, TopY=%d, BotX=%d, BotY=%d\n", topX, topY, botX, botY); return FALSE; } LOG("TopX=%d, TopY=%d, BotX=%d, BotY=%d, X=%d, Y=%d\n", topX, topY, botX, botY, X, Y); EditHud(X, Y, &Hud); RedrawScreen(); return TRUE; } #endif static gboolean rotoscaled_touchpos(gint x, gint y, gboolean start) { double devX, devY; u16 EmuX, EmuY; gint X, Y; if (nds_screen.orientation == ORIENT_SINGLE && !nds_screen.swap) { return FALSE; } devX = x; devY = y; cairo_matrix_transform_point(&nds_screen.touch_matrix, &devX, &devY); X = devX; Y = devY; LOG("X=%d, Y=%d\n", X, Y); if (!start || (X >= 0 && Y >= 0 && X < 256 && Y < 192)) { EmuX = CLAMP(X, 0, 255); EmuY = CLAMP(Y, 0, 191); NDS_setTouchPos(EmuX, EmuY); return TRUE; } return FALSE; } static gboolean Stylus_Move(GtkWidget *w, GdkEventMotion *e, gpointer data) { GdkModifierType state; gint x,y; if(click) { if(e->is_hint) gdk_window_get_pointer(w->window, &x, &y, &state); else { x= (gint)e->x; y= (gint)e->y; state=(GdkModifierType)e->state; } if(state & GDK_BUTTON1_MASK) { #ifdef HAVE_LIBAGG if (HudEditorMode) { rotoscaled_hudedit(x, y, FALSE); } else { #else { #endif rotoscaled_touchpos(x, y, FALSE); } } } return TRUE; } static gboolean Stylus_Press(GtkWidget * w, GdkEventButton * e, gpointer data) { GdkModifierType state; gint x, y; if (e->button == 3) { GtkWidget * pMenu = gtk_menu_item_get_submenu ( GTK_MENU_ITEM( gtk_ui_manager_get_widget (ui_manager, "/MainMenu/ViewMenu"))); gtk_menu_popup(GTK_MENU(pMenu), NULL, NULL, NULL, NULL, 3, e->time); } if (e->button == 1) { gdk_window_get_pointer(w->window, &x, &y, &state); if(state & GDK_BUTTON1_MASK) { #ifdef HAVE_LIBAGG if (HudEditorMode) { click = rotoscaled_hudedit(x, y, TRUE); } else #endif if (desmume_running()) { click = rotoscaled_touchpos(x, y, TRUE); } } } return TRUE; } static gboolean Stylus_Release(GtkWidget *w, GdkEventButton *e, gpointer data) { #ifdef HAVE_LIBAGG HudClickRelease(&Hud); #endif if(click) NDS_releaseTouch(); click = FALSE; return TRUE; } static void loadgame(int num){ if (desmume_running()) { Pause(); loadstate_slot(num); Launch(); } else loadstate_slot(num); RedrawScreen(); } static void savegame(int num){ if (desmume_running()) { Pause(); savestate_slot(num); Launch(); } else savestate_slot(num); LoadSaveStateInfo(); RedrawScreen(); } static void MenuLoad(GtkMenuItem *item, gpointer slot) { loadgame(GPOINTER_TO_INT(slot)); } static void MenuSave(GtkMenuItem *item, gpointer slot) { savegame(GPOINTER_TO_INT(slot)); } static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data) { if (e->keyval == GDK_Shift_L){ gdk_shift_pressed |= 1; return 1; } if (e->keyval == GDK_Shift_R){ gdk_shift_pressed |= 2; return 1; } if( e->keyval >= GDK_F1 && e->keyval <= GDK_F10 ){ if(!gdk_shift_pressed) loadgame((e->keyval - GDK_F1 + 1) % 10); else savegame((e->keyval - GDK_F1 + 1) % 10); return 1; } guint mask; mask = gtk_accelerator_get_default_mod_mask (); if( (e->state & mask) == 0){ u16 Key = lookup_key(e->keyval); if(Key){ ADD_KEY( keys_latch, Key ); return 1; } } #ifdef PROFILE_MEMORY_ACCESS if ( e->keyval == GDK_Tab) { print_memory_profiling(); return 1; } #endif return 0; } static gint Key_Release(GtkWidget *w, GdkEventKey *e, gpointer data) { if (e->keyval == GDK_Shift_L){ gdk_shift_pressed &= ~1; return 1; } if (e->keyval == GDK_Shift_R){ gdk_shift_pressed &= ~2; return 1; } u16 Key = lookup_key(e->keyval); RM_KEY( keys_latch, Key ); return 1; } /////////////////////////////// CONTROLS EDIT ////////////////////////////////////// static void AcceptNewInputKey(GtkWidget *w, GdkEventKey *e, struct modify_key_ctx *ctx) { gchar *YouPressed; ctx->mk_key_chosen = e->keyval; YouPressed = g_strdup_printf("You pressed : %s\nClick OK to keep this key.", gdk_keyval_name(e->keyval)); gtk_label_set_text(GTK_LABEL(ctx->label), YouPressed); g_free(YouPressed); } static void Modify_Key(GtkWidget* widget, gpointer data) { struct modify_key_ctx ctx; GtkWidget *mkDialog; gchar *Key_Label; gchar *Title; gint Key; Key = GPOINTER_TO_INT(data); ctx.mk_key_chosen = 0; Title = g_strdup_printf("Press \"%s\" key ...\n", key_names[Key]); mkDialog = gtk_dialog_new_with_buttons(Title, GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); ctx.label = gtk_label_new(Title); g_free(Title); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mkDialog)->vbox), ctx.label, TRUE, FALSE, 0); g_signal_connect(G_OBJECT(mkDialog), "key_press_event", G_CALLBACK(AcceptNewInputKey), &ctx); gtk_widget_show_all(GTK_DIALOG(mkDialog)->vbox); switch(gtk_dialog_run(GTK_DIALOG(mkDialog))) { case GTK_RESPONSE_OK: Keypad_Temp[Key] = ctx.mk_key_chosen; Key_Label = g_strdup_printf("%s (%s)", key_names[Key], gdk_keyval_name(Keypad_Temp[Key])); gtk_button_set_label(GTK_BUTTON(widget), Key_Label); g_free(Key_Label); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: ctx.mk_key_chosen = 0; break; } gtk_widget_destroy(mkDialog); } static void Edit_Controls() { GtkWidget *ecDialog; GtkWidget *ecKey; gchar *Key_Label; int i; memcpy(&Keypad_Temp, &keyboard_cfg, sizeof(keyboard_cfg)); ecDialog = gtk_dialog_new_with_buttons("Edit controls", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); for(i = 0; i < NB_KEYS; i++) { Key_Label = g_strdup_printf("%s (%s)", key_names[i], gdk_keyval_name(Keypad_Temp[i])); ecKey = gtk_button_new_with_label(Key_Label); g_free(Key_Label); g_signal_connect(G_OBJECT(ecKey), "clicked", G_CALLBACK(Modify_Key), GINT_TO_POINTER(i)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ecDialog)->vbox), ecKey,TRUE, FALSE, 0); } gtk_widget_show_all(GTK_DIALOG(ecDialog)->vbox); switch (gtk_dialog_run(GTK_DIALOG(ecDialog))) { case GTK_RESPONSE_OK: memcpy(&keyboard_cfg, &Keypad_Temp, sizeof(keyboard_cfg)); desmume_config_update_keys(keyfile); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: break; } gtk_widget_destroy(ecDialog); } static void AcceptNewJoyKey(GtkWidget *w, GdkEventFocus *e, struct modify_key_ctx *ctx) { gchar *YouPressed; ctx->mk_key_chosen = get_joy_key(ctx->key_id); YouPressed = g_strdup_printf("You pressed : %d\nClick OK to keep this key.", ctx->mk_key_chosen); gtk_label_set_text(GTK_LABEL(ctx->label), YouPressed); g_free(YouPressed); } static void Modify_JoyKey(GtkWidget* widget, gpointer data) { struct modify_key_ctx ctx; GtkWidget *mkDialog; gchar *Key_Label; gchar *Title; gint Key; Key = GPOINTER_TO_INT(data); /* Joypad keys start at 1 */ ctx.key_id = Key+1; ctx.mk_key_chosen = 0; Title = g_strdup_printf("Press \"%s\" key ...\n", key_names[Key]); mkDialog = gtk_dialog_new_with_buttons(Title, GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); ctx.label = gtk_label_new(Title); g_free(Title); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mkDialog)->vbox), ctx.label, TRUE, FALSE, 0); gtk_widget_show_all(GTK_DIALOG(mkDialog)->vbox); g_signal_connect(G_OBJECT(mkDialog), "focus_in_event", G_CALLBACK(AcceptNewJoyKey), &ctx); switch(gtk_dialog_run(GTK_DIALOG(mkDialog))) { case GTK_RESPONSE_OK: Keypad_Temp[Key] = ctx.mk_key_chosen; Key_Label = g_strdup_printf("%s (%d)", key_names[Key], Keypad_Temp[Key]); gtk_button_set_label(GTK_BUTTON(widget), Key_Label); g_free(Key_Label); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: ctx.mk_key_chosen = 0; break; } gtk_widget_destroy(mkDialog); } static void Edit_Joystick_Controls() { GtkWidget *ecDialog; GtkWidget *ecKey; gchar *Key_Label; int i; memcpy(&Keypad_Temp, &joypad_cfg, sizeof(joypad_cfg)); ecDialog = gtk_dialog_new_with_buttons("Edit controls", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); for(i = 0; i < NB_KEYS; i++) { Key_Label = g_strdup_printf("%s (%d)", key_names[i], Keypad_Temp[i]); ecKey = gtk_button_new_with_label(Key_Label); g_free(Key_Label); g_signal_connect(G_OBJECT(ecKey), "clicked", G_CALLBACK(Modify_JoyKey), GINT_TO_POINTER(i)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ecDialog)->vbox), ecKey,TRUE, FALSE, 0); } gtk_widget_show_all(GTK_DIALOG(ecDialog)->vbox); switch (gtk_dialog_run(GTK_DIALOG(ecDialog))) { case GTK_RESPONSE_OK: memcpy(&joypad_cfg, &Keypad_Temp, sizeof(keyboard_cfg)); desmume_config_update_joykeys(keyfile); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: break; } gtk_widget_destroy(ecDialog); } static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data) { guint Layer = GPOINTER_TO_UINT(data); gboolean active; // FIXME: make it work after resume if (!desmume_running()) return; active = gtk_toggle_action_get_active(action); switch (Layer) { case MAIN_BG_0: case MAIN_BG_1: case MAIN_BG_2: case MAIN_BG_3: case MAIN_OBJ: if(active == TRUE) { GPU_addBack(MainScreen.gpu, Layer); } else { GPU_remove(MainScreen.gpu, Layer); } break; case SUB_BG_0: case SUB_BG_1: case SUB_BG_2: case SUB_BG_3: case SUB_OBJ: if(active == TRUE) { GPU_addBack(SubScreen.gpu, Layer-SUB_BG_0); } else { GPU_remove(SubScreen.gpu, Layer-SUB_BG_0); } break; default: break; } } static void Printscreen() { GdkPixbuf *screenshot; gchar *filename, *filen; GError *error = NULL; u8 rgb[256 * 384 * 4]; static int seq = 0; gint H, W; //rgb = (u8 *) malloc(SCREENS_PIXEL_SIZE*SCREEN_BYTES_PER_PIXEL); //if (!rgb) // return; if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { W = screen_size[nds_screen.orientation].width; H = screen_size[nds_screen.orientation].height; } else { W = screen_size[nds_screen.orientation].height; H = screen_size[nds_screen.orientation].width; } gpu_screen_to_rgb((u32*)rgb); screenshot = gdk_pixbuf_new_from_data(rgb, GDK_COLORSPACE_RGB, TRUE, 8, W, H, W * 4, NULL, NULL); filen = g_strdup_printf("desmume-screenshot-%d.png", seq); filename = g_build_filename(g_get_user_special_dir(G_USER_DIRECTORY_PICTURES), filen, NULL); gdk_pixbuf_save(screenshot, filename, "png", &error, NULL); if (error) { g_error_free (error); g_printerr("Failed to save %s", filename); } else { seq++; } //free(rgb); g_object_unref(screenshot); g_free(filename); g_free(filen); } #ifdef DESMUME_GTK_FIRMWARE_BROKEN static void SelectFirmwareFile() { GtkFileFilter *pFilter_nds, *pFilter_bin, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; BOOL oldState = desmume_running(); Pause(); pParent = GTK_WIDGET(pWindow); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.nds"); gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds)"); pFilter_bin = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_bin, "*.bin"); gtk_file_filter_set_name(pFilter_bin, "Binary file (.bin)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); pFileSelection = gtk_file_chooser_dialog_new("Load firmware...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_nds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_bin); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); CommonSettings.UseExtFirmware = true; strncpy(CommonSettings.Firmware, (const char*)sPath, g_utf8_strlen(sPath, -1)); g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); if(oldState) Launch(); } #endif static void Modify_PriInterpolation(GtkAction *action, GtkRadioAction *current) { uint filter = gtk_radio_action_get_current_value(current) ; video->ChangeFilterByID((VideoFilterTypeID)filter); config.view_filter = filter; RedrawScreen(); } static void Modify_Interpolation(GtkAction *action, GtkRadioAction *current) { Interpolation = (cairo_filter_t)gtk_radio_action_get_current_value(current); config.view_cairoFilter = Interpolation; RedrawScreen(); } static void Modify_SPUMode(GtkAction *action, GtkRadioAction *current) { const uint mode = gtk_radio_action_get_current_value(current); switch (mode) { case SPUMODE_SYNCN: case SPUMODE_SYNCZ: #ifdef HAVE_LIBSOUNDTOUCH case SPUMODE_SYNCP: #endif SPUMode = mode; SPU_SetSynchMode(1, mode-1); break; case SPUMODE_DUALASYNC: default: SPUMode = SPUMODE_DUALASYNC; SPU_SetSynchMode(0, 0); break; } config.audio_sync = SPUMode; } static void Modify_SPUInterpolation(GtkAction *action, GtkRadioAction *current) { CommonSettings.spuInterpolationMode = (SPUInterpolationMode)gtk_radio_action_get_current_value(current); } static void Modify_Frameskip(GtkAction *action, GtkRadioAction *current) { autoFrameskipMax = gtk_radio_action_get_current_value(current) ; config.frameskip = autoFrameskipMax; if (!autoframeskip) { Frameskip = autoFrameskipMax; } } /////////////////////////////// TOOLS MANAGEMENT /////////////////////////////// extern const dTool_t *dTools_list[]; extern const int dTools_list_size; BOOL *dTools_running; static void Start_dTool(GtkWidget *widget, gpointer data) { int tool = GPOINTER_TO_INT(data); if(dTools_running == NULL || dTools_running[tool]) return; dTools_list[tool]->open(tool); dTools_running[tool] = TRUE; } void dTool_CloseCallback(int tool) { if (dTools_running == NULL) return; dTools_running[tool] = FALSE; } static inline void _updateDTools() { if (dTools_running == NULL) return; for(int i = 0; i < dTools_list_size; i++) { if(dTools_running[i]) { dTools_list[i]->update(); } } } /////////////////////////////// MAIN EMULATOR LOOP /////////////////////////////// class GtkDriver : public BaseDriver { public: virtual void EMU_DebugIdleUpdate() { usleep(1000); _updateDTools(); while (gtk_events_pending()) gtk_main_iteration(); } // HUD uses this to show pause state virtual bool EMU_IsEmulationPaused() { return !desmume_running(); } virtual bool AVI_IsRecording() { return avout_x264.isRecording() || avout_flac.isRecording(); } virtual void AVI_SoundUpdate(void* soundData, int soundLen) { avout_flac.updateAudio(soundData, soundLen); } }; static void DoQuit() { emu_halt(); gtk_main_quit(); } gboolean EmuLoop(gpointer data) { static Uint32 fps_SecStart, next_fps_SecStart, fps_FrameCount, skipped_frames; static int last_tick; static unsigned next_frame_time; static int frame_mod3; unsigned int i; gchar Title[50]; if (!desmume_running()) { // Set the next frame time to 0 so that it will recount next_frame_time = 0; frame_mod3 = 0; gtk_window_set_title(GTK_WINDOW(pWindow), "DeSmuME - Paused"); fps_SecStart = 0; regMainLoop = FALSE; RedrawScreen(); return FALSE; } fps_FrameCount += Frameskip + 1; next_fps_SecStart = SDL_GetTicks(); if (fps_SecStart == 0) { fps_SecStart = next_fps_SecStart; fps_FrameCount = 0; gtk_window_set_title(GTK_WINDOW(pWindow), "DeSmuME - Running"); } bool oneSecond = false; if ((next_fps_SecStart - fps_SecStart) >= 1000) { oneSecond = true; fps_SecStart = next_fps_SecStart; float emu_ratio = fps_FrameCount / 60.0; LOG("auto: %d fps: %u skipped: %u emu_ratio: %f Frameskip: %u\n", autoframeskip, fps_FrameCount, skipped_frames, emu_ratio, Frameskip); snprintf(Title, sizeof(Title), "DeSmuME - %dfps, %d skipped, draw: %dfps", fps_FrameCount, skipped_frames, draw_count); gtk_window_set_title(GTK_WINDOW(pWindow), Title); #ifdef HAVE_LIBAGG Hud.fps = fps_FrameCount; #endif fps_FrameCount = 0; skipped_frames = 0; draw_count = 0; } // HUD display things (copied from Windows main.cpp) #ifdef HAVE_LIBAGG gfx3d.frameCtrRaw++; if(gfx3d.frameCtrRaw == 60) { Hud.fps3d = gfx3d.frameCtr; gfx3d.frameCtrRaw = 0; gfx3d.frameCtr = 0; } if(nds.idleFrameCounter==0 || oneSecond) { //calculate a 16 frame arm9 load average for(int cpu=0;cpu<2;cpu++) { int load = 0; //printf("%d: ",cpu); for(int i=0;i<16;i++) { //blend together a few frames to keep low-framerate games from having a jittering load average //(they will tend to work 100% for a frame and then sleep for a while) //4 frames should handle even the slowest of games s32 sample = nds.runCycleCollector[cpu][(i+0+nds.idleFrameCounter)&15] + nds.runCycleCollector[cpu][(i+1+nds.idleFrameCounter)&15] + nds.runCycleCollector[cpu][(i+2+nds.idleFrameCounter)&15] + nds.runCycleCollector[cpu][(i+3+nds.idleFrameCounter)&15]; sample /= 4; load = load/8 + sample*7/8; } //printf("\n"); load = std::min(100,std::max(0,(int)(load*100/1120380))); Hud.cpuload[cpu] = load; } } Hud.cpuloopIterationCount = nds.cpuloopIterationCount; #endif /* Merge the joystick keys with the keyboard ones */ process_joystick_events(&keys_latch); /* Update! */ update_keypad(keys_latch); desmume_cycle(); /* Emule ! */ _updateDTools(); avout_x264.updateVideo((u16*)GPU_screen); RedrawScreen(); if (!config.fpslimiter || keys_latch & KEYMASK_(KEY_BOOST - 1)) { if (autoframeskip) { Frameskip = 0; } else { for (i = 0; i < Frameskip; i++) { NDS_SkipNextFrame(); #ifdef HAVE_LIBAGG gfx3d.frameCtrRaw++; if(gfx3d.frameCtrRaw == 60) { Hud.fps3d = gfx3d.frameCtr; gfx3d.frameCtrRaw = 0; gfx3d.frameCtr = 0; } #endif desmume_cycle(); skipped_frames++; } } next_frame_time = SDL_GetTicks() + 16; frame_mod3 = 0; } else { if (!autoframeskip) { for (i = 0; i < Frameskip; i++) { NDS_SkipNextFrame(); #ifdef HAVE_LIBAGG gfx3d.frameCtrRaw++; if(gfx3d.frameCtrRaw == 60) { Hud.fps3d = gfx3d.frameCtr; gfx3d.frameCtrRaw = 0; gfx3d.frameCtr = 0; } #endif desmume_cycle(); skipped_frames++; // Update next frame time frame_mod3 = (frame_mod3 + 1) % 3; next_frame_time += (frame_mod3 == 0) ? 16 : 17; } } unsigned this_tick = SDL_GetTicks(); if (this_tick < next_frame_time) { unsigned timeleft = next_frame_time - this_tick; usleep((timeleft - 1) * 1000); while (SDL_GetTicks() < next_frame_time); this_tick = SDL_GetTicks(); } if (autoframeskip) { // Determine the auto frameskip value, maximum 4 for (Frameskip = 0; this_tick > next_frame_time && Frameskip < autoFrameskipMax; Frameskip++, this_tick = SDL_GetTicks()) { // Aggressively skip frames to avoid delay NDS_SkipNextFrame(); #ifdef HAVE_LIBAGG gfx3d.frameCtrRaw++; if(gfx3d.frameCtrRaw == 60) { Hud.fps3d = gfx3d.frameCtr; gfx3d.frameCtrRaw = 0; gfx3d.frameCtr = 0; } #endif desmume_cycle(); skipped_frames++; // Update next frame time frame_mod3 = (frame_mod3 + 1) % 3; next_frame_time += (frame_mod3 == 0) ? 16 : 17; } if (Frameskip > autoFrameskipMax) { Frameskip = autoFrameskipMax; } //while (SDL_GetTicks() < next_frame_time); //this_tick = SDL_GetTicks(); } if (this_tick > next_frame_time && this_tick - next_frame_time >= 17) { // If we fall too much behind, don't try to catch up. next_frame_time = this_tick; } // We want to achieve a total 17 + 17 + 16 = 50 ms for every 3 frames. frame_mod3 = (frame_mod3 + 1) % 3; next_frame_time += (frame_mod3 == 0) ? 16 : 17; } return TRUE; } static void desmume_try_adding_ui(GtkUIManager *self, const char *ui_descr){ GError *error; error = NULL; if (!gtk_ui_manager_add_ui_from_string (self, ui_descr, -1, &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); exit (EXIT_FAILURE); } } static void dui_set_accel_group(gpointer action, gpointer group) { gtk_action_set_accel_group((GtkAction *)action, (GtkAccelGroup *)group); } // The following functions are adapted from the Windows port: // UpdateSaveStateMenu, ResetSaveStateTimes, LoadSaveStateInfo static void UpdateSaveStateMenu(int pos, char* txt) { char name[64]; snprintf(name, sizeof(name), "savestate%d", (pos == 0) ? 10 : pos); gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); snprintf(name, sizeof(name), "loadstate%d", (pos == 0) ? 10 : pos); gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); } static void ResetSaveStateTimes() { char ntxt[64]; for(int i = 0; i < NB_STATES;i++) { snprintf(ntxt, sizeof(ntxt), "_%d", i); UpdateSaveStateMenu(i, ntxt); } } static void LoadSaveStateInfo() { scan_savestates(); char ntxt[128]; for(int i = 0; i < NB_STATES; i++) { if(savestates[i].exists) { snprintf(ntxt, sizeof(ntxt), "_%d %s", i, savestates[i].date); UpdateSaveStateMenu(i, ntxt); } } } static void desmume_gtk_menu_file_saveload_slot (GtkActionGroup *ag) { for(guint i = 1; i <= 10; i++){ GtkAction *act; char label[64], name[64], accel[64]; snprintf(label, sizeof(label), "_%d", i % 10); // Note: GTK+ doesn't handle Shift correctly, so the actual action is // done in Key_Press. The accelerators here are simply visual cues. snprintf(name, sizeof(name), "savestate%d", i); snprintf(accel, sizeof(accel), "F%d", i); act = gtk_action_new(name, label, NULL, NULL); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuSave), GUINT_TO_POINTER(i % 10)); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), accel); snprintf(name, sizeof(name), "loadstate%d", i); snprintf(accel, sizeof(accel), "F%d", i); act = gtk_action_new(name, label, NULL, NULL); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuLoad), GUINT_TO_POINTER(i % 10)); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), accel); } } static void changesavetype(GtkAction *action, GtkRadioAction *current) { backup_setManualBackupType( gtk_radio_action_get_current_value(current)); } static void desmume_gtk_menu_tool_layers (GtkActionGroup *ag) { const char *Layers_Menu[10][2] = { {"layermainbg0","_0 Main BG 0"}, {"layermainbg1","_1 Main BG 1"}, {"layermainbg2","_2 Main BG 2"}, {"layermainbg3","_3 Main BG 3"}, {"layermainobj","_4 Main OBJ"}, {"layersubbg0", "_5 SUB BG 0"}, {"layersubbg1", "_6 SUB BG 1"}, {"layersubbg2", "_7 SUB BG 2"}, {"layersubbg3", "_8 SUB BG 3"}, {"layersubobj", "_9 SUB OBJ"} }; guint i; GtkToggleAction *act; for(i = 0; i< 10; i++){ act = gtk_toggle_action_new(Layers_Menu[i][0],Layers_Menu[i][1],NULL,NULL); gtk_toggle_action_set_active(act, TRUE); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(ToggleLayerVisibility), GUINT_TO_POINTER(i)); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); } } #ifdef HAVE_LIBAGG enum hud_display_enum { HUD_DISPLAY_FPS, HUD_DISPLAY_INPUT, HUD_DISPLAY_GINPUT, HUD_DISPLAY_FCOUNTER, HUD_DISPLAY_LCOUNTER, HUD_DISPLAY_RTC, HUD_DISPLAY_MIC, HUD_DISPLAY_EDITOR, }; static void ToggleHudDisplay(GtkToggleAction* action, gpointer data) { guint hudId = GPOINTER_TO_UINT(data); gboolean active; active = gtk_toggle_action_get_active(action); switch (hudId) { case HUD_DISPLAY_FPS: CommonSettings.hud.FpsDisplay = active; config.hud_fps = active; break; case HUD_DISPLAY_INPUT: CommonSettings.hud.ShowInputDisplay = active; config.hud_input = active; break; case HUD_DISPLAY_GINPUT: CommonSettings.hud.ShowGraphicalInputDisplay = active; config.hud_graphicalInput = active; break; case HUD_DISPLAY_FCOUNTER: CommonSettings.hud.FrameCounterDisplay = active; config.hud_frameCounter = active; break; case HUD_DISPLAY_LCOUNTER: CommonSettings.hud.ShowLagFrameCounter = active; config.hud_lagCounter = active; break; case HUD_DISPLAY_RTC: CommonSettings.hud.ShowRTC = active; config.hud_rtc = active; break; case HUD_DISPLAY_MIC: CommonSettings.hud.ShowMicrophone = active; config.hud_mic = active; break; case HUD_DISPLAY_EDITOR: HudEditorMode = active; break; default: g_printerr("Unknown HUD toggle %u!", hudId); break; } RedrawScreen(); } static void desmume_gtk_menu_view_hud (GtkActionGroup *ag) { const struct { const gchar* name; const gchar* label; guint id; bool active; bool& setting; } hud_menu[] = { { "hud_fps","Display _fps", HUD_DISPLAY_FPS, config.hud_fps, CommonSettings.hud.FpsDisplay }, { "hud_input","Display _Input", HUD_DISPLAY_INPUT, config.hud_input, CommonSettings.hud.ShowInputDisplay }, { "hud_graphicalinput","Display _Graphical Input", HUD_DISPLAY_GINPUT, config.hud_graphicalInput, CommonSettings.hud.ShowGraphicalInputDisplay }, { "hud_framecounter","Display Frame _Counter", HUD_DISPLAY_FCOUNTER, config.hud_frameCounter, CommonSettings.hud.FrameCounterDisplay }, { "hud_lagcounter","Display _Lag Counter", HUD_DISPLAY_LCOUNTER, config.hud_lagCounter, CommonSettings.hud.ShowLagFrameCounter }, { "hud_rtc","Display _RTC", HUD_DISPLAY_RTC, config.hud_rtc, CommonSettings.hud.ShowRTC }, { "hud_mic","Display _Mic", HUD_DISPLAY_MIC, config.hud_mic, CommonSettings.hud.ShowMicrophone }, { "hud_editor","_Editor Mode", HUD_DISPLAY_EDITOR, false, HudEditorMode }, }; guint i; GtkToggleAction *act; for(i = 0; i < sizeof(hud_menu) / sizeof(hud_menu[0]); i++){ act = gtk_toggle_action_new(hud_menu[i].name, hud_menu[i].label, NULL, NULL); gtk_toggle_action_set_active(act, hud_menu[i].active ? TRUE : FALSE); hud_menu[i].setting = hud_menu[i].active; g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(ToggleHudDisplay), GUINT_TO_POINTER(hud_menu[i].id)); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); } } #endif static void ToggleAudio (GtkToggleAction *action) { config.audio_enabled = gtk_toggle_action_get_active(action); if (config.audio_enabled) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); osd->addLine("Audio enabled"); } else { SPU_ChangeSoundCore(0, 0); osd->addLine("Audio disabled"); } RedrawScreen(); } #ifdef FAKE_MIC static void ToggleMicNoise (GtkToggleAction *action) { BOOL doNoise = (BOOL)gtk_toggle_action_get_active(action); Mic_DoNoise(doNoise); if (doNoise) osd->addLine("Fake mic enabled"); else osd->addLine("Fake mic disabled"); RedrawScreen(); } #endif static void ToggleFpsLimiter (GtkToggleAction *action) { config.fpslimiter = (BOOL)gtk_toggle_action_get_active(action); if (config.fpslimiter) osd->addLine("Fps limiter enabled"); else osd->addLine("Fps limiter disabled"); RedrawScreen(); } static void ToggleAutoFrameskip (GtkToggleAction *action) { config.autoframeskip = (BOOL)gtk_toggle_action_get_active(action); if (config.autoframeskip) { autoframeskip = true; Frameskip = 0; osd->addLine("Auto frameskip enabled"); } else { autoframeskip = false; Frameskip = autoFrameskipMax; osd->addLine("Auto frameskip disabled"); } RedrawScreen(); } static void desmume_gtk_menu_tools (GtkActionGroup *ag) { gint i; for(i = 0; i < dTools_list_size; i++) { GtkAction *act; act = gtk_action_new(dTools_list[i]->shortname, dTools_list[i]->name, NULL, NULL); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(Start_dTool), GINT_TO_POINTER(i)); gtk_action_group_add_action(ag, GTK_ACTION(act)); } } static gboolean timeout_exit_cb(gpointer data) { DoQuit(); INFO("Quit after %d seconds timeout\n", GPOINTER_TO_INT(data)); return FALSE; } static int common_gtk_main( class configured_features *my_config) { config.load(); driver = new GtkDriver(); SDL_TimerID limiter_timer = NULL; GtkAccelGroup * accel_group; GtkWidget *pVBox; GtkWidget *pMenuBar; GtkWidget *pToolBar; /* the firmware settings */ struct NDS_fw_config_data fw_config; /* default the firmware settings, they may get changed later */ NDS_FillDefaultFirmwareConfigData( &fw_config); /* use any language set on the command line */ if ( my_config->firmware_language != -1) { fw_config.language = my_config->firmware_language; } //------------------addons---------- my_config->process_addonCommands(); int slot2_device_type = NDS_SLOT2_AUTO; if (my_config->is_cflash_configured) slot2_device_type = NDS_SLOT2_CFLASH; if(my_config->gbaslot_rom != "") { //set the GBA rom and sav paths GBACartridge_RomPath = my_config->gbaslot_rom.c_str(); if(toupper(strright(GBACartridge_RomPath,4)) == ".GBA") GBACartridge_SRAMPath = strright(GBACartridge_RomPath,4) + ".sav"; else //what to do? lets just do the same thing for now GBACartridge_SRAMPath = strright(GBACartridge_RomPath,4) + ".sav"; // Check if the file exists and can be opened FILE * test = fopen(GBACartridge_RomPath.c_str(), "rb"); if (test) { slot2_device_type = NDS_SLOT2_GBACART; fclose(test); } } switch (slot2_device_type) { case NDS_SLOT2_NONE: break; case NDS_SLOT2_AUTO: break; case NDS_SLOT2_CFLASH: break; case NDS_SLOT2_RUMBLEPAK: break; case NDS_SLOT2_GBACART: break; case NDS_SLOT2_GUITARGRIP: break; case NDS_SLOT2_EXPMEMORY: break; case NDS_SLOT2_EASYPIANO: break; case NDS_SLOT2_PADDLE: break; case NDS_SLOT2_PASSME: break; default: slot2_device_type = NDS_SLOT2_NONE; break; } slot2_Init(); slot2_Change((NDS_SLOT2_TYPE)slot2_device_type); /* FIXME: SDL_INIT_VIDEO is needed for joystick support to work!? * Perhaps it needs a "window" to catch events...? */ if(SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) == -1) { g_printerr("Error trying to initialize SDL: %s\n", SDL_GetError()); return 1; } desmume_init( my_config->disable_sound || !config.audio_enabled); /* Init the hud / osd stuff */ #ifdef HAVE_LIBAGG Desmume_InitOnce(); Hud.reset(); #endif /* * Activate the GDB stubs * This has to come after the NDS_Init (called in desmume_init) * where the cpus are set up. */ #ifdef GDB_STUB gdbstub_mutex_init(); gdbstub_handle_t arm9_gdb_stub = NULL; gdbstub_handle_t arm7_gdb_stub = NULL; if ( my_config->arm9_gdb_port > 0) { arm9_gdb_stub = createStub_gdb( my_config->arm9_gdb_port, &NDS_ARM9, &arm9_direct_memory_iface); if ( arm9_gdb_stub == NULL) { g_printerr("Failed to create ARM9 gdbstub on port %d\n", my_config->arm9_gdb_port); exit( -1); } else { activateStub_gdb( arm9_gdb_stub); } } if ( my_config->arm7_gdb_port > 0) { arm7_gdb_stub = createStub_gdb( my_config->arm7_gdb_port, &NDS_ARM7, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { g_printerr("Failed to create ARM7 gdbstub on port %d\n", my_config->arm7_gdb_port); exit( -1); } else { activateStub_gdb( arm7_gdb_stub); } } #endif /* Create the dummy firmware */ NDS_CreateDummyFirmware( &fw_config); /* Initialize joysticks */ if(!init_joy()) return 1; dTools_running = (BOOL*)malloc(sizeof(BOOL) * dTools_list_size); if (dTools_running != NULL) memset(dTools_running, FALSE, sizeof(BOOL) * dTools_list_size); keyfile = desmume_config_read_file(gtk_kb_cfg); memset(&nds_screen, 0, sizeof(nds_screen)); nds_screen.orientation = ORIENT_VERTICAL; g_printerr("Using %d threads for video filter.\n", CommonSettings.num_cores); video = new VideoFilter(256, 384, VideoFilterTypeID_None, CommonSettings.num_cores); /* Create the window */ pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(pWindow), "DeSmuME"); gtk_window_set_resizable(GTK_WINDOW (pWindow), TRUE); gtk_window_set_icon(GTK_WINDOW (pWindow), gdk_pixbuf_new_from_xpm_data(DeSmuME_xpm)); g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(DoQuit), NULL); g_signal_connect(G_OBJECT(pWindow), "key_press_event", G_CALLBACK(Key_Press), NULL); g_signal_connect(G_OBJECT(pWindow), "key_release_event", G_CALLBACK(Key_Release), NULL); /* Create the GtkVBox */ pVBox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(pWindow), pVBox); ui_manager = gtk_ui_manager_new (); accel_group = gtk_accel_group_new(); action_group = gtk_action_group_new("dui"); gtk_action_group_add_actions(action_group, action_entries, G_N_ELEMENTS(action_entries), NULL); gtk_action_group_add_toggle_actions(action_group, toggle_entries, G_N_ELEMENTS(toggle_entries), NULL); /* Update audio toggle status */ if (my_config->disable_sound || !config.audio_enabled) { GtkAction *action = gtk_action_group_get_action(action_group, "enableaudio"); if (action) gtk_toggle_action_set_active((GtkToggleAction *)action, FALSE); } desmume_gtk_menu_tool_layers(action_group); #ifdef HAVE_LIBAGG desmume_gtk_menu_view_hud(action_group); #else gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "hud_notsupported"), FALSE); #endif desmume_gtk_menu_file_saveload_slot(action_group); desmume_gtk_menu_tools(action_group); gtk_action_group_add_radio_actions(action_group, savet_entries, G_N_ELEMENTS(savet_entries), my_config->savetype, G_CALLBACK(changesavetype), NULL); if (config.view_cairoFilter < CAIRO_FILTER_FAST || config.view_cairoFilter > CAIRO_FILTER_BILINEAR) { config.view_cairoFilter = CAIRO_FILTER_NEAREST; } Interpolation = (cairo_filter_t)config.view_cairoFilter.get(); gtk_action_group_add_radio_actions(action_group, interpolation_entries, G_N_ELEMENTS(interpolation_entries), Interpolation, G_CALLBACK(Modify_Interpolation), NULL); if (config.view_filter < VideoFilterTypeID_None || config.view_filter >= VideoFilterTypeIDCount) { config.view_filter = VideoFilterTypeID_None; } video->ChangeFilterByID((VideoFilterTypeID)config.view_filter.get()); gtk_action_group_add_radio_actions(action_group, pri_interpolation_entries, G_N_ELEMENTS(pri_interpolation_entries), config.view_filter, G_CALLBACK(Modify_PriInterpolation), NULL); switch (config.audio_sync) { case SPUMODE_SYNCN: case SPUMODE_SYNCZ: #ifdef HAVE_LIBSOUNDTOUCH case SPUMODE_SYNCP: #endif SPUMode = config.audio_sync; SPU_SetSynchMode(1, config.audio_sync-1); break; case SPUMODE_DUALASYNC: default: config.audio_sync = SPUMODE_DUALASYNC; SPUMode = SPUMODE_DUALASYNC; SPU_SetSynchMode(0, 0); break; } gtk_action_group_add_radio_actions(action_group, spumode_entries, G_N_ELEMENTS(spumode_entries), config.audio_sync, G_CALLBACK(Modify_SPUMode), NULL); gtk_action_group_add_radio_actions(action_group, spuinterpolation_entries, G_N_ELEMENTS(spuinterpolation_entries), CommonSettings.spuInterpolationMode, G_CALLBACK(Modify_SPUInterpolation), NULL); gtk_action_group_add_radio_actions(action_group, frameskip_entries, G_N_ELEMENTS(frameskip_entries), config.frameskip, G_CALLBACK(Modify_Frameskip), NULL); autoFrameskipMax = config.frameskip; gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "frameskipA"), config.autoframeskip); if (config.autoframeskip) { autoframeskip = true; Frameskip = 0; } else { autoframeskip = false; Frameskip = autoFrameskipMax; } switch (config.view_rot) { case 0: case 90: case 180: case 270: break; default: config.view_rot = 0; break; } nds_screen.rotation_angle = config.view_rot; gtk_action_group_add_radio_actions(action_group, rotation_entries, G_N_ELEMENTS(rotation_entries), nds_screen.rotation_angle, G_CALLBACK(SetRotation), NULL); if (config.window_scale < WINSIZE_SCALE || config.window_scale > WINSIZE_5) { config.window_scale = WINSIZE_SCALE; } winsize_current = (winsize_enum)config.window_scale.get(); gtk_action_group_add_radio_actions(action_group, winsize_entries, G_N_ELEMENTS(winsize_entries), winsize_current, G_CALLBACK(SetWinsize), NULL); if (config.view_orient < ORIENT_VERTICAL || config.view_orient > ORIENT_SINGLE) { config.view_orient = ORIENT_VERTICAL; } nds_screen.orientation = (orientation_enum)config.view_orient.get(); gtk_action_group_add_radio_actions(action_group, orientation_entries, G_N_ELEMENTS(orientation_entries), nds_screen.orientation, G_CALLBACK(SetOrientation), NULL); { GList * list = gtk_action_group_list_actions(action_group); g_list_foreach(list, dui_set_accel_group, accel_group); } gtk_window_add_accel_group(GTK_WINDOW(pWindow), accel_group); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "reset"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatsearch"), FALSE); nds_screen.gap_size = config.view_gap ? GAP_SIZE : 0; gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "gap"), config.view_gap); nds_screen.swap = config.view_swap; gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "orient_swapscreens"), config.view_swap); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); accel_group = gtk_ui_manager_get_accel_group (ui_manager); gtk_window_add_accel_group (GTK_WINDOW (pWindow), accel_group); desmume_try_adding_ui(ui_manager, ui_description); pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); gtk_box_pack_start (GTK_BOX (pVBox), pMenuBar, FALSE, FALSE, 0); pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); gtk_box_pack_start (GTK_BOX(pVBox), pToolBar, FALSE, FALSE, 0); { GtkWidget * recentMenu = gtk_ui_manager_get_widget (ui_manager, "/MainMenu/FileMenu/RecentMenu"); GtkWidget * recentFiles = gtk_recent_chooser_menu_new(); GtkRecentFilter * recentFilter = gtk_recent_filter_new(); gtk_recent_filter_add_mime_type(recentFilter, "application/x-nintendo-ds-rom"); gtk_recent_chooser_set_filter(GTK_RECENT_CHOOSER(recentFiles), recentFilter); gtk_menu_item_set_submenu(GTK_MENU_ITEM(recentMenu), recentFiles); g_signal_connect(G_OBJECT(recentFiles), "item-activated", G_CALLBACK(OpenRecent), NULL); } /* Creating the place for showing DS screens */ pDrawingArea = gtk_drawing_area_new(); gtk_container_add (GTK_CONTAINER (pVBox), pDrawingArea); gtk_widget_set_events(pDrawingArea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_KEY_PRESS_MASK ); g_signal_connect(G_OBJECT(pDrawingArea), "button_press_event", G_CALLBACK(Stylus_Press), NULL); g_signal_connect(G_OBJECT(pDrawingArea), "button_release_event", G_CALLBACK(Stylus_Release), NULL); g_signal_connect(G_OBJECT(pDrawingArea), "motion_notify_event", G_CALLBACK(Stylus_Move), NULL); g_signal_connect(G_OBJECT(pDrawingArea), "expose_event", G_CALLBACK(ExposeDrawingArea), NULL ) ; g_signal_connect(G_OBJECT(pDrawingArea), "configure_event", G_CALLBACK(ConfigureDrawingArea), NULL ) ; /* Status bar */ pStatusBar = gtk_statusbar_new(); UpdateStatusBar(EMU_DESMUME_NAME_AND_VERSION()); gtk_box_pack_end(GTK_BOX(pVBox), pStatusBar, FALSE, FALSE, 0); gtk_widget_show_all(pWindow); if (winsize_current == WINSIZE_SCALE) { if (config.window_fullscreen) { gtk_widget_hide(pMenuBar); gtk_widget_hide(pToolBar); gtk_widget_hide(pStatusBar); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_menu"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_toolbar"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_statusbar"), FALSE); gtk_window_fullscreen(GTK_WINDOW(pWindow)); } } else { config.window_fullscreen = false; gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "fullscreen"), FALSE); } if (!config.view_menu) { gtk_widget_hide(pMenuBar); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_menu"), FALSE); } if (!config.view_toolbar) { gtk_widget_hide(pToolBar); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_toolbar"), FALSE); } if (!config.view_statusbar) { gtk_widget_hide(pStatusBar); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_statusbar"), FALSE); } UpdateDrawingAreaAspect(); if (my_config->disable_limiter || !config.fpslimiter) { config.fpslimiter = false; GtkAction *action = gtk_action_group_get_action(action_group, "enablefpslimiter"); if (action) gtk_toggle_action_set_active((GtkToggleAction *)action, FALSE); } OGLLoadEntryPoints_3_2_Func = OGLLoadEntryPoints_3_2; OGLCreateRenderer_3_2_Func = OGLCreateRenderer_3_2; //Set the 3D emulation to use unsigned core = my_config->engine_3d; // setup the gdk 3D emulation; #if defined(HAVE_LIBOSMESA) || defined(HAVE_GL_GLX) if(my_config->engine_3d == 2) { #if defined(HAVE_LIBOSMESA) core = init_osmesa_3Demu() #elif defined(HAVE_GL_GLX) core = init_glx_3Demu() #endif ? 2 : GPU3D_NULL; } #endif NDS_3D_ChangeCore(core); if(my_config->engine_3d != 0 && gpu3D == &gpu3DNull) { g_printerr("Failed to initialise openGL 3D emulation; " "removing 3D support\n"); } backup_setManualBackupType(my_config->savetype); // Command line arg if( my_config->nds_file != "") { if(Open( my_config->nds_file.c_str()) >= 0) { my_config->process_movieCommands(); if(my_config->load_slot != -1){ int todo = my_config->load_slot; if(todo == 10) todo = 0; loadstate_slot(my_config->load_slot); } Launch(); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Unable to load :\n%s", my_config->nds_file.c_str()); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } } if (my_config->timeout > 0) { g_timeout_add_seconds(my_config->timeout, timeout_exit_cb, GINT_TO_POINTER(my_config->timeout)); } /* Video filter parameters */ video->SetFilterParameteri(VF_PARAM_SCANLINE_A, _scanline_filter_a); video->SetFilterParameteri(VF_PARAM_SCANLINE_B, _scanline_filter_b); video->SetFilterParameteri(VF_PARAM_SCANLINE_C, _scanline_filter_c); video->SetFilterParameteri(VF_PARAM_SCANLINE_D, _scanline_filter_d); RedrawScreen(); /* Main loop */ gtk_main(); delete video; config.save(); avout_x264.end(); avout_flac.end(); desmume_free(); #if defined(HAVE_LIBOSMESA) deinit_osmesa_3Demu(); #elif defined(HAVE_GL_GLX) deinit_glx_3Demu(); #endif /* Unload joystick */ uninit_joy(); SDL_Quit(); desmume_config_dispose(keyfile); #ifdef GDB_STUB destroyStub_gdb( arm9_gdb_stub); arm9_gdb_stub = NULL; destroyStub_gdb( arm7_gdb_stub); arm7_gdb_stub = NULL; gdbstub_mutex_destroy(); #endif return EXIT_SUCCESS; } int main (int argc, char *argv[]) { configured_features my_config; // The global menu screws up the window size... unsetenv("UBUNTU_MENUPROXY"); init_configured_features( &my_config); if (!g_thread_supported()) g_thread_init( NULL); gtk_init(&argc, &argv); if ( !fill_configured_features( &my_config, argc, argv)) { exit(0); } return common_gtk_main( &my_config); } #ifdef WIN32 int WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { int argc = 0; char *argv[] = NULL; /* * FIXME: * Emulate the argc and argv main parameters. Could do this using * CommandLineToArgvW and then convert the wide chars to thin chars. * Or parse the wide chars directly and call common_gtk_main with a * filled configuration structure. */ main( argc, argv); } #endif desmume-0.9.11/src/gtk/cheatsGTK.h0000755000000000000000000000171312467662066015325 0ustar rootroot/* cheatsGtk.h - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __CHEATS_H__ #define __CHEATS_H__ void CheatSearch (); void CheatList (); #endif /*__CHEATS_H__*/ desmume-0.9.11/src/gtk/desmume.h0000755000000000000000000000224312467662066015146 0ustar rootroot/* desmume.h - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __DESMUME_H__ #define __DESMUME_H__ extern void desmume_init( int disable_sound); extern void desmume_free( void); extern void desmume_pause( void); extern void desmume_resume( void); extern void desmume_toggle( void); extern bool desmume_running( void); extern void desmume_cycle( void); #endif /*__DESMUME_H__*/ desmume-0.9.11/src/gtk/main.h0000755000000000000000000000014412467662066014431 0ustar rootroot#ifndef __DESMUME_GTK_MAIN_H__ #define __DESMUME_GTK_MAIN_H__ void Pause(); void Launch(); #endif desmume-0.9.11/src/gtk/tools/0000755000000000000000000000000012467663414014470 5ustar rootrootdesmume-0.9.11/src/gtk/tools/ioregsView.h0000755000000000000000000000167212467662066016777 0ustar rootroot/* ioregsview.h - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __IOREGSVIEW_H__ #define __IOREGSVIEW_H__ #include "../dTool.h" extern dTool_t dTool_ioregsView; #endif /*__IOREGSVIEW_H__*/ desmume-0.9.11/src/gtk/tools/ioregsView.cpp0000755000000000000000000003576012467662066017337 0ustar rootroot/* ioregsView.cpp - this file is part of DeSmuME * * Copyright (C) 2006 Thoduv * Copyright (C) 2006-2015 DeSmuME Team * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "../dTool.h" #include "../../MMU.h" #include "../../registers.h" #undef GPOINTER_TO_INT #define GPOINTER_TO_INT(p) ((gint) (glong) (p)) #define SHORTNAME "ioregs" #define TOOL_NAME "IO regs view" #if !GTK_CHECK_VERSION(2,24,0) #define gtk_combo_box_text_new gtk_combo_box_new_text #define gtk_combo_box_text_append_text gtk_combo_box_append_text #define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX #endif BOOL CPUS [2] = {TRUE, TRUE}; static GtkWidget *mWin[2]; static GtkWidget *mVbox0[2]; static GtkWidget *mIoRegCombo[2]; static GtkWidget *mRegInfos[2]; typedef void (*reg_dispFn)(int c); typedef u32 (*reg_valFn)(int c); typedef struct { char name[64]; u32 adress; int size; reg_dispFn create; reg_dispFn update; reg_dispFn destroy; reg_valFn value; } reg_t; static reg_t *current_reg[2] = {NULL, NULL}; #define REGFN_BEGIN(reg) \ GtkWidget **_wl_ = Widgets_##reg [c]; #define BIT_CHECK(w, n, s) { \ char _bit_check_buf[64]; \ snprintf(_bit_check_buf, ARRAY_SIZE(_bit_check_buf), "Bit %d: %s", n,s); \ _wl_[w] = gtk_check_button_new_with_label(_bit_check_buf ); \ gtk_box_pack_start(GTK_BOX(mVbox0[c]), _wl_[w], FALSE, FALSE, 0); } #define BIT_COMBO(w,n,s) { \ _wl_[w] = gtk_hbox_new(FALSE, 0); \ gtk_box_pack_start(GTK_BOX(mVbox0[c]), _wl_[w], FALSE, FALSE, 0); } \ char _bit_combo_buf[64]; \ snprintf(_bit_combo_buf, ARRAY_SIZE(_bit_combo_buf), "Bits %s: %s", n,s); \ GtkWidget *__combo_lbl_tmp = gtk_label_new(_bit_combo_buf); \ GtkWidget *__combo_tmp = gtk_combo_box_text_new(); \ #define BIT_COMBO_ADD(w, s) { \ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(__combo_tmp), s); } #define BIT_COMBO_GET(w) (GTK_WIDGET(g_list_first(gtk_container_get_children(GTK_CONTAINER(_wl_[w])))->data)) #define BIT_COMBO_END(w) \ gtk_box_pack_start(GTK_BOX(_wl_[w]), __combo_tmp, FALSE, FALSE, 0); \ gtk_box_pack_start(GTK_BOX(_wl_[w]), __combo_lbl_tmp, FALSE, FALSE, 0); #define CREA_END() \ gtk_widget_show_all(mWin[c]); /////////////////////////////// REG_IME /////////////////////////////// static GtkWidget *Widgets_REG_IME[2][1]; static void crea_REG_IME(int c) { REGFN_BEGIN(REG_IME); BIT_CHECK(0, 0, "Master interrupt enable"); CREA_END(); } static void updt_REG_IME(int c) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_IME[c][0]), MMU.reg_IME[c] ? 1 : 0); } static void dest_REG_IME(int c) { gtk_widget_destroy(Widgets_REG_IME[c][0]); } static u32 val_REG_IME(int c) { return MMU.reg_IME[c]; } /////////////////////////////// REG_IE /////////////////////////////// static const char *interrupt_strings[25] = { "LCD VBlank", // 0 "LCD HBlank", // 1 "LCD VCount", // 2 "Timer0 overflow", // 3 "Timer1 overflow", "Timer2 overflow", "Timer3 overflow", "Serial communication (RTC)", // 7 "DMA0", // 8 "DMA1", "DMA2", "DMA3", "Keypad", // 12 "Game Pak (GBA slot)", // 13 "", // 14 "", // 15 "IPC Sync", // 16 "IPC Send FIFO empty", // 17 "IPC Recv FIFO not empty", // 18 "Card Data Transfer Completion (DS-card slot)", // 19 "Card IREQ_MC (DS-card slot)", // 20 "Geometry (3D) command FIFO", // 21 "Screens unfolding", // 22 "SPI bus", // 23 "Wifi" // 24 }; #define INTERRUPT_SKIP(c) if(i == 14 || i == 15 || (c == 0 && (i == 7 || i == 22 || i == 23 || i == 24)) || (c == 1 && i == 21))continue; static GtkWidget *Widgets_REG_IE[2][32]; static void crea_REG_IE(int c) { REGFN_BEGIN(REG_IE); int i; for(i = 0; i < 24; i++) { INTERRUPT_SKIP(c); BIT_CHECK(i, i, interrupt_strings[i]); } CREA_END(); } static void updt_REG_IE(int c) { int i; for(i = 0; i < 24; i++) { INTERRUPT_SKIP(c); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_IE[c][i]), (MMU.reg_IE[c] & (1<():MMU.gen_IF<1>()) & (1<():MMU.gen_IF<1>()); } /////////////////////////////// REG_IPCFIFOCNT /////////////////////////////// static const char *fifocnt_strings[] = { "Send FIFO empty", "Send FIFO full", "Send FIFO empty IRQ", "Send FIFO clear (flush)", "","","","", "Receive FIFO empty", "Receive FIFO full", "Receive FIFO not empty IRQ", "","","", "Error (read when empty/write when full)", "Enable FIFOs" }; #define FIFOCNT_SKIP(c) if(i==4||i==5||i==6||i==11||i==12||i==13)continue; static GtkWidget *Widgets_REG_IPCFIFOCNT[2][16]; static void crea_REG_IPCFIFOCNT(int c) { REGFN_BEGIN(REG_IPCFIFOCNT); int i; for(i = 0; i < 16; i++) { FIFOCNT_SKIP(c); BIT_CHECK(i, i, fifocnt_strings[i]); } CREA_END(); } static void updt_REG_IPCFIFOCNT(int c) { int i; for(i = 0; i < 16; i++) { FIFOCNT_SKIP(c); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_IPCFIFOCNT[c][i]), (((u16 *)(MMU.MMU_MEM[c][0x40]))[0x184>>1]&(1<>1]; } /////////////////////////////// POWER_CR /////////////////////////////// static const char *powercr9_strings[] = { "Enable LCD", "2D A engine", "3D render engine", "3D geometry engine (matrix)", "", "", "", "", "", "2D B engine", "", "", "", "", "", "Swap LCD" }; static const char *powercr7_strings[] = { "Sound speakers", "Wifi system" }; #define POWER_CR_SKIP(c) if(i==4||i==5||i==6||i==7||i==8||i==10||i==11||i==12||i==13||i==14)continue; #define POWER_CR_SIZE(c) ((c==0)?16:2) static GtkWidget *Widgets_POWER_CR[2][16]; static void crea_POWER_CR(int c) { REGFN_BEGIN(POWER_CR); int i; for(i = 0; i < POWER_CR_SIZE(c); i++) { POWER_CR_SKIP(c); BIT_CHECK(i, i, (c==0?powercr9_strings:powercr7_strings)[i]); } CREA_END(); } static void updt_POWER_CR(int c) { int i; for(i = 0; i < POWER_CR_SIZE(c); i++) { POWER_CR_SKIP(c); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_POWER_CR[c][i]), (((u16 *)(MMU.MMU_MEM[c][0x40]))[0x304>>1]&(1<>1]; } /////////////////////////////// REG_SPICNT /////////////////////////////// static const char *spicnt_strings[16] = { "Baudrate", "","","","","","", "Busy flag", "Device", "", "Transfer size", "Chipselect Hold", "Unknown", "Unknown", "Interrupt request", "Enable SPI bus", }; // 0-1 Baudrate (0=4MHz/Firmware, 1=2MHz/Touchscr, 2=1MHz/Powerman., 3=512KHz) // 2-6 Not used (Zero) // 7 Busy Flag (0=Ready, 1=Busy) (presumably Read-only) // 8-9 Device Select (0=Powerman., 1=Firmware, 2=Touchscr, 3=Reserved) // 10 Transfer Size (0=8bit, 1=16bit) // 11 Chipselect Hold (0=Deselect after transfer, 1=Keep selected) // 12 Unknown (usually 0) (set equal to Bit11 when BIOS accesses firmware) // 13 Unknown (usually 0) (set to 1 when BIOS accesses firmware) // 14 Interrupt Request (0=Disable, 1=Enable) // 15 SPI Bus Enable (0=Disable, 1=Enable) #define REG_SPICNT_SKIP(c) if(i==1||i==2||i==3||i==4||i==5||i==6||i==9)continue; #define REG_SPICNT_ISCHECK(c) (i==7||i==11||i==14||i==15||i==12||i==13) static GtkWidget *Widgets_REG_SPICNT[2][16]; static void crea_REG_SPICNT(int c) { REGFN_BEGIN(REG_SPICNT); int i; for(i = 0; i < 16; i++) { REG_SPICNT_SKIP(c); if(REG_SPICNT_ISCHECK(c)) { BIT_CHECK(i, i, spicnt_strings[i]); } else if(i == 0) { BIT_COMBO(i, "0-1", spicnt_strings[0]); BIT_COMBO_ADD(i, "0= 4Mhz"); BIT_COMBO_ADD(i, "1= 2Mhz"); BIT_COMBO_ADD(i, "2= 1Mhz"); BIT_COMBO_ADD(i, "3= 512Khz"); BIT_COMBO_END(i); } else if(i == 8) { BIT_COMBO(i, "8-9", spicnt_strings[8]); BIT_COMBO_ADD(i, "0= Power management device"); BIT_COMBO_ADD(i, "1= Firmware"); BIT_COMBO_ADD(i, "2= Touchscreen/Microphone"); BIT_COMBO_ADD(i, "3= Reserved/Prohibited"); BIT_COMBO_END(i); } else if(i == 10) { BIT_COMBO(i, "10", spicnt_strings[10]); BIT_COMBO_ADD(i, "0= 8 bits"); BIT_COMBO_ADD(i, "1= 16 bits"); BIT_COMBO_END(i); } } CREA_END(); } static u32 val_REG_SPICNT(int c) { return ((u16 *)(MMU.MMU_MEM[c][0x40]))[0x1C0>>1]; } static void updt_REG_SPICNT(int c) { REGFN_BEGIN(REG_SPICNT); u16 val = val_REG_SPICNT(c); int i; for(i = 0; i < 16; i++) { REG_SPICNT_SKIP(c); if(REG_SPICNT_ISCHECK(c)) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_SPICNT[c][i]), (((u16 *)(MMU.MMU_MEM[c][0x40]))[0x1C0>>1]&(1<>8)&3); } else if(i == 10) { gtk_combo_box_set_active(GTK_COMBO_BOX(BIT_COMBO_GET(i)) , (val>>10)&1); } } } static void dest_REG_SPICNT(int c) { int i; for(i = 0; i < 16; i++) { REG_SPICNT_SKIP(c); gtk_widget_destroy(Widgets_REG_SPICNT[c][i]); } } /////////////////////////////// LIST /////////////////////////////// #define BITS_8 1 #define BITS_16 2 #define BITS_32 4 static const char *bits_strings[5] = {"0", "8", "16", "24", "32"}; #define REG_STR(r, s) {#r, r, s, &crea_##r, &updt_##r, &dest_##r, &val_##r} #define REG_FNS(r) &crea_##r, &updt_##r, &dest_##r, &val_##r //////// ARM9 //////// #define REG_LIST_SIZE_ARM9 5 static const reg_t regs_list_9[] = { {"REG_IME", REG_IME, BITS_16, REG_FNS(REG_IME)}, {"REG_IE", REG_IE, BITS_32, REG_FNS(REG_IE)}, {"REG_IF", REG_IF, BITS_32, REG_FNS(REG_IF)}, {"REG_IPCFIFOCNT", 0x04000184, BITS_16, REG_FNS(REG_IPCFIFOCNT)}, {"POWER_CR", REG_POWCNT1, BITS_16, REG_FNS(POWER_CR)} }; //////// ARM7 //////// #define REG_LIST_SIZE_ARM7 6 static const reg_t regs_list_7[] = { {"REG_IME", REG_IME, BITS_16, REG_FNS(REG_IME)}, {"REG_IE", REG_IE, BITS_32, REG_FNS(REG_IE)}, {"REG_IF", REG_IF, BITS_32, REG_FNS(REG_IF)}, {"REG_IPCFIFOCNT", 0x04000184, BITS_16, REG_FNS(REG_IPCFIFOCNT)}, {"POWER_CR", REG_POWCNT1, BITS_16, REG_FNS(POWER_CR)}, {"REG_SPICNT", REG_SPICNT, BITS_16, REG_FNS(REG_SPICNT)} }; #define GET_REG_LIST_SIZE(i) ((i==0)?REG_LIST_SIZE_ARM9:REG_LIST_SIZE_ARM7) #define GET_REG_LIST(i) ((i==0)?regs_list_9:regs_list_7) static void _clearContainer(GtkWidget *widget, gpointer data) { if(widget == mRegInfos[0] || widget == mRegInfos[1]) return; if(widget == mIoRegCombo[0] || widget == mIoRegCombo[1]) return; gtk_container_remove(GTK_CONTAINER((GtkWidget*)data), widget); // gtk_widget_destroy(widget); // gtk_object_destroy(GTK_OBJECT(widget)); } static void selected_reg(GtkWidget* widget, gpointer data) { int c = GPOINTER_TO_INT(data); gchar *regInfosBuffer; guint active = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); if(current_reg[c]) current_reg[c]->destroy(c); gtk_container_foreach(GTK_CONTAINER(mVbox0[c]), _clearContainer, (gpointer)mVbox0[c]); current_reg[c] = (reg_t*)&(GET_REG_LIST(c)[active]); // gtk_box_pack_start(GTK_BOX(mVbox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); switch (current_reg[c]->size) { case BITS_8: regInfosBuffer = g_strdup_printf("0x%02X", current_reg[c]->value(c)); break; case BITS_16: regInfosBuffer = g_strdup_printf("0x%04X", current_reg[c]->value(c)); break; default: regInfosBuffer = g_strdup_printf("0x%08X", current_reg[c]->value(c)); } // gtk_box_pack_start(GTK_BOX(mVbox0[c]), mRegInfos[c], FALSE, FALSE, 0); gtk_label_set_label(GTK_LABEL(mRegInfos[c]), regInfosBuffer); g_free(regInfosBuffer); current_reg[c]->create(c); current_reg[c]->update(c); } /////////////////////////////// TOOL /////////////////////////////// static int DTOOL_ID; static void close() { memset(current_reg, 0, sizeof(current_reg)); dTool_CloseCallback(DTOOL_ID); } static void _closeOne(GtkWidget *widget, gpointer data) { int c = GPOINTER_TO_INT(data); CPUS[c] = FALSE; if(c == 0 && !CPUS[1]) close(); if(c == 1 && !CPUS[0]) close(); gtk_widget_destroy(mRegInfos[c]); gtk_widget_destroy(mIoRegCombo[c]); gtk_widget_destroy(mVbox0[c]); // gtk_widget_destroy(mWin[c]); } static void update() { int c; for(c = 0; c < 2; c++) { if(!CPUS[c]) continue; current_reg[c]->update(c); } } static void open(int ID) { int c, i; DTOOL_ID = ID; for(c = 0; c < 2; c++) { CPUS[c] = TRUE; mWin[c]= gtk_window_new(GTK_WINDOW_TOPLEVEL); if(c == 0) gtk_window_set_title(GTK_WINDOW(mWin[c]), TOOL_NAME " : ARM9"); else gtk_window_set_title(GTK_WINDOW(mWin[c]), TOOL_NAME " : ARM7"); g_signal_connect(G_OBJECT(mWin[c]), "destroy", G_CALLBACK(&_closeOne), GINT_TO_POINTER(c)); mVbox0[c] = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(mWin[c]), mVbox0[c]); mIoRegCombo[c] = gtk_combo_box_text_new(); mRegInfos[c] = gtk_label_new(""); for(i = 0; i < GET_REG_LIST_SIZE(c); i++) { gchar *reg_name_buffer; reg_name_buffer = g_strdup_printf("0x%08X : %s (%s)", GET_REG_LIST(c)[i].adress, GET_REG_LIST(c)[i].name, bits_strings[GET_REG_LIST(c)[i].size]); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mIoRegCombo[c]), reg_name_buffer); g_free(reg_name_buffer); } gtk_combo_box_set_active(GTK_COMBO_BOX(mIoRegCombo[c]), 0); g_signal_connect(G_OBJECT(mIoRegCombo[c]), "changed", G_CALLBACK(selected_reg), GINT_TO_POINTER(c)); gtk_box_pack_start(GTK_BOX(mVbox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mVbox0[c]), mRegInfos[c], FALSE, FALSE, 0); selected_reg(mIoRegCombo[c], GINT_TO_POINTER(c)); gtk_widget_show_all(mWin[c]); } } /////////////////////////////// TOOL DEFINITION /////////////////////////////// dTool_t dTool_ioregsView = { SHORTNAME, TOOL_NAME, &open, &update, &close }; desmume-0.9.11/src/gtk/avout_flac.h0000755000000000000000000000170212467662066015631 0ustar rootroot/* Copyright (C) 2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _AVOUT_FLAC_H_ #define _AVOUT_FLAC_H_ #include "avout_pipe_base.h" class AVOutFlac : public AVOutPipeBase { public: AVOutFlac(); protected: Type type() { return TYPE_AUDIO; } const char* const* getArgv(const char* fname); private: char filename[1024]; const char* args[12]; }; #endif desmume-0.9.11/src/gtk/glx_3Demu.h0000755000000000000000000000154412467662066015341 0ustar rootroot/* Copyright (C) 2013 The Lemon Man This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_GL_GLX int init_glx_3Demu(void); int deinit_glx_3Demu(void); #endif desmume-0.9.11/src/gtk/Makefile.am0000755000000000000000000000317012467662066015372 0ustar rootrootSUBDIRS = doc include $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(GTK_CFLAGS) $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) Applicationsdir = $(datadir)/applications Applications_DATA = desmume.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = DeSmuME.xpm EXTRA_DIST = DeSmuME.xpm desmume.desktop bin_PROGRAMS = desmume desmume_SOURCES = \ avout.h \ avout_pipe_base.cpp avout_pipe_base.h \ avout_x264.cpp avout_x264.h \ avout_flac.cpp avout_flac.h \ config.cpp config.h config_opts.h \ desmume.h desmume.cpp \ dTool.h dToolsList.cpp \ tools/ioregsView.cpp tools/ioregsView.h \ ../sndsdl.cpp \ ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp \ osmesa_3Demu.cpp osmesa_3Demu.h \ glx_3Demu.cpp glx_3Demu.h \ cheatsGTK.h cheatsGTK.cpp \ ../filter/hq2x.cpp ../filter/hq2x.h \ ../filter/hq4x.cpp ../filter/hq4x.h \ ../filter/2xsai.cpp ../filter/bilinear.cpp \ ../filter/epx.cpp ../filter/lq2x.cpp \ ../filter/scanline.cpp \ ../filter/videofilter.cpp ../filter/videofilter.h \ main.cpp main.h desmume_LDADD = ../libdesmume.a \ $(SDL_LIBS) $(GTK_LIBS) $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) $(LIBSOUNDTOUCH_LIBS) if HAVE_GDB_STUB desmume_LDADD += ../gdbstub/libgdbstub.a endif if HAVE_LIBOSMESA desmume_LDADD += $(OSMESA_LIBS) else if HAVE_GL_GLX desmume_LDADD += $(GLX_LIBS) endif endif UPDATE_DESKTOP = \ appsdir=$(DESTDIR)$(datadir)/applications ; \ if [ -f $$appsdir/mimeinfo.cache ] ; then \ if test ! "x$(UPDATEDESKTOP)" = "x" ; then \ $(UPDATEDESKTOP) $$appsdir ; \ fi \ fi install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) desmume-0.9.11/src/gtk/doc/0000755000000000000000000000000012467663414014075 5ustar rootrootdesmume-0.9.11/src/gtk/doc/Makefile.in0000644000000000000000000003652512467662234016154 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/gtk/doc DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = desmume.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk/doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk/doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/gtk/doc/desmume.10000755000000000000000000000651212467662066015627 0ustar rootroot.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH DESMUME 1 "June 26, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME desmume \- Nintendo DS emulator .SH SYNOPSIS .B desmume .RI [ options ] " files" ... .SH DESCRIPTION This manual page documents briefly the .B desmume program .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBdesmume\fP is a Nintendo DS emulator running homebrew demos and commercial games. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-load-slot=NUM Loads savegame from slot NUM .TP .B \-\-opengl-2d Enables using OpenGL for screen rendering .TP .B \-\-soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. .TP .B \-\-3d-engine=ENGINE Select available 3d emulation: .RS 0 = 3d disabled .RE .RS 1 = internal desmume software rasterizer (default) .RE .RS 2 = osmesa or gtkglext opengl (if available, depending on compilation options, see desmume \-\-help) .RE .TP .B \-\-disable-sound Disables the sound emulation .TP .B \-\-disable-limiter Disables the 60 fps limiter .TP .B \-\-arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port .TP .B \-\-arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port .TP .B \-\-save-type=TYPE Select savetype from the following: .RS 0 = Autodetect .RE .RS 1 = EEPROM 4kbit .RE .RS 2 = EEPROM 64kbit .RE .RS 3 = EEPROM 512kbit .RE .RS 4 = FRAM 256kbit .RE .RS 5 = FLASH 2mbit .RE .RS 6 = FLASH 4mbit .RE .TP .B \-\-fwlang=LANG Set the language in the firmware, LANG as follows: .RS 0 = Japanese .RE .RS 1 = English .RE .RS 2 = French .RE .RS 3 = German .RE .RS 4 = Italian .RE .RS 5 = Spanish .RE .TP .B \-\-cflash=PATH_TO_DISK_IMAGE Enable disk image GBAMP compact flash emulation .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of program. .SH INPUT Mouse cursor acts as stylus, mouse click replaces stylus touch. .PP Keyboard can be configured and by default works as follows: .RS F1-F10 load savegame from slot 1-10 .RE .RS Shift+F1-F10 save game to slot 1-10 .RE .RS Non-keypad arrows act as d-pad .RE .RS z = A .RE .RS x = B .RE .RS a = Y .RE .RS s = X .RE .RS q = L .RE .RS w = R .RE .RS Enter = START .RE .RS Left Shift = SELECT .RE .RS Backspace = LID .RE .PP Desmume accepts joystick events, which can be configured by user. .SH AUTHOR desmume was written by DeSmuME team (http://sourceforge.net/projects/desmume). .PP This manual page was written by Reinhard Tartler and modified by Pascal Giard , for the Debian project (but may be used by others). desmume-0.9.11/src/gtk/doc/Makefile.am0000755000000000000000000000003212467662066016131 0ustar rootrootdist_man_MANS = desmume.1 desmume-0.9.11/src/gtk/avout_flac.cpp0000755000000000000000000000340712467662066016170 0ustar rootroot/* Copyright (C) 2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include "avout_flac.h" #include "SPU.h" // Helper macros to convert numerics to strings #if defined(_MSC_VER) //re: http://72.14.203.104/search?q=cache:HG-okth5NGkJ:mail.python.org/pipermail/python-checkins/2002-November/030704.html+_msc_ver+compiler+version+string&hl=en&gl=us&ct=clnk&cd=5 #define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) #define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X #define _Py_STRINGIZE2(X) #X #define TOSTRING(X) _Py_STRINGIZE(X) // Alias _Py_STRINGIZE so that we have a common macro name #else #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #endif AVOutFlac::AVOutFlac() { const char* const args[] = { "flac", "-f", "-o", this->filename, "--endian=little", "--channels=2", "--bps=16", "--sample-rate=" TOSTRING(DESMUME_SAMPLE_RATE), "--sign=signed", "--force-raw-format", "-", NULL }; memcpy(this->args, args, sizeof(args)); } const char* const* AVOutFlac::getArgv(const char* fname) { if (strlen(fname) >= sizeof(this->filename)) { return NULL; } strncpy(this->filename, fname, sizeof(this->filename)); return this->args; } desmume-0.9.11/src/cli/0000755000000000000000000000000012467663414013312 5ustar rootrootdesmume-0.9.11/src/cli/Makefile.in0000644000000000000000000006014212467662234015361 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk bin_PROGRAMS = desmume-cli$(EXEEXT) @HAVE_GDB_STUB_TRUE@am__append_1 = ../gdbstub/libgdbstub.a subdir = src/cli ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_desmume_cli_OBJECTS = main.$(OBJEXT) ../sndsdl.$(OBJEXT) \ ../ctrlssdl.$(OBJEXT) ../driver.$(OBJEXT) desmume_cli_OBJECTS = $(am_desmume_cli_OBJECTS) am__DEPENDENCIES_1 = desmume_cli_DEPENDENCIES = ../libdesmume.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__append_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(desmume_cli_SOURCES) DIST_SOURCES = $(desmume_cli_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(ALSA_CFLAGS) \ $(LIBAGG_CFLAGS) $(GLIB_CFLAGS) $(GTHREAD_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) AM_LDFLAGS = desmume_cli_SOURCES = main.cpp ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp ../driver.h ../driver.cpp desmume_cli_LDADD = ../libdesmume.a $(SDL_LIBS) $(ALSA_LIBS) \ $(LIBAGG_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) \ $(LIBSOUNDTOUCH_LIBS) $(am__append_1) all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cli/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/cli/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) ../$(am__dirstamp): @$(MKDIR_P) .. @: > ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../$(DEPDIR) @: > ../$(DEPDIR)/$(am__dirstamp) ../sndsdl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../ctrlssdl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../driver.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) desmume-cli$(EXEEXT): $(desmume_cli_OBJECTS) $(desmume_cli_DEPENDENCIES) $(EXTRA_desmume_cli_DEPENDENCIES) @rm -f desmume-cli$(EXEEXT) $(CXXLINK) $(desmume_cli_OBJECTS) $(desmume_cli_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../ctrlssdl.$(OBJEXT) -rm -f ../driver.$(OBJEXT) -rm -f ../sndsdl.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/ctrlssdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/sndsdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../$(DEPDIR)/$(am__dirstamp) -rm -f ../$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ../$(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ../$(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/cli/main.cpp0000755000000000000000000005143012467662066014752 0ustar rootroot/* main.c - this file is part of DeSmuME * * Copyright (C) 2006-2015 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include #ifndef VERSION #define VERSION "Unknown version" #endif /* * FIXME: Not sure how to detect OpenGL in a platform portable way. */ #ifdef HAVE_GL_GL_H #define INCLUDE_OPENGL_2D #endif #ifdef INCLUDE_OPENGL_2D #include #include #endif #ifndef CLI_UI #define CLI_UI #endif #include "../NDSSystem.h" #include "../driver.h" #include "../GPU.h" #include "../SPU.h" #include "../sndsdl.h" #include "../ctrlssdl.h" #include "../render3D.h" #include "../rasterize.h" #include "../saves.h" #include "../GPU_osd.h" #include "../desmume_config.h" #include "../commandline.h" #include "../slot2.h" #include "../utils/xstring.h" #ifdef GDB_STUB #include "../armcpu.h" #include "../gdbstub.h" #endif volatile bool execute = false; static float nds_screen_size_ratio = 1.0f; #define DISPLAY_FPS #ifdef DISPLAY_FPS #define NUM_FRAMES_TO_TIME 60 #endif #define FPS_LIMITER_FPS 60 static SDL_Surface * surface; /* Flags to pass to SDL_SetVideoMode */ static int sdl_videoFlags; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDDummy, &SNDSDL, NULL }; GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, NULL }; const char * save_type_names[] = { "Autodetect", "EEPROM 4kbit", "EEPROM 64kbit", "EEPROM 512kbit", "FRAM 256kbit", "FLASH 2mbit", "FLASH 4mbit", NULL }; /* Our keyboard config is different because of the directional keys */ /* Please note that m is used for fake microphone */ const u16 cli_kb_cfg[NB_KEYS] = { SDLK_x, // A SDLK_z, // B SDLK_RSHIFT, // select SDLK_RETURN, // start SDLK_RIGHT, // Right SDLK_LEFT, // Left SDLK_UP, // Up SDLK_DOWN, // Down SDLK_w, // R SDLK_q, // L SDLK_s, // X SDLK_a, // Y SDLK_p, // DEBUG SDLK_o, // BOOST SDLK_BACKSPACE, // Lid }; class configured_features : public CommandLine { public: int auto_pause; int frameskip; int engine_3d; int savetype; #ifdef INCLUDE_OPENGL_2D int opengl_2d; int soft_colour_convert; #endif int firmware_language; }; static void init_config( class configured_features *config) { config->auto_pause = 0; config->frameskip = 0; config->engine_3d = 1; config->savetype = 0; #ifdef INCLUDE_OPENGL_2D config->opengl_2d = 0; config->soft_colour_convert = 0; #endif /* use the default language */ config->firmware_language = -1; } static int fill_config( class configured_features *config, int argc, char ** argv) { GOptionEntry options[] = { { "auto-pause", 0, 0, G_OPTION_ARG_NONE, &config->auto_pause, "Pause emulation if focus is lost", NULL}, { "frameskip", 0, 0, G_OPTION_ARG_INT, &config->frameskip, "Set frameskip", "FRAMESKIP"}, { "3d-engine", 0, 0, G_OPTION_ARG_INT, &config->engine_3d, "Select 3d rendering engine. Available engines:\n" "\t\t\t\t\t\t 0 = 3d disabled\n" "\t\t\t\t\t\t 1 = internal rasterizer (default)\n" ,"ENGINE"}, { "save-type", 0, 0, G_OPTION_ARG_INT, &config->savetype, "Select savetype from the following:\n" "\t\t\t\t\t\t 0 = Autodetect (default)\n" "\t\t\t\t\t\t 1 = EEPROM 4kbit\n" "\t\t\t\t\t\t 2 = EEPROM 64kbit\n" "\t\t\t\t\t\t 3 = EEPROM 512kbit\n" "\t\t\t\t\t\t 4 = FRAM 256kbit\n" "\t\t\t\t\t\t 5 = FLASH 2mbit\n" "\t\t\t\t\t\t 6 = FLASH 4mbit\n", "SAVETYPE"}, #ifdef INCLUDE_OPENGL_2D { "opengl-2d", 0, 0, G_OPTION_ARG_NONE, &config->opengl_2d, "Enables using OpenGL for screen rendering", NULL}, { "soft-convert", 0, 0, G_OPTION_ARG_NONE, &config->soft_colour_convert, "Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware.", NULL}, #endif { "fwlang", 0, 0, G_OPTION_ARG_INT, &config->firmware_language, "Set the language in the firmware, LANG as follows:\n" "\t\t\t\t\t\t 0 = Japanese\n" "\t\t\t\t\t\t 1 = English\n" "\t\t\t\t\t\t 2 = French\n" "\t\t\t\t\t\t 3 = German\n" "\t\t\t\t\t\t 4 = Italian\n" "\t\t\t\t\t\t 5 = Spanish\n", "LANG"}, { NULL } }; config->loadCommonOptions(); g_option_context_add_main_entries (config->ctx, options, "options"); config->parse(argc,argv); if(!config->validate()) goto error; if (config->savetype < 0 || config->savetype > 6) { g_printerr("Accepted savetypes are from 0 to 6.\n"); return false; } if (config->firmware_language < -1 || config->firmware_language > 5) { g_printerr("Firmware language must be set to a value from 0 to 5.\n"); goto error; } if (config->engine_3d != 0 && config->engine_3d != 1) { g_printerr("Currently available engines: 0, 1.\n"); goto error; } if (config->frameskip < 0) { g_printerr("Frameskip must be >= 0.\n"); goto error; } if (config->nds_file == "") { g_printerr("Need to specify file to load.\n"); goto error; } #ifdef GDB_STUB if (config->arm9_gdb_port != 0 && (config->arm9_gdb_port < 1 || config->arm9_gdb_port > 65535)) { g_printerr("ARM9 GDB stub port must be in the range 1 to 65535\n"); goto error; } if (config->arm7_gdb_port != 0 && (config->arm7_gdb_port < 1 || config->arm7_gdb_port > 65535)) { g_printerr("ARM7 GDB stub port must be in the range 1 to 65535\n"); goto error; } #endif return 1; error: config->errorHelp(argv[0]); return 0; } /* * The thread handling functions needed by the GDB stub code. */ #ifdef GDB_STUB void * createThread_gdb( void (*thread_function)( void *data), void *thread_data) { SDL_Thread *new_thread = SDL_CreateThread( (int (*)(void *data))thread_function, thread_data); return new_thread; } void joinThread_gdb( void *thread_handle) { int ignore; SDL_WaitThread( (SDL_Thread*)thread_handle, &ignore); } #endif #ifdef INCLUDE_OPENGL_2D /* initialization openGL function */ static int initGL( GLuint *screen_texture) { GLenum errCode; u16 blank_texture[256 * 512]; memset(blank_texture, 0x001f, sizeof(blank_texture)); /* Enable Texture Mapping */ glEnable( GL_TEXTURE_2D ); /* Set the background black */ glClearColor( 0.0f, 0.0f, 0.0f, 0.5f ); /* Depth buffer setup */ glClearDepth( 1.0f ); /* Enables Depth Testing */ glEnable( GL_DEPTH_TEST ); /* The Type Of Depth Test To Do */ glDepthFunc( GL_LEQUAL ); /* Create The Texture */ glGenTextures( 1, &screen_texture[0]); glBindTexture( GL_TEXTURE_2D, screen_texture[0]); /* Generate The Texture */ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 256, 512, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, blank_texture); /* Linear Filtering */ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "Failed to init GL: %s\n", errString); return 0; } return 1; } static void resizeWindow( u16 width, u16 height, GLuint *screen_texture) { int comp_width = 3 * width; int comp_height = 2 * height; GLenum errCode; surface = SDL_SetVideoMode(width, height, 32, sdl_videoFlags); initGL(screen_texture); #ifdef HAVE_LIBAGG Hud.reset(); #endif if ( comp_width > comp_height) { width = 2*height/3; } height = 3*width/2; nds_screen_size_ratio = 256.0 / (double)width; /* Setup our viewport. */ glViewport( 0, 0, ( GLint )width, ( GLint )height ); /* * change to the projection matrix and set * our viewing volume. */ glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); gluOrtho2D( 0.0, 256.0, 384.0, 0.0); /* Make sure we're chaning the model view and not the projection */ glMatrixMode( GL_MODELVIEW ); /* Reset The View */ glLoadIdentity( ); if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "GL resize failed: %s\n", errString); } } static void opengl_Draw( GLuint *texture, int software_convert) { GLenum errCode; /* Clear The Screen And The Depth Buffer */ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); /* Move Into The Screen 5 Units */ glLoadIdentity( ); /* Select screen Texture */ glBindTexture( GL_TEXTURE_2D, texture[0]); if ( software_convert) { int i; u8 converted[256 * 384 * 3]; for ( i = 0; i < (256 * 384); i++) { converted[(i * 3) + 0] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 0) & 0x1f) << 3; converted[(i * 3) + 1] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 5) & 0x1f) << 3; converted[(i * 3) + 2] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 10) & 0x1f) << 3; } glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGB, GL_UNSIGNED_BYTE, converted); } else { glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, &GPU_screen); } if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "GL subimage failed: %s\n", errString); } /* Draw the screen as a textured quad */ glBegin( GL_QUADS); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 256.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 0.75f ); glVertex3f( 256.0f, 384.0f, 0.0f ); glTexCoord2f( 0.0f, 0.75f ); glVertex3f( 0.0f, 384.0f, 0.0f ); glEnd( ); if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "GL draw failed: %s\n", errString); } /* Draw it to the screen */ SDL_GL_SwapBuffers( ); } #endif /* this is a stub for resizeWindow_stub in the case of no gl headers or no opengl 2d */ #ifdef INCLUDE_OPENGL_2D static void resizeWindow_stub (u16 width, u16 height, GLuint *screen_texture) { } #else static void resizeWindow_stub (u16 width, u16 height, void *screen_texture) { } #endif static void Draw( void) { SDL_Surface *rawImage; rawImage = SDL_CreateRGBSurfaceFrom((void*)&GPU_screen, 256, 384, 16, 512, 0x001F, 0x03E0, 0x7C00, 0); if(rawImage == NULL) return; SDL_BlitSurface(rawImage, 0, surface, 0); SDL_UpdateRect(surface, 0, 0, 0, 0); SDL_FreeSurface(rawImage); return; } static void desmume_cycle(struct ctrls_event_config * cfg) { SDL_Event event; cfg->nds_screen_size_ratio = nds_screen_size_ratio; /* Look for queued events and update keypad status */ /* IMPORTANT: Reenable joystick events iif needed. */ if(SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE) SDL_JoystickEventState(SDL_ENABLE); /* There's an event waiting to be processed? */ while ( !cfg->sdl_quit && (SDL_PollEvent(&event) || (!cfg->focused && SDL_WaitEvent(&event)))) { process_ctrls_event( event, cfg); } /* Update mouse position and click */ if(mouse.down) NDS_setTouchPos(mouse.x, mouse.y); if(mouse.click) { NDS_releaseTouch(); mouse.click = FALSE; } update_keypad(cfg->keypad); /* Update keypad */ NDS_exec(); SPU_Emulate_user(); } #ifdef HAVE_LIBAGG T_AGG_RGB555 agg_targetScreen_cli(GPU_screen, 256, 384, 512); #endif int main(int argc, char ** argv) { class configured_features my_config; struct ctrls_event_config ctrls_cfg; int limiter_frame_counter = 0; int limiter_tick0 = 0; int error; GKeyFile *keyfile; int now; #ifdef DISPLAY_FPS u32 fps_timing = 0; u32 fps_frame_counter = 0; u32 fps_previous_time = 0; #endif #ifdef INCLUDE_OPENGL_2D GLuint screen_texture[1]; #endif /* this holds some info about our display */ const SDL_VideoInfo *videoInfo; /* the firmware settings */ struct NDS_fw_config_data fw_config; NDS_Init(); /* default the firmware settings, they may get changed later */ NDS_FillDefaultFirmwareConfigData( &fw_config); init_config( &my_config); if ( !fill_config( &my_config, argc, argv)) { exit(1); } /* use any language set on the command line */ if ( my_config.firmware_language != -1) { fw_config.language = my_config.firmware_language; } my_config.process_addonCommands(); int slot2_device_type = NDS_SLOT2_AUTO; if (my_config.is_cflash_configured) slot2_device_type = NDS_SLOT2_CFLASH; if(my_config.gbaslot_rom != "") { //set the GBA rom and sav paths GBACartridge_RomPath = my_config.gbaslot_rom.c_str(); if(toupper(strright(GBACartridge_RomPath,4)) == ".GBA") GBACartridge_SRAMPath = strright(GBACartridge_RomPath,4) + ".sav"; else //what to do? lets just do the same thing for now GBACartridge_SRAMPath = strright(GBACartridge_RomPath,4) + ".sav"; // Check if the file exists and can be opened FILE * test = fopen(GBACartridge_RomPath.c_str(), "rb"); if (test) { slot2_device_type = NDS_SLOT2_GBACART; fclose(test); } } switch (slot2_device_type) { case NDS_SLOT2_NONE: break; case NDS_SLOT2_AUTO: break; case NDS_SLOT2_CFLASH: break; case NDS_SLOT2_RUMBLEPAK: break; case NDS_SLOT2_GBACART: break; case NDS_SLOT2_GUITARGRIP: break; case NDS_SLOT2_EXPMEMORY: break; case NDS_SLOT2_EASYPIANO: break; case NDS_SLOT2_PADDLE: break; case NDS_SLOT2_PASSME: break; default: slot2_device_type = NDS_SLOT2_NONE; break; } slot2_Init(); slot2_Change((NDS_SLOT2_TYPE)slot2_device_type); if ( !g_thread_supported()) { g_thread_init( NULL); } driver = new BaseDriver(); #ifdef GDB_STUB gdbstub_mutex_init(); /* * Activate the GDB stubs * This has to come after NDS_Init() where the CPUs are set up. */ gdbstub_handle_t arm9_gdb_stub = NULL; gdbstub_handle_t arm7_gdb_stub = NULL; if ( my_config.arm9_gdb_port > 0) { arm9_gdb_stub = createStub_gdb( my_config.arm9_gdb_port, &NDS_ARM9, &arm9_direct_memory_iface); if ( arm9_gdb_stub == NULL) { fprintf( stderr, "Failed to create ARM9 gdbstub on port %d\n", my_config.arm9_gdb_port); exit( 1); } else { activateStub_gdb( arm9_gdb_stub); } } if ( my_config.arm7_gdb_port > 0) { arm7_gdb_stub = createStub_gdb( my_config.arm7_gdb_port, &NDS_ARM7, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { fprintf( stderr, "Failed to create ARM7 gdbstub on port %d\n", my_config.arm7_gdb_port); exit( 1); } else { activateStub_gdb( arm7_gdb_stub); } } #endif /* Create the dummy firmware */ NDS_CreateDummyFirmware( &fw_config); if ( !my_config.disable_sound) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); } NDS_3D_ChangeCore(my_config.engine_3d); backup_setManualBackupType(my_config.savetype); error = NDS_LoadROM( my_config.nds_file.c_str() ); if (error < 0) { fprintf(stderr, "error while loading %s\n", my_config.nds_file.c_str()); exit(-1); } execute = true; if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { fprintf(stderr, "Error trying to initialize SDL: %s\n", SDL_GetError()); return 1; } SDL_WM_SetCaption("Desmume SDL", NULL); /* Fetch the video info */ videoInfo = SDL_GetVideoInfo( ); if ( !videoInfo ) { fprintf( stderr, "Video query failed: %s\n", SDL_GetError( ) ); exit( -1); } /* This checks if hardware blits can be done */ if ( videoInfo->blit_hw ) sdl_videoFlags |= SDL_HWACCEL; #ifdef INCLUDE_OPENGL_2D if ( my_config.opengl_2d) { /* the flags to pass to SDL_SetVideoMode */ sdl_videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ sdl_videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ sdl_videoFlags |= SDL_RESIZABLE; /* Enable window resizing */ /* This checks to see if surfaces can be stored in memory */ if ( videoInfo->hw_available ) sdl_videoFlags |= SDL_HWSURFACE; else sdl_videoFlags |= SDL_SWSURFACE; /* Sets up OpenGL double buffering */ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); surface = SDL_SetVideoMode( 256, 192 * 2, 32, sdl_videoFlags ); /* Verify there is a surface */ if ( !surface ) { fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); exit( -1); } /* initialize OpenGL */ if ( !initGL( screen_texture)) { fprintf( stderr, "Failed to init GL, fall back to software render\n"); my_config.opengl_2d = 0; } } if ( !my_config.opengl_2d) { #endif sdl_videoFlags |= SDL_SWSURFACE; surface = SDL_SetVideoMode(256, 384, 32, sdl_videoFlags); if ( !surface ) { fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); exit( -1); } #ifdef INCLUDE_OPENGL_2D } /* set the initial window size */ if ( my_config.opengl_2d) { resizeWindow( 256, 192*2, screen_texture); } #endif /* Initialize joysticks */ if(!init_joy()) return 1; /* Load keyboard and joystick configuration */ keyfile = desmume_config_read_file(cli_kb_cfg); desmume_config_dispose(keyfile); /* Since gtk has a different mapping the keys stop to work with the saved configuration :| */ load_default_config(cli_kb_cfg); if(my_config.load_slot != -1){ loadstate_slot(my_config.load_slot); } #ifdef HAVE_LIBAGG Desmume_InitOnce(); Hud.reset(); // Now that gtk port draws to RGBA buffer directly, the other one // has to use ugly ways to make HUD rendering work again. // desmume gtk: Sorry desmume-cli :( aggDraw.hud = &agg_targetScreen_cli; aggDraw.hud->setFont("verdana18_bold"); #endif ctrls_cfg.boost = 0; ctrls_cfg.sdl_quit = 0; ctrls_cfg.auto_pause = my_config.auto_pause; ctrls_cfg.focused = 1; ctrls_cfg.fake_mic = 0; ctrls_cfg.keypad = 0; #ifdef INCLUDE_OPENGL_2D ctrls_cfg.screen_texture = screen_texture; #else ctrls_cfg.screen_texture = NULL; #endif ctrls_cfg.resize_cb = &resizeWindow_stub; while(!ctrls_cfg.sdl_quit) { desmume_cycle(&ctrls_cfg); osd->update(); DrawHUD(); #ifdef INCLUDE_OPENGL_2D if ( my_config.opengl_2d) { opengl_Draw( screen_texture, my_config.soft_colour_convert); ctrls_cfg.resize_cb = &resizeWindow; } else #endif Draw(); osd->clear(); for ( int i = 0; i < my_config.frameskip; i++ ) { NDS_SkipNextFrame(); desmume_cycle(&ctrls_cfg); } #ifdef DISPLAY_FPS now = SDL_GetTicks(); #endif if ( !my_config.disable_limiter && !ctrls_cfg.boost) { #ifndef DISPLAY_FPS now = SDL_GetTicks(); #endif int delay = (limiter_tick0 + limiter_frame_counter*1000/FPS_LIMITER_FPS) - now; if (delay < -500 || delay > 100) { // reset if we fall too far behind don't want to run super fast until we catch up limiter_tick0 = now; limiter_frame_counter = 0; } else if (delay > 0) { SDL_Delay(delay); } } // always count frames, we'll mess up if the limiter gets turned on later otherwise limiter_frame_counter += 1 + my_config.frameskip; #ifdef DISPLAY_FPS fps_frame_counter += 1; fps_timing += now - fps_previous_time; fps_previous_time = now; if ( fps_frame_counter == NUM_FRAMES_TO_TIME) { char win_title[20]; float fps = NUM_FRAMES_TO_TIME * 1000.f / fps_timing; fps_frame_counter = 0; fps_timing = 0; snprintf( win_title, sizeof(win_title), "Desmume %f", fps); SDL_WM_SetCaption( win_title, NULL); } #endif } /* Unload joystick */ uninit_joy(); #ifdef GDB_STUB destroyStub_gdb( arm9_gdb_stub); arm9_gdb_stub = NULL; destroyStub_gdb( arm7_gdb_stub); arm7_gdb_stub = NULL; gdbstub_mutex_destroy(); #endif SDL_Quit(); NDS_DeInit(); return 0; } desmume-0.9.11/src/cli/Makefile.am0000755000000000000000000000075612467662066015363 0ustar rootrootSUBDIRS = doc include $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(GLIB_CFLAGS) $(GTHREAD_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) bin_PROGRAMS = desmume-cli desmume_cli_SOURCES = main.cpp ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp ../driver.h ../driver.cpp desmume_cli_LDADD = ../libdesmume.a $(SDL_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) $(LIBSOUNDTOUCH_LIBS) if HAVE_GDB_STUB desmume_cli_LDADD += ../gdbstub/libgdbstub.a endif desmume-0.9.11/src/cli/doc/0000755000000000000000000000000012467663414014057 5ustar rootrootdesmume-0.9.11/src/cli/doc/Makefile.in0000644000000000000000000003653112467662234016133 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/cli/doc DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = desmume-cli.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cli/doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/cli/doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/cli/doc/desmume-cli.10000755000000000000000000000627112467662066016360 0ustar rootroot.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH DESMUME 1 "June 26, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME desmume-cli \- Nintendo DS emulator .SH SYNOPSIS .B desmume-cli .RI [ options ] " files" ... .SH DESCRIPTION This manual page documents briefly the .B desmume-cli program .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBdesmume\fP is a Nintendo DS emulator running homebrew demos and commercial games. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-load-slot=NUM Loads savegame from slot NUM .TP .B \-\-disable-sound Disables the sound emulation .TP .B \-\-disable-limiter Disables the 60 fps limiter .TP .B \-\-3d-engine=ENGINE Select available 3d emulation: .RS 0 = 3d disabled .RE .RS 1 = internal desmume software rasterizer (default) .RE .TP .B \-\-opengl-2d Enables using OpenGL for screen rendering .TP .B \-\-soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. .TP .B \-\-arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port .TP .B \-\-arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port .TP .B \-\-save-type=TYPE Select savetype from the following: .RS 0 = Autodetect .RE .RS 1 = EEPROM 4kbit .RE .RS 2 = EEPROM 64kbit .RE .RS 3 = EEPROM 512kbit .RE .RS 4 = FRAM 256kbit .RE .RS 5 = FLASH 2mbit .RE .RS 6 = FLASH 4mbit .RE .TP .B \-\-fwlang=LANG Set the language in the firmware, LANG as follows: .RS 0 = Japanese .RE .RS 1 = English .RE .RS 2 = French .RE .RS 3 = German .RE .RS 4 = Italian .RE .RS 5 = Spanish .RE .TP .B \-\-cflash=PATH_TO_DISK_IMAGE Enable disk image GBAMP compact flash emulation .TP .B \-\-help Show summary of options. .TP .B \-\-version Show version of program. .PP Some options may be unavailable, depending on compile-time configuration, for instance gdb stubs and opengl. .SH INPUT Mouse cursor acts as stylus, mouse click replaces stylus touch. .PP Keyboard is configured as follows: .RS F1-F10 load savegame from slot 1-10 .RE .RS Shift+F1-F10 save game to slot 1-10 .RE .RS Non-keypad arrows act as d-pad .RE .RS z = A .RE .RS x = B .RE .RS a = Y .RE .RS s = X .RE .RS q = L .RE .RS w = R .RE .RS Enter = START .RE .RS Left Shift = SELECT .RE .RS Backspace = LID .RE .SH AUTHOR desmume was written by DeSmuME team (http://sourceforge.net/projects/desmume). .PP This manual page was written by Pascal Giard , for the Debian project (but may be used by others). desmume-0.9.11/src/cli/doc/Makefile.am0000755000000000000000000000003612467662066016117 0ustar rootrootdist_man_MANS = desmume-cli.1 desmume-0.9.11/src/arm_instructions.cpp0000755000000000000000000043556212467662066016676 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ // ARM core TODO: // - Check all the LDM/STM opcodes: quirks when Rb included in Rlist; opcodes // operating on user registers (LDMXX2/STMXX2) // - Force User mode memory access for LDRx/STRx opcodes with bit24=0 and bit21=1 // (has to be done at memory side; once the PU is emulated well enough) // - Check LDMxx2/STMxx2 (those opcodes that act on User mode registers instead // of current ones) //#define UNTESTEDOPCODEDEBUG #include "instructions.h" #include "cp15.h" #include "debug.h" #include "MMU.h" #include "armcpu.h" #include "NDSSystem.h" #include "MMU_timing.h" #include "bios.h" #define cpu (&ARMPROC) #define TEMPLATE template //----------------------------------------------------------------------------- // Shifting macros //----------------------------------------------------------------------------- #define LSL_IMM \ u32 shift_op = cpu->R[REG_POS(i,0)]<<((i>>7)&0x1F); #define S_LSL_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], 32-shift_op); \ shift_op = cpu->R[REG_POS(i,0)]<R[REG_POS(i,8)])&0xFF; \ if(shift_op>=32) \ shift_op=0; \ else \ shift_op=cpu->R[REG_POS(i,0)]<R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ if(shift_op<32) \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], 32-shift_op); \ shift_op = cpu->R[REG_POS(i,0)]<R[REG_POS(i,0)]); \ } \ else \ { \ shift_op = 0; \ c = 0; \ } #define LSR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ if(shift_op!=0) \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; #define S_LSR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ c = BIT31(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; \ } #define LSR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ if(shift_op>=32) \ shift_op = 0; \ else \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; #define S_LSR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ shift_op = cpu->R[REG_POS(i,0)]; \ } \ else \ if(shift_op<32) \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; \ } \ else \ if(shift_op==32) \ { \ c = BIT31(cpu->R[REG_POS(i,0)]); \ shift_op = 0; \ } \ else \ { \ c = 0; \ shift_op = 0; \ } #define ASR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ if(shift_op==0) \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \ else \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); #define S_ASR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \ c = BIT31(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \ } #define ASR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ if(shift_op<32) \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \ else \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; #define S_ASR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ if(shift_op<32) \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \ } \ else \ { \ c = BIT31(cpu->R[REG_POS(i,0)]); \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \ } #define ROR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ if(shift_op==0) \ { \ shift_op = ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); \ } \ else \ shift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); #define S_ROR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ shift_op = ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); \ c = BIT0(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); \ } #define ROR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ if((shift_op==0)||((shift_op&0x1F)==0)) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ shift_op = ROR(cpu->R[REG_POS(i,0)],(shift_op&0x1F)); #define S_ROR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ { \ shift_op&=0x1F; \ if(shift_op==0) \ { \ shift_op=cpu->R[REG_POS(i,0)]; \ c = BIT31(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); \ } \ } #define IMM_VALUE \ u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E); #define S_IMM_VALUE \ u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E); \ u32 c = cpu->CPSR.bits.C; \ if((i>>8)&0xF) \ c = BIT31(shift_op); #define IMM_OFF (((i>>4)&0xF0)+(i&0xF)) #define IMM_OFF_12 ((i)&0xFFF) //----------------------------------------------------------------------------- // Undefined instruction //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_UND(const u32 i) { TRAPUNDEF(cpu); return 1; } //----------------------------------------------------------------------------- // AND / ANDS // Timing: OK //----------------------------------------------------------------------------- #define OP_AND(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ANDS(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_AND_LSL_IMM(const u32 i) { LSL_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_LSL_REG(const u32 i) { LSL_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_LSR_IMM(const u32 i) { LSR_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_LSR_REG(const u32 i) { LSR_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_ASR_IMM(const u32 i) { ASR_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_ASR_REG(const u32 i) { ASR_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_ROR_IMM(const u32 i) { ROR_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_ROR_REG(const u32 i) { ROR_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_IMM_VAL(const u32 i) { IMM_VALUE; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_LSL_REG(const u32 i) { S_LSL_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_LSR_REG(const u32 i) { S_LSR_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_ASR_REG(const u32 i) { S_ASR_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_ROR_REG(const u32 i) { S_ROR_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_ANDS(1, 3); } //----------------------------------------------------------------------------- // EOR / EORS //----------------------------------------------------------------------------- #define OP_EOR(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] ^ shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_EORS(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] ^ shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_EOR_LSL_IMM(const u32 i) { LSL_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_LSL_REG(const u32 i) { LSL_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_LSR_IMM(const u32 i) { LSR_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_LSR_REG(const u32 i) { LSR_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_ASR_IMM(const u32 i) { ASR_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_ASR_REG(const u32 i) { ASR_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_ROR_IMM(const u32 i) { ROR_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_ROR_REG(const u32 i) { ROR_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_IMM_VAL(const u32 i) { IMM_VALUE; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSL_REG(const u32 i) { S_LSL_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSR_REG(const u32 i) { S_LSR_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_ASR_REG(const u32 i) { S_ASR_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_ROR_REG(const u32 i) { S_ROR_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_EORS(1, 3); } //----------------------------------------------------------------------------- // SUB / SUBS //----------------------------------------------------------------------------- #define OP_SUB(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] - shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_SUBS(a, b) \ cpu->R[REG_POS(i,12)] = v - shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.C = !BorrowFrom(v, shift_op); \ cpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_POS(i,12)], v, shift_op); \ return a; TEMPLATE static u32 FASTCALL OP_SUB_LSL_IMM(const u32 i) { LSL_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_LSL_REG(const u32 i) { LSL_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_LSR_IMM(const u32 i) { LSR_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_LSR_REG(const u32 i) { LSR_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_ASR_IMM(const u32 i) { ASR_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_ASR_REG(const u32 i) { ASR_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_ROR_IMM(const u32 i) { ROR_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_ROR_REG(const u32 i) { ROR_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_IMM_VAL(const u32 i) { IMM_VALUE; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_SUBS(1, 3); } //----------------------------------------------------------------------------- // RSB / RSBS //----------------------------------------------------------------------------- #define OP_RSB(a, b) \ cpu->R[REG_POS(i,12)] = shift_op - cpu->R[REG_POS(i,16)]; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_RSBS(a, b) \ cpu->R[REG_POS(i,12)] = shift_op - v; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.C = !BorrowFrom(shift_op, v); \ cpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_POS(i,12)], shift_op, v); \ return a; TEMPLATE static u32 FASTCALL OP_RSB_LSL_IMM(const u32 i) { LSL_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_LSL_REG(const u32 i) { LSL_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_LSR_IMM(const u32 i) { LSR_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_LSR_REG(const u32 i) { LSR_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_ASR_IMM(const u32 i) { ASR_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_ASR_REG(const u32 i) { ASR_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_ROR_IMM(const u32 i) { ROR_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_ROR_REG(const u32 i) { ROR_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_IMM_VAL(const u32 i) { IMM_VALUE; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_RSBS(1, 3); } //----------------------------------------------------------------------------- // ADD / ADDS //----------------------------------------------------------------------------- #define OP_ADD(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] + shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ADDS(a, b) \ cpu->R[REG_POS(i,12)] = v + shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.C = CarryFrom(v, shift_op); \ cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_POS(i,12)], v, shift_op); \ return a; TEMPLATE static u32 FASTCALL OP_ADD_LSL_IMM(const u32 i) { LSL_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_LSL_REG(const u32 i) { LSL_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_LSR_IMM(const u32 i) { LSR_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_LSR_REG(const u32 i) { LSR_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_ASR_IMM(const u32 i) { ASR_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_ASR_REG(const u32 i) { ASR_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_ROR_IMM(const u32 i) { ROR_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_ROR_REG(const u32 i) { ROR_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_IMM_VAL(const u32 i) { IMM_VALUE; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_ADDS(1, 3); } //----------------------------------------------------------------------------- // ADC / ADCS //----------------------------------------------------------------------------- #define OP_ADC(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] + shift_op + cpu->CPSR.bits.C; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ADCS(a, b) \ { \ if(REG_POS(i,12)==15) \ { \ cpu->R[REG_POS(i,12)] = v + shift_op + cpu->CPSR.bits.C; \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ if (!cpu->CPSR.bits.C) \ { \ cpu->R[REG_POS(i,12)] = v + shift_op; \ cpu->CPSR.bits.C = cpu->R[REG_POS(i,12)] < v; \ } \ else \ { \ cpu->R[REG_POS(i,12)] = v + shift_op + 1; \ cpu->CPSR.bits.C = cpu->R[REG_POS(i,12)] <= v; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.V = BIT31((v ^ shift_op ^ -1) & (v ^ cpu->R[REG_POS(i, 12)]));\ return a; \ } TEMPLATE static u32 FASTCALL OP_ADC_LSL_IMM(const u32 i) { LSL_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_LSL_REG(const u32 i) { LSL_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_LSR_IMM(const u32 i) { LSR_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_LSR_REG(const u32 i) { LSR_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_ASR_IMM(const u32 i) { ASR_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_ASR_REG(const u32 i) { ASR_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_ROR_IMM(const u32 i) { ROR_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_ROR_REG(const u32 i) { ROR_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_IMM_VAL(const u32 i) { IMM_VALUE; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_ADCS(1, 3); } //----------------------------------------------------------------------------- // SBC / SBCS //----------------------------------------------------------------------------- #define OP_SBC(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] - shift_op - !cpu->CPSR.bits.C; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_SBCS(a, b) \ { \ if(REG_POS(i,12)==15) \ { \ cpu->R[REG_POS(i,12)] = v - shift_op - !cpu->CPSR.bits.C; \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ if (!cpu->CPSR.bits.C) \ { \ cpu->R[REG_POS(i,12)] = v - shift_op - 1; \ cpu->CPSR.bits.C = v > shift_op; \ } \ else \ { \ cpu->R[REG_POS(i,12)] = v - shift_op; \ cpu->CPSR.bits.C = v >= shift_op; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.V = BIT31((v ^ shift_op) & (v ^ cpu->R[REG_POS(i, 12)])); \ return a; \ } TEMPLATE static u32 FASTCALL OP_SBC_LSL_IMM(const u32 i) { LSL_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_LSL_REG(const u32 i) { LSL_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_LSR_IMM(const u32 i) { LSR_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_LSR_REG(const u32 i) { LSR_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_ASR_IMM(const u32 i) { ASR_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_ASR_REG(const u32 i) { ASR_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_ROR_IMM(const u32 i) { ROR_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_ROR_REG(const u32 i) { ROR_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_IMM_VAL(const u32 i) { IMM_VALUE; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_SBCS(1, 3); } //----------------------------------------------------------------------------- // RSC / RSCS //----------------------------------------------------------------------------- #define OP_RSC(a, b) \ cpu->R[REG_POS(i,12)] = shift_op - cpu->R[REG_POS(i,16)] + cpu->CPSR.bits.C - 1; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_RSCS(a, b) \ { \ if(REG_POS(i,12)==15) \ { \ cpu->R[REG_POS(i,12)] = shift_op - v - !cpu->CPSR.bits.C; \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ if (!cpu->CPSR.bits.C) \ { \ cpu->R[REG_POS(i,12)] = shift_op - v - 1; \ cpu->CPSR.bits.C = shift_op > v; \ } \ else \ { \ cpu->R[REG_POS(i,12)] = shift_op - v; \ cpu->CPSR.bits.C = shift_op >= v; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.V = BIT31((shift_op ^ v) & (shift_op ^ cpu->R[REG_POS(i, 12)])); \ return a; \ } TEMPLATE static u32 FASTCALL OP_RSC_LSL_IMM(const u32 i) { LSL_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_LSL_REG(const u32 i) { LSL_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_LSR_IMM(const u32 i) { LSR_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_LSR_REG(const u32 i) { LSR_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_ASR_IMM(const u32 i) { ASR_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_ASR_REG(const u32 i) { ASR_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_ROR_IMM(const u32 i) { ROR_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_ROR_REG(const u32 i) { ROR_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_IMM_VAL(const u32 i) { IMM_VALUE; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_RSCS(1,3); } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- #define OP_TST(a) \ { \ u32 tmp = cpu->R[REG_POS(i,16)] & shift_op; \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ return a; \ } TEMPLATE static u32 FASTCALL OP_TST_LSL_IMM(const u32 i) { S_LSL_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_LSL_REG(const u32 i) { S_LSL_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_LSR_IMM(const u32 i) { S_LSR_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_LSR_REG(const u32 i) { S_LSR_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_ASR_IMM(const u32 i) { S_ASR_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_ASR_REG(const u32 i) { S_ASR_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_ROR_IMM(const u32 i) { S_ROR_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_ROR_REG(const u32 i) { S_ROR_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_TST(1); } //----------------------------------------------------------------------------- // TEQ //----------------------------------------------------------------------------- #define OP_TEQ(a) \ { \ unsigned tmp = cpu->R[REG_POS(i,16)] ^ shift_op; \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ return a; \ } TEMPLATE static u32 FASTCALL OP_TEQ_LSL_IMM(const u32 i) { S_LSL_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_LSL_REG(const u32 i) { S_LSL_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_LSR_IMM(const u32 i) { S_LSR_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_LSR_REG(const u32 i) { S_LSR_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_ASR_IMM(const u32 i) { S_ASR_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_ASR_REG(const u32 i) { S_ASR_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_ROR_IMM(const u32 i) { S_ROR_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_ROR_REG(const u32 i) { S_ROR_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_TEQ(1); } //----------------------------------------------------------------------------- // CMP //----------------------------------------------------------------------------- #define OP_CMP(a) \ { \ u32 tmp = cpu->R[REG_POS(i,16)] - shift_op; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ cpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_POS(i,16)], shift_op); \ cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_POS(i,16)], shift_op); \ return a; \ } TEMPLATE static u32 FASTCALL OP_CMP_LSL_IMM(const u32 i) { LSL_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_LSL_REG(const u32 i) { LSL_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_LSR_IMM(const u32 i) { LSR_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_LSR_REG(const u32 i) { LSR_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_ASR_IMM(const u32 i) { ASR_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_ASR_REG(const u32 i) { ASR_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_ROR_IMM(const u32 i) { ROR_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_ROR_REG(const u32 i) { ROR_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_IMM_VAL(const u32 i) { IMM_VALUE; OP_CMP(1); } //----------------------------------------------------------------------------- // CMN //----------------------------------------------------------------------------- #define OP_CMN(a) \ { \ u32 tmp = cpu->R[REG_POS(i,16)] + shift_op; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ cpu->CPSR.bits.C = CarryFrom(cpu->R[REG_POS(i,16)], shift_op); \ cpu->CPSR.bits.V = OverflowFromADD(tmp, cpu->R[REG_POS(i,16)], shift_op); \ return a; \ } TEMPLATE static u32 FASTCALL OP_CMN_LSL_IMM(const u32 i) { LSL_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_LSL_REG(const u32 i) { LSL_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_LSR_IMM(const u32 i) { LSR_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_LSR_REG(const u32 i) { LSR_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_ASR_IMM(const u32 i) { ASR_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_ASR_REG(const u32 i) { ASR_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_ROR_IMM(const u32 i) { ROR_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_ROR_REG(const u32 i) { ROR_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_IMM_VAL(const u32 i) { IMM_VALUE; OP_CMN(1); } //----------------------------------------------------------------------------- // ORR / ORRS //----------------------------------------------------------------------------- #define OP_ORR(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] | shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ORRS(a,b) \ { \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] | shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; \ } TEMPLATE static u32 FASTCALL OP_ORR_LSL_IMM(const u32 i) { LSL_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_LSL_REG(const u32 i) { LSL_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_LSR_IMM(const u32 i) { LSR_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_LSR_REG(const u32 i) { LSR_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_ASR_IMM(const u32 i) { ASR_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_ASR_REG(const u32 i) { ASR_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_ROR_IMM(const u32 i) { ROR_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_ROR_REG(const u32 i) { ROR_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_IMM_VAL(const u32 i) { IMM_VALUE; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSL_REG(const u32 i) { S_LSL_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSR_REG(const u32 i) { S_LSR_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_ASR_REG(const u32 i) { S_ASR_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_ROR_REG(const u32 i) { S_ROR_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_ORRS(1,3); } //----------------------------------------------------------------------------- // MOV / MOVS //----------------------------------------------------------------------------- #define OP_MOV(a, b) \ cpu->R[REG_POS(i,12)] = shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = shift_op; \ return b; \ } \ return a; #define OP_MOVS(a, b) \ cpu->R[REG_POS(i,12)] = shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_MOV_LSL_IMM(const u32 i) { if (i == 0xE1A00000) // nop: MOV R0, R0 return 1; LSL_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_LSL_REG(const u32 i) { LSL_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_LSR_IMM(const u32 i) { LSR_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_LSR_REG(const u32 i) { LSR_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_ASR_IMM(const u32 i) { ASR_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_ASR_REG(const u32 i) { ASR_REG; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_ROR_IMM(const u32 i) { ROR_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_ROR_REG(const u32 i) { ROR_REG; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_IMM_VAL(const u32 i) { IMM_VALUE; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSL_REG(const u32 i) { S_LSL_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSR_REG(const u32 i) { S_LSR_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_ASR_REG(const u32 i) { S_ASR_REG; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_ROR_REG(const u32 i) { S_ROR_REG; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_MOVS(1,3); } //----------------------------------------------------------------------------- // BIC / BICS //----------------------------------------------------------------------------- #define OP_BIC(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & (~shift_op); \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_BICS(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & (~shift_op); \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_BIC_LSL_IMM(const u32 i) { LSL_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_LSL_REG(const u32 i) { LSL_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_LSR_IMM(const u32 i) { LSR_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_LSR_REG(const u32 i) { LSR_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_ASR_IMM(const u32 i) { ASR_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_ASR_REG(const u32 i) { ASR_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_ROR_IMM(const u32 i) { ROR_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_ROR_REG(const u32 i) { ROR_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_IMM_VAL(const u32 i) { IMM_VALUE; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSL_REG(const u32 i) { S_LSL_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSR_REG(const u32 i) { S_LSR_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_ASR_REG(const u32 i) { S_ASR_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_ROR_REG(const u32 i) { S_ROR_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_BICS(1,3); } //----------------------------------------------------------------------------- // MVN / MVNS //----------------------------------------------------------------------------- #define OP_MVN(a, b) \ cpu->R[REG_POS(i,12)] = ~shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_MVNS(a, b) \ cpu->R[REG_POS(i,12)] = ~shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_MVN_LSL_IMM(const u32 i) { LSL_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_LSL_REG(const u32 i) { LSL_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_LSR_IMM(const u32 i) { LSR_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_LSR_REG(const u32 i) { LSR_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_ASR_IMM(const u32 i) { ASR_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_ASR_REG(const u32 i) { ASR_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_ROR_IMM(const u32 i) { ROR_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_ROR_REG(const u32 i) { ROR_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_IMM_VAL(const u32 i) { IMM_VALUE; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSL_REG(const u32 i) { S_LSL_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSR_REG(const u32 i) { S_LSR_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_ASR_REG(const u32 i) { S_ASR_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_ROR_REG(const u32 i) { S_ROR_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_MVNS(1,3); } //----------------------------------------------------------------------------- // MUL / MULS / MLA / MLAS //----------------------------------------------------------------------------- #define MUL_Mxx_END(c) \ v >>= 8; \ if((v==0)||(v==0xFFFFFF)) \ return c+1; \ v >>= 8; \ if((v==0)||(v==0xFFFF)) \ return c+2; \ v >>= 8; \ if((v==0)||(v==0xFF)) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_MUL(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v; MUL_Mxx_END(1); } TEMPLATE static u32 FASTCALL OP_MLA(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v + cpu->R[REG_POS(i,12)]; MUL_Mxx_END(2); } TEMPLATE static u32 FASTCALL OP_MUL_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0); MUL_Mxx_END(1); } TEMPLATE static u32 FASTCALL OP_MLA_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v + cpu->R[REG_POS(i,12)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0); MUL_Mxx_END(2); } //----------------------------------------------------------------------------- // UMULL / UMULLS / UMLAL / UMLALS //----------------------------------------------------------------------------- #define MUL_UMxxL_END(c) \ v >>= 8; \ if(v==0) \ return c+1; \ v >>= 8; \ if(v==0) \ return c+2; \ v >>= 8; \ if(v==0) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_UMULL(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v; cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); MUL_UMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_UMLAL(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v; // RdLo = (Rm * Rs)[31:0] + RdLo /* Unsigned multiplication */ // RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo) u32 tmp = (u32)res; // low cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; MUL_UMxxL_END(3); } TEMPLATE static u32 FASTCALL OP_UMULL_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = ((u64)cpu->R[REG_POS(i,0)] * (u64)v); cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) && (cpu->R[REG_POS(i,12)]==0); MUL_UMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_UMLAL_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v; // RdLo = (Rm * Rs)[31:0] + RdLo /* Unsigned multiplication */ // RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo) u32 tmp = (u32)res; // low cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0); MUL_UMxxL_END(3); } //----------------------------------------------------------------------------- // SMULL / SMULLS / SMLAL / SMLALS //----------------------------------------------------------------------------- #define MUL_SMxxL_END(c) \ v &= 0xFFFFFFFF; \ v >>= 8; \ if((v==0)||(v==0xFFFFFF)) \ return c+1; \ v >>= 8; \ if((v==0)||(v==0xFFFF)) \ return c+2; \ v >>= 8; \ if((v==0)||(v==0xFF)) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_SMULL(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); MUL_SMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_SMLAL(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; //LOG("%08X * %08X + %08X%08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], cpu->R[REG_POS(i,16)], cpu->R[REG_POS(i,12)]); u32 tmp = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; //LOG("= %08X%08X %08X%08X\n", cpu->R[REG_POS(i,16)], cpu->R[REG_POS(i,12)], res); MUL_SMxxL_END(3); } TEMPLATE static u32 FASTCALL OP_SMULL_S(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0); MUL_SMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_SMLAL_S(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; u32 tmp = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0); MUL_SMxxL_END(3); } //----------------------------------------------------------------------------- // SWP / SWPB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SWP(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; u32 tmp = ROR(READ32(cpu->mem_if->data, adr), (adr & 3)<<3); WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,0)]); cpu->R[REG_POS(i,12)] = tmp; u32 c = MMU_memAccessCycles(adr); c += MMU_memAccessCycles(adr); return MMU_aluMemCycles(4, c); } TEMPLATE static u32 FASTCALL OP_SWPB(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; u8 tmp = READ8(cpu->mem_if->data, adr); WRITE8(cpu->mem_if->data, adr, (u8)(cpu->R[REG_POS(i,0)]&0xFF)); cpu->R[REG_POS(i,12)] = tmp; u32 c = MMU_memAccessCycles(adr); c += MMU_memAccessCycles(adr); return MMU_aluMemCycles(4, c); } //----------------------------------------------------------------------------- // LDRH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRH_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] =(u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // STRH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRH_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] += IMM_OFF; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] -= IMM_OFF; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // LDRSH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSH_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // LDRSB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSB_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // MRS / MSR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MRS_CPSR(const u32 i) { cpu->R[REG_POS(i,12)] = cpu->CPSR.val; return 1; } TEMPLATE static u32 FASTCALL OP_MRS_SPSR(const u32 i) { cpu->R[REG_POS(i,12)] = cpu->SPSR.val; return 1; } #define OP_MSR_CPSR_(operand) \ u32 byte_mask = (cpu->CPSR.bits.mode == USR)?(BIT19(i)?0xFF000000:0x00000000): \ (BIT16(i)?0x000000FF:0x00000000) | \ (BIT17(i)?0x0000FF00:0x00000000) | \ (BIT18(i)?0x00FF0000:0x00000000) | \ (BIT19(i)?0xFF000000:0x00000000); \ if(cpu->CPSR.bits.mode != USR && BIT16(i)) \ { armcpu_switchMode(cpu, operand & 0x1F); } \ cpu->CPSR.val = (cpu->CPSR.val & ~byte_mask) | (operand & byte_mask); \ cpu->changeCPSR(); #define OP_MSR_SPSR_(operand) \ if(cpu->CPSR.bits.mode == USR || cpu->CPSR.bits.mode == SYS) return 1; \ u32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) | \ (BIT17(i)?0x0000FF00:0x00000000) | \ (BIT18(i)?0x00FF0000:0x00000000) | \ (BIT19(i)?0xFF000000:0x00000000); \ cpu->SPSR.val = (cpu->SPSR.val & ~byte_mask) | (operand & byte_mask); \ cpu->changeCPSR(); //#define __NEW_MSR #ifdef __NEW_MSR #define v4T_UNALLOC_MASK 0x0FFFFF00 #define v4T_USER_MASK 0xF0000000 #define v4T_PRIV_MASK 0x0000000F #define v4T_STATE_MASK 0x00000020 #define v5TE_UNALLOC_MASK 0x07FFFF00 #define v5TE_USER_MASK 0xF8000000 #define v5TE_PRIV_MASK 0x0000000F #define v5TE_STATE_MASK 0x00000020 #endif TEMPLATE static u32 FASTCALL OP_MSR_CPSR(const u32 i) { u32 operand = cpu->R[REG_POS(i,0)]; #ifdef __NEW_MSR u32 mask = 0; u32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) | (BIT17(i)?0x0000FF00:0x00000000) | (BIT18(i)?0x00FF0000:0x00000000) | (BIT19(i)?0xFF000000:0x00000000); const u32 unallocMask = PROCNUM?v4T_UNALLOC_MASK: v5TE_UNALLOC_MASK; const u32 userMask = PROCNUM?v4T_USER_MASK : v5TE_USER_MASK; const u32 privMask = PROCNUM?v4T_PRIV_MASK : v5TE_PRIV_MASK; const u32 stateMask = PROCNUM?v4T_STATE_MASK : v5TE_STATE_MASK; if ((operand & unallocMask) != 0) printf("ARM%c: MSR_CPSR_REG UNPREDICTABLE UNALLOC (operand %08X)\n", PROCNUM?'7':'9', operand); if (cpu->CPSR.bits.mode != USR) // Privileged mode { if (BIT16(i)) armcpu_switchMode(cpu, operand & 0x1F); if ((operand & stateMask) != 0) printf("ARM%c: MSR_CPSR_REG UNPREDICTABLE STATE (operand %08X)\n", PROCNUM?'7':'9', operand); else mask = byte_mask & (userMask | privMask); } else mask = byte_mask & userMask; u32 new_val = ((cpu->CPSR.val & (~mask)) | (operand & mask)); cpu->CPSR.val = ((cpu->CPSR.val & (~mask)) | (operand & mask)); cpu->changeCPSR(); #else OP_MSR_CPSR_(operand); #endif return 1; } TEMPLATE static u32 FASTCALL OP_MSR_SPSR(const u32 i) { //printf("OP_MSR_SPSR\n"); u32 operand = cpu->R[REG_POS(i,0)]; OP_MSR_SPSR_(operand); return 1; } TEMPLATE static u32 FASTCALL OP_MSR_CPSR_IMM_VAL(const u32 i) { //printf("OP_MSR_CPSR_IMM_VAL\n"); IMM_VALUE; OP_MSR_CPSR_(shift_op); return 1; } TEMPLATE static u32 FASTCALL OP_MSR_SPSR_IMM_VAL(const u32 i) { //printf("OP_MSR_SPSR_IMM_VAL\n"); IMM_VALUE; OP_MSR_SPSR_(shift_op); return 1; } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BX(const u32 i) { u32 tmp = cpu->R[REG_POS(i, 0)]; if (REG_POS(i, 0) == 15) { //printf("ARM%c: BX using PC as operand\n", PROCNUM?'7':'9'); //emu_halt(); } cpu->CPSR.bits.T = BIT0(tmp); cpu->R[15] = tmp & (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } TEMPLATE static u32 FASTCALL OP_BLX_REG(const u32 i) { u32 tmp = cpu->R[REG_POS(i, 0)]; cpu->R[14] = cpu->next_instruction; cpu->CPSR.bits.T = BIT0(tmp); cpu->R[15] = tmp & (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } #define SIGNEXTEND_24(i) (((s32)i<<8)>>8) TEMPLATE static u32 FASTCALL OP_B(const u32 i) { static const u32 mov_r12_r12 = 0xE1A0C00C; const u32 last = _MMU_read32(cpu->instruct_adr-4); if(last == mov_r12_r12) { const u32 next = _MMU_read16(cpu->instruct_adr+4); if(next == 0x6464) NocashMessage(cpu, 8); } u32 off = SIGNEXTEND_24(i); if(CONDITION(i)==0xF) { cpu->R[14] = cpu->next_instruction; cpu->CPSR.bits.T = 1; } cpu->R[15] += (off<<2); cpu->R[15] &= (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } TEMPLATE static u32 FASTCALL OP_BL(const u32 i) { u32 off = SIGNEXTEND_24(i); if(CONDITION(i)==0xF) { cpu->CPSR.bits.T = 1; cpu->R[15] += 2; } cpu->R[14] = cpu->next_instruction; cpu->R[15] += (off<<2); cpu->R[15] &= (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } //----------------------------------------------------------------------------- // CLZ //----------------------------------------------------------------------------- const u8 CLZ_TAB[16]= { 0, // 0000 1, // 0001 2, 2, // 001X 3, 3, 3, 3, // 01XX 4, 4, 4, 4, 4, 4, 4, 4 // 1XXX }; TEMPLATE static u32 FASTCALL OP_CLZ(const u32 i) { u32 Rm = cpu->R[REG_POS(i,0)]; u32 pos; if(Rm==0) { cpu->R[REG_POS(i,12)]=32; return 2; } Rm |= (Rm >>1); Rm |= (Rm >>2); Rm |= (Rm >>4); Rm |= (Rm >>8); Rm |= (Rm >>16); pos = CLZ_TAB[Rm&0xF] + CLZ_TAB[(Rm>>4)&0xF] + CLZ_TAB[(Rm>>8)&0xF] + CLZ_TAB[(Rm>>12)&0xF] + CLZ_TAB[(Rm>>16)&0xF] + CLZ_TAB[(Rm>>20)&0xF] + CLZ_TAB[(Rm>>24)&0xF] + CLZ_TAB[(Rm>>28)&0xF]; cpu->R[REG_POS(i,12)]=32 - pos; return 2; } //----------------------------------------------------------------------------- // QADD / QDADD / QSUB / QDSUB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_QADD(const u32 i) { u32 res = cpu->R[REG_POS(i,16)]+cpu->R[REG_POS(i,0)]; //LOG("spe add\n"); if(SIGNED_OVERFLOW(cpu->R[REG_POS(i,16)],cpu->R[REG_POS(i,0)], res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } TEMPLATE static u32 FASTCALL OP_QSUB(const u32 i) { u32 res = cpu->R[REG_POS(i,0)]-cpu->R[REG_POS(i,16)]; //LOG("spe add\n"); if(SIGNED_UNDERFLOW(cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,16)], res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } TEMPLATE static u32 FASTCALL OP_QDADD(const u32 i) { u32 mul = cpu->R[REG_POS(i,16)]<<1; u32 res; //LOG("spe add\n"); if(BIT31(cpu->R[REG_POS(i,16)])!=BIT31(mul)) { cpu->CPSR.bits.Q=1; mul = 0x80000000-BIT31(mul); } res = mul + cpu->R[REG_POS(i,0)]; if(SIGNED_OVERFLOW(cpu->R[REG_POS(i,0)],mul, res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } TEMPLATE static u32 FASTCALL OP_QDSUB(const u32 i) { u32 mul = cpu->R[REG_POS(i,16)]<<1; u32 res; //LOG("spe add\n"); if(BIT31(cpu->R[REG_POS(i,16)])!=BIT31(mul)) { cpu->CPSR.bits.Q=1; mul = 0x80000000-BIT31(mul); } res = cpu->R[REG_POS(i,0)] - mul; if(SIGNED_UNDERFLOW(cpu->R[REG_POS(i,0)], mul, res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } //----------------------------------------------------------------------------- // SMUL //----------------------------------------------------------------------------- #define HWORD(i) ((s32)(((s32)(i))>>16)) #define LWORD(i) (s32)(((s32)((i)<<16))>>16) TEMPLATE static u32 FASTCALL OP_SMUL_B_B(const u32 i) { // checked //INFO("SMUL_B_B\n"); cpu->R[REG_POS(i,16)] = (u32)(LWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); return 2; } TEMPLATE static u32 FASTCALL OP_SMUL_B_T(const u32 i) { //INFO("SMUL_B_T\n"); cpu->R[REG_POS(i,16)] = (u32)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); return 2; } TEMPLATE static u32 FASTCALL OP_SMUL_T_B(const u32 i) { //INFO("SMUL_T_B\n"); cpu->R[REG_POS(i,16)] = (u32)(HWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); return 2; } TEMPLATE static u32 FASTCALL OP_SMUL_T_T(const u32 i) { //INFO("SMUL_T_T\n"); cpu->R[REG_POS(i,16)] = (u32)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); return 2; } //----------------------------------------------------------------------------- // SMLA //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMLA_B_B(const u32 i) { u32 tmp = (u32)((s16)cpu->R[REG_POS(i,0)]* (s16)cpu->R[REG_POS(i,8)]); cpu->R[REG_POS(i,16)] = tmp + cpu->R[REG_POS(i,12)]; if (OverflowFromADD(cpu->R[REG_POS(i,16)], tmp, cpu->R[REG_POS(i,12)])) cpu->CPSR.bits.Q = 1; //INFO("SMLABB %08X * %08X + %08X = %08X\n", (s16)cpu->R[REG_POS(i,0)], (s16)cpu->R[REG_POS(i,8)], cpu->R[REG_POS(i,12)], (s32)cpu->R[REG_POS(i,16)]); return 2; } TEMPLATE static u32 FASTCALL OP_SMLA_B_T(const u32 i) { u32 tmp = (u32)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLABT R%d:%08X * R%d:%08X + R%d:%08X = %08X\n", REG_POS(i,0), cpu->R[REG_POS(i,0)], REG_POS(i,8), cpu->R[REG_POS(i,8)], REG_POS(i,12), a, tmp + a); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } TEMPLATE static u32 FASTCALL OP_SMLA_T_B(const u32 i) { u32 tmp = (u32)(HWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLATB %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, tmp + a); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } TEMPLATE static u32 FASTCALL OP_SMLA_T_T(const u32 i) { u32 tmp = (u32)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLATT %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, tmp + a); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } //----------------------------------------------------------------------------- // SMLAL //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMLAL_B_B(const u32 i) { s64 tmp = (s64)(LWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALBB %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + (res + ((tmp<0)*0xFFFFFFFF))), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += (res + ((tmp<0)*0xFFFFFFFF)); return 2; } TEMPLATE static u32 FASTCALL OP_SMLAL_B_T(const u32 i) { s64 tmp = (s64)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALBT %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF); return 2; } TEMPLATE static u32 FASTCALL OP_SMLAL_T_B(const u32 i) { s64 tmp = (s64)(HWORD(cpu->R[REG_POS(i,0)])* (s64)LWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALTB %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF); return 2; } TEMPLATE static u32 FASTCALL OP_SMLAL_T_T(const u32 i) { s64 tmp = (s64)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALTT %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF); return 2; } //----------------------------------------------------------------------------- // SMULW //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMULW_B(const u32 i) { s64 tmp = (s64)LWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); //INFO("SMULWB %08X * %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], ((tmp>>16)&0xFFFFFFFF)); cpu->R[REG_POS(i,16)] = ((tmp>>16)&0xFFFFFFFF); return 2; } TEMPLATE static u32 FASTCALL OP_SMULW_T(const u32 i) { s64 tmp = (s64)HWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); //INFO("SMULWT %08X * %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], ((tmp>>16)&0xFFFFFFFF)); cpu->R[REG_POS(i,16)] = ((tmp>>16)&0xFFFFFFFF); return 2; } //----------------------------------------------------------------------------- // SMLAW //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMLAW_B(const u32 i) { s64 tmp = (s64)LWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLAWB %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, (tmp>>16) + a); tmp = (tmp>>16); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW((u32)tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } TEMPLATE static u32 FASTCALL OP_SMLAW_T(const u32 i) { s64 tmp = (s64)HWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLAWT %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, ((tmp>>16)&0xFFFFFFFF) + a); tmp = ((tmp>>16)&0xFFFFFFFF); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW((u32)tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } //----------------------------------------------------------------------------- // LDR //----------------------------------------------------------------------------- #define OP_LDR(a, b) \ cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \ \ if(REG_POS(i,12)==15) \ { \ if (PROCNUM == 0) \ { \ cpu->CPSR.bits.T = BIT0(cpu->R[15]); \ cpu->R[15] &= 0xFFFFFFFE; \ } \ else \ { \ cpu->R[15] &= 0xFFFFFFFC; \ } \ cpu->next_instruction = cpu->R[15]; \ return MMU_aluMemAccessCycles(b,adr); \ } \ \ return MMU_aluMemAccessCycles(a,adr); // PRE #define OP_LDR_W(a, b) \ cpu->R[REG_POS(i,16)] = adr;\ cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \ \ if(REG_POS(i,12)==15) \ { \ if (PROCNUM == 0) \ { \ cpu->CPSR.bits.T = BIT0(cpu->R[15]); \ cpu->R[15] &= 0xFFFFFFFE; \ } \ else \ { \ cpu->R[15] &= 0xFFFFFFFC; \ } \ cpu->next_instruction = cpu->R[15]; \ return MMU_aluMemAccessCycles(b,adr); \ } \ \ return MMU_aluMemAccessCycles(a,adr); // POST #define OP_LDR_W2(a, b, c) \ u32 adr = cpu->R[REG_POS(i,16)]; \ cpu->R[REG_POS(i,16)] = adr + c;\ cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \ \ if(REG_POS(i,12)==15) \ { \ if (PROCNUM == 0) \ { \ cpu->CPSR.bits.T = BIT0(cpu->R[15]); \ cpu->R[15] &= 0xFFFFFFFE; \ } \ else \ { \ cpu->R[15] &= 0xFFFFFFFC; \ } \ cpu->next_instruction = cpu->R[15]; \ return MMU_aluMemAccessCycles(b,adr); \ } \ \ return MMU_aluMemAccessCycles(a,adr); TEMPLATE static u32 FASTCALL OP_LDR_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_W2(3, 5, IMM_OFF_12); } TEMPLATE static u32 FASTCALL OP_LDR_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_W2(3, 5, -IMM_OFF_12); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; OP_LDR_W2(3, 5, -shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; OP_LDR_W2(3, 5, -shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; OP_LDR_W2(3, 5, -shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; OP_LDR_W2(3, 5, -shift_op); } //----------------------------------------------------------------------------- // LDREX //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDREX(const u32 i) { printf("LDREX\n"); u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // LDRB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRB_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);; return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);; return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // STR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STR_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // STREX //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STREX(const u32 i) { printf("STREX\n"); u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,0)]); cpu->R[REG_POS(i,12)] = 0; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // STRB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRB_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // LDMIA / LDMIB / LDMDA / LDMDB //----------------------------------------------------------------------------- #define OP_L_IA(reg, adr) if(BIT##reg(i)) \ { \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ adr += 4; \ } #define OP_L_IB(reg, adr) if(BIT##reg(i)) \ { \ adr += 4; \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ } #define OP_L_DA(reg, adr) if(BIT##reg(i)) \ { \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ adr -= 4; \ } #define OP_L_DB(reg, adr) if(BIT##reg(i)) \ { \ adr -= 4; \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ } TEMPLATE static u32 FASTCALL OP_LDMIA(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); // TODO // The general-purpose registers loaded can include the PC. If they do, the word loaded for the PC is treated // as an address and a branch occurs to that address. In ARMv5 and above, bit[0] of the loaded value // determines whether execution continues after this branch in ARM state or in Thumb state, as though a BX // (loaded_value) instruction had been executed (but see also The T and J bits on page A2-15 for operation on // non-T variants of ARMv5). In earlier versions of the architecture, bits[1:0] of the loaded value are ignored // and execution continues in ARM state, as though the instruction MOV PC,(loaded_value) had been executed. // //value = Memory[address,4] //if (architecture version 5 or above) then // pc = value AND 0xFFFFFFFE // T Bit = value[0] //else // pc = value AND 0xFFFFFFFC if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; //start += 4; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i)) { start += 4; c += MMU_memAccessCycles(start); u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; return MMU_aluMemCycles(4, c); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; if(BIT15(i)) { start -= 4; u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; c += MMU_memAccessCycles(start); start += 4; cpu->next_instruction = registres[15]; } if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(BIT15(i)?4:2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i)) { u32 tmp; start += 4; c += MMU_memAccessCycles(start); tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; } if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(BIT15(i)?4:2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; if(BIT15(i)) { u32 tmp; start -= 4; tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i) == 0) { armcpu_switchMode(cpu, oldmode); } else { u32 tmp = READ32(cpu->mem_if->data, start); Status_Reg SPSR; cpu->R[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); //start += 4; cpu->next_instruction = cpu->R[15]; c += MMU_memAccessCycles(start); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; UNTESTEDOPCODELOG("Untested opcode: OP_LDMIB2 \n"); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i) == 0) { armcpu_switchMode(cpu, oldmode); } else { u32 tmp; Status_Reg SPSR; start += 4; tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 * registres; u32 start = cpu->R[REG_POS(i,16)]; UNTESTEDOPCODELOG("Untested opcode: OP_LDMDA2 \n"); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); } else { Status_Reg SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 * registres; u32 start = cpu->R[REG_POS(i,16)]; if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { u32 tmp; start -= 4; tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); } else { Status_Reg SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; u32 tmp; Status_Reg SPSR; // emu_halt(); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i)==0) { if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start + 4; tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; u32 tmp; Status_Reg SPSR; if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i)==0) { if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start + 4; tmp = READ32(cpu->mem_if->data, start + 4); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); c += MMU_memAccessCycles(start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; Status_Reg SPSR; // emu_halt(); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { if (BIT_N(i, REG_POS(i,16))) printf("error1_1\n"); u32 tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; Status_Reg SPSR; // emu_halt(); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { if (BIT_N(i, REG_POS(i,16))) printf("error1_2\n"); u32 tmp; start -= 4; tmp = READ32(cpu->mem_if->data, start); c += MMU_memAccessCycles(start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); return MMU_aluMemCycles(2, c); } //----------------------------------------------------------------------------- // STMIA / STMIB / STMDA / STMDB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STMIA(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIA_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIA2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMIA2 \n"); for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMIB2 \n"); for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMDA2 \n"); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c=0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIA2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c=0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMIA2_W \n"); for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } cpu->R[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c=0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } armcpu_switchMode(cpu, oldmode); cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMDA2_W \n"); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } cpu->R[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMDB2_W \n"); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } cpu->R[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } //----------------------------------------------------------------------------- // LDRD / STRD //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRD_STRD_POST_INDEX(const u32 i) { u32 Rd_num = REG_POS( i, 12); u32 addr = cpu->R[REG_POS(i,16)]; u32 index; //printf("%s POST\n", BIT5(i)?"STRD":"LDRD"); /* I bit - immediate or register */ if ( BIT22(i)) index = IMM_OFF; else index = cpu->R[REG_POS(i,0)]; // U bit - add or subtract if ( BIT23(i)) cpu->R[REG_POS(i,16)] += index; else cpu->R[REG_POS(i,16)] -= index; u32 c = 0; if ( !(Rd_num & 0x1)) { // Store/Load if ( BIT5(i)) { WRITE32(cpu->mem_if->data, addr, cpu->R[Rd_num]); WRITE32(cpu->mem_if->data, addr + 4, cpu->R[Rd_num + 1]); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); } else { cpu->R[Rd_num] = READ32(cpu->mem_if->data, addr); cpu->R[Rd_num + 1] = READ32(cpu->mem_if->data, addr + 4); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); } } return MMU_aluMemCycles(3, c); } TEMPLATE static u32 FASTCALL OP_LDRD_STRD_OFFSET_PRE_INDEX(const u32 i) { u32 Rd_num = REG_POS( i, 12); u32 addr = cpu->R[REG_POS(i,16)]; u32 index; //printf("%s PRE\n", BIT5(i)?"STRD":"LDRD"); // I bit - immediate or register if ( BIT22(i)) index = IMM_OFF; else index = cpu->R[REG_POS(i,0)]; // U bit - add or subtract if ( BIT23(i)) addr += index; else addr -= index; u32 c = 0; if ( !(Rd_num & 0x1)) { // Store/Load if ( BIT5(i)) { WRITE32(cpu->mem_if->data, addr, cpu->R[Rd_num]); WRITE32(cpu->mem_if->data, addr + 4, cpu->R[Rd_num + 1]); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); // W bit - writeback if ( BIT21(i)) cpu->R[REG_POS(i,16)] = addr; } else { // W bit - writeback if ( BIT21(i)) cpu->R[REG_POS(i,16)] = addr; cpu->R[Rd_num] = READ32(cpu->mem_if->data, addr); cpu->R[Rd_num + 1] = READ32(cpu->mem_if->data, addr + 4); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); } } return MMU_aluMemCycles(3, c); } //----------------------------------------------------------------------------- // STC // the NDS has no coproc that responses to a STC, no feedback is given to the arm //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STC_P_IMM_OFF(const u32 i) { //INFO("OP_STC_P_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_M_IMM_OFF(const u32 i) { //INFO("OP_STC_M_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_P_PREIND(const u32 i) { //INFO("OP_STC_P_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_M_PREIND(const u32 i) { //INFO("OP_STC_M_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_P_POSTIND(const u32 i) { //INFO("OP_STC_P_POSTIND: cp_num %i\n", (i>>8)&0x0F); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_M_POSTIND(const u32 i) { //INFO("OP_STC_M_POSTIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_OPTION(const u32 i) { //INFO("OP_STC_OPTION\n"); return TRAPUNDEF(cpu); } //----------------------------------------------------------------------------- // LDC // the NDS has no coproc that responses to a LDC, no feedback is given to the arm //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDC_P_IMM_OFF(const u32 i) { //INFO("OP_LDC_P_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_M_IMM_OFF(const u32 i) { //INFO("OP_LDC_M_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_P_PREIND(const u32 i) { //INFO("OP_LDC_P_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_M_PREIND(const u32 i) { //INFO("OP_LDC_M_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_P_POSTIND(const u32 i) { //INFO("OP_LDC_P_POSTIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_M_POSTIND(const u32 i) { //INFO("OP_LDC_M_POSTIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_OPTION(const u32 i) { //INFO("OP_LDC_OPTION\n"); return TRAPUNDEF(cpu); } //----------------------------------------------------------------------------- // MCR / MRC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MCR(const u32 i) { u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { //emu_halt(); //INFO("Stopped (OP_MCR) \n"); INFO("ARM%c: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", PROCNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } cp15.moveARM2CP(cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } TEMPLATE static u32 FASTCALL OP_MRC(const u32 i) { //if (PROCNUM != 0) return 1; u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { //emu_halt(); //INFO("Stopped (OP_MRC) \n"); INFO("ARM%c: MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", PROCNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } // ARM REF: //data = value from Coprocessor[cp_num] //if Rd is R15 then // N flag = data[31] // Z flag = data[30] // C flag = data[29] // V flag = data[28] //else /* Rd is not R15 */ // Rd = data u32 data = 0; cp15.moveCP2ARM(&data, REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); if (REG_POS(i, 12) == 15) { cpu->CPSR.bits.N = BIT31(data); cpu->CPSR.bits.Z = BIT30(data); cpu->CPSR.bits.C = BIT29(data); cpu->CPSR.bits.V = BIT28(data); } else cpu->R[REG_POS(i, 12)] = data; //cpu->coproc[cpnum]->moveCP2ARM(&cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&7, (i>>5)&7); return 4; } //----------------------------------------------------------------------------- // SWI //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SWI(const u32 i) { u32 swinum = (i>>16)&0xFF; //ideas-style debug prints (execute this SWI with the null terminated string address in R0) if(swinum==0xFC) { IdeasLog(cpu); return 0; } //if the user has changed the intVector to point away from the nds bioses, //then it doesn't really make any sense to use the builtin SWI's since //the bios ones aren't getting called anyway bool bypassBuiltinSWI = (cpu->intVector == 0x00000000 && PROCNUM==0) || (cpu->intVector == 0xFFFF0000 && PROCNUM==1); //printf("ARM%c SWI %02X\t; %s\n", PROCNUM?'7':'9', (swinum & 0x1F), ARM_swi_names[PROCNUM][(swinum & 0x1F)]); if(cpu->swi_tab && !bypassBuiltinSWI) { swinum &= 0x1F; return cpu->swi_tab[swinum]() + 3; } else { /* TODO (#1#): translocated SWI vectors */ /* we use an irq thats not in the irq tab, as it was replaced duie to a changed intVector */ Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, SVC); /* enter svc mode */ cpu->R[14] = cpu->next_instruction; cpu->SPSR = tmp; /* save old CPSR as new SPSR */ cpu->CPSR.bits.T = 0; /* handle as ARM32 code */ cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x08; cpu->next_instruction = cpu->R[15]; return 3; } } //----------------------------------------------------------------------------- // BKPT //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BKPT(const u32 i) { /* ARM-ref if (not overridden by debug hardware) R14_abt = address of BKPT instruction + 4 SPSR_abt = CPSR CPSR[4:0] = 0b10111 // Enter Abort mode CPSR[5] = 0 // Execute in ARM state // CPSR[6] is unchanged CPSR[7] = 1 // Disable normal interrupts CPSR[8] = 1 // Disable imprecise aborts - v6 only CPSR[9] = CP15_reg1_EEbit if high vectors configured then PC = 0xFFFF000C else PC = 0x0000000C */ /* static u32 last_bkpt = 0xFFFFFFFF; if(i != last_bkpt) printf("ARM OP_BKPT triggered\n"); last_bkpt = i; //this is not 100% correctly emulated, but it does the job cpu->next_instruction = cpu->instruct_adr; return 4; */ printf("ARM OP_BKPT triggered\n"); Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, ABT); // enter abt mode cpu->R[14] = cpu->instruct_adr + 4; cpu->SPSR = tmp; // save old CPSR as new SPSR cpu->CPSR.bits.T = 0; // handle as ARM32 code cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x0C; cpu->next_instruction = cpu->R[15]; return 4; } //----------------------------------------------------------------------------- // CDP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_CDP(const u32 i) { //INFO("Stopped (OP_CDP) \n"); return TRAPUNDEF(cpu); } //----------------------------------------------------------------------------- // The End //----------------------------------------------------------------------------- const OpFunc arm_instructions_set[2][4096] = {{ #define TABDECL(x) x<0> #include "instruction_tabdef.inc" #undef TABDECL },{ #define TABDECL(x) x<1> #include "instruction_tabdef.inc" #undef TABDECL }}; #define TABDECL(x) #x const char* arm_instruction_names[4096] = { #include "instruction_tabdef.inc" }; #undef TABDECL desmume-0.9.11/src/OGLRender_3_2.h0000644000000000000000000000531112467662066015142 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef OGLRENDER_3_2_H #define OGLRENDER_3_2_H #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include #include #include #define OGLEXT(procPtr, func) procPtr func = NULL; #define INITOGLEXT(procPtr, func) func = (procPtr)wglGetProcAddress(#func); #define EXTERNOGLEXT(procPtr, func) extern procPtr func; #elif defined(__APPLE__) #include #include // Ignore dynamic linking on Apple OS #define OGLEXT(procPtr, func) #define INITOGLEXT(procPtr, func) #define EXTERNOGLEXT(procPtr, func) #else #include #include #include "utils/glcorearb.h" #define OGLEXT(procPtr, func) procPtr func = NULL; #define INITOGLEXT(procPtr, func) func = (procPtr)glXGetProcAddress((const GLubyte *) #func); #define EXTERNOGLEXT(procPtr, func) extern procPtr func; #endif // Check minimum OpenGL header version #if !defined(GL_VERSION_3_2) #error OpenGL requires v3.2 headers or later. #endif #include "OGLRender.h" void OGLLoadEntryPoints_3_2(); void OGLCreateRenderer_3_2(OpenGLRenderer **rendererPtr); class OpenGLRenderer_3_2 : public OpenGLRenderer_2_1 { protected: virtual Render3DError InitExtensions(); virtual Render3DError CreateFBOs(); virtual void DestroyFBOs(); virtual Render3DError CreateMultisampledFBO(); virtual void DestroyMultisampledFBO(); virtual Render3DError CreateVAOs(); virtual void DestroyVAOs(); virtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram); virtual Render3DError SetupShaderIO(); virtual void GetExtensionSet(std::set *oglExtensionSet); virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount); virtual Render3DError DisableVertexAttributes(); virtual Render3DError SelectRenderingFramebuffer(); virtual Render3DError DownsampleFBO(); virtual Render3DError ClearUsingImage() const; public: ~OpenGLRenderer_3_2(); }; #endif desmume-0.9.11/src/bios.cpp0000755000000000000000000011577512467662066014230 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //this file contains HLE for the arm9 and arm7 bios SWI routines. //it renders the use of bios files generally unnecessary. //it turns out that they're not too complex, although of course the timings will be all wrong here. #include "armcpu.h" #include "cp15.h" #include #include "MMU.h" #include "debug.h" #include "registers.h" #include "NDSSystem.h" #define cpu (&ARMPROC) #define TEMPLATE template struct CompressionHeader { public: CompressionHeader(u32 _value) : value(_value) {} u32 DataSize() const { return value&15; } u32 Type() const { return (value>>4)&15; } u32 DecompressedSize() const { return value>>8; } private: u32 value; }; static const u16 getsinetbl[] = { 0x0000, 0x0324, 0x0648, 0x096A, 0x0C8C, 0x0FAB, 0x12C8, 0x15E2, 0x18F9, 0x1C0B, 0x1F1A, 0x2223, 0x2528, 0x2826, 0x2B1F, 0x2E11, 0x30FB, 0x33DF, 0x36BA, 0x398C, 0x3C56, 0x3F17, 0x41CE, 0x447A, 0x471C, 0x49B4, 0x4C3F, 0x4EBF, 0x5133, 0x539B, 0x55F5, 0x5842, 0x5A82, 0x5CB3, 0x5ED7, 0x60EB, 0x62F1, 0x64E8, 0x66CF, 0x68A6, 0x6A6D, 0x6C23, 0x6DC9, 0x6F5E, 0x70E2, 0x7254, 0x73B5, 0x7504, 0x7641, 0x776B, 0x7884, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE3, 0x7D89, 0x7E1D, 0x7E9C, 0x7F09, 0x7F61, 0x7FA6, 0x7FD8, 0x7FF5 }; static const u16 getpitchtbl[] = { 0x0000, 0x003B, 0x0076, 0x00B2, 0x00ED, 0x0128, 0x0164, 0x019F, 0x01DB, 0x0217, 0x0252, 0x028E, 0x02CA, 0x0305, 0x0341, 0x037D, 0x03B9, 0x03F5, 0x0431, 0x046E, 0x04AA, 0x04E6, 0x0522, 0x055F, 0x059B, 0x05D8, 0x0614, 0x0651, 0x068D, 0x06CA, 0x0707, 0x0743, 0x0780, 0x07BD, 0x07FA, 0x0837, 0x0874, 0x08B1, 0x08EF, 0x092C, 0x0969, 0x09A7, 0x09E4, 0x0A21, 0x0A5F, 0x0A9C, 0x0ADA, 0x0B18, 0x0B56, 0x0B93, 0x0BD1, 0x0C0F, 0x0C4D, 0x0C8B, 0x0CC9, 0x0D07, 0x0D45, 0x0D84, 0x0DC2, 0x0E00, 0x0E3F, 0x0E7D, 0x0EBC, 0x0EFA, 0x0F39, 0x0F78, 0x0FB6, 0x0FF5, 0x1034, 0x1073, 0x10B2, 0x10F1, 0x1130, 0x116F, 0x11AE, 0x11EE, 0x122D, 0x126C, 0x12AC, 0x12EB, 0x132B, 0x136B, 0x13AA, 0x13EA, 0x142A, 0x146A, 0x14A9, 0x14E9, 0x1529, 0x1569, 0x15AA, 0x15EA, 0x162A, 0x166A, 0x16AB, 0x16EB, 0x172C, 0x176C, 0x17AD, 0x17ED, 0x182E, 0x186F, 0x18B0, 0x18F0, 0x1931, 0x1972, 0x19B3, 0x19F5, 0x1A36, 0x1A77, 0x1AB8, 0x1AFA, 0x1B3B, 0x1B7D, 0x1BBE, 0x1C00, 0x1C41, 0x1C83, 0x1CC5, 0x1D07, 0x1D48, 0x1D8A, 0x1DCC, 0x1E0E, 0x1E51, 0x1E93, 0x1ED5, 0x1F17, 0x1F5A, 0x1F9C, 0x1FDF, 0x2021, 0x2064, 0x20A6, 0x20E9, 0x212C, 0x216F, 0x21B2, 0x21F5, 0x2238, 0x227B, 0x22BE, 0x2301, 0x2344, 0x2388, 0x23CB, 0x240E, 0x2452, 0x2496, 0x24D9, 0x251D, 0x2561, 0x25A4, 0x25E8, 0x262C, 0x2670, 0x26B4, 0x26F8, 0x273D, 0x2781, 0x27C5, 0x280A, 0x284E, 0x2892, 0x28D7, 0x291C, 0x2960, 0x29A5, 0x29EA, 0x2A2F, 0x2A74, 0x2AB9, 0x2AFE, 0x2B43, 0x2B88, 0x2BCD, 0x2C13, 0x2C58, 0x2C9D, 0x2CE3, 0x2D28, 0x2D6E, 0x2DB4, 0x2DF9, 0x2E3F, 0x2E85, 0x2ECB, 0x2F11, 0x2F57, 0x2F9D, 0x2FE3, 0x302A, 0x3070, 0x30B6, 0x30FD, 0x3143, 0x318A, 0x31D0, 0x3217, 0x325E, 0x32A5, 0x32EC, 0x3332, 0x3379, 0x33C1, 0x3408, 0x344F, 0x3496, 0x34DD, 0x3525, 0x356C, 0x35B4, 0x35FB, 0x3643, 0x368B, 0x36D3, 0x371A, 0x3762, 0x37AA, 0x37F2, 0x383A, 0x3883, 0x38CB, 0x3913, 0x395C, 0x39A4, 0x39ED, 0x3A35, 0x3A7E, 0x3AC6, 0x3B0F, 0x3B58, 0x3BA1, 0x3BEA, 0x3C33, 0x3C7C, 0x3CC5, 0x3D0E, 0x3D58, 0x3DA1, 0x3DEA, 0x3E34, 0x3E7D, 0x3EC7, 0x3F11, 0x3F5A, 0x3FA4, 0x3FEE, 0x4038, 0x4082, 0x40CC, 0x4116, 0x4161, 0x41AB, 0x41F5, 0x4240, 0x428A, 0x42D5, 0x431F, 0x436A, 0x43B5, 0x4400, 0x444B, 0x4495, 0x44E1, 0x452C, 0x4577, 0x45C2, 0x460D, 0x4659, 0x46A4, 0x46F0, 0x473B, 0x4787, 0x47D3, 0x481E, 0x486A, 0x48B6, 0x4902, 0x494E, 0x499A, 0x49E6, 0x4A33, 0x4A7F, 0x4ACB, 0x4B18, 0x4B64, 0x4BB1, 0x4BFE, 0x4C4A, 0x4C97, 0x4CE4, 0x4D31, 0x4D7E, 0x4DCB, 0x4E18, 0x4E66, 0x4EB3, 0x4F00, 0x4F4E, 0x4F9B, 0x4FE9, 0x5036, 0x5084, 0x50D2, 0x5120, 0x516E, 0x51BC, 0x520A, 0x5258, 0x52A6, 0x52F4, 0x5343, 0x5391, 0x53E0, 0x542E, 0x547D, 0x54CC, 0x551A, 0x5569, 0x55B8, 0x5607, 0x5656, 0x56A5, 0x56F4, 0x5744, 0x5793, 0x57E2, 0x5832, 0x5882, 0x58D1, 0x5921, 0x5971, 0x59C1, 0x5A10, 0x5A60, 0x5AB0, 0x5B01, 0x5B51, 0x5BA1, 0x5BF1, 0x5C42, 0x5C92, 0x5CE3, 0x5D34, 0x5D84, 0x5DD5, 0x5E26, 0x5E77, 0x5EC8, 0x5F19, 0x5F6A, 0x5FBB, 0x600D, 0x605E, 0x60B0, 0x6101, 0x6153, 0x61A4, 0x61F6, 0x6248, 0x629A, 0x62EC, 0x633E, 0x6390, 0x63E2, 0x6434, 0x6487, 0x64D9, 0x652C, 0x657E, 0x65D1, 0x6624, 0x6676, 0x66C9, 0x671C, 0x676F, 0x67C2, 0x6815, 0x6869, 0x68BC, 0x690F, 0x6963, 0x69B6, 0x6A0A, 0x6A5E, 0x6AB1, 0x6B05, 0x6B59, 0x6BAD, 0x6C01, 0x6C55, 0x6CAA, 0x6CFE, 0x6D52, 0x6DA7, 0x6DFB, 0x6E50, 0x6EA4, 0x6EF9, 0x6F4E, 0x6FA3, 0x6FF8, 0x704D, 0x70A2, 0x70F7, 0x714D, 0x71A2, 0x71F7, 0x724D, 0x72A2, 0x72F8, 0x734E, 0x73A4, 0x73FA, 0x7450, 0x74A6, 0x74FC, 0x7552, 0x75A8, 0x75FF, 0x7655, 0x76AC, 0x7702, 0x7759, 0x77B0, 0x7807, 0x785E, 0x78B4, 0x790C, 0x7963, 0x79BA, 0x7A11, 0x7A69, 0x7AC0, 0x7B18, 0x7B6F, 0x7BC7, 0x7C1F, 0x7C77, 0x7CCF, 0x7D27, 0x7D7F, 0x7DD7, 0x7E2F, 0x7E88, 0x7EE0, 0x7F38, 0x7F91, 0x7FEA, 0x8042, 0x809B, 0x80F4, 0x814D, 0x81A6, 0x81FF, 0x8259, 0x82B2, 0x830B, 0x8365, 0x83BE, 0x8418, 0x8472, 0x84CB, 0x8525, 0x857F, 0x85D9, 0x8633, 0x868E, 0x86E8, 0x8742, 0x879D, 0x87F7, 0x8852, 0x88AC, 0x8907, 0x8962, 0x89BD, 0x8A18, 0x8A73, 0x8ACE, 0x8B2A, 0x8B85, 0x8BE0, 0x8C3C, 0x8C97, 0x8CF3, 0x8D4F, 0x8DAB, 0x8E07, 0x8E63, 0x8EBF, 0x8F1B, 0x8F77, 0x8FD4, 0x9030, 0x908C, 0x90E9, 0x9146, 0x91A2, 0x91FF, 0x925C, 0x92B9, 0x9316, 0x9373, 0x93D1, 0x942E, 0x948C, 0x94E9, 0x9547, 0x95A4, 0x9602, 0x9660, 0x96BE, 0x971C, 0x977A, 0x97D8, 0x9836, 0x9895, 0x98F3, 0x9952, 0x99B0, 0x9A0F, 0x9A6E, 0x9ACD, 0x9B2C, 0x9B8B, 0x9BEA, 0x9C49, 0x9CA8, 0x9D08, 0x9D67, 0x9DC7, 0x9E26, 0x9E86, 0x9EE6, 0x9F46, 0x9FA6, 0xA006, 0xA066, 0xA0C6, 0xA127, 0xA187, 0xA1E8, 0xA248, 0xA2A9, 0xA30A, 0xA36B, 0xA3CC, 0xA42D, 0xA48E, 0xA4EF, 0xA550, 0xA5B2, 0xA613, 0xA675, 0xA6D6, 0xA738, 0xA79A, 0xA7FC, 0xA85E, 0xA8C0, 0xA922, 0xA984, 0xA9E7, 0xAA49, 0xAAAC, 0xAB0E, 0xAB71, 0xABD4, 0xAC37, 0xAC9A, 0xACFD, 0xAD60, 0xADC3, 0xAE27, 0xAE8A, 0xAEED, 0xAF51, 0xAFB5, 0xB019, 0xB07C, 0xB0E0, 0xB145, 0xB1A9, 0xB20D, 0xB271, 0xB2D6, 0xB33A, 0xB39F, 0xB403, 0xB468, 0xB4CD, 0xB532, 0xB597, 0xB5FC, 0xB662, 0xB6C7, 0xB72C, 0xB792, 0xB7F7, 0xB85D, 0xB8C3, 0xB929, 0xB98F, 0xB9F5, 0xBA5B, 0xBAC1, 0xBB28, 0xBB8E, 0xBBF5, 0xBC5B, 0xBCC2, 0xBD29, 0xBD90, 0xBDF7, 0xBE5E, 0xBEC5, 0xBF2C, 0xBF94, 0xBFFB, 0xC063, 0xC0CA, 0xC132, 0xC19A, 0xC202, 0xC26A, 0xC2D2, 0xC33A, 0xC3A2, 0xC40B, 0xC473, 0xC4DC, 0xC544, 0xC5AD, 0xC616, 0xC67F, 0xC6E8, 0xC751, 0xC7BB, 0xC824, 0xC88D, 0xC8F7, 0xC960, 0xC9CA, 0xCA34, 0xCA9E, 0xCB08, 0xCB72, 0xCBDC, 0xCC47, 0xCCB1, 0xCD1B, 0xCD86, 0xCDF1, 0xCE5B, 0xCEC6, 0xCF31, 0xCF9C, 0xD008, 0xD073, 0xD0DE, 0xD14A, 0xD1B5, 0xD221, 0xD28D, 0xD2F8, 0xD364, 0xD3D0, 0xD43D, 0xD4A9, 0xD515, 0xD582, 0xD5EE, 0xD65B, 0xD6C7, 0xD734, 0xD7A1, 0xD80E, 0xD87B, 0xD8E9, 0xD956, 0xD9C3, 0xDA31, 0xDA9E, 0xDB0C, 0xDB7A, 0xDBE8, 0xDC56, 0xDCC4, 0xDD32, 0xDDA0, 0xDE0F, 0xDE7D, 0xDEEC, 0xDF5B, 0xDFC9, 0xE038, 0xE0A7, 0xE116, 0xE186, 0xE1F5, 0xE264, 0xE2D4, 0xE343, 0xE3B3, 0xE423, 0xE493, 0xE503, 0xE573, 0xE5E3, 0xE654, 0xE6C4, 0xE735, 0xE7A5, 0xE816, 0xE887, 0xE8F8, 0xE969, 0xE9DA, 0xEA4B, 0xEABC, 0xEB2E, 0xEB9F, 0xEC11, 0xEC83, 0xECF5, 0xED66, 0xEDD9, 0xEE4B, 0xEEBD, 0xEF2F, 0xEFA2, 0xF014, 0xF087, 0xF0FA, 0xF16D, 0xF1E0, 0xF253, 0xF2C6, 0xF339, 0xF3AD, 0xF420, 0xF494, 0xF507, 0xF57B, 0xF5EF, 0xF663, 0xF6D7, 0xF74C, 0xF7C0, 0xF834, 0xF8A9, 0xF91E, 0xF992, 0xFA07, 0xFA7C, 0xFAF1, 0xFB66, 0xFBDC, 0xFC51, 0xFCC7, 0xFD3C, 0xFDB2, 0xFE28, 0xFE9E, 0xFF14, 0xFF8A }; static const u8 getvoltbl[] = { 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31, 0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B, 0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40, 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70, 0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7E, 0x7F }; TEMPLATE static u32 bios_nop() { LOG("SWI: ARM%c Unimplemented BIOS function %02X was used. R0:%08X, R1:%08X, R2:%08X\n", PROCNUM?'7':'9', (cpu->instruction)&0x1F, cpu->R[0], cpu->R[1], cpu->R[2]); return 3; } TEMPLATE static u32 WaitByLoop() { u32 elapsed; //printf("%lld waitbyloop\n",nds_timer); //INFO("ARM%c: SWI 0x03 (WaitByLoop)\n", PROCNUM?'7':'9'); if (PROCNUM == ARMCPU_ARM9) { if (cp15.ctrl & ((1<<16)|(1<<18))) // DTCM or ITCM is on (cache) elapsed = cpu->R[0] * 2; else elapsed = cpu->R[0] * 8; } else elapsed = cpu->R[0] * 4; cpu->R[0] = 0; return elapsed; } TEMPLATE static u32 wait4IRQ() { cpu->waitIRQ = TRUE; cpu->halt_IE_and_IF = TRUE; return 1; } TEMPLATE static u32 intrWaitARM() { //TODO - account for differences between arm7 and arm9 (according to gbatek, the "bug doesn't work") const u32 intrFlagAdr = (PROCNUM == ARMCPU_ARM7) ? 0x380FFF8 : (cp15.DTCMRegion&0xFFFFF000)+0x3FF8; //set IME=1 //without this, no irq handlers can happen (even though IF&IE waits can happily happen) //and so no bits in the OS irq flag variable can get set by the handlers _MMU_write32(0x04000208, 1); //analyze the OS irq flag variable u32 intr = _MMU_read32(intrFlagAdr); u32 intrFlag = (cpu->R[1] & intr); //if the user requested us to discard flags, then clear the flag(s) we're going to be waiting on. //(be sure to only do this only on the first run through. use a little state machine to control that) if(cpu->intrWaitARM_state==0 && cpu->R[0]==1) { intr ^= intrFlag; _MMU_write32(intrFlagAdr, intr); //we want to make sure we wait at least once below intrFlag = 0; } cpu->intrWaitARM_state = 1; //now, if the condition is satisfied (and it won't be the first time through, no matter what, due to cares taken above) if(intrFlag) { //write back the OS irq flags with the ones we were waiting for cleared intr ^= intrFlag; _MMU_write32(intrFlagAdr, intr); cpu->intrWaitARM_state = 0; return 1; } //the condition wasn't satisfied. this means that we need to halt, wait for some enabled interrupt, //and then ensure that we return to this opcode again to check the condition again cpu->waitIRQ = TRUE; cpu->halt_IE_and_IF = TRUE; //(rewire PC to jump back to this opcode) u32 instructAddr = cpu->instruct_adr; cpu->R[15] = instructAddr; cpu->next_instruction = instructAddr; return 1; } TEMPLATE static u32 waitVBlankARM() { cpu->R[0] = 1; cpu->R[1] = 1; return intrWaitARM(); } TEMPLATE static u32 sleep() { //just set REG_HALTCNT to the fixed Sleep value _MMU_write08(REG_HALTCNT, 0xC0); return 1; } //ARM7 only TEMPLATE static u32 CustomHalt() { //just set REG_HALTCNT to the provided value _MMU_write08(REG_HALTCNT, cpu->R[2]); return 1; } TEMPLATE static u32 divide() { s32 num = (s32)cpu->R[0]; s32 dnum = (s32)cpu->R[1]; if(dnum==0) return 0; s32 res = num / dnum; cpu->R[0] = (u32)res; cpu->R[1] = (u32)(num % dnum); cpu->R[3] = (u32)abs(res); //INFO("ARM%c: SWI 0x09 (divide): in num %i, dnum %i, out R0:%i, R1:%i, R3:%i\n", PROCNUM?'7':'9', num, dnum, cpu->R[0], cpu->R[1], cpu->R[3]); return 6; } TEMPLATE static u32 copy() { u32 src = cpu->R[0]; u32 dst = cpu->R[1]; u32 cnt = cpu->R[2]; //INFO("swi copy from %08X to %08X, cnt=%08X\n", src, dst, cnt); switch(BIT26(cnt)) { case 0: src &= 0xFFFFFFFE; dst &= 0xFFFFFFFE; switch(BIT24(cnt)) { case 0: cnt &= 0x1FFFFF; while(cnt) { _MMU_write16(dst, _MMU_read16(src)); cnt--; dst+=2; src+=2; } break; case 1: { u16 val = _MMU_read16(src); cnt &= 0x1FFFFF; while(cnt) { _MMU_write16(dst, val); cnt--; dst+=2; } } break; } break; case 1: src &= 0xFFFFFFFC; dst &= 0xFFFFFFFC; switch(BIT24(cnt)) { case 0: cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, _MMU_read32(src)); cnt--; dst+=4; src+=4; } break; case 1: { u32 val = _MMU_read32(src); cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, val); cnt--; dst+=4; } } break; } break; } return 1; } TEMPLATE static u32 fastCopy() { u32 src = cpu->R[0] & 0xFFFFFFFC; u32 dst = cpu->R[1] & 0xFFFFFFFC; u32 cnt = cpu->R[2]; //INFO("swi fastcopy from %08X to %08X, cnt=%08X\n", src, dst, cnt); switch(BIT24(cnt)) { case 0: cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, _MMU_read32(src)); cnt--; dst+=4; src+=4; } break; case 1: { u32 val = _MMU_read32(src); cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, val); cnt--; dst+=4; } } break; } return 1; } TEMPLATE static u32 LZ77UnCompVram() { int i1, i2; int byteCount; int byteShift; u32 writeValue; int len; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi lz77uncompvram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; byteCount = 0; byteShift = 0; writeValue = 0; len = header >> 8; while(len > 0) { u8 d = _MMU_read08(source++); if(d) { for(i1 = 0; i1 < 8; i1++) { if(d & 0x80) { int length; int offset; u32 windowOffset; u16 data = _MMU_read08(source++) << 8; data |= _MMU_read08(source++); length = (data >> 12) + 3; offset = (data & 0x0FFF); windowOffset = dest + byteCount - offset - 1; for(i2 = 0; i2 < length; i2++) { writeValue |= (_MMU_read08(windowOffset++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } } else { writeValue |= (_MMU_read08(source++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } d <<= 1; } } else { for(i1 = 0; i1 < 8; i1++) { writeValue |= (_MMU_read08(source++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteShift = 0; byteCount = 0; writeValue = 0; } len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 LZ77UnCompWram() { int i1, i2; int len; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi lz77uncompwram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; len = header >> 8; while(len > 0) { u8 d = _MMU_read08(source++); if(d) { for(i1 = 0; i1 < 8; i1++) { if(d & 0x80) { int length; int offset; u32 windowOffset; u16 data = _MMU_read08(source++) << 8; data |= _MMU_read08(source++); length = (data >> 12) + 3; offset = (data & 0x0FFF); windowOffset = dest - offset - 1; for(i2 = 0; i2 < length; i2++) { _MMU_write08(dest++, _MMU_read08(windowOffset++)); len--; if(len == 0) return 0; } } else { _MMU_write08(dest++, _MMU_read08(source++)); len--; if(len == 0) return 0; } d <<= 1; } } else { for(i1 = 0; i1 < 8; i1++) { _MMU_write08(dest++, _MMU_read08(source++)); len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 RLUnCompVram() { int i; int len; int byteCount; int byteShift; u32 writeValue; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi rluncompvram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; len = header >> 8; byteCount = 0; byteShift = 0; writeValue = 0; while(len > 0) { u8 d = _MMU_read08(source++); int l = d & 0x7F; if(d & 0x80) { u8 data = _MMU_read08(source++); l += 3; for(i = 0;i < l; i++) { writeValue |= (data << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } } else { l++; for(i = 0; i < l; i++) { writeValue |= (_MMU_read08(source++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 RLUnCompWram() { //this routine is used by yoshi touch&go from the very beginning //printf("RLUnCompWram\n"); int i; int len; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi rluncompwram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; len = header >> 8; while(len > 0) { u8 d = _MMU_read08(source++); int l = d & 0x7F; if(d & 0x80) { u8 data = _MMU_read08(source++); l += 3; for(i = 0;i < l; i++) { _MMU_write08(dest++, data); len--; if(len == 0) return 0; } } else { l++; for(i = 0; i < l; i++) { _MMU_write08(dest++, _MMU_read08(source++)); len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 UnCompHuffman() { //this routine is used by the nintendo logo in the firmware boot screen u32 source, dest, writeValue, header, treeStart, mask; u32 data; u8 treeSize, currentNode, rootNode; int byteCount, byteShift, len, pos; int writeData; source = cpu->R[0]; dest = cpu->R[1]; header = _MMU_read32(source); source += 4; //INFO("swi uncomphuffman\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; treeSize = _MMU_read08(source++); treeStart = source; source += ((treeSize+1)<<1)-1; // minus because we already skipped one byte len = header >> 8; mask = 0x80000000; data = _MMU_read32(source); source += 4; pos = 0; rootNode = _MMU_read08(treeStart); currentNode = rootNode; writeData = 0; byteShift = 0; byteCount = 0; writeValue = 0; if((header & 0x0F) == 8) { while(len > 0) { // take left if(pos == 0) pos++; else pos += (((currentNode & 0x3F)+1)<<1); if(data & mask) { // right if(currentNode & 0x40) writeData = 1; currentNode = _MMU_read08(treeStart+pos+1); } else { // left if(currentNode & 0x80) writeData = 1; currentNode = _MMU_read08(treeStart+pos); } if(writeData) { writeValue |= (currentNode << byteShift); byteCount++; byteShift += 8; pos = 0; currentNode = rootNode; writeData = 0; if(byteCount == 4) { byteCount = 0; byteShift = 0; _MMU_write32(dest, writeValue); writeValue = 0; dest += 4; len -= 4; } } mask >>= 1; if(mask == 0) { mask = 0x80000000; data = _MMU_read32(source); source += 4; } } } else { int halfLen = 0; int value = 0; while(len > 0) { // take left if(pos == 0) pos++; else pos += (((currentNode & 0x3F)+1)<<1); if((data & mask)) { // right if(currentNode & 0x40) writeData = 1; currentNode = _MMU_read08(treeStart+pos+1); } else { // left if(currentNode & 0x80) writeData = 1; currentNode = _MMU_read08(treeStart+pos); } if(writeData) { if(halfLen == 0) value |= currentNode; else value |= (currentNode<<4); halfLen += 4; if(halfLen == 8) { writeValue |= (value << byteShift); byteCount++; byteShift += 8; halfLen = 0; value = 0; if(byteCount == 4) { byteCount = 0; byteShift = 0; _MMU_write32(dest, writeValue); dest += 4; writeValue = 0; len -= 4; } } pos = 0; currentNode = rootNode; writeData = 0; } mask >>= 1; if(mask == 0) { mask = 0x80000000; data = _MMU_read32(source); source += 4; } } } return 1; } TEMPLATE static u32 BitUnPack() { u32 source,dest,header,base,temp; int len,bits,revbits,dataSize,data,bitwritecount,mask,bitcount,addBase; u8 b; source = cpu->R[0]; dest = cpu->R[1]; header = cpu->R[2]; len = _MMU_read16(header); bits = _MMU_read08(header+2); switch (bits) { case 1: case 2: case 4: case 8: break; default: return (0); // error } dataSize = _MMU_read08(header+3); switch (dataSize) { case 1: case 2: case 4: case 8: case 16: case 32: break; default: return (0); // error } revbits = 8 - bits; base = _MMU_read32(header+4); addBase = (base & 0x80000000) ? 1 : 0; base &= 0x7fffffff; //INFO("SWI10: bitunpack src 0x%08X dst 0x%08X hdr 0x%08X (src len %05i src bits %02i dst bits %02i)\n\n", source, dest, header, len, bits, dataSize); data = 0; bitwritecount = 0; while(1) { len -= 1; if(len < 0) break; mask = 0xff >> revbits; b = _MMU_read08(source); source++; bitcount = 0; while(1) { if(bitcount >= 8) break; temp = b & mask; if(temp) temp += base; else if(addBase) temp += base; //you might think you should do this. but you would be wrong! //this is meant for palette adjusting things, i.e. 16col data to 256col data in colors 240..255. In that case theres no modulo normally. //Users expecting modulo have done something wrong anyway. //temp &= (1<= 32) { _MMU_write32(dest, data); dest += 4; data = 0; bitwritecount = 0; } bitcount += bits; b >>= bits; } } return 1; } TEMPLATE static u32 Diff8bitUnFilterWram() //this one might be different on arm7 and needs checking { //INFO("swi Diff8bitUnFilterWram\n"); u32 source = cpu->R[0]; u32 dest = cpu->R[1]; CompressionHeader header(_MMU_read32(source)); source += 4; if(header.DataSize() != 1) printf("WARNING: incorrect header passed to Diff8bitUnFilterWram\n"); if(header.Type() != 8) printf("WARNING: incorrect header passed to Diff8bitUnFilterWram\n"); u32 len = header.DecompressedSize(); u8 data = _MMU_read08(source++); _MMU_write08(dest++, data); len--; while(len > 0) { u8 diff = _MMU_read08(source++); data += diff; _MMU_write08(dest++, data); len--; } return 1; } TEMPLATE static u32 Diff16bitUnFilter() { //INFO("swi Diff16bitUnFilter\n"); u32 source = cpu->R[0]; u32 dest = cpu->R[1]; CompressionHeader header(_MMU_read32(source)); source += 4; if(header.DataSize() != 2) printf("WARNING: incorrect header passed to Diff16bitUnFilter\n"); if(header.Type() != 8) printf("WARNING: incorrect header passed to Diff16bitUnFilter\n"); u32 len = header.DecompressedSize(); u16 data = _MMU_read16(source); source += 2; _MMU_write16(dest, data); dest += 2; len -= 2; while(len >= 2) { u16 diff = _MMU_read16(source); source += 2; data += diff; _MMU_write16(dest, data); dest += 2; len -= 2; } return 1; } TEMPLATE static u32 bios_sqrt() { cpu->R[0] = (u32)sqrt((double)(cpu->R[0])); return 1; } //ARM9 only TEMPLATE static u32 CustomPost() { //just write provided value to REG_POSTFLG _MMU_write08(REG_POSTFLG, cpu->R[0]); return 1; } //ARM7 only TEMPLATE static u32 getSineTab() { //ds returns garbage according to gbatek, but we must protect ourselves if(cpu->R[0] >= ARRAY_SIZE(getsinetbl)) { printf("Invalid SWI getSineTab: %08X\n",cpu->R[0]); return 1; } cpu->R[0] = getsinetbl[cpu->R[0]]; return 1; } //ARM7 only TEMPLATE static u32 getPitchTab() { //ds returns garbage according to gbatek, but we must protect ourselves if(cpu->R[0] >= ARRAY_SIZE(getpitchtbl)) { printf("Invalid SWI getPitchTab: %08X\n",cpu->R[0]); return 1; } cpu->R[0] = getpitchtbl[cpu->R[0]]; return 1; } //ARM7 only TEMPLATE static u32 getVolumeTab() { //ds returns garbage according to gbatek, but we must protect ourselves if(cpu->R[0] >= ARRAY_SIZE(getvoltbl)) { printf("Invalid SWI getVolumeTab: %08X\n",cpu->R[0]); return 1; } cpu->R[0] = getvoltbl[cpu->R[0]]; return 1; } TEMPLATE static u32 getCRC16_old_and_broken(u32 crc, u32 datap, u32 size) { unsigned int i,j; const u16 val[] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 }; for(i = 0; i < size; i++) { crc = crc ^ _MMU_read08(datap + i); for(j = 0; j < 8; j++) { int do_bit = 0; if ( crc & 0x1) do_bit = 1; crc = crc >> 1; if ( do_bit) { crc = crc ^ (val[j] << (7-j)); } } } return crc; } TEMPLATE static u32 getCRC16() { //dawn of sorrow uses this to checksum its save data; //if this implementation is wrong, then it won't match what the real bios returns, //and savefiles created with a bios will be invalid when loaded with non-bios (and vice-versa). //Once upon a time, desmume was doing this wrongly; this was due to its mis-use of high bits of the input CRC. //Additionally, that implementation was not handling odd sizes and addresses correctly (but this was discovered independently) //We have confirmed that the crc16 works the same on the arm9 and arm7. //The following call is left here so we can A/B test with the old version. Glad I left it, because we keep coming back to this code. //u32 old = getCRC16_old_and_broken(cpu->R[0],cpu->R[1],cpu->R[2]); u16 crc = (u16)cpu->R[0]; u32 datap = cpu->R[1]; u32 size = cpu->R[2]>>1; u16 currVal = 0; const u16 val[] = { 0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400}; for(u32 i = 0; i < size; i++) { currVal = _MMU_read16(datap + i*2); for(int j=0;j<4;j++) { u16 tabVal = val[crc&0xF]; crc >>= 4; crc ^= tabVal; u16 tempVal = currVal >> (4*j); tabVal = val[tempVal&0xF]; crc ^= tabVal; } } cpu->R[0] = crc; //R3 contains the last processed halfword //this is significant -- why? Can we get a test case? Supposedly there is one.. cpu->R[3] = currVal; return 1; } TEMPLATE static u32 isDebugger() { //gbatek has additional specifications which are not emulated here if(nds.Is_DebugConsole()) cpu->R[0] = 1; else cpu->R[0] = 0; return 1; } //ARM7 only TEMPLATE static u32 SoundBias() { u32 curBias = _MMU_read32(0x04000504); u32 newBias = (curBias == 0) ? 0x000:0x200; u32 delay = (newBias > curBias) ? (newBias-curBias) : (curBias-newBias); _MMU_write32(0x04000504, newBias); return cpu->R[1] * delay; } //ARM7 only TEMPLATE static u32 getBootProcs() { cpu->R[0] = 0x00000A2E; cpu->R[1] = 0x00002C3C; cpu->R[3] = 0x000005FF; return 1; } TEMPLATE static u32 SoftReset() { //not emulated yet return 1; } u32 (* ARM_swi_tab[2][32])()={ { SoftReset, // 0x00 bios_nop, // 0x01 bios_nop, // 0x02 WaitByLoop, // 0x03 intrWaitARM, // 0x04 waitVBlankARM, // 0x05 wait4IRQ, // 0x06 bios_nop, // 0x07 bios_nop, // 0x08 divide, // 0x09 bios_nop, // 0x0A copy, // 0x0B fastCopy, // 0x0C bios_sqrt, // 0x0D getCRC16, // 0x0E isDebugger, // 0x0F BitUnPack, // 0x10 LZ77UnCompWram, // 0x11 LZ77UnCompVram, // 0x12 UnCompHuffman, // 0x13 RLUnCompWram, // 0x14 RLUnCompVram, // 0x15 Diff8bitUnFilterWram, // 0x16 bios_nop, // 0x17 Diff16bitUnFilter, // 0x18 bios_nop, // 0x19 bios_nop, // 0x1A bios_nop, // 0x1B bios_nop, // 0x1C bios_nop, // 0x1D bios_nop, // 0x1E CustomPost, // 0x1F }, { SoftReset, // 0x00 bios_nop, // 0x01 bios_nop, // 0x02 WaitByLoop, // 0x03 intrWaitARM, // 0x04 waitVBlankARM, // 0x05 wait4IRQ, // 0x06 sleep, // 0x07 SoundBias, // 0x08 divide, // 0x09 bios_nop, // 0x0A copy, // 0x0B fastCopy, // 0x0C bios_sqrt, // 0x0D getCRC16, // 0x0E isDebugger, // 0x0F BitUnPack, // 0x10 LZ77UnCompWram, // 0x11 LZ77UnCompVram, // 0x12 UnCompHuffman, // 0x13 RLUnCompWram, // 0x14 RLUnCompVram, // 0x15 bios_nop, // 0x16 bios_nop, // 0x17 bios_nop, // 0x18 bios_nop, // 0x19 getSineTab, // 0x1A getPitchTab, // 0x1B getVolumeTab, // 0x1C getBootProcs, // 0x1D bios_nop, // 0x1E CustomHalt, // 0x1F } }; #define BIOS_NOP "bios_nop" const char* ARM_swi_names[2][32] = { { "SoftReset", // 0x00 BIOS_NOP, // 0x01 BIOS_NOP, // 0x02 "WaitByLoop", // 0x03 "IntrWait", // 0x04 "VBlankIntrWait", // 0x05 "Halt", // 0x06 BIOS_NOP, // 0x07 BIOS_NOP, // 0x08 "Div", // 0x09 BIOS_NOP, // 0x0A "CpuSet", // 0x0B "CpuFastSet", // 0x0C "Sqrt", // 0x0D "GetCRC16", // 0x0E "IsDebugger", // 0x0F "BitUnPack", // 0x10 "LZ77UnCompWram", // 0x11 "LZ77UnCompVram", // 0x12 "HuffUnComp", // 0x13 "RLUnCompWram", // 0x14 "RLUnCompVram", // 0x15 "Diff8bitUnFilterWram", // 0x16 BIOS_NOP, // 0x17 "Diff16bitUnFilter", // 0x18 BIOS_NOP, // 0x19 BIOS_NOP, // 0x1A BIOS_NOP, // 0x1B BIOS_NOP, // 0x1C BIOS_NOP, // 0x1D BIOS_NOP, // 0x1E "CustomPost", // 0x1F }, { "SoftReset", // 0x00 BIOS_NOP, // 0x01 BIOS_NOP, // 0x02 "WaitByLoop", // 0x03 "IntrWait", // 0x04 "VBlankIntrWait", // 0x05 "Halt", // 0x06 "Sleep", // 0x07 "SoundBias", // 0x08 "Div", // 0x09 BIOS_NOP, // 0x0A "CpuSet", // 0x0B "CpuFastSet", // 0x0C "Sqrt", // 0x0D "GetCRC16", // 0x0E "IsDebugger", // 0x0F "BitUnPack", // 0x10 "LZ77UnCompWram", // 0x11 "LZ77UnCompVram", // 0x12 "HuffUnComp", // 0x13 "RLUnCompWram", // 0x14 "RLUnCompVram", // 0x15 BIOS_NOP, // 0x16 BIOS_NOP, // 0x17 BIOS_NOP, // 0x18 BIOS_NOP, // 0x19 "GetSineTable", // 0x1A "GetPitchTable", // 0x1B "GetVolumeTable", // 0x1C "GetBootProcs", // 0x1D BIOS_NOP, // 0x1E "CustomHalt", // 0x1F } }; #undef BIOS_NOP desmume-0.9.11/src/desmume_config.cpp0000755000000000000000000001015512467662066016242 0ustar rootroot/* Copyright (C) 2009-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include "ctrlssdl.h" #include "desmume_config.h" static const gchar *desmume_old_config_file = ".desmume.ini"; static const gchar *desmume_config_dir = "desmume"; static const gchar *desmume_config_file = "config"; GKeyFile *desmume_config_read_file(const u16 *kb_cfg) { gchar *config_file, *config_dir, *old_config_file; GKeyFile *keyfile; GError *error = NULL; gboolean ret; old_config_file = g_build_filename(g_get_home_dir(), desmume_old_config_file, NULL); config_file = g_build_filename(g_get_user_config_dir(), desmume_config_dir, desmume_config_file, NULL); config_dir = g_build_filename(g_get_user_config_dir(), desmume_config_dir, NULL); g_mkdir_with_parents(config_dir, 0755); if (!g_file_test(config_file, G_FILE_TEST_IS_REGULAR) && g_file_test(old_config_file, G_FILE_TEST_IS_REGULAR)) { ret = g_rename(old_config_file, config_file); if (ret) { g_printerr("Failed to move old config file %s to new location %s \n", old_config_file, config_file); } } keyfile = g_key_file_new(); ret = g_key_file_load_from_file(keyfile, config_file, G_KEY_FILE_NONE, &error); if (!ret) { g_error_free(error); } g_free(config_file); g_free(config_dir); g_free(old_config_file); load_default_config(kb_cfg); desmume_config_read_keys(keyfile); desmume_config_read_joykeys(keyfile); return keyfile; } void desmume_config_dispose(GKeyFile *keyfile) { g_key_file_free(keyfile); } static gboolean desmume_config_write_file(GKeyFile *keyfile) { gchar *config_file; gchar *config_dir; gchar *data; GError *error = NULL; gsize length; gboolean ret = TRUE; config_dir = g_build_filename(g_get_user_config_dir(), desmume_config_dir, NULL); g_mkdir_with_parents(config_dir, 0755); config_file = g_build_filename(g_get_user_config_dir(), desmume_config_dir, desmume_config_file, NULL); data = g_key_file_to_data(keyfile, &length, NULL); ret = g_file_set_contents(config_file, data, length, &error); if (!ret) { g_error_free(error); } g_free(config_file); g_free(config_dir); g_free(data); return ret; } gboolean desmume_config_update_keys(GKeyFile *keyfile) { for(int i = 0; i < NB_KEYS; i++) { g_key_file_set_integer(keyfile, "KEYS", key_names[i], keyboard_cfg[i]); } return desmume_config_write_file(keyfile); } gboolean desmume_config_update_joykeys(GKeyFile *keyfile) { for(int i = 0; i < NB_KEYS; i++) { g_key_file_set_integer(keyfile, "JOYKEYS", key_names[i], joypad_cfg[i]); } return desmume_config_write_file(keyfile); } gboolean desmume_config_read_keys(GKeyFile *keyfile) { GError *error = NULL; if (!g_key_file_has_group(keyfile, "KEYS")) return TRUE; for (int i = 0; i < NB_KEYS; i++) { keyboard_cfg[i] = g_key_file_get_integer(keyfile, "KEYS", key_names[i], &error); if (error != NULL) { g_error_free(error); return FALSE; } } return TRUE; } gboolean desmume_config_read_joykeys(GKeyFile *keyfile) { GError *error = NULL; if (!g_key_file_has_group(keyfile, "JOYKEYS")) return TRUE; for (int i = 0; i < NB_KEYS; i++) { joypad_cfg[i] = g_key_file_get_integer(keyfile, "JOYKEYS", key_names[i], &error); if (error != NULL) { g_error_free(error); return FALSE; } } return TRUE; } desmume-0.9.11/src/armcpu.cpp0000755000000000000000000005077712467662066014563 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include #include "armcpu.h" #include "common.h" #include "instructions.h" #include "cp15.h" #include "bios.h" #include "debug.h" #include "Disassembler.h" #include "NDSSystem.h" #include "MMU_timing.h" #ifdef HAVE_LUA #include "lua-engine.h" #endif #ifdef HAVE_JIT #include "arm_jit.h" #endif template static u32 armcpu_prefetch(); FORCEINLINE u32 armcpu_prefetch(armcpu_t *armcpu) { if(armcpu->proc_ID==0) return armcpu_prefetch<0>(); else return armcpu_prefetch<1>(); } armcpu_t NDS_ARM7; armcpu_t NDS_ARM9; #define SWAP(a, b, c) do \ { \ c=a; \ a=b; \ b=c; \ } \ while(0) #define STALLED_CYCLE_COUNT 10 static void stall_cpu( void *instance) { armcpu_t *armcpu = (armcpu_t *)instance; printf("STALL\n"); armcpu->stalled = 1; } static void unstall_cpu( void *instance) { armcpu_t *armcpu = (armcpu_t *)instance; printf("UNSTALL\n"); armcpu->stalled = 0; } static void install_post_exec_fn( void *instance, void (*ex_fn)( void *, u32 adr, int thumb), void *fn_data) { armcpu_t *armcpu = (armcpu_t *)instance; armcpu->post_ex_fn = ex_fn; armcpu->post_ex_fn_data = fn_data; } static void remove_post_exec_fn( void *instance) { armcpu_t *armcpu = (armcpu_t *)instance; armcpu->post_ex_fn = NULL; } static u32 read_cpu_reg( void *instance, u32 reg_num) { armcpu_t *armcpu = (armcpu_t *)instance; if ( reg_num <= 14) { return armcpu->R[reg_num]; } else if ( reg_num == 15) { return armcpu->instruct_adr; } else if ( reg_num == 16) { //CPSR return armcpu->CPSR.val; } return 0; } static void set_cpu_reg( void *instance, u32 reg_num, u32 value) { armcpu_t *armcpu = (armcpu_t *)instance; if ( reg_num <= 14) { armcpu->R[reg_num] = value; } else if ( reg_num == 15) { armcpu->next_instruction = value; } else if ( reg_num == 16) { /* FIXME: setting the CPSR */ } } int armcpu_new( armcpu_t *armcpu, u32 id) { armcpu->proc_ID = id; armcpu->stalled = 0; armcpu->base_mem_if.prefetch32 = NULL; armcpu->base_mem_if.prefetch16 = NULL; armcpu->base_mem_if.read8 = NULL; armcpu->base_mem_if.read16 = NULL; armcpu->base_mem_if.read32 = NULL; armcpu->base_mem_if.write8 = NULL; armcpu->base_mem_if.write16 = NULL; armcpu->base_mem_if.write32 = NULL; armcpu->base_mem_if.data = NULL; armcpu->SetControlInterface(&arm_default_ctrl_iface); armcpu->SetControlInterfaceData(armcpu); armcpu->SetCurrentMemoryInterface(NULL); armcpu->SetCurrentMemoryInterfaceData(NULL); armcpu->post_ex_fn = NULL; armcpu->post_ex_fn_data = NULL; armcpu_init(armcpu, 0); return 0; } void armcpu_t::SetControlInterface(const armcpu_ctrl_iface *theControlInterface) { this->ctrl_iface = *theControlInterface; } armcpu_ctrl_iface* armcpu_t::GetControlInterface() { return &this->ctrl_iface; } void armcpu_t::SetControlInterfaceData(void *theData) { this->ctrl_iface.data = theData; } void* armcpu_t::GetControlInterfaceData() { return this->ctrl_iface.data; } void armcpu_t::SetCurrentMemoryInterface(armcpu_memory_iface *theMemoryInterface) { this->mem_if = theMemoryInterface; } armcpu_memory_iface* armcpu_t::GetCurrentMemoryInterface() { return this->mem_if; } void armcpu_t::SetCurrentMemoryInterfaceData(void *theData) { if (this->mem_if != NULL) { this->mem_if->data = theData; } } void* armcpu_t::GetCurrentMemoryInterfaceData() { return (this->mem_if != NULL) ? this->mem_if->data : NULL; } void armcpu_t::SetBaseMemoryInterface(const armcpu_memory_iface *theMemInterface) { this->base_mem_if = *theMemInterface; } armcpu_memory_iface* armcpu_t::GetBaseMemoryInterface() { return &this->base_mem_if; } void armcpu_t::SetBaseMemoryInterfaceData(void *theData) { this->base_mem_if.data = theData; } void* armcpu_t::GetBaseMemoryInterfaceData() { return this->base_mem_if.data; } void armcpu_t::ResetMemoryInterfaceToBase() { this->SetCurrentMemoryInterface(this->GetBaseMemoryInterface()); this->SetCurrentMemoryInterfaceData(this->GetBaseMemoryInterfaceData()); } //call this whenever CPSR is changed (other than CNVZQ or T flags); interrupts may need to be unleashed void armcpu_t::changeCPSR() { //but all it does is give them a chance to unleash by forcing an immediate reschedule //TODO - we could actually set CPSR through here and look for a change in the I bit //that would be a little optimization as well as a safety measure if we prevented setting CPSR directly NDS_Reschedule(); } void armcpu_init(armcpu_t *armcpu, u32 adr) { #if defined(_M_X64) || defined(__x86_64__) memcpy(&armcpu->cond_table[0], &arm_cond_table[0], sizeof(arm_cond_table)); #endif armcpu->LDTBit = (armcpu->proc_ID==0); //set ARMv5 style bit--different for each processor armcpu->intVector = 0xFFFF0000 * (armcpu->proc_ID==0); armcpu->waitIRQ = FALSE; armcpu->halt_IE_and_IF = FALSE; armcpu->intrWaitARM_state = 0; //#ifdef GDB_STUB // armcpu->irq_flag = 0; //#endif for(int i = 0; i < 16; ++i) armcpu->R[i] = 0; armcpu->CPSR.val = armcpu->SPSR.val = SYS; armcpu->R13_usr = armcpu->R14_usr = 0; armcpu->R13_svc = armcpu->R14_svc = 0; armcpu->R13_abt = armcpu->R14_abt = 0; armcpu->R13_und = armcpu->R14_und = 0; armcpu->R13_irq = armcpu->R14_irq = 0; armcpu->R8_fiq = armcpu->R9_fiq = armcpu->R10_fiq = armcpu->R11_fiq = armcpu->R12_fiq = armcpu->R13_fiq = armcpu->R14_fiq = 0; armcpu->SPSR_svc.val = armcpu->SPSR_abt.val = armcpu->SPSR_und.val = armcpu->SPSR_irq.val = armcpu->SPSR_fiq.val = 0; //#ifdef GDB_STUB // armcpu->instruct_adr = adr; // armcpu->R[15] = adr + 8; //#else //armcpu->R[15] = adr; //#endif //do something sensible when booting up to a thumb address armcpu->next_instruction = adr & ~1; armcpu->CPSR.bits.T = BIT0(adr); //#ifndef GDB_STUB armcpu_prefetch(armcpu); //#endif } u32 armcpu_switchMode(armcpu_t *armcpu, u8 mode) { u32 oldmode = armcpu->CPSR.bits.mode; switch(oldmode) { case USR : case SYS : armcpu->R13_usr = armcpu->R[13]; armcpu->R14_usr = armcpu->R[14]; break; case FIQ : { u32 tmp; SWAP(armcpu->R[8], armcpu->R8_fiq, tmp); SWAP(armcpu->R[9], armcpu->R9_fiq, tmp); SWAP(armcpu->R[10], armcpu->R10_fiq, tmp); SWAP(armcpu->R[11], armcpu->R11_fiq, tmp); SWAP(armcpu->R[12], armcpu->R12_fiq, tmp); armcpu->R13_fiq = armcpu->R[13]; armcpu->R14_fiq = armcpu->R[14]; armcpu->SPSR_fiq = armcpu->SPSR; break; } case IRQ : armcpu->R13_irq = armcpu->R[13]; armcpu->R14_irq = armcpu->R[14]; armcpu->SPSR_irq = armcpu->SPSR; break; case SVC : armcpu->R13_svc = armcpu->R[13]; armcpu->R14_svc = armcpu->R[14]; armcpu->SPSR_svc = armcpu->SPSR; break; case ABT : armcpu->R13_abt = armcpu->R[13]; armcpu->R14_abt = armcpu->R[14]; armcpu->SPSR_abt = armcpu->SPSR; break; case UND : armcpu->R13_und = armcpu->R[13]; armcpu->R14_und = armcpu->R[14]; armcpu->SPSR_und = armcpu->SPSR; break; default : break; } switch(mode) { case USR : case SYS : armcpu->R[13] = armcpu->R13_usr; armcpu->R[14] = armcpu->R14_usr; //SPSR = CPSR; break; case FIQ : { u32 tmp; SWAP(armcpu->R[8], armcpu->R8_fiq, tmp); SWAP(armcpu->R[9], armcpu->R9_fiq, tmp); SWAP(armcpu->R[10], armcpu->R10_fiq, tmp); SWAP(armcpu->R[11], armcpu->R11_fiq, tmp); SWAP(armcpu->R[12], armcpu->R12_fiq, tmp); armcpu->R[13] = armcpu->R13_fiq; armcpu->R[14] = armcpu->R14_fiq; armcpu->SPSR = armcpu->SPSR_fiq; break; } case IRQ : armcpu->R[13] = armcpu->R13_irq; armcpu->R[14] = armcpu->R14_irq; armcpu->SPSR = armcpu->SPSR_irq; break; case SVC : armcpu->R[13] = armcpu->R13_svc; armcpu->R[14] = armcpu->R14_svc; armcpu->SPSR = armcpu->SPSR_svc; break; case ABT : armcpu->R[13] = armcpu->R13_abt; armcpu->R[14] = armcpu->R14_abt; armcpu->SPSR = armcpu->SPSR_abt; break; case UND : armcpu->R[13] = armcpu->R13_und; armcpu->R[14] = armcpu->R14_und; armcpu->SPSR = armcpu->SPSR_und; break; default : printf("switchMode: WRONG mode %02X\n",mode); break; } armcpu->CPSR.bits.mode = mode & 0x1F; armcpu->changeCPSR(); return oldmode; } u32 armcpu_Wait4IRQ(armcpu_t *cpu) { cpu->waitIRQ = TRUE; cpu->halt_IE_and_IF = TRUE; return 1; } template FORCEINLINE static u32 armcpu_prefetch() { armcpu_t* const armcpu = &ARMPROC; //#ifdef GDB_STUB // u32 temp_instruction; //#endif u32 curInstruction = armcpu->next_instruction; if(armcpu->CPSR.bits.T == 0) { //#ifdef GDB_STUB // temp_instruction = // armcpu->mem_if->prefetch32( armcpu->mem_if->data, // armcpu->next_instruction); // // if ( !armcpu->stalled) { // armcpu->instruction = temp_instruction; // armcpu->instruct_adr = armcpu->next_instruction; // armcpu->next_instruction += 4; // armcpu->R[15] = armcpu->next_instruction + 4; // } //#else curInstruction &= 0xFFFFFFFC; //please don't change this to 0x0FFFFFFC -- the NDS will happily run on 0xF******* addresses all day long //please note that we must setup R[15] before reading the instruction since there is a protection //which prevents PC > 0x3FFF from reading the bios region armcpu->instruct_adr = curInstruction; armcpu->next_instruction = curInstruction + 4; armcpu->R[15] = curInstruction + 8; armcpu->instruction = _MMU_read32(curInstruction); //#endif return MMU_codeFetchCycles(curInstruction); } //#ifdef GDB_STUB // temp_instruction = // armcpu->mem_if->prefetch16( armcpu->mem_if->data, // armcpu->next_instruction); // // if ( !armcpu->stalled) { // armcpu->instruction = temp_instruction; // armcpu->instruct_adr = armcpu->next_instruction; // armcpu->next_instruction = armcpu->next_instruction + 2; // armcpu->R[15] = armcpu->next_instruction + 2; // } //#else curInstruction &= 0xFFFFFFFE; //please don't change this to 0x0FFFFFFE -- the NDS will happily run on 0xF******* addresses all day long //please note that we must setup R[15] before reading the instruction since there is a protection //which prevents PC > 0x3FFF from reading the bios region armcpu->instruct_adr = curInstruction; armcpu->next_instruction = curInstruction + 2; armcpu->R[15] = curInstruction + 4; armcpu->instruction = _MMU_read16(curInstruction); //#endif if(PROCNUM==0) { // arm9 fetches 2 instructions at a time in thumb mode if(!(curInstruction == armcpu->instruct_adr + 2 && (curInstruction & 2))) return MMU_codeFetchCycles(curInstruction); else return 0; } return MMU_codeFetchCycles(curInstruction); } #if 0 /* not used */ static BOOL FASTCALL test_EQ(Status_Reg CPSR) { return ( CPSR.bits.Z); } static BOOL FASTCALL test_NE(Status_Reg CPSR) { return (!CPSR.bits.Z); } static BOOL FASTCALL test_CS(Status_Reg CPSR) { return ( CPSR.bits.C); } static BOOL FASTCALL test_CC(Status_Reg CPSR) { return (!CPSR.bits.C); } static BOOL FASTCALL test_MI(Status_Reg CPSR) { return ( CPSR.bits.N); } static BOOL FASTCALL test_PL(Status_Reg CPSR) { return (!CPSR.bits.N); } static BOOL FASTCALL test_VS(Status_Reg CPSR) { return ( CPSR.bits.V); } static BOOL FASTCALL test_VC(Status_Reg CPSR) { return (!CPSR.bits.V); } static BOOL FASTCALL test_HI(Status_Reg CPSR) { return (CPSR.bits.C) && (!CPSR.bits.Z); } static BOOL FASTCALL test_LS(Status_Reg CPSR) { return (CPSR.bits.Z) || (!CPSR.bits.C); } static BOOL FASTCALL test_GE(Status_Reg CPSR) { return (CPSR.bits.N==CPSR.bits.V); } static BOOL FASTCALL test_LT(Status_Reg CPSR) { return (CPSR.bits.N!=CPSR.bits.V); } static BOOL FASTCALL test_GT(Status_Reg CPSR) { return (!CPSR.bits.Z) && (CPSR.bits.N==CPSR.bits.V); } static BOOL FASTCALL test_LE(Status_Reg CPSR) { return ( CPSR.bits.Z) || (CPSR.bits.N!=CPSR.bits.V); } static BOOL FASTCALL test_AL(Status_Reg CPSR) { return 1; } static BOOL (FASTCALL* test_conditions[])(Status_Reg CPSR)= { test_EQ , test_NE , test_CS , test_CC , test_MI , test_PL , test_VS , test_VC , test_HI , test_LS , test_GE , test_LT , test_GT , test_LE , test_AL }; #define TEST_COND2(cond, CPSR) \ (cond<15&&test_conditions[cond](CPSR)) #endif //TODO - merge with armcpu_irqException? //http://www.ethernut.de/en/documents/arm-exceptions.html //http://docs.google.com/viewer?a=v&q=cache:V4ht1YkxprMJ:www.cs.nctu.edu.tw/~wjtsai/EmbeddedSystemDesign/Ch3-1.pdf+arm+exception+handling&hl=en&gl=us&pid=bl&srcid=ADGEEShx9VTHbUhWdDOrTVRzLkcCsVfJiijncNDkkgkrlJkLa7D0LCpO8fQ_hhU3DTcgZh9rcZWWQq4TYhhCovJ625h41M0ZUX3WGasyzWQFxYzDCB-VS6bsUmpoJnRxAc-bdkD0qmsu&sig=AHIEtbR9VHvDOCRmZFQDUVwy53iJDjoSPQ void armcpu_exception(armcpu_t *cpu, u32 number) { Mode cpumode = USR; switch(number) { case EXCEPTION_RESET: cpumode = SVC; break; case EXCEPTION_UNDEFINED_INSTRUCTION: cpumode = UND; break; case EXCEPTION_SWI: cpumode = SVC; break; case EXCEPTION_PREFETCH_ABORT: cpumode = ABT; break; case EXCEPTION_DATA_ABORT: cpumode = ABT; break; case EXCEPTION_RESERVED_0x14: emu_halt(); break; case EXCEPTION_IRQ: cpumode = IRQ; break; case EXCEPTION_FAST_IRQ: cpumode = FIQ; break; } Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, cpumode); //enter new mode cpu->R[14] = cpu->next_instruction; cpu->SPSR = tmp; //save old CPSR as new SPSR cpu->CPSR.bits.T = 0; //handle as ARM32 code cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + number; cpu->next_instruction = cpu->R[15]; printf("armcpu_exception!\n"); //extern bool dolog; //dolog=true; //HOW DOES THIS WORTK WITHOUT A PREFETCH, LIKE IRQ BELOW? //I REALLY WISH WE DIDNT PREFETCH BEFORE EXECUTING } BOOL armcpu_irqException(armcpu_t *armcpu) { Status_Reg tmp; //TODO - remove GDB specific code //#ifdef GDB_STUB // armcpu->irq_flag = 0; //#endif tmp = armcpu->CPSR; armcpu_switchMode(armcpu, IRQ); //TODO - remove GDB specific code //#ifdef GDB_STUB // armcpu->R[14] = armcpu->next_instruction + 4; //#else armcpu->R[14] = armcpu->instruct_adr + 4; //#endif armcpu->SPSR = tmp; armcpu->CPSR.bits.T = 0; armcpu->CPSR.bits.I = 1; armcpu->next_instruction = armcpu->intVector + 0x18; armcpu->waitIRQ = 0; //must retain invariant of having next instruction to be executed prefetched //(yucky) armcpu_prefetch(armcpu); return TRUE; } //TODO - remove GDB specific code //BOOL //armcpu_flagIrq( armcpu_t *armcpu) { // if(armcpu->CPSR.bits.I) return FALSE; // // armcpu->waitIRQ = 0; // //#ifdef GDB_STUB // armcpu->irq_flag = 1; //#endif // // return TRUE; //} u32 TRAPUNDEF(armcpu_t* cpu) { INFO("ARM%c: Undefined instruction: 0x%08X (%s) PC=0x%08X\n", cpu->proc_ID?'7':'9', cpu->instruction, decodeIntruction(false, cpu->instruction), cpu->instruct_adr); if (((cpu->intVector != 0) ^ (cpu->proc_ID == ARMCPU_ARM9))) { armcpu_exception(&NDS_ARM9,EXCEPTION_UNDEFINED_INSTRUCTION); return 4; } else { emu_halt(); return 4; } } //BOOL //armcpu_flagIrq( armcpu_t *armcpu) { // if(armcpu->CPSR.bits.I) return FALSE; // // armcpu->waitIRQ = 0; // //#ifdef GDB_STUB // armcpu->irq_flag = 1; //#endif // // return TRUE; //} template u32 armcpu_exec() { // Usually, fetching and executing are processed parallelly. // So this function stores the cycles of each process to // the variables below, and returns appropriate cycle count. u32 cFetch = 0; u32 cExecute = 0; //this assert is annoying. but sometimes it is handy. //assert(ARMPROC.instruct_adr!=0x00000000); //#ifdef DEVELOPER #if 0 if ((((ARMPROC.instruct_adr & 0x0F000000) == 0x0F000000) && (PROCNUM == 0)) || (((ARMPROC.instruct_adr & 0x0F000000) == 0x00000000) && (PROCNUM == 1))) { switch (ARMPROC.instruct_adr & 0xFFFF) { case 0x00000000: printf("BIOS%c: Reset!!!\n", PROCNUM?'7':'9'); emu_halt(); break; case 0x00000004: printf("BIOS%c: Undefined instruction\n", PROCNUM?'7':'9'); //emu_halt(); break; case 0x00000008: //printf("BIOS%c: SWI\n", PROCNUM?'7':'9'); break; case 0x0000000C: printf("BIOS%c: Prefetch Abort!!!\n", PROCNUM?'7':'9'); //emu_halt(); break; case 0x00000010: //printf("BIOS%c: Data Abort!!!\n", PROCNUM?'7':'9'); //emu_halt(); break; case 0x00000014: printf("BIOS%c: Reserved!!!\n", PROCNUM?'7':'9'); break; case 0x00000018: //printf("BIOS%c: IRQ\n", PROCNUM?'7':'9'); break; case 0x0000001C: printf("BIOS%c: Fast IRQ\n", PROCNUM?'7':'9'); break; } } #endif #if 0 //#ifdef GDB_STUB if (ARMPROC.stalled) { return STALLED_CYCLE_COUNT; } /* check for interrupts */ if (ARMPROC.irq_flag) { armcpu_irqException(&ARMPROC); } cFetch = armcpu_prefetch(&ARMPROC); if (ARMPROC.stalled) { return MMU_fetchExecuteCycles(cExecute, cFetch); } #endif //cFetch = armcpu_prefetch(&ARMPROC); //printf("%d: %08X\n",PROCNUM,ARMPROC.instruct_adr); if(ARMPROC.CPSR.bits.T == 0) { if( CONDITION(ARMPROC.instruction) == 0x0E //fast path for unconditional instructions || (TEST_COND(CONDITION(ARMPROC.instruction), CODE(ARMPROC.instruction), ARMPROC.CPSR)) //handles any condition ) { #ifdef HAVE_LUA CallRegisteredLuaMemHook(ARMPROC.instruct_adr, 4, ARMPROC.instruction, LUAMEMHOOK_EXEC); // should report even if condition=false? #endif #ifdef DEVELOPER DEBUG_statistics.instructionHits[PROCNUM].arm[INSTRUCTION_INDEX(ARMPROC.instruction)]++; #endif cExecute = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(ARMPROC.instruction)](ARMPROC.instruction); } else cExecute = 1; // If condition=false: 1S cycle #ifdef GDB_STUB if ( ARMPROC.post_ex_fn != NULL) { /* call the external post execute function */ ARMPROC.post_ex_fn(ARMPROC.post_ex_fn_data, ARMPROC.instruct_adr, 0); } ARMPROC.mem_if->prefetch32( ARMPROC.mem_if->data, ARMPROC.next_instruction); #endif cFetch = armcpu_prefetch(); return MMU_fetchExecuteCycles(cExecute, cFetch); } #ifdef HAVE_LUA CallRegisteredLuaMemHook(ARMPROC.instruct_adr, 2, ARMPROC.instruction, LUAMEMHOOK_EXEC); #endif #ifdef DEVELOPER DEBUG_statistics.instructionHits[PROCNUM].thumb[ARMPROC.instruction>>6]++; #endif cExecute = thumb_instructions_set[PROCNUM][ARMPROC.instruction>>6](ARMPROC.instruction); #ifdef GDB_STUB if ( ARMPROC.post_ex_fn != NULL) { /* call the external post execute function */ ARMPROC.post_ex_fn( ARMPROC.post_ex_fn_data, ARMPROC.instruct_adr, 1); } ARMPROC.mem_if->prefetch32( ARMPROC.mem_if->data, ARMPROC.next_instruction); #endif cFetch = armcpu_prefetch(); return MMU_fetchExecuteCycles(cExecute, cFetch); } //these templates needed to be instantiated manually template u32 armcpu_exec<0>(); template u32 armcpu_exec<1>(); #ifdef HAVE_JIT void arm_jit_sync() { NDS_ARM7.next_instruction = NDS_ARM7.instruct_adr; NDS_ARM9.next_instruction = NDS_ARM9.instruct_adr; armcpu_prefetch<0>(); armcpu_prefetch<1>(); } template u32 armcpu_exec() { if (jit) { ARMPROC.instruct_adr &= ARMPROC.CPSR.bits.T?0xFFFFFFFE:0xFFFFFFFC; ArmOpCompiled f = (ArmOpCompiled)JIT_COMPILED_FUNC(ARMPROC.instruct_adr, PROCNUM); return f ? f() : arm_jit_compile(); } return armcpu_exec(); } template u32 armcpu_exec<0,false>(); template u32 armcpu_exec<0,true>(); template u32 armcpu_exec<1,false>(); template u32 armcpu_exec<1,true>(); #endif void setIF(int PROCNUM, u32 flag) { //don't set generated bits!!! assert(!(flag&0x00200000)); MMU.reg_IF_bits[PROCNUM] |= flag; NDS_Reschedule(); } char* decodeIntruction(bool thumb_mode, u32 instr) { char txt[20] = {0}; u32 tmp = 0; if (thumb_mode == true) { tmp = (instr >> 6); strcpy(txt, intToBin((u16)tmp)+6); } else { tmp = ((instr >> 16) & 0x0FF0) | ((instr >> 4) & 0x0F); strcpy(txt, intToBin((u32)tmp)+20); } return strdup(txt); } const armcpu_ctrl_iface arm_default_ctrl_iface = { stall_cpu, unstall_cpu, read_cpu_reg, set_cpu_reg, install_post_exec_fn, remove_post_exec_fn, NULL }; desmume-0.9.11/src/emufile_types.h0000755000000000000000000000014412467662066015572 0ustar rootroot#ifndef EMUFILE_TYPES_H #define EMUFILE_TYPES_H #include "types.h" #endif //EMUFILE_TYPES_H desmume-0.9.11/src/addons/0000755000000000000000000000000012467663413014012 5ustar rootrootdesmume-0.9.11/src/addons/slot2_guitarGrip.cpp0000755000000000000000000000304312467662066017764 0ustar rootroot/* Copyright (C) 2009 CrazyMax Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot2.h" static u8 guitarKeyStatus; class Slot2_GuitarGrip : public ISlot2Interface { private: public: virtual Slot2Info const* info() { static Slot2InfoSimple info("Guitar Grip", "Guitar Grip for Guitar Hero games", 0x04); return &info; } virtual void connect() { guitarKeyStatus = 0; } virtual u8 readByte(u8 PROCNUM, u32 addr) { if (addr == 0x0A000000) return (~guitarKeyStatus); return (addr & 1)?0xF9:0xFF; } virtual u16 readWord(u8 PROCNUM, u32 addr) { return 0xF9FF; } virtual u32 readLong(u8 PROCNUM, u32 addr) { return 0xF9FFF9FF; } }; ISlot2Interface* construct_Slot2_GuitarGrip() { return new Slot2_GuitarGrip(); } void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue) { guitarKeyStatus = 0 | (green << 6) | (red << 5) | (yellow << 4) | (blue << 3); } desmume-0.9.11/src/addons/slot2_paddle.cpp0000755000000000000000000000762512467662066017112 0ustar rootroot/* Copyright (C) 2011-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ /* this device seems to have a 12bit value (like 20.12 fixed point.. get it?) located at 0x0A000000 clockwise = right = increases. it returns the correct little endian bytes through byte reads. through halfword reads, it returns the LSB twice through full word reads, it returns the LSB four times. after that everything is 0x00. if the slot2 timings are wrong, then this device will return glitchy or 0xFF output. so this emulation code will attempt to validate that. arkanoid was setting REG_EXMEMCNT = 0x082F the rom returns 0xEFFF for all addresses and should be used to detect this device writing any byte to SRAM or writing any halfword/word to rom results in a reset or some kind of recalibrate the resulting value may be 0x000,0x001, or 0xFFF. seems mostly random, though once it is reset, resetting again won't change it. you must wait until the paddle has been moved. conclusion: The emulation in all the handling of erroneous cases is not perfect, and some other users of the paddle (do any other games use it?) maybe legally configure the paddle differently, which could be rejected here; in which case this code will need finetuning */ #include #include "../slot2.h" #include "../NDSSystem.h" class Slot2_Paddle : public ISlot2Interface { private: void calibrate() { nds.paddle = 0; } bool Validate(u32 procnum, bool rom) { if(rom) return ValidateSlot2Access(procnum, 0, 0, 0, -1); else return ValidateSlot2Access(procnum, 18, 0, 0, 1); } public: virtual Slot2Info const* info() { static Slot2InfoSimple info("Paddle Controller", "Taito Paddle Controller", 0x07); return &info; } virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) { if (addr < 0x0A000000) calibrate(); } virtual void writeWord(u8 PROCNUM, u32 addr, u16 val) { if (addr < 0x0A000000) calibrate(); } virtual void writeLong(u8 PROCNUM, u32 addr, u32 val) { if (addr < 0x0A000000) calibrate(); } virtual u8 readByte(u8 PROCNUM, u32 addr) { //printf("paddle: read 08 at 0x%08X\n", addr); if (!Validate(PROCNUM, (addr < 0x0A000000))) return 0xFF; if (addr < 0x0A000000) return (addr & 1)?0xFF:0xEF; if (addr == 0x0A000000) return (nds.paddle & 0xFF); if (addr == 0x0A000001) return ((nds.paddle >> 8) & 0x0F); return 0x00; } virtual u16 readWord(u8 PROCNUM, u32 addr) { //printf("paddle: read 16 at 0x%08X\n", addr); if (!Validate(PROCNUM, (addr < 0x0A000000))) return 0xFFFF; if (addr < 0x0A000000) return 0xEFFF; if (addr == 0x0A000000) { u8 val = (nds.paddle & 0xFF); return (val | (val << 8)); } return 0x0000; } virtual u32 readLong(u8 PROCNUM, u32 addr) { //printf("paddle: read 32 at 0x%08X\n", addr); if (!Validate(PROCNUM, (addr < 0x0A000000))) return 0xFFFFFFFF; if (addr < 0x0A000000) return 0xEFFFEFFF; if (addr == 0x0A000000) { u8 val = (nds.paddle & 0xFF); return (val | (val << 8) | (val << 16) | (val << 24)); } return 0x00000000; } }; u16 Paddle_GetValue() { return nds.paddle; } void Paddle_SetValue(u16 theValue) { nds.paddle = theValue; } ISlot2Interface* construct_Slot2_Paddle() { return new Slot2_Paddle(); } desmume-0.9.11/src/addons/slot1comp_rom.h0000755000000000000000000000233212467662066016767 0ustar rootroot/* Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //this file contains the components used for emulating standard gamecard ROMs //this is largely done by accessing the rom provided in the core emulator #ifndef _SLOT1COMP_ROM_H #define _SLOT1COMP_ROM_H #include "slot1comp_protocol.h" #include "../types.h" class EMUFILE; class Slot1Comp_Rom { public: void start(eSlot1Operation operation, u32 addr); u32 read(); u32 getAddress(); u32 incAddress(); void savestate(EMUFILE* os); void loadstate(EMUFILE* is); private: u32 address; eSlot1Operation operation; }; #endif desmume-0.9.11/src/addons/slot2_auto.cpp0000755000000000000000000000461412467662066016624 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include "../slot2.h" class Slot2_Auto : public ISlot2Interface { private: ISlot2Interface *mSelectedImplementation; public: Slot2_Auto() : mSelectedImplementation(NULL) { } virtual Slot2Info const* info() { static Slot2InfoSimple info("Auto","Slot2 (auto-selection) device emulation", 0xFE); return &info; } virtual void connect() { slot2_selected_type = slot2_DetermineType(); mSelectedImplementation = slot2_List[slot2_selected_type]; mSelectedImplementation->connect(); printf("Slot2 auto-selected device type: %s (0x%02X)\n", mSelectedImplementation->info()->name(), mSelectedImplementation->info()->id()); } virtual void disconnect() { if(mSelectedImplementation) mSelectedImplementation->disconnect(); mSelectedImplementation = NULL; } virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) { mSelectedImplementation->writeByte(PROCNUM, addr, val); } virtual void writeWord(u8 PROCNUM, u32 addr, u16 val) { mSelectedImplementation->writeWord(PROCNUM, addr, val); } virtual void writeLong(u8 PROCNUM, u32 addr, u32 val) { mSelectedImplementation->writeLong(PROCNUM, addr, val); } virtual u8 readByte(u8 PROCNUM, u32 addr) { return mSelectedImplementation->readByte(PROCNUM, addr); } virtual u16 readWord(u8 PROCNUM, u32 addr) { return mSelectedImplementation->readWord(PROCNUM, addr); } virtual u32 readLong(u8 PROCNUM, u32 addr) { return mSelectedImplementation->readLong(PROCNUM, addr); } virtual void savestate(EMUFILE* os) { mSelectedImplementation->savestate(os); } virtual void loadstate(EMUFILE* is) { mSelectedImplementation->loadstate(is); } }; ISlot2Interface* construct_Slot2_Auto() { return new Slot2_Auto(); } desmume-0.9.11/src/addons/slot1comp_protocol.h0000755000000000000000000000720012467662066020032 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //this file contains the components used for emulating standard gamecard protocol. //this largely means the complex boot-up process. //i think there's no reason why proprietary cards couldn't speak any protocol they wish, as long as they didn't mind being unbootable. //TODO - could this be refactored into a base class? that's probably more reasonable. but we've gone with this modular mix-in architecture so... not yet. #ifndef _SLOT1COMP_PROTOCOL_H #define _SLOT1COMP_PROTOCOL_H #include "../types.h" #include "../MMU.h" class EMUFILE; enum eSlot1Operation { //---------- //RAW mode operations //before encrypted communications can be established, some values from the rom header must be read. //this is the only way to read the header, actually, since the only reading commands available to games (after KEY2 mode is set) are eSlot1Operation_00_ReadHeader_Unencrypted, //it's not clear why this exists eSlot1Operation_9F_Dummy, eSlot1Operation_90_ChipID, //---------- //---------- //KEY1 mode operations eSlot1Operation_1x_ChipID, eSlot1Operation_2x_SecureAreaLoad, //---------- //---------- //NORMAL mode operations //the main rom data reading command eSlot1Operation_B7_Read, eSlot1Operation_B8_ChipID, //---------- eSlot1Operation_Unknown }; class ISlot1Comp_Protocol_Client { public: virtual void slot1client_startOperation(eSlot1Operation operation) {} virtual u32 slot1client_read_GCDATAIN(eSlot1Operation operation) = 0; virtual void slot1client_write_GCDATAIN(eSlot1Operation operation, u32 val) {} }; class Slot1Comp_Protocol { public: void savestate(EMUFILE* os); void loadstate(EMUFILE* is); //set some kind of protocol/hardware reset state void reset(ISlot1Comp_Protocol_Client* client); //signals from the GC bus void write_command(GC_Command command); void write_GCDATAIN(u8 PROCNUM, u32 val); u32 read_GCDATAIN(u8 PROCNUM); //helpers for write_command() void write_command_RAW(GC_Command command); void write_command_KEY1(GC_Command command); void write_command_NORMAL(GC_Command command); //operations not related to obscurities of the protocol or otherwise unknown are passed through to the client here ISlot1Comp_Protocol_Client* client; //--state-- //the major operational mode. the protocol shifts modes and interprets commands into operations differently depending on the mode eCardMode mode; //the current operational state eSlot1Operation operation; //the command we're currently crunching on GC_Command command; //most operations are defined in terms of returning a series of bytes //the meaning of these varies by operation. they are provided publicly as a service to clients u32 address; s32 length, delay; //the expected length and delay of this state //chipId which should be returned by the various chipId commands u32 chipId; //gameCode used by the protocol KEY1 crypto u32 gameCode; }; #endif //_SLOT1COMP_PROTOCOL_Hdesmume-0.9.11/src/addons/slot2_none.cpp0000755000000000000000000000171512467662066016612 0ustar rootroot/* Copyright (C) 2009 CrazyMax Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot2.h" class Slot2_None : public ISlot2Interface { public: virtual Slot2Info const* info() { static Slot2InfoSimple info("None", "Slot2 no-device emulation", 0xFF); return &info; } }; ISlot2Interface* construct_Slot2_None() { return new Slot2_None(); } desmume-0.9.11/src/addons/slot1_retail_mcrom.cpp0000755000000000000000000000547512467662066020336 0ustar rootroot/* Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "slot1comp_mc.h" #include "slot1comp_rom.h" #include "slot1comp_protocol.h" #include "../slot1.h" #include "../NDSSystem.h" //quick architecture overview: //MCROM receives GC bus commands from MMU.cpp //those are passed on to the protocol component for parsing //protocol calls back into MCROM via ISlot1Comp_Protocol_Client interface for things the protocol doesnt know about (the contents of the rom, chiefly) //MCROM utilizes the rom component for address logic and delivering data class Slot1_Retail_MCROM : public ISlot1Interface, public ISlot1Comp_Protocol_Client { private: Slot1Comp_Protocol protocol; Slot1Comp_Rom rom; public: virtual Slot1Info const* info() { static Slot1InfoSimple info("Retail MC+ROM", "Slot1 Retail MC+ROM (standard) card emulation", 0x01); return &info; } virtual void connect() { protocol.reset(this); protocol.chipId = gameInfo.chipID; protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0); g_Slot1Comp_MC.connect(); } virtual u8 auxspi_transaction(int PROCNUM, u8 value) { return g_Slot1Comp_MC.auxspi_transaction(PROCNUM,value); } virtual void auxspi_reset(int PROCNUM) { g_Slot1Comp_MC.auxspi_reset(PROCNUM); } virtual void write_command(u8 PROCNUM, GC_Command command) { protocol.write_command(command); } virtual void write_GCDATAIN(u8 PROCNUM, u32 val) { protocol.write_GCDATAIN(PROCNUM, val); } virtual u32 read_GCDATAIN(u8 PROCNUM) { return protocol.read_GCDATAIN(PROCNUM); } virtual void slot1client_startOperation(eSlot1Operation operation) { rom.start(operation,protocol.address); } virtual void post_fakeboot(int PROCNUM) { // The BIOS leaves the card in NORMAL mode protocol.mode = eCardMode_NORMAL; } virtual void savestate(EMUFILE* os) { protocol.savestate(os); rom.savestate(os); } virtual void loadstate(EMUFILE* is) { protocol.loadstate(is); rom.loadstate(is); } private: u32 slot1client_read_GCDATAIN(eSlot1Operation operation) { return rom.read(); } }; ISlot1Interface* construct_Slot1_Retail_MCROM() { return new Slot1_Retail_MCROM(); } desmume-0.9.11/src/addons/slot1_retail_mcrom_debug.cpp0000755000000000000000000001230212467662066021467 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "slot1comp_mc.h" #include "slot1comp_rom.h" #include "slot1comp_protocol.h" #include #include #include "../slot1.h" #include "../path.h" #include "../NDSSystem.h" #include "../utils/fsnitro.h" //quick architecture overview: //MCROM receives GC bus commands from MMU.cpp //those are passed on to the protocol component for parsing //protocol calls back into MCROM via ISlot1Comp_Protocol_Client interface for things the protocol doesnt know about (the contents of the rom, chiefly) //MCROM utilizes the rom component for address logic and delivering data class Slot1_Retail_DEBUG : public ISlot1Interface, public ISlot1Comp_Protocol_Client { private: Slot1Comp_Protocol protocol; Slot1Comp_Rom rom; FILE *fpROM; FS_NITRO *fs; u16 curr_file_id; string pathData; public: virtual Slot1Info const* info() { static Slot1InfoSimple info("Retail DEBUG","Slot1 Retail (standard) card emulation + FS Nitro DEBUG", 0x04); return &info; } virtual void connect() { protocol.reset(this); protocol.chipId = gameInfo.chipID; protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0); curr_file_id = 0xFFFF; fpROM = NULL; fs = NULL; if (!CommonSettings.loadToMemory) { printf("NitroFS: change load type to \"Load to RAM\"\n"); return; } pathData = path.getpath(path.SLOT1D) + path.GetRomNameWithoutExtension(); printf("Path to Slot1 data: %s\n", pathData.c_str()); fs = new FS_NITRO(gameInfo.romdata); fs->rebuildFAT(pathData); } virtual u8 auxspi_transaction(int PROCNUM, u8 value) { return g_Slot1Comp_MC.auxspi_transaction(PROCNUM,value); } virtual void auxspi_reset(int PROCNUM) { g_Slot1Comp_MC.auxspi_reset(PROCNUM); } virtual void write_command(u8 PROCNUM, GC_Command command) { protocol.write_command(command); } virtual void write_GCDATAIN(u8 PROCNUM, u32 val) { protocol.write_GCDATAIN(PROCNUM, val); } virtual u32 read_GCDATAIN(u8 PROCNUM) { return protocol.read_GCDATAIN(PROCNUM); } virtual void post_fakeboot(int PROCNUM) { // The BIOS leaves the card in NORMAL mode protocol.mode = eCardMode_NORMAL; } virtual void savestate(EMUFILE* os) { protocol.savestate(os); rom.savestate(os); } virtual void loadstate(EMUFILE* is) { protocol.loadstate(is); rom.loadstate(is); } virtual void slot1client_startOperation(eSlot1Operation operation) { if (protocol.operation == eSlot1Operation_B7_Read) { u16 file_id = 0xFFFF; u32 offset = 0; bool bFromFile = false; if (fs && fs->isFAT(protocol.address)) { fs->rebuildFAT(protocol.address, protocol.length, pathData); } else { if (fs && fs->getFileIdByAddr(protocol.address, file_id, offset)) { if (file_id != curr_file_id) { string tmp = fs->getFullPathByFileID(file_id); printf("%04X:[%08X, ofs %08X] %s\n", file_id, protocol.address, offset, tmp.c_str()); if (fpROM) { fclose(fpROM); fpROM = NULL; } tmp = pathData + tmp; fpROM = fopen(tmp.c_str(), "rb"); if (fpROM) { bFromFile = true; printf("\t * found at disk, offset %08X\n", offset); if (fseek(fpROM, offset, SEEK_SET) != 0) { printf("\t\t - ERROR seek file position\n"); } } } else { if (fpROM) { bFromFile = true; if (ftell(fpROM) != offset) { printf("\t * new file seek %08Xh\n", offset); fseek(fpROM, offset, SEEK_SET); } } } } } if (!bFromFile && fpROM) { fclose(fpROM); fpROM = NULL; } curr_file_id = file_id; } rom.start(operation, protocol.address); } private: u32 slot1client_read_GCDATAIN(eSlot1Operation operation) { if (protocol.operation == eSlot1Operation_B7_Read) { u32 address = rom.getAddress(); if (fs && fs->isFAT(address)) { u32 res = fs->getFATRecord(address); if (res != 0xFFFFFFFF) { rom.incAddress(); return res; } } else if (fpROM) { u32 data = 0; u32 readed = fread(&data, 1, 4, fpROM); if (readed) { rom.incAddress(); if (readed < 4) data |= ((u32)0xFFFFFFFF << (readed * 8)); return data; } fclose(fpROM); fpROM = NULL; } } return rom.read(); } }; ISlot1Interface* construct_Slot1_Retail_DEBUG() { return new Slot1_Retail_DEBUG(); } desmume-0.9.11/src/addons/slot1comp_rom.cpp0000755000000000000000000000744112467662066017330 0ustar rootroot/* Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "slot1comp_rom.h" #include "../NDSSystem.h" #include "../emufile.h" void Slot1Comp_Rom::start(eSlot1Operation operation, u32 addr) { this->operation = operation; this->address = addr; } u32 Slot1Comp_Rom::read() { switch(operation) { case eSlot1Operation_00_ReadHeader_Unencrypted: { u32 ret = gameInfo.readROM(address); address = (address + 4) & 0xFFF; return ret; } break; case eSlot1Operation_2x_SecureAreaLoad: { //see B7 for details //zero 15-sep-2014 - this is meaningless. newer mask is actually reasonable //address &= gameInfo.mask; //sanity check u32 secureAreaAddress = (address - 0x4000); secureAreaAddress &= 0x3FFF; //memory safe sanity test u32 ret = LE_TO_LOCAL_32(*(u32*)(gameInfo.secureArea + secureAreaAddress)); address = (address&~0xFFF) + ((address+4)&0xFFF); return ret; } case eSlot1Operation_B7_Read: { //TODO - check about non-4-byte aligned addresses //it seems that etrian odyssey 3 doesnt work unless we mask this to cart size. //but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision //but there is no test case yet address &= gameInfo.mask; //feature of retail carts: //B7 "Can be used only for addresses 8000h and up, smaller addresses will be silently redirected to address `8000h+(addr AND 1FFh)`" if(address < 0x8000) address = (0x8000 + (address & 0x1FF)); //1. as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms) we need to protect ourselves by returning 0xFF for things still out of range. //2. this isnt right, unless someone documents otherwise: //if (address > gameInfo.header.endROMoffset) // ... the cart hardware doesnt know anything about the rom header. if it has a totally bogus endROMoffset, the cart will probably work just fine. and, the +4 is missing anyway: //3. this is better: it just allows us to read 0xFF anywhere we dont have rom data. forget what the header says if(address+4 > gameInfo.romsize) { DEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize); return 0xFFFFFFFF; } //actually read from the ROM provider u32 ret = gameInfo.readROM(address); //"However, the datastream wraps to the begin of the current 4K block when address+length crosses a 4K boundary (1000h bytes)" address = (address&~0xFFF) + ((address+4)&0xFFF); return ret; } break; default: return 0; } //switch(operation) } //Slot1Comp_Rom::read() u32 Slot1Comp_Rom::getAddress() { return address & gameInfo.mask; } //Slot1Comp_Rom::getAddress() u32 Slot1Comp_Rom::incAddress() { address &= gameInfo.mask; address = (address&~0xFFF) + ((address+4)&0xFFF); return address; } void Slot1Comp_Rom::savestate(EMUFILE* os) { s32 version = 0; os->write32le(version); os->write32le((s32)operation); os->write32le(address); } void Slot1Comp_Rom::loadstate(EMUFILE* is) { s32 version = is->read32le(); operation = (eSlot1Operation)is->read32le(); address = is->read32le(); }desmume-0.9.11/src/addons/slot2_rumblepak.cpp0000755000000000000000000000321212467662066017627 0ustar rootroot/* Copyright (C) 2009 CrazyMax Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot2.h" void (*FeedbackON)(bool enable) = NULL; class Slot2_RumblePak : public ISlot2Interface { private: u16 old_val_rumble; public: virtual Slot2Info const* info() { static Slot2InfoSimple info("Rumble Pak", "NDS Rumble Pak (need joystick with Feedback)", 0x02); return &info; } virtual void connect() { old_val_rumble = 0; if (!FeedbackON) return; FeedbackON(false); } virtual void disconnect() { FeedbackON(false); } virtual void writeWord(u8 PROCNUM, u32 addr, u16 val) { if (!FeedbackON) return; if (old_val_rumble == val) return; old_val_rumble = val; if ((addr == 0x08000000) || (addr == 0x08001000)) FeedbackON(val); } virtual u8 readByte(u8 PROCNUM, u32 addr) { return (addr & 1)?0xFF:0xFD; }; virtual u16 readWord(u8 PROCNUM, u32 addr) { return 0xFFFD; }; virtual u32 readLong(u8 PROCNUM, u32 addr) { return 0xFFFDFFFD; }; }; ISlot2Interface* construct_Slot2_RumblePak() { return new Slot2_RumblePak(); }desmume-0.9.11/src/addons/slot1_r4.cpp0000755000000000000000000001304212467662066016173 0ustar rootroot/* Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "slot1comp_protocol.h" #include #include "../slot1.h" #include "../NDSSystem.h" #include "../emufile.h" class Slot1_R4 : public ISlot1Interface, public ISlot1Comp_Protocol_Client { private: EMUFILE *img; Slot1Comp_Protocol protocol; u32 write_count; u32 write_enabled; public: Slot1_R4() : img(NULL) , write_count(0) , write_enabled(0) { } virtual Slot1Info const* info() { static Slot1InfoSimple info("R4", "Slot1 R4 emulation", 0x03); return &info; } //called once when the emulator starts up, or when the device springs into existence virtual bool init() { //strange to do this here but we need to make sure its done at some point srand(time(NULL)); return true; } virtual void connect() { img = slot1_GetFatImage(); if(!img) INFO("slot1 fat not successfully mounted\n"); protocol.reset(this); protocol.chipId = 0xFC2; protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0); } //called when the emulator disconnects the device virtual void disconnect() { img = NULL; } //called when the emulator shuts down, or when the device disappears from existence virtual void shutdown() { } virtual void write_command(u8 PROCNUM, GC_Command command) { protocol.write_command(command); } virtual void write_GCDATAIN(u8 PROCNUM, u32 val) { protocol.write_GCDATAIN(PROCNUM, val); } virtual u32 read_GCDATAIN(u8 PROCNUM) { return protocol.read_GCDATAIN(PROCNUM); } virtual void slot1client_startOperation(eSlot1Operation operation) { if(operation != eSlot1Operation_Unknown) return; u32 address; int cmd = protocol.command.bytes[0]; switch(cmd) { case 0xB0: break; case 0xB9: case 0xBA: address = (protocol.command.bytes[1] << 24) | (protocol.command.bytes[2] << 16) | (protocol.command.bytes[3] << 8) | protocol.command.bytes[4]; img->fseek(address,SEEK_SET); break; case 0xBB: write_enabled = 1; write_count = 0x80; //passthrough on purpose? case 0xBC: address = (protocol.command.bytes[1] << 24) | (protocol.command.bytes[2] << 16) | (protocol.command.bytes[3] << 8) | protocol.command.bytes[4]; img->fseek(address,SEEK_SET); break; } } virtual u32 slot1client_read_GCDATAIN(eSlot1Operation operation) { if(operation != eSlot1Operation_Unknown) return 0; u32 val; int cmd = protocol.command.bytes[0]; switch(cmd) { case 0xB0: val = (img) ? 0x1F4 : 0x1F2; break; case 0xB9: val = (rand() % 100) ? (img) ? 0x1F4 : 0x1F2 : 0; break; case 0xBB: case 0xBC: val = 0; break; case 0xBA: //INFO("Read from sd at sector %08X at adr %08X ",card.address/512,ftell(img)); img->fread(&val, 4); //INFO("val %08X\n",val); break; default: val = 0; break; } return val; } void slot1client_write_GCDATAIN(eSlot1Operation operation, u32 val) { if(operation != eSlot1Operation_Unknown) return; int cmd = protocol.command.bytes[0]; switch(cmd) { case 0xBB: { if(write_count && write_enabled) { img->fwrite(&val, 4); img->fflush(); write_count--; } break; } default: break; } } virtual void post_fakeboot(int PROCNUM) { // The BIOS leaves the card in NORMAL mode protocol.mode = eCardMode_NORMAL; } void write32_GCDATAIN(u32 val) { //bool log = false; //last_write_count = write_count; //can someone tell me ... what the hell is this doing, anyway? //seems odd to use card.command[4] for this... isnt it part of the address? if(protocol.command.bytes[4]) { // transfer is done //are you SURE this is logical? there doesnt seem to be any way for the card to signal that T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF); MMU_GC_endTransfer(0); return; } int cmd = protocol.command.bytes[0]; switch(cmd) { case 0xBB: { if(write_count && write_enabled) { img->fwrite(&val, 4); img->fflush(); write_count--; } break; } default: break; } if(write_count==0) { write_enabled = 0; //transfer is done //are you SURE this is logical? there doesnt seem to be any way for the card to signal that T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF); //but isnt this a different IRQ? IREQ_MC perhaps MMU_GC_endTransfer(0); } /*if(log) { INFO("WRITE CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t", card.command[0], card.command[1], card.command[2], card.command[3], card.command[4], card.command[5], card.command[6], card.command[7]); INFO("FROM: %08X\t", NDS_ARM9.instruct_adr); INFO("VAL: %08X\n", val); }*/ } }; ISlot1Interface* construct_Slot1_R4() { return new Slot1_R4(); } desmume-0.9.11/src/addons/slot1comp_protocol.cpp0000755000000000000000000001376512467662066020402 0ustar rootroot/* Copyright (C) 2012-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "slot1comp_protocol.h" #include #include "../armcpu.h" #include "../encrypt.h" #include "../emufile.h" #include "../utils/decrypt/decrypt.h" static _KEY1 key1((const u8*)arm7_key); void Slot1Comp_Protocol::reset(ISlot1Comp_Protocol_Client* client) { this->client = client; //we have to initialize this to something.. lets use dummy. //(need to clean this up...) memcpy(&command,"\x9F\0\0\0\0\0\0\0",8); operation = eSlot1Operation_9F_Dummy; length = 0; delay = 0; mode = eCardMode_RAW; } void Slot1Comp_Protocol::write_command_RAW(GC_Command command) { int cmd = command.bytes[0]; if(cmd == 0x9F) { operation = eSlot1Operation_9F_Dummy; length = 0x2000; } if(cmd == 0x90) { operation = eSlot1Operation_90_ChipID; length = 4; //we handle this operation ourselves } if(cmd == 0x3C) { //switch to KEY1 length = 0; mode = eCardMode_KEY1; //defer initialization of KEY1 until we know we need it, just to save some CPU time. //TODO - some information about these parameters //level == 2 //modulo == 8 key1.init(gameCode, 2, 0x08); GCLOG("[GC] KEY1 ACTIVATED\n"); } if(cmd == 0x00) { operation = eSlot1Operation_00_ReadHeader_Unencrypted; client->slot1client_startOperation(operation); } } void Slot1Comp_Protocol::write_command_KEY1(GC_Command command) { //decrypt the KEY1-format command u32 temp[2]; command.toCryptoBuffer(temp); key1.decrypt(temp); command.fromCryptoBuffer(temp); GCLOG("[GC] (key1-decrypted):"); command.print(); //and process it: int cmd = command.bytes[0]; switch(cmd&0xF0) { case 0x10: operation = eSlot1Operation_1x_ChipID; delay = 0x910, length = 4; //we handle this operation ourselves break; case 0x20: operation = eSlot1Operation_2x_SecureAreaLoad; delay = 0x910, length = 0x11A8; //TODO - more endian-safe way of doing this (theres examples in R4) { #ifdef LOCAL_LE u64 cmd64 = bswap64(*(u64*)command.bytes); #else u64 cmd64 = *(u64*)command.bytes; #endif //todo - parse into blocknumber u32 blocknumber = (cmd64>>44)&0xFFFF; if(blocknumber<4||blocknumber>7) printf("SLOT1 WARNING: INVALID BLOCKNUMBER FOR \"Get Secure Area Block\": 0x%04X\n",blocknumber); address = blocknumber*0x1000; } client->slot1client_startOperation(operation); break; case 0x40: //switch to KEY2 delay = 0x910, length = 0; //well.. not really... yet. GCLOG("[GC] KEY2 ACTIVATED\n"); break; case 0x60: //KEY2 disable? any info? break; case 0xA0: delay = 0x910, length = 0; mode = eCardMode_NORMAL; GCLOG("[GC] NORMAL MODE ACTIVATED\n"); break; } } void Slot1Comp_Protocol::write_command_NORMAL(GC_Command command) { switch(command.bytes[0]) { case 0xB7: { operation = eSlot1Operation_B7_Read; //TODO - more endian-safe way of doing this (theres examples in R4) #ifdef LOCAL_LE u64 cmd64 = bswap64(*(u64*)command.bytes); #else u64 cmd64 = *(u64*)command.bytes; #endif address = (u32)((cmd64 >> 24)); length = 0x200; client->slot1client_startOperation(operation); } break; case 0xB8: operation = eSlot1Operation_B8_ChipID; delay = 0, length = 4; //we handle this operation ourselves break; default: operation = eSlot1Operation_Unknown; client->slot1client_startOperation(operation); break; } } void Slot1Comp_Protocol::write_command(GC_Command command) { this->command = command; //unrecognized commands will do something depending on the current state of the card delay = 0; length = 0; address = 0; switch(mode) { case eCardMode_RAW: write_command_RAW(command); break; case eCardMode_KEY1: write_command_KEY1(command); break; case eCardMode_NORMAL: write_command_NORMAL(command); break; } } void Slot1Comp_Protocol::write_GCDATAIN(u8 PROCNUM, u32 val) { switch(operation) { case eSlot1Operation_Unknown: client->slot1client_write_GCDATAIN(operation,val); break; } } u32 Slot1Comp_Protocol::read_GCDATAIN(u8 PROCNUM) { switch(operation) { default: return client->slot1client_read_GCDATAIN(operation); case eSlot1Operation_9F_Dummy: return 0xFFFFFFFF; case eSlot1Operation_1x_ChipID: return chipId; case eSlot1Operation_90_ChipID: case eSlot1Operation_B8_ChipID: //Most games continuously compare the current chipId with the value in //stored in memory at boot-up, probably to know if the card was removed. //staff of kings verifies this (it also uses the arm7 IRQ 20 to detect card ejects) return chipId; } return 0xFFFFFFFF; } void Slot1Comp_Protocol::savestate(EMUFILE* os) { s32 version = 0; os->write32le(version); os->write32le((s32)mode); os->write32le((s32)operation); os->fwrite(command.bytes,8); os->write32le(address); os->write32le(length); os->write32le(delay); os->write32le(chipId); os->write32le(gameCode); } void Slot1Comp_Protocol::loadstate(EMUFILE* is) { s32 version = is->read32le(); mode = (eCardMode)is->read32le(); operation = (eSlot1Operation)is->read32le(); is->fread(command.bytes,8); address = is->read32le(); length = is->read32le(); delay = is->read32le(); chipId = is->read32le(); gameCode = is->read32le(); } desmume-0.9.11/src/addons/slot2_gbagame.cpp0000755000000000000000000002110012467662066017224 0ustar rootroot/* Copyright (C) 2009 CrazyMax Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot2.h" #include #include "../debug.h" #include "../NDSSystem.h" #include "../path.h" #include "../emufile.h" #define EEPROM 0x52504545 #define SRAM_ 0x4D415253 #define FLASH 0x53414C46 #define FLASH1M_ 0x5F4D3148 #define SIIRTC_V 0x52494953 static const char *saveTypes[] = { "EEPROM", "SRAM", "FLASH", "FLASH1M", "SIIRTC_V", }; class Slot2_GbaCart : public ISlot2Interface { private: EMUFILE* fROM; EMUFILE* fSRAM; u32 romSize; u32 sramSize; u32 saveType; struct { u32 size; u8 state; u8 cmd; u8 idDevice; u8 idManufacturer; u8 bank; } gbaFlash; u32 readRom(const u32 pos, const u8 size) { if (!fROM) return 0xFFFFFFFF; fROM->fseek(pos, SEEK_SET); u32 data = 0xFFFFFFFF; u32 readed = fROM->fread(&data, size); return data; } u32 readSRAM(const u32 pos, const u8 size) { if (!fSRAM) return 0xFFFFFFFF; fSRAM->fseek(pos, SEEK_SET); u32 data = 0xFFFFFFFF; u32 readed = fSRAM->fread(&data, size); return data; } void writeSRAM(const u32 pos, const u8 *data, u32 size) { if (!fSRAM) return; fSRAM->fseek(pos, SEEK_SET); u32 writed = size; fSRAM->fwrite(data, size); fSRAM->fflush(); } u32 scanSaveTypeGBA() { if (!fROM) return 0xFF; fROM->fseek(0, SEEK_SET); int size = fROM->size(); int lastpct=1; int len = fROM->size(); for(;;) { u32 tmp; u32 readed = fROM->fread(&tmp, 4); int pos = fROM->ftell(); int currPct = pos*100/(size-1); for(int i=lastpct;i= len) break; switch (tmp) { case EEPROM: return 1; case SRAM_: return 2; case FLASH: { u32 tmp = fROM->read32le(); return ((tmp == FLASH1M_)?3:5); } case SIIRTC_V: return 4; } } return 0xFF; } void gbaWriteFlash(u32 adr, u8 val) { if (!fSRAM) return; switch (gbaFlash.state) { case 0: if (adr == 0x0A005555) { if (val == 0xF0) { //INFO("GBAgame: Flash: reset\n"); gbaFlash.state = 0; gbaFlash.cmd = 0; return; } if (val == 0xAA) { gbaFlash.state = 1; return; } } if (adr == 0x0A000000) { if (gbaFlash.cmd == 0xB0) { gbaFlash.bank = val; gbaFlash.cmd = 0; //INFO("GBAgame: Flash: change bank %i\n", val); return; } } break; case 1: if ( (adr == 0x0A002AAA) && (val == 0x55) ) { gbaFlash.state = 2; return; } gbaFlash.state = 0; break; case 2: if (adr == 0x0A005555) { //INFO("GBAgame: Flash: send command flash 0x%02X\n", val); switch (val) { case 0x80: // Erase gbaFlash.state = 0x80; break; case 0x90: // Chip Identification gbaFlash.state = 0x90; break; case 0xA0: // Write gbaFlash.state = 0; break; default: gbaFlash.state = 0; break; } gbaFlash.cmd = val; return; } gbaFlash.state = 0; break; // erase case 0x80: if ( (adr == 0x0A005555) && (val == 0xAA) ) { gbaFlash.state = 0x81; return; } gbaFlash.state = 0; break; case 0x81: if ( (adr == 0x0A002AAA) && (val == 0x55) ) { gbaFlash.state = 0x82; return; } gbaFlash.state = 0; break; case 0x82: if (val == 0x30) { u32 ofs = (adr & 0x0000F000) + (0x10000 * gbaFlash.bank); //INFO("GBAgame: Flash: erase from 0x%08X to 0x%08X\n", ofs + 0x0A000000, ofs + 0x0A001000); u8 *tmp = new u8[0x1000]; memset(tmp, 0xFF, 0x1000); writeSRAM(ofs, tmp, 0x1000); delete [] tmp; } gbaFlash.state = 0; gbaFlash.cmd = 0; return; // Chip Identification case 0x90: if ( (adr == 0x0A005555) && (val == 0xAA) ) { gbaFlash.state = 0x91; return; } gbaFlash.state = 0; break; case 0x91: if ( (adr == 0x0A002AAA) && (val == 0x55) ) { gbaFlash.state = 0x92; return; } gbaFlash.state = 0; break; case 0x92: gbaFlash.state = 0; gbaFlash.cmd = 0; return; } if (gbaFlash.cmd == 0xA0) // write { writeSRAM((adr & 0x1FFFF) + (0x10000 * gbaFlash.bank), &val, 1); gbaFlash.state = 0; gbaFlash.cmd = 0; return; } INFO("GBAgame: Flash: write unknown atn 0x%08X = 0x%02X\n", adr, val); } u8 gbaReadFlash(u32 adr) { if (!fSRAM) return 0xFF; if (gbaFlash.cmd == 0) return readSRAM((adr & 0x1FFFF) + (0x10000 * gbaFlash.bank), 1); //INFO("GBAgame: flash read at 0x%08X\n", adr); switch (gbaFlash.cmd) { case 0x90: // Chip Identification if (adr == 0x0A000000) return gbaFlash.idManufacturer; if (adr == 0x0A000001) return gbaFlash.idDevice; break; case 0xF0: // gbaFlash.state = 0; gbaFlash.cmd = 0; break; case 0xB0: // Bank switching break; default: INFO("GBAgame: Flash: read - unknown command at 0x%08X = 0x%02X\n", adr, gbaFlash.cmd); break; } return 0xFF; } void Close() { delete fROM; fROM = NULL; delete fSRAM; fSRAM = NULL; romSize = 0; sramSize = 0; } public: Slot2_GbaCart() : fROM(NULL) , fSRAM(NULL) { Close(); } virtual Slot2Info const* info() { static Slot2InfoSimple info("GBA Cartridge", "GBA cartridge in slot", 0x03); return &info; } virtual void connect() { Close(); romSize = 0; sramSize = 0; if (gameInfo.romsize == 0) { return; } if (GBACartridge_RomPath.empty()) { return; } if (!strcasecmp(GBACartridge_RomPath.c_str(), "self")) { GBACartridge_RomPath = path.path; GBACartridge_SRAMPath = Path::GetFileNameWithoutExt(GBACartridge_RomPath) + "." + GBA_SRAM_FILE_EXT; } printf("GBASlot opening ROM: %s\n", GBACartridge_RomPath.c_str()); EMUFILE_FILE *inf = new EMUFILE_FILE(GBACartridge_RomPath, "rb"); inf->EnablePositionCache(); fROM = inf; if (fROM->fail()) { printf(" - Failed\n"); Close(); return; } romSize = fROM->size(); printf(" - Success (%u bytes)\n", romSize); // Load the GBA cartridge SRAM. inf = new EMUFILE_FILE(GBACartridge_SRAMPath, "rb+"); fSRAM = inf; if(fSRAM->fail()) { delete fSRAM; fSRAM = NULL; printf("GBASlot did not load associated SRAM.\n"); } else { inf->EnablePositionCache(); sramSize = fSRAM->size(); printf("Scanning GBA rom to ID save type\n"); saveType = scanSaveTypeGBA(); printf("\nGBASlot found SRAM (%s - %u bytes) at:\n%s\n", (saveType == 0xFF)?"Unknown":saveTypes[saveType], sramSize, GBACartridge_SRAMPath.c_str()); gbaFlash.size = sramSize; if (gbaFlash.size <= (64 * 1024)) { gbaFlash.idDevice = 0x1B; gbaFlash.idManufacturer = 0x32; } else { gbaFlash.idDevice = 0x09; gbaFlash.idManufacturer = 0xC2; } gbaFlash.state = 0; } } virtual void disconnect() { Close(); } virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) { if ((addr >= 0x0A000000) && (addr < 0x0A010000)) { switch (saveType) { case 3: // Flash case 5: gbaWriteFlash(addr, val); break; default: break; } } } virtual u8 readByte(u8 PROCNUM, u32 addr) { if (addr < 0x0A000000) return (u8)readRom(addr - 0x08000000, 1); if (addr < 0x0A010000) { if ((saveType == 3) || (saveType == 5)) return gbaReadFlash(addr); return (u8)readSRAM(addr - 0x0A000000, 1); } return 0xFF; } virtual u16 readWord(u8 PROCNUM, u32 addr) { if (addr < 0x0A000000) return (u16)readRom(addr - 0x08000000, 2); if (addr < 0x0A010000) return (u16)readSRAM(addr - 0x0A000000, 2); return 0xFFFF; } virtual u32 readLong(u8 PROCNUM, u32 addr) { if (addr < 0x0A000000) return (u32)readRom(addr - 0x08000000, 4); if (addr < 0x0A010000) return (u32)readSRAM(addr - 0x0A000000, 4); return 0xFFFFFFFF; } }; ISlot2Interface* construct_Slot2_GbaCart() { return new Slot2_GbaCart(); } desmume-0.9.11/src/addons/slot2_passme.cpp0000755000000000000000000000306212467662066017140 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot2.h" #include "../NDSSystem.h" class Slot2_PassME : public ISlot2Interface { public: virtual Slot2Info const* info() { static Slot2InfoSimple info("PassME", "PassME in GBA slot", 0x08); return &info; } virtual u8 readByte(u8 PROCNUM, u32 addr) { u32 tmp_addr = (addr & 0x07FFFFFF); if (tmp_addr < gameInfo.romsize) return (u8)gameInfo.readROM(tmp_addr); return (0xFF); } virtual u16 readWord(u8 PROCNUM, u32 addr) { u32 tmp_addr = (addr & 0x07FFFFFF); if (tmp_addr < gameInfo.romsize) return (u16)gameInfo.readROM(tmp_addr); return (0xFFFF); } virtual u32 readLong(u8 PROCNUM, u32 addr) { u32 tmp_addr = (addr & 0x07FFFFFF); if (tmp_addr < gameInfo.romsize) return (u32)gameInfo.readROM(tmp_addr); return (0xFFFFFFFF); } }; ISlot2Interface* construct_Slot2_PassME() { return new Slot2_PassME(); } desmume-0.9.11/src/addons/slot1_retail_auto.cpp0000755000000000000000000000541112467662066020157 0ustar rootroot/* Copyright (C) 2013-2105 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot1.h" #include "../NDSSystem.h" class Slot1_Retail_Auto : public ISlot1Interface { private: ISlot1Interface *mSelectedImplementation; public: Slot1_Retail_Auto() : mSelectedImplementation(NULL) { } virtual Slot1Info const* info() { static Slot1InfoSimple info("Retail (Auto)","Slot1 Retail (auto-selection) card emulation", 0xFE); return &info; } virtual void connect() { NDS_SLOT1_TYPE selection = NDS_SLOT1_RETAIL_MCROM; //check game ID in core emulator and select right implementation if ((memcmp(gameInfo.header.gameCode, "UOR", 3) == 0) || // WarioWare - D.I.Y. (U)(E)(EUR) / Made in Ore (J) (memcmp(gameInfo.header.gameCode, "UXBP", 4) == 0) // Jam with the Band (EUR) ) selection = NDS_SLOT1_RETAIL_NAND; slot1_selected_type = selection; mSelectedImplementation = slot1_List[selection]; mSelectedImplementation->connect(); printf("Slot1 auto-selected device type: %s\n",mSelectedImplementation->info()->name()); } virtual void disconnect() { if(mSelectedImplementation) mSelectedImplementation->disconnect(); mSelectedImplementation = NULL; } virtual void write_command(u8 PROCNUM, GC_Command command) { mSelectedImplementation->write_command(PROCNUM, command); } virtual void write_GCDATAIN(u8 PROCNUM, u32 val) { mSelectedImplementation->write_GCDATAIN(PROCNUM, val); } virtual u32 read_GCDATAIN(u8 PROCNUM) { return mSelectedImplementation->read_GCDATAIN(PROCNUM); } virtual u8 auxspi_transaction(int PROCNUM, u8 value) { return mSelectedImplementation->auxspi_transaction(PROCNUM, value); } virtual void auxspi_reset(int PROCNUM) { mSelectedImplementation->auxspi_reset(PROCNUM); } virtual void post_fakeboot(int PROCNUM) { mSelectedImplementation->post_fakeboot(PROCNUM); } virtual void savestate(EMUFILE* os) { mSelectedImplementation->savestate(os); } virtual void loadstate(EMUFILE* is) { mSelectedImplementation->loadstate(is); } }; ISlot1Interface* construct_Slot1_Retail_Auto() { return new Slot1_Retail_Auto(); } desmume-0.9.11/src/addons/slot1comp_mc.cpp0000755000000000000000000000254512467662066017132 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //this file contains the components used for emulating standard gamecard "MC" devices (eeprom, fram, flash) //this is largely done by accessing the BackupDevice resources in the core emulator #include "slot1comp_mc.h" #include "../MMU.h" #include "../NDSSystem.h" Slot1Comp_MC g_Slot1Comp_MC; u8 Slot1Comp_MC::auxspi_transaction(int PROCNUM, u8 value) { return MMU_new.backupDevice.data_command(value, PROCNUM); } void Slot1Comp_MC::auxspi_reset(int PROCNUM) { MMU_new.backupDevice.reset_command(); } void Slot1Comp_MC::connect() { if(!memcmp(gameInfo.header.gameCode,"AXBJ", 4)) MMU_new.backupDevice.uninitializedValue = 0x00; // Daigassou! Band Brothers DX (JP) }desmume-0.9.11/src/addons/slot1_retail_nand.cpp0000755000000000000000000001736512467662066020142 0ustar rootroot/* Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ // Games with NAND Flash: // Ore/WarioWare D.I.Y. - chip: SAMSUNG 004 // KLC2811ANB-P204 // NTR-UORE-0 // - 128Mbit #include "slot1comp_rom.h" #include "slot1comp_protocol.h" #include "../slot1.h" #include "../NDSSystem.h" #include "../emufile.h" //quick architecture overview: //NAND receives GC bus commands from MMU.cpp //those are passed on to the protocol component for parsing //protocol calls back into NAND via ISlot1Comp_Protocol_Client interface for things the protocol doesn't know about (the contents of the rom, chiefly) //NAND utilizes the rom component for address logic and delivering data. //it also processes some commands itself which aren't rom-related (the NANDy stuff) class Slot1_Retail_NAND : public ISlot1Interface, public ISlot1Comp_Protocol_Client { private: u32 subAdr; Slot1Comp_Protocol protocol; Slot1Comp_Rom rom; u32 mode; u32 handle_save; //current NAND read/write start position //when this is changed, the read/write cursor will be reset to it //when it is set to the same value, the read/write cursor will NOT be reset //(this is since some value must necessarily come in on the protocol address, so the 'current save_start' is used as a special 'dont change' value u32 save_start; //current NAND read/write cursor u32 save_adr; public: virtual Slot1Info const* info() { static Slot1InfoSimple info("Retail NAND","Slot1 retail NAND card emulation", 0x02); return &info; } virtual void connect() { protocol.reset(this); protocol.chipId = gameInfo.chipID; protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0); save_adr = 0; handle_save = 0; mode = 0; subAdr = T1ReadWord(gameInfo.header.reserved2, 0x6) << 17; } virtual void write_command(u8 PROCNUM, GC_Command command) { protocol.write_command(command); } virtual void write_GCDATAIN(u8 PROCNUM, u32 val) { protocol.write_GCDATAIN(PROCNUM, val); } virtual u32 read_GCDATAIN(u8 PROCNUM) { return protocol.read_GCDATAIN(PROCNUM); } virtual void slot1client_startOperation(eSlot1Operation operation) { //INFO("Start command: %02X%02X%02X%02X%02X%02X%02X%02X\t", // protocol.command.bytes[0], protocol.command.bytes[1], protocol.command.bytes[2], protocol.command.bytes[3], // protocol.command.bytes[4], protocol.command.bytes[5], protocol.command.bytes[6], protocol.command.bytes[7]); //INFO("FROM: %08X\n", NDS_ARM9.instruct_adr); u32 addressFromProtocol = (protocol.command.bytes[1] << 24) | (protocol.command.bytes[2] << 16) | (protocol.command.bytes[3] << 8) | protocol.command.bytes[4]; //pass the normal rom operations along to the rom component switch(operation) { case eSlot1Operation_00_ReadHeader_Unencrypted: rom.start(operation,addressFromProtocol); return; case eSlot1Operation_2x_SecureAreaLoad: rom.start(operation,protocol.address); return; } //handle special commands ourselves int cmd = protocol.command.bytes[0]; switch(cmd) { // Nand Init case 0x94: mode = cmd; break; // Nand Error? case 0xD6: break; //Nand Write Page case 0x81: mode = cmd; if(addressFromProtocol != save_start) { save_start = addressFromProtocol; save_adr = (addressFromProtocol & gameInfo.mask) - subAdr; } handle_save = 1; break; case 0x84: //Write disable case 0x85: //Write enable mode = cmd; break; case 0x8B: mode = cmd; handle_save = 0; MMU_new.backupDevice.flushBackup(); break; //Start read mode case 0xB7: if (handle_save) { mode = cmd; if(addressFromProtocol != save_start) { save_start = addressFromProtocol; save_adr = (addressFromProtocol & gameInfo.mask) - subAdr; } } else { rom.start(operation, addressFromProtocol); } break; case 0xB2: //Set save position mode = cmd; save_start = addressFromProtocol; //cursor resets regardless of whether save_start changed, that's what makes this special. //the cursor could be reset to the beginning of the previous save_start region save_adr = (addressFromProtocol & gameInfo.mask) - subAdr; handle_save = 1; break; } } virtual u32 slot1client_read_GCDATAIN(eSlot1Operation operation) { //pass the normal rom operations along to the rom component switch(operation) { case eSlot1Operation_00_ReadHeader_Unencrypted: case eSlot1Operation_2x_SecureAreaLoad: //case eSlot1Operation_B7_Read: return rom.read(); } //handle special commands ourselves int cmd = protocol.command.bytes[0]; int val = 0; switch(cmd) { // Nand Init? case 0x94: val = 0; mode = 0; break; //Rom/Save Read case 0xB7: { if(handle_save) { MMU_new.backupDevice.ensure(save_adr+4, (u8)0); val = MMU_new.backupDevice.readLong(save_adr, 0); save_adr += 4; } else { val = rom.read(); } } break; // Nand Status? case 0xD6: //0x80 == busy //0x40 == ?? //0x20 == ready? //0x10 == write enabled? switch (mode) { case 0x84: //Write disable val = 0x20202020; break; case 0x85: //Write enable val = 0x20202020 | 0x10101010; break; case 0x8B: val = 0x60606060 | 0x10101010; break; case 0xB2: //Set save position val = 0x20202020; break; default: val = 0x60606060; //0x20 == ready break; } break; } return val; } virtual void slot1client_write_GCDATAIN(eSlot1Operation operation, u32 val) { //pass the normal rom operations along to the rom component switch(operation) { case eSlot1Operation_00_ReadHeader_Unencrypted: case eSlot1Operation_B7_Read: case eSlot1Operation_2x_SecureAreaLoad: return; } //handle special commands ourselves int cmd = protocol.command.bytes[0]; u32 value = val; u32 adr = save_adr; switch(cmd) { case 0x81: //Nand Write MMU_new.backupDevice.ensure(adr+4, (u8)0); MMU_new.backupDevice.writeLong(adr, val); save_adr += 4; break; } } virtual void post_fakeboot(int PROCNUM) { // The BIOS leaves the card in NORMAL mode protocol.mode = eCardMode_NORMAL; } virtual void savestate(EMUFILE* os) { s32 version = 0; protocol.savestate(os); rom.savestate(os); os->write32le(version); os->write32le(mode); os->write32le(handle_save); os->write32le(save_adr); os->write32le(save_start); os->write32le(subAdr); } virtual void loadstate(EMUFILE* is) { s32 version = 0; protocol.loadstate(is); rom.loadstate(is); is->read32le(&version); // version 0 if (version >= 0) { is->read32le(&mode); is->read32le(&handle_save); is->read32le(&save_adr); is->read32le(&save_start); is->read32le(&subAdr); } } }; ISlot1Interface* construct_Slot1_Retail_NAND() { return new Slot1_Retail_NAND(); } desmume-0.9.11/src/addons/slot2_piano.cpp0000755000000000000000000000546112467662066016763 0ustar rootroot/* Copyright (C) 2010-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot2.h" static u16 pianoKeyStatus = 0; class Slot2_EasyPiano : public ISlot2Interface { public: virtual Slot2Info const* info() { static Slot2InfoSimple info("Piano", "Piano for EasyPiano", 0x06); return &info; } virtual void connect() { pianoKeyStatus = 0; } virtual u8 readByte(u8 PROCNUM, u32 addr) { //printf("piano: read 08 at 0x%08X\n", adr); //the actual keyboard output //byte:bit //0x09FFFFFE:0 = C //0x09FFFFFE:1 = C# //0x09FFFFFE:2 = D //0x09FFFFFE:3 = D# //0x09FFFFFE:4 = E //0x09FFFFFE:5 = F //0x09FFFFFE:6 = F# //0x09FFFFFE:7 = G //0x09FFFFFF:0 = G# //0x09FFFFFF:1 = A //0x09FFFFFF:2 = A# //0x09FFFFFF:3 = ? //0x09FFFFFF:4 = ? //0x09FFFFFF:5 = B //0x09FFFFFF:6 = hiC //0x09FFFFFF:7 = ? //deassert bit if key is pressed //LOG("PIANO: %04X\n",pianoKeyStatus); if(addr == 0x09FFFFFE) return (~(pianoKeyStatus&0xFF)); if(addr == 0x09FFFFFF) return (~((pianoKeyStatus>>8)&0xFF))&~(0x18); return (addr & 1)?0xE7:0xFF; } virtual u16 readWord(u8 PROCNUM, u32 addr) { if (addr != 0x09FFFFFE) return 0xE7FF; return readByte(PROCNUM, 0x09FFFFFE) | (readByte(PROCNUM,0x09FFFFFF) << 8); } virtual u32 readLong(u8 PROCNUM, u32 addr) { return 0xE7FFE7FF; } }; ISlot2Interface* construct_Slot2_EasyPiano() { return new Slot2_EasyPiano(); } void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic) { //0x09FFFFFE:0 = C //0x09FFFFFE:1 = C# //0x09FFFFFE:2 = D //0x09FFFFFE:3 = D# //0x09FFFFFE:4 = E //0x09FFFFFE:5 = F //0x09FFFFFE:6 = F# //0x09FFFFFE:7 = G //0x09FFFFFE:0 = G# //0x09FFFFFE:1 = A //0x09FFFFFF:2 = A# //0x09FFFFFF:3 = ? //0x09FFFFFF:4 = ? //0x09FFFFFF:5 = B //0x09FFFFFF:6 = hiC //0x09FFFFFF:7 = ? #define BIT_P(N,v) ((v)?(1<<(N)):0) pianoKeyStatus = BIT_P(0,c) | BIT_P(1,cs) | BIT_P(2,d) | BIT_P(3,ds) | BIT_P(4,e) | BIT_P(5,f) | BIT_P(6,fs) | BIT_P(7,g) | BIT_P(8,gs) | BIT_P(9,a) | BIT_P(10,as) | BIT_P(13,b) | BIT_P(14,hic) ; } desmume-0.9.11/src/addons/slot2_expMemory.cpp0000755000000000000000000001153312467662066017637 0ustar rootroot/* Copyright (C) 2009 CrazyMax Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot2.h" #include "../emufile.h" #include "../mem.h" #if 0 #define EXPINFO(...) INFO(__VA_ARGS__) #else #define EXPINFO(...) #endif #define EXPANSION_MEMORY_SIZE (8 * 1024 * 1024) static u8 header_0x00B0[] = { 0xFF, 0xFF, 0x96, 0x00, //this 0x96 is strange. it can't be read from the pak when it boots, it must appear later 0x00, 0x24, 0x24, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F }; class Slot2_ExpansionPak : public ISlot2Interface { private: u8 *expMemory; bool ext_ram_lock; public: Slot2_ExpansionPak() { expMemory = NULL; ext_ram_lock = true; } virtual Slot2Info const* info() { static Slot2InfoSimple info("Memory Expansion Pak", "Official RAM expansion for Opera browser", 0x05); return &info; } virtual void connect() { if (expMemory == NULL) { expMemory = new u8[EXPANSION_MEMORY_SIZE]; } memset(expMemory, 0xFF, EXPANSION_MEMORY_SIZE); ext_ram_lock = true; } virtual void disconnect() { delete[] expMemory; expMemory = NULL; } virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) { if (ext_ram_lock) return; if (addr >= 0x09000000) { u32 offs = (addr - 0x09000000); if (offs >= EXPANSION_MEMORY_SIZE) return; T1WriteByte(expMemory, offs, val); } EXPINFO("ExpMemory: write 08 at 0x%08X = 0x%02X\n", addr, val); } virtual void writeWord(u8 PROCNUM, u32 addr, u16 val) { if (addr == 0x08240000) { if (val == 0) ext_ram_lock = true; else if (val == 1) ext_ram_lock = false; return; } if (ext_ram_lock) return; if (addr >= 0x09000000) { u32 offs = (addr - 0x09000000); if (offs >= EXPANSION_MEMORY_SIZE) return; T1WriteWord(expMemory, offs, val); } EXPINFO("ExpMemory: write 16 at 0x%08X = 0x%04X\n", addr, val); } virtual void writeLong(u8 PROCNUM, u32 addr, u32 val) { if (ext_ram_lock) return; if (addr >= 0x09000000) { u32 offs = (addr - 0x09000000); if (offs >= EXPANSION_MEMORY_SIZE) return; T1WriteLong(expMemory, offs, val); } EXPINFO("ExpMemory: write 32 at 0x%08X = 0x%08X\n", addr, val); } virtual u8 readByte(u8 PROCNUM, u32 addr) { EXPINFO("ExpMemory: read 08 at 0x%08X\n", addr); if ((addr >= 0x080000B0) && (addr < 0x080000C0)) return T1ReadByte(header_0x00B0, (addr - 0x080000B0)); if (addr >= 0x09000000) { u32 offs = (addr - 0x09000000); if (offs >= EXPANSION_MEMORY_SIZE) return (0xFF); return T1ReadByte(expMemory, offs); } return 0xFF; } virtual u16 readWord(u8 PROCNUM, u32 addr) { EXPINFO("ExpMemory: read 16 at 0x%08X\n", addr); if ((addr >= 0x080000B0) && (addr < 0x080000C0)) return T1ReadWord(header_0x00B0, (addr - 0x080000B0)); if (addr == 0x0801FFFC) return 0x7FFF; if (addr == 0x08240002) return 0; //this can't be 0xFFFF. dunno why, we just guessed 0 if (addr >= 0x09000000) { u32 offs = (addr - 0x09000000); if (offs >= EXPANSION_MEMORY_SIZE) return (0xFFFF); return T1ReadWord(expMemory, offs); } return 0xFFFF; } virtual u32 readLong(u8 PROCNUM, u32 addr) { EXPINFO("ExpMemory: read 32 at 0x%08X\n", addr); if((addr >= 0x080000B0) && (addr < 0x080000C0)) return T1ReadLong(header_0x00B0, (addr - 0x080000B0)); if (addr >= 0x09000000) { u32 offs = (addr - 0x09000000); if (offs >= EXPANSION_MEMORY_SIZE) return 0xFFFFFFFF; return T1ReadLong(expMemory, offs); } return 0xFFFFFFFF; } virtual void savestate(EMUFILE* os) { s32 version = 0; EMUFILE_MEMORY *ram = new EMUFILE_MEMORY(expMemory, EXPANSION_MEMORY_SIZE); os->write32le(version); os->write32le((u32)ext_ram_lock); os->writeMemoryStream(ram); delete ram; } virtual void loadstate(EMUFILE* is) { EMUFILE_MEMORY *ram = new EMUFILE_MEMORY(); s32 version = is->read32le(); if (version >= 0) { is->read32le((u32*)&ext_ram_lock); is->readMemoryStream(ram); memcpy(expMemory, ram->buf(), std::min(EXPANSION_MEMORY_SIZE, ram->size())); } delete ram; } }; ISlot2Interface* construct_Slot2_ExpansionPak() { return new Slot2_ExpansionPak(); } desmume-0.9.11/src/addons/slot1comp_mc.h0000755000000000000000000000204112467662066016566 0ustar rootroot/* Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //this file contains the components used for emulating standard gamecard "MC" devices (eeprom, fram, flash) #ifndef _SLOT1COMP_MC_H #define _SLOT1COMP_MC_H #include "../types.h" class Slot1Comp_MC { public: u8 auxspi_transaction(int PROCNUM, u8 value); void auxspi_reset(int PROCNUM); void connect(); }; extern Slot1Comp_MC g_Slot1Comp_MC; #endif desmume-0.9.11/src/addons/slot2_mpcf.cpp0000755000000000000000000001473112467662066016602 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006 Mic Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include #include #include "../slot2.h" #include "../debug.h" #include "../emufile.h" #include "../path.h" #include "../utils/vfat.h" // Set up addresses for GBAMP #define CF_REG_DATA 0x9000000 #define CF_REG_ERR 0x9020000 #define CF_REG_SEC 0x9040000 #define CF_REG_LBA1 0x9060000 #define CF_REG_LBA2 0x9080000 #define CF_REG_LBA3 0x90A0000 #define CF_REG_LBA4 0x90C0000 #define CF_REG_CMD 0x90E0000 #define CF_REG_STS 0x98C0000 // CF Card commands #define CF_CMD_LBA 0xE0 #define CF_CMD_READ 0x20 #define CF_CMD_WRITE 0x30 static u16 cf_reg_sts, cf_reg_lba1, cf_reg_lba2, cf_reg_lba3, cf_reg_lba4, cf_reg_cmd; static off_t currLBA; static const int lfnPos[13] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; static u32 fileStartLBA,fileEndLBA; static std::string sFlashPath; static BOOL cflashDeviceEnabled = FALSE; static EMUFILE* file = NULL; // =========================== BOOL inited; enum EListCallbackArg { EListCallbackArg_Item, EListCallbackArg_Pop }; static BOOL cflash_init() { if (inited) return FALSE; BOOL init_good = FALSE; CFLASHLOG("CFlash_Mode: %d\n",CFlash_Mode); if (CFlash_Mode == ADDON_CFLASH_MODE_RomPath) { sFlashPath = path.RomDirectory; INFO("Using CFlash directory of rom: %s\n", sFlashPath.c_str()); } else if(CFlash_Mode == ADDON_CFLASH_MODE_Path) { sFlashPath = CFlash_Path; INFO("Using CFlash directory: %s\n", sFlashPath.c_str()); } else if(CFlash_Mode == ADDON_CFLASH_MODE_File) { sFlashPath = CFlash_Path; INFO("Using CFlash disk image file %s\n", sFlashPath.c_str()); } else { return FALSE; } if (sFlashPath == "") return FALSE; if(CFlash_IsUsingPath()) { cflashDeviceEnabled = FALSE; currLBA = 0; fileStartLBA = fileEndLBA = 0xFFFFFFFF; VFAT vfat; bool ret = vfat.build(sFlashPath.c_str(),16); //allocate 16MB extra for writing. this is probably enough for anyone, but maybe it should be configurable. //we could always suggest to users to add a big file to their directory to overwrite (that would cause the image to get padded) if(!ret) { CFLASHLOG("FAILED cflash_build_fat\n"); return FALSE; } file = vfat.detach(); cf_reg_sts = 0x58; // READY cflashDeviceEnabled = TRUE; init_good = TRUE; } else { file = new EMUFILE_FILE(sFlashPath.c_str(),"rb+"); if(file->fail()) { INFO("Failed to open file %s\n", sFlashPath.c_str()); delete file; file = NULL; } } // READY cf_reg_sts = 0x58; currLBA = 0; cf_reg_lba1 = cf_reg_lba2 = cf_reg_lba3 = cf_reg_lba4 = 0; inited = TRUE; return init_good; } static unsigned int cflash_read(unsigned int address) { unsigned int ret_value = 0; size_t elems_read = 0; switch (address) { case CF_REG_STS: ret_value = cf_reg_sts; break; case CF_REG_DATA: if (cf_reg_cmd == CF_CMD_READ) { if(file) { u8 data[2]; file->fseek(currLBA, SEEK_SET); elems_read += file->fread(data,2); ret_value = data[1] << 8 | data[0]; } currLBA += 2; } break; case CF_REG_CMD: break; case CF_REG_LBA1: ret_value = cf_reg_lba1; break; } return ret_value; } static void cflash_write(unsigned int address,unsigned int data) { static u8 sector_data[512]; static u32 sector_write_index = 0; switch (address) { case CF_REG_STS: cf_reg_sts = data&0xFFFF; break; case CF_REG_DATA: if (cf_reg_cmd == CF_CMD_WRITE) { { sector_data[sector_write_index] = (data >> 0) & 0xff; sector_data[sector_write_index + 1] = (data >> 8) & 0xff; sector_write_index += 2; if (sector_write_index == 512) { CFLASHLOG( "Write sector to %ld\n", currLBA); size_t written = 0; if(file) if(currLBA + 512 < file->size()) { file->fseek(currLBA,SEEK_SET); while(written < 512) { size_t todo = 512-written; file->fwrite(§or_data[written], todo); size_t cur_write = todo; written += cur_write; if ( cur_write == (size_t)-1) break; } } CFLASHLOG("Wrote %u bytes\n", written); currLBA += 512; sector_write_index = 0; } } } break; case CF_REG_CMD: cf_reg_cmd = data&0xFF; cf_reg_sts = 0x58; // READY break; case CF_REG_LBA1: cf_reg_lba1 = data&0xFF; currLBA = (currLBA&0xFFFFFF00)| cf_reg_lba1; break; case CF_REG_LBA2: cf_reg_lba2 = data&0xFF; currLBA = (currLBA&0xFFFF00FF)|(cf_reg_lba2<<8); break; case CF_REG_LBA3: cf_reg_lba3 = data&0xFF; currLBA = (currLBA&0xFF00FFFF)|(cf_reg_lba3<<16); break; case CF_REG_LBA4: cf_reg_lba4 = data&0xFF; if ((cf_reg_lba4 & 0xf0) == CF_CMD_LBA) { currLBA = (currLBA&0x00FFFFFF)|((cf_reg_lba4&0x0F)<<24); currLBA *= 512; sector_write_index = 0; } break; } } static void cflash_close( void) { if (!inited) return; if(file) delete file; cflashDeviceEnabled = FALSE; file = NULL; inited = FALSE; } class Slot2_CFlash : public ISlot2Interface { public: virtual Slot2Info const* info() { static Slot2InfoSimple info("MPCF Flash Card Device", "MPCF Flash Card Device", 0x01); return &info; } virtual void connect() { cflash_close(); cflash_init(); } virtual void disconnect() { cflash_close(); } virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) { cflash_write(addr, val); } virtual void writeWord(u8 PROCNUM, u32 addr, u16 val) { cflash_write(addr, val); } virtual void writeLong(u8 PROCNUM, u32 addr, u32 val) { cflash_write(addr, val); } virtual u8 readByte(u8 PROCNUM, u32 addr) { return (cflash_read(addr)); } virtual u16 readWord(u8 PROCNUM, u32 addr) { return (cflash_read(addr)); } virtual u32 readLong(u8 PROCNUM, u32 addr) { return (cflash_read(addr)); } }; ISlot2Interface* construct_Slot2_CFlash() { return new Slot2_CFlash(); } desmume-0.9.11/src/addons/slot1_none.cpp0000755000000000000000000000220412467662066016603 0ustar rootroot/* Copyright (C) 2010-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "../slot1.h" class Slot1_None : public ISlot1Interface { public: virtual Slot1Info const* info() { static Slot1InfoSimple info("None","Slot1 no-card emulation", 0xFF); return &info; } //pretty much every access to the card should just be ignored and reading HIGH-Z off the GC bus. //so, nothing really to do here //(notably, it results in a 0xFFFFFFFF card ID) }; ISlot1Interface* construct_Slot1_None() { return new Slot1_None(); }desmume-0.9.11/src/ctrlssdl.cpp0000755000000000000000000004033712467662066015115 0ustar rootroot/* Copyright (C) 2007 Pascal Giard Copyright (C) 2007-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "ctrlssdl.h" #include "saves.h" #include "SPU.h" #include "commandline.h" #include "NDSSystem.h" #include "GPU_osd.h" #ifdef FAKE_MIC #include "mic.h" #endif u16 keyboard_cfg[NB_KEYS]; u16 joypad_cfg[NB_KEYS]; u16 nbr_joy; mouse_status mouse; static SDL_Joystick **open_joysticks = NULL; /* Keypad key names */ const char *key_names[NB_KEYS] = { "A", "B", "Select", "Start", "Right", "Left", "Up", "Down", "R", "L", "X", "Y", "Debug", "Boost", "Lid", }; /* Joypad Key Codes -- 4-digit Hexadecimal number * 1st digit: device ID (0 is first joypad, 1 is second, etc.) * 2nd digit: 0 - Axis, 1 - Hat/POV/D-Pad, 2 - Button * 3rd & 4th digit: (depends on input type) * Negative Axis - 2 * axis index * Positive Axis - 2 * axis index + 1 * Hat Right - 4 * hat index * Hat Left - 4 * hat index + 1 * Hat Up - 4 * hat index + 2 * Hat Down - 4 * hat index + 3 * Button - button index */ /* Default joypad configuration */ const u16 default_joypad_cfg[NB_KEYS] = { 0x0201, // A 0x0200, // B 0x0205, // select 0x0208, // start 0x0001, // Right 0x0000, // Left 0x0002, // Up 0x0003, // Down 0x0207, // R 0x0206, // L 0x0204, // X 0x0203, // Y 0xFFFF, // DEBUG 0xFFFF, // BOOST 0x0202, // Lid }; /* Load default joystick and keyboard configurations */ void load_default_config(const u16 kbCfg[]) { memcpy(keyboard_cfg, kbCfg, sizeof(keyboard_cfg)); memcpy(joypad_cfg, default_joypad_cfg, sizeof(joypad_cfg)); } /* Set all buttons at once */ static void set_joy_keys(const u16 joyCfg[]) { memcpy(joypad_cfg, joyCfg, sizeof(joypad_cfg)); } /* Initialize joysticks */ BOOL init_joy( void) { int i; BOOL joy_init_good = TRUE; //user asked for no joystick if(_commandline_linux_nojoy) { printf("skipping joystick init\n"); return TRUE; } set_joy_keys(default_joypad_cfg); if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) { fprintf(stderr, "Error trying to initialize joystick support: %s\n", SDL_GetError()); return FALSE; } nbr_joy = SDL_NumJoysticks(); if ( nbr_joy > 0) { printf("Found %d joysticks\n", nbr_joy); open_joysticks = (SDL_Joystick**)calloc( sizeof ( SDL_Joystick *), nbr_joy); if ( open_joysticks != NULL) { for (i = 0; i < nbr_joy; i++) { SDL_Joystick * joy = SDL_JoystickOpen(i); printf("Joystick %d %s\n", i, SDL_JoystickName(i)); printf("Axes: %d\n", SDL_JoystickNumAxes(joy)); printf("Buttons: %d\n", SDL_JoystickNumButtons(joy)); printf("Trackballs: %d\n", SDL_JoystickNumBalls(joy)); printf("Hats: %d\n\n", SDL_JoystickNumHats(joy)); } } else { joy_init_good = FALSE; } } return joy_init_good; } /* Unload joysticks */ void uninit_joy( void) { int i; if ( open_joysticks != NULL) { for (i = 0; i < SDL_NumJoysticks(); i++) { SDL_JoystickClose( open_joysticks[i]); } free( open_joysticks); } open_joysticks = NULL; SDL_QuitSubSystem(SDL_INIT_JOYSTICK); } /* Return keypad vector with given key set to 1 */ u16 lookup_joy_key (u16 keyval) { int i; u16 Key = 0; for(i = 0; i < NB_KEYS; i++) if(keyval == joypad_cfg[i]) { Key = KEYMASK_(i); break; } return Key; } /* Return keypad vector with given key set to 1 */ u16 lookup_key (u16 keyval) { int i; u16 Key = 0; for(i = 0; i < NB_KEYS; i++) if(keyval == keyboard_cfg[i]) { Key = KEYMASK_(i); break; } return Key; } /* Get pressed joystick key */ u16 get_joy_key(int index) { BOOL done = FALSE; SDL_Event event; u16 key = joypad_cfg[index]; /* Enable joystick events if needed */ if( SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE ) SDL_JoystickEventState(SDL_ENABLE); while(SDL_WaitEvent(&event) && !done) { switch(event.type) { case SDL_JOYBUTTONDOWN: printf( "Device: %d; Button: %d\n", event.jbutton.which, event.jbutton.button ); key = ((event.jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event.jbutton.button & 255); done = TRUE; break; case SDL_JOYAXISMOTION: /* Dead zone of 50% */ if( (abs(event.jaxis.value) >> 14) != 0 ) { key = ((event.jaxis.which & 15) << 12) | JOY_AXIS << 8 | ((event.jaxis.axis & 127) << 1); if (event.jaxis.value > 0) { printf( "Device: %d; Axis: %d (+)\n", event.jaxis.which, event.jaxis.axis ); key |= 1; } else printf( "Device: %d; Axis: %d (-)\n", event.jaxis.which, event.jaxis.axis ); done = TRUE; } break; case SDL_JOYHATMOTION: /* Diagonal positions will be treated as two separate keys being activated, rather than a single diagonal key. */ /* JOY_HAT_* are sequential integers, rather than a bitmask */ if (event.jhat.value != SDL_HAT_CENTERED) { key = ((event.jhat.which & 15) << 12) | JOY_HAT << 8 | ((event.jhat.hat & 63) << 2); /* Can't just use a switch here because SDL_HAT_* make up a bitmask. We only want one of these when assigning keys. */ if ((event.jhat.value & SDL_HAT_UP) != 0) { key |= JOY_HAT_UP; printf( "Device: %d; Hat: %d (Up)\n", event.jhat.which, event.jhat.hat ); } else if ((event.jhat.value & SDL_HAT_RIGHT) != 0) { key |= JOY_HAT_RIGHT; printf( "Device: %d; Hat: %d (Right)\n", event.jhat.which, event.jhat.hat ); } else if ((event.jhat.value & SDL_HAT_DOWN) != 0) { key |= JOY_HAT_DOWN; printf( "Device: %d; Hat: %d (Down)\n", event.jhat.which, event.jhat.hat ); } else if ((event.jhat.value & SDL_HAT_LEFT) != 0) { key |= JOY_HAT_LEFT; printf( "Device: %d; Hat: %d (Left)\n", event.jhat.which, event.jhat.hat ); } done = TRUE; } break; } } if( SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE ) SDL_JoystickEventState(SDL_IGNORE); return key; } /* Get and set a new joystick key */ u16 get_set_joy_key(int index) { joypad_cfg[index] = get_joy_key(index); return joypad_cfg[index]; } static signed long screen_to_touch_range( signed long scr, float size_ratio) { return (signed long)((float)scr * size_ratio); } /* Set mouse coordinates */ static void set_mouse_coord(signed long x,signed long y) { if(x<0) x = 0; else if(x>255) x = 255; if(y<0) y = 0; else if(y>192) y = 192; mouse.x = x; mouse.y = y; } // Adapted from Windows port bool allowUpAndDown = false; static buttonstruct cardinalHeldTime = {0}; static void RunAntipodalRestriction(const buttonstruct& pad) { if(allowUpAndDown) return; pad.U ? (cardinalHeldTime.U++) : (cardinalHeldTime.U=0); pad.D ? (cardinalHeldTime.D++) : (cardinalHeldTime.D=0); pad.L ? (cardinalHeldTime.L++) : (cardinalHeldTime.L=0); pad.R ? (cardinalHeldTime.R++) : (cardinalHeldTime.R=0); } static void ApplyAntipodalRestriction(buttonstruct& pad) { if(allowUpAndDown) return; // give preference to whichever direction was most recently pressed if(pad.U && pad.D) if(cardinalHeldTime.U < cardinalHeldTime.D) pad.D = false; else pad.U = false; if(pad.L && pad.R) if(cardinalHeldTime.L < cardinalHeldTime.R) pad.R = false; else pad.L = false; } /* Update NDS keypad */ void update_keypad(u16 keys) { // Set raw inputs { buttonstruct input = {}; input.G = (keys>>12)&1; input.E = (keys>>8)&1; input.W = (keys>>9)&1; input.X = (keys>>10)&1; input.Y = (keys>>11)&1; input.A = (keys>>0)&1; input.B = (keys>>1)&1; input.S = (keys>>3)&1; input.T = (keys>>2)&1; input.U = (keys>>6)&1; input.D = (keys>>7)&1; input.L = (keys>>5)&1; input.R = (keys>>4)&1; input.F = (keys>>14)&1; RunAntipodalRestriction(input); NDS_setPad( input.R, input.L, input.D, input.U, input.T, input.S, input.B, input.A, input.Y, input.X, input.W, input.E, input.G, input.F); } // Set real input NDS_beginProcessingInput(); { UserButtons& input = NDS_getProcessingUserInput().buttons; ApplyAntipodalRestriction(input); } NDS_endProcessingInput(); } /* Retrieve current NDS keypad */ u16 get_keypad( void) { u16 keypad; keypad = ~MMU.ARM7_REG[0x136]; keypad = (keypad & 0x3) << 10; #ifdef WORDS_BIGENDIAN keypad |= ~(MMU.ARM9_REG[0x130] | (MMU.ARM9_REG[0x131] << 8)) & 0x3FF; #else keypad |= ~((u16 *)MMU.ARM9_REG)[0x130>>1] & 0x3FF; #endif return keypad; } /* * The internal joystick events processing function */ static int do_process_joystick_events( u16 *keypad, SDL_Event *event) { int processed = 1; u16 key_code; u16 key; u16 key_o; u16 key_u; u16 key_r; u16 key_d; u16 key_l; switch ( event->type) { /* Joystick axis motion Note: button constants have a 1bit offset. */ case SDL_JOYAXISMOTION: key_code = ((event->jaxis.which & 15) << 12) | JOY_AXIS << 8 | ((event->jaxis.axis & 127) << 1); if( (abs(event->jaxis.value) >> 14) != 0 ) { if (event->jaxis.value > 0) key_code |= 1; key = lookup_joy_key( key_code ); key_o = lookup_joy_key( key_code ^ 1 ); if (key != 0) ADD_KEY( *keypad, key ); if (key_o != 0) RM_KEY( *keypad, key_o ); } else { // Axis is zeroed key = lookup_joy_key( key_code ); key_o = lookup_joy_key( key_code ^ 1 ); if (key != 0) RM_KEY( *keypad, key ); if (key_o != 0) RM_KEY( *keypad, key_o ); } break; case SDL_JOYHATMOTION: /* Diagonal positions will be treated as two separate keys being activated, rather than a single diagonal key. */ /* JOY_HAT_* are sequential integers, rather than a bitmask */ key_code = ((event->jhat.which & 15) << 12) | JOY_HAT << 8 | ((event->jhat.hat & 63) << 2); key_u = lookup_joy_key( key_code | JOY_HAT_UP ); key_r = lookup_joy_key( key_code | JOY_HAT_RIGHT ); key_d = lookup_joy_key( key_code | JOY_HAT_DOWN ); key_l = lookup_joy_key( key_code | JOY_HAT_LEFT ); if ((key_u != 0) && ((event->jhat.value & SDL_HAT_UP) != 0)) ADD_KEY( *keypad, key_u ); else if (key_u != 0) RM_KEY( *keypad, key_u ); if ((key_r != 0) && ((event->jhat.value & SDL_HAT_RIGHT) != 0)) ADD_KEY( *keypad, key_r ); else if (key_r != 0) RM_KEY( *keypad, key_r ); if ((key_d != 0) && ((event->jhat.value & SDL_HAT_DOWN) != 0)) ADD_KEY( *keypad, key_d ); else if (key_d != 0) RM_KEY( *keypad, key_d ); if ((key_l != 0) && ((event->jhat.value & SDL_HAT_LEFT) != 0)) ADD_KEY( *keypad, key_l ); else if (key_l != 0) RM_KEY( *keypad, key_l ); break; /* Joystick button pressed */ /* FIXME: Add support for BOOST */ case SDL_JOYBUTTONDOWN: key_code = ((event->jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event->jbutton.button & 255); key = lookup_joy_key( key_code ); if (key != 0) ADD_KEY( *keypad, key ); break; /* Joystick button released */ case SDL_JOYBUTTONUP: key_code = ((event->jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event->jbutton.button & 255); key = lookup_joy_key( key_code ); if (key != 0) RM_KEY( *keypad, key ); break; default: processed = 0; break; } return processed; } /* * Process only the joystick events */ void process_joystick_events( u16 *keypad) { SDL_Event event; /* IMPORTANT: Reenable joystick events if needed. */ if(SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE) SDL_JoystickEventState(SDL_ENABLE); /* There's an event waiting to be processed? */ while (SDL_PollEvent(&event)) { do_process_joystick_events( keypad, &event); } } u16 shift_pressed; void process_ctrls_event( SDL_Event& event, struct ctrls_event_config *cfg) { u16 key; if ( !do_process_joystick_events( &cfg->keypad, &event)) { switch (event.type) { case SDL_VIDEORESIZE: cfg->resize_cb( event.resize.w, event.resize.h, cfg->screen_texture); break; case SDL_ACTIVEEVENT: if (cfg->auto_pause && (event.active.state & SDL_APPINPUTFOCUS )) { if (event.active.gain) { cfg->focused = 1; SPU_Pause(0); osd->addLine("Auto pause disabled"); } else { cfg->focused = 0; SPU_Pause(1); } } break; case SDL_KEYDOWN: switch(event.key.keysym.sym){ case SDLK_LSHIFT: shift_pressed |= 1; break; case SDLK_RSHIFT: shift_pressed |= 2; break; default: key = lookup_key(event.key.keysym.sym); ADD_KEY( cfg->keypad, key ); break; } break; case SDL_KEYUP: switch(event.key.keysym.sym){ case SDLK_ESCAPE: cfg->sdl_quit = 1; break; #ifdef FAKE_MIC case SDLK_m: cfg->fake_mic = !cfg->fake_mic; Mic_DoNoise(cfg->fake_mic); if (cfg->fake_mic) osd->addLine("Fake mic enabled"); else osd->addLine("Fake mic disabled"); break; #endif case SDLK_o: cfg->boost = !cfg->boost; if (cfg->boost) osd->addLine("Boost mode enabled"); else osd->addLine("Boost mode disabled"); break; case SDLK_LSHIFT: shift_pressed &= ~1; break; case SDLK_RSHIFT: shift_pressed &= ~2; break; case SDLK_F1: case SDLK_F2: case SDLK_F3: case SDLK_F4: case SDLK_F5: case SDLK_F6: case SDLK_F7: case SDLK_F8: case SDLK_F9: case SDLK_F10: int prevexec; prevexec = execute; execute = FALSE; SPU_Pause(1); if(!shift_pressed){ loadstate_slot(event.key.keysym.sym - SDLK_F1 + 1); }else{ savestate_slot(event.key.keysym.sym - SDLK_F1 + 1); } execute = prevexec; SPU_Pause(!execute); break; default: key = lookup_key(event.key.keysym.sym); RM_KEY( cfg->keypad, key ); break; } break; case SDL_MOUSEBUTTONDOWN: if(event.button.button==1) mouse.down = TRUE; case SDL_MOUSEMOTION: if(!mouse.down) break; else { signed long scaled_x = screen_to_touch_range( event.button.x, cfg->nds_screen_size_ratio); signed long scaled_y = screen_to_touch_range( event.button.y, cfg->nds_screen_size_ratio); if( scaled_y >= 192) set_mouse_coord( scaled_x, scaled_y - 192); } break; case SDL_MOUSEBUTTONUP: if(mouse.down) mouse.click = TRUE; mouse.down = FALSE; break; case SDL_QUIT: cfg->sdl_quit = 1; break; default: break; } } } desmume-0.9.11/src/arm_jit.h0000755000000000000000000000514612467662066014354 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt Copyright (C) 2012-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef ARM_JIT #define ARM_JIT #include "types.h" #ifndef _MSC_VER #include #endif typedef u32 (FASTCALL* ArmOpCompiled)(); void arm_jit_reset(bool enable, bool suppress_msg = false); void arm_jit_close(); void arm_jit_sync(); template u32 arm_jit_compile(); #if defined(HOST_WINDOWS) || defined(DESMUME_COCOA) #define MAPPED_JIT_FUNCS #endif #ifdef MAPPED_JIT_FUNCS struct JIT_struct { // only include the memory types that code can execute from uintptr_t MAIN_MEM[16*1024*1024/2]; uintptr_t SWIRAM[0x8000/2]; uintptr_t ARM9_ITCM[0x8000/2]; uintptr_t ARM9_LCDC[0xA4000/2]; uintptr_t ARM9_BIOS[0x8000/2]; uintptr_t ARM7_BIOS[0x4000/2]; uintptr_t ARM7_ERAM[0x10000/2]; uintptr_t ARM7_WIRAM[0x10000/2]; uintptr_t ARM7_WRAM[0x40000/2]; static uintptr_t *JIT_MEM[2][0x4000]; }; extern CACHE_ALIGN JIT_struct JIT; #define JIT_COMPILED_FUNC(adr, PROCNUM) JIT.JIT_MEM[PROCNUM][((adr)&0x0FFFC000)>>14][((adr)&0x00003FFE)>>1] #define JIT_COMPILED_FUNC_PREMASKED(adr, PROCNUM, ofs) JIT.JIT_MEM[PROCNUM][(adr)>>14][(((adr)&0x00003FFE)>>1)+ofs] #define JIT_COMPILED_FUNC_KNOWNBANK(adr, bank, mask, ofs) JIT.bank[(((adr)&(mask))>>1)+ofs] #define JIT_MAPPED(adr, PROCNUM) JIT.JIT_MEM[PROCNUM][(adr)>>14] #else // actually an array of function pointers, but they fit in 32bit address space, so might as well save memory extern uintptr_t compiled_funcs[]; // there isn't anything mapped between 07000000 and 0EFFFFFF, so we can mask off bit 27 and get away with a smaller array #define JIT_COMPILED_FUNC(adr, PROCNUM) compiled_funcs[((adr) & 0x07FFFFFE) >> 1] #define JIT_COMPILED_FUNC_PREMASKED(adr, PROCNUM, ofs) JIT_COMPILED_FUNC(adr+(ofs<<1), PROCNUM) #define JIT_COMPILED_FUNC_KNOWNBANK(adr, bank, mask, ofs) JIT_COMPILED_FUNC(adr+(ofs<<1), PROCNUM) #define JIT_MAPPED(adr, PROCNUM) true #endif extern u32 saveBlockSizeJIT; #endif desmume-0.9.11/src/GPU.cpp0000755000000000000000000023056212467662066013717 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 Theo Berkau Copyright (C) 2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "GPU.h" #include #include #include #include #include #include "MMU.h" #include "FIFO.h" #include "debug.h" #include "render3D.h" #include "registers.h" #include "gfx3d.h" #include "debug.h" #include "GPU_osd.h" #include "NDSSystem.h" #include "readwrite.h" #include "matrix.h" #include "emufile.h" #ifdef FASTBUILD #undef FORCEINLINE #define FORCEINLINE //compilation speed hack (cuts time exactly in half by cutting out permutations) #define DISABLE_MOSAIC #endif extern BOOL click; NDS_Screen MainScreen; NDS_Screen SubScreen; //instantiate static instance GPU::MosaicLookup GPU::mosaicLookup; //#define DEBUG_TRI CACHE_ALIGN u8 GPU_screen[4*256*192]; CACHE_ALIGN u8 sprWin[256]; u16 gpu_angle = 0; const size sprSizeTab[4][4] = { {{8, 8}, {16, 8}, {8, 16}, {8, 8}}, {{16, 16}, {32, 8}, {8, 32}, {8, 8}}, {{32, 32}, {32, 16}, {16, 32}, {8, 8}}, {{64, 64}, {64, 32}, {32, 64}, {8, 8}}, }; const BGType GPU_mode2type[8][4] = { {BGType_Text, BGType_Text, BGType_Text, BGType_Text}, {BGType_Text, BGType_Text, BGType_Text, BGType_Affine}, {BGType_Text, BGType_Text, BGType_Affine, BGType_Affine}, {BGType_Text, BGType_Text, BGType_Text, BGType_AffineExt}, {BGType_Text, BGType_Text, BGType_Affine, BGType_AffineExt}, {BGType_Text, BGType_Text, BGType_AffineExt, BGType_AffineExt}, {BGType_Invalid, BGType_Invalid, BGType_Large8bpp, BGType_Invalid}, {BGType_Invalid, BGType_Invalid, BGType_Invalid, BGType_Invalid} }; //dont ever think of changing these to bits because you could avoid the multiplies in the main tile blitter. //it doesnt really help any const short sizeTab[8][4][2] = { {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, //Invalid {{256,256}, {512,256}, {256,512}, {512,512}}, //text {{128,128}, {256,256}, {512,512}, {1024,1024}}, //affine {{512,1024}, {1024,512}, {0,0}, {0,0}}, //large 8bpp {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, //affine ext (to be elaborated with another value) {{128,128}, {256,256}, {512,512}, {1024,1024}}, //affine ext 256x16 {{128,128}, {256,256}, {512,256}, {512,512}}, //affine ext 256x1 {{128,128}, {256,256}, {512,256}, {512,512}}, //affine ext direct }; static const CACHE_ALIGN u8 win_empty[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; static CACHE_ALIGN u16 fadeInColors[17][0x8000]; CACHE_ALIGN u16 fadeOutColors[17][0x8000]; //this should be public, because it gets used somewhere else CACHE_ALIGN u8 gpuBlendTable555[17][17][32][32]; /*****************************************************************************/ // INITIALIZATION /*****************************************************************************/ static void GPU_InitFadeColors() { /* NOTE: gbatek (in the reference above) seems to expect 6bit values per component, but as desmume works with 5bit per component, we use 31 as top, instead of 63. Testing it on a few games, using 63 seems to give severe color wraping, and 31 works nicely, so for now we'll just that, until proven wrong. i have seen pics of pokemon ranger getting white with 31, with 63 it is nice. it could be pb of alpha or blending or... MightyMax> created a test NDS to check how the brightness values work, and 31 seems to be correct. FactorEx is a override for max brighten/darken See: http://mightymax.org/gfx_test_brightness.nds The Pokemon Problem could be a problem with 8/32 bit writes not recognized yet, i'll add that so you can check back. */ for(int i = 0; i <= 16; i++) { for(int j = 0x8000; j < 0x10000; j++) { COLOR cur; cur.val = j; cur.bits.red = (cur.bits.red + ((31 - cur.bits.red) * i / 16)); cur.bits.green = (cur.bits.green + ((31 - cur.bits.green) * i / 16)); cur.bits.blue = (cur.bits.blue + ((31 - cur.bits.blue) * i / 16)); cur.bits.alpha = 0; fadeInColors[i][j & 0x7FFF] = cur.val; cur.val = j; cur.bits.red = (cur.bits.red - (cur.bits.red * i / 16)); cur.bits.green = (cur.bits.green - (cur.bits.green * i / 16)); cur.bits.blue = (cur.bits.blue - (cur.bits.blue * i / 16)); cur.bits.alpha = 0; fadeOutColors[i][j & 0x7FFF] = cur.val; } } for(int c0=0;c0<=31;c0++) for(int c1=0;c1<=31;c1++) for(int eva=0;eva<=16;eva++) for(int evb=0;evb<=16;evb++) { int blend = ((c0 * eva) + (c1 * evb) ) / 16; int final = std::min(31,blend); gpuBlendTable555[eva][evb][c0][c1] = final; } } static CACHE_ALIGN GPU GPU_main, GPU_sub; GPU * GPU_Init(u8 l) { GPU * g; if(l==0) g = &GPU_main; else g = &GPU_sub; GPU_Reset(g, l); GPU_InitFadeColors(); g->curr_win[0] = win_empty; g->curr_win[1] = win_empty; g->need_update_winh[0] = true; g->need_update_winh[1] = true; g->setFinalColorBck_funcNum = 0; g->setFinalColor3d_funcNum = 0; g->setFinalColorSpr_funcNum = 0; return g; } void GPU_Reset(GPU *g, u8 l) { memset(g, 0, sizeof(GPU)); //important for emulator stability for this to initialize, since we have to setup a table based on it g->BLDALPHA_EVA = 0; g->BLDALPHA_EVB = 0; //make sure we have our blend table setup even if the game blends without setting the blend variables g->updateBLDALPHA(); g->setFinalColorBck_funcNum = 0; g->setFinalColor3d_funcNum = 0; g->setFinalColorSpr_funcNum = 0; g->core = l; g->BGSize[0][0] = g->BGSize[1][0] = g->BGSize[2][0] = g->BGSize[3][0] = 256; g->BGSize[0][1] = g->BGSize[1][1] = g->BGSize[2][1] = g->BGSize[3][1] = 256; g->spriteRenderMode = GPU::SPRITE_1D; g->bgPrio[4] = 0xFF; g->bg0HasHighestPrio = TRUE; if(g->core == GPU_SUB) { g->oam = (MMU.ARM9_OAM + ADDRESS_STEP_1KB); g->sprMem = MMU_BOBJ; // GPU core B g->dispx_st = (REG_DISPx*)(&MMU.ARM9_REG[REG_DISPB]); } else { g->oam = (MMU.ARM9_OAM); g->sprMem = MMU_AOBJ; // GPU core A g->dispx_st = (REG_DISPx*)(&MMU.ARM9_REG[0]); } } void GPU_DeInit(GPU * gpu) { if(gpu==&GPU_main || gpu==&GPU_sub) return; free(gpu); } static void GPU_resortBGs(GPU *gpu) { int i, prio; struct _DISPCNT * cnt = &gpu->dispx_st->dispx_DISPCNT.bits; itemsForPriority_t * item; // we don't need to check for windows here... // if we tick boxes, invisible layers become invisible & vice versa #define OP ^ ! // if we untick boxes, layers become invisible //#define OP && gpu->LayersEnable[0] = CommonSettings.dispLayers[gpu->core][0] OP(cnt->BG0_Enable/* && !(cnt->BG0_3D && (gpu->core==0))*/); gpu->LayersEnable[1] = CommonSettings.dispLayers[gpu->core][1] OP(cnt->BG1_Enable); gpu->LayersEnable[2] = CommonSettings.dispLayers[gpu->core][2] OP(cnt->BG2_Enable); gpu->LayersEnable[3] = CommonSettings.dispLayers[gpu->core][3] OP(cnt->BG3_Enable); gpu->LayersEnable[4] = CommonSettings.dispLayers[gpu->core][4] OP(cnt->OBJ_Enable); // KISS ! lower priority first, if same then lower num for (i=0;iitemsForPriority[i]); item->nbBGs=0; item->nbPixelsX=0; } for (i=NB_BG; i>0; ) { i--; if (!gpu->LayersEnable[i]) continue; prio = (gpu->dispx_st)->dispx_BGxCNT[i].bits.Priority; item = &(gpu->itemsForPriority[prio]); item->BGs[item->nbBGs]=i; item->nbBGs++; } int bg0Prio = gpu->dispx_st->dispx_BGxCNT[0].bits.Priority; gpu->bg0HasHighestPrio = TRUE; for(i = 1; i < 4; i++) { if(gpu->LayersEnable[i]) { if(gpu->dispx_st->dispx_BGxCNT[i].bits.Priority < bg0Prio) { gpu->bg0HasHighestPrio = FALSE; break; } } } #if 0 //debug for (i=0;iitemsForPriority[i]); printf("%d : ", i); for (j=0; jnbBGs) printf("BG%d ", item->BGs[j]); else printf("... ", item->BGs[j]); } } printf("\n"); #endif } static FORCEINLINE u16 _blend(u16 colA, u16 colB, GPU::TBlendTable* blendTable) { u8 r = (*blendTable)[colA&0x1F][colB&0x1F]; u8 g = (*blendTable)[(colA>>5)&0x1F][(colB>>5)&0x1F]; u8 b = (*blendTable)[(colA>>10)&0x1F][(colB>>10)&0x1F]; return r|(g<<5)|(b<<10); } FORCEINLINE u16 GPU::blend(u16 colA, u16 colB) { return _blend(colA, colB, blendTable); } void GPU_setMasterBrightness (GPU *gpu, u16 val) { if(!nds.isInVblank()) { PROGINFO("Changing master brightness outside of vblank\n"); } gpu->MasterBrightFactor = (val & 0x1F); gpu->MasterBrightMode = (val>>14); //printf("MASTER BRIGHTNESS %d to %d at %d\n",gpu->core,gpu->MasterBrightFactor,nds.VCount); } void SetupFinalPixelBlitter (GPU *gpu) { u8 windowUsed = (gpu->WIN0_ENABLED | gpu->WIN1_ENABLED | gpu->WINOBJ_ENABLED); u8 blendMode = (gpu->BLDCNT >> 6)&3; gpu->setFinalColorSpr_funcNum = windowUsed*4 + blendMode; gpu->setFinalColorBck_funcNum = windowUsed*4 + blendMode; gpu->setFinalColor3d_funcNum = windowUsed*4 + blendMode; } //Sets up LCD control variables for Display Engines A and B for quick reading void GPU_setVideoProp(GPU * gpu, u32 p) { struct _DISPCNT * cnt; cnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; T1WriteLong((u8 *)&(gpu->dispx_st)->dispx_DISPCNT.val, 0, p); gpu->WIN0_ENABLED = cnt->Win0_Enable; gpu->WIN1_ENABLED = cnt->Win1_Enable; gpu->WINOBJ_ENABLED = cnt->WinOBJ_Enable; SetupFinalPixelBlitter (gpu); gpu->dispMode = cnt->DisplayMode & ((gpu->core)?1:3); gpu->vramBlock = cnt->VRAM_Block; switch (gpu->dispMode) { case 0: // Display Off break; case 1: // Display BG and OBJ layers break; case 2: // Display framebuffer gpu->VRAMaddr = (u8 *)MMU.ARM9_LCD + (gpu->vramBlock * 0x20000); break; case 3: // Display from Main RAM // nothing to be done here // see GPU_RenderLine who gets data from FIFO. break; } if(cnt->OBJ_Tile_mapping) { //1-d sprite mapping boundaries: //32k, 64k, 128k, 256k gpu->sprBoundary = 5 + cnt->OBJ_Tile_1D_Bound ; //do not be deceived: even though a sprBoundary==8 (256KB region) is impossible to fully address //in GPU_SUB, it is still fully legal to address it with that granularity. //so don't do this: //if((gpu->core == GPU_SUB) && (cnt->OBJ_Tile_1D_Bound == 3)) gpu->sprBoundary = 7; gpu->spriteRenderMode = GPU::SPRITE_1D; } else { //2d sprite mapping //boundary : 32k gpu->sprBoundary = 5; gpu->spriteRenderMode = GPU::SPRITE_2D; } if(cnt->OBJ_BMP_1D_Bound && (gpu->core == GPU_MAIN)) gpu->sprBMPBoundary = 8; else gpu->sprBMPBoundary = 7; gpu->sprEnable = cnt->OBJ_Enable; GPU_setBGProp(gpu, 3, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 14)); GPU_setBGProp(gpu, 2, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 12)); GPU_setBGProp(gpu, 1, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 10)); GPU_setBGProp(gpu, 0, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 8)); //GPU_resortBGs(gpu); } //this handles writing in BGxCNT void GPU_setBGProp(GPU * gpu, u16 num, u16 p) { struct _BGxCNT * cnt = &((gpu->dispx_st)->dispx_BGxCNT[num].bits); struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; T1WriteWord((u8 *)&(gpu->dispx_st)->dispx_BGxCNT[num].val, 0, p); GPU_resortBGs(gpu); if(gpu->core == GPU_SUB) { gpu->BG_tile_ram[num] = MMU_BBG; gpu->BG_bmp_ram[num] = MMU_BBG; gpu->BG_bmp_large_ram[num] = MMU_BBG; gpu->BG_map_ram[num] = MMU_BBG; } else { gpu->BG_tile_ram[num] = MMU_ABG + dispCnt->CharacBase_Block * ADDRESS_STEP_64KB ; gpu->BG_bmp_ram[num] = MMU_ABG; gpu->BG_bmp_large_ram[num] = MMU_ABG; gpu->BG_map_ram[num] = MMU_ABG + dispCnt->ScreenBase_Block * ADDRESS_STEP_64KB; } gpu->BG_tile_ram[num] += (cnt->CharacBase_Block * ADDRESS_STEP_16KB); gpu->BG_bmp_ram[num] += (cnt->ScreenBase_Block * ADDRESS_STEP_16KB); gpu->BG_map_ram[num] += (cnt->ScreenBase_Block * ADDRESS_STEP_2KB); switch(num) { case 0: case 1: gpu->BGExtPalSlot[num] = cnt->PaletteSet_Wrap * 2 + num ; break; default: gpu->BGExtPalSlot[num] = (u8)num; break; } BGType mode = GPU_mode2type[dispCnt->BG_Mode][num]; //clarify affine ext modes if(mode == BGType_AffineExt) { //see: http://nocash.emubase.de/gbatek.htm#dsvideobgmodescontrol u8 affineModeSelection = (cnt->Palette_256 << 1) | (cnt->CharacBase_Block & 1) ; switch(affineModeSelection) { case 0: case 1: mode = BGType_AffineExt_256x16; break; case 2: mode = BGType_AffineExt_256x1; break; case 3: mode = BGType_AffineExt_Direct; break; } } gpu->BGTypes[num] = mode; gpu->BGSize[num][0] = sizeTab[mode][cnt->ScreenSize][0]; gpu->BGSize[num][1] = sizeTab[mode][cnt->ScreenSize][1]; gpu->bgPrio[num] = (p & 0x3); } /*****************************************************************************/ // ENABLING / DISABLING LAYERS /*****************************************************************************/ void GPU_remove(GPU * gpu, u8 num) { CommonSettings.dispLayers[gpu->core][num] = false; GPU_resortBGs(gpu); } void GPU_addBack(GPU * gpu, u8 num) { CommonSettings.dispLayers[gpu->core][num] = true; GPU_resortBGs(gpu); } /*****************************************************************************/ // ROUTINES FOR INSIDE / OUTSIDE WINDOW CHECKS /*****************************************************************************/ template FORCEINLINE u8 GPU::withinRect(u16 x) const { assert(x<256); //only way to be >256 is in debug views, and mosaic shouldnt be enabled for those return curr_win[WIN_NUM][x]; } // Now assumes that *draw and *effect are different from 0 when called, so we can avoid // setting some values twice FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) const { // Check if win0 if enabled, and only check if it is // howevever, this has already been taken care of by the window precalculation //if (WIN0_ENABLED) { // it is in win0, do we display ? // high priority if (withinRect<0>(x)) { //INFO("bg%i passed win0 : (%i %i) was within (%i %i)(%i %i)\n", bgnum, x, gpu->currLine, gpu->WIN0H0, gpu->WIN0V0, gpu->WIN0H1, gpu->WIN0V1); draw = (WININ0 >> currBgNum)&1; effect = (WININ0_SPECIAL); return; } } // Check if win1 if enabled, and only check if it is //if (WIN1_ENABLED) // howevever, this has already been taken care of by the window precalculation { // it is in win1, do we display ? // mid priority if(withinRect<1>(x)) { //INFO("bg%i passed win1 : (%i %i) was within (%i %i)(%i %i)\n", bgnum, x, gpu->currLine, gpu->WIN1H0, gpu->WIN1V0, gpu->WIN1H1, gpu->WIN1V1); draw = (WININ1 >> currBgNum)&1; effect = (WININ1_SPECIAL); return; } } //if(true) //sprwin test hack if (WINOBJ_ENABLED) { // it is in winOBJ, do we display ? // low priority if (sprWin[x]) { draw = (WINOBJ >> currBgNum)&1; effect = (WINOBJ_SPECIAL); return; } } if (WINOBJ_ENABLED | WIN1_ENABLED | WIN0_ENABLED) { draw = (WINOUT >> currBgNum) & 1; effect = (WINOUT_SPECIAL); } } /*****************************************************************************/ // PIXEL RENDERING /*****************************************************************************/ template FORCEINLINE FASTCALL void GPU::_master_setFinal3dColor(int dstX, int srcX) { int x = dstX; int passing = dstX<<1; u8* color = &_3dColorLine[srcX<<2]; u8 red = color[0]; u8 green = color[1]; u8 blue = color[2]; u8 alpha = color[3]; u8* dst = currDst; u16 final; bool windowEffect = blend1; //bomberman land touch dialogbox will fail without setting to blend1 //TODO - should we do an alpha==0 -> bail out entirely check here? if(WINDOW) { bool windowDraw = false; renderline_checkWindows(dstX, windowDraw, windowEffect); //we never have anything more to do if the window rejected us if(!windowDraw) return; } int bg_under = bgPixels[dstX]; if(blend2[bg_under]) { alpha++; if(alpha<32) { //if the layer underneath is a blend bottom layer, then 3d always alpha blends with it COLOR c2, cfinal; c2.val = HostReadWord(dst, passing); cfinal.bits.red = ((red * alpha) + ((c2.bits.red<<1) * (32 - alpha)))>>6; cfinal.bits.green = ((green * alpha) + ((c2.bits.green<<1) * (32 - alpha)))>>6; cfinal.bits.blue = ((blue * alpha) + ((c2.bits.blue<<1) * (32 - alpha)))>>6; final = cfinal.val; } else final = R6G6B6TORGB15(red,green,blue); } else { final = R6G6B6TORGB15(red,green,blue); //perform the special effect if(windowEffect) switch(FUNC) { case Increase: final = currentFadeInColors[final&0x7FFF]; break; case Decrease: final = currentFadeOutColors[final&0x7FFF]; break; case NoBlend: case Blend: break; } } HostWriteWord(dst, passing, (final | 0x8000)); bgPixels[x] = 0; } template FORCEINLINE FASTCALL bool GPU::_master_setFinalBGColor(u16 &color, const u32 x) { //no further analysis for no special effects. on backdrops. just draw it. if(FUNC==NoBlend && BACKDROP) return true; //blend backdrop with what?? this doesn't make sense if(FUNC==Blend && BACKDROP) return true; bool windowEffect = true; if(WINDOW) { bool windowDraw = false; renderline_checkWindows(x, windowDraw, windowEffect); //backdrop must always be drawn if(BACKDROP) windowDraw = true; //we never have anything more to do if the window rejected us if(!windowDraw) return false; } //special effects rejected. just draw it. if(!(blend1 && windowEffect)) return true; const u8 bg_under = bgPixels[x]; //perform the special effect switch(FUNC) { case Blend: if(blend2[bg_under]) color = blend(color,HostReadWord(currDst, x<<1)); break; case Increase: color = currentFadeInColors[color]; break; case Decrease: color = currentFadeOutColors[color]; break; case NoBlend: break; } return true; } template static FORCEINLINE void _master_setFinalOBJColor(GPU *gpu, u8 *dst, u16 color, u8 alpha, u8 type, u16 x) { const bool isObjTranslucentType = type == GPU_OBJ_MODE_Transparent || type == GPU_OBJ_MODE_Bitmap; bool windowDraw = true; bool windowEffectSatisfied = true; if(WINDOW) { gpu->renderline_checkWindows(x, windowDraw, windowEffectSatisfied); if(!windowDraw) return; } //if the window effect is satisfied, then we can do color effects to modify the color if(windowEffectSatisfied) { const bool firstTargetSatisfied = gpu->blend1; const int bg_under = gpu->bgPixels[x]; const bool secondTargetSatisfied = (bg_under != 4) && gpu->blend2[bg_under]; BlendFunc selectedFunc = NoBlend; int eva = gpu->BLDALPHA_EVA, evb = gpu->BLDALPHA_EVB; //if normal BLDCNT layer target conditions are met, then we can use the BLDCNT-specified color effect if(FUNC == Blend) { //blending requires first and second target screens to be satisfied if(firstTargetSatisfied && secondTargetSatisfied) selectedFunc = FUNC; } else { //brightness up and down requires only the first target screen to be satisfied if(firstTargetSatisfied) selectedFunc = FUNC; } //translucent-capable OBJ are forcing the function to blend when the second target is satisfied if(isObjTranslucentType && secondTargetSatisfied) { selectedFunc = Blend; //obj without fine-grained alpha are using EVA/EVB for blending. this is signified by receiving 255 in the alpha //it's tested by the spriteblend demo and the glory of heracles title screen if(alpha != 255) { eva = alpha; evb = 16 - alpha; } } switch(selectedFunc) { case NoBlend: break; case Increase: color = gpu->currentFadeInColors[color&0x7FFF]; break; case Decrease: color = gpu->currentFadeOutColors[color&0x7FFF]; break; case Blend: u16 backColor = HostReadWord(dst,x<<1); color = _blend(color,backColor,&gpuBlendTable555[eva][evb]); break; } } HostWriteWord(dst, x<<1, (color | 0x8000)); gpu->bgPixels[x] = 4; } //FUNCNUM is only set for backdrop, for an optimization of looking it up early template FORCEINLINE void GPU::setFinalColorBG(u16 color, const u32 x) { //It is not safe to assert this here. //This is probably the best place to enforce it, since almost every single color that comes in here //will be pulled from a palette that needs the top bit stripped off anyway. //assert((color&0x8000)==0); if(!BACKDROP) color &= 0x7FFF; //but for the backdrop we can easily guarantee earlier that theres no bit here bool draw; const int test = BACKDROP?FUNCNUM:setFinalColorBck_funcNum; switch(test) { case 0: draw = _master_setFinalBGColor(color,x); break; case 1: draw = _master_setFinalBGColor(color,x); break; case 2: draw = _master_setFinalBGColor(color,x); break; case 3: draw = _master_setFinalBGColor(color,x); break; case 4: draw = _master_setFinalBGColor(color,x); break; case 5: draw = _master_setFinalBGColor(color,x); break; case 6: draw = _master_setFinalBGColor(color,x); break; case 7: draw = _master_setFinalBGColor(color,x); break; default: draw = false; break; }; if(BACKDROP || draw) //backdrop must always be drawn { HostWriteWord(currDst, x<<1, color | 0x8000); if(!BACKDROP) bgPixels[x] = currBgNum; //lets do this in the backdrop drawing loop, should be faster } } FORCEINLINE void GPU::setFinalColor3d(int dstX, int srcX) { switch(setFinalColor3d_funcNum) { case 0x0: _master_setFinal3dColor(dstX,srcX); break; case 0x1: _master_setFinal3dColor(dstX,srcX); break; case 0x2: _master_setFinal3dColor(dstX,srcX); break; case 0x3: _master_setFinal3dColor(dstX,srcX); break; case 0x4: _master_setFinal3dColor(dstX,srcX); break; case 0x5: _master_setFinal3dColor(dstX,srcX); break; case 0x6: _master_setFinal3dColor(dstX,srcX); break; case 0x7: _master_setFinal3dColor(dstX,srcX); break; }; } FORCEINLINE void setFinalColorSpr(GPU* gpu, u8 *dst, u16 color, u8 alpha, u8 type, u16 x) { switch(gpu->setFinalColorSpr_funcNum) { case 0x0: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x1: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x2: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x3: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x4: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x5: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x6: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x7: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; }; } template FORCEINLINE void GPU::__setFinalColorBck(u16 color, const u32 x, const int opaque) { return ___setFinalColorBck(color,x,opaque); } //this was forced inline because most of the time it just falls through to setFinalColorBck() and the function call //overhead was ridiculous and terrible template FORCEINLINE void GPU::___setFinalColorBck(u16 color, const u32 x, const int opaque) { //under ordinary circumstances, nobody should pass in something >=256 //but in fact, someone is going to try. specifically, that is the map viewer debug tools //which try to render the enter BG. in cases where that is large, it could be up to 1024 wide. assert(debug || x<256); int x_int; //due to this early out, we will get incorrect behavior in cases where //we enable mosaic in the middle of a frame. this is deemed unlikely. if(!MOSAIC) { if(opaque) goto finish; else return; } if(!opaque) color = 0xFFFF; else color &= 0x7FFF; //due to the early out, enabled must always be true //x_int = enabled ? GPU::mosaicLookup.width[x].trunc : x; x_int = GPU::mosaicLookup.width[x].trunc; if(GPU::mosaicLookup.width[x].begin && GPU::mosaicLookup.height[currLine].begin) {} else color = mosaicColors.bg[currBgNum][x_int]; mosaicColors.bg[currBgNum][x] = color; if(color != 0xFFFF) { finish: setFinalColorBG(color,x); } } //unpacks an _OAM_ structure from the provided oam buffer (should point at OAM 0) and provided OAM index. //is endian-safe void SlurpOAM(_OAM_* oam_output, void* oam_buffer, int oam_index) { u16* u16_oam_buffer = (u16*)oam_buffer; int u16_offset = oam_index<<2; u16 attr[4]; for(int i=0;i<4;i++) attr[i] = LE_TO_LOCAL_16(u16_oam_buffer[u16_offset + i]); oam_output->Y = (attr[0]>>0) & 0xFF; oam_output->RotScale = (attr[0]>>8)&3; oam_output->Mode = (attr[0]>>10)&3; oam_output->Mosaic = (attr[0]>>12)&1; oam_output->Depth = (attr[0]>>13)&1; oam_output->Shape = (attr[0]>>14)&3; oam_output->X = (((s32)((attr[1]>>0)&0x1FF))<<23)>>23; oam_output->RotScalIndex = (attr[1]>>9)&7; oam_output->HFlip = (attr[1]>>12)&1; oam_output->VFlip = (attr[1]>>13)&1; oam_output->Size = (attr[1]>>14)&3; oam_output->TileIndex = (attr[2]>>0)&0x3FF; oam_output->Priority = (attr[2]>>10)&3; oam_output->PaletteIndex = (attr[2]>>12)&0xF; oam_output->attr3 = attr[3]; } //gets the affine parameter associated with the specified oam index. u16 SlurpOAMAffineParam(void* oam_buffer, int oam_index) { u16* u16_oam_buffer = (u16*)oam_buffer; int u16_offset = oam_index<<2; return LE_TO_LOCAL_16(u16_oam_buffer[u16_offset + 3]); } //this is fantastically inaccurate. //we do the early return even though it reduces the resulting accuracy //because we need the speed, and because it is inaccurate anyway static void mosaicSpriteLinePixel(GPU * gpu, int x, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { int x_int; int y = l; _OAM_ spriteInfo; SlurpOAM(&spriteInfo,gpu->oam,gpu->sprNum[x]); bool enabled = spriteInfo.Mosaic!=0; if(!enabled) return; bool opaque = prioTab[x] <= 4; GPU::MosaicColor::Obj objColor; objColor.color = T1ReadWord(dst,x<<1); objColor.alpha = dst_alpha[x]; objColor.opaque = opaque; x_int = enabled ? GPU::mosaicLookup.width[x].trunc : x; if(enabled) { if(GPU::mosaicLookup.width[x].begin && GPU::mosaicLookup.height[y].begin) {} else objColor = gpu->mosaicColors.obj[x_int]; } gpu->mosaicColors.obj[x] = objColor; T1WriteWord(dst,x<<1,objColor.color); dst_alpha[x] = objColor.alpha; if(!objColor.opaque) prioTab[x] = 0xFF; } FORCEINLINE static void mosaicSpriteLine(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { //don't even try this unless the mosaic is effective if(gpu->mosaicLookup.widthValue != 0 || gpu->mosaicLookup.heightValue != 0) for(int i=0;i<256;i++) mosaicSpriteLinePixel(gpu,i,l,dst,dst_alpha,typeTab,prioTab); } template void lineLarge8bpp(GPU * gpu) { if(gpu->core == 1) { PROGINFO("Cannot use large 8bpp screen on sub core\n"); return; } u8 num = gpu->currBgNum; u16 XBG = gpu->getHOFS(gpu->currBgNum); u16 YBG = gpu->currLine + gpu->getVOFS(gpu->currBgNum); u16 lg = gpu->BGSize[num][0]; u16 ht = gpu->BGSize[num][1]; u16 wmask = (lg-1); u16 hmask = (ht-1); YBG &= hmask; //TODO - handle wrapping / out of bounds correctly from rot_scale_op? u32 tmp_map = gpu->BG_bmp_large_ram[num] + lg * YBG; u8* map = (u8 *)MMU_gpu_map(tmp_map); u8* pal = MMU.ARM9_VMEM + gpu->core * ADDRESS_STEP_1KB; for(int x = 0; x < lg; ++x, ++XBG) { XBG &= wmask; u8 pixel = map[XBG]; u16 color = T1ReadWord(pal, pixel<<1); gpu->__setFinalColorBck(color,x,color); } } /*****************************************************************************/ // BACKGROUND RENDERING -TEXT- /*****************************************************************************/ // render a text background to the combined pixelbuffer template INLINE void renderline_textBG(GPU * gpu, u16 XBG, u16 YBG, u16 LG) { u8 num = gpu->currBgNum; struct _BGxCNT *bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[num].bits; struct _DISPCNT *dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; u16 lg = gpu->BGSize[num][0]; u16 ht = gpu->BGSize[num][1]; u16 wmask = (lg-1); u16 hmask = (ht-1); u16 tmp = ((YBG & hmask) >> 3); u32 map; u8 *pal, *line; u32 tile; u16 color; u16 xoff; u16 yoff; u32 x = 0; u32 xfin; s8 line_dir = 1; u32 mapinfo; TILEENTRY tileentry; u32 tmp_map = gpu->BG_map_ram[num] + (tmp&31) * 64; if(tmp>31) tmp_map+= ADDRESS_STEP_512B << bgCnt->ScreenSize ; map = tmp_map; tile = gpu->BG_tile_ram[num]; xoff = XBG; pal = MMU.ARM9_VMEM + gpu->core * ADDRESS_STEP_1KB; if(!bgCnt->Palette_256) // color: 16 palette entries { yoff = ((YBG&7)<<2); xfin = 8 - (xoff&7); for(x = 0; x < LG; xfin = std::min(x+8, LG)) { u16 tilePalette = 0; tmp = ((xoff&wmask)>>3); mapinfo = map + (tmp&0x1F) * 2; if(tmp>31) mapinfo += 32*32*2; tileentry.val = T1ReadWord(MMU_gpu_map(mapinfo), 0); tilePalette = (tileentry.bits.Palette*16); line = (u8*)MMU_gpu_map(tile + (tileentry.bits.TileNum * 0x20) + ((tileentry.bits.VFlip) ? (7*4)-yoff : yoff)); if(tileentry.bits.HFlip) { line += (3 - ((xoff&7)>>1)); for(; x < xfin; line --) { u8 currLine = *line; if(!(xoff&1)) { color = T1ReadWord(pal, ((currLine>>4) + tilePalette) << 1); gpu->__setFinalColorBck(color,x,currLine>>4); x++; xoff++; } if(x__setFinalColorBck(color,x,currLine&0xF); x++; xoff++; } } } else { line += ((xoff&7)>>1); for(; x < xfin; line ++) { u8 currLine = *line; if(!(xoff&1)) { color = T1ReadWord(pal, ((currLine&0xF) + tilePalette) << 1); gpu->__setFinalColorBck(color,x,currLine&0xF); x++; xoff++; } if(x>4) + tilePalette) << 1); gpu->__setFinalColorBck(color,x,currLine>>4); x++; xoff++; } } } } return; } //256-color BG if(dispCnt->ExBGxPalette_Enable) // color: extended palette { pal = MMU.ExtPal[gpu->core][gpu->BGExtPalSlot[num]]; if(!pal) return; } yoff = ((YBG&7)<<3); u8* tilePal; xfin = 8 - (xoff&7); u32 extPalMask = -dispCnt->ExBGxPalette_Enable; for(x = 0; x < LG; xfin = std::min(x+8, LG)) { tmp = (xoff & (lg-1))>>3; mapinfo = map + (tmp & 31) * 2; if(tmp > 31) mapinfo += 32*32*2; tileentry.val = T1ReadWord(MMU_gpu_map(mapinfo), 0); tilePal = pal + ((tileentry.bits.Palette<<9)&extPalMask); line = (u8*)MMU_gpu_map(tile + (tileentry.bits.TileNum*0x40) + ((tileentry.bits.VFlip) ? (7*8)-yoff : yoff)); if(tileentry.bits.HFlip) { line += (7 - (xoff&7)); line_dir = -1; } else { line += (xoff&7); line_dir = 1; } for(; x < xfin; ) { color = T1ReadWord(tilePal, (*line) << 1); gpu->__setFinalColorBck(color,x,*line); x++; xoff++; line += line_dir; } } } /*****************************************************************************/ // BACKGROUND RENDERING -ROTOSCALE- /*****************************************************************************/ template FORCEINLINE void rot_tiled_8bit_entry(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { u8 palette_entry; u16 tileindex, x, y, color; tileindex = *(u8*)MMU_gpu_map(map + ((auxX>>3) + (auxY>>3) * (lg>>3))); x = (auxX&7); y = (auxY&7); palette_entry = *(u8*)MMU_gpu_map(tile + ((tileindex<<6)+(y<<3)+x)); color = T1ReadWord(pal, palette_entry << 1); gpu->__setFinalColorBck(color,i,palette_entry); } template FORCEINLINE void rot_tiled_16bit_entry(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { void* const map_addr = MMU_gpu_map(map + (((auxX>>3) + (auxY>>3) * (lg>>3))<<1)); TILEENTRY tileentry; tileentry.val = T1ReadWord(map_addr, 0); const u16 x = ((tileentry.bits.HFlip) ? 7 - (auxX) : (auxX))&7; const u16 y = ((tileentry.bits.VFlip) ? 7 - (auxY) : (auxY))&7; const u8 palette_entry = *(u8*)MMU_gpu_map(tile + ((tileentry.bits.TileNum<<6)+(y<<3)+x)); const u16 color = T1ReadWord(pal, (palette_entry + (extPal ? (tileentry.bits.Palette<<8) : 0)) << 1); gpu->__setFinalColorBck(color, i, palette_entry); } template FORCEINLINE void rot_256_map(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { u8 palette_entry; u16 color; u8* adr = (u8*)MMU_gpu_map((map) + ((auxX + auxY * lg))); palette_entry = *adr; color = T1ReadWord(pal, palette_entry << 1); gpu->__setFinalColorBck(color, i, palette_entry); } template FORCEINLINE void rot_BMP_map(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { u16 color; void* adr = MMU_gpu_map((map) + ((auxX + auxY * lg) << 1)); color = T1ReadWord(adr, 0); gpu->__setFinalColorBck(color, i, color&0x8000); } typedef void (*rot_fun)(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i); template FORCEINLINE void rot_scale_op(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG, s32 wh, s32 ht, u32 map, u32 tile, u8 * pal) { ROTOCOORD x, y; x.val = X; y.val = Y; const s32 dx = (s32)PA; const s32 dy = (s32)PC; // as an optimization, specially handle the fairly common case of // "unrotated + unscaled + no boundary checking required" if(dx==0x100 && dy==0) { s32 auxX = x.bits.Integer; s32 auxY = y.bits.Integer; if(WRAP || (auxX + LG < wh && auxX >= 0 && auxY < ht && auxY >= 0)) { if(WRAP) { auxY = auxY & (ht-1); auxX = auxX & (wh-1); } for(int i = 0; i < LG; ++i) { fun(gpu, auxX, auxY, wh, map, tile, pal, i); auxX++; if(WRAP) auxX = auxX & (wh-1); } return; } } for(int i = 0; i < LG; ++i) { s32 auxX, auxY; auxX = x.bits.Integer; auxY = y.bits.Integer; if(WRAP) { auxX = auxX & (wh-1); auxY = auxY & (ht-1); } if(WRAP || ((auxX >= 0) && (auxX < wh) && (auxY >= 0) && (auxY < ht))) fun(gpu, auxX, auxY, wh, map, tile, pal, i); x.val += dx; y.val += dy; } } template FORCEINLINE void apply_rot_fun(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG, u32 map, u32 tile, u8 * pal) { struct _BGxCNT * bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[gpu->currBgNum].bits; s32 wh = gpu->BGSize[gpu->currBgNum][0]; s32 ht = gpu->BGSize[gpu->currBgNum][1]; if(bgCnt->PaletteSet_Wrap) rot_scale_op(gpu, X, Y, PA, PB, PC, PD, LG, wh, ht, map, tile, pal); else rot_scale_op(gpu, X, Y, PA, PB, PC, PD, LG, wh, ht, map, tile, pal); } template FORCEINLINE void rotBG2(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG) { u8 num = gpu->currBgNum; u8 * pal = MMU.ARM9_VMEM + gpu->core * 0x400; // printf("rot mode\n"); apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal); } template FORCEINLINE void extRotBG2(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, s16 LG) { u8 num = gpu->currBgNum; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; u8 *pal; switch(gpu->BGTypes[num]) { case BGType_AffineExt_256x16: if(dispCnt->ExBGxPalette_Enable) pal = MMU.ExtPal[gpu->core][gpu->BGExtPalSlot[num]]; else pal = MMU.ARM9_VMEM + gpu->core * 0x400; if (!pal) return; // 16 bit bgmap entries if(dispCnt->ExBGxPalette_Enable) apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal); else apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal); return; case BGType_AffineExt_256x1: // 256 colors pal = MMU.ARM9_VMEM + gpu->core * 0x400; apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_ram[num], 0, pal); return; case BGType_AffineExt_Direct: // direct colors / BMP apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_ram[num], 0, NULL); return; case BGType_Large8bpp: // large screen 256 colors pal = MMU.ARM9_VMEM + gpu->core * 0x400; apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_large_ram[num], 0, pal); return; default: break; } } /*****************************************************************************/ // BACKGROUND RENDERING -HELPER FUNCTIONS- /*****************************************************************************/ #if 0 static void lineNull(GPU * gpu) { } #endif template void lineText(GPU * gpu) { if(gpu->debug) { const s32 wh = gpu->BGSize[gpu->currBgNum][0]; renderline_textBG(gpu, 0, gpu->currLine, wh); } else { const u16 vofs = gpu->getVOFS(gpu->currBgNum); const u16 hofs = gpu->getHOFS(gpu->currBgNum); renderline_textBG(gpu, hofs, gpu->currLine + vofs, 256); } } template void lineRot(GPU * gpu) { BGxPARMS * parms; if (gpu->currBgNum==2) { parms = &(gpu->dispx_st)->dispx_BG2PARMS; } else { parms = &(gpu->dispx_st)->dispx_BG3PARMS; } if(gpu->debug) { s32 wh = gpu->BGSize[gpu->currBgNum][0]; rotBG2(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh); } else { rotBG2(gpu, parms->BGxX, parms->BGxY, parms->BGxPA, parms->BGxPB, parms->BGxPC, parms->BGxPD, 256); parms->BGxX += parms->BGxPB; parms->BGxY += parms->BGxPD; } } template void lineExtRot(GPU * gpu) { BGxPARMS * parms; if (gpu->currBgNum==2) { parms = &(gpu->dispx_st)->dispx_BG2PARMS; } else { parms = &(gpu->dispx_st)->dispx_BG3PARMS; } if(gpu->debug) { s32 wh = gpu->BGSize[gpu->currBgNum][0]; extRotBG2(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh); } else { extRotBG2(gpu, parms->BGxX, parms->BGxY, parms->BGxPA, parms->BGxPB, parms->BGxPC, parms->BGxPD, 256); parms->BGxX += parms->BGxPB; parms->BGxY += parms->BGxPD; } } /*****************************************************************************/ // SPRITE RENDERING -HELPER FUNCTIONS- /*****************************************************************************/ /* if i understand it correct, and it fixes some sprite problems in chameleon shot */ /* we have a 15 bit color, and should use the pal entry bits as alpha ?*/ /* http://nocash.emubase.de/gbatek.htm#dsvideoobjs */ INLINE void render_sprite_BMP (GPU * gpu, u8 spriteNum, u16 l, u8 * dst, u32 srcadr, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha) { int i; u16 color; for(i = 0; i < lg; i++, ++sprX, x+=xdir) { u16* src = (u16*)MMU_gpu_map(srcadr+(x<<1)); color = LE_TO_LOCAL_16(*src); //a cleared alpha bit suppresses the pixel from processing entirely; it doesnt exist if ((color&0x8000)&&(priosprNum[sprX] = spriteNum; } } } INLINE void render_sprite_256(GPU * gpu, u8 spriteNum, u16 l, u8 * dst, u32 srcadr, u16 * pal, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha) { int i; u8 palette_entry; u16 color; for(i = 0; i < lg; i++, ++sprX, x+=xdir) { u32 adr = srcadr + (x&0x7) + ((x&0xFFF8)<<3); u8* src = (u8 *)MMU_gpu_map(adr); palette_entry = *src; //a zero value suppresses the pixel from processing entirely; it doesnt exist if ((palette_entry>0)&&(priosprNum[sprX] = spriteNum; } } } INLINE void render_sprite_16 ( GPU * gpu, u16 l, u8 * dst, u32 srcadr, u16 * pal, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha) { int i; u8 palette, palette_entry; u16 color, x1; for(i = 0; i < lg; i++, ++sprX, x+=xdir) { x1 = x>>1; u32 adr = srcadr + (x1&0x3) + ((x1&0xFFFC)<<3); u8* src = (u8 *)MMU_gpu_map(adr);// palette = *src; if (x & 1) palette_entry = palette >> 4; else palette_entry = palette & 0xF; //a zero value suppresses the pixel from processing entirely; it doesnt exist if ((palette_entry>0)&&(prio>1; palette = src[(x1&0x3) + ((x1&0xFFFC)<<3)]; if (x & 1) palette_entry = palette >> 4; else palette_entry = palette & 0xF; //sprWin[sprX] = (palette_entry)?1:0; if(palette_entry) sprWin[sprX] = 1; } } } // return val means if the sprite is to be drawn or not FORCEINLINE BOOL compute_sprite_vars(_OAM_ * spriteInfo, u16 l, size &sprSize, s32 &sprX, s32 &sprY, s32 &x, s32 &y, s32 &lg, int &xdir) { x = 0; // get sprite location and size sprX = (spriteInfo->X/*<<23*/)/*>>23*/; sprY = spriteInfo->Y; sprSize = sprSizeTab[spriteInfo->Size][spriteInfo->Shape]; lg = sprSize.x; if (sprY>=192) sprY = (s32)((s8)(spriteInfo->Y)); // FIXME: for rot/scale, a list of entries into the sprite should be maintained, // that tells us where the first pixel of a screenline starts in the sprite, // and how a step to the right in a screenline translates within the sprite //this wasn't really tested by anything. very unlikely to get triggered y = (l - sprY)&255; /* get the y line within sprite coords */ if(y >= sprSize.y) return FALSE; if((sprX==256)||(sprX+sprSize.x<=0)) /* sprite pixels outside of line */ return FALSE; /* not to be drawn */ // sprite portion out of the screen (LEFT) if(sprX<0) { lg += sprX; x = -(sprX); sprX = 0; } // sprite portion out of the screen (RIGHT) if (sprX+sprSize.x >= 256) lg = 256 - sprX; // switch TOP<-->BOTTOM if (spriteInfo->VFlip) y = sprSize.y - y -1; // switch LEFT<-->RIGHT if (spriteInfo->HFlip) { x = sprSize.x - x -1; xdir = -1; } else { xdir = 1; } return TRUE; } /*****************************************************************************/ // SPRITE RENDERING /*****************************************************************************/ //TODO - refactor this so there isnt as much duped code between rotozoomed and non-rotozoomed versions static u32 bmp_sprite_address(GPU* gpu, _OAM_ * spriteInfo, size sprSize, s32 y) { if (gpu->dispCnt().OBJ_BMP_mapping) { //tested by buffy sacrifice damage blood splatters in corner return gpu->sprMem + (spriteInfo->TileIndex<sprBMPBoundary) + (y*sprSize.x*2); } else { //2d mapping: //verified in rotozoomed mode by knights in the nightmare intro if (gpu->dispCnt().OBJ_BMP_2D_dim) //256*256, verified by heroes of mana FMV intro return gpu->sprMem + (((spriteInfo->TileIndex&0x3E0) * 64 + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1); else //128*512, verified by harry potter and the order of the phoenix conversation portraits return gpu->sprMem + (((spriteInfo->TileIndex&0x3F0) * 64 + (spriteInfo->TileIndex&0x0F) *8 + ( y << 7)) << 1); } } template void GPU::_spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { u16 l = currLine; GPU *gpu = this; int cost = 0; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; u8 block = gpu->sprBoundary; for(int i = 0; i<128; i++) { _OAM_ oam; _OAM_* spriteInfo = &oam; SlurpOAM(spriteInfo, gpu->oam, i); //for each sprite: if(cost>=2130) { //out of sprite rendering time //printf("sprite overflow!\n"); //return; } //do we incur a cost if a sprite is disabled?? we guess so. cost += 2; size sprSize; s32 sprX, sprY, x, y, lg; int xdir; u8 prio, * src; u32 srcadr; u16 j; // Check if sprite is disabled before everything if (spriteInfo->RotScale == 2) continue; prio = spriteInfo->Priority; if (spriteInfo->RotScale & 1) { s32 fieldX, fieldY, auxX, auxY, realX, realY, offset; u8 blockparameter, *pal; s16 dx, dmx, dy, dmy; u16 colour; // Get sprite positions and size sprX = (spriteInfo->X<<23)>>23; sprY = spriteInfo->Y; sprSize = sprSizeTab[spriteInfo->Size][spriteInfo->Shape]; lg = sprSize.x; if (sprY>=192) sprY = (s32)((s8)(spriteInfo->Y)); // Copy sprite size, to check change it if needed fieldX = sprSize.x; fieldY = sprSize.y; // If we are using double size mode, double our control vars if (spriteInfo->RotScale & 2) { fieldX <<= 1; fieldY <<= 1; lg <<= 1; } //check if the sprite is visible y-wise. unfortunately our logic for x and y is different due to our scanline based rendering //tested thoroughly by many large sprites in Super Robot Wars K which wrap around the screen y = (l - sprY)&255; if(y >= fieldY) continue; //check if sprite is visible x-wise. if((sprX==256) || (sprX+fieldX<=0)) continue; cost += sprSize.x*2 + 10; // Get which four parameter block is assigned to this sprite blockparameter = (spriteInfo->RotScalIndex + (spriteInfo->HFlip<< 3) + (spriteInfo->VFlip << 4))*4; // Get rotation/scale parameters dx = SlurpOAMAffineParam(gpu->oam,blockparameter+0); dmx = SlurpOAMAffineParam(gpu->oam,blockparameter+1); dy = SlurpOAMAffineParam(gpu->oam,blockparameter+2); dmy = SlurpOAMAffineParam(gpu->oam,blockparameter+3); // Calculate fixed poitn 8.8 start offsets realX = ((sprSize.x) << 7) - (fieldX >> 1)*dx - (fieldY>>1)*dmx + y * dmx; realY = ((sprSize.y) << 7) - (fieldX >> 1)*dy - (fieldY>>1)*dmy + y * dmy; if(sprX<0) { // If sprite is not in the window if(sprX + fieldX <= 0) continue; // Otherwise, is partially visible lg += sprX; realX -= sprX*dx; realY -= sprX*dy; sprX = 0; } else { if(sprX+fieldX>256) lg = 256 - sprX; } // If we are using 1 palette of 256 colours if(spriteInfo->Depth) { src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex << block)); // If extended palettes are set, use them if (dispCnt->ExOBJPalette_Enable) pal = (MMU.ObjExtPal[gpu->core][0]+(spriteInfo->PaletteIndex*0x200)); else pal = (MMU.ARM9_VMEM + 0x200 + gpu->core *0x400); for(j = 0; j < lg; ++j, ++sprX) { // Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data auxX = (realX>>8); auxY = (realY>>8); if (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y) { if(MODE == SPRITE_2D) offset = (auxX&0x7) + ((auxX&0xFFF8)<<3) + ((auxY>>3)<<10) + ((auxY&0x7)*8); else offset = (auxX&0x7) + ((auxX&0xFFF8)<<3) + ((auxY>>3)*sprSize.x*8) + ((auxY&0x7)*8); colour = src[offset]; if (colour && (prioMode; prioTab[sprX] = prio; } } // Add the rotation/scale coeficients, here the rotation/scaling // is performed realX += dx; realY += dy; } continue; } // Rotozoomed direct color else if(spriteInfo->Mode == 3) { //transparent (i think, dont bother to render?) if alpha is 0 if(spriteInfo->PaletteIndex == 0) continue; srcadr = bmp_sprite_address(this,spriteInfo,sprSize,0); for(j = 0; j < lg; ++j, ++sprX) { // Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data auxX = (realX>>8); auxY = (realY>>8); //this is all very slow, and so much dup code with other rotozoomed modes. //dont bother fixing speed until this whole thing gets reworked if (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y) { if(dispCnt->OBJ_BMP_2D_dim) //tested by knights in the nightmare offset = (bmp_sprite_address(this,spriteInfo,sprSize,auxY)-srcadr)/2+auxX; else //tested by lego indiana jones (somehow?) //tested by buffy sacrifice damage blood splatters in corner offset = auxX + (auxY*sprSize.x); u16* mem = (u16*)MMU_gpu_map(srcadr + (offset<<1)); colour = T1ReadWord(mem,0); if((colour&0x8000) && (prioPaletteIndex; typeTab[sprX] = spriteInfo->Mode; prioTab[sprX] = prio; } } // Add the rotation/scale coeficients, here the rotation/scaling // is performed realX += dx; realY += dy; } continue; } // Rotozoomed 16/16 palette else { if(MODE == SPRITE_2D) { src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<<5)); pal = MMU.ARM9_VMEM + 0x200 + (gpu->core*0x400 + (spriteInfo->PaletteIndex*32)); } else { src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<sprBoundary)); pal = MMU.ARM9_VMEM + 0x200 + gpu->core*0x400 + (spriteInfo->PaletteIndex*32); } for(j = 0; j < lg; ++j, ++sprX) { // Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data auxX = (realX>>8); auxY = (realY>>8); if (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y) { if(MODE == SPRITE_2D) offset = ((auxX>>1)&0x3) + (((auxX>>1)&0xFFFC)<<3) + ((auxY>>3)<<10) + ((auxY&0x7)*4); else offset = ((auxX>>1)&0x3) + (((auxX>>1)&0xFFFC)<<3) + ((auxY>>3)*sprSize.x)*4 + ((auxY&0x7)*4); colour = src[offset]; // Get 4bits value from the readed 8bits if (auxX&1) colour >>= 4; else colour &= 0xF; if(colour && (prioMode==2) sprWin[sprX] = 1; else { HostWriteWord(dst, (sprX<<1), LE_TO_LOCAL_16(HostReadWord(pal, colour << 1))); dst_alpha[sprX] = -1; typeTab[sprX] = spriteInfo->Mode; prioTab[sprX] = prio; } } } // Add the rotation/scale coeficients, here the rotation/scaling // is performed realX += dx; realY += dy; } continue; } } else //NOT rotozoomed { u16 * pal; if (!compute_sprite_vars(spriteInfo, l, sprSize, sprX, sprY, x, y, lg, xdir)) continue; cost += sprSize.x; if (spriteInfo->Mode == 2) { if(MODE == SPRITE_2D) { if (spriteInfo->Depth) src = (u8 *)MMU_gpu_map(gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8)); else src = (u8 *)MMU_gpu_map(gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4)); } else { if (spriteInfo->Depth) src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*8) + ((y&0x7)*8)); else src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*4) + ((y&0x7)*4)); } render_sprite_Win (gpu, l, src, spriteInfo->Depth, lg, sprX, x, xdir); continue; } if (spriteInfo->Mode == 3) //sprite is in BMP format { srcadr = bmp_sprite_address(this,spriteInfo,sprSize, y); //transparent (i think, dont bother to render?) if alpha is 0 if(spriteInfo->PaletteIndex == 0) continue; render_sprite_BMP (gpu, i, l, dst, srcadr, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->PaletteIndex); continue; } if(spriteInfo->Depth) //256 colors { if(MODE == SPRITE_2D) srcadr = gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8); else srcadr = gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*8) + ((y&0x7)*8); if (dispCnt->ExOBJPalette_Enable) pal = (u16*)(MMU.ObjExtPal[gpu->core][0]+(spriteInfo->PaletteIndex*0x200)); else pal = (u16*)(MMU.ARM9_VMEM + 0x200 + gpu->core *0x400); render_sprite_256(gpu, i, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1); continue; } // 16 colors if(MODE == SPRITE_2D) { srcadr = gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4); } else { srcadr = gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*4) + ((y&0x7)*4); } pal = (u16*)(MMU.ARM9_VMEM + 0x200 + gpu->core * 0x400); pal += (spriteInfo->PaletteIndex<<4); render_sprite_16 (gpu, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1); } } } /*****************************************************************************/ // SCREEN FUNCTIONS /*****************************************************************************/ int Screen_Init() { MainScreen.gpu = GPU_Init(0); SubScreen.gpu = GPU_Init(1); memset(GPU_screen, 0, sizeof(GPU_screen)); for(int i = 0; i < (256*192*2); i++) ((u16*)GPU_screen)[i] = 0x7FFF; disp_fifo.head = disp_fifo.tail = 0; if (osd) {delete osd; osd =NULL; } osd = new OSDCLASS(-1); return 0; } void Screen_Reset(void) { GPU_Reset(MainScreen.gpu, 0); GPU_Reset(SubScreen.gpu, 1); MainScreen.offset = 0; SubScreen.offset = 192; memset(GPU_screen, 0, sizeof(GPU_screen)); for(int i = 0; i < (256*192*2); i++) ((u16*)GPU_screen)[i] = 0x7FFF; disp_fifo.head = disp_fifo.tail = 0; osd->clear(); } void Screen_DeInit(void) { GPU_DeInit(MainScreen.gpu); GPU_DeInit(SubScreen.gpu); if (osd) {delete osd; osd =NULL; } } /*****************************************************************************/ // GPU_RenderLine /*****************************************************************************/ void GPU_set_DISPCAPCNT(u32 val) { GPU * gpu = MainScreen.gpu; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; gpu->dispCapCnt.val = val; gpu->dispCapCnt.EVA = std::min((u32)16, (val & 0x1F)); gpu->dispCapCnt.EVB = std::min((u32)16, ((val >> 8) & 0x1F)); gpu->dispCapCnt.writeBlock = (val >> 16) & 0x03; gpu->dispCapCnt.writeOffset = (val >> 18) & 0x03; gpu->dispCapCnt.readBlock = dispCnt->VRAM_Block; if (dispCnt->DisplayMode == 2) gpu->dispCapCnt.readOffset = 0; else gpu->dispCapCnt.readOffset = (val >> 26) & 0x03; gpu->dispCapCnt.srcA = (val >> 24) & 0x01; gpu->dispCapCnt.srcB = (val >> 25) & 0x01; gpu->dispCapCnt.capSrc = (val >> 29) & 0x03; switch((val >> 20) & 0x03) { case 0: gpu->dispCapCnt.capx = DISPCAPCNT::_128; gpu->dispCapCnt.capy = 128; break; case 1: gpu->dispCapCnt.capx = DISPCAPCNT::_256; gpu->dispCapCnt.capy = 64; break; case 2: gpu->dispCapCnt.capx = DISPCAPCNT::_256; gpu->dispCapCnt.capy = 128; break; case 3: gpu->dispCapCnt.capx = DISPCAPCNT::_256; gpu->dispCapCnt.capy = 192; break; } /*INFO("Capture 0x%X:\n EVA=%i, EVB=%i, wBlock=%i, wOffset=%i, capX=%i, capY=%i\n rBlock=%i, rOffset=%i, srcCap=%i, dst=0x%X, src=0x%X\n srcA=%i, srcB=%i\n\n", val, gpu->dispCapCnt.EVA, gpu->dispCapCnt.EVB, gpu->dispCapCnt.writeBlock, gpu->dispCapCnt.writeOffset, gpu->dispCapCnt.capx, gpu->dispCapCnt.capy, gpu->dispCapCnt.readBlock, gpu->dispCapCnt.readOffset, gpu->dispCapCnt.capSrc, gpu->dispCapCnt.dst - MMU.ARM9_LCD, gpu->dispCapCnt.src - MMU.ARM9_LCD, gpu->dispCapCnt.srcA, gpu->dispCapCnt.srcB);*/ } static void GPU_RenderLine_layer(NDS_Screen * screen, u16 l) { CACHE_ALIGN u8 spr[512]; CACHE_ALIGN u8 sprAlpha[256]; CACHE_ALIGN u8 sprType[256]; CACHE_ALIGN u8 sprPrio[256]; GPU * gpu = screen->gpu; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; itemsForPriority_t * item; u16 i16; BOOL BG_enabled = TRUE; gpu->currentFadeInColors = &fadeInColors[gpu->BLDY_EVY][0]; gpu->currentFadeOutColors = &fadeOutColors[gpu->BLDY_EVY][0]; u16 backdrop_color = T1ReadWord(MMU.ARM9_VMEM, gpu->core * 0x400) & 0x7FFF; //we need to write backdrop colors in the same way as we do BG pixels in order to do correct window processing //this is currently eating up 2fps or so. it is a reasonable candidate for optimization. gpu->currBgNum = 5; switch(gpu->setFinalColorBck_funcNum) { //for backdrops, blend isnt applied (it's illogical, isnt it?) case 0: case 1: PLAIN_CLEAR: memset_u16_le<256>(gpu->currDst,backdrop_color); break; //for backdrops, fade in and fade out can be applied if it's a 1st target screen case 2: if(gpu->BLDCNT & 0x20) //backdrop is selected for color effect memset_u16_le<256>(gpu->currDst,gpu->currentFadeInColors[backdrop_color]); else goto PLAIN_CLEAR; break; case 3: if(gpu->BLDCNT & 0x20) //backdrop is selected for color effect memset_u16_le<256>(gpu->currDst,gpu->currentFadeOutColors[backdrop_color]); else goto PLAIN_CLEAR; break; //windowed cases apparently need special treatment? why? can we not render the backdrop? how would that even work? case 4: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; case 5: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; case 6: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; case 7: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; } memset(gpu->bgPixels,5,256); // init background color & priorities memset(sprAlpha, 0, 256); memset(sprType, 0, 256); memset(sprPrio, 0xFF, 256); memset(sprWin, 0, 256); // init pixels priorities assert(NB_PRIORITIES==4); gpu->itemsForPriority[0].nbPixelsX = 0; gpu->itemsForPriority[1].nbPixelsX = 0; gpu->itemsForPriority[2].nbPixelsX = 0; gpu->itemsForPriority[3].nbPixelsX = 0; // for all the pixels in the line if (gpu->LayersEnable[4]) { //n.b. - this is clearing the sprite line buffer to the background color, //but it has been changed to write u32 instead of u16 for a little speedup for(int i = 0; i< 128; ++i) HostWriteTwoWords(spr, i << 2, backdrop_color | (backdrop_color<<16)); //zero 06-may-09: I properly supported window color effects for backdrop, but I am not sure //how it interacts with this. I wish we knew why we needed this gpu->spriteRender(spr, sprAlpha, sprType, sprPrio); mosaicSpriteLine(gpu, l, spr, sprAlpha, sprType, sprPrio); for(int i = 0; i<256; i++) { // assign them to the good priority item int prio = sprPrio[i]; if (prio >=4) continue; item = &(gpu->itemsForPriority[prio]); item->PixelsX[item->nbPixelsX]=i; item->nbPixelsX++; } } if (!gpu->LayersEnable[0] && !gpu->LayersEnable[1] && !gpu->LayersEnable[2] && !gpu->LayersEnable[3]) BG_enabled = FALSE; for(int j=0;j<8;j++) gpu->blend2[j] = (gpu->BLDCNT & (0x100 << j))!=0; // paint lower priorities first // then higher priorities on top for(int prio=NB_PRIORITIES; prio > 0; ) { prio--; item = &(gpu->itemsForPriority[prio]); // render BGs if (BG_enabled) { for (int i=0; i < item->nbBGs; i++) { i16 = item->BGs[i]; if (gpu->LayersEnable[i16]) { gpu->currBgNum = (u8)i16; gpu->blend1 = (gpu->BLDCNT & (1 << gpu->currBgNum))!=0; struct _BGxCNT *bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[i16].bits; gpu->curr_mosaic_enabled = bgCnt->Mosaic_Enable; if (gpu->core == GPU_MAIN) { if (i16 == 0 && dispCnt->BG0_3D) { gpu->currBgNum = 0; const u16 hofs = gpu->getHOFS(i16); gfx3d_GetLineData(l, &gpu->_3dColorLine); u8* colorLine = gpu->_3dColorLine; for(int k = 0; k < 256; k++) { int q = ((k + hofs) & 0x1FF); if((q < 0) || (q > 255)) continue; if(colorLine[(q<<2)+3]) gpu->setFinalColor3d(k, q); } continue; } } //useful for debugging individual layers //if(gpu->core == 1 || i16 != 2) continue; #ifndef DISABLE_MOSAIC if(gpu->curr_mosaic_enabled) gpu->modeRender(i16); else #endif gpu->modeRender(i16); } //layer enabled } } // render sprite Pixels if (gpu->LayersEnable[4]) { gpu->currBgNum = 4; gpu->blend1 = (gpu->BLDCNT & (1 << gpu->currBgNum))!=0; for (int i=0; i < item->nbPixelsX; i++) { i16=item->PixelsX[i]; setFinalColorSpr(gpu, gpu->currDst, HostReadWord(spr, (i16<<1)), sprAlpha[i16], sprType[i16], i16); } } } } template static void GPU_RenderLine_DispCapture(u16 l) { //this macro takes advantage of the fact that there are only two possible values for capx #define CAPCOPY(SRC,DST,SETALPHABIT) \ switch(gpu->dispCapCnt.capx) { \ case DISPCAPCNT::_128: \ for (int i = 0; i < 128; i++) \ HostWriteWord(DST, i << 1, HostReadWord(SRC, i << 1) | (SETALPHABIT?(1<<15):0)); \ break; \ case DISPCAPCNT::_256: \ for (int i = 0; i < 256; i++) \ HostWriteWord(DST, i << 1, HostReadWord(SRC, i << 1) | (SETALPHABIT?(1<<15):0)); \ break; \ default: assert(false); \ } GPU * gpu = MainScreen.gpu; if (l == 0) { if (gpu->dispCapCnt.val & 0x80000000) { gpu->dispCapCnt.enabled = TRUE; T1WriteLong(MMU.ARM9_REG, 0x64, gpu->dispCapCnt.val); } } bool skip = SKIP; if (gpu->dispCapCnt.enabled) { //128-wide captures should write linearly into memory, with no gaps //this is tested by hotel dusk u32 ofsmul = gpu->dispCapCnt.capx==DISPCAPCNT::_128?256:512; u32 cap_src_adr = gpu->dispCapCnt.readOffset * 0x8000 + (l * 512); u32 cap_dst_adr = gpu->dispCapCnt.writeOffset * 0x8000 + (l * ofsmul); //Read/Write block wrap to 00000h when exceeding 1FFFFh (128k) //this has not been tested yet (I thought I needed it for hotel dusk, but it was fixed by the above) cap_src_adr &= 0x1FFFF; cap_dst_adr &= 0x1FFFF; cap_src_adr += gpu->dispCapCnt.readBlock * 0x20000; cap_dst_adr += gpu->dispCapCnt.writeBlock * 0x20000; u8* cap_src = MMU.ARM9_LCD + cap_src_adr; u8* cap_dst = MMU.ARM9_LCD + cap_dst_adr; //we must block captures when the capture dest is not mapped to LCDC if(vramConfiguration.banks[gpu->dispCapCnt.writeBlock].purpose != VramConfiguration::LCDC) skip = true; //we must return zero from reads from memory not mapped to lcdc if(vramConfiguration.banks[gpu->dispCapCnt.readBlock].purpose != VramConfiguration::LCDC) cap_src = MMU.blank_memory; if(!skip) if (l < gpu->dispCapCnt.capy) { switch (gpu->dispCapCnt.capSrc) { case 0: // Capture source is SourceA { //INFO("Capture source is SourceA\n"); switch (gpu->dispCapCnt.srcA) { case 0: // Capture screen (BG + OBJ + 3D) { //INFO("Capture screen (BG + OBJ + 3D)\n"); u8 *src = (u8*)(gpu->tempScanline); #ifdef LOCAL_BE static u16 swapSrc[256]; const size_t swapSrcSize = (gpu->dispCapCnt.capx == DISPCAPCNT::_128) ? 128 : 256; for(size_t i = 0; i < swapSrcSize; i++) { swapSrc[i] = LE_TO_LOCAL_16(((u16 *)src)[i]); } CAPCOPY((u8 *)swapSrc,cap_dst,true); #else CAPCOPY(src,cap_dst,true); #endif } break; case 1: // Capture 3D { //INFO("Capture 3D\n"); u16* colorLine; gfx3d_GetLineData15bpp(l, &colorLine); CAPCOPY(((u8*)colorLine),cap_dst,false); } break; } } break; case 1: // Capture source is SourceB { //INFO("Capture source is SourceB\n"); switch (gpu->dispCapCnt.srcB) { case 0: //Capture VRAM CAPCOPY(cap_src,cap_dst,true); break; case 1: //capture dispfifo //(not yet tested) for(int i=0; i < 128; i++) T1WriteLong(cap_dst, i << 2, DISP_FIFOrecv()); break; } } break; default: // Capture source is SourceA+B blended { //INFO("Capture source is SourceA+B blended\n"); u16 *srcA = NULL; u16 *srcB = NULL; if (gpu->dispCapCnt.srcA == 0) { // Capture screen (BG + OBJ + 3D) srcA = (u16*)(gpu->tempScanline); } else { gfx3d_GetLineData15bpp(l, &srcA); } static u16 fifoLine[256]; if (gpu->dispCapCnt.srcB == 0) // VRAM screen srcB = (u16 *)cap_src; else { //fifo - tested by splinter cell chaos theory thermal view srcB = fifoLine; for (int i=0; i < 128; i++) T1WriteLong((u8*)srcB, i << 2, DISP_FIFOrecv()); } const int todo = (gpu->dispCapCnt.capx==DISPCAPCNT::_128?128:256); for(u16 i = 0; i < todo; i++) { u16 a,r,g,b; u16 a_alpha = srcA[i] & 0x8000; u16 b_alpha = srcB[i] & 0x8000; if(a_alpha) { a = 0x8000; r = ((srcA[i] & 0x1F) * gpu->dispCapCnt.EVA); g = (((srcA[i] >> 5) & 0x1F) * gpu->dispCapCnt.EVA); b = (((srcA[i] >> 10) & 0x1F) * gpu->dispCapCnt.EVA); } else a = r = g = b = 0; if(b_alpha) { a = 0x8000; r += ((srcB[i] & 0x1F) * gpu->dispCapCnt.EVB); g += (((srcB[i] >> 5) & 0x1F) * gpu->dispCapCnt.EVB); b += (((srcB[i] >> 10) & 0x1F) * gpu->dispCapCnt.EVB); } r >>= 4; g >>= 4; b >>= 4; //freedom wings sky will overflow while doing some fsaa/motionblur effect without this r = std::min((u16)31,r); g = std::min((u16)31,g); b = std::min((u16)31,b); HostWriteWord(cap_dst, i << 1, a | (b << 10) | (g << 5) | r); } } break; } } if (l>=191) { gpu->dispCapCnt.enabled = FALSE; gpu->dispCapCnt.val &= 0x7FFFFFFF; T1WriteLong(MMU.ARM9_REG, 0x64, gpu->dispCapCnt.val); return; } } } static INLINE void GPU_RenderLine_MasterBrightness(NDS_Screen * screen, u16 l) { GPU * gpu = screen->gpu; u8 * dst = GPU_screen + (screen->offset + l) * 512; u16 i16; //isn't it odd that we can set uselessly high factors here? //factors above 16 change nothing. curious. int factor = gpu->MasterBrightFactor; if(factor==0) return; if(factor>16) factor=16; //Apply final brightness adjust (MASTER_BRIGHT) //http://nocash.emubase.de/gbatek.htm#dsvideo (Under MASTER_BRIGHTNESS) switch (gpu->MasterBrightMode) { // Disabled case 0: break; // Bright up case 1: { if(factor != 16) { for(i16 = 0; i16 < 256; ++i16) { ((u16*)dst)[i16] = fadeInColors[factor][((u16*)dst)[i16]&0x7FFF]; } } else { // all white (optimization) for(i16 = 0; i16 < 256; ++i16) ((u16*)dst)[i16] = 0x7FFF; } break; } // Bright down case 2: { if(factor != 16) { for(i16 = 0; i16 < 256; ++i16) { ((u16*)dst)[i16] = fadeOutColors[factor][((u16*)dst)[i16]&0x7FFF]; } } else { // all black (optimization) memset(dst, 0, 512); } break; } // Reserved case 3: break; } } template FORCEINLINE void GPU::setup_windows() { u8 y = currLine; u16 startY,endY; if(WIN_NUM==0) { startY = WIN0V0; endY = WIN0V1; } else { startY = WIN1V0; endY = WIN1V1; } if(WIN_NUM == 0 && !WIN0_ENABLED) goto allout; if(WIN_NUM == 1 && !WIN1_ENABLED) goto allout; if(startY > endY) { if((y < startY) && (y > endY)) goto allout; } else { if((y < startY) || (y >= endY)) goto allout; } //the x windows will apply for this scanline curr_win[WIN_NUM] = h_win[WIN_NUM]; return; allout: curr_win[WIN_NUM] = win_empty; } void GPU::update_winh(int WIN_NUM) { //dont even waste any time in here if the window isnt enabled if(WIN_NUM==0 && !WIN0_ENABLED) return; if(WIN_NUM==1 && !WIN1_ENABLED) return; need_update_winh[WIN_NUM] = false; u16 startX,endX; if(WIN_NUM==0) { startX = WIN0H0; endX = WIN0H1; } else { startX = WIN1H0; endX = WIN1H1; } //the original logic: if you doubt the window code, please check it against the newer implementation below //if(startX > endX) //{ // if((x < startX) && (x > endX)) return false; //} //else //{ // if((x < startX) || (x >= endX)) return false; //} if(startX > endX) { for(int i=0;i<=endX;i++) h_win[WIN_NUM][i] = 1; for(int i=endX+1;igpu; //here is some setup which is only done on line 0 if(l == 0) { //this is speculative. the idea is as follows: //whenever the user updates the affine start position regs, it goes into the active regs immediately //(this is handled on the set event from MMU) //maybe it shouldnt take effect until the next hblank or something.. //this is a based on a combination of: //heroes of mana intro FMV //SPP level 3-8 rotoscale room //NSMB raster fx backdrops //bubble bobble revolution classic mode //NOTE: //I am REALLY unsatisfied with this logic now. But it seems to be working.. gpu->refreshAffineStartRegs(-1,-1); } if(skip) { gpu->currLine = l; if (gpu->core == GPU_MAIN) { GPU_RenderLine_DispCapture(l); if (l == 191) { disp_fifo.head = disp_fifo.tail = 0; } } return; } //blacken the screen if it is turned off by the user if(!CommonSettings.showGpu.screens[gpu->core]) { u8 * dst = GPU_screen + (screen->offset + l) * 512; memset(dst,0,512); return; } // skip some work if master brightness makes the screen completely white or completely black if(gpu->MasterBrightFactor >= 16 && (gpu->MasterBrightMode == 1 || gpu->MasterBrightMode == 2)) { // except if it could cause any side effects (for example if we're capturing), then don't skip anything if(!(gpu->core == GPU_MAIN && (gpu->dispCapCnt.enabled || l == 0 || l == 191))) { gpu->currLine = l; GPU_RenderLine_MasterBrightness(screen, l); return; } } //cache some parameters which are assumed to be stable throughout the rendering of the entire line gpu->currLine = l; u16 mosaic_control = T1ReadWord((u8 *)&gpu->dispx_st->dispx_MISC.MOSAIC, 0); u16 mosaic_width = (mosaic_control & 0xF); u16 mosaic_height = ((mosaic_control>>4) & 0xF); //mosaic test hacks //mosaic_width = mosaic_height = 3; GPU::mosaicLookup.widthValue = mosaic_width; GPU::mosaicLookup.heightValue = mosaic_height; GPU::mosaicLookup.width = &GPU::mosaicLookup.table[mosaic_width][0]; GPU::mosaicLookup.height = &GPU::mosaicLookup.table[mosaic_height][0]; if(gpu->need_update_winh[0]) gpu->update_winh(0); if(gpu->need_update_winh[1]) gpu->update_winh(1); gpu->setup_windows<0>(); gpu->setup_windows<1>(); //generate the 2d engine output if(gpu->dispMode == 1) { //optimization: render straight to the output buffer when thats what we are going to end up displaying anyway gpu->tempScanline = screen->gpu->currDst = (u8 *)(GPU_screen) + (screen->offset + l) * 512; } else { //otherwise, we need to go to a temp buffer gpu->tempScanline = screen->gpu->currDst = (u8 *)gpu->tempScanlineBuffer; } GPU_RenderLine_layer(screen, l); switch (gpu->dispMode) { case 0: // Display Off(Display white) { u8 * dst = GPU_screen + (screen->offset + l) * 512; for (int i=0; i<256; i++) HostWriteWord(dst, i << 1, 0x7FFF); } break; case 1: // Display BG and OBJ layers //do nothing: it has already been generated into the right place break; case 2: // Display vram framebuffer { u8 * dst = GPU_screen + (screen->offset + l) * 512; u8 * src = gpu->VRAMaddr + (l*512); #ifdef LOCAL_BE for(size_t i = 0; i < 256; i++) { ((u16 *)dst)[i] = LE_TO_LOCAL_16(((u16 *)src)[i]); } #else memcpy (dst, src, 512); #endif } break; case 3: // Display memory FIFO { //this has not been tested since the dma timing for dispfifo was changed around the time of //newemuloop. it may not work. u8 * dst = GPU_screen + (screen->offset + l) * 512; for (int i=0; i < 128; i++) T1WriteLong(dst, i << 2, DISP_FIFOrecv() & 0x7FFF7FFF); } break; } //capture after displaying so that we can safely display vram before overwriting it here if (gpu->core == GPU_MAIN) { //BUG!!! if someone is capturing and displaying both from the fifo, then it will have been //consumed above by the display before we get here //(is that even legal? i think so) GPU_RenderLine_DispCapture(l); if (l == 191) { disp_fifo.head = disp_fifo.tail = 0; } } GPU_RenderLine_MasterBrightness(screen, l); } void gpu_savestate(EMUFILE* os) { //version write32le(1,os); os->fwrite((char*)GPU_screen,sizeof(GPU_screen)); write32le(MainScreen.gpu->affineInfo[0].x,os); write32le(MainScreen.gpu->affineInfo[0].y,os); write32le(MainScreen.gpu->affineInfo[1].x,os); write32le(MainScreen.gpu->affineInfo[1].y,os); write32le(SubScreen.gpu->affineInfo[0].x,os); write32le(SubScreen.gpu->affineInfo[0].y,os); write32le(SubScreen.gpu->affineInfo[1].x,os); write32le(SubScreen.gpu->affineInfo[1].y,os); } bool gpu_loadstate(EMUFILE* is, int size) { //read version u32 version; //sigh.. shouldve used a new version number if(size == 256*192*2*2) version = 0; else if(size== 0x30024) { read32le(&version,is); version = 1; } else if(read32le(&version,is) != 1) return false; if(version<0||version>1) return false; is->fread((char*)GPU_screen,sizeof(GPU_screen)); if(version==1) { read32le(&MainScreen.gpu->affineInfo[0].x,is); read32le(&MainScreen.gpu->affineInfo[0].y,is); read32le(&MainScreen.gpu->affineInfo[1].x,is); read32le(&MainScreen.gpu->affineInfo[1].y,is); read32le(&SubScreen.gpu->affineInfo[0].x,is); read32le(&SubScreen.gpu->affineInfo[0].y,is); read32le(&SubScreen.gpu->affineInfo[1].x,is); read32le(&SubScreen.gpu->affineInfo[1].y,is); //removed per nitsuja feedback. anyway, this same thing will happen almost immediately in gpu line=0 //MainScreen.gpu->refreshAffineStartRegs(-1,-1); //SubScreen.gpu->refreshAffineStartRegs(-1,-1); } MainScreen.gpu->updateBLDALPHA(); SubScreen.gpu->updateBLDALPHA(); return !is->fail(); } u32 GPU::getAffineStart(int layer, int xy) { if(xy==0) return affineInfo[layer-2].x; else return affineInfo[layer-2].y; } void GPU::setAffineStartWord(int layer, int xy, u16 val, int word) { u32 curr = getAffineStart(layer,xy); if(word==0) curr = (curr&0xFFFF0000)|val; else curr = (curr&0x0000FFFF)|(((u32)val)<<16); setAffineStart(layer,xy,curr); } void GPU::setAffineStart(int layer, int xy, u32 val) { if(xy==0) affineInfo[layer-2].x = val; else affineInfo[layer-2].y = val; refreshAffineStartRegs(layer,xy); } void GPU::refreshAffineStartRegs(const int num, const int xy) { if(num==-1) { refreshAffineStartRegs(2,xy); refreshAffineStartRegs(3,xy); return; } if(xy==-1) { refreshAffineStartRegs(num,0); refreshAffineStartRegs(num,1); return; } BGxPARMS * parms; if (num==2) parms = &(dispx_st)->dispx_BG2PARMS; else parms = &(dispx_st)->dispx_BG3PARMS; if(xy==0) parms->BGxX = affineInfo[num-2].x; else parms->BGxY = affineInfo[num-2].y; } template void GPU::modeRender(int layer) { switch(GPU_mode2type[dispCnt().BG_Mode][layer]) { case BGType_Text: lineText(this); break; case BGType_Affine: lineRot(this); break; case BGType_AffineExt: lineExtRot(this); break; case BGType_Large8bpp: lineExtRot(this); break; case BGType_Invalid: PROGINFO("Attempting to render an invalid BG type\n"); break; default: break; } } u32 GPU::getHOFS(int bg) { return T1ReadWord(&dispx_st->dispx_BGxOFS[bg].BGxHOFS,0) & 0x1FF; } u32 GPU::getVOFS(int bg) { return T1ReadWord(&dispx_st->dispx_BGxOFS[bg].BGxVOFS,0) & 0x1FF; } void gpu_SetRotateScreen(u16 angle) { gpu_angle = angle; } desmume-0.9.11/src/matrix.h0000755000000000000000000002373112467662066014233 0ustar rootroot/* Copyright (C) 2006-2007 shash Copyright (C) 2007-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef MATRIX_H #define MATRIX_H #include #include #include "types.h" #include "mem.h" #ifdef ENABLE_SSE #include #endif #ifdef ENABLE_SSE2 #include #endif struct MatrixStack { MatrixStack(int size, int type); s32 *matrix; s32 position; s32 size; u8 type; }; void MatrixInit (float *matrix); void MatrixInit (s32 *matrix); //In order to conditionally use these asm optimized functions in visual studio //without having to make new build types to exclude the assembly files. //a bit sloppy, but there aint much to it float MatrixGetMultipliedIndex (int index, float *matrix, float *rightMatrix); s32 MatrixGetMultipliedIndex (int index, s32 *matrix, s32 *rightMatrix); void MatrixSet (s32 *matrix, int x, int y, s32 value); void MatrixCopy (s32 * matrixDST, const s32 * matrixSRC); int MatrixCompare (const s32 * matrixDST, const float * matrixSRC); void MatrixIdentity (s32 *matrix); void MatrixStackInit (MatrixStack *stack); void MatrixStackSetMaxSize (MatrixStack *stack, int size); void MatrixStackPushMatrix (MatrixStack *stack, const s32 *ptr); void MatrixStackPopMatrix (s32 *mtxCurr, MatrixStack *stack, int size); s32* MatrixStackGetPos (MatrixStack *stack, int pos); s32* MatrixStackGet (MatrixStack *stack); void MatrixStackLoadMatrix (MatrixStack *stack, int pos, const s32 *ptr); void Vector2Copy(float *dst, const float *src); void Vector2Add(float *dst, const float *src); void Vector2Subtract(float *dst, const float *src); float Vector2Dot(const float *a, const float *b); float Vector2Cross(const float *a, const float *b); float Vector3Dot(const float *a, const float *b); void Vector3Cross(float* dst, const float *a, const float *b); float Vector3Length(const float *a); void Vector3Add(float *dst, const float *src); void Vector3Subtract(float *dst, const float *src); void Vector3Scale(float *dst, const float scale); void Vector3Copy(float *dst, const float *src); void Vector3Normalize(float *dst); void Vector4Copy(float *dst, const float *src); //these functions are an unreliable, inaccurate floor. //it should only be used for positive numbers //this isnt as fast as it could be if we used a visual c++ intrinsic, but those appear not to be universally available FORCEINLINE u32 u32floor(float f) { #ifdef ENABLE_SSE2 return (u32)_mm_cvtt_ss2si(_mm_set_ss(f)); #else return (u32)f; #endif } FORCEINLINE u32 u32floor(double d) { #ifdef ENABLE_SSE2 return (u32)_mm_cvttsd_si32(_mm_set_sd(d)); #else return (u32)d; #endif } //same as above but works for negative values too. //be sure that the results are the same thing as floorf! FORCEINLINE s32 s32floor(float f) { #ifdef ENABLE_SSE2 return _mm_cvtss_si32( _mm_add_ss(_mm_set_ss(-0.5f),_mm_add_ss(_mm_set_ss(f), _mm_set_ss(f))) ) >> 1; #else return (s32)floorf(f); #endif } FORCEINLINE s32 s32floor(double d) { return s32floor((float)d); } //switched SSE2 functions //------------- #ifdef ENABLE_SSE2 template FORCEINLINE void memset_u16_le(void* dst, u16 val) { u32 u32val; //just for the endian safety T1WriteWord((u8*)&u32val,0,val); T1WriteWord((u8*)&u32val,2,val); ////const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val); #if defined(__GNUC__) || defined(__INTEL_COMPILER) const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val); MACRODO_N(NUM/8,_mm_store_si128((__m128i*)((u8*)dst+(X)*16), temp)); #else __m128 temp; temp.m128_i32[0] = u32val; //MACRODO_N(NUM/8,_mm_store_si128((__m128i*)((u8*)dst+(X)*16), temp)); MACRODO_N(NUM/8,_mm_store_ps1((float*)((u8*)dst+(X)*16), temp)); #endif } #else //no sse2 template static FORCEINLINE void memset_u16_le(void* dst, u16 val) { for(int i=0;i FORCEINLINE void vector_fix2float(float* matrix, const float divisor) { CTASSERT(NUM_ROWS==3 || NUM_ROWS==4); const __m128 val = _mm_set_ps1(divisor); _mm_store_ps(matrix,_mm_div_ps(_mm_load_ps(matrix),val)); _mm_store_ps(matrix+4,_mm_div_ps(_mm_load_ps(matrix+4),val)); _mm_store_ps(matrix+8,_mm_div_ps(_mm_load_ps(matrix+8),val)); if(NUM_ROWS==4) _mm_store_ps(matrix+12,_mm_div_ps(_mm_load_ps(matrix+12),val)); } //WARNING: I do not think this is as fast as a memset, for some reason. //at least in vc2005 with sse enabled. better figure out why before using it template static FORCEINLINE void memset_u8(void* _dst, u8 val) { memset(_dst,val,NUM); //const u8* dst = (u8*)_dst; //u32 u32val = (val<<24)|(val<<16)|(val<<8)|val; //const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val); //MACRODO_N(NUM/16,_mm_store_si128((__m128i*)(dst+(X)*16), temp)); } #else //no sse void MatrixMultVec4x4 (const float *matrix, float *vecPtr); void MatrixMultVec3x3(const float * matrix, float * vecPtr); void MatrixMultiply(float * matrix, const float * rightMatrix); void MatrixTranslate(float *matrix, const float *ptr); void MatrixScale(float * matrix, const float * ptr); FORCEINLINE void MatrixMultVec4x4_M2(const float *matrix, float *vecPtr) { //there are hardly any gains from merging these manually MatrixMultVec4x4(matrix+16,vecPtr); MatrixMultVec4x4(matrix,vecPtr); } template FORCEINLINE void vector_fix2float(float* matrix, const float divisor) { for(int i=0;i static FORCEINLINE void memset_u8(void* dst, u8 val) { memset(dst,val,NUM); } #endif //switched SSE functions void MatrixMultVec4x4 (const s32 *matrix, s32 *vecPtr); void MatrixMultVec4x4_M2(const s32 *matrix, s32 *vecPtr); void MatrixMultiply(s32* matrix, const s32* rightMatrix); void MatrixScale(s32 *matrix, const s32 *ptr); void MatrixTranslate(s32 *matrix, const s32 *ptr); #endif desmume-0.9.11/src/common.h0000755000000000000000000000444212467662066014215 0ustar rootroot/* Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //TODO - dismantle this file #ifndef _COMMON_H_ #define _COMMON_H_ #include #include #include #include "types.h" #if defined(WIN32) #define CLASSNAME "DeSmuME" #else // non Windows #define sscanf_s sscanf #endif template T reverseBits(T x) { T h = 0; T i = 0; for (i = 0; i < sizeof(T)*8; i++) { h = (h << 1) + (x & 1); x >>= 1; } return h; } template char *intToBin(T val) { char buf[256] = {0}; for (int i = sizeof(T)*8, t = 0; i > 0; --i, t++) { buf[i-1] = (val & (1<. */ #ifndef instruction_attributes_H_ #define instruction_attributes_H_ #include "types.h" #define INSTR_CYCLES_MASK 0x7 #define INSTR_CYCLES(c) c // constant cycles. does not include the penalty for writing to r15 for instructions other than dedicated branches. #define INSTR_CYCLES_VARIABLE 0 // duration to be determined at runtime #define INSTR_CYCLES_V INSTR_CYCLES_VARIABLE #define SRCREG_NONE 0x0000 #define SRCREG_POS0 0x0008 #define SRCREG_POS3 0x0010 #define SRCREG_POS8 0x0020 #define SRCREG_POS12 0x0040 #define SRCREG_POS16 0x0080 #define SRCREG_STM 0x0100 #define BRANCH_NEVER 0x00000000 #define BRANCH_ALWAYS 0x00000800 #define BRANCH_POS0 0x00001000 // branch if (REG_NUM(i,0)|((i>>4)&8))==15 #define BRANCH_POS12 0x00002000 // branch if REG_POS(i,12)==15 #define BRANCH_LDM 0x00004000 #define BRANCH_SWI 0x00008000 // branch if use external SWI - if (cpu->swi_tab == NULL) #define MERGE_NEXT 0x04000000 #define JIT_BYPASS 0x80000000 // JIT makes no assumptions about what this instruction does static const u32 instruction_attributes[4096] = { INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_MUL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_MUL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_MLA INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_MLA_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_UMULL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_UMULL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_UMLAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_UMLAL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MRS_CPSR JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QADD JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_B_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_SWP INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_T_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_M_REG_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_B_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_T_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0, //OP_MSR_CPSR INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS0, //OP_BX JIT_BYPASS, //OP_UND INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS0, //OP_BLX_REG JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QSUB JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_BKPT INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLAW_B JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULW_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_M_REG_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLAW_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULW_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_PRE_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_PRE_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_PRE_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MRS_SPSR JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QDADD JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_B_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_SWPB INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_T_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_M_IMM_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_B_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_T_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0, //OP_MSR_SPSR INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0, //OP_CLZ JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QDSUB JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_B_B JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_T_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_M_IMM_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_B_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_T_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_PRE_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_PRE_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_PRE_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI }; static const u32 thumb_attributes[1024] = { INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL_0 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR_0 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR_0 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_AND INSTR_CYCLES(1) | BRANCH_NEVER, //OP_EOR INSTR_CYCLES(2) | BRANCH_NEVER, //OP_LSL_REG INSTR_CYCLES(2) | BRANCH_NEVER, //OP_LSR_REG INSTR_CYCLES(2) | BRANCH_NEVER, //OP_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADC_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SBC_REG INSTR_CYCLES(2) | BRANCH_NEVER, //OP_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_TST INSTR_CYCLES(1) | BRANCH_NEVER, //OP_NEG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMN INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ORR INSTR_CYCLES_V | BRANCH_NEVER, //OP_MUL_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_BIC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MVN INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BX_THUMB INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BX_THUMB INSTR_CYCLES(4) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BLX_THUMB INSTR_CYCLES(4) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BLX_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_P_SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_P_SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_M_SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_M_SP JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 }; #endif desmume-0.9.11/src/version.cpp0000755000000000000000000001146212467662066014745 0ustar rootroot/* Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "types.h" #include "version.h" // Helper macros to convert numerics to strings #if defined(_MSC_VER) //re: http://72.14.203.104/search?q=cache:HG-okth5NGkJ:mail.python.org/pipermail/python-checkins/2002-November/030704.html+_msc_ver+compiler+version+string&hl=en&gl=us&ct=clnk&cd=5 #define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) #define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X #define _Py_STRINGIZE2(X) #X #define TOSTRING(X) _Py_STRINGIZE(X) // Alias _Py_STRINGIZE so that we have a common macro name #else #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #endif //todo - everyone will want to support this eventually, i suppose #if defined(HOST_WINDOWS) || defined(DESMUME_COCOA) || defined(DESMUME_QT) #include "svnrev.h" #else #ifndef SVN_REV #define SVN_REV 0 #define SVN_REV_STR "0" #endif #endif #define DESMUME_NAME "DeSmuME" #if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) #define DESMUME_PLATFORM_STRING " x64" #elif defined(__i386__) || defined(_M_IX86) || defined(_WIN32) #define DESMUME_PLATFORM_STRING " x86" #elif defined(__arm__) #define DESMUME_PLATFORM_STRING " ARM" #elif defined(__thumb__) #define DESMUME_PLATFORM_STRING " ARM-Thumb" #elif defined(__ppc64__) #define DESMUME_PLATFORM_STRING " PPC64" #elif defined(__ppc__) || defined(_M_PPC) #define DESMUME_PLATFORM_STRING " PPC" #else #define DESMUME_PLATFORM_STRING "" #endif #ifndef ENABLE_SSE2 #ifndef ENABLE_SSE #define DESMUME_CPUEXT_STRING " NOSSE" #else #define DESMUME_CPUEXT_STRING " NOSSE2" #endif #else #define DESMUME_CPUEXT_STRING "" #endif #ifdef DEVELOPER #define DESMUME_FEATURE_STRING " dev+" #else #define DESMUME_FEATURE_STRING "" #endif #ifdef DEBUG #define DESMUME_SUBVERSION_STRING " debug" #elif defined(PUBLIC_RELEASE) #define DESMUME_SUBVERSION_STRING "" #else #define DESMUME_SUBVERSION_STRING " svn" SVN_REV_STR #endif #ifdef __INTEL_COMPILER #define DESMUME_COMPILER " (Intel)" #define DESMUME_COMPILER_DETAIL " (Intel v" TOSTRING(__INTEL_COMPILER) ")" #elif defined(_MSC_VER) #define DESMUME_COMPILER " (MSVC)" #define DESMUME_COMPILER_DETAIL " (MSVC v" TOSTRING(_MSC_VER) ")" #elif defined(__clang__) #define DESMUME_COMPILER " (LLVM-Clang)" #define DESMUME_COMPILER_DETAIL " (LLVM-Clang v" TOSTRING(__clang_major__) "." TOSTRING(__clang_minor__) "." TOSTRING(__clang_patchlevel__) ")" #elif defined(__llvm__) #define DESMUME_COMPILER " (LLVM)" #define DESMUME_COMPILER_DETAIL " (LLVM)" #elif defined(__GNUC__) // Always make GCC the last check, since other compilers, such as Clang, may define __GNUC__ internally. #define DESMUME_COMPILER " (GCC)" #if defined(__GNUC_PATCHLEVEL__) #define DESMUME_COMPILER_DETAIL " (GCC v" TOSTRING(__GNUC__) "." TOSTRING(__GNUC_MINOR__) "." TOSTRING(__GNUC_PATCHLEVEL__) ")" #else #define DESMUME_COMPILER_DETAIL " (GCC v" TOSTRING(__GNUC__) "." TOSTRING(__GNUC_MINOR__) ")" #endif #else #define DESMUME_COMPILER "" #define DESMUME_COMPILER_DETAIL "" #endif #if defined(HAVE_JIT) && !defined(PUBLIC_RELEASE) #define DESMUME_JIT "-JIT" #else #define DESMUME_JIT "" #endif #ifdef PUBLIC_RELEASE const u32 DESMUME_SUBVERSION_NUMERIC = 0xFFFFFFFF; #else const u32 DESMUME_SUBVERSION_NUMERIC = SVN_REV; #endif const u8 DESMUME_VERSION_MAJOR = 0; const u8 DESMUME_VERSION_MINOR = 9; const u8 DESMUME_VERSION_BUILD = 11; #define DESMUME_VERSION_NUMERIC 91100 #define DESMUME_VERSION_STRING " " "0.9.11" DESMUME_SUBVERSION_STRING DESMUME_FEATURE_STRING DESMUME_PLATFORM_STRING DESMUME_JIT DESMUME_CPUEXT_STRING #define DESMUME_NAME_AND_VERSION DESMUME_NAME DESMUME_VERSION_STRING u32 EMU_DESMUME_VERSION_NUMERIC() { return DESMUME_VERSION_NUMERIC; } u32 EMU_DESMUME_SUBVERSION_NUMERIC() { return DESMUME_SUBVERSION_NUMERIC; } const char* EMU_DESMUME_VERSION_STRING() { return DESMUME_VERSION_STRING; } const char* EMU_DESMUME_SUBVERSION_STRING() { return DESMUME_SUBVERSION_STRING; } const char* EMU_DESMUME_NAME_AND_VERSION() { return DESMUME_NAME_AND_VERSION; } const char* EMU_DESMUME_COMPILER_DETAIL() { return DESMUME_COMPILER_DETAIL; } desmume-0.9.11/src/wifi.cpp0000755000000000000000000017460612467662066014230 0ustar rootroot/* Copyright (C) 2007 Tim Seidel Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "types.h" #ifdef HOST_WINDOWS #include #include #define socket_t SOCKET #define sockaddr_t SOCKADDR #include "windriver.h" #define PCAP_DEVICE_NAME description #else #include #include #include #include #include #define socket_t int #define sockaddr_t struct sockaddr #define closesocket close #define PCAP_DEVICE_NAME name #endif #include "wifi.h" #include #include "armcpu.h" #include "NDSSystem.h" #include "debug.h" #include "bits.h" #include "registers.h" #ifndef INVALID_SOCKET #define INVALID_SOCKET (socket_t)-1 #endif #define BASEPORT 7000 const u8 BroadcastMAC[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; bool bWFCUserWarned = false; #ifdef EXPERIMENTAL_WIFI_COMM socket_t wifi_socket = INVALID_SOCKET; sockaddr_t sendAddr; #ifndef WIN32 #include "pcap/pcap.h" #endif pcap_t *wifi_bridge = NULL; #endif //sometimes this isnt defined #ifndef PCAP_OPENFLAG_PROMISCUOUS #define PCAP_OPENFLAG_PROMISCUOUS 1 #endif static WifiHandler _defaultHandler; WifiHandler *CurrentWifiHandler = &_defaultHandler; wifimac_t wifiMac; SoftAP_t SoftAP; int wifi_lastmode; /******************************************************************************* WIFI TODO - emulate transmission delays for Beacon and Extra transfers - emulate delays when receiving as well (may need some queuing system) - take transfer rate and preamble into account - figure out RFSTATUS and RFPINS *******************************************************************************/ /******************************************************************************* Firmware info needed for if no firmware image is available see: http://www.akkit.org/info/dswifi.htm#WifiInit written in bytes, to avoid endianess issues *******************************************************************************/ u8 FW_Mac[6] = { 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56 }; const u8 FW_WIFIInit[32] = { 0x02,0x00, 0x17,0x00, 0x26,0x00, 0x18,0x18, 0x48,0x00, 0x40,0x48, 0x58,0x00, 0x42,0x00, 0x40,0x01, 0x64,0x80, 0xE0,0xE0, 0x43,0x24, 0x0E,0x00, 0x32,0x00, 0xF4,0x01, 0x01,0x01 }; const u8 FW_BBInit[105] = { 0x6D, 0x9E, 0x40, 0x05, 0x1B, 0x6C, 0x48, 0x80, 0x38, 0x00, 0x35, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x04, 0x01, 0xd8, 0xff, 0xff, 0xc7, 0xbb, 0x01, 0xb6, 0x7f, 0x5a, 0x01, 0x3f, 0x01, 0x3f, 0x36, 0x36, 0x00, 0x78, 0x28, 0x55, 0x08, 0x28, 0x16, 0x00, 0x01, 0x0e, 0x20, 0x02, 0x98, 0x98, 0x1f, 0x0a, 0x08, 0x04, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfa, 0xfa, 0xf8, 0xf8, 0xf6, 0xa5, 0x12, 0x14, 0x12, 0x41, 0x23, 0x03, 0x04, 0x70, 0x35, 0x0E, 0x16, 0x16, 0x00, 0x00, 0x06, 0x01, 0xff, 0xfe, 0xff, 0xff, 0x00, 0x0e, 0x13, 0x00, 0x00, 0x28, 0x1c }; const u8 FW_RFInit[36] = { 0x07, 0xC0, 0x00, 0x03, 0x9C, 0x12, 0x28, 0x17, 0x14, 0xba, 0xe8, 0x1a, 0x6f, 0x45, 0x1d, 0xfa, 0xff, 0x23, 0x30, 0x1d, 0x24, 0x01, 0x00, 0x28, 0x00, 0x00, 0x2c, 0x03, 0x9c, 0x06, 0x22, 0x00, 0x08, 0x6f, 0xff, 0x0d }; const u8 FW_RFChannel[6*14] = { 0x28, 0x17, 0x14, /* Channel 1 */ 0xba, 0xe8, 0x1a, 0x37, 0x17, 0x14, /* Channel 2 */ 0x46, 0x17, 0x19, 0x45, 0x17, 0x14, /* Channel 3 */ 0xd1, 0x45, 0x1b, 0x54, 0x17, 0x14, /* Channel 4 */ 0x5d, 0x74, 0x19, 0x62, 0x17, 0x14, /* Channel 5 */ 0xe9, 0xa2, 0x1b, 0x71, 0x17, 0x14, /* Channel 6 */ 0x74, 0xd1, 0x19, 0x80, 0x17, 0x14, /* Channel 7 */ 0x00, 0x00, 0x18, 0x8e, 0x17, 0x14, /* Channel 8 */ 0x8c, 0x2e, 0x1a, 0x9d, 0x17, 0x14, /* Channel 9 */ 0x17, 0x5d, 0x18, 0xab, 0x17, 0x14, /* Channel 10 */ 0xa3, 0x8b, 0x1a, 0xba, 0x17, 0x14, /* Channel 11 */ 0x2f, 0xba, 0x18, 0xc8, 0x17, 0x14, /* Channel 12 */ 0xba, 0xe8, 0x1a, 0xd7, 0x17, 0x14, /* Channel 13 */ 0x46, 0x17, 0x19, 0xfa, 0x17, 0x14, /* Channel 14 */ 0x2f, 0xba, 0x18 }; const u8 FW_BBChannel[14] = { 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, /* channel 1- 6 */ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, /* channel 7-10 */ 0xb5, 0xb5, /* channel 11-12 */ 0xb6, 0xb6 /* channel 13-14 */ }; FW_WFCProfile FW_WFCProfile1 = {"SoftAP", "", "", "", "", "", {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, "", 0, 0, 0, {0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0} }; FW_WFCProfile FW_WFCProfile2 = {"", "", "", "", "", "", {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, "", 0, 0, 0xFF, {0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0} }; FW_WFCProfile FW_WFCProfile3 = {"", "", "", "", "", "", {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, "", 0, 0, 0xFF, {0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0} }; /******************************************************************************* Communication interface *******************************************************************************/ struct WifiComInterface { bool (*Init)(); void (*DeInit)(); void (*Reset)(); void (*SendPacket)(u8* packet, u32 len); void (*msTrigger)(); }; #ifdef EXPERIMENTAL_WIFI_COMM bool SoftAP_Init(); void SoftAP_DeInit(); void SoftAP_Reset(); void SoftAP_SendPacket(u8 *packet, u32 len); void SoftAP_msTrigger(); WifiComInterface CI_SoftAP = { SoftAP_Init, SoftAP_DeInit, SoftAP_Reset, SoftAP_SendPacket, SoftAP_msTrigger }; bool Adhoc_Init(); void Adhoc_DeInit(); void Adhoc_Reset(); void Adhoc_SendPacket(u8* packet, u32 len); void Adhoc_msTrigger(); WifiComInterface CI_Adhoc = { Adhoc_Init, Adhoc_DeInit, Adhoc_Reset, Adhoc_SendPacket, Adhoc_msTrigger }; #endif WifiComInterface* wifiComs[] = { #ifdef EXPERIMENTAL_WIFI_COMM &CI_Adhoc, &CI_SoftAP, #endif NULL }; WifiComInterface* wifiCom; /******************************************************************************* Logging *******************************************************************************/ // 0: disable logging // 1: lowest logging, shows most important messages such as errors // 2: low logging, shows things such as warnings // 3: medium logging, for debugging, shows lots of stuff // 4: high logging, for debugging, shows almost everything, may slow down // 5: highest logging, for debugging, shows everything, may slow down a lot #define WIFI_LOGGING_LEVEL 3 #define WIFI_LOG_USE_LOGC 0 #if (WIFI_LOGGING_LEVEL >= 1) #if WIFI_LOG_USE_LOGC #define WIFI_LOG(level, ...) if(level <= WIFI_LOGGING_LEVEL) LOGC(8, "WIFI: "__VA_ARGS__); #else #define WIFI_LOG(level, ...) if(level <= WIFI_LOGGING_LEVEL) printf("WIFI: "__VA_ARGS__); #endif #else #define WIFI_LOG(level, ...) {} #endif /******************************************************************************* Hax *******************************************************************************/ // TODO: find the right value // GBAtek says it is 10µs, however that value seems too small // (MP host sends floods of data frames, clients can't keep up) // 100 would make more sense since CMDCOUNT is set to 166 // that would be 16.6ms ~= 1 frame // however this is guessed, like a lot of the wifi here #define WIFI_CMDCOUNT_SLICE 100 /******************************************************************************* Helpers *******************************************************************************/ INLINE u32 WIFI_alignedLen(u32 len) { return ((len + 3) & ~3); } // Fast MAC compares INLINE bool WIFI_compareMAC(u8* a, u8* b) { return ((*(u32*)&a[0]) == (*(u32*)&b[0])) && ((*(u16*)&a[4]) == (*(u16*)&b[4])); } INLINE bool WIFI_isBroadcastMAC(u8* a) { return (a[0] & 0x01); //return ((*(u32*)&a[0]) == 0xFFFFFFFF) && ((*(u16*)&a[4]) == 0xFFFF); } /******************************************************************************* CRC32 (http://www.codeproject.com/KB/recipes/crc32_large.aspx) *******************************************************************************/ u32 WIFI_CRC32Table[256]; static u32 reflect(u32 ref, char ch) { u32 value = 0; for(int i = 1; i < (ch + 1); i++) { if (ref & 1) value |= 1 << (ch - i); ref >>= 1; } return value; } static u32 WIFI_calcCRC32(u8 *data, int len) { u32 crc = 0xFFFFFFFF; while(len--) crc = (crc >> 8) ^ WIFI_CRC32Table[(crc & 0xFF) ^ *data++]; return (crc ^ 0xFFFFFFFF); } static void WIFI_initCRC32Table() { static bool initialized = false; if(initialized) return; initialized = true; u32 polynomial = 0x04C11DB7; for(int i = 0; i < 0x100; i++) { WIFI_CRC32Table[i] = reflect(i, 8) << 24; for(int j = 0; j < 8; j++) WIFI_CRC32Table[i] = (WIFI_CRC32Table[i] << 1) ^ (WIFI_CRC32Table[i] & (1 << 31) ? polynomial : 0); WIFI_CRC32Table[i] = reflect(WIFI_CRC32Table[i], 32); } } /******************************************************************************* RF-Chip *******************************************************************************/ static void WIFI_resetRF(rffilter_t *rf) { /* reinitialize RF chip with the default values refer RF2958 docs */ /* CFG1 */ rf->CFG1.bits.IF_VGA_REG_EN = 1; rf->CFG1.bits.IF_VCO_REG_EN = 1; rf->CFG1.bits.RF_VCO_REG_EN = 1; rf->CFG1.bits.HYBERNATE = 0; rf->CFG1.bits.REF_SEL = 0; /* IFPLL1 */ rf->IFPLL1.bits.DAC = 3; rf->IFPLL1.bits.P1 = 0; rf->IFPLL1.bits.LD_EN1 = 0; rf->IFPLL1.bits.AUTOCAL_EN1 = 0; rf->IFPLL1.bits.PDP1 = 1; rf->IFPLL1.bits.CPL1 = 0; rf->IFPLL1.bits.LPF1 = 0; rf->IFPLL1.bits.VTC_EN1 = 1; rf->IFPLL1.bits.KV_EN1 = 0; rf->IFPLL1.bits.PLL_EN1 = 0; /* IFPLL2 */ rf->IFPLL2.bits.IF_N = 0x22; /* IFPLL3 */ rf->IFPLL3.bits.KV_DEF1 = 8; rf->IFPLL3.bits.CT_DEF1 = 7; rf->IFPLL3.bits.DN1 = 0x1FF; /* RFPLL1 */ rf->RFPLL1.bits.DAC = 3; rf->RFPLL1.bits.P = 0; rf->RFPLL1.bits.LD_EN = 0; rf->RFPLL1.bits.AUTOCAL_EN = 0; rf->RFPLL1.bits.PDP = 1; rf->RFPLL1.bits.CPL = 0; rf->RFPLL1.bits.LPF = 0; rf->RFPLL1.bits.VTC_EN = 0; rf->RFPLL1.bits.KV_EN = 0; rf->RFPLL1.bits.PLL_EN = 0; /* RFPLL2 */ rf->RFPLL2.bits.NUM2 = 0; rf->RFPLL2.bits.N2 = 0x5E; /* RFPLL3 */ rf->RFPLL3.bits.NUM2 = 0; /* RFPLL4 */ rf->RFPLL4.bits.KV_DEF = 8; rf->RFPLL4.bits.CT_DEF = 7; rf->RFPLL4.bits.DN = 0x145; /* CAL1 */ rf->CAL1.bits.LD_WINDOW = 2; rf->CAL1.bits.M_CT_VALUE = 8; rf->CAL1.bits.TLOCK = 7; rf->CAL1.bits.TVCO = 0x0F; /* TXRX1 */ rf->TXRX1.bits.TXBYPASS = 0; rf->TXRX1.bits.INTBIASEN = 0; rf->TXRX1.bits.TXENMODE = 0; rf->TXRX1.bits.TXDIFFMODE = 0; rf->TXRX1.bits.TXLPFBW = 2; rf->TXRX1.bits.RXLPFBW = 2; rf->TXRX1.bits.TXVGC = 0; rf->TXRX1.bits.PCONTROL = 0; rf->TXRX1.bits.RXDCFBBYPS = 0; /* PCNT1 */ rf->PCNT1.bits.TX_DELAY = 0; rf->PCNT1.bits.PC_OFFSET = 0; rf->PCNT1.bits.P_DESIRED = 0; rf->PCNT1.bits.MID_BIAS = 0; /* PCNT2 */ rf->PCNT2.bits.MIN_POWER = 0; rf->PCNT2.bits.MID_POWER = 0; rf->PCNT2.bits.MAX_POWER = 0; /* VCOT1 */ rf->VCOT1.bits.AUX1 = 0; rf->VCOT1.bits.AUX = 0; } void WIFI_setRF_CNT(u16 val) { if (!wifiMac.rfIOStatus.bits.busy) wifiMac.rfIOCnt.val = val; } void WIFI_setRF_DATA(u16 val, u8 part) { if (!wifiMac.rfIOStatus.bits.busy) { rfIOData_t *rfreg = (rfIOData_t *)&wifiMac.RF; switch (wifiMac.rfIOCnt.bits.readOperation) { case 1: /* read from RF chip */ /* low part of data is ignored on reads */ /* on high part, the address is read, and the data at this is written back */ if (part==1) { wifiMac.rfIOData.array16[part] = val; if (wifiMac.rfIOData.bits.address > (sizeof(wifiMac.RF) / 4)) return; /* out of bound */ /* get content of the addressed register */ wifiMac.rfIOData.bits.content = rfreg[wifiMac.rfIOData.bits.address].bits.content; } break; case 0: /* write to RF chip */ wifiMac.rfIOData.array16[part] = val; if (wifiMac.rfIOData.bits.address > (sizeof(wifiMac.RF) / 4)) return; /* out of bound */ /* the actual transfer is done on high part write */ if (part==1) { switch (wifiMac.rfIOData.bits.address) { case 5: /* write to upper part of the frequency filter */ case 6: /* write to lower part of the frequency filter */ { u32 channelFreqN; rfreg[wifiMac.rfIOData.bits.address].bits.content = wifiMac.rfIOData.bits.content; /* get the complete rfpll.n */ channelFreqN = (u32)wifiMac.RF.RFPLL3.bits.NUM2 + ((u32)wifiMac.RF.RFPLL2.bits.NUM2 << 18) + ((u32)wifiMac.RF.RFPLL2.bits.N2 << 24); /* frequency setting is out of range */ if (channelFreqN<0x00A2E8BA) return; /* substract base frequency (channel 1) */ channelFreqN -= 0x00A2E8BA; } return; case 13: /* special purpose register: TEST1, on write, the RF chip resets */ WIFI_resetRF(&wifiMac.RF); return; } /* set content of the addressed register */ rfreg[wifiMac.rfIOData.bits.address].bits.content = wifiMac.rfIOData.bits.content; } break; } } } u16 WIFI_getRF_DATA(u8 part) { if (!wifiMac.rfIOStatus.bits.busy) return wifiMac.rfIOData.array16[part]; else /* data is not (yet) available */ return 0; } u16 WIFI_getRF_STATUS() { return wifiMac.rfIOStatus.val; } /******************************************************************************* BB-Chip *******************************************************************************/ void WIFI_setBB_CNT(u16 val) { wifiMac.bbIOCnt.val = val; if(wifiMac.bbIOCnt.bits.mode == 1) wifiMac.BB.data[wifiMac.bbIOCnt.bits.address] = WIFI_IOREG(REG_WIFI_BBWRITE); } u8 WIFI_getBB_DATA() { if((!wifiMac.bbIOCnt.bits.enable) || (wifiMac.bbIOCnt.bits.mode != 2)) return 0; return wifiMac.BB.data[wifiMac.bbIOCnt.bits.address]; } /******************************************************************************* wifimac IO: a lot of the wifi regs are action registers, that are mirrored without action, so the default IO via MMU.c does not seem to be very suitable all registers are 16 bit *******************************************************************************/ static void WIFI_TXStart(u32 slot); static void WIFI_triggerIRQMask(u16 mask) { u16 oResult,nResult; oResult = wifiMac.IE & wifiMac.IF; wifiMac.IF = wifiMac.IF | (mask & ~0x0400); nResult = wifiMac.IE & wifiMac.IF; if (!oResult && nResult) { NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_ARM7_WIFI); /* cascade it via arm7 wifi irq */ } } static void WIFI_triggerIRQ(u8 irq) { switch (irq) { case WIFI_IRQ_TXSTART: break; case WIFI_IRQ_TIMEPREBEACON: if (wifiMac.TXPower & 0x0001) { //wifiMac.rfStatus = 1; //wifiMac.rfPins = 0x0084; } break; case WIFI_IRQ_TIMEBEACON: wifiMac.BeaconCount1 = wifiMac.BeaconInterval; if (wifiMac.ucmpEnable) { wifiMac.BeaconCount2 = 0xFFFF; wifiMac.TXCnt &= 0xFFF2; WIFI_TXStart(WIFI_TXSLOT_BEACON); if (wifiMac.ListenCount == 0) wifiMac.ListenCount = wifiMac.ListenInterval; wifiMac.ListenCount--; } break; case WIFI_IRQ_TIMEPOSTBEACON: if (wifiMac.TXPower & 0x0002) { //wifiMac.rfStatus = 9; //wifiMac.rfPins = 0x0004; } break; case WIFI_IRQ_UNK: WIFI_LOG(3, "IRQ 12 triggered.\n"); break; } WIFI_triggerIRQMask(1<DeInit(); } void WIFI_Reset() { #ifdef EXPERIMENTAL_WIFI_COMM //memset(&wifiMac, 0, sizeof(wifimac_t)); WIFI_resetRF(&wifiMac.RF); memset(wifiMac.IOPorts, 0, sizeof(wifiMac.IOPorts)); wifiMac.randomSeed = 1; wifiMac.crystalEnabled = FALSE; wifiMac.powerOn = FALSE; wifiMac.powerOnPending = FALSE; wifiMac.GlobalUsecTimer = wifiMac.usec = wifiMac.ucmp = 0ULL; //wifiMac.rfStatus = 0x0000; //wifiMac.rfPins = 0x0004; wifiMac.rfStatus = 0x0009; wifiMac.rfPins = 0x00C6; memset(wifiMac.TXSlots, 0, sizeof(wifiMac.TXSlots)); wifiMac.TXCurSlot = -1; wifiMac.TXCnt = wifiMac.TXStat = wifiMac.TXSeqNo = wifiMac.TXBusy = 0; while (!wifiMac.RXPacketQueue.empty()) wifiMac.RXPacketQueue.pop(); if((u32)CommonSettings.wifi.mode >= ARRAY_SIZE(wifiComs)) CommonSettings.wifi.mode = 0; if (wifiCom && (wifi_lastmode != CommonSettings.wifi.mode)) wifiCom->DeInit(); wifiCom = wifiComs[CommonSettings.wifi.mode]; if (wifiCom && (wifi_lastmode != CommonSettings.wifi.mode)) wifiCom->Init(); else if (wifiCom) wifiCom->Reset(); wifi_lastmode = CommonSettings.wifi.mode; bWFCUserWarned = false; #endif } INLINE u16 WIFI_GetRXFlags(u8* packet) { u16 ret = 0x0010; u16 frameCtl = *(u16*)&packet[0]; u32 bssid_offset = 10; frameCtl &= 0xE7FF; switch(frameCtl & 0x000C) { case 0x0000: // Management frame { bssid_offset = 16; if ((frameCtl & 0x00F0) == 0x0080) ret |= 0x0001; } break; case 0x0004: // Control frame ret |= 0x0005; break; case 0x0008: // Data frame { switch (frameCtl & 0x0300) { case 0x0000: bssid_offset = 16; break; case 0x0100: bssid_offset = 4; break; case 0x0200: bssid_offset = 10; break; } if (frameCtl == 0x0228) ret |= 0x000C; else if (frameCtl == 0x0218) ret |= 0x000D; else if (frameCtl == 0x0118) ret |= 0x000E; else ret |= 0x0008; } break; } if (frameCtl & 0x0400) ret |= 0x0100; if (WIFI_compareMAC(&packet[bssid_offset], &wifiMac.bss.bytes[0])) ret |= 0x8000; return ret; } INLINE void WIFI_MakeRXHeader(u8* buf, u16 flags, u16 xferRate, u16 len, u8 maxRSSI, u8 minRSSI) { *(u16*)&buf[0] = flags; // Unknown, seems to always be 0x0040 // except with from-DS-to-STA data+cfpoll frames (0228) *(u16*)&buf[2] = ((flags & 0xF) == 0xC) ? 0x0000 : 0x0040; // random (probably left unchanged) //*(u16*)&buf[4] = 0x0000; *(u16*)&buf[6] = xferRate; *(u16*)&buf[8] = len; // idk about those, really buf[10] = 0x20;//maxRSSI; buf[11] = 0xA0;//minRSSI; } static void WIFI_RXPutWord(u16 val) { /* abort when RX data queuing is not enabled */ if (!(wifiMac.RXCnt & 0x8000)) return; /* write the data to cursor position */ wifiMac.RAM[wifiMac.RXWriteCursor & 0xFFF] = val; /* move cursor by one */ wifiMac.RXWriteCursor++; /* wrap around */ if(wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); wifiMac.RXTXAddr = wifiMac.RXWriteCursor; } #ifdef EXPERIMENTAL_WIFI_COMM static void WIFI_RXQueuePacket(u8* packet, u32 len) { if (!(wifiMac.RXCnt & 0x8000)) return; Wifi_RXPacket pkt; pkt.Data = packet; pkt.RemHWords = (len - 11) >> 1; pkt.CurOffset = 12; pkt.NotStarted = true; wifiMac.RXPacketQueue.push(pkt); } #endif template static void WIFI_IncrementRXStat() { u16 bitmasks[] = { 0x0001, 0, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0, 0x0100, 0, 0x0200, 0x0400, 0x0800, 0x1000}; u16 bitmask = bitmasks[stat]; wifiMac.RXStat[stat]++; if (wifiMac.RXStatIncIE & bitmask) { wifiMac.RXStatIncIF |= bitmask; WIFI_triggerIRQ(WIFI_IRQ_RXINC); } if (wifiMac.RXStat[stat] & 0x80) { if (wifiMac.RXStatOvfIE & bitmask) { wifiMac.RXStatOvfIF |= bitmask; WIFI_triggerIRQ(WIFI_IRQ_RXOVF); } } } // TODO: find out if this is correct at all // this was mostly guessed, like most of the MP reply functionality static void WIFI_DoAutoReply(u8* cmd) { cmd += 12; u16 frameCtl = *(u16*)&cmd[0] & 0xE7FF; if (frameCtl == 0x0228) { // if the packet we got is a multiplayer command (data+cf-poll), // check if it was destined to us u16 slaveflags = *(u16*)&cmd[24 + 2]; if (!(slaveflags & (1 << wifiMac.pid))) return; // if it was destined to us, (try to) send a reply u16 regval = WIFI_IOREG(REG_WIFI_TXBUF_REPLY1); wifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal = regval; regval &= 0x0FFF; wifiMac.RAM[regval + 6 + 1] = *(u16*)&cmd[24]; WIFI_TXStart(WIFI_TXSLOT_MPREPLY); } /*else if (frameCtl == 0x0118) { // broadcast MP ACK // this packet appears to be sent automatically // PS: nope. Enabling this code causes NSMB to break the connection even quicker. // Probably it should send the ACK itself whenever it wants to... u8 ack[32]; *(u16*)&ack[0] = 0x0218; *(u16*)&ack[2] = 0x0000; *(u16*)&ack[4] = 0x0903; *(u16*)&ack[6] = 0x00BF; *(u16*)&ack[8] = 0x0300; memcpy(&ack[10], &wifiMac.mac.bytes[0], 6); memcpy(&ack[16], &wifiMac.mac.bytes[0], 6); *(u16*)&ack[22] = wifiMac.TXSeqNo << 4; wifiMac.TXSeqNo++; *(u16*)&ack[24] = 0x0555; // lol random *(u16*)&ack[26] = 0x0000; *(u32*)&ack[28] = 0x00000000; wifiCom->SendPacket(ack, 32); }*/ } static void WIFI_TXStart(u32 slot) { WIFI_LOG(4, "TX slot %i trying to send a packet: TXCnt = %04X, TXBufLoc = %04X\n", slot, wifiMac.TXCnt, wifiMac.TXSlots[slot].RegVal); u16 reg = wifiMac.TXSlots[slot].RegVal; if (BIT15(reg)) { u16 address = reg & 0x0FFF; if (address > 0x1000-6) { WIFI_LOG(1, "TX slot %i trying to send a packet overflowing from the TX buffer (address %04X). Attempt ignored.\n", slot, (address << 1)); return; } u16 txLen = wifiMac.RAM[address+5] & 0x3FFF; if (txLen == 0) // zero length { WIFI_LOG(1, "TX slot %i trying to send a packet with length field set to zero. Attempt ignored.\n", slot); return; } u32 timemask = ((wifiMac.RAM[address+4] & 0xFF) == 20) ? 7 : 15; wifiMac.TXSlots[slot].CurAddr = address + 6; wifiMac.TXSlots[slot].RemHWords = (txLen + 1) >> 1; wifiMac.TXSlots[slot].RemPreamble = (BIT2(WIFI_IOREG(REG_WIFI_PREAMBLE)) && (timemask == 7)) ? 96 : 192; wifiMac.TXSlots[slot].TimeMask = timemask; wifiMac.TXSlots[slot].NotStarted = true; if (wifiMac.TXCurSlot < 0) wifiMac.TXCurSlot = slot; wifiMac.TXBusy |= (1 << slot); //wifiMac.rfStatus = 3; //wifiMac.rfPins = 0x0046; } } static void WIFI_PreTXAdjustments(u32 slot) { u16 reg = wifiMac.TXSlots[slot].RegVal; u16 address = reg & 0x0FFF; u16 txLen = wifiMac.RAM[address+5] & 0x3FFF; // Set sequence number if required if ((!BIT13(reg)) || (slot == WIFI_TXSLOT_BEACON)) { wifiMac.RAM[address + 6 + 11] = wifiMac.TXSeqNo << 4; wifiMac.TXSeqNo++; // TODO: find out when this happens (if it actually happens at all) // real-life NSMB multiplayer traffic capture shows no such behavior //if (slot == WIFI_TXSLOT_MPCMD) wifiMac.TXSeqNo++; } // Set timestamp (for beacons only) if (slot == WIFI_TXSLOT_BEACON) { *(u64*)&wifiMac.RAM[address + 6 + 12] = wifiMac.usec; //((u8*)wifiMac.RAM)[((address+6+12)<<1) + WIFI_IOREG(0x84)] = 0x01; } // TODO: check if this is correct // this sometimes happens in real world, but not always /*if (slot == WIFI_TXSLOT_MPREPLY) { wifiMac.RAM[address + 6 + 12] |= 0x8000; }*/ // Calculate and set FCS u32 crc32 = WIFI_calcCRC32((u8*)&wifiMac.RAM[address + 6], txLen - 4); *(u32*)&wifiMac.RAM[address + 6 + ((txLen-4) >> 1)] = crc32; } void WIFI_write16(u32 address, u16 val) { BOOL action = FALSE; if (!nds.power2.wifi) return; u32 page = address & 0x7000; // 0x2000 - 0x3FFF: unused if ((page >= 0x2000) && (page < 0x4000)) return; WIFI_LOG(5, "Write at address %08X, %04X\n", address, val); /*if (address == 0x04804008 && val == 0x0200) { printf("WIFI: Write at address %08X, %04X, pc=%08X\n", address, val, NDS_ARM7.instruct_adr); emu_halt(); }*/ // 0x4000 - 0x5FFF: wifi RAM if ((page >= 0x4000) && (page < 0x6000)) { /* access to the circular buffer */ address &= 0x1FFF; /*if (address >= 0x958 && address < (0x95A)) //address < (0x958+0x2A)) printf("PACKET[%04X] = %04X %08X %08X\n", NDS_ARM7.R[12], val, NDS_ARM7.R[14], NDS_ARM7.R[5]);*/ wifiMac.RAM[address >> 1] = val; return; } // anything else: I/O ports // only the first mirror (0x0000 - 0x0FFF) causes a special action if (page == 0x0000) action = TRUE; address &= 0x0FFF; switch (address) { case REG_WIFI_ID: break; case REG_WIFI_MODE: { u16 oldval = wifiMac.macMode; if (!BIT0(oldval) && BIT0(val)) { WIFI_IOREG(0x034) = 0x0002; wifiMac.rfPins = 0x0046; wifiMac.rfStatus = 0x0009; WIFI_IOREG(0x27C) = 0x0005; } if (BIT0(oldval) && !BIT0(val)) { WIFI_IOREG(0x27C) = 0x000A; } if (BIT13(val)) { WIFI_IOREG(REG_WIFI_WRITECSRLATCH) = 0x0000; WIFI_IOREG(0x0C0) = 0x0000; WIFI_IOREG(0x0C4) = 0x0000; WIFI_IOREG(REG_WIFI_MAYBE_RATE) = 0x0000; WIFI_IOREG(0x278) = 0x000F; } if (BIT14(val)) { wifiMac.wepMode = 0x0000; wifiMac.TXStatCnt = 0x0000; WIFI_IOREG(REG_WIFI_0A) = 0x0000; wifiMac.mac.words[0] = 0x0000; wifiMac.mac.words[1] = 0x0000; wifiMac.mac.words[2] = 0x0000; wifiMac.bss.words[0] = 0x0000; wifiMac.bss.words[1] = 0x0000; wifiMac.bss.words[2] = 0x0000; wifiMac.pid = 0x0000; wifiMac.aid = 0x0000; WIFI_IOREG(REG_WIFI_RETRYLIMIT) = 0x0707; WIFI_IOREG(0x02E) = 0x0000; WIFI_IOREG(REG_WIFI_RXRANGEBEGIN) = 0x4000; WIFI_IOREG(REG_WIFI_RXRANGEEND) = 0x4800; wifiMac.RXRangeBegin = 0x0000; // 0x4000 wifiMac.RXRangeEnd = 0x0800; // 0x4800 WIFI_IOREG(0x084) = 0x0000; WIFI_IOREG(REG_WIFI_PREAMBLE) = 0x0001; WIFI_IOREG(REG_WIFI_RXFILTER) = 0x0401; WIFI_IOREG(0x0D4) = 0x0001; WIFI_IOREG(REG_WIFI_RXFILTER2) = 0x0008; WIFI_IOREG(0x0EC) = 0x3F03; WIFI_IOREG(0x194) = 0x0000; WIFI_IOREG(0x198) = 0x0000; WIFI_IOREG(0x1A2) = 0x0001; WIFI_IOREG(0x224) = 0x0003; WIFI_IOREG(0x230) = 0x0047; } wifiMac.macMode = val & 0xAFFF; } break; case REG_WIFI_WEP: wifiMac.wepMode = val; break; case REG_WIFI_TXSTATCNT: wifiMac.TXStatCnt = val; //printf("txstatcnt=%04X\n", val); break; case REG_WIFI_IE: wifiMac.IE = val; //printf("wifi ie write %04X\n", val); break; case REG_WIFI_IF: wifiMac.IF &= ~val; /* clear flagging bits */ break; case REG_WIFI_MAC0: case REG_WIFI_MAC1: case REG_WIFI_MAC2: wifiMac.mac.words[(address - REG_WIFI_MAC0) >> 1] = val; break; case REG_WIFI_BSS0: case REG_WIFI_BSS1: case REG_WIFI_BSS2: wifiMac.bss.words[(address - REG_WIFI_BSS0) >> 1] = val; break; case REG_WIFI_RETRYLIMIT: wifiMac.retryLimit = val; break; case REG_WIFI_WEPCNT: wifiMac.WEP_enable = (val & 0x8000) != 0; break; case REG_WIFI_POWERSTATE: wifiMac.powerOn = ((val & 0x0002)?TRUE:FALSE); if(wifiMac.powerOn) WIFI_triggerIRQ(WIFI_IRQ_RFWAKEUP); break; case REG_WIFI_POWERFORCE: if((val & 0x8000) && (!wifiMac.powerOnPending)) { /* BOOL newPower = ((val & 0x0001)?FALSE:TRUE); if(newPower != wifiMac.powerOn) { if(!newPower) wifiMac.powerOn = FALSE; else wifiMac.powerOnPending = TRUE; }*/ wifiMac.powerOn = ((val & 0x0001) ? FALSE : TRUE); } break; case REG_WIFI_POWERACK: if((val == 0x0000) && wifiMac.powerOnPending) { wifiMac.powerOn = TRUE; wifiMac.powerOnPending = FALSE; } break; case REG_WIFI_POWER_TX: wifiMac.TXPower = val & 0x0007; break; case REG_WIFI_RXCNT: wifiMac.RXCnt = val & 0xFF0E; if (BIT0(val)) { wifiMac.RXWriteCursor = WIFI_IOREG(REG_WIFI_WRITECSRLATCH); WIFI_IOREG(REG_WIFI_RXHWWRITECSR) = wifiMac.RXWriteCursor; //printf("latch RX cursor: %04X @ %08X\n", wifiMac.RXWriteCursor, NDS_ARM7.instruct_adr); } if (BIT7(val)) { WIFI_LOG(2, "TXBUF_REPLY=%04X\n", WIFI_IOREG(REG_WIFI_TXBUF_REPLY1)); wifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal = WIFI_IOREG(REG_WIFI_TXBUF_REPLY1); WIFI_IOREG(REG_WIFI_TXBUF_REPLY1) = 0x0000; } if (!BIT15(val)) { while (!wifiMac.RXPacketQueue.empty()) wifiMac.RXPacketQueue.pop(); } break; case REG_WIFI_RXRANGEBEGIN: wifiMac.RXRangeBegin = val & 0x1FFE; if(wifiMac.RXWriteCursor < (wifiMac.RXRangeBegin >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); break; case REG_WIFI_RXRANGEEND: wifiMac.RXRangeEnd = val & 0x1FFE; if(wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); break; case REG_WIFI_CIRCBUFRADR: wifiMac.CircBufReadAddress = (val & 0x1FFE); break; case REG_WIFI_RXREADCSR: wifiMac.RXReadCursor = val; break; case REG_WIFI_CIRCBUFWADR: wifiMac.CircBufWriteAddress = val; break; case REG_WIFI_CIRCBUFWRITE: /* set value into the circ buffer, and move cursor to the next hword on action */ //printf("wifi: circbuf fifo write at %04X, %04X (action=%i)\n", (wifiMac.CircBufWriteAddress & 0x1FFF), val, action); wifiMac.RAM[(wifiMac.CircBufWriteAddress >> 1) & 0xFFF] = val; if (action) { /* move to next hword */ wifiMac.CircBufWriteAddress+=2; if (wifiMac.CircBufWriteAddress == wifiMac.CircBufWrEnd) { /* on end of buffer, add skip hwords to it */ wifiMac.CircBufWrEnd += wifiMac.CircBufWrSkip * 2; } } break; case REG_WIFI_CIRCBUFWR_SKIP: wifiMac.CircBufWrSkip = val; break; case REG_WIFI_TXBUF_BEACON: wifiMac.TXSlots[WIFI_TXSLOT_BEACON].RegVal = val; if (BIT15(val)) WIFI_LOG(3, "Beacon transmission enabled to send the packet at %08X every %i milliseconds.\n", 0x04804000 + ((val & 0x0FFF) << 1), wifiMac.BeaconInterval); break; case REG_WIFI_TXBUF_CMD: wifiMac.TXSlots[WIFI_TXSLOT_MPCMD].RegVal = val; break; case REG_WIFI_TXBUF_LOC1: //printf("-------- TXBUF_LOC1 = %04X %08X --------\n", val, NDS_ARM7.instruct_adr); wifiMac.TXSlots[WIFI_TXSLOT_LOC1].RegVal = val; break; case REG_WIFI_TXBUF_LOC2: //printf("-------- TXBUF_LOC2 = %04X %08X --------\n", val, NDS_ARM7.instruct_adr); wifiMac.TXSlots[WIFI_TXSLOT_LOC2].RegVal = val; break; case REG_WIFI_TXBUF_LOC3: //printf("-------- TXBUF_LOC3 = %04X %08X --------\n", val, NDS_ARM7.instruct_adr); wifiMac.TXSlots[WIFI_TXSLOT_LOC3].RegVal = val; break; case REG_WIFI_TXRESET: WIFI_LOG(4, "Write to TXRESET: %04X\n", val); break; case REG_WIFI_TXREQ_RESET: wifiMac.TXCnt &= ~val; break; case REG_WIFI_TXREQ_SET: //printf("--- TXREQ=%04X ---\n", val); wifiMac.TXCnt |= val; if (BIT0(val)) WIFI_TXStart(WIFI_TXSLOT_LOC1); if (BIT1(val)) WIFI_TXStart(WIFI_TXSLOT_MPCMD); if (BIT2(val)) WIFI_TXStart(WIFI_TXSLOT_LOC2); if (BIT3(val)) WIFI_TXStart(WIFI_TXSLOT_LOC3); if (val & 0xFFF0) WIFI_LOG(2, "Unknown TXREQ bits set: %04X\n", val); break; case REG_WIFI_RFCNT: WIFI_setRF_CNT(val); break; case REG_WIFI_RFBUSY: /* CHECKME: read only? */ break; case REG_WIFI_RFDATA1: WIFI_setRF_DATA(val,0); break; case REG_WIFI_RFDATA2: WIFI_setRF_DATA(val,1); break; case REG_WIFI_USCOUNTERCNT: wifiMac.usecEnable = BIT0(val); break; case REG_WIFI_USCOMPARECNT: wifiMac.ucmpEnable = BIT0(val); break; case REG_WIFI_USCOUNTER0: wifiMac.usec = (wifiMac.usec & 0xFFFFFFFFFFFF0000ULL) | (u64)val; break; case REG_WIFI_USCOUNTER1: wifiMac.usec = (wifiMac.usec & 0xFFFFFFFF0000FFFFULL) | (u64)val << 16; break; case REG_WIFI_USCOUNTER2: wifiMac.usec = (wifiMac.usec & 0xFFFF0000FFFFFFFFULL) | (u64)val << 32; break; case REG_WIFI_USCOUNTER3: wifiMac.usec = (wifiMac.usec & 0x0000FFFFFFFFFFFFULL) | (u64)val << 48; break; case REG_WIFI_USCOMPARE0: wifiMac.ucmp = (wifiMac.ucmp & 0xFFFFFFFFFFFF0000ULL) | (u64)(val & 0xFFFE); // in NSMB multiplayer, Luigi sets USCOMPARE to the USCOUNTER of Mario, and sets bit0 // possibly bit0 writes USCOMPARE into USCOUNTER? // it seems to also trigger IRQ14 // in NSMB, Luigi sends packets on the first attempt only if we trigger IRQ14 here if (BIT0(val)) { //printf("OBSCURE BIT SET @ %08X\n", NDS_ARM7.instruct_adr); wifiMac.usec = wifiMac.ucmp; WIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON); } break; case REG_WIFI_USCOMPARE1: wifiMac.ucmp = (wifiMac.ucmp & 0xFFFFFFFF0000FFFFULL) | (u64)val << 16; break; case REG_WIFI_USCOMPARE2: wifiMac.ucmp = (wifiMac.ucmp & 0xFFFF0000FFFFFFFFULL) | (u64)val << 32; break; case REG_WIFI_USCOMPARE3: wifiMac.ucmp = (wifiMac.ucmp & 0x0000FFFFFFFFFFFFULL) | (u64)val << 48; break; case REG_WIFI_BEACONPERIOD: wifiMac.BeaconInterval = val & 0x03FF; break; case REG_WIFI_BEACONCOUNT1: wifiMac.BeaconCount1 = val; break; case REG_WIFI_BEACONCOUNT2: wifiMac.BeaconCount2 = val; break; case REG_WIFI_BBCNT: WIFI_setBB_CNT(val); break; case REG_WIFI_RXBUF_COUNT: wifiMac.RXBufCount = val & 0x0FFF; break; case REG_WIFI_EXTRACOUNTCNT: wifiMac.eCountEnable = BIT0(val); break; case REG_WIFI_EXTRACOUNT: WIFI_LOG(3, "EXTRACOUNT=%i (%i µs)\n", val, val*WIFI_CMDCOUNT_SLICE); wifiMac.eCount = (u32)val * WIFI_CMDCOUNT_SLICE; break; case REG_WIFI_LISTENINT: wifiMac.ListenInterval = val & 0x00FF; break; case REG_WIFI_LISTENCOUNT: wifiMac.ListenCount = val & 0x00FF; break; case REG_WIFI_POWER_US: wifiMac.crystalEnabled = !BIT0(val); break; case REG_WIFI_IF_SET: WIFI_triggerIRQMask(val); break; case REG_WIFI_CIRCBUFRD_END: wifiMac.CircBufRdEnd = (val & 0x1FFE); break; case REG_WIFI_CIRCBUFRD_SKIP: wifiMac.CircBufRdSkip = val & 0xFFF; break; case REG_WIFI_AID_LOW: //printf("AID_LOW = %04X @ %08X %08X\n", val, NDS_ARM7.instruct_adr, NDS_ARM7.R[14]); wifiMac.pid = val & 0x0F; break; case REG_WIFI_AID_HIGH: //printf("AID_HIGH = %04X @ %08X %08X\n", val, NDS_ARM7.instruct_adr, NDS_ARM7.R[14]); wifiMac.aid = val & 0x07FF; break; case 0xD0: //printf("wifi: rxfilter=%04X\n", val); break; case 0x0E0: //printf("wifi: rxfilter2=%04X\n", val); break; case 0x84: //printf("TXBUF_TIM = %04X\n", val); break; case 0x94: printf("!!!!! TXBUF_REPLY = %04X !!!!!\n", val); break; case REG_WIFI_RXSTAT_INC_IE: wifiMac.RXStatIncIE = val; break; case REG_WIFI_RXSTAT_OVF_IE: wifiMac.RXStatOvfIE = val; break; case 0x1A8: case 0x1AC: case 0x1B0: case 0x1B2: case 0x1B4: case 0x1B6: case 0x1B8: case 0x1BA: case 0x1BC: case 0x1BE: WIFI_LOG(2, "Write to RXSTAT register: %03X = %04X\n", address, val); break; case 0x194: printf("TX_HDR_CNT = %04X\n", val); break; default: break; } WIFI_IOREG(address) = val; } u16 WIFI_read16(u32 address) { BOOL action = FALSE; if (!nds.power2.wifi) return 0; u32 page = address & 0x7000; // 0x2000 - 0x3FFF: unused if ((page >= 0x2000) && (page < 0x4000)) return 0xFFFF; WIFI_LOG(5, "Read at address %08X\n", address); // 0x4000 - 0x5FFF: wifi RAM if ((page >= 0x4000) && (page < 0x6000)) { return wifiMac.RAM[(address & 0x1FFF) >> 1]; } // anything else: I/O ports // only the first mirror causes a special action if (page == 0x0000) action = TRUE; address &= 0x0FFF; switch (address) { case REG_WIFI_ID: return WIFI_CHIPID; case REG_WIFI_MODE: return wifiMac.macMode; case REG_WIFI_WEP: return wifiMac.wepMode; case REG_WIFI_IE: return wifiMac.IE; case REG_WIFI_IF: return wifiMac.IF; case REG_WIFI_POWERSTATE: return ((wifiMac.powerOn ? 0x0000 : 0x0200) | (wifiMac.powerOnPending ? 0x0102 : 0x0000)); case REG_WIFI_RFDATA1: return WIFI_getRF_DATA(0); case REG_WIFI_RFDATA2: return WIFI_getRF_DATA(1); case REG_WIFI_RFBUSY: case REG_WIFI_BBBUSY: return 0; /* we are never busy :p */ case REG_WIFI_BBREAD: return WIFI_getBB_DATA(); case REG_WIFI_RANDOM: // probably not right, but it's better than using the unsaved and shared rand(). // at the very least, rand() shouldn't be used when movieMode is active. { u16 returnValue = wifiMac.randomSeed; wifiMac.randomSeed = (wifiMac.randomSeed & 1) ^ (((wifiMac.randomSeed << 1) & 0x7FE) | ((wifiMac.randomSeed >> 10) & 0x1)); return returnValue; } return 0; case REG_WIFI_MAC0: case REG_WIFI_MAC1: case REG_WIFI_MAC2: return wifiMac.mac.words[(address - REG_WIFI_MAC0) >> 1]; case REG_WIFI_BSS0: case REG_WIFI_BSS1: case REG_WIFI_BSS2: return wifiMac.bss.words[(address - REG_WIFI_BSS0) >> 1]; case REG_WIFI_RXCNT: return wifiMac.RXCnt; case REG_WIFI_CIRCBUFREAD: { u16 val = wifiMac.RAM[wifiMac.CircBufReadAddress >> 1]; if (action) { wifiMac.CircBufReadAddress += 2; if (wifiMac.CircBufReadAddress >= wifiMac.RXRangeEnd) { wifiMac.CircBufReadAddress = wifiMac.RXRangeBegin; } else { /* skip does not fire after a reset */ if (wifiMac.CircBufReadAddress == wifiMac.CircBufRdEnd) { wifiMac.CircBufReadAddress += wifiMac.CircBufRdSkip * 2; wifiMac.CircBufReadAddress &= 0x1FFE; if (wifiMac.CircBufReadAddress + wifiMac.RXRangeBegin == wifiMac.RXRangeEnd) wifiMac.CircBufReadAddress = 0; } } if (wifiMac.RXBufCount > 0) { if (wifiMac.RXBufCount == 1) { WIFI_triggerIRQ(WIFI_IRQ_RXCOUNTEXP); } wifiMac.RXBufCount--; } } return val; } case REG_WIFI_CIRCBUFRADR: return wifiMac.CircBufReadAddress; case REG_WIFI_RXBUF_COUNT: return wifiMac.RXBufCount; case REG_WIFI_TXREQ_READ: return wifiMac.TXCnt | 0x10; case REG_WIFI_TXBUSY: return wifiMac.TXBusy; case REG_WIFI_TXSTAT: return wifiMac.TXStat; case REG_WIFI_TXBUF_CMD: return wifiMac.TXSlots[WIFI_TXSLOT_MPCMD].RegVal; case REG_WIFI_TXBUF_REPLY2: return wifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal; case REG_WIFI_TXBUF_LOC1: return wifiMac.TXSlots[WIFI_TXSLOT_LOC1].RegVal; case REG_WIFI_TXBUF_LOC2: return wifiMac.TXSlots[WIFI_TXSLOT_LOC2].RegVal; case REG_WIFI_TXBUF_LOC3: return wifiMac.TXSlots[WIFI_TXSLOT_LOC3].RegVal; case REG_WIFI_TXBUF_BEACON: return wifiMac.TXSlots[WIFI_TXSLOT_BEACON].RegVal; case REG_WIFI_EXTRACOUNTCNT: return wifiMac.eCountEnable?1:0; case REG_WIFI_EXTRACOUNT: return (u16)((wifiMac.eCount + (WIFI_CMDCOUNT_SLICE-1)) / WIFI_CMDCOUNT_SLICE); case REG_WIFI_USCOUNTER0: return (u16)wifiMac.usec; case REG_WIFI_USCOUNTER1: return (u16)(wifiMac.usec >> 16); case REG_WIFI_USCOUNTER2: return (u16)(wifiMac.usec >> 32); case REG_WIFI_USCOUNTER3: return (u16)(wifiMac.usec >> 48); case REG_WIFI_USCOMPARE0: return (u16)wifiMac.ucmp; case REG_WIFI_USCOMPARE1: return (u16)(wifiMac.ucmp >> 16); case REG_WIFI_USCOMPARE2: return (u16)(wifiMac.ucmp >> 32); case REG_WIFI_USCOMPARE3: return (u16)(wifiMac.ucmp >> 48); case REG_WIFI_BEACONCOUNT1: return wifiMac.BeaconCount1; case REG_WIFI_BEACONCOUNT2: return wifiMac.BeaconCount2; case REG_WIFI_LISTENCOUNT: return wifiMac.ListenCount; case REG_WIFI_POWER_US: return wifiMac.crystalEnabled?0:1; case REG_WIFI_CIRCBUFRD_END: return wifiMac.CircBufRdEnd; case REG_WIFI_CIRCBUFRD_SKIP: return wifiMac.CircBufRdSkip; case REG_WIFI_AID_LOW: return wifiMac.pid; case REG_WIFI_AID_HIGH: return wifiMac.aid; // RFSTATUS, RFPINS // TODO: figure out how to emulate those correctly // without breaking Nintendo's games case REG_WIFI_RFSTATUS: return wifiMac.rfStatus; //return 9; case REG_WIFI_RFPINS: return wifiMac.rfPins; //return 0x00C6; case REG_WIFI_RXSTAT_INC_IF: { u16 ret = wifiMac.RXStatIncIF; wifiMac.RXStatIncIF = 0; return ret; } case REG_WIFI_RXSTAT_OVF_IF: { u16 ret = wifiMac.RXStatOvfIF; wifiMac.RXStatOvfIF = 0; return ret; } case REG_WIFI_RXSTAT_INC_IE: return wifiMac.RXStatIncIE; case REG_WIFI_RXSTAT_OVF_IE: return wifiMac.RXStatOvfIE; case 0x1B0: case 0x1B2: case 0x1B4: case 0x1B6: case 0x1B8: case 0x1BA: case 0x1BC: case 0x1BE: { u16 ret = *(u16*)&wifiMac.RXStat[address & 0xF]; *(u16*)&wifiMac.RXStat[address & 0xF] = 0; return ret; } case REG_WIFI_RXTXADDR: return wifiMac.RXTXAddr; case 0x84: WIFI_LOG(2, "Read to TXBUF_TIM @ %08X %08X\n", NDS_ARM7.instruct_adr, NDS_ARM7.R[14]); break; default: // printf("wifi: read unhandled reg %03X\n", address); break; } return WIFI_IOREG(address); } void WIFI_usTrigger() { wifiMac.GlobalUsecTimer++; if (wifiMac.crystalEnabled) { /* a usec has passed */ if (wifiMac.usecEnable) wifiMac.usec++; // Note: the extra counter is decremented every 10 microseconds. // To avoid a modulo every microsecond, we multiply the counter // value by 10 and decrement it every microsecond :) if (wifiMac.eCountEnable) { if (wifiMac.eCount > 0) { wifiMac.eCount--; if (wifiMac.eCount == 0) WIFI_TXStart(WIFI_TXSLOT_MPCMD); } } // The beacon counters are in milliseconds // GBATek says they're decremented every 1024 usecs if (!(wifiMac.usec & 1023)) { wifiMac.BeaconCount1--; if (wifiMac.BeaconCount1 == (WIFI_IOREG(REG_WIFI_PREBEACONCOUNT) >> 10)) WIFI_triggerIRQ(WIFI_IRQ_TIMEPREBEACON); else if (wifiMac.BeaconCount1 == 0) WIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON); if (wifiMac.BeaconCount2 > 0) { wifiMac.BeaconCount2--; if (wifiMac.BeaconCount2 == 0) WIFI_triggerIRQ(WIFI_IRQ_TIMEPOSTBEACON); } } } if ((wifiMac.ucmpEnable) && (wifiMac.ucmp == wifiMac.usec)) WIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON); if (wifiMac.TXCurSlot >= 0) { Wifi_TXSlot& slot = wifiMac.TXSlots[wifiMac.TXCurSlot]; if (slot.RemPreamble > 0) slot.RemPreamble--; else if ((wifiMac.GlobalUsecTimer & slot.TimeMask) == 0) { if (slot.NotStarted) { WIFI_PreTXAdjustments(wifiMac.TXCurSlot); WIFI_triggerIRQ(WIFI_IRQ_TXSTART); if (wifiCom) wifiCom->SendPacket((u8*)&wifiMac.RAM[slot.CurAddr], slot.RemHWords << 1); slot.NotStarted = false; } slot.RemHWords--; slot.CurAddr++; wifiMac.RXTXAddr = slot.CurAddr; if (slot.RemHWords == 0) { if (wifiMac.TXCurSlot == WIFI_TXSLOT_MPCMD) { WIFI_triggerIRQ(WIFI_IRQ_UNK); if (BIT13(wifiMac.TXStatCnt)) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0B01; } else if (BIT14(wifiMac.TXStatCnt)) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0801; } slot.RegVal &= 0x7FFF; } else if (wifiMac.TXCurSlot == WIFI_TXSLOT_BEACON) { if (BIT15(wifiMac.TXStatCnt)) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0301; } } else if (wifiMac.TXCurSlot == WIFI_TXSLOT_MPREPLY) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); slot.RegVal &= 0x7FFF; WIFI_IOREG(REG_WIFI_TXBUF_REPLY1) = 0; } else { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0001 | (wifiMac.TXCurSlot == 0 ? 0 : ((wifiMac.TXCurSlot - 1) << 12)); if (BIT12(slot.RegVal)) wifiMac.TXStat |= 0x0700; slot.RegVal &= 0x7FFF; } u16 addr = slot.RegVal & 0x0FFF; wifiMac.RAM[addr] = 0x0001; wifiMac.RAM[addr+4] &= 0x00FF; wifiMac.TXBusy &= ~(1 << wifiMac.TXCurSlot); int nextslot = -1; for (int i = WIFI_TXSLOT_NUM-1; i >= 0; i--) { if (BIT_N(wifiMac.TXBusy, i)) { nextslot = i; break; } } if (nextslot < 0) { //wifiMac.rfStatus = 9; //wifiMac.rfPins = 0x00C6; wifiMac.TXCurSlot = -1; } else { wifiMac.TXCurSlot = nextslot; } } } } else if (!wifiMac.RXPacketQueue.empty()) { if ((wifiMac.GlobalUsecTimer & 7) == 0) { Wifi_RXPacket& pkt = wifiMac.RXPacketQueue.front(); if (pkt.NotStarted) { WIFI_RXPutWord(*(u16*)&pkt.Data[0]); WIFI_RXPutWord(*(u16*)&pkt.Data[2]); WIFI_RXPutWord(*(u16*)&pkt.Data[4]); WIFI_RXPutWord(*(u16*)&pkt.Data[6]); WIFI_RXPutWord(*(u16*)&pkt.Data[8]); WIFI_RXPutWord(*(u16*)&pkt.Data[10]); WIFI_triggerIRQ(WIFI_IRQ_RXSTART); pkt.NotStarted = false; //wifiMac.rfStatus = 1; wifiMac.rfPins = 0x00C7; } WIFI_RXPutWord(*(u16*)&pkt.Data[pkt.CurOffset]); pkt.CurOffset += 2; pkt.RemHWords--; if (pkt.RemHWords == 0) { wifiMac.RXWriteCursor = ((wifiMac.RXWriteCursor + 1) & (~1)); if (wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); WIFI_IOREG(REG_WIFI_RXHWWRITECSR) = wifiMac.RXWriteCursor; wifiMac.RXNum++; WIFI_triggerIRQ(WIFI_IRQ_RXEND); WIFI_IncrementRXStat<7>(); WIFI_DoAutoReply(pkt.Data); delete[] pkt.Data; wifiMac.RXPacketQueue.pop(); wifiMac.rfStatus = 9; wifiMac.rfPins = 0x00C6; } } } if ((wifiMac.GlobalUsecTimer & 1023) == 0) if (wifiCom) wifiCom->msTrigger(); } /******************************************************************************* Ad-hoc communication interface *******************************************************************************/ #ifdef EXPERIMENTAL_WIFI_COMM #define ADHOC_MAGIC "NDSWIFI\0" #define ADHOC_PROTOCOL_VERSION 0x0100 // v1.0 typedef struct _Adhoc_FrameHeader { char magic[8]; // "NDSWIFI\0" (null terminated string) u16 version; // Ad-hoc protocol version (for example 0x0502 = v5.2) u16 packetLen; // Length of the packet } Adhoc_FrameHeader; bool Adhoc_Init() { BOOL opt_true = TRUE; int res; if (!CurrentWifiHandler->WIFI_SocketsAvailable()) { WIFI_LOG(1, "Ad-hoc: failed to initialize sockets.\n"); wifi_socket = INVALID_SOCKET; return false; } // Create an UDP socket wifi_socket = socket(AF_INET, SOCK_DGRAM, 0); if (wifi_socket < 0) { WIFI_LOG(1, "Ad-hoc: Failed to create socket.\n"); return false; } // Enable the socket to be bound to an address/port that is already in use // This enables us to communicate with another DeSmuME instance running on the same computer. res = setsockopt(wifi_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(BOOL)); // Bind the socket to any address on port 7000 sockaddr_t saddr; saddr.sa_family = AF_INET; *(u32*)&saddr.sa_data[2] = htonl(INADDR_ANY); *(u16*)&saddr.sa_data[0] = htons(BASEPORT); res = bind(wifi_socket, &saddr, sizeof(sockaddr_t)); if (res < 0) { WIFI_LOG(1, "Ad-hoc: failed to bind the socket.\n"); closesocket(wifi_socket); wifi_socket = INVALID_SOCKET; return false; } // Enable broadcast mode // Not doing so results in failure when sendto'ing to broadcast address res = setsockopt(wifi_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(BOOL)); if (res < 0) { WIFI_LOG(1, "Ad-hoc: failed to enable broadcast mode.\n"); closesocket(wifi_socket); wifi_socket = INVALID_SOCKET; return false; } // Prepare an address structure for sending packets sendAddr.sa_family = AF_INET; *(u32*)&sendAddr.sa_data[2] = htonl(INADDR_BROADCAST); *(u16*)&sendAddr.sa_data[0] = htons(BASEPORT); Adhoc_Reset(); WIFI_LOG(1, "Ad-hoc: initialization successful.\n"); return true; } void Adhoc_DeInit() { if (wifi_socket >= 0) closesocket(wifi_socket); } void Adhoc_Reset() { CurrentWifiHandler->WIFI_GetUniqueMAC(FW_Mac); NDS_PatchFirmwareMAC(); printf("WIFI: ADHOC: MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", FW_Mac[0], FW_Mac[1], FW_Mac[2], FW_Mac[3], FW_Mac[4], FW_Mac[5]); } void Adhoc_SendPacket(u8* packet, u32 len) { if (wifi_socket < 0) return; WIFI_LOG(3, "Ad-hoc: sending a packet of %i bytes, frame control: %04X\n", len, *(u16*)&packet[0]); u32 frameLen = sizeof(Adhoc_FrameHeader) + len; u8* frame = new u8[frameLen]; u8* ptr = frame; Adhoc_FrameHeader header; strncpy(header.magic, ADHOC_MAGIC, 8); header.version = ADHOC_PROTOCOL_VERSION; header.packetLen = len; memcpy(ptr, &header, sizeof(Adhoc_FrameHeader)); ptr += sizeof(Adhoc_FrameHeader); memcpy(ptr, packet, len); int nbytes = sendto(wifi_socket, (const char*)frame, frameLen, 0, &sendAddr, sizeof(sockaddr_t)); WIFI_LOG(4, "Ad-hoc: sent %i/%i bytes of packet.\n", nbytes, frameLen); delete[] frame; } void Adhoc_msTrigger() { if (wifi_socket < 0) return; // Check every millisecond if we received a packet fd_set fd; struct timeval tv; FD_ZERO(&fd); FD_SET(wifi_socket, &fd); tv.tv_sec = 0; tv.tv_usec = 0; if (select(1, &fd, 0, 0, &tv)) { sockaddr_t fromAddr; socklen_t fromLen = sizeof(sockaddr_t); u8 buf[1536]; u8* ptr; u16 packetLen; int nbytes = recvfrom(wifi_socket, (char*)buf, 1536, 0, &fromAddr, &fromLen); // No packet arrived (or there was an error) if (nbytes <= 0) return; ptr = buf; Adhoc_FrameHeader header = *(Adhoc_FrameHeader*)ptr; // Check the magic string in header if (strncmp(header.magic, ADHOC_MAGIC, 8)) return; // Check the ad-hoc protocol version if (header.version != ADHOC_PROTOCOL_VERSION) return; packetLen = header.packetLen - 4; ptr += sizeof(Adhoc_FrameHeader); // If the packet is for us, send it to the wifi core if (!WIFI_compareMAC(&ptr[10], &wifiMac.mac.bytes[0])) { if (WIFI_isBroadcastMAC(&ptr[16]) || WIFI_compareMAC(&ptr[16], &wifiMac.bss.bytes[0]) || WIFI_isBroadcastMAC(&wifiMac.bss.bytes[0])) { /* WIFI_LOG(3, "Ad-hoc: received a packet of %i bytes from %i.%i.%i.%i (port %i).\n", nbytes, (u8)fromAddr.sa_data[2], (u8)fromAddr.sa_data[3], (u8)fromAddr.sa_data[4], (u8)fromAddr.sa_data[5], ntohs(*(u16*)&fromAddr.sa_data[0]));*/ WIFI_LOG(3, "Ad-hoc: received a packet of %i bytes, frame control: %04X\n", packetLen, *(u16*)&ptr[0]); WIFI_LOG(4, "Storing packet at %08X.\n", 0x04804000 + (wifiMac.RXWriteCursor<<1)); u8* packet = new u8[12 + packetLen]; WIFI_MakeRXHeader(packet, WIFI_GetRXFlags(ptr), 20, packetLen, 0, 0); memcpy(&packet[12], ptr, packetLen); WIFI_RXQueuePacket(packet, 12+packetLen); } } } } /******************************************************************************* SoftAP (fake wifi access point) *******************************************************************************/ // Note on the CRC32 field in received packets: // The wifi hardware doesn't store the CRC32 in memory when receiving a packet // so the RX header length field is indeed header+body // Hence the CRC32 has been removed from those templates. // If you wanna change SoftAP's MAC address, change this // Warning, don't mistake this for an array, it isn't #define SOFTAP_MACADDR 0x00, 0xF0, 0x1A, 0x2B, 0x3C, 0x4D const u8 SoftAP_MACAddr[6] = {SOFTAP_MACADDR}; const u8 SoftAP_Beacon[] = { /* 802.11 header */ 0x80, 0x00, // Frame control 0x00, 0x00, // Duration ID 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp (modified later) 0x80, 0x00, // Beacon interval 0x21, 0x00, // Capablilty information 0x01, 0x02, 0x82, 0x84, // Supported rates 0x03, 0x01, 0x06, // Current channel 0x05, 0x04, 0x02, 0x01, 0x00, 0x00, // TIM (no idea what the hell it is) 0x00, 0x06, 'S', 'o', 'f', 't', 'A', 'P', // SSID }; const u8 SoftAP_ProbeResponse[] = { /* 802.11 header */ 0x50, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp (modified later) 0x80, 0x00, // Beacon interval 0x21, 0x00, // Capablilty information 0x01, 0x02, 0x82, 0x84, // Supported rates 0x03, 0x01, 0x06, // Current channel 0x00, 0x06, 'S', 'o', 'f', 't', 'A', 'P', // SSID }; const u8 SoftAP_AuthFrame[] = { /* 802.11 header */ 0xB0, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x00, 0x00, // Authentication algorithm 0x02, 0x00, // Authentication sequence 0x00, 0x00, // Status }; const u8 SoftAP_AssocResponse[] = { /* 802.11 header */ 0x10, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x21, 0x00, // Capability information 0x00, 0x00, // Status 0x01, 0xC0, // Assocation ID 0x01, 0x02, 0x82, 0x84, // Supported rates }; // Deauthentication frame - sent if the user chose not to connect to WFC const u8 SoftAP_DeauthFrame[] = { /* 802.11 header */ 0xC0, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x01, 0x00, // Reason code (is "unspecified" ok?) }; //todo - make a class to wrap this //todo - zeromus - inspect memory leak safety of all this static pcap_if_t * WIFI_index_device(pcap_if_t *alldevs, int index) { pcap_if_t *curr = alldevs; for(int i = 0; i < index; i++) { if (curr->next == NULL) { CommonSettings.wifi.infraBridgeAdapter = i; break; } curr = curr->next; } WIFI_LOG(2, "SoftAP: using %s as device.\n", curr->PCAP_DEVICE_NAME); return curr; } bool SoftAP_Init() { if (!CurrentWifiHandler->WIFI_PCapAvailable()) { WIFI_LOG(1, "SoftAP: PCap library not available on your system.\n"); wifi_bridge = NULL; return false; } char errbuf[PCAP_ERRBUF_SIZE]; pcap_if_t *alldevs; int ret = 0; ret = CurrentWifiHandler->PCAP_findalldevs(&alldevs, errbuf); if (ret == -1 || alldevs == NULL) { WIFI_LOG(1, "SoftAP: PCap: failed to find any network adapter: %s\n", errbuf); return false; } pcap_if_t* dev = WIFI_index_device(alldevs,CommonSettings.wifi.infraBridgeAdapter); wifi_bridge = CurrentWifiHandler->PCAP_open(dev->name, PACKET_SIZE, PCAP_OPENFLAG_PROMISCUOUS, 1, errbuf); if(wifi_bridge == NULL) { WIFI_LOG(1, "SoftAP: PCap: failed to open %s: %s\n", dev->PCAP_DEVICE_NAME, errbuf); return false; } CurrentWifiHandler->PCAP_freealldevs(alldevs); // Set non-blocking mode if (CurrentWifiHandler->PCAP_setnonblock(wifi_bridge, 1, errbuf) == -1) { WIFI_LOG(1, "SoftAP: PCap: failed to set non-blocking mode: %s\n", errbuf); CurrentWifiHandler->PCAP_close(wifi_bridge); wifi_bridge = NULL; return false; } SoftAP_Reset(); return true; } void SoftAP_DeInit() { if(wifi_bridge != NULL) CurrentWifiHandler->PCAP_close(wifi_bridge); } void SoftAP_Reset() { SoftAP.status = APStatus_Disconnected; SoftAP.seqNum = 0; } static bool SoftAP_IsDNSRequestToWFC(u16 ethertype, u8* body) { // Check the various headers... if (ntohs(ethertype) != 0x0800) return false; // EtherType: IP if (body[0] != 0x45) return false; // Version: 4, header len: 5 if (body[9] != 0x11) return false; // Protocol: UDP if (ntohs(*(u16*)&body[22]) != 53) return false; // Dest. port: 53 (DNS) if (htons(ntohs(*(u16*)&body[28+2])) & 0x8000) return false; // must be a query // Analyze each question u16 numquestions = ntohs(*(u16*)&body[28+4]); u32 curoffset = 28+12; for (u16 curquestion = 0; curquestion < numquestions; curquestion++) { // Assemble the requested domain name u8 bitlength = 0; char domainname[256] = ""; while ((bitlength = body[curoffset++]) != 0) { strncat(domainname, (const char*)&body[curoffset], bitlength); curoffset += bitlength; if (body[curoffset] != 0) strcat(domainname, "."); } // if the domain name contains nintendowifi.net // it is most likely a WFC server // (note, conntest.nintendowifi.net just contains a dummy HTML page and // is used for connection tests, I think we can let this one slide) if ((strstr(domainname, "nintendowifi.net") != NULL) && (strcmp(domainname, "conntest.nintendowifi.net") != 0)) return true; // Skip the type and class - we don't care about that curoffset += 4; } return false; } static void SoftAP_Deauthenticate() { u32 packetLen = sizeof(SoftAP_DeauthFrame); u8* packet = new u8[12 + packetLen]; memcpy(&packet[12], SoftAP_DeauthFrame, packetLen); memcpy(&packet[12 + 4], FW_Mac, 6); // Receiver MAC *(u16*)&packet[12 + 22] = SoftAP.seqNum << 4; // Sequence number SoftAP.seqNum++; u16 rxflags = 0x0010; if (WIFI_compareMAC(wifiMac.bss.bytes, &packet[12 + 16])) rxflags |= 0x8000; WIFI_MakeRXHeader(packet, rxflags, 20, packetLen, 0, 0); WIFI_RXQueuePacket(packet, 12 + packetLen); SoftAP.status = APStatus_Disconnected; } void SoftAP_SendPacket(u8 *packet, u32 len) { u16 frameCtl = *(u16*)&packet[0]; WIFI_LOG(3, "SoftAP: Received a packet of length %i bytes. Frame control = %04X\n", len, frameCtl); //use this to log wifi messages easily /*static int ctr=0; char buf[100]; sprintf(buf,"wifi%04d.txt",ctr); FILE* outf = fopen(buf,"wb"); fwrite(packet,1,len,outf); fclose(outf); ctr++;*/ switch((frameCtl >> 2) & 0x3) { case 0x0: // Management frame { u32 packetLen; u8* rpacket; switch((frameCtl >> 4) & 0xF) { case 0x4: // Probe request { packetLen = sizeof(SoftAP_ProbeResponse); rpacket = new u8[12 + packetLen]; memcpy(&rpacket[12], SoftAP_ProbeResponse, packetLen); // Add the timestamp *(u64*)&rpacket[12 + 24] = wifiMac.GlobalUsecTimer; } break; case 0xB: // Authentication { packetLen = sizeof(SoftAP_AuthFrame); rpacket = new u8[12 + packetLen]; memcpy(&rpacket[12], SoftAP_AuthFrame, packetLen); SoftAP.status = APStatus_Authenticated; } break; case 0x0: // Association request { if (SoftAP.status != APStatus_Authenticated) return; packetLen = sizeof(SoftAP_AssocResponse); rpacket = new u8[12 + packetLen]; memcpy(&rpacket[12], SoftAP_AssocResponse, packetLen); SoftAP.status = APStatus_Associated; WIFI_LOG(1, "SoftAP connected!\n"); } break; case 0xA: // Disassociation SoftAP.status = APStatus_Authenticated; return; case 0xC: // Deauthentication SoftAP.status = APStatus_Disconnected; WIFI_LOG(1, "SoftAP disconnected\n"); return; default: WIFI_LOG(2, "SoftAP: unknown management frame type %04X\n", (frameCtl >> 4) & 0xF); return; } memcpy(&rpacket[12 + 4], FW_Mac, 6); // Receiver MAC *(u16*)&rpacket[12 + 22] = SoftAP.seqNum << 4; // Sequence number SoftAP.seqNum++; u16 rxflags = 0x0010; if (WIFI_compareMAC(wifiMac.bss.bytes, &rpacket[12 + 16])) rxflags |= 0x8000; WIFI_MakeRXHeader(rpacket, rxflags, 20, packetLen, 0, 0); // make the RX header WIFI_RXQueuePacket(rpacket, 12 + packetLen); } break; case 0x2: // Data frame { // If it has a LLC/SLIP header, send it over the Ethernet if (((*(u16*)&packet[24]) == 0xAAAA) && ((*(u16*)&packet[26]) == 0x0003) && ((*(u16*)&packet[28]) == 0x0000)) { if (SoftAP.status != APStatus_Associated) return; if (SoftAP_IsDNSRequestToWFC(*(u16*)&packet[30], &packet[32])) { SoftAP_Deauthenticate(); return; } u32 epacketLen = ((len - 30 - 4) + 14); u8 epacket[2048]; //printf("----- SENDING ETHERNET PACKET: len=%i, ethertype=%04X -----\n", // len, *(u16*)&packet[30]); memcpy(&epacket[0], &packet[16], 6); memcpy(&epacket[6], &packet[10], 6); *(u16*)&epacket[12] = *(u16*)&packet[30]; memcpy(&epacket[14], &packet[32], epacketLen - 14); if(wifi_bridge != NULL) CurrentWifiHandler->PCAP_sendpacket(wifi_bridge, epacket, epacketLen); } else { WIFI_LOG(1, "SoftAP: received non-Ethernet data frame. wtf?\n"); } } break; } } INLINE void SoftAP_SendBeacon() { u32 packetLen = sizeof(SoftAP_Beacon); u8* packet = new u8[12 + packetLen]; memcpy(&packet[12], SoftAP_Beacon, packetLen); // Copy the beacon template *(u16*)&packet[12 + 22] = SoftAP.seqNum << 4; // Sequence number SoftAP.seqNum++; *(u64*)&packet[12 + 24] = wifiMac.GlobalUsecTimer; // Timestamp u16 rxflags = 0x0011; if (WIFI_compareMAC(wifiMac.bss.bytes, &packet[12 + 16])) rxflags |= 0x8000; WIFI_MakeRXHeader(packet, rxflags, 20, packetLen, 0, 0); WIFI_RXQueuePacket(packet, 12 + packetLen); } static void SoftAP_RXHandler(u_char* user, const struct pcap_pkthdr* h, const u_char* _data) { // safety checks if ((_data == NULL) || (h == NULL)) return; u8* data = (u8*)_data; // reject the packet if it wasn't for us if (!(WIFI_isBroadcastMAC(&data[0]) || WIFI_compareMAC(&data[0], wifiMac.mac.bytes))) return; // reject the packet if we just sent it if (WIFI_compareMAC(&data[6], wifiMac.mac.bytes)) return; // The packet was for us. Let's process it then. int wpacketLen = WIFI_alignedLen(26 + 6 + (h->len-14)); u8* wpacket = new u8[12 + wpacketLen]; u16 rxflags = 0x0018; if (WIFI_compareMAC(wifiMac.bss.bytes, (u8*)SoftAP_MACAddr)) rxflags |= 0x8000; // Make a valid 802.11 frame WIFI_MakeRXHeader(wpacket, rxflags, 20, wpacketLen, 0, 0); *(u16*)&wpacket[12+0] = 0x0208; *(u16*)&wpacket[12+2] = 0x0000; memcpy(&wpacket[12+4], &data[0], 6); memcpy(&wpacket[12+10], SoftAP_MACAddr, 6); memcpy(&wpacket[12+16], &data[6], 6); *(u16*)&wpacket[12+22] = SoftAP.seqNum << 4; *(u16*)&wpacket[12+24] = 0xAAAA; *(u16*)&wpacket[12+26] = 0x0003; *(u16*)&wpacket[12+28] = 0x0000; *(u16*)&wpacket[12+30] = *(u16*)&data[12]; memcpy(&wpacket[12+32], &data[14], h->len-14); SoftAP.seqNum++; WIFI_RXQueuePacket(wpacket, 12 + wpacketLen); } void SoftAP_msTrigger() { //zero sez: every 1/10 second? does it have to be precise? this is so costly.. // Okay for 128 ms then if((wifiMac.GlobalUsecTimer & 131071) == 0) SoftAP_SendBeacon(); // EXTREMELY EXPERIMENTAL packet receiving code // Can now receive 64 packets per millisecond. Completely arbitrary limit. Todo: tweak if needed. // But due to using non-blocking mode, this shouldn't be as slow as it used to be. if (wifi_bridge != NULL) CurrentWifiHandler->PCAP_dispatch(wifi_bridge, 64, SoftAP_RXHandler, NULL); } #endif desmume-0.9.11/src/filter/0000755000000000000000000000000012467663413014027 5ustar rootrootdesmume-0.9.11/src/filter/hq2x.cpp0000755000000000000000000004231412467662066015427 0ustar rootroot/* * This file is part of the Advance project. * * Copyright (C) 2003 Andrea Mazzoleni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #include "filter.h" #include "interp.h" // ///***************************************************************************/ ///* HQ2x C implementation */ // ///* // * This effect is a rewritten implementation of the hq2x effect made by Maxim Stepin // */ // //static void hq2x_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count) //{ // unsigned i; // // for(i=0;i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = c[1]; c[3] = c[4]; c[6] = c[7]; } if (i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i> 3; // r = (int)((c[j] & 0xF800)) >> 8; // } else { // b = (int)((c[j] & 0x1F)) << 3; // g = (int)((c[j] & 0x3E0)) >> 2; // r = (int)((c[j] & 0x7C00)) >> 7; // } // const int bright = r+r+r + g+g+g + b+b; // if(bright > maxBright) maxBright = bright; // if(bright < minBright) minBright = bright; // // brightArray[j] = bright; // } // int diffBright = ((maxBright - minBright) * 7) >> 4; // if(diffBright > 7) // { // const int centerBright = brightArray[4]; // if(ABS(brightArray[0] - centerBright) > diffBright) // mask |= 1 << 0; // if(ABS(brightArray[1] - centerBright) > diffBright) // mask |= 1 << 1; // if(ABS(brightArray[2] - centerBright) > diffBright) // mask |= 1 << 2; // if(ABS(brightArray[3] - centerBright) > diffBright) // mask |= 1 << 3; // if(ABS(brightArray[5] - centerBright) > diffBright) // mask |= 1 << 4; // if(ABS(brightArray[6] - centerBright) > diffBright) // mask |= 1 << 5; // if(ABS(brightArray[7] - centerBright) > diffBright) // mask |= 1 << 6; // if(ABS(brightArray[8] - centerBright) > diffBright) // mask |= 1 << 7; // } // //#define P0 dst0[0] //#define P1 dst0[1] //#define P2 dst1[0] //#define P3 dst1[1] //#define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right //#define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right //#define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left //#define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left //#define IC(p0) c[p0] //#define I11(p0,p1) interp_16_11(c[p0], c[p1]) //#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2]) //#define I31(p0,p1) interp_16_31(c[p0], c[p1]) //#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2]) //#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2]) //#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2]) //#define I53(p0,p1) interp_16_53(c[p0], c[p1]) //#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2]) //#define I71(p0,p1) interp_16_71(c[p0], c[p1]) //#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2]) //#define I97(p0,p1) interp_16_97(c[p0], c[p1]) //#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2]) //#define I151(p0,p1) interp_16_151(c[p0], c[p1]) // // switch (mask) { //#include "hq2x.h" // } // //#undef P0 //#undef P1 //#undef P2 //#undef P3 //#undef MUR //#undef MDR //#undef MDL //#undef MUL //#undef IC //#undef I11 //#undef I211 //#undef I31 //#undef I332 //#undef I431 //#undef I521 //#undef I53 //#undef I611 //#undef I71 //#undef I772 //#undef I97 //#undef I1411 //#undef I151 // // src0 += 1; // src1 += 1; // src2 += 1; // dst0 += 2; // dst1 += 2; // } //} static void hq2xS_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count) { unsigned i; for(i=0;i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = src0[0]; c[3] = src1[0]; c[6] = src2[0]; } if (i> 8; const int r = (int)((c[j] & 0xF80000)) >> 16; const int bright = r+r+r + g+g+g + b+b; if(bright > maxBright) maxBright = bright; if(bright < minBright) minBright = bright; brightArray[j] = bright; } int diffBright = ((maxBright - minBright) * 7) >> 4; if(diffBright > 7) { const int centerBright = brightArray[4]; if(ABS(brightArray[0] - centerBright) > diffBright) mask |= 1 << 0; if(ABS(brightArray[1] - centerBright) > diffBright) mask |= 1 << 1; if(ABS(brightArray[2] - centerBright) > diffBright) mask |= 1 << 2; if(ABS(brightArray[3] - centerBright) > diffBright) mask |= 1 << 3; if(ABS(brightArray[5] - centerBright) > diffBright) mask |= 1 << 4; if(ABS(brightArray[6] - centerBright) > diffBright) mask |= 1 << 5; if(ABS(brightArray[7] - centerBright) > diffBright) mask |= 1 << 6; if(ABS(brightArray[8] - centerBright) > diffBright) mask |= 1 << 7; } #define P0 dst0[0] #define P1 dst0[1] #define P2 dst1[0] #define P3 dst1[1] #define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right #define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right #define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left #define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left #define IC(p0) c[p0] #define I11(p0,p1) interp_32_11(c[p0], c[p1]) #define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2]) #define I31(p0,p1) interp_32_31(c[p0], c[p1]) #define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2]) #define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2]) #define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2]) #define I53(p0,p1) interp_32_53(c[p0], c[p1]) #define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2]) #define I71(p0,p1) interp_32_71(c[p0], c[p1]) #define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2]) #define I97(p0,p1) interp_32_97(c[p0], c[p1]) #define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2]) #define I151(p0,p1) interp_32_151(c[p0], c[p1]) switch (mask) { #include "hq2x.h" } #undef P0 #undef P1 #undef P2 #undef P3 #undef MUR #undef MDR #undef MDL #undef MUL #undef IC #undef I11 #undef I211 #undef I31 #undef I332 #undef I431 #undef I521 #undef I53 #undef I611 #undef I71 #undef I772 #undef I97 #undef I1411 #undef I151 src0 += 1; src1 += 1; src2 += 1; dst0 += 2; dst1 += 2; } } // //void hq2x(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // hq2x_16_def(dst0, dst1, src0, src0, src1, width); // // int count = height; // // count -= 2; // while(count) { // dst0 += dstPitch; // dst1 += dstPitch; // hq2x_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // hq2x_16_def(dst0, dst1, src0, src1, src1, width); //} void hq2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq2x_32_def(dst0, dst1, src0, src0, src1, width); int count = height; count -= 2; while(count) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2x_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2x_32_def(dst0, dst1, src0, src1, src1, width); } // //void hq2xS(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // hq2xS_16_def(dst0, dst1, src0, src0, src1, width); // // int count = height; // // count -= 2; // while(count) { // dst0 += dstPitch; // dst1 += dstPitch; // hq2xS_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // hq2xS_16_def(dst0, dst1, src0, src1, src1, width); //} void hq2xS32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq2xS_32_def(dst0, dst1, src0, src0, src1, width); int count = height; count -= 2; while(count) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2xS_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2xS_32_def(dst0, dst1, src0, src1, src1, width); } //void hq2x_init(unsigned bits_per_pixel) //{ // interp_set(bits_per_pixel); //} void RenderHQ2X (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq2x32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } void RenderHQ2XS (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq2xS32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } desmume-0.9.11/src/filter/filter.h0000755000000000000000000000376112467662066015502 0ustar rootroot/* Copyright (C) 2009-2014 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #define FILTER_MAX_WORKING_SURFACE_COUNT 8 typedef struct { unsigned char *Surface; unsigned int Pitch; unsigned int Width, Height; unsigned char *workingSurface[FILTER_MAX_WORKING_SURFACE_COUNT]; void *userData; } SSurface; void RenderNearest2X (SSurface Src, SSurface Dst); void RenderLQ2X (SSurface Src, SSurface Dst); void RenderLQ2XS (SSurface Src, SSurface Dst); void RenderHQ2X (SSurface Src, SSurface Dst); void RenderHQ4X (SSurface Src, SSurface Dst); void RenderHQ4XS (SSurface Src, SSurface Dst); void RenderHQ2XS (SSurface Src, SSurface Dst); void Render2xSaI (SSurface Src, SSurface Dst); void RenderSuper2xSaI (SSurface Src, SSurface Dst); void RenderSuperEagle (SSurface Src, SSurface Dst); void RenderScanline( SSurface Src, SSurface Dst); void RenderBilinear( SSurface Src, SSurface Dst); void RenderEPX( SSurface Src, SSurface Dst); void RenderEPXPlus( SSurface Src, SSurface Dst); void RenderEPX_1Point5x( SSurface Src, SSurface Dst); void RenderEPXPlus_1Point5x( SSurface Src, SSurface Dst); void RenderNearest_1Point5x( SSurface Src, SSurface Dst); void RenderNearestPlus_1Point5x( SSurface Src, SSurface Dst); void Render2xBRZ(SSurface Src, SSurface Dst); void Render3xBRZ(SSurface Src, SSurface Dst); void Render4xBRZ(SSurface Src, SSurface Dst); void Render5xBRZ(SSurface Src, SSurface Dst); desmume-0.9.11/src/filter/bilinear.cpp0000755000000000000000000003112312467662066016326 0ustar rootroot/** Code adapted from Exult source code by Forgotten ** Scale.cc - Trying to scale with bilinear interpolation. ** ** Written: 6/14/00 - JSF **/ #include "filter.h" #include "types.h" int systemRedShift = 16; int systemGreenShift = 8; int systemBlueShift = 0; /* #define RGB1(r,g,b) ((r)>>3) << systemRedShift |\ ((g) >> 3) << systemGreenShift |\ ((b) >> 3) << systemBlueShift\ */ #define RGB1(r,g,b) (((r))<> systemRedShift) & 0x1f) << 3; *row++ = ((color >> systemGreenShift) & 0x1f) << 3; *row++ = ((color >> systemBlueShift) & 0x1f) << 3; } // any remaining elements to be written to 'row' are a replica of the // preceding pixel u8 *p = row-3; while (row < all_stop) { // we're guaranteed three elements per pixel; could unroll the loop // further, especially with a Duff's Device, but the gains would be // probably limited (judging by profiler output) *row++ = *p++; *row++ = *p++; *row++ = *p++; } } static void fill_rgb_row_32(u32 *from, int src_width, u8 *row, int width) { u8 *copy_start = row + src_width*3; u8 *all_stop = row + width*3; while (row < copy_start) { u32 color = *from++; *row++ = ((color >> (systemRedShift)) ) ; *row++ = ((color >> (systemGreenShift)) ) ; *row++ = ((color >> (systemBlueShift)) ) ; } // any remaining elements to be written to 'row' are a replica of the // preceding pixel u8 *p = row-3; while (row < all_stop) { // we're guaranteed three elements per pixel; could unroll the loop // further, especially with a Duff's Device, but the gains would be // probably limited (judging by profiler output) *row++ = *p++; *row++ = *p++; *row++ = *p++; } } void Bilinear(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u16 *to = (u16 *)dstPtr; u16 *to_odd = (u16 *)(dstPtr + dstPitch); int from_width = width; u16 *from = (u16 *)srcPtr; fill_rgb_row_16(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u16 *from_orig = from; u16 *to_orig = to; if (y+1 < height) fill_rgb_row_16(from+width, from_width, rgb_row_next, width+1); else fill_rgb_row_16(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in *to++ = RGB1(*ar, *ag, *ab); // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u16 *)((u8 *)from_orig + srcPitch); to = (u16 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u16 *)((u8 *)to + dstPitch); } } void BilinearPlus(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u16 *to = (u16 *)dstPtr; u16 *to_odd = (u16 *)(dstPtr + dstPitch); int from_width = width; u16 *from = (u16 *)srcPtr; fill_rgb_row_16(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u16 *from_orig = from; u16 *to_orig = to; if (y+1 < height) fill_rgb_row_16(from+width, from_width, rgb_row_next, width+1); else fill_rgb_row_16(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in //*to++ = manip.rgb(*ar, *ag, *ab); #ifdef USE_ORIGINAL_BILINEAR_PLUS *to++ = RGB( (((*ar)<<2) +((*ar)) + (*cr+*br+*br) )>> 3, (((*ag)<<2) +((*ag)) + (*cg+*bg+*bg) )>> 3, (((*ab)<<2) +((*ab)) + (*cb+*bb+*bb) )>> 3); #else *to++ = RGB1( (((*ar)<<3) +((*ar)<<1) + (*cr+*br+*br+*cr) )>> 4, (((*ag)<<3) +((*ag)<<1) + (*cg+*bg+*bg+*cg) )>> 4, (((*ab)<<3) +((*ab)<<1) + (*cb+*bb+*bb+*cb) )>> 4); #endif // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u16 *)((u8 *)from_orig + srcPitch); to = (u16 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u16 *)((u8 *)to + dstPitch); } } void Bilinear32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u32 *to = (u32 *)dstPtr; u32 *to_odd = (u32 *)(dstPtr + dstPitch); int from_width = width; u32 *from = (u32 *)srcPtr; fill_rgb_row_32(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u32 *from_orig = from; u32 *to_orig = to; if (y+1 < height) fill_rgb_row_32(from+width+1, from_width, rgb_row_next, width+1); else fill_rgb_row_32(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in int m = *ar; int mm = *ag; int mmmm = *ab; int mmm = RGB1(*ar, *ag, *ab); *to++ = RGB1(*ar, *ag, *ab); // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u32 *)((u8 *)from_orig + srcPitch); to = (u32 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u32 *)((u8 *)to + dstPitch); } } void BilinearPlus32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u32 *to = (u32 *)dstPtr; u32 *to_odd = (u32 *)(dstPtr + dstPitch); int from_width = width; u32 *from = (u32 *)srcPtr; fill_rgb_row_32(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u32 *from_orig = from; u32 *to_orig = to; if (y+1 < height) fill_rgb_row_32(from+width+1, from_width, rgb_row_next, width+1); else fill_rgb_row_32(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in //*to++ = manip.rgb(*ar, *ag, *ab); #ifdef USE_ORIGINAL_BILINEAR_PLUS *to++ = RGB( (((*ar)<<2) +((*ar)) + (*cr+*br+*br) )>> 3, (((*ag)<<2) +((*ag)) + (*cg+*bg+*bg) )>> 3, (((*ab)<<2) +((*ab)) + (*cb+*bb+*bb) )>> 3); #else *to++ = RGB1( (((*ar)<<3) +((*ar)<<1) + (*cr+*br+*br+*cr) )>> 4, (((*ag)<<3) +((*ag)<<1) + (*cg+*bg+*bg+*cg) )>> 4, (((*ab)<<3) +((*ab)<<1) + (*cb+*bb+*bb+*cb) )>> 4); #endif // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u32 *)((u8 *)from_orig + srcPitch); to = (u32 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u32 *)((u8 *)to + dstPitch); } } void RenderBilinear (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; Bilinear32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } desmume-0.9.11/src/filter/hq4x.dat0000755000000000000000000026161212467662066015423 0ustar rootroot/* * This file is part of the Advance project. * * Copyright (C) 2004 Andrea Mazzoleni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ /* * This effect is a rewritten implementation of the hq effect made by Maxim Stepin */ case 0 : case 1 : case 4 : case 5 : case 32 : case 33 : case 36 : case 37 : case 128 : case 129 : case 132 : case 133 : case 160 : case 161 : case 164 : case 165 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 2 : case 34 : case 130 : case 162 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 3 : case 35 : case 131 : case 163 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 6 : case 38 : case 134 : case 166 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 7 : case 39 : case 135 : case 167 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 8 : case 12 : case 136 : case 140 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 9 : case 13 : case 137 : case 141 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 10 : case 138 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); P(1, 1) = I1(4); } } break; case 11 : case 139 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 14 : case 142 : { P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(5, 3, 1, 3); P(2, 0) = I2(3, 1, 1, 4); P(3, 0) = I2(3, 1, 4, 1); P(0, 1) = I3(2, 1, 1, 3, 1, 4); P(1, 1) = I3(6, 1, 1, 4, 1, 3); } } break; case 15 : case 143 : { P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(5, 3, 1, 3); P(2, 0) = I2(3, 1, 1, 4); P(3, 0) = I2(3, 1, 4, 1); P(0, 1) = I3(2, 1, 1, 3, 1, 4); P(1, 1) = I3(6, 1, 1, 4, 1, 3); } } break; case 16 : case 17 : case 48 : case 49 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 18 : case 50 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(1, 1, 4, 5); } } break; case 19 : case 51 : { P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(0, 0) = I2(3, 1, 4, 1); P(1, 0) = I2(3, 1, 1, 4); P(2, 0) = I2(5, 3, 1, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(2, 1, 1, 5, 1, 4); } } break; case 20 : case 21 : case 52 : case 53 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 22 : case 54 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 23 : case 55 : { P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 1); P(1, 0) = I2(3, 1, 1, 4); P(2, 0) = I2(5, 3, 1, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(2, 1, 1, 5, 1, 4); } } break; case 24 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 25 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 26 : case 31 : { P(1, 1) = I1(4); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 27 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 28 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 29 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 30 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 40 : case 44 : case 168 : case 172 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 41 : case 45 : case 169 : case 173 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 42 : case 170 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I3(2, 1, 1, 1, 3, 4); P(0, 1) = I2(5, 3, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(0, 2) = I2(3, 1, 3, 4); P(0, 3) = I2(3, 1, 4, 3); } } break; case 43 : case 171 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I3(2, 1, 1, 1, 3, 4); P(0, 1) = I2(5, 3, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(0, 2) = I2(3, 1, 3, 4); P(0, 3) = I2(3, 1, 4, 3); } } break; case 46 : case 174 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 47 : case 175 : { P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } } break; case 56 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 57 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 58 : { P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 59 : { P(1, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 60 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 61 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 62 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 63 : { P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 64 : case 65 : case 68 : case 69 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 66 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 67 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 70 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 71 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 72 : case 76 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(1, 1, 3, 4); P(1, 2) = I1(4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 73 : case 77 : { P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 0) = I2(3, 1, 4, 3); P(0, 1) = I2(3, 1, 3, 4); P(0, 2) = I2(5, 3, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I3(2, 1, 1, 7, 3, 4); } } break; case 74 : case 107 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 75 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 78 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 79 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 80 : case 81 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 82 : case 214 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 83 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 84 : case 85 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 0) = I2(5, 3, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(3, 0) = I2(3, 1, 4, 5); P(3, 1) = I2(3, 1, 5, 4); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I2(5, 3, 5, 7); P(2, 3) = I3(2, 1, 1, 7, 4, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 86 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 87 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 88 : case 248 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 89 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 90 : { if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 91 : { P(1, 1) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 92 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 93 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 94 : { P(2, 1) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 95 : { P(1, 1) = I1(4); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 96 : case 97 : case 100 : case 101 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 98 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 99 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 102 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 103 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 104 : case 108 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 105 : case 109 : { P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 3); P(0, 1) = I2(3, 1, 3, 4); P(0, 2) = I2(5, 3, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I3(2, 1, 1, 7, 3, 4); } } break; case 106 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 110 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 111 : { P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } } break; case 112 : case 113 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(2, 1, 1, 5, 4, 7); P(0, 3) = I2(3, 1, 4, 7); P(1, 3) = I2(3, 1, 7, 4); P(2, 3) = I2(5, 3, 7, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 114 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 115 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 116 : case 117 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 118 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 119 : { P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 1); P(1, 0) = I2(3, 1, 1, 4); P(2, 0) = I2(5, 3, 1, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(2, 1, 1, 5, 1, 4); } } break; case 120 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 121 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 122 : { P(1, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 123 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 124 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 125 : { P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 3); P(0, 1) = I2(3, 1, 3, 4); P(0, 2) = I2(5, 3, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I3(2, 1, 1, 7, 3, 4); } } break; case 126 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 127 : { P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 144 : case 145 : case 176 : case 177 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 146 : case 178 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(3, 2) = I2(7, 1, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } else { P(2, 0) = I3(2, 1, 1, 1, 4, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I2(5, 3, 5, 1); P(3, 2) = I2(3, 1, 5, 4); P(3, 3) = I2(3, 1, 4, 5); } } break; case 147 : case 179 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 148 : case 149 : case 180 : case 181 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 150 : case 182 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(3, 2) = I2(7, 1, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } else { P(2, 0) = I3(2, 1, 1, 1, 4, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I2(5, 3, 5, 1); P(3, 2) = I2(3, 1, 5, 4); P(3, 3) = I2(3, 1, 4, 5); } } break; case 151 : case 183 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 152 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 153 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 154 : { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 155 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 156 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 157 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 158 : { P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 159 : { P(2, 0) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 184 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 185 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 186 : { P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 187 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I3(2, 1, 1, 1, 3, 4); P(0, 1) = I2(5, 3, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(0, 2) = I2(3, 1, 3, 4); P(0, 3) = I2(3, 1, 4, 3); } } break; case 188 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 189 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 190 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(3, 2) = I2(7, 1, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } else { P(2, 0) = I3(2, 1, 1, 1, 4, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I2(5, 3, 5, 1); P(3, 2) = I2(3, 1, 5, 4); P(3, 3) = I2(3, 1, 4, 5); } } break; case 191 : { P(1, 0) = I1(4); P(2, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 192 : case 193 : case 196 : case 197 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 194 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 195 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 198 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 199 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 200 : case 204 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } else { P(0, 2) = I3(2, 1, 1, 3, 4, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(5, 3, 7, 3); P(2, 3) = I2(3, 1, 7, 4); P(3, 3) = I2(3, 1, 4, 7); } } break; case 201 : case 205 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } } break; case 202 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 203 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 206 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 207 : { P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(5, 3, 1, 3); P(2, 0) = I2(3, 1, 1, 4); P(3, 0) = I2(3, 1, 4, 1); P(0, 1) = I3(2, 1, 1, 3, 1, 4); P(1, 1) = I3(6, 1, 1, 4, 1, 3); } } break; case 208 : case 209 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 210 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 211 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 212 : case 213 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 0) = I2(5, 3, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 0) = I2(3, 1, 4, 5); P(3, 1) = I2(3, 1, 5, 4); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I2(5, 3, 5, 7); P(2, 3) = I3(2, 1, 1, 7, 4, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 215 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 216 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 217 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 218 : { P(2, 2) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 219 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 220 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 221 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 0) = I2(5, 3, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 0) = I2(3, 1, 4, 5); P(3, 1) = I2(3, 1, 5, 4); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I2(5, 3, 5, 7); P(2, 3) = I3(2, 1, 1, 7, 4, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 222 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 223 : { P(2, 0) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 224 : case 225 : case 228 : case 229 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 226 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 227 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 230 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 231 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 232 : case 236 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } else { P(0, 2) = I3(2, 1, 1, 3, 4, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(5, 3, 7, 3); P(2, 3) = I2(3, 1, 7, 4); P(3, 3) = I2(3, 1, 4, 7); } } break; case 233 : case 237 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } } break; case 234 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 235 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 238 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } else { P(0, 2) = I3(2, 1, 1, 3, 4, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(5, 3, 7, 3); P(2, 3) = I2(3, 1, 7, 4); P(3, 3) = I2(3, 1, 4, 7); } } break; case 239 : { P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } } break; case 240 : case 241 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(2, 1, 1, 5, 4, 7); P(0, 3) = I2(3, 1, 4, 7); P(1, 3) = I2(3, 1, 7, 4); P(2, 3) = I2(5, 3, 7, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 242 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 243 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(2, 1, 1, 5, 4, 7); P(0, 3) = I2(3, 1, 4, 7); P(1, 3) = I2(3, 1, 7, 4); P(2, 3) = I2(5, 3, 7, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 244 : case 245 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 246 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 247 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 249 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(1, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 250 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 251 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(1, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 252 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 253 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(1, 3) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 254 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 255 : { P(1, 0) = I1(4); P(2, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(1, 3) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; desmume-0.9.11/src/filter/2xsai.cpp0000755000000000000000000010676612467662066015607 0ustar rootroot#include "filter.h" #include "types.h" //ref: http://vba-rerecording.googlecode.com/svn/trunk/src/2xsai.cpp static u32 colorMask = 0xfefefe; static u32 lowPixelMask = 0x010101; static u32 qcolorMask = 0xfcfcfc; static u32 qlowpixelMask = 0x030303; static u32 redblueMask = 0xF81F; static u32 greenMask = 0x7E0; int Init_2xSaI(u32 BitFormat, u32 systemColorDepth) { if(systemColorDepth == 16) { if (BitFormat == 565) { colorMask = 0xF7DEF7DE; lowPixelMask = 0x08210821; qcolorMask = 0xE79CE79C; qlowpixelMask = 0x18631863; redblueMask = 0xF81F; greenMask = 0x7E0; } else if (BitFormat == 555) { colorMask = 0x7BDE7BDE; lowPixelMask = 0x04210421; qcolorMask = 0x739C739C; qlowpixelMask = 0x0C630C63; redblueMask = 0x7C1F; greenMask = 0x3E0; } else { return 0; } } else if(systemColorDepth == 32) { colorMask = 0xfefefe; lowPixelMask = 0x010101; qcolorMask = 0xfcfcfc; qlowpixelMask = 0x030303; } else return 0; return 1; } static inline int GetResult1 (u32 A, u32 B, u32 C, u32 D, u32 /* E */) { int x = 0; int y = 0; int r = 0; if (A == C) x += 1; else if (B == C) y += 1; if (A == D) x += 1; else if (B == D) y += 1; if (x <= 1) r += 1; if (y <= 1) r -= 1; return r; } static inline int GetResult2 (u32 A, u32 B, u32 C, u32 D, u32 /* E */) { int x = 0; int y = 0; int r = 0; if (A == C) x += 1; else if (B == C) y += 1; if (A == D) x += 1; else if (B == D) y += 1; if (x <= 1) r -= 1; if (y <= 1) r += 1; return r; } static inline int GetResult (u32 A, u32 B, u32 C, u32 D) { int x = 0; int y = 0; int r = 0; if (A == C) x += 1; else if (B == C) y += 1; if (A == D) x += 1; else if (B == D) y += 1; if (x <= 1) r += 1; if (y <= 1) r -= 1; return r; } static inline u32 INTERPOLATE (u32 A, u32 B) { if (A != B) { return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask)); } else return A; } static inline u32 Q_INTERPOLATE (u32 A, u32 B, u32 C, u32 D) { register u32 x = ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); register u32 y = (A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); y = (y >> 2) & qlowpixelMask; return x + y; } #define BLUE_MASK565 0x001F001F #define RED_MASK565 0xF800F800 #define GREEN_MASK565 0x07E007E0 #define BLUE_MASK555 0x001F001F #define RED_MASK555 0x7C007C00 #define GREEN_MASK555 0x03E003E0 void Super2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u16 *bP; u8 *dP; u32 inc_bP; u32 Nextline = srcPitch >> 1; { inc_bP = 1; for (; height; height--) { bP = (u16 *) srcPtr; dP = (u8 *) dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA0, colorA1, colorA2, colorA3, colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; //--------------------------------------- B1 B2 // 4 5 6 S2 // 1 2 3 S1 // A1 A2 colorB0 = *(bP - Nextline - 1); colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); colorB3 = *(bP - Nextline + 2); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA0 = *(bP + Nextline + Nextline - 1); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); colorA3 = *(bP + Nextline + Nextline + 2); //-------------------------------------- if (color2 == color6 && color5 != color3) { product2b = product1b = color2; } else if (color5 == color3 && color2 != color6) { product2b = product1b = color5; } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) product2b = product1b = color6; else if (r < 0) product2b = product1b = color5; else { product2b = product1b = INTERPOLATE (color5, color6); } } else { if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0) product2b = Q_INTERPOLATE (color3, color3, color3, color2); else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3) product2b = Q_INTERPOLATE (color2, color2, color2, color3); else product2b = INTERPOLATE (color2, color3); if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0) product1b = Q_INTERPOLATE (color6, color6, color6, color5); else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3) product1b = Q_INTERPOLATE (color6, color5, color5, color5); else product1b = INTERPOLATE (color5, color6); } if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2) product2a = INTERPOLATE (color2, color5); else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0) product2a = INTERPOLATE (color2, color5); else product2a = color2; if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2) product1a = INTERPOLATE (color2, color5); else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0) product1a = INTERPOLATE (color2, color5); else product1a = color5; #ifdef WORDS_BIGENDIAN product1a = (product1a << 16) | product1b; product2a = (product2a << 16) | product2b; #else product1a = product1a | (product1b << 16); product2a = product2a | (product2b << 16); #endif *((u32 *) dP) = product1a; *((u32 *) (dP + dstPitch)) = product2a; bP += inc_bP; dP += sizeof (u32); } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (; height; height--) } } void Super2xSaI32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *bP; u32 *dP; u32 inc_bP; u32 Nextline = srcPitch >> 2; inc_bP = 1; for (; height; height--) { bP = (u32 *) srcPtr; dP = (u32 *) dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA0, colorA1, colorA2, colorA3, colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; //--------------------------------------- B1 B2 // 4 5 6 S2 // 1 2 3 S1 // A1 A2 colorB0 = *(bP - Nextline - 1); colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); colorB3 = *(bP - Nextline + 2); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA0 = *(bP + Nextline + Nextline - 1); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); colorA3 = *(bP + Nextline + Nextline + 2); //-------------------------------------- if (color2 == color6 && color5 != color3) { product2b = product1b = color2; } else if (color5 == color3 && color2 != color6) { product2b = product1b = color5; } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) product2b = product1b = color6; else if (r < 0) product2b = product1b = color5; else { product2b = product1b = INTERPOLATE (color5, color6); } } else { if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0) product2b = Q_INTERPOLATE (color3, color3, color3, color2); else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3) product2b = Q_INTERPOLATE (color2, color2, color2, color3); else product2b = INTERPOLATE (color2, color3); if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0) product1b = Q_INTERPOLATE (color6, color6, color6, color5); else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3) product1b = Q_INTERPOLATE (color6, color5, color5, color5); else product1b = INTERPOLATE (color5, color6); } if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2) product2a = INTERPOLATE (color2, color5); else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0) product2a = INTERPOLATE (color2, color5); else product2a = color2; if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2) product1a = INTERPOLATE (color2, color5); else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0) product1a = INTERPOLATE (color2, color5); else product1a = color5; *(dP) = product1a; *(dP+1) = product1b; *(dP + (dstPitch >> 2)) = product2a; *(dP + (dstPitch >> 2) + 1) = product2b; bP += inc_bP; dP += 2; } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (; height; height--) } void SuperEagle (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 *dP; u16 *bP; // u16 *xP; u32 inc_bP; { inc_bP = 1; u32 Nextline = srcPitch >> 1; for (; height; height--) { bP = (u16 *) srcPtr; // xP = (u16 *) deltaPtr; dP = dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); // -------------------------------------- if (color2 == color6 && color5 != color3) { product1b = product2a = color2; if ((color1 == color2) || (color6 == colorB2)) { product1a = INTERPOLATE (color2, color5); product1a = INTERPOLATE (color2, product1a); // product1a = color2; } else { product1a = INTERPOLATE (color5, color6); } if ((color6 == colorS2) || (color2 == colorA1)) { product2b = INTERPOLATE (color2, color3); product2b = INTERPOLATE (color2, product2b); // product2b = color2; } else { product2b = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 != color6) { product2b = product1a = color5; if ((colorB1 == color5) || (color3 == colorS1)) { product1b = INTERPOLATE (color5, color6); product1b = INTERPOLATE (color5, product1b); // product1b = color5; } else { product1b = INTERPOLATE (color5, color6); } if ((color3 == colorA2) || (color4 == color5)) { product2a = INTERPOLATE (color5, color2); product2a = INTERPOLATE (color5, product2a); // product2a = color5; } else { product2a = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) { product1b = product2a = color2; product1a = product2b = INTERPOLATE (color5, color6); } else if (r < 0) { product2b = product1a = color5; product1b = product2a = INTERPOLATE (color5, color6); } else { product2b = product1a = color5; product1b = product2a = color2; } } else { product2b = product1a = INTERPOLATE (color2, color6); product2b = Q_INTERPOLATE (color3, color3, color3, product2b); product1a = Q_INTERPOLATE (color5, color5, color5, product1a); product2a = product1b = INTERPOLATE (color5, color3); product2a = Q_INTERPOLATE (color2, color2, color2, product2a); product1b = Q_INTERPOLATE (color6, color6, color6, product1b); // product1a = color5; // product1b = color6; // product2a = color2; // product2b = color3; } #ifdef WORDS_BIGENDIAN product1a = (product1a << 16) | product1b; product2a = (product2a << 16) | product2b; #else product1a = product1a | (product1b << 16); product2a = product2a | (product2b << 16); #endif *((u32 *) dP) = product1a; *((u32 *) (dP + dstPitch)) = product2a; // *xP = color5; bP += inc_bP; // xP += inc_bP; dP += sizeof (u32); } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } } void SuperEagle32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dP; u32 *bP; // u32 *xP; u32 inc_bP; inc_bP = 1; u32 Nextline = srcPitch >> 2; for (; height; height--) { bP = (u32 *) srcPtr; // xP = (u32 *) deltaPtr; dP = (u32 *)dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); // -------------------------------------- if (color2 == color6 && color5 != color3) { product1b = product2a = color2; if ((color1 == color2) || (color6 == colorB2)) { product1a = INTERPOLATE (color2, color5); product1a = INTERPOLATE (color2, product1a); // product1a = color2; } else { product1a = INTERPOLATE (color5, color6); } if ((color6 == colorS2) || (color2 == colorA1)) { product2b = INTERPOLATE (color2, color3); product2b = INTERPOLATE (color2, product2b); // product2b = color2; } else { product2b = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 != color6) { product2b = product1a = color5; if ((colorB1 == color5) || (color3 == colorS1)) { product1b = INTERPOLATE (color5, color6); product1b = INTERPOLATE (color5, product1b); // product1b = color5; } else { product1b = INTERPOLATE (color5, color6); } if ((color3 == colorA2) || (color4 == color5)) { product2a = INTERPOLATE (color5, color2); product2a = INTERPOLATE (color5, product2a); // product2a = color5; } else { product2a = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) { product1b = product2a = color2; product1a = product2b = INTERPOLATE (color5, color6); } else if (r < 0) { product2b = product1a = color5; product1b = product2a = INTERPOLATE (color5, color6); } else { product2b = product1a = color5; product1b = product2a = color2; } } else { product2b = product1a = INTERPOLATE (color2, color6); product2b = Q_INTERPOLATE (color3, color3, color3, product2b); product1a = Q_INTERPOLATE (color5, color5, color5, product1a); product2a = product1b = INTERPOLATE (color5, color3); product2a = Q_INTERPOLATE (color2, color2, color2, product2a); product1b = Q_INTERPOLATE (color6, color6, color6, product1b); // product1a = color5; // product1b = color6; // product2a = color2; // product2b = color3; } *(dP) = product1a; *(dP+1) = product1b; *(dP + (dstPitch >> 2)) = product2a; *(dP + (dstPitch >> 2) +1) = product2b; // *xP = color5; bP += inc_bP; // xP += inc_bP; dP += 2; } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } void _2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 *dP; u16 *bP; u32 inc_bP; { inc_bP = 1; u32 Nextline = srcPitch >> 1; for (; height; height--) { bP = (u16 *) srcPtr; dP = dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { register u32 colorA, colorB; u32 colorC, colorD, colorE, colorF, colorG, colorH, colorI, colorJ, colorK, colorL, colorM, colorN, colorO, colorP; u32 product, product1, product2; //--------------------------------------- // Map of the pixels: I|E F|J // G|A B|K // H|C D|L // M|N O|P colorI = *(bP - Nextline - 1); colorE = *(bP - Nextline); colorF = *(bP - Nextline + 1); colorJ = *(bP - Nextline + 2); colorG = *(bP - 1); colorA = *(bP); colorB = *(bP + 1); colorK = *(bP + 2); colorH = *(bP + Nextline - 1); colorC = *(bP + Nextline); colorD = *(bP + Nextline + 1); colorL = *(bP + Nextline + 2); colorM = *(bP + Nextline + Nextline - 1); colorN = *(bP + Nextline + Nextline); colorO = *(bP + Nextline + Nextline + 1); colorP = *(bP + Nextline + Nextline + 2); if ((colorA == colorD) && (colorB != colorC)) { if (((colorA == colorE) && (colorB == colorL)) || ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))) { product = colorA; } else { product = INTERPOLATE (colorA, colorB); } if (((colorA == colorG) && (colorC == colorO)) || ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))) { product1 = colorA; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorA; } else if ((colorB == colorC) && (colorA != colorD)) { if (((colorB == colorF) && (colorA == colorH)) || ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if (((colorC == colorH) && (colorA == colorF)) || ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorB; } else if ((colorA == colorD) && (colorB == colorC)) { if (colorA == colorB) { product = colorA; product1 = colorA; product2 = colorA; } else { register int r = 0; product1 = INTERPOLATE (colorA, colorC); product = INTERPOLATE (colorA, colorB); r += GetResult1 (colorA, colorB, colorG, colorE, colorI); r += GetResult2 (colorB, colorA, colorK, colorF, colorJ); r += GetResult2 (colorB, colorA, colorH, colorN, colorM); r += GetResult1 (colorA, colorB, colorL, colorO, colorP); if (r > 0) product2 = colorA; else if (r < 0) product2 = colorB; else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); } } } else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) { product = colorA; } else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) { product1 = colorA; } else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } } #ifdef WORDS_BIGENDIAN product = (colorA << 16) | product ; product1 = (product1 << 16) | product2 ; #else product = colorA | (product << 16); product1 = product1 | (product2 << 16); #endif *((s32 *) dP) = product; *((u32 *) (dP + dstPitch)) = product1; bP += inc_bP; dP += sizeof (u32); } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } } void _2xSaI32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dP; u32 *bP; u32 inc_bP = 1; u32 Nextline = srcPitch >> 2; for (; height; height--) { bP = (u32 *) srcPtr; dP = (u32 *) dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { register u32 colorA, colorB; u32 colorC, colorD, colorE, colorF, colorG, colorH, colorI, colorJ, colorK, colorL, colorM, colorN, colorO, colorP; u32 product, product1, product2; //--------------------------------------- // Map of the pixels: I|E F|J // G|A B|K // H|C D|L // M|N O|P colorI = *(bP - Nextline - 1); colorE = *(bP - Nextline); colorF = *(bP - Nextline + 1); colorJ = *(bP - Nextline + 2); colorG = *(bP - 1); colorA = *(bP); colorB = *(bP + 1); colorK = *(bP + 2); colorH = *(bP + Nextline - 1); colorC = *(bP + Nextline); colorD = *(bP + Nextline + 1); colorL = *(bP + Nextline + 2); colorM = *(bP + Nextline + Nextline - 1); colorN = *(bP + Nextline + Nextline); colorO = *(bP + Nextline + Nextline + 1); colorP = *(bP + Nextline + Nextline + 2); if ((colorA == colorD) && (colorB != colorC)) { if (((colorA == colorE) && (colorB == colorL)) || ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))) { product = colorA; } else { product = INTERPOLATE (colorA, colorB); } if (((colorA == colorG) && (colorC == colorO)) || ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))) { product1 = colorA; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorA; } else if ((colorB == colorC) && (colorA != colorD)) { if (((colorB == colorF) && (colorA == colorH)) || ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if (((colorC == colorH) && (colorA == colorF)) || ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorB; } else if ((colorA == colorD) && (colorB == colorC)) { if (colorA == colorB) { product = colorA; product1 = colorA; product2 = colorA; } else { register int r = 0; product1 = INTERPOLATE (colorA, colorC); product = INTERPOLATE (colorA, colorB); r += GetResult1 (colorA, colorB, colorG, colorE, colorI); r += GetResult2 (colorB, colorA, colorK, colorF, colorJ); r += GetResult2 (colorB, colorA, colorH, colorN, colorM); r += GetResult1 (colorA, colorB, colorL, colorO, colorP); if (r > 0) product2 = colorA; else if (r < 0) product2 = colorB; else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); } } } else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) { product = colorA; } else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) { product1 = colorA; } else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } } *(dP) = colorA; *(dP + 1) = product; *(dP + (dstPitch >> 2)) = product1; *(dP + (dstPitch >> 2) + 1) = product2; bP += inc_bP; dP += 2; } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } static u32 Bilinear (u32 A, u32 B, u32 x) { unsigned long areaA, areaB; unsigned long result; if (A == B) return A; areaB = (x >> 11) & 0x1f; // reduce 16 bit fraction to 5 bits areaA = 0x20 - areaB; A = (A & redblueMask) | ((A & greenMask) << 16); B = (B & redblueMask) | ((B & greenMask) << 16); result = ((areaA * A) + (areaB * B)) >> 5; return (result & redblueMask) | ((result >> 16) & greenMask); } static u32 Bilinear4 (u32 A, u32 B, u32 C, u32 D, u32 x, u32 y) { unsigned long areaA, areaB, areaC, areaD; unsigned long result, xy; x = (x >> 11) & 0x1f; y = (y >> 11) & 0x1f; xy = (x * y) >> 5; A = (A & redblueMask) | ((A & greenMask) << 16); B = (B & redblueMask) | ((B & greenMask) << 16); C = (C & redblueMask) | ((C & greenMask) << 16); D = (D & redblueMask) | ((D & greenMask) << 16); areaA = 0x20 + xy - x - y; areaB = x - xy; areaC = y - xy; areaD = xy; result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5; return (result & redblueMask) | ((result >> 16) & greenMask); } void Scale_2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, u32 dstWidth, u32 dstHeight, int width, int height) { u8 *dP; u16 *bP; u32 w; u32 h; u32 dw; u32 dh; u32 hfinish; u32 wfinish; u32 Nextline = srcPitch >> 1; wfinish = (width - 1) << 16; // convert to fixed point dw = wfinish / (dstWidth - 1); hfinish = (height - 1) << 16; // convert to fixed point dh = hfinish / (dstHeight - 1); for (h = 0; h < hfinish; h += dh) { u32 y1, y2; y1 = h & 0xffff; // fraction part of fixed point bP = (u16 *) (srcPtr + ((h >> 16) * srcPitch)); dP = dstPtr; y2 = 0x10000 - y1; w = 0; for (; w < wfinish;) { u32 A, B, C, D; u32 E, F, G, H; u32 I, J, K, L; u32 x1, x2, a1, f1, f2; u32 position, product1; position = w >> 16; A = bP[position]; // current pixel B = bP[position + 1]; // next pixel C = bP[position + Nextline]; D = bP[position + Nextline + 1]; E = bP[position - Nextline]; F = bP[position - Nextline + 1]; G = bP[position - 1]; H = bP[position + Nextline - 1]; I = bP[position + 2]; J = bP[position + Nextline + 2]; K = bP[position + Nextline + Nextline]; L = bP[position + Nextline + Nextline + 1]; x1 = w & 0xffff; // fraction part of fixed point x2 = 0x10000 - x1; /*0*/ if (A == B && C == D && A == C) product1 = A; else /*1*/ if (A == D && B != C) { f1 = (x1 >> 1) + (0x10000 >> 2); f2 = (y1 >> 1) + (0x10000 >> 2); if (y1 <= f1 && A == J && A != E) // close to B { a1 = f1 - y1; product1 = Bilinear (A, B, a1); } else if (y1 >= f1 && A == G && A != L) // close to C { a1 = y1 - f1; product1 = Bilinear (A, C, a1); } else if (x1 >= f2 && A == E && A != J) // close to B { a1 = x1 - f2; product1 = Bilinear (A, B, a1); } else if (x1 <= f2 && A == L && A != G) // close to C { a1 = f2 - x1; product1 = Bilinear (A, C, a1); } else if (y1 >= x1) // close to C { a1 = y1 - x1; product1 = Bilinear (A, C, a1); } else if (y1 <= x1) // close to B { a1 = x1 - y1; product1 = Bilinear (A, B, a1); } } else /*2*/ if (B == C && A != D) { f1 = (x1 >> 1) + (0x10000 >> 2); f2 = (y1 >> 1) + (0x10000 >> 2); if (y2 >= f1 && B == H && B != F) // close to A { a1 = y2 - f1; product1 = Bilinear (B, A, a1); } else if (y2 <= f1 && B == I && B != K) // close to D { a1 = f1 - y2; product1 = Bilinear (B, D, a1); } else if (x2 >= f2 && B == F && B != H) // close to A { a1 = x2 - f2; product1 = Bilinear (B, A, a1); } else if (x2 <= f2 && B == K && B != I) // close to D { a1 = f2 - x2; product1 = Bilinear (B, D, a1); } else if (y2 >= x1) // close to A { a1 = y2 - x1; product1 = Bilinear (B, A, a1); } else if (y2 <= x1) // close to D { a1 = x1 - y2; product1 = Bilinear (B, D, a1); } } /*3*/ else { product1 = Bilinear4 (A, B, C, D, x1, y1); } //end First Pixel *(u32 *) dP = product1; dP += 2; w += dw; } dstPtr += dstPitch; } } void Render2xSaI (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; _2xSaI32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } void RenderSuper2xSaI (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; Super2xSaI32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } void RenderSuperEagle (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; SuperEagle32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } desmume-0.9.11/src/filter/hq4x.cpp0000755000000000000000000001766712467662066015446 0ustar rootroot/* * This file is part of the Advance project. * * Copyright (C) 2003, 2008 Andrea Mazzoleni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #include "filter.h" #include "interp.h" /***************************************************************************/ /* HQ4x C implementation */ /* * This effect is a rewritten implementation of the hq4x effect made by Maxim Stepin */ void hq4x_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, const u32* src0, const u32* src1, const u32* src2, unsigned count, unsigned flag) { unsigned i; for(i=0;i 0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = src0[0]; c[3] = src1[0]; c[6] = src2[0]; } if (i < count-1) { c[2] = src0[1]; c[5] = src1[1]; c[8] = src2[1]; } else { c[2] = src0[0]; c[5] = src1[0]; c[8] = src2[0]; } mask = 0; if (interp_32_diff(c[0], c[4])) mask |= 1 << 0; if (interp_32_diff(c[1], c[4])) mask |= 1 << 1; if (interp_32_diff(c[2], c[4])) mask |= 1 << 2; if (interp_32_diff(c[3], c[4])) mask |= 1 << 3; if (interp_32_diff(c[5], c[4])) mask |= 1 << 4; if (interp_32_diff(c[6], c[4])) mask |= 1 << 5; if (interp_32_diff(c[7], c[4])) mask |= 1 << 6; if (interp_32_diff(c[8], c[4])) mask |= 1 << 7; #define P(a, b) dst##b[a] #define MUR interp_32_diff(c[1], c[5]) #define MDR interp_32_diff(c[5], c[7]) #define MDL interp_32_diff(c[7], c[3]) #define MUL interp_32_diff(c[3], c[1]) #define I1(p0) c[p0] #define I2(i0, i1, p0, p1) interp_32_##i0##i1(c[p0], c[p1]) #define I3(i0, i1, i2, p0, p1, p2) interp_32_##i0##i1##i2(c[p0], c[p1], c[p2]) switch (mask) { #include "hq4x.dat" } #undef P #undef MUR #undef MDR #undef MDL #undef MUL #undef I1 #undef I2 #undef I3 src0 += 1; src1 += 1; src2 += 1; dst0 += 4; dst1 += 4; dst2 += 4; dst3 += 4; } } void hq4xS_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, const u32* src0, const u32* src1, const u32* src2, unsigned count, unsigned flag) { unsigned i; for(i=0;i 0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = src0[0]; c[3] = src1[0]; c[6] = src2[0]; } if (i < count-1) { c[2] = src0[1]; c[5] = src1[1]; c[8] = src2[1]; } else { c[2] = src0[0]; c[5] = src1[0]; c[8] = src2[0]; } mask = 0; // hq4xS dynamic edge detection: // simply comparing the center color against its surroundings will give bad results in many cases, // so, instead, compare the center color relative to the max difference in brightness of this 3x3 block int brightArray[9]; int maxBright = 0, minBright = 999999; for(int j = 0 ; j < 9 ; j++) { const int b = (int)((c[j] & 0xF8)); const int g = (int)((c[j] & 0xF800)) >> 8; const int r = (int)((c[j] & 0xF80000)) >> 16; const int bright = r+r+r + g+g+g + b+b; if(bright > maxBright) maxBright = bright; if(bright < minBright) minBright = bright; brightArray[j] = bright; } unsigned int diffBright = ((maxBright - minBright) * 7) >> 4; if(diffBright > 7) { const int centerBright = brightArray[4]; if(ABS(brightArray[0] - centerBright) > diffBright) mask |= 1 << 0; if(ABS(brightArray[1] - centerBright) > diffBright) mask |= 1 << 1; if(ABS(brightArray[2] - centerBright) > diffBright) mask |= 1 << 2; if(ABS(brightArray[3] - centerBright) > diffBright) mask |= 1 << 3; if(ABS(brightArray[5] - centerBright) > diffBright) mask |= 1 << 4; if(ABS(brightArray[6] - centerBright) > diffBright) mask |= 1 << 5; if(ABS(brightArray[7] - centerBright) > diffBright) mask |= 1 << 6; if(ABS(brightArray[8] - centerBright) > diffBright) mask |= 1 << 7; } #define P(a, b) dst##b[a] #define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right #define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right #define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left #define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left #define I1(p0) c[p0] #define I2(i0, i1, p0, p1) interp_32_##i0##i1(c[p0], c[p1]) #define I3(i0, i1, i2, p0, p1, p2) interp_32_##i0##i1##i2(c[p0], c[p1], c[p2]) switch (mask) { #include "hq4x.dat" } #undef P #undef MUR #undef MDR #undef MDL #undef MUL #undef I1 #undef I2 #undef I3 src0 += 1; src1 += 1; src2 += 1; dst0 += 4; dst1 += 4; dst2 += 4; dst3 += 4; } } void hq4x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *dst2 = dst1 + (dstPitch >> 2); u32 *dst3 = dst2 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq4x_32_def(dst0, dst1, dst2, dst3, src0, src0, src1, width, 0); int count = height; count -= 2; while(count) { dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4x_32_def(dst0, dst1, dst2, dst3, src0, src1, src2, width, 0); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4x_32_def(dst0, dst1, dst2, dst3, src0, src1, src1, width, 0); } void hq4x32S(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *dst2 = dst1 + (dstPitch >> 2); u32 *dst3 = dst2 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src0, src1, width, 0); int count = height; count -= 2; while(count) { dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src1, src2, width, 0); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src1, src1, width, 0); } void RenderHQ4X (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq4x32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } void RenderHQ4XS (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq4x32S (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } desmume-0.9.11/src/filter/videofilter.cpp0000755000000000000000000007437212467662066017072 0ustar rootroot/* Copyright (C) 2011-2012 Roger Manuel Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "videofilter.h" #include // This function is called when running a filter in multithreaded mode. static void* RunVideoFilterTask(void *arg); // Attributes list of known video filters, indexed using VideoFilterTypeID. // Use VideoFilter::GetAttributesByID() to retrieve a filter's attributes. const VideoFilterAttributes VideoFilterAttributesList[] = { {VideoFilterTypeID_None, "None", NULL, 1, 1, 0}, {VideoFilterTypeID_LQ2X, "LQ2x", &RenderLQ2X, 2, 1, 0}, {VideoFilterTypeID_LQ2XS, "LQ2xS", &RenderLQ2XS, 2, 1, 0}, {VideoFilterTypeID_HQ2X, "HQ2x", &RenderHQ2X, 2, 1, 0}, {VideoFilterTypeID_HQ2XS, "HQ2xS", &RenderHQ2XS, 2, 1, 0}, {VideoFilterTypeID_HQ4X, "HQ4x", &RenderHQ4X, 4, 1, 0}, {VideoFilterTypeID_2xSaI, "2xSaI", &Render2xSaI, 2, 1, 0}, {VideoFilterTypeID_Super2xSaI, "Super 2xSaI", &RenderSuper2xSaI, 2, 1, 0}, {VideoFilterTypeID_SuperEagle, "Super Eagle", &RenderSuperEagle, 2, 1, 0}, {VideoFilterTypeID_Scanline, "Scanline", &RenderScanline, 2, 1, 0}, {VideoFilterTypeID_Bilinear, "Bilinear", &RenderBilinear, 2, 1, 0}, {VideoFilterTypeID_Nearest2X, "Nearest 2x", &RenderNearest2X, 2, 1, 0}, {VideoFilterTypeID_Nearest1_5X, "Nearest 1.5x", &RenderNearest_1Point5x, 3, 2, 0}, {VideoFilterTypeID_NearestPlus1_5X, "Nearest+ 1.5x", &RenderNearestPlus_1Point5x, 3, 2, 0}, {VideoFilterTypeID_EPX, "EPX", &RenderEPX, 2, 1, 0}, {VideoFilterTypeID_EPXPlus, "EPX+", &RenderEPXPlus, 2, 1, 0}, {VideoFilterTypeID_EPX1_5X, "EPX 1.5x", &RenderEPX_1Point5x, 3, 2, 0}, {VideoFilterTypeID_EPXPlus1_5X, "EPX+ 1.5x", &RenderEPXPlus_1Point5x, 3, 2, 0}, {VideoFilterTypeID_HQ4XS, "HQ4xS", &RenderHQ4XS, 4, 1, 0}, {VideoFilterTypeID_2xBRZ, "2xBRZ", &Render2xBRZ, 2, 1, 0}, {VideoFilterTypeID_3xBRZ, "3xBRZ", &Render3xBRZ, 3, 1, 0}, {VideoFilterTypeID_4xBRZ, "4xBRZ", &Render4xBRZ, 4, 1, 0}, {VideoFilterTypeID_5xBRZ, "5xBRZ", &Render5xBRZ, 5, 1, 0} }; // Parameters for Scanline filter int scanline_filter_a = 0; int scanline_filter_b = 2; int scanline_filter_c = 2; int scanline_filter_d = 4; // Parameters passed to the RunVideoFilterTask() thread task function typedef struct { void *index; VideoFilterParamType type; } _VideoFilterParamAttributes; static const _VideoFilterParamAttributes _VideoFilterParamAttributesList[] = { {&scanline_filter_a, VF_INT}, {&scanline_filter_b, VF_INT}, {&scanline_filter_c, VF_INT}, {&scanline_filter_d, VF_INT}, }; /******************************************************************************************** CLASS CONSTRUCTORS ********************************************************************************************/ VideoFilter::VideoFilter(size_t srcWidth, size_t srcHeight, VideoFilterTypeID typeID = VideoFilterTypeID_None, size_t threadCount = 0) { SSurface newSurface; newSurface.Surface = NULL; newSurface.Pitch = srcWidth*2; newSurface.Width = srcWidth; newSurface.Height = srcHeight; newSurface.userData = NULL; for (size_t i = 0; i < FILTER_MAX_WORKING_SURFACE_COUNT; i++) { newSurface.workingSurface[i] = NULL; } _vfSrcSurface = newSurface; _vfDstSurface = newSurface; _useInternalDstBuffer = true; _isFilterRunning = false; _vfSrcSurfacePixBuffer = NULL; if (typeID < VideoFilterTypeIDCount) { _vfAttributes = VideoFilterAttributesList[typeID]; } else { _vfAttributes = VideoFilterAttributesList[VideoFilterTypeID_None]; } ThreadLockInit(&_lockSrc); ThreadLockInit(&_lockDst); ThreadLockInit(&_lockAttributes); ThreadCondInit(&_condRunning); // Create all threads _vfThread.resize(threadCount); for (size_t i = 0; i < threadCount; i++) { _vfThread[i].param.srcSurface = _vfSrcSurface; _vfThread[i].param.dstSurface = _vfDstSurface; _vfThread[i].param.filterFunction = NULL; _vfThread[i].task = new Task; _vfThread[i].task->start(false); } _vfFunc = _vfAttributes.filterFunction; SetSourceSize(srcWidth, srcHeight); } /******************************************************************************************** CLASS DESTRUCTOR ********************************************************************************************/ VideoFilter::~VideoFilter() { // Destroy all threads first for (size_t i = 0; i < _vfThread.size(); i++) { _vfThread[i].task->finish(); _vfThread[i].task->shutdown(); delete _vfThread[i].task; } _vfThread.clear(); // Destroy everything else ThreadLockLock(&_lockSrc); ThreadLockLock(&_lockDst); while (_isFilterRunning) { ThreadCondWait(&_condRunning, &_lockDst); } if (_useInternalDstBuffer) { free(_vfDstSurface.Surface); _vfDstSurface.Surface = NULL; } for (size_t i = 0; i < _vfAttributes.workingSurfaceCount; i++) { free(_vfDstSurface.workingSurface[i]); _vfDstSurface.workingSurface[i] = NULL; } ThreadLockUnlock(&_lockDst); free(_vfSrcSurfacePixBuffer); _vfSrcSurfacePixBuffer = NULL; _vfSrcSurface.Surface = NULL; ThreadLockUnlock(&_lockSrc); ThreadLockDestroy(&_lockSrc); ThreadLockDestroy(&_lockDst); ThreadLockDestroy(&_lockAttributes); ThreadCondDestroy(&_condRunning); } bool VideoFilter::AllocateDstBuffer(const size_t dstWidth, const size_t dstHeight, const size_t workingSurfaceCount) { bool result = false; unsigned char *newSurfaceBuffer = NULL; // Allocate the destination buffer if necessary. if (_useInternalDstBuffer) { newSurfaceBuffer = (unsigned char *)calloc(dstWidth * dstHeight, sizeof(uint32_t)); if (newSurfaceBuffer == NULL) { return result; } } ThreadLockLock(&this->_lockDst); for (size_t i = 0; i < FILTER_MAX_WORKING_SURFACE_COUNT; i++) { unsigned char *oldWorkingSurface = this->_vfDstSurface.workingSurface[i]; this->_vfDstSurface.workingSurface[i] = (i < workingSurfaceCount) ? (unsigned char *)calloc(dstWidth * dstHeight, sizeof(uint32_t)) : NULL; free(oldWorkingSurface); } // Set up SSurface structure. this->_vfDstSurface.Width = dstWidth; this->_vfDstSurface.Height = dstHeight; this->_vfDstSurface.Pitch = dstWidth * 2; if (_useInternalDstBuffer) { unsigned char *oldBuffer = this->_vfDstSurface.Surface; this->_vfDstSurface.Surface = newSurfaceBuffer; free(oldBuffer); } // Update the surfaces on threads. const size_t threadCount = this->_vfThread.size(); const unsigned int linesPerThread = (threadCount > 1) ? dstHeight/threadCount : dstHeight; unsigned int remainingLines = dstHeight; for (size_t i = 0; i < threadCount; i++) { SSurface &threadDstSurface = this->_vfThread[i].param.dstSurface; threadDstSurface = this->_vfDstSurface; threadDstSurface.Height = (linesPerThread < remainingLines) ? linesPerThread : remainingLines; remainingLines -= threadDstSurface.Height; // Add any remaining lines to the last thread. if (i == threadCount-1) { threadDstSurface.Height += remainingLines; } if (i > 0) { SSurface &prevThreadDstSurface = this->_vfThread[i - 1].param.dstSurface; threadDstSurface.Surface = (unsigned char *)((uint32_t *)prevThreadDstSurface.Surface + (prevThreadDstSurface.Width * prevThreadDstSurface.Height)); for (size_t j = 0; j < workingSurfaceCount; j++) { threadDstSurface.workingSurface[j] = (unsigned char *)((uint32_t *)prevThreadDstSurface.workingSurface[j] + (prevThreadDstSurface.Width * prevThreadDstSurface.Height)); } } } ThreadLockUnlock(&this->_lockDst); result = true; return result; } /******************************************************************************************** SetSourceSize() Sets the rectangular size of the source image. This method reallocates memory based on the input size, and therefore returns a bool value upon success or failure of resizing. Takes: width - The width of the source image in pixels. height - The height of the source image in pixels. Returns: A bool that reports if the resizing was successful. A value of true means success, while a value of false means failure. ********************************************************************************************/ bool VideoFilter::SetSourceSize(const size_t width, const size_t height) { bool result = false; bool sizeChanged = false; ThreadLockLock(&this->_lockSrc); // Overallocate the source buffer by 8 rows of pixels to account for out-of-bounds // memory reads done by some filters. uint32_t *newPixBuffer = (uint32_t *)calloc(width * (height + 8), sizeof(uint32_t)); if (newPixBuffer == NULL) { return result; } if (this->_vfSrcSurface.Surface == NULL || this->_vfSrcSurface.Width != width || this->_vfSrcSurface.Height != height) { sizeChanged = true; } this->_vfSrcSurface.Width = width; this->_vfSrcSurface.Height = height; this->_vfSrcSurface.Pitch = width * 2; // Set the working source buffer pointer so that the working memory block is padded // with 4 pixel rows worth of memory on both sides. this->_vfSrcSurface.Surface = (unsigned char *)(newPixBuffer + (width * 4)); free(this->_vfSrcSurfacePixBuffer); this->_vfSrcSurfacePixBuffer = newPixBuffer; // Update the surfaces on threads. size_t threadCount = this->_vfThread.size(); const unsigned int linesPerThread = (threadCount > 1) ? this->_vfSrcSurface.Height/threadCount : this->_vfSrcSurface.Height; unsigned int remainingLines = this->_vfSrcSurface.Height; for (size_t i = 0; i < threadCount; i++) { SSurface &threadSrcSurface = this->_vfThread[i].param.srcSurface; threadSrcSurface = this->_vfSrcSurface; threadSrcSurface.Height = (linesPerThread < remainingLines) ? linesPerThread : remainingLines; remainingLines -= threadSrcSurface.Height; // Add any remaining lines to the last thread. if (i == threadCount-1) { threadSrcSurface.Height += remainingLines; } if (i > 0) { SSurface &prevThreadSrcSurface = this->_vfThread[i - 1].param.srcSurface; threadSrcSurface.Surface = (unsigned char *)((uint32_t *)prevThreadSrcSurface.Surface + (prevThreadSrcSurface.Width * prevThreadSrcSurface.Height)); } } ThreadLockUnlock(&this->_lockSrc); if (sizeChanged) { const VideoFilterAttributes vfAttr = this->GetAttributes(); const size_t dstWidth = width * vfAttr.scaleMultiply / vfAttr.scaleDivide; const size_t dstHeight = height * vfAttr.scaleMultiply / vfAttr.scaleDivide; result = this->AllocateDstBuffer(dstWidth, dstHeight, vfAttr.workingSurfaceCount); if (!result) { return result; } } result = true; return result; } /******************************************************************************************** ChangeFilterByID() Changes the video filter type using a VideoFilterTypeID. Takes: typeID - The type ID of the video filter. See the VideoFilterTypeID enumeration for possible values. Returns: A bool that reports if the filter change was successful. A value of true means success, while a value of false means failure. ********************************************************************************************/ bool VideoFilter::ChangeFilterByID(const VideoFilterTypeID typeID) { bool result = false; if (typeID >= VideoFilterTypeIDCount) { return result; } result = this->ChangeFilterByAttributes(VideoFilterAttributesList[typeID]); return result; } /******************************************************************************************** ChangeFilterByAttributes() Changes the video filter type using video filter attributes. Takes: vfAttr - The video filter's attributes. Returns: A bool that reports if the filter change was successful. A value of true means success, while a value of false means failure. ********************************************************************************************/ bool VideoFilter::ChangeFilterByAttributes(const VideoFilterAttributes &vfAttr) { bool result = false; if (vfAttr.scaleMultiply == 0 || vfAttr.scaleDivide < 1) { return result; } ThreadLockLock(&this->_lockDst); unsigned char *dstSurface = this->_vfDstSurface.Surface; ThreadLockUnlock(&this->_lockDst); const VideoFilterAttributes currentAttr = this->GetAttributes(); const size_t threadCount = this->_vfThread.size(); if (dstSurface != NULL && currentAttr.scaleMultiply == vfAttr.scaleMultiply && currentAttr.scaleDivide == vfAttr.scaleDivide && currentAttr.workingSurfaceCount == vfAttr.workingSurfaceCount) { // If we have existing buffers and the new size is identical to the old size, we // can skip the costly construction of the buffers and simply clear them instead. ThreadLockLock(&this->_lockDst); const size_t bufferSizeBytes = this->_vfDstSurface.Width * this->_vfDstSurface.Height * sizeof(uint32_t); memset(this->_vfDstSurface.Surface, 0, bufferSizeBytes); for (size_t i = 0; i < currentAttr.workingSurfaceCount; i++) { memset(this->_vfDstSurface.workingSurface[i], 0, bufferSizeBytes); } this->_vfFunc = vfAttr.filterFunction; for (size_t i = 0; i < threadCount; i++) { this->_vfThread[i].param.filterFunction = this->_vfFunc; } ThreadLockUnlock(&this->_lockDst); } else { // Construct a new destination buffer per filter attributes. ThreadLockLock(&this->_lockSrc); const size_t dstWidth = this->_vfSrcSurface.Width * vfAttr.scaleMultiply / vfAttr.scaleDivide; const size_t dstHeight = this->_vfSrcSurface.Height * vfAttr.scaleMultiply / vfAttr.scaleDivide; ThreadLockUnlock(&this->_lockSrc); ThreadLockLock(&this->_lockDst); this->_vfFunc = vfAttr.filterFunction; for (size_t i = 0; i < threadCount; i++) { this->_vfThread[i].param.filterFunction = this->_vfFunc; } ThreadLockUnlock(&this->_lockDst); result = this->AllocateDstBuffer(dstWidth, dstHeight, vfAttr.workingSurfaceCount); if (!result) { return result; } } this->SetAttributes(vfAttr); result = true; return result; } /******************************************************************************************** RunFilter() Runs the pixels in the source buffer through the video filter, and then stores the resulting pixels into the destination buffer. Takes: Nothing. Returns: A pointer to the destination buffer. ********************************************************************************************/ uint32_t* VideoFilter::RunFilter() { ThreadLockLock(&this->_lockSrc); ThreadLockLock(&this->_lockDst); this->_isFilterRunning = true; if (this->_vfFunc == NULL) { memcpy(this->_vfDstSurface.Surface, this->_vfSrcSurface.Surface, this->_vfDstSurface.Width * this->_vfDstSurface.Height * sizeof(uint32_t)); } else { const size_t threadCount = this->_vfThread.size(); if (threadCount > 0) { for (size_t i = 0; i < threadCount; i++) { this->_vfThread[i].task->execute(&RunVideoFilterTask, &this->_vfThread[i].param); } for (size_t i = 0; i < threadCount; i++) { this->_vfThread[i].task->finish(); } } else { this->_vfFunc(this->_vfSrcSurface, this->_vfDstSurface); } } this->_isFilterRunning = false; ThreadCondSignal(&this->_condRunning); ThreadLockUnlock(&this->_lockDst); ThreadLockUnlock(&this->_lockSrc); return (uint32_t *)this->_vfDstSurface.Surface; } /******************************************************************************************** RunFilterCustomByID() - STATIC Runs the pixels from srcBuffer through the video filter, and then stores the resulting pixels into dstBuffer. This function is useful for when your source or destination buffers are already established, or when you want to run a filter once without having to instantiate a new filter object. Takes: srcBuffer - A pointer to the source pixel buffer. The caller is responsible for ensuring that this buffer is valid. Also note that certain video filters may do out-of-bounds reads, so the caller is responsible for overallocating this buffer in order to avoid crashing on certain platforms. dstBuffer - A pointer to the destination pixel buffer. The caller is responsible for ensuring that this buffer is valid and large enough to store all of the destination pixels. srcWidth - The source surface width in pixels. srcHeight - The source surface height in pixels. typeID - The type ID of the video filter. See the VideoFilterTypeID enumeration for possible values. Returns: Nothing. ********************************************************************************************/ void VideoFilter::RunFilterCustomByID(const uint32_t *__restrict srcBuffer, uint32_t *__restrict dstBuffer, const size_t srcWidth, const size_t srcHeight, const VideoFilterTypeID typeID) { if (typeID >= VideoFilterTypeIDCount) { return; } VideoFilter::RunFilterCustomByAttributes(srcBuffer, dstBuffer, srcWidth, srcHeight, VideoFilterAttributesList[typeID]); } /******************************************************************************************** RunFilterCustomByAttributes() - STATIC Runs the pixels from srcBuffer through the video filter, and then stores the resulting pixels into dstBuffer. This function is useful for when your source or destination buffers are already established, or when you want to run a filter once without having to instantiate a new filter object. Takes: srcBuffer - A pointer to the source pixel buffer. The caller is responsible for ensuring that this buffer is valid. Also note that certain video filters may do out-of-bounds reads, so the caller is responsible for overallocating this buffer in order to avoid crashing on certain platforms. dstBuffer - A pointer to the destination pixel buffer. The caller is responsible for ensuring that this buffer is valid and large enough to store all of the destination pixels. srcWidth - The source surface width in pixels. srcHeight - The source surface height in pixels. vfAttr - The video filter's attributes. Returns: Nothing. ********************************************************************************************/ void VideoFilter::RunFilterCustomByAttributes(const uint32_t *__restrict srcBuffer, uint32_t *__restrict dstBuffer, const size_t srcWidth, const size_t srcHeight, const VideoFilterAttributes &vfAttr) { // Parameter check if (srcBuffer == NULL || dstBuffer == NULL || srcWidth < 1 || srcHeight < 1 || vfAttr.scaleMultiply == 0 || vfAttr.scaleDivide < 1) { return; } // Get the filter attributes const size_t dstWidth = srcWidth * vfAttr.scaleMultiply / vfAttr.scaleDivide; const size_t dstHeight = srcHeight * vfAttr.scaleMultiply / vfAttr.scaleDivide; const VideoFilterFunc filterFunction = vfAttr.filterFunction; // Assign the surfaces and run the filter SSurface srcSurface; srcSurface.Surface = (unsigned char *)srcBuffer; srcSurface.Pitch = srcWidth*2; srcSurface.Width = srcWidth; srcSurface.Height = srcHeight; SSurface dstSurface; dstSurface.Surface = (unsigned char *)dstBuffer; dstSurface.Pitch = dstWidth*2; dstSurface.Width = dstWidth; dstSurface.Height = dstHeight; if (filterFunction == NULL) { memcpy(dstBuffer, srcBuffer, dstWidth * dstHeight * sizeof(uint32_t)); } else { for (size_t i = 0; i < vfAttr.workingSurfaceCount; i++) { dstSurface.workingSurface[i] = (unsigned char *)calloc(dstWidth * dstHeight, sizeof(uint32_t)); } filterFunction(srcSurface, dstSurface); for (size_t i = 0; i < vfAttr.workingSurfaceCount; i++) { free(dstSurface.workingSurface[i]); } } } /******************************************************************************************** GetAttributesByID() - STATIC Returns the filter attributes associated with the given type ID. Takes: typeID - The type ID of the video filter. See the VideoFilterTypeID enumeration for possible values. Returns: A copy of the filter attributes of the given type ID. If typeID is invalid, this method returns the attributes of VideoFilterTypeID_None. ********************************************************************************************/ VideoFilterAttributes VideoFilter::GetAttributesByID(const VideoFilterTypeID typeID) { if (typeID >= VideoFilterTypeIDCount) { return VideoFilterAttributesList[VideoFilterTypeID_None]; } return VideoFilterAttributesList[typeID]; } /******************************************************************************************** GetTypeStringByID() - STATIC Returns a C-string representation of the passed in video filter type. Takes: typeID - The type ID of the video filter. See the VideoFilterTypeID enumeration for possible values. Returns: A C-string that represents the video filter type. If typeID is invalid, this method returns the string "Unknown". ********************************************************************************************/ const char* VideoFilter::GetTypeStringByID(const VideoFilterTypeID typeID) { if (typeID >= VideoFilterTypeIDCount) { return VIDEOFILTERTYPE_UNKNOWN_STRING; } return VideoFilterAttributesList[typeID].typeString; } /******************************************************************************************** ACCESSORS ********************************************************************************************/ VideoFilterAttributes VideoFilter::GetAttributes() { ThreadLockLock(&this->_lockAttributes); VideoFilterAttributes vfAttr = this->_vfAttributes; ThreadLockUnlock(&this->_lockAttributes); return vfAttr; } void VideoFilter::SetAttributes(const VideoFilterAttributes &vfAttr) { ThreadLockLock(&this->_lockAttributes); this->_vfAttributes = vfAttr; ThreadLockUnlock(&this->_lockAttributes); } VideoFilterTypeID VideoFilter::GetTypeID() { ThreadLockLock(&this->_lockAttributes); VideoFilterTypeID typeID = this->_vfAttributes.typeID; ThreadLockUnlock(&this->_lockAttributes); return typeID; } const char* VideoFilter::GetTypeString() { ThreadLockLock(&this->_lockAttributes); const char *typeString = this->_vfAttributes.typeString; ThreadLockUnlock(&this->_lockAttributes); return typeString; } uint32_t* VideoFilter::GetSrcBufferPtr() { ThreadLockLock(&this->_lockSrc); uint32_t *ptr = (uint32_t *)this->_vfSrcSurface.Surface; ThreadLockUnlock(&this->_lockSrc); return ptr; } uint32_t* VideoFilter::GetDstBufferPtr() { ThreadLockLock(&this->_lockDst); uint32_t *ptr = (uint32_t *)this->_vfDstSurface.Surface; ThreadLockUnlock(&this->_lockDst); return ptr; } /******************************************************************************************** SetDstBufferPtr() Returns a C-string representation of the passed in video filter type. Takes: theBuffer - A pointer to the destination pixel buffer. If a value of NULL is passed in, then VideoFilter will use its own internal buffer (this is the default behavior). Otherwise, VideoFilter will use the passed in pointer for the destination buffer. The caller is responsible for ensuring that this buffer is valid and large enough to store all of the destination pixels under all circumstances. Methods that may change the destination buffer's size requirements are: SetSourceSize() ChangeFilterByID() ChangeFilterByAttributes() Returns: Nothing. ********************************************************************************************/ void VideoFilter::SetDstBufferPtr(uint32_t *theBuffer) { ThreadLockLock(&this->_lockDst); if (theBuffer == NULL) { this->_useInternalDstBuffer = true; } else { unsigned char *oldDstBuffer = this->_vfDstSurface.Surface; this->_vfDstSurface.Surface = (unsigned char *)theBuffer; if (this->_useInternalDstBuffer) { free(oldDstBuffer); } this->_useInternalDstBuffer = false; } ThreadLockUnlock(&this->_lockDst); this->AllocateDstBuffer(this->_vfDstSurface.Width, this->_vfDstSurface.Height, this->_vfAttributes.workingSurfaceCount); } size_t VideoFilter::GetSrcWidth() { ThreadLockLock(&this->_lockSrc); size_t width = this->_vfSrcSurface.Width; ThreadLockUnlock(&this->_lockSrc); return width; } size_t VideoFilter::GetSrcHeight() { ThreadLockLock(&this->_lockSrc); size_t height = this->_vfSrcSurface.Height; ThreadLockUnlock(&this->_lockSrc); return height; } size_t VideoFilter::GetDstWidth() { ThreadLockLock(&this->_lockDst); size_t width = this->_vfDstSurface.Width; ThreadLockUnlock(&this->_lockDst); return width; } size_t VideoFilter::GetDstHeight() { ThreadLockLock(&this->_lockDst); size_t height = this->_vfDstSurface.Height; ThreadLockUnlock(&this->_lockDst); return height; } VideoFilterParamType VideoFilter::GetFilterParameterType(VideoFilterParamID paramID) const { return _VideoFilterParamAttributesList[paramID].type; } int VideoFilter::GetFilterParameteri(VideoFilterParamID paramID) { int value = 0; ThreadLockLock(&this->_lockDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: value = (int)(*((int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_UINT: value = (int)(*((unsigned int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_FLOAT: value = (int)(*((float *)_VideoFilterParamAttributesList[paramID].index)); break; default: break; } ThreadLockUnlock(&this->_lockDst); return value; } unsigned int VideoFilter::GetFilterParameterui(VideoFilterParamID paramID) { unsigned int value = 0; ThreadLockLock(&this->_lockDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: value = (unsigned int)(*((int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_UINT: value = (unsigned int)(*((unsigned int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_FLOAT: value = (unsigned int)(*((float *)_VideoFilterParamAttributesList[paramID].index)); break; default: break; } ThreadLockUnlock(&this->_lockDst); return value; } float VideoFilter::GetFilterParameterf(VideoFilterParamID paramID) { float value = 0.0f; ThreadLockLock(&this->_lockDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: value = (float)(*((int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_UINT: value = (float)(*((unsigned int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_FLOAT: value = (float)(*((float *)_VideoFilterParamAttributesList[paramID].index)); break; default: break; } ThreadLockUnlock(&this->_lockDst); return value; } void VideoFilter::SetFilterParameteri(VideoFilterParamID paramID, int value) { if (paramID >= VideoFilterParamIDCount) { return; } ThreadLockLock(&this->_lockDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: *((int *)_VideoFilterParamAttributesList[paramID].index) = (int)value; break; case VF_UINT: *((unsigned int *)_VideoFilterParamAttributesList[paramID].index) = (unsigned int)value; break; case VF_FLOAT: *((float *)_VideoFilterParamAttributesList[paramID].index) = (float)value; break; default: break; } ThreadLockUnlock(&this->_lockDst); } void VideoFilter::SetFilterParameterui(VideoFilterParamID paramID, unsigned int value) { if (paramID >= VideoFilterParamIDCount) { return; } ThreadLockLock(&this->_lockDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: *((int *)_VideoFilterParamAttributesList[paramID].index) = (int)value; break; case VF_UINT: *((unsigned int *)_VideoFilterParamAttributesList[paramID].index) = (unsigned int)value; break; case VF_FLOAT: *((float *)_VideoFilterParamAttributesList[paramID].index) = (float)value; break; default: break; } ThreadLockUnlock(&this->_lockDst); } void VideoFilter::SetFilterParameterf(VideoFilterParamID paramID, float value) { if (paramID >= VideoFilterParamIDCount) { return; } ThreadLockLock(&this->_lockDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: *((int *)_VideoFilterParamAttributesList[paramID].index) = (int)value; break; case VF_UINT: *((unsigned int *)_VideoFilterParamAttributesList[paramID].index) = (unsigned int)value; break; case VF_FLOAT: *((float *)_VideoFilterParamAttributesList[paramID].index) = (float)value; break; default: break; } ThreadLockUnlock(&this->_lockDst); } // Task function for multithreaded filtering static void* RunVideoFilterTask(void *arg) { VideoFilterThreadParam *param = (VideoFilterThreadParam *)arg; param->filterFunction(param->srcSurface, param->dstSurface); return NULL; } #ifdef HOST_WINDOWS void ThreadLockInit(ThreadLock *theLock) { InitializeCriticalSection(theLock); } void ThreadLockDestroy(ThreadLock *theLock) { DeleteCriticalSection(theLock); } void ThreadLockLock(ThreadLock *theLock) { EnterCriticalSection(theLock); } void ThreadLockUnlock(ThreadLock *theLock) { LeaveCriticalSection(theLock); } void ThreadCondInit(ThreadCond *theCondition) { *theCondition = CreateEvent(NULL, FALSE, FALSE, NULL); } void ThreadCondDestroy(ThreadCond *theCondition) { CloseHandle(*theCondition); } void ThreadCondWait(ThreadCond *theCondition, ThreadLock *conditionLock) { WaitForSingleObject(*theCondition, INFINITE); } void ThreadCondSignal(ThreadCond *theCondition) { SetEvent(*theCondition); } #else void ThreadLockInit(ThreadLock *theLock) { pthread_mutex_init(theLock, NULL); } void ThreadLockDestroy(ThreadLock *theLock) { pthread_mutex_destroy(theLock); } void ThreadLockLock(ThreadLock *theLock) { pthread_mutex_lock(theLock); } void ThreadLockUnlock(ThreadLock *theLock) { pthread_mutex_unlock(theLock); } void ThreadCondInit(ThreadCond *theCondition) { pthread_cond_init(theCondition, NULL); } void ThreadCondDestroy(ThreadCond *theCondition) { pthread_cond_destroy(theCondition); } void ThreadCondWait(ThreadCond *theCondition, ThreadLock *conditionLock) { pthread_cond_wait(theCondition, conditionLock); } void ThreadCondSignal(ThreadCond *theCondition) { pthread_cond_signal(theCondition); } #endif desmume-0.9.11/src/filter/epx.cpp0000755000000000000000000002717112467662066015345 0ustar rootroot/* Copyright (C) 2009 DeSmuME team This file is part of DeSmuME DeSmuME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DeSmuME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "filter.h" #include "types.h" #include "interp.h" // transforms each 1 pixel into a 2x2 block of output pixels // where each corner is selected based on equivalence of neighboring pixels void RenderEPX (SSurface Src, SSurface Dst) { uint32 *lpSrc; const uint32 srcHeight = Src.Height; const uint32 srcWidth = Src.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for(uint32 j = 0; j < srcHeight; j++) { uint32* SrcLine = lpSrc + srcPitch*j; uint32* DstLine1 = lpDst + dstPitch*(j*2); uint32* DstLine2 = lpDst + dstPitch*(j*2+1); for(uint32 i = 0; i < srcWidth; i++) { uint32 L = *(SrcLine-1); uint32 C = *(SrcLine); uint32 R = *(SrcLine+1); if(L != R) { uint32 U = *(SrcLine-srcPitch); uint32 D = *(SrcLine+srcPitch); if(U != D) { *DstLine1++ = (U == L) ? U : C; *DstLine1++ = (R == U) ? R : C; *DstLine2++ = (L == D) ? L : C; *DstLine2++ = (D == R) ? D : C; SrcLine++; continue; } } *DstLine1++ = C; *DstLine1++ = C; *DstLine2++ = C; *DstLine2++ = C; SrcLine++; } } } // transforms each 2x2 block of pixels into a 3x3 block of output pixels // where each pixel is selected based on equivalence of neighboring pixels void RenderEPX_1Point5x (SSurface Src, SSurface Dst) { u32 *lpSrc; u32 srcHeight = Src.Height; u32 srcWidth = Src.Width; u32 dstHeight = Dst.Height; u32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; u32 *lpDst = (u32*)Dst.Surface; for(uint32 yi=0, yo=0; yi < srcHeight; yi+=2, yo+=3) { u32* SrcLine = lpSrc + srcPitch*yi; u32* DstLine1 = lpDst + dstPitch*(yo); u32* DstLine2 = lpDst + dstPitch*(yo+1); u32* DstLine3 = lpDst + dstPitch*(yo+2); for(uint32 xi=0; xi < srcWidth; xi+=2) { u32 s10 = *(SrcLine-srcPitch), s20 = *(SrcLine-srcPitch+1), s30 = *(SrcLine-srcPitch+2); u32 s01 = *(SrcLine-1), s11 = *(SrcLine), s21 = *(SrcLine+1), s31 = *(SrcLine+2); u32 s02 = *(SrcLine+srcPitch-1), s12 = *(SrcLine+srcPitch), s22 = *(SrcLine+srcPitch+1), s32 = *(SrcLine+srcPitch+2); u32 s03 = *(SrcLine+2*srcPitch-1), s13 = *(SrcLine+2*srcPitch), s23 = *(SrcLine+2*srcPitch+1), s33 = *(SrcLine+2*srcPitch+2); *DstLine1++ = s01==s10 && s10!=s21 && s01!=s12 ? s01:s11; *DstLine1++ = s10==s21 && s10!=s01 && s21!=s12 ? s21:s11; *DstLine1++ = (s11==s20 && s20!=s31 && s11!=s22 && s21!=s30) || (s20==s31 && s20!=s11 && s31!=s22 && s21!=s10) ? s20:s21; *DstLine2++ = s01==s12 && s01!=s10 && s12!=s21 ? s01:s11; *DstLine2++ = s12==s21 && s01!=s12 && s10!=s21 ? s21:s11; *DstLine2++ = (s11==s22 && s11!=s20 && s22!=s31 && s21!=s32) || (s22==s31 && s11!=s22 && s20!=s31 && s21!=s12) ? s22:s21; *DstLine3++ = (s02==s11 && s11!=s22 && s02!=s13 && s12!=s03) || (s02==s13 && s02!=s11 && s13!=s22 && s12!=s01) ? s02:s12; *DstLine3++ = (s11==s22 && s11!=s02 && s22!=s13 && s12!=s23) || (s13==s22 && s02!=s13 && s11!=s22 && s12!=s21) ? s22:s12; *DstLine3++ = s22; SrcLine+=2; } } } static u32 min(u32 a, u32 b) { return (a < b) ? a : b; } static u32 min3(u32 a, u32 b, u32 c) { return min(a,min(b,c)); } static u32 dist(u32 a, u32 b) { return ABS( (a & 0x0000FF) - (b & 0x0000FF))*2 + ABS(((a & 0x00FF00)>>8) - ((b & 0x00FF00)>>8))*3 + ABS(((a & 0xFF0000)>>16) - ((b & 0xFF0000)>>16))*3; } // note: we only use mix to make the arbitrary choice between two almost-equal colors. // this filter doesn't really do much interpolating or have the appearance of doing any. #define mix interp_32_11 // transforms each 1 pixel into a 2x2 block of output pixels // where each corner is selected based on relative equivalence of neighboring pixels void RenderEPXPlus (SSurface Src, SSurface Dst) { uint32 *lpSrc; const uint32 srcHeight = Src.Height; const uint32 srcWidth = Src.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for(uint32 j = 0; j < srcHeight; j++) { uint32* SrcLine = lpSrc + srcPitch*j; uint32* DstLine1 = lpDst + dstPitch*(j*2); uint32* DstLine2 = lpDst + dstPitch*(j*2+1); for(uint32 i = 0; i < srcWidth; i++) { uint32 L = *(SrcLine-1); uint32 C = *(SrcLine); uint32 R = *(SrcLine+1); uint32 U = *(SrcLine-srcPitch); uint32 D = *(SrcLine+srcPitch); *DstLine1++ = dist(L,U) < min(dist(L,D),dist(R,U)) ? mix(L,U) : C; *DstLine1++ = dist(R,U) < min(dist(L,U),dist(R,D)) ? mix(R,U) : C; *DstLine2++ = dist(L,D) < min(dist(L,U),dist(R,D)) ? mix(L,D) : C; *DstLine2++ = dist(R,D) < min(dist(L,D),dist(R,U)) ? mix(R,D) : C; SrcLine++; } } } // transforms each 2x2 block of pixels into a 3x3 block of output pixels // where each pixel is selected based on relative equivalence of neighboring pixels void RenderEPXPlus_1Point5x (SSurface Src, SSurface Dst) { u32 *lpSrc; u32 srcHeight = Src.Height; u32 srcWidth = Src.Width; u32 dstHeight = Dst.Height; u32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; u32 *lpDst = (u32*)Dst.Surface; for(uint32 yi=0, yo=0; yi < srcHeight; yi+=2, yo+=3) { u32* SrcLine = lpSrc + srcPitch*yi; u32* DstLine1 = lpDst + dstPitch*(yo); u32* DstLine2 = lpDst + dstPitch*(yo+1); u32* DstLine3 = lpDst + dstPitch*(yo+2); for(uint32 xi=0; xi < srcWidth; xi+=2) { u32 s10 = *(SrcLine-srcPitch), s20 = *(SrcLine-srcPitch+1), s30 = *(SrcLine-srcPitch+2); u32 s01 = *(SrcLine-1), s11 = *(SrcLine), s21 = *(SrcLine+1), s31 = *(SrcLine+2); u32 s02 = *(SrcLine+srcPitch-1), s12 = *(SrcLine+srcPitch), s22 = *(SrcLine+srcPitch+1), s32 = *(SrcLine+srcPitch+2); u32 s03 = *(SrcLine+2*srcPitch-1), s13 = *(SrcLine+2*srcPitch), s23 = *(SrcLine+2*srcPitch+1), s33 = *(SrcLine+2*srcPitch+2); *DstLine1++ = dist(s01,s10) < min( dist(s10,s21),dist(s01,s12)) ? mix(s01,s10):s11; *DstLine1++ = dist(s10,s21) < min( dist(s10,s01),dist(s21,s12)) ? mix(s10,s21):s11; *DstLine1++ = dist(s11,s20) < min3(dist(s20,s31),dist(s11,s22),dist(s21,s30)) ? mix(s11,s20): dist(s20,s31) < min3(dist(s20,s11),dist(s31,s22),dist(s21,s10)) ? mix(s20,s31):s21; *DstLine2++ = dist(s01,s12) < min( dist(s01,s10),dist(s12,s21)) ? mix(s01,s12):s11; *DstLine2++ = dist(s12,s21) < min( dist(s01,s12),dist(s10,s21)) ? mix(s12,s21):s11; *DstLine2++ = dist(s11,s22) < min3(dist(s11,s20),dist(s22,s31),dist(s21,s32)) ? mix(s11,s22): dist(s22,s31) < min3(dist(s11,s22),dist(s20,s31),dist(s21,s12)) ? mix(s22,s31):s21; *DstLine3++ = dist(s02,s11) < min3(dist(s11,s22),dist(s02,s13),dist(s12,s03)) ? mix(s02,s11): dist(s02,s13) < min3(dist(s02,s11),dist(s13,s22),dist(s12,s01)) ? mix(s02,s13):s12; *DstLine3++ = dist(s11,s22) < min3(dist(s11,s02),dist(s22,s13),dist(s12,s23)) ? mix(s11,s22): dist(s13,s22) < min3(dist(s02,s13),dist(s11,s22),dist(s12,s21)) ? mix(s13,s22):s12; *DstLine3++ = s22; SrcLine+=2; } } } // transforms each 2x2 block of pixels into 3x3 output which is // a 2x2 block that has 1 block of padding on the right and bottom sides // which are selected stupidly from neighboring pixels in the original 2x2 block void RenderNearest_1Point5x (SSurface Src, SSurface Dst) { uint32 *lpSrc; uint32 srcHeight = Src.Height; uint32 srcWidth = Src.Width; uint32 dstHeight = Dst.Height; uint32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for(uint32 yi = 0, yo = 0; yi < srcHeight; yi+=2, yo+=3) { u32* srcPix1 = lpSrc + srcPitch*(yi); u32* srcPix2 = lpSrc + srcPitch*(yi+1); u32* dstPix1 = lpDst + dstPitch*(yo); u32* dstPix2 = lpDst + dstPitch*(yo+1); u32* dstPix3 = lpDst + dstPitch*(yo+2); for(uint32 xi = 0; xi < srcWidth; xi+=2) { *dstPix1++ = *srcPix1++; *dstPix1++ = *srcPix1; *dstPix1++ = *srcPix1++; *dstPix2++ = *srcPix2; *dstPix3++ = *srcPix2++; *dstPix2++ = *srcPix2; *dstPix3++ = *srcPix2; *dstPix2++ = *srcPix2; *dstPix3++ = *srcPix2++; } } } int CLAMP(const int value, const int high) { int low = 0; return value < low ? low : (value >= high ? high-1 : value); } // transforms each 2x2 block of pixels into 3x3 output which is // a 2x2 block that has 1 block of padding on the right and bottom sides // which are selected from neighboring pixels depending on matching diagonals void RenderNearestPlus_1Point5x (SSurface Src, SSurface Dst) { uint32 *lpSrc; uint32 srcHeight = Src.Height; uint32 srcWidth = Src.Width; uint32 dstHeight = Dst.Height; uint32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; u32* srcPix = lpSrc; u32* dstPix = lpDst; for(uint32 j = 0, y = 0; j < srcHeight; j+=2, y+=3) { #define GET(dx,dy) *(srcPix+(CLAMP((dy)+j,srcHeight))*srcPitch+(CLAMP((dx)+i,srcWidth))) #define SET(dx,dy,val) *(dstPix+(dy+y)*dstPitch+(dx+x)) = (val) #define BETTER(dx,dy,dx2,dy2) (GET(dx,dy) == GET(dx2,dy2) && GET(dx2,dy) != GET(dx,dy2)) for(uint32 i = 0, x = 0; i < srcWidth; i+=2, x+=3) //, srcPix+=2, dstPix+=3 { SET(0,0,GET(0,0)); SET(1,0,GET(1,0)); SET(2,0,GET(BETTER(2,0,1,-1)? 2:1,0)); SET(0,1,GET(0,1)); SET(1,1,GET(1,1)); SET(2,1,GET(BETTER(1,0, 2,1)? 2:1,1)); SET(0,2,GET(BETTER(0,2,-1,1)?-1:0,1)); SET(1,2,GET(BETTER(0,1, 1,2)? 0:1,1)); SET(2,2,GET(BETTER(2,1, 1,2)? 2:1,1)); } #undef GET #undef SET #undef BETTER } } desmume-0.9.11/src/filter/hq2x.h0000755000000000000000000006006212467662066015074 0ustar rootrootcase 0 : case 1 : case 4 : case 5 : case 32 : case 33 : case 36 : case 37 : case 128 : case 129 : case 132 : case 133 : case 160 : case 161 : case 164 : case 165 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 2 : case 34 : case 130 : case 162 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 3 : case 35 : case 131 : case 163 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 6 : case 38 : case 134 : case 166 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 7 : case 39 : case 135 : case 167 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 8 : case 12 : case 136 : case 140 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I211(4, 5, 7); } break; case 9 : case 13 : case 137 : case 141 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I211(4, 5, 7); } break; case 10 : case 138 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I211(4, 1, 3); } } break; case 11 : case 139 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 14 : case 142 : { P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); P1 = I31(4, 5); } else { P0 = I332(1, 3, 4); P1 = I521(4, 1, 5); } } break; case 15 : case 143 : { P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); P1 = I31(4, 5); } else { P0 = I332(1, 3, 4); P1 = I521(4, 1, 5); } } break; case 16 : case 17 : case 48 : case 49 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I31(4, 8); } break; case 18 : case 50 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P1 = I31(4, 2); } else { P1 = I211(4, 1, 5); } } break; case 19 : case 51 : { P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P0 = I31(4, 3); P1 = I31(4, 2); } else { P0 = I521(4, 1, 3); P1 = I332(1, 5, 4); } } break; case 20 : case 21 : case 52 : case 53 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I211(4, 3, 7); P3 = I31(4, 8); } break; case 22 : case 54 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 23 : case 55 : { P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P0 = I31(4, 3); P1 = IC(4); } else { P0 = I521(4, 1, 3); P1 = I332(1, 5, 4); } } break; case 24 : case 66 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 25 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 26 : case 31 : case 95 : { P2 = I31(4, 6); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 27 : case 75 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 28 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 29 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 30 : case 86 : { P0 = I31(4, 0); P2 = I31(4, 6); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 40 : case 44 : case 168 : case 172 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); } break; case 41 : case 45 : case 169 : case 173 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); } break; case 42 : case 170 : { P1 = I31(4, 2); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); P2 = I31(4, 7); } else { P0 = I332(1, 3, 4); P2 = I521(4, 3, 7); } } break; case 43 : case 171 : { P1 = I31(4, 2); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); P2 = I31(4, 7); } else { P0 = I332(1, 3, 4); P2 = I521(4, 3, 7); } } break; case 46 : case 174 : { P1 = I31(4, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 47 : case 175 : { P1 = I31(4, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 56 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 57 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 58 : { P2 = I31(4, 7); P3 = I31(4, 8); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 59 : { P2 = I31(4, 7); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 60 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 61 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 62 : { P0 = I31(4, 0); P2 = I31(4, 7); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 63 : { P2 = I31(4, 7); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 64 : case 65 : case 68 : case 69 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 67 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 70 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 71 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 72 : case 76 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P2 = I31(4, 6); } else { P2 = I211(4, 3, 7); } } break; case 73 : case 77 : { P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P0 = I31(4, 1); P2 = I31(4, 6); } else { P0 = I521(4, 3, 1); P2 = I332(3, 7, 4); } } break; case 74 : case 107 : case 123 : { P1 = I31(4, 2); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 78 : { P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 79 : { P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 80 : case 81 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = I31(4, 8); } else { P3 = I211(4, 5, 7); } } break; case 82 : case 214 : case 222 : { P0 = I31(4, 0); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 83 : { P0 = I31(4, 3); P2 = I31(4, 6); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 84 : case 85 : { P0 = I211(4, 1, 3); P2 = I31(4, 6); if (MDR) { P1 = I31(4, 1); P3 = I31(4, 8); } else { P1 = I521(4, 5, 1); P3 = I332(5, 7, 4); } } break; case 87 : { P0 = I31(4, 3); P2 = I31(4, 6); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 88 : case 248 : case 250 : { P0 = I31(4, 0); P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 89 : { P0 = I31(4, 1); P1 = I31(4, 2); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 90 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 91 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 92 : { P0 = I31(4, 0); P1 = I31(4, 1); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 93 : { P0 = I31(4, 1); P1 = I31(4, 1); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 94 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 96 : case 97 : case 100 : case 101 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 98 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 99 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 102 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 103 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 104 : case 108 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 105 : case 109 : { P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P0 = I31(4, 1); P2 = IC(4); } else { P0 = I521(4, 3, 1); P2 = I332(3, 7, 4); } } break; case 106 : case 120 : { P0 = I31(4, 0); P1 = I31(4, 2); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 110 : { P0 = I31(4, 0); P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 111 : { P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 112 : case 113 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); if (MDR) { P2 = I31(4, 3); P3 = I31(4, 8); } else { P2 = I521(4, 7, 3); P3 = I332(5, 7, 4); } } break; case 114 : { P0 = I31(4, 0); P2 = I31(4, 3); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 115 : { P0 = I31(4, 3); P2 = I31(4, 3); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 116 : case 117 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I31(4, 3); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 118 : { P0 = I31(4, 0); P2 = I31(4, 3); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 119 : { P2 = I31(4, 3); P3 = I31(4, 8); if (MUR) { P0 = I31(4, 3); P1 = IC(4); } else { P0 = I521(4, 1, 3); P1 = I332(1, 5, 4); } } break; case 121 : { P0 = I31(4, 1); P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 122 : { if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 124 : { P0 = I31(4, 0); P1 = I31(4, 1); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 125 : { P1 = I31(4, 1); P3 = I31(4, 8); if (MDL) { P0 = I31(4, 1); P2 = IC(4); } else { P0 = I521(4, 3, 1); P2 = I332(3, 7, 4); } } break; case 126 : { P0 = I31(4, 0); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 127 : { P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 144 : case 145 : case 176 : case 177 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I31(4, 7); } break; case 146 : case 178 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); if (MUR) { P1 = I31(4, 2); P3 = I31(4, 7); } else { P1 = I332(1, 5, 4); P3 = I521(4, 5, 7); } } break; case 147 : case 179 : { P0 = I31(4, 3); P2 = I211(4, 3, 7); P3 = I31(4, 7); if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 148 : case 149 : case 180 : case 181 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I211(4, 3, 7); P3 = I31(4, 7); } break; case 150 : case 182 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); if (MUR) { P1 = IC(4); P3 = I31(4, 7); } else { P1 = I332(1, 5, 4); P3 = I521(4, 5, 7); } } break; case 151 : case 183 : { P0 = I31(4, 3); P2 = I211(4, 3, 7); P3 = I31(4, 7); if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 152 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 153 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 154 : { P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 155 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 156 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 157 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 158 : { P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 159 : { P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 184 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 185 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 186 : { P2 = I31(4, 7); P3 = I31(4, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 187 : { P1 = I31(4, 2); P3 = I31(4, 7); if (MUL) { P0 = IC(4); P2 = I31(4, 7); } else { P0 = I332(1, 3, 4); P2 = I521(4, 3, 7); } } break; case 188 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 189 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 190 : { P0 = I31(4, 0); P2 = I31(4, 7); if (MUR) { P1 = IC(4); P3 = I31(4, 7); } else { P1 = I332(1, 5, 4); P3 = I521(4, 5, 7); } } break; case 191 : { P2 = I31(4, 7); P3 = I31(4, 7); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 192 : case 193 : case 196 : case 197 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 194 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 195 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 198 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 199 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 200 : case 204 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); if (MDL) { P2 = I31(4, 6); P3 = I31(4, 5); } else { P2 = I332(3, 7, 4); P3 = I521(4, 7, 5); } } break; case 201 : case 205 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P3 = I31(4, 5); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } } break; case 202 : { P1 = I31(4, 2); P3 = I31(4, 5); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 203 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 5); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 206 : { P1 = I31(4, 5); P3 = I31(4, 5); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 207 : { P2 = I31(4, 6); P3 = I31(4, 5); if (MUL) { P0 = IC(4); P1 = I31(4, 5); } else { P0 = I332(1, 3, 4); P1 = I521(4, 1, 5); } } break; case 208 : case 209 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 210 : case 216 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 211 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 212 : case 213 : { P0 = I211(4, 1, 3); P2 = I31(4, 6); if (MDR) { P1 = I31(4, 1); P3 = IC(4); } else { P1 = I521(4, 5, 1); P3 = I332(5, 7, 4); } } break; case 215 : { P0 = I31(4, 3); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 217 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 218 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 219 : { P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 220 : { P0 = I31(4, 0); P1 = I31(4, 1); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 221 : { P0 = I31(4, 1); P2 = I31(4, 6); if (MDR) { P1 = I31(4, 1); P3 = IC(4); } else { P1 = I521(4, 5, 1); P3 = I332(5, 7, 4); } } break; case 223 : { P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 224 : case 225 : case 228 : case 229 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 226 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 227 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 230 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 231 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 232 : case 236 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); if (MDL) { P2 = IC(4); P3 = I31(4, 5); } else { P2 = I332(3, 7, 4); P3 = I521(4, 7, 5); } } break; case 233 : case 237 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } } break; case 234 : { P1 = I31(4, 2); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 235 : { P1 = I31(4, 2); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 238 : { P0 = I31(4, 0); P1 = I31(4, 5); if (MDL) { P2 = IC(4); P3 = I31(4, 5); } else { P2 = I332(3, 7, 4); P3 = I521(4, 7, 5); } } break; case 239 : { P1 = I31(4, 5); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 240 : case 241 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); if (MDR) { P2 = I31(4, 3); P3 = IC(4); } else { P2 = I521(4, 7, 3); P3 = I332(5, 7, 4); } } break; case 242 : { P0 = I31(4, 0); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 243 : { P0 = I31(4, 3); P1 = I31(4, 2); if (MDR) { P2 = I31(4, 3); P3 = IC(4); } else { P2 = I521(4, 7, 3); P3 = I332(5, 7, 4); } } break; case 244 : case 245 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } } break; case 246 : { P0 = I31(4, 0); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 247 : { P0 = I31(4, 3); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 249 : { P0 = I31(4, 1); P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 251 : { P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 252 : { P0 = I31(4, 0); P1 = I31(4, 1); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } } break; case 253 : { P0 = I31(4, 1); P1 = I31(4, 1); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } } break; case 254 : { P0 = I31(4, 0); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 255 : { if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; desmume-0.9.11/src/filter/hq4x.h0000755000000000000000000000354012467662066015074 0ustar rootroot/* * This file is part of the Advance project. * * Copyright (C) 2003, 2004, 2008 Andrea Mazzoleni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #ifndef __HQ4X_H #define __HQ4X_H #include "segment.h" void hq4x_16_def(interp_uint16* dst0, interp_uint16* dst1, interp_uint16* dst2, interp_uint16* dst3, const interp_uint16* src0, const interp_uint16* src1, const interp_uint16* src2, unsigned count, unsigned flag); void hq4x_32_def(interp_uint32* dst0, interp_uint32* dst1, interp_uint32* dst2, interp_uint32* dst3, const interp_uint32* src0, const interp_uint32* src1, const interp_uint32* src2, unsigned count, unsigned flag); #endif desmume-0.9.11/src/filter/lq2x.cpp0000755000000000000000000004061312467662066015433 0ustar rootroot/* * This file is part of the Advance project. * * Copyright (C) 2003 Andrea Mazzoleni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #include "filter.h" #include "interp.h" //static void lq2x_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count) //{ // unsigned i; // // for(i=0;i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i> 8; // const int r = (int)((c[j] & 0xF80000)) >> 16; // const int bright = r+r+r + g+g+g + b+b; // if(bright > maxBright) maxBright = bright; // if(bright < minBright) minBright = bright; // // brightArray[j] = bright; // } // int diffBright = ((maxBright - minBright) * 7) >> 4; // if(diffBright > 7) // { // const int centerBright = brightArray[4]; // if(ABS(brightArray[0] - centerBright) > diffBright) // mask |= 1 << 0; // if(ABS(brightArray[1] - centerBright) > diffBright) // mask |= 1 << 1; // if(ABS(brightArray[2] - centerBright) > diffBright) // mask |= 1 << 2; // if(ABS(brightArray[3] - centerBright) > diffBright) // mask |= 1 << 3; // if(ABS(brightArray[5] - centerBright) > diffBright) // mask |= 1 << 4; // if(ABS(brightArray[6] - centerBright) > diffBright) // mask |= 1 << 5; // if(ABS(brightArray[7] - centerBright) > diffBright) // mask |= 1 << 6; // if(ABS(brightArray[8] - centerBright) > diffBright) // mask |= 1 << 7; // } // //#define P0 dst0[0] //#define P1 dst0[1] //#define P2 dst1[0] //#define P3 dst1[1] //#define MUR false //#define MDR false //#define MDL false //#define MUL false //#define IC(p0) c[p0] //#define I11(p0,p1) interp_16_11(c[p0], c[p1]) //#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2]) //#define I31(p0,p1) interp_16_31(c[p0], c[p1]) //#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2]) //#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2]) //#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2]) //#define I53(p0,p1) interp_16_53(c[p0], c[p1]) //#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2]) //#define I71(p0,p1) interp_16_71(c[p0], c[p1]) //#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2]) //#define I97(p0,p1) interp_16_97(c[p0], c[p1]) //#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2]) //#define I151(p0,p1) interp_16_151(c[p0], c[p1]) // // switch (mask) { //#include "lq2x.h" // } // //#undef P0 //#undef P1 //#undef P2 //#undef P3 //#undef MUR //#undef MDR //#undef MDL //#undef MUL //#undef IC //#undef I11 //#undef I211 //#undef I31 //#undef I332 //#undef I431 //#undef I521 //#undef I53 //#undef I611 //#undef I71 //#undef I772 //#undef I97 //#undef I1411 //#undef I151 // // src0 += 1; // src1 += 1; // src2 += 1; // dst0 += 2; // dst1 += 2; // } //} static void lq2x_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count) { unsigned i; for(i=0;i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = c[1]; c[3] = c[4]; c[6] = c[7]; } if (i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = c[1]; c[3] = c[4]; c[6] = c[7]; } if (i> 8; const int r = (int)((c[j] & 0xF80000)) >> 16; const int bright = r+r+r + g+g+g + b+b; if(bright > maxBright) maxBright = bright; if(bright < minBright) minBright = bright; brightArray[j] = bright; } int diffBright = (maxBright - minBright) >> 4; if(diffBright > 1) { const int centerBright = brightArray[4]; if(ABS(brightArray[0] - centerBright) > diffBright) mask |= 1 << 0; if(ABS(brightArray[1] - centerBright) > diffBright) mask |= 1 << 1; if(ABS(brightArray[2] - centerBright) > diffBright) mask |= 1 << 2; if(ABS(brightArray[3] - centerBright) > diffBright) mask |= 1 << 3; if(ABS(brightArray[5] - centerBright) > diffBright) mask |= 1 << 4; if(ABS(brightArray[6] - centerBright) > diffBright) mask |= 1 << 5; if(ABS(brightArray[7] - centerBright) > diffBright) mask |= 1 << 6; if(ABS(brightArray[8] - centerBright) > diffBright) mask |= 1 << 7; } #define P0 dst0[0] #define P1 dst0[1] #define P2 dst1[0] #define P3 dst1[1] #define MUR false #define MDR false #define MDL false #define MUL false #define IC(p0) c[p0] #define I11(p0,p1) interp_32_11(c[p0], c[p1]) #define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2]) #define I31(p0,p1) interp_32_31(c[p0], c[p1]) #define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2]) #define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2]) #define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2]) #define I53(p0,p1) interp_32_53(c[p0], c[p1]) #define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2]) #define I71(p0,p1) interp_32_71(c[p0], c[p1]) #define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2]) #define I97(p0,p1) interp_32_97(c[p0], c[p1]) #define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2]) #define I151(p0,p1) interp_32_151(c[p0], c[p1]) switch (mask) { #include "lq2x.h" } #undef P0 #undef P1 #undef P2 #undef P3 #undef MUR #undef MDR #undef MDL #undef MUL #undef IC #undef I11 #undef I211 #undef I31 #undef I332 #undef I431 #undef I521 #undef I53 #undef I611 #undef I71 #undef I772 #undef I97 #undef I1411 #undef I151 src0 += 1; src1 += 1; src2 += 1; dst0 += 2; dst1 += 2; } } //void lq2x16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // lq2x_16_def(dst0, dst1, src0, src0, src1, width); // if( height == 1 ) return; // // int count = height; // // count -= 2; // while(count>0) { // dst0 += dstPitch; // dst1 += dstPitch; // lq2x_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // lq2x_16_def(dst0, dst1, src0, src1, src1, width); //} // //void lq2xS16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // int count; // // lq2xS_16_def(dst0, dst1, src0, src0, src1, width); // if( height == 1 ) return; // // count = height; // // count -= 2; // while(count>0) { // dst0 += dstPitch; // dst1 += dstPitch; // lq2x_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // lq2xS_16_def(dst0, dst1, src0, src1, src1, width); //} void lq2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); lq2x_32_def(dst0, dst1, src0, src0, src1, width); if( height == 1 ) return; int count = height; count -= 2; while(count>0) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2x_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2x_32_def(dst0, dst1, src0, src1, src1, width); } void lq2xS32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); int count; lq2xS_32_def(dst0, dst1, src0, src0, src1, width); if( height == 1 ) return; count = height; count -= 2; while(count>0) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2xS_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2xS_32_def(dst0, dst1, src0, src1, src1, width); } //void lq2x_init(unsigned bits_per_pixel) //{ // interp_set(bits_per_pixel); //} void RenderLQ2X (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; lq2x32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } void RenderLQ2XS (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; lq2xS32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } desmume-0.9.11/src/filter/scanline.cpp0000755000000000000000000000614212467662066016340 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "filter.h" #include "types.h" #include #include typedef u64 uint64; extern int scanline_filter_a, scanline_filter_b, scanline_filter_c, scanline_filter_d; static int fac_a, fac_b, fac_c, fac_d; FORCEINLINE void ScanLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width, int fac_left, int fac_right) { while(Width--) { #ifdef LOCAL_LE u8* u8dst = (u8*)lpDst; u8* u8src = (u8*)lpSrc; *u8dst++ = *u8src++ * fac_left / 16; *u8dst++ = *u8src++ * fac_left / 16; *u8dst++ = *u8src++ * fac_left / 16; u8dst++; u8src = (u8*)lpSrc; *u8dst++ = *u8src++ * fac_right / 16; *u8dst++ = *u8src++ * fac_right / 16; *u8dst++ = *u8src++ * fac_right / 16; u8dst++; u8src++; lpDst+=2; lpSrc++; #else u8* u8dst = (u8*)lpDst; u8* u8src = (u8*)lpSrc; u8dst++; u8src++; *u8dst++ = *u8src++ * fac_left / 16; *u8dst++ = *u8src++ * fac_left / 16; *u8dst++ = *u8src * fac_left / 16; u8src = (u8*)lpSrc; u8dst++; u8src++; *u8dst++ = *u8src++ * fac_right / 16; *u8dst++ = *u8src++ * fac_right / 16; *u8dst++ = *u8src++ * fac_right / 16; lpDst+=2; lpSrc++; #endif } } FORCEINLINE void DoubleLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){ while(Width--){ *lpDst++ = *lpSrc; *lpDst++ = *lpSrc++; } } void RenderScanline( SSurface Src, SSurface Dst) { fac_a = (16-scanline_filter_a); fac_b = (16-scanline_filter_b); fac_c = (16-scanline_filter_c); fac_d = (16-scanline_filter_d); unsigned int H; const uint32 srcHeight = Src.Height; const unsigned int srcPitch = Src.Pitch >> 1; u32* lpSrc = (u32*)Src.Surface; const unsigned int dstPitch = Dst.Pitch >> 1; u32 *lpDst = (u32*)Dst.Surface; for (H = 0; H < srcHeight; H++, lpSrc += srcPitch) { ScanLine32(lpDst, lpSrc, Src.Width, fac_a, fac_b); lpDst += dstPitch; ScanLine32(lpDst, lpSrc, Src.Width, fac_c, fac_d); lpDst += dstPitch; } } void RenderNearest2X (SSurface Src, SSurface Dst) { uint32 *lpSrc; unsigned int H; const uint32 srcHeight = Src.Height; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for (H = 0; H < srcHeight; H++, lpSrc += srcPitch) DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch, DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch; } desmume-0.9.11/src/filter/lq2x.h0000755000000000000000000004141612467662066015102 0ustar rootrootcase 0 : case 2 : case 4 : case 6 : case 8 : case 12 : case 16 : case 20 : case 24 : case 28 : case 32 : case 34 : case 36 : case 38 : case 40 : case 44 : case 48 : case 52 : case 56 : case 60 : case 64 : case 66 : case 68 : case 70 : case 96 : case 98 : case 100 : case 102 : case 128 : case 130 : case 132 : case 134 : case 136 : case 140 : case 144 : case 148 : case 152 : case 156 : case 160 : case 162 : case 164 : case 166 : case 168 : case 172 : case 176 : case 180 : case 184 : case 188 : case 192 : case 194 : case 196 : case 198 : case 224 : case 226 : case 228 : case 230 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); P3 = IC(0); } break; case 1 : case 5 : case 9 : case 13 : case 17 : case 21 : case 25 : case 29 : case 33 : case 37 : case 41 : case 45 : case 49 : case 53 : case 57 : case 61 : case 65 : case 69 : case 97 : case 101 : case 129 : case 133 : case 137 : case 141 : case 145 : case 149 : case 153 : case 157 : case 161 : case 165 : case 169 : case 173 : case 177 : case 181 : case 185 : case 189 : case 193 : case 197 : case 225 : case 229 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); P3 = IC(1); } break; case 3 : case 35 : case 67 : case 99 : case 131 : case 163 : case 195 : case 227 : { P0 = IC(2); P1 = IC(2); P2 = IC(2); P3 = IC(2); } break; case 7 : case 39 : case 71 : case 103 : case 135 : case 167 : case 199 : case 231 : { P0 = IC(3); P1 = IC(3); P2 = IC(3); P3 = IC(3); } break; case 10 : case 138 : { P1 = IC(0); P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I211(0, 1, 3); } } break; case 11 : case 27 : case 75 : case 139 : case 155 : case 203 : { P1 = IC(2); P2 = IC(2); P3 = IC(2); if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 14 : case 142 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); P1 = IC(0); } else { P0 = I332(1, 3, 0); P1 = I31(0, 1); } } break; case 15 : case 143 : case 207 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); P1 = IC(4); } else { P0 = I332(1, 3, 4); P1 = I31(4, 1); } } break; case 18 : case 22 : case 30 : case 50 : case 54 : case 62 : case 86 : case 118 : { P0 = IC(0); P2 = IC(0); P3 = IC(0); if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 19 : case 51 : { P2 = IC(2); P3 = IC(2); if (MUR) { P0 = IC(2); P1 = IC(2); } else { P0 = I31(2, 1); P1 = I332(1, 5, 2); } } break; case 23 : case 55 : case 119 : { P2 = IC(3); P3 = IC(3); if (MUR) { P0 = IC(3); P1 = IC(3); } else { P0 = I31(3, 1); P1 = I332(1, 5, 3); } } break; case 26 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I211(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 31 : case 95 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 42 : case 170 : { P1 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); P2 = IC(0); } else { P0 = I332(1, 3, 0); P2 = I31(0, 3); } } break; case 43 : case 171 : case 187 : { P1 = IC(2); P3 = IC(2); if (MUL) { P0 = IC(2); P2 = IC(2); } else { P0 = I332(1, 3, 2); P2 = I31(2, 3); } } break; case 46 : case 174 : { P1 = IC(0); P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } } break; case 47 : case 175 : { P1 = IC(4); P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 58 : case 154 : case 186 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 59 : { P2 = IC(2); P3 = IC(2); if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 63 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 72 : case 76 : case 104 : case 106 : case 108 : case 110 : case 120 : case 124 : { P0 = IC(0); P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } } break; case 73 : case 77 : case 105 : case 109 : case 125 : { P1 = IC(1); P3 = IC(1); if (MDL) { P0 = IC(1); P2 = IC(1); } else { P0 = I31(1, 3); P2 = I332(3, 7, 1); } } break; case 74 : { P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MUL) { P0 = IC(0); } else { P0 = I211(0, 1, 3); } } break; case 78 : case 202 : case 206 : { P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } } break; case 79 : { P1 = IC(4); P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 80 : case 208 : case 210 : case 216 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } } break; case 81 : case 209 : case 217 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); if (MDR) { P3 = IC(1); } else { P3 = I211(1, 5, 7); } } break; case 82 : case 214 : case 222 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 83 : case 115 : { P0 = IC(2); P2 = IC(2); if (MDR) { P3 = IC(2); } else { P3 = I611(2, 5, 7); } if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 84 : case 212 : { P0 = IC(0); P2 = IC(0); if (MDR) { P1 = IC(0); P3 = IC(0); } else { P1 = I31(0, 5); P3 = I332(5, 7, 0); } } break; case 85 : case 213 : case 221 : { P0 = IC(1); P2 = IC(1); if (MDR) { P1 = IC(1); P3 = IC(1); } else { P1 = I31(1, 5); P3 = I332(5, 7, 1); } } break; case 87 : { P0 = IC(3); P2 = IC(3); if (MDR) { P3 = IC(3); } else { P3 = I611(3, 5, 7); } if (MUR) { P1 = IC(3); } else { P1 = I211(3, 1, 5); } } break; case 88 : case 248 : case 250 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } } break; case 89 : case 93 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I611(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I611(1, 5, 7); } } break; case 90 : { if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 91 : { if (MDL) { P2 = IC(2); } else { P2 = I611(2, 3, 7); } if (MDR) { P3 = IC(2); } else { P3 = I611(2, 5, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 92 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } } break; case 94 : { if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 107 : case 123 : { P1 = IC(2); P3 = IC(2); if (MDL) { P2 = IC(2); } else { P2 = I211(2, 3, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 111 : { P1 = IC(4); P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 112 : case 240 : { P0 = IC(0); P1 = IC(0); if (MDR) { P2 = IC(0); P3 = IC(0); } else { P2 = I31(0, 7); P3 = I332(5, 7, 0); } } break; case 113 : case 241 : { P0 = IC(1); P1 = IC(1); if (MDR) { P2 = IC(1); P3 = IC(1); } else { P2 = I31(1, 7); P3 = I332(5, 7, 1); } } break; case 114 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 116 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } } break; case 117 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); if (MDR) { P3 = IC(1); } else { P3 = I611(1, 5, 7); } } break; case 121 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I211(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I611(1, 5, 7); } } break; case 122 : { if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 126 : { P0 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 127 : { P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 146 : case 150 : case 178 : case 182 : case 190 : { P0 = IC(0); P2 = IC(0); if (MUR) { P1 = IC(0); P3 = IC(0); } else { P1 = I332(1, 5, 0); P3 = I31(0, 5); } } break; case 147 : case 179 : { P0 = IC(2); P2 = IC(2); P3 = IC(2); if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 151 : case 183 : { P0 = IC(3); P2 = IC(3); P3 = IC(3); if (MUR) { P1 = IC(3); } else { P1 = I1411(3, 1, 5); } } break; case 158 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 159 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 191 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 200 : case 204 : case 232 : case 236 : case 238 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); P3 = IC(0); } else { P2 = I332(3, 7, 0); P3 = I31(0, 7); } } break; case 201 : case 205 : { P0 = IC(1); P1 = IC(1); P3 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I611(1, 3, 7); } } break; case 211 : { P0 = IC(2); P1 = IC(2); P2 = IC(2); if (MDR) { P3 = IC(2); } else { P3 = I211(2, 5, 7); } } break; case 215 : { P0 = IC(3); P2 = IC(3); if (MDR) { P3 = IC(3); } else { P3 = I211(3, 5, 7); } if (MUR) { P1 = IC(3); } else { P1 = I1411(3, 1, 5); } } break; case 218 : { if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 219 : { P1 = IC(2); P2 = IC(2); if (MDR) { P3 = IC(2); } else { P3 = I211(2, 5, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 220 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } } break; case 223 : { P2 = IC(4); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 233 : case 237 : { P0 = IC(1); P1 = IC(1); P3 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I1411(1, 3, 7); } } break; case 234 : { P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } } break; case 235 : { P1 = IC(2); P3 = IC(2); if (MDL) { P2 = IC(2); } else { P2 = I1411(2, 3, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 239 : { P1 = IC(4); P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 242 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 243 : { P0 = IC(2); P1 = IC(2); if (MDR) { P2 = IC(2); P3 = IC(2); } else { P2 = I31(2, 7); P3 = I332(5, 7, 2); } } break; case 244 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } } break; case 245 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); if (MDR) { P3 = IC(1); } else { P3 = I1411(1, 5, 7); } } break; case 246 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 247 : { P0 = IC(3); P2 = IC(3); if (MDR) { P3 = IC(3); } else { P3 = I1411(3, 5, 7); } if (MUR) { P1 = IC(3); } else { P1 = I1411(3, 1, 5); } } break; case 249 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I1411(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I211(1, 5, 7); } } break; case 251 : { P1 = IC(2); if (MDL) { P2 = IC(2); } else { P2 = I1411(2, 3, 7); } if (MDR) { P3 = IC(2); } else { P3 = I211(2, 5, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 252 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } } break; case 253 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I1411(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I1411(1, 5, 7); } } break; case 254 : { P0 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 255 : { if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; desmume-0.9.11/src/filter/interp.h0000755000000000000000000002664212467662066015521 0ustar rootroot/* * This file is part of the Advance project. * * Copyright (C) 2003 Andrea Mazzoleni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #ifndef __INTERP_H #define __INTERP_H #include "types.h" /***************************************************************************/ /* Basic types */ /***************************************************************************/ /* interpolation */ //extern unsigned interp_mask[2]; //extern unsigned interp_bits_per_pixel; // //#define INTERP_16_MASK_1(v) (v & interp_mask[0]) //#define INTERP_16_MASK_2(v) (v & interp_mask[1]) // //static inline u16 interp_16_521(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*2 + INTERP_16_MASK_1(p3)*1) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*2 + INTERP_16_MASK_2(p3)*1) / 8); //} // //static inline u16 interp_16_332(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)*2) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)*2) / 8); //} // //static inline u16 interp_16_611(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*6 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*6 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 8); //} // //static inline u16 interp_16_71(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*7 + INTERP_16_MASK_1(p2)) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*7 + INTERP_16_MASK_2(p2)) / 8); //} // //static inline u16 interp_16_211(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*2 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 4) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*2 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 4); //} // //static inline u16 interp_16_772(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1(((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2))*7 + INTERP_16_MASK_1(p3)*2) / 16) // | INTERP_16_MASK_2(((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2))*7 + INTERP_16_MASK_2(p3)*2) / 16); //} // //static inline u16 interp_16_11(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2)) / 2) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2)) / 2); //} // //static inline u16 interp_16_31(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)) / 4) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)) / 4); //} // //static inline u16 interp_16_1411(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*14 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 16) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*14 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 16); //} // //static inline u16 interp_16_431(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*4 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*4 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)) / 8); //} // //static inline u16 interp_16_53(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*3) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*3) / 8); //} // //static inline u16 interp_16_151(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*15 + INTERP_16_MASK_1(p2)) / 16) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*15 + INTERP_16_MASK_2(p2)) / 16); //} // //static inline u16 interp_16_97(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*9 + INTERP_16_MASK_1(p2)*7) / 16) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*9 + INTERP_16_MASK_2(p2)*7) / 16); //} #define INTERP_32_MASK_1(v) (v & 0xFF00FF) #define INTERP_32_MASK_2(v) (v & 0x00FF00) static inline u32 interp_32_521(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*2 + INTERP_32_MASK_1(p3)*1) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*2 + INTERP_32_MASK_2(p3)*1) / 8); } static inline u32 interp_32_332(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)*2) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)*2) / 8); } static inline u32 interp_32_211(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*2 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 4) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*2 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 4); } static inline u32 interp_32_611(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*6 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*6 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 8); } static inline u32 interp_32_71(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*7 + INTERP_32_MASK_1(p2)) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*7 + INTERP_32_MASK_2(p2)) / 8); } static inline u32 interp_32_772(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1(((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2))*7 + INTERP_32_MASK_1(p3)*2) / 16) | INTERP_32_MASK_2(((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2))*7 + INTERP_32_MASK_2(p3)*2) / 16); } static inline u32 interp_32_11(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2)) / 2) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2)) / 2); } static inline u32 interp_32_31(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)) / 4) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)) / 4); } static inline u32 interp_32_1411(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*14 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 16) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*14 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 16); } static inline u32 interp_32_431(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*4 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*4 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)) / 8); } static inline u32 interp_32_53(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*3) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*3) / 8); } static inline u32 interp_32_151(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*15 + INTERP_32_MASK_1(p2)) / 16) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*15 + INTERP_32_MASK_2(p2)) / 16); } static inline u32 interp_32_97(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*9 + INTERP_32_MASK_1(p2)*7) / 16) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*9 + INTERP_32_MASK_2(p2)*7) / 16); } /***************************************************************************/ /* diff */ #define INTERP_Y_LIMIT (0x30*4) #define INTERP_U_LIMIT (0x07*4) #define INTERP_V_LIMIT (0x06*8) // //static int interp_16_diff(u16 p1, u16 p2) //{ // int r, g, b; // int y, u, v; // // if (p1 == p2) // return 0; // // if (interp_bits_per_pixel == 16) { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3; // r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8; // } else { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2; // r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7; // } // // y = r + g + b; // u = r - b; // v = -r + 2*g - b; // // if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT) // return 1; // // if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT) // return 1; // // if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT) // return 1; // //return 0; //} static int interp_32_diff(u32 p1, u32 p2) { int r, g, b; int y, u, v; if ((p1 & 0xF8F8F8) == (p2 & 0xF8F8F8)) return 0; b = (int)((p1 & 0xFF) - (p2 & 0xFF)); g = (int)((p1 & 0xFF00) - (p2 & 0xFF00)) >> 8; r = (int)((p1 & 0xFF0000) - (p2 & 0xFF0000)) >> 16; y = r + g + b; u = r - b; v = -r + 2*g - b; if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT) return 1; if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT) return 1; if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT) return 1; return 0; } #define INTERP_LIMIT2 (96000) //#define ABS(x) ((x) < 0 ? -(x) : (x)) static FORCEINLINE u32 ABS(s32 x) { return (x+(x>>31))^(x>>31); } // faster #define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MIN(x,y) ((x) < (y) ? (x) : (y)) // //static int interp_16_diff2(u16 p1, u16 p2) //{ // int r, g, b; // int y, u, v; // // if ((p1 & 0xF79E) == (p2 & 0xF79E)) // return 0; // // if (interp_bits_per_pixel == 16) { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3; // r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8; // } else { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2; // r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7; // } // //// yb = 30*r + 58*g + 12*b; // y = 33*r + 36*g + 31*b; // u = -14*r - 29*g + 44*b; // v = 62*r - 51*g - 10*b; // // if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2) // return 1; // return 0; //} static int interp_32_diff2(u32 p1, u32 p2) { int r, g, b; int y, u, v; if ((p1 & 0xF0F0F0) == (p2 & 0xF0F0F0)) return 0; b = (int)((p1 & 0xF8) - (p2 & 0xF8)); g = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8; r = (int)((p1 & 0xF80000) - (p2 & 0xF80000)) >> 16; // y = 30*r + 58*g + 12*b; y = 33*r + 36*g + 31*b; u = -14*r - 29*g + 44*b; v = 62*r - 51*g - 10*b; if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2) return 1; return 0; } // //static void interp_set(unsigned bits_per_pixel) //{ // interp_bits_per_pixel = bits_per_pixel; // // switch (bits_per_pixel) { // case 15 : // interp_mask[0] = 0x7C1F; // interp_mask[1] = 0x03E0; // break; // case 16 : // interp_mask[0] = 0xF81F; // interp_mask[1] = 0x07E0; // break; // case 32 : // interp_mask[0] = 0xFF00FF; // interp_mask[1] = 0x00FF00; // break; // } //} #endif desmume-0.9.11/src/filter/xbrz.cpp0000755000000000000000000014063112467662066015533 0ustar rootroot// **************************************************************************** // * This file is part of the HqMAME project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // * * // * Additionally and as a special exception, the author gives permission * // * to link the code of this program with the MAME library (or with modified * // * versions of MAME that use the same license as MAME), and distribute * // * linked combinations including the two. You must obey the GNU General * // * Public License in all respects for all of the code used other than MAME. * // * If you modify this file, you may extend this exception to your version * // * of the file, but you are not obligated to do so. If you do not wish to * // * do so, delete this exception statement from your version. * // **************************************************************************** // 2014-11-18 (rogerman): Update to XBRZ 1.1. // // 2014-02-06 (rogerman): Modified for use in DeSmuME by removing C++11 code. // Also add render functions compatible with filter.h. #include "xbrz.h" #include "filter.h" #include #include #include #define COLOR_MASK_A 0xFF000000 #define COLOR_MASK_R 0x00FF0000 #define COLOR_MASK_G 0x0000FF00 #define COLOR_MASK_B 0x000000FF namespace { template inline unsigned char getByte(uint32_t val) { return static_cast((val >> (8 * N)) & 0xff); } inline unsigned char getAlpha(uint32_t val) { return getByte<3>(val); } inline unsigned char getRed (uint32_t val) { return getByte<2>(val); } inline unsigned char getGreen(uint32_t val) { return getByte<1>(val); } inline unsigned char getBlue (uint32_t val) { return getByte<0>(val); } template inline T abs(T value) { //static_assert(std::is_signed::value, "abs() requires signed types"); return value < 0 ? -value : value; } template inline void alphaBlend(uint32_t& dst, uint32_t col) //blend color over destination with opacity M / N { //static_assert(0 < M && M < N && N <= 256, "possible overflow of (col & byte1Mask) * M + (dst & byte1Mask) * (N - M)"); dst = (COLOR_MASK_B & (((col & COLOR_MASK_B) * M + (dst & COLOR_MASK_B) * (N - M)) / N)) | // (COLOR_MASK_G & (((col & COLOR_MASK_G) * M + (dst & COLOR_MASK_G) * (N - M)) / N)) | //this works because next higher 8 bits are free (COLOR_MASK_R & (((col & COLOR_MASK_R) * M + (dst & COLOR_MASK_R) * (N - M)) / N)) | // (COLOR_MASK_A & (((((col & COLOR_MASK_A) >> 8) * M + ((dst & COLOR_MASK_A) >> 8) * (N - M)) / N) << 8)); //next 8 bits are not free, so shift //the last row operating on a potential alpha channel costs only ~1% perf => negligible! } //inline //double fastSqrt(double n) //{ // __asm //speeds up xBRZ by about 9% compared to std::sqrt which internally uses the same assembler instructions but adds some "fluff" // { // fld n // fsqrt // } //} // //inline //uint32_t alphaBlend2(uint32_t pix1, uint32_t pix2, double alpha) //{ // return (redMask & static_cast((pix1 & redMask ) * alpha + (pix2 & redMask ) * (1 - alpha))) | // (greenMask & static_cast((pix1 & greenMask) * alpha + (pix2 & greenMask) * (1 - alpha))) | // (blueMask & static_cast((pix1 & blueMask ) * alpha + (pix2 & blueMask ) * (1 - alpha))); //} uint32_t* byteAdvance( uint32_t* ptr, int bytes) { return reinterpret_cast< uint32_t*>(reinterpret_cast< char*>(ptr) + bytes); } const uint32_t* byteAdvance(const uint32_t* ptr, int bytes) { return reinterpret_cast(reinterpret_cast(ptr) + bytes); } //fill block with the given color inline void fillBlock(uint32_t* trg, int pitch, uint32_t col, int blockWidth, int blockHeight) { //for (int y = 0; y < blockHeight; ++y, trg = byteAdvance(trg, pitch)) // std::fill(trg, trg + blockWidth, col); for (int y = 0; y < blockHeight; ++y, trg = byteAdvance(trg, pitch)) for (int x = 0; x < blockWidth; ++x) trg[x] = col; } inline void fillBlock(uint32_t* trg, int pitch, uint32_t col, int n) { fillBlock(trg, pitch, col, n, n); } #ifdef _MSC_VER #define FORCE_INLINE __forceinline #elif defined __GNUC__ #define FORCE_INLINE __attribute__((always_inline)) inline #else #define FORCE_INLINE inline #endif enum RotationDegree //clock-wise { ROT_0, ROT_90, ROT_180, ROT_270 }; //calculate input matrix coordinates after rotation at compile time template struct MatrixRotation; template struct MatrixRotation { static const size_t I_old = I; static const size_t J_old = J; }; template //(i, j) = (row, col) indices, N = size of (square) matrix struct MatrixRotation { static const size_t I_old = N - 1 - MatrixRotation(rotDeg - 1), I, J, N>::J_old; //old coordinates before rotation! static const size_t J_old = MatrixRotation(rotDeg - 1), I, J, N>::I_old; // }; template class OutputMatrix { public: OutputMatrix(uint32_t* out, int outWidth) : //access matrix area, top-left at position "out" for image with given width out_(out), outWidth_(outWidth) {} template uint32_t& ref() const { static const size_t I_old = MatrixRotation::I_old; static const size_t J_old = MatrixRotation::J_old; return *(out_ + J_old + I_old * outWidth_); } private: uint32_t* out_; const int outWidth_; }; template inline T square(T value) { return value * value; } /* inline void rgbtoLuv(uint32_t c, double& L, double& u, double& v) { //http://www.easyrgb.com/index.php?X=MATH&H=02#text2 double r = getRed (c) / 255.0; double g = getGreen(c) / 255.0; double b = getBlue (c) / 255.0; if ( r > 0.04045 ) r = std::pow(( ( r + 0.055 ) / 1.055 ) , 2.4); else r /= 12.92; if ( g > 0.04045 ) g = std::pow(( ( g + 0.055 ) / 1.055 ) , 2.4); else g /= 12.92; if ( b > 0.04045 ) b = std::pow(( ( b + 0.055 ) / 1.055 ) , 2.4); else b /= 12.92; r *= 100; g *= 100; b *= 100; double x = 0.4124564 * r + 0.3575761 * g + 0.1804375 * b; double y = 0.2126729 * r + 0.7151522 * g + 0.0721750 * b; double z = 0.0193339 * r + 0.1191920 * g + 0.9503041 * b; //--------------------- double var_U = 4 * x / ( x + 15 * y + 3 * z ); double var_V = 9 * y / ( x + 15 * y + 3 * z ); double var_Y = y / 100; if ( var_Y > 0.008856 ) var_Y = std::pow(var_Y , 1.0/3 ); else var_Y = 7.787 * var_Y + 16.0 / 116; const double ref_X = 95.047; //Observer= 2°, Illuminant= D65 const double ref_Y = 100.000; const double ref_Z = 108.883; const double ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) ); const double ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) ); L = ( 116 * var_Y ) - 16; u = 13 * L * ( var_U - ref_U ); v = 13 * L * ( var_V - ref_V ); } */ inline void rgbtoLab(uint32_t c, unsigned char& L, signed char& A, signed char& B) { //code: http://www.easyrgb.com/index.php?X=MATH //test: http://www.workwithcolor.com/color-converter-01.htm //------RGB to XYZ------ double r = getRed (c) / 255.0; double g = getGreen(c) / 255.0; double b = getBlue (c) / 255.0; r = r > 0.04045 ? std::pow(( r + 0.055 ) / 1.055, 2.4) : r / 12.92; r = g > 0.04045 ? std::pow(( g + 0.055 ) / 1.055, 2.4) : g / 12.92; r = b > 0.04045 ? std::pow(( b + 0.055 ) / 1.055, 2.4) : b / 12.92; r *= 100; g *= 100; b *= 100; double x = 0.4124564 * r + 0.3575761 * g + 0.1804375 * b; double y = 0.2126729 * r + 0.7151522 * g + 0.0721750 * b; double z = 0.0193339 * r + 0.1191920 * g + 0.9503041 * b; //------XYZ to Lab------ const double refX = 95.047; // const double refY = 100.000; //Observer= 2°, Illuminant= D65 const double refZ = 108.883; // double var_X = x / refX; double var_Y = y / refY; double var_Z = z / refZ; var_X = var_X > 0.008856 ? std::pow(var_X, 1.0 / 3) : 7.787 * var_X + 4.0 / 29; var_Y = var_Y > 0.008856 ? std::pow(var_Y, 1.0 / 3) : 7.787 * var_Y + 4.0 / 29; var_Z = var_Z > 0.008856 ? std::pow(var_Z, 1.0 / 3) : 7.787 * var_Z + 4.0 / 29; L = static_cast(116 * var_Y - 16); A = static_cast< signed char>(500 * (var_X - var_Y)); B = static_cast< signed char>(200 * (var_Y - var_Z)); }; inline double distLAB(uint32_t pix1, uint32_t pix2) { unsigned char L1 = 0; //[0, 100] signed char a1 = 0; //[-128, 127] signed char b1 = 0; //[-128, 127] rgbtoLab(pix1, L1, a1, b1); unsigned char L2 = 0; signed char a2 = 0; signed char b2 = 0; rgbtoLab(pix2, L2, a2, b2); //----------------------------- //http://www.easyrgb.com/index.php?X=DELT //Delta E/CIE76 return std::sqrt(square(1.0 * L1 - L2) + square(1.0 * a1 - a2) + square(1.0 * b1 - b2)); } /* inline void rgbtoHsl(uint32_t c, double& h, double& s, double& l) { //http://www.easyrgb.com/index.php?X=MATH&H=18#text18 const int r = getRed (c); const int g = getGreen(c); const int b = getBlue (c); const int varMin = numeric::min(r, g, b); const int varMax = numeric::max(r, g, b); const int delMax = varMax - varMin; l = (varMax + varMin) / 2.0 / 255.0; if (delMax == 0) //gray, no chroma... { h = 0; s = 0; } else { s = l < 0.5 ? delMax / (1.0 * varMax + varMin) : delMax / (2.0 * 255 - varMax - varMin); double delR = ((varMax - r) / 6.0 + delMax / 2.0) / delMax; double delG = ((varMax - g) / 6.0 + delMax / 2.0) / delMax; double delB = ((varMax - b) / 6.0 + delMax / 2.0) / delMax; if (r == varMax) h = delB - delG; else if (g == varMax) h = 1 / 3.0 + delR - delB; else if (b == varMax) h = 2 / 3.0 + delG - delR; if (h < 0) h += 1; if (h > 1) h -= 1; } } inline double distHSL(uint32_t pix1, uint32_t pix2, double lightningWeight) { double h1 = 0; double s1 = 0; double l1 = 0; rgbtoHsl(pix1, h1, s1, l1); double h2 = 0; double s2 = 0; double l2 = 0; rgbtoHsl(pix2, h2, s2, l2); //HSL is in cylindric coordinatates where L represents height, S radius, H angle, //however we interpret the cylinder as a bi-conic solid with top/bottom radius 0, middle radius 1 assert(0 <= h1 && h1 <= 1); assert(0 <= h2 && h2 <= 1); double r1 = l1 < 0.5 ? l1 * 2 : 2 - l1 * 2; double x1 = r1 * s1 * std::cos(h1 * 2 * numeric::pi); double y1 = r1 * s1 * std::sin(h1 * 2 * numeric::pi); double z1 = l1; double r2 = l2 < 0.5 ? l2 * 2 : 2 - l2 * 2; double x2 = r2 * s2 * std::cos(h2 * 2 * numeric::pi); double y2 = r2 * s2 * std::sin(h2 * 2 * numeric::pi); double z2 = l2; return 255 * std::sqrt(square(x1 - x2) + square(y1 - y2) + square(lightningWeight * (z1 - z2))); } */ inline double distRGB(uint32_t pix1, uint32_t pix2) { const double r_diff = static_cast(getRed (pix1)) - getRed (pix2); const double g_diff = static_cast(getGreen(pix1)) - getGreen(pix2); const double b_diff = static_cast(getBlue (pix1)) - getBlue (pix2); //euklidean RGB distance return std::sqrt(square(r_diff) + square(g_diff) + square(b_diff)); } inline double distNonLinearRGB(uint32_t pix1, uint32_t pix2) { //non-linear rgb: http://www.compuphase.com/cmetric.htm const double r_diff = static_cast(getRed (pix1)) - getRed (pix2); const double g_diff = static_cast(getGreen(pix1)) - getGreen(pix2); const double b_diff = static_cast(getBlue (pix1)) - getBlue (pix2); const double r_avg = (static_cast(getRed(pix1)) + getRed(pix2)) / 2; return std::sqrt((2 + r_avg / 255) * square(r_diff) + 4 * square(g_diff) + (2 + (255 - r_avg) / 255) * square(b_diff)); } inline double distYCbCr(uint32_t pix1, uint32_t pix2, double lumaWeight) { //http://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion //YCbCr conversion is a matrix multiplication => take advantage of linearity by subtracting first! const int r_diff = static_cast(getRed (pix1)) - getRed (pix2); //we may delay division by 255 to after matrix multiplication const int g_diff = static_cast(getGreen(pix1)) - getGreen(pix2); // const int b_diff = static_cast(getBlue (pix1)) - getBlue (pix2); //substraction for int is noticeable faster than for double! //const double k_b = 0.0722; //ITU-R BT.709 conversion //const double k_r = 0.2126; // const double k_b = 0.0593; //ITU-R BT.2020 conversion const double k_r = 0.2627; // const double k_g = 1.0 - k_b - k_r; const double scale_b = 0.5 / (1.0 - k_b); const double scale_r = 0.5 / (1.0 - k_r); const double y = k_r * r_diff + k_g * g_diff + k_b * b_diff; //[!], analog YCbCr! const double c_b = scale_b * (b_diff - y); const double c_r = scale_r * (r_diff - y); //we skip division by 255 to have similar range like other distance functions return std::sqrt(square(lumaWeight * y) + square(c_b) + square(c_r)); } inline double distYCbCrAlpha(uint32_t pix1, uint32_t pix2, double lumaWeight) { const double a1 = getAlpha(pix1) / 255.0 ; const double a2 = getAlpha(pix2) / 255.0 ; /* Requirements for a color distance handling alpha channel: with a1, a2 in [0, 1] 1. if a1 = a2, distance should be: a1 * distYCbCr() 2. if a1 = 0, distance should be: a2 * distYCbCr(black, white) = a2 * 255 3. if a1 = 1, distance should be: 255 * (1 - a2) + a2 * distYCbCr() */ return std::min(a1, a2) * distYCbCr(pix1, pix2, lumaWeight) + 255 * abs(a1 - a2); } inline double distYUV(uint32_t pix1, uint32_t pix2, double luminanceWeight) { //perf: it's not worthwhile to buffer the YUV-conversion, the direct code is faster by ~ 6% //since RGB -> YUV conversion is essentially a matrix multiplication, we can calculate the RGB diff before the conversion (distributive property) const double r_diff = static_cast(getRed (pix1)) - getRed (pix2); const double g_diff = static_cast(getGreen(pix1)) - getGreen(pix2); const double b_diff = static_cast(getBlue (pix1)) - getBlue (pix2); //http://en.wikipedia.org/wiki/YUV#Conversion_to.2Ffrom_RGB const double w_b = 0.114; const double w_r = 0.299; const double w_g = 1 - w_r - w_b; const double u_max = 0.436; const double v_max = 0.615; const double scale_u = u_max / (1 - w_b); const double scale_v = v_max / (1 - w_r); double y = w_r * r_diff + w_g * g_diff + w_b * b_diff;//value range: 255 * [-1, 1] double u = scale_u * (b_diff - y); //value range: 255 * 2 * u_max * [-1, 1] double v = scale_v * (r_diff - y); //value range: 255 * 2 * v_max * [-1, 1] #ifndef NDEBUG const double eps = 0.5; #endif assert(abs(y) <= 255 + eps); assert(abs(u) <= 255 * 2 * u_max + eps); assert(abs(v) <= 255 * 2 * v_max + eps); return std::sqrt(square(luminanceWeight * y) + square(u) + square(v)); } enum BlendType { BLEND_NONE = 0, BLEND_NORMAL, //a normal indication to blend BLEND_DOMINANT, //a strong indication to blend //attention: BlendType must fit into the value range of 2 bit!!! }; struct BlendResult { BlendType /**/blend_f, blend_g, /**/blend_j, blend_k; }; struct Kernel_4x4 //kernel for preprocessing step { uint32_t /**/a, b, c, d, /**/e, f, g, h, /**/i, j, k, l, /**/m, n, o, p; }; /* input kernel area naming convention: ----------------- | A | B | C | D | ----|---|---|---| | E | F | G | H | //evalute the four corners between F, G, J, K ----|---|---|---| //input pixel is at position F | I | J | K | L | ----|---|---|---| | M | N | O | P | ----------------- */ template FORCE_INLINE //detect blend direction BlendResult preProcessCorners(const Kernel_4x4& ker, const xbrz::ScalerCfg& cfg) //result: F, G, J, K corners of "GradientType" { BlendResult result = {}; if ((ker.f == ker.g && ker.j == ker.k) || (ker.f == ker.j && ker.g == ker.k)) return result; //auto dist = [&](uint32_t pix1, uint32_t pix2) { return ColorDistance::dist(pix1, pix2, cfg.luminanceWeight_); }; const int weight = 4; double jg = ColorDistance::dist(ker.i, ker.f, cfg.luminanceWeight_) + ColorDistance::dist(ker.f, ker.c, cfg.luminanceWeight_) + ColorDistance::dist(ker.n, ker.k, cfg.luminanceWeight_) + ColorDistance::dist(ker.k, ker.h, cfg.luminanceWeight_) + weight * ColorDistance::dist(ker.j, ker.g, cfg.luminanceWeight_); double fk = ColorDistance::dist(ker.e, ker.j, cfg.luminanceWeight_) + ColorDistance::dist(ker.j, ker.o, cfg.luminanceWeight_) + ColorDistance::dist(ker.b, ker.g, cfg.luminanceWeight_) + ColorDistance::dist(ker.g, ker.l, cfg.luminanceWeight_) + weight * ColorDistance::dist(ker.f, ker.k, cfg.luminanceWeight_); if (jg < fk) //test sample: 70% of values max(jg, fk) / min(jg, fk) are between 1.1 and 3.7 with median being 1.8 { const bool dominantGradient = cfg.dominantDirectionThreshold * jg < fk; if (ker.f != ker.g && ker.f != ker.j) result.blend_f = dominantGradient ? BLEND_DOMINANT : BLEND_NORMAL; if (ker.k != ker.j && ker.k != ker.g) result.blend_k = dominantGradient ? BLEND_DOMINANT : BLEND_NORMAL; } else if (fk < jg) { const bool dominantGradient = cfg.dominantDirectionThreshold * fk < jg; if (ker.j != ker.f && ker.j != ker.k) result.blend_j = dominantGradient ? BLEND_DOMINANT : BLEND_NORMAL; if (ker.g != ker.f && ker.g != ker.k) result.blend_g = dominantGradient ? BLEND_DOMINANT : BLEND_NORMAL; } return result; } struct Kernel_3x3 { uint32_t /**/a, b, c, /**/d, e, f, /**/g, h, i; }; #define DEF_GETTER(x) template uint32_t inline get_##x(const Kernel_3x3& ker) { return ker.x; } //we cannot and NEED NOT write "ker.##x" since ## concatenates preprocessor tokens but "." is not a token DEF_GETTER(a) DEF_GETTER(b) DEF_GETTER(c) DEF_GETTER(d) DEF_GETTER(e) DEF_GETTER(f) DEF_GETTER(g) DEF_GETTER(h) DEF_GETTER(i) #undef DEF_GETTER #define DEF_GETTER(x, y) template <> inline uint32_t get_##x(const Kernel_3x3& ker) { return ker.y; } DEF_GETTER(a, g) DEF_GETTER(b, d) DEF_GETTER(c, a) DEF_GETTER(d, h) DEF_GETTER(e, e) DEF_GETTER(f, b) DEF_GETTER(g, i) DEF_GETTER(h, f) DEF_GETTER(i, c) #undef DEF_GETTER #define DEF_GETTER(x, y) template <> inline uint32_t get_##x(const Kernel_3x3& ker) { return ker.y; } DEF_GETTER(a, i) DEF_GETTER(b, h) DEF_GETTER(c, g) DEF_GETTER(d, f) DEF_GETTER(e, e) DEF_GETTER(f, d) DEF_GETTER(g, c) DEF_GETTER(h, b) DEF_GETTER(i, a) #undef DEF_GETTER #define DEF_GETTER(x, y) template <> inline uint32_t get_##x(const Kernel_3x3& ker) { return ker.y; } DEF_GETTER(a, c) DEF_GETTER(b, f) DEF_GETTER(c, i) DEF_GETTER(d, b) DEF_GETTER(e, e) DEF_GETTER(f, h) DEF_GETTER(g, a) DEF_GETTER(h, d) DEF_GETTER(i, g) #undef DEF_GETTER //compress four blend types into a single byte inline BlendType getTopL (unsigned char b) { return static_cast(0x3 & b); } inline BlendType getTopR (unsigned char b) { return static_cast(0x3 & (b >> 2)); } inline BlendType getBottomR(unsigned char b) { return static_cast(0x3 & (b >> 4)); } inline BlendType getBottomL(unsigned char b) { return static_cast(0x3 & (b >> 6)); } inline void setTopL (unsigned char& b, BlendType bt) { b |= bt; } //buffer is assumed to be initialized before preprocessing! inline void setTopR (unsigned char& b, BlendType bt) { b |= (bt << 2); } inline void setBottomR(unsigned char& b, BlendType bt) { b |= (bt << 4); } inline void setBottomL(unsigned char& b, BlendType bt) { b |= (bt << 6); } inline bool blendingNeeded(unsigned char b) { return b != 0; } template inline unsigned char rotateBlendInfo(unsigned char b) { return b; } template <> inline unsigned char rotateBlendInfo(unsigned char b) { return ((b << 2) | (b >> 6)) & 0xff; } template <> inline unsigned char rotateBlendInfo(unsigned char b) { return ((b << 4) | (b >> 4)) & 0xff; } template <> inline unsigned char rotateBlendInfo(unsigned char b) { return ((b << 6) | (b >> 2)) & 0xff; } #ifndef NDEBUG int debugPixelX = -1; int debugPixelY = 84; bool breakIntoDebugger = false; #endif template FORCE_INLINE double sPixEQ(uint32_t col1, uint32_t col2, const xbrz::ScalerCfg& cfg) { return ColorDistance::dist(col1, col2, cfg.luminanceWeight_) < cfg.equalColorTolerance_; } template FORCE_INLINE const bool sPixDoLineBlend(const Kernel_3x3& ker, const char blend, const xbrz::ScalerCfg& cfg) { #define a get_a(ker) #define b get_b(ker) #define c get_c(ker) #define d get_d(ker) #define e get_e(ker) #define f get_f(ker) #define g get_g(ker) #define h get_h(ker) #define i get_i(ker) if (getBottomR(blend) >= BLEND_DOMINANT) return true; //make sure there is no second blending in an adjacent rotation for this pixel: handles insular pixels, mario eyes if (getTopR(blend) != BLEND_NONE && !sPixEQ(e, g, cfg)) //but support double-blending for 90° corners return false; if (getBottomL(blend) != BLEND_NONE && !sPixEQ(e, c, cfg)) return false; //no full blending for L-shapes; blend corner only (handles "mario mushroom eyes") if ( sPixEQ(g, h, cfg) && sPixEQ(h, i, cfg) && sPixEQ(i, f, cfg) && sPixEQ(f, c, cfg) && !sPixEQ(e, i, cfg) ) return false; #undef a #undef b #undef c #undef d #undef e #undef f #undef g #undef h #undef i return true; } /* input kernel area naming convention: ------------- | A | B | C | ----|---|---| | D | E | F | //input pixel is at position E ----|---|---| | G | H | I | ------------- */ template FORCE_INLINE //perf: quite worth it! void scalePixel(const Kernel_3x3& ker, uint32_t* target, int trgWidth, unsigned char blendInfo, //result of preprocessing all four corners of pixel "e" const xbrz::ScalerCfg& cfg) { #define a get_a(ker) #define b get_b(ker) #define c get_c(ker) #define d get_d(ker) #define e get_e(ker) #define f get_f(ker) #define g get_g(ker) #define h get_h(ker) #define i get_i(ker) /* #ifndef NDEBUG if (breakIntoDebugger) __debugbreak(); //__asm int 3; #endif */ const unsigned char blend = rotateBlendInfo(blendInfo); if (getBottomR(blend) >= BLEND_NORMAL) {/* auto eq = [&](uint32_t pix1, uint32_t pix2) { return ColorDistance::dist(pix1, pix2, cfg.luminanceWeight_) < cfg.equalColorTolerance_; }; auto dist = [&](uint32_t pix1, uint32_t pix2) { return ColorDistance::dist(pix1, pix2, cfg.luminanceWeight_); }; const bool doLineBlend = [&]() -> bool { if (getBottomR(blend) >= BLEND_DOMINANT) return true; //make sure there is no second blending in an adjacent rotation for this pixel: handles insular pixels, mario eyes if (getTopR(blend) != BLEND_NONE && !eq(e, g)) //but support double-blending for 90° corners return false; if (getBottomL(blend) != BLEND_NONE && !eq(e, c)) return false; //no full blending for L-shapes; blend corner only (handles "mario mushroom eyes") if (eq(g, h) && eq(h , i) && eq(i, f) && eq(f, c) && !eq(e, i)) return false; return true; }(); */ const uint32_t px = ( ColorDistance::dist(e, f, cfg.luminanceWeight_) <= ColorDistance::dist(e, h, cfg.luminanceWeight_) ) ? f : h; //choose most similar color OutputMatrix out(target, trgWidth); if (sPixDoLineBlend(ker, blend, cfg)) { const double fg = ColorDistance::dist(f, g, cfg.luminanceWeight_); //test sample: 70% of values max(fg, hc) / min(fg, hc) are between 1.1 and 3.7 with median being 1.9 const double hc = ColorDistance::dist(h, c, cfg.luminanceWeight_); // const bool haveShallowLine = cfg.steepDirectionThreshold * fg <= hc && e != g && d != g; const bool haveSteepLine = cfg.steepDirectionThreshold * hc <= fg && e != c && b != c; if (haveShallowLine) { if (haveSteepLine) Scaler::blendLineSteepAndShallow(px, out); else Scaler::blendLineShallow(px, out); } else { if (haveSteepLine) Scaler::blendLineSteep(px, out); else Scaler::blendLineDiagonal(px,out); } } else Scaler::blendCorner(px, out); } #undef a #undef b #undef c #undef d #undef e #undef f #undef g #undef h #undef i } template //scaler policy: see "Scaler2x" reference implementation void scaleImage(const uint32_t* src, uint32_t* trg, int srcWidth, int srcHeight, const xbrz::ScalerCfg& cfg, int yFirst, int yLast) { yFirst = std::max(yFirst, 0); yLast = std::min(yLast, srcHeight); if (yFirst >= yLast || srcWidth <= 0) return; const int trgWidth = srcWidth * Scaler::scale; //"use" space at the end of the image as temporary buffer for "on the fly preprocessing": we even could use larger area of //"sizeof(uint32_t) * srcWidth * (yLast - yFirst)" bytes without risk of accidental overwriting before accessing const int bufferSize = srcWidth; unsigned char* preProcBuffer = reinterpret_cast(trg + yLast * Scaler::scale * trgWidth) - bufferSize; std::fill(preProcBuffer, preProcBuffer + bufferSize, 0); //static_assert(BLEND_NONE == 0, ""); //initialize preprocessing buffer for first row: detect upper left and right corner blending //this cannot be optimized for adjacent processing stripes; we must not allow for a memory race condition! if (yFirst > 0) { const int y = yFirst - 1; const uint32_t* s_m1 = src + srcWidth * std::max(y - 1, 0); const uint32_t* s_0 = src + srcWidth * y; //center line const uint32_t* s_p1 = src + srcWidth * std::min(y + 1, srcHeight - 1); const uint32_t* s_p2 = src + srcWidth * std::min(y + 2, srcHeight - 1); for (int x = 0; x < srcWidth; ++x) { const int x_m1 = std::max(x - 1, 0); const int x_p1 = std::min(x + 1, srcWidth - 1); const int x_p2 = std::min(x + 2, srcWidth - 1); Kernel_4x4 ker = {}; //perf: initialization is negligible ker.a = s_m1[x_m1]; //read sequentially from memory as far as possible ker.b = s_m1[x]; ker.c = s_m1[x_p1]; ker.d = s_m1[x_p2]; ker.e = s_0[x_m1]; ker.f = s_0[x]; ker.g = s_0[x_p1]; ker.h = s_0[x_p2]; ker.i = s_p1[x_m1]; ker.j = s_p1[x]; ker.k = s_p1[x_p1]; ker.l = s_p1[x_p2]; ker.m = s_p2[x_m1]; ker.n = s_p2[x]; ker.o = s_p2[x_p1]; ker.p = s_p2[x_p2]; const BlendResult res = preProcessCorners(ker, cfg); /* preprocessing blend result: --------- | F | G | //evalute corner between F, G, J, K ----|---| //input pixel is at position F | J | K | --------- */ setTopR(preProcBuffer[x], res.blend_j); if (x + 1 < srcWidth) setTopL(preProcBuffer[x + 1], res.blend_k); } } //------------------------------------------------------------------------------------ for (int y = yFirst; y < yLast; ++y) { uint32_t* out = trg + Scaler::scale * y * trgWidth; //consider MT "striped" access const uint32_t* s_m1 = src + srcWidth * std::max(y - 1, 0); const uint32_t* s_0 = src + srcWidth * y; //center line const uint32_t* s_p1 = src + srcWidth * std::min(y + 1, srcHeight - 1); const uint32_t* s_p2 = src + srcWidth * std::min(y + 2, srcHeight - 1); unsigned char blend_xy1 = 0; //corner blending for current (x, y + 1) position for (int x = 0; x < srcWidth; ++x, out += Scaler::scale) { #ifndef NDEBUG breakIntoDebugger = debugPixelX == x && debugPixelY == y; #endif //all those bounds checks have only insignificant impact on performance! const int x_m1 = std::max(x - 1, 0); //perf: prefer array indexing to additional pointers! const int x_p1 = std::min(x + 1, srcWidth - 1); const int x_p2 = std::min(x + 2, srcWidth - 1); //evaluate the four corners on bottom-right of current pixel unsigned char blend_xy = 0; //for current (x, y) position { Kernel_4x4 ker = {}; //perf: initialization is negligible ker.a = s_m1[x_m1]; //read sequentially from memory as far as possible ker.b = s_m1[x]; ker.c = s_m1[x_p1]; ker.d = s_m1[x_p2]; ker.e = s_0[x_m1]; ker.f = s_0[x]; ker.g = s_0[x_p1]; ker.h = s_0[x_p2]; ker.i = s_p1[x_m1]; ker.j = s_p1[x]; ker.k = s_p1[x_p1]; ker.l = s_p1[x_p2]; ker.m = s_p2[x_m1]; ker.n = s_p2[x]; ker.o = s_p2[x_p1]; ker.p = s_p2[x_p2]; const BlendResult res = preProcessCorners(ker, cfg); /* preprocessing blend result: --------- | F | G | //evalute corner between F, G, J, K ----|---| //current input pixel is at position F | J | K | --------- */ blend_xy = preProcBuffer[x]; setBottomR(blend_xy, res.blend_f); //all four corners of (x, y) have been determined at this point due to processing sequence! setTopR(blend_xy1, res.blend_j); //set 2nd known corner for (x, y + 1) preProcBuffer[x] = blend_xy1; //store on current buffer position for use on next row blend_xy1 = 0; setTopL(blend_xy1, res.blend_k); //set 1st known corner for (x + 1, y + 1) and buffer for use on next column if (x + 1 < srcWidth) //set 3rd known corner for (x + 1, y) setBottomL(preProcBuffer[x + 1], res.blend_g); } //fill block of size scale * scale with the given color fillBlock(out, trgWidth * sizeof(uint32_t), s_0[x], Scaler::scale); //place *after* preprocessing step, to not overwrite the results while processing the the last pixel! //blend four corners of current pixel if (blendingNeeded(blend_xy)) //good 20% perf-improvement { Kernel_3x3 ker = {}; //perf: initialization is negligible ker.a = s_m1[x_m1]; //read sequentially from memory as far as possible ker.b = s_m1[x]; ker.c = s_m1[x_p1]; ker.d = s_0[x_m1]; ker.e = s_0[x]; ker.f = s_0[x_p1]; ker.g = s_p1[x_m1]; ker.h = s_p1[x]; ker.i = s_p1[x_p1]; scalePixel(ker, out, trgWidth, blend_xy, cfg); scalePixel(ker, out, trgWidth, blend_xy, cfg); scalePixel(ker, out, trgWidth, blend_xy, cfg); scalePixel(ker, out, trgWidth, blend_xy, cfg); } } } } //------------------------------------------------------------------------------------ struct Scaler2x { static const int scale = 2; template static void blendLineShallow(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref(), col); alphaBlend<3, 4>(out.template ref(), col); } template static void blendLineSteep(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref<0, scale - 1>(), col); alphaBlend<3, 4>(out.template ref<1, scale - 1>(), col); } template static void blendLineSteepAndShallow(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref<1, 0>(), col); alphaBlend<1, 4>(out.template ref<0, 1>(), col); alphaBlend<5, 6>(out.template ref<1, 1>(), col); //[!] fixes 7/8 used in xBR } template static void blendLineDiagonal(uint32_t col, OutputMatrix& out) { alphaBlend<1, 2>(out.template ref<1, 1>(), col); } template static void blendCorner(uint32_t col, OutputMatrix& out) { //model a round corner alphaBlend<21, 100>(out.template ref<1, 1>(), col); //exact: 1 - pi/4 = 0.2146018366 } }; struct Scaler3x { static const int scale = 3; template static void blendLineShallow(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref(), col); alphaBlend<1, 4>(out.template ref(), col); alphaBlend<3, 4>(out.template ref(), col); out.template ref() = col; } template static void blendLineSteep(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref<0, scale - 1>(), col); alphaBlend<1, 4>(out.template ref<2, scale - 2>(), col); alphaBlend<3, 4>(out.template ref<1, scale - 1>(), col); out.template ref<2, scale - 1>() = col; } template static void blendLineSteepAndShallow(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref<2, 0>(), col); alphaBlend<1, 4>(out.template ref<0, 2>(), col); alphaBlend<3, 4>(out.template ref<2, 1>(), col); alphaBlend<3, 4>(out.template ref<1, 2>(), col); out.template ref<2, 2>() = col; } template static void blendLineDiagonal(uint32_t col, OutputMatrix& out) { alphaBlend<1, 8>(out.template ref<1, 2>(), col); alphaBlend<1, 8>(out.template ref<2, 1>(), col); alphaBlend<7, 8>(out.template ref<2, 2>(), col); } template static void blendCorner(uint32_t col, OutputMatrix& out) { //model a round corner alphaBlend<45, 100>(out.template ref<2, 2>(), col); //exact: 0.4545939598 //alphaBlend<14, 1000>(out.template ref<2, 1>(), col); //0.01413008627 -> negligible //alphaBlend<14, 1000>(out.template ref<1, 2>(), col); //0.01413008627 } }; struct Scaler4x { static const int scale = 4; template static void blendLineShallow(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref(), col); alphaBlend<1, 4>(out.template ref(), col); alphaBlend<3, 4>(out.template ref(), col); alphaBlend<3, 4>(out.template ref(), col); out.template ref() = col; out.template ref() = col; } template static void blendLineSteep(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref<0, scale - 1>(), col); alphaBlend<1, 4>(out.template ref<2, scale - 2>(), col); alphaBlend<3, 4>(out.template ref<1, scale - 1>(), col); alphaBlend<3, 4>(out.template ref<3, scale - 2>(), col); out.template ref<2, scale - 1>() = col; out.template ref<3, scale - 1>() = col; } template static void blendLineSteepAndShallow(uint32_t col, OutputMatrix& out) { alphaBlend<3, 4>(out.template ref<3, 1>(), col); alphaBlend<3, 4>(out.template ref<1, 3>(), col); alphaBlend<1, 4>(out.template ref<3, 0>(), col); alphaBlend<1, 4>(out.template ref<0, 3>(), col); alphaBlend<1, 3>(out.template ref<2, 2>(), col); //[!] fixes 1/4 used in xBR out.template ref<3, 3>() = out.template ref<3, 2>() = out.template ref<2, 3>() = col; } template static void blendLineDiagonal(uint32_t col, OutputMatrix& out) { alphaBlend<1, 2>(out.template ref(), col); alphaBlend<1, 2>(out.template ref(), col); out.template ref() = col; } template static void blendCorner(uint32_t col, OutputMatrix& out) { //model a round corner alphaBlend<68, 100>(out.template ref<3, 3>(), col); //exact: 0.6848532563 alphaBlend< 9, 100>(out.template ref<3, 2>(), col); //0.08677704501 alphaBlend< 9, 100>(out.template ref<2, 3>(), col); //0.08677704501 } }; struct Scaler5x { static const int scale = 5; template static void blendLineShallow(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref(), col); alphaBlend<1, 4>(out.template ref(), col); alphaBlend<1, 4>(out.template ref(), col); alphaBlend<3, 4>(out.template ref(), col); alphaBlend<3, 4>(out.template ref(), col); out.template ref() = col; out.template ref() = col; out.template ref() = col; out.template ref() = col; } template static void blendLineSteep(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref<0, scale - 1>(), col); alphaBlend<1, 4>(out.template ref<2, scale - 2>(), col); alphaBlend<1, 4>(out.template ref<4, scale - 3>(), col); alphaBlend<3, 4>(out.template ref<1, scale - 1>(), col); alphaBlend<3, 4>(out.template ref<3, scale - 2>(), col); out.template ref<2, scale - 1>() = col; out.template ref<3, scale - 1>() = col; out.template ref<4, scale - 1>() = col; out.template ref<4, scale - 2>() = col; } template static void blendLineSteepAndShallow(uint32_t col, OutputMatrix& out) { alphaBlend<1, 4>(out.template ref<0, scale - 1>(), col); alphaBlend<1, 4>(out.template ref<2, scale - 2>(), col); alphaBlend<3, 4>(out.template ref<1, scale - 1>(), col); alphaBlend<1, 4>(out.template ref(), col); alphaBlend<1, 4>(out.template ref(), col); alphaBlend<3, 4>(out.template ref(), col); out.template ref<2, scale - 1>() = col; out.template ref<3, scale - 1>() = col; out.template ref() = col; out.template ref() = col; out.template ref<4, scale - 1>() = col; alphaBlend<2, 3>(out.template ref<3, 3>(), col); } template static void blendLineDiagonal(uint32_t col, OutputMatrix& out) { alphaBlend<1, 8>(out.template ref(), col); alphaBlend<1, 8>(out.template ref(), col); alphaBlend<1, 8>(out.template ref(), col); alphaBlend<7, 8>(out.template ref<4, 3>(), col); alphaBlend<7, 8>(out.template ref<3, 4>(), col); out.template ref<4, 4>() = col; } template static void blendCorner(uint32_t col, OutputMatrix& out) { //model a round corner alphaBlend<86, 100>(out.template ref<4, 4>(), col); //exact: 0.8631434088 alphaBlend<23, 100>(out.template ref<4, 3>(), col); //0.2306749731 alphaBlend<23, 100>(out.template ref<3, 4>(), col); //0.2306749731 //alphaBlend<8, 1000>(out.template ref<4, 2>(), col); //0.008384061834 -> negligible //alphaBlend<8, 1000>(out.template ref<2, 4>(), col); //0.008384061834 } }; //------------------------------------------------------------------------------------ struct ColorDistanceRGB { static double dist(uint32_t pix1, uint32_t pix2, double luminanceWeight) { if (pix1 == pix2) //about 8% perf boost return 0; return distYCbCr(pix1, pix2, luminanceWeight); } }; struct ColorDistanceARGB { static double dist(uint32_t pix1, uint32_t pix2, double luminanceWeight) { if (pix1 == pix2) return 0; return distYCbCrAlpha(pix1, pix2, luminanceWeight); } }; } void xbrz::scale(size_t factor, const uint32_t* src, uint32_t* trg, int srcWidth, int srcHeight, ColorFormat colFmt, const xbrz::ScalerCfg& cfg, int yFirst, int yLast) { switch (colFmt) { case ColorFormatARGB: switch (factor) { case 2: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); case 3: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); case 4: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); case 5: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); } case ColorFormatRGB: switch (factor) { case 2: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); case 3: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); case 4: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); case 5: return scaleImage(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast); } } assert(false); } bool xbrz::equalColorTest(uint32_t col1, uint32_t col2, ColorFormat colFmt, double luminanceWeight, double equalColorTolerance) { switch (colFmt) { case ColorFormatARGB: return ColorDistanceARGB::dist(col1, col2, luminanceWeight) < equalColorTolerance; case ColorFormatRGB: return ColorDistanceRGB::dist(col1, col2, luminanceWeight) < equalColorTolerance; } assert(false); return false; } void xbrz::nearestNeighborScale(const uint32_t* src, int srcWidth, int srcHeight, int srcPitch, uint32_t* trg, int trgWidth, int trgHeight, int trgPitch, SliceType st, int yFirst, int yLast) { if (srcPitch < srcWidth * static_cast(sizeof(uint32_t)) || trgPitch < trgWidth * static_cast(sizeof(uint32_t))) { assert(false); return; } switch (st) { case NN_SCALE_SLICE_SOURCE: //nearest-neighbor (going over source image - fast for upscaling, since source is read only once yFirst = std::max(yFirst, 0); yLast = std::min(yLast, srcHeight); if (yFirst >= yLast || trgWidth <= 0 || trgHeight <= 0) return; for (int y = yFirst; y < yLast; ++y) { //mathematically: ySrc = floor(srcHeight * yTrg / trgHeight) // => search for integers in: [ySrc, ySrc + 1) * trgHeight / srcHeight //keep within for loop to support MT input slices! const int yTrg_first = ( y * trgHeight + srcHeight - 1) / srcHeight; //=ceil(y * trgHeight / srcHeight) const int yTrg_last = ((y + 1) * trgHeight + srcHeight - 1) / srcHeight; //=ceil(((y + 1) * trgHeight) / srcHeight) const int blockHeight = yTrg_last - yTrg_first; if (blockHeight > 0) { const uint32_t* srcLine = byteAdvance(src, y * srcPitch); uint32_t* trgLine = byteAdvance(trg, yTrg_first * trgPitch); int xTrg_first = 0; for (int x = 0; x < srcWidth; ++x) { int xTrg_last = ((x + 1) * trgWidth + srcWidth - 1) / srcWidth; const int blockWidth = xTrg_last - xTrg_first; if (blockWidth > 0) { xTrg_first = xTrg_last; fillBlock(trgLine, trgPitch, srcLine[x], blockWidth, blockHeight); trgLine += blockWidth; } } } } break; case NN_SCALE_SLICE_TARGET: //nearest-neighbor (going over target image - slow for upscaling, since source is read multiple times missing out on cache! Fast for similar image sizes!) yFirst = std::max(yFirst, 0); yLast = std::min(yLast, trgHeight); if (yFirst >= yLast || srcHeight <= 0 || srcWidth <= 0) return; for (int y = yFirst; y < yLast; ++y) { uint32_t* trgLine = byteAdvance(trg, y * trgPitch); const int ySrc = srcHeight * y / trgHeight; const uint32_t* srcLine = byteAdvance(src, ySrc * srcPitch); for (int x = 0; x < trgWidth; ++x) { const int xSrc = srcWidth * x / trgWidth; trgLine[x] = srcLine[xSrc]; } } break; } } void Render2xBRZ(SSurface Src, SSurface Dst) { xbrz::scale(2, (const uint32_t *)Src.Surface, (uint32_t *)Dst.Surface, Src.Width, Src.Height, xbrz::ColorFormatRGB); } void Render3xBRZ(SSurface Src, SSurface Dst) { xbrz::scale(3, (const uint32_t *)Src.Surface, (uint32_t *)Dst.Surface, Src.Width, Src.Height, xbrz::ColorFormatRGB); } void Render4xBRZ(SSurface Src, SSurface Dst) { xbrz::scale(4, (const uint32_t *)Src.Surface, (uint32_t *)Dst.Surface, Src.Width, Src.Height, xbrz::ColorFormatRGB); } void Render5xBRZ(SSurface Src, SSurface Dst) { xbrz::scale(5, (const uint32_t *)Src.Surface, (uint32_t *)Dst.Surface, Src.Width, Src.Height, xbrz::ColorFormatRGB); } desmume-0.9.11/src/filter/xbrz.h0000755000000000000000000001203712467662066015176 0ustar rootroot// **************************************************************************** // * This file is part of the HqMAME project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // * * // * Additionally and as a special exception, the author gives permission * // * to link the code of this program with the MAME library (or with modified * // * versions of MAME that use the same license as MAME), and distribute * // * linked combinations including the two. You must obey the GNU General * // * Public License in all respects for all of the code used other than MAME. * // * If you modify this file, you may extend this exception to your version * // * of the file, but you are not obligated to do so. If you do not wish to * // * do so, delete this exception statement from your version. * // **************************************************************************** // 2014-11-18 (rogerman): Update to XBRZ 1.1. // // 2014-02-06 (rogerman): Modified for use in DeSmuME by removing C++11 code. // Also integrate xbrz's config.h file into this one. #ifndef XBRZ_HEADER_3847894708239054 #define XBRZ_HEADER_3847894708239054 #include //size_t #include #ifdef _MSC_VER typedef __int32 int32_t; typedef unsigned __int32 uint32_t; #else #include //uint32_t #endif namespace xbrz { /* ------------------------------------------------------------------------- | xBRZ: "Scale by rules" - high quality image upscaling filter by Zenju | ------------------------------------------------------------------------- using a modified approach of xBR: http://board.byuu.org/viewtopic.php?f=10&t=2248 - new rule set preserving small image features - support alpha channel - support multithreading - support 64-bit architectures - support processing image slices */ enum ColorFormat //from high bits -> low bits, 8 bit per channel { ColorFormatARGB, //including alpha channel, BGRA byte order on little-endian machines ColorFormatRGB, //8 bit for each red, green, blue, upper 8 bits unused }; /* -> map source (srcWidth * srcHeight) to target (scale * width x scale * height) image, optionally processing a half-open slice of rows [yFirst, yLast) only -> support for source/target pitch in bytes! -> if your emulator changes only a few image slices during each cycle (e.g. DOSBox) then there's no need to run xBRZ on the complete image: Just make sure you enlarge the source image slice by 2 rows on top and 2 on bottom (this is the additional range the xBRZ algorithm is using during analysis) Caveat: If there are multiple changed slices, make sure they do not overlap after adding these additional rows in order to avoid a memory race condition in the target image data if you are using multiple threads for processing each enlarged slice! THREAD-SAFETY: - parts of the same image may be scaled by multiple threads as long as the [yFirst, yLast) ranges do not overlap! - there is a minor inefficiency for the first row of a slice, so avoid processing single rows only */ struct ScalerCfg { ScalerCfg() : luminanceWeight_(1), equalColorTolerance_(30), dominantDirectionThreshold(3.6), steepDirectionThreshold(2.2), newTestAttribute_(0) {} double luminanceWeight_; double equalColorTolerance_; double dominantDirectionThreshold; double steepDirectionThreshold; double newTestAttribute_; //unused; test new parameters }; void scale(size_t factor, //valid range: 2 - 5 const uint32_t* src, uint32_t* trg, int srcWidth, int srcHeight, ColorFormat colFmt, const ScalerCfg& cfg = ScalerCfg(), int yFirst = 0, int yLast = std::numeric_limits::max()); //slice of source image void nearestNeighborScale(const uint32_t* src, int srcWidth, int srcHeight, uint32_t* trg, int trgWidth, int trgHeight); enum SliceType { NN_SCALE_SLICE_SOURCE, NN_SCALE_SLICE_TARGET, }; void nearestNeighborScale(const uint32_t* src, int srcWidth, int srcHeight, int srcPitch, //pitch in bytes! uint32_t* trg, int trgWidth, int trgHeight, int trgPitch, SliceType st, int yFirst, int yLast); //parameter tuning bool equalColorTest(uint32_t col1, uint32_t col2, ColorFormat colFmt, double luminanceWeight, double equalColorTolerance); //########################### implementation ########################### inline void nearestNeighborScale(const uint32_t* src, int srcWidth, int srcHeight, uint32_t* trg, int trgWidth, int trgHeight) { nearestNeighborScale(src, srcWidth, srcHeight, srcWidth * sizeof(uint32_t), trg, trgWidth, trgHeight, trgWidth * sizeof(uint32_t), NN_SCALE_SLICE_TARGET, 0, trgHeight); } } #endif desmume-0.9.11/src/filter/videofilter.h0000755000000000000000000001533012467662066016524 0ustar rootroot/* Copyright (C) 2011-2012 Roger Manuel Copyright (C) 2013-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _VIDEOFILTER_ #define _VIDEOFILTER_ #include #include #include #include "types.h" #include "filter.h" #include "../utils/task.h" #ifdef HOST_WINDOWS typedef unsigned __int32 uint32_t; #define WIN32_LEAN_AND_MEAN #include typedef CRITICAL_SECTION ThreadLock; typedef HANDLE ThreadCond; #else #include #include typedef pthread_mutex_t ThreadLock; typedef pthread_cond_t ThreadCond; #endif #define VIDEOFILTERTYPE_UNKNOWN_STRING "Unknown" typedef void (*VideoFilterFunc)(SSurface Src, SSurface Dst); // VIDEO FILTER TYPES enum VideoFilterTypeID { VideoFilterTypeID_None = 0, VideoFilterTypeID_LQ2X, VideoFilterTypeID_LQ2XS, VideoFilterTypeID_HQ2X, VideoFilterTypeID_HQ2XS, VideoFilterTypeID_HQ4X, VideoFilterTypeID_2xSaI, VideoFilterTypeID_Super2xSaI, VideoFilterTypeID_SuperEagle, VideoFilterTypeID_Scanline, VideoFilterTypeID_Bilinear, VideoFilterTypeID_Nearest2X, VideoFilterTypeID_Nearest1_5X, VideoFilterTypeID_NearestPlus1_5X, VideoFilterTypeID_EPX, VideoFilterTypeID_EPXPlus, VideoFilterTypeID_EPX1_5X, VideoFilterTypeID_EPXPlus1_5X, VideoFilterTypeID_HQ4XS, VideoFilterTypeID_2xBRZ, VideoFilterTypeID_3xBRZ, VideoFilterTypeID_4xBRZ, VideoFilterTypeID_5xBRZ, VideoFilterTypeIDCount // Make sure this one is always last }; typedef struct { VideoFilterTypeID typeID; const char *typeString; VideoFilterFunc filterFunction; size_t scaleMultiply; size_t scaleDivide; size_t workingSurfaceCount; } VideoFilterAttributes; // Users should really be using VideoFilter::GetAttributesByID() to retrieve // a filter's attributes. However, extern this out just in case someone // wants to statically assign some attributes info at compile time. extern const VideoFilterAttributes VideoFilterAttributesList[]; // VIDEO FILTER PARAMETER DATA TYPES enum VideoFilterParamType { VF_INT = 0, VF_UINT, VF_FLOAT }; // VIDEO FILTER PARAMETERS // These tokens are used with the (Get/Set)FilterParameter family of methods. enum VideoFilterParamID { VF_PARAM_SCANLINE_A = 0, // Must always start at 0 VF_PARAM_SCANLINE_B, VF_PARAM_SCANLINE_C, VF_PARAM_SCANLINE_D, VideoFilterParamIDCount // Make sure this one is always last }; // Parameters struct for IPC typedef struct { SSurface srcSurface; SSurface dstSurface; VideoFilterFunc filterFunction; } VideoFilterThreadParam; typedef struct { Task *task; VideoFilterThreadParam param; } VideoFilterThread; /******************************************************************************************** VideoFilter - C++ CLASS This is a wrapper class for managing the video filter functions from filter.h. The steps to using a video filter are as follows: 1. Instantiate this class. 2. Set the rectangular size of the source image in pixels. (Can be done during instantiation.) 3. Set the video filter type. (Can be done during instantiation.) 4. Fill in the source buffer with pixels in RGBA8888 format. This class provides the GetSrcBufferPtr() accessor for the source buffer pointer. 5. Call RunFilter(). This runs the source buffer pixels through the chosen filter, and then stores the resulting pixels into the destination buffer in RGBA8888 format. 6. At this point, the destination buffer pixels can be used. RunFilter() returns a pointer to the destination buffer. Alternatively, GetDstBufferPtr() can be used to get the pointer. Thread Safety: All methods are thread-safe. ********************************************************************************************/ class VideoFilter { private: VideoFilterAttributes _vfAttributes; SSurface _vfSrcSurface; SSurface _vfDstSurface; uint32_t *_vfSrcSurfacePixBuffer; VideoFilterFunc _vfFunc; std::vector _vfThread; bool _useInternalDstBuffer; bool _isFilterRunning; ThreadLock _lockSrc; ThreadLock _lockDst; ThreadLock _lockAttributes; ThreadCond _condRunning; bool AllocateDstBuffer(const size_t dstWidth, const size_t dstHeight, const size_t workingSurfaceCount); void SetAttributes(const VideoFilterAttributes &vfAttr); public: VideoFilter(size_t srcWidth, size_t srcHeight, VideoFilterTypeID typeID, size_t threadCount); ~VideoFilter(); bool SetSourceSize(const size_t width, const size_t height); bool ChangeFilterByID(const VideoFilterTypeID typeID); bool ChangeFilterByAttributes(const VideoFilterAttributes &vfAttr); uint32_t* RunFilter(); static void RunFilterCustomByID(const uint32_t *__restrict srcBuffer, uint32_t *__restrict dstBuffer, const size_t srcWidth, const size_t srcHeight, const VideoFilterTypeID typeID); static void RunFilterCustomByAttributes(const uint32_t *__restrict srcBuffer, uint32_t *__restrict dstBuffer, const size_t srcWidth, const size_t srcHeight, const VideoFilterAttributes &vfAttr); static VideoFilterAttributes GetAttributesByID(const VideoFilterTypeID typeID); static const char* GetTypeStringByID(const VideoFilterTypeID typeID); VideoFilterAttributes GetAttributes(); VideoFilterTypeID GetTypeID(); const char* GetTypeString(); uint32_t* GetSrcBufferPtr(); uint32_t* GetDstBufferPtr(); void SetDstBufferPtr(uint32_t *theBuffer); size_t GetSrcWidth(); size_t GetSrcHeight(); size_t GetDstWidth(); size_t GetDstHeight(); VideoFilterParamType GetFilterParameterType(VideoFilterParamID paramID) const; int GetFilterParameteri(VideoFilterParamID paramID); unsigned int GetFilterParameterui(VideoFilterParamID paramID); float GetFilterParameterf(VideoFilterParamID paramID); void SetFilterParameteri(VideoFilterParamID paramID, int value); void SetFilterParameterui(VideoFilterParamID paramID, unsigned int value); void SetFilterParameterf(VideoFilterParamID paramID, float value); }; void ThreadLockInit(ThreadLock *theLock); void ThreadLockDestroy(ThreadLock *theLock); void ThreadLockLock(ThreadLock *theLock); void ThreadLockUnlock(ThreadLock *theLock); void ThreadCondInit(ThreadCond *theCondition); void ThreadCondDestroy(ThreadCond *theCondition); void ThreadCondWait(ThreadCond *theCondition, ThreadLock *conditionLock); void ThreadCondSignal(ThreadCond *theCondition); #endif desmume-0.9.11/src/GPU_osd.cpp0000755000000000000000000004775412467662066014575 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "GPU_osd.h" #include "driver.h" #include "GPU.h" #include "mem.h" #include //mem funcs #include //va_start, etc #include #include #include #include #include "debug.h" #include "aggdraw.h" #include "movie.h" #include "rtc.h" #include "NDSSystem.h" #include "mic.h" #include "saves.h" bool HudEditorMode = false; OSDCLASS *osd = NULL; HudStruct Hud; //contains a timer to be used for well-timed hud components static s64 hudTimer; static void SetHudDummy (HudCoordinates *hud) { hud->x=666; hud->y=666; } static bool IsHudDummy (HudCoordinates *hud) { return (hud->x == 666 && hud->y == 666); } template static T calcY(T y) // alters a GUI element y coordinate as necessary to obey swapScreens and singleScreen settings { if(osd->singleScreen) { if(y >= 192) y -= 192; if(osd->swapScreens) y += 192; } else if(osd->swapScreens) { if(y >= 192) y -= 192; else y += 192; } return y; } void EditHud(s32 x, s32 y, HudStruct *hudstruct) { u32 i = 0; while (!IsHudDummy(&hudstruct->hud(i))) { HudCoordinates &hud = hudstruct->hud(i); //reset if(!hud.clicked) { hud.storedx=0; hud.storedy=0; } if((x >= hud.x && x <= hud.x + hud.xsize) && (calcY(y) >= calcY(hud.y) && calcY(y) <= calcY(hud.y) + hud.ysize) && !hudstruct->clicked ) { hud.clicked=1; hud.storedx = x - hud.x; hud.storedy = y - hud.y; } if(hud.clicked) { hud.x = x - hud.storedx; hud.y = y - hud.storedy; } //sanity checks if(hud.x < 0) hud.x = 0; if(hud.y < 0) hud.y = 0; if(hud.x > 245)hud.x = 245; //margins if(hud.y > 384-16)hud.y = 384-16; if(hud.clicked) { hudstruct->clicked = true; break;//prevent items from grouping together } i++; } } void HudClickRelease(HudStruct *hudstruct) { u32 i = 0; while (!IsHudDummy(&hudstruct->hud(i))) { HudCoordinates &hud = hudstruct->hud(i); hud.clicked=0; i++; } hudstruct->clicked = false; } void HudStruct::reset() { FpsDisplay.x=0; FpsDisplay.y=5; FpsDisplay.xsize=166; FpsDisplay.ysize=10; FrameCounter.x=0; FrameCounter.y=25; FrameCounter.xsize=60; FrameCounter.ysize=10; InputDisplay.x=0; InputDisplay.y=45; InputDisplay.xsize=220; InputDisplay.ysize=10; GraphicalInputDisplay.x=8; GraphicalInputDisplay.y=328; GraphicalInputDisplay.xsize=102; GraphicalInputDisplay.ysize=50; LagFrameCounter.x=0; LagFrameCounter.y=65; LagFrameCounter.xsize=30; LagFrameCounter.ysize=10; Microphone.x=0; Microphone.y=85; Microphone.xsize=20; Microphone.ysize=10; RTCDisplay.x=0; RTCDisplay.y=105; RTCDisplay.xsize=220; RTCDisplay.ysize=10; SavestateSlots.x = 8; SavestateSlots.y = 160; SavestateSlots.xsize = 240; SavestateSlots.ysize = 24; SetHudDummy(&Dummy); clicked = false; } static void joyFill(int n) { bool pressedForGame = NDS_getFinalUserInput().buttons.array[n]; bool physicallyPressed = NDS_getRawUserInput().buttons.array[n]; if(pressedForGame && physicallyPressed) aggDraw.hud->fillColor(0,0,0,255); else if(pressedForGame) aggDraw.hud->fillColor(255,0,0,255); else if(physicallyPressed) aggDraw.hud->fillColor(0,255,0,255); else aggDraw.hud->fillColor(255,255,255,255); } static void joyEllipse(double ex, double ey, int xc, int yc, int x, int y, double ratio, double rad, int button) { joyFill(button); aggDraw.hud->lineWidth(rad); aggDraw.hud->ellipse(x+((xc*ex)*ratio), y+((yc*ey)*ratio), rad*ratio, rad*ratio); } static void joyRoundedRect(double x1, double y1, int x2, int y2, int alpha1, int alpha2, int button) { bool pressedForGame = NDS_getFinalUserInput().buttons.array[button]; bool physicallyPressed = NDS_getRawUserInput().buttons.array[button]; if(pressedForGame && physicallyPressed) aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,0,0,alpha1), agg::rgba8(0,0,0,alpha2)); else if(pressedForGame) aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,0,0,alpha1), agg::rgba8(255,0,0,alpha2)); else if(physicallyPressed) aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,255,0,alpha1), agg::rgba8(0,255,0,alpha2)); else return; //aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,255,255,alpha1), agg::rgba8(255,255,255,alpha2)); aggDraw.hud->roundedRect(x1,y1,x2,y2,1); } static void drawPad(double x, double y, double ratio) { // you might notice black/red/green colors used to show what buttons are pressed. // the logic is roughly: // RED == PAST (the button was held last frame) // GREEN == FUTURE (the button is physically held now) // BLACK == PRESENT (the button was held last frame and is still physically held now) // aligning to odd half-pixel boundaries prevents agg2d from blurring thin straight lines x = floor(x) + 0.5; y = floor(calcY(y)) + 0.5; double xc = 41 - 0.5; double yc = 20 - 0.5; aggDraw.hud->lineColor(128,128,128,255); aggDraw.hud->fillLinearGradient(x, y, x+(xc*ratio), y+(yc*ratio), agg::rgba8(222,222,222,128), agg::rgba8(255,255,255,255)); aggDraw.hud->roundedRect (x, y, floor(x+(xc*ratio))+0.5, floor(y+(yc*ratio))+0.5, 1); double screenLeft = x+(xc*.25*ratio); double screenTop = y+(yc*.1*ratio); double screenRight = x+(xc*.745*ratio); double screenBottom = y+(yc*.845*ratio); aggDraw.hud->fillLinearGradient(screenLeft, screenTop, screenRight, screenBottom, agg::rgba8(128,128,128,128), agg::rgba8(255,255,255,255)); aggDraw.hud->roundedRect (screenLeft, screenTop, screenRight, screenBottom, 1); joyEllipse(.89,.45,xc,yc,x,y,ratio,1,6);//B joyEllipse(.89,.22,xc,yc,x,y,ratio,1,3);//X joyEllipse(.83,.34,xc,yc,x,y,ratio,1,4);//Y joyEllipse(.95,.34,xc,yc,x,y,ratio,1,5);//A joyEllipse(.82,.716,xc,yc,x,y,ratio,.5,7);//Start joyEllipse(.82,.842,xc,yc,x,y,ratio,.5,8);//Select double dpadPoints [][2] = { {.04,.33}, // top-left corner of left button {.08,.33}, {.08,.24}, // top-left corner of up button {.13,.24}, // top-right corner of up button {.13,.33}, {.17,.33}, // top-right corner of right button {.17,.43}, // bottom-right corner of right button {.13,.43}, {.13,.516}, // bottom-right corner of down button {.08,.516}, // bottom-left corner of down button {.08,.43}, {.04,.43}, // bottom-left corner of left button }; static const int numdpadPoints = sizeof(dpadPoints)/sizeof(dpadPoints[0]); for(int i = 0; i < numdpadPoints; i++) { dpadPoints[i][0] = x+(xc*(dpadPoints[i][0]+.01)*ratio); dpadPoints[i][1] = y+(yc*(dpadPoints[i][1]+.00)*ratio); } // dpad outline aggDraw.hud->fillColor(255,255,255,200); aggDraw.hud->polygon((double*)dpadPoints, numdpadPoints); aggDraw.hud->noLine(); // left joyRoundedRect(dpadPoints[0][0], dpadPoints[0][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 11); // right joyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[6][0], dpadPoints[6][1], 0, 255, 12); // up joyRoundedRect(dpadPoints[2][0], dpadPoints[2][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 9); // right joyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[8][0], dpadPoints[8][1], 0, 255, 10); // left shoulder joyRoundedRect(x+(xc*.00*ratio), y+(yc*.00*ratio), x+(xc*.15*ratio), y+(yc*.07*ratio), 255, 200, 2); // right shoulder joyRoundedRect(x+(xc*.85*ratio), y+(yc*.00*ratio), x+(xc*1.0*ratio), y+(yc*.07*ratio), 200, 255, 1); // lid... joyRoundedRect(x+(xc*.4*ratio), y+(yc*.96*ratio), x+(xc*0.6*ratio), y+(yc*1.0*ratio), 200, 200, 13); // touch pad { BOOL gameTouchOn = nds.isTouch; double gameTouchX = screenLeft+1 + (nds.scr_touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0; double gameTouchY = screenTop+1 + (nds.scr_touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0; bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch; double physicalTouchX = screenLeft+1 + (NDS_getRawUserInput().touch.touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0; double physicalTouchY = screenTop+1 + (NDS_getRawUserInput().touch.touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0; if(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY) { aggDraw.hud->fillColor(0,0,0,255); aggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37); } else { if(physicalTouchOn) { aggDraw.hud->fillColor(0,0,0,128); aggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.5, ratio*0.5); aggDraw.hud->fillColor(0,255,0,255); aggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.37, ratio*0.37); } if(gameTouchOn) { aggDraw.hud->fillColor(255,0,0,255); aggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37); } } } } struct TouchInfo{ u16 X; u16 Y; }; static int touchalpha[8]= {31, 63, 95, 127, 159, 191, 223, 255}; static TouchInfo temptouch; static const bool touchshadow = false;//true; // sorry, it's cool but also distracting and looks cleaner with it off. maybe if it drew line segments between touch points instead of isolated crosses... static std::vector touch (8); static void TextualInputDisplay() { // drawing the whole string at once looks ugly // (because of variable width font and the "shadow" appearing over blank space) // and can't give us the color-coded effects we want anyway (see drawPad for info) const UserButtons& gameButtons = NDS_getFinalUserInput().buttons; const UserButtons& physicalButtons = NDS_getRawUserInput().buttons; double x = Hud.InputDisplay.x; // from order FRLDUTSBAYXWEG where G is 0 static const char* buttonChars = "<^>vABXYLRSsgf"; static const int buttonIndex [14] = {11,9,12,10,5,6,3,4,2,1,7,8,0,13}; for(int i = 0; i < 14; i++, x+=11.0) { bool pressedForGame = gameButtons.array[buttonIndex[i]]; bool physicallyPressed = physicalButtons.array[buttonIndex[i]]; if(pressedForGame && physicallyPressed) aggDraw.hud->lineColor(255,255,255,255); else if(pressedForGame) aggDraw.hud->lineColor(255,48,48,255); else if(physicallyPressed) aggDraw.hud->lineColor(0,192,0,255); else continue; // cast from char to std::string is a bit awkward std::string str(buttonChars+i, 2); str[1] = '\0'; aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str); } // touch pad { char str [32]; BOOL gameTouchOn = nds.isTouch; int gameTouchX = nds.adc_touchX >> 4; int gameTouchY = nds.adc_touchY >> 4; bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch; int physicalTouchX = NDS_getRawUserInput().touch.touchX >> 4; int physicalTouchY = NDS_getRawUserInput().touch.touchY >> 4; if(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY) { sprintf(str, "%d,%d", gameTouchX, gameTouchY); aggDraw.hud->lineColor(255,255,255,255); aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str); } else { if(gameTouchOn) { sprintf(str, "%d,%d", gameTouchX, gameTouchY); aggDraw.hud->lineColor(255,48,48,255); aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)-(physicalTouchOn?8:0), str); } if(physicalTouchOn) { sprintf(str, "%d,%d", physicalTouchX, physicalTouchY); aggDraw.hud->lineColor(0,192,0,255); aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)+(gameTouchOn?8:0), str); } } } } static void TouchDisplay() { // note: calcY should not be used in this function. aggDraw.hud->lineWidth(1.0); temptouch.X = NDS_getRawUserInput().touch.touchX >> 4; temptouch.Y = NDS_getRawUserInput().touch.touchY >> 4; if(touchshadow) { touch.push_back(temptouch); if(touch.size() > 8) touch.erase(touch.begin()); for (int i = 0; i < 8; i++) { temptouch = touch[i]; if(temptouch.X != 0 || temptouch.Y != 0) { aggDraw.hud->lineColor(0, 255, 0, touchalpha[i]); aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert aggDraw.hud->fillColor(0, 0, 0, touchalpha[i]); aggDraw.hud->rectangle(temptouch.X-1, temptouch.Y + 192-1, temptouch.X+1, temptouch.Y + 192+1); } } } else if(NDS_getRawUserInput().touch.isTouch) { aggDraw.hud->lineColor(0, 255, 0, 128); aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert } if(nds.isTouch) { temptouch.X = nds.scr_touchX / 16; temptouch.Y = nds.scr_touchY / 16; aggDraw.hud->lineColor(255, 0, 0, 128); aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert } } static int previousslot = 0; static char number[10]; static s64 slotTimer=0; static void DrawStateSlots(){ const int yloc = calcY(Hud.SavestateSlots.y); //160 const int xloc = Hud.SavestateSlots.x; //8 s64 fadecounter = 512 - (hudTimer-slotTimer)/4; //change constant to alter fade speed if(fadecounter < 1) fadecounter = 0; if(fadecounter>255) fadecounter = 255; int alpha = (int)fadecounter; if(HudEditorMode) alpha = 255; if(alpha!=0) { aggDraw.hud->lineWidth(1.0); aggDraw.hud->lineColor(0, 0, 0, alpha); aggDraw.hud->fillColor(255, 255, 255, alpha); for ( int i = 0, xpos=0; i < 10; xpos=xpos+24) { int yheight=0; aggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, xloc + 22 + xpos, yloc + 20 + yheight+20, agg::rgba8(100,200,255,alpha), agg::rgba8(255,255,255,0)); if(lastSaveState == i) { yheight = 5; aggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, 22 + xloc + xpos, yloc + 20 + yheight+20, agg::rgba8(100,255,255,alpha), agg::rgba8(255,255,255,0)); } aggDraw.hud->rectangle(xloc + xpos , yloc - yheight, xloc + 22 + xpos , yloc + 20 + yheight); snprintf(number, 10, "%d", i); aggDraw.hud->renderText(xloc + 1 + xpos + 4, yloc+4, std::string(number)); i++; } } if(lastSaveState != previousslot) slotTimer = hudTimer; previousslot = lastSaveState; } static void DrawEditableElementIndicators() { u32 i = 0; while (!IsHudDummy(&Hud.hud(i))) { HudCoordinates &hud = Hud.hud(i); aggDraw.hud->fillColor(0,0,0,0); aggDraw.hud->lineColor(0,0,0,64); aggDraw.hud->lineWidth(2.0); aggDraw.hud->rectangle(hud.x,calcY(hud.y),hud.x+hud.xsize+1.0,calcY(hud.y)+hud.ysize+1.0); aggDraw.hud->lineColor(255,hud.clicked?127:255,0,255); aggDraw.hud->lineWidth(1.0); aggDraw.hud->rectangle(hud.x-0.5,calcY(hud.y)-0.5,hud.x+hud.xsize+0.5,calcY(hud.y)+hud.ysize+0.5); i++; } } void DrawHUD() { GTimeVal time; g_get_current_time(&time); hudTimer = ((s64)time.tv_sec * 1000) + ((s64)time.tv_usec/1000); if (HudEditorMode) { DrawEditableElementIndicators(); } if (CommonSettings.hud.ShowInputDisplay) { TextualInputDisplay(); TouchDisplay(); } if (CommonSettings.hud.FpsDisplay) { osd->addFixed(Hud.FpsDisplay.x, Hud.FpsDisplay.y, "Fps:%02d/%02d (%02d%%/%02d%%)%s", Hud.fps, Hud.fps3d, Hud.cpuload[0], Hud.cpuload[1], driver->EMU_IsEmulationPaused() ? " (paused)" : ""); } if (CommonSettings.hud.FrameCounterDisplay) { if(movieMode == MOVIEMODE_RECORD) osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d",currFrameCounter); else if (movieMode == MOVIEMODE_PLAY) osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d/%d",currFrameCounter,currMovieData.records.size()); else if (movieMode == MOVIEMODE_FINISHED) osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d/%d (finished)",currFrameCounter,currMovieData.records.size()); else osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d (no movie)",currFrameCounter); } if (CommonSettings.hud.ShowLagFrameCounter) { osd->addFixed(Hud.LagFrameCounter.x, Hud.LagFrameCounter.y, "%d",TotalLagFrames); } if (CommonSettings.hud.ShowGraphicalInputDisplay) { drawPad(Hud.GraphicalInputDisplay.x, Hud.GraphicalInputDisplay.y, 2.5); } #if defined(WIN32) && !defined(DESMUME_QT) if (CommonSettings.hud.ShowMicrophone) { osd->addFixed(Hud.Microphone.x, Hud.Microphone.y, "%03d [%07d]",MicDisplay, Hud.cpuloopIterationCount); } #endif if (CommonSettings.hud.ShowRTC) { DateTime tm = rtcGetTime(); static const char *wday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; osd->addFixed(Hud.RTCDisplay.x, Hud.RTCDisplay.y, "%04d-%03s-%02d %s %02d:%02d:%02d", tm.get_Year(), DateTime::GetNameOfMonth(tm.get_Month()), tm.get_Day(), wday[tm.get_DayOfWeek()%7], tm.get_Hour(), tm.get_Minute(), tm.get_Second()); } DrawStateSlots(); } OSDCLASS::OSDCLASS(u8 core) { memset(name,0,7); mode=core; offset=0; lastLineText=0; lineText_x = 5; lineText_y = 120; lineText_color = AggColor(255, 255, 255); for (int i=0; i < OSD_MAX_LINES+1; i++) { lineText[i] = new char[1024]; memset(lineText[i], 0, 1024); lineTimer[i] = 0; lineColor[i] = lineText_color; } rotAngle = 0; singleScreen = false; swapScreens = false; needUpdate = false; if (core==0) strcpy(name,"Core A"); else if (core==1) strcpy(name,"Core B"); else { strcpy(name,"Main"); mode=255; } //border(false); LOG("OSD_Init (%s)\n",name); } OSDCLASS::~OSDCLASS() { LOG("OSD_Deinit (%s)\n",name); for (int i=0; i < OSD_MAX_LINES+1; i++) { if (lineText[i]) delete [] lineText[i]; lineText[i] = NULL; } } void OSDCLASS::setOffset(u16 ofs) { offset=ofs; } void OSDCLASS::setRotate(u16 angle) { rotAngle = angle; } void OSDCLASS::clear() { needUpdate=false; } bool OSDCLASS::checkTimers() { if (lastLineText == 0) return false; time_t tmp_time = time(NULL); for (int i=0; i < lastLineText; i++) { if (tmp_time > (lineTimer[i] + OSD_TIMER_SECS) ) { if (i < lastLineText) { for (int j=i; j < lastLineText; j++) { strcpy(lineText[j], lineText[j+1]); lineTimer[j] = lineTimer[j+1]; lineColor[j] = lineColor[j+1]; } } lineTimer[lastLineText] = 0; lastLineText--; if (lastLineText == 0) return false; } } return true; } void OSDCLASS::update() { if ( (!needUpdate) && (!lastLineText) ) return; // don't update if buffer empty (speed up) if (lastLineText) { if (checkTimers()) { for (int i=0; i < lastLineText; i++) { aggDraw.hud->lineColor(lineColor[i]); aggDraw.hud->renderTextDropshadowed(lineText_x,lineText_y+(i*16),lineText[i]); } } else { if (!needUpdate) return; } } } void OSDCLASS::setListCoord(u16 x, u16 y) { lineText_x = x; lineText_y = y; } void OSDCLASS::setLineColor(u8 r=255, u8 g=255, u8 b=255) { lineText_color = AggColor(r,g,b); } void OSDCLASS::addLine(const char *fmt, ...) { va_list list; if (lastLineText > OSD_MAX_LINES) lastLineText = OSD_MAX_LINES; if (lastLineText == OSD_MAX_LINES) // full { lastLineText--; for (int j=0; j < lastLineText; j++) { strcpy(lineText[j], lineText[j+1]); lineTimer[j] = lineTimer[j+1]; lineColor[j] = lineColor[j+1]; } } va_start(list,fmt); #if defined(_MSC_VER) || defined(__INTEL_COMPILER) _vsnprintf(lineText[lastLineText],1023,fmt,list); #else vsnprintf(lineText[lastLineText],1023,fmt,list); #endif va_end(list); lineColor[lastLineText] = lineText_color; lineTimer[lastLineText] = time(NULL); needUpdate = true; lastLineText++; } void OSDCLASS::addFixed(u16 x, u16 y, const char *fmt, ...) { va_list list; char msg[1024]; va_start(list,fmt); vsnprintf(msg,1023,fmt,list); va_end(list); aggDraw.hud->lineColor(255,255,255); aggDraw.hud->renderTextDropshadowed(x,calcY(y),msg); needUpdate = true; } void OSDCLASS::border(bool enabled) { //render51.setTextBoxBorder(enabled); } desmume-0.9.11/src/aggdraw.h0000755000000000000000000007525512467662066014353 0ustar rootroot/* The MIT License Copyright (C) 2009-2010 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 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 contains code designed to be used by hud and lua systems in any emulator #ifndef _AGGDRAW_H_ #define _AGGDRAW_H_ #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" #include "agg_renderer_base.h" #include "agg_renderer_primitives.h" #include "agg_renderer_scanline.h" #include "agg_bounding_rect.h" #include "agg_renderer_mclip.h" #include "agg_renderer_outline_aa.h" #include "agg_renderer_markers.h" #include "agg_pixfmt_rgb.h" #include "agg_pixfmt_rgba.h" #include "agg_pixfmt_rgb_packed.h" #include "agg2d.h" typedef agg::rgba8 AggColor; namespace agg { //NOTE - these blenders are necessary to change the rgb order from the defaults, which are incorrect for us //this custom blender does more correct blending math than the default //which is necessary or else drawing transparent pixels on (31,31,31) will yield (30,30,30) struct my_blender_rgb555_pre { typedef rgba8 color_type; typedef color_type::value_type value_type; typedef color_type::calc_type calc_type; typedef int16u pixel_type; static AGG_INLINE void blend_pix(pixel_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { //not sure whether this is right... alpha = color_type::base_mask - alpha; pixel_type rgb = *p; calc_type b = (rgb >> 10) & 31; calc_type g = (rgb >> 5) & 31; calc_type r = (rgb ) & 31; b = ((b+1)*(alpha+1) + (cb)*(cover)-1)>>8; g = ((g+1)*(alpha+1) + (cg)*(cover)-1)>>8; r = ((r+1)*(alpha+1) + (cr)*(cover)-1)>>8; *p = (b<<10)|(g<<5)|r; } static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) { return (pixel_type)(((b & 0xF8) << 7) | ((g & 0xF8) << 2) | (r >> 3) | 0x8000); } static AGG_INLINE color_type make_color(pixel_type p) { return color_type((p << 3) & 0xF8, (p >> 2) & 0xF8, (p >> 7) & 0xF8); } }; struct my_blender_rgb555 { typedef rgba8 color_type; typedef color_type::value_type value_type; typedef color_type::calc_type calc_type; typedef int16u pixel_type; static AGG_INLINE void blend_pix(pixel_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned) { pixel_type rgb = *p; calc_type b = (rgb >> 7) & 0xF8; calc_type g = (rgb >> 2) & 0xF8; calc_type r = (rgb << 3) & 0xF8; *p = (pixel_type) (((((cb - b) * alpha + (b << 8)) >> 1) & 0x7C00) | ((((cg - g) * alpha + (g << 8)) >> 6) & 0x03E0) | (((cr - r) * alpha + (r << 8)) >> 11) | 0x8000); } static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) { return (pixel_type)(((b & 0xF8) << 7) | ((g & 0xF8) << 2) | (r >> 3) | 0x8000); } static AGG_INLINE color_type make_color(pixel_type p) { return color_type((p << 3) & 0xF8, (p >> 2) & 0xF8, (p >> 7) & 0xF8); } }; //this is a prototype span generator which should be able to generate 8888 and 555 spans //it would be used in agg2d.inl renderImage() //but it isn't being used yet. //this will need to be completed before we can use 555 as a source imge template class span_simple_blur_rgb24 { public: //-------------------------------------------------------------------- typedef rgba8 color_type; //-------------------------------------------------------------------- span_simple_blur_rgb24() : m_source_image(0) {} //-------------------------------------------------------------------- span_simple_blur_rgb24(const rendering_buffer& src) : m_source_image(&src) {} //-------------------------------------------------------------------- void source_image(const rendering_buffer& src) { m_source_image = &src; } const rendering_buffer& source_image() const { return *m_source_image; } //-------------------------------------------------------------------- void prepare() {} //-------------------------------------------------------------------- void generate(color_type* span, int x, int y, int len) { if(y < 1 || y >= int(m_source_image->height() - 1)) { do { *span++ = rgba8(0,0,0,0); } while(--len); return; } do { int color[4]; color[0] = color[1] = color[2] = color[3] = 0; if(x > 0 && x < int(m_source_image->width()-1)) { int i = 3; do { const int8u* ptr = m_source_image->row_ptr(y - i + 2) + (x - 1) * 3; color[0] += *ptr++; color[1] += *ptr++; color[2] += *ptr++; color[3] += 255; color[0] += *ptr++; color[1] += *ptr++; color[2] += *ptr++; color[3] += 255; color[0] += *ptr++; color[1] += *ptr++; color[2] += *ptr++; color[3] += 255; } while(--i); color[0] /= 9; color[1] /= 9; color[2] /= 9; color[3] /= 9; } *span++ = rgba8(color[Order::R], color[Order::G], color[Order::B], color[3]); ++x; } while(--len); } private: const rendering_buffer* m_source_image; }; typedef pixfmt_alpha_blend_rgb_packed my_pixfmt_rgb555_pre; //----pixfmt_rgb555_pre typedef pixfmt_alpha_blend_rgb_packed my_pixfmt_rgb555; //----pixfmt_rgb555_pre } typedef PixFormatSetDeclaration > T_AGG_PF_RGB555; typedef PixFormatSetDeclaration > T_AGG_PF_RGBA; class AggDrawTarget { public: AggDrawTarget() : empty(true) { } protected: void dirty() { empty = false; } void undirty() { empty = true; } public: bool empty; virtual void clear() = 0; virtual agg::rendering_buffer & buf() = 0; //returns an image for this target. you must provide the pixel type, but if it is wrong, //then you have just created trouble for yourself AGG2D_IMAGE_TEMPLATE TIMAGE image() { return TIMAGE(buf()); } // Setup virtual void attach(unsigned char* buf, unsigned width, unsigned height, int stride) = 0; // virtual void attach(Agg2DBase::Image& img) {attach(img);}; virtual void clipBox(double x1, double y1, double x2, double y2) = 0; virtual Agg2DBase::RectD clipBox() const = 0; virtual void clearAll(AggColor c) = 0; virtual void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual void clearClipBox(AggColor c) = 0; virtual void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; // virtual unsigned width() const { return Agg2DBase::m_rbuf.width(); } // virtual unsigned height() const { return Agg2DBase::m_rbuf.height(); } // Conversions virtual void worldToScreen(double& x, double& y) const = 0; virtual void screenToWorld(double& x, double& y) const = 0; virtual double worldToScreen(double scalar) const = 0; virtual double screenToWorld(double scalar) const = 0; virtual void alignPoint(double& x, double& y) const = 0; virtual bool inBox(double worldX, double worldY) const = 0; // General Attributes virtual void blendMode(Agg2DBase::BlendMode m) = 0; virtual Agg2DBase::BlendMode blendMode() = 0; virtual void imageBlendMode(Agg2DBase::BlendMode m) = 0; virtual Agg2DBase::BlendMode imageBlendMode() = 0; virtual void imageBlendColor(AggColor c) = 0; virtual void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual AggColor imageBlendColor() = 0; virtual void masterAlpha(double a) = 0; virtual double masterAlpha() = 0; virtual void antiAliasGamma(double g) = 0; virtual double antiAliasGamma() = 0; // virtual void font(const agg::int8u* font) { m_font = font; } // const agg::int8u* font() { return m_font; } virtual void fillColor(AggColor c) = 0; virtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual void noFill() = 0; virtual void lineColor(AggColor c) = 0; virtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual void noLine() = 0; virtual void transformImage(const Agg2DBase::Image &img, double dstX1, double dstY1, double dstX2, double dstY2) = 0; //virtual void transformImage(const Agg2DBase::Image &img, double dstX1, double dstY1, double dstX2, double dstY2) = 0; virtual AggColor fillColor() = 0; virtual AggColor lineColor() = 0; virtual void fillLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void lineLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) = 0; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) = 0; virtual void fillRadialGradient(double x, double y, double r) = 0; virtual void lineRadialGradient(double x, double y, double r) = 0; virtual void lineWidth(double w) = 0; virtual double lineWidth() = 0; virtual void lineCap(Agg2DBase::LineCap cap) = 0; virtual Agg2DBase::LineCap lineCap() = 0; virtual void lineJoin(Agg2DBase::LineJoin join) = 0; virtual Agg2DBase::LineJoin lineJoin() = 0; virtual void fillEvenOdd(bool evenOddFlag) = 0; virtual bool fillEvenOdd() = 0; // Transformations virtual Agg2DBase::Transformations transformations() = 0; virtual void transformations(const Agg2DBase::Transformations& tr) = 0; virtual const Agg2DBase::Affine& affine() = 0; // virtual void affine(const Agg2DBase::Affine&) = 0; virtual void resetTransformations() = 0; virtual void matrix(const Agg2DBase::Affine& tr) = 0; virtual void matrix(const Agg2DBase::Transformations& tr) = 0; virtual void rotate(double angle) = 0; virtual void rotate(double angle, double cx, double cy) = 0; virtual void scale(double s) = 0; virtual void scale(double sx, double sy) = 0; virtual void skew(double sx, double sy) = 0; virtual void translate(double x, double y) = 0; virtual void parallelogram(double x1, double y1, double x2, double y2, const double* para) = 0; virtual void viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, Agg2DBase::ViewportOption opt=Agg2DBase::XMidYMid, Agg2DBase::WindowFitLogic fl = Agg2DBase::WindowFitLogic_meet) = 0; // Basic Shapes virtual void line(double x1, double y1, double x2, double y2) = 0; virtual void triangle(double x1, double y1, double x2, double y2, double x3, double y3) = 0; virtual void rectangle(double x1, double y1, double x2, double y2) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double r) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double rxBottom, double ryBottom, double rxTop, double ryTop) = 0; virtual void ellipse(double cx, double cy, double rx, double ry) = 0; virtual void arc(double cx, double cy, double rx, double ry, double start, double sweep) = 0; virtual void star(double cx, double cy, double r1, double r2, double startAngle, int numRays) = 0; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3) = 0; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) = 0; virtual void polygon(double* xy, int numPoints) = 0; virtual void polyline(double* xy, int numPoints) = 0; // Path commands virtual void resetPath() = 0; virtual void moveTo(double x, double y)= 0; virtual void moveRel(double dx, double dy) = 0; virtual void lineTo(double x, double y) = 0; virtual void lineRel(double dx, double dy) = 0; virtual void horLineTo(double x) = 0; virtual void horLineRel(double dx) = 0; virtual void verLineTo(double y) = 0; virtual void verLineRel(double dy) = 0; virtual void arcTo(double rx, double ry,double angle, bool largeArcFlag,bool sweepFlag,double x, double y) = 0; virtual void arcRel(double rx, double ry,double angle, bool largeArcFlag,bool sweepFlag,double dx, double dy) = 0; virtual void quadricCurveTo(double xCtrl, double yCtrl,double xTo, double yTo) = 0; virtual void quadricCurveRel(double dxCtrl, double dyCtrl,double dxTo, double dyTo) = 0; virtual void quadricCurveTo(double xTo, double yTo) = 0; virtual void quadricCurveRel(double dxTo, double dyTo) = 0; virtual void cubicCurveTo(double xCtrl1, double yCtrl1,double xCtrl2, double yCtrl2,double xTo, double yTo) = 0; virtual void cubicCurveRel(double dxCtrl1, double dyCtrl1,double dxCtrl2, double dyCtrl2,double dxTo, double dyTo) = 0; virtual void cubicCurveTo(double xCtrl2, double yCtrl2,double xTo, double yTo) = 0; virtual void cubicCurveRel(double xCtrl2, double yCtrl2,double xTo, double yTo) = 0; virtual void addEllipse(double cx, double cy, double rx, double ry, Agg2DBase::Direction dir) = 0; virtual void closePolygon() = 0; virtual void drawPath(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) = 0; // virtual void drawPathNoTransform(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) = 0; // Image Transformations virtual void imageFilter(Agg2DBase::ImageFilter f) = 0; virtual Agg2DBase::ImageFilter imageFilter() = 0; virtual void imageResample(Agg2DBase::ImageResample f) = 0; virtual Agg2DBase::ImageResample imageResample() = 0; static const agg::int8u* lookupFont(const std::string& name); virtual void setFont(const std::string& name) = 0; virtual void renderText(double dstX, double dstY, const std::string& str) = 0; virtual void renderTextDropshadowed(double dstX, double dstY, const std::string& str) { AggColor lineColorOld = lineColor(); if(lineColorOld.r+lineColorOld.g+lineColorOld.b<192) lineColor(255-lineColorOld.r,255-lineColorOld.g,255-lineColorOld.b); else lineColor(0,0,0); renderText(dstX-1,dstY-1,str); renderText(dstX,dstY-1,str); renderText(dstX+1,dstY-1,str); renderText(dstX-1,dstY,str); renderText(dstX+1,dstY,str); renderText(dstX-1,dstY+1,str); renderText(dstX,dstY+1,str); renderText(dstX+1,dstY+1,str); lineColor(lineColorOld); renderText(dstX,dstY,str); } // Auxiliary virtual double pi() { return agg::pi; } virtual double deg2Rad(double v) { return v * agg::pi / 180.0; } virtual double rad2Deg(double v) { return v * 180.0 / agg::pi; } }; template class AggDrawTargetImplementation : public AggDrawTarget, public Agg2D { public: typedef typename PixFormatSet::PixFormat pixfmt; typedef typename pixfmt::color_type color_type; typedef Agg2D BASE; AggDrawTargetImplementation(agg::int8u* buf, int width, int height, int stride) { BASE::attach(buf,width,height,stride); BASE::viewport(0, 0, width-1, height-1, 0, 0, width-1, height-1, TAGG2D::Anisotropic); } virtual void clear() { if(!empty) { BASE::clearAll(0,0,0,0); undirty(); } } virtual agg::rendering_buffer & buf() { dirty(); return BASE::buf(); } // buf() might not always require calling dirty() typename BASE::MyImage image() { return BASE::MyImage(buf()); } // Setup virtual void attach(unsigned char* buf, unsigned width, unsigned height, int stride) {BASE::attach(buf, width, height, stride);}; // virtual void attach(Agg2DBase::Image& img) {attach(img);}; virtual void clipBox(double x1, double y1, double x2, double y2) { BASE::clipBox(x1,y1,x2,y2); } virtual Agg2DBase::RectD clipBox() const {return BASE::clipBox();}; virtual void clearAll(AggColor c) {BASE::clearAll(c);}; virtual void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::clearAll(r, g, b, a);}; virtual void clearClipBox(AggColor c) {BASE::clearClipBox(c);}; virtual void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::clearClipBox(r, g, b, a);}; // virtual unsigned width() const { return Agg2DBase::m_rbuf.width(); } // virtual unsigned height() const { return Agg2DBase::m_rbuf.height(); } // Conversions virtual void worldToScreen(double& x, double& y) const {BASE::worldToScreen(x, y);}; virtual void screenToWorld(double& x, double& y) const {BASE::screenToWorld(x, y);}; virtual double worldToScreen(double scalar) const {return BASE::worldToScreen(scalar);}; virtual double screenToWorld(double scalar) const {return BASE::screenToWorld(scalar);}; virtual void alignPoint(double& x, double& y) const {BASE::alignPoint(x, y);}; virtual bool inBox(double worldX, double worldY) const {return BASE::inBox(worldX, worldY);}; // General Attributes virtual void blendMode(Agg2DBase::BlendMode m) {BASE::blendMode(m);}; virtual Agg2DBase::BlendMode blendMode() {return BASE::blendMode();}; virtual void imageBlendMode(Agg2DBase::BlendMode m) {BASE::imageBlendMode(m);}; virtual Agg2DBase::BlendMode imageBlendMode() {return BASE::imageBlendMode();}; virtual void imageBlendColor(AggColor c) {BASE::imageBlendColor(c);}; virtual void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::imageBlendColor(r, g, b, a);}; virtual AggColor imageBlendColor() {return BASE::imageBlendColor();}; virtual void masterAlpha(double a) {BASE::masterAlpha(a);}; virtual double masterAlpha() {return BASE::masterAlpha();}; virtual void antiAliasGamma(double g) {BASE::antiAliasGamma(g);}; virtual double antiAliasGamma() {return BASE::antiAliasGamma();}; // virtual void font(const agg::int8u* font) { m_font = font; } // const agg::int8u* font() { return m_font; } virtual void fillColor(AggColor c) {BASE::fillColor(c);}; virtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::fillColor(r,g,b,a);}; virtual void noFill() {BASE::noFill();}; virtual void lineColor(AggColor c) {BASE::lineColor(c);}; virtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::lineColor(r,g,b,a);}; virtual void noLine() {BASE::noLine();}; virtual AggColor fillColor() {return BASE::fillColor();}; virtual AggColor lineColor() {return BASE::lineColor();}; virtual void fillLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::fillLinearGradient(x1, y1, x2, y2, c1, c2, profile);}; virtual void lineLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::lineLinearGradient(x1, y1, x2, y2, c1, c2, profile);}; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::fillRadialGradient(x, y, r, c1, c2, profile);}; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::lineRadialGradient(x, y, r, c1, c2, profile);}; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) {dirty(); BASE::fillRadialGradient(x, y, r, c1, c2, c3);}; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) {dirty(); BASE::lineRadialGradient(x, y, r, c1, c2, c3);}; virtual void fillRadialGradient(double x, double y, double r) {dirty(); BASE::fillRadialGradient(x, y, r);}; virtual void lineRadialGradient(double x, double y, double r) {dirty(); BASE::lineRadialGradient(x, y, r);}; virtual void lineWidth(double w) {BASE::lineWidth(w);}; virtual double lineWidth() {return BASE::lineWidth();}; virtual void lineCap(Agg2DBase::LineCap cap) {BASE::lineCap(cap);}; virtual Agg2DBase::LineCap lineCap() {return BASE::lineCap();}; virtual void lineJoin(Agg2DBase::LineJoin join) {BASE::lineJoin(join);}; virtual Agg2DBase::LineJoin lineJoin() {return BASE::lineJoin();}; virtual void fillEvenOdd(bool evenOddFlag) {BASE::fillEvenOdd(evenOddFlag);}; virtual bool fillEvenOdd() {return BASE::fillEvenOdd();}; virtual void transformImage(const Agg2DBase::Image& img, double dstX1, double dstY1, double dstX2, double dstY2) { BASE::transformImage(img,dstX1,dstY1,dstX2,dstY2); } //virtual void transformImage(const Agg2DBase::Image &img, double dstX1, double dstY1, double dstX2, double dstY2) { BASE::transformImage(img,dstX1,dstY1,dstX2,dstY2); } // Transformations virtual Agg2DBase::Transformations transformations() {return BASE::transformations();}; virtual void transformations(const Agg2DBase::Transformations& tr) {BASE::transformations(tr);}; virtual const Agg2DBase::Affine& affine() {return BASE::affine();}; // virtual void affine(const Agg2DBase::Affine&) {BASE::affine();}; virtual void resetTransformations() {BASE::resetTransformations();}; virtual void matrix(const Agg2DBase::Affine& tr) {BASE::matrix(tr);}; virtual void matrix(const Agg2DBase::Transformations& tr) {BASE::matrix(tr);}; virtual void rotate(double angle) {BASE::rotate(angle);}; virtual void rotate(double angle, double cx, double cy) {BASE::rotate(angle, cx, cy);}; virtual void scale(double s) {BASE::scale(s);}; virtual void scale(double sx, double sy) {BASE::scale(sx, sy);}; virtual void skew(double sx, double sy) {BASE::skew(sx, sy);}; virtual void translate(double x, double y) {BASE::translate(x, y);}; virtual void parallelogram(double x1, double y1, double x2, double y2, const double* para) {BASE::parallelogram(x1, y1, x2, y2, para);}; virtual void viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, Agg2DBase::ViewportOption opt=Agg2DBase::XMidYMid, Agg2DBase::WindowFitLogic fl = Agg2DBase::WindowFitLogic_meet) {BASE::viewport(worldX1, worldY1, worldX2, worldY2, screenX1, screenY1, screenX2, screenY2, opt, fl);}; // Basic Shapes virtual void line(double x1, double y1, double x2, double y2) {dirty(); BASE::line(x1, y1, x2, y2);}; virtual void triangle(double x1, double y1, double x2, double y2, double x3, double y3) {dirty(); BASE::triangle(x1, y1, x2, y2, x3, y3);}; virtual void rectangle(double x1, double y1, double x2, double y2) {dirty(); BASE::rectangle(x1, y1, x2, y2);}; virtual void roundedRect(double x1, double y1, double x2, double y2, double r) { dirty(); BASE::roundedRect(x1,y1,x2,y2,r); } virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx,ry); } virtual void roundedRect(double x1, double y1, double x2, double y2,double rx_bottom, double ry_bottom,double rx_top,double ry_top) { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx_bottom,ry_bottom,rx_top,ry_top); } virtual void ellipse(double cx, double cy, double rx, double ry) {dirty(); BASE::ellipse(cx, cy, rx, ry);} virtual void arc(double cx, double cy, double rx, double ry, double start, double sweep) {dirty(); BASE::arc(cx, cy, rx, ry, start, sweep);}; virtual void star(double cx, double cy, double r1, double r2, double startAngle, int numRays) {dirty(); BASE::star(cx, cy, r1, r2, startAngle, numRays);}; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3) {dirty(); BASE::curve(x1, y1, x2, y2, x3, y3);}; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {dirty(); BASE::curve(x1, y1, x2, y2, x3, y3, x4, y4);}; virtual void polygon(double* xy, int numPoints) {dirty(); BASE::polygon(xy, numPoints);}; virtual void polyline(double* xy, int numPoints) {dirty(); BASE::polyline(xy, numPoints);}; virtual void setFont(const std::string& name) { BASE::font(lookupFont(name)); } virtual void renderText(double dstX, double dstY, const std::string& str) { dirty(); int height = BASE::font()[0]; int base = BASE::font()[1]; int offset = height-base*2; BASE::renderText(dstX, dstY + offset, str); } // Path commands virtual void resetPath() {BASE::resetPath();}; virtual void moveTo(double x, double y) {BASE::moveTo(x, y);} virtual void moveRel(double dx, double dy) {BASE::moveRel(dx,dy);}; virtual void lineTo(double x, double y) {BASE::lineTo(x, y);}; virtual void lineRel(double dx, double dy) {BASE::lineRel(dx, dy);}; virtual void horLineTo(double x) {BASE::horLineTo(x);}; virtual void horLineRel(double dx) {BASE::horLineRel(dx);}; virtual void verLineTo(double y) {BASE::verLineTo(y);}; virtual void verLineRel(double dy) {BASE::verLineRel(dy);}; virtual void arcTo(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double x, double y) {BASE::arcTo(rx, ry, angle, largeArcFlag, sweepFlag, x, y);}; virtual void arcRel(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double dx, double dy) {BASE::arcRel(rx, ry, angle, largeArcFlag, sweepFlag, dx, dy);}; virtual void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo) {BASE::quadricCurveTo(xCtrl, yCtrl, xTo, yTo);}; virtual void quadricCurveRel(double dxCtrl, double dyCtrl, double dxTo, double dyTo) {BASE::quadricCurveRel(dxCtrl, dyCtrl, dxTo, dyTo);}; virtual void quadricCurveTo(double xTo, double yTo) {BASE::quadricCurveTo(xTo, yTo);}; virtual void quadricCurveRel(double dxTo, double dyTo) {BASE::quadricCurveRel(dxTo, dyTo);}; virtual void cubicCurveTo(double xCtrl1, double yCtrl1, double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveTo(xCtrl1, yCtrl1, xCtrl2, yCtrl2, xTo, yTo);}; virtual void cubicCurveRel(double dxCtrl1, double dyCtrl1, double dxCtrl2, double dyCtrl2, double dxTo, double dyTo) {BASE::cubicCurveRel(dxCtrl1, dyCtrl1, dxCtrl2, dyCtrl2, dxTo, dyTo);}; virtual void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveTo(xCtrl2, yCtrl2, xTo, yTo);}; virtual void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveRel(xCtrl2, yCtrl2, xTo, yTo);}; virtual void addEllipse(double cx, double cy, double rx, double ry, Agg2DBase::Direction dir) {BASE::addEllipse(cx, cy, rx, ry, dir);}; virtual void closePolygon() {BASE::closePolygon();}; virtual void drawPath(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) {dirty(); BASE::drawPath(flag);}; // virtual void drawPathNoTransform(DrawPathFlag flag = FillAndStroke) {dirty(); BASE::drawPathNoTransform(flag);}; // Image Transformations virtual void imageFilter(Agg2DBase::ImageFilter f) {BASE::imageFilter(f);}; virtual Agg2DBase::ImageFilter imageFilter() {return BASE::imageFilter();}; virtual void imageResample(Agg2DBase::ImageResample f) {BASE::imageResample(f);}; virtual Agg2DBase::ImageResample imageResample() {return BASE::imageResample();}; // Auxiliary virtual double pi() { return agg::pi; } virtual double deg2Rad(double v) { return v * agg::pi / 180.0; } virtual double rad2Deg(double v) { return v * 180.0 / agg::pi; } }; //the main aggdraw targets for different pixel formats typedef AggDrawTargetImplementation T_AGG_RGB555; typedef AggDrawTargetImplementation T_AGG_RGBA; class AggDraw { public: AggDraw() : target(NULL) {} AggDrawTarget *target; }; enum AggTarget { AggTarget_Screen = 0, AggTarget_Hud = 1, AggTarget_Lua = 2, }; //specialized instance for desmume; should eventually move to another file class AggDraw_Desmume : public AggDraw { public: void setTarget(AggTarget newTarget); //void composite(void* dest); AggDrawTarget *screen, *hud, *lua; }; extern AggDraw_Desmume aggDraw; void Agg_init(); struct font_type { const agg::int8u* font; const char* name; }; extern font_type fonts_list[]; extern int font_Nums; #endif desmume-0.9.11/src/slot2.h0000755000000000000000000001170512467662066013770 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef __SLOT2_H__ #define __SLOT2_H__ #include #include "types.h" #define GBA_SRAM_FILE_EXT "sav" class EMUFILE; class Slot2Info { public: virtual const char* name() const = 0; virtual const char* descr() const = 0; virtual const u8 id() const = 0; }; class Slot2InfoSimple : public Slot2Info { public: Slot2InfoSimple(const char* _name, const char* _descr, const u8 _id) : mName(_name) , mDescr(_descr) , mID(_id) { } virtual const char* name() const { return mName; } virtual const char* descr() const { return mDescr; } virtual const u8 id() const { return mID; } private: const char* mName, *mDescr; const u8 mID; }; class ISlot2Interface { public: //called to get info about device (description) virtual Slot2Info const* info() = 0; //called once when the emulator starts up, or when the device springs into existence virtual bool init() { return true; } //called when the emulator connects the device virtual void connect() { } //called when the emulator disconnects the device virtual void disconnect() { } //called when the emulator shuts down, or when the device disappears from existence virtual void shutdown() { } virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) {}; virtual void writeWord(u8 PROCNUM, u32 addr, u16 val) {}; virtual void writeLong(u8 PROCNUM, u32 addr, u32 val) {}; virtual u8 readByte(u8 PROCNUM, u32 addr) { return 0xFF; }; virtual u16 readWord(u8 PROCNUM, u32 addr) { return 0xFFFF; }; virtual u32 readLong(u8 PROCNUM, u32 addr) { return 0xFFFFFFFF; }; virtual void savestate(EMUFILE* os) {} virtual void loadstate(EMUFILE* is) {} }; typedef ISlot2Interface* TISlot2InterfaceConstructor(); enum NDS_SLOT2_TYPE { NDS_SLOT2_NONE, // 0xFF NDS_SLOT2_AUTO, // 0xFE - Auto-select NDS_SLOT2_CFLASH, // 0x01 - Compact flash NDS_SLOT2_RUMBLEPAK, // 0x02 - RumblePak NDS_SLOT2_GBACART, // 0x03 - GBA cartrindge in slot NDS_SLOT2_GUITARGRIP, // 0x04 - Guitar Grip NDS_SLOT2_EXPMEMORY, // 0x05 - Memory Expansion Pak NDS_SLOT2_EASYPIANO, // 0x06 - Easy Piano NDS_SLOT2_PADDLE, // 0x07 - Arkanoids DS paddle NDS_SLOT2_PASSME, // 0x08 - PassME/Homebrew NDS_SLOT2_COUNT // use for counter addons - MUST TO BE LAST!!! }; extern ISlot2Interface* slot2_device; //the current slot2 device instance extern ISlot2Interface* slot2_List[NDS_SLOT2_COUNT]; extern NDS_SLOT2_TYPE slot2_selected_type; void slot2_Init(); bool slot2_Connect(); void slot2_Disconnect(); void slot2_Shutdown(); void slot2_Savestate(EMUFILE* os); void slot2_Loadstate(EMUFILE* is); //just disconnects and reconnects the device. ideally, the disconnection and connection would be called with sensible timing void slot2_Reset(); //change the current device bool slot2_Change(NDS_SLOT2_TYPE type); void slot2_setDeviceByType(NDS_SLOT2_TYPE theType); bool slot2_getTypeByID(u8 ID, NDS_SLOT2_TYPE &type); //change the current device by ID bool slot2_ChangeByID(u8 ID); //check on the current device NDS_SLOT2_TYPE slot2_GetCurrentType(); NDS_SLOT2_TYPE slot2_GetSelectedType(); //determine which device type is appropriate for the loaded ROM NDS_SLOT2_TYPE slot2_DetermineType(); NDS_SLOT2_TYPE slot2_DetermineTypeByGameCode(const char *theGameCode); template bool slot2_write(u32 addr, T val); template bool slot2_read(u32 addr, T &val); // ================================================================================= extern std::string GBACartridge_RomPath; extern std::string GBACartridge_SRAMPath; extern void (*FeedbackON)(bool enable); // feedback on/off enum ADDON_CFLASH_MODE { ADDON_CFLASH_MODE_Path, ADDON_CFLASH_MODE_File, ADDON_CFLASH_MODE_RomPath }; extern ADDON_CFLASH_MODE CFlash_Mode; extern std::string CFlash_Path; inline bool CFlash_IsUsingPath() { return CFlash_Mode==ADDON_CFLASH_MODE_Path || CFlash_Mode==ADDON_CFLASH_MODE_RomPath; } u16 Paddle_GetValue(); void Paddle_SetValue(u16 theValue); extern void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue); // Guitar grip keys extern void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic); //piano keys #endif //__SLOT_H__ desmume-0.9.11/src/readwrite.cpp0000755000000000000000000000515712467662066015252 0ustar rootroot/* Copyright (C) 2006-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "readwrite.h" #include "emufile.h" //well. just for the sake of consistency int write8le(u8 b, EMUFILE*os) { os->fwrite((char*)&b,1); return 1; } //well. just for the sake of consistency int read8le(u8 *Bufo, EMUFILE*is) { if(is->_fread((char*)Bufo,1) != 1) return 0; return 1; } ///writes a little endian 16bit value to the specified file int write16le(u16 b, EMUFILE *fp) { u8 s[2]; s[0]=(u8)b; s[1]=(u8)(b>>8); fp->fwrite(s,2); return 2; } ///writes a little endian 32bit value to the specified file int write32le(u32 b, EMUFILE *fp) { u8 s[4]; s[0]=(u8)b; s[1]=(u8)(b>>8); s[2]=(u8)(b>>16); s[3]=(u8)(b>>24); fp->fwrite(s,4); return 4; } void writebool(bool b, EMUFILE* os) { write32le(b?1:0,os); } int write64le(u64 b, EMUFILE* os) { u8 s[8]; s[0]=(u8)b; s[1]=(u8)(b>>8); s[2]=(u8)(b>>16); s[3]=(u8)(b>>24); s[4]=(u8)(b>>32); s[5]=(u8)(b>>40); s[6]=(u8)(b>>48); s[7]=(u8)(b>>56); os->fwrite((char*)&s,8); return 8; } int read32le(u32 *Bufo, EMUFILE *fp) { u32 buf = 0; if(fp->_fread(&buf,4)<4) return 0; *Bufo = LE_TO_LOCAL_32(buf); return 1; } int read16le(u16 *Bufo, EMUFILE *is) { u16 buf; if(is->_fread((char*)&buf,2) != 2) return 0; *Bufo = LE_TO_LOCAL_16(buf); return 1; } int read64le(u64 *Bufo, EMUFILE *is) { u64 buf; if(is->_fread((char*)&buf,8) != 8) return 0; *Bufo = LE_TO_LOCAL_64(buf); return 1; } static int read32le(u32 *Bufo, std::istream *is) { u32 buf; if(is->read((char*)&buf,4).gcount() != 4) return 0; *Bufo = LE_TO_LOCAL_32(buf); return 1; } int readbool(bool *b, EMUFILE* is) { u32 temp; int ret = read32le(&temp,is); *b = temp!=0; return ret; } int readbuffer(std::vector &vec, EMUFILE* is) { u32 size; if(read32le(&size,is) != 1) return 0; vec.resize(size); if(size>0) is->fread((char*)&vec[0],size); return 1; } int writebuffer(std::vector& vec, EMUFILE* os) { u32 size = vec.size(); write32le(size,os); if(size>0) os->fwrite((char*)&vec[0],size); return 1; } desmume-0.9.11/src/OGLRender_3_2.cpp0000755000000000000000000004466512467662066015517 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "OGLRender_3_2.h" #include #include #include "debug.h" #include "gfx3d.h" #include "NDSSystem.h" #include "texcache.h" //------------------------------------------------------------ // Basic Functions OGLEXT(PFNGLGETSTRINGIPROC, glGetStringi) // Core in v3.0 // Shaders OGLEXT(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation) // Core in v3.0 // FBO OGLEXT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) // Core in v3.0 OGLEXT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) // Core in v3.0 OGLEXT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) // Core in v3.0 OGLEXT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) // Core in v3.0 OGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus) // Core in v3.0 OGLEXT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) // Core in v3.0 OGLEXT(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) // Core in v3.0 OGLEXT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) // Core in v3.0 OGLEXT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer) // Core in v3.0 OGLEXT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage) // Core in v3.0 OGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) // Core in v3.0 OGLEXT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers) // Core in v3.0 void OGLLoadEntryPoints_3_2() { // Basic Functions INITOGLEXT(PFNGLGETSTRINGIPROC, glGetStringi) // Shaders INITOGLEXT(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation) // FBO INITOGLEXT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) // Promote to core version INITOGLEXT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) // Promote to core version INITOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) // Promote to core version INITOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) // Promote to core version INITOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus) // Promote to core version INITOGLEXT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) // Promote to core version INITOGLEXT(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) // Promote to core version INITOGLEXT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) // Promote to core version INITOGLEXT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer) // Promote to core version INITOGLEXT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage) // Promote to core version INITOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) // Promote to core version INITOGLEXT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers) // Promote to core version } // Vertex Shader GLSL 1.50 static const char *vertexShader_150 = {"\ #version 150 \n\ \n\ in vec4 inPosition; \n\ in vec2 inTexCoord0; \n\ in vec3 inColor; \n\ \n\ uniform float polyAlpha; \n\ uniform vec2 texScale; \n\ \n\ out vec4 vtxPosition; \n\ out vec2 vtxTexCoord; \n\ out vec4 vtxColor; \n\ \n\ void main() \n\ { \n\ mat2 texScaleMtx = mat2( vec2(texScale.x, 0.0), \n\ vec2( 0.0, texScale.y)); \n\ \n\ vtxPosition = inPosition; \n\ vtxTexCoord = texScaleMtx * inTexCoord0; \n\ vtxColor = vec4(inColor * 4.0, polyAlpha); \n\ \n\ gl_Position = vtxPosition; \n\ } \n\ "}; // Fragment Shader GLSL 1.50 static const char *fragmentShader_150 = {"\ #version 150 \n\ \n\ in vec4 vtxPosition; \n\ in vec2 vtxTexCoord; \n\ in vec4 vtxColor; \n\ \n\ uniform sampler2D texMainRender; \n\ uniform sampler1D texToonTable; \n\ \n\ uniform int stateToonShadingMode; \n\ uniform bool stateEnableAlphaTest; \n\ uniform bool stateUseWDepth; \n\ uniform float stateAlphaTestRef; \n\ \n\ uniform int polyMode; \n\ uniform int polyID; \n\ \n\ uniform bool polyEnableTexture; \n\ \n\ out vec4 outFragColor; \n\ \n\ void main() \n\ { \n\ vec4 mainTexColor = (polyEnableTexture) ? texture(texMainRender, vtxTexCoord) : vec4(1.0, 1.0, 1.0, 1.0); \n\ vec4 tempFragColor = mainTexColor; \n\ \n\ if(polyMode == 0) \n\ { \n\ tempFragColor = vtxColor * mainTexColor; \n\ } \n\ else if(polyMode == 1) \n\ { \n\ tempFragColor.rgb = (polyEnableTexture) ? (mainTexColor.rgb * mainTexColor.a) + (vtxColor.rgb * (1.0 - mainTexColor.a)) : vtxColor.rgb; \n\ tempFragColor.a = vtxColor.a; \n\ } \n\ else if(polyMode == 2) \n\ { \n\ vec3 toonColor = vec3(texture(texToonTable, vtxColor.r).rgb); \n\ tempFragColor.rgb = (stateToonShadingMode == 0) ? mainTexColor.rgb * toonColor.rgb : min((mainTexColor.rgb * vtxColor.rgb) + toonColor.rgb, 1.0); \n\ tempFragColor.a = mainTexColor.a * vtxColor.a; \n\ } \n\ else if(polyMode == 3) \n\ { \n\ if (polyID != 0) \n\ { \n\ tempFragColor = vtxColor; \n\ } \n\ } \n\ \n\ if (tempFragColor.a == 0.0 || (stateEnableAlphaTest && tempFragColor.a < stateAlphaTestRef)) \n\ { \n\ discard; \n\ } \n\ \n\ float vertW = (vtxPosition.w == 0.0) ? 0.00000001 : vtxPosition.w; \n\ gl_FragDepth = (stateUseWDepth) ? vtxPosition.w/4096.0 : clamp((vtxPosition.z/vertW) * 0.5 + 0.5, 0.0, 1.0); \n\ outFragColor = tempFragColor; \n\ } \n\ "}; void OGLCreateRenderer_3_2(OpenGLRenderer **rendererPtr) { if (IsVersionSupported(3, 2, 0)) { *rendererPtr = new OpenGLRenderer_3_2; (*rendererPtr)->SetVersion(3, 2, 0); } } OpenGLRenderer_3_2::~OpenGLRenderer_3_2() { glFinish(); DestroyVAOs(); DestroyFBOs(); DestroyMultisampledFBO(); } Render3DError OpenGLRenderer_3_2::InitExtensions() { Render3DError error = OGLERROR_NOERR; OGLRenderRef &OGLRef = *this->ref; // Get OpenGL extensions std::set oglExtensionSet; this->GetExtensionSet(&oglExtensionSet); // Initialize OpenGL this->InitTables(); // Load and create shaders. Return on any error, since v3.2 Core Profile makes shaders mandatory. this->isShaderSupported = true; std::string vertexShaderProgram; std::string fragmentShaderProgram; error = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; return error; } error = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; return error; } this->CreateToonTable(); this->isVBOSupported = true; this->CreateVBOs(); this->isPBOSupported = true; this->CreatePBOs(); this->isVAOSupported = true; this->CreateVAOs(); // Load and create FBOs. Return on any error, since v3.2 Core Profile makes FBOs mandatory. this->isFBOSupported = true; error = this->CreateFBOs(); if (error != OGLERROR_NOERR) { OGLRef.fboRenderID = 0; this->isFBOSupported = false; return error; } this->isMultisampledFBOSupported = true; error = this->CreateMultisampledFBO(); if (error != OGLERROR_NOERR) { OGLRef.selectedRenderingFBO = 0; this->isMultisampledFBOSupported = false; if (error == OGLERROR_FBO_CREATE_ERROR) { // Return on OGLERROR_FBO_CREATE_ERROR, since a v3.0 driver should be able to // support FBOs. return error; } } this->InitTextures(); this->InitFinalRenderStates(&oglExtensionSet); // This must be done last return OGLERROR_NOERR; } Render3DError OpenGLRenderer_3_2::CreateFBOs() { OGLRenderRef &OGLRef = *this->ref; // Set up FBO render targets glGenTextures(1, &OGLRef.texClearImageColorID); glGenTextures(1, &OGLRef.texClearImageDepthStencilID); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); glBindTexture(GL_TEXTURE_2D, 0); // Set up FBOs glGenFramebuffers(1, &OGLRef.fboClearImageID); glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboClearImageID); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, OGLRef.texClearImageColorID, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { INFO("OpenGL: Failed to created FBOs. Some emulation features will be disabled.\n"); glBindFramebuffer(GL_FRAMEBUFFER, 0); glDeleteFramebuffers(1, &OGLRef.fboClearImageID); glDeleteTextures(1, &OGLRef.texClearImageColorID); glDeleteTextures(1, &OGLRef.texClearImageDepthStencilID); return OGLERROR_FBO_CREATE_ERROR; } // Set up final output FBO glGenRenderbuffers(1, &OGLRef.rboFragColorID); glGenRenderbuffers(1, &OGLRef.rboFragDepthStencilID); glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboFragColorID); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT); glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboFragDepthStencilID); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT); glGenFramebuffers(1, &OGLRef.fboRenderID); glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, OGLRef.rboFragColorID); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, OGLRef.rboFragDepthStencilID); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { INFO("OpenGL: Failed to created FBOs. Some emulation features will be disabled.\n"); glBindFramebuffer(GL_FRAMEBUFFER, 0); glDeleteFramebuffers(1, &OGLRef.fboClearImageID); glDeleteTextures(1, &OGLRef.texClearImageColorID); glDeleteTextures(1, &OGLRef.texClearImageDepthStencilID); glDeleteFramebuffers(1, &OGLRef.fboRenderID); glDeleteRenderbuffers(1, &OGLRef.rboFragColorID); glDeleteRenderbuffers(1, &OGLRef.rboFragDepthStencilID); OGLRef.fboRenderID = 0; return OGLERROR_FBO_CREATE_ERROR; } glReadBuffer(GL_COLOR_ATTACHMENT0); INFO("OpenGL: Successfully created FBOs.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_3_2::DestroyFBOs() { if (!this->isFBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindFramebuffer(GL_FRAMEBUFFER, 0); glDeleteFramebuffers(1, &OGLRef.fboClearImageID); glDeleteTextures(1, &OGLRef.texClearImageColorID); glDeleteTextures(1, &OGLRef.texClearImageDepthStencilID); glDeleteFramebuffers(1, &OGLRef.fboRenderID); glDeleteRenderbuffers(1, &OGLRef.rboFragColorID); glDeleteRenderbuffers(1, &OGLRef.rboFragDepthStencilID); this->isFBOSupported = false; } Render3DError OpenGLRenderer_3_2::CreateMultisampledFBO() { // Check the maximum number of samples that the GPU supports and use that. // Since our target resolution is only 256x192 pixels, using the most samples // possible is the best thing to do. GLint maxSamples = 0; glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); if (maxSamples < 2) { INFO("OpenGL: GPU does not support at least 2x multisampled FBOs. Multisample antialiasing will be disabled.\n"); return OGLERROR_FEATURE_UNSUPPORTED; } else if (maxSamples > OGLRENDER_MAX_MULTISAMPLES) { maxSamples = OGLRENDER_MAX_MULTISAMPLES; } OGLRenderRef &OGLRef = *this->ref; // Set up FBO render targets glGenRenderbuffers(1, &OGLRef.rboMSFragColorID); glGenRenderbuffers(1, &OGLRef.rboMSFragDepthStencilID); glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMSFragColorID); glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamples, GL_RGBA, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT); glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMSFragDepthStencilID); glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamples, GL_DEPTH24_STENCIL8, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT); // Set up multisampled rendering FBO glGenFramebuffers(1, &OGLRef.fboMSIntermediateRenderID); glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboMSIntermediateRenderID); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, OGLRef.rboMSFragColorID); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, OGLRef.rboMSFragDepthStencilID); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { glBindFramebuffer(GL_FRAMEBUFFER, 0); glDeleteFramebuffers(1, &OGLRef.fboMSIntermediateRenderID); glDeleteRenderbuffers(1, &OGLRef.rboMSFragColorID); glDeleteRenderbuffers(1, &OGLRef.rboMSFragDepthStencilID); INFO("OpenGL: Failed to create multisampled FBO. Multisample antialiasing will be disabled.\n"); return OGLERROR_FBO_CREATE_ERROR; } glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID); INFO("OpenGL: Successfully created multisampled FBO.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_3_2::DestroyMultisampledFBO() { if (!this->isMultisampledFBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindFramebuffer(GL_FRAMEBUFFER, 0); glDeleteFramebuffers(1, &OGLRef.fboMSIntermediateRenderID); glDeleteRenderbuffers(1, &OGLRef.rboMSFragColorID); glDeleteRenderbuffers(1, &OGLRef.rboMSFragDepthStencilID); this->isMultisampledFBOSupported = false; } Render3DError OpenGLRenderer_3_2::CreateVAOs() { OGLRenderRef &OGLRef = *this->ref; glGenVertexArrays(1, &OGLRef.vaoMainStatesID); glBindVertexArray(OGLRef.vaoMainStatesID); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); glBindVertexArray(0); return OGLERROR_NOERR; } void OpenGLRenderer_3_2::DestroyVAOs() { if (!this->isVAOSupported) { return; } glBindVertexArray(0); glDeleteVertexArrays(1, &this->ref->vaoMainStatesID); this->isVAOSupported = false; } Render3DError OpenGLRenderer_3_2::LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram) { *outVertexShaderProgram = std::string(vertexShader_150); *outFragmentShaderProgram = std::string(fragmentShader_150); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_3_2::SetupShaderIO() { OGLRenderRef &OGLRef = *this->ref; glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_TexCoord0, "inTexCoord0"); glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Color, "inColor"); glBindFragDataLocation(OGLRef.shaderProgram, 0, "outFragColor"); return OGLERROR_NOERR; } void OpenGLRenderer_3_2::GetExtensionSet(std::set *oglExtensionSet) { GLint extensionCount = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &extensionCount); for (size_t i = 0; i < extensionCount; i++) { std::string extensionName = std::string((const char *)glGetStringi(GL_EXTENSIONS, i)); oglExtensionSet->insert(extensionName); } } Render3DError OpenGLRenderer_3_2::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount) { OGLRenderRef &OGLRef = *this->ref; glBindVertexArray(OGLRef.vaoMainStatesID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_3_2::DisableVertexAttributes() { glBindVertexArray(0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_3_2::SelectRenderingFramebuffer() { OGLRenderRef &OGLRef = *this->ref; static const GLenum drawDirect[1] = {GL_COLOR_ATTACHMENT0}; OGLRef.selectedRenderingFBO = (CommonSettings.GFX3D_Renderer_Multisample) ? OGLRef.fboMSIntermediateRenderID : OGLRef.fboRenderID; glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.selectedRenderingFBO); glDrawBuffers(1, &drawDirect[0]); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_3_2::DownsampleFBO() { OGLRenderRef &OGLRef = *this->ref; if (OGLRef.selectedRenderingFBO != OGLRef.fboMSIntermediateRenderID) { return OGLERROR_NOERR; } glBindFramebuffer(GL_READ_FRAMEBUFFER, OGLRef.selectedRenderingFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, OGLRef.fboRenderID); glBlitFramebuffer(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST); glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_3_2::ClearUsingImage() const { OGLRenderRef &OGLRef = *this->ref; glBindFramebuffer(GL_READ_FRAMEBUFFER, OGLRef.fboClearImageID); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, OGLRef.selectedRenderingFBO); glBlitFramebuffer(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.selectedRenderingFBO); return OGLERROR_NOERR; } desmume-0.9.11/src/wifi.h0000755000000000000000000003721312467662066013665 0ustar rootroot/* Copyright (C) 2007 Tim Seidel Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef WIFI_H #define WIFI_H #include #include #include "types.h" #ifdef EXPERIMENTAL_WIFI_COMM #ifdef HOST_WINDOWS #define WIN32_LEAN_AND_MEAN #endif #include #define HAVE_REMOTE #define WPCAP #define PACKET_SIZE 65535 #define _INC_STDIO #endif #define REG_WIFI_ID 0x000 #define REG_WIFI_MODE 0x004 #define REG_WIFI_WEP 0x006 #define REG_WIFI_TXSTATCNT 0x008 #define REG_WIFI_0A 0x00A #define REG_WIFI_IF 0x010 #define REG_WIFI_IE 0x012 #define REG_WIFI_MAC0 0x018 #define REG_WIFI_MAC1 0x01A #define REG_WIFI_MAC2 0x01C #define REG_WIFI_BSS0 0x020 #define REG_WIFI_BSS1 0x022 #define REG_WIFI_BSS2 0x024 #define REG_WIFI_AID_LOW 0x028 #define REG_WIFI_AID_HIGH 0x02A #define REG_WIFI_RETRYLIMIT 0x02C // 02E - internal #define REG_WIFI_RXCNT 0x030 #define REG_WIFI_WEPCNT 0x032 // 034 - internal #define REG_WIFI_POWER_US 0x036 #define REG_WIFI_POWER_TX 0x038 #define REG_WIFI_POWERSTATE 0x03C #define REG_WIFI_POWERFORCE 0x040 #define REG_WIFI_RANDOM 0x044 #define REG_WIFI_POWER_UNK 0x048 #define REG_WIFI_RXRANGEBEGIN 0x050 #define REG_WIFI_RXRANGEEND 0x052 #define REG_WIFI_RXHWWRITECSR 0x054 #define REG_WIFI_WRITECSRLATCH 0x056 #define REG_WIFI_CIRCBUFRADR 0x058 #define REG_WIFI_RXREADCSR 0x05A #define REG_WIFI_RXBUF_COUNT 0x05C #define REG_WIFI_CIRCBUFREAD 0x060 #define REG_WIFI_CIRCBUFRD_END 0x062 #define REG_WIFI_CIRCBUFRD_SKIP 0x064 #define REG_WIFI_CIRCBUFWADR 0x068 #define REG_WIFI_TXBUFCOUNT 0x06C #define REG_WIFI_CIRCBUFWRITE 0x070 #define REG_WIFI_CIRCBUFWR_END 0x074 #define REG_WIFI_CIRCBUFWR_SKIP 0x076 // 078 - internal #define REG_WIFI_TXBUF_BEACON 0x080 #define REG_WIFI_LISTENCOUNT 0x088 #define REG_WIFI_BEACONPERIOD 0x08C #define REG_WIFI_LISTENINT 0x08E #define REG_WIFI_TXBUF_CMD 0x090 #define REG_WIFI_TXBUF_REPLY1 0x094 #define REG_WIFI_TXBUF_REPLY2 0x098 // 09C - internal #define REG_WIFI_TXBUF_LOC1 0x0A0 #define REG_WIFI_TXBUF_LOC2 0x0A4 #define REG_WIFI_TXBUF_LOC3 0x0A8 #define REG_WIFI_TXREQ_RESET 0x0AC #define REG_WIFI_TXREQ_SET 0x0AE #define REG_WIFI_TXREQ_READ 0x0B0 #define REG_WIFI_TXRESET 0x0B4 #define REG_WIFI_TXBUSY 0x0B6 #define REG_WIFI_TXSTAT 0x0B8 // 0BA - internal #define REG_WIFI_PREAMBLE 0x0BC // 0C0 - ? // 0C4 - ? // 0C8 - internal #define REG_WIFI_RXFILTER 0x0D0 // 0D4 - config // 0D8 - config // 0DA - config #define REG_WIFI_RXFILTER2 0x0E0 #define REG_WIFI_USCOUNTERCNT 0x0E8 #define REG_WIFI_USCOMPARECNT 0x0EA // 0EC - config #define REG_WIFI_EXTRACOUNTCNT 0x0EE #define REG_WIFI_USCOMPARE0 0x0F0 #define REG_WIFI_USCOMPARE1 0x0F2 #define REG_WIFI_USCOMPARE2 0x0F4 #define REG_WIFI_USCOMPARE3 0x0F6 #define REG_WIFI_USCOUNTER0 0x0F8 #define REG_WIFI_USCOUNTER1 0x0FA #define REG_WIFI_USCOUNTER2 0x0FC #define REG_WIFI_USCOUNTER3 0x0FE // 100 - internal // 102 - internal // 104 - internal // 106 - internal #define REG_WIFI_CONTENTFREE 0x10C #define REG_WIFI_PREBEACONCOUNT 0x110 #define REG_WIFI_EXTRACOUNT 0x118 #define REG_WIFI_BEACONCOUNT1 0x11C // 120 to 132 - config/internal ports #define REG_WIFI_BEACONCOUNT2 0x134 // 140 to 154 - config ports #define REG_WIFI_BBCNT 0x158 #define REG_WIFI_BBWRITE 0x15A #define REG_WIFI_BBREAD 0x15C #define REG_WIFI_BBBUSY 0x15E #define REG_WIFI_BBMODE 0x160 #define REG_WIFI_BBPOWER 0x168 // 16A to 178 - internal #define REG_WIFI_RFDATA2 0x17C #define REG_WIFI_RFDATA1 0x17E #define REG_WIFI_RFBUSY 0x180 #define REG_WIFI_RFCNT 0x184 // 190 - internal // 194 - ? // 198 - internal #define REG_WIFI_RFPINS 0x19C // 1A0 - internal // 1A2 - internal #define REG_WIFI_MAYBE_RATE 0x1A4 #define REG_WIFI_RXSTAT_INC_IF 0x1A8 #define REG_WIFI_RXSTAT_INC_IE 0x1AA #define REG_WIFI_RXSTAT_OVF_IF 0x1AC #define REG_WIFI_RXSTAT_OVF_IE 0x1AE #define REG_WIFI_TXERR_COUNT 0x1C0 #define REG_WIFI_RX_COUNT 0x1C4 // 1D0 to 1DE - related to multiplayer. argh. #define REG_WIFI_RFSTATUS 0x214 #define REG_WIFI_IF_SET 0x21C #define REG_WIFI_TXSEQNO 0x210 #define REG_WIFI_RXTXADDR 0x268 #define REG_WIFI_POWERACK 0x2D0 #define WIFI_IOREG(reg) wifiMac.IOPorts[(reg) >> 1] /* WIFI misc constants */ #define WIFI_CHIPID 0x1440 /* emulates "old" wifi chip, new is 0xC340 */ /* Referenced as RF_ in dswifi: rffilter_t */ /* based on the documentation for the RF2958 chip of RF Micro Devices */ /* using the register names as in docs ( http://www.rfmd.com/pdfs/2958.pdf )*/ /* even tho every register only has 18 bits we are using u32 */ typedef struct rffilter_t { union CFG1 { struct { /* 0*/ unsigned IF_VGA_REG_EN:1; /* 1*/ unsigned IF_VCO_REG_EN:1; /* 2*/ unsigned RF_VCO_REG_EN:1; /* 3*/ unsigned HYBERNATE:1; /* 4*/ unsigned :10; /*14*/ unsigned REF_SEL:2; /*16*/ unsigned :2; } bits; u32 val; } CFG1; union IFPLL1 { struct { /* 0*/ unsigned DAC:4; /* 4*/ unsigned :5; /* 9*/ unsigned P1:1; /*10*/ unsigned LD_EN1:1; /*11*/ unsigned AUTOCAL_EN1:1; /*12*/ unsigned PDP1:1; /*13*/ unsigned CPL1:1; /*14*/ unsigned LPF1:1; /*15*/ unsigned VTC_EN1:1; /*16*/ unsigned KV_EN1:1; /*17*/ unsigned PLL_EN1:1; } bits; u32 val; } IFPLL1; union IFPLL2 { struct { /* 0*/ unsigned IF_N:16; /*16*/ unsigned :2; } bits; u32 val; } IFPLL2; union IFPLL3 { struct { /* 0*/ unsigned KV_DEF1:4; /* 4*/ unsigned CT_DEF1:4; /* 8*/ unsigned DN1:9; /*17*/ unsigned :1; } bits; u32 val; } IFPLL3; union RFPLL1 { struct { /* 0*/ unsigned DAC:4; /* 4*/ unsigned :5; /* 9*/ unsigned P:1; /*10*/ unsigned LD_EN:1; /*11*/ unsigned AUTOCAL_EN:1; /*12*/ unsigned PDP:1; /*13*/ unsigned CPL:1; /*14*/ unsigned LPF:1; /*15*/ unsigned VTC_EN:1; /*16*/ unsigned KV_EN:1; /*17*/ unsigned PLL_EN:1; } bits; u32 val; } RFPLL1; union RFPLL2 { struct { /* 0*/ unsigned NUM2:6; /* 6*/ unsigned N2:12; } bits; u32 val; } RFPLL2; union RFPLL3 { struct { /* 0*/ unsigned NUM2:18; } bits; u32 val; } RFPLL3; union RFPLL4 { struct { /* 0*/ unsigned KV_DEF:4; /* 4*/ unsigned CT_DEF:4; /* 8*/ unsigned DN:9; /*17*/ unsigned :1; } bits; u32 val; } RFPLL4; union CAL1 { struct { /* 0*/ unsigned LD_WINDOW:3; /* 3*/ unsigned M_CT_VALUE:5; /* 8*/ unsigned TLOCK:5; /*13*/ unsigned TVCO:5; } bits; u32 val; } CAL1; union TXRX1 { struct { /* 0*/ unsigned TXBYPASS:1; /* 1*/ unsigned INTBIASEN:1; /* 2*/ unsigned TXENMODE:1; /* 3*/ unsigned TXDIFFMODE:1; /* 4*/ unsigned TXLPFBW:3; /* 7*/ unsigned RXLPFBW:3; /*10*/ unsigned TXVGC:5; /*15*/ unsigned PCONTROL:2; /*17*/ unsigned RXDCFBBYPS:1; } bits; u32 val; } TXRX1; union PCNT1 { struct { /* 0*/ unsigned TX_DELAY:3; /* 3*/ unsigned PC_OFFSET:6; /* 9*/ unsigned P_DESIRED:6; /*15*/ unsigned MID_BIAS:3; } bits; u32 val; } PCNT1; union PCNT2 { struct { /* 0*/ unsigned MIN_POWER:6; /* 6*/ unsigned MID_POWER:6; /*12*/ unsigned MAX_POWER:6; } bits; u32 val; } PCNT2; union VCOT1 { struct { /* 0*/ unsigned :16; /*16*/ unsigned AUX1:1; /*17*/ unsigned AUX:1; } bits; u32 val; } VCOT1; } rffilter_t; /* baseband chip refered as BB_, dataformat is unknown yet */ /* it has at least 105 bytes of functional data */ typedef struct { u8 data[105]; } bb_t; /* communication interface between RF,BB and the mac */ typedef union { struct { /* 0*/ unsigned wordsize:5; /* 5*/ unsigned :2; /* 7*/ unsigned readOperation:1; /* 8*/ unsigned :8; } bits; u16 val; } rfIOCnt_t; typedef union { struct { /* 0*/ unsigned busy:1; /* 1*/ unsigned :15; } bits; u16 val; } rfIOStat_t; typedef union { struct { /* 0*/ unsigned content:18; /*18*/ unsigned address:5; /*23*/ unsigned :9; } bits; struct { /* 0*/ unsigned low:16; /*16*/ unsigned high:16; } val16; u16 array16[2]; u32 val; } rfIOData_t; typedef union { struct { /* 0*/ unsigned address:7; /* 7*/ unsigned :5; /*12*/ unsigned mode:2; /*14*/ unsigned enable:1; /*15*/ unsigned :1; } bits; u16 val; } bbIOCnt_t; #define WIFI_IRQ_RXEND 0 #define WIFI_IRQ_TXEND 1 #define WIFI_IRQ_RXINC 2 #define WIFI_IRQ_TXERROR 3 #define WIFI_IRQ_RXOVF 4 #define WIFI_IRQ_TXERROVF 5 #define WIFI_IRQ_RXSTART 6 #define WIFI_IRQ_TXSTART 7 #define WIFI_IRQ_TXCOUNTEXP 8 #define WIFI_IRQ_RXCOUNTEXP 9 #define WIFI_IRQ_RFWAKEUP 11 #define WIFI_IRQ_UNK 12 #define WIFI_IRQ_TIMEPOSTBEACON 13 #define WIFI_IRQ_TIMEBEACON 14 #define WIFI_IRQ_TIMEPREBEACON 15 struct Wifi_TXSlot { u16 RegVal; u16 CurAddr; int RemPreamble; // preamble time in µs int RemHWords; u32 TimeMask; // 3 = 2mbps, 7 = 1mbps bool NotStarted; }; #define WIFI_TXSLOT_LOC1 0 #define WIFI_TXSLOT_MPCMD 1 #define WIFI_TXSLOT_LOC2 2 #define WIFI_TXSLOT_LOC3 3 #define WIFI_TXSLOT_BEACON 4 #define WIFI_TXSLOT_MPREPLY 5 #define WIFI_TXSLOT_NUM 6 struct Wifi_RXPacket { u8* Data; int CurOffset; int RemHWords; bool NotStarted; }; typedef std::queue Wifi_RXPacketQueue; enum EAPStatus { APStatus_Disconnected = 0, APStatus_Authenticated, APStatus_Associated }; /* wifimac_t: the buildin mac (arm7 addressrange: 0x04800000-0x04FFFFFF )*/ /* http://www.akkit.org/info/dswifi.htm#WifiIOMap */ typedef struct { /* power */ BOOL powerOn; BOOL powerOnPending; /* status */ u16 rfStatus; u16 rfPins; /* wifi interrupt handling */ u16 IE; u16 IF; /* modes */ u16 macMode; u16 wepMode; BOOL WEP_enable; /* sending */ u16 TXStatCnt; u16 TXPower; u16 TXCnt; u16 TXStat; u16 TXSeqNo; Wifi_TXSlot TXSlots[WIFI_TXSLOT_NUM]; int TXCurSlot; u16 TXBusy; /* receiving */ u16 RXCnt; u16 RXCheckCounter; u8 RXNum; Wifi_RXPacketQueue RXPacketQueue; u16 RXStatIncIF, RXStatIncIE; u16 RXStatOvfIF, RXStatOvfIE; u8 RXStat[16]; u16 RXTXAddr; /* addressing/handshaking */ union { //TODO - is this endian safe? don't think so u16 words[3]; u8 bytes[6]; } mac; union { u16 words[3]; u8 bytes[6]; } bss; u16 aid; u16 pid; /* player ID or aid_low */ u16 retryLimit; /* timing */ u64 GlobalUsecTimer; BOOL crystalEnabled; u64 usec; BOOL usecEnable; u64 ucmp; BOOL ucmpEnable; u32 eCount; BOOL eCountEnable; u16 BeaconInterval; u16 BeaconCount1; u16 BeaconCount2; u16 ListenInterval; u16 ListenCount; /* subchips */ rffilter_t RF; bb_t BB; /* subchip communications */ rfIOCnt_t rfIOCnt; rfIOStat_t rfIOStatus; rfIOData_t rfIOData; bbIOCnt_t bbIOCnt; /* buffers */ u16 RAM[0x1000]; u16 RXRangeBegin; u16 RXRangeEnd; u16 RXWriteCursor; u16 RXReadCursor; u16 RXUnits; u16 RXBufCount; u16 CircBufReadAddress; u16 CircBufWriteAddress; u16 CircBufRdEnd; u16 CircBufRdSkip; u16 CircBufWrEnd; u16 CircBufWrSkip; /* I/O ports */ u16 IOPorts[0x800]; /* others */ u16 randomSeed; } wifimac_t; typedef struct { EAPStatus status; u16 seqNum; } SoftAP_t; // desmume host communication #ifdef EXPERIMENTAL_WIFI_COMM typedef struct pcap pcap_t; extern pcap_t *wifi_bridge; #endif extern wifimac_t wifiMac; extern SoftAP_t SoftAP; bool WIFI_Init(); void WIFI_DeInit(); void WIFI_Reset(); /* subchip communication IO functions */ void WIFI_setRF_CNT(u16 val); void WIFI_setRF_DATA(u16 val, u8 part); u16 WIFI_getRF_DATA(u8 part); u16 WIFI_getRF_STATUS(); void WIFI_setBB_CNT(u16 val); u8 WIFI_getBB_DATA(); void WIFI_setBB_DATA(u8 val); /* wifimac io */ void WIFI_write16(u32 address, u16 val); u16 WIFI_read16(u32 address); /* wifimac timing */ void WIFI_usTrigger(); /* DS WFC profile data documented here : */ /* http://dsdev.bigredpimp.com/2006/07/31/aoss-wfc-profile-data/ */ /* Note : we use bytes to avoid endianness issues */ typedef struct _FW_WFCProfile { char SSID[32]; char SSID_WEP64[32]; char WEPKEY_PART1[16]; char WEPKEY_PART2[16]; char WEPKEY_PART3[16]; char WEPKEY_PART4[16]; u8 IP_ADDRESS[4]; u8 GATEWAY[4]; u8 PRIM_DNS[4]; u8 SEC_DNS[4]; u8 SUBNET_MASK; u8 WEP64_KEY_AOSS[20]; u8 UNK1; u8 WEP_MODE; u8 STATUS; u8 UNK2[7]; u8 UNK3; u8 UNK4[14]; u8 CRC16[2]; } FW_WFCProfile; class WifiHandler { public: #ifdef EXPERIMENTAL_WIFI_COMM virtual bool WIFI_SocketsAvailable() { return true; } virtual bool WIFI_PCapAvailable() { return false; } virtual void WIFI_GetUniqueMAC(u8* mac) {} virtual bool WIFI_WFCWarning() { return false; } virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) { return -1; } virtual void PCAP_freealldevs(pcap_if_t* alldevs) {} virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) { return NULL; } virtual void PCAP_close(pcap_t* dev) {} virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) { return -1; } virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) { return -1; } virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) { return -1; } #endif }; #ifndef HOST_WINDOWS class UnixWifiHandler : public WifiHandler { #ifdef EXPERIMENTAL_WIFI_COMM virtual bool WIFI_SocketsAvailable() { return true; } virtual bool WIFI_PCapAvailable() { return true; } virtual bool WIFI_WFCWarning() { return false; } virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) { return pcap_findalldevs(alldevs, errbuf); } virtual void PCAP_freealldevs(pcap_if_t* alldevs) { pcap_freealldevs(alldevs); } virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) { return pcap_open_live(source, snaplen, flags, readtimeout, errbuf); } virtual void PCAP_close(pcap_t* dev) { pcap_close(dev); } virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) { return pcap_setnonblock(dev, nonblock, errbuf); } virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) { return pcap_sendpacket(dev, data, len); } virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) { return pcap_dispatch(dev, num, callback, userdata); } #endif }; #endif /* wifi data to be stored in firmware, when no firmware image was loaded */ extern u8 FW_Mac[6]; extern const u8 FW_WIFIInit[32]; extern const u8 FW_BBInit[105]; extern const u8 FW_RFInit[36]; extern const u8 FW_RFChannel[6*14]; extern const u8 FW_BBChannel[14]; extern FW_WFCProfile FW_WFCProfile1; extern FW_WFCProfile FW_WFCProfile2; extern FW_WFCProfile FW_WFCProfile3; extern WifiHandler *CurrentWifiHandler; #endif desmume-0.9.11/src/GPU.h0000755000000000000000000006333612467662066013367 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 Theo Berkau Copyright (C) 2007 shash Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef GPU_H #define GPU_H #include #include #include "types.h" class EMUFILE; struct MMU_struct; //#undef FORCEINLINE //#define FORCEINLINE void gpu_savestate(EMUFILE* os); bool gpu_loadstate(EMUFILE* is, int size); /******************************************************************************* this structure is for display control, it holds flags for general display *******************************************************************************/ #ifdef WORDS_BIGENDIAN struct _DISPCNT { /* 7*/ u8 ForceBlank:1; // A+B: /* 6*/ u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB) /* 5*/ u8 OBJ_BMP_2D_dim:1; // A+B: 0=128x512, 1=256x256 pixels /* 4*/ u8 OBJ_Tile_mapping:1;// A+B: 0=2D (32KB), 1=1D (32..256KB) /* 3*/ u8 BG0_3D:1; // A : 0=2D, 1=3D /* 0*/ u8 BG_Mode:3; // A+B: /*15*/ u8 WinOBJ_Enable:1; // A+B: 0=disable, 1=Enable /*14*/ u8 Win1_Enable:1; // A+B: 0=disable, 1=Enable /*13*/ u8 Win0_Enable:1; // A+B: 0=disable, 1=Enable /*12*/ u8 OBJ_Enable:1; // A+B: 0=disable, 1=Enable /*11*/ u8 BG3_Enable:1; // A+B: 0=disable, 1=Enable /*10*/ u8 BG2_Enable:1; // A+B: 0=disable, 1=Enable /* 9*/ u8 BG1_Enable:1; // A+B: 0=disable, 1=Enable /* 8*/ u8 BG0_Enable:1; // A+B: 0=disable, 1=Enable /*23*/ u8 OBJ_HBlank_process:1; // A+B: OBJ processed during HBlank (GBA bit5) /*22*/ u8 OBJ_BMP_1D_Bound:1; // A : /*20*/ u8 OBJ_Tile_1D_Bound:2; // A+B: /*18*/ u8 VRAM_Block:2; // A : VRAM block (0..3=A..D) /*16*/ u8 DisplayMode:2; // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap) // 0=off (white screen) // 1=on (normal BG & OBJ layers) // 2=VRAM display (coreA only) // 3=RAM display (coreA only, DMA transfers) /*31*/ u8 ExOBJPalette_Enable:1; // A+B: 0=disable, 1=Enable OBJ extended Palette /*30*/ u8 ExBGxPalette_Enable:1; // A+B: 0=disable, 1=Enable BG extended Palette /*27*/ u8 ScreenBase_Block:3; // A : Screen Base (64K step) /*24*/ u8 CharacBase_Block:3; // A : Character Base (64K step) }; #else struct _DISPCNT { /* 0*/ u8 BG_Mode:3; // A+B: /* 3*/ u8 BG0_3D:1; // A : 0=2D, 1=3D /* 4*/ u8 OBJ_Tile_mapping:1; // A+B: 0=2D (32KB), 1=1D (32..256KB) /* 5*/ u8 OBJ_BMP_2D_dim:1; // A+B: 0=128x512, 1=256x256 pixels /* 6*/ u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB) // 7-15 same as GBA /* 7*/ u8 ForceBlank:1; // A+B: /* 8*/ u8 BG0_Enable:1; // A+B: 0=disable, 1=Enable /* 9*/ u8 BG1_Enable:1; // A+B: 0=disable, 1=Enable /*10*/ u8 BG2_Enable:1; // A+B: 0=disable, 1=Enable /*11*/ u8 BG3_Enable:1; // A+B: 0=disable, 1=Enable /*12*/ u8 OBJ_Enable:1; // A+B: 0=disable, 1=Enable /*13*/ u8 Win0_Enable:1; // A+B: 0=disable, 1=Enable /*14*/ u8 Win1_Enable:1; // A+B: 0=disable, 1=Enable /*15*/ u8 WinOBJ_Enable:1; // A+B: 0=disable, 1=Enable /*16*/ u8 DisplayMode:2; // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap) // 0=off (white screen) // 1=on (normal BG & OBJ layers) // 2=VRAM display (coreA only) // 3=RAM display (coreA only, DMA transfers) /*18*/ u8 VRAM_Block:2; // A : VRAM block (0..3=A..D) /*20*/ u8 OBJ_Tile_1D_Bound:2; // A+B: /*22*/ u8 OBJ_BMP_1D_Bound:1; // A : /*23*/ u8 OBJ_HBlank_process:1; // A+B: OBJ processed during HBlank (GBA bit5) /*24*/ u8 CharacBase_Block:3; // A : Character Base (64K step) /*27*/ u8 ScreenBase_Block:3; // A : Screen Base (64K step) /*30*/ u8 ExBGxPalette_Enable:1; // A+B: 0=disable, 1=Enable BG extended Palette /*31*/ u8 ExOBJPalette_Enable:1; // A+B: 0=disable, 1=Enable OBJ extended Palette }; #endif typedef union { struct _DISPCNT bits; u32 val; } DISPCNT; #define BGxENABLED(cnt,num) ((num<8)? ((cnt.val>>8) & num):0) enum BlendFunc { NoBlend, Blend, Increase, Decrease }; /******************************************************************************* this structure is for display control of a specific layer, there are 4 background layers their priority indicate which one to draw on top of the other some flags indicate special drawing mode, size, FX *******************************************************************************/ #ifdef WORDS_BIGENDIAN struct _BGxCNT { /* 7*/ u8 Palette_256:1; // 0=16x16, 1=1*256 palette /* 6*/ u8 Mosaic_Enable:1; // 0=disable, 1=Enable mosaic /* 2*/ u8 CharacBase_Block:4; // individual character base offset (n*16KB) /* 0*/ u8 Priority:2; // 0..3=high..low /*14*/ u8 ScreenSize:2; // text : 256x256 512x256 256x512 512x512 // x/rot/s : 128x128 256x256 512x512 1024x1024 // bmp : 128x128 256x256 512x256 512x512 // large : 512x1024 1024x512 - - /*13*/ u8 PaletteSet_Wrap:1; // BG0 extended palette set 0=set0, 1=set2 // BG1 extended palette set 0=set1, 1=set3 // BG2 overflow area wraparound 0=off, 1=wrap // BG3 overflow area wraparound 0=off, 1=wrap /* 8*/ u8 ScreenBase_Block:5; // individual screen base offset (text n*2KB, BMP n*16KB) }; #else struct _BGxCNT { /* 0*/ u8 Priority:2; // 0..3=high..low /* 2*/ u8 CharacBase_Block:4; // individual character base offset (n*16KB) /* 6*/ u8 Mosaic_Enable:1; // 0=disable, 1=Enable mosaic /* 7*/ u8 Palette_256:1; // 0=16x16, 1=1*256 palette /* 8*/ u8 ScreenBase_Block:5; // individual screen base offset (text n*2KB, BMP n*16KB) /*13*/ u8 PaletteSet_Wrap:1; // BG0 extended palette set 0=set0, 1=set2 // BG1 extended palette set 0=set1, 1=set3 // BG2 overflow area wraparound 0=off, 1=wrap // BG3 overflow area wraparound 0=off, 1=wrap /*14*/ u8 ScreenSize:2; // text : 256x256 512x256 256x512 512x512 // x/rot/s : 128x128 256x256 512x512 1024x1024 // bmp : 128x128 256x256 512x256 512x512 // large : 512x1024 1024x512 - - }; #endif typedef union { struct _BGxCNT bits; u16 val; } BGxCNT; /******************************************************************************* this structure is for background offset *******************************************************************************/ typedef struct { u16 BGxHOFS; u16 BGxVOFS; } BGxOFS; /******************************************************************************* this structure is for rotoscale parameters *******************************************************************************/ typedef struct { s16 BGxPA; s16 BGxPB; s16 BGxPC; s16 BGxPD; s32 BGxX; s32 BGxY; } BGxPARMS; /******************************************************************************* these structures are for window description, windows are square regions and can "subclass" background layers or object layers (i.e window controls the layers) screen | +-- Window0/Window1/OBJwindow/OutOfWindows | +-- BG0/BG1/BG2/BG3/OBJ *******************************************************************************/ typedef union { struct { u8 end:8; u8 start:8; } bits ; u16 val; } WINxDIM; #ifdef WORDS_BIGENDIAN typedef struct { /* 6*/ u8 :2; /* 5*/ u8 WINx_Effect_Enable:1; /* 4*/ u8 WINx_OBJ_Enable:1; /* 3*/ u8 WINx_BG3_Enable:1; /* 2*/ u8 WINx_BG2_Enable:1; /* 1*/ u8 WINx_BG1_Enable:1; /* 0*/ u8 WINx_BG0_Enable:1; } WINxBIT; #else typedef struct { /* 0*/ u8 WINx_BG0_Enable:1; /* 1*/ u8 WINx_BG1_Enable:1; /* 2*/ u8 WINx_BG2_Enable:1; /* 3*/ u8 WINx_BG3_Enable:1; /* 4*/ u8 WINx_OBJ_Enable:1; /* 5*/ u8 WINx_Effect_Enable:1; /* 6*/ u8 :2; } WINxBIT; #endif #ifdef WORDS_BIGENDIAN typedef union { struct { WINxBIT win0; WINxBIT win1; } bits; struct { u8 :3; u8 win0_en:5; u8 :3; u8 win1_en:5; } packed_bits; struct { u8 low; u8 high; } bytes; u16 val ; } WINxCNT ; #else typedef union { struct { WINxBIT win0; WINxBIT win1; } bits; struct { u8 win0_en:5; u8 :3; u8 win1_en:5; u8 :3; } packed_bits; struct { u8 low; u8 high; } bytes; u16 val ; } WINxCNT ; #endif /* typedef struct { WINxDIM WIN0H; WINxDIM WIN1H; WINxDIM WIN0V; WINxDIM WIN1V; WINxCNT WININ; WINxCNT WINOUT; } WINCNT; */ /******************************************************************************* this structure is for miscellanous settings //TODO: needs further description *******************************************************************************/ typedef struct { u16 MOSAIC; u16 unused1; u16 unused2;//BLDCNT; u16 unused3;//BLDALPHA; u16 unused4;//BLDY; u16 unused5; /* u16 unused6; u16 unused7; u16 unused8; u16 unused9; */ } MISCCNT; /******************************************************************************* this structure is for 3D settings *******************************************************************************/ struct _DISP3DCNT { /* 0*/ u8 EnableTexMapping:1; // /* 1*/ u8 PolygonShading:1; // 0=Toon Shading, 1=Highlight Shading /* 2*/ u8 EnableAlphaTest:1; // see ALPHA_TEST_REF /* 3*/ u8 EnableAlphaBlending:1; // see various Alpha values /* 4*/ u8 EnableAntiAliasing:1; // /* 5*/ u8 EnableEdgeMarking:1; // see EDGE_COLOR /* 6*/ u8 FogOnlyAlpha:1; // 0=Alpha and Color, 1=Only Alpha (see FOG_COLOR) /* 7*/ u8 EnableFog:1; // Fog Master Enable /* 8*/ u8 FogShiftSHR:4; // 0..10 SHR-Divider (see FOG_OFFSET) /*12*/ u8 AckColorBufferUnderflow:1; // Color Buffer RDLINES Underflow (0=None, 1=Underflow/Acknowledge) /*13*/ u8 AckVertexRAMOverflow:1; // Polygon/Vertex RAM Overflow (0=None, 1=Overflow/Acknowledge) /*14*/ u8 RearPlaneMode:1; // 0=Blank, 1=Bitmap /*15*/ u8 :1; /*16*/ u16 :16; }; typedef union { struct _DISP3DCNT bits; u32 val; } DISP3DCNT; /******************************************************************************* this structure is for capture control (core A only) source: http://nocash.emubase.de/gbatek.htm#dsvideocaptureandmainmemorydisplaymode *******************************************************************************/ struct DISPCAPCNT { enum CAPX { _128, _256 } capx; u32 val; BOOL enabled; u8 EVA; u8 EVB; u8 writeBlock; u8 writeOffset; u16 capy; u8 srcA; u8 srcB; u8 readBlock; u8 readOffset; u8 capSrc; } ; /******************************************************************************* this structure holds everything and should be mapped to * core A : 0x04000000 * core B : 0x04001000 *******************************************************************************/ typedef struct _reg_dispx { DISPCNT dispx_DISPCNT; // 0x0400x000 u16 dispA_DISPSTAT; // 0x04000004 u16 dispx_VCOUNT; // 0x0400x006 BGxCNT dispx_BGxCNT[4]; // 0x0400x008 BGxOFS dispx_BGxOFS[4]; // 0x0400x010 BGxPARMS dispx_BG2PARMS; // 0x0400x020 BGxPARMS dispx_BG3PARMS; // 0x0400x030 u8 filler[12]; // 0x0400x040 MISCCNT dispx_MISC; // 0x0400x04C DISP3DCNT dispA_DISP3DCNT; // 0x04000060 DISPCAPCNT dispA_DISPCAPCNT; // 0x04000064 u32 dispA_DISPMMEMFIFO; // 0x04000068 } REG_DISPx ; typedef BOOL (*fun_gl_Begin) (int screen); typedef void (*fun_gl_End) (int screen); // the GUI should use this function prior to all gl calls // if call to beg succeeds opengl draw void register_gl_fun(fun_gl_Begin beg,fun_gl_End end); #define GPU_MAIN 0 #define GPU_SUB 1 /* human readable bitmask names */ #define ADDRESS_STEP_512B 0x00200 #define ADDRESS_STEP_1KB 0x00400 #define ADDRESS_STEP_2KB 0x00800 #define ADDRESS_STEP_4KB 0x01000 #define ADDRESS_STEP_8KB 0x02000 #define ADDRESS_STEP_16KB 0x04000 #define ADDRESS_STEP_32KB 0x08000 #define ADDRESS_STEP_64KB 0x10000 #define ADDRESS_STEP_128KB 0x20000 #define ADDRESS_STEP_256KB 0x40000 #define ADDRESS_STEP_512KB 0x80000 #define ADDRESS_MASK_256KB (ADDRESS_STEP_256KB-1) #ifdef WORDS_BIGENDIAN struct _TILEENTRY { /*14*/ unsigned Palette:4; /*13*/ unsigned VFlip:1; // VERTICAL FLIP (top<-->bottom) /*12*/ unsigned HFlip:1; // HORIZONTAL FLIP (left<-->right) /* 0*/ unsigned TileNum:10; }; #else struct _TILEENTRY { /* 0*/ unsigned TileNum:10; /*12*/ unsigned HFlip:1; // HORIZONTAL FLIP (left<-->right) /*13*/ unsigned VFlip:1; // VERTICAL FLIP (top<-->bottom) /*14*/ unsigned Palette:4; }; #endif typedef union { struct _TILEENTRY bits; u16 val; } TILEENTRY; struct _ROTOCOORD { u32 Fraction:8; s32 Integer:20; u32 pad:4; }; typedef union { struct _ROTOCOORD bits; s32 val; } ROTOCOORD; /* this structure is for color representation, it holds 5 meaningful bits per color channel (red,green,blue) and 1 meaningful bit for alpha representation this bit can be unused or used for special FX */ struct _COLOR { // abgr x555 #ifdef WORDS_BIGENDIAN unsigned alpha:1; // sometimes it is unused (pad) unsigned blue:5; unsigned green:5; unsigned red:5; #else unsigned red:5; unsigned green:5; unsigned blue:5; unsigned alpha:1; // sometimes it is unused (pad) #endif }; struct _COLORx { // abgr x555 unsigned bgr:15; unsigned alpha:1; // sometimes it is unused (pad) }; typedef union { struct _COLOR bits; struct _COLORx bitx; u16 val; } COLOR; struct _COLOR32 { // ARGB unsigned :3; unsigned blue:5; unsigned :3; unsigned green:5; unsigned :3; unsigned red:5; unsigned :7; unsigned alpha:1; // sometimes it is unused (pad) }; typedef union { struct _COLOR32 bits; u32 val; } COLOR32; #define COLOR_16_32(w,i) \ /* doesnt matter who's 16bit who's 32bit */ \ i.bits.red = w.bits.red; \ i.bits.green = w.bits.green; \ i.bits.blue = w.bits.blue; \ i.bits.alpha = w.bits.alpha; // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap) enum GPU_OBJ_MODE { GPU_OBJ_MODE_Normal = 0, GPU_OBJ_MODE_Transparent = 1, GPU_OBJ_MODE_Window = 2, GPU_OBJ_MODE_Bitmap = 3 }; struct _OAM_ { //attr0 u8 Y; u8 RotScale; u8 Mode; u8 Mosaic; u8 Depth; u8 Shape; //att1 s16 X; u8 RotScalIndex; u8 HFlip, VFlip; u8 Size; //attr2 u16 TileIndex; u8 Priority; u8 PaletteIndex; //attr3 u16 attr3; }; void SlurpOAM(_OAM_* oam_output, void* oam_buffer, int oam_index); u16 SlurpOAMAffineParam(void* oam_buffer, int oam_index); typedef struct { s16 x; s16 y; } size; #define NB_PRIORITIES 4 #define NB_BG 4 //this structure holds information for rendering. typedef struct { u8 PixelsX[256]; u8 BGs[NB_BG], nbBGs; u8 pad[1]; u16 nbPixelsX; //256+8: u8 pad2[248]; //things were slower when i organized this struct this way. whatever. //u8 PixelsX[256]; //int BGs[NB_BG], nbBGs; //int nbPixelsX; ////<-- 256 + 24 //u8 pad2[256-24]; } itemsForPriority_t; #define MMU_ABG 0x06000000 #define MMU_BBG 0x06200000 #define MMU_AOBJ 0x06400000 #define MMU_BOBJ 0x06600000 #define MMU_LCDC 0x06800000 extern CACHE_ALIGN u8 gpuBlendTable555[17][17][32][32]; enum BGType { BGType_Invalid=0, BGType_Text=1, BGType_Affine=2, BGType_Large8bpp=3, BGType_AffineExt=4, BGType_AffineExt_256x16=5, BGType_AffineExt_256x1=6, BGType_AffineExt_Direct=7 }; extern const BGType GPU_mode2type[8][4]; struct GPU { GPU() : debug(false) {} // some structs are becoming redundant // some functions too (no need to recopy some vars as it is done by MMU) REG_DISPx * dispx_st; //this indicates whether this gpu is handling debug tools bool debug; _BGxCNT & bgcnt(int num) { return (dispx_st)->dispx_BGxCNT[num].bits; } _DISPCNT & dispCnt() { return dispx_st->dispx_DISPCNT.bits; } template void modeRender(int layer); DISPCAPCNT dispCapCnt; BOOL LayersEnable[5]; itemsForPriority_t itemsForPriority[NB_PRIORITIES]; #define BGBmpBB BG_bmp_ram #define BGChBB BG_tile_ram u32 BG_bmp_large_ram[4]; u32 BG_bmp_ram[4]; u32 BG_tile_ram[4]; u32 BG_map_ram[4]; u8 BGExtPalSlot[4]; u32 BGSize[4][2]; BGType BGTypes[4]; struct MosaicColor { u16 bg[4][256]; struct Obj { u16 color; u8 alpha, opaque; } obj[256]; } mosaicColors; u8 sprNum[256]; u8 h_win[2][256]; const u8 *curr_win[2]; void update_winh(int WIN_NUM); bool need_update_winh[2]; template void setup_windows(); u8 core; u8 dispMode; u8 vramBlock; u8 *VRAMaddr; //FIFO fifo; u8 bgPrio[5]; BOOL bg0HasHighestPrio; void * oam; u32 sprMem; u8 sprBoundary; u8 sprBMPBoundary; u8 sprBMPMode; u32 sprEnable; u8 WIN0H0; u8 WIN0H1; u8 WIN0V0; u8 WIN0V1; u8 WIN1H0; u8 WIN1H1; u8 WIN1V0; u8 WIN1V1; u8 WININ0; bool WININ0_SPECIAL; u8 WININ1; bool WININ1_SPECIAL; u8 WINOUT; bool WINOUT_SPECIAL; u8 WINOBJ; bool WINOBJ_SPECIAL; u8 WIN0_ENABLED; u8 WIN1_ENABLED; u8 WINOBJ_ENABLED; u16 BLDCNT; u8 BLDALPHA_EVA; u8 BLDALPHA_EVB; u8 BLDY_EVY; u16 *currentFadeInColors, *currentFadeOutColors; bool blend2[8]; CACHE_ALIGN u16 tempScanlineBuffer[256]; u8 *tempScanline; u8 MasterBrightMode; u32 MasterBrightFactor; CACHE_ALIGN u8 bgPixels[1024]; //yes indeed, this is oversized. map debug tools try to write to it u32 currLine; u8 currBgNum; bool blend1; u8* currDst; u8* _3dColorLine; static struct MosaicLookup { struct TableEntry { u8 begin, trunc; } table[16][256]; MosaicLookup() { for(int m=0;m<16;m++) for(int i=0;i<256;i++) { int mosaic = m+1; TableEntry &te = table[m][i]; te.begin = (i%mosaic==0); te.trunc = i/mosaic*mosaic; } } TableEntry *width, *height; int widthValue, heightValue; } mosaicLookup; bool curr_mosaic_enabled; u16 blend(u16 colA, u16 colB); template FORCEINLINE FASTCALL bool _master_setFinalBGColor(u16 &color, const u32 x); template FORCEINLINE FASTCALL void _master_setFinal3dColor(int dstX, int srcX); int setFinalColorBck_funcNum; int bgFunc; int setFinalColor3d_funcNum; int setFinalColorSpr_funcNum; //Final3DColFunct setFinalColor3D; enum SpriteRenderMode { SPRITE_1D, SPRITE_2D } spriteRenderMode; template void _spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); inline void spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { if(spriteRenderMode == SPRITE_1D) _spriteRender(dst,dst_alpha,typeTab, prioTab); else _spriteRender(dst,dst_alpha,typeTab, prioTab); } void setFinalColor3d(int dstX, int srcX); template void setFinalColorBG(u16 color, const u32 x); template FORCEINLINE void __setFinalColorBck(u16 color, const u32 x, const int opaque); template FORCEINLINE void ___setFinalColorBck(u16 color, const u32 x, const int opaque); void setAffineStart(int layer, int xy, u32 val); void setAffineStartWord(int layer, int xy, u16 val, int word); u32 getAffineStart(int layer, int xy); void refreshAffineStartRegs(const int num, const int xy); struct AffineInfo { AffineInfo() : x(0), y(0) {} u32 x, y; } affineInfo[2]; void renderline_checkWindows(u16 x, bool &draw, bool &effect) const; // check whether (x,y) is within the rectangle (including wraparounds) template u8 withinRect(u16 x) const; void setBLDALPHA(u16 val) { BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f); BLDALPHA_EVB = ((val>>8)&0x1f) > 16 ? 16 : ((val>>8)&0x1f); updateBLDALPHA(); } void setBLDALPHA_EVA(u8 val) { BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f); updateBLDALPHA(); } void setBLDALPHA_EVB(u8 val) { BLDALPHA_EVB = (val&0x1f) > 16 ? 16 : (val&0x1f); updateBLDALPHA(); } u32 getHOFS(int bg); u32 getVOFS(int bg); typedef u8 TBlendTable[32][32]; TBlendTable *blendTable; void updateBLDALPHA() { blendTable = (TBlendTable*)&gpuBlendTable555[BLDALPHA_EVA][BLDALPHA_EVB][0][0]; } }; #if 0 // normally should have same addresses static void REG_DISPx_pack_test(GPU * gpu) { REG_DISPx * r = gpu->dispx_st; printf ("%08x %02x\n", (u32)r, (u32)(&r->dispx_DISPCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISPSTAT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_VCOUNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BGxCNT[0]) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BGxOFS[0]) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BG2PARMS) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BG3PARMS) - (u32)r); // printf ("\t%02x\n", (u32)(&r->dispx_WINCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_MISC) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISP3DCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISPCAPCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISPMMEMFIFO) - (u32)r); } #endif CACHE_ALIGN extern u8 GPU_screen[4*256*192]; GPU * GPU_Init(u8 l); void GPU_Reset(GPU *g, u8 l); void GPU_DeInit(GPU *); //these are functions used by debug tools which want to render layers etc outside the context of the emulation namespace GPU_EXT { void textBG(GPU * gpu, u8 num, u8 * DST); //Draw text based background void rotBG(GPU * gpu, u8 num, u8 * DST); void extRotBG(GPU * gpu, u8 num, u8 * DST); }; void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); extern const size sprSizeTab[4][4]; typedef struct { GPU * gpu; u16 offset; } NDS_Screen; extern NDS_Screen MainScreen; extern NDS_Screen SubScreen; int Screen_Init(); void Screen_Reset(void); void Screen_DeInit(void); extern MMU_struct MMU; void GPU_setVideoProp(GPU *, u32 p); void GPU_setBGProp(GPU *, u16 num, u16 p); void GPU_setBLDCNT(GPU *gpu, u16 v) ; void GPU_setBLDY(GPU *gpu, u16 v) ; void GPU_setMOSAIC(GPU *gpu, u16 v) ; void GPU_remove(GPU *, u8 num); void GPU_addBack(GPU *, u8 num); int GPU_ChangeGraphicsCore(int coreid); void GPU_set_DISPCAPCNT(u32 val) ; void GPU_RenderLine(NDS_Screen * screen, u16 l, bool skip = false) ; void GPU_setMasterBrightness (GPU *gpu, u16 val); inline void GPU_setWIN0_H(GPU* gpu, u16 val) { gpu->WIN0H0 = val >> 8; gpu->WIN0H1 = val&0xFF; gpu->need_update_winh[0] = true; } inline void GPU_setWIN0_H0(GPU* gpu, u8 val) { gpu->WIN0H0 = val; gpu->need_update_winh[0] = true; } inline void GPU_setWIN0_H1(GPU* gpu, u8 val) { gpu->WIN0H1 = val; gpu->need_update_winh[0] = true; } inline void GPU_setWIN0_V(GPU* gpu, u16 val) { gpu->WIN0V0 = val >> 8; gpu->WIN0V1 = val&0xFF;} inline void GPU_setWIN0_V0(GPU* gpu, u8 val) { gpu->WIN0V0 = val; } inline void GPU_setWIN0_V1(GPU* gpu, u8 val) { gpu->WIN0V1 = val; } inline void GPU_setWIN1_H(GPU* gpu, u16 val) {gpu->WIN1H0 = val >> 8; gpu->WIN1H1 = val&0xFF; gpu->need_update_winh[1] = true; } inline void GPU_setWIN1_H0(GPU* gpu, u8 val) { gpu->WIN1H0 = val; gpu->need_update_winh[1] = true; } inline void GPU_setWIN1_H1(GPU* gpu, u8 val) { gpu->WIN1H1 = val; gpu->need_update_winh[1] = true; } inline void GPU_setWIN1_V(GPU* gpu, u16 val) { gpu->WIN1V0 = val >> 8; gpu->WIN1V1 = val&0xFF; } inline void GPU_setWIN1_V0(GPU* gpu, u8 val) { gpu->WIN1V0 = val; } inline void GPU_setWIN1_V1(GPU* gpu, u8 val) { gpu->WIN1V1 = val; } inline void GPU_setWININ(GPU* gpu, u16 val) { gpu->WININ0=val&0x1F; gpu->WININ0_SPECIAL=((val>>5)&1)!=0; gpu->WININ1=(val>>8)&0x1F; gpu->WININ1_SPECIAL=((val>>13)&1)!=0; } inline void GPU_setWININ0(GPU* gpu, u8 val) { gpu->WININ0 = val&0x1F; gpu->WININ0_SPECIAL = (val>>5)&1; } inline void GPU_setWININ1(GPU* gpu, u8 val) { gpu->WININ1 = val&0x1F; gpu->WININ1_SPECIAL = (val>>5)&1; } inline void GPU_setWINOUT16(GPU* gpu, u16 val) { gpu->WINOUT=val&0x1F; gpu->WINOUT_SPECIAL=((val>>5)&1)!=0; gpu->WINOBJ=(val>>8)&0x1F; gpu->WINOBJ_SPECIAL=((val>>13)&1)!=0; } inline void GPU_setWINOUT(GPU* gpu, u8 val) { gpu->WINOUT = val&0x1F; gpu->WINOUT_SPECIAL = (val>>5)&1; } inline void GPU_setWINOBJ(GPU* gpu, u8 val) { gpu->WINOBJ = val&0x1F; gpu->WINOBJ_SPECIAL = (val>>5)&1; } // Blending void SetupFinalPixelBlitter (GPU *gpu); #define GPU_setBLDCNT_LOW(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF00) | (val); SetupFinalPixelBlitter (gpu);} #define GPU_setBLDCNT_HIGH(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF) | (val<<8); SetupFinalPixelBlitter (gpu);} #define GPU_setBLDCNT(gpu, val) {gpu->BLDCNT = (val); SetupFinalPixelBlitter (gpu);} #define GPU_setBLDY_EVY(gpu, val) {gpu->BLDY_EVY = ((val)&0x1f) > 16 ? 16 : ((val)&0x1f);} //these arent needed right now since the values get poked into memory via default mmu handling and dispx_st //#define GPU_setBGxHOFS(bg, gpu, val) gpu->dispx_st->dispx_BGxOFS[bg].BGxHOFS = ((val) & 0x1FF) //#define GPU_setBGxVOFS(bg, gpu, val) gpu->dispx_st->dispx_BGxOFS[bg].BGxVOFS = ((val) & 0x1FF) void gpu_SetRotateScreen(u16 angle); //#undef FORCEINLINE //#define FORCEINLINE __forceinline #endif desmume-0.9.11/src/Disassembler.cpp0000755000000000000000000033170012467662066015675 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include "Disassembler.h" #include "bits.h" #define ROR(i, j) ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j)))) const char Condition[16][3] = { "EQ", "NE", "CS", "CC", "MI", "PL", "VS", "VC", "HI", "LS", "GE", "LT", "GT", "LE", "", "" }; const char Registre[16][4] = { "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R12", "SP", "LR", "PC", }; const char MSR_FIELD[16][5] = { "", "c", "x", "xc", "s", "sc", "sx", "sxc", "f", "fc", "fx", "fxc", "fs", "fsc", "fsx", "fsxc" }; #define DATAPROC_LSL_IMM(nom, s) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", LSL #%X", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s%s %s, %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ tmp); #define DATAPROC_ROR_IMM(nom, s) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", RRX");\ sprintf(txt, "%s%s%s %s, %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ tmp\ ); #define DATAPROC_REG_SHIFT(nom, shift,s) sprintf(txt, "%s%s%s %s, %s, %s, %s %s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ #shift,\ Registre[REG_POS(i,8)]\ ); #define DATAPROC_IMM_SHIFT(nom, shift, s) sprintf(txt, "%s%s%s %s, %s, %s, %s #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ #shift,\ (int)((i>>7)&0x1F)\ ); #define DATAPROC_IMM_VALUE(nom,s) u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E);\ sprintf(txt, "%s%s%s %s, %s, #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ (int)shift_op\ ); #define DATAPROC_ONE_OP_LSL_IMM(nom, s, v) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", LSL #%X", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s%s %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ tmp); #define DATAPROC_ONE_OP_ROR_IMM(nom, s, v) char tmp[10] = "";\ if(((i>>7)&0x1F)==0)\ sprintf(tmp, ", RRX");\ else\ sprintf(tmp, ", ROR %d", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s%s %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ tmp\ ); #define DATAPROC_ONE_OP_REG_SHIFT(nom, shift,s, v) sprintf(txt, "%s%s%s %s, %s, %s %s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ #shift,\ Registre[REG_POS(i,8)]\ ); #define DATAPROC_ONE_OP_IMM_SHIFT(nom, shift, s, v) sprintf(txt, "%s%s%s %s, %s, %s #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ #shift,\ (int)((i>>7)&0x1F)\ ); #define DATAPROC_ONE_OP_IMM_VALUE(nom, s, v)\ u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E);\ sprintf(txt, "%s%s%s %s, #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ (int)shift_op\ ); #define SIGNEXTEND_24(i) (((i)&0xFFFFFF)|(0xFF000000*BIT23(i))) #define LDRSTR_LSL_IMM(nom, op, op2, op3) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", LSL #%X", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s %s, [%s%s, %s%s%s%s",\ #nom,\ Condition[CONDITION(i)],\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ op2,\ op,\ Registre[REG_POS(i,0)],\ tmp,\ op3); #define LDRSTR_ROR_IMM(nom, op, op2, op3) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", RRX");\ sprintf(txt, "%s%s %s, [%s%s, %s%s%s%s",\ #nom,\ Condition[CONDITION(i)],\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ op2,\ op,\ Registre[REG_POS(i,0)],\ tmp,\ op3\ ); #define LDRSTR_IMM_SHIFT(nom, shift, op, op2, op3)\ sprintf(txt, "%s%s %s, [%s%s, %s%s, %s #%X%s",\ #nom,\ Condition[CONDITION(i)],\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ op2,\ op,\ Registre[REG_POS(i,0)],\ #shift,\ (int)((i>>7)&0x1F),\ op3\ ); #define RegList(nb) char lreg[100] = "";\ int prec = 0;\ int j;\ for(j = 0; j < nb; j++)\ {\ if(prec)\ {\ if((!BIT_N(i, j+1))||(j==nb-1))\ {\ sprintf(lreg + strlen(lreg), "%s,", Registre[j]);\ prec = 0;\ }\ }\ else\ {\ if(BIT_N(i, j))\ {\ if((BIT_N(i, j+1))&&(j!=nb-1))\ {\ sprintf(lreg + strlen(lreg), "%s-", Registre[j]);\ prec = 1;\ }\ else\ sprintf(lreg + strlen(lreg), "%s,", Registre[j]);\ }\ }\ }\ if(*lreg) lreg[strlen(lreg)-1]='\0'; static char * OP_UND(u32 adr, u32 i, char * txt) { sprintf(txt, "----"); return txt; } //-----------------------AND------------------------------------ static char * OP_AND_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(AND, ""); return txt; } static char * OP_AND_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSL, ""); return txt; } static char * OP_AND_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, LSR, ""); return txt; } static char * OP_AND_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSR, ""); return txt; } static char * OP_AND_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, ASR, ""); return txt; } static char * OP_AND_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ASR, ""); return txt; } static char * OP_AND_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(AND, ""); return txt; } static char * OP_AND_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ROR, ""); return txt; } static char * OP_AND_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(AND, ""); return txt; } static char * OP_AND_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(AND, "S"); return txt; } static char * OP_AND_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSL, "S"); return txt; } static char * OP_AND_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, LSR, "S"); return txt; } static char * OP_AND_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSR, "S"); return txt; } static char * OP_AND_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, ASR, "S"); return txt; } static char * OP_AND_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ASR, "S"); return txt; } static char * OP_AND_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(AND, "S"); return txt; } static char * OP_AND_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ROR, "S"); return txt; } static char * OP_AND_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(AND, "S"); return txt; } //--------------EOR------------------------------ static char * OP_EOR_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(EOR, ""); return txt; } static char * OP_EOR_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSL, ""); return txt; } static char * OP_EOR_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, LSR, ""); return txt; } static char * OP_EOR_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSR, ""); return txt; } static char * OP_EOR_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, ASR, ""); return txt; } static char * OP_EOR_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ASR, ""); return txt; } static char * OP_EOR_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(EOR, ""); return txt; } static char * OP_EOR_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ROR, ""); return txt; } static char * OP_EOR_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(EOR, ""); return txt; } static char * OP_EOR_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(EOR, "S"); return txt; } static char * OP_EOR_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSL, "S"); return txt; } static char * OP_EOR_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, LSR, "S"); return txt; } static char * OP_EOR_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSR, "S"); return txt; } static char * OP_EOR_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, ASR, "S"); return txt; } static char * OP_EOR_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ASR, "S"); return txt; } static char * OP_EOR_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(EOR, "S"); return txt; } static char * OP_EOR_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ROR, "S"); return txt; } static char * OP_EOR_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(EOR, "S"); return txt; } //-------------SUB------------------------------------- static char * OP_SUB_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SUB, ""); return txt; } static char * OP_SUB_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSL, ""); return txt; } static char * OP_SUB_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, LSR, ""); return txt; } static char * OP_SUB_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSR, ""); return txt; } static char * OP_SUB_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, ASR, ""); return txt; } static char * OP_SUB_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ASR, ""); return txt;} static char * OP_SUB_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SUB, ""); return txt;} static char * OP_SUB_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ROR, ""); return txt;} static char * OP_SUB_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SUB, ""); return txt;} static char * OP_SUB_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SUB, "S"); return txt;} static char * OP_SUB_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSL, "S"); return txt;} static char * OP_SUB_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, LSR, "S"); return txt;} static char * OP_SUB_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSR, "S"); return txt;} static char * OP_SUB_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, ASR, "S"); return txt;} static char * OP_SUB_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ASR, "S"); return txt;} static char * OP_SUB_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SUB, "S"); return txt;} static char * OP_SUB_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ROR, "S"); return txt;} static char * OP_SUB_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SUB, "S"); return txt;} //------------------RSB------------------------ static char * OP_RSB_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSB, ""); return txt;} static char * OP_RSB_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSL, ""); return txt;} static char * OP_RSB_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, LSR, ""); return txt;} static char * OP_RSB_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSR, ""); return txt;} static char * OP_RSB_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, ASR, ""); return txt;} static char * OP_RSB_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ASR, ""); return txt;} static char * OP_RSB_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSB, ""); return txt;} static char * OP_RSB_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ROR, ""); return txt;} static char * OP_RSB_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSB, ""); return txt;} static char * OP_RSB_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSB, "S"); return txt;} static char * OP_RSB_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSL, "S"); return txt;} static char * OP_RSB_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, LSR, "S"); return txt;} static char * OP_RSB_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSR, "S"); return txt;} static char * OP_RSB_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, ASR, "S"); return txt;} static char * OP_RSB_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ASR, "S"); return txt;} static char * OP_RSB_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSB, "S"); return txt;} static char * OP_RSB_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ROR, "S"); return txt;} static char * OP_RSB_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSB, "S"); return txt;} //------------------ADD----------------------------------- static char * OP_ADD_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADD, ""); return txt;} static char * OP_ADD_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSL, ""); return txt;} static char * OP_ADD_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, LSR, ""); return txt;} static char * OP_ADD_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSR, ""); return txt;} static char * OP_ADD_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, ASR, ""); return txt;} static char * OP_ADD_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ASR, ""); return txt;} static char * OP_ADD_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADD, ""); return txt;} static char * OP_ADD_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ROR, ""); return txt;} static char * OP_ADD_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADD, ""); return txt;} static char * OP_ADD_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADD, "S"); return txt;} static char * OP_ADD_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSL, "S"); return txt;} static char * OP_ADD_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, LSR, "S"); return txt;} static char * OP_ADD_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSR, "S"); return txt;} static char * OP_ADD_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, ASR, "S"); return txt;} static char * OP_ADD_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ASR, "S"); return txt;} static char * OP_ADD_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADD, "S"); return txt;} static char * OP_ADD_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ROR, "S"); return txt;} static char * OP_ADD_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADD, "S"); return txt;} //------------------ADC----------------------------------- static char * OP_ADC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADC, ""); return txt;} static char * OP_ADC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSL, ""); return txt;} static char * OP_ADC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, LSR, ""); return txt;} static char * OP_ADC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSR, ""); return txt;} static char * OP_ADC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, ASR, ""); return txt;} static char * OP_ADC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ASR, ""); return txt;} static char * OP_ADC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADC, ""); return txt;} static char * OP_ADC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ROR, ""); return txt;} static char * OP_ADC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADC, ""); return txt;} static char * OP_ADC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADC, "S"); return txt;} static char * OP_ADC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSL, "S"); return txt;} static char * OP_ADC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, LSR, "S"); return txt;} static char * OP_ADC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSR, "S"); return txt;} static char * OP_ADC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, ASR, "S"); return txt;} static char * OP_ADC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ASR, "S"); return txt;} static char * OP_ADC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADC, "S"); return txt;} static char * OP_ADC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ROR, "S"); return txt;} static char * OP_ADC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADC, "S"); return txt;} //-------------SBC------------------------------------- static char * OP_SBC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SBC, ""); return txt;} static char * OP_SBC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSL, ""); return txt;} static char * OP_SBC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, LSR, ""); return txt;} static char * OP_SBC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSR, ""); return txt;} static char * OP_SBC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, ASR, ""); return txt;} static char * OP_SBC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ASR, ""); return txt;} static char * OP_SBC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SBC, ""); return txt;} static char * OP_SBC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ROR, ""); return txt;} static char * OP_SBC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SBC, ""); return txt;} static char * OP_SBC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SBC, "S"); return txt;} static char * OP_SBC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSL, "S"); return txt;} static char * OP_SBC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, LSR, "S"); return txt;} static char * OP_SBC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSR, "S"); return txt;} static char * OP_SBC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, ASR, "S"); return txt;} static char * OP_SBC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ASR, "S"); return txt;} static char * OP_SBC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SBC, "S"); return txt;} static char * OP_SBC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ROR, "S"); return txt;} static char * OP_SBC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SBC, "S"); return txt;} //---------------RSC---------------------------------- static char * OP_RSC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSC, ""); return txt;} static char * OP_RSC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSL, ""); return txt;} static char * OP_RSC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, LSR, ""); return txt;} static char * OP_RSC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSR, ""); return txt;} static char * OP_RSC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, ASR, ""); return txt;} static char * OP_RSC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ASR, ""); return txt;} static char * OP_RSC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSC, ""); return txt;} static char * OP_RSC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ROR, ""); return txt;} static char * OP_RSC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSC, ""); return txt;} static char * OP_RSC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSC, "S"); return txt;} static char * OP_RSC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSL, "S"); return txt;} static char * OP_RSC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, LSR, "S"); return txt;} static char * OP_RSC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSR, "S"); return txt;} static char * OP_RSC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, ASR, "S"); return txt;} static char * OP_RSC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ASR, "S"); return txt;} static char * OP_RSC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSC, "S"); return txt;} static char * OP_RSC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ROR, "S"); return txt;} static char * OP_RSC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSC, "S"); return txt;} //-------------------TST---------------------------- static char * OP_TST_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(TST, "", 16); return txt;} static char * OP_TST_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, LSL, "", 16); return txt;} static char * OP_TST_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TST, LSR, "", 16); return txt;} static char * OP_TST_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, LSR, "", 16); return txt;} static char * OP_TST_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TST, ASR, "", 16); return txt;} static char * OP_TST_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, ASR, "", 16); return txt;} static char * OP_TST_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(TST, "", 16); return txt;} static char * OP_TST_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, ROR, "", 16); return txt;} static char * OP_TST_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(TST, "", 16); return txt;} //-------------------TEQ---------------------------- static char * OP_TEQ_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(TEQ, "", 16); return txt;} static char * OP_TEQ_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, LSL, "", 16); return txt;} static char * OP_TEQ_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TEQ, LSR, "", 16); return txt;} static char * OP_TEQ_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, LSR, "", 16); return txt;} static char * OP_TEQ_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TEQ, ASR, "", 16); return txt;} static char * OP_TEQ_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, ASR, "", 16); return txt;} static char * OP_TEQ_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(TEQ, "", 16); return txt;} static char * OP_TEQ_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, ROR, "", 16); return txt;} static char * OP_TEQ_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(TEQ, "", 16); return txt;} //-------------CMP------------------------------------- static char * OP_CMP_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(CMP, "", 16); return txt;} static char * OP_CMP_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, LSL, "", 16); return txt;} static char * OP_CMP_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMP, LSR, "", 16); return txt;} static char * OP_CMP_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, LSR, "", 16); return txt;} static char * OP_CMP_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMP, ASR, "", 16); return txt;} static char * OP_CMP_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, ASR, "", 16); return txt;} static char * OP_CMP_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(CMP, "", 16); return txt;} static char * OP_CMP_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, ROR, "", 16); return txt;} static char * OP_CMP_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(CMP, "", 16); return txt;} //---------------CMN--------------------------- static char * OP_CMN_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(CMN, "", 16); return txt;} static char * OP_CMN_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, LSL, "", 16); return txt;} static char * OP_CMN_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMP, ASR, "", 16); return txt;} static char * OP_CMN_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, LSR, "", 16); return txt;} static char * OP_CMN_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMN, ASR, "", 16); return txt;} static char * OP_CMN_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, ASR, "", 16); return txt;} static char * OP_CMN_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(CMN, "", 16); return txt;} static char * OP_CMN_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, ROR, "", 16); return txt;} static char * OP_CMN_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(CMN, "", 16); return txt;} //------------------ORR------------------- static char * OP_ORR_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ORR, ""); return txt;} static char * OP_ORR_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSL, ""); return txt;} static char * OP_ORR_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, LSR, ""); return txt;} static char * OP_ORR_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSR, ""); return txt;} static char * OP_ORR_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, ASR, ""); return txt;} static char * OP_ORR_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ASR, ""); return txt;} static char * OP_ORR_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ORR, ""); return txt;} static char * OP_ORR_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ROR, ""); return txt;} static char * OP_ORR_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ORR, ""); return txt;} static char * OP_ORR_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ORR, "S"); return txt;} static char * OP_ORR_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSL, "S"); return txt;} static char * OP_ORR_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, LSR, "S"); return txt;} static char * OP_ORR_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSR, "S"); return txt;} static char * OP_ORR_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, ASR, "S"); return txt;} static char * OP_ORR_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ASR, "S"); return txt;} static char * OP_ORR_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ORR, "S"); return txt;} static char * OP_ORR_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ROR, "S"); return txt;} static char * OP_ORR_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ORR, "S"); return txt;} //------------------MOV------------------- static char * OP_MOV_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MOV, "", 12); return txt;} static char * OP_MOV_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSL, "", 12); return txt;} static char * OP_MOV_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, LSR, "", 12); return txt;} static char * OP_MOV_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSR, "", 12); return txt;} static char * OP_MOV_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, "", 12); return txt;} static char * OP_MOV_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ASR, "", 12); return txt;} static char * OP_MOV_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MOV, "", 12); return txt;} static char * OP_MOV_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ROR, "", 12); return txt;} static char * OP_MOV_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MOV, "", 12); return txt;} static char * OP_MOV_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MOV, "S", 12); return txt;} static char * OP_MOV_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSL, "S", 12); return txt;} static char * OP_MOV_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, LSR, "S", 12); return txt;} static char * OP_MOV_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSR, "S", 12); return txt;} static char * OP_MOV_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, "S", 12); return txt;} static char * OP_MOV_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ASR, "S", 12); return txt;} static char * OP_MOV_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MOV, "S", 12); return txt;} static char * OP_MOV_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ROR, "S", 12); return txt;} static char * OP_MOV_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MOV, "S", 12); return txt;} //------------------BIC------------------- static char * OP_BIC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(BIC, ""); return txt;} static char * OP_BIC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSL, ""); return txt;} static char * OP_BIC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, LSR, ""); return txt;} static char * OP_BIC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSR, ""); return txt;} static char * OP_BIC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, ASR, ""); return txt;} static char * OP_BIC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ASR, ""); return txt;} static char * OP_BIC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(BIC, ""); return txt;} static char * OP_BIC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ROR, ""); return txt;} static char * OP_BIC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(BIC, ""); return txt;} static char * OP_BIC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(BIC, "S"); return txt;} static char * OP_BIC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSL, "S"); return txt;} static char * OP_BIC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, LSR, "S"); return txt;} static char * OP_BIC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSR, "S"); return txt;} static char * OP_BIC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, ASR, "S"); return txt;} static char * OP_BIC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ASR, "S"); return txt;} static char * OP_BIC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(BIC, "S"); return txt;} static char * OP_BIC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ROR, "S"); return txt;} static char * OP_BIC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(BIC, "S"); return txt;} //------------------MVN------------------- static char * OP_MVN_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MVN, "", 12); return txt;} static char * OP_MVN_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSL, "", 12); return txt;} static char * OP_MVN_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MVN, LSR, "", 12); return txt;} static char * OP_MVN_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSR, "", 12); return txt;} static char * OP_MVN_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MVN, ASR, "", 12); return txt;} static char * OP_MVN_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ASR, "", 12); return txt;} static char * OP_MVN_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MVN, "", 12); return txt;} static char * OP_MVN_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ROR, "", 12); return txt;} static char * OP_MVN_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MVN, "", 12); return txt;} static char * OP_MVN_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MVN, "S", 12); return txt;} static char * OP_MVN_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSL, "S", 12); return txt;} static char * OP_MVN_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MVN, LSR, "S", 12); return txt;} static char * OP_MVN_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSR, "S", 12); return txt;} static char * OP_MVN_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, "S", 12); return txt;} static char * OP_MVN_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ASR, "S", 12); return txt;} static char * OP_MVN_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MVN, "S", 12); return txt;} static char * OP_MVN_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ROR, "S", 12); return txt;} static char * OP_MVN_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MVN, "S", 12); return txt;} //-------------MUL------------------------ static char * OP_MUL(u32 adr, u32 i, char * txt) { sprintf(txt, "MUL%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_MLA(u32 adr, u32 i, char * txt) { sprintf(txt, "MLA%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_MUL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "MUL%sS %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_MLA_S(u32 adr, u32 i, char * txt) { sprintf(txt, "MLA%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} //----------UMUL-------------------------- static char * OP_UMULL(u32 adr, u32 i, char * txt) { sprintf(txt, "UMULL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_UMLAL(u32 adr, u32 i, char * txt) { sprintf(txt, "UMLAL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_UMULL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "UMULL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_UMLAL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "UMLAL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //----------SMUL-------------------------- static char * OP_SMULL(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMULL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //---------------SWP------------------------------ static char * OP_SWP(u32 adr, u32 i, char * txt) { sprintf(txt, "SWP%s %s, %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_SWPB(u32 adr, u32 i, char * txt) { sprintf(txt, "SWPB%s %s, %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} //------------LDRH----------------------------- static char * OP_LDRH_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //------------STRH----------------------------- static char * OP_STRH_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //----------------LDRSH-------------------------- static char * OP_LDRSH_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //----------------------LDRSB---------------------- static char * OP_LDRSB_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //--------------MRS-------------------------------- static char * OP_MRS_CPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MRS%s %s, CPSR", Condition[CONDITION(i)], Registre[REG_POS(i,12)]); return txt;} static char * OP_MRS_SPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MRS%s %s, SPSR", Condition[CONDITION(i)], Registre[REG_POS(i,12)]); return txt;} //--------------MSR-------------------------------- static char * OP_MSR_CPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s CPSR_%s, %s", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_MSR_SPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s SPSR_%s, %s", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_MSR_CPSR_IMM_VAL(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s CPSR_%s, #%X", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], (int)ROR((i&0xFF), ((i>>7)&0x1E))); return txt;} static char * OP_MSR_SPSR_IMM_VAL(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s SPSR_%s, #%X", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], (int)ROR((i&0xFF), (i>>7)&0x1E)); return txt;} //-----------------BRANCH-------------------------- static char * OP_BX(u32 adr, u32 i, char * txt) { sprintf(txt, "BX%s %s", Condition[CONDITION(i)], Registre[REG_POS(i,0)]); return txt;} static char * OP_BLX_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "BLX%s %s", Condition[CONDITION(i)], Registre[REG_POS(i,0)]); return txt;} static char * OP_B(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "BLX%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8)); return txt;} sprintf(txt, "B%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8)); return txt;} static char * OP_BL(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "BLX%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+10)); return txt;} sprintf(txt, "BL%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8)); return txt;} //----------------CLZ------------------------------- static char * OP_CLZ(u32 adr, u32 i, char * txt) { sprintf(txt, "CLZ%s %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)]); return txt;} //--------------------QADD--QSUB------------------------------ static char * OP_QADD(u32 adr, u32 i, char * txt) { sprintf(txt, "QADD%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_QSUB(u32 adr, u32 i, char * txt) { sprintf(txt, "QSUB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_QDADD(u32 adr, u32 i, char * txt) { sprintf(txt, "QDADD%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_QDSUB(u32 adr, u32 i, char * txt) { sprintf(txt, "QDSUB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} //-----------------SMUL------------------------------- static char * OP_SMUL_B_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULBB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMUL_B_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULBT%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMUL_T_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULTB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMUL_T_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULTT%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //-----------SMLA---------------------------- static char * OP_SMLA_B_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLA_B_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLA_T_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLA_T_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} //--------------SMLAL--------------------------------------- static char * OP_SMLAL_B_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_B_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_T_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_T_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //--------------SMULW-------------------- static char * OP_SMULW_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULWB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMULW_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULWT%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //--------------SMLAW------------------- static char * OP_SMLAW_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAWB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLAW_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAWT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} //------------LDR--------------------------- static char * OP_LDR_P_IMM_OFF(u32 adr, u32 i, char * txt) { if(REG_POS(i,16) == 15) sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 + (int)(i&0x7FF))); else sprintf(txt, "LDR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_M_IMM_OFF(u32 adr, u32 i, char * txt) { if(REG_POS(i,16) == 15) sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 - (int)(i&0x7FF))); else sprintf(txt, "LDR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDREX(u32 adr, u32 i, char * txt) { sprintf(txt, "LDREX%s %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)]); return txt;} static char * OP_LDR_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "", "", "]"); return txt;} static char * OP_LDR_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "-", "", "]"); return txt;} static char * OP_LDR_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "", "", "]"); return txt;} static char * OP_LDR_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "M", "", "]"); return txt;} static char * OP_LDR_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "", "", "]"); return txt;} static char * OP_LDR_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "-", "", "]"); return txt;} static char * OP_LDR_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "", "", "]"); return txt;} static char * OP_LDR_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "-", "", "]"); return txt;} static char * OP_LDR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "", "", "]!"); return txt;} static char * OP_LDR_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "-", "", "]!"); return txt;} static char * OP_LDR_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "", "", "]!"); return txt;} static char * OP_LDR_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "-", "", "]!"); return txt;} static char * OP_LDR_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "", "", "]!"); return txt;} static char * OP_LDR_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "-", "", "]!"); return txt;} static char * OP_LDR_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "", "", "]!"); return txt;} static char * OP_LDR_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "-", "", "]!"); return txt;} static char * OP_LDR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_P_IMM_OFF_POSTIND2(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "", "]", ""); return txt;} static char * OP_LDR_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "-", "]", ""); return txt;} static char * OP_LDR_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "", "]", ""); return txt;} static char * OP_LDR_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "-", "]", ""); return txt;} static char * OP_LDR_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "", "]", ""); return txt;} static char * OP_LDR_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "-", "]", ""); return txt;} static char * OP_LDR_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "", "]", ""); return txt;} static char * OP_LDR_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "-", "]", ""); return txt;} //-----------------LDRB------------------------------------------- static char * OP_LDRB_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "", "", "]"); return txt;} static char * OP_LDRB_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "-", "", "]"); return txt;} static char * OP_LDRB_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "", "", "]"); return txt;} static char * OP_LDRB_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "M", "", "]"); return txt;} static char * OP_LDRB_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "", "", "]"); return txt;} static char * OP_LDRB_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "-", "", "]"); return txt;} static char * OP_LDRB_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "", "", "]"); return txt;} static char * OP_LDRB_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "-", "", "]"); return txt;} static char * OP_LDRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "", "", "]!"); return txt;} static char * OP_LDRB_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "-", "", "]!"); return txt;} static char * OP_LDRB_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "", "", "]!"); return txt;} static char * OP_LDRB_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "-", "", "]!"); return txt;} static char * OP_LDRB_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "", "", "]!"); return txt;} static char * OP_LDRB_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "-", "", "]!"); return txt;} static char * OP_LDRB_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "", "", "]!"); return txt;} static char * OP_LDRB_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "-", "", "]!"); return txt;} static char * OP_LDRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "", "]", ""); return txt;} static char * OP_LDRB_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "-", "]", ""); return txt;} static char * OP_LDRB_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "", "]", ""); return txt;} static char * OP_LDRB_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "-", "]", ""); return txt;} static char * OP_LDRB_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "", "]", ""); return txt;} static char * OP_LDRB_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "-", "]", ""); return txt;} static char * OP_LDRB_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "", "]", ""); return txt;} static char * OP_LDRB_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "-", "]", ""); return txt;} //----------------------STR-------------------------------- static char * OP_STR_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STREX(u32 adr, u32 i, char * txt) { sprintf(txt, "STREX%s %s, %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_STR_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "", "", "]"); return txt;} static char * OP_STR_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "-", "", "]"); return txt;} static char * OP_STR_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "", "", "]"); return txt;} static char * OP_STR_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "M", "", "]"); return txt;} static char * OP_STR_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "", "", "]"); return txt;} static char * OP_STR_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "-", "", "]"); return txt;} static char * OP_STR_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "", "", "]"); return txt;} static char * OP_STR_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "-", "", "]"); return txt;} static char * OP_STR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "", "", "]!"); return txt;} static char * OP_STR_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "-", "", "]!"); return txt;} static char * OP_STR_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "", "", "]!"); return txt;} static char * OP_STR_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "-", "", "]!"); return txt;} static char * OP_STR_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "", "", "]!"); return txt;} static char * OP_STR_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "-", "", "]!"); return txt;} static char * OP_STR_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "", "", "]!"); return txt;} static char * OP_STR_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "-", "", "]!"); return txt;} static char * OP_STR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "", "]", ""); return txt;} static char * OP_STR_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "-", "]", ""); return txt;} static char * OP_STR_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "", "]", ""); return txt;} static char * OP_STR_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "-", "]", ""); return txt;} static char * OP_STR_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "", "]", ""); return txt;} static char * OP_STR_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "-", "]", ""); return txt;} static char * OP_STR_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "", "]", ""); return txt;} static char * OP_STR_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "-", "]", ""); return txt;} //-----------------------STRB------------------------------------- static char * OP_STRB_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "", "", "]"); return txt;} static char * OP_STRB_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "-", "", "]"); return txt;} static char * OP_STRB_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "", "", "]"); return txt;} static char * OP_STRB_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "M", "", "]"); return txt;} static char * OP_STRB_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "", "", "]"); return txt;} static char * OP_STRB_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "-", "", "]"); return txt;} static char * OP_STRB_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "", "", "]"); return txt;} static char * OP_STRB_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "-", "", "]"); return txt;} static char * OP_STRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "", "", "]!"); return txt;} static char * OP_STRB_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "-", "", "]!"); return txt;} static char * OP_STRB_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "", "", "]!"); return txt;} static char * OP_STRB_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "-", "", "]!"); return txt;} static char * OP_STRB_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "", "", "]!"); return txt;} static char * OP_STRB_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "-", "", "]!"); return txt;} static char * OP_STRB_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "", "", "]!"); return txt;} static char * OP_STRB_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "-", "", "]!"); return txt;} static char * OP_STRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "", "]", ""); return txt;} static char * OP_STRB_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "-", "]", ""); return txt;} static char * OP_STRB_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "", "]", ""); return txt;} static char * OP_STRB_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "-", "]", ""); return txt;} static char * OP_STRB_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "", "]", ""); return txt;} static char * OP_STRB_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "-", "]", ""); return txt;} static char * OP_STRB_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "", "]", ""); return txt;} static char * OP_STRB_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "-", "]", ""); return txt;} //-----------------------LDRBT------------------------------------- #if 0 static char * OP_LDRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRBT, "", "]", ""); return txt;} static char * OP_LDRBT_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRBT, "-", "]", ""); return txt;} static char * OP_LDRBT_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, LSR, "", "]", ""); return txt;} static char * OP_LDRBT_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, LSR, "-", "]", ""); return txt;} static char * OP_LDRBT_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, ASR, "", "]", ""); return txt;} static char * OP_LDRBT_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, ASR, "-", "]", ""); return txt;} static char * OP_LDRBT_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRBT, "", "]", ""); return txt;} static char * OP_LDRBT_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRBT, "-", "]", ""); return txt;} //----------------------STRBT---------------------------- static char * OP_STRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRBT, "", "]", ""); return txt;} static char * OP_STRBT_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRBT, "-", "]", ""); return txt;} static char * OP_STRBT_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, LSR, "", "]", ""); return txt;} static char * OP_STRBT_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, LSR, "-", "]", ""); return txt;} static char * OP_STRBT_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, ASR, "", "]", ""); return txt;} static char * OP_STRBT_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, ASR, "-", "]", ""); return txt;} static char * OP_STRBT_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRBT, "", "]", ""); return txt;} static char * OP_STRBT_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRBT, "-", "]", ""); return txt;} #endif //---------------------LDM----------------------------- static char * OP_LDMIA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} static char * OP_LDMIB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} static char * OP_LDMDA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} static char * OP_LDMDB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} //------------------------------STM---------------------------------- static char * OP_STMIA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt; } static char * OP_STMDB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt; } //---------------------STC---------------------------------- static char * OP_STC_P_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #%X]", (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s %X, CP%X, [%s, #%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2)); return txt; } static char * OP_STC_M_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #-%X]",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s, #-%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_P_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s, #%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_M_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #-%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s, #-%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_P_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s], #%X",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s], #%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_M_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s], #-%X",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s], #-%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_OPTION(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s], {%X}",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s], {%X}",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } //---------------------LDC---------------------------------- static char * OP_LDC_P_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #%X]",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_M_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #-%X]",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #-%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_P_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_M_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #-%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #-%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_P_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s], #%X",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s], #%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_M_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s], #-%X", (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s], #-%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_OPTION(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s], {%X}", (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s], {%X}",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } /* * * The Enhanced DSP Extension LDRD and STRD instructions. * */ static char * OP_LDRD_STRD_POST_INDEX(u32 adr, u32 i, char * txt) { const char *direction = BIT5(i) ? "STR" : "LDR"; /* U bit - set = add, clear = sub */ char sign = BIT23(i) ? '+' : '-'; int txt_index = 0; txt_index += sprintf( &txt[txt_index], "%s%sD R%d, [R%d], ", direction, Condition[CONDITION(i)], (int)REG_POS(i, 12), (int)REG_POS(i, 16)); /* I bit - set = immediate, clear = reg */ if ( BIT22(i)) { sprintf( &txt[txt_index], "#%c%d", sign, (int)(((i>>4) & 0xF0) | (i&0xF)) ); } else { sprintf( &txt[txt_index], "%cR%d", sign, (int)REG_POS(i, 0)); } return txt; } static char * OP_LDRD_STRD_OFFSET_PRE_INDEX(u32 adr, u32 i, char * txt) { const char *direction = BIT5(i) ? "STR" : "LDR"; /* U bit - set = add, clear = sub */ char sign = BIT23(i) ? '+' : '-'; int txt_index = 0; txt_index += sprintf( &txt[txt_index], "%s%sD R%d, [R%d, ", direction, Condition[CONDITION(i)], (int)REG_POS(i, 12), (int)REG_POS(i, 16)); /* I bit - set = immediate, clear = reg */ if ( BIT22(i)) { if ( BIT21(i)) { /* pre-index */ sprintf( &txt[txt_index], "#%c%d]!", sign, (int)(((i>>4)&0xF0)|(i&0xF))); } else { /* offset */ sprintf( &txt[txt_index], "#%c%d]", sign, (int)(((i>>4)&0xF0)|(i&0xF))); } } else { if ( BIT21(i)) { /* pre-index */ sprintf( &txt[txt_index], "%c%d]!", sign, (int)REG_POS(i, 0)); } else { /* offset */ sprintf( &txt[txt_index], "%c%d]", sign, (int)REG_POS(i, 0)); } } return txt; } //----------------MCR----------------------- static char * OP_MCR(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "MCR2 CP%d, %X, %s, CR%d, CR%d, %X",(int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } sprintf(txt, "MCR%s CP%d, %X, %s, CR%d, CR%d, %X",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } //----------------MRC----------------------- static char * OP_MRC(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "MRC2 CP%d, %X, %s, CR%d, CR%d, %X",(int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } sprintf(txt, "MRC%s CP%d, %X, %s, CR%d, CR%d, %X",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } //--------------SWI-------------------------- static char * OP_SWI(u32 adr, u32 i, char * txt) { sprintf(txt, "SWI%s %X",Condition[CONDITION(i)], (int)((i&0xFFFFFF)>>16)); return txt; } //----------------BKPT------------------------- static char * OP_BKPT(u32 adr, u32 i, char * txt) { sprintf(txt, "BKPT #%X",(int)(((i>>4)&0xFFF)|(i&0xF))); return txt; } //----------------CDP----------------------- static char * OP_CDP(u32 adr, u32 i, char * txt) { sprintf(txt, "CDP-------------------------------"); return txt; } //------------------------------------------------------------ // THUMB //------------------------------------------------------------ #define REG_NUM(i, n) (((i)>>n)&0x7) static char * OP_UND_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "----"); return txt; } static char * OP_LSL_0(u32 adr, u32 i, char * txt) { sprintf(txt, "LSL %s, %s, #0", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSL(u32 adr, u32 i, char * txt) { sprintf(txt, "LSL %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F)); return txt; } static char * OP_LSR_0(u32 adr, u32 i, char * txt) { sprintf(txt, "LSR %s, %s, #0", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSR(u32 adr, u32 i, char * txt) { sprintf(txt, "LSR %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F)); return txt; } static char * OP_ASR_0(u32 adr, u32 i, char * txt) { sprintf(txt, "ASR %s, %s, #0", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ASR(u32 adr, u32 i, char * txt) { sprintf(txt, "ASR %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F)); return txt; } static char * OP_ADD_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_SUB_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB %s, %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_ADD_IMM3(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)REG_NUM(i, 6)); return txt; } static char * OP_SUB_IMM3(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)REG_NUM(i, 6)); return txt; } static char * OP_MOV_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "MOV %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_CMP_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "CMP %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_ADD_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_SUB_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_AND(u32 adr, u32 i, char * txt) { sprintf(txt, "AND %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_EOR(u32 adr, u32 i, char * txt) { sprintf(txt, "EOR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSL_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "LSL %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSR_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "LSR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ASR_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ASR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ADC_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ADC %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_SBC_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "SBC %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ROR_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ROR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_TST(u32 adr, u32 i, char * txt) { sprintf(txt, "TST %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_NEG(u32 adr, u32 i, char * txt) { sprintf(txt, "NEG %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_CMP(u32 adr, u32 i, char * txt) { sprintf(txt, "CMP %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_CMN(u32 adr, u32 i, char * txt) { sprintf(txt, "CMN %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ORR(u32 adr, u32 i, char * txt) { sprintf(txt, "ORR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_MUL_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "MUL %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_BIC(u32 adr, u32 i, char * txt) { sprintf(txt, "BIC %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_MVN(u32 adr, u32 i, char * txt) { sprintf(txt, "MVN %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ADD_SPE(u32 adr, u32 i, char * txt) { u8 Rd = (i&7) | ((i>>4)&8); sprintf(txt, "ADD %s, %s", Registre[Rd], Registre[REG_POS(i, 3)]); return txt; } static char * OP_CMP_SPE(u32 adr, u32 i, char * txt) { u8 Rd = (i&7) | ((i>>4)&8); sprintf(txt, "CMP %s, %s", Registre[Rd], Registre[REG_POS(i, 3)]); return txt; } static char * OP_MOV_SPE(u32 adr, u32 i, char * txt) { u8 Rd = (i&7) | ((i>>4)&8); sprintf(txt, "MOV %s, %s", Registre[Rd], Registre[REG_POS(i, 3)]); return txt; } static char * OP_BX_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "BX %s", Registre[REG_POS(i, 3)]); return txt; } static char * OP_BLX_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "BLX %s", Registre[REG_POS(i, 3)]); return txt; } static char * OP_LDR_PCREL(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [PC, #%X]", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STR_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_STRH_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_STRB_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRSB_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDR_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRH_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRB_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRSH_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_STR_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>4)&0x7C)); return txt; } static char * OP_LDR_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>4)&0x7C)); return txt; } static char * OP_STRB_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6)&0x1F)); return txt; } static char * OP_LDRB_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6)&0x1F)); return txt; } static char * OP_STRH_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>5)&0x3E)); return txt; } static char * OP_LDRH_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>5)&0x3E)); return txt; } static char * OP_STR_SPREL(u32 adr, u32 i, char * txt) { sprintf(txt, "STR %s, [SP, #%X]", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDR_SPREL(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [SP, #%X]", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_ADD_2PC(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, PC, #%X", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_ADD_2SP(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, SP, #%X", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_ADJUST_P_SP(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD SP, #%X", (int)((i&0x7F)<<2)); return txt; } static char * OP_ADJUST_M_SP(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB SP, #%X", (int)((i&0x7F)<<2)); return txt; } static char * OP_PUSH(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "PUSH {%s}", lreg); return txt; } static char * OP_PUSH_LR(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "PUSH {%s, LR}", lreg); return txt; } static char * OP_POP(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "POP {%s}", lreg); return txt; } static char * OP_POP_PC(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "POP {%s, PC}", lreg); return txt; } static char * OP_BKPT_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "BKPT"); return txt; } static char * OP_STMIA_THUMB(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "STMIA %s!, {%s}", Registre[REG_NUM(i, 8)], lreg); return txt; } static char * OP_LDMIA_THUMB(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "LDMIA %s!, {%s}", Registre[REG_NUM(i, 8)], lreg); return txt; } static char * OP_B_COND(u32 adr, u32 i, char * txt) { sprintf(txt, "B%s #%X", Condition[(i>>8)&0xF], (int)(adr+(((s32)((signed char)(i&0xFF)))<<1)+4)); return txt; } static char * OP_SWI_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "SWI #%X", (int)(i & 0xFF)); return txt; } #define SIGNEEXT_IMM11(i) (((i)&0x7FF) | (BIT10(i) * 0xFFFFF800)) static char * OP_B_UNCOND(u32 adr, u32 i, char * txt) { sprintf(txt, "B #%X", (int)(adr+(SIGNEEXT_IMM11(i)<<1)+4)); return txt; } u32 part = 0; static char * OP_BLX(u32 adr, u32 i, char * txt) { sprintf(txt, "BLX #%X", (int)(part + ((i&0x7FF)<<1))&0xFFFFFFFC); return txt; } static char * OP_BL_10(u32 adr, u32 i, char * txt) { part = adr+4 + (SIGNEEXT_IMM11(i)<<12); sprintf(txt, "calculating high part of the address"); return txt; } static char * OP_BL_11(u32 adr, u32 i, char * txt) { sprintf(txt, "BL #%X", (int)(part + ((i&0x7FF)<<1))&0xFFFFFFFC); return txt; } #define TABDECL(x) x const DisasmOpFunc des_arm_instructions_set[4096] = { #include "instruction_tabdef.inc" }; const DisasmOpFunc des_thumb_instructions_set[1024] = { #include "thumb_tabdef.inc" }; desmume-0.9.11/src/OGLRender.cpp0000755000000000000000000026565712467662066015062 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "OGLRender.h" #include #include #include #include "debug.h" #include "gfx3d.h" #include "NDSSystem.h" #include "texcache.h" typedef struct { unsigned int major; unsigned int minor; unsigned int revision; } OGLVersion; static OGLVersion _OGLDriverVersion = {0, 0, 0}; static OpenGLRenderer *_OGLRenderer = NULL; // Lookup Tables static CACHE_ALIGN GLfloat material_8bit_to_float[256] = {0}; static CACHE_ALIGN const GLfloat divide5bitBy31_LUT[32] = {0.0, 0.03225806451613, 0.06451612903226, 0.09677419354839, 0.1290322580645, 0.1612903225806, 0.1935483870968, 0.2258064516129, 0.258064516129, 0.2903225806452, 0.3225806451613, 0.3548387096774, 0.3870967741935, 0.4193548387097, 0.4516129032258, 0.4838709677419, 0.5161290322581, 0.5483870967742, 0.5806451612903, 0.6129032258065, 0.6451612903226, 0.6774193548387, 0.7096774193548, 0.741935483871, 0.7741935483871, 0.8064516129032, 0.8387096774194, 0.8709677419355, 0.9032258064516, 0.9354838709677, 0.9677419354839, 1.0}; static bool BEGINGL() { if(oglrender_beginOpenGL) return oglrender_beginOpenGL(); else return true; } static void ENDGL() { if(oglrender_endOpenGL) oglrender_endOpenGL(); } // Function Pointers bool (*oglrender_init)() = NULL; bool (*oglrender_beginOpenGL)() = NULL; void (*oglrender_endOpenGL)() = NULL; void (*OGLLoadEntryPoints_3_2_Func)() = NULL; void (*OGLCreateRenderer_3_2_Func)(OpenGLRenderer **rendererPtr) = NULL; //------------------------------------------------------------ // Textures #if !defined(GLX_H) OGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 OGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB) #endif // Blending OGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 OGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 OGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT) OGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT) // Shaders OGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 OGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 OGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 OGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 OGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 OGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 OGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 OGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 OGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 OGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 OGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 OGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 OGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 OGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 OGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 OGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 OGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 OGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 OGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 OGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 OGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 OGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 OGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 OGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 OGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO OGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) OGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) OGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // Buffer Objects OGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB) OGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB) OGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB) OGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB) OGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB) OGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB) OGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB) OGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 OGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 OGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 OGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 OGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 OGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 OGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO OGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT) OGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT) OGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT) OGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT) OGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT) OGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT) OGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT) OGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT) OGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT) OGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT) OGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT) OGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT) static void OGLLoadEntryPoints_Legacy() { // Textures #if !defined(GLX_H) INITOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 INITOGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB) #endif // Blending INITOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 INITOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 INITOGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT) INITOGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT) // Shaders INITOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 INITOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 INITOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 INITOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 INITOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 INITOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 INITOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 INITOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 INITOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 INITOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 INITOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 INITOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 INITOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 INITOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 INITOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 INITOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 INITOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 INITOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 INITOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 INITOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 INITOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO INITOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) INITOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) INITOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // Buffer Objects INITOGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB) INITOGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB) INITOGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB) INITOGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB) INITOGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB) INITOGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB) INITOGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB) INITOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 INITOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 INITOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 INITOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 INITOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 INITOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 INITOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO INITOGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT) INITOGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT) INITOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT) INITOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT) INITOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT) INITOGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT) INITOGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT) INITOGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT) INITOGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT) INITOGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT) INITOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT) INITOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT) } // Vertex Shader GLSL 1.00 static const char *vertexShader_100 = {"\ attribute vec4 inPosition; \n\ attribute vec2 inTexCoord0; \n\ attribute vec3 inColor; \n\ \n\ uniform float polyAlpha; \n\ uniform vec2 texScale; \n\ \n\ varying vec4 vtxPosition; \n\ varying vec2 vtxTexCoord; \n\ varying vec4 vtxColor; \n\ \n\ void main() \n\ { \n\ mat2 texScaleMtx = mat2( vec2(texScale.x, 0.0), \n\ vec2( 0.0, texScale.y)); \n\ \n\ vtxPosition = inPosition; \n\ vtxTexCoord = texScaleMtx * inTexCoord0; \n\ vtxColor = vec4(inColor * 4.0, polyAlpha); \n\ \n\ gl_Position = vtxPosition; \n\ } \n\ "}; // Fragment Shader GLSL 1.00 static const char *fragmentShader_100 = {"\ varying vec4 vtxPosition; \n\ varying vec2 vtxTexCoord; \n\ varying vec4 vtxColor; \n\ \n\ uniform sampler2D texMainRender; \n\ uniform sampler1D texToonTable; \n\ \n\ uniform int stateToonShadingMode; \n\ uniform bool stateEnableAlphaTest; \n\ uniform bool stateUseWDepth; \n\ uniform float stateAlphaTestRef; \n\ \n\ uniform int polyMode; \n\ uniform int polyID; \n\ \n\ uniform bool polyEnableTexture; \n\ \n\ void main() \n\ { \n\ vec4 mainTexColor = (polyEnableTexture) ? texture2D(texMainRender, vtxTexCoord) : vec4(1.0, 1.0, 1.0, 1.0); \n\ vec4 tempFragColor = mainTexColor; \n\ \n\ if(polyMode == 0) \n\ { \n\ tempFragColor = vtxColor * mainTexColor; \n\ } \n\ else if(polyMode == 1) \n\ { \n\ tempFragColor.rgb = (polyEnableTexture) ? (mainTexColor.rgb * mainTexColor.a) + (vtxColor.rgb * (1.0 - mainTexColor.a)) : vtxColor.rgb; \n\ tempFragColor.a = vtxColor.a; \n\ } \n\ else if(polyMode == 2) \n\ { \n\ vec3 toonColor = vec3(texture1D(texToonTable, vtxColor.r).rgb); \n\ tempFragColor.rgb = (stateToonShadingMode == 0) ? mainTexColor.rgb * toonColor.rgb : min((mainTexColor.rgb * vtxColor.rgb) + toonColor.rgb, 1.0); \n\ tempFragColor.a = mainTexColor.a * vtxColor.a; \n\ } \n\ else if(polyMode == 3) \n\ { \n\ if (polyID != 0) \n\ { \n\ tempFragColor = vtxColor; \n\ } \n\ } \n\ \n\ if (tempFragColor.a == 0.0 || (stateEnableAlphaTest && tempFragColor.a < stateAlphaTestRef)) \n\ { \n\ discard; \n\ } \n\ \n\ float vertW = (vtxPosition.w == 0.0) ? 0.00000001 : vtxPosition.w; \n\ gl_FragDepth = (stateUseWDepth) ? vtxPosition.w/4096.0 : clamp((vtxPosition.z/vertW) * 0.5 + 0.5, 0.0, 1.0); \n\ gl_FragColor = tempFragColor; \n\ } \n\ "}; FORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix) { const u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F; return (dstPix & 0x0000FF00) << 16 | // R (dstPix & 0x00FF0000) | // G (dstPix & 0xFF000000) >> 16 | // B ((dstPix >> 1) & 0x000000FF); // A } FORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix) { const u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F; return (dstPix & 0x00FF0000) >> 16 | // R (dstPix & 0x0000FF00) | // G (dstPix & 0x000000FF) << 16 | // B ((dstPix >> 1) & 0xFF000000); // A } bool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor, unsigned int checkVersionRevision) { bool result = false; if ( (_OGLDriverVersion.major > checkVersionMajor) || (_OGLDriverVersion.major >= checkVersionMajor && _OGLDriverVersion.minor > checkVersionMinor) || (_OGLDriverVersion.major >= checkVersionMajor && _OGLDriverVersion.minor >= checkVersionMinor && _OGLDriverVersion.revision >= checkVersionRevision) ) { result = true; } return result; } static void OGLGetDriverVersion(const char *oglVersionString, unsigned int *versionMajor, unsigned int *versionMinor, unsigned int *versionRevision) { size_t versionStringLength = 0; if (oglVersionString == NULL) { return; } // First, check for the dot in the revision string. There should be at // least one present. const char *versionStrEnd = strstr(oglVersionString, "."); if (versionStrEnd == NULL) { return; } // Next, check for the space before the vendor-specific info (if present). versionStrEnd = strstr(oglVersionString, " "); if (versionStrEnd == NULL) { // If a space was not found, then the vendor-specific info is not present, // and therefore the entire string must be the version number. versionStringLength = strlen(oglVersionString); } else { // If a space was found, then the vendor-specific info is present, // and therefore the version number is everything before the space. versionStringLength = versionStrEnd - oglVersionString; } // Copy the version substring and parse it. char *versionSubstring = (char *)malloc(versionStringLength * sizeof(char)); strncpy(versionSubstring, oglVersionString, versionStringLength); unsigned int major = 0; unsigned int minor = 0; unsigned int revision = 0; sscanf(versionSubstring, "%u.%u.%u", &major, &minor, &revision); free(versionSubstring); versionSubstring = NULL; if (versionMajor != NULL) { *versionMajor = major; } if (versionMinor != NULL) { *versionMinor = minor; } if (versionRevision != NULL) { *versionRevision = revision; } } static void texDeleteCallback(TexCacheItem *item) { _OGLRenderer->DeleteTexture(item); } template static char OGLInit(void) { char result = 0; Render3DError error = OGLERROR_NOERR; if(!oglrender_init) return result; if(!oglrender_init()) return result; result = Default3D_Init(); if (result == 0) { return result; } if(!BEGINGL()) { INFO("OpenGL<%s,%s>: Could not initialize -- BEGINGL() failed.\n",require_profile?"force":"auto",enable_3_2?"3_2":"old"); result = 0; return result; } // Get OpenGL info const char *oglVersionString = (const char *)glGetString(GL_VERSION); const char *oglVendorString = (const char *)glGetString(GL_VENDOR); const char *oglRendererString = (const char *)glGetString(GL_RENDERER); // Writing to gl_FragDepth causes the driver to fail miserably on systems equipped // with a Intel G965 graphic card. Warn the user and fail gracefully. // http://forums.desmume.org/viewtopic.php?id=9286 if(!strcmp(oglVendorString,"Intel") && strstr(oglRendererString,"965")) { INFO("Incompatible graphic card detected. Disabling OpenGL support.\n"); result = 0; return result; } // Check the driver's OpenGL version OGLGetDriverVersion(oglVersionString, &_OGLDriverVersion.major, &_OGLDriverVersion.minor, &_OGLDriverVersion.revision); if (!IsVersionSupported(OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION)) { INFO("OpenGL: Driver does not support OpenGL v%u.%u.%u or later. Disabling 3D renderer.\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n", OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION, oglVersionString, oglVendorString, oglRendererString); result = 0; return result; } // Create new OpenGL rendering object if(enable_3_2) { if (OGLLoadEntryPoints_3_2_Func != NULL && OGLCreateRenderer_3_2_Func != NULL) { OGLLoadEntryPoints_3_2_Func(); OGLLoadEntryPoints_Legacy(); //zero 04-feb-2013 - this seems to be necessary as well OGLCreateRenderer_3_2_Func(&_OGLRenderer); } else { if(require_profile) return 0; } } // If the renderer doesn't initialize with OpenGL v3.2 or higher, fall back // to one of the lower versions. if (_OGLRenderer == NULL) { OGLLoadEntryPoints_Legacy(); if (IsVersionSupported(2, 1, 0)) { _OGLRenderer = new OpenGLRenderer_2_1; _OGLRenderer->SetVersion(2, 1, 0); } else if (IsVersionSupported(2, 0, 0)) { _OGLRenderer = new OpenGLRenderer_2_0; _OGLRenderer->SetVersion(2, 0, 0); } else if (IsVersionSupported(1, 5, 0)) { _OGLRenderer = new OpenGLRenderer_1_5; _OGLRenderer->SetVersion(1, 5, 0); } else if (IsVersionSupported(1, 4, 0)) { _OGLRenderer = new OpenGLRenderer_1_4; _OGLRenderer->SetVersion(1, 4, 0); } else if (IsVersionSupported(1, 3, 0)) { _OGLRenderer = new OpenGLRenderer_1_3; _OGLRenderer->SetVersion(1, 3, 0); } else if (IsVersionSupported(1, 2, 0)) { _OGLRenderer = new OpenGLRenderer_1_2; _OGLRenderer->SetVersion(1, 2, 0); } } if (_OGLRenderer == NULL) { INFO("OpenGL: Renderer did not initialize. Disabling 3D renderer.\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n", oglVersionString, oglVendorString, oglRendererString); result = 0; return result; } // Initialize OpenGL extensions error = _OGLRenderer->InitExtensions(); if (error != OGLERROR_NOERR) { if ( IsVersionSupported(2, 0, 0) && (error == OGLERROR_SHADER_CREATE_ERROR || error == OGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR || error == OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR) ) { INFO("OpenGL: Shaders are not working, even though they should be. Disabling 3D renderer.\n"); result = 0; return result; } else if (IsVersionSupported(3, 0, 0) && error == OGLERROR_FBO_CREATE_ERROR && OGLLoadEntryPoints_3_2_Func != NULL) { INFO("OpenGL: FBOs are not working, even though they should be. Disabling 3D renderer.\n"); result = 0; return result; } } // Initialization finished -- reset the renderer _OGLRenderer->Reset(); ENDGL(); unsigned int major = 0; unsigned int minor = 0; unsigned int revision = 0; _OGLRenderer->GetVersion(&major, &minor, &revision); INFO("OpenGL: Renderer initialized successfully (v%u.%u.%u).\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n", major, minor, revision, oglVersionString, oglVendorString, oglRendererString); return result; } static void OGLReset() { if(!BEGINGL()) return; _OGLRenderer->Reset(); ENDGL(); } static void OGLClose() { if(!BEGINGL()) return; delete _OGLRenderer; _OGLRenderer = NULL; ENDGL(); Default3D_Close(); } static void OGLRender() { if(!BEGINGL()) return; _OGLRenderer->Render(&gfx3d.renderState, gfx3d.vertlist, gfx3d.polylist, &gfx3d.indexlist, gfx3d.frameCtr); ENDGL(); } static void OGLVramReconfigureSignal() { if(!BEGINGL()) return; _OGLRenderer->VramReconfigureSignal(); ENDGL(); } static void OGLRenderFinish() { if(!BEGINGL()) return; _OGLRenderer->RenderFinish(); ENDGL(); } //automatically select 3.2 or old profile depending on whether 3.2 is available GPU3DInterface gpu3Dgl = { "OpenGL", OGLInit, OGLReset, OGLClose, OGLRender, OGLRenderFinish, OGLVramReconfigureSignal }; //forcibly use old profile GPU3DInterface gpu3DglOld = { "OpenGL Old", OGLInit, OGLReset, OGLClose, OGLRender, OGLRenderFinish, OGLVramReconfigureSignal }; //forcibly use new profile GPU3DInterface gpu3Dgl_3_2 = { "OpenGL 3.2", OGLInit, OGLReset, OGLClose, OGLRender, OGLRenderFinish, OGLVramReconfigureSignal }; OpenGLRenderer::OpenGLRenderer() { versionMajor = 0; versionMinor = 0; versionRevision = 0; } bool OpenGLRenderer::IsExtensionPresent(const std::set *oglExtensionSet, const std::string extensionName) const { if (oglExtensionSet == NULL || oglExtensionSet->size() == 0) { return false; } return (oglExtensionSet->find(extensionName) != oglExtensionSet->end()); } bool OpenGLRenderer::ValidateShaderCompile(GLuint theShader) const { bool isCompileValid = false; GLint status = GL_FALSE; glGetShaderiv(theShader, GL_COMPILE_STATUS, &status); if(status == GL_TRUE) { isCompileValid = true; } else { GLint logSize; GLchar *log = NULL; glGetShaderiv(theShader, GL_INFO_LOG_LENGTH, &logSize); log = new GLchar[logSize]; glGetShaderInfoLog(theShader, logSize, &logSize, log); INFO("OpenGL: SEVERE - FAILED TO COMPILE SHADER : %s\n", log); delete[] log; } return isCompileValid; } bool OpenGLRenderer::ValidateShaderProgramLink(GLuint theProgram) const { bool isLinkValid = false; GLint status = GL_FALSE; glGetProgramiv(theProgram, GL_LINK_STATUS, &status); if(status == GL_TRUE) { isLinkValid = true; } else { GLint logSize; GLchar *log = NULL; glGetProgramiv(theProgram, GL_INFO_LOG_LENGTH, &logSize); log = new GLchar[logSize]; glGetProgramInfoLog(theProgram, logSize, &logSize, log); INFO("OpenGL: SEVERE - FAILED TO LINK SHADER PROGRAM : %s\n", log); delete[] log; } return isLinkValid; } void OpenGLRenderer::GetVersion(unsigned int *major, unsigned int *minor, unsigned int *revision) const { *major = this->versionMajor; *minor = this->versionMinor; *revision = this->versionRevision; } void OpenGLRenderer::SetVersion(unsigned int major, unsigned int minor, unsigned int revision) { this->versionMajor = major; this->versionMinor = minor; this->versionRevision = revision; } void OpenGLRenderer::ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer) { if (srcBuffer == NULL || dstBuffer == NULL) { return; } // Convert from 32-bit BGRA8888 format to 32-bit RGBA6665 reversed format. OpenGL // stores pixels using a flipped Y-coordinate, so this needs to be flipped back // to the DS Y-coordinate. for(int i = 0, y = 191; y >= 0; y--) { u32 *__restrict dst = dstBuffer + (y * GFX3D_FRAMEBUFFER_WIDTH); for(size_t x = 0; x < GFX3D_FRAMEBUFFER_WIDTH; x++, i++) { // Use the correct endian format since OpenGL uses the native endian of // the architecture it is running on. #ifdef WORDS_BIGENDIAN *dst++ = BGRA8888_32_To_RGBA6665_32(srcBuffer[i]); #else *dst++ = BGRA8888_32Rev_To_RGBA6665_32Rev(srcBuffer[i]); #endif } } } OpenGLRenderer_1_2::OpenGLRenderer_1_2() { isVBOSupported = false; isPBOSupported = false; isFBOSupported = false; isMultisampledFBOSupported = false; isShaderSupported = false; isVAOSupported = false; // Init OpenGL rendering states ref = new OGLRenderRef; } OpenGLRenderer_1_2::~OpenGLRenderer_1_2() { if (ref == NULL) { return; } glFinish(); gpuScreen3DHasNewData[0] = false; gpuScreen3DHasNewData[1] = false; delete[] ref->color4fBuffer; ref->color4fBuffer = NULL; DestroyShaders(); DestroyVAOs(); DestroyVBOs(); DestroyPBOs(); DestroyFBOs(); DestroyMultisampledFBO(); //kill the tex cache to free all the texture ids TexCache_Reset(); glBindTexture(GL_TEXTURE_2D, 0); while(!ref->freeTextureIDs.empty()) { GLuint temp = ref->freeTextureIDs.front(); ref->freeTextureIDs.pop(); glDeleteTextures(1, &temp); } glFinish(); // Destroy OpenGL rendering states delete ref; ref = NULL; } Render3DError OpenGLRenderer_1_2::InitExtensions() { Render3DError error = OGLERROR_NOERR; OGLRenderRef &OGLRef = *this->ref; // Get OpenGL extensions std::set oglExtensionSet; this->GetExtensionSet(&oglExtensionSet); // Initialize OpenGL this->InitTables(); this->isShaderSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_shader_objects") && this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_shader") && this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_fragment_shader") && this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_program"); if (this->isShaderSupported) { std::string vertexShaderProgram; std::string fragmentShaderProgram; error = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram); if (error == OGLERROR_NOERR) { error = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; if (error == OGLERROR_SHADER_CREATE_ERROR) { return error; } } else { this->CreateToonTable(); } } else { this->isShaderSupported = false; } } else { INFO("OpenGL: Shaders are unsupported. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); } this->isVBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_buffer_object"); if (this->isVBOSupported) { this->CreateVBOs(); } this->isPBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_buffer_object") && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_pixel_buffer_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_pixel_buffer_object")); if (this->isPBOSupported) { this->CreatePBOs(); } this->isVAOSupported = this->isShaderSupported && this->isVBOSupported && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_array_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_APPLE_vertex_array_object")); if (this->isVAOSupported) { this->CreateVAOs(); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. this->isFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil"); if (this->isFBOSupported) { error = this->CreateFBOs(); if (error != OGLERROR_NOERR) { OGLRef.fboRenderID = 0; this->isFBOSupported = false; } } else { OGLRef.fboRenderID = 0; INFO("OpenGL: FBOs are unsupported. Some emulation features will be disabled.\n"); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. this->isMultisampledFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_multisample"); if (this->isMultisampledFBOSupported) { error = this->CreateMultisampledFBO(); if (error != OGLERROR_NOERR) { OGLRef.selectedRenderingFBO = 0; this->isMultisampledFBOSupported = false; } } else { OGLRef.selectedRenderingFBO = 0; INFO("OpenGL: Multisampled FBOs are unsupported. Multisample antialiasing will be disabled.\n"); } this->InitTextures(); this->InitFinalRenderStates(&oglExtensionSet); // This must be done last return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::CreateVBOs() { OGLRenderRef &OGLRef = *this->ref; glGenBuffersARB(1, &OGLRef.vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, VERTLIST_SIZE * sizeof(VERT), NULL, GL_STREAM_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glGenBuffersARB(1, &OGLRef.iboIndexID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort), NULL, GL_STREAM_DRAW_ARB); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyVBOs() { if (!this->isVBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glDeleteBuffersARB(1, &OGLRef.vboVertexID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); glDeleteBuffersARB(1, &OGLRef.iboIndexID); this->isVBOSupported = false; } Render3DError OpenGLRenderer_1_2::CreatePBOs() { glGenBuffersARB(2, this->ref->pboRenderDataID); for (size_t i = 0; i < 2; i++) { glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]); glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT * sizeof(u32), NULL, GL_STREAM_READ_ARB); } glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyPBOs() { if (!this->isPBOSupported) { return; } glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); glDeleteBuffersARB(2, this->ref->pboRenderDataID); this->isPBOSupported = false; } Render3DError OpenGLRenderer_1_2::LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram) { outVertexShaderProgram->clear(); outFragmentShaderProgram->clear(); *outVertexShaderProgram += std::string(vertexShader_100); *outFragmentShaderProgram += std::string(fragmentShader_100); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupShaderIO() { OGLRenderRef &OGLRef = *this->ref; glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_TexCoord0, "inTexCoord0"); glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Color, "inColor"); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram) { OGLRenderRef &OGLRef = *this->ref; OGLRef.vertexShaderID = glCreateShader(GL_VERTEX_SHADER); if(!OGLRef.vertexShaderID) { INFO("OpenGL: Failed to create the vertex shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } const char *vertexShaderProgramChar = vertexShaderProgram->c_str(); glShaderSource(OGLRef.vertexShaderID, 1, (const GLchar **)&vertexShaderProgramChar, NULL); glCompileShader(OGLRef.vertexShaderID); if (!this->ValidateShaderCompile(OGLRef.vertexShaderID)) { glDeleteShader(OGLRef.vertexShaderID); INFO("OpenGL: Failed to compile the vertex shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } OGLRef.fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); if(!OGLRef.fragmentShaderID) { glDeleteShader(OGLRef.vertexShaderID); INFO("OpenGL: Failed to create the fragment shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } const char *fragmentShaderProgramChar = fragmentShaderProgram->c_str(); glShaderSource(OGLRef.fragmentShaderID, 1, (const GLchar **)&fragmentShaderProgramChar, NULL); glCompileShader(OGLRef.fragmentShaderID); if (!this->ValidateShaderCompile(OGLRef.fragmentShaderID)) { glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); INFO("OpenGL: Failed to compile the fragment shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } OGLRef.shaderProgram = glCreateProgram(); if(!OGLRef.shaderProgram) { glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); INFO("OpenGL: Failed to create the shader program. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } glAttachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID); glAttachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID); this->SetupShaderIO(); glLinkProgram(OGLRef.shaderProgram); if (!this->ValidateShaderProgramLink(OGLRef.shaderProgram)) { glDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID); glDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID); glDeleteProgram(OGLRef.shaderProgram); glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); INFO("OpenGL: Failed to link the shader program. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } glValidateProgram(OGLRef.shaderProgram); glUseProgram(OGLRef.shaderProgram); // Set up shader uniforms GLint uniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, "texMainRender"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, "texToonTable"); glUniform1i(uniformTexSampler, OGLTextureUnitID_ToonTable); OGLRef.uniformTexScale = glGetUniformLocation(OGLRef.shaderProgram, "texScale"); OGLRef.uniformStateToonShadingMode = glGetUniformLocation(OGLRef.shaderProgram, "stateToonShadingMode"); OGLRef.uniformStateEnableAlphaTest = glGetUniformLocation(OGLRef.shaderProgram, "stateEnableAlphaTest"); OGLRef.uniformStateUseWDepth = glGetUniformLocation(OGLRef.shaderProgram, "stateUseWDepth"); OGLRef.uniformStateAlphaTestRef = glGetUniformLocation(OGLRef.shaderProgram, "stateAlphaTestRef"); OGLRef.uniformPolyMode = glGetUniformLocation(OGLRef.shaderProgram, "polyMode"); OGLRef.uniformPolyAlpha = glGetUniformLocation(OGLRef.shaderProgram, "polyAlpha"); OGLRef.uniformPolyID = glGetUniformLocation(OGLRef.shaderProgram, "polyID"); OGLRef.uniformPolyEnableTexture = glGetUniformLocation(OGLRef.shaderProgram, "polyEnableTexture"); INFO("OpenGL: Successfully created shaders.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyShaders() { if(!this->isShaderSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glUseProgram(0); glDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID); glDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID); glDeleteProgram(OGLRef.shaderProgram); glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); this->DestroyToonTable(); this->isShaderSupported = false; } Render3DError OpenGLRenderer_1_2::CreateVAOs() { OGLRenderRef &OGLRef = *this->ref; glGenVertexArrays(1, &OGLRef.vaoMainStatesID); glBindVertexArray(OGLRef.vaoMainStatesID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); glBindVertexArray(0); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyVAOs() { if (!this->isVAOSupported) { return; } glBindVertexArray(0); glDeleteVertexArrays(1, &this->ref->vaoMainStatesID); this->isVAOSupported = false; } Render3DError OpenGLRenderer_1_2::CreateFBOs() { OGLRenderRef &OGLRef = *this->ref; // Set up FBO render targets glGenTextures(1, &OGLRef.texClearImageColorID); glGenTextures(1, &OGLRef.texClearImageDepthStencilID); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL); glBindTexture(GL_TEXTURE_2D, 0); // Set up FBOs glGenFramebuffersEXT(1, &OGLRef.fboClearImageID); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboClearImageID); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, OGLRef.texClearImageColorID, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0); if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { INFO("OpenGL: Failed to created FBOs. Some emulation features will be disabled.\n"); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboClearImageID); glDeleteTextures(1, &OGLRef.texClearImageColorID); glDeleteTextures(1, &OGLRef.texClearImageDepthStencilID); this->isFBOSupported = false; return OGLERROR_FBO_CREATE_ERROR; } // Set up final output FBO OGLRef.fboRenderID = 0; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboRenderID); INFO("OpenGL: Successfully created FBOs.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyFBOs() { if (!this->isFBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboClearImageID); glDeleteTextures(1, &OGLRef.texClearImageColorID); glDeleteTextures(1, &OGLRef.texClearImageDepthStencilID); this->isFBOSupported = false; } Render3DError OpenGLRenderer_1_2::CreateMultisampledFBO() { // Check the maximum number of samples that the driver supports and use that. // Since our target resolution is only 256x192 pixels, using the most samples // possible is the best thing to do. GLint maxSamples = 0; glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples); if (maxSamples < 2) { INFO("OpenGL: Driver does not support at least 2x multisampled FBOs. Multisample antialiasing will be disabled.\n"); return OGLERROR_FEATURE_UNSUPPORTED; } else if (maxSamples > OGLRENDER_MAX_MULTISAMPLES) { maxSamples = OGLRENDER_MAX_MULTISAMPLES; } OGLRenderRef &OGLRef = *this->ref; // Set up FBO render targets glGenRenderbuffersEXT(1, &OGLRef.rboMSFragColorID); glGenRenderbuffersEXT(1, &OGLRef.rboMSFragDepthStencilID); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMSFragColorID); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamples, GL_RGBA, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMSFragDepthStencilID); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamples, GL_DEPTH24_STENCIL8_EXT, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT); // Set up multisampled rendering FBO glGenFramebuffersEXT(1, &OGLRef.fboMSIntermediateRenderID); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboMSIntermediateRenderID); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMSFragColorID); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMSFragDepthStencilID); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMSFragDepthStencilID); if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { INFO("OpenGL: Failed to create multisampled FBO. Multisample antialiasing will be disabled.\n"); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboMSIntermediateRenderID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMSFragColorID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMSFragDepthStencilID); return OGLERROR_FBO_CREATE_ERROR; } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboRenderID); INFO("OpenGL: Successfully created multisampled FBO.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyMultisampledFBO() { if (!this->isMultisampledFBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboMSIntermediateRenderID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMSFragColorID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMSFragDepthStencilID); this->isMultisampledFBOSupported = false; } Render3DError OpenGLRenderer_1_2::InitFinalRenderStates(const std::set *oglExtensionSet) { OGLRenderRef &OGLRef = *this->ref; bool isTexMirroredRepeatSupported = this->IsExtensionPresent(oglExtensionSet, "GL_ARB_texture_mirrored_repeat"); bool isBlendFuncSeparateSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_blend_func_separate"); bool isBlendEquationSeparateSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_blend_equation_separate"); // Blending Support if (isBlendFuncSeparateSupported) { if (isBlendEquationSeparateSupported) { // we want to use alpha destination blending so we can track the last-rendered alpha value // test: new super mario brothers renders the stormclouds at the beginning glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA); glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX); } else { glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_DST_ALPHA); } } else { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } // Mirrored Repeat Mode Support OGLRef.stateTexMirroredRepeat = isTexMirroredRepeatSupported ? GL_MIRRORED_REPEAT : GL_REPEAT; // Always enable depth test, and control using glDepthMask(). glEnable(GL_DEPTH_TEST); // Map the vertex list's colors with 4 floats per color. This is being done // because OpenGL needs 4-colors per vertex to support translucency. (The DS // uses 3-colors per vertex, and adds alpha through the poly, so we can't // simply reference the colors+alpha from just the vertices by themselves.) OGLRef.color4fBuffer = this->isShaderSupported ? NULL : new GLfloat[VERTLIST_SIZE * 4]; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::InitTextures() { this->ExpandFreeTextures(); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::InitTables() { static bool needTableInit = true; if (needTableInit) { for (size_t i = 0; i < 256; i++) material_8bit_to_float[i] = (GLfloat)(i * 4) / 255.0f; needTableInit = false; } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::CreateToonTable() { OGLRenderRef &OGLRef = *this->ref; u16 tempToonTable[32]; memset(tempToonTable, 0, sizeof(tempToonTable)); // The toon table is a special 1D texture where each pixel corresponds // to a specific color in the toon table. glGenTextures(1, &OGLRef.texToonTableID); glBindTexture(GL_TEXTURE_1D, OGLRef.texToonTableID); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, tempToonTable); glBindTexture(GL_TEXTURE_1D, 0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DestroyToonTable() { glDeleteTextures(1, &this->ref->texToonTableID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UploadToonTable(const u16 *toonTableBuffer) { glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, this->ref->texToonTableID); glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 32, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, toonTableBuffer); glActiveTextureARB(GL_TEXTURE0_ARB); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UploadClearImage(const u16 *clearImageColor16Buffer, const u32 *clearImageDepthStencilBuffer) { OGLRenderRef &OGLRef = *this->ref; glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, clearImageColor16Buffer); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, clearImageDepthStencilBuffer); glBindTexture(GL_TEXTURE_2D, 0); glActiveTextureARB(GL_TEXTURE0_ARB); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::GetExtensionSet(std::set *oglExtensionSet) { std::string oglExtensionString = std::string((const char *)glGetString(GL_EXTENSIONS)); size_t extStringStartLoc = 0; size_t delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc); while (delimiterLoc != std::string::npos) { std::string extensionName = oglExtensionString.substr(extStringStartLoc, delimiterLoc - extStringStartLoc); oglExtensionSet->insert(extensionName); extStringStartLoc = delimiterLoc + 1; delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc); } if (extStringStartLoc - oglExtensionString.length() > 0) { std::string extensionName = oglExtensionString.substr(extStringStartLoc, oglExtensionString.length() - extStringStartLoc); oglExtensionSet->insert(extensionName); } } Render3DError OpenGLRenderer_1_2::ExpandFreeTextures() { static const GLsizei kInitTextures = 128; GLuint oglTempTextureID[kInitTextures]; glGenTextures(kInitTextures, oglTempTextureID); for(GLsizei i = 0; i < kInitTextures; i++) { this->ref->freeTextureIDs.push(oglTempTextureID[i]); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, size_t *outIndexCount) { OGLRenderRef &OGLRef = *this->ref; const size_t polyCount = polyList->count; size_t vertIndexCount = 0; for(size_t i = 0; i < polyCount; i++) { const POLY *poly = &polyList->list[indexList->list[i]]; const size_t polyType = poly->type; if (this->isShaderSupported) { for(size_t j = 0; j < polyType; j++) { const GLushort vertIndex = poly->vertIndexes[j]; // While we're looping through our vertices, add each vertex index to // a buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional // vertices here to convert them to GL_TRIANGLES, which are much easier // to work with and won't be deprecated in future OpenGL versions. outIndexBuffer[vertIndexCount++] = vertIndex; if (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP) { if (j == 2) { outIndexBuffer[vertIndexCount++] = vertIndex; } else if (j == 3) { outIndexBuffer[vertIndexCount++] = poly->vertIndexes[0]; } } } } else { const GLfloat thePolyAlpha = (!poly->isWireframe() && poly->isTranslucent()) ? divide5bitBy31_LUT[poly->getAttributeAlpha()] : 1.0f; for(size_t j = 0; j < polyType; j++) { const GLushort vertIndex = poly->vertIndexes[j]; const size_t colorIndex = vertIndex * 4; // Consolidate the vertex color and the poly alpha to our internal color buffer // so that OpenGL can use it. const VERT *vert = &vertList->list[vertIndex]; OGLRef.color4fBuffer[colorIndex+0] = material_8bit_to_float[vert->color[0]]; OGLRef.color4fBuffer[colorIndex+1] = material_8bit_to_float[vert->color[1]]; OGLRef.color4fBuffer[colorIndex+2] = material_8bit_to_float[vert->color[2]]; OGLRef.color4fBuffer[colorIndex+3] = thePolyAlpha; // While we're looping through our vertices, add each vertex index to a // buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional // vertices here to convert them to GL_TRIANGLES, which are much easier // to work with and won't be deprecated in future OpenGL versions. outIndexBuffer[vertIndexCount++] = vertIndex; if (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP) { if (j == 2) { outIndexBuffer[vertIndexCount++] = vertIndex; } else if (j == 3) { outIndexBuffer[vertIndexCount++] = poly->vertIndexes[0]; } } } } } *outIndexCount = vertIndexCount; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount) { OGLRenderRef &OGLRef = *this->ref; if (this->isVAOSupported) { glBindVertexArray(OGLRef.vaoMainStatesID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList); glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), indexBuffer); } else { if (this->isShaderSupported) { glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); if (this->isVBOSupported) { glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), OGLRef.vertIndexBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); } else { glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), &vertList->list[0].coord); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), &vertList->list[0].texcoord); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), &vertList->list[0].color); } } else { glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); if (this->isVBOSupported) { glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), OGLRef.vertIndexBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList); glVertexPointer(4, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glTexCoordPointer(2, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); } else { glVertexPointer(4, GL_FLOAT, sizeof(VERT), &vertList->list[0].coord); glTexCoordPointer(2, GL_FLOAT, sizeof(VERT), &vertList->list[0].texcoord); glColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer); } } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DisableVertexAttributes() { if (this->isVAOSupported) { glBindVertexArray(0); } else { if (this->isShaderSupported) { glDisableVertexAttribArray(OGLVertexAttributeID_Position); glDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glDisableVertexAttribArray(OGLVertexAttributeID_Color); } else { glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } if (this->isVBOSupported) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SelectRenderingFramebuffer() { OGLRenderRef &OGLRef = *this->ref; if (this->isMultisampledFBOSupported) { OGLRef.selectedRenderingFBO = (CommonSettings.GFX3D_Renderer_Multisample) ? OGLRef.fboMSIntermediateRenderID : OGLRef.fboRenderID; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DownsampleFBO() { OGLRenderRef &OGLRef = *this->ref; if (!this->isMultisampledFBOSupported || OGLRef.selectedRenderingFBO != OGLRef.fboMSIntermediateRenderID) { return OGLERROR_NOERR; } glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, OGLRef.fboRenderID); glBlitFramebufferEXT(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboRenderID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::ReadBackPixels() { const size_t i = this->doubleBufferIndex; if (this->isPBOSupported) { this->DownsampleFBO(); glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]); glReadPixels(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0); glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); } this->gpuScreen3DHasNewData[i] = true; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DeleteTexture(const TexCacheItem *item) { this->ref->freeTextureIDs.push((GLuint)item->texid); if(this->currTexture == item) { this->currTexture = NULL; } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::BeginRender(const GFX3D_State *renderState) { OGLRenderRef &OGLRef = *this->ref; this->doubleBufferIndex = (this->doubleBufferIndex + 1) & 0x01; this->SelectRenderingFramebuffer(); if (this->isShaderSupported) { glUniform1i(OGLRef.uniformStateToonShadingMode, renderState->shading); glUniform1i(OGLRef.uniformStateEnableAlphaTest, (renderState->enableAlphaTest) ? GL_TRUE : GL_FALSE); glUniform1i(OGLRef.uniformStateUseWDepth, (renderState->wbuffer) ? GL_TRUE : GL_FALSE); glUniform1f(OGLRef.uniformStateAlphaTestRef, divide5bitBy31_LUT[renderState->alphaTestRef]); } else { if(renderState->enableAlphaTest && (renderState->alphaTestRef > 0)) { glAlphaFunc(GL_GEQUAL, divide5bitBy31_LUT[renderState->alphaTestRef]); } else { glAlphaFunc(GL_GREATER, 0); } } if(renderState->enableAlphaBlending) { glEnable(GL_BLEND); } else { glDisable(GL_BLEND); } glDepthMask(GL_TRUE); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { OGLRenderRef &OGLRef = *this->ref; size_t vertIndexCount = 0; if (!this->isShaderSupported) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); } this->SetupVertices(vertList, polyList, indexList, OGLRef.vertIndexBuffer, &vertIndexCount); this->EnableVertexAttributes(vertList, OGLRef.vertIndexBuffer, vertIndexCount); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { OGLRenderRef &OGLRef = *this->ref; u32 lastTexParams = 0; u32 lastTexPalette = 0; u32 lastPolyAttr = 0; u32 lastViewport = 0xFFFFFFFF; const size_t polyCount = polyList->count; GLushort *indexBufferPtr = this->isVBOSupported ? 0 : OGLRef.vertIndexBuffer; // Map GFX3D_QUADS and GFX3D_QUAD_STRIP to GL_TRIANGLES since we will convert them. // // Also map GFX3D_TRIANGLE_STRIP to GL_TRIANGLES. This is okay since this is actually // how the POLY struct stores triangle strip vertices, which is in sets of 3 vertices // each. This redefinition is necessary since uploading more than 3 indices at a time // will cause glDrawElements() to draw the triangle strip incorrectly. static const GLenum oglPrimitiveType[] = {GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_LINE_LOOP, GL_LINE_LOOP, GL_LINE_STRIP, GL_LINE_STRIP}; static const GLsizei indexIncrementLUT[] = {3, 6, 3, 6, 3, 4, 3, 4}; // Set up initial states, but only if there are polygons to draw if (polyCount > 0) { const POLY *poly = &polyList->list[indexList->list[0]]; lastPolyAttr = poly->polyAttr; this->SetupPolygon(poly); lastTexParams = poly->texParam; lastTexPalette = poly->texPalette; this->SetupTexture(poly, renderState->enableTexturing); lastViewport = poly->viewport; this->SetupViewport(poly->viewport); } for(size_t i = 0; i < polyCount; i++) { const POLY *poly = &polyList->list[indexList->list[i]]; // Set up the polygon if it changed if(lastPolyAttr != poly->polyAttr) { lastPolyAttr = poly->polyAttr; this->SetupPolygon(poly); } // Set up the texture if it changed if(lastTexParams != poly->texParam || lastTexPalette != poly->texPalette) { lastTexParams = poly->texParam; lastTexPalette = poly->texPalette; this->SetupTexture(poly, renderState->enableTexturing); } // Set up the viewport if it changed if(lastViewport != poly->viewport) { lastViewport = poly->viewport; this->SetupViewport(poly->viewport); } // In wireframe mode, redefine all primitives as GL_LINE_LOOP rather than // setting the polygon mode to GL_LINE though glPolygonMode(). Not only is // drawing more accurate this way, but it also allows GFX3D_QUADS and // GFX3D_QUAD_STRIP primitives to properly draw as wireframe without the // extra diagonal line. const GLenum polyPrimitive = !poly->isWireframe() ? oglPrimitiveType[poly->vtxFormat] : GL_LINE_LOOP; // Render the polygon const GLsizei vertIndexCount = indexIncrementLUT[poly->vtxFormat]; glDrawElements(polyPrimitive, vertIndexCount, GL_UNSIGNED_SHORT, indexBufferPtr); indexBufferPtr += vertIndexCount; } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::PostRender() { this->DisableVertexAttributes(); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::EndRender(const u64 frameCount) { //needs to happen before endgl because it could free some textureids for expired cache items TexCache_EvictFrame(); this->ReadBackPixels(); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UpdateClearImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthStencilBuffer) { if (!this->isFBOSupported) { return OGLERROR_FEATURE_UNSUPPORTED; } this->UploadClearImage(colorBuffer, depthStencilBuffer); this->clearImageStencilValue = depthStencilBuffer[0] & 0x3F; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UpdateToonTable(const u16 *toonTableBuffer) { this->UploadToonTable(toonTableBuffer); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::ClearUsingImage() const { if (!this->isFBOSupported) { return OGLERROR_FEATURE_UNSUPPORTED; } OGLRenderRef &OGLRef = *this->ref; glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, OGLRef.fboClearImageID); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); glBlitFramebufferEXT(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); // It might seem wasteful to be doing a separate glClear(GL_STENCIL_BUFFER_BIT) instead // of simply blitting the stencil buffer with everything else. // // We do this because glBlitFramebufferEXT() for GL_STENCIL_BUFFER_BIT has been tested // to be unsupported on ATI/AMD GPUs running in compatibility mode. So we do the separate // glClear() for GL_STENCIL_BUFFER_BIT to keep these GPUs working. glClearStencil(this->clearImageStencilValue); glClear(GL_STENCIL_BUFFER_BIT); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const { glClearColor(divide5bitBy31_LUT[r], divide5bitBy31_LUT[g], divide5bitBy31_LUT[b], divide5bitBy31_LUT[a]); glClearDepth((GLclampd)clearDepth / (GLclampd)0x00FFFFFF); glClearStencil(clearStencil); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupPolygon(const POLY *thePoly) { OGLRenderRef &OGLRef = *this->ref; const PolygonAttributes attr = thePoly->getAttributes(); // Set up polygon attributes if (this->isShaderSupported) { glUniform1i(OGLRef.uniformPolyMode, attr.polygonMode); glUniform1f(OGLRef.uniformPolyAlpha, (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f); glUniform1i(OGLRef.uniformPolyID, attr.polygonID); } else { // Set the texture blending mode static const GLint oglTexBlendMode[4] = {GL_MODULATE, GL_DECAL, GL_MODULATE, GL_MODULATE}; glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, oglTexBlendMode[attr.polygonMode]); } // Set up depth test mode static const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL}; glDepthFunc(oglDepthFunc[attr.enableDepthTest]); // Set up culling mode static const GLenum oglCullingMode[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0}; GLenum cullingMode = oglCullingMode[attr.surfaceCullingMode]; if (cullingMode == 0) { glDisable(GL_CULL_FACE); } else { glEnable(GL_CULL_FACE); glCullFace(cullingMode); } // Set up depth write GLboolean enableDepthWrite = GL_TRUE; // Handle shadow polys. Do this after checking for depth write, since shadow polys // can change this too. if(attr.polygonMode == 3) { glEnable(GL_STENCIL_TEST); if(attr.polygonID == 0) { //when the polyID is zero, we are writing the shadow mask. //set stencilbuf = 1 where the shadow volume is obstructed by geometry. //do not write color or depth information. glStencilFunc(GL_ALWAYS, 65, 255); glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); enableDepthWrite = GL_FALSE; } else { //when the polyid is nonzero, we are drawing the shadow poly. //only draw the shadow poly where the stencilbuf==1. //I am not sure whether to update the depth buffer here--so I chose not to. glStencilFunc(GL_EQUAL, 65, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); enableDepthWrite = GL_TRUE; } } else { glEnable(GL_STENCIL_TEST); if(attr.isTranslucent) { glStencilFunc(GL_NOTEQUAL, attr.polygonID, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else { glStencilFunc(GL_ALWAYS, 64, 255); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } if(attr.isTranslucent && !attr.enableAlphaDepthWrite) { enableDepthWrite = GL_FALSE; } glDepthMask(enableDepthWrite); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupTexture(const POLY *thePoly, bool enableTexturing) { OGLRenderRef &OGLRef = *this->ref; const PolygonTexParams params = thePoly->getTexParams(); // Check if we need to use textures if (thePoly->texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing) { if (this->isShaderSupported) { glUniform1i(OGLRef.uniformPolyEnableTexture, GL_FALSE); } else { glDisable(GL_TEXTURE_2D); } return OGLERROR_NOERR; } // Enable textures if they weren't already enabled if (this->isShaderSupported) { glUniform1i(OGLRef.uniformPolyEnableTexture, GL_TRUE); } else { glEnable(GL_TEXTURE_2D); } // texCacheUnit.TexCache_SetTexture(format, texpal); TexCacheItem *newTexture = TexCache_SetTexture(TexFormat_32bpp, thePoly->texParam, thePoly->texPalette); if(newTexture != this->currTexture) { this->currTexture = newTexture; //has the ogl renderer initialized the texture? if(!this->currTexture->deleteCallback) { this->currTexture->deleteCallback = texDeleteCallback; if(OGLRef.freeTextureIDs.empty()) { this->ExpandFreeTextures(); } this->currTexture->texid = (u64)OGLRef.freeTextureIDs.front(); OGLRef.freeTextureIDs.pop(); glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (params.enableRepeatS ? (params.enableMirroredRepeatS ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (params.enableRepeatT ? (params.enableMirroredRepeatT ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->currTexture->sizeX, this->currTexture->sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, this->currTexture->decoded); } else { //otherwise, just bind it glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); } if (this->isShaderSupported) { glUniform2f(OGLRef.uniformTexScale, this->currTexture->invSizeX, this->currTexture->invSizeY); } else { glMatrixMode(GL_TEXTURE); glLoadIdentity(); glScalef(this->currTexture->invSizeX, this->currTexture->invSizeY, 1.0f); } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupViewport(const u32 viewportValue) { VIEWPORT viewport; viewport.decode(viewportValue); glViewport(viewport.x, viewport.y, viewport.width, viewport.height); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::Reset() { OGLRenderRef &OGLRef = *this->ref; this->gpuScreen3DHasNewData[0] = false; this->gpuScreen3DHasNewData[1] = false; glFinish(); for (size_t i = 0; i < 2; i++) { memset(this->GPU_screen3D[i], 0, sizeof(this->GPU_screen3D[i])); } if(this->isShaderSupported) { glUniform2f(OGLRef.uniformTexScale, 1.0f, 1.0f); glUniform1i(OGLRef.uniformStateToonShadingMode, 0); glUniform1i(OGLRef.uniformStateEnableAlphaTest, GL_TRUE); glUniform1i(OGLRef.uniformStateUseWDepth, GL_FALSE); glUniform1f(OGLRef.uniformStateAlphaTestRef, 0.0f); glUniform1i(OGLRef.uniformPolyMode, 1); glUniform1f(OGLRef.uniformPolyAlpha, 1.0f); glUniform1i(OGLRef.uniformPolyID, 0); glUniform1i(OGLRef.uniformPolyEnableTexture, GL_TRUE); } else { glEnable(GL_NORMALIZE); glEnable(GL_TEXTURE_1D); glEnable(GL_TEXTURE_2D); glAlphaFunc(GL_GREATER, 0); glEnable(GL_ALPHA_TEST); glEnable(GL_BLEND); memset(OGLRef.color4fBuffer, 0, VERTLIST_SIZE * 4 * sizeof(GLfloat)); } memset(OGLRef.vertIndexBuffer, 0, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort)); this->currTexture = NULL; this->doubleBufferIndex = 0; this->clearImageStencilValue = 0; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::RenderFinish() { const size_t i = this->doubleBufferIndex; if (!this->gpuScreen3DHasNewData[i]) { return OGLERROR_NOERR; } OGLRenderRef &OGLRef = *this->ref; if (this->isPBOSupported) { glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]); const u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); if (mappedBufferPtr != NULL) { this->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen); glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); } glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); } else { this->DownsampleFBO(); u32 *__restrict workingBuffer = this->GPU_screen3D[i]; glReadPixels(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, workingBuffer); this->ConvertFramebuffer(workingBuffer, (u32 *)gfx3d_convertedScreen); } this->gpuScreen3DHasNewData[i] = false; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::UploadToonTable(const u16 *toonTableBuffer) { glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, this->ref->texToonTableID); glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 32, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, toonTableBuffer); glActiveTexture(GL_TEXTURE0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::UploadClearImage(const u16 *clearImageColor16Buffer, const u32 *clearImageDepthStencilBuffer) { OGLRenderRef &OGLRef = *this->ref; glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, clearImageColor16Buffer); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, clearImageDepthStencilBuffer); glBindTexture(GL_TEXTURE_2D, 0); glActiveTexture(GL_TEXTURE0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_4::InitFinalRenderStates(const std::set *oglExtensionSet) { OGLRenderRef &OGLRef = *this->ref; bool isBlendEquationSeparateSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_blend_equation_separate"); // Blending Support if (isBlendEquationSeparateSupported) { // we want to use alpha destination blending so we can track the last-rendered alpha value // test: new super mario brothers renders the stormclouds at the beginning glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA); glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX); } else { glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_DST_ALPHA); } // Mirrored Repeat Mode Support OGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT; // Always enable depth test, and control using glDepthMask(). glEnable(GL_DEPTH_TEST); // Map the vertex list's colors with 4 floats per color. This is being done // because OpenGL needs 4-colors per vertex to support translucency. (The DS // uses 3-colors per vertex, and adds alpha through the poly, so we can't // simply reference the colors+alpha from just the vertices by themselves.) OGLRef.color4fBuffer = this->isShaderSupported ? NULL : new GLfloat[VERTLIST_SIZE * 4]; return OGLERROR_NOERR; } OpenGLRenderer_1_5::~OpenGLRenderer_1_5() { glFinish(); DestroyVAOs(); DestroyVBOs(); DestroyPBOs(); } Render3DError OpenGLRenderer_1_5::CreateVBOs() { OGLRenderRef &OGLRef = *this->ref; glGenBuffers(1, &OGLRef.vboVertexID); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferData(GL_ARRAY_BUFFER, VERTLIST_SIZE * sizeof(VERT), NULL, GL_STREAM_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); glGenBuffers(1, &OGLRef.iboIndexID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort), NULL, GL_STREAM_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_5::DestroyVBOs() { if (!this->isVBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteBuffers(1, &OGLRef.vboVertexID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glDeleteBuffers(1, &OGLRef.iboIndexID); this->isVBOSupported = false; } Render3DError OpenGLRenderer_1_5::CreatePBOs() { OGLRenderRef &OGLRef = *this->ref; glGenBuffers(2, OGLRef.pboRenderDataID); for (size_t i = 0; i < 2; i++) { glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]); glBufferData(GL_PIXEL_PACK_BUFFER_ARB, GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT * sizeof(u32), NULL, GL_STREAM_READ); } glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_5::DestroyPBOs() { if (!this->isPBOSupported) { return; } glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); glDeleteBuffers(2, this->ref->pboRenderDataID); this->isPBOSupported = false; } Render3DError OpenGLRenderer_1_5::CreateVAOs() { OGLRenderRef &OGLRef = *this->ref; glGenVertexArrays(1, &OGLRef.vaoMainStatesID); glBindVertexArray(OGLRef.vaoMainStatesID); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); glBindVertexArray(0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount) { OGLRenderRef &OGLRef = *this->ref; if (this->isVAOSupported) { glBindVertexArray(OGLRef.vaoMainStatesID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); } else { if (this->isShaderSupported) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); } else { glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); glBindBuffer(GL_ARRAY_BUFFER, 0); glColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glVertexPointer(4, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glTexCoordPointer(2, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::DisableVertexAttributes() { if (this->isVAOSupported) { glBindVertexArray(0); } else { if (this->isShaderSupported) { glDisableVertexAttribArray(OGLVertexAttributeID_Position); glDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glDisableVertexAttribArray(OGLVertexAttributeID_Color); } else { glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::ReadBackPixels() { const size_t i = this->doubleBufferIndex; if (this->isPBOSupported) { this->DownsampleFBO(); glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]); glReadPixels(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); } this->gpuScreen3DHasNewData[i] = true; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::RenderFinish() { const size_t i = this->doubleBufferIndex; if (!this->gpuScreen3DHasNewData[i]) { return OGLERROR_NOERR; } OGLRenderRef &OGLRef = *this->ref; if (this->isPBOSupported) { glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]); const u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY); if (mappedBufferPtr != NULL) { this->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen); glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); } glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); } else { this->DownsampleFBO(); u32 *__restrict workingBuffer = this->GPU_screen3D[i]; glReadPixels(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, workingBuffer); this->ConvertFramebuffer(workingBuffer, (u32 *)gfx3d_convertedScreen); } this->gpuScreen3DHasNewData[i] = false; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::InitExtensions() { Render3DError error = OGLERROR_NOERR; OGLRenderRef &OGLRef = *this->ref; // Get OpenGL extensions std::set oglExtensionSet; this->GetExtensionSet(&oglExtensionSet); // Initialize OpenGL this->InitTables(); // Load and create shaders. Return on any error, since a v2.0 driver will assume that shaders are available. this->isShaderSupported = true; std::string vertexShaderProgram; std::string fragmentShaderProgram; error = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; return error; } error = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; return error; } this->CreateToonTable(); this->isVBOSupported = true; this->CreateVBOs(); this->isPBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_buffer_object") && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_pixel_buffer_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_pixel_buffer_object")); if (this->isPBOSupported) { this->CreatePBOs(); } this->isVAOSupported = this->isShaderSupported && this->isVBOSupported && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_array_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_APPLE_vertex_array_object")); if (this->isVAOSupported) { this->CreateVAOs(); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. this->isFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil"); if (this->isFBOSupported) { error = this->CreateFBOs(); if (error != OGLERROR_NOERR) { OGLRef.fboRenderID = 0; this->isFBOSupported = false; } } else { OGLRef.fboRenderID = 0; INFO("OpenGL: FBOs are unsupported. Some emulation features will be disabled.\n"); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. this->isMultisampledFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_multisample"); if (this->isMultisampledFBOSupported) { error = this->CreateMultisampledFBO(); if (error != OGLERROR_NOERR) { OGLRef.selectedRenderingFBO = 0; this->isMultisampledFBOSupported = false; } } else { OGLRef.selectedRenderingFBO = 0; INFO("OpenGL: Multisampled FBOs are unsupported. Multisample antialiasing will be disabled.\n"); } this->InitTextures(); this->InitFinalRenderStates(&oglExtensionSet); // This must be done last return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::InitFinalRenderStates(const std::set *oglExtensionSet) { OGLRenderRef &OGLRef = *this->ref; // we want to use alpha destination blending so we can track the last-rendered alpha value // test: new super mario brothers renders the stormclouds at the beginning // Blending Support glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA); glBlendEquationSeparate(GL_FUNC_ADD, GL_MAX); // Mirrored Repeat Mode Support OGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT; // Always enable depth test, and control using glDepthMask(). glEnable(GL_DEPTH_TEST); // Ignore our color buffer since we'll transfer the polygon alpha through a uniform. OGLRef.color4fBuffer = NULL; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, size_t *outIndexCount) { const size_t polyCount = polyList->count; size_t vertIndexCount = 0; for(size_t i = 0; i < polyCount; i++) { const POLY *poly = &polyList->list[indexList->list[i]]; const size_t polyType = poly->type; for(size_t j = 0; j < polyType; j++) { const GLushort vertIndex = poly->vertIndexes[j]; // While we're looping through our vertices, add each vertex index to // a buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional // vertices here to convert them to GL_TRIANGLES, which are much easier // to work with and won't be deprecated in future OpenGL versions. outIndexBuffer[vertIndexCount++] = vertIndex; if (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP) { if (j == 2) { outIndexBuffer[vertIndexCount++] = vertIndex; } else if (j == 3) { outIndexBuffer[vertIndexCount++] = poly->vertIndexes[0]; } } } } *outIndexCount = vertIndexCount; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const size_t vertIndexCount) { OGLRenderRef &OGLRef = *this->ref; if (this->isVAOSupported) { glBindVertexArray(OGLRef.vaoMainStatesID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); } else { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::DisableVertexAttributes() { if (this->isVAOSupported) { glBindVertexArray(0); } else { glDisableVertexAttribArray(OGLVertexAttributeID_Position); glDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glDisableVertexAttribArray(OGLVertexAttributeID_Color); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::BeginRender(const GFX3D_State *renderState) { OGLRenderRef &OGLRef = *this->ref; this->doubleBufferIndex = (this->doubleBufferIndex + 1) & 0x01; this->SelectRenderingFramebuffer(); glUniform1i(OGLRef.uniformStateToonShadingMode, renderState->shading); glUniform1i(OGLRef.uniformStateEnableAlphaTest, (renderState->enableAlphaTest) ? GL_TRUE : GL_FALSE); glUniform1i(OGLRef.uniformStateUseWDepth, (renderState->wbuffer) ? GL_TRUE : GL_FALSE); glUniform1f(OGLRef.uniformStateAlphaTestRef, divide5bitBy31_LUT[renderState->alphaTestRef]); if(renderState->enableAlphaBlending) { glEnable(GL_BLEND); } else { glDisable(GL_BLEND); } glDepthMask(GL_TRUE); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { OGLRenderRef &OGLRef = *this->ref; size_t vertIndexCount = 0; this->SetupVertices(vertList, polyList, indexList, OGLRef.vertIndexBuffer, &vertIndexCount); this->EnableVertexAttributes(vertList, OGLRef.vertIndexBuffer, vertIndexCount); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::SetupPolygon(const POLY *thePoly) { OGLRenderRef &OGLRef = *this->ref; const PolygonAttributes attr = thePoly->getAttributes(); // Set up polygon attributes glUniform1i(OGLRef.uniformPolyMode, attr.polygonMode); glUniform1f(OGLRef.uniformPolyAlpha, (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f); glUniform1i(OGLRef.uniformPolyID, attr.polygonID); // Set up depth test mode static const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL}; glDepthFunc(oglDepthFunc[attr.enableDepthTest]); // Set up culling mode static const GLenum oglCullingMode[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0}; GLenum cullingMode = oglCullingMode[attr.surfaceCullingMode]; if (cullingMode == 0) { glDisable(GL_CULL_FACE); } else { glEnable(GL_CULL_FACE); glCullFace(cullingMode); } // Set up depth write GLboolean enableDepthWrite = GL_TRUE; // Handle shadow polys. Do this after checking for depth write, since shadow polys // can change this too. if(attr.polygonMode == 3) { glEnable(GL_STENCIL_TEST); if(attr.polygonID == 0) { //when the polyID is zero, we are writing the shadow mask. //set stencilbuf = 1 where the shadow volume is obstructed by geometry. //do not write color or depth information. glStencilFunc(GL_ALWAYS, 65, 255); glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); enableDepthWrite = GL_FALSE; } else { //when the polyid is nonzero, we are drawing the shadow poly. //only draw the shadow poly where the stencilbuf==1. //I am not sure whether to update the depth buffer here--so I chose not to. glStencilFunc(GL_EQUAL, 65, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); enableDepthWrite = GL_TRUE; } } else { glEnable(GL_STENCIL_TEST); if(attr.isTranslucent) { glStencilFunc(GL_NOTEQUAL, attr.polygonID, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else { glStencilFunc(GL_ALWAYS, 64, 255); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } if(attr.isTranslucent && !attr.enableAlphaDepthWrite) { enableDepthWrite = GL_FALSE; } glDepthMask(enableDepthWrite); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::SetupTexture(const POLY *thePoly, bool enableTexturing) { OGLRenderRef &OGLRef = *this->ref; const PolygonTexParams params = thePoly->getTexParams(); // Check if we need to use textures if (thePoly->texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing) { glUniform1i(OGLRef.uniformPolyEnableTexture, GL_FALSE); return OGLERROR_NOERR; } glUniform1i(OGLRef.uniformPolyEnableTexture, GL_TRUE); // texCacheUnit.TexCache_SetTexture(format, texpal); TexCacheItem *newTexture = TexCache_SetTexture(TexFormat_32bpp, thePoly->texParam, thePoly->texPalette); if(newTexture != this->currTexture) { this->currTexture = newTexture; //has the ogl renderer initialized the texture? if(!this->currTexture->deleteCallback) { this->currTexture->deleteCallback = texDeleteCallback; if(OGLRef.freeTextureIDs.empty()) { this->ExpandFreeTextures(); } this->currTexture->texid = (u64)OGLRef.freeTextureIDs.front(); OGLRef.freeTextureIDs.pop(); glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (params.enableRepeatS ? (params.enableMirroredRepeatS ? GL_MIRRORED_REPEAT : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (params.enableRepeatT ? (params.enableMirroredRepeatT ? GL_MIRRORED_REPEAT : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->currTexture->sizeX, this->currTexture->sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, this->currTexture->decoded); } else { //otherwise, just bind it glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); } glUniform2f(OGLRef.uniformTexScale, this->currTexture->invSizeX, this->currTexture->invSizeY); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_1::ReadBackPixels() { const size_t i = this->doubleBufferIndex; this->DownsampleFBO(); glBindBuffer(GL_PIXEL_PACK_BUFFER, this->ref->pboRenderDataID[i]); glReadPixels(0, 0, GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); this->gpuScreen3DHasNewData[i] = true; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_1::RenderFinish() { const size_t i = this->doubleBufferIndex; if (!this->gpuScreen3DHasNewData[i]) { return OGLERROR_NOERR; } glBindBuffer(GL_PIXEL_PACK_BUFFER, this->ref->pboRenderDataID[i]); const u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); if (mappedBufferPtr != NULL) { this->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen); glUnmapBuffer(GL_PIXEL_PACK_BUFFER); } glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); this->gpuScreen3DHasNewData[i] = false; return OGLERROR_NOERR; } desmume-0.9.11/src/desmume_config.h0000755000000000000000000000177112467662066015713 0ustar rootroot/* Copyright (C) 2009-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _DESMUME_GTK_CONFIG #define _DESMUME_GTK_CONFIG GKeyFile *desmume_config_read_file(const u16 *); void desmume_config_dispose(GKeyFile *); gboolean desmume_config_update_keys(GKeyFile*); gboolean desmume_config_update_joykeys(GKeyFile*); gboolean desmume_config_read_keys(GKeyFile*); gboolean desmume_config_read_joykeys(GKeyFile*); #endif desmume-0.9.11/src/render3D.cpp0000755000000000000000000001503412467662066014725 0ustar rootroot/* Copyright (C) 2006-2007 shash Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "render3D.h" #include #include "gfx3d.h" #include "MMU.h" #include "texcache.h" static CACHE_ALIGN u32 dsDepthToD24S8_LUT[32768] = {0}; int cur3DCore = GPU3D_NULL; GPU3DInterface gpu3DNull = { "None", Default3D_Init, Default3D_Reset, Default3D_Close, Default3D_Render, Default3D_RenderFinish, Default3D_VramReconfigureSignal }; GPU3DInterface *gpu3D = &gpu3DNull; static bool default3DAlreadyClearedLayer = false; char Default3D_Init() { default3DAlreadyClearedLayer = false; return 1; } void Default3D_Reset() { default3DAlreadyClearedLayer = false; TexCache_Reset(); } void Default3D_Close() { memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen)); default3DAlreadyClearedLayer = false; } void Default3D_Render() { if (!default3DAlreadyClearedLayer) { memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen)); default3DAlreadyClearedLayer = true; } } void Default3D_RenderFinish() { // Do nothing } void Default3D_VramReconfigureSignal() { TexCache_Invalidate(); } void NDS_3D_SetDriver (int core3DIndex) { cur3DCore = core3DIndex; gpu3D = core3DList[cur3DCore]; } bool NDS_3D_ChangeCore(int newCore) { gpu3D->NDS_3D_Close(); NDS_3D_SetDriver(newCore); if(gpu3D->NDS_3D_Init() == 0) { NDS_3D_SetDriver(GPU3D_NULL); gpu3D->NDS_3D_Init(); return false; } return true; } Render3D::Render3D() { static bool needTableInit = true; if (needTableInit) { for (size_t i = 0; i < 32768; i++) { dsDepthToD24S8_LUT[i] = (u32)DS_DEPTH15TO24(i) << 8; } needTableInit = false; } Reset(); } Render3DError Render3D::BeginRender(const GFX3D_State *renderState) { return RENDER3DERROR_NOERR; } Render3DError Render3D::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { return RENDER3DERROR_NOERR; } Render3DError Render3D::DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { return RENDER3DERROR_NOERR; } Render3DError Render3D::PostRender() { return RENDER3DERROR_NOERR; } Render3DError Render3D::EndRender(const u64 frameCount) { return RENDER3DERROR_NOERR; } Render3DError Render3D::UpdateClearImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthStencilBuffer) { return RENDER3DERROR_NOERR; } Render3DError Render3D::UpdateToonTable(const u16 *toonTableBuffer) { return RENDER3DERROR_NOERR; } Render3DError Render3D::ClearFramebuffer(const GFX3D_State *renderState) { Render3DError error = RENDER3DERROR_NOERR; struct GFX3D_ClearColor { u8 r; u8 g; u8 b; u8 a; } clearColor; clearColor.r = renderState->clearColor & 0x1F; clearColor.g = (renderState->clearColor >> 5) & 0x1F; clearColor.b = (renderState->clearColor >> 10) & 0x1F; clearColor.a = (renderState->clearColor >> 16) & 0x1F; const u8 polyID = (renderState->clearColor >> 24) & 0x3F; if (renderState->enableClearImage) { const u16 *__restrict clearColorBuffer = (u16 *__restrict)MMU.texInfo.textureSlotAddr[2]; const u16 *__restrict clearDepthBuffer = (u16 *__restrict)MMU.texInfo.textureSlotAddr[3]; const u16 scrollBits = T1ReadWord(MMU.ARM9_REG, 0x356); //CLRIMAGE_OFFSET const u8 xScroll = scrollBits & 0xFF; const u8 yScroll = (scrollBits >> 8) & 0xFF; size_t dd = (GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT) - GFX3D_FRAMEBUFFER_WIDTH; for (size_t iy = 0; iy < GFX3D_FRAMEBUFFER_HEIGHT; iy++) { const size_t y = ((iy + yScroll) & 0xFF) << 8; for (size_t ix = 0; ix < GFX3D_FRAMEBUFFER_WIDTH; ix++) { const size_t x = (ix + xScroll) & 0xFF; const size_t adr = y + x; this->clearImageColor16Buffer[dd] = clearColorBuffer[adr]; this->clearImageDepthStencilBuffer[dd] = dsDepthToD24S8_LUT[clearDepthBuffer[adr] & 0x7FFF] | polyID; dd++; } dd -= GFX3D_FRAMEBUFFER_WIDTH * 2; } error = this->UpdateClearImage(this->clearImageColor16Buffer, this->clearImageDepthStencilBuffer); if (error == RENDER3DERROR_NOERR) { error = this->ClearUsingImage(); } else { error = this->ClearUsingValues(clearColor.r, clearColor.g, clearColor.b, clearColor.a, renderState->clearDepth, polyID); } } else { error = this->ClearUsingValues(clearColor.r, clearColor.g, clearColor.b, clearColor.a, renderState->clearDepth, polyID); } return error; } Render3DError Render3D::ClearUsingImage() const { return RENDER3DERROR_NOERR; } Render3DError Render3D::ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const { return RENDER3DERROR_NOERR; } Render3DError Render3D::SetupPolygon(const POLY *thePoly) { return RENDER3DERROR_NOERR; } Render3DError Render3D::SetupTexture(const POLY *thePoly, bool enableTexturing) { return RENDER3DERROR_NOERR; } Render3DError Render3D::SetupViewport(const u32 viewportValue) { return RENDER3DERROR_NOERR; } Render3DError Render3D::Reset() { memset(this->clearImageColor16Buffer, 0, sizeof(this->clearImageColor16Buffer)); memset(this->clearImageDepthStencilBuffer, 0, sizeof(this->clearImageDepthStencilBuffer)); return RENDER3DERROR_NOERR; } Render3DError Render3D::Render(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, const u64 frameCount) { Render3DError error = RENDER3DERROR_NOERR; error = this->BeginRender(renderState); if (error != RENDER3DERROR_NOERR) { return error; } this->UpdateToonTable(renderState->u16ToonTable); this->ClearFramebuffer(renderState); this->PreRender(renderState, vertList, polyList, indexList); this->DoRender(renderState, vertList, polyList, indexList); this->PostRender(); this->EndRender(frameCount); return error; } Render3DError Render3D::RenderFinish() { return RENDER3DERROR_NOERR; } Render3DError Render3D::VramReconfigureSignal() { TexCache_Invalidate(); return RENDER3DERROR_NOERR; } desmume-0.9.11/src/mc.cpp0000755000000000000000000011137412467662066013662 0ustar rootroot/* Copyright (C) 2006 thoduv Copyright (C) 2006-2007 Theo Berkau Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "mc.h" #include #include #include "common.h" #include "armcpu.h" #include "debug.h" #include "movie.h" #include "MMU.h" #include "readwrite.h" #include "NDSSystem.h" #include "path.h" #include "utils/advanscene.h" //#define _DONT_SAVE_BACKUP //#define _MCLOG // TODO: motion device was broken //#define _ENABLE_MOTION #define BM_CMD_NOP 0x00 #define BM_CMD_AUTODETECT 0xFF #define BM_CMD_WRITESTATUS 0x01 #define BM_CMD_WRITELOW 0x02 #define BM_CMD_READLOW 0x03 #define BM_CMD_WRITEDISABLE 0x04 #define BM_CMD_READSTATUS 0x05 #define BM_CMD_WRITEENABLE 0x06 #define BM_CMD_WRITEHIGH 0x0A #define BM_CMD_READHIGH 0x0B // Pokemons IrDA #define BM_CMD_IRDA 0x08 //FLASH #define COMM_PAGE_WRITE 0x0A #define COMM_PAGE_ERASE 0xDB #define COMM_SECTOR_ERASE 0xD8 #define COMM_CHIP_ERASE 0xC7 #define CARDFLASH_READ_BYTES_FAST 0x0B /* Not used*/ #define CARDFLASH_DEEP_POWDOWN 0xB9 /* Not used*/ #define CARDFLASH_WAKEUP 0xAB /* Not used*/ #ifdef _MCLOG #define MCLOG(...) printf(__VA_ARGS__) #else #define MCLOG(...) #endif static const char* DESMUME_BACKUP_FOOTER_TXT = "|<--Snip above here to create a raw sav by excluding this DeSmuME savedata footer:"; static const char* kDesmumeSaveCookie = "|-DESMUME SAVE-|"; static const u32 saveSizes[] = {512, // 4k 8*1024, // 64k 32*1024, // 512k 64*1024, // 1Mbit 256*1024, // 2Mbit 512*1024, // 4Mbit 1024*1024, // 8Mbit 2048*1024, // 16Mbit 4096*1024, // 32Mbit 8192*1024, // 64Mbit 16384*1024, // 128Mbit 32768*1024, // 256Mbit 65536*1024, // 512Mbit 0xFFFFFFFF}; static const u32 saveSizes_count = ARRAY_SIZE(saveSizes); //the lookup table from user save types to save parameters const SAVE_TYPE save_types[] = { {"Autodetect", MC_TYPE_AUTODETECT, 1, 0}, {"EEPROM 4kbit", MC_TYPE_EEPROM1, MC_SIZE_4KBITS , 1}, {"EEPROM 64kbit", MC_TYPE_EEPROM2, MC_SIZE_64KBITS , 2}, {"EEPROM 512kbit", MC_TYPE_EEPROM2, MC_SIZE_512KBITS , 2}, {"FRAM 256kbit", MC_TYPE_FRAM, MC_SIZE_256KBITS , 2}, {"FLASH 2Mbit", MC_TYPE_FLASH, MC_SIZE_2MBITS , 3}, {"FLASH 4Mbit", MC_TYPE_FLASH, MC_SIZE_4MBITS , 3}, {"FLASH 8Mbit", MC_TYPE_FLASH, MC_SIZE_8MBITS , 3}, {"FLASH 16Mbit", MC_TYPE_FLASH, MC_SIZE_16MBITS , 3}, {"FLASH 32Mbit", MC_TYPE_FLASH, MC_SIZE_32MBITS , 3}, {"FLASH 64Mbit", MC_TYPE_FLASH, MC_SIZE_64MBITS , 3}, {"FLASH 128Mbit", MC_TYPE_FLASH, MC_SIZE_128MBITS , 3}, {"FLASH 256Mbit", MC_TYPE_FLASH, MC_SIZE_256MBITS , 3}, {"FLASH 512Mbit", MC_TYPE_FLASH, MC_SIZE_512MBITS , 3} }; //forces the currently selected backup type to be current //(can possibly be used to repair poorly chosen save types discovered late in gameplay i.e. pokemon gamers) void backup_forceManualBackupType() { MMU_new.backupDevice.forceManualBackupType(); } void backup_setManualBackupType(int type) { CommonSettings.manualBackupType = type; } bool BackupDevice::save_state(EMUFILE* os) { u32 savePos = fpMC->ftell(); std::vector data(fsize); fpMC->fseek(0, SEEK_SET); if(data.size()!=0) fpMC->fread((char *)&data[0], fsize); u32 version = 5; //v0 write32le(version,os); write32le(write_enable,os); write32le(com,os); write32le(addr_size,os); write32le(addr_counter,os); write32le((u32)state,os); writebuffer(data,os); writebuffer(data_autodetect,os); //v1 write32le(addr,os); //v2 write8le(motionInitState,os); write8le(motionFlag,os); //v3 writebool(reset_command_state,os); //v4 write8le(write_protect,os); //v5 write32le(savePos,os); fpMC->fseek(savePos, SEEK_SET); data.clear(); return true; } bool BackupDevice::load_state(EMUFILE* is) { u32 version; u32 temp; std::vector data; if(read32le(&version,is)!=1) return false; if(version>=0) { readbool(&write_enable,is); read32le(&com,is); read32le(&addr_size,is); read32le(&addr_counter,is); read32le(&temp,is); state = (STATE)temp; readbuffer(data,is); readbuffer(data_autodetect,is); } if(version>=1) read32le(&addr,is); if(version>=2) { read8le(&motionInitState,is); read8le(&motionFlag,is); } if(version>=3) { readbool(&reset_command_state,is); } if(version>=4) { read8le(&write_protect,is); } fsize = data.size(); #ifndef _DONT_SAVE_BACKUP fpMC->fseek(0, SEEK_SET); if(data.size()!=0) fpMC->fwrite((char *)&data[0], fsize); ensure(data.size(), fpMC); #endif if(version>=5) { read32le(&temp,is); fpMC->fseek(temp, SEEK_SET); } else fpMC->fseek(addr, SEEK_SET); return true; } BackupDevice::BackupDevice() { fpMC = NULL; fsize = 0; addr_size = 0; isMovieMode = false; //default for most games; will be altered where appropriate //usually 0xFF, but occasionally others. If these exceptions could be related to a particular backup memory type, that would be helpful. //at first we assumed it would be 0x00, but baby pals proved that it should be 0xFF: // the game reads its initial sound volumes from uninitialized data, and if it is 0, the game will be silent // if it is 0xFF then the game starts with its sound and music at max, as presumably it is supposed to. // so in r3303 we finally changed it (no$ appears definitely to initialize to 0xFF) uninitializedValue = 0xFF; if (gameInfo.romsize == 0) return; char buf[MAX_PATH] = {0}; memset(buf, 0, MAX_PATH); path.getpathnoext(path.BATTERY, buf); filename = std::string(buf) + ".dsv"; MCLOG("MC: %s\n", filename.c_str()); bool fexists = (access(filename.c_str(), 0) == 0)?true:false; if (fexists && CommonSettings.backupSave) { std::string tmp_fsav = std::string(buf) + ".dsv.bak"; EMUFILE_FILE *in = new EMUFILE_FILE(filename, "rb"); if (!in->fail()) { u32 sz = in->size(); if (sz > 0) { EMUFILE_FILE *out = new EMUFILE_FILE(tmp_fsav, "wb"); if (!out->fail()) { u8 *data = new u8[sz]; in->fread(data, sz); out->fwrite(data, sz); delete [] data; } else { printf("BackupDevice: Could not create the backup save file.\n"); } delete out; } } else { printf("BackupDevice: Could not read the save file for creating a backup.\n"); } delete in; } if (!fexists) { printf("BackupDevice: DeSmuME .dsv save file not found. Trying to load a .sav file.\n"); std::string tmp_fsav = std::string(buf) + ".sav"; EMUFILE_FILE *fpTmp = new EMUFILE_FILE(tmp_fsav, "rb"); if (!fpTmp->fail()) { u32 sz = fpTmp->size(); if (sz > 0) { EMUFILE_FILE *fpOut = new EMUFILE_FILE(filename, "wb"); if (!fpOut->fail()) { u8 *buf = new u8[sz + 1]; if ((buf) && (fpTmp->fread(buf, sz) == sz)) { if (no_gba_unpack(buf, sz)) { printf("BackupDevice: Converting no$gba .sav file.\n"); } else { printf("BackupDevice: Converting old raw .sav file.\n"); sz = trim(buf, sz); } if (fpOut->fwrite(buf, sz) == sz) { u8 res = searchFileSaveType(sz); if (res != 0xFF) { info.type = (res + 1); addr_size = info.addr_size = save_types[info.type].addr_size; info.size = fsize = sz; ensure(sz, fpOut); fsize = 0; } else info.type = 0; fexists = true; } else { printf("BackupDevice: Error converting .sav file.\n"); } } delete [] buf; } delete fpOut; } } delete fpTmp; } fpMC = new EMUFILE_FILE(filename, fexists?"rb+":"wb+"); const bool fileCanReadWrite = (fpMC->get_fp() != NULL); if (!fileCanReadWrite) { delete fpMC; fpMC = new EMUFILE_MEMORY(); printf("BackupDevice: WARNING! Failed to get read/write access to the save file! Will operate in RAM instead.\n"); } if (!fpMC->fail()) { fsize = fpMC->size(); if (fsize < saveSizes[0]) fpMC->truncate(0); if (readFooter() == 0) fsize -= (strlen(kDesmumeSaveCookie) + strlen(DESMUME_BACKUP_FOOTER_TXT) + 24); else { memset(&info, 0, sizeof(info)); fsize = 0; } fpMC->fseek(0, SEEK_SET); u32 left = 0; if (CommonSettings.autodetectBackupMethod == 1) { if (advsc.isLoaded()) { info.type = advsc.getSaveType(); if (info.type != 0xFF && info.type != 0xFE) { info.type++; u32 adv_size = save_types[info.type].size; if (info.size > adv_size) { info.size = adv_size; fpMC->truncate(adv_size); ensure(adv_size, fpMC); } else if (info.size < adv_size) { left = adv_size - info.size; info.size = adv_size; ensure(adv_size); } fsize = adv_size; } } } addr_size = info.addr_size; info.padSize = fsize; //none of the other fields are used right now if (CommonSettings.autodetectBackupMethod != 1 && info.type == 0) { info.type = searchFileSaveType(info.size); if (info.type == 0xFF) info.type = 0; } u32 ss = (info.padSize * 8) / 1024; bool _Mbit = false; if (ss >= 1024) { ss /= 1024; _Mbit = true; } if (ss > 0) printf("BackupDevice: size = %u %cbit\n", ss, _Mbit?'M':'K'); } state = (fsize > 0)?RUNNING:DETECTING; reset(); } BackupDevice::~BackupDevice() { delete fpMC; fpMC = NULL; } int BackupDevice::readFooter() { // Check if the footer data exists. if (fpMC->size() < (strlen(kDesmumeSaveCookie) + strlen(DESMUME_BACKUP_FOOTER_TXT) + 24)) { return -1; } //scan for desmume save footer const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie); char *sigbuf = new char[cookieLen]; fpMC->fseek(-cookieLen, SEEK_END); fpMC->fread(sigbuf, cookieLen); int cmp = memcmp(sigbuf,kDesmumeSaveCookie,cookieLen); delete[] sigbuf; if (cmp) return -1; //desmume format fpMC->fseek(-cookieLen, SEEK_END); fpMC->fseek(-4, SEEK_CUR); u32 version = 0xFFFFFFFF; fpMC->read32le(&version); if (version != 0) return -2; fpMC->fseek(-24, SEEK_CUR); fpMC->read32le(&info.size); fpMC->read32le(&info.padSize); fpMC->read32le(&info.type); fpMC->read32le(&info.addr_size); fpMC->read32le(&info.mem_size); MCLOG("DeSmuME backup footer:\n"); MCLOG("\t* size:\t\t%u\n", info.size); MCLOG("\t* padSize:\t%u\n", info.padSize); MCLOG("\t* type (%u):\t%s\n", info.type, save_types[info.type].descr); MCLOG("\t* addr_size:\t%u\n", info.addr_size); MCLOG("\t* mem_size:\t%u\n", info.mem_size); return 0; } u8 BackupDevice::read() { u8 val = 0xFF; fpMC->read8le(&val); return val; } u8 BackupDevice::readByte(u32 addr, const u8 init) { u8 val = init; fpMC->fseek(addr, SEEK_SET); fpMC->read8le(&val); return val; } u16 BackupDevice::readWord(u32 addr, const u16 init) { u16 val = init; fpMC->fseek(addr, SEEK_SET); fpMC->read16le(&val); return val; } u32 BackupDevice::readLong(u32 addr, const u32 init) { u32 val = init; fpMC->fseek(addr, SEEK_SET); fpMC->read32le(&val); return val; } u8 BackupDevice::readByte(const u8 init) { u8 val = init; fpMC->read8le(&val); return val; } u16 BackupDevice::readWord(const u16 init) { u16 val = init; fpMC->read16le(&val); return val; } u32 BackupDevice::readLong(const u32 init) { u32 val = init; fpMC->read32le(&val); return val; } bool BackupDevice::write(u8 val) { #ifdef _DONT_SAVE_BACKUP return true; #endif //never use save files if we are in movie mode if (isMovieMode) return true; return (fpMC->fwrite(&val, 1) == 1); } void BackupDevice::writeByte(u32 addr, u8 val) { if (isMovieMode) return; fpMC->fseek(addr, SEEK_SET); fpMC->write8le(val); } void BackupDevice::writeWord(u32 addr, u16 val) { if (isMovieMode) return; fpMC->fseek(addr, SEEK_SET); fpMC->write16le(val); } void BackupDevice::writeLong(u32 addr, u32 val) { if (isMovieMode) return; fpMC->fseek(addr, SEEK_SET); fpMC->write32le(val); } void BackupDevice::writeByte(u8 val) { if (isMovieMode) return; fpMC->write8le(val); } void BackupDevice::writeWord(u16 val) { if (isMovieMode) return; fpMC->write16le(val); } void BackupDevice::writeLong(u32 val) { if (isMovieMode) return; fpMC->write32le(val); } void BackupDevice::seek(u32 pos) { fpMC->fseek(pos, SEEK_SET); } void BackupDevice::flushBackup() { fpMC->fflush(); } bool BackupDevice::saveBuffer(u8 *data, u32 size, bool _rewind, bool _truncate) { if (_rewind) { fpMC->fseek(0, SEEK_SET); if (_truncate) fpMC->truncate(0); } fsize = size; fpMC->fwrite(data, size); ensure(size, fpMC); return true; } void BackupDevice::movie_mode() { isMovieMode = true; reset(); } void BackupDevice::reset_hardware() { com = 0; reset_command_state = false; write_enable = FALSE; write_protect = 0; addr = addr_counter = 0; motionInitState = MOTION_INIT_STATE_IDLE; motionFlag = MOTION_FLAG_NONE; } void BackupDevice::reset() { reset_hardware(); data_autodetect.resize(0); //if the user has requested a manual choice for backup type, and we havent imported a raw save file, then apply it now if(state == DETECTING && CommonSettings.manualBackupType != MC_TYPE_AUTODETECT) { state = RUNNING; int savetype = save_types[CommonSettings.manualBackupType].media_type; int savesize = save_types[CommonSettings.manualBackupType].size; ensure((u32)savesize); //expand properly if necessary addr_size = addr_size_for_old_save_type(savetype); } } void BackupDevice::close_rom() { fpMC->fflush(); delete fpMC; fpMC = NULL; } u8 BackupDevice::searchFileSaveType(u32 size) { for (u8 i = 1; i < MAX_SAVE_TYPES; i++) { if (size == save_types[i].size) return (i - 1); } return 0xFF; } void BackupDevice::detect() { if (!reset_command_state) return; if(state == DETECTING && data_autodetect.size()>0) { //we can now safely detect the save address size u32 autodetect_size = data_autodetect.size(); printf("Autodetecting with autodetect_size=%d\n",autodetect_size); //detect based on rules switch(autodetect_size) { case 0: case 1: addr_size = 1; //choose 1 just to keep the busted savefile from growing too big msgbox->error("Catastrophic error while autodetecting save type.\nIt will need to be specified manually\n"); break; case 2: //the modern typical case for small eeproms addr_size = 1; break; case 3: //another modern typical case.. //but unfortunately we select this case on accident sometimes when what it meant to do was present the archaic 1+2 case //(the archaic 1+2 case is: specifying one address byte, and then reading the first two bytes, instead of the first one byte, as most other games would do.) //so, we're gonna hack in checks for the games that are doing this addr_size = 2; // TODO: will study a deep, why this happens (wrong detect size) if(!memcmp(gameInfo.header.gameCode,"AL3", 3)) addr_size = 1; //spongebob atlantis squarepantis. if(!memcmp(gameInfo.header.gameCode,"AH5", 3)) addr_size = 1; //over the hedge if(!memcmp(gameInfo.header.gameCode,"AVH", 3)) addr_size = 1; //over the hedge - Hammy Goes Nuts! if(!memcmp(gameInfo.header.gameCode,"AQ3", 3)) addr_size = 1; //spider-man 3 break; case 4: //a modern typical case addr_size = 3; if(!memcmp(gameInfo.header.gameCode,"ASM", 3)) addr_size = 2; //super mario 64 ds break; default: //the archaic case: write the address and then some modulo-4 number of bytes //why modulo 4? who knows. //SM64 (KOR) makes it here with autodetect_size=11 and nothing interesting in the buffer addr_size = autodetect_size & 3; if(!memcmp(gameInfo.header.gameCode,"BDE", 3)) addr_size = 2; // Dementium II break; } state = RUNNING; data_autodetect.resize(0); } } void BackupDevice::checkReset() { if (reset_command_state) { //printf("MC : reset command\n"); if(com == BM_CMD_WRITELOW || com == BM_CMD_WRITEHIGH) fpMC->fflush(); com = 0; reset_command_state = false; } } u8 BackupDevice::data_command(u8 val, u8 PROCNUM) { //printf("MC%c : cmd %02X, val %02X\n", PROCNUM?'7':'9', com, val); #ifdef _ENABLE_MOTION //motion: some guessing here... hope it doesn't break anything if(com == BM_CMD_READLOW && motionInitState == MOTION_INIT_STATE_RECEIVED_4_B && val == 0) { motionInitState = MOTION_INIT_STATE_IDLE; motionFlag |= MOTION_FLAG_ENABLED; //return 0x04; //return 0x04 to enable motion!!!!! return 0; //but we return 0 to disable it! since we don't emulate it anyway } //if the game firmly believes we have motion support, then ignore all motion commands, since theyre not emulated. if(motionFlag & MOTION_FLAG_SENSORMODE) { return 0; } #endif switch (com) { case BM_CMD_WRITESTATUS: //printf("MC%c: write status %02X\n", PROCNUM?'7':'9', val); write_protect = (val & 0xFC); break; case BM_CMD_WRITELOW: case BM_CMD_READLOW: //handle data or address if(state == DETECTING) { if(com == BM_CMD_WRITELOW) printf("MC%c: Unexpected backup device initialization sequence using writes!\n", PROCNUM?'7':'9'); //just buffer the data until we're no longer detecting data_autodetect.push_back(val); detect(); val = 0xFF; } else { if(addr_counterfseek(addr, SEEK_SET); } else { //why does tomb raider underworld access 0x180 and go clear through to 0x280? //should this wrap around at 0 or at 0x100? //TODO - dont other backup memory types have similar wraparound issues? if(addr_size == 1) { addr &= 0x1FF; //since we changed the address unexpectedly (non-sequentially), be sure to seek the FP fpMC->fseek(addr, SEEK_SET); } //if we're writing a byte at address 0, we need to ensure that we have at least 1 byte in the file (IOW, ensure to size addr+1 == 0+1) ensure(addr+1); if(com == BM_CMD_READLOW) { val = read(); //MCLOG("BACKUP: Read at 0x%08X, value 0x%02X\n", addr, val); } else if(write_enable) { write(val); //MCLOG("BACKUP: Write to %08X, value %02Xh\n", addr, val); } addr++; } } break; case BM_CMD_READSTATUS: //handle request to read status //LOG("Backup Memory Read Status: %02X\n", write_enable << 1); val = (write_enable << 1) | write_protect; break; case BM_CMD_IRDA: printf("MC%c: Unverified Backup Memory command: %02X FROM %08X\n", PROCNUM?'7':'9', com, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); val = 0xAA; break; default: if (com != 0) { printf("MC%c: Unhandled Backup Memory command %02X, value %02X (PC:%08X)\n", PROCNUM?'7':'9', com, val, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); break; } com = val; val = 0xFF; //there is no current command. receive one switch (com) { case BM_CMD_NOP: break; case BM_CMD_WRITESTATUS: break; #ifdef _ENABLE_MOTION case 0xFE: if(motionInitState == MOTION_INIT_STATE_IDLE) { motionInitState = MOTION_INIT_STATE_FE; return 0; } break; case 0xFD: if(motionInitState == MOTION_INIT_STATE_FE) { motionInitState = MOTION_INIT_STATE_FD; return 0; } break; case 0xFB: if(motionInitState == MOTION_INIT_STATE_FD) { motionInitState = MOTION_INIT_STATE_FB; return 0; } break; case 0xF8: //enable sensor mode if(motionInitState == MOTION_INIT_STATE_FD) { motionInitState = MOTION_INIT_STATE_IDLE; motionFlag |= MOTION_FLAG_SENSORMODE; return 0; } break; case 0xF9: //disable sensor mode if(motionInitState == MOTION_INIT_STATE_FD) { motionInitState = MOTION_INIT_STATE_IDLE; motionFlag &= ~MOTION_FLAG_SENSORMODE; return 0; } break; #endif case BM_CMD_IRDA: printf("MC%c: Unverified Backup Memory command: %02X FROM %08X\n", PROCNUM?'7':'9', com, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); val = 0xAA; break; case BM_CMD_WRITEDISABLE: //printf("MC%c: write disable\n", PROCNUM?'7':'9'); #ifdef _ENABLE_MOTION switch (motionInitState) { case MOTION_INIT_STATE_IDLE: motionInitState = MOTION_INIT_STATE_RECEIVED_4; break; case MOTION_INIT_STATE_RECEIVED_4: motionInitState = MOTION_INIT_STATE_RECEIVED_4_B; break; } #endif write_enable = FALSE; break; case BM_CMD_READSTATUS: break; case BM_CMD_WRITEENABLE: //printf("MC%c: write enable\n", PROCNUM?'7':'9'); write_enable = TRUE; break; case BM_CMD_WRITELOW: case BM_CMD_READLOW: //printf("XLO: %08X\n",addr); addr_counter = 0; addr = 0; break; case BM_CMD_WRITEHIGH: case BM_CMD_READHIGH: //printf("XHI: %08X\n",addr); if(com == BM_CMD_WRITEHIGH) com = BM_CMD_WRITELOW; if(com == BM_CMD_READHIGH) com = BM_CMD_READLOW; addr_counter = 0; addr = 0; if(addr_size==1) { //"write command that's only available on ST M95040-W that I know of" //this makes sense, since this device would only have a 256 bytes address space with writelow //and writehigh would allow access to the upper 256 bytes //but it was detected in pokemon diamond also during the main save process addr = 0x1; } break; default: printf("MC%c: Unhandled Backup Memory command: %02X FROM %08X\n", PROCNUM?'7':'9', com, PROCNUM?NDS_ARM7.instruct_adr:NDS_ARM9.instruct_adr); break; } //switch(val) break; } //switch (com) #ifdef _ENABLE_MOTION //motion control state machine broke, return to ground motionInitState = MOTION_INIT_STATE_IDLE; #endif checkReset(); return val; } //guarantees that the data buffer has room enough for the specified number of bytes void BackupDevice::ensure(u32 addr, EMUFILE *fpOut) { ensure(addr, uninitializedValue, fpOut); } void BackupDevice::ensure(u32 addr, u8 val, EMUFILE *fpOut) { if (!fpOut && (addr < fsize)) return; EMUFILE *fp = fpOut?fpOut:fpMC; #ifndef _DONT_SAVE_BACKUP fp->fseek(fsize, SEEK_SET); #endif u32 padSize = pad_up_size(addr); u32 size = padSize - fsize; info.padSize = info.size = fsize = padSize; int type = searchFileSaveType(fsize); if (type != 0xFF) info.type = (type + 1); #ifndef _DONT_SAVE_BACKUP if (size > 0) { u8 *tmp = new u8[size]; memset(tmp, val, size); fp->fwrite(tmp, size); delete [] tmp; } //this is just for humans to read fp->fprintf(DESMUME_BACKUP_FOOTER_TXT); //and now the actual footer fp->write32le(addr); //the size of data that has actually been written fp->write32le(padSize); //the size we padded it to fp->write32le(info.type); //save memory type fp->write32le(addr_size); fp->write32le(info.size); //save memory size fp->write32le((u32)0); //version number fp->fprintf("%s", kDesmumeSaveCookie); //this is what we'll use to recognize the desmume format save fp->fflush(); //this is a HORRIBLE IDEA. //leave the FP positioned to write the final byte //this is a HACK to make the basic read/write byte operation work when it calls ensure(). //IDEALLY, no assumptions about the file pointer can be made. //but someone (actually, not really) so very carefully profiled the save IO code and discovered that not fseeking for every byte read/write was a great optimization. //so, now all this code is depending/assuming on the FP being kept in a precise position, and I dont think its smart to change the main user of this assumption to paper over this bug by making it fseek before read/write, while leaving other unknown assuming clients intact fpMC->fseek(addr-1, SEEK_SET); #endif } u32 BackupDevice::addr_size_for_old_save_size(int bupmem_size) { switch(bupmem_size) { case MC_SIZE_4KBITS: return 1; case MC_SIZE_64KBITS: case MC_SIZE_256KBITS: case MC_SIZE_512KBITS: return 2; case MC_SIZE_1MBITS: case MC_SIZE_2MBITS: case MC_SIZE_4MBITS: case MC_SIZE_8MBITS: case MC_SIZE_16MBITS: case MC_SIZE_64MBITS: return 3; default: return 0xFFFFFFFF; } } u32 BackupDevice::addr_size_for_old_save_type(int bupmem_type) { switch(bupmem_type) { case MC_TYPE_EEPROM1: return 1; case MC_TYPE_EEPROM2: case MC_TYPE_FRAM: return 2; case MC_TYPE_FLASH: return 3; default: return 0xFFFFFFFF; } } // TODO: this is required yet? void BackupDevice::load_old_state(u32 addr_size, u8* data, u32 datasize) { //state = RUNNING; //this->addr_size = addr_size; //resize(datasize); //memcpy(&this->data[0],data,datasize); //dump back out as a dsv, just to keep things sane //flush(); } //======================================================================= Tools //======================================================================= //======================================================================= u32 BackupDevice::importDataSize(const char *filename) { u32 res = 0; if (strlen(filename) < 4) return 0; if ((memcmp(filename + strlen(filename) - 4, ".duc", 4) == 0) || (memcmp(filename + strlen(filename) - 4, ".dss", 4) == 0)) { res = get_save_duc_size(filename); if (res == 0xFFFFFFFF) return 0; return res; } res = get_save_nogba_size(filename); if (res != 0xFFFFFFFF) return res; res = get_save_raw_size(filename); if (res != 0xFFFFFFFF) return res; return 0; } bool BackupDevice::importData(const char *filename, u32 force_size) { bool res = false; if (strlen(filename) < 4) return res; if ((memcmp(filename + strlen(filename) - 4, ".duc", 4) == 0) || (memcmp(filename + strlen(filename) - 4, ".dss", 4) == 0)) res = import_duc(filename, force_size); else if (import_no_gba(filename, force_size)) res = true; else res = import_raw(filename, force_size); if (res) NDS_Reset(); return res; } bool BackupDevice::exportData(const char *filename) { if (strlen(filename) < 4) return false; if (memcmp(filename + strlen(filename) - 5, ".sav*", 5) == 0) { char tmp[MAX_PATH]; memset(tmp, 0, MAX_PATH); strcpy(tmp, filename); tmp[strlen(tmp)-1] = 0; return export_no_gba(tmp); } if (memcmp(filename + strlen(filename) - 4, ".sav", 4) == 0) return export_raw(filename); return false; } //======================================================================= no$GBA //======================================================================= //======================================================================= const char no_GBA_HEADER_ID[] = "NocashGbaBackupMediaSavDataFile"; const char no_GBA_HEADER_SRAM_ID[] = "SRAM"; u32 BackupDevice::get_save_nogba_size(const char* fname) { FILE *fsrc = fopen(fname, "rb"); if (fsrc) { char src[0x50] = {0}; u32 fsize = 0; fseek(fsrc, 0, SEEK_END); fsize = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); if (fsize < 0x50) { fclose(fsrc); return 0xFFFFFFFF; } memset(&src[0], 0, sizeof(src)); if (fread(src, 1, sizeof(src), fsrc) != sizeof(src)) { fclose(fsrc); return 0xFFFFFFFF; } for (u8 i = 0; i < 0x1F; i++) if (src[i] != no_GBA_HEADER_ID[i]) { fclose(fsrc); return 0xFFFFFFFF; } if (src[0x1F] != 0x1A) { fclose(fsrc); return 0xFFFFFFFF; } for (int i = 0; i < 0x4; i++) if (src[i+0x40] != no_GBA_HEADER_SRAM_ID[i]) { fclose(fsrc); return 0xFFFFFFFF; } u32 compressMethod = *((u32*)(src+0x44)); if (compressMethod == 0) { fclose(fsrc); return *((u32*)(src+0x48)); } else if (compressMethod == 1) { fclose(fsrc); return *((u32*)(src+0x4C)); } fclose(fsrc); } return 0xFFFFFFFF; } u32 BackupDevice::get_save_nogba_size(u8 *data) { for (u8 i = 0; i < 0x1F; i++) if (data[i] != no_GBA_HEADER_ID[i]) return 0xFFFFFFFF; if (data[0x1F] != 0x1A) return 0xFFFFFFFF; for (int i = 0; i < 0x4; i++) if (data[i+0x40] != no_GBA_HEADER_SRAM_ID[i]) return 0xFFFFFFFF; u32 compressMethod = *((u32*)(data+0x44)); if (compressMethod == 0) return *((u32*)(data+0x48)); if (compressMethod == 1) return *((u32*)(data+0x4C)); return 0xFFFFFFFF; } static int no_gba_unpackSAV(void *in_buf, u32 fsize, void *out_buf, u32 &size) { u8 *src = (u8 *)in_buf; u8 *dst = (u8 *)out_buf; u32 src_pos = 0; u32 dst_pos = 0; u8 cc = 0; u32 size_unpacked = 0; u32 size_packed = 0; u32 compressMethod = 0; if (fsize < 0x50) return (1); for (int i = 0; i < 0x1F; i++) { if (src[i] != no_GBA_HEADER_ID[i]) return (2); } if (src[0x1F] != 0x1A) return (2); for (int i = 0; i < 0x4; i++) { if (src[i+0x40] != no_GBA_HEADER_SRAM_ID[i]) return (3); } compressMethod = *((u32*)(src+0x44)); if (compressMethod == 0) // unpacked { size_unpacked = *((u32*)(src+0x48)); src_pos = 0x4C; for (u32 i = 0; i < size_unpacked; i++) { dst[dst_pos++] = src[src_pos++]; } size = dst_pos; return (0); } if (compressMethod == 1) // packed (method 1) { size_packed = *((u32*)(src+0x48)); size_unpacked = *((u32*)(src+0x4C)); src_pos = 0x50; while (true) { cc = src[src_pos++]; if (cc == 0) { size = dst_pos; return (0); } if (cc == 0x80) { u16 tsize = *((u16*)(src+src_pos+1)); for (int t = 0; t < tsize; t++) dst[dst_pos++] = src[src_pos]; src_pos += 3; continue; } if (cc > 0x80) // repeat { cc -= 0x80; for (int t = 0; t < cc; t++) dst[dst_pos++] = src[src_pos]; src_pos++; continue; } // copy for (int t = 0; t < cc; t++) dst[dst_pos++] = src[src_pos++]; } size = dst_pos; return (0); } return (200); } u32 BackupDevice::trim(void *buf, u32 size) { u32 rows = size / 16; u32 pos = (size - 16); u8 *src = (u8*)buf; for (unsigned int i = 0; i < rows; i++, pos -= 16) { if (src[pos] == 0xFF) { for (int t = 0; t < 16; t++) { if (src[pos+t] != 0xFF) return (pos+16); } } else { return (pos+16); } } return (size); } u32 BackupDevice::fillLeft(u32 size) { for (u32 i = 1; i < ARRAY_SIZE(save_types); i++) { if (size <= (u32)save_types[i].size) return (size + (save_types[i].size - size)); } return size; } bool BackupDevice::import_no_gba(const char *fname, u32 force_size) { FILE *fsrc = fopen(fname, "rb"); u8 *in_buf = NULL; u8 *out_buf = NULL; if (fsrc) { u32 fsize = 0; fseek(fsrc, 0, SEEK_END); fsize = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); //printf("Open %s file (size %i bytes)\n", fname, fsize); in_buf = new u8 [fsize]; if (fread(in_buf, 1, fsize, fsrc) == fsize) { out_buf = new u8 [8 * 1024 * 1024 / 8]; u32 size = 0; memset(out_buf, 0xFF, 8 * 1024 * 1024 / 8); if (no_gba_unpackSAV(in_buf, fsize, out_buf, size) == 0) { if (force_size > 0) size = force_size; //printf("New size %i byte(s)\n", size); size = trim(out_buf, size); //printf("--- new size after trim %i byte(s)\n", size); size = fillLeft(size); //printf("--- new size after fill %i byte(s)\n", size); raw_applyUserSettings(size, (force_size > 0)); saveBuffer(out_buf, size, true, true); if (in_buf) delete [] in_buf; if (out_buf) delete [] out_buf; fclose(fsrc); return true; } if (out_buf) delete [] out_buf; } if (in_buf) delete [] in_buf; fclose(fsrc); } return false; } bool BackupDevice::no_gba_unpack(u8 *&buf, u32 &size) { if (!buf) return false; u32 out_size = get_save_nogba_size(buf); if (out_size == 0xFFFFFFFF) return false; u8 *out_buf = new u8 [out_size]; if (out_buf) { if (no_gba_unpackSAV(buf, size, out_buf, out_size) == 0) { out_size = trim(out_buf, out_size); out_size = fillLeft(out_size); delete [] buf; buf = out_buf; size = out_size; return true; } } delete out_buf; return false; } bool BackupDevice::export_no_gba(const char* fname) { std::vector data(fsize); u32 pos = fpMC->ftell(); fpMC->fseek(0, SEEK_SET); fpMC->fread((char *)&data[0], fsize); fpMC->fseek(pos, SEEK_SET); FILE* outf = fopen(fname,"wb"); if(!outf) return false; u32 size = data.size(); u32 padSize = pad_up_size(size); if(data.size()>0) fwrite(&data[0],1,size,outf); for(u32 i=size;i data(fsize); u32 pos = fpMC->ftell(); fpMC->fseek(0, SEEK_SET); fpMC->fread((char *)&data[0], fsize); fpMC->fseek(pos, SEEK_SET); FILE* outf = fopen(filename,"wb"); if(!outf) return false; u32 size = data.size(); u32 padSize = pad_up_size(size); if(data.size()>0) fwrite(&data[0],1,size,outf); for(u32 i=size;i saveSizes[ctr])) ctr++; u32 padSize = saveSizes[ctr]; if(padSize == 0xFFFFFFFF) { printf("PANIC! Couldn't pad up save size. Refusing to pad.\n"); padSize = startSize; } return padSize; } void BackupDevice::raw_applyUserSettings(u32& size, bool manual) { //respect the user's choice of backup memory type if(CommonSettings.manualBackupType == MC_TYPE_AUTODETECT && !manual) { addr_size = addr_size_for_old_save_size(size); ensure(size); } else { u32 type = CommonSettings.manualBackupType; if (manual) { u32 res = searchFileSaveType(size); if (res != 0xFF) type = (res + 1); // +1 - skip autodetect } int savetype = save_types[type].media_type; int savesize = save_types[type].size; addr_size = addr_size_for_old_save_type(savetype); if((u32)savesize 0) { if (size > force_size) size = force_size; else if (size < force_size) { left = force_size - size; size = force_size; } } fseek(inf, 0, SEEK_SET); raw_applyUserSettings(size, (force_size > 0)); u8 *data = new u8[size]; u32 sz = (size-left); bool res = (fread(data, 1, sz, inf) == sz); fclose(inf); if (res) saveBuffer(data, sz, true, true); delete [] data; return true; } u32 BackupDevice::get_save_duc_size(const char* fname) { FILE* inf = fopen(fname,"rb"); if (!inf) return 0xFFFFFFFF; fseek(inf, 0, SEEK_END); u32 size = (u32)ftell(inf); fclose(inf); if (size < 500) return 0xFFFFFFFF; return (size - 500); } bool BackupDevice::import_duc(const char* filename, u32 force_size) { u32 size; char id[16]; FILE* file = fopen(filename, "rb"); if(!file) return false; fseek(file, 0, SEEK_END); size = (u32)ftell(file) - 500; fseek(file, 0, SEEK_SET); // Make sure we really have the right file fread((void *)id, sizeof(char), 16, file); if (memcmp(id, "ARDS000000000001", 16) != 0) { printf("Not recognized as a valid DUC file\n"); fclose(file); return false; } // Skip the rest of the header since we don't need it fseek(file, 500, SEEK_SET); u32 left = 0; if (force_size > 0) { if (size > force_size) size = force_size; else if (size < force_size) { left = force_size - size; size = force_size; } } raw_applyUserSettings(size, (force_size > 0)); u8 *data = new u8[size]; u32 sz = (size-left); bool res = (fread(data, 1, sz, file) == sz); fclose(file); if (res) saveBuffer(data, sz, true, true); delete [] data; return res; } bool BackupDevice::load_movie(EMUFILE* is) { const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie); is->fseek(-cookieLen, SEEK_END); is->fseek(-4, SEEK_CUR); u32 version = 0xFFFFFFFF; is->fread((char*)&version,4); if(version!=0) { printf("Unknown save file format\n"); return false; } is->fseek(-24, SEEK_CUR); struct{ u32 size,padSize,type,addr_size,mem_size; }info; is->fread((char*)&info.size,4); is->fread((char*)&info.padSize,4); is->fread((char*)&info.type,4); is->fread((char*)&info.addr_size,4); is->fread((char*)&info.mem_size,4); is->fseek(0, SEEK_SET); fpMC = (EMUFILE*)&is; state = RUNNING; addr_size = info.addr_size; //none of the other fields are used right now return true; } void BackupDevice::forceManualBackupType() { addr_size = addr_size_for_old_save_size(save_types[CommonSettings.manualBackupType].size); state = RUNNING; } desmume-0.9.11/src/bits.h0000755000000000000000000000226612467662066013670 0ustar rootroot#ifndef BITS_H #define BITS_H #define BIT(n) (1<<(n)) #define BIT_N(i,n) (((i)>>(n))&1) #define BIT0(i) ((i)&1) #define BIT1(i) BIT_N(i,1) #define BIT2(i) BIT_N(i,2) #define BIT3(i) BIT_N(i,3) #define BIT4(i) BIT_N(i,4) #define BIT5(i) BIT_N(i,5) #define BIT6(i) BIT_N(i,6) #define BIT7(i) BIT_N(i,7) #define BIT8(i) BIT_N(i,8) #define BIT9(i) BIT_N(i,9) #define BIT10(i) BIT_N(i,10) #define BIT11(i) BIT_N(i,11) #define BIT12(i) BIT_N(i,12) #define BIT13(i) BIT_N(i,13) #define BIT14(i) BIT_N(i,14) #define BIT15(i) BIT_N(i,15) #define BIT16(i) BIT_N(i,16) #define BIT17(i) BIT_N(i,17) #define BIT18(i) BIT_N(i,18) #define BIT19(i) BIT_N(i,19) #define BIT20(i) BIT_N(i,20) #define BIT21(i) BIT_N(i,21) #define BIT22(i) BIT_N(i,22) #define BIT23(i) BIT_N(i,23) #define BIT24(i) BIT_N(i,24) #define BIT25(i) BIT_N(i,25) #define BIT26(i) BIT_N(i,26) #define BIT27(i) BIT_N(i,27) #define BIT28(i) BIT_N(i,28) #define BIT29(i) BIT_N(i,29) #define BIT30(i) BIT_N(i,30) #define BIT31(i) ((i)>>31) #define CONDITION(i) (i)>>28 #define REG_POS(i,n) (((i)>>n)&0xF) #endif desmume-0.9.11/src/desmume.mk0000755000000000000000000000007312467662066014540 0ustar rootrootAM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src AM_LDFLAGS =desmume-0.9.11/src/lua-engine.cpp0000755000000000000000000056212112467662066015307 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "lua-engine.h" #if defined(WIN32) #include #include typedef HMENU PlatformMenu; // hMenu #define MAX_MENU_COUNT (IDC_LUAMENU_RESERVE_END - IDC_LUAMENU_RESERVE_START + 1) #include "windows/main.h" #include "windows/video.h" #include "windows/resource.h" #else // TODO: define appropriate types for menu typedef void* PlatformMenu; #define MAX_MENU_COUNT 0 #include #endif #include #include #include #include #include #include "armcpu.h" #include "movie.h" #include "zlib.h" #include "driver.h" #include "NDSSystem.h" #include "movie.h" #include "MMU.h" #include "GPU.h" #include "GPU_osd.h" #include "SPU.h" #include "saves.h" #include "emufile.h" using namespace std; // functions that maybe aren't part of the Lua engine // but didn't make sense to add to BaseDriver (at least not yet) static bool IsHardwareAddressValid(u32 address) { // maybe TODO? let's say everything is valid. return true; } // actual lua engine follows // adapted from gens-rr, nitsuja + upthorn extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" #include "lstate.h" }; enum SpeedMode { SPEEDMODE_NORMAL, SPEEDMODE_NOTHROTTLE, SPEEDMODE_TURBO, SPEEDMODE_MAXIMUM, }; struct LuaGUIData { u32* data; int stridePix; int xOrigin, yOrigin; int xMin, yMin, xMax, yMax; }; struct LuaSubMenuData { PlatformMenu menu; PlatformMenu subMenu; PlatformMenuItem menuItem; LuaSubMenuData(PlatformMenu _menu, PlatformMenu _subMenu, PlatformMenuItem _menuItem) { menu = _menu; subMenu = _subMenu; menuItem = _menuItem; } }; struct LuaMenuData { std::vector subMenuData; std::map menuItemMap; }; static const char* menuCallbackIDString = "menuhandlers"; struct LuaContextInfo { lua_State* L; // the Lua state bool started; // script has been started and hasn't yet been terminated, although it may not be currently running bool running; // script is currently running code (either the main call to the script or the callbacks it registered) bool returned; // main call to the script has returned (but it may still be active if it registered callbacks) bool crashed; // true if script has errored out bool restart; // if true, tells the script-running code to restart the script when the script stops bool restartLater; // set to true when a still-running script is stopped so that RestartAllLuaScripts can know which scripts to restart unsigned int worryCount; // counts up as the script executes, gets reset when the application is able to process messages, triggers a warning prompt if it gets too high bool stopWorrying; // set to true if the user says to let the script run forever despite appearing to be frozen bool panic; // if set to true, tells the script to terminate as soon as it can do so safely (used because directly calling lua_close() or luaL_error() is unsafe in some contexts) bool ranExit; // used to prevent a registered exit callback from ever getting called more than once bool guiFuncsNeedDeferring; // true whenever GUI drawing would be cleared by the next emulation update before it would be visible, and thus needs to be deferred until after the next emulation update int numDeferredFuncs; // number of deferred function calls accumulated, used to impose an arbitrary limit to avoid running out of memory bool ranFrameAdvance; // false if emu.frameadvance() hasn't been called yet int transparencyModifier; // values less than 255 will scale down the opacity of whatever the GUI renders, values greater than 255 will increase the opacity of anything transparent the GUI renders SpeedMode speedMode; // determines how emu.frameadvance() acts char panicMessage [72]; // a message to print if the script terminates due to panic being set std::string lastFilename; // path to where the script last ran from so that restart can work (note: storing the script in memory instead would not be useful because we always want the most up-to-date script from file) std::string nextFilename; // path to where the script should run from next, mainly used in case the restart flag is true unsigned int dataSaveKey; // crc32 of the save data key, used to decide which script should get which data... by default (if no key is specified) it's calculated from the script filename unsigned int dataLoadKey; // same as dataSaveKey but set through registerload instead of registersave if the two differ bool dataSaveLoadKeySet; // false if the data save keys are unset or set to their default value bool rerecordCountingDisabled; // true if this script has disabled rerecord counting for the savestates it loads std::vector persistVars; // names of the global variables to persist, kept here so their associated values can be output when the script exits LuaSaveData newDefaultData; // data about the default state of persisted global variables, which we save on script exit so we can detect when the default value has changed to make it easier to reset persisted variables unsigned int numMemHooks; // number of registered memory functions (1 per hooked byte) LuaGUIData guiData; LuaMenuData menuData; // callbacks into the lua window... these don't need to exist per context the way I'm using them, but whatever void(*print)(int uid, const char* str); void(*onstart)(int uid); void(*onstop)(int uid, bool statusOK); }; std::map luaContextInfo; std::map luaStateToUIDMap; int g_numScriptsStarted = 0; bool g_anyScriptsHighSpeed = false; bool g_stopAllScriptsEnabled = true; #define USE_INFO_STACK #ifdef USE_INFO_STACK std::vector infoStack; #define GetCurrentInfo() (*infoStack.front()) // should be faster but relies on infoStack correctly being updated to always have the current info in the first element #else std::map luaStateToContextMap; #define GetCurrentInfo() (*luaStateToContextMap[L->l_G->mainthread]) // should always work but might be slower #endif //#define ASK_USER_ON_FREEZE // dialog on freeze is disabled now because it seems to be unnecessary, but this can be re-defined to enable it static std::map s_cFuncInfoMap; // using this macro you can define a callable-from-Lua function // while associating with it some information about its arguments. // that information will show up if the user tries to print the function // or otherwise convert it to a string. // (for example, "writebyte=function(addr,value)" instead of "writebyte=function:0A403490") // note that the user can always use addressof(func) if they want to retrieve the address. #define DEFINE_LUA_FUNCTION(name, argstring) \ static int name(lua_State* L); \ static const char* name##_args = s_cFuncInfoMap[name] = argstring; \ static int name(lua_State* L) #ifdef _MSC_VER #define snprintf _snprintf #define vscprintf _vscprintf #else #define stricmp strcasecmp #define strnicmp strncasecmp #define __forceinline __attribute__((always_inline)) #endif static const char* luaCallIDStrings [] = { "CALL_BEFOREEMULATION", "CALL_AFTEREMULATION", "CALL_AFTEREMULATIONGUI", "CALL_BEFOREEXIT", "CALL_BEFORESAVE", "CALL_AFTERLOAD", "CALL_ONSTART", "CALL_ONINITMENU", "CALL_HOTKEY_1", "CALL_HOTKEY_2", "CALL_HOTKEY_3", "CALL_HOTKEY_4", "CALL_HOTKEY_5", "CALL_HOTKEY_6", "CALL_HOTKEY_7", "CALL_HOTKEY_8", "CALL_HOTKEY_9", "CALL_HOTKEY_10", "CALL_HOTKEY_11", "CALL_HOTKEY_12", "CALL_HOTKEY_13", "CALL_HOTKEY_14", "CALL_HOTKEY_15", "CALL_HOTKEY_16", }; static const int _makeSureWeHaveTheRightNumberOfStrings [sizeof(luaCallIDStrings)/sizeof(*luaCallIDStrings) == LUACALL_COUNT ? 1 : 0]; static const char* luaMemHookTypeStrings [] = { "MEMHOOK_WRITE", "MEMHOOK_READ", "MEMHOOK_EXEC", "MEMHOOK_WRITE_SUB", "MEMHOOK_READ_SUB", "MEMHOOK_EXEC_SUB", }; static const int _makeSureWeHaveTheRightNumberOfStrings2 [sizeof(luaMemHookTypeStrings)/sizeof(*luaMemHookTypeStrings) == LUAMEMHOOK_COUNT ? 1 : 0]; void StopScriptIfFinished(int uid, bool justReturned = false); void SetSaveKey(LuaContextInfo& info, const char* key); void SetLoadKey(LuaContextInfo& info, const char* key); void RefreshScriptStartedStatus(); void RefreshScriptSpeedStatus(); static char* rawToCString(lua_State* L, int idx=0); static const char* toCString(lua_State* L, int idx=0); static void CalculateMemHookRegions(LuaMemHookType hookType); static int memory_registerHook(lua_State* L, LuaMemHookType hookType, int defaultSize) { // get first argument: address unsigned int addr = luaL_checkinteger(L,1); //if((addr & ~0xFFFFFF) == ~0xFFFFFF) // addr &= 0xFFFFFF; // get optional second argument: size int size = defaultSize; int funcIdx = 2; if(lua_isnumber(L,2)) { size = luaL_checkinteger(L,2); if(size < 0) { size = -size; addr -= size; } funcIdx++; } // check last argument: callback function bool clearing = lua_isnil(L,funcIdx); if(!clearing) luaL_checktype(L, funcIdx, LUA_TFUNCTION); lua_settop(L,funcIdx); // get the address-to-callback table for this hook type of the current script lua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]); // count how many callback functions we'll be displacing int numFuncsAfter = clearing ? 0 : size; int numFuncsBefore = 0; for(unsigned int i = addr; i != addr+size; i++) { lua_rawgeti(L, -1, i); if(lua_isfunction(L, -1)) numFuncsBefore++; lua_pop(L,1); } // put the callback function in the address slots for(unsigned int i = addr; i != addr+size; i++) { lua_pushvalue(L, -2); lua_rawseti(L, -2, i); } // adjust the count of active hooks LuaContextInfo& info = GetCurrentInfo(); info.numMemHooks += numFuncsAfter - numFuncsBefore; // re-cache regions of hooked memory across all scripts CalculateMemHookRegions(hookType); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 0; } LuaMemHookType MatchHookTypeToCPU(lua_State* L, LuaMemHookType hookType) { int cpuID = 0; int cpunameIndex = 0; if(lua_type(L,2) == LUA_TSTRING) cpunameIndex = 2; else if(lua_type(L,3) == LUA_TSTRING) cpunameIndex = 3; if(cpunameIndex) { const char* cpuName = lua_tostring(L, cpunameIndex); // if(!stricmp(cpuName, "sub") || !stricmp(cpuName, "s68k")) // cpuID = 1; lua_remove(L, cpunameIndex); } // switch(cpuID) // { // case 0: // m68k: // return hookType; // // case 1: // s68k: // switch(hookType) // { // case LUAMEMHOOK_WRITE: return LUAMEMHOOK_WRITE_SUB; // case LUAMEMHOOK_READ: return LUAMEMHOOK_READ_SUB; // case LUAMEMHOOK_EXEC: return LUAMEMHOOK_EXEC_SUB; // } // } return hookType; } DEFINE_LUA_FUNCTION(memory_registerwrite, "address,[size=1,][cpuname=\"main\",]func") { #ifndef HAVE_LUA luaL_error(L, "memory.registerwrite failed: function is not available in this build."); #endif return memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_WRITE), 1); } DEFINE_LUA_FUNCTION(memory_registerread, "address,[size=1,][cpuname=\"main\",]func") { #ifndef HAVE_LUA luaL_error(L, "memory.registerread failed: function is not available in this build."); #endif return memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_READ), 1); } DEFINE_LUA_FUNCTION(memory_registerexec, "address,[size=2,][cpuname=\"main\",]func") { #ifndef HAVE_LUA luaL_error(L, "memory.registerexec failed: function is not available in this build."); #endif return memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_EXEC), 2); } DEFINE_LUA_FUNCTION(emu_registerbefore, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEMULATION]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEMULATION]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(emu_registerafter, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATION]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATION]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(emu_registerexit, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(emu_registerstart, "func") // TODO: use call registered LUACALL_ONSTART functions on reset { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONSTART]); lua_insert(L,1); lua_pushvalue(L,-1); // copy the function so we can also call it lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONSTART]); if (!lua_isnil(L,-1) && driver->EMU_HasEmulationStarted()) lua_call(L,0,0); // call the function now since the game has already started and this start function hasn't been called yet StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(gui_register, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATIONGUI]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATIONGUI]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(state_registersave, "func[,savekey]") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); if (!lua_isnoneornil(L,2)) SetSaveKey(GetCurrentInfo(), rawToCString(L,2)); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFORESAVE]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFORESAVE]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(state_registerload, "func[,loadkey]") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); if (!lua_isnoneornil(L,2)) SetLoadKey(GetCurrentInfo(), rawToCString(L,2)); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTERLOAD]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTERLOAD]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(input_registerhotkey, "keynum,func") { int hotkeyNumber = luaL_checkinteger(L,1); if(hotkeyNumber < 1 || hotkeyNumber > 16) { luaL_error(L, "input.registerhotkey(n,func) requires 1 <= n <= 16, but got n = %d.", hotkeyNumber); return 0; } else { const char* key = luaCallIDStrings[LUACALL_SCRIPT_HOTKEY_1 + hotkeyNumber-1]; lua_getfield(L, LUA_REGISTRYINDEX, key); lua_replace(L,1); if (!lua_isnil(L,2)) luaL_checktype(L, 2, LUA_TFUNCTION); lua_settop(L,2); lua_setfield(L, LUA_REGISTRYINDEX, key); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } } static int doPopup(lua_State* L, const char* deftype, const char* deficon) { const char* str = toCString(L,1); const char* type = lua_type(L,2) == LUA_TSTRING ? lua_tostring(L,2) : deftype; const char* icon = lua_type(L,3) == LUA_TSTRING ? lua_tostring(L,3) : deficon; int itype = -1, iters = 0; while(itype == -1 && iters++ < 2) { if(!stricmp(type, "ok")) itype = 0; else if(!stricmp(type, "yesno")) itype = 1; else if(!stricmp(type, "yesnocancel")) itype = 2; else if(!stricmp(type, "okcancel")) itype = 3; else if(!stricmp(type, "abortretryignore")) itype = 4; else type = deftype; } assert(itype >= 0 && itype <= 4); if(!(itype >= 0 && itype <= 4)) itype = 0; int iicon = -1; iters = 0; while(iicon == -1 && iters++ < 2) { if(!stricmp(icon, "message") || !stricmp(icon, "notice")) iicon = 0; else if(!stricmp(icon, "question")) iicon = 1; else if(!stricmp(icon, "warning")) iicon = 2; else if(!stricmp(icon, "error")) iicon = 3; else icon = deficon; } assert(iicon >= 0 && iicon <= 3); if(!(iicon >= 0 && iicon <= 3)) iicon = 0; static const char * const titles [] = {"Notice", "Question", "Warning", "Error"}; const char* answer = "ok"; #if defined(_WIN32) static const int etypes [] = {MB_OK, MB_YESNO, MB_YESNOCANCEL, MB_OKCANCEL, MB_ABORTRETRYIGNORE}; static const int eicons [] = {MB_ICONINFORMATION, MB_ICONQUESTION, MB_ICONWARNING, MB_ICONERROR}; // DialogsOpen++; int uid = luaStateToUIDMap[L->l_G->mainthread]; EnableWindow(MainWindow->getHWnd(), false); // if (Full_Screen) // { // while (ShowCursor(false) >= 0); // while (ShowCursor(true) < 0); // } int ianswer = MessageBox((HWND)uid, str, titles[iicon], etypes[itype] | eicons[iicon]); EnableWindow(MainWindow->getHWnd(), true); // DialogsOpen--; switch(ianswer) { case IDOK: answer = "ok"; break; case IDCANCEL: answer = "cancel"; break; case IDABORT: answer = "abort"; break; case IDRETRY: answer = "retry"; break; case IDIGNORE: answer = "ignore"; break; case IDYES: answer = "yes"; break; case IDNO: answer = "no"; break; } #else // NYI (assume first answer for now) switch(itype) { case 0: case 3: answer = "ok"; break; case 1: case 2: answer = "yes"; break; case 4: answer = "abort"; break; } #endif lua_pushstring(L, answer); return 1; } // string gui.popup(string message, string type = "ok", string icon = "message") // string input.popup(string message, string type = "yesno", string icon = "question") DEFINE_LUA_FUNCTION(gui_popup, "message[,type=\"ok\"[,icon=\"message\"]]") { return doPopup(L, "ok", "message"); } DEFINE_LUA_FUNCTION(input_popup, "message[,type=\"yesno\"[,icon=\"question\"]]") { return doPopup(L, "yesno", "question"); } static const char* FilenameFromPath(const char* path) { const char* slash1 = strrchr(path, '\\'); const char* slash2 = strrchr(path, '/'); if(slash1) slash1++; if(slash2) slash2++; const char* rv = path; rv = std::max(rv, slash1); rv = std::max(rv, slash2); if(!rv) rv = ""; return rv; } void TrimFilenameFromPath(char* path) { char* slash1 = strrchr(path, '\\'); char* slash2 = strrchr(path, '/'); char* slash = slash1; if (slash == NULL || slash2 > slash) { slash = slash2; } if (slash != NULL) { *(slash + 1) = '\0'; } } static void toCStringConverter(lua_State* L, int i, char*& ptr, int& remaining); // compare the contents of two items on the Lua stack to determine if they differ // only works for relatively simple, saveable items (numbers, strings, bools, nil, and possibly-nested tables of those, up to a certain max length) // not the best implementation, but good enough for what it's currently used for static bool luaValueContentsDiffer(lua_State* L, int idx1, int idx2) { static const int maxLen = 8192; static char str1[maxLen]; static char str2[maxLen]; str1[0] = 0; str2[0] = 0; char* ptr1 = str1; char* ptr2 = str2; int remaining1 = maxLen; int remaining2 = maxLen; toCStringConverter(L, idx1, ptr1, remaining1); toCStringConverter(L, idx2, ptr2, remaining2); return (remaining1 != remaining2) || (strcmp(str1,str2) != 0); } // fills output with the path // also returns a pointer to the first character in the filename (non-directory) part of the path static char* ConstructScriptSaveDataPath(char* output, int bufferSize, LuaContextInfo& info) { // Get_State_File_Name(output); TODO char* slash1 = strrchr(output, '\\'); char* slash2 = strrchr(output, '/'); if(slash1) slash1[1] = '\0'; if(slash2) slash2[1] = '\0'; char* rv = output + strlen(output); strncat(output, "u.", bufferSize-(strlen(output)+1)); if(!info.dataSaveLoadKeySet) strncat(output, FilenameFromPath(info.lastFilename.c_str()), bufferSize-(strlen(output)+1)); else snprintf(output+strlen(output), bufferSize-(strlen(output)+1), "%X", info.dataSaveKey); strncat(output, ".luasav", bufferSize-(strlen(output)+1)); return rv; } // emu.persistglobalvariables({ // variable1 = defaultvalue1, // variable2 = defaultvalue2, // etc // }) // takes a table with variable names as the keys and default values as the values, // and defines each of those variables names as a global variable, // setting them equal to the values they had the last time the script exited, // or (if that isn't available) setting them equal to the provided default values. // as a special case, if you want the default value for a variable to be nil, // then put the variable name alone in quotes as an entry in the table without saying "= nil". // this special case is because tables in lua don't store nil valued entries. // also, if you change the default value that will reset the variable to the new default. DEFINE_LUA_FUNCTION(emu_persistglobalvariables, "variabletable") { int uid = luaStateToUIDMap[L->l_G->mainthread]; LuaContextInfo& info = GetCurrentInfo(); // construct a path we can load the persistent variables from char path [1024] = {0}; char* pathTypeChrPtr = ConstructScriptSaveDataPath(path, 1024, info); // load the previously-saved final variable values from file LuaSaveData exitData; { *pathTypeChrPtr = 'e'; FILE* persistFile = fopen(path, "rb"); if(persistFile) { exitData.ImportRecords(persistFile); fclose(persistFile); } } // load the previously-saved default variable values from file LuaSaveData defaultData; { *pathTypeChrPtr = 'd'; FILE* defaultsFile = fopen(path, "rb"); if(defaultsFile) { defaultData.ImportRecords(defaultsFile); fclose(defaultsFile); } } // loop through the passed-in variables, // exposing a global variable to the script for each one // while also keeping a record of their names // so we can save them (to the persistFile) later when the script exits int numTables = lua_gettop(L); for(int i = 1; i <= numTables; i++) { luaL_checktype(L, i, LUA_TTABLE); lua_pushnil(L); // before first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; while(lua_next(L, i)) { int keyType = lua_type(L, keyIndex); int valueType = lua_type(L, valueIndex); if(keyType == LUA_TSTRING && valueType <= LUA_TTABLE && valueType != LUA_TLIGHTUSERDATA) { // variablename = defaultvalue, // duplicate the key first because lua_next() needs to eat that lua_pushvalue(L, keyIndex); lua_insert(L, keyIndex); } else if(keyType == LUA_TNUMBER && valueType == LUA_TSTRING) { // "variablename", // or [index] = "variablename", // defaultvalue is assumed to be nil lua_pushnil(L); } else { luaL_error(L, "'%s' = '%s' entries are not allowed in the table passed to emu.persistglobalvariables()", lua_typename(L,keyType), lua_typename(L,valueType)); } int varNameIndex = valueIndex; int defaultIndex = valueIndex+1; // keep track of the variable name for later const char* varName = lua_tostring(L, varNameIndex); info.persistVars.push_back(varName); unsigned int varNameCRC = crc32(0, (const unsigned char*)varName, strlen(varName)); info.newDefaultData.SaveRecordPartial(uid, varNameCRC, defaultIndex); // load the previous default value for this variable if it exists. // if the new default is different than the old one, // assume the user wants to set the value to the new default value // instead of the previously-saved exit value. bool attemptPersist = true; defaultData.LoadRecord(uid, varNameCRC, 1); lua_pushnil(L); if(luaValueContentsDiffer(L, defaultIndex, defaultIndex+1)) attemptPersist = false; lua_settop(L, defaultIndex); if(attemptPersist) { // load the previous saved value for this variable if it exists exitData.LoadRecord(uid, varNameCRC, 1); if(lua_gettop(L) > defaultIndex) lua_remove(L, defaultIndex); // replace value with loaded record lua_settop(L, defaultIndex); } // set the global variable lua_settable(L, LUA_GLOBALSINDEX); assert(lua_gettop(L) == keyIndex); } } return 0; } static const char* deferredGUIIDString = "lazygui"; static const char* deferredJoySetIDString = "lazyjoy"; #define MAX_DEFERRED_COUNT 16384 // store the most recent C function call from Lua (and all its arguments) // for later evaluation void DeferFunctionCall(lua_State* L, const char* idstring) { LuaContextInfo& info = GetCurrentInfo(); if(info.numDeferredFuncs < MAX_DEFERRED_COUNT) info.numDeferredFuncs++; else return; // too many deferred functions on the same frame, silently discard the rest // there might be a cleaner way of doing this using lua_pushcclosure and lua_getref int num = lua_gettop(L); // get the C function pointer //lua_CFunction cf = lua_tocfunction(L, -(num+1)); lua_CFunction cf = (L->ci->func)->value.gc->cl.c.f; assert(cf); lua_pushcfunction(L,cf); // make a list of the function and its arguments (and also pop those arguments from the stack) lua_createtable(L, num+1, 0); lua_insert(L, 1); for(int n = num+1; n > 0; n--) lua_rawseti(L, 1, n); // put the list into a global array lua_getfield(L, LUA_REGISTRYINDEX, idstring); lua_insert(L, 1); int curSize = lua_objlen(L, 1); lua_rawseti(L, 1, curSize+1); // clean the stack lua_settop(L, 0); } static const char* refStashString = "refstash"; void CallDeferredFunctions(lua_State* L, const char* idstring) { lua_getfield(L, LUA_REGISTRYINDEX, idstring); int numCalls = lua_objlen(L, -1); if(numCalls > 0) { // save and pop any extra things that were on the stack int top = lua_gettop(L); int stashRef = -1; if(top > 1) { lua_insert(L, 1); lua_getfield(L, LUA_REGISTRYINDEX, refStashString); lua_insert(L, 2); lua_createtable(L, top-1, 0); lua_insert(L, 3); for(int remaining = top; remaining-- > 1;) lua_rawseti(L, 3, remaining); assert(lua_gettop(L) == 3); stashRef = luaL_ref(L, 2); lua_pop(L, 1); } // loop through all the queued function calls for(int i = 1; i <= numCalls; i++) { lua_rawgeti(L, 1, i); // get the function+arguments list int listSize = lua_objlen(L, 2); // push the arguments and the function for(int j = 1; j <= listSize; j++) lua_rawgeti(L, 2, j); // get and pop the function lua_CFunction cf = lua_tocfunction(L, -1); lua_pop(L, 1); // shift first argument to slot 1 and call the function lua_remove(L, 2); lua_remove(L, 1); cf(L); // prepare for next iteration lua_settop(L, 0); lua_getfield(L, LUA_REGISTRYINDEX, idstring); } // clear the list of deferred functions lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, idstring); LuaContextInfo& info = GetCurrentInfo(); info.numDeferredFuncs -= numCalls; if(info.numDeferredFuncs < 0) info.numDeferredFuncs = 0; // restore the stack lua_settop(L, 0); if(top > 1) { lua_getfield(L, LUA_REGISTRYINDEX, refStashString); lua_rawgeti(L, 1, stashRef); for(int i = 1; i <= top-1; i++) lua_rawgeti(L, 2, i); luaL_unref(L, 1, stashRef); lua_remove(L, 2); lua_remove(L, 1); } assert(lua_gettop(L) == top - 1); } else { lua_pop(L, 1); } } bool DeferGUIFuncIfNeeded(lua_State* L) { LuaContextInfo& info = GetCurrentInfo(); if(info.speedMode == SPEEDMODE_MAXIMUM) { // if the mode is "maximum" then discard all GUI function calls // and pretend it was because we deferred them return true; } if(info.guiFuncsNeedDeferring) { // defer whatever function called this one until later DeferFunctionCall(L, deferredGUIIDString); return true; } // ok to run the function right now return false; } void worry(lua_State* L, int intensity) { LuaContextInfo& info = GetCurrentInfo(); info.worryCount += intensity; } static inline bool isalphaorunderscore(char c) { return isalpha(c) || c == '_'; } static std::vector s_tableAddressStack; // prevents infinite recursion of a table within a table (when cycle is found, print something like table:parent) static std::vector s_metacallStack; // prevents infinite recursion if something's __tostring returns another table that contains that something (when cycle is found, print the inner result without using __tostring) #define APPENDPRINT { int _n = snprintf(ptr, remaining, #define END ); if(_n >= 0) { ptr += _n; remaining -= _n; } else { remaining = 0; } } static void toCStringConverter(lua_State* L, int i, char*& ptr, int& remaining) { if(remaining <= 0) return; const char* str = ptr; // for debugging // if there is a __tostring metamethod then call it int usedMeta = luaL_callmeta(L, i, "__tostring"); if(usedMeta) { std::vector::const_iterator foundCycleIter = std::find(s_metacallStack.begin(), s_metacallStack.end(), lua_topointer(L,i)); if(foundCycleIter != s_metacallStack.end()) { lua_pop(L, 1); usedMeta = false; } else { s_metacallStack.push_back(lua_topointer(L,i)); i = lua_gettop(L); } } switch(lua_type(L, i)) { case LUA_TNONE: break; case LUA_TNIL: APPENDPRINT "nil" END break; case LUA_TBOOLEAN: APPENDPRINT lua_toboolean(L,i) ? "true" : "false" END break; case LUA_TSTRING: APPENDPRINT "%s",lua_tostring(L,i) END break; case LUA_TNUMBER: APPENDPRINT "%.12Lg",lua_tonumber(L,i) END break; case LUA_TFUNCTION: if((L->base + i-1)->value.gc->cl.c.isC) { lua_CFunction func = lua_tocfunction(L, i); std::map::iterator iter = s_cFuncInfoMap.find(func); if(iter == s_cFuncInfoMap.end()) goto defcase; APPENDPRINT "function(%s)", iter->second END } else { APPENDPRINT "function(" END Proto* p = (L->base + i-1)->value.gc->cl.l.p; int numParams = p->numparams + (p->is_vararg?1:0); for (int n=0; nnumparams; n++) { APPENDPRINT "%s", getstr(p->locvars[n].varname) END if(n != numParams-1) APPENDPRINT "," END } if(p->is_vararg) APPENDPRINT "..." END APPENDPRINT ")" END } break; defcase:default: APPENDPRINT "%s:%p",luaL_typename(L,i),lua_topointer(L,i) END break; case LUA_TTABLE: { // first make sure there's enough stack space if(!lua_checkstack(L, 4)) { // note that even if lua_checkstack never returns false, // that doesn't mean we didn't need to call it, // because calling it retrieves stack space past LUA_MINSTACK goto defcase; } std::vector::const_iterator foundCycleIter = std::find(s_tableAddressStack.begin(), s_tableAddressStack.end(), lua_topointer(L,i)); if(foundCycleIter != s_tableAddressStack.end()) { int parentNum = s_tableAddressStack.end() - foundCycleIter; if(parentNum > 1) APPENDPRINT "%s:parent^%d",luaL_typename(L,i),parentNum END else APPENDPRINT "%s:parent",luaL_typename(L,i) END } else { s_tableAddressStack.push_back(lua_topointer(L,i)); struct Scope { ~Scope(){ s_tableAddressStack.pop_back(); } } scope; APPENDPRINT "{" END lua_pushnil(L); // first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; bool first = true; bool skipKey = true; // true if we're still in the "array part" of the table lua_Number arrayIndex = (lua_Number)0; while(lua_next(L, i)) { if(first) first = false; else APPENDPRINT ", " END if(skipKey) { arrayIndex += (lua_Number)1; bool keyIsNumber = (lua_type(L, keyIndex) == LUA_TNUMBER); skipKey = keyIsNumber && (lua_tonumber(L, keyIndex) == arrayIndex); } if(!skipKey) { bool keyIsString = (lua_type(L, keyIndex) == LUA_TSTRING); bool invalidLuaIdentifier = (!keyIsString || !isalphaorunderscore(*lua_tostring(L, keyIndex))); if(invalidLuaIdentifier) if(keyIsString) APPENDPRINT "['" END else APPENDPRINT "[" END toCStringConverter(L, keyIndex, ptr, remaining); // key if(invalidLuaIdentifier) if(keyIsString) APPENDPRINT "']=" END else APPENDPRINT "]=" END else APPENDPRINT "=" END } bool valueIsString = (lua_type(L, valueIndex) == LUA_TSTRING); if(valueIsString) APPENDPRINT "'" END toCStringConverter(L, valueIndex, ptr, remaining); // value if(valueIsString) APPENDPRINT "'" END lua_pop(L, 1); if(remaining <= 0) { lua_settop(L, keyIndex-1); // stack might not be clean yet if we're breaking early break; } } APPENDPRINT "}" END } } break; } if(usedMeta) { s_metacallStack.pop_back(); lua_pop(L, 1); } } static const int s_tempStrMaxLen = 64 * 1024; static char s_tempStr [s_tempStrMaxLen]; static char* rawToCString(lua_State* L, int idx) { int a = idx>0 ? idx : 1; int n = idx>0 ? idx : lua_gettop(L); char* ptr = s_tempStr; *ptr = 0; int remaining = s_tempStrMaxLen; for(int i = a; i <= n; i++) { toCStringConverter(L, i, ptr, remaining); if(i != n) APPENDPRINT " " END } if(remaining < 3) { while(remaining < 6) remaining++, ptr--; APPENDPRINT "..." END } APPENDPRINT "\r\n" END // the trailing newline is so print() can avoid having to do wasteful things to print its newline // (string copying would be wasteful and calling info.print() twice can be extremely slow) // at the cost of functions that don't want the newline needing to trim off the last two characters // (which is a very fast operation and thus acceptable in this case) return s_tempStr; } #undef APPENDPRINT #undef END // replacement for luaB_tostring() that is able to show the contents of tables (and formats numbers better, and show function prototypes) // can be called directly from lua via tostring(), assuming tostring hasn't been reassigned DEFINE_LUA_FUNCTION(tostring, "...") { char* str = rawToCString(L); str[strlen(str)-2] = 0; // hack: trim off the \r\n (which is there to simplify the print function's task) lua_pushstring(L, str); return 1; } // like rawToCString, but will check if the global Lua function tostring() // has been replaced with a custom function, and call that instead if so static const char* toCString(lua_State* L, int idx) { int a = idx>0 ? idx : 1; int n = idx>0 ? idx : lua_gettop(L); lua_getglobal(L, "tostring"); lua_CFunction cf = lua_tocfunction(L,-1); if(cf == tostring) // optimization: if using our own C tostring function, we can bypass the call through Lua and all the string object allocation that would entail { lua_pop(L,1); return rawToCString(L, idx); } else // if the user overrided the tostring function, we have to actually call it and store the temporarily allocated string it returns { lua_pushstring(L, ""); for (int i=a; i<=n; i++) { lua_pushvalue(L, -2); // function to be called lua_pushvalue(L, i); // value to print lua_call(L, 1, 1); if(lua_tostring(L, -1) == NULL) luaL_error(L, LUA_QL("tostring") " must return a string to " LUA_QL("print")); lua_pushstring(L, (il_G->mainthread]; LuaContextInfo& info = GetCurrentInfo(); if(info.print) info.print(uid, str); else puts(str); worry(L, 100); return 0; } DEFINE_LUA_FUNCTION(emu_message, "str") { const char* str = toCString(L); driver->USR_InfoMessage(str); return 0; } // provides an easy way to copy a table from Lua // (simple assignment only makes an alias, but sometimes an independent table is desired) // currently this function only performs a shallow copy, // but I think it should be changed to do a deep copy (possibly of configurable depth?) // that maintains the internal table reference structure DEFINE_LUA_FUNCTION(copytable, "origtable") { int origIndex = 1; // we only care about the first argument int origType = lua_type(L, origIndex); if(origType == LUA_TNIL) { lua_pushnil(L); return 1; } if(origType != LUA_TTABLE) { luaL_typerror(L, 1, lua_typename(L, LUA_TTABLE)); lua_pushnil(L); return 1; } lua_createtable(L, lua_objlen(L,1), 0); int copyIndex = lua_gettop(L); lua_pushnil(L); // first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; while(lua_next(L, origIndex)) { lua_pushvalue(L, keyIndex); lua_pushvalue(L, valueIndex); lua_rawset(L, copyIndex); // copytable[key] = value lua_pop(L, 1); } // copy the reference to the metatable as well, if any if(lua_getmetatable(L, origIndex)) lua_setmetatable(L, copyIndex); return 1; // return the new table } // because print traditionally shows the address of tables, // and the print function I provide instead shows the contents of tables, // I also provide this function // (otherwise there would be no way to see a table's address, AFAICT) DEFINE_LUA_FUNCTION(addressof, "table_or_function") { const void* ptr = lua_topointer(L,-1); lua_pushinteger(L, (lua_Integer)ptr); return 1; } // the following bit operations are ported from LuaBitOp 1.0.1, // because it can handle the sign bit (bit 31) correctly. /* ** Lua BitOp -- a bit operations library for Lua 5.1. ** http://bitop.luajit.org/ ** ** Copyright (C) 2008-2009 Mike Pall. All rights reserved. ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** ** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] */ #ifdef _MSC_VER /* MSVC is stuck in the last century and doesn't have C99's stdint.h. */ typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include #endif typedef int32_t SBits; typedef uint32_t UBits; typedef union { lua_Number n; #ifdef LUA_NUMBER_DOUBLE uint64_t b; #else UBits b; #endif } BitNum; /* Convert argument to bit type. */ static UBits barg(lua_State *L, int idx) { BitNum bn; UBits b; bn.n = lua_tonumber(L, idx); #if defined(LUA_NUMBER_DOUBLE) bn.n += 6755399441055744.0; /* 2^52+2^51 */ #ifdef SWAPPED_DOUBLE b = (UBits)(bn.b >> 32); #else b = (UBits)bn.b; #endif #elif defined(LUA_NUMBER_INT) || defined(LUA_NUMBER_LONG) || \ defined(LUA_NUMBER_LONGLONG) || defined(LUA_NUMBER_LONG_LONG) || \ defined(LUA_NUMBER_LLONG) if (sizeof(UBits) == sizeof(lua_Number)) b = bn.b; else b = (UBits)(SBits)bn.n; #elif defined(LUA_NUMBER_FLOAT) #error "A 'float' lua_Number type is incompatible with this library" #else #error "Unknown number type, check LUA_NUMBER_* in luaconf.h" #endif if (b == 0 && !lua_isnumber(L, idx)) luaL_typerror(L, idx, "number"); return b; } /* Return bit type. */ #define BRET(b) lua_pushnumber(L, (lua_Number)(SBits)(b)); return 1; DEFINE_LUA_FUNCTION(bit_tobit, "x") { BRET(barg(L, 1)) } DEFINE_LUA_FUNCTION(bit_bnot, "x") { BRET(~barg(L, 1)) } #define BIT_OP(func, opr) \ DEFINE_LUA_FUNCTION(func, "x1 [,x2...]") { int i; UBits b = barg(L, 1); \ for (i = lua_gettop(L); i > 1; i--) b opr barg(L, i); BRET(b) } BIT_OP(bit_band, &=) BIT_OP(bit_bor, |=) BIT_OP(bit_bxor, ^=) #define bshl(b, n) (b << n) #define bshr(b, n) (b >> n) #define bsar(b, n) ((SBits)b >> n) #define brol(b, n) ((b << n) | (b >> (32-n))) #define bror(b, n) ((b << (32-n)) | (b >> n)) #define BIT_SH(func, fn) \ DEFINE_LUA_FUNCTION(func, "x, n") { \ UBits b = barg(L, 1); UBits n = barg(L, 2) & 31; BRET(fn(b, n)) } BIT_SH(bit_lshift, bshl) BIT_SH(bit_rshift, bshr) BIT_SH(bit_arshift, bsar) BIT_SH(bit_rol, brol) BIT_SH(bit_ror, bror) DEFINE_LUA_FUNCTION(bit_bswap, "x") { UBits b = barg(L, 1); b = (b >> 24) | ((b >> 8) & 0xff00) | ((b & 0xff00) << 8) | (b << 24); BRET(b) } DEFINE_LUA_FUNCTION(bit_tohex, "x [,n]") { UBits b = barg(L, 1); SBits n = lua_isnone(L, 2) ? 8 : (SBits)barg(L, 2); const char *hexdigits = "0123456789abcdef"; char buf[8]; int i; if (n < 0) { n = -n; hexdigits = "0123456789ABCDEF"; } if (n > 8) n = 8; for (i = (int)n; --i >= 0; ) { buf[i] = hexdigits[b & 15]; b >>= 4; } lua_pushlstring(L, buf, (size_t)n); return 1; } static const struct luaL_Reg bit_funcs[] = { { "tobit", bit_tobit }, { "bnot", bit_bnot }, { "band", bit_band }, { "bor", bit_bor }, { "bxor", bit_bxor }, { "lshift", bit_lshift }, { "rshift", bit_rshift }, { "arshift", bit_arshift }, { "rol", bit_rol }, { "ror", bit_ror }, { "bswap", bit_bswap }, { "tohex", bit_tohex }, { NULL, NULL } }; /* Signed right-shifts are implementation-defined per C89/C99. ** But the de facto standard are arithmetic right-shifts on two's ** complement CPUs. This behaviour is required here, so test for it. */ #define BAD_SAR (bsar(-8, 2) != (SBits)-2) bool luabitop_validate(lua_State *L) // originally named as luaopen_bit { UBits b; lua_pushnumber(L, (lua_Number)1437217655L); b = barg(L, -1); if (b != (UBits)1437217655L || BAD_SAR) { /* Perform a simple self-test. */ const char *msg = "compiled with incompatible luaconf.h"; #ifdef LUA_NUMBER_DOUBLE #if defined(_WIN32) if (b == (UBits)1610612736L) msg = "use D3DCREATE_FPU_PRESERVE with DirectX"; #endif if (b == (UBits)1127743488L) msg = "not compiled with SWAPPED_DOUBLE"; #endif if (BAD_SAR) msg = "arithmetic right-shift broken"; luaL_error(L, "bit library self-test failed (%s)", msg); return false; } return true; } // LuaBitOp ends here DEFINE_LUA_FUNCTION(bitshift, "num,shift") { int shift = luaL_checkinteger(L,2); if (shift < 0) { lua_pushinteger(L, -shift); lua_replace(L, 2); return bit_lshift(L); } else return bit_rshift(L); } DEFINE_LUA_FUNCTION(bitbit, "whichbit") { int rv = 0; int numArgs = lua_gettop(L); for(int i = 1; i <= numArgs; i++) { int where = luaL_checkinteger(L,i); if (where >= 0 && where < 32) rv |= (1 << where); } lua_settop(L,0); BRET(rv); } int emu_wait(lua_State* L); int dontworry(LuaContextInfo& info); void indicateBusy(lua_State* L, bool busy) { // disabled because there have been complaints about this message being useless spam. // the script window's title changing should be sufficient, I guess. /* if(busy) { const char* fmt = "script became busy (frozen?)"; va_list argp; va_start(argp, fmt); luaL_where(L, 0); lua_pushvfstring(L, fmt, argp); va_end(argp); lua_concat(L, 2); LuaContextInfo& info = GetCurrentInfo(); int uid = luaStateToUIDMap[L->l_G->mainthread]; if(info.print) { info.print(uid, lua_tostring(L,-1)); info.print(uid, "\r\n"); } else { fprintf(stderr, "%s\n", lua_tostring(L,-1)); } lua_pop(L, 1); } */ #if defined(_WIN32) int uid = luaStateToUIDMap[L->l_G->mainthread]; HWND hDlg = (HWND)uid; char str [1024]; GetWindowText(hDlg, str, 1000); char* extra = strchr(str, '<'); if(busy) { if(!extra) extra = str + strlen(str), *extra++ = ' '; strcpy(extra, ""); } else { if(extra) extra[-1] = 0; } SetWindowText(hDlg, str); #endif } #define HOOKCOUNT 4096 #define MAX_WORRY_COUNT 6000 void LuaRescueHook(lua_State* L, lua_Debug *dbg) { LuaContextInfo& info = GetCurrentInfo(); info.worryCount++; if(info.stopWorrying && !info.panic) { if(info.worryCount > (MAX_WORRY_COUNT >> 2)) { // the user already said they're OK with the script being frozen, // but we don't trust their judgement completely, // so periodically update the main loop so they have a chance to manually stop it info.worryCount = 0; emu_wait(L); info.stopWorrying = true; } return; } if(info.worryCount > MAX_WORRY_COUNT || info.panic) { info.worryCount = 0; info.stopWorrying = false; bool stoprunning = true; bool stopworrying = true; if(!info.panic) { SPU_ClearOutputBuffer(); #if defined(ASK_USER_ON_FREEZE) && defined(_WIN32) DialogsOpen++; int answer = MessageBox(HWnd, "A Lua script has been running for quite a while. Maybe it is in an infinite loop.\n\nWould you like to stop the script?\n\n(Yes to stop it now,\n No to keep running and not ask again,\n Cancel to keep running but ask again later)", "Lua Alert", MB_YESNOCANCEL | MB_DEFBUTTON3 | MB_ICONASTERISK); DialogsOpen--; if(answer == IDNO) stoprunning = false; if(answer == IDCANCEL) stopworrying = false; #else stoprunning = false; #endif } if(!stoprunning && stopworrying) { info.stopWorrying = true; // don't remove the hook because we need it still running for RequestAbortLuaScript to work indicateBusy(info.L, true); } if(stoprunning) { //lua_sethook(L, NULL, 0, 0); assert(L->errfunc || L->errorJmp); luaL_error(L, info.panic ? info.panicMessage : "terminated by user"); } info.panic = false; } } void printfToOutput(const char* fmt, ...) { va_list list; va_start(list, fmt); int len = vscprintf(fmt, list); char* str = new char[len+1]; vsprintf(str, fmt, list); va_end(list); LuaContextInfo& info = GetCurrentInfo(); if(info.print) { lua_State* L = info.L; int uid = luaStateToUIDMap[L->l_G->mainthread]; info.print(uid, str); info.print(uid, "\r\n"); worry(L,300); } else { fprintf(stdout, "%s\n", str); } delete[] str; } bool FailVerifyAtFrameBoundary(lua_State* L, const char* funcName, int unstartedSeverity=2, int inframeSeverity=2) { if (!driver->EMU_HasEmulationStarted()) { static const char* msg = "cannot call %s() when emulation has not started."; switch(unstartedSeverity) { case 0: break; case 1: printfToOutput(msg, funcName); break; default: case 2: luaL_error(L, msg, funcName); break; } return true; } if(!driver->EMU_IsAtFrameBoundary()) { static const char* msg = "cannot call %s() inside an emulation frame."; switch(inframeSeverity) { case 0: break; case 1: printfToOutput(msg, funcName); break; default: case 2: luaL_error(L, msg, funcName); break; } return true; } return false; } // wrapper for EMU_StepMainLoop that provides a default implementation if ESTEP_NOT_IMPLEMENTED is returned. // which only works if called from a function whose return value will get returned to Lua directly. // TODO: actually implement the default case by making the main thread we use into a coroutine and resuming it periodically static bool stepped_emulation = false; // <-- this is the result of running the macro #define StepEmulationOnce(allowSleep, allowPause, frameSkip, disableUser, disableCore) \ switch(driver->EMU_StepMainLoop(allowSleep, allowPause, frameSkip, disableUser, disableCore)) \ { default: \ case BaseDriver::ESTEP_NOT_IMPLEMENTED: /*return lua_yield(L, 0);*/ luaL_error(L, "Lua frame advance functions are not yet implemented for this platform, and neither is the fallback implementation."); break;/*TODO*/ \ case BaseDriver::ESTEP_CALL_AGAIN: stepped_emulation = !driver->EMU_HasEmulationStarted(); break; \ case BaseDriver::ESTEP_DONE: stepped_emulation = true; break; \ } // same as StepEmulationOnce, except calls EMU_StepMainLoop multiple times if it returns ESTEP_CALL_AGAIN #define StepEmulation(allowSleep, allowPause, frameSkip, disableUser, disableCore) \ do { \ StepEmulationOnce(allowSleep, allowPause, frameSkip, disableUser, disableCore); \ if(stepped_emulation || (info).panic) break; \ } while(true) // note: caller must return the value this returns to Lua (at least if nonzero) int StepEmulationAtSpeed(lua_State* L, SpeedMode speedMode, bool allowPause) { int postponeTime; bool drawNextFrame; int worryIntensity; bool allowSleep; int frameSkip; bool disableUserFeedback; LuaContextInfo& info = GetCurrentInfo(); switch(speedMode) { default: case SPEEDMODE_NORMAL: postponeTime = 0, drawNextFrame = true, worryIntensity = 300; allowSleep = true; frameSkip = -1; disableUserFeedback = false; break; case SPEEDMODE_NOTHROTTLE: postponeTime = 250, drawNextFrame = true, worryIntensity = 200; allowSleep = driver->EMU_IsEmulationPaused(); frameSkip = driver->EMU_IsFastForwarding() ? -1 : 0; disableUserFeedback = false; break; case SPEEDMODE_TURBO: postponeTime = 500, drawNextFrame = true, worryIntensity = 150; allowSleep = driver->EMU_IsEmulationPaused(); frameSkip = 16; disableUserFeedback = false; break; case SPEEDMODE_MAXIMUM: postponeTime = 1000, drawNextFrame = false, worryIntensity = 100; allowSleep = driver->EMU_IsEmulationPaused(); frameSkip = 65535; disableUserFeedback = true; break; } driver->USR_SetDisplayPostpone(postponeTime, drawNextFrame); allowPause ? dontworry(info) : worry(L, worryIntensity); if(!allowPause && driver->EMU_IsEmulationPaused()) driver->EMU_PauseEmulation(false); StepEmulation(allowSleep, allowPause, frameSkip, disableUserFeedback, false); return 0; } // acts similar to normal emulation update DEFINE_LUA_FUNCTION(emu_emulateframe, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframe", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_NORMAL, false); } // acts as a fast-forward emulation update that still renders every frame DEFINE_LUA_FUNCTION(emu_emulateframefastnoskipping, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframefastnoskipping", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_NOTHROTTLE, false); } // acts as a fast-forward emulation update DEFINE_LUA_FUNCTION(emu_emulateframefast, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframefast", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_TURBO, false); } // acts as an extremely-fast-forward emulation update // that also doesn't render any graphics or generate any sounds DEFINE_LUA_FUNCTION(emu_emulateframeinvisible, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframeinvisible", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_MAXIMUM, false); } DEFINE_LUA_FUNCTION(emu_speedmode, "mode") { SpeedMode newSpeedMode = SPEEDMODE_NORMAL; if(lua_isnumber(L,1)) newSpeedMode = (SpeedMode)luaL_checkinteger(L,1); else { const char* str = luaL_checkstring(L,1); if(!stricmp(str, "normal")) newSpeedMode = SPEEDMODE_NORMAL; else if(!stricmp(str, "nothrottle")) newSpeedMode = SPEEDMODE_NOTHROTTLE; else if(!stricmp(str, "turbo")) newSpeedMode = SPEEDMODE_TURBO; else if(!stricmp(str, "maximum")) newSpeedMode = SPEEDMODE_MAXIMUM; } LuaContextInfo& info = GetCurrentInfo(); info.speedMode = newSpeedMode; RefreshScriptSpeedStatus(); return 0; } // tells the emulation to wait while the script is doing calculations // can call this periodically instead of emu.frameadvance // note that the user can use hotkeys at this time // (e.g. a savestate could possibly get loaded before emu.wait() returns) DEFINE_LUA_FUNCTION(emu_wait, "") { LuaContextInfo& info = GetCurrentInfo(); StepEmulationOnce(false, false, -1, true, true); dontworry(info); return 0; } DEFINE_LUA_FUNCTION(emu_frameadvance, "") { if(FailVerifyAtFrameBoundary(L, "emu.frameadvance", 0,1)) return emu_wait(L); int uid = luaStateToUIDMap[L->l_G->mainthread]; LuaContextInfo& info = GetCurrentInfo(); if(!info.ranFrameAdvance) { // otherwise we'll never see the first frame of GUI drawing if(info.speedMode != SPEEDMODE_MAXIMUM) driver->USR_RefreshScreen(); info.ranFrameAdvance = true; } return StepEmulationAtSpeed(L, info.speedMode, true); } DEFINE_LUA_FUNCTION(emu_pause, "") { driver->EMU_PauseEmulation(true); LuaContextInfo& info = GetCurrentInfo(); StepEmulation(true, true, 0, true, true); // allow the user to not have to manually unpause // after restarting a script that used emu.pause() if(info.panic) driver->EMU_PauseEmulation(false); return 0; } DEFINE_LUA_FUNCTION(emu_unpause, "") { LuaContextInfo& info = GetCurrentInfo(); driver->EMU_PauseEmulation(false); return 0; } DEFINE_LUA_FUNCTION(emu_redraw, "") { driver->USR_RefreshScreen(); worry(L,250); return 0; } DEFINE_LUA_FUNCTION(memory_readbyte, "address") { int address = luaL_checkinteger(L,1); unsigned char value = (unsigned char)(_MMU_read08(address) & 0xFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; // we return the number of return values } DEFINE_LUA_FUNCTION(memory_readbytesigned, "address") { int address = luaL_checkinteger(L,1); signed char value = (signed char)(_MMU_read08(address) & 0xFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(vram_readword, "address") { int address = luaL_checkinteger(L,1); u16 value = T1ReadWord(MMU.ARM9_LCD,address); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_readword, "address") { int address = luaL_checkinteger(L,1); unsigned short value = (unsigned short)(_MMU_read16(address) & 0xFFFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_readwordsigned, "address") { int address = luaL_checkinteger(L,1); signed short value = (signed short)(_MMU_read16(address) & 0xFFFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_readdword, "address") { int address = luaL_checkinteger(L,1); unsigned long value = (unsigned long)(_MMU_read32(address)); lua_settop(L,0); lua_pushnumber(L, value); // can't use pushinteger in this case (out of range) return 1; } DEFINE_LUA_FUNCTION(memory_readdwordsigned, "address") { int address = luaL_checkinteger(L,1); signed long value = (signed long)(_MMU_read32(address)); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_writebyte, "address,value") { int address = luaL_checkinteger(L,1); unsigned char value = (unsigned char)(luaL_checkinteger(L,2) & 0xFF); _MMU_write08(address, value); return 0; } DEFINE_LUA_FUNCTION(memory_writeword, "address,value") { int address = luaL_checkinteger(L,1); unsigned short value = (unsigned short)(luaL_checkinteger(L,2) & 0xFFFF); _MMU_write16(address, value); return 0; } DEFINE_LUA_FUNCTION(vram_writeword, "address,value") { int address = luaL_checkinteger(L,1); u16 value = (u16)(luaL_checkinteger(L,2) & 0xFFFF); T1WriteWord(MMU.ARM9_LCD,address,value); return 0; } DEFINE_LUA_FUNCTION(memory_writedword, "address,value") { int address = luaL_checkinteger(L,1); unsigned long value = (unsigned long)(luaL_checkinteger(L,2)); _MMU_write32(address, value); return 0; } DEFINE_LUA_FUNCTION(memory_readbyterange, "address,length") { int address = luaL_checkinteger(L,1); int length = luaL_checkinteger(L,2); if(length < 0) { address += length; length = -length; } // push the array lua_createtable(L, abs(length), 0); // put all the values into the (1-based) array for(int a = address, n = 1; n <= length; a++, n++) { if(IsHardwareAddressValid(a)) { unsigned char value = (unsigned char)(_MMU_read08(a) & 0xFF); lua_pushinteger(L, value); lua_rawseti(L, -2, n); } // else leave the value nil } return 1; } DEFINE_LUA_FUNCTION(memory_isvalid, "address") { int address = luaL_checkinteger(L,1); lua_settop(L,0); lua_pushboolean(L, IsHardwareAddressValid(address)); return 1; } struct registerPointerMap { const char* registerName; unsigned int* pointer; int dataSize; }; #define RPM_ENTRY(name,var) {name, (unsigned int*)&var, sizeof(var)}, registerPointerMap arm9PointerMap [] = { RPM_ENTRY("r0", NDS_ARM9.R[0]) RPM_ENTRY("r1", NDS_ARM9.R[1]) RPM_ENTRY("r2", NDS_ARM9.R[2]) RPM_ENTRY("r3", NDS_ARM9.R[3]) RPM_ENTRY("r4", NDS_ARM9.R[4]) RPM_ENTRY("r5", NDS_ARM9.R[5]) RPM_ENTRY("r6", NDS_ARM9.R[6]) RPM_ENTRY("r7", NDS_ARM9.R[7]) RPM_ENTRY("r8", NDS_ARM9.R[8]) RPM_ENTRY("r9", NDS_ARM9.R[9]) RPM_ENTRY("r10", NDS_ARM9.R[10]) RPM_ENTRY("r11", NDS_ARM9.R[11]) RPM_ENTRY("r12", NDS_ARM9.R[12]) RPM_ENTRY("r13", NDS_ARM9.R[13]) RPM_ENTRY("r14", NDS_ARM9.R[14]) RPM_ENTRY("r15", NDS_ARM9.R[15]) RPM_ENTRY("cpsr", NDS_ARM9.CPSR.val) RPM_ENTRY("spsr", NDS_ARM9.SPSR.val) {} }; registerPointerMap arm7PointerMap [] = { RPM_ENTRY("r0", NDS_ARM7.R[0]) RPM_ENTRY("r1", NDS_ARM7.R[1]) RPM_ENTRY("r2", NDS_ARM7.R[2]) RPM_ENTRY("r3", NDS_ARM7.R[3]) RPM_ENTRY("r4", NDS_ARM7.R[4]) RPM_ENTRY("r5", NDS_ARM7.R[5]) RPM_ENTRY("r6", NDS_ARM7.R[6]) RPM_ENTRY("r7", NDS_ARM7.R[7]) RPM_ENTRY("r8", NDS_ARM7.R[8]) RPM_ENTRY("r9", NDS_ARM7.R[9]) RPM_ENTRY("r10", NDS_ARM7.R[10]) RPM_ENTRY("r11", NDS_ARM7.R[11]) RPM_ENTRY("r12", NDS_ARM7.R[12]) RPM_ENTRY("r13", NDS_ARM7.R[13]) RPM_ENTRY("r14", NDS_ARM7.R[14]) RPM_ENTRY("r15", NDS_ARM7.R[15]) RPM_ENTRY("cpsr", NDS_ARM7.CPSR.val) RPM_ENTRY("spsr", NDS_ARM7.SPSR.val) {} }; struct cpuToRegisterMap { const char* cpuName; registerPointerMap* rpmap; } cpuToRegisterMaps [] = { {"arm9.", arm9PointerMap}, {"main.", arm9PointerMap}, {"arm7.", arm7PointerMap}, {"sub.", arm7PointerMap}, {"", arm9PointerMap}, }; DEFINE_LUA_FUNCTION(memory_getregister, "cpu_dot_registername_string") { const char* qualifiedRegisterName = luaL_checkstring(L,1); lua_settop(L,0); for(int cpu = 0; cpu < sizeof(cpuToRegisterMaps)/sizeof(*cpuToRegisterMaps); cpu++) { cpuToRegisterMap ctrm = cpuToRegisterMaps[cpu]; int cpuNameLen = strlen(ctrm.cpuName); if(!strnicmp(qualifiedRegisterName, ctrm.cpuName, cpuNameLen)) { qualifiedRegisterName += cpuNameLen; for(int reg = 0; ctrm.rpmap[reg].dataSize; reg++) { registerPointerMap rpm = ctrm.rpmap[reg]; if(!stricmp(qualifiedRegisterName, rpm.registerName)) { switch(rpm.dataSize) { default: case 1: lua_pushinteger(L, *(unsigned char*)rpm.pointer); break; case 2: lua_pushinteger(L, *(unsigned short*)rpm.pointer); break; case 4: lua_pushinteger(L, *(unsigned long*)rpm.pointer); break; } return 1; } } lua_pushnil(L); return 1; } } lua_pushnil(L); return 1; } DEFINE_LUA_FUNCTION(memory_setregister, "cpu_dot_registername_string,value") { const char* qualifiedRegisterName = luaL_checkstring(L,1); unsigned long value = (unsigned long)(luaL_checkinteger(L,2)); lua_settop(L,0); for(int cpu = 0; cpu < sizeof(cpuToRegisterMaps)/sizeof(*cpuToRegisterMaps); cpu++) { cpuToRegisterMap ctrm = cpuToRegisterMaps[cpu]; int cpuNameLen = strlen(ctrm.cpuName); if(!strnicmp(qualifiedRegisterName, ctrm.cpuName, cpuNameLen)) { qualifiedRegisterName += cpuNameLen; for(int reg = 0; ctrm.rpmap[reg].dataSize; reg++) { registerPointerMap rpm = ctrm.rpmap[reg]; if(!stricmp(qualifiedRegisterName, rpm.registerName)) { switch(rpm.dataSize) { default: case 1: *(unsigned char*)rpm.pointer = (unsigned char)(value & 0xFF); break; case 2: *(unsigned short*)rpm.pointer = (unsigned short)(value & 0xFFFF); break; case 4: *(unsigned long*)rpm.pointer = value; break; } return 0; } } return 0; } } return 0; } DEFINE_LUA_FUNCTION(state_create, "[location]") { if(lua_isnumber(L,1)) { // simply return the integer that got passed in // (that's as good a savestate object as any for a numbered savestate slot) lua_settop(L,1); return 1; } // allocate a pointer to an in-memory/anonymous savestate EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)lua_newuserdata(L, sizeof(EMUFILE_MEMORY*)); *ppEmuFile = new EMUFILE_MEMORY(); luaL_getmetatable(L, "EMUFILE_MEMORY*"); lua_setmetatable(L, -2); return 1; } // savestate.save(location [, option]) // saves the current emulation state to the given location // you can pass in either a savestate file number (an integer), // OR you can pass in a savestate object that was returned by savestate.create() // if option is "quiet" then any warning messages will be suppressed // if option is "scriptdataonly" then the state will not actually be saved, but any save callbacks will still get called and their results will be saved (see savestate.registerload()/savestate.registersave()) DEFINE_LUA_FUNCTION(state_save, "location[,option]") { //const char* option = (lua_type(L,2) == LUA_TSTRING) ? lua_tostring(L,2) : NULL; //if(option) //{ // if(!stricmp(option, "quiet")) // I'm not sure if saving can generate warning messages, but we might as well support suppressing them should they turn out to exist // g_disableStatestateWarnings = true; // else if(!stricmp(option, "scriptdataonly")) // TODO // g_onlyCallSavestateCallbacks = true; //} //struct Scope { ~Scope(){ g_disableStatestateWarnings = false; g_onlyCallSavestateCallbacks = false; } } scope; // needs to run even if the following code throws an exception... maybe I should have put this in a "finally" block instead, but this project seems to have something against using the "try" statement if(/*!g_onlyCallSavestateCallbacks &&*/ FailVerifyAtFrameBoundary(L, "savestate.save", 2,2)) return 0; int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { int stateNumber = luaL_checkinteger(L,1); savestate_slot(stateNumber); } return 0; case LUA_TUSERDATA: // in-memory save slot { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); (*ppEmuFile)->fseek(0, SEEK_SET); if((*ppEmuFile)->fail()) luaL_error(L, "failed to save, savestate object was dead."); savestate_save(*ppEmuFile, 0); if((*ppEmuFile)->fail()) luaL_error(L, "failed to save savestate!"); if((*ppEmuFile)->size() == 0) luaL_error(L, "failed to save, savestate became empty somehow."); } return 0; } } // savestate.load(location [, option]) // loads the current emulation state from the given location // you can pass in either a savestate file number (an integer), // OR you can pass in a savestate object that was returned by savestate.create() and has already saved to with savestate.save() // if option is "quiet" then any warning messages will be suppressed // if option is "scriptdataonly" then the state will not actually be loaded, but load callbacks will still get called and supplied with the data saved by save callbacks (see savestate.registerload()/savestate.registersave()) DEFINE_LUA_FUNCTION(state_load, "location[,option]") { //const char* option = (lua_type(L,2) == LUA_TSTRING) ? lua_tostring(L,2) : NULL; //if(option) //{ // if(!stricmp(option, "quiet")) // g_disableStatestateWarnings = true; // else if(!stricmp(option, "scriptdataonly")) // TODO // g_onlyCallSavestateCallbacks = true; //} //struct Scope { ~Scope(){ g_disableStatestateWarnings = false; g_onlyCallSavestateCallbacks = false; } } scope; // needs to run even if the following code throws an exception... maybe I should have put this in a "finally" block instead, but this project seems to have something against using the "try" statement if(/*!g_onlyCallSavestateCallbacks &&*/ FailVerifyAtFrameBoundary(L, "savestate.load", 2,2)) return 0; // g_disableStatestateWarnings = lua_toboolean(L,2) != 0; int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { //LuaContextInfo& info = GetCurrentInfo(); //if(info.rerecordCountingDisabled) // SkipNextRerecordIncrement = true; int stateNumber = luaL_checkinteger(L,1); loadstate_slot(stateNumber); } return 0; case LUA_TUSERDATA: // in-memory save slot { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); (*ppEmuFile)->fseek(0, SEEK_SET); if((*ppEmuFile)->fail()) luaL_error(L, "failed to load, savestate object was dead."); if((*ppEmuFile)->size() == 0) luaL_error(L, "failed to load, savestate wasn't saved first."); savestate_load(*ppEmuFile); if((*ppEmuFile)->fail()) luaL_error(L, "failed to load savestate!"); } return 0; } } // savestate.loadscriptdata(location) // returns the user data associated with the given savestate // without actually loading the rest of that savestate or calling any callbacks. // you can pass in either a savestate file number (an integer), // OR you can pass in a savestate object that was returned by savestate.create() // but note that currently only non-anonymous savestates can have associated scriptdata // // also note that this returns the same values // that would be passed into a registered load function. // the main reason this exists also is so you can register a load function that // chooses whether or not to load the scriptdata instead of always loading it, // and also to provide a nicer interface for loading scriptdata // without needing to trigger savestate loading first DEFINE_LUA_FUNCTION(state_loadscriptdata, "location") { int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { // TODO //int stateNumber = luaL_checkinteger(L,1); //Set_Current_State(stateNumber, false,false); //char Name [1024] = {0}; //Get_State_File_Name(Name); //{ // LuaSaveData saveData; // char luaSaveFilename [512]; // strncpy(luaSaveFilename, Name, 512); // luaSaveFilename[512-(1+7/*strlen(".luasav")*/)] = '\0'; // strcat(luaSaveFilename, ".luasav"); // FILE* luaSaveFile = fopen(luaSaveFilename, "rb"); // if(luaSaveFile) // { // saveData.ImportRecords(luaSaveFile); // fclose(luaSaveFile); // int uid = luaStateToUIDMap[L->l_G->mainthread]; // LuaContextInfo& info = GetCurrentInfo(); // lua_settop(L, 0); // saveData.LoadRecord(uid, info.dataLoadKey, (unsigned int)-1); // return lua_gettop(L); // } //} } return 0; case LUA_TUSERDATA: // in-memory save slot { // there can be no user data associated with those, at least not yet } return 0; } } // savestate.savescriptdata(location) // same as savestate.save(location, "scriptdataonly") // only provided for consistency with savestate.loadscriptdata(location) DEFINE_LUA_FUNCTION(state_savescriptdata, "location") { lua_settop(L, 1); lua_pushstring(L, "scriptdataonly"); return state_save(L); } #ifndef PUBLIC_RELEASE #include "gfx3d.h" class EMUFILE_MEMORY_VERIFIER : public EMUFILE_MEMORY { public: EMUFILE_MEMORY_VERIFIER(EMUFILE_MEMORY* underlying) : EMUFILE_MEMORY(underlying->get_vec()) { } std::vector differences; virtual size_t fwrite(const void *ptr, size_t bytes) { if(!failbit) { u8* dst = buf()+pos; const u8* src = (const u8*)ptr; int differencesAddedThisCall = 0; for(int i = pos; i < (int)bytes+pos; i++) { if(*src != *dst) { if(differences.size() == 100) failbit = true; else { char temp [256]; sprintf(temp, " " /*"mismatch at "*/ "byte %d(0x%X at 0x%X): %d(0x%X) != %d(0x%X)\n", i, i, dst, *src,*src, *dst,*dst); if(ptr == GPU_screen || ptr == gfx3d_convertedScreen) // ignore screen-only differences since frame skipping can cause them and it's probably ok break; differences.push_back(temp); // <-- probably the best place for a breakpoint if(++differencesAddedThisCall == 4) break; } } src++; dst++; } } pos += bytes; return bytes; } }; // like savestate.save() except instead of actually saving // it compares against what's already in the savestate // and throws an error if any differences are found. // only useful for development (catching desyncs). DEFINE_LUA_FUNCTION(state_verify, "location[,option]") { int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { luaL_error(L, "savestate.verify only works for in-memory saves."); } return 0; case LUA_TUSERDATA: // in-memory save slot { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); if((*ppEmuFile)->fail()) luaL_error(L, "failed to verify, savestate object was dead."); EMUFILE_MEMORY_VERIFIER verifier (*ppEmuFile); savestate_save(&verifier, 0); if(verifier.differences.size()) { fputs("\n", stdout); for(unsigned int i = 0; i < verifier.differences.size(); i++) fputs(verifier.differences[i].c_str(), stdout); luaL_error(L, "failed to verify savestate! %s", verifier.differences[0].c_str()); } } return 0; } } #endif //joypad lib static const char *button_mappings[] = { // G E W X Y A B S T U D L R F "debug","R","L","X","Y","A","B","start","select","up","down","left","right","lid" }; static int joy_getArgControllerNum(lua_State* L, int& index) { // well, I think there's only one controller, // but this should probably stay here for cross-emulator consistency int type = lua_type(L,index); if(type == LUA_TSTRING || type == LUA_TNUMBER) index++; return 1; } // joypad.set(table buttons) // // Sets the joypad state (takes effect at the next frame boundary) // true -> pressed // false -> unpressed // nil -> no change DEFINE_LUA_FUNCTION(joy_set, "buttonTable") { if(movieMode == MOVIEMODE_PLAY) // don't allow tampering with a playing movie's input return 0; // (although it might be useful sometimes...) if(!NDS_isProcessingUserInput()) { // defer this function until when we are processing input DeferFunctionCall(L, deferredJoySetIDString); return 0; } int index = 1; (void)joy_getArgControllerNum(L, index); luaL_checktype(L, index, LUA_TTABLE); UserButtons& buttons = NDS_getProcessingUserInput().buttons; for(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++) { const char* name = button_mappings[i]; lua_getfield(L, index, name); if (!lua_isnil(L,-1)) { bool pressed = lua_toboolean(L,-1) != 0; buttons.array[i] = pressed; } lua_pop(L,1); } return 0; } // table joypad.read() // // Reads the joypad state (what the game sees) int joy_get_internal(lua_State* L, bool reportUp, bool reportDown) { int index = 1; (void)joy_getArgControllerNum(L, index); lua_newtable(L); const UserButtons& buttons = NDS_getFinalUserInput().buttons; for(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++) { const char* name = button_mappings[i]; bool pressed = buttons.array[i]; if((pressed && reportDown) || (!pressed && reportUp)) { lua_pushboolean(L, pressed); lua_setfield(L, -2, name); } } return 1; } // joypad.get() // returns a table of every game button, // true meaning currently-held and false meaning not-currently-held // (as of last frame boundary) // this WILL read input from a currently-playing movie DEFINE_LUA_FUNCTION(joy_get, "") { return joy_get_internal(L, true, true); } // joypad.getdown() // returns a table of every game button that is currently held DEFINE_LUA_FUNCTION(joy_getdown, "") { return joy_get_internal(L, false, true); } // joypad.getup() // returns a table of every game button that is not currently held DEFINE_LUA_FUNCTION(joy_getup, "") { return joy_get_internal(L, true, false); } // table joypad.peek() // // Reads the joypad state (what the user is currently pressing/requesting) int joy_peek_internal(lua_State* L, bool reportUp, bool reportDown) { int index = 1; (void)joy_getArgControllerNum(L, index); lua_newtable(L); const UserButtons& buttons = NDS_getRawUserInput().buttons; for(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++) { const char* name = button_mappings[i]; bool pressed = buttons.array[i]; if((pressed && reportDown) || (!pressed && reportUp)) { lua_pushboolean(L, pressed); lua_setfield(L, -2, name); } } return 1; } // joypad.peek() // returns a table of every game button, // true meaning currently-held and false meaning not-currently-held // peek checks which joypad buttons are physically pressed, // so it will NOT read input from a playing movie, // it CAN read mid-frame input, // and it will NOT pay attention to stuff like disabled L+R/U+D DEFINE_LUA_FUNCTION(joy_peek, "") { return joy_peek_internal(L, true, true); } // joypad.peekdown() // returns a table of every game button that is currently held (according to what joypad.peek() would return) DEFINE_LUA_FUNCTION(joy_peekdown, "") { return joy_peek_internal(L, false, true); } // joypad.peekup() // returns a table of every game button that is not currently held (according to what joypad.peek() would return) DEFINE_LUA_FUNCTION(joy_peekup, "") { return joy_peek_internal(L, true, false); } static const struct ColorMapping { const char* name; int value; } s_colorMapping [] = { {"white", 0xFFFFFFFF}, {"black", 0x000000FF}, {"clear", 0x00000000}, {"gray", 0x7F7F7FFF}, {"grey", 0x7F7F7FFF}, {"red", 0xFF0000FF}, {"orange", 0xFF7F00FF}, {"yellow", 0xFFFF00FF}, {"chartreuse",0x7FFF00FF}, {"green", 0x00FF00FF}, {"teal", 0x00FF7FFF}, {"cyan" , 0x00FFFFFF}, {"blue", 0x0000FFFF}, {"purple", 0x7F00FFFF}, {"magenta", 0xFF00FFFF}, }; inline int getcolor_unmodified(lua_State *L, int idx, int defaultColor) { int type = lua_type(L,idx); switch(type) { case LUA_TNUMBER: { return lua_tointeger(L,idx); } break; case LUA_TSTRING: { const char* str = lua_tostring(L,idx); if(*str == '#') { int color; sscanf(str+1, "%X", &color); int len = strlen(str+1); int missing = std::max(0, 8-len); color <<= missing << 2; if(missing >= 2) color |= 0xFF; return color; } else for(int i = 0; i 255) value = 255; switch(key) { case 1: case 'r': color |= value << 24; break; case 2: case 'g': color |= value << 16; break; case 3: case 'b': color |= value << 8; break; case 4: case 'a': color = (color & ~0xFF) | value; break; } lua_pop(L, 1); } return color; } break; case LUA_TFUNCTION: return 0; } return defaultColor; } int getcolor(lua_State *L, int idx, int defaultColor) { int color = getcolor_unmodified(L, idx, defaultColor); LuaContextInfo& info = GetCurrentInfo(); if(info.transparencyModifier != 255) { int alpha = (((color & 0xFF) * info.transparencyModifier) / 255); if(alpha > 255) alpha = 255; color = (color & ~0xFF) | alpha; } return color; } // r,g,b,a = gui.parsecolor(color) // examples: // local r,g,b = gui.parsecolor("green") // local r,g,b,a = gui.parsecolor(0x7F3FFF7F) DEFINE_LUA_FUNCTION(gui_parsecolor, "color") { int color = getcolor_unmodified(L, 1, 0); int r = (color & 0xFF000000) >> 24; int g = (color & 0x00FF0000) >> 16; int b = (color & 0x0000FF00) >> 8; int a = (color & 0x000000FF); lua_pushinteger(L, r); lua_pushinteger(L, g); lua_pushinteger(L, b); lua_pushinteger(L, a); return 4; } static inline void blend32(u32 *dstPixel, u32 color) { u8 *dst = (u8*) dstPixel; int r = (color & 0xFF000000) >> 24; int g = (color & 0x00FF0000) >> 16; int b = (color & 0x0000FF00) >> 8; int a = color & 0x000000FF; if (a == 255) { // direct copy dst[0] = b; dst[1] = g; dst[2] = r; dst[3] = a; } else if (a == 0) { // do not copy } else { // alpha-blending u8 bo = dst[0]; u8 go = dst[1]; u8 ro = dst[2]; u8 ao = dst[3]; dst[0] = (((b - bo) * a + (bo << 8)) >> 8); dst[1] = (((g - go) * a + (go << 8)) >> 8); dst[2] = (((r - ro) * a + (ro << 8)) >> 8); dst[3] = ((a + ao) - ((a * ao + 0xFF) >> 8)); } } static LuaGUIData curGuiData; static void prepare_drawing() { curGuiData = GetCurrentInfo().guiData; } static void prepare_reading() { curGuiData = GetCurrentInfo().guiData; u32* buf = (u32*)aggDraw.screen->buf().buf(); if(buf) { curGuiData.data = buf; curGuiData.stridePix = aggDraw.screen->buf().stride_abs() / 4; } else { #if defined(WIN32) extern VideoInfo video; curGuiData.data = video.buffer; curGuiData.stridePix = 256; #endif } } // note: prepare_drawing or prepare_reading must be called, // before any of the following bunch of gui functions will work properly. // negative -> top // positive -> bottom // 0 -> both static void restrict_to_screen(int ySelectScreen) { if(ySelectScreen > 0) curGuiData.yMin = (curGuiData.yMin + curGuiData.yMax) >> 1; else if(ySelectScreen < 0) curGuiData.yMax = (curGuiData.yMin + curGuiData.yMax) >> 1; } // check if a pixel is in the lua canvas static FORCEINLINE bool gui_checkboundary(int x, int y) { return !(x < curGuiData.xMin || x >= curGuiData.xMax || y < curGuiData.yMin || y >= curGuiData.yMax); } static FORCEINLINE void gui_adjust_coord(int& x, int& y) { x += curGuiData.xOrigin; y += curGuiData.yOrigin; } static FORCEINLINE bool gui_checkbox(int x1, int y1, int x2, int y2) { if((x1 < curGuiData.xMin && x2 < curGuiData.xMin) || (x1 >= curGuiData.xMax && x2 >= curGuiData.xMax) || (y1 < curGuiData.yMin && y2 < curGuiData.yMin) || (y1 >= curGuiData.yMax && y2 >= curGuiData.yMax)) return false; return true; } // write a pixel (do not check boundaries for speedup) static FORCEINLINE void gui_drawpixel_unchecked(int x, int y, u32 color) { blend32((u32*) &curGuiData.data[y*curGuiData.stridePix+x], color); } // write a pixel (check boundaries) static FORCEINLINE void gui_drawpixel_checked(int x, int y, u32 color) { if (gui_checkboundary(x, y)) gui_drawpixel_unchecked(x, y, color); } static FORCEINLINE u32 gui_getpixel_unchecked(int x, int y) { return curGuiData.data[y*curGuiData.stridePix+x]; } static FORCEINLINE u32 gui_adjust_coord_and_getpixel(int x, int y) { x += curGuiData.xOrigin; y += curGuiData.yOrigin; x = min(max(x, curGuiData.xMin), curGuiData.xMax-1); y = min(max(y, curGuiData.yMin), curGuiData.yMax-1); return gui_getpixel_unchecked(x, y); } // draw a line (checks boundaries) static void gui_drawline_internal(int x1, int y1, int x2, int y2, bool lastPixel, u32 color) { // Note: New version of Bresenham's Line Algorithm // http://groups.google.co.jp/group/rec.games.roguelike.development/browse_thread/thread/345f4c42c3b25858/29e07a3af3a450e6?show_docid=29e07a3af3a450e6 int swappedx = 0; int swappedy = 0; int xtemp = x1-x2; int ytemp = y1-y2; if (xtemp == 0 && ytemp == 0) { gui_drawpixel_checked(x1, y1, color); return; } if (xtemp < 0) { xtemp = -xtemp; swappedx = 1; } if (ytemp < 0) { ytemp = -ytemp; swappedy = 1; } int delta_x = xtemp << 1; int delta_y = ytemp << 1; signed char ix = x1 > x2?1:-1; signed char iy = y1 > y2?1:-1; if (lastPixel) gui_drawpixel_checked(x2, y2, color); if (delta_x >= delta_y) { int error = delta_y - (delta_x >> 1); while (x2 != x1) { if (error == 0 && !swappedx) gui_drawpixel_checked(x2+ix, y2, color); if (error >= 0) { if (error || (ix > 0)) { y2 += iy; error -= delta_x; } } x2 += ix; gui_drawpixel_checked(x2, y2, color); if (error == 0 && swappedx) gui_drawpixel_checked(x2, y2+iy, color); error += delta_y; } } else { int error = delta_x - (delta_y >> 1); while (y2 != y1) { if (error == 0 && !swappedy) gui_drawpixel_checked(x2, y2+iy, color); if (error >= 0) { if (error || (iy > 0)) { x2 += ix; error -= delta_y; } } y2 += iy; gui_drawpixel_checked(x2, y2, color); if (error == 0 && swappedy) gui_drawpixel_checked(x2+ix, y2, color); error += delta_x; } } } static const u8 Small_Font_Data[] = { #define I +0, #define a +1 #define b +2 #define c +4 #define d +8 #define e +16 // !"#$%&' I c I b d I I d I a b I c I c I I c I b d I b d I c d e I a b e I b d I c I I c I I a b c d e I b I d I b c I I I c I I b d I b c I c I b I I I c I I a b c d e I d e I b I a c e I I I I I b d I e I a d e I a d I I I c I I I b c d I d e I b c e I I I I I I c I I I I // ()*+,-./ e I b I I I I I I e I d I c I b e I c I I I I e I d I c I c d I c I I I I d I d I c I b c d e I a b c d e I I b c d e I I d I d I c I c d I c I I I I c I d I c I b e I c I d I I c d I c I d I c I I I d I I c d I b I e I b I I I c I I I b I // 01234567 c d I d I c d I c d I b e I b c d e I c d I b c d e I b e I c d I b e I b e I b e I b I b e I e I b e I d I e I e I b e I b I b I d I b e I d I d I c d I b c d e I b c d I b c d I d I b e I d I c I e I e I e I b e I c I b e I d I b I b e I e I e I b e I c I c d I c d e I b c d e I c d I e I b c d I c d I b I I I I I I I I I // 89:;<=>? c d I c d I I I e I I b I c d I b e I b e I I I d I I c I b e I b e I b e I c d I d I c I b c d e I d I e I c d I c d e I c d I d I b I I e I d I b e I e I I I c I b c d e I d I c I b e I b e I c d I d I d I I c I I c d I c d I c d I d I e I I b I c I I I I c I I I I I // @ABCDEFG b c d I c d I b c d I c d I b c d I b c d e I b c d e I c d I a e I b e I b e I b e I b e I b I b I b e I a d e I b e I b e I b I b e I b I b I b I a c e I b c d e I b c d I b I b e I b c d I b c d I b I a d e I b e I b e I b I b e I b I b I b d e I a I b e I b e I b e I b e I b I b I b e I b c d e I b e I b c d I c d I b c d I b c d e I b I c d e I I I I I I I I I // HIJKlMNO b e I b c d I e I b e I b I a e I b e I b c d e I b e I c I e I b e I b I a b d e I b c e I b e I b e I c I e I b d I b I a c e I b d e I b e I b c d e I c I e I b c I b I a c e I b e I b e I b e I c I e I b d I b I a e I b e I b e I b e I c I b e I b e I b I a e I b e I b e I b e I b c d I c d I b e I b c d e I a e I b e I b c d e I I I I I I I I I // PQRSTUVW b c d I c d I b c d I c d e I a b c d e I b e I a e I a e I b e I b e I b e I b I c I b e I a e I a e I b e I b e I b e I b I c I b e I a e I a e I b c d I b e I b c d I c d I c I b e I a e I a e I b I b e I b e I e I c I b e I b d I a c e I b I b e I b e I e I c I b e I b d I a b d e I b I c d I b e I b c d I c I c d I c I a e I I d e I I I I I I I // XYZ[\]^_ a e I a e I a b c d e I d e I b I b c I c I I a e I a e I e I d I b I c I b d I I b d I a e I d I d I c I c I I I c I b d I c I d I c I c I I I b d I c I b I d I d I c I I I a e I c I a I d I d I c I I I a e I c I a b c d e I d I e I c I I I I I I d e I e I b c I I a b c d e I // `abcdefg b I I b I I e I I d e I I c I I b I I e I I c I I I c d I b I c d I e I c d I c I c d e I I e I b c d I b e I c d e I b e I b c d I b e I I c d e I b e I b I b e I b c d e I c I b e I I b e I b e I b I b e I b I c I c d e I I c d e I b c d I c d e I c d e I c d e I c I e I I I I I I I I c d I // hijklmno b I I I b I c I I I I b I c I c I b I c I I I I b I I I b I c I a b c d I b c d I c d I b c d I c I c I b d e I c I a c e I b e I b e I b e I c I c I b c I c I a c e I b e I b e I b e I c I c I b d I c I a c e I b e I b e I b e I c I c I b e I c I a e I b e I c d I I I b I I I I I I // pqrstuvw I I I I c I I I I I I I I c I I I I b c d I c d e I b c d I c d e I b c d I b e I b e I a e I b e I b e I b e I b I c I b e I b e I a e I b e I b e I b I c d I c I b e I b e I a c e I b c d I c d e I b I e I c I b e I c d I a b d e I b I e I b I b c d I d I c d e I c d I a e I b I e I I I I I I I // xyz{|}~ I I I d e I c I b c I I I I I I d I c I c I I b d I b e I b e I b c d e I d I c I c I c e I a c e I c d I b e I e I c d I c I c d I b d I a e I c d I b e I c d I c d I c I c d I I b d I b e I c d e I b I d I c I c I I c I b e I e I b c d e I d I c I c I I I I b c d I I d e I c I b c I I I #undef I #undef a #undef b #undef c #undef d #undef e }; template static void PutTextInternal (const char *str, int len, short x, short y, int color, int backcolor) { int Opac = color & 0xFF; int backOpac = backcolor & 0xFF; int origX = x; int origY = y; if(!Opac && !backOpac) return; while(*str && len) { if(dydy > 0 && y >= curGuiData.yMax) break; if(dydy < 0 && y < curGuiData.yMin) break; if(dxdy > 0 && x >= curGuiData.xMax) break; if(dxdy < 0 && x < curGuiData.xMin) break; int c = *str++; if(dxdx > 0 && x >= curGuiData.xMax || dxdx < 0 && x < curGuiData.xMin || dydx > 0 && y >= curGuiData.yMax || dydx < 0 && y < curGuiData.yMin) { while (c != '\n') { c = *str; if (c == '\0') break; str++; } } if(c == '\n') { if(dydy) { x = origX; y += 10 * dydy; } else { y = origY; x += 10 * dxdy; } continue; } else if(c == '\t') // just in case { const int tabSpace = 8; x += (tabSpace-(((x-origX)/5)%tabSpace))*5*dxdx; y += (tabSpace-(((y-origY)/5)%tabSpace))*5*dydx; continue; } c -= 32; if((unsigned int)c >= 96) continue; if(c) { const u8* Cur_Glyph = (const unsigned char*)&Small_Font_Data + (c%8)+((c/8)*64); for(int y2 = -1; y2 < 10; y2++) { for(int x2 = -1; x2 < 6; x2++) { bool on = y2 >= 0 && y2 < 8 && (Cur_Glyph[y2*8] & (1 << x2)); if(on) { gui_drawpixel_checked(x+x2*dxdx+y2*dxdy, y+y2*dydy+x2*dydx, color); } else if(backOpac) { for(int y3 = max(0,y2-1); y3 <= min(7,y2+1); y3++) { for(int x3 = max(0,x2-1); x3 <= min(4,x2+1); x3++) { on |= y3 >= 0 && y3 < 8 && (Cur_Glyph[y3*8] & (1 << x3)); if (on) goto draw_outline; // speedup? } } if(on) { draw_outline: gui_drawpixel_checked(x+x2*dxdx+y2*dxdy, y+y2*dydy+x2*dydx, backcolor); } } } } } x += 6*dxdx; y += 6*dydx; len--; } } static int strlinelen(const char* string) { const char* s = string; while(*s && *s != '\n') s++; if(*s) s++; return s - string; } static void LuaDisplayString (const char *str, int x, int y, u32 color, u32 outlineColor) { if(!str) return; #if 1 //if(rotate == 0) PutTextInternal<1,1,0,0>(str, strlen(str), x, y, color, outlineColor); //else if(rotate == 90) // PutTextInternal<0,0,1,-1>(str, strlen(str), x, y, color, outlineColor); //else if #else const char* ptr = str; while(*ptr && y < curGuiData.yMax) { int len = strlinelen(ptr); int skip = 0; if(len < 1) len = 1; // break up the line if it's too long to display otherwise if(len > 63) { len = 63; const char* ptr2 = ptr + len-1; for(int j = len-1; j; j--, ptr2--) { if(*ptr2 == ' ' || *ptr2 == '\t') { len = j; skip = 1; break; } } } int xl = 0; int yl = curGuiData.yMin; int xh = (curGuiData.xMax - 1 - 1) - 4*len; int yh = curGuiData.yMax - 1; int x2 = min(max(x,xl),xh); int y2 = min(max(y,yl),yh); PutTextInternal<1,1,0,0>(ptr,len,x2,y2,color,outlineColor); ptr += len + skip; y += 8; } #endif } DEFINE_LUA_FUNCTION(gui_text, "x,y,str[,color=\"white\"[,outline=\"black\"]]") { int x = luaL_checkinteger(L,1); // have to check for errors before deferring int y = luaL_checkinteger(L,2); if(DeferGUIFuncIfNeeded(L)) return 0; // we have to wait until later to call this function because we haven't emulated the next frame yet // (the only way to avoid this deferring is to be in a gui.register or emu.registerafter callback) const char* str = toCString(L,3); // better than using luaL_checkstring here (more permissive) if(str && *str) { int foreColor = getcolor(L,4,0xFFFFFFFF); int backColor = getcolor(L,5,0x000000FF); prepare_drawing(); gui_adjust_coord(x,y); LuaDisplayString(str, x, y, foreColor, backColor); } return 0; } DEFINE_LUA_FUNCTION(gui_box, "x1,y1,x2,y2[,fill[,outline]]") { int x1 = luaL_checkinteger(L,1); // have to check for errors before deferring int y1 = luaL_checkinteger(L,2); int x2 = luaL_checkinteger(L,3); int y2 = luaL_checkinteger(L,4); if(DeferGUIFuncIfNeeded(L)) return 0; int fillcolor = getcolor(L,5,0xFFFFFF3F); int outlinecolor = getcolor(L,6,fillcolor|0xFF); prepare_drawing(); restrict_to_screen(y1); gui_adjust_coord(x1,y1); gui_adjust_coord(x2,y2); if(!gui_checkbox(x1,y1,x2,y2)) return 0; // require x1,y1 <= x2,y2 if (x1 > x2) std::swap(x1,x2); if (y1 > y2) std::swap(y1,y2); // avoid trying to draw lots of offscreen pixels // (this is intentionally 1 out from the edge here) x1 = min(max(x1, curGuiData.xMin-1), curGuiData.xMax); x2 = min(max(x2, curGuiData.xMin-1), curGuiData.xMax); y1 = min(max(y1, curGuiData.yMin-1), curGuiData.yMax); y2 = min(max(y2, curGuiData.yMin-1), curGuiData.yMax); if(outlinecolor & 0xFF) { if(y1 >= curGuiData.yMin) for (short x = x1+1; x < x2; x++) gui_drawpixel_unchecked(x,y1,outlinecolor); if(x1 >= curGuiData.xMin && x1 < curGuiData.xMax) { if(y1 >= curGuiData.yMin) gui_drawpixel_unchecked(x1,y1,outlinecolor); for (short y = y1+1; y < y2; y++) gui_drawpixel_unchecked(x1,y,outlinecolor); if(y2 < curGuiData.yMax) gui_drawpixel_unchecked(x1,y2,outlinecolor); } if(y1 != y2 && y2 < curGuiData.yMax) for (short x = x1+1; x < x2; x++) gui_drawpixel_unchecked(x,y2,outlinecolor); if(x1 != x2 && x2 >= curGuiData.xMin && x2 < curGuiData.xMax) { if(y1 >= curGuiData.yMin) gui_drawpixel_unchecked(x2,y1,outlinecolor); for (short y = y1+1; y < y2; y++) gui_drawpixel_unchecked(x2,y,outlinecolor); if(y2 < curGuiData.yMax) gui_drawpixel_unchecked(x2,y2,outlinecolor); } } if(fillcolor & 0xFF) { for(short y = y1+1; y <= y2-1; y++) for(short x = x1+1; x <= x2-1; x++) gui_drawpixel_unchecked(x,y,fillcolor); } return 0; } // gui.setpixel(x,y,color) // color can be a RGB web color like '#ff7030', or with alpha RGBA like '#ff703060' // or it can be an RGBA hex number like 0xFF703060 // or it can be a preset color like 'red', 'orange', 'blue', 'white', etc. DEFINE_LUA_FUNCTION(gui_pixel, "x,y[,color=\"white\"]") { int x = luaL_checkinteger(L,1); // have to check for errors before deferring int y = luaL_checkinteger(L,2); if(DeferGUIFuncIfNeeded(L)) return 0; int color = getcolor(L,3,0xFFFFFFFF); if(color & 0xFF) { prepare_drawing(); gui_adjust_coord(x,y); gui_drawpixel_checked(x, y, color); } return 0; } // r,g,b = gui.getpixel(x,y) DEFINE_LUA_FUNCTION(gui_getpixel, "x,y") { prepare_reading(); int x = luaL_checkinteger(L,1); int y = luaL_checkinteger(L,2); u32 color = gui_adjust_coord_and_getpixel(x,y); int b = (color & 0x000000FF); int g = (color & 0x0000FF00) >> 8; int r = (color & 0x00FF0000) >> 16; lua_pushinteger(L, r); lua_pushinteger(L, g); lua_pushinteger(L, b); return 3; } DEFINE_LUA_FUNCTION(gui_line, "x1,y1,x2,y2[,color=\"white\"[,skipfirst=false]]") { int x1 = luaL_checkinteger(L,1); // have to check for errors before deferring int y1 = luaL_checkinteger(L,2); int x2 = luaL_checkinteger(L,3); int y2 = luaL_checkinteger(L,4); if(DeferGUIFuncIfNeeded(L)) return 0; int color = getcolor(L,5,0xFFFFFFFF); int skipFirst = lua_toboolean(L,6); if(!(color & 0xFF)) return 0; prepare_drawing(); restrict_to_screen(y1); gui_adjust_coord(x1,y1); gui_adjust_coord(x2,y2); if(!gui_checkbox(x1,y1,x2,y2)) return 0; gui_drawline_internal(x2, y2, x1, y1, !skipFirst, color); return 0; } // gui.opacity(number alphaValue) // sets the transparency of subsequent draw calls // 0.0 is completely transparent, 1.0 is completely opaque // non-integer values are supported and meaningful, as are values greater than 1.0 // it is not necessary to use this function to get transparency (or the less-recommended gui.transparency() either), // because you can provide an alpha value in the color argument of each draw call. // however, it can be convenient to be able to globally modify the drawing transparency DEFINE_LUA_FUNCTION(gui_setopacity, "alpha_0_to_1") { lua_Number opacF = luaL_checknumber(L,1); opacF *= 255.0; if(opacF < 0) opacF = 0; int opac; lua_number2int(opac, opacF); LuaContextInfo& info = GetCurrentInfo(); info.transparencyModifier = opac; return 0; } // gui.transparency(number transparencyValue) // sets the transparency of subsequent draw calls // 0.0 is completely opaque, 4.0 is completely transparent // non-integer values are supported and meaningful, as are values less than 0.0 // this is a legacy function, and the range is from 0 to 4 solely for this reason // it does the exact same thing as gui.opacity() but with a different argument range DEFINE_LUA_FUNCTION(gui_settransparency, "transparency_4_to_0") { lua_Number transp = luaL_checknumber(L,1); lua_Number opacF = 4 - transp; opacF *= 255.0 / 4.0; if(opacF < 0) opacF = 0; int opac; lua_number2int(opac, opacF); LuaContextInfo& info = GetCurrentInfo(); info.transparencyModifier = opac; return 0; } // takes a screenshot and returns it in gdstr format // example: gd.createFromGdStr(gui.gdscreenshot()):png("outputimage.png") DEFINE_LUA_FUNCTION(gui_gdscreenshot, "[whichScreen='both']") { prepare_reading(); int selectedScreen = 0; if(lua_isboolean(L, 1)) selectedScreen = lua_toboolean(L, 1) ? 1 : -1; else if(lua_isnumber(L, 1)) selectedScreen = lua_tointeger(L, 1); else if(lua_isstring(L, 1)) { const char* str = lua_tostring(L, 1); if(!stricmp(str,"top")) selectedScreen = -1; if(!stricmp(str,"bottom")) selectedScreen = 1; } restrict_to_screen(selectedScreen); int width = curGuiData.xMax - curGuiData.xMin; int height = curGuiData.yMax - curGuiData.yMin; int size = 11 + width * height * 4; char* str = new char[size+1]; // TODO: use _alloca instead (but I don't know which compilers support it) str[size] = 0; unsigned char* ptr = (unsigned char*)str; // GD format header for truecolor image (11 bytes) *ptr++ = (65534 >> 8) & 0xFF; *ptr++ = (65534 ) & 0xFF; *ptr++ = (width >> 8) & 0xFF; *ptr++ = (width ) & 0xFF; *ptr++ = (height >> 8) & 0xFF; *ptr++ = (height ) & 0xFF; *ptr++ = 1; *ptr++ = 255; *ptr++ = 255; *ptr++ = 255; *ptr++ = 255; u8* Src = (u8*)curGuiData.data + (curGuiData.stridePix*4) * curGuiData.yMin; for(int y = curGuiData.yMin; y < curGuiData.yMax; y++, Src += curGuiData.stridePix*4) { for(int x = curGuiData.xMin; x < curGuiData.xMax; x++) { *ptr++ = 0 /* (255 - Src[4*x+3]) / 2 */; // alpha (0-127, 0=opaque, 127=transparent) *ptr++ = Src[4*x+2]; *ptr++ = Src[4*x+1]; *ptr++ = Src[4*x+0]; } } lua_pushlstring(L, str, size); delete[] str; return 1; } // draws a gd image that's in gdstr format to the screen // example: gui.gdoverlay(gd.createFromPng("myimage.png"):gdStr()) DEFINE_LUA_FUNCTION(gui_gdoverlay, "[dx=0,dy=0,]gdimage[,sx=0,sy=0,width,height][,alphamul]") { int xStartDst = 0; int yStartDst = 0; int xStartSrc = 0; int yStartSrc = 0; int width, height; int numArgs = lua_gettop(L); int index = 1; if(lua_type(L,index) == LUA_TNUMBER) { xStartDst = lua_tointeger(L,index++); if(lua_type(L,index) == LUA_TNUMBER) yStartDst = lua_tointeger(L,index++); } luaL_checktype(L,index,LUA_TSTRING); // have to check for errors before deferring if(DeferGUIFuncIfNeeded(L)) return 0; const unsigned char* ptr = (const unsigned char*)lua_tostring(L,index++); const bool defSrcRect = ((numArgs - index + 1) < 2); if (!defSrcRect) { xStartSrc = luaL_checkinteger(L, index++); yStartSrc = luaL_checkinteger(L, index++); width = luaL_checkinteger(L, index++); height = luaL_checkinteger(L, index++); } LuaContextInfo& info = GetCurrentInfo(); int alphaMul = info.transparencyModifier; if(lua_isnumber(L, index)) alphaMul = (int)(alphaMul * lua_tonumber(L, index++)); if(alphaMul <= 0) return 0; // since there aren't that many possible opacity levels, // do the opacity modification calculations beforehand instead of per pixel int opacMap[256]; for(int i = 0; i < 128; i++) { int opac = 255 - ((i << 1) | (i & 1)); // gdAlphaMax = 127, not 255 opac = (opac * alphaMul) / 255; if(opac < 0) opac = 0; if(opac > 255) opac = 255; opacMap[i] = opac; } for(int i = 128; i < 256; i++) opacMap[i] = 0; // what should we do for them, actually? // GD format header for truecolor image (11 bytes) ptr++; bool trueColor = (*ptr++ == 254); int gdWidth = *ptr++ << 8; gdWidth |= *ptr++; int gdHeight = *ptr++ << 8; gdHeight |= *ptr++; int bytespp = (trueColor ? 4 : 1); if (defSrcRect) { width = gdWidth; height = gdHeight; } if ((!trueColor && *ptr) || (trueColor && !*ptr)) { luaL_error(L, "gdoverlay: inconsistent color type."); return 0; } ptr++; int colorsTotal = 0; if (!trueColor) { colorsTotal = *ptr++ << 8; colorsTotal |= *ptr++; } int transparent = *ptr++ << 24; transparent |= *ptr++ << 16; transparent |= *ptr++ << 8; transparent |= *ptr++; struct { int r, g, b, a; } pal[256]; if (!trueColor) for (int i = 0; i < 256; i++) { pal[i].r = *ptr++; pal[i].g = *ptr++; pal[i].b = *ptr++; pal[i].a = opacMap[*ptr++]; } prepare_drawing(); u8* Dst = (u8*)curGuiData.data; gui_adjust_coord(xStartDst,yStartDst); int xMin = curGuiData.xMin; int yMin = curGuiData.yMin; int xMax = curGuiData.xMax - 1; int yMax = curGuiData.yMax - 1; int strideBytes = curGuiData.stridePix * 4; // limit source rect if (xStartSrc < 0) { width += xStartSrc; xStartDst -= xStartSrc; xStartSrc = 0; } if (yStartSrc < 0) { height += yStartSrc; yStartDst -= yStartSrc; yStartSrc = 0; } if (xStartSrc + width >= gdWidth) width = gdWidth - xStartSrc; if (yStartSrc+height >= gdHeight) height = gdHeight - yStartSrc; if (width <= 0 || height <= 0) return 0; ptr += (yStartSrc * gdWidth + xStartSrc) * bytespp; Dst += yStartDst * strideBytes; for(int y = yStartDst; y < height+yStartDst && y < yMax; y++, Dst += strideBytes) { if(y < yMin) ptr += gdWidth * bytespp; else { int xA = (xStartDst < xMin ? xMin : xStartDst); int xB = (xStartDst+width > xMax ? xMax : xStartDst+width); ptr += (xA - xStartDst) * bytespp; for(int x = xA; x < xB; x++) { if (trueColor) { int opac = opacMap[ptr[0]]; u32 pix = (opac|(ptr[3]<<8)|(ptr[2]<<16)|(ptr[1]<<24)); blend32((u32*)(Dst+x*4), pix); ptr += 4; } else { int palNo = ptr[0]; u32 pix = (pal[palNo].a|(pal[palNo].b<<8)|(pal[palNo].g<<16)|(pal[palNo].r<<24)); blend32((u32*)(Dst+x*4), pix); ptr++; } } ptr += (gdWidth - (xB - xStartDst)) * bytespp; } } return 0; } static void GetCurrentScriptDir(char* buffer, int bufLen) { LuaContextInfo& info = GetCurrentInfo(); strncpy(buffer, info.lastFilename.c_str(), bufLen); buffer[bufLen-1] = 0; char* slash = std::max(strrchr(buffer, '/'), strrchr(buffer, '\\')); if(slash) slash[1] = 0; } DEFINE_LUA_FUNCTION(emu_openscript, "filename") { #if defined(WIN32) char curScriptDir[1024]; GetCurrentScriptDir(curScriptDir, 1024); // make sure we can always find scripts that are in the same directory as the current script const char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL; extern const char* OpenLuaScript(const char* filename, const char* extraDirToCheck, bool makeSubservient); const char* errorMsg = OpenLuaScript(filename, curScriptDir, true); if(errorMsg) luaL_error(L, errorMsg); #endif return 0; } DEFINE_LUA_FUNCTION(emu_reset, "") { extern bool _HACK_DONT_STOPMOVIE; _HACK_DONT_STOPMOVIE = true; NDS_Reset(); _HACK_DONT_STOPMOVIE = false; return 0; } static bool IsLuaMenuItem(PlatformMenuItem menuItem) { #if defined(WIN32) return (menuItem >= IDC_LUAMENU_RESERVE_START && menuItem <= IDC_LUAMENU_RESERVE_END); #else return false; #endif } static bool SearchFreeMenuItem(PlatformMenu menu, PlatformMenuItem& menuItem) { #if defined(WIN32) for (UINT menuItemId = IDC_LUAMENU_RESERVE_START; menuItemId <= IDC_LUAMENU_RESERVE_END; menuItemId++) { MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID; if (!GetMenuItemInfo(menu, menuItemId, FALSE, &mii) && GetLastError() == ERROR_MENU_ITEM_NOT_FOUND) { menuItem = menuItemId; return true; } } return false; #else return false; #endif } static PlatformMenu AddSubMenu(PlatformMenu topMenu, PlatformMenu menu, const char* menuName) { #if defined(WIN32) LuaContextInfo& info = GetCurrentInfo(); MENUITEMINFO mii; // search existing submenu for (int index = 0; index < GetMenuItemCount(menu); index++) { ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_SUBMENU | MIIM_STRING; const UINT bufferSize = 128; TCHAR menuItemText[bufferSize]; mii.dwTypeData = menuItemText; mii.cch = bufferSize; GetMenuItemInfo(menu, index, TRUE, &mii); // if exists, return it if (mii.hSubMenu != NULL && lstrcmp(menuName, mii.dwTypeData) == 0) { if (IsLuaMenuItem(mii.wID)) { info.menuData.subMenuData.push_back(LuaSubMenuData(menu, mii.hSubMenu, mii.wID)); } return mii.hSubMenu; } } // add new submenu PlatformMenuItem subMenuId; if (!SearchFreeMenuItem(topMenu, subMenuId)) { return NULL; } ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_SUBMENU; mii.fType = MFT_STRING; mii.fState = MFS_ENABLED; mii.wID = subMenuId; mii.hSubMenu = CreatePopupMenu(); mii.dwTypeData = (char*) menuName; if (!InsertMenuItem(menu, (UINT)-1, TRUE, &mii)) { if (mii.hSubMenu != NULL) { DestroyMenu(mii.hSubMenu); } return NULL; } info.menuData.subMenuData.push_back(LuaSubMenuData(menu, mii.hSubMenu, subMenuId)); return mii.hSubMenu; #else return 0; #endif } bool AddMenuEntries(PlatformMenu topMenu, PlatformMenu menu) { #if defined(WIN32) LuaContextInfo& info = GetCurrentInfo(); lua_State* L = info.L; luaL_checktype(L, -1, LUA_TTABLE); luaL_checkstack(L, 6, ""); // for index = 1, #menuEntries unsigned int count = lua_objlen(L, -1); for (unsigned int index = 1; index <= count; index++) { // switch(type(menuEntries[index])) lua_rawgeti(L, -1, index); if (lua_isnil(L, -1)) { PlatformMenuItem menuItem; if (!SearchFreeMenuItem(topMenu, menuItem)) { luaL_error(L, "too many menu items"); return false; } MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_FTYPE; mii.wID = menuItem; mii.fType = MFT_SEPARATOR; if (!InsertMenuItem(menu, menuItem, FALSE, &mii)) { luaL_error(L, "menu item addition failed"); return false; } info.menuData.menuItemMap.insert(map::value_type(menuItem, menu)); lua_pop(L, 1); } else if (lua_istable(L, -1)) { lua_rawgeti(L, -1, 1); const char* menuName = luaL_checkstring(L, -1); lua_insert(L, -2); lua_rawgeti(L, -1, 2); if (lua_isfunction(L, -1)) { PlatformMenuItem menuItem; if (!SearchFreeMenuItem(topMenu, menuItem)) { luaL_error(L, "too many menu items"); return false; } MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_STRING; mii.wID = menuItem; mii.dwTypeData = (char*) menuName; if (!InsertMenuItem(menu, menuItem, FALSE, &mii)) { luaL_error(L, "menu item addition failed"); return false; } info.menuData.menuItemMap.insert(map::value_type(menuItem, menu)); lua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); lua_insert(L, -2); lua_rawseti(L, -2, menuItem); lua_pop(L, 3); } else if (lua_istable(L, -1)) { HMENU subMenu = AddSubMenu(topMenu, menu, menuName); if (subMenu == NULL) { luaL_error(L, "menu item addition failed"); return false; } if (!AddMenuEntries(topMenu, subMenu)) { return false; } lua_pop(L, 3); } else { luaL_typerror(L, -1, "function or table"); return false; } } else { luaL_typerror(L, -1, "nil or table"); return false; } } return true; #else return false; #endif } DEFINE_LUA_FUNCTION(emu_addmenu, "menuName, menuEntries") { #if defined(WIN32) int nargs = lua_gettop(L); if (nargs > 1 && !lua_isnil(L, 1)) { const char* menuName = luaL_checkstring(L, 1); luaL_checktype(L, 2, LUA_TTABLE); lua_settop(L, 2); // drop redundant args HMENU menu = mainMenu; HMENU subMenu = AddSubMenu(menu, menu, menuName); if (subMenu != NULL) { AddMenuEntries(menu, subMenu); DrawMenuBar(MainWindow->getHWnd()); } else { luaL_error(L, "menu item addition failed"); } } else { //HMENU menu = NULL; // TODO: set popup (right-click) menu //int index = (nargs > 1) ? 2 : 1; //luaL_checktype(L, index, LUA_TTABLE); //lua_settop(L, index); // drop redundant args //AddMenuEntries(menu, menu); } #endif return 0; } DEFINE_LUA_FUNCTION(emu_setmenuiteminfo, "menuItem, infoTable") { luaL_checktype(L, 1, LUA_TFUNCTION); luaL_checktype(L, 2, LUA_TTABLE); #if defined(WIN32) LuaContextInfo& info = GetCurrentInfo(); map::iterator it = info.menuData.menuItemMap.begin(); while(it != info.menuData.menuItemMap.end()) { HMENU menu = (*it).second; UINT menuItem = (*it).first; lua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); lua_rawgeti(L, -1, menuItem); if (lua_rawequal(L, 1, -1) != 0) { MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STATE | MIIM_STRING; GetMenuItemInfo(menu, menuItem, FALSE, &mii); mii.fMask = 0; lua_getfield(L, 2, "enabled"); if (lua_isboolean(L, -1)) { mii.fMask |= MIIM_STATE; if (lua_toboolean(L, -1) != 0) { mii.fState &= ~MFS_DISABLED; } else { mii.fState |= MFS_DISABLED; } } else if (!lua_isnil(L, -1)) { luaL_where(L, 0); luaL_error(L, "%s bad argument \"enabled\" (boolean expected, got %s)", luaL_optstring(L, -1, ""), luaL_typename(L, -2)); } lua_pop(L, 1); lua_getfield(L, 2, "checked"); if (lua_isboolean(L, -1)) { mii.fMask |= MIIM_STATE; if (lua_toboolean(L, -1) != 0) { mii.fState |= MFS_CHECKED; } else { mii.fState &= ~MFS_CHECKED; } } else if (!lua_isnil(L, -1)) { luaL_where(L, 0); luaL_error(L, "%s bad argument \"checked\" (boolean expected, got %s)", luaL_optstring(L, -1, ""), luaL_typename(L, -2)); } lua_pop(L, 1); lua_getfield(L, 2, "name"); if (lua_isstring(L, -1)) { mii.fMask |= MIIM_STRING; mii.dwTypeData = (LPSTR) lua_tostring(L, -1); } else if (!lua_isnil(L, -1)) { luaL_where(L, 0); luaL_error(L, "%s bad argument \"name\" (string expected, got %s)", luaL_optstring(L, -1, ""), luaL_typename(L, -2)); } SetMenuItemInfo(menu, menuItem, FALSE, &mii); lua_pop(L, 1); } lua_pop(L, 1); it++; } #endif return 0; } DEFINE_LUA_FUNCTION(emu_registermenustart, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONINITMENU]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONINITMENU]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } // TODO /* DEFINE_LUA_FUNCTION(emu_loadrom, "filename") { struct Temp { Temp() {EnableStopAllLuaScripts(false);} ~Temp() {EnableStopAllLuaScripts(true);}} dontStopScriptsHere; const char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL; char curScriptDir[1024]; GetCurrentScriptDir(curScriptDir, 1024); filename = MakeRomPathAbsolute(filename, curScriptDir); int result = GensLoadRom(filename); if(result <= 0) luaL_error(L, "Failed to load ROM \"%s\": %s", filename, result ? "invalid or unsupported" : "cancelled or not found"); CallRegisteredLuaFunctions(LUACALL_ONSTART); return 0; } */ DEFINE_LUA_FUNCTION(emu_getframecount, "") { lua_pushinteger(L, currFrameCounter); return 1; } DEFINE_LUA_FUNCTION(emu_getlagcount, "") { lua_pushinteger(L, TotalLagFrames); return 1; } DEFINE_LUA_FUNCTION(emu_lagged, "") { lua_pushboolean(L, LagFrameFlag); return 1; } DEFINE_LUA_FUNCTION(emu_emulating, "") { lua_pushboolean(L, driver->EMU_HasEmulationStarted()); return 1; } DEFINE_LUA_FUNCTION(emu_atframeboundary, "") { lua_pushboolean(L, driver->EMU_IsAtFrameBoundary()); return 1; } DEFINE_LUA_FUNCTION(movie_getlength, "") { lua_pushinteger(L, currMovieData.records.size()); return 1; } DEFINE_LUA_FUNCTION(movie_isactive, "") { lua_pushboolean(L, movieMode != MOVIEMODE_INACTIVE); return 1; } DEFINE_LUA_FUNCTION(movie_rerecordcount, "") { lua_pushinteger(L, currMovieData.rerecordCount); return 1; } DEFINE_LUA_FUNCTION(movie_setrerecordcount, "") { currMovieData.rerecordCount = luaL_checkinteger(L, 1); return 0; } DEFINE_LUA_FUNCTION(emu_rerecordcounting, "[enabled]") { LuaContextInfo& info = GetCurrentInfo(); if(lua_gettop(L) == 0) { // if no arguments given, return the current value lua_pushboolean(L, !info.rerecordCountingDisabled); return 1; } else { // set rerecord disabling info.rerecordCountingDisabled = !lua_toboolean(L,1); return 0; } } DEFINE_LUA_FUNCTION(movie_getreadonly, "") { lua_pushboolean(L, movie_readonly); return 1; } DEFINE_LUA_FUNCTION(movie_setreadonly, "readonly") { movie_readonly = lua_toboolean(L,1) != 0; // else if(!movie_readonly) // luaL_error(L, "movie.setreadonly failed: write permission denied"); return 0; } DEFINE_LUA_FUNCTION(movie_isrecording, "") { lua_pushboolean(L, movieMode == MOVIEMODE_RECORD); return 1; } DEFINE_LUA_FUNCTION(movie_isplaying, "") { lua_pushboolean(L, movieMode == MOVIEMODE_PLAY); return 1; } DEFINE_LUA_FUNCTION(movie_getmode, "") { switch(movieMode) { case MOVIEMODE_PLAY: lua_pushstring(L, "playback"); break; case MOVIEMODE_RECORD: lua_pushstring(L, "record"); break; case MOVIEMODE_INACTIVE: lua_pushstring(L, "inactive"); break; case MOVIEMODE_FINISHED: lua_pushstring(L, "finished"); break; default: lua_pushnil(L); break; } return 1; } DEFINE_LUA_FUNCTION(movie_getname, "") { extern char curMovieFilename[512]; lua_pushstring(L, curMovieFilename); return 1; } // movie.play() -- plays a movie of the user's choice // movie.play(filename) -- starts playing a particular movie // throws an error (with a description) if for whatever reason the movie couldn't be played DEFINE_LUA_FUNCTION(movie_play, "[filename]") { const char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL; const char* errorMsg = FCEUI_LoadMovie(filename, true, false, 0); if(errorMsg) luaL_error(L, errorMsg); return 0; } DEFINE_LUA_FUNCTION(movie_replay, "") { if(movieMode == MOVIEMODE_INACTIVE) return 0; lua_settop(L, 0); extern char curMovieFilename[512]; lua_pushstring(L, curMovieFilename); return movie_play(L); } DEFINE_LUA_FUNCTION(movie_close, "") { FCEUI_StopMovie(); return 0; } DEFINE_LUA_FUNCTION(sound_clear, "") { SPU_ClearOutputBuffer(); return 0; } #if defined(_WIN32) const char* s_keyToName[256] = { NULL, "leftclick", "rightclick", NULL, "middleclick", NULL, NULL, NULL, "backspace", "tab", NULL, NULL, NULL, "enter", NULL, NULL, "shift", // 0x10 "control", "alt", "pause", "capslock", NULL, NULL, NULL, NULL, NULL, NULL, "escape", NULL, NULL, NULL, NULL, "space", // 0x20 "pageup", "pagedown", "end", "home", "left", "up", "right", "down", NULL, NULL, NULL, NULL, "insert", "delete", NULL, "0","1","2","3","4","5","6","7","8","9", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "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", NULL, NULL, NULL, NULL, NULL, "numpad0","numpad1","numpad2","numpad3","numpad4","numpad5","numpad6","numpad7","numpad8","numpad9", "numpad*","numpad+", NULL, "numpad-","numpad.","numpad/", "F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12", "F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "numlock", "scrolllock", NULL, // 0x92 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 0xB9 "semicolon", "plus", "comma", "minus", "period", "slash", "tilde", NULL, // 0xC1 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 0xDA "leftbracket", "backslash", "rightbracket", "quote", }; #endif // input.get() // takes no input, returns a lua table of entries representing the current input state, // independent of the joypad buttons the emulated game thinks are pressed // for example: // if the user is holding the W key and the left mouse button // and has the mouse at the bottom-right corner of the game screen, // then this would return {W=true, leftclick=true, xmouse=319, ymouse=223} DEFINE_LUA_FUNCTION(input_getcurrentinputstatus, "") { lua_newtable(L); #if defined(_WIN32) // keyboard and mouse button status { extern bool allowBackgroundInput; unsigned char keys [256]; if(!allowBackgroundInput) { if(GetKeyboardState(keys)) { for(int i = 1; i < 255; i++) { int mask = (i == VK_CAPITAL || i == VK_NUMLOCK || i == VK_SCROLL) ? 0x01 : 0x80; if(keys[i] & mask) { const char* name = s_keyToName[i]; if(name) { lua_pushboolean(L, true); lua_setfield(L, -2, name); } } } } } else // use a slightly different method that will detect background input: { for(int i = 1; i < 255; i++) { const char* name = s_keyToName[i]; if(name) { int active; if(i == VK_CAPITAL || i == VK_NUMLOCK || i == VK_SCROLL) active = GetKeyState(i) & 0x01; else active = GetAsyncKeyState(i) & 0x8000; if(active) { lua_pushboolean(L, true); lua_setfield(L, -2, name); } } } } } // mouse position in game screen pixel coordinates { void UnscaleScreenCoords(s32& x, s32& y); void ToDSScreenRelativeCoords(s32& x, s32& y, int bottomScreen); POINT point; GetCursorPos(&point); ScreenToClient(MainWindow->getHWnd(), &point); s32 x (point.x); s32 y (point.y); UnscaleScreenCoords(x,y); ToDSScreenRelativeCoords(x,y,1); lua_pushinteger(L, x); lua_setfield(L, -2, "xmouse"); lua_pushinteger(L, y); lua_setfield(L, -2, "ymouse"); } worry(L,10); #else // NYI (well, return an empty table) #endif return 1; } // resets our "worry" counter of the Lua state int dontworry(LuaContextInfo& info) { if(info.stopWorrying) { info.stopWorrying = false; if(info.worryCount) indicateBusy(info.L, false); } info.worryCount = 0; return 0; } //agg basic shapes //TODO polygon and polyline, maybe the overloads for roundedRect and curve #include "aggdraw.h" static int line(lua_State *L) { double x1,y1,x2,y2; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; aggDraw.hud->line(x1, y1, x2, y2); return 0; } static int triangle(lua_State *L) { double x1,y1,x2,y2,x3,y3; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; x3 = luaL_checknumber(L,5) + 0.5; y3 = luaL_checknumber(L,6) + 0.5; aggDraw.hud->triangle(x1, y1, x2, y2, x3, y3); return 0; } static int rectangle(lua_State *L) { double x1,y1,x2,y2; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; aggDraw.hud->rectangle(x1, y1, x2, y2); return 0; } static int roundedRect(lua_State *L) { double x1,y1,x2,y2,r; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; r = luaL_checknumber(L,5); aggDraw.hud->roundedRect(x1, y1, x2, y2, r); return 0; } static int ellipse(lua_State *L) { double cx,cy,rx,ry; cx = luaL_checknumber(L,1) + 0.5; cy = luaL_checknumber(L,2) + 0.5; rx = luaL_checknumber(L,3); ry = luaL_checknumber(L,4); aggDraw.hud->ellipse(cx, cy, rx, ry); return 0; } static int arc(lua_State *L) { double cx,cy,rx,ry,start,sweep; cx = luaL_checknumber(L,1) + 0.5; cy = luaL_checknumber(L,2) + 0.5; rx = luaL_checknumber(L,3); ry = luaL_checknumber(L,4); start = luaL_checknumber(L,5); sweep = luaL_checknumber(L,6); aggDraw.hud->arc(cx, cy,rx, ry, start, sweep); return 0; } static int star(lua_State *L) { double cx,cy,r1,r2,startAngle; int numRays; cx = luaL_checknumber(L,1) + 0.5; cy = luaL_checknumber(L,2) + 0.5; r1 = luaL_checknumber(L,3); r2 = luaL_checknumber(L,4); startAngle = luaL_checknumber(L,5); numRays = luaL_checkinteger(L,6); aggDraw.hud->star(cx, cy, r1, r2, startAngle, numRays); return 0; } static int curve(lua_State *L) { double x1,y1,x2,y2,x3,y3; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; x3 = luaL_checknumber(L,5) + 0.5; y3 = luaL_checknumber(L,6) + 0.5; aggDraw.hud->curve(x1, y1, x2, y2, x3, y3); return 0; } static const struct luaL_reg aggbasicshapes [] = { {"line", line}, {"triangle", triangle}, {"rectangle", rectangle}, {"roundedRect", roundedRect}, {"ellipse", ellipse}, {"arc", arc}, {"star", star}, {"curve", curve}, // {"polygon", polygon}, // {"polyline", polyline}, {NULL, NULL} }; //agg general attributes //TODO missing functions, maybe the missing overloads static void getColorForAgg(lua_State *L, int&r,int&g,int&b,int&a) { if(lua_gettop(L) == 1) { int color = getcolor(L, 1, 0xFF); r = (color & 0xFF000000) >> 24; g = (color & 0x00FF0000) >> 16; b = (color & 0x0000FF00) >> 8; a = (color & 0x000000FF); } else { r = luaL_optinteger(L,1,255); g = luaL_optinteger(L,2,255); b = luaL_optinteger(L,3,255); a = luaL_optinteger(L,4,255); } } static int fillColor(lua_State *L) { int r,g,b,a; getColorForAgg(L, r,g,b,a); aggDraw.hud->fillColor(r, g, b, a); return 0; } static int noFill(lua_State *L) { aggDraw.hud->noFill(); return 0; } static int lineColor(lua_State *L) { int r,g,b,a; getColorForAgg(L, r,g,b,a); aggDraw.hud->lineColor(r, g, b, a); return 0; } static int noLine(lua_State *L) { aggDraw.hud->noLine(); return 0; } static int lineWidth(lua_State *L) { double w; w = luaL_checknumber(L,1); aggDraw.hud->lineWidth(w); return 0; } static const struct luaL_reg agggeneralattributes [] = { // {"blendMode", blendMode}, // {"imageBlendMode", imageBlendMode}, // {"imageBlendColor", imageBlendColor}, // {"masterAlpha", masterAlpha}, // {"antiAliasGamma", antiAliasGamma}, // {"font", font}, {"fillColor", fillColor}, {"noFill", noFill}, {"lineColor", lineColor}, {"noLine", noLine}, // {"fillLinearGradient", fillLinearGradient}, // {"lineLinearGradient", lineLinearGradient}, // {"fillRadialGradient", fillRadialGradient}, // {"lineRadialGradient", lineRadialGradient}, {"lineWidth", lineWidth}, // {"lineCap", lineCap}, // {"lineJoin", lineJoin}, // {"fillEvenOdd", fillEvenOdd}, {NULL, NULL} }; static int setFont(lua_State *L) { const char *choice; choice = luaL_checkstring(L,1); aggDraw.hud->setFont(choice); return 0; } static int text(lua_State *L) { int x, y; const char *choice; x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); choice = luaL_checkstring(L,3); aggDraw.hud->renderTextDropshadowed(x,y,choice); return 0; } static const struct luaL_reg aggcustom [] = { {"setFont", setFont}, {"text", text}, {NULL, NULL} }; // gui.osdtext(int x, int y, string msg) // // Displays the given text on the screen, using the same font and techniques as the // main HUD. // static int gui_osdtext(lua_State *L) { int x = luaL_checkinteger(L,1); // have to check for errors before deferring int y = luaL_checkinteger(L,2); if(DeferGUIFuncIfNeeded(L)) return 0; // we have to wait until later to call this function because we haven't emulated the next frame yet // (the only way to avoid this deferring is to be in a gui.register or emu.registerafter callback) const char* msg = toCString(L,3); osd->addFixed(x, y, "%s", msg); return 0; } DEFINE_LUA_FUNCTION(stylus_read, "") { lua_newtable(L); lua_pushinteger(L, nds.scr_touchX >> 4); lua_setfield(L, -2, "x"); lua_pushinteger(L, nds.scr_touchY >> 4); lua_setfield(L, -2, "y"); lua_pushboolean(L, nds.isTouch); lua_setfield(L, -2, "touch"); return 1; } DEFINE_LUA_FUNCTION(stylus_peek, "") { lua_newtable(L); lua_pushinteger(L, NDS_getRawUserInput().touch.touchX >> 4); lua_setfield(L, -2, "x"); lua_pushinteger(L, NDS_getRawUserInput().touch.touchY >> 4); lua_setfield(L, -2, "y"); lua_pushboolean(L, NDS_getRawUserInput().touch.isTouch?1:0); lua_setfield(L, -2, "touch"); return 1; } static int toTouchValue(int pixCoord, int maximum) { pixCoord = std::min(std::max(pixCoord, 0), maximum-1); return (pixCoord << 4) & 0x0FF0; } DEFINE_LUA_FUNCTION(stylus_write, "table") { if(movieMode == MOVIEMODE_PLAY) // don't allow tampering with a playing movie's input return 0; // (although it might be useful sometimes...) if(!NDS_isProcessingUserInput()) { // defer this function until when we are processing input DeferFunctionCall(L, deferredJoySetIDString); return 0; } int index = 1; luaL_checktype(L, index, LUA_TTABLE); UserTouch& touch = NDS_getProcessingUserInput().touch; lua_getfield(L, index, "x"); if (!lua_isnil(L,-1)) touch.touchX = toTouchValue(lua_tointeger(L, -1), 256); lua_pop(L, 1); lua_getfield(L, index, "y"); if (!lua_isnil(L,-1)) touch.touchY = toTouchValue(lua_tointeger(L, -1), 192); lua_pop(L, 1); lua_getfield(L, index, "touch"); if (!lua_isnil(L,-1)) touch.isTouch = lua_toboolean(L, -1) ? true : false; lua_pop(L, 1); return 0; } static int gcEMUFILE_MEMORY(lua_State *L) { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); delete (*ppEmuFile); *ppEmuFile = 0; return 0; } static const struct luaL_reg styluslib [] = { {"get", stylus_read}, {"peek", stylus_peek}, {"set", stylus_write}, // alternative names {"read", stylus_read}, {"write", stylus_write}, {NULL, NULL} }; static const struct luaL_reg emulib [] = { {"frameadvance", emu_frameadvance}, {"speedmode", emu_speedmode}, {"wait", emu_wait}, {"pause", emu_pause}, {"unpause", emu_unpause}, {"emulateframe", emu_emulateframe}, {"emulateframefastnoskipping", emu_emulateframefastnoskipping}, {"emulateframefast", emu_emulateframefast}, {"emulateframeinvisible", emu_emulateframeinvisible}, {"redraw", emu_redraw}, {"framecount", emu_getframecount}, {"lagcount", emu_getlagcount}, {"lagged", emu_lagged}, {"emulating", emu_emulating}, {"atframeboundary", emu_atframeboundary}, {"registerbefore", emu_registerbefore}, {"registerafter", emu_registerafter}, {"registerstart", emu_registerstart}, {"registerexit", emu_registerexit}, {"persistglobalvariables", emu_persistglobalvariables}, {"message", emu_message}, {"print", print}, // sure, why not {"openscript", emu_openscript}, // {"loadrom", emu_loadrom}, {"reset", emu_reset}, {"addmenu", emu_addmenu}, {"setmenuiteminfo", emu_setmenuiteminfo}, {"registermenustart", emu_registermenustart}, // alternative names // {"openrom", emu_loadrom}, {NULL, NULL} }; static const struct luaL_reg guilib [] = { {"register", gui_register}, {"text", gui_text}, {"box", gui_box}, {"line", gui_line}, {"pixel", gui_pixel}, {"getpixel", gui_getpixel}, {"opacity", gui_setopacity}, {"transparency", gui_settransparency}, {"popup", gui_popup}, {"parsecolor", gui_parsecolor}, {"gdscreenshot", gui_gdscreenshot}, {"gdoverlay", gui_gdoverlay}, {"redraw", emu_redraw}, // some people might think of this as more of a GUI function {"osdtext", gui_osdtext}, // alternative names {"drawtext", gui_text}, {"drawbox", gui_box}, {"drawline", gui_line}, {"drawpixel", gui_pixel}, {"setpixel", gui_pixel}, {"writepixel", gui_pixel}, {"readpixel", gui_getpixel}, {"rect", gui_box}, {"drawrect", gui_box}, {"drawimage", gui_gdoverlay}, {"image", gui_gdoverlay}, {NULL, NULL} }; static const struct luaL_reg statelib [] = { {"create", state_create}, {"save", state_save}, {"load", state_load}, #ifndef PUBLIC_RELEASE {"verify", state_verify}, // for desync catching #endif // TODO //{"loadscriptdata", state_loadscriptdata}, //{"savescriptdata", state_savescriptdata}, //{"registersave", state_registersave}, //{"registerload", state_registerload}, {NULL, NULL} }; static const struct luaL_reg memorylib [] = { {"readbyte", memory_readbyte}, {"readbytesigned", memory_readbytesigned}, {"readword", memory_readword}, {"readwordsigned", memory_readwordsigned}, {"readdword", memory_readdword}, {"readdwordsigned", memory_readdwordsigned}, {"readbyterange", memory_readbyterange}, {"writebyte", memory_writebyte}, {"writeword", memory_writeword}, {"writedword", memory_writedword}, {"isvalid", memory_isvalid}, {"getregister", memory_getregister}, {"setregister", memory_setregister}, // alternate naming scheme for word and double-word and unsigned {"readbyteunsigned", memory_readbyte}, {"readwordunsigned", memory_readword}, {"readdwordunsigned", memory_readdword}, {"readshort", memory_readword}, {"readshortunsigned", memory_readword}, {"readshortsigned", memory_readwordsigned}, {"readlong", memory_readdword}, {"readlongunsigned", memory_readdword}, {"readlongsigned", memory_readdwordsigned}, {"writeshort", memory_writeword}, {"writelong", memory_writedword}, {"vram_readword", vram_readword}, {"vram_writeword", vram_writeword}, // memory hooks {"registerwrite", memory_registerwrite}, {"registerread", memory_registerread}, {"registerexec", memory_registerexec}, // alternate names {"register", memory_registerwrite}, {"registerrun", memory_registerexec}, {"registerexecute", memory_registerexec}, {NULL, NULL} }; static const struct luaL_reg joylib [] = { {"get", joy_get}, {"getdown", joy_getdown}, {"getup", joy_getup}, {"peek", joy_peek}, {"peekdown", joy_peekdown}, {"peekup", joy_peekup}, {"set", joy_set}, // alternative names {"read", joy_get}, {"write", joy_set}, {"readdown", joy_getdown}, {"readup", joy_getup}, {NULL, NULL} }; static const struct luaL_reg inputlib [] = { {"get", input_getcurrentinputstatus}, {"registerhotkey", input_registerhotkey}, {"popup", input_popup}, // alternative names {"read", input_getcurrentinputstatus}, {NULL, NULL} }; static const struct luaL_reg movielib [] = { {"active", movie_isactive}, {"recording", movie_isrecording}, {"playing", movie_isplaying}, {"mode", movie_getmode}, {"length", movie_getlength}, {"name", movie_getname}, {"rerecordcount", movie_rerecordcount}, {"setrerecordcount", movie_setrerecordcount}, {"rerecordcounting", emu_rerecordcounting}, {"readonly", movie_getreadonly}, {"setreadonly", movie_setreadonly}, {"framecount", emu_getframecount}, // for those familiar with other emulators that have movie.framecount() instead of emulatorname.framecount() {"play", movie_play}, {"replay", movie_replay}, {"stop", movie_close}, // alternative names {"open", movie_play}, {"close", movie_close}, {"getname", movie_getname}, {"playback", movie_play}, {"getreadonly", movie_getreadonly}, {NULL, NULL} }; static const struct luaL_reg soundlib [] = { {"clear", sound_clear}, {NULL, NULL} }; static const struct CFuncInfo { const char* library; const char* name; const char* args; bool registry; } cFuncInfo [] = // this info is stored here to avoid having to change all of Lua's libraries to use something like DEFINE_LUA_FUNCTION { {LUA_STRLIBNAME, "byte", "str[,start[,end]]"}, {LUA_STRLIBNAME, "char", "...[bytes]"}, {LUA_STRLIBNAME, "dump", "func"}, {LUA_STRLIBNAME, "find", "str,pattern[,init[,plain]]"}, {LUA_STRLIBNAME, "format", "formatstring,..."}, {LUA_STRLIBNAME, "gfind", "!deprecated!"}, {LUA_STRLIBNAME, "gmatch", "str,pattern"}, {LUA_STRLIBNAME, "gsub", "str,pattern,repl[,n]"}, {LUA_STRLIBNAME, "len", "str"}, {LUA_STRLIBNAME, "lower", "str"}, {LUA_STRLIBNAME, "match", "str,pattern[,init]"}, {LUA_STRLIBNAME, "rep", "str,n"}, {LUA_STRLIBNAME, "reverse", "str"}, {LUA_STRLIBNAME, "sub", "str,start[,end]"}, {LUA_STRLIBNAME, "upper", "str"}, {NULL, "module", "name[,...]"}, {NULL, "require", "modname"}, {LUA_LOADLIBNAME, "loadlib", "libname,funcname"}, {LUA_LOADLIBNAME, "seeall", "module"}, {LUA_COLIBNAME, "create", "func"}, {LUA_COLIBNAME, "resume", "co[,val1,...]"}, {LUA_COLIBNAME, "running", ""}, {LUA_COLIBNAME, "status", "co"}, {LUA_COLIBNAME, "wrap", "func"}, {LUA_COLIBNAME, "yield", "..."}, {NULL, "assert", "cond[,message]"}, {NULL, "collectgarbage", "opt[,arg]"}, {NULL, "gcinfo", ""}, {NULL, "dofile", "filename"}, {NULL, "error", "message[,level]"}, {NULL, "getfenv", "[level_or_func]"}, {NULL, "getmetatable", "object"}, {NULL, "ipairs", "arraytable"}, {NULL, "load", "func[,chunkname]"}, {NULL, "loadfile", "[filename]"}, {NULL, "loadstring", "str[,chunkname]"}, {NULL, "next", "table[,index]"}, {NULL, "pairs", "table"}, {NULL, "pcall", "func,arg1,..."}, {NULL, "rawequal", "v1,v2"}, {NULL, "rawget", "table,index"}, {NULL, "rawset", "table,index,value"}, {NULL, "select", "index,..."}, {NULL, "setfenv", "level_or_func,envtable"}, {NULL, "setmetatable", "table,metatable"}, {NULL, "tonumber", "str_or_num[,base]"}, {NULL, "type", "obj"}, {NULL, "unpack", "list[,i=1[,j=#list]]"}, {NULL, "xpcall", "func,errhandler"}, {NULL, "newproxy", "hasmeta"}, {LUA_MATHLIBNAME, "abs", "x"}, {LUA_MATHLIBNAME, "acos", "x"}, {LUA_MATHLIBNAME, "asin", "x"}, {LUA_MATHLIBNAME, "atan", "x"}, {LUA_MATHLIBNAME, "atan2", "y,x"}, {LUA_MATHLIBNAME, "ceil", "x"}, {LUA_MATHLIBNAME, "cos", "rads"}, {LUA_MATHLIBNAME, "cosh", "x"}, {LUA_MATHLIBNAME, "deg", "rads"}, {LUA_MATHLIBNAME, "exp", "x"}, {LUA_MATHLIBNAME, "floor", "x"}, {LUA_MATHLIBNAME, "fmod", "x,y"}, {LUA_MATHLIBNAME, "frexp", "x"}, {LUA_MATHLIBNAME, "ldexp", "m,e"}, {LUA_MATHLIBNAME, "log", "x"}, {LUA_MATHLIBNAME, "log10", "x"}, {LUA_MATHLIBNAME, "max", "x,..."}, {LUA_MATHLIBNAME, "min", "x,..."}, {LUA_MATHLIBNAME, "modf", "x"}, {LUA_MATHLIBNAME, "pow", "x,y"}, {LUA_MATHLIBNAME, "rad", "degs"}, {LUA_MATHLIBNAME, "random", "[m[,n]]"}, {LUA_MATHLIBNAME, "randomseed", "x"}, {LUA_MATHLIBNAME, "sin", "rads"}, {LUA_MATHLIBNAME, "sinh", "x"}, {LUA_MATHLIBNAME, "sqrt", "x"}, {LUA_MATHLIBNAME, "tan", "rads"}, {LUA_MATHLIBNAME, "tanh", "x"}, {LUA_IOLIBNAME, "close", "[file]"}, {LUA_IOLIBNAME, "flush", ""}, {LUA_IOLIBNAME, "input", "[file]"}, {LUA_IOLIBNAME, "lines", "[filename]"}, {LUA_IOLIBNAME, "open", "filename[,mode=\"r\"]"}, {LUA_IOLIBNAME, "output", "[file]"}, {LUA_IOLIBNAME, "popen", "prog,[model]"}, {LUA_IOLIBNAME, "read", "..."}, {LUA_IOLIBNAME, "tmpfile", ""}, {LUA_IOLIBNAME, "type", "obj"}, {LUA_IOLIBNAME, "write", "..."}, {LUA_OSLIBNAME, "clock", ""}, {LUA_OSLIBNAME, "date", "[format[,time]]"}, {LUA_OSLIBNAME, "difftime", "t2,t1"}, {LUA_OSLIBNAME, "execute", "[command]"}, {LUA_OSLIBNAME, "exit", "[code]"}, {LUA_OSLIBNAME, "getenv", "varname"}, {LUA_OSLIBNAME, "remove", "filename"}, {LUA_OSLIBNAME, "rename", "oldname,newname"}, {LUA_OSLIBNAME, "setlocale", "locale[,category]"}, {LUA_OSLIBNAME, "time", "[timetable]"}, {LUA_OSLIBNAME, "tmpname", ""}, {LUA_DBLIBNAME, "debug", ""}, {LUA_DBLIBNAME, "getfenv", "o"}, {LUA_DBLIBNAME, "gethook", "[thread]"}, {LUA_DBLIBNAME, "getinfo", "[thread,]function[,what]"}, {LUA_DBLIBNAME, "getlocal", "[thread,]level,local"}, {LUA_DBLIBNAME, "getmetatable", "[object]"}, {LUA_DBLIBNAME, "getregistry", ""}, {LUA_DBLIBNAME, "getupvalue", "func,up"}, {LUA_DBLIBNAME, "setfenv", "object,table"}, {LUA_DBLIBNAME, "sethook", "[thread,]hook,mask[,count]"}, {LUA_DBLIBNAME, "setlocal", "[thread,]level,local,value"}, {LUA_DBLIBNAME, "setmetatable", "object,table"}, {LUA_DBLIBNAME, "setupvalue", "func,up,value"}, {LUA_DBLIBNAME, "traceback", "[thread,][message][,level]"}, {LUA_TABLIBNAME, "concat", "table[,sep[,i[,j]]]"}, {LUA_TABLIBNAME, "insert", "table,[pos,]value"}, {LUA_TABLIBNAME, "maxn", "table"}, {LUA_TABLIBNAME, "remove", "table[,pos]"}, {LUA_TABLIBNAME, "sort", "table[,comp]"}, {LUA_TABLIBNAME, "foreach", "table,func"}, {LUA_TABLIBNAME, "foreachi", "table,func"}, {LUA_TABLIBNAME, "getn", "table"}, {LUA_TABLIBNAME, "maxn", "table"}, {LUA_TABLIBNAME, "setn", "table,value"}, // I know some of these are obsolete but they should still have argument info if they're exposed to the user {LUA_FILEHANDLE, "setvbuf", "mode[,size]", true}, {LUA_FILEHANDLE, "lines", "", true}, {LUA_FILEHANDLE, "read", "...", true}, {LUA_FILEHANDLE, "flush", "", true}, {LUA_FILEHANDLE, "seek", "[whence][,offset]", true}, {LUA_FILEHANDLE, "write", "...", true}, {LUA_FILEHANDLE, "__tostring", "obj", true}, {LUA_FILEHANDLE, "__gc", "", true}, {"_LOADLIB", "__gc", "", true}, }; void registerLibs(lua_State* L) { luaL_openlibs(L); luaL_register(L, "emu", emulib); luaL_register(L, "gui", guilib); luaL_register(L, "stylus", styluslib); luaL_register(L, "savestate", statelib); luaL_register(L, "memory", memorylib); luaL_register(L, "joypad", joylib); // for game input luaL_register(L, "input", inputlib); // for user input luaL_register(L, "movie", movielib); luaL_register(L, "sound", soundlib); luaL_register(L, "bit", bit_funcs); // LuaBitOp library luaL_register(L, "agg", aggbasicshapes); luaL_register(L, "agg", agggeneralattributes); luaL_register(L, "agg", aggcustom); lua_settop(L, 0); // clean the stack, because each call to luaL_register leaves a table on top // register a few utility functions outside of libraries (in the global namespace) lua_register(L, "print", print); lua_register(L, "tostring", tostring); lua_register(L, "addressof", addressof); lua_register(L, "copytable", copytable); // old bit operation functions lua_register(L, "AND", bit_band); lua_register(L, "OR", bit_bor); lua_register(L, "XOR", bit_bxor); lua_register(L, "SHIFT", bitshift); lua_register(L, "BIT", bitbit); luabitop_validate(L); // populate s_cFuncInfoMap the first time static bool once = true; if(once) { once = false; for(int i = 0; i < sizeof(cFuncInfo)/sizeof(*cFuncInfo); i++) { const CFuncInfo& cfi = cFuncInfo[i]; if(cfi.registry) { lua_getregistry(L); lua_getfield(L, -1, cfi.library); lua_remove(L, -2); lua_getfield(L, -1, cfi.name); lua_remove(L, -2); } else if(cfi.library) { lua_getfield(L, LUA_GLOBALSINDEX, cfi.library); lua_getfield(L, -1, cfi.name); lua_remove(L, -2); } else { lua_getfield(L, LUA_GLOBALSINDEX, cfi.name); } lua_CFunction func = lua_tocfunction(L, -1); s_cFuncInfoMap[func] = cfi.args; lua_pop(L, 1); } // deal with some stragglers lua_getfield(L, LUA_GLOBALSINDEX, "package"); lua_getfield(L, -1, "loaders"); lua_remove(L, -2); if(lua_istable(L, -1)) { for(int i=1;;i++) { lua_rawgeti(L, -1, i); lua_CFunction func = lua_tocfunction(L, -1); lua_pop(L,1); if(!func) break; s_cFuncInfoMap[func] = "name"; } } lua_pop(L,1); } // push arrays for storing hook functions in for(int i = 0; i < LUAMEMHOOK_COUNT; i++) { lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[i]); } // push an array for menu handlers lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); // register type luaL_newmetatable(L, "EMUFILE_MEMORY*"); lua_pushcfunction(L, gcEMUFILE_MEMORY); lua_setfield(L, -2, "__gc"); lua_pop(L, 1); } void ResetInfo(LuaContextInfo& info) { info.L = NULL; info.started = false; info.running = false; info.returned = false; info.crashed = false; info.restart = false; info.restartLater = false; info.worryCount = 0; info.stopWorrying = false; info.panic = false; info.ranExit = false; info.numDeferredFuncs = 0; info.ranFrameAdvance = false; info.transparencyModifier = 255; info.speedMode = SPEEDMODE_NORMAL; info.guiFuncsNeedDeferring = false; info.dataSaveKey = 0; info.dataLoadKey = 0; info.dataSaveLoadKeySet = false; info.rerecordCountingDisabled = false; info.numMemHooks = 0; info.persistVars.clear(); info.newDefaultData.ClearRecords(); info.guiData.data = (u32*)aggDraw.hud->buf().buf(); info.guiData.stridePix = aggDraw.hud->buf().stride_abs() / 4; info.guiData.xMin = 0; info.guiData.xMax = 256; info.guiData.yMin = 0; info.guiData.yMax = 192 * 2; info.guiData.xOrigin = 0; info.guiData.yOrigin = 192; } void OpenLuaContext(int uid, void(*print)(int uid, const char* str), void(*onstart)(int uid), void(*onstop)(int uid, bool statusOK)) { LuaContextInfo* newInfo = new LuaContextInfo(); ResetInfo(*newInfo); newInfo->print = print; newInfo->onstart = onstart; newInfo->onstop = onstop; luaContextInfo[uid] = newInfo; } void RunLuaScriptFile(int uid, const char* filenameCStr) { if(luaContextInfo.find(uid) == luaContextInfo.end()) return; StopLuaScript(uid); LuaContextInfo& info = *luaContextInfo[uid]; #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; // doing it like this makes sure that the info stack gets cleaned up even if an exception is thrown #endif info.nextFilename = filenameCStr; // TODO: store script's current directory into LuaContextInfo static char dirnameCStr[MAX_PATH]; strcpy(dirnameCStr, filenameCStr); TrimFilenameFromPath(dirnameCStr); chdir(dirnameCStr); if(info.running) { // it's a little complicated, but... the call to luaL_dofile below // could call a C function that calls this very function again // additionally, if that happened then the above call to StopLuaScript // probably couldn't stop the script yet, so instead of continuing, // we'll set a flag that tells the first call of this function to loop again // when the script is able to stop safely info.restart = true; return; } do { std::string filename = info.nextFilename; lua_State* L = lua_open(); #ifndef USE_INFO_STACK luaStateToContextMap[L] = &info; #endif luaStateToUIDMap[L] = uid; ResetInfo(info); info.L = L; info.guiFuncsNeedDeferring = true; info.lastFilename = filename; SetSaveKey(info, FilenameFromPath(filename.c_str())); info.dataSaveLoadKeySet = false; registerLibs(L); // register a function to periodically check for inactivity lua_sethook(L, LuaRescueHook, LUA_MASKCOUNT, HOOKCOUNT); // deferred evaluation table lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, deferredGUIIDString); lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, deferredJoySetIDString); lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, refStashString); info.started = true; RefreshScriptStartedStatus(); if(info.onstart) info.onstart(uid); info.running = true; RefreshScriptSpeedStatus(); info.returned = false; int errorcode = luaL_dofile(L,filename.c_str()); info.running = false; RefreshScriptSpeedStatus(); info.returned = true; if (errorcode) { info.crashed = true; if(info.print) { info.print(uid, lua_tostring(L,-1)); info.print(uid, "\r\n"); } else { fprintf(stderr, "%s\n", lua_tostring(L,-1)); } StopLuaScript(uid); } else { dontworry(info); driver->USR_RefreshScreen(); StopScriptIfFinished(uid, true); } } while(info.restart); } void StopScriptIfFinished(int uid, bool justReturned) { LuaContextInfo& info = *luaContextInfo[uid]; if(!info.returned) return; // the script has returned, but it is not necessarily done running // because it may have registered a function that it expects to keep getting called // so check if it has any registered functions and stop the script only if it doesn't bool keepAlive = (info.numMemHooks != 0 || !info.menuData.menuItemMap.empty()); for(int calltype = 0; calltype < LUACALL_COUNT && !keepAlive; calltype++) { lua_State* L = info.L; if(L) { const char* idstring = luaCallIDStrings[calltype]; lua_getfield(L, LUA_REGISTRYINDEX, idstring); bool isFunction = lua_isfunction(L, -1); lua_pop(L, 1); if(isFunction) keepAlive = true; } } if(keepAlive) { if(justReturned) { if(info.print) info.print(uid, "script returned but is still running registered functions\r\n"); else fprintf(stdout, "%s\n", "script returned but is still running registered functions"); } } else { if(info.print) info.print(uid, "script finished running\r\n"); else fprintf(stdout, "%s\n", "script finished running"); StopLuaScript(uid); } } void RequestAbortLuaScript(int uid, const char* message) { if(luaContextInfo.find(uid) == luaContextInfo.end()) return; LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(L) { // this probably isn't the right way to do it // but calling luaL_error here is positively unsafe // (it seemingly works fine but sometimes corrupts the emulation state in colorful ways) // and this works pretty well and is definitely safe, so screw it info.L->hookcount = 1; // run hook function as soon as possible info.panic = true; // and call luaL_error once we're inside the hook function if(message) { strncpy(info.panicMessage, message, sizeof(info.panicMessage)); info.panicMessage[sizeof(info.panicMessage)-1] = 0; } else { // attach file/line info because this is the case where it's most necessary to see that, // and often it won't be possible for the later luaL_error call to retrieve it otherwise. // this means sometimes printing multiple file/line numbers if luaL_error does find something, // but that's fine since more information is probably better anyway. luaL_where(L,0); // should be 0 and not 1 here to get useful (on force stop) messages const char* whereString = lua_tostring(L,-1); snprintf(info.panicMessage, sizeof(info.panicMessage), "%sscript terminated", whereString); lua_pop(L,1); } } } void SetSaveKey(LuaContextInfo& info, const char* key) { info.dataSaveKey = crc32(0, (const unsigned char*)key, strlen(key)); if(!info.dataSaveLoadKeySet) { info.dataLoadKey = info.dataSaveKey; info.dataSaveLoadKeySet = true; } } void SetLoadKey(LuaContextInfo& info, const char* key) { info.dataLoadKey = crc32(0, (const unsigned char*)key, strlen(key)); if(!info.dataSaveLoadKeySet) { info.dataSaveKey = info.dataLoadKey; info.dataSaveLoadKeySet = true; } } void HandleCallbackError(lua_State* L, LuaContextInfo& info, int uid, bool stopScript) { info.crashed = true; if(L->errfunc || L->errorJmp) luaL_error(L, lua_tostring(L,-1)); else { if(info.print) { info.print(uid, lua_tostring(L,-1)); info.print(uid, "\r\n"); } else { fprintf(stderr, "%s\n", lua_tostring(L,-1)); } if(stopScript) StopLuaScript(uid); } } void CallExitFunction(int uid) { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; dontworry(info); // first call the registered exit function if there is one if(!info.ranExit) { info.ranExit = true; #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif //lua_settop(L, 0); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]); int errorcode = 0; if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); bool wasPanic = info.panic; info.panic = false; // otherwise we could barely do anything in the exit function errorcode = lua_pcall(L, 0, 0, 0); info.panic |= wasPanic; // restore panic info.running = wasRunning; RefreshScriptSpeedStatus(); } // save persisted variable info after the exit function runs (even if it crashed) { // gather the final value of the variables we're supposed to persist LuaSaveData newExitData; { int numPersistVars = info.persistVars.size(); for(int i = 0; i < numPersistVars; i++) { const char* varName = info.persistVars[i].c_str(); lua_getfield(L, LUA_GLOBALSINDEX, varName); int type = lua_type(L,-1); unsigned int varNameCRC = crc32(0, (const unsigned char*)varName, strlen(varName)); newExitData.SaveRecordPartial(uid, varNameCRC, -1); lua_pop(L,1); } } char path [1024] = {0}; char* pathTypeChrPtr = ConstructScriptSaveDataPath(path, 1024, info); *pathTypeChrPtr = 'd'; if(info.newDefaultData.recordList) { FILE* defaultsFile = fopen(path, "wb"); if(defaultsFile) { info.newDefaultData.ExportRecords(defaultsFile); fclose(defaultsFile); } } else unlink(path); *pathTypeChrPtr = 'e'; if(newExitData.recordList) { FILE* persistFile = fopen(path, "wb"); if(persistFile) { newExitData.ExportRecords(persistFile); fclose(persistFile); } } else unlink(path); } if (errorcode) HandleCallbackError(L,info,uid,false); } } void StopLuaScript(int uid) { LuaContextInfo* infoPtr = luaContextInfo[uid]; if(!infoPtr) return; LuaContextInfo& info = *infoPtr; if(info.running) { // if it's currently running then we can't stop it now without crashing // so the best we can do is politely request for it to go kill itself RequestAbortLuaScript(uid); return; } lua_State* L = info.L; if(L) { CallExitFunction(uid); if(info.onstop) { info.stopWorrying = true, info.worryCount++, dontworry(info); // clear "busy" status info.onstop(uid, !info.crashed); // must happen before closing L and after the exit function, otherwise the final GUI state of the script won't be shown properly or at all } if(info.started) // this check is necessary { lua_close(L); #ifndef USE_INFO_STACK luaStateToContextMap.erase(L); #endif luaStateToUIDMap.erase(L); info.L = NULL; info.started = false; info.numMemHooks = 0; for(int i = 0; i < LUAMEMHOOK_COUNT; i++) CalculateMemHookRegions((LuaMemHookType)i); #if defined(WIN32) // remove items map::iterator it = info.menuData.menuItemMap.begin(); while(it != info.menuData.menuItemMap.end()) { HMENU menu = (*it).second; UINT menuItem = (*it).first; DeleteMenu(menu, menuItem, MF_BYCOMMAND); it++; } info.menuData.menuItemMap.clear(); // remove submenus vector::reverse_iterator rit = info.menuData.subMenuData.rbegin(); while(rit != info.menuData.subMenuData.rend()) { HMENU menu = (*rit).menu; UINT menuItem = (*rit).menuItem; MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_SUBMENU; GetMenuItemInfo(menu, menuItem, FALSE, &mii); HMENU subMenu = mii.hSubMenu; // delete if it's empty if (GetMenuItemCount(subMenu) == 0) { DeleteMenu(menu, menuItem, MF_BYCOMMAND); } rit++; } info.menuData.subMenuData.clear(); DrawMenuBar(MainWindow->getHWnd()); #endif } RefreshScriptStartedStatus(); } } void CloseLuaContext(int uid) { StopLuaScript(uid); delete luaContextInfo[uid]; luaContextInfo.erase(uid); } TieredRegion hookedRegions [LUAMEMHOOK_COUNT]; // currently disabled for desmume, // and the performance hit might not be accepable // unless we can switch the emulation into a whole separate path // that has this callback enabled. static void CalculateMemHookRegions(LuaMemHookType hookType) { std::vector hookedBytes; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.numMemHooks) { lua_State* L = info.L; if(L) { int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]); lua_pushnil(L); while(lua_next(L, -2)) { if(lua_isfunction(L, -1)) { unsigned int addr = lua_tointeger(L, -2); hookedBytes.push_back(addr); } lua_pop(L, 1); } if(!info.crashed) lua_settop(L, top); } } ++iter; } hookedRegions[hookType].Calculate(hookedBytes); } void CallRegisteredLuaMemHook_LuaMatch(unsigned int address, int size, unsigned int value, LuaMemHookType hookType) { std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.numMemHooks) { lua_State* L = info.L; if(L && !info.panic) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]); for(int i = address; i != address+size; i++) { lua_rawgeti(L, -1, i); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); lua_pushinteger(L, address); lua_pushinteger(L, size); int errorcode = lua_pcall(L, 2, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) { int uid = iter->first; HandleCallbackError(L,info,uid,true); } break; } else { lua_pop(L,1); } } if(!info.crashed) lua_settop(L, top); } } ++iter; } } void CallRegisteredLuaMenuHandlers(PlatformMenuItem menuItem) { std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L && !info.panic) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); lua_rawgeti(L, -1, menuItem); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); int errorcode = lua_pcall(L, 0, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) { int uid = iter->first; HandleCallbackError(L,info,uid,true); } break; } else { lua_pop(L,1); } if(!info.crashed) lua_settop(L, top); } ++iter; } } bool AnyLuaActive() { std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.started) return true; ++iter; } return false; } void CallRegisteredLuaFunctions(LuaCallID calltype) { assert((unsigned int)calltype < (unsigned int)LUACALL_COUNT); const char* idstring = luaCallIDStrings[calltype]; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L && (!info.panic || calltype == LUACALL_BEFOREEXIT)) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif // handle deferred GUI function calls and disabling deferring when unnecessary if(calltype == LUACALL_AFTEREMULATIONGUI || calltype == LUACALL_AFTEREMULATION) info.guiFuncsNeedDeferring = false; if(calltype == LUACALL_AFTEREMULATIONGUI) CallDeferredFunctions(L, deferredGUIIDString); if(calltype == LUACALL_BEFOREEMULATION) { assert(NDS_isProcessingUserInput()); CallDeferredFunctions(L, deferredJoySetIDString); } int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, idstring); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); int errorcode = lua_pcall(L, 0, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) HandleCallbackError(L,info,uid,true); } else { lua_pop(L, 1); } info.guiFuncsNeedDeferring = true; if(!info.crashed) { lua_settop(L, top); if(!info.panic) dontworry(info); } } ++iter; } } void CallRegisteredLuaSaveFunctions(int savestateNumber, LuaSaveData& saveData) { const char* idstring = luaCallIDStrings[LUACALL_BEFORESAVE]; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, idstring); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); lua_pushinteger(L, savestateNumber); int errorcode = lua_pcall(L, 1, LUA_MULTRET, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) HandleCallbackError(L,info,uid,true); saveData.SaveRecord(uid, info.dataSaveKey); } else { lua_pop(L, 1); } if(!info.crashed) lua_settop(L, top); } ++iter; } } void CallRegisteredLuaLoadFunctions(int savestateNumber, const LuaSaveData& saveData) { const char* idstring = luaCallIDStrings[LUACALL_AFTERLOAD]; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, idstring); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); // since the scriptdata can be very expensive to load // (e.g. the registered save function returned some huge tables) // check the number of parameters the registered load function expects // and don't bother loading the parameters it wouldn't receive anyway int numParamsExpected = (L->top - 1)->value.gc->cl.l.p->numparams; if(numParamsExpected) numParamsExpected--; // minus one for the savestate number we always pass in int prevGarbage = lua_gc(L, LUA_GCCOUNT, 0); lua_pushinteger(L, savestateNumber); saveData.LoadRecord(uid, info.dataLoadKey, numParamsExpected); int n = lua_gettop(L) - 1; int errorcode = lua_pcall(L, n, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) HandleCallbackError(L,info,uid,true); else { int newGarbage = lua_gc(L, LUA_GCCOUNT, 0); if(newGarbage - prevGarbage > 50) { // now seems to be a very good time to run the garbage collector // it might take a while now but that's better than taking 10 whiles 9 loads from now lua_gc(L, LUA_GCCOLLECT, 0); } } } else { lua_pop(L, 1); } if(!info.crashed) lua_settop(L, top); } ++iter; } } static const unsigned char* s_dbg_dataStart = NULL; static int s_dbg_dataSize = 0; // can't remember what the best way of doing this is... #if defined(i386) || defined(__i386) || defined(__i386__) || defined(M_I86) || defined(_M_IX86) || defined(_WIN32) #define IS_LITTLE_ENDIAN #endif // push a value's bytes onto the output stack template void PushBinaryItem(T item, std::vector& output) { unsigned char* buf = (unsigned char*)&item; #ifdef IS_LITTLE_ENDIAN for(int i = sizeof(T); i; i--) output.push_back(*buf++); #else int vecsize = output.size(); for(int i = sizeof(T); i; i--) output.insert(output.begin() + vecsize, *buf++); #endif } // read a value from the byte stream and advance the stream by its size template T AdvanceByteStream(const unsigned char*& data, unsigned int& remaining) { #ifdef IS_LITTLE_ENDIAN T rv = *(T*)data; data += sizeof(T); #else T rv; unsigned char* rvptr = (unsigned char*)&rv; for(int i = sizeof(T)-1; i>=0; i--) rvptr[i] = *data++; #endif remaining -= sizeof(T); return rv; } // advance the byte stream by a certain size without reading a value void AdvanceByteStream(const unsigned char*& data, unsigned int& remaining, int amount) { data += amount; remaining -= amount; } #define LUAEXT_TLONG 30 // 0x1E // 4-byte signed integer #define LUAEXT_TUSHORT 31 // 0x1F // 2-byte unsigned integer #define LUAEXT_TSHORT 32 // 0x20 // 2-byte signed integer #define LUAEXT_TBYTE 33 // 0x21 // 1-byte unsigned integer #define LUAEXT_TNILS 34 // 0x22 // multiple nils represented by a 4-byte integer (warning: becomes multiple stack entities) #define LUAEXT_TTABLE 0x40 // 0x40 through 0x4F // tables of different sizes: #define LUAEXT_BITS_1A 0x01 // size of array part fits in a 1-byte unsigned integer #define LUAEXT_BITS_2A 0x02 // size of array part fits in a 2-byte unsigned integer #define LUAEXT_BITS_4A 0x03 // size of array part fits in a 4-byte unsigned integer #define LUAEXT_BITS_1H 0x04 // size of hash part fits in a 1-byte unsigned integer #define LUAEXT_BITS_2H 0x08 // size of hash part fits in a 2-byte unsigned integer #define LUAEXT_BITS_4H 0x0C // size of hash part fits in a 4-byte unsigned integer #define BITMATCH(x,y) (((x) & (y)) == (y)) static void PushNils(std::vector& output, int& nilcount) { int count = nilcount; nilcount = 0; static const int minNilsWorthEncoding = 6; // because a LUAEXT_TNILS entry is 5 bytes if(count < minNilsWorthEncoding) { for(int i = 0; i < count; i++) output.push_back(LUA_TNIL); } else { output.push_back(LUAEXT_TNILS); PushBinaryItem(count, output); } } static void LuaStackToBinaryConverter(lua_State* L, int i, std::vector& output) { int type = lua_type(L, i); // the first byte of every serialized item says what Lua type it is output.push_back(type & 0xFF); switch(type) { default: { //printf("wrote unknown type %d (0x%x)\n", type, type); //assert(0); LuaContextInfo& info = GetCurrentInfo(); if(info.print) { char errmsg [1024]; sprintf(errmsg, "values of type \"%s\" are not allowed to be returned from registered save functions.\r\n", luaL_typename(L,i)); info.print(luaStateToUIDMap[L->l_G->mainthread], errmsg); } else { fprintf(stderr, "values of type \"%s\" are not allowed to be returned from registered save functions.\n", luaL_typename(L,i)); } } break; case LUA_TNIL: // no information necessary beyond the type break; case LUA_TBOOLEAN: // serialize as 0 or 1 output.push_back(lua_toboolean(L,i)); break; case LUA_TSTRING: // serialize as a 0-terminated string of characters { const char* str = lua_tostring(L,i); while(*str) output.push_back(*str++); output.push_back('\0'); } break; case LUA_TNUMBER: { double num = (double)lua_tonumber(L,i); s32 inum = (s32)lua_tointeger(L,i); if(num != inum) { PushBinaryItem(num, output); } else { if((inum & ~0xFF) == 0) type = LUAEXT_TBYTE; else if((u16)(inum & 0xFFFF) == inum) type = LUAEXT_TUSHORT; else if((s16)(inum & 0xFFFF) == inum) type = LUAEXT_TSHORT; else type = LUAEXT_TLONG; output.back() = type; switch(type) { case LUAEXT_TLONG: PushBinaryItem(inum, output); break; case LUAEXT_TUSHORT: PushBinaryItem(inum, output); break; case LUAEXT_TSHORT: PushBinaryItem(inum, output); break; case LUAEXT_TBYTE: output.push_back(inum); break; } } } break; case LUA_TTABLE: // serialize as a type that describes how many bytes are used for storing the counts, // followed by the number of array entries if any, then the number of hash entries if any, // then a Lua value per array entry, then a (key,value) pair of Lua values per hashed entry // note that the structure of table references are not faithfully serialized (yet) { int outputTypeIndex = output.size() - 1; int arraySize = 0; int hashSize = 0; if(lua_checkstack(L, 4) && std::find(s_tableAddressStack.begin(), s_tableAddressStack.end(), lua_topointer(L,i)) == s_tableAddressStack.end()) { s_tableAddressStack.push_back(lua_topointer(L,i)); struct Scope { ~Scope(){ s_tableAddressStack.pop_back(); } } scope; bool wasnil = false; int nilcount = 0; arraySize = lua_objlen(L, i); int arrayValIndex = lua_gettop(L) + 1; for(int j = 1; j <= arraySize; j++) { lua_rawgeti(L, i, j); bool isnil = lua_isnil(L, arrayValIndex); if(isnil) nilcount++; else { if(wasnil) PushNils(output, nilcount); LuaStackToBinaryConverter(L, arrayValIndex, output); } lua_pop(L, 1); wasnil = isnil; } if(wasnil) PushNils(output, nilcount); if(arraySize) lua_pushinteger(L, arraySize); // before first key else lua_pushnil(L); // before first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; while(lua_next(L, i)) { assert(lua_type(L, keyIndex) && "nil key in Lua table, impossible"); assert(lua_type(L, valueIndex) && "nil value in Lua table, impossible"); LuaStackToBinaryConverter(L, keyIndex, output); LuaStackToBinaryConverter(L, valueIndex, output); lua_pop(L, 1); hashSize++; } } int outputType = LUAEXT_TTABLE; if(arraySize & 0xFFFF0000) outputType |= LUAEXT_BITS_4A; else if(arraySize & 0xFF00) outputType |= LUAEXT_BITS_2A; else if(arraySize & 0xFF) outputType |= LUAEXT_BITS_1A; if(hashSize & 0xFFFF0000) outputType |= LUAEXT_BITS_4H; else if(hashSize & 0xFF00) outputType |= LUAEXT_BITS_2H; else if(hashSize & 0xFF) outputType |= LUAEXT_BITS_1H; output[outputTypeIndex] = outputType; int insertIndex = outputTypeIndex; if(BITMATCH(outputType,LUAEXT_BITS_4A) || BITMATCH(outputType,LUAEXT_BITS_2A) || BITMATCH(outputType,LUAEXT_BITS_1A)) output.insert(output.begin() + (++insertIndex), arraySize & 0xFF); if(BITMATCH(outputType,LUAEXT_BITS_4A) || BITMATCH(outputType,LUAEXT_BITS_2A)) output.insert(output.begin() + (++insertIndex), (arraySize & 0xFF00) >> 8); if(BITMATCH(outputType,LUAEXT_BITS_4A)) output.insert(output.begin() + (++insertIndex), (arraySize & 0x00FF0000) >> 16), output.insert(output.begin() + (++insertIndex), (arraySize & 0xFF000000) >> 24); if(BITMATCH(outputType,LUAEXT_BITS_4H) || BITMATCH(outputType,LUAEXT_BITS_2H) || BITMATCH(outputType,LUAEXT_BITS_1H)) output.insert(output.begin() + (++insertIndex), hashSize & 0xFF); if(BITMATCH(outputType,LUAEXT_BITS_4H) || BITMATCH(outputType,LUAEXT_BITS_2H)) output.insert(output.begin() + (++insertIndex), (hashSize & 0xFF00) >> 8); if(BITMATCH(outputType,LUAEXT_BITS_4H)) output.insert(output.begin() + (++insertIndex), (hashSize & 0x00FF0000) >> 16), output.insert(output.begin() + (++insertIndex), (hashSize & 0xFF000000) >> 24); } break; } } // complements LuaStackToBinaryConverter void BinaryToLuaStackConverter(lua_State* L, const unsigned char*& data, unsigned int& remaining) { assert(s_dbg_dataSize - (data - s_dbg_dataStart) == remaining); unsigned char type = AdvanceByteStream(data, remaining); switch(type) { default: { //printf("read unknown type %d (0x%x)\n", type, type); //assert(0); LuaContextInfo& info = GetCurrentInfo(); if(info.print) { char errmsg [1024]; if(type <= 10 && type != LUA_TTABLE) sprintf(errmsg, "values of type \"%s\" are not allowed to be loaded into registered load functions. The save state's Lua save data file might be corrupted.\r\n", lua_typename(L,type)); else sprintf(errmsg, "The save state's Lua save data file seems to be corrupted.\r\n"); info.print(luaStateToUIDMap[L->l_G->mainthread], errmsg); } else { if(type <= 10 && type != LUA_TTABLE) fprintf(stderr, "values of type \"%s\" are not allowed to be loaded into registered load functions. The save state's Lua save data file might be corrupted.\n", lua_typename(L,type)); else fprintf(stderr, "The save state's Lua save data file seems to be corrupted.\n"); } } break; case LUA_TNIL: lua_pushnil(L); break; case LUA_TBOOLEAN: lua_pushboolean(L, AdvanceByteStream(data, remaining)); break; case LUA_TSTRING: lua_pushstring(L, (const char*)data); AdvanceByteStream(data, remaining, strlen((const char*)data) + 1); break; case LUA_TNUMBER: lua_pushnumber(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TLONG: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TUSHORT: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TSHORT: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TBYTE: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TTABLE: case LUAEXT_TTABLE | LUAEXT_BITS_1A: case LUAEXT_TTABLE | LUAEXT_BITS_2A: case LUAEXT_TTABLE | LUAEXT_BITS_4A: case LUAEXT_TTABLE | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_4H: case LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_4H: case LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_4H: case LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_4H: { unsigned int arraySize = 0; if(BITMATCH(type,LUAEXT_BITS_4A) || BITMATCH(type,LUAEXT_BITS_2A) || BITMATCH(type,LUAEXT_BITS_1A)) arraySize |= AdvanceByteStream(data, remaining); if(BITMATCH(type,LUAEXT_BITS_4A) || BITMATCH(type,LUAEXT_BITS_2A)) arraySize |= ((u16)AdvanceByteStream(data, remaining)) << 8; if(BITMATCH(type,LUAEXT_BITS_4A)) arraySize |= ((u32)AdvanceByteStream(data, remaining)) << 16, arraySize |= ((u32)AdvanceByteStream(data, remaining)) << 24; unsigned int hashSize = 0; if(BITMATCH(type,LUAEXT_BITS_4H) || BITMATCH(type,LUAEXT_BITS_2H) || BITMATCH(type,LUAEXT_BITS_1H)) hashSize |= AdvanceByteStream(data, remaining); if(BITMATCH(type,LUAEXT_BITS_4H) || BITMATCH(type,LUAEXT_BITS_2H)) hashSize |= ((u16)AdvanceByteStream(data, remaining)) << 8; if(BITMATCH(type,LUAEXT_BITS_4H)) hashSize |= ((u32)AdvanceByteStream(data, remaining)) << 16, hashSize |= ((u32)AdvanceByteStream(data, remaining)) << 24; lua_createtable(L, arraySize, hashSize); unsigned int n = 1; while(n <= arraySize) { if(*data == LUAEXT_TNILS) { AdvanceByteStream(data, remaining, 1); n += AdvanceByteStream(data, remaining); } else { BinaryToLuaStackConverter(L, data, remaining); // push value lua_rawseti(L, -2, n); // table[n] = value n++; } } for(unsigned int h = 1; h <= hashSize; h++) { BinaryToLuaStackConverter(L, data, remaining); // push key BinaryToLuaStackConverter(L, data, remaining); // push value lua_rawset(L, -3); // table[key] = value } } break; } } static const unsigned char luaBinaryMajorVersion = 9; static const unsigned char luaBinaryMinorVersion = 1; unsigned char* LuaStackToBinary(lua_State* L, unsigned int& size) { int n = lua_gettop(L); if(n == 0) return NULL; std::vector output; output.push_back(luaBinaryMajorVersion); output.push_back(luaBinaryMinorVersion); for(int i = 1; i <= n; i++) LuaStackToBinaryConverter(L, i, output); unsigned char* rv = new unsigned char [output.size()]; memcpy(rv, &output.front(), output.size()); size = output.size(); return rv; } void BinaryToLuaStack(lua_State* L, const unsigned char* data, unsigned int size, unsigned int itemsToLoad) { unsigned char major = *data++; unsigned char minor = *data++; size -= 2; if(luaBinaryMajorVersion != major || luaBinaryMinorVersion != minor) return; while(size > 0 && itemsToLoad > 0) { BinaryToLuaStackConverter(L, data, size); itemsToLoad--; } } // saves Lua stack into a record and pops it void LuaSaveData::SaveRecord(int uid, unsigned int key) { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; Record* cur = new Record(); cur->key = key; cur->data = LuaStackToBinary(L, cur->size); cur->next = NULL; lua_settop(L,0); if(cur->size <= 0) { delete cur; return; } Record* last = recordList; while(last && last->next) last = last->next; if(last) last->next = cur; else recordList = cur; } // pushes a record's data onto the Lua stack void LuaSaveData::LoadRecord(int uid, unsigned int key, unsigned int itemsToLoad) const { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; Record* cur = recordList; while(cur) { if(cur->key == key) { s_dbg_dataStart = cur->data; s_dbg_dataSize = cur->size; BinaryToLuaStack(L, cur->data, cur->size, itemsToLoad); return; } cur = cur->next; } } // saves part of the Lua stack (at the given index) into a record and does NOT pop anything void LuaSaveData::SaveRecordPartial(int uid, unsigned int key, int idx) { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; if(idx < 0) idx += lua_gettop(L)+1; Record* cur = new Record(); cur->key = key; cur->next = NULL; if(idx <= lua_gettop(L)) { std::vector output; output.push_back(luaBinaryMajorVersion); output.push_back(luaBinaryMinorVersion); LuaStackToBinaryConverter(L, idx, output); unsigned char* rv = new unsigned char [output.size()]; memcpy(rv, &output.front(), output.size()); cur->size = output.size(); cur->data = rv; } if(cur->size <= 0) { delete cur; return; } Record* last = recordList; while(last && last->next) last = last->next; if(last) last->next = cur; else recordList = cur; } void fwriteint(unsigned int value, FILE* file) { for(int i=0;i<4;i++) { int w = value & 0xFF; fwrite(&w, 1, 1, file); value >>= 8; } } void freadint(unsigned int& value, FILE* file) { int rv = 0; for(int i=0;i<4;i++) { int r = 0; fread(&r, 1, 1, file); rv |= r << (i*8); } value = rv; } // writes all records to an already-open file void LuaSaveData::ExportRecords(void* fileV) const { FILE* file = (FILE*)fileV; if(!file) return; Record* cur = recordList; while(cur) { fwriteint(cur->key, file); fwriteint(cur->size, file); fwrite(cur->data, cur->size, 1, file); cur = cur->next; } } // reads records from an already-open file void LuaSaveData::ImportRecords(void* fileV) { FILE* file = (FILE*)fileV; if(!file) return; ClearRecords(); Record rec; Record* cur = &rec; Record* last = NULL; while(1) { freadint(cur->key, file); freadint(cur->size, file); if(feof(file) || ferror(file)) break; cur->data = new unsigned char [cur->size]; fread(cur->data, cur->size, 1, file); Record* next = new Record(); memcpy(next, cur, sizeof(Record)); next->next = NULL; if(last) last->next = next; else recordList = next; last = next; } } void LuaSaveData::ClearRecords() { Record* cur = recordList; while(cur) { Record* del = cur; cur = cur->next; delete[] del->data; delete del; } recordList = NULL; } void DontWorryLua() // everything's going to be OK { std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { dontworry(*iter->second); ++iter; } } void EnableStopAllLuaScripts(bool enable) { g_stopAllScriptsEnabled = enable; } void StopAllLuaScripts() { if(!g_stopAllScriptsEnabled) return; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; bool wasStarted = info.started; StopLuaScript(uid); info.restartLater = wasStarted; ++iter; } } void RestartAllLuaScripts() { if(!g_stopAllScriptsEnabled) return; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; if(info.restartLater || info.started) { info.restartLater = false; RunLuaScriptFile(uid, info.lastFilename.c_str()); } ++iter; } } // sets anything that needs to depend on the total number of scripts running void RefreshScriptStartedStatus() { int numScriptsStarted = 0; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.started) numScriptsStarted++; ++iter; } // frameadvSkipLagForceDisable = (numScriptsStarted != 0); // disable while scripts are running because currently lag skipping makes lua callbacks get called twice per frame advance g_numScriptsStarted = numScriptsStarted; } // sets anything that needs to depend on speed mode or running status of scripts void RefreshScriptSpeedStatus() { g_anyScriptsHighSpeed = false; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.running) if(info.speedMode == SPEEDMODE_TURBO || info.speedMode == SPEEDMODE_MAXIMUM) g_anyScriptsHighSpeed = true; ++iter; } } desmume-0.9.11/src/Makefile.am0000644000000000000000000001536612467662066014614 0ustar rootrootinclude $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(GTHREAD_CFLAGS) $(X_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) EXTRA_DIST = build.bat instruction_tabdef.inc thumb_tabdef.inc fs-linux.cpp fs-windows.cpp cocoa if HAVE_GDB_STUB SUBDIRS = . gdbstub $(UI_DIR) else SUBDIRS = . $(UI_DIR) endif DIST_SUBDIRS = . gdbstub cli gtk gtk-glade noinst_LIBRARIES = libdesmume.a libdesmume_a_SOURCES = \ armcpu.cpp armcpu.h \ arm_instructions.cpp \ agg2d.h agg2d.inl \ bios.cpp bios.h bits.h cp15.cpp cp15.h \ commandline.h commandline.cpp \ common.cpp common.h \ debug.cpp debug.h \ Disassembler.cpp Disassembler.h \ emufile.h emufile.cpp emufile_types.h encrypt.h encrypt.cpp FIFO.cpp FIFO.h \ firmware.cpp firmware.h GPU.cpp GPU.h \ fs.h \ GPU_osd.h \ instructions.h \ mem.h mc.cpp mc.h \ path.cpp path.h \ readwrite.cpp readwrite.h \ wifi.cpp wifi.h \ mic.h \ MMU.cpp MMU.h MMU_timing.h NDSSystem.cpp NDSSystem.h registers.h \ OGLRender.h OGLRender_3_2.h \ ROMReader.cpp ROMReader.h \ render3D.cpp render3D.h \ rtc.cpp rtc.h \ saves.cpp saves.h \ slot1.cpp slot1.h \ slot2.cpp slot2.h \ SPU.cpp SPU.h \ matrix.cpp matrix.h \ gfx3d.cpp gfx3d.h \ thumb_instructions.cpp types.h \ movie.cpp movie.h \ PACKED.h PACKED_END.h \ utils/advanscene.cpp utils/advanscene.h \ utils/datetime.cpp utils/datetime.h \ utils/ConvertUTF.c utils/ConvertUTF.h utils/guid.cpp utils/guid.h \ utils/emufat.cpp utils/emufat.h utils/emufat_types.h \ utils/fsnitro.cpp utils/fsnitro.h \ utils/md5.cpp utils/md5.h utils/valuearray.h utils/xstring.cpp utils/xstring.h \ utils/decrypt/crc.cpp utils/decrypt/crc.h utils/decrypt/decrypt.cpp \ utils/decrypt/decrypt.h utils/decrypt/header.cpp utils/decrypt/header.h \ utils/task.cpp utils/task.h \ utils/vfat.h utils/vfat.cpp \ utils/dlditool.cpp \ utils/libfat/bit_ops.h \ utils/libfat/cache.cpp \ utils/libfat/cache.h \ utils/libfat/common.h \ utils/libfat/directory.cpp \ utils/libfat/directory.h \ utils/libfat/disc.cpp \ utils/libfat/disc.h \ utils/libfat/disc_io.h \ utils/libfat/fat.h \ utils/libfat/fatdir.cpp \ utils/libfat/fatdir.h \ utils/libfat/fatfile.cpp \ utils/libfat/fatfile.h \ utils/libfat/filetime.cpp \ utils/libfat/filetime.h \ utils/libfat/file_allocation_table.cpp \ utils/libfat/file_allocation_table.h \ utils/libfat/libfat.cpp \ utils/libfat/libfat_pc.h \ utils/libfat/libfat_public_api.cpp \ utils/libfat/libfat_public_api.h \ utils/libfat/lock.cpp \ utils/libfat/lock.h \ utils/libfat/mem_allocate.h \ utils/libfat/partition.cpp \ utils/libfat/partition.h \ utils/tinyxml/tinystr.cpp \ utils/tinyxml/tinystr.h \ utils/tinyxml/tinyxml.cpp \ utils/tinyxml/tinyxml.h \ utils/tinyxml/tinyxmlerror.cpp \ utils/tinyxml/tinyxmlparser.cpp \ utils/glcorearb.h \ addons/slot2_auto.cpp addons/slot2_mpcf.cpp addons/slot2_paddle.cpp addons/slot2_gbagame.cpp addons/slot2_none.cpp addons/slot2_rumblepak.cpp addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp addons/slot2_piano.cpp addons/slot2_passme.cpp addons/slot1_none.cpp addons/slot1_r4.cpp addons/slot1_retail_nand.cpp addons/slot1_retail_auto.cpp addons/slot1_retail_mcrom.cpp addons/slot1_retail_mcrom_debug.cpp addons/slot1comp_mc.cpp addons/slot1comp_mc.h addons/slot1comp_rom.h addons/slot1comp_rom.cpp addons/slot1comp_protocol.h addons/slot1comp_protocol.cpp \ cheatSystem.cpp cheatSystem.h \ texcache.cpp texcache.h rasterize.cpp rasterize.h \ metaspu/metaspu.cpp metaspu/metaspu.h \ filter/2xsai.cpp filter/bilinear.cpp filter/epx.cpp filter/filter.h \ filter/hq2x.cpp filter/hq2x.h filter/hq4x.cpp filter/hq4x.dat filter/hq4x.h \ filter/interp.h filter/lq2x.cpp filter/lq2x.h filter/scanline.cpp \ filter/videofilter.cpp filter/videofilter.h \ filter/xbrz.cpp filter/xbrz.h \ version.cpp version.h \ desmume_config.cpp desmume_config.h if HAVE_JIT libdesmume_a_SOURCES += \ arm_jit.cpp arm_jit.h instruction_attributes.h \ utils/AsmJit/AsmJit.h \ utils/AsmJit/Config.h \ utils/AsmJit/core.h \ utils/AsmJit/x86.h \ utils/AsmJit/core/apibegin.h \ utils/AsmJit/core/apiend.h \ utils/AsmJit/core/assembler.cpp \ utils/AsmJit/core/assembler.h \ utils/AsmJit/core/assert.cpp \ utils/AsmJit/core/assert.h \ utils/AsmJit/core/buffer.cpp \ utils/AsmJit/core/buffer.h \ utils/AsmJit/core/build.h \ utils/AsmJit/core/compiler.cpp \ utils/AsmJit/core/compiler.h \ utils/AsmJit/core/compilercontext.cpp \ utils/AsmJit/core/compilercontext.h \ utils/AsmJit/core/compilerfunc.cpp \ utils/AsmJit/core/compilerfunc.h \ utils/AsmJit/core/compileritem.cpp \ utils/AsmJit/core/compileritem.h \ utils/AsmJit/core/context.cpp \ utils/AsmJit/core/context.h \ utils/AsmJit/core/cpuinfo.cpp \ utils/AsmJit/core/cpuinfo.h \ utils/AsmJit/core/defs.cpp \ utils/AsmJit/core/defs.h \ utils/AsmJit/core/func.cpp \ utils/AsmJit/core/func.h \ utils/AsmJit/core/intutil.h \ utils/AsmJit/core/lock.h \ utils/AsmJit/core/logger.cpp \ utils/AsmJit/core/logger.h \ utils/AsmJit/core/memorymanager.cpp \ utils/AsmJit/core/memorymanager.h \ utils/AsmJit/core/memorymarker.cpp \ utils/AsmJit/core/memorymarker.h \ utils/AsmJit/core/operand.cpp \ utils/AsmJit/core/operand.h \ utils/AsmJit/core/podvector.h \ utils/AsmJit/core/stringbuilder.cpp \ utils/AsmJit/core/stringbuilder.h \ utils/AsmJit/core/stringutil.cpp \ utils/AsmJit/core/stringutil.h \ utils/AsmJit/core/virtualmemory.cpp \ utils/AsmJit/core/virtualmemory.h \ utils/AsmJit/core/zonememory.cpp \ utils/AsmJit/core/zonememory.h \ utils/AsmJit/x86/x86assembler.cpp \ utils/AsmJit/x86/x86assembler.h \ utils/AsmJit/x86/x86compiler.cpp \ utils/AsmJit/x86/x86compiler.h \ utils/AsmJit/x86/x86compilercontext.cpp \ utils/AsmJit/x86/x86compilercontext.h \ utils/AsmJit/x86/x86compilerfunc.cpp \ utils/AsmJit/x86/x86compilerfunc.h \ utils/AsmJit/x86/x86compileritem.cpp \ utils/AsmJit/x86/x86compileritem.h \ utils/AsmJit/x86/x86cpuinfo.cpp \ utils/AsmJit/x86/x86cpuinfo.h \ utils/AsmJit/x86/x86defs.cpp \ utils/AsmJit/x86/x86defs.h \ utils/AsmJit/x86/x86func.cpp \ utils/AsmJit/x86/x86func.h \ utils/AsmJit/x86/x86operand.cpp \ utils/AsmJit/x86/x86operand.h \ utils/AsmJit/x86/x86util.cpp \ utils/AsmJit/x86/x86util.h endif if HAVE_GL libdesmume_a_SOURCES += OGLRender.cpp OGLRender_3_2.cpp endif if HAVE_OPENAL libdesmume_a_SOURCES += mic_openal.cpp else if HAVE_ALSA libdesmume_a_SOURCES += mic_alsa.cpp else libdesmume_a_SOURCES += mic.cpp endif endif if HAVE_LIBSOUNDTOUCH libdesmume_a_SOURCES += metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp endif if HAVE_LIBAGG libdesmume_a_SOURCES += aggdraw.cpp aggdraw.h GPU_osd.cpp else libdesmume_a_SOURCES += GPU_osd_stub.cpp endif if HAVE_LUA AM_CPPFLAGS += $(LUA_CFLAGS) libdesmume_a_SOURCES += lua-engine.cpp endif if HAVE_GDB_STUB libdesmume_a_SOURCES += gdbstub.h endif libdesmume_a_LIBADD = fs-$(desmume_arch).$(OBJEXT) desmume-0.9.11/src/rasterize.cpp0000755000000000000000000014326112467662066015273 0ustar rootroot/* Copyright (C) 2009-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ //nothing in this file should be assumed to be accurate // //the shape rasterizers contained herein are based on code supplied by Chris Hecker from //http://chrishecker.com/Miscellaneous_Technical_Articles //TODO - due to a late change of a y-coord flipping, our winding order is wrong //this causes us to have to flip the verts for every front-facing poly. //a performance improvement would be to change the winding order logic //so that this is done less frequently #include "rasterize.h" #include #include #include #include #if defined(_MSC_VER) && _MSC_VER == 1600 #define SLEEP_HACK_2011 #endif #ifdef SLEEP_HACK_2011 #include #endif #ifndef _MSC_VER #include #endif #include "bits.h" #include "common.h" #include "matrix.h" #include "render3D.h" #include "gfx3d.h" #include "texcache.h" #include "MMU.h" #include "NDSSystem.h" #include "utils/task.h" //#undef FORCEINLINE //#define FORCEINLINE //#undef INLINE //#define INLINE using std::min; using std::max; using std::swap; template T _min(T a, T b, T c) { return min(min(a,b),c); } template T _max(T a, T b, T c) { return max(max(a,b),c); } template T _min(T a, T b, T c, T d) { return min(_min(a,b,d),c); } template T _max(T a, T b, T c, T d) { return max(_max(a,b,d),c); } static const int kUnsetTranslucentPolyID = 255; static u8 modulate_table[64][64]; static u8 decal_table[32][64][64]; static u8 index_lookup_table[65]; static u8 index_start_table[8]; static bool softRastHasNewData = false; ////optimized float floor useful in limited cases ////from http://www.stereopsis.com/FPU.html#convert ////(unfortunately, it relies on certain FPU register settings) //int Real2Int(double val) //{ // const double _double2fixmagic = 68719476736.0*1.5; //2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor // const int _shiftamt = 16; //16.16 fixed point representation, // // #ifdef WORDS_BIGENDIAN // #define iman_ 1 // #else // #define iman_ 0 // #endif // // val = val + _double2fixmagic; // return ((int*)&val)[iman_] >> _shiftamt; //} //// this probably relies on rounding settings.. //int Real2Int(float val) //{ // //val -= 0.5f; // //int temp; // //__asm { // // fld val; // // fistp temp; // //} // //return temp; // return 0; //} //doesnt work yet static FORCEINLINE int fastFloor(float f) { float temp = f + 1.f; int ret = (*((u32*)&temp))&0x7FFFFF; return ret; } //INLINE static void SubmitVertex(int vert_index, VERT& rawvert) //{ // verts[vert_index] = &rawvert; //} static Fragment _screen[GFX3D_FRAMEBUFFER_WIDTH*GFX3D_FRAMEBUFFER_HEIGHT]; static FragmentColor _screenColor[GFX3D_FRAMEBUFFER_WIDTH*GFX3D_FRAMEBUFFER_HEIGHT]; static FORCEINLINE int iround(float f) { return (int)f; //lol } typedef int fixed28_4; // handle floor divides and mods correctly static FORCEINLINE void FloorDivMod(long Numerator, long Denominator, long &Floor, long &Mod, bool& failure) { //These must be caused by invalid or degenerate shapes.. not sure yet. //check it out in the mario face intro of SM64 //so, we have to take out the assert. //I do know that we handle SOME invalid shapes without crashing, //since I see them acting poppy in a way that doesnt happen in the HW.. so alas it is also incorrect. //This particular incorrectness is not likely ever to get fixed! //assert(Denominator > 0); //but we have to bail out since our handling for these cases currently steps scanlines //the wrong way and goes totally nuts (freezes) if(Denominator<=0) failure = true; if(Numerator >= 0) { // positive case, C is okay Floor = Numerator / Denominator; Mod = Numerator % Denominator; } else { // Numerator is negative, do the right thing Floor = -((-Numerator) / Denominator); Mod = (-Numerator) % Denominator; if(Mod) { // there is a remainder Floor--; Mod = Denominator - Mod; } } } static FORCEINLINE fixed28_4 FloatToFixed28_4( float Value ) { return (fixed28_4)(Value * 16); } static FORCEINLINE float Fixed28_4ToFloat( fixed28_4 Value ) { return Value / 16.0f; } //inline fixed16_16 FloatToFixed16_16( float Value ) { // return (fixed16_6)(Value * 65536); //} //inline float Fixed16_16ToFloat( fixed16_16 Value ) { // return Value / 65536.0; //} static FORCEINLINE fixed28_4 Fixed28_4Mul( fixed28_4 A, fixed28_4 B ) { // could make this asm to prevent overflow return (A * B) / 16; // 28.4 * 28.4 = 24.8 / 16 = 28.4 } static FORCEINLINE int Ceil28_4( fixed28_4 Value ) { int ReturnValue; int Numerator = Value - 1 + 16; if(Numerator >= 0) { ReturnValue = Numerator/16; } else { // deal with negative numerators correctly ReturnValue = -((-Numerator)/16); ReturnValue -= ((-Numerator) % 16) ? 1 : 0; } return ReturnValue; } struct edge_fx_fl { edge_fx_fl() {} edge_fx_fl(int Top, int Bottom, VERT** verts, bool& failure); FORCEINLINE int Step(); VERT** verts; long X, XStep, Numerator, Denominator; // DDA info for x long ErrorTerm; int Y, Height; // current y and vertical count struct Interpolant { float curr, step, stepExtra; FORCEINLINE void doStep() { curr += step; } FORCEINLINE void doStepExtra() { curr += stepExtra; } FORCEINLINE void initialize(float value) { curr = value; step = 0; stepExtra = 0; } FORCEINLINE void initialize(float top, float bottom, float dx, float dy, long XStep, float XPrestep, float YPrestep) { dx = 0; dy *= (bottom-top); curr = top + YPrestep * dy + XPrestep * dx; step = XStep * dx + dy; stepExtra = dx; } }; static const int NUM_INTERPOLANTS = 7; union { struct { Interpolant invw,z,u,v,color[3]; }; Interpolant interpolants[NUM_INTERPOLANTS]; }; void FORCEINLINE doStepInterpolants() { for(int i=0;iverts = verts; Y = Ceil28_4((fixed28_4)verts[Top]->y); int YEnd = Ceil28_4((fixed28_4)verts[Bottom]->y); Height = YEnd - Y; X = Ceil28_4((fixed28_4)verts[Top]->x); int XEnd = Ceil28_4((fixed28_4)verts[Bottom]->x); int Width = XEnd - X; // can be negative // even if Height == 0, give some info for horizontal line poly if(Height != 0 || Width != 0) { long dN = long(verts[Bottom]->y - verts[Top]->y); long dM = long(verts[Bottom]->x - verts[Top]->x); if (dN != 0) { long InitialNumerator = (long)(dM*16*Y - dM*verts[Top]->y + dN*verts[Top]->x - 1 + dN*16); FloorDivMod(InitialNumerator,dN*16,X,ErrorTerm,failure); FloorDivMod(dM*16,dN*16,XStep,Numerator,failure); Denominator = dN*16; } else { XStep = Width; Numerator = 0; ErrorTerm = 0; Denominator = 1; dN = 1; } float YPrestep = Fixed28_4ToFloat((fixed28_4)(Y*16 - verts[Top]->y)); float XPrestep = Fixed28_4ToFloat((fixed28_4)(X*16 - verts[Top]->x)); float dy = 1/Fixed28_4ToFloat(dN); float dx = 1/Fixed28_4ToFloat(dM); invw.initialize(1/verts[Top]->w,1/verts[Bottom]->w,dx,dy,XStep,XPrestep,YPrestep); u.initialize(verts[Top]->u,verts[Bottom]->u,dx,dy,XStep,XPrestep,YPrestep); v.initialize(verts[Top]->v,verts[Bottom]->v,dx,dy,XStep,XPrestep,YPrestep); z.initialize(verts[Top]->z,verts[Bottom]->z,dx,dy,XStep,XPrestep,YPrestep); for(int i=0;i<3;i++) color[i].initialize(verts[Top]->fcolor[i],verts[Bottom]->fcolor[i],dx,dy,XStep,XPrestep,YPrestep); } else { // even if Width == 0 && Height == 0, give some info for pixel poly // example: Castlevania Portrait of Ruin, warp stone XStep = 1; Numerator = 0; Denominator = 1; ErrorTerm = 0; invw.initialize(1/verts[Top]->w); u.initialize(verts[Top]->u); v.initialize(verts[Top]->v); z.initialize(verts[Top]->z); for(int i=0;i<3;i++) color[i].initialize(verts[Top]->fcolor[i]); } } FORCEINLINE int edge_fx_fl::Step() { X += XStep; Y++; Height--; doStepInterpolants(); ErrorTerm += Numerator; if(ErrorTerm >= Denominator) { X++; ErrorTerm -= Denominator; doStepExtraInterpolants(); } return Height; } static FORCEINLINE void alphaBlend(FragmentColor & dst, const FragmentColor & src) { if(gfx3d.renderState.enableAlphaBlending) { if(src.a == 31 || dst.a == 0) { dst = src; } //else if(src.a == 0) { } //this is not necessary since it was handled earlier else { u8 alpha = src.a+1; u8 invAlpha = 32 - alpha; dst.r = (alpha*src.r + invAlpha*dst.r)>>5; dst.g = (alpha*src.g + invAlpha*dst.g)>>5; dst.b = (alpha*src.b + invAlpha*dst.b)>>5; } dst.a = max(src.a,dst.a); } else { if(src.a == 0) { //do nothing; the fragment is totally transparent } else { dst = src; } } } // TODO: wire-frame struct PolyAttr { u32 val; bool decalMode; bool translucentDepthWrite; bool drawBackPlaneIntersectingPolys; u8 polyid; u8 alpha; bool backfacing; bool translucent; u8 fogged; bool isVisible(bool backfacing) { //this was added after adding multi-bit stencil buffer //it seems that we also need to prevent drawing back faces of shadow polys for rendering u32 mode = (val>>4)&0x3; if(mode==3 && polyid !=0) return !backfacing; //another reasonable possibility is that we should be forcing back faces to draw (mariokart doesnt use them) //and then only using a single bit buffer (but a cursory test of this doesnt actually work) // //this code needs to be here for shadows in wizard of oz to work. switch((val>>6)&3) { case 0: return false; case 1: return backfacing; case 2: return !backfacing; case 3: return true; default: assert(false); return false; } } void setup(u32 polyAttr) { val = polyAttr; decalMode = BIT14(val); translucentDepthWrite = BIT11(val); polyid = (polyAttr>>24)&0x3F; alpha = (polyAttr>>16)&0x1F; drawBackPlaneIntersectingPolys = BIT12(val); fogged = BIT15(val); } }; template class RasterizerUnit { public: int SLI_MASK, SLI_VALUE; bool _debug_thisPoly; RasterizerUnit() : _debug_thisPoly(false) { } TexCacheItem* lastTexKey; VERT* verts[MAX_CLIPPED_VERTS]; PolyAttr polyAttr; int polynum; struct Sampler { Sampler() {} bool enabled; int width, height; s32 wmask, hmask; int wrap; int wshift; int texFormat; void setup(u32 texParam) { texFormat = (texParam>>26)&7; wshift = ((texParam>>20)&0x07) + 3; width=(1 << wshift); height=(8 << ((texParam>>23)&0x07)); wmask = width-1; hmask = height-1; wrap = (texParam>>16)&0xF; enabled = gfx3d.renderState.enableTexturing && (texFormat!=0); } FORCEINLINE void clamp(s32 &val, const int size, const s32 sizemask){ if(val<0) val = 0; if(val>sizemask) val = sizemask; } FORCEINLINE void hclamp(s32 &val) { clamp(val,width,wmask); } FORCEINLINE void vclamp(s32 &val) { clamp(val,height,hmask); } FORCEINLINE void repeat(s32 &val, const int size, const s32 sizemask) { val &= sizemask; } FORCEINLINE void hrepeat(s32 &val) { repeat(val,width,wmask); } FORCEINLINE void vrepeat(s32 &val) { repeat(val,height,hmask); } FORCEINLINE void flip(s32 &val, const int size, const s32 sizemask) { val &= ((size<<1)-1); if(val>=size) val = (size<<1)-val-1; } FORCEINLINE void hflip(s32 &val) { flip(val,width,wmask); } FORCEINLINE void vflip(s32 &val) { flip(val,height,hmask); } FORCEINLINE void dowrap(s32 &iu, s32 &iv) { switch(wrap) { //flip none case 0x0: hclamp(iu); vclamp(iv); break; case 0x1: hrepeat(iu); vclamp(iv); break; case 0x2: hclamp(iu); vrepeat(iv); break; case 0x3: hrepeat(iu); vrepeat(iv); break; //flip S case 0x4: hclamp(iu); vclamp(iv); break; case 0x5: hflip(iu); vclamp(iv); break; case 0x6: hclamp(iu); vrepeat(iv); break; case 0x7: hflip(iu); vrepeat(iv); break; //flip T case 0x8: hclamp(iu); vclamp(iv); break; case 0x9: hrepeat(iu); vclamp(iv); break; case 0xA: hclamp(iu); vflip(iv); break; case 0xB: hrepeat(iu); vflip(iv); break; //flip both case 0xC: hclamp(iu); vclamp(iv); break; case 0xD: hflip(iu); vclamp(iv); break; case 0xE: hclamp(iu); vflip(iv); break; case 0xF: hflip(iu); vflip(iv); break; } } } sampler; FORCEINLINE FragmentColor sample(float u, float v) { static const FragmentColor white = MakeFragmentColor(63,63,63,31); if(!sampler.enabled) return white; //finally, we can use floor here. but, it is slower than we want. //the best solution is probably to wait until the pipeline is full of fixed point s32 iu = 0; s32 iv = 0; if (!CommonSettings.GFX3D_TXTHack) { iu = s32floor(u); iv = s32floor(v); } else { iu = round_s(u); iv = round_s(v); } sampler.dowrap(iu, iv); FragmentColor color; color.color = ((u32*)lastTexKey->decoded)[(iv< 0.0 ){ return floorf(val*256.0f+0.5f)/256.0f; //this value(256.0) is good result.(I think) } else { return -1.0*floorf(fabs(val)*256.0f+0.5f)/256.0f; } } struct Shader { u8 mode; float invu, invv, w; FragmentColor materialColor; } shader; FORCEINLINE void shade(FragmentColor& dst) { FragmentColor texColor; float u,v; switch(shader.mode) { case 0: //modulate u = shader.invu*shader.w; v = shader.invv*shader.w; texColor = sample(u,v); dst.r = modulate_table[texColor.r][shader.materialColor.r]; dst.g = modulate_table[texColor.g][shader.materialColor.g]; dst.b = modulate_table[texColor.b][shader.materialColor.b]; dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1; //dst.a = 28; //#ifdef _MSC_VER //if(GetAsyncKeyState(VK_SHIFT)) { // //debugging tricks // dst = shader.materialColor; // if(GetAsyncKeyState(VK_TAB)) { // u8 alpha = dst.a; // dst.color = polynum*8+8; // dst.a = alpha; // } //} //#endif break; case 1: //decal if(sampler.enabled) { u = shader.invu*shader.w; v = shader.invv*shader.w; texColor = sample(u,v); dst.r = decal_table[texColor.a][texColor.r][shader.materialColor.r]; dst.g = decal_table[texColor.a][texColor.g][shader.materialColor.g]; dst.b = decal_table[texColor.a][texColor.b][shader.materialColor.b]; dst.a = shader.materialColor.a; } else dst = shader.materialColor; break; case 2: //toon/highlight shading { u = shader.invu*shader.w; v = shader.invv*shader.w; texColor = sample(u,v); FragmentColor toonColor = engine->toonTable[shader.materialColor.r>>1]; if(gfx3d.renderState.shading == GFX3D_State::HIGHLIGHT) { dst.r = modulate_table[texColor.r][shader.materialColor.r]; dst.g = modulate_table[texColor.g][shader.materialColor.r]; dst.b = modulate_table[texColor.b][shader.materialColor.r]; dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1; dst.r = min(63, (dst.r + toonColor.r)); dst.g = min(63, (dst.g + toonColor.g)); dst.b = min(63, (dst.b + toonColor.b)); } else { dst.r = modulate_table[texColor.r][toonColor.r]; dst.g = modulate_table[texColor.g][toonColor.g]; dst.b = modulate_table[texColor.b][toonColor.b]; dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1; } } break; case 3: //shadows //is this right? only with the material color? dst = shader.materialColor; break; } } void setupShader(u32 polyattr) { shader.mode = (polyattr>>4)&0x3; } FORCEINLINE void pixel(int adr,float r, float g, float b, float invu, float invv, float w, float z) { Fragment &destFragment = engine->screen[adr]; FragmentColor &destFragmentColor = engine->screenColor[adr]; u32 depth; if(gfx3d.renderState.wbuffer) { //not sure about this //this value was chosen to make the skybox, castle window decals, and water level render correctly in SM64 depth = u32floor(4096*w); } else { depth = u32floor(z*0x7FFF); depth <<= 9; } if(polyAttr.decalMode) { if ( CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack > 0) { if(depthdestFragment.depth + CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack) { goto depth_fail; } } else { if(depth != destFragment.depth) { goto depth_fail; } } } else { if(depth>=destFragment.depth) { goto depth_fail; } } //handle shadow polys if(shader.mode == 3) { if(polyAttr.polyid == 0) { goto rejected_fragment; } else { if(destFragment.stencil==0) { goto rejected_fragment; } //shadow polys have a special check here to keep from self-shadowing when user //has tried to prevent it from happening //if this isnt here, then the vehicle select in mariokart will look terrible if(destFragment.polyid.opaque == polyAttr.polyid) goto rejected_fragment; } } shader.w = w; shader.invu = invu; shader.invv = invv; //perspective-correct the colors r = (r * w) + 0.5f; g = (g * w) + 0.5f; b = (b * w) + 0.5f; //this is a HACK: //we are being very sloppy with our interpolation precision right now //and rather than fix it, i just want to clamp it shader.materialColor.r = max(0U,min(63U,u32floor(r))); shader.materialColor.g = max(0U,min(63U,u32floor(g))); shader.materialColor.b = max(0U,min(63U,u32floor(b))); shader.materialColor.a = polyAttr.alpha; //pixel shader FragmentColor shaderOutput; shade(shaderOutput); //we shouldnt do any of this if we generated a totally transparent pixel if(shaderOutput.a != 0) { //alpha test (don't have any test cases for this...? is it in the right place...?) if(gfx3d.renderState.enableAlphaTest) { if(shaderOutput.a < gfx3d.renderState.alphaTestRef) goto rejected_fragment; } //handle polyids bool isOpaquePixel = shaderOutput.a == 31; if(isOpaquePixel) { destFragment.polyid.opaque = polyAttr.polyid; destFragment.isTranslucentPoly = polyAttr.translucent?1:0; destFragment.fogged = polyAttr.fogged; destFragmentColor = shaderOutput; } else { //dont overwrite pixels on translucent polys with the same polyids if(destFragment.polyid.translucent == polyAttr.polyid) goto rejected_fragment; //originally we were using a test case of shadows-behind-trees in sm64ds //but, it looks bad in that game. this is actually correct //if this isnt correct, then complex shape cart shadows in mario kart don't work right destFragment.polyid.translucent = polyAttr.polyid; //alpha blending and write color alphaBlend(destFragmentColor, shaderOutput); destFragment.fogged &= polyAttr.fogged; } //depth writing if(isOpaquePixel || polyAttr.translucentDepthWrite) destFragment.depth = depth; } //shadow cases: (need multi-bit stencil buffer to cope with all of these, especially the mariokart compelx shadows) //1. sm64 (standing near signs and blocks) //2. mariokart (no glitches in shadow shape in kart selector) //3. mariokart (no junk beneath platform in kart selector / no shadow beneath grate floor in bowser stage) //(specifically, the shadows in mario kart are complicated concave shapes) goto done; depth_fail: if(shader.mode == 3 && polyAttr.polyid == 0) destFragment.stencil++; rejected_fragment: done: ; if(shader.mode == 3 && polyAttr.polyid != 0 && destFragment.stencil) destFragment.stencil--; } //draws a single scanline FORCEINLINE void drawscanline(edge_fx_fl *pLeft, edge_fx_fl *pRight, bool lineHack) { int XStart = pLeft->X; int width = pRight->X - XStart; // HACK: workaround for vertical/slant line poly if (lineHack && width == 0) { int leftWidth = pLeft->XStep; if (pLeft->ErrorTerm + pLeft->Numerator >= pLeft->Denominator) leftWidth++; int rightWidth = pRight->XStep; if (pRight->ErrorTerm + pRight->Numerator >= pRight->Denominator) rightWidth++; width = max(1, max(abs(leftWidth), abs(rightWidth))); } //these are the starting values, taken from the left edge float invw = pLeft->invw.curr; float u = pLeft->u.curr; float v = pLeft->v.curr; float z = pLeft->z.curr; float color[3] = { pLeft->color[0].curr, pLeft->color[1].curr, pLeft->color[2].curr }; //our dx values are taken from the steps up until the right edge float invWidth = 1.0f / width; float dinvw_dx = (pRight->invw.curr - invw) * invWidth; float du_dx = (pRight->u.curr - u) * invWidth; float dv_dx = (pRight->v.curr - v) * invWidth; float dz_dx = (pRight->z.curr - z) * invWidth; float dc_dx[3] = { (pRight->color[0].curr - color[0]) * invWidth, (pRight->color[1].curr - color[1]) * invWidth, (pRight->color[2].curr - color[2]) * invWidth }; int adr = (pLeft->Y*engine->width)+XStart; //CONSIDER: in case some other math is wrong (shouldve been clipped OK), we might go out of bounds here. //better check the Y value. if(RENDERER && (pLeft->Y<0 || pLeft->Y>191)) { printf("rasterizer rendering at y=%d! oops!\n",pLeft->Y); return; } if(!RENDERER && (pLeft->Y<0 || pLeft->Y>=engine->height)) { printf("rasterizer rendering at y=%d! oops!\n",pLeft->Y); return; } int x = XStart; if(x<0) { if(RENDERER && !lineHack) { printf("rasterizer rendering at x=%d! oops!\n",x); return; } invw += dinvw_dx * -x; u += du_dx * -x; v += dv_dx * -x; z += dz_dx * -x; color[0] += dc_dx[0] * -x; color[1] += dc_dx[1] * -x; color[2] += dc_dx[2] * -x; adr += -x; width -= -x; x = 0; } if(x+width > (RENDERER?GFX3D_FRAMEBUFFER_WIDTH:engine->width)) { if(RENDERER && !lineHack) { printf("rasterizer rendering at x=%d! oops!\n",x+width-1); return; } width = (RENDERER?GFX3D_FRAMEBUFFER_WIDTH:engine->width)-x; } while(width-- > 0) { pixel(adr,color[0],color[1],color[2],u,v,1.0f/invw,z); adr++; x++; invw += dinvw_dx; u += du_dx; v += dv_dx; z += dz_dx; color[0] += dc_dx[0]; color[1] += dc_dx[1]; color[2] += dc_dx[2]; } } //runs several scanlines, until an edge is finished template void runscanlines(edge_fx_fl *left, edge_fx_fl *right, bool horizontal, bool lineHack) { //oh lord, hack city for edge drawing //do not overstep either of the edges int Height = min(left->Height,right->Height); bool first=true; //HACK: special handling for horizontal line poly if (lineHack && left->Height == 0 && right->Height == 0 && left->YY>=0) { bool draw = (!SLI || (left->Y & SLI_MASK) == SLI_VALUE); if(draw) drawscanline(left,right,lineHack); } while(Height--) { bool draw = (!SLI || (left->Y & SLI_MASK) == SLI_VALUE); if(draw) drawscanline(left,right,lineHack); const int xl = left->X; const int xr = right->X; const int y = left->Y; left->Step(); right->Step(); if(!RENDERER && _debug_thisPoly) { //debug drawing bool top = (horizontal&&first); bool bottom = (!Height&&horizontal); if(Height || top || bottom) { if(draw) { int nxl = left->X; int nxr = right->X; if(top) { int xs = min(xl,xr); int xe = max(xl,xr); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } } else if(bottom) { int xs = min(xl,xr); int xe = max(xl,xr); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } } else { int xs = min(xl,nxl); int xe = max(xl,nxl); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } xs = min(xr,nxr); xe = max(xr,nxr); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } } } } first = false; } } } //rotates verts counterclockwise template INLINE void rot_verts() { #define ROTSWAP(X) if(type>X) swap(verts[X-1],verts[X]); ROTSWAP(1); ROTSWAP(2); ROTSWAP(3); ROTSWAP(4); ROTSWAP(5); ROTSWAP(6); ROTSWAP(7); ROTSWAP(8); ROTSWAP(9); } //rotate verts until vert0.y is minimum, and then vert0.x is minimum in case of ties //this is a necessary precondition for our shape engine template void sort_verts(bool backwards) { //if the verts are backwards, reorder them first if(backwards) for(int i=0;iX) if(verts[0]->y > verts[X]->y) goto doswap; CHECKY(1); CHECKY(2); CHECKY(3); CHECKY(4); CHECKY(5); CHECKY(6); CHECKY(7); CHECKY(8); CHECKY(9); break; doswap: rot_verts(); } while(verts[0]->y == verts[1]->y && verts[0]->x > verts[1]->x) { rot_verts(); // hack for VC++ 2010 (bug in compiler optimization?) // freeze on 3D // TODO: study it #ifdef SLEEP_HACK_2011 Sleep(0); // nop #endif } } //This function can handle any convex N-gon up to octagons //verts must be clockwise. //I didnt reference anything for this algorithm but it seems like I've seen it somewhere before. //Maybe it is like crow's algorithm template void shape_engine(int type, bool backwards, bool lineHack) { bool failure = false; switch(type) { case 3: sort_verts<3>(backwards); break; case 4: sort_verts<4>(backwards); break; case 5: sort_verts<5>(backwards); break; case 6: sort_verts<6>(backwards); break; case 7: sort_verts<7>(backwards); break; case 8: sort_verts<8>(backwards); break; case 9: sort_verts<9>(backwards); break; case 10: sort_verts<10>(backwards); break; default: printf("skipping type %d\n",type); return; } //we are going to step around the polygon in both directions starting from vert 0. //right edges will be stepped over clockwise and left edges stepped over counterclockwise. //these variables track that stepping, but in order to facilitate wrapping we start extra high //for the counter we're decrementing. int lv = type, rv = 0; edge_fx_fl left, right; bool step_left = true, step_right = true; for(;;) { //generate new edges if necessary. we must avoid regenerating edges when they are incomplete //so that they can be continued on down the shape assert(rv != type); int _lv = lv==type?0:lv; //make sure that we ask for vert 0 when the variable contains the starting value if(step_left) left = edge_fx_fl(_lv,lv-1,(VERT**)&verts, failure); if(step_right) right = edge_fx_fl(rv,rv+1,(VERT**)&verts, failure); step_left = step_right = false; //handle a failure in the edge setup due to nutty polys if(failure) return; bool horizontal = left.Y == right.Y; runscanlines(&left,&right,horizontal, lineHack); //if we ran out of an edge, step to the next one if(right.Height == 0) { step_right = true; rv++; } if(left.Height == 0) { step_left = true; lv--; } //this is our completion condition: when our stepped edges meet in the middle if(lv<=rv+1) break; } } SoftRasterizerEngine* engine; template FORCEINLINE void mainLoop(SoftRasterizerEngine* const engine) { this->engine = engine; lastTexKey = NULL; u32 lastPolyAttr = 0; u32 lastTextureFormat = 0, lastTexturePalette = 0; //iterate over polys bool first=true; for(int i=0;iclippedPolyCounter;i++) { if(!RENDERER) _debug_thisPoly = (i==engine->_debug_drawClippedUserPoly); if(!engine->polyVisible[i]) continue; polynum = i; GFX3D_Clipper::TClippedPoly &clippedPoly = engine->clippedPolys[i]; POLY *poly = clippedPoly.poly; int type = clippedPoly.type; if(first || lastPolyAttr != poly->polyAttr) { polyAttr.setup(poly->polyAttr); polyAttr.translucent = poly->isTranslucent(); lastPolyAttr = poly->polyAttr; } if(first || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette) { sampler.setup(poly->texParam); lastTextureFormat = poly->texParam; lastTexturePalette = poly->texPalette; } first = false; lastTexKey = engine->polyTexKeys[i]; //hmm... shader gets setup every time because it depends on sampler which may have just changed setupShader(poly->polyAttr); for(int j=0;jverts[j] = &clippedPoly.clipVerts[j]; for(int j=type;jverts[j] = NULL; polyAttr.backfacing = engine->polyBackfacing[i]; shape_engine(type,!polyAttr.backfacing, (poly->vtxFormat & 4) && CommonSettings.GFX3D_LineHack); } } }; //rasterizerUnit static SoftRasterizerEngine mainSoftRasterizer; #define _MAX_CORES 16 static Task rasterizerUnitTask[_MAX_CORES]; static RasterizerUnit rasterizerUnit[_MAX_CORES]; static RasterizerUnit _HACK_viewer_rasterizerUnit; static unsigned int rasterizerCores = 0; static bool rasterizerUnitTasksInited = false; static void* execRasterizerUnit(void* arg) { intptr_t which = (intptr_t)arg; rasterizerUnit[which].mainLoop(&mainSoftRasterizer); return 0; } static char SoftRastInit(void) { char result = Default3D_Init(); if (result == 0) { return result; } if(!rasterizerUnitTasksInited) { rasterizerUnitTasksInited = true; _HACK_viewer_rasterizerUnit.SLI_MASK = 1; _HACK_viewer_rasterizerUnit.SLI_VALUE = 0; rasterizerCores = CommonSettings.num_cores; if (rasterizerCores > _MAX_CORES) rasterizerCores = _MAX_CORES; if(CommonSettings.num_cores == 1) { rasterizerCores = 1; rasterizerUnit[0].SLI_MASK = 0; rasterizerUnit[0].SLI_VALUE = 0; } else { for (u8 i = 0; i < rasterizerCores; i++) { rasterizerUnit[i].SLI_MASK = (rasterizerCores - 1); rasterizerUnit[i].SLI_VALUE = i; rasterizerUnitTask[i].start(false); } } } static bool tables_generated = false; if(!tables_generated) { tables_generated = true; for(int i=0;i<64;i++) { for(int j=0;j<64;j++) { modulate_table[i][j] = ((i+1) * (j+1) - 1) >> 6; for(int a=0;a<32;a++) decal_table[a][i][j] = ((i*a) + (j*(31-a))) >> 5; } } //these tables are used to increment through vert lists without having to do wrapping logic/math int idx=0; for(int i=3;i<=8;i++) { index_start_table[i-3] = idx; for(int j=0;j 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); } } softRastHasNewData = false; Default3D_Reset(); } static void SoftRastClose() { if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); rasterizerUnitTask[i].shutdown(); } } rasterizerUnitTasksInited = false; softRastHasNewData = false; Default3D_Close(); } static void SoftRastVramReconfigureSignal() { Default3D_VramReconfigureSignal(); } static void SoftRastConvertFramebuffer() { memcpy(gfx3d_convertedScreen, _screenColor, GFX3D_FRAMEBUFFER_WIDTH*GFX3D_FRAMEBUFFER_HEIGHT*4); } void SoftRasterizerEngine::initFramebuffer(const int width, const int height, const bool clearImage) { const int todo = width*height; Fragment clearFragment; FragmentColor clearFragmentColor; clearFragment.isTranslucentPoly = 0; clearFragmentColor.r = GFX3D_5TO6(gfx3d.renderState.clearColor&0x1F); clearFragmentColor.g = GFX3D_5TO6((gfx3d.renderState.clearColor>>5)&0x1F); clearFragmentColor.b = GFX3D_5TO6((gfx3d.renderState.clearColor>>10)&0x1F); clearFragmentColor.a = ((gfx3d.renderState.clearColor>>16)&0x1F); clearFragment.polyid.opaque = (gfx3d.renderState.clearColor>>24)&0x3F; //special value for uninitialized translucent polyid. without this, fires in spiderman2 dont display //I am not sure whether it is right, though. previously this was cleared to 0, as a guess, //but in spiderman2 some fires with polyid 0 try to render on top of the background clearFragment.polyid.translucent = kUnsetTranslucentPolyID; clearFragment.depth = gfx3d.renderState.clearDepth; clearFragment.stencil = 0; clearFragment.isTranslucentPoly = 0; clearFragment.fogged = BIT15(gfx3d.renderState.clearColor); for(int i=0;i>8)&0xFF; FragmentColor *dstColor = screenColor; Fragment *dst = screen; for(int iy=0; iycolor = RGB15TO6665(col,31*(col>>15)); //this is tested quite well in the sonic chronicles main map mode //where depth values are used for trees etc you can walk behind u16 depth = clearDepth[adr]; dst->fogged = BIT15(depth); dst->depth = DS_DEPTH15TO24(depth); dstColor++; dst++; } } } else for(int i=0;i> 2) & 0x3F; toonTable[i].g = (u32temp >> 10) & 0x3F; toonTable[i].b = (u32temp >> 18) & 0x3F; #else toonTable[i].color = (RGB15TO32_NOALPHA(gfx3d.renderState.u16ToonTable[i])>>2)&0x3F3F3F3F; #endif //printf("%d %d %d %d\n",toonTable[i].r,toonTable[i].g,toonTable[i].b,toonTable[i].a); } } void SoftRasterizerEngine::updateFogTable() { u8* fogDensity = MMU.MMU_MEM[ARMCPU_ARM9][0x40] + 0x360; #if 0 //TODO - this might be a little slow; //we might need to hash all the variables and only recompute this when something changes const int increment = (0x400 >> gfx3d.renderState.fogShift); for(u32 i=0;i<32768;i++) { if(i> gfx3d.renderState.fogShift); const int incrementDivShift = 10 - gfx3d.renderState.fogShift; u32 fogOffset = min(max(gfx3d.renderState.fogOffset, 0), 32768); u32 iMin = min(32768, (( 1 + 1) << incrementDivShift) + fogOffset + 1 - increment); u32 iMax = min(32768, ((32 + 1) << incrementDivShift) + fogOffset + 1 - increment); assert(iMin <= iMax); memset(fogTable, fogDensity[0], iMin); for(u32 i = iMin; i < iMax; i++) { int num = (i - fogOffset + (increment-1)); int j = (num >> incrementDivShift) - 1; u32 value = (num & ~(increment-1)) + fogOffset; u32 diff = value - i; assert(j >= 1 && j < 32); fogTable[i] = ((diff*(fogDensity[j-1]) + (increment-diff)*(fogDensity[j])) >> incrementDivShift); } memset(fogTable+iMax, fogDensity[31], 32768-iMax); #endif } void SoftRasterizerEngine::updateFloatColors() { //convert colors to float to get more precision in case we need it for(int i=0;icount;i++) vertlist->list[i].color_to_float(); } SoftRasterizerEngine::SoftRasterizerEngine() : _debug_drawClippedUserPoly(-1) { this->clippedPolys = clipper.clippedPolys = new GFX3D_Clipper::TClippedPoly[POLYLIST_SIZE*2]; } void SoftRasterizerEngine::framebufferProcess() { // this looks ok although it's still pretty much a hack, // it needs to be redone with low-level accuracy at some point, // but that should probably wait until the shape renderer is more accurate. // a good test case for edge marking is Sonic Rush: // - the edges are completely sharp/opaque on the very brief title screen intro, // - the level-start intro gets a pseudo-antialiasing effect around the silhouette, // - the character edges in-level are clearly transparent, and also show well through shield powerups. if(gfx3d.renderState.enableEdgeMarking) { //TODO - need to test and find out whether these get grabbed at flush time, or at render time //we can do this by rendering a 3d frame and then freezing the system, but only changing the edge mark colors FragmentColor edgeMarkColors[8]; int edgeMarkDisabled[8]; for(int i=0;i<8;i++) { u16 col = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x330+i*2); edgeMarkColors[i].color = RGB15TO5555(col,gfx3d.state.enableAntialiasing ? 0x0F : 0x1F); edgeMarkColors[i].r = GFX3D_5TO6(edgeMarkColors[i].r); edgeMarkColors[i].g = GFX3D_5TO6(edgeMarkColors[i].g); edgeMarkColors[i].b = GFX3D_5TO6(edgeMarkColors[i].b); //zero 20-jun-2013 - this doesnt make any sense. at least, it should be related to the 0x8000 bit. if this is undocumented behaviour, lets write about which scenario proves it here, or which scenario is requiring this code. //// this seems to be the only thing that selectively disables edge marking //edgeMarkDisabled[i] = (col == 0x7FFF); edgeMarkDisabled[i] = 0; } for(int i=0,y=0; y>3]) continue; if(destFragment.isTranslucentPoly) continue; // > is used instead of != to prevent double edges // between overlapping polys of different IDs. // also note that the edge generally goes on the outside, not the inside, (maybe needs to change later) // and that polys with the same edge color can make edges against each other. FragmentColor edgeColor = edgeMarkColors[self>>3]; #define PIXOFFSET(dx,dy) ((dx)+(GFX3D_FRAMEBUFFER_WIDTH*(dy))) #define ISEDGE(dx,dy) ((x+(dx)!=GFX3D_FRAMEBUFFER_WIDTH) && (x+(dx)!=-1) && (y+(dy)!=GFX3D_FRAMEBUFFER_HEIGHT) && (y+(dy)!=-1) && self > screen[i+PIXOFFSET(dx,dy)].polyid.opaque) #define DRAWEDGE(dx,dy) alphaBlend(screenColor[i+PIXOFFSET(dx,dy)], edgeColor) bool upleft = ISEDGE(-1,-1); bool up = ISEDGE( 0,-1); bool upright = ISEDGE( 1,-1); bool left = ISEDGE(-1, 0); bool right = ISEDGE( 1, 0); bool downleft = ISEDGE(-1, 1); bool down = ISEDGE( 0, 1); bool downright = ISEDGE( 1, 1); if(upleft && upright && downleft && !downright) DRAWEDGE(-1,-1); if(up && !down) DRAWEDGE(0,-1); if(upleft && upright && !downleft && downright) DRAWEDGE(1,-1); if(left && !right) DRAWEDGE(-1,0); if(right && !left) DRAWEDGE(1,0); if(upleft && !upright && downleft && downright) DRAWEDGE(-1,1); if(down && !up) DRAWEDGE(0,1); if(!upleft && upright && downleft && downright) DRAWEDGE(1,1); #undef PIXOFFSET #undef ISEDGE #undef DRAWEDGE } } } if(gfx3d.renderState.enableFog) { u32 r = GFX3D_5TO6((gfx3d.renderState.fogColor)&0x1F); u32 g = GFX3D_5TO6((gfx3d.renderState.fogColor>>5)&0x1F); u32 b = GFX3D_5TO6((gfx3d.renderState.fogColor>>10)&0x1F); u32 a = (gfx3d.renderState.fogColor>>16)&0x1F; for(int i=0; i>9; assert(fogIndex<32768); u8 fog = fogTable[fogIndex]; if(fog==127) fog=128; if(!gfx3d.renderState.enableFogAlphaOnly) { destFragmentColor.r = ((128-fog)*destFragmentColor.r + r*fog)>>7; destFragmentColor.g = ((128-fog)*destFragmentColor.g + g*fog)>>7; destFragmentColor.b = ((128-fog)*destFragmentColor.b + b*fog)>>7; } destFragmentColor.a = ((128-fog)*destFragmentColor.a + a*fog)>>7; } } ////debug alpha channel framebuffer contents //for(int i=0;icount;i++) { POLY* poly = &polylist->list[indexlist->list[i]]; VERT* clipVerts[4] = { &vertlist->list[poly->vertIndexes[0]], &vertlist->list[poly->vertIndexes[1]], &vertlist->list[poly->vertIndexes[2]], poly->type==4 ?&vertlist->list[poly->vertIndexes[3]] :NULL }; if(hirez) clipper.clipPoly(poly,clipVerts); else clipper.clipPoly(poly,clipVerts); } clippedPolyCounter = clipper.clippedPolyCounter; } template void SoftRasterizerEngine::performViewportTransforms(int width, int height) { const float xfactor = (float)width/GFX3D_FRAMEBUFFER_WIDTH; const float yfactor = (float)height/GFX3D_FRAMEBUFFER_HEIGHT; const float xmax = GFX3D_FRAMEBUFFER_WIDTH*xfactor-(CUSTOM?0.001f:0); //fudge factor to keep from overrunning render buffers const float ymax = GFX3D_FRAMEBUFFER_HEIGHT*yfactor-(CUSTOM?0.001f:0); //viewport transforms for(int i=0;iviewport); vert.coord[0] *= viewport.width * xfactor; vert.coord[0] += viewport.x * xfactor; vert.coord[1] *= viewport.height * yfactor; vert.coord[1] += viewport.y * yfactor; vert.coord[1] = ymax - vert.coord[1]; //well, i guess we need to do this to keep Princess Debut from rendering huge polys. //there must be something strange going on vert.coord[0] = max(0.0f,min(xmax,vert.coord[0])); vert.coord[1] = max(0.0f,min(ymax,vert.coord[1])); } } } //these templates needed to be instantiated manually template void SoftRasterizerEngine::performViewportTransforms(int width, int height); template void SoftRasterizerEngine::performViewportTransforms(int width, int height); void SoftRasterizerEngine::performCoordAdjustment(const bool skipBackfacing) { for(int i=0;ipolyAttr); //make sure all the textures we'll need are cached //(otherwise on a multithreaded system there will be multiple writers-- //this SHOULD be read-only, although some day the texcache may collect statistics or something //and then it won't be safe. if(needInitTexture || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette) { lastTexKey = TexCache_SetTexture(TexFormat_15bpp,poly->texParam,poly->texPalette); lastTextureFormat = poly->texParam; lastTexturePalette = poly->texPalette; needInitTexture = false; } //printf("%08X %d\n",poly->texParam,rasterizerUnit[0].textures.currentNum); polyTexKeys[i] = lastTexKey; } } void SoftRasterizerEngine::performBackfaceTests() { for(int i=0;ipolyAttr); //HACK: backface culling //this should be moved to gfx3d, but first we need to redo the way the lists are built //because it is too convoluted right now. //(must we throw out verts if a poly gets backface culled? if not, then it might be easier) //an older approach //(not good enough for quads and other shapes) //float ab[2], ac[2]; Vector2Copy(ab, verts[1].coord); Vector2Copy(ac, verts[2].coord); Vector2Subtract(ab, verts[0].coord); //Vector2Subtract(ac, verts[0].coord); float cross = Vector2Cross(ab, ac); polyAttr.backfacing = (cross>0); //a better approach // we have to support somewhat non-convex polygons (see NSMB world map 1st screen). // this version should handle those cases better. int n = type - 1; float facing = (verts[0].y + verts[n].y) * (verts[0].x - verts[n].x) + (verts[1].y + verts[0].y) * (verts[1].x - verts[0].x) + (verts[2].y + verts[1].y) * (verts[2].x - verts[1].x); for(int j = 2; j < n; j++) facing += (verts[j+1].y + verts[j].y) * (verts[j+1].x - verts[j].x); polyBackfacing[i] = polyAttr.backfacing = (facing < 0); polyVisible[i] = polyAttr.isVisible(polyAttr.backfacing); } } void _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine) { _HACK_viewer_rasterizerUnit.mainLoop(engine); } static void SoftRastRender() { // Force threads to finish before rendering with new data if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); } } mainSoftRasterizer.polylist = gfx3d.polylist; mainSoftRasterizer.vertlist = gfx3d.vertlist; mainSoftRasterizer.indexlist = &gfx3d.indexlist; mainSoftRasterizer.screen = _screen; mainSoftRasterizer.screenColor = _screenColor; mainSoftRasterizer.width = GFX3D_FRAMEBUFFER_WIDTH; mainSoftRasterizer.height = GFX3D_FRAMEBUFFER_HEIGHT; //setup fog variables (but only if fog is enabled) if(gfx3d.renderState.enableFog) mainSoftRasterizer.updateFogTable(); mainSoftRasterizer.initFramebuffer(GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT, gfx3d.renderState.enableClearImage?true:false); mainSoftRasterizer.updateToonTable(); mainSoftRasterizer.updateFloatColors(); mainSoftRasterizer.performClipping(CommonSettings.GFX3D_HighResolutionInterpolateColor); mainSoftRasterizer.performViewportTransforms(GFX3D_FRAMEBUFFER_WIDTH, GFX3D_FRAMEBUFFER_HEIGHT); mainSoftRasterizer.performBackfaceTests(); mainSoftRasterizer.performCoordAdjustment(true); mainSoftRasterizer.setupTextures(true); softRastHasNewData = true; if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].execute(&execRasterizerUnit, (void *)i); } } else { rasterizerUnit[0].mainLoop(&mainSoftRasterizer); } } static void SoftRastRenderFinish() { if (!softRastHasNewData) { return; } if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); } } TexCache_EvictFrame(); mainSoftRasterizer.framebufferProcess(); // printf("rendered %d of %d polys after backface culling\n",gfx3d.polylist->count-culled,gfx3d.polylist->count); SoftRastConvertFramebuffer(); softRastHasNewData = false; } GPU3DInterface gpu3DRasterize = { "SoftRasterizer", SoftRastInit, SoftRastReset, SoftRastClose, SoftRastRender, SoftRastRenderFinish, SoftRastVramReconfigureSignal }; desmume-0.9.11/src/render3D.h0000755000000000000000000000767112467662066014402 0ustar rootroot/* Copyright (C) 2006-2007 shash Copyright (C) 2007-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef RENDER3D_H #define RENDER3D_H #include "gfx3d.h" #include "types.h" //not using this right now #define CALL_CONVENTION typedef struct Render3DInterface { // The name of the plugin, this name will appear in the plugins list const char * name; //called once when the plugin starts up char (CALL_CONVENTION* NDS_3D_Init) (); //called when the emulator resets (is this necessary?) void (CALL_CONVENTION* NDS_3D_Reset) (); //called when the plugin shuts down void (CALL_CONVENTION* NDS_3D_Close) (); //called when the renderer should do its job and render the current display lists void (CALL_CONVENTION* NDS_3D_Render) (); // Called whenever 3D rendering needs to finish. This function should block the calling thread // and only release the block when 3D rendering is finished. (Before reading the 3D layer, be // sure to always call this function.) void (CALL_CONVENTION* NDS_3D_RenderFinish) (); //called when the emulator reconfigures its vram. you may need to invalidate your texture cache. void (CALL_CONVENTION* NDS_3D_VramReconfigureSignal) (); } GPU3DInterface; extern int cur3DCore; // gpu 3D core list, per port extern GPU3DInterface *core3DList[]; // Default null plugin #define GPU3D_NULL 0 extern GPU3DInterface gpu3DNull; // Extern pointer extern GPU3DInterface *gpu3D; char Default3D_Init(); void Default3D_Reset(); void Default3D_Close(); void Default3D_Render(); void Default3D_RenderFinish(); void Default3D_VramReconfigureSignal(); void NDS_3D_SetDriver (int core3DIndex); bool NDS_3D_ChangeCore(int newCore); enum Render3DErrorCode { RENDER3DERROR_NOERR = 0 }; typedef int Render3DError; class Render3D { protected: CACHE_ALIGN u16 clearImageColor16Buffer[GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT]; CACHE_ALIGN u32 clearImageDepthStencilBuffer[GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT]; virtual Render3DError BeginRender(const GFX3D_State *renderState); virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError PostRender(); virtual Render3DError EndRender(const u64 frameCount); virtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthStencilBuffer); virtual Render3DError UpdateToonTable(const u16 *toonTableBuffer); virtual Render3DError ClearFramebuffer(const GFX3D_State *renderState); virtual Render3DError ClearUsingImage() const; virtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const; virtual Render3DError SetupPolygon(const POLY *thePoly); virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing); virtual Render3DError SetupViewport(const u32 viewportValue); public: Render3D(); virtual Render3DError Reset(); virtual Render3DError Render(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, const u64 frameCount); virtual Render3DError RenderFinish(); virtual Render3DError VramReconfigureSignal(); }; #endif desmume-0.9.11/src/rtc.h0000755000000000000000000000165412467662066013517 0ustar rootroot/* Copyright 2006 yopyop Copyright 2008 CrazyMax Copyright 2008-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef _RTC_H_ #define _RTC_H_ #include #include #include "types.h" #include "utils/datetime.h" DateTime rtcGetTime(void); extern void rtcInit(); extern u16 rtcRead(); extern void rtcWrite(u16 val); #endif desmume-0.9.11/src/NDSSystem.h0000755000000000000000000004055112467662066014557 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008-2015 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef NDSSYSTEM_H #define NDSSYSTEM_H #include #include #include "types.h" class BaseDriver; class CFIRMWARE; class EMUFILE; template struct buttonstruct { union { struct { // changing the order of these fields would break stuff //fRLDUTSBAYXWEg Type G; // debug Type E; // right shoulder Type W; // left shoulder Type X; Type Y; Type A; Type B; Type S; // start Type T; // select Type U; // up Type D; // down Type L; // left Type R; // right Type F; // lid }; Type array[14]; }; }; extern buttonstruct Turbo; extern buttonstruct TurboTime; extern buttonstruct AutoHold; extern volatile bool execute; extern BOOL click; /* * The firmware language values */ #define NDS_FW_LANG_JAP 0 #define NDS_FW_LANG_ENG 1 #define NDS_FW_LANG_FRE 2 #define NDS_FW_LANG_GER 3 #define NDS_FW_LANG_ITA 4 #define NDS_FW_LANG_SPA 5 #define NDS_FW_LANG_CHI 6 #define NDS_FW_LANG_RES 7 extern BaseDriver *driver; extern CFIRMWARE *firmware; #define DSGBA_LOADER_SIZE 512 enum { ROM_NDS = 0, ROM_DSGBA }; //#define LOG_ARM9 //#define LOG_ARM7 #include "PACKED.h" struct NDS_header { char gameTile[12]; // 000 - Game Title (uppercase ASCII, padded with 00h) char gameCode[4]; // 00C - Gamecode (uppercase ASCII, NTR-, 0=homebrew) u16 makerCode; // 010 - Makercode (uppercase ASCII, 0=homebrew) u8 unitCode; // 012 - Unitcode (00h=Nintendo DS) u8 deviceCode; // 013 - Encryption Seed Select (00..07h, usually 00h) u8 cardSize; // 014 - Devicecapacity (Chipsize = 128KB SHL nn) (eg. 7 = 16MB) u8 reserved1[8]; // 015 - Must be set to 0x00 u8 region; // 01D - Specific region: 0x80 - China, 0x40 - Korea, 0x00 - Other u8 romversion; // 01E - ROM Version (usually 00h) u8 autostart; // 01F - Autostart (Bit2: Skip "Press Button" after Health and Safety) // (Also skips bootmenu, even in Manual mode & even Start pressed) u32 ARM9src; // 020 - ARM9 rom_offset (4000h and up, align 1000h) u32 ARM9exe; // 024 - ARM9 entry_address (2000000h..23BFE00h) u32 ARM9cpy; // 028 - ARM9 ram_address (2000000h..23BFE00h) u32 ARM9binSize; // 02C - ARM9 size (max 3BFE00h) (3839.5KB) u32 ARM7src; // 030 - ARM7 rom_offset (8000h and up) u32 ARM7exe; // 034 - ARM7 entry_address (2000000h..23BFE00h, or 37F8000h..3807E00h) u32 ARM7cpy; // 038 - ARM7 ram_address (2000000h..23BFE00h, or 37F8000h..3807E00h) u32 ARM7binSize; // 03C - ARM7 size (max 3BFE00h, or FE00h) (3839.5KB, 63.5KB) u32 FNameTblOff; // 040 - File Name Table (FNT) offset u32 FNameTblSize; // 044 - File Name Table (FNT) size u32 FATOff; // 048 - File Allocation Table (FAT) offset u32 FATSize; // 04C - File Allocation Table (FAT) size u32 ARM9OverlayOff; // 050 - File ARM9 overlay_offset u32 ARM9OverlaySize; // 054 - File ARM9 overlay_size u32 ARM7OverlayOff; // 058 - File ARM7 overlay_offset u32 ARM7OverlaySize; // 05C - File ARM7 overlay_size u32 normalCmd; // 060 - Port 40001A4h setting for normal commands (usually 00586000h) u32 Key1Cmd; // 064 - Port 40001A4h setting for KEY1 commands (usually 001808F8h) u32 IconOff; // 068 - Icon_title_offset (0=None) (8000h and up) u16 CRC16; // 06C - Secure Area Checksum, CRC-16 of [ [20h]..7FFFh] - Calculations with this algorithm use 0xffff as the initial value u16 ROMtimeout; // 06E - Secure Area Loading Timeout (usually 051Eh) u32 ARM9autoload; // 070 - ARM9 Auto Load List RAM Address u32 ARM7autoload; // 074 - ARM7 Auto Load List RAM Address u8 infoResevedRegion[8]; // 078 - ROM Information Reserved Region (must be set to 0x00) u32 endROMoffset; // 080 - Total Used ROM size (remaining/unused bytes usually FFh-padded) u32 HeaderSize; // 084 - ROM Header Size (4000h) u32 ARM9module; // 088 - ARM9 Module Parameter Address (auto-load parameters) u32 ARM7module; // 08C - ARM7 Module Parameter Address (auto-load parameters) u8 reserved2[48]; // 090 - Must be set to 0x00 - "PASS" is contained within here? u8 logo[156]; // 0C0 - Nintendo Logo (compressed bitmap, same as in GBA Headers) u16 logoCRC16; // 15C - Nintendo Logo Checksum, CRC-16 of [0C0h-15Bh], fixed CF56h u16 headerCRC16; // 15E - Header Checksum, CRC-16 of [000h-15Dh] u8 reserved[160]; // Must be set to 0x00 }; #include "PACKED_END.h" extern void debug(); void emu_halt(); extern u64 nds_timer; void NDS_Reschedule(); void NDS_RescheduleGXFIFO(u32 cost); void NDS_RescheduleDMA(); void NDS_RescheduleTimers(); enum ENSATA_HANDSHAKE { ENSATA_HANDSHAKE_none = 0, ENSATA_HANDSHAKE_query = 1, ENSATA_HANDSHAKE_ack = 2, ENSATA_HANDSHAKE_confirm = 3, ENSATA_HANDSHAKE_complete = 4, }; enum NDS_CONSOLE_TYPE { NDS_CONSOLE_TYPE_FAT = 0xFF, NDS_CONSOLE_TYPE_LITE = 0x20, NDS_CONSOLE_TYPE_IQUE = 0x43, NDS_CONSOLE_TYPE_IQUE_LIE = 0x63, NDS_CONSOLE_TYPE_DSI = 0xFE }; struct NDSSystem { s32 wifiCycle; s32 cycles; u64 timerCycle[2][4]; u32 VCount; u32 old; //raw adc touch coords for old NDS u16 adc_touchX; u16 adc_touchY; s32 adc_jitterctr; BOOL stylusJitter; //the DSI returns calibrated touch coords from its TSC (?), so we need to save these separately u16 scr_touchX; u16 scr_touchY; //whether the console is using our faked-bootup process BOOL isFakeBooted; BOOL isTouch; u16 pad; u16 paddle; u8 *FW_ARM9BootCode; u8 *FW_ARM7BootCode; u32 FW_ARM9BootCodeAddr; u32 FW_ARM7BootCodeAddr; u32 FW_ARM9BootCodeSize; u32 FW_ARM7BootCodeSize; BOOL sleeping; BOOL cardEjected; u32 freezeBus; //this is not essential NDS runtime state. //it was perhaps a mistake to put it here. //it is far less important than the above. //maybe I should move it. s32 idleCycles[2]; s32 runCycleCollector[2][16]; s32 idleFrameCounter; s32 cpuloopIterationCount; //counts the number of times during a frame that a reschedule happened //console type must be copied in when the system boots. it can't be changed on the fly. int ConsoleType; bool Is_DSI() { return ConsoleType == NDS_CONSOLE_TYPE_DSI; } bool Is_DebugConsole() { return _DebugConsole!=0; } BOOL _DebugConsole; //set if the user requests ensata emulation BOOL ensataEmulation; //there is a hack in the ipc sync for ensata. this tracks its state u32 ensataIpcSyncCounter; //maintains the state of the ensata handshaking protocol u32 ensataHandshake; struct { u8 lcd, gpuMain, gfx3d_render, gfx3d_geometry, gpuSub, dispswap; } power1; //POWCNT1 struct { u8 speakers, wifi /*(initial value=0)*/; } power2; //POWCNT2 bool isInVblank() const { return VCount >= 192; } bool isIn3dVblank() const { return VCount >= 192 && VCount<215; } }; /** /brief A touchscreen calibration point. */ struct NDS_fw_touchscreen_cal { u16 adc_x; u16 adc_y; u8 screen_x; u8 screen_y; }; #define MAX_FW_NICKNAME_LENGTH 10 #define MAX_FW_MESSAGE_LENGTH 26 struct NDS_fw_config_data { NDS_CONSOLE_TYPE ds_type; u8 fav_colour; u8 birth_month; u8 birth_day; u16 nickname[MAX_FW_NICKNAME_LENGTH]; u8 nickname_len; u16 message[MAX_FW_MESSAGE_LENGTH]; u8 message_len; u8 language; //touchscreen calibration NDS_fw_touchscreen_cal touch_cal[2]; }; extern NDSSystem nds; int NDS_Init(); void Desmume_InitOnce(); void NDS_DeInit(void); BOOL NDS_SetROM(u8 * rom, u32 mask); NDS_header * NDS_getROMHeader(void); struct RomBanner { RomBanner(bool defaultInit = true); u16 version; //Version (0001h) u16 crc16; //CRC16 across entries 020h..83Fh u8 reserved[0x1C]; //Reserved (zero-filled) u8 bitmap[0x200]; //Icon Bitmap (32x32 pix) (4x4 tiles, each 4x8 bytes, 4bit depth) u16 palette[0x10]; //Icon Palette (16 colors, 16bit, range 0000h-7FFFh) (Color 0 is transparent, so the 1st palette entry is ignored) enum { NUM_TITLES = 6 }; union { struct { u16 title_jp[0x80]; //Title 0 Japanese (128 characters, 16bit Unicode) u16 title_en[0x80]; //Title 1 English ("") u16 title_fr[0x80]; //Title 2 French ("") u16 title_de[0x80]; //Title 3 German ("") u16 title_it[0x80]; //Title 4 Italian ("") u16 title_es[0x80]; //Title 5 Spanish ("") }; u16 titles[NUM_TITLES][0x80]; }; u8 end0xFF[0x1C0]; //840h ? (Maybe newer/chinese firmware do also support chinese title?) //840h - End of Icon/Title structure (next 1C0h bytes usually FFh-filled) }; struct GameInfo { FILE *fROM; u8 *romdata; u32 romsize; u32 cardSize; u32 mask; u32 crc; u32 chipID; u32 lastReadPos; u32 romType; u32 headerOffset; char ROMserial[20]; char ROMname[20]; bool _isDSiEnhanced; NDS_header header; //a copy of the pristine secure area from the rom u8 secureArea[0x4000]; RomBanner banner; const RomBanner& getRomBanner(); GameInfo() : fROM(NULL), romdata(NULL), crc(0), chipID(0x00000FC2), romsize(0), cardSize(0), mask(0), lastReadPos(0xFFFFFFFF), romType(ROM_NDS), headerOffset(0), _isDSiEnhanced(false) { memset(&header, 0, sizeof(header)); memset(&ROMserial[0], 0, sizeof(ROMserial)); memset(&ROMname[0], 0, sizeof(ROMname)); } ~GameInfo() { closeROM(); } bool loadROM(std::string fname, u32 type = ROM_NDS); void closeROM(); u32 readROM(u32 pos); void populate(); bool isDSiEnhanced(); bool isHomebrew(); bool hasRomBanner(); }; typedef struct TSCalInfo { struct { u16 x1, x2; u16 y1, y2; u16 width; u16 height; } adc; struct { u8 x1, x2; u8 y1, y2; u16 width; u16 height; } scr; } TSCalInfo; extern GameInfo gameInfo; struct UserButtons : buttonstruct { }; struct UserTouch { u16 touchX; u16 touchY; bool isTouch; }; struct UserMicrophone { u32 micButtonPressed; }; struct UserInput { UserButtons buttons; UserTouch touch; UserMicrophone mic; }; // set physical user input // these functions merely request the input to be changed. // the actual change happens later at a specific time during the frame. // this is to minimize the risk of desyncs. void NDS_setTouchPos(u16 x, u16 y); void NDS_releaseTouch(void); void NDS_setPad(bool right,bool left,bool down,bool up,bool select,bool start,bool B,bool A,bool Y,bool X,bool leftShoulder,bool rightShoulder,bool debug, bool lid); void NDS_setMic(bool pressed); // get physical user input // not including the results of autofire/etc. // the effects of calls to "set physical user input" functions will be immediately reflected here though. const UserInput& NDS_getRawUserInput(); const UserInput& NDS_getPrevRawUserInput(); // get final (fully processed) user input // this should match whatever was or would be sent to the game const UserInput& NDS_getFinalUserInput(); // set/get to-be-processed or in-the-middle-of-being-processed user input // to process input, simply call this function and edit the return value. // (applying autofire is one example of processing the input.) // (movie playback is another example.) // this must be done after the raw user input is set // and before that input is sent to the game's memory. UserInput& NDS_getProcessingUserInput(); bool NDS_isProcessingUserInput(); // call once per frame to prepare input for processing void NDS_beginProcessingInput(); // call once per frame to copy the processed input to the final input void NDS_endProcessingInput(); // this is in case something needs reentrancy while processing input void NDS_suspendProcessingInput(bool suspend); int NDS_LoadROM(const char *filename, const char* physicalFilename=0, const char* logicalFilename=0); void NDS_FreeROM(void); void NDS_Reset(); bool NDS_LegitBoot(); bool NDS_FakeBoot(); void nds_savestate(EMUFILE* os); bool nds_loadstate(EMUFILE* is, int size); void NDS_Sleep(); void NDS_TriggerCardEjectIRQ(); void NDS_SkipNextFrame(); #define NDS_SkipFrame(s) if(s) NDS_SkipNext2DFrame(); void NDS_OmitFrameSkip(int force=0); void NDS_debug_break(); void NDS_debug_continue(); void NDS_debug_step(); int NDS_GetCPUCoreCount(); void NDS_SetupDefaultFirmware(); //void execHardware_doAllDma(EDMAMode modeNum); template void NDS_exec(s32 nb = 560190<<1); extern int lagframecounter; extern struct TCommonSettings { TCommonSettings() : GFX3D_HighResolutionInterpolateColor(true) , GFX3D_EdgeMark(true) , GFX3D_Fog(true) , GFX3D_Texture(true) , GFX3D_LineHack(true) , GFX3D_Zelda_Shadow_Depth_Hack(0) , GFX3D_Renderer_Multisample(false) , GFX3D_TXTHack(false) , jit_max_block_size(100) , loadToMemory(false) , UseExtBIOS(false) , SWIFromBIOS(false) , PatchSWI3(false) , UseExtFirmware(false) , UseExtFirmwareSettings(false) , BootFromFirmware(false) , DebugConsole(false) , EnsataEmulation(false) , cheatsDisable(false) , rigorous_timing(false) , advanced_timing(true) , micMode(InternalNoise) , spuInterpolationMode(1) , manualBackupType(0) , autodetectBackupMethod(0) , spu_captureMuted(false) , spu_advanced(false) , StylusPressure(50) , ConsoleType(NDS_CONSOLE_TYPE_FAT) , StylusJitter(false) , backupSave(false) , SPU_sync_mode(0) , SPU_sync_method(0) { strcpy(ARM9BIOS, "biosnds9.bin"); strcpy(ARM7BIOS, "biosnds7.bin"); strcpy(Firmware, "firmware.bin"); /* WIFI mode: adhoc = 0, infrastructure = 1 */ wifi.mode = 1; wifi.infraBridgeAdapter = 0; for(int i=0;i<16;i++) spu_muteChannels[i] = false; for(int g=0;g<2;g++) for(int x=0;x<5;x++) dispLayers[g][x]=true; #ifdef HAVE_JIT //zero 06-sep-2012 - shouldnt be defaulting this to true for now, since the jit is buggy. //id rather have people discover a bonus speedhack than discover new bugs in a new version use_jit = false; #else use_jit = false; #endif num_cores = NDS_GetCPUCoreCount(); NDS_SetupDefaultFirmware(); } bool GFX3D_HighResolutionInterpolateColor; bool GFX3D_EdgeMark; bool GFX3D_Fog; bool GFX3D_Texture; bool GFX3D_LineHack; int GFX3D_Zelda_Shadow_Depth_Hack; bool GFX3D_Renderer_Multisample; bool GFX3D_TXTHack; bool loadToMemory; bool UseExtBIOS; char ARM9BIOS[256]; char ARM7BIOS[256]; bool SWIFromBIOS; bool PatchSWI3; bool UseExtFirmware; bool UseExtFirmwareSettings; char Firmware[256]; bool BootFromFirmware; NDS_fw_config_data fw_config; NDS_CONSOLE_TYPE ConsoleType; bool DebugConsole; bool EnsataEmulation; bool cheatsDisable; int num_cores; bool single_core() { return num_cores==1; } bool rigorous_timing; int StylusPressure; bool StylusJitter; bool dispLayers[2][5]; FAST_ALIGN bool advanced_timing; bool use_jit; u32 jit_max_block_size; struct _Wifi { int mode; int infraBridgeAdapter; } wifi; enum MicMode { InternalNoise = 0, Sample = 1, Random = 2, Physical = 3, } micMode; int spuInterpolationMode; //this is a temporary hack until we straighten out the flushing logic and/or gxfifo //int gfx3d_flushMode; int autodetectBackupMethod; //this is the user's choice of manual backup type, for cases when the autodetection can't be trusted int manualBackupType; bool backupSave; int SPU_sync_mode; int SPU_sync_method; bool spu_muteChannels[16]; bool spu_captureMuted; bool spu_advanced; struct _ShowGpu { _ShowGpu() : main(true), sub(true) {} union { struct { bool main,sub; }; bool screens[2]; }; } showGpu; struct _Hud { _Hud() : ShowInputDisplay(false) , ShowGraphicalInputDisplay(false) , FpsDisplay(false) , FrameCounterDisplay(false) , ShowLagFrameCounter(false) , ShowMicrophone(false) , ShowRTC(false) {} bool ShowInputDisplay, ShowGraphicalInputDisplay, FpsDisplay, FrameCounterDisplay, ShowLagFrameCounter, ShowMicrophone, ShowRTC; } hud; std::string run_advanscene_import; } CommonSettings; void NDS_RunAdvansceneAutoImport(); extern std::string InputDisplayString; extern int LagFrameFlag; extern int lastLag, TotalLagFrames; void MovieSRAM(); void ClearAutoHold(void); bool ValidateSlot2Access(u32 procnum, u32 demandSRAMSpeed, u32 demand1stROMSpeed, u32 demand2ndROMSpeed, int clockbits); //MUSTANG //extern ADVANsCEne advsc; #endif desmume-0.9.11/src/emufile.h0000755000000000000000000001742212467662066014355 0ustar rootroot/* The MIT License Copyright (C) 2009-2015 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //don't use emufile for files bigger than 2GB! you have been warned! some day this will be fixed. #ifndef EMUFILE_H #define EMUFILE_H #include #include #include #include #include #include #include #include "emufile_types.h" #ifdef HOST_WINDOWS #include #else #include #endif class EMUFILE_MEMORY; class EMUFILE { protected: bool failbit; public: EMUFILE() : failbit(false) {} //returns a new EMUFILE which is guranteed to be in memory. the EMUFILE you call this on may be deleted. use the returned EMUFILE in its place virtual EMUFILE* memwrap() = 0; virtual ~EMUFILE() {} static bool readAllBytes(std::vector* buf, const std::string& fname); bool fail(bool unset=false) { bool ret = failbit; if(unset) unfail(); return ret; } void unfail() { failbit=false; } bool eof() { return size()==ftell(); } size_t fread(const void *ptr, size_t bytes){ return _fread(ptr,bytes); } void unget() { fseek(-1,SEEK_CUR); } //virtuals public: virtual FILE *get_fp() = 0; virtual int fprintf(const char *format, ...) = 0; virtual int fgetc() = 0; virtual int fputc(int c) = 0; virtual size_t _fread(const void *ptr, size_t bytes) = 0; virtual size_t fwrite(const void *ptr, size_t bytes) = 0; void write64le(u64* val); void write64le(u64 val); size_t read64le(u64* val); u64 read64le(); void write32le(u32* val); void write32le(s32* val) { write32le((u32*)val); } void write32le(u32 val); size_t read32le(u32* val); size_t read32le(s32* val); u32 read32le(); void write16le(u16* val); void write16le(s16* val) { write16le((u16*)val); } void write16le(u16 val); size_t read16le(s16* Bufo); size_t read16le(u16* val); u16 read16le(); void write8le(u8* val); void write8le(u8 val); size_t read8le(u8* val); u8 read8le(); void writedouble(double* val); void writedouble(double val); double readdouble(); size_t readdouble(double* val); virtual int fseek(int offset, int origin) = 0; virtual int ftell() = 0; virtual int size() = 0; virtual void fflush() = 0; virtual void truncate(s32 length) = 0; void writeMemoryStream(EMUFILE_MEMORY* ms); void readMemoryStream(EMUFILE_MEMORY* ms); }; //todo - handle read-only specially? class EMUFILE_MEMORY : public EMUFILE { protected: std::vector *vec; bool ownvec; s32 pos, len; void reserve(u32 amt) { if(vec->size() < amt) vec->resize(amt); } public: EMUFILE_MEMORY(std::vector *underlying) : vec(underlying), ownvec(false), pos(0), len((s32)underlying->size()) { } EMUFILE_MEMORY(u32 preallocate) : vec(new std::vector()), ownvec(true), pos(0), len(0) { vec->resize(preallocate); len = preallocate; } EMUFILE_MEMORY() : vec(new std::vector()), ownvec(true), pos(0), len(0) { vec->reserve(1024); } EMUFILE_MEMORY(void* buf, s32 size) : vec(new std::vector()), ownvec(true), pos(0), len(size) { vec->resize(size); if(size != 0) memcpy(&vec->front(),buf,size); } ~EMUFILE_MEMORY() { if(ownvec) delete vec; } virtual EMUFILE* memwrap(); virtual void truncate(s32 length) { vec->resize(length); len = length; if(pos>length) pos=length; } u8* buf() { if(size()==0) reserve(1); return &(*vec)[0]; } std::vector* get_vec() const { return vec; }; virtual FILE *get_fp() { return NULL; } virtual int fprintf(const char *format, ...) { va_list argptr; va_start(argptr, format); //we dont generate straight into the buffer because it will null terminate (one more byte than we want) int amt = vsnprintf(0,0,format,argptr); char* tempbuf = new char[amt+1]; va_end(argptr); va_start(argptr, format); vsprintf(tempbuf,format,argptr); fwrite(tempbuf,amt); delete[] tempbuf; va_end(argptr); return amt; }; virtual int fgetc() { u8 temp; //need an optimized codepath //if(_fread(&temp,1) != 1) // return EOF; //else return temp; u32 remain = len-pos; if(remain<1) { failbit = true; return -1; } temp = buf()[pos]; pos++; return temp; } virtual int fputc(int c) { u8 temp = (u8)c; //TODO //if(fwrite(&temp,1)!=1) return EOF; fwrite(&temp,1); return 0; } virtual size_t _fread(const void *ptr, size_t bytes); virtual size_t fwrite(const void *ptr, size_t bytes){ reserve(pos+(s32)bytes); memcpy(buf()+pos,ptr,bytes); pos += (s32)bytes; len = std::max(pos,len); return bytes; } virtual int fseek(int offset, int origin){ //work differently for read-only...? switch(origin) { case SEEK_SET: pos = offset; break; case SEEK_CUR: pos += offset; break; case SEEK_END: pos = size()+offset; break; default: assert(false); } reserve(pos); return 0; } virtual int ftell() { return pos; } virtual void fflush() {} void trim() { vec->resize(len); } virtual int size() { return (int)len; } }; class EMUFILE_FILE : public EMUFILE { protected: FILE* fp; std::string fname; char mode[16]; long mFilePosition; bool mPositionCacheEnabled; enum eCondition { eCondition_Clean, eCondition_Unknown, eCondition_Read, eCondition_Write } mCondition; private: void open(const char* fname, const char* mode) { mPositionCacheEnabled = false; mCondition = eCondition_Clean; fp = fopen(fname,mode); if(!fp) failbit = true; this->fname = fname; strcpy(this->mode,mode); } public: EMUFILE_FILE(const std::string& fname, const char* mode) { open(fname.c_str(),mode); } EMUFILE_FILE(const char* fname, const char* mode) { open(fname,mode); } void EnablePositionCache(); virtual ~EMUFILE_FILE() { if(NULL != fp) fclose(fp); } virtual FILE *get_fp() { return fp; } virtual EMUFILE* memwrap(); bool is_open() { return fp != NULL; } void DemandCondition(eCondition cond); virtual void truncate(s32 length); virtual int fprintf(const char *format, ...) { va_list argptr; va_start(argptr, format); int ret = ::vfprintf(fp, format, argptr); va_end(argptr); return ret; }; virtual int fgetc() { return ::fgetc(fp); } virtual int fputc(int c) { return ::fputc(c, fp); } virtual size_t _fread(const void *ptr, size_t bytes); virtual size_t fwrite(const void *ptr, size_t bytes); virtual int fseek(int offset, int origin); virtual int ftell(); virtual int size() { int oldpos = ftell(); fseek(0,SEEK_END); int len = ftell(); fseek(oldpos,SEEK_SET); return len; } virtual void fflush() { ::fflush(fp); } }; #endif desmume-0.9.11/src/registers.h0000755000000000000000000004716112467662066014741 0ustar rootroot/* Copyright (C) 2006 Theo Berkau Copyright (C) 2006-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef REGISTERS_H #define REGISTERS_H #define REG_REGION_MASK 0x0FFFEF80 #define REG_BASE_DISPx 0x04000000 #define REG_BASE_DISPA 0x04000000 #define REG_BASE_DISPB 0x04001000 #define REG_BASE_DMA 0x04000080 #define REG_BASE_SIORTCTIMERS 0x04000100 #define REG_BASE_ROMIPC 0x04000180 #define REG_BASE_MEMIRQ 0x04000200 #define REG_BASE_MATH 0x04000280 #define REG_BASE_OTHER 0x04000300 #define REG_BASE_RCVPORTS 0x04100000 // Display Engine A #define REG_DISPA_DISPCNT 0x04000000 #define REG_DISPA_VCOUNT 0x04000006 #define REG_DISPA_BG0CNT 0x04000008 #define REG_DISPA_BG1CNT 0x0400000A #define REG_DISPA_BG2CNT 0x0400000C #define REG_DISPA_BG3CNT 0x0400000E #define REG_DISPA_BG0HOFS 0x04000010 #define REG_DISPA_BG0VOFS 0x04000012 #define REG_DISPA_BG1HOFS 0x04000014 #define REG_DISPA_BG1VOFS 0x04000016 #define REG_DISPA_BG2HOFS 0x04000018 #define REG_DISPA_BG2VOFS 0x0400001A #define REG_DISPA_BG3HOFS 0x0400001C #define REG_DISPA_BG3VOFS 0x0400001E #define REG_DISPA_BG2PA 0x04000020 #define REG_DISPA_BG2PB 0x04000022 #define REG_DISPA_BG2PC 0x04000024 #define REG_DISPA_BG2PD 0x04000026 #define REG_DISPA_BG2XL 0x04000028 #define REG_DISPA_BG2XH 0x0400002A #define REG_DISPA_BG2YL 0x0400002C #define REG_DISPA_BG2YH 0x0400002E #define REG_DISPA_BG3PA 0x04000030 #define REG_DISPA_BG3PB 0x04000032 #define REG_DISPA_BG3PC 0x04000034 #define REG_DISPA_BG3PD 0x04000036 #define REG_DISPA_BG3XL 0x04000038 #define REG_DISPA_BG3XH 0x0400003A #define REG_DISPA_BG3YL 0x0400003C #define REG_DISPA_BG3YH 0x0400003E #define REG_DISPA_WIN0H 0x04000040 #define REG_DISPA_WIN1H 0x04000042 #define REG_DISPA_WIN0V 0x04000044 #define REG_DISPA_WIN1V 0x04000046 #define REG_DISPA_WININ 0x04000048 #define REG_DISPA_WINOUT 0x0400004A #define REG_DISPA_MOSAIC 0x0400004C #define REG_DISPA_BLDCNT 0x04000050 #define REG_DISPA_BLDALPHA 0x04000052 #define REG_DISPA_BLDY 0x04000054 #define REG_DISPA_MASTERBRIGHT 0x0400006C // DMA #define _REG_DMA_CONTROL_MIN 0x040000B0 #define REG_DMA0SAD 0x040000B0 #define REG_DMA0SADL 0x040000B0 #define REG_DMA0SADH 0x040000B2 #define REG_DMA0DAD 0x040000B4 #define REG_DMA0DADL 0x040000B4 #define REG_DMA0DADH 0x040000B6 #define REG_DMA0CNTL 0x040000B8 #define REG_DMA0CNTH 0x040000BA #define REG_DMA1SAD 0x040000BC #define REG_DMA1SADL 0x040000BC #define REG_DMA1SADH 0x040000BE #define REG_DMA1DAD 0x040000C0 #define REG_DMA1DADL 0x040000C0 #define REG_DMA1DADH 0x040000C2 #define REG_DMA1CNTL 0x040000C4 #define REG_DMA1CNTH 0x040000C6 #define REG_DMA2SAD 0x040000C8 #define REG_DMA2SADL 0x040000C8 #define REG_DMA2SADH 0x040000CA #define REG_DMA2DAD 0x040000CC #define REG_DMA2DADL 0x040000CC #define REG_DMA2DADH 0x040000CE #define REG_DMA2CNTL 0x040000D0 #define REG_DMA2CNTH 0x040000D2 #define REG_DMA3SAD 0x040000D4 #define REG_DMA3SADL 0x040000D4 #define REG_DMA3SADH 0x040000D6 #define REG_DMA3DAD 0x040000D8 #define REG_DMA3DADL 0x040000D8 #define REG_DMA3DADH 0x040000DA #define REG_DMA3CNTL 0x040000DC #define REG_DMA3CNTH 0x040000DE #define _REG_DMA_CONTROL_MAX 0x040000DF #define REG_DMA0FILL 0x040000E0 #define REG_DMA1FILL 0x040000E4 #define REG_DMA2FILL 0x040000E8 #define REG_DMA3FILL 0x040000EC // Timers #define REG_TM0CNTL 0x04000100 #define REG_TM0CNTH 0x04000102 #define REG_TM1CNTL 0x04000104 #define REG_TM1CNTH 0x04000106 #define REG_TM2CNTL 0x04000108 #define REG_TM2CNTH 0x0400010A #define REG_TM3CNTL 0x0400010C #define REG_TM3CNTH 0x0400010E // SIO/Keypad Input/RTC #define REG_SIODATA32 0x04000120 #define REG_SIOCNT 0x04000128 #define REG_KEYINPUT 0x04000130 #define REG_KEYCNT 0x04000132 #define REG_RCNT 0x04000134 #define REG_EXTKEYIN 0x04000136 #define REG_RTC 0x04000138 // IPC #define REG_IPCSYNC 0x04000180 #define REG_IPCFIFOCNT 0x04000184 #define REG_IPCFIFOSEND 0x04000188 // ROM #define REG_AUXSPICNT 0x040001A0 #define REG_AUXSPIDATA 0x040001A2 #define REG_GCROMCTRL 0x040001A4 #define REG_GCCMDOUT 0x040001A8 #define REG_ENCSEED0L 0x040001B0 #define REG_ENCSEED1L 0x040001B4 #define REG_ENCSEED0H 0x040001B8 #define REG_ENCSEED1H 0x040001BA #define REG_SPICNT 0x040001C0 #define REG_SPIDATA 0x040001C2 // Memory/IRQ #define REG_EXMEMCNT 0x04000204 #define REG_WIFIWAITCNT 0x04000206 #define REG_IME 0x04000208 #define REG_IE 0x04000210 #define REG_IF 0x04000214 #define REG_VRAMCNTA 0x04000240 #define REG_VRAMSTAT 0x04000240 #define REG_VRAMCNTB 0x04000241 #define REG_WRAMSTAT 0x04000241 #define REG_VRAMCNTC 0x04000242 #define REG_VRAMCNTD 0x04000243 #define REG_VRAMCNTE 0x04000244 #define REG_VRAMCNTF 0x04000245 #define REG_VRAMCNTG 0x04000246 #define REG_WRAMCNT 0x04000247 #define REG_VRAMCNTH 0x04000248 #define REG_VRAMCNTI 0x04000249 // Math #define REG_DIVCNT 0x04000280 #define REG_DIVNUMER 0x04000290 #define REG_DIVDENOM 0x04000298 #define REG_DIVRESULT 0x040002A0 #define REG_DIVREMRESULT 0x040002A8 #define REG_SQRTCNT 0x040002B0 #define REG_SQRTRESULT 0x040002B4 #define REG_SQRTPARAM 0x040002B8 // Other #define REG_POSTFLG 0x04000300 #define REG_HALTCNT 0x04000301 #define REG_POWCNT1 0x04000304 #define REG_POWCNT2 0x04000304 #define REG_BIOSPROT 0x04000308 #define REG_DISPB_DISPCNT 0x04001000 #define REG_DISPB_BG0CNT 0x04001008 #define REG_DISPB_BG1CNT 0x0400100A #define REG_DISPB_BG2CNT 0x0400100C #define REG_DISPB_BG3CNT 0x0400100E #define REG_DISPB_BG0HOFS 0x04001010 #define REG_DISPB_BG0VOFS 0x04001012 #define REG_DISPB_BG1HOFS 0x04001014 #define REG_DISPB_BG1VOFS 0x04001016 #define REG_DISPB_BG2HOFS 0x04001018 #define REG_DISPB_BG2VOFS 0x0400101A #define REG_DISPB_BG3HOFS 0x0400101C #define REG_DISPB_BG3VOFS 0x0400101E #define REG_DISPB_BG2PA 0x04001020 #define REG_DISPB_BG2PB 0x04001022 #define REG_DISPB_BG2PC 0x04001024 #define REG_DISPB_BG2PD 0x04001026 #define REG_DISPB_BG2XL 0x04001028 #define REG_DISPB_BG2XH 0x0400102A #define REG_DISPB_BG2YL 0x0400102C #define REG_DISPB_BG2YH 0x0400102E #define REG_DISPB_BG3PA 0x04001030 #define REG_DISPB_BG3PB 0x04001032 #define REG_DISPB_BG3PC 0x04001034 #define REG_DISPB_BG3PD 0x04001036 #define REG_DISPB_BG3XL 0x04001038 #define REG_DISPB_BG3XH 0x0400103A #define REG_DISPB_BG3YL 0x0400103C #define REG_DISPB_BG3YH 0x0400103E #define REG_DISPB_WIN0H 0x04001040 #define REG_DISPB_WIN1H 0x04001042 #define REG_DISPB_WIN0V 0x04001044 #define REG_DISPB_WIN1V 0x04001046 #define REG_DISPB_WININ 0x04001048 #define REG_DISPB_WINOUT 0x0400104A #define REG_DISPB_MOSAIC 0x0400104C #define REG_DISPB_BLDCNT 0x04001050 #define REG_DISPB_BLDALPHA 0x04001052 #define REG_DISPB_BLDY 0x04001054 #define REG_DISPB_MASTERBRIGHT 0x0400106C // Receive ports #define REG_IPCFIFORECV 0x04100000 #define REG_GCDATAIN 0x04100010 #define REG_DISPB 0x00001000 // core A and B specific #define REG_DISPx_DISPCNT 0x04000000 #define REG_DISPx_VCOUNT 0x04000006 #define REG_DISPx_BG0CNT 0x04000008 #define REG_DISPx_BG1CNT 0x0400000A #define REG_DISPx_BG2CNT 0x0400000C #define REG_DISPx_BG3CNT 0x0400000E #define REG_DISPx_BG0HOFS 0x04000010 #define REG_DISPx_BG0VOFS 0x04000012 #define REG_DISPx_BG1HOFS 0x04000014 #define REG_DISPx_BG1VOFS 0x04000016 #define REG_DISPx_BG2HOFS 0x04000018 #define REG_DISPx_BG2VOFS 0x0400001A #define REG_DISPx_BG3HOFS 0x0400001C #define REG_DISPx_BG3VOFS 0x0400001E #define REG_DISPx_BG2PA 0x04000020 #define REG_DISPx_BG2PB 0x04000022 #define REG_DISPx_BG2PC 0x04000024 #define REG_DISPx_BG2PD 0x04000026 #define REG_DISPx_BG2XL 0x04000028 #define REG_DISPx_BG2XH 0x0400002A #define REG_DISPx_BG2YL 0x0400002C #define REG_DISPx_BG2YH 0x0400002E #define REG_DISPx_BG3PA 0x04000030 #define REG_DISPx_BG3PB 0x04000032 #define REG_DISPx_BG3PC 0x04000034 #define REG_DISPx_BG3PD 0x04000036 #define REG_DISPx_BG3XL 0x04000038 #define REG_DISPx_BG3XH 0x0400003A #define REG_DISPx_BG3YL 0x0400003C #define REG_DISPx_BG3YH 0x0400003E #define REG_DISPx_WIN0H 0x04000040 #define REG_DISPx_WIN1H 0x04000042 #define REG_DISPx_WIN0V 0x04000044 #define REG_DISPx_WIN1V 0x04000046 #define REG_DISPx_WININ 0x04000048 #define REG_DISPx_WINOUT 0x0400004A #define REG_DISPx_MOSAIC 0x0400004C #define REG_DISPx_BLDCNT 0x04000050 #define REG_DISPx_BLDALPHA 0x04000052 #define REG_DISPx_BLDY 0x04000054 #define REG_DISPx_MASTERBRIGHT 0x0400006C // core A specific #define REG_DISPA_DISPSTAT 0x04000004 #define REG_DISPA_DISP3DCNT 0x04000060 #define REG_DISPA_DISPCAPCNT 0x04000064 #define REG_DISPA_DISPMMEMFIFO 0x04000068 #define REG_DISPA_DISP3DCNT_BIT_RDLINES_UNDERFLOW 0x1000 #define REG_DISPA_DISP3DCNT_BIT_RAM_OVERFLOW 0x2000 #define REG_DISPA_DISP3DCNT_BITS_ACK (REG_DISPA_DISP3DCNT_BIT_RDLINES_UNDERFLOW|REG_DISPA_DISP3DCNT_BIT_RAM_OVERFLOW) #define eng_3D_RDLINES_COUNT 0x04000320 #define eng_3D_EDGE_COLOR 0x04000330 #define eng_3D_ALPHA_TEST_REF 0x04000340 #define eng_3D_CLEAR_COLOR 0x04000350 #define eng_3D_CLEAR_DEPTH 0x04000354 #define eng_3D_CLRIMAGE_OFFSET 0x04000356 #define eng_3D_FOG_COLOR 0x04000358 #define eng_3D_FOG_OFFSET 0x0400035C #define eng_3D_FOG_TABLE 0x04000360 #define eng_3D_TOON_TABLE 0x04000380 #define eng_3D_GXFIFO 0x04000400 // 3d commands #define cmd_3D_MTX_MODE 0x04000440 #define cmd_3D_MTX_PUSH 0x04000444 #define cmd_3D_MTX_POP 0x04000448 #define cmd_3D_MTX_STORE 0x0400044C #define cmd_3D_MTX_RESTORE 0x04000450 #define cmd_3D_MTX_IDENTITY 0x04000454 #define cmd_3D_MTX_LOAD_4x4 0x04000458 #define cmd_3D_MTX_LOAD_4x3 0x0400045C #define cmd_3D_MTX_MULT_4x4 0x04000460 #define cmd_3D_MTX_MULT_4x3 0x04000464 #define cmd_3D_MTX_MULT_3x3 0x04000468 #define cmd_3D_MTX_SCALE 0x0400046C #define cmd_3D_MTX_TRANS 0x04000470 #define cmd_3D_COLOR 0x04000480 #define cmd_3D_NORMA 0x04000484 #define cmd_3D_TEXCOORD 0x04000488 #define cmd_3D_VTX_16 0x0400048C #define cmd_3D_VTX_10 0x04000490 #define cmd_3D_VTX_XY 0x04000494 #define cmd_3D_VTX_XZ 0x04000498 #define cmd_3D_VTX_YZ 0x0400049C #define cmd_3D_VTX_DIFF 0x040004A0 #define cmd_3D_POLYGON_ATTR 0x040004A4 #define cmd_3D_TEXIMAGE_PARAM 0x040004A8 #define cmd_3D_PLTT_BASE 0x040004AC #define cmd_3D_DIF_AMB 0x040004C0 #define cmd_3D_SPE_EMI 0x040004C4 #define cmd_3D_LIGHT_VECTOR 0x040004C8 #define cmd_3D_LIGHT_COLOR 0x040004CC #define cmd_3D_SHININESS 0x040004D0 #define cmd_3D_BEGIN_VTXS 0x04000500 #define cmd_3D_END_VTXS 0x04000504 #define cmd_3D_SWAP_BUFFERS 0x04000540 #define cmd_3D_VIEWPORT 0x04000580 #define cmd_3D_BOX_TEST 0x040005C0 #define cmd_3D_POS_TEST 0x040005C4 #define cmd_3D_VEC_TEST 0x040005C8 #define eng_3D_GXSTAT 0x04000600 #define eng_3D_RAM_COUNT 0x04000604 #define eng_3D_DISP_1DOT_DEPTH 0x04000610 #define eng_3D_POS_RESULT 0x04000620 #define eng_3D_VEC_RESULT 0x04000630 #define eng_3D_CLIPMTX_RESULT 0x04000640 #define eng_3D_VECMTX_RESULT 0x04000680 //DSI #define REG_DSIMODE 0x04004000 #define IPCFIFOCNT_SENDEMPTY 0x0001 #define IPCFIFOCNT_SENDFULL 0x0002 #define IPCFIFOCNT_SENDIRQEN 0x0004 #define IPCFIFOCNT_SENDCLEAR 0x0008 #define IPCFIFOCNT_RECVEMPTY 0x0100 #define IPCFIFOCNT_RECVFULL 0x0200 #define IPCFIFOCNT_RECVIRQEN 0x0400 #define IPCFIFOCNT_FIFOERROR 0x4000 #define IPCFIFOCNT_FIFOENABLE 0x8000 #define IPCFIFOCNT_WRITEABLE (IPCFIFOCNT_SENDIRQEN | IPCFIFOCNT_RECVIRQEN | IPCFIFOCNT_FIFOENABLE) #define IPCSYNC_IRQ_SEND 0x2000 #define IPCSYNC_IRQ_RECV 0x4000 #define IRQ_BIT_LCD_VBLANK 0 #define IRQ_BIT_LCD_HBLANK 1 #define IRQ_BIT_LCD_VMATCH 2 #define IRQ_BIT_TIMER_0 3 #define IRQ_BIT_TIMER_1 4 #define IRQ_BIT_TIMER_2 5 #define IRQ_BIT_TIMER_3 6 #define IRQ_BIT_ARM7_SIO 7 #define IRQ_BIT_DMA_0 8 #define IRQ_BIT_DMA_2 9 #define IRQ_BIT_DMA_3 10 #define IRQ_BIT_DMA_4 11 #define IRQ_BIT_KEYPAD 12 #define IRQ_BIT_GAMEPAK 13 #define IRQ_BIT_IPCSYNC 16 #define IRQ_BIT_IPCFIFO_SENDEMPTY 17 #define IRQ_BIT_IPCFIFO_RECVNONEMPTY 18 #define IRQ_BIT_GC_TRANSFER_COMPLETE 19 #define IRQ_BIT_GC_IREQ_MC 20 #define IRQ_BIT_ARM9_GXFIFO 21 #define IRQ_BIT_ARM7_FOLD 22 #define IRQ_BIT_ARM7_SPI 23 #define IRQ_BIT_ARM7_WIFI 24 #define IRQ_MASK_LCD_VBLANK (1<<0) #define IRQ_MASK_LCD_HBLANK (1<<1) #define IRQ_MASK_LCD_VMATCH (1<<2) #define IRQ_MASK_TIMER_0 (1<<3) #define IRQ_MASK_TIMER_1 (1<<4) #define IRQ_MASK_TIMER_2 (1<<5) #define IRQ_MASK_TIMER_3 (1<<6) #define IRQ_MASK_ARM7_SIO (1<<7) #define IRQ_MASK_DMA_0 (1<<8) #define IRQ_MASK_DMA_2 (1<<9) #define IRQ_MASK_DMA_3 (1<<10) #define IRQ_MASK_DMA_4 (1<<11) #define IRQ_MASK_KEYPAD (1<<12) #define IRQ_MASK_GAMEPAK (1<<13) #define IRQ_MASK_IPCSYNC (1<<16) #define IRQ_MASK_IPCFIFO_SENDEMPTY (1<<17) #define IRQ_MASK_IPCFIFO_RECVNONEMPTY (1<<18) #define IRQ_MASK_GC_TRANSFER_COMPLETE (1<<19) #define IRQ_MASK_GC_IREQ_MC (1<<20) #define IRQ_MASK_ARM9_GXFIFO (1<<21) #define IRQ_MASK_ARM7_FOLD (1<<22) #define IRQ_MASK_ARM7_SPI (1<<23) #define IRQ_MASK_ARM7_WIFI (1<<24) #define TSC_MEASURE_TEMP1 0 #define TSC_MEASURE_Y 1 #define TSC_MEASURE_BATTERY 2 #define TSC_MEASURE_Z1 3 #define TSC_MEASURE_Z2 4 #define TSC_MEASURE_X 5 #define TSC_MEASURE_AUX 6 #define TSC_MEASURE_TEMP2 7 #define EXMEMCNT_MASK_SLOT2_ARM7 (1<<7) #define EXMEMCNT_MASK_SLOT2_SRAM_TIME (3) #define EXMEMCNT_MASK_SLOT2_ROM_1ST_TIME (3<<2) #define EXMEMCNT_MASK_SLOT2_ROM_2ND_TIME (1<<4) #define EXMEMCNT_MASK_SLOT2_CLOCKRATE (3<<5) #define SPI_DEVICE_POWERMAN 0 #define SPI_DEVICE_FIRMWARE 1 #define SPI_DEVICE_TOUCHSCREEN 2 #define SPI_BAUDRATE_4MHZ 0 #define SPI_BAUDRATE_2MHZ 1 #define SPI_BAUDRATE_1MHZ 2 #define SPI_BAUDRATE_512KHZ 3 #endif desmume-0.9.11/src/sndsdl.cpp0000755000000000000000000001211612467662066014544 0ustar rootroot/* Copyright (C) 2005-2006 Theo Berkau Copyright (C) 2006-2010 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include #include #include #include "types.h" #include "SPU.h" #include "sndsdl.h" #include "debug.h" #ifdef _XBOX #include #include #include #endif int SNDSDLInit(int buffersize); void SNDSDLDeInit(); void SNDSDLUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDSDLGetAudioSpace(); void SNDSDLMuteAudio(); void SNDSDLUnMuteAudio(); void SNDSDLSetVolume(int volume); SoundInterface_struct SNDSDL = { SNDCORE_SDL, "SDL Sound Interface", SNDSDLInit, SNDSDLDeInit, SNDSDLUpdateAudio, SNDSDLGetAudioSpace, SNDSDLMuteAudio, SNDSDLUnMuteAudio, SNDSDLSetVolume }; static u16 *stereodata16; static u32 soundoffset; static volatile u32 soundpos; static u32 soundlen; static u32 soundbufsize; static SDL_AudioSpec audiofmt; ////////////////////////////////////////////////////////////////////////////// #ifdef _XBOX static volatile bool doterminate; static volatile bool terminated; DWORD WINAPI SNDXBOXThread( LPVOID ) { for(;;) { if(doterminate) break; { SPU_Emulate_user(); } Sleep(10); } terminated = true; return 0; } #endif static void MixAudio(void *userdata, Uint8 *stream, int len) { int i; Uint8 *soundbuf=(Uint8 *)stereodata16; for (i = 0; i < len; i++) { if (soundpos >= soundbufsize) soundpos = 0; stream[i] = soundbuf[soundpos]; soundpos++; } } ////////////////////////////////////////////////////////////////////////////// int SNDSDLInit(int buffersize) { if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) return -1; audiofmt.freq = DESMUME_SAMPLE_RATE; audiofmt.format = AUDIO_S16SYS; audiofmt.channels = 2; audiofmt.samples = (audiofmt.freq / 60) * 2; audiofmt.callback = MixAudio; audiofmt.userdata = NULL; //samples should be a power of 2 according to SDL-doc //so normalize it to the nearest power of 2 here u32 normSamples = 512; while (normSamples < audiofmt.samples) normSamples <<= 1; audiofmt.samples = normSamples; soundlen = audiofmt.freq / 60; // 60 for NTSC soundbufsize = buffersize * sizeof(s16) * 2; if (SDL_OpenAudio(&audiofmt, NULL) != 0) { return -1; } if ((stereodata16 = (u16 *)malloc(soundbufsize)) == NULL) return -1; memset(stereodata16, 0, soundbufsize); soundpos = 0; SDL_PauseAudio(0); #ifdef _XBOX doterminate = false; terminated = false; CreateThread(0,0,SNDXBOXThread,0,0,0); #endif return 0; } ////////////////////////////////////////////////////////////////////////////// void SNDSDLDeInit() { #ifdef _XBOX doterminate = true; while(!terminated) { Sleep(1); } #endif SDL_CloseAudio(); if (stereodata16) free(stereodata16); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLUpdateAudio(s16 *buffer, u32 num_samples) { u32 copy1size=0, copy2size=0; SDL_LockAudio(); if ((soundbufsize - soundoffset) < (num_samples * sizeof(s16) * 2)) { copy1size = (soundbufsize - soundoffset); copy2size = (num_samples * sizeof(s16) * 2) - copy1size; } else { copy1size = (num_samples * sizeof(s16) * 2); copy2size = 0; } memcpy((((u8 *)stereodata16)+soundoffset), buffer, copy1size); // ScspConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)(((u8 *)stereodata16)+soundoffset), copy1size / sizeof(s16) / 2); if (copy2size) memcpy(stereodata16, ((u8 *)buffer)+copy1size, copy2size); // ScspConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)stereodata16, copy2size / sizeof(s16) / 2); soundoffset += copy1size + copy2size; soundoffset %= soundbufsize; SDL_UnlockAudio(); } ////////////////////////////////////////////////////////////////////////////// u32 SNDSDLGetAudioSpace() { u32 freespace=0; if (soundoffset > soundpos) freespace = soundbufsize - soundoffset + soundpos; else freespace = soundpos - soundoffset; return (freespace / sizeof(s16) / 2); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLMuteAudio() { SDL_PauseAudio(1); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLUnMuteAudio() { SDL_PauseAudio(0); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLSetVolume(int volume) { } ////////////////////////////////////////////////////////////////////////////// desmume-0.9.11/src/GPU_osd.h0000755000000000000000000000532612467662066014227 0ustar rootroot/* Copyright (C) 2006 yopyop Copyright (C) 2008-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #ifndef __GPU_OSD_ #define __GPU_OSD_ #include "types.h" #ifdef HAVE_LIBAGG #include #include #include "aggdraw.h" #define OSD_MAX_LINES 4 #define OSD_TIMER_SECS 2 struct HudCoordinates{ int x; int y; int xsize; int ysize; int storedx; int storedy; int clicked; }; struct HudStruct { public: HudStruct() { resetTransient(); } void resetTransient() { fps = 0; fps3d = 0; cpuload[0] = cpuload[1] = 0; cpuloopIterationCount = 0; clicked = false; } HudCoordinates SavestateSlots; HudCoordinates FpsDisplay; HudCoordinates FrameCounter; HudCoordinates InputDisplay; HudCoordinates GraphicalInputDisplay; HudCoordinates LagFrameCounter; HudCoordinates Microphone; HudCoordinates RTCDisplay; HudCoordinates Dummy; HudCoordinates &hud(int i) { return ((HudCoordinates*)this)[i]; } void reset(); int fps, fps3d, cpuload[2], cpuloopIterationCount; bool clicked; }; void EditHud(s32 x, s32 y, HudStruct *hudstruct); void HudClickRelease(HudStruct *hudstruct); void DrawHUD(); extern HudStruct Hud; extern bool HudEditorMode; class OSDCLASS { private: u64 offset; u8 mode; u16 rotAngle; u16 lineText_x; u16 lineText_y; AggColor lineText_color; u8 lastLineText; char *lineText[OSD_MAX_LINES+1]; time_t lineTimer[OSD_MAX_LINES+1]; AggColor lineColor[OSD_MAX_LINES+1]; bool needUpdate; bool checkTimers(); public: char name[7]; // for debuging bool singleScreen; bool swapScreens; OSDCLASS(u8 core); ~OSDCLASS(); void setOffset(u16 ofs); void setRotate(u16 angle); void update(); void clear(); void setListCoord(u16 x, u16 y); void setLineColor(u8 r, u8 b, u8 g); void addLine(const char *fmt, ...); void addFixed(u16 x, u16 y, const char *fmt, ...); void border(bool enabled); }; extern OSDCLASS *osd; #else /* HAVE_LIBAGG */ void DrawHUD(); class OSDCLASS { public: OSDCLASS(u8 core); ~OSDCLASS(); void update(); void clear(); void setLineColor(u8 r, u8 b, u8 g); void addLine(const char *fmt, ...); }; extern OSDCLASS *osd; #endif #endif desmume-0.9.11/src/gdbstub/0000755000000000000000000000000012467663414014175 5ustar rootrootdesmume-0.9.11/src/gdbstub/gdbstub_internal.h0000755000000000000000000001161012467662066017700 0ustar rootroot/* Copyright (C) 2008-2015 DeSmuME team Originally written by Ben Jaques. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 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 _GDBSTUB_INTERNAL_H_ #define _GDBSTUB_INTERNAL_H_ 1 #ifdef WIN32 typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int8 int8_t; typedef unsigned __int8 uint8_t; #include #define SOCKET_TYPE SOCKET #else #include #include #include #include #include #include #define SOCKET_TYPE int #endif enum stop_type { STOP_UNKNOWN, STOP_HOST_BREAK, STOP_STEP_BREAK, STOP_BREAKPOINT, STOP_WATCHPOINT, STOP_RWATCHPOINT, STOP_AWATCHPOINT }; struct armcpu_ctrl_iface; struct armcpu_memory_iface; /** * The structure describing a breakpoint. */ struct breakpoint_gdb { /** link them in a list */ struct breakpoint_gdb *next; /** The address of the breakpoint */ uint32_t addr; /** The size of the breakpoint */ uint32_t size; }; /* */ #define BUFMAX_GDB 2048 struct packet_reader_gdb { int state; int pos_index; uint8_t checksum; uint8_t read_checksum; uint8_t buffer[BUFMAX_GDB]; }; /** The maximum number of breakpoints (of all types) available to the stub */ #define BREAKPOINT_POOL_SIZE 100 struct gdb_stub_state { /** flag indicating if the stub is active */ int active; int main_stop_flag; /** the listener thread */ void *thread; void *arm_cpu_object; /** the id of the cpu the is under control */ //u32 cpu_id; /** the interface used to control the CPU */ armcpu_ctrl_iface *cpu_ctrl; /** the CPU's memory interface */ armcpu_memory_iface *cpu_memio; /** the direct interface to the memory system */ armcpu_memory_iface *direct_memio; /** GDB stub's memory interface passed to the CPU */ armcpu_memory_iface *gdb_memio; /** the list of active instruction breakpoints */ struct breakpoint_gdb *instr_breakpoints; /** the list of active read breakpoints */ struct breakpoint_gdb *read_breakpoints; /** the list of active write breakpoints */ struct breakpoint_gdb *write_breakpoints; /** the list of active access breakpoints */ struct breakpoint_gdb *access_breakpoints; /** the pointer to the step break point (not NULL if set) */ //struct breakpoint_gdb *step_breakpoint; uint32_t step_instr_address; /** the state of the stub as seen by the emulator, the emulator side can * set this to STOPPING_EMU_GDB_STATE to indicate that the a breakpoint has been hit, * and STOPPED_EMU_GDB_STATE when it has informed the gdb thread that a breakpoint has * been hit. * When handled the stub side will set it back to RUNNING_EMU_GDB_STATE. * * The emulator should only run the corresponding ARM if this is set to * RUNNING_EMU_GDB_STATE. */ enum EMU_STUB_STATE { STOPPED_EMU_GDB_STATE, STOPPING_EMU_GDB_STATE, RUNNING_EMU_GDB_STATE} emu_stub_state; /** the state of the stub as set by the stub control thread */ enum CTL_STUB_STATE { STOPPED_GDB_STATE, RUNNING_GDB_STATE, STEPPING_GDB_STATE, START_RUN_GDB_STATE} ctl_stub_state; struct packet_reader_gdb rx_packet; /** the socket information */ uint16_t port_num; SOCKET_TYPE sock_fd; /** The listening socket */ SOCKET_TYPE listen_fd; /** the type of event that caused the stop */ enum stop_type stop_type; /** the address of the stop */ uint32_t stop_address; /** The step break point decsriptor */ struct breakpoint_gdb step_breakpoint_descr; /** the breakpoint descriptor pool */ struct breakpoint_gdb breakpoint_pool[BREAKPOINT_POOL_SIZE]; /** the free breakpoint descriptor list */ struct breakpoint_gdb *free_breakpoints; /** the control pipe (or socket) to the gdb stub */ SOCKET_TYPE ctl_pipe[2]; }; enum read_res_gdb { READ_NOT_FINISHED, READ_SOCKET_ERROR, READ_COMPLETE, READ_BREAK }; #endif /* End of _GDBSTUB_INTERNAL_H_ */ desmume-0.9.11/src/gdbstub/gdbstub.cpp0000755000000000000000000012433712467662066016352 0ustar rootroot/* Copyright (C) 2008-2015 DeSmuME team Originally written by Ben Jaques. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 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 "gdbstub_internal.h" #include #include #include #include #include "../gdbstub.h" #include "../types.h" #include "../NDSSystem.h" #include "../armcpu.h" #include "../MMU.h" // For cpu_mutex #ifdef HOST_WINDOWS #include #else #include #if defined HOST_LINUX #include #elif defined HOST_BSD || defined HOST_DARWIN #include #endif #endif // HOST_WINDOWS #ifndef HOST_WINDOWS // to access the CPUs in any way, a thread has to get a lock on this first pthread_mutex_t cpu_mutex; #else HANDLE cpu_mutex; #endif #ifdef __GNUC__ #define UNUSED_PARM( parm) parm __attribute__((unused)) #else #define UNUSED_PARM( parm) parm #endif #if 1 #define DEBUG_LOG( fmt, ...) fprintf(stdout, fmt, ##__VA_ARGS__) #else #define DEBUG_LOG( fmt, ...) #endif #if 0 #define LOG_ERROR( fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) #else #define LOG_ERROR( fmt, ...) #endif #define LITTLE_ENDIAN_TO_UINT32_T( v) (\ ((v)[3] << 24) | \ ((v)[2] << 16) | \ ((v)[1] << 8) | \ ((v)[0] << 0)) /* * The state of the packet reader */ #define IDLE_READ_STATE 0 #define MID_PACKET_READ_STATE 1 #define FIRST_CHECKSUM_READ_STATE 2 #define SECOND_CHECKSUM_READ_STATE 3 /* * The gdb stub thread control message types. */ enum stub_message_type { /** The quit message type */ QUIT_STUB_MESSAGE = 0, /** The emulated CPU has stopped */ CPU_STOPPED_STUB_MESSAGE = 1 }; /* * The GDB signal values */ enum target_signal { /* Used some places (e.g. stop_signal) to record the concept that there is no signal. */ TARGET_SIGNAL_0 = 0, TARGET_SIGNAL_FIRST = 0, TARGET_SIGNAL_HUP = 1, TARGET_SIGNAL_INT = 2, TARGET_SIGNAL_QUIT = 3, TARGET_SIGNAL_ILL = 4, TARGET_SIGNAL_TRAP = 5, TARGET_SIGNAL_ABRT = 6, TARGET_SIGNAL_EMT = 7, TARGET_SIGNAL_FPE = 8, TARGET_SIGNAL_KILL = 9, TARGET_SIGNAL_BUS = 10, TARGET_SIGNAL_SEGV = 11, TARGET_SIGNAL_SYS = 12, TARGET_SIGNAL_PIPE = 13, TARGET_SIGNAL_ALRM = 14, TARGET_SIGNAL_TERM = 15, TARGET_SIGNAL_URG = 16, TARGET_SIGNAL_STOP = 17, TARGET_SIGNAL_TSTP = 18, TARGET_SIGNAL_CONT = 19, TARGET_SIGNAL_CHLD = 20, TARGET_SIGNAL_TTIN = 21, TARGET_SIGNAL_TTOU = 22, TARGET_SIGNAL_IO = 23, TARGET_SIGNAL_XCPU = 24, TARGET_SIGNAL_XFSZ = 25, TARGET_SIGNAL_VTALRM = 26, TARGET_SIGNAL_PROF = 27, TARGET_SIGNAL_WINCH = 28, TARGET_SIGNAL_LOST = 29, TARGET_SIGNAL_USR1 = 30, TARGET_SIGNAL_USR2 = 31, TARGET_SIGNAL_PWR = 32, /* Similar to SIGIO. Perhaps they should have the same number. */ TARGET_SIGNAL_POLL = 33, TARGET_SIGNAL_WIND = 34, TARGET_SIGNAL_PHONE = 35, TARGET_SIGNAL_WAITING = 36, TARGET_SIGNAL_LWP = 37, TARGET_SIGNAL_DANGER = 38, TARGET_SIGNAL_GRANT = 39, TARGET_SIGNAL_RETRACT = 40, TARGET_SIGNAL_MSG = 41, TARGET_SIGNAL_SOUND = 42, TARGET_SIGNAL_SAK = 43, TARGET_SIGNAL_PRIO = 44, }; // Try defining/undefining this, if you have problems with the GDB stub on Windows. #define USE_MUTEX_ON_WINDOWS void gdbstub_mutex_init() { #ifndef HOST_WINDOWS pthread_mutex_init(&cpu_mutex, NULL); #else #ifdef USE_MUTEX_ON_WINDOWS cpu_mutex = CreateMutex(NULL, FALSE, NULL); #endif #endif } void gdbstub_mutex_destroy() { #ifndef HOST_WINDOWS pthread_mutex_destroy(&cpu_mutex); #else #ifdef USE_MUTEX_ON_WINDOWS CloseHandle(cpu_mutex); #endif #endif } void gdbstub_mutex_lock() { #ifndef HOST_WINDOWS pthread_mutex_lock(&cpu_mutex); #else #ifdef USE_MUTEX_ON_WINDOWS // Maybe we should check the return value, but then again what could we do about it anyway. WaitForSingleObject(cpu_mutex, INFINITE); #endif #endif } void gdbstub_mutex_unlock() { #ifndef HOST_WINDOWS pthread_mutex_unlock(&cpu_mutex); #else #ifdef USE_MUTEX_ON_WINDOWS ReleaseMutex(cpu_mutex); #endif #endif } static void causeQuit_gdb( struct gdb_stub_state *stub) { uint8_t command = QUIT_STUB_MESSAGE; #ifdef WIN32 send( stub->ctl_pipe[1], (char*)&command, 1, 0); #else write( stub->ctl_pipe[1], &command, 1); #endif } static void indicateCPUStop_gdb( struct gdb_stub_state *stub) { uint8_t command = CPU_STOPPED_STUB_MESSAGE; #ifdef WIN32 send( stub->ctl_pipe[1], (char*)&command, 1, 0); #else write( stub->ctl_pipe[1], &command, 1); #endif } /* * * * */ static void break_execution( void *data, UNUSED_PARM(uint32_t addr), UNUSED_PARM(int thunmb)) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; /* stall the processor */ stub->cpu_ctrl->stall( stub->cpu_ctrl->data); NDS_debug_break(); /* remove the post execution function */ stub->cpu_ctrl->remove_post_ex_fn( stub->cpu_ctrl->data); /* indicate the halt */ stub->stop_type = STOP_HOST_BREAK; indicateCPUStop_gdb( stub); } static void step_instruction_watch( void *data, uint32_t addr, UNUSED_PARM(int thunmb)) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; DEBUG_LOG("Step watch: waiting for %08x at %08x\n", stub->step_instr_address, addr); if ( addr == stub->step_instr_address) { DEBUG_LOG("Step hit -> %08x\n", stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 15)); /* stall the processor */ stub->cpu_ctrl->stall( stub->cpu_ctrl->data); /* remove the post execution function */ stub->cpu_ctrl->remove_post_ex_fn( stub->cpu_ctrl->data); /* indicate the halt */ stub->stop_type = STOP_STEP_BREAK; indicateCPUStop_gdb( stub); NDS_debug_break(); } } /************************************************************************/ /* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/ /* at least NUMREGBYTES*2 are needed for register packets */ #define BUFMAX 2048 static const char hexchars[]="0123456789abcdef"; /* * Convert ch from a hex digit to an int */ static int hex (unsigned char ch) { if (ch >= 'a' && ch <= 'f') return ch-'a'+10; if (ch >= '0' && ch <= '9') return ch-'0'; if (ch >= 'A' && ch <= 'F') return ch-'A'+10; return -1; } static const unsigned char * hex2mem ( const unsigned char *buf, uint8_t *mem, int count) { int i; unsigned char ch; for (i=0; i 0) { ch = memio->read8( memio->data, mem_addr++); *buf++ = hexchars[ch >> 4]; *buf++ = hexchars[ch & 0xf]; } *buf = 0; return buf; } static enum read_res_gdb readPacket_gdb( SOCKET_TYPE sock, struct packet_reader_gdb *packet) { uint8_t cur_byte; enum read_res_gdb read_res = READ_NOT_FINISHED; int sock_res; /* update the state */ while ( (sock_res = recv( sock, (char*)&cur_byte, 1, 0)) == 1) { switch ( packet->state) { case IDLE_READ_STATE: /* wait for the '$' start of packet character */ if ( cur_byte == '$') { //DEBUG_LOG( "Found packet\n"); packet->state = MID_PACKET_READ_STATE; packet->pos_index = 0; packet->checksum = 0; } /* Is this the break command */ else if ( cur_byte == 3) { //DEBUG_LOG( "GDB has sent a break\n"); packet->buffer[0] = cur_byte; packet->buffer[1] = 0; packet->pos_index = 1; return READ_BREAK; } break; case MID_PACKET_READ_STATE: if ( cur_byte == '#') { //DEBUG_LOG( "\nAbout to get checksum\n"); packet->buffer[packet->pos_index] = '\0'; packet->state = FIRST_CHECKSUM_READ_STATE; } else if ( packet->pos_index >= BUFMAX - 1) { //DEBUG_LOG( "read buffer exceeded\n"); packet->state = IDLE_READ_STATE; } else { //DEBUG_LOG( "%c", cur_byte); packet->checksum = packet->checksum + cur_byte; packet->buffer[packet->pos_index] = cur_byte; packet->pos_index = packet->pos_index + 1; } break; case FIRST_CHECKSUM_READ_STATE: packet->read_checksum = hex( cur_byte) << 4; packet->state = SECOND_CHECKSUM_READ_STATE; break; case SECOND_CHECKSUM_READ_STATE: { packet->read_checksum += hex( cur_byte); packet->state = IDLE_READ_STATE; return READ_COMPLETE; break; } } } if ( sock_res == 0) { read_res = READ_SOCKET_ERROR; } else if ( sock_res == -1) { if ( errno != EAGAIN) { read_res = READ_SOCKET_ERROR; } } return read_res; } struct hidden_debug_out_packet { unsigned char *start_ptr; }; struct debug_out_packet { unsigned char *const start_ptr; }; static struct hidden_debug_out_packet the_out_packet; static unsigned char hidden_buffer[BUFMAX]; static struct debug_out_packet * getOutPacket( void) { the_out_packet.start_ptr = &hidden_buffer[1]; return (struct debug_out_packet *)&the_out_packet; } #define CHECKSUM_PART_SIZE 3 /** * send the packet in buffer. */ static int putpacket ( SOCKET_TYPE sock, struct debug_out_packet *out_packet, uint32_t size) { unsigned char checksum = 0; uint32_t count; unsigned char *ch_ptr = (unsigned char *)&out_packet->start_ptr[-1]; uint8_t reply_ch; //DEBUG_LOG_START( "Putting packet size %d ", size); /* add the '$' to the start of the packet */ *ch_ptr++ = '$'; /* calculate and add the checksum to the packet */ for ( count = 0; count < size; count += 1) { checksum += ch_ptr[count]; //DEBUG_LOG_PART("%c", ch_ptr[count]); } //DEBUG_LOG_PART("\n"); ch_ptr[count++] = '#'; ch_ptr[count++] = hexchars[checksum >> 4]; ch_ptr[count++] = hexchars[checksum & 0xf]; ch_ptr[count] = '\0'; //DEBUG_LOG("packet %s\n", &out_packet->start_ptr[-1]); /* add one for the '$' character */ count += 1; do { int reply_found = 0; send( sock, (char*)&out_packet->start_ptr[-1], count, 0); do { int read_res = recv( sock, (char*)&reply_ch, 1, 0); if ( read_res == 0) { return -1; } else if ( read_res == -1) { if ( errno != EAGAIN) { return -1; } } else { reply_found = 1; } } while ( !reply_found); } while ( reply_ch != '+'); /* $#. */ return count - 4; } static uint32_t make_stop_packet( uint8_t *ptr, enum stop_type type, uint32_t stop_address) { uint32_t stop_size = 0; int watch_index = 0; const char watch_chars[] = { 'a', 'r' }; switch (type) { case STOP_UNKNOWN: case STOP_HOST_BREAK: ptr[0] = 'S'; ptr[1] = hexchars[TARGET_SIGNAL_INT >> 4]; ptr[2] = hexchars[TARGET_SIGNAL_INT & 0xf]; stop_size = 3; break; case STOP_STEP_BREAK: case STOP_BREAKPOINT: ptr[0] = 'S'; ptr[1] = hexchars[TARGET_SIGNAL_TRAP >> 4]; ptr[2] = hexchars[TARGET_SIGNAL_TRAP & 0xf]; stop_size = 3; break; case STOP_WATCHPOINT: watch_index = 1; case STOP_RWATCHPOINT: watch_index += 1; case STOP_AWATCHPOINT: { int i; int out_index = 0; ptr[out_index++] = 'T'; ptr[out_index++] = hexchars[TARGET_SIGNAL_ABRT >> 4]; ptr[out_index++] = hexchars[TARGET_SIGNAL_ABRT & 0xf]; if ( watch_index < 2) { ptr[out_index++] = watch_chars[watch_index]; } ptr[out_index++] = 'w'; ptr[out_index++] = 'a'; ptr[out_index++] = 't'; ptr[out_index++] = 'c'; ptr[out_index++] = 'h'; ptr[out_index++] = ':'; for ( i = 0; i < 8; i++) { ptr[out_index++] = hexchars[(stop_address >> (i * 4)) & 0xf]; } ptr[out_index++] = ';'; stop_size = out_index; } break; } return stop_size; } /** * Returns -1 if there is a socket error. */ static int processPacket_gdb( SOCKET_TYPE sock, const uint8_t *packet, struct gdb_stub_state *stub) { // uint8_t remcomOutBuffer[BUFMAX_GDB]; struct debug_out_packet *out_packet = getOutPacket(); uint8_t *out_ptr = out_packet->start_ptr; int send_reply = 1; uint32_t send_size = 0; DEBUG_LOG("Processing packet %c\n", packet[0]); gdbstub_mutex_lock(); switch( packet[0]) { case 3: /* The break command */ //stub->running_state = gdb_stub_state::STOPPED_GDB_STATE; //*ptr++ = 'S'; //*ptr++ = hexchars[0x2 >> 4]; //*ptr++ = hexchars[0x2 & 0xf]; //*ptr++ = 0; send_reply = 0; break; case '?': send_size = make_stop_packet( out_ptr, stub->stop_type, stub->stop_address); /**ptr++ = 'S'; *ptr++ = hexchars[stub->stop_reason >> 4]; *ptr++ = hexchars[stub->stop_reason & 0xf]; send_size = 3;*/ break; case 'c': case 'k': stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE; stub->ctl_stub_state = gdb_stub_state::START_RUN_GDB_STATE; stub->main_stop_flag = 0; send_reply = 0; /* remove the cpu stall */ stub->cpu_ctrl->unstall( stub->cpu_ctrl->data); NDS_debug_continue(); break; case 's': { uint32_t instr_addr = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 15); /* Determine where the next instruction will take the CPU. * Execute the instruction using a copy of the CPU with a zero memory interface. */ DEBUG_LOG( "Stepping instruction at %08x\n", instr_addr); /* install the post execution function */ stub->step_instr_address = instr_addr; stub->cpu_ctrl->install_post_ex_fn( stub->cpu_ctrl->data, step_instruction_watch, stub); stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE; stub->ctl_stub_state = gdb_stub_state::START_RUN_GDB_STATE; stub->main_stop_flag = 0; send_reply = 0; /* remove the cpu stall */ stub->cpu_ctrl->unstall( stub->cpu_ctrl->data); //NDS_debug_step(); NDS_debug_continue(); break; } /* * Register set */ case 'P': { uint32_t reg; uint32_t value; const uint8_t *rx_ptr = &packet[1]; DEBUG_LOG("Processing packet %s\n", packet); if ( hexToInt( &rx_ptr, ®)) { if ( *rx_ptr++ == '=') { uint8_t tmp_mem[4]; rx_ptr = hex2mem( rx_ptr, tmp_mem, 4); value = LITTLE_ENDIAN_TO_UINT32_T( tmp_mem); DEBUG_LOG("Setting reg %d to %08x\n", reg, value); if ( reg < 16) stub->cpu_ctrl->set_reg( stub->cpu_ctrl->data, reg, value); if ( reg == 25) { stub->cpu_ctrl->set_reg( stub->cpu_ctrl->data, 16, value); } strcpy( (char *)out_ptr, "OK"); send_size = 2; } } break; } case 'm': { uint32_t addr = 0; uint32_t length = 0; int error01 = 1; const uint8_t *rx_ptr = &packet[1]; if ( hexToInt( &rx_ptr, &addr)) { if ( *rx_ptr++ == ',') { if ( hexToInt( &rx_ptr, &length)) { //DEBUG_LOG("mem read from %08x (%d)\n", addr, length); if ( !mem2hex( stub->direct_memio, addr, out_ptr, length)) { strcpy ( (char *)out_ptr, "E03"); send_size = 3; } else { send_size = length * 2; } error01 = 0; } } } if ( error01) strcpy( (char *)out_ptr,"E01"); break; } /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ case 'M': { /* Try to read '%x,%x:'. */ const uint8_t *rx_ptr = &packet[1]; uint32_t addr = 0; uint32_t length = 0; int error01 = 1; DEBUG_LOG("Memory write %s\n", rx_ptr); if ( hexToInt(&rx_ptr, &addr)) { if ( *rx_ptr++ == ',') { if ( hexToInt(&rx_ptr, &length)) { if ( *rx_ptr++ == ':') { uint8_t write_byte; unsigned int i; DEBUG_LOG("Memory write of %d bytes to %08x\n", length, addr); for ( i = 0; i < length; i++) { rx_ptr = hex2mem( rx_ptr, &write_byte, 1); stub->direct_memio->write8( stub->direct_memio->data, addr++, write_byte); } strcpy( (char *)out_ptr, "OK"); error01 = 0; } } else { DEBUG_LOG("Failed to find length (addr %08x)\n", addr); } } else { DEBUG_LOG("expected ',' got '%c' (addr = %08x)\n", *rx_ptr, addr); } } else { DEBUG_LOG("Failed to find addr\n"); } if ( error01) { strcpy( (char *)out_ptr, "E02"); } break; } case 'Z': case 'z': { const uint8_t *rx_ptr = &packet[2]; int remove_flag = 0; if ( packet[0] == 'z') remove_flag = 1; DEBUG_LOG( "%c%c packet %s (remove? %d)\n", packet[0], packet[1], rx_ptr, remove_flag); switch ( packet[1]) { /* all instruction breakpoints are treated the same */ case '0': case '1': case '2': case '3': case '4': { uint32_t addr = 0; uint32_t length = 0; int error01 = 1; struct breakpoint_gdb **bpoint_list; switch ( packet[1]) { case '0': case '1': bpoint_list = &stub->instr_breakpoints; break; case '2': bpoint_list = &stub->write_breakpoints; break; case '3': bpoint_list = &stub->read_breakpoints; break; case '4': bpoint_list = &stub->access_breakpoints; break; } if ( *rx_ptr++ == ',') { DEBUG_LOG("%s\n", rx_ptr); if ( hexToInt( &rx_ptr, &addr)) { if ( *rx_ptr++ == ',') { DEBUG_LOG("addr %08x %s\n", addr, rx_ptr); if ( hexToInt( &rx_ptr, &length)) { if ( remove_flag) { int removed = 0; struct breakpoint_gdb *last_bpoint = NULL; struct breakpoint_gdb *bpoint = *bpoint_list; while ( bpoint != NULL && !removed) { if ( bpoint->addr == addr) { DEBUG_LOG("Breakpoint(%c) at %08x removed\n", packet[1], addr); removed = 1; if ( last_bpoint == NULL) { *bpoint_list = bpoint->next; } else { last_bpoint->next = bpoint->next; } bpoint->next = stub->free_breakpoints; stub->free_breakpoints = bpoint; } last_bpoint = bpoint; bpoint = bpoint->next; } strcpy( (char *)out_ptr, "OK"); send_size = 2; error01 = 0; } else { /* get a breakpoint descriptor from the free pool and add it to * the current stub instruction breakpoint list */ struct breakpoint_gdb *bpoint = stub->free_breakpoints; if ( bpoint != NULL) { DEBUG_LOG( "Breakpoint(%c) added at %08x length %d\n", packet[1], addr, length); stub->free_breakpoints = bpoint->next; bpoint->addr = addr; bpoint->size = length; bpoint->next = *bpoint_list; *bpoint_list = bpoint; strcpy( (char *)out_ptr, "OK"); send_size = 2; error01 = 0; } } } } } } if ( error01) { strcpy( (char *)out_ptr, "E01"); send_size = 3; } } break; default: break; } break; } /* * Set the register values */ case 'G': { int i; const uint8_t *rx_ptr = &packet[1]; uint32_t reg_values[16]; uint32_t cpsr; uint8_t tmp_mem[4]; DEBUG_LOG("'G' command %s\n", rx_ptr); /* general purpose regs 0 to 15 */ for ( i = 0; i < 16; i++) { rx_ptr = hex2mem( rx_ptr, tmp_mem, 4); reg_values[i] = LITTLE_ENDIAN_TO_UINT32_T( tmp_mem); DEBUG_LOG("Setting reg %d to %08x\n", i, reg_values[i]); } /* skip the floaing point registers and floating point status register */ rx_ptr += 8 * (96 / 8 * 2); rx_ptr += 8; /* the CPSR register is last */ rx_ptr = hex2mem( rx_ptr, tmp_mem, 4); cpsr = LITTLE_ENDIAN_TO_UINT32_T( tmp_mem); DEBUG_LOG("Setting cpsr to %08x\n", cpsr); strcpy( (char *)out_ptr, "OK"); send_size = 2; break; } case 'g': /* return the value of the CPU registers */ { int i; int out_index = 0; uint32_t pc_value = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 15); uint32_t cpsr_value = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 16); DEBUG_LOG("'g' command PC = %08x\n", pc_value); /* general purpose regs 0 to 14 */ for ( i = 0; i < 15; i++) { uint32_t reg = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, i); out_ptr[out_index++] = hexchars[(reg >> 4) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 0) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 12) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 8) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 20) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 16) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 28) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 24) & 0xf]; } out_ptr[out_index++] = hexchars[(pc_value >> 4) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 0) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 12) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 8) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 20) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 16) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 28) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 24) & 0xf]; /* floating point registers (8 96bit) */ for ( i = 0; i < 8; i++) { int j; for ( j = 0; j < (96/4); j++) { out_ptr[out_index++] = '0'; } } /* floating point status register? */ for ( i = 0; i < 1; i++) { int j; for ( j = 0; j < 8; j++) { out_ptr[out_index++] = '0'; } } /* The CPSR */ for ( i = 0; i < 1; i++) { out_ptr[out_index++] = hexchars[(cpsr_value >> 4) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 0) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 12) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 8) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 20) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 16) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 28) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 24) & 0xf]; } send_size = out_index; } break; } gdbstub_mutex_unlock(); if ( send_reply) { return putpacket( sock, out_packet, send_size); } return 0; } /** * create the listening socket */ static SOCKET_TYPE createSocket ( int port) { SOCKET_TYPE sock; struct sockaddr_in bind_addr; memset (&bind_addr, 0, sizeof (bind_addr)); bind_addr.sin_family = AF_INET; bind_addr.sin_port = htons( port); bind_addr.sin_addr.s_addr = htonl (INADDR_ANY); /* create the socket, bind the address */ sock = socket (PF_INET, SOCK_STREAM, 0); #ifdef WIN32 if ( sock != INVALID_SOCKET) #else if (sock != -1) #endif { if (bind (sock, (struct sockaddr *) &bind_addr, sizeof (bind_addr)) == -1) { LOG_ERROR("Bind failed \"%s\" port %d\n", strerror( errno), port); #ifdef WIN32 closesocket( sock); #else close (sock); #endif sock = -1; } else if (listen (sock, 5) == -1) { LOG_ERROR("Listen failed \"%s\"\n", strerror( errno)); #ifdef WIN32 closesocket( sock); #else close (sock); #endif sock = -1; } } else { #ifdef WIN32 char message[30]; int error = WSAGetLastError(); sprintf( message, "Error creating socket %d\n", error); LOG_ERROR("Error creating socket %d\n", error); #endif } return sock; } /* * Handle GDB stub connections. */ /** */ INLINE static int check_breaks_gdb( struct gdb_stub_state *gdb_state, struct breakpoint_gdb *bpoint_list, uint32_t addr, UNUSED_PARM(uint32_t size), enum stop_type stop_type) { int found_break = 0; if ( gdb_state->active) { struct breakpoint_gdb *bpoint = bpoint_list; while ( bpoint != NULL && !found_break) { if ( addr == bpoint->addr) { DEBUG_LOG("Breakpoint hit at %08x\n", addr); /* stall the processor */ gdb_state->cpu_ctrl->stall( gdb_state->cpu_ctrl->data); NDS_debug_break(); /* indicate the break to the GDB stub thread */ gdb_state->stop_type = stop_type; gdb_state->stop_address = addr; indicateCPUStop_gdb( gdb_state); } bpoint = bpoint->next; } } return found_break; } static void WINAPI listenerThread_gdb( void *data) { struct gdb_stub_state *state = (struct gdb_stub_state *)data; fd_set read_sock_set; fd_set main_set; int quit = 0; FD_ZERO( &main_set); FD_SET( state->listen_fd, &main_set); FD_SET( state->ctl_pipe[0], &main_set); while (!quit) { int sel_res; read_sock_set = main_set; //DEBUG_LOG("Waiting on sockets\n"); sel_res = select( FD_SETSIZE, &read_sock_set, NULL, NULL, NULL); //DEBUG_LOG("sockets ready %d\n", sel_res); if ( sel_res > 0) { /* Is this a control message */ if ( FD_ISSET( state->ctl_pipe[0], &read_sock_set)) { uint8_t ctl_command; //DEBUG_LOG("Control message\n"); #ifdef WIN32 recv( state->ctl_pipe[0], (char*)&ctl_command, 1, 0); #else read( state->ctl_pipe[0], (char*)&ctl_command, 1); #endif switch ( ctl_command) { case CPU_STOPPED_STUB_MESSAGE: if ( state->active && state->ctl_stub_state != gdb_stub_state::STOPPED_GDB_STATE) { struct debug_out_packet *out_packet = getOutPacket(); uint8_t *ptr = out_packet->start_ptr; uint32_t send_size; /* mark the stub as stopped and send the stop packet */ state->ctl_stub_state = gdb_stub_state::STOPPED_GDB_STATE; state->main_stop_flag = 1; send_size = make_stop_packet( ptr, state->stop_type, state->stop_address); /*ptr[0] = 'S'; ptr[1] = hexchars[state->stop_reason >> 4]; ptr[2] = hexchars[state->stop_reason & 0xf];*/ putpacket( state->sock_fd, out_packet, send_size); DEBUG_LOG( "\nBreak from Emulation\n"); } else { LOG_ERROR( "Asked to stop and already stopped\n"); } break; default: /* quit out */ quit = 1; break; } } else { //struct armcpu_t *cpu = twin_states->cpus[i]; SOCKET_TYPE arm_listener = state->listen_fd; /* check for a connection request */ if ( FD_ISSET( arm_listener, &read_sock_set)) { SOCKET_TYPE new_conn; struct sockaddr_in gdb_addr; #ifdef WIN32 int addr_size = sizeof( gdb_addr); #else socklen_t addr_size = sizeof( gdb_addr); #endif //DEBUG_LOG("listener\n"); /* accept the connection if we do not already have one */ new_conn = accept( arm_listener, (struct sockaddr *)&gdb_addr, &addr_size); if ( new_conn != -1) { int close_sock = 1; //DEBUG_LOG("got new socket\n"); if ( state->sock_fd == -1 && state->active) { #ifdef WIN32 BOOL nodelay_opt = 1; #else int nodelay_opt = 1; #endif int set_res; //DEBUG_LOG("new connection\n"); close_sock = 0; /* make the socket NODELAY */ #ifdef WIN32 set_res = setsockopt( new_conn, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay_opt, sizeof( nodelay_opt)); #else set_res = setsockopt( new_conn, IPPROTO_TCP, TCP_NODELAY, &nodelay_opt, sizeof( nodelay_opt)); #endif if ( set_res != 0) { LOG_ERROR( "Failed to set NODELAY socket option \"%s\"\n", strerror( errno)); } FD_SET( new_conn, &main_set); state->sock_fd = new_conn; } if ( close_sock) { //DEBUG_LOG("closing new socket\n"); #ifdef WIN32 closesocket( new_conn); #else close( new_conn); #endif } } } /* handle the gdb connection */ if ( state->sock_fd != -1 && state->active) { SOCKET_TYPE gdb_sock = state->sock_fd; if ( FD_ISSET( gdb_sock, &read_sock_set)) { enum read_res_gdb read_res = readPacket_gdb( gdb_sock, &state->rx_packet); //DEBUG_LOG("socket read %d\n", read_res); switch ( read_res) { case READ_NOT_FINISHED: /* do nothing here */ break; case READ_SOCKET_ERROR: /* close the socket */ #ifdef WIN32 closesocket( gdb_sock); #else close( gdb_sock); #endif state->sock_fd = -1; FD_CLR( gdb_sock, &main_set); break; case READ_BREAK: { /* break the running of the cpu */ if ( state->ctl_stub_state != gdb_stub_state::STOPPED_GDB_STATE) { /* this will cause the emulation to break the execution */ DEBUG_LOG( "Breaking execution\n"); /* install the post execution function */ state->cpu_ctrl->install_post_ex_fn( state->cpu_ctrl->data, break_execution, state); } break; } case READ_COMPLETE: { uint8_t reply; int write_res; int process_packet = 0; int close_socket = 0; struct packet_reader_gdb *packet = &state->rx_packet; if ( state->ctl_stub_state != gdb_stub_state::STOPPED_GDB_STATE) { /* not ready to process packet yet, send a bad reply */ reply = '-'; } else { /* send a reply based on the checksum and if okay process the packet */ if ( packet->read_checksum == packet->checksum) { reply = '+'; process_packet = 1; } else { reply = '-'; } } write_res = send( gdb_sock, (char*)&reply, 1, 0); if ( write_res != 1) { close_socket = 1; } else { if ( processPacket_gdb( gdb_sock, state->rx_packet.buffer, state) == -1) { close_socket = 1; } } if ( close_socket) { #ifdef WIN32 closesocket( gdb_sock); #else close( gdb_sock); #endif state->sock_fd = -1; FD_CLR( gdb_sock, &main_set); } break; } } } } } } } /* tidy up and leave */ if ( state->sock_fd != -1) { #ifdef WIN32 closesocket( state->sock_fd); #else close( state->sock_fd); #endif } /* close the listenering sockets */ #ifdef WIN32 closesocket( state->listen_fd); #else close( state->listen_fd); #endif return; } /* * * The memory interface * */ static uint32_t FASTCALL gdb_prefetch32( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; breakpoint = check_breaks_gdb( stub, stub->instr_breakpoints, adr, 4, STOP_BREAKPOINT); //return stub->real_cpu_memio->prefetch32( stub->real_cpu_memio->data, adr); return 0; } static uint16_t FASTCALL gdb_prefetch16( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; breakpoint = check_breaks_gdb( stub, stub->instr_breakpoints, adr, 2, STOP_BREAKPOINT); //return stub->real_cpu_memio->prefetch16( stub->real_cpu_memio->data, adr); return 0; } /** read 8 bit data value */ static uint8_t FASTCALL gdb_read8( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; uint8_t value = 0; int breakpoint; /* pass down to the CPU's memory interface */ value = stub->cpu_memio->read8( stub->cpu_memio->data, adr); breakpoint = check_breaks_gdb( stub, stub->read_breakpoints, adr, 1, STOP_RWATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 1, STOP_AWATCHPOINT); return value; } /** read 16 bit data value */ static uint16_t FASTCALL gdb_read16( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; uint16_t value; int breakpoint; /* pass down to the CPU's memory interface */ value = stub->cpu_memio->read16( stub->cpu_memio->data, adr); breakpoint = check_breaks_gdb( stub, stub->read_breakpoints, adr, 2, STOP_RWATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 2, STOP_AWATCHPOINT); return value; } /** read 32 bit data value */ static uint32_t FASTCALL gdb_read32( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; uint32_t value; int breakpoint; /* pass down to the CPU's memory interface */ value = stub->cpu_memio->read32( stub->cpu_memio->data, adr); breakpoint = check_breaks_gdb( stub, stub->read_breakpoints, adr, 4, STOP_RWATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 4, STOP_AWATCHPOINT); return value; } /** write 8 bit data value */ static void FASTCALL gdb_write8( void *data, uint32_t adr, uint8_t val) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; /* pass down to the CPU's memory interface */ stub->cpu_memio->write8( stub->cpu_memio->data, adr, val); breakpoint = check_breaks_gdb( stub, stub->write_breakpoints, adr, 1, STOP_WATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 1, STOP_AWATCHPOINT); } /** write 16 bit data value */ static void FASTCALL gdb_write16( void *data, uint32_t adr, uint16_t val) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; /* pass down to the CPU's memory interface */ stub->cpu_memio->write16( stub->cpu_memio->data, adr, val); breakpoint = check_breaks_gdb( stub, stub->write_breakpoints, adr, 2, STOP_WATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 2, STOP_AWATCHPOINT); } /** write 32 bit data value */ static void FASTCALL gdb_write32( void *data, uint32_t adr, uint32_t val) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; /* pass down to the CPU's memory interface */ stub->cpu_memio->write32( stub->cpu_memio->data, adr, val); breakpoint = check_breaks_gdb( stub, stub->write_breakpoints, adr, 4, STOP_WATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 4, STOP_AWATCHPOINT); } // GDB memory interface for the ARM CPUs static const armcpu_memory_iface gdb_memory_iface = { gdb_prefetch32, gdb_prefetch16, gdb_read8, gdb_read16, gdb_read32, gdb_write8, gdb_write16, gdb_write32, NULL }; #ifdef WIN32 struct socket_creator_data { SOCKET_TYPE *sock; int port_num; }; /** */ static DWORD WINAPI control_creator( LPVOID lpParameter) { struct socket_creator_data *my_data = (struct socket_creator_data *)lpParameter; *my_data->sock = socket( PF_INET, SOCK_STREAM, 0); if ( *my_data->sock != INVALID_SOCKET) { int connect_res; struct sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" ); clientService.sin_port = htons( my_data->port_num); connect_res = connect( *my_data->sock, (SOCKADDR*) &clientService, sizeof(clientService)); if ( connect_res == SOCKET_ERROR) { LOG_ERROR( "Failed to connect to socket\n"); } } return 0; } #endif /** */ gdbstub_handle_t createStub_gdb( uint16_t port, armcpu_t *theCPU, const armcpu_memory_iface *direct_memio) { struct gdb_stub_state *stub = NULL; int i; int res = 0; if (theCPU == NULL) { return stub; } stub = new gdb_stub_state; stub->arm_cpu_object = theCPU; stub->active = 0; /* keep the memory interfaces */ stub->cpu_memio = theCPU->GetBaseMemoryInterface(); stub->direct_memio = new armcpu_memory_iface; *(stub->direct_memio) = *direct_memio; stub->gdb_memio = new armcpu_memory_iface; *(stub->gdb_memio) = gdb_memory_iface; stub->gdb_memio->data = stub; stub->cpu_ctrl = theCPU->GetControlInterface(); /* put the breakpoint descriptors onto the free list */ for ( i = 0; i < BREAKPOINT_POOL_SIZE - 1; i++) { stub->breakpoint_pool[i].next = &stub->breakpoint_pool[i+1]; } stub->breakpoint_pool[i].next = NULL; stub->free_breakpoints = &stub->breakpoint_pool[0]; stub->instr_breakpoints = NULL; stub->read_breakpoints = NULL; stub->write_breakpoints = NULL; stub->access_breakpoints = NULL; #ifdef WIN32 /* initialise the winsock library */ { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return NULL; } } { struct socket_creator_data temp_data = { &stub->ctl_pipe[0], 24689 }; SOCKET_TYPE temp_sock = createSocket ( temp_data.port_num); HANDLE temp_thread = INVALID_HANDLE_VALUE; DWORD temp_threadID; res = -1; if ( temp_sock != -1) { /* create a thread to connect to this socket */ temp_thread = CreateThread( NULL, 0, control_creator, &temp_data, 0, &temp_threadID); if ( temp_thread != INVALID_HANDLE_VALUE) { struct sockaddr_in ignore_addr; int addr_size = sizeof( ignore_addr); stub->ctl_pipe[1] = accept( temp_sock, (struct sockaddr *)&ignore_addr, &addr_size); if ( stub->ctl_pipe[1] != INVALID_SOCKET) { BOOL nodelay_opt = 1; int set_res; /* make the socket NODELAY */ set_res = setsockopt( stub->ctl_pipe[1], IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay_opt, sizeof( nodelay_opt)); if ( set_res == 0) { closesocket( temp_sock); res = 0; } } } } } if ( res != 0) { LOG_ERROR( "Failed to create control socket\n"); } #else /* create the control pipe */ res = pipe( stub->ctl_pipe); if ( res != 0) { LOG_ERROR( "Failed to create control pipe \"%s\"\n", strerror( errno)); } #endif else { stub->active = 1; stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE; stub->ctl_stub_state = gdb_stub_state::STOPPED_GDB_STATE; stub->rx_packet.state = IDLE_READ_STATE; stub->main_stop_flag = 1; stub->port_num = port; stub->sock_fd = -1; stub->listen_fd = createSocket( port); stub->stop_type = STOP_UNKNOWN; if ( stub->listen_fd == -1) { LOG_ERROR( "Failed to create listening socket \"%s\"\n", strerror( errno)); res = -1; } } if ( res != -1) { /* create the listenering thread */ stub->thread = createThread_gdb( listenerThread_gdb, stub); if ( stub->thread == NULL) { LOG_ERROR("Failed to create listener thread\n"); delete stub; } else { DEBUG_LOG("Created GDB stub on port %d\n", port); } } else { delete stub; } return stub; } void destroyStub_gdb( gdbstub_handle_t instance) { if (instance == NULL) return; struct gdb_stub_state *stub = (struct gdb_stub_state *)instance; armcpu_t *theCPU = (armcpu_t *)stub->arm_cpu_object; causeQuit_gdb( stub); joinThread_gdb( stub->thread); //stub->cpu_ctl->unstall( stub->cpu_ctl->data); //stub->cpu_ctl->remove_post_ex_fn( stub->cpu_ctl->data); theCPU->ResetMemoryInterfaceToBase(); DEBUG_LOG("Destroyed GDB stub on port %d\n", stub->port_num); delete stub->direct_memio; delete stub->gdb_memio; delete stub; } void activateStub_gdb( gdbstub_handle_t instance) { if (instance == NULL) return; struct gdb_stub_state *stub = (struct gdb_stub_state *)instance; armcpu_t *theCPU = (armcpu_t *)stub->arm_cpu_object; theCPU->SetCurrentMemoryInterface(stub->gdb_memio); /* stall the cpu */ stub->cpu_ctrl->stall( stub->cpu_ctrl->data); stub->active = 1; } desmume-0.9.11/src/gdbstub/Makefile.in0000644000000000000000000003755612467662234016261 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk subdir = src/gdbstub ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libgdbstub_a_AR = $(AR) $(ARFLAGS) libgdbstub_a_LIBADD = am_libgdbstub_a_OBJECTS = gdbstub.$(OBJEXT) libgdbstub_a_OBJECTS = $(am_libgdbstub_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libgdbstub_a_SOURCES) DIST_SOURCES = $(libgdbstub_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src AM_LDFLAGS = noinst_LIBRARIES = libgdbstub.a libgdbstub_a_SOURCES = gdbstub.cpp gdbstub_internal.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gdbstub/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gdbstub/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgdbstub.a: $(libgdbstub_a_OBJECTS) $(libgdbstub_a_DEPENDENCIES) $(EXTRA_libgdbstub_a_DEPENDENCIES) -rm -f libgdbstub.a $(libgdbstub_a_AR) libgdbstub.a $(libgdbstub_a_OBJECTS) $(libgdbstub_a_LIBADD) $(RANLIB) libgdbstub.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdbstub.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/src/gdbstub/Makefile.am0000755000000000000000000000017412467662066016240 0ustar rootrootinclude $(top_srcdir)/src/desmume.mk noinst_LIBRARIES = libgdbstub.a libgdbstub_a_SOURCES = gdbstub.cpp gdbstub_internal.h desmume-0.9.11/src/PACKED_END.h0000755000000000000000000000005212467662066014333 0ustar rootroot#ifndef __GNUC__ #pragma pack(pop) #endif desmume-0.9.11/Makefile.in0000644000000000000000000006113412467662234014025 0ustar rootroot# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in \ $(top_srcdir)/autopackage/default.apspec.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ TODO compile config.guess config.sub depcomp install-sh \ missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = autopackage/default.apspec CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLX_LIBS = @GLX_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README.LIN README.MAC README.WIN dsm.txt dsv.txt autogen.sh \ $(PO_FILES_IN) DISTCLEANFILES = $(PO_FILES) SUBDIRS = $(PO_DIR) src all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): autopackage/default.apspec: $(top_builddir)/config.status $(top_srcdir)/autopackage/default.apspec.in cd $(top_builddir) && $(SHELL) ./config.status $@ # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/missing0000755000000000000000000002415212467662234013356 0ustar rootroot#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: desmume-0.9.11/depcomp0000755000000000000000000005064312467662234013340 0ustar rootroot#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: desmume-0.9.11/po/0000755000000000000000000000000012467663413012371 5ustar rootrootdesmume-0.9.11/po/LINGUAS0000755000000000000000000000003512467662066013422 0ustar rootrootfr nb pt_BR sv zh_CN zh_TW esdesmume-0.9.11/po/nb.po0000755000000000000000000002177112467662066013346 0ustar rootroot# Norwegian translation for desmume. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the desmume package. # Stian Dr¸bak , 2009. # msgid "" msgstr "" "Project-Id-Version: desmume\n" "Report-Msgid-Bugs-To: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "3D operasjon oppdaget" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "3D ROM" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "Lyd P" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Akse :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "BG0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "BG1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "BG2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "BG3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Boost : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Konfigurer" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "DeSmuMe" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "Feils¸k : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Ned : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "Ramme Hopp" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Konfigurer Joystick" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Joystick kontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Tastdefinisjon" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboad Config" msgstr "Tastaturkonfigurasjon" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Tastaturkontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "V : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "Lag" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "Venstre : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "Last Status" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Nintendo DS-emulator basert p Yopyops arbeid" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Trykk p en knapp..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Trykk p en tast..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "H : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Restart" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "H¸yre : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "H¸yre Skjerm" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Roter Skjermen 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Roter Skjermen 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Roter Skjermen 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Roter Skjermen 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Lagre State" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "Select : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "St¸rrelse" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Start : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Plass 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Plass 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Plass 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Plass 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Plass 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Plass 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Plass 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Plass 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Plass 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Plass 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TYPE: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4KB)" msgstr "TYPE: EEPROM1 (4KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512KB)" msgstr "TYPE: EEPROM2 (512KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64KB)" msgstr "TYPE: EEPROM2 (64KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256KB)" msgstr "TYPE: FLASH (256KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TYPE: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Verkt¸y" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "Virkelig Mellomrom" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Opp : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Vis Minne" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Vis Palett" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "Se Plater" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "X : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "Y : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_Emulering" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Fil" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "_Skjermdump" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Lagringsplasser" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "http://desmume.sf.net" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "Onizuka89 " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr " GTil:" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Palett : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "0x00000000" msgstr "0x00000000" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16 bit" msgstr "16 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "16c" msgstr "16 farger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "256c" msgstr "256 farger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "32 bit" msgstr "32 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "8 bit" msgstr "8 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:9 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "ARM9-processor\n" "ARM7-processor" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "Go!" msgstr "Kj¸r!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:13 msgid "IO registers" msgstr "IO-register" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:14 msgid "Palette Viewer" msgstr "Palettviser" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:15 msgid "Tile viewer" msgstr "Plateviser" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:16 msgid "" "cpu : ARM7\n" "cpu : ARM9" msgstr "" "processor : ARM7\n" "processor : ARM9" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:18 msgid "memory viewer" msgstr "minnesviser" desmume-0.9.11/po/es.po0000755000000000000000000004145312467662066013355 0ustar rootroot# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-04-07 14:37+0000\n" "PO-Revision-Date: 2012-09-13 01:16-0000\n" "Last-Translator: Tim Roden \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gtk-glade/callbacks.cpp:53 #, c-format msgid "State %d (empty)" msgstr "Estado %d (vac­o)" #. Creating the selection window #: ../src/gtk-glade/callbacks.cpp:166 msgid "Open..." msgstr "Abre..." #: ../src/gtk-glade/callbacks.cpp:175 msgid "Nds binary (.nds)" msgstr "Binario Nds (.nds)" #: ../src/gtk-glade/callbacks.cpp:176 msgid "Nds binary with loader (.ds.gba)" msgstr "Binario Nds con cargador (.ds.gba)" #: ../src/gtk-glade/callbacks.cpp:177 msgid "All files" msgstr "Todos los archivos" #: ../src/gtk-glade/callbacks.cpp:192 #: ../src/gtk-glade/main.cpp:488 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "No pudo cargar :\n" "%s" #: ../src/gtk-glade/callbacks.cpp:408 msgid "You don't have any joystick!" msgstr "ÂĦNo tienes ningşn palanca de juego!" #: ../src/gtk-glade/callbacks.cpp:410 msgid "Can't configure joystick while the game is running!" msgstr "ÂĦNo se puede configurar palanca de juego mientras estĦ funcionando el juego!" #: ../src/gtk-glade/gdk_3Demu.cpp:66 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** No puede sacar valor atributo %s\n" #: ../src/gtk-glade/gdk_3Demu.cpp:164 #, c-format msgid "*** Failed to create pixmap.\n" msgstr "*** Fall³ en crear el pixmap.\n" #: ../src/gtk-glade/gdk_3Demu.cpp:174 #, c-format msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** Visual OpenGL-capaz apropiado no encontrado.\n" #: ../src/gtk-glade/gdk_3Demu.cpp:187 #, c-format msgid "Failed to create the GdkGLPixmap\n" msgstr "Fall³ a crear el GdkGLPixmap\n" #: ../src/gtk-glade/gdk_3Demu.cpp:197 #, c-format msgid "Connot create the OpenGL rendering context\n" msgstr "No puede crear el contexto de sintesis de imĦgenes OpenGL\n" #: ../src/gtk-glade/glade-xml.cpp:58 #, c-format msgid "could not find signal handler '%s'." msgstr "no pudo encontrar manipulador de seħal '%s'." #: ../src/gtk-glade/main.cpp:133 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "SE USA: %s [OPCIONES] [archivo-nds]\n" #: ../src/gtk-glade/main.cpp:134 #, c-format msgid "OPTIONS:\n" msgstr "OPCIONES:\n" #: ../src/gtk-glade/main.cpp:135 #, c-format msgid "" " --load-slot=NUM Load game saved under NUM position.\n" "\n" msgstr "" " --load-slot=NšM Carga el juego guardado en posici³n NšM.\n" "\n" #: ../src/gtk-glade/main.cpp:138 #, c-format msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" "\n" msgstr "" " --soft-convert Usa conversi³n color software durante sintesis\n" " de imĦgenes en pantalla OpenGL. Puede producir\n" " mejor o peor velocidades de fotograma\n" " dependiendo en hardware.\n" "\n" #: ../src/gtk-glade/main.cpp:143 #, c-format msgid "" " --3d-engine=ENGINE Selects 3D rendering engine\n" " 0 = disabled\n" " 1 = internal desmume rasterizer (default)\n" msgstr "" " --3d-engine=MOTOR Selecciona motor de sintesis de imĦgenes 3D\n" " 0 = inutilizado\n" " 1 = rasterizador desmume internal (opci³n por defecto)\n" #: ../src/gtk-glade/main.cpp:148 #, c-format msgid "" " 2 = gtkglext off-screen 3d opengl\n" "\n" msgstr "" " 2 = opengl 3d fuera de pantalla gtkglext\n" "\n" #: ../src/gtk-glade/main.cpp:151 #, c-format msgid "" " --disable-limiter Disables the 60 fps limiter\n" "\n" msgstr "" " --disable-limiter Inutiliza el limitador 60 fps\n" "\n" #: ../src/gtk-glade/main.cpp:153 #, c-format msgid "" " --save-type=TYPE Selects savetype:\n" " 0 = Autodetect (default)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" msgstr "" " --save-type=TIPO Selecciona tipo de parada:\n" " 0 = Autodetecta (opci³n por defecto)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" #: ../src/gtk-glade/main.cpp:163 #, c-format msgid "" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" msgstr "" " --fwlang=LENG Pone el idioma en el microprograma, LENG a continuaci³n:\n" " 0 = japonİs\n" " 1 = inglİs\n" " 2 = francİs\n" " 3 = alemĦn\n" " 4 = italiano\n" " 5 = espaħol\n" "\n" #: ../src/gtk-glade/main.cpp:172 #, c-format msgid "" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" "\n" msgstr "" " --arm9gdb=NšM_PTO Admite el fragmento GDB ARM9 en el puerto dado\n" " --arm7gdb=NšM_PTO Admite el fragmento GDB ARM7 en el puerto dado\n" "\n" #: ../src/gtk-glade/main.cpp:176 #, c-format msgid " --help Display this message\n" msgstr " --help Visualiza este mensaje\n" #: ../src/gtk-glade/main.cpp:189 #, c-format msgid "I only know how to load from slots 1-10.\n" msgstr "S³lo yo sİ como cargar desde espacios 1-10.\n" #: ../src/gtk-glade/main.cpp:213 #, c-format msgid "Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n" msgstr "Motores 3D admitidos: 0, 1 y en algunas mĦquinas 2; usa la opci³n --help para detalles\n" #: ../src/gtk-glade/main.cpp:225 #, c-format msgid "select savetype from 0 to 6; use --help option for details\n" msgstr "selecciona tipo de parada desde 0 a 6; usa la opci³n --help para detalles\n" #: ../src/gtk-glade/main.cpp:237 #, c-format msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "El idioma de microprograma tiene que ser puesto a un valor entre 0 a 5.\n" #: ../src/gtk-glade/main.cpp:250 #, c-format msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "El puerto fragmento de c³digo GDB ARM9 tiene que ser entre el rango de 1 a 65535\n" #: ../src/gtk-glade/main.cpp:262 #, c-format msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "El puerto fragmento de c³digo GDB ARM7 tiene que ser entre el rango de 1 a 65535\n" #: ../src/gtk-glade/main.cpp:275 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "Ya puesto el archivo NDS (\"%s\") \n" #: ../src/gtk-glade/main.cpp:288 #, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "SE USA: %s [opciones] [archivo-nds]\n" #: ../src/gtk-glade/main.cpp:289 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "SE USA: %s --help -para ayuda\n" #: ../src/gtk-glade/main.cpp:402 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "Fall³ en crear el gdbstub ARM9 en puerto %d\n" #: ../src/gtk-glade/main.cpp:413 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "Fall³ en crear el gdbstub ARM7 en puerto %d\n" #: ../src/gtk-glade/main.cpp:422 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "Error probando a iniciar SDL: %s\n" #: ../src/gtk-glade/main.cpp:504 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "Fall³ en inicializar la emulaci³n 3D OpenGL; sacando apoyo 3D\n" #: ../src/gtk-glade/main.cpp:511 #, c-format msgid "Failed to setup 3D engine; removing 3D support\n" msgstr "Fall³ en montar el motor 3D; sacando apoyo 3D\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "Detectado la operaci³n 3D" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "ROM 3D" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "Âż?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "Audio encendido" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Eje :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "F0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "F1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "F2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "F3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Aumenta : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Config" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "Debug : " msgstr "Depura : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Down : " msgstr "Bajo :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "FrameSkip" msgstr "SĦltateFotograma" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "IO regs" msgstr "Regs IO" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "Joystick Config" msgstr "Config de palanca de juego" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick controls" msgstr "Controles de palanca de juego" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Key definition" msgstr "Definici³n de tecla" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Keyboard Config" msgstr "Config de teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard controls" msgstr "Controles de teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "L : " msgstr "L :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "Layers" msgstr "Capas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Left : " msgstr "Izquierda :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Load State" msgstr "Carga estado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Emulador de Nintendo DS basado en trabajo hecho por Yopyop" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "No Gap" msgstr "No espacio" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "OBJ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Presiona un bot³n..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Presiona una tecla..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "R :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Reinicia" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Derecha :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "Pantalla derecha" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rota la pantalla 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rota la pantalla 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rota la pantalla 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rota la pantalla 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Guarda parada" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "Selecciona : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Tamaħo" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Empieza : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Estado 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Estado 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Estado 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Estado 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Estado 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Estado 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Estado 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Estado 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Estado 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Estado 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TIPO: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "TIPO: EEPROM1 (4kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "TIPO: EEPROM2 (512kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "TIPO: EEPROM2 (64kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "TIPO: FLASH (256kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TIPO: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "TYPE: FRAM (4MB)" msgstr "TIPO: FRAM (4MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "Tools" msgstr "Herramientas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "True Gap" msgstr "Espacio verdadero" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "Up : " msgstr "Arriba :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Memory" msgstr "Ve memoria" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Palette" msgstr "Ve gama" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "View Tiles" msgstr "Ve losas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "X : " msgstr "X :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "Y : " msgstr "Y :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_Emulation" msgstr "_Emulaci³n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_File" msgstr "_Archivo" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_PrintScreen" msgstr "_ImprimePantalla" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "_Saves" msgstr "_Paradas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:87 msgid "http://desmume.org" msgstr "http://desmume.org" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:89 msgid "translator-credits" msgstr "creditos-de-traductor" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr " VeA: " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Gama : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "16 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "16c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "256c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "32 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "8 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "cpu ARM9\n" "cpu ARM7" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "ÂĦVe!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" "cpu : ARM9\n" "cpu : ARM7" desmume-0.9.11/po/pt_BR.po0000755000000000000000000003453612467662066013760 0ustar rootroot# BRAZILIAN PORTUGUESE TRANSLATION # Copyright (C) 2007 # This file is distributed under the same license as the PACKAGE package. # Dreampeppers99 , 2007. # msgid "" msgstr "" "Project-Id-Version: Desmume 0.9.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-11 01:38-0400\n" "PO-Revision-Date: 2009-10-18 13:01-0300\n" "Last-Translator: Felipe \n" "Language-Team: Felipe\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: BRAZIL\n" "X-Poedit-SourceCharset: utf-8\n" #. Creating the selection window #: ../src/gtk-glade/callbacks.c:91 msgid "Open..." msgstr "Abrir..." #: ../src/gtk-glade/callbacks.c:100 msgid "Nds binary (.nds)" msgstr "BinĦrio nds (.nds)" #: ../src/gtk-glade/callbacks.c:101 msgid "Nds binary with loader (.ds.gba)" msgstr "BinĦrio nds com o loader (.ds.gba)" #: ../src/gtk-glade/callbacks.c:102 msgid "All files" msgstr "Todos os arquivos" #: ../src/gtk-glade/callbacks.c:117 #: ../src/gtk-glade/main.c:532 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "Incapaz de carregar :\n" "%s" #: ../src/gtk-glade/callbacks.c:291 msgid "You don't have any joystick!" msgstr "VocŞ n£o tem nenhum joystick!" #: ../src/gtk-glade/callbacks.c:293 msgid "Can't configure joystick while the game is running!" msgstr "N£o pode configurar o joystick enquanto o jogo estĦ rodando!" #: ../src/gtk-glade/gdk_3Demu.c:64 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** N£o consegue obter o valor do atributo %s\n" #: ../src/gtk-glade/gdk_3Demu.c:158 msgid "*** Failed to create pixmap.\n" msgstr "*** Falhou em criar o pixmap.\n" #: ../src/gtk-glade/gdk_3Demu.c:168 msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** Nenhum visual -capaz do OpenGL encontrado.\n" #: ../src/gtk-glade/gdk_3Demu.c:181 msgid "Failed to create the GdkGLPixmap\n" msgstr "Falhou em criar o GdkGLPixmap\n" #: ../src/gtk-glade/gdk_3Demu.c:191 msgid "Cannot create the OpenGL rendering context\n" msgstr "N£o p´de criar o contexto de renderiza§£o do OpenGL\n" #: ../src/gtk-glade/glade-xml.c:113 #, c-format msgid "could not find signal handler '%s'." msgstr "n£o p´de achar o manejador do sinal '%s'." #: ../src/gtk-glade/main.c:106 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "USO: %s [OP‡•ES] [arquivo-nds]\n" #: ../src/gtk-glade/main.c:107 msgid "OPTIONS:\n" msgstr "OP‡•ES:\n" #: ../src/gtk-glade/main.c:109 msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" " \n" " --disable-3d Disables the 3D emulation\n" "\n" msgstr "" " --soft-convert Usa convers£o de cor via software durante a\n" " renderiza§£o da tela em OpenGl. Pode produzir melhores ou piores\n" " taxas de frames dependendo do hardware.\n" " \n" " --disable-3d Desativa a emula§£o 3D\n" "\n" #: ../src/gtk-glade/main.c:116 msgid "" " --disable-limiter Disables the 60 fps limiter\n" " \n" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" " \n" " --help Display this message\n" msgstr "" " --disable-limiter Desativa o limitador de 60 fps\n" " \n" " --fwlang=LANG Defina o idioma no firmware, LANG como segue:\n" " 0 = JaponŞs\n" " 1 = InglŞs\n" " 2 = FrancŞs\n" " 3 = Alem£o\n" " 4 = Italiano\n" " 5 = Espanhol\n" "\n" " --arm9gdb=PORT_NUM Ativa o stub ARM9 GDB na porta dada\n" " --arm7gdb=PORT_NUM Ativa o stub ARM7 GDB na porta dada\n" " \n" " --help Exibir esta mensagem\n" #: ../src/gtk-glade/main.c:149 msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "O idioma do firmware deve ser definido em um valor de 0 a 5.\n" #: ../src/gtk-glade/main.c:161 msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "A porta stub ARM9 GDB deve estar no alcance de 1 a 65535\n" #: ../src/gtk-glade/main.c:173 msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "A porta stub ARM7 GDB deve estar no alcance de 1 a 65535\n" #: ../src/gtk-glade/main.c:185 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "Arquivo NDS (\"%s\") jĦ definido\n" #: ../src/gtk-glade/main.c:198 #, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "USO: %s [op§µes] [arquivo-nds]\n" #: ../src/gtk-glade/main.c:199 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "USO: %s --help - para ajuda\n" #: ../src/gtk-glade/main.c:332 #, c-format msgid "State %d (empty)" msgstr "Estado %d (vazio)" #: ../src/gtk-glade/main.c:459 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "Falhou em criar o gdbstub ARM9 na porta %d\n" #: ../src/gtk-glade/main.c:470 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "Falhou em criar o gdbstub ARM7 na porta %d\n" #: ../src/gtk-glade/main.c:479 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "Erro ao tentar inicializar o SDL: %s\n" #: ../src/gtk-glade/main.c:551 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "Falhou em inicializar a emula§£o 3D no openGL; removendo o suporte 3D\n" #: ../src/gtk-glade/main.c:557 #, c-format msgid "Failed to setup openGL 3D emulation; removing 3D support\n" msgstr "Falhou em configurar a emula§£o 3D no openGL; removendo o suporte 3D\n" #: ../src/gtk-glade/main.c:584 #, c-format msgid "Error trying to start FPS limiter timer: %s\n" msgstr "Erro ao tentar iniciar o timer limitador de FPS: %s\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "Opera§£o 3D detectada" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "Rom 3D" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "udio Ligado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Eixos : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "BG0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "BG1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "BG2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "BG3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Aumentar : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Configurar" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "DeSmuMe" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "Debug : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Baixo : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "FrameSkip" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "IO regs" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Configurar Joystick" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Controles do joystick" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Defini§£o das teclas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard Config" msgstr "Configurar o Teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Controles do teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "L : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "Camadas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "Esquerda : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "Carregar State" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Emulador de Nintendo DS baseado no trabalho do Yopyop" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "OBJ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Pressione um bot£o..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Pressione uma tecla..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "R : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Resetar" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Direita : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "Tela Direita" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rotacionar a Tela 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rotacionar a Tela 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rotacionar a Tela 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rotacionar a Tela 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Save State" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "Selecione : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Tamanho" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Iniciar : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Estado 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Estado 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Estado 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Estado 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Estado 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Estado 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Estado 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Estado 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Estado 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Estado 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TIPO: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "TIPO: EEPROM1 (4kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "TIPO: EEPROM2 (512kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "TIPO: EEPROM2 (64kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "TIPO: FLASH (256kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TIPO: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Ferramentas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "Lacuna Real" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Cima : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Visualizar a Mem³ria" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Visualizar a Paleta" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "Visualizar os Tiles" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "X :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "Y :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_Emula§£o" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Arquivo" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "_PrintScreen" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Saves" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "http://desmume.sf.net" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "Dreampeppers99\nFelipe" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr " IrPara: " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Paleta : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "16 bits" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "16c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "256c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "32 bits" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "8 bits" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "cpu ARM9\n" "cpu ARM7" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "Ir!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" "cpu : ARM9\n" "cpu : ARM7" desmume-0.9.11/po/ChangeLog0000755000000000000000000000000012467662066014137 0ustar rootrootdesmume-0.9.11/po/Makefile.in.in0000644000000000000000000001604612467662230015046 0ustar rootroot# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.11/po/fr.po0000755000000000000000000003331112467662066013347 0ustar rootroot# French translation for the desmume-glade UI. # Copyright (C) 2007 The DeSmuME Team. # Pascal Giard , 2007. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-07-17 01:38-0400\n" "PO-Revision-Date: 2007-07-17 05:27-0400\n" "Last-Translator: Pascal Giard \n" "Language-Team: DeSmuME Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #. Creating the selection window #: ../src/gtk-glade/callbacks.c:91 msgid "Open..." msgstr "Ouvrir..." #: ../src/gtk-glade/callbacks.c:100 msgid "Nds binary (.nds)" msgstr "Binaire NDS (.nds)" #: ../src/gtk-glade/callbacks.c:101 msgid "Nds binary with loader (.ds.gba)" msgstr "Binaire NDS avec lanceur (.ds.gba)" #: ../src/gtk-glade/callbacks.c:102 msgid "All files" msgstr "Tous les fichiers" #: ../src/gtk-glade/callbacks.c:117 ../src/gtk-glade/main.c:532 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "Impossible de charger:\n" "%s" #: ../src/gtk-glade/callbacks.c:291 msgid "You don't have any joystick!" msgstr "Aucune manette de jeu n'est connectée!" #: ../src/gtk-glade/callbacks.c:293 msgid "Can't configure joystick while the game is running!" msgstr "Vous ne pouvez pas configurer la manette de jeux pendant l'exécution du jeu!" #: ../src/gtk-glade/gdk_3Demu.c:64 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** Impossible d'obtenir la valeur de l'attribut %s\n" #: ../src/gtk-glade/gdk_3Demu.c:158 msgid "*** Failed to create pixmap.\n" msgstr "*** Échec lors de la création du pixmap.\n" #: ../src/gtk-glade/gdk_3Demu.c:168 msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** Aucun affichage supportant OpenGL n'est détecté.\n" #: ../src/gtk-glade/gdk_3Demu.c:181 msgid "Failed to create the GdkGLPixmap\n" msgstr "Échec lors de la création du GdkGLPixmap\n" #: ../src/gtk-glade/gdk_3Demu.c:191 msgid "Connot create the OpenGL rendering context\n" msgstr "Impossible de créer le contexte d'affichage OpenGL\n" #: ../src/gtk-glade/glade-xml.c:113 #, c-format msgid "could not find signal handler '%s'." msgstr "impossible de trouver la fonction associé au signal '%s'." #: ../src/gtk-glade/main.c:106 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "UTILISATION: %s [OPTIONS] [fichier-nds]\n" #: ../src/gtk-glade/main.c:107 msgid "OPTIONS:\n" msgstr "OPTIONS:\n" #: ../src/gtk-glade/main.c:109 msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" " \n" " --disable-3d Disables the 3D emulation\n" "\n" msgstr "" " --soft-convert Utiliser la conversion logiciel des couleurs lors de\n" " l'affichage OpenGL. Peut améliorer ou détériorer les\n" " performances dépendamment de la carte vidéo.\n" "\n" " --disable-3d Désactiver l'émulation 3D.\n" "\n" #: ../src/gtk-glade/main.c:116 msgid "" " --disable-limiter Disables the 60 fps limiter\n" " \n" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" " \n" " --help Display this message\n" msgstr "" " --disable-limiter Désactiver la limitation de 60 images/seconde.\n" " \n" " --fwlang=LANG Configurer la langue du firmware où LANG est:\n" " 0 = Japanais\n" " 1 = Anglais\n" " 2 = Français\n" " 3 = Allemand\n" " 4 = Italien\n" " 5 = Espagnol\n" "\n" " --arm9gdb=PORT_NUM Activer le stub GDB du ARM9 sur le port PORT_NUM.\n" " --arm7gdb=PORT_NUM Activer le stub GDB du ARM7 sur le port PORT_NUM.\n" " \n" " --help Afficher ce message d'aide.\n" #: ../src/gtk-glade/main.c:149 msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "La langue du firmware doit être une valeur entre 0 et 5.\n" #: ../src/gtk-glade/main.c:161 msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "Le numéro de port du stub GDB du ARM9 doit être entre 1 et 65535\n" #: ../src/gtk-glade/main.c:173 msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "Le numéro de port du stub GDB du ARM7 doit être entre 1 et 65535\n" #: ../src/gtk-glade/main.c:185 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "Fichier NDS (\"%s\") déjà configuré\n" #: ../src/gtk-glade/main.c:198 #, fuzzy, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "UTILISATION: %s [OPTIONS] [fichier-nds]\n" #: ../src/gtk-glade/main.c:199 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "UTILISATION: %s --help - pour l'aide\n" #: ../src/gtk-glade/main.c:332 #, c-format msgid "State %d (empty)" msgstr "État %d (vide)" #: ../src/gtk-glade/main.c:459 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.c:470 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.c:479 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "" #: ../src/gtk-glade/main.c:551 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "" #: ../src/gtk-glade/main.c:557 #, c-format msgid "Failed to setup openGL 3D emulation; removing 3D support\n" msgstr "" #: ../src/gtk-glade/main.c:584 #, c-format msgid "Error trying to start FPS limiter timer: %s\n" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "_Config." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Bas: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "Registres d'E/S" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Configuration de la manette de jeu" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Manette de jeu" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Valeur de la touche" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard Config" msgstr "Configuration du clavier" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Clavier" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "Gaucher: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "Chargement d'un état" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Émulateur de Nintendo DS basé sur le travail de Yopyop" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Appuyez sur un bouton..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Appuyez sur une touche..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Droite: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "Écran à droite" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rotation de l'écran 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rotation de l'écran 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rotation de l'écran 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rotation de l'écran 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Sauvegarder l'état" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Taille" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "État 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "État 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "État 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "État 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "État 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "État 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "État 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "État 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "État 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "État 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Outils" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "Espace entre les écrans" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Haut: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Afficher la mémoire" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Afficher la palette de couleur" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "Afficher les tuiles" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_Émul." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Fichier" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "_Capture d'écran" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Sauv." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "fr: Pascal Giard" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" desmume-0.9.11/po/sv.po0000755000000000000000000002220012467662066013363 0ustar rootroot# Swedish translation for desmume. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the desmume package. # Daniel Nylander , 2007. # msgid "" msgstr "" "Project-Id-Version: desmume\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-12 01:00+0200\n" "PO-Revision-Date: 2007-05-12 01:08+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "Ljud p" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Axel :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "BG0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "BG1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "BG2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "BG3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Boost : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Konfiguration" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "DeSmuMe" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "Felsĥkning : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Ner : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "Hoppa ĥver bildrutor" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Styrspakskonfiguration" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Styrspakskontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Tangentdefinition" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboad Config" msgstr "Tangentbordskonfiguration" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Tangentbordskontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "V : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "Lager" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "V¤nster : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "L¤s in" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Nintendo DS-emulator baserad p Yopyops arbete" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Tryck p en knapp..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Tryck p en tangent..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "H : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Nollst¤ll" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Hĥger : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rotera sk¤rmen 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rotera sk¤rmen 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rotera sk¤rmen 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rotera sk¤rmen 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Spara" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "V¤lj : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Storlek" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Start : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Plats 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Plats 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Plats 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Plats 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Plats 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Plats 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Plats 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Plats 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Plats 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Plats 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TYP: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4KB)" msgstr "TYP: EEPROM1 (4KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512KB)" msgstr "TYP: EEPROM2 (512KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64KB)" msgstr "TYP: EEPROM2 (64KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256KB)" msgstr "TYP: FLASH (256KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TYP: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Verktyg" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Upp : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Visa minne" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Visa palett" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "X : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "Y : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_Emulering" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Arkiv" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Sparningar" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "http://desmume.sf.net" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "Daniel Nylander " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Palett : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "0x00000000" msgstr "0x00000000" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16 bit" msgstr "16 bitar" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "16c" msgstr "16 f¤rger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "256c" msgstr "256 f¤rger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "32 bit" msgstr "32 bitar" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "8 bit" msgstr "8 bitar" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:9 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "ARM9-processor\n" "ARM7-processor" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "Go!" msgstr "Kĥr!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:13 msgid "IO registers" msgstr "IO-register" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:14 msgid "Palette Viewer" msgstr "Palettvisare" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:15 msgid "Tile viewer" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:16 msgid "" "cpu : ARM7\n" "cpu : ARM9" msgstr "" "processor : ARM7\n" "processor : ARM9" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:18 msgid "memory viewer" msgstr "minnesvisare" desmume-0.9.11/po/zh_CN.po0000755000000000000000000000741012467662066013742 0ustar rootroot# French translation for the desmume windows UI. # Copyright (C) 2009 The DeSmuME Team. # F.E.Nebula, 2009. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-07-17 01:38-0400\n" "PO-Revision-Date: 2009-06-24 11:00+0800\n" "Last-Translator: F.E.Nebula \n" "Language-Team: DeSmuME Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" #: File menu #, c-format msgid "File" msgstr "ĉ–‡äğĥ" msgid "Open ROM..." msgstr "ĉ‰“ċĵ€ROM..." msgid "Recent ROM" msgstr "ĉœ€èż‘çš„ROM" msgid "None" msgstr "çİş" msgid "Clear" msgstr "ĉ¸…çİş" msgid "ROM info" msgstr "ROMäżĦĉŻ" msgid "Save state as..." msgstr "ċ³ĉ—ĥċ­˜ĉĦ£ä¸ş..." msgid "Load state as..." msgstr "ċ³ĉ—ĥèŻğĉĦ£ä¸ş..." msgid "Save state" msgstr "ċ³ĉ—ĥċ­˜ĉĦ£" msgid "Load state" msgstr "ċ³ĉ—ĥèŻğĉĦ£" msgid "Import backup memory" msgstr "ċŻĵċ…ċŽċ¤‡ċ†…ċ­˜" msgid "Save screenshot as..." msgstr "ċĤċ­˜ċħċı•ĉˆŞċ›ä¸ş" msgid "Quick screenshot" msgstr "ċżĞ速ĉˆŞċ›" msgid "Record AVI" msgstr "ċ½•ċˆĥAVI" msgid "Stop AVI" msgstr "ċœĉ­˘ċ½•ċˆĥAVI" msgid "Quit" msgstr "退ċ‡ş" #: Emulation menu msgid "Emulation" msgstr "ĉ¨Ħĉ‹Ÿ" msgid "Pause" msgstr "ĉš‚ċœ" msgid "Reset" msgstr "ċ¤ä½" msgid "Shut up" msgstr "静音" msgid "GBA slot" msgstr "GBAĉ’ĉ§½" msgid "Cheats" msgstr "金ĉ‰‹ĉŒ‡" msgid "List" msgstr "ċˆ—èĦ¨" msgid "Search" msgstr "ĉœç´˘" #: View menu msgid "View" msgstr "ĉŸçœ‹" msgid "Rotation" msgstr "ĉ—‹è½Ĵ" msgid "Window size" msgstr "窗ċ£ċ¤§ċ°" msgid "Screen separation" msgstr "ċˆ†ċ‰²çŞ—ċ£" msgid "None\t(0 px)" msgstr "ĉ— \t(0 px)" msgid "Narrow border\t(5 px)" msgstr "窄线\t(5 px)" msgid "DS\t(64 px)" msgstr "DSċžé™…ċ½ċşĤ\t(64 px)" msgid "Force maintain ratio" msgstr "ċĵşċˆĥ保ĉŒĉŻ”ä‹" msgid "Default size" msgstr "éğ˜è¤ċ¤§ċ°" msgid "Display frame counter" msgstr "ĉ˜ç¤şċ¸§èĦĉ•°ċ™¨" msgid "Display FPS" msgstr "ĉ˜ç¤şFPS" msgid "Display input" msgstr "ĉ˜ç¤şè“ċ…" msgid "Display lag counter" msgstr "ĉ˜ç¤şĉ ‡ċż—èĦĉ•°ċ™¨" #: Config menu msgid "Config" msgstr "èç½" msgid "Save type" msgstr "ċ­˜ĉĦ£çħğċž‹" msgid "Autodetect" msgstr "è‡ŞċЍ选ĉ‹İ" msgid "EEPROM 4kbit" msgstr "" msgid "EEPROM 64kbit" msgstr "" msgid "EEPROM 512kbit" msgstr "" msgid "FRAM 256kbit" msgstr "" msgid "FLASH 2mbit" msgstr "" msgid "FLASH 4mbit" msgstr "" msgid "3D settings" msgstr "3Dèç½" msgid "Control config" msgstr "ĉާċˆĥċ™¨èç½" msgid "Hotkey config" msgstr "热é”èç½" msgid "Sound settings" msgstr "ċ£°éŸ³èç½" msgid "Wifi settings" msgstr "Wifièç½" msgid "Firmware settings" msgstr "ċ›şäğĥèç½" msgid "Emulation settings" msgstr "ĉ¨Ħĉ‹Ÿé€‰éĦıèç½" msgid "Frameskip" msgstr "è·³ċ¸§" msgid "Limit framerate" msgstr "限ċˆĥċ¸§çއ" msgid "Auto" msgstr "è‡ŞċЍ" msgid "Language" msgstr "èŻ­è¨€" #: Tools menu msgid "Disassembler" msgstr "ċĉħ‡çĵ–" msgid "View memory" msgstr "ĉŸçœ‹ċ†…ċ­˜" msgid "View registers" msgstr "ĉŸçœ‹ċŻ„ċ­˜ċ™¨" msgid "View palettes" msgstr "ĉŸçœ‹è°ƒè‰²ĉż" msgid "View tiles" msgstr "ĉŸçœ‹Tile" msgid "View maps" msgstr "ĉŸçœ‹ĉ˜ ċ°„" msgid "View OAMs" msgstr "产看OAM" msgid "View matrices" msgstr "ĉŸçœ‹çŸİ阵" msgid "View lights" msgstr "ĉŸçœ‹ċ…‰ç…§" msgid "View layers" msgstr "ĉŸçœ‹ċ›ċħ‚" msgid "Main BG 0" msgstr "" msgid "Main BG 1" msgstr "" msgid "Main BG 2" msgstr "" msgid "Main BG 3" msgstr "" msgid "Sub BG 0" msgstr "" msgid "Sub BG 1" msgstr "" msgid "Sub BG 2" msgstr "" msgid "Sub BG 3" msgstr "" #: Help menu msgid "Help" msgstr "ċ¸ċŠİ" msgid "Website" msgstr "ä¸ğéĦµ" msgid "Forums" msgstr "èşċ›" msgid "Submit a bug report" msgstr "ĉäş¤BUGĉŠċ‘Š" msgid "About" msgstr "ċ…³äşŽ" desmume-0.9.11/po/POTFILES.skip0000755000000000000000000000000012467662066014502 0ustar rootrootdesmume-0.9.11/po/zh_TW.po0000755000000000000000000003744512467662066014007 0ustar rootrootmsgid "" msgstr "" "Project-Id-Version: desmume\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-28 15:37+0100\n" "PO-Revision-Date: \n" "Last-Translator: Ronmi Ren \n" "Language-Team: DeSmuME Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: TAIWAN\n" "X-Poedit-SourceCharset: iso-8859-1\n" #: ../src/gtk-glade/callbacks.cpp:53 #, c-format msgid "State %d (empty)" msgstr "ċ­˜ĉŞ” %d (çİşçš„)" #. Creating the selection window #: ../src/gtk-glade/callbacks.cpp:166 msgid "Open..." msgstr "開ċ•Ÿ..." #: ../src/gtk-glade/callbacks.cpp:175 msgid "Nds binary (.nds)" msgstr "NDS遊ĉˆ² (.nds)" #: ../src/gtk-glade/callbacks.cpp:176 msgid "Nds binary with loader (.ds.gba)" msgstr "NDS遊ĉˆ²èˆ‡èĵ‰ċ…ċ™¨ (.ds.gba)" #: ../src/gtk-glade/callbacks.cpp:177 msgid "All files" msgstr "ĉ‰€ĉœ‰ĉŞ”ĉĦˆ" #: ../src/gtk-glade/callbacks.cpp:192 #: ../src/gtk-glade/main.cpp:553 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "èĵ‰ċ…ċ¤ħĉ•—:\n" "%s" #: ../src/gtk-glade/callbacks.cpp:408 msgid "You don't have any joystick!" msgstr "ĉ²’ĉœ‰ċµĉ¸Ĵċˆ°ĉ–ĉĦż" #: ../src/gtk-glade/callbacks.cpp:410 msgid "Can't configure joystick while the game is running!" msgstr "ċœ¨éŠĉˆ²ċŸ·èĦŒĉ™‚不ċŻäğèŞżĉ•´ĉ–ĉĦżè¨­ċš" #: ../src/gtk-glade/gdk_3Demu.cpp:66 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** ç„Ħĉ³•ċ–ċ—ċħĴĉ€§ %s 的ċ€ĵ\n" #: ../src/gtk-glade/gdk_3Demu.cpp:164 #, c-format msgid "*** Failed to create pixmap.\n" msgstr "*** ċ‰µé€ éğžé™£ċœ–ċ¤ħĉ•—\n" #: ../src/gtk-glade/gdk_3Demu.cpp:174 #, c-format msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** ĉ‰ä¸ċˆ°èˆ‡ OpenGL 相ċı的ċŻç”¨èĤ–èĤşĉ•ˆĉžœ\n" #: ../src/gtk-glade/gdk_3Demu.cpp:187 #, c-format msgid "Failed to create the GdkGLPixmap\n" msgstr "ċ‰µé€  GdkGLPixmap ċ¤ħĉ•—\n" #: ../src/gtk-glade/gdk_3Demu.cpp:197 #, c-format msgid "Connot create the OpenGL rendering context\n" msgstr "ċ‰µé€  OpenGL rendering context ċ¤ħĉ•—\n" #: ../src/gtk-glade/glade-xml.cpp:58 #, c-format msgid "could not find signal handler '%s'." msgstr "ĉ‰ä¸ċˆ° signal handler '%s'" #: ../src/gtk-glade/main.cpp:132 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "ä½żç”¨ĉ–ıċĵ: %s [選項] [ndsĉŞ”]\n" #: ../src/gtk-glade/main.cpp:133 #, c-format msgid "OPTIONS:\n" msgstr "ċŻç”¨é¸é …:\n" #: ../src/gtk-glade/main.cpp:134 #, c-format msgid "" " --load-slot=NUM Load game saved under NUM position.\n" "\n" msgstr "" " --load-slot=ċ­˜ĉޔ編號 è€ċ–çĴĴċı號的ċ³ĉ™‚ċ­˜ĉŞ”\n" "\n" #: ../src/gtk-glade/main.cpp:137 #, c-format msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" "\n" msgstr "" " --soft-convert ċœ¨ OpenGL ĉ¨Ħċĵä¸­ä½żç”¨èğŸéД轉ĉ›è‰²ċ½İ€‚\n" " ċœ¨ä¸ċŒçš„çĦĴéД下ïĵŒĉ•ˆèƒ½ċŻèƒ½ĉ›´ċ½äıŸċŻèƒ½ĉ›´ċ£ž€‚\n" " \n" #: ../src/gtk-glade/main.cpp:142 #, c-format msgid "" " --3d-engine=ENGINE Selects 3D rendering engine\n" " 0 = disabled\n" " 1 = internal desmume rasterizer (default)\n" msgstr "" " --3d-engine=3Dċĵ•ĉ“Ž 選ĉ“‡3Dċĵ•ĉ“Ž\n" " 0 = ä¸ä½żç”¨3D\n" " 1 = desmumeċ…§ċğşçš„èğŸéĞ”ĉ¨Ħĉ“Ĵċĵ•ĉ“Ž (預設ċ€ĵ)\n" #: ../src/gtk-glade/main.cpp:147 #, c-format msgid "" " 2 = gtkglext off-screen 3d opengl\n" "\n" msgstr "" " 2 = gtkglext ĉ–ĵċı•ċŒĉĵ”ç—çš„ OpenGL 3D ĉ”Żĉ´\n" "\n" #: ../src/gtk-glade/main.cpp:150 #, c-format msgid "" " --disable-limiter Disables the 60 fps limiter\n" "\n" msgstr "" " --disable-limiter ċ–ĉĥˆç•Ğ面ĉ›´ĉ–°çއĉœ€éИ60的上限\n" "\n" #: ../src/gtk-glade/main.cpp:152 #, c-format msgid "" " --save-type=TYPE Selects savetype:\n" " 0 = Autodetect (default)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" msgstr "" " --save-type=éĦžċž‹ 選ĉ“‡è¨˜ĉ†ĥċĦéĦžċž‹:\n" " 0 = è‡Şċ‹•選ĉ“‡ (default)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" #: ../src/gtk-glade/main.cpp:162 #, c-format msgid "" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" msgstr "" " --fwlang=LANG 設ċšéŸŒéĞ”çš„èŞžè¨€, ċŻç”¨çš„ LANG 設ċšĉœ‰:\n" " 0 = ĉ—ĉ–‡\n" " 1 = è‹ħĉ–‡\n" " 2 = ĉ³•ĉ–‡\n" " 3 = ċ·ĉ–‡\n" " 4 = çİċ¤§ċˆİĉ–‡\n" " 5 = èżç­ç‰™ĉ–‡\n" "\n" #: ../src/gtk-glade/main.cpp:171 #, c-format msgid "" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" "\n" msgstr "" #: ../src/gtk-glade/main.cpp:175 #, c-format msgid " --help Display this message\n" msgstr " --help éĦŻç¤şé€™äğ½ċıĞċŠİ訊ĉŻ\n" #: ../src/gtk-glade/main.cpp:188 #, c-format msgid "I only know how to load from slots 1-10.\n" msgstr "ċ³ĉ™‚ċ­˜ĉޔ的編號ċŞèƒ½äğ‹ĉ–ĵ 1 ċˆ° 10 äı‹é–“\n" #: ../src/gtk-glade/main.cpp:212 #, c-format msgid "Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n" msgstr "ċŻç”¨çš„3Dċĵ•ĉ“Žĉœ‰: 0, 1, ċœ¨ĉŸäş›ĉİŸċ™¨ä¸ŠċŻèƒ½ċŻäğ用2; ä½ ċŻäğ用 --help 選項ĉŸçœ‹èİ³ç´°èŞŞĉ˜Ž\n" #: ../src/gtk-glade/main.cpp:224 #, c-format msgid "select savetype from 0 to 6; use --help option for details\n" msgstr "記ĉ†ĥċĦ的éĦžċž‹ċŞèƒ½äğ‹ĉ–ĵ 0 ċˆ° 6äı‹é–“; ä½ ċŻäğ用 --help 選項ĉŸçœ‹èİ³ç´°èŞŞĉ˜Ž\n" #: ../src/gtk-glade/main.cpp:236 #, c-format msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "韌éĞ”èŞžè¨€ċż…須設ċš 0 ċˆ° 5 äı‹é–“çš„ċ€ĵ\n" #: ../src/gtk-glade/main.cpp:249 #, c-format msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "" #: ../src/gtk-glade/main.cpp:261 #, c-format msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "" #: ../src/gtk-glade/main.cpp:274 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "NDSĉŞ” (\"%s\") ċ·²çĥ“設ċš\n" #: ../src/gtk-glade/main.cpp:287 #, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "ä½żç”¨ĉ–ıċĵ: %s [選項] [ndsĉŞ”]\n" #: ../src/gtk-glade/main.cpp:288 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "ä½żç”¨ĉ–ıċĵ: %s --help - éĦŻç¤şċıĞċŠİ訊ĉŻ\n" #: ../src/gtk-glade/main.cpp:466 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.cpp:477 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.cpp:486 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "SDL ċˆċ§‹ċŒ–éŒŻèޤ: %s\n" #: ../src/gtk-glade/main.cpp:569 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "ç„Ħĉ³•ċˆċ§‹ċŒ– OpenGL 3D ĉ¨Ħĉ“Ĵ€‚ċ–ĉĥˆ 3D ĉ”Żĉ´\n" #: ../src/gtk-glade/main.cpp:576 #, c-format msgid "Failed to setup 3D engine; removing 3D support\n" msgstr "ç„Ħĉ³•設ċš OpenGL 3D ĉ¨Ħĉ“Ĵ; ċ–ĉĥˆ 3D ĉ”Żĉ´\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "ċŽŸċ§‹ċ¤§ċ°" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2ċ€" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "ċµĉ¸Ĵċˆ° 3D ĉ“ä½œ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3ċ€" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "開ċ•ŸéŸ³ĉ•ˆ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "ĉ–ıċ‘èğ¸ :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "設ċš" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "Debug : " msgstr "除錯 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Down : " msgstr "下 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "FrameSkip" msgstr "ç•Ğé˘è·³éŽ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "IO regs" msgstr "IO ĉšĞċ­˜ċ™¨" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "Joystick Config" msgstr "ĉ–ĉĦżè¨­ċš" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick controls" msgstr "ĉ–ĉĦżĉާċˆĥ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Key definition" msgstr "ĉŒ‰éµċšçİ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Keyboard Config" msgstr "鍵盤設ċš" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard controls" msgstr "鍵盤ĉާċˆĥ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "L : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "Layers" msgstr "ċœ–ċħ¤" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Left : " msgstr "ċ·Ĥ :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Load State" msgstr "è€ċ–ċ³ĉ™‚ċ­˜ĉŞ”" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "No Gap" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "ç‰İäğĥ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "èĞ‹ĉŒ‰ä¸€ċ€‹ĉŒ‰éˆ•..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "èĞ‹ĉŒ‰ä¸€ċ€‹ĉŒ‰éµ..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "重ĉ–°ċ•Ÿċ‹•" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "ċ³ :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "èĤ–窗ĉ°´ċı³ĉŽ’ċˆ—" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "èž˘ċı•ĉ—‹è½‰ 0 ċşĤ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "èž˘ċı•ĉ—‹è½‰ 180 ċşĤ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "èž˘ċı•ĉ—‹è½‰ 270 ċşĤ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "èž˘ċı•ĉ—‹è½‰ 90 ċşĤ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "ċ³ĉ™‚ċ­˜ĉŞ”" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "ċ¤§ċ°" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "ċ­˜ĉŞ” 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "ċ­˜ĉŞ” 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "ċ­˜ĉŞ” 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "ċ­˜ĉŞ” 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "ċ­˜ĉŞ” 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "ċ­˜ĉŞ” 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "ċ­˜ĉŞ” 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "ċ­˜ĉŞ” 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "ċ­˜ĉŞ” 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "ċ­˜ĉŞ” 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TYPE: è‡Şċ‹•選ĉ“‡ (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "TYPE: FRAM (4MB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "Tools" msgstr "ċ·ċ…·" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "True Gap" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "Up : " msgstr "上 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Memory" msgstr "ĉŞ˘èĤ–記ĉ†ĥéĞ”" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Palette" msgstr "ĉŞ˘èĤ–èŞżè‰²ç›¤" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "View Tiles" msgstr "ĉŞ˘èĤ–ç‰İäğĥ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "X : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "Y : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_Emulation" msgstr "ĉ¨Ħĉ“Ĵċ™¨ (_E)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_File" msgstr "ĉŞ”ĉĦˆ (_F)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_PrintScreen" msgstr "ĉˆŞċœ– (_P)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "_Saves" msgstr "ċ­˜ĉŞ” (_S)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:87 msgid "http://desmume.org" msgstr "" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:89 msgid "translator-credits" msgstr "Ronmi Ren " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr "èŞżè‰²ç›¤:" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "ċŸ·èĦŒ" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" #~ msgid "Error trying to start FPS limiter timer: %s\n" #~ msgstr "ç„Ħĉ³•ċ•Ÿċ§‹ fps 限ċˆĥ的計ĉ™‚ċ™¨: %s\n" desmume-0.9.11/po/POTFILES.in0000755000000000000000000000034712467662066014160 0ustar rootroot[encoding: UTF-8] src/gtk-glade/callbacks.cpp src/gtk-glade/gdk_3Demu.cpp src/gtk-glade/glade-xml.cpp src/gtk-glade/keyval_names.cpp src/gtk-glade/main.cpp src/gtk-glade/glade/DeSmuMe.glade src/gtk-glade/glade/DeSmuMe_Dtools.glade desmume-0.9.11/README.WIN0000755000000000000000000023753612467662066013315 0ustar rootrootManual From DeSmuME Jump to: navigation, search Contents [hide] * 1 DeSmuME Platform Specific Manuals * 2 DeSmuME Common command line arguments o 2.1 --load-slot=NUM [gtk,win] o 2.2 --play-movie=PATH_TO_PLAY_MOVIE [gtk,win] o 2.3 --record-movie=PATH_TO_RECORD_MOVIE [gtk,win] o 2.4 --start-paused=START_PAUSED [gtk,win] o 2.5 --cflash-image=PATH_TO_DISK_IMAGE [gtk,win] o 2.6 --cflash-path=PATH_TO_DISK_DIRECTORY [gtk,win] o 2.7 --bios-arm9=BIOS_ARM9_PATH [gtk,win] o 2.8 --bios-arm7=BIOS_ARM9_PATH [gtk,win] o 2.9 --bios-swi=BIOS_SWI [gtk,win] o 2.10 --num-cores=NUM [win] o 2.11 --scanline-filter-a=NUM [win] o 2.12 --scanline-filter-b=NUM [win] o 2.13 --arm9gdb=PORT_NUM [gtk,win] o 2.14 --arm7gdb=PORT_NUM [gtk,win] o 2.15 -h, --help [gtk,win] o 2.16 --opengl-2d [gtk] o 2.17 --soft-convert [gtk] o 2.18 --3d-engine=ENGINE [gtk] o 2.19 --disable-sound [gtk] o 2.20 --disable-limiter [gtk] o 2.21 --save-type=TYPE [gtk] o 2.22 --fwlang=LANG [gtk] o 2.23 --timeout=SECONDS [gtk] o 2.24 --display=DISPLAY [gtk] o 2.25 -v, --version [gtk] [edit] DeSmuME Platform Specific Manuals DeSmuME places responsibility on the developers of each port to expose emulation features in a way that is tuned to the needs of that platform. As a consequence, some ports are able to move well ahead of the others. Conversely, some ports are far behind some others. As a consequence, some behaviours and menu structures are different in each port. Therefore, the decision was made to create separate manuals for each port as well: when a specific port is changed, only the manual for that specific port needs to be altered. DeSmuME Manual for the Windows port DeSmuME Manual for the Linux GTK+ port DeSmuME Manual for the Linux Glade port DeSmuME Manual for the Linux command line port DeSmuME Manual for the Macintosh port [edit] DeSmuME Common command line arguments The GTK+ and windows ports share common command line arguments. We are trying slowly to move over to a common command line handling engine. The commandline arguments for these platforms are described here: [edit] --load-slot=NUM [gtk,win] Loads savegame from slot NUM [edit] --play-movie=PATH_TO_PLAY_MOVIE [gtk,win] Specifies a dsm format movie to play [edit] --record-movie=PATH_TO_RECORD_MOVIE [gtk,win] Specifies a path to a new dsm format movie [edit] --start-paused=START_PAUSED [gtk,win] Indicates that emulation should start paused [edit] --cflash-image=PATH_TO_DISK_IMAGE [gtk,win] Requests cflash in gbaslot with fat image at this path [edit] --cflash-path=PATH_TO_DISK_DIRECTORY [gtk,win] Requests cflash in gbaslot with filesystem rooted at this path [edit] --bios-arm9=BIOS_ARM9_PATH [gtk,win] Specifies a path to an arm9 bios which will be used [edit] --bios-arm7=BIOS_ARM9_PATH [gtk,win] Specifies a path to an arm7 bios which will be used [edit] --bios-swi=BIOS_SWI [gtk,win] Set to 1 to enable the emulation of SWI via the provided bios files, which I hope you have provided with the above options. (default 0) [edit] --num-cores=NUM [win] Overrides the emulator's autodetection for number of processors. Presently, any system with more than one core (this may inadvertantly include singlecore systems with hyperthreading, but I can't test it) will operate with somewhat reduced OSD functionality, with lower quality and no asynchronous composition. In the future, other optimizations will require higher numbers of cores (optimizations for quad-core are planned, but it won't be too impressive) [edit] --scanline-filter-a=NUM [win] Intensity of fadeout for scanlines filter (edge) (default 2) [edit] --scanline-filter-b=NUM [win] Intensity of fadeout for scanlines filter (corner) (default 4) [edit] --arm9gdb=PORT_NUM [gtk,win] Enable the ARM9 GDB stub on the given port [edit] --arm7gdb=PORT_NUM [gtk,win] Enable the ARM7 GDB stub on the given port [edit] -h, --help [gtk,win] Show summary of options. [edit] --opengl-2d [gtk] Enables using OpenGL for screen rendering [edit] --soft-convert [gtk] Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. [edit] --3d-engine=ENGINE [gtk] Select available 3d emulation: 0 = 3d disabled 1 = internal desmume software rasterizer (default) 2 = osmesa or gtkglext opengl (if available, depending on compilation options, see desmume --help) [edit] --disable-sound [gtk] Disables the sound emulation [edit] --disable-limiter [gtk] Disables the 60 fps limiter [edit] --save-type=TYPE [gtk] Select savetype from the following: 0 = Autodetect 1 = EEPROM 4kbit 2 = EEPROM 64kbit 3 = EEPROM 512kbit 4 = FRAM 256kbit 5 = FLASH 2mbit 6 = FLASH 4mbit [edit] --fwlang=LANG [gtk] Set the language in the firmware, LANG as follows: 0 = Japanese 1 = English 2 = French 3 = German 4 = Italian 5 = Spanish [edit] --timeout=SECONDS [gtk] Quit desmume after the specified seconds for testing purpose. [edit] --display=DISPLAY [gtk] X display to use. [edit] -v, --version [gtk] Show version of program. Retrieved from http://wiki.desmume.org/index.php?title=Manual This page was last modified on 22 November 2009, at 18:17. ==================================================================== DeSmuME Manual for the Windows port From DeSmuME Jump to: navigation, search NOTE: This refers to the 0.9.5 revision of desmume, and may or may not accurately reflect any other revision. Contents [hide] * 1 Quick Getting Started Guide o 1.1 Menu Layout + 1.1.1 File Menu # 1.1.1.1 File | Open ROM # 1.1.1.2 File | Recent ROM # 1.1.1.3 File | ROM Info # 1.1.1.4 File | Close ROM # 1.1.1.5 File | Save State As... # 1.1.1.6 File | Load State As... # 1.1.1.7 File | Save State # 1.1.1.8 File | Load State # 1.1.1.9 File | Import Backup Memory # 1.1.1.10 File | Export Backup Memory # 1.1.1.11 File | Save Screenshot As... # 1.1.1.12 File | Quick Screenshot # 1.1.1.13 File | Record AVI # 1.1.1.14 File | Stop AVI # 1.1.1.15 File | Record WAV # 1.1.1.16 File | Record Movie # 1.1.1.17 File | Play Movie # 1.1.1.18 File | Stop Movie # 1.1.1.19 File | Lua Scripting | New Lua Script Window # 1.1.1.20 File | Lua Scripting | Close All Script Windows # 1.1.1.21 File | Quit + 1.1.2 Emulation Menu # 1.1.2.1 Emulation | Pause # 1.1.2.2 Emulation | Reset # 1.1.2.3 Emulation | Shut Up # 1.1.2.4 Emulation | GBA Slot # 1.1.2.5 Emulation | Cheats # 1.1.2.6 Emulation | Cheats | List # 1.1.2.7 Emulation | Cheats | Search # 1.1.2.8 Emulation | Cheats | Disable + 1.1.3 View Menu # 1.1.3.1 View | LCDs layout # 1.1.3.2 View | Rotation # 1.1.3.3 View | Window size # 1.1.3.4 View | Window size | Always On Top # 1.1.3.5 View | Screen Separation # 1.1.3.6 View | Screen Separation | White,Gray,Black # 1.1.3.7 View | Screen Separation | Editable via border dragging # 1.1.3.8 View | Render # 1.1.3.9 View | Force Maintain Ratio # 1.1.3.10 View | Display Frame Counter # 1.1.3.11 View | Display FPS # 1.1.3.12 View | Display Input # 1.1.3.13 View | Display Graphical Input # 1.1.3.14 View | Display Lag Counter # 1.1.3.15 View | Display Microphone # 1.1.3.16 View | HUD Editing Mode + 1.1.4 Config Menu # 1.1.4.1 Config | Save Type # 1.1.4.2 Config | 3D Settings # 1.1.4.3 Config | Control Config # 1.1.4.4 Config | Control Config | Allow Left+Rt/Up+Dn # 1.1.4.5 Config | Hotkey Config # 1.1.4.6 Config | Sound Settings # 1.1.4.7 Config | WIFI Settings # 1.1.4.8 Config | Firmware Settings # 1.1.4.9 Config | Emulation Settings # 1.1.4.10 Config | Microphone Settings # 1.1.4.11 Config | Path Settings # 1.1.4.12 Config | Frame Skip # 1.1.4.13 Config | Language # 1.1.4.14 Config | Background Pause # 1.1.4.15 Config | Enable State Rewinding + 1.1.5 Tools Menu # 1.1.5.1 Tools | Disassembler # 1.1.5.2 Tools | View Memory # 1.1.5.3 Tools | View Registers # 1.1.5.4 Tools | View Palette # 1.1.5.5 Tools | View Tiles # 1.1.5.6 Tools | View Maps # 1.1.5.7 Tools | View OAM # 1.1.5.8 Tools | View Matrices # 1.1.5.9 Tools | View Lights # 1.1.5.10 Tools | View Sound State # 1.1.5.11 View | RAM Watch # 1.1.5.12 View | RAM Search # 1.1.5.13 Tools | View Layers + 1.1.6 Help Menu # 1.1.6.1 Help | Website # 1.1.6.2 Help | Forums # 1.1.6.3 Help | Submit a bug report # 1.1.6.4 Help | About [edit] Quick Getting Started Guide When you start the emulator for the first time, you probably just want to play a certain game. You can do this by going to 'File' in the menu, and selecting 'Open Rom'. This will open up an explorer window, within which you can browse to the rom (nds file) that you wish to play. Once the game has finished loading (and this should only take a few seconds at most), your game will automatically start running. But if you want, you can also compile from source. See the article Installing DeSmuME from source on Windows for details. [edit] Menu Layout The rest of this manual will be spend on explaining all the other options in the menu. [edit] File Menu [edit] File | Open ROM This option is for loading games. A game is typically called a rom file. Just use the explorer window to browse to the file, and click on open. The game should just load and start. The desmume windows port is also able to load some compressed formats, like zip, rar, and 7z. Just as long as there is a valid game (rom) file in the compressed archive ending with an .nds extension, it should load fine. [edit] File | Recent ROM This menu option contains a list of the roms that you have most recently loaded. You can quickly access a game that way, without having browse to the right directory with the 'Open Rom' option. [edit] File | ROM Info This option offers some information about the internals of the rom file, like name, code, manufacturer, and size. This should not concern the casual gamer, but may come in handy for developers. [edit] File | Close ROM Just ends the current game and leaves the emulator more or less how it was when you first launched it. [edit] File | Save State As... Imagine you have gotten to a certian point in a game, and you need to do something else. The emulator let's you save the current state of the game, so that you can continue the game later at precisely the same point somewhere in the future. Please note that the use of SAVESTATES is discouraged, as these are likely to break between emulator versions. Instead use SAVE FILES. These are likely to survive between emulator versions. This means that you will have to use save points within the game. SAVE FILES are stored in .dsv files. [edit] File | Load State As... Once you have saved a game's position, or 'state', you can load it again with this option. [edit] File | Save State This option works fairly similair to the 'Save As' option, altough it let's you save numbers instead os specifying a chosen name. Also, All the states saved via this option end up with a pre-determined name of 'game (rom) name'.dsx. So if the game is called MyGame, the first savefile will be called MyGame.ds0, the second one MyGame.ds1, etc. [edit] File | Load State This option let's you load the states that you saved via the 'File | Save State' option [edit] File | Import Backup Memory Backup Memory is the data the game uses to remember its own state. It is stored on the cart in a normal game. Desmume uses the .dsv extension and file format; other formats which can be imported are .duc and raw .sav, as well as no$gba savefiles (also using the .sav extension). People use pro action replays to capture duc files from their card and post it online without using emulators. These are frequently found on gamefaqs.com. See the faq for details on how to use this function, where it has been documented better. [edit] File | Export Backup Memory This lets you export the game's state for use in other Nintendo DS Emulators. It will write a 'raw' sav file or a no$gba savefile. [edit] File | Save Screenshot As... This lets you take a screenshot of the current view of the emulator, and specify it's name to save as a bitmap (.bmp) file. [edit] File | Quick Screenshot This option also dumps a screencapture, but it has a pre-determined filename and location. The name will be based on the name of the rom and somehow sequentially numbered, and placed in the directory specified in the Path Settings. [edit] File | Record AVI This option lets you capture what's going on in the emulator, and save it in an avi file. [edit] File | Stop AVI The 'Record AVI' option continues to record the game, untill you press the 'Stop Avi' option. [edit] File | Record WAV This option lets you capture the sound played in the emulator, and save it in a wav file. In contrast to the other option, this records, as faithfully as possible, the exact emulated audio output (which is not necessarily what you hear), although it will use the interpolation you have specified in the sound config. [edit] File | Record Movie This option lets you record the gameplay in TAS format, see http://tasvideos.org for details on TAS (tool-assisted speedruns). [edit] File | Play Movie This option lets you playback a pre-recorded TAS movie. [edit] File | Stop Movie This options lets you stop a movie which is playing or recording. [edit] File | Lua Scripting | New Lua Script Window Launches a lua scripting dashboard. Reference the FAQ for more information on lua in emulators. [edit] File | Lua Scripting | Close All Script Windows Closes all the lua dashboards. [edit] File | Quit Choosing this option exits the emulator. [edit] Emulation Menu [edit] Emulation | Pause This option will pause the emulation, freezing it at the current moment of execution. Selecting it again will resume the execution of the ROM at the exact moment where you paused it. [edit] Emulation | Reset This option will reset the ROM that is currently loaded to the very start of the ROM, just as if you chose 'File | Open Rom' again. [edit] Emulation | Shut Up This option turns off all the currently-running sounds, effectively killing streams and decoded music and voiceovers. Sequenced music and sound effects will continue to play, and when you enter a new area in the game or someone else speaks, the sounds will play again. Use this to Shut Up an annoying sound. [edit] Emulation | GBA Slot This menu option pop-ups a new window, which lets you specirfy what to do with the GBA slot of the Nintendo DS. It has the following choices : NONE, Compact Flash, Rumble Pack, GBA Game, Guitar Grip. Rumble pack allows some games to use vibration. Memory extension... Extends memory, as introduced by the NDS Opera browser. And some DS games can have bonuses, unlockable by GBA cart. For example in Megaman ZX you can fight some Megaman Zero Bosses when correct cartridge is inserted. This is also commonly used by pokemon players for finding some pokemons from older GBA games. There are some GBA slot extensions which are not yet emulated by desmume. Compact Flash is is used for homebrew software emulation, for example that uses DLDI (Dynamically Linked Device Interface). As usual, see the FAQ for more up-to-date information on that. [edit] Emulation | Cheats This option pulls down a drop-down menu, and presents the options list and search. Be aware though, that cheats are sort of half baked right now. If you are not having luck, wait for some news on an improved cheat system. Also, it is impossible yet to use "commercial" codes, such as Action Replay and Codebreaker, so what you'll have to do is manually search for, and alter the memory positions to your advantage. They are called 'raw' or 'internal' cheats. There's an excellent article in the wiki on Using Cheats in DeSmuMe . In post-0.9.2 development builds, there is also the support for Action Replay cheat codes. [edit] Emulation | Cheats | List Choosing 'list' will list all the currently known cheats. Please refer to the article Using Cheats in DeSmuMe for further details on how to use the cheat mechanism in desmume. [edit] Emulation | Cheats | Search Choosing 'search' will let you search for cheats. Please refer to the article Using Cheats in DeSmuMe for further details on how to use the cheat mechanism in desmume. [edit] Emulation | Cheats | Disable Disables the cheat engine, and all active cheats. [edit] View Menu [edit] View | LCDs layout This powerful menu controls how the NDS screens will be arranged into the window. Vertical and Horizontal will choose to stack them in the specified manner (vertical being traditional and default and horizontal being wide-screen). One LCD shows just one screen--whichever one is "first" (top) as described below. "Top First" means that the top screen is First and will be displayed on top. "Bottom first" means that the bottom screen is First and will be displayed on top (effectively switching the usual ordering of the screens for this game). "Main screen first" selects the main graphics engine (the one with 3d on it) to consider as first. This option will help you track the action and discard the useless status screen in many games. "Sub screen first" is added for the sake of completeness and you may occasionally find it helpful. Please note that these last two options may not work well in the case of dual screen 3d games, as the screens are always toggling around. [edit] View | Rotation This option will let you rotate the screen a pre-determined amount of degrees clockwise in order to adjust the angle of the display. Some programs require that you normally turn the DS on its side. You can set it up in that manner using this. The options are 0 (no rotation), 90, 180, and 270. [edit] View | Window size This option will let you enlarge the windows a pre-determined size. The resize options are: 1x, 1.5x, 2x, 3x, and 4x the default size. You can also adjust the window size by resizing the window as usual in Windows apps. [edit] View | Window size | Always On Top As featured in media players and IM programs and other emulators, etc., this will prevent other apps from displaying on top of desmume. [edit] View | Screen Separation This option controls how far the two windows should be apart of each other, in other words: how big the border between them should be. Valid choices are: None (which is the default), narrow border (which is slightly larger), DS (which is about the same amount of room there is on a real Nintendo DS). [edit] View | Screen Separation | White,Gray,Black Changes the colour of the gap. Savvy users may discover that they can edit this in the ini file to be any color they want. [edit] View | Screen Separation | Editable via border dragging When enabled, you can pick any gap size you want by dragging the bottom edge (not a corner) of the main window. [edit] View | Render These options will apply different resizing filters to the emulator screen display. [edit] View | Force Maintain Ratio Here you can choose, when re-sizing the windows, if you wan to maintain the ratio of the windows. Sometimes when the window size is changed it doesn't look correct on the screen. This option forces the window to maintain a correct ratio so it looks correct. [edit] View | Display Frame Counter Selecting this option will display the emulation frame number. This way you can tell how long you have been playing the game. It is also useful for timestamping emulation events (for example, you can tell if you made it out of a level faster than last time) [edit] View | Display FPS Selecting this option causes the 'frames-per-second' (or 'fps', for short) to be displayed. It also displays an additional '3D' counter, which tells how frequently the game is updating its 3d graphics. But unlike the fps counter, the 3d counter has nothing to do with the power of your system. If it is low, then the game is running slow on a retail cart, and so it runs slow in an emulator. The last number in parentheses is the arm9 load average, which indicates how hard the emulated CPU is working. This has nothing to do with the power of your system either. [edit] View | Display Input Selecting this option displays the emulated input that the emulator is recognizing and sending to the game software. [edit] View | Display Graphical Input Same as Display Input but it is a super-spiffy graphical version. [edit] View | Display Lag Counter This option displays the lag counter, which records frames where the game does not poll input. [edit] View | Display Microphone This option is somewhat less exciting than it sounds, but it displays some numbers which may help you diagnose whether your microphone is hooked up correctly. [edit] View | HUD Editing Mode This option will let you drag around hud elements to pick their position. [edit] Config Menu [edit] Config | Save Type This option lets you specify the save type of a particular game. The default is 'automatic'. However, this is not fail-safe in all cases, so you might need to manually select one of the other savetypes. You may also need to set this before important a savefile from some other source, as they do not always contain sufficient information to guess the correct size. [edit] Config | 3D Settings This option lets you select the method that is used to draw the screen. You can choose between OpenGL (hardware accelerated) or SoftRasterizer (desmume's custom-crafted software renderer). Note that however hardware accelerated it may be, oftentimes SoftRasterizer will run faster. Furthermore, you have three toggles for SoftRasterizer: * Unrealistically High-Precision Color Interpolation - this affects how material colors get handled when polygons are clipped. * Enable Edge Marking / Enable Fog - Using these you can prohibit emulation of these hardware features to gain a minor speedup. Desmume 0.9.4 had an option called "Alternate Flush Mode" which fixed some games with flickering graphics, but this was removed in 0.9.5. [edit] Config | Control Config This option lets you configure keyboard keys or a joystick. The joystick support is implemented using a DirectInput control interface. Here are the default control mappings (they may be subject to change): Up arrow - Up Left arrow - Left Down arrow - Down Right arrow - Right x - A button z - B button s - X button a - Y button q - Left Trigger w - Right Trigger Enter - Start button Right Shift - Select button Backspace - Lid fold/unfold [edit] Config | Control Config | Allow Left+Rt/Up+Dn It is nearly impossible on an actual console to press left and right at the same time. You may accidentally (or on purpose!) be glitching games by sending input they did not expect if you enable this option. Most casual users can emulate the hardware better by leaving this unchecked. [edit] Config | Hotkey Config This menu option lets you define keys, that can be used to quickly select other options without having to go through the entire menu structure. Some examples are a hotkey for 'pause', or a hotkey for loading a specific savestate. Here are the default hotkey mappings (they may be subject to change): n - Frame advance Space - Pause/Unpause p - Load current state 1,2,3,4,5,6,7,8,9,0 - Select current state F1-F10 - Load relevant state Shift+F1-F10 - Save relevant state [edit] Config | Sound Settings This option lets you configure the way sound is generated. The sync/async modes and sync methods give you different output: * Dual sync/async: the traditional mode, which generates more sound when the game slows down. Gives clear sound in most cases but can cause streamed sounds to be garbled sometimes. * Sync: always generates the same amount of sound, and uses one of the three available methods to compensate for too low or too high framerates. This mode shouldn't make streamed sounds garbled. o Sync method 'N': created by Nitsuja. Basically stretches the sound. Sounds like No$GBA (without the crackling). o Sync method 'Z': created by Zeromus. Stretches the sound to compensate for slowdowns, and resamples it to compensate for too high framerates. That resampling causes latency and can behave weird sometimes. o Sync method 'P': taken from SPU2-X, an SPU2 plugin for PCSX2. Stretches the sound intelligently, giving clear sound in most cases, but also latency. The sound core setting allows you to choose between the DirectX sound core and the dummy one which produces no sound. The WAV write core has been removed since the new "Record WAV" option made it useless. The buffer size setting should be kept to its original value. However, if your sound isn't clear even at 60 fps, you can try increasing it. The interpolation setting allows you to choose between three interpolation methods: * None: Fast, but may sound bad. * Linear: typical, sounds good * Cosine: maybe slower than linear, but doesn't sound much better Note that the DS has no interpolation method. While sometimes interpolation can make a noticeable improvement, it can also be unnoticeable or distort some sounds. The ADPCM caching has been removed. It was needed due to a bug in ADPCM decoding which has been fixed. If you are still using 0.9.4, then enabling this can speed up some games while breaking the sound in others. [edit] Config | WIFI Settings WIFI support is currently under heavy development, but it is not useful yet. Therefore, you may find this option missing, or simply 'greyed-out' for now. Even if you can fiddle with it, it won't do anything useful. [edit] Config | Firmware Settings This option provides you with the same set of options that a real Nintendo DS firmware does. The most important here is the language, because multi-lingual games will often look at how this option is set. [edit] Config | Emulation Settings These options let you boot from the extracted BIOS and Firmware of a real Nintendo DS. unless you have extracted/downloaded the firmware or bios from a Nintendo DS that you actually own yourself, these settings have no value for you as desmume does not generally require them to run correctly. Occasionally, however, a game may require them in order to work. [edit] Config | Microphone Settings You can choose one of four modes. The first will attempt to use the windows default recording device (it is up to you to make your microphone take this role) and feed its input to the emulator. This works, but not perfectly, and it suffers from some unresolved conceptual issues, similar in nature to the emulator audio synchronization problem. The remainder of the options are triggered when using the mic hotkey. You can "Use internal noise sample" which works for many games that want you to blow on the mic; you can "Use rand() whitenoise" which will work for games that require blowing, but which don't work with the internal noise sample (note that this is NONDETERMINISTIC and not tas-safe); and finally you can supply your own microphone sample, which may be noise, or your nintendog's name, or any other thing. It has even been tested with bangai-o spirits level loading. This must be an 8bit mono pcm wav file. [edit] Config | Path Settings Use this dialog to configure the default paths for roms, savestates, screenshots, etc. Some people like everything in one directory and some people like using 50 directories; you can have it your way. [edit] Config | Frame Skip The first option, "Limit framerate" engages the throttler and prohibits the emulator from running more than 60fps. With this disabled, a fast computer may run the game doubly or triply fast. The fixed skip options allow you to specify how many frames should be skipped, constantly. It is generally safe to choose 1 or 2 if you don't mind a slightly choppier game, in order to get a speedup. You may get accustomed to the degraded game performance and not notice. Note, however, that frameskipping can sometimes entirely fail in dual-screen 3d games or games that use capture. The auto skip options will try engaging the frameskipping when the emulator is running slow, to keep the game from slowing down, but render all the frames when possible to maintain 60fps. This can make a game look sort of like a modern console 3d game which slows down when the action gets intense or too much of the world is visible. Note that you can use the fast-forward hotkey to engage a special mode which disables the throttler and skips some large number of frames in order to run the game as quickly as possible. This may help you speed through cutscenes or other slow grinding in games and is easier to use than constantly fiddling with these menu options. [edit] Config | Language This lets you set the language the emulator displays its menus and options in. This won't change everything in the emulator, as due to the way it is coded, some things aren't translateable through this system, and it may very well be the case that your desired translation is incomplete. [edit] Config | Background Pause Selecting this option will pause the emulation whenever you put desmume in the background, or the window loses focus. [edit] Config | Enable State Rewinding This is a bit of an experimental option which will suck up a ton of your cpu power taking secret savestates every 0.25 seconds or so. With this enabled, the use of a rewind hotkey will permit you to rewind time a little bit in case you die. [edit] Tools Menu [edit] Tools | Disassembler This option displays the ARM9 and ARM7 disassembler. Be aware though, that the windows are drawn exactly on top of each other, so that you have to move (drag n drop) the first windows before the second window shows. [edit] Tools | View Memory This tool displays the ARM7 and ARM9 memory. Be aware though, that the windows are drawn exactly on top of each other, so that you have to move (drag n drop) the first windows before the second window shows. The "View mode" radio buttons allow you to choose how the memory will be shown: * 8-bit : shows the memory as bytes * 16-bit : shows the memory as words * 32-bit : shows the memory as dwords The "View address" textbox and button allow you to jump to a different address: * Enter an hexadecimal address without 0x prefix, with up to 8 digits * Click "Go" to jump to the entered address The "View dump" buttons allow you to dump the current view: * Text dump : dumps the view to a text file, in an human-readable form * Raw dump : dumps the memory directly to a binary file which can be read with an hex editor Note that if you dump memory to a file already containing (a) dump(s), the new dump will be appended to the existing one(s). The scrollbar... well, you surely know how a scrollbar works. The viewers additionally allow to edit the memory. For it, click on the value you want to edit, then type the new value. The new value is applied only once you've entirely entered it. [edit] Tools | View Registers This option lets you view the ARM7 and ARM9 I/O registers. [edit] Tools | View Palette This option lets you view the palette in detail. [edit] Tools | View Tiles This option lets you view the tiles in detail. [edit] Tools | View Maps This option lets you view the maps in detail. [edit] Tools | View OAM This option lets you view the OAM layer in detail. [edit] Tools | View Matrices This option lets you view the matrices in detail. [edit] Tools | View Lights This option lets you view the lights in detail. [edit] Tools | View Sound State This option displays the sound output. [edit] View | RAM Watch This option will pop-up a new window, with extensive and advanced features to watch the emulated RAM memory. [edit] View | RAM Search This option will pop-up a new window, with extensive and advanced features to search through the emulated RAM memory. [edit] Tools | View Layers This option lets you toggle BG layer visibility one by one. You can also toggle the rendering for an entire GPU engine, which can help your framerate in games where one screen is pointless. [edit] Help Menu [edit] Help | Website This option directs your browser to the desmume homepage. [edit] Help | Forums This option directs your browser to the desmume forums. [edit] Help | Submit a bug report This option directs your browser to the SourceForge bugtracker for desmume. [edit] Help | About This option displays the authors of the emulator. Retrieved from "http://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Windows_port" This page was last modified on 22 November 2009, at 22:09. ==================================================================== Faq From DeSmuME Jump to: navigation, search DesMuMe FAQ This FAQ holds a list of many commonly asked questions about DeSmuME. If the FAQ is unable to answer any questions you have, then please make sure that you also consult the manual. If this doesn't help, either, post your question on the forums. Contents [hide] * 1 Release 0.9.4 Topics o 1.1 Using old DeSmuME save files in 0.9.4 o 1.2 What is this NOSSE and dev stuff? / Why does desmume.exe crash when it loads? / Which EXE do I use? * 2 Savegames and Savestates o 2.1 Why does this game fail to save? / I get the error "Data could not be accessed. Turn off the power and reinsert the DS card." or "Unable to write data. Please turn off the power and reinsert the game card." o 2.2 Why was the save file format and extension changed from .sav to .dsv ? o 2.3 Can I use my save states across versions? o 2.4 Can I convert an ideas or no$gba nocash .sav savefile to DeSmuME .dsv? o 2.5 How do I make Pokemon saves? o 2.6 Why can't Pokemon save after beating the elite 4? * 3 Wi-Fi and WFC o 3.1 Does DeSmuME support wifi? o 3.2 Why do I get an assert in wifi.cpp which keeps me from playing a game? o 3.3 If DeSmuME doesn't support wifi, then why does it make my firewall alert since 0.9.2? o 3.4 Why did my build come with winpcap.dll? / Why do I get crashes when I run DeSmuME on vista which mention something about winpcap? o 3.5 What is WFC / Nintendo WiFi Connection? * 4 Troubleshooting and Errors o 4.1 Help! My desmume window disappeared! Maybe I can hear sound and it is in the taskbar but I can't see the window o 4.2 Does Scribblenauts work? o 4.3 How do I use external BIOS files or firmware? o 4.4 Why does my touch screen not work? Oh yes you did read my mind, I was using external firmware o 4.5 I have a gameplay related question o 4.6 Why doesn't my DeSmuME play this game? o 4.7 Why doesn't my game boot or progress into the main game engine? o 4.8 Why does the emulator take a long time to start up and/or devastate my system or unarchiver when I run it? o 4.9 Why doesn't OpenGL 3D work in Linux? o 4.10 Why doesn't OpenGL 3D work in windows? o 4.11 My display is incorrect or corrupted or something is missing o 4.12 My display has flickering graphics in a certain game o 4.13 Why does music and FMV sound bad/distorted sometimes? * 5 Performance o 5.1 Why is the emulator slow? o 5.2 Does DeSmuME make use of multiple CPU's or multiple cores? o 5.3 In 0.9.4, what does the number/percentage in the DeSmuME title bar mean o 5.4 In 0.9.5, what does the percentage in the FPS display mean o 5.5 Why are there Two/Numbers in the FPS display? * 6 Using The Emulator o 6.1 What are the minimum hardware requirements for DeSmuME ? o 6.2 What are the recommended hardware requirements for DeSmuME? o 6.3 It is hard to zoom in on a widescreen display due to the unusual aspect ratio of the DS o 6.4 But will you please add screen splitting / window tearing apart / fullscreen modes? o 6.5 How do I enter 'cheat codes' in DeSmuME? o 6.6 I entered a 'cheat code', and now the emulator freezes. o 6.7 Does DeSmuME support the microphone? o 6.8 Does the 'GBA slot' option let me play GBA games? o 6.9 How do I "Close the DS"? o 6.10 How do I use the stylus (pen) to 'touch' the screen? o 6.11 How can I touch two points on the screen at once, as required by Hotel Dusk? * 7 General Questions o 7.1 What does DeSmuME emulate and on what systems? o 7.2 What does DeSmuME mean? o 7.3 Under what license is DeSmuME distributed ? o 7.4 Can I freely copy DeSmuME ? o 7.5 Where can I report bugs? o 7.6 Can I attach files to bug reports I did not create myself ? o 7.7 What is 'TAS' ? o 7.8 What hardware features are emulated? o 7.9 Does the GDB stub still work? o 7.10 How do I enable the GDB stub on the Windows port ? o 7.11 Does compact flash works? o 7.12 Where/what is IRC? o 7.13 Where is the manual? o 7.14 Where is release 0.9.3? o 7.15 What is DLDI? o 7.16 How can I post a save file or AVI capture on the DeSmuME forum? o 7.17 How can I record an AVI with a gap between the screens? o 7.18 How can I post a large log or other text file on the DeSmuME IRC chat room? o 7.19 What are the origins of DeSmuME? * 8 SVN and Compiling o 8.1 Why doesn't the DeSmuME team release pre-build SVN binaries ? o 8.2 How do I get the latest svn code and build DeSmuME myself? o 8.3 What is 'SVN' ? o 8.4 What compilers are supported for building DeSmuME from source? o 8.5 I'm Compiling using MSVC Express On Windows, and I get the error : "ml.exe" not found. * 9 Development and Technical Questions o 9.1 I have a patch, modification or other code addition o 9.2 I'm a developer, and would like to contribute to the codebase. What can I do? o 9.3 Im not a developer, but would like to help out anyway. What can I do? o 9.4 What is this Lua stuff I see? o 9.5 How do I easily capture the ASM code for troubleshooting purposes? o 9.6 Where can I find technical details on the Nintendo DS and GBA? * 10 Mac Users o 10.1 Why can't I find a Mac binary? o 10.2 Why does my Mac binary say something about being unsupported? o 10.3 Why doesn't a menu option or tool exist in my Linux or Mac build? [edit] Release 0.9.4 Topics [edit] Using old DeSmuME save files in 0.9.4 DeSmuME will first try to load a dsv file. If the dsv is missing, it will try to load a sav and then it will immediately dump the dsv. The conversion process is supposed to be seamless. [edit] What is this NOSSE and dev stuff? / Why does desmume.exe crash when it loads? / Which EXE do I use? Use dev if you are a developer and want the gdb stub. Use nosse if the regular exe crashes for you because you are on an old computer. desmume.exe uses some SSE2 optimizations for 3D matrix calculations which have been disabled in desmume_nosse.exe. Any modern Intel CPU (AMD or intel) will support SSE2. [edit] Savegames and Savestates [edit] Why does this game fail to save? / I get the error "Data could not be accessed. Turn off the power and reinsert the DS card." or "Unable to write data. Please turn off the power and reinsert the game card." Until version 0.9.4 DeSmuME's save size autodetection was poor. With 0.9.4, autodetection should work almost all the time. In fact, here is the entire list of games we currently know of that fail to autodetect correctly: * Spider-Man 3 (should be autodetect_size=1, detected as 3) * Over The Hedge (should be autodetect_size=1, detected as 3; same failure mechanism) If you find any other game for which automatic savetype detection does not work, please let the developers know by posting on the forum or submitting a bug. If you want to fix it yourself, you may need to manually specify the correct save type for your game. Consult the manual for details on how to do this for your platform. You may also consult http://www.advanscene.com/ to easily identify the save type for your game. [edit] Why was the save file format and extension changed from .sav to .dsv ? Because it is better now. These raw save files that everyone uses aren't good enough and were causing problems with autodetection. See our bug tracker or forum for more details; the dsv format has been documented in the svn source tree as dsv.txt and if you don't like the degree of interoperability with other emulators, then go tell the other emulators to support our format. [edit] Can I use my save states across versions? Maybe, maybe not. Due to constant internal changes in DeSmuME, it is possible that a save state created with one version may not work with another version of DeSmuME. Savestate compatibility is preserved wherever possible, but it is not always possible. Please note that for easily confused gamers, the use of SAVESTATES is discouraged, as these are likely to break between emulator versions. Instead use SAVE FILES. These are likely to survive between emulator versions. This means that you will have to use save points within the game. SAVE FILES are stored in .dsv files. Also, see this article for further details : Savefile or savestate [edit] Can I convert an ideas or no$gba nocash .sav savefile to DeSmuME .dsv? 1. Convert the save file using http://shunyweb.info/convert.php ; the target format should be "Acekard RPG | EZFlash V | RAW Format [Autodetection] (.sav)" 2. Load the game. Let it get to the main menu 3. Select the correct backup size*, as specified by advanscene.com (which is not always right, by the way) 4. Use File > Import Backup Memory and pick the converted save file 5. Reset the game * Step 3 is not always necessary, if you are smart, however, it will never hurt to do it. [edit] How do I make Pokemon saves? Update to 0.9.4, which ensures the save type is detected automatically and correctly. [edit] Why can't Pokemon save after beating the elite 4? Your save file is 9KB. It should be 513KB. Your save file is broken due to you never having established the right savefile size. That means you made it all the way through the game without saving and then testing it by loading (which would not have worked, if you had tried it). See the above discussion for why that was a very bad idea. In 0.9.5+ or post-0.9.4 svn or 0.9.4+ rr builds you may see an option in the savetypes menu called FORCE AS CURRENT which, when used after picking the correct pokemon savefile size (4mbit) will hopefully permit subsequent saves to create a correct savefile. In order to do that youll have to load your savestate first. If you have been using 0.9.4, since savestate compatibility between versions is not warranted, and definitely won't work between 0.9.4 and 0.9.5, you'll have to use Gocha's 0.9.4+ build which is located at http://tasvideos.org/forum/viewtopic.php?p=210670 which will be able to load an 0.9.4 savestate. These instructions were not explicit enough for one user. In an effort to tailor this information to the intellectual capacity of the audience for this question, I will paste the instructions which apparently were simple enough for him to follow: go to the faq. follow the link to gocha's build. download gocha's build. load the savestate. set the size (4Mbit). use force as current. save the game. exit the emulator and verify that you can load the game from the savefile. if you can, then load it and play through to complete the game. [edit] Wi-Fi and WFC [edit] Does DeSmuME support wifi? Wifi is not supported. It is currently under slow and incomplete development. Therefore, you may find this option missing, or simply 'greyed-out' for now. Also, since WIFI support does not work yet, don't ask any questions about it's functioning because it still is unfinished and does not work yet. Furthermore, current development activities focus mainly on the Windows build. [edit] Why do I get an assert in wifi.cpp which keeps me from playing a game? This was a glitch in 0.9.2 release which was fixed in 0.9.4. [edit] If DeSmuME doesn't support wifi, then why does it make my firewall alert since 0.9.2? Your firewall is stupid, or winsock is stupid, (I am not sure which yet) for alerting just when winsock gets initialized. The emulator hasnt actually tried to connect to the internet yet. How could it? There isn't any wifi. All we are doing is some network initialization code. For those of you who are still not satisfied, then I will admit that there is actually some wifi code--but it doesn't actually do anything yet! Except alert your firewall. Sorry. Also, maybe that is actually a good, unobtrusive time for firewalls to alert. But I am not sorry for calling them stupid. They are hyperactive crybabies. [edit] Why did my build come with winpcap.dll? / Why do I get crashes when I run DeSmuME on vista which mention something about winpcap? Because you are running an unofficial build, from dubious origins, made by unknown people. The DeSmuME team cannot support builds it did not create itself. Therefore, you are advised to stop using unofficial builds, as you can expect no support from the DeSmuME team or on the DeSmuME forums. Only use builds you downloaded from the DeSmuME website. [edit] What is WFC / Nintendo WiFi Connection? See the article Nintendo wifi config utility for more information. [edit] Troubleshooting and Errors [edit] Help! My desmume window disappeared! Maybe I can hear sound and it is in the taskbar but I can't see the window Delete your ini file. This is caused by exiting the app while you have executed win+d show desktop mode. Desmume tries to remember the window position, but windows implements show desktop by setting the window position to something like x=-32000 and so that gets saved. There is supposed to be some code to handle that case, but I guess it is not working well. This is a problem in many windows apps and this solution will usually fix it. If you don't want to lose all the other settings in your ini file, poke around in it and find the offending items which should look like this: [Video] Window Size=0 Window width=0 Window height=0 WindowPosX=-32000 WindowPosY=-32000 Delete the -32000 items [edit] Does Scribblenauts work? It works in 0.9.4 but you must use external bios files and "emulate swi's with bios images". Speaking of work, it has come to my attention that several people worked for some years making this game. If that means anything to you people. [edit] How do I use external BIOS files or firmware? Config > emulation settings and supply the path. Do not ask us for BIOS files as we don't have them. It is only my psychic skills which enable me to know that this fixes Scribblenauts. Since the menu option doesn't exist in the OS X port, it is impossible to play scribblenauts on it. Like to MAC/OSX port, the Linux port(s) don't allow you to use external BIOS or Firmware files either. [edit] Why does my touch screen not work? Oh yes you did read my mind, I was using external firmware It's a bug. It is not a high priority since nobody yet has proven that they actually need the external firmware. If there was a way around it, I wouldve just told you. [edit] I have a gameplay related question Please check a site like http://www.gamefaqs.com, and don't post gameplay related questions on the forum or IRC *unless* you believe there is a bug in the emulation of DeSmuME. [edit] Why doesn't my DeSmuME play this game? Go to desmume.org and make sure you are using the latest version. The latest version is 0.9.4. Hint: DeSmuME 0.8 and 0.3.4 are very old, being numbers smaller than the latest version. Older versions will not be supported, under any circumstances. [edit] Why doesn't my game boot or progress into the main game engine? DeSmuME is not perfect yet. Some games may fail due to wifi emulation. You might find ways to patch the games to work better on emulators by searching on the internet, but that is not something you should seek help with on the DeSmuME forums. If it really doesn't boot up, you can submit a bug report for the game on the sourceforge bugtracker. [edit] Why does the emulator take a long time to start up and/or devastate my system or unarchiver when I run it? This is a problem with the DeSmuME 0.9.2 that some people impolitely distribute themselves. Redownload 0.9.2 from sourceforge.net or get a newer version. It isn't a virus or anything, it is a bug in the application that can just bring a system to its knees. It tries to allocate 1GB of virtual memory. This also crashes or freezes some virus scanners (I've seen it on AVG). [edit] Why doesn't OpenGL 3D work in Linux? Blame NVIDIA and ATI for putting out shoddy and/or closed source drivers. Then switch to software rasterizer. [edit] Why doesn't OpenGL 3D work in windows? You are probably using an ATI video card. ATI driver support of OpenGL is known to be poor. NVIDIA cards have a much more robust support of OpenGL, so getting one of those will help. Alternatively, you can switch to software rasterizer. [edit] My display is incorrect or corrupted or something is missing Try switching the 3D Renderer from OpenGL or SoftRasterizer, or vice versa, to see if that resolves the bug. In Windows, the default hotkey to do this quickly is numpad minus. [edit] My display has flickering graphics in a certain game In the 0.9.4 Windows port, you can choose 'Alternate Flush Mode' in the 'Config | 3D Settings' menu. This fixes some games with flickering graphics. This option is no longer necessary in 0.9.5. If you still have flickering graphics, find the discussion about frameskipping in this doc (try turning it off.) [edit] Why does music and FMV sound bad/distorted sometimes? Most DS music is sequenced music, loaded from the cart entirely when the level loads. This works mostly fine, but bonus points for you if your ears are good enough to spot the bugs. Your music that doesn't work well at all is probably streaming music, which loads from the cart on the fly and goes straight to the speakers, and possibly decoded along the way. This includes FMVs. This is much harder to emulate as it requires correct timing, which is not one of DeSmuME's strengths right now. At any rate, in 0.9.5 support for a synchronized SPU was added for the windows builds which can be optionally enabled to make these streaming sounds work correctly. Synchronizing audio is a hard problem to solve, and we're not finished solving it. The synchronous SPU comes with some other issues, which is why it is optional. Also available, if you are using the windows build, is a command from the menu Emulation > Shut Up to make the offending music go away. [edit] Performance [edit] Why is the emulator slow? Because nobody pays us to work on it full time and it runs fast enough for us to be happy. Well, almost. New releases may always be a step backwards in some (or many) cases from earlier releases in terms of speed. There is a delicate balance between compatibility and speed and sometimes one advances further than the other. At any rate, we have introduced a few speed hacks and toggles which you may find helpful: * (0.9.4) If you are in Windows, make sure you're not using the NOSSE build. That one is slower. * (0.9.5) If you are in Windows, try using the SSE2 build. It may be a little faster. * (0.9.5) If you are in linux, try making a build with SSE and SSE2 extensions enabled because the code is ready to handle it. Someone should provide details on how to do this. * If you are using someone else's unofficial "SVN" build, it probably is not fully optimized, since we make our Windows releases using some profiler-guided optimization, which helps by several FPS. For all I know, they are also carriers of viruses, and lately they tend to crash on Vista. * If you can handle it, turn off the sound. * Use frame skip. Even frameskipping by 1 will help and many games will stay playable. Frameskipping is continually tweaked in each release to get more bang for the buck, but beware that dual screen 3d games still may not work well under frameskip. If screens seem stuck, pick a different frameskip value. * (0.9.4+) In the sound options, set interpolation to none which should help a little bit. * (0.9.4 only) Turn on the sound option "ADPCM Caching"; this is new and experimental, and will break some things, but it should offer a substantial speedup in some cases. * (0.9.5+) Use dual/asynch SPU mode -- even if you turn off the sound. Try alternate synch methods if you must use synch spu mode. * (0.9.4+) There is now the option of disabling an entire screen. (Tools > View Layers > Main GPU, etc) Consider disabling a screen which is useless in the game you are playing. * Try the software rasterizer. In many cases, especially games which make only light use of the 3d hardware, this will actually run faster, by as many as 10 FPS. But it might also run slower, again, by as many as 10 FPS. * (0.9.5+) If you are using the software rasterizer, disable edge marking and fog if you feel like they aren't needed. If the game isn't using those features then this won't help. * Buying a newer, faster computer is somewhat more expensive, but it has other side benefits. * A faster CPU is more helpful than a bleeding edge graphics card. DeSmuME is more CPU intensive than it is GPU intensive. It just needs a graphics card that is glitch-free, and currently the NVIDIA cards have a better track record. A newer graphics card has a slim possibility of increasing speed. * The cheapest way to get 60fps is to buy the cart. You may find that this is not enough, and you need to buy a console as well. Here are some steps that have worked well for me in the past: o Look for neighbors that are mowing their own lawns. Ask them if they would like for you to do it instead. o Borrow your daddy's lawn mower and mow the neighbor's lawn. o After this, they will generally give you cash. As you repeat the above steps, this cash can accumulate to large values. o Once the accumulated cash is sufficient, it can be taken to a merchant where it can be exchanged for games and consoles. * My lawn needs mowing. It wont make your game run any faster if you mow it for me, but I am less likely to get evicted, which would be bad for my productivity. [edit] Does DeSmuME make use of multiple CPU's or multiple cores? Currently, the Windows port has two particular multicore optimizations (in 0.9.5+): first, the display logic runs in its own thread independent from the emulator. This is used to make the OSD run frame-rate independent from emulation. This thread performs color conversion, filtering, and directdraw presentation. The net result is a speedup by a few FPS. This codepath is disabled on single core systems, and may be disabled forcefully by the user with the --num-cores=1 command line argument. Second, the software rasterizer will run in a SLI mode using as many cores as you have specified (or have been detected) up to four. Still, DeSmuMe benefits MUCH more from a single CPU with a higher GHz than from multiple cores or from multiple CPUs. [edit] In 0.9.4, what does the number/percentage in the DeSmuME title bar mean * For the Windows port, the percentage is the emulated ARM9 CPU load average. The CPU in an actual Nintendo DS is an ARM9 CPU. The percentage shows us how busy the emulated CPU is. This number isnt really for you. You are far too curious. But go ahead and brag about how emulated games run at 99% on your system, it makes us laugh. * For the Linux GTK and Glade ports, it's frames per second (fps). [edit] In 0.9.5, what does the percentage in the FPS display mean See above, it was moved here to save 915 million people from asking what it means in the title bar. [edit] Why are there Two/Numbers in the FPS display? The first is your actual FPS which is how fast the emu is running on your system. If it is less than 60 then you need speed hacks or more a more powerful CPU. The second is the 3d FPS, which is a rough gauge of how fast the game is supposed to be running. If you are seeing 60/15 then the game will feel slow because it is sloppily coded but theres NOTHING YOU CAN DO ABOUT IT short of turning off speed throttling and playing at 100fps. [edit] Using The Emulator [edit] What are the minimum hardware requirements for DeSmuME ? From a purely technical viewpoint, there are no minimum requirements. However, for 'real-world' playable speeds, you would need at least the following : * Windows OS: Windows XP or Vista * Linux OS: Any recent Linux distribution with a 2.6 kernel. * 2 GHz Processor * 512 MB Available System Memory * Available Hard Drive Space: A few MB for the emulator * 128 MB 3D Video Card (Nvidia GeForce 6800 or better), ATI cards are not recommended. * Optional: Sound Card, if you want sound support * Optional: Microphone, if you wish to make use the Windows Microphone feature [edit] What are the recommended hardware requirements for DeSmuME? From a purely technical viewpoint, there are no recommended requirements. However, for 'real-world' playable speeds, the following gives you good performance: * Windows OS: Windows XP or Vista * Linux OS: Any recent Linux distribution with a 2.6 kernel. * 3 GHz Processor * 1 GB Available System Memory * Available Hard Drive Space: A few MB for DeSmuME, 100MB or so for a bunch of savestates and savefiles. * 512 MB 3D Video Card (Nvidia GeForce), ATI cards are not recommended. * Sound Card. * Microphone. In general, the more GHz, the better. The faster memory, the better. DeSmuME 0.9.4 won't benefit from multiple cores. DeSmuME is at the moment, unfortunately, slower than no$gba. [edit] It is hard to zoom in on a widescreen display due to the unusual aspect ratio of the DS In fact it is hard to zoom in on a 4:3 screen, too. In 0.9.5, you can configure the screens to be side-by-side, so maybe this will make you happy. Additionally you can choose to display only one screen. I don't think anyone wants to add tear-apart windows, though. [edit] But will you please add screen splitting / window tearing apart / fullscreen modes? You think youre the first person to have thought of this? The answer is no. Of all the things in the world to code, we hate this the most. [edit] How do I enter 'cheat codes' in DeSmuME? As of 0.9.4, there are two types of cheat codes: Action Replay and 'raw' or 'internal' cheats. The 'raw' or 'internal' cheats include cheat-finding facilities where you may manually search for and alter the memory positions which work to your advantage. There's an excellent article on 'raw' or 'internal' cheats in the wiki on Using Cheats in DeSmuMe . For Action Replay Cheats, You can find codes for the NTSC games at http://us.codejunkies.com/Departments/DS-and-GBA.aspx and for the PAL at http://uk.codejunkies.com/Departments/DS-and-GBA.aspx. [edit] I entered a 'cheat code', and now the emulator freezes. Most likely it's a problem from the (Action Replay) cheat code you used. Using codes modify the game and can make it crash/freeze if it comes to an unexpected situation. It just depends on the code you use and what it's used for in the game. Find the .dct file in your emulator's folder that matches the game's filename, and then erase it to solve the 'freezing' problem. [edit] Does DeSmuME support the microphone? Yes, but only on the Windows and GNU/Linux ports. You do need to have an actual microphone attached to your PC, though. In 0.9.2 the microphone in Windows really only works for noise, but this was fixed in 0.9.4; it was fixed even further in 0.9.5. Linux support will exist in 0.9.5+ -- please note that it requires libasound. When in windows, if it seems that the microphone is not working, bear in mind that it has no idea what kind of how many microphones you have. You will need to use the windows control panel to specify the correct microphone as the default audio input device, and then make sure in the recording level properties (volume control) that it is selected and at an appropriate volume. [edit] Does the 'GBA slot' option let me play GBA games? No. A 'real' DS can use the gba slot to play gba games, but DeSmuME does not emulate this. But a 'real' DS can also use the gba slot to access gba roms and sram so that ds games can import savefiles, and that part is emulated by DeSmuME. (please note that in 0.9.4 this is reportedly buggy for some games, including pokemon; this is supposed to have been fixed in 0.9.5) If you are looking for a Game Boy Advance (GBA) emulator, perhaps you can try mednafen or VisualBoy Advance. [edit] How do I "Close the DS"? This can be done using the 'lid' command or BACKSPACE key (this can be changed in the control configuration). [edit] How do I use the stylus (pen) to 'touch' the screen? You can use your mouse to emulate the stylus. Move the mouse cursor to the desired position, and then press the left mouse button in order to 'touch' the screen at the position the mouse cursor is located. Yes, we have really been asked this question before. [edit] How can I touch two points on the screen at once, as required by Hotel Dusk? One user got past this by first switching on one of the switches, then pausing the game, and sort of switching on an imaginary switch in the middle of the two switches while manipulating the frame advance hotkey. See, gbatek says that when two points are touched, that the hardware appears as if the average of the two points is actually pressed. But the game expects you to touch them at not-exactly-the-same-time. [edit] General Questions [edit] What does DeSmuME emulate and on what systems? DeSmuME attempts to emulate, as faithfully as possible, the Nintendo DS and Nintendo DS Lite handheld game consoles (NDS). It currently runs on Windows, Linux, and mac OSX. DSi is not supported. [edit] What does DeSmuME mean? DeSmuME is a Nintendo DS emulator and the name is a play of words - DS Emu + ME (like FlashMe - firmware hack and PassMe mod-chip for DS) The name DeSmuME derives from the popular use of ME in Nintendo DS products by homebrew developers. So DeSmuME would equal DSemuMe. Other popular uses of ME include: * LoadMe - a generic patcher for commercial DS roms that works with any GBA Flash Card * PassMe - "mod-chip" using which takes authentication from an original DS card an allows execution of unauthenticated DS rom code - from the GBA cartridge slot / GBA flash card. * FlashMe - a hacked firmware for DS that allows you to start code in DS mode from a flash card in the GBA slot. * WifiMe - are a set of a custom drivers and software by FireFly for RALink based wireless network cards enabling to boot homebrew code on DS via Nintendo Wireless Multiboot method. Its name is derived from emu which is short for emulator, DS and me. It's possibly supposed to mean "DS emulator for me". [edit] Under what license is DeSmuME distributed ? DeSmuME is distributed under the GNU General Public License, or GPL: http://www.gnu.org/licenses/gpl-2.0.html [edit] Can I freely copy DeSmuME ? Yes you can, as long as you adhere to the license as specified in the GNU GPL. [edit] Where can I report bugs? In the official bug tracker. Feel free to post to the bug tracker as long as you are willing to take ownership of testing that bug and letting the developers know when it is resolved to your satisfaction. Just don't submit a bug report and run. You may also request features around the same location, too, but in the other trackers. [edit] Can I attach files to bug reports I did not create myself ? SourceForge likes for folks to only respond on items they submit. If you see a ticket that represents something you are encountering, SourceForge doesn't necessarily want you commenting on that. The reasoning for this given by SourceForge is that they feel it is best to open your own ticket, which helps appreciate the extent of issues in many cases. The authors of DeSmuME may or may not agree with this point of view from SourceForge. [edit] What is 'TAS' ? TAS lets you record the gameplay in TAS format, see http://tasvideos.org for details on TAS (tool-assisted speedruns). [edit] What hardware features are emulated? * All known 2D graphics features are correct. Mosaics work but are imperfect. There may be small issues with colors as the correct color bit depths are not used at all points in the pipeline. * All 3D features are emulated, except the following: wireframes and antialising. In 0.9.5, support for fog is added, as well as edge marking which mostly-works but is not perfect. In 0.9.5 the box test was significantly improved (dare I say perfected?) which fixed a number of games. The OpenGL engine is near its limit and renders some things incorrectly. Eventually the software rasterizer will support more features and be far more precise in the basic features. Both engines have trouble with some shadows, but software rasterizer is better. Software rasterizer has some noticeable texturing issues right now, especially in 2d games. Software rasterizer supports more correct lighting interpolation than opengl ever will (e.g. glitches at the edge of the screen while scrolling.) In software rasterizer, there are issues similar to 2d with incorrect bit depth being used in the pipeline. There are unfavorable edge conditions in each renderer; in OpenGL, textures tend to get overdrawn; in software rasterizer, edges of textures tend to be jittery (like the real DS) One last thing -- if buttons and labels and menus rendering on the 3d screen are obscured (for example, a button but no label is on it) then you may need to use the software rasterizer. Or you may need to use OpenGL instead. Each renderer has strengths and weaknesses, which is why both are provided. * All sound features are emulated. The microphone support is new and the manual should be consulted, where you will find out, among other things, that it is only supported in windows right now. * Wifi is not supported. It is currently under slow and incomplete development. Therefore, you may find this option missing, or simply 'greyed-out' for now. Also, since WIFI support does not work yet, please don't ask any questions regarding it, because it still is unfinished and does not work yet. * We are unaware of any outstanding issues in the core system hardware (CPU, DMA, MMU) but there are certainly still some. The instruction and memory timings are quite incorrect; however, this seems not to hurt most titles. * DLDI - Dynamically Linked Driver Interface, commonly known as DLDI, is a driver framework that allows NDS and GBA homebrew to easily read and write to any number of different devices, just by substituting a driver file. The MPCF driver (GBA MoviePlayer CF-version) is the only one that is supported, so you will need to install it into your application before using it in desmume. You will find that a directory or fat image must be mounted via the commandline or UI for the "gbaslot" configuration. Right now, our codebase really only has libfat support for SLOT-2 devices and CF devices so more thorough support for other DLDI drivers is unlikely at this time. * RTC (real-time clock) works; If it didn't, then the time in your games stays at 00:00:00, and your random number values always come up the same. [edit] Does the GDB stub still work? It seems as if it works in 0.9.4, tested with the Insight GDB variant on windows with a recent devKitPro. This support has been compiled into the dev+ build. [edit] How do I enable the GDB stub on the Windows port ? Add #define GDB_STUB to src/windows/userconfig/userconfig.h which you have created according to the instructions in src/windows/defaultconfig/userconfig.h ; sorry for this confusing system, but that's how it is for now. [edit] Does compact flash works? In 0.9.2+ it works, somewhat buggily, at least for directory scanning (i.e. not fat16 image) in windows via the gba slot. There is a bug that breaks it in linux, which has been fixed for 0.9.5+ along with some other work on that system. [edit] Where/what is IRC? IRC is an on-line communication system. data you need: * server: irc.freenode.net * port: 6667 * channel: #desmume what to use: * mIRC - Windows * ChatZilla - FireFox add-on * xchat - X * plenty other, see wikipedia Language: * Most of the people on the channel speak, or try to speak the English language. [edit] Where is the manual? A manual for DeSmuME is over at http://wiki.desmume.org/index.php?title=Manual. It may not have the information that other entries in this FAQ promised that it would. [edit] Where is release 0.9.3? Who cares? 0.9.4 is out now. DeSmuME 0.9.3 does not exist. It was sneaked out of our staging area. It has bugs, which is why we hadn't released it yet. So we decided not to release it at all. Any release claiming to be 0.9.3 won't be supported. [edit] What is DLDI? DLDI is a patching system for homebrew ROMs using libfat which makes DS homebrew much easier to write and much more user friendly. As you may know, there are many various flash cartridges for DS. These 'flashcarts' use different hardware, so to make a program run on all cards, you’d have to write support for each and every card into the program. But no-one needs support for any other cards than their own. So a libfat developer, chism, developed DLDI. The program itself knows nothing about the hardware. However, when a “DLDI patch” is applied, libfat can use this patch to know how to write to the flashcart. So, if one user has an M3 flashcart, and downloads a program, they could patch it with the M3 DLDI patch and the program would work with it. Then, another user with a Supercart could download it, apply the Supercard DLDI patch, and it would work on their flashcart, too. The same patch should let the flashcart work with any libfat based program. [edit] How can I post a save file or AVI capture on the DeSmuME forum? After you created it, you can upload it to a free external service provider like MediaFire (http://www.mediafire.com/), and then put the provided links to the page in the message you post on the forum. [edit] How can I record an AVI with a gap between the screens? Learn how to use virtualdub and avisynth. Then use the following avisynth script which we have developed for this purpose: ####configuration#### gap = 64 #color = $aaaaaa #color = $000000 color = $ffffff ################## A = AviSource("c:\ds.avi", pixel_type="RGB32") B = AviSource("c:\ds.avi", pixel_type="RGB32") C = blankclip(fps=A.FrameRate, width=256, height=192+gap+192, color=color, length=A.FrameCount) A = A.crop(0,0,256,192) B = B.crop(0,192,256,192) D = overlay(C,A) D = overlay(D,B,0,192+gap) return AudioDub(D,A) We really don't want to put any smarts into the desmume avi dumper, preferring to do it with avisynth instead. It is a slippery slope, as there are about 50 things that people want avi dumpers to do and theyre better off learning how to do it outside the emu with other tools. To that end, if you have any particular needs regarding this do not hesitate to post in our forum and maybe we'll help you make a new avisynth script. [edit] How can I post a large log or other text file on the DeSmuME IRC chat room? Make use of an external text storage site, such as 'pastebin' (http://pastebin.com/), and post the url to it on the IRC channel. [edit] What are the origins of DeSmuME? DeSmuME is a freeware emulator for the Nintendo DS originally created by YopYop156. The original website was http://yopyop156.ifrance.com Due to change in French laws regarding emulation YopYop decided to stop development of DeSmuME. However, he released the source under the GPL, and other programmers have picked it up and kept it under active development. Yopyop said: It’s release under GPL. I have just removed the new 3D engine because it’s too much bugged. Hopefully it will be helpful for some of you. The latest statement heard from yopyop was: DeSmuME project is over. You may don’t know but there are a new law in France that could put me in big trouble. With DeSmuME, I have closed the doors of game company but I can not offer to pay for it. The worst thing is that I have found the bad coded instructions. For those how have download the sources you have to look in sbc, rsbc instructions the Carry flag updating is wrong. Sorry for the home brew programmers. For the illegality the demonstration seemed to me convincing thus without proof clarify I prefer to stick to this decision. It is also the fact that few people seem interested by the project. Put besides some people who sent demonstrations to me which did not go, I received only malls to wonder to make function such or such plays or to ask me why moved is in French . Thus I will not do something of useless and illegal. For the site it would not obstruct me if there were not the bond on the left which does nothing but add to confusion on the goal of the project. And for the sources it is the same problem as for the project. good week end yopyop edit the law relates to the royalties and the rights close, not? [edit] SVN and Compiling [edit] Why doesn't the DeSmuME team release pre-build SVN binaries ? Because the DeSmuME team doesn't have trusted people to make the builds, and don't want to get involved on builds that could include whatever the author wants. Every newbie coder could do a version that, after 10 minutes of gameplay, for example, starts corrupting stuff from the hard disk. Also, anyone incapable of building it's own builds, probably isn't very helpful for submitting bug reports or helping the development team on SVN releases, so there isn't much point on them getting a SVN build. [edit] How do I get the latest svn code and build DeSmuME myself? Please check out the instructions related to your platform, over at Installing DeSmuME from source [edit] What is 'SVN' ? svn is a developers tool. It's used to let multiple developers work on the same codebase without conflicts. If youre an end-user, don't worry about it. And if you're a developer, see the question on how to get the latest svn code and build DeSmuME yourself. See wikipedia for more info [edit] What compilers are supported for building DeSmuME from source? * At the moment, for Windows Microsoft Visual C++ 2005 and 2008 are the only supported compilers. Dev-C++ is not supported. Microsoft's Visual C++ Express is free to install and use, so there's no reason not to use it. * For Linux, any recent version of GCC and toolchain should work. [edit] I'm Compiling using MSVC Express On Windows, and I get the error : "ml.exe" not found. ml.exe was not included in earlier downloads of MSVC++ 2008 Express Edition. Uninstall, redownload and install again. 'ml.exe' shoud be located in the "Microsoft Visual Studio 9.0\VC\bin" directory. [edit] Development and Technical Questions [edit] I have a patch, modification or other code addition Please add them to the appropriate sourceforge tracker. Patches go to the 'Patches' tracker : http://sourceforge.net/tracker/?group_id=164579&atid=832293 [edit] I'm a developer, and would like to contribute to the codebase. What can I do? To start you off in the right direction, the best thing you can do is join the developer team on IRC and discuss your intentions with the developers. [edit] Im not a developer, but would like to help out anyway. What can I do? The most helpful thing you can do is use DeSmuME, learn its ins and outs, and learn how to compile svn builds. Then monitor it for regressions and report bugs. You can patrol the bug tracker for bugs which could use elucidation or which, based on your awareness of how the emulator is changing, might be fixed without us having specifically addressed the bug. Basically, be a super user. And hang out on irc. Also, adding to or perfecting the documentation in the wiki is useful. You could also watch for and answer questions placed on the DeSmuME forum. [edit] What is this Lua stuff I see? It is sort of a macro language for interacting with the running game software. Here is an example of it working with an NES game in another emulator, and youtubing for "fceux lua" should suffice to explain it if you don't get the picture from this url: http://www.youtube.com/watch?v=1XNTjVScm_8 [edit] How do I easily capture the ASM code for troubleshooting purposes? Savestate during the problem or just before your problem occurs, and #define WANTASMLISTING in armcpu.cpp. Recompile. Then redirect stdout to a file. I know it isn't easy but its what we have for now. A newer, and possibly better way, is to search for LOG_ARM9 in ndssystem.cpp and uncomment it. You will also need to trigger the condition for logging by setting dolog=true. Beware that this is very verbose, and can dump around 100MBytes of logs per frame. [edit] Where can I find technical details on the Nintendo DS and GBA? http://nocash.emubase.de/gbatek.htm [edit] Mac Users [edit] Why can't I find a Mac binary? Maybe we haven't made it yet. There aren't a lot of people willing to compile Mac software. Just to be sure, go to https://sourceforge.net/project/showfiles.php?group_id=164579&package_id=186413 [edit] Why does my Mac binary say something about being unsupported? You have probably downloaded the i386 version of DeSmuME for MAC, and are running on the PPC platform (or the other way around). Please verify if you're running on Intel (i386) hardware, or on PPC (G4, G5) hardware, and download the appropriate binary. [edit] Why doesn't a menu option or tool exist in my Linux or Mac build? Because making portable tools and platform harnesses are not our cup of tea and so a developer puts a feature into whichever ports he cares about. This policy is never going to change, although some features might migrate to other platforms over time. Better check the manual. Retrieved from "http://wiki.desmume.org/index.php?title=Faq" This page was last modified on 21 November 2009, at 21:55. desmume-0.9.11/AUTHORS0000755000000000000000000000111212467662066013024 0ustar rootrootOriginal author --------------- yopyop Current team ------------ Guillaume Duhamel Normmatt Riccardo Magliocchetti CrazyMax zeromus rogerman Luigi__ Contributors ------------ Bernat Muñoz (shash) Allustar amponzi Anthony Molinaro ape Damien Nozay (damdoum) delfare Romain Vallet snkmad Theo Berkau thoduv Tim Seidel (Mighty Max) Pascal Giard (evilynux) Ben Jaques (masscat) Jeff Bland Bernat Muñoz (shash) matusz nitsuja gocha pa__ adelikat hi-coder WinterMute pengvado dormito ldesnogue mtheall thelemonman nash679 pokefan999 dottorleo desmume-0.9.11/README.LIN0000755000000000000000000001374512467662066013274 0ustar rootroot DeSmuME _________________________________________ Copyright (C) 2006 yopyop Copyright (C) 2006-2007 DeSmuME team 1) Compiling instructions...................................13 2) How to use DeSmuME.......................................53 3) Contact information......................................142 4) Disclaimer...............................................160 1 Compiling instructions______________________________________ DeSmuME is written in C using the gtk+ and SDL libraries. So you need a working C compiler, such as gcc and the following libraries runtime and development packages: * http://www.gtk.org * http://www.libsdl.org/ Once these libraries are installed, you should be ready to install DeSmuME. DeSmuME provides another interface based on libglade, to use it, you'll need glade: * http://glade.gnome.org/ 1.1 From a release archive____________________________________ Uncompress the DeSmuME archive, move to the newly created directory, type "./configure", then "make". It will generate three programs: 1) "desmume" in the "src/gtk" directory; 2) "desmume-cli" in the "src/cli" directory. If glade is installed on your system, you'll get a third binary: 3) "desmume-glade" in the "src/gtk-glade" directory. You can even type "make install" to install those programs on your system (in /usr/local/ by default), then uninstalling is done by typing "make uninstall". 1.2 From a CVS copy___________________________________________ Move to the toplevel directory (the one that contains the configure.ac file). Type "./autogen.sh" to generate the configure/install scripts and needed Makefiles. Then you can follow the same procedure as in 1.1 . intltoolize is required for the autogen stage: * http://freedesktop.org/wiki/Software/intltool/ 2 How to use DeSmuME__________________________________________ There are three versions of DeSmuME under Linux. These are a Gtk+ build, a Glade build and a CLI SDL build. All these builds have some common command line options: --disable-limiter Disables the 60 fps limiter --soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port --cflash=PATH_TO_DISK_IMAGE Enable disk image GBAMP compact flash emulation --help Display this message NOTE: The Gtk+ and Glade builds use gtkGLext to handle the OpenGL rendering and contexts. You may get improved performance by also passing the argument --gdk-gl-force-indirect. This has been seen to improve things for Nvidia based graphics cards under Linux. GDB Debugger Stubs: Source level debugging of ARM9 and/or ARM7 code is supported using a GDB/Insight debugger. The GDB stubs are enabled from the command line using the following options: --arm9gdb= (for the ARM9) --arm7gdb= (for the ARM7) The PORT_NUM is the TCP port upon which the stub will listen for connections. Once enabled you can connect to the stub using the following command at the GDB debugger prompt (assuming GDB and DeSmuME are running on the same machine): target remote : NOTE: there are problems with the ARM support when stepping code with GDB versions prior to version 6.6. It is recommended that you use at least version 6.6 if possible. GBAMP compact flash emulation: The default behaviour of DeSmumME is to attempt to emulate the FAT image for the contents of the directory where the running .nds file was located. This behaviour can be altered using the --cflash= command line option. Using this option DeSmuME will emulation a GBAMP and read and write sectors from/to the disk image file. The disk image file must be created and populated with files using some external tool. NOTE: currently if desmume fails to open the disk image file it will silently continue minus a working GBAMP emulation. 2.1 Gtk+ version______________________________________________ Type "desmume" in a shell, a window should appear, then open a rom file using the "open" button, next use the "run" button to start emulation. The following command line options are specific to the Gtk+ build: --opengl-2d Enables using OpenGL for screen rendering --disable-sound Disables the sound emulation --disable-3d Disables the 3D emulation 2.2 CLI SDL version_______________________________________________ Just type "desmume-cli path-to-a-rom" in a shell. The following command line options are specific to the CLI build: --opengl-2d Enables using OpenGL for screen rendering --disable-sound Disables the sound emulation 3 Contact information_________________________________________ General inquiries should go to: E-mail: guillaume@desmume.org Linux Port-related inquiries should go to: E-mail: guillaume@desmume.org Web: http://desmume.org Please don't ask for roms, bios files or any other copyrighted stuff. If you want to submit a bug report, please run desmume, go into the "Help" menu, and click on "Submit a bug report". If you're having trouble with it, please feel free to email. 4 Disclaimer__________________________________________________ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the GNU General Public License details in COPYING. desmume-0.9.11/autogen.sh0000755000000000000000000000056612467662066013766 0ustar rootroot#!/bin/sh # intltoolize is optionnal as it's only required for the gtk-glade UI. if test ! "x$(which intltoolize)" = "x"; then echo "Running intltoolize" intltoolize --copy --force --automake else if test ! "x$(which gintltoolize)" = "x"; then echo "Running gintltoolize" gintltoolize --copy --force --automake fi fi autoreconf --install --force --verbose desmume-0.9.11/autopackage/0000755000000000000000000000000012467663412014236 5ustar rootrootdesmume-0.9.11/autopackage/default.apspec.in0000755000000000000000000000152012467662066017471 0ustar rootroot# -*-shell-script-*- [Meta] RootName: @desmume.sf.net/desmume:$SOFTWAREVERSION DisplayName: DeSmuME Nintendo DS Emulator ShortName: desmume Maintainer: Guillaume Duhamel Packager: Guillaume Duhamel Summary: DeSmuME is a Nintendo DS emulator. URL: http://desmume.sf.net/ License: GNU General Public License, Version 2 SoftwareVersion: @VERSION@ AutopackageTarget: 1.0 [Description] This is a Nintendo DS emulator. [BuildPrepare] prepareBuild [BuildUnprepare] unprepareBuild [Imports] echo '*' | import [Prepare] # Dependency checking require @gtk.org/gtk 2.4 [Install] # Put your installation script here installExe bin/desmume installExe bin/desmume-cli installExe bin/desmume-glade [Uninstall] # Usually just the following line is enough to uninstall everything uninstallFromLog desmume-0.9.11/install-sh0000755000000000000000000003325612467662234013770 0ustar rootroot#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: desmume-0.9.11/dsm.txt0000755000000000000000000001054112467662066013306 0ustar rootrootDSM is ascii plain text. It is derived from the FCEUX FM2 format. It consists of several key-value pairs followed by an inputlog section. The inputlog section can be identified by its starting with a | (pipe). The inputlog section terminates at eof. Newlines may be \r\n or \n Key-value pairs consist of a key identifier, followed by a space separator, followed by the value text. Value text is always terminated by a newline, which the value text will not include. The value text is parsed differently depending on the type of the key. The key-value pairs may be in any order, except that the first key must be version. Integer keys (also used for booleans, with a 1 or 0) will have a value that is a simple integer not to exceed 32bits - version (required) - the version of the movie file format; for now it is always 3 - emuVersion (required) - the version of the emulator used to produce the movie - rerecordCount (optional) - the rerecord count - romChecksum (optional) - the CRC32 of the rom used to make the movie. should match values specified on advanscene.com - romSerial (optional) - a concatenation of other uniquely identifying information about the rom (name,gamecode,makercode) - useExtBios (optional) - were bios files was used? defaults to false. - swiFromBios (optional) - were swi emulated by ExtBios? (alternative is internal HLE bios). defaults to false. The rom identification information may be used at a later point to warn about mismatches between movies and roms, but is not right now. String keys have values that consist of the remainder of the key-value pair line. As a consequence, string values cannot contain newlines. - romFilename (required) - the name of the file used to record the movie - comment (optional) - simply a memo. by convention, the first token in the comment value is the subject of the comment. by convention, subsequent comments with the same subject will have their ordering preserved and may be used to approximate multiline comments. by convention, the author of the movie should be stored in comment(s) with a subject of: author Hex string keys (used for binary blobs) will have a value that is like 0x0123456789ABCDEF... - romChecksum (required) - this is currently unused. GUID keys have a value which is in the standard guid format: 452DE2C3-EF43-2FA9-77AC-0677FC51543B - guid (required) a unique identifier for a movie, generated when the movie is created, which is used when loading a savestate to make sure it belongs to the current movie. The inputlog section consists of lines beginning and ending with a | (pipe). The fields are as follows, except as noted in note C. |c|.............XXX YYY Z| 'R','L','D','U','T','S','B','A','Y','X','W','E','G' field c is a variable length decimal integer which is a bitfield corresponding to miscellaneous input states which are valid at the start of the frame. Therefore, no miscellaneous commands is represented by a value of 0. Here are the currently defined bit values: 0x01 - Microphone Noise (hardcoded noise sample; to be held through duration of frame) 0x02 - Reset 0x04 - Lid the format of the main section is as follows: the field begins with 13 characters which constitute a bitfield. any character other than ' ' or '.' means that the button was pressed. by convention, the following mnemonics will be used in a column to remind us of which button corresponds to which column: RLDUTSBAYXWEG (Right,Left,Down,Up,sTart,Select,B,A,Y,X,lshoulder,rshoulder,debuG) This ordering is based on FCEUX to a certain extent, and arbitrary after that. W and E were chosen for shoulders to suggest West and East for Left and Right. While the emulator supports a 'lid' button, and to some extent a 'blow' button, these are not supported in the movies. XXX: %03d, the x position of the stylus (0,0 topleft, 255,191 bottomright) YYY: %03d, the y position of the stylus Z: %1d, 1 if the stylus is pressed pressed; 0 if not Additional fields after this main section may be added later without breaking the file format. * Notes * A. There is no key-value pair that indicates the length of the movie. This must be read by scanning the inputlog and counting the number of lines. B. All movies start from power-on. C. The emulator uses these framerate constants arm7_cycles_per_frame = 560190 frames_per_second = 59.8261 desmume-0.9.11/COPYING0000755000000000000000000004325412467662066013024 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. desmume-0.9.11/README0000755000000000000000000000740112467662066012643 0ustar rootroot DeSmuME _________________________________________ Copyright (C) 2006 yopyop Copyright (C) 2006-2015 DeSmuME team Last Updated: March 28, 2015 Contents: 1) About ................................................................... 14 2) Credits ................................................................. 59 3) Contact Information ..................................................... 72 4) License ................................................................. 82 1) About ______________________________________________________________________ DeSmuME is software that allows you to emulate a Nintendo DS system. Think of it as a Swiss-Army knife for Nintendo DS emulation, giving you access to many powerful tools for testing DS features, from viewing ROM properties to managing Action Replay cheats. And best of all, this software is completely free and open-source. For information on how to install or operate DeSmuME for your operating system, please see the README file that should be present with your installation. Port-specific README files: * README.LIN for the Linux port * README.WIN for the Windows port * README.MAC for the Macintosh port Note that each DeSmuME port may have a different feature set from another port. You may see more feature parity between ports over time as we continue developing DeSmuME. You can find our documentation on our online Wiki page. The major pages of interest are: * Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page This is the main Wiki page that contains all of our official documentation. * Manuals: http://wiki.desmume.org/index.php?title=Manual The manuals contain detailed information about how to operate DeSmuME for each port. * FAQ: http://wiki.desmume.org/index.php?title=Faq The Frequently Asked Questions (FAQ) page has a lot of useful general information about DeSmuME. Do note that some of the information may be platform specific, and may not directly apply to your version of DeSmuME. * Build Instructions: http://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source This page contains detailed port-specific instructions about how to make your own build of DeSmuME directly from the source code. 2) Credits ____________________________________________________________________ See the AUTHORS file for list of DeSmuME team members. Special thanks go to: * yopyop (original author of DeSmuME), for releasing the source code of this great emulator. * Martin Korth (author of GBATEK), for his well-written Gameboy Advance and Nintendo DS documentation. 3) Contact Information ________________________________________________________ Official Website: http://desmume.org Public Forum: http://forums.desmume.org Developer Chat: irc://irc.freenode.net/desmume Bug Reports: http://sourceforge.net/p/desmume/bugs Please don't ask for ROMs, BIOS files, or any other copyrighted stuff. 4) License ____________________________________________________________________ This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . * See the GNU General Public License details in COPYING. desmume-0.9.11/config.guess0000755000000000000000000012743212467662234014304 0ustar rootroot#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: desmume-0.9.11/Makefile.am0000755000000000000000000000022212467662066014011 0ustar rootrootEXTRA_DIST = README.LIN README.MAC README.WIN dsm.txt dsv.txt autogen.sh \ $(PO_FILES_IN) DISTCLEANFILES = $(PO_FILES) SUBDIRS = $(PO_DIR) src desmume-0.9.11/configure0000755000000000000000000110434612467662233013672 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for desmume svn. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='desmume' PACKAGE_TARNAME='desmume' PACKAGE_VERSION='svn' PACKAGE_STRING='desmume svn' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS USE_MAINTAINER_MODE MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE HAVE_GDB_STUB_FALSE HAVE_GDB_STUB_TRUE PO_DIR UI_DIR X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF HAVE_JIT_FALSE HAVE_JIT_TRUE MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES CATOBJEXT CATALOGS MSGFMT_OPTS GETTEXT_PACKAGE HAVE_LIBSOUNDTOUCH_FALSE HAVE_LIBSOUNDTOUCH_TRUE LIBSOUNDTOUCH_LIBS LIBSOUNDTOUCH_CFLAGS HAVE_LIBAGG_FALSE HAVE_LIBAGG_TRUE LIBAGG_LIBS LIBAGG_CFLAGS HAVE_ALSA_FALSE HAVE_ALSA_TRUE ALSA_LIBS ALSA_CFLAGS HAVE_LUA_FALSE HAVE_LUA_TRUE LUA_LIBS LUA_CFLAGS UPDATEDESKTOP GTKGLEXT_LIBS GTKGLEXT_CFLAGS GLADEUI_UNINSTALLED_DIR LIBGLADE_LIBS LIBGLADE_CFLAGS GTHREAD_LIBS GTHREAD_CFLAGS GTK_LIBS GTK_CFLAGS GLIB_LIBS GLIB_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG HAVE_OPENAL_FALSE HAVE_OPENAL_TRUE HAVE_GL_GLX_FALSE HAVE_GL_GLX_TRUE HAVE_LIBOSMESA_FALSE HAVE_LIBOSMESA_TRUE GLX_LIBS OSMESA_LIBS HAVE_GL_FALSE HAVE_GL_TRUE SDL_LIBS SDL_CFLAGS SDLCONFIG DATADIRNAME ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE AM_DEFAULT_VERBOSITY INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC RANLIB am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM desmume_arch host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_nls enable_osmesa enable_glx enable_hud enable_openal enable_glade enable_wifi with_x enable_gdb_stub enable_hardcore enable_debug enable_gpu_debug enable_div_debug enable_sqrt_debug enable_dma_debug enable_maintainer_mode ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GLIB_CFLAGS GLIB_LIBS GTK_CFLAGS GTK_LIBS GTHREAD_CFLAGS GTHREAD_LIBS LIBGLADE_CFLAGS LIBGLADE_LIBS GTKGLEXT_CFLAGS GTKGLEXT_LIBS LUA_CFLAGS LUA_LIBS ALSA_CFLAGS ALSA_LIBS LIBAGG_CFLAGS LIBAGG_LIBS LIBSOUNDTOUCH_CFLAGS LIBSOUNDTOUCH_LIBS XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures desmume svn to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/desmume] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of desmume svn:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-nls do not use Native Language Support --enable-osmesa use off-screen mesa --enable-glx use hw accelerated rendering --enable-hud Enable HUD rendering, requires libagg --enable-openal enable experimental OpenAL microphone input --enable-glade enable glade frontend --enable-wifi enable experimental wifi comm support --enable-gdb-stub enable gdb stub --enable-hardcore turn on -W -Wall -Werror --enable-debug enable debug information --enable-gpu-debug enable gpu debug information --enable-div-debug enable div debug information --enable-sqrt-debug enable sqrt debug information --enable-dma-debug enable dma debug information --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GTHREAD_CFLAGS C compiler flags for GTHREAD, overriding pkg-config GTHREAD_LIBS linker flags for GTHREAD, overriding pkg-config LIBGLADE_CFLAGS C compiler flags for LIBGLADE, overriding pkg-config LIBGLADE_LIBS linker flags for LIBGLADE, overriding pkg-config GTKGLEXT_CFLAGS C compiler flags for GTKGLEXT, overriding pkg-config GTKGLEXT_LIBS linker flags for GTKGLEXT, overriding pkg-config LUA_CFLAGS C compiler flags for LUA, overriding pkg-config LUA_LIBS linker flags for LUA, overriding pkg-config ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config ALSA_LIBS linker flags for ALSA, overriding pkg-config LIBAGG_CFLAGS C compiler flags for LIBAGG, overriding pkg-config LIBAGG_LIBS linker flags for LIBAGG, overriding pkg-config LIBSOUNDTOUCH_CFLAGS C compiler flags for LIBSOUNDTOUCH, overriding pkg-config LIBSOUNDTOUCH_LIBS linker flags for LIBSOUNDTOUCH, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF desmume configure svn generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by desmume $as_me svn, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac case $host in *linux*) desmume_arch=linux;; *mingw*) desmume_arch=windows;; *darwin*) desmume_arch=linux;; *bsd*) desmume_arch=linux;; esac am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='desmume' VERSION='svn' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 $as_echo_n "checking how to create a pax tar archive... " >&6; } # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' _am_tools=${am_cv_prog_tar_pax-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x pax -w "$$tardir"' am__tar_='pax -L -x pax -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H pax -L' am__tar_='find "$tardir" -print | cpio -o -H pax -L' am__untar='cpio -i -H pax -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_pax}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_pax+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_pax=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 $as_echo "$am_cv_prog_tar_pax" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac REVISION=0 SVN=`which svn 2>/dev/null` if ( test -d .svn || test -d ../.svn ; ) && test "x${SVN}" != "x" -a -x "${SVN}" ; then REVISION=`$SVN info|grep 'Last Changed Rev'|cut -d' ' -f4` echo "$REVISION" fi cat >>confdefs.h <<_ACEOF #define SVN_REV $REVISION _ACEOF cat >>confdefs.h <<_ACEOF #define SVN_REV_STR "$REVISION" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= " >&5 $as_echo_n "checking for intltool >= ... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz" >&5 $as_echo_n "checking for gzopen in -lz... " >&6; } if ${ac_cv_lib_z_gzopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzopen=yes else ac_cv_lib_z_gzopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen" >&5 $as_echo "$ac_cv_lib_z_gzopen" >&6; } if test "x$ac_cv_lib_z_gzopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBZ 1 _ACEOF LIBS="-lz $LIBS" else as_fn_error $? "zlib was not found, we can't go further. Please install it or specify the location where it's installed." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for zzip_open in -lzzip" >&5 $as_echo_n "checking for zzip_open in -lzzip... " >&6; } if ${ac_cv_lib_zzip_zzip_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lzzip $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char zzip_open (); int main () { return zzip_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_zzip_zzip_open=yes else ac_cv_lib_zzip_zzip_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zzip_zzip_open" >&5 $as_echo "$ac_cv_lib_zzip_zzip_open" >&6; } if test "x$ac_cv_lib_zzip_zzip_open" = xyes; then : LIBS="-lzzip $LIBS" $as_echo "#define HAVE_LIBZZIP 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether zzip use void * as second parameter" >&5 $as_echo_n "checking whether zzip use void * as second parameter... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { void * v; zzip_read(NULL, v, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "#define ZZIP_OLD_READ 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi for ac_prog in sdl-config sdl11-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SDLCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $SDLCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDLCONFIG="$SDLCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SDLCONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi SDLCONFIG=$ac_cv_path_SDLCONFIG if test -n "$SDLCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDLCONFIG" >&5 $as_echo "$SDLCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$SDLCONFIG" && break done if test ! "x$SDLCONFIG" = "x" ; then SDL_CFLAGS=`$SDLCONFIG --cflags` SDL_LIBS=`$SDLCONFIG --libs` else as_fn_error $? "sdl is required to build desmume" "$LINENO" 5 fi for ac_header in GL/gl.h do : ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" if test "x$ac_cv_header_GL_gl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GL_H 1 _ACEOF for ac_header in GL/glu.h do : ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" if test "x$ac_cv_header_GL_glu_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GLU_H 1 _ACEOF have_gl_h=yes LIBS="$LIBS -lGL -lGLU" else have_gl_h=no fi done else have_gl_h=no fi done if test "have_gl_h" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building without GL support because of missing headers." >&5 $as_echo "$as_me: WARNING: Building without GL support because of missing headers." >&2;} fi if test "${have_gl_h}" = "yes"; then HAVE_GL_TRUE= HAVE_GL_FALSE='#' else HAVE_GL_TRUE='#' HAVE_GL_FALSE= fi # Check whether --enable-osmesa was given. if test "${enable_osmesa+set}" = set; then : enableval=$enable_osmesa; osmesa=$enableval else osmesa=no fi # Check whether --enable-glx was given. if test "${enable_glx+set}" = set; then : enableval=$enable_glx; glx=$enableval else glx=yes fi if test "x$osmesa" = "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ldl" >&5 $as_echo_n "checking for main in -ldl... " >&6; } if ${ac_cv_lib_dl_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_main=yes else ac_cv_lib_dl_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_main" >&5 $as_echo "$ac_cv_lib_dl_main" >&6; } if test "x$ac_cv_lib_dl_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lGL" >&5 $as_echo_n "checking for main in -lGL... " >&6; } if ${ac_cv_lib_GL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GL_main=yes else ac_cv_lib_GL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_main" >&5 $as_echo "$ac_cv_lib_GL_main" >&6; } if test "x$ac_cv_lib_GL_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGL 1 _ACEOF LIBS="-lGL $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOSMesa" >&5 $as_echo_n "checking for main in -lOSMesa... " >&6; } if ${ac_cv_lib_OSMesa_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOSMesa $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OSMesa_main=yes else ac_cv_lib_OSMesa_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OSMesa_main" >&5 $as_echo "$ac_cv_lib_OSMesa_main" >&6; } if test "x$ac_cv_lib_OSMesa_main" = xyes; then : useosmesa=yes $as_echo "#define HAVE_LIBOSMESA 1" >>confdefs.h OSMESA_LIBS="-lOSMesa" fi else if test "x$glx" = "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ldl" >&5 $as_echo_n "checking for main in -ldl... " >&6; } if ${ac_cv_lib_dl_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_main=yes else ac_cv_lib_dl_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_main" >&5 $as_echo "$ac_cv_lib_dl_main" >&6; } if test "x$ac_cv_lib_dl_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lGL" >&5 $as_echo_n "checking for main in -lGL... " >&6; } if ${ac_cv_lib_GL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GL_main=yes else ac_cv_lib_GL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_main" >&5 $as_echo "$ac_cv_lib_GL_main" >&6; } if test "x$ac_cv_lib_GL_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGL 1 _ACEOF LIBS="-lGL $LIBS" fi for ac_header in GL/glx.h do : ac_fn_c_check_header_mongrel "$LINENO" "GL/glx.h" "ac_cv_header_GL_glx_h" "$ac_includes_default" if test "x$ac_cv_header_GL_glx_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GLX_H 1 _ACEOF useglx=yes $as_echo "#define HAVE_GL_GLX 1" >>confdefs.h GLX_LIBS="-lX11" fi done fi fi if test "${useosmesa}" = "yes"; then HAVE_LIBOSMESA_TRUE= HAVE_LIBOSMESA_FALSE='#' else HAVE_LIBOSMESA_TRUE='#' HAVE_LIBOSMESA_FALSE= fi if test "${useglx}" = "yes"; then HAVE_GL_GLX_TRUE= HAVE_GL_GLX_FALSE='#' else HAVE_GL_GLX_TRUE='#' HAVE_GL_GLX_FALSE= fi # Check whether --enable-hud was given. if test "${enable_hud+set}" = set; then : enableval=$enable_hud; libagg=yes fi HAVE_OPENAL=no # Check whether --enable-openal was given. if test "${enable_openal+set}" = set; then : enableval=$enable_openal; openal=yes fi if test "x$openal" = "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lopenal" >&5 $as_echo_n "checking for main in -lopenal... " >&6; } if ${ac_cv_lib_openal_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lopenal $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_openal_main=yes else ac_cv_lib_openal_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openal_main" >&5 $as_echo "$ac_cv_lib_openal_main" >&6; } if test "x$ac_cv_lib_openal_main" = xyes; then : HAVE_OPENAL=yes LIBS="$LIBS -lopenal" fi fi if test "${HAVE_OPENAL}" = "yes"; then HAVE_OPENAL_TRUE= HAVE_OPENAL_FALSE='#' else HAVE_OPENAL_TRUE='#' HAVE_OPENAL_FALSE= fi FOUND_GLIB=no HAVE_ALSA=no GLIB_VER=2.8 GTK_VER=2.14 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_VER" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_VER" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 FOUND_GLIB=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } FOUND_GLIB=no else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } FOUND_GLIB=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= \$GTK_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= $GTK_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= $GTK_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= \$GTK_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= $GTK_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= $GTK_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= $GTK_VER" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= $GTK_VER" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 HAVE_GTK=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTK=no else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GTK=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTHREAD" >&5 $as_echo_n "checking for GTHREAD... " >&6; } if test -n "$GTHREAD_CFLAGS"; then pkg_cv_GTHREAD_CFLAGS="$GTHREAD_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gthread-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gthread-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_CFLAGS=`$PKG_CONFIG --cflags ""gthread-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTHREAD_LIBS"; then pkg_cv_GTHREAD_LIBS="$GTHREAD_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gthread-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gthread-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_LIBS=`$PKG_CONFIG --libs ""gthread-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTHREAD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs ""gthread-2.0"" 2>&1` else GTHREAD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs ""gthread-2.0"" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTHREAD_PKG_ERRORS" >&5 HAVE_GTHREAD=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTHREAD=no else GTHREAD_CFLAGS=$pkg_cv_GTHREAD_CFLAGS GTHREAD_LIBS=$pkg_cv_GTHREAD_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GTHREAD=yes fi # Check whether --enable-glade was given. if test "${enable_glade+set}" = set; then : enableval=$enable_glade; glade=$enableval else glade=no fi if test "x$glade" = "xyes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGLADE" >&5 $as_echo_n "checking for LIBGLADE... " >&6; } if test -n "$LIBGLADE_CFLAGS"; then pkg_cv_LIBGLADE_CFLAGS="$LIBGLADE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"libglade-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""libglade-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGLADE_CFLAGS=`$PKG_CONFIG --cflags ""libglade-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBGLADE_LIBS"; then pkg_cv_LIBGLADE_LIBS="$LIBGLADE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"libglade-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""libglade-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGLADE_LIBS=`$PKG_CONFIG --libs ""libglade-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs ""libglade-2.0"" 2>&1` else LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs ""libglade-2.0"" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBGLADE_PKG_ERRORS" >&5 HAVE_LIBGLADE=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBGLADE=no else LIBGLADE_CFLAGS=$pkg_cv_LIBGLADE_CFLAGS LIBGLADE_LIBS=$pkg_cv_LIBGLADE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBGLADE=yes fi cat >>confdefs.h <<_ACEOF #define GLADEUI_UNINSTALLED_DIR "`pwd`/src/gtk-glade/glade/" _ACEOF pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKGLEXT" >&5 $as_echo_n "checking for GTKGLEXT... " >&6; } if test -n "$GTKGLEXT_CFLAGS"; then pkg_cv_GTKGLEXT_CFLAGS="$GTKGLEXT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gtkglext-1.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gtkglext-1.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKGLEXT_CFLAGS=`$PKG_CONFIG --cflags ""gtkglext-1.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKGLEXT_LIBS"; then pkg_cv_GTKGLEXT_LIBS="$GTKGLEXT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gtkglext-1.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gtkglext-1.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKGLEXT_LIBS=`$PKG_CONFIG --libs ""gtkglext-1.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKGLEXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs ""gtkglext-1.0"" 2>&1` else GTKGLEXT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs ""gtkglext-1.0"" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKGLEXT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (\"gtkglext-1.0\") were not met: $GTKGLEXT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTKGLEXT_CFLAGS and GTKGLEXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTKGLEXT_CFLAGS and GTKGLEXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTKGLEXT_CFLAGS=$pkg_cv_GTKGLEXT_CFLAGS GTKGLEXT_LIBS=$pkg_cv_GTKGLEXT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GTKGLEXT_AVAILABLE 1" >>confdefs.h fi fi # Extract the first word of "update-desktop-database", so it can be a program name with args. set dummy update-desktop-database; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UPDATEDESKTOP+:} false; then : $as_echo_n "(cached) " >&6 else case $UPDATEDESKTOP in [\\/]* | ?:[\\/]*) ac_cv_path_UPDATEDESKTOP="$UPDATEDESKTOP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_UPDATEDESKTOP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi UPDATEDESKTOP=$ac_cv_path_UPDATEDESKTOP if test -n "$UPDATEDESKTOP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATEDESKTOP" >&5 $as_echo "$UPDATEDESKTOP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Need check for both lua and lua5.1 to run on debian, see mysql bug #29945 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua >= 5.1" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua >= 5.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 HAVE_LUA=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LUA=no else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LUA=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua5.1 >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua5.1 >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua5.1 >= 5.1" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua5.1 >= 5.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 HAVE_LUA=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LUA=no else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LUA=yes fi if test "${HAVE_LUA}x" = "yes"; then HAVE_LUA_TRUE= HAVE_LUA_FALSE='#' else HAVE_LUA_TRUE='#' HAVE_LUA_FALSE= fi if test ! "x$HAVE_OPENAL" = "xyes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA" >&5 $as_echo_n "checking for ALSA... " >&6; } if test -n "$ALSA_CFLAGS"; then pkg_cv_ALSA_CFLAGS="$ALSA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ALSA_CFLAGS=`$PKG_CONFIG --cflags "alsa >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$ALSA_LIBS"; then pkg_cv_ALSA_LIBS="$ALSA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ALSA_LIBS=`$PKG_CONFIG --libs "alsa >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ALSA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "alsa >= 1.0" 2>&1` else ALSA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "alsa >= 1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ALSA_PKG_ERRORS" >&5 HAVE_ALSA=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_ALSA=no else ALSA_CFLAGS=$pkg_cv_ALSA_CFLAGS ALSA_LIBS=$pkg_cv_ALSA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_ALSA=yes fi fi if test "${HAVE_ALSA}" = "yes"; then HAVE_ALSA_TRUE= HAVE_ALSA_FALSE='#' else HAVE_ALSA_TRUE='#' HAVE_ALSA_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBAGG" >&5 $as_echo_n "checking for LIBAGG... " >&6; } if test -n "$LIBAGG_CFLAGS"; then pkg_cv_LIBAGG_CFLAGS="$LIBAGG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libagg >= 2.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libagg >= 2.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBAGG_CFLAGS=`$PKG_CONFIG --cflags "libagg >= 2.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBAGG_LIBS"; then pkg_cv_LIBAGG_LIBS="$LIBAGG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libagg >= 2.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libagg >= 2.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBAGG_LIBS=`$PKG_CONFIG --libs "libagg >= 2.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBAGG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libagg >= 2.5.0" 2>&1` else LIBAGG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libagg >= 2.5.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBAGG_PKG_ERRORS" >&5 FOUND_LIBAGG=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } FOUND_LIBAGG=no else LIBAGG_CFLAGS=$pkg_cv_LIBAGG_CFLAGS LIBAGG_LIBS=$pkg_cv_LIBAGG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } FOUND_LIBAGG=yes fi if test "x$libagg" = "xyes" -a "${FOUND_LIBAGG}" = "yes"; then HAVE_LIBAGG_TRUE= HAVE_LIBAGG_FALSE='#' else HAVE_LIBAGG_TRUE='#' HAVE_LIBAGG_FALSE= fi if test "x$libagg" = "xyes" ; then if test "x$FOUND_LIBAGG" = "xyes" ; then $as_echo "#define HAVE_LIBAGG 1" >>confdefs.h else as_fn_error $? "HUD rendering enabled, but libagg not found" "$LINENO" 5 fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSOUNDTOUCH" >&5 $as_echo_n "checking for LIBSOUNDTOUCH... " >&6; } if test -n "$LIBSOUNDTOUCH_CFLAGS"; then pkg_cv_LIBSOUNDTOUCH_CFLAGS="$LIBSOUNDTOUCH_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch >= 1.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "soundtouch >= 1.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch >= 1.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBSOUNDTOUCH_LIBS"; then pkg_cv_LIBSOUNDTOUCH_LIBS="$LIBSOUNDTOUCH_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch >= 1.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "soundtouch >= 1.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch >= 1.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBSOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "soundtouch >= 1.5.0" 2>&1` else LIBSOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "soundtouch >= 1.5.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBSOUNDTOUCH_PKG_ERRORS" >&5 HAVE_LIBSOUNDTOUCH=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBSOUNDTOUCH=no else LIBSOUNDTOUCH_CFLAGS=$pkg_cv_LIBSOUNDTOUCH_CFLAGS LIBSOUNDTOUCH_LIBS=$pkg_cv_LIBSOUNDTOUCH_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBSOUNDTOUCH=yes fi if test "${HAVE_LIBSOUNDTOUCH}" = "yes"; then HAVE_LIBSOUNDTOUCH_TRUE= HAVE_LIBSOUNDTOUCH_FALSE='#' else HAVE_LIBSOUNDTOUCH_TRUE='#' HAVE_LIBSOUNDTOUCH_FALSE= fi if test "x$HAVE_LIBSOUNDTOUCH" = "xyes"; then $as_echo "#define HAVE_LIBSOUNDTOUCH 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SoundTouch library not found, pcsx2 resampler will be disabled" >&5 $as_echo "$as_me: WARNING: SoundTouch library not found, pcsx2 resampler will be disabled" >&2;} fi if test "x$HAVE_ALSA" = "xno"; then if test "x$HAVE_OPENAL" = "xno"; then $as_echo "#define FAKE_MIC 1" >>confdefs.h fi fi PO_DIR="po" PO_MAKEFILE="po/Makefile.in" UI_DIR="cli $UI_DIR" if test "x$HAVE_GTK" = "xyes"; then UI_DIR="gtk $UI_DIR" fi if test "x$HAVE_LIBGLADE" = "xyes"; then UI_DIR="gtk-glade $UI_DIR" GETTEXT_PACKAGE=desmume cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF ALL_LINGUAS="fr nb pt_BR sv zh_CN zh_TW" for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES fi case $host_cpu in x86|x86_64|i386|i486|i586|i686) HAVE_JIT=yes $as_echo "#define HAVE_JIT 1" >>confdefs.h ;; esac if test "x$HAVE_JIT" = "xyes"; then HAVE_JIT_TRUE= HAVE_JIT_FALSE='#' else HAVE_JIT_TRUE='#' HAVE_JIT_FALSE= fi # Check whether --enable-wifi was given. if test "${enable_wifi+set}" = set; then : enableval=$enable_wifi; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpcap" >&5 $as_echo_n "checking for main in -lpcap... " >&6; } if ${ac_cv_lib_pcap_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pcap_main=yes else ac_cv_lib_pcap_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_main" >&5 $as_echo "$ac_cv_lib_pcap_main" >&6; } if test "x$ac_cv_lib_pcap_main" = xyes; then : $as_echo "#define EXPERIMENTAL_WIFI_COMM 1" >>confdefs.h LIBS="$LIBS -lpcap" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pcap library not found, wifi will not work" >&5 $as_echo "$as_me: WARNING: pcap library not found, wifi will not work" >&2;} fi fi case $host in *mingw*) LIBS="$LIBS -ldxguid -ldxerr8 -ldsound -lopengl32 -lws2_32 -mwindows" UI_DIR="windows" ;; *darwin*) $as_echo "#define HAVE_OPENAL 1" >>confdefs.h LIBS="$LIBS -framework OpenGL -framework OpenAL" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi ;; esac # Detect the host platform and architecture and feed them to the compiler as # defines case $host in #( *linux*) : $as_echo "#define HOST_LINUX 1" >>confdefs.h ;; #( *bsd* ) : $as_echo "#define HOST_BSD 1" >>confdefs.h ;; #( *mingw*) : $as_echo "#define HOST_WINDOWS 1" >>confdefs.h ;; #( *darwin*) : $as_echo "#define HOST_DARWIN 1" >>confdefs.h ;; #( *) : $as_echo "#define HOST_UNK 1" >>confdefs.h ;; esac case $host_cpu in #( x86_64) : $as_echo "#define HOST_64 1" >>confdefs.h ;; #( amd64) : $as_echo "#define HOST_64 1" >>confdefs.h ;; #( *) : $as_echo "#define HOST_32 1" >>confdefs.h ;; esac # Check whether --enable-gdb-stub was given. if test "${enable_gdb_stub+set}" = set; then : enableval=$enable_gdb_stub; $as_echo "#define GDB_STUB 1" >>confdefs.h wantgdbstub=yes fi if test "${wantgdbstub}" = "yes"; then HAVE_GDB_STUB_TRUE= HAVE_GDB_STUB_FALSE='#' else HAVE_GDB_STUB_TRUE='#' HAVE_GDB_STUB_FALSE= fi # for developer use, enable lots of compile warnings, # but don't require this generally, because some system's # header files (BSD) can't handle it # # NB: must add -Werror after AC_PROG_CC, etc., so do this last # Check whether --enable-hardcore was given. if test "${enable_hardcore+set}" = set; then : enableval=$enable_hardcore; case "${enableval}" in yes) ENABLE_HARDCORE=1 ;; no) ENABLE_HARDCORE=0 ;; *) as_fn_error $? "bad value ${enableval} for --enable-hardcore" "$LINENO" 5 ;; esac else ENABLE_HARDCORE=0 fi if test "x$ENABLE_HARDCORE" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: enable hardcore compile warnings" >&5 $as_echo "$as_me: WARNING: enable hardcore compile warnings" >&2;} if test "x$CXX" = "x"; then CPPFLAGS="$CPPFLAGS -Wmissing-prototypes" fi CPPFLAGS="$CPPFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -Wno-missing-field-initializers -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-unused-parameter -Wmissing-declarations -Wundef -Wmissing-noreturn -Wredundant-decls -Wformat-nonliteral -Wformat-security -Winit-self -Wno-reorder" fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; $as_echo "#define DEBUG 1" >>confdefs.h fi # Check whether --enable-gpu-debug was given. if test "${enable_gpu_debug+set}" = set; then : enableval=$enable_gpu_debug; $as_echo "#define GPUDEBUG 1" >>confdefs.h fi # Check whether --enable-div-debug was given. if test "${enable_div_debug+set}" = set; then : enableval=$enable_div_debug; $as_echo "#define DIVDEBUG 1" >>confdefs.h fi # Check whether --enable-sqrt-debug was given. if test "${enable_sqrt_debug+set}" = set; then : enableval=$enable_sqrt_debug; $as_echo "#define SQRTDEBUG 1" >>confdefs.h fi # Check whether --enable-dma-debug was given. if test "${enable_dma_debug+set}" = set; then : enableval=$enable_dma_debug; $as_echo "#define DMADEBUG 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_files="$ac_config_files Makefile ${PO_MAKEFILE} src/Makefile src/cli/Makefile src/cli/doc/Makefile src/gtk/Makefile src/gtk/doc/Makefile src/gtk-glade/Makefile src/gtk-glade/doc/Makefile src/gdbstub/Makefile autopackage/default.apspec" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${HAVE_GL_TRUE}" && test -z "${HAVE_GL_FALSE}"; then as_fn_error $? "conditional \"HAVE_GL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBOSMESA_TRUE}" && test -z "${HAVE_LIBOSMESA_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBOSMESA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GL_GLX_TRUE}" && test -z "${HAVE_GL_GLX_FALSE}"; then as_fn_error $? "conditional \"HAVE_GL_GLX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_OPENAL_TRUE}" && test -z "${HAVE_OPENAL_FALSE}"; then as_fn_error $? "conditional \"HAVE_OPENAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LUA_TRUE}" && test -z "${HAVE_LUA_FALSE}"; then as_fn_error $? "conditional \"HAVE_LUA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ALSA_TRUE}" && test -z "${HAVE_ALSA_FALSE}"; then as_fn_error $? "conditional \"HAVE_ALSA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBAGG_TRUE}" && test -z "${HAVE_LIBAGG_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBAGG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBSOUNDTOUCH_TRUE}" && test -z "${HAVE_LIBSOUNDTOUCH_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBSOUNDTOUCH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_JIT_TRUE}" && test -z "${HAVE_JIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_JIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GDB_STUB_TRUE}" && test -z "${HAVE_GDB_STUB_FALSE}"; then as_fn_error $? "conditional \"HAVE_GDB_STUB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by desmume $as_me svn, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ desmume config.status svn configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "${PO_MAKEFILE}") CONFIG_FILES="$CONFIG_FILES ${PO_MAKEFILE}" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/cli/Makefile") CONFIG_FILES="$CONFIG_FILES src/cli/Makefile" ;; "src/cli/doc/Makefile") CONFIG_FILES="$CONFIG_FILES src/cli/doc/Makefile" ;; "src/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk/Makefile" ;; "src/gtk/doc/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk/doc/Makefile" ;; "src/gtk-glade/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk-glade/Makefile" ;; "src/gtk-glade/doc/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk-glade/doc/Makefile" ;; "src/gdbstub/Makefile") CONFIG_FILES="$CONFIG_FILES src/gdbstub/Makefile" ;; "autopackage/default.apspec") CONFIG_FILES="$CONFIG_FILES autopackage/default.apspec" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi desmume-0.9.11/dsv.txt0000755000000000000000000000340012467662066013313 0ustar rootrootThe desmume save file format is merely a raw save file with a FOOTER. This was chosen in order to maximize compatibility with other emulators, which tend load the savefile as-is and let the game read out of whatever range it is expecting. To assist with this, before writing the save file, desmume will pad the raw save file out to the next highest known length. Note that this may sometimes be incorrect if the savefile hasnt been written through to the end during initialization. This could cause other emulators to fail to recognize the save file. Additionally, the footer makes it easier to analyze save files, because the game's data will be at the correct addresses starting at offset 0x0000. The footer format can be identified by locating the 16Byte ascii string "|-DESMUME SAVE-|" at the end of the file. This corresponds with the following save structure: struct Footer { u32 actually_written_size; u32 padded_size; u32 save_type; //(not currently used) u32 address_size; //address bus size u32 save_size; //size parameter of the save type (not currently used) u32 version_number; //should be 0 char cookie[16]; }; note that padded_size should be where you see the end of the raw save data and the beginning of desmume-specific information, including some junk before the actual footer. actually_written_size is the highest address (plus one) written to by the game. The new desmume savefile system tries to make as few decisions as possible, which is the reason for the behavior of actually_written_size and the disuse of save_type and save_size. If few decisions are made, then few mistakes can be made. That is the idea, anyway. We'll make decisions later if we need to. save_type and save_size are reserved in case we do. desmume-0.9.11/TODO0000755000000000000000000000000012467662066012437 0ustar rootroot